summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/pull_request_template.md13
-rw-r--r--.gitignore3
-rw-r--r--.gitlab-ci.yml34
-rw-r--r--CMakeLists.txt5
-rw-r--r--VERSION4
-rw-r--r--client/client_priv.h1
-rw-r--r--client/mysql.cc189
-rw-r--r--client/mysql_upgrade.c2
-rw-r--r--client/mysqladmin.cc1
-rw-r--r--client/mysqlbinlog.cc388
-rw-r--r--client/mysqlcheck.c1
-rw-r--r--client/mysqldump.c71
-rw-r--r--client/mysqlimport.c1
-rw-r--r--client/mysqlshow.c1
-rw-r--r--client/mysqltest.cc62
-rw-r--r--cmake/FindLIBAIO.cmake4
-rw-r--r--cmake/FindLZ4.cmake16
-rw-r--r--cmake/FindLZO.cmake9
-rw-r--r--cmake/FindPMEM.cmake6
-rw-r--r--cmake/FindSnappy.cmake9
-rw-r--r--cmake/FindURING.cmake6
-rw-r--r--cmake/FindZSTD.cmake8
-rw-r--r--cmake/build_configurations/mysql_release.cmake11
-rw-r--r--cmake/libfmt.cmake53
-rw-r--r--cmake/maintainer.cmake1
-rw-r--r--cmake/os/Windows.cmake4
-rw-r--r--cmake/win_compatibility.manifest5
-rw-r--r--config.h.cmake1
-rw-r--r--configure.cmake1
-rwxr-xr-xdbug/tests-t.pl41
-rw-r--r--dbug/tests.c7
-rw-r--r--dbug/user.r28
-rw-r--r--debian/additions/mariadb.conf.d/50-server.cnf4
-rw-r--r--debian/additions/source_mariadb-10.8.py (renamed from debian/additions/source_mariadb-10.6.py)4
-rwxr-xr-xdebian/autobake-deb.sh11
-rw-r--r--debian/changelog4
-rw-r--r--debian/control201
-rw-r--r--debian/libmariadb3.symbols336
-rw-r--r--debian/libmariadb3.symbols.README42
-rw-r--r--debian/mariadb-client-10.8.README.Debian (renamed from debian/mariadb-client-10.6.README.Debian)0
-rw-r--r--debian/mariadb-client-10.8.docs (renamed from debian/mariadb-client-10.6.docs)0
-rw-r--r--debian/mariadb-client-10.8.install (renamed from debian/mariadb-client-10.6.install)0
-rw-r--r--debian/mariadb-client-10.8.links (renamed from debian/mariadb-client-10.6.links)0
-rw-r--r--debian/mariadb-client-10.8.manpages (renamed from debian/mariadb-client-10.6.manpages)0
-rw-r--r--debian/mariadb-client-10.8.menu (renamed from debian/mariadb-client-10.6.menu)2
-rw-r--r--debian/mariadb-client-core-10.8.install (renamed from debian/mariadb-client-core-10.6.install)0
-rw-r--r--debian/mariadb-client-core-10.8.links (renamed from debian/mariadb-client-core-10.6.links)0
-rw-r--r--debian/mariadb-plugin-provider-bzip2.install2
-rw-r--r--debian/mariadb-plugin-provider-bzip2.lintian-overrides3
-rw-r--r--debian/mariadb-plugin-provider-lz4.install2
-rw-r--r--debian/mariadb-plugin-provider-lz4.lintian-overrides3
-rw-r--r--debian/mariadb-plugin-provider-lzma.install2
-rw-r--r--debian/mariadb-plugin-provider-lzma.lintian-overrides3
-rw-r--r--debian/mariadb-plugin-provider-lzo.install2
-rw-r--r--debian/mariadb-plugin-provider-lzo.lintian-overrides3
-rw-r--r--debian/mariadb-plugin-provider-snappy.install2
-rw-r--r--debian/mariadb-plugin-provider-snappy.lintian-overrides3
-rw-r--r--debian/mariadb-server-10.8.README.Debian (renamed from debian/mariadb-server-10.6.README.Debian)0
-rw-r--r--debian/mariadb-server-10.8.config (renamed from debian/mariadb-server-10.6.config)2
-rw-r--r--debian/mariadb-server-10.8.dirs (renamed from debian/mariadb-server-10.6.dirs)0
-rw-r--r--debian/mariadb-server-10.8.install (renamed from debian/mariadb-server-10.6.install)6
-rw-r--r--debian/mariadb-server-10.8.links (renamed from debian/mariadb-server-10.6.links)0
-rw-r--r--debian/mariadb-server-10.8.logcheck.ignore.paranoid (renamed from debian/mariadb-server-10.6.logcheck.ignore.paranoid)0
-rw-r--r--debian/mariadb-server-10.8.logcheck.ignore.server (renamed from debian/mariadb-server-10.6.logcheck.ignore.server)0
-rw-r--r--debian/mariadb-server-10.8.logcheck.ignore.workstation (renamed from debian/mariadb-server-10.6.logcheck.ignore.workstation)0
-rw-r--r--debian/mariadb-server-10.8.mariadb.init (renamed from debian/mariadb-server-10.6.mariadb.init)2
-rw-r--r--debian/mariadb-server-10.8.mysql-server.logrotate (renamed from debian/mariadb-server-10.6.mysql-server.logrotate)0
-rw-r--r--debian/mariadb-server-10.8.mysql.default (renamed from debian/mariadb-server-10.6.mysql.default)0
-rw-r--r--debian/mariadb-server-10.8.postinst (renamed from debian/mariadb-server-10.6.postinst)0
-rw-r--r--debian/mariadb-server-10.8.postrm (renamed from debian/mariadb-server-10.6.postrm)0
-rw-r--r--debian/mariadb-server-10.8.preinst (renamed from debian/mariadb-server-10.6.preinst)0
-rw-r--r--debian/mariadb-server-10.8.prerm (renamed from debian/mariadb-server-10.6.prerm)0
-rw-r--r--debian/mariadb-server-10.8.templates (renamed from debian/mariadb-server-10.6.templates)6
-rw-r--r--debian/mariadb-server-10.8.triggers (renamed from debian/mariadb-server-10.6.triggers)0
-rw-r--r--debian/mariadb-server-core-10.8.install (renamed from debian/mariadb-server-core-10.6.install)0
-rw-r--r--debian/mariadb-server-core-10.8.links (renamed from debian/mariadb-server-core-10.6.links)0
-rw-r--r--debian/not-installed18
-rw-r--r--debian/po/POTFILES.in2
-rw-r--r--debian/po/ar.po22
-rw-r--r--debian/po/ca.po26
-rw-r--r--debian/po/cs.po24
-rw-r--r--debian/po/da.po30
-rw-r--r--debian/po/de.po24
-rw-r--r--debian/po/es.po22
-rw-r--r--debian/po/eu.po22
-rw-r--r--debian/po/fi.po28
-rw-r--r--debian/po/fr.po26
-rw-r--r--debian/po/gl.po22
-rw-r--r--debian/po/it.po28
-rw-r--r--debian/po/ja.po24
-rw-r--r--debian/po/nb.po22
-rw-r--r--debian/po/nl.po24
-rw-r--r--debian/po/pt.po24
-rw-r--r--debian/po/pt_BR.po28
-rw-r--r--debian/po/ro.po22
-rw-r--r--debian/po/ru.po24
-rw-r--r--debian/po/sv.po26
-rw-r--r--debian/po/templates.pot26
-rw-r--r--debian/po/tr.po24
-rw-r--r--debian/po/vi.po30
-rwxr-xr-xdebian/rules14
-rw-r--r--debian/salsa-ci.yml64
-rw-r--r--debian/source/lintian-overrides12
-rw-r--r--debian/tests/control7
-rw-r--r--debian/tests/smoke17
-rw-r--r--extra/comp_err.c4
-rw-r--r--extra/innochecksum.cc26
-rw-r--r--extra/mariabackup/CMakeLists.txt7
-rw-r--r--extra/mariabackup/backup_copy.cc21
-rw-r--r--extra/mariabackup/backup_mysql.cc9
-rw-r--r--extra/mariabackup/changed_page_bitmap.cc4
-rw-r--r--extra/mariabackup/changed_page_bitmap.h2
-rw-r--r--extra/mariabackup/common.h5
-rw-r--r--extra/mariabackup/ds_local.cc4
-rw-r--r--extra/mariabackup/encryption_plugin.h7
-rw-r--r--extra/mariabackup/fil_cur.cc13
-rw-r--r--extra/mariabackup/fil_cur.h4
-rw-r--r--extra/mariabackup/read_filt.h2
-rw-r--r--extra/mariabackup/write_filt.cc4
-rw-r--r--extra/mariabackup/xb_plugin.cc (renamed from extra/mariabackup/encryption_plugin.cc)151
-rw-r--r--extra/mariabackup/xb_plugin.h5
-rw-r--r--extra/mariabackup/xtrabackup.cc768
-rw-r--r--extra/mariabackup/xtrabackup.h23
-rw-r--r--extra/my_print_defaults.c64
-rw-r--r--include/hash.h4
-rw-r--r--include/ilist.h4
-rw-r--r--include/json_lib.h21
-rw-r--r--include/m_ctype.h4
-rw-r--r--include/mariadb_capi_rename.h2
-rw-r--r--include/my_alloc.h7
-rw-r--r--include/my_bitmap.h14
-rw-r--r--include/my_dbug.h12
-rw-r--r--include/my_dir.h4
-rw-r--r--include/my_global.h8
-rw-r--r--include/my_rdtsc.h27
-rw-r--r--include/my_sys.h57
-rw-r--r--include/mysql.h14
-rw-r--r--include/mysql/plugin.h2
-rw-r--r--include/mysql/plugin_audit.h.pp26
-rw-r--r--include/mysql/plugin_auth.h.pp26
-rw-r--r--include/mysql/plugin_data_type.h.pp26
-rw-r--r--include/mysql/plugin_encryption.h.pp26
-rw-r--r--include/mysql/plugin_ftparser.h.pp26
-rw-r--r--include/mysql/plugin_function.h.pp26
-rw-r--r--include/mysql/plugin_password_validation.h5
-rw-r--r--include/mysql/plugin_password_validation.h.pp29
-rw-r--r--include/mysql/psi/psi_abi_v1.h.pp2
-rw-r--r--include/mysql/psi/psi_abi_v2.h.pp2
-rw-r--r--include/mysql/psi/psi_base.h7
-rw-r--r--include/mysql/psi/psi_memory.h7
-rw-r--r--include/mysql/service_sql.h115
-rw-r--r--include/mysql/services.h1
-rw-r--r--include/providers/bzlib.h126
-rw-r--r--include/providers/lz4.h63
-rw-r--r--include/providers/lzma.h102
-rw-r--r--include/providers/lzo/lzo1x.h62
-rw-r--r--include/providers/snappy-c.h75
-rw-r--r--include/service_versions.h7
-rw-r--r--include/sql_common.h2
-rw-r--r--include/ssl_compat.h2
-rw-r--r--libmysqld/CMakeLists.txt9
-rw-r--r--libmysqld/lib_sql.cc21
-rw-r--r--libservices/CMakeLists.txt8
-rw-r--r--libservices/provider_service_bzip2.c (renamed from sql/sql_tablespace.h)15
-rw-r--r--libservices/provider_service_lz4.c14
-rw-r--r--libservices/provider_service_lzma.c17
-rw-r--r--libservices/provider_service_lzo.c14
-rw-r--r--libservices/provider_service_snappy.c17
-rw-r--r--libservices/sql_service.c19
-rw-r--r--man/comp_err.12
-rw-r--r--man/galera_new_cluster.12
-rw-r--r--man/galera_recovery.12
-rw-r--r--man/innochecksum.12
-rw-r--r--man/mariabackup.12
-rw-r--r--man/mariadb-conv.12
-rw-r--r--man/mariadb-service-convert.12
-rw-r--r--man/mbstream.12
-rw-r--r--man/msql2mysql.12
-rw-r--r--man/my_print_defaults.12
-rw-r--r--man/my_safe_process.12
-rw-r--r--man/myisam_ftdump.12
-rw-r--r--man/myisamchk.12
-rw-r--r--man/myisamlog.12
-rw-r--r--man/myisampack.12
-rw-r--r--man/myrocks_hotbackup.12
-rw-r--r--man/mysql-stress-test.pl.12
-rw-r--r--man/mysql-test-run.pl.12
-rw-r--r--man/mysql.12
-rw-r--r--man/mysql.server.12
-rw-r--r--man/mysql_client_test.12
-rw-r--r--man/mysql_config.12
-rw-r--r--man/mysql_convert_table_format.12
-rw-r--r--man/mysql_find_rows.12
-rw-r--r--man/mysql_fix_extensions.12
-rw-r--r--man/mysql_install_db.117
-rw-r--r--man/mysql_ldb.12
-rw-r--r--man/mysql_plugin.12
-rw-r--r--man/mysql_secure_installation.12
-rw-r--r--man/mysql_setpermission.12
-rw-r--r--man/mysql_tzinfo_to_sql.12
-rw-r--r--man/mysql_upgrade.12
-rw-r--r--man/mysql_waitpid.12
-rw-r--r--man/mysqlaccess.12
-rw-r--r--man/mysqladmin.12
-rw-r--r--man/mysqlbinlog.140
-rw-r--r--man/mysqlcheck.12
-rw-r--r--man/mysqld.82
-rw-r--r--man/mysqld_multi.12
-rw-r--r--man/mysqld_safe.12
-rw-r--r--man/mysqld_safe_helper.12
-rw-r--r--man/mysqldump.12
-rw-r--r--man/mysqldumpslow.12
-rw-r--r--man/mysqlhotcopy.12
-rw-r--r--man/mysqlimport.12
-rw-r--r--man/mysqlshow.12
-rw-r--r--man/mysqlslap.12
-rw-r--r--man/mysqltest.12
-rw-r--r--man/mytop.12
-rw-r--r--man/perror.12
-rw-r--r--man/replace.12
-rw-r--r--man/resolve_stack_dump.12
-rw-r--r--man/resolveip.12
-rw-r--r--man/wsrep_sst_common.12
-rw-r--r--man/wsrep_sst_mariabackup.12
-rw-r--r--man/wsrep_sst_mysqldump.12
-rw-r--r--man/wsrep_sst_rsync.12
-rw-r--r--man/wsrep_sst_rsync_wan.12
-rw-r--r--mysql-test/collections/skip_list_ubsan.txt3
-rw-r--r--mysql-test/include/binlog_combinations.combinations8
-rw-r--r--mysql-test/include/binlog_combinations.inc5
-rw-r--r--mysql-test/include/check_utf8_cli.inc3
-rw-r--r--mysql-test/include/check_windows_admin.inc3
-rw-r--r--mysql-test/include/ctype_ascii_order.inc7
-rw-r--r--mysql-test/include/ctype_unicode_allchars.inc23
-rw-r--r--mysql-test/include/ctype_unicode_casefold_bmp.inc23
-rw-r--r--mysql-test/include/ctype_unicode_casefold_supplementary.inc22
-rw-r--r--mysql-test/include/ctype_unicode_ws_bmp.inc26
-rw-r--r--mysql-test/include/ctype_unicode_ws_supplementary.inc19
-rw-r--r--mysql-test/include/default_mysqld.cnf3
-rw-r--r--mysql-test/include/gis_generic.inc4
-rw-r--r--mysql-test/include/histogram_replaces.inc1
-rw-r--r--mysql-test/include/json_hb_histogram.inc3
-rw-r--r--mysql-test/include/lcase_names.combinations5
-rw-r--r--mysql-test/include/lcase_names.inc2
-rw-r--r--mysql-test/include/mtr_check.sql3
-rw-r--r--mysql-test/include/mtr_warnings.sql1
-rw-r--r--mysql-test/include/no_utf8_cli.inc3
-rw-r--r--mysql-test/include/show_binlog_events2.inc24
-rw-r--r--mysql-test/include/show_events.inc2
-rw-r--r--mysql-test/include/show_slave_status.inc4
-rw-r--r--mysql-test/include/type_mix_incompatible.inc252
-rw-r--r--mysql-test/include/wait_for_sql_thread_read_all.inc8
-rw-r--r--mysql-test/main/alter_table.result15
-rw-r--r--mysql-test/main/alter_table.test20
-rw-r--r--mysql-test/main/alter_table_combinations.result2
-rw-r--r--mysql-test/main/analyze_format_json.result884
-rw-r--r--mysql-test/main/analyze_stmt_orderby.result454
-rw-r--r--mysql-test/main/assign_key_cache.result2
-rw-r--r--mysql-test/main/brackets.result152
-rw-r--r--mysql-test/main/charset_client_win.test5
-rw-r--r--mysql-test/main/charset_client_win_utf8mb4.result6
-rw-r--r--mysql-test/main/charset_client_win_utf8mb4.test22
-rw-r--r--mysql-test/main/count_distinct.result14
-rw-r--r--mysql-test/main/count_distinct.test21
-rw-r--r--mysql-test/main/create.test2
-rw-r--r--mysql-test/main/cte_recursive.result948
-rw-r--r--mysql-test/main/ctype_big5.result194
-rw-r--r--mysql-test/main/ctype_big5.test1
-rw-r--r--mysql-test/main/ctype_cp932.result275
-rw-r--r--mysql-test/main/ctype_cp932.test9
-rw-r--r--mysql-test/main/ctype_eucjpms.result275
-rw-r--r--mysql-test/main/ctype_eucjpms.test8
-rw-r--r--mysql-test/main/ctype_euckr.result270
-rw-r--r--mysql-test/main/ctype_euckr.test2
-rw-r--r--mysql-test/main/ctype_gb2312.result194
-rw-r--r--mysql-test/main/ctype_gb2312.test1
-rw-r--r--mysql-test/main/ctype_gbk.result194
-rw-r--r--mysql-test/main/ctype_gbk.test1
-rw-r--r--mysql-test/main/ctype_ldml.result40
-rw-r--r--mysql-test/main/ctype_ldml.test24
-rw-r--r--mysql-test/main/ctype_sjis.result270
-rw-r--r--mysql-test/main/ctype_sjis.test4
-rw-r--r--mysql-test/main/ctype_tis620.result46
-rw-r--r--mysql-test/main/ctype_ucs2_general_ci_casefold.result1427
-rw-r--r--mysql-test/main/ctype_ucs2_general_ci_casefold.test14
-rw-r--r--mysql-test/main/ctype_ucs2_general_ci_ws.result1143
-rw-r--r--mysql-test/main/ctype_ucs2_general_ci_ws.test14
-rw-r--r--mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.result1427
-rw-r--r--mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.test15
-rw-r--r--mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.result1143
-rw-r--r--mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.test15
-rw-r--r--mysql-test/main/ctype_ucs2_turkish_ci_casefold.result1427
-rw-r--r--mysql-test/main/ctype_ucs2_turkish_ci_casefold.test14
-rw-r--r--mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.result2011
-rw-r--r--mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.test14
-rw-r--r--mysql-test/main/ctype_ujis.result276
-rw-r--r--mysql-test/main/ctype_ujis.test10
-rw-r--r--mysql-test/main/ctype_utf8.result4
-rw-r--r--mysql-test/main/ctype_utf8.test2
-rw-r--r--mysql-test/main/ctype_utf8mb3_general_ci_casefold.result1427
-rw-r--r--mysql-test/main/ctype_utf8mb3_general_ci_casefold.test14
-rw-r--r--mysql-test/main/ctype_utf8mb3_general_ci_ws.result1143
-rw-r--r--mysql-test/main/ctype_utf8mb3_general_ci_ws.test14
-rw-r--r--mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.result1427
-rw-r--r--mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.test15
-rw-r--r--mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.result1142
-rw-r--r--mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.test15
-rw-r--r--mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.result1427
-rw-r--r--mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.test14
-rw-r--r--mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.result2011
-rw-r--r--mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.test14
-rw-r--r--mysql-test/main/ctype_utf8mb4_general_ci_casefold.result1446
-rw-r--r--mysql-test/main/ctype_utf8mb4_general_ci_casefold.test15
-rw-r--r--mysql-test/main/ctype_utf8mb4_general_ci_ws.result1160
-rw-r--r--mysql-test/main/ctype_utf8mb4_general_ci_ws.test16
-rw-r--r--mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.result1446
-rw-r--r--mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.test15
-rw-r--r--mysql-test/main/ctype_utf8mb4_uca_allkeys400.result73
-rw-r--r--mysql-test/main/ctype_utf8mb4_uca_allkeys400.test77
-rw-r--r--mysql-test/main/ctype_utf8mb4_uca_allkeys520.result72
-rw-r--r--mysql-test/main/ctype_utf8mb4_uca_allkeys520.test75
-rw-r--r--mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.result2110
-rw-r--r--mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.test15
-rw-r--r--mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.result1446
-rw-r--r--mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.test15
-rw-r--r--mysql-test/main/ddl_i18n_koi8r.result10
-rw-r--r--mysql-test/main/ddl_i18n_utf8.result10
-rw-r--r--mysql-test/main/default.result6
-rw-r--r--mysql-test/main/derived_cond_pushdown.result18763
-rw-r--r--mysql-test/main/derived_cond_pushdown.test21
-rw-r--r--mysql-test/main/derived_view.result520
-rw-r--r--mysql-test/main/desc_index_range.result201
-rw-r--r--mysql-test/main/desc_index_range.test143
-rw-r--r--mysql-test/main/drop_table_force.result4
-rw-r--r--mysql-test/main/drop_table_force.test4
-rw-r--r--mysql-test/main/events_1.result1
-rw-r--r--mysql-test/main/events_1.test1
-rw-r--r--mysql-test/main/events_restart.result1
-rw-r--r--mysql-test/main/events_restart.test1
-rw-r--r--mysql-test/main/except.result590
-rw-r--r--mysql-test/main/except_all.result710
-rw-r--r--mysql-test/main/explain_json.result1872
-rw-r--r--mysql-test/main/explain_json.test24
-rw-r--r--mysql-test/main/explain_json_format_partitions.result50
-rw-r--r--mysql-test/main/explain_json_innodb.result68
-rw-r--r--mysql-test/main/func_group.result2
-rw-r--r--mysql-test/main/func_group.test2
-rw-r--r--mysql-test/main/func_hybrid_type.result16
-rw-r--r--mysql-test/main/func_in.result11
-rw-r--r--mysql-test/main/func_in.test11
-rw-r--r--mysql-test/main/func_math.result120
-rw-r--r--mysql-test/main/func_math.test57
-rw-r--r--mysql-test/main/func_misc.result5
-rw-r--r--mysql-test/main/func_misc.test1
-rw-r--r--mysql-test/main/func_sformat.result470
-rw-r--r--mysql-test/main/func_sformat.test255
-rw-r--r--mysql-test/main/func_time.result2
-rw-r--r--mysql-test/main/func_time.test2
-rw-r--r--mysql-test/main/get_diagnostics.result1065
-rw-r--r--mysql-test/main/get_diagnostics.test869
-rw-r--r--mysql-test/main/gis.result4
-rw-r--r--mysql-test/main/gis.test4
-rw-r--r--mysql-test/main/grant_utf8_cli.result (renamed from mysql-test/main/grant_not_windows.result)0
-rw-r--r--mysql-test/main/grant_utf8_cli.test (renamed from mysql-test/main/grant_not_windows.test)3
-rw-r--r--mysql-test/main/group_min_max.result8
-rw-r--r--mysql-test/main/handlersocket.result2
-rw-r--r--mysql-test/main/having_cond_pushdown.result2888
-rw-r--r--mysql-test/main/in_subq_cond_pushdown.result2987
-rw-r--r--mysql-test/main/information_schema_part.result36
-rw-r--r--mysql-test/main/innodb_ext_key,off.rdiff54
-rw-r--r--mysql-test/main/innodb_ext_key.result56
-rw-r--r--mysql-test/main/intersect.result584
-rw-r--r--mysql-test/main/intersect_all.result584
-rw-r--r--mysql-test/main/invisible_field_debug.test14
-rw-r--r--mysql-test/main/join_cache.result64
-rw-r--r--mysql-test/main/join_outer.result4
-rw-r--r--mysql-test/main/join_outer_jcl6.result4
-rw-r--r--mysql-test/main/json_equals.result98
-rw-r--r--mysql-test/main/json_equals.test72
-rw-r--r--mysql-test/main/json_normalize.result77
-rw-r--r--mysql-test/main/json_normalize.test58
-rw-r--r--mysql-test/main/key.result6
-rw-r--r--mysql-test/main/key.test9
-rw-r--r--mysql-test/main/long_unique_bugs.test2
-rw-r--r--mysql-test/main/mdl_sync.test8
-rw-r--r--mysql-test/main/merge.result58
-rw-r--r--mysql-test/main/merge.test103
-rw-r--r--mysql-test/main/metadata.result12
-rw-r--r--mysql-test/main/metadata.test4
-rw-r--r--mysql-test/main/multi_update.result114
-rw-r--r--mysql-test/main/my_print_defaults.result31
-rw-r--r--mysql-test/main/my_print_defaults.test78
-rw-r--r--mysql-test/main/myisam-optimize.result83
-rw-r--r--mysql-test/main/myisam-optimize.test60
-rw-r--r--mysql-test/main/myisam.result106
-rw-r--r--mysql-test/main/myisam.test85
-rw-r--r--mysql-test/main/myisam_optimize.result83
-rw-r--r--mysql-test/main/myisam_optimize.test60
-rw-r--r--mysql-test/main/mysql.result14
-rw-r--r--mysql-test/main/mysql_install_db_win_utf8.result14
-rw-r--r--mysql-test/main/mysql_install_db_win_utf8.test35
-rw-r--r--mysql-test/main/mysql_upgrade.result1
-rw-r--r--mysql-test/main/mysql_upgrade.test1
-rw-r--r--mysql-test/main/mysqld--help.result9
-rw-r--r--mysql-test/main/mysqld--help.test6
-rw-r--r--mysql-test/main/mysqldump-max.result84
-rw-r--r--mysql-test/main/mysqldump-system.result1459
-rw-r--r--mysql-test/main/mysqldump-system.test4
-rw-r--r--mysql-test/main/mysqldump-timing.result3
-rw-r--r--mysql-test/main/mysqldump-utf8mb4.result3
-rw-r--r--mysql-test/main/mysqldump.result259
-rw-r--r--mysql-test/main/mysqldump.test4
-rw-r--r--mysql-test/main/natural_sort_key.result214
-rw-r--r--mysql-test/main/natural_sort_key.test102
-rw-r--r--mysql-test/main/openssl_1.result12
-rw-r--r--mysql-test/main/opt_trace.result230
-rw-r--r--mysql-test/main/opt_trace_ucs2.result26
-rw-r--r--mysql-test/main/order_by.result504
-rw-r--r--mysql-test/main/order_by.test18
-rw-r--r--mysql-test/main/order_by_innodb.result69
-rw-r--r--mysql-test/main/order_by_innodb.test48
-rw-r--r--mysql-test/main/order_by_pack_big.result178
-rw-r--r--mysql-test/main/partition.result6
-rw-r--r--mysql-test/main/partition_alter.result65
-rw-r--r--mysql-test/main/partition_alter.test49
-rw-r--r--mysql-test/main/partition_binlog.result10
-rw-r--r--mysql-test/main/partition_binlog.test2
-rw-r--r--mysql-test/main/partition_error.result8
-rw-r--r--mysql-test/main/partition_error.test2
-rw-r--r--mysql-test/main/partition_exchange.result139
-rw-r--r--mysql-test/main/partition_exchange.test44
-rw-r--r--mysql-test/main/partition_mgm_err.result12
-rw-r--r--mysql-test/main/partition_mgm_err.test12
-rw-r--r--mysql-test/main/partition_order.result15
-rw-r--r--mysql-test/main/partition_order.test14
-rw-r--r--mysql-test/main/partition_range.result12
-rw-r--r--mysql-test/main/partition_sync.result2
-rw-r--r--mysql-test/main/partition_sync.test2
-rw-r--r--mysql-test/main/plugin.result6
-rw-r--r--mysql-test/main/ps.result6
-rw-r--r--mysql-test/main/ps_missed_cmds.result23
-rw-r--r--mysql-test/main/ps_missed_cmds.test45
-rw-r--r--mysql-test/main/ps_missed_cmds_bin_prot.result5
-rw-r--r--mysql-test/main/ps_missed_cmds_bin_prot.test13
-rw-r--r--mysql-test/main/range.result558
-rw-r--r--mysql-test/main/range_mrr_icp.result536
-rw-r--r--mysql-test/main/rowid_filter.result2480
-rw-r--r--mysql-test/main/rowid_filter_innodb.result2620
-rw-r--r--mysql-test/main/selectivity.result16
-rw-r--r--mysql-test/main/selectivity_innodb.result16
-rw-r--r--mysql-test/main/set_operation.result314
-rw-r--r--mysql-test/main/set_statement.result74
-rw-r--r--mysql-test/main/shutdown_debug.combinations (renamed from mysql-test/main/shutdown_not_windows.combinations)0
-rw-r--r--mysql-test/main/shutdown_debug.result (renamed from mysql-test/main/shutdown_not_windows.result)0
-rw-r--r--mysql-test/main/shutdown_debug.test (renamed from mysql-test/main/shutdown_not_windows.test)3
-rw-r--r--mysql-test/main/signal_code.result16
-rw-r--r--mysql-test/main/signal_sqlmode.result4
-rw-r--r--mysql-test/main/sp-anchor-row-type-table.result2
-rw-r--r--mysql-test/main/sp-anchor-type.result14
-rw-r--r--mysql-test/main/sp-cursor.result44
-rw-r--r--mysql-test/main/sp-cursor.test51
-rw-r--r--mysql-test/main/sp-error.result2
-rw-r--r--mysql-test/main/sp-inout.result2033
-rw-r--r--mysql-test/main/sp-inout.test1964
-rw-r--r--mysql-test/main/sp-row.result6
-rw-r--r--mysql-test/main/sp-row.test6
-rw-r--r--mysql-test/main/sp-vars.result66
-rw-r--r--mysql-test/main/sp-vars.test6
-rw-r--r--mysql-test/main/sp.result44
-rw-r--r--mysql-test/main/sp.test19
-rw-r--r--mysql-test/main/statistics.result99
-rw-r--r--mysql-test/main/statistics.test82
-rw-r--r--mysql-test/main/statistics_json.result8354
-rw-r--r--mysql-test/main/statistics_json.test483
-rw-r--r--mysql-test/main/statistics_upgrade.result91
-rw-r--r--mysql-test/main/statistics_upgrade.test77
-rw-r--r--mysql-test/main/statistics_upgrade_not_done.result44
-rw-r--r--mysql-test/main/statistics_upgrade_not_done.test57
-rw-r--r--mysql-test/main/subselect4.result80
-rw-r--r--mysql-test/main/subselect_cache.result222
-rw-r--r--mysql-test/main/subselect_mat.result24
-rw-r--r--mysql-test/main/subselect_no_semijoin.result50
-rw-r--r--mysql-test/main/subselect_sj_mat.result60
-rw-r--r--mysql-test/main/symlink.result4
-rw-r--r--mysql-test/main/system_mysql_db.result4
-rw-r--r--mysql-test/main/system_mysql_db_fix40123.result4
-rw-r--r--mysql-test/main/system_mysql_db_fix50030.result4
-rw-r--r--mysql-test/main/system_mysql_db_fix50117.result4
-rw-r--r--mysql-test/main/timezone.result29
-rw-r--r--mysql-test/main/timezone.test49
-rw-r--r--mysql-test/main/trigger.result11
-rw-r--r--mysql-test/main/trigger.test6
-rw-r--r--mysql-test/main/truncate_notembedded.result3
-rw-r--r--mysql-test/main/truncate_notembedded.test7
-rw-r--r--mysql-test/main/type_date.result2
-rw-r--r--mysql-test/main/type_datetime.result4
-rw-r--r--mysql-test/main/type_decimal.result6
-rw-r--r--mysql-test/main/type_decimal.test3
-rw-r--r--mysql-test/main/type_enum.result31
-rw-r--r--mysql-test/main/type_enum.test30
-rw-r--r--mysql-test/main/type_geometry_mix_int.result351
-rw-r--r--mysql-test/main/type_geometry_mix_int.test19
-rw-r--r--mysql-test/main/type_newdecimal.result36
-rw-r--r--mysql-test/main/type_row.result23
-rw-r--r--mysql-test/main/type_row.test28
-rw-r--r--mysql-test/main/type_set.result31
-rw-r--r--mysql-test/main/type_set.test30
-rw-r--r--mysql-test/main/type_time_hires.result8
-rw-r--r--mysql-test/main/type_timestamp.result2
-rw-r--r--mysql-test/main/type_timestamp.test2
-rw-r--r--mysql-test/main/type_varchar.result8
-rw-r--r--mysql-test/main/union.test2
-rw-r--r--mysql-test/main/win.result360
-rw-r--r--mysql-test/main/win_empty_over.result68
-rw-r--r--mysql-test/main/winservice.inc75
-rw-r--r--mysql-test/main/winservice_basic.result11
-rw-r--r--mysql-test/main/winservice_basic.test5
-rw-r--r--mysql-test/main/winservice_i18n.result11
-rw-r--r--mysql-test/main/winservice_i18n.test7
-rw-r--r--mysql-test/std_data/ldml/Index.xml3
-rw-r--r--mysql-test/std_data/unicode/allkeys400.txt15169
-rw-r--r--mysql-test/std_data/unicode/allkeys520.txt22542
-rw-r--r--mysql-test/std_data/versioning/articles.frm.gzbin287 -> 0 bytes
-rw-r--r--mysql-test/std_data/versioning/articles2.frm.gzbin291 -> 0 bytes
-rw-r--r--mysql-test/std_data/versioning/ibdata1.gzbin41597 -> 0 bytes
-rw-r--r--mysql-test/std_data/versioning/user_stopword.frm.gzbin199 -> 0 bytes
-rw-r--r--mysql-test/suite.pm25
-rw-r--r--mysql-test/suite/archive/archive.result15
-rw-r--r--mysql-test/suite/archive/archive.test23
-rw-r--r--mysql-test/suite/archive/archive_gis.result4
-rw-r--r--mysql-test/suite/atomic/alter_partition,innodb.rdiff525
-rw-r--r--mysql-test/suite/atomic/alter_partition.combinations6
-rw-r--r--mysql-test/suite/atomic/alter_partition.result743
-rw-r--r--mysql-test/suite/atomic/alter_partition.test174
-rw-r--r--mysql-test/suite/binlog/include/mysqlbinlog_gtid_strict_mode.inc421
-rw-r--r--mysql-test/suite/binlog/include/mysqlbinlog_gtid_window_test_cases.inc606
-rw-r--r--mysql-test/suite/binlog/r/binlog_mysqlbinlog_glle_ordered.result19
-rw-r--r--mysql-test/suite/binlog/r/binlog_mysqlbinlog_gtid_strict_mode.result925
-rw-r--r--mysql-test/suite/binlog/r/binlog_mysqlbinlog_gtid_window.result468
-rw-r--r--mysql-test/suite/binlog/r/binlog_mysqlbinlog_start_alter_verbose.result15
-rw-r--r--mysql-test/suite/binlog/r/start_alter_mysqlbinlog_replay.result42
-rw-r--r--mysql-test/suite/binlog/t/binlog_innodb.test4
-rw-r--r--mysql-test/suite/binlog/t/binlog_mysqlbinlog_glle_ordered.test43
-rw-r--r--mysql-test/suite/binlog/t/binlog_mysqlbinlog_gtid_strict_mode.test105
-rw-r--r--mysql-test/suite/binlog/t/binlog_mysqlbinlog_gtid_window.test151
-rw-r--r--mysql-test/suite/binlog/t/binlog_mysqlbinlog_start_alter_verbose.test58
-rw-r--r--mysql-test/suite/binlog/t/start_alter_mysqlbinlog_replay.test61
-rw-r--r--mysql-test/suite/binlog_encryption/rpl_switch_stm_row_mixed.result54
-rw-r--r--mysql-test/suite/compat/oracle/r/sp-anchor-row-type-table.result2
-rw-r--r--mysql-test/suite/compat/oracle/r/sp-cursor.result47
-rw-r--r--mysql-test/suite/compat/oracle/r/sp-inout.result2571
-rw-r--r--mysql-test/suite/compat/oracle/r/sp-param.result46
-rw-r--r--mysql-test/suite/compat/oracle/r/sp-row.result8
-rw-r--r--mysql-test/suite/compat/oracle/r/sp.result14
-rw-r--r--mysql-test/suite/compat/oracle/t/sp-cursor.test55
-rw-r--r--mysql-test/suite/compat/oracle/t/sp-inout.test2497
-rw-r--r--mysql-test/suite/compat/oracle/t/sp-row.test8
-rw-r--r--mysql-test/suite/encryption/r/bulk_insert.result7
-rw-r--r--mysql-test/suite/encryption/r/corrupted_during_recovery.result2
-rw-r--r--mysql-test/suite/encryption/r/innodb-bad-key-change.result28
-rw-r--r--mysql-test/suite/encryption/r/innodb-bad-key-change2.result18
-rw-r--r--mysql-test/suite/encryption/r/innodb-bad-key-change4.result8
-rw-r--r--mysql-test/suite/encryption/r/innodb-missing-key.result8
-rw-r--r--mysql-test/suite/encryption/r/innodb-redo-nokeys.result2
-rw-r--r--mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result66
-rw-r--r--mysql-test/suite/encryption/r/tempfiles_encrypted.result360
-rw-r--r--mysql-test/suite/encryption/t/bulk_insert.opt1
-rw-r--r--mysql-test/suite/encryption/t/bulk_insert.test11
-rw-r--r--mysql-test/suite/encryption/t/corrupted_during_recovery.test6
-rw-r--r--mysql-test/suite/encryption/t/innodb-bad-key-change.test20
-rw-r--r--mysql-test/suite/encryption/t/innodb-bad-key-change2.test10
-rw-r--r--mysql-test/suite/encryption/t/innodb-bad-key-change4.test4
-rw-r--r--mysql-test/suite/encryption/t/innodb-missing-key.test8
-rw-r--r--mysql-test/suite/encryption/t/innodb-redo-nokeys.test2
-rw-r--r--mysql-test/suite/engines/funcs/r/ix_using_order.result4
-rw-r--r--mysql-test/suite/engines/funcs/r/rpl_switch_stm_row_mixed.result54
-rw-r--r--mysql-test/suite/engines/funcs/r/tc_partition_reorg_divide.result12
-rw-r--r--mysql-test/suite/engines/funcs/r/tc_partition_reorg_merge.result12
-rw-r--r--mysql-test/suite/engines/funcs/t/tc_partition_reorg_divide.test12
-rw-r--r--mysql-test/suite/engines/funcs/t/tc_partition_reorg_merge.test12
-rw-r--r--mysql-test/suite/federated/error_row_number.result26
-rw-r--r--mysql-test/suite/federated/error_row_number.test18
-rw-r--r--mysql-test/suite/federated/federatedx_create_handlers.result166
-rw-r--r--mysql-test/suite/federated/indexes.result33
-rw-r--r--mysql-test/suite/federated/indexes.test22
-rw-r--r--mysql-test/suite/funcs_1/r/innodb_func_view.result4
-rw-r--r--mysql-test/suite/funcs_1/r/innodb_trig_0102.result6
-rw-r--r--mysql-test/suite/funcs_1/r/innodb_trig_03.result6
-rw-r--r--mysql-test/suite/funcs_1/r/innodb_trig_0407.result6
-rw-r--r--mysql-test/suite/funcs_1/r/innodb_trig_08.result6
-rw-r--r--mysql-test/suite/funcs_1/r/innodb_trig_09.result6
-rw-r--r--mysql-test/suite/funcs_1/r/innodb_trig_1011ext.result6
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_innodb.result32
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_memory.result38
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_myisam.result38
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_myisam_embedded.result38
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_mysql.result8
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result8
-rw-r--r--mysql-test/suite/funcs_1/r/is_routines_embedded.result6
-rw-r--r--mysql-test/suite/funcs_1/r/memory_func_view.result4
-rw-r--r--mysql-test/suite/funcs_1/r/memory_trig_0102.result6
-rw-r--r--mysql-test/suite/funcs_1/r/memory_trig_03.result6
-rw-r--r--mysql-test/suite/funcs_1/r/memory_trig_0407.result6
-rw-r--r--mysql-test/suite/funcs_1/r/memory_trig_08.result6
-rw-r--r--mysql-test/suite/funcs_1/r/memory_trig_09.result6
-rw-r--r--mysql-test/suite/funcs_1/r/memory_trig_1011ext.result6
-rw-r--r--mysql-test/suite/funcs_1/r/myisam_func_view.result4
-rw-r--r--mysql-test/suite/funcs_1/r/myisam_trig_0102.result6
-rw-r--r--mysql-test/suite/funcs_1/r/myisam_trig_03.result6
-rw-r--r--mysql-test/suite/funcs_1/r/myisam_trig_0407.result6
-rw-r--r--mysql-test/suite/funcs_1/r/myisam_trig_08.result6
-rw-r--r--mysql-test/suite/funcs_1/r/myisam_trig_09.result6
-rw-r--r--mysql-test/suite/funcs_1/r/myisam_trig_1011ext.result6
-rw-r--r--mysql-test/suite/funcs_1/r/storedproc.result192
-rw-r--r--mysql-test/suite/galera/disabled.def1
-rw-r--r--mysql-test/suite/galera/include/have_wsrep_replicate_myisam.inc4
-rw-r--r--mysql-test/suite/galera/r/MDEV-27001.result6
-rw-r--r--mysql-test/suite/galera/r/MW-416.result12
-rw-r--r--mysql-test/suite/galera/r/galera_as_slave.result6
-rw-r--r--mysql-test/suite/galera/r/galera_defaults.result8
-rw-r--r--mysql-test/suite/galera/r/galera_myisam_transactions.result8
-rw-r--r--mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result34
-rw-r--r--mysql-test/suite/galera/r/galera_var_wsrep_strict_ddl.result26
-rw-r--r--mysql-test/suite/galera/t/MDEV-27001.opt1
-rw-r--r--mysql-test/suite/galera/t/MDEV-27001.test7
-rw-r--r--mysql-test/suite/galera/t/MW-416.test12
-rw-r--r--mysql-test/suite/galera/t/galera_as_slave.test16
-rw-r--r--mysql-test/suite/galera/t/galera_backup_stage.test6
-rw-r--r--mysql-test/suite/galera/t/galera_defaults.test2
-rw-r--r--mysql-test/suite/galera/t/galera_myisam_transactions.test4
-rw-r--r--mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test14
-rw-r--r--mysql-test/suite/galera/t/galera_var_wsrep_strict_ddl.test13
-rw-r--r--mysql-test/suite/galera_3nodes/disabled.def2
-rw-r--r--mysql-test/suite/galera_3nodes/r/GCF-363.result4
-rw-r--r--mysql-test/suite/galera_3nodes/t/GCF-363.test6
-rw-r--r--mysql-test/suite/gcol/inc/gcol_column_def_options.inc2
-rw-r--r--mysql-test/suite/gcol/inc/gcol_supported_sql_funcs_main.inc12
-rw-r--r--mysql-test/suite/gcol/r/gcol_keys_innodb.result2
-rw-r--r--mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result14
-rw-r--r--mysql-test/suite/gcol/r/gcol_supported_sql_funcs_myisam.result14
-rw-r--r--mysql-test/suite/gcol/r/innodb_virtual_index.result2
-rw-r--r--mysql-test/suite/heap/heap_hash.result22
-rw-r--r--mysql-test/suite/heap/heap_hash.test20
-rw-r--r--mysql-test/suite/innodb/include/have_innodb_bzip2.opt1
-rw-r--r--mysql-test/suite/innodb/include/have_innodb_lz4.opt2
-rw-r--r--mysql-test/suite/innodb/include/have_innodb_lzma.opt2
-rw-r--r--mysql-test/suite/innodb/include/have_innodb_lzo.opt2
-rw-r--r--mysql-test/suite/innodb/include/have_innodb_snappy.opt2
-rw-r--r--mysql-test/suite/innodb/include/no_checkpoint_end.inc15
-rw-r--r--mysql-test/suite/innodb/r/alter_kill.result2
-rw-r--r--mysql-test/suite/innodb/r/autoinc_persist,desc.rdiff769
-rw-r--r--mysql-test/suite/innodb/r/autoinc_persist.result11
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_loaded,lz4.rdiff19
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_loaded,lzma.rdiff19
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_loaded,lzo.rdiff19
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_loaded,snappy.rdiff19
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_loaded.result10
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_unloaded,lz4.rdiff26
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_unloaded,lzma.rdiff26
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_unloaded,lzo.rdiff26
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_unloaded,snappy.rdiff26
-rw-r--r--mysql-test/suite/innodb/r/compression_providers_unloaded.result14
-rw-r--r--mysql-test/suite/innodb/r/corrupted_during_recovery.result2
-rw-r--r--mysql-test/suite/innodb/r/innodb-alter.result2
-rw-r--r--mysql-test/suite/innodb/r/innodb-index,debug.rdiff10
-rw-r--r--mysql-test/suite/innodb/r/innodb-index.result48
-rw-r--r--mysql-test/suite/innodb/r/innodb-online-alter-gis.result2
-rw-r--r--mysql-test/suite/innodb/r/innodb-wl5522-debug.result2
-rw-r--r--mysql-test/suite/innodb/r/innodb_buffer_pool_resize.result10
-rw-r--r--mysql-test/suite/innodb/r/innodb_gis.result4
-rw-r--r--mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result9
-rw-r--r--mysql-test/suite/innodb/r/innodb_status_variables.result3
-rw-r--r--mysql-test/suite/innodb/r/insert_into_empty,32k.rdiff9
-rw-r--r--mysql-test/suite/innodb/r/insert_into_empty,64k.rdiff9
-rw-r--r--mysql-test/suite/innodb/r/insert_into_empty.result214
-rw-r--r--mysql-test/suite/innodb/r/instant_alter.result12
-rw-r--r--mysql-test/suite/innodb/r/instant_alter_import.result2
-rw-r--r--mysql-test/suite/innodb/r/log_corruption.result66
-rw-r--r--mysql-test/suite/innodb/r/log_file.result5
-rw-r--r--mysql-test/suite/innodb/r/log_file_name_debug.result17
-rw-r--r--mysql-test/suite/innodb/r/log_file_size.result47
-rw-r--r--mysql-test/suite/innodb/r/monitor.result10
-rw-r--r--mysql-test/suite/innodb/r/online_table_rebuild.result20
-rw-r--r--mysql-test/suite/innodb/r/rename_table.result2
-rw-r--r--mysql-test/suite/innodb/r/truncate_missing.result2
-rw-r--r--mysql-test/suite/innodb/t/alter_kill.test5
-rw-r--r--mysql-test/suite/innodb/t/alter_missing_tablespace.test2
-rw-r--r--mysql-test/suite/innodb/t/autoinc_persist.combinations2
-rw-r--r--mysql-test/suite/innodb/t/autoinc_persist.test56
-rw-r--r--mysql-test/suite/innodb/t/compression_providers_loaded.combinations19
-rw-r--r--mysql-test/suite/innodb/t/compression_providers_loaded.test18
-rw-r--r--mysql-test/suite/innodb/t/compression_providers_unloaded.combinations14
-rw-r--r--mysql-test/suite/innodb/t/compression_providers_unloaded.test13
-rw-r--r--mysql-test/suite/innodb/t/corrupted_during_recovery.test4
-rw-r--r--mysql-test/suite/innodb/t/innodb-alter.test4
-rw-r--r--mysql-test/suite/innodb/t/innodb-index-online-fk.test2
-rw-r--r--mysql-test/suite/innodb/t/innodb-index-online.opt1
-rw-r--r--mysql-test/suite/innodb/t/innodb-index.test68
-rw-r--r--mysql-test/suite/innodb/t/innodb-table-online-master.opt2
-rw-r--r--mysql-test/suite/innodb/t/innodb-table-online.test2
-rw-r--r--mysql-test/suite/innodb/t/innodb-wl5522-debug.test2
-rw-r--r--mysql-test/suite/innodb/t/innodb-wl5980-alter.test4
-rw-r--r--mysql-test/suite/innodb/t/innodb_28867993.test4
-rw-r--r--mysql-test/suite/innodb/t/innodb_buffer_pool_resize.test4
-rw-r--r--mysql-test/suite/innodb/t/innodb_buffer_pool_resize_temporary.test2
-rw-r--r--mysql-test/suite/innodb/t/innodb_buffer_pool_resize_with_chunks.test2
-rw-r--r--mysql-test/suite/innodb/t/innodb_bug44571.test2
-rw-r--r--mysql-test/suite/innodb/t/innodb_page_compressed.combinations5
-rw-r--r--mysql-test/suite/innodb/t/insert_into_empty.opt1
-rw-r--r--mysql-test/suite/innodb/t/insert_into_empty.test213
-rw-r--r--mysql-test/suite/innodb/t/instant_alter_import.test2
-rw-r--r--mysql-test/suite/innodb/t/log_corruption.test82
-rw-r--r--mysql-test/suite/innodb/t/log_file.test6
-rw-r--r--mysql-test/suite/innodb/t/log_file_name.test3
-rw-r--r--mysql-test/suite/innodb/t/log_file_name_debug.test49
-rw-r--r--mysql-test/suite/innodb/t/log_file_size.test136
-rw-r--r--mysql-test/suite/innodb/t/missing_tablespaces.test2
-rw-r--r--mysql-test/suite/innodb/t/online_table_rebuild.test24
-rw-r--r--mysql-test/suite/innodb/t/rename_table.test2
-rw-r--r--mysql-test/suite/innodb/t/restart.test2
-rw-r--r--mysql-test/suite/innodb/t/truncate_missing.test2
-rw-r--r--mysql-test/suite/innodb_fts/r/create.result25
-rw-r--r--mysql-test/suite/innodb_fts/r/versioning.result3
-rw-r--r--mysql-test/suite/innodb_fts/t/create.test20
-rw-r--r--mysql-test/suite/innodb_fts/t/versioning.combinations2
-rw-r--r--mysql-test/suite/innodb_fts/t/versioning.opt2
-rw-r--r--mysql-test/suite/innodb_fts/t/versioning.test131
-rw-r--r--mysql-test/suite/innodb_gis/r/0.result4
-rw-r--r--mysql-test/suite/innodb_gis/r/1.result4
-rw-r--r--mysql-test/suite/innodb_gis/r/alter_spatial_index.result2
-rw-r--r--mysql-test/suite/innodb_gis/r/geometry.result4
-rw-r--r--mysql-test/suite/innodb_gis/r/gis.result4
-rw-r--r--mysql-test/suite/innodb_gis/t/1.test4
-rw-r--r--mysql-test/suite/innodb_gis/t/gis.test4
-rw-r--r--mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result2
-rw-r--r--mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test2
-rw-r--r--mysql-test/suite/json/r/json_no_table.result2
-rw-r--r--mysql-test/suite/json/r/json_table.result18
-rw-r--r--mysql-test/suite/json/r/json_table_mysql.result18
-rw-r--r--mysql-test/suite/json/r/type_json.result58
-rw-r--r--mysql-test/suite/maria/maria2.result97
-rw-r--r--mysql-test/suite/maria/maria2.test80
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_loaded,lz4.rdiff13
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_loaded,lzma.rdiff13
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_loaded,lzo.rdiff13
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_loaded,snappy.rdiff13
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_loaded.combinations14
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_loaded.result27
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_loaded.test38
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_unloaded,lz4.rdiff22
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_unloaded,lzma.rdiff22
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_unloaded,lzo.rdiff22
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_unloaded,snappy.rdiff22
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_unloaded.combinations14
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_unloaded.result22
-rw-r--r--mysql-test/suite/mariabackup/compression_providers_unloaded.test35
-rw-r--r--mysql-test/suite/mariabackup/huge_lsn,strict_crc32.rdiff11
-rw-r--r--mysql-test/suite/mariabackup/huge_lsn.result4
-rw-r--r--mysql-test/suite/mariabackup/huge_lsn.test52
-rw-r--r--mysql-test/suite/mariabackup/incremental_page_compressed.result13
-rw-r--r--mysql-test/suite/mariabackup/incremental_page_compressed.test38
-rw-r--r--mysql-test/suite/mariabackup/innodb_redo_log_overwrite.opt2
-rw-r--r--mysql-test/suite/mariabackup/innodb_redo_overwrite.opt2
-rw-r--r--mysql-test/suite/mariabackup/innodb_redo_overwrite.result28
-rw-r--r--mysql-test/suite/mariabackup/innodb_redo_overwrite.test27
-rw-r--r--mysql-test/suite/mariabackup/missing_ibd.test2
-rw-r--r--mysql-test/suite/mariabackup/xb_file_key_management.result4
-rw-r--r--mysql-test/suite/mariabackup/xb_file_key_management.test6
-rw-r--r--mysql-test/suite/multi_source/change_master.result8
-rw-r--r--mysql-test/suite/multi_source/change_master.test13
-rw-r--r--mysql-test/suite/multi_source/multisource_for_channel.result370
-rw-r--r--mysql-test/suite/multi_source/multisource_for_channel.test438
-rw-r--r--mysql-test/suite/parts/inc/engines.combinations8
-rw-r--r--mysql-test/suite/parts/inc/engines.inc4
-rw-r--r--mysql-test/suite/parts/inc/partition.pre2
-rw-r--r--mysql-test/suite/parts/inc/partition_alter_1.inc6
-rw-r--r--mysql-test/suite/parts/inc/partition_fail.inc11
-rw-r--r--mysql-test/suite/parts/inc/partition_fail_t2.inc20
-rw-r--r--mysql-test/suite/parts/r/alter_table,list.rdiff85
-rw-r--r--mysql-test/suite/parts/r/alter_table.result316
-rw-r--r--mysql-test/suite/parts/r/debug_innodb_fail.result279
-rw-r--r--mysql-test/suite/parts/r/debug_myisam_fail.result279
-rw-r--r--mysql-test/suite/parts/r/engine_defined_part_attributes.result288
-rw-r--r--mysql-test/suite/parts/r/partition_alter4_innodb.result160
-rw-r--r--mysql-test/suite/parts/r/partition_alter4_myisam.result160
-rw-r--r--mysql-test/suite/parts/r/partition_debug.result3478
-rw-r--r--mysql-test/suite/parts/r/partition_debug_innodb.result252
-rw-r--r--mysql-test/suite/parts/t/alter_table.combinations2
-rw-r--r--mysql-test/suite/parts/t/alter_table.test273
-rw-r--r--mysql-test/suite/parts/t/engine_defined_part_attributes.test221
-rw-r--r--mysql-test/suite/parts/t/partition_debug.test111
-rw-r--r--mysql-test/suite/perfschema/include/default_mysqld_autosize.cnf5
-rw-r--r--mysql-test/suite/perfschema/r/digest_view.result50
-rw-r--r--mysql-test/suite/perfschema/r/max_program_zero.result2
-rw-r--r--mysql-test/suite/perfschema/r/misc.result13
-rw-r--r--mysql-test/suite/perfschema/r/ortho_iter.result2
-rw-r--r--mysql-test/suite/perfschema/r/privilege_table_io.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_disable_idle.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_disable_stages.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_disable_statements.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_disable_transactions.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_disable_waits.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_innodb.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result4
-rw-r--r--mysql-test/suite/perfschema/r/start_server_low_index.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_low_table_lock.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_account.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_cond_class.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_cond_inst.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_file_class.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_file_inst.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_host.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_index.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_mdl.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_memory_class.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_mutex_class.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_setup_actors.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_setup_objects.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_socket_class.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_socket_inst.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_stage_class.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_stages_history.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_statements_history.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_table_hdl.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_table_inst.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_table_lock.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_thread_class.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_thread_inst.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_transactions_history.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_user.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_waits_history.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_off.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_on.result2
-rw-r--r--mysql-test/suite/perfschema/r/start_server_variables.result2
-rw-r--r--mysql-test/suite/perfschema/r/statement_program_lost_inst.result2
-rw-r--r--mysql-test/suite/perfschema/r/sxlock_func.result2
-rw-r--r--mysql-test/suite/perfschema/t/misc.test20
-rw-r--r--mysql-test/suite/plugins/r/auth_ed25519.result2
-rw-r--r--mysql-test/suite/plugins/r/compression,innodb-lz4.rdiff24
-rw-r--r--mysql-test/suite/plugins/r/compression,innodb-lzma.rdiff24
-rw-r--r--mysql-test/suite/plugins/r/compression,innodb-lzo.rdiff24
-rw-r--r--mysql-test/suite/plugins/r/compression,innodb-snappy.rdiff24
-rw-r--r--mysql-test/suite/plugins/r/compression,mroonga-lz4.rdiff40
-rw-r--r--mysql-test/suite/plugins/r/compression.result22
-rw-r--r--mysql-test/suite/plugins/r/compression_load.result33
-rw-r--r--mysql-test/suite/plugins/r/cracklib_password_check.result16
-rw-r--r--mysql-test/suite/plugins/r/password_reuse_check.result94
-rw-r--r--mysql-test/suite/plugins/r/show_all_plugins.result4
-rw-r--r--mysql-test/suite/plugins/r/simple_password_check.result4
-rw-r--r--mysql-test/suite/plugins/r/test_sql_service.result96
-rw-r--r--mysql-test/suite/plugins/t/compression.combinations29
-rw-r--r--mysql-test/suite/plugins/t/compression.test52
-rw-r--r--mysql-test/suite/plugins/t/compression_load.test24
-rw-r--r--mysql-test/suite/plugins/t/cracklib_password_check.test8
-rw-r--r--mysql-test/suite/plugins/t/password_reuse_check.test100
-rw-r--r--mysql-test/suite/plugins/t/test_sql_service.test68
-rw-r--r--mysql-test/suite/roles/definer.result7
-rw-r--r--mysql-test/suite/rpl/include/rpl_extra_col_master.test2
-rw-r--r--mysql-test/suite/rpl/include/rpl_mixed_dml.inc18
-rw-r--r--mysql-test/suite/rpl/include/rpl_switch_stm_row_mixed.inc60
-rw-r--r--mysql-test/suite/rpl/include/start_alter_basic.inc60
-rw-r--r--mysql-test/suite/rpl/include/start_alter_concurrent.inc230
-rw-r--r--mysql-test/suite/rpl/include/start_alter_include.inc64
-rw-r--r--mysql-test/suite/rpl/include/start_alter_options.inc399
-rw-r--r--mysql-test/suite/rpl/r/rpl_alter_rollback.result54
-rw-r--r--mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result9
-rw-r--r--mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result30
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_1.result313
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_2.result326
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_3.result326
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_4.result327
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_5.result327
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_6.result329
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_7.result368
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_8.result362
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_bugs.result33
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_chain_basic.result83
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_ftwrl.result60
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_instant.result66
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_1.result172
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_2.result419
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_optimize.result18
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_options.result497
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_para_to_seq.result14
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_restart_master.result85
-rw-r--r--mysql-test/suite/rpl/r/rpl_start_alter_restart_slave.result119
-rw-r--r--mysql-test/suite/rpl/r/rpl_switch_stm_row_mixed.result54
-rw-r--r--mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result6
-rw-r--r--mysql-test/suite/rpl/t/rpl_alter_rollback.test42
-rw-r--r--mysql-test/suite/rpl/t/rpl_blackhole_row_annotate.test2
-rw-r--r--mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test1
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_1.test33
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_2.test53
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_3.test54
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_4.test54
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_5.test54
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_6.test58
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_7.cnf19
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_7.test112
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_8.cnf19
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_8.test109
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_bugs.test47
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.cnf24
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.test54
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_ftwrl.test91
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_instant.test30
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_1.test39
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.cnf19
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.test164
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_optimize.test25
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_options.test31
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_para_to_seq.test24
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_restart_master.test76
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test121
-rw-r--r--mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test6
-rw-r--r--mysql-test/suite/s3/mysqldump.result6
-rw-r--r--mysql-test/suite/sql_sequence/mysqldump.result16
-rw-r--r--mysql-test/suite/sys_vars/r/binlog_alter_two_phase.result53
-rw-r--r--mysql-test/suite/sys_vars/r/default_tmp_storage_engine_rocksdb.result102
-rw-r--r--mysql-test/suite/sys_vars/r/histogram_type_basic.result8
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_log_write_ahead_size_basic.result88
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_purge_threads_basic.result25
-rw-r--r--mysql-test/suite/sys_vars/r/keep_files_on_create_basic.result48
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff88
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb.result41
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_server_embedded.result4
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result14
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_wsrep.result30
-rw-r--r--mysql-test/suite/sys_vars/t/binlog_alter_two_phase.test52
-rw-r--r--mysql-test/suite/sys_vars/t/default_tmp_storage_engine_rocksdb.test86
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_buffer_pool_size_basic.test2
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_log_write_ahead_size_basic.test93
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_purge_threads_basic.test14
-rw-r--r--mysql-test/suite/sys_vars/t/sysvars_innodb.test1
-rw-r--r--mysql-test/suite/sysschema/r/pr_statement_performance_analyzer.result4
-rw-r--r--mysql-test/suite/sysschema/r/pr_table_exists.result2
-rw-r--r--mysql-test/suite/vcol/r/binlog.result2
-rw-r--r--mysql-test/suite/versioning/r/data.result59
-rw-r--r--mysql-test/suite/versioning/r/partition,heap.rdiff86
-rw-r--r--mysql-test/suite/versioning/r/partition.result395
-rw-r--r--mysql-test/suite/versioning/t/alter.test4
-rw-r--r--mysql-test/suite/versioning/t/create.test6
-rw-r--r--mysql-test/suite/versioning/t/data.test32
-rw-r--r--mysql-test/suite/versioning/t/partition.test228
-rw-r--r--mysql-test/suite/wsrep/r/variables.result4
-rw-r--r--mysql-test/suite/wsrep/r/variables_debug.result3
-rw-r--r--mysys/CMakeLists.txt1
-rw-r--r--mysys/array.c47
-rw-r--r--mysys/charset.c134
-rw-r--r--mysys/crc32ieee.cc4
-rw-r--r--mysys/get_password.c55
-rw-r--r--mysys/hash.c22
-rw-r--r--mysys/my_alloc.c268
-rw-r--r--mysys/my_bitmap.c69
-rw-r--r--mysys/my_conio.c223
-rw-r--r--mysys/my_default.c6
-rw-r--r--mysys/my_delete.c2
-rw-r--r--mysys/my_getopt.c48
-rw-r--r--mysys/my_init.c86
-rw-r--r--mysys/my_largepage.c22
-rw-r--r--mysys/my_lockmem.c4
-rw-r--r--mysys/my_malloc.c2
-rw-r--r--mysys/my_rdtsc.c2
-rw-r--r--mysys/my_uuid.c31
-rw-r--r--mysys/thr_mutex.c9
-rw-r--r--mysys/waiting_threads.c2
-rw-r--r--plugin/auth_pam/auth_pam.c2
-rw-r--r--plugin/cracklib_password_check/cracklib_password_check.c13
-rw-r--r--plugin/password_reuse_check/CMakeLists.txt3
-rw-r--r--plugin/password_reuse_check/password_reuse_check.c262
-rw-r--r--plugin/provider_bzip2/CMakeLists.txt15
-rw-r--r--plugin/provider_bzip2/plugin.c61
-rw-r--r--plugin/provider_bzip2/provider_bzip2.cnf3
-rw-r--r--plugin/provider_lz4/CMakeLists.txt15
-rw-r--r--plugin/provider_lz4/plugin.c56
-rw-r--r--plugin/provider_lz4/provider_lz4.cnf3
-rw-r--r--plugin/provider_lzma/CMakeLists.txt15
-rw-r--r--plugin/provider_lzma/plugin.c55
-rw-r--r--plugin/provider_lzma/provider_lzma.cnf3
-rw-r--r--plugin/provider_lzo/CMakeLists.txt15
-rw-r--r--plugin/provider_lzo/plugin.c55
-rw-r--r--plugin/provider_lzo/provider_lzo.cnf3
-rw-r--r--plugin/provider_snappy/CMakeLists.txt15
-rw-r--r--plugin/provider_snappy/plugin.c58
-rw-r--r--plugin/provider_snappy/provider_snappy.cnf3
-rw-r--r--plugin/server_audit/server_audit.c1
-rw-r--r--plugin/simple_password_check/simple_password_check.c4
-rw-r--r--plugin/test_sql_service/CMakeLists.txt2
-rw-r--r--plugin/test_sql_service/test_sql_service.c228
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6.result85
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6.test73
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_decimal.result353
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_decimal.test19
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double.result353
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double.test19
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_loose.result406
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_loose.test21
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_strict_ignore.result400
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_strict_ignore.test21
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_int.result353
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_int.test19
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_time.result353
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_time.test19
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_uint.result353
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_mix_uint.test19
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_sum.result51
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_sum.test41
-rw-r--r--plugin/type_mysql_json/type.cc14
-rw-r--r--plugin/type_uuid/CMakeLists.txt18
-rw-r--r--plugin/type_uuid/item_uuidfunc.cc46
-rw-r--r--plugin/type_uuid/item_uuidfunc.h67
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/binlog_stm_type_uuid.result37
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/binlog_stm_type_uuid.test32
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/binlog_table_map_optional_metadata_type_uuid.result60
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/binlog_table_map_optional_metadata_type_uuid.test72
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/func_uuid_plugin.result35
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/func_uuid_plugin.test30
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/rpl_row_binary_to_uuid.result35
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/rpl_row_binary_to_uuid.test33
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/rpl_row_uuid_to_binary.result35
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/rpl_row_uuid_to_binary.test33
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/rpl_type_uuid.result19
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/rpl_type_uuid.test18
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/std_data/t1nopackkey.frmbin0 -> 944 bytes
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/std_data/t1packkey.frmbin0 -> 944 bytes
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/suite.pm7
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid-debug.result18
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid-debug.test14
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid.result3189
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid.test1684
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_csv.result92
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_csv.test58
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_engines.inc108
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.result203
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.test31
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_memory.result250
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_memory.test15
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_decimal.result353
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_decimal.test19
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_double.result353
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_double.test19
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_int.result353
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_int.test19
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_time.result353
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_time.test19
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_uint.result353
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_uint.test19
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_myisam.result237
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_myisam.test61
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mysql.result16
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_mysql.test6
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_partition.result1797
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_partition.test104
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_plugin.result31
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_plugin.test27
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_stat_tables.result24
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_stat_tables.test22
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_sum.result17
-rw-r--r--plugin/type_uuid/mysql-test/type_uuid/type_uuid_sum.test17
-rw-r--r--plugin/type_uuid/plugin.cc122
-rw-r--r--plugin/type_uuid/sql_type_uuid.cc117
-rw-r--r--plugin/type_uuid/sql_type_uuid.h186
-rw-r--r--plugin/user_variables/mysql-test/user_variables/basic.result5
-rw-r--r--plugin/user_variables/mysql-test/user_variables/basic.test1
-rw-r--r--plugin/win_auth_client/handshake_client.cc2
-rw-r--r--scripts/fill_help_tables.sql1890
-rw-r--r--scripts/mysql_install_db.sh18
-rw-r--r--scripts/mysql_system_tables.sql2
-rw-r--r--scripts/mysql_system_tables_fix.sql16
-rw-r--r--scripts/sys_schema/procedures/ps_setup_save.sql9
-rw-r--r--scripts/wsrep_sst_rsync.sh4
-rw-r--r--sql-common/client.c17
-rw-r--r--sql/CMakeLists.txt63
-rw-r--r--sql/backup.cc5
-rw-r--r--sql/create_options.cc113
-rw-r--r--sql/create_options.h25
-rw-r--r--sql/ddl_log.cc83
-rw-r--r--sql/ddl_log.h10
-rw-r--r--sql/discover.cc2
-rw-r--r--sql/encryption.cc10
-rw-r--r--sql/field.cc108
-rw-r--r--sql/field.h26
-rw-r--r--sql/gcalc_slicescan.cc2
-rw-r--r--sql/ha_partition.cc24
-rw-r--r--sql/handler.cc49
-rw-r--r--sql/handler.h85
-rw-r--r--sql/hostname.cc2
-rw-r--r--sql/item.cc28
-rw-r--r--sql/item.h91
-rw-r--r--sql/item_cmpfunc.cc45
-rw-r--r--sql/item_cmpfunc.h41
-rw-r--r--sql/item_create.cc215
-rw-r--r--sql/item_func.cc3
-rw-r--r--sql/item_geofunc.cc1
-rw-r--r--sql/item_jsonfunc.cc109
-rw-r--r--sql/item_jsonfunc.h35
-rw-r--r--sql/item_strfunc.cc469
-rw-r--r--sql/item_strfunc.h92
-rw-r--r--sql/item_subselect.cc38
-rw-r--r--sql/item_subselect.h5
-rw-r--r--sql/item_xmlfunc.cc4
-rw-r--r--sql/json_table.cc3
-rw-r--r--sql/key.cc20
-rw-r--r--sql/lex.h4
-rw-r--r--sql/lock.cc5
-rw-r--r--sql/log.cc189
-rw-r--r--sql/log.h3
-rw-r--r--sql/log_event.cc62
-rw-r--r--sql/log_event.h97
-rw-r--r--sql/log_event_client.cc68
-rw-r--r--sql/log_event_old.cc6
-rw-r--r--sql/log_event_server.cc463
-rw-r--r--sql/mdl.cc22
-rw-r--r--sql/my_json_writer.cc30
-rw-r--r--sql/my_json_writer.h13
-rw-r--r--sql/mysql_install_db.cc30
-rw-r--r--sql/mysql_upgrade_service.cc31
-rw-r--r--sql/mysqld.cc106
-rw-r--r--sql/mysqld.h15
-rw-r--r--sql/opt_histogram_json.cc1200
-rw-r--r--sql/opt_histogram_json.h148
-rw-r--r--sql/opt_range.cc192
-rw-r--r--sql/opt_range.h218
-rw-r--r--sql/opt_range_mrr.cc49
-rw-r--r--sql/opt_split.cc2
-rw-r--r--sql/opt_subselect.cc9
-rw-r--r--sql/opt_sum.cc5
-rw-r--r--sql/opt_table_elimination.cc2
-rw-r--r--sql/partition_element.h15
-rw-r--r--sql/partition_info.cc10
-rw-r--r--sql/partition_info.h13
-rw-r--r--sql/rpl_gtid.cc964
-rw-r--r--sql/rpl_gtid.h460
-rw-r--r--sql/rpl_mi.cc44
-rw-r--r--sql/rpl_mi.h25
-rw-r--r--sql/rpl_parallel.cc270
-rw-r--r--sql/rpl_parallel.h26
-rw-r--r--sql/rpl_rli.cc15
-rw-r--r--sql/rpl_rli.h52
-rw-r--r--sql/rpl_utility.cc2
-rw-r--r--sql/semisync_master_ack_receiver.cc4
-rw-r--r--sql/semisync_slave.cc9
-rw-r--r--sql/set_var.cc2
-rw-r--r--sql/share/errmsg-utf8.txt32
-rw-r--r--sql/signal_handler.cc4
-rw-r--r--sql/slave.cc137
-rw-r--r--sql/sp_head.cc217
-rw-r--r--sql/sp_head.h14
-rw-r--r--sql/sp_rcontext.cc5
-rw-r--r--sql/sp_rcontext.h7
-rw-r--r--sql/sql_acl.cc62
-rw-r--r--sql/sql_admin.cc5
-rw-r--r--sql/sql_alter.cc5
-rw-r--r--sql/sql_alter.h6
-rw-r--r--sql/sql_array.h20
-rw-r--r--sql/sql_audit.cc11
-rw-r--r--sql/sql_base.cc8
-rw-r--r--sql/sql_binlog.cc67
-rw-r--r--sql/sql_class.cc96
-rw-r--r--sql/sql_class.h123
-rw-r--r--sql/sql_cmd.h1
-rw-r--r--sql/sql_db.cc16
-rw-r--r--sql/sql_delete.cc5
-rw-r--r--sql/sql_error.cc18
-rw-r--r--sql/sql_error.h36
-rw-r--r--sql/sql_explain.cc45
-rw-r--r--sql/sql_explain.h1
-rw-r--r--sql/sql_get_diagnostics.cc2
-rw-r--r--sql/sql_get_diagnostics.h3
-rw-r--r--sql/sql_insert.cc82
-rw-r--r--sql/sql_insert.h1
-rw-r--r--sql/sql_lex.cc54
-rw-r--r--sql/sql_lex.h10
-rw-r--r--sql/sql_load.cc1
-rw-r--r--sql/sql_parse.cc18
-rw-r--r--sql/sql_partition.cc844
-rw-r--r--sql/sql_partition.h16
-rw-r--r--sql/sql_partition_admin.cc57
-rw-r--r--sql/sql_plugin.cc75
-rw-r--r--sql/sql_plugin.h2
-rw-r--r--sql/sql_plugin_services.inl101
-rw-r--r--sql/sql_prepare.cc468
-rw-r--r--sql/sql_prepare.h2
-rw-r--r--sql/sql_priv.h12
-rw-r--r--sql/sql_reload.cc2
-rw-r--r--sql/sql_select.cc89
-rw-r--r--sql/sql_show.cc46
-rw-r--r--sql/sql_signal.cc24
-rw-r--r--sql/sql_statistics.cc490
-rw-r--r--sql/sql_statistics.h223
-rw-r--r--sql/sql_table.cc609
-rw-r--r--sql/sql_table.h12
-rw-r--r--sql/sql_tablespace.cc72
-rw-r--r--sql/sql_test.cc2
-rw-r--r--sql/sql_tvc.cc8
-rw-r--r--sql/sql_type.cc2
-rw-r--r--sql/sql_update.cc11
-rw-r--r--sql/sql_yacc.yy832
-rw-r--r--sql/sys_vars.cc55
-rw-r--r--sql/table.cc85
-rw-r--r--sql/table.h35
-rw-r--r--sql/temporary_tables.cc19
-rw-r--r--sql/thread_pool_info.cc2
-rw-r--r--sql/tztime.cc8
-rw-r--r--sql/uniques.cc2
-rw-r--r--sql/unireg.cc12
-rw-r--r--sql/upgrade_conf_file.cc178
-rw-r--r--sql/winmain.cc1
-rw-r--r--sql/winservice.c25
-rw-r--r--sql/winservice.h176
-rw-r--r--sql/wsrep_mysqld.cc67
-rw-r--r--sql/wsrep_mysqld.h2
-rw-r--r--sql/wsrep_trans_observer.h4
-rw-r--r--sql/wsrep_var.cc24
-rw-r--r--sql/wsrep_var.h4
-rw-r--r--storage/archive/ha_archive.cc4
-rw-r--r--storage/columnstore/CMakeLists.txt9
-rw-r--r--storage/connect/bsonudf.cpp3
-rw-r--r--storage/connect/ha_connect.cc61
-rw-r--r--storage/connect/jsonudf.cpp3
-rw-r--r--storage/connect/mysql-test/connect/r/index.result9
-rw-r--r--storage/connect/mysql-test/connect/t/index.test24
-rw-r--r--storage/connect/tabrest.cpp3
-rw-r--r--storage/connect/tabutil.cpp4
-rw-r--r--storage/csv/ha_tina.cc1
-rw-r--r--storage/example/ha_example.cc2
-rw-r--r--storage/federatedx/federatedx_io_mysql.cc8
-rw-r--r--storage/federatedx/ha_federatedx.cc41
-rw-r--r--storage/federatedx/ha_federatedx.h3
-rw-r--r--storage/innobase/CMakeLists.txt16
-rw-r--r--storage/innobase/btr/btr0btr.cc22
-rw-r--r--storage/innobase/btr/btr0cur.cc8
-rw-r--r--storage/innobase/btr/btr0pcur.cc2
-rw-r--r--storage/innobase/btr/btr0sea.cc10
-rw-r--r--storage/innobase/buf/buf0buf.cc117
-rw-r--r--storage/innobase/buf/buf0checksum.cc15
-rw-r--r--storage/innobase/buf/buf0dblwr.cc10
-rw-r--r--storage/innobase/buf/buf0dump.cc22
-rw-r--r--storage/innobase/buf/buf0flu.cc228
-rw-r--r--storage/innobase/buf/buf0lru.cc4
-rw-r--r--storage/innobase/buf/buf0rea.cc15
-rw-r--r--storage/innobase/bzip2.cmake36
-rw-r--r--storage/innobase/data/data0data.cc42
-rw-r--r--storage/innobase/dict/dict0boot.cc6
-rw-r--r--storage/innobase/dict/dict0crea.cc35
-rw-r--r--storage/innobase/dict/dict0dict.cc50
-rw-r--r--storage/innobase/dict/dict0load.cc62
-rw-r--r--storage/innobase/dict/dict0mem.cc28
-rw-r--r--storage/innobase/dict/dict0stats.cc23
-rw-r--r--storage/innobase/eval/eval0eval.cc4
-rw-r--r--storage/innobase/fil/fil0crypt.cc17
-rw-r--r--storage/innobase/fil/fil0fil.cc352
-rw-r--r--storage/innobase/fil/fil0pagecompress.cc62
-rw-r--r--storage/innobase/fsp/fsp0file.cc56
-rw-r--r--storage/innobase/fsp/fsp0fsp.cc11
-rw-r--r--storage/innobase/fsp/fsp0space.cc4
-rw-r--r--storage/innobase/fsp/fsp0sysspace.cc35
-rw-r--r--storage/innobase/fts/fts0fts.cc2
-rw-r--r--storage/innobase/handler/ha_innodb.cc594
-rw-r--r--storage/innobase/handler/handler0alter.cc54
-rw-r--r--storage/innobase/handler/i_s.cc6
-rw-r--r--storage/innobase/ibuf/ibuf0ibuf.cc9
-rw-r--r--storage/innobase/include/buf0buf.h55
-rw-r--r--storage/innobase/include/buf0buf.inl3
-rw-r--r--storage/innobase/include/buf0flu.h29
-rw-r--r--storage/innobase/include/buf0rea.h10
-rw-r--r--storage/innobase/include/buf0types.h6
-rw-r--r--storage/innobase/include/data0data.h10
-rw-r--r--storage/innobase/include/dict0boot.h2
-rw-r--r--storage/innobase/include/dict0dict.h27
-rw-r--r--storage/innobase/include/dict0dict.inl14
-rw-r--r--storage/innobase/include/dict0mem.h46
-rw-r--r--storage/innobase/include/dyn0buf.h2
-rw-r--r--storage/innobase/include/fil0crypt.h6
-rw-r--r--storage/innobase/include/fil0fil.h653
-rw-r--r--storage/innobase/include/fil0pagecompress.h9
-rw-r--r--storage/innobase/include/fsp0file.h38
-rw-r--r--storage/innobase/include/fsp0fsp.h47
-rw-r--r--storage/innobase/include/fsp0space.h52
-rw-r--r--storage/innobase/include/fsp0sysspace.h25
-rw-r--r--storage/innobase/include/fsp0types.h25
-rw-r--r--storage/innobase/include/ibuf0ibuf.h2
-rw-r--r--storage/innobase/include/ibuf0ibuf.inl17
-rw-r--r--storage/innobase/include/log0crypt.h68
-rw-r--r--storage/innobase/include/log0log.h820
-rw-r--r--storage/innobase/include/log0log.inl311
-rw-r--r--storage/innobase/include/log0recv.h124
-rw-r--r--storage/innobase/include/mtr0log.h3
-rw-r--r--storage/innobase/include/mtr0mtr.h55
-rw-r--r--storage/innobase/include/mtr0types.h29
-rw-r--r--storage/innobase/include/os0file.h10
-rw-r--r--storage/innobase/include/page0cur.inl3
-rw-r--r--storage/innobase/include/page0page.h2
-rw-r--r--storage/innobase/include/rem0cmp.h185
-rw-r--r--storage/innobase/include/rem0cmp.inl107
-rw-r--r--storage/innobase/include/row0merge.h103
-rw-r--r--storage/innobase/include/srv0mon.h9
-rw-r--r--storage/innobase/include/srv0srv.h50
-rw-r--r--storage/innobase/include/trx0rec.h2
-rw-r--r--storage/innobase/include/trx0trx.h68
-rw-r--r--storage/innobase/include/trx0types.h2
-rw-r--r--storage/innobase/include/univ.i35
-rw-r--r--storage/innobase/include/ut0crc32.h37
-rw-r--r--storage/innobase/include/ut0pool.h5
-rw-r--r--storage/innobase/include/ut0ut.h10
-rw-r--r--storage/innobase/log/log0crypt.cc358
-rw-r--r--storage/innobase/log/log0log.cc1427
-rw-r--r--storage/innobase/log/log0recv.cc2502
-rw-r--r--storage/innobase/lz4.cmake38
-rw-r--r--storage/innobase/lzma.cmake35
-rw-r--r--storage/innobase/lzo.cmake34
-rw-r--r--storage/innobase/mtr/mtr0mtr.cc962
-rw-r--r--storage/innobase/os/os0file.cc362
-rw-r--r--storage/innobase/page/page0cur.cc9
-rw-r--r--storage/innobase/page/page0page.cc2
-rw-r--r--storage/innobase/page/page0zip.cc11
-rw-r--r--storage/innobase/pars/pars0opt.cc5
-rw-r--r--storage/innobase/rem/rem0cmp.cc249
-rw-r--r--storage/innobase/row/row0ftsort.cc19
-rw-r--r--storage/innobase/row/row0import.cc98
-rw-r--r--storage/innobase/row/row0ins.cc70
-rw-r--r--storage/innobase/row/row0log.cc10
-rw-r--r--storage/innobase/row/row0merge.cc722
-rw-r--r--storage/innobase/row/row0purge.cc2
-rw-r--r--storage/innobase/row/row0sel.cc62
-rw-r--r--storage/innobase/row/row0vers.cc27
-rw-r--r--storage/innobase/snappy.cmake34
-rw-r--r--storage/innobase/srv/srv0mon.cc95
-rw-r--r--storage/innobase/srv/srv0srv.cc62
-rw-r--r--storage/innobase/srv/srv0start.cc611
-rw-r--r--storage/innobase/trx/trx0purge.cc4
-rw-r--r--storage/innobase/trx/trx0rec.cc17
-rw-r--r--storage/innobase/trx/trx0roll.cc1
-rw-r--r--storage/innobase/trx/trx0sys.cc6
-rw-r--r--storage/innobase/trx/trx0trx.cc39
-rw-r--r--storage/innobase/ut/ut0ut.cc14
-rw-r--r--storage/maria/aria_chk.c2
-rw-r--r--storage/maria/ha_maria.cc8
-rw-r--r--storage/maria/ma_bitmap.c17
-rw-r--r--storage/maria/ma_control_file.c2
-rw-r--r--storage/maria/ma_ft_update.c2
-rw-r--r--storage/maria/ma_init.c2
-rw-r--r--storage/maria/ma_loghandler.c23
-rw-r--r--storage/maria/ma_open.c6
-rw-r--r--storage/maria/ma_page.c2
-rw-r--r--storage/maria/ma_search.c30
-rw-r--r--storage/maria/ma_sort.c36
-rw-r--r--storage/maria/unittest/ma_maria_log_cleanup.c2
-rw-r--r--storage/mroonga/CMakeLists.txt16
-rw-r--r--storage/mroonga/ha_mroonga.cpp14
-rw-r--r--storage/mroonga/lib/mrn_smart_bitmap.cpp2
-rw-r--r--storage/mroonga/mysql-test/mroonga/storage/r/index_desc.result9
-rw-r--r--storage/mroonga/mysql-test/mroonga/storage/t/index_desc.test15
-rw-r--r--storage/myisam/ft_update.c3
-rw-r--r--storage/myisam/ha_myisam.cc11
-rw-r--r--storage/myisam/mi_search.c25
-rw-r--r--storage/myisam/sort.c37
-rw-r--r--storage/myisammrg/ha_myisammrg.cc2
-rw-r--r--storage/oqgraph/cmake/FindJudy.cmake18
-rw-r--r--storage/rocksdb/CMakeLists.txt8
-rw-r--r--storage/rocksdb/build_rocksdb.cmake38
-rw-r--r--storage/rocksdb/ha_rocksdb.cc38
-rw-r--r--storage/rocksdb/ha_rocksdb.h4
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/r/col_opt_not_null.result2
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/r/col_opt_null.result2
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/r/index_key_block_size.result5
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result9
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/r/mariadb_plugin.result41
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result28
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp_rev.result28
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/t/index_key_block_size.test6
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/t/mariadb_plugin.test28
-rw-r--r--storage/rocksdb/rdb_datadic.cc39
-rw-r--r--storage/rocksdb/rdb_datadic.h2
-rw-r--r--storage/rocksdb/rdb_i_s.cc41
-rw-r--r--storage/rocksdb/rdb_sst_info.cc2
-rw-r--r--storage/spider/CMakeLists.txt5
-rw-r--r--storage/spider/ha_spider.cc1225
-rw-r--r--storage/spider/ha_spider.h81
-rw-r--r--storage/spider/hs_client/allocator.hpp43
-rw-r--r--storage/spider/hs_client/auto_addrinfo.hpp49
-rw-r--r--storage/spider/hs_client/auto_file.hpp67
-rw-r--r--storage/spider/hs_client/auto_ptrcontainer.hpp70
-rw-r--r--storage/spider/hs_client/config.cpp292
-rw-r--r--storage/spider/hs_client/config.hpp81
-rw-r--r--storage/spider/hs_client/escape.cpp129
-rw-r--r--storage/spider/hs_client/escape.hpp64
-rw-r--r--storage/spider/hs_client/fatal.cpp49
-rw-r--r--storage/spider/hs_client/fatal.hpp31
-rw-r--r--storage/spider/hs_client/hs_compat.h41
-rw-r--r--storage/spider/hs_client/hstcpcli.cpp667
-rw-r--r--storage/spider/hs_client/hstcpcli.hpp98
-rw-r--r--storage/spider/hs_client/mutex.hpp48
-rw-r--r--storage/spider/hs_client/socket.cpp314
-rw-r--r--storage/spider/hs_client/socket.hpp62
-rw-r--r--storage/spider/hs_client/string_buffer.hpp146
-rw-r--r--storage/spider/hs_client/string_ref.hpp106
-rw-r--r--storage/spider/hs_client/string_util.cpp207
-rw-r--r--storage/spider/hs_client/string_util.hpp51
-rw-r--r--storage/spider/hs_client/thread.hpp84
-rw-r--r--storage/spider/hs_client/util.hpp25
-rw-r--r--storage/spider/mysql-test/spider/bg/r/ha.result20
-rw-r--r--storage/spider/mysql-test/spider/bg/r/ha_part.result25
-rw-r--r--storage/spider/mysql-test/spider/bg/r/spider3_fixes.result5
-rw-r--r--storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result5
-rw-r--r--storage/spider/mysql-test/spider/bg/r/spider_fixes.result21
-rw-r--r--storage/spider/mysql-test/spider/bg/t/spider3_fixes.test3
-rw-r--r--storage/spider/mysql-test/spider/bg/t/spider3_fixes_part.test3
-rw-r--r--storage/spider/mysql-test/spider/bg/t/spider_fixes.test9
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/index.result105
-rw-r--r--storage/spider/mysql-test/spider/bugfix/r/mdev_29855.result2
-rw-r--r--storage/spider/mysql-test/spider/bugfix/t/index.test48
-rw-r--r--storage/spider/mysql-test/spider/feature/r/engine_defined_attributes.result236
-rw-r--r--storage/spider/mysql-test/spider/feature/t/engine_defined_attributes.cnf4
-rw-r--r--storage/spider/mysql-test/spider/feature/t/engine_defined_attributes.test227
-rw-r--r--storage/spider/mysql-test/spider/handler/r/ha.result20
-rw-r--r--storage/spider/mysql-test/spider/handler/r/ha_part.result25
-rw-r--r--storage/spider/mysql-test/spider/handler/r/spider3_fixes.result5
-rw-r--r--storage/spider/mysql-test/spider/handler/r/spider3_fixes_part.result5
-rw-r--r--storage/spider/mysql-test/spider/handler/r/spider_fixes.result26
-rw-r--r--storage/spider/mysql-test/spider/handler/r/spider_fixes_part.result5
-rw-r--r--storage/spider/mysql-test/spider/handler/t/spider3_fixes.test3
-rw-r--r--storage/spider/mysql-test/spider/handler/t/spider3_fixes_part.test3
-rw-r--r--storage/spider/mysql-test/spider/handler/t/spider_fixes.test12
-rw-r--r--storage/spider/mysql-test/spider/handler/t/spider_fixes_part.test3
-rw-r--r--storage/spider/mysql-test/spider/include/init_spider.inc40
-rw-r--r--storage/spider/mysql-test/spider/r/error_row_number.result45
-rw-r--r--storage/spider/mysql-test/spider/r/ha.result20
-rw-r--r--storage/spider/mysql-test/spider/r/ha_part.result25
-rw-r--r--storage/spider/mysql-test/spider/r/spider_fixes.result21
-rw-r--r--storage/spider/mysql-test/spider/r/variable_deprecation.result267
-rw-r--r--storage/spider/mysql-test/spider/t/error_row_number.test37
-rw-r--r--storage/spider/mysql-test/spider/t/spider_fixes.test9
-rw-r--r--storage/spider/mysql-test/spider/t/variable_deprecation.test161
-rw-r--r--storage/spider/spd_conn.cc772
-rw-r--r--storage/spider/spd_db_conn.cc1313
-rw-r--r--storage/spider/spd_db_conn.h6
-rw-r--r--storage/spider/spd_db_handlersocket.cc6362
-rw-r--r--storage/spider/spd_db_handlersocket.h1091
-rw-r--r--storage/spider/spd_db_include.h183
-rw-r--r--storage/spider/spd_db_mysql.cc271
-rw-r--r--storage/spider/spd_db_mysql.h76
-rw-r--r--storage/spider/spd_db_oracle.cc275
-rw-r--r--storage/spider/spd_db_oracle.h76
-rw-r--r--storage/spider/spd_direct_sql.cc242
-rw-r--r--storage/spider/spd_include.h122
-rw-r--r--storage/spider/spd_init_query.h11
-rw-r--r--storage/spider/spd_param.cc544
-rw-r--r--storage/spider/spd_param.h33
-rw-r--r--storage/spider/spd_table.cc958
-rw-r--r--storage/spider/spd_table.h9
-rw-r--r--storage/spider/spd_trx.cc288
-rw-r--r--strings/CMakeLists.txt2
-rw-r--r--strings/ctype-ascii.h189
-rw-r--r--strings/ctype-big5.c2
-rw-r--r--strings/ctype-cp932.c4
-rw-r--r--strings/ctype-euc_kr.c4
-rw-r--r--strings/ctype-eucjpms.c4
-rw-r--r--strings/ctype-gb2312.c2
-rw-r--r--strings/ctype-gbk.c2
-rw-r--r--strings/ctype-sjis.c4
-rw-r--r--strings/ctype-uca-scanner_next.inl74
-rw-r--r--strings/ctype-uca.c81
-rw-r--r--strings/ctype-uca.inl1
-rw-r--r--strings/ctype-ujis.c4
-rw-r--r--strings/ctype-utf8.c297
-rw-r--r--strings/json_lib.c10
-rw-r--r--strings/json_normalize.c852
-rw-r--r--strings/strcoll.inl96
-rw-r--r--support-files/CMakeLists.txt6
-rwxr-xr-xsupport-files/mini-benchmark.sh242
-rw-r--r--support-files/rpm/server.cnf4
-rw-r--r--tests/mysql_client_test.c90
-rw-r--r--tpool/CMakeLists.txt6
-rw-r--r--unittest/json_lib/CMakeLists.txt2
-rw-r--r--unittest/json_lib/json_normalize-t.c280
-rw-r--r--unittest/mysys/bitmap-t.c10
-rw-r--r--unittest/sql/my_json_writer-t.cc20
-rw-r--r--win/packaging/extra.wxs.in2
-rw-r--r--win/upgrade_wizard/CMakeLists.txt1
-rw-r--r--win/upgrade_wizard/upgradeDlg.cpp24
1489 files changed, 176988 insertions, 50830 deletions
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 6fe365495cc..367fa07589c 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -26,8 +26,16 @@ An amazing description should answer some questions like:
TODO: fill description here
## How can this PR be tested?
-TODO: fill steps to reproduce here, if applicable,
- or remove the section
+
+TODO: modify the automated test suite to verify that the PR causes MariaDB to
+behave as intended. Consult the documentation on
+["Writing good test cases"](https://mariadb.org/get-involved/getting-started-for-developers/writing-good-test-cases-mariadb-server).
+In many cases, this will be as simple as modifying one `.test` and one `.result`
+file in the `mysql-test/` subdirectory. Without _automated_ tests, future regressions
+in the expected behavior can't be automatically detected and verified.
+
+If the changes are not amenable to automated testing, please explain why not and
+carefully describe how to test manually.
<!--
Tick one of the following boxes [x] to help us understand
@@ -47,4 +55,3 @@ You might consider answering some questions like:
-->
## Backward compatibility
TODO: fill details here, if applicable, or remove the section
-
diff --git a/.gitignore b/.gitignore
index 5376c582985..05c65848514 100644
--- a/.gitignore
+++ b/.gitignore
@@ -106,6 +106,7 @@ packaging/rpm-oel/mysql.spec
packaging/rpm-uln/mysql.10.0.11.spec
packaging/solaris/postinstall-solaris
extra/pcre2
+extra/libfmt
plugin/auth_pam/auth_pam_tool
plugin/auth_pam/config_auth_pam.h
plugin/aws_key_management/aws-sdk-cpp
@@ -238,7 +239,6 @@ storage/perfschema/pfs_config.h
storage/rocksdb/ldb
storage/rocksdb/myrocks_hotbackup
storage/rocksdb/mysql_ldb
-storage/rocksdb/myrocks_hotbackup
storage/rocksdb/rdb_source_revision.h
storage/rocksdb/sst_dump
strings/conf_to_src
@@ -255,6 +255,7 @@ support-files/mariadb-extra.socket
support-files/mariadb@.service
support-files/mariadb@.socket
support-files/mariadb-extra@.socket
+support-files/mini-benchmark
support-files/my-huge.cnf
support-files/my-innodb-heavy-4G.cnf
support-files/my-large.cnf
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ed82104cb7b..8c2b4ae363d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -42,7 +42,7 @@ variables:
CMAKE_FLAGS: "-DWITH_SSL=system -DPLUGIN_COLUMNSTORE=NO -DPLUGIN_ROCKSDB=NO -DPLUGIN_S3=NO -DPLUGIN_MROONGA=NO -DPLUGIN_CONNECT=NO -DPLUGIN_MROONGA=NO -DPLUGIN_TOKUDB=NO -DPLUGIN_PERFSCHEMA=NO -DWITH_WSREP=OFF"
# Major version dictates which branches share the same ccache. E.g. 10.6-abc
# and 10.6-xyz will have the same cache.
- MARIADB_MAJOR_VERSION: "10.6"
+ MARIADB_MAJOR_VERSION: "10.8"
# NOTE! Currently ccache is only used on the Centos8 build. As each job has
# sufficiently different environments they are unable to benefit from each
# other's ccaches. As each build generates about 1 GB of ccache, having
@@ -331,6 +331,7 @@ mysql-test-run-asan:
needs:
- "fedora-sanitizer: [-DWITH_ASAN=YES]"
<<: *mysql-test-run-def
+ allow_failure: true
artifacts:
when: always # Also show results when tests fail
reports:
@@ -485,6 +486,37 @@ fedora upgrade:
- new-installed-database.sql
- new-upgraded-database.sql
+mini-benchmark:
+ stage: test
+ dependencies:
+ - fedora
+ needs:
+ - fedora
+ script:
+ - ls -la rpm; rm -vf rpm/*.el?.* # Delete artifacts from Centos builds
+ # Don't use cracklib, otherwise the Sysbench user password will be rejected
+ - rm -vf rpm/*cracklib*.rpm
+ # Nothing provides galera-4 on Fedora, so this step fails if built with wsrep
+ - yum install -y rpm/*.rpm
+ # Fedora does not support running services in Docker (like Debian packages do) so start it manually
+ - /usr/bin/mariadb-install-db -u mysql
+ - sudo -u mysql /usr/sbin/mariadbd & sleep 10
+ # Since we did a manual start, we also need to run upgrade manually
+ - /usr/bin/mariadb-upgrade -u root
+ - |
+ mariadb --skip-column-names -e "SELECT @@version, @@version_comment" | tee /tmp/version
+ grep $MARIADB_MAJOR_VERSION /tmp/version || echo "MariaDB didn't install properly"
+ - yum install -y sysbench procps-ng perf util-linux || yum install -y https://kojipkgs.fedoraproject.org//packages/luajit/2.0.4/3.el7/x86_64/luajit-2.0.4-3.el7.x86_64.rpm https://kojipkgs.fedoraproject.org//packages/sysbench/1.0.17/2.el7/x86_64/sysbench-1.0.17-2.el7.x86_64.rpm https://kojipkgs.fedoraproject.org//packages/ck/0.5.2/2.el7/x86_64/ck-0.5.2-2.el7.x86_64.rpm
+ - /usr/share/mysql/mini-benchmark
+ - cp -av */sysbench-run-*.log */metrics.txt .. # Move files one level down so they can be saved as artifacts
+ artifacts:
+ when: always
+ paths:
+ - sysbench-run-*.log
+ reports:
+ metrics:
+ - metrics.txt
+
# Once all RPM builds and tests have passed, also run the DEB builds and tests
# @NOTE: This is likely to work well only on salsa.debian.org as the Gitlab.com
# runners are too small for everything this stage does.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 89f679896ce..ce77fdc5f1f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -160,6 +160,7 @@ INCLUDE(readline)
INCLUDE(libutils)
INCLUDE(dtrace)
INCLUDE(pcre)
+INCLUDE(libfmt)
INCLUDE(ctest)
INCLUDE(plugin)
INCLUDE(install_macros)
@@ -378,7 +379,8 @@ ADD_DEFINITIONS(-DHAVE_CONFIG_H)
IF(_FILE_OFFSET_BITS)
ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS})
ENDIF()
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/include
+ ${CMAKE_SOURCE_DIR}/include/providers)
# Add bundled or system zlib.
MYSQL_CHECK_ZLIB_WITH_COMPRESS()
@@ -390,6 +392,7 @@ MYSQL_CHECK_READLINE()
SET(MALLOC_LIBRARY "system")
CHECK_PCRE()
+CHECK_LIBFMT()
ADD_SUBDIRECTORY(tpool)
CHECK_SYSTEMD()
diff --git a/VERSION b/VERSION
index 017d7bd5ba5..215e558a471 100644
--- a/VERSION
+++ b/VERSION
@@ -1,4 +1,4 @@
MYSQL_VERSION_MAJOR=10
-MYSQL_VERSION_MINOR=6
-MYSQL_VERSION_PATCH=13
+MYSQL_VERSION_MINOR=8
+MYSQL_VERSION_PATCH=8
SERVER_MATURITY=stable
diff --git a/client/client_priv.h b/client/client_priv.h
index 56e81ebb94f..cde3a4c51e2 100644
--- a/client/client_priv.h
+++ b/client/client_priv.h
@@ -106,6 +106,7 @@ enum options_client
OPT_SHUTDOWN_WAIT_FOR_SLAVES,
OPT_COPY_S3_TABLES,
OPT_PRINT_TABLE_METADATA,
+ OPT_ASOF_TIMESTAMP,
OPT_MAX_CLIENT_OPTION /* should be always the last */
};
diff --git a/client/mysql.cc b/client/mysql.cc
index 10f25966755..89726bcbca1 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -88,9 +88,7 @@ extern "C" {
#endif /* defined(HAVE_CURSES_H) && defined(HAVE_TERM_H) */
#undef bcmp // Fix problem with new readline
-#if defined(_WIN32)
-#include <conio.h>
-#else
+#if !defined(_WIN32)
# ifdef __APPLE__
# include <editline/readline.h>
# else
@@ -104,6 +102,98 @@ extern "C" {
#define USE_POPEN
}
+static CHARSET_INFO *charset_info= &my_charset_latin1;
+
+#if defined(_WIN32)
+/*
+ Set console mode for the whole duration of the client session.
+
+ We need for input
+ - line input (i.e read lines from console)
+ - echo typed characters
+ - "cooked" mode, i.e we do not want to handle all keystrokes,
+ like DEL etc ourselves, yet. We might want handle keystrokes
+ in the future, to implement tab completion, and better
+ (multiline) history.
+
+ Disable VT escapes for the output.We do not know what kind of escapes SELECT would return.
+*/
+struct Console_mode
+{
+ HANDLE in= GetStdHandle(STD_INPUT_HANDLE);
+ HANDLE out= GetStdHandle(STD_OUTPUT_HANDLE);
+ DWORD mode_in=0;
+ DWORD mode_out=0;
+
+ enum {STDIN_CHANGED = 1, STDOUT_CHANGED = 2};
+ int changes=0;
+
+ Console_mode()
+ {
+ if (in && in != INVALID_HANDLE_VALUE && GetConsoleMode(in, &mode_in))
+ {
+ SetConsoleMode(in, ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT|ENABLE_PROCESSED_INPUT);
+ changes |= STDIN_CHANGED;
+ }
+
+ if (out && out != INVALID_HANDLE_VALUE && GetConsoleMode(out, &mode_out))
+ {
+#ifdef ENABLE_VIRTUAL_TERMINAL_INPUT
+ SetConsoleMode(out, mode_out & ~ENABLE_VIRTUAL_TERMINAL_INPUT);
+ changes |= STDOUT_CHANGED;
+#endif
+ }
+ }
+
+ ~Console_mode()
+ {
+ if (changes & STDIN_CHANGED)
+ SetConsoleMode(in, mode_in);
+
+ if(changes & STDOUT_CHANGED)
+ SetConsoleMode(out, mode_out);
+ }
+};
+
+static Console_mode my_conmode;
+
+#define MAX_CGETS_LINE_LEN 65535
+/** Read line from console, chomp EOL*/
+static char *win_readline()
+{
+ static wchar_t wstrbuf[MAX_CGETS_LINE_LEN];
+ static char strbuf[MAX_CGETS_LINE_LEN * 4];
+
+ DWORD nchars= 0;
+ uint len= 0;
+ SetLastError(0);
+ if (!ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), wstrbuf, MAX_CGETS_LINE_LEN-1,
+ &nchars, NULL))
+ goto err;
+ if (nchars == 0 && GetLastError() == ERROR_OPERATION_ABORTED)
+ goto err;
+
+ for (;nchars > 0; nchars--)
+ {
+ if (wstrbuf[nchars - 1] != '\n' && wstrbuf[nchars - 1] != '\r')
+ break;
+ }
+
+ if (nchars > 0)
+ {
+ uint errors;
+ len= my_convert(strbuf, sizeof(strbuf), charset_info,
+ (const char *) wstrbuf, nchars * sizeof(wchar_t),
+ &my_charset_utf16le_bin, &errors);
+ }
+ strbuf[len]= 0;
+ return strbuf;
+err:
+ return NULL;
+}
+#endif
+
+
#ifdef HAVE_VIDATTR
static int have_curses= 0;
static void my_vidattr(chtype attrs)
@@ -208,7 +298,6 @@ unsigned short terminal_width= 80;
static uint opt_protocol=0;
static const char *opt_protocol_type= "";
-static CHARSET_INFO *charset_info= &my_charset_latin1;
static uint protocol_to_force= MYSQL_PROTOCOL_DEFAULT;
@@ -1353,6 +1442,46 @@ sig_handler mysql_end(int sig)
exit(status.exit_status);
}
+#ifdef _WIN32
+#define CNV_BUFSIZE 1024
+
+/**
+ Convert user,database,and password to requested charset.
+
+ This is done in the single case when user connects with non-UTF8
+ default-character-set, on UTF8 capable Windows.
+
+ User, password, and database are UTF8 encoded, prior to the function,
+ this needs to be fixed, in case they contain non-ASCIIs.
+
+ Mostly a workaround, to allow existng users with non-ASCII password
+ to survive upgrade without losing connectivity.
+*/
+static void maybe_convert_charset(const char **user, const char **password,
+ const char **database, const char *csname)
+{
+ if (GetACP() != CP_UTF8 || !strncmp(csname, "utf8", 4))
+ return;
+ static char bufs[3][CNV_BUFSIZE];
+ const char **from[]= {user, password, database};
+ CHARSET_INFO *cs= get_charset_by_csname(csname, MY_CS_PRIMARY,
+ MYF(MY_UTF8_IS_UTF8MB3 | MY_WME));
+ if (!cs)
+ return;
+ for (int i= 0; i < 3; i++)
+ {
+ const char *str= *from[i];
+ if (!str)
+ continue;
+ uint errors;
+ uint len= my_convert(bufs[i], CNV_BUFSIZE, cs, str, (uint32) strlen(str),
+ &my_charset_utf8mb4_bin, &errors);
+ bufs[i][len]= 0;
+ *from[i]= bufs[i];
+ }
+}
+#endif
+
/*
set connection-specific options and call mysql_real_connect
*/
@@ -1384,6 +1513,10 @@ static bool do_connect(MYSQL *mysql, const char *host, const char *user,
mysql_options(mysql, MYSQL_OPT_CONNECT_ATTR_RESET, 0);
mysql_options4(mysql, MYSQL_OPT_CONNECT_ATTR_ADD,
"program_name", "mysql");
+#ifdef _WIN32
+ maybe_convert_charset(&user, &password, &database,default_charset);
+#endif
+
return mysql_real_connect(mysql, host, user, password, database,
opt_mysql_port, opt_mysql_unix_port, flags);
}
@@ -2043,11 +2176,6 @@ static int get_options(int argc, char **argv)
static int read_and_execute(bool interactive)
{
-#if defined(_WIN32)
- String tmpbuf;
- String buffer;
-#endif
-
char *line= NULL;
char in_string=0;
ulong line_number=0;
@@ -2125,26 +2253,7 @@ static int read_and_execute(bool interactive)
#if defined(_WIN32)
tee_fputs(prompt, stdout);
- if (!tmpbuf.is_alloced())
- tmpbuf.alloc(65535);
- tmpbuf.length(0);
- buffer.length(0);
- size_t clen;
- do
- {
- line= my_cgets((char*)tmpbuf.ptr(), tmpbuf.alloced_length()-1, &clen);
- buffer.append(line, clen);
- /*
- if we got buffer fully filled than there is a chance that
- something else is still in console input buffer
- */
- } while (tmpbuf.alloced_length() <= clen);
- /*
- An empty line is returned from my_cgets when there's error reading :
- Ctrl-c for example
- */
- if (line)
- line= buffer.c_ptr();
+ line= win_readline();
#else
if (opt_outfile)
fputs(prompt, OUTFILE);
@@ -2211,10 +2320,7 @@ static int read_and_execute(bool interactive)
}
}
-#if defined(_WIN32)
- buffer.free();
- tmpbuf.free();
-#else
+#if !defined(_WIN32)
if (interactive)
/*
free the last entered line.
@@ -3252,6 +3358,21 @@ com_clear(String *buffer,char *line __attribute__((unused)))
return 0;
}
+static void adjust_console_codepage(const char *name __attribute__((unused)))
+{
+#ifdef _WIN32
+ if (my_set_console_cp(name) < 0)
+ {
+ char buf[128];
+ snprintf(buf, sizeof(buf),
+ "WARNING: Could not determine Windows codepage for charset '%s',"
+ "continue using codepage %u", name, GetConsoleOutputCP());
+ put_info(buf, INFO_INFO);
+ }
+#endif
+}
+
+
/* ARGSUSED */
static int
com_charset(String *buffer __attribute__((unused)), char *line)
@@ -3273,6 +3394,7 @@ com_charset(String *buffer __attribute__((unused)), char *line)
mysql_set_character_set(&mysql, charset_info->cs_name.str);
default_charset= (char *)charset_info->cs_name.str;
put_info("Charset changed", INFO_INFO);
+ adjust_console_codepage(charset_info->cs_name.str);
}
else put_info("Charset is not found", INFO_INFO);
return 0;
@@ -4818,6 +4940,7 @@ sql_real_connect(char *host,char *database,char *user,char *password,
put_info(buff, INFO_ERROR);
return 1;
}
+ adjust_console_codepage(charset_info->cs_name.str);
connected=1;
#ifndef EMBEDDED_LIBRARY
mysql_options(&mysql, MYSQL_OPT_RECONNECT, &debug_info_flag);
diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c
index f566d8b9e4f..d026c347c82 100644
--- a/client/mysql_upgrade.c
+++ b/client/mysql_upgrade.c
@@ -72,7 +72,7 @@ static char **defaults_argv;
static my_bool not_used; /* Can't use GET_BOOL without a value pointer */
-char upgrade_from_version[sizeof("10.20.456-MariaDB")+30];
+char upgrade_from_version[1024];
static my_bool opt_write_binlog;
diff --git a/client/mysqladmin.cc b/client/mysqladmin.cc
index b30cf8e8b2c..38b3be837bc 100644
--- a/client/mysqladmin.cc
+++ b/client/mysqladmin.cc
@@ -438,6 +438,7 @@ int main(int argc,char *argv[])
mysql_options(&mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
if (!strcmp(default_charset,MYSQL_AUTODETECT_CHARSET_NAME))
default_charset= (char *)my_default_csname();
+ my_set_console_cp(default_charset);
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
error_flags= (myf)(opt_nobeep ? 0 : ME_BELL);
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc
index 3f386d2b63f..fe06f9bfd72 100644
--- a/client/mysqlbinlog.cc
+++ b/client/mysqlbinlog.cc
@@ -128,6 +128,7 @@ static my_bool print_row_count_used= 0, print_row_event_positions_used= 0;
static my_bool debug_info_flag, debug_check_flag;
static my_bool force_if_open_opt= 1;
static my_bool opt_raw_mode= 0, opt_stop_never= 0;
+my_bool opt_gtid_strict_mode= true;
static ulong opt_stop_never_slave_server_id= 0;
static my_bool opt_verify_binlog_checksum= 1;
static ulonglong offset = 0;
@@ -143,10 +144,15 @@ static char *charset= 0;
static uint verbose= 0;
-static ulonglong start_position, stop_position;
+static char *start_pos_str, *stop_pos_str;
+static ulonglong start_position= BIN_LOG_HEADER_SIZE,
+ stop_position= (longlong)(~(my_off_t)0) ;
#define start_position_mot ((my_off_t)start_position)
#define stop_position_mot ((my_off_t)stop_position)
+static Binlog_gtid_state_validator *gtid_state_validator= NULL;
+static Domain_gtid_event_filter *domain_gtid_filter= NULL;
+
static char *start_datetime_str, *stop_datetime_str;
static my_time_t start_datetime= 0, stop_datetime= MY_TIME_T_MAX;
static ulonglong rec_count= 0;
@@ -954,7 +960,7 @@ static bool print_row_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
Log_event *e= NULL;
// Print the row_event from the last one to the first one
- for (uint i= events_in_stmt.elements; i > 0; --i)
+ for (size_t i= events_in_stmt.elements; i > 0; --i)
{
e= *(dynamic_element(&events_in_stmt, i - 1, Log_event**));
result= result || print_base64(print_event_info, e);
@@ -962,7 +968,7 @@ static bool print_row_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
// Copy all output into the Log_event
ev->output_buf.copy(e->output_buf);
// Delete Log_event
- for (uint i= 0; i < events_in_stmt.elements-1; ++i)
+ for (size_t i= 0; i < events_in_stmt.elements-1; ++i)
{
e= *(dynamic_element(&events_in_stmt, i, Log_event**));
delete e;
@@ -981,6 +987,10 @@ static bool print_row_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
return result;
}
+static inline my_bool is_gtid_filtering_enabled()
+{
+ return domain_gtid_filter != NULL;
+}
/**
Print the given event, and either delete it or delegate the deletion
@@ -1008,10 +1018,23 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
char ll_buff[21];
Log_event_type ev_type= ev->get_type_code();
my_bool destroy_evt= TRUE;
+ my_bool gtid_err= FALSE;
DBUG_ENTER("process_event");
Exit_status retval= OK_CONTINUE;
IO_CACHE *const head= &print_event_info->head_cache;
+ /*
+ We use Gtid_list_log_event information to determine if there is missing
+ data between where a user expects events to start/stop (i.e. the GTIDs
+ provided by --start-position and --stop-position), and the true start of
+ the specified binary logs. The first GLLE provides the initial state of the
+ binary logs.
+
+ If --start-position is provided as a file offset, we want to skip initial
+ GTID state verification
+ */
+ static my_bool was_first_glle_processed= start_position > BIN_LOG_HEADER_SIZE;
+
/* Bypass flashback settings to event */
ev->is_flashback= opt_flashback;
#ifdef WHEN_FLASHBACK_REVIEW_READY
@@ -1019,6 +1042,120 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
#endif
/*
+ Run time estimation of the output window configuration.
+
+ Do not validate GLLE information is start position is provided as a file
+ offset.
+ */
+ if (ev_type == GTID_LIST_EVENT && ev->when)
+ {
+ Gtid_list_log_event *glev= (Gtid_list_log_event *)ev;
+
+ /*
+ If this is the first Gtid_list_log_event, initialize the state of the
+ GTID stream auditor to be consistent with the binary logs provided
+ */
+ if (gtid_state_validator && !was_first_glle_processed && glev->count)
+ {
+ if (gtid_state_validator->initialize_gtid_state(stderr, glev->list,
+ glev->count))
+ goto err;
+
+ if (domain_gtid_filter && !domain_gtid_filter->get_num_start_gtids())
+ {
+ /*
+ We need to validate the GTID list from --stop-position because we
+ couldn't prove it intrinsically (i.e. using stop > start)
+ */
+ rpl_gtid *stop_gtids= domain_gtid_filter->get_stop_gtids();
+ size_t n_stop_gtids= domain_gtid_filter->get_num_stop_gtids();
+ if (gtid_state_validator->verify_stop_state(stderr, stop_gtids,
+ n_stop_gtids))
+ {
+ my_free(stop_gtids);
+ goto err;
+ }
+ my_free(stop_gtids);
+ }
+ }
+
+ /*
+ Verify that we are able to process events from this binlog. For example,
+ if our current GTID state is behind the state of the GLLE in the new log,
+ a user may have accidentally left out a log file to process.
+ */
+ if (gtid_state_validator && verbose >= 3)
+ for (size_t k= 0; k < glev->count; k++)
+ gtid_state_validator->verify_gtid_state(stderr, &(glev->list[k]));
+
+ was_first_glle_processed= TRUE;
+ }
+
+ if (ev_type == GTID_EVENT)
+ {
+ rpl_gtid ev_gtid;
+ Gtid_log_event *gle= (Gtid_log_event*) ev;
+ ev_gtid= {gle->domain_id, gle->server_id, gle->seq_no};
+
+ /*
+ If the binlog output should be filtered using GTIDs, test the new event
+ group to see if its events should be ignored.
+ */
+ if (domain_gtid_filter)
+ {
+ if (domain_gtid_filter->has_finished())
+ {
+ retval= OK_STOP;
+ goto end;
+ }
+
+ if (!domain_gtid_filter->exclude(&ev_gtid))
+ print_event_info->activate_current_event_group();
+ else
+ print_event_info->deactivate_current_event_group();
+ }
+
+ /*
+ Where we always ensure the initial binlog state is valid, we only
+ continually monitor the GTID stream for validity if we are in GTID
+ strict mode (for errors) or if three levels of verbosity is provided
+ (for warnings).
+
+ If we don't care about ensuring GTID validity, just delete the auditor
+ object to disable it for future checks.
+ */
+ if (gtid_state_validator)
+ {
+ if (!(opt_gtid_strict_mode || verbose >= 3))
+ {
+ delete gtid_state_validator;
+
+ /*
+ Explicitly reset to NULL to simplify checks on if auditing is enabled
+ i.e. if it is defined, assume we want to use it
+ */
+ gtid_state_validator= NULL;
+ }
+ else
+ {
+ gtid_err= gtid_state_validator->record(&ev_gtid);
+ if (gtid_err && opt_gtid_strict_mode)
+ {
+ gtid_state_validator->report(stderr, opt_gtid_strict_mode);
+ goto err;
+ }
+ }
+ }
+ }
+
+ /*
+ If the GTID is ignored, it shouldn't count towards offset (rec_count should
+ not be incremented)
+ */
+ if (!print_event_info->is_event_group_active())
+ goto end_skip_count;
+
+ /*
Format events are not concerned by --offset and such, we always need to
read them to be able to process the wanted events.
*/
@@ -1458,6 +1595,7 @@ err:
retval= ERROR_STOP;
end:
rec_count++;
+end_skip_count:
DBUG_PRINT("info", ("end event processing"));
/*
@@ -1658,15 +1796,22 @@ static struct my_option my_options[] =
&start_datetime_str, &start_datetime_str,
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"start-position", 'j',
- "Start reading the binlog at position N. Applies to the first binlog "
- "passed on the command line.",
- &start_position, &start_position, 0, GET_ULL,
- REQUIRED_ARG, BIN_LOG_HEADER_SIZE, BIN_LOG_HEADER_SIZE,
- /*
- COM_BINLOG_DUMP accepts only 4 bytes for the position
- so remote log reading has lower limit.
- */
- (ulonglong)(0xffffffffffffffffULL), 0, 0, 0},
+ "Start reading the binlog at this position. Type can either be a positive "
+ "integer or a GTID list. When using a positive integer, the value only "
+ "applies to the first binlog passed on the command line. In GTID mode, "
+ "multiple GTIDs can be passed as a comma separated list, where each must "
+ "have a unique domain id. The list represents the gtid binlog state that "
+ "the client (another \"replica\" server) is aware of. Therefore, each GTID "
+ "is exclusive; only events after a given sequence number will be printed to "
+ "allow users to receive events after their current state.",
+ &start_pos_str, &start_pos_str, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0,
+ 0, 0, 0},
+ {"gtid-strict-mode", 0, "Process binlog according to gtid-strict-mode "
+ "specification. The start, stop positions are verified to satisfy "
+ "start < stop comparison condition. Sequence numbers of any gtid domain "
+ "must comprise monotically growing sequence",
+ &opt_gtid_strict_mode, &opt_gtid_strict_mode, 0,
+ GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
{"stop-datetime", OPT_STOP_DATETIME,
"Stop reading the binlog at first event having a datetime equal or "
"posterior to the argument; the argument must be a date and time "
@@ -1684,11 +1829,14 @@ static struct my_option my_options[] =
&opt_stop_never_slave_server_id, &opt_stop_never_slave_server_id, 0,
GET_ULONG, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"stop-position", OPT_STOP_POSITION,
- "Stop reading the binlog at position N. Applies to the last binlog "
- "passed on the command line.",
- &stop_position, &stop_position, 0, GET_ULL,
- REQUIRED_ARG, (longlong)(~(my_off_t)0), BIN_LOG_HEADER_SIZE,
- (ulonglong)(~(my_off_t)0), 0, 0, 0},
+ "Stop reading the binlog at this position. Type can either be a positive "
+ "integer or a GTID list. When using a positive integer, the value only "
+ "applies to the last binlog passed on the command line. In GTID mode, "
+ "multiple GTIDs can be passed as a comma separated list, where each must "
+ "have a unique domain id. Each GTID is inclusive; only events up to the "
+ "given sequence numbers are printed.",
+ &stop_pos_str, &stop_pos_str, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0,
+ 0, 0},
{"table", 'T', "List entries for just this table (local log only).",
&table, &table, 0, GET_STR_ALLOC, REQUIRED_ARG,
0, 0, 0, 0, 0, 0},
@@ -1702,7 +1850,9 @@ that may lead to an endless loop.",
&user, &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0,
0, 0},
{"verbose", 'v', "Reconstruct SQL statements out of row events. "
- "-v -v adds comments on column data types.",
+ "-v -v adds comments on column data types. "
+ "-v -v -v adds diagnostic warnings about event "
+ "integrity before program exit.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
0, 0, 0, 0, 0},
@@ -1824,8 +1974,14 @@ static void cleanup()
my_free(const_cast<char*>(dirname_for_local_load));
my_free(start_datetime_str);
my_free(stop_datetime_str);
+ my_free(start_pos_str);
+ my_free(stop_pos_str);
free_root(&glob_root, MYF(0));
+ delete domain_gtid_filter;
+ if (gtid_state_validator)
+ delete gtid_state_validator;
+
delete binlog_filter;
delete glob_description_event;
if (mysql)
@@ -2075,6 +2231,110 @@ get_one_option(const struct my_option *opt, const char *argument, const char *fi
print_version();
opt_version= 1;
break;
+ case OPT_STOP_POSITION:
+ {
+ /* Stop position was already specified, so reset it and use the new list */
+ if (domain_gtid_filter && domain_gtid_filter->get_num_stop_gtids() > 0)
+ domain_gtid_filter->clear_stop_gtids();
+
+ uint32 n_stop_gtid_ranges= 0;
+ rpl_gtid *stop_gtids= gtid_parse_string_to_list(
+ stop_pos_str, strlen(stop_pos_str), &n_stop_gtid_ranges);
+ if (stop_gtids == NULL)
+ {
+ int err= 0;
+ char *end_ptr= NULL;
+ /*
+ No GTIDs specified in OPT_STOP_POSITION specification. Treat the value
+ as a singular index.
+ */
+ stop_position= my_strtoll10(stop_pos_str, &end_ptr, &err);
+
+ if (err || *end_ptr)
+ {
+ // Can't parse the position from the user
+ sql_print_error("Stop position argument value is invalid. Should be "
+ "either a positive integer or GTID.");
+ return 1;
+ }
+ }
+ else if (n_stop_gtid_ranges > 0)
+ {
+ uint32 gtid_idx;
+
+ if (domain_gtid_filter == NULL)
+ domain_gtid_filter= new Domain_gtid_event_filter();
+
+ for (gtid_idx = 0; gtid_idx < n_stop_gtid_ranges; gtid_idx++)
+ {
+ rpl_gtid *stop_gtid= &stop_gtids[gtid_idx];
+ if (domain_gtid_filter->add_stop_gtid(stop_gtid))
+ {
+ my_free(stop_gtids);
+ return 1;
+ }
+ }
+ my_free(stop_gtids);
+ }
+ else
+ {
+ DBUG_ASSERT(0);
+ }
+ break;
+ }
+ case 'j':
+ {
+ /* Start position was already specified, so reset it and use the new list */
+ if (domain_gtid_filter && domain_gtid_filter->get_num_start_gtids() > 0)
+ domain_gtid_filter->clear_start_gtids();
+
+ uint32 n_start_gtid_ranges= 0;
+ rpl_gtid *start_gtids= gtid_parse_string_to_list(
+ start_pos_str, strlen(start_pos_str), &n_start_gtid_ranges);
+
+ if (start_gtids == NULL)
+ {
+ int err= 0;
+ char *end_ptr= NULL;
+ /*
+ No GTIDs specified in OPT_START_POSITION specification. Treat the value
+ as a singular index.
+ */
+ start_position= my_strtoll10(start_pos_str, &end_ptr, &err);
+
+ if (err || *end_ptr)
+ {
+ // Can't parse the position from the user
+ sql_print_error("Start position argument value is invalid. Should be "
+ "either a positive integer or GTID.");
+ return 1;
+ }
+ }
+ else if (n_start_gtid_ranges > 0)
+ {
+ uint32 gtid_idx;
+
+ if (domain_gtid_filter == NULL)
+ domain_gtid_filter= new Domain_gtid_event_filter();
+
+ for (gtid_idx = 0; gtid_idx < n_start_gtid_ranges; gtid_idx++)
+ {
+ rpl_gtid *start_gtid= &start_gtids[gtid_idx];
+ if (start_gtid->seq_no &&
+ domain_gtid_filter->add_start_gtid(start_gtid))
+ {
+ my_free(start_gtids);
+ return 1;
+ }
+ }
+ my_free(start_gtids);
+ }
+ else
+ {
+ DBUG_ASSERT(0);
+ }
+ break;
+ }
case '?':
usage();
opt_version= 1;
@@ -2107,6 +2367,37 @@ static int parse_args(int *argc, char*** argv)
start_position);
start_position= UINT_MAX32;
}
+
+ /*
+ Always initialize the stream auditor initially because it is used to check
+ the initial state of the binary log is correct. If we don't want it later
+ (i.e. --skip-gtid-strict-mode or -vvv is not given), it is deleted when we
+ are certain the initial gtid state is set.
+ */
+ gtid_state_validator= new Binlog_gtid_state_validator();
+
+ if (domain_gtid_filter)
+ {
+ if (opt_gtid_strict_mode && domain_gtid_filter->validate_window_filters())
+ {
+ /*
+ In strict mode, if any --start/stop-position GTID ranges are invalid,
+ quit in error. Note that any specific error messages will have
+ already been written.
+ */
+ die();
+ }
+
+ /*
+ GTIDs before a start position shouldn't be validated, so we initialize
+ the stream auditor to only monitor GTIDs after these positions.
+ */
+ size_t n_start_gtids= domain_gtid_filter->get_num_start_gtids();
+ rpl_gtid *start_gtids= domain_gtid_filter->get_start_gtids();
+ gtid_state_validator->initialize_start_gtids(start_gtids, n_start_gtids);
+ my_free(start_gtids);
+ }
+
return 0;
}
@@ -2187,6 +2478,9 @@ static Exit_status dump_log_entries(const char* logname)
if (!print_event_info.init_ok())
return ERROR_STOP;
+
+ if (domain_gtid_filter)
+ print_event_info.enable_event_group_filtering();
/*
Set safe delimiter, to dump things
like CREATE PROCEDURE safely
@@ -2288,6 +2582,40 @@ static Exit_status check_master_version()
goto err;
}
+ if (domain_gtid_filter && domain_gtid_filter->get_num_start_gtids() > 0)
+ {
+ char str_buf[256];
+ String query_str(str_buf, sizeof(str_buf), system_charset_info);
+ query_str.length(0);
+ query_str.append(STRING_WITH_LEN("SET @slave_connect_state='"),
+ system_charset_info);
+
+ size_t n_start_gtids= domain_gtid_filter->get_num_start_gtids();
+ rpl_gtid *start_gtids= domain_gtid_filter->get_start_gtids();
+
+ for (size_t gtid_idx = 0; gtid_idx < n_start_gtids; gtid_idx++)
+ {
+ char buf[256];
+ rpl_gtid *start_gtid= &start_gtids[gtid_idx];
+
+ sprintf(buf, "%u-%u-%llu",
+ start_gtid->domain_id, start_gtid->server_id,
+ start_gtid->seq_no);
+ query_str.append(buf, strlen(buf));
+ if (gtid_idx < n_start_gtids - 1)
+ query_str.append(',');
+ }
+ my_free(start_gtids);
+
+ query_str.append(STRING_WITH_LEN("'"), system_charset_info);
+ if (unlikely(mysql_real_query(mysql, query_str.ptr(), query_str.length())))
+ {
+ error("Setting @slave_connect_state failed with error: %s",
+ mysql_error(mysql));
+ goto err;
+ }
+ }
+
delete glob_description_event;
glob_description_event= NULL;
@@ -3171,7 +3499,7 @@ int main(int argc, char** argv)
*/
if (opt_flashback && retval != ERROR_STOP)
{
- for (uint i= binlog_events.elements; i > 0; --i)
+ for (size_t i= binlog_events.elements; i > 0; --i)
{
LEX_STRING *event_str= dynamic_element(&binlog_events, i - 1,
LEX_STRING*);
@@ -3209,14 +3537,33 @@ int main(int argc, char** argv)
"/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n"
"/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n"
"/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n");
-
fprintf(result_file, "/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;\n");
+
+ if (is_gtid_filtering_enabled())
+ {
+ fprintf(result_file,
+ "/*!100001 SET @@SESSION.SERVER_ID=@@GLOBAL.SERVER_ID */;\n"
+ "/*!100001 SET @@SESSION.GTID_DOMAIN_ID=@@GLOBAL.GTID_DOMAIN_ID "
+ "*/;\n");
+ }
}
if (tmpdir.list)
free_tmpdir(&tmpdir);
if (result_file && result_file != stdout)
my_fclose(result_file, MYF(0));
+
+ /*
+ Ensure the GTID state is correct. If not, end in error.
+
+ Note that in gtid strict mode, we will not report here if any invalid GTIDs
+ are processed because it immediately errors (i.e. retval will be
+ ERROR_STOP)
+ */
+ if (retval != ERROR_STOP && gtid_state_validator &&
+ gtid_state_validator->report(stderr, opt_gtid_strict_mode))
+ retval= ERROR_STOP;
+
cleanup();
/* We cannot free DBUG, it is used in global destructors after exit(). */
my_end(my_end_arg | MY_DONT_FREE_DBUG);
@@ -3272,3 +3619,4 @@ struct encryption_service_st encryption_handler=
#include "sql_list.cc"
#include "rpl_filter.cc"
#include "compat56.cc"
+#include "rpl_gtid.cc"
diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c
index 07026f0080d..12804b3c667 100644
--- a/client/mysqlcheck.c
+++ b/client/mysqlcheck.c
@@ -503,6 +503,7 @@ static int get_options(int *argc, char ***argv)
printf("Unsupported character set: %s\n", default_charset);
DBUG_RETURN(1);
}
+ my_set_console_cp(default_charset);
if (*argc > 0 && opt_alldbs)
{
printf("You should give only options, no arguments at all, with option\n");
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 1d7d190a79a..d9c7df1683e 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -129,7 +129,7 @@ static my_bool verbose= 0, opt_no_create_info= 0, opt_no_data= 0, opt_no_data_m
opt_include_master_host_port= 0,
opt_events= 0, opt_comments_used= 0,
opt_alltspcs=0, opt_notspcs= 0, opt_logging,
- opt_drop_trigger= 0 ;
+ opt_drop_trigger= 0;
#define OPT_SYSTEM_ALL 1
#define OPT_SYSTEM_USERS 2
#define OPT_SYSTEM_PLUGINS 4
@@ -156,7 +156,7 @@ static char *opt_password=0,*current_user=0,
*lines_terminated=0, *enclosed=0, *opt_enclosed=0, *escaped=0,
*where=0, *order_by=0,
*err_ptr= 0,
- *log_error_file= NULL;
+ *log_error_file= NULL, *opt_asof_timestamp= NULL;
static const char *opt_compatible_mode_str= 0;
static char **defaults_argv= 0;
static char compatible_mode_normal_str[255];
@@ -280,6 +280,11 @@ static struct my_option my_long_options[] =
"Adds 'STOP SLAVE' prior to 'CHANGE MASTER' and 'START SLAVE' to bottom of dump.",
&opt_slave_apply, &opt_slave_apply, 0, GET_BOOL, NO_ARG,
0, 0, 0, 0, 0, 0},
+ {"as-of", OPT_ASOF_TIMESTAMP,
+ "Dump system versioned table(s) as of specified timestamp. "
+ "Argument is interpreted according to the --tz-utc setting. "
+ "Table structures are always dumped as of current timestamp.",
+ &opt_asof_timestamp, &opt_asof_timestamp, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"character-sets-dir", OPT_CHARSETS_DIR,
"Directory for character set files.", (char **)&charsets_dir,
(char **)&charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
@@ -580,7 +585,8 @@ static struct my_option my_long_options[] =
&opt_dump_triggers, &opt_dump_triggers, 0, GET_BOOL,
NO_ARG, 1, 0, 0, 0, 0, 0},
{"tz-utc", OPT_TZ_UTC,
- "SET TIME_ZONE='+00:00' at top of dump to allow dumping of TIMESTAMP data when a server has data in different time zones or data is being moved between servers with different time zones.",
+ "Set connection time zone to UTC before commencing the dump and add "
+ "SET TIME_ZONE=´+00:00´ to the top of the dump file.",
&opt_tz_utc, &opt_tz_utc, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
#ifndef DONT_ALLOW_USER_CHANGE
{"user", 'u', "User for login if not current user.",
@@ -1331,6 +1337,12 @@ static int get_options(int *argc, char ***argv)
my_progname_short);
return(EX_USAGE);
}
+ if (opt_asof_timestamp && strchr(opt_asof_timestamp, '\''))
+ {
+ fprintf(stderr, "%s: Incorrect DATETIME value: '%s'\n",
+ my_progname_short, opt_asof_timestamp);
+ return(EX_USAGE);
+ }
if (strcmp(default_charset, MYSQL_AUTODETECT_CHARSET_NAME) &&
!(charset_info= get_charset_by_csname(default_charset,
MY_CS_PRIMARY,
@@ -3045,7 +3057,7 @@ static void get_sequence_structure(const char *seq, const char *db)
*/
static uint get_table_structure(const char *table, const char *db, char *table_type,
- char *ignore_flag)
+ char *ignore_flag, my_bool *versioned)
{
my_bool init=0, delayed, write_data, complete_insert;
my_ulonglong num_fields;
@@ -3112,6 +3124,26 @@ static uint get_table_structure(const char *table, const char *db, char *table_t
verbose_msg("-- Retrieving table structure for table %s...\n", table);
+ if (versioned)
+ {
+ if (!opt_asof_timestamp)
+ versioned= NULL;
+ else
+ {
+ my_snprintf(query_buff, sizeof(query_buff), "select 1 from"
+ " information_schema.tables where table_schema=database()"
+ " and table_name=%s and table_type='SYSTEM VERSIONED'",
+ quote_for_equal(table, table_buff));
+ if (!mysql_query_with_error_report(mysql, &result, query_buff))
+ {
+ *versioned= result->row_count > 0;
+ mysql_free_result(result);
+ }
+ else
+ *versioned= 0;
+ }
+ }
+
len= my_snprintf(query_buff, sizeof(query_buff),
"SET SQL_QUOTE_SHOW_CREATE=%d",
(opt_quoted || opt_keywords));
@@ -3367,9 +3399,10 @@ static uint get_table_structure(const char *table, const char *db, char *table_t
}
else
{
- dynstr_append_checked(&insert_pat, " VALUES ");
- if (!extended_insert)
- dynstr_append_checked(&insert_pat, "(");
+ if (extended_insert)
+ dynstr_append_checked(&insert_pat, " VALUES\n");
+ else
+ dynstr_append_checked(&insert_pat, " VALUES (");
}
}
@@ -3975,6 +4008,15 @@ static char *alloc_query_str(size_t size)
}
+static void vers_append_system_time(DYNAMIC_STRING* query_string)
+{
+ DBUG_ASSERT(opt_asof_timestamp);
+ dynstr_append_checked(query_string, " FOR SYSTEM_TIME AS OF TIMESTAMP '");
+ dynstr_append_checked(query_string, opt_asof_timestamp);
+ dynstr_append_checked(query_string, "'");
+}
+
+
/*
SYNOPSIS
@@ -4002,6 +4044,7 @@ static void dump_table(const char *table, const char *db, const uchar *hash_key,
ulong rownr, row_break;
uint num_fields;
size_t total_length, init_length;
+ my_bool versioned= 0;
MYSQL_RES *res;
MYSQL_FIELD *field;
@@ -4012,7 +4055,7 @@ static void dump_table(const char *table, const char *db, const uchar *hash_key,
Make sure you get the create table info before the following check for
--no-data flag below. Otherwise, the create table info won't be printed.
*/
- num_fields= get_table_structure(table, db, table_type, &ignore_flag);
+ num_fields= get_table_structure(table, db, table_type, &ignore_flag, &versioned);
/*
The "table" could be a view. If so, we don't do anything here.
@@ -4119,6 +4162,8 @@ static void dump_table(const char *table, const char *db, const uchar *hash_key,
dynstr_append_checked(&query_string, " FROM ");
dynstr_append_checked(&query_string, result_table);
+ if (versioned)
+ vers_append_system_time(&query_string);
if (where)
{
@@ -4151,6 +4196,8 @@ static void dump_table(const char *table, const char *db, const uchar *hash_key,
dynstr_append_checked(&query_string, select_field_names.str);
dynstr_append_checked(&query_string, " FROM ");
dynstr_append_checked(&query_string, result_table);
+ if (versioned)
+ vers_append_system_time(&query_string);
if (where)
{
@@ -4428,7 +4475,7 @@ static void dump_table(const char *table, const char *db, const uchar *hash_key,
if (total_length + row_length < opt_net_buffer_length)
{
total_length+= row_length;
- fputc(',',md_result_file); /* Always row break */
+ fputs(",\n",md_result_file); /* Always row break */
fputs(extended_row.str,md_result_file);
}
else
@@ -5396,11 +5443,11 @@ static void dump_first_mysql_tables(char *database)
DBUG_ENTER("dump_first_mysql_tables");
if (!get_table_structure((char *) "general_log",
- database, table_type, &ignore_flag) )
+ database, table_type, &ignore_flag, NULL) )
verbose_msg("-- Warning: get_table_structure() failed with some internal "
"error for 'general_log' table\n");
if (!get_table_structure((char *) "slow_log",
- database, table_type, &ignore_flag) )
+ database, table_type, &ignore_flag, NULL) )
verbose_msg("-- Warning: get_table_structure() failed with some internal "
"error for 'slow_log' table\n");
/* general and slow query logs exist now */
@@ -5660,7 +5707,7 @@ static int dump_all_tables_in_db(char *database)
char table_type[NAME_LEN];
char ignore_flag;
if (!get_table_structure((char *) "transaction_registry",
- database, table_type, &ignore_flag) )
+ database, table_type, &ignore_flag, NULL) )
verbose_msg("-- Warning: get_table_structure() failed with some internal "
"error for 'transaction_registry' table\n");
}
diff --git a/client/mysqlimport.c b/client/mysqlimport.c
index 185cf69b9b6..9d30fd989ca 100644
--- a/client/mysqlimport.c
+++ b/client/mysqlimport.c
@@ -521,6 +521,7 @@ static MYSQL *db_connect(char *host, char *database,
mysql_options(mysql, MYSQL_DEFAULT_AUTH, opt_default_auth);
if (!strcmp(default_charset,MYSQL_AUTODETECT_CHARSET_NAME))
default_charset= (char *)my_default_csname();
+ my_set_console_cp(default_charset);
mysql_options(mysql, MYSQL_SET_CHARSET_NAME, my_default_csname());
mysql_options(mysql, MYSQL_OPT_CONNECT_ATTR_RESET, 0);
mysql_options4(mysql, MYSQL_OPT_CONNECT_ATTR_ADD,
diff --git a/client/mysqlshow.c b/client/mysqlshow.c
index 23bafa3ccea..6bc4e3978bb 100644
--- a/client/mysqlshow.c
+++ b/client/mysqlshow.c
@@ -147,6 +147,7 @@ int main(int argc, char **argv)
if (!strcmp(default_charset,MYSQL_AUTODETECT_CHARSET_NAME))
default_charset= (char *)my_default_csname();
+ my_set_console_cp(default_charset);
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
if (opt_plugin_dir && *opt_plugin_dir)
diff --git a/client/mysqltest.cc b/client/mysqltest.cc
index 0f553cab3f3..cb5a20c4c0f 100644
--- a/client/mysqltest.cc
+++ b/client/mysqltest.cc
@@ -3294,6 +3294,47 @@ static int replace(DYNAMIC_STRING *ds_str,
return 0;
}
+#ifdef _WIN32
+/**
+ Check if background execution of command was requested.
+ Like in Unix shell, we assume background execution of the last
+ character in command is a ampersand (we do not tokenize though)
+*/
+static bool is_background_command(const DYNAMIC_STRING *ds)
+{
+ for (size_t i= ds->length - 1; i > 1; i--)
+ {
+ char c= ds->str[i];
+ if (!isspace(c))
+ return (c == '&');
+ }
+ return false;
+}
+
+/**
+ Execute OS command in background. We assume that the last character
+ is ampersand, i.e is_background_command() returned
+*/
+#include <string>
+static int execute_in_background(char *cmd)
+{
+ STARTUPINFO s{};
+ PROCESS_INFORMATION pi{};
+ char *end= strrchr(cmd, '&');
+ DBUG_ASSERT(end);
+ *end =0;
+ std::string scmd("cmd /c ");
+ scmd.append(cmd);
+ BOOL ok=
+ CreateProcess(0, (char *)scmd.c_str(), 0, 0, 0, CREATE_NO_WINDOW, 0, 0, &s, &pi);
+ *end= '&';
+ if (!ok)
+ return (int) GetLastError();
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ return 0;
+}
+#endif
/*
Execute given command.
@@ -3368,6 +3409,14 @@ void do_exec(struct st_command *command)
DBUG_PRINT("info", ("Executing '%s' as '%s'",
command->first_argument, ds_cmd.str));
+#ifdef _WIN32
+ if (is_background_command(&ds_cmd))
+ {
+ error= execute_in_background(ds_cmd.str);
+ goto end;
+ }
+#endif
+
if (!(res_file= my_popen(ds_cmd.str, "r")))
{
dynstr_free(&ds_cmd);
@@ -3394,7 +3443,9 @@ void do_exec(struct st_command *command)
dynstr_append_sorted(&ds_res, &ds_sorted, 0);
dynstr_free(&ds_sorted);
}
-
+#ifdef _WIN32
+end:
+#endif
if (error)
{
uint status= WEXITSTATUS(error);
@@ -3689,8 +3740,7 @@ void do_remove_file(struct st_command *command)
void do_remove_files_wildcard(struct st_command *command)
{
int error= 0, sys_errno= 0;
- uint i;
- size_t directory_length;
+ size_t i, directory_length;
MY_DIR *dir_info;
FILEINFO *file;
char dir_separator[2];
@@ -3729,7 +3779,7 @@ void do_remove_files_wildcard(struct st_command *command)
/* Set default wild chars for wild_compare, is changed in embedded mode */
set_wild_chars(1);
- for (i= 0; i < (uint) dir_info->number_of_files; i++)
+ for (i= 0; i < dir_info->number_of_files; i++)
{
file= dir_info->dir_entry + i;
/* Remove only regular files, i.e. no directories etc. */
@@ -4003,7 +4053,7 @@ void do_rmdir(struct st_command *command)
static int get_list_files(DYNAMIC_STRING *ds, const DYNAMIC_STRING *ds_dirname,
const DYNAMIC_STRING *ds_wild)
{
- uint i;
+ size_t i;
MY_DIR *dir_info;
FILEINFO *file;
DBUG_ENTER("get_list_files");
@@ -4012,7 +4062,7 @@ static int get_list_files(DYNAMIC_STRING *ds, const DYNAMIC_STRING *ds_dirname,
if (!(dir_info= my_dir(ds_dirname->str, MYF(MY_WANT_SORT))))
DBUG_RETURN(1);
set_wild_chars(1);
- for (i= 0; i < (uint) dir_info->number_of_files; i++)
+ for (i= 0; i < dir_info->number_of_files; i++)
{
file= dir_info->dir_entry + i;
if (ds_wild && ds_wild->length &&
diff --git a/cmake/FindLIBAIO.cmake b/cmake/FindLIBAIO.cmake
index db49439f318..3a4205f7a45 100644
--- a/cmake/FindLIBAIO.cmake
+++ b/cmake/FindLIBAIO.cmake
@@ -1,7 +1,7 @@
-find_path(LIBAIO_INCLUDE_DIR NAMES libaio.h)
+find_path(LIBAIO_INCLUDE_DIRS NAMES libaio.h)
find_library(LIBAIO_LIBRARIES NAMES aio)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(
LIBAIO DEFAULT_MSG
- LIBAIO_LIBRARIES LIBAIO_INCLUDE_DIR)
+ LIBAIO_LIBRARIES LIBAIO_INCLUDE_DIRS)
diff --git a/cmake/FindLZ4.cmake b/cmake/FindLZ4.cmake
index 46c1fdc1b9f..eebd85969e3 100644
--- a/cmake/FindLZ4.cmake
+++ b/cmake/FindLZ4.cmake
@@ -1,9 +1,17 @@
-find_path(LZ4_INCLUDE_DIR NAMES lz4.h)
+find_path(LZ4_INCLUDE_DIRS NAMES lz4.h)
find_library(LZ4_LIBRARIES NAMES lz4)
+if(LZ4_INCLUDE_DIRS AND EXISTS "${LZ4_INCLUDE_DIRS}/lz4.h")
+ file(STRINGS "${LZ4_INCLUDE_DIRS}/lz4.h" LZ4_H REGEX "^#define LZ4_VERSION_[MR]")
+ string(REGEX REPLACE "LZ4_VERSION" "" LZ4_H "${LZ4_H}")
+ string(REGEX MATCHALL "[0-9]+" LZ4_H "${LZ4_H}")
+ string(REGEX REPLACE ";" "." LZ4_VERSION_STRING "${LZ4_H}")
+endif()
+
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(
- LZ4 DEFAULT_MSG
- LZ4_LIBRARIES LZ4_INCLUDE_DIR)
+ LZ4
+ REQUIRED_VARS LZ4_LIBRARIES LZ4_INCLUDE_DIRS
+ VERSION_VAR LZ4_VERSION_STRING)
-mark_as_advanced(LZ4_INCLUDE_DIR LZ4_LIBRARIES)
+mark_as_advanced(LZ4_INCLUDE_DIRS LZ4_LIBRARIES)
diff --git a/cmake/FindLZO.cmake b/cmake/FindLZO.cmake
new file mode 100644
index 00000000000..04391bb4720
--- /dev/null
+++ b/cmake/FindLZO.cmake
@@ -0,0 +1,9 @@
+find_path(LZO_INCLUDE_DIRS NAMES lzo/lzo1x.h)
+find_library(LZO_LIBRARIES NAMES lzo2)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(
+ LZO DEFAULT_MSG
+ LZO_LIBRARIES LZO_INCLUDE_DIRS)
+
+mark_as_advanced(LZO_INCLUDE_DIRS LZO_LIBRARIES)
diff --git a/cmake/FindPMEM.cmake b/cmake/FindPMEM.cmake
index 73e71bc29f4..024436444d2 100644
--- a/cmake/FindPMEM.cmake
+++ b/cmake/FindPMEM.cmake
@@ -7,12 +7,12 @@ if(DEFINED PMEM_LIBRARIES)
return()
endif()
-find_path(PMEM_INCLUDE_DIR NAMES libpmem.h)
+find_path(PMEM_INCLUDE_DIRS NAMES libpmem.h)
find_library(PMEM_LIBRARIES NAMES pmem)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(
PMEM DEFAULT_MSG
- PMEM_LIBRARIES PMEM_INCLUDE_DIR)
+ PMEM_LIBRARIES PMEM_INCLUDE_DIRS)
-mark_as_advanced(PMEM_INCLUDE_DIR PMEM_LIBRARIES)
+mark_as_advanced(PMEM_INCLUDE_DIRS PMEM_LIBRARIES)
diff --git a/cmake/FindSnappy.cmake b/cmake/FindSnappy.cmake
new file mode 100644
index 00000000000..1e99eb65a50
--- /dev/null
+++ b/cmake/FindSnappy.cmake
@@ -0,0 +1,9 @@
+find_path(SNAPPY_INCLUDE_DIRS NAMES snappy.h)
+find_library(SNAPPY_LIBRARIES NAMES snappy)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(
+ Snappy DEFAULT_MSG
+ SNAPPY_LIBRARIES SNAPPY_INCLUDE_DIRS)
+
+mark_as_advanced(SNAPPY_INCLUDE_DIRS SNAPPY_LIBRARIES)
diff --git a/cmake/FindURING.cmake b/cmake/FindURING.cmake
index 6e5e0783b46..b8141c9d480 100644
--- a/cmake/FindURING.cmake
+++ b/cmake/FindURING.cmake
@@ -1,9 +1,9 @@
-find_path(URING_INCLUDE_DIR NAMES liburing.h)
+find_path(URING_INCLUDE_DIRS NAMES liburing.h)
find_library(URING_LIBRARIES NAMES uring)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(
URING DEFAULT_MSG
- URING_LIBRARIES URING_INCLUDE_DIR)
+ URING_LIBRARIES URING_INCLUDE_DIRS)
-mark_as_advanced(URING_INCLUDE_DIR URING_LIBRARIES)
+mark_as_advanced(URING_INCLUDE_DIRS URING_LIBRARIES)
diff --git a/cmake/FindZSTD.cmake b/cmake/FindZSTD.cmake
index ede59010742..d03e96fca15 100644
--- a/cmake/FindZSTD.cmake
+++ b/cmake/FindZSTD.cmake
@@ -1,11 +1,11 @@
# - Find zstd
# Find the zstd compression library and includes
#
-# ZSTD_INCLUDE_DIR - where to find zstd.h, etc.
+# ZSTD_INCLUDE_DIRS - where to find zstd.h, etc.
# ZSTD_LIBRARIES - List of libraries when using zstd.
# ZSTD_FOUND - True if zstd found.
-find_path(ZSTD_INCLUDE_DIR
+find_path(ZSTD_INCLUDE_DIRS
NAMES zstd.h
HINTS ${ZSTD_ROOT_DIR}/include)
@@ -14,8 +14,8 @@ find_library(ZSTD_LIBRARIES
HINTS ${ZSTD_ROOT_DIR}/lib)
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(ZSTD DEFAULT_MSG ZSTD_LIBRARIES ZSTD_INCLUDE_DIR)
+find_package_handle_standard_args(ZSTD DEFAULT_MSG ZSTD_LIBRARIES ZSTD_INCLUDE_DIRS)
mark_as_advanced(
ZSTD_LIBRARIES
- ZSTD_INCLUDE_DIR)
+ ZSTD_INCLUDE_DIRS)
diff --git a/cmake/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake
index 3f1e4aca2cb..961db1b13b0 100644
--- a/cmake/build_configurations/mysql_release.cmake
+++ b/cmake/build_configurations/mysql_release.cmake
@@ -108,14 +108,10 @@ ELSEIF(RPM)
SET(WITH_PCRE system CACHE STRING "")
SET(CLIENT_PLUGIN_ZSTD OFF)
IF(RPM MATCHES "fedora|centos|rhel|rocky|alma")
- SET(WITH_INNODB_BZIP2 OFF CACHE STRING "")
- SET(WITH_INNODB_LZO OFF CACHE STRING "")
SET(WITH_ROCKSDB_BZip2 OFF CACHE STRING "")
ENDIF()
IF(RPM MATCHES "opensuse|sles|centos|rhel|rocky|alma")
- SET(WITH_INNODB_LZ4 OFF CACHE STRING "")
SET(WITH_ROCKSDB_LZ4 OFF CACHE STRING "")
- SET(GRN_WITH_LZ4 no CACHE STRING "")
ENDIF()
ELSEIF(DEB)
SET(WITH_SSL system CACHE STRING "")
@@ -126,9 +122,6 @@ ELSEIF(DEB)
SET(WITH_EMBEDDED_SERVER ON CACHE BOOL "")
SET(WITH_PCRE system CACHE STRING "")
SET(CLIENT_PLUGIN_ZSTD OFF)
- SET(WITH_INNODB_BZIP2 OFF CACHE STRING "")
- SET(WITH_INNODB_LZMA OFF CACHE STRING "")
- SET(WITH_INNODB_LZO OFF CACHE STRING "")
SET(WITH_ROCKSDB_BZip2 OFF CACHE STRING "")
ELSE()
SET(WITH_SSL bundled CACHE STRING "")
@@ -137,12 +130,8 @@ ELSE()
SET(WITH_JEMALLOC static CACHE STRING "")
SET(PLUGIN_AUTH_SOCKET STATIC CACHE STRING "")
SET(WITH_STRIPPED_CLIENT ON CACHE BOOL "Strip all client binaries")
- SET(WITH_INNODB_BZIP2 OFF CACHE STRING "")
- SET(WITH_INNODB_LZ4 OFF CACHE STRING "")
- SET(WITH_INNODB_LZO OFF CACHE STRING "")
SET(WITH_ROCKSDB_BZip2 OFF CACHE STRING "")
SET(WITH_ROCKSDB_LZ4 OFF CACHE STRING "")
- SET(GRN_WITH_LZ4 no CACHE STRING "")
ENDIF()
IF(NOT COMPILATION_COMMENT)
diff --git a/cmake/libfmt.cmake b/cmake/libfmt.cmake
new file mode 100644
index 00000000000..7eaa0dfa012
--- /dev/null
+++ b/cmake/libfmt.cmake
@@ -0,0 +1,53 @@
+INCLUDE (CheckCXXSourceCompiles)
+INCLUDE (ExternalProject)
+
+SET(WITH_LIBFMT "auto" CACHE STRING
+ "Which libfmt to use (possible values are 'bundled', 'system', or 'auto')")
+
+MACRO(BUNDLE_LIBFMT)
+ SET(dir "${CMAKE_BINARY_DIR}/extra/libfmt")
+ SET(LIBFMT_INCLUDE_DIR "${dir}/src/libfmt/include")
+
+ IF(CMAKE_VERSION VERSION_GREATER "3.0")
+ SET(fmt_byproducts BUILD_BYPRODUCTS ${LIBFMT_INCLUDE_DIR}/fmt/format-inl.h)
+ ENDIF()
+
+ ExternalProject_Add(
+ libfmt
+ PREFIX "${dir}"
+ URL "https://github.com/fmtlib/fmt/archive/refs/tags/8.0.1.zip"
+ URL_MD5 e77873199e897ca9f780479ad68e25b1
+ INSTALL_COMMAND ""
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ""
+ ${fmt_byproducts}
+ )
+ENDMACRO()
+
+MACRO (CHECK_LIBFMT)
+ IF(WITH_LIBFMT STREQUAL "system" OR WITH_LIBFMT STREQUAL "auto")
+ SET(CMAKE_REQUIRED_INCLUDES ${LIBFMT_INCLUDE_DIR})
+ CHECK_CXX_SOURCE_COMPILES(
+ "#define FMT_STATIC_THOUSANDS_SEPARATOR ','
+ #define FMT_HEADER_ONLY 1
+ #include <fmt/format-inl.h>
+ #include <iostream>
+ int main() {
+ fmt::format_args::format_arg arg=
+ fmt::detail::make_arg<fmt::format_context>(42);
+ std::cout << fmt::vformat(\"The answer is {}.\",
+ fmt::format_args(&arg, 1));
+ }" HAVE_SYSTEM_LIBFMT)
+ SET(CMAKE_REQUIRED_INCLUDES)
+ ENDIF()
+ IF(NOT HAVE_SYSTEM_LIBFMT OR WITH_LIBFMT STREQUAL "bundled")
+ IF (WITH_LIBFMT STREQUAL "system")
+ MESSAGE(FATAL_ERROR "system libfmt library is not found or unusable")
+ ENDIF()
+ BUNDLE_LIBFMT()
+ ELSE()
+ FIND_FILE(Libfmt_core_h fmt/core.h) # for build_depends.cmake
+ ENDIF()
+ENDMACRO()
+
+MARK_AS_ADVANCED(LIBFMT_INCLUDE_DIR)
diff --git a/cmake/maintainer.cmake b/cmake/maintainer.cmake
index 179308a76f6..dfc725c36b9 100644
--- a/cmake/maintainer.cmake
+++ b/cmake/maintainer.cmake
@@ -48,6 +48,7 @@ SET(MY_ERROR_FLAGS -Werror)
IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "6.0.0")
SET(MY_ERROR_FLAGS ${MY_ERROR_FLAGS} -Wno-error=maybe-uninitialized)
+ SET(MY_ERROR_FLAGS ${MY_ERROR_FLAGS} -Wno-error=non-virtual-dtor) # gcc bug 7302
ENDIF()
IF(MYSQL_MAINTAINER_MODE MATCHES "OFF|WARN")
diff --git a/cmake/os/Windows.cmake b/cmake/os/Windows.cmake
index 24eb7809f01..f951eed7651 100644
--- a/cmake/os/Windows.cmake
+++ b/cmake/os/Windows.cmake
@@ -60,8 +60,8 @@ ENDIF()
ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE)
ADD_DEFINITIONS(-D_WIN32_WINNT=0x0A00)
-# We do not want the windows.h macros min/max
-ADD_DEFINITIONS(-DNOMINMAX)
+# We do not want the windows.h , or winsvc.h macros min/max
+ADD_DEFINITIONS(-DNOMINMAX -DNOSERVICE)
# Speed up build process excluding unused header files
ADD_DEFINITIONS(-DWIN32_LEAN_AND_MEAN)
diff --git a/cmake/win_compatibility.manifest b/cmake/win_compatibility.manifest
index 2e4b27a6dc4..0e7ce667d68 100644
--- a/cmake/win_compatibility.manifest
+++ b/cmake/win_compatibility.manifest
@@ -19,4 +19,9 @@
</application>
</compatibility>
+ <application>
+ <windowsSettings>
+ <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
+ </windowsSettings>
+ </application>
</asmv1:assembly>
diff --git a/config.h.cmake b/config.h.cmake
index df240380471..e8712d16ba6 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -183,6 +183,7 @@
#cmakedefine HAVE_MLOCKALL 1
#cmakedefine HAVE_MMAP 1
#cmakedefine HAVE_MMAP64 1
+#cmakedefine HAVE_MPROTECT 1
#cmakedefine HAVE_PERROR 1
#cmakedefine HAVE_POLL 1
#cmakedefine HAVE_POSIX_FALLOCATE 1
diff --git a/configure.cmake b/configure.cmake
index faff9f40115..b13d527742b 100644
--- a/configure.cmake
+++ b/configure.cmake
@@ -377,6 +377,7 @@ CHECK_FUNCTION_EXISTS (mlock HAVE_MLOCK)
CHECK_FUNCTION_EXISTS (mlockall HAVE_MLOCKALL)
CHECK_FUNCTION_EXISTS (mmap HAVE_MMAP)
CHECK_FUNCTION_EXISTS (mmap64 HAVE_MMAP64)
+CHECK_FUNCTION_EXISTS (mprotect HAVE_MPROTECT)
CHECK_FUNCTION_EXISTS (perror HAVE_PERROR)
CHECK_FUNCTION_EXISTS (poll HAVE_POLL)
CHECK_FUNCTION_EXISTS (posix_fallocate HAVE_POSIX_FALLOCATE)
diff --git a/dbug/tests-t.pl b/dbug/tests-t.pl
index 4803627eda2..22526a7bc61 100755
--- a/dbug/tests-t.pl
+++ b/dbug/tests-t.pl
@@ -44,12 +44,10 @@ __DATA__
% ./tests -#d
func2: info: s=ok
=> execute
-=> evaluate: ON
=> evaluate_if: OFF
main: explain: dbug explained: d
func2: info: s=ok
% ./tests d,ret3
-=> evaluate: OFF
=> evaluate_if: OFF
#
## Testing negative lists
@@ -57,7 +55,6 @@ func2: info: s=ok
% ./tests d:-d,ret3
func2: info: s=ko
=> execute
-=> evaluate: ON
=> evaluate_if: OFF
main: explain: dbug explained: d:-d,ret3
func2: info: s=ko
@@ -69,7 +66,6 @@ func2: info: s=ko
| | | <func3
| | <func2
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
| >func2
| | >func3
@@ -85,7 +81,6 @@ func2: info: s=ko
| | | info: s=ko
| | <func2
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
| >func2
| | >func3
@@ -99,19 +94,15 @@ func2: info: s=ko
| | | >func3
| | | <func3
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
| | >func3
| | <func3
<main
% ./tests t:d,info:-d,ret3:-f,func2 d,evaluate
-=> evaluate: ON
=> evaluate_if: OFF
% ./tests t:d,info:-d,ret3:-f,func2 d,evaluate_if
-=> evaluate: OFF
=> evaluate_if: ON
% ./tests t:d:-d,ret3:-f,func2 d,evaluate_if
-=> evaluate: OFF
=> evaluate_if: ON
% ./tests t:d:-d,ret3:-f,func2
>main
@@ -120,7 +111,6 @@ func2: info: s=ko
| | | <func3
| <func1
=> execute
-=> evaluate: ON
=> evaluate_if: OFF
| explain: dbug explained: d:-d,ret3:f:-f,func2:t
| | >func3
@@ -135,7 +125,6 @@ func2: info: s=ko
| | | >func3
| | | <func3
| <func1
-=> evaluate: OFF
=> evaluate_if: ON
| | >func3
| | <func3
@@ -152,7 +141,6 @@ func2: info: s=ko
| dump: Memory: 0x#### Bytes: (27)
64 2C 64 75 6D 70 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D 66 2C 66 75 6E 63 32 3A
74
-=> evaluate: OFF
=> evaluate_if: OFF
| | >func3
| | <func3
@@ -166,7 +154,6 @@ func2: info: s=ko
| dump: Memory: 0x#### Bytes: (27)
64 2C 64 75 6D 70 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D 66 2C 66 75 6E 63 32 3A
74
-=> evaluate: OFF
=> evaluate_if: OFF
| | >func3
| | <func3
@@ -180,7 +167,6 @@ func2: info: s=ko
| dump: Memory: 0x#### Bytes: (27)
64 2C 64 75 6D 70 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D 66 2C 66 75 6E 63 32 3A
74
-=> evaluate: OFF
=> evaluate_if: OFF
| | >func3
| | <func3
@@ -194,7 +180,6 @@ func2: info: s=ko
| dump: Memory: 0x#### Bytes: (35)
64 2C 64 75 6D 70 2C 65 78 70 6C 61 69 6E 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D
66 2C 66 75 6E 63 32 3A 74
-=> evaluate: OFF
=> evaluate_if: OFF
| explain: dbug explained: d,dump,explain:-d,ret3:f:-f,func2:t
| | >func3
@@ -209,7 +194,6 @@ dbug-tests: | <func1
dbug-tests: | dump: Memory: 0x#### Bytes: (37)
64 2C 64 75 6D 70 2C 65 78 70 6C 61 69 6E 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D
66 2C 66 75 6E 63 32 3A 50 3A 74
-=> evaluate: OFF
=> evaluate_if: OFF
dbug-tests: | explain: dbug explained: d,dump,explain:-d,ret3:f:-f,func2:P:t
dbug-tests: | | >func3
@@ -224,7 +208,6 @@ dbug-tests: tests.c: | <func1
dbug-tests: tests.c: | dump: Memory: 0x#### Bytes: (39)
64 2C 64 75 6D 70 2C 65 78 70 6C 61 69 6E 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D
66 2C 66 75 6E 63 32 3A 46 3A 50 3A 74
-=> evaluate: OFF
=> evaluate_if: OFF
dbug-tests: tests.c: | explain: dbug explained: d,dump,explain:-d,ret3:f:-f,func2:F:P:t
dbug-tests: tests.c: | | >func3
@@ -240,7 +223,6 @@ dbug-tests: tests.c: <main
| | | <func3
| <func1
=> execute
-=> evaluate: ON
=> evaluate_if: OFF
| explain: dbug explained: d:-d,ret3:f:-f,func2:t
| | >func3
@@ -256,7 +238,6 @@ dbug-tests: tests.c: <main
| | <func2
| <func1
=> execute
-=> evaluate: ON
=> evaluate_if: OFF
| explain: dbug explained: d:-d,ret3:t
| >func2
@@ -267,7 +248,6 @@ dbug-tests: tests.c: <main
<main
% ./tests d,info:-d,ret3:d,push
func2: info: s=ko
-=> evaluate: OFF
=> evaluate_if: OFF
| >func2
| | >func3
@@ -277,7 +257,6 @@ func2: info: s=ko
<main
% ./tests d,info:-d,ret3:d,push,explain
func2: info: s=ko
-=> evaluate: OFF
=> evaluate_if: OFF
| explain: dbug explained: d,info,push,explain:-d,ret3:t
| >func2
@@ -288,13 +267,11 @@ func2: info: s=ko
<main
% ./tests d,info:-d,ret3:d,explain
func2: info: s=ko
-=> evaluate: OFF
=> evaluate_if: OFF
main: explain: dbug explained: d,info,explain:-d,ret3
func2: info: s=ko
% ./tests d,info:-d,ret3:d,explain,pop
func2: info: s=ko
-=> evaluate: OFF
=> evaluate_if: OFF
% ./tests d,info:-d,ret3:d,explain t:d,pop
>main
@@ -304,7 +281,6 @@ func2: info: s=ko
| | | <func3
| | <func2
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
main: explain: dbug explained: d,info,explain:-d,ret3
func2: info: s=ko
@@ -317,13 +293,11 @@ func2: info: s=ko
| | | info: s=ko
| | <func2
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
main: explain: dbug explained: d,info,explain,pop:-d,ret3
func2: info: s=ko
% ./tests d,info:-d,ret3:d,explain,set
func2: info: s=ko
-=> evaluate: OFF
=> evaluate_if: OFF
tests.c: main: explain: dbug explained: d,info,explain,set:-d,ret3:F
tests.c: func2: info: s=ko
@@ -336,7 +310,6 @@ func2: info: s=ko
| | | info: s=ko
| | <func2
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
tests.c: | explain: dbug explained: d,info,explain,set:-d,ret3:F:t
tests.c: | >func2
@@ -354,7 +327,6 @@ func2: info: s=ko
| | | info: s=ko
| | <func2
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
tests.c: | explain: dbug explained: d,info,explain,set:-d,ret3:F:t
tests.c: | >func2
@@ -365,7 +337,6 @@ func2: info: s=ko
tests.c: <main
% ./tests t d,info:-d,ret3:d,explain,set,pop
func2: info: s=ko
-=> evaluate: OFF
=> evaluate_if: OFF
| >func2
| | >func3
@@ -375,7 +346,6 @@ func2: info: s=ko
% ./tests t:f,func2
| | >func2
| | <func2
-=> evaluate: OFF
=> evaluate_if: OFF
| >func2
| <func2
@@ -387,7 +357,6 @@ func2: info: s=ko
| >func1
| <func1
=> execute
-=> evaluate: ON
=> evaluate_if: OFF
| explain: dbug explained: d:f:-f,func2/:t
<main
@@ -399,7 +368,6 @@ func2: info: s=ko
| | | info: s=ok
| | <func2
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
% ./tests t:f,main/:d,pop
>main
@@ -409,10 +377,8 @@ func2: info: s=ko
| | | <func3
| | <func2
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
% ./tests f,main/:d,push
-=> evaluate: OFF
=> evaluate_if: OFF
| >func2
| | >func3
@@ -431,7 +397,6 @@ func2: info: s=ko
| | | <func3
| | <func2
=> push1
-=> evaluate: OFF
=> evaluate_if: OFF
| | >func3
| | <func3
@@ -440,7 +405,6 @@ func2: info: s=ko
>main
=> push1
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
| >func2
| | >func3
@@ -453,7 +417,6 @@ func2: info: s=ko
| | | <func3
=> push1
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
| >func2
| | >func3
@@ -469,7 +432,6 @@ func2: info: s=ko
| | | <func3
| | <func2
=> push1
-=> evaluate: OFF
=> evaluate_if: OFF
# change the defaults
% ./tests t:f,func3 --push1=t
@@ -477,7 +439,6 @@ func2: info: s=ko
| | | <func3
=> push1
| <func1
-=> evaluate: OFF
=> evaluate_if: OFF
| >func2
| | >func3
@@ -487,11 +448,9 @@ func2: info: s=ko
# repeated keyword
% ./tests d:-d,info,info
=> execute
-=> evaluate: ON
=> evaluate_if: OFF
main: explain: dbug explained: d:-d,info
% ./tests d:-d,info/,info
=> execute
-=> evaluate: ON
=> evaluate_if: OFF
main: explain: dbug explained: d:-d,info/
diff --git a/dbug/tests.c b/dbug/tests.c
index 3e77bf82236..4e3642f09e4 100644
--- a/dbug/tests.c
+++ b/dbug/tests.c
@@ -16,7 +16,8 @@ char *push1=0;
const char *func3()
{
DBUG_ENTER("func3");
- DBUG_RETURN(DBUG_EVALUATE("ret3", "ok", "ko"));
+ DBUG_EXECUTE("ret3", DBUG_RETURN("ok"););
+ DBUG_RETURN("ko");
}
void func2()
@@ -72,10 +73,8 @@ int main (int argc __attribute__((unused)),
DBUG_EXECUTE_IF("push", DBUG_PUSH("+t"); );
DBUG_EXECUTE("execute", fprintf(DBUG_FILE, "=> execute\n"); );
DBUG_EXECUTE_IF("set", DBUG_SET("+F"); );
- fprintf(DBUG_FILE, "=> evaluate: %s\n",
- DBUG_EVALUATE("evaluate", "ON", "OFF"));
fprintf(DBUG_FILE, "=> evaluate_if: %s\n",
- DBUG_EVALUATE_IF("evaluate_if", "ON", "OFF"));
+ (DBUG_IF("evaluate_if") ? "ON": "OFF"));
DBUG_EXECUTE_IF("pop", DBUG_POP(); );
{
char s[1000] __attribute__((unused));
diff --git a/dbug/user.r b/dbug/user.r
index 9a48ba3bcb2..bd0cfe381b1 100644
--- a/dbug/user.r
+++ b/dbug/user.r
@@ -771,32 +771,20 @@ artificial delay checking for race conditions.
.SP 1
EX:\ \fCDBUG_EXECUTE_IF\ ("crashme",\ DBUG_ABORT()\ ());\fR
.SP 1
-.LI DBUG_EVALUATE\
-The DBUG_EVALUATE macro is similar to DBUG_EXECUTE, but it can be used in
-the expression context. The first argument is the debug keyword that is used to
-choose whether the second (keyword is enabled) or the third (keyword is not
-enabled) argument is evaluated. When
-.I dbug
-is compiled off, the third argument is evaluated.
-.SP 1
-EX:\fC
-.br
- printf("Info-debug is %s",
-.br
- DBUG_EVALUATE\ ("info", "ON", "OFF"));\fR
-.SP 1
-.LI DBUG_EVALUATE_IF\
-Works like DBUG_EVALUATE macro, but the second argument is
-.B not
-evaluated, if the keyword is not explicitly listed in
-the 'd' flag. Like DBUG_EXECUTE_IF this could be used to conditionally execute
+.LI DBUG_IF\
+Returns
+.B 1
+if the keyword is explicitly listed in
+the 'd' flag. Otherwise returns
+.B 0
+Like DBUG_EXECUTE_IF this could be used to conditionally execute
"dangerous" actions.
.SP 1
EX:\fC
.br
if (prepare_transaction () ||
.br
- DBUG_EVALUATE ("crashme", (DBUG_ABORT(), 0), 0) ||
+ (DBUG_IF("crashme") && (DBUG_ABORT(), 0)) ||
.br
commit_transaction () )\fR
.SP 1
diff --git a/debian/additions/mariadb.conf.d/50-server.cnf b/debian/additions/mariadb.conf.d/50-server.cnf
index c5a26bd42b2..28e37445888 100644
--- a/debian/additions/mariadb.conf.d/50-server.cnf
+++ b/debian/additions/mariadb.conf.d/50-server.cnf
@@ -108,7 +108,7 @@ collation-server = utf8mb4_general_ci
# you can put MariaDB-only options here
[mariadb]
-# This group is only read by MariaDB-10.6 servers.
+# This group is only read by MariaDB-10.8 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
-[mariadb-10.6]
+[mariadb-10.8]
diff --git a/debian/additions/source_mariadb-10.6.py b/debian/additions/source_mariadb-10.8.py
index 43b1f35373e..9b672189fdc 100644
--- a/debian/additions/source_mariadb-10.6.py
+++ b/debian/additions/source_mariadb-10.8.py
@@ -1,4 +1,4 @@
-'''apport package hook for mariadb-10.6
+'''apport package hook for mariadb-10.8
(c) 2009 Canonical Ltd.
Author: Mathias Gug <mathias.gug@canonical.com>
@@ -21,7 +21,7 @@ def _add_my_conf_files(report, filename):
continue
def add_info(report):
- attach_conffiles(report, 'mariadb-server-10.6', conffiles=None)
+ attach_conffiles(report, 'mariadb-server-10.8', conffiles=None)
key = 'Logs' + path_to_key('/var/log/daemon.log')
report[key] = ""
for line in read_file('/var/log/daemon.log').split('\n'):
diff --git a/debian/autobake-deb.sh b/debian/autobake-deb.sh
index bad6e6eecf0..a7e8151b163 100755
--- a/debian/autobake-deb.sh
+++ b/debian/autobake-deb.sh
@@ -17,6 +17,7 @@ set -e
export DEB_BUILD_OPTIONS="nocheck $DEB_BUILD_OPTIONS"
source ./VERSION
+
# General CI optimizations to keep build output smaller
if [[ $GITLAB_CI ]]
then
@@ -34,7 +35,7 @@ then
then
cp -v storage/columnstore/columnstore/debian/mariadb-plugin-columnstore.* debian/
echo >> debian/control
- cat storage/columnstore/columnstore/debian/control >> debian/control
+ sed "s/10.6/${MYSQL_VERSION_MAJOR}.${MYSQL_VERSION_MINOR}/" <storage/columnstore/columnstore/debian/control >> debian/control
fi
fi
@@ -67,6 +68,12 @@ disable_pmem()
sed '/-DWITH_PMEM=YES/d' -i debian/rules
}
+disable_libfmt()
+{
+ # 0.7+ required
+ sed '/libfmt-dev/d' -i debian/control
+}
+
architecture=$(dpkg-architecture -q DEB_BUILD_ARCH)
# Parse release name and number from Linux standard base release
@@ -98,6 +105,7 @@ case "${LSBNAME}"
in
# Debian
buster)
+ disable_libfmt
replace_uring_with_aio
if [ ! "$architecture" = amd64 ]
then
@@ -127,6 +135,7 @@ in
;&
focal)
replace_uring_with_aio
+ disable_libfmt
;&
impish|jammy|kinetic)
# mariadb-plugin-rocksdb s390x not supported by us (yet)
diff --git a/debian/changelog b/debian/changelog
index 08065467bdc..72bd7ddc685 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,5 @@
-mariadb-10.6 (1:10.6.0) unstable; urgency=medium
+mariadb-10.8 (1:10.8.0) unstable; urgency=medium
* Initial Release
- -- Otto Kekäläinen <otto@debian.org> Thu, 14 May 2020 18:00:57 +0300
+ -- Vicențiu Ciorbaru <vicentiu@mariadb.org> Thu, 18 Jun 2021 16:08:00 +0300
diff --git a/debian/control b/debian/control
index 7f0d88e991c..bb7147948f3 100644
--- a/debian/control
+++ b/debian/control
@@ -1,4 +1,4 @@
-Source: mariadb-10.6
+Source: mariadb-10.8
Section: database
Priority: optional
Maintainer: MariaDB Developers <maria-developers@lists.launchpad.net>
@@ -18,14 +18,18 @@ Build-Depends: bison,
libboost-regex-dev [amd64],
libboost-system-dev [amd64],
libboost-thread-dev [amd64],
+ libbz2-dev,
libcrack2-dev (>= 2.9.0),
libcurl4-openssl-dev | libcurl4-dev,
libedit-dev,
libedit-dev:native,
+ libfmt-dev (>= 7.0.0),
libjemalloc-dev [linux-any],
libjudy-dev,
libkrb5-dev,
liblz4-dev,
+ liblzma-dev,
+ liblzo2-dev,
libncurses5-dev (>= 5.0-6~),
libncurses5-dev:native (>= 5.0-6~),
libnuma-dev [linux-any],
@@ -38,7 +42,7 @@ Build-Depends: bison,
libsystemd-dev [linux-any],
liburing-dev [linux-any],
libxml2-dev,
- libzstd-dev,
+ libzstd-dev (>= 1.1.3),
lsb-release,
perl:any,
po-debconf,
@@ -259,7 +263,7 @@ Description: MariaDB common configuration files
.
This package includes configuration files common to all MariaDB programs.
-Package: mariadb-client-core-10.6
+Package: mariadb-client-core-10.8
Architecture: any
Depends: libmariadb3 (>= 10.5.4),
mariadb-common (>= ${source:Version}),
@@ -271,7 +275,9 @@ Conflicts: mariadb-client-10.0,
mariadb-client-10.3,
mariadb-client-10.4,
mariadb-client-10.5,
- mariadb-client-10.6 (<< ${source:Version}),
+ mariadb-client-10.6,
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-client-5.1,
mariadb-client-5.2,
mariadb-client-5.3,
@@ -282,6 +288,8 @@ Conflicts: mariadb-client-10.0,
mariadb-client-core-10.3,
mariadb-client-core-10.4,
mariadb-client-core-10.5,
+ mariadb-client-core-10.6,
+ mariadb-client-core-10.7,
mariadb-client-core-5.1,
mariadb-client-core-5.2,
mariadb-client-core-5.3,
@@ -304,7 +312,9 @@ Breaks: mariadb-server-10.0,
mariadb-server-core-10.3,
mariadb-server-core-10.4,
mariadb-server-core-10.5,
- mariadb-server-core-10.6 (<< ${source:Version}),
+ mariadb-server-core-10.6,
+ mariadb-server-core-10.7,
+ mariadb-server-core-10.8 (<< ${source:Version}),
mysql-server-core-5.5,
mysql-server-core-5.6,
mysql-server-core-5.7,
@@ -318,7 +328,9 @@ Replaces: mariadb-client-10.0,
mariadb-client-10.3,
mariadb-client-10.4,
mariadb-client-10.5,
- mariadb-client-10.6 (<< ${source:Version}),
+ mariadb-client-10.6,
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-client-5.1,
mariadb-client-5.2,
mariadb-client-5.3,
@@ -329,6 +341,8 @@ Replaces: mariadb-client-10.0,
mariadb-client-core-10.3,
mariadb-client-core-10.4,
mariadb-client-core-10.5,
+ mariadb-client-core-10.6,
+ mariadb-client-core-10.7,
mariadb-client-core-5.1,
mariadb-client-core-5.2,
mariadb-client-core-5.3,
@@ -341,7 +355,9 @@ Replaces: mariadb-client-10.0,
mariadb-server-core-10.3,
mariadb-server-core-10.4,
mariadb-server-core-10.5,
- mariadb-server-core-10.6 (<< ${source:Version}),
+ mariadb-server-core-10.6,
+ mariadb-server-core-10.7,
+ mariadb-server-core-10.8 (<< ${source:Version}),
mysql-client (<< 5.0.51),
mysql-client-5.0,
mysql-client-5.1,
@@ -369,10 +385,11 @@ Description: MariaDB database core client binaries
.
This package includes the core client files, as used by Akonadi.
-Package: mariadb-client-10.6
+Package: mariadb-client-10.8
Architecture: any
Depends: debianutils (>=1.6),
- mariadb-client-core-10.6 (>= ${source:Version}),
+ libconfig-inifiles-perl,
+ mariadb-client-core-10.8 (>= ${source:Version}),
mariadb-common,
${misc:Depends},
${perl:Depends},
@@ -384,7 +401,9 @@ Conflicts: mariadb-client (<< ${source:Version}),
mariadb-client-10.3,
mariadb-client-10.4,
mariadb-client-10.5,
- mariadb-client-10.6 (<< ${source:Version}),
+ mariadb-client-10.6,
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-client-5.1,
mariadb-client-5.2,
mariadb-client-5.3,
@@ -410,21 +429,27 @@ Breaks: mariadb-client-core-10.0,
mariadb-client-core-10.3,
mariadb-client-core-10.4,
mariadb-client-core-10.5,
- mariadb-client-core-10.6 (<< ${source:Version}),
+ mariadb-client-core-10.6,
+ mariadb-client-core-10.7,
+ mariadb-client-core-10.8 (<< ${source:Version}),
mariadb-server-10.0,
mariadb-server-10.1,
mariadb-server-10.2,
mariadb-server-10.3,
mariadb-server-10.4,
mariadb-server-10.5,
- mariadb-server-10.6 (<< ${source:Version}),
+ mariadb-server-10.6,
+ mariadb-server-10.7,
+ mariadb-server-10.8 (<< ${source:Version}),
mariadb-server-core-10.0,
mariadb-server-core-10.1,
mariadb-server-core-10.2,
mariadb-server-core-10.3,
mariadb-server-core-10.4,
mariadb-server-core-10.5,
- mariadb-server-core-10.6 (<< ${source:Version}),
+ mariadb-server-core-10.6,
+ mariadb-server-core-10.7,
+ mariadb-server-core-10.8 (<< ${source:Version}),
mysql-server-5.5,
mysql-server-5.6,
mysql-server-5.7,
@@ -443,6 +468,8 @@ Replaces: mariadb-client (<< ${source:Version}),
mariadb-client-10.3,
mariadb-client-10.4,
mariadb-client-10.5,
+ mariadb-client-10.6,
+ mariadb-client-10.7,
mariadb-client-5.1,
mariadb-client-5.2,
mariadb-client-5.3,
@@ -453,21 +480,27 @@ Replaces: mariadb-client (<< ${source:Version}),
mariadb-client-core-10.3,
mariadb-client-core-10.4,
mariadb-client-core-10.5,
- mariadb-client-core-10.6 (<< ${source:Version}),
+ mariadb-client-core-10.6,
+ mariadb-client-core-10.7,
+ mariadb-client-core-10.8 (<< ${source:Version}),
mariadb-server-10.0,
mariadb-server-10.1,
mariadb-server-10.2,
mariadb-server-10.3,
mariadb-server-10.4,
mariadb-server-10.5,
- mariadb-server-10.6 (<< ${source:Version}),
+ mariadb-server-10.6,
+ mariadb-server-10.7,
+ mariadb-server-10.8 (<< ${source:Version}),
mariadb-server-core-10.0,
mariadb-server-core-10.1,
mariadb-server-core-10.2,
mariadb-server-core-10.3,
mariadb-server-core-10.4,
mariadb-server-core-10.5,
- mariadb-server-core-10.6 (<< ${source:Version}),
+ mariadb-server-core-10.6,
+ mariadb-server-core-10.7,
+ mariadb-server-core-10.8 (<< ${source:Version}),
mysql-client (<< 5.0.51),
mysql-client-5.0,
mysql-client-5.1,
@@ -508,7 +541,7 @@ Description: MariaDB database client binaries
This package includes the client binaries and the additional tools
innotop and mariadb-report (mysqlreport).
-Package: mariadb-server-core-10.6
+Package: mariadb-server-core-10.8
Architecture: any
Depends: mariadb-common (>= ${source:Version}),
${misc:Depends},
@@ -519,6 +552,8 @@ Conflicts: mariadb-server-core-10.0,
mariadb-server-core-10.3,
mariadb-server-core-10.4,
mariadb-server-core-10.5,
+ mariadb-server-core-10.6,
+ mariadb-server-core-10.7,
mariadb-server-core-5.1,
mariadb-server-core-5.2,
mariadb-server-core-5.3,
@@ -537,13 +572,17 @@ Breaks: mariadb-client-10.0,
mariadb-client-10.3,
mariadb-client-10.4,
mariadb-client-10.5,
- mariadb-client-10.6 (<< ${source:Version}),
+ mariadb-client-10.6,
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-server-10.0,
mariadb-server-10.1,
mariadb-server-10.3,
mariadb-server-10.4,
mariadb-server-10.5,
- mariadb-server-10.6 (<< ${source:Version}),
+ mariadb-server-10.6,
+ mariadb-server-10.7,
+ mariadb-server-10.8 (<< ${source:Version}),
mysql-client-5.5,
mysql-server-5.5,
mysql-server-5.6,
@@ -558,13 +597,17 @@ Replaces: mariadb-client-10.0,
mariadb-client-10.3,
mariadb-client-10.4,
mariadb-client-10.5,
- mariadb-client-10.6 (<< ${source:Version}),
+ mariadb-client-10.6,
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-server-10.0,
mariadb-server-10.1,
mariadb-server-10.3,
mariadb-server-10.4,
mariadb-server-10.5,
- mariadb-server-10.6 (<< ${source:Version}),
+ mariadb-server-10.6,
+ mariadb-server-10.7,
+ mariadb-server-10.8 (<< ${source:Version}),
mariadb-server-core-10.0,
mariadb-server-core-10.1,
mariadb-server-core-10.2,
@@ -601,7 +644,7 @@ Description: MariaDB database core server files
.
This package includes the core server files, as used by Akonadi.
-Package: mariadb-server-10.6
+Package: mariadb-server-10.8
Architecture: any
Suggests: mailx,
mariadb-test,
@@ -616,8 +659,8 @@ Depends: galera-4 (>= 26.4),
libdbi-perl,
lsb-base (>= 3.0-10),
lsof [linux-any],
- mariadb-client-10.6 (>= ${source:Version}),
- mariadb-server-core-10.6 (>= ${source:Version}),
+ mariadb-client-10.8 (>= ${source:Version}),
+ mariadb-server-core-10.8 (>= ${source:Version}),
passwd,
perl (>= 5.6),
procps,
@@ -634,6 +677,8 @@ Conflicts: mariadb-server (<< ${source:Version}),
mariadb-server-10.3,
mariadb-server-10.4,
mariadb-server-10.5,
+ mariadb-server-10.6,
+ mariadb-server-10.7,
mariadb-server-5.1,
mariadb-server-5.2,
mariadb-server-5.3,
@@ -664,7 +709,9 @@ Replaces: handlersocket-mysql-5.5,
libmariadbclient-dev (<< 5.5.0),
libmariadbclient16,
mariadb-client-10.5,
- mariadb-client-10.6 (<< ${source:Version}),
+ mariadb-client-10.6,
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-server (<< ${source:Version}),
mariadb-server-10.0,
mariadb-server-10.1,
@@ -672,6 +719,8 @@ Replaces: handlersocket-mysql-5.5,
mariadb-server-10.3,
mariadb-server-10.4,
mariadb-server-10.5,
+ mariadb-server-10.6,
+ mariadb-server-10.7,
mariadb-server-5.1,
mariadb-server-5.2,
mariadb-server-5.3,
@@ -705,11 +754,11 @@ Description: MariaDB database server binaries
Package: mariadb-server
Architecture: all
-Depends: mariadb-server-10.6 (>= ${source:Version}),
+Depends: mariadb-server-10.8 (>= ${source:Version}),
${misc:Depends}
Description: MariaDB database server (metapackage depending on the latest version)
This is an empty package that depends on the current "best" version of
- mariadb-server (currently mariadb-server-10.6), as determined by the MariaDB
+ mariadb-server (currently mariadb-server-10.8), as determined by the MariaDB
maintainers. Install this package if in doubt about which MariaDB
version you need. That will install the version recommended by the
package maintainers.
@@ -721,11 +770,11 @@ Description: MariaDB database server (metapackage depending on the latest versio
Package: mariadb-client
Architecture: all
-Depends: mariadb-client-10.6 (>= ${source:Version}),
+Depends: mariadb-client-10.8 (>= ${source:Version}),
${misc:Depends}
Description: MariaDB database client (metapackage depending on the latest version)
This is an empty package that depends on the current "best" version of
- mariadb-client (currently mariadb-client-10.6), as determined by the MariaDB
+ mariadb-client (currently mariadb-client-10.8), as determined by the MariaDB
maintainers. Install this package if in doubt about which MariaDB version
you want, as this is the one considered to be in the best shape.
@@ -737,7 +786,7 @@ Breaks: mariadb-backup-10.1,
Replaces: mariadb-backup-10.1,
mariadb-backup-10.2,
mariadb-client-10.1
-Depends: mariadb-client-core-10.6 (= ${binary:Version}),
+Depends: mariadb-client-core-10.8 (= ${binary:Version}),
${misc:Depends},
${shlibs:Depends}
Description: Backup tool for MariaDB server
@@ -750,7 +799,7 @@ Description: Backup tool for MariaDB server
Package: mariadb-plugin-connect
Architecture: any
Depends: libxml2,
- mariadb-server-10.6 (= ${server:Version}),
+ mariadb-server-10.8 (= ${server:Version}),
unixodbc,
${misc:Depends},
${shlibs:Depends}
@@ -773,7 +822,7 @@ Description: Connect storage engine for MariaDB
Package: mariadb-plugin-s3
Architecture: any
Depends: libcurl4,
- mariadb-server-10.6 (= ${server:Version}),
+ mariadb-server-10.8 (= ${server:Version}),
${misc:Depends},
${shlibs:Depends}
Description: Amazon S3 archival storage engine for MariaDB
@@ -783,7 +832,7 @@ Description: Amazon S3 archival storage engine for MariaDB
Package: mariadb-plugin-rocksdb
Architecture: amd64 arm64 mips64el ppc64el
-Depends: mariadb-server-10.6 (= ${server:Version}),
+Depends: mariadb-server-10.8 (= ${server:Version}),
python3,
rocksdb-tools,
${misc:Depends},
@@ -803,7 +852,7 @@ Description: RocksDB storage engine for MariaDB
Package: mariadb-plugin-oqgraph
Architecture: any
Depends: libjudydebian1,
- mariadb-server-10.6 (= ${server:Version}),
+ mariadb-server-10.8 (= ${server:Version}),
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-oqgraph-engine-10.0,
@@ -823,7 +872,7 @@ Description: OQGraph storage engine for MariaDB
Package: mariadb-plugin-mroonga
Architecture: any-alpha any-amd64 any-arm any-arm64 any-i386 any-ia64 any-mips64el any-mips64r6el any-mipsel any-mipsr6el any-nios2 any-powerpcel any-ppc64el any-sh3 any-sh4 any-tilegx
-Depends: mariadb-server-10.6 (= ${server:Version}),
+Depends: mariadb-server-10.8 (= ${server:Version}),
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-server-10.0,
@@ -843,7 +892,7 @@ Description: Mroonga storage engine for MariaDB
Package: mariadb-plugin-spider
Architecture: any
-Depends: mariadb-server-10.6 (= ${server:Version}),
+Depends: mariadb-server-10.8 (= ${server:Version}),
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-server-10.0,
@@ -865,7 +914,7 @@ Description: Spider storage engine for MariaDB
Package: mariadb-plugin-gssapi-server
Architecture: any
Depends: libgssapi-krb5-2,
- mariadb-server-10.6,
+ mariadb-server-10.8,
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-gssapi-server-10.1,
@@ -886,7 +935,7 @@ Package: mariadb-plugin-gssapi-client
Architecture: any
Multi-Arch: same
Depends: libgssapi-krb5-2,
- mariadb-client-10.6 (= ${binary:Version}),
+ mariadb-client-10.8 (= ${binary:Version}),
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-gssapi-client-10.1,
@@ -906,7 +955,7 @@ Description: GSSAPI authentication plugin for MariaDB client
Package: mariadb-plugin-cracklib-password-check
Architecture: any
Depends: libcrack2 (>= 2.9.0),
- mariadb-server-10.6,
+ mariadb-server-10.8,
${misc:Depends},
${shlibs:Depends}
Description: CrackLib Password Validation Plugin for MariaDB
@@ -915,10 +964,80 @@ Description: CrackLib Password Validation Plugin for MariaDB
.
Install and configure this to enforce stronger passwords for MariaDB users.
+Package: mariadb-plugin-provider-bzip2
+Architecture: any
+Depends: mariadb-server-10.8,
+ ${misc:Depends},
+ ${shlibs:Depends}
+Description: BZip2 compression support in the server and storage engines
+ The various MariaDB storage engines, such as InnoDB, RocksDB, Mroonga,
+ can use different compression libraries.
+ .
+ Plugin provides BZip2 (https://sourceware.org/bzip2/) compression
+ .
+ Note that these affect InnoDB and Mroonga only;
+ RocksDB still uses the compression algorithms from its own library
+
+Package: mariadb-plugin-provider-lz4
+Architecture: any
+Depends: mariadb-server-10.8,
+ ${misc:Depends},
+ ${shlibs:Depends}
+Description: LZ4 compression support in the server and storage engines
+ The various MariaDB storage engines, such as InnoDB, RocksDB, Mroonga,
+ can use different compression libraries.
+ .
+ Plugin provides LZ4 (http://lz4.github.io/lz4/) compression
+ .
+ Note that these affect InnoDB and Mroonga only;
+ RocksDB still uses the compression algorithms from its own library
+
+Package: mariadb-plugin-provider-lzma
+Architecture: any
+Depends: mariadb-server-10.8,
+ ${misc:Depends},
+ ${shlibs:Depends}
+Description: LZMA compression support in the server and storage engines
+ The various MariaDB storage engines, such as InnoDB, RocksDB, Mroonga,
+ can use different compression libraries.
+ .
+ Plugin provides LZMA (https://tukaani.org/lzma/) compression
+ .
+ Note that these affect InnoDB and Mroonga only;
+ RocksDB still uses the compression algorithms from its own library
+
+Package: mariadb-plugin-provider-lzo
+Architecture: any
+Depends: mariadb-server-10.8,
+ ${misc:Depends},
+ ${shlibs:Depends}
+Description: LZO compression support in the server and storage engines
+ The various MariaDB storage engines, such as InnoDB, RocksDB, Mroonga,
+ can use different compression libraries.
+ .
+ Plugin provides LZO (http://www.oberhumer.com/opensource/lzo/) compression
+ .
+ Note that these affect InnoDB and Mroonga only;
+ RocksDB still uses the compression algorithms from its own library
+
+Package: mariadb-plugin-provider-snappy
+Architecture: any
+Depends: mariadb-server-10.8,
+ ${misc:Depends},
+ ${shlibs:Depends}
+Description: Snappy compression support in the server and storage engines
+ The various MariaDB storage engines, such as InnoDB, RocksDB, Mroonga,
+ can use different compression libraries.
+ .
+ Plugin provides Snappy (https://github.com/google/snappy) compression
+ .
+ Note that these affect InnoDB and Mroonga only;
+ RocksDB still uses the compression algorithms from its own library
+
Package: mariadb-test
Architecture: any
-Depends: mariadb-client-10.6 (= ${binary:Version}),
- mariadb-server-10.6 (= ${server:Version}),
+Depends: mariadb-client-10.8 (= ${binary:Version}),
+ mariadb-server-10.8 (= ${server:Version}),
mariadb-test-data (= ${source:Version}),
virtual-mysql-testsuite,
${misc:Depends},
diff --git a/debian/libmariadb3.symbols b/debian/libmariadb3.symbols
new file mode 100644
index 00000000000..c79676472c6
--- /dev/null
+++ b/debian/libmariadb3.symbols
@@ -0,0 +1,336 @@
+libmariadb.so.3 libmariadb3 #MINVER#
+* Build-Depends-Package: libmariadb-dev
+ libmariadb_3@libmariadb_3 3.0.0
+ libmariadbclient_18@libmariadbclient_18 3.0.0
+ libmysqlclient_18@libmysqlclient_18 3.0.0
+ ma_pvio_register_callback@libmariadb_3 3.0.0
+ mariadb_cancel@libmariadb_3 3.0.0
+ mariadb_connection@libmariadb_3 3.0.0
+ mariadb_convert_string@libmariadb_3 3.0.0
+ mariadb_deinitialize_ssl@libmariadb_3 3.0.0
+ mariadb_free_rpl_event@libmariadb_3 3.1.0
+ mariadb_get_charset_by_name@libmariadb_3 3.0.0
+ mariadb_get_charset_by_nr@libmariadb_3 3.0.0
+ mariadb_get_info@libmariadb_3 3.0.0
+ mariadb_get_infov@libmariadb_3 3.0.0
+ mariadb_reconnect@libmariadb_3 3.0.0
+ mariadb_rpl_close@libmariadb_3 3.1.0
+ mariadb_rpl_fetch@libmariadb_3 3.1.0
+ mariadb_rpl_get_optionsv@libmariadb_3 3.1.0
+ mariadb_rpl_open@libmariadb_3 3.1.0
+ mariadb_rpl_optionsv@libmariadb_3 3.1.0
+ mariadb_stmt_execute_direct@libmariadb_3 3.0.0
+ mariadb_stmt_fetch_fields@libmariadb_3 3.1.0
+ mysql_affected_rows@libmariadbclient_18 3.0.0
+ mysql_affected_rows@libmysqlclient_18 3.0.0
+ mysql_autocommit_cont@libmariadb_3 3.0.0
+ mysql_autocommit@libmariadbclient_18 3.0.0
+ mysql_autocommit@libmysqlclient_18 3.0.0
+ mysql_autocommit_start@libmariadb_3 3.0.0
+ mysql_change_user_cont@libmariadb_3 3.0.0
+ mysql_change_user@libmariadbclient_18 3.0.0
+ mysql_change_user@libmysqlclient_18 3.0.0
+ mysql_change_user_start@libmariadb_3 3.0.0
+ mysql_character_set_name@libmariadbclient_18 3.0.0
+ mysql_character_set_name@libmysqlclient_18 3.0.0
+ mysql_client_find_plugin@libmariadbclient_18 3.0.0
+ mysql_client_find_plugin@libmysqlclient_18 3.0.0
+ mysql_client_register_plugin@libmariadbclient_18 3.0.0
+ mysql_client_register_plugin@libmysqlclient_18 3.0.0
+ mysql_close_cont@libmariadb_3 3.0.0
+ mysql_close@libmariadbclient_18 3.0.0
+ mysql_close@libmysqlclient_18 3.0.0
+ mysql_close_start@libmariadb_3 3.0.0
+ mysql_commit_cont@libmariadb_3 3.0.0
+ mysql_commit@libmariadbclient_18 3.0.0
+ mysql_commit@libmysqlclient_18 3.0.0
+ mysql_commit_start@libmariadb_3 3.0.0
+ mysql_data_seek@libmariadbclient_18 3.0.0
+ mysql_data_seek@libmysqlclient_18 3.0.0
+ mysql_debug@libmariadbclient_18 3.0.0
+ mysql_debug@libmysqlclient_18 3.0.0
+ mysql_dump_debug_info_cont@libmariadb_3 3.0.0
+ mysql_dump_debug_info@libmariadbclient_18 3.0.0
+ mysql_dump_debug_info@libmysqlclient_18 3.0.0
+ mysql_dump_debug_info_start@libmariadb_3 3.0.0
+ mysql_embedded@libmariadbclient_18 3.0.0
+ mysql_embedded@libmysqlclient_18 3.0.0
+ mysql_eof@libmariadbclient_18 3.0.0
+ mysql_eof@libmysqlclient_18 3.0.0
+ mysql_errno@libmariadbclient_18 3.0.0
+ mysql_errno@libmysqlclient_18 3.0.0
+ mysql_error@libmariadbclient_18 3.0.0
+ mysql_error@libmysqlclient_18 3.0.0
+ mysql_escape_string@libmariadbclient_18 3.0.0
+ mysql_escape_string@libmysqlclient_18 3.0.0
+ mysql_fetch_field_direct@libmariadbclient_18 3.0.0
+ mysql_fetch_field_direct@libmysqlclient_18 3.0.0
+ mysql_fetch_field@libmariadbclient_18 3.0.0
+ mysql_fetch_field@libmysqlclient_18 3.0.0
+ mysql_fetch_fields@libmariadbclient_18 3.0.0
+ mysql_fetch_fields@libmysqlclient_18 3.0.0
+ mysql_fetch_lengths@libmariadbclient_18 3.0.0
+ mysql_fetch_lengths@libmysqlclient_18 3.0.0
+ mysql_fetch_row_cont@libmariadb_3 3.0.0
+ mysql_fetch_row@libmariadbclient_18 3.0.0
+ mysql_fetch_row@libmysqlclient_18 3.0.0
+ mysql_fetch_row_start@libmariadb_3 3.0.0
+ mysql_field_count@libmariadbclient_18 3.0.0
+ mysql_field_count@libmysqlclient_18 3.0.0
+ mysql_field_seek@libmariadbclient_18 3.0.0
+ mysql_field_seek@libmysqlclient_18 3.0.0
+ mysql_field_tell@libmariadbclient_18 3.0.0
+ mysql_field_tell@libmysqlclient_18 3.0.0
+ mysql_free_result_cont@libmariadb_3 3.0.0
+ mysql_free_result@libmariadbclient_18 3.0.0
+ mysql_free_result@libmysqlclient_18 3.0.0
+ mysql_free_result_start@libmariadb_3 3.0.0
+ mysql_get_character_set_info@libmariadbclient_18 3.0.0
+ mysql_get_character_set_info@libmysqlclient_18 3.0.0
+ mysql_get_charset_by_name@libmariadbclient_18 3.0.0
+ mysql_get_charset_by_name@libmysqlclient_18 3.0.0
+ mysql_get_charset_by_nr@libmariadbclient_18 3.0.0
+ mysql_get_charset_by_nr@libmysqlclient_18 3.0.0
+ mysql_get_client_info@libmariadbclient_18 3.0.0
+ mysql_get_client_info@libmysqlclient_18 3.0.0
+ mysql_get_client_version@libmariadbclient_18 3.0.0
+ mysql_get_client_version@libmysqlclient_18 3.0.0
+ mysql_get_host_info@libmariadbclient_18 3.0.0
+ mysql_get_host_info@libmysqlclient_18 3.0.0
+ mysql_get_option@libmariadbclient_18 3.0.0
+ mysql_get_option@libmysqlclient_18 3.0.0
+ mysql_get_optionv@libmariadbclient_18 3.0.0
+ mysql_get_optionv@libmysqlclient_18 3.0.0
+ mysql_get_parameters@libmariadbclient_18 3.0.0
+ mysql_get_parameters@libmysqlclient_18 3.0.0
+ mysql_get_proto_info@libmariadbclient_18 3.0.0
+ mysql_get_proto_info@libmysqlclient_18 3.0.0
+ mysql_get_server_info@libmariadbclient_18 3.0.0
+ mysql_get_server_info@libmysqlclient_18 3.0.0
+ mysql_get_server_name@libmariadbclient_18 3.0.0
+ mysql_get_server_name@libmysqlclient_18 3.0.0
+ mysql_get_server_version@libmariadbclient_18 3.0.0
+ mysql_get_server_version@libmysqlclient_18 3.0.0
+ mysql_get_socket@libmariadbclient_18 3.0.0
+ mysql_get_socket@libmysqlclient_18 3.0.0
+ mysql_get_ssl_cipher@libmariadbclient_18 3.0.0
+ mysql_get_ssl_cipher@libmysqlclient_18 3.0.0
+ mysql_get_timeout_value@libmariadb_3 3.0.19
+ mysql_get_timeout_value_ms@libmariadb_3 3.0.19
+ mysql_hex_string@libmariadbclient_18 3.0.0
+ mysql_hex_string@libmysqlclient_18 3.0.0
+ mysql_info@libmariadbclient_18 3.0.0
+ mysql_info@libmysqlclient_18 3.0.0
+ mysql_init@libmariadbclient_18 3.0.0
+ mysql_init@libmysqlclient_18 3.0.0
+ mysql_insert_id@libmariadbclient_18 3.0.0
+ mysql_insert_id@libmysqlclient_18 3.0.0
+ mysql_kill_cont@libmariadb_3 3.0.0
+ mysql_kill@libmariadbclient_18 3.0.0
+ mysql_kill@libmysqlclient_18 3.0.0
+ mysql_kill_start@libmariadb_3 3.0.0
+ mysql_list_dbs@libmariadbclient_18 3.0.0
+ mysql_list_dbs@libmysqlclient_18 3.0.0
+ mysql_list_fields_cont@libmariadb_3 3.0.0
+ mysql_list_fields@libmariadbclient_18 3.0.0
+ mysql_list_fields@libmysqlclient_18 3.0.0
+ mysql_list_fields_start@libmariadb_3 3.0.0
+ mysql_list_processes@libmariadbclient_18 3.0.0
+ mysql_list_processes@libmysqlclient_18 3.0.0
+ mysql_list_tables@libmariadbclient_18 3.0.0
+ mysql_list_tables@libmysqlclient_18 3.0.0
+ mysql_load_plugin@libmariadbclient_18 3.0.0
+ mysql_load_plugin@libmysqlclient_18 3.0.0
+ mysql_load_plugin_v@libmariadbclient_18 3.0.0
+ mysql_load_plugin_v@libmysqlclient_18 3.0.0
+ mysql_more_results@libmariadbclient_18 3.0.0
+ mysql_more_results@libmysqlclient_18 3.0.0
+ mysql_net_field_length@libmariadbclient_18 3.0.0
+ mysql_net_field_length@libmysqlclient_18 3.0.0
+ mysql_net_read_packet@libmariadbclient_18 3.0.0
+ mysql_net_read_packet@libmysqlclient_18 3.0.0
+ mysql_next_result_cont@libmariadb_3 3.0.0
+ mysql_next_result@libmariadbclient_18 3.0.0
+ mysql_next_result@libmysqlclient_18 3.0.0
+ mysql_next_result_start@libmariadb_3 3.0.0
+ mysql_num_fields@libmariadbclient_18 3.0.0
+ mysql_num_fields@libmysqlclient_18 3.0.0
+ mysql_num_rows@libmariadbclient_18 3.0.0
+ mysql_num_rows@libmysqlclient_18 3.0.0
+ mysql_options4@libmariadbclient_18 3.0.0
+ mysql_options4@libmysqlclient_18 3.0.0
+ mysql_options@libmariadbclient_18 3.0.0
+ mysql_options@libmysqlclient_18 3.0.0
+ mysql_optionsv@libmariadb_3 3.0.0
+ mysql_ping_cont@libmariadb_3 3.0.0
+ mysql_ping@libmariadbclient_18 3.0.0
+ mysql_ping@libmysqlclient_18 3.0.0
+ mysql_ping_start@libmariadb_3 3.0.0
+ mysql_ps_fetch_functions@libmariadb_3 3.0.0
+ mysql_query_cont@libmariadb_3 3.0.0
+ mysql_query@libmariadbclient_18 3.0.0
+ mysql_query@libmysqlclient_18 3.0.0
+ mysql_query_start@libmariadb_3 3.0.0
+ mysql_read_query_result_cont@libmariadb_3 3.0.0
+ mysql_read_query_result@libmariadbclient_18 3.0.0
+ mysql_read_query_result@libmysqlclient_18 3.0.0
+ mysql_read_query_result_start@libmariadb_3 3.0.0
+ mysql_real_connect_cont@libmariadb_3 3.0.0
+ mysql_real_connect@libmariadbclient_18 3.0.0
+ mysql_real_connect@libmysqlclient_18 3.0.0
+ mysql_real_connect_start@libmariadb_3 3.0.0
+ mysql_real_escape_string@libmariadbclient_18 3.0.0
+ mysql_real_escape_string@libmysqlclient_18 3.0.0
+ mysql_real_query_cont@libmariadb_3 3.0.0
+ mysql_real_query@libmariadbclient_18 3.0.0
+ mysql_real_query@libmysqlclient_18 3.0.0
+ mysql_real_query_start@libmariadb_3 3.0.0
+ mysql_refresh_cont@libmariadb_3 3.0.0
+ mysql_refresh@libmariadbclient_18 3.0.0
+ mysql_refresh@libmysqlclient_18 3.0.0
+ mysql_refresh_start@libmariadb_3 3.0.0
+ mysql_reset_connection_cont@libmariadb_3 3.0.0
+ mysql_reset_connection@libmariadbclient_18 3.0.0
+ mysql_reset_connection@libmysqlclient_18 3.0.0
+ mysql_reset_connection_start@libmariadb_3 3.0.0
+ mysql_rollback_cont@libmariadb_3 3.0.0
+ mysql_rollback@libmariadbclient_18 3.0.0
+ mysql_rollback@libmysqlclient_18 3.0.0
+ mysql_rollback_start@libmariadb_3 3.0.0
+ mysql_row_seek@libmariadbclient_18 3.0.0
+ mysql_row_seek@libmysqlclient_18 3.0.0
+ mysql_row_tell@libmariadbclient_18 3.0.0
+ mysql_row_tell@libmysqlclient_18 3.0.0
+ mysql_select_db_cont@libmariadb_3 3.0.0
+ mysql_select_db@libmariadbclient_18 3.0.0
+ mysql_select_db@libmysqlclient_18 3.0.0
+ mysql_select_db_start@libmariadb_3 3.0.0
+ mysql_send_query_cont@libmariadb_3 3.0.0
+ mysql_send_query@libmariadbclient_18 3.0.0
+ mysql_send_query@libmysqlclient_18 3.0.0
+ mysql_send_query_start@libmariadb_3 3.0.0
+ mysql_server_end@libmariadbclient_18 3.0.0
+ mysql_server_end@libmysqlclient_18 3.0.0
+ mysql_server_init@libmariadbclient_18 3.0.0
+ mysql_server_init@libmysqlclient_18 3.0.0
+ mysql_session_track_get_first@libmariadbclient_18 3.0.0
+ mysql_session_track_get_first@libmysqlclient_18 3.0.0
+ mysql_session_track_get_next@libmariadbclient_18 3.0.0
+ mysql_session_track_get_next@libmysqlclient_18 3.0.0
+ mysql_set_character_set_cont@libmariadb_3 3.0.0
+ mysql_set_character_set@libmariadbclient_18 3.0.0
+ mysql_set_character_set@libmysqlclient_18 3.0.0
+ mysql_set_character_set_start@libmariadb_3 3.0.0
+ mysql_set_local_infile_default@libmariadbclient_18 3.0.0
+ mysql_set_local_infile_default@libmysqlclient_18 3.0.0
+ mysql_set_local_infile_handler@libmariadbclient_18 3.0.0
+ mysql_set_local_infile_handler@libmysqlclient_18 3.0.0
+ mysql_set_server_option_cont@libmariadb_3 3.0.0
+ mysql_set_server_option@libmariadbclient_18 3.0.0
+ mysql_set_server_option@libmysqlclient_18 3.0.0
+ mysql_set_server_option_start@libmariadb_3 3.0.0
+ mysql_shutdown_cont@libmariadb_3 3.0.0
+ mysql_shutdown@libmariadbclient_18 3.0.0
+ mysql_shutdown@libmysqlclient_18 3.0.0
+ mysql_shutdown_start@libmariadb_3 3.0.0
+ mysql_sqlstate@libmariadbclient_18 3.0.0
+ mysql_sqlstate@libmysqlclient_18 3.0.0
+ mysql_ssl_set@libmariadbclient_18 3.0.0
+ mysql_ssl_set@libmysqlclient_18 3.0.0
+ mysql_stat_cont@libmariadb_3 3.0.0
+ mysql_stat@libmariadbclient_18 3.0.0
+ mysql_stat@libmysqlclient_18 3.0.0
+ mysql_stat_start@libmariadb_3 3.0.0
+ mysql_stmt_affected_rows@libmariadbclient_18 3.0.0
+ mysql_stmt_affected_rows@libmysqlclient_18 3.0.0
+ mysql_stmt_attr_get@libmariadbclient_18 3.0.0
+ mysql_stmt_attr_get@libmysqlclient_18 3.0.0
+ mysql_stmt_attr_set@libmariadbclient_18 3.0.0
+ mysql_stmt_attr_set@libmysqlclient_18 3.0.0
+ mysql_stmt_bind_param@libmariadbclient_18 3.0.0
+ mysql_stmt_bind_param@libmysqlclient_18 3.0.0
+ mysql_stmt_bind_result@libmariadbclient_18 3.0.0
+ mysql_stmt_bind_result@libmysqlclient_18 3.0.0
+ mysql_stmt_close_cont@libmariadb_3 3.0.0
+ mysql_stmt_close@libmariadbclient_18 3.0.0
+ mysql_stmt_close@libmysqlclient_18 3.0.0
+ mysql_stmt_close_start@libmariadb_3 3.0.0
+ mysql_stmt_data_seek@libmariadbclient_18 3.0.0
+ mysql_stmt_data_seek@libmysqlclient_18 3.0.0
+ mysql_stmt_errno@libmariadbclient_18 3.0.0
+ mysql_stmt_errno@libmysqlclient_18 3.0.0
+ mysql_stmt_error@libmariadbclient_18 3.0.0
+ mysql_stmt_error@libmysqlclient_18 3.0.0
+ mysql_stmt_execute_cont@libmariadb_3 3.0.0
+ mysql_stmt_execute@libmariadbclient_18 3.0.0
+ mysql_stmt_execute@libmysqlclient_18 3.0.0
+ mysql_stmt_execute_start@libmariadb_3 3.0.0
+ mysql_stmt_fetch_column@libmariadbclient_18 3.0.0
+ mysql_stmt_fetch_column@libmysqlclient_18 3.0.0
+ mysql_stmt_fetch_cont@libmariadb_3 3.0.0
+ mysql_stmt_fetch@libmariadbclient_18 3.0.0
+ mysql_stmt_fetch@libmysqlclient_18 3.0.0
+ mysql_stmt_fetch_start@libmariadb_3 3.0.0
+ mysql_stmt_field_count@libmariadbclient_18 3.0.0
+ mysql_stmt_field_count@libmysqlclient_18 3.0.0
+ mysql_stmt_free_result_cont@libmariadb_3 3.0.0
+ mysql_stmt_free_result@libmariadbclient_18 3.0.0
+ mysql_stmt_free_result@libmysqlclient_18 3.0.0
+ mysql_stmt_free_result_start@libmariadb_3 3.0.0
+ mysql_stmt_init@libmariadbclient_18 3.0.0
+ mysql_stmt_init@libmysqlclient_18 3.0.0
+ mysql_stmt_insert_id@libmariadbclient_18 3.0.0
+ mysql_stmt_insert_id@libmysqlclient_18 3.0.0
+ mysql_stmt_more_results@libmariadbclient_18 3.0.0
+ mysql_stmt_more_results@libmysqlclient_18 3.0.0
+ mysql_stmt_next_result_cont@libmariadb_3 3.0.0
+ mysql_stmt_next_result@libmariadbclient_18 3.0.0
+ mysql_stmt_next_result@libmysqlclient_18 3.0.0
+ mysql_stmt_next_result_start@libmariadb_3 3.0.0
+ mysql_stmt_num_rows@libmariadbclient_18 3.0.0
+ mysql_stmt_num_rows@libmysqlclient_18 3.0.0
+ mysql_stmt_param_count@libmariadbclient_18 3.0.0
+ mysql_stmt_param_count@libmysqlclient_18 3.0.0
+ mysql_stmt_param_metadata@libmariadbclient_18 3.0.0
+ mysql_stmt_param_metadata@libmysqlclient_18 3.0.0
+ mysql_stmt_prepare_cont@libmariadb_3 3.0.0
+ mysql_stmt_prepare@libmariadbclient_18 3.0.0
+ mysql_stmt_prepare@libmysqlclient_18 3.0.0
+ mysql_stmt_prepare_start@libmariadb_3 3.0.0
+ mysql_stmt_reset_cont@libmariadb_3 3.0.0
+ mysql_stmt_reset@libmariadbclient_18 3.0.0
+ mysql_stmt_reset@libmysqlclient_18 3.0.0
+ mysql_stmt_reset_start@libmariadb_3 3.0.0
+ mysql_stmt_result_metadata@libmariadbclient_18 3.0.0
+ mysql_stmt_result_metadata@libmysqlclient_18 3.0.0
+ mysql_stmt_row_seek@libmariadbclient_18 3.0.0
+ mysql_stmt_row_seek@libmysqlclient_18 3.0.0
+ mysql_stmt_row_tell@libmariadbclient_18 3.0.0
+ mysql_stmt_row_tell@libmysqlclient_18 3.0.0
+ mysql_stmt_send_long_data_cont@libmariadb_3 3.0.0
+ mysql_stmt_send_long_data@libmariadbclient_18 3.0.0
+ mysql_stmt_send_long_data@libmysqlclient_18 3.0.0
+ mysql_stmt_send_long_data_start@libmariadb_3 3.0.0
+ mysql_stmt_sqlstate@libmariadbclient_18 3.0.0
+ mysql_stmt_sqlstate@libmysqlclient_18 3.0.0
+ mysql_stmt_store_result_cont@libmariadb_3 3.0.0
+ mysql_stmt_store_result@libmariadbclient_18 3.0.0
+ mysql_stmt_store_result@libmysqlclient_18 3.0.0
+ mysql_stmt_store_result_start@libmariadb_3 3.0.0
+ mysql_stmt_warning_count@libmariadb_3 3.0.0
+ mysql_store_result_cont@libmariadb_3 3.0.0
+ mysql_store_result@libmariadbclient_18 3.0.0
+ mysql_store_result@libmysqlclient_18 3.0.0
+ mysql_store_result_start@libmariadb_3 3.0.0
+ mysql_thread_end@libmariadbclient_18 3.0.0
+ mysql_thread_end@libmysqlclient_18 3.0.0
+ mysql_thread_id@libmariadbclient_18 3.0.0
+ mysql_thread_id@libmysqlclient_18 3.0.0
+ mysql_thread_init@libmariadbclient_18 3.0.0
+ mysql_thread_init@libmysqlclient_18 3.0.0
+ mysql_thread_safe@libmariadbclient_18 3.0.0
+ mysql_thread_safe@libmysqlclient_18 3.0.0
+ mysql_use_result@libmariadbclient_18 3.0.0
+ mysql_use_result@libmysqlclient_18 3.0.0
+ mysql_warning_count@libmariadbclient_18 3.0.0
+ mysql_warning_count@libmysqlclient_18 3.0.0
diff --git a/debian/libmariadb3.symbols.README b/debian/libmariadb3.symbols.README
new file mode 100644
index 00000000000..b6e8c95ebdc
--- /dev/null
+++ b/debian/libmariadb3.symbols.README
@@ -0,0 +1,42 @@
+The libmariadb3.symbols files is used to track the libmariadb3 ABI.
+
+If a symbol is removed or changed, the Debian build will fail unless the same change has also explicitly been made in the libmariadb3.symbols file.
+
+If a symbol is added, the Debian build will issue a warning like:
+
+ dh_makeshlibs -O--parallel
+ rm -f debian/libmariadb3/DEBIAN/shlibs
+ echo "libmariadb 3 libmariadb3" >> debian/libmariadb3/DEBIAN/shlibs
+ chmod 0644 -- debian/libmariadb3/DEBIAN/shlibs
+ chown 0:0 -- debian/libmariadb3/DEBIAN/shlibs
+ dpkg-gensymbols -plibmariadb3 -Idebian/libmariadb3.symbols -Pdebian/libmariadb3 -edebian/libmariadb3/usr/lib/x86_64-linux-gnu/libmariadb.so.3
+ dpkg-gensymbols: warning: some new symbols appeared in the symbols file: see diff output below
+ dpkg-gensymbols: warning: debian/libmariadb3/DEBIAN/symbols doesn't match completely debian/libmariadb3.symbols
+ --- debian/libmariadb3.symbols (libmariadb3_10.2.32+maria~sid_amd64)
+ +++ dpkg-gensymbolsUfTky5 2020-02-20 11:27:03.815551573 +0000
+ @@ -12,6 +12,7 @@
+ mariadb_get_charset_by_name@libmariadb_3 3.0.0
+ mariadb_get_charset_by_nr@libmariadb_3 3.0.0
+ mariadb_get_info@libmariadb_3 3.0.0
+ + mariadb_get_infov@libmariadb_3 10.2.32+maria~sid
+ mariadb_reconnect@libmariadb_3 3.0.0
+ mariadb_rpl_close@libmariadb_3 3.1.0
+ mariadb_rpl_fetch@libmariadb_3 3.1.0
+
+
+When this happens, please add the symbol to the libmariadb3.symbols file.
+Unlike the automatic diff above, don't use the server version for the symbols.
+
+Instead use the client library version, which can be viewed with:
+
+ $ grep 'SET(CPACK_PACKAGE_VERSION_' libmariadb/CMakeLists.txt
+ SET(CPACK_PACKAGE_VERSION_MAJOR 3)
+ SET(CPACK_PACKAGE_VERSION_MINOR 1)
+ SET(CPACK_PACKAGE_VERSION_PATCH 7)
+
+In this example, the line to add would be:
+
+ mariadb_get_infov@libmariadb_3 3.1.7
+
+
+Remember to not break the ABI in a stable release!
diff --git a/debian/mariadb-client-10.6.README.Debian b/debian/mariadb-client-10.8.README.Debian
index 64f0f509951..64f0f509951 100644
--- a/debian/mariadb-client-10.6.README.Debian
+++ b/debian/mariadb-client-10.8.README.Debian
diff --git a/debian/mariadb-client-10.6.docs b/debian/mariadb-client-10.8.docs
index c09092629c3..c09092629c3 100644
--- a/debian/mariadb-client-10.6.docs
+++ b/debian/mariadb-client-10.8.docs
diff --git a/debian/mariadb-client-10.6.install b/debian/mariadb-client-10.8.install
index 3a92ded15b6..3a92ded15b6 100644
--- a/debian/mariadb-client-10.6.install
+++ b/debian/mariadb-client-10.8.install
diff --git a/debian/mariadb-client-10.6.links b/debian/mariadb-client-10.8.links
index bc42197629b..bc42197629b 100644
--- a/debian/mariadb-client-10.6.links
+++ b/debian/mariadb-client-10.8.links
diff --git a/debian/mariadb-client-10.6.manpages b/debian/mariadb-client-10.8.manpages
index 8735caeea8b..8735caeea8b 100644
--- a/debian/mariadb-client-10.6.manpages
+++ b/debian/mariadb-client-10.8.manpages
diff --git a/debian/mariadb-client-10.6.menu b/debian/mariadb-client-10.8.menu
index 90280215b8b..0667c93e8f3 100644
--- a/debian/mariadb-client-10.6.menu
+++ b/debian/mariadb-client-10.8.menu
@@ -1,3 +1,3 @@
# According to /usr/share/menu/ policy 1.4, not /usr/share/doc/debian-policy/
-?package(mariadb-client-10.6):needs="text" section="Applications/Data Management"\
+?package(mariadb-client-10.8):needs="text" section="Applications/Data Management"\
title="Innotop" command="/usr/bin/innotop"
diff --git a/debian/mariadb-client-core-10.6.install b/debian/mariadb-client-core-10.8.install
index 421b62d2a1a..421b62d2a1a 100644
--- a/debian/mariadb-client-core-10.6.install
+++ b/debian/mariadb-client-core-10.8.install
diff --git a/debian/mariadb-client-core-10.6.links b/debian/mariadb-client-core-10.8.links
index 5134dd814b5..5134dd814b5 100644
--- a/debian/mariadb-client-core-10.6.links
+++ b/debian/mariadb-client-core-10.8.links
diff --git a/debian/mariadb-plugin-provider-bzip2.install b/debian/mariadb-plugin-provider-bzip2.install
new file mode 100644
index 00000000000..75a73c384a7
--- /dev/null
+++ b/debian/mariadb-plugin-provider-bzip2.install
@@ -0,0 +1,2 @@
+etc/mysql/mariadb.conf.d/provider_bzip2.cnf
+usr/lib/mysql/plugin/provider_bzip2.so
diff --git a/debian/mariadb-plugin-provider-bzip2.lintian-overrides b/debian/mariadb-plugin-provider-bzip2.lintian-overrides
new file mode 100644
index 00000000000..563c05a3a6b
--- /dev/null
+++ b/debian/mariadb-plugin-provider-bzip2.lintian-overrides
@@ -0,0 +1,3 @@
+# It's intentional that bzip2 compression plugin doesn't have symbols from libc
+# More info https://jira.mariadb.org/browse/MDEV-28120
+library-not-linked-against-libc usr/lib/mysql/plugin/provider_bzip2.so \ No newline at end of file
diff --git a/debian/mariadb-plugin-provider-lz4.install b/debian/mariadb-plugin-provider-lz4.install
new file mode 100644
index 00000000000..a3ba1d77bb3
--- /dev/null
+++ b/debian/mariadb-plugin-provider-lz4.install
@@ -0,0 +1,2 @@
+etc/mysql/mariadb.conf.d/provider_lz4.cnf
+usr/lib/mysql/plugin/provider_lz4.so
diff --git a/debian/mariadb-plugin-provider-lz4.lintian-overrides b/debian/mariadb-plugin-provider-lz4.lintian-overrides
new file mode 100644
index 00000000000..3f7d7e9ecfb
--- /dev/null
+++ b/debian/mariadb-plugin-provider-lz4.lintian-overrides
@@ -0,0 +1,3 @@
+# It's intentional that LZ4 compression plugin doesn't have symbols from libc
+# More info https://jira.mariadb.org/browse/MDEV-28120
+library-not-linked-against-libc usr/lib/mysql/plugin/provider_lz4.so \ No newline at end of file
diff --git a/debian/mariadb-plugin-provider-lzma.install b/debian/mariadb-plugin-provider-lzma.install
new file mode 100644
index 00000000000..4a4138b45c6
--- /dev/null
+++ b/debian/mariadb-plugin-provider-lzma.install
@@ -0,0 +1,2 @@
+etc/mysql/mariadb.conf.d/provider_lzma.cnf
+usr/lib/mysql/plugin/provider_lzma.so
diff --git a/debian/mariadb-plugin-provider-lzma.lintian-overrides b/debian/mariadb-plugin-provider-lzma.lintian-overrides
new file mode 100644
index 00000000000..94eafa766a4
--- /dev/null
+++ b/debian/mariadb-plugin-provider-lzma.lintian-overrides
@@ -0,0 +1,3 @@
+# It's intentional that LZMA compression plugin doesn't have symbols from libc
+# More info https://jira.mariadb.org/browse/MDEV-28120
+library-not-linked-against-libc usr/lib/mysql/plugin/provider_lzma.so \ No newline at end of file
diff --git a/debian/mariadb-plugin-provider-lzo.install b/debian/mariadb-plugin-provider-lzo.install
new file mode 100644
index 00000000000..2bf4c091ddc
--- /dev/null
+++ b/debian/mariadb-plugin-provider-lzo.install
@@ -0,0 +1,2 @@
+etc/mysql/mariadb.conf.d/provider_lzo.cnf
+usr/lib/mysql/plugin/provider_lzo.so
diff --git a/debian/mariadb-plugin-provider-lzo.lintian-overrides b/debian/mariadb-plugin-provider-lzo.lintian-overrides
new file mode 100644
index 00000000000..8184923cf9a
--- /dev/null
+++ b/debian/mariadb-plugin-provider-lzo.lintian-overrides
@@ -0,0 +1,3 @@
+# It's intentional that LZO compression plugin doesn't have symbols from libc
+# More info https://jira.mariadb.org/browse/MDEV-28120
+library-not-linked-against-libc usr/lib/mysql/plugin/provider_lzo.so \ No newline at end of file
diff --git a/debian/mariadb-plugin-provider-snappy.install b/debian/mariadb-plugin-provider-snappy.install
new file mode 100644
index 00000000000..26c929c89ba
--- /dev/null
+++ b/debian/mariadb-plugin-provider-snappy.install
@@ -0,0 +1,2 @@
+etc/mysql/mariadb.conf.d/provider_snappy.cnf
+usr/lib/mysql/plugin/provider_snappy.so
diff --git a/debian/mariadb-plugin-provider-snappy.lintian-overrides b/debian/mariadb-plugin-provider-snappy.lintian-overrides
new file mode 100644
index 00000000000..6c76162573d
--- /dev/null
+++ b/debian/mariadb-plugin-provider-snappy.lintian-overrides
@@ -0,0 +1,3 @@
+# It's intentional that Snappy compression plugin doesn't have symbols from libc
+# More info https://jira.mariadb.org/browse/MDEV-28120
+library-not-linked-against-libc usr/lib/mysql/plugin/provider_snappy.so \ No newline at end of file
diff --git a/debian/mariadb-server-10.6.README.Debian b/debian/mariadb-server-10.8.README.Debian
index 6042249a706..6042249a706 100644
--- a/debian/mariadb-server-10.6.README.Debian
+++ b/debian/mariadb-server-10.8.README.Debian
diff --git a/debian/mariadb-server-10.6.config b/debian/mariadb-server-10.8.config
index 27e2e9f4929..448b51584ea 100644
--- a/debian/mariadb-server-10.6.config
+++ b/debian/mariadb-server-10.8.config
@@ -9,6 +9,6 @@ ${DEBIAN_SCRIPT_TRACE:+ echo "#42#DEBUG# RUNNING $0 $*" 1>&2 }
# Beware that there are two ypwhich one of them needs the 2>/dev/null!
if test -n "`which ypwhich 2>/dev/null`" && ypwhich >/dev/null 2>&1; then
- db_input high mariadb-server-10.6/nis_warning || true
+ db_input high mariadb-server-10.8/nis_warning || true
db_go
fi
diff --git a/debian/mariadb-server-10.6.dirs b/debian/mariadb-server-10.8.dirs
index 5057fe806c3..5057fe806c3 100644
--- a/debian/mariadb-server-10.6.dirs
+++ b/debian/mariadb-server-10.8.dirs
diff --git a/debian/mariadb-server-10.6.install b/debian/mariadb-server-10.8.install
index 4d15f5d8e54..71fe6bc77d5 100644
--- a/debian/mariadb-server-10.6.install
+++ b/debian/mariadb-server-10.8.install
@@ -3,7 +3,7 @@ debian/additions/debian-start.inc.sh usr/share/mysql
debian/additions/echo_stderr usr/share/mysql
debian/additions/mariadb.conf.d/50-mysqld_safe.cnf etc/mysql/mariadb.conf.d
debian/additions/mariadb.conf.d/50-server.cnf etc/mysql/mariadb.conf.d
-debian/additions/source_mariadb-10.6.py usr/share/apport/package-hooks
+debian/additions/source_mariadb-10.8.py usr/share/apport/package-hooks
etc/apparmor.d/usr.sbin.mariadbd
etc/security/user_map.conf
lib/*/security/pam_user_map.so
@@ -45,6 +45,7 @@ usr/lib/mysql/plugin/ha_sphinx.so
usr/lib/mysql/plugin/handlersocket.so
usr/lib/mysql/plugin/locales.so
usr/lib/mysql/plugin/metadata_lock_info.so
+usr/lib/mysql/plugin/password_reuse_check.so
usr/lib/mysql/plugin/query_cache_info.so
usr/lib/mysql/plugin/query_response_time.so
usr/lib/mysql/plugin/server_audit.so
@@ -52,7 +53,7 @@ usr/lib/mysql/plugin/simple_password_check.so
usr/lib/mysql/plugin/sql_errlog.so
usr/lib/mysql/plugin/type_mysql_json.so
usr/lib/mysql/plugin/wsrep_info.so
-usr/share/doc/mariadb-server-10.6/mariadbd.sym.gz
+usr/share/doc/mariadb-server-10.8/mariadbd.sym.gz
usr/share/man/man1/aria_chk.1
usr/share/man/man1/aria_dump_log.1
usr/share/man/man1/aria_ftdump.1
@@ -77,5 +78,6 @@ usr/share/man/man1/wsrep_sst_mysqldump.1
usr/share/man/man1/wsrep_sst_rsync.1
usr/share/man/man1/wsrep_sst_rsync_wan.1
usr/share/mysql/errmsg-utf8.txt
+usr/share/mysql/mini-benchmark
usr/share/mysql/wsrep.cnf
usr/share/mysql/wsrep_notify
diff --git a/debian/mariadb-server-10.6.links b/debian/mariadb-server-10.8.links
index 9cc3a436ba8..9cc3a436ba8 100644
--- a/debian/mariadb-server-10.6.links
+++ b/debian/mariadb-server-10.8.links
diff --git a/debian/mariadb-server-10.6.logcheck.ignore.paranoid b/debian/mariadb-server-10.8.logcheck.ignore.paranoid
index 407d4063270..407d4063270 100644
--- a/debian/mariadb-server-10.6.logcheck.ignore.paranoid
+++ b/debian/mariadb-server-10.8.logcheck.ignore.paranoid
diff --git a/debian/mariadb-server-10.6.logcheck.ignore.server b/debian/mariadb-server-10.8.logcheck.ignore.server
index a64fc54e15c..a64fc54e15c 100644
--- a/debian/mariadb-server-10.6.logcheck.ignore.server
+++ b/debian/mariadb-server-10.8.logcheck.ignore.server
diff --git a/debian/mariadb-server-10.6.logcheck.ignore.workstation b/debian/mariadb-server-10.8.logcheck.ignore.workstation
index a64fc54e15c..a64fc54e15c 100644
--- a/debian/mariadb-server-10.6.logcheck.ignore.workstation
+++ b/debian/mariadb-server-10.8.logcheck.ignore.workstation
diff --git a/debian/mariadb-server-10.6.mariadb.init b/debian/mariadb-server-10.8.mariadb.init
index 0bc7a972e88..efbecd3b498 100644
--- a/debian/mariadb-server-10.6.mariadb.init
+++ b/debian/mariadb-server-10.8.mariadb.init
@@ -180,7 +180,7 @@ case "${1:-''}" in
if ! mariadbd_status check_dead warn; then
log_end_msg 1
- log_failure_msg "Please stop MariaDB manually and read /usr/share/doc/mariadb-server-10.6/README.Debian.gz!"
+ log_failure_msg "Please stop MariaDB manually and read /usr/share/doc/mariadb-server-10.8/README.Debian.gz!"
exit -1
else
log_end_msg 0
diff --git a/debian/mariadb-server-10.6.mysql-server.logrotate b/debian/mariadb-server-10.8.mysql-server.logrotate
index 11e4480c427..11e4480c427 100644
--- a/debian/mariadb-server-10.6.mysql-server.logrotate
+++ b/debian/mariadb-server-10.8.mysql-server.logrotate
diff --git a/debian/mariadb-server-10.6.mysql.default b/debian/mariadb-server-10.8.mysql.default
index 36079edecb2..36079edecb2 100644
--- a/debian/mariadb-server-10.6.mysql.default
+++ b/debian/mariadb-server-10.8.mysql.default
diff --git a/debian/mariadb-server-10.6.postinst b/debian/mariadb-server-10.8.postinst
index a259a50ac55..a259a50ac55 100644
--- a/debian/mariadb-server-10.6.postinst
+++ b/debian/mariadb-server-10.8.postinst
diff --git a/debian/mariadb-server-10.6.postrm b/debian/mariadb-server-10.8.postrm
index 94ce91db31d..94ce91db31d 100644
--- a/debian/mariadb-server-10.6.postrm
+++ b/debian/mariadb-server-10.8.postrm
diff --git a/debian/mariadb-server-10.6.preinst b/debian/mariadb-server-10.8.preinst
index 79c6ccc8500..79c6ccc8500 100644
--- a/debian/mariadb-server-10.6.preinst
+++ b/debian/mariadb-server-10.8.preinst
diff --git a/debian/mariadb-server-10.6.prerm b/debian/mariadb-server-10.8.prerm
index 8fd172da9d2..8fd172da9d2 100644
--- a/debian/mariadb-server-10.6.prerm
+++ b/debian/mariadb-server-10.8.prerm
diff --git a/debian/mariadb-server-10.6.templates b/debian/mariadb-server-10.8.templates
index 32e908c71e9..910ba82f108 100644
--- a/debian/mariadb-server-10.6.templates
+++ b/debian/mariadb-server-10.8.templates
@@ -7,7 +7,7 @@
# Even minor modifications require translation updates and such
# changes should be coordinated with translators and reviewers.
-Template: mariadb-server-10.6/old_data_directory_saved
+Template: mariadb-server-10.8/old_data_directory_saved
Type: note
_Description: The old data directory will be saved at new location
A file named /var/lib/mysql/debian-*.flag exists on this system.
@@ -19,7 +19,7 @@ _Description: The old data directory will be saved at new location
.
Please manually export/import your data (e.g. with mysqldump) if needed.
-Template: mariadb-server-10.6/nis_warning
+Template: mariadb-server-10.8/nis_warning
Type: note
#flag:translate!:3,5
_Description: Important note for NIS/YP users
@@ -33,7 +33,7 @@ _Description: Important note for NIS/YP users
.
/var/lib/mysql: drwxr-xr-x mysql mysql
-Template: mariadb-server-10.6/postrm_remove_databases
+Template: mariadb-server-10.8/postrm_remove_databases
Type: boolean
Default: false
_Description: Remove all MariaDB databases?
diff --git a/debian/mariadb-server-10.6.triggers b/debian/mariadb-server-10.8.triggers
index d1f5f5e14f1..d1f5f5e14f1 100644
--- a/debian/mariadb-server-10.6.triggers
+++ b/debian/mariadb-server-10.8.triggers
diff --git a/debian/mariadb-server-core-10.6.install b/debian/mariadb-server-core-10.8.install
index def95268512..def95268512 100644
--- a/debian/mariadb-server-core-10.6.install
+++ b/debian/mariadb-server-core-10.8.install
diff --git a/debian/mariadb-server-core-10.6.links b/debian/mariadb-server-core-10.8.links
index c2be98f38fb..c2be98f38fb 100644
--- a/debian/mariadb-server-core-10.6.links
+++ b/debian/mariadb-server-core-10.8.links
diff --git a/debian/not-installed b/debian/not-installed
index 6924c9ad1a5..c7566c237d1 100644
--- a/debian/not-installed
+++ b/debian/not-installed
@@ -16,15 +16,15 @@ usr/lib/*/libdbbc.a # ColumnStore header file
usr/lib/*/libidbboot.a # ColumnStore header file
usr/lib/*/libprocessor.a # ColumnStore header file
usr/lib/*/libwe_xml.a # ColumnStore header file
-usr/share/doc/mariadb-server-10.6/COPYING
-usr/share/doc/mariadb-server-10.6/COPYING.AGPLv3
-usr/share/doc/mariadb-server-10.6/COPYING.GPLv2
-usr/share/doc/mariadb-server-10.6/COPYING.thirdparty
-usr/share/doc/mariadb-server-10.6/CREDITS
-usr/share/doc/mariadb-server-10.6/EXCEPTIONS-CLIENT
-usr/share/doc/mariadb-server-10.6/INSTALL-BINARY
-usr/share/doc/mariadb-server-10.6/PATENTS
-usr/share/doc/mariadb-server-10.6/README-wsrep
+usr/share/doc/mariadb-server-10.8/COPYING
+usr/share/doc/mariadb-server-10.8/COPYING.AGPLv3
+usr/share/doc/mariadb-server-10.8/COPYING.GPLv2
+usr/share/doc/mariadb-server-10.8/COPYING.thirdparty
+usr/share/doc/mariadb-server-10.8/CREDITS
+usr/share/doc/mariadb-server-10.8/EXCEPTIONS-CLIENT
+usr/share/doc/mariadb-server-10.8/INSTALL-BINARY
+usr/share/doc/mariadb-server-10.8/PATENTS
+usr/share/doc/mariadb-server-10.8/README-wsrep
usr/share/groonga/COPYING
usr/share/groonga-normalizer-mysql/lgpl-2.0.txt
usr/share/groonga-normalizer-mysql/README.md
diff --git a/debian/po/POTFILES.in b/debian/po/POTFILES.in
index 17bbe40ee92..dd5f492240d 100644
--- a/debian/po/POTFILES.in
+++ b/debian/po/POTFILES.in
@@ -1 +1 @@
-[type: gettext/rfc822deb] mariadb-server-10.6.templates
+[type: gettext/rfc822deb] mariadb-server-10.8.templates
diff --git a/debian/po/ar.po b/debian/po/ar.po
index 8512209efbb..0a68a467664 100644
--- a/debian/po/ar.po
+++ b/debian/po/ar.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: templates\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2007-05-01 13:04+0300\n"
"Last-Translator: Ossama M. Khayat <okhayat@yahoo.com>\n"
@@ -27,13 +27,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -42,7 +42,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -50,20 +50,20 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "ملاحظة هامة لمستخدمي NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -71,7 +71,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
#, fuzzy
#| msgid ""
#| "You should also check the permissions and the owner of the /var/lib/mysql "
@@ -83,13 +83,13 @@ msgstr "عليك أيضاً أن تقوم بالتأكد من صلاحيات Ù…Ø
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "إزالة جميع قواعد بيانات MariaDB؟"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -97,7 +97,7 @@ msgstr "الدليل /var/lib/mysql الذي يحتوي قواعد بيانات
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/ca.po b/debian/po/ca.po
index d9c69e19983..d8fe9eeb97e 100644
--- a/debian/po/ca.po
+++ b/debian/po/ca.po
@@ -1,12 +1,12 @@
# mariadb (debconf) translation to Catalan.
-# his file is distributed under the same license as the mariadb-10.6 package.
+# his file is distributed under the same license as the mariadb-10.8 package.
# Aleix Badia i Bosch <abadia@ica.es> 2004
# Innocent De Marchi <tangram.peces@gmail.com> 2017
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2017-03-20 17:55+0100\n"
"Last-Translator: Innocent De Marchi <tangram.peces@gmail.com>\n"
@@ -19,13 +19,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "El directori de dades antigues es desarà a una nova localització"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -37,7 +37,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -47,7 +47,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -56,13 +56,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Nota important pels usuaris de «NIS/YP»"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -72,7 +72,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -82,13 +82,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Eliminar totes les bases de dades MariaDB?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -98,7 +98,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/cs.po b/debian/po/cs.po
index 8176d86457b..4eefea44b5c 100644
--- a/debian/po/cs.po
+++ b/debian/po/cs.po
@@ -13,8 +13,8 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2020-10-18 17:13+0200\n"
"Last-Translator: Miroslav Kure <kurem@debian.cz>\n"
@@ -26,13 +26,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "Starý adresář s daty bude uložen na novém místě."
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -44,7 +44,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -54,7 +54,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -63,13 +63,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Důležitá poznámka pro uživatele NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -79,7 +79,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -88,13 +88,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Odstranit všechny MariaDB databáze?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -104,7 +104,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/da.po b/debian/po/da.po
index 4de2e4e7057..c4b43d2bf38 100644
--- a/debian/po/da.po
+++ b/debian/po/da.po
@@ -1,13 +1,13 @@
-# Danish translation mariadb-10.6.
-# Copyright (C) 2014 mariadb-10.6 og nedenstående oversættere.
-# This file is distributed under the same license as the mariadb-10.6 package.
+# Danish translation mariadb-10.8.
+# Copyright (C) 2014 mariadb-10.8 og nedenstående oversættere.
+# This file is distributed under the same license as the mariadb-10.8 package.
# Claus Hindsgaul <claus.hindsgaul@gmail.com>, 2005, 2006, 2007.
# Joe Hansen <joedalton2@yahoo.dk>, 2014, 2016.
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2016-07-09 22:41+0200\n"
"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
@@ -19,13 +19,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "Den gamle datamappe vil blive gemt på en ny placering"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -37,7 +37,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -47,7 +47,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -56,13 +56,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Vigtig oplysning til NIS/YP-brugere"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -72,7 +72,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -82,13 +82,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Fjern alle MariaDB-databaser?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -98,7 +98,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/de.po b/debian/po/de.po
index 2228a07e27d..1d0f80e42e2 100644
--- a/debian/po/de.po
+++ b/debian/po/de.po
@@ -1,4 +1,4 @@
-# German translation of mariadb-10.6 10.0.13-1
+# German translation of mariadb-10.8 10.0.13-1
# Alwin Meschede <ameschede@gmx.de>, 2006, 2007.
# Thomas Mueller <thomas.mueller@tmit.eu>, 2009.
# Chris Leick <c.leick@vollbio.de>, 2014-2016.
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: mariadb 10.0.25-1\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2016-05-12 22:39+0100\n"
"Last-Translator: Chris Leick <c.leick@vollbio.de>\n"
@@ -19,13 +19,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "Das alte Datenverzeichnis wird an einer neuen Stelle gespeichert"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -37,7 +37,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -47,7 +47,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -56,13 +56,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Wichtige Anmerkung für NIS/YP-Benutzer!"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -72,7 +72,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -82,13 +82,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Alle MariaDB-Datenbanken entfernen?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -98,7 +98,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/es.po b/debian/po/es.po
index db5a8bbf7a6..367e8ee2fe0 100644
--- a/debian/po/es.po
+++ b/debian/po/es.po
@@ -40,7 +40,7 @@
msgid ""
msgstr ""
"Project-Id-Version: mysql-dfsg-5.1_5.0.24-3\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2016-04-30 21:26+0200\n"
"Last-Translator: Javier Fernández-Sanguino <jfs@debian.org>\n"
@@ -54,13 +54,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "Se guardará el directorio antiguo de datos a la nueva ubicación"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -72,7 +72,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -82,7 +82,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -91,13 +91,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Nota importante para los usuarios de NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -107,7 +107,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -117,13 +117,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "¿Desea eliminar todas las bases de datos MariaDB?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -133,7 +133,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/eu.po b/debian/po/eu.po
index 191d92b615e..715cff3f39d 100644
--- a/debian/po/eu.po
+++ b/debian/po/eu.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: eu\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2009-07-29 11:59+0200\n"
"Last-Translator: Piarres Beobide <pi@beobide.net>\n"
@@ -20,13 +20,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -35,7 +35,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -43,20 +43,20 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "NIS/YP erabiltzaileentzat ohar garrantzitsua"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -64,7 +64,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
#, fuzzy
#| msgid ""
#| "You should also check the permissions and the owner of the /var/lib/mysql "
@@ -78,13 +78,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Ezabatu MariaDB datubase guztiak?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -93,7 +93,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/fi.po b/debian/po/fi.po
index 16e310b8c6a..1e10a5042c7 100644
--- a/debian/po/fi.po
+++ b/debian/po/fi.po
@@ -1,11 +1,11 @@
-# Finnish translations for mariadb-10.6 package
-# This file is distributed under the same license as the mariadb-10.6 package.
+# Finnish translations for mariadb-10.8 package
+# This file is distributed under the same license as the mariadb-10.8 package.
# Antti Järvinen <antti.jarvinen@katiska.org>, 2017.
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2017-03-15 22:36+0200\n"
"Last-Translator: antti.jarvinen@katiska.org\n"
@@ -19,13 +19,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "Vanha datahakemisto tullaan tallentamaan uuteen paikkaan"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -37,7 +37,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -47,7 +47,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -56,13 +56,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Merkittävä huomio NIS/YP -käyttäjille"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -72,7 +72,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -80,13 +80,13 @@ msgstr "Tarkista myös hakemiston /var/lib/mysql omistaja ja oikeudet:"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Poistetaanko kaikki MariaDB-tietokannat?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -95,7 +95,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/fr.po b/debian/po/fr.po
index 1604203696b..bb408ebbf18 100644
--- a/debian/po/fr.po
+++ b/debian/po/fr.po
@@ -1,6 +1,6 @@
-# Translation of mariadb-10.6 debconf templates to French
+# Translation of mariadb-10.8 debconf templates to French
# Copyright (C) 2004-2016 Debian French l10n team <debian-l10n-french@lists.debian.org>
-# This file is distributed under the same license as the mariadb-10.6 packages.
+# This file is distributed under the same license as the mariadb-10.8 packages.
#
# Translators:
# Christian Perrier <bubulle@debian.org>, 2004, 2006, 2007, 2009, 2013.
@@ -8,7 +8,7 @@
msgid ""
msgstr ""
"Project-Id-Version: fr\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2016-12-31 18:35+0100\n"
"Last-Translator: Baptiste Jammet <baptiste@mailoo.org>\n"
@@ -23,13 +23,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "L'ancien répertoire de données sera sauvegardé à un nouvel emplacement"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -41,7 +41,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -51,7 +51,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -60,13 +60,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Note importante pour les utilisateurs NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -76,7 +76,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -86,13 +86,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Faut-il supprimer toutes les bases de données MariaDB ?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -102,7 +102,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/gl.po b/debian/po/gl.po
index d84a745a732..267a78e3cd4 100644
--- a/debian/po/gl.po
+++ b/debian/po/gl.po
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: mysql-dfsg-5.1\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2007-04-20 09:44+0200\n"
"Last-Translator: Jacobo Tarrio <jtarrio@debian.org>\n"
@@ -17,13 +17,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -32,7 +32,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -40,20 +40,20 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Nota importante para os usuarios de NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -61,7 +61,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
#, fuzzy
#| msgid ""
#| "You should also check the permissions and the owner of the /var/lib/mysql "
@@ -75,13 +75,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "¿Eliminar tódalas bases de datos de MariaDB?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -91,7 +91,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/it.po b/debian/po/it.po
index 54b9e980b1c..10bf8a78671 100644
--- a/debian/po/it.po
+++ b/debian/po/it.po
@@ -1,11 +1,11 @@
-# Italian (it) translation of debconf templates for mariadb-10.6
-# This file is distributed under the same license as the mariadb-10.6 package.
+# Italian (it) translation of debconf templates for mariadb-10.8
+# This file is distributed under the same license as the mariadb-10.8 package.
# Luca Monducci <luca.mo@tiscali.it>, 2006-2017.
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6 10.0.13 Italian debconf templates\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8 10.0.13 Italian debconf templates\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2017-083-20 20:29+0100\n"
"Last-Translator: Luca Monducci <luca.mo@tiscali.it>\n"
@@ -17,13 +17,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "La vecchia directory data verrà salvata in una nuova posizione"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -35,7 +35,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -45,7 +45,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -54,13 +54,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Nota importante per gli utenti NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -70,7 +70,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -80,13 +80,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Eliminare tutti i database MariaDB?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -96,7 +96,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/ja.po b/debian/po/ja.po
index c7a3bea42ce..9131a8382f5 100644
--- a/debian/po/ja.po
+++ b/debian/po/ja.po
@@ -15,8 +15,8 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6 10.0.32-1\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8 10.0.32-1\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2016-05-01 11:27+0900\n"
"Last-Translator: Takuma Yamada <tyamada@takumayamada.com>\n"
@@ -30,13 +30,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "å¤ã„データディレクトリã¯ã€æ–°ã—ã„場所ã«ä¿å­˜ã•ã‚Œã¾ã™"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -48,7 +48,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -58,7 +58,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -67,13 +67,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "NIS/YP ユーザã¸ã®é‡è¦ãªæ³¨æ„"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -83,7 +83,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -91,13 +91,13 @@ msgstr "/var/lib/mysql ã®æ‰€æœ‰è€…権é™ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹å¿…è¦ã‚‚ã‚ã‚Šã¾
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "ã™ã¹ã¦ã® MariaDB データベースを削除ã—ã¾ã™ã‹?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -107,7 +107,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/nb.po b/debian/po/nb.po
index b11a70c3a0e..92f0b0eb55d 100644
--- a/debian/po/nb.po
+++ b/debian/po/nb.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: mysql_nb\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2007-02-18 12:13+0100\n"
"Last-Translator: Bjørn Steensrud <bjornst@powertech.no>\n"
@@ -19,13 +19,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -34,7 +34,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -42,14 +42,14 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
#, fuzzy
#| msgid "Important note for NIS/YP users!"
msgid "Important note for NIS/YP users"
@@ -57,7 +57,7 @@ msgstr "Viktig merknad for NIS/YP-brukere!"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -65,7 +65,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -73,13 +73,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -87,7 +87,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
#, fuzzy
#| msgid ""
#| "The script is about to remove the data directory /var/lib/mysql. If it is "
diff --git a/debian/po/nl.po b/debian/po/nl.po
index 90e6ea767bb..e1907112182 100644
--- a/debian/po/nl.po
+++ b/debian/po/nl.po
@@ -1,13 +1,13 @@
# Dutch mariadb-10 po-debconf translation,
# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the mariadb-10.6 package.
+# This file is distributed under the same license as the mariadb-10.8 package.
# Vincent Zweije <zweije@xs4all.nl>, 2006.
# Frans Spiesschaert <Frans.Spiesschaert@yucom.be>, 2014, 2016, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: mariadb-10.2.7-1\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2018-03-29 21:25+0200\n"
"Last-Translator: Frans Spiesschaert <Frans.Spiesschaert@yucom.be>\n"
@@ -21,13 +21,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "De oude data-map zal op een nieuwe locatie bewaard worden"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -39,7 +39,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -49,7 +49,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -58,13 +58,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Belangrijke opmerking voor gebruikers van NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -74,7 +74,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -84,13 +84,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Wilt u alle MariaDB-databases verwijderen?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -100,7 +100,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/pt.po b/debian/po/pt.po
index 4df8e3540a8..997dfccd617 100644
--- a/debian/po/pt.po
+++ b/debian/po/pt.po
@@ -6,8 +6,8 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2017-08-06 10:00+0100\n"
"Last-Translator: Rui Branco <ruipb@debianpt.org>\n"
@@ -20,13 +20,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "O antigo directório de data será guardado num novo local"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -38,7 +38,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -48,7 +48,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -57,13 +57,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Nota importante para os utilizadores de NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -73,7 +73,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -82,13 +82,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Remover todas as bases de dados MariaDB?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -98,7 +98,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/pt_BR.po b/debian/po/pt_BR.po
index cf8127236e5..ac94a297e2a 100644
--- a/debian/po/pt_BR.po
+++ b/debian/po/pt_BR.po
@@ -1,12 +1,12 @@
-# Debconf translations for mariadb-10.6.
-# This file is distributed under the same license as the mariadb-10.6 package.
+# Debconf translations for mariadb-10.8.
+# This file is distributed under the same license as the mariadb-10.8 package.
# André Luís Lopes, <andrelop@debian.org>, 2005-2007.
# Adriano Rafael Gomes <adrianorg@arg.eti.br>, 2015-2016.
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2016-04-30 16:16-0300\n"
"Last-Translator: Adriano Rafael Gomes <adrianorg@arg.eti.br>\n"
@@ -19,13 +19,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "O diretório de dados antigo será salvo em novo local"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -37,7 +37,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -47,7 +47,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -56,13 +56,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Aviso importante para usuários NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -72,7 +72,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -82,13 +82,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Remover todas as bases de dados do MariaDB?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -98,7 +98,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/ro.po b/debian/po/ro.po
index 869a5efddd2..b728a4e4235 100644
--- a/debian/po/ro.po
+++ b/debian/po/ro.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: po-debconf://mysql-dfsg\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2006-12-20 21:27+0200\n"
"Last-Translator: stan ioan-eugen <stan.ieugen@gmail.com>\n"
@@ -19,13 +19,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -34,7 +34,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -42,14 +42,14 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
#, fuzzy
#| msgid "Important note for NIS/YP users!"
msgid "Important note for NIS/YP users"
@@ -57,7 +57,7 @@ msgstr "Notă importantă pentru utilizatorii NIS/YP!"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -65,7 +65,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -73,13 +73,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -87,7 +87,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
#, fuzzy
#| msgid ""
#| "The script is about to remove the data directory /var/lib/mysql. If it is "
diff --git a/debian/po/ru.po b/debian/po/ru.po
index 01152031369..db74169593b 100644
--- a/debian/po/ru.po
+++ b/debian/po/ru.po
@@ -6,8 +6,8 @@
# Yuri Kozlov <yuray@komyakino.ru>, 2009, 2014, 2016.
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6 10.0.25-1\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8 10.0.25-1\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2016-05-04 18:56+0300\n"
"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
@@ -22,13 +22,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "Каталог Ñо Ñтарыми данными будет Ñохранён в новом меÑте"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -40,7 +40,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -51,7 +51,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -60,13 +60,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Важное замечание Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -76,7 +76,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -84,13 +84,13 @@ msgstr "Также проверьте права доÑтупа и владелÑ
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Удалить вÑе базы данных MariaDB?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -99,7 +99,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/sv.po b/debian/po/sv.po
index 0c44b9923df..85674730c3a 100644
--- a/debian/po/sv.po
+++ b/debian/po/sv.po
@@ -1,13 +1,13 @@
-# Translation of mariadb-10.6 debconf template to Swedish
+# Translation of mariadb-10.8 debconf template to Swedish
# Copyright (C) 2017 Martin Bagge <brother@bsnet.se>
-# This file is distributed under the same license as the mariadb-10.6 package.
+# This file is distributed under the same license as the mariadb-10.8 package.
#
# Andreas Henriksson <andreas@fatal.se>, 2007
# Martin Bagge <brother@bsnet.se>, 2009, 2015, 2017
msgid ""
msgstr ""
"Project-Id-Version: mysql-dfsg-5.1 5.0.21-3\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2017-03-23 09:20+0100\n"
"Last-Translator: Martin Bagge / brother <brother@bsnet.se>\n"
@@ -20,13 +20,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "Den gamla data-katalogen kommer att sparas till en ny plats"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -38,7 +38,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -48,7 +48,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -57,13 +57,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Viktig information för NIS/YP-användare"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -73,7 +73,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -83,13 +83,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Ta bort alla MariaDB-databaser?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -99,7 +99,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/templates.pot b/debian/po/templates.pot
index 73febcc0174..904d356ce1e 100644
--- a/debian/po/templates.pot
+++ b/debian/po/templates.pot
@@ -1,13 +1,13 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the mariadb-10.6 package.
+# This file is distributed under the same license as the mariadb-10.8 package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
@@ -19,13 +19,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -34,7 +34,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -42,20 +42,20 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -63,7 +63,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -71,13 +71,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -85,7 +85,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/tr.po b/debian/po/tr.po
index 9d292dad46c..cacd305029e 100644
--- a/debian/po/tr.po
+++ b/debian/po/tr.po
@@ -5,8 +5,8 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2017-03-16 13:16+0300\n"
"Last-Translator: Atila KOÇ <koc@artielektronik.com.tr>\n"
@@ -20,13 +20,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "Eski veritabanı dizini yeni konumuna kaydedilecektir"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -38,7 +38,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -48,20 +48,20 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr "Gerektiğinde verinizi elle (ör. mysqldump ile) içe/dışa aktarın."
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "NIS/YP kullanıcıları için önemli not"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -71,7 +71,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -81,13 +81,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Tüm MariaDB veritabanları kaldırılsın mı?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -96,7 +96,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/po/vi.po b/debian/po/vi.po
index 3aa7e3f3d25..c1dd1c22e10 100644
--- a/debian/po/vi.po
+++ b/debian/po/vi.po
@@ -1,12 +1,12 @@
-# Vietnamese translations for mariadb-10.6 package
-# Bản dịch Tiếng Việt dành cho gói mariadb-10.6.
-# This file is distributed under the same license as the mariadb-10.6 package.
+# Vietnamese translations for mariadb-10.8 package
+# Bản dịch Tiếng Việt dành cho gói mariadb-10.8.
+# This file is distributed under the same license as the mariadb-10.8 package.
# Trần Ngá»c Quân <vnwildman@gmail.com>, 2017.
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.6\n"
-"Report-Msgid-Bugs-To: mariadb-10.6@packages.debian.org\n"
+"Project-Id-Version: mariadb-10.8\n"
+"Report-Msgid-Bugs-To: mariadb-10.8@packages.debian.org\n"
"POT-Creation-Date: 2019-07-23 19:16-0300\n"
"PO-Revision-Date: 2017-03-18 13:32+0700\n"
"Last-Translator: Trần Ngá»c Quân <vnwildman@gmail.com>\n"
@@ -20,13 +20,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid "The old data directory will be saved at new location"
msgstr "Thư mục dữ liệu cũ sẽ được lưu tại vị trí mới"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"A file named /var/lib/mysql/debian-*.flag exists on this system. The number "
"indicates a database binary format version that cannot automatically be "
@@ -38,7 +38,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Therefore the previous data directory will be renamed to /var/lib/mysql-* "
"and a new data directory will be initialized at /var/lib/mysql."
@@ -48,7 +48,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:2001
+#: ../mariadb-server-10.8.templates:2001
msgid ""
"Please manually export/import your data (e.g. with mysqldump) if needed."
msgstr ""
@@ -57,13 +57,13 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Chú ý quan trá»ng cho ngÆ°á»i dùng NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"Using MariaDB under NIS/YP requires a mysql user account to be added on the "
"local system with:"
@@ -73,7 +73,7 @@ msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.6.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid ""
"You should also check the permissions and ownership of the /var/lib/mysql "
"directory:"
@@ -82,13 +82,13 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Xóa bá» má»i cÆ¡ sở dữ liệu MariaDB chứ?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"The /var/lib/mysql directory which contains the MariaDB databases is about "
"to be removed."
@@ -98,7 +98,7 @@ msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.6.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid ""
"If you're removing the MariaDB package in order to later install a more "
"recent version or if a different mariadb-server package is already using it, "
diff --git a/debian/rules b/debian/rules
index 7dcc9a2ba3c..2bf1c948676 100755
--- a/debian/rules
+++ b/debian/rules
@@ -139,12 +139,12 @@ override_dh_auto_install:
ifneq (,$(filter linux,$(DEB_HOST_ARCH_OS)))
# Copy systemd files to a location available for dh_installinit
- cp $(BUILDDIR)/support-files/mariadb.service debian/mariadb-server-10.6.mariadb.service
- cp $(BUILDDIR)/support-files/mariadb.socket debian/mariadb-server-10.6.mariadb.socket
- cp $(BUILDDIR)/support-files/mariadb-extra.socket debian/mariadb-server-10.6.mariadb-extra.socket
- cp $(BUILDDIR)/support-files/mariadb@.service debian/mariadb-server-10.6.mariadb@.service
- cp $(BUILDDIR)/support-files/mariadb@.socket debian/mariadb-server-10.6.mariadb@.socket
- cp $(BUILDDIR)/support-files/mariadb-extra@.socket debian/mariadb-server-10.6.mariadb-extra@.socket
+ cp $(BUILDDIR)/support-files/mariadb.service debian/mariadb-server-10.8.mariadb.service
+ cp $(BUILDDIR)/support-files/mariadb.socket debian/mariadb-server-10.8.mariadb.socket
+ cp $(BUILDDIR)/support-files/mariadb-extra.socket debian/mariadb-server-10.8.mariadb-extra.socket
+ cp $(BUILDDIR)/support-files/mariadb@.service debian/mariadb-server-10.8.mariadb@.service
+ cp $(BUILDDIR)/support-files/mariadb@.socket debian/mariadb-server-10.8.mariadb@.socket
+ cp $(BUILDDIR)/support-files/mariadb-extra@.socket debian/mariadb-server-10.8.mariadb-extra@.socket
endif
# Run 'make install' without output since it is uninteresting and
@@ -163,7 +163,7 @@ endif
# nm numeric soft is not enough, therefore extra sort in command
# to satisfy Debian reproducible build requirements
- nm --defined-only $(BUILDDIR)/sql/mariadbd | LC_ALL=C sort | gzip -n -9 > $(TMP)/usr/share/doc/mariadb-server-10.6/mariadbd.sym.gz
+ nm --defined-only $(BUILDDIR)/sql/mariadbd | LC_ALL=C sort | gzip -n -9 > $(TMP)/usr/share/doc/mariadb-server-10.8/mariadbd.sym.gz
# Rename and install AppArmor profile
install -D -m 644 debian/apparmor-profile $(TMP)/etc/apparmor.d/usr.sbin.mariadbd
diff --git a/debian/salsa-ci.yml b/debian/salsa-ci.yml
index 436756a5e6c..7332b9bbcf1 100644
--- a/debian/salsa-ci.yml
+++ b/debian/salsa-ci.yml
@@ -237,7 +237,7 @@ fresh install:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb-10.6 Sid upgrade:
+mariadb-10.8 Sid upgrade:
stage: upgrade in Sid
needs:
- job: build
@@ -258,7 +258,7 @@ mariadb-10.6 Sid upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb-10.5 Bullseye to mariadb-10.6 upgrade:
+mariadb-10.5 Bullseye to mariadb-10.8 upgrade:
stage: upgrade from Bullseye
needs:
- job: build
@@ -286,7 +286,7 @@ mariadb-10.5 Bullseye to mariadb-10.6 upgrade:
# Upgrade of libcrypt.so.1 no longer possible from Buster to Sid,
# so test upgrade only inside Buster (https://bugs.debian.org/993755)
-mariadb-10.3 to mariadb-10.6 upgrade in Buster:
+mariadb-10.3 to mariadb-10.8 upgrade in Buster:
stage: upgrade extras
needs:
- job: build buster-backports
@@ -515,7 +515,7 @@ default-libmysqlclient-dev upgrade in Buster:
# Upgrading from MySQL 8.0 with datadir in place is not possible. Users need to do a data dump.
# The Debian maintainer scripts detect this situation and simply moves old datadir aside and start fresh.
-mysql-8.0 Sid to mariadb-10.6 upgrade:
+mysql-8.0 Sid to mariadb-10.8 upgrade:
stage: upgrade in Sid
needs:
- job: build
@@ -554,7 +554,7 @@ mysql-8.0 Sid to mariadb-10.6 upgrade:
# Upgrading from MySQL 8.0 with datadir in place is not possible. Users need to do a data dump.
# The Debian maintainer scripts detect this situation and simply moves old datadir aside and start fresh.
-mysql-8.0 Focal to mariadb-10.6 upgrade in Buster:
+mysql-8.0 Focal to mariadb-10.8 upgrade in Buster:
stage: upgrade extras
needs:
- job: build buster-backports
@@ -587,7 +587,47 @@ mysql-8.0 Focal to mariadb-10.6 upgrade in Buster:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb.org-10.6 to mariadb-10.6 upgrade:
+mariadb.org-10.7 to mariadb-10.8 upgrade:
+ stage: upgrade extras
+ needs:
+ - job: build
+ image: debian:${RELEASE}
+ artifacts:
+ when: always
+ name: "$CI_BUILD_NAME"
+ paths:
+ - ${WORKING_DIR}/debug
+ script:
+ - *test-prepare-container
+ - apt install -y curl
+ - curl -sS https://mariadb.org/mariadb_release_signing_key.asc -o /etc/apt/trusted.gpg.d/mariadb.asc
+ - echo "deb https://deb.mariadb.org/10.7/debian ${RELEASE} main" > /etc/apt/sources.list.d/mariadb.list
+ - apt-get update
+ # Package libmariadbclient-dev from mariadb.org conflicts with libmariadb-dev in Sid, so cannot use wildcard that would include it
+ # Enable this line when there is a way to install them only from the mariadb.org repo
+ # - apt-get install -y 'mariadb*' libmariadb3 'libmariadb-*' 'libmariadbd*'
+ - apt-get install -y mariadb-server-10.7
+ - *test-verify-initial
+ # Install MariaDB built in this commit
+ # Force downgrades so our version installs on top of upstream revision, e.g. 1:10.5.5-1 vs 1:10.5.5+mariadb~sid
+ - apt-get install -y --allow-downgrades ./*.deb
+ # Verify installation of MariaDB built in this commit
+ - dpkg -l | grep -iE 'maria|mysql|galera' || true # List installed
+ - mariadb --version # Client version
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.8
+ - *test-verify-final
+ variables:
+ GIT_STRATEGY: none
+ except:
+ variables:
+ - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
+ allow_failure: true
+ # Installation on Sid fails on missing liburing1 because upstream 10.8
+ # MariaDB.org buildbot has not run 'apt upgrade' for a long time.
+ # Remove this allow_failure once buildbot has built a new 10.8
+ # release using latest liburing-dev in Debian Sid.
+
+mariadb.org-10.6 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build
@@ -622,7 +662,7 @@ mariadb.org-10.6 to mariadb-10.6 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb.org-10.5 to mariadb-10.6 upgrade:
+mariadb.org-10.5 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build
@@ -652,7 +692,7 @@ mariadb.org-10.5 to mariadb-10.6 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb.org-10.4 to mariadb-10.6 upgrade:
+mariadb.org-10.4 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build
@@ -685,7 +725,7 @@ mariadb.org-10.4 to mariadb-10.6 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb.org-10.3 to mariadb-10.6 upgrade:
+mariadb.org-10.3 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build
@@ -716,7 +756,7 @@ mariadb.org-10.3 to mariadb-10.6 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb.org-10.2 to mariadb-10.6 upgrade:
+mariadb.org-10.2 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build
@@ -755,7 +795,7 @@ mariadb.org-10.2 to mariadb-10.6 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mysql.com-5.7 to mariadb-10.6 upgrade in Buster:
+mysql.com-5.7 to mariadb-10.8 upgrade in Buster:
stage: upgrade extras
needs:
- job: build buster-backports
@@ -786,7 +826,7 @@ mysql.com-5.7 to mariadb-10.6 upgrade in Buster:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-percona-xtradb-5.7 to mariadb-10.6 upgrade in Buster (MDEV-22679):
+percona-xtradb-5.7 to mariadb-10.8 upgrade in Buster (MDEV-22679):
stage: upgrade extras
needs:
- job: build buster-backports
diff --git a/debian/source/lintian-overrides b/debian/source/lintian-overrides
index 0c9b8bcb7e1..a3f95200f5d 100644
--- a/debian/source/lintian-overrides
+++ b/debian/source/lintian-overrides
@@ -1,13 +1,13 @@
# Necessary for drop-in-place-replacement upgrades on mysql-server/-client
# since package breaks/replaces these but at the same time also provides them
-version-substvar-for-external-package mariadb-client-core-10.6 -> mysql-client-5.5
-version-substvar-for-external-package mariadb-server-10.6 -> mysql-server
+version-substvar-for-external-package mariadb-client-core-10.8 -> mysql-client-5.5
+version-substvar-for-external-package mariadb-server-10.8 -> mysql-server
version-substvar-for-external-package libmariadb-dev -> libmysqlclient-dev
version-substvar-for-external-package libmariadb-dev -> libmysqld-dev
-version-substvar-for-external-package mariadb-server-10.6 -> mysql-client-5.*
-version-substvar-for-external-package mariadb-server-10.6 -> mysql-client-8.*
-version-substvar-for-external-package mariadb-client-10.6 -> mysql-client-core-5.*
-version-substvar-for-external-package mariadb-client-10.6 -> mysql-client-core-8.*
+version-substvar-for-external-package mariadb-server-10.8 -> mysql-client-5.*
+version-substvar-for-external-package mariadb-server-10.8 -> mysql-client-8.*
+version-substvar-for-external-package mariadb-client-10.8 -> mysql-client-core-5.*
+version-substvar-for-external-package mariadb-client-10.8 -> mysql-client-core-8.*
version-substvar-for-external-package libmariadbd-dev -> libmariadbclient-dev
# ColumnStore not used in Debian, safe to ignore. Reported upstream in https://jira.mariadb.org/browse/MDEV-24124
source-is-missing storage/columnstore/columnstore/utils/jemalloc/libjemalloc.so.2
diff --git a/debian/tests/control b/debian/tests/control
index 68067071c6b..743f6497702 100644
--- a/debian/tests/control
+++ b/debian/tests/control
@@ -3,7 +3,12 @@ Tests: smoke
# for its existence (see the list in debian/control), install it if available
# and check in the test if it's functional when it should be.
# The plugin package also already depends on the other one.
-Depends: mariadb-plugin-rocksdb | mariadb-server-10.6
+Depends: mariadb-plugin-rocksdb | mariadb-server-10.8,
+ mariadb-plugin-provider-bzip2,
+ mariadb-plugin-provider-lz4,
+ mariadb-plugin-provider-lzma,
+ mariadb-plugin-provider-lzo,
+ mariadb-plugin-provider-snappy
Restrictions: allow-stderr needs-root isolation-container
Tests: upstream
diff --git a/debian/tests/smoke b/debian/tests/smoke
index 802ef1b8f8b..9e001f9692f 100644
--- a/debian/tests/smoke
+++ b/debian/tests/smoke
@@ -4,7 +4,7 @@
#
# This test should be declared in debian/tests/control with a dependency
# on the package that provides a configured MariaDB server (eg.
-# mariadb-server-10.6).
+# mariadb-server-10.8).
#
# This test should be declared in debian/tests/control with the
# following restrictions:
@@ -38,6 +38,11 @@ else
# If systemd (and systemctl) is available, but the service did not start, then
# this smoke test is supposed to fail if next commands don't work.
echo "Found systemctl, continuing smoke test.."
+ # Compression plugins are separated from main server package
+ # to own packages (for example LZ4 package mariadb-plugin-provider-lz4)
+ # and they are installed after mariadb-server.
+ # which means that they don't exist if MariaDB is not restarted
+ systemctl restart mariadb
fi
mariadb <<EOT
@@ -71,10 +76,10 @@ EOT
# but disabled with '#' the options that are not available in this binary build
mariadb <<EOT
SET GLOBAL innodb_compression_algorithm=lz4;
-#SET GLOBAL innodb_compression_algorithm=lzo;
-#SET GLOBAL innodb_compression_algorithm=lzma;
-#SET GLOBAL innodb_compression_algorithm=bzip2;
-#SET GLOBAL innodb_compression_algorithm=snappy;
+SET GLOBAL innodb_compression_algorithm=lzo;
+SET GLOBAL innodb_compression_algorithm=lzma;
+SET GLOBAL innodb_compression_algorithm=bzip2;
+SET GLOBAL innodb_compression_algorithm=snappy;
SET GLOBAL innodb_compression_algorithm=zlib;
SET GLOBAL innodb_compression_algorithm=none;
EOT
@@ -88,7 +93,7 @@ if [ "$(dpkg-architecture -qDEB_HOST_ARCH_BITS)" != 32 ] &&
LOG=/var/lib/mysql/#rocksdb/LOG
# XXX: The server may only be started during the install of
- # mariadb-server-10.6, which happens before that of the plugin.
+ # mariadb-server-10.8, which happens before that of the plugin.
[ -e $LOG ] || mariadb -e "INSTALL PLUGIN RocksDB SONAME 'ha_rocksdb';"
# XXX: rocksdb_supported_compression_types variable does not report ZSTD.
diff --git a/extra/comp_err.c b/extra/comp_err.c
index 7dc5cd1921a..2b84f1cbca7 100644
--- a/extra/comp_err.c
+++ b/extra/comp_err.c
@@ -440,7 +440,7 @@ static void clean_up(struct languages *lang_head, struct errors *error_head)
{
struct languages *tmp_lang, *next_language;
struct errors *tmp_error, *next_error;
- uint count, i;
+ size_t count, i;
if (default_language_changed)
my_free((void*) default_language);
@@ -724,7 +724,7 @@ static struct message *find_message(struct errors *err, const char *lang,
my_bool no_default)
{
struct message *tmp, *return_val= 0;
- uint i, count;
+ size_t i, count;
DBUG_ENTER("find_message");
count= (err->msg).elements;
diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc
index 2081fe28e82..7b8ffa92d3b 100644
--- a/extra/innochecksum.cc
+++ b/extra/innochecksum.cc
@@ -48,7 +48,6 @@ The parts not included are excluded by #ifndef UNIV_INNOCHECKSUM. */
#include "buf0buf.h" /* buf_page_is_corrupted */
#include "page0zip.h" /* page_zip_*() */
#include "trx0undo.h" /* TRX_* */
-#include "ut0crc32.h" /* ut_crc32_init() */
#include "fil0crypt.h" /* fil_space_verify_crypt_checksum */
#include <string.h>
@@ -76,7 +75,7 @@ static my_bool per_page_details;
static ulint n_merge;
static ulint physical_page_size; /* Page size in bytes on disk. */
ulong srv_page_size;
-ulong srv_page_size_shift;
+uint32_t srv_page_size_shift;
/* Current page number (0 based). */
uint32_t cur_page_num;
/* Current space. */
@@ -263,14 +262,14 @@ static void init_page_size(const byte* buf)
+ FSP_SPACE_FLAGS);
if (fil_space_t::full_crc32(flags)) {
- const ulong ssize = FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags);
+ const uint32_t ssize = FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags);
srv_page_size_shift = UNIV_ZIP_SIZE_SHIFT_MIN - 1 + ssize;
srv_page_size = 512U << ssize;
physical_page_size = srv_page_size;
return;
}
- const ulong ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags);
+ const uint32_t ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags);
srv_page_size_shift = ssize
? UNIV_ZIP_SIZE_SHIFT_MIN - 1 + ssize
@@ -434,12 +433,7 @@ static bool is_page_all_zeroes(
with crypt_scheme encrypted
@param[in] flags tablespace flags
@retval true if page is corrupted otherwise false. */
-static
-bool
-is_page_corrupted(
- byte* buf,
- bool is_encrypted,
- ulint flags)
+static bool is_page_corrupted(byte *buf, bool is_encrypted, uint32_t flags)
{
/* enable if page is corrupted. */
@@ -596,7 +590,7 @@ Rewrite the checksum for the page.
@retval false : skip the rewrite as checksum stored match with
calculated or page is doublwrite buffer.
*/
-static bool update_checksum(byte* page, ulint flags)
+static bool update_checksum(byte* page, uint32_t flags)
{
ib_uint32_t checksum = 0;
byte stored1[4]; /* get FIL_PAGE_SPACE_OR_CHKSUM field checksum */
@@ -640,7 +634,7 @@ static bool update_checksum(byte* page, ulint flags)
} else if (use_full_crc32) {
ulint payload = buf_page_full_crc32_size(page, NULL, NULL)
- FIL_PAGE_FCRC32_CHECKSUM;
- checksum = ut_crc32(page, payload);
+ checksum = my_crc32c(0, page, payload);
byte* c = page + payload;
if (mach_read_from_4(c) == checksum) return false;
mach_write_to_4(c, checksum);
@@ -705,7 +699,7 @@ write_file(
const char* filename,
FILE* file,
byte* buf,
- ulint flags,
+ uint32_t flags,
fpos_t* pos)
{
bool do_update;
@@ -1369,7 +1363,7 @@ static int verify_checksum(
byte* buf,
bool is_encrypted,
unsigned long long* mismatch_count,
- ulint flags)
+ uint32_t flags)
{
int exit_status = 0;
if (is_page_corrupted(buf, is_encrypted, flags)) {
@@ -1410,7 +1404,7 @@ rewrite_checksum(
byte* buf,
fpos_t* pos,
bool is_encrypted,
- ulint flags)
+ uint32_t flags)
{
bool is_compressed = fil_space_t::is_compressed(flags);
@@ -1579,7 +1573,7 @@ int main(
from fsp_flags and encryption metadata from page 0 */
init_page_size(buf);
- ulint flags = mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + buf);
+ uint32_t flags = mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + buf);
if (physical_page_size == UNIV_ZIP_SIZE_MIN) {
partial_page_read = false;
diff --git a/extra/mariabackup/CMakeLists.txt b/extra/mariabackup/CMakeLists.txt
index a7a35c58ac3..66293dac31b 100644
--- a/extra/mariabackup/CMakeLists.txt
+++ b/extra/mariabackup/CMakeLists.txt
@@ -48,6 +48,11 @@ ADD_DEFINITIONS(-UMYSQL_SERVER)
ADD_DEFINITIONS(-DPCRE_STATIC=1)
ADD_DEFINITIONS(${SSL_DEFINES})
+
+IF(PMEM_FOUND)
+ ADD_COMPILE_FLAGS(xtrabackup.cc COMPILE_FLAGS "-DHAVE_PMEM")
+ENDIF()
+
MYSQL_ADD_EXECUTABLE(mariadb-backup
xtrabackup.cc
innobackupex.cc
@@ -67,7 +72,7 @@ MYSQL_ADD_EXECUTABLE(mariadb-backup
xbstream_write.cc
backup_mysql.cc
backup_copy.cc
- encryption_plugin.cc
+ xb_plugin.cc
${PROJECT_BINARY_DIR}/sql/sql_builtin.cc
${PROJECT_SOURCE_DIR}/sql/net_serv.cc
${PROJECT_SOURCE_DIR}/libmysqld/libmysql.c
diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc
index 4833b8d0975..272db6ed993 100644
--- a/extra/mariabackup/backup_copy.cc
+++ b/extra/mariabackup/backup_copy.cc
@@ -1856,26 +1856,11 @@ copy_back()
dst_dir = (srv_log_group_home_dir && *srv_log_group_home_dir)
? srv_log_group_home_dir : mysql_data_home;
- /* --backup generates a single LOG_FILE_NAME, which we must copy
- if it exists. */
+ /* --backup generates a single ib_logfile0, which we must copy. */
ds_data = ds_create(dst_dir, DS_TYPE_LOCAL);
- MY_STAT stat_arg;
- if (!my_stat(LOG_FILE_NAME, &stat_arg, MYF(0)) || !stat_arg.st_size) {
- /* After completed --prepare, redo log files are redundant.
- We must delete any redo logs at the destination, so that
- the database will not jump to a different log sequence number
- (LSN). */
-
- char filename[FN_REFLEN];
- snprintf(filename, sizeof filename, "%s/%s0", dst_dir,
- LOG_FILE_NAME_PREFIX);
- unlink(filename);
- snprintf(filename, sizeof filename, "%s/%s101", dst_dir,
- LOG_FILE_NAME_PREFIX);
- unlink(filename);
- } else if (!(ret = copy_or_move_file(LOG_FILE_NAME, LOG_FILE_NAME,
- dst_dir, 1))) {
+ if (!(ret = copy_or_move_file(LOG_FILE_NAME, LOG_FILE_NAME,
+ dst_dir, 1))) {
goto cleanup;
}
ds_destroy(ds_data);
diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc
index 9ddbb6387b9..8b9962597af 100644
--- a/extra/mariabackup/backup_mysql.cc
+++ b/extra/mariabackup/backup_mysql.cc
@@ -54,7 +54,7 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA
#include "backup_copy.h"
#include "backup_mysql.h"
#include "mysqld.h"
-#include "encryption_plugin.h"
+#include "xb_plugin.h"
#include <sstream>
#include <sql_error.h>
#include "page0zip.h"
@@ -524,7 +524,8 @@ bool get_mysql_vars(MYSQL *connection)
if (innodb_undo_tablespaces_var)
{
- srv_undo_tablespaces= strtoul(innodb_undo_tablespaces_var, &endptr, 10);
+ srv_undo_tablespaces= static_cast<uint32_t>
+ (strtoul(innodb_undo_tablespaces_var, &endptr, 10));
ut_ad(*endptr == 0);
}
@@ -1854,7 +1855,7 @@ bool write_backup_config_file()
"innodb_log_file_size=%llu\n"
"innodb_page_size=%lu\n"
"innodb_undo_directory=%s\n"
- "innodb_undo_tablespaces=%lu\n"
+ "innodb_undo_tablespaces=%u\n"
"innodb_compression_level=%u\n"
"%s%s\n"
"%s\n",
@@ -1869,7 +1870,7 @@ bool write_backup_config_file()
"innodb_buffer_pool_filename=" : "",
innobase_buffer_pool_filename ?
innobase_buffer_pool_filename : "",
- encryption_plugin_get_config());
+ xb_plugin_get_config());
return rc;
}
diff --git a/extra/mariabackup/changed_page_bitmap.cc b/extra/mariabackup/changed_page_bitmap.cc
index a6cc0e01492..39a07a25224 100644
--- a/extra/mariabackup/changed_page_bitmap.cc
+++ b/extra/mariabackup/changed_page_bitmap.cc
@@ -586,7 +586,7 @@ xb_find_lsn_in_bitmap_file(
/****************************************************************//**
Read the disk bitmap and build the changed page bitmap tree for the
-LSN interval incremental_lsn to checkpoint_lsn_start.
+LSN interval incremental_lsn to log_sys.next_checkpoint_lsn.
@return the built bitmap tree or NULL if unable to read the full interval for
any reason. */
@@ -596,7 +596,7 @@ xb_page_bitmap_init(void)
{
log_online_bitmap_file_t bitmap_file;
lsn_t bmp_start_lsn = incremental_lsn;
- lsn_t bmp_end_lsn = checkpoint_lsn_start;
+ const lsn_t bmp_end_lsn{log_sys.next_checkpoint_lsn};
byte page[MODIFIED_PAGE_BLOCK_SIZE];
lsn_t current_page_end_lsn;
xb_page_bitmap *result;
diff --git a/extra/mariabackup/changed_page_bitmap.h b/extra/mariabackup/changed_page_bitmap.h
index 1a0e2ec37f0..8d5043596bf 100644
--- a/extra/mariabackup/changed_page_bitmap.h
+++ b/extra/mariabackup/changed_page_bitmap.h
@@ -38,7 +38,7 @@ typedef struct xb_page_bitmap_range_struct xb_page_bitmap_range;
/****************************************************************//**
Read the disk bitmap and build the changed page bitmap tree for the
-LSN interval incremental_lsn to checkpoint_lsn_start.
+LSN interval incremental_lsn to log_sys.next_checkpoint_lsn.
@return the built bitmap tree */
xb_page_bitmap*
diff --git a/extra/mariabackup/common.h b/extra/mariabackup/common.h
index 1973512ad82..89b189e3a87 100644
--- a/extra/mariabackup/common.h
+++ b/extra/mariabackup/common.h
@@ -149,10 +149,9 @@ static inline ATTRIBUTE_FORMAT(printf, 1,2) ATTRIBUTE_NORETURN void die(const ch
/***********************************************************************
Computes bit shift for a given value. If the argument is not a power
of 2, returns 0.*/
-static inline size_t
-get_bit_shift(size_t value)
+static inline unsigned get_bit_shift(size_t value)
{
- size_t shift;
+ unsigned shift;
if (value == 0)
return 0;
diff --git a/extra/mariabackup/ds_local.cc b/extra/mariabackup/ds_local.cc
index ddaa213491d..4c3016ec8f7 100644
--- a/extra/mariabackup/ds_local.cc
+++ b/extra/mariabackup/ds_local.cc
@@ -181,8 +181,8 @@ static void init_ibd_data(ds_local_file_t *local_file, const uchar *buf, size_t
return;
}
- ulint flags = mach_read_from_4(&buf[FIL_PAGE_DATA + FSP_SPACE_FLAGS]);
- ulint ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags);
+ auto flags = mach_read_from_4(&buf[FIL_PAGE_DATA + FSP_SPACE_FLAGS]);
+ auto ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags);
local_file->pagesize= ssize == 0 ? UNIV_PAGE_SIZE_ORIG : ((UNIV_ZIP_SIZE_MIN >> 1) << ssize);
local_file->compressed = fil_space_t::full_crc32(flags)
? fil_space_t::is_compressed(flags)
diff --git a/extra/mariabackup/encryption_plugin.h b/extra/mariabackup/encryption_plugin.h
deleted file mode 100644
index 16d74790254..00000000000
--- a/extra/mariabackup/encryption_plugin.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <mysql.h>
-#include <string>
-extern void encryption_plugin_backup_init(MYSQL *mysql);
-extern const char* encryption_plugin_get_config();
-extern void encryption_plugin_prepare_init(int argc, char **argv);
-
-//extern void encryption_plugin_init(int argc, char **argv);
diff --git a/extra/mariabackup/fil_cur.cc b/extra/mariabackup/fil_cur.cc
index 8820ce40c2b..e0a4711a2aa 100644
--- a/extra/mariabackup/fil_cur.cc
+++ b/extra/mariabackup/fil_cur.cc
@@ -233,8 +233,8 @@ xb_fil_cur_open(
mysql_mutex_unlock(&fil_system.mutex);
}
- cursor->space_size = (ulint)(cursor->statinfo.st_size
- / cursor->page_size);
+ cursor->space_size = uint32_t(cursor->statinfo.st_size
+ / cursor->page_size);
cursor->read_filter = read_filter;
cursor->read_filter->init(&cursor->read_filter_ctxt, cursor,
@@ -462,8 +462,8 @@ read_retry:
"corrupted.%s", cursor->abs_path, ignore_corruption_warn);
ut_print_buf(stderr, page, page_size);
if (opt_log_innodb_page_corruption) {
- corrupted_pages.add_page(cursor->node->name, cursor->node->space->id,
- page_no);
+ corrupted_pages.add_page(cursor->node->name,
+ {cursor->node->space->id, page_no});
retry_count = 1;
}
else {
@@ -486,8 +486,9 @@ read_retry:
unsigned corrupted_page_no =
static_cast<unsigned>(strtoul(dbug_val, NULL, 10));
if (page_no == corrupted_page_no)
- corrupted_pages.add_page(cursor->node->name, cursor->node->space->id,
- corrupted_page_no);
+ corrupted_pages.add_page(cursor->node->name,
+ {cursor->node->space->id,
+ corrupted_page_no});
});
cursor->buf_read += page_size;
cursor->buf_npages++;
diff --git a/extra/mariabackup/fil_cur.h b/extra/mariabackup/fil_cur.h
index ac561f71060..b7812f6589e 100644
--- a/extra/mariabackup/fil_cur.h
+++ b/extra/mariabackup/fil_cur.h
@@ -56,8 +56,8 @@ struct xb_fil_cur_t {
unsigned buf_page_no; /*!< number of the first page in
buffer */
uint thread_n; /*!< thread number for diagnostics */
- ulint space_id; /*!< ID of tablespace */
- ulint space_size; /*!< space size in pages */
+ uint32_t space_id; /*!< ID of tablespace */
+ uint32_t space_size; /*!< space size in pages */
uint32_t n_process_batch;/*!< Number of batch processed */
/** @return whether this is not a file-per-table tablespace */
diff --git a/extra/mariabackup/read_filt.h b/extra/mariabackup/read_filt.h
index 2cd52d3d581..51150705367 100644
--- a/extra/mariabackup/read_filt.h
+++ b/extra/mariabackup/read_filt.h
@@ -27,7 +27,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
#include "changed_page_bitmap.h"
-typedef ulint space_id_t;
+typedef uint32_t space_id_t;
struct xb_fil_cur_t;
diff --git a/extra/mariabackup/write_filt.cc b/extra/mariabackup/write_filt.cc
index 8339286e1df..01e4d83e344 100644
--- a/extra/mariabackup/write_filt.cc
+++ b/extra/mariabackup/write_filt.cc
@@ -124,8 +124,8 @@ wf_incremental_process(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile)
i++, page += page_size) {
if ((!cp->corrupted_pages ||
- !cp->corrupted_pages->contains(cursor->node->space->id,
- cursor->buf_page_no + i)) &&
+ !cp->corrupted_pages->contains({cursor->node->space->id,
+ cursor->buf_page_no + i})) &&
incremental_lsn >= mach_read_from_8(page + FIL_PAGE_LSN))
continue;
diff --git a/extra/mariabackup/encryption_plugin.cc b/extra/mariabackup/xb_plugin.cc
index dbaa67e1324..7470d376eaa 100644
--- a/extra/mariabackup/encryption_plugin.cc
+++ b/extra/mariabackup/xb_plugin.cc
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017, MariaDB Corporation.
+/* Copyright (c) 2017, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -17,18 +17,18 @@
#include <mysqld.h>
#include <mysql.h>
#include <xtrabackup.h>
-#include <encryption_plugin.h>
+#include <xb_plugin.h>
#include <sql_plugin.h>
#include <sstream>
#include <vector>
#include <common.h>
#include <backup_mysql.h>
-#include <log0crypt.h>
+#include <srv0srv.h>
extern struct st_maria_plugin *mysql_optional_plugins[];
extern struct st_maria_plugin *mysql_mandatory_plugins[];
-static void encryption_plugin_init(int argc, char **argv);
+static void xb_plugin_init(int argc, char **argv);
extern char *xb_plugin_load;
extern char *xb_plugin_dir;
@@ -39,9 +39,10 @@ std::vector<std::string> backup_plugins_args;
const char *QUERY_PLUGIN =
"SELECT plugin_name, plugin_library, @@plugin_dir"
" FROM information_schema.plugins WHERE plugin_type='ENCRYPTION'"
+" OR (plugin_type = 'DAEMON' AND plugin_name LIKE 'provider\\_%')"
" AND plugin_status='ACTIVE'";
-std::string encryption_plugin_config;
+std::string xb_plugin_config;
static void add_to_plugin_load_list(const char *plugin_def)
{
@@ -51,16 +52,16 @@ static void add_to_plugin_load_list(const char *plugin_def)
static char XTRABACKUP_EXE[] = "xtrabackup";
/*
- Read "plugin-load" value (encryption plugin) from backup-my.cnf during
- prepare phase.
+ Read "plugin-load" value from backup-my.cnf during prepare phase.
The value is stored during backup phase.
*/
-static std::string get_encryption_plugin_from_cnf()
+static std::string get_plugin_from_cnf(const char *dir)
{
- FILE *f = fopen("backup-my.cnf", "r");
+ std::string path = dir + std::string("/backup-my.cnf");
+ FILE *f = fopen(path.c_str(), "r");
if (!f)
{
- die("Can't open backup-my.cnf for reading");
+ die("Can't open %s for reading", path.c_str());
}
char line[512];
std::string plugin_load;
@@ -79,82 +80,90 @@ static std::string get_encryption_plugin_from_cnf()
}
-void encryption_plugin_backup_init(MYSQL *mysql)
+void xb_plugin_backup_init(MYSQL *mysql)
{
MYSQL_RES *result;
MYSQL_ROW row;
std::ostringstream oss;
char *argv[PLUGIN_MAX_ARGS];
+ char show_query[1024] = "";
+ std::string plugin_load;
int argc;
result = xb_mysql_query(mysql, QUERY_PLUGIN, true, true);
- row = mysql_fetch_row(result);
- if (!row)
+ while ((row = mysql_fetch_row(result)))
{
- mysql_free_result(result);
- return;
- }
-
- char *name= row[0];
- char *library= row[1];
- char *dir= row[2];
+ char *name= row[0];
+ char *library= row[1];
+ char *dir= row[2];
+ if (!plugin_load.length())
+ {
#ifdef _WIN32
- for (char *p = dir; *p; p++)
- if (*p == '\\') *p = '/';
+ for (char *p = dir; *p; p++)
+ if (*p == '\\') *p = '/';
#endif
+ strncpy(opt_plugin_dir, dir, FN_REFLEN - 1);
+ opt_plugin_dir[FN_REFLEN - 1] = '\0';
+ oss << "plugin_dir=" << '"' << dir << '"' << std::endl;
+ }
- std::string plugin_load(name);
- if (library)
- {
- /* Remove shared library suffixes, in case we'll prepare on different OS.*/
- const char *extensions[] = { ".dll", ".so", 0 };
- for (size_t i = 0; extensions[i]; i++)
+ plugin_load += std::string(";") + name;
+
+ if (library)
{
- const char *ext = extensions[i];
- if (ends_with(library, ext))
- library[strlen(library) - strlen(ext)] = 0;
+ /* Remove shared library suffixes, in case we'll prepare on different OS.*/
+ const char *extensions[] = { ".dll", ".so", 0 };
+ for (size_t i = 0; extensions[i]; i++)
+ {
+ const char *ext = extensions[i];
+ if (ends_with(library, ext))
+ library[strlen(library) - strlen(ext)] = 0;
+ }
+ plugin_load += std::string("=") + library;
}
- plugin_load += std::string("=") + library;
- }
- oss << "plugin_load=" << plugin_load << std::endl;
+ if (strncmp(name, "provider_", 9) == 0)
+ continue;
- /* Required to load the plugin later.*/
- add_to_plugin_load_list(plugin_load.c_str());
- strncpy(opt_plugin_dir, dir, FN_REFLEN - 1);
- opt_plugin_dir[FN_REFLEN - 1] = '\0';
+ /* Read plugin variables. */
+ snprintf(show_query, sizeof(show_query), "SHOW variables like '%s_%%'", name);
+ }
+ mysql_free_result(result);
+ if (!plugin_load.length())
+ return;
- oss << "plugin_dir=" << '"' << dir << '"' << std::endl;
+ oss << "plugin_load=" << plugin_load.c_str() + 1 << std::endl;
+ /* Required to load the plugin later.*/
+ add_to_plugin_load_list(plugin_load.c_str() + 1);
- /* Read plugin variables. */
- char query[1024];
- snprintf(query, 1024, "SHOW variables like '%s_%%'", name);
- mysql_free_result(result);
- result = xb_mysql_query(mysql, query, true, true);
- while ((row = mysql_fetch_row(result)))
+ if (*show_query)
{
- std::string arg("--");
- arg += row[0];
- arg += "=";
- arg += row[1];
- backup_plugins_args.push_back(arg);
- oss << row[0] << "=" << row[1] << std::endl;
- }
+ result = xb_mysql_query(mysql, show_query, true, true);
+ while ((row = mysql_fetch_row(result)))
+ {
+ std::string arg("--");
+ arg += row[0];
+ arg += "=";
+ arg += row[1];
+ backup_plugins_args.push_back(arg);
+ oss << row[0] << "=" << row[1] << std::endl;
+ }
- mysql_free_result(result);
+ mysql_free_result(result);
- /* Check whether to encrypt logs. */
- result = xb_mysql_query(mysql, "select @@innodb_encrypt_log", true, true);
- row = mysql_fetch_row(result);
- srv_encrypt_log = (row != 0 && row[0][0] == '1');
- oss << "innodb_encrypt_log=" << row[0] << std::endl;
+ /* Check whether to encrypt logs. */
+ result = xb_mysql_query(mysql, "select @@innodb_encrypt_log", true, true);
+ row = mysql_fetch_row(result);
+ srv_encrypt_log = (row != 0 && row[0][0] == '1');
+ oss << "innodb_encrypt_log=" << row[0] << std::endl;
- mysql_free_result(result);
+ mysql_free_result(result);
+ }
- encryption_plugin_config = oss.str();
+ xb_plugin_config = oss.str();
argc = 0;
argv[argc++] = XTRABACKUP_EXE;
@@ -166,23 +175,23 @@ void encryption_plugin_backup_init(MYSQL *mysql)
}
argv[argc] = 0;
- encryption_plugin_init(argc, argv);
+ xb_plugin_init(argc, argv);
}
-const char *encryption_plugin_get_config()
+const char *xb_plugin_get_config()
{
- return encryption_plugin_config.c_str();
+ return xb_plugin_config.c_str();
}
extern int finalize_encryption_plugin(st_plugin_int *plugin);
-void encryption_plugin_prepare_init(int argc, char **argv)
+void xb_plugin_prepare_init(int argc, char **argv, const char *dir)
{
- std::string plugin_load= get_encryption_plugin_from_cnf();
+ std::string plugin_load= get_plugin_from_cnf(dir ? dir : ".");
if (plugin_load.size())
{
- msg("Loading encryption plugin from %s", plugin_load.c_str());
+ msg("Loading plugins from %s", plugin_load.c_str());
}
else
{
@@ -198,23 +207,23 @@ void encryption_plugin_prepare_init(int argc, char **argv)
opt_plugin_dir[FN_REFLEN - 1] = '\0';
}
- char **new_argv = new char *[argc + 1];
+ char **new_argv = new char *[argc + 2];
new_argv[0] = XTRABACKUP_EXE;
memcpy(&new_argv[1], argv, argc*sizeof(char *));
- encryption_plugin_init(argc+1, new_argv);
+ xb_plugin_init(argc+1, new_argv);
delete[] new_argv;
}
-static void encryption_plugin_init(int argc, char **argv)
+static void xb_plugin_init(int argc, char **argv)
{
/* Patch optional and mandatory plugins, we only need to load the one in xb_plugin_load. */
mysql_optional_plugins[0] = mysql_mandatory_plugins[0] = 0;
plugin_maturity = MariaDB_PLUGIN_MATURITY_UNKNOWN; /* mariabackup accepts all plugins */
- msg("Loading encryption plugin");
+ msg("Loading plugins");
for (int i= 1; i < argc; i++)
- msg("\t Encryption plugin parameter : '%s'", argv[i]);
+ msg("\t Plugin parameter : '%s'", argv[i]);
plugin_init(&argc, argv, PLUGIN_INIT_SKIP_PLUGIN_TABLE);
}
diff --git a/extra/mariabackup/xb_plugin.h b/extra/mariabackup/xb_plugin.h
new file mode 100644
index 00000000000..fea24b6b052
--- /dev/null
+++ b/extra/mariabackup/xb_plugin.h
@@ -0,0 +1,5 @@
+#include <mysql.h>
+#include <string>
+extern void xb_plugin_backup_init(MYSQL *mysql);
+extern const char* xb_plugin_get_config();
+extern void xb_plugin_prepare_init(int argc, char **argv, const char *dir);
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 85999ffd0ef..1d936b3d544 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -107,7 +107,7 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA
#include "backup_mysql.h"
#include "backup_copy.h"
#include "backup_mysql.h"
-#include "encryption_plugin.h"
+#include "xb_plugin.h"
#include <sql_plugin.h>
#include <srv0srv.h>
#include <log.h>
@@ -187,10 +187,7 @@ struct xb_filter_entry_t{
xb_filter_entry_t *name_hash;
};
-lsn_t checkpoint_lsn_start;
-lsn_t checkpoint_no_start;
-static lsn_t log_copy_scanned_lsn;
-/** whether log_copying_thread() is active; protected by log_sys.mutex */
+/** whether log_copying_thread() is active; protected by recv_sys.mutex */
static bool log_copying_running;
int xtrabackup_parallel;
@@ -246,7 +243,7 @@ ulong innobase_read_io_threads = 4;
ulong innobase_write_io_threads = 4;
/** Store the failed read of undo tablespace ids. Protected by
-backup mutex */
+recv_sys.mutex. */
static std::set<uint32_t> fail_undo_ids;
longlong innobase_page_size = (1LL << 14); /* 16KB */
@@ -352,7 +349,6 @@ const char *opt_history = NULL;
char mariabackup_exe[FN_REFLEN];
char orig_argv1[FN_REFLEN];
-pthread_mutex_t backup_mutex;
pthread_cond_t scanned_lsn_cond;
/** Store the deferred tablespace name during --backup */
@@ -426,45 +422,45 @@ CorruptedPages::CorruptedPages() { ut_a(!pthread_mutex_init(&m_mutex, NULL)); }
CorruptedPages::~CorruptedPages() { ut_a(!pthread_mutex_destroy(&m_mutex)); }
-void CorruptedPages::add_page_no_lock(const char *space_name, ulint space_id,
- unsigned page_no,
+void CorruptedPages::add_page_no_lock(const char *space_name,
+ page_id_t page_id,
bool convert_space_name)
{
- space_info_t &space_info = m_spaces[space_id];
+ space_info_t &space_info = m_spaces[page_id.space()];
if (space_info.space_name.empty())
space_info.space_name= convert_space_name
? filename_to_spacename(space_name, strlen(space_name))
: space_name;
- (void)space_info.pages.insert(page_no);
+ (void)space_info.pages.insert(page_id.page_no());
}
-void CorruptedPages::add_page(const char *file_name, ulint space_id,
- unsigned page_no)
+void CorruptedPages::add_page(const char *file_name, page_id_t page_id)
{
- ut_a(!pthread_mutex_lock(&m_mutex));
- add_page_no_lock(file_name, space_id, page_no, true);
- ut_a(!pthread_mutex_unlock(&m_mutex));
+ pthread_mutex_lock(&m_mutex);
+ add_page_no_lock(file_name, page_id, true);
+ pthread_mutex_unlock(&m_mutex);
}
-bool CorruptedPages::contains(ulint space_id, unsigned page_no) const
+bool CorruptedPages::contains(page_id_t page_id) const
{
bool result = false;
ut_a(!pthread_mutex_lock(&m_mutex));
- container_t::const_iterator space_it= m_spaces.find(space_id);
+ container_t::const_iterator space_it= m_spaces.find(page_id.space());
if (space_it != m_spaces.end())
- result = space_it->second.pages.count(page_no);
+ result = space_it->second.pages.count(page_id.page_no());
ut_a(!pthread_mutex_unlock(&m_mutex));
return result;
}
-void CorruptedPages::drop_space(ulint space_id)
+void CorruptedPages::drop_space(uint32_t space_id)
{
ut_a(!pthread_mutex_lock(&m_mutex));
m_spaces.erase(space_id);
ut_a(!pthread_mutex_unlock(&m_mutex));
}
-void CorruptedPages::rename_space(ulint space_id, const std::string &new_name)
+void CorruptedPages::rename_space(uint32_t space_id,
+ const std::string &new_name)
{
ut_a(!pthread_mutex_lock(&m_mutex));
container_t::iterator space_it = m_spaces.find(space_id);
@@ -525,7 +521,7 @@ void CorruptedPages::read_from_file(const char *file_name)
strerror(errno));
std::string line;
std::string space_name;
- ulint space_id;
+ uint32_t space_id;
ulint line_number= 0;
while (std::getline(infile, line))
{
@@ -545,7 +541,7 @@ void CorruptedPages::read_from_file(const char *file_name)
std::istringstream iss(line);
unsigned page_no;
while ((iss >> page_no))
- add_page_no_lock(space_name.c_str(), space_id, page_no, false);
+ add_page_no_lock(space_name.c_str(), {space_id, page_no}, false);
if (!iss.eof())
die("Corrupted pages file parse error on line number " ULINTPF,
line_number);
@@ -563,7 +559,7 @@ bool CorruptedPages::empty() const
static void xb_load_single_table_tablespace(const std::string &space_name,
bool set_size,
- ulint defer_space_id=0);
+ uint32_t defer_space_id=0);
static void xb_data_files_close();
static fil_space_t* fil_space_get_by_name(const char* name);
@@ -578,7 +574,7 @@ void CorruptedPages::zero_out_free_pages()
for (container_t::const_iterator space_it= m_spaces.begin();
space_it != m_spaces.end(); ++space_it)
{
- ulint space_id = space_it->first;
+ uint32_t space_id = space_it->first;
const std::string &space_name = space_it->second.space_name;
// There is no need to close tablespaces explixitly as they will be closed
// in innodb_shutdown().
@@ -641,7 +637,7 @@ typedef void (*process_single_tablespace_func_t)(const char *dirname,
const char *filname,
bool is_remote,
bool skip_node_page0,
- ulint defer_space_id);
+ uint32_t defer_space_id);
static dberr_t enumerate_ibd_files(process_single_tablespace_func_t callback);
/* ======== Datafiles iterator ======== */
@@ -817,9 +813,8 @@ static std::string filename_to_spacename(const void *filename, size_t len)
ut_a(table);
*table = 0;
char *db = strrchr(f, '/');
- ut_a(db);
*table = '/';
- std::string s(db+1);
+ std::string s(db ? db+1 : f);
free(f);
return s;
}
@@ -831,7 +826,7 @@ static std::string filename_to_spacename(const void *filename, size_t len)
@param[in] len length of name, in bytes
@param[in] new_name new file name (NULL if not rename)
@param[in] new_len length of new_name, in bytes (0 if NULL) */
-static void backup_file_op(ulint space_id, int type,
+static void backup_file_op(uint32_t space_id, int type,
const byte* name, ulint len,
const byte* new_name, ulint new_len)
{
@@ -839,7 +834,7 @@ static void backup_file_op(ulint space_id, int type,
ut_ad(name);
ut_ad(len);
ut_ad(!new_name == !new_len);
- pthread_mutex_lock(&backup_mutex);
+ mysql_mutex_assert_owner(&recv_sys.mutex);
switch(type) {
case FILE_CREATE:
@@ -847,7 +842,7 @@ static void backup_file_op(ulint space_id, int type,
std::string space_name = filename_to_spacename(name, len);
ddl_tracker.id_to_name[space_id] = space_name;
ddl_tracker.delete_defer(space_id, space_name);
- msg("DDL tracking : create %zu \"%.*s\"", space_id, int(len), name);
+ msg("DDL tracking : create %u \"%.*s\"", space_id, int(len), name);
}
break;
case FILE_MODIFY:
@@ -863,7 +858,7 @@ static void backup_file_op(ulint space_id, int type,
ddl_tracker.id_to_name[space_id] = new_space_name;
ddl_tracker.rename_defer(space_id, old_space_name,
new_space_name);
- msg("DDL tracking : rename %zu \"%.*s\",\"%.*s\"",
+ msg("DDL tracking : rename %u \"%.*s\",\"%.*s\"",
space_id, int(len), name, int(new_len), new_name);
}
break;
@@ -871,13 +866,12 @@ static void backup_file_op(ulint space_id, int type,
ddl_tracker.drops.insert(space_id);
ddl_tracker.delete_defer(
space_id, filename_to_spacename(name, len));
- msg("DDL tracking : delete %zu \"%.*s\"", space_id, int(len), name);
+ msg("DDL tracking : delete %u \"%.*s\"", space_id, int(len), name);
break;
default:
ut_ad(0);
break;
}
- pthread_mutex_unlock(&backup_mutex);
}
@@ -890,21 +884,21 @@ static void backup_file_op(ulint space_id, int type,
We will abort backup in this case.
*/
-static void backup_file_op_fail(ulint space_id, int type,
+static void backup_file_op_fail(uint32_t space_id, int type,
const byte* name, ulint len,
const byte* new_name, ulint new_len)
{
bool fail = false;
switch(type) {
case FILE_CREATE:
- msg("DDL tracking : create %zu \"%.*s\"", space_id, int(len), name);
+ msg("DDL tracking : create %u \"%.*s\"", space_id, int(len), name);
fail = !check_if_skip_table(
filename_to_spacename(name, len).c_str());
break;
case FILE_MODIFY:
break;
case FILE_RENAME:
- msg("DDL tracking : rename %zu \"%.*s\",\"%.*s\"",
+ msg("DDL tracking : rename %u \"%.*s\",\"%.*s\"",
space_id, int(len), name, int(new_len), new_name);
fail = !check_if_skip_table(
filename_to_spacename(name, len).c_str())
@@ -914,7 +908,7 @@ static void backup_file_op_fail(ulint space_id, int type,
case FILE_DELETE:
fail = !check_if_skip_table(
filename_to_spacename(name, len).c_str());
- msg("DDL tracking : delete %zu \"%.*s\"", space_id, int(len), name);
+ msg("DDL tracking : delete %u \"%.*s\"", space_id, int(len), name);
break;
default:
ut_ad(0);
@@ -935,7 +929,7 @@ static void backup_undo_trunc(uint32_t space_id)
/* Function to store the space id of page0 INIT_PAGE
@param space_id space id which has page0 init page */
-static void backup_first_page_op(ulint space_id)
+static void backup_first_page_op(space_id_t space_id)
{
first_page_init_ids.insert(space_id);
}
@@ -1035,8 +1029,10 @@ enum options_xtrabackup
OPT_INNODB_BUFFER_POOL_FILENAME,
OPT_INNODB_LOCK_WAIT_TIMEOUT,
OPT_INNODB_LOG_BUFFER_SIZE,
+#if defined __linux__ || defined _WIN32
+ OPT_INNODB_LOG_FILE_BUFFERING,
+#endif
OPT_INNODB_LOG_FILE_SIZE,
- OPT_INNODB_LOG_FILES_IN_GROUP,
OPT_INNODB_OPEN_FILES,
OPT_XTRA_DEBUG_SYNC,
OPT_INNODB_CHECKSUM_ALGORITHM,
@@ -1593,15 +1589,22 @@ struct my_option xb_server_options[] =
IF_WIN(SRV_ALL_O_DIRECT_FSYNC, SRV_O_DIRECT), 0, 0, 0, 0, 0},
{"innodb_log_buffer_size", OPT_INNODB_LOG_BUFFER_SIZE,
- "The size of the buffer which InnoDB uses to write log to the log files on disk.",
- (G_PTR*) &srv_log_buffer_size, (G_PTR*) &srv_log_buffer_size, 0,
- GET_ULONG, REQUIRED_ARG, 1024*1024L, 256*1024L, LONG_MAX, 0, 1024, 0},
+ "Redo log buffer size in bytes.",
+ (G_PTR*) &log_sys.buf_size, (G_PTR*) &log_sys.buf_size, 0,
+ IF_WIN(GET_ULL,GET_ULONG), REQUIRED_ARG, 2U << 20,
+ 2U << 20, SIZE_T_MAX, 0, 4096, 0},
+#if defined __linux__ || defined _WIN32
+ {"innodb_log_file_buffering", OPT_INNODB_LOG_FILE_BUFFERING,
+ "Whether the file system cache for ib_logfile0 is enabled during --backup",
+ (G_PTR*) &log_sys.log_buffered,
+ (G_PTR*) &log_sys.log_buffered, 0, GET_BOOL, NO_ARG,
+ TRUE, 0, 0, 0, 0, 0},
+#endif
{"innodb_log_file_size", OPT_INNODB_LOG_FILE_SIZE,
"Ignored for mysqld option compatibility",
(G_PTR*) &srv_log_file_size, (G_PTR*) &srv_log_file_size, 0,
- GET_ULL, REQUIRED_ARG, 48 << 20, 1 << 20,
- std::numeric_limits<ulonglong>::max(), 0,
- UNIV_PAGE_SIZE_MAX, 0},
+ GET_ULL, REQUIRED_ARG, 96 << 20, 4 << 20,
+ std::numeric_limits<ulonglong>::max(), 0, 4096, 0},
{"innodb_log_group_home_dir", OPT_INNODB_LOG_GROUP_HOME_DIR,
"Path to InnoDB log files.", &srv_log_group_home_dir,
&srv_log_group_home_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
@@ -1650,7 +1653,7 @@ struct my_option xb_server_options[] =
{"innodb_undo_tablespaces", OPT_INNODB_UNDO_TABLESPACES,
"Number of undo tablespaces to use.",
(G_PTR*)&srv_undo_tablespaces, (G_PTR*)&srv_undo_tablespaces,
- 0, GET_ULONG, REQUIRED_ARG, 0, 0, 126, 0, 1, 0},
+ 0, GET_UINT, REQUIRED_ARG, 0, 0, 126, 0, 1, 0},
{"innodb_compression_level", OPT_INNODB_COMPRESSION_LEVEL,
"Compression level used for zlib compression.",
@@ -1662,10 +1665,10 @@ struct my_option xb_server_options[] =
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"plugin-dir", OPT_PLUGIN_DIR,
- "Server plugin directory. Used to load encryption plugin during 'prepare' phase."
- "Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)",
- &xb_plugin_dir, &xb_plugin_dir,
- 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
+ "Server plugin directory. Used to load plugins during 'prepare' phase."
+ "Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)",
+ &xb_plugin_dir, &xb_plugin_dir,
+ 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
{"open_files_limit", OPT_OPEN_FILES_LIMIT, "the maximum number of file "
"descriptors to reserve with setrlimit().",
@@ -1721,7 +1724,7 @@ static std::set<std::string> tables_for_export;
static void append_export_table(const char *dbname, const char *tablename,
bool is_remote, bool skip_node_page0,
- ulint defer_space_id)
+ uint32_t defer_space_id)
{
if(dbname && tablename && !is_remote)
{
@@ -1914,10 +1917,6 @@ xb_get_one_option(const struct my_option *opt,
ADD_PRINT_PARAM_OPT(srv_log_group_home_dir);
break;
- case OPT_INNODB_LOG_FILES_IN_GROUP:
- case OPT_INNODB_LOG_FILE_SIZE:
- break;
-
case OPT_INNODB_FLUSH_METHOD:
#ifdef _WIN32
/* From: storage/innobase/handler/ha_innodb.cc:innodb_init_params */
@@ -2068,7 +2067,7 @@ static bool innodb_init_param()
size_t n_shift = get_bit_shift(size_t(innobase_page_size));
if (n_shift >= 12 && n_shift <= UNIV_PAGE_SIZE_SHIFT_MAX) {
- srv_page_size_shift = ulong(n_shift);
+ srv_page_size_shift = uint32_t(n_shift);
srv_page_size = 1U << n_shift;
msg("InnoDB: The universal page size of the "
"database is set to %lu.", srv_page_size);
@@ -2164,7 +2163,7 @@ static bool innodb_init_param()
changes the value so that it becomes the number of database pages. */
srv_buf_pool_size = (ulint) xtrabackup_use_memory;
- srv_buf_pool_chunk_unit = (ulong)srv_buf_pool_size;
+ srv_buf_pool_chunk_unit = srv_buf_pool_size;
srv_n_read_io_threads = (uint) innobase_read_io_threads;
srv_n_write_io_threads = (uint) innobase_write_io_threads;
@@ -2249,30 +2248,98 @@ error:
return true;
}
+static byte log_hdr_buf[log_t::START_OFFSET + SIZE_OF_FILE_CHECKPOINT];
+
+/** Initialize an InnoDB log file header in log_hdr_buf[] */
+static void log_hdr_init()
+{
+ memset(log_hdr_buf, 0, sizeof log_hdr_buf);
+ mach_write_to_4(LOG_HEADER_FORMAT + log_hdr_buf, log_t::FORMAT_10_8);
+ mach_write_to_8(LOG_HEADER_START_LSN + log_hdr_buf,
+ log_sys.next_checkpoint_lsn);
+ snprintf(reinterpret_cast<char*>(LOG_HEADER_CREATOR + log_hdr_buf),
+ 16, "Backup %u.%u.%u",
+ MYSQL_VERSION_ID / 10000, MYSQL_VERSION_ID / 100 % 100,
+ MYSQL_VERSION_ID % 100);
+ if (log_sys.is_encrypted())
+ log_crypt_write_header(log_hdr_buf + LOG_HEADER_CREATOR_END);
+ mach_write_to_4(508 + log_hdr_buf, my_crc32c(0, log_hdr_buf, 508));
+ mach_write_to_8(log_hdr_buf + 0x1000, log_sys.next_checkpoint_lsn);
+ mach_write_to_8(log_hdr_buf + 0x1008, recv_sys.lsn);
+ mach_write_to_4(log_hdr_buf + 0x103c,
+ my_crc32c(0, log_hdr_buf + 0x1000, 60));
+}
+
static bool innodb_init()
{
- bool create_new_db = false;
+ bool create_new_db= false;
- if (srv_io_capacity >= SRV_MAX_IO_CAPACITY_LIMIT / 2) {
- /* Avoid overflow. */
- srv_max_io_capacity = SRV_MAX_IO_CAPACITY_LIMIT;
- } else {
- srv_max_io_capacity = std::max(2 * srv_io_capacity, 2000UL);
- }
+ srv_max_io_capacity= srv_io_capacity >= SRV_MAX_IO_CAPACITY_LIMIT / 2
+ ? SRV_MAX_IO_CAPACITY_LIMIT : std::max(2 * srv_io_capacity, 2000UL);
- /* Check if the data files exist or not. */
- dberr_t err = srv_sys_space.check_file_spec(&create_new_db, 5U << 20);
+ /* Check if the data files exist or not. */
+ dberr_t err= srv_sys_space.check_file_spec(&create_new_db, 5U << 20);
- if (err == DB_SUCCESS) {
- err = srv_start(create_new_db);
- }
+ if (create_new_db)
+ {
+ msg("mariadb-backup: InnoDB files do not exist");
+ return true;
+ }
- if (err != DB_SUCCESS) {
- die("mariabackup: innodb_init() returned %d (%s).",
- err, ut_strerr(err));
- }
+ if (err == DB_SUCCESS)
+ err= srv_start(false);
- return(FALSE);
+ if (err != DB_SUCCESS)
+ {
+ msg("mariadb-backup: srv_start() returned %d (%s).", err, ut_strerr(err));
+ return true;
+ }
+
+ ut_ad(srv_force_recovery <= SRV_FORCE_IGNORE_CORRUPT);
+ ut_ad(recv_no_log_write);
+ buf_flush_sync();
+ recv_sys.debug_free();
+ DBUG_ASSERT(!buf_pool.any_io_pending());
+ log_sys.close_file();
+
+ if (xtrabackup_incremental)
+ /* Reset the ib_logfile0 in --target-dir, not --incremental-dir. */
+ srv_log_group_home_dir= xtrabackup_target_dir;
+
+ bool ret;
+ const std::string ib_logfile0{get_log_file_path()};
+ os_file_delete_if_exists_func(ib_logfile0.c_str(), nullptr);
+ os_file_t file= os_file_create_func(ib_logfile0.c_str(),
+ OS_FILE_CREATE, OS_FILE_NORMAL,
+ OS_DATA_FILE_NO_O_DIRECT, false, &ret);
+ if (!ret)
+ {
+ invalid_log:
+ msg("mariadb-backup: Cannot create %s", ib_logfile0.c_str());
+ return true;
+ }
+
+ recv_sys.lsn= log_sys.next_checkpoint_lsn=
+ log_sys.get_lsn() - SIZE_OF_FILE_CHECKPOINT;
+ log_sys.set_latest_format(false); // not encrypted
+ log_hdr_init();
+ byte *b= &log_hdr_buf[log_t::START_OFFSET];
+ b[0]= FILE_CHECKPOINT | 10;
+ mach_write_to_8(b + 3, recv_sys.lsn);
+ b[11]= 1;
+ mach_write_to_4(b + 12, my_crc32c(0, b, 11));
+ static_assert(12 + 4 == SIZE_OF_FILE_CHECKPOINT, "compatibility");
+
+#ifdef _WIN32
+ DWORD len;
+ ret= WriteFile(file, log_hdr_buf, sizeof log_hdr_buf,
+ &len, nullptr) && len == sizeof log_hdr_buf;
+#else
+ ret= sizeof log_hdr_buf == write(file, log_hdr_buf, sizeof log_hdr_buf);
+#endif
+ if (!os_file_close_func(file) || !ret)
+ goto invalid_log;
+ return false;
}
/* ================= common ================= */
@@ -2421,7 +2488,7 @@ xb_read_delta_metadata(const char *filepath, xb_delta_info_t *info)
/* set defaults */
ulint page_size = ULINT_UNDEFINED, zip_size = 0;
- info->space_id = ULINT_UNDEFINED;
+ info->space_id = UINT32_MAX;
fp = fopen(filepath, "r");
if (!fp) {
@@ -2436,7 +2503,8 @@ xb_read_delta_metadata(const char *filepath, xb_delta_info_t *info)
} else if (strcmp(key, "zip_size") == 0) {
zip_size = strtoul(value, NULL, 10);
} else if (strcmp(key, "space_id") == 0) {
- info->space_id = strtoul(value, NULL, 10);
+ info->space_id = static_cast<uint32_t>
+ (strtoul(value, NULL, 10));
}
}
}
@@ -2451,7 +2519,7 @@ xb_read_delta_metadata(const char *filepath, xb_delta_info_t *info)
info->zip_size = zip_size;
}
- if (info->space_id == ULINT_UNDEFINED) {
+ if (info->space_id == UINT32_MAX) {
msg("mariabackup: Warning: This backup was taken with XtraBackup 2.0.1 "
"or earlier, some DDL operations between full and incremental "
"backups may be handled incorrectly");
@@ -2475,7 +2543,7 @@ xb_write_delta_metadata(const char *filename, const xb_delta_info_t *info)
snprintf(buf, sizeof(buf),
"page_size = " ULINTPF "\n"
"zip_size = " ULINTPF " \n"
- "space_id = " ULINTPF "\n",
+ "space_id = %u\n",
info->page_size,
info->zip_size,
info->space_id);
@@ -2505,10 +2573,10 @@ void xtrabackup_io_throttling()
if (!xtrabackup_backup || !xtrabackup_throttle)
return;
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
if (io_ticket-- < 0)
- mysql_cond_wait(&wait_throttle, &log_sys.mutex);
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_cond_wait(&wait_throttle, &recv_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
}
static
@@ -2820,9 +2888,9 @@ static my_bool xtrabackup_copy_datafile(fil_node_t *node, uint thread_n,
memset(&write_filt_ctxt, 0, sizeof(xb_write_filt_ctxt_t));
bool was_dropped;
- pthread_mutex_lock(&backup_mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
was_dropped = (ddl_tracker.drops.find(node->space->id) != ddl_tracker.drops.end());
- pthread_mutex_unlock(&backup_mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
if (was_dropped) {
if (node->is_open()) {
mysql_mutex_lock(&fil_system.mutex);
@@ -2890,10 +2958,10 @@ static my_bool xtrabackup_copy_datafile(fil_node_t *node, uint thread_n,
}
if (res == XB_FIL_CUR_SKIP) {
- pthread_mutex_lock(&backup_mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
fail_undo_ids.insert(
static_cast<uint32_t>(cursor.space_id));
- pthread_mutex_unlock(&backup_mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
break;
}
}
@@ -2904,11 +2972,11 @@ static my_bool xtrabackup_copy_datafile(fil_node_t *node, uint thread_n,
} else {
const fil_space_t::name_type name = node->space->name();
- pthread_mutex_lock(&backup_mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
ddl_tracker.tables_in_backup.emplace(node->space->id,
std::string(name.data(),
name.size()));
- pthread_mutex_unlock(&backup_mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
}
/* close */
@@ -2945,171 +3013,139 @@ skip:
return(FALSE);
}
-/** Copy redo log blocks to the data sink.
-@param start_lsn buffer start LSN
-@param end_lsn buffer end LSN
-@param last whether we are copying the final part of the log
-@return last scanned LSN
-@retval 0 on failure */
-static lsn_t xtrabackup_copy_log(lsn_t start_lsn, lsn_t end_lsn, bool last)
-{
- lsn_t scanned_lsn = start_lsn;
- const byte* log_block = log_sys.buf;
- bool more_data = false;
-
- for (ulint scanned_checkpoint = 0;
- scanned_lsn < end_lsn;
- log_block += OS_FILE_LOG_BLOCK_SIZE) {
- ulint checkpoint = log_block_get_checkpoint_no(log_block);
-
- if (scanned_checkpoint > checkpoint
- && scanned_checkpoint - checkpoint >= 0x80000000UL) {
- /* Garbage from a log buffer flush which was made
- before the most recent database recovery */
- msg(0,"checkpoint wrap: " LSN_PF ",%zx,%zx",
- scanned_lsn, scanned_checkpoint, checkpoint);
- break;
- }
-
- scanned_checkpoint = checkpoint;
-
- ulint data_len = log_block_get_data_len(log_block);
-
- more_data = recv_sys_add_to_parsing_buf(
- log_block,
- scanned_lsn + data_len);
-
- recv_sys.scanned_lsn = scanned_lsn + data_len;
-
- if (data_len == OS_FILE_LOG_BLOCK_SIZE) {
- /* We got a full log block. */
- scanned_lsn += data_len;
- } else if (data_len >= log_sys.trailer_offset()
- || data_len < LOG_BLOCK_HDR_SIZE) {
- /* We got a garbage block (abrupt end of the log). */
- msg(0,"garbage block: " LSN_PF ",%zu",scanned_lsn, data_len);
- break;
- } else {
- /* We got a partial block (abrupt end of the log). */
- scanned_lsn += data_len;
- break;
- }
- }
-
- store_t store= STORE_NO;
- if (more_data && recv_sys.parse(0, &store, false)) {
- msg("Error: copying the log failed");
- return(0);
- }
-
- recv_sys_justify_left_parsing_buf();
-
- log_sys.log.scanned_lsn = scanned_lsn;
-
- end_lsn = last
- ? ut_uint64_align_up(scanned_lsn, OS_FILE_LOG_BLOCK_SIZE)
- : scanned_lsn & ~lsn_t(OS_FILE_LOG_BLOCK_SIZE - 1);
-
- if (ulint write_size = ulint(end_lsn - start_lsn)) {
- if (srv_encrypt_log) {
- log_crypt(log_sys.buf, start_lsn, write_size);
- }
-
- if (ds_write(dst_log_file, log_sys.buf, write_size)) {
- msg("Error: write to logfile failed");
- return(0);
- }
- }
-
- return(scanned_lsn);
-}
-
/** Copy redo log until the current end of the log is reached
-@param last whether we are copying the final part of the log
@return whether the operation failed */
-static bool xtrabackup_copy_logfile(bool last = false)
+static bool xtrabackup_copy_logfile()
{
- mysql_mutex_assert_owner(&log_sys.mutex);
+ mysql_mutex_assert_owner(&recv_sys.mutex);
+ DBUG_EXECUTE_IF("log_checksum_mismatch", return false;);
- ut_a(dst_log_file != NULL);
- ut_ad(recv_sys.is_initialised());
+ ut_a(dst_log_file);
+ ut_ad(recv_sys.is_initialised());
+ const size_t sequence_offset{log_sys.is_encrypted() ? 8U + 5U : 5U};
+ const size_t block_size_1{log_sys.get_block_size() - 1};
- bool overwritten_block = false;
- lsn_t start_lsn;
- lsn_t end_lsn;
+ ut_ad(!log_sys.is_pmem());
- recv_sys.parse_start_lsn = log_copy_scanned_lsn;
- recv_sys.scanned_lsn = log_copy_scanned_lsn;
+ {
+ recv_sys.offset= size_t(recv_sys.lsn - log_sys.get_first_lsn()) &
+ block_size_1;
+ recv_sys.len= 0;
+ }
- start_lsn = ut_uint64_align_down(log_copy_scanned_lsn,
- OS_FILE_LOG_BLOCK_SIZE);
- do {
- end_lsn = start_lsn + RECV_SCAN_SIZE;
+ for (unsigned retry_count{0};;)
+ {
+ recv_sys_t::parse_mtr_result r;
+ size_t start_offset{recv_sys.offset};
- if (xtrabackup_throttle && (io_ticket--) < 0) {
- mysql_cond_wait(&wait_throttle, &log_sys.mutex);
- }
+ {
+ {
+ auto source_offset=
+ log_sys.calc_lsn_offset(recv_sys.lsn + recv_sys.len -
+ recv_sys.offset);
+ source_offset&= ~block_size_1;
+ size_t size{log_sys.buf_size - recv_sys.len};
+ if (UNIV_UNLIKELY(source_offset + size > log_sys.file_size))
+ {
+ const size_t first{size_t(log_sys.file_size - source_offset)};
+ ut_ad(first <= log_sys.buf_size);
+ log_sys.log.read(source_offset, {log_sys.buf, first});
+ size-= first;
+ if (log_sys.START_OFFSET + size > source_offset)
+ size= size_t(source_offset - log_sys.START_OFFSET);
+ if (size)
+ log_sys.log.read(log_sys.START_OFFSET,
+ {log_sys.buf + first, size});
+ size+= first;
+ }
+ else
+ log_sys.log.read(source_offset, {log_sys.buf, size});
+ recv_sys.len= size;
+ }
- lsn_t lsn= start_lsn;
- for (int retries= 0; retries < 100; retries++) {
- if (log_sys.log.read_log_seg(&lsn, end_lsn)
- || lsn != start_lsn) {
- break;
- }
- msg("Retrying read of log at LSN=" LSN_PF, lsn);
- my_sleep(1000);
- }
+ if (log_sys.buf[recv_sys.offset] <= 1)
+ break;
- if (lsn == start_lsn) {
- overwritten_block= !recv_sys.is_corrupt_log()
- && log_block_calc_checksum_crc32(log_sys.buf) ==
- log_block_get_checksum(log_sys.buf)
- && log_block_get_hdr_no(log_sys.buf) >
- log_block_convert_lsn_to_no(start_lsn);
- start_lsn = 0;
- } else {
- mysql_mutex_lock(&recv_sys.mutex);
- start_lsn = xtrabackup_copy_log(start_lsn, lsn, last);
- mysql_mutex_unlock(&recv_sys.mutex);
- }
+ if (recv_sys.parse_mtr(STORE_NO) == recv_sys_t::OK)
+ {
+ do
+ {
+ /* Set the sequence bit (the backed-up log will not wrap around) */
+ byte *seq= &log_sys.buf[recv_sys.offset - sequence_offset];
+ ut_ad(*seq == log_sys.get_sequence_bit(recv_sys.lsn -
+ sequence_offset));
+ *seq= 1;
+ }
+ while ((r= recv_sys.parse_mtr(STORE_NO)) == recv_sys_t::OK);
- if (!start_lsn) {
- const char *reason = recv_sys.is_corrupt_log()
- ? "corrupt log."
- : (overwritten_block
- ? "redo log block is overwritten, please increase redo log size with innodb_log_file_size parameter."
- : "redo log block checksum does not match.");
+ if (ds_write(dst_log_file, log_sys.buf + start_offset,
+ recv_sys.offset - start_offset))
+ {
+ msg("Error: write to ib_logfile0 failed");
+ return true;
+ }
+ else
+ {
+ const auto ofs= recv_sys.offset & ~block_size_1;
+ memmove_aligned<64>(log_sys.buf, log_sys.buf + ofs,
+ recv_sys.len - ofs);
+ recv_sys.len-= ofs;
+ recv_sys.offset&= block_size_1;
+ }
- die("xtrabackup_copy_logfile() failed: %s", reason);
- return true;
- }
- } while (start_lsn == end_lsn);
+ pthread_cond_broadcast(&scanned_lsn_cond);
- ut_ad(start_lsn == log_sys.log.scanned_lsn);
+ if (r == recv_sys_t::GOT_EOF)
+ break;
- if (verbose) {
- msg(">> log scanned up to (" LSN_PF ")", start_lsn);
- }
+ if (recv_sys.offset < log_sys.get_block_size())
+ break;
+
+ if (xtrabackup_throttle && io_ticket-- < 0)
+ mysql_cond_wait(&wait_throttle, &recv_sys.mutex);
- /* update global variable*/
- pthread_mutex_lock(&backup_mutex);
- log_copy_scanned_lsn = start_lsn;
- pthread_cond_broadcast(&scanned_lsn_cond);
- pthread_mutex_unlock(&backup_mutex);
- return(false);
+ retry_count= 0;
+ continue;
+ }
+ else
+ {
+ recv_sys.len= recv_sys.offset & ~block_size_1;
+ if (retry_count == 100)
+ break;
+
+ mysql_mutex_unlock(&recv_sys.mutex);
+ if (!retry_count++)
+ msg("Retrying read of log at LSN=" LSN_PF, recv_sys.lsn);
+ my_sleep(1000);
+ }
+ }
+ mysql_mutex_lock(&recv_sys.mutex);
+ }
+
+ if (verbose)
+ msg(">> log scanned up to (" LSN_PF ")", recv_sys.lsn);
+ return false;
}
/**
Wait until redo log copying thread processes given lsn
*/
-void backup_wait_for_lsn(lsn_t lsn) {
- bool completed = false;
- pthread_mutex_lock(&backup_mutex);
- do {
- pthread_cond_wait(&scanned_lsn_cond, &backup_mutex);
- completed = log_copy_scanned_lsn >= lsn;
- } while (!completed);
- pthread_mutex_unlock(&backup_mutex);
+void backup_wait_for_lsn(lsn_t lsn)
+{
+ mysql_mutex_lock(&recv_sys.mutex);
+ for (lsn_t last_lsn{recv_sys.lsn}; last_lsn < lsn; )
+ {
+ timespec abstime;
+ set_timespec(abstime, 5);
+ if (my_cond_timedwait(&scanned_lsn_cond, &recv_sys.mutex.m_mutex,
+ &abstime) &&
+ last_lsn == recv_sys.lsn)
+ die("Was only able to copy log from " LSN_PF " to " LSN_PF
+ ", not " LSN_PF "; try increasing innodb_log_file_size",
+ log_sys.next_checkpoint_lsn, last_lsn, lsn);
+ last_lsn= recv_sys.lsn;
+ }
+ mysql_mutex_unlock(&recv_sys.mutex);
}
extern lsn_t server_lsn_after_lock;
@@ -3117,20 +3153,20 @@ extern lsn_t server_lsn_after_lock;
static void log_copying_thread()
{
my_thread_init();
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
while (!xtrabackup_copy_logfile() &&
- (!metadata_to_lsn || metadata_to_lsn > log_copy_scanned_lsn))
+ (!metadata_to_lsn || metadata_to_lsn > recv_sys.lsn))
{
timespec abstime;
set_timespec_nsec(abstime, 1000000ULL * xtrabackup_log_copy_interval);
- mysql_cond_timedwait(&log_copying_stop, &log_sys.mutex, &abstime);
+ mysql_cond_timedwait(&log_copying_stop, &recv_sys.mutex, &abstime);
}
log_copying_running= false;
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
my_thread_end();
}
-/** whether io_watching_thread() is active; protected by log_sys.mutex */
+/** whether io_watching_thread() is active; protected by recv_sys.mutex */
static bool have_io_watching_thread;
/* io throttle watching (rough) */
@@ -3140,14 +3176,14 @@ static void io_watching_thread()
/* currently, for --backup only */
ut_ad(xtrabackup_backup);
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
ut_ad(have_io_watching_thread);
while (log_copying_running && !metadata_to_lsn)
{
timespec abstime;
set_timespec(abstime, 1);
- mysql_cond_timedwait(&log_copying_stop, &log_sys.mutex, &abstime);
+ mysql_cond_timedwait(&log_copying_stop, &recv_sys.mutex, &abstime);
io_ticket= xtrabackup_throttle;
mysql_cond_broadcast(&wait_throttle);
}
@@ -3156,7 +3192,7 @@ static void io_watching_thread()
xtrabackup_throttle= 0;
have_io_watching_thread= false;
mysql_cond_broadcast(&wait_throttle);
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
my_thread_end();
}
@@ -3243,7 +3279,7 @@ Initialize the appropriate datasink(s). Both local backups and streaming in the
Otherwise (i.e. when streaming in the 'tar' format) we need 2 separate datasinks
for the data stream (and don't allow parallel data copying) and for metainfo
-files (including LOG_FILE_NAME). The second datasink writes to temporary
+files (including ib_logfile0). The second datasink writes to temporary
files first, and then streams them in a serialized way when closed. */
static void
xtrabackup_init_datasinks(void)
@@ -3357,7 +3393,7 @@ static void xb_load_single_table_tablespace(const char *dirname,
const char *filname,
bool is_remote,
bool skip_node_page0,
- ulint defer_space_id)
+ uint32_t defer_space_id)
{
ut_ad(srv_operation == SRV_OPERATION_BACKUP
|| srv_operation == SRV_OPERATION_RESTORE_DELTA
@@ -3378,7 +3414,6 @@ static void xb_load_single_table_tablespace(const char *dirname,
size_t dirlen = dirname == NULL ? 0 : strlen(dirname);
size_t namelen = strlen(filname);
ulint pathlen = dirname == NULL ? namelen + 1: dirlen + namelen + 2;
- lsn_t flush_lsn;
dberr_t err;
fil_space_t *space;
bool defer = false;
@@ -3413,7 +3448,7 @@ static void xb_load_single_table_tablespace(const char *dirname,
for (int i = 0; i < 10; i++) {
file->m_defer = false;
- err = file->validate_first_page(&flush_lsn);
+ err = file->validate_first_page();
if (file->m_defer) {
if (defer_space_id) {
@@ -3456,7 +3491,8 @@ static void xb_load_single_table_tablespace(const char *dirname,
0, false, false);
node->deferred= defer;
mysql_mutex_lock(&fil_system.mutex);
- space->read_page0();
+ if (!space->read_page0())
+ err= DB_CANNOT_OPEN_FILE;
mysql_mutex_unlock(&fil_system.mutex);
if (srv_operation == SRV_OPERATION_RESTORE_DELTA
@@ -3476,7 +3512,7 @@ static void xb_load_single_table_tablespace(const char *dirname,
static void xb_load_single_table_tablespace(const std::string &space_name,
bool skip_node_page0,
- ulint defer_space_id)
+ uint32_t defer_space_id)
{
std::string name(space_name);
bool is_remote= access((name + ".ibd").c_str(), R_OK) != 0;
@@ -3855,9 +3891,9 @@ static dberr_t xb_assign_undo_space_start()
pfs_os_file_t file;
bool ret;
dberr_t error = DB_SUCCESS;
- ulint space;
+ uint32_t space;
+ uint32_t fsp_flags;
int n_retries = 5;
- ulint fsp_flags;
file = os_file_create(0, srv_sys_space.first_datafile()->filepath(),
OS_FILE_OPEN, OS_FILE_NORMAL, OS_DATA_FILE, true, &ret);
@@ -3878,7 +3914,7 @@ static dberr_t xb_assign_undo_space_start()
}
fsp_flags = mach_read_from_4(
- page + FSP_HEADER_OFFSET + FSP_SPACE_FLAGS);
+ page + FSP_HEADER_OFFSET + FSP_SPACE_FLAGS);
retry:
if (os_file_read(IORequestRead, file, page,
TRX_SYS_PAGE_NO << srv_page_size_shift,
@@ -3928,7 +3964,7 @@ static void xb_close_undo_tablespaces()
{
if (srv_undo_space_id_start == 0)
return;
- for (ulint space_id= srv_undo_space_id_start;
+ for (uint32_t space_id= srv_undo_space_id_start;
space_id < srv_undo_space_id_start + srv_undo_tablespaces_open;
space_id++)
{
@@ -3948,7 +3984,6 @@ xb_load_tablespaces()
bool create_new_db;
dberr_t err;
ulint sum_of_new_sizes;
- lsn_t flush_lsn;
ut_ad(srv_operation == SRV_OPERATION_BACKUP
|| srv_operation == SRV_OPERATION_RESTORE_DELTA);
@@ -3962,8 +3997,7 @@ xb_load_tablespaces()
}
for (int i= 0; i < 10; i++) {
- err = srv_sys_space.open_or_create(false, false, &sum_of_new_sizes,
- &flush_lsn);
+ err = srv_sys_space.open_or_create(false, false, &sum_of_new_sizes);
if (err == DB_PAGE_CORRUPTED || err == DB_CORRUPTION) {
my_sleep(1000);
}
@@ -4426,18 +4460,18 @@ static void stop_backup_threads()
if (log_copying_running || have_io_watching_thread)
{
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
fputs("mariabackup: Stopping log copying thread", stderr);
fflush(stderr);
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
while (log_copying_running || have_io_watching_thread)
{
mysql_cond_broadcast(&log_copying_stop);
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
putc('.', stderr);
fflush(stderr);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
}
putc('\n', stderr);
}
@@ -4449,39 +4483,34 @@ static void stop_backup_threads()
@return whether the operation succeeded */
static bool xtrabackup_backup_low()
{
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
ut_ad(!metadata_to_lsn);
/* read the latest checkpoint lsn */
{
- ulint max_cp_field;
-
- if (recv_find_max_checkpoint(&max_cp_field) == DB_SUCCESS
- && log_sys.log.format != 0) {
- if (max_cp_field == LOG_CHECKPOINT_1) {
- log_sys.log.read(max_cp_field,
- {log_sys.checkpoint_buf,
- OS_FILE_LOG_BLOCK_SIZE});
- }
- metadata_to_lsn = mach_read_from_8(
- log_sys.checkpoint_buf + LOG_CHECKPOINT_LSN);
+ const lsn_t lsn = recv_sys.lsn;
+ if (recv_sys.find_checkpoint() == DB_SUCCESS
+ && log_sys.is_latest()) {
+ metadata_to_lsn = log_sys.next_checkpoint_lsn;
msg("mariabackup: The latest check point"
" (for incremental): '" LSN_PF "'",
metadata_to_lsn);
} else {
- msg("Error: recv_find_max_checkpoint() failed.");
+ msg("Error: recv_sys.find_checkpoint() failed.");
}
+ recv_sys.lsn = lsn;
stop_backup_threads();
}
- if (metadata_to_lsn && xtrabackup_copy_logfile(true)) {
- mysql_mutex_unlock(&log_sys.mutex);
+ if (metadata_to_lsn && xtrabackup_copy_logfile()) {
+ mysql_mutex_unlock(&recv_sys.mutex);
ds_close(dst_log_file);
dst_log_file = NULL;
return false;
}
- mysql_mutex_unlock(&log_sys.mutex);
+
+ mysql_mutex_unlock(&recv_sys.mutex);
if (ds_close(dst_log_file) || !metadata_to_lsn) {
dst_log_file = NULL;
@@ -4516,7 +4545,7 @@ static bool xtrabackup_backup_low()
"incremental");
metadata_from_lsn = incremental_lsn;
}
- metadata_last_lsn = log_copy_scanned_lsn;
+ metadata_last_lsn = recv_sys.lsn;
if (!xtrabackup_stream_metadata(ds_meta)) {
msg("Error: failed to stream metadata.");
@@ -4554,7 +4583,6 @@ static bool xtrabackup_backup_func()
pthread_mutex_t count_mutex;
CorruptedPages corrupted_pages;
data_thread_ctxt_t *data_threads;
- pthread_mutex_init(&backup_mutex, NULL);
pthread_cond_init(&scanned_lsn_cond, NULL);
#ifdef USE_POSIX_FADVISE
@@ -4569,7 +4597,7 @@ static bool xtrabackup_backup_func()
return(false);
}
msg("cd to %s", mysql_real_data_home);
- encryption_plugin_backup_init(mysql_connection);
+ xb_plugin_backup_init(mysql_connection);
msg("open files limit requested %lu, set to %lu",
xb_open_files_limit,
xb_set_max_open_files(xb_open_files_limit));
@@ -4591,10 +4619,10 @@ static bool xtrabackup_backup_func()
if(innodb_init_param()) {
fail:
if (log_copying_running) {
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
metadata_to_lsn = 1;
stop_backup_threads();
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
}
log_file_op = NULL;
@@ -4641,8 +4669,27 @@ fail:
}
log_sys.create();
- log_sys.log.create();
- log_sys.log.open_file(get_log_file_path());
+ /* get current checkpoint_lsn */
+ {
+ mysql_mutex_lock(&recv_sys.mutex);
+
+ dberr_t err = recv_sys.find_checkpoint();
+
+ if (err != DB_SUCCESS) {
+ msg("Error: cannot read redo log header");
+ } else if (!log_sys.is_latest()) {
+ msg("Error: cannot process redo log before "
+ "MariaDB 10.8");
+ err = DB_ERROR;
+ } else {
+ recv_needed_recovery = true;
+ }
+ mysql_mutex_unlock(&recv_sys.mutex);
+
+ if (err != DB_SUCCESS) {
+ goto fail;
+ }
+ }
/* create extra LSN dir if it does not exist. */
if (xtrabackup_extra_lsndir
@@ -4661,45 +4708,6 @@ fail:
goto fail;
}
-
- {
- /* definition from recv_recovery_from_checkpoint_start() */
- ulint max_cp_field;
-
- /* get current checkpoint_lsn */
- /* Look for the latest checkpoint from any of the log groups */
-
- mysql_mutex_lock(&log_sys.mutex);
-
-reread_log_header:
- dberr_t err = recv_find_max_checkpoint(&max_cp_field);
-
- if (err != DB_SUCCESS)
- msg("Error: cannot read redo log header");
- else if (log_sys.log.format == 0) {
- msg("Error: cannot process redo log before MariaDB 10.2.2");
- err = DB_ERROR;
- }
- else {
- byte* buf = log_sys.checkpoint_buf;
- checkpoint_lsn_start = log_sys.log.get_lsn();
- checkpoint_no_start = log_sys.next_checkpoint_no;
-
- log_sys.log.read(max_cp_field, {buf, OS_FILE_LOG_BLOCK_SIZE});
-
- if (checkpoint_no_start
- != mach_read_from_8(buf + LOG_CHECKPOINT_NO)
- || checkpoint_lsn_start
- != mach_read_from_8(buf + LOG_CHECKPOINT_LSN)
- || log_sys.log.get_lsn_offset()
- != mach_read_from_8(buf + LOG_CHECKPOINT_OFFSET))
- goto reread_log_header;
- }
- mysql_mutex_unlock(&log_sys.mutex);
-
- if (err != DB_SUCCESS)
- goto fail;
-
xtrabackup_init_datasinks();
if (!select_history()) {
@@ -4716,44 +4724,13 @@ reread_log_header:
}
/* label it */
- byte* log_hdr_buf = static_cast<byte*>(
- aligned_malloc(LOG_FILE_HDR_SIZE, OS_FILE_LOG_BLOCK_SIZE));
- memset(log_hdr_buf, 0, LOG_FILE_HDR_SIZE);
-
- byte *log_hdr_field = log_hdr_buf;
- mach_write_to_4(LOG_HEADER_FORMAT + log_hdr_field, log_sys.log.format);
- mach_write_to_4(LOG_HEADER_SUBFORMAT + log_hdr_field, log_sys.log.subformat);
- mach_write_to_8(LOG_HEADER_START_LSN + log_hdr_field, checkpoint_lsn_start);
- strcpy(reinterpret_cast<char*>(LOG_HEADER_CREATOR + log_hdr_field),
- "Backup " MYSQL_SERVER_VERSION);
- log_block_set_checksum(log_hdr_field,
- log_block_calc_checksum_crc32(log_hdr_field));
-
- /* copied from log_group_checkpoint() */
- log_hdr_field +=
- (log_sys.next_checkpoint_no & 1) ? LOG_CHECKPOINT_2 : LOG_CHECKPOINT_1;
- /* The least significant bits of LOG_CHECKPOINT_OFFSET must be
- stored correctly in the copy of the LOG_FILE_NAME. The most significant
- bits, which identify the start offset of the log block in the file,
- we did choose freely, as LOG_FILE_HDR_SIZE. */
- ut_ad(!((log_sys.log.get_lsn() ^ checkpoint_lsn_start)
- & (OS_FILE_LOG_BLOCK_SIZE - 1)));
- /* Adjust the checkpoint page. */
- memcpy(log_hdr_field, log_sys.checkpoint_buf, OS_FILE_LOG_BLOCK_SIZE);
- mach_write_to_8(log_hdr_field + LOG_CHECKPOINT_OFFSET,
- (checkpoint_lsn_start & (OS_FILE_LOG_BLOCK_SIZE - 1))
- | LOG_FILE_HDR_SIZE);
- log_block_set_checksum(log_hdr_field,
- log_block_calc_checksum_crc32(log_hdr_field));
-
+ recv_sys.file_checkpoint = log_sys.next_checkpoint_lsn;
+ log_hdr_init();
/* Write log header*/
- if (ds_write(dst_log_file, log_hdr_buf, LOG_FILE_HDR_SIZE)) {
+ if (ds_write(dst_log_file, log_hdr_buf, 12288)) {
msg("error: write to logfile failed");
- aligned_free(log_hdr_buf);
goto fail;
}
-
- aligned_free(log_hdr_buf);
log_copying_running = true;
mysql_cond_init(0, &log_copying_stop, nullptr);
@@ -4767,27 +4744,26 @@ reread_log_header:
}
/* Populate fil_system with tablespaces to copy */
- err = xb_load_tablespaces();
- if (err != DB_SUCCESS) {
+ if (dberr_t err = xb_load_tablespaces()) {
msg("merror: xb_load_tablespaces() failed with"
" error %s.", ut_strerr(err));
-fail_before_log_copying_thread_start:
log_copying_running = false;
goto fail;
}
/* copy log file by current position */
- log_copy_scanned_lsn = checkpoint_lsn_start;
- recv_sys.recovered_lsn = log_copy_scanned_lsn;
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
+ recv_sys.lsn = log_sys.next_checkpoint_lsn;
const bool log_copy_failed = xtrabackup_copy_logfile();
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
- if (log_copy_failed)
- goto fail_before_log_copying_thread_start;
+ if (log_copy_failed) {
+ log_copying_running = false;
+ goto fail;
+ }
DBUG_MARIABACKUP_EVENT("before_innodb_log_copy_thread_started", {});
@@ -4843,7 +4819,6 @@ fail_before_log_copying_thread_start:
pthread_mutex_destroy(&count_mutex);
free(data_threads);
- }
bool ok = backup_start(corrupted_pages);
@@ -4872,17 +4847,17 @@ fail_before_log_copying_thread_start:
}
xtrabackup_destroy_datasinks();
- msg("Redo log (from LSN " LSN_PF " to " LSN_PF
- ") was copied.", checkpoint_lsn_start, log_copy_scanned_lsn);
+ msg("Redo log (from LSN " LSN_PF " to " LSN_PF ") was copied.",
+ log_sys.next_checkpoint_lsn, recv_sys.lsn);
xb_filters_free();
xb_data_files_close();
/* Make sure that the latest checkpoint was included */
- if (metadata_to_lsn > log_copy_scanned_lsn) {
+ if (metadata_to_lsn > recv_sys.lsn) {
msg("Error: failed to copy enough redo log ("
"LSN=" LSN_PF "; checkpoint LSN=" LSN_PF ").",
- log_copy_scanned_lsn, metadata_to_lsn);
+ recv_sys.lsn, metadata_to_lsn);
goto fail;
}
@@ -4890,7 +4865,6 @@ fail_before_log_copying_thread_start:
log_file_op = NULL;
undo_space_trunc = NULL;
first_page_init = NULL;
- pthread_mutex_destroy(&backup_mutex);
pthread_cond_destroy(&scanned_lsn_cond);
if (!corrupted_pages.empty()) {
ut_ad(opt_log_innodb_page_corruption);
@@ -4926,9 +4900,9 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages)
space_id_to_name_t new_tables;
/* Disable further DDL on backed up tables (only needed for --no-lock).*/
- pthread_mutex_lock(&backup_mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
log_file_op = backup_file_op_fail;
- pthread_mutex_unlock(&backup_mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
DBUG_MARIABACKUP_EVENT("backup_fix_ddl", {});
@@ -4937,7 +4911,7 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages)
iter++) {
const std::string name = iter->second;
- ulint id = iter->first;
+ uint32_t id = iter->first;
if (ddl_tracker.drops.find(id) != ddl_tracker.drops.end()) {
dropped_tables.insert(name);
@@ -4963,7 +4937,7 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages)
iter != ddl_tracker.id_to_name.end();
iter++) {
- ulint id = iter->first;
+ uint32_t id = iter->first;
std::string name = iter->second;
if (ddl_tracker.tables_in_backup.find(id) != ddl_tracker.tables_in_backup.end()) {
@@ -5111,8 +5085,8 @@ bool
xb_space_create_file(
/*==================*/
const char* path, /*!<in: path to tablespace */
- ulint space_id, /*!<in: space id */
- ulint flags, /*!<in: tablespace flags */
+ uint32_t space_id, /*!<in: space id */
+ uint32_t flags, /*!<in: tablespace flags */
pfs_os_file_t* file) /*!<out: file handle */
{
bool ret;
@@ -5175,7 +5149,7 @@ xb_delta_open_matching_space(
ut_a(dbname != NULL ||
!fil_is_user_tablespace_id(info.space_id) ||
- info.space_id == ULINT_UNDEFINED);
+ info.space_id == UINT32_MAX);
*success = false;
@@ -5216,7 +5190,7 @@ xb_delta_open_matching_space(
return OS_FILE_CLOSED;
}
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
if (!fil_is_user_tablespace_id(info.space_id)) {
found:
/* open the file and return its handle */
@@ -5229,7 +5203,7 @@ found:
msg("mariabackup: Cannot open file %s\n", real_name);
}
exit:
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
return file;
}
@@ -5251,14 +5225,14 @@ exit:
if (fil_space != NULL) {
if (fil_space->id == info.space_id
- || info.space_id == ULINT_UNDEFINED) {
+ || info.space_id == UINT32_MAX) {
/* we found matching space */
goto found;
} else {
char tmpname[FN_REFLEN];
- snprintf(tmpname, FN_REFLEN, "%s/xtrabackup_tmp_#" ULINTPF,
+ snprintf(tmpname, FN_REFLEN, "%s/xtrabackup_tmp_#%u",
dbname, fil_space->id);
msg("mariabackup: Renaming %s to %s.ibd",
@@ -5272,7 +5246,7 @@ exit:
}
}
- if (info.space_id == ULINT_UNDEFINED)
+ if (info.space_id == UINT32_MAX)
{
die("Can't handle DDL operation on tablespace "
"%s\n", dest_space_name);
@@ -5298,7 +5272,7 @@ exit:
}
/* No matching space found. create the new one. */
- const ulint flags = info.zip_size
+ const uint32_t flags = info.zip_size
? get_bit_shift(info.page_size
>> (UNIV_ZIP_SIZE_SHIFT_MIN - 1))
<< FSP_FLAGS_POS_ZIP_SSIZE
@@ -5994,7 +5968,7 @@ static bool xtrabackup_prepare_func(char** argv)
}
int argc; for (argc = 0; argv[argc]; argc++) {}
- encryption_plugin_prepare_init(argc, argv);
+ xb_plugin_prepare_init(argc, argv, xtrabackup_incremental_dir);
xtrabackup_target_dir= mysql_data_home_buff;
xtrabackup_target_dir[0]=FN_CURLIB; // all paths are relative from here
@@ -6048,7 +6022,9 @@ static bool xtrabackup_prepare_func(char** argv)
srv_operation = SRV_OPERATION_RESTORE_DELTA;
if (innodb_init_param()) {
- goto error_cleanup;
+error:
+ ok = false;
+ goto cleanup;
}
recv_sys.create();
@@ -6059,7 +6035,7 @@ static bool xtrabackup_prepare_func(char** argv)
if (dberr_t err = xb_load_tablespaces()) {
msg("mariabackup: error: xb_data_files_init() failed "
"with error %s\n", ut_strerr(err));
- goto error_cleanup;
+ goto error;
}
ok = fil_system.sys_space->open(false)
@@ -6079,14 +6055,14 @@ static bool xtrabackup_prepare_func(char** argv)
fil_system.close();
innodb_free_param();
log_sys.close();
- if (!ok) goto error_cleanup;
+ if (!ok) goto cleanup;
}
srv_operation = xtrabackup_export
? SRV_OPERATION_RESTORE_EXPORT : SRV_OPERATION_RESTORE;
if (innodb_init_param()) {
- goto error_cleanup;
+ goto error;
}
fil_system.freeze_space_list = 0;
@@ -6103,7 +6079,7 @@ static bool xtrabackup_prepare_func(char** argv)
}
if (innodb_init()) {
- goto error_cleanup;
+ goto error;
}
ut_ad(!fil_system.freeze_space_list);
@@ -6139,11 +6115,10 @@ static bool xtrabackup_prepare_func(char** argv)
}
/* Check whether the log is applied enough or not. */
- if (recv_sys.recovered_lsn && recv_sys.recovered_lsn < target_lsn) {
+ if (recv_sys.lsn && recv_sys.lsn < target_lsn) {
msg("mariabackup: error: "
"The log was only applied up to LSN " LSN_PF
- ", instead of " LSN_PF,
- recv_sys.recovered_lsn, target_lsn);
+ ", instead of " LSN_PF, recv_sys.lsn, target_lsn);
ok = false;
}
#ifdef WITH_WSREP
@@ -6189,7 +6164,7 @@ static bool xtrabackup_prepare_func(char** argv)
if (ok && xtrabackup_export)
ok= (prepare_export() == 0);
-error_cleanup:
+cleanup:
xb_filters_free();
return ok && !ib::error::was_logged() && corrupted_pages.empty();
}
@@ -6553,12 +6528,17 @@ void handle_options(int argc, char **argv, char ***argv_server,
{
prepare= true;
}
- else if (!strncmp(argv[i], "--target-dir", optend - argv[i]) &&
+ else if (!strncmp(argv[i], "--incremental-dir", optend - argv[i]) &&
*optend)
{
target_dir= optend + 1;
}
- else if (!*optend && argv[i][0] != '-')
+ else if (!strncmp(argv[i], "--target-dir", optend - argv[i]) &&
+ *optend && !target_dir)
+ {
+ target_dir= optend + 1;
+ }
+ else if (!*optend && argv[i][0] != '-' && !target_dir)
{
target_dir= argv[i];
}
diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h
index ff7adf49252..6c58d64165d 100644
--- a/extra/mariabackup/xtrabackup.h
+++ b/extra/mariabackup/xtrabackup.h
@@ -31,12 +31,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
struct xb_delta_info_t
{
- xb_delta_info_t(ulint page_size, ulint zip_size, ulint space_id)
+ xb_delta_info_t(ulint page_size, ulint zip_size, uint32_t space_id)
: page_size(page_size), zip_size(zip_size), space_id(space_id) {}
ulint page_size;
ulint zip_size;
- ulint space_id;
+ uint32_t space_id;
};
class CorruptedPages
@@ -44,23 +44,23 @@ class CorruptedPages
public:
CorruptedPages();
~CorruptedPages();
- void add_page(const char *file_name, ulint space_id, unsigned page_no);
- bool contains(ulint space_id, unsigned page_no) const;
- void drop_space(ulint space_id);
- void rename_space(ulint space_id, const std::string &new_name);
+ void add_page(const char *file_name, page_id_t page_id);
+ bool contains(page_id_t page_id) const;
+ void drop_space(uint32_t space_id);
+ void rename_space(uint32_t space_id, const std::string &new_name);
bool print_to_file(const char *file_name) const;
void read_from_file(const char *file_name);
bool empty() const;
void zero_out_free_pages();
private:
- void add_page_no_lock(const char *space_name, ulint space_id,
- unsigned page_no, bool convert_space_name);
+ void add_page_no_lock(const char *space_name, page_id_t page_id,
+ bool convert_space_name);
struct space_info_t {
std::string space_name;
- std::set<unsigned> pages;
+ std::set<uint32_t> pages;
};
- typedef std::map<ulint, space_info_t> container_t;
+ typedef std::map<uint32_t, space_info_t> container_t;
mutable pthread_mutex_t m_mutex;
container_t m_spaces;
};
@@ -81,9 +81,6 @@ extern uint opt_protocol;
extern ds_ctxt_t *ds_meta;
extern ds_ctxt_t *ds_data;
-/* The last checkpoint LSN at the backup startup time */
-extern lsn_t checkpoint_lsn_start;
-
extern xb_page_bitmap *changed_page_bitmap;
extern char *xtrabackup_incremental;
diff --git a/extra/my_print_defaults.c b/extra/my_print_defaults.c
index b7f52382721..ef2f483556a 100644
--- a/extra/my_print_defaults.c
+++ b/extra/my_print_defaults.c
@@ -48,20 +48,6 @@ static struct my_option my_long_options[] =
{"debug", '#', "Output debug log", (char**) &default_dbug_option,
(char**) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
#endif
- {"defaults-file", 'c',
- "Read this file only, do not read global or per-user config "
- "files; should be the first option",
- (char**) &config_file, (char*) &config_file, 0, GET_STR, REQUIRED_ARG,
- 0, 0, 0, 0, 0, 0},
- {"defaults-extra-file", 'e',
- "Read this file after the global config file and before the config "
- "file in the users home directory; should be the first option",
- (void *)&my_defaults_extra_file, (void *)&my_defaults_extra_file, 0,
- GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
- {"defaults-group-suffix", 'g',
- "In addition to the given groups, read also groups with this suffix",
- (char**) &my_defaults_group_suffix, (char**) &my_defaults_group_suffix,
- 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"mysqld", 0, "Read the same set of groups that the mysqld binary does.",
&opt_mysqld, &opt_mysqld, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"no-defaults", 'n', "Return an empty string (useful for scripts).",
@@ -109,9 +95,6 @@ get_one_option(const struct my_option *opt __attribute__((unused)),
const char *filename __attribute__((unused)))
{
switch (opt->id) {
- case 'c':
- opt_defaults_file_used= 1;
- break;
case 'n':
cleanup_and_exit(0);
case 'I':
@@ -141,50 +124,35 @@ static int get_options(int *argc,char ***argv)
return 0;
}
-static char *make_args(const char *s1, const char *s2)
-{
- char *s= malloc(strlen(s1) + strlen(s2) + 1);
- strmov(strmov(s, s1), s2);
- return s;
-}
-
int main(int argc, char **argv)
{
- int count= 0, error, no_defaults= 0;
+ int count, error, args_used;
char **load_default_groups= 0, *tmp_arguments[6];
char **argument, **arguments, **org_argv;
int nargs, i= 0;
MY_INIT(argv[0]);
org_argv= argv;
- if (*argv && !strcmp(*argv, "--no-defaults"))
- {
- argv++;
- ++count;
- no_defaults= 1;
- }
- /* Copy program name and --no-defaults if present*/
+ args_used= get_defaults_options(argv);
+
+ /* Copy defaults-xxx arguments & program name */
+ count= args_used;
arguments= tmp_arguments;
- memcpy((char*) arguments, (char*) org_argv, (++count)*sizeof(*org_argv));
+ memcpy((char*) arguments, (char*) org_argv, count*sizeof(*org_argv));
arguments[count]= 0;
+ /*
+ We already process --defaults* options at the beginning in
+ get_defaults_options(). So skip --defaults* options and
+ pass remaining options to handle_options().
+ */
+ org_argv+=args_used-1;
+ argc-=args_used-1;
+
/* Check out the args */
- if (get_options(&argc,&argv))
+ if (get_options(&argc,&org_argv))
cleanup_and_exit(1);
- if (!no_defaults)
- {
- if (opt_defaults_file_used)
- arguments[count++]= make_args("--defaults-file=", config_file);
- if (my_defaults_extra_file)
- arguments[count++]= make_args("--defaults-extra-file=",
- my_defaults_extra_file);
- if (my_defaults_group_suffix)
- arguments[count++]= make_args("--defaults-group-suffix=",
- my_defaults_group_suffix);
- arguments[count]= 0;
- }
-
nargs= argc + 1;
if (opt_mysqld)
nargs+= array_elements(mysqld_groups);
@@ -201,7 +169,7 @@ int main(int argc, char **argv)
for (; mysqld_groups[i]; i++)
load_default_groups[i]= (char*) mysqld_groups[i];
}
- memcpy(load_default_groups + i, argv, (argc + 1) * sizeof(*argv));
+ memcpy(load_default_groups + i, org_argv, (argc + 1) * sizeof(*org_argv));
if ((error= load_defaults(config_file, (const char **) load_default_groups,
&count, &arguments)))
{
diff --git a/include/hash.h b/include/hash.h
index 00ffca503fc..c0a846ac120 100644
--- a/include/hash.h
+++ b/include/hash.h
@@ -64,8 +64,8 @@ typedef struct st_hash {
typedef uint HASH_SEARCH_STATE;
#define my_hash_init(A,B,C,D,E,F,G,H,I) my_hash_init2(A,B,0,C,D,E,F,G,0,H,I)
-my_bool my_hash_init2(PSI_memory_key psi_key, HASH *hash, uint growth_size,
- CHARSET_INFO *charset, ulong default_array_elements,
+my_bool my_hash_init2(PSI_memory_key psi_key, HASH *hash, size_t growth_size,
+ CHARSET_INFO *charset, size_t default_array_elements,
size_t key_offset, size_t key_length,
my_hash_get_key get_key, my_hash_function hash_function,
void (*free_element)(void*), uint flags);
diff --git a/include/ilist.h b/include/ilist.h
index dc8be5d5044..3349959e17e 100644
--- a/include/ilist.h
+++ b/include/ilist.h
@@ -106,6 +106,10 @@ public:
}
reference operator*() noexcept { return *static_cast<pointer>(node_); }
+ const_reference operator*() const noexcept
+ {
+ return *static_cast<pointer>(node_);
+ }
pointer operator->() noexcept { return static_cast<pointer>(node_); }
friend bool operator==(const Iterator &lhs, const Iterator &rhs) noexcept
diff --git a/include/json_lib.h b/include/json_lib.h
index 4e6d2e6f393..dfb76cadfad 100644
--- a/include/json_lib.h
+++ b/include/json_lib.h
@@ -1,6 +1,8 @@
#ifndef JSON_LIB_INCLUDED
#define JSON_LIB_INCLUDED
+#include <my_sys.h>
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -172,7 +174,7 @@ enum json_states {
enum json_value_types
{
- JSON_VALUE_UNINITALIZED=0,
+ JSON_VALUE_UNINITIALIZED=0,
JSON_VALUE_OBJECT=1,
JSON_VALUE_ARRAY=2,
JSON_VALUE_STRING=3,
@@ -372,6 +374,9 @@ int json_find_paths_first(json_engine_t *je, json_find_paths_t *state,
int json_find_paths_next(json_engine_t *je, json_find_paths_t *state);
+#define JSON_ERROR_OUT_OF_SPACE (-1)
+#define JSON_ERROR_ILLEGAL_SYMBOL (-2)
+
/*
Convert JSON string constant into ordinary string constant
which can involve unpacking json escapes and changing character set.
@@ -384,10 +389,13 @@ int json_unescape(CHARSET_INFO *json_cs,
uchar *res, uchar *res_end);
/*
- Convert ordinary string constant into JSON string constant.
- which can involve appropriate escaping and changing character set.
- Returns negative integer in the case of an error,
- the length of the result otherwise.
+ Convert a string constant into JSON string constant.
+ This can involve appropriate escaping and changing the character set.
+ Returns the length of the result on success,
+ on error returns a negative error code.
+ Some error codes:
+ JSON_ERROR_OUT_OF_SPACE Not enough space in the provided buffer
+ JSON_ERROR_ILLEGAL_SYMBOL Source symbol cannot be represented in JSON
*/
int json_escape(CHARSET_INFO *str_cs, const uchar *str, const uchar *str_end,
CHARSET_INFO *json_cs, uchar *json, uchar *json_end);
@@ -432,6 +440,9 @@ int json_locate_key(const char *js, const char *js_end,
const char **key_start, const char **key_end,
int *comma_pos);
+int json_normalize(DYNAMIC_STRING *result,
+ const char *s, size_t size, CHARSET_INFO *cs);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/m_ctype.h b/include/m_ctype.h
index cd248ce416c..5f65385fd3f 100644
--- a/include/m_ctype.h
+++ b/include/m_ctype.h
@@ -135,8 +135,8 @@ typedef struct my_contraction_list_t
my_bool my_uca_can_be_contraction_head(const MY_CONTRACTIONS *c, my_wc_t wc);
my_bool my_uca_can_be_contraction_tail(const MY_CONTRACTIONS *c, my_wc_t wc);
-uint16 *my_uca_contraction2_weight(const MY_CONTRACTIONS *c,
- my_wc_t wc1, my_wc_t wc2);
+const uint16 *my_uca_contraction2_weight(const MY_CONTRACTIONS *c,
+ my_wc_t wc1, my_wc_t wc2);
/* Collation weights on a single level (e.g. primary, secondary, tertiary) */
diff --git a/include/mariadb_capi_rename.h b/include/mariadb_capi_rename.h
index 616a9142fe6..58e16fdc0c0 100644
--- a/include/mariadb_capi_rename.h
+++ b/include/mariadb_capi_rename.h
@@ -22,7 +22,7 @@
#ifndef MARIADB_CAPI_RENAME_INCLUDED
#define MARIADB_CAPI_RENAME_INCLUDED
-#if !defined(EMBEDDED_LIBRARY)
+#if !defined(EMBEDDED_LIBRARY) && !defined(MYSQL_DYNAMIC_PLUGIN)
#define MARIADB_ADD_PREFIX(_SYMBOL) server_##_SYMBOL
#define mysql_real_connect MARIADB_ADD_PREFIX(mysql_real_connect)
diff --git a/include/my_alloc.h b/include/my_alloc.h
index 181f637c093..944dcb6e1bd 100644
--- a/include/my_alloc.h
+++ b/include/my_alloc.h
@@ -20,7 +20,7 @@
#ifndef _my_alloc_h
#define _my_alloc_h
-#include <mysql/psi/psi_memory.h>
+#include "mysql/psi/psi_base.h"
#define ALLOC_MAX_BLOCK_TO_DROP 4096
#define ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP 10
@@ -50,11 +50,12 @@ typedef struct st_mem_root
first free block in queue test counter (if it exceed
MAX_BLOCK_USAGE_BEFORE_DROP block will be dropped in 'used' list)
*/
- unsigned int first_block_usage;
+ unsigned short first_block_usage;
+ unsigned short flags;
void (*error_handler)(void);
- PSI_memory_key m_psi_key;
+ PSI_memory_key psi_key;
} MEM_ROOT;
#ifdef __cplusplus
diff --git a/include/my_bitmap.h b/include/my_bitmap.h
index f19254404c1..f88a6fe8d9d 100644
--- a/include/my_bitmap.h
+++ b/include/my_bitmap.h
@@ -28,12 +28,6 @@ typedef struct st_bitmap
{
my_bitmap_map *bitmap;
my_bitmap_map *last_word_ptr;
- /*
- mutex will be acquired for the duration of each bitmap operation if
- thread_safe flag in bitmap_init was set. Otherwise, we optimize by not
- acquiring the mutex
- */
- mysql_mutex_t *mutex;
my_bitmap_map last_word_mask;
uint32 n_bits; /* number of bits occupied by the above */
} MY_BITMAP;
@@ -42,15 +36,11 @@ typedef struct st_bitmap
extern "C" {
#endif
-/* compatibility functions */
-#define bitmap_init(A,B,C,D) my_bitmap_init(A,B,C,D)
-#define bitmap_free(A) my_bitmap_free(A)
/* Reset memory. Faster then doing a full bzero */
#define my_bitmap_clear(A) ((A)->bitmap= 0)
extern void create_last_word_mask(MY_BITMAP *map);
-extern my_bool my_bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits,
- my_bool thread_safe);
+extern my_bool my_bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits);
extern my_bool bitmap_is_clear_all(const MY_BITMAP *map);
extern my_bool bitmap_is_prefix(const MY_BITMAP *map, uint prefix_size);
extern my_bool bitmap_is_set_all(const MY_BITMAP *map);
@@ -82,8 +72,6 @@ extern void bitmap_xor(MY_BITMAP *map, const MY_BITMAP *map2);
extern void bitmap_invert(MY_BITMAP *map);
extern void bitmap_copy(MY_BITMAP *map, const MY_BITMAP *map2);
-extern uint bitmap_lock_set_next(MY_BITMAP *map);
-extern void bitmap_lock_clear_bit(MY_BITMAP *map, uint bitmap_bit);
/* Fast, not thread safe, bitmap functions */
#define bitmap_buffer_size(bits) (((bits)+31)/32)*4
#define no_bytes_in_map(map) (((map)->n_bits + 7)/8)
diff --git a/include/my_dbug.h b/include/my_dbug.h
index b4b16d653b5..02caadbff48 100644
--- a/include/my_dbug.h
+++ b/include/my_dbug.h
@@ -104,10 +104,9 @@ extern int (*dbug_sanity)(void);
do {if (_db_keyword_(0, (keyword), 0)) { a1 }} while(0)
#define DBUG_EXECUTE_IF(keyword,a1) \
do {if (_db_keyword_(0, (keyword), 1)) { a1 }} while(0)
-#define DBUG_EVALUATE(keyword,a1,a2) \
- (_db_keyword_(0,(keyword), 0) ? (a1) : (a2))
-#define DBUG_EVALUATE_IF(keyword,a1,a2) \
- (_db_keyword_(0,(keyword), 1) ? (a1) : (a2))
+
+#define DBUG_IF(keyword) _db_keyword_(0, (keyword), 1)
+
#define DBUG_PUSH_EMPTY if (_dbug_on_) { DBUG_PUSH(""); }
#define DBUG_POP_EMPTY if (_dbug_on_) { DBUG_POP(); }
#define DBUG_PUSH(a1) _db_push_ (a1)
@@ -174,8 +173,7 @@ extern void _db_suicide_(void);
#define DBUG_PRINT(keyword, arglist) do { } while(0)
#define DBUG_EXECUTE(keyword,a1) do { } while(0)
#define DBUG_EXECUTE_IF(keyword,a1) do { } while(0)
-#define DBUG_EVALUATE(keyword,a1,a2) (a2)
-#define DBUG_EVALUATE_IF(keyword,a1,a2) (a2)
+#define DBUG_IF(keyword) 0
#define DBUG_PRINT(keyword,arglist) do { } while(0)
#define DBUG_PUSH_EMPTY do { } while(0)
#define DBUG_POP_EMPTY do { } while(0)
@@ -201,7 +199,7 @@ extern void _db_suicide_(void);
#define DBUG_CRASH_ENTER(func)
#define DBUG_CRASH_RETURN(val) do { return(val); } while(0)
#define DBUG_CRASH_VOID_RETURN do { return; } while(0)
-#define DBUG_SUICIDE() do { } while(0)
+#define DBUG_SUICIDE() ((void) 0)
#ifdef DBUG_ASSERT_AS_PRINTF
extern void (*my_dbug_assert_failed)(const char *assert_expr, const char* file, unsigned long line);
diff --git a/include/my_dir.h b/include/my_dir.h
index 861599d8fc0..ecd37b2925b 100644
--- a/include/my_dir.h
+++ b/include/my_dir.h
@@ -94,13 +94,13 @@ typedef struct fileinfo
typedef struct st_my_dir /* Struct returned from my_dir */
{
/*
- These members are just copies of parts of DYNAMIC_ARRAY structure,
+ These members are just copies of parts of DYNAMIC_ARRAY structure,
which is allocated right after the end of MY_DIR structure (MEM_ROOT
for storing names is also resides there). We've left them here because
we don't want to change code that uses my_dir.
*/
struct fileinfo *dir_entry;
- uint number_of_files;
+ size_t number_of_files;
} MY_DIR;
extern MY_DIR *my_dir(const char *path,myf MyFlags);
diff --git a/include/my_global.h b/include/my_global.h
index e89249ec890..962f7396008 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -29,6 +29,14 @@
#pragma GCC poison __WIN__
#endif
+#if defined(_MSC_VER) && !defined(__clang__)
+/*
+ Following functions have bugs, when used with UTF-8 active codepage.
+ #include <winservice.h> will use the non-buggy wrappers
+*/
+#pragma deprecated("CreateServiceA", "OpenServiceA", "ChangeServiceConfigA")
+#endif
+
/*
InnoDB depends on some MySQL internals which other plugins should not
need. This is because of InnoDB's foreign key support, "safe" binlog
diff --git a/include/my_rdtsc.h b/include/my_rdtsc.h
index e8db3b20366..b2d30fa3151 100644
--- a/include/my_rdtsc.h
+++ b/include/my_rdtsc.h
@@ -91,6 +91,7 @@ C_MODE_START
On AARCH64, we use the generic timer base register. We override clang
implementation for aarch64 as it access a PMU register which is not
guaranteed to be active.
+ On RISC-V, we use the rdcycle instruction to read from mcycle register.
Sadly, we have nothing for the Digital Alpha, MIPS, Motorola m68k,
HP PA-RISC or other non-mainstream (or obsolete) processors.
@@ -109,6 +110,9 @@ C_MODE_START
ARM notes
---------
+ Userspace high precision timing on CNTVCT_EL0 requires that CNTKCTL_EL1
+ is set to 1 for each CPU in privileged mode.
+
During tests on ARMv7 Debian, perf_even_open() based cycle counter provided
too low frequency with too high overhead:
MariaDB [performance_schema]> SELECT * FROM performance_timers;
@@ -175,6 +179,28 @@ static inline ulonglong my_timer_cycles(void)
__asm __volatile("mrs %0, CNTVCT_EL0" : "=&r" (result));
return result;
}
+#elif defined(__riscv)
+ /* Use RDCYCLE (and RDCYCLEH on riscv32) */
+ {
+# if __riscv_xlen == 32
+ ulong result_lo, result_hi0, result_hi1;
+ /* Implemented in assembly because Clang insisted on branching. */
+ __asm __volatile__(
+ "rdcycleh %0\n"
+ "rdcycle %1\n"
+ "rdcycleh %2\n"
+ "sub %0, %0, %2\n"
+ "seqz %0, %0\n"
+ "sub %0, zero, %0\n"
+ "and %1, %1, %0\n"
+ : "=r"(result_hi0), "=r"(result_lo), "=r"(result_hi1));
+ return (static_cast<ulonglong>(result_hi1) << 32) | result_lo;
+# else
+ ulonglong result;
+ __asm __volatile__("rdcycle %0" : "=r"(result));
+ return result;
+ }
+# endif
#elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME)
/* gethrtime may appear as either cycle or nanosecond counter */
return (ulonglong) gethrtime();
@@ -233,6 +259,7 @@ C_MODE_END
#define MY_TIMER_ROUTINE_GETSYSTEMTIMEASFILETIME 26
#define MY_TIMER_ROUTINE_ASM_S390 28
#define MY_TIMER_ROUTINE_AARCH64 29
+#define MY_TIMER_ROUTINE_RISCV 30
#endif
diff --git a/include/my_sys.h b/include/my_sys.h
index d60153149ec..cac9f4ad889 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -92,6 +92,7 @@ C_MODE_START
#define MY_SYNC_DIR 32768U /* my_create/delete/rename: sync directory */
#define MY_SYNC_FILESIZE 65536U /* my_sync(): safe sync when file is extended */
#define MY_THREAD_SPECIFIC 0x10000U /* my_malloc(): thread specific */
+#define MY_ROOT_USE_MPROTECT 0x20000U /* init_alloc_root: read only segments */
/* Tree that should delete things automatically */
#define MY_TREE_WITH_DELETE 0x40000U
@@ -175,6 +176,7 @@ extern char *my_strndup(PSI_memory_key key, const char *from, size_t length, myf
int my_init_large_pages(my_bool super_large_pages);
uchar *my_large_malloc(size_t *size, myf my_flags);
void my_large_free(void *ptr, size_t size);
+void my_large_page_truncate(size_t *size);
#ifdef _WIN32
extern BOOL my_obtain_privilege(LPCSTR lpPrivilege);
@@ -272,6 +274,7 @@ extern my_bool my_disable_async_io,
extern my_bool my_disable_sync, my_disable_copystat_in_redel;
extern char wild_many,wild_one,wild_prefix;
extern const char *charsets_dir;
+extern size_t my_system_page_size;
enum cache_type
{
@@ -331,9 +334,9 @@ typedef void (*FREE_FUNC)(void *);
typedef struct st_dynamic_array
{
uchar *buffer;
- uint elements,max_element;
- uint alloc_increment;
- uint size_of_element;
+ size_t elements, max_element;
+ size_t alloc_increment;
+ size_t size_of_element;
PSI_memory_key m_psi_key;
myf malloc_flags;
} DYNAMIC_ARRAY;
@@ -342,7 +345,7 @@ typedef struct st_my_tmpdir
{
DYNAMIC_ARRAY full_list;
char **list;
- uint cur, max;
+ size_t cur, max;
mysql_mutex_t mutex;
} MY_TMPDIR;
@@ -822,21 +825,20 @@ File create_temp_file(char *to, const char *dir, const char *pfx,
#define my_init_dynamic_array(A,B,C,D,E,F) init_dynamic_array2(A,B,C,NULL,D,E,F)
#define my_init_dynamic_array2(A,B,C,D,E,F,G) init_dynamic_array2(A,B,C,D,E,F,G)
extern my_bool init_dynamic_array2(PSI_memory_key psi_key, DYNAMIC_ARRAY *array,
- uint element_size, void *init_buffer,
- uint init_alloc, uint alloc_increment,
+ size_t element_size, void *init_buffer,
+ size_t init_alloc, size_t alloc_increment,
myf my_flags);
extern my_bool insert_dynamic(DYNAMIC_ARRAY *array, const void* element);
extern void *alloc_dynamic(DYNAMIC_ARRAY *array);
extern void *pop_dynamic(DYNAMIC_ARRAY*);
extern my_bool set_dynamic(DYNAMIC_ARRAY *array, const void *element,
- uint array_index);
-extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements);
-extern void get_dynamic(DYNAMIC_ARRAY *array, void *element, uint array_index);
+ size_t array_index);
+extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, size_t max_elements);
+extern void get_dynamic(DYNAMIC_ARRAY *array, void *element, size_t array_index);
extern void delete_dynamic(DYNAMIC_ARRAY *array);
-extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index);
+extern void delete_dynamic_element(DYNAMIC_ARRAY *array, size_t array_index);
extern void delete_dynamic_with_callback(DYNAMIC_ARRAY *array, FREE_FUNC f);
extern void freeze_size(DYNAMIC_ARRAY *array);
-extern int get_index_dynamic(DYNAMIC_ARRAY *array, void *element);
#define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element)
#define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index))
#define push_dynamic(A,B) insert_dynamic((A),(B))
@@ -875,7 +877,6 @@ extern void my_free_lock(void *ptr);
#define my_free_lock(A) my_free((A))
#endif
#define alloc_root_inited(A) ((A)->min_malloc != 0)
-#define ALLOC_ROOT_MIN_BLOCK_SIZE (MALLOC_OVERHEAD + sizeof(USED_MEM) + 8)
#define clear_alloc_root(A) do { (A)->free= (A)->used= (A)->pre_alloc= 0; (A)->min_malloc=0;} while(0)
extern void init_alloc_root(PSI_memory_key key, MEM_ROOT *mem_root,
size_t block_size, size_t pre_alloc_size,
@@ -886,6 +887,7 @@ extern void free_root(MEM_ROOT *root, myf MyFLAGS);
extern void set_prealloc_root(MEM_ROOT *root, char *ptr);
extern void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
size_t prealloc_size);
+extern void protect_root(MEM_ROOT *root, int prot);
extern char *strdup_root(MEM_ROOT *root,const char *str);
static inline char *safe_strdup_root(MEM_ROOT *root, const char *str)
{
@@ -1019,15 +1021,28 @@ int my_getpagesize(void);
int my_msync(int, void *, size_t, int);
#define MY_UUID_SIZE 16
-#define MY_UUID_STRING_LENGTH (8+1+4+1+4+1+4+1+12)
-#define MY_UUID_ORACLE_STRING_LENGTH (8+4+4+4+12)
+#define MY_UUID_BARE_STRING_LENGTH (8+4+4+4+12)
+#define MY_UUID_SEPARATORS 4
+#define MY_UUID_STRING_LENGTH (MY_UUID_BARE_STRING_LENGTH + MY_UUID_SEPARATORS)
void my_uuid_init(ulong seed1, ulong seed2);
void my_uuid(uchar *guid);
-void my_uuid2str(const uchar *guid, char *s);
-void my_uuid2str_oracle(const uchar *guid, char *s);
void my_uuid_end(void);
+static inline void my_uuid2str(const uchar *guid, char *s, int with_separators)
+{
+ int i;
+ int mask= with_separators ? ((1 << 3) | (1 << 5) | (1 << 7) | (1 << 9)) : 0;
+ for (i=0; i < MY_UUID_SIZE; i++, mask >>= 1)
+ {
+ *s++= _dig_vec_lower[guid[i] >>4];
+ *s++= _dig_vec_lower[guid[i] & 15];
+ if (mask & 1)
+ *s++= '-';
+ }
+}
+
+
const char *my_dlerror(const char *dlpath);
/* character sets */
@@ -1071,6 +1086,9 @@ extern char *get_tty_password(const char *opt_message);
#define BACKSLASH_MBTAIL
/* File system character set */
extern CHARSET_INFO *fs_character_set(void);
+extern int my_set_console_cp(const char *name);
+#else
+#define my_set_console_cp(A) do {} while (0)
#endif
extern const char *my_default_csname(void);
extern size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
@@ -1082,13 +1100,6 @@ extern void thd_increment_bytes_sent(void *thd, size_t length);
extern void thd_increment_bytes_received(void *thd, size_t length);
extern void thd_increment_net_big_packet_count(void *thd, size_t length);
-#ifdef _WIN32
-
-/* implemented in my_conio.c */
-char* my_cgets(char *string, size_t clen, size_t* plen);
-
-#endif
-
#include <mysql/psi/psi.h>
#ifdef HAVE_PSI_INTERFACE
diff --git a/include/mysql.h b/include/mysql.h
index c9f5268d0f4..a66dcc7bd02 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -141,6 +141,8 @@ typedef unsigned long long my_ulonglong;
#define ER_WRONG_FK_OPTION_FOR_VIRTUAL_COLUMN ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN
#define ER_UNSUPPORTED_ACTION_ON_VIRTUAL_COLUMN ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN
#define ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS ER_UNSUPPORTED_ENGINE_FOR_GENERATED_COLUMNS
+#define ER_KEY_COLUMN_DOES_NOT_EXITS ER_KEY_COLUMN_DOES_NOT_EXIST
+#define ER_DROP_PARTITION_NON_EXISTENT ER_PARTITION_DOES_NOT_EXIST
typedef struct st_mysql_rows {
struct st_mysql_rows *next; /* list of rows */
@@ -323,7 +325,15 @@ typedef struct st_mysql_res {
} MYSQL_RES;
-#if !defined(MYSQL_SERVER) && !defined(MYSQL_CLIENT)
+/*
+ We should not define MYSQL_CLIENT when the mysql.h is included
+ by the server or server plugins.
+ Now it is important only for the SQL service to work so we rely on
+ the MYSQL_SERVICE_SQL to check we're compiling the server/plugin
+ related file.
+*/
+
+#if !defined(MYSQL_SERVICE_SQL) && !defined(MYSQL_CLIENT)
#define MYSQL_CLIENT
#endif
@@ -355,7 +365,7 @@ typedef struct st_mysql_parameters
*/
#define MYSQL_WAIT_TIMEOUT 8
-#if !defined(MYSQL_SERVER) && !defined(EMBEDDED_LIBRARY)
+#if !defined(MYSQL_SERVICE_SQL)
#define max_allowed_packet (*mysql_get_parameters()->p_max_allowed_packet)
#define net_buffer_length (*mysql_get_parameters()->p_net_buffer_length)
#endif
diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h
index 89ecf2b34c1..14c752511c7 100644
--- a/include/mysql/plugin.h
+++ b/include/mysql/plugin.h
@@ -77,7 +77,7 @@ typedef struct st_mysql_xid MYSQL_XID;
#define MYSQL_PLUGIN_INTERFACE_VERSION 0x0104
/* MariaDB plugin interface version */
-#define MARIA_PLUGIN_INTERFACE_VERSION 0x010e
+#define MARIA_PLUGIN_INTERFACE_VERSION 0x010f
/*
The allowable types of plugins
diff --git a/include/mysql/plugin_audit.h.pp b/include/mysql/plugin_audit.h.pp
index 26799e9031a..a01e4ff8c17 100644
--- a/include/mysql/plugin_audit.h.pp
+++ b/include/mysql/plugin_audit.h.pp
@@ -464,6 +464,32 @@ int json_escape_string(const char *str,const char *str_end,
int json_unescape_json(const char *json_str, const char *json_end,
char *res, char *res_end);
}
+extern "C" {
+extern struct sql_service_st {
+ MYSQL *(STDCALL *mysql_init_func)(MYSQL *mysql);
+ MYSQL *(*mysql_real_connect_local_func)(MYSQL *mysql);
+ MYSQL *(STDCALL *mysql_real_connect_func)(MYSQL *mysql, const char *host,
+ const char *user, const char *passwd, const char *db, unsigned int port,
+ const char *unix_socket, unsigned long clientflag);
+ unsigned int(STDCALL *mysql_errno_func)(MYSQL *mysql);
+ const char *(STDCALL *mysql_error_func)(MYSQL *mysql);
+ int (STDCALL *mysql_real_query_func)(MYSQL *mysql, const char *q,
+ unsigned long length);
+ my_ulonglong (STDCALL *mysql_affected_rows_func)(MYSQL *mysql);
+ my_ulonglong (STDCALL *mysql_num_rows_func)(MYSQL_RES *res);
+ MYSQL_RES *(STDCALL *mysql_store_result_func)(MYSQL *mysql);
+ void (STDCALL *mysql_free_result_func)(MYSQL_RES *result);
+ MYSQL_ROW (STDCALL *mysql_fetch_row_func)(MYSQL_RES *result);
+ void (STDCALL *mysql_close_func)(MYSQL *mysql);
+ int (STDCALL *mysql_options_func)(MYSQL *mysql, enum mysql_option option,
+ const void *arg);
+ unsigned long *(STDCALL *mysql_fetch_lengths_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name);
+ unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db);
+} *sql_service;
+MYSQL *mysql_real_connect_local(MYSQL *mysql);
+}
}
struct st_mysql_xid {
long formatID;
diff --git a/include/mysql/plugin_auth.h.pp b/include/mysql/plugin_auth.h.pp
index 31b3f723fff..1844f7b7248 100644
--- a/include/mysql/plugin_auth.h.pp
+++ b/include/mysql/plugin_auth.h.pp
@@ -464,6 +464,32 @@ int json_escape_string(const char *str,const char *str_end,
int json_unescape_json(const char *json_str, const char *json_end,
char *res, char *res_end);
}
+extern "C" {
+extern struct sql_service_st {
+ MYSQL *(STDCALL *mysql_init_func)(MYSQL *mysql);
+ MYSQL *(*mysql_real_connect_local_func)(MYSQL *mysql);
+ MYSQL *(STDCALL *mysql_real_connect_func)(MYSQL *mysql, const char *host,
+ const char *user, const char *passwd, const char *db, unsigned int port,
+ const char *unix_socket, unsigned long clientflag);
+ unsigned int(STDCALL *mysql_errno_func)(MYSQL *mysql);
+ const char *(STDCALL *mysql_error_func)(MYSQL *mysql);
+ int (STDCALL *mysql_real_query_func)(MYSQL *mysql, const char *q,
+ unsigned long length);
+ my_ulonglong (STDCALL *mysql_affected_rows_func)(MYSQL *mysql);
+ my_ulonglong (STDCALL *mysql_num_rows_func)(MYSQL_RES *res);
+ MYSQL_RES *(STDCALL *mysql_store_result_func)(MYSQL *mysql);
+ void (STDCALL *mysql_free_result_func)(MYSQL_RES *result);
+ MYSQL_ROW (STDCALL *mysql_fetch_row_func)(MYSQL_RES *result);
+ void (STDCALL *mysql_close_func)(MYSQL *mysql);
+ int (STDCALL *mysql_options_func)(MYSQL *mysql, enum mysql_option option,
+ const void *arg);
+ unsigned long *(STDCALL *mysql_fetch_lengths_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name);
+ unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db);
+} *sql_service;
+MYSQL *mysql_real_connect_local(MYSQL *mysql);
+}
}
struct st_mysql_xid {
long formatID;
diff --git a/include/mysql/plugin_data_type.h.pp b/include/mysql/plugin_data_type.h.pp
index 4716b0dc255..80b5a863fa5 100644
--- a/include/mysql/plugin_data_type.h.pp
+++ b/include/mysql/plugin_data_type.h.pp
@@ -464,6 +464,32 @@ int json_escape_string(const char *str,const char *str_end,
int json_unescape_json(const char *json_str, const char *json_end,
char *res, char *res_end);
}
+extern "C" {
+extern struct sql_service_st {
+ MYSQL *(STDCALL *mysql_init_func)(MYSQL *mysql);
+ MYSQL *(*mysql_real_connect_local_func)(MYSQL *mysql);
+ MYSQL *(STDCALL *mysql_real_connect_func)(MYSQL *mysql, const char *host,
+ const char *user, const char *passwd, const char *db, unsigned int port,
+ const char *unix_socket, unsigned long clientflag);
+ unsigned int(STDCALL *mysql_errno_func)(MYSQL *mysql);
+ const char *(STDCALL *mysql_error_func)(MYSQL *mysql);
+ int (STDCALL *mysql_real_query_func)(MYSQL *mysql, const char *q,
+ unsigned long length);
+ my_ulonglong (STDCALL *mysql_affected_rows_func)(MYSQL *mysql);
+ my_ulonglong (STDCALL *mysql_num_rows_func)(MYSQL_RES *res);
+ MYSQL_RES *(STDCALL *mysql_store_result_func)(MYSQL *mysql);
+ void (STDCALL *mysql_free_result_func)(MYSQL_RES *result);
+ MYSQL_ROW (STDCALL *mysql_fetch_row_func)(MYSQL_RES *result);
+ void (STDCALL *mysql_close_func)(MYSQL *mysql);
+ int (STDCALL *mysql_options_func)(MYSQL *mysql, enum mysql_option option,
+ const void *arg);
+ unsigned long *(STDCALL *mysql_fetch_lengths_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name);
+ unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db);
+} *sql_service;
+MYSQL *mysql_real_connect_local(MYSQL *mysql);
+}
}
struct st_mysql_xid {
long formatID;
diff --git a/include/mysql/plugin_encryption.h.pp b/include/mysql/plugin_encryption.h.pp
index c29dc20efda..ac5798b1323 100644
--- a/include/mysql/plugin_encryption.h.pp
+++ b/include/mysql/plugin_encryption.h.pp
@@ -464,6 +464,32 @@ int json_escape_string(const char *str,const char *str_end,
int json_unescape_json(const char *json_str, const char *json_end,
char *res, char *res_end);
}
+extern "C" {
+extern struct sql_service_st {
+ MYSQL *(STDCALL *mysql_init_func)(MYSQL *mysql);
+ MYSQL *(*mysql_real_connect_local_func)(MYSQL *mysql);
+ MYSQL *(STDCALL *mysql_real_connect_func)(MYSQL *mysql, const char *host,
+ const char *user, const char *passwd, const char *db, unsigned int port,
+ const char *unix_socket, unsigned long clientflag);
+ unsigned int(STDCALL *mysql_errno_func)(MYSQL *mysql);
+ const char *(STDCALL *mysql_error_func)(MYSQL *mysql);
+ int (STDCALL *mysql_real_query_func)(MYSQL *mysql, const char *q,
+ unsigned long length);
+ my_ulonglong (STDCALL *mysql_affected_rows_func)(MYSQL *mysql);
+ my_ulonglong (STDCALL *mysql_num_rows_func)(MYSQL_RES *res);
+ MYSQL_RES *(STDCALL *mysql_store_result_func)(MYSQL *mysql);
+ void (STDCALL *mysql_free_result_func)(MYSQL_RES *result);
+ MYSQL_ROW (STDCALL *mysql_fetch_row_func)(MYSQL_RES *result);
+ void (STDCALL *mysql_close_func)(MYSQL *mysql);
+ int (STDCALL *mysql_options_func)(MYSQL *mysql, enum mysql_option option,
+ const void *arg);
+ unsigned long *(STDCALL *mysql_fetch_lengths_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name);
+ unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db);
+} *sql_service;
+MYSQL *mysql_real_connect_local(MYSQL *mysql);
+}
}
struct st_mysql_xid {
long formatID;
diff --git a/include/mysql/plugin_ftparser.h.pp b/include/mysql/plugin_ftparser.h.pp
index be270d096f4..919c9aaef70 100644
--- a/include/mysql/plugin_ftparser.h.pp
+++ b/include/mysql/plugin_ftparser.h.pp
@@ -464,6 +464,32 @@ int json_escape_string(const char *str,const char *str_end,
int json_unescape_json(const char *json_str, const char *json_end,
char *res, char *res_end);
}
+extern "C" {
+extern struct sql_service_st {
+ MYSQL *(STDCALL *mysql_init_func)(MYSQL *mysql);
+ MYSQL *(*mysql_real_connect_local_func)(MYSQL *mysql);
+ MYSQL *(STDCALL *mysql_real_connect_func)(MYSQL *mysql, const char *host,
+ const char *user, const char *passwd, const char *db, unsigned int port,
+ const char *unix_socket, unsigned long clientflag);
+ unsigned int(STDCALL *mysql_errno_func)(MYSQL *mysql);
+ const char *(STDCALL *mysql_error_func)(MYSQL *mysql);
+ int (STDCALL *mysql_real_query_func)(MYSQL *mysql, const char *q,
+ unsigned long length);
+ my_ulonglong (STDCALL *mysql_affected_rows_func)(MYSQL *mysql);
+ my_ulonglong (STDCALL *mysql_num_rows_func)(MYSQL_RES *res);
+ MYSQL_RES *(STDCALL *mysql_store_result_func)(MYSQL *mysql);
+ void (STDCALL *mysql_free_result_func)(MYSQL_RES *result);
+ MYSQL_ROW (STDCALL *mysql_fetch_row_func)(MYSQL_RES *result);
+ void (STDCALL *mysql_close_func)(MYSQL *mysql);
+ int (STDCALL *mysql_options_func)(MYSQL *mysql, enum mysql_option option,
+ const void *arg);
+ unsigned long *(STDCALL *mysql_fetch_lengths_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name);
+ unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db);
+} *sql_service;
+MYSQL *mysql_real_connect_local(MYSQL *mysql);
+}
}
struct st_mysql_xid {
long formatID;
diff --git a/include/mysql/plugin_function.h.pp b/include/mysql/plugin_function.h.pp
index 7a2d06918c9..f5b22dbd826 100644
--- a/include/mysql/plugin_function.h.pp
+++ b/include/mysql/plugin_function.h.pp
@@ -464,6 +464,32 @@ int json_escape_string(const char *str,const char *str_end,
int json_unescape_json(const char *json_str, const char *json_end,
char *res, char *res_end);
}
+extern "C" {
+extern struct sql_service_st {
+ MYSQL *(STDCALL *mysql_init_func)(MYSQL *mysql);
+ MYSQL *(*mysql_real_connect_local_func)(MYSQL *mysql);
+ MYSQL *(STDCALL *mysql_real_connect_func)(MYSQL *mysql, const char *host,
+ const char *user, const char *passwd, const char *db, unsigned int port,
+ const char *unix_socket, unsigned long clientflag);
+ unsigned int(STDCALL *mysql_errno_func)(MYSQL *mysql);
+ const char *(STDCALL *mysql_error_func)(MYSQL *mysql);
+ int (STDCALL *mysql_real_query_func)(MYSQL *mysql, const char *q,
+ unsigned long length);
+ my_ulonglong (STDCALL *mysql_affected_rows_func)(MYSQL *mysql);
+ my_ulonglong (STDCALL *mysql_num_rows_func)(MYSQL_RES *res);
+ MYSQL_RES *(STDCALL *mysql_store_result_func)(MYSQL *mysql);
+ void (STDCALL *mysql_free_result_func)(MYSQL_RES *result);
+ MYSQL_ROW (STDCALL *mysql_fetch_row_func)(MYSQL_RES *result);
+ void (STDCALL *mysql_close_func)(MYSQL *mysql);
+ int (STDCALL *mysql_options_func)(MYSQL *mysql, enum mysql_option option,
+ const void *arg);
+ unsigned long *(STDCALL *mysql_fetch_lengths_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name);
+ unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db);
+} *sql_service;
+MYSQL *mysql_real_connect_local(MYSQL *mysql);
+}
}
struct st_mysql_xid {
long formatID;
diff --git a/include/mysql/plugin_password_validation.h b/include/mysql/plugin_password_validation.h
index 23d2c884012..94d6c63967f 100644
--- a/include/mysql/plugin_password_validation.h
+++ b/include/mysql/plugin_password_validation.h
@@ -30,7 +30,7 @@
extern "C" {
#endif
-#define MariaDB_PASSWORD_VALIDATION_INTERFACE_VERSION 0x0100
+#define MariaDB_PASSWORD_VALIDATION_INTERFACE_VERSION 0x0101
/**
Password validation plugin descriptor
@@ -43,7 +43,8 @@ struct st_mariadb_password_validation
and return 0 if the password has passed the validation.
*/
int (*validate_password)(const MYSQL_CONST_LEX_STRING *username,
- const MYSQL_CONST_LEX_STRING *password);
+ const MYSQL_CONST_LEX_STRING *password,
+ const MYSQL_CONST_LEX_STRING *hostname);
};
#ifdef __cplusplus
diff --git a/include/mysql/plugin_password_validation.h.pp b/include/mysql/plugin_password_validation.h.pp
index 39218d737a2..115cbf2636e 100644
--- a/include/mysql/plugin_password_validation.h.pp
+++ b/include/mysql/plugin_password_validation.h.pp
@@ -464,6 +464,32 @@ int json_escape_string(const char *str,const char *str_end,
int json_unescape_json(const char *json_str, const char *json_end,
char *res, char *res_end);
}
+extern "C" {
+extern struct sql_service_st {
+ MYSQL *(STDCALL *mysql_init_func)(MYSQL *mysql);
+ MYSQL *(*mysql_real_connect_local_func)(MYSQL *mysql);
+ MYSQL *(STDCALL *mysql_real_connect_func)(MYSQL *mysql, const char *host,
+ const char *user, const char *passwd, const char *db, unsigned int port,
+ const char *unix_socket, unsigned long clientflag);
+ unsigned int(STDCALL *mysql_errno_func)(MYSQL *mysql);
+ const char *(STDCALL *mysql_error_func)(MYSQL *mysql);
+ int (STDCALL *mysql_real_query_func)(MYSQL *mysql, const char *q,
+ unsigned long length);
+ my_ulonglong (STDCALL *mysql_affected_rows_func)(MYSQL *mysql);
+ my_ulonglong (STDCALL *mysql_num_rows_func)(MYSQL_RES *res);
+ MYSQL_RES *(STDCALL *mysql_store_result_func)(MYSQL *mysql);
+ void (STDCALL *mysql_free_result_func)(MYSQL_RES *result);
+ MYSQL_ROW (STDCALL *mysql_fetch_row_func)(MYSQL_RES *result);
+ void (STDCALL *mysql_close_func)(MYSQL *mysql);
+ int (STDCALL *mysql_options_func)(MYSQL *mysql, enum mysql_option option,
+ const void *arg);
+ unsigned long *(STDCALL *mysql_fetch_lengths_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name);
+ unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db);
+} *sql_service;
+MYSQL *mysql_real_connect_local(MYSQL *mysql);
+}
}
struct st_mysql_xid {
long formatID;
@@ -639,6 +665,7 @@ struct st_mariadb_password_validation
{
int interface_version;
int (*validate_password)(const MYSQL_CONST_LEX_STRING *username,
- const MYSQL_CONST_LEX_STRING *password);
+ const MYSQL_CONST_LEX_STRING *password,
+ const MYSQL_CONST_LEX_STRING *hostname);
};
}
diff --git a/include/mysql/psi/psi_abi_v1.h.pp b/include/mysql/psi/psi_abi_v1.h.pp
index 2dc27e09ca4..ca0d0206cb9 100644
--- a/include/mysql/psi/psi_abi_v1.h.pp
+++ b/include/mysql/psi/psi_abi_v1.h.pp
@@ -1,8 +1,8 @@
extern "C" {
+typedef unsigned int PSI_memory_key;
}
extern "C" {
struct PSI_thread;
-typedef unsigned int PSI_memory_key;
struct PSI_memory_info_v1
{
PSI_memory_key *m_key;
diff --git a/include/mysql/psi/psi_abi_v2.h.pp b/include/mysql/psi/psi_abi_v2.h.pp
index a670e53a8b7..9188954885f 100644
--- a/include/mysql/psi/psi_abi_v2.h.pp
+++ b/include/mysql/psi/psi_abi_v2.h.pp
@@ -1,8 +1,8 @@
extern "C" {
+typedef unsigned int PSI_memory_key;
}
extern "C" {
struct PSI_thread;
-typedef unsigned int PSI_memory_key;
struct PSI_memory_info_v2
{
int placeholder;
diff --git a/include/mysql/psi/psi_base.h b/include/mysql/psi/psi_base.h
index 592aaf58fef..c04f817b2c1 100644
--- a/include/mysql/psi/psi_base.h
+++ b/include/mysql/psi/psi_base.h
@@ -170,6 +170,13 @@ extern "C" {
/** @} */
+/**
+ Instrumented memory key.
+ To instrument memory, a memory key must be obtained using @c register_memory.
+ Using a zero key always disable the instrumentation.
+*/
+typedef unsigned int PSI_memory_key;
+
#ifdef __cplusplus
}
#endif
diff --git a/include/mysql/psi/psi_memory.h b/include/mysql/psi/psi_memory.h
index 4f5215d1808..21a86a36368 100644
--- a/include/mysql/psi/psi_memory.h
+++ b/include/mysql/psi/psi_memory.h
@@ -53,13 +53,6 @@ extern "C" {
struct PSI_thread;
-/**
- Instrumented memory key.
- To instrument memory, a memory key must be obtained using @c register_memory.
- Using a zero key always disable the instrumentation.
-*/
-typedef unsigned int PSI_memory_key;
-
#ifdef HAVE_PSI_1
/**
diff --git a/include/mysql/service_sql.h b/include/mysql/service_sql.h
new file mode 100644
index 00000000000..2fee56ca2c7
--- /dev/null
+++ b/include/mysql/service_sql.h
@@ -0,0 +1,115 @@
+/* Copyright (C) 2021 MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */
+
+#ifndef MYSQL_SERVICE_SQL
+#define MYSQL_SERVICE_SQL
+
+#ifndef MYSQL_ABI_CHECK
+#include <mysql.h>
+#endif
+
+/**
+ @file
+ SQL service
+
+ Interface for plugins to execute SQL queries on the local server.
+
+ Functions of the service are the 'server-limited' client library:
+ mysql_init
+ mysql_real_connect_local
+ mysql_real_connect
+ mysql_errno
+ mysql_error
+ mysql_real_query
+ mysql_affected_rows
+ mysql_num_rows
+ mysql_store_result
+ mysql_free_result
+ mysql_fetch_row
+ mysql_close
+*/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct sql_service_st {
+ MYSQL *(STDCALL *mysql_init_func)(MYSQL *mysql);
+ MYSQL *(*mysql_real_connect_local_func)(MYSQL *mysql);
+ MYSQL *(STDCALL *mysql_real_connect_func)(MYSQL *mysql, const char *host,
+ const char *user, const char *passwd, const char *db, unsigned int port,
+ const char *unix_socket, unsigned long clientflag);
+ unsigned int(STDCALL *mysql_errno_func)(MYSQL *mysql);
+ const char *(STDCALL *mysql_error_func)(MYSQL *mysql);
+ int (STDCALL *mysql_real_query_func)(MYSQL *mysql, const char *q,
+ unsigned long length);
+ my_ulonglong (STDCALL *mysql_affected_rows_func)(MYSQL *mysql);
+ my_ulonglong (STDCALL *mysql_num_rows_func)(MYSQL_RES *res);
+ MYSQL_RES *(STDCALL *mysql_store_result_func)(MYSQL *mysql);
+ void (STDCALL *mysql_free_result_func)(MYSQL_RES *result);
+ MYSQL_ROW (STDCALL *mysql_fetch_row_func)(MYSQL_RES *result);
+ void (STDCALL *mysql_close_func)(MYSQL *mysql);
+ int (STDCALL *mysql_options_func)(MYSQL *mysql, enum mysql_option option,
+ const void *arg);
+ unsigned long *(STDCALL *mysql_fetch_lengths_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name);
+ unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res);
+ int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db);
+} *sql_service;
+
+#ifdef MYSQL_DYNAMIC_PLUGIN
+
+#define mysql_init(M) sql_service->mysql_init_func(M)
+#define mysql_real_connect_local(M) sql_service->mysql_real_connect_local_func(M)
+#define mysql_real_connect(M,H,U,PW,D,P,S,F) sql_service->mysql_real_connect_func(M,H,U,PW,D,P,S,F)
+#define mysql_errno(M) sql_service->mysql_errno_func(M)
+#define mysql_error(M) sql_service->mysql_error_func(M)
+#define mysql_real_query sql_service->mysql_real_query_func
+#define mysql_affected_rows(M) sql_service->mysql_affected_rows_func(M)
+#define mysql_num_rows(R) sql_service->mysql_num_rows_func(R)
+#define mysql_store_result(M) sql_service->mysql_store_result_func(M)
+#define mysql_free_result(R) sql_service->mysql_free_result_func(R)
+#define mysql_fetch_row(R) sql_service->mysql_fetch_row_func(R)
+#define mysql_close(M) sql_service->mysql_close_func(M)
+#define mysql_options(M,O,V) sql_service->mysql_options_func(M,O,V)
+#define mysql_fetch_lengths(R) sql_service->mysql_fetch_lengths_func(R)
+#define mysql_set_character_set(M,C) sql_service->mysql_set_character_set_func(M,C)
+#define mysql_num_fields(R) sql_service->mysql_num_fields_func(R)
+#define mysql_select_db(M,D) sql_service->mysql_select_db_func(M,D)
+
+#else
+
+/*
+ Establishes the connection to the 'local' server that started the plugin.
+ Like the mysql_real_connect() does for the remote server.
+ The established connection has no user/host associated to it,
+ neither it has the current db, so the queries should have
+ database/table name specified.
+*/
+MYSQL *mysql_real_connect_local(MYSQL *mysql);
+
+/* The rest of the function declarations must be taken from the mysql.h */
+
+#endif /*MYSQL_DYNAMIC_PLUGIN*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*MYSQL_SERVICE_SQL */
+
+
diff --git a/include/mysql/services.h b/include/mysql/services.h
index 2c3a0ae421b..94f7bb3b2da 100644
--- a/include/mysql/services.h
+++ b/include/mysql/services.h
@@ -41,6 +41,7 @@ extern "C" {
#include <mysql/service_thd_wait.h>
#include <mysql/service_json.h>
/*#include <mysql/service_wsrep.h>*/
+#include <mysql/service_sql.h>
#ifdef __cplusplus
}
diff --git a/include/providers/bzlib.h b/include/providers/bzlib.h
new file mode 100644
index 00000000000..b48c940bdbc
--- /dev/null
+++ b/include/providers/bzlib.h
@@ -0,0 +1,126 @@
+/**
+ @file bzlib.h
+ This service provides dynamic access to BZip2.
+*/
+
+#ifndef BZIP2_INCLUDED
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef MYSQL_ABI_CHECK
+#include <stdbool.h>
+#endif
+
+#ifndef MYSQL_DYNAMIC_PLUGIN
+#define provider_service_bzip2 provider_service_bzip2_static
+#endif
+
+#ifndef BZ_RUN
+#define BZ_RUN 0
+#define BZ_FINISH 2
+
+#define BZ_OK 0
+#define BZ_RUN_OK 1
+#define BZ_FINISH_OK 3
+#define BZ_STREAM_END 4
+
+typedef struct
+{
+ char *next_in;
+ unsigned int avail_in;
+ unsigned int total_in_lo32;
+ unsigned int total_in_hi32;
+
+ char *next_out;
+ unsigned int avail_out;
+ unsigned int total_out_lo32;
+ unsigned int total_out_hi32;
+
+ void *state;
+
+ void *(*bzalloc)(void *, int, int);
+ void (*bzfree)(void *, void *);
+ void *opaque;
+} bz_stream;
+
+#define BZ2_bzBuffToBuffCompress(...) provider_service_bzip2->BZ2_bzBuffToBuffCompress_ptr (__VA_ARGS__)
+#define BZ2_bzBuffToBuffDecompress(...) provider_service_bzip2->BZ2_bzBuffToBuffDecompress_ptr (__VA_ARGS__)
+#define BZ2_bzCompress(...) provider_service_bzip2->BZ2_bzCompress_ptr (__VA_ARGS__)
+#define BZ2_bzCompressEnd(...) provider_service_bzip2->BZ2_bzCompressEnd_ptr (__VA_ARGS__)
+#define BZ2_bzCompressInit(...) provider_service_bzip2->BZ2_bzCompressInit_ptr (__VA_ARGS__)
+#define BZ2_bzDecompress(...) provider_service_bzip2->BZ2_bzDecompress_ptr (__VA_ARGS__)
+#define BZ2_bzDecompressEnd(...) provider_service_bzip2->BZ2_bzDecompressEnd_ptr (__VA_ARGS__)
+#define BZ2_bzDecompressInit(...) provider_service_bzip2->BZ2_bzDecompressInit_ptr (__VA_ARGS__)
+#endif
+
+#define DEFINE_BZ2_bzBuffToBuffCompress(NAME) NAME( \
+ char *dest, \
+ unsigned int *destLen, \
+ char *source, \
+ unsigned int sourceLen, \
+ int blockSize100k, \
+ int verbosity, \
+ int workFactor \
+)
+
+#define DEFINE_BZ2_bzBuffToBuffDecompress(NAME) NAME( \
+ char *dest, \
+ unsigned int *destLen, \
+ char *source, \
+ unsigned int sourceLen, \
+ int small, \
+ int verbosity \
+)
+
+#define DEFINE_BZ2_bzCompress(NAME) NAME( \
+ bz_stream *strm, \
+ int action \
+)
+
+#define DEFINE_BZ2_bzCompressEnd(NAME) NAME( \
+ bz_stream *strm \
+)
+
+#define DEFINE_BZ2_bzCompressInit(NAME) NAME( \
+ bz_stream *strm, \
+ int blockSize100k, \
+ int verbosity, \
+ int workFactor \
+)
+
+#define DEFINE_BZ2_bzDecompress(NAME) NAME( \
+ bz_stream *strm \
+)
+
+#define DEFINE_BZ2_bzDecompressEnd(NAME) NAME( \
+ bz_stream *strm \
+)
+
+#define DEFINE_BZ2_bzDecompressInit(NAME) NAME( \
+ bz_stream *strm, \
+ int verbosity, \
+ int small \
+)
+
+struct provider_service_bzip2_st{
+ int DEFINE_BZ2_bzBuffToBuffCompress((*BZ2_bzBuffToBuffCompress_ptr));
+ int DEFINE_BZ2_bzBuffToBuffDecompress((*BZ2_bzBuffToBuffDecompress_ptr));
+ int DEFINE_BZ2_bzCompress((*BZ2_bzCompress_ptr));
+ int DEFINE_BZ2_bzCompressEnd((*BZ2_bzCompressEnd_ptr));
+ int DEFINE_BZ2_bzCompressInit((*BZ2_bzCompressInit_ptr));
+ int DEFINE_BZ2_bzDecompress((*BZ2_bzDecompress_ptr));
+ int DEFINE_BZ2_bzDecompressEnd((*BZ2_bzDecompressEnd_ptr));
+ int DEFINE_BZ2_bzDecompressInit((*BZ2_bzDecompressInit_ptr));
+
+ bool is_loaded;
+};
+
+extern struct provider_service_bzip2_st *provider_service_bzip2;
+
+#ifdef __cplusplus
+}
+#endif
+
+#define BZIP2_INCLUDED
+#endif
diff --git a/include/providers/lz4.h b/include/providers/lz4.h
new file mode 100644
index 00000000000..4ac6b2c8f0d
--- /dev/null
+++ b/include/providers/lz4.h
@@ -0,0 +1,63 @@
+/**
+ @file lz4.h
+ This service provides dynamic access to LZ4.
+*/
+
+#ifndef LZ4_INCLUDED
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef MYSQL_ABI_CHECK
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#endif
+
+#ifndef MYSQL_DYNAMIC_PLUGIN
+#define provider_service_lz4 provider_service_lz4_static
+#endif
+
+#ifndef LZ4_VERSION_NUMBER
+#define LZ4_MAX_INPUT_SIZE 0x7E000000
+
+#define LZ4_compressBound(...) provider_service_lz4->LZ4_compressBound_ptr (__VA_ARGS__)
+#define LZ4_compress_default(...) provider_service_lz4->LZ4_compress_default_ptr (__VA_ARGS__)
+#define LZ4_decompress_safe(...) provider_service_lz4->LZ4_decompress_safe_ptr (__VA_ARGS__)
+#endif
+
+#define DEFINE_LZ4_compressBound(NAME) NAME( \
+ int inputSize \
+)
+
+#define DEFINE_LZ4_compress_default(NAME) NAME( \
+ const char *src, \
+ char *dst, \
+ int srcSize, \
+ int dstCapacity \
+)
+
+#define DEFINE_LZ4_decompress_safe(NAME) NAME( \
+ const char *src, \
+ char *dst, \
+ int compressedSize, \
+ int dstCapacity \
+)
+
+struct provider_service_lz4_st
+{
+ int DEFINE_LZ4_compressBound((*LZ4_compressBound_ptr));
+ int DEFINE_LZ4_compress_default((*LZ4_compress_default_ptr));
+ int DEFINE_LZ4_decompress_safe((*LZ4_decompress_safe_ptr));
+
+ bool is_loaded;
+};
+
+extern struct provider_service_lz4_st *provider_service_lz4;
+
+#ifdef __cplusplus
+}
+#endif
+
+#define LZ4_INCLUDED
+#endif
diff --git a/include/providers/lzma.h b/include/providers/lzma.h
new file mode 100644
index 00000000000..8125bb8cb04
--- /dev/null
+++ b/include/providers/lzma.h
@@ -0,0 +1,102 @@
+/**
+ @file lzma.h
+ This service provides dynamic access to LZMA.
+*/
+
+#ifndef LZMA_INCLUDED
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef MYSQL_ABI_CHECK
+#include <stdbool.h>
+#include <stdint.h>
+#include <stddef.h>
+#endif
+
+#ifndef MYSQL_DYNAMIC_PLUGIN
+#define provider_service_lzma provider_service_lzma_static
+#endif
+
+#ifndef LZMA_VERSION
+typedef enum
+{
+ LZMA_OK = 0,
+ LZMA_STREAM_END = 1,
+ LZMA_NO_CHECK = 2,
+ LZMA_UNSUPPORTED_CHECK = 3,
+ LZMA_GET_CHECK = 4,
+ LZMA_MEM_ERROR = 5,
+ LZMA_MEMLIMIT_ERROR = 6,
+ LZMA_FORMAT_ERROR = 7,
+ LZMA_OPTIONS_ERROR = 8,
+ LZMA_DATA_ERROR = 9,
+ LZMA_BUF_ERROR = 10,
+ LZMA_PROG_ERROR = 11,
+} lzma_ret;
+
+typedef struct
+{
+ void *(*alloc)(void *opaque, size_t nmemb, size_t size);
+ void (*free)(void *opaque, void *ptr);
+ void *opaque;
+} lzma_allocator;
+
+typedef enum
+{
+ LZMA_CHECK_NONE = 0,
+ LZMA_CHECK_CRC32 = 1,
+ LZMA_CHECK_CRC64 = 4,
+ LZMA_CHECK_SHA256 = 10
+} lzma_check;
+
+#define lzma_stream_buffer_decode(...) provider_service_lzma->lzma_stream_buffer_decode_ptr (__VA_ARGS__)
+#define lzma_easy_buffer_encode(...) provider_service_lzma->lzma_easy_buffer_encode_ptr (__VA_ARGS__)
+#elif LZMA_VERSION < 50010030
+#define lzma_maybe_const
+#endif
+
+#ifndef lzma_maybe_const
+#define lzma_maybe_const const
+#endif
+
+#define DEFINE_lzma_stream_buffer_decode(NAME) NAME( \
+ uint64_t *memlimit, \
+ uint32_t flags, \
+ lzma_maybe_const lzma_allocator *allocator, \
+ const uint8_t *in, \
+ size_t *in_pos, \
+ size_t in_size, \
+ uint8_t *out, \
+ size_t *out_pos, \
+ size_t out_size \
+)
+
+#define DEFINE_lzma_easy_buffer_encode(NAME) NAME( \
+ uint32_t preset, \
+ lzma_check check, \
+ lzma_maybe_const lzma_allocator *allocator, \
+ const uint8_t *in, \
+ size_t in_size, \
+ uint8_t *out, \
+ size_t *out_pos, \
+ size_t out_size \
+)
+
+struct provider_service_lzma_st
+{
+ lzma_ret DEFINE_lzma_stream_buffer_decode((*lzma_stream_buffer_decode_ptr));
+ lzma_ret DEFINE_lzma_easy_buffer_encode((*lzma_easy_buffer_encode_ptr));
+
+ bool is_loaded;
+};
+
+extern struct provider_service_lzma_st *provider_service_lzma;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#define LZMA_INCLUDED
+#endif
diff --git a/include/providers/lzo/lzo1x.h b/include/providers/lzo/lzo1x.h
new file mode 100644
index 00000000000..93d1461f9cb
--- /dev/null
+++ b/include/providers/lzo/lzo1x.h
@@ -0,0 +1,62 @@
+/**
+ @file lzo/lzo1x.h
+ This service provides dynamic access to LZO.
+*/
+
+#ifndef LZO_INCLUDED
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef MYSQL_ABI_CHECK
+#include <stdbool.h>
+#endif
+
+#ifndef MYSQL_DYNAMIC_PLUGIN
+#define provider_service_lzo provider_service_lzo_static
+#endif
+
+#ifndef LZO_E_OK
+#define LZO_E_OK 0
+#define LZO_E_INTERNAL_ERROR (-99)
+
+#define LZO1X_1_15_MEM_COMPRESS ((unsigned int) (32768L * ((unsigned) sizeof(unsigned char *))))
+
+typedef size_t lzo_uint;
+
+#define lzo1x_1_15_compress(...) provider_service_lzo->lzo1x_1_15_compress_ptr (__VA_ARGS__)
+#define lzo1x_decompress_safe(...) provider_service_lzo->lzo1x_decompress_safe_ptr (__VA_ARGS__)
+#endif
+
+#define DEFINE_lzo1x_1_15_compress(NAME) NAME( \
+ const unsigned char *src, \
+ lzo_uint src_len, \
+ unsigned char *dst, \
+ lzo_uint *dst_len, \
+ void *wrkmem \
+)
+
+#define DEFINE_lzo1x_decompress_safe(NAME) NAME( \
+ const unsigned char *src, \
+ lzo_uint src_len, \
+ unsigned char *dst, \
+ lzo_uint *dst_len, \
+ void *wrkmem \
+)
+
+struct provider_service_lzo_st
+{
+ int DEFINE_lzo1x_1_15_compress((*lzo1x_1_15_compress_ptr));
+ int DEFINE_lzo1x_decompress_safe((*lzo1x_decompress_safe_ptr));
+
+ bool is_loaded;
+};
+
+extern struct provider_service_lzo_st *provider_service_lzo;
+
+#ifdef __cplusplus
+}
+#endif
+
+#define LZO_INCLUDED
+#endif
diff --git a/include/providers/snappy-c.h b/include/providers/snappy-c.h
new file mode 100644
index 00000000000..afc6aef274c
--- /dev/null
+++ b/include/providers/snappy-c.h
@@ -0,0 +1,75 @@
+/**
+ @file snappy-c.h
+ This service provides dynamic access to Snappy as a C header.
+*/
+
+#ifndef SNAPPY_C_INCLUDED
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef MYSQL_ABI_CHECK
+#include <stddef.h>
+#include <stdbool.h>
+#endif
+
+#ifndef MYSQL_DYNAMIC_PLUGIN
+#define provider_service_snappy provider_service_snappy_static
+#endif
+
+#ifndef SNAPPY_C
+typedef enum
+{
+ SNAPPY_OK = 0,
+ SNAPPY_INVALID_INPUT = 1,
+ SNAPPY_BUFFER_TOO_SMALL = 2
+} snappy_status;
+
+#define snappy_max_compressed_length(...) provider_service_snappy->snappy_max_compressed_length_ptr (__VA_ARGS__)
+#define snappy_compress(...) provider_service_snappy->snappy_compress_ptr (__VA_ARGS__)
+#define snappy_uncompressed_length(...) provider_service_snappy->snappy_uncompressed_length_ptr (__VA_ARGS__)
+#define snappy_uncompress(...) provider_service_snappy->snappy_uncompress_ptr (__VA_ARGS__)
+#endif
+
+#define DEFINE_snappy_max_compressed_length(NAME) NAME( \
+ size_t source_length \
+)
+
+#define DEFINE_snappy_compress(NAME) NAME( \
+ const char *input, \
+ size_t input_length, \
+ char *compressed, \
+ size_t *compressed_length \
+)
+
+#define DEFINE_snappy_uncompressed_length(NAME) NAME( \
+ const char *compressed, \
+ size_t compressed_length, \
+ size_t *result \
+)
+
+#define DEFINE_snappy_uncompress(NAME) NAME( \
+ const char *compressed, \
+ size_t compressed_length, \
+ char *uncompressed, \
+ size_t *uncompressed_length \
+)
+
+struct provider_service_snappy_st
+{
+ size_t DEFINE_snappy_max_compressed_length((*snappy_max_compressed_length_ptr));
+ snappy_status DEFINE_snappy_compress((*snappy_compress_ptr));
+ snappy_status DEFINE_snappy_uncompressed_length((*snappy_uncompressed_length_ptr));
+ snappy_status DEFINE_snappy_uncompress((*snappy_uncompress_ptr));
+
+ bool is_loaded;
+};
+
+extern struct provider_service_snappy_st *provider_service_snappy;
+
+#ifdef __cplusplus
+}
+#endif
+
+#define SNAPPY_C_INCLUDED
+#endif
diff --git a/include/service_versions.h b/include/service_versions.h
index 34e4952c94c..9abae740a7b 100644
--- a/include/service_versions.h
+++ b/include/service_versions.h
@@ -44,3 +44,10 @@
#define VERSION_wsrep 0x0500
#define VERSION_json 0x0100
#define VERSION_thd_mdl 0x0100
+#define VERSION_sql_service 0x0101
+
+#define VERSION_provider_bzip2 0x0100
+#define VERSION_provider_lz4 0x0100
+#define VERSION_provider_lzma 0x0100
+#define VERSION_provider_lzo 0x0100
+#define VERSION_provider_snappy 0x0100
diff --git a/include/sql_common.h b/include/sql_common.h
index 9fc983616a0..ad5ab7e19af 100644
--- a/include/sql_common.h
+++ b/include/sql_common.h
@@ -61,13 +61,13 @@ typedef struct st_mysql_methods
MYSQL_ROW column, unsigned int field_count);
void (*flush_use_result)(MYSQL *mysql, my_bool flush_all_results);
int (*read_change_user_result)(MYSQL *mysql);
+ void (*on_close_free)(MYSQL *mysql);
#if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY)
MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
int (*stmt_execute)(MYSQL_STMT *stmt);
int (*read_binary_rows)(MYSQL_STMT *stmt);
int (*unbuffered_fetch)(MYSQL *mysql, char **row);
- void (*free_embedded_thd)(MYSQL *mysql);
const char *(*read_statistics)(MYSQL *mysql);
my_bool (*next_result)(MYSQL *mysql);
int (*read_rows_from_cursor)(MYSQL_STMT *stmt);
diff --git a/include/ssl_compat.h b/include/ssl_compat.h
index 6db1baab9b5..664f3aac87c 100644
--- a/include/ssl_compat.h
+++ b/include/ssl_compat.h
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2016, 2021, MariaDB Corporation.
+ Copyright (c) 2016, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt
index 6cff07ee132..490c2ed41b5 100644
--- a/libmysqld/CMakeLists.txt
+++ b/libmysqld/CMakeLists.txt
@@ -1,5 +1,5 @@
# Copyright (c) 2006, 2011, Oracle and/or its affiliates.
-# Copyright (c) 2009, 2020, MariaDB Corporation
+# Copyright (c) 2009, 2022, MariaDB Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -24,6 +24,7 @@ ${CMAKE_SOURCE_DIR}/sql
${CMAKE_SOURCE_DIR}/tpool
${CMAKE_BINARY_DIR}/sql
${PCRE_INCLUDES}
+${LIBFMT_INCLUDE_DIR}
${ZLIB_INCLUDE_DIR}
${SSL_INCLUDE_DIRS}
${SSL_INTERNAL_INCLUDE_DIRS}
@@ -94,7 +95,7 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
../sql/select_handler.cc
../sql/sql_show.cc ../sql/sql_state.c
../sql/sql_statistics.cc ../sql/sql_string.cc
- ../sql/sql_tablespace.cc ../sql/sql_table.cc ../sql/sql_test.cc
+ ../sql/sql_table.cc ../sql/sql_test.cc
../sql/ddl_log.cc
../sql/sql_trigger.cc ../sql/sql_udf.cc ../sql/sql_union.cc
../sql/sql_update.cc ../sql/sql_view.cc ../sql/sql_profile.cc
@@ -145,6 +146,7 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
../sql/opt_trace.cc
../sql/xa.cc
../sql/json_table.cc
+ ../sql/opt_histogram_json.cc
${GEN_SOURCES}
${MYSYS_LIBWRAP_SOURCE}
)
@@ -156,6 +158,9 @@ ADD_DEPENDENCIES(sql_embedded GenError GenServerSource)
IF(TARGET pcre2)
ADD_DEPENDENCIES(sql_embedded pcre2)
ENDIF()
+IF(TARGET libfmt)
+ ADD_DEPENDENCIES(sql_embedded libfmt)
+ENDIF()
TARGET_LINK_LIBRARIES(sql_embedded LINK_PRIVATE tpool ${CRC32_LIBRARY})
# On Windows, static embedded server library is called mysqlserver.lib
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index fe1b4e4fec9..5a8945a35a6 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -43,7 +43,7 @@ C_MODE_START
extern unsigned int mysql_server_last_errno;
extern char mysql_server_last_error[MYSQL_ERRMSG_SIZE];
static my_bool emb_read_query_result(MYSQL *mysql);
-static void emb_free_embedded_thd(MYSQL *mysql);
+static void free_embedded_thd(MYSQL *mysql);
static bool embedded_print_errors= 0;
extern "C" void unireg_clear(int exit_code)
@@ -121,7 +121,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
thd->killed= NOT_KILLED;
else
{
- emb_free_embedded_thd(mysql);
+ free_embedded_thd(mysql);
thd= 0;
}
}
@@ -430,7 +430,7 @@ int emb_unbuffered_fetch(MYSQL *mysql, char **row)
return 0;
}
-static void emb_free_embedded_thd(MYSQL *mysql)
+static void free_embedded_thd(MYSQL *mysql)
{
THD *thd= (THD*)mysql->thd;
server_threads.erase(thd);
@@ -453,12 +453,23 @@ static MYSQL_RES * emb_store_result(MYSQL *mysql)
return mysql_store_result(mysql);
}
-int emb_read_change_user_result(MYSQL *mysql)
+static int emb_read_change_user_result(MYSQL *mysql)
{
mysql->net.read_pos= (uchar*)""; // fake an OK packet
return mysql_errno(mysql) ? (int)packet_error : 1 /* length of the OK packet */;
}
+static void emb_on_close_free(MYSQL *mysql)
+{
+ my_free(mysql->info_buffer);
+ mysql->info_buffer= 0;
+ if (mysql->thd)
+ {
+ free_embedded_thd(mysql);
+ mysql->thd= 0;
+ }
+}
+
MYSQL_METHODS embedded_methods=
{
emb_read_query_result,
@@ -468,12 +479,12 @@ MYSQL_METHODS embedded_methods=
emb_fetch_lengths,
emb_flush_use_result,
emb_read_change_user_result,
+ emb_on_close_free,
emb_list_fields,
emb_read_prepare_result,
emb_stmt_execute,
emb_read_binary_rows,
emb_unbuffered_fetch,
- emb_free_embedded_thd,
emb_read_statistics,
emb_read_query_result,
emb_read_rows_from_cursor
diff --git a/libservices/CMakeLists.txt b/libservices/CMakeLists.txt
index 274c8ce6dac..8c559cb07f5 100644
--- a/libservices/CMakeLists.txt
+++ b/libservices/CMakeLists.txt
@@ -38,7 +38,13 @@ SET(MYSQLSERVICES_SOURCES
thd_wait_service.c
wsrep_service.c
json_service.c
- )
+ sql_service.c
+ provider_service_bzip2.c
+ provider_service_lz4.c
+ provider_service_lzma.c
+ provider_service_lzo.c
+ provider_service_snappy.c
+)
ADD_CONVENIENCE_LIBRARY(mysqlservices ${MYSQLSERVICES_SOURCES})
INSTALL(TARGETS mysqlservices DESTINATION ${INSTALL_LIBDIR} COMPONENT Development)
diff --git a/sql/sql_tablespace.h b/libservices/provider_service_bzip2.c
index 0760935edfc..f18ce55dd4e 100644
--- a/sql/sql_tablespace.h
+++ b/libservices/provider_service_bzip2.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (C) 2021 MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -11,14 +11,7 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
-#ifndef SQL_TABLESPACE_INCLUDED
-#define SQL_TABLESPACE_INCLUDED
-
-class THD;
-class st_alter_tablespace;
-
-int mysql_alter_tablespace(THD* thd, st_alter_tablespace *ts_info);
-
-#endif /* SQL_TABLESPACE_INCLUDED */
+#include <service_versions.h>
+SERVICE_VERSION provider_service_bzip2 = (void*) VERSION_provider_bzip2;
diff --git a/libservices/provider_service_lz4.c b/libservices/provider_service_lz4.c
new file mode 100644
index 00000000000..2653f86e26c
--- /dev/null
+++ b/libservices/provider_service_lz4.c
@@ -0,0 +1,14 @@
+/* Copyright (C) 2021 MariaDB
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <service_versions.h>
+SERVICE_VERSION provider_service_lz4 = (void*) VERSION_provider_lz4;
diff --git a/libservices/provider_service_lzma.c b/libservices/provider_service_lzma.c
new file mode 100644
index 00000000000..79fc982140d
--- /dev/null
+++ b/libservices/provider_service_lzma.c
@@ -0,0 +1,17 @@
+/* Copyright (C) 2021 MariaDB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <service_versions.h>
+SERVICE_VERSION provider_service_lzma = (void*) VERSION_provider_lzma;
diff --git a/libservices/provider_service_lzo.c b/libservices/provider_service_lzo.c
new file mode 100644
index 00000000000..8b72ac017ea
--- /dev/null
+++ b/libservices/provider_service_lzo.c
@@ -0,0 +1,14 @@
+/* Copyright (C) 2021 MariaDB
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <service_versions.h>
+SERVICE_VERSION provider_service_lzo = (void*) VERSION_provider_lzo;
diff --git a/libservices/provider_service_snappy.c b/libservices/provider_service_snappy.c
new file mode 100644
index 00000000000..ac0415bad61
--- /dev/null
+++ b/libservices/provider_service_snappy.c
@@ -0,0 +1,17 @@
+/* Copyright (C) 2021 MariaDB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <service_versions.h>
+SERVICE_VERSION provider_service_snappy= (void*) VERSION_provider_snappy;
diff --git a/libservices/sql_service.c b/libservices/sql_service.c
new file mode 100644
index 00000000000..5c0102bfadf
--- /dev/null
+++ b/libservices/sql_service.c
@@ -0,0 +1,19 @@
+
+/* Copyright (c) 2018, Monty Program Ab
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include <service_versions.h>
+SERVICE_VERSION sql_service= (void*)VERSION_sql_service;
diff --git a/man/comp_err.1 b/man/comp_err.1
index 7e401867906..260295d56ab 100644
--- a/man/comp_err.1
+++ b/man/comp_err.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBCOMP_ERR\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBCOMP_ERR\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/galera_new_cluster.1 b/man/galera_new_cluster.1
index def5faeb935..271f743c068 100644
--- a/man/galera_new_cluster.1
+++ b/man/galera_new_cluster.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBGALERA_NEW_CLUSTER\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBGALERA_NEW_CLUSTER\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/galera_recovery.1 b/man/galera_recovery.1
index 6ada4367d83..90b90282d78 100644
--- a/man/galera_recovery.1
+++ b/man/galera_recovery.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBGALERA_RECOVERY\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBGALERA_RECOVERY\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/innochecksum.1 b/man/innochecksum.1
index 5a56dada985..94aad5ca0a1 100644
--- a/man/innochecksum.1
+++ b/man/innochecksum.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBINNOCHECKSUM\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBINNOCHECKSUM\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mariabackup.1 b/man/mariabackup.1
index af72f293488..b6828f22f92 100644
--- a/man/mariabackup.1
+++ b/man/mariabackup.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIABACKUP\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIABACKUP\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mariadb-conv.1 b/man/mariadb-conv.1
index 1e0385f4fd3..16fb112f7f2 100644
--- a/man/mariadb-conv.1
+++ b/man/mariadb-conv.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-CONV" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-CONV" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mariadb-service-convert.1 b/man/mariadb-service-convert.1
index 7c5291c3afd..5132ae9c03f 100644
--- a/man/mariadb-service-convert.1
+++ b/man/mariadb-service-convert.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-SERVICE-CONVERT\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-SERVICE-CONVERT\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mbstream.1 b/man/mbstream.1
index 16cf5b180f2..955768122dc 100644
--- a/man/mbstream.1
+++ b/man/mbstream.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMBSTREAM\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMBSTREAM\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/msql2mysql.1 b/man/msql2mysql.1
index 503b8b194ab..870d73558fd 100644
--- a/man/msql2mysql.1
+++ b/man/msql2mysql.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMSQL2MYSQL\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMSQL2MYSQL\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/my_print_defaults.1 b/man/my_print_defaults.1
index d7b81cc73b2..cb3c6f3ad12 100644
--- a/man/my_print_defaults.1
+++ b/man/my_print_defaults.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMY_PRINT_DEFAULTS" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMY_PRINT_DEFAULTS" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/my_safe_process.1 b/man/my_safe_process.1
index b265352fb86..bc31526214b 100644
--- a/man/my_safe_process.1
+++ b/man/my_safe_process.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMY_SAFE_PROCESS\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMY_SAFE_PROCESS\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/myisam_ftdump.1 b/man/myisam_ftdump.1
index 4af8280d2d8..480935bb713 100644
--- a/man/myisam_ftdump.1
+++ b/man/myisam_ftdump.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMYISAM_FTDUMP\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMYISAM_FTDUMP\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/myisamchk.1 b/man/myisamchk.1
index e059cf11036..3c930bedcf1 100644
--- a/man/myisamchk.1
+++ b/man/myisamchk.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMYISAMCHK\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMYISAMCHK\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/myisamlog.1 b/man/myisamlog.1
index 0d063e0a046..ce8f8c6011b 100644
--- a/man/myisamlog.1
+++ b/man/myisamlog.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMYISAMLOG\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMYISAMLOG\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/myisampack.1 b/man/myisampack.1
index b46fef85f38..551c4a6088a 100644
--- a/man/myisampack.1
+++ b/man/myisampack.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMYISAMPACK\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMYISAMPACK\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/myrocks_hotbackup.1 b/man/myrocks_hotbackup.1
index b5f07a3a913..7e6384ea2c1 100644
--- a/man/myrocks_hotbackup.1
+++ b/man/myrocks_hotbackup.1
@@ -1,4 +1,4 @@
-.TH MYROCKS_HOTBACKUP "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH MYROCKS_HOTBACKUP "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.SH NAME
myrocks_hotbackup \- streaming backup for MariaDB MyRocks
.SH DESCRIPTION
diff --git a/man/mysql-stress-test.pl.1 b/man/mysql-stress-test.pl.1
index d69f6123488..f36b65f352e 100644
--- a/man/mysql-stress-test.pl.1
+++ b/man/mysql-stress-test.pl.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMYSQL\-STRESS\-TE" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMYSQL\-STRESS\-TE" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql-test-run.pl.1 b/man/mysql-test-run.pl.1
index b13727c3298..1e45e65190f 100644
--- a/man/mysql-test-run.pl.1
+++ b/man/mysql-test-run.pl.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMYSQL\-TEST\-RUN\" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMYSQL\-TEST\-RUN\" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql.1 b/man/mysql.1
index 6684189e474..80a7c8cd360 100644
--- a/man/mysql.1
+++ b/man/mysql.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql.server.1 b/man/mysql.server.1
index 4b99aadb0b3..1b2582052f0 100644
--- a/man/mysql.server.1
+++ b/man/mysql.server.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMYSQL\&.SERVER\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMYSQL\&.SERVER\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_client_test.1 b/man/mysql_client_test.1
index ae9d54dbef8..2ed454a19a3 100644
--- a/man/mysql_client_test.1
+++ b/man/mysql_client_test.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-CLIENT-TEST" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-CLIENT-TEST" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_config.1 b/man/mysql_config.1
index 90b09cb5d4b..579acdd7a84 100644
--- a/man/mysql_config.1
+++ b/man/mysql_config.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMYSQL_CONFIG\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMYSQL_CONFIG\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_convert_table_format.1 b/man/mysql_convert_table_format.1
index 943cb66ae00..df811abe02d 100644
--- a/man/mysql_convert_table_format.1
+++ b/man/mysql_convert_table_format.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-CONVERT-TAB" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-CONVERT-TAB" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_find_rows.1 b/man/mysql_find_rows.1
index d15921ed80a..b711460102e 100644
--- a/man/mysql_find_rows.1
+++ b/man/mysql_find_rows.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-FIND-ROWS\F" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-FIND-ROWS\F" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_fix_extensions.1 b/man/mysql_fix_extensions.1
index 5b816e4f5be..d19bc821232 100644
--- a/man/mysql_fix_extensions.1
+++ b/man/mysql_fix_extensions.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-FIX-EXTENSI" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-FIX-EXTENSI" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_install_db.1 b/man/mysql_install_db.1
index 25e151b71a1..27369057a8d 100644
--- a/man/mysql_install_db.1
+++ b/man/mysql_install_db.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-INSTALL-DB\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-INSTALL-DB\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
@@ -345,6 +345,21 @@ runs using your current login name and files and directories that it creates wil
.sp -1
.IP \(bu 2.3
.\}
+.\" mysql_install_db: extra-file option
+.\" extra-file option: mysql_install_db
+\fB\-\-extra-file=\fR\fB\fIfile_path\fR\fR
+.sp
+Add user defined SQL file, to be executed following regular database initialization.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
.\" mysql_install_db: verbose option
.\" verbose option: mysql_install_db
\fB\-\-verbose\fR
diff --git a/man/mysql_ldb.1 b/man/mysql_ldb.1
index 5816d92674c..783c49eb052 100644
--- a/man/mysql_ldb.1
+++ b/man/mysql_ldb.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-LDB\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-LDB\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_plugin.1 b/man/mysql_plugin.1
index 683a42eafaf..0e60671478b 100644
--- a/man/mysql_plugin.1
+++ b/man/mysql_plugin.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-PLUGIN\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-PLUGIN\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/man/mysql_secure_installation.1 b/man/mysql_secure_installation.1
index b8081dad6a6..32540c56209 100644
--- a/man/mysql_secure_installation.1
+++ b/man/mysql_secure_installation.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-SECURE-INST" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-SECURE-INST" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_setpermission.1 b/man/mysql_setpermission.1
index 1660c6c1de5..b23ac9f7156 100644
--- a/man/mysql_setpermission.1
+++ b/man/mysql_setpermission.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-SETPERMISSI" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-SETPERMISSI" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_tzinfo_to_sql.1 b/man/mysql_tzinfo_to_sql.1
index 76ce3a028cf..e07442e30b1 100644
--- a/man/mysql_tzinfo_to_sql.1
+++ b/man/mysql_tzinfo_to_sql.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-TZINFO-TO-S" "1" "22 April 2022" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-TZINFO-TO-S" "1" "22 April 2022" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_upgrade.1 b/man/mysql_upgrade.1
index ef4e438f735..3797f4ab93b 100644
--- a/man/mysql_upgrade.1
+++ b/man/mysql_upgrade.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-UPGRADE\FR" "1" "20 July 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-UPGRADE\FR" "1" "20 July 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysql_waitpid.1 b/man/mysql_waitpid.1
index c2b796845cf..2502d66c5a7 100644
--- a/man/mysql_waitpid.1
+++ b/man/mysql_waitpid.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-WAITPID\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-WAITPID\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqlaccess.1 b/man/mysqlaccess.1
index 496b90495c6..c77ee4276dd 100644
--- a/man/mysqlaccess.1
+++ b/man/mysqlaccess.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-ACCESS\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-ACCESS\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqladmin.1 b/man/mysqladmin.1
index 25603cddc4b..f5af9065961 100644
--- a/man/mysqladmin.1
+++ b/man/mysqladmin.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-ADMIN\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-ADMIN\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqlbinlog.1 b/man/mysqlbinlog.1
index ff08a5de6bf..6efd08d10b1 100644
--- a/man/mysqlbinlog.1
+++ b/man/mysqlbinlog.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-BINLOG\FR" "1" "14 April 2021" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-BINLOG\FR" "1" "14 April 2021" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
@@ -992,8 +992,15 @@ This option is useful for point\-in\-time recovery\&.
\fB\-\-start\-position=\fR\fB\fIN\fR\fR,
\fB\-j \fR\fB\fIN\fR\fR
.sp
-Start reading the binary log at the first event having a position equal to or greater than
-\fIN\fR\&. This option applies to the first log file named on the command line\&.
+Start reading the binary log at \fIN\fR\&. Type can either be a positive
+integer or a GTID\& list\&. When using a positive integer, the value only
+applies to the first binlog passed on the command line, and the first event
+that has a position equal to or greater than \fIN\fR is printed\&. In GTID mode,
+multiple GTIDs can be passed as a comma separated list, where each must have a
+unique domain id\&. The list represents the gtid binlog state that the client
+(another "replica" server) is aware of\&. Therefore, each GTID is exclusive; only
+events after a given sequence number will be printed to allow users to receive
+events after their current state\&.
.sp
This option is useful for point\-in\-time recovery\&.
.RE
@@ -1006,6 +1013,23 @@ This option is useful for point\-in\-time recovery\&.
.sp -1
.IP \(bu 2.3
.\}
+.\" mysqlbinlog: gtid-strict-mode
+.\" gtid-strict-mode option: mysqlbinlog
+\fB\-\-gtid\-strict\-mode
+.sp
+Process binlog according to gtid-strict-mode specification\&. The start, stop
+positions are verified to satisfy start < stop comparison condition\&. Sequence
+numbers of any gtid domain must comprise monotically growing sequence\&.
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
.\" mysqlbinlog: stop-datetime option
.\" stop-datetime option: mysqlbinlog
\fB\-\-stop\-datetime=\fR\fB\fIdatetime\fR\fR
@@ -1063,8 +1087,13 @@ The slave server_id used for \fB--read-from-remote-server --stop-never\fR\&.
.\" stop-position option: mysqlbinlog
\fB\-\-stop\-position=\fR\fB\fIN\fR\fR
.sp
-Stop reading the binary log at the first event having a position equal to or greater than
-\fIN\fR\&. This option applies to the last log file named on the command line\&.
+Stop reading the binary log at the first event having a position equal to or
+greater than \fIN\fR\&. Type can either be a positive integer or a GTID
+list\&. When using a positive integer, the value only applies to the last log
+file named on the command line\&. When in GTID mode, multiple GTIDs can be
+passed as a comma separated list, where each must have a unique domain id\&.
+Each GTID is inclusive; only events up to the given sequence numbers are
+printed.
.sp
This option is useful for point\-in\-time recovery\&.
.RE
@@ -1133,6 +1162,7 @@ The MariaDB username to use when connecting to a remote server\&.
\fB\-v\fR
.sp
Reconstruct row events and display them as commented SQL statements\&. If this option is given twice, the output includes comments to indicate column data types and some metadata\&.
+If this option is given three times, the output includes diagnostic warnings about event integrity before program exit\&.
.sp
For examples that show the effect of
\fB\-\-base64\-output\fR
diff --git a/man/mysqlcheck.1 b/man/mysqlcheck.1
index 399f2e1e56b..250fe0017a7 100644
--- a/man/mysqlcheck.1
+++ b/man/mysqlcheck.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-CHECK\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-CHECK\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqld.8 b/man/mysqld.8
index 272adf79a5e..b04271ab4d6 100644
--- a/man/mysqld.8
+++ b/man/mysqld.8
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADBD\FR" "8" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADBD\FR" "8" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqld_multi.1 b/man/mysqld_multi.1
index 0d14466ed1b..c88ce6e4924 100644
--- a/man/mysqld_multi.1
+++ b/man/mysqld_multi.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADBD-MULTI\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADBD-MULTI\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqld_safe.1 b/man/mysqld_safe.1
index da742dc65b7..1fdf23a0970 100644
--- a/man/mysqld_safe.1
+++ b/man/mysqld_safe.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADBD-SAFE\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADBD-SAFE\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqld_safe_helper.1 b/man/mysqld_safe_helper.1
index b00fe982a93..b24ccde8b88 100644
--- a/man/mysqld_safe_helper.1
+++ b/man/mysqld_safe_helper.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADBD-SAFE-HELPER\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADBD-SAFE-HELPER\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqldump.1 b/man/mysqldump.1
index 07ae4578bcc..21203f9d7cb 100644
--- a/man/mysqldump.1
+++ b/man/mysqldump.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-DUMP\FR" "1" "24 October 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-DUMP\FR" "1" "24 October 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqldumpslow.1 b/man/mysqldumpslow.1
index e69f32b9056..164209db300 100644
--- a/man/mysqldumpslow.1
+++ b/man/mysqldumpslow.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-DUMPSLOW\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-DUMPSLOW\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqlhotcopy.1 b/man/mysqlhotcopy.1
index 1d1eee12d90..5193abc3e87 100644
--- a/man/mysqlhotcopy.1
+++ b/man/mysqlhotcopy.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-HOTCOPY\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-HOTCOPY\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqlimport.1 b/man/mysqlimport.1
index 5b80300ddb9..32ab3c01574 100644
--- a/man/mysqlimport.1
+++ b/man/mysqlimport.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-IMPORT\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-IMPORT\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqlshow.1 b/man/mysqlshow.1
index 82be2967400..fdea9f5842d 100644
--- a/man/mysqlshow.1
+++ b/man/mysqlshow.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-SHOW\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-SHOW\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqlslap.1 b/man/mysqlslap.1
index bd91e869f3a..a3c7191bc22 100644
--- a/man/mysqlslap.1
+++ b/man/mysqlslap.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-SLAP\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-SLAP\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mysqltest.1 b/man/mysqltest.1
index eccd6453fbe..56bb1996e69 100644
--- a/man/mysqltest.1
+++ b/man/mysqltest.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-TEST\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBMARIADB-TEST\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/mytop.1 b/man/mytop.1
index a68413b5af0..32c7639975b 100644
--- a/man/mytop.1
+++ b/man/mytop.1
@@ -1,4 +1,4 @@
-.TH MYTOP "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH MYTOP "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.SH NAME
mytop \- display MariaDB server performance info like 'top'
.SH "SEE ALSO"
diff --git a/man/perror.1 b/man/perror.1
index 2094608d0a2..4f80aad3b6a 100644
--- a/man/perror.1
+++ b/man/perror.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBPERROR\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBPERROR\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/replace.1 b/man/replace.1
index 701a72ac360..c9ffd898815 100644
--- a/man/replace.1
+++ b/man/replace.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBREPLACE\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBREPLACE\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/resolve_stack_dump.1 b/man/resolve_stack_dump.1
index ad61f45fd09..e36090727c4 100644
--- a/man/resolve_stack_dump.1
+++ b/man/resolve_stack_dump.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBRESOLVE_STACK_DUM" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBRESOLVE_STACK_DUM" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/resolveip.1 b/man/resolveip.1
index cc13e58b70f..eedee2434ce 100644
--- a/man/resolveip.1
+++ b/man/resolveip.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBRESOLVEIP\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBRESOLVEIP\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/wsrep_sst_common.1 b/man/wsrep_sst_common.1
index 8323011aaa1..c2e071fd429 100644
--- a/man/wsrep_sst_common.1
+++ b/man/wsrep_sst_common.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBWSREP_SST_COMMON\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBWSREP_SST_COMMON\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/wsrep_sst_mariabackup.1 b/man/wsrep_sst_mariabackup.1
index 83e4e43907e..0c15ddb82fe 100644
--- a/man/wsrep_sst_mariabackup.1
+++ b/man/wsrep_sst_mariabackup.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBWSREP_SST_MARIABACKUP\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBWSREP_SST_MARIABACKUP\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/wsrep_sst_mysqldump.1 b/man/wsrep_sst_mysqldump.1
index 78eef3bd0f3..2ea657cbc2f 100644
--- a/man/wsrep_sst_mysqldump.1
+++ b/man/wsrep_sst_mysqldump.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBWSREP_SST_MYSQLDUMP\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBWSREP_SST_MYSQLDUMP\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/wsrep_sst_rsync.1 b/man/wsrep_sst_rsync.1
index c3225d58d9f..709885aa399 100644
--- a/man/wsrep_sst_rsync.1
+++ b/man/wsrep_sst_rsync.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBWSREP_SST_RSYNC\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBWSREP_SST_RSYNC\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/man/wsrep_sst_rsync_wan.1 b/man/wsrep_sst_rsync_wan.1
index a81933449ea..98e93a77b65 100644
--- a/man/wsrep_sst_rsync_wan.1
+++ b/man/wsrep_sst_rsync_wan.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBWSREP_SST_RSYNC_WAN\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
+.TH "\FBWSREP_SST_RSYNC_WAN\FR" "1" "15 May 2020" "MariaDB 10\&.8" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
diff --git a/mysql-test/collections/skip_list_ubsan.txt b/mysql-test/collections/skip_list_ubsan.txt
new file mode 100644
index 00000000000..dc178574293
--- /dev/null
+++ b/mysql-test/collections/skip_list_ubsan.txt
@@ -0,0 +1,3 @@
+binlog.binlog_truncate_active_log : MDEV-26919 - undefined value
+main.json_normalize : MDEV-27415 - out of bounds
+main.json_equals : MDEV-27415 - out of bounds
diff --git a/mysql-test/include/binlog_combinations.combinations b/mysql-test/include/binlog_combinations.combinations
new file mode 100644
index 00000000000..07042c2cbec
--- /dev/null
+++ b/mysql-test/include/binlog_combinations.combinations
@@ -0,0 +1,8 @@
+[row]
+binlog-format=row
+
+[stmt]
+binlog-format=statement
+
+[mix]
+binlog-format=mixed
diff --git a/mysql-test/include/binlog_combinations.inc b/mysql-test/include/binlog_combinations.inc
new file mode 100644
index 00000000000..2ddd787681a
--- /dev/null
+++ b/mysql-test/include/binlog_combinations.inc
@@ -0,0 +1,5 @@
+# The goal of including this file is to test with different
+# binlog combinations: row, stmt or mix
+# (see include/binlog_combinations.combinations)
+
+--source include/have_log_bin.inc
diff --git a/mysql-test/include/check_utf8_cli.inc b/mysql-test/include/check_utf8_cli.inc
new file mode 100644
index 00000000000..a1fac216446
--- /dev/null
+++ b/mysql-test/include/check_utf8_cli.inc
@@ -0,0 +1,3 @@
+# Check if utf8 can be used on the command line for --exec
+# The real check is done in the suite.pm
+#
diff --git a/mysql-test/include/check_windows_admin.inc b/mysql-test/include/check_windows_admin.inc
new file mode 100644
index 00000000000..44a8b71a19f
--- /dev/null
+++ b/mysql-test/include/check_windows_admin.inc
@@ -0,0 +1,3 @@
+# Check if current user is Windows admin
+# Used for testing services with mysql_install_db.exe
+# Actual value is set by suite.pm
diff --git a/mysql-test/include/ctype_ascii_order.inc b/mysql-test/include/ctype_ascii_order.inc
index 93127a7195f..b85cab687ae 100644
--- a/mysql-test/include/ctype_ascii_order.inc
+++ b/mysql-test/include/ctype_ascii_order.inc
@@ -4,11 +4,16 @@ drop table if exists t1;
create table t1 select repeat('a',10) as c1;
delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
-SELECT GROUP_CONCAT(c1 ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM t1 GROUP BY c1;
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
drop table t1;
+drop view v1;
diff --git a/mysql-test/include/ctype_unicode_allchars.inc b/mysql-test/include/ctype_unicode_allchars.inc
new file mode 100644
index 00000000000..1f0670bdc09
--- /dev/null
+++ b/mysql-test/include/ctype_unicode_allchars.inc
@@ -0,0 +1,23 @@
+#
+# Make a table with all Unicode characters
+# in the range U+0000 .. U+10FFFF
+#
+
+CREATE TABLE allchars AS SELECT 1 AS code, ' ' AS str LIMIT 0;
+SHOW CREATE TABLE allchars;
+
+CREATE TABLE t1tmp (a INT NOT NULL);
+DELIMITER $$;
+FOR i IN 0..0xFFF
+DO
+ INSERT INTO t1tmp VALUES (i);
+END FOR;
+$$
+DELIMITER ;$$
+INSERT INTO allchars SELECT
+ t1.a*0x1000+t2.a,
+ CHAR(t1.a*0x1000+t2.a USING utf32)
+FROM t1tmp t1, t1tmp t2
+WHERE t1.a BETWEEN 0 AND 0x10F;
+DROP TABLE t1tmp;
+SELECT COUNT(*) FROM allchars;
diff --git a/mysql-test/include/ctype_unicode_casefold_bmp.inc b/mysql-test/include/ctype_unicode_casefold_bmp.inc
new file mode 100644
index 00000000000..e5b16b9334e
--- /dev/null
+++ b/mysql-test/include/ctype_unicode_casefold_bmp.inc
@@ -0,0 +1,23 @@
+--source include/have_utf32.inc
+--source include/have_ucs2.inc
+--source include/have_sequence.inc
+
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+
+SELECT
+ codepoint_hex4,
+ HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+ HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+
+DROP VIEW v_bmp;
diff --git a/mysql-test/include/ctype_unicode_casefold_supplementary.inc b/mysql-test/include/ctype_unicode_casefold_supplementary.inc
new file mode 100644
index 00000000000..bb603118db6
--- /dev/null
+++ b/mysql-test/include/ctype_unicode_casefold_supplementary.inc
@@ -0,0 +1,22 @@
+--source include/have_utf32.inc
+--source include/have_sequence.inc
+
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_supplementary AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),8,''0'') AS codepoint_hex8,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_65536_to_1114111', @@character_set_connection, @@collation_connection);
+
+SELECT COLLATION(c) FROM v_supplementary LIMIT 1;
+
+SELECT
+ codepoint_hex8,
+ HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)),
+ HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
+FROM v_supplementary
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+
+DROP VIEW v_supplementary;
diff --git a/mysql-test/include/ctype_unicode_ws_bmp.inc b/mysql-test/include/ctype_unicode_ws_bmp.inc
new file mode 100644
index 00000000000..31166b5d31a
--- /dev/null
+++ b/mysql-test/include/ctype_unicode_ws_bmp.inc
@@ -0,0 +1,26 @@
+--source include/have_utf32.inc
+--source include/have_sequence.inc
+
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+
+SELECT HEX(codepoint) FROM v_bmp WHERE HEX(WEIGHT_STRING(c))='FFFD';
+
+SELECT
+ SUM(codepoint_hex4=HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_codepoint,
+ SUM(codepoint_hex4<>HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_not_codepoint
+FROM v_bmp;
+
+SELECT codepoint_hex4,HEX(WEIGHT_STRING(c))
+FROM v_bmp
+WHERE codepoint_hex4<>HEX(WEIGHT_STRING(c));
+
+DROP VIEW v_bmp;
diff --git a/mysql-test/include/ctype_unicode_ws_supplementary.inc b/mysql-test/include/ctype_unicode_ws_supplementary.inc
new file mode 100644
index 00000000000..82273e8fb6a
--- /dev/null
+++ b/mysql-test/include/ctype_unicode_ws_supplementary.inc
@@ -0,0 +1,19 @@
+--source include/have_utf32.inc
+--source include/have_sequence.inc
+
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_supplementary AS
+SELECT
+ seq AS codepoint,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_65536_to_1114111', @@character_set_connection, @@collation_connection);
+
+SELECT COLLATION(c) FROM v_supplementary LIMIT 1;
+
+SELECT
+ SUM(HEX(WEIGHT_STRING(c))<>'FFFD'),
+ SUM(HEX(WEIGHT_STRING(c))='FFFD')
+FROM v_supplementary;
+
+DROP VIEW v_supplementary;
diff --git a/mysql-test/include/default_mysqld.cnf b/mysql-test/include/default_mysqld.cnf
index 4788fbb7ff6..89d0d779627 100644
--- a/mysql-test/include/default_mysqld.cnf
+++ b/mysql-test/include/default_mysqld.cnf
@@ -52,7 +52,7 @@ loose-innodb_buffer_pool_size= 8M
loose-innodb_lru_scan_depth= 100
loose-innodb_write_io_threads= 2
loose-innodb_read_io_threads= 2
-loose-innodb_log_buffer_size= 1M
+loose-innodb_log_buffer_size= 2M
loose-innodb_log_file_size= 10M
slave-net-timeout=120
@@ -118,6 +118,7 @@ binlog-direct-non-transactional-updates
default-storage-engine=myisam
use_stat_tables=preferably
+histogram_type=json_hb
loose-ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem
loose-ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/server-cert.pem
diff --git a/mysql-test/include/gis_generic.inc b/mysql-test/include/gis_generic.inc
index 8209240614e..c693b86b896 100644
--- a/mysql-test/include/gis_generic.inc
+++ b/mysql-test/include/gis_generic.inc
@@ -180,9 +180,9 @@ insert IGNORE into t1 (a) values ('Garbage');
drop table t1;
create table t1 (pk integer primary key auto_increment, fl geometry not null);
---error 1416
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
insert into t1 (fl) values (1);
---error 1416
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
insert into t1 (fl) values (1.11);
--error 1416
insert into t1 (fl) values ("qwerty");
diff --git a/mysql-test/include/histogram_replaces.inc b/mysql-test/include/histogram_replaces.inc
new file mode 100644
index 00000000000..4cea1b05709
--- /dev/null
+++ b/mysql-test/include/histogram_replaces.inc
@@ -0,0 +1 @@
+--source include/json_hb_histogram.inc
diff --git a/mysql-test/include/json_hb_histogram.inc b/mysql-test/include/json_hb_histogram.inc
new file mode 100644
index 00000000000..0820fb5fccb
--- /dev/null
+++ b/mysql-test/include/json_hb_histogram.inc
@@ -0,0 +1,3 @@
+# Remove non-deterministic parts of JSON_HB histogram
+
+--replace_regex /("(collected_at|collected_by)": )"[^"]*"/\1"REPLACED"/
diff --git a/mysql-test/include/lcase_names.combinations b/mysql-test/include/lcase_names.combinations
new file mode 100644
index 00000000000..7fd344eab3f
--- /dev/null
+++ b/mysql-test/include/lcase_names.combinations
@@ -0,0 +1,5 @@
+[lcase_def]
+[lcase1]
+lower_case_table_names=1
+[lcase2]
+lower_case_table_names=2
diff --git a/mysql-test/include/lcase_names.inc b/mysql-test/include/lcase_names.inc
new file mode 100644
index 00000000000..983e2678d29
--- /dev/null
+++ b/mysql-test/include/lcase_names.inc
@@ -0,0 +1,2 @@
+# The goal of including this file is to test with different
+# lower_case_table_names modes (see include/lcase_name.combinations)
diff --git a/mysql-test/include/mtr_check.sql b/mysql-test/include/mtr_check.sql
index b330ff448a4..5d73d1f59f1 100644
--- a/mysql-test/include/mtr_check.sql
+++ b/mysql-test/include/mtr_check.sql
@@ -99,7 +99,8 @@ BEGIN
mysql.global_priv;
-- verify that no plugin changed its disabled/enabled state
- SELECT * FROM INFORMATION_SCHEMA.PLUGINS;
+ SELECT * FROM INFORMATION_SCHEMA.PLUGINS
+ WHERE PLUGIN_STATUS != 'INACTIVE';
select * from information_schema.session_variables
where variable_name = 'debug_sync';
diff --git a/mysql-test/include/mtr_warnings.sql b/mysql-test/include/mtr_warnings.sql
index 82c7aa8cd75..d02f504a32d 100644
--- a/mysql-test/include/mtr_warnings.sql
+++ b/mysql-test/include/mtr_warnings.sql
@@ -105,7 +105,6 @@ INSERT INTO global_suppressions VALUES
*/
("Got error [0-9]* when reading table"),
- ("Incorrect definition of table"),
("Incorrect information in file"),
("InnoDB: Warning: we did not need to do crash recovery"),
/*("Invalid \\(old\\?\\) table or database name"),*/
diff --git a/mysql-test/include/no_utf8_cli.inc b/mysql-test/include/no_utf8_cli.inc
new file mode 100644
index 00000000000..19f9aa6df42
--- /dev/null
+++ b/mysql-test/include/no_utf8_cli.inc
@@ -0,0 +1,3 @@
+# Check if utf8 can't be used on the command line for --exec
+# The real check is done in the suite.pm
+#
diff --git a/mysql-test/include/show_binlog_events2.inc b/mysql-test/include/show_binlog_events2.inc
index 84c62cced66..69391ff8fa2 100644
--- a/mysql-test/include/show_binlog_events2.inc
+++ b/mysql-test/include/show_binlog_events2.inc
@@ -1,3 +1,25 @@
+# ==== Purpose ====
+#
+# A lighter version of show_binlog_event.inc, with the same purpose
+# to execute SHOW BINLOG EVENTS and mask non-deterministic output.
+#
+#
+# Parameters:
+#
+# $binlog_file
+# Filename for the 'IN' clause of SHOW BINLOG EVENTS. If none
+# given, no argument is given to SHOW BINLOG EVENTS, meaning that
+# it uses the first binlog. If you set this to "LAST", it prints
+# the last binlog (according to SHOW MASTER STATUS).
+#
+# $binlog_start
+# Position for the 'FROM' clause of SHOW BINLOG EVENTS. If none
+# given, starts right after the Binlog_checkpoint_log_even.
+#
+# $regexp_replace
+# A user's custom addon to standard preexisting list.
+#
+
if ($binlog_start)
{
--let $_binlog_start=$binlog_start
@@ -13,5 +35,5 @@ if ($binlog_file)
--let $_from_binlog_start=from $_binlog_start
--replace_result "$_from_binlog_start" "from <binlog_start>" $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--replace_column 2 # 5 #
---replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /file_id=[0-9]+/file_id=#/ /GTID [0-9]+-[0-9]+-[0-9]+/GTID #-#-#/
+--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /file_id=[0-9]+/file_id=#/ /GTID [0-9]+-[0-9]+-[0-9]+/GTID #-#-#/ $replace_regexp
--eval show binlog events $_in_binlog_file from $_binlog_start
diff --git a/mysql-test/include/show_events.inc b/mysql-test/include/show_events.inc
index 7f35fc6c433..9df12b2304b 100644
--- a/mysql-test/include/show_events.inc
+++ b/mysql-test/include/show_events.inc
@@ -107,6 +107,8 @@ let $script=
s{block_len=[0-9]+}{block_len=#};
s{Server ver:.*DOLLAR}{SERVER_VERSION, BINLOG_VERSION};
s{GTID [0-9]+-[0-9]+-[0-9]+}{GTID #-#-#};
+ s{COMMIT ALTER id=[0-9]+}{COMMIT ALTER id=#};
+ s{ROLLBACK ALTER id=[0-9]+}{ROLLBACK ALTER id=#};
s{\[([0-9]-[0-9]-[0-9]+,?)+\]}{[#-#-#]};
s{cid=[0-9]+}{cid=#};
s{SQL_LOAD-[a-z,0-9,-]*.[a-z]*}{SQL_LOAD-<SERVER UUID>-<MASTER server-id>-<file-id>.<extension>};
diff --git a/mysql-test/include/show_slave_status.inc b/mysql-test/include/show_slave_status.inc
index ba2e1b0c48a..429ed8a5abd 100644
--- a/mysql-test/include/show_slave_status.inc
+++ b/mysql-test/include/show_slave_status.inc
@@ -102,6 +102,10 @@ if ($all_slaves_status)
if ($slave_name)
{
--let $_show_query=SHOW SLAVE $slave_name STATUS
+ if ($for_channel)
+ {
+ --let $_show_query=SHOW SLAVE STATUS for channel $slave_name
+ }
}
diff --git a/mysql-test/include/type_mix_incompatible.inc b/mysql-test/include/type_mix_incompatible.inc
new file mode 100644
index 00000000000..92a75be6e81
--- /dev/null
+++ b/mysql-test/include/type_mix_incompatible.inc
@@ -0,0 +1,252 @@
+--echo # Start of type_store_assignment_incompatible.inc
+
+--disable_abort_on_error
+
+SET @sql_mode_save= @@sql_mode;
+
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+ WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+ WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+
+# 'IGNORE' -> ' IGNORE'
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ ELSE @ignore
+ END;
+
+let $source_type= `(SELECT @source_type)`;
+let $target_type= `(SELECT @target_type)`;
+let $ignore=`(SELECT @ignore)`;
+
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+
+#
+# Single row INSERT..VALUES
+#
+
+CREATE TABLE t3 LIKE t2;
+eval INSERT$ignore INTO t3 VALUES
+ (1,
+ (SELECT source FROM t2 ORDER BY id LIMIT 1),
+ (SELECT source FROM t2 ORDER BY id LIMIT 1));
+DROP TABLE t3;
+
+#
+# Multi-row INSERT..VALUES
+#
+
+# INSERT .. VALUES checks assignment compatibility for the first row only.
+# Here the first row is compatible, so no error happens.
+# The second row is not compatible. It works according to the
+# current sql_mode and the table transaction ability, so it can:
+# (a) either raise a warning
+# (b) or escalate a warning to an error and abort on the current row
+# (c) or escalate a warning to an error and rollback
+# Here we test (a) and (b).
+
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+ CONCAT('CREATE VIEW v3 AS SELECT id,',
+ IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+ IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+ ' FROM t3');
+
+eval INSERT$ignore INTO t3 VALUES
+ (1,
+ (SELECT target FROM t2 ORDER BY id LIMIT 1),
+ (SELECT source FROM t2 ORDER BY id LIMIT 1)),
+ (2,
+ (SELECT source FROM t2 ORDER BY id LIMIT 1),
+ (SELECT source FROM t2 ORDER BY id LIMIT 1));
+SELECT * FROM v3;
+TRUNCATE TABLE t3;
+
+SET sql_mode=STRICT_ALL_TABLES;
+eval INSERT$ignore INTO t3 VALUES
+ (1,
+ (SELECT target FROM t2 ORDER BY id LIMIT 1),
+ (SELECT source FROM t2 ORDER BY id LIMIT 1)),
+ (2,
+ (SELECT source FROM t2 ORDER BY id LIMIT 1),
+ (SELECT source FROM t2 ORDER BY id LIMIT 1));
+SELECT * FROM v3;
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+
+#
+# INSERT .. SELECT
+#
+
+CREATE TABLE t3 LIKE t2;
+eval INSERT$ignore INTO t3 SELECT id,source,source FROM t2;
+
+eval INSERT$ignore INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+
+#
+# INSERT .. VALUES .. ON DUPLICATE KEY UPDATE target=source
+#
+
+eval INSERT$ignore INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+
+eval INSERT$ignore INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+
+#
+# INSERT .. SELECT .. ON DUPLICATE KEY UPDATE target=source
+#
+
+eval INSERT$ignore INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+
+eval INSERT$ignore INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+
+
+#
+# UPDATE
+#
+eval UPDATE$ignore t3 SET target=source;
+
+
+#
+# UPDATE, multi-table
+#
+
+eval UPDATE$ignore t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+
+
+#
+# ALTER
+#
+
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+EXECUTE IMMEDIATE @alter;
+
+
+DROP TABLE t3;
+DROP TABLE t2;
+
+#
+# MDEV-28963 Incompatible data type assignment through SP vars is not consistent with columns
+#
+
+#
+# SP local variables
+#
+DELIMITER $$;
+eval CREATE PROCEDURE p1()
+BEGIN
+ DECLARE src $source_type DEFAULT NULL;
+ DECLARE dst $target_type DEFAULT NULL;
+ SET dst=src;
+END;
+$$
+DELIMITER ;$$
+CALL p1;
+DROP PROCEDURE p1;
+
+#
+# SP IN parameters
+#
+
+--eval CREATE FUNCTION f1(a $target_type) RETURNS INT RETURN NULL;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+DROP FUNCTION f1;
+
+--eval CREATE PROCEDURE p1(a $target_type) BEGIN END;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+DROP PROCEDURE p1;
+
+#
+# SP OUT parameters
+#
+
+DELIMITER $$;
+eval CREATE PROCEDURE p1(OUT dst $target_type)
+BEGIN
+ DECLARE src $source_type DEFAULT NULL;
+ SET dst=src;
+END;
+$$
+eval CREATE PROCEDURE p2()
+BEGIN
+ DECLARE dst $target_type DEFAULT NULL;
+ CALL p1(dst);
+END;
+$$
+DELIMITER ;$$
+CALL p2();
+SHOW WARNINGS;
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+
+
+#
+# SF RETURN
+#
+
+DELIMITER $$;
+eval CREATE FUNCTION f1() RETURNS $target_type
+BEGIN
+ DECLARE rc $source_type DEFAULT NULL;
+ RETURN rc;
+END;
+$$
+DELIMITER ;$$
+SELECT f1();
+DROP FUNCTION f1;
+
+#
+# Cursor IN parameters
+#
+
+DELIMITER $$;
+eval CREATE PROCEDURE p1()
+BEGIN
+ DECLARE src $source_type DEFAULT NULL;
+ DECLARE cur1 CURSOR(t $target_type) FOR SELECT * FROM t1 WHERE target=t;
+ OPEN cur1(src);
+ CLOSE cur1;
+END;
+$$
+DELIMITER ;$$
+CALL p1();
+DROP PROCEDURE p1;
+
+#
+# FETCH
+#
+
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+
+DELIMITER $$;
+eval CREATE PROCEDURE p1()
+BEGIN
+ DECLARE dst $target_type DEFAULT NULL;
+ DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+ OPEN cur2;
+ FETCH cur2 INTO dst;
+ CLOSE cur2;
+END;
+$$
+DELIMITER ;$$
+CALL p1();
+DROP PROCEDURE p1;
+
+DROP TABLE t2;
+
+--enable_abort_on_error
+
+--echo # End of type_store_assignment_incompatible.inc
diff --git a/mysql-test/include/wait_for_sql_thread_read_all.inc b/mysql-test/include/wait_for_sql_thread_read_all.inc
index 1bbb006f3a8..1829591c5d1 100644
--- a/mysql-test/include/wait_for_sql_thread_read_all.inc
+++ b/mysql-test/include/wait_for_sql_thread_read_all.inc
@@ -1,6 +1,12 @@
+# This script ensures that a slave has executed everything in the relay log
+# files. This can be used to ensure slave is in a predicate place after
+# a FLUSH RELAY LOGS command.
+# Note that this script does not guarantee that the slave has read everything
+# from the master(s). If this is needed on should use the sync_with_master
+# command or the sync_with_master script.
+
--let $show_statement = show all slaves status
--let $field = Slave_SQL_State
--let $condition = = 'Slave has read all relay log; waiting for more updates'
--let $wait_for_all = 1
--source include/wait_show_condition.inc
-
diff --git a/mysql-test/main/alter_table.result b/mysql-test/main/alter_table.result
index 21998597cad..879bc0edfec 100644
--- a/mysql-test/main/alter_table.result
+++ b/mysql-test/main/alter_table.result
@@ -3093,3 +3093,18 @@ drop table t1;
#
# End of 10.5 tests
#
+#
+# MDEV-26767 Server crashes when rename table and alter storage engine
+#
+alter table txxx engine=innodb, rename to tyyy;
+ERROR 42S02: Table 'test.txxx' doesn't exist
+#
+# MDEV-27048 UBSAN: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
+#
+CREATE TABLE t (a INT,b INT,c INT,x TEXT,y TEXT,z TEXT,id INT UNSIGNED AUTO_INCREMENT,i INT,KEY(id),UNIQUE KEY a (a,b,c));
+ALTER TABLE t ADD CONSTRAINT test UNIQUE (id) USING HASH;
+ERROR HY000: Function or expression 'AUTO_INCREMENT' cannot be used in the USING HASH clause of `id`
+DROP TABLE t;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/alter_table.test b/mysql-test/main/alter_table.test
index 2867fc74f03..f6e9bfe1126 100644
--- a/mysql-test/main/alter_table.test
+++ b/mysql-test/main/alter_table.test
@@ -1968,7 +1968,7 @@ show create table t1;
drop table t1;
create table t1 (a int, b int, c int, unique(a,b));
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop column a;
alter table t1 drop column a, drop index a;
show create table t1;
@@ -2382,3 +2382,21 @@ drop table t1;
--echo #
--echo # End of 10.5 tests
--echo #
+
+--echo #
+--echo # MDEV-26767 Server crashes when rename table and alter storage engine
+--echo #
+--error ER_NO_SUCH_TABLE
+alter table txxx engine=innodb, rename to tyyy;
+
+--echo #
+--echo # MDEV-27048 UBSAN: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
+--echo #
+CREATE TABLE t (a INT,b INT,c INT,x TEXT,y TEXT,z TEXT,id INT UNSIGNED AUTO_INCREMENT,i INT,KEY(id),UNIQUE KEY a (a,b,c));
+--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED
+ALTER TABLE t ADD CONSTRAINT test UNIQUE (id) USING HASH;
+DROP TABLE t;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/alter_table_combinations.result b/mysql-test/main/alter_table_combinations.result
index e050fe6655d..cd47c78d404 100644
--- a/mysql-test/main/alter_table_combinations.result
+++ b/mysql-test/main/alter_table_combinations.result
@@ -226,7 +226,7 @@ Warning 1356 View 'test.v1' references invalid table(s) or column(s) or function
SELECT * FROM v1;
ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
UPDATE t2 SET f = f + 10;
-ERROR 42S22: Unknown column 'd' in 'OLD'
+ERROR 42S22: Unknown column 'd' in 'NEW'
CALL sp1();
ERROR 42S22: Unknown column 'd' in 'field list'
DROP TRIGGER trg1;
diff --git a/mysql-test/main/analyze_format_json.result b/mysql-test/main/analyze_format_json.result
index fc643d1a8af..6c9b8ce2982 100644
--- a/mysql-test/main/analyze_format_json.result
+++ b/mysql-test/main/analyze_format_json.result
@@ -9,18 +9,22 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 30,
- "attached_condition": "t0.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 30,
+ "attached_condition": "t0.a < 3"
+ }
+ }
+ ]
}
}
create table t1 (a int, b int, c int, key(a));
@@ -38,32 +42,38 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 0,
- "attached_condition": "t0.a > 9 and t0.a is not null"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t0.a"],
- "r_loops": 0,
- "rows": 1,
- "r_rows": null,
- "filtered": 100,
- "r_filtered": null
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 0,
+ "attached_condition": "t0.a > 9 and t0.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t0.a"],
+ "r_loops": 0,
+ "rows": 1,
+ "r_rows": null,
+ "filtered": 100,
+ "r_filtered": null
+ }
+ }
+ ]
}
}
analyze
@@ -79,35 +89,41 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "t0.a is not null"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t0.a"],
- "r_loops": 10,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 40,
- "attached_condition": "t1.b < 4"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "t0.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t0.a"],
+ "r_loops": 10,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 40,
+ "attached_condition": "t1.b < 4"
+ }
+ }
+ ]
}
}
analyze
@@ -123,36 +139,42 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "tbl1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 100,
- "r_rows": 100,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 20,
- "attached_condition": "tbl1.b < 20"
- },
- "block-nl-join": {
- "table": {
- "table_name": "tbl2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 100,
- "r_rows": 100,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 60,
- "attached_condition": "tbl2.b < 60"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tbl1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 100,
+ "r_rows": 100,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 20,
+ "attached_condition": "tbl1.b < 20"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "1Kb",
- "join_type": "BNL",
- "r_filtered": 100
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "tbl2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 100,
+ "r_rows": 100,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 60,
+ "attached_condition": "tbl2.b < 60"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "1Kb",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
analyze format=json
@@ -163,37 +185,43 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "tbl1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 100,
- "r_rows": 100,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 20,
- "attached_condition": "tbl1.b < 20"
- },
- "block-nl-join": {
- "table": {
- "table_name": "tbl2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 100,
- "r_rows": 100,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 60,
- "attached_condition": "tbl2.b < 60"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tbl1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 100,
+ "r_rows": 100,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 20,
+ "attached_condition": "tbl1.b < 20"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "1Kb",
- "join_type": "BNL",
- "attached_condition": "tbl1.c > tbl2.c",
- "r_filtered": 15.83333333
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "tbl2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 100,
+ "r_rows": 100,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 60,
+ "attached_condition": "tbl2.b < 60"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "1Kb",
+ "join_type": "BNL",
+ "attached_condition": "tbl1.c > tbl2.c",
+ "r_filtered": 15.83333333
+ }
+ }
+ ]
}
}
drop table t1;
@@ -212,35 +240,41 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "t1.a is not null"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t1.a"],
- "r_loops": 10,
- "rows": 2,
- "r_rows": 0.2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "using_index": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.a"],
+ "r_loops": 10,
+ "rows": 2,
+ "r_rows": 0.2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "using_index": true
+ }
+ }
+ ]
}
}
drop table t1,t2;
@@ -264,18 +298,22 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 50,
- "attached_condition": "test.t1.a < 5"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 50,
+ "attached_condition": "test.t1.a < 5"
+ }
+ }
+ ]
}
}
disconnect con1;
@@ -318,23 +356,27 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk"],
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 50,
- "index_condition": "t1.pk < 10",
- "attached_condition": "t1.b > 4"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk"],
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 50,
+ "index_condition": "t1.pk < 10",
+ "attached_condition": "t1.b > 4"
+ }
+ }
+ ]
}
}
analyze format=json
@@ -388,42 +430,48 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 5,
- "r_rows": 5,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "range-checked-for-each-record": {
- "keys": ["key1", "key2", "key3", "key4"],
- "r_keys": {
- "full_scan": 1,
- "index_merge": 1,
- "range": {
- "key1": 2,
- "key2": 1,
- "key3": 0,
- "key4": 0
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 5,
+ "r_rows": 5,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
}
},
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["key1", "key2", "key3", "key4"],
- "r_loops": 5,
- "rows": 1010,
- "r_rows": 203.8,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 98.13542689
+ {
+ "range-checked-for-each-record": {
+ "keys": ["key1", "key2", "key3", "key4"],
+ "r_keys": {
+ "full_scan": 1,
+ "index_merge": 1,
+ "range": {
+ "key1": 2,
+ "key2": 1,
+ "key3": 0,
+ "key4": 0
+ }
+ },
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["key1", "key2", "key3", "key4"],
+ "r_loops": 5,
+ "rows": 1010,
+ "r_rows": 203.8,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 98.13542689
+ }
+ }
}
- }
+ ]
}
}
drop table t1,t2,t3,t4;
@@ -449,18 +497,22 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "tbl1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 50,
- "attached_condition": "tbl1.a < 5"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tbl1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 50,
+ "attached_condition": "tbl1.a < 5"
+ }
+ }
+ ]
}
},
{
@@ -469,18 +521,22 @@ ANALYZE
"operation": "UNION",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "tbl2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 20,
- "attached_condition": "tbl2.a in (2,3)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tbl2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 20,
+ "attached_condition": "tbl2.a in (2,3)"
+ }
+ }
+ ]
}
}
]
@@ -519,17 +575,21 @@ ANALYZE
"r_buffer_size": "REPLACED",
"r_sort_mode": "sort_key,rowid",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 256,
- "r_rows": 256,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 256,
+ "r_rows": 256,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -551,17 +611,21 @@ ANALYZE
"r_buffer_size": "REPLACED",
"r_sort_mode": "sort_key,rowid",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 256,
- "r_rows": 256,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 256,
+ "r_rows": 256,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -594,17 +658,21 @@ ANALYZE
"r_buffer_size": "REPLACED",
"r_sort_mode": "sort_key,rowid",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 256,
- "r_rows": 256,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 256,
+ "r_rows": 256,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -624,44 +692,24 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 0,
- "attached_condition": "<in_optimizer>(t2.b,t2.b in (subquery#2))"
- },
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL",
- "attached_condition": "<in_optimizer>(t2.b,t2.b in (subquery#2))",
- "r_filtered": null
- },
- "subqueries": [
+ "nested_loop": [
{
- "query_block": {
- "select_id": 2,
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
"r_loops": 1,
- "r_total_time_ms": "REPLACED",
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
"table": {
- "table_name": "t1",
+ "table_name": "t2",
"access_type": "ALL",
"r_loops": 1,
"rows": 2,
@@ -669,8 +717,38 @@ ANALYZE
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"filtered": 100,
- "r_filtered": 100
- }
+ "r_filtered": 0,
+ "attached_condition": "<in_optimizer>(t2.b,t2.b in (subquery#2))"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL",
+ "attached_condition": "<in_optimizer>(t2.b,t2.b in (subquery#2))",
+ "r_filtered": null
+ }
+ }
+ ],
+ "subqueries": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -715,35 +793,41 @@ ANALYZE
"r_buffer_size": "REPLACED",
"r_sort_mode": "sort_key,rowid",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 0,
- "attached_condition": "t3.f3 in (1,2)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "1",
- "join_type": "BNL",
- "r_filtered": null
- },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 0,
+ "attached_condition": "t3.f3 in (1,2)"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "1",
+ "join_type": "BNL",
+ "r_filtered": null
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
@@ -751,31 +835,37 @@ ANALYZE
"r_loops": 0,
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 0,
- "rows": 2,
- "r_rows": null,
- "filtered": 100,
- "r_filtered": null
- },
- "block-nl-join": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 0,
- "rows": 2,
- "r_rows": null,
- "filtered": 100,
- "r_filtered": null
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 0,
+ "rows": 2,
+ "r_rows": null,
+ "filtered": 100,
+ "r_filtered": null
+ }
},
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL",
- "attached_condition": "t2.f2 = t3.f3",
- "r_filtered": null
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 0,
+ "rows": 2,
+ "r_rows": null,
+ "filtered": 100,
+ "r_filtered": null
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL",
+ "attached_condition": "t2.f2 = t3.f3",
+ "r_filtered": null
+ }
+ }
+ ]
}
}
}
@@ -802,18 +892,22 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 0,
- "attached_condition": "t1.a < 0"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 0,
+ "attached_condition": "t1.a < 0"
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
@@ -821,27 +915,31 @@ ANALYZE
"r_loops": 0,
"query_block": {
"select_id": 2,
- "read_sorted_file": {
- "r_rows": null,
- "filesort": {
- "sort_key": "t2.c",
- "r_loops": null,
- "r_limit": null,
- "r_used_priority_queue": null,
- "r_output_rows": null,
- "r_sort_mode": "sort_key,rowid",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 0,
- "rows": 10,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": null,
- "filtered": 100,
- "r_filtered": null,
- "attached_condition": "t2.a < t1.a"
+ "filesort": {
+ "sort_key": "t2.c",
+ "r_loops": null,
+ "r_limit": null,
+ "r_used_priority_queue": null,
+ "r_output_rows": null,
+ "r_sort_mode": "sort_key,rowid",
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 0,
+ "rows": 10,
+ "r_rows": null,
+ "filtered": 100,
+ "r_filtered": null,
+ "attached_condition": "t2.a < t1.a"
+ }
+ }
}
}
- }
+ ]
}
}
}
diff --git a/mysql-test/main/analyze_stmt_orderby.result b/mysql-test/main/analyze_stmt_orderby.result
index 11736c47a49..d4d0fe6b25b 100644
--- a/mysql-test/main/analyze_stmt_orderby.result
+++ b/mysql-test/main/analyze_stmt_orderby.result
@@ -176,24 +176,30 @@ EXPLAIN
"filesort": {
"sort_key": "t2.b",
"temporary_table": {
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t0.a is not null"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t0.a"],
- "rows": 1,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t0.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t0.a"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -215,34 +221,40 @@ ANALYZE
"r_output_rows": 4,
"r_sort_mode": "sort_key,rowid",
"temporary_table": {
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "t0.a is not null"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t0.a"],
- "r_loops": 10,
- "rows": 1,
- "r_rows": 0.4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "t0.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t0.a"],
+ "r_loops": 10,
+ "rows": 1,
+ "r_rows": 0.4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -261,29 +273,35 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "read_sorted_file": {
- "filesort": {
- "sort_key": "t0.a",
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "t0.a",
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t0.a is not null"
+ }
+ }
+ }
+ },
+ {
"table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t0.a is not null"
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t0.a"],
+ "rows": 1,
+ "filtered": 100
}
}
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t0.a"],
- "rows": 1,
- "filtered": 100
- }
+ ]
}
}
analyze format=json
@@ -294,46 +312,52 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 10,
- "filesort": {
- "sort_key": "t0.a",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 10,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "sort_key,addon_fields",
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 10,
+ "filesort": {
+ "sort_key": "t0.a",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 10,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "sort_key,addon_fields",
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "t0.a is not null"
+ }
+ }
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t0.a"],
+ "r_loops": 10,
+ "rows": 1,
+ "r_rows": 0.4,
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"filtered": 100,
- "r_filtered": 100,
- "attached_condition": "t0.a is not null"
+ "r_filtered": 100
}
}
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t0.a"],
- "r_loops": 10,
- "rows": 1,
- "r_rows": 0.4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ ]
}
}
drop table t2;
@@ -365,18 +389,22 @@ ANALYZE
"r_buffer_size": "REPLACED",
"r_sort_mode": "sort_key,rowid",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 1000,
- "r_rows": 1000,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 50,
- "attached_condition": "t2.a MOD 2 = 0"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 1000,
+ "r_rows": 1000,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 50,
+ "attached_condition": "t2.a MOD 2 = 0"
+ }
+ }
+ ]
}
}
}
@@ -414,35 +442,41 @@ ANALYZE
"r_total_time_ms": "REPLACED",
"duplicate_removal": {
"temporary_table": {
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL",
- "attached_condition": "t3.a = t0.a",
- "r_filtered": 10
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL",
+ "attached_condition": "t3.a = t0.a",
+ "r_filtered": 10
+ }
+ }
+ ]
}
}
}
@@ -488,36 +522,42 @@ ANALYZE
"r_buffer_size": "REPLACED",
"r_sort_mode": "sort_key,rowid",
"temporary_table": {
- "table": {
- "table_name": "t6",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 5,
- "r_rows": 5,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 80,
- "attached_condition": "t6.b > 0 and t6.a <= 5"
- },
- "block-nl-join": {
- "table": {
- "table_name": "t5",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 7,
- "r_rows": 7,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t6",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 5,
+ "r_rows": 5,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 80,
+ "attached_condition": "t6.b > 0 and t6.a <= 5"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "attached_condition": "t5.a = t6.a",
- "r_filtered": 21.42857143
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t5",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 7,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "attached_condition": "t5.a = t6.a",
+ "r_filtered": 21.42857143
+ }
+ }
+ ]
}
}
}
@@ -538,25 +578,31 @@ EXPLAIN
"filesort": {
"sort_key": "t5.a",
"temporary_table": {
- "table": {
- "table_name": "t6",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t6.b > 0 and t6.a <= 5"
- },
- "block-nl-join": {
- "table": {
- "table_name": "t5",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t6",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t6.b > 0 and t6.a <= 5"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "attached_condition": "t5.a = t6.a"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t5",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "attached_condition": "t5.a = t6.a"
+ }
+ }
+ ]
}
}
}
@@ -593,21 +639,25 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["col1"],
- "r_loops": 1,
- "rows": 7,
- "r_rows": 20,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "using_index_for_group_by": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["col1"],
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 20,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "using_index_for_group_by": true
+ }
+ }
+ ]
}
}
drop table t2;
diff --git a/mysql-test/main/assign_key_cache.result b/mysql-test/main/assign_key_cache.result
index 4ed6170136b..32d7bc2c0b8 100644
--- a/mysql-test/main/assign_key_cache.result
+++ b/mysql-test/main/assign_key_cache.result
@@ -3,7 +3,7 @@ create table t1 (i int) engine=myisam partition by hash (i) partitions 2;
xa start 'xid';
cache index t1 partition (non_existing_partition) in my_cache;
Table Op Msg_type Msg_text
-test.t1 assign_to_keycache error Error in list of partitions to test.t1
+test.t1 assign_to_keycache error Wrong partition name or partition list
cache index t1 partition (p1) in my_cache;
Table Op Msg_type Msg_text
test.t1 assign_to_keycache status OK
diff --git a/mysql-test/main/brackets.result b/mysql-test/main/brackets.result
index 5229416c035..3fd19ef968a 100644
--- a/mysql-test/main/brackets.result
+++ b/mysql-test/main/brackets.result
@@ -261,17 +261,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "read_sorted_file": {
- "filesort": {
- "sort_key": "t1.a desc",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "t1.a desc",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
(select a from t1 order by a desc) limit 1;
@@ -287,17 +291,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "read_sorted_file": {
- "filesort": {
- "sort_key": "t1.a desc",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "t1.a desc",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
(select a from t1 where a=20 union select a from t1) order by a desc limit 1;
@@ -321,25 +329,33 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.a = 20"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.a = 20"
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -367,25 +383,33 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.a = 20"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.a = 20"
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -421,30 +445,38 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "read_sorted_file": {
- "filesort": {
- "sort_key": "t1.pk",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "t1.pk",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
}
}
- }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.pk > 4"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.pk > 4"
+ }
+ }
+ ]
}
}
]
diff --git a/mysql-test/main/charset_client_win.test b/mysql-test/main/charset_client_win.test
index b4a21d4f0a4..8f3767c530f 100644
--- a/mysql-test/main/charset_client_win.test
+++ b/mysql-test/main/charset_client_win.test
@@ -1,2 +1,7 @@
--source include/windows.inc
+--source include/no_utf8_cli.inc
+if(!`select $MTR_PARALLEL = 1`)
+{
+ skip race condition with parallel builds;
+}
--exec chcp 1257 > NUL && $MYSQL --default-character-set=auto -e "select @@character_set_client"
diff --git a/mysql-test/main/charset_client_win_utf8mb4.result b/mysql-test/main/charset_client_win_utf8mb4.result
new file mode 100644
index 00000000000..9bbf751e45c
--- /dev/null
+++ b/mysql-test/main/charset_client_win_utf8mb4.result
@@ -0,0 +1,6 @@
+@@character_set_client
+utf8mb4
+ERROR 1045 (28000): Access denied for user 'u'@'localhost' (using password: YES)
+2
+2
+DROP user u;
diff --git a/mysql-test/main/charset_client_win_utf8mb4.test b/mysql-test/main/charset_client_win_utf8mb4.test
new file mode 100644
index 00000000000..e08afa250bd
--- /dev/null
+++ b/mysql-test/main/charset_client_win_utf8mb4.test
@@ -0,0 +1,22 @@
+--source include/windows.inc
+--source include/check_utf8_cli.inc
+--exec $MYSQL --default-character-set=auto -e "select @@character_set_client"
+
+# Test that a user with old, non-UTF8 password can still connect
+# by setting setting non-auto --default-character-set
+# This is important for backward compatibility
+
+# Emulate creating password in an interactive client session, with older clients
+# which communicates with the server using with something like cp850
+
+exec chcp 850 > NUL && echo CREATE USER 'u' IDENTIFIED by 'ü' | $MYSQL --default-character-set=cp850;
+
+
+# Can't connect with UTF8
+--error 1
+exec $MYSQL --default-character-set=auto --user=u --password=ü -e "select 1" 2>&1;
+
+# Can connect with tweaked --default-character-set
+exec $MYSQL --default-character-set=cp850 --user=u --password=ü -e "select 2";
+DROP user u;
+
diff --git a/mysql-test/main/count_distinct.result b/mysql-test/main/count_distinct.result
index 760b2710586..037674aa66a 100644
--- a/mysql-test/main/count_distinct.result
+++ b/mysql-test/main/count_distinct.result
@@ -1,4 +1,3 @@
-drop table if exists t1,t2,t3;
create table t1 (libname varchar(21) not null, city text, primary key (libname));
create table t2 (isbn varchar(21) not null, author text, title text, primary key (isbn));
create table t3 (isbn varchar(21) not null, libname varchar(21) not null, quantity int ,primary key (isbn,libname));
@@ -131,3 +130,16 @@ count(distinct a)
10
drop table t1;
set @@tmp_table_size = default;
+#
+# End of 5.5 tests
+#
+#
+# MDEV-26452 SIGSEGV in Item::cleanup from Item::cleanup_processor
+#
+create table t (a int,b date,primary key(a,b));
+select b,count(distinct a) from t group by b having b is null;
+b count(distinct a)
+drop table t;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/count_distinct.test b/mysql-test/main/count_distinct.test
index 86045e862e7..9f682af3d63 100644
--- a/mysql-test/main/count_distinct.test
+++ b/mysql-test/main/count_distinct.test
@@ -2,10 +2,6 @@
# Problem with count(distinct)
#
---disable_warnings
-drop table if exists t1,t2,t3;
---enable_warnings
-
create table t1 (libname varchar(21) not null, city text, primary key (libname));
create table t2 (isbn varchar(21) not null, author text, title text, primary key (isbn));
create table t3 (isbn varchar(21) not null, libname varchar(21) not null, quantity int ,primary key (isbn,libname));
@@ -149,6 +145,17 @@ select count(distinct a) from t1;
drop table t1;
set @@tmp_table_size = default;
-#
-# End of 5.5 tests
-#
+--echo #
+--echo # End of 5.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-26452 SIGSEGV in Item::cleanup from Item::cleanup_processor
+--echo #
+create table t (a int,b date,primary key(a,b));
+select b,count(distinct a) from t group by b having b is null;
+drop table t;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/create.test b/mysql-test/main/create.test
index db8638ebe54..0b9e51e8545 100644
--- a/mysql-test/main/create.test
+++ b/mysql-test/main/create.test
@@ -748,7 +748,7 @@ create table t1 select * from t1;
--error ER_CANT_AGGREGATE_2COLLATIONS
create table t1 select coalesce('a' collate latin1_swedish_ci,'b' collate latin1_bin);
# Error during table creation
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
create table t1 (primary key(a)) select "b" as b;
# Error in select_create::prepare() which is not related to table creation
create table t1 (a int);
diff --git a/mysql-test/main/cte_recursive.result b/mysql-test/main/cte_recursive.result
index dd82ef46229..de9a979dd94 100644
--- a/mysql-test/main/cte_recursive.result
+++ b/mysql-test/main/cte_recursive.result
@@ -1339,107 +1339,133 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 24,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "recursive_union": {
- "table_name": "<union4,6,5>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 4,
- "table": {
- "table_name": "folks",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "folks.`name` = 'Me2'"
- }
- }
- },
- {
- "query_block": {
- "select_id": 6,
- "operation": "UNION",
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "prev_gen.`id` < 345",
- "materialized": {
- "query_block": {
- "recursive_union": {
- "table_name": "<union3,2>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "folks",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "folks.`name` = 'Me'"
- }
- }
- },
- {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 24,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "recursive_union": {
+ "table_name": "<union4,6,5>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 4,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "folks",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "folks.`name` = 'Me2'"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 6,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "prev_gen.`id` < 345",
+ "materialized": {
"query_block": {
- "select_id": 2,
- "operation": "UNION",
- "table": {
- "table_name": "folks",
+ "recursive_union": {
+ "table_name": "<union3,2>",
"access_type": "ALL",
- "possible_keys": ["PRIMARY"],
- "rows": 12,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "686",
- "join_type": "BNL",
- "attached_condition": "prev_gen.father = folks.`id` or prev_gen.mother = folks.`id`"
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "folks",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "folks.`name` = 'Me'"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 2,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "folks",
+ "access_type": "ALL",
+ "possible_keys": ["PRIMARY"],
+ "rows": 12,
+ "filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "686",
+ "join_type": "BNL",
+ "attached_condition": "prev_gen.father = folks.`id` or prev_gen.mother = folks.`id`"
+ }
+ }
+ ]
+ }
+ }
+ ]
}
}
}
- ]
+ }
}
- }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 5,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 24,
+ "filtered": 100,
+ "attached_condition": "ancestors.`id` < 234"
+ }
+ }
+ ]
}
}
- }
- },
- {
- "query_block": {
- "select_id": 5,
- "operation": "UNION",
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 24,
- "filtered": 100,
- "attached_condition": "ancestors.`id` < 234"
- }
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
#
@@ -1473,91 +1499,111 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "recursive_union": {
- "table_name": "<union3,2>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "v",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "v.`name` = 'Me' and v.father is not null and v.mother is not null"
- },
- "table": {
- "table_name": "h",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["id"],
- "ref": ["test.v.father"],
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "w",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["id"],
- "ref": ["test.v.mother"],
- "rows": 1,
- "filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 2,
- "operation": "UNION",
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "a.father is not null and a.mother is not null"
- },
- "table": {
- "table_name": "h",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["id"],
- "ref": ["a.father"],
- "rows": 1,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "recursive_union": {
+ "table_name": "<union3,2>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "v",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "v.`name` = 'Me' and v.father is not null and v.mother is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "h",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["id"],
+ "ref": ["test.v.father"],
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "w",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["id"],
+ "ref": ["test.v.mother"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
+ }
},
- "table": {
- "table_name": "w",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["id"],
- "ref": ["a.mother"],
- "rows": 1,
- "filtered": 100
+ {
+ "query_block": {
+ "select_id": 2,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "a.father is not null and a.mother is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "h",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["id"],
+ "ref": ["a.father"],
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "w",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["id"],
+ "ref": ["a.mother"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
create table my_ancestors
@@ -1778,46 +1824,58 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "recursive_union": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t.a < 1000"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "recursive_union": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t.a < 1000"
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop table t1;
@@ -2401,57 +2459,65 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "recursive_union": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "r_loops": 0,
- "r_rows": null,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "message": "No tables used"
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "r_loops": 10,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 10,
- "rows": 2,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 90,
- "attached_condition": "src.counter < 10"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "recursive_union": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "r_loops": 0,
+ "r_rows": null,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "table": {
+ "message": "No tables used"
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "r_loops": 10,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 10,
+ "rows": 2,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 90,
+ "attached_condition": "src.counter < 10"
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
#
@@ -3799,105 +3865,121 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "t1.a1 is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "23",
- "used_key_parts": ["a2"],
- "ref": ["test.t1.a1"],
- "r_loops": 3,
- "rows": 1,
- "r_rows": 0.333333333,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "first_match": "t1",
- "materialized": {
- "query_block": {
- "recursive_union": {
- "table_name": "<union3,4>",
- "access_type": "ALL",
- "r_loops": 0,
- "r_rows": null,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 3,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "const",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "22",
- "used_key_parts": ["a2"],
- "ref": ["const"],
- "r_loops": 0,
- "rows": 1,
- "r_rows": null,
- "filtered": 100,
- "r_filtered": null,
- "using_index": true
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "UNION",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "cte.a2 is not null"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "t1.a1 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "23",
+ "used_key_parts": ["a2"],
+ "ref": ["test.t1.a1"],
+ "r_loops": 3,
+ "rows": 1,
+ "r_rows": 0.333333333,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "first_match": "t1",
+ "materialized": {
+ "query_block": {
+ "recursive_union": {
+ "table_name": "<union3,4>",
+ "access_type": "ALL",
+ "r_loops": 0,
+ "r_rows": null,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 3,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "const",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "22",
+ "used_key_parts": ["a2"],
+ "ref": ["const"],
+ "r_loops": 0,
+ "rows": 1,
+ "r_rows": null,
+ "filtered": 100,
+ "r_filtered": null,
+ "using_index": true
+ }
+ }
+ ]
+ }
},
- "table": {
- "table_name": "tt2",
- "access_type": "ref",
- "possible_keys": ["b1"],
- "key": "b1",
- "key_length": "23",
- "used_key_parts": ["b1"],
- "ref": ["cte.a2"],
- "r_loops": 1,
- "rows": 2,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "UNION",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "cte.a2 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "tt2",
+ "access_type": "ref",
+ "possible_keys": ["b1"],
+ "key": "b1",
+ "key_length": "23",
+ "used_key_parts": ["b1"],
+ "ref": ["cte.a2"],
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop function f1;
@@ -4055,83 +4137,97 @@ ANALYZE
"operation": "UNION",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "recursive_union": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "r_loops": 0,
- "r_rows": null,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "s",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "t1.c is not null"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "recursive_union": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "r_loops": 0,
+ "r_rows": null,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "s",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
},
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "9",
- "used_key_parts": ["a"],
- "ref": ["test.t1.c"],
- "r_loops": 4,
- "rows": 2,
- "r_rows": 0.5,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "9",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.c"],
+ "r_loops": 4,
+ "rows": 2,
+ "r_rows": 0.5,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
]
@@ -4193,17 +4289,21 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "tt",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tt",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
prepare stmt from "with h_cte as
diff --git a/mysql-test/main/ctype_big5.result b/mysql-test/main/ctype_big5.result
index 4aec26214df..b2abca5df7a 100644
--- a/mysql-test/main/ctype_big5.result
+++ b/mysql-test/main/ctype_big5.result
@@ -246,14 +246,53 @@ DROP TABLE t1;
drop table if exists t1;
create table t1 select repeat('a',10) as c1;
delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
-SELECT GROUP_CONCAT(c1 ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM t1 GROUP BY c1;
-GROUP_CONCAT(c1 ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 big5_chinese_ci
+name big5_chinese_ci
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
20
! 21
" 22
@@ -321,8 +360,9 @@ _ 5F
{ 7B
| 7C
} 7D
- 7F
+<7F> 7F
drop table t1;
+drop view v1;
SELECT strcmp('a','a '), strcmp('a ','a');
strcmp('a','a ') strcmp('a ','a')
0 0
@@ -479,6 +519,154 @@ a hex(b) c
3 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
4 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
DROP TABLE t1;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 big5_bin
+name big5_bin
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+A 41
+B 42
+C 43
+D 44
+E 45
+F 46
+G 47
+H 48
+I 49
+J 4A
+K 4B
+L 4C
+M 4D
+N 4E
+O 4F
+P 50
+Q 51
+R 52
+S 53
+T 54
+U 55
+V 56
+W 57
+X 58
+Y 59
+Z 5A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+a 61
+b 62
+c 63
+d 64
+e 65
+f 66
+g 67
+h 68
+i 69
+j 6A
+k 6B
+l 6C
+m 6D
+n 6E
+o 6F
+p 70
+q 71
+r 72
+s 73
+t 74
+u 75
+v 76
+w 77
+x 78
+y 79
+z 7A
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
SELECT strcmp('a','a '), strcmp('a ','a');
strcmp('a','a ') strcmp('a ','a')
0 0
diff --git a/mysql-test/main/ctype_big5.test b/mysql-test/main/ctype_big5.test
index 204c20901fd..b7d33c4fcde 100644
--- a/mysql-test/main/ctype_big5.test
+++ b/mysql-test/main/ctype_big5.test
@@ -25,6 +25,7 @@ SET collation_connection='big5_bin';
-- source include/ctype_innodb_like.inc
-- source include/ctype_like_escape.inc
-- source include/ctype_like_range_f1f2.inc
+-- source include/ctype_ascii_order.inc
-- source include/ctype_pad_space.inc
#
diff --git a/mysql-test/main/ctype_cp932.result b/mysql-test/main/ctype_cp932.result
index 08c94abf74d..47b3cbc12f8 100644
--- a/mysql-test/main/ctype_cp932.result
+++ b/mysql-test/main/ctype_cp932.result
@@ -598,6 +598,281 @@ SET DEFAULT_STORAGE_ENGINE=Default;
# End of 10.2 tests
#
#
+# General tests
+#
+SET NAMES cp932;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 cp932_japanese_ci
+name cp932_japanese_ci
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+Aa 41,61
+Bb 42,62
+Cc 43,63
+Dd 44,64
+Ee 45,65
+Ff 46,66
+Gg 47,67
+Hh 48,68
+Ii 49,69
+Jj 4A,6A
+Kk 4B,6B
+Ll 4C,6C
+Mm 4D,6D
+Nn 4E,6E
+Oo 4F,6F
+Pp 50,70
+Qq 51,71
+Rr 52,72
+Ss 53,73
+Tt 54,74
+Uu 55,75
+Vv 56,76
+Ww 57,77
+Xx 58,78
+Yy 59,79
+Zz 5A,7A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
+SET NAMES cp932 COLLATE cp932_bin;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 cp932_bin
+name cp932_bin
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+A 41
+B 42
+C 43
+D 44
+E 45
+F 46
+G 47
+H 48
+I 49
+J 4A
+K 4B
+L 4C
+M 4D
+N 4E
+O 4F
+P 50
+Q 51
+R 52
+S 53
+T 54
+U 55
+V 56
+W 57
+X 58
+Y 59
+Z 5A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+a 61
+b 62
+c 63
+d 64
+e 65
+f 66
+g 67
+h 68
+i 69
+j 6A
+k 6B
+l 6C
+m 6D
+n 6E
+o 6F
+p 70
+q 71
+r 72
+s 73
+t 74
+u 75
+v 76
+w 77
+x 78
+y 79
+z 7A
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
+#
# Start of 10.5 tests
#
#
diff --git a/mysql-test/main/ctype_cp932.test b/mysql-test/main/ctype_cp932.test
index d2ca278c739..3d0306884df 100644
--- a/mysql-test/main/ctype_cp932.test
+++ b/mysql-test/main/ctype_cp932.test
@@ -53,6 +53,15 @@ let $coll_pad='cp932_bin';
--echo #
+--echo # General tests
+--echo #
+SET NAMES cp932;
+-- source include/ctype_ascii_order.inc
+SET NAMES cp932 COLLATE cp932_bin;
+-- source include/ctype_ascii_order.inc
+
+
+--echo #
--echo # Start of 10.5 tests
--echo #
diff --git a/mysql-test/main/ctype_eucjpms.result b/mysql-test/main/ctype_eucjpms.result
index f8d7d6cea46..ea8824584d8 100644
--- a/mysql-test/main/ctype_eucjpms.result
+++ b/mysql-test/main/ctype_eucjpms.result
@@ -2,6 +2,281 @@ drop table if exists t1;
drop table if exists t2;
drop table if exists t3;
drop table if exists t4;
+#
+# General tests
+#
+SET NAMES eucjpms;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 eucjpms_japanese_ci
+name eucjpms_japanese_ci
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+Aa 41,61
+Bb 42,62
+Cc 43,63
+Dd 44,64
+Ee 45,65
+Ff 46,66
+Gg 47,67
+Hh 48,68
+Ii 49,69
+Jj 4A,6A
+Kk 4B,6B
+Ll 4C,6C
+Mm 4D,6D
+Nn 4E,6E
+Oo 4F,6F
+Pp 50,70
+Qq 51,71
+Rr 52,72
+Ss 53,73
+Tt 54,74
+Uu 55,75
+Vv 56,76
+Ww 57,77
+Xx 58,78
+Yy 59,79
+Zz 5A,7A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
+SET NAMES eucjpms COLLATE eucjpms_bin;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 eucjpms_bin
+name eucjpms_bin
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+A 41
+B 42
+C 43
+D 44
+E 45
+F 46
+G 47
+H 48
+I 49
+J 4A
+K 4B
+L 4C
+M 4D
+N 4E
+O 4F
+P 50
+Q 51
+R 52
+S 53
+T 54
+U 55
+V 56
+W 57
+X 58
+Y 59
+Z 5A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+a 61
+b 62
+c 63
+d 64
+e 65
+f 66
+g 67
+h 68
+i 69
+j 6A
+k 6B
+l 6C
+m 6D
+n 6E
+o 6F
+p 70
+q 71
+r 72
+s 73
+t 74
+u 75
+v 76
+w 77
+x 78
+y 79
+z 7A
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
set names eucjpms;
set character_set_database = eucjpms;
CREATE TABLE t1(c1 CHAR(1)) DEFAULT CHARACTER SET = eucjpms;
diff --git a/mysql-test/main/ctype_eucjpms.test b/mysql-test/main/ctype_eucjpms.test
index 1ea9eb801b0..3b54d667ecb 100644
--- a/mysql-test/main/ctype_eucjpms.test
+++ b/mysql-test/main/ctype_eucjpms.test
@@ -12,6 +12,14 @@ drop table if exists t3;
drop table if exists t4;
--enable_warnings
+--echo #
+--echo # General tests
+--echo #
+SET NAMES eucjpms;
+-- source include/ctype_ascii_order.inc
+SET NAMES eucjpms COLLATE eucjpms_bin;
+-- source include/ctype_ascii_order.inc
+
set names eucjpms;
set character_set_database = eucjpms;
diff --git a/mysql-test/main/ctype_euckr.result b/mysql-test/main/ctype_euckr.result
index cded18ff920..9e030f9cc6d 100644
--- a/mysql-test/main/ctype_euckr.result
+++ b/mysql-test/main/ctype_euckr.result
@@ -243,6 +243,128 @@ a hex(b) c
3 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
4 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
DROP TABLE t1;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 euckr_korean_ci
+name euckr_korean_ci
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+Aa 41,61
+Bb 42,62
+Cc 43,63
+Dd 44,64
+Ee 45,65
+Ff 46,66
+Gg 47,67
+Hh 48,68
+Ii 49,69
+Jj 4A,6A
+Kk 4B,6B
+Ll 4C,6C
+Mm 4D,6D
+Nn 4E,6E
+Oo 4F,6F
+Pp 50,70
+Qq 51,71
+Rr 52,72
+Ss 53,73
+Tt 54,74
+Uu 55,75
+Vv 56,76
+Ww 57,77
+Xx 58,78
+Yy 59,79
+Zz 5A,7A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
SET collation_connection='euckr_bin';
create table t1 select repeat('a',4000) a;
delete from t1;
@@ -384,6 +506,154 @@ a hex(b) c
3 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
4 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
DROP TABLE t1;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 euckr_bin
+name euckr_bin
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+A 41
+B 42
+C 43
+D 44
+E 45
+F 46
+G 47
+H 48
+I 49
+J 4A
+K 4B
+L 4C
+M 4D
+N 4E
+O 4F
+P 50
+Q 51
+R 52
+S 53
+T 54
+U 55
+V 56
+W 57
+X 58
+Y 59
+Z 5A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+a 61
+b 62
+c 63
+d 64
+e 65
+f 66
+g 67
+h 68
+i 69
+j 6A
+k 6B
+l 6C
+m 6D
+n 6E
+o 6F
+p 70
+q 71
+r 72
+s 73
+t 74
+u 75
+v 76
+w 77
+x 78
+y 79
+z 7A
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
SET NAMES euckr;
CREATE TABLE t1 (a text) character set euckr;
INSERT INTO t1 VALUES (0xA2E6),(0xFEF7);
diff --git a/mysql-test/main/ctype_euckr.test b/mysql-test/main/ctype_euckr.test
index 1154047fdb0..e4f07081dba 100644
--- a/mysql-test/main/ctype_euckr.test
+++ b/mysql-test/main/ctype_euckr.test
@@ -17,11 +17,13 @@ SET collation_connection='euckr_korean_ci';
-- source include/ctype_innodb_like.inc
-- source include/ctype_like_escape.inc
-- source include/ctype_like_range_f1f2.inc
+-- source include/ctype_ascii_order.inc
SET collation_connection='euckr_bin';
-- source include/ctype_filesort.inc
-- source include/ctype_innodb_like.inc
-- source include/ctype_like_escape.inc
-- source include/ctype_like_range_f1f2.inc
+-- source include/ctype_ascii_order.inc
#
# Bug#15377 Valid multibyte sequences are truncated on INSERT
diff --git a/mysql-test/main/ctype_gb2312.result b/mysql-test/main/ctype_gb2312.result
index adb289b5fce..163364d4bc4 100644
--- a/mysql-test/main/ctype_gb2312.result
+++ b/mysql-test/main/ctype_gb2312.result
@@ -246,14 +246,53 @@ DROP TABLE t1;
drop table if exists t1;
create table t1 select repeat('a',10) as c1;
delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
-SELECT GROUP_CONCAT(c1 ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM t1 GROUP BY c1;
-GROUP_CONCAT(c1 ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 gb2312_chinese_ci
+name gb2312_chinese_ci
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
20
! 21
" 22
@@ -322,8 +361,9 @@ _ 5F
{ 7B
| 7C
} 7D
- 7F
+<7F> 7F
drop table t1;
+drop view v1;
SET collation_connection='gb2312_bin';
create table t1 select repeat('a',4000) a;
delete from t1;
@@ -465,6 +505,154 @@ a hex(b) c
3 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
4 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
DROP TABLE t1;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 gb2312_bin
+name gb2312_bin
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+A 41
+B 42
+C 43
+D 44
+E 45
+F 46
+G 47
+H 48
+I 49
+J 4A
+K 4B
+L 4C
+M 4D
+N 4E
+O 4F
+P 50
+Q 51
+R 52
+S 53
+T 54
+U 55
+V 56
+W 57
+X 58
+Y 59
+Z 5A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+a 61
+b 62
+c 63
+d 64
+e 65
+f 66
+g 67
+h 68
+i 69
+j 6A
+k 6B
+l 6C
+m 6D
+n 6E
+o 6F
+p 70
+q 71
+r 72
+s 73
+t 74
+u 75
+v 76
+w 77
+x 78
+y 79
+z 7A
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
SET NAMES gb2312;
CREATE TABLE t1 (a text) character set gb2312;
INSERT INTO t1 VALUES (0xA2A1),(0xD7FE);
diff --git a/mysql-test/main/ctype_gb2312.test b/mysql-test/main/ctype_gb2312.test
index b9147fdc420..c2d513f1f5a 100644
--- a/mysql-test/main/ctype_gb2312.test
+++ b/mysql-test/main/ctype_gb2312.test
@@ -26,6 +26,7 @@ SET collation_connection='gb2312_bin';
-- source include/ctype_innodb_like.inc
-- source include/ctype_like_escape.inc
-- source include/ctype_like_range_f1f2.inc
+-- source include/ctype_ascii_order.inc
#
# Bug#15377 Valid multibyte sequences are truncated on INSERT
diff --git a/mysql-test/main/ctype_gbk.result b/mysql-test/main/ctype_gbk.result
index 0ed7620a177..79dede6d089 100644
--- a/mysql-test/main/ctype_gbk.result
+++ b/mysql-test/main/ctype_gbk.result
@@ -246,14 +246,53 @@ DROP TABLE t1;
drop table if exists t1;
create table t1 select repeat('a',10) as c1;
delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
-SELECT GROUP_CONCAT(c1 ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM t1 GROUP BY c1;
-GROUP_CONCAT(c1 ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 gbk_chinese_ci
+name gbk_chinese_ci
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
20
! 21
" 22
@@ -322,8 +361,9 @@ _ 5F
{ 7B
| 7C
} 7D
- 7F
+<7F> 7F
drop table t1;
+drop view v1;
SET collation_connection='gbk_bin';
create table t1 select repeat('a',4000) a;
delete from t1;
@@ -465,6 +505,154 @@ a hex(b) c
3 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
4 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
DROP TABLE t1;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 gbk_bin
+name gbk_bin
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+A 41
+B 42
+C 43
+D 44
+E 45
+F 46
+G 47
+H 48
+I 49
+J 4A
+K 4B
+L 4C
+M 4D
+N 4E
+O 4F
+P 50
+Q 51
+R 52
+S 53
+T 54
+U 55
+V 56
+W 57
+X 58
+Y 59
+Z 5A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+a 61
+b 62
+c 63
+d 64
+e 65
+f 66
+g 67
+h 68
+i 69
+j 6A
+k 6B
+l 6C
+m 6D
+n 6E
+o 6F
+p 70
+q 71
+r 72
+s 73
+t 74
+u 75
+v 76
+w 77
+x 78
+y 79
+z 7A
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
SET NAMES gbk;
CREATE TABLE t1 (a text) character set gbk;
INSERT INTO t1 VALUES (0xA3A0),(0xA1A1);
diff --git a/mysql-test/main/ctype_gbk.test b/mysql-test/main/ctype_gbk.test
index 742b0a64c98..0d9d1d8b30a 100644
--- a/mysql-test/main/ctype_gbk.test
+++ b/mysql-test/main/ctype_gbk.test
@@ -24,6 +24,7 @@ SET collation_connection='gbk_bin';
-- source include/ctype_innodb_like.inc
-- source include/ctype_like_escape.inc
-- source include/ctype_like_range_f1f2.inc
+-- source include/ctype_ascii_order.inc
#
# Bug#11987 mysql will truncate the text when
diff --git a/mysql-test/main/ctype_ldml.result b/mysql-test/main/ctype_ldml.result
index 74989a53daa..001ac2f0348 100644
--- a/mysql-test/main/ctype_ldml.result
+++ b/mysql-test/main/ctype_ldml.result
@@ -34,6 +34,9 @@ Bar +7-912-800-80-01
SELECT * FROM t1 WHERE phone='7 9 1 2 8 0 0 8 0 0 1';
name phone
Bar +7-912-800-80-01
+SELECT * FROM t1 WHERE phone='tel.79128008001';
+name phone
+Bar +7-912-800-80-01
DROP TABLE t1;
show collation like 'utf8mb3_test_ci';
Collation Charset Id Default Compiled Sortlen
@@ -3090,3 +3093,40 @@ ERROR HY000: Unknown collation: 'latin1_test_replace'
#
# End of 10.5 tests
#
+#
+# MDEV-27042 UCA: Resetting contractions to ignorable does not work well
+#
+CREATE TABLE t1 (
+phone VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_phone_ci
+);
+INSERT INTO t1 VALUES ('123');
+INSERT INTO t1 VALUES ('tel.123');
+INSERT INTO t1 VALUES ('tél.123');
+INSERT INTO t1 VALUES ('tèl.123');
+INSERT INTO t1 VALUES ('Å¥el.123');
+INSERT INTO t1 VALUES ('ťèl.123');
+INSERT INTO t1 VALUES ('tex.123');
+SELECT * FROM t1 WHERE phone='123' ORDER BY BINARY phone;
+phone
+123
+tel.123
+tél.123
+Å¥el.123
+SELECT * FROM t1 WHERE phone<>'123' ORDER BY BINARY phone;
+phone
+tex.123
+tèl.123
+ťèl.123
+SELECT phone, HEX(WEIGHT_STRING(phone)) FROM t1 ORDER BY phone, BINARY phone;
+phone HEX(WEIGHT_STRING(phone))
+123 0E2A0E2B0E2C
+tel.123 0E2A0E2B0E2C
+tél.123 0E2A0E2B0E2C
+Å¥el.123 0E2A0E2B0E2C
+tèl.123 10020E8B0F2E025D0E2A0E2B0E2C
+ťèl.123 10020E8B0F2E025D0E2A0E2B0E2C
+tex.123 10020E8B105A025D0E2A0E2B0E2C
+DROP TABLE t1;
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/main/ctype_ldml.test b/mysql-test/main/ctype_ldml.test
index 2e38c092d27..c9397d73126 100644
--- a/mysql-test/main/ctype_ldml.test
+++ b/mysql-test/main/ctype_ldml.test
@@ -36,6 +36,7 @@ SELECT * FROM t1 ORDER BY phone;
SELECT * FROM t1 WHERE phone='+7(912)800-80-01';
SELECT * FROM t1 WHERE phone='79128008001';
SELECT * FROM t1 WHERE phone='7 9 1 2 8 0 0 8 0 0 1';
+SELECT * FROM t1 WHERE phone='tel.79128008001';
DROP TABLE t1;
show collation like 'utf8mb3_test_ci';
@@ -643,3 +644,26 @@ SELECT 'foo' = 'foo ' COLLATE latin1_test_replace;
--echo #
--echo # End of 10.5 tests
--echo #
+
+--echo #
+--echo # MDEV-27042 UCA: Resetting contractions to ignorable does not work well
+--echo #
+
+CREATE TABLE t1 (
+ phone VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_phone_ci
+);
+INSERT INTO t1 VALUES ('123');
+INSERT INTO t1 VALUES ('tel.123');
+INSERT INTO t1 VALUES ('tél.123');
+INSERT INTO t1 VALUES ('tèl.123');
+INSERT INTO t1 VALUES ('Å¥el.123');
+INSERT INTO t1 VALUES ('ťèl.123');
+INSERT INTO t1 VALUES ('tex.123');
+SELECT * FROM t1 WHERE phone='123' ORDER BY BINARY phone;
+SELECT * FROM t1 WHERE phone<>'123' ORDER BY BINARY phone;
+SELECT phone, HEX(WEIGHT_STRING(phone)) FROM t1 ORDER BY phone, BINARY phone;
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/main/ctype_sjis.result b/mysql-test/main/ctype_sjis.result
index 4e08b0fbe98..4606c4bd8f3 100644
--- a/mysql-test/main/ctype_sjis.result
+++ b/mysql-test/main/ctype_sjis.result
@@ -231,6 +231,128 @@ SELECT HEX(subject),HEX(pattern),STR_TO_DATE(subject, pattern) FROM t1;
HEX(subject) HEX(pattern) STR_TO_DATE(subject, pattern)
323030318180303181803031 25598180256D81802564 2001-01-01 00:00:00.000000
DROP TABLE t1;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 sjis_japanese_ci
+name sjis_japanese_ci
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+Aa 41,61
+Bb 42,62
+Cc 43,63
+Dd 44,64
+Ee 45,65
+Ff 46,66
+Gg 47,67
+Hh 48,68
+Ii 49,69
+Jj 4A,6A
+Kk 4B,6B
+Ll 4C,6C
+Mm 4D,6D
+Nn 4E,6E
+Oo 4F,6F
+Pp 50,70
+Qq 51,71
+Rr 52,72
+Ss 53,73
+Tt 54,74
+Uu 55,75
+Vv 56,76
+Ww 57,77
+Xx 58,78
+Yy 59,79
+Zz 5A,7A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
SET collation_connection='sjis_bin';
create table t1 select repeat('a',4000) a;
delete from t1;
@@ -372,6 +494,154 @@ a hex(b) c
3 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
4 F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2F1F2 NULL
DROP TABLE t1;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 sjis_bin
+name sjis_bin
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+A 41
+B 42
+C 43
+D 44
+E 45
+F 46
+G 47
+H 48
+I 49
+J 4A
+K 4B
+L 4C
+M 4D
+N 4E
+O 4F
+P 50
+Q 51
+R 52
+S 53
+T 54
+U 55
+V 56
+W 57
+X 58
+Y 59
+Z 5A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+a 61
+b 62
+c 63
+d 64
+e 65
+f 66
+g 67
+h 68
+i 69
+j 6A
+k 6B
+l 6C
+m 6D
+n 6E
+o 6F
+p 70
+q 71
+r 72
+s 73
+t 74
+u 75
+v 76
+w 77
+x 78
+y 79
+z 7A
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
SET NAMES sjis;
SELECT HEX('²“‘@Œ\') FROM DUAL;
HEX('²“‘@Œ\')
diff --git a/mysql-test/main/ctype_sjis.test b/mysql-test/main/ctype_sjis.test
index 30ad360bf2e..c05cbbad01c 100644
--- a/mysql-test/main/ctype_sjis.test
+++ b/mysql-test/main/ctype_sjis.test
@@ -72,13 +72,13 @@ SET collation_connection='sjis_japanese_ci';
-- source include/ctype_like_escape.inc
-- source include/ctype_like_range_f1f2.inc
-- source include/ctype_str_to_date.inc
-
-
+-- source include/ctype_ascii_order.inc
SET collation_connection='sjis_bin';
-- source include/ctype_filesort.inc
-- source include/ctype_innodb_like.inc
-- source include/ctype_like_escape.inc
-- source include/ctype_like_range_f1f2.inc
+-- source include/ctype_ascii_order.inc
--enable_service_connection
# Check parsing of string literals in SJIS with multibyte characters that
diff --git a/mysql-test/main/ctype_tis620.result b/mysql-test/main/ctype_tis620.result
index 4530b3ca4a2..10b7042f709 100644
--- a/mysql-test/main/ctype_tis620.result
+++ b/mysql-test/main/ctype_tis620.result
@@ -3042,14 +3042,53 @@ SELECT '\%b' LIKE '%\%';
drop table if exists t1;
create table t1 select repeat('a',10) as c1;
delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
-SELECT GROUP_CONCAT(c1 ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM t1 GROUP BY c1;
-GROUP_CONCAT(c1 ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 tis620_thai_ci
+name tis620_thai_ci
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
20
! 21
" 22
@@ -3119,8 +3158,9 @@ Zz 5A,7A
| 7C
} 7D
~ 7E
- 7F
+<7F> 7F
drop table t1;
+drop view v1;
#
# MDEV-7149 Constant condition propagation erroneously applied for LIKE
#
diff --git a/mysql-test/main/ctype_ucs2_general_ci_casefold.result b/mysql-test/main/ctype_ucs2_general_ci_casefold.result
new file mode 100644
index 00000000000..a2170c5ba79
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_general_ci_casefold.result
@@ -0,0 +1,1427 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET collation_connection=ucs2_general_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+ucs2_general_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0069 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0049
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019C 026F 019C
+019D 0272 019D
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026F 026F 019C
+0272 0272 019D
+0275 0275 019F
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+028A 028A 01B1
+028B 028B 01B2
+0292 0292 01B7
+0345 0345 0399
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03A3
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C7 04C8 04C7
+04C8 04C8 04C7
+04CB 04CC 04CB
+04CC 04CC 04CB
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F8 04F9 04F8
+04F9 04F9 04F8
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_ucs2_general_ci_casefold.test b/mysql-test/main/ctype_ucs2_general_ci_casefold.test
new file mode 100644
index 00000000000..82b8add8374
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_general_ci_casefold.test
@@ -0,0 +1,14 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET collation_connection=ucs2_general_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_ucs2_general_ci_ws.result b/mysql-test/main/ctype_ucs2_general_ci_ws.result
new file mode 100644
index 00000000000..eb1d18c3e10
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_general_ci_ws.result
@@ -0,0 +1,1143 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET @@collation_connection=ucs2_general_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+ucs2_general_ci
+SELECT HEX(codepoint) FROM v_bmp WHERE HEX(WEIGHT_STRING(c))='FFFD';
+HEX(codepoint)
+FFFD
+SELECT
+SUM(codepoint_hex4=HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_codepoint,
+SUM(codepoint_hex4<>HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_not_codepoint
+FROM v_bmp;
+count_bmp_weight_is_codepoint count_bmp_weight_is_not_codepoint
+64428 1108
+SELECT codepoint_hex4,HEX(WEIGHT_STRING(c))
+FROM v_bmp
+WHERE codepoint_hex4<>HEX(WEIGHT_STRING(c));
+codepoint_hex4 HEX(WEIGHT_STRING(c))
+0061 0041
+0062 0042
+0063 0043
+0064 0044
+0065 0045
+0066 0046
+0067 0047
+0068 0048
+0069 0049
+006A 004A
+006B 004B
+006C 004C
+006D 004D
+006E 004E
+006F 004F
+0070 0050
+0071 0051
+0072 0052
+0073 0053
+0074 0054
+0075 0055
+0076 0056
+0077 0057
+0078 0058
+0079 0059
+007A 005A
+00B5 039C
+00C0 0041
+00C1 0041
+00C2 0041
+00C3 0041
+00C4 0041
+00C5 0041
+00C7 0043
+00C8 0045
+00C9 0045
+00CA 0045
+00CB 0045
+00CC 0049
+00CD 0049
+00CE 0049
+00CF 0049
+00D1 004E
+00D2 004F
+00D3 004F
+00D4 004F
+00D5 004F
+00D6 004F
+00D9 0055
+00DA 0055
+00DB 0055
+00DC 0055
+00DD 0059
+00DF 0053
+00E0 0041
+00E1 0041
+00E2 0041
+00E3 0041
+00E4 0041
+00E5 0041
+00E6 00C6
+00E7 0043
+00E8 0045
+00E9 0045
+00EA 0045
+00EB 0045
+00EC 0049
+00ED 0049
+00EE 0049
+00EF 0049
+00F0 00D0
+00F1 004E
+00F2 004F
+00F3 004F
+00F4 004F
+00F5 004F
+00F6 004F
+00F8 00D8
+00F9 0055
+00FA 0055
+00FB 0055
+00FC 0055
+00FD 0059
+00FE 00DE
+00FF 0059
+0100 0041
+0101 0041
+0102 0041
+0103 0041
+0104 0041
+0105 0041
+0106 0043
+0107 0043
+0108 0043
+0109 0043
+010A 0043
+010B 0043
+010C 0043
+010D 0043
+010E 0044
+010F 0044
+0111 0110
+0112 0045
+0113 0045
+0114 0045
+0115 0045
+0116 0045
+0117 0045
+0118 0045
+0119 0045
+011A 0045
+011B 0045
+011C 0047
+011D 0047
+011E 0047
+011F 0047
+0120 0047
+0121 0047
+0122 0047
+0123 0047
+0124 0048
+0125 0048
+0127 0126
+0128 0049
+0129 0049
+012A 0049
+012B 0049
+012C 0049
+012D 0049
+012E 0049
+012F 0049
+0130 0049
+0131 0049
+0133 0132
+0134 004A
+0135 004A
+0136 004B
+0137 004B
+0139 004C
+013A 004C
+013B 004C
+013C 004C
+013D 004C
+013E 004C
+0140 013F
+0142 0141
+0143 004E
+0144 004E
+0145 004E
+0146 004E
+0147 004E
+0148 004E
+014B 014A
+014C 004F
+014D 004F
+014E 004F
+014F 004F
+0150 004F
+0151 004F
+0153 0152
+0154 0052
+0155 0052
+0156 0052
+0157 0052
+0158 0052
+0159 0052
+015A 0053
+015B 0053
+015C 0053
+015D 0053
+015E 0053
+015F 0053
+0160 0053
+0161 0053
+0162 0054
+0163 0054
+0164 0054
+0165 0054
+0167 0166
+0168 0055
+0169 0055
+016A 0055
+016B 0055
+016C 0055
+016D 0055
+016E 0055
+016F 0055
+0170 0055
+0171 0055
+0172 0055
+0173 0055
+0174 0057
+0175 0057
+0176 0059
+0177 0059
+0178 0059
+0179 005A
+017A 005A
+017B 005A
+017C 005A
+017D 005A
+017E 005A
+017F 0053
+0183 0182
+0185 0184
+0188 0187
+018C 018B
+0192 0191
+0195 01F6
+0199 0198
+01A0 004F
+01A1 004F
+01A3 01A2
+01A5 01A4
+01A8 01A7
+01AD 01AC
+01AF 0055
+01B0 0055
+01B4 01B3
+01B6 01B5
+01B9 01B8
+01BD 01BC
+01BF 01F7
+01C5 01C4
+01C6 01C4
+01C8 01C7
+01C9 01C7
+01CB 01CA
+01CC 01CA
+01CD 0041
+01CE 0041
+01CF 0049
+01D0 0049
+01D1 004F
+01D2 004F
+01D3 0055
+01D4 0055
+01D5 0055
+01D6 0055
+01D7 0055
+01D8 0055
+01D9 0055
+01DA 0055
+01DB 0055
+01DC 0055
+01DD 018E
+01DE 0041
+01DF 0041
+01E0 0041
+01E1 0041
+01E2 00C6
+01E3 00C6
+01E5 01E4
+01E6 0047
+01E7 0047
+01E8 004B
+01E9 004B
+01EA 004F
+01EB 004F
+01EC 004F
+01ED 004F
+01EE 01B7
+01EF 01B7
+01F0 004A
+01F2 01F1
+01F3 01F1
+01F4 0047
+01F5 0047
+01F8 004E
+01F9 004E
+01FA 0041
+01FB 0041
+01FC 00C6
+01FD 00C6
+01FE 00D8
+01FF 00D8
+0200 0041
+0201 0041
+0202 0041
+0203 0041
+0204 0045
+0205 0045
+0206 0045
+0207 0045
+0208 0049
+0209 0049
+020A 0049
+020B 0049
+020C 004F
+020D 004F
+020E 004F
+020F 004F
+0210 0052
+0211 0052
+0212 0052
+0213 0052
+0214 0055
+0215 0055
+0216 0055
+0217 0055
+0218 0053
+0219 0053
+021A 0054
+021B 0054
+021D 021C
+021E 0048
+021F 0048
+0223 0222
+0225 0224
+0226 0041
+0227 0041
+0228 0045
+0229 0045
+022A 004F
+022B 004F
+022C 004F
+022D 004F
+022E 004F
+022F 004F
+0230 004F
+0231 004F
+0232 0059
+0233 0059
+0253 0181
+0254 0186
+0256 0189
+0257 018A
+0259 018F
+025B 0190
+0260 0193
+0263 0194
+0268 0197
+0269 0196
+026F 019C
+0272 019D
+0275 019F
+0280 01A6
+0283 01A9
+0288 01AE
+028A 01B1
+028B 01B2
+0292 01B7
+0345 0399
+0386 0391
+0388 0395
+0389 0397
+038A 0399
+038C 039F
+038E 03A5
+038F 03A9
+0390 0399
+03AA 0399
+03AB 03A5
+03AC 0391
+03AD 0395
+03AE 0397
+03AF 0399
+03B0 03A5
+03B1 0391
+03B2 0392
+03B3 0393
+03B4 0394
+03B5 0395
+03B6 0396
+03B7 0397
+03B8 0398
+03B9 0399
+03BA 039A
+03BB 039B
+03BC 039C
+03BD 039D
+03BE 039E
+03BF 039F
+03C0 03A0
+03C1 03A1
+03C2 03A3
+03C3 03A3
+03C4 03A4
+03C5 03A5
+03C6 03A6
+03C7 03A7
+03C8 03A8
+03C9 03A9
+03CA 0399
+03CB 03A5
+03CC 039F
+03CD 03A5
+03CE 03A9
+03D0 0392
+03D1 0398
+03D3 03D2
+03D4 03D2
+03D5 03A6
+03D6 03A0
+03DB 03DA
+03DD 03DC
+03DF 03DE
+03E1 03E0
+03E3 03E2
+03E5 03E4
+03E7 03E6
+03E9 03E8
+03EB 03EA
+03ED 03EC
+03EF 03EE
+03F0 039A
+03F1 03A1
+03F2 03A3
+0400 0415
+0401 0415
+0403 0413
+0407 0406
+040C 041A
+040D 0418
+040E 0423
+0430 0410
+0431 0411
+0432 0412
+0433 0413
+0434 0414
+0435 0415
+0436 0416
+0437 0417
+0438 0418
+0439 0419
+043A 041A
+043B 041B
+043C 041C
+043D 041D
+043E 041E
+043F 041F
+0440 0420
+0441 0421
+0442 0422
+0443 0423
+0444 0424
+0445 0425
+0446 0426
+0447 0427
+0448 0428
+0449 0429
+044A 042A
+044B 042B
+044C 042C
+044D 042D
+044E 042E
+044F 042F
+0450 0415
+0451 0415
+0452 0402
+0453 0413
+0454 0404
+0455 0405
+0456 0406
+0457 0406
+0458 0408
+0459 0409
+045A 040A
+045B 040B
+045C 041A
+045D 0418
+045E 0423
+045F 040F
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046B 046A
+046D 046C
+046F 046E
+0471 0470
+0473 0472
+0475 0474
+0476 0474
+0477 0474
+0479 0478
+047B 047A
+047D 047C
+047F 047E
+0481 0480
+048D 048C
+048F 048E
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049B 049A
+049D 049C
+049F 049E
+04A1 04A0
+04A3 04A2
+04A5 04A4
+04A7 04A6
+04A9 04A8
+04AB 04AA
+04AD 04AC
+04AF 04AE
+04B1 04B0
+04B3 04B2
+04B5 04B4
+04B7 04B6
+04B9 04B8
+04BB 04BA
+04BD 04BC
+04BF 04BE
+04C1 0416
+04C2 0416
+04C4 04C3
+04C8 04C7
+04CC 04CB
+04D0 0410
+04D1 0410
+04D2 0410
+04D3 0410
+04D5 04D4
+04D6 0415
+04D7 0415
+04D9 04D8
+04DA 04D8
+04DB 04D8
+04DC 0416
+04DD 0416
+04DE 0417
+04DF 0417
+04E1 04E0
+04E2 0418
+04E3 0418
+04E4 0418
+04E5 0418
+04E6 041E
+04E7 041E
+04E9 04E8
+04EA 04E8
+04EB 04E8
+04EC 042D
+04ED 042D
+04EE 0423
+04EF 0423
+04F0 0423
+04F1 0423
+04F2 0423
+04F3 0423
+04F4 0427
+04F5 0427
+04F8 042B
+04F9 042B
+0561 0531
+0562 0532
+0563 0533
+0564 0534
+0565 0535
+0566 0536
+0567 0537
+0568 0538
+0569 0539
+056A 053A
+056B 053B
+056C 053C
+056D 053D
+056E 053E
+056F 053F
+0570 0540
+0571 0541
+0572 0542
+0573 0543
+0574 0544
+0575 0545
+0576 0546
+0577 0547
+0578 0548
+0579 0549
+057A 054A
+057B 054B
+057C 054C
+057D 054D
+057E 054E
+057F 054F
+0580 0550
+0581 0551
+0582 0552
+0583 0553
+0584 0554
+0585 0555
+0586 0556
+1E00 0041
+1E01 0041
+1E02 0042
+1E03 0042
+1E04 0042
+1E05 0042
+1E06 0042
+1E07 0042
+1E08 0043
+1E09 0043
+1E0A 0044
+1E0B 0044
+1E0C 0044
+1E0D 0044
+1E0E 0044
+1E0F 0044
+1E10 0044
+1E11 0044
+1E12 0044
+1E13 0044
+1E14 0045
+1E15 0045
+1E16 0045
+1E17 0045
+1E18 0045
+1E19 0045
+1E1A 0045
+1E1B 0045
+1E1C 0045
+1E1D 0045
+1E1E 0046
+1E1F 0046
+1E20 0047
+1E21 0047
+1E22 0048
+1E23 0048
+1E24 0048
+1E25 0048
+1E26 0048
+1E27 0048
+1E28 0048
+1E29 0048
+1E2A 0048
+1E2B 0048
+1E2C 0049
+1E2D 0049
+1E2E 0049
+1E2F 0049
+1E30 004B
+1E31 004B
+1E32 004B
+1E33 004B
+1E34 004B
+1E35 004B
+1E36 004C
+1E37 004C
+1E38 004C
+1E39 004C
+1E3A 004C
+1E3B 004C
+1E3C 004C
+1E3D 004C
+1E3E 004D
+1E3F 004D
+1E40 004D
+1E41 004D
+1E42 004D
+1E43 004D
+1E44 004E
+1E45 004E
+1E46 004E
+1E47 004E
+1E48 004E
+1E49 004E
+1E4A 004E
+1E4B 004E
+1E4C 004F
+1E4D 004F
+1E4E 004F
+1E4F 004F
+1E50 004F
+1E51 004F
+1E52 004F
+1E53 004F
+1E54 0050
+1E55 0050
+1E56 0050
+1E57 0050
+1E58 0052
+1E59 0052
+1E5A 0052
+1E5B 0052
+1E5C 0052
+1E5D 0052
+1E5E 0052
+1E5F 0052
+1E60 0053
+1E61 0053
+1E62 0053
+1E63 0053
+1E64 0053
+1E65 0053
+1E66 0053
+1E67 0053
+1E68 0053
+1E69 0053
+1E6A 0054
+1E6B 0054
+1E6C 0054
+1E6D 0054
+1E6E 0054
+1E6F 0054
+1E70 0054
+1E71 0054
+1E72 0055
+1E73 0055
+1E74 0055
+1E75 0055
+1E76 0055
+1E77 0055
+1E78 0055
+1E79 0055
+1E7A 0055
+1E7B 0055
+1E7C 0056
+1E7D 0056
+1E7E 0056
+1E7F 0056
+1E80 0057
+1E81 0057
+1E82 0057
+1E83 0057
+1E84 0057
+1E85 0057
+1E86 0057
+1E87 0057
+1E88 0057
+1E89 0057
+1E8A 0058
+1E8B 0058
+1E8C 0058
+1E8D 0058
+1E8E 0059
+1E8F 0059
+1E90 005A
+1E91 005A
+1E92 005A
+1E93 005A
+1E94 005A
+1E95 005A
+1E96 0048
+1E97 0054
+1E98 0057
+1E99 0059
+1E9B 0053
+1EA0 0041
+1EA1 0041
+1EA2 0041
+1EA3 0041
+1EA4 0041
+1EA5 0041
+1EA6 0041
+1EA7 0041
+1EA8 0041
+1EA9 0041
+1EAA 0041
+1EAB 0041
+1EAC 0041
+1EAD 0041
+1EAE 0041
+1EAF 0041
+1EB0 0041
+1EB1 0041
+1EB2 0041
+1EB3 0041
+1EB4 0041
+1EB5 0041
+1EB6 0041
+1EB7 0041
+1EB8 0045
+1EB9 0045
+1EBA 0045
+1EBB 0045
+1EBC 0045
+1EBD 0045
+1EBE 0045
+1EBF 0045
+1EC0 0045
+1EC1 0045
+1EC2 0045
+1EC3 0045
+1EC4 0045
+1EC5 0045
+1EC6 0045
+1EC7 0045
+1EC8 0049
+1EC9 0049
+1ECA 0049
+1ECB 0049
+1ECC 004F
+1ECD 004F
+1ECE 004F
+1ECF 004F
+1ED0 004F
+1ED1 004F
+1ED2 004F
+1ED3 004F
+1ED4 004F
+1ED5 004F
+1ED6 004F
+1ED7 004F
+1ED8 004F
+1ED9 004F
+1EDA 004F
+1EDB 004F
+1EDC 004F
+1EDD 004F
+1EDE 004F
+1EDF 004F
+1EE0 004F
+1EE1 004F
+1EE2 004F
+1EE3 004F
+1EE4 0055
+1EE5 0055
+1EE6 0055
+1EE7 0055
+1EE8 0055
+1EE9 0055
+1EEA 0055
+1EEB 0055
+1EEC 0055
+1EED 0055
+1EEE 0055
+1EEF 0055
+1EF0 0055
+1EF1 0055
+1EF2 0059
+1EF3 0059
+1EF4 0059
+1EF5 0059
+1EF6 0059
+1EF7 0059
+1EF8 0059
+1EF9 0059
+1F00 0391
+1F01 0391
+1F02 0391
+1F03 0391
+1F04 0391
+1F05 0391
+1F06 0391
+1F07 0391
+1F08 0391
+1F09 0391
+1F0A 0391
+1F0B 0391
+1F0C 0391
+1F0D 0391
+1F0E 0391
+1F0F 0391
+1F10 0395
+1F11 0395
+1F12 0395
+1F13 0395
+1F14 0395
+1F15 0395
+1F18 0395
+1F19 0395
+1F1A 0395
+1F1B 0395
+1F1C 0395
+1F1D 0395
+1F20 0397
+1F21 0397
+1F22 0397
+1F23 0397
+1F24 0397
+1F25 0397
+1F26 0397
+1F27 0397
+1F28 0397
+1F29 0397
+1F2A 0397
+1F2B 0397
+1F2C 0397
+1F2D 0397
+1F2E 0397
+1F2F 0397
+1F30 0399
+1F31 0399
+1F32 0399
+1F33 0399
+1F34 0399
+1F35 0399
+1F36 0399
+1F37 0399
+1F38 0399
+1F39 0399
+1F3A 0399
+1F3B 0399
+1F3C 0399
+1F3D 0399
+1F3E 0399
+1F3F 0399
+1F40 039F
+1F41 039F
+1F42 039F
+1F43 039F
+1F44 039F
+1F45 039F
+1F48 039F
+1F49 039F
+1F4A 039F
+1F4B 039F
+1F4C 039F
+1F4D 039F
+1F50 03A5
+1F51 03A5
+1F52 03A5
+1F53 03A5
+1F54 03A5
+1F55 03A5
+1F56 03A5
+1F57 03A5
+1F59 03A5
+1F5B 03A5
+1F5D 03A5
+1F5F 03A5
+1F60 03A9
+1F61 03A9
+1F62 03A9
+1F63 03A9
+1F64 03A9
+1F65 03A9
+1F66 03A9
+1F67 03A9
+1F68 03A9
+1F69 03A9
+1F6A 03A9
+1F6B 03A9
+1F6C 03A9
+1F6D 03A9
+1F6E 03A9
+1F6F 03A9
+1F70 0391
+1F71 1FBB
+1F72 0395
+1F73 1FC9
+1F74 0397
+1F75 1FCB
+1F76 0399
+1F77 1FDB
+1F78 039F
+1F79 1FF9
+1F7A 03A5
+1F7B 1FEB
+1F7C 03A9
+1F7D 1FFB
+1F80 0391
+1F81 0391
+1F82 0391
+1F83 0391
+1F84 0391
+1F85 0391
+1F86 0391
+1F87 0391
+1F88 0391
+1F89 0391
+1F8A 0391
+1F8B 0391
+1F8C 0391
+1F8D 0391
+1F8E 0391
+1F8F 0391
+1F90 0397
+1F91 0397
+1F92 0397
+1F93 0397
+1F94 0397
+1F95 0397
+1F96 0397
+1F97 0397
+1F98 0397
+1F99 0397
+1F9A 0397
+1F9B 0397
+1F9C 0397
+1F9D 0397
+1F9E 0397
+1F9F 0397
+1FA0 03A9
+1FA1 03A9
+1FA2 03A9
+1FA3 03A9
+1FA4 03A9
+1FA5 03A9
+1FA6 03A9
+1FA7 03A9
+1FA8 03A9
+1FA9 03A9
+1FAA 03A9
+1FAB 03A9
+1FAC 03A9
+1FAD 03A9
+1FAE 03A9
+1FAF 03A9
+1FB0 0391
+1FB1 0391
+1FB2 0391
+1FB3 0391
+1FB4 0391
+1FB6 0391
+1FB7 0391
+1FB8 0391
+1FB9 0391
+1FBA 0391
+1FBC 0391
+1FBE 0399
+1FC2 0397
+1FC3 0397
+1FC4 0397
+1FC6 0397
+1FC7 0397
+1FC8 0395
+1FCA 0397
+1FCC 0397
+1FD0 0399
+1FD1 0399
+1FD2 0399
+1FD6 0399
+1FD7 0399
+1FD8 0399
+1FD9 0399
+1FDA 0399
+1FE0 03A5
+1FE1 03A5
+1FE2 03A5
+1FE4 03A1
+1FE5 03A1
+1FE6 03A5
+1FE7 03A5
+1FE8 03A5
+1FE9 03A5
+1FEA 03A5
+1FEC 03A1
+1FF2 03A9
+1FF3 03A9
+1FF4 03A9
+1FF6 03A9
+1FF7 03A9
+1FF8 039F
+1FFA 03A9
+1FFC 03A9
+2170 2160
+2171 2161
+2172 2162
+2173 2163
+2174 2164
+2175 2165
+2176 2166
+2177 2167
+2178 2168
+2179 2169
+217A 216A
+217B 216B
+217C 216C
+217D 216D
+217E 216E
+217F 216F
+24D0 24B6
+24D1 24B7
+24D2 24B8
+24D3 24B9
+24D4 24BA
+24D5 24BB
+24D6 24BC
+24D7 24BD
+24D8 24BE
+24D9 24BF
+24DA 24C0
+24DB 24C1
+24DC 24C2
+24DD 24C3
+24DE 24C4
+24DF 24C5
+24E0 24C6
+24E1 24C7
+24E2 24C8
+24E3 24C9
+24E4 24CA
+24E5 24CB
+24E6 24CC
+24E7 24CD
+24E8 24CE
+24E9 24CF
+FF41 FF21
+FF42 FF22
+FF43 FF23
+FF44 FF24
+FF45 FF25
+FF46 FF26
+FF47 FF27
+FF48 FF28
+FF49 FF29
+FF4A FF2A
+FF4B FF2B
+FF4C FF2C
+FF4D FF2D
+FF4E FF2E
+FF4F FF2F
+FF50 FF30
+FF51 FF31
+FF52 FF32
+FF53 FF33
+FF54 FF34
+FF55 FF35
+FF56 FF36
+FF57 FF37
+FF58 FF38
+FF59 FF39
+FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_ucs2_general_ci_ws.test b/mysql-test/main/ctype_ucs2_general_ci_ws.test
new file mode 100644
index 00000000000..12606b049e5
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_general_ci_ws.test
@@ -0,0 +1,14 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET @@collation_connection=ucs2_general_ci;
+--source include/ctype_unicode_ws_bmp.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.result b/mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.result
new file mode 100644
index 00000000000..f4b163429dc
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.result
@@ -0,0 +1,1427 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET @@collation_connection=ucs2_general_mysql500_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+ucs2_general_mysql500_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0069 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0049
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019C 026F 019C
+019D 0272 019D
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026F 026F 019C
+0272 0272 019D
+0275 0275 019F
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+028A 028A 01B1
+028B 028B 01B2
+0292 0292 01B7
+0345 0345 0399
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03A3
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C7 04C8 04C7
+04C8 04C8 04C7
+04CB 04CC 04CB
+04CC 04CC 04CB
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F8 04F9 04F8
+04F9 04F9 04F8
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.test b/mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.test
new file mode 100644
index 00000000000..2c07e6ffac3
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.test
@@ -0,0 +1,15 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET @@collation_connection=ucs2_general_mysql500_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.result b/mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.result
new file mode 100644
index 00000000000..3679169122e
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.result
@@ -0,0 +1,1143 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET @@collation_connection=ucs2_general_mysql500_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+ucs2_general_mysql500_ci
+SELECT HEX(codepoint) FROM v_bmp WHERE HEX(WEIGHT_STRING(c))='FFFD';
+HEX(codepoint)
+FFFD
+SELECT
+SUM(codepoint_hex4=HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_codepoint,
+SUM(codepoint_hex4<>HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_not_codepoint
+FROM v_bmp;
+count_bmp_weight_is_codepoint count_bmp_weight_is_not_codepoint
+64428 1108
+SELECT codepoint_hex4,HEX(WEIGHT_STRING(c))
+FROM v_bmp
+WHERE codepoint_hex4<>HEX(WEIGHT_STRING(c));
+codepoint_hex4 HEX(WEIGHT_STRING(c))
+0061 0041
+0062 0042
+0063 0043
+0064 0044
+0065 0045
+0066 0046
+0067 0047
+0068 0048
+0069 0049
+006A 004A
+006B 004B
+006C 004C
+006D 004D
+006E 004E
+006F 004F
+0070 0050
+0071 0051
+0072 0052
+0073 0053
+0074 0054
+0075 0055
+0076 0056
+0077 0057
+0078 0058
+0079 0059
+007A 005A
+00B5 039C
+00C0 0041
+00C1 0041
+00C2 0041
+00C3 0041
+00C4 0041
+00C5 0041
+00C7 0043
+00C8 0045
+00C9 0045
+00CA 0045
+00CB 0045
+00CC 0049
+00CD 0049
+00CE 0049
+00CF 0049
+00D1 004E
+00D2 004F
+00D3 004F
+00D4 004F
+00D5 004F
+00D6 004F
+00D9 0055
+00DA 0055
+00DB 0055
+00DC 0055
+00DD 0059
+00DF 0053
+00E0 0041
+00E1 0041
+00E2 0041
+00E3 0041
+00E4 0041
+00E5 0041
+00E6 00C6
+00E7 0043
+00E8 0045
+00E9 0045
+00EA 0045
+00EB 0045
+00EC 0049
+00ED 0049
+00EE 0049
+00EF 0049
+00F0 00D0
+00F1 004E
+00F2 004F
+00F3 004F
+00F4 004F
+00F5 004F
+00F6 004F
+00F8 00D8
+00F9 0055
+00FA 0055
+00FB 0055
+00FC 0055
+00FD 0059
+00FE 00DE
+00FF 0059
+0100 0041
+0101 0041
+0102 0041
+0103 0041
+0104 0041
+0105 0041
+0106 0043
+0107 0043
+0108 0043
+0109 0043
+010A 0043
+010B 0043
+010C 0043
+010D 0043
+010E 0044
+010F 0044
+0111 0110
+0112 0045
+0113 0045
+0114 0045
+0115 0045
+0116 0045
+0117 0045
+0118 0045
+0119 0045
+011A 0045
+011B 0045
+011C 0047
+011D 0047
+011E 0047
+011F 0047
+0120 0047
+0121 0047
+0122 0047
+0123 0047
+0124 0048
+0125 0048
+0127 0126
+0128 0049
+0129 0049
+012A 0049
+012B 0049
+012C 0049
+012D 0049
+012E 0049
+012F 0049
+0130 0049
+0131 0049
+0133 0132
+0134 004A
+0135 004A
+0136 004B
+0137 004B
+0139 004C
+013A 004C
+013B 004C
+013C 004C
+013D 004C
+013E 004C
+0140 013F
+0142 0141
+0143 004E
+0144 004E
+0145 004E
+0146 004E
+0147 004E
+0148 004E
+014B 014A
+014C 004F
+014D 004F
+014E 004F
+014F 004F
+0150 004F
+0151 004F
+0153 0152
+0154 0052
+0155 0052
+0156 0052
+0157 0052
+0158 0052
+0159 0052
+015A 0053
+015B 0053
+015C 0053
+015D 0053
+015E 0053
+015F 0053
+0160 0053
+0161 0053
+0162 0054
+0163 0054
+0164 0054
+0165 0054
+0167 0166
+0168 0055
+0169 0055
+016A 0055
+016B 0055
+016C 0055
+016D 0055
+016E 0055
+016F 0055
+0170 0055
+0171 0055
+0172 0055
+0173 0055
+0174 0057
+0175 0057
+0176 0059
+0177 0059
+0178 0059
+0179 005A
+017A 005A
+017B 005A
+017C 005A
+017D 005A
+017E 005A
+017F 0053
+0183 0182
+0185 0184
+0188 0187
+018C 018B
+0192 0191
+0195 01F6
+0199 0198
+01A0 004F
+01A1 004F
+01A3 01A2
+01A5 01A4
+01A8 01A7
+01AD 01AC
+01AF 0055
+01B0 0055
+01B4 01B3
+01B6 01B5
+01B9 01B8
+01BD 01BC
+01BF 01F7
+01C5 01C4
+01C6 01C4
+01C8 01C7
+01C9 01C7
+01CB 01CA
+01CC 01CA
+01CD 0041
+01CE 0041
+01CF 0049
+01D0 0049
+01D1 004F
+01D2 004F
+01D3 0055
+01D4 0055
+01D5 0055
+01D6 0055
+01D7 0055
+01D8 0055
+01D9 0055
+01DA 0055
+01DB 0055
+01DC 0055
+01DD 018E
+01DE 0041
+01DF 0041
+01E0 0041
+01E1 0041
+01E2 00C6
+01E3 00C6
+01E5 01E4
+01E6 0047
+01E7 0047
+01E8 004B
+01E9 004B
+01EA 004F
+01EB 004F
+01EC 004F
+01ED 004F
+01EE 01B7
+01EF 01B7
+01F0 004A
+01F2 01F1
+01F3 01F1
+01F4 0047
+01F5 0047
+01F8 004E
+01F9 004E
+01FA 0041
+01FB 0041
+01FC 00C6
+01FD 00C6
+01FE 00D8
+01FF 00D8
+0200 0041
+0201 0041
+0202 0041
+0203 0041
+0204 0045
+0205 0045
+0206 0045
+0207 0045
+0208 0049
+0209 0049
+020A 0049
+020B 0049
+020C 004F
+020D 004F
+020E 004F
+020F 004F
+0210 0052
+0211 0052
+0212 0052
+0213 0052
+0214 0055
+0215 0055
+0216 0055
+0217 0055
+0218 0053
+0219 0053
+021A 0054
+021B 0054
+021D 021C
+021E 0048
+021F 0048
+0223 0222
+0225 0224
+0226 0041
+0227 0041
+0228 0045
+0229 0045
+022A 004F
+022B 004F
+022C 004F
+022D 004F
+022E 004F
+022F 004F
+0230 004F
+0231 004F
+0232 0059
+0233 0059
+0253 0181
+0254 0186
+0256 0189
+0257 018A
+0259 018F
+025B 0190
+0260 0193
+0263 0194
+0268 0197
+0269 0196
+026F 019C
+0272 019D
+0275 019F
+0280 01A6
+0283 01A9
+0288 01AE
+028A 01B1
+028B 01B2
+0292 01B7
+0345 0399
+0386 0391
+0388 0395
+0389 0397
+038A 0399
+038C 039F
+038E 03A5
+038F 03A9
+0390 0399
+03AA 0399
+03AB 03A5
+03AC 0391
+03AD 0395
+03AE 0397
+03AF 0399
+03B0 03A5
+03B1 0391
+03B2 0392
+03B3 0393
+03B4 0394
+03B5 0395
+03B6 0396
+03B7 0397
+03B8 0398
+03B9 0399
+03BA 039A
+03BB 039B
+03BC 039C
+03BD 039D
+03BE 039E
+03BF 039F
+03C0 03A0
+03C1 03A1
+03C2 03A3
+03C3 03A3
+03C4 03A4
+03C5 03A5
+03C6 03A6
+03C7 03A7
+03C8 03A8
+03C9 03A9
+03CA 0399
+03CB 03A5
+03CC 039F
+03CD 03A5
+03CE 03A9
+03D0 0392
+03D1 0398
+03D3 03D2
+03D4 03D2
+03D5 03A6
+03D6 03A0
+03DB 03DA
+03DD 03DC
+03DF 03DE
+03E1 03E0
+03E3 03E2
+03E5 03E4
+03E7 03E6
+03E9 03E8
+03EB 03EA
+03ED 03EC
+03EF 03EE
+03F0 039A
+03F1 03A1
+03F2 03A3
+0400 0415
+0401 0415
+0403 0413
+0407 0406
+040C 041A
+040D 0418
+040E 0423
+0430 0410
+0431 0411
+0432 0412
+0433 0413
+0434 0414
+0435 0415
+0436 0416
+0437 0417
+0438 0418
+0439 0419
+043A 041A
+043B 041B
+043C 041C
+043D 041D
+043E 041E
+043F 041F
+0440 0420
+0441 0421
+0442 0422
+0443 0423
+0444 0424
+0445 0425
+0446 0426
+0447 0427
+0448 0428
+0449 0429
+044A 042A
+044B 042B
+044C 042C
+044D 042D
+044E 042E
+044F 042F
+0450 0415
+0451 0415
+0452 0402
+0453 0413
+0454 0404
+0455 0405
+0456 0406
+0457 0406
+0458 0408
+0459 0409
+045A 040A
+045B 040B
+045C 041A
+045D 0418
+045E 0423
+045F 040F
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046B 046A
+046D 046C
+046F 046E
+0471 0470
+0473 0472
+0475 0474
+0476 0474
+0477 0474
+0479 0478
+047B 047A
+047D 047C
+047F 047E
+0481 0480
+048D 048C
+048F 048E
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049B 049A
+049D 049C
+049F 049E
+04A1 04A0
+04A3 04A2
+04A5 04A4
+04A7 04A6
+04A9 04A8
+04AB 04AA
+04AD 04AC
+04AF 04AE
+04B1 04B0
+04B3 04B2
+04B5 04B4
+04B7 04B6
+04B9 04B8
+04BB 04BA
+04BD 04BC
+04BF 04BE
+04C1 0416
+04C2 0416
+04C4 04C3
+04C8 04C7
+04CC 04CB
+04D0 0410
+04D1 0410
+04D2 0410
+04D3 0410
+04D5 04D4
+04D6 0415
+04D7 0415
+04D9 04D8
+04DA 04D8
+04DB 04D8
+04DC 0416
+04DD 0416
+04DE 0417
+04DF 0417
+04E1 04E0
+04E2 0418
+04E3 0418
+04E4 0418
+04E5 0418
+04E6 041E
+04E7 041E
+04E9 04E8
+04EA 04E8
+04EB 04E8
+04EC 042D
+04ED 042D
+04EE 0423
+04EF 0423
+04F0 0423
+04F1 0423
+04F2 0423
+04F3 0423
+04F4 0427
+04F5 0427
+04F8 042B
+04F9 042B
+0561 0531
+0562 0532
+0563 0533
+0564 0534
+0565 0535
+0566 0536
+0567 0537
+0568 0538
+0569 0539
+056A 053A
+056B 053B
+056C 053C
+056D 053D
+056E 053E
+056F 053F
+0570 0540
+0571 0541
+0572 0542
+0573 0543
+0574 0544
+0575 0545
+0576 0546
+0577 0547
+0578 0548
+0579 0549
+057A 054A
+057B 054B
+057C 054C
+057D 054D
+057E 054E
+057F 054F
+0580 0550
+0581 0551
+0582 0552
+0583 0553
+0584 0554
+0585 0555
+0586 0556
+1E00 0041
+1E01 0041
+1E02 0042
+1E03 0042
+1E04 0042
+1E05 0042
+1E06 0042
+1E07 0042
+1E08 0043
+1E09 0043
+1E0A 0044
+1E0B 0044
+1E0C 0044
+1E0D 0044
+1E0E 0044
+1E0F 0044
+1E10 0044
+1E11 0044
+1E12 0044
+1E13 0044
+1E14 0045
+1E15 0045
+1E16 0045
+1E17 0045
+1E18 0045
+1E19 0045
+1E1A 0045
+1E1B 0045
+1E1C 0045
+1E1D 0045
+1E1E 0046
+1E1F 0046
+1E20 0047
+1E21 0047
+1E22 0048
+1E23 0048
+1E24 0048
+1E25 0048
+1E26 0048
+1E27 0048
+1E28 0048
+1E29 0048
+1E2A 0048
+1E2B 0048
+1E2C 0049
+1E2D 0049
+1E2E 0049
+1E2F 0049
+1E30 004B
+1E31 004B
+1E32 004B
+1E33 004B
+1E34 004B
+1E35 004B
+1E36 004C
+1E37 004C
+1E38 004C
+1E39 004C
+1E3A 004C
+1E3B 004C
+1E3C 004C
+1E3D 004C
+1E3E 004D
+1E3F 004D
+1E40 004D
+1E41 004D
+1E42 004D
+1E43 004D
+1E44 004E
+1E45 004E
+1E46 004E
+1E47 004E
+1E48 004E
+1E49 004E
+1E4A 004E
+1E4B 004E
+1E4C 004F
+1E4D 004F
+1E4E 004F
+1E4F 004F
+1E50 004F
+1E51 004F
+1E52 004F
+1E53 004F
+1E54 0050
+1E55 0050
+1E56 0050
+1E57 0050
+1E58 0052
+1E59 0052
+1E5A 0052
+1E5B 0052
+1E5C 0052
+1E5D 0052
+1E5E 0052
+1E5F 0052
+1E60 0053
+1E61 0053
+1E62 0053
+1E63 0053
+1E64 0053
+1E65 0053
+1E66 0053
+1E67 0053
+1E68 0053
+1E69 0053
+1E6A 0054
+1E6B 0054
+1E6C 0054
+1E6D 0054
+1E6E 0054
+1E6F 0054
+1E70 0054
+1E71 0054
+1E72 0055
+1E73 0055
+1E74 0055
+1E75 0055
+1E76 0055
+1E77 0055
+1E78 0055
+1E79 0055
+1E7A 0055
+1E7B 0055
+1E7C 0056
+1E7D 0056
+1E7E 0056
+1E7F 0056
+1E80 0057
+1E81 0057
+1E82 0057
+1E83 0057
+1E84 0057
+1E85 0057
+1E86 0057
+1E87 0057
+1E88 0057
+1E89 0057
+1E8A 0058
+1E8B 0058
+1E8C 0058
+1E8D 0058
+1E8E 0059
+1E8F 0059
+1E90 005A
+1E91 005A
+1E92 005A
+1E93 005A
+1E94 005A
+1E95 005A
+1E96 0048
+1E97 0054
+1E98 0057
+1E99 0059
+1E9B 0053
+1EA0 0041
+1EA1 0041
+1EA2 0041
+1EA3 0041
+1EA4 0041
+1EA5 0041
+1EA6 0041
+1EA7 0041
+1EA8 0041
+1EA9 0041
+1EAA 0041
+1EAB 0041
+1EAC 0041
+1EAD 0041
+1EAE 0041
+1EAF 0041
+1EB0 0041
+1EB1 0041
+1EB2 0041
+1EB3 0041
+1EB4 0041
+1EB5 0041
+1EB6 0041
+1EB7 0041
+1EB8 0045
+1EB9 0045
+1EBA 0045
+1EBB 0045
+1EBC 0045
+1EBD 0045
+1EBE 0045
+1EBF 0045
+1EC0 0045
+1EC1 0045
+1EC2 0045
+1EC3 0045
+1EC4 0045
+1EC5 0045
+1EC6 0045
+1EC7 0045
+1EC8 0049
+1EC9 0049
+1ECA 0049
+1ECB 0049
+1ECC 004F
+1ECD 004F
+1ECE 004F
+1ECF 004F
+1ED0 004F
+1ED1 004F
+1ED2 004F
+1ED3 004F
+1ED4 004F
+1ED5 004F
+1ED6 004F
+1ED7 004F
+1ED8 004F
+1ED9 004F
+1EDA 004F
+1EDB 004F
+1EDC 004F
+1EDD 004F
+1EDE 004F
+1EDF 004F
+1EE0 004F
+1EE1 004F
+1EE2 004F
+1EE3 004F
+1EE4 0055
+1EE5 0055
+1EE6 0055
+1EE7 0055
+1EE8 0055
+1EE9 0055
+1EEA 0055
+1EEB 0055
+1EEC 0055
+1EED 0055
+1EEE 0055
+1EEF 0055
+1EF0 0055
+1EF1 0055
+1EF2 0059
+1EF3 0059
+1EF4 0059
+1EF5 0059
+1EF6 0059
+1EF7 0059
+1EF8 0059
+1EF9 0059
+1F00 0391
+1F01 0391
+1F02 0391
+1F03 0391
+1F04 0391
+1F05 0391
+1F06 0391
+1F07 0391
+1F08 0391
+1F09 0391
+1F0A 0391
+1F0B 0391
+1F0C 0391
+1F0D 0391
+1F0E 0391
+1F0F 0391
+1F10 0395
+1F11 0395
+1F12 0395
+1F13 0395
+1F14 0395
+1F15 0395
+1F18 0395
+1F19 0395
+1F1A 0395
+1F1B 0395
+1F1C 0395
+1F1D 0395
+1F20 0397
+1F21 0397
+1F22 0397
+1F23 0397
+1F24 0397
+1F25 0397
+1F26 0397
+1F27 0397
+1F28 0397
+1F29 0397
+1F2A 0397
+1F2B 0397
+1F2C 0397
+1F2D 0397
+1F2E 0397
+1F2F 0397
+1F30 0399
+1F31 0399
+1F32 0399
+1F33 0399
+1F34 0399
+1F35 0399
+1F36 0399
+1F37 0399
+1F38 0399
+1F39 0399
+1F3A 0399
+1F3B 0399
+1F3C 0399
+1F3D 0399
+1F3E 0399
+1F3F 0399
+1F40 039F
+1F41 039F
+1F42 039F
+1F43 039F
+1F44 039F
+1F45 039F
+1F48 039F
+1F49 039F
+1F4A 039F
+1F4B 039F
+1F4C 039F
+1F4D 039F
+1F50 03A5
+1F51 03A5
+1F52 03A5
+1F53 03A5
+1F54 03A5
+1F55 03A5
+1F56 03A5
+1F57 03A5
+1F59 03A5
+1F5B 03A5
+1F5D 03A5
+1F5F 03A5
+1F60 03A9
+1F61 03A9
+1F62 03A9
+1F63 03A9
+1F64 03A9
+1F65 03A9
+1F66 03A9
+1F67 03A9
+1F68 03A9
+1F69 03A9
+1F6A 03A9
+1F6B 03A9
+1F6C 03A9
+1F6D 03A9
+1F6E 03A9
+1F6F 03A9
+1F70 0391
+1F71 1FBB
+1F72 0395
+1F73 1FC9
+1F74 0397
+1F75 1FCB
+1F76 0399
+1F77 1FDB
+1F78 039F
+1F79 1FF9
+1F7A 03A5
+1F7B 1FEB
+1F7C 03A9
+1F7D 1FFB
+1F80 0391
+1F81 0391
+1F82 0391
+1F83 0391
+1F84 0391
+1F85 0391
+1F86 0391
+1F87 0391
+1F88 0391
+1F89 0391
+1F8A 0391
+1F8B 0391
+1F8C 0391
+1F8D 0391
+1F8E 0391
+1F8F 0391
+1F90 0397
+1F91 0397
+1F92 0397
+1F93 0397
+1F94 0397
+1F95 0397
+1F96 0397
+1F97 0397
+1F98 0397
+1F99 0397
+1F9A 0397
+1F9B 0397
+1F9C 0397
+1F9D 0397
+1F9E 0397
+1F9F 0397
+1FA0 03A9
+1FA1 03A9
+1FA2 03A9
+1FA3 03A9
+1FA4 03A9
+1FA5 03A9
+1FA6 03A9
+1FA7 03A9
+1FA8 03A9
+1FA9 03A9
+1FAA 03A9
+1FAB 03A9
+1FAC 03A9
+1FAD 03A9
+1FAE 03A9
+1FAF 03A9
+1FB0 0391
+1FB1 0391
+1FB2 0391
+1FB3 0391
+1FB4 0391
+1FB6 0391
+1FB7 0391
+1FB8 0391
+1FB9 0391
+1FBA 0391
+1FBC 0391
+1FBE 0399
+1FC2 0397
+1FC3 0397
+1FC4 0397
+1FC6 0397
+1FC7 0397
+1FC8 0395
+1FCA 0397
+1FCC 0397
+1FD0 0399
+1FD1 0399
+1FD2 0399
+1FD6 0399
+1FD7 0399
+1FD8 0399
+1FD9 0399
+1FDA 0399
+1FE0 03A5
+1FE1 03A5
+1FE2 03A5
+1FE4 03A1
+1FE5 03A1
+1FE6 03A5
+1FE7 03A5
+1FE8 03A5
+1FE9 03A5
+1FEA 03A5
+1FEC 03A1
+1FF2 03A9
+1FF3 03A9
+1FF4 03A9
+1FF6 03A9
+1FF7 03A9
+1FF8 039F
+1FFA 03A9
+1FFC 03A9
+2170 2160
+2171 2161
+2172 2162
+2173 2163
+2174 2164
+2175 2165
+2176 2166
+2177 2167
+2178 2168
+2179 2169
+217A 216A
+217B 216B
+217C 216C
+217D 216D
+217E 216E
+217F 216F
+24D0 24B6
+24D1 24B7
+24D2 24B8
+24D3 24B9
+24D4 24BA
+24D5 24BB
+24D6 24BC
+24D7 24BD
+24D8 24BE
+24D9 24BF
+24DA 24C0
+24DB 24C1
+24DC 24C2
+24DD 24C3
+24DE 24C4
+24DF 24C5
+24E0 24C6
+24E1 24C7
+24E2 24C8
+24E3 24C9
+24E4 24CA
+24E5 24CB
+24E6 24CC
+24E7 24CD
+24E8 24CE
+24E9 24CF
+FF41 FF21
+FF42 FF22
+FF43 FF23
+FF44 FF24
+FF45 FF25
+FF46 FF26
+FF47 FF27
+FF48 FF28
+FF49 FF29
+FF4A FF2A
+FF4B FF2B
+FF4C FF2C
+FF4D FF2D
+FF4E FF2E
+FF4F FF2F
+FF50 FF30
+FF51 FF31
+FF52 FF32
+FF53 FF33
+FF54 FF34
+FF55 FF35
+FF56 FF36
+FF57 FF37
+FF58 FF38
+FF59 FF39
+FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.test b/mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.test
new file mode 100644
index 00000000000..3e3ff3726e8
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.test
@@ -0,0 +1,15 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET @@collation_connection=ucs2_general_mysql500_ci;
+--source include/ctype_unicode_ws_bmp.inc
+
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_ucs2_turkish_ci_casefold.result b/mysql-test/main/ctype_ucs2_turkish_ci_casefold.result
new file mode 100644
index 00000000000..6feffa673b9
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_turkish_ci_casefold.result
@@ -0,0 +1,1427 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET @@collation_connection=ucs2_turkish_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+ucs2_turkish_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0131 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0130
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019C 026F 019C
+019D 0272 019D
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026F 026F 019C
+0272 0272 019D
+0275 0275 019F
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+028A 028A 01B1
+028B 028B 01B2
+0292 0292 01B7
+0345 0345 0399
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03A3
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C7 04C8 04C7
+04C8 04C8 04C7
+04CB 04CC 04CB
+04CC 04CC 04CB
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F8 04F9 04F8
+04F9 04F9 04F8
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_ucs2_turkish_ci_casefold.test b/mysql-test/main/ctype_ucs2_turkish_ci_casefold.test
new file mode 100644
index 00000000000..d9447679610
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_turkish_ci_casefold.test
@@ -0,0 +1,14 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET @@collation_connection=ucs2_turkish_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.result b/mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.result
new file mode 100644
index 00000000000..ecac75b27eb
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.result
@@ -0,0 +1,2011 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET @@collation_connection=ucs2_unicode_520_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+ucs2_unicode_520_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0069 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0049
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0180 0180 0243
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019A 019A 023D
+019C 026F 019C
+019D 0272 019D
+019E 019E 0220
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0220 019E 0220
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+023A 2C65 023A
+023B 023C 023B
+023C 023C 023B
+023D 019A 023D
+023E 2C66 023E
+023F 023F 2C7E
+0240 0240 2C7F
+0241 0242 0241
+0242 0242 0241
+0243 0180 0243
+0244 0289 0244
+0245 028C 0245
+0246 0247 0246
+0247 0247 0246
+0248 0249 0248
+0249 0249 0248
+024A 024B 024A
+024B 024B 024A
+024C 024D 024C
+024D 024D 024C
+024E 024F 024E
+024F 024F 024E
+0250 0250 2C6F
+0251 0251 2C6D
+0252 0252 2C70
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026B 026B 2C62
+026F 026F 019C
+0271 0271 2C6E
+0272 0272 019D
+0275 0275 019F
+027D 027D 2C64
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+0289 0289 0244
+028A 028A 01B1
+028B 028B 01B2
+028C 028C 0245
+0292 0292 01B7
+0345 0345 0399
+0370 0371 0370
+0371 0371 0370
+0372 0373 0372
+0373 0373 0372
+0376 0377 0376
+0377 0377 0376
+037B 037B 03FD
+037C 037C 03FE
+037D 037D 03FF
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03CF 03D7 03CF
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03D7 03D7 03CF
+03D8 03D9 03D8
+03D9 03D9 03D8
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03F9
+03F4 03B8 03F4
+03F5 03F5 0395
+03F7 03F8 03F7
+03F8 03F8 03F7
+03F9 03F2 03F9
+03FA 03FB 03FA
+03FB 03FB 03FA
+03FD 037B 03FD
+03FE 037C 03FE
+03FF 037D 03FF
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048A 048B 048A
+048B 048B 048A
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C0 04CF 04C0
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C5 04C6 04C5
+04C6 04C6 04C5
+04C7 04C8 04C7
+04C8 04C8 04C7
+04C9 04CA 04C9
+04CA 04CA 04C9
+04CB 04CC 04CB
+04CC 04CC 04CB
+04CD 04CE 04CD
+04CE 04CE 04CD
+04CF 04CF 04C0
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F6 04F7 04F6
+04F7 04F7 04F6
+04F8 04F9 04F8
+04F9 04F9 04F8
+04FA 04FB 04FA
+04FB 04FB 04FA
+04FC 04FD 04FC
+04FD 04FD 04FC
+04FE 04FF 04FE
+04FF 04FF 04FE
+0500 0501 0500
+0501 0501 0500
+0502 0503 0502
+0503 0503 0502
+0504 0505 0504
+0505 0505 0504
+0506 0507 0506
+0507 0507 0506
+0508 0509 0508
+0509 0509 0508
+050A 050B 050A
+050B 050B 050A
+050C 050D 050C
+050D 050D 050C
+050E 050F 050E
+050F 050F 050E
+0510 0511 0510
+0511 0511 0510
+0512 0513 0512
+0513 0513 0512
+0514 0515 0514
+0515 0515 0514
+0516 0517 0516
+0517 0517 0516
+0518 0519 0518
+0519 0519 0518
+051A 051B 051A
+051B 051B 051A
+051C 051D 051C
+051D 051D 051C
+051E 051F 051E
+051F 051F 051E
+0520 0521 0520
+0521 0521 0520
+0522 0523 0522
+0523 0523 0522
+0524 0525 0524
+0525 0525 0524
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+10A0 2D00 10A0
+10A1 2D01 10A1
+10A2 2D02 10A2
+10A3 2D03 10A3
+10A4 2D04 10A4
+10A5 2D05 10A5
+10A6 2D06 10A6
+10A7 2D07 10A7
+10A8 2D08 10A8
+10A9 2D09 10A9
+10AA 2D0A 10AA
+10AB 2D0B 10AB
+10AC 2D0C 10AC
+10AD 2D0D 10AD
+10AE 2D0E 10AE
+10AF 2D0F 10AF
+10B0 2D10 10B0
+10B1 2D11 10B1
+10B2 2D12 10B2
+10B3 2D13 10B3
+10B4 2D14 10B4
+10B5 2D15 10B5
+10B6 2D16 10B6
+10B7 2D17 10B7
+10B8 2D18 10B8
+10B9 2D19 10B9
+10BA 2D1A 10BA
+10BB 2D1B 10BB
+10BC 2D1C 10BC
+10BD 2D1D 10BD
+10BE 2D1E 10BE
+10BF 2D1F 10BF
+10C0 2D20 10C0
+10C1 2D21 10C1
+10C2 2D22 10C2
+10C3 2D23 10C3
+10C4 2D24 10C4
+10C5 2D25 10C5
+1D79 1D79 A77D
+1D7D 1D7D 2C63
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1E9E 00DF 1E9E
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1EFA 1EFB 1EFA
+1EFB 1EFB 1EFA
+1EFC 1EFD 1EFC
+1EFD 1EFD 1EFC
+1EFE 1EFF 1EFE
+1EFF 1EFF 1EFE
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2132 214E 2132
+214E 214E 2132
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+2183 2184 2183
+2184 2184 2183
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+2C00 2C30 2C00
+2C01 2C31 2C01
+2C02 2C32 2C02
+2C03 2C33 2C03
+2C04 2C34 2C04
+2C05 2C35 2C05
+2C06 2C36 2C06
+2C07 2C37 2C07
+2C08 2C38 2C08
+2C09 2C39 2C09
+2C0A 2C3A 2C0A
+2C0B 2C3B 2C0B
+2C0C 2C3C 2C0C
+2C0D 2C3D 2C0D
+2C0E 2C3E 2C0E
+2C0F 2C3F 2C0F
+2C10 2C40 2C10
+2C11 2C41 2C11
+2C12 2C42 2C12
+2C13 2C43 2C13
+2C14 2C44 2C14
+2C15 2C45 2C15
+2C16 2C46 2C16
+2C17 2C47 2C17
+2C18 2C48 2C18
+2C19 2C49 2C19
+2C1A 2C4A 2C1A
+2C1B 2C4B 2C1B
+2C1C 2C4C 2C1C
+2C1D 2C4D 2C1D
+2C1E 2C4E 2C1E
+2C1F 2C4F 2C1F
+2C20 2C50 2C20
+2C21 2C51 2C21
+2C22 2C52 2C22
+2C23 2C53 2C23
+2C24 2C54 2C24
+2C25 2C55 2C25
+2C26 2C56 2C26
+2C27 2C57 2C27
+2C28 2C58 2C28
+2C29 2C59 2C29
+2C2A 2C5A 2C2A
+2C2B 2C5B 2C2B
+2C2C 2C5C 2C2C
+2C2D 2C5D 2C2D
+2C2E 2C5E 2C2E
+2C30 2C30 2C00
+2C31 2C31 2C01
+2C32 2C32 2C02
+2C33 2C33 2C03
+2C34 2C34 2C04
+2C35 2C35 2C05
+2C36 2C36 2C06
+2C37 2C37 2C07
+2C38 2C38 2C08
+2C39 2C39 2C09
+2C3A 2C3A 2C0A
+2C3B 2C3B 2C0B
+2C3C 2C3C 2C0C
+2C3D 2C3D 2C0D
+2C3E 2C3E 2C0E
+2C3F 2C3F 2C0F
+2C40 2C40 2C10
+2C41 2C41 2C11
+2C42 2C42 2C12
+2C43 2C43 2C13
+2C44 2C44 2C14
+2C45 2C45 2C15
+2C46 2C46 2C16
+2C47 2C47 2C17
+2C48 2C48 2C18
+2C49 2C49 2C19
+2C4A 2C4A 2C1A
+2C4B 2C4B 2C1B
+2C4C 2C4C 2C1C
+2C4D 2C4D 2C1D
+2C4E 2C4E 2C1E
+2C4F 2C4F 2C1F
+2C50 2C50 2C20
+2C51 2C51 2C21
+2C52 2C52 2C22
+2C53 2C53 2C23
+2C54 2C54 2C24
+2C55 2C55 2C25
+2C56 2C56 2C26
+2C57 2C57 2C27
+2C58 2C58 2C28
+2C59 2C59 2C29
+2C5A 2C5A 2C2A
+2C5B 2C5B 2C2B
+2C5C 2C5C 2C2C
+2C5D 2C5D 2C2D
+2C5E 2C5E 2C2E
+2C60 2C61 2C60
+2C61 2C61 2C60
+2C62 026B 2C62
+2C63 1D7D 2C63
+2C64 027D 2C64
+2C65 2C65 023A
+2C66 2C66 023E
+2C67 2C68 2C67
+2C68 2C68 2C67
+2C69 2C6A 2C69
+2C6A 2C6A 2C69
+2C6B 2C6C 2C6B
+2C6C 2C6C 2C6B
+2C6D 0251 2C6D
+2C6E 0271 2C6E
+2C6F 0250 2C6F
+2C70 0252 2C70
+2C72 2C73 2C72
+2C73 2C73 2C72
+2C75 2C76 2C75
+2C76 2C76 2C75
+2C7E 023F 2C7E
+2C7F 0240 2C7F
+2C80 2C81 2C80
+2C81 2C81 2C80
+2C82 2C83 2C82
+2C83 2C83 2C82
+2C84 2C85 2C84
+2C85 2C85 2C84
+2C86 2C87 2C86
+2C87 2C87 2C86
+2C88 2C89 2C88
+2C89 2C89 2C88
+2C8A 2C8B 2C8A
+2C8B 2C8B 2C8A
+2C8C 2C8D 2C8C
+2C8D 2C8D 2C8C
+2C8E 2C8F 2C8E
+2C8F 2C8F 2C8E
+2C90 2C91 2C90
+2C91 2C91 2C90
+2C92 2C93 2C92
+2C93 2C93 2C92
+2C94 2C95 2C94
+2C95 2C95 2C94
+2C96 2C97 2C96
+2C97 2C97 2C96
+2C98 2C99 2C98
+2C99 2C99 2C98
+2C9A 2C9B 2C9A
+2C9B 2C9B 2C9A
+2C9C 2C9D 2C9C
+2C9D 2C9D 2C9C
+2C9E 2C9F 2C9E
+2C9F 2C9F 2C9E
+2CA0 2CA1 2CA0
+2CA1 2CA1 2CA0
+2CA2 2CA3 2CA2
+2CA3 2CA3 2CA2
+2CA4 2CA5 2CA4
+2CA5 2CA5 2CA4
+2CA6 2CA7 2CA6
+2CA7 2CA7 2CA6
+2CA8 2CA9 2CA8
+2CA9 2CA9 2CA8
+2CAA 2CAB 2CAA
+2CAB 2CAB 2CAA
+2CAC 2CAD 2CAC
+2CAD 2CAD 2CAC
+2CAE 2CAF 2CAE
+2CAF 2CAF 2CAE
+2CB0 2CB1 2CB0
+2CB1 2CB1 2CB0
+2CB2 2CB3 2CB2
+2CB3 2CB3 2CB2
+2CB4 2CB5 2CB4
+2CB5 2CB5 2CB4
+2CB6 2CB7 2CB6
+2CB7 2CB7 2CB6
+2CB8 2CB9 2CB8
+2CB9 2CB9 2CB8
+2CBA 2CBB 2CBA
+2CBB 2CBB 2CBA
+2CBC 2CBD 2CBC
+2CBD 2CBD 2CBC
+2CBE 2CBF 2CBE
+2CBF 2CBF 2CBE
+2CC0 2CC1 2CC0
+2CC1 2CC1 2CC0
+2CC2 2CC3 2CC2
+2CC3 2CC3 2CC2
+2CC4 2CC5 2CC4
+2CC5 2CC5 2CC4
+2CC6 2CC7 2CC6
+2CC7 2CC7 2CC6
+2CC8 2CC9 2CC8
+2CC9 2CC9 2CC8
+2CCA 2CCB 2CCA
+2CCB 2CCB 2CCA
+2CCC 2CCD 2CCC
+2CCD 2CCD 2CCC
+2CCE 2CCF 2CCE
+2CCF 2CCF 2CCE
+2CD0 2CD1 2CD0
+2CD1 2CD1 2CD0
+2CD2 2CD3 2CD2
+2CD3 2CD3 2CD2
+2CD4 2CD5 2CD4
+2CD5 2CD5 2CD4
+2CD6 2CD7 2CD6
+2CD7 2CD7 2CD6
+2CD8 2CD9 2CD8
+2CD9 2CD9 2CD8
+2CDA 2CDB 2CDA
+2CDB 2CDB 2CDA
+2CDC 2CDD 2CDC
+2CDD 2CDD 2CDC
+2CDE 2CDF 2CDE
+2CDF 2CDF 2CDE
+2CE0 2CE1 2CE0
+2CE1 2CE1 2CE0
+2CE2 2CE3 2CE2
+2CE3 2CE3 2CE2
+2CEB 2CEC 2CEB
+2CEC 2CEC 2CEB
+2CED 2CEE 2CED
+2CEE 2CEE 2CED
+2D00 2D00 10A0
+2D01 2D01 10A1
+2D02 2D02 10A2
+2D03 2D03 10A3
+2D04 2D04 10A4
+2D05 2D05 10A5
+2D06 2D06 10A6
+2D07 2D07 10A7
+2D08 2D08 10A8
+2D09 2D09 10A9
+2D0A 2D0A 10AA
+2D0B 2D0B 10AB
+2D0C 2D0C 10AC
+2D0D 2D0D 10AD
+2D0E 2D0E 10AE
+2D0F 2D0F 10AF
+2D10 2D10 10B0
+2D11 2D11 10B1
+2D12 2D12 10B2
+2D13 2D13 10B3
+2D14 2D14 10B4
+2D15 2D15 10B5
+2D16 2D16 10B6
+2D17 2D17 10B7
+2D18 2D18 10B8
+2D19 2D19 10B9
+2D1A 2D1A 10BA
+2D1B 2D1B 10BB
+2D1C 2D1C 10BC
+2D1D 2D1D 10BD
+2D1E 2D1E 10BE
+2D1F 2D1F 10BF
+2D20 2D20 10C0
+2D21 2D21 10C1
+2D22 2D22 10C2
+2D23 2D23 10C3
+2D24 2D24 10C4
+2D25 2D25 10C5
+A640 A641 A640
+A641 A641 A640
+A642 A643 A642
+A643 A643 A642
+A644 A645 A644
+A645 A645 A644
+A646 A647 A646
+A647 A647 A646
+A648 A649 A648
+A649 A649 A648
+A64A A64B A64A
+A64B A64B A64A
+A64C A64D A64C
+A64D A64D A64C
+A64E A64F A64E
+A64F A64F A64E
+A650 A651 A650
+A651 A651 A650
+A652 A653 A652
+A653 A653 A652
+A654 A655 A654
+A655 A655 A654
+A656 A657 A656
+A657 A657 A656
+A658 A659 A658
+A659 A659 A658
+A65A A65B A65A
+A65B A65B A65A
+A65C A65D A65C
+A65D A65D A65C
+A65E A65F A65E
+A65F A65F A65E
+A662 A663 A662
+A663 A663 A662
+A664 A665 A664
+A665 A665 A664
+A666 A667 A666
+A667 A667 A666
+A668 A669 A668
+A669 A669 A668
+A66A A66B A66A
+A66B A66B A66A
+A66C A66D A66C
+A66D A66D A66C
+A680 A681 A680
+A681 A681 A680
+A682 A683 A682
+A683 A683 A682
+A684 A685 A684
+A685 A685 A684
+A686 A687 A686
+A687 A687 A686
+A688 A689 A688
+A689 A689 A688
+A68A A68B A68A
+A68B A68B A68A
+A68C A68D A68C
+A68D A68D A68C
+A68E A68F A68E
+A68F A68F A68E
+A690 A691 A690
+A691 A691 A690
+A692 A693 A692
+A693 A693 A692
+A694 A695 A694
+A695 A695 A694
+A696 A697 A696
+A697 A697 A696
+A722 A723 A722
+A723 A723 A722
+A724 A725 A724
+A725 A725 A724
+A726 A727 A726
+A727 A727 A726
+A728 A729 A728
+A729 A729 A728
+A72A A72B A72A
+A72B A72B A72A
+A72C A72D A72C
+A72D A72D A72C
+A72E A72F A72E
+A72F A72F A72E
+A732 A733 A732
+A733 A733 A732
+A734 A735 A734
+A735 A735 A734
+A736 A737 A736
+A737 A737 A736
+A738 A739 A738
+A739 A739 A738
+A73A A73B A73A
+A73B A73B A73A
+A73C A73D A73C
+A73D A73D A73C
+A73E A73F A73E
+A73F A73F A73E
+A740 A741 A740
+A741 A741 A740
+A742 A743 A742
+A743 A743 A742
+A744 A745 A744
+A745 A745 A744
+A746 A747 A746
+A747 A747 A746
+A748 A749 A748
+A749 A749 A748
+A74A A74B A74A
+A74B A74B A74A
+A74C A74D A74C
+A74D A74D A74C
+A74E A74F A74E
+A74F A74F A74E
+A750 A751 A750
+A751 A751 A750
+A752 A753 A752
+A753 A753 A752
+A754 A755 A754
+A755 A755 A754
+A756 A757 A756
+A757 A757 A756
+A758 A759 A758
+A759 A759 A758
+A75A A75B A75A
+A75B A75B A75A
+A75C A75D A75C
+A75D A75D A75C
+A75E A75F A75E
+A75F A75F A75E
+A760 A761 A760
+A761 A761 A760
+A762 A763 A762
+A763 A763 A762
+A764 A765 A764
+A765 A765 A764
+A766 A767 A766
+A767 A767 A766
+A768 A769 A768
+A769 A769 A768
+A76A A76B A76A
+A76B A76B A76A
+A76C A76D A76C
+A76D A76D A76C
+A76E A76F A76E
+A76F A76F A76E
+A779 A77A A779
+A77A A77A A779
+A77B A77C A77B
+A77C A77C A77B
+A77D 1D79 A77D
+A77E A77F A77E
+A77F A77F A77E
+A780 A781 A780
+A781 A781 A780
+A782 A783 A782
+A783 A783 A782
+A784 A785 A784
+A785 A785 A784
+A786 A787 A786
+A787 A787 A786
+A78B A78C A78B
+A78C A78C A78B
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.test b/mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.test
new file mode 100644
index 00000000000..a60bf66cfa7
--- /dev/null
+++ b/mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.test
@@ -0,0 +1,14 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET @@collation_connection=ucs2_unicode_520_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_ujis.result b/mysql-test/main/ctype_ujis.result
index 177a609f446..35bfce8eb5a 100644
--- a/mysql-test/main/ctype_ujis.result
+++ b/mysql-test/main/ctype_ujis.result
@@ -1,5 +1,281 @@
drop table if exists t1;
set names ujis;
+#
+# General tests
+#
+SET NAMES ujis;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 ujis_japanese_ci
+name ujis_japanese_ci
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+Aa 41,61
+Bb 42,62
+Cc 43,63
+Dd 44,64
+Ee 45,65
+Ff 46,66
+Gg 47,67
+Hh 48,68
+Ii 49,69
+Jj 4A,6A
+Kk 4B,6B
+Ll 4C,6C
+Mm 4D,6D
+Nn 4E,6E
+Oo 4F,6F
+Pp 50,70
+Qq 51,71
+Rr 52,72
+Ss 53,73
+Tt 54,74
+Uu 55,75
+Vv 56,76
+Ww 57,77
+Xx 58,78
+Yy 59,79
+Zz 5A,7A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
+SET NAMES ujis COLLATE ujis_bin;
+drop table if exists t1;
+create table t1 select repeat('a',10) as c1;
+delete from t1;
+insert into t1 values (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07),(0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
+insert into t1 values (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17),(0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
+insert into t1 values (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27),(0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
+insert into t1 values (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37),(0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
+insert into t1 values (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47),(0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
+insert into t1 values (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57),(0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
+insert into t1 values (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67),(0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
+insert into t1 values (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77),(0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
+create view v1 as select c1, if(c1 < 0x20 OR c1=0x7F, concat('<',hex(c1),'>'),c1) as name from t1;
+select column_name, collation_name from information_schema.columns where table_schema=database() and table_name='v1';
+column_name collation_name
+c1 ujis_bin
+name ujis_bin
+SELECT GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR ''), GROUP_CONCAT(hex(c1) ORDER BY BINARY c1) FROM v1 GROUP BY c1;
+GROUP_CONCAT(name ORDER BY binary c1 SEPARATOR '') GROUP_CONCAT(hex(c1) ORDER BY BINARY c1)
+<00> 00
+<01> 01
+<02> 02
+<03> 03
+<04> 04
+<05> 05
+<06> 06
+<07> 07
+<08> 08
+<09> 09
+<0A> 0A
+<0B> 0B
+<0C> 0C
+<0D> 0D
+<0E> 0E
+<0F> 0F
+<10> 10
+<11> 11
+<12> 12
+<13> 13
+<14> 14
+<15> 15
+<16> 16
+<17> 17
+<18> 18
+<19> 19
+<1A> 1A
+<1B> 1B
+<1C> 1C
+<1D> 1D
+<1E> 1E
+<1F> 1F
+ 20
+! 21
+" 22
+# 23
+$ 24
+% 25
+& 26
+' 27
+( 28
+) 29
+* 2A
++ 2B
+, 2C
+- 2D
+. 2E
+/ 2F
+0 30
+1 31
+2 32
+3 33
+4 34
+5 35
+6 36
+7 37
+8 38
+9 39
+: 3A
+; 3B
+< 3C
+= 3D
+> 3E
+? 3F
+@ 40
+A 41
+B 42
+C 43
+D 44
+E 45
+F 46
+G 47
+H 48
+I 49
+J 4A
+K 4B
+L 4C
+M 4D
+N 4E
+O 4F
+P 50
+Q 51
+R 52
+S 53
+T 54
+U 55
+V 56
+W 57
+X 58
+Y 59
+Z 5A
+[ 5B
+\ 5C
+] 5D
+^ 5E
+_ 5F
+` 60
+a 61
+b 62
+c 63
+d 64
+e 65
+f 66
+g 67
+h 68
+i 69
+j 6A
+k 6B
+l 6C
+m 6D
+n 6E
+o 6F
+p 70
+q 71
+r 72
+s 73
+t 74
+u 75
+v 76
+w 77
+x 78
+y 79
+z 7A
+{ 7B
+| 7C
+} 7D
+~ 7E
+<7F> 7F
+drop table t1;
+drop view v1;
+SET NAMES ujis;
create table t1 (c text character set ujis);
insert into t1 values (0xa4a2),(0xa4a3);
select hex(left(c,1)) from t1 group by c;
diff --git a/mysql-test/main/ctype_ujis.test b/mysql-test/main/ctype_ujis.test
index 8b0ba671abc..320231a9762 100644
--- a/mysql-test/main/ctype_ujis.test
+++ b/mysql-test/main/ctype_ujis.test
@@ -9,10 +9,20 @@ drop table if exists t1;
set names ujis;
+--echo #
+--echo # General tests
+--echo #
+
+SET NAMES ujis;
+-- source include/ctype_ascii_order.inc
+SET NAMES ujis COLLATE ujis_bin;
+-- source include/ctype_ascii_order.inc
+
#
# Test problem with LEFT()
#
+SET NAMES ujis;
create table t1 (c text character set ujis);
insert into t1 values (0xa4a2),(0xa4a3);
select hex(left(c,1)) from t1 group by c;
diff --git a/mysql-test/main/ctype_utf8.result b/mysql-test/main/ctype_utf8.result
index 58ee5751780..a10dbfea179 100644
--- a/mysql-test/main/ctype_utf8.result
+++ b/mysql-test/main/ctype_utf8.result
@@ -11578,8 +11578,8 @@ DROP TABLE t1;
# MDEV-20890 Illegal mix of collations with UUID()
#
SET NAMES utf8 COLLATE utf8_unicode_ci;
-SELECT uuid()>'';
-uuid()>''
+SELECT sys_guid()>'';
+sys_guid()>''
1
#
# MDEV-8844 Unreadable control characters printed as is in warnings
diff --git a/mysql-test/main/ctype_utf8.test b/mysql-test/main/ctype_utf8.test
index c39a9bbb8f4..99b952cdfb8 100644
--- a/mysql-test/main/ctype_utf8.test
+++ b/mysql-test/main/ctype_utf8.test
@@ -2490,7 +2490,7 @@ DROP TABLE t1;
--echo #
SET NAMES utf8 COLLATE utf8_unicode_ci;
-SELECT uuid()>'';
+SELECT sys_guid()>'';
--echo #
diff --git a/mysql-test/main/ctype_utf8mb3_general_ci_casefold.result b/mysql-test/main/ctype_utf8mb3_general_ci_casefold.result
new file mode 100644
index 00000000000..9911cb3ede7
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_general_ci_casefold.result
@@ -0,0 +1,1427 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb3 COLLATE utf8mb3_general_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb3_general_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0069 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0049
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019C 026F 019C
+019D 0272 019D
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026F 026F 019C
+0272 0272 019D
+0275 0275 019F
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+028A 028A 01B1
+028B 028B 01B2
+0292 0292 01B7
+0345 0345 0399
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03A3
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C7 04C8 04C7
+04C8 04C8 04C7
+04CB 04CC 04CB
+04CC 04CC 04CB
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F8 04F9 04F8
+04F9 04F9 04F8
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb3_general_ci_casefold.test b/mysql-test/main/ctype_utf8mb3_general_ci_casefold.test
new file mode 100644
index 00000000000..c2a77f12f01
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_general_ci_casefold.test
@@ -0,0 +1,14 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb3 COLLATE utf8mb3_general_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb3_general_ci_ws.result b/mysql-test/main/ctype_utf8mb3_general_ci_ws.result
new file mode 100644
index 00000000000..dc3221b14fb
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_general_ci_ws.result
@@ -0,0 +1,1143 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb3 COLLATE utf8mb3_general_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb3_general_ci
+SELECT HEX(codepoint) FROM v_bmp WHERE HEX(WEIGHT_STRING(c))='FFFD';
+HEX(codepoint)
+FFFD
+SELECT
+SUM(codepoint_hex4=HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_codepoint,
+SUM(codepoint_hex4<>HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_not_codepoint
+FROM v_bmp;
+count_bmp_weight_is_codepoint count_bmp_weight_is_not_codepoint
+64428 1108
+SELECT codepoint_hex4,HEX(WEIGHT_STRING(c))
+FROM v_bmp
+WHERE codepoint_hex4<>HEX(WEIGHT_STRING(c));
+codepoint_hex4 HEX(WEIGHT_STRING(c))
+0061 0041
+0062 0042
+0063 0043
+0064 0044
+0065 0045
+0066 0046
+0067 0047
+0068 0048
+0069 0049
+006A 004A
+006B 004B
+006C 004C
+006D 004D
+006E 004E
+006F 004F
+0070 0050
+0071 0051
+0072 0052
+0073 0053
+0074 0054
+0075 0055
+0076 0056
+0077 0057
+0078 0058
+0079 0059
+007A 005A
+00B5 039C
+00C0 0041
+00C1 0041
+00C2 0041
+00C3 0041
+00C4 0041
+00C5 0041
+00C7 0043
+00C8 0045
+00C9 0045
+00CA 0045
+00CB 0045
+00CC 0049
+00CD 0049
+00CE 0049
+00CF 0049
+00D1 004E
+00D2 004F
+00D3 004F
+00D4 004F
+00D5 004F
+00D6 004F
+00D9 0055
+00DA 0055
+00DB 0055
+00DC 0055
+00DD 0059
+00DF 0053
+00E0 0041
+00E1 0041
+00E2 0041
+00E3 0041
+00E4 0041
+00E5 0041
+00E6 00C6
+00E7 0043
+00E8 0045
+00E9 0045
+00EA 0045
+00EB 0045
+00EC 0049
+00ED 0049
+00EE 0049
+00EF 0049
+00F0 00D0
+00F1 004E
+00F2 004F
+00F3 004F
+00F4 004F
+00F5 004F
+00F6 004F
+00F8 00D8
+00F9 0055
+00FA 0055
+00FB 0055
+00FC 0055
+00FD 0059
+00FE 00DE
+00FF 0059
+0100 0041
+0101 0041
+0102 0041
+0103 0041
+0104 0041
+0105 0041
+0106 0043
+0107 0043
+0108 0043
+0109 0043
+010A 0043
+010B 0043
+010C 0043
+010D 0043
+010E 0044
+010F 0044
+0111 0110
+0112 0045
+0113 0045
+0114 0045
+0115 0045
+0116 0045
+0117 0045
+0118 0045
+0119 0045
+011A 0045
+011B 0045
+011C 0047
+011D 0047
+011E 0047
+011F 0047
+0120 0047
+0121 0047
+0122 0047
+0123 0047
+0124 0048
+0125 0048
+0127 0126
+0128 0049
+0129 0049
+012A 0049
+012B 0049
+012C 0049
+012D 0049
+012E 0049
+012F 0049
+0130 0049
+0131 0049
+0133 0132
+0134 004A
+0135 004A
+0136 004B
+0137 004B
+0139 004C
+013A 004C
+013B 004C
+013C 004C
+013D 004C
+013E 004C
+0140 013F
+0142 0141
+0143 004E
+0144 004E
+0145 004E
+0146 004E
+0147 004E
+0148 004E
+014B 014A
+014C 004F
+014D 004F
+014E 004F
+014F 004F
+0150 004F
+0151 004F
+0153 0152
+0154 0052
+0155 0052
+0156 0052
+0157 0052
+0158 0052
+0159 0052
+015A 0053
+015B 0053
+015C 0053
+015D 0053
+015E 0053
+015F 0053
+0160 0053
+0161 0053
+0162 0054
+0163 0054
+0164 0054
+0165 0054
+0167 0166
+0168 0055
+0169 0055
+016A 0055
+016B 0055
+016C 0055
+016D 0055
+016E 0055
+016F 0055
+0170 0055
+0171 0055
+0172 0055
+0173 0055
+0174 0057
+0175 0057
+0176 0059
+0177 0059
+0178 0059
+0179 005A
+017A 005A
+017B 005A
+017C 005A
+017D 005A
+017E 005A
+017F 0053
+0183 0182
+0185 0184
+0188 0187
+018C 018B
+0192 0191
+0195 01F6
+0199 0198
+01A0 004F
+01A1 004F
+01A3 01A2
+01A5 01A4
+01A8 01A7
+01AD 01AC
+01AF 0055
+01B0 0055
+01B4 01B3
+01B6 01B5
+01B9 01B8
+01BD 01BC
+01BF 01F7
+01C5 01C4
+01C6 01C4
+01C8 01C7
+01C9 01C7
+01CB 01CA
+01CC 01CA
+01CD 0041
+01CE 0041
+01CF 0049
+01D0 0049
+01D1 004F
+01D2 004F
+01D3 0055
+01D4 0055
+01D5 0055
+01D6 0055
+01D7 0055
+01D8 0055
+01D9 0055
+01DA 0055
+01DB 0055
+01DC 0055
+01DD 018E
+01DE 0041
+01DF 0041
+01E0 0041
+01E1 0041
+01E2 00C6
+01E3 00C6
+01E5 01E4
+01E6 0047
+01E7 0047
+01E8 004B
+01E9 004B
+01EA 004F
+01EB 004F
+01EC 004F
+01ED 004F
+01EE 01B7
+01EF 01B7
+01F0 004A
+01F2 01F1
+01F3 01F1
+01F4 0047
+01F5 0047
+01F8 004E
+01F9 004E
+01FA 0041
+01FB 0041
+01FC 00C6
+01FD 00C6
+01FE 00D8
+01FF 00D8
+0200 0041
+0201 0041
+0202 0041
+0203 0041
+0204 0045
+0205 0045
+0206 0045
+0207 0045
+0208 0049
+0209 0049
+020A 0049
+020B 0049
+020C 004F
+020D 004F
+020E 004F
+020F 004F
+0210 0052
+0211 0052
+0212 0052
+0213 0052
+0214 0055
+0215 0055
+0216 0055
+0217 0055
+0218 0053
+0219 0053
+021A 0054
+021B 0054
+021D 021C
+021E 0048
+021F 0048
+0223 0222
+0225 0224
+0226 0041
+0227 0041
+0228 0045
+0229 0045
+022A 004F
+022B 004F
+022C 004F
+022D 004F
+022E 004F
+022F 004F
+0230 004F
+0231 004F
+0232 0059
+0233 0059
+0253 0181
+0254 0186
+0256 0189
+0257 018A
+0259 018F
+025B 0190
+0260 0193
+0263 0194
+0268 0197
+0269 0196
+026F 019C
+0272 019D
+0275 019F
+0280 01A6
+0283 01A9
+0288 01AE
+028A 01B1
+028B 01B2
+0292 01B7
+0345 0399
+0386 0391
+0388 0395
+0389 0397
+038A 0399
+038C 039F
+038E 03A5
+038F 03A9
+0390 0399
+03AA 0399
+03AB 03A5
+03AC 0391
+03AD 0395
+03AE 0397
+03AF 0399
+03B0 03A5
+03B1 0391
+03B2 0392
+03B3 0393
+03B4 0394
+03B5 0395
+03B6 0396
+03B7 0397
+03B8 0398
+03B9 0399
+03BA 039A
+03BB 039B
+03BC 039C
+03BD 039D
+03BE 039E
+03BF 039F
+03C0 03A0
+03C1 03A1
+03C2 03A3
+03C3 03A3
+03C4 03A4
+03C5 03A5
+03C6 03A6
+03C7 03A7
+03C8 03A8
+03C9 03A9
+03CA 0399
+03CB 03A5
+03CC 039F
+03CD 03A5
+03CE 03A9
+03D0 0392
+03D1 0398
+03D3 03D2
+03D4 03D2
+03D5 03A6
+03D6 03A0
+03DB 03DA
+03DD 03DC
+03DF 03DE
+03E1 03E0
+03E3 03E2
+03E5 03E4
+03E7 03E6
+03E9 03E8
+03EB 03EA
+03ED 03EC
+03EF 03EE
+03F0 039A
+03F1 03A1
+03F2 03A3
+0400 0415
+0401 0415
+0403 0413
+0407 0406
+040C 041A
+040D 0418
+040E 0423
+0430 0410
+0431 0411
+0432 0412
+0433 0413
+0434 0414
+0435 0415
+0436 0416
+0437 0417
+0438 0418
+0439 0419
+043A 041A
+043B 041B
+043C 041C
+043D 041D
+043E 041E
+043F 041F
+0440 0420
+0441 0421
+0442 0422
+0443 0423
+0444 0424
+0445 0425
+0446 0426
+0447 0427
+0448 0428
+0449 0429
+044A 042A
+044B 042B
+044C 042C
+044D 042D
+044E 042E
+044F 042F
+0450 0415
+0451 0415
+0452 0402
+0453 0413
+0454 0404
+0455 0405
+0456 0406
+0457 0406
+0458 0408
+0459 0409
+045A 040A
+045B 040B
+045C 041A
+045D 0418
+045E 0423
+045F 040F
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046B 046A
+046D 046C
+046F 046E
+0471 0470
+0473 0472
+0475 0474
+0476 0474
+0477 0474
+0479 0478
+047B 047A
+047D 047C
+047F 047E
+0481 0480
+048D 048C
+048F 048E
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049B 049A
+049D 049C
+049F 049E
+04A1 04A0
+04A3 04A2
+04A5 04A4
+04A7 04A6
+04A9 04A8
+04AB 04AA
+04AD 04AC
+04AF 04AE
+04B1 04B0
+04B3 04B2
+04B5 04B4
+04B7 04B6
+04B9 04B8
+04BB 04BA
+04BD 04BC
+04BF 04BE
+04C1 0416
+04C2 0416
+04C4 04C3
+04C8 04C7
+04CC 04CB
+04D0 0410
+04D1 0410
+04D2 0410
+04D3 0410
+04D5 04D4
+04D6 0415
+04D7 0415
+04D9 04D8
+04DA 04D8
+04DB 04D8
+04DC 0416
+04DD 0416
+04DE 0417
+04DF 0417
+04E1 04E0
+04E2 0418
+04E3 0418
+04E4 0418
+04E5 0418
+04E6 041E
+04E7 041E
+04E9 04E8
+04EA 04E8
+04EB 04E8
+04EC 042D
+04ED 042D
+04EE 0423
+04EF 0423
+04F0 0423
+04F1 0423
+04F2 0423
+04F3 0423
+04F4 0427
+04F5 0427
+04F8 042B
+04F9 042B
+0561 0531
+0562 0532
+0563 0533
+0564 0534
+0565 0535
+0566 0536
+0567 0537
+0568 0538
+0569 0539
+056A 053A
+056B 053B
+056C 053C
+056D 053D
+056E 053E
+056F 053F
+0570 0540
+0571 0541
+0572 0542
+0573 0543
+0574 0544
+0575 0545
+0576 0546
+0577 0547
+0578 0548
+0579 0549
+057A 054A
+057B 054B
+057C 054C
+057D 054D
+057E 054E
+057F 054F
+0580 0550
+0581 0551
+0582 0552
+0583 0553
+0584 0554
+0585 0555
+0586 0556
+1E00 0041
+1E01 0041
+1E02 0042
+1E03 0042
+1E04 0042
+1E05 0042
+1E06 0042
+1E07 0042
+1E08 0043
+1E09 0043
+1E0A 0044
+1E0B 0044
+1E0C 0044
+1E0D 0044
+1E0E 0044
+1E0F 0044
+1E10 0044
+1E11 0044
+1E12 0044
+1E13 0044
+1E14 0045
+1E15 0045
+1E16 0045
+1E17 0045
+1E18 0045
+1E19 0045
+1E1A 0045
+1E1B 0045
+1E1C 0045
+1E1D 0045
+1E1E 0046
+1E1F 0046
+1E20 0047
+1E21 0047
+1E22 0048
+1E23 0048
+1E24 0048
+1E25 0048
+1E26 0048
+1E27 0048
+1E28 0048
+1E29 0048
+1E2A 0048
+1E2B 0048
+1E2C 0049
+1E2D 0049
+1E2E 0049
+1E2F 0049
+1E30 004B
+1E31 004B
+1E32 004B
+1E33 004B
+1E34 004B
+1E35 004B
+1E36 004C
+1E37 004C
+1E38 004C
+1E39 004C
+1E3A 004C
+1E3B 004C
+1E3C 004C
+1E3D 004C
+1E3E 004D
+1E3F 004D
+1E40 004D
+1E41 004D
+1E42 004D
+1E43 004D
+1E44 004E
+1E45 004E
+1E46 004E
+1E47 004E
+1E48 004E
+1E49 004E
+1E4A 004E
+1E4B 004E
+1E4C 004F
+1E4D 004F
+1E4E 004F
+1E4F 004F
+1E50 004F
+1E51 004F
+1E52 004F
+1E53 004F
+1E54 0050
+1E55 0050
+1E56 0050
+1E57 0050
+1E58 0052
+1E59 0052
+1E5A 0052
+1E5B 0052
+1E5C 0052
+1E5D 0052
+1E5E 0052
+1E5F 0052
+1E60 0053
+1E61 0053
+1E62 0053
+1E63 0053
+1E64 0053
+1E65 0053
+1E66 0053
+1E67 0053
+1E68 0053
+1E69 0053
+1E6A 0054
+1E6B 0054
+1E6C 0054
+1E6D 0054
+1E6E 0054
+1E6F 0054
+1E70 0054
+1E71 0054
+1E72 0055
+1E73 0055
+1E74 0055
+1E75 0055
+1E76 0055
+1E77 0055
+1E78 0055
+1E79 0055
+1E7A 0055
+1E7B 0055
+1E7C 0056
+1E7D 0056
+1E7E 0056
+1E7F 0056
+1E80 0057
+1E81 0057
+1E82 0057
+1E83 0057
+1E84 0057
+1E85 0057
+1E86 0057
+1E87 0057
+1E88 0057
+1E89 0057
+1E8A 0058
+1E8B 0058
+1E8C 0058
+1E8D 0058
+1E8E 0059
+1E8F 0059
+1E90 005A
+1E91 005A
+1E92 005A
+1E93 005A
+1E94 005A
+1E95 005A
+1E96 0048
+1E97 0054
+1E98 0057
+1E99 0059
+1E9B 0053
+1EA0 0041
+1EA1 0041
+1EA2 0041
+1EA3 0041
+1EA4 0041
+1EA5 0041
+1EA6 0041
+1EA7 0041
+1EA8 0041
+1EA9 0041
+1EAA 0041
+1EAB 0041
+1EAC 0041
+1EAD 0041
+1EAE 0041
+1EAF 0041
+1EB0 0041
+1EB1 0041
+1EB2 0041
+1EB3 0041
+1EB4 0041
+1EB5 0041
+1EB6 0041
+1EB7 0041
+1EB8 0045
+1EB9 0045
+1EBA 0045
+1EBB 0045
+1EBC 0045
+1EBD 0045
+1EBE 0045
+1EBF 0045
+1EC0 0045
+1EC1 0045
+1EC2 0045
+1EC3 0045
+1EC4 0045
+1EC5 0045
+1EC6 0045
+1EC7 0045
+1EC8 0049
+1EC9 0049
+1ECA 0049
+1ECB 0049
+1ECC 004F
+1ECD 004F
+1ECE 004F
+1ECF 004F
+1ED0 004F
+1ED1 004F
+1ED2 004F
+1ED3 004F
+1ED4 004F
+1ED5 004F
+1ED6 004F
+1ED7 004F
+1ED8 004F
+1ED9 004F
+1EDA 004F
+1EDB 004F
+1EDC 004F
+1EDD 004F
+1EDE 004F
+1EDF 004F
+1EE0 004F
+1EE1 004F
+1EE2 004F
+1EE3 004F
+1EE4 0055
+1EE5 0055
+1EE6 0055
+1EE7 0055
+1EE8 0055
+1EE9 0055
+1EEA 0055
+1EEB 0055
+1EEC 0055
+1EED 0055
+1EEE 0055
+1EEF 0055
+1EF0 0055
+1EF1 0055
+1EF2 0059
+1EF3 0059
+1EF4 0059
+1EF5 0059
+1EF6 0059
+1EF7 0059
+1EF8 0059
+1EF9 0059
+1F00 0391
+1F01 0391
+1F02 0391
+1F03 0391
+1F04 0391
+1F05 0391
+1F06 0391
+1F07 0391
+1F08 0391
+1F09 0391
+1F0A 0391
+1F0B 0391
+1F0C 0391
+1F0D 0391
+1F0E 0391
+1F0F 0391
+1F10 0395
+1F11 0395
+1F12 0395
+1F13 0395
+1F14 0395
+1F15 0395
+1F18 0395
+1F19 0395
+1F1A 0395
+1F1B 0395
+1F1C 0395
+1F1D 0395
+1F20 0397
+1F21 0397
+1F22 0397
+1F23 0397
+1F24 0397
+1F25 0397
+1F26 0397
+1F27 0397
+1F28 0397
+1F29 0397
+1F2A 0397
+1F2B 0397
+1F2C 0397
+1F2D 0397
+1F2E 0397
+1F2F 0397
+1F30 0399
+1F31 0399
+1F32 0399
+1F33 0399
+1F34 0399
+1F35 0399
+1F36 0399
+1F37 0399
+1F38 0399
+1F39 0399
+1F3A 0399
+1F3B 0399
+1F3C 0399
+1F3D 0399
+1F3E 0399
+1F3F 0399
+1F40 039F
+1F41 039F
+1F42 039F
+1F43 039F
+1F44 039F
+1F45 039F
+1F48 039F
+1F49 039F
+1F4A 039F
+1F4B 039F
+1F4C 039F
+1F4D 039F
+1F50 03A5
+1F51 03A5
+1F52 03A5
+1F53 03A5
+1F54 03A5
+1F55 03A5
+1F56 03A5
+1F57 03A5
+1F59 03A5
+1F5B 03A5
+1F5D 03A5
+1F5F 03A5
+1F60 03A9
+1F61 03A9
+1F62 03A9
+1F63 03A9
+1F64 03A9
+1F65 03A9
+1F66 03A9
+1F67 03A9
+1F68 03A9
+1F69 03A9
+1F6A 03A9
+1F6B 03A9
+1F6C 03A9
+1F6D 03A9
+1F6E 03A9
+1F6F 03A9
+1F70 0391
+1F71 1FBB
+1F72 0395
+1F73 1FC9
+1F74 0397
+1F75 1FCB
+1F76 0399
+1F77 1FDB
+1F78 039F
+1F79 1FF9
+1F7A 03A5
+1F7B 1FEB
+1F7C 03A9
+1F7D 1FFB
+1F80 0391
+1F81 0391
+1F82 0391
+1F83 0391
+1F84 0391
+1F85 0391
+1F86 0391
+1F87 0391
+1F88 0391
+1F89 0391
+1F8A 0391
+1F8B 0391
+1F8C 0391
+1F8D 0391
+1F8E 0391
+1F8F 0391
+1F90 0397
+1F91 0397
+1F92 0397
+1F93 0397
+1F94 0397
+1F95 0397
+1F96 0397
+1F97 0397
+1F98 0397
+1F99 0397
+1F9A 0397
+1F9B 0397
+1F9C 0397
+1F9D 0397
+1F9E 0397
+1F9F 0397
+1FA0 03A9
+1FA1 03A9
+1FA2 03A9
+1FA3 03A9
+1FA4 03A9
+1FA5 03A9
+1FA6 03A9
+1FA7 03A9
+1FA8 03A9
+1FA9 03A9
+1FAA 03A9
+1FAB 03A9
+1FAC 03A9
+1FAD 03A9
+1FAE 03A9
+1FAF 03A9
+1FB0 0391
+1FB1 0391
+1FB2 0391
+1FB3 0391
+1FB4 0391
+1FB6 0391
+1FB7 0391
+1FB8 0391
+1FB9 0391
+1FBA 0391
+1FBC 0391
+1FBE 0399
+1FC2 0397
+1FC3 0397
+1FC4 0397
+1FC6 0397
+1FC7 0397
+1FC8 0395
+1FCA 0397
+1FCC 0397
+1FD0 0399
+1FD1 0399
+1FD2 0399
+1FD6 0399
+1FD7 0399
+1FD8 0399
+1FD9 0399
+1FDA 0399
+1FE0 03A5
+1FE1 03A5
+1FE2 03A5
+1FE4 03A1
+1FE5 03A1
+1FE6 03A5
+1FE7 03A5
+1FE8 03A5
+1FE9 03A5
+1FEA 03A5
+1FEC 03A1
+1FF2 03A9
+1FF3 03A9
+1FF4 03A9
+1FF6 03A9
+1FF7 03A9
+1FF8 039F
+1FFA 03A9
+1FFC 03A9
+2170 2160
+2171 2161
+2172 2162
+2173 2163
+2174 2164
+2175 2165
+2176 2166
+2177 2167
+2178 2168
+2179 2169
+217A 216A
+217B 216B
+217C 216C
+217D 216D
+217E 216E
+217F 216F
+24D0 24B6
+24D1 24B7
+24D2 24B8
+24D3 24B9
+24D4 24BA
+24D5 24BB
+24D6 24BC
+24D7 24BD
+24D8 24BE
+24D9 24BF
+24DA 24C0
+24DB 24C1
+24DC 24C2
+24DD 24C3
+24DE 24C4
+24DF 24C5
+24E0 24C6
+24E1 24C7
+24E2 24C8
+24E3 24C9
+24E4 24CA
+24E5 24CB
+24E6 24CC
+24E7 24CD
+24E8 24CE
+24E9 24CF
+FF41 FF21
+FF42 FF22
+FF43 FF23
+FF44 FF24
+FF45 FF25
+FF46 FF26
+FF47 FF27
+FF48 FF28
+FF49 FF29
+FF4A FF2A
+FF4B FF2B
+FF4C FF2C
+FF4D FF2D
+FF4E FF2E
+FF4F FF2F
+FF50 FF30
+FF51 FF31
+FF52 FF32
+FF53 FF33
+FF54 FF34
+FF55 FF35
+FF56 FF36
+FF57 FF37
+FF58 FF38
+FF59 FF39
+FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb3_general_ci_ws.test b/mysql-test/main/ctype_utf8mb3_general_ci_ws.test
new file mode 100644
index 00000000000..58430cc1a9f
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_general_ci_ws.test
@@ -0,0 +1,14 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb3 COLLATE utf8mb3_general_ci;
+--source include/ctype_unicode_ws_bmp.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.result b/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.result
new file mode 100644
index 00000000000..b6a73e811ca
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.result
@@ -0,0 +1,1427 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb3 COLLATE utf8mb3_general_mysql500_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb3_general_mysql500_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0069 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0049
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019C 026F 019C
+019D 0272 019D
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026F 026F 019C
+0272 0272 019D
+0275 0275 019F
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+028A 028A 01B1
+028B 028B 01B2
+0292 0292 01B7
+0345 0345 0399
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03A3
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C7 04C8 04C7
+04C8 04C8 04C7
+04CB 04CC 04CB
+04CC 04CC 04CB
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F8 04F9 04F8
+04F9 04F9 04F8
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.test b/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.test
new file mode 100644
index 00000000000..610c0fc7428
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.test
@@ -0,0 +1,15 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb3 COLLATE utf8mb3_general_mysql500_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.result b/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.result
new file mode 100644
index 00000000000..23076822e8f
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.result
@@ -0,0 +1,1142 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb3 COLLATE utf8mb3_general_mysql500_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb3_general_mysql500_ci
+SELECT HEX(codepoint) FROM v_bmp WHERE HEX(WEIGHT_STRING(c))='FFFD';
+HEX(codepoint)
+FFFD
+SELECT
+SUM(codepoint_hex4=HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_codepoint,
+SUM(codepoint_hex4<>HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_not_codepoint
+FROM v_bmp;
+count_bmp_weight_is_codepoint count_bmp_weight_is_not_codepoint
+64429 1107
+SELECT codepoint_hex4,HEX(WEIGHT_STRING(c))
+FROM v_bmp
+WHERE codepoint_hex4<>HEX(WEIGHT_STRING(c));
+codepoint_hex4 HEX(WEIGHT_STRING(c))
+0061 0041
+0062 0042
+0063 0043
+0064 0044
+0065 0045
+0066 0046
+0067 0047
+0068 0048
+0069 0049
+006A 004A
+006B 004B
+006C 004C
+006D 004D
+006E 004E
+006F 004F
+0070 0050
+0071 0051
+0072 0052
+0073 0053
+0074 0054
+0075 0055
+0076 0056
+0077 0057
+0078 0058
+0079 0059
+007A 005A
+00B5 039C
+00C0 0041
+00C1 0041
+00C2 0041
+00C3 0041
+00C4 0041
+00C5 0041
+00C7 0043
+00C8 0045
+00C9 0045
+00CA 0045
+00CB 0045
+00CC 0049
+00CD 0049
+00CE 0049
+00CF 0049
+00D1 004E
+00D2 004F
+00D3 004F
+00D4 004F
+00D5 004F
+00D6 004F
+00D9 0055
+00DA 0055
+00DB 0055
+00DC 0055
+00DD 0059
+00E0 0041
+00E1 0041
+00E2 0041
+00E3 0041
+00E4 0041
+00E5 0041
+00E6 00C6
+00E7 0043
+00E8 0045
+00E9 0045
+00EA 0045
+00EB 0045
+00EC 0049
+00ED 0049
+00EE 0049
+00EF 0049
+00F0 00D0
+00F1 004E
+00F2 004F
+00F3 004F
+00F4 004F
+00F5 004F
+00F6 004F
+00F8 00D8
+00F9 0055
+00FA 0055
+00FB 0055
+00FC 0055
+00FD 0059
+00FE 00DE
+00FF 0059
+0100 0041
+0101 0041
+0102 0041
+0103 0041
+0104 0041
+0105 0041
+0106 0043
+0107 0043
+0108 0043
+0109 0043
+010A 0043
+010B 0043
+010C 0043
+010D 0043
+010E 0044
+010F 0044
+0111 0110
+0112 0045
+0113 0045
+0114 0045
+0115 0045
+0116 0045
+0117 0045
+0118 0045
+0119 0045
+011A 0045
+011B 0045
+011C 0047
+011D 0047
+011E 0047
+011F 0047
+0120 0047
+0121 0047
+0122 0047
+0123 0047
+0124 0048
+0125 0048
+0127 0126
+0128 0049
+0129 0049
+012A 0049
+012B 0049
+012C 0049
+012D 0049
+012E 0049
+012F 0049
+0130 0049
+0131 0049
+0133 0132
+0134 004A
+0135 004A
+0136 004B
+0137 004B
+0139 004C
+013A 004C
+013B 004C
+013C 004C
+013D 004C
+013E 004C
+0140 013F
+0142 0141
+0143 004E
+0144 004E
+0145 004E
+0146 004E
+0147 004E
+0148 004E
+014B 014A
+014C 004F
+014D 004F
+014E 004F
+014F 004F
+0150 004F
+0151 004F
+0153 0152
+0154 0052
+0155 0052
+0156 0052
+0157 0052
+0158 0052
+0159 0052
+015A 0053
+015B 0053
+015C 0053
+015D 0053
+015E 0053
+015F 0053
+0160 0053
+0161 0053
+0162 0054
+0163 0054
+0164 0054
+0165 0054
+0167 0166
+0168 0055
+0169 0055
+016A 0055
+016B 0055
+016C 0055
+016D 0055
+016E 0055
+016F 0055
+0170 0055
+0171 0055
+0172 0055
+0173 0055
+0174 0057
+0175 0057
+0176 0059
+0177 0059
+0178 0059
+0179 005A
+017A 005A
+017B 005A
+017C 005A
+017D 005A
+017E 005A
+017F 0053
+0183 0182
+0185 0184
+0188 0187
+018C 018B
+0192 0191
+0195 01F6
+0199 0198
+01A0 004F
+01A1 004F
+01A3 01A2
+01A5 01A4
+01A8 01A7
+01AD 01AC
+01AF 0055
+01B0 0055
+01B4 01B3
+01B6 01B5
+01B9 01B8
+01BD 01BC
+01BF 01F7
+01C5 01C4
+01C6 01C4
+01C8 01C7
+01C9 01C7
+01CB 01CA
+01CC 01CA
+01CD 0041
+01CE 0041
+01CF 0049
+01D0 0049
+01D1 004F
+01D2 004F
+01D3 0055
+01D4 0055
+01D5 0055
+01D6 0055
+01D7 0055
+01D8 0055
+01D9 0055
+01DA 0055
+01DB 0055
+01DC 0055
+01DD 018E
+01DE 0041
+01DF 0041
+01E0 0041
+01E1 0041
+01E2 00C6
+01E3 00C6
+01E5 01E4
+01E6 0047
+01E7 0047
+01E8 004B
+01E9 004B
+01EA 004F
+01EB 004F
+01EC 004F
+01ED 004F
+01EE 01B7
+01EF 01B7
+01F0 004A
+01F2 01F1
+01F3 01F1
+01F4 0047
+01F5 0047
+01F8 004E
+01F9 004E
+01FA 0041
+01FB 0041
+01FC 00C6
+01FD 00C6
+01FE 00D8
+01FF 00D8
+0200 0041
+0201 0041
+0202 0041
+0203 0041
+0204 0045
+0205 0045
+0206 0045
+0207 0045
+0208 0049
+0209 0049
+020A 0049
+020B 0049
+020C 004F
+020D 004F
+020E 004F
+020F 004F
+0210 0052
+0211 0052
+0212 0052
+0213 0052
+0214 0055
+0215 0055
+0216 0055
+0217 0055
+0218 0053
+0219 0053
+021A 0054
+021B 0054
+021D 021C
+021E 0048
+021F 0048
+0223 0222
+0225 0224
+0226 0041
+0227 0041
+0228 0045
+0229 0045
+022A 004F
+022B 004F
+022C 004F
+022D 004F
+022E 004F
+022F 004F
+0230 004F
+0231 004F
+0232 0059
+0233 0059
+0253 0181
+0254 0186
+0256 0189
+0257 018A
+0259 018F
+025B 0190
+0260 0193
+0263 0194
+0268 0197
+0269 0196
+026F 019C
+0272 019D
+0275 019F
+0280 01A6
+0283 01A9
+0288 01AE
+028A 01B1
+028B 01B2
+0292 01B7
+0345 0399
+0386 0391
+0388 0395
+0389 0397
+038A 0399
+038C 039F
+038E 03A5
+038F 03A9
+0390 0399
+03AA 0399
+03AB 03A5
+03AC 0391
+03AD 0395
+03AE 0397
+03AF 0399
+03B0 03A5
+03B1 0391
+03B2 0392
+03B3 0393
+03B4 0394
+03B5 0395
+03B6 0396
+03B7 0397
+03B8 0398
+03B9 0399
+03BA 039A
+03BB 039B
+03BC 039C
+03BD 039D
+03BE 039E
+03BF 039F
+03C0 03A0
+03C1 03A1
+03C2 03A3
+03C3 03A3
+03C4 03A4
+03C5 03A5
+03C6 03A6
+03C7 03A7
+03C8 03A8
+03C9 03A9
+03CA 0399
+03CB 03A5
+03CC 039F
+03CD 03A5
+03CE 03A9
+03D0 0392
+03D1 0398
+03D3 03D2
+03D4 03D2
+03D5 03A6
+03D6 03A0
+03DB 03DA
+03DD 03DC
+03DF 03DE
+03E1 03E0
+03E3 03E2
+03E5 03E4
+03E7 03E6
+03E9 03E8
+03EB 03EA
+03ED 03EC
+03EF 03EE
+03F0 039A
+03F1 03A1
+03F2 03A3
+0400 0415
+0401 0415
+0403 0413
+0407 0406
+040C 041A
+040D 0418
+040E 0423
+0430 0410
+0431 0411
+0432 0412
+0433 0413
+0434 0414
+0435 0415
+0436 0416
+0437 0417
+0438 0418
+0439 0419
+043A 041A
+043B 041B
+043C 041C
+043D 041D
+043E 041E
+043F 041F
+0440 0420
+0441 0421
+0442 0422
+0443 0423
+0444 0424
+0445 0425
+0446 0426
+0447 0427
+0448 0428
+0449 0429
+044A 042A
+044B 042B
+044C 042C
+044D 042D
+044E 042E
+044F 042F
+0450 0415
+0451 0415
+0452 0402
+0453 0413
+0454 0404
+0455 0405
+0456 0406
+0457 0406
+0458 0408
+0459 0409
+045A 040A
+045B 040B
+045C 041A
+045D 0418
+045E 0423
+045F 040F
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046B 046A
+046D 046C
+046F 046E
+0471 0470
+0473 0472
+0475 0474
+0476 0474
+0477 0474
+0479 0478
+047B 047A
+047D 047C
+047F 047E
+0481 0480
+048D 048C
+048F 048E
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049B 049A
+049D 049C
+049F 049E
+04A1 04A0
+04A3 04A2
+04A5 04A4
+04A7 04A6
+04A9 04A8
+04AB 04AA
+04AD 04AC
+04AF 04AE
+04B1 04B0
+04B3 04B2
+04B5 04B4
+04B7 04B6
+04B9 04B8
+04BB 04BA
+04BD 04BC
+04BF 04BE
+04C1 0416
+04C2 0416
+04C4 04C3
+04C8 04C7
+04CC 04CB
+04D0 0410
+04D1 0410
+04D2 0410
+04D3 0410
+04D5 04D4
+04D6 0415
+04D7 0415
+04D9 04D8
+04DA 04D8
+04DB 04D8
+04DC 0416
+04DD 0416
+04DE 0417
+04DF 0417
+04E1 04E0
+04E2 0418
+04E3 0418
+04E4 0418
+04E5 0418
+04E6 041E
+04E7 041E
+04E9 04E8
+04EA 04E8
+04EB 04E8
+04EC 042D
+04ED 042D
+04EE 0423
+04EF 0423
+04F0 0423
+04F1 0423
+04F2 0423
+04F3 0423
+04F4 0427
+04F5 0427
+04F8 042B
+04F9 042B
+0561 0531
+0562 0532
+0563 0533
+0564 0534
+0565 0535
+0566 0536
+0567 0537
+0568 0538
+0569 0539
+056A 053A
+056B 053B
+056C 053C
+056D 053D
+056E 053E
+056F 053F
+0570 0540
+0571 0541
+0572 0542
+0573 0543
+0574 0544
+0575 0545
+0576 0546
+0577 0547
+0578 0548
+0579 0549
+057A 054A
+057B 054B
+057C 054C
+057D 054D
+057E 054E
+057F 054F
+0580 0550
+0581 0551
+0582 0552
+0583 0553
+0584 0554
+0585 0555
+0586 0556
+1E00 0041
+1E01 0041
+1E02 0042
+1E03 0042
+1E04 0042
+1E05 0042
+1E06 0042
+1E07 0042
+1E08 0043
+1E09 0043
+1E0A 0044
+1E0B 0044
+1E0C 0044
+1E0D 0044
+1E0E 0044
+1E0F 0044
+1E10 0044
+1E11 0044
+1E12 0044
+1E13 0044
+1E14 0045
+1E15 0045
+1E16 0045
+1E17 0045
+1E18 0045
+1E19 0045
+1E1A 0045
+1E1B 0045
+1E1C 0045
+1E1D 0045
+1E1E 0046
+1E1F 0046
+1E20 0047
+1E21 0047
+1E22 0048
+1E23 0048
+1E24 0048
+1E25 0048
+1E26 0048
+1E27 0048
+1E28 0048
+1E29 0048
+1E2A 0048
+1E2B 0048
+1E2C 0049
+1E2D 0049
+1E2E 0049
+1E2F 0049
+1E30 004B
+1E31 004B
+1E32 004B
+1E33 004B
+1E34 004B
+1E35 004B
+1E36 004C
+1E37 004C
+1E38 004C
+1E39 004C
+1E3A 004C
+1E3B 004C
+1E3C 004C
+1E3D 004C
+1E3E 004D
+1E3F 004D
+1E40 004D
+1E41 004D
+1E42 004D
+1E43 004D
+1E44 004E
+1E45 004E
+1E46 004E
+1E47 004E
+1E48 004E
+1E49 004E
+1E4A 004E
+1E4B 004E
+1E4C 004F
+1E4D 004F
+1E4E 004F
+1E4F 004F
+1E50 004F
+1E51 004F
+1E52 004F
+1E53 004F
+1E54 0050
+1E55 0050
+1E56 0050
+1E57 0050
+1E58 0052
+1E59 0052
+1E5A 0052
+1E5B 0052
+1E5C 0052
+1E5D 0052
+1E5E 0052
+1E5F 0052
+1E60 0053
+1E61 0053
+1E62 0053
+1E63 0053
+1E64 0053
+1E65 0053
+1E66 0053
+1E67 0053
+1E68 0053
+1E69 0053
+1E6A 0054
+1E6B 0054
+1E6C 0054
+1E6D 0054
+1E6E 0054
+1E6F 0054
+1E70 0054
+1E71 0054
+1E72 0055
+1E73 0055
+1E74 0055
+1E75 0055
+1E76 0055
+1E77 0055
+1E78 0055
+1E79 0055
+1E7A 0055
+1E7B 0055
+1E7C 0056
+1E7D 0056
+1E7E 0056
+1E7F 0056
+1E80 0057
+1E81 0057
+1E82 0057
+1E83 0057
+1E84 0057
+1E85 0057
+1E86 0057
+1E87 0057
+1E88 0057
+1E89 0057
+1E8A 0058
+1E8B 0058
+1E8C 0058
+1E8D 0058
+1E8E 0059
+1E8F 0059
+1E90 005A
+1E91 005A
+1E92 005A
+1E93 005A
+1E94 005A
+1E95 005A
+1E96 0048
+1E97 0054
+1E98 0057
+1E99 0059
+1E9B 0053
+1EA0 0041
+1EA1 0041
+1EA2 0041
+1EA3 0041
+1EA4 0041
+1EA5 0041
+1EA6 0041
+1EA7 0041
+1EA8 0041
+1EA9 0041
+1EAA 0041
+1EAB 0041
+1EAC 0041
+1EAD 0041
+1EAE 0041
+1EAF 0041
+1EB0 0041
+1EB1 0041
+1EB2 0041
+1EB3 0041
+1EB4 0041
+1EB5 0041
+1EB6 0041
+1EB7 0041
+1EB8 0045
+1EB9 0045
+1EBA 0045
+1EBB 0045
+1EBC 0045
+1EBD 0045
+1EBE 0045
+1EBF 0045
+1EC0 0045
+1EC1 0045
+1EC2 0045
+1EC3 0045
+1EC4 0045
+1EC5 0045
+1EC6 0045
+1EC7 0045
+1EC8 0049
+1EC9 0049
+1ECA 0049
+1ECB 0049
+1ECC 004F
+1ECD 004F
+1ECE 004F
+1ECF 004F
+1ED0 004F
+1ED1 004F
+1ED2 004F
+1ED3 004F
+1ED4 004F
+1ED5 004F
+1ED6 004F
+1ED7 004F
+1ED8 004F
+1ED9 004F
+1EDA 004F
+1EDB 004F
+1EDC 004F
+1EDD 004F
+1EDE 004F
+1EDF 004F
+1EE0 004F
+1EE1 004F
+1EE2 004F
+1EE3 004F
+1EE4 0055
+1EE5 0055
+1EE6 0055
+1EE7 0055
+1EE8 0055
+1EE9 0055
+1EEA 0055
+1EEB 0055
+1EEC 0055
+1EED 0055
+1EEE 0055
+1EEF 0055
+1EF0 0055
+1EF1 0055
+1EF2 0059
+1EF3 0059
+1EF4 0059
+1EF5 0059
+1EF6 0059
+1EF7 0059
+1EF8 0059
+1EF9 0059
+1F00 0391
+1F01 0391
+1F02 0391
+1F03 0391
+1F04 0391
+1F05 0391
+1F06 0391
+1F07 0391
+1F08 0391
+1F09 0391
+1F0A 0391
+1F0B 0391
+1F0C 0391
+1F0D 0391
+1F0E 0391
+1F0F 0391
+1F10 0395
+1F11 0395
+1F12 0395
+1F13 0395
+1F14 0395
+1F15 0395
+1F18 0395
+1F19 0395
+1F1A 0395
+1F1B 0395
+1F1C 0395
+1F1D 0395
+1F20 0397
+1F21 0397
+1F22 0397
+1F23 0397
+1F24 0397
+1F25 0397
+1F26 0397
+1F27 0397
+1F28 0397
+1F29 0397
+1F2A 0397
+1F2B 0397
+1F2C 0397
+1F2D 0397
+1F2E 0397
+1F2F 0397
+1F30 0399
+1F31 0399
+1F32 0399
+1F33 0399
+1F34 0399
+1F35 0399
+1F36 0399
+1F37 0399
+1F38 0399
+1F39 0399
+1F3A 0399
+1F3B 0399
+1F3C 0399
+1F3D 0399
+1F3E 0399
+1F3F 0399
+1F40 039F
+1F41 039F
+1F42 039F
+1F43 039F
+1F44 039F
+1F45 039F
+1F48 039F
+1F49 039F
+1F4A 039F
+1F4B 039F
+1F4C 039F
+1F4D 039F
+1F50 03A5
+1F51 03A5
+1F52 03A5
+1F53 03A5
+1F54 03A5
+1F55 03A5
+1F56 03A5
+1F57 03A5
+1F59 03A5
+1F5B 03A5
+1F5D 03A5
+1F5F 03A5
+1F60 03A9
+1F61 03A9
+1F62 03A9
+1F63 03A9
+1F64 03A9
+1F65 03A9
+1F66 03A9
+1F67 03A9
+1F68 03A9
+1F69 03A9
+1F6A 03A9
+1F6B 03A9
+1F6C 03A9
+1F6D 03A9
+1F6E 03A9
+1F6F 03A9
+1F70 0391
+1F71 1FBB
+1F72 0395
+1F73 1FC9
+1F74 0397
+1F75 1FCB
+1F76 0399
+1F77 1FDB
+1F78 039F
+1F79 1FF9
+1F7A 03A5
+1F7B 1FEB
+1F7C 03A9
+1F7D 1FFB
+1F80 0391
+1F81 0391
+1F82 0391
+1F83 0391
+1F84 0391
+1F85 0391
+1F86 0391
+1F87 0391
+1F88 0391
+1F89 0391
+1F8A 0391
+1F8B 0391
+1F8C 0391
+1F8D 0391
+1F8E 0391
+1F8F 0391
+1F90 0397
+1F91 0397
+1F92 0397
+1F93 0397
+1F94 0397
+1F95 0397
+1F96 0397
+1F97 0397
+1F98 0397
+1F99 0397
+1F9A 0397
+1F9B 0397
+1F9C 0397
+1F9D 0397
+1F9E 0397
+1F9F 0397
+1FA0 03A9
+1FA1 03A9
+1FA2 03A9
+1FA3 03A9
+1FA4 03A9
+1FA5 03A9
+1FA6 03A9
+1FA7 03A9
+1FA8 03A9
+1FA9 03A9
+1FAA 03A9
+1FAB 03A9
+1FAC 03A9
+1FAD 03A9
+1FAE 03A9
+1FAF 03A9
+1FB0 0391
+1FB1 0391
+1FB2 0391
+1FB3 0391
+1FB4 0391
+1FB6 0391
+1FB7 0391
+1FB8 0391
+1FB9 0391
+1FBA 0391
+1FBC 0391
+1FBE 0399
+1FC2 0397
+1FC3 0397
+1FC4 0397
+1FC6 0397
+1FC7 0397
+1FC8 0395
+1FCA 0397
+1FCC 0397
+1FD0 0399
+1FD1 0399
+1FD2 0399
+1FD6 0399
+1FD7 0399
+1FD8 0399
+1FD9 0399
+1FDA 0399
+1FE0 03A5
+1FE1 03A5
+1FE2 03A5
+1FE4 03A1
+1FE5 03A1
+1FE6 03A5
+1FE7 03A5
+1FE8 03A5
+1FE9 03A5
+1FEA 03A5
+1FEC 03A1
+1FF2 03A9
+1FF3 03A9
+1FF4 03A9
+1FF6 03A9
+1FF7 03A9
+1FF8 039F
+1FFA 03A9
+1FFC 03A9
+2170 2160
+2171 2161
+2172 2162
+2173 2163
+2174 2164
+2175 2165
+2176 2166
+2177 2167
+2178 2168
+2179 2169
+217A 216A
+217B 216B
+217C 216C
+217D 216D
+217E 216E
+217F 216F
+24D0 24B6
+24D1 24B7
+24D2 24B8
+24D3 24B9
+24D4 24BA
+24D5 24BB
+24D6 24BC
+24D7 24BD
+24D8 24BE
+24D9 24BF
+24DA 24C0
+24DB 24C1
+24DC 24C2
+24DD 24C3
+24DE 24C4
+24DF 24C5
+24E0 24C6
+24E1 24C7
+24E2 24C8
+24E3 24C9
+24E4 24CA
+24E5 24CB
+24E6 24CC
+24E7 24CD
+24E8 24CE
+24E9 24CF
+FF41 FF21
+FF42 FF22
+FF43 FF23
+FF44 FF24
+FF45 FF25
+FF46 FF26
+FF47 FF27
+FF48 FF28
+FF49 FF29
+FF4A FF2A
+FF4B FF2B
+FF4C FF2C
+FF4D FF2D
+FF4E FF2E
+FF4F FF2F
+FF50 FF30
+FF51 FF31
+FF52 FF32
+FF53 FF33
+FF54 FF34
+FF55 FF35
+FF56 FF36
+FF57 FF37
+FF58 FF38
+FF59 FF39
+FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.test b/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.test
new file mode 100644
index 00000000000..6b1ac7265e1
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.test
@@ -0,0 +1,15 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb3 COLLATE utf8mb3_general_mysql500_ci;
+--source include/ctype_unicode_ws_bmp.inc
+
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.result b/mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.result
new file mode 100644
index 00000000000..4fa0bd75b8b
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.result
@@ -0,0 +1,1427 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb3 COLLATE utf8mb3_turkish_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb3_turkish_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0131 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0130
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019C 026F 019C
+019D 0272 019D
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026F 026F 019C
+0272 0272 019D
+0275 0275 019F
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+028A 028A 01B1
+028B 028B 01B2
+0292 0292 01B7
+0345 0345 0399
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03A3
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C7 04C8 04C7
+04C8 04C8 04C7
+04CB 04CC 04CB
+04CC 04CC 04CB
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F8 04F9 04F8
+04F9 04F9 04F8
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.test b/mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.test
new file mode 100644
index 00000000000..c807afb2a97
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.test
@@ -0,0 +1,14 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb3 COLLATE utf8mb3_turkish_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.result b/mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.result
new file mode 100644
index 00000000000..f84d6e27802
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.result
@@ -0,0 +1,2011 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb3_unicode_520_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0069 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0049
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0180 0180 0243
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019A 019A 023D
+019C 026F 019C
+019D 0272 019D
+019E 019E 0220
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0220 019E 0220
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+023A 2C65 023A
+023B 023C 023B
+023C 023C 023B
+023D 019A 023D
+023E 2C66 023E
+023F 023F 2C7E
+0240 0240 2C7F
+0241 0242 0241
+0242 0242 0241
+0243 0180 0243
+0244 0289 0244
+0245 028C 0245
+0246 0247 0246
+0247 0247 0246
+0248 0249 0248
+0249 0249 0248
+024A 024B 024A
+024B 024B 024A
+024C 024D 024C
+024D 024D 024C
+024E 024F 024E
+024F 024F 024E
+0250 0250 2C6F
+0251 0251 2C6D
+0252 0252 2C70
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026B 026B 2C62
+026F 026F 019C
+0271 0271 2C6E
+0272 0272 019D
+0275 0275 019F
+027D 027D 2C64
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+0289 0289 0244
+028A 028A 01B1
+028B 028B 01B2
+028C 028C 0245
+0292 0292 01B7
+0345 0345 0399
+0370 0371 0370
+0371 0371 0370
+0372 0373 0372
+0373 0373 0372
+0376 0377 0376
+0377 0377 0376
+037B 037B 03FD
+037C 037C 03FE
+037D 037D 03FF
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03CF 03D7 03CF
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03D7 03D7 03CF
+03D8 03D9 03D8
+03D9 03D9 03D8
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03F9
+03F4 03B8 03F4
+03F5 03F5 0395
+03F7 03F8 03F7
+03F8 03F8 03F7
+03F9 03F2 03F9
+03FA 03FB 03FA
+03FB 03FB 03FA
+03FD 037B 03FD
+03FE 037C 03FE
+03FF 037D 03FF
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048A 048B 048A
+048B 048B 048A
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C0 04CF 04C0
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C5 04C6 04C5
+04C6 04C6 04C5
+04C7 04C8 04C7
+04C8 04C8 04C7
+04C9 04CA 04C9
+04CA 04CA 04C9
+04CB 04CC 04CB
+04CC 04CC 04CB
+04CD 04CE 04CD
+04CE 04CE 04CD
+04CF 04CF 04C0
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F6 04F7 04F6
+04F7 04F7 04F6
+04F8 04F9 04F8
+04F9 04F9 04F8
+04FA 04FB 04FA
+04FB 04FB 04FA
+04FC 04FD 04FC
+04FD 04FD 04FC
+04FE 04FF 04FE
+04FF 04FF 04FE
+0500 0501 0500
+0501 0501 0500
+0502 0503 0502
+0503 0503 0502
+0504 0505 0504
+0505 0505 0504
+0506 0507 0506
+0507 0507 0506
+0508 0509 0508
+0509 0509 0508
+050A 050B 050A
+050B 050B 050A
+050C 050D 050C
+050D 050D 050C
+050E 050F 050E
+050F 050F 050E
+0510 0511 0510
+0511 0511 0510
+0512 0513 0512
+0513 0513 0512
+0514 0515 0514
+0515 0515 0514
+0516 0517 0516
+0517 0517 0516
+0518 0519 0518
+0519 0519 0518
+051A 051B 051A
+051B 051B 051A
+051C 051D 051C
+051D 051D 051C
+051E 051F 051E
+051F 051F 051E
+0520 0521 0520
+0521 0521 0520
+0522 0523 0522
+0523 0523 0522
+0524 0525 0524
+0525 0525 0524
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+10A0 2D00 10A0
+10A1 2D01 10A1
+10A2 2D02 10A2
+10A3 2D03 10A3
+10A4 2D04 10A4
+10A5 2D05 10A5
+10A6 2D06 10A6
+10A7 2D07 10A7
+10A8 2D08 10A8
+10A9 2D09 10A9
+10AA 2D0A 10AA
+10AB 2D0B 10AB
+10AC 2D0C 10AC
+10AD 2D0D 10AD
+10AE 2D0E 10AE
+10AF 2D0F 10AF
+10B0 2D10 10B0
+10B1 2D11 10B1
+10B2 2D12 10B2
+10B3 2D13 10B3
+10B4 2D14 10B4
+10B5 2D15 10B5
+10B6 2D16 10B6
+10B7 2D17 10B7
+10B8 2D18 10B8
+10B9 2D19 10B9
+10BA 2D1A 10BA
+10BB 2D1B 10BB
+10BC 2D1C 10BC
+10BD 2D1D 10BD
+10BE 2D1E 10BE
+10BF 2D1F 10BF
+10C0 2D20 10C0
+10C1 2D21 10C1
+10C2 2D22 10C2
+10C3 2D23 10C3
+10C4 2D24 10C4
+10C5 2D25 10C5
+1D79 1D79 A77D
+1D7D 1D7D 2C63
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1E9E 00DF 1E9E
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1EFA 1EFB 1EFA
+1EFB 1EFB 1EFA
+1EFC 1EFD 1EFC
+1EFD 1EFD 1EFC
+1EFE 1EFF 1EFE
+1EFF 1EFF 1EFE
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2132 214E 2132
+214E 214E 2132
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+2183 2184 2183
+2184 2184 2183
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+2C00 2C30 2C00
+2C01 2C31 2C01
+2C02 2C32 2C02
+2C03 2C33 2C03
+2C04 2C34 2C04
+2C05 2C35 2C05
+2C06 2C36 2C06
+2C07 2C37 2C07
+2C08 2C38 2C08
+2C09 2C39 2C09
+2C0A 2C3A 2C0A
+2C0B 2C3B 2C0B
+2C0C 2C3C 2C0C
+2C0D 2C3D 2C0D
+2C0E 2C3E 2C0E
+2C0F 2C3F 2C0F
+2C10 2C40 2C10
+2C11 2C41 2C11
+2C12 2C42 2C12
+2C13 2C43 2C13
+2C14 2C44 2C14
+2C15 2C45 2C15
+2C16 2C46 2C16
+2C17 2C47 2C17
+2C18 2C48 2C18
+2C19 2C49 2C19
+2C1A 2C4A 2C1A
+2C1B 2C4B 2C1B
+2C1C 2C4C 2C1C
+2C1D 2C4D 2C1D
+2C1E 2C4E 2C1E
+2C1F 2C4F 2C1F
+2C20 2C50 2C20
+2C21 2C51 2C21
+2C22 2C52 2C22
+2C23 2C53 2C23
+2C24 2C54 2C24
+2C25 2C55 2C25
+2C26 2C56 2C26
+2C27 2C57 2C27
+2C28 2C58 2C28
+2C29 2C59 2C29
+2C2A 2C5A 2C2A
+2C2B 2C5B 2C2B
+2C2C 2C5C 2C2C
+2C2D 2C5D 2C2D
+2C2E 2C5E 2C2E
+2C30 2C30 2C00
+2C31 2C31 2C01
+2C32 2C32 2C02
+2C33 2C33 2C03
+2C34 2C34 2C04
+2C35 2C35 2C05
+2C36 2C36 2C06
+2C37 2C37 2C07
+2C38 2C38 2C08
+2C39 2C39 2C09
+2C3A 2C3A 2C0A
+2C3B 2C3B 2C0B
+2C3C 2C3C 2C0C
+2C3D 2C3D 2C0D
+2C3E 2C3E 2C0E
+2C3F 2C3F 2C0F
+2C40 2C40 2C10
+2C41 2C41 2C11
+2C42 2C42 2C12
+2C43 2C43 2C13
+2C44 2C44 2C14
+2C45 2C45 2C15
+2C46 2C46 2C16
+2C47 2C47 2C17
+2C48 2C48 2C18
+2C49 2C49 2C19
+2C4A 2C4A 2C1A
+2C4B 2C4B 2C1B
+2C4C 2C4C 2C1C
+2C4D 2C4D 2C1D
+2C4E 2C4E 2C1E
+2C4F 2C4F 2C1F
+2C50 2C50 2C20
+2C51 2C51 2C21
+2C52 2C52 2C22
+2C53 2C53 2C23
+2C54 2C54 2C24
+2C55 2C55 2C25
+2C56 2C56 2C26
+2C57 2C57 2C27
+2C58 2C58 2C28
+2C59 2C59 2C29
+2C5A 2C5A 2C2A
+2C5B 2C5B 2C2B
+2C5C 2C5C 2C2C
+2C5D 2C5D 2C2D
+2C5E 2C5E 2C2E
+2C60 2C61 2C60
+2C61 2C61 2C60
+2C62 026B 2C62
+2C63 1D7D 2C63
+2C64 027D 2C64
+2C65 2C65 023A
+2C66 2C66 023E
+2C67 2C68 2C67
+2C68 2C68 2C67
+2C69 2C6A 2C69
+2C6A 2C6A 2C69
+2C6B 2C6C 2C6B
+2C6C 2C6C 2C6B
+2C6D 0251 2C6D
+2C6E 0271 2C6E
+2C6F 0250 2C6F
+2C70 0252 2C70
+2C72 2C73 2C72
+2C73 2C73 2C72
+2C75 2C76 2C75
+2C76 2C76 2C75
+2C7E 023F 2C7E
+2C7F 0240 2C7F
+2C80 2C81 2C80
+2C81 2C81 2C80
+2C82 2C83 2C82
+2C83 2C83 2C82
+2C84 2C85 2C84
+2C85 2C85 2C84
+2C86 2C87 2C86
+2C87 2C87 2C86
+2C88 2C89 2C88
+2C89 2C89 2C88
+2C8A 2C8B 2C8A
+2C8B 2C8B 2C8A
+2C8C 2C8D 2C8C
+2C8D 2C8D 2C8C
+2C8E 2C8F 2C8E
+2C8F 2C8F 2C8E
+2C90 2C91 2C90
+2C91 2C91 2C90
+2C92 2C93 2C92
+2C93 2C93 2C92
+2C94 2C95 2C94
+2C95 2C95 2C94
+2C96 2C97 2C96
+2C97 2C97 2C96
+2C98 2C99 2C98
+2C99 2C99 2C98
+2C9A 2C9B 2C9A
+2C9B 2C9B 2C9A
+2C9C 2C9D 2C9C
+2C9D 2C9D 2C9C
+2C9E 2C9F 2C9E
+2C9F 2C9F 2C9E
+2CA0 2CA1 2CA0
+2CA1 2CA1 2CA0
+2CA2 2CA3 2CA2
+2CA3 2CA3 2CA2
+2CA4 2CA5 2CA4
+2CA5 2CA5 2CA4
+2CA6 2CA7 2CA6
+2CA7 2CA7 2CA6
+2CA8 2CA9 2CA8
+2CA9 2CA9 2CA8
+2CAA 2CAB 2CAA
+2CAB 2CAB 2CAA
+2CAC 2CAD 2CAC
+2CAD 2CAD 2CAC
+2CAE 2CAF 2CAE
+2CAF 2CAF 2CAE
+2CB0 2CB1 2CB0
+2CB1 2CB1 2CB0
+2CB2 2CB3 2CB2
+2CB3 2CB3 2CB2
+2CB4 2CB5 2CB4
+2CB5 2CB5 2CB4
+2CB6 2CB7 2CB6
+2CB7 2CB7 2CB6
+2CB8 2CB9 2CB8
+2CB9 2CB9 2CB8
+2CBA 2CBB 2CBA
+2CBB 2CBB 2CBA
+2CBC 2CBD 2CBC
+2CBD 2CBD 2CBC
+2CBE 2CBF 2CBE
+2CBF 2CBF 2CBE
+2CC0 2CC1 2CC0
+2CC1 2CC1 2CC0
+2CC2 2CC3 2CC2
+2CC3 2CC3 2CC2
+2CC4 2CC5 2CC4
+2CC5 2CC5 2CC4
+2CC6 2CC7 2CC6
+2CC7 2CC7 2CC6
+2CC8 2CC9 2CC8
+2CC9 2CC9 2CC8
+2CCA 2CCB 2CCA
+2CCB 2CCB 2CCA
+2CCC 2CCD 2CCC
+2CCD 2CCD 2CCC
+2CCE 2CCF 2CCE
+2CCF 2CCF 2CCE
+2CD0 2CD1 2CD0
+2CD1 2CD1 2CD0
+2CD2 2CD3 2CD2
+2CD3 2CD3 2CD2
+2CD4 2CD5 2CD4
+2CD5 2CD5 2CD4
+2CD6 2CD7 2CD6
+2CD7 2CD7 2CD6
+2CD8 2CD9 2CD8
+2CD9 2CD9 2CD8
+2CDA 2CDB 2CDA
+2CDB 2CDB 2CDA
+2CDC 2CDD 2CDC
+2CDD 2CDD 2CDC
+2CDE 2CDF 2CDE
+2CDF 2CDF 2CDE
+2CE0 2CE1 2CE0
+2CE1 2CE1 2CE0
+2CE2 2CE3 2CE2
+2CE3 2CE3 2CE2
+2CEB 2CEC 2CEB
+2CEC 2CEC 2CEB
+2CED 2CEE 2CED
+2CEE 2CEE 2CED
+2D00 2D00 10A0
+2D01 2D01 10A1
+2D02 2D02 10A2
+2D03 2D03 10A3
+2D04 2D04 10A4
+2D05 2D05 10A5
+2D06 2D06 10A6
+2D07 2D07 10A7
+2D08 2D08 10A8
+2D09 2D09 10A9
+2D0A 2D0A 10AA
+2D0B 2D0B 10AB
+2D0C 2D0C 10AC
+2D0D 2D0D 10AD
+2D0E 2D0E 10AE
+2D0F 2D0F 10AF
+2D10 2D10 10B0
+2D11 2D11 10B1
+2D12 2D12 10B2
+2D13 2D13 10B3
+2D14 2D14 10B4
+2D15 2D15 10B5
+2D16 2D16 10B6
+2D17 2D17 10B7
+2D18 2D18 10B8
+2D19 2D19 10B9
+2D1A 2D1A 10BA
+2D1B 2D1B 10BB
+2D1C 2D1C 10BC
+2D1D 2D1D 10BD
+2D1E 2D1E 10BE
+2D1F 2D1F 10BF
+2D20 2D20 10C0
+2D21 2D21 10C1
+2D22 2D22 10C2
+2D23 2D23 10C3
+2D24 2D24 10C4
+2D25 2D25 10C5
+A640 A641 A640
+A641 A641 A640
+A642 A643 A642
+A643 A643 A642
+A644 A645 A644
+A645 A645 A644
+A646 A647 A646
+A647 A647 A646
+A648 A649 A648
+A649 A649 A648
+A64A A64B A64A
+A64B A64B A64A
+A64C A64D A64C
+A64D A64D A64C
+A64E A64F A64E
+A64F A64F A64E
+A650 A651 A650
+A651 A651 A650
+A652 A653 A652
+A653 A653 A652
+A654 A655 A654
+A655 A655 A654
+A656 A657 A656
+A657 A657 A656
+A658 A659 A658
+A659 A659 A658
+A65A A65B A65A
+A65B A65B A65A
+A65C A65D A65C
+A65D A65D A65C
+A65E A65F A65E
+A65F A65F A65E
+A662 A663 A662
+A663 A663 A662
+A664 A665 A664
+A665 A665 A664
+A666 A667 A666
+A667 A667 A666
+A668 A669 A668
+A669 A669 A668
+A66A A66B A66A
+A66B A66B A66A
+A66C A66D A66C
+A66D A66D A66C
+A680 A681 A680
+A681 A681 A680
+A682 A683 A682
+A683 A683 A682
+A684 A685 A684
+A685 A685 A684
+A686 A687 A686
+A687 A687 A686
+A688 A689 A688
+A689 A689 A688
+A68A A68B A68A
+A68B A68B A68A
+A68C A68D A68C
+A68D A68D A68C
+A68E A68F A68E
+A68F A68F A68E
+A690 A691 A690
+A691 A691 A690
+A692 A693 A692
+A693 A693 A692
+A694 A695 A694
+A695 A695 A694
+A696 A697 A696
+A697 A697 A696
+A722 A723 A722
+A723 A723 A722
+A724 A725 A724
+A725 A725 A724
+A726 A727 A726
+A727 A727 A726
+A728 A729 A728
+A729 A729 A728
+A72A A72B A72A
+A72B A72B A72A
+A72C A72D A72C
+A72D A72D A72C
+A72E A72F A72E
+A72F A72F A72E
+A732 A733 A732
+A733 A733 A732
+A734 A735 A734
+A735 A735 A734
+A736 A737 A736
+A737 A737 A736
+A738 A739 A738
+A739 A739 A738
+A73A A73B A73A
+A73B A73B A73A
+A73C A73D A73C
+A73D A73D A73C
+A73E A73F A73E
+A73F A73F A73E
+A740 A741 A740
+A741 A741 A740
+A742 A743 A742
+A743 A743 A742
+A744 A745 A744
+A745 A745 A744
+A746 A747 A746
+A747 A747 A746
+A748 A749 A748
+A749 A749 A748
+A74A A74B A74A
+A74B A74B A74A
+A74C A74D A74C
+A74D A74D A74C
+A74E A74F A74E
+A74F A74F A74E
+A750 A751 A750
+A751 A751 A750
+A752 A753 A752
+A753 A753 A752
+A754 A755 A754
+A755 A755 A754
+A756 A757 A756
+A757 A757 A756
+A758 A759 A758
+A759 A759 A758
+A75A A75B A75A
+A75B A75B A75A
+A75C A75D A75C
+A75D A75D A75C
+A75E A75F A75E
+A75F A75F A75E
+A760 A761 A760
+A761 A761 A760
+A762 A763 A762
+A763 A763 A762
+A764 A765 A764
+A765 A765 A764
+A766 A767 A766
+A767 A767 A766
+A768 A769 A768
+A769 A769 A768
+A76A A76B A76A
+A76B A76B A76A
+A76C A76D A76C
+A76D A76D A76C
+A76E A76F A76E
+A76F A76F A76E
+A779 A77A A779
+A77A A77A A779
+A77B A77C A77B
+A77C A77C A77B
+A77D 1D79 A77D
+A77E A77F A77E
+A77F A77F A77E
+A780 A781 A780
+A781 A781 A780
+A782 A783 A782
+A783 A783 A782
+A784 A785 A784
+A785 A785 A784
+A786 A787 A786
+A787 A787 A786
+A78B A78C A78B
+A78C A78C A78B
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.test b/mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.test
new file mode 100644
index 00000000000..dc36bb41ab0
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.test
@@ -0,0 +1,14 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb4_general_ci_casefold.result b/mysql-test/main/ctype_utf8mb4_general_ci_casefold.result
new file mode 100644
index 00000000000..56eaba7a709
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_general_ci_casefold.result
@@ -0,0 +1,1446 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb4_general_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0069 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0049
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019C 026F 019C
+019D 0272 019D
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026F 026F 019C
+0272 0272 019D
+0275 0275 019F
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+028A 028A 01B1
+028B 028B 01B2
+0292 0292 01B7
+0345 0345 0399
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03A3
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C7 04C8 04C7
+04C8 04C8 04C7
+04CB 04CC 04CB
+04CC 04CC 04CB
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F8 04F9 04F8
+04F9 04F9 04F8
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_supplementary AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),8,''0'') AS codepoint_hex8,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_65536_to_1114111', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_supplementary LIMIT 1;
+COLLATION(c)
+utf8mb4_general_ci
+SELECT
+codepoint_hex8,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
+FROM v_supplementary
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex8 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
+DROP VIEW v_supplementary;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb4_general_ci_casefold.test b/mysql-test/main/ctype_utf8mb4_general_ci_casefold.test
new file mode 100644
index 00000000000..99bdd6a5717
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_general_ci_casefold.test
@@ -0,0 +1,15 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+--source include/ctype_unicode_casefold_supplementary.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb4_general_ci_ws.result b/mysql-test/main/ctype_utf8mb4_general_ci_ws.result
new file mode 100644
index 00000000000..57a4e556959
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_general_ci_ws.result
@@ -0,0 +1,1160 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb4_general_ci
+SELECT HEX(codepoint) FROM v_bmp WHERE HEX(WEIGHT_STRING(c))='FFFD';
+HEX(codepoint)
+FFFD
+SELECT
+SUM(codepoint_hex4=HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_codepoint,
+SUM(codepoint_hex4<>HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_not_codepoint
+FROM v_bmp;
+count_bmp_weight_is_codepoint count_bmp_weight_is_not_codepoint
+64428 1108
+SELECT codepoint_hex4,HEX(WEIGHT_STRING(c))
+FROM v_bmp
+WHERE codepoint_hex4<>HEX(WEIGHT_STRING(c));
+codepoint_hex4 HEX(WEIGHT_STRING(c))
+0061 0041
+0062 0042
+0063 0043
+0064 0044
+0065 0045
+0066 0046
+0067 0047
+0068 0048
+0069 0049
+006A 004A
+006B 004B
+006C 004C
+006D 004D
+006E 004E
+006F 004F
+0070 0050
+0071 0051
+0072 0052
+0073 0053
+0074 0054
+0075 0055
+0076 0056
+0077 0057
+0078 0058
+0079 0059
+007A 005A
+00B5 039C
+00C0 0041
+00C1 0041
+00C2 0041
+00C3 0041
+00C4 0041
+00C5 0041
+00C7 0043
+00C8 0045
+00C9 0045
+00CA 0045
+00CB 0045
+00CC 0049
+00CD 0049
+00CE 0049
+00CF 0049
+00D1 004E
+00D2 004F
+00D3 004F
+00D4 004F
+00D5 004F
+00D6 004F
+00D9 0055
+00DA 0055
+00DB 0055
+00DC 0055
+00DD 0059
+00DF 0053
+00E0 0041
+00E1 0041
+00E2 0041
+00E3 0041
+00E4 0041
+00E5 0041
+00E6 00C6
+00E7 0043
+00E8 0045
+00E9 0045
+00EA 0045
+00EB 0045
+00EC 0049
+00ED 0049
+00EE 0049
+00EF 0049
+00F0 00D0
+00F1 004E
+00F2 004F
+00F3 004F
+00F4 004F
+00F5 004F
+00F6 004F
+00F8 00D8
+00F9 0055
+00FA 0055
+00FB 0055
+00FC 0055
+00FD 0059
+00FE 00DE
+00FF 0059
+0100 0041
+0101 0041
+0102 0041
+0103 0041
+0104 0041
+0105 0041
+0106 0043
+0107 0043
+0108 0043
+0109 0043
+010A 0043
+010B 0043
+010C 0043
+010D 0043
+010E 0044
+010F 0044
+0111 0110
+0112 0045
+0113 0045
+0114 0045
+0115 0045
+0116 0045
+0117 0045
+0118 0045
+0119 0045
+011A 0045
+011B 0045
+011C 0047
+011D 0047
+011E 0047
+011F 0047
+0120 0047
+0121 0047
+0122 0047
+0123 0047
+0124 0048
+0125 0048
+0127 0126
+0128 0049
+0129 0049
+012A 0049
+012B 0049
+012C 0049
+012D 0049
+012E 0049
+012F 0049
+0130 0049
+0131 0049
+0133 0132
+0134 004A
+0135 004A
+0136 004B
+0137 004B
+0139 004C
+013A 004C
+013B 004C
+013C 004C
+013D 004C
+013E 004C
+0140 013F
+0142 0141
+0143 004E
+0144 004E
+0145 004E
+0146 004E
+0147 004E
+0148 004E
+014B 014A
+014C 004F
+014D 004F
+014E 004F
+014F 004F
+0150 004F
+0151 004F
+0153 0152
+0154 0052
+0155 0052
+0156 0052
+0157 0052
+0158 0052
+0159 0052
+015A 0053
+015B 0053
+015C 0053
+015D 0053
+015E 0053
+015F 0053
+0160 0053
+0161 0053
+0162 0054
+0163 0054
+0164 0054
+0165 0054
+0167 0166
+0168 0055
+0169 0055
+016A 0055
+016B 0055
+016C 0055
+016D 0055
+016E 0055
+016F 0055
+0170 0055
+0171 0055
+0172 0055
+0173 0055
+0174 0057
+0175 0057
+0176 0059
+0177 0059
+0178 0059
+0179 005A
+017A 005A
+017B 005A
+017C 005A
+017D 005A
+017E 005A
+017F 0053
+0183 0182
+0185 0184
+0188 0187
+018C 018B
+0192 0191
+0195 01F6
+0199 0198
+01A0 004F
+01A1 004F
+01A3 01A2
+01A5 01A4
+01A8 01A7
+01AD 01AC
+01AF 0055
+01B0 0055
+01B4 01B3
+01B6 01B5
+01B9 01B8
+01BD 01BC
+01BF 01F7
+01C5 01C4
+01C6 01C4
+01C8 01C7
+01C9 01C7
+01CB 01CA
+01CC 01CA
+01CD 0041
+01CE 0041
+01CF 0049
+01D0 0049
+01D1 004F
+01D2 004F
+01D3 0055
+01D4 0055
+01D5 0055
+01D6 0055
+01D7 0055
+01D8 0055
+01D9 0055
+01DA 0055
+01DB 0055
+01DC 0055
+01DD 018E
+01DE 0041
+01DF 0041
+01E0 0041
+01E1 0041
+01E2 00C6
+01E3 00C6
+01E5 01E4
+01E6 0047
+01E7 0047
+01E8 004B
+01E9 004B
+01EA 004F
+01EB 004F
+01EC 004F
+01ED 004F
+01EE 01B7
+01EF 01B7
+01F0 004A
+01F2 01F1
+01F3 01F1
+01F4 0047
+01F5 0047
+01F8 004E
+01F9 004E
+01FA 0041
+01FB 0041
+01FC 00C6
+01FD 00C6
+01FE 00D8
+01FF 00D8
+0200 0041
+0201 0041
+0202 0041
+0203 0041
+0204 0045
+0205 0045
+0206 0045
+0207 0045
+0208 0049
+0209 0049
+020A 0049
+020B 0049
+020C 004F
+020D 004F
+020E 004F
+020F 004F
+0210 0052
+0211 0052
+0212 0052
+0213 0052
+0214 0055
+0215 0055
+0216 0055
+0217 0055
+0218 0053
+0219 0053
+021A 0054
+021B 0054
+021D 021C
+021E 0048
+021F 0048
+0223 0222
+0225 0224
+0226 0041
+0227 0041
+0228 0045
+0229 0045
+022A 004F
+022B 004F
+022C 004F
+022D 004F
+022E 004F
+022F 004F
+0230 004F
+0231 004F
+0232 0059
+0233 0059
+0253 0181
+0254 0186
+0256 0189
+0257 018A
+0259 018F
+025B 0190
+0260 0193
+0263 0194
+0268 0197
+0269 0196
+026F 019C
+0272 019D
+0275 019F
+0280 01A6
+0283 01A9
+0288 01AE
+028A 01B1
+028B 01B2
+0292 01B7
+0345 0399
+0386 0391
+0388 0395
+0389 0397
+038A 0399
+038C 039F
+038E 03A5
+038F 03A9
+0390 0399
+03AA 0399
+03AB 03A5
+03AC 0391
+03AD 0395
+03AE 0397
+03AF 0399
+03B0 03A5
+03B1 0391
+03B2 0392
+03B3 0393
+03B4 0394
+03B5 0395
+03B6 0396
+03B7 0397
+03B8 0398
+03B9 0399
+03BA 039A
+03BB 039B
+03BC 039C
+03BD 039D
+03BE 039E
+03BF 039F
+03C0 03A0
+03C1 03A1
+03C2 03A3
+03C3 03A3
+03C4 03A4
+03C5 03A5
+03C6 03A6
+03C7 03A7
+03C8 03A8
+03C9 03A9
+03CA 0399
+03CB 03A5
+03CC 039F
+03CD 03A5
+03CE 03A9
+03D0 0392
+03D1 0398
+03D3 03D2
+03D4 03D2
+03D5 03A6
+03D6 03A0
+03DB 03DA
+03DD 03DC
+03DF 03DE
+03E1 03E0
+03E3 03E2
+03E5 03E4
+03E7 03E6
+03E9 03E8
+03EB 03EA
+03ED 03EC
+03EF 03EE
+03F0 039A
+03F1 03A1
+03F2 03A3
+0400 0415
+0401 0415
+0403 0413
+0407 0406
+040C 041A
+040D 0418
+040E 0423
+0430 0410
+0431 0411
+0432 0412
+0433 0413
+0434 0414
+0435 0415
+0436 0416
+0437 0417
+0438 0418
+0439 0419
+043A 041A
+043B 041B
+043C 041C
+043D 041D
+043E 041E
+043F 041F
+0440 0420
+0441 0421
+0442 0422
+0443 0423
+0444 0424
+0445 0425
+0446 0426
+0447 0427
+0448 0428
+0449 0429
+044A 042A
+044B 042B
+044C 042C
+044D 042D
+044E 042E
+044F 042F
+0450 0415
+0451 0415
+0452 0402
+0453 0413
+0454 0404
+0455 0405
+0456 0406
+0457 0406
+0458 0408
+0459 0409
+045A 040A
+045B 040B
+045C 041A
+045D 0418
+045E 0423
+045F 040F
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046B 046A
+046D 046C
+046F 046E
+0471 0470
+0473 0472
+0475 0474
+0476 0474
+0477 0474
+0479 0478
+047B 047A
+047D 047C
+047F 047E
+0481 0480
+048D 048C
+048F 048E
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049B 049A
+049D 049C
+049F 049E
+04A1 04A0
+04A3 04A2
+04A5 04A4
+04A7 04A6
+04A9 04A8
+04AB 04AA
+04AD 04AC
+04AF 04AE
+04B1 04B0
+04B3 04B2
+04B5 04B4
+04B7 04B6
+04B9 04B8
+04BB 04BA
+04BD 04BC
+04BF 04BE
+04C1 0416
+04C2 0416
+04C4 04C3
+04C8 04C7
+04CC 04CB
+04D0 0410
+04D1 0410
+04D2 0410
+04D3 0410
+04D5 04D4
+04D6 0415
+04D7 0415
+04D9 04D8
+04DA 04D8
+04DB 04D8
+04DC 0416
+04DD 0416
+04DE 0417
+04DF 0417
+04E1 04E0
+04E2 0418
+04E3 0418
+04E4 0418
+04E5 0418
+04E6 041E
+04E7 041E
+04E9 04E8
+04EA 04E8
+04EB 04E8
+04EC 042D
+04ED 042D
+04EE 0423
+04EF 0423
+04F0 0423
+04F1 0423
+04F2 0423
+04F3 0423
+04F4 0427
+04F5 0427
+04F8 042B
+04F9 042B
+0561 0531
+0562 0532
+0563 0533
+0564 0534
+0565 0535
+0566 0536
+0567 0537
+0568 0538
+0569 0539
+056A 053A
+056B 053B
+056C 053C
+056D 053D
+056E 053E
+056F 053F
+0570 0540
+0571 0541
+0572 0542
+0573 0543
+0574 0544
+0575 0545
+0576 0546
+0577 0547
+0578 0548
+0579 0549
+057A 054A
+057B 054B
+057C 054C
+057D 054D
+057E 054E
+057F 054F
+0580 0550
+0581 0551
+0582 0552
+0583 0553
+0584 0554
+0585 0555
+0586 0556
+1E00 0041
+1E01 0041
+1E02 0042
+1E03 0042
+1E04 0042
+1E05 0042
+1E06 0042
+1E07 0042
+1E08 0043
+1E09 0043
+1E0A 0044
+1E0B 0044
+1E0C 0044
+1E0D 0044
+1E0E 0044
+1E0F 0044
+1E10 0044
+1E11 0044
+1E12 0044
+1E13 0044
+1E14 0045
+1E15 0045
+1E16 0045
+1E17 0045
+1E18 0045
+1E19 0045
+1E1A 0045
+1E1B 0045
+1E1C 0045
+1E1D 0045
+1E1E 0046
+1E1F 0046
+1E20 0047
+1E21 0047
+1E22 0048
+1E23 0048
+1E24 0048
+1E25 0048
+1E26 0048
+1E27 0048
+1E28 0048
+1E29 0048
+1E2A 0048
+1E2B 0048
+1E2C 0049
+1E2D 0049
+1E2E 0049
+1E2F 0049
+1E30 004B
+1E31 004B
+1E32 004B
+1E33 004B
+1E34 004B
+1E35 004B
+1E36 004C
+1E37 004C
+1E38 004C
+1E39 004C
+1E3A 004C
+1E3B 004C
+1E3C 004C
+1E3D 004C
+1E3E 004D
+1E3F 004D
+1E40 004D
+1E41 004D
+1E42 004D
+1E43 004D
+1E44 004E
+1E45 004E
+1E46 004E
+1E47 004E
+1E48 004E
+1E49 004E
+1E4A 004E
+1E4B 004E
+1E4C 004F
+1E4D 004F
+1E4E 004F
+1E4F 004F
+1E50 004F
+1E51 004F
+1E52 004F
+1E53 004F
+1E54 0050
+1E55 0050
+1E56 0050
+1E57 0050
+1E58 0052
+1E59 0052
+1E5A 0052
+1E5B 0052
+1E5C 0052
+1E5D 0052
+1E5E 0052
+1E5F 0052
+1E60 0053
+1E61 0053
+1E62 0053
+1E63 0053
+1E64 0053
+1E65 0053
+1E66 0053
+1E67 0053
+1E68 0053
+1E69 0053
+1E6A 0054
+1E6B 0054
+1E6C 0054
+1E6D 0054
+1E6E 0054
+1E6F 0054
+1E70 0054
+1E71 0054
+1E72 0055
+1E73 0055
+1E74 0055
+1E75 0055
+1E76 0055
+1E77 0055
+1E78 0055
+1E79 0055
+1E7A 0055
+1E7B 0055
+1E7C 0056
+1E7D 0056
+1E7E 0056
+1E7F 0056
+1E80 0057
+1E81 0057
+1E82 0057
+1E83 0057
+1E84 0057
+1E85 0057
+1E86 0057
+1E87 0057
+1E88 0057
+1E89 0057
+1E8A 0058
+1E8B 0058
+1E8C 0058
+1E8D 0058
+1E8E 0059
+1E8F 0059
+1E90 005A
+1E91 005A
+1E92 005A
+1E93 005A
+1E94 005A
+1E95 005A
+1E96 0048
+1E97 0054
+1E98 0057
+1E99 0059
+1E9B 0053
+1EA0 0041
+1EA1 0041
+1EA2 0041
+1EA3 0041
+1EA4 0041
+1EA5 0041
+1EA6 0041
+1EA7 0041
+1EA8 0041
+1EA9 0041
+1EAA 0041
+1EAB 0041
+1EAC 0041
+1EAD 0041
+1EAE 0041
+1EAF 0041
+1EB0 0041
+1EB1 0041
+1EB2 0041
+1EB3 0041
+1EB4 0041
+1EB5 0041
+1EB6 0041
+1EB7 0041
+1EB8 0045
+1EB9 0045
+1EBA 0045
+1EBB 0045
+1EBC 0045
+1EBD 0045
+1EBE 0045
+1EBF 0045
+1EC0 0045
+1EC1 0045
+1EC2 0045
+1EC3 0045
+1EC4 0045
+1EC5 0045
+1EC6 0045
+1EC7 0045
+1EC8 0049
+1EC9 0049
+1ECA 0049
+1ECB 0049
+1ECC 004F
+1ECD 004F
+1ECE 004F
+1ECF 004F
+1ED0 004F
+1ED1 004F
+1ED2 004F
+1ED3 004F
+1ED4 004F
+1ED5 004F
+1ED6 004F
+1ED7 004F
+1ED8 004F
+1ED9 004F
+1EDA 004F
+1EDB 004F
+1EDC 004F
+1EDD 004F
+1EDE 004F
+1EDF 004F
+1EE0 004F
+1EE1 004F
+1EE2 004F
+1EE3 004F
+1EE4 0055
+1EE5 0055
+1EE6 0055
+1EE7 0055
+1EE8 0055
+1EE9 0055
+1EEA 0055
+1EEB 0055
+1EEC 0055
+1EED 0055
+1EEE 0055
+1EEF 0055
+1EF0 0055
+1EF1 0055
+1EF2 0059
+1EF3 0059
+1EF4 0059
+1EF5 0059
+1EF6 0059
+1EF7 0059
+1EF8 0059
+1EF9 0059
+1F00 0391
+1F01 0391
+1F02 0391
+1F03 0391
+1F04 0391
+1F05 0391
+1F06 0391
+1F07 0391
+1F08 0391
+1F09 0391
+1F0A 0391
+1F0B 0391
+1F0C 0391
+1F0D 0391
+1F0E 0391
+1F0F 0391
+1F10 0395
+1F11 0395
+1F12 0395
+1F13 0395
+1F14 0395
+1F15 0395
+1F18 0395
+1F19 0395
+1F1A 0395
+1F1B 0395
+1F1C 0395
+1F1D 0395
+1F20 0397
+1F21 0397
+1F22 0397
+1F23 0397
+1F24 0397
+1F25 0397
+1F26 0397
+1F27 0397
+1F28 0397
+1F29 0397
+1F2A 0397
+1F2B 0397
+1F2C 0397
+1F2D 0397
+1F2E 0397
+1F2F 0397
+1F30 0399
+1F31 0399
+1F32 0399
+1F33 0399
+1F34 0399
+1F35 0399
+1F36 0399
+1F37 0399
+1F38 0399
+1F39 0399
+1F3A 0399
+1F3B 0399
+1F3C 0399
+1F3D 0399
+1F3E 0399
+1F3F 0399
+1F40 039F
+1F41 039F
+1F42 039F
+1F43 039F
+1F44 039F
+1F45 039F
+1F48 039F
+1F49 039F
+1F4A 039F
+1F4B 039F
+1F4C 039F
+1F4D 039F
+1F50 03A5
+1F51 03A5
+1F52 03A5
+1F53 03A5
+1F54 03A5
+1F55 03A5
+1F56 03A5
+1F57 03A5
+1F59 03A5
+1F5B 03A5
+1F5D 03A5
+1F5F 03A5
+1F60 03A9
+1F61 03A9
+1F62 03A9
+1F63 03A9
+1F64 03A9
+1F65 03A9
+1F66 03A9
+1F67 03A9
+1F68 03A9
+1F69 03A9
+1F6A 03A9
+1F6B 03A9
+1F6C 03A9
+1F6D 03A9
+1F6E 03A9
+1F6F 03A9
+1F70 0391
+1F71 1FBB
+1F72 0395
+1F73 1FC9
+1F74 0397
+1F75 1FCB
+1F76 0399
+1F77 1FDB
+1F78 039F
+1F79 1FF9
+1F7A 03A5
+1F7B 1FEB
+1F7C 03A9
+1F7D 1FFB
+1F80 0391
+1F81 0391
+1F82 0391
+1F83 0391
+1F84 0391
+1F85 0391
+1F86 0391
+1F87 0391
+1F88 0391
+1F89 0391
+1F8A 0391
+1F8B 0391
+1F8C 0391
+1F8D 0391
+1F8E 0391
+1F8F 0391
+1F90 0397
+1F91 0397
+1F92 0397
+1F93 0397
+1F94 0397
+1F95 0397
+1F96 0397
+1F97 0397
+1F98 0397
+1F99 0397
+1F9A 0397
+1F9B 0397
+1F9C 0397
+1F9D 0397
+1F9E 0397
+1F9F 0397
+1FA0 03A9
+1FA1 03A9
+1FA2 03A9
+1FA3 03A9
+1FA4 03A9
+1FA5 03A9
+1FA6 03A9
+1FA7 03A9
+1FA8 03A9
+1FA9 03A9
+1FAA 03A9
+1FAB 03A9
+1FAC 03A9
+1FAD 03A9
+1FAE 03A9
+1FAF 03A9
+1FB0 0391
+1FB1 0391
+1FB2 0391
+1FB3 0391
+1FB4 0391
+1FB6 0391
+1FB7 0391
+1FB8 0391
+1FB9 0391
+1FBA 0391
+1FBC 0391
+1FBE 0399
+1FC2 0397
+1FC3 0397
+1FC4 0397
+1FC6 0397
+1FC7 0397
+1FC8 0395
+1FCA 0397
+1FCC 0397
+1FD0 0399
+1FD1 0399
+1FD2 0399
+1FD6 0399
+1FD7 0399
+1FD8 0399
+1FD9 0399
+1FDA 0399
+1FE0 03A5
+1FE1 03A5
+1FE2 03A5
+1FE4 03A1
+1FE5 03A1
+1FE6 03A5
+1FE7 03A5
+1FE8 03A5
+1FE9 03A5
+1FEA 03A5
+1FEC 03A1
+1FF2 03A9
+1FF3 03A9
+1FF4 03A9
+1FF6 03A9
+1FF7 03A9
+1FF8 039F
+1FFA 03A9
+1FFC 03A9
+2170 2160
+2171 2161
+2172 2162
+2173 2163
+2174 2164
+2175 2165
+2176 2166
+2177 2167
+2178 2168
+2179 2169
+217A 216A
+217B 216B
+217C 216C
+217D 216D
+217E 216E
+217F 216F
+24D0 24B6
+24D1 24B7
+24D2 24B8
+24D3 24B9
+24D4 24BA
+24D5 24BB
+24D6 24BC
+24D7 24BD
+24D8 24BE
+24D9 24BF
+24DA 24C0
+24DB 24C1
+24DC 24C2
+24DD 24C3
+24DE 24C4
+24DF 24C5
+24E0 24C6
+24E1 24C7
+24E2 24C8
+24E3 24C9
+24E4 24CA
+24E5 24CB
+24E6 24CC
+24E7 24CD
+24E8 24CE
+24E9 24CF
+FF41 FF21
+FF42 FF22
+FF43 FF23
+FF44 FF24
+FF45 FF25
+FF46 FF26
+FF47 FF27
+FF48 FF28
+FF49 FF29
+FF4A FF2A
+FF4B FF2B
+FF4C FF2C
+FF4D FF2D
+FF4E FF2E
+FF4F FF2F
+FF50 FF30
+FF51 FF31
+FF52 FF32
+FF53 FF33
+FF54 FF34
+FF55 FF35
+FF56 FF36
+FF57 FF37
+FF58 FF38
+FF59 FF39
+FF5A FF3A
+DROP VIEW v_bmp;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_supplementary AS
+SELECT
+ seq AS codepoint,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_65536_to_1114111', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_supplementary LIMIT 1;
+COLLATION(c)
+utf8mb4_general_ci
+SELECT
+SUM(HEX(WEIGHT_STRING(c))<>'FFFD'),
+SUM(HEX(WEIGHT_STRING(c))='FFFD')
+FROM v_supplementary;
+SUM(HEX(WEIGHT_STRING(c))<>'FFFD') SUM(HEX(WEIGHT_STRING(c))='FFFD')
+0 1048576
+DROP VIEW v_supplementary;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb4_general_ci_ws.test b/mysql-test/main/ctype_utf8mb4_general_ci_ws.test
new file mode 100644
index 00000000000..5302becdd27
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_general_ci_ws.test
@@ -0,0 +1,16 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
+--source include/ctype_unicode_ws_bmp.inc
+--source include/ctype_unicode_ws_supplementary.inc
+
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.result b/mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.result
new file mode 100644
index 00000000000..d7db9b0bb2e
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.result
@@ -0,0 +1,1446 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb4 COLLATE utf8mb4_turkish_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb4_turkish_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0131 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0130
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019C 026F 019C
+019D 0272 019D
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026F 026F 019C
+0272 0272 019D
+0275 0275 019F
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+028A 028A 01B1
+028B 028B 01B2
+0292 0292 01B7
+0345 0345 0399
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03A3
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C7 04C8 04C7
+04C8 04C8 04C7
+04CB 04CC 04CB
+04CC 04CC 04CB
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F8 04F9 04F8
+04F9 04F9 04F8
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_supplementary AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),8,''0'') AS codepoint_hex8,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_65536_to_1114111', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_supplementary LIMIT 1;
+COLLATION(c)
+utf8mb4_turkish_ci
+SELECT
+codepoint_hex8,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
+FROM v_supplementary
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex8 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
+DROP VIEW v_supplementary;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.test b/mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.test
new file mode 100644
index 00000000000..daf534a88ea
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.test
@@ -0,0 +1,15 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb4 COLLATE utf8mb4_turkish_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+--source include/ctype_unicode_casefold_supplementary.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb4_uca_allkeys400.result b/mysql-test/main/ctype_utf8mb4_uca_allkeys400.result
new file mode 100644
index 00000000000..77a180602e7
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_uca_allkeys400.result
@@ -0,0 +1,73 @@
+#
+# Start of 10.8 tests
+#
+SET NAMES utf8mb4 COLLATE utf8mb4_bin;
+CREATE TABLE allchars AS SELECT 1 AS code, ' ' AS str LIMIT 0;
+SHOW CREATE TABLE allchars;
+Table Create Table
+allchars CREATE TABLE `allchars` (
+ `code` int(1) NOT NULL,
+ `str` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t1tmp (a INT NOT NULL);
+FOR i IN 0..0xFFF
+DO
+INSERT INTO t1tmp VALUES (i);
+END FOR;
+$$
+INSERT INTO allchars SELECT
+t1.a*0x1000+t2.a,
+CHAR(t1.a*0x1000+t2.a USING utf32)
+FROM t1tmp t1, t1tmp t2
+WHERE t1.a BETWEEN 0 AND 0x10F;
+DROP TABLE t1tmp;
+SELECT COUNT(*) FROM allchars;
+COUNT(*)
+1114112
+CREATE TABLE allkeys_txt (a TEXT, b TEXT, c TEXT) ENGINE=MyISAM;
+LOAD DATA INFILE '../../std_data/unicode/allkeys400.txt'
+INTO TABLE allkeys_txt FIELDS TERMINATED BY ';' (@a,@b,@qq)
+SET a=TRIM(@a), b=TRIM(REGEXP_SUBSTR(@b,'^[^#]*')), c=TRIM(REGEXP_SUBSTR(@b, '#.*$'));
+CREATE TABLE allkeys AS
+SELECT
+a,
+CONVERT(CAST(UNHEX(regexp_replace(regexp_replace(regexp_replace(a,'(\\b[0-9A-Z]{4}\\b)','-0000\\1-'),'(\\b[0-9A-Z]{5}\\b)','-000\\1-'),'[ -]','')) AS CHAR CHARACTER SET utf32) USING utf8mb4) COLLATE utf8mb4_bin AS str,
+HEX(WEIGHT_STRING(CONVERT(CAST(UNHEX(regexp_replace(regexp_replace(regexp_replace(a,'(\\b[0-9A-Z]{4}\\b)','-0000\\1-'),'(\\b[0-9A-Z]{5}\\b)','-000\\1-'),'[ -]','')) AS CHAR CHARACTER SET utf32) USING utf8mb4) COLLATE utf8mb4_unicode_ci)) as ws,
+REPLACE(REPLACE(REGEXP_REPLACE(b,'[[][.*](....)[.]....[.]....[.].{4,5}]','-\\1-'),'-0000-',''),'-','') AS wd,
+c
+FROM allkeys_txt
+WHERE a RLIKE '^[0-9A-Z]';
+ALTER TABLE allkeys ADD KEY(str(3));
+SELECT COUNT(*), SUM(ws<>wd) FROM allkeys WHERE OCTET_LENGTH(str)<=3;
+COUNT(*) SUM(ws<>wd)
+12073 1
+SELECT a, ws, wd FROM allkeys WHERE ws<>wd AND OCTET_LENGTH(str)<=3;
+a ws wd
+FDFA FBC1FDFA 138713AB13C70209135013AB13AB13B70209138F13AB13C813B7020913BD138113AB13B0
+SELECT
+HEX(code),
+HEX(WEIGHT_STRING(str COLLATE utf8mb4_unicode_ci)) AS ws,
+CASE
+WHEN code >= 0x10000 THEN 'FFFD'
+ WHEN code >= 0x3400 AND code <= 0x4DB5 THEN
+CONCAT(LPAD(HEX(0xFB80 + (code >> 15)),4,'0'),
+LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+WHEN code >= 0x4E00 AND code <= 0x9FA5 THEN
+CONCAT(LPAD(HEX(0xFB40 + (code >> 15)),4,'0'),
+LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+ELSE
+CONCAT(LPAD(HEX(0xFBC0 + (code >> 15)),4,'0'),
+LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+END AS wd
+FROM allchars
+LEFT OUTER JOIN allkeys USING (str)
+WHERE allkeys.str IS NULL
+HAVING ws<>wd
+ORDER BY HEX(str);
+HEX(code) ws wd
+DROP TABLE allkeys_txt;
+DROP TABLE allkeys;
+DROP TABLE allchars;
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb4_uca_allkeys400.test b/mysql-test/main/ctype_utf8mb4_uca_allkeys400.test
new file mode 100644
index 00000000000..f3d891a0eeb
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_uca_allkeys400.test
@@ -0,0 +1,77 @@
+--source include/have_utf32.inc
+--source include/have_utf8mb4.inc
+
+--echo #
+--echo # Start of 10.8 tests
+--echo #
+
+
+SET NAMES utf8mb4 COLLATE utf8mb4_bin;
+--source include/ctype_unicode_allchars.inc
+
+#
+# Load allkeys.txt from Unicode-4.0.0
+#
+# The 4.0.0 file has four weight levels and an optional extra field
+# after the character name, e.g. "; QQK"
+#00A0 ; [*0209.0020.001B.00A0] # NO-BREAK SPACE; QQK
+#
+
+CREATE TABLE allkeys_txt (a TEXT, b TEXT, c TEXT) ENGINE=MyISAM;
+LOAD DATA INFILE '../../std_data/unicode/allkeys400.txt'
+INTO TABLE allkeys_txt FIELDS TERMINATED BY ';' (@a,@b,@qq)
+SET a=TRIM(@a), b=TRIM(REGEXP_SUBSTR(@b,'^[^#]*')), c=TRIM(REGEXP_SUBSTR(@b, '#.*$'));
+CREATE TABLE allkeys AS
+SELECT
+ a,
+ CONVERT(CAST(UNHEX(regexp_replace(regexp_replace(regexp_replace(a,'(\\b[0-9A-Z]{4}\\b)','-0000\\1-'),'(\\b[0-9A-Z]{5}\\b)','-000\\1-'),'[ -]','')) AS CHAR CHARACTER SET utf32) USING utf8mb4) COLLATE utf8mb4_bin AS str,
+ HEX(WEIGHT_STRING(CONVERT(CAST(UNHEX(regexp_replace(regexp_replace(regexp_replace(a,'(\\b[0-9A-Z]{4}\\b)','-0000\\1-'),'(\\b[0-9A-Z]{5}\\b)','-000\\1-'),'[ -]','')) AS CHAR CHARACTER SET utf32) USING utf8mb4) COLLATE utf8mb4_unicode_ci)) as ws,
+ REPLACE(REPLACE(REGEXP_REPLACE(b,'[[][.*](....)[.]....[.]....[.].{4,5}]','-\\1-'),'-0000-',''),'-','') AS wd,
+ c
+FROM allkeys_txt
+WHERE a RLIKE '^[0-9A-Z]';
+ALTER TABLE allkeys ADD KEY(str(3));
+
+#
+# Test explicit weights
+# utf8mb4_unicode_ci supports only BMP characters.
+# Built-in default contractions are not supported.
+# The (OCTET_LENGTH(str)<=3) part of the condition filters out
+# characters outside BMP and contractions.
+
+SELECT COUNT(*), SUM(ws<>wd) FROM allkeys WHERE OCTET_LENGTH(str)<=3;
+SELECT a, ws, wd FROM allkeys WHERE ws<>wd AND OCTET_LENGTH(str)<=3;
+
+#
+# Test implicit weights
+# Non-BMP characters all have the same weight FFFD.
+#
+
+SELECT
+ HEX(code),
+ HEX(WEIGHT_STRING(str COLLATE utf8mb4_unicode_ci)) AS ws,
+ CASE
+ WHEN code >= 0x10000 THEN 'FFFD'
+ WHEN code >= 0x3400 AND code <= 0x4DB5 THEN
+ CONCAT(LPAD(HEX(0xFB80 + (code >> 15)),4,'0'),
+ LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+ WHEN code >= 0x4E00 AND code <= 0x9FA5 THEN
+ CONCAT(LPAD(HEX(0xFB40 + (code >> 15)),4,'0'),
+ LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+ ELSE
+ CONCAT(LPAD(HEX(0xFBC0 + (code >> 15)),4,'0'),
+ LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+ END AS wd
+FROM allchars
+LEFT OUTER JOIN allkeys USING (str)
+WHERE allkeys.str IS NULL
+HAVING ws<>wd
+ORDER BY HEX(str);
+
+DROP TABLE allkeys_txt;
+DROP TABLE allkeys;
+DROP TABLE allchars;
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb4_uca_allkeys520.result b/mysql-test/main/ctype_utf8mb4_uca_allkeys520.result
new file mode 100644
index 00000000000..04d788a4055
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_uca_allkeys520.result
@@ -0,0 +1,72 @@
+#
+# Start of 10.8 tests
+#
+SET NAMES utf8mb4 COLLATE utf8mb4_bin;
+CREATE TABLE allchars AS SELECT 1 AS code, ' ' AS str LIMIT 0;
+SHOW CREATE TABLE allchars;
+Table Create Table
+allchars CREATE TABLE `allchars` (
+ `code` int(1) NOT NULL,
+ `str` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t1tmp (a INT NOT NULL);
+FOR i IN 0..0xFFF
+DO
+INSERT INTO t1tmp VALUES (i);
+END FOR;
+$$
+INSERT INTO allchars SELECT
+t1.a*0x1000+t2.a,
+CHAR(t1.a*0x1000+t2.a USING utf32)
+FROM t1tmp t1, t1tmp t2
+WHERE t1.a BETWEEN 0 AND 0x10F;
+DROP TABLE t1tmp;
+SELECT COUNT(*) FROM allchars;
+COUNT(*)
+1114112
+CREATE TABLE allkeys_txt (a TEXT, b TEXT, c TEXT) ENGINE=MyISAM;
+LOAD DATA INFILE '../../std_data/unicode/allkeys520.txt'
+INTO TABLE allkeys_txt FIELDS TERMINATED BY ';' (@a,@b,@qq)
+SET a=TRIM(@a), b=TRIM(REGEXP_SUBSTR(@b,'^[^#]*')), c=TRIM(REGEXP_SUBSTR(@b, '#.*$'));
+CREATE TABLE allkeys AS
+SELECT
+a,
+CONVERT(CAST(UNHEX(regexp_replace(regexp_replace(regexp_replace(a,'(\\b[0-9A-Z]{4}\\b)','-0000\\1-'),'(\\b[0-9A-Z]{5}\\b)','-000\\1-'),'[ -]','')) AS CHAR CHARACTER SET utf32) USING utf8mb4) COLLATE utf8mb4_bin AS str,
+HEX(WEIGHT_STRING(CONVERT(CAST(UNHEX(regexp_replace(regexp_replace(regexp_replace(a,'(\\b[0-9A-Z]{4}\\b)','-0000\\1-'),'(\\b[0-9A-Z]{5}\\b)','-000\\1-'),'[ -]','')) AS CHAR CHARACTER SET utf32) USING utf8mb4) COLLATE utf8mb4_unicode_520_ci)) as ws,
+REPLACE(REPLACE(REGEXP_REPLACE(b,'[[][.*](....)[.]....[.]....[.].{4,5}]','-\\1-'),'-0000-',''),'-','') AS wd,
+c
+FROM allkeys_txt
+WHERE a RLIKE '^[0-9A-Z]';
+ALTER TABLE allkeys ADD KEY(str(3));
+SELECT COUNT(*), SUM(ws<>wd) FROM allkeys WHERE a NOT LIKE '% %';
+COUNT(*) SUM(ws<>wd)
+21807 1
+SELECT a, ws, wd FROM allkeys WHERE ws<>wd AND a NOT LIKE '% %';
+a ws wd
+FDFA 18FC192B194F020A18AD192B192B193D 18FC192B194F020A18AD192B192B193D020A1904192B1950193D020A194318F1192B1931
+SELECT
+HEX(code),
+HEX(WEIGHT_STRING(str COLLATE utf8mb4_unicode_520_ci)) AS ws,
+CASE
+WHEN code >= 0x3400 AND code <= 0x4DB5 THEN
+CONCAT(LPAD(HEX(0xFB80 + (code >> 15)),4,'0'),
+LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+WHEN code >= 0x4E00 AND code <= 0x9FA5 THEN
+CONCAT(LPAD(HEX(0xFB40 + (code >> 15)),4,'0'),
+LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+ELSE
+CONCAT(LPAD(HEX(0xFBC0 + (code >> 15)),4,'0'),
+LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+END AS wd
+FROM allchars
+LEFT OUTER JOIN allkeys USING (str)
+WHERE allkeys.str IS NULL
+HAVING ws<>wd
+ORDER BY HEX(str);
+HEX(code) ws wd
+DROP TABLE allkeys_txt;
+DROP TABLE allkeys;
+DROP TABLE allchars;
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb4_uca_allkeys520.test b/mysql-test/main/ctype_utf8mb4_uca_allkeys520.test
new file mode 100644
index 00000000000..f58f2a466c5
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_uca_allkeys520.test
@@ -0,0 +1,75 @@
+--source include/have_utf32.inc
+--source include/have_utf8mb4.inc
+
+--echo #
+--echo # Start of 10.8 tests
+--echo #
+
+
+SET NAMES utf8mb4 COLLATE utf8mb4_bin;
+--source include/ctype_unicode_allchars.inc
+
+#
+# Load allkeys.txt from Unicode-5.2.0
+#
+# The 5.2.0 file has four weight levels and an optional extra field
+# after the character name, e.g. "; QQK"
+#00A0 ; [*020A.0020.001B.00A0] # NO-BREAK SPACE; QQK
+#
+
+CREATE TABLE allkeys_txt (a TEXT, b TEXT, c TEXT) ENGINE=MyISAM;
+LOAD DATA INFILE '../../std_data/unicode/allkeys520.txt'
+INTO TABLE allkeys_txt FIELDS TERMINATED BY ';' (@a,@b,@qq)
+SET a=TRIM(@a), b=TRIM(REGEXP_SUBSTR(@b,'^[^#]*')), c=TRIM(REGEXP_SUBSTR(@b, '#.*$'));
+CREATE TABLE allkeys AS
+SELECT
+ a,
+ CONVERT(CAST(UNHEX(regexp_replace(regexp_replace(regexp_replace(a,'(\\b[0-9A-Z]{4}\\b)','-0000\\1-'),'(\\b[0-9A-Z]{5}\\b)','-000\\1-'),'[ -]','')) AS CHAR CHARACTER SET utf32) USING utf8mb4) COLLATE utf8mb4_bin AS str,
+ HEX(WEIGHT_STRING(CONVERT(CAST(UNHEX(regexp_replace(regexp_replace(regexp_replace(a,'(\\b[0-9A-Z]{4}\\b)','-0000\\1-'),'(\\b[0-9A-Z]{5}\\b)','-000\\1-'),'[ -]','')) AS CHAR CHARACTER SET utf32) USING utf8mb4) COLLATE utf8mb4_unicode_520_ci)) as ws,
+ REPLACE(REPLACE(REGEXP_REPLACE(b,'[[][.*](....)[.]....[.]....[.].{4,5}]','-\\1-'),'-0000-',''),'-','') AS wd,
+ c
+FROM allkeys_txt
+WHERE a RLIKE '^[0-9A-Z]';
+ALTER TABLE allkeys ADD KEY(str(3));
+
+#
+# Test explicit weights
+# Built-in default contractions are not supported.
+# The (NOT LIKE '% %') part of the condition filters out contractions.
+
+SELECT COUNT(*), SUM(ws<>wd) FROM allkeys WHERE a NOT LIKE '% %';
+SELECT a, ws, wd FROM allkeys WHERE ws<>wd AND a NOT LIKE '% %';
+
+
+#
+# Test implicit weights
+# Non-BMP characters all have the same weight FFFD.
+#
+
+SELECT
+ HEX(code),
+ HEX(WEIGHT_STRING(str COLLATE utf8mb4_unicode_520_ci)) AS ws,
+ CASE
+ WHEN code >= 0x3400 AND code <= 0x4DB5 THEN
+ CONCAT(LPAD(HEX(0xFB80 + (code >> 15)),4,'0'),
+ LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+ WHEN code >= 0x4E00 AND code <= 0x9FA5 THEN
+ CONCAT(LPAD(HEX(0xFB40 + (code >> 15)),4,'0'),
+ LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+ ELSE
+ CONCAT(LPAD(HEX(0xFBC0 + (code >> 15)),4,'0'),
+ LPAD(HEX(0x8000 | (code & 0x7FFF)),4,'0'))
+ END AS wd
+FROM allchars
+LEFT OUTER JOIN allkeys USING (str)
+WHERE allkeys.str IS NULL
+HAVING ws<>wd
+ORDER BY HEX(str);
+
+DROP TABLE allkeys_txt;
+DROP TABLE allkeys;
+DROP TABLE allchars;
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.result b/mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.result
new file mode 100644
index 00000000000..5ba5251fa0c
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.result
@@ -0,0 +1,2110 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb4_unicode_520_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0069 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0049
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0180 0180 0243
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019A 019A 023D
+019C 026F 019C
+019D 0272 019D
+019E 019E 0220
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0220 019E 0220
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+023A 2C65 023A
+023B 023C 023B
+023C 023C 023B
+023D 019A 023D
+023E 2C66 023E
+023F 023F 2C7E
+0240 0240 2C7F
+0241 0242 0241
+0242 0242 0241
+0243 0180 0243
+0244 0289 0244
+0245 028C 0245
+0246 0247 0246
+0247 0247 0246
+0248 0249 0248
+0249 0249 0248
+024A 024B 024A
+024B 024B 024A
+024C 024D 024C
+024D 024D 024C
+024E 024F 024E
+024F 024F 024E
+0250 0250 2C6F
+0251 0251 2C6D
+0252 0252 2C70
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026B 026B 2C62
+026F 026F 019C
+0271 0271 2C6E
+0272 0272 019D
+0275 0275 019F
+027D 027D 2C64
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+0289 0289 0244
+028A 028A 01B1
+028B 028B 01B2
+028C 028C 0245
+0292 0292 01B7
+0345 0345 0399
+0370 0371 0370
+0371 0371 0370
+0372 0373 0372
+0373 0373 0372
+0376 0377 0376
+0377 0377 0376
+037B 037B 03FD
+037C 037C 03FE
+037D 037D 03FF
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03CF 03D7 03CF
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03D7 03D7 03CF
+03D8 03D9 03D8
+03D9 03D9 03D8
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03F9
+03F4 03B8 03F4
+03F5 03F5 0395
+03F7 03F8 03F7
+03F8 03F8 03F7
+03F9 03F2 03F9
+03FA 03FB 03FA
+03FB 03FB 03FA
+03FD 037B 03FD
+03FE 037C 03FE
+03FF 037D 03FF
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048A 048B 048A
+048B 048B 048A
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C0 04CF 04C0
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C5 04C6 04C5
+04C6 04C6 04C5
+04C7 04C8 04C7
+04C8 04C8 04C7
+04C9 04CA 04C9
+04CA 04CA 04C9
+04CB 04CC 04CB
+04CC 04CC 04CB
+04CD 04CE 04CD
+04CE 04CE 04CD
+04CF 04CF 04C0
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F6 04F7 04F6
+04F7 04F7 04F6
+04F8 04F9 04F8
+04F9 04F9 04F8
+04FA 04FB 04FA
+04FB 04FB 04FA
+04FC 04FD 04FC
+04FD 04FD 04FC
+04FE 04FF 04FE
+04FF 04FF 04FE
+0500 0501 0500
+0501 0501 0500
+0502 0503 0502
+0503 0503 0502
+0504 0505 0504
+0505 0505 0504
+0506 0507 0506
+0507 0507 0506
+0508 0509 0508
+0509 0509 0508
+050A 050B 050A
+050B 050B 050A
+050C 050D 050C
+050D 050D 050C
+050E 050F 050E
+050F 050F 050E
+0510 0511 0510
+0511 0511 0510
+0512 0513 0512
+0513 0513 0512
+0514 0515 0514
+0515 0515 0514
+0516 0517 0516
+0517 0517 0516
+0518 0519 0518
+0519 0519 0518
+051A 051B 051A
+051B 051B 051A
+051C 051D 051C
+051D 051D 051C
+051E 051F 051E
+051F 051F 051E
+0520 0521 0520
+0521 0521 0520
+0522 0523 0522
+0523 0523 0522
+0524 0525 0524
+0525 0525 0524
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+10A0 2D00 10A0
+10A1 2D01 10A1
+10A2 2D02 10A2
+10A3 2D03 10A3
+10A4 2D04 10A4
+10A5 2D05 10A5
+10A6 2D06 10A6
+10A7 2D07 10A7
+10A8 2D08 10A8
+10A9 2D09 10A9
+10AA 2D0A 10AA
+10AB 2D0B 10AB
+10AC 2D0C 10AC
+10AD 2D0D 10AD
+10AE 2D0E 10AE
+10AF 2D0F 10AF
+10B0 2D10 10B0
+10B1 2D11 10B1
+10B2 2D12 10B2
+10B3 2D13 10B3
+10B4 2D14 10B4
+10B5 2D15 10B5
+10B6 2D16 10B6
+10B7 2D17 10B7
+10B8 2D18 10B8
+10B9 2D19 10B9
+10BA 2D1A 10BA
+10BB 2D1B 10BB
+10BC 2D1C 10BC
+10BD 2D1D 10BD
+10BE 2D1E 10BE
+10BF 2D1F 10BF
+10C0 2D20 10C0
+10C1 2D21 10C1
+10C2 2D22 10C2
+10C3 2D23 10C3
+10C4 2D24 10C4
+10C5 2D25 10C5
+1D79 1D79 A77D
+1D7D 1D7D 2C63
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1E9E 00DF 1E9E
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1EFA 1EFB 1EFA
+1EFB 1EFB 1EFA
+1EFC 1EFD 1EFC
+1EFD 1EFD 1EFC
+1EFE 1EFF 1EFE
+1EFF 1EFF 1EFE
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2132 214E 2132
+214E 214E 2132
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+2183 2184 2183
+2184 2184 2183
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+2C00 2C30 2C00
+2C01 2C31 2C01
+2C02 2C32 2C02
+2C03 2C33 2C03
+2C04 2C34 2C04
+2C05 2C35 2C05
+2C06 2C36 2C06
+2C07 2C37 2C07
+2C08 2C38 2C08
+2C09 2C39 2C09
+2C0A 2C3A 2C0A
+2C0B 2C3B 2C0B
+2C0C 2C3C 2C0C
+2C0D 2C3D 2C0D
+2C0E 2C3E 2C0E
+2C0F 2C3F 2C0F
+2C10 2C40 2C10
+2C11 2C41 2C11
+2C12 2C42 2C12
+2C13 2C43 2C13
+2C14 2C44 2C14
+2C15 2C45 2C15
+2C16 2C46 2C16
+2C17 2C47 2C17
+2C18 2C48 2C18
+2C19 2C49 2C19
+2C1A 2C4A 2C1A
+2C1B 2C4B 2C1B
+2C1C 2C4C 2C1C
+2C1D 2C4D 2C1D
+2C1E 2C4E 2C1E
+2C1F 2C4F 2C1F
+2C20 2C50 2C20
+2C21 2C51 2C21
+2C22 2C52 2C22
+2C23 2C53 2C23
+2C24 2C54 2C24
+2C25 2C55 2C25
+2C26 2C56 2C26
+2C27 2C57 2C27
+2C28 2C58 2C28
+2C29 2C59 2C29
+2C2A 2C5A 2C2A
+2C2B 2C5B 2C2B
+2C2C 2C5C 2C2C
+2C2D 2C5D 2C2D
+2C2E 2C5E 2C2E
+2C30 2C30 2C00
+2C31 2C31 2C01
+2C32 2C32 2C02
+2C33 2C33 2C03
+2C34 2C34 2C04
+2C35 2C35 2C05
+2C36 2C36 2C06
+2C37 2C37 2C07
+2C38 2C38 2C08
+2C39 2C39 2C09
+2C3A 2C3A 2C0A
+2C3B 2C3B 2C0B
+2C3C 2C3C 2C0C
+2C3D 2C3D 2C0D
+2C3E 2C3E 2C0E
+2C3F 2C3F 2C0F
+2C40 2C40 2C10
+2C41 2C41 2C11
+2C42 2C42 2C12
+2C43 2C43 2C13
+2C44 2C44 2C14
+2C45 2C45 2C15
+2C46 2C46 2C16
+2C47 2C47 2C17
+2C48 2C48 2C18
+2C49 2C49 2C19
+2C4A 2C4A 2C1A
+2C4B 2C4B 2C1B
+2C4C 2C4C 2C1C
+2C4D 2C4D 2C1D
+2C4E 2C4E 2C1E
+2C4F 2C4F 2C1F
+2C50 2C50 2C20
+2C51 2C51 2C21
+2C52 2C52 2C22
+2C53 2C53 2C23
+2C54 2C54 2C24
+2C55 2C55 2C25
+2C56 2C56 2C26
+2C57 2C57 2C27
+2C58 2C58 2C28
+2C59 2C59 2C29
+2C5A 2C5A 2C2A
+2C5B 2C5B 2C2B
+2C5C 2C5C 2C2C
+2C5D 2C5D 2C2D
+2C5E 2C5E 2C2E
+2C60 2C61 2C60
+2C61 2C61 2C60
+2C62 026B 2C62
+2C63 1D7D 2C63
+2C64 027D 2C64
+2C65 2C65 023A
+2C66 2C66 023E
+2C67 2C68 2C67
+2C68 2C68 2C67
+2C69 2C6A 2C69
+2C6A 2C6A 2C69
+2C6B 2C6C 2C6B
+2C6C 2C6C 2C6B
+2C6D 0251 2C6D
+2C6E 0271 2C6E
+2C6F 0250 2C6F
+2C70 0252 2C70
+2C72 2C73 2C72
+2C73 2C73 2C72
+2C75 2C76 2C75
+2C76 2C76 2C75
+2C7E 023F 2C7E
+2C7F 0240 2C7F
+2C80 2C81 2C80
+2C81 2C81 2C80
+2C82 2C83 2C82
+2C83 2C83 2C82
+2C84 2C85 2C84
+2C85 2C85 2C84
+2C86 2C87 2C86
+2C87 2C87 2C86
+2C88 2C89 2C88
+2C89 2C89 2C88
+2C8A 2C8B 2C8A
+2C8B 2C8B 2C8A
+2C8C 2C8D 2C8C
+2C8D 2C8D 2C8C
+2C8E 2C8F 2C8E
+2C8F 2C8F 2C8E
+2C90 2C91 2C90
+2C91 2C91 2C90
+2C92 2C93 2C92
+2C93 2C93 2C92
+2C94 2C95 2C94
+2C95 2C95 2C94
+2C96 2C97 2C96
+2C97 2C97 2C96
+2C98 2C99 2C98
+2C99 2C99 2C98
+2C9A 2C9B 2C9A
+2C9B 2C9B 2C9A
+2C9C 2C9D 2C9C
+2C9D 2C9D 2C9C
+2C9E 2C9F 2C9E
+2C9F 2C9F 2C9E
+2CA0 2CA1 2CA0
+2CA1 2CA1 2CA0
+2CA2 2CA3 2CA2
+2CA3 2CA3 2CA2
+2CA4 2CA5 2CA4
+2CA5 2CA5 2CA4
+2CA6 2CA7 2CA6
+2CA7 2CA7 2CA6
+2CA8 2CA9 2CA8
+2CA9 2CA9 2CA8
+2CAA 2CAB 2CAA
+2CAB 2CAB 2CAA
+2CAC 2CAD 2CAC
+2CAD 2CAD 2CAC
+2CAE 2CAF 2CAE
+2CAF 2CAF 2CAE
+2CB0 2CB1 2CB0
+2CB1 2CB1 2CB0
+2CB2 2CB3 2CB2
+2CB3 2CB3 2CB2
+2CB4 2CB5 2CB4
+2CB5 2CB5 2CB4
+2CB6 2CB7 2CB6
+2CB7 2CB7 2CB6
+2CB8 2CB9 2CB8
+2CB9 2CB9 2CB8
+2CBA 2CBB 2CBA
+2CBB 2CBB 2CBA
+2CBC 2CBD 2CBC
+2CBD 2CBD 2CBC
+2CBE 2CBF 2CBE
+2CBF 2CBF 2CBE
+2CC0 2CC1 2CC0
+2CC1 2CC1 2CC0
+2CC2 2CC3 2CC2
+2CC3 2CC3 2CC2
+2CC4 2CC5 2CC4
+2CC5 2CC5 2CC4
+2CC6 2CC7 2CC6
+2CC7 2CC7 2CC6
+2CC8 2CC9 2CC8
+2CC9 2CC9 2CC8
+2CCA 2CCB 2CCA
+2CCB 2CCB 2CCA
+2CCC 2CCD 2CCC
+2CCD 2CCD 2CCC
+2CCE 2CCF 2CCE
+2CCF 2CCF 2CCE
+2CD0 2CD1 2CD0
+2CD1 2CD1 2CD0
+2CD2 2CD3 2CD2
+2CD3 2CD3 2CD2
+2CD4 2CD5 2CD4
+2CD5 2CD5 2CD4
+2CD6 2CD7 2CD6
+2CD7 2CD7 2CD6
+2CD8 2CD9 2CD8
+2CD9 2CD9 2CD8
+2CDA 2CDB 2CDA
+2CDB 2CDB 2CDA
+2CDC 2CDD 2CDC
+2CDD 2CDD 2CDC
+2CDE 2CDF 2CDE
+2CDF 2CDF 2CDE
+2CE0 2CE1 2CE0
+2CE1 2CE1 2CE0
+2CE2 2CE3 2CE2
+2CE3 2CE3 2CE2
+2CEB 2CEC 2CEB
+2CEC 2CEC 2CEB
+2CED 2CEE 2CED
+2CEE 2CEE 2CED
+2D00 2D00 10A0
+2D01 2D01 10A1
+2D02 2D02 10A2
+2D03 2D03 10A3
+2D04 2D04 10A4
+2D05 2D05 10A5
+2D06 2D06 10A6
+2D07 2D07 10A7
+2D08 2D08 10A8
+2D09 2D09 10A9
+2D0A 2D0A 10AA
+2D0B 2D0B 10AB
+2D0C 2D0C 10AC
+2D0D 2D0D 10AD
+2D0E 2D0E 10AE
+2D0F 2D0F 10AF
+2D10 2D10 10B0
+2D11 2D11 10B1
+2D12 2D12 10B2
+2D13 2D13 10B3
+2D14 2D14 10B4
+2D15 2D15 10B5
+2D16 2D16 10B6
+2D17 2D17 10B7
+2D18 2D18 10B8
+2D19 2D19 10B9
+2D1A 2D1A 10BA
+2D1B 2D1B 10BB
+2D1C 2D1C 10BC
+2D1D 2D1D 10BD
+2D1E 2D1E 10BE
+2D1F 2D1F 10BF
+2D20 2D20 10C0
+2D21 2D21 10C1
+2D22 2D22 10C2
+2D23 2D23 10C3
+2D24 2D24 10C4
+2D25 2D25 10C5
+A640 A641 A640
+A641 A641 A640
+A642 A643 A642
+A643 A643 A642
+A644 A645 A644
+A645 A645 A644
+A646 A647 A646
+A647 A647 A646
+A648 A649 A648
+A649 A649 A648
+A64A A64B A64A
+A64B A64B A64A
+A64C A64D A64C
+A64D A64D A64C
+A64E A64F A64E
+A64F A64F A64E
+A650 A651 A650
+A651 A651 A650
+A652 A653 A652
+A653 A653 A652
+A654 A655 A654
+A655 A655 A654
+A656 A657 A656
+A657 A657 A656
+A658 A659 A658
+A659 A659 A658
+A65A A65B A65A
+A65B A65B A65A
+A65C A65D A65C
+A65D A65D A65C
+A65E A65F A65E
+A65F A65F A65E
+A662 A663 A662
+A663 A663 A662
+A664 A665 A664
+A665 A665 A664
+A666 A667 A666
+A667 A667 A666
+A668 A669 A668
+A669 A669 A668
+A66A A66B A66A
+A66B A66B A66A
+A66C A66D A66C
+A66D A66D A66C
+A680 A681 A680
+A681 A681 A680
+A682 A683 A682
+A683 A683 A682
+A684 A685 A684
+A685 A685 A684
+A686 A687 A686
+A687 A687 A686
+A688 A689 A688
+A689 A689 A688
+A68A A68B A68A
+A68B A68B A68A
+A68C A68D A68C
+A68D A68D A68C
+A68E A68F A68E
+A68F A68F A68E
+A690 A691 A690
+A691 A691 A690
+A692 A693 A692
+A693 A693 A692
+A694 A695 A694
+A695 A695 A694
+A696 A697 A696
+A697 A697 A696
+A722 A723 A722
+A723 A723 A722
+A724 A725 A724
+A725 A725 A724
+A726 A727 A726
+A727 A727 A726
+A728 A729 A728
+A729 A729 A728
+A72A A72B A72A
+A72B A72B A72A
+A72C A72D A72C
+A72D A72D A72C
+A72E A72F A72E
+A72F A72F A72E
+A732 A733 A732
+A733 A733 A732
+A734 A735 A734
+A735 A735 A734
+A736 A737 A736
+A737 A737 A736
+A738 A739 A738
+A739 A739 A738
+A73A A73B A73A
+A73B A73B A73A
+A73C A73D A73C
+A73D A73D A73C
+A73E A73F A73E
+A73F A73F A73E
+A740 A741 A740
+A741 A741 A740
+A742 A743 A742
+A743 A743 A742
+A744 A745 A744
+A745 A745 A744
+A746 A747 A746
+A747 A747 A746
+A748 A749 A748
+A749 A749 A748
+A74A A74B A74A
+A74B A74B A74A
+A74C A74D A74C
+A74D A74D A74C
+A74E A74F A74E
+A74F A74F A74E
+A750 A751 A750
+A751 A751 A750
+A752 A753 A752
+A753 A753 A752
+A754 A755 A754
+A755 A755 A754
+A756 A757 A756
+A757 A757 A756
+A758 A759 A758
+A759 A759 A758
+A75A A75B A75A
+A75B A75B A75A
+A75C A75D A75C
+A75D A75D A75C
+A75E A75F A75E
+A75F A75F A75E
+A760 A761 A760
+A761 A761 A760
+A762 A763 A762
+A763 A763 A762
+A764 A765 A764
+A765 A765 A764
+A766 A767 A766
+A767 A767 A766
+A768 A769 A768
+A769 A769 A768
+A76A A76B A76A
+A76B A76B A76A
+A76C A76D A76C
+A76D A76D A76C
+A76E A76F A76E
+A76F A76F A76E
+A779 A77A A779
+A77A A77A A779
+A77B A77C A77B
+A77C A77C A77B
+A77D 1D79 A77D
+A77E A77F A77E
+A77F A77F A77E
+A780 A781 A780
+A781 A781 A780
+A782 A783 A782
+A783 A783 A782
+A784 A785 A784
+A785 A785 A784
+A786 A787 A786
+A787 A787 A786
+A78B A78C A78B
+A78C A78C A78B
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_supplementary AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),8,''0'') AS codepoint_hex8,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_65536_to_1114111', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_supplementary LIMIT 1;
+COLLATION(c)
+utf8mb4_unicode_520_ci
+SELECT
+codepoint_hex8,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
+FROM v_supplementary
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex8 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
+00010400 00010428 00010400
+00010401 00010429 00010401
+00010402 0001042A 00010402
+00010403 0001042B 00010403
+00010404 0001042C 00010404
+00010405 0001042D 00010405
+00010406 0001042E 00010406
+00010407 0001042F 00010407
+00010408 00010430 00010408
+00010409 00010431 00010409
+0001040A 00010432 0001040A
+0001040B 00010433 0001040B
+0001040C 00010434 0001040C
+0001040D 00010435 0001040D
+0001040E 00010436 0001040E
+0001040F 00010437 0001040F
+00010410 00010438 00010410
+00010411 00010439 00010411
+00010412 0001043A 00010412
+00010413 0001043B 00010413
+00010414 0001043C 00010414
+00010415 0001043D 00010415
+00010416 0001043E 00010416
+00010417 0001043F 00010417
+00010418 00010440 00010418
+00010419 00010441 00010419
+0001041A 00010442 0001041A
+0001041B 00010443 0001041B
+0001041C 00010444 0001041C
+0001041D 00010445 0001041D
+0001041E 00010446 0001041E
+0001041F 00010447 0001041F
+00010420 00010448 00010420
+00010421 00010449 00010421
+00010422 0001044A 00010422
+00010423 0001044B 00010423
+00010424 0001044C 00010424
+00010425 0001044D 00010425
+00010426 0001044E 00010426
+00010427 0001044F 00010427
+00010428 00010428 00010400
+00010429 00010429 00010401
+0001042A 0001042A 00010402
+0001042B 0001042B 00010403
+0001042C 0001042C 00010404
+0001042D 0001042D 00010405
+0001042E 0001042E 00010406
+0001042F 0001042F 00010407
+00010430 00010430 00010408
+00010431 00010431 00010409
+00010432 00010432 0001040A
+00010433 00010433 0001040B
+00010434 00010434 0001040C
+00010435 00010435 0001040D
+00010436 00010436 0001040E
+00010437 00010437 0001040F
+00010438 00010438 00010410
+00010439 00010439 00010411
+0001043A 0001043A 00010412
+0001043B 0001043B 00010413
+0001043C 0001043C 00010414
+0001043D 0001043D 00010415
+0001043E 0001043E 00010416
+0001043F 0001043F 00010417
+00010440 00010440 00010418
+00010441 00010441 00010419
+00010442 00010442 0001041A
+00010443 00010443 0001041B
+00010444 00010444 0001041C
+00010445 00010445 0001041D
+00010446 00010446 0001041E
+00010447 00010447 0001041F
+00010448 00010448 00010420
+00010449 00010449 00010421
+0001044A 0001044A 00010422
+0001044B 0001044B 00010423
+0001044C 0001044C 00010424
+0001044D 0001044D 00010425
+0001044E 0001044E 00010426
+0001044F 0001044F 00010427
+DROP VIEW v_supplementary;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.test b/mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.test
new file mode 100644
index 00000000000..750e5284365
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.test
@@ -0,0 +1,15 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+--source include/ctype_unicode_casefold_supplementary.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.result b/mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.result
new file mode 100644
index 00000000000..155a8f3f44c
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.result
@@ -0,0 +1,1446 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+#
+SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_bmp AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_0_to_65535', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_bmp LIMIT 1;
+COLLATION(c)
+utf8mb4_unicode_ci
+SELECT
+codepoint_hex4,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+FROM v_bmp
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex4 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
+0041 0061 0041
+0042 0062 0042
+0043 0063 0043
+0044 0064 0044
+0045 0065 0045
+0046 0066 0046
+0047 0067 0047
+0048 0068 0048
+0049 0069 0049
+004A 006A 004A
+004B 006B 004B
+004C 006C 004C
+004D 006D 004D
+004E 006E 004E
+004F 006F 004F
+0050 0070 0050
+0051 0071 0051
+0052 0072 0052
+0053 0073 0053
+0054 0074 0054
+0055 0075 0055
+0056 0076 0056
+0057 0077 0057
+0058 0078 0058
+0059 0079 0059
+005A 007A 005A
+0061 0061 0041
+0062 0062 0042
+0063 0063 0043
+0064 0064 0044
+0065 0065 0045
+0066 0066 0046
+0067 0067 0047
+0068 0068 0048
+0069 0069 0049
+006A 006A 004A
+006B 006B 004B
+006C 006C 004C
+006D 006D 004D
+006E 006E 004E
+006F 006F 004F
+0070 0070 0050
+0071 0071 0051
+0072 0072 0052
+0073 0073 0053
+0074 0074 0054
+0075 0075 0055
+0076 0076 0056
+0077 0077 0057
+0078 0078 0058
+0079 0079 0059
+007A 007A 005A
+00B5 00B5 039C
+00C0 00E0 00C0
+00C1 00E1 00C1
+00C2 00E2 00C2
+00C3 00E3 00C3
+00C4 00E4 00C4
+00C5 00E5 00C5
+00C6 00E6 00C6
+00C7 00E7 00C7
+00C8 00E8 00C8
+00C9 00E9 00C9
+00CA 00EA 00CA
+00CB 00EB 00CB
+00CC 00EC 00CC
+00CD 00ED 00CD
+00CE 00EE 00CE
+00CF 00EF 00CF
+00D0 00F0 00D0
+00D1 00F1 00D1
+00D2 00F2 00D2
+00D3 00F3 00D3
+00D4 00F4 00D4
+00D5 00F5 00D5
+00D6 00F6 00D6
+00D8 00F8 00D8
+00D9 00F9 00D9
+00DA 00FA 00DA
+00DB 00FB 00DB
+00DC 00FC 00DC
+00DD 00FD 00DD
+00DE 00FE 00DE
+00E0 00E0 00C0
+00E1 00E1 00C1
+00E2 00E2 00C2
+00E3 00E3 00C3
+00E4 00E4 00C4
+00E5 00E5 00C5
+00E6 00E6 00C6
+00E7 00E7 00C7
+00E8 00E8 00C8
+00E9 00E9 00C9
+00EA 00EA 00CA
+00EB 00EB 00CB
+00EC 00EC 00CC
+00ED 00ED 00CD
+00EE 00EE 00CE
+00EF 00EF 00CF
+00F0 00F0 00D0
+00F1 00F1 00D1
+00F2 00F2 00D2
+00F3 00F3 00D3
+00F4 00F4 00D4
+00F5 00F5 00D5
+00F6 00F6 00D6
+00F8 00F8 00D8
+00F9 00F9 00D9
+00FA 00FA 00DA
+00FB 00FB 00DB
+00FC 00FC 00DC
+00FD 00FD 00DD
+00FE 00FE 00DE
+00FF 00FF 0178
+0100 0101 0100
+0101 0101 0100
+0102 0103 0102
+0103 0103 0102
+0104 0105 0104
+0105 0105 0104
+0106 0107 0106
+0107 0107 0106
+0108 0109 0108
+0109 0109 0108
+010A 010B 010A
+010B 010B 010A
+010C 010D 010C
+010D 010D 010C
+010E 010F 010E
+010F 010F 010E
+0110 0111 0110
+0111 0111 0110
+0112 0113 0112
+0113 0113 0112
+0114 0115 0114
+0115 0115 0114
+0116 0117 0116
+0117 0117 0116
+0118 0119 0118
+0119 0119 0118
+011A 011B 011A
+011B 011B 011A
+011C 011D 011C
+011D 011D 011C
+011E 011F 011E
+011F 011F 011E
+0120 0121 0120
+0121 0121 0120
+0122 0123 0122
+0123 0123 0122
+0124 0125 0124
+0125 0125 0124
+0126 0127 0126
+0127 0127 0126
+0128 0129 0128
+0129 0129 0128
+012A 012B 012A
+012B 012B 012A
+012C 012D 012C
+012D 012D 012C
+012E 012F 012E
+012F 012F 012E
+0130 0069 0130
+0131 0131 0049
+0132 0133 0132
+0133 0133 0132
+0134 0135 0134
+0135 0135 0134
+0136 0137 0136
+0137 0137 0136
+0139 013A 0139
+013A 013A 0139
+013B 013C 013B
+013C 013C 013B
+013D 013E 013D
+013E 013E 013D
+013F 0140 013F
+0140 0140 013F
+0141 0142 0141
+0142 0142 0141
+0143 0144 0143
+0144 0144 0143
+0145 0146 0145
+0146 0146 0145
+0147 0148 0147
+0148 0148 0147
+014A 014B 014A
+014B 014B 014A
+014C 014D 014C
+014D 014D 014C
+014E 014F 014E
+014F 014F 014E
+0150 0151 0150
+0151 0151 0150
+0152 0153 0152
+0153 0153 0152
+0154 0155 0154
+0155 0155 0154
+0156 0157 0156
+0157 0157 0156
+0158 0159 0158
+0159 0159 0158
+015A 015B 015A
+015B 015B 015A
+015C 015D 015C
+015D 015D 015C
+015E 015F 015E
+015F 015F 015E
+0160 0161 0160
+0161 0161 0160
+0162 0163 0162
+0163 0163 0162
+0164 0165 0164
+0165 0165 0164
+0166 0167 0166
+0167 0167 0166
+0168 0169 0168
+0169 0169 0168
+016A 016B 016A
+016B 016B 016A
+016C 016D 016C
+016D 016D 016C
+016E 016F 016E
+016F 016F 016E
+0170 0171 0170
+0171 0171 0170
+0172 0173 0172
+0173 0173 0172
+0174 0175 0174
+0175 0175 0174
+0176 0177 0176
+0177 0177 0176
+0178 00FF 0178
+0179 017A 0179
+017A 017A 0179
+017B 017C 017B
+017C 017C 017B
+017D 017E 017D
+017E 017E 017D
+017F 017F 0053
+0181 0253 0181
+0182 0183 0182
+0183 0183 0182
+0184 0185 0184
+0185 0185 0184
+0186 0254 0186
+0187 0188 0187
+0188 0188 0187
+0189 0256 0189
+018A 0257 018A
+018B 018C 018B
+018C 018C 018B
+018E 01DD 018E
+018F 0259 018F
+0190 025B 0190
+0191 0192 0191
+0192 0192 0191
+0193 0260 0193
+0194 0263 0194
+0195 0195 01F6
+0196 0269 0196
+0197 0268 0197
+0198 0199 0198
+0199 0199 0198
+019C 026F 019C
+019D 0272 019D
+019F 0275 019F
+01A0 01A1 01A0
+01A1 01A1 01A0
+01A2 01A3 01A2
+01A3 01A3 01A2
+01A4 01A5 01A4
+01A5 01A5 01A4
+01A6 0280 01A6
+01A7 01A8 01A7
+01A8 01A8 01A7
+01A9 0283 01A9
+01AC 01AD 01AC
+01AD 01AD 01AC
+01AE 0288 01AE
+01AF 01B0 01AF
+01B0 01B0 01AF
+01B1 028A 01B1
+01B2 028B 01B2
+01B3 01B4 01B3
+01B4 01B4 01B3
+01B5 01B6 01B5
+01B6 01B6 01B5
+01B7 0292 01B7
+01B8 01B9 01B8
+01B9 01B9 01B8
+01BC 01BD 01BC
+01BD 01BD 01BC
+01BF 01BF 01F7
+01C4 01C6 01C4
+01C5 01C6 01C4
+01C6 01C6 01C4
+01C7 01C9 01C7
+01C8 01C9 01C7
+01C9 01C9 01C7
+01CA 01CC 01CA
+01CB 01CC 01CA
+01CC 01CC 01CA
+01CD 01CE 01CD
+01CE 01CE 01CD
+01CF 01D0 01CF
+01D0 01D0 01CF
+01D1 01D2 01D1
+01D2 01D2 01D1
+01D3 01D4 01D3
+01D4 01D4 01D3
+01D5 01D6 01D5
+01D6 01D6 01D5
+01D7 01D8 01D7
+01D8 01D8 01D7
+01D9 01DA 01D9
+01DA 01DA 01D9
+01DB 01DC 01DB
+01DC 01DC 01DB
+01DD 01DD 018E
+01DE 01DF 01DE
+01DF 01DF 01DE
+01E0 01E1 01E0
+01E1 01E1 01E0
+01E2 01E3 01E2
+01E3 01E3 01E2
+01E4 01E5 01E4
+01E5 01E5 01E4
+01E6 01E7 01E6
+01E7 01E7 01E6
+01E8 01E9 01E8
+01E9 01E9 01E8
+01EA 01EB 01EA
+01EB 01EB 01EA
+01EC 01ED 01EC
+01ED 01ED 01EC
+01EE 01EF 01EE
+01EF 01EF 01EE
+01F1 01F3 01F1
+01F2 01F3 01F1
+01F3 01F3 01F1
+01F4 01F5 01F4
+01F5 01F5 01F4
+01F6 0195 01F6
+01F7 01BF 01F7
+01F8 01F9 01F8
+01F9 01F9 01F8
+01FA 01FB 01FA
+01FB 01FB 01FA
+01FC 01FD 01FC
+01FD 01FD 01FC
+01FE 01FF 01FE
+01FF 01FF 01FE
+0200 0201 0200
+0201 0201 0200
+0202 0203 0202
+0203 0203 0202
+0204 0205 0204
+0205 0205 0204
+0206 0207 0206
+0207 0207 0206
+0208 0209 0208
+0209 0209 0208
+020A 020B 020A
+020B 020B 020A
+020C 020D 020C
+020D 020D 020C
+020E 020F 020E
+020F 020F 020E
+0210 0211 0210
+0211 0211 0210
+0212 0213 0212
+0213 0213 0212
+0214 0215 0214
+0215 0215 0214
+0216 0217 0216
+0217 0217 0216
+0218 0219 0218
+0219 0219 0218
+021A 021B 021A
+021B 021B 021A
+021C 021D 021C
+021D 021D 021C
+021E 021F 021E
+021F 021F 021E
+0222 0223 0222
+0223 0223 0222
+0224 0225 0224
+0225 0225 0224
+0226 0227 0226
+0227 0227 0226
+0228 0229 0228
+0229 0229 0228
+022A 022B 022A
+022B 022B 022A
+022C 022D 022C
+022D 022D 022C
+022E 022F 022E
+022F 022F 022E
+0230 0231 0230
+0231 0231 0230
+0232 0233 0232
+0233 0233 0232
+0253 0253 0181
+0254 0254 0186
+0256 0256 0189
+0257 0257 018A
+0259 0259 018F
+025B 025B 0190
+0260 0260 0193
+0263 0263 0194
+0268 0268 0197
+0269 0269 0196
+026F 026F 019C
+0272 0272 019D
+0275 0275 019F
+0280 0280 01A6
+0283 0283 01A9
+0288 0288 01AE
+028A 028A 01B1
+028B 028B 01B2
+0292 0292 01B7
+0345 0345 0399
+0386 03AC 0386
+0388 03AD 0388
+0389 03AE 0389
+038A 03AF 038A
+038C 03CC 038C
+038E 03CD 038E
+038F 03CE 038F
+0391 03B1 0391
+0392 03B2 0392
+0393 03B3 0393
+0394 03B4 0394
+0395 03B5 0395
+0396 03B6 0396
+0397 03B7 0397
+0398 03B8 0398
+0399 03B9 0399
+039A 03BA 039A
+039B 03BB 039B
+039C 03BC 039C
+039D 03BD 039D
+039E 03BE 039E
+039F 03BF 039F
+03A0 03C0 03A0
+03A1 03C1 03A1
+03A3 03C3 03A3
+03A4 03C4 03A4
+03A5 03C5 03A5
+03A6 03C6 03A6
+03A7 03C7 03A7
+03A8 03C8 03A8
+03A9 03C9 03A9
+03AA 03CA 03AA
+03AB 03CB 03AB
+03AC 03AC 0386
+03AD 03AD 0388
+03AE 03AE 0389
+03AF 03AF 038A
+03B1 03B1 0391
+03B2 03B2 0392
+03B3 03B3 0393
+03B4 03B4 0394
+03B5 03B5 0395
+03B6 03B6 0396
+03B7 03B7 0397
+03B8 03B8 0398
+03B9 03B9 0399
+03BA 03BA 039A
+03BB 03BB 039B
+03BC 03BC 039C
+03BD 03BD 039D
+03BE 03BE 039E
+03BF 03BF 039F
+03C0 03C0 03A0
+03C1 03C1 03A1
+03C2 03C2 03A3
+03C3 03C3 03A3
+03C4 03C4 03A4
+03C5 03C5 03A5
+03C6 03C6 03A6
+03C7 03C7 03A7
+03C8 03C8 03A8
+03C9 03C9 03A9
+03CA 03CA 03AA
+03CB 03CB 03AB
+03CC 03CC 038C
+03CD 03CD 038E
+03CE 03CE 038F
+03D0 03D0 0392
+03D1 03D1 0398
+03D5 03D5 03A6
+03D6 03D6 03A0
+03DA 03DB 03DA
+03DB 03DB 03DA
+03DC 03DD 03DC
+03DD 03DD 03DC
+03DE 03DF 03DE
+03DF 03DF 03DE
+03E0 03E1 03E0
+03E1 03E1 03E0
+03E2 03E3 03E2
+03E3 03E3 03E2
+03E4 03E5 03E4
+03E5 03E5 03E4
+03E6 03E7 03E6
+03E7 03E7 03E6
+03E8 03E9 03E8
+03E9 03E9 03E8
+03EA 03EB 03EA
+03EB 03EB 03EA
+03EC 03ED 03EC
+03ED 03ED 03EC
+03EE 03EF 03EE
+03EF 03EF 03EE
+03F0 03F0 039A
+03F1 03F1 03A1
+03F2 03F2 03A3
+0400 0450 0400
+0401 0451 0401
+0402 0452 0402
+0403 0453 0403
+0404 0454 0404
+0405 0455 0405
+0406 0456 0406
+0407 0457 0407
+0408 0458 0408
+0409 0459 0409
+040A 045A 040A
+040B 045B 040B
+040C 045C 040C
+040D 045D 040D
+040E 045E 040E
+040F 045F 040F
+0410 0430 0410
+0411 0431 0411
+0412 0432 0412
+0413 0433 0413
+0414 0434 0414
+0415 0435 0415
+0416 0436 0416
+0417 0437 0417
+0418 0438 0418
+0419 0439 0419
+041A 043A 041A
+041B 043B 041B
+041C 043C 041C
+041D 043D 041D
+041E 043E 041E
+041F 043F 041F
+0420 0440 0420
+0421 0441 0421
+0422 0442 0422
+0423 0443 0423
+0424 0444 0424
+0425 0445 0425
+0426 0446 0426
+0427 0447 0427
+0428 0448 0428
+0429 0449 0429
+042A 044A 042A
+042B 044B 042B
+042C 044C 042C
+042D 044D 042D
+042E 044E 042E
+042F 044F 042F
+0430 0430 0410
+0431 0431 0411
+0432 0432 0412
+0433 0433 0413
+0434 0434 0414
+0435 0435 0415
+0436 0436 0416
+0437 0437 0417
+0438 0438 0418
+0439 0439 0419
+043A 043A 041A
+043B 043B 041B
+043C 043C 041C
+043D 043D 041D
+043E 043E 041E
+043F 043F 041F
+0440 0440 0420
+0441 0441 0421
+0442 0442 0422
+0443 0443 0423
+0444 0444 0424
+0445 0445 0425
+0446 0446 0426
+0447 0447 0427
+0448 0448 0428
+0449 0449 0429
+044A 044A 042A
+044B 044B 042B
+044C 044C 042C
+044D 044D 042D
+044E 044E 042E
+044F 044F 042F
+0450 0450 0400
+0451 0451 0401
+0452 0452 0402
+0453 0453 0403
+0454 0454 0404
+0455 0455 0405
+0456 0456 0406
+0457 0457 0407
+0458 0458 0408
+0459 0459 0409
+045A 045A 040A
+045B 045B 040B
+045C 045C 040C
+045D 045D 040D
+045E 045E 040E
+045F 045F 040F
+0460 0461 0460
+0461 0461 0460
+0462 0463 0462
+0463 0463 0462
+0464 0465 0464
+0465 0465 0464
+0466 0467 0466
+0467 0467 0466
+0468 0469 0468
+0469 0469 0468
+046A 046B 046A
+046B 046B 046A
+046C 046D 046C
+046D 046D 046C
+046E 046F 046E
+046F 046F 046E
+0470 0471 0470
+0471 0471 0470
+0472 0473 0472
+0473 0473 0472
+0474 0475 0474
+0475 0475 0474
+0476 0477 0476
+0477 0477 0476
+0478 0479 0478
+0479 0479 0478
+047A 047B 047A
+047B 047B 047A
+047C 047D 047C
+047D 047D 047C
+047E 047F 047E
+047F 047F 047E
+0480 0481 0480
+0481 0481 0480
+048C 048D 048C
+048D 048D 048C
+048E 048F 048E
+048F 048F 048E
+0490 0491 0490
+0491 0491 0490
+0492 0493 0492
+0493 0493 0492
+0494 0495 0494
+0495 0495 0494
+0496 0497 0496
+0497 0497 0496
+0498 0499 0498
+0499 0499 0498
+049A 049B 049A
+049B 049B 049A
+049C 049D 049C
+049D 049D 049C
+049E 049F 049E
+049F 049F 049E
+04A0 04A1 04A0
+04A1 04A1 04A0
+04A2 04A3 04A2
+04A3 04A3 04A2
+04A4 04A5 04A4
+04A5 04A5 04A4
+04A6 04A7 04A6
+04A7 04A7 04A6
+04A8 04A9 04A8
+04A9 04A9 04A8
+04AA 04AB 04AA
+04AB 04AB 04AA
+04AC 04AD 04AC
+04AD 04AD 04AC
+04AE 04AF 04AE
+04AF 04AF 04AE
+04B0 04B1 04B0
+04B1 04B1 04B0
+04B2 04B3 04B2
+04B3 04B3 04B2
+04B4 04B5 04B4
+04B5 04B5 04B4
+04B6 04B7 04B6
+04B7 04B7 04B6
+04B8 04B9 04B8
+04B9 04B9 04B8
+04BA 04BB 04BA
+04BB 04BB 04BA
+04BC 04BD 04BC
+04BD 04BD 04BC
+04BE 04BF 04BE
+04BF 04BF 04BE
+04C1 04C2 04C1
+04C2 04C2 04C1
+04C3 04C4 04C3
+04C4 04C4 04C3
+04C7 04C8 04C7
+04C8 04C8 04C7
+04CB 04CC 04CB
+04CC 04CC 04CB
+04D0 04D1 04D0
+04D1 04D1 04D0
+04D2 04D3 04D2
+04D3 04D3 04D2
+04D4 04D5 04D4
+04D5 04D5 04D4
+04D6 04D7 04D6
+04D7 04D7 04D6
+04D8 04D9 04D8
+04D9 04D9 04D8
+04DA 04DB 04DA
+04DB 04DB 04DA
+04DC 04DD 04DC
+04DD 04DD 04DC
+04DE 04DF 04DE
+04DF 04DF 04DE
+04E0 04E1 04E0
+04E1 04E1 04E0
+04E2 04E3 04E2
+04E3 04E3 04E2
+04E4 04E5 04E4
+04E5 04E5 04E4
+04E6 04E7 04E6
+04E7 04E7 04E6
+04E8 04E9 04E8
+04E9 04E9 04E8
+04EA 04EB 04EA
+04EB 04EB 04EA
+04EC 04ED 04EC
+04ED 04ED 04EC
+04EE 04EF 04EE
+04EF 04EF 04EE
+04F0 04F1 04F0
+04F1 04F1 04F0
+04F2 04F3 04F2
+04F3 04F3 04F2
+04F4 04F5 04F4
+04F5 04F5 04F4
+04F8 04F9 04F8
+04F9 04F9 04F8
+0531 0561 0531
+0532 0562 0532
+0533 0563 0533
+0534 0564 0534
+0535 0565 0535
+0536 0566 0536
+0537 0567 0537
+0538 0568 0538
+0539 0569 0539
+053A 056A 053A
+053B 056B 053B
+053C 056C 053C
+053D 056D 053D
+053E 056E 053E
+053F 056F 053F
+0540 0570 0540
+0541 0571 0541
+0542 0572 0542
+0543 0573 0543
+0544 0574 0544
+0545 0575 0545
+0546 0576 0546
+0547 0577 0547
+0548 0578 0548
+0549 0579 0549
+054A 057A 054A
+054B 057B 054B
+054C 057C 054C
+054D 057D 054D
+054E 057E 054E
+054F 057F 054F
+0550 0580 0550
+0551 0581 0551
+0552 0582 0552
+0553 0583 0553
+0554 0584 0554
+0555 0585 0555
+0556 0586 0556
+0561 0561 0531
+0562 0562 0532
+0563 0563 0533
+0564 0564 0534
+0565 0565 0535
+0566 0566 0536
+0567 0567 0537
+0568 0568 0538
+0569 0569 0539
+056A 056A 053A
+056B 056B 053B
+056C 056C 053C
+056D 056D 053D
+056E 056E 053E
+056F 056F 053F
+0570 0570 0540
+0571 0571 0541
+0572 0572 0542
+0573 0573 0543
+0574 0574 0544
+0575 0575 0545
+0576 0576 0546
+0577 0577 0547
+0578 0578 0548
+0579 0579 0549
+057A 057A 054A
+057B 057B 054B
+057C 057C 054C
+057D 057D 054D
+057E 057E 054E
+057F 057F 054F
+0580 0580 0550
+0581 0581 0551
+0582 0582 0552
+0583 0583 0553
+0584 0584 0554
+0585 0585 0555
+0586 0586 0556
+1E00 1E01 1E00
+1E01 1E01 1E00
+1E02 1E03 1E02
+1E03 1E03 1E02
+1E04 1E05 1E04
+1E05 1E05 1E04
+1E06 1E07 1E06
+1E07 1E07 1E06
+1E08 1E09 1E08
+1E09 1E09 1E08
+1E0A 1E0B 1E0A
+1E0B 1E0B 1E0A
+1E0C 1E0D 1E0C
+1E0D 1E0D 1E0C
+1E0E 1E0F 1E0E
+1E0F 1E0F 1E0E
+1E10 1E11 1E10
+1E11 1E11 1E10
+1E12 1E13 1E12
+1E13 1E13 1E12
+1E14 1E15 1E14
+1E15 1E15 1E14
+1E16 1E17 1E16
+1E17 1E17 1E16
+1E18 1E19 1E18
+1E19 1E19 1E18
+1E1A 1E1B 1E1A
+1E1B 1E1B 1E1A
+1E1C 1E1D 1E1C
+1E1D 1E1D 1E1C
+1E1E 1E1F 1E1E
+1E1F 1E1F 1E1E
+1E20 1E21 1E20
+1E21 1E21 1E20
+1E22 1E23 1E22
+1E23 1E23 1E22
+1E24 1E25 1E24
+1E25 1E25 1E24
+1E26 1E27 1E26
+1E27 1E27 1E26
+1E28 1E29 1E28
+1E29 1E29 1E28
+1E2A 1E2B 1E2A
+1E2B 1E2B 1E2A
+1E2C 1E2D 1E2C
+1E2D 1E2D 1E2C
+1E2E 1E2F 1E2E
+1E2F 1E2F 1E2E
+1E30 1E31 1E30
+1E31 1E31 1E30
+1E32 1E33 1E32
+1E33 1E33 1E32
+1E34 1E35 1E34
+1E35 1E35 1E34
+1E36 1E37 1E36
+1E37 1E37 1E36
+1E38 1E39 1E38
+1E39 1E39 1E38
+1E3A 1E3B 1E3A
+1E3B 1E3B 1E3A
+1E3C 1E3D 1E3C
+1E3D 1E3D 1E3C
+1E3E 1E3F 1E3E
+1E3F 1E3F 1E3E
+1E40 1E41 1E40
+1E41 1E41 1E40
+1E42 1E43 1E42
+1E43 1E43 1E42
+1E44 1E45 1E44
+1E45 1E45 1E44
+1E46 1E47 1E46
+1E47 1E47 1E46
+1E48 1E49 1E48
+1E49 1E49 1E48
+1E4A 1E4B 1E4A
+1E4B 1E4B 1E4A
+1E4C 1E4D 1E4C
+1E4D 1E4D 1E4C
+1E4E 1E4F 1E4E
+1E4F 1E4F 1E4E
+1E50 1E51 1E50
+1E51 1E51 1E50
+1E52 1E53 1E52
+1E53 1E53 1E52
+1E54 1E55 1E54
+1E55 1E55 1E54
+1E56 1E57 1E56
+1E57 1E57 1E56
+1E58 1E59 1E58
+1E59 1E59 1E58
+1E5A 1E5B 1E5A
+1E5B 1E5B 1E5A
+1E5C 1E5D 1E5C
+1E5D 1E5D 1E5C
+1E5E 1E5F 1E5E
+1E5F 1E5F 1E5E
+1E60 1E61 1E60
+1E61 1E61 1E60
+1E62 1E63 1E62
+1E63 1E63 1E62
+1E64 1E65 1E64
+1E65 1E65 1E64
+1E66 1E67 1E66
+1E67 1E67 1E66
+1E68 1E69 1E68
+1E69 1E69 1E68
+1E6A 1E6B 1E6A
+1E6B 1E6B 1E6A
+1E6C 1E6D 1E6C
+1E6D 1E6D 1E6C
+1E6E 1E6F 1E6E
+1E6F 1E6F 1E6E
+1E70 1E71 1E70
+1E71 1E71 1E70
+1E72 1E73 1E72
+1E73 1E73 1E72
+1E74 1E75 1E74
+1E75 1E75 1E74
+1E76 1E77 1E76
+1E77 1E77 1E76
+1E78 1E79 1E78
+1E79 1E79 1E78
+1E7A 1E7B 1E7A
+1E7B 1E7B 1E7A
+1E7C 1E7D 1E7C
+1E7D 1E7D 1E7C
+1E7E 1E7F 1E7E
+1E7F 1E7F 1E7E
+1E80 1E81 1E80
+1E81 1E81 1E80
+1E82 1E83 1E82
+1E83 1E83 1E82
+1E84 1E85 1E84
+1E85 1E85 1E84
+1E86 1E87 1E86
+1E87 1E87 1E86
+1E88 1E89 1E88
+1E89 1E89 1E88
+1E8A 1E8B 1E8A
+1E8B 1E8B 1E8A
+1E8C 1E8D 1E8C
+1E8D 1E8D 1E8C
+1E8E 1E8F 1E8E
+1E8F 1E8F 1E8E
+1E90 1E91 1E90
+1E91 1E91 1E90
+1E92 1E93 1E92
+1E93 1E93 1E92
+1E94 1E95 1E94
+1E95 1E95 1E94
+1E9B 1E9B 1E60
+1EA0 1EA1 1EA0
+1EA1 1EA1 1EA0
+1EA2 1EA3 1EA2
+1EA3 1EA3 1EA2
+1EA4 1EA5 1EA4
+1EA5 1EA5 1EA4
+1EA6 1EA7 1EA6
+1EA7 1EA7 1EA6
+1EA8 1EA9 1EA8
+1EA9 1EA9 1EA8
+1EAA 1EAB 1EAA
+1EAB 1EAB 1EAA
+1EAC 1EAD 1EAC
+1EAD 1EAD 1EAC
+1EAE 1EAF 1EAE
+1EAF 1EAF 1EAE
+1EB0 1EB1 1EB0
+1EB1 1EB1 1EB0
+1EB2 1EB3 1EB2
+1EB3 1EB3 1EB2
+1EB4 1EB5 1EB4
+1EB5 1EB5 1EB4
+1EB6 1EB7 1EB6
+1EB7 1EB7 1EB6
+1EB8 1EB9 1EB8
+1EB9 1EB9 1EB8
+1EBA 1EBB 1EBA
+1EBB 1EBB 1EBA
+1EBC 1EBD 1EBC
+1EBD 1EBD 1EBC
+1EBE 1EBF 1EBE
+1EBF 1EBF 1EBE
+1EC0 1EC1 1EC0
+1EC1 1EC1 1EC0
+1EC2 1EC3 1EC2
+1EC3 1EC3 1EC2
+1EC4 1EC5 1EC4
+1EC5 1EC5 1EC4
+1EC6 1EC7 1EC6
+1EC7 1EC7 1EC6
+1EC8 1EC9 1EC8
+1EC9 1EC9 1EC8
+1ECA 1ECB 1ECA
+1ECB 1ECB 1ECA
+1ECC 1ECD 1ECC
+1ECD 1ECD 1ECC
+1ECE 1ECF 1ECE
+1ECF 1ECF 1ECE
+1ED0 1ED1 1ED0
+1ED1 1ED1 1ED0
+1ED2 1ED3 1ED2
+1ED3 1ED3 1ED2
+1ED4 1ED5 1ED4
+1ED5 1ED5 1ED4
+1ED6 1ED7 1ED6
+1ED7 1ED7 1ED6
+1ED8 1ED9 1ED8
+1ED9 1ED9 1ED8
+1EDA 1EDB 1EDA
+1EDB 1EDB 1EDA
+1EDC 1EDD 1EDC
+1EDD 1EDD 1EDC
+1EDE 1EDF 1EDE
+1EDF 1EDF 1EDE
+1EE0 1EE1 1EE0
+1EE1 1EE1 1EE0
+1EE2 1EE3 1EE2
+1EE3 1EE3 1EE2
+1EE4 1EE5 1EE4
+1EE5 1EE5 1EE4
+1EE6 1EE7 1EE6
+1EE7 1EE7 1EE6
+1EE8 1EE9 1EE8
+1EE9 1EE9 1EE8
+1EEA 1EEB 1EEA
+1EEB 1EEB 1EEA
+1EEC 1EED 1EEC
+1EED 1EED 1EEC
+1EEE 1EEF 1EEE
+1EEF 1EEF 1EEE
+1EF0 1EF1 1EF0
+1EF1 1EF1 1EF0
+1EF2 1EF3 1EF2
+1EF3 1EF3 1EF2
+1EF4 1EF5 1EF4
+1EF5 1EF5 1EF4
+1EF6 1EF7 1EF6
+1EF7 1EF7 1EF6
+1EF8 1EF9 1EF8
+1EF9 1EF9 1EF8
+1F00 1F00 1F08
+1F01 1F01 1F09
+1F02 1F02 1F0A
+1F03 1F03 1F0B
+1F04 1F04 1F0C
+1F05 1F05 1F0D
+1F06 1F06 1F0E
+1F07 1F07 1F0F
+1F08 1F00 1F08
+1F09 1F01 1F09
+1F0A 1F02 1F0A
+1F0B 1F03 1F0B
+1F0C 1F04 1F0C
+1F0D 1F05 1F0D
+1F0E 1F06 1F0E
+1F0F 1F07 1F0F
+1F10 1F10 1F18
+1F11 1F11 1F19
+1F12 1F12 1F1A
+1F13 1F13 1F1B
+1F14 1F14 1F1C
+1F15 1F15 1F1D
+1F18 1F10 1F18
+1F19 1F11 1F19
+1F1A 1F12 1F1A
+1F1B 1F13 1F1B
+1F1C 1F14 1F1C
+1F1D 1F15 1F1D
+1F20 1F20 1F28
+1F21 1F21 1F29
+1F22 1F22 1F2A
+1F23 1F23 1F2B
+1F24 1F24 1F2C
+1F25 1F25 1F2D
+1F26 1F26 1F2E
+1F27 1F27 1F2F
+1F28 1F20 1F28
+1F29 1F21 1F29
+1F2A 1F22 1F2A
+1F2B 1F23 1F2B
+1F2C 1F24 1F2C
+1F2D 1F25 1F2D
+1F2E 1F26 1F2E
+1F2F 1F27 1F2F
+1F30 1F30 1F38
+1F31 1F31 1F39
+1F32 1F32 1F3A
+1F33 1F33 1F3B
+1F34 1F34 1F3C
+1F35 1F35 1F3D
+1F36 1F36 1F3E
+1F37 1F37 1F3F
+1F38 1F30 1F38
+1F39 1F31 1F39
+1F3A 1F32 1F3A
+1F3B 1F33 1F3B
+1F3C 1F34 1F3C
+1F3D 1F35 1F3D
+1F3E 1F36 1F3E
+1F3F 1F37 1F3F
+1F40 1F40 1F48
+1F41 1F41 1F49
+1F42 1F42 1F4A
+1F43 1F43 1F4B
+1F44 1F44 1F4C
+1F45 1F45 1F4D
+1F48 1F40 1F48
+1F49 1F41 1F49
+1F4A 1F42 1F4A
+1F4B 1F43 1F4B
+1F4C 1F44 1F4C
+1F4D 1F45 1F4D
+1F51 1F51 1F59
+1F53 1F53 1F5B
+1F55 1F55 1F5D
+1F57 1F57 1F5F
+1F59 1F51 1F59
+1F5B 1F53 1F5B
+1F5D 1F55 1F5D
+1F5F 1F57 1F5F
+1F60 1F60 1F68
+1F61 1F61 1F69
+1F62 1F62 1F6A
+1F63 1F63 1F6B
+1F64 1F64 1F6C
+1F65 1F65 1F6D
+1F66 1F66 1F6E
+1F67 1F67 1F6F
+1F68 1F60 1F68
+1F69 1F61 1F69
+1F6A 1F62 1F6A
+1F6B 1F63 1F6B
+1F6C 1F64 1F6C
+1F6D 1F65 1F6D
+1F6E 1F66 1F6E
+1F6F 1F67 1F6F
+1F70 1F70 1FBA
+1F71 1F71 1FBB
+1F72 1F72 1FC8
+1F73 1F73 1FC9
+1F74 1F74 1FCA
+1F75 1F75 1FCB
+1F76 1F76 1FDA
+1F77 1F77 1FDB
+1F78 1F78 1FF8
+1F79 1F79 1FF9
+1F7A 1F7A 1FEA
+1F7B 1F7B 1FEB
+1F7C 1F7C 1FFA
+1F7D 1F7D 1FFB
+1F80 1F80 1F88
+1F81 1F81 1F89
+1F82 1F82 1F8A
+1F83 1F83 1F8B
+1F84 1F84 1F8C
+1F85 1F85 1F8D
+1F86 1F86 1F8E
+1F87 1F87 1F8F
+1F88 1F80 1F88
+1F89 1F81 1F89
+1F8A 1F82 1F8A
+1F8B 1F83 1F8B
+1F8C 1F84 1F8C
+1F8D 1F85 1F8D
+1F8E 1F86 1F8E
+1F8F 1F87 1F8F
+1F90 1F90 1F98
+1F91 1F91 1F99
+1F92 1F92 1F9A
+1F93 1F93 1F9B
+1F94 1F94 1F9C
+1F95 1F95 1F9D
+1F96 1F96 1F9E
+1F97 1F97 1F9F
+1F98 1F90 1F98
+1F99 1F91 1F99
+1F9A 1F92 1F9A
+1F9B 1F93 1F9B
+1F9C 1F94 1F9C
+1F9D 1F95 1F9D
+1F9E 1F96 1F9E
+1F9F 1F97 1F9F
+1FA0 1FA0 1FA8
+1FA1 1FA1 1FA9
+1FA2 1FA2 1FAA
+1FA3 1FA3 1FAB
+1FA4 1FA4 1FAC
+1FA5 1FA5 1FAD
+1FA6 1FA6 1FAE
+1FA7 1FA7 1FAF
+1FA8 1FA0 1FA8
+1FA9 1FA1 1FA9
+1FAA 1FA2 1FAA
+1FAB 1FA3 1FAB
+1FAC 1FA4 1FAC
+1FAD 1FA5 1FAD
+1FAE 1FA6 1FAE
+1FAF 1FA7 1FAF
+1FB0 1FB0 1FB8
+1FB1 1FB1 1FB9
+1FB3 1FB3 1FBC
+1FB8 1FB0 1FB8
+1FB9 1FB1 1FB9
+1FBA 1F70 1FBA
+1FBB 1F71 1FBB
+1FBC 1FB3 1FBC
+1FBE 1FBE 0399
+1FC3 1FC3 1FCC
+1FC8 1F72 1FC8
+1FC9 1F73 1FC9
+1FCA 1F74 1FCA
+1FCB 1F75 1FCB
+1FCC 1FC3 1FCC
+1FD0 1FD0 1FD8
+1FD1 1FD1 1FD9
+1FD8 1FD0 1FD8
+1FD9 1FD1 1FD9
+1FDA 1F76 1FDA
+1FDB 1F77 1FDB
+1FE0 1FE0 1FE8
+1FE1 1FE1 1FE9
+1FE5 1FE5 1FEC
+1FE8 1FE0 1FE8
+1FE9 1FE1 1FE9
+1FEA 1F7A 1FEA
+1FEB 1F7B 1FEB
+1FEC 1FE5 1FEC
+1FF3 1FF3 1FFC
+1FF8 1F78 1FF8
+1FF9 1F79 1FF9
+1FFA 1F7C 1FFA
+1FFB 1F7D 1FFB
+1FFC 1FF3 1FFC
+2126 03C9 2126
+212A 006B 212A
+212B 00E5 212B
+2160 2170 2160
+2161 2171 2161
+2162 2172 2162
+2163 2173 2163
+2164 2174 2164
+2165 2175 2165
+2166 2176 2166
+2167 2177 2167
+2168 2178 2168
+2169 2179 2169
+216A 217A 216A
+216B 217B 216B
+216C 217C 216C
+216D 217D 216D
+216E 217E 216E
+216F 217F 216F
+2170 2170 2160
+2171 2171 2161
+2172 2172 2162
+2173 2173 2163
+2174 2174 2164
+2175 2175 2165
+2176 2176 2166
+2177 2177 2167
+2178 2178 2168
+2179 2179 2169
+217A 217A 216A
+217B 217B 216B
+217C 217C 216C
+217D 217D 216D
+217E 217E 216E
+217F 217F 216F
+24B6 24D0 24B6
+24B7 24D1 24B7
+24B8 24D2 24B8
+24B9 24D3 24B9
+24BA 24D4 24BA
+24BB 24D5 24BB
+24BC 24D6 24BC
+24BD 24D7 24BD
+24BE 24D8 24BE
+24BF 24D9 24BF
+24C0 24DA 24C0
+24C1 24DB 24C1
+24C2 24DC 24C2
+24C3 24DD 24C3
+24C4 24DE 24C4
+24C5 24DF 24C5
+24C6 24E0 24C6
+24C7 24E1 24C7
+24C8 24E2 24C8
+24C9 24E3 24C9
+24CA 24E4 24CA
+24CB 24E5 24CB
+24CC 24E6 24CC
+24CD 24E7 24CD
+24CE 24E8 24CE
+24CF 24E9 24CF
+24D0 24D0 24B6
+24D1 24D1 24B7
+24D2 24D2 24B8
+24D3 24D3 24B9
+24D4 24D4 24BA
+24D5 24D5 24BB
+24D6 24D6 24BC
+24D7 24D7 24BD
+24D8 24D8 24BE
+24D9 24D9 24BF
+24DA 24DA 24C0
+24DB 24DB 24C1
+24DC 24DC 24C2
+24DD 24DD 24C3
+24DE 24DE 24C4
+24DF 24DF 24C5
+24E0 24E0 24C6
+24E1 24E1 24C7
+24E2 24E2 24C8
+24E3 24E3 24C9
+24E4 24E4 24CA
+24E5 24E5 24CB
+24E6 24E6 24CC
+24E7 24E7 24CD
+24E8 24E8 24CE
+24E9 24E9 24CF
+FF21 FF41 FF21
+FF22 FF42 FF22
+FF23 FF43 FF23
+FF24 FF44 FF24
+FF25 FF45 FF25
+FF26 FF46 FF26
+FF27 FF47 FF27
+FF28 FF48 FF28
+FF29 FF49 FF29
+FF2A FF4A FF2A
+FF2B FF4B FF2B
+FF2C FF4C FF2C
+FF2D FF4D FF2D
+FF2E FF4E FF2E
+FF2F FF4F FF2F
+FF30 FF50 FF30
+FF31 FF51 FF31
+FF32 FF52 FF32
+FF33 FF53 FF33
+FF34 FF54 FF34
+FF35 FF55 FF35
+FF36 FF56 FF36
+FF37 FF57 FF37
+FF38 FF58 FF38
+FF39 FF59 FF39
+FF3A FF5A FF3A
+FF41 FF41 FF21
+FF42 FF42 FF22
+FF43 FF43 FF23
+FF44 FF44 FF24
+FF45 FF45 FF25
+FF46 FF46 FF26
+FF47 FF47 FF27
+FF48 FF48 FF28
+FF49 FF49 FF29
+FF4A FF4A FF2A
+FF4B FF4B FF2B
+FF4C FF4C FF2C
+FF4D FF4D FF2D
+FF4E FF4E FF2E
+FF4F FF4F FF2F
+FF50 FF50 FF30
+FF51 FF51 FF31
+FF52 FF52 FF32
+FF53 FF53 FF33
+FF54 FF54 FF34
+FF55 FF55 FF35
+FF56 FF56 FF36
+FF57 FF57 FF37
+FF58 FF58 FF38
+FF59 FF59 FF39
+FF5A FF5A FF3A
+DROP VIEW v_bmp;
+EXECUTE IMMEDIATE SFORMAT('
+CREATE VIEW v_supplementary AS
+SELECT
+ seq AS codepoint,
+ LPAD(HEX(seq),8,''0'') AS codepoint_hex8,
+ CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
+FROM
+ seq_65536_to_1114111', @@character_set_connection, @@collation_connection);
+SELECT COLLATION(c) FROM v_supplementary LIMIT 1;
+COLLATION(c)
+utf8mb4_unicode_ci
+SELECT
+codepoint_hex8,
+HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)),
+HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
+FROM v_supplementary
+WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
+codepoint_hex8 HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)) HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
+DROP VIEW v_supplementary;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.test b/mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.test
new file mode 100644
index 00000000000..da46e40bda6
--- /dev/null
+++ b/mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.test
@@ -0,0 +1,15 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
+--echo #
+
+SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
+--source include/ctype_unicode_casefold_bmp.inc
+--source include/ctype_unicode_casefold_supplementary.inc
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/ddl_i18n_koi8r.result b/mysql-test/main/ddl_i18n_koi8r.result
index 6504e129693..f588374a26f 100644
--- a/mysql-test/main/ddl_i18n_koi8r.result
+++ b/mysql-test/main/ddl_i18n_koi8r.result
@@ -1739,7 +1739,10 @@ CREATE TABLE `t1` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1),(0),(1);
+INSERT INTO `t1` VALUES
+(1),
+(0),
+(1);
ALTER DATABASE `mysqltest1` CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
@@ -1818,7 +1821,10 @@ CREATE TABLE `t1` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1),(0),(1);
+INSERT INTO `t1` VALUES
+(1),
+(0),
+(1);
ALTER DATABASE `mysqltest2` CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
diff --git a/mysql-test/main/ddl_i18n_utf8.result b/mysql-test/main/ddl_i18n_utf8.result
index 35234d4fa23..cb57bc5e9df 100644
--- a/mysql-test/main/ddl_i18n_utf8.result
+++ b/mysql-test/main/ddl_i18n_utf8.result
@@ -1739,7 +1739,10 @@ CREATE TABLE `t1` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1),(0),(1);
+INSERT INTO `t1` VALUES
+(1),
+(0),
+(1);
ALTER DATABASE `mysqltest1` CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
@@ -1818,7 +1821,10 @@ CREATE TABLE `t1` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1),(0),(1);
+INSERT INTO `t1` VALUES
+(1),
+(0),
+(1);
ALTER DATABASE `mysqltest2` CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci ;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
diff --git a/mysql-test/main/default.result b/mysql-test/main/default.result
index 335f7e7d607..150bc860106 100644
--- a/mysql-test/main/default.result
+++ b/mysql-test/main/default.result
@@ -797,7 +797,7 @@ ERROR 42000: Invalid default value for 'a'
#
CREATE TABLE t1 (a INT DEFAULT '1 ');
Warnings:
-Note 1265 Data truncated for column 'a' at row 1
+Note 1265 Data truncated for column 'a' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -810,7 +810,7 @@ a
DROP TABLE t1;
CREATE TABLE t1 (a INT DEFAULT CONCAT('1 '));
Warnings:
-Note 1265 Data truncated for column 'a' at row 1
+Note 1265 Data truncated for column 'a' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -825,7 +825,7 @@ a
DROP TABLE t1;
CREATE TABLE t1 (a INT DEFAULT COALESCE('1 '));
Warnings:
-Note 1265 Data truncated for column 'a' at row 1
+Note 1265 Data truncated for column 'a' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
diff --git a/mysql-test/main/derived_cond_pushdown.result b/mysql-test/main/derived_cond_pushdown.result
index f47920c0e33..4a0021828ed 100644
--- a/mysql-test/main/derived_cond_pushdown.result
+++ b/mysql-test/main/derived_cond_pushdown.result
@@ -122,42 +122,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.max_c > 214"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "t2.a > v1.a",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c > 214",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 214"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "t2.a > v1.a",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c > 214",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
@@ -198,42 +208,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.max_c > 300",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c > 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 300",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c > 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted or formula : pushing into HAVING
@@ -277,42 +297,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.max_c > 400 or v1.max_c < 135"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.max_c > 400 and t2.a > v1.a or v1.max_c < 135 and t2.a < v1.a",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (max_c > 400 or max_c < 135)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 400 or v1.max_c < 135"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.max_c > 400 and t2.a > v1.a or v1.max_c < 135 and t2.a < v1.a",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (max_c > 400 or max_c < 135)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
@@ -345,42 +375,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.max_c > 300 or v1.max_c < 135"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.b = t2.b and v1.max_c > 300 and v1.avg_c > t2.d or v1.a = t2.a and v1.max_c < 135 and v1.max_c < t2.c",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (max_c > 300 or max_c < 135)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 300 or v1.max_c < 135"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.b = t2.b and v1.max_c > 300 and v1.avg_c > t2.d or v1.a = t2.a and v1.max_c < 135 and v1.max_c < t2.c",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (max_c > 300 or max_c < 135)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE
@@ -402,43 +442,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a > 6"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "t2.b > v1.b",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 6"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a > 6"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "t2.b > v1.b",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 6"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v2,t2 where (v2.b>25) and (t2.a<v2.a);
@@ -469,43 +519,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v2.b > 25"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "t2.a < v2.a",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and t1.b > 25"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v2.b > 25"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "t2.a < v2.a",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and t1.b > 25"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted or formula : pushing into WHERE
@@ -557,43 +617,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a > 7 or v1.a < 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a > 7 and t2.c < v1.max_c or v1.a < 2 and t2.b < v1.b",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 7 or t1.a < 2"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a > 7 or v1.a < 2"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a > 7 and t2.c < v1.max_c or v1.a < 2 and t2.b < v1.b",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 7 or t1.a < 2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v2,t2 where
@@ -638,43 +708,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v2.a > 7 or v2.a > 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v2.a > 7 and t2.c < v2.max_c or v2.a > 5 and t2.b < v2.b",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and (t1.a > 7 or t1.a > 5)"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v2.a > 7 or v2.a > 5"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v2.a > 7 and t2.c < v2.max_c or v2.a > 5 and t2.b < v2.b",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and (t1.a > 7 or t1.a > 5)"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
@@ -705,43 +785,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a > 4 or v1.a < 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a > 4 and v1.b > t2.b and v1.max_c = t2.d or v1.a < 2 and v1.max_c < t2.c and v1.max_c = t2.d",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 4 or t1.a < 2"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a > 4 or v1.a < 2"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a > 4 and v1.b > t2.b and v1.max_c = t2.d or v1.a < 2 and v1.max_c < t2.c and v1.max_c = t2.d",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 4 or t1.a < 2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformulas : pushing into HAVING and WHERE
@@ -765,43 +855,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 2 and v1.max_c > 400"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "t2.b > v1.b",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c > 400",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 2"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 2 and v1.max_c > 400"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "t2.b > v1.b",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c > 400",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_double as v,t2_double as t where
@@ -836,43 +936,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v.avg_a > 0.45 and v.b > 10",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "avg_a < 22.333 and avg_a > 0.45",
- "filesort": {
- "sort_key": "t1_double.b, t1_double.c",
- "temporary_table": {
- "table": {
- "table_name": "t1_double",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t1_double.b > 12.2 and t1_double.b > 10"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v.avg_a > 0.45 and v.b > 10",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "avg_a < 22.333 and avg_a > 0.45",
+ "filesort": {
+ "sort_key": "t1_double.b, t1_double.c",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1_double",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t1_double.b > 12.2 and t1_double.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_decimal as v,t2_decimal as t where
@@ -895,43 +1005,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "3",
- "used_key_parts": ["a"],
- "ref": ["test.t.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v.avg_c > 15 and v.b > 1",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "avg_c > 12 and avg_c > 15",
- "filesort": {
- "sort_key": "t1_decimal.a, t1_decimal.b",
- "temporary_table": {
- "table": {
- "table_name": "t1_decimal",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t1_decimal.b > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "3",
+ "used_key_parts": ["a"],
+ "ref": ["test.t.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v.avg_c > 15 and v.b > 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "avg_c > 12 and avg_c > 15",
+ "filesort": {
+ "sort_key": "t1_decimal.a, t1_decimal.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1_decimal",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t1_decimal.b > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted or formula : pushing into HAVING and WHERE
@@ -977,43 +1097,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a > 7 and v1.max_c > 300 or v1.a < 4 and v1.max_c < 500"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a > 7 and v1.max_c > 300 and t2.c < v1.max_c or v1.a < 4 and v1.max_c < 500 and t2.b < v1.b",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (t1.a > 7 and max_c > 300 or t1.a < 4 and max_c < 500)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 7 or t1.a < 4"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a > 7 and v1.max_c > 300 or v1.a < 4 and v1.max_c < 500"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a > 7 and v1.max_c > 300 and t2.c < v1.max_c or v1.a < 4 and v1.max_c < 500 and t2.b < v1.b",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (t1.a > 7 and max_c > 300 or t1.a < 4 and max_c < 500)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 7 or t1.a < 4"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where ((v1.a<2) and (v1.max_c>120)) or (v1.a>7);
@@ -1066,43 +1196,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 2 and v1.max_c > 120 or v1.a > 7"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a < 2 and v1.max_c > 120 or v1.a > 7",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (t1.a < 2 and max_c > 120 or t1.a > 7)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 2 or t1.a > 7"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 2 and v1.max_c > 120 or v1.a > 7"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a < 2 and v1.max_c > 120 or v1.a > 7",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (t1.a < 2 and max_c > 120 or t1.a > 7)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 2 or t1.a > 7"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted or formulas : pushing into WHERE and HAVING
@@ -1144,43 +1284,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 2 and v1.max_c > 120 or v1.a > 7"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.b = t2.b and v1.a < 2 and v1.max_c > 120 or v1.a > 7",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (t1.a < 2 and max_c > 120 or t1.a > 7)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 2 or t1.a > 7"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 2 and v1.max_c > 120 or v1.a > 7"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.b = t2.b and v1.a < 2 and v1.max_c > 120 or v1.a > 7",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (t1.a < 2 and max_c > 120 or t1.a > 7)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 2 or t1.a > 7"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
@@ -1211,43 +1361,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 2 and v1.max_c < 200 or v1.a > 4"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a < 2 and v1.max_c < 200 and t2.c > v1.max_c and v1.max_c = t2.d or v1.max_c = t2.c and v1.a > 4 and t2.c < 500 and t2.b < v1.b",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (t1.a < 2 and max_c < 200 or t1.a > 4 and max_c < 500)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 2 or t1.a > 4"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 2 and v1.max_c < 200 or v1.a > 4"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a < 2 and v1.max_c < 200 and t2.c > v1.max_c and v1.max_c = t2.d or v1.max_c = t2.c and v1.a > 4 and t2.c < 500 and t2.b < v1.b",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (t1.a < 2 and max_c < 200 or t1.a > 4 and max_c < 500)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 2 or t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# prepare of a query containing extracted or formula
@@ -1288,42 +1448,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.max_c > 400 or v1.max_c < 135"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.max_c > 400 and t2.a > v1.a or v1.max_c < 135 and t2.a < v1.a",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (max_c > 400 or max_c < 135)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 400 or v1.max_c < 135"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.max_c > 400 and t2.a > v1.a or v1.max_c < 135 and t2.a < v1.a",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (max_c > 400 or max_c < 135)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
execute stmt;
@@ -1331,42 +1501,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.max_c > 400 or v1.max_c < 135"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.max_c > 400 and t2.a > v1.a or v1.max_c < 135 and t2.a < v1.a",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (max_c > 400 or max_c < 135)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 400 or v1.max_c < 135"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.max_c > 400 and t2.a > v1.a or v1.max_c < 135 and t2.a < v1.a",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (max_c > 400 or max_c < 135)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
deallocate prepare stmt;
@@ -1390,43 +1570,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 1 and t2.b is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t2.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.a = 1",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 1 and t2.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t2.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.a = 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=5) and (v1.max_c=t2.d);
@@ -1445,43 +1635,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.d is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["max_c"],
- "ref": ["test.t2.d"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.a = 5 and v1.max_c = t2.d",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.d is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["max_c"],
+ "ref": ["test.t2.d"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.a = 5 and v1.max_c = t2.d",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE using equalities
@@ -1507,42 +1707,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 5 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 5 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a);
@@ -1559,42 +1769,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "10",
- "used_key_parts": ["a", "b"],
- "ref": ["test.t2.a", "test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b = t1.a"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "10",
+ "used_key_parts": ["a", "b"],
+ "ref": ["test.t2.a", "test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b = t1.a"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into HAVING using equalities
@@ -1616,41 +1836,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.c > 150 and t2.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["max_c"],
- "ref": ["test.t2.c"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c > 150",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.c > 150 and t2.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["max_c"],
+ "ref": ["test.t2.c"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c > 150",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted and formula : pushing into WHERE
@@ -1669,38 +1899,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 3"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a = 3 and v1.b = 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 3"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
+ {
+ "block-nl-join": {
"table": {
- "table_name": "t1",
+ "table_name": "<derived2>",
"access_type": "ALL",
"rows": 20,
"filtered": 100,
- "attached_condition": "t1.a = 3 and t1.b = 3"
+ "attached_condition": "v1.a = 3 and v1.b = 3"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 3 and t1.b = 3"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=1) and (v1.b=21) and (t2.a=2);
@@ -1719,38 +1959,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 2"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a = 1 and v1.b = 21"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 2"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
+ {
+ "block-nl-join": {
"table": {
- "table_name": "t1",
+ "table_name": "<derived2>",
"access_type": "ALL",
"rows": 20,
"filtered": 100,
- "attached_condition": "t1.a = 1 and t1.b = 21"
+ "attached_condition": "v1.a = 1 and v1.b = 21"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.b = 21"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_char as v,t2_char as t where
@@ -1775,43 +2025,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "v.a = 'c' and v.b < 'Hermes'",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 9",
- "filesort": {
- "sort_key": "t1_char.b",
- "temporary_table": {
- "table": {
- "table_name": "t1_char",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t1_char.a = 'c' and t1_char.b < 'Hermes'"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "v.a = 'c' and v.b < 'Hermes'",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 9",
+ "filesort": {
+ "sort_key": "t1_char.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1_char",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t1_char.a = 'c' and t1_char.b < 'Hermes'"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100
},
- "buffer_type": "flat",
- "buffer_size": "220",
- "join_type": "BNL",
- "attached_condition": "t.b = v.b or v.max_c > 20"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "220",
+ "join_type": "BNL",
+ "attached_condition": "t.b = v.b or v.max_c > 20"
+ }
+ }
+ ]
}
}
# extracted and formula : pushing into WHERE using equalities
@@ -1848,42 +2108,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "(t.b > 1 or t.b = 1) and t.b is not null and t.b is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "6",
- "used_key_parts": ["a", "b"],
- "ref": ["test.t.b", "test.t.b"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "avg_c > 12",
- "filesort": {
- "sort_key": "t1_decimal.a, t1_decimal.b",
- "temporary_table": {
- "table": {
- "table_name": "t1_decimal",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t1_decimal.b = t1_decimal.a and (t1_decimal.a > 1 or t1_decimal.a = 1)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "(t.b > 1 or t.b = 1) and t.b is not null and t.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "6",
+ "used_key_parts": ["a", "b"],
+ "ref": ["test.t.b", "test.t.b"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "avg_c > 12",
+ "filesort": {
+ "sort_key": "t1_decimal.a, t1_decimal.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1_decimal",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t1_decimal.b = t1_decimal.a and (t1_decimal.a > 1 or t1_decimal.a = 1)"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted or formula : pushing into HAVING using equalities
@@ -1917,42 +2187,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 4 or t2.c > 150"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 4 or t2.c > 150"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a = t2.a and t2.a < 4 or v1.max_c = t2.c and t2.c > 150",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (t1.a < 4 or max_c > 150)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a = t2.a and t2.a < 4 or v1.max_c = t2.c and t2.c > 150",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (t1.a < 4 or max_c > 150)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformulas : pushing into WHERE and HAVING using equalities
@@ -1976,42 +2256,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 5 and t2.c > 250 and t2.a is not null and t2.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "10",
- "used_key_parts": ["a", "max_c"],
- "ref": ["test.t2.a", "test.t2.c"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c > 250",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 5 and t2.c > 250 and t2.a is not null and t2.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "10",
+ "used_key_parts": ["a", "max_c"],
+ "ref": ["test.t2.a", "test.t2.c"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c > 250",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformulas : pushing into WHERE and HAVING
@@ -2046,43 +2336,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 8"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a = 8 and v1.max_c = 404"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 8"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c = 404",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 8"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a = 8 and v1.max_c = 404"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c = 404",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 8"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformulas : pushing into WHERE and HAVING
@@ -2106,43 +2406,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.d is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["max_c"],
- "ref": ["test.t2.d"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.a > 3 and v1.max_c > 200 and t2.b < v1.b and t2.d = v1.max_c",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.d is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["max_c"],
+ "ref": ["test.t2.d"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.a > 3 and v1.max_c > 200 and t2.b < v1.b and t2.d = v1.max_c",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 3"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE
@@ -2166,43 +2476,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t.c is not null and t.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "18",
- "used_key_parts": ["b", "c"],
- "ref": ["test.t.c", "test.t.c"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t.c > 10 or v.a = 1",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "avg_a < 22.333 and (t1_double.b > 10 or t1_double.a = 1)",
- "filesort": {
- "sort_key": "t1_double.b, t1_double.c",
- "temporary_table": {
- "table": {
- "table_name": "t1_double",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t1_double.c = t1_double.b and t1_double.b > 12.2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t.c is not null and t.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "18",
+ "used_key_parts": ["b", "c"],
+ "ref": ["test.t.c", "test.t.c"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t.c > 10 or v.a = 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "avg_a < 22.333 and (t1_double.b > 10 or t1_double.a = 1)",
+ "filesort": {
+ "sort_key": "t1_double.b, t1_double.c",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1_double",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t1_double.c = t1_double.b and t1_double.b > 12.2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE
@@ -2231,43 +2551,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t.c > 18 and t.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "9",
- "used_key_parts": ["c"],
- "ref": ["test.t.c"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v.a > 0.2 or v.b < 17 or t.c > 17",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "avg_a < 22.333 and (t1_double.a > 0.2 or t1_double.b < 17 or t1_double.c > 17)",
- "filesort": {
- "sort_key": "t1_double.b, t1_double.c",
- "temporary_table": {
- "table": {
- "table_name": "t1_double",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t1_double.b > 12.2 and t1_double.c > 18"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t.c > 18 and t.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "9",
+ "used_key_parts": ["c"],
+ "ref": ["test.t.c"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v.a > 0.2 or v.b < 17 or t.c > 17",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "avg_a < 22.333 and (t1_double.a > 0.2 or t1_double.b < 17 or t1_double.c > 17)",
+ "filesort": {
+ "sort_key": "t1_double.b, t1_double.c",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1_double",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t1_double.b > 12.2 and t1_double.c > 18"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted or formula : pushing into WHERE
@@ -2327,42 +2657,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "(v.a > 4 or v.a = 2 or v.b > 3) and v.avg_c = 13",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "avg_c > 12 and avg_c = 13",
- "filesort": {
- "sort_key": "t1_decimal.a, t1_decimal.b",
- "temporary_table": {
- "table": {
- "table_name": "t1_decimal",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t1_decimal.a > 4 or t1_decimal.a = 2 or t1_decimal.b > 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "(v.a > 4 or v.a = 2 or v.b > 3) and v.avg_c = 13",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "avg_c > 12 and avg_c = 13",
+ "filesort": {
+ "sort_key": "t1_decimal.a, t1_decimal.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1_decimal",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t1_decimal.a > 4 or t1_decimal.a = 2 or t1_decimal.b > 3"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
},
- "buffer_type": "flat",
- "buffer_size": "162",
- "join_type": "BNL"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "162",
+ "join_type": "BNL"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
@@ -2391,43 +2731,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "10",
- "used_key_parts": ["a", "b"],
- "ref": ["test.t2.a", "test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.max_c > 300",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c > 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b = t1.a and t1.a > 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "10",
+ "used_key_parts": ["a", "b"],
+ "ref": ["test.t2.a", "test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 300",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c > 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b = t1.a and t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# nothing to push
@@ -2457,41 +2807,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 2 and t2.c > 900"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 2 and t2.c > 900"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.b=t2.b);
@@ -2514,41 +2874,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null and t2.b is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "10",
- "used_key_parts": ["a", "b"],
- "ref": ["test.t2.a", "test.t2.b"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null and t2.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "10",
+ "used_key_parts": ["a", "b"],
+ "ref": ["test.t2.a", "test.t2.b"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
@@ -2585,41 +2955,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a = t2.a or v1.b = t2.b and (v1.a = 1 or v1.a = 6)",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a = t2.a or v1.b = t2.b and (v1.a = 1 or v1.a = 6)",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=1) or (v1.b=21) or (t2.a=2);
@@ -2680,41 +3060,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a = 1 or v1.b = 21 or t2.a = 2",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a = 1 or v1.b = 21 or t2.a = 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
@@ -2747,42 +3137,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 2 and t2.c > 900"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 2 and t2.c > 900"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a < t2.a or t2.a < 11",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a < t2.a or t2.a < 11",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using several derived tables : nothing to push
@@ -2814,71 +3214,87 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key1"],
- "key": "key1",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key1"],
+ "key": "key1",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.b < 50",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and t1.b < 50"
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v2.b < 50",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and t1.b < 50"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where
@@ -2929,72 +3345,88 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b < 50"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b < 50"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.b is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.b is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["v1.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.a = v1.a or v1.a = t2.a",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["v1.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v2.a = v1.a or v1.a = t2.a",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where
@@ -3025,71 +3457,87 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a = t2.a or t2.c < 115",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a = t2.a or t2.c < 115",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
},
- "buffer_type": "incremental",
- "buffer_size": "4Kb",
- "join_type": "BNL",
- "attached_condition": "v1.a = t2.a and v2.a = t2.a or v2.b > 13 and t2.c < 115",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "incremental",
+ "buffer_size": "4Kb",
+ "join_type": "BNL",
+ "attached_condition": "v1.a = t2.a and v2.a = t2.a or v2.b > 13 and t2.c < 115",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using several derived tables : pushing in all tables
@@ -3124,72 +3572,88 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.max_c < 300"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c < 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.max_c < 300"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c < 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v2.b < 50 or v2.b = 19"
},
- "buffer_type": "incremental",
- "buffer_size": "4Kb",
- "join_type": "BNL",
- "attached_condition": "(v2.a = v1.a or v1.a = t2.a) and (v2.b < 50 or v2.b = 19)",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and (t1.b < 50 or t1.b = 19)"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v2.b < 50 or v2.b = 19"
+ },
+ "buffer_type": "incremental",
+ "buffer_size": "4Kb",
+ "join_type": "BNL",
+ "attached_condition": "(v2.a = v1.a or v1.a = t2.a) and (v2.b < 50 or v2.b = 19)",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and (t1.b < 50 or t1.b = 19)"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using several derived tables : pushing only in one table
@@ -3215,72 +3679,88 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null and t2.a is not null and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key1"],
- "key": "key1",
- "key_length": "10",
- "used_key_parts": ["a", "b"],
- "ref": ["test.t2.a", "test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b = t1.a"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null and t2.a is not null and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key1"],
+ "key": "key1",
+ "key_length": "10",
+ "used_key_parts": ["a", "b"],
+ "ref": ["test.t2.a", "test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b = t1.a"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.max_c < 300",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707 and max_c < 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v2.max_c < 300",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707 and max_c < 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using several derived tables : pushing only in one table
@@ -3303,72 +3783,88 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a = 1 and v1.b > 10"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.b is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.b > 10"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a = 1 and v1.b > 10"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.b is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["v1.b"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and t1.b > 10"
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["v1.b"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted or formula : pushing into WHERE
@@ -3402,43 +3898,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "v.a = 'b' and (v.b = 'Vika' or v.b = 'Ali')",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 9",
- "filesort": {
- "sort_key": "t1_char.b",
- "temporary_table": {
- "table": {
- "table_name": "t1_char",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t1_char.a = 'b' and (t1_char.b = 'Vika' or t1_char.b = 'Ali')"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "v.a = 'b' and (v.b = 'Vika' or v.b = 'Ali')",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 9",
+ "filesort": {
+ "sort_key": "t1_char.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1_char",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t1_char.a = 'b' and (t1_char.b = 'Vika' or t1_char.b = 'Ali')"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t.a = 'b'"
},
- "buffer_type": "flat",
- "buffer_size": "220",
- "join_type": "BNL"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t.a = 'b'"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "220",
+ "join_type": "BNL"
+ }
+ }
+ ]
}
}
# using several derived tables : pushing in all tables
@@ -3499,103 +4005,125 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v3.b < 50 or v3.b = 33",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "min_c > 109",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 10 and (t1.b < 50 or t1.b = 33)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v3.b < 50 or v3.b = 33",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "min_c > 109",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 10 and (t1.b < 50 or t1.b = 33)"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.max_c < 500"
},
- "buffer_type": "flat",
- "buffer_size": "715",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c < 500",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.max_c < 500"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "715",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c < 500",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v2.max_c > 300"
},
- "buffer_type": "incremental",
- "buffer_size": "9Kb",
- "join_type": "BNL",
- "attached_condition": "v2.a = v1.a or v1.a = t2.a",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707 and max_c > 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v2.max_c > 300"
+ },
+ "buffer_type": "incremental",
+ "buffer_size": "9Kb",
+ "join_type": "BNL",
+ "attached_condition": "v2.a = v1.a or v1.a = t2.a",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707 and max_c > 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using several derived tables : pushing in all tables
@@ -3636,73 +4164,89 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key1"],
- "key": "key1",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t2.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.max_c > 130 and v1.a is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c > 130",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key1"],
+ "key": "key1",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t2.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 130 and v1.a is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c > 130",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["v1.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.min_c < 130",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "min_c < 707 and min_c < 130",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["v1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v2.min_c < 130",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "min_c < 707 and min_c < 130",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using several derived tables : pushing in all tables
@@ -3776,103 +4320,125 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.avg_c < 400 or v1.a > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "(v1.avg_c < 400 or v1.a > 1) and v1.a is not null and v1.b is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (avg_c < 400 or t1.a > 1)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.avg_c < 400 or v1.a > 1"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "(v1.avg_c < 400 or v1.a > 1) and v1.a is not null and v1.b is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (avg_c < 400 or t1.a > 1)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["v1.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.min_c < 200",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "min_c < 707 and min_c < 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["v1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v2.min_c < 200",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "min_c < 707 and min_c < 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["v1.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v3.avg_c > 170 or v3.a < 5",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "avg_c > 170 or t1.a < 5",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 8"
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["v1.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v3.avg_c > 170 or v3.a < 5",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "avg_c > 170 or t1.a < 5",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 8"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted or formula : pushing into HAVING
@@ -3921,43 +4487,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "(v1.a = 1 or v1.max_c < 300) and v1.b > 25"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a = 1 or v1.max_c < 300",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and (t1.a = 1 or max_c < 300)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 25"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "(v1.a = 1 or v1.max_c < 300) and v1.b > 25"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a = 1 or v1.max_c < 300",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and (t1.a = 1 or max_c < 300)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 25"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# extracted and formula : pushing into WHERE
@@ -3992,43 +4568,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.max_c > 300 and v1.b < 30",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 707 and max_c > 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and t1.b < 30"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 300 and v1.b < 30",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 707 and max_c > 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and t1.b < 30"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using query with union
@@ -4070,86 +4656,106 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.c > 800 and t2.b is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t2.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.a < 5",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.c > 800 and t2.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t2.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.a < 5",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.d > 800"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.max_c > 100 and v1.a > 7"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.d > 800"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707 and max_c > 100",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 7"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 100 and v1.a > 7"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707 and max_c > 100",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 7"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
]
@@ -4214,85 +4820,105 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b = 19"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.b = 19 and v1.a < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b = 19"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b = 19 and t1.a < 5"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.b = 19 and v1.a < 5"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b = 19 and t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.max_c > 400 or v1.avg_c > 270"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "(v1.max_c > 400 or v1.avg_c > 270) and v1.a < t2.a",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707 and (max_c > 400 or avg_c > 270)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 400 or v1.avg_c > 270"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "(v1.max_c > 400 or v1.avg_c > 270) and v1.a < t2.a",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707 and (max_c > 400 or avg_c > 270)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
]
@@ -4369,85 +4995,105 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a = 1 or v1.a = 6"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "(v1.a = t2.a or v1.b = t2.b) and (v1.a = 1 or v1.a = 6)",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 1 or t1.a = 6"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a = 1 or v1.a = 6"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "(v1.a = t2.a or v1.b = t2.b) and (v1.a = 1 or v1.a = 6)",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 or t1.a = 6"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a > 3 and v1.b > 27 or v1.max_c > 550"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.a > 3 and v1.b > 27 or v1.max_c > 550",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707 and (t1.a > 3 and t1.b > 27 or max_c > 550)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a > 3 and v1.b > 27 or v1.max_c > 550"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.a > 3 and v1.b > 27 or v1.max_c > 550",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707 and (t1.a > 3 and t1.b > 27 or max_c > 550)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
]
@@ -4525,131 +5171,161 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 1"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a = 1 and (v1.max_c < 500 or v1.avg_c > 500)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 1"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v1.max_c < 500 or v1.avg_c > 500",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707 and (max_c < 500 or avg_c > 500)",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a = 1 and (v1.max_c < 500 or v1.avg_c > 500)"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v1.max_c < 500 or v1.avg_c > 500",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707 and (max_c < 500 or avg_c > 500)",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 2"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived5>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v2.b > 10"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 2"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v2.a < t2.b or v2.max_c > 200",
- "materialized": {
- "query_block": {
- "select_id": 5,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and t1.b > 10"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived5>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v2.b > 10"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v2.a < t2.b or v2.max_c > 200",
+ "materialized": {
+ "query_block": {
+ "select_id": 5,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
},
{
"query_block": {
"select_id": 3,
"operation": "UNION",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.c is not null"
- },
- "table": {
- "table_name": "<derived6>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["max_c"],
- "ref": ["test.t2.c"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.b < 10",
- "materialized": {
- "query_block": {
- "select_id": 6,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and t1.b < 10"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived6>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["max_c"],
+ "ref": ["test.t2.c"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v2.b < 10",
+ "materialized": {
+ "query_block": {
+ "select_id": 6,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and t1.b < 10"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
]
@@ -4692,71 +5368,85 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 40,
- "filtered": 100,
- "attached_condition": "v_union.a < 3 and v_union.c > 100"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 109 and c > 100",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 10 and t1.a < 3"
+ "rows": 40,
+ "filtered": 100,
+ "attached_condition": "v_union.a < 3 and v_union.c > 100"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 109 and c > 100",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 10 and t1.a < 3"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "having_condition": "c < 300 and c > 100",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a < 3"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "having_condition": "c < 300 and c > 100",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a < 3"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using derived table with union
@@ -4800,72 +5490,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 40,
- "filtered": 100,
- "attached_condition": "(v_union.a < 2 or v_union.c > 800) and v_union.b > 12"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "v_union.a < 2 or v_union.c > 800",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 109 and (t1.a < 2 or c > 800)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 10 and t1.b > 12"
+ "rows": 40,
+ "filtered": 100,
+ "attached_condition": "(v_union.a < 2 or v_union.c > 800) and v_union.b > 12"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "v_union.a < 2 or v_union.c > 800",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 109 and (t1.a < 2 or c > 800)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 10 and t1.b > 12"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "having_condition": "c < 300 and (t1.a < 2 or c > 800)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.b > 12"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "having_condition": "c < 300 and (t1.a < 2 or c > 800)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.b > 12"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using derived table with union
@@ -4896,72 +5600,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 1"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 40,
- "filtered": 100,
- "attached_condition": "v_union.a = 1 and v_union.c < 200"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 1"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 109 and c < 200",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
+ "rows": 40,
+ "filtered": 100,
+ "attached_condition": "v_union.a = 1 and v_union.c < 200"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 109 and c < 200",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "having_condition": "c < 300 and c < 200",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.b > 10"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "having_condition": "c < 300 and c < 200",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_char as v,t2_char as t where
@@ -4990,43 +5708,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "2",
- "used_key_parts": ["a"],
- "ref": ["test.t.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v.b = 'Vika' and v.max_c > 2",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 9 and max_c > 2",
- "filesort": {
- "sort_key": "t1_char.a",
- "temporary_table": {
- "table": {
- "table_name": "t1_char",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t1_char.b = 'Vika'"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "2",
+ "used_key_parts": ["a"],
+ "ref": ["test.t.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v.b = 'Vika' and v.max_c > 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 9 and max_c > 2",
+ "filesort": {
+ "sort_key": "t1_char.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1_char",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t1_char.b = 'Vika'"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using derived table with union
@@ -5063,68 +5791,37 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 1"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a = 1"
- },
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
- }
- }
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 1"
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 40,
- "filtered": 100,
- "attached_condition": "v_union.a = 1"
},
- "buffer_type": "incremental",
- "buffer_size": "4Kb",
- "join_type": "BNL",
- "attached_condition": "v_union.c > 800 or v1.max_c > 200",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived4>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 109",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a = 1"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
"table": {
"table_name": "t1",
"access_type": "ALL",
@@ -5133,33 +5830,84 @@ EXPLAIN
"attached_condition": "t1.a = 1"
}
}
- }
+ ]
}
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.b > 10"
+ }
+ }
+ }
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 40,
+ "filtered": 100,
+ "attached_condition": "v_union.a = 1"
+ },
+ "buffer_type": "incremental",
+ "buffer_size": "4Kb",
+ "join_type": "BNL",
+ "attached_condition": "v_union.c > 800 or v1.max_c > 200",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 109",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using derived table with union
@@ -5199,91 +5947,109 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "(t2.a = 6 or t2.a = 8) and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 6,
- "filtered": 100,
- "attached_condition": "v.c > 200",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3,4>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 109 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 10 and (t1.a = 6 or t1.a = 8)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "(t2.a = 6 or t2.a = 8) and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 6,
+ "filtered": 100,
+ "attached_condition": "v.c > 200",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3,4>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 109 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 10 and (t1.a = 6 or t1.a = 8)"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "having_condition": "c < 300 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and (t1.a = 6 or t1.a = 8)"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "having_condition": "c < 300 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and (t1.a = 6 or t1.a = 8)"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "UNION",
- "having_condition": "c < 707 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.c > 300 and (t1.a = 6 or t1.a = 8)"
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "UNION",
+ "having_condition": "c < 707 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.c > 300 and (t1.a = 6 or t1.a = 8)"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using derived table with union of selects without aggregation
@@ -5368,60 +6134,74 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 4,
- "filtered": 100,
- "attached_condition": "v.c > 6",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 10 and t1.a + 1 > 6"
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.c > 100 and t1.c > 6"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "v.c > 6",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 10 and t1.a + 1 > 6"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.c > 100 and t1.c > 6"
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using derived table with union of selects without aggregation
@@ -5486,60 +6266,74 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t2.a > 1 or v.b < 20",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 10 and (t1.a > 1 or t1.b < 20)"
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.c > 100 and (t1.a > 1 or t1.b < 20)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t2.a > 1 or v.b < 20",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 10 and (t1.a > 1 or t1.b < 20)"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.c > 100 and (t1.a > 1 or t1.b < 20)"
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using derived table with union of selects without aggregation
@@ -5572,60 +6366,74 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 4,
- "filtered": 100,
- "attached_condition": "(v.b = 19 or v.b = 21) and (v.c < 3 or v.c > 600)",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 10 and (t1.b = 19 or t1.b = 21) and (t1.a + 1 < 3 or t1.a + 1 > 600)"
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.c > 100 and (t1.b = 19 or t1.b = 21) and (t1.c < 3 or t1.c > 600)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "(v.b = 19 or v.b = 21) and (v.c < 3 or v.c > 600)",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 10 and (t1.b = 19 or t1.b = 21) and (t1.a + 1 < 3 or t1.a + 1 > 600)"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.c > 100 and (t1.b = 19 or t1.b = 21) and (t1.c < 3 or t1.c > 600)"
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using derived table with union of
@@ -5655,66 +6463,80 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 4,
- "filtered": 100,
- "attached_condition": "v.b < 20",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 109",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 10 and t1.b < 20"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "v.b < 20",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 109",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 10 and t1.b < 20"
+ }
+ }
+ ]
+ }
}
}
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.b < 20"
+ }
+ }
+ ]
+ }
}
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.b < 20"
- }
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using derived table with union of
@@ -5763,66 +6585,80 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 4,
- "filtered": 100,
- "attached_condition": "(t2.a < 3 or v.b < 40) and v.c > 500",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 109 and c > 500",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 10 and (t1.a < 3 or t1.b < 40)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "(t2.a < 3 or v.b < 40) and v.c > 500",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 109 and c > 500",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 10 and (t1.a < 3 or t1.b < 40)"
+ }
+ }
+ ]
+ }
}
}
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and (t1.a < 3 or t1.b < 40) and t1.c + 100 > 500"
+ }
+ }
+ ]
+ }
}
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and (t1.a < 3 or t1.b < 40) and t1.c + 100 > 500"
- }
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using embedded derived table : pushing the same conditions
@@ -5873,78 +6709,96 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v4.a < 13",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 15 and v1.a < 13",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 15 and t1.a < 13"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v4.a < 13",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 15 and v1.a < 13",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 15 and t1.a < 13"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a > 5 and v1.b > 12"
},
- "buffer_type": "flat",
- "buffer_size": "333",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and t1.b > 12"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a > 5 and v1.b > 12"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "333",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and t1.b > 12"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using embedded view : nothing to push
@@ -5975,89 +6829,109 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key1"],
- "key": "key1",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 15",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 15"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key1"],
+ "key": "key1",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 15",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 15"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.b > 30",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b > 30"
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.b > 30",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b > 30"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using embedded view : pushing different conditions
@@ -6090,91 +6964,111 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 1 and t2.a is not null and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key1"],
- "key": "key1",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v4.min_c > 100",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "min_c > 100",
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 15 and v1.a > 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 15 and t1.a > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 1 and t2.a is not null and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key1"],
+ "key": "key1",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v4.min_c > 100",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "min_c > 100",
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 15 and v1.a > 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 15 and t1.a > 1"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.b < 30",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.b < 30"
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.b < 30",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.b < 30"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using embedded view : pushing different conditions
@@ -6292,89 +7186,109 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v4.b > 10 and v4.a > 1 or v4.b < 20"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "238",
- "join_type": "BNL",
- "attached_condition": "(v4.b > 10 and v4.a > 1 or v4.b < 20) and v4.a is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 15 and (v1.b > 10 and v1.a > 1 or v1.b < 20)",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 15 and (t1.b > 10 and t1.a > 1 or t1.b < 20)"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v4.b > 10 and v4.a > 1 or v4.b < 20"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "238",
+ "join_type": "BNL",
+ "attached_condition": "(v4.b > 10 and v4.a > 1 or v4.b < 20) and v4.a is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 15 and (v1.b > 10 and v1.a > 1 or v1.b < 20)",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 15 and (t1.b > 10 and t1.a > 1 or t1.b < 20)"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["v4.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.max_c > 200",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707 and max_c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["v4.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.max_c > 200",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707 and max_c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using embedded view : pushing different conditions
@@ -6401,78 +7315,96 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v4.a > 12 and v4.min_c < 300 and v4.b > 13 or v4.a < 1",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "v1.a > 12 and min_c < 300 and v1.b > 13 or v1.a < 1",
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 15 and (v1.a > 12 and v1.b > 13 or v1.a < 1)",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 15 and (t1.a > 12 and t1.b > 13 or t1.a < 1)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v4.a > 12 and v4.min_c < 300 and v4.b > 13 or v4.a < 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "v1.a > 12 and min_c < 300 and v1.b > 13 or v1.a < 1",
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 15 and (v1.a > 12 and v1.b > 13 or v1.a < 1)",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 15 and (t1.a > 12 and t1.b > 13 or t1.a < 1)"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
},
- "buffer_type": "flat",
- "buffer_size": "333",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "333",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using embedded view : pushing different conditions
@@ -6500,78 +7432,96 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v4.b = v4.a and v4.min_c < 100 and v4.a is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "min_c < 100",
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.b = v1.a and v1.a < 15",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b = t1.a and t1.a < 15"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v4.b = v4.a and v4.min_c < 100 and v4.a is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "min_c < 100",
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.b = v1.a and v1.a < 15",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b = t1.a and t1.a < 15"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["v4.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["v4.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using embedded view : pushing the same conditions
@@ -6599,77 +7549,95 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v4.b = v4.a and v4.a < 30 and v4.a is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.b = v1.a and v1.a < 15 and v1.a < 30",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b = t1.a and t1.a < 15 and t1.a < 30"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v4.b = v4.a and v4.a < 30 and v4.a is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.b = v1.a and v1.a < 15 and v1.a < 30",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b = t1.a and t1.a < 15 and t1.a < 30"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["v4.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and t1.b < 30"
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["v4.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and t1.b < 30"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using embedded view : pushing the same conditions
@@ -6697,77 +7665,95 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v4.b = v4.a and (v4.a < 30 or v4.a > 2) and v4.a is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.b = v1.a and v1.a < 15 and (v1.a < 30 or v1.a > 2)",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.b = t1.a and t1.a < 15 and (t1.a < 30 or t1.a > 2)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v4.b = v4.a and (v4.a < 30 or v4.a > 2) and v4.a is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.b = v1.a and v1.a < 15 and (v1.a < 30 or v1.a > 2)",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.b = t1.a and t1.a < 15 and (t1.a < 30 or t1.a > 2)"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["v4.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5 and (t1.b < 30 or t1.b > 2)"
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["v4.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5 and (t1.b < 30 or t1.b > 2)"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using embedded view : pushing the same conditions
@@ -6803,78 +7789,96 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "(v4.a < 12 and v4.b > 13 or v4.a > 10) and v4.min_c > 100 and v4.min_c is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "min_c > 100",
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 15 and (v1.a < 12 and v1.b > 13 or v1.a > 10)",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 15 and (t1.a < 12 and t1.b > 13 or t1.a > 10)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "(v4.a < 12 and v4.b > 13 or v4.a > 10) and v4.min_c > 100 and v4.min_c is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "min_c > 100",
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 15 and (v1.a < 12 and v1.b > 13 or v1.a > 10)",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 15 and (t1.a < 12 and t1.b > 13 or t1.a > 10)"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["max_c"],
- "ref": ["v4.min_c"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707 and max_c > 100",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["max_c"],
+ "ref": ["v4.min_c"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707 and max_c > 100",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# using embedded view : pushing the same conditions
@@ -6909,90 +7913,110 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.c > 100 and t2.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["min_c"],
- "ref": ["test.t2.c"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v4.a < 12 and t2.b > 13 or v4.a > 10",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "min_c > 100",
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "v1.a < 15 and (v1.a < 12 or v1.a > 10)",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a < 15 and (t1.a < 12 or t1.a > 10)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.c > 100 and t2.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["min_c"],
+ "ref": ["test.t2.c"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v4.a < 12 and t2.b > 13 or v4.a > 10",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "min_c > 100",
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "v1.a < 15 and (v1.a < 12 or v1.a > 10)",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a < 15 and (t1.a < 12 or t1.a > 10)"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100
},
- "buffer_type": "flat",
- "buffer_size": "715",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "having_condition": "max_c < 707",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t1.a > 5"
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "715",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "max_c < 707",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
drop view v1,v2,v3,v4;
@@ -7136,47 +8160,61 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "0 or <in_optimizer>(2,<exists>(subquery#3))",
- "table": {
- "table_name": "t1",
- "access_type": "system",
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.b = 2",
- "first_match": "t1"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.b = 2",
+ "first_match": "t1"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 3,
- "table": {
- "table_name": "<derived5>",
- "access_type": "index_subquery",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["c"],
- "ref": ["func"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 5,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t3.c = 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived5>",
+ "access_type": "index_subquery",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["c"],
+ "ref": ["func"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 5,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t3.c = 2"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
]
@@ -7220,52 +8258,66 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "0 or <in_optimizer>(2,<exists>(subquery#3))",
- "table": {
- "table_name": "t1",
- "access_type": "system",
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.b = 2",
- "first_match": "t1"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.b = 2",
+ "first_match": "t1"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 3,
- "table": {
- "table_name": "<derived5>",
- "access_type": "index_subquery",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["d"],
- "ref": ["func"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 5,
- "having_condition": "s > 2",
- "filesort": {
- "sort_key": "t4.d",
- "temporary_table": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived5>",
+ "access_type": "index_subquery",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "ref": ["func"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 5,
+ "having_condition": "s > 2",
+ "filesort": {
+ "sort_key": "t4.d",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
]
@@ -7295,35 +8347,47 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "<in_optimizer>(1,exists(subquery#3))",
- "table": {
- "table_name": "t1",
- "access_type": "system",
- "rows": 1,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 3,
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.b = 1",
- "materialized": {
- "query_block": {
- "select_id": 4,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.b = 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v2.b = 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.b = 1"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
]
@@ -7352,35 +8416,45 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t1.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "trigcond(v2.b is null) and trigcond(trigcond(t1.a is not null))",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "trigcond(v2.b is null) and trigcond(trigcond(t1.a is not null))",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP VIEW v2;
@@ -7397,25 +8471,33 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "<nop>(v1.i <= 3)",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "<nop>(t1.i <= 3)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "<nop>(v1.i <= 3)",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "<nop>(t1.i <= 3)"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
Warnings:
@@ -7450,39 +8532,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "<in_optimizer>(t1.b,<exists>(subquery#2)) or t1.b = 100"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "<in_optimizer>(t1.b,<exists>(subquery#2)) or t1.b = 100"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "<derived4>",
- "access_type": "index_subquery",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "4",
- "used_key_parts": ["pk2"],
- "ref": ["func"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 4,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "index_subquery",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "4",
+ "used_key_parts": ["pk2"],
+ "ref": ["func"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
]
@@ -7500,39 +8594,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "<in_optimizer>(t1.b,<exists>(subquery#3)) or t1.b = 100"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "<in_optimizer>(t1.b,<exists>(subquery#3)) or t1.b = 100"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 3,
- "table": {
- "table_name": "<derived4>",
- "access_type": "index_subquery",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "4",
- "used_key_parts": ["pk2"],
- "ref": ["func"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 4,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "index_subquery",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "4",
+ "used_key_parts": ["pk2"],
+ "ref": ["func"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
]
@@ -7558,35 +8664,47 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "system",
- "rows": 1,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.a = 50",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.a = 50"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.a = 50",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.a = 50"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
]
@@ -7604,40 +8722,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "system",
- "rows": 1,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "v2.s < 50",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "s < 50",
- "filesort": {
- "sort_key": "t3.a",
- "temporary_table": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "v2.s < 50",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "s < 50",
+ "filesort": {
+ "sort_key": "t3.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
]
@@ -7664,45 +8794,55 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<subquery2>",
- "access_type": "system",
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "table": {
- "message": "Select tables optimized away"
- }
- }
- }
- },
- "read_sorted_file": {
- "filesort": {
- "sort_key": "v1.a",
+ "nested_loop": [
+ {
"table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 2,
+ "table_name": "<subquery2>",
+ "access_type": "system",
+ "rows": 1,
"filtered": 100,
- "attached_condition": "v1.b = 2",
"materialized": {
+ "unique": 1,
"query_block": {
- "select_id": 3,
+ "select_id": 2,
"table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.b = 2"
+ "message": "Select tables optimized away"
+ }
+ }
+ }
+ }
+ },
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "v1.a",
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.b = 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.b = 2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
DROP VIEW v1;
@@ -7724,68 +8864,84 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<subquery2>",
- "access_type": "system",
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "table": {
- "message": "Select tables optimized away"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "table": {
+ "message": "Select tables optimized away"
+ }
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.f = 2",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "t",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t.f = 2"
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.f = 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t.f = 2"
+ }
+ }
+ ]
+ }
}
}
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.pk > 2"
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 4,
+ {
+ "block-nl-join": {
"table": {
- "table_name": "t",
- "access_type": "range",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk"],
- "rows": 1,
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 2,
"filtered": 100,
- "index_condition": "t.pk > 2"
+ "attached_condition": "v2.pk > 2"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t.pk > 2"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP VIEW v;
@@ -7808,40 +8964,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<subquery3>",
- "access_type": "system",
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "table": {
- "message": "Select tables optimized away"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "table": {
+ "message": "Select tables optimized away"
+ }
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "sq.i = 3",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.i = 3"
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "sq.i = 3",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.i = 3"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
UPDATE t2 SET j = 2 WHERE j = 3;
@@ -7865,40 +9031,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<subquery3>",
- "access_type": "system",
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "table": {
- "message": "Select tables optimized away"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "table": {
+ "message": "Select tables optimized away"
+ }
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "sq.i = 2.71",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.i = 2.7100000381469727"
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "sq.i = 2.71",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.i = 2.7100000381469727"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2;
@@ -7917,40 +9093,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<subquery3>",
- "access_type": "system",
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "table": {
- "message": "Select tables optimized away"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "table": {
+ "message": "Select tables optimized away"
+ }
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "sq.i = 3.21",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.i = 3.21"
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "sq.i = 3.21",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.i = 3.21"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2;
@@ -7969,40 +9155,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<subquery3>",
- "access_type": "system",
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "table": {
- "message": "Select tables optimized away"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "table": {
+ "message": "Select tables optimized away"
+ }
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "sq.i = 'aa'",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.i = 'aa'"
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "sq.i = 'aa'",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.i = 'aa'"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2;
@@ -8023,40 +9219,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<subquery3>",
- "access_type": "system",
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "table": {
- "message": "Select tables optimized away"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "table": {
+ "message": "Select tables optimized away"
+ }
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "sq.i = '2007-05-28 00:00:00'",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.i = TIMESTAMP'2007-05-28 00:00:00'"
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "sq.i = '2007-05-28 00:00:00'",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.i = TIMESTAMP'2007-05-28 00:00:00'"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2;
@@ -8075,40 +9281,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<subquery3>",
- "access_type": "system",
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "table": {
- "message": "Select tables optimized away"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "table": {
+ "message": "Select tables optimized away"
+ }
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "sq.i = '2007-05-28'",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.i = DATE'2007-05-28'"
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "sq.i = '2007-05-28'",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.i = DATE'2007-05-28'"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2;
@@ -8127,40 +9343,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<subquery3>",
- "access_type": "system",
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "table": {
- "message": "Select tables optimized away"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "table": {
+ "message": "Select tables optimized away"
+ }
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "sq.i = '10:00:02'",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.i = TIME'10:00:02'"
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "sq.i = '10:00:02'",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.i = TIME'10:00:02'"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2;
@@ -8179,25 +9405,33 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "nullif(1,v1.i)",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "nullif(1,t1.i)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "nullif(1,v1.i)",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "nullif(1,t1.i)"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP VIEW v1;
@@ -8266,36 +9500,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c = 'foo'",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.c = 'foo'"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c = 'foo'",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.c = 'foo'"
+ }
+ }
+ ]
+ }
}
}
}
- },
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "1 = t2.a"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "1 = t2.a"
+ }
+ }
+ ]
}
}
]
@@ -8315,35 +9561,47 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "<cache>(<in_optimizer>(1,<exists>(subquery#2))) or v1.c = 'foo'",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "<cache>(<in_optimizer>(1,<exists>(subquery#2))) or v1.c = 'foo'",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- },
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 128,
- "filtered": 100,
- "attached_condition": "1 = t2.a"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 128,
+ "filtered": 100,
+ "attached_condition": "1 = t2.a"
+ }
+ }
+ ]
}
}
]
@@ -8479,41 +9737,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a > 2 and t1.a is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t1.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 3,
- "filesort": {
- "sort_key": "t2.b",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b > 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a > 2 and t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "filesort": {
+ "sort_key": "t2.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b > 2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
select a
@@ -8529,41 +9797,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a > 2 and t1.a is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t1.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 3,
- "filesort": {
- "sort_key": "t2.b",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b > 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a > 2 and t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "filesort": {
+ "sort_key": "t2.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b > 2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
select a
@@ -8582,38 +9860,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a > 2 and t1.a is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t1.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 3,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b > 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a > 2 and t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b > 2"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
select a
@@ -8629,41 +9917,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a > 2 and t1.a is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["m"],
- "ref": ["test.t1.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "m > 2",
- "filesort": {
- "sort_key": "t2.b",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a > 2 and t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["m"],
+ "ref": ["test.t1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "m > 2",
+ "filesort": {
+ "sort_key": "t2.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
drop view v1,v2,v3;
@@ -8682,25 +9980,33 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.f > 0",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "f > 0",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.f > 0",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "f > 0",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP VIEW v1;
@@ -8722,42 +10028,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["i1"],
- "key": "i1",
- "key_length": "5",
- "used_key_parts": ["i1"],
- "ref": ["const"],
- "rows": 1,
- "filtered": 100,
- "using_index": true
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.i2 = 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["i1"],
+ "key": "i1",
+ "key_length": "5",
+ "used_key_parts": ["i1"],
+ "ref": ["const"],
+ "rows": 1,
+ "filtered": 100,
+ "using_index": true
+ }
},
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 3,
+ {
+ "block-nl-join": {
"table": {
- "table_name": "t2",
+ "table_name": "<derived3>",
"access_type": "ALL",
"rows": 2,
"filtered": 100,
- "attached_condition": "t2.i2 = 1"
+ "attached_condition": "v2.i2 = 1"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.i2 = 1"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP VIEW v2;
@@ -8780,26 +10096,34 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t.f = 'a' or t.f = 'b'",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t.f = 'a' or t.f = 'b'",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
drop table t1;
@@ -8827,42 +10151,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t1.id2 is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["id2"],
- "ref": ["test.t1.id2"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "vc.ct > 0",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "ct > 0",
- "filesort": {
- "sort_key": "t2.id2",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t1.id2 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["id2"],
+ "ref": ["test.t1.id2"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "vc.ct > 0",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "ct > 0",
+ "filesort": {
+ "sort_key": "t2.id2",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2;
@@ -8916,38 +10250,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.x = 1"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "v1.a = 1 and v1.b = 1 and v1.max_c > 30"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.x = 1"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "173",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c > 37 and max_c > 30",
+ {
+ "block-nl-join": {
"table": {
- "table_name": "t1",
+ "table_name": "<derived2>",
"access_type": "ALL",
"rows": 3,
"filtered": 100,
- "attached_condition": "t1.a = 1 and t1.b = 1"
+ "attached_condition": "v1.a = 1 and v1.b = 1 and v1.max_c > 30"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "173",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c > 37 and max_c > 30",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.b = 1"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
SELECT *
@@ -8991,38 +10335,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.x = 1"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "v1.a = 1 and v1.b = 1 and v1.d = 1 and v1.max_c > 30"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.x = 1"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "173",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c > 37 and max_c > 30",
+ {
+ "block-nl-join": {
"table": {
- "table_name": "t1",
+ "table_name": "<derived2>",
"access_type": "ALL",
"rows": 3,
"filtered": 100,
- "attached_condition": "t1.a = 1 and t1.b = 1 and t1.d = 1"
+ "attached_condition": "v1.a = 1 and v1.b = 1 and v1.d = 1 and v1.max_c > 30"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "173",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c > 37 and max_c > 30",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.b = 1 and t1.d = 1"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2;
@@ -9098,43 +10452,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "10",
- "used_key_parts": ["e", "max_f"],
- "ref": ["test.t1.a", "test.t1.b"],
- "rows": 2,
- "filtered": 100,
- "first_match": "t1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_f > 18",
- "filesort": {
- "sort_key": "t2.e",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t2.e > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "10",
+ "used_key_parts": ["e", "max_f"],
+ "ref": ["test.t1.a", "test.t1.b"],
+ "rows": 2,
+ "filtered": 100,
+ "first_match": "t1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_f > 18",
+ "filesort": {
+ "sort_key": "t2.e",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t2.e > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
SELECT * FROM t1
@@ -9187,42 +10551,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b < 25 and t1.a is not null and t1.b is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "10",
- "used_key_parts": ["e", "max_f"],
- "ref": ["test.t1.a", "test.t1.b"],
- "rows": 2,
- "filtered": 100,
- "first_match": "t1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_f > 18 and max_f < 25",
- "filesort": {
- "sort_key": "t2.e",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b < 25 and t1.a is not null and t1.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "10",
+ "used_key_parts": ["e", "max_f"],
+ "ref": ["test.t1.a", "test.t1.b"],
+ "rows": 2,
+ "filtered": 100,
+ "first_match": "t1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_f > 18 and max_f < 25",
+ "filesort": {
+ "sort_key": "t2.e",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
SELECT * FROM t1
@@ -9275,56 +10649,70 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a is not null and t1.b is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "max_f"],
- "ref": ["test.t1.a", "test.t1.b"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "d_tab.e > 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "filesort": {
- "sort_key": "t2.e",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t2.e > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a is not null and t1.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "max_f"],
+ "ref": ["test.t1.a", "test.t1.b"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "d_tab.e > 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "filesort": {
+ "sort_key": "t2.e",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t2.e > 1"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
+ ]
}
}
SELECT * FROM t1
@@ -9377,56 +10765,70 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a is not null and t1.b is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "max_f"],
- "ref": ["test.t1.a", "test.t1.b"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "d_tab.max_f > 20",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_f > 20",
- "filesort": {
- "sort_key": "t2.e",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a is not null and t1.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "max_f"],
+ "ref": ["test.t1.a", "test.t1.b"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "d_tab.max_f > 20",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_f > 20",
+ "filesort": {
+ "sort_key": "t2.e",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2;
@@ -9471,30 +10873,38 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "dt.a = 2",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "a = 2",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "dt.a = 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "a = 2",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
SELECT * FROM
@@ -9520,31 +10930,39 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "dt.a > 1",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "a > 1",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.a < 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "dt.a > 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "a > 1",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.a < 3"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
SELECT * FROM
@@ -9569,29 +10987,37 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "dt.a = 'ab'",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "dt.a = 'ab'",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
SELECT * FROM
@@ -9616,29 +11042,37 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "dt.a = 1",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "dt.a = 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
DROP TABLE t1;
@@ -9683,41 +11117,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "1 in (0,t1.a) and t1.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t1.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "1 in (0,t1.a) and 1 in (0,t1.a)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "1 in (0,t1.a) and t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "1 in (0,t1.a) and 1 in (0,t1.a)"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
SELECT * FROM
@@ -9741,41 +11185,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.a in (1,t1.a) and t1.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t1.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.a in (1,t1.a)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.a in (1,t1.a) and t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.a in (1,t1.a)"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
DROP TABLE t1;
@@ -9862,30 +11316,38 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t.a <= 2",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a <= 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t.a <= 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a <= 2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
INSERT INTO t3
@@ -9900,42 +11362,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "8",
- "used_key_parts": ["c"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.a = t.c and t.a >= 3",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a >= 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "8",
+ "used_key_parts": ["c"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.a = t.c and t.a >= 3",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a >= 3"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
UPDATE t2, (SELECT a, count(*) as c FROM t1 GROUP BY a) t SET t2.a=t.c+10
@@ -9953,31 +11425,41 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t.a = 2 and t2.a = t.c + 9",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a = 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t.a = 2 and t2.a = t.c + 9",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DELETE t2 FROM t2, (SELECT a, count(*) as c FROM t1 GROUP BY a) t
@@ -10017,30 +11499,38 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "case when tab2.max_a = 1 or tab2.max_a = 2 then 1 else 0 end = 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "case when max_a = 1 or max_a = 2 then 1 else 0 end = 1",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "case when tab2.max_a = 1 or tab2.max_a = 2 then 1 else 0 end = 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "case when max_a = 1 or max_a = 2 then 1 else 0 end = 1",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
SELECT *
@@ -10066,30 +11556,38 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "case when tab2.max_a = 1 or tab2.max_a > 2 and tab2.max_a < 4 then 1 else 0 end = 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "case when max_a = 1 or max_a > 2 and max_a < 4 then 1 else 0 end = 1",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "case when tab2.max_a = 1 or tab2.max_a > 2 and tab2.max_a < 4 then 1 else 0 end = 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "case when max_a = 1 or max_a > 2 and max_a < 4 then 1 else 0 end = 1",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
SELECT *
@@ -10115,30 +11613,38 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "case when tab2.max_a > 1 and (tab2.max_a = 2 or tab2.max_a > 2) then 1 else 0 end = 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "case when max_a > 1 and (max_a = 2 or max_a > 2) then 1 else 0 end = 1",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "case when tab2.max_a > 1 and (tab2.max_a = 2 or tab2.max_a > 2) then 1 else 0 end = 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "case when max_a > 1 and (max_a = 2 or max_a > 2) then 1 else 0 end = 1",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
SELECT *
@@ -10164,30 +11670,38 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "case when tab2.b = 2 or tab2.b = 4 then 1 else 0 end = 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "case when t1.b = 2 or t1.b = 4 then 1 else 0 end = 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "case when tab2.b = 2 or tab2.b = 4 then 1 else 0 end = 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "case when t1.b = 2 or t1.b = 4 then 1 else 0 end = 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
DROP TABLE t1;
@@ -10233,47 +11747,61 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 144,
- "filtered": 100,
- "attached_condition": "t.f is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 4,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 144,
+ "filtered": 100,
+ "attached_condition": "t.f is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t1.f is not null"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "64",
+ "join_type": "BNL"
+ }
}
- }
+ ]
}
- },
- "block-nl-join": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t1.f is not null"
- },
- "buffer_type": "flat",
- "buffer_size": "64",
- "join_type": "BNL"
}
}
}
- }
+ ]
}
}
SELECT * FROM t1;
@@ -10302,48 +11830,62 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t.f is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 8,
- "filtered": 100,
- "attached_condition": "t1.f is not null"
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "4",
- "used_key_parts": ["f"],
- "ref": ["test.t1.f"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 4,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 8,
- "filtered": 100,
- "attached_condition": "t1.f is not null"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t.f is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 8,
+ "filtered": 100,
+ "attached_condition": "t1.f is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "4",
+ "used_key_parts": ["f"],
+ "ref": ["test.t1.f"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 8,
+ "filtered": 100,
+ "attached_condition": "t1.f is not null"
+ }
+ }
+ ]
+ }
+ }
+ }
}
- }
+ ]
}
}
}
}
- }
+ ]
}
}
SELECT * FROM t1;
@@ -10373,36 +11915,46 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.f2 < 2 and t1.f2 is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["f2"],
- "ref": ["test.t1.f2"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.f2 < 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.f2 < 2 and t1.f2 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["f2"],
+ "ref": ["test.t1.f2"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.f2 < 2"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
SELECT * FROM t1;
@@ -10418,38 +11970,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.f2 < 2 and t1.f2 is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["f2"],
- "ref": ["test.t1.f2"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 3,
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.f2 < 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.f2 < 2 and t1.f2 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["f2"],
+ "ref": ["test.t1.f2"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.f2 < 2"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
DROP VIEW v1,v2;
@@ -10488,39 +12050,43 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "message": "no matching row in const table"
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "message": "no matching row in const table"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "table": {
+ "message": "no matching row in const table"
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "table": {
+ "message": "no matching row in const table"
+ }
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
DROP TABLE t1;
@@ -10690,54 +12256,66 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v3.col1 = 123 and v3.col2 = 321",
- "materialized": {
- "query_block": {
- "union_result": {
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["const"],
- "rows": 1,
- "filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["const"],
- "rows": 1,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v3.col1 = 123 and v3.col2 = 321",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["const"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["const"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop function f1;
@@ -10762,31 +12340,39 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "v2.s + 1 > 10 and v2.a > 1 and v2.a2 > 123",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "s + 1 > 10 and a2 > 123",
- "filesort": {
- "sort_key": "t1.a, f1(t1.a)",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "v2.s + 1 > 10 and v2.a > 1 and v2.a2 > 123",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "s + 1 > 10 and a2 > 123",
+ "filesort": {
+ "sort_key": "t1.a, f1(t1.a)",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# Extra test for 10.4+: Check that this works for pushdown into IN
@@ -10807,41 +12393,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t4.a + 1 > 10 and t4.b > 1 and t4.c > 123 and t4.a is not null and t4.b is not null and t4.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "23",
- "used_key_parts": ["a", "f1(a)", "sum(b)"],
- "ref": ["test.t4.a", "test.t4.b", "test.t4.c"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "t4.c = `<subquery2>`.`sum(b)`",
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`f1(a)` > 1 and `sum(b)` > 123",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t1.a + 1 > 10"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t4.a + 1 > 10 and t4.b > 1 and t4.c > 123 and t4.a is not null and t4.b is not null and t4.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "23",
+ "used_key_parts": ["a", "f1(a)", "sum(b)"],
+ "ref": ["test.t4.a", "test.t4.b", "test.t4.c"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "t4.c = `<subquery2>`.`sum(b)`",
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`f1(a)` > 1 and `sum(b)` > 123",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t1.a + 1 > 10"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
drop view v2;
@@ -10894,71 +12490,85 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 5 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 5 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 100",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a < 5"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 100",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using intersect in view definition
@@ -10982,72 +12592,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 8"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "v1.a = 8"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 8"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "173",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a = 8"
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "v1.a = 8"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "173",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a = 8"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 100",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a = 8 and t1.b > 10"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 100",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a = 8 and t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using intersect in view definition
@@ -11070,72 +12694,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 8"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "v1.a = 8"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 8"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "173",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a = 8"
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "v1.a = 8"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "173",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a = 8"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 100",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a = 8 and t1.b > 10"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 100",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a = 8 and t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using intersect in view definition
@@ -11160,72 +12798,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c > 200",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c > 200",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 100 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 100 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using intersect in view definition
@@ -11251,72 +12903,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 5 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c > 110",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300 and c > 110",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 5 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c > 110",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300 and c > 110",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 100 and c > 110",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a < 5"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 100 and c > 110",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using intersect in view definition
@@ -11343,72 +13009,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.b > 27 or v1.b < 19",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and (t1.b > 27 or t1.b < 19)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.b > 27 or v1.b < 19",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and (t1.b > 27 or t1.b < 19)"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 100",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and (t1.b > 27 or t1.b < 19)"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 100",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and (t1.b > 27 or t1.b < 19)"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using intersect in view definition
@@ -11441,72 +13121,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c > 200 or v1.c < 105",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300 and (c > 200 or c < 105)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c > 200 or v1.c < 105",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300 and (c > 200 or c < 105)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 100 and (c > 200 or c < 105)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 100 and (c > 200 or c < 105)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using intersect in view definition
@@ -11561,72 +13255,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "v1.a > 3 or v1.a = 1 and v1.c < 110"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "173",
- "join_type": "BNL",
- "attached_condition": "v1.c = t2.c and v1.a > 3 and t2.c > 110 or v1.a = 1 and v1.c < 110",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300 and (t1.a > 3 and c > 110 or t1.a = 1 and c < 110)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and (t1.a > 3 or t1.a = 1)"
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "v1.a > 3 or v1.a = 1 and v1.c < 110"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "173",
+ "join_type": "BNL",
+ "attached_condition": "v1.c = t2.c and v1.a > 3 and t2.c > 110 or v1.a = 1 and v1.c < 110",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300 and (t1.a > 3 and c > 110 or t1.a = 1 and c < 110)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and (t1.a > 3 or t1.a = 1)"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 100 and (t1.a > 3 and c > 110 or t1.a = 1 and c < 110)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and (t1.a > 3 or t1.a = 1)"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 100 and (t1.a > 3 and c > 110 or t1.a = 1 and c < 110)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and (t1.a > 3 or t1.a = 1)"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using intersect in view definition
@@ -11710,72 +13418,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t2.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.c = 909 and t2.b > 13 or d1.a < 4 and d1.c < 200",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300 and (t1.b > 13 or t1.a < 4 and c < 200)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and (t1.b > 13 or t1.a < 4)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t2.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.c = 909 and t2.b > 13 or d1.a < 4 and d1.c < 200",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300 and (t1.b > 13 or t1.a < 4 and c < 200)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and (t1.b > 13 or t1.a < 4)"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 100 and (t1.b > 13 or t1.a < 4 and c < 200)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and (t1.b > 13 or t1.a < 4)"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 100 and (t1.b > 13 or t1.a < 4 and c < 200)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and (t1.b > 13 or t1.a < 4)"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -11811,71 +13533,85 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 5 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 5 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a < 5"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using except in view definition
@@ -11901,72 +13637,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 6"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "v1.a = 6"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 6"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "173",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a = 6"
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "v1.a = 6"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "173",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a = 6"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a = 6 and t1.b > 10"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a = 6 and t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using except in view definition
@@ -11991,72 +13741,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a = 6"
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "v1.a = 6"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a = 6"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "173",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a = 6"
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "v1.a = 6"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "173",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a = 6"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a = 6 and t1.b > 10"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a = 6 and t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using except in view definition
@@ -12085,72 +13849,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c > 500",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200 and c > 500",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c > 500",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200 and c > 500",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 300 and c > 500",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 300 and c > 500",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using except in view definition
@@ -12176,72 +13954,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 5 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c > 500",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200 and c > 500",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 5 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c > 500",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200 and c > 500",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 300 and c > 500",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a < 5"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 300 and c > 500",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a < 5"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using except in view definition
@@ -12270,72 +14062,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.b > 27 or v1.b < 19",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and (t1.b > 27 or t1.b < 19)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.b > 27 or v1.b < 19",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and (t1.b > 27 or t1.b < 19)"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and (t1.b > 27 or t1.b < 19)"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and (t1.b > 27 or t1.b < 19)"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using except in view definition
@@ -12368,72 +14174,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c < 400 or v1.c > 800",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200 and (c < 400 or c > 800)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c < 400 or v1.c > 800",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200 and (c < 400 or c > 800)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 300 and (c < 400 or c > 800)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 300 and (c < 400 or c > 800)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using except in view definition
@@ -12486,72 +14306,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "v1.a > 1 or v1.a = 1 and v1.c > 500"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "173",
- "join_type": "BNL",
- "attached_condition": "v1.c = t2.c and v1.a > 1 and t2.c < 500 or v1.a = 1 and v1.c > 500",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "<derived2>",
"access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200 and (t1.a > 1 and c < 500 or t1.a = 1 and c > 500)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and (t1.a > 1 or t1.a = 1)"
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "v1.a > 1 or v1.a = 1 and v1.c > 500"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "173",
+ "join_type": "BNL",
+ "attached_condition": "v1.c = t2.c and v1.a > 1 and t2.c < 500 or v1.a = 1 and v1.c > 500",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200 and (t1.a > 1 and c < 500 or t1.a = 1 and c > 500)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and (t1.a > 1 or t1.a = 1)"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 300 and (t1.a > 1 and c < 500 or t1.a = 1 and c > 500)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and (t1.a > 1 or t1.a = 1)"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 300 and (t1.a > 1 and c < 500 or t1.a = 1 and c > 500)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and (t1.a > 1 or t1.a = 1)"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
# using except in view definition
@@ -12631,72 +14465,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t2.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.c = 988 and t2.b > 13 or d1.a > 4 and d1.c > 500",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200 and (t1.b > 13 or t1.a > 4 and c > 500)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and (t1.b > 13 or t1.a > 4)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t2.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.c = 988 and t2.b > 13 or d1.a > 4 and d1.c > 500",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200 and (t1.b > 13 or t1.a > 4 and c > 500)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and (t1.b > 13 or t1.a > 4)"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 300 and (t1.b > 13 or t1.a > 4 and c > 500)",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and (t1.b > 13 or t1.a > 4)"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 300 and (t1.b > 13 or t1.a > 4 and c > 500)",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and (t1.b > 13 or t1.a > 4)"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -12734,113 +14582,135 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 5 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "v1.c > 200",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a > 5"
- }
- }
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "__5.a > 5 and __5.c > 200",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect4,5>",
- "access_type": "ALL",
- "query_specifications": [
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 5 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "v1.c > 200",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
{
- "query_block": {
- "select_id": 4,
- "having_condition": "c < 300 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a > 5"
- }
- }
- }
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a > 5"
}
- },
- {
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "__5.a > 5 and __5.c > 200",
+ "materialized": {
"query_block": {
- "select_id": 5,
- "operation": "INTERSECT",
- "having_condition": "c < 530 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a > 3 and t1.a > 5"
+ "union_result": {
+ "table_name": "<intersect4,5>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "c < 300 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a > 5"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 5,
+ "operation": "INTERSECT",
+ "having_condition": "c < 530 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a > 3 and t1.a > 5"
+ }
+ }
+ ]
+ }
+ }
+ }
}
- }
+ ]
}
}
}
- ]
+ }
}
- }
+ ]
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -12878,91 +14748,109 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 4 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "v1.c < 200",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<unit2,3,4>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200 and c < 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a > 4"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 4 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "v1.c < 200",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<unit2,3,4>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200 and c < 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c < 500 and c < 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a > 3 and t1.a > 4"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c < 500 and c < 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a > 3 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "UNION",
- "having_condition": "c < 300 and c < 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a > 4"
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "UNION",
+ "having_condition": "c < 300 and c < 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -12998,91 +14886,109 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 5 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "v1.c > 200",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<unit2,3,4>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a > 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 5 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "v1.c > 200",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<unit2,3,4>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "having_condition": "c < 300 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a > 5"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "having_condition": "c < 300 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "EXCEPT",
- "having_condition": "c < 530 and c > 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a > 3 and t1.a > 5"
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "EXCEPT",
+ "having_condition": "c < 530 and c > 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a > 3 and t1.a > 5"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -13120,91 +15026,109 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 4 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "v1.c < 200",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<unit2,3,4>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 200 and c < 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a > 4"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 4 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "v1.c < 200",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<unit2,3,4>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 200 and c < 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c < 500 and c < 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a > 3 and t1.a > 4"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c < 500 and c < 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a > 3 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "UNION",
- "having_condition": "c < 300 and c < 200",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a > 4"
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "UNION",
+ "having_condition": "c < 300 and c < 200",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -13240,91 +15164,109 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 4 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c < 150",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<unit2,3,4>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300 and c < 150",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a > 4"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 4 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c < 150",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<unit2,3,4>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300 and c < 150",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c < 500 and c < 150",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 7 and t1.a > 4"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c < 500 and c < 150",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 7 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "EXCEPT",
- "having_condition": "c > 150 and c < 150",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a > 4"
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "EXCEPT",
+ "having_condition": "c > 150 and c < 150",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -13360,113 +15302,135 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 4 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c < 130",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300 and c < 130",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a > 4"
- }
- }
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "__5.a > 4 and __5.c < 130",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect4,5>",
- "access_type": "ALL",
- "query_specifications": [
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 4 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c < 130",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300 and c < 130",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
{
- "query_block": {
- "select_id": 4,
- "having_condition": "c > 150 and c < 130",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a > 4"
- }
- }
- }
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a > 4"
}
- },
- {
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "__5.a > 4 and __5.c < 130",
+ "materialized": {
"query_block": {
- "select_id": 5,
- "operation": "INTERSECT",
- "having_condition": "c < 500 and c < 130",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 7 and t1.a > 4"
+ "union_result": {
+ "table_name": "<intersect4,5>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "c > 150 and c < 130",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a > 4"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 5,
+ "operation": "INTERSECT",
+ "having_condition": "c < 500 and c < 130",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 7 and t1.a > 4"
+ }
+ }
+ ]
+ }
+ }
+ }
}
- }
+ ]
}
}
}
- ]
+ }
}
- }
+ ]
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -13506,99 +15470,144 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 4 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "v1.c < 130",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<unit2,3,6>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 300 and c < 130",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a > 4"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 4 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "v1.c < 130",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<unit2,3,6>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 300 and c < 130",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "table": {
- "table_name": "<derived4>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "__6.a > 4 and __6.c < 130",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect4,5>",
- "access_type": "ALL",
- "query_specifications": [
- {
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "__6.a > 4 and __6.c < 130",
+ "materialized": {
"query_block": {
- "select_id": 4,
- "having_condition": "c > 150 and c < 130",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a > 4"
+ "union_result": {
+ "table_name": "<intersect4,5>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 4,
+ "having_condition": "c > 150 and c < 130",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a > 4"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 5,
+ "operation": "INTERSECT",
+ "having_condition": "c < 500 and c < 130",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 7 and t1.a > 4"
+ }
+ }
+ ]
+ }
+ }
+ }
}
- }
+ ]
}
}
- },
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 6,
+ "operation": "UNION",
+ "having_condition": "c < 120 and c < 130",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
{
- "query_block": {
- "select_id": 5,
- "operation": "INTERSECT",
- "having_condition": "c < 500 and c < 130",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 7 and t1.a > 4"
- }
- }
- }
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 7 and t1.a > 4"
}
}
]
@@ -13606,32 +15615,13 @@ EXPLAIN
}
}
}
- }
- },
- {
- "query_block": {
- "select_id": 6,
- "operation": "UNION",
- "having_condition": "c < 120 and c < 130",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 7 and t1.a > 4"
- }
- }
- }
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -13668,90 +15658,108 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 4 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.c < 150",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 150",
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "v1.a < 7 and v1.a > 4",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect3,4>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 3,
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a < 7 and t1.a > 4"
- }
- }
- }
- }
- },
- {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 4 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v2.c < 150",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 150",
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "v1.a < 7 and v1.a > 4",
+ "materialized": {
"query_block": {
- "select_id": 4,
- "operation": "INTERSECT",
- "having_condition": "c > 120",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a < 7 and t1.a > 4"
+ "union_result": {
+ "table_name": "<intersect3,4>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a < 7 and t1.a > 4"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "INTERSECT",
+ "having_condition": "c > 120",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a < 7 and t1.a > 4"
+ }
+ }
+ ]
+ }
+ }
+ }
}
- }
+ ]
}
}
}
- ]
+ }
}
- }
+ ]
}
}
}
}
}
}
- }
+ ]
}
}
drop view v1,v2;
@@ -13788,90 +15796,108 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 4 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v2.c < 150",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "c < 150",
- "filesort": {
- "sort_key": "v1.a, v1.b",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "v1.a < 7 and v1.a > 4",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except3,4>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 3,
- "having_condition": "c < 300",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a < 7 and t1.a > 4"
- }
- }
- }
- }
- },
- {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 4 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v2.c < 150",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c < 150",
+ "filesort": {
+ "sort_key": "v1.a, v1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "v1.a < 7 and v1.a > 4",
+ "materialized": {
"query_block": {
- "select_id": 4,
- "operation": "EXCEPT",
- "having_condition": "c > 150",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a < 7 and t1.a > 4"
+ "union_result": {
+ "table_name": "<except3,4>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "c < 300",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a < 7 and t1.a > 4"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "EXCEPT",
+ "having_condition": "c > 150",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a < 7 and t1.a > 4"
+ }
+ }
+ ]
+ }
+ }
+ }
}
- }
+ ]
}
}
}
- ]
+ }
}
- }
+ ]
}
}
}
}
}
}
- }
+ ]
}
}
drop view v1,v2;
@@ -13904,72 +15930,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 4 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.b > 12 and v1.c < 450",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 300 and t1.b > 12 and c < 450",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a > 4"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 4 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.b > 12 and v1.c < 450",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 300 and t1.b > 12 and c < 450",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a > 4"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c > 200 and t1.a > 4 and c < 450",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b < 21 and t1.b > 12"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c > 200 and t1.a > 4 and c < 450",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b < 21 and t1.b > 12"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -14002,72 +16042,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a < 2 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.b < 30 and v1.c > 450",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 300 and t1.b < 30 and c > 450",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 20 and t1.a < 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a < 2 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.b < 30 and v1.c > 450",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 300 and t1.b < 30 and c > 450",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 20 and t1.a < 2"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c > 150 and t1.a < 2 and c > 450",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 7 and t1.b < 30"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c > 150 and t1.a < 2 and c > 450",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 7 and t1.b < 30"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -14102,72 +16156,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "(t2.a < 2 or t2.a < 5) and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c > 450",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 300 and c > 450",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 20 and (t1.a < 2 or t1.a < 5)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "(t2.a < 2 or t2.a < 5) and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c > 450",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 300 and c > 450",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 20 and (t1.a < 2 or t1.a < 5)"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "having_condition": "c > 150 and (t1.a < 2 or t1.a < 5) and c > 450",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 7"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "having_condition": "c > 150 and (t1.a < 2 or t1.a < 5) and c > 450",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 7"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -14204,91 +16272,109 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.a > 1 and t2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "v1.b > 12 and v1.c > 400",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<unit2,3,4>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "having_condition": "c > 100 and t1.b > 12 and c > 400",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a < 9 and t1.a > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.a > 1 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "v1.b > 12 and v1.c > 400",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<unit2,3,4>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "c > 100 and t1.b > 12 and c > 400",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a < 9 and t1.a > 1"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "having_condition": "c < 800 and t1.a > 1 and c > 400",
- "filesort": {
- "sort_key": "t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.a > 3 and t1.b > 12"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "having_condition": "c < 800 and t1.a > 1 and c > 400",
+ "filesort": {
+ "sort_key": "t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.a > 3 and t1.b > 12"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "UNION",
- "having_condition": "c > 300 and c > 400",
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 18,
- "filtered": 100,
- "attached_condition": "t1.b > 10 and t1.a > 1 and t1.b > 12"
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "UNION",
+ "having_condition": "c > 300 and c > 400",
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 100,
+ "attached_condition": "t1.b > 10 and t1.a > 1 and t1.b > 12"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -14330,41 +16416,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t2.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.a < 5",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t3",
- "access_type": "range",
- "possible_keys": ["i1"],
- "key": "i1",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 5,
- "filtered": 100,
- "index_condition": "t3.a > 0 and t3.a < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t2.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.a < 5",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "range",
+ "possible_keys": ["i1"],
+ "key": "i1",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 5,
+ "filtered": 100,
+ "index_condition": "t3.a > 0 and t3.a < 5"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -14399,68 +16495,82 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t2.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.a < 4",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t3",
- "access_type": "range",
- "possible_keys": ["i1"],
- "key": "i1",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 2,
- "filtered": 100,
- "index_condition": "t3.a > 1 and t3.a < 4"
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "table_name": "t3",
- "access_type": "range",
- "possible_keys": ["i1"],
- "key": "i1",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 1,
- "filtered": 100,
- "index_condition": "t3.a > 2 and t3.a < 4"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t2.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.a < 4",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "range",
+ "possible_keys": ["i1"],
+ "key": "i1",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 2,
+ "filtered": 100,
+ "index_condition": "t3.a > 1 and t3.a < 4"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "range",
+ "possible_keys": ["i1"],
+ "key": "i1",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t3.a > 2 and t3.a < 4"
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -14495,70 +16605,84 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "attached_condition": "t2.b is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["b"],
- "ref": ["test.t2.b"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.a < 3",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t3",
- "access_type": "range",
- "possible_keys": ["i1"],
- "key": "i1",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 1,
- "filtered": 100,
- "index_condition": "t3.a > 1 and t3.a < 3"
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "having_condition": "t3.a < 3",
- "filesort": {
- "sort_key": "t3.b",
- "temporary_table": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t3.b < 21"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "t2.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "ref": ["test.t2.b"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.a < 3",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "range",
+ "possible_keys": ["i1"],
+ "key": "i1",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t3.a > 1 and t3.a < 3"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "having_condition": "t3.a < 3",
+ "filesort": {
+ "sort_key": "t3.b",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t3.b < 21"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
drop view v1;
@@ -14614,35 +16738,45 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.a, t2.c"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 20,
- "filtered": 80,
- "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.a, t2.c"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 20,
+ "filtered": 80,
+ "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
@@ -14719,66 +16853,82 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 32,
- "filtered": 100,
- "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
- "materialized": {
- "query_block": {
- "union_result": {
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.a, t2.c"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 20,
- "filtered": 80,
- "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 32,
+ "filtered": 100,
+ "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.a, t2.c"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 20,
+ "filtered": 80,
+ "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.a"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 20,
- "filtered": 80,
- "attached_condition": "t2.a > 2"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.a"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 20,
+ "filtered": 80,
+ "attached_condition": "t2.a > 2"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select *
@@ -14811,45 +16961,57 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 8,
- "filtered": 100,
- "attached_condition": "t1.c in ('aa','bb','cc') and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "24",
- "used_key_parts": ["a", "c"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.a, t2.c"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t2.c in ('aa','bb','cc')"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 8,
+ "filtered": 100,
+ "attached_condition": "t1.c in ('aa','bb','cc') and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "24",
+ "used_key_parts": ["a", "c"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.a, t2.c"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t2.c in ('aa','bb','cc')"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
@@ -14939,86 +17101,106 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 48,
- "filtered": 100,
- "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
- "materialized": {
- "query_block": {
- "union_result": {
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.a, t2.c"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 20,
- "filtered": 80,
- "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 48,
+ "filtered": 100,
+ "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.a, t2.c"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 20,
+ "filtered": 80,
+ "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.a"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 20,
- "filtered": 80,
- "attached_condition": "t2.a > 2"
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.a"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 20,
+ "filtered": 80,
+ "attached_condition": "t2.a > 2"
+ }
+ }
+ ]
+ }
}
}
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "UNION",
- "having_condition": "t2.c in ('aa','bb','cc')",
- "filesort": {
- "sort_key": "t2.a",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 20,
- "filtered": 80,
- "attached_condition": "t2.a > 2"
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "UNION",
+ "having_condition": "t2.c in ('aa','bb','cc')",
+ "filesort": {
+ "sort_key": "t2.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 20,
+ "filtered": 80,
+ "attached_condition": "t2.a > 2"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from (select a, c,
@@ -15068,35 +17250,45 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.a, t2.c"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 20,
- "filtered": 80,
- "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.a, t2.c"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 20,
+ "filtered": 80,
+ "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from (select a, c,
@@ -15146,35 +17338,45 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.a, t2.c"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 20,
- "filtered": 80,
- "attached_condition": "t2.a > 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.a, t2.c"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 20,
+ "filtered": 80,
+ "attached_condition": "t2.a > 2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from (select a, c,
@@ -15224,37 +17426,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.a, t2.c"
- },
- "filesort": {
- "sort_key": "t2.c"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 20,
- "filtered": 100,
- "attached_condition": "t2.c in ('aa','bb','cc')"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.a, t2.c"
+ }
+ },
+ {
+ "filesort": {
+ "sort_key": "t2.c"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 20,
+ "filtered": 100,
+ "attached_condition": "t2.c in ('aa','bb','cc')"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
drop table t1,t2;
@@ -15327,47 +17541,57 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx_b"],
- "key": "idx_b",
- "key_length": "5",
- "used_key_parts": ["b"],
- "rows": 4,
- "filtered": 100,
- "index_condition": "t1.b < 3",
- "attached_condition": "t1.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t1.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "outer_ref_condition": "t1.a is not null",
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx_a"],
- "key": "idx_a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t1.a"],
- "rows": 1,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx_b"],
+ "key": "idx_b",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "rows": 4,
+ "filtered": 100,
+ "index_condition": "t1.b < 3",
+ "attached_condition": "t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "outer_ref_condition": "t1.a is not null",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx_a"],
+ "key": "idx_a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.a"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
prepare stmt from "select t1.a,t.s,t.m
@@ -15438,43 +17662,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "possible_keys": ["idx_b"],
- "rows": 12,
- "filtered": 83.33333588,
- "attached_condition": "t1.b <= 5 and t1.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t1.a"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "outer_ref_condition": "t1.a is not null",
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx_a"],
- "key": "idx_a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t1.a"],
- "rows": 1,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "possible_keys": ["idx_b"],
+ "rows": 12,
+ "filtered": 83.33333588,
+ "attached_condition": "t1.b <= 5 and t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.a"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "outer_ref_condition": "t1.a is not null",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx_a"],
+ "key": "idx_a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.a"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
prepare stmt from "select t1.a,t.s,t.m
@@ -15543,41 +17777,51 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "1",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t1.a"],
- "rows": 9,
- "filtered": 100,
- "attached_condition": "trigcond(trigcond(t1.a is not null))",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t2.a",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "possible_keys": ["idx_a"],
- "rows": 90,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.a"],
+ "rows": 9,
+ "filtered": 100,
+ "attached_condition": "trigcond(trigcond(t1.a is not null))",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t2.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "possible_keys": ["idx_a"],
+ "rows": 90,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
create table t3 (a int, b int, c char(127), index idx_b(b)) engine=myisam;
@@ -15634,47 +17878,57 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "range",
- "possible_keys": ["idx_b"],
- "key": "idx_b",
- "key_length": "5",
- "used_key_parts": ["b"],
- "rows": 2,
- "filtered": 100,
- "index_condition": "t3.b > 15",
- "attached_condition": "t3.a is not null and t3.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "133",
- "used_key_parts": ["a", "c"],
- "ref": ["test.t3.a", "test.t3.c"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "outer_ref_condition": "t3.a is not null and t3.c is not null",
- "table": {
- "table_name": "t4",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "133",
- "used_key_parts": ["a", "c"],
- "ref": ["test.t3.a", "test.t3.c"],
- "rows": 1,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "range",
+ "possible_keys": ["idx_b"],
+ "key": "idx_b",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "rows": 2,
+ "filtered": 100,
+ "index_condition": "t3.b > 15",
+ "attached_condition": "t3.a is not null and t3.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "133",
+ "used_key_parts": ["a", "c"],
+ "ref": ["test.t3.a", "test.t3.c"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "outer_ref_condition": "t3.a is not null and t3.c is not null",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "133",
+ "used_key_parts": ["a", "c"],
+ "ref": ["test.t3.a", "test.t3.c"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='split_materialized=off' for select t3.a,t3.c,t.max,t.min
@@ -15713,42 +17967,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "possible_keys": ["idx_b"],
- "rows": 12,
- "filtered": 83.33333588,
- "attached_condition": "t3.b <= 15 and t3.a is not null and t3.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "133",
- "used_key_parts": ["a", "c"],
- "ref": ["test.t3.a", "test.t3.c"],
- "rows": 4,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t4.a, t4.c",
- "temporary_table": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 40,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "possible_keys": ["idx_b"],
+ "rows": 12,
+ "filtered": 83.33333588,
+ "attached_condition": "t3.b <= 15 and t3.a is not null and t3.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "133",
+ "used_key_parts": ["a", "c"],
+ "ref": ["test.t3.a", "test.t3.c"],
+ "rows": 4,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t4.a, t4.c",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 40,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='split_materialized=off' for select t3.a,t3.c,t.max,t.min
@@ -15787,47 +18051,57 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "range",
- "possible_keys": ["idx_b"],
- "key": "idx_b",
- "key_length": "5",
- "used_key_parts": ["b"],
- "rows": 2,
- "filtered": 100,
- "index_condition": "t3.b > 15",
- "attached_condition": "t3.a is not null and t3.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "133",
- "used_key_parts": ["a", "c"],
- "ref": ["test.t3.a", "test.t3.c"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "outer_ref_condition": "t3.a is not null and t3.c is not null",
- "table": {
- "table_name": "t4",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "133",
- "used_key_parts": ["a", "c"],
- "ref": ["test.t3.a", "test.t3.c"],
- "rows": 1,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "range",
+ "possible_keys": ["idx_b"],
+ "key": "idx_b",
+ "key_length": "5",
+ "used_key_parts": ["b"],
+ "rows": 2,
+ "filtered": 100,
+ "index_condition": "t3.b > 15",
+ "attached_condition": "t3.a is not null and t3.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "133",
+ "used_key_parts": ["a", "c"],
+ "ref": ["test.t3.a", "test.t3.c"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "outer_ref_condition": "t3.a is not null and t3.c is not null",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "133",
+ "used_key_parts": ["a", "c"],
+ "ref": ["test.t3.a", "test.t3.c"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='split_materialized=off' for select t3.a,t3.c,t.max,t.min
@@ -15866,42 +18140,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "possible_keys": ["idx_b"],
- "rows": 12,
- "filtered": 83.33333588,
- "attached_condition": "t3.b <= 15 and t3.a is not null and t3.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "133",
- "used_key_parts": ["a", "c"],
- "ref": ["test.t3.a", "test.t3.c"],
- "rows": 4,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t4.c, t4.a",
- "temporary_table": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 40,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "possible_keys": ["idx_b"],
+ "rows": 12,
+ "filtered": 83.33333588,
+ "attached_condition": "t3.b <= 15 and t3.a is not null and t3.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "133",
+ "used_key_parts": ["a", "c"],
+ "ref": ["test.t3.a", "test.t3.c"],
+ "rows": 4,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t4.c, t4.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 40,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
drop index idx_a on t2;
@@ -15951,59 +18235,71 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "133",
- "used_key_parts": ["c", "b"],
- "rows": 2,
- "filtered": 100,
- "index_condition": "t2.b between 80 and 85 and t2.c in ('y','z')",
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "t3",
- "access_type": "ref",
- "possible_keys": ["idx_a"],
- "key": "idx_a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "t3.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "128",
- "used_key_parts": ["c"],
- "ref": ["test.t3.c"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "outer_ref_condition": "t3.c is not null",
- "table": {
- "table_name": "t4",
- "access_type": "ref",
- "possible_keys": ["idx_c"],
- "key": "idx_c",
- "key_length": "128",
- "used_key_parts": ["c"],
- "ref": ["test.t3.c"],
- "rows": 2,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "133",
+ "used_key_parts": ["c", "b"],
+ "rows": 2,
+ "filtered": 100,
+ "index_condition": "t2.b between 80 and 85 and t2.c in ('y','z')",
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ref",
+ "possible_keys": ["idx_a"],
+ "key": "idx_a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "t3.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "128",
+ "used_key_parts": ["c"],
+ "ref": ["test.t3.c"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "outer_ref_condition": "t3.c is not null",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ref",
+ "possible_keys": ["idx_c"],
+ "key": "idx_c",
+ "key_length": "128",
+ "used_key_parts": ["c"],
+ "ref": ["test.t3.c"],
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='split_materialized=off' for select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
@@ -16086,7 +18382,7 @@ explain extended select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t2 ALL NULL NULL NULL NULL 90 63.28 Using where
+1 PRIMARY t2 ALL NULL NULL NULL NULL 90 60.00 Using where
1 PRIMARY t3 ref idx_a idx_a 5 test.t2.a 1 100.00 Using where
1 PRIMARY <derived2> ref key0 key0 128 test.t3.c 10 100.00
2 DERIVED t4 ALL idx_c NULL NULL NULL 160 100.00 Using temporary; Using filesort
@@ -16099,53 +18395,65 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 90,
- "filtered": 63.28125,
- "attached_condition": "t2.b < 40 and t2.a is not null"
- },
- "table": {
- "table_name": "t3",
- "access_type": "ref",
- "possible_keys": ["idx_a"],
- "key": "idx_a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "t3.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "128",
- "used_key_parts": ["c"],
- "ref": ["test.t3.c"],
- "rows": 10,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t4.c",
- "temporary_table": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "possible_keys": ["idx_c"],
- "rows": 160,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 90,
+ "filtered": 60,
+ "attached_condition": "t2.b < 40 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ref",
+ "possible_keys": ["idx_a"],
+ "key": "idx_a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "t3.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "128",
+ "used_key_parts": ["c"],
+ "ref": ["test.t3.c"],
+ "rows": 10,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t4.c",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "possible_keys": ["idx_c"],
+ "rows": 160,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='split_materialized=off' for select *
@@ -16199,68 +18507,82 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "133",
- "used_key_parts": ["c", "b"],
- "rows": 2,
- "filtered": 100,
- "index_condition": "t2.b between 80 and 85 and t2.c in ('y','z')",
- "attached_condition": "t2.a is not null"
- },
- "table": {
- "table_name": "t3",
- "access_type": "ref",
- "possible_keys": ["idx_a"],
- "key": "idx_a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "t3.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "128",
- "used_key_parts": ["c"],
- "ref": ["test.t3.c"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "outer_ref_condition": "t3.c is not null",
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t4.c"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t4",
- "access_type": "ref",
- "possible_keys": ["idx_c"],
- "key": "idx_c",
- "key_length": "128",
- "used_key_parts": ["c"],
- "ref": ["test.t3.c"],
- "rows": 2,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "133",
+ "used_key_parts": ["c", "b"],
+ "rows": 2,
+ "filtered": 100,
+ "index_condition": "t2.b between 80 and 85 and t2.c in ('y','z')",
+ "attached_condition": "t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ref",
+ "possible_keys": ["idx_a"],
+ "key": "idx_a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "t3.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "128",
+ "used_key_parts": ["c"],
+ "ref": ["test.t3.c"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "outer_ref_condition": "t3.c is not null",
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t4.c"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ref",
+ "possible_keys": ["idx_c"],
+ "key": "idx_c",
+ "key_length": "128",
+ "used_key_parts": ["c"],
+ "ref": ["test.t3.c"],
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
set statement optimizer_switch='split_materialized=off' for select *
@@ -16583,7 +18905,7 @@ explain extended select *
from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t2 ALL NULL NULL NULL NULL 90 63.28 Using where
+1 PRIMARY t2 ALL NULL NULL NULL NULL 90 60.00 Using where
1 PRIMARY t3 ref idx_a idx_a 5 test.t2.a 1 100.00 Using where
1 PRIMARY <derived2> ref key0 key0 128 test.t3.c 10 100.00
2 DERIVED t4 ALL idx_c NULL NULL NULL 160 100.00 Using temporary
@@ -16596,57 +18918,71 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 90,
- "filtered": 63.28125,
- "attached_condition": "t2.b < 40 and t2.a is not null"
- },
- "table": {
- "table_name": "t3",
- "access_type": "ref",
- "possible_keys": ["idx_a"],
- "key": "idx_a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "t3.c is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "128",
- "used_key_parts": ["c"],
- "ref": ["test.t3.c"],
- "rows": 10,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t4.c"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "possible_keys": ["idx_c"],
- "rows": 160,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 90,
+ "filtered": 60,
+ "attached_condition": "t2.b < 40 and t2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ref",
+ "possible_keys": ["idx_a"],
+ "key": "idx_a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "t3.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "128",
+ "used_key_parts": ["c"],
+ "ref": ["test.t3.c"],
+ "rows": 10,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t4.c"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "possible_keys": ["idx_c"],
+ "rows": 160,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
drop table t1,t2,t3,t4;
@@ -16699,84 +19035,102 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t4",
- "access_type": "range",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 1,
- "filtered": 100,
- "index_condition": "t4.a < 2",
- "attached_condition": "t4.c is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "128",
- "used_key_parts": ["c"],
- "ref": ["test.t4.c"],
- "rows": 2,
- "filtered": 100,
- "first_match": "t4",
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 3,
- "const_condition": "1",
- "outer_ref_condition": "t4.c is not null",
- "table": {
- "table_name": "t3",
- "access_type": "ref",
- "possible_keys": ["c"],
- "key": "c",
- "key_length": "128",
- "used_key_parts": ["c"],
- "ref": ["test.t4.c"],
- "rows": 2,
- "filtered": 100
- },
- "table": {
- "table_name": "<subquery4>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "4",
- "used_key_parts": ["a"],
- "ref": ["func"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 4,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- },
- "block-nl-join": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t4",
+ "access_type": "range",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t4.a < 2",
+ "attached_condition": "t4.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "128",
+ "used_key_parts": ["c"],
+ "ref": ["test.t4.c"],
+ "rows": 2,
+ "filtered": 100,
+ "first_match": "t4",
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 3,
+ "const_condition": "1",
+ "outer_ref_condition": "t4.c is not null",
+ "nested_loop": [
+ {
"table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
+ "table_name": "t3",
+ "access_type": "ref",
+ "possible_keys": ["c"],
+ "key": "c",
+ "key_length": "128",
+ "used_key_parts": ["c"],
+ "ref": ["test.t4.c"],
+ "rows": 2,
"filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL",
- "attached_condition": "t2.i = t1.i and t2.i = t1.i"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery4>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "4",
+ "used_key_parts": ["a"],
+ "ref": ["func"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 4,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL",
+ "attached_condition": "t2.i = t1.i and t2.i = t1.i"
+ }
+ }
+ ]
+ }
+ }
+ }
}
- }
+ ]
}
}
}
}
- }
+ ]
}
}
DROP VIEW v1;
@@ -16851,43 +19205,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "possible_keys": ["PRIMARY"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.f <> 5"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "4",
- "used_key_parts": ["pk2"],
- "ref": ["test.t1.pk1"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk2"],
- "ref": ["test.t1.pk1"],
- "rows": 1,
- "filtered": 100,
- "using_index": true
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "possible_keys": ["PRIMARY"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.f <> 5"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "4",
+ "used_key_parts": ["pk2"],
+ "ref": ["test.t1.pk1"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk2"],
+ "ref": ["test.t1.pk1"],
+ "rows": 1,
+ "filtered": 100,
+ "using_index": true
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
DROP VIEW v2;
@@ -17283,58 +19647,66 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 50,
- "attached_condition": "v1.a = 3",
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<union2,3>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 2,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 50,
- "attached_condition": "t1.a = 3"
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "UNION",
- "table": {
- "message": "No tables used"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 50,
+ "attached_condition": "v1.a = 3",
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<union2,3>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 2,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 50,
+ "attached_condition": "t1.a = 3"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "UNION",
+ "table": {
+ "message": "No tables used"
+ }
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
SELECT * from v1 WHERE a=3;
@@ -17381,73 +19753,91 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t3.`id` is not null and t3.`id` is not null"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t3.id"],
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "<subquery3>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "4",
- "used_key_parts": ["a"],
- "ref": ["func"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t3.`id` is not null and t3.`id` is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t3.id"],
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "4",
+ "used_key_parts": ["a"],
+ "ref": ["func"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t3.id"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "cp2",
- "access_type": "range",
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 8,
- "filtered": 100,
- "using_index_for_group_by": true
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t3.id"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "cp2",
+ "access_type": "range",
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 8,
+ "filtered": 100,
+ "using_index_for_group_by": true
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
set optimizer_switch="split_materialized=default";
@@ -17471,78 +19861,96 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t3.`id` is not null and t3.`id` is not null"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t3.id"],
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "<subquery3>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "4",
- "used_key_parts": ["a"],
- "ref": ["func"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t3.`id` is not null and t3.`id` is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t3.id"],
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "4",
+ "used_key_parts": ["a"],
+ "ref": ["func"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
- }
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t3.id"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "outer_ref_condition": "t1.a is not null",
- "table": {
- "table_name": "cp2",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t1.a"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "cp2.a = t3.`id`",
- "using_index": true
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t3.id"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "outer_ref_condition": "t1.a is not null",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "cp2",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t1.a"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "cp2.a = t3.`id`",
+ "using_index": true
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
prepare stmt from "select * from t1, (select a from t1 cp2 group by a) dt, t3
@@ -17664,60 +20072,72 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "range",
- "possible_keys": ["t1_id"],
- "key": "t1_id",
- "key_length": "5",
- "used_key_parts": ["t1_id"],
- "rows": 47,
- "filtered": 100,
- "attached_condition": "t3.t1_id between 200 and 100000 and t3.t1_id is not null",
- "using_index": true
- },
- "table": {
- "table_name": "t1",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["id"],
- "ref": ["test.t3.t1_id"],
- "rows": 1,
- "filtered": 100,
- "using_index": true
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["t1_id"],
- "ref": ["test.t3.t1_id"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["t1_id"],
- "key": "t1_id",
- "key_length": "5",
- "used_key_parts": ["t1_id"],
- "ref": ["test.t1.id"],
- "rows": 3,
- "filtered": 58.59375,
- "index_condition": "t2.t1_id between 200 and 100000 and t2.t1_id = t3.t1_id",
- "attached_condition": "t2.reporting_person = 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "range",
+ "possible_keys": ["t1_id"],
+ "key": "t1_id",
+ "key_length": "5",
+ "used_key_parts": ["t1_id"],
+ "rows": 47,
+ "filtered": 100,
+ "attached_condition": "t3.t1_id between 200 and 100000 and t3.t1_id is not null",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["id"],
+ "ref": ["test.t3.t1_id"],
+ "rows": 1,
+ "filtered": 100,
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["t1_id"],
+ "ref": ["test.t3.t1_id"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["t1_id"],
+ "key": "t1_id",
+ "key_length": "5",
+ "used_key_parts": ["t1_id"],
+ "ref": ["test.t1.id"],
+ "rows": 3,
+ "filtered": 59.09090805,
+ "index_condition": "t2.t1_id between 200 and 100000 and t2.t1_id = t3.t1_id",
+ "attached_condition": "t2.reporting_person = 1"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
set optimizer_switch='split_materialized=off';
@@ -17877,54 +20297,70 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "charges",
- "access_type": "ALL",
- "possible_keys": ["PRIMARY", "fk_charge_from_ledger", "fk_charge_to_ledger"],
- "rows": 20,
- "filtered": 40,
- "attached_condition": "charges.to_ledger_id = 2"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "17",
- "used_key_parts": ["ledger_id", "charge_id"],
- "ref": ["test.charges.from_ledger_id", "test.charges.id"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "transaction_items",
- "access_type": "ref",
- "possible_keys": ["fk_items_transaction", "fk_items_charge"],
- "key": "fk_items_charge",
- "key_length": "9",
- "used_key_parts": ["charge_id"],
- "ref": ["test.charges.id"],
- "rows": 2,
- "filtered": 100
- },
- "table": {
- "table_name": "transactions",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "fk_transactions_ledger"],
- "key": "PRIMARY",
- "key_length": "8",
- "used_key_parts": ["id"],
- "ref": ["test.transaction_items.transaction_id"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "transactions.ledger_id = charges.from_ledger_id"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "charges",
+ "access_type": "ALL",
+ "possible_keys": [
+ "PRIMARY",
+ "fk_charge_from_ledger",
+ "fk_charge_to_ledger"
+ ],
+ "rows": 20,
+ "filtered": 40,
+ "attached_condition": "charges.to_ledger_id = 2"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "17",
+ "used_key_parts": ["ledger_id", "charge_id"],
+ "ref": ["test.charges.from_ledger_id", "test.charges.id"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "transaction_items",
+ "access_type": "ref",
+ "possible_keys": ["fk_items_transaction", "fk_items_charge"],
+ "key": "fk_items_charge",
+ "key_length": "9",
+ "used_key_parts": ["charge_id"],
+ "ref": ["test.charges.id"],
+ "rows": 2,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "transactions",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "fk_transactions_ledger"],
+ "key": "PRIMARY",
+ "key_length": "8",
+ "used_key_parts": ["id"],
+ "ref": ["test.transaction_items.transaction_id"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "transactions.ledger_id = charges.from_ledger_id"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
set optimizer_switch='split_materialized=off';
@@ -18055,54 +20491,66 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "charges",
- "access_type": "ALL",
- "possible_keys": ["fk_charge_to_ledger"],
- "rows": 20,
- "filtered": 50,
- "attached_condition": "charges.to_ledger_id = 2"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "18",
- "used_key_parts": ["ledger_id", "charge_id"],
- "ref": ["test.charges.from_ledger_id", "test.charges.id"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "lateral": 1,
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "transaction_items",
- "access_type": "ref",
- "possible_keys": ["fk_items_transaction", "fk_items_charge"],
- "key": "fk_items_charge",
- "key_length": "9",
- "used_key_parts": ["charge_id"],
- "ref": ["test.charges.id"],
- "rows": 2,
- "filtered": 100
- },
- "table": {
- "table_name": "transactions",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "fk_transactions_ledger"],
- "key": "PRIMARY",
- "key_length": "8",
- "used_key_parts": ["id"],
- "ref": ["test.transaction_items.transaction_id"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "transactions.ledger_id = charges.from_ledger_id"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "charges",
+ "access_type": "ALL",
+ "possible_keys": ["fk_charge_to_ledger"],
+ "rows": 20,
+ "filtered": 50,
+ "attached_condition": "charges.to_ledger_id = 2"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "18",
+ "used_key_parts": ["ledger_id", "charge_id"],
+ "ref": ["test.charges.from_ledger_id", "test.charges.id"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "lateral": 1,
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "transaction_items",
+ "access_type": "ref",
+ "possible_keys": ["fk_items_transaction", "fk_items_charge"],
+ "key": "fk_items_charge",
+ "key_length": "9",
+ "used_key_parts": ["charge_id"],
+ "ref": ["test.charges.id"],
+ "rows": 2,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "transactions",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "fk_transactions_ledger"],
+ "key": "PRIMARY",
+ "key_length": "8",
+ "used_key_parts": ["id"],
+ "ref": ["test.transaction_items.transaction_id"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "transactions.ledger_id = charges.from_ledger_id"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
set optimizer_switch='split_materialized=off';
@@ -18249,3 +20697,20 @@ id select_type table type possible_keys key key_len ref rows Extra
drop view v1;
drop table t1;
# End of 10.4 tests
+#
+# MDEV-28958: condition pushable into view after simplification
+# contains constant TRUE/FALSE as subformula
+#
+create table t1 (c1 int);
+insert into t1 values (3), (7), (1), (3), (1), (3);
+create table t2 (c2 int);
+insert into t2 values (3), (5), (7), (3);
+create view v1 as select * from t1 group by c1;
+create view v2 as select c1 as a, c2 as b from v1,t2 where c1=c2;
+select * from v2 group by a,b having a=b or b > a+10;
+a b
+3 3
+7 7
+drop view v1,v2;
+drop table t1,t2;
+# End of 10.7 tests
diff --git a/mysql-test/main/derived_cond_pushdown.test b/mysql-test/main/derived_cond_pushdown.test
index 17115c143ac..dc454bf80de 100644
--- a/mysql-test/main/derived_cond_pushdown.test
+++ b/mysql-test/main/derived_cond_pushdown.test
@@ -3944,3 +3944,24 @@ drop view v1;
drop table t1;
--echo # End of 10.4 tests
+
+--echo #
+--echo # MDEV-28958: condition pushable into view after simplification
+--echo # contains constant TRUE/FALSE as subformula
+--echo #
+
+create table t1 (c1 int);
+insert into t1 values (3), (7), (1), (3), (1), (3);
+
+create table t2 (c2 int);
+insert into t2 values (3), (5), (7), (3);
+
+create view v1 as select * from t1 group by c1;
+create view v2 as select c1 as a, c2 as b from v1,t2 where c1=c2;
+
+select * from v2 group by a,b having a=b or b > a+10;
+
+drop view v1,v2;
+drop table t1,t2;
+
+--echo # End of 10.7 tests
diff --git a/mysql-test/main/derived_view.result b/mysql-test/main/derived_view.result
index 15a7784c890..b86cd1c42cc 100644
--- a/mysql-test/main/derived_view.result
+++ b/mysql-test/main/derived_view.result
@@ -381,41 +381,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t2.f2 in (2,3) and t2.f2 is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["f1"],
- "ref": ["test.t2.f2"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t1.f1",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t1.f1 in (2,3)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t2.f2 in (2,3) and t2.f2 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["f1"],
+ "ref": ["test.t2.f2"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t1.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t1.f1 in (2,3)"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
select * from v1 join v4 on f1=f2;
@@ -475,46 +485,58 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "tt.f1",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "tt.f1 > 2",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "filesort": {
- "sort_key": "t1.f1",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t1.f1 < 7 and t1.f1 > 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "tt.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "tt.f1 > 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "filesort": {
+ "sort_key": "t1.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t1.f1 < 7 and t1.f1 > 2"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
}
- }
+ ]
}
}
select * from (select * from
@@ -544,58 +566,72 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "tt.f1 > 2 and tt.f1 > 2 and tt.f1 is not null",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "filesort": {
- "sort_key": "t1.f1",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t1.f1 < 7 and t1.f1 > 2 and t1.f1 > 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "tt.f1 > 2 and tt.f1 > 2 and tt.f1 is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "filesort": {
+ "sort_key": "t1.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t1.f1 < 7 and t1.f1 > 2 and t1.f1 > 2"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived5>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["f1"],
- "ref": ["tt.f1"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 5,
- "filesort": {
- "sort_key": "t1.f1",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t1.f1 < 7 and t1.f1 > 2 and t1.f1 > 2"
+ },
+ {
+ "table": {
+ "table_name": "<derived5>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["f1"],
+ "ref": ["tt.f1"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 5,
+ "filesort": {
+ "sort_key": "t1.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t1.f1 < 7 and t1.f1 > 2 and t1.f1 > 2"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
flush status;
@@ -671,92 +707,114 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "x.f1 is not null",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "tt.f1",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "tt.f1 > 2",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "filesort": {
- "sort_key": "t1.f1",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t1.f1 < 7 and t1.f1 > 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "x.f1 is not null",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "tt.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "tt.f1 > 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "filesort": {
+ "sort_key": "t1.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t1.f1 < 7 and t1.f1 > 2"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
- },
- "table": {
- "table_name": "<derived4>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["f1"],
- "ref": ["x.f1"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 4,
- "filesort": {
- "sort_key": "tt.f1",
- "temporary_table": {
- "table": {
- "table_name": "<derived5>",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "tt.f1 > 2",
- "materialized": {
- "query_block": {
- "select_id": 5,
- "filesort": {
- "sort_key": "t1.f1",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t1.f1 < 7 and t1.f1 > 2"
+ },
+ {
+ "table": {
+ "table_name": "<derived4>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["f1"],
+ "ref": ["x.f1"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 4,
+ "filesort": {
+ "sort_key": "tt.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived5>",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "tt.f1 > 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 5,
+ "filesort": {
+ "sort_key": "t1.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t1.f1 < 7 and t1.f1 > 2"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
}
- }
+ ]
}
}
select * from
@@ -795,30 +853,38 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "v1.f1 < 7",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "filesort": {
- "sort_key": "t1.f1",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t1.f1 < 7"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "v1.f1 < 7",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "filesort": {
+ "sort_key": "t1.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t1.f1 < 7"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
select * from ( select * from v1 where f1 < 7) tt;
@@ -873,41 +939,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t2.f2 < 7 and t2.f2 in (2,3) and t2.f2 is not null"
- },
- "table": {
- "table_name": "<derived5>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["f1"],
- "ref": ["test.t2.f2"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 5,
- "filesort": {
- "sort_key": "t1.f1",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100,
- "attached_condition": "t1.f1 < 7 and t1.f1 in (2,3)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t2.f2 < 7 and t2.f2 in (2,3) and t2.f2 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived5>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["f1"],
+ "ref": ["test.t2.f2"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 5,
+ "filesort": {
+ "sort_key": "t1.f1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100,
+ "attached_condition": "t1.f1 < 7 and t1.f1 in (2,3)"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
select * from v6 join v7 on f2=f1;
diff --git a/mysql-test/main/desc_index_range.result b/mysql-test/main/desc_index_range.result
new file mode 100644
index 00000000000..6b1f2e31c31
--- /dev/null
+++ b/mysql-test/main/desc_index_range.result
@@ -0,0 +1,201 @@
+create table t1 (
+a int,
+key (a desc)
+);
+insert into t1 select seq from seq_1_to_1000;
+set optimizer_trace=1;
+explain select * from t1 force index(a) where a in (2, 4, 6);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 5 NULL 3 Using where; Using index
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+[
+ [
+ "(6) <= (a DESC) <= (6)",
+ "(4) <= (a DESC) <= (4)",
+ "(2) <= (a DESC) <= (2)"
+ ]
+]
+set optimizer_trace=default;
+# These should go in reverse order:
+select * from t1 force index(a) where a in (2, 4, 6);
+a
+6
+4
+2
+drop table t1;
+#
+# Multi-part key tests
+#
+create table t1 (
+a int not null,
+b int not null,
+key ab(a, b desc)
+);
+insert into t1 select A.seq, B.seq*10 from seq_1_to_10 A, seq_1_to_10 B;
+set optimizer_trace=1;
+explain select * from t1 force index(ab) where a>=8 and b>=50;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ab ab 4 NULL 51 Using where; Using index
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+[
+ ["(8) <= (a)"]
+]
+explain select * from t1 force index(ab) where a>=8 and b<=50;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ab ab 8 NULL 46 Using where; Using index
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+[
+ ["(8,50) <= (a,b DESC)"]
+]
+select * from t1 force index(ab) where a>=8 and b<=50;
+a b
+8 50
+8 40
+8 30
+8 20
+8 10
+9 50
+9 40
+9 30
+9 20
+9 10
+10 50
+10 40
+10 30
+10 20
+10 10
+select * from t1 ignore index(ab) where a>=8 and b<=50 order by a, b desc;
+a b
+8 50
+8 40
+8 30
+8 20
+8 10
+9 50
+9 40
+9 30
+9 20
+9 10
+10 50
+10 40
+10 30
+10 20
+10 10
+explain
+select * from t1 where a between 2 and 4 and b between 50 and 80;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range ab ab 8 NULL 17 Using where; Using index
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+[
+ ["(2,80) <= (a,b DESC) <= (4,50)"]
+]
+select * from t1 where a between 2 and 4 and b between 50 and 80;
+a b
+2 80
+2 70
+2 60
+2 50
+3 80
+3 70
+3 60
+3 50
+4 80
+4 70
+4 60
+4 50
+drop table t1;
+create table t2 (
+a int not null,
+b int not null,
+key ab(a desc, b desc)
+);
+insert into t2 select A.seq, B.seq*10 from seq_1_to_10 A, seq_1_to_10 B;
+explain
+select * from t2 where a between 2 and 4;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 range ab ab 4 NULL 40 Using where; Using index
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+[
+ ["(4) <= (a DESC) <= (2)"]
+]
+explain
+select * from t2 where a between 2 and 4 and b between 50 and 80;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t2 range ab ab 8 NULL 31 Using where; Using index
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+[
+ ["(4,80) <= (a DESC,b DESC) <= (2,50)"]
+]
+drop table t2;
+#
+# Check that "Using index for group-by" is disabled (it's not supported, yet)
+#
+CREATE TABLE t1 (p int NOT NULL, a int NOT NULL, PRIMARY KEY (p,a desc));
+insert into t1 select 2,seq from seq_0_to_1000;
+EXPLAIN select MIN(a) from t1 where p = 2 group by p;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref PRIMARY PRIMARY 4 const 1000 Using index
+select json_detailed(json_extract(trace, '$**.potential_group_range_indexes'))
+from information_schema.optimizer_trace;
+json_detailed(json_extract(trace, '$**.potential_group_range_indexes'))
+[
+ [
+ {
+ "index": "PRIMARY",
+ "usable": false,
+ "cause": "Reverse-ordered (not supported yet)"
+ }
+ ]
+]
+drop table t1;
+set optimizer_trace=default;
+#
+# MDEV-27426: Wrong result upon query using index_merge with DESC key
+#
+CREATE TABLE t1 (pk INT, a INT, b int, KEY(a), PRIMARY KEY(pk DESC))
+ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,4,5),(2,9,6),(3,NULL,7),(4,NULL,8);
+SELECT * FROM t1 WHERE pk > 10 OR a > 0;
+pk a b
+2 9 6
+1 4 5
+DROP TABLE t1;
+#
+# MDEV-27529: Wrong result upon query using index_merge with DESC key (#2)
+#
+create table t1 (
+pk int,
+a int,
+b int,
+primary key(pk desc),
+key(a),
+key(b)
+) engine=innodb;
+insert into t1 values (0, 111111, 255);
+insert into t1 select seq+50000, NULL, seq+1000 from seq_1_to_260;
+insert into t1 values (10000, NULL, 255);
+insert into t1 select seq+20000, seq+20000, seq+20000 from seq_1_to_1500;
+analyze table t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+# Must use ROR-intersect:
+explain select * from t1 where b = 255 AND a IS NULL;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index_merge a,b b,a 5,5 NULL 1 Using intersect(b,a); Using where; Using index
+select * from t1 where b = 255 AND a IS NULL;
+pk a b
+10000 NULL 255
+drop table t1;
diff --git a/mysql-test/main/desc_index_range.test b/mysql-test/main/desc_index_range.test
new file mode 100644
index 00000000000..ec52e254fe7
--- /dev/null
+++ b/mysql-test/main/desc_index_range.test
@@ -0,0 +1,143 @@
+#
+# Tests for range access and descending indexes
+#
+--source include/have_sequence.inc
+--source include/have_innodb.inc
+
+# The test uses optimizer trace:
+--source include/not_embedded.inc
+
+create table t1 (
+ a int,
+ key (a desc)
+);
+insert into t1 select seq from seq_1_to_1000;
+
+set optimizer_trace=1;
+explain select * from t1 force index(a) where a in (2, 4, 6);
+
+#enable after fix MDEV-27871
+--disable_view_protocol
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+--enable_view_protocol
+set optimizer_trace=default;
+
+--echo # These should go in reverse order:
+select * from t1 force index(a) where a in (2, 4, 6);
+drop table t1;
+
+--echo #
+--echo # Multi-part key tests
+--echo #
+create table t1 (
+ a int not null,
+ b int not null,
+ key ab(a, b desc)
+);
+
+insert into t1 select A.seq, B.seq*10 from seq_1_to_10 A, seq_1_to_10 B;
+
+#enable after fix MDEV-27871
+--disable_view_protocol
+set optimizer_trace=1;
+explain select * from t1 force index(ab) where a>=8 and b>=50;
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+
+explain select * from t1 force index(ab) where a>=8 and b<=50;
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+--enable_view_protocol
+
+select * from t1 force index(ab) where a>=8 and b<=50;
+select * from t1 ignore index(ab) where a>=8 and b<=50 order by a, b desc;
+
+#enable after fix MDEV-27871
+--disable_view_protocol
+explain
+select * from t1 where a between 2 and 4 and b between 50 and 80;
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+--enable_view_protocol
+
+select * from t1 where a between 2 and 4 and b between 50 and 80;
+
+drop table t1;
+
+create table t2 (
+ a int not null,
+ b int not null,
+ key ab(a desc, b desc)
+);
+insert into t2 select A.seq, B.seq*10 from seq_1_to_10 A, seq_1_to_10 B;
+
+#enable after fix MDEV-27871
+--disable_view_protocol
+explain
+select * from t2 where a between 2 and 4;
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+
+explain
+select * from t2 where a between 2 and 4 and b between 50 and 80;
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+--enable_view_protocol
+
+drop table t2;
+
+--echo #
+--echo # Check that "Using index for group-by" is disabled (it's not supported, yet)
+--echo #
+CREATE TABLE t1 (p int NOT NULL, a int NOT NULL, PRIMARY KEY (p,a desc));
+insert into t1 select 2,seq from seq_0_to_1000;
+EXPLAIN select MIN(a) from t1 where p = 2 group by p;
+#enable after fix MDEV-27871
+--disable_view_protocol
+select json_detailed(json_extract(trace, '$**.potential_group_range_indexes'))
+from information_schema.optimizer_trace;
+--enable_view_protocol
+drop table t1;
+
+set optimizer_trace=default;
+
+--echo #
+--echo # MDEV-27426: Wrong result upon query using index_merge with DESC key
+--echo #
+
+CREATE TABLE t1 (pk INT, a INT, b int, KEY(a), PRIMARY KEY(pk DESC))
+ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,4,5),(2,9,6),(3,NULL,7),(4,NULL,8);
+
+SELECT * FROM t1 WHERE pk > 10 OR a > 0;
+DROP TABLE t1;
+
+
+--echo #
+--echo # MDEV-27529: Wrong result upon query using index_merge with DESC key (#2)
+--echo #
+
+create table t1 (
+ pk int,
+ a int,
+ b int,
+ primary key(pk desc),
+ key(a),
+ key(b)
+) engine=innodb;
+
+insert into t1 values (0, 111111, 255);
+
+insert into t1 select seq+50000, NULL, seq+1000 from seq_1_to_260;
+
+insert into t1 values (10000, NULL, 255);
+insert into t1 select seq+20000, seq+20000, seq+20000 from seq_1_to_1500;
+
+analyze table t1;
+
+--echo # Must use ROR-intersect:
+explain select * from t1 where b = 255 AND a IS NULL;
+select * from t1 where b = 255 AND a IS NULL;
+
+drop table t1;
diff --git a/mysql-test/main/drop_table_force.result b/mysql-test/main/drop_table_force.result
index 404d8be8b21..1dd0f1f9dab 100644
--- a/mysql-test/main/drop_table_force.result
+++ b/mysql-test/main/drop_table_force.result
@@ -1,6 +1,4 @@
-CALL mtr.add_suppression("Operating system error number");
-CALL mtr.add_suppression("The error means the system cannot");
-CALL mtr.add_suppression("returned OS error 71");
+CALL mtr.add_suppression("InnoDB: File .*test/t1\\.ibd was not found");
#Test1: table with missing .ibd can be dropped directly
create table t1(a int)engine=innodb;
drop table t1;
diff --git a/mysql-test/main/drop_table_force.test b/mysql-test/main/drop_table_force.test
index f3073e3b67d..04ebb997b80 100644
--- a/mysql-test/main/drop_table_force.test
+++ b/mysql-test/main/drop_table_force.test
@@ -10,9 +10,7 @@
# the new one, we have left some references to the original test case
#
-CALL mtr.add_suppression("Operating system error number");
-CALL mtr.add_suppression("The error means the system cannot");
-CALL mtr.add_suppression("returned OS error 71");
+CALL mtr.add_suppression("InnoDB: File .*test/t1\\.ibd was not found");
let $DATADIR= `select @@datadir`;
diff --git a/mysql-test/main/events_1.result b/mysql-test/main/events_1.result
index c425f88eab2..2f2a951158c 100644
--- a/mysql-test/main/events_1.result
+++ b/mysql-test/main/events_1.result
@@ -1,5 +1,6 @@
set sql_mode="";
call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted");
+call mtr.add_suppression("Incorrect definition of table mysql.event:.*");
drop database if exists events_test;
drop database if exists db_x;
drop database if exists mysqltest_db2;
diff --git a/mysql-test/main/events_1.test b/mysql-test/main/events_1.test
index 33b82730783..ba8a2059e2d 100644
--- a/mysql-test/main/events_1.test
+++ b/mysql-test/main/events_1.test
@@ -8,6 +8,7 @@ set sql_mode="";
--source include/default_charset.inc
call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted");
+call mtr.add_suppression("Incorrect definition of table mysql.event:.*");
--disable_warnings
drop database if exists events_test;
diff --git a/mysql-test/main/events_restart.result b/mysql-test/main/events_restart.result
index 47092beed0e..58401c7be80 100644
--- a/mysql-test/main/events_restart.result
+++ b/mysql-test/main/events_restart.result
@@ -21,6 +21,7 @@ insert into event_like select * from mysql.event;
alter table mysql.event
change column body body longtext character set utf8 collate utf8_bin;
"Now we restart the server"
+call mtr.add_suppression("Incorrect definition of table mysql.event:.*");
# restart
use events_test;
select @@event_scheduler;
diff --git a/mysql-test/main/events_restart.test b/mysql-test/main/events_restart.test
index 624c4188f9a..6f7c01d81c2 100644
--- a/mysql-test/main/events_restart.test
+++ b/mysql-test/main/events_restart.test
@@ -45,6 +45,7 @@ alter table mysql.event
change column body body longtext character set utf8 collate utf8_bin;
--echo "Now we restart the server"
+call mtr.add_suppression("Incorrect definition of table mysql.event:.*");
--source include/restart_mysqld.inc
use events_test;
diff --git a/mysql-test/main/except.result b/mysql-test/main/except.result
index 72d2a312bd2..3dc4e1c9470 100644
--- a/mysql-test/main/except.result
+++ b/mysql-test/main/except.result
@@ -37,24 +37,32 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "EXCEPT",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -76,17 +84,21 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
},
{
@@ -95,17 +107,21 @@ ANALYZE
"operation": "EXCEPT",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -119,66 +135,78 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 1,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 1,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
select * from ((select a,b from t1) except (select c,d from t2)) a;
@@ -247,46 +275,58 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL"
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "EXCEPT",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL"
+ }
+ }
+ ]
}
}
]
@@ -308,34 +348,40 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "r_filtered": 100
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
}
},
{
@@ -344,34 +390,40 @@ ANALYZE
"operation": "EXCEPT",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "r_filtered": 100
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -386,100 +438,116 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 3,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 3,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
"r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
},
- "block-nl-join": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
"r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "r_filtered": 100
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
select * from ((select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4)) a;
diff --git a/mysql-test/main/except_all.result b/mysql-test/main/except_all.result
index befd7e0f15a..ac032221cc5 100644
--- a/mysql-test/main/except_all.result
+++ b/mysql-test/main/except_all.result
@@ -65,24 +65,32 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "EXCEPT",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -111,66 +119,78 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 7,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 4,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 7,
- "r_rows": 7,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 7,
- "r_rows": 7,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 4,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 7,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 7,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
ANALYZE format=json select * from ((select a from t1) except all (select c from t2)) a;
@@ -180,66 +200,78 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 7,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 4,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 7,
- "r_rows": 7,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 7,
- "r_rows": 7,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 4,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 7,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 7,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
select * from ((select a from t1) except all (select c from t2)) a;
@@ -349,67 +381,83 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL"
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL"
+ }
+ }
+ ]
+ }
},
- "block-nl-join": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL"
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL"
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
ANALYZE format=json (select a,b,e,f from t1,t3) except all (select c,d,g,h from t2,t4);
@@ -427,34 +475,40 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "r_filtered": 100
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
}
},
{
@@ -463,34 +517,40 @@ ANALYZE
"operation": "EXCEPT",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "r_filtered": 100
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -504,100 +564,116 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 9,
- "r_rows": 7,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<except2,3>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 7,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 9,
+ "r_rows": 7,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<except2,3>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 7,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
"r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "EXCEPT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
},
- "block-nl-join": {
- "table": {
- "table_name": "t4",
- "access_type": "ALL",
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "EXCEPT",
"r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "r_filtered": 100
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
prepare stmt from "(select a,b,e,f from t1,t3) except all (select c,d,g,h from t2,t4)";
diff --git a/mysql-test/main/explain_json.result b/mysql-test/main/explain_json.result
index e93564132b3..cf1aa172146 100644
--- a/mysql-test/main/explain_json.result
+++ b/mysql-test/main/explain_json.result
@@ -6,12 +6,16 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
explain format=json select * from t0 where 1>2;
@@ -29,13 +33,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t0.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t0.a < 3"
+ }
+ }
+ ]
}
}
# Try a basic join
@@ -51,24 +59,30 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t0.a is not null"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t0.a"],
- "rows": 1,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t0.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t0.a"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
}
}
# Try range and index_merge
@@ -79,17 +93,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["a1"],
- "key": "a1",
- "key_length": "5",
- "used_key_parts": ["a1"],
- "rows": 5,
- "filtered": 100,
- "index_condition": "t2.a1 < 5"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["a1"],
+ "key": "a1",
+ "key_length": "5",
+ "used_key_parts": ["a1"],
+ "rows": 5,
+ "filtered": 100,
+ "index_condition": "t2.a1 < 5"
+ }
+ }
+ ]
}
}
explain format=json select * from t2 where a1=1 or b1=2;
@@ -97,27 +115,35 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "index_merge",
- "possible_keys": ["a1", "b1"],
- "key_length": "5,5",
- "index_merge": {
- "sort_union": {
- "range": {
- "key": "a1",
- "used_key_parts": ["a1"]
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "index_merge",
+ "possible_keys": ["a1", "b1"],
+ "key_length": "5,5",
+ "index_merge": {
+ "sort_union": [
+ {
+ "range": {
+ "key": "a1",
+ "used_key_parts": ["a1"]
+ }
+ },
+ {
+ "range": {
+ "key": "b1",
+ "used_key_parts": ["b1"]
+ }
+ }
+ ]
},
- "range": {
- "key": "b1",
- "used_key_parts": ["b1"]
- }
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.a1 = 1 or t2.b1 = 2"
}
- },
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.a1 = 1 or t2.b1 = 2"
- }
+ }
+ ]
}
}
explain format=json select * from t2 where a1=1 or (b1=2 and b2=3);
@@ -125,27 +151,35 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "index_merge",
- "possible_keys": ["a1", "b1"],
- "key_length": "5,10",
- "index_merge": {
- "sort_union": {
- "range": {
- "key": "a1",
- "used_key_parts": ["a1"]
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "index_merge",
+ "possible_keys": ["a1", "b1"],
+ "key_length": "5,10",
+ "index_merge": {
+ "sort_union": [
+ {
+ "range": {
+ "key": "a1",
+ "used_key_parts": ["a1"]
+ }
+ },
+ {
+ "range": {
+ "key": "b1",
+ "used_key_parts": ["b1", "b2"]
+ }
+ }
+ ]
},
- "range": {
- "key": "b1",
- "used_key_parts": ["b1", "b2"]
- }
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.a1 = 1 or t2.b1 = 2 and t2.b2 = 3"
}
- },
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.a1 = 1 or t2.b1 = 2 and t2.b2 = 3"
- }
+ }
+ ]
}
}
explain format=json select * from t2 where (a1=1 and a2=1) or
@@ -154,27 +188,35 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "index_merge",
- "possible_keys": ["a1", "b1"],
- "key_length": "10,10",
- "index_merge": {
- "union": {
- "range": {
- "key": "a1",
- "used_key_parts": ["a1", "a2"]
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "index_merge",
+ "possible_keys": ["a1", "b1"],
+ "key_length": "10,10",
+ "index_merge": {
+ "union": [
+ {
+ "range": {
+ "key": "a1",
+ "used_key_parts": ["a1", "a2"]
+ }
+ },
+ {
+ "range": {
+ "key": "b1",
+ "used_key_parts": ["b1", "b2"]
+ }
+ }
+ ]
},
- "range": {
- "key": "b1",
- "used_key_parts": ["b1", "b2"]
- }
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t2.a1 = 1 and t2.a2 = 1 or t2.b1 = 2 and t2.b2 = 1"
}
- },
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t2.a1 = 1 and t2.a2 = 1 or t2.b1 = 2 and t2.b2 = 1"
- }
+ }
+ ]
}
}
# Try ref access on two key components
@@ -183,24 +225,30 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t0.a is not null"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["b1"],
- "key": "b1",
- "key_length": "10",
- "used_key_parts": ["b1", "b2"],
- "ref": ["test.t0.a", "const"],
- "rows": 1,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t0.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["b1"],
+ "key": "b1",
+ "key_length": "10",
+ "used_key_parts": ["b1", "b2"],
+ "ref": ["test.t0.a", "const"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
}
}
drop table t1,t2;
@@ -218,24 +266,32 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "A",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "A",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "B",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "B",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -251,24 +307,32 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "A",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "A",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "B",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "B",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -285,25 +349,33 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
"state": "uninitialized",
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t1.b = t0.a"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t1.b = t0.a"
+ }
+ }
+ ]
}
}
}
@@ -317,26 +389,34 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t0.a > (subquery#2) or t0.a < 3"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t0.a > (subquery#2) or t0.a < 3"
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
"state": "uninitialized",
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t1.b = t0.a"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t1.b = t0.a"
+ }
+ }
+ ]
}
}
}
@@ -355,26 +435,32 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "tbl1",
- "access_type": "ALL",
- "rows": 100,
- "filtered": 100,
- "attached_condition": "tbl1.b < 3"
- },
- "block-nl-join": {
- "table": {
- "table_name": "tbl2",
- "access_type": "ALL",
- "rows": 100,
- "filtered": 100,
- "attached_condition": "tbl2.b < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tbl1",
+ "access_type": "ALL",
+ "rows": 100,
+ "filtered": 100,
+ "attached_condition": "tbl1.b < 3"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "1Kb",
- "join_type": "BNL",
- "attached_condition": "tbl2.a = tbl1.a"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "tbl2",
+ "access_type": "ALL",
+ "rows": 100,
+ "filtered": 100,
+ "attached_condition": "tbl2.b < 5"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "1Kb",
+ "join_type": "BNL",
+ "attached_condition": "tbl2.a = tbl1.a"
+ }
+ }
+ ]
}
}
drop table t1;
@@ -452,12 +538,16 @@ EXPLAIN
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -476,30 +566,38 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "tbl.cnt > 0",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "cnt > 0",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "tbl.cnt > 0",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "cnt > 0",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
explain format=json
@@ -509,41 +607,51 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "tbl2",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "tbl2.a is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "8",
- "used_key_parts": ["cnt"],
- "ref": ["test.tbl2.a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "tbl1.cnt = tbl2.a",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tbl2",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "tbl2.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "8",
+ "used_key_parts": ["cnt"],
+ "ref": ["test.tbl2.a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "tbl1.cnt = tbl2.a",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
#
@@ -555,38 +663,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t1.a is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "4",
- "used_key_parts": ["max(a)"],
- "ref": ["test.t1.a"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "4",
+ "used_key_parts": ["max(a)"],
+ "ref": ["test.t1.a"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
#
@@ -601,46 +719,58 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "1",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "4",
- "used_key_parts": ["a"],
- "ref": ["func"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "4",
+ "used_key_parts": ["a"],
+ "ref": ["func"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "block-nl-join": {
"table": {
- "table_name": "t0",
+ "table_name": "t2",
"access_type": "ALL",
"rows": 10,
"filtered": 100
- }
+ },
+ "buffer_type": "flat",
+ "buffer_size": "1Kb",
+ "join_type": "BNL"
}
}
- },
- "block-nl-join": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "1Kb",
- "join_type": "BNL"
- }
+ ]
}
}
#
@@ -657,25 +787,31 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "first_match": "t2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "141",
- "join_type": "BNL",
- "attached_condition": "t1.b = t2.b and t1.a = t2.a"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "first_match": "t2"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "141",
+ "join_type": "BNL",
+ "attached_condition": "t1.b = t2.b and t1.a = t2.a"
+ }
+ }
+ ]
}
}
#
@@ -694,26 +830,34 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- },
- "duplicates_removal": {
- "block-nl-join": {
+ "nested_loop": [
+ {
"table": {
- "table_name": "t1",
+ "table_name": "t2",
"access_type": "ALL",
"rows": 10,
"filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "206",
- "join_type": "BNL",
- "attached_condition": "t1.b = t2.b and t1.a = t2.a"
+ }
+ },
+ {
+ "duplicates_removal": [
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "206",
+ "join_type": "BNL",
+ "attached_condition": "t1.b = t2.b and t1.a = t2.a"
+ }
+ }
+ ]
}
- }
+ ]
}
}
set optimizer_switch=@tmp;
@@ -730,18 +874,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 2,
- "filtered": 100,
- "index_condition": "t1.a < 3",
- "mrr_type": "Rowid-ordered scan"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 2,
+ "filtered": 100,
+ "index_condition": "t1.a < 3",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ }
+ ]
}
}
# 'Range checked for each record'
@@ -752,22 +900,28 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "tbl1",
- "access_type": "ALL",
- "rows": 100,
- "filtered": 100
- },
- "range-checked-for-each-record": {
- "keys": ["a"],
- "table": {
- "table_name": "tbl2",
- "access_type": "ALL",
- "possible_keys": ["a"],
- "rows": 100,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tbl1",
+ "access_type": "ALL",
+ "rows": 100,
+ "filtered": 100
+ }
+ },
+ {
+ "range-checked-for-each-record": {
+ "keys": ["a"],
+ "table": {
+ "table_name": "tbl2",
+ "access_type": "ALL",
+ "possible_keys": ["a"],
+ "rows": 100,
+ "filtered": 100
+ }
+ }
}
- }
+ ]
}
}
drop table t1;
@@ -784,49 +938,59 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "outer_t1",
- "access_type": "index",
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "!<in_optimizer>(outer_t1.a,<exists>(subquery#2))",
- "using_index": true
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "outer_t1",
+ "access_type": "index",
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "!<in_optimizer>(outer_t1.a,<exists>(subquery#2))",
+ "using_index": true
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
"having_condition": "trigcond(t1.a is null)",
- "full-scan-on-null_key": {
- "table": {
- "table_name": "t1",
- "access_type": "ref_or_null",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["func"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "trigcond(<cache>(outer_t1.a) = t1.a or t1.a is null)",
- "using_index": true
- }
- },
- "block-nl-join": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
+ "nested_loop": [
+ {
+ "full-scan-on-null_key": {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref_or_null",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["func"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "trigcond(<cache>(outer_t1.a) = t1.a or t1.a is null)",
+ "using_index": true
+ }
+ }
},
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL",
- "attached_condition": "t2.b <> outer_t1.a"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL",
+ "attached_condition": "t2.b <> outer_t1.a"
+ }
+ }
+ ]
}
}
]
@@ -850,34 +1014,44 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "<not>(<in_optimizer>(20000,<max>(subquery#2) >= 20000))",
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "tbl1",
- "access_type": "ALL",
- "rows": 100,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "tbl2",
- "access_type": "ALL",
- "rows": 100,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tbl1",
+ "access_type": "ALL",
+ "rows": 100,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "1Kb",
- "join_type": "BNL",
- "attached_condition": "tbl2.b = tbl1.b"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "tbl2",
+ "access_type": "ALL",
+ "rows": 100,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "1Kb",
+ "join_type": "BNL",
+ "attached_condition": "tbl2.b = tbl1.b"
+ }
+ }
+ ]
}
}
]
@@ -897,23 +1071,31 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "!<in_optimizer>(t1.a,t1.a in (subquery#2))"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "!<in_optimizer>(t1.a,t1.a in (subquery#2))"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -947,16 +1129,20 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "key": "a",
- "key_length": "10",
- "used_key_parts": ["a", "b"],
- "rows": 101,
- "filtered": 100,
- "using_index_for_group_by": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "key": "a",
+ "key_length": "10",
+ "used_key_parts": ["a", "b"],
+ "rows": 101,
+ "filtered": 100,
+ "using_index_for_group_by": true
+ }
+ }
+ ]
}
}
analyze format=json select count(distinct b) from t1 group by a;
@@ -966,21 +1152,25 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "key": "a",
- "key_length": "10",
- "used_key_parts": ["a", "b"],
- "r_loops": 1,
- "rows": 101,
- "r_rows": 100,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "using_index_for_group_by": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "key": "a",
+ "key_length": "10",
+ "used_key_parts": ["a", "b"],
+ "r_loops": 1,
+ "rows": 101,
+ "r_rows": 100,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "using_index_for_group_by": true
+ }
+ }
+ ]
}
}
drop table t1,t2;
@@ -1041,17 +1231,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "key": "idx_t1_1",
- "key_length": "147",
- "used_key_parts": ["a1", "a2", "b"],
- "rows": 17,
- "filtered": 100,
- "attached_condition": "t1.b = 'a' and t1.a2 >= 'b'",
- "using_index_for_group_by": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "key": "idx_t1_1",
+ "key_length": "147",
+ "used_key_parts": ["a1", "a2", "b"],
+ "rows": 17,
+ "filtered": 100,
+ "attached_condition": "t1.b = 'a' and t1.a2 >= 'b'",
+ "using_index_for_group_by": true
+ }
+ }
+ ]
}
}
explain format=json select count(distinct a1,a2,b,c) from t1 where (a2 >= 'b') and (b = 'a') and (c = 'i121');
@@ -1059,17 +1253,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "key": "idx_t1_1",
- "key_length": "163",
- "used_key_parts": ["a1", "a2", "b", "c"],
- "rows": 65,
- "filtered": 100,
- "attached_condition": "t1.b = 'a' and t1.c = 'i121' and t1.a2 >= 'b'",
- "using_index_for_group_by": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "key": "idx_t1_1",
+ "key_length": "163",
+ "used_key_parts": ["a1", "a2", "b", "c"],
+ "rows": 65,
+ "filtered": 100,
+ "attached_condition": "t1.b = 'a' and t1.c = 'i121' and t1.a2 >= 'b'",
+ "using_index_for_group_by": true
+ }
+ }
+ ]
}
}
drop table t1;
@@ -1083,13 +1281,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.a = _latin1'\xDF'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.a = _latin1'\xDF'"
+ }
+ }
+ ]
}
}
DROP TABLE t1;
@@ -1103,13 +1305,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "(case when convert(t1.a using utf8mb3) = <cache>(_utf8mb3'a' collate utf8mb3_bin) then NULL else t1.a end)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "(case when convert(t1.a using utf8mb3) = <cache>(_utf8mb3'a' collate utf8mb3_bin) then NULL else t1.a end)"
+ }
+ }
+ ]
}
}
DROP TABLE t1;
@@ -1136,12 +1342,16 @@ EXPLAIN
"filesort": {
"sort_key": "t2.a",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 256,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 256,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1155,12 +1365,16 @@ EXPLAIN
"filesort": {
"sort_key": "t2.a",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 256,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 256,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1185,12 +1399,16 @@ EXPLAIN
"filesort": {
"sort_key": "t2.a",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 256,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 256,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1211,13 +1429,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "system",
- "rows": 0,
- "filtered": 0,
- "const_row_not_found": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "system",
+ "rows": 0,
+ "filtered": 0,
+ "const_row_not_found": true
+ }
+ }
+ ]
}
}
analyze format=json
@@ -1249,20 +1471,26 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "1",
- "table": {
- "table_name": "t2",
- "access_type": "const",
- "possible_keys": ["PRIMARY"],
- "rows": 1,
- "filtered": 100,
- "impossible_on_condition": true
- },
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "const",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100,
+ "impossible_on_condition": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
}
}
analyze format=json
@@ -1274,28 +1502,34 @@ ANALYZE
"r_loops": 1,
"r_total_time_ms": "REPLACED",
"const_condition": "1",
- "table": {
- "table_name": "t2",
- "access_type": "const",
- "possible_keys": ["PRIMARY"],
- "r_loops": 0,
- "rows": 1,
- "r_rows": null,
- "filtered": 100,
- "r_filtered": null,
- "impossible_on_condition": true
- },
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "const",
+ "possible_keys": ["PRIMARY"],
+ "r_loops": 0,
+ "rows": 1,
+ "r_rows": null,
+ "filtered": 100,
+ "r_filtered": null,
+ "impossible_on_condition": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
# Check ET_NOT_EXISTS:
@@ -1310,26 +1544,32 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- },
- "table": {
- "table_name": "t2",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk"],
- "ref": ["test.t1.a"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "trigcond(t2.pk is null) and trigcond(trigcond(t1.a is not null))",
- "using_index": true,
- "not_exists": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk"],
+ "ref": ["test.t1.a"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "trigcond(t2.pk is null) and trigcond(trigcond(t1.a is not null))",
+ "using_index": true,
+ "not_exists": true
+ }
+ }
+ ]
}
}
analyze format=json
@@ -1340,36 +1580,42 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "table": {
- "table_name": "t2",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk"],
- "ref": ["test.t1.a"],
- "r_loops": 2,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "trigcond(t2.pk is null) and trigcond(trigcond(t1.a is not null))",
- "using_index": true,
- "not_exists": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk"],
+ "ref": ["test.t1.a"],
+ "r_loops": 2,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "trigcond(t2.pk is null) and trigcond(trigcond(t1.a is not null))",
+ "using_index": true,
+ "not_exists": true
+ }
+ }
+ ]
}
}
# Check ET_DISTINCT
@@ -1385,26 +1631,32 @@ EXPLAIN
"query_block": {
"select_id": 1,
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.a is not null"
- },
- "table": {
- "table_name": "t2",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk"],
- "ref": ["test.t1.a"],
- "rows": 1,
- "filtered": 100,
- "using_index": true,
- "distinct": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk"],
+ "ref": ["test.t1.a"],
+ "rows": 1,
+ "filtered": 100,
+ "using_index": true,
+ "distinct": true
+ }
+ }
+ ]
}
}
}
@@ -1417,36 +1669,42 @@ ANALYZE
"r_loops": 1,
"r_total_time_ms": "REPLACED",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "t1.a is not null"
- },
- "table": {
- "table_name": "t2",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk"],
- "ref": ["test.t1.a"],
- "r_loops": 2,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "using_index": true,
- "distinct": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk"],
+ "ref": ["test.t1.a"],
+ "r_loops": 2,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "using_index": true,
+ "distinct": true
+ }
+ }
+ ]
}
}
}
@@ -1475,31 +1733,37 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t3.a is not null"
- },
- "block-nl-join": {
- "table": {
- "table_name": "t4",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t3.a"],
- "rows": 1,
- "filtered": 100,
- "index_condition_bka": "t4.b + 1 <= t3.b + 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t3.a is not null"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "400",
- "join_type": "BKA",
- "mrr_type": "Rowid-ordered scan"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t3.a"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition_bka": "t4.b + 1 <= t3.b + 1"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "400",
+ "join_type": "BKA",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ }
+ ]
}
}
analyze format=json
@@ -1510,42 +1774,48 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "t3.a is not null"
- },
- "block-nl-join": {
- "table": {
- "table_name": "t4",
- "access_type": "ref",
- "possible_keys": ["a"],
- "key": "a",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t3.a"],
- "r_loops": 1,
- "rows": 1,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "index_condition_bka": "t4.b + 1 <= t3.b + 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "t3.a is not null"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "400",
- "join_type": "BKA",
- "mrr_type": "Rowid-ordered scan",
- "r_filtered": 100
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t4",
+ "access_type": "ref",
+ "possible_keys": ["a"],
+ "key": "a",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t3.a"],
+ "r_loops": 1,
+ "rows": 1,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "index_condition_bka": "t4.b + 1 <= t3.b + 1"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "400",
+ "join_type": "BKA",
+ "mrr_type": "Rowid-ordered scan",
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
set optimizer_switch=@tmp_optimizer_switch;
@@ -1564,12 +1834,16 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
@@ -1577,13 +1851,17 @@ EXPLAIN
"query_block": {
"select_id": 2,
"outer_ref_condition": "t0.a < 5",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t1.b < t0.a"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t1.b < t0.a"
+ }
+ }
+ ]
}
}
}
@@ -1601,17 +1879,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "read_sorted_file": {
- "filesort": {
- "sort_key": "t1.a, t1.b desc",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "t1.a, t1.b desc",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
explain format=json select * from t1 order by a desc, b desc;
@@ -1619,17 +1901,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "read_sorted_file": {
- "filesort": {
- "sort_key": "t1.a desc, t1.b desc",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "t1.a desc, t1.b desc",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
explain format=json select * from t1 order by a desc, b ;
@@ -1637,17 +1923,91 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "read_sorted_file": {
- "filesort": {
- "sort_key": "t1.a desc, t1.b",
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "t1.a desc, t1.b",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ }
+ }
+ ]
+ }
+}
+drop table t1;
+#
+# MDEV-27204: [ERROR] Json_writer: a member name was expected, Assertion `got_name == named_item_expected()' failed
+#
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (1),(2);
+explain FORMAT=JSON
+SELECT * FROM t1 t0
+WHERE t0.a IN (SELECT t2.a FROM t1 t2 WHERE t0.a IN (SELECT t3.a FROM t1 t3));
+EXPLAIN
+{
+ "query_block": {
+ "select_id": 1,
+ "nested_loop": [
+ {
"table": {
- "table_name": "t1",
+ "table_name": "t0",
"access_type": "ALL",
- "rows": 3,
+ "rows": 2,
"filtered": 100
}
+ },
+ {
+ "duplicates_removal": [
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "152",
+ "join_type": "BNL",
+ "attached_condition": "t2.a = t0.a"
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ },
+ "buffer_type": "incremental",
+ "buffer_size": "109",
+ "join_type": "BNL",
+ "attached_condition": "t3.a = t0.a"
+ }
+ }
+ ]
}
- }
+ ]
}
}
-drop table t1;
+DROP TABLE t1;
+#
+# MDEV-27206: [ERROR] Duplicated key: cause, Assertion `is_uniq_key' failed with optimizer trace
+#
+CREATE TABLE t1 (a INT) ENGINE=MyISAM;
+CREATE TABLE t2 (pk TIME, b INT, primary key (pk), key (b)) ENGINE=MyISAM;
+INSERT INTO t2 VALUES
+('00:13:33',0),('00:13:34',1),('00:13:35',2),('00:13:36',3),
+('00:13:37',4),('00:13:38',5),('00:13:39',6),('00:13:40',7),
+('00:13:41',8),('00:13:42',9);
+SET optimizer_trace = 'enabled=on';
+SELECT * FROM t1 WHERE a IN ( SELECT b FROM t2 INNER JOIN t1 ON (a = pk) );
+a
+DROP TABLE t1, t2;
diff --git a/mysql-test/main/explain_json.test b/mysql-test/main/explain_json.test
index cfbc0cfa10c..07e4ec09ad4 100644
--- a/mysql-test/main/explain_json.test
+++ b/mysql-test/main/explain_json.test
@@ -419,3 +419,27 @@ explain format=json select * from t1 order by a desc, b desc;
explain format=json select * from t1 order by a desc, b ;
drop table t1;
+--echo #
+--echo # MDEV-27204: [ERROR] Json_writer: a member name was expected, Assertion `got_name == named_item_expected()' failed
+--echo #
+
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (1),(2);
+explain FORMAT=JSON
+SELECT * FROM t1 t0
+WHERE t0.a IN (SELECT t2.a FROM t1 t2 WHERE t0.a IN (SELECT t3.a FROM t1 t3));
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-27206: [ERROR] Duplicated key: cause, Assertion `is_uniq_key' failed with optimizer trace
+--echo #
+
+CREATE TABLE t1 (a INT) ENGINE=MyISAM;
+CREATE TABLE t2 (pk TIME, b INT, primary key (pk), key (b)) ENGINE=MyISAM;
+INSERT INTO t2 VALUES
+ ('00:13:33',0),('00:13:34',1),('00:13:35',2),('00:13:36',3),
+ ('00:13:37',4),('00:13:38',5),('00:13:39',6),('00:13:40',7),
+ ('00:13:41',8),('00:13:42',9);
+SET optimizer_trace = 'enabled=on';
+SELECT * FROM t1 WHERE a IN ( SELECT b FROM t2 INNER JOIN t1 ON (a = pk) );
+DROP TABLE t1, t2; \ No newline at end of file
diff --git a/mysql-test/main/explain_json_format_partitions.result b/mysql-test/main/explain_json_format_partitions.result
index 0c7d9e93105..f164006d756 100644
--- a/mysql-test/main/explain_json_format_partitions.result
+++ b/mysql-test/main/explain_json_format_partitions.result
@@ -12,14 +12,18 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "partitions": ["p0"],
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "attached_condition": "t1.a in (2,3,4)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "partitions": ["p0"],
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "t1.a in (2,3,4)"
+ }
+ }
+ ]
}
}
analyze format=json select * from t1 where a in (2,3,4);
@@ -29,19 +33,23 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "partitions": ["p0"],
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 30,
- "attached_condition": "t1.a in (2,3,4)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "partitions": ["p0"],
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 30,
+ "attached_condition": "t1.a in (2,3,4)"
+ }
+ }
+ ]
}
}
analyze format=json update t1 set a=a+10 where a in (2,3,4);
diff --git a/mysql-test/main/explain_json_innodb.result b/mysql-test/main/explain_json_innodb.result
index 8cec65642b4..871c0d6a258 100644
--- a/mysql-test/main/explain_json_innodb.result
+++ b/mysql-test/main/explain_json_innodb.result
@@ -16,39 +16,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "tbl_alias1",
- "access_type": "ALL",
- "rows": 1,
- "filtered": 100,
- "attached_condition": "tbl_alias1.column_name_2 is not null and tbl_alias1.column_name_1 is not null"
- },
- "table": {
- "table_name": "tbl_alias2",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "9",
- "used_key_parts": ["c", "b"],
- "ref": [
- "test.tbl_alias1.column_name_2",
- "test.tbl_alias1.column_name_1"
- ],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "tbl_alias2.c = tbl_alias1.column_name_2",
- "using_index": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tbl_alias1",
+ "access_type": "ALL",
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "tbl_alias1.column_name_2 is not null and tbl_alias1.column_name_1 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "tbl_alias2",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "9",
+ "used_key_parts": ["c", "b"],
+ "ref": [
+ "test.tbl_alias1.column_name_2",
+ "test.tbl_alias1.column_name_1"
+ ],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "tbl_alias2.c = tbl_alias1.column_name_2",
+ "using_index": true
+ }
+ }
+ ]
}
}
]
diff --git a/mysql-test/main/func_group.result b/mysql-test/main/func_group.result
index 244fdb2856f..8f9c27eeb86 100644
--- a/mysql-test/main/func_group.result
+++ b/mysql-test/main/func_group.result
@@ -317,7 +317,7 @@ a3 char(3),
a4 real,
a5 date,
key k1(a2,a3),
-key k2(a4 desc,a1),
+key k2(a4 /*desc*/,a1),
key k3(a5,a1)
);
create table t2(
diff --git a/mysql-test/main/func_group.test b/mysql-test/main/func_group.test
index e17ed45180b..842ca4388ef 100644
--- a/mysql-test/main/func_group.test
+++ b/mysql-test/main/func_group.test
@@ -202,7 +202,7 @@ create table t1(
a4 real,
a5 date,
key k1(a2,a3),
- key k2(a4 desc,a1),
+ key k2(a4 /*desc*/,a1),
key k3(a5,a1)
);
create table t2(
diff --git a/mysql-test/main/func_hybrid_type.result b/mysql-test/main/func_hybrid_type.result
index 54273452965..dde6cfa4ed8 100644
--- a/mysql-test/main/func_hybrid_type.result
+++ b/mysql-test/main/func_hybrid_type.result
@@ -1609,14 +1609,14 @@ def ifnull___a_a 253 10 1 Y 0 39 8
def least____a_a 253 10 1 Y 0 39 8
def greatest_a_a 253 10 1 Y 0 39 8
def test t1 t1 b ___________b 254 1 1 Y 256 0 8
-def case_______b 254 1 1 Y 0 39 8
-def case_____b_b 254 1 1 Y 0 39 8
-def coalesce___b 254 1 1 Y 0 39 8
-def coalesce_b_b 254 1 1 Y 0 39 8
-def if_______b_b 254 1 1 Y 0 39 8
-def ifnull___b_b 254 1 1 Y 0 39 8
-def least____b_b 254 1 1 Y 0 39 8
-def greatest_b_b 254 1 1 Y 0 39 8
+def case_______b 253 1 1 Y 0 39 8
+def case_____b_b 253 1 1 Y 0 39 8
+def coalesce___b 253 1 1 Y 0 39 8
+def coalesce_b_b 253 1 1 Y 0 39 8
+def if_______b_b 253 1 1 Y 0 39 8
+def ifnull___b_b 253 1 1 Y 0 39 8
+def least____b_b 253 1 1 Y 0 39 8
+def greatest_b_b 253 1 1 Y 0 39 8
___________a a
case_______a a
case_____a_a a
diff --git a/mysql-test/main/func_in.result b/mysql-test/main/func_in.result
index b18aa26777e..175e23ec65f 100644
--- a/mysql-test/main/func_in.result
+++ b/mysql-test/main/func_in.result
@@ -783,7 +783,7 @@ SELECT 1 IN (YEAR(FROM_UNIXTIME(NULL)) ,1);
# Bug#13012483: EXPLAIN EXTENDED, PREPARED STATEMENT, CRASH IN CHECK_SIMPLE_EQUALITY
#
CREATE TABLE t1 (a INT);
-PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
+PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @a:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
EXECUTE s;
1
DROP TABLE t1;
@@ -804,15 +804,6 @@ select * from t1 where IF(1,a,a)='2.1';
a b
drop table t1;
#
-# LP bug#992380 Crash when creating PS for a query with
-# subquery in WHERE (see also mysql bug#13012483)
-#
-CREATE TABLE t1 (a INT);
-PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
-EXECUTE s;
-1
-DROP TABLE t1;
-#
# End of 5.3 tests
#
create table t1 (a int);
diff --git a/mysql-test/main/func_in.test b/mysql-test/main/func_in.test
index 02483c482ac..847c48d31a9 100644
--- a/mysql-test/main/func_in.test
+++ b/mysql-test/main/func_in.test
@@ -570,7 +570,7 @@ SELECT 1 IN (YEAR(FROM_UNIXTIME(NULL)) ,1);
--echo #
CREATE TABLE t1 (a INT);
-PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
+PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @a:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
EXECUTE s;
DROP TABLE t1;
@@ -598,15 +598,6 @@ select * from t1 where a='2.1';
select * from t1 where b='2.1';
select * from t1 where IF(1,a,a)='2.1';
drop table t1;
---echo #
---echo # LP bug#992380 Crash when creating PS for a query with
---echo # subquery in WHERE (see also mysql bug#13012483)
---echo #
-CREATE TABLE t1 (a INT);
-PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
-EXECUTE s;
-
-DROP TABLE t1;
--echo #
--echo # End of 5.3 tests
diff --git a/mysql-test/main/func_math.result b/mysql-test/main/func_math.result
index f618ffd89a3..746dd9169ca 100644
--- a/mysql-test/main/func_math.result
+++ b/mysql-test/main/func_math.result
@@ -1838,24 +1838,118 @@ CRC32(99999999999999999999999999999999)
SELECT CRC32(-99999999999999999999999999999999);
CRC32(-99999999999999999999999999999999)
1052326872
+SELECT CRC32C(NULL), CRC32C(''), CRC32C('MariaDB'), CRC32C('mariadb');
+CRC32C(NULL) CRC32C('') CRC32C('MariaDB') CRC32C('mariadb')
+NULL 0 809606978 1378644259
+SELECT CRC32(NULL,1),CRC32C(NULL,1), CRC32(1,''), CRC32C(1,'');
+CRC32(NULL,1) CRC32C(NULL,1) CRC32(1,'') CRC32C(1,'')
+NULL NULL 1 1
+SELECT CRC32(42,''),CRC32C(42,''),CRC32('42',''),CRC32C('42','');
+CRC32(42,'') CRC32C(42,'') CRC32('42','') CRC32C('42','')
+42 42 42 42
+SELECT CRC32(42,NULL),CRC32C(42,NULL);
+CRC32(42,NULL) CRC32C(42,NULL)
+NULL NULL
+SELECT CRC32 ('5c',''),CRC32 ('5c',0),CRC32 ('5c', '0'),CRC32 ('5c',NULL);
+CRC32 ('5c','') CRC32 ('5c',0) CRC32 ('5c', '0') CRC32 ('5c',NULL)
+5 2226203566 2226203566 NULL
+Warnings:
+Warning 1292 Truncated incorrect INTEGER value: '5c'
+Warning 1292 Truncated incorrect INTEGER value: '5c'
+Warning 1292 Truncated incorrect INTEGER value: '5c'
+Warning 1292 Truncated incorrect INTEGER value: '5c'
+SELECT CRC32C('5c',''),CRC32C('5c',0),CRC32C('5c', '0'),CRC32C('5c',NULL);
+CRC32C('5c','') CRC32C('5c',0) CRC32C('5c', '0') CRC32C('5c',NULL)
+5 1466896124 1466896124 NULL
+Warnings:
+Warning 1292 Truncated incorrect INTEGER value: '5c'
+Warning 1292 Truncated incorrect INTEGER value: '5c'
+Warning 1292 Truncated incorrect INTEGER value: '5c'
+Warning 1292 Truncated incorrect INTEGER value: '5c'
+SELECT CRC32('MariaDB',NULL),CRC32C('MariaDB',NULL);
+CRC32('MariaDB',NULL) CRC32C('MariaDB',NULL)
+NULL NULL
+Warnings:
+Warning 1292 Truncated incorrect INTEGER value: 'MariaDB'
+Warning 1292 Truncated incorrect INTEGER value: 'MariaDB'
+SELECT CRC32(CRC32('MySQL'),''),CRC32(CRC32('My'),'SQL'),CRC32(0,'MySQL');
+CRC32(CRC32('MySQL'),'') CRC32(CRC32('My'),'SQL') CRC32(0,'MySQL')
+3259397556 3259397556 3259397556
+SELECT CRC32C(CRC32C('MariaDB'),''),CRC32C(CRC32C('Maria'),'DB'),CRC32C(0,'MariaDB');
+CRC32C(CRC32C('MariaDB'),'') CRC32C(CRC32C('Maria'),'DB') CRC32C(0,'MariaDB')
+809606978 809606978 809606978
+select crc32(0,'My','SQL');
+ERROR 42000: Incorrect parameter count in the call to native function 'crc32'
+select crc32c(0,'Maria','DB');
+ERROR 42000: Incorrect parameter count in the call to native function 'crc32c'
+select crc32();
+ERROR 42000: Incorrect parameter count in the call to native function 'crc32'
+select crc32c();
+ERROR 42000: Incorrect parameter count in the call to native function 'crc32c'
+select crc32('' as empty);
+ERROR 42000: Incorrect parameters in the call to native function 'crc32'
+select crc32c('' as empty);
+ERROR 42000: Incorrect parameters in the call to native function 'crc32c'
+select crc32(0, '' as empty);
+ERROR 42000: Incorrect parameters in the call to native function 'crc32'
+select crc32c(0, '' as empty);
+ERROR 42000: Incorrect parameters in the call to native function 'crc32c'
+select crc32(0 as zero, '');
+ERROR 42000: Incorrect parameters in the call to native function 'crc32'
+select crc32c(0 as zero, '');
+ERROR 42000: Incorrect parameters in the call to native function 'crc32c'
+CREATE TEMPORARY TABLE t
+(a CHAR(2), i INT UNSIGNED, c INT UNSIGNED AS (CRC32C(i,a)));
+INSERT INTO t (a,i) VALUES ('DB',CRC32C('Maria'));
+SELECT * FROM t;
+a i c
+DB 1253907744 809606978
+DROP TEMPORARY TABLE t;
+select crc32(4294967296,''), hex(char(4294967296));
+crc32(4294967296,'') hex(char(4294967296))
+0 00
+select crc32(1e100,''), hex(char(1e100));
+crc32(1e100,'') hex(char(1e100))
+4294967295 FFFFFFFF
+select crc32(10.11,''), hex(char(10.11));
+crc32(10.11,'') hex(char(10.11))
+10 0A
+select crc32(-1,''), hex(char(-1));
+crc32(-1,'') hex(char(-1))
+4294967295 FFFFFFFF
+select crc32('',''), hex(char(''));
+crc32('','') hex(char(''))
+0 00
+Warnings:
+Warning 1292 Truncated incorrect INTEGER value: ''
+Warning 1292 Truncated incorrect INTEGER value: ''
+select crc32(429496729656755555555555555555555555555555555555555555555555555555555555555555555555555,'a') as x;
+x
+3310005809
+Warnings:
+Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
+Warning 1916 Got overflow when converting '99999999999999999999999999999999999999999999999999999999999999999' to INT. Value truncated
+select crc32(429496729656755555555555555555555555555555555555555555555555555555555555555555555555555,'a') as x;
+x
+3310005809
DROP TABLE IF EXISTS t;
Warnings:
Note 1051 Unknown table 'test.t'
CREATE TABLE t(a INT, b VARCHAR(2));
INSERT INTO t VALUES (1,'a'), (2,'qw'), (1,'t'), (3,'t');
-SELECT crc32(SUM(a)) FROM t;
-crc32(SUM(a))
-1790921346
-SELECT crc32(AVG(a)) FROM t GROUP BY b;
-crc32(AVG(a))
-768278432
-2875100430
-2875100430
-SELECT crc32(MAX(b)) FROM t GROUP BY a;
-crc32(MAX(b))
-2238339752
-3114057431
-2238339752
+SELECT crc32(SUM(a)),crc32c(SUM(a)) FROM t;
+crc32(SUM(a)) crc32c(SUM(a))
+1790921346 3058990603
+SELECT crc32(AVG(a)),crc32c(AVG(a)) FROM t GROUP BY b;
+crc32(AVG(a)) crc32c(AVG(a))
+768278432 1816172052
+2875100430 1492934094
+2875100430 1492934094
+SELECT crc32(MAX(b)),crc32c(MAX(b)) FROM t GROUP BY a;
+crc32(MAX(b)) crc32c(MAX(b))
+2238339752 3833565251
+3114057431 4173859780
+2238339752 3833565251
SELECT a, b, crc32(a) FROM t GROUP BY a,b HAVING crc32(MAX(a))=450215437;
a b crc32(a)
2 qw 450215437
diff --git a/mysql-test/main/func_math.test b/mysql-test/main/func_math.test
index c865aa88660..02c5b872ea5 100644
--- a/mysql-test/main/func_math.test
+++ b/mysql-test/main/func_math.test
@@ -870,15 +870,66 @@ SELECT CRC32('01234567'), CRC32('012345678');
SELECT CRC32('~!@$%^*'), CRC32('-0.0001');
SELECT CRC32(99999999999999999999999999999999);
SELECT CRC32(-99999999999999999999999999999999);
+#enable_after fix MDEV-28535
+--disable_view_protocol
+SELECT CRC32C(NULL), CRC32C(''), CRC32C('MariaDB'), CRC32C('mariadb');
+--enable_view_protocol
+SELECT CRC32(NULL,1),CRC32C(NULL,1), CRC32(1,''), CRC32C(1,'');
+SELECT CRC32(42,''),CRC32C(42,''),CRC32('42',''),CRC32C('42','');
+SELECT CRC32(42,NULL),CRC32C(42,NULL);
+SELECT CRC32 ('5c',''),CRC32 ('5c',0),CRC32 ('5c', '0'),CRC32 ('5c',NULL);
+SELECT CRC32C('5c',''),CRC32C('5c',0),CRC32C('5c', '0'),CRC32C('5c',NULL);
+SELECT CRC32('MariaDB',NULL),CRC32C('MariaDB',NULL);
+SELECT CRC32(CRC32('MySQL'),''),CRC32(CRC32('My'),'SQL'),CRC32(0,'MySQL');
+SELECT CRC32C(CRC32C('MariaDB'),''),CRC32C(CRC32C('Maria'),'DB'),CRC32C(0,'MariaDB');
+
+--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
+select crc32(0,'My','SQL');
+--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
+select crc32c(0,'Maria','DB');
+--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
+select crc32();
+--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
+select crc32c();
+--error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
+select crc32('' as empty);
+--error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
+select crc32c('' as empty);
+--error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
+select crc32(0, '' as empty);
+--error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
+select crc32c(0, '' as empty);
+--error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
+select crc32(0 as zero, '');
+--error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
+select crc32c(0 as zero, '');
+
+CREATE TEMPORARY TABLE t
+(a CHAR(2), i INT UNSIGNED, c INT UNSIGNED AS (CRC32C(i,a)));
+INSERT INTO t (a,i) VALUES ('DB',CRC32C('Maria'));
+SELECT * FROM t;
+DROP TEMPORARY TABLE t;
+
+select crc32(4294967296,''), hex(char(4294967296));
+select crc32(1e100,''), hex(char(1e100));
+select crc32(10.11,''), hex(char(10.11));
+select crc32(-1,''), hex(char(-1));
+select crc32('',''), hex(char(''));
+--disable_ps_protocol
+select crc32(429496729656755555555555555555555555555555555555555555555555555555555555555555555555555,'a') as x;
+--enable_ps_protocol
+--disable_warnings
+select crc32(429496729656755555555555555555555555555555555555555555555555555555555555555555555555555,'a') as x;
+--enable_warnings
# Test cases for using the function in aggregate functions, group-by, having
# and order-by clauses
DROP TABLE IF EXISTS t;
CREATE TABLE t(a INT, b VARCHAR(2));
INSERT INTO t VALUES (1,'a'), (2,'qw'), (1,'t'), (3,'t');
-SELECT crc32(SUM(a)) FROM t;
-SELECT crc32(AVG(a)) FROM t GROUP BY b;
-SELECT crc32(MAX(b)) FROM t GROUP BY a;
+SELECT crc32(SUM(a)),crc32c(SUM(a)) FROM t;
+SELECT crc32(AVG(a)),crc32c(AVG(a)) FROM t GROUP BY b;
+SELECT crc32(MAX(b)),crc32c(MAX(b)) FROM t GROUP BY a;
SELECT a, b, crc32(a) FROM t GROUP BY a,b HAVING crc32(MAX(a))=450215437;
SELECT a,b,concat(a,b),crc32(concat(a,b)) FROM t ORDER BY crc32(concat(a,b));
DROP TABLE t;
diff --git a/mysql-test/main/func_misc.result b/mysql-test/main/func_misc.result
index 7d91f4b0777..8ae2cf4ad6b 100644
--- a/mysql-test/main/func_misc.result
+++ b/mysql-test/main/func_misc.result
@@ -118,9 +118,12 @@ create table t1 as select uuid(), length(uuid());
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
- `uuid()` varchar(36) DEFAULT NULL,
+ `uuid()` uuid DEFAULT NULL,
`length(uuid())` int(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+select length(`uuid()`) from t1;
+length(`uuid()`)
+36
drop table t1;
create table t1 select INET_ATON('255.255.0.1') as `a`;
show create table t1;
diff --git a/mysql-test/main/func_misc.test b/mysql-test/main/func_misc.test
index c69832375e7..6a199a45b27 100644
--- a/mysql-test/main/func_misc.test
+++ b/mysql-test/main/func_misc.test
@@ -106,6 +106,7 @@ select export_set(3, _latin1'foo', _utf8'bar', ',', 4);
create table t1 as select uuid(), length(uuid());
--enable_warnings
show create table t1;
+select length(`uuid()`) from t1;
drop table t1;
#
diff --git a/mysql-test/main/func_sformat.result b/mysql-test/main/func_sformat.result
new file mode 100644
index 00000000000..1809cbad23b
--- /dev/null
+++ b/mysql-test/main/func_sformat.result
@@ -0,0 +1,470 @@
+#
+# MDEV-25015 Custom formatting of strings in MariaDB queries
+#
+#
+# Normal Test Cases
+#
+select sformat('string test');
+sformat('string test')
+string test
+select sformat(0);
+sformat(0)
+0
+select sformat('C');
+sformat('C')
+C
+select sformat(-4.2);
+sformat(-4.2)
+-4.2
+select sformat(5, 5, 5);
+sformat(5, 5, 5)
+5
+select sformat('{} {}', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+sformat('{} {}', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+0 0
+select sformat('{{{}}}', 0);
+sformat('{{{}}}', 0)
+{0}
+select sformat('{{{}{{', 0);
+sformat('{{{}{{', 0)
+{0{
+select sformat('{{{{{}{{', 'param1');
+sformat('{{{{{}{{', 'param1')
+{{param1{
+select sformat(' {{ {{ {} {{ ', 'param1');
+sformat(' {{ {{ {} {{ ', 'param1')
+ { { param1 {
+select sformat(' {{ {} {}', 'param1', 'param2');
+sformat(' {{ {} {}', 'param1', 'param2')
+ { param1 param2
+select sformat('A{}C{}E{}', 'B', 'D', 'F');
+sformat('A{}C{}E{}', 'B', 'D', 'F')
+ABCDEF
+select sformat('{} {}', FALSE, TRUE);
+sformat('{} {}', FALSE, TRUE)
+0 1
+select sformat('Add € != {} != {}?', '$', '£');
+sformat('Add € != {} != {}?', '$', '£')
+Add € != $ != £?
+select sformat('Check {} != {} != {}?', '€', '$', '£');
+sformat('Check {} != {} != {}?', '€', '$', '£')
+Check € != $ != £?
+select sformat('{}{}{}', 1, 2, 3);
+sformat('{}{}{}', 1, 2, 3)
+123
+select sformat('Float {} Boolean {} Number {}', 3.14159, True, -50);
+sformat('Float {} Boolean {} Number {}', 3.14159, True, -50)
+Float 3.14159 Boolean 1 Number -50
+select sformat('SUM {} + {} = {}', 2, 3, 2+3);
+sformat('SUM {} + {} = {}', 2, 3, 2+3)
+SUM 2 + 3 = 5
+select sformat('Numbers {} {} {}', 1, 1.11, 1.111);
+sformat('Numbers {} {} {}', 1, 1.11, 1.111)
+Numbers 1 1.11 1.111
+select sformat('what {} is {}?', 'time', 'it');
+sformat('what {} is {}?', 'time', 'it')
+what time is it?
+select sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}', 1, 2, 3, 4, 5, 6,
+7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
+106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120);
+sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
+ 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
+ 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
+ 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
+select sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}', '1', '2', '3 ',
+'4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20',
+'21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36',
+'37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52',
+'53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68',
+'69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84',
+'85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100',
+'101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114',
+'115', '116', '117', '118', '119', '120');
+sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
+ 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
+ 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
+ 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
+#
+# Error Test Cases
+#
+select sformat('R={ }', 42);
+sformat('R={ }', 42)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid format string
+select sformat(NULL, 'Null', 'Test');
+sformat(NULL, 'Null', 'Test')
+NULL
+select sformat('Null Test {} {} ', 0, NULL);
+sformat('Null Test {} {} ', 0, NULL)
+NULL
+select sformat(NULL);
+sformat(NULL)
+NULL
+select sformat('My { Test');
+sformat('My { Test')
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid format string
+select sformat('Test { {');
+sformat('Test { {')
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid format string
+select sformat('A{}C{}E{}', 'B', 'D');
+sformat('A{}C{}E{}', 'B', 'D')
+NULL
+Warnings:
+Warning 4183 SFORMAT error: argument not found
+select sformat();
+ERROR 42000: Incorrect parameter count in the call to native function 'sformat'
+#
+# Table Test Cases
+#
+create table t1 (param1 text, param2 text, param3 int);
+insert into t1 values ('string: {}, number: {}', 'xyz', 123),
+('something {} went {} wrong {}', 'foo', 0),
+('Test case {} -> {}', 'Print', -32);
+select sformat(param1, param2, param3) from t1;
+sformat(param1, param2, param3)
+string: xyz, number: 123
+NULL
+Test case Print -> -32
+Warnings:
+Warning 4183 SFORMAT error: argument not found
+drop table t1;
+create table t2 (param1 FLOAT, param2 SMALLINT, param3 CHAR, param4 DATE);
+insert into t2 values (0.0025, 25, 'A', DATE('2020-06-29')),
+(0.0005, 5, 'B', DATE('2020-6-29')),
+(5.5555, -5, 'C', DATE('200629')),
+(-9, -9, 'D', DATE('20*06*29'));
+select sformat('p1 {:.4f} p2 {} p3 {} p4 {}', param1, param2, param3, param4) from t2;
+sformat('p1 {:.4f} p2 {} p3 {} p4 {}', param1, param2, param3, param4)
+p1 0.0025 p2 25 p3 A p4 2020-06-29
+p1 0.0005 p2 5 p3 B p4 2020-06-29
+p1 5.5555 p2 -5 p3 C p4 2020-06-29
+p1 -9.0000 p2 -9 p3 D p4 2020-06-29
+drop table t2;
+set names utf8;
+create table t3 (format_str text character set 'latin1',
+first_param text character set 'utf8',
+second_param text character set 'latin1');
+insert into t3 values ('test 1 {} {}', UNHEX('C3A5'), UNHEX('E5'));
+select sformat(format_str, first_param, second_param) from t3;
+sformat(format_str, first_param, second_param)
+test 1 å å
+select HEX(sformat(format_str, first_param, second_param)) from t3;
+HEX(sformat(format_str, first_param, second_param))
+74657374203120C3A520C3A5
+drop table t3;
+set names latin1;
+create table t4 (p1 bit(8), p2 boolean, p3 DECIMAL, p4 TIMESTAMP);
+insert into t4 values (42, TRUE, 42, '2021-08-18 16:50:07'),
+(24, FALSE, 24, '0000-00-00 00:00:00');
+select sformat('{}: {} {} {} {}', 'Data', p1, p2, p3, p4) from t4;
+sformat('{}: {} {} {} {}', 'Data', p1, p2, p3, p4)
+Data: 42 1 42 2021-08-18 16:50:07
+Data: 24 0 24 0000-00-00 00:00:00
+drop table t4;
+set names utf8;
+create table t5 (param text character SET utf8 COLLATE utf8_general_ci);
+insert into t5 values (UNHEX('C3A5')),(UNHEX('C5BB')),(UNHEX('e0b1bb')),
+(UNHEX('C38A')), (NULL);
+select sformat('{}', param) from t5;
+sformat('{}', param)
+Ã¥
+Å»
+à±»
+Ê
+NULL
+select HEX(sformat('{}', param)) from t5;
+HEX(sformat('{}', param))
+C3A5
+C5BB
+E0B1BB
+C38A
+NULL
+drop table t5;
+set names latin1;
+#
+# Format Test Cases
+#
+select sformat('Num {:L}', 13800000000);
+sformat('Num {:L}', 13800000000)
+Num 13,800,000,000
+select sformat('Num [{:20}]', 42);
+sformat('Num [{:20}]', 42)
+Num [ 42]
+select sformat('Number: {:*^{}}', 4, 5);
+sformat('Number: {:*^{}}', 4, 5)
+Number: **4**
+select sformat('{:02} - {:02} - {:02}', 1, 2, 3);
+sformat('{:02} - {:02} - {:02}', 1, 2, 3)
+01 - 02 - 03
+select sformat('Character {:c}', 104);
+sformat('Character {:c}', 104)
+Character h
+select sformat('String {:s}', 'hello');
+sformat('String {:s}', 'hello')
+String hello
+select sformat('Large {0:+010.4g}', 392.64);
+sformat('Large {0:+010.4g}', 392.64)
+Large +0000392.6
+select sformat('Large {:g}', 392.65);
+sformat('Large {:g}', 392.65)
+Large 392.65
+select sformat('Float {:.2f}', 42.0);
+sformat('Float {:.2f}', 42.0)
+Float 42.00
+select sformat('Float {:f}', 42.0);
+sformat('Float {:f}', 42.0)
+Float 42.000000
+select sformat('Number {:d}', 42);
+sformat('Number {:d}', 42)
+Number 42
+select sformat('Number {:{}}', 5, 5);
+sformat('Number {:{}}', 5, 5)
+Number 5
+select sformat('Number [{:10}]', 9999);
+sformat('Number [{:10}]', 9999)
+Number [ 9999]
+select sformat('Number {:.3}', 3.1416);
+sformat('Number {:.3}', 3.1416)
+Number 3.14
+select sformat('int: {0:d}; hex: {0:x}; oct: {0:o}', 42);
+sformat('int: {0:d}; hex: {0:x}; oct: {0:o}', 42)
+int: 42; hex: 2a; oct: 52
+select sformat('int: {0:d}; hex: {0:#x}; oct: {0:#o}', 42);
+sformat('int: {0:d}; hex: {0:#x}; oct: {0:#o}', 42)
+int: 42; hex: 0x2a; oct: 052
+select sformat('The Hexadecimal version of {0} is {0:X}', 255);
+sformat('The Hexadecimal version of {0} is {0:X}', 255)
+The Hexadecimal version of 255 is FF
+select sformat('The Hexadecimal version of {0} is {0:x}', 255);
+sformat('The Hexadecimal version of {0} is {0:x}', 255)
+The Hexadecimal version of 255 is ff
+select sformat('The octal version of {0} is {0:o}', 10);
+sformat('The octal version of {0} is {0:o}', 10)
+The octal version of 10 is 12
+select sformat('The binary version of {0} is {0:b}', 5);
+sformat('The binary version of {0} is {0:b}', 5)
+The binary version of 5 is 101
+select sformat('{:+f}; {:+f}', 3.14, -3.14);
+sformat('{:+f}; {:+f}', 3.14, -3.14)
++3.140000; -3.140000
+select sformat('{: f}; {: f}', 3.14, -3.14);
+sformat('{: f}; {: f}', 3.14, -3.14)
+ 3.140000; -3.140000
+select sformat('{:-f}; {:-f}', 3.14, -3.14);
+sformat('{:-f}; {:-f}', 3.14, -3.14)
+3.140000; -3.140000
+select sformat('The temperature is between {: } and {: } degrees celsius.', -3, 7);
+sformat('The temperature is between {: } and {: } degrees celsius.', -3, 7)
+The temperature is between -3 and 7 degrees celsius.
+select sformat('The temperature is between {:-} and {:-} degrees celsius.', -3, 7);
+sformat('The temperature is between {:-} and {:-} degrees celsius.', -3, 7)
+The temperature is between -3 and 7 degrees celsius.
+select sformat('The temperature is between {:+} and {:+} degrees celsius.', -3, 7);
+sformat('The temperature is between {:+} and {:+} degrees celsius.', -3, 7)
+The temperature is between -3 and +7 degrees celsius.
+select sformat('We have {:<8} chickens.', 49);
+sformat('We have {:<8} chickens.', 49)
+We have 49 chickens.
+select sformat('Center alimgn [{:*^10}]', 'data');
+sformat('Center alimgn [{:*^10}]', 'data')
+Center alimgn [***data***]
+select sformat('Center aling [{:^10}].', 'data');
+sformat('Center aling [{:^10}].', 'data')
+Center aling [ data ].
+select sformat('Right aling [{:>10}].', 'data');
+sformat('Right aling [{:>10}].', 'data')
+Right aling [ data].
+select sformat('Left align [{:<10}].', 'data');
+sformat('Left align [{:<10}].', 'data')
+Left align [data ].
+select sformat('{0}{1}{0}', 'abra', 'cad');
+sformat('{0}{1}{0}', 'abra', 'cad')
+abracadabra
+select sformat('Change Order {1} {0}', 'second', 'first');
+sformat('Change Order {1} {0}', 'second', 'first')
+Change Order first second
+#
+# Failed Format Test Cases
+#
+select sformat('Test {:c}', 'word');
+sformat('Test {:c}', 'word')
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+select sformat('Test {one} {two} {three}', 1, 2, 3);
+sformat('Test {one} {two} {three}', 1, 2, 3)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: argument not found
+select sformat('Number {:{<}', 8);
+sformat('Number {:{<}', 8)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid fill character '{'
+select sformat('Number {:10000000000}', 5);
+sformat('Number {:10000000000}', 5)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: number is too big
+select sformat('1={1} 2={2} 0={0}', 0, 1);
+sformat('1={1} 2={2} 0={0}', 0, 1)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: argument not found
+select sformat('Number {:.2d}', 42);
+sformat('Number {:.2d}', 42)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: precision not allowed for this argument type
+select sformat('You scored {:.0%}', 0.25);
+sformat('You scored {:.0%}', 0.25)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+select sformat('You scored {:%}', 0.25);
+sformat('You scored {:%}', 0.25)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+select sformat('The price is {:f} dollars.', 45);
+sformat('The price is {:f} dollars.', 45)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+select sformat('The price is {:.2f} dollars.', 45);
+sformat('The price is {:.2f} dollars.', 45)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: precision not allowed for this argument type
+select sformat('We have {:E} chickens.', 5);
+sformat('We have {:E} chickens.', 5)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+select sformat('We have {:e} chickens.', 5);
+sformat('We have {:e} chickens.', 5)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+select sformat('The universe is {:,} years old.', 13800000000);
+sformat('The universe is {:,} years old.', 13800000000)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+select sformat('The universe is {:_} years old.', 13800000000);
+sformat('The universe is {:_} years old.', 13800000000)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+select sformat('String {:-}', 'hello');
+sformat('String {:-}', 'hello')
+NULL
+Warnings:
+Warning 4183 SFORMAT error: format specifier requires numeric argument
+#
+# Table Format Test Cases
+#
+create table t1 (pformat text, data1 FLOAT, data2 INT,
+data3 VARCHAR(30));
+insert into t1 values ('{:.2f} {: } |{:*^15}', 1.11, 1, 'example I'),
+('{:.1f} {:-} |{:^15}', -2.22, -2, 'example II'),
+('{:.2f} {:+} |{:<15}', 3.33, 3, 'example III'),
+('{:.4f} {:d} |{:^15}', -4.44, -4, 'example IV');
+select sformat(pformat, data1, data2, data3) from t1;
+sformat(pformat, data1, data2, data3)
+1.11 1 |***example I***
+-2.2 -2 | example II
+3.33 +3 |example III
+-4.4400 -4 | example IV
+drop table t1;
+create table t2 (a double);
+insert into t2 values (3.14159265358979323846);
+select a, sformat('{:.15f}', a) from t2;
+a sformat('{:.15f}', a)
+3.141592653589793 3.141592653589793
+drop table t2;
+#
+# Unsupported/disabled features
+#
+select sformat('{:p}', '50');
+sformat('{:p}', '50')
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+#
+# ucs2 test
+#
+select sformat('={}=', _ucs2 x'006100620063');
+sformat('={}=', _ucs2 x'006100620063')
+=abc=
+set names utf8;
+select sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442');
+sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442')
+=теÑÑ‚=
+select hex(sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442'));
+hex(sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442'))
+003D0442043504410442003D
+create table t1 as select sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442') as x;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` varchar(8) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+drop table t1;
+set names latin1;
+#
+# ps parameters
+#
+prepare s from 'select sformat("={:d}=", ?)';
+execute s using 100;
+sformat("={:d}=", ?)
+=100=
+execute s using 'abc';
+sformat("={:d}=", ?)
+NULL
+Warnings:
+Warning 4183 SFORMAT error: invalid type specifier
+#
+# MDEV-26691 SFORMAT: Pass down FLOAT as FLOAT, without upcast to DOUBLE
+#
+select sformat('{}', cast(1.1 as float));
+sformat('{}', cast(1.1 as float))
+1.1
+#
+# MDEV-26646 SFORMAT Does not allow @variable use
+#
+set names utf8;
+set @a=3.14;
+select sformat('{:f}', @a);
+sformat('{:f}', @a)
+3.140000
+set names latin1;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/func_sformat.test b/mysql-test/main/func_sformat.test
new file mode 100644
index 00000000000..cb7e7c8f1c1
--- /dev/null
+++ b/mysql-test/main/func_sformat.test
@@ -0,0 +1,255 @@
+echo #;
+echo # MDEV-25015 Custom formatting of strings in MariaDB queries;
+echo #;
+
+# Description
+# -----------
+# Test cases for the sformat function
+
+echo #;
+echo # Normal Test Cases;
+echo #;
+select sformat('string test');
+select sformat(0);
+select sformat('C');
+select sformat(-4.2);
+select sformat(5, 5, 5);
+#enable after fix MDEV-27871
+--disable_view_protocol
+select sformat('{} {}', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+--enable_view_protocol
+select sformat('{{{}}}', 0);
+select sformat('{{{}{{', 0);
+select sformat('{{{{{}{{', 'param1');
+select sformat(' {{ {{ {} {{ ', 'param1');
+select sformat(' {{ {} {}', 'param1', 'param2');
+select sformat('A{}C{}E{}', 'B', 'D', 'F');
+select sformat('{} {}', FALSE, TRUE);
+#enable after fix MDEV-29601
+--disable_service_connection
+select sformat('Add € != {} != {}?', '$', '£');
+select sformat('Check {} != {} != {}?', '€', '$', '£');
+--enable_service_connection
+select sformat('{}{}{}', 1, 2, 3);
+select sformat('Float {} Boolean {} Number {}', 3.14159, True, -50);
+select sformat('SUM {} + {} = {}', 2, 3, 2+3);
+select sformat('Numbers {} {} {}', 1, 1.11, 1.111);
+select sformat('what {} is {}?', 'time', 'it');
+#enable after fix MDEV-27871
+--disable_view_protocol
+select sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}', 1, 2, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
+ 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120);
+select sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}
+ {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}', '1', '2', '3 ',
+ '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20',
+ '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36',
+ '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52',
+ '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68',
+ '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84',
+ '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100',
+ '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114',
+ '115', '116', '117', '118', '119', '120');
+--enable_view_protocol
+
+echo #;
+echo # Error Test Cases;
+echo #;
+select sformat('R={ }', 42);
+select sformat(NULL, 'Null', 'Test');
+select sformat('Null Test {} {} ', 0, NULL);
+select sformat(NULL);
+select sformat('My { Test');
+select sformat('Test { {');
+select sformat('A{}C{}E{}', 'B', 'D');
+error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT;
+select sformat();
+error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT;
+echo #;
+echo # Table Test Cases;
+echo #;
+create table t1 (param1 text, param2 text, param3 int);
+insert into t1 values ('string: {}, number: {}', 'xyz', 123),
+ ('something {} went {} wrong {}', 'foo', 0),
+ ('Test case {} -> {}', 'Print', -32);
+select sformat(param1, param2, param3) from t1;
+drop table t1;
+
+create table t2 (param1 FLOAT, param2 SMALLINT, param3 CHAR, param4 DATE);
+insert into t2 values (0.0025, 25, 'A', DATE('2020-06-29')),
+ (0.0005, 5, 'B', DATE('2020-6-29')),
+ (5.5555, -5, 'C', DATE('200629')),
+ (-9, -9, 'D', DATE('20*06*29'));
+#enable after fix MDEV-27871
+--disable_view_protocol
+select sformat('p1 {:.4f} p2 {} p3 {} p4 {}', param1, param2, param3, param4) from t2;
+--enable_view_protocol
+drop table t2;
+
+set names utf8;
+create table t3 (format_str text character set 'latin1',
+ first_param text character set 'utf8',
+ second_param text character set 'latin1');
+insert into t3 values ('test 1 {} {}', UNHEX('C3A5'), UNHEX('E5'));
+select sformat(format_str, first_param, second_param) from t3;
+select HEX(sformat(format_str, first_param, second_param)) from t3;
+drop table t3;
+set names latin1;
+
+create table t4 (p1 bit(8), p2 boolean, p3 DECIMAL, p4 TIMESTAMP);
+insert into t4 values (42, TRUE, 42, '2021-08-18 16:50:07'),
+ (24, FALSE, 24, '0000-00-00 00:00:00');
+select sformat('{}: {} {} {} {}', 'Data', p1, p2, p3, p4) from t4;
+drop table t4;
+
+set names utf8;
+create table t5 (param text character SET utf8 COLLATE utf8_general_ci);
+insert into t5 values (UNHEX('C3A5')),(UNHEX('C5BB')),(UNHEX('e0b1bb')),
+ (UNHEX('C38A')), (NULL);
+select sformat('{}', param) from t5;
+select HEX(sformat('{}', param)) from t5;
+drop table t5;
+set names latin1;
+
+echo #;
+echo # Format Test Cases;
+echo #;
+select sformat('Num {:L}', 13800000000);
+#enable after fix MDEV-29646
+--disable_view_protocol
+select sformat('Num [{:20}]', 42);
+--enable_view_protocol
+select sformat('Number: {:*^{}}', 4, 5);
+select sformat('{:02} - {:02} - {:02}', 1, 2, 3);
+select sformat('Character {:c}', 104);
+select sformat('String {:s}', 'hello');
+select sformat('Large {0:+010.4g}', 392.64);
+select sformat('Large {:g}', 392.65);
+select sformat('Float {:.2f}', 42.0);
+select sformat('Float {:f}', 42.0);
+select sformat('Number {:d}', 42);
+select sformat('Number {:{}}', 5, 5);
+#enable after fix MDEV-29646
+--disable_view_protocol
+select sformat('Number [{:10}]', 9999);
+--enable_view_protocol
+select sformat('Number {:.3}', 3.1416);
+select sformat('int: {0:d}; hex: {0:x}; oct: {0:o}', 42);
+select sformat('int: {0:d}; hex: {0:#x}; oct: {0:#o}', 42);
+select sformat('The Hexadecimal version of {0} is {0:X}', 255);
+select sformat('The Hexadecimal version of {0} is {0:x}', 255);
+select sformat('The octal version of {0} is {0:o}', 10);
+select sformat('The binary version of {0} is {0:b}', 5);
+select sformat('{:+f}; {:+f}', 3.14, -3.14);
+select sformat('{: f}; {: f}', 3.14, -3.14);
+select sformat('{:-f}; {:-f}', 3.14, -3.14);
+#enable after fix MDEV-27871
+--disable_view_protocol
+select sformat('The temperature is between {: } and {: } degrees celsius.', -3, 7);
+select sformat('The temperature is between {:-} and {:-} degrees celsius.', -3, 7);
+select sformat('The temperature is between {:+} and {:+} degrees celsius.', -3, 7);
+--enable_view_protocol
+#check after fix MDEV-29646
+--disable_view_protocol
+select sformat('We have {:<8} chickens.', 49);
+--enable_view_protocol
+select sformat('Center alimgn [{:*^10}]', 'data');
+select sformat('Center aling [{:^10}].', 'data');
+select sformat('Right aling [{:>10}].', 'data');
+select sformat('Left align [{:<10}].', 'data');
+select sformat('{0}{1}{0}', 'abra', 'cad');
+select sformat('Change Order {1} {0}', 'second', 'first');
+
+echo #;
+echo # Failed Format Test Cases;
+echo #;
+select sformat('Test {:c}', 'word');
+select sformat('Test {one} {two} {three}', 1, 2, 3);
+select sformat('Number {:{<}', 8);
+select sformat('Number {:10000000000}', 5);
+select sformat('1={1} 2={2} 0={0}', 0, 1);
+select sformat('Number {:.2d}', 42);
+select sformat('You scored {:.0%}', 0.25);
+select sformat('You scored {:%}', 0.25);
+select sformat('The price is {:f} dollars.', 45);
+select sformat('The price is {:.2f} dollars.', 45);
+select sformat('We have {:E} chickens.', 5);
+select sformat('We have {:e} chickens.', 5);
+select sformat('The universe is {:,} years old.', 13800000000);
+select sformat('The universe is {:_} years old.', 13800000000);
+select sformat('String {:-}', 'hello');
+
+echo #;
+echo # Table Format Test Cases;
+echo #;
+create table t1 (pformat text, data1 FLOAT, data2 INT,
+ data3 VARCHAR(30));
+insert into t1 values ('{:.2f} {: } |{:*^15}', 1.11, 1, 'example I'),
+ ('{:.1f} {:-} |{:^15}', -2.22, -2, 'example II'),
+ ('{:.2f} {:+} |{:<15}', 3.33, 3, 'example III'),
+ ('{:.4f} {:d} |{:^15}', -4.44, -4, 'example IV');
+select sformat(pformat, data1, data2, data3) from t1;
+drop table t1;
+
+create table t2 (a double);
+insert into t2 values (3.14159265358979323846);
+select a, sformat('{:.15f}', a) from t2;
+drop table t2;
+
+echo #;
+echo # Unsupported/disabled features;
+echo #;
+select sformat('{:p}', '50');
+
+echo #;
+echo # ucs2 test;
+echo #;
+select sformat('={}=', _ucs2 x'006100620063');
+set names utf8;
+select sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442');
+#enable after fix MDEV-27871
+--disable_view_protocol
+select hex(sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442'));
+--enable_view_protocol
+create table t1 as select sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442') as x;
+show create table t1;
+drop table t1;
+set names latin1;
+
+echo #;
+echo # ps parameters;
+echo #;
+prepare s from 'select sformat("={:d}=", ?)';
+execute s using 100;
+execute s using 'abc';
+
+echo #;
+echo # MDEV-26691 SFORMAT: Pass down FLOAT as FLOAT, without upcast to DOUBLE;
+echo #;
+
+select sformat('{}', cast(1.1 as float));
+
+echo #;
+echo # MDEV-26646 SFORMAT Does not allow @variable use;
+echo #;
+
+set names utf8;
+set @a=3.14;
+select sformat('{:f}', @a);
+set names latin1;
+
+echo #;
+echo # End of 10.7 tests;
+echo #;
diff --git a/mysql-test/main/func_time.result b/mysql-test/main/func_time.result
index 62f6f3199b2..27d5810d5f6 100644
--- a/mysql-test/main/func_time.result
+++ b/mysql-test/main/func_time.result
@@ -2798,7 +2798,7 @@ SET sql_mode=DEFAULT;
#
# MDEV-13972 crash in Item_func_sec_to_time::get_date
#
-DO TO_DAYS(SEC_TO_TIME(TIME(CEILING(UUID()))));
+DO TO_DAYS(SEC_TO_TIME(TIME(CEILING(SYS_GUID()))));
DO TO_DAYS(SEC_TO_TIME(MAKEDATE('',RAND(~('')))));
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: ''
diff --git a/mysql-test/main/func_time.test b/mysql-test/main/func_time.test
index 91b846e4c61..b0b9eb5c63c 100644
--- a/mysql-test/main/func_time.test
+++ b/mysql-test/main/func_time.test
@@ -1754,7 +1754,7 @@ SET sql_mode=DEFAULT;
# The below query can return warning sporadically
--disable_warnings
-DO TO_DAYS(SEC_TO_TIME(TIME(CEILING(UUID()))));
+DO TO_DAYS(SEC_TO_TIME(TIME(CEILING(SYS_GUID()))));
--enable_warnings
DO TO_DAYS(SEC_TO_TIME(MAKEDATE('',RAND(~('')))));
diff --git a/mysql-test/main/get_diagnostics.result b/mysql-test/main/get_diagnostics.result
index b00378d4ee9..48eab8e0734 100644
--- a/mysql-test/main/get_diagnostics.result
+++ b/mysql-test/main/get_diagnostics.result
@@ -628,7 +628,7 @@ v
NULL
Warnings:
Note 1050 Table 't1' already exists
-Error 1406 Data too long for column 'v' at row 1
+Error 1406 Data too long for column 'v' at row 0
DROP TABLE t1;
DROP PROCEDURE p1;
@@ -799,3 +799,1066 @@ CREATE TABLE t2 (a char(1)) VALUES ('a'),('b') UNION VALUES ('foo');
Warnings:
Warning 1406 Data too long for column 'a' at row 3
DROP TABLE t1, t2;
+#
+# End of 10.6 tests
+#
+#
+# MDEV-10075: Provide index of error causing error in array INSERT
+#
+#
+# INSERT STATEMENT
+#
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+# Simple INSERT statement
+INSERT INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var1= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var2= ROW_NUMBER;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var1, @var2;
+@var1 @var2
+2
+INSERT INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var3= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var4= ROW_NUMBER;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var3, @var4;
+@var3 @var4
+2 NULL
+INSERT INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+ERROR 21S01: Column count doesn't match value count at row 3
+GET DIAGNOSTICS CONDITION 1 @var5= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var6= ROW_NUMBER;
+Warnings:
+Error 1136 Column count doesn't match value count at row 3
+Error 1758 Invalid condition number
+SELECT @var5, @var6;
+@var5 @var6
+3 NULL
+INSERT INTO t1 VALUES (8,8,8),(9,CAST(123 AS CHAR(1)),1.00109);
+Warnings:
+Warning 1292 Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var7= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var8= ROW_NUMBER;
+Warnings:
+Warning 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var7, @var8;
+@var7 @var8
+2 NULL
+INSERT INTO t1 VALUES (10,10,10),('x','foo',1.0203);
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 2
+GET DIAGNOSTICS CONDITION 1 @var9= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var10= ROW_NUMBER;
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 2
+Error 1758 Invalid condition number
+SELECT @var9, @var10;
+@var9 @var10
+2 NULL
+INSERT INTO t1 VALUES (11,11,11),(12,12,(13,'m',1.0113));
+ERROR 21000: Operand should contain 1 column(s)
+GET DIAGNOSTICS CONDITION 1 @var11= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var12= ROW_NUMBER;
+Warnings:
+Error 1241 Operand should contain 1 column(s)
+Error 1758 Invalid condition number
+SELECT @var11, @var12;
+@var11 @var12
+2 NULL
+delete from t1 where id1=0;
+INSERT INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (16/0,'p',1.0116);
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+GET DIAGNOSTICS CONDITION 1 @var13= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var14= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var15= ROW_NUMBER;
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var13, @var14, @var15;
+@var13 @var14 @var15
+3 3 NULL
+TRUNCATE TABLE t1;
+# INSERT ... IGNORE
+INSERT IGNORE INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+INSERT IGNORE INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+Warnings:
+Warning 1062 Duplicate entry '1' for key 'PRIMARY'
+Warning 1062 Duplicate entry '2' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var16= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var17= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var18= ROW_NUMBER;
+Warnings:
+Warning 1062 Duplicate entry '1' for key 'PRIMARY'
+Warning 1062 Duplicate entry '2' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var16, @var17, @var18;
+@var16 @var17 @var18
+2 3 NULL
+INSERT IGNORE INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var19= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var20= ROW_NUMBER;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var19, @var20;
+@var19 @var20
+2 NULL
+INSERT IGNORE INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+ERROR 21S01: Column count doesn't match value count at row 3
+GET DIAGNOSTICS CONDITION 1 @var21= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var22= ROW_NUMBER;
+Warnings:
+Error 1136 Column count doesn't match value count at row 3
+Error 1758 Invalid condition number
+SELECT @var21, @var22;
+@var21 @var22
+3 NULL
+INSERT IGNORE INTO t1 VALUES (8,8,8),(9,CAST(123 AS CHAR(1)),1.00109);
+Warnings:
+Warning 1292 Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var23= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var24= ROW_NUMBER;
+Warnings:
+Warning 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var23, @var24;
+@var23 @var24
+2 NULL
+INSERT IGNORE INTO t1 VALUES (10,10,10),('x','foo',1.0203);
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 2
+GET DIAGNOSTICS CONDITION 1 @var25= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var26= ROW_NUMBER;
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 2
+Error 1758 Invalid condition number
+SELECT @var25, @var26;
+@var25 @var26
+2 NULL
+INSERT IGNORE INTO t1 VALUES (11,11,11),(12,12,(13,'m',1.0113));
+ERROR 21000: Operand should contain 1 column(s)
+GET DIAGNOSTICS CONDITION 1 @var27= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var28= ROW_NUMBER;
+Warnings:
+Error 1241 Operand should contain 1 column(s)
+Error 1758 Invalid condition number
+SELECT @var27, @var28;
+@var27 @var28
+2 NULL
+INSERT IGNORE INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115),
+(16/0,'p',1.0116);
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Warning 1062 Duplicate entry '0' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var29= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var30= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var31= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 4 @var32= ROW_NUMBER;
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Warning 1062 Duplicate entry '0' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var29, @var30, @var31, @var32;
+@var29 @var30 @var31 @var32
+3 3 3 NULL
+TRUNCATE TABLE t1;
+# INSERT ... SET
+INSERT INTO t1 SET id1=1, val1='a', d1=1.00101;
+INSERT INTO t1 SET id1=2, val1='b', d1=1.00102;
+INSERT INTO t1 SET id1=3, val1='c', d1=1.00103;
+INSERT INTO t1 SET id1=1, val1='a', d1=1.00101;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var33= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var34= ROW_NUMBER;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var33, @var34;
+@var33 @var34
+1 NULL
+INSERT INTO t1 SET id1=6, val1='f', d1=1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var35= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var36= ROW_NUMBER;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var35, @var36;
+@var35 @var36
+1 NULL
+INSERT INTO t1 SET id1=9, val1=CAST(123 AS CHAR(1)), d1=1.00109;
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var37= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var38= ROW_NUMBER;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var37, @var38;
+@var37 @var38
+1 NULL
+INSERT INTO t1 SET id1='x', val1='foo', d1=1.0203;
+ERROR 22007: Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var39= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var40= ROW_NUMBER;
+Warnings:
+Error 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+Error 1758 Invalid condition number
+SELECT @var39, @var40;
+@var39 @var40
+1 NULL
+INSERT INTO t1 SET id1=3/0, val1='p', d1=1.0116;
+ERROR 22012: Division by 0
+GET DIAGNOSTICS CONDITION 1 @var41= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var42= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var43= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 4 @var44= ROW_NUMBER;
+Warnings:
+Error 1365 Division by 0
+Error 1048 Column 'id1' cannot be null
+Error 1105 Unknown error
+Error 1758 Invalid condition number
+SELECT @var41, @var42, @var43, @var44;
+@var41 @var42 @var43 @var44
+1 1 1 NULL
+TRUNCATE TABLE t1;
+# INSERT ... ON DUPLICATE KEY UPDATE
+INSERT INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101)
+ON DUPLICATE KEY UPDATE val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var45= ROW_NUMBER;
+Warnings:
+Error 1758 Invalid condition number
+GET DIAGNOSTICS CONDITION 2 @var46= ROW_NUMBER;
+Warnings:
+Error 1758 Invalid condition number
+Error 1758 Invalid condition number
+SELECT @var45, @var46;
+@var45 @var46
+NULL NULL
+INSERT INTO t1 VALUES (5,'e',1.00105),(3,'f',1.79769313486232e+308)
+ON DUPLICATE KEY UPDATE val1='c';
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var47= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var48= ROW_NUMBER;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var47, @var48;
+@var47 @var48
+2 NULL
+INSERT INTO t1 VALUES (5,'e',1.00105), (3,'i')
+ON DUPLICATE KEY UPDATE val1='c';
+ERROR 21S01: Column count doesn't match value count at row 2
+GET DIAGNOSTICS CONDITION 1 @var49= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var50= ROW_NUMBER;
+Warnings:
+Error 1136 Column count doesn't match value count at row 2
+Error 1758 Invalid condition number
+SELECT @var49, @var50;
+@var49 @var50
+2 NULL
+INSERT INTO t1 VALUES (3, CAST(123 AS CHAR(1)), 1.00103)
+ON DUPLICATE KEY UPDATE val1='c';
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var51= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var52= ROW_NUMBER;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var51, @var52;
+@var51 @var52
+1 NULL
+INSERT INTO t1 VALUES (10,10,10),('x','foo',1.0203)
+ON DUPLICATE KEY UPDATE val1='c';
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 2
+GET DIAGNOSTICS CONDITION 1 @var53= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var54= ROW_NUMBER;
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 2
+Error 1758 Invalid condition number
+SELECT @var53, @var54;
+@var53 @var54
+2 NULL
+INSERT INTO t1 VALUES (11,11,11),(12,12,(13,'m',1.0113)) ON DUPLICATE KEY UPDATE val1='c';
+ERROR 21000: Operand should contain 1 column(s)
+GET DIAGNOSTICS CONDITION 1 @var55= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var56= ROW_NUMBER;
+Warnings:
+Error 1241 Operand should contain 1 column(s)
+Error 1758 Invalid condition number
+SELECT @var55, @var56;
+@var55 @var56
+2 NULL
+INSERT INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (2/0,'p',1.00102)
+ON DUPLICATE KEY UPDATE val1='b';
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+GET DIAGNOSTICS CONDITION 1 @var57= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var58= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var59= ROW_NUMBER;
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var57, @var58, @var59;
+@var57 @var58 @var59
+3 3 NULL
+INSERT INTO t1 VALUES (1,'e',1.0),(5,'e',1.0),(5,'f',1.7)
+ON DUPLICATE KEY UPDATE id1='1';
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var60= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var61= ROW_NUMBER;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var60, @var61;
+@var60 @var61
+3 NULL
+TRUNCATE TABLE t1;
+DROP TABLE t1;
+DROP TABLE t2;
+INSERT ... SELECT
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+INSERT INTO t2 VALUES(1,'a',1.00101,PointFromText('POINT(20 10)')),
+(2,'b',1.00102,PointFromText('POINT(20 10)')),
+(3,'c',1.00103,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2;
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2 WHERE id2=1;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var62= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var63= ROW_NUMBER;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var62, @var63;
+@var62 @var63
+1 NULL
+INSERT INTO t1 SELECT id2, val2, p2 from t2;
+ERROR HY000: Cannot cast 'point' as 'double' in assignment of `test`.`t1`.`d1`
+GET DIAGNOSTICS CONDITION 1 @var64= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var65= ROW_NUMBER;
+Warnings:
+Error 4078 Cannot cast 'point' as 'double' in assignment of `test`.`t1`.`d1`
+Error 1758 Invalid condition number
+SELECT @var64, @var65;
+@var64 @var65
+1 NULL
+INSERT INTO t1 SELECT id2, val2 FROM t2;
+ERROR 21S01: Column count doesn't match value count at row 1
+GET DIAGNOSTICS CONDITION 1 @var66= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var67= ROW_NUMBER;
+Warnings:
+Error 1136 Column count doesn't match value count at row 1
+Error 1758 Invalid condition number
+SELECT @var66, @var67;
+@var66 @var67
+1 NULL
+INSERT INTO t2 VALUES(4,'a',1.00101,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, CAST(123 AS CHAR(1)), d2 FROM t2 WHERE id2=4;
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var68= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var69= ROW_NUMBER;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var68, @var69;
+@var68 @var69
+1 NULL
+INSERT INTO t1 SELECT id2, val2, 1.79769313486232e+308 FROM t2;
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var70= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var71= ROW_NUMBER;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var70, @var71;
+@var70 @var71
+1 NULL
+INSERT INTO t1 SELECT id2/0, val2, d2 FROM t2;
+ERROR 22012: Division by 0
+GET DIAGNOSTICS CONDITION 1 @var72= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var73= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var74= ROW_NUMBER;
+Warnings:
+Error 1365 Division by 0
+Error 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var72, @var73, @var74;
+@var72 @var73 @var74
+1 1 NULL
+DROP TABLE t1,t2;
+# Checking ROW_NUMBER in STORED PROCEDURE for INSERT
+CREATE TABLE t1(id1 INT PRIMARY KEY);
+CREATE PROCEDURE proc1 ()
+BEGIN
+DECLARE var75 INT;
+DECLARE var76 INT;
+INSERT INTO t1 VALUES (1),(2);
+INSERT IGNORE INTO t1 VALUES(2);
+GET DIAGNOSTICS CONDITION 1 var75= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 var76= ROW_NUMBER;
+SELECT var75, var76;
+END;
+|
+CALL proc1();
+var75 var76
+1 NULL
+Warnings:
+Warning 1062 Duplicate entry '2' for key 'PRIMARY'
+Error 1758 Invalid condition number
+TRUNCATE TABLE t1;
+# Checking ROW_NUMBER in PREPARED STATEMENTS for INSERT
+INSERT INTO t1 VALUES (1), (2), (3);
+INSERT IGNORE INTO t1 VALUES(2),(3),(4);
+Warnings:
+Warning 1062 Duplicate entry '2' for key 'PRIMARY'
+Warning 1062 Duplicate entry '3' for key 'PRIMARY'
+PREPARE stmt1 FROM "GET DIAGNOSTICS CONDITION 2 @var77= ROW_NUMBER";
+EXECUTE stmt1;
+SELECT @var77;
+@var77
+2
+DROP PROCEDURE proc1;
+DROP PREPARE stmt1;
+DROP TABLE t1;
+#
+# REPLACE STATEMENT
+#
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE);
+# Simple REPLACE statement
+REPLACE INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+REPLACE INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+GET DIAGNOSTICS CONDITION 1 @var78= ROW_NUMBER;
+Warnings:
+Error 1758 Invalid condition number
+SELECT @var78;
+@var78
+NULL
+REPLACE INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var79= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var80= ROW_NUMBER;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var79, @var80;
+@var79 @var80
+2 NULL
+REPLACE INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+ERROR 21S01: Column count doesn't match value count at row 3
+GET DIAGNOSTICS CONDITION 1 @var81= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var82= ROW_NUMBER;
+Warnings:
+Error 1136 Column count doesn't match value count at row 3
+Error 1758 Invalid condition number
+SELECT @var81, @var82;
+@var81 @var82
+3 NULL
+REPLACE INTO t1 VALUES (8,8,8),(9,CAST(123 AS CHAR(1)),1.00109);
+Warnings:
+Warning 1292 Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var83= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var84= ROW_NUMBER;
+Warnings:
+Warning 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var83, @var84;
+@var83 @var84
+2 NULL
+REPLACE INTO t1 VALUES (10,10,10),('x','foo',1.0203);
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 2
+GET DIAGNOSTICS CONDITION 1 @var85= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var86= ROW_NUMBER;
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 2
+Error 1758 Invalid condition number
+SELECT @var85, @var86;
+@var85 @var86
+2 NULL
+REPLACE INTO t1 VALUES (11,11,11),(12,12,(13,'m',1.0113));
+ERROR 21000: Operand should contain 1 column(s)
+GET DIAGNOSTICS CONDITION 1 @var87= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var88= ROW_NUMBER;
+Warnings:
+Error 1241 Operand should contain 1 column(s)
+Error 1758 Invalid condition number
+SELECT @var87, @var88;
+@var87 @var88
+2 NULL
+REPLACE INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (16/0,'p',1.0116);
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+GET DIAGNOSTICS CONDITION 1 @var89= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var90= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var91= ROW_NUMBER;
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var89, @var90, @var91;
+@var89 @var90 @var91
+3 3 NULL
+TRUNCATE TABLE t1;
+# REPLACE ... SET
+REPLACE INTO t1 SET id1=1, val1='a', d1=1.00101;
+REPLACE INTO t1 SET id1=2, val1='b', d1=1.00102;
+REPLACE INTO t1 SET id1=3, val1='c', d1=1.00103;
+REPLACE INTO t1 SET id1=1, val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var92= ROW_NUMBER;
+Warnings:
+Error 1758 Invalid condition number
+SELECT @var92;
+@var92
+NULL
+REPLACE INTO t1 SET id1=6, val1='f', d1=1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var93= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var94= ROW_NUMBER;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var93, @var94;
+@var93 @var94
+1 NULL
+REPLACE INTO t1 SET id1=9, val1=CAST(123 AS CHAR(1)), d1=1.00109;
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var95= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var96= ROW_NUMBER;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var95, @var96;
+@var95 @var96
+1 NULL
+REPLACE INTO t1 SET id1='x', val1='foo', d1=1.0203;
+ERROR 22007: Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var97= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var98= ROW_NUMBER;
+Warnings:
+Error 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+Error 1758 Invalid condition number
+SELECT @var97, @var98;
+@var97 @var98
+1 NULL
+REPLACE INTO t1 SET id1=3/0, val1='p', d1=1.0116;
+ERROR 22012: Division by 0
+GET DIAGNOSTICS CONDITION 1 @var99= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var100= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var101= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 4 @var102= ROW_NUMBER;
+Warnings:
+Error 1365 Division by 0
+Error 1048 Column 'id1' cannot be null
+Error 1105 Unknown error
+Error 1758 Invalid condition number
+SELECT @var99, @var100, @var101, @var102;
+@var99 @var100 @var101 @var102
+1 1 1 NULL
+TRUNCATE TABLE t1;
+DROP TABLE t1;
+DROP TABLE t2;
+# REPLACE ... SELECT
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+INSERT INTO t2 VALUES(1,'a',1.00101,PointFromText('POINT(20 10)')),
+(2,'b',1.00102,PointFromText('POINT(20 10)')),
+(3,'c',1.00103,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2;
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2 WHERE id2=1;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var103= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var104= ROW_NUMBER;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var103, @var104;
+@var103 @var104
+1 NULL
+INSERT INTO t1 SELECT id2, val2, p2 from t2;
+ERROR HY000: Cannot cast 'point' as 'double' in assignment of `test`.`t1`.`d1`
+GET DIAGNOSTICS CONDITION 1 @var105= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var106= ROW_NUMBER;
+Warnings:
+Error 4078 Cannot cast 'point' as 'double' in assignment of `test`.`t1`.`d1`
+Error 1758 Invalid condition number
+SELECT @var105, @var106;
+@var105 @var106
+1 NULL
+INSERT INTO t1 SELECT id2, val2 FROM t2;
+ERROR 21S01: Column count doesn't match value count at row 1
+GET DIAGNOSTICS CONDITION 1 @var107= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var108= ROW_NUMBER;
+Warnings:
+Error 1136 Column count doesn't match value count at row 1
+Error 1758 Invalid condition number
+SELECT @var107, @var108;
+@var107 @var108
+1 NULL
+INSERT INTO t2 VALUES(4,'a',1.00101,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, CAST(123 AS CHAR(1)), d2 FROM t2 WHERE id2=4;
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var109= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var110= ROW_NUMBER;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var109, @var110;
+@var109 @var110
+1 NULL
+INSERT INTO t1 SELECT id2, val2, 1.79769313486232e+308 FROM t2;
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var111= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var112= ROW_NUMBER;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var111, @var112;
+@var111 @var112
+1 NULL
+INSERT INTO t1 SELECT id2/0, val2, d2 FROM t2;
+ERROR 22012: Division by 0
+GET DIAGNOSTICS CONDITION 1 @var113= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var114= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var115= ROW_NUMBER;
+Warnings:
+Error 1365 Division by 0
+Error 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var113, @var114, @var115;
+@var113 @var114 @var115
+1 1 NULL
+DROP TABLE t1,t2;
+# Checking ROW_NUMBER in STORED PROCEDURE
+CREATE TABLE t1(id1 INT PRIMARY KEY);
+CREATE PROCEDURE proc1 ()
+BEGIN
+DECLARE var116 INT;
+REPLACE INTO t1 VALUES (1),(2);
+GET DIAGNOSTICS CONDITION 1 var116= ROW_NUMBER;
+SELECT var116;
+END;
+|
+CALL proc1();
+var116
+NULL
+Warnings:
+Error 1758 Invalid condition number
+TRUNCATE TABLE t1;
+# Checking ROW_NUMBER in PREPARED STATEMENTS
+REPLACE INTO t1 VALUES (1), (2), (3);
+PREPARE stmt1 FROM "GET DIAGNOSTICS CONDITION 2 @var117= ROW_NUMBER";
+EXECUTE stmt1;
+Warnings:
+Error 1758 Invalid condition number
+SELECT @var117;
+@var117
+NULL
+DROP PROCEDURE proc1;
+DROP PREPARE stmt1;
+DROP TABLE t1;
+#
+# Checking that ROW_NUMBER is only for errors with rows/values
+#
+# INSERT STATEMENT
+CREATE TABLE t1(id1 INT);
+CREATE TABLE t2(id2 INT);
+CREATE VIEW v AS SELECT t1.id1 AS A, t2.id2 AS b FROM t1,t2;
+INSERT INTO t1(id1, id1) VALUES (1,1);
+ERROR 42000: Column 'id1' specified twice
+GET DIAGNOSTICS CONDITION 1 @var118= ROW_NUMBER;
+SELECT @var118;
+@var118
+0
+CREATE FUNCTION f1() RETURNS INT
+BEGIN
+INSERT INTO t1 VALUES (1);
+RETURN 1;
+END |
+INSERT INTO t1 VALUES (1), (f1());
+ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
+GET DIAGNOSTICS CONDITION 1 @var119= ROW_NUMBER;
+SELECT @var119;
+@var119
+0
+INSERT INTO t1 VALUES (1) RETURNING id2;
+ERROR 42S22: Unknown column 'id2' in 'field list'
+GET DIAGNOSTICS CONDITION 1 @var120= ROW_NUMBER;
+SELECT @var120;
+@var120
+0
+INSERT INTO t1(id2) VALUES(1);
+ERROR 42S22: Unknown column 'id2' in 'field list'
+GET DIAGNOSTICS CONDITION 1 @var121= ROW_NUMBER;
+SELECT @var121;
+@var121
+0
+INSERT INTO v VALUES(1,2);
+ERROR HY000: Can not insert into join view 'test.v' without fields list
+GET DIAGNOSTICS CONDITION 1 @var122= ROW_NUMBER;
+SELECT @var122;
+@var122
+0
+INSERT INTO v(a,b) VALUES (1,2);
+ERROR HY000: Can not modify more than one base table through a join view 'test.v'
+GET DIAGNOSTICS CONDITION 1 @var123= ROW_NUMBER;
+SELECT @var123;
+@var123
+0
+# REPLACE STATEMENT
+REPLACE INTO t1(id1, id1) VALUES (1,1);
+ERROR 42000: Column 'id1' specified twice
+GET DIAGNOSTICS CONDITION 1 @var124= ROW_NUMBER;
+SELECT @var124;
+@var124
+0
+CREATE FUNCTION f2() RETURNS INT
+BEGIN
+REPLACE INTO t1 VALUES (1);
+RETURN 1;
+END |
+REPLACE INTO t1 VALUES (1), (f2());
+ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
+GET DIAGNOSTICS CONDITION 1 @var125= ROW_NUMBER;
+SELECT @var125;
+@var125
+0
+REPLACE INTO t1 VALUES (1) RETURNING id2;
+ERROR 42S22: Unknown column 'id2' in 'field list'
+GET DIAGNOSTICS CONDITION 1 @var126= ROW_NUMBER;
+SELECT @var126;
+@var126
+0
+REPLACE INTO t1(id2) VALUES(1);
+ERROR 42S22: Unknown column 'id2' in 'field list'
+GET DIAGNOSTICS CONDITION 1 @var127= ROW_NUMBER;
+SELECT @var127;
+@var127
+0
+REPLACE INTO v VALUES(1,2);
+ERROR HY000: Can not insert into join view 'test.v' without fields list
+GET DIAGNOSTICS CONDITION 1 @var128= ROW_NUMBER;
+SELECT @var128;
+@var128
+0
+REPLACE INTO v(a,b) VALUES (1,2);
+ERROR HY000: Can not modify more than one base table through a join view 'test.v'
+GET DIAGNOSTICS CONDITION 1 @var129= ROW_NUMBER;
+SELECT @var129;
+@var129
+0
+DROP TABLE t1,t2;
+DROP FUNCTION f1;
+DROP FUNCTION f2;
+DROP VIEW v;
+#
+# MDEV-26606: ROW_NUMBER property value isn't passed from inside a
+# stored procedure
+#
+# Test 1: Without RESIGNAL
+CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY);
+CREATE OR REPLACE PROCEDURE sp(a INT) INSERT INTO t1 VALUES (2),(a);
+SET @num=null, @msg=null;
+INSERT INTO t1 VALUES(1);
+CALL sp(1);
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @num = ROW_NUMBER, @msg = MESSAGE_TEXT;
+SELECT @num, @msg;
+@num @msg
+2 Duplicate entry '1' for key 'PRIMARY'
+DROP PROCEDURE sp;
+DROP TABLE t1;
+# Test 2: With RESIGNAL
+CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY);
+CREATE OR REPLACE PROCEDURE sp(a INT)
+BEGIN
+DECLARE n INT;
+DECLARE m VARCHAR(255);
+DECLARE EXIT HANDLER FOR 1062
+BEGIN
+GET DIAGNOSTICS CONDITION 1 n = ROW_NUMBER, m = MESSAGE_TEXT;
+SELECT n, m;
+RESIGNAL;
+END;
+INSERT INTO t1 VALUES (2), (a);
+END |
+SET @num=null, @msg=null;
+INSERT INTO t1 VALUES (1);
+CALL sp(1);
+n m
+2 Duplicate entry '1' for key 'PRIMARY'
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @num = ROW_NUMBER, @msg = MESSAGE_TEXT;
+SELECT @num, @msg;
+@num @msg
+2 Duplicate entry '1' for key 'PRIMARY'
+DROP PROCEDURE sp;
+DROP TABLE t1;
+# Checking more errors
+CREATE TABLE t1 (val1 TINYINT);
+CREATE PROCEDURE sp(a INT) INSERT INTO t1 VALUES (2),(a);
+INSERT INTO t1 VALUES(1);
+CALL sp(100000);
+Warnings:
+Warning 1264 Out of range value for column 'val1' at row 2
+GET DIAGNOSTICS CONDITION 1 @var1= ROW_NUMBER;
+SELECT @var1;
+@var1
+2
+DROP TABLE t1;
+DROP PROCEDURE sp;
+#
+# MDEV-26684: Unexpected ROW_NUMBER in a condition raised by a diagnostics statement
+#
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (1),(2);
+GET DIAGNOSTICS CONDITION 5 @msg = MESSAGE_TEXT;
+Warnings:
+Error 1758 Invalid condition number
+SHOW WARNINGS;
+Level Code Message
+Error 1758 Invalid condition number
+GET DIAGNOSTICS CONDITION 1 @ind = ROW_NUMBER, @msg = MESSAGE_TEXT;
+SELECT @ind, @msg;
+@ind @msg
+0 Invalid condition number
+INSERT INTO t1 VALUES (3),(4);
+GET DIAGNOSTICS CONDITION 1 @ind = ROW_NUMBER, @msg = MESSAGE_TEXT;
+Warnings:
+Error 1758 Invalid condition number
+SELECT @ind, @msg;
+@ind @msg
+0 Invalid condition number
+GET DIAGNOSTICS CONDITION 5 @ind = ROW_NUMBER, @msg = MESSAGE_TEXT;
+Warnings:
+Error 1758 Invalid condition number
+Error 1758 Invalid condition number
+SELECT @ind, @msg;
+@ind @msg
+0 Invalid condition number
+DROP TABLE t1;
+#
+# MDEV-26681: ROW_NUMBER is not available within compound statement blocks
+#
+CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY, a CHAR(3));
+INSERT IGNORE INTO t1 VALUES (1,'foo'),(1,'bar'),(2,'foobar');
+Warnings:
+Warning 1062 Duplicate entry '1' for key 'PRIMARY'
+Warning 1265 Data truncated for column 'a' at row 3
+BEGIN NOT ATOMIC
+DECLARE i INT DEFAULT 0;
+DECLARE rnum INT DEFAULT -1;
+DECLARE msg VARCHAR(1024) DEFAULT '';
+DECLARE err INT DEFAULT -1;
+WHILE i < @@warning_count
+DO
+SET i = i + 1;
+GET DIAGNOSTICS CONDITION i rnum = ROW_NUMBER, msg = MESSAGE_TEXT, err = MYSQL_ERRNO;
+SELECT i, rnum, msg, err;
+END WHILE;
+END |
+i rnum msg err
+1 2 Duplicate entry '1' for key 'PRIMARY' 1062
+i rnum msg err
+2 3 Data truncated for column 'a' at row 3 1265
+GET DIAGNOSTICS CONDITION 1 @rnum = ROW_NUMBER, @msg = MESSAGE_TEXT, @err = MYSQL_ERRNO;
+select @rnum, @msg, @err;
+@rnum @msg @err
+2 Duplicate entry '1' for key 'PRIMARY' 1062
+GET DIAGNOSTICS CONDITION 2 @rnum = ROW_NUMBER, @msg = MESSAGE_TEXT, @err = MYSQL_ERRNO;
+SELECT @rnum, @msg, @err;
+@rnum @msg @err
+3 Data truncated for column 'a' at row 3 1265
+DROP TABLE t1;
+#
+# ROW_NUMBER differs from the number in the error message upon
+# ER_WARN_DATA_OUT_OF_RANGE
+#
+CREATE TABLE t (a INT);
+INSERT INTO t VALUES (1),(2);
+SELECT CAST(a AS DECIMAL(2,2)) AS f FROM t;
+f
+0.99
+0.99
+Warnings:
+Warning 1264 Out of range value for column 'f' at row 1
+Warning 1264 Out of range value for column 'f' at row 2
+GET DIAGNOSTICS CONDITION 2 @n= ROW_NUMBER, @m = MESSAGE_TEXT;
+SELECT @n, @m;
+@n @m
+2 Out of range value for column 'f' at row 2
+DROP TABLE t;
+#
+# MDEV-26832: ROW_NUMBER in SIGNAL/RESIGNAL causes a syntax error
+#
+# using signal
+CREATE PROCEDURE signal_syntax()
+BEGIN
+DECLARE errno INT DEFAULT 0;
+DECLARE msg TEXT DEFAULT "foo";
+DECLARE row_num INT DEFAULT 0;
+DECLARE cond CONDITION FOR SQLSTATE "01234";
+DECLARE CONTINUE HANDLER for 1012
+BEGIN
+GET DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO, msg = MESSAGE_TEXT, row_num= ROW_NUMBER;
+END;
+SIGNAL cond SET MESSAGE_TEXT = "Signal message", MYSQL_ERRNO = 1012, ROW_NUMBER= 5;
+SELECT errno, msg, row_num;
+END|
+CALL signal_syntax();
+errno msg row_num
+1012 Signal message 5
+DROP PROCEDURE signal_syntax;
+# using resignal
+CREATE PROCEDURE resignal_syntax()
+BEGIN
+DECLARE CONTINUE HANDLER
+FOR 1146
+BEGIN
+RESIGNAL SET
+MESSAGE_TEXT = '`temptab` does not exist', ROW_NUMBER= 105;
+END;
+SELECT `c` FROM `temptab`;
+END|
+CALL resignal_syntax();
+ERROR 42S02: `temptab` does not exist
+GET DIAGNOSTICS CONDITION 1 @row_num= ROW_NUMBER;
+SELECT @row_num;
+@row_num
+105
+DROP PROCEDURE resignal_syntax;
+#
+# MDEV-26842: ROW_NUMBER is not set and differs from the message upon
+# WARN_DATA_TRUNCATED produced by inplace ALTER
+#
+CREATE TABLE t1 (a VARCHAR(64)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('foo'),(null);
+ALTER TABLE t1 ADD PRIMARY KEY(a), ALGORITHM=INPLACE;
+ERROR 01000: Data truncated for column 'a' at row 2
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER, @m= MESSAGE_TEXT;
+SELECT @n, @m;
+@n @m
+2 Data truncated for column 'a' at row 2
+DROP TABLE t1;
+#
+# MDEV-26841: ROW_NUMBER is not set and differs from the message upon
+# ER_WRONG_VALUE_COUNT_ON_ROW for the 1st row
+#
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (1,2),(3);
+ERROR 21S01: Column count doesn't match value count at row 1
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER, @m= MESSAGE_TEXT;
+SELECT @n, @m;
+@n @m
+1 Column count doesn't match value count at row 1
+INSERT INTO t1(a) VALUES(1,2), (3);
+ERROR 21S01: Column count doesn't match value count at row 1
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER, @m= MESSAGE_TEXT;
+SELECT @n, @m;
+@n @m
+1 Column count doesn't match value count at row 1
+DROP TABLE t1;
+#
+# MDEV-26830: Wrong ROW_NUMBER in diagnostics upon INSERT IGNORE with
+# CHECK violation
+#
+CREATE TABLE t1 (a INT, CHECK(a>0));
+INSERT IGNORE INTO t1 VALUES (1),(0),(2),(0);
+Warnings:
+Warning 4025 CONSTRAINT `CONSTRAINT_1` failed for `test`.`t1`
+Warning 4025 CONSTRAINT `CONSTRAINT_1` failed for `test`.`t1`
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+@n
+2
+GET DIAGNOSTICS CONDITION 2 @n= ROW_NUMBER;
+SELECT @n;
+@n
+4
+DROP TABLE t1;
+#
+# MDEV-26844: DELETE returns ROW_NUMBER=1 for every row upon
+# ER_TRUNCATED_WRONG_VALUE
+#
+# without ORDER BY
+CREATE TABLE t (a VARCHAR(8));
+INSERT INTO t VALUES ('val1'),('val2'),('100'),('val4');
+SELECT * FROM t;
+a
+val1
+val2
+100
+val4
+DELETE FROM t WHERE a = 100;
+Warnings:
+Warning 1292 Truncated incorrect DECIMAL value: 'val1'
+Warning 1292 Truncated incorrect DECIMAL value: 'val2'
+Warning 1292 Truncated incorrect DECIMAL value: 'val4'
+SHOW WARNINGS;
+Level Code Message
+Warning 1292 Truncated incorrect DECIMAL value: 'val1'
+Warning 1292 Truncated incorrect DECIMAL value: 'val2'
+Warning 1292 Truncated incorrect DECIMAL value: 'val4'
+GET DIAGNOSTICS CONDITION 3 @n = ROW_NUMBER;
+SELECT @n;
+@n
+4
+DROP TABLE t;
+#
+# MDEV-26695: Number of an invalid row is not calculated for table value constructor
+#
+CREATE TABLE t1 (a CHAR(1)) VALUES ('a'),('b'),('foo');
+Warnings:
+Warning 1406 Data too long for column 'a' at row 3
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+@n
+3
+CREATE TABLE t2 (a CHAR(1)) VALUES ('a'),('b') UNION VALUES ('foo');
+Warnings:
+Warning 1406 Data too long for column 'a' at row 3
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+@n
+3
+DROP TABLE t1, t2;
+# Checking that CREATE ... SELECT works
+CREATE TABLE t1 (val1 CHAR(5));
+INSERT INTO t1 VALUES ('A'),('B'),('C'),('DEF');
+CREATE TABLE t2 (val2 CHAR(1)) SELECT val1 as val2 FROM t1;
+Warnings:
+Warning 1406 Data too long for column 'val2' at row 4
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+@n
+4
+SELECT * FROM t2;
+val2
+A
+B
+C
+D
+DROP TABLE t1,t2;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/get_diagnostics.test b/mysql-test/main/get_diagnostics.test
index 86643db3b5a..27c98069384 100644
--- a/mysql-test/main/get_diagnostics.test
+++ b/mysql-test/main/get_diagnostics.test
@@ -1,3 +1,5 @@
+--source include/have_innodb.inc
+
SET NAMES utf8;
--echo #
@@ -863,3 +865,870 @@ CREATE TABLE t1 (a CHAR(1)) VALUES ('a'),('b'),('foo');
CREATE TABLE t2 (a char(1)) VALUES ('a'),('b') UNION VALUES ('foo');
DROP TABLE t1, t2;
+
+--echo #
+--echo # End of 10.6 tests
+--echo #
+
+--echo #
+--echo # MDEV-10075: Provide index of error causing error in array INSERT
+--echo #
+
+--echo #
+--echo # INSERT STATEMENT
+--echo #
+
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+
+
+--echo # Simple INSERT statement
+
+INSERT INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+--error ER_DUP_ENTRY
+INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+GET DIAGNOSTICS CONDITION 1 @var1= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var2= ROW_NUMBER;
+SELECT @var1, @var2;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var3= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var4= ROW_NUMBER;
+SELECT @var3, @var4;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+GET DIAGNOSTICS CONDITION 1 @var5= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var6= ROW_NUMBER;
+SELECT @var5, @var6;
+
+INSERT INTO t1 VALUES (8,8,8),(9,CAST(123 AS CHAR(1)),1.00109);
+GET DIAGNOSTICS CONDITION 1 @var7= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var8= ROW_NUMBER;
+SELECT @var7, @var8;
+
+INSERT INTO t1 VALUES (10,10,10),('x','foo',1.0203);
+GET DIAGNOSTICS CONDITION 1 @var9= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var10= ROW_NUMBER;
+SELECT @var9, @var10;
+
+--error ER_OPERAND_COLUMNS
+INSERT INTO t1 VALUES (11,11,11),(12,12,(13,'m',1.0113));
+GET DIAGNOSTICS CONDITION 1 @var11= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var12= ROW_NUMBER;
+SELECT @var11, @var12;
+
+delete from t1 where id1=0;
+INSERT INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (16/0,'p',1.0116);
+GET DIAGNOSTICS CONDITION 1 @var13= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var14= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var15= ROW_NUMBER;
+SELECT @var13, @var14, @var15;
+
+TRUNCATE TABLE t1;
+
+--echo # INSERT ... IGNORE
+
+INSERT IGNORE INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+INSERT IGNORE INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+GET DIAGNOSTICS CONDITION 1 @var16= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var17= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var18= ROW_NUMBER;
+SELECT @var16, @var17, @var18;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT IGNORE INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var19= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var20= ROW_NUMBER;
+SELECT @var19, @var20;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT IGNORE INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+GET DIAGNOSTICS CONDITION 1 @var21= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var22= ROW_NUMBER;
+SELECT @var21, @var22;
+
+INSERT IGNORE INTO t1 VALUES (8,8,8),(9,CAST(123 AS CHAR(1)),1.00109);
+GET DIAGNOSTICS CONDITION 1 @var23= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var24= ROW_NUMBER;
+SELECT @var23, @var24;
+
+INSERT IGNORE INTO t1 VALUES (10,10,10),('x','foo',1.0203);
+GET DIAGNOSTICS CONDITION 1 @var25= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var26= ROW_NUMBER;
+SELECT @var25, @var26;
+
+--error ER_OPERAND_COLUMNS
+INSERT IGNORE INTO t1 VALUES (11,11,11),(12,12,(13,'m',1.0113));
+GET DIAGNOSTICS CONDITION 1 @var27= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var28= ROW_NUMBER;
+SELECT @var27, @var28;
+
+INSERT IGNORE INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115),
+(16/0,'p',1.0116);
+GET DIAGNOSTICS CONDITION 1 @var29= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var30= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var31= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 4 @var32= ROW_NUMBER;
+SELECT @var29, @var30, @var31, @var32;
+
+TRUNCATE TABLE t1;
+
+--echo # INSERT ... SET
+
+INSERT INTO t1 SET id1=1, val1='a', d1=1.00101;
+INSERT INTO t1 SET id1=2, val1='b', d1=1.00102;
+INSERT INTO t1 SET id1=3, val1='c', d1=1.00103;
+
+--error ER_DUP_ENTRY
+INSERT INTO t1 SET id1=1, val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var33= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var34= ROW_NUMBER;
+SELECT @var33, @var34;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 SET id1=6, val1='f', d1=1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var35= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var36= ROW_NUMBER;
+SELECT @var35, @var36;
+
+
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 SET id1=9, val1=CAST(123 AS CHAR(1)), d1=1.00109;
+GET DIAGNOSTICS CONDITION 1 @var37= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var38= ROW_NUMBER;
+SELECT @var37, @var38;
+
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+INSERT INTO t1 SET id1='x', val1='foo', d1=1.0203;
+GET DIAGNOSTICS CONDITION 1 @var39= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var40= ROW_NUMBER;
+SELECT @var39, @var40;
+
+--error ER_DIVISION_BY_ZERO
+INSERT INTO t1 SET id1=3/0, val1='p', d1=1.0116;
+GET DIAGNOSTICS CONDITION 1 @var41= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var42= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var43= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 4 @var44= ROW_NUMBER;
+SELECT @var41, @var42, @var43, @var44;
+
+TRUNCATE TABLE t1;
+
+--echo # INSERT ... ON DUPLICATE KEY UPDATE
+
+INSERT INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+
+INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101)
+ON DUPLICATE KEY UPDATE val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var45= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var46= ROW_NUMBER;
+SELECT @var45, @var46;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 VALUES (5,'e',1.00105),(3,'f',1.79769313486232e+308)
+ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var47= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var48= ROW_NUMBER;
+SELECT @var47, @var48;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1 VALUES (5,'e',1.00105), (3,'i')
+ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var49= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var50= ROW_NUMBER;
+SELECT @var49, @var50;
+
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES (3, CAST(123 AS CHAR(1)), 1.00103)
+ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var51= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var52= ROW_NUMBER;
+SELECT @var51, @var52;
+
+INSERT INTO t1 VALUES (10,10,10),('x','foo',1.0203)
+ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var53= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var54= ROW_NUMBER;
+SELECT @var53, @var54;
+
+--error ER_OPERAND_COLUMNS
+INSERT INTO t1 VALUES (11,11,11),(12,12,(13,'m',1.0113)) ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var55= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var56= ROW_NUMBER;
+SELECT @var55, @var56;
+
+INSERT INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (2/0,'p',1.00102)
+ON DUPLICATE KEY UPDATE val1='b';
+GET DIAGNOSTICS CONDITION 1 @var57= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var58= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var59= ROW_NUMBER;
+SELECT @var57, @var58, @var59;
+
+--error ER_DUP_ENTRY
+INSERT INTO t1 VALUES (1,'e',1.0),(5,'e',1.0),(5,'f',1.7)
+ON DUPLICATE KEY UPDATE id1='1';
+GET DIAGNOSTICS CONDITION 1 @var60= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var61= ROW_NUMBER;
+SELECT @var60, @var61;
+
+TRUNCATE TABLE t1;
+
+DROP TABLE t1;
+DROP TABLE t2;
+
+--echo INSERT ... SELECT
+
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+
+INSERT INTO t2 VALUES(1,'a',1.00101,PointFromText('POINT(20 10)')),
+ (2,'b',1.00102,PointFromText('POINT(20 10)')),
+ (3,'c',1.00103,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2;
+
+--error ER_DUP_ENTRY
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2 WHERE id2=1;
+GET DIAGNOSTICS CONDITION 1 @var62= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var63= ROW_NUMBER;
+SELECT @var62, @var63;
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+INSERT INTO t1 SELECT id2, val2, p2 from t2;
+GET DIAGNOSTICS CONDITION 1 @var64= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var65= ROW_NUMBER;
+SELECT @var64, @var65;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1 SELECT id2, val2 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var66= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var67= ROW_NUMBER;
+SELECT @var66, @var67;
+
+INSERT INTO t2 VALUES(4,'a',1.00101,PointFromText('POINT(20 10)'));
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 SELECT id2, CAST(123 AS CHAR(1)), d2 FROM t2 WHERE id2=4;
+GET DIAGNOSTICS CONDITION 1 @var68= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var69= ROW_NUMBER;
+SELECT @var68, @var69;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 SELECT id2, val2, 1.79769313486232e+308 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var70= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var71= ROW_NUMBER;
+SELECT @var70, @var71;
+
+
+--error ER_DIVISION_BY_ZERO
+INSERT INTO t1 SELECT id2/0, val2, d2 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var72= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var73= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var74= ROW_NUMBER;
+SELECT @var72, @var73, @var74;
+
+DROP TABLE t1,t2;
+
+--echo # Checking ROW_NUMBER in STORED PROCEDURE for INSERT
+
+CREATE TABLE t1(id1 INT PRIMARY KEY);
+
+DELIMITER |;
+
+CREATE PROCEDURE proc1 ()
+BEGIN
+
+ DECLARE var75 INT;
+ DECLARE var76 INT;
+
+ INSERT INTO t1 VALUES (1),(2);
+ INSERT IGNORE INTO t1 VALUES(2);
+
+ GET DIAGNOSTICS CONDITION 1 var75= ROW_NUMBER;
+ GET DIAGNOSTICS CONDITION 2 var76= ROW_NUMBER;
+
+ SELECT var75, var76;
+
+END;
+|
+
+DELIMITER ;|
+
+CALL proc1();
+TRUNCATE TABLE t1;
+
+--echo # Checking ROW_NUMBER in PREPARED STATEMENTS for INSERT
+
+INSERT INTO t1 VALUES (1), (2), (3);
+INSERT IGNORE INTO t1 VALUES(2),(3),(4);
+
+PREPARE stmt1 FROM "GET DIAGNOSTICS CONDITION 2 @var77= ROW_NUMBER";
+EXECUTE stmt1;
+SELECT @var77;
+
+DROP PROCEDURE proc1;
+DROP PREPARE stmt1;
+DROP TABLE t1;
+
+--echo #
+--echo # REPLACE STATEMENT
+--echo #
+
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE);
+
+
+--echo # Simple REPLACE statement
+
+REPLACE INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+REPLACE INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+GET DIAGNOSTICS CONDITION 1 @var78= ROW_NUMBER;
+SELECT @var78;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+REPLACE INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var79= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var80= ROW_NUMBER;
+SELECT @var79, @var80;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+REPLACE INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+GET DIAGNOSTICS CONDITION 1 @var81= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var82= ROW_NUMBER;
+SELECT @var81, @var82;
+
+REPLACE INTO t1 VALUES (8,8,8),(9,CAST(123 AS CHAR(1)),1.00109);
+GET DIAGNOSTICS CONDITION 1 @var83= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var84= ROW_NUMBER;
+SELECT @var83, @var84;
+
+REPLACE INTO t1 VALUES (10,10,10),('x','foo',1.0203);
+GET DIAGNOSTICS CONDITION 1 @var85= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var86= ROW_NUMBER;
+SELECT @var85, @var86;
+
+--error ER_OPERAND_COLUMNS
+REPLACE INTO t1 VALUES (11,11,11),(12,12,(13,'m',1.0113));
+GET DIAGNOSTICS CONDITION 1 @var87= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var88= ROW_NUMBER;
+SELECT @var87, @var88;
+
+REPLACE INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (16/0,'p',1.0116);
+GET DIAGNOSTICS CONDITION 1 @var89= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var90= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var91= ROW_NUMBER;
+SELECT @var89, @var90, @var91;
+
+TRUNCATE TABLE t1;
+
+--echo # REPLACE ... SET
+
+REPLACE INTO t1 SET id1=1, val1='a', d1=1.00101;
+REPLACE INTO t1 SET id1=2, val1='b', d1=1.00102;
+REPLACE INTO t1 SET id1=3, val1='c', d1=1.00103;
+
+REPLACE INTO t1 SET id1=1, val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var92= ROW_NUMBER;
+SELECT @var92;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+REPLACE INTO t1 SET id1=6, val1='f', d1=1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var93= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var94= ROW_NUMBER;
+SELECT @var93, @var94;
+
+
+--error ER_TRUNCATED_WRONG_VALUE
+REPLACE INTO t1 SET id1=9, val1=CAST(123 AS CHAR(1)), d1=1.00109;
+GET DIAGNOSTICS CONDITION 1 @var95= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var96= ROW_NUMBER;
+SELECT @var95, @var96;
+
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+REPLACE INTO t1 SET id1='x', val1='foo', d1=1.0203;
+GET DIAGNOSTICS CONDITION 1 @var97= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var98= ROW_NUMBER;
+SELECT @var97, @var98;
+
+--error ER_DIVISION_BY_ZERO
+REPLACE INTO t1 SET id1=3/0, val1='p', d1=1.0116;
+GET DIAGNOSTICS CONDITION 1 @var99= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var100= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var101= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 4 @var102= ROW_NUMBER;
+SELECT @var99, @var100, @var101, @var102;
+
+TRUNCATE TABLE t1;
+
+DROP TABLE t1;
+DROP TABLE t2;
+
+--echo # REPLACE ... SELECT
+
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+
+
+INSERT INTO t2 VALUES(1,'a',1.00101,PointFromText('POINT(20 10)')),
+ (2,'b',1.00102,PointFromText('POINT(20 10)')),
+ (3,'c',1.00103,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2;
+
+--error ER_DUP_ENTRY
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2 WHERE id2=1;
+GET DIAGNOSTICS CONDITION 1 @var103= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var104= ROW_NUMBER;
+SELECT @var103, @var104;
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+INSERT INTO t1 SELECT id2, val2, p2 from t2;
+GET DIAGNOSTICS CONDITION 1 @var105= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var106= ROW_NUMBER;
+SELECT @var105, @var106;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1 SELECT id2, val2 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var107= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var108= ROW_NUMBER;
+SELECT @var107, @var108;
+
+INSERT INTO t2 VALUES(4,'a',1.00101,PointFromText('POINT(20 10)'));
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 SELECT id2, CAST(123 AS CHAR(1)), d2 FROM t2 WHERE id2=4;
+GET DIAGNOSTICS CONDITION 1 @var109= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var110= ROW_NUMBER;
+SELECT @var109, @var110;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 SELECT id2, val2, 1.79769313486232e+308 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var111= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var112= ROW_NUMBER;
+SELECT @var111, @var112;
+
+
+--error ER_DIVISION_BY_ZERO
+INSERT INTO t1 SELECT id2/0, val2, d2 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var113= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 2 @var114= ROW_NUMBER;
+GET DIAGNOSTICS CONDITION 3 @var115= ROW_NUMBER;
+SELECT @var113, @var114, @var115;
+
+DROP TABLE t1,t2;
+
+--echo # Checking ROW_NUMBER in STORED PROCEDURE
+
+CREATE TABLE t1(id1 INT PRIMARY KEY);
+
+DELIMITER |;
+
+CREATE PROCEDURE proc1 ()
+BEGIN
+
+ DECLARE var116 INT;
+
+ REPLACE INTO t1 VALUES (1),(2);
+
+ GET DIAGNOSTICS CONDITION 1 var116= ROW_NUMBER;
+
+ SELECT var116;
+
+END;
+|
+
+DELIMITER ;|
+
+CALL proc1();
+TRUNCATE TABLE t1;
+
+--echo # Checking ROW_NUMBER in PREPARED STATEMENTS
+
+REPLACE INTO t1 VALUES (1), (2), (3);
+
+PREPARE stmt1 FROM "GET DIAGNOSTICS CONDITION 2 @var117= ROW_NUMBER";
+EXECUTE stmt1;
+SELECT @var117;
+
+DROP PROCEDURE proc1;
+DROP PREPARE stmt1;
+DROP TABLE t1;
+
+--echo #
+--echo # Checking that ROW_NUMBER is only for errors with rows/values
+--echo #
+
+--echo # INSERT STATEMENT
+
+CREATE TABLE t1(id1 INT);
+CREATE TABLE t2(id2 INT);
+CREATE VIEW v AS SELECT t1.id1 AS A, t2.id2 AS b FROM t1,t2;
+
+--error ER_FIELD_SPECIFIED_TWICE
+INSERT INTO t1(id1, id1) VALUES (1,1);
+GET DIAGNOSTICS CONDITION 1 @var118= ROW_NUMBER;
+SELECT @var118;
+
+delimiter |;
+CREATE FUNCTION f1() RETURNS INT
+BEGIN
+ INSERT INTO t1 VALUES (1);
+ RETURN 1;
+END |
+delimiter ;|
+
+--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
+INSERT INTO t1 VALUES (1), (f1());
+GET DIAGNOSTICS CONDITION 1 @var119= ROW_NUMBER;
+SELECT @var119;
+
+--error ER_BAD_FIELD_ERROR
+INSERT INTO t1 VALUES (1) RETURNING id2;
+GET DIAGNOSTICS CONDITION 1 @var120= ROW_NUMBER;
+SELECT @var120;
+
+--error ER_BAD_FIELD_ERROR
+INSERT INTO t1(id2) VALUES(1);
+GET DIAGNOSTICS CONDITION 1 @var121= ROW_NUMBER;
+SELECT @var121;
+
+--error ER_VIEW_NO_INSERT_FIELD_LIST
+INSERT INTO v VALUES(1,2);
+GET DIAGNOSTICS CONDITION 1 @var122= ROW_NUMBER;
+SELECT @var122;
+
+--error ER_VIEW_MULTIUPDATE
+INSERT INTO v(a,b) VALUES (1,2);
+GET DIAGNOSTICS CONDITION 1 @var123= ROW_NUMBER;
+SELECT @var123;
+
+--echo # REPLACE STATEMENT
+
+--error ER_FIELD_SPECIFIED_TWICE
+REPLACE INTO t1(id1, id1) VALUES (1,1);
+GET DIAGNOSTICS CONDITION 1 @var124= ROW_NUMBER;
+SELECT @var124;
+
+delimiter |;
+CREATE FUNCTION f2() RETURNS INT
+BEGIN
+ REPLACE INTO t1 VALUES (1);
+ RETURN 1;
+END |
+delimiter ;|
+
+--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
+REPLACE INTO t1 VALUES (1), (f2());
+GET DIAGNOSTICS CONDITION 1 @var125= ROW_NUMBER;
+SELECT @var125;
+
+--error ER_BAD_FIELD_ERROR
+REPLACE INTO t1 VALUES (1) RETURNING id2;
+GET DIAGNOSTICS CONDITION 1 @var126= ROW_NUMBER;
+SELECT @var126;
+
+--error ER_BAD_FIELD_ERROR
+REPLACE INTO t1(id2) VALUES(1);
+GET DIAGNOSTICS CONDITION 1 @var127= ROW_NUMBER;
+SELECT @var127;
+
+--error ER_VIEW_NO_INSERT_FIELD_LIST
+REPLACE INTO v VALUES(1,2);
+GET DIAGNOSTICS CONDITION 1 @var128= ROW_NUMBER;
+SELECT @var128;
+
+--error ER_VIEW_MULTIUPDATE
+REPLACE INTO v(a,b) VALUES (1,2);
+GET DIAGNOSTICS CONDITION 1 @var129= ROW_NUMBER;
+SELECT @var129;
+
+DROP TABLE t1,t2;
+DROP FUNCTION f1;
+DROP FUNCTION f2;
+DROP VIEW v;
+
+--echo #
+--echo # MDEV-26606: ROW_NUMBER property value isn't passed from inside a
+--echo # stored procedure
+--echo #
+
+--echo # Test 1: Without RESIGNAL
+
+CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY);
+CREATE OR REPLACE PROCEDURE sp(a INT) INSERT INTO t1 VALUES (2),(a);
+SET @num=null, @msg=null;
+
+INSERT INTO t1 VALUES(1);
+
+--error ER_DUP_ENTRY
+CALL sp(1);
+GET DIAGNOSTICS CONDITION 1 @num = ROW_NUMBER, @msg = MESSAGE_TEXT;
+SELECT @num, @msg;
+
+DROP PROCEDURE sp;
+DROP TABLE t1;
+
+--echo # Test 2: With RESIGNAL
+
+CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY);
+
+DELIMITER |;
+CREATE OR REPLACE PROCEDURE sp(a INT)
+BEGIN
+ DECLARE n INT;
+ DECLARE m VARCHAR(255);
+ DECLARE EXIT HANDLER FOR 1062
+ BEGIN
+ GET DIAGNOSTICS CONDITION 1 n = ROW_NUMBER, m = MESSAGE_TEXT;
+ SELECT n, m;
+ RESIGNAL;
+ END;
+ INSERT INTO t1 VALUES (2), (a);
+END |
+DELIMITER ;|
+
+SET @num=null, @msg=null;
+INSERT INTO t1 VALUES (1);
+
+--error ER_DUP_ENTRY
+CALL sp(1);
+GET DIAGNOSTICS CONDITION 1 @num = ROW_NUMBER, @msg = MESSAGE_TEXT;
+SELECT @num, @msg;
+
+DROP PROCEDURE sp;
+DROP TABLE t1;
+
+--echo # Checking more errors
+
+CREATE TABLE t1 (val1 TINYINT);
+
+CREATE PROCEDURE sp(a INT) INSERT INTO t1 VALUES (2),(a);
+
+INSERT INTO t1 VALUES(1);
+
+CALL sp(100000);
+GET DIAGNOSTICS CONDITION 1 @var1= ROW_NUMBER;
+SELECT @var1;
+
+DROP TABLE t1;
+DROP PROCEDURE sp;
+
+--echo #
+--echo # MDEV-26684: Unexpected ROW_NUMBER in a condition raised by a diagnostics statement
+--echo #
+
+CREATE TABLE t1 (a INT);
+
+INSERT INTO t1 VALUES (1),(2);
+
+GET DIAGNOSTICS CONDITION 5 @msg = MESSAGE_TEXT;
+SHOW WARNINGS;
+
+GET DIAGNOSTICS CONDITION 1 @ind = ROW_NUMBER, @msg = MESSAGE_TEXT;
+SELECT @ind, @msg;
+
+INSERT INTO t1 VALUES (3),(4);
+
+GET DIAGNOSTICS CONDITION 1 @ind = ROW_NUMBER, @msg = MESSAGE_TEXT;
+SELECT @ind, @msg;
+
+GET DIAGNOSTICS CONDITION 5 @ind = ROW_NUMBER, @msg = MESSAGE_TEXT;
+SELECT @ind, @msg;
+
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26681: ROW_NUMBER is not available within compound statement blocks
+--echo #
+
+CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY, a CHAR(3));
+INSERT IGNORE INTO t1 VALUES (1,'foo'),(1,'bar'),(2,'foobar');
+
+DELIMITER |;
+
+BEGIN NOT ATOMIC
+ DECLARE i INT DEFAULT 0;
+ DECLARE rnum INT DEFAULT -1;
+ DECLARE msg VARCHAR(1024) DEFAULT '';
+ DECLARE err INT DEFAULT -1;
+ WHILE i < @@warning_count
+ DO
+ SET i = i + 1;
+ GET DIAGNOSTICS CONDITION i rnum = ROW_NUMBER, msg = MESSAGE_TEXT, err = MYSQL_ERRNO;
+ SELECT i, rnum, msg, err;
+ END WHILE;
+END |
+
+DELIMITER ;|
+
+GET DIAGNOSTICS CONDITION 1 @rnum = ROW_NUMBER, @msg = MESSAGE_TEXT, @err = MYSQL_ERRNO;
+select @rnum, @msg, @err;
+
+GET DIAGNOSTICS CONDITION 2 @rnum = ROW_NUMBER, @msg = MESSAGE_TEXT, @err = MYSQL_ERRNO;
+SELECT @rnum, @msg, @err;
+
+DROP TABLE t1;
+
+--echo #
+--echo # ROW_NUMBER differs from the number in the error message upon
+--echo # ER_WARN_DATA_OUT_OF_RANGE
+--echo #
+CREATE TABLE t (a INT);
+INSERT INTO t VALUES (1),(2);
+SELECT CAST(a AS DECIMAL(2,2)) AS f FROM t;
+
+GET DIAGNOSTICS CONDITION 2 @n= ROW_NUMBER, @m = MESSAGE_TEXT;
+SELECT @n, @m;
+
+DROP TABLE t;
+
+--echo #
+--echo # MDEV-26832: ROW_NUMBER in SIGNAL/RESIGNAL causes a syntax error
+--echo #
+
+--echo # using signal
+
+DELIMITER |;
+CREATE PROCEDURE signal_syntax()
+BEGIN
+ DECLARE errno INT DEFAULT 0;
+ DECLARE msg TEXT DEFAULT "foo";
+ DECLARE row_num INT DEFAULT 0;
+ DECLARE cond CONDITION FOR SQLSTATE "01234";
+ DECLARE CONTINUE HANDLER for 1012
+ BEGIN
+ GET DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO, msg = MESSAGE_TEXT, row_num= ROW_NUMBER;
+ END;
+
+ SIGNAL cond SET MESSAGE_TEXT = "Signal message", MYSQL_ERRNO = 1012, ROW_NUMBER= 5;
+
+ SELECT errno, msg, row_num;
+END|
+DELIMITER ;|
+
+CALL signal_syntax();
+
+DROP PROCEDURE signal_syntax;
+
+--echo # using resignal
+
+DELIMITER |;
+
+CREATE PROCEDURE resignal_syntax()
+BEGIN
+ DECLARE CONTINUE HANDLER
+ FOR 1146
+ BEGIN
+ RESIGNAL SET
+ MESSAGE_TEXT = '`temptab` does not exist', ROW_NUMBER= 105;
+ END;
+ SELECT `c` FROM `temptab`;
+END|
+
+DELIMITER ;|
+
+--error ER_NO_SUCH_TABLE
+CALL resignal_syntax();
+
+GET DIAGNOSTICS CONDITION 1 @row_num= ROW_NUMBER;
+SELECT @row_num;
+
+DROP PROCEDURE resignal_syntax;
+
+--echo #
+--echo # MDEV-26842: ROW_NUMBER is not set and differs from the message upon
+--echo # WARN_DATA_TRUNCATED produced by inplace ALTER
+--echo #
+
+CREATE TABLE t1 (a VARCHAR(64)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('foo'),(null);
+
+--error WARN_DATA_TRUNCATED
+ALTER TABLE t1 ADD PRIMARY KEY(a), ALGORITHM=INPLACE;
+
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER, @m= MESSAGE_TEXT;
+SELECT @n, @m;
+
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26841: ROW_NUMBER is not set and differs from the message upon
+--echo # ER_WRONG_VALUE_COUNT_ON_ROW for the 1st row
+--echo #
+
+CREATE TABLE t1 (a INT);
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1 VALUES (1,2),(3);
+
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER, @m= MESSAGE_TEXT;
+SELECT @n, @m;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1(a) VALUES(1,2), (3);
+
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER, @m= MESSAGE_TEXT;
+SELECT @n, @m;
+
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26830: Wrong ROW_NUMBER in diagnostics upon INSERT IGNORE with
+--echo # CHECK violation
+--echo #
+
+CREATE TABLE t1 (a INT, CHECK(a>0));
+INSERT IGNORE INTO t1 VALUES (1),(0),(2),(0);
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+GET DIAGNOSTICS CONDITION 2 @n= ROW_NUMBER;
+SELECT @n;
+
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26844: DELETE returns ROW_NUMBER=1 for every row upon
+--echo # ER_TRUNCATED_WRONG_VALUE
+--echo #
+
+--echo # without ORDER BY
+
+CREATE TABLE t (a VARCHAR(8));
+
+INSERT INTO t VALUES ('val1'),('val2'),('100'),('val4');
+SELECT * FROM t;
+
+DELETE FROM t WHERE a = 100;
+SHOW WARNINGS;
+
+GET DIAGNOSTICS CONDITION 3 @n = ROW_NUMBER;
+SELECT @n;
+
+DROP TABLE t;
+
+--echo #
+--echo # MDEV-26695: Number of an invalid row is not calculated for table value constructor
+--echo #
+
+CREATE TABLE t1 (a CHAR(1)) VALUES ('a'),('b'),('foo');
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+CREATE TABLE t2 (a CHAR(1)) VALUES ('a'),('b') UNION VALUES ('foo');
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+
+DROP TABLE t1, t2;
+
+--echo # Checking that CREATE ... SELECT works
+
+CREATE TABLE t1 (val1 CHAR(5));
+INSERT INTO t1 VALUES ('A'),('B'),('C'),('DEF');
+CREATE TABLE t2 (val2 CHAR(1)) SELECT val1 as val2 FROM t1;
+GET DIAGNOSTICS CONDITION 1 @n= ROW_NUMBER;
+SELECT @n;
+SELECT * FROM t2;
+
+DROP TABLE t1,t2;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
+
diff --git a/mysql-test/main/gis.result b/mysql-test/main/gis.result
index 61deb087424..5b323bb598c 100644
--- a/mysql-test/main/gis.result
+++ b/mysql-test/main/gis.result
@@ -688,9 +688,9 @@ object_id geometrytype(geo) ISSIMPLE(GEO) ASTEXT(centroid(geo))
drop table t1;
create table t1 (fl geometry not null);
insert into t1 values (1);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 values (1.11);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'decimal' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 values ("qwerty");
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
insert into t1 values (pointfromtext('point(1,1)'));
diff --git a/mysql-test/main/gis.test b/mysql-test/main/gis.test
index fcb221bf975..17151b1bc86 100644
--- a/mysql-test/main/gis.test
+++ b/mysql-test/main/gis.test
@@ -369,9 +369,9 @@ t1 where object_id=85984;
drop table t1;
create table t1 (fl geometry not null);
---error 1416
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
insert into t1 values (1);
---error 1416
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
insert into t1 values (1.11);
--error 1416
insert into t1 values ("qwerty");
diff --git a/mysql-test/main/grant_not_windows.result b/mysql-test/main/grant_utf8_cli.result
index fedfaf984b2..fedfaf984b2 100644
--- a/mysql-test/main/grant_not_windows.result
+++ b/mysql-test/main/grant_utf8_cli.result
diff --git a/mysql-test/main/grant_not_windows.test b/mysql-test/main/grant_utf8_cli.test
index 55b09232edc..bc811d5298e 100644
--- a/mysql-test/main/grant_not_windows.test
+++ b/mysql-test/main/grant_utf8_cli.test
@@ -1,6 +1,5 @@
- # UTF8 parameters to mysql client do not work on Windows
---source include/not_windows.inc
--source include/not_embedded.inc
+--source include/check_utf8_cli.inc
#
# Bug#21432 Database/Table name limited to 64 bytes, not chars, problems with multi-byte
diff --git a/mysql-test/main/group_min_max.result b/mysql-test/main/group_min_max.result
index af9f2767a6c..2b8b10b29b9 100644
--- a/mysql-test/main/group_min_max.result
+++ b/mysql-test/main/group_min_max.result
@@ -2080,19 +2080,19 @@ id select_type table type possible_keys key key_len ref rows Extra
explain extended select a1,a2,min(b),max(b) from t1
where (a1 = 'b' or a1 = 'd' or a1 = 'a' or a1 = 'c') and (a2 > 'a') and (c > 'a111') group by a1,a2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 range idx_t1_0,idx_t1_1,idx_t1_2 idx_t1_1 130 NULL 276 97.06 Using where; Using index
+1 SIMPLE t1 range idx_t1_0,idx_t1_1,idx_t1_2 idx_t1_1 130 NULL 276 96.30 Using where; Using index
Warnings:
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2`,min(`test`.`t1`.`b`) AS `min(b)`,max(`test`.`t1`.`b`) AS `max(b)` from `test`.`t1` where (`test`.`t1`.`a1` = 'b' or `test`.`t1`.`a1` = 'd' or `test`.`t1`.`a1` = 'a' or `test`.`t1`.`a1` = 'c') and `test`.`t1`.`a2` > 'a' and `test`.`t1`.`c` > 'a111' group by `test`.`t1`.`a1`,`test`.`t1`.`a2`
explain extended select a1,a2,b,min(c),max(c) from t1
where (a1 = 'b' or a1 = 'd' or a1 = 'a' or a1 = 'c') and (a2 > 'a') and (d > 'xy2') group by a1,a2,b;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL idx_t1_0,idx_t1_1,idx_t1_2 NULL NULL NULL 512 39.55 Using where; Using temporary; Using filesort
+1 SIMPLE t1 ALL idx_t1_0,idx_t1_1,idx_t1_2 NULL NULL NULL 512 26.37 Using where; Using temporary; Using filesort
Warnings:
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2`,`test`.`t1`.`b` AS `b`,min(`test`.`t1`.`c`) AS `min(c)`,max(`test`.`t1`.`c`) AS `max(c)` from `test`.`t1` where (`test`.`t1`.`a1` = 'b' or `test`.`t1`.`a1` = 'd' or `test`.`t1`.`a1` = 'a' or `test`.`t1`.`a1` = 'c') and `test`.`t1`.`a2` > 'a' and `test`.`t1`.`d` > 'xy2' group by `test`.`t1`.`a1`,`test`.`t1`.`a2`,`test`.`t1`.`b`
explain extended select a1,a2,b,c from t1
where (a1 = 'b' or a1 = 'd' or a1 = 'a' or a1 = 'c') and (a2 > 'a') and (d > 'xy2') group by a1,a2,b,c;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL idx_t1_0,idx_t1_1,idx_t1_2 NULL NULL NULL 512 39.55 Using where; Using temporary; Using filesort
+1 SIMPLE t1 ALL idx_t1_0,idx_t1_1,idx_t1_2 NULL NULL NULL 512 26.37 Using where; Using temporary; Using filesort
Warnings:
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t1` where (`test`.`t1`.`a1` = 'b' or `test`.`t1`.`a1` = 'd' or `test`.`t1`.`a1` = 'a' or `test`.`t1`.`a1` = 'c') and `test`.`t1`.`a2` > 'a' and `test`.`t1`.`d` > 'xy2' group by `test`.`t1`.`a1`,`test`.`t1`.`a2`,`test`.`t1`.`b`,`test`.`t1`.`c`
explain select a1,a2,b,max(c),min(c) from t2 where (a2 = 'a') and (b = 'b') or (b < 'b') group by a1;
@@ -2100,7 +2100,7 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 index NULL idx_t2_1 163 NULL 548 Using where; Using index
explain extended select a1,a2,b from t1 where (a1 = 'b' or a1 = 'd' or a1 = 'a' or a1 = 'c') and (a2 > 'a') and (c > 'a111') group by a1,a2,b;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 range idx_t1_0,idx_t1_1,idx_t1_2 idx_t1_1 130 NULL 276 97.06 Using where; Using index
+1 SIMPLE t1 range idx_t1_0,idx_t1_1,idx_t1_2 idx_t1_1 130 NULL 276 96.30 Using where; Using index
Warnings:
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2`,`test`.`t1`.`b` AS `b` from `test`.`t1` where (`test`.`t1`.`a1` = 'b' or `test`.`t1`.`a1` = 'd' or `test`.`t1`.`a1` = 'a' or `test`.`t1`.`a1` = 'c') and `test`.`t1`.`a2` > 'a' and `test`.`t1`.`c` > 'a111' group by `test`.`t1`.`a1`,`test`.`t1`.`a2`,`test`.`t1`.`b`
explain select a1,a2,min(b),c from t2 where (a2 = 'a') and (c = 'a111') group by a1;
diff --git a/mysql-test/main/handlersocket.result b/mysql-test/main/handlersocket.result
index 8ef9b289cd0..38027afc414 100644
--- a/mysql-test/main/handlersocket.result
+++ b/mysql-test/main/handlersocket.result
@@ -5,7 +5,7 @@ plugin_version 1.0
plugin_status ACTIVE
plugin_type DAEMON
plugin_library handlersocket.so
-plugin_library_version 1.14
+plugin_library_version 1.15
plugin_author higuchi dot akira at dena dot jp
plugin_description Direct access into InnoDB
plugin_license BSD
diff --git a/mysql-test/main/having_cond_pushdown.result b/mysql-test/main/having_cond_pushdown.result
index fea8f83f9a1..59388aa7ca0 100644
--- a/mysql-test/main/having_cond_pushdown.result
+++ b/mysql-test/main/having_cond_pushdown.result
@@ -37,13 +37,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 2"
+ }
+ }
+ ]
}
}
}
@@ -59,13 +63,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 2"
+ }
+ }
+ ]
}
}
}
@@ -97,13 +105,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b)
@@ -114,13 +126,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2"
+ }
+ }
+ ]
}
}
# extracted AND formula
@@ -155,13 +171,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a < 4"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a < 4"
+ }
+ }
+ ]
}
}
}
@@ -177,13 +197,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a < 4"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a < 4"
+ }
+ }
+ ]
}
}
}
@@ -222,13 +246,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 or t1.a = 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 or t1.a = 3"
+ }
+ }
+ ]
}
}
}
@@ -246,13 +274,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 or t1.a = 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 or t1.a = 3"
+ }
+ }
+ ]
}
}
}
@@ -291,13 +323,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 2 or t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 2 or t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -315,13 +351,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 2 or t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 2 or t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -357,13 +397,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -381,13 +425,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -422,13 +470,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -446,13 +498,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -484,13 +540,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.a) = 3",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 3"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b)
@@ -503,13 +563,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.a) = 3",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 3"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for SELECT t1.a,MAX(t1.b)
@@ -539,13 +603,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.b) > 12",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b)
@@ -558,13 +626,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.b) > 12",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for SELECT t1.a,MAX(t1.b)
@@ -597,13 +669,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -621,13 +697,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -664,13 +744,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -688,13 +772,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -726,13 +814,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.b) = 13 and min(t1.c) = 2",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MIN(t1.c)
@@ -745,13 +837,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.b) = 13 and min(t1.c) = 2",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2"
+ }
+ }
+ ]
}
}
# conjunctive subformula : no stored function pushdown
@@ -785,13 +881,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -809,13 +909,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -858,41 +962,51 @@ EXPLAIN
"filesort": {
"sort_key": "v1.a",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t2.x > 1 and t2.x is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.x"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t2.x > 1 and t2.x is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.x"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
}
@@ -908,41 +1022,51 @@ EXPLAIN
"filesort": {
"sort_key": "v1.a",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t2.x > 1 and t2.x is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.x"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 3,
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t2.x > 1 and t2.x is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.x"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
}
@@ -985,42 +1109,52 @@ EXPLAIN
"filesort": {
"sort_key": "v1.c",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t2.x is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.x"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c > 2",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "t1.c > 2",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t2.x is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.x"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c > 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "t1.c > 2",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
}
@@ -1036,42 +1170,52 @@ EXPLAIN
"filesort": {
"sort_key": "v1.c",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t2.x is not null"
- },
- "table": {
- "table_name": "<derived3>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.x"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "v1.c > 2",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "t1.c > 2",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t2.x is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.x"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "v1.c > 2",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "t1.c > 2",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
}
@@ -1115,39 +1259,49 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["x", "MAX(t2.y)"],
- "ref": ["test.t1.a", "test.t1.b"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t2.x < 5 and t2.x > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["x", "MAX(t2.y)"],
+ "ref": ["test.t1.a", "test.t1.b"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t2.x < 5 and t2.x > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
}
@@ -1164,39 +1318,49 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null"
- },
- "table": {
- "table_name": "<subquery3>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["x", "MAX(t2.y)"],
- "ref": ["test.t1.a", "test.t1.b"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t2.x < 5 and t2.x > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["x", "MAX(t2.y)"],
+ "ref": ["test.t1.a", "test.t1.b"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t2.x < 5 and t2.x > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
}
@@ -1238,40 +1402,50 @@ EXPLAIN
"filesort": {
"sort_key": "t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b < 14 and t1.a is not null and t1.b is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["x", "MAX(t2.y)"],
- "ref": ["test.t1.a", "test.t1.b"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(t2.y)` < 14",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t2.x < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b < 14 and t1.a is not null and t1.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["x", "MAX(t2.y)"],
+ "ref": ["test.t1.a", "test.t1.b"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(t2.y)` < 14",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t2.x < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
}
@@ -1288,40 +1462,50 @@ EXPLAIN
"filesort": {
"sort_key": "t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b < 14 and t1.a is not null and t1.b is not null"
- },
- "table": {
- "table_name": "<subquery3>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["x", "MAX(t2.y)"],
- "ref": ["test.t1.a", "test.t1.b"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "having_condition": "`MAX(t2.y)` < 14",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t2.x < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b < 14 and t1.a is not null and t1.b is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["x", "MAX(t2.y)"],
+ "ref": ["test.t1.a", "test.t1.b"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "`MAX(t2.y)` < 14",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t2.x < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
}
@@ -1358,13 +1542,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -1381,13 +1569,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -1419,13 +1611,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "t1.a = 2 and t1.c = 2",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b = 13"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b = 13"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT MAX(t1.a),t1.a,t1.b,t1.c
@@ -1438,13 +1634,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "t1.a = 2 and t1.c = 2",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b = 13"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b = 13"
+ }
+ }
+ ]
}
}
# extracted AND formula : using equalities
@@ -1477,13 +1677,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -1498,13 +1702,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -1535,13 +1743,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2 and t1.c = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2 and t1.c = 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b),t1.c
@@ -1552,13 +1764,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2 and t1.c = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2 and t1.c = 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for SELECT t1.a,MAX(t1.b),t1.c
@@ -1591,13 +1807,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and t1.a > 1 or t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and t1.a > 1 or t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -1615,13 +1835,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and t1.a > 1 or t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and t1.a > 1 or t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -1662,13 +1886,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -1684,13 +1912,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -1729,13 +1961,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and t1.a > 1 and t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and t1.a > 1 and t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -1751,13 +1987,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and t1.a > 1 and t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and t1.a > 1 and t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -1796,13 +2036,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and (t1.a > 1 or t1.a < 4) and t1.a < 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and (t1.a > 1 or t1.a < 4) and t1.a < 2"
+ }
+ }
+ ]
}
}
}
@@ -1820,13 +2064,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and (t1.a > 1 or t1.a < 4) and t1.a < 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and (t1.a > 1 or t1.a < 4) and t1.a < 2"
+ }
+ }
+ ]
}
}
}
@@ -1868,13 +2116,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and (t1.a > 1 or t1.a < 4)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and (t1.a > 1 or t1.a < 4)"
+ }
+ }
+ ]
}
}
}
@@ -1892,13 +2144,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = t1.a and (t1.a > 1 or t1.a < 4)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = t1.a and (t1.a > 1 or t1.a < 4)"
+ }
+ }
+ ]
}
}
}
@@ -1956,12 +2212,16 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1978,12 +2238,16 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -2020,13 +2284,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a = 1 or t1.b > 10) and t1.b < 14"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a = 1 or t1.b > 10) and t1.b < 14"
+ }
+ }
+ ]
}
}
}
@@ -2042,13 +2310,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a = 1 or t1.b > 10) and t1.b < 14"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a = 1 or t1.b > 10) and t1.b < 14"
+ }
+ }
+ ]
}
}
}
@@ -2086,13 +2358,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a = 1 or t1.b > 10) and (t1.b < 14 or t1.b > 15)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a = 1 or t1.b > 10) and (t1.b < 14 or t1.b > 15)"
+ }
+ }
+ ]
}
}
}
@@ -2108,13 +2384,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a = 1 or t1.b > 10) and (t1.b < 14 or t1.b > 15)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a = 1 or t1.b > 10) and (t1.b < 14 or t1.b > 15)"
+ }
+ }
+ ]
}
}
}
@@ -2151,13 +2431,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a = 1 or t1.b > 10) and (t1.b < 14 or t1.a = 2 and t1.b > 15)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a = 1 or t1.b > 10) and (t1.b < 14 or t1.a = 2 and t1.b > 15)"
+ }
+ }
+ ]
}
}
}
@@ -2173,13 +2457,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a = 1 or t1.b > 10) and (t1.b < 14 or t1.a = 2 and t1.b > 15)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a = 1 or t1.b > 10) and (t1.b < 14 or t1.a = 2 and t1.b > 15)"
+ }
+ }
+ ]
}
}
}
@@ -2218,13 +2506,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a < 2 or t1.b = 13 and t1.a > 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a < 2 or t1.b = 13 and t1.a > 2"
+ }
+ }
+ ]
}
}
}
@@ -2240,13 +2532,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a < 2 or t1.b = 13 and t1.a > 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a < 2 or t1.b = 13 and t1.a > 2"
+ }
+ }
+ ]
}
}
}
@@ -2282,13 +2578,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b = 14 and t1.a < 2 or t1.b = 13 and t1.a > 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b = 14 and t1.a < 2 or t1.b = 13 and t1.a > 2"
+ }
+ }
+ ]
}
}
}
@@ -2304,13 +2604,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b = 14 and t1.a < 2 or t1.b = 13 and t1.a > 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b = 14 and t1.a < 2 or t1.b = 13 and t1.a > 2"
+ }
+ }
+ ]
}
}
}
@@ -2348,13 +2652,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b = 14 and t1.a < 2 or t1.a > 2 and (t1.b = 13 or t1.b = 14)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b = 14 and t1.a < 2 or t1.a > 2 and (t1.b = 13 or t1.b = 14)"
+ }
+ }
+ ]
}
}
}
@@ -2370,13 +2678,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b = 14 and t1.a < 2 or t1.a > 2 and (t1.b = 13 or t1.b = 14)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b = 14 and t1.a < 2 or t1.a > 2 and (t1.b = 13 or t1.b = 14)"
+ }
+ }
+ ]
}
}
}
@@ -2411,13 +2723,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a < 2 or t1.a = 1 or t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a < 2 or t1.a = 1 or t1.a = 2"
+ }
+ }
+ ]
}
}
}
@@ -2435,13 +2751,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a < 2 or t1.a = 1 or t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a < 2 or t1.a = 1 or t1.a = 2"
+ }
+ }
+ ]
}
}
}
@@ -2478,13 +2798,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2 or t1.a = 1 or t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2 or t1.a = 1 or t1.a = 2"
+ }
+ }
+ ]
}
}
}
@@ -2502,13 +2826,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 2 or t1.a = 1 or t1.a = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 2 or t1.a = 1 or t1.a = 2"
+ }
+ }
+ ]
}
}
}
@@ -2541,13 +2869,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.c) = 3",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,t1.b,MAX(t1.c)
@@ -2560,13 +2892,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.c) = 3",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
}
}
# conjunctive subformula : equalities pushdown
@@ -2597,13 +2933,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.b = 14)",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 3"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,t1.b,MAX(t1.c)
@@ -2616,13 +2956,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.b) = 14",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 3"
+ }
+ }
+ ]
}
}
# conjunctive subformula : multiple equality consists of
@@ -2652,13 +2996,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.b = 14)",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 1"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,t1.b,MAX(t1.c)
@@ -2671,13 +3019,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "max(t1.b) = 14",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 1"
+ }
+ }
+ ]
}
}
#
@@ -2719,13 +3071,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b > 2 and t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b > 2 and t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -2741,13 +3097,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b > 2 and t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b > 2 and t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -2783,13 +3143,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 3 and t1.b > 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 3 and t1.b > 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,t1.b,MAX(t1.c)
@@ -2800,13 +3164,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 3 and t1.b > 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 3 and t1.b > 2"
+ }
+ }
+ ]
}
}
# inequality : equality in WHERE
@@ -2843,13 +3211,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b = 14 and t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b = 14 and t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -2865,13 +3237,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b = 14 and t1.a < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b = 14 and t1.a < 3"
+ }
+ }
+ ]
}
}
}
@@ -2907,13 +3283,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.b = 14"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.b = 14"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,t1.b,MAX(t1.c)
@@ -2924,13 +3304,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.b = 14 and t1.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.b = 14 and t1.a = 1"
+ }
+ }
+ ]
}
}
# equality : equality in WHERE, impossible WHERE
@@ -3011,13 +3395,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 1"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b),t1.c
@@ -3028,13 +3416,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c = 1 and t1.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c = 1 and t1.a = 1"
+ }
+ }
+ ]
}
}
# inequality : AND formula in WHERE
@@ -3073,13 +3465,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c > 0 and t1.c < 3 and t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c > 0 and t1.c < 3 and t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -3095,13 +3491,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.c > 0 and t1.c < 3 and t1.a > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.c > 0 and t1.c < 3 and t1.a > 1"
+ }
+ }
+ ]
}
}
}
@@ -3137,13 +3537,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c > 0 and t1.c < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c > 0 and t1.c < 3"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b),t1.c
@@ -3154,13 +3558,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c > 0 and t1.c < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c > 0 and t1.c < 3"
+ }
+ }
+ ]
}
}
# equality : AND formula in WHERE, impossible WHERE
@@ -3195,13 +3603,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "1",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c < 3"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b),t1.c
@@ -3212,13 +3624,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c < 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c < 3"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for SELECT t1.a,MAX(t1.b)
@@ -3297,13 +3713,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.b = 2 and t3.d = 1 and t3.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.b = 2 and t3.d = 1 and t3.a = 1"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t3.a,t3.b,MAX(t3.c),t3.d
@@ -3314,13 +3734,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.b = 2 and t3.d = 1 and t3.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.b = 2 and t3.d = 1 and t3.a = 1"
+ }
+ }
+ ]
}
}
# inequality : OR formula in WHERE
@@ -3357,13 +3781,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 2"
+ }
+ }
+ ]
}
}
}
@@ -3379,13 +3807,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 2"
+ }
+ }
+ ]
}
}
}
@@ -3472,13 +3904,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a < 4 and t1.a > 0"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a < 4 and t1.a > 0"
+ }
+ }
+ ]
}
}
}
@@ -3494,13 +3930,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a < 4 and t1.a > 0"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a < 4 and t1.a > 0"
+ }
+ }
+ ]
}
}
}
@@ -3537,13 +3977,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "1 and 1",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b),t1.c
@@ -3554,13 +3998,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
}
}
# OR formula : inequality in WHERE
@@ -3599,13 +4047,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and (t1.a < 4 or t1.a > 0)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and (t1.a < 4 or t1.a > 0)"
+ }
+ }
+ ]
}
}
}
@@ -3621,13 +4073,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and (t1.a < 4 or t1.a > 0)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and (t1.a < 4 or t1.a > 0)"
+ }
+ }
+ ]
}
}
}
@@ -3664,13 +4120,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "1",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b),t1.c
@@ -3681,13 +4141,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1"
+ }
+ }
+ ]
}
}
# AND formula : AND formula in WHERE
@@ -3727,13 +4191,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.c < 3 and t1.a < 4"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.c < 3 and t1.a < 4"
+ }
+ }
+ ]
}
}
}
@@ -3752,13 +4220,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.c < 3 and t1.a < 4"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.c < 3 and t1.a < 4"
+ }
+ }
+ ]
}
}
}
@@ -3795,13 +4267,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.c",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c < 3 and t1.c > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c < 3 and t1.c > 1"
+ }
+ }
+ ]
}
}
}
@@ -3818,13 +4294,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.c",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c < 3 and t1.c > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c < 3 and t1.c > 1"
+ }
+ }
+ ]
}
}
}
@@ -3860,13 +4340,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "1 and 1",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 3"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b),t1.c
@@ -3878,13 +4362,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 3"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 3"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for SELECT t3.a,t3.b,MAX(t3.c),t3.d
@@ -3918,13 +4406,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "t3.d > 0",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.a = 1 and t3.d = 1 and t3.b = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.a = 1 and t3.d = 1 and t3.b = 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t3.a,t3.b,MAX(t3.c),t3.d
@@ -3938,13 +4430,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"having_condition": "t3.d > 0",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.a = 1 and t3.d = 1 and t3.b = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.a = 1 and t3.d = 1 and t3.b = 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for SELECT t3.a,t3.b,MAX(t3.c),t3.d
@@ -3978,13 +4474,17 @@ EXPLAIN
"query_block": {
"select_id": 1,
"const_condition": "1",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.a = 1 and t3.d = 1 and t3.b = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.a = 1 and t3.d = 1 and t3.b = 2"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t3.a,t3.b,MAX(t3.c),t3.d
@@ -3996,13 +4496,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.a = 1 and t3.d = 1 and t3.b = 2"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.a = 1 and t3.d = 1 and t3.b = 2"
+ }
+ }
+ ]
}
}
# AND formula : OR formula in WHERE
@@ -4042,13 +4546,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 4"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 4"
+ }
+ }
+ ]
}
}
}
@@ -4067,13 +4575,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 4"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 4"
+ }
+ }
+ ]
}
}
}
@@ -4115,13 +4627,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.c",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 4 and t1.c > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 4 and t1.c > 1"
+ }
+ }
+ ]
}
}
}
@@ -4138,13 +4654,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.c",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 4 and t1.c > 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a > 1 or t1.c < 3) and t1.a < 4 and t1.c > 1"
+ }
+ }
+ ]
}
}
}
@@ -4186,13 +4706,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.c",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a = 1 or t1.a = 3) and (t1.a = 4 or t1.c > 1)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a = 1 or t1.a = 3) and (t1.a = 4 or t1.c > 1)"
+ }
+ }
+ ]
}
}
}
@@ -4209,13 +4733,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.c",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a = 1 or t1.a = 3) and (t1.a = 4 or t1.c > 1)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a = 1 or t1.a = 3) and (t1.a = 4 or t1.c > 1)"
+ }
+ }
+ ]
}
}
}
@@ -4251,13 +4779,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 1"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b),t1.c
@@ -4268,13 +4800,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 1"
+ }
+ }
+ ]
}
}
# OR formula : pushdown through equality
@@ -4308,13 +4844,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 1"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='condition_pushdown_from_having=off' for explain format=json SELECT t1.a,MAX(t1.b),t1.c
@@ -4326,13 +4866,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.c = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.c = 1"
+ }
+ }
+ ]
}
}
# OR formula : pushdown through equality, impossible WHERE
@@ -4510,13 +5054,17 @@ EXPLAIN
"filesort": {
"sort_key": "t3.a",
"temporary_table": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.d = t3.a and t3.a > 1 and (t3.c = 3 or t3.c < 2) and (t3.a = 1 or t3.a > 1)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.d = t3.a and t3.a > 1 and (t3.c = 3 or t3.c < 2) and (t3.a = 1 or t3.a > 1)"
+ }
+ }
+ ]
}
}
}
@@ -4533,13 +5081,17 @@ EXPLAIN
"filesort": {
"sort_key": "t3.a",
"temporary_table": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.d = t3.a and t3.a > 1 and (t3.c = 3 or t3.c < 2) and (t3.a = 1 or t3.a > 1)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.d = t3.a and t3.a > 1 and (t3.c = 3 or t3.c < 2) and (t3.a = 1 or t3.a > 1)"
+ }
+ }
+ ]
}
}
}
@@ -4576,13 +5128,17 @@ EXPLAIN
"filesort": {
"sort_key": "t3.a",
"temporary_table": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.d = t3.a and t3.a > 1 and (t3.c = 3 or t3.c < 2) and (t3.c = t3.a and t3.c < 15 or t3.a > 1)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.d = t3.a and t3.a > 1 and (t3.c = 3 or t3.c < 2) and (t3.c = t3.a and t3.c < 15 or t3.a > 1)"
+ }
+ }
+ ]
}
}
}
@@ -4599,13 +5155,17 @@ EXPLAIN
"filesort": {
"sort_key": "t3.a",
"temporary_table": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t3.d = t3.a and t3.a > 1 and (t3.c = 3 or t3.c < 2) and (t3.c = t3.a and t3.a < 15 or t3.a > 1)"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t3.d = t3.a and t3.a > 1 and (t3.c = 3 or t3.c < 2) and (t3.c = t3.a and t3.a < 15 or t3.a > 1)"
+ }
+ }
+ ]
}
}
}
@@ -4683,13 +5243,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.d1",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t1.d1 between <cache>(inet_aton('1978-04-27')) and <cache>('2018-08-26')"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t1.d1 between <cache>(inet_aton('1978-04-27')) and <cache>('2018-08-26')"
+ }
+ }
+ ]
}
}
}
@@ -4721,13 +5285,17 @@ EXPLAIN
"filesort": {
"sort_key": "t1.d1",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "t1.d1 not between <cache>(0) and <cache>(exp(0))"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "t1.d1 not between <cache>(0) and <cache>(exp(0))"
+ }
+ }
+ ]
}
}
}
@@ -4792,23 +5360,31 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a = 8 or t1.a = (subquery#2)"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a = 8 or t1.a = (subquery#2)"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -4828,23 +5404,31 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a, t1.b",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "(t1.a = 8 or t1.a = (subquery#2)) and t1.b < 20"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "(t1.a = 8 or t1.a = (subquery#2)) and t1.b < 20"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -4865,23 +5449,31 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a = 8 or t1.a = (subquery#2)"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a = 8 or t1.a = (subquery#2)"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -4898,23 +5490,31 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100,
- "attached_condition": "t1.a = (subquery#2)"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100,
+ "attached_condition": "t1.a = (subquery#2)"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
diff --git a/mysql-test/main/in_subq_cond_pushdown.result b/mysql-test/main/in_subq_cond_pushdown.result
index eef320d2d04..f114fc6824e 100644
--- a/mysql-test/main/in_subq_cond_pushdown.result
+++ b/mysql-test/main/in_subq_cond_pushdown.result
@@ -51,40 +51,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.c < 25 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(t2.g)` < 25",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.c < 25 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(t2.g)` < 25",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# extracted AND formula : pushing into HAVING
@@ -140,40 +150,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.c > 55 and t1.b < 4 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(t2.g)` > 55 and t2.f < 4",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.c > 55 and t1.b < 4 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(t2.g)` > 55 and t2.f < 4",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# extracted OR formula : pushing into HAVING
@@ -231,40 +251,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "(t1.c > 60 or t1.c < 25) and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(t2.g)` > 60 or `MAX(t2.g)` < 25",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "(t1.c > 60 or t1.c < 25) and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(t2.g)` > 60 or `MAX(t2.g)` < 25",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# extracted AND-OR formula : pushing into HAVING
@@ -320,40 +350,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "(t1.c > 60 or t1.c < 25) and t1.b > 2 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "(`MAX(t2.g)` > 60 or `MAX(t2.g)` < 25) and t2.f > 2",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "(t1.c > 60 or t1.c < 25) and t1.b > 2 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "(`MAX(t2.g)` > 60 or `MAX(t2.g)` < 25) and t2.f > 2",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into HAVING
@@ -411,40 +451,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "(t1.a < 2 or t1.d > 3) and t1.b > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "t2.f > 1",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "(t1.a < 2 or t1.d > 3) and t1.b > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "t2.f > 1",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# using view IN subquery defINition : pushing into HAVING
@@ -500,40 +550,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.c > 20 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["v1_x", "MAX(v1_y)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(v1_y)` > 20",
- "temporary_table": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 8,
- "filtered": 100,
- "attached_condition": "t3.x > 1 and t3.x <= 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.c > 20 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["v1_x", "MAX(v1_y)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(v1_y)` > 20",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 8,
+ "filtered": 100,
+ "attached_condition": "t3.x > 1 and t3.x <= 3"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# using equality : pushing into WHERE
@@ -590,52 +650,64 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 8,
- "filtered": 100,
- "attached_condition": "t3.y > 20 and t3.x <= 3 and t3.y is not null"
- },
- "block-nl-join": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 8,
+ "filtered": 100,
+ "attached_condition": "t3.y > 20 and t3.x <= 3 and t3.y is not null"
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "attached_condition": "t1.c = t3.y and t1.a is not null"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "attached_condition": "t1.c = t3.y and t1.a is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t3.y"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(t2.g)` > 20",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t3.y"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(t2.g)` > 20",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE
@@ -693,39 +765,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a < 2 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e < 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a < 2 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e < 2"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# extracted AND formula : pushing into WHERE
@@ -783,39 +865,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a > 2 and t1.a < 5 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e > 2 and t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a > 2 and t1.a < 5 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e > 2 and t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# extracted OR formula : pushing into WHERE
@@ -875,39 +967,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "(t1.a < 2 or t1.a >= 4) and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e >= 4)"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "(t1.a < 2 or t1.a >= 4) and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e >= 4)"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# extracted AND-OR formula : pushing into WHERE
@@ -963,39 +1065,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "(t1.a < 2 or t1.a = 5) and t1.b > 3 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e = 5) and t2.f > 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "(t1.a < 2 or t1.a = 5) and t1.b > 3 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e = 5) and t2.f > 3"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# extracted AND-OR formula : pushing into WHERE
@@ -1051,39 +1163,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "(t1.a < 2 or t1.a = 5) and t1.b > 3 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e = 5) and t2.f > 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "(t1.a < 2 or t1.a = 5) and t1.b > 3 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e = 5) and t2.f > 3"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE
@@ -1139,39 +1261,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "(t1.b < 3 or t1.d > 2) and t1.a < 2 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e < 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "(t1.b < 3 or t1.d > 2) and t1.a < 2 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e < 2"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# using equalities : pushing into WHERE
@@ -1227,37 +1359,47 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a = 1 and t1.d = 1 and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["const", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e = 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a = 1 and t1.d = 1 and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["const", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e = 1"
+ }
+ }
+ ]
+ }
}
}
}
- }
+ ]
}
}
# using equality : pushing into WHERE
@@ -1313,39 +1455,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.d = t1.a and t1.a > 1 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.d = t1.a and t1.a > 1 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# using view IN subquery definition : pushing into WHERE
@@ -1399,39 +1551,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a < 3 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["v1_x", "MAX(v1_y)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 8,
- "filtered": 100,
- "attached_condition": "t3.x > 1 and t3.x <= 3 and t3.x < 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a < 3 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["v1_x", "MAX(v1_y)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 8,
+ "filtered": 100,
+ "attached_condition": "t3.x > 1 and t3.x <= 3 and t3.x < 3"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# using equality : pushing into WHERE
@@ -1490,51 +1652,63 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 8,
- "filtered": 100,
- "attached_condition": "t3.x < 2 and t3.y > 30 and t3.x <= 3 and t3.x is not null"
- },
- "block-nl-join": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 8,
+ "filtered": 100,
+ "attached_condition": "t3.x < 2 and t3.y > 30 and t3.x <= 3 and t3.x is not null"
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "119",
+ "join_type": "BNL",
+ "attached_condition": "t1.a = t3.x and t1.c is not null"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "119",
- "join_type": "BNL",
- "attached_condition": "t1.a = t3.x and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t3.x", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e <= 3"
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t3.x", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e <= 3"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE
@@ -1591,40 +1765,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "(t1.b < 3 or t1.b = 4) and t1.a < 3 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "t2.f < 3 or t2.f = 4",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e < 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "(t1.b < 3 or t1.b = 4) and t1.a < 3 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "t2.f < 3 or t2.f = 4",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e < 3"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using addition : pushing into HAVING
@@ -1680,40 +1864,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a + t1.c > 41 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "t2.e + `MAX(t2.g)` > 41",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a + t1.c > 41 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "t2.e + `MAX(t2.g)` > 41",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using substitution : pushing into HAVING
@@ -1771,40 +1965,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.c - t1.a < 35 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(t2.g)` - t2.e < 35",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.c - t1.a < 35 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(t2.g)` - t2.e < 35",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using multiplication : pushing into HAVING
@@ -1860,40 +2064,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.c * t1.a > 100 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(t2.g)` * t2.e > 100",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.c * t1.a > 100 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(t2.g)` * t2.e > 100",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using division : pushing into HAVING
@@ -1953,40 +2167,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.c / t1.a > 30 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(t2.g)` / t2.e > 30",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.c / t1.a > 30 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(t2.g)` / t2.e > 30",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using BETWEEN : pushing into HAVING
@@ -2042,40 +2266,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.c between 50 and 100 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "`MAX(t2.g)` between 50 and 100",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.c between 50 and 100 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "`MAX(t2.g)` between 50 and 100",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using addition : pushing into WHERE
@@ -2131,39 +2365,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a + t1.b > 5 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e + t2.f > 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a + t1.b > 5 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e + t2.f > 5"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using substitution : pushing into WHERE
@@ -2219,39 +2463,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a - t1.b > 0 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e - t2.f > 0"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a - t1.b > 0 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e - t2.f > 0"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using multiplication : pushing into WHERE
@@ -2307,39 +2561,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a * t1.b > 6 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e * t2.f > 6"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a * t1.b > 6 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e * t2.f > 6"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using division : pushing into WHERE
@@ -2397,39 +2661,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.b / t1.a > 2 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.f / t2.e > 2"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.b / t1.a > 2 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.f / t2.e > 2"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula using BETWEEN : pushing into WHERE
@@ -2491,39 +2765,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a between 1 and 3 and t1.a is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["e", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e between 1 and 3"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a between 1 and 3 and t1.a is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["e", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e between 1 and 3"
+ }
+ }
+ ]
+ }
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into HAVING of the IN subquery
@@ -2583,58 +2867,72 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.c > 3 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "MAX(v2.f)", "max_g"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "v2.max_g > 3",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "v2.e < 5",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_g > 25",
- "filesort": {
- "sort_key": "t2.e",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.c > 3 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "MAX(v2.f)", "max_g"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "v2.max_g > 3",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "v2.e < 5",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_g > 25",
+ "filesort": {
+ "sort_key": "t2.e",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE of the IN subquery
@@ -2693,57 +2991,71 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "MAX(v2.f)", "max_g"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "v2.e < 5 and v2.e > 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_g > 25",
- "filesort": {
- "sort_key": "t2.e",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "MAX(v2.f)", "max_g"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "v2.e < 5 and v2.e > 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_g > 25",
+ "filesort": {
+ "sort_key": "t2.e",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e > 1"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE and HAVING
@@ -2803,58 +3115,72 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.c < 100 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "MAX(v2.f)", "max_g"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "having_condition": "v2.max_g < 100",
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "v2.e < 5 and v2.e > 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_g > 25",
- "filesort": {
- "sort_key": "t2.e",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.e > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.c < 100 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "MAX(v2.f)", "max_g"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "v2.max_g < 100",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "v2.e < 5 and v2.e > 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_g > 25",
+ "filesort": {
+ "sort_key": "t2.e",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.e > 1"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE of the IN subquery
@@ -2937,56 +3263,70 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "MAX(d_tab.f)", "max_g"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "d_tab.e < 5 and d_tab.e > 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1",
- "filesort": {
- "sort_key": "t2.f",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "MAX(d_tab.f)", "max_g"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "d_tab.e < 5 and d_tab.e > 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1",
+ "filesort": {
+ "sort_key": "t2.f",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into HAVING of the derived table
@@ -3088,56 +3428,70 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "MAX(d_tab.f)", "max_g"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "d_tab.e < 5 and d_tab.e > 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1",
- "filesort": {
- "sort_key": "t2.f",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "MAX(d_tab.f)", "max_g"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "d_tab.e < 5 and d_tab.e > 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1",
+ "filesort": {
+ "sort_key": "t2.f",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE of the derived table
@@ -3240,56 +3594,70 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "MAX(d_tab.f)", "max_g"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "temporary_table": {
- "table": {
- "table_name": "<derived3>",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "d_tab.e < 5 and d_tab.e > 1",
- "materialized": {
- "query_block": {
- "select_id": 3,
- "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1",
- "filesort": {
- "sort_key": "t2.f",
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "MAX(d_tab.f)", "max_g"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived3>",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "d_tab.e < 5 and d_tab.e > 1",
+ "materialized": {
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1",
+ "filesort": {
+ "sort_key": "t2.f",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
}
- }
+ ]
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE and HAVING
@@ -3374,70 +3742,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 8,
- "filtered": 100,
- "attached_condition": "t3.x < 5 and t3.x is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t3.x"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "d_tab.max_c < 70",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 70",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a < 5 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery3>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "having_condition": "t2.f < 5",
- "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 8,
+ "filtered": 100,
+ "attached_condition": "t3.x < 5 and t3.x is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t3.x"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "d_tab.max_c < 70",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 70",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
"table": {
- "table_name": "t2",
+ "table_name": "t1",
"access_type": "ALL",
- "rows": 12,
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a < 5 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
"filtered": 100,
- "attached_condition": "t2.e > 1 and t2.e < 5"
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "t2.f < 5",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e > 1 and t2.e < 5"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
- }
+ ]
}
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE of the derived table
@@ -3543,70 +3927,86 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 8,
- "filtered": 100,
- "attached_condition": "t3.x < 5 and t3.x is not null"
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t3.x"],
- "rows": 2,
- "filtered": 100,
- "attached_condition": "d_tab.max_c < 70",
- "materialized": {
- "query_block": {
- "select_id": 2,
- "having_condition": "max_c < 70",
- "filesort": {
- "sort_key": "t1.a",
- "temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.a > 1 and t1.a < 5 and t1.a is not null and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery3>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["e", "f", "MAX(t2.g)"],
- "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 3,
- "having_condition": "t2.f < 5",
- "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 8,
+ "filtered": 100,
+ "attached_condition": "t3.x < 5 and t3.x is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t3.x"],
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "d_tab.max_c < 70",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "having_condition": "max_c < 70",
+ "filesort": {
+ "sort_key": "t1.a",
+ "temporary_table": {
+ "nested_loop": [
+ {
"table": {
- "table_name": "t2",
+ "table_name": "t1",
"access_type": "ALL",
- "rows": 12,
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.a > 1 and t1.a < 5 and t1.a is not null and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery3>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": ["e", "f", "MAX(t2.g)"],
+ "ref": ["test.t1.a", "test.t1.b", "test.t1.c"],
+ "rows": 1,
"filtered": 100,
- "attached_condition": "t2.e > 1 and t2.e < 5"
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 3,
+ "having_condition": "t2.f < 5",
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e > 1 and t2.e < 5"
+ }
+ }
+ ]
+ }
+ }
+ }
}
}
- }
+ ]
}
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE
@@ -3665,46 +4065,58 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.b > 1 and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "8",
- "used_key_parts": ["f", "MAX(t2.g) OVER (PARTITION BY t2.f)"],
- "ref": ["test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.f"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.f > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.b > 1 and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "8",
+ "used_key_parts": ["f", "MAX(t2.g) OVER (PARTITION BY t2.f)"],
+ "ref": ["test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.f"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.f > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
# conjunctive subformula : pushing into WHERE
@@ -3757,47 +4169,62 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 16,
- "filtered": 100,
- "attached_condition": "t1.b > 1 and t1.b is not null and t1.c is not null"
- },
- "table": {
- "table_name": "<subquery2>",
- "access_type": "eq_ref",
- "possible_keys": ["distinct_key"],
- "key": "distinct_key",
- "key_length": "12",
- "used_key_parts": ["f", "CAST(SUM(t2.g) OVER (PARTITION BY t2.f) AS INT)"],
- "ref": ["test.t1.b", "test.t1.c"],
- "rows": 1,
- "filtered": 100,
- "attached_condition": "t1.c = `<subquery2>`.`CAST(SUM(t2.g) OVER (PARTITION BY t2.f) AS INT)`",
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t2.f"
- }
- },
- "temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 12,
- "filtered": 100,
- "attached_condition": "t2.e < 5 and t2.f > 1"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 16,
+ "filtered": 100,
+ "attached_condition": "t1.b > 1 and t1.b is not null and t1.c is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "eq_ref",
+ "possible_keys": ["distinct_key"],
+ "key": "distinct_key",
+ "key_length": "12",
+ "used_key_parts": [
+ "f",
+ "CAST(SUM(t2.g) OVER (PARTITION BY t2.f) AS INT)"
+ ],
+ "ref": ["test.t1.b", "test.t1.c"],
+ "rows": 1,
+ "filtered": 100,
+ "attached_condition": "t1.c = `<subquery2>`.`CAST(SUM(t2.g) OVER (PARTITION BY t2.f) AS INT)`",
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "window_functions_computation": {
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t2.f"
+ }
+ }
+ ],
+ "temporary_table": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 12,
+ "filtered": 100,
+ "attached_condition": "t2.e < 5 and t2.f > 1"
+ }
+ }
+ ]
+ }
}
}
}
}
}
- }
+ ]
}
}
DROP TABLE t1,t2,t3;
diff --git a/mysql-test/main/information_schema_part.result b/mysql-test/main/information_schema_part.result
index 2655ef30fc6..1c5b9333550 100644
--- a/mysql-test/main/information_schema_part.result
+++ b/mysql-test/main/information_schema_part.result
@@ -7,9 +7,9 @@ partition x3 values in (16, 8, 5+19, 70-43) tablespace ts3);
select * from information_schema.partitions where table_schema="test"
and table_name="t1";
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME
-def test t1 x1 NULL 1 NULL LIST NULL `b` * `a` NULL 1 0 0 0 # 1024 0 # # NULL NULL default ts1
-def test t1 x2 NULL 2 NULL LIST NULL `b` * `a` NULL 3,11,5,7 0 0 0 # 1024 0 # # NULL NULL default ts2
-def test t1 x3 NULL 3 NULL LIST NULL `b` * `a` NULL 16,8,24,27 0 0 0 # 1024 0 # # NULL NULL default ts3
+def test t1 x1 NULL 1 NULL LIST NULL `b` * `a` NULL 1 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t1 x2 NULL 2 NULL LIST NULL `b` * `a` NULL 3,11,5,7 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t1 x3 NULL 3 NULL LIST NULL `b` * `a` NULL 16,8,24,27 0 0 0 # 1024 0 # # NULL NULL default NULL
create table t2 (a int not null,b int not null,c int not null, primary key(a,b))
partition by range (a)
partitions 3
@@ -19,9 +19,9 @@ partition x3 values less than maxvalue tablespace ts3);
select * from information_schema.partitions where table_schema="test"
and table_name="t2";
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME
-def test t2 x1 NULL 1 NULL RANGE NULL `a` NULL 5 0 0 0 # 1024 0 # # NULL NULL default ts1
-def test t2 x2 NULL 2 NULL RANGE NULL `a` NULL 10 0 0 0 # 1024 0 # # NULL NULL default ts2
-def test t2 x3 NULL 3 NULL RANGE NULL `a` NULL MAXVALUE 0 0 0 # 1024 0 # # NULL NULL default ts3
+def test t2 x1 NULL 1 NULL RANGE NULL `a` NULL 5 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t2 x2 NULL 2 NULL RANGE NULL `a` NULL 10 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t2 x3 NULL 3 NULL RANGE NULL `a` NULL MAXVALUE 0 0 0 # 1024 0 # # NULL NULL default NULL
create table t3 (f1 date)
partition by hash(month(f1))
partitions 3;
@@ -63,14 +63,14 @@ subpartition x22 tablespace t2)
);
select * from information_schema.partitions where table_schema="test" order by table_name, partition_name;
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME
-def test t1 x1 x11 1 1 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL default t1
-def test t1 x1 x12 1 2 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL default t2
-def test t1 x2 x21 2 1 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL default t1
-def test t1 x2 x22 2 2 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL default t2
-def test t2 x1 x11 1 1 RANGE KEY `a` `a` 1 0 0 0 # 1024 0 # # NULL NULL default t1
-def test t2 x1 x12 1 2 RANGE KEY `a` `a` 1 0 0 0 # 1024 0 # # NULL NULL default t2
-def test t2 x2 x21 2 1 RANGE KEY `a` `a` 5 0 0 0 # 1024 0 # # NULL NULL default t1
-def test t2 x2 x22 2 2 RANGE KEY `a` `a` 5 0 0 0 # 1024 0 # # NULL NULL default t2
+def test t1 x1 x11 1 1 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t1 x1 x12 1 2 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t1 x2 x21 2 1 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t1 x2 x22 2 2 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t2 x1 x11 1 1 RANGE KEY `a` `a` 1 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t2 x1 x12 1 2 RANGE KEY `a` `a` 1 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t2 x2 x21 2 1 RANGE KEY `a` `a` 5 0 0 0 # 1024 0 # # NULL NULL default NULL
+def test t2 x2 x22 2 2 RANGE KEY `a` `a` 5 0 0 0 # 1024 0 # # NULL NULL default NULL
drop table t1,t2;
create table t1 (
a int not null,
@@ -88,10 +88,10 @@ subpartition x22 tablespace t2 nodegroup 1)
);
select * from information_schema.partitions where table_schema="test";
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME
-def test t1 x1 x11 1 1 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL 0 t1
-def test t1 x1 x12 1 2 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL 1 t2
-def test t1 x2 x21 2 1 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL 0 t1
-def test t1 x2 x22 2 2 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL 1 t2
+def test t1 x1 x11 1 1 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL 0 NULL
+def test t1 x1 x12 1 2 RANGE HASH `a` `a` + `b` 1 0 0 0 # 1024 0 # # NULL NULL 1 NULL
+def test t1 x2 x21 2 1 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL 0 NULL
+def test t1 x2 x22 2 2 RANGE HASH `a` `a` + `b` 5 0 0 0 # 1024 0 # # NULL NULL 1 NULL
show tables;
Tables_in_test
t1
diff --git a/mysql-test/main/innodb_ext_key,off.rdiff b/mysql-test/main/innodb_ext_key,off.rdiff
index 4d6c65c9971..b334d006737 100644
--- a/mysql-test/main/innodb_ext_key,off.rdiff
+++ b/mysql-test/main/innodb_ext_key,off.rdiff
@@ -265,30 +265,30 @@
drop table t0,t1,t2;
#
# MDEV-11196: Error:Run-Time Check Failure #2 - Stack around the variable 'key_buff'
-@@ -755,11 +755,12 @@
- "select_id": 1,
- "table": {
- "table_name": "t1",
-- "access_type": "range",
-+ "access_type": "ref",
- "possible_keys": ["f2"],
- "key": "f2",
-- "key_length": "3070",
-- "used_key_parts": ["f2", "pk1"],
-+ "key_length": "3066",
-+ "used_key_parts": ["f2"],
-+ "ref": ["const"],
- "rows": 1,
- "filtered": 100,
- "index_condition": "t1.pk1 <= 5 and t1.pk2 <= 5 and t1.f2 = 'abc'",
-@@ -788,8 +789,8 @@
- "access_type": "range",
- "possible_keys": ["k1"],
- "key": "k1",
-- "key_length": "3011",
-- "used_key_parts": ["pk1", "f2", "pk2"],
-+ "key_length": "3007",
-+ "used_key_parts": ["pk1", "f2"],
- "rows": 1,
- "filtered": 100,
- "index_condition": "t1.f2 <= 5 and t1.pk2 <= 5 and t1.pk1 = 'abc'",
+@@ -768,11 +768,12 @@
+ {
+ "table": {
+ "table_name": "t1",
+- "access_type": "range",
++ "access_type": "ref",
+ "possible_keys": ["f2"],
+ "key": "f2",
+- "key_length": "3070",
+- "used_key_parts": ["f2", "pk1"],
++ "key_length": "3066",
++ "used_key_parts": ["f2"],
++ "ref": ["const"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t1.pk1 <= 5 and t1.pk2 <= 5 and t1.f2 = 'abc'",
+@@ -805,8 +806,8 @@
+ "access_type": "range",
+ "possible_keys": ["k1"],
+ "key": "k1",
+- "key_length": "3011",
+- "used_key_parts": ["pk1", "f2", "pk2"],
++ "key_length": "3007",
++ "used_key_parts": ["pk1", "f2"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t1.f2 <= 5 and t1.pk2 <= 5 and t1.pk1 = 'abc'",
diff --git a/mysql-test/main/innodb_ext_key.result b/mysql-test/main/innodb_ext_key.result
index 5b99fa4e30b..3025e3ec3f0 100644
--- a/mysql-test/main/innodb_ext_key.result
+++ b/mysql-test/main/innodb_ext_key.result
@@ -764,18 +764,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["f2"],
- "key": "f2",
- "key_length": "3070",
- "used_key_parts": ["f2", "pk1"],
- "rows": 1,
- "filtered": 100,
- "index_condition": "t1.pk1 <= 5 and t1.pk2 <= 5 and t1.f2 = 'abc'",
- "attached_condition": "t1.f1 <= '3'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["f2"],
+ "key": "f2",
+ "key_length": "3070",
+ "used_key_parts": ["f2", "pk1"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t1.pk1 <= 5 and t1.pk2 <= 5 and t1.f2 = 'abc'",
+ "attached_condition": "t1.f1 <= '3'"
+ }
+ }
+ ]
}
}
drop table t1;
@@ -794,18 +798,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["k1"],
- "key": "k1",
- "key_length": "3011",
- "used_key_parts": ["pk1", "f2", "pk2"],
- "rows": 1,
- "filtered": 100,
- "index_condition": "t1.f2 <= 5 and t1.pk2 <= 5 and t1.pk1 = 'abc'",
- "attached_condition": "t1.f1 <= '3'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["k1"],
+ "key": "k1",
+ "key_length": "3011",
+ "used_key_parts": ["pk1", "f2", "pk2"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t1.f2 <= 5 and t1.pk2 <= 5 and t1.pk1 = 'abc'",
+ "attached_condition": "t1.f1 <= '3'"
+ }
+ }
+ ]
}
}
drop table t1;
diff --git a/mysql-test/main/intersect.result b/mysql-test/main/intersect.result
index 3a194b60008..c7858b49cd4 100644
--- a/mysql-test/main/intersect.result
+++ b/mysql-test/main/intersect.result
@@ -51,36 +51,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "INTERSECT",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 3,
"operation": "INTERSECT",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -102,17 +114,21 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
},
{
@@ -121,17 +137,21 @@ ANALYZE
"operation": "INTERSECT",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
},
{
@@ -140,17 +160,21 @@ ANALYZE
"operation": "INTERSECT",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -164,85 +188,101 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3,4>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 1,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "INTERSECT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3,4>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 1,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "INTERSECT",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
select * from ((select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3)) a;
@@ -300,35 +340,45 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "INTERSECT",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "256Kb",
- "join_type": "BNL"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "256Kb",
+ "join_type": "BNL"
+ }
+ }
+ ]
}
}
]
@@ -350,17 +400,21 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
},
{
@@ -369,91 +423,24 @@ ANALYZE
"operation": "INTERSECT",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "256Kb",
- "join_type": "BNL",
- "r_filtered": 100
- }
- }
- }
- ]
- }
- }
-}
-ANALYZE format=json select * from ((select a,b from t1) intersect (select c,e from t2,t3)) a;
-ANALYZE
-{
- "query_block": {
- "select_id": 1,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 1,
- "query_specifications": [
+ "nested_loop": [
{
- "query_block": {
- "select_id": 2,
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
"r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
}
},
{
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
+ "block-nl-join": {
"table": {
- "table_name": "t2",
+ "table_name": "t3",
"access_type": "ALL",
"r_loops": 1,
"rows": 3,
@@ -463,32 +450,119 @@ ANALYZE
"filtered": 100,
"r_filtered": 100
},
- "block-nl-join": {
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "256Kb",
- "join_type": "BNL",
- "r_filtered": 100
- }
+ "buffer_type": "flat",
+ "buffer_size": "256Kb",
+ "join_type": "BNL",
+ "r_filtered": 100
}
}
]
}
}
- }
+ ]
}
}
}
+ANALYZE format=json select * from ((select a,b from t1) intersect (select c,e from t2,t3)) a;
+ANALYZE
+{
+ "query_block": {
+ "select_id": 1,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 1,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "256Kb",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+}
set @@optimizer_switch=@save_optimizer_switch;
select * from ((select a,b from t1) intersect (select c,e from t2,t3)) a;
a b
diff --git a/mysql-test/main/intersect_all.result b/mysql-test/main/intersect_all.result
index 96bfb9ca1fb..6c7a9c1cdd2 100644
--- a/mysql-test/main/intersect_all.result
+++ b/mysql-test/main/intersect_all.result
@@ -63,36 +63,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "INTERSECT",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 3,
"operation": "INTERSECT",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -114,17 +126,21 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
},
{
@@ -133,17 +149,21 @@ ANALYZE
"operation": "INTERSECT",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
},
{
@@ -152,17 +172,21 @@ ANALYZE
"operation": "INTERSECT",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -176,85 +200,101 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3,4>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 2,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "INTERSECT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3,4>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 2,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "INTERSECT",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
select * from ((select a,b from t1) intersect all (select c,d from t2) intersect all (select e,f from t3)) a;
@@ -331,35 +371,45 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 6,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 6,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "INTERSECT",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL"
+ }
+ }
+ ]
}
}
]
@@ -381,17 +431,21 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 6,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 6,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
},
{
@@ -400,34 +454,40 @@ ANALYZE
"operation": "INTERSECT",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 5,
- "r_rows": 5,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 7,
- "r_rows": 7,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 5,
+ "r_rows": 5,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL",
- "r_filtered": 100
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 7,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
]
@@ -441,83 +501,97 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 6,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3>",
- "access_type": "ALL",
- "r_loops": 1,
- "r_rows": 3,
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 6,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 5,
- "r_rows": 5,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 6,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3>",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "r_rows": 3,
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 6,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
},
- "block-nl-join": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
"r_loops": 1,
- "rows": 7,
- "r_rows": 7,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL",
- "r_filtered": 100
+ "r_total_time_ms": "REPLACED",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 5,
+ "r_rows": 5,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ },
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 7,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL",
+ "r_filtered": 100
+ }
+ }
+ ]
+ }
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
}
select * from ((select a,b from t1) intersect all (select c,e from t2,t3)) a;
diff --git a/mysql-test/main/invisible_field_debug.test b/mysql-test/main/invisible_field_debug.test
index 3e844fc4521..b813481110f 100644
--- a/mysql-test/main/invisible_field_debug.test
+++ b/mysql-test/main/invisible_field_debug.test
@@ -201,7 +201,7 @@ drop table t1;
set debug_dbug= "+d,test_pseudo_invisible";
Create table t1( a int default(99) invisible, b int);
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
Create table t2( a int default(99) invisible, b int, unique(invisible));
set debug_dbug=@old_debug;
@@ -211,9 +211,9 @@ insert into t1 values(3);
insert into t1 values(4);
select * from t1 order by b;
select invisible, a, b from t1 order by b;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 add index(invisible);
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 add index(b,invisible);
show index from t1;
drop table t1;
@@ -223,7 +223,7 @@ drop table t1;
set debug_dbug= "+d,test_completely_invisible";
Create table t1( a int default(99) invisible, b int);
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
Create table t2( a int default(99) invisible, b int, unique(invisible));
insert into t1 values(1);
insert into t1 values(2);
@@ -233,9 +233,9 @@ select * from t1 order by b;
select invisible, a, b from t1 order by b;
set debug_dbug=@old_debug;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 add index(invisible);
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 add index(b,invisible);
show index from t1;
drop table t1;
@@ -262,7 +262,7 @@ select invisible, a ,b from t1;
set debug_dbug=@old_debug;
Show index from t1;
## Sytem Generated Index modification
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
create index a1 on t1(invisible);
set debug_dbug= "+d,test_completely_invisible,test_invisible_index";
## index does not exist for user
diff --git a/mysql-test/main/join_cache.result b/mysql-test/main/join_cache.result
index 3ab6c1cf310..10ed8960b64 100644
--- a/mysql-test/main/join_cache.result
+++ b/mysql-test/main/join_cache.result
@@ -6195,36 +6195,42 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "a",
- "access_type": "range",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["a"],
- "rows": 10,
- "filtered": 100,
- "attached_condition": "a.a <= 10",
- "using_index": true
- },
- "block-nl-join": {
- "table": {
- "table_name": "b",
- "access_type": "range",
- "possible_keys": ["kp1"],
- "key": "kp1",
- "key_length": "10",
- "used_key_parts": ["kp1", "kp2"],
- "rows": 836,
- "filtered": 76.43428802,
- "index_condition": "b.kp2 <= 10",
- "attached_condition": "b.kp2 <= 10 and b.col1 + 1 < 33333"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "a",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["a"],
+ "rows": 10,
+ "filtered": 100,
+ "attached_condition": "a.a <= 10",
+ "using_index": true
+ }
},
- "buffer_type": "flat",
- "buffer_size": "54",
- "join_type": "BNL",
- "attached_condition": "b.kp1 = a.a"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "b",
+ "access_type": "range",
+ "possible_keys": ["kp1"],
+ "key": "kp1",
+ "key_length": "10",
+ "used_key_parts": ["kp1", "kp2"],
+ "rows": 836,
+ "filtered": 76,
+ "index_condition": "b.kp2 <= 10",
+ "attached_condition": "b.kp2 <= 10 and b.col1 + 1 < 33333"
+ },
+ "buffer_type": "flat",
+ "buffer_size": "54",
+ "join_type": "BNL",
+ "attached_condition": "b.kp1 = a.a"
+ }
+ }
+ ]
}
}
drop table t1,t2,t3;
diff --git a/mysql-test/main/join_outer.result b/mysql-test/main/join_outer.result
index 6bcaee31e54..fde7689b142 100644
--- a/mysql-test/main/join_outer.result
+++ b/mysql-test/main/join_outer.result
@@ -2796,7 +2796,7 @@ test.t3 analyze status OK
explain extended select * from t1 left join t3 on t1.a=t3.b and t3.a<5;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 10 100.00
-1 SIMPLE t3 ALL NULL NULL NULL NULL 1000 1.96 Using where
+1 SIMPLE t3 ALL NULL NULL NULL NULL 1000 0.50 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b` from `test`.`t1` left join `test`.`t3` on(`test`.`t3`.`b` = `test`.`t1`.`a` and `test`.`t3`.`a` < 5) where 1
# t3.filtered must less than 100%, too:
@@ -2804,7 +2804,7 @@ explain extended select * from t1 left join (t3 join t2) on t1.a=t3.b and t3.a<5
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 10 100.00
1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00
-1 SIMPLE t3 ALL NULL NULL NULL NULL 1000 1.96 Using where
+1 SIMPLE t3 ALL NULL NULL NULL NULL 1000 0.50 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t2`.`a` AS `a` from `test`.`t1` left join (`test`.`t3` join `test`.`t2`) on(`test`.`t3`.`b` = `test`.`t1`.`a` and `test`.`t3`.`a` < 5) where 1
drop table t1,t2,t3;
diff --git a/mysql-test/main/join_outer_jcl6.result b/mysql-test/main/join_outer_jcl6.result
index 3d73ebdc9ba..cd13a4c48a6 100644
--- a/mysql-test/main/join_outer_jcl6.result
+++ b/mysql-test/main/join_outer_jcl6.result
@@ -2803,7 +2803,7 @@ test.t3 analyze status OK
explain extended select * from t1 left join t3 on t1.a=t3.b and t3.a<5;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 10 100.00
-1 SIMPLE t3 hash_ALL NULL #hash#$hj 5 test.t1.a 1000 1.96 Using where; Using join buffer (flat, BNLH join)
+1 SIMPLE t3 hash_ALL NULL #hash#$hj 5 test.t1.a 1000 0.50 Using where; Using join buffer (flat, BNLH join)
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b` from `test`.`t1` left join `test`.`t3` on(`test`.`t3`.`b` = `test`.`t1`.`a` and `test`.`t3`.`a` < 5 and `test`.`t1`.`a` is not null) where 1
# t3.filtered must less than 100%, too:
@@ -2811,7 +2811,7 @@ explain extended select * from t1 left join (t3 join t2) on t1.a=t3.b and t3.a<5
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 10 100.00
1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join)
-1 SIMPLE t3 hash_ALL NULL #hash#$hj 5 test.t1.a 1000 1.96 Using where; Using join buffer (incremental, BNLH join)
+1 SIMPLE t3 hash_ALL NULL #hash#$hj 5 test.t1.a 1000 0.50 Using where; Using join buffer (incremental, BNLH join)
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t2`.`a` AS `a` from `test`.`t1` left join (`test`.`t3` join `test`.`t2`) on(`test`.`t3`.`b` = `test`.`t1`.`a` and `test`.`t3`.`a` < 5 and `test`.`t1`.`a` is not null) where 1
drop table t1,t2,t3;
diff --git a/mysql-test/main/json_equals.result b/mysql-test/main/json_equals.result
new file mode 100644
index 00000000000..1fa13ec2cf8
--- /dev/null
+++ b/mysql-test/main/json_equals.result
@@ -0,0 +1,98 @@
+select json_equals("{}", "{}");
+json_equals("{}", "{}")
+1
+select json_equals("{}", "[]");
+json_equals("{}", "[]")
+0
+select json_equals("{}", NULL);
+json_equals("{}", NULL)
+NULL
+select json_equals("", "");
+json_equals("", "")
+NULL
+select json_equals("", 1);
+json_equals("", 1)
+NULL
+select json_equals(now(), now());
+json_equals(now(), now())
+NULL
+select json_equals('{"a":[1, 2, 3]}', '{"a":[1, 2, 3, 4]}');
+json_equals('{"a":[1, 2, 3]}', '{"a":[1, 2, 3, 4]}')
+0
+select json_equals('{"a":[1, 2, 3]}', '{"a":[1, 2, 3]}');
+json_equals('{"a":[1, 2, 3]}', '{"a":[1, 2, 3]}')
+1
+select json_equals('{"țanțoș":[1, 2, "ț", {"some uâ߀":"uâßr"}]}',
+'{"țanțoș":[1, 2, "ț", {"some uâ߀":"uâßr"}]}');
+json_equals('{"țanțoș":[1, 2, "ț", {"some uâ߀":"uâßr"}]}',
+'{"țanțoș":[1, 2, "ț", {"some uâ߀":"uâßr"}]}')
+1
+select json_equals('{"a" : [0.123456789123456789], "b" : [1, 2, 3]}',
+'{"b" : [1, 2, 3], "a" : [0.123456789123456789]}');
+json_equals('{"a" : [0.123456789123456789], "b" : [1, 2, 3]}',
+'{"b" : [1, 2, 3], "a" : [0.123456789123456789]}')
+1
+#
+# Test max json depth for json_equals.
+#
+with recursive rec_json (step, obj) as (
+select 1, cast('{"key":"value"}' as varchar(1000))
+union
+select r.step + 1, JSON_INSERT('{}', '$.obj', JSON_QUERY(r.obj, '$'))
+from rec_json r
+where r.step < 10
+)
+select step, obj, json_equals(obj, obj) from rec_json;
+step obj json_equals(obj, obj)
+1 {"key":"value"} 1
+2 {"obj": {"key": "value"}} 1
+3 {"obj": {"obj": {"key": "value"}}} 1
+4 {"obj": {"obj": {"obj": {"key": "value"}}}} 1
+5 {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}} 1
+6 {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}} 1
+7 {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}} 1
+8 {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}} 1
+9 {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}} 1
+10 {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}} 1
+#
+# 31 levels of nesting.
+#
+select json_equals('{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}',
+'{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}') as 31_levels;
+31_levels
+1
+#
+# 32 Levels of nesting. This should hit max json depth.
+#
+select json_equals('{"obj":{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}',
+'{"obj":{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}') as 32_levels;
+32_levels
+NULL
+#
+# test values from different charset
+# (UTF-8 two-bytes vs. latin1 single high-byte)
+#
+create table t1 (a varchar(200) character set latin1);
+create table t2 (a varchar(200) character set utf8);
+insert into t1 values (UNHEX('22CA22'));
+set names utf8;
+insert into t2 values (UNHEX('22C38A22'));
+select a from t1;
+a
+"Ê"
+select hex(a) from t1;
+hex(a)
+22CA22
+select a from t2;
+a
+"Ê"
+select hex(a) from t2;
+hex(a)
+22C38A22
+select t1.a, t2.a, t1.a = t2.a,
+json_valid(t1.a), json_valid(t2.a), json_equals(t1.a, t2.a)
+from t1, t2;
+a a t1.a = t2.a json_valid(t1.a) json_valid(t2.a) json_equals(t1.a, t2.a)
+"Ê" "Ê" 1 1 1 1
+drop table t1;
+drop table t2;
diff --git a/mysql-test/main/json_equals.test b/mysql-test/main/json_equals.test
new file mode 100644
index 00000000000..943906e6f01
--- /dev/null
+++ b/mysql-test/main/json_equals.test
@@ -0,0 +1,72 @@
+
+select json_equals("{}", "{}");
+
+select json_equals("{}", "[]");
+
+select json_equals("{}", NULL);
+
+select json_equals("", "");
+
+select json_equals("", 1);
+
+select json_equals(now(), now());
+
+select json_equals('{"a":[1, 2, 3]}', '{"a":[1, 2, 3, 4]}');
+
+select json_equals('{"a":[1, 2, 3]}', '{"a":[1, 2, 3]}');
+
+#enable after fix MDEV-27871
+--disable_view_protocol
+select json_equals('{"țanțoș":[1, 2, "ț", {"some uâ߀":"uâßr"}]}',
+ '{"țanțoș":[1, 2, "ț", {"some uâ߀":"uâßr"}]}');
+
+select json_equals('{"a" : [0.123456789123456789], "b" : [1, 2, 3]}',
+ '{"b" : [1, 2, 3], "a" : [0.123456789123456789]}');
+--enable_view_protocol
+
+--echo #
+--echo # Test max json depth for json_equals.
+--echo #
+with recursive rec_json (step, obj) as (
+ select 1, cast('{"key":"value"}' as varchar(1000))
+ union
+ select r.step + 1, JSON_INSERT('{}', '$.obj', JSON_QUERY(r.obj, '$'))
+ from rec_json r
+ where r.step < 10
+)
+select step, obj, json_equals(obj, obj) from rec_json;
+
+--echo #
+--echo # 31 levels of nesting.
+--echo #
+select json_equals('{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}',
+'{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}') as 31_levels;
+
+--echo #
+--echo # 32 Levels of nesting. This should hit max json depth.
+--echo #
+select json_equals('{"obj":{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}',
+'{"obj":{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}') as 32_levels;
+
+
+--echo #
+--echo # test values from different charset
+--echo # (UTF-8 two-bytes vs. latin1 single high-byte)
+--echo #
+create table t1 (a varchar(200) character set latin1);
+create table t2 (a varchar(200) character set utf8);
+insert into t1 values (UNHEX('22CA22'));
+set names utf8;
+insert into t2 values (UNHEX('22C38A22'));
+
+select a from t1;
+select hex(a) from t1;
+select a from t2;
+select hex(a) from t2;
+
+select t1.a, t2.a, t1.a = t2.a,
+ json_valid(t1.a), json_valid(t2.a), json_equals(t1.a, t2.a)
+from t1, t2;
+
+drop table t1;
+drop table t2;
diff --git a/mysql-test/main/json_normalize.result b/mysql-test/main/json_normalize.result
new file mode 100644
index 00000000000..b1363ea9099
--- /dev/null
+++ b/mysql-test/main/json_normalize.result
@@ -0,0 +1,77 @@
+set names utf8;
+create table t1 (json json);
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`json`))
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+insert into t1 values
+('{ }'),
+('[ ]'),
+('{ "foo" : "bar" }'),
+('{ "foo" : "bar", "baz" : "whatever" }'),
+('[ 1.2, 0.0, "text", 0, null, true, false ]'),
+('[ "string", { "key" : "val", "a" : "b", "c" : [ 10, 9, 8, "seven", 11 ] }]'),
+('{ "ăț€": "val1", "âț€":"val2" }');
+select json, json_normalize(json) from t1
+order by json;
+json json_normalize(json)
+[ ] []
+[ "string", { "key" : "val", "a" : "b", "c" : [ 10, 9, 8, "seven", 11 ] }] ["string",{"a":"b","c":[1.0E1,9.0E0,8.0E0,"seven",1.1E1],"key":"val"}]
+[ 1.2, 0.0, "text", 0, null, true, false ] [1.2E0,0.0E0,"text",0.0E0,null,true,false]
+{ } {}
+{ "foo" : "bar" } {"foo":"bar"}
+{ "foo" : "bar", "baz" : "whatever" } {"baz":"whatever","foo":"bar"}
+{ "ăț€": "val1", "âț€":"val2" } {"âț€":"val2","ăț€":"val1"}
+create view v1 as (select json, json_normalize(json) norm_json from t1);
+show create view v1;
+View Create View character_set_client collation_connection
+v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS (select `t1`.`json` AS `json`,json_normalize(`t1`.`json`) AS `norm_json` from `t1`) utf8mb3 utf8mb3_general_ci
+select * from v1
+order by json;
+json norm_json
+[ ] []
+[ "string", { "key" : "val", "a" : "b", "c" : [ 10, 9, 8, "seven", 11 ] }] ["string",{"a":"b","c":[1.0E1,9.0E0,8.0E0,"seven",1.1E1],"key":"val"}]
+[ 1.2, 0.0, "text", 0, null, true, false ] [1.2E0,0.0E0,"text",0.0E0,null,true,false]
+{ } {}
+{ "foo" : "bar" } {"foo":"bar"}
+{ "foo" : "bar", "baz" : "whatever" } {"baz":"whatever","foo":"bar"}
+{ "ăț€": "val1", "âț€":"val2" } {"âț€":"val2","ăț€":"val1"}
+select json_normalize(NULL);
+json_normalize(NULL)
+NULL
+select json_normalize('{ "invalid": "no_close"');
+json_normalize('{ "invalid": "no_close"')
+NULL
+drop table t1;
+drop view v1;
+create table t1 (text varchar(200) character set 'latin1');
+insert into t1 values (unhex('22E522'));
+create table t2 (text varchar(200) character set 'utf8mb4');
+insert into t2 SELECT * FROM t1;
+select t1.text, hex(t1.text) from t1;
+text hex(t1.text)
+"Ã¥" 22E522
+select t2.text, hex(t2.text) from t2;
+text hex(t2.text)
+"Ã¥" 22C3A522
+select t1.text
+, t2.text
+, replace(json_normalize(t1.text), unhex('C3A5'), unhex('C385'))
+, replace(json_normalize(t2.text), unhex('C3A5'), unhex('C385'))
+, hex(replace(json_normalize(t1.text), unhex('C3A5'), unhex('C385')))
+, hex(replace(json_normalize(t2.text), unhex('C3A5'), unhex('C385')))
+from t1, t2;
+text text replace(json_normalize(t1.text), unhex('C3A5'), unhex('C385')) replace(json_normalize(t2.text), unhex('C3A5'), unhex('C385')) hex(replace(json_normalize(t1.text), unhex('C3A5'), unhex('C385'))) hex(replace(json_normalize(t2.text), unhex('C3A5'), unhex('C385')))
+"Ã¥" "Ã¥" "Ã…" "Ã…" 22C38522 22C38522
+drop table t1;
+drop table t2;
+create table t1 (text varchar(1));
+insert into t1 values ('0');
+select concat_ws(' ', t1.text, t1.text) from t1;
+concat_ws(' ', t1.text, t1.text)
+0 0
+select concat_ws(' ', json_normalize(t1.text), json_normalize(t1.text)) from t1;
+concat_ws(' ', json_normalize(t1.text), json_normalize(t1.text))
+0.0E0 0.0E0
+drop table t1;
diff --git a/mysql-test/main/json_normalize.test b/mysql-test/main/json_normalize.test
new file mode 100644
index 00000000000..29faa514cca
--- /dev/null
+++ b/mysql-test/main/json_normalize.test
@@ -0,0 +1,58 @@
+set names utf8;
+
+create table t1 (json json);
+show create table t1;
+
+
+insert into t1 values
+('{ }'),
+('[ ]'),
+('{ "foo" : "bar" }'),
+('{ "foo" : "bar", "baz" : "whatever" }'),
+('[ 1.2, 0.0, "text", 0, null, true, false ]'),
+('[ "string", { "key" : "val", "a" : "b", "c" : [ 10, 9, 8, "seven", 11 ] }]'),
+('{ "ăț€": "val1", "âț€":"val2" }');
+
+select json, json_normalize(json) from t1
+order by json;
+
+
+create view v1 as (select json, json_normalize(json) norm_json from t1);
+show create view v1;
+
+select * from v1
+order by json;
+
+select json_normalize(NULL);
+select json_normalize('{ "invalid": "no_close"');
+
+drop table t1;
+drop view v1;
+
+create table t1 (text varchar(200) character set 'latin1');
+insert into t1 values (unhex('22E522'));
+
+create table t2 (text varchar(200) character set 'utf8mb4');
+insert into t2 SELECT * FROM t1;
+
+select t1.text, hex(t1.text) from t1;
+select t2.text, hex(t2.text) from t2;
+
+select t1.text
+ , t2.text
+ , replace(json_normalize(t1.text), unhex('C3A5'), unhex('C385'))
+ , replace(json_normalize(t2.text), unhex('C3A5'), unhex('C385'))
+ , hex(replace(json_normalize(t1.text), unhex('C3A5'), unhex('C385')))
+ , hex(replace(json_normalize(t2.text), unhex('C3A5'), unhex('C385')))
+from t1, t2;
+
+drop table t1;
+drop table t2;
+
+create table t1 (text varchar(1));
+insert into t1 values ('0');
+
+select concat_ws(' ', t1.text, t1.text) from t1;
+select concat_ws(' ', json_normalize(t1.text), json_normalize(t1.text)) from t1;
+
+drop table t1;
diff --git a/mysql-test/main/key.result b/mysql-test/main/key.result
index e94a7309964..2e2c8d894f0 100644
--- a/mysql-test/main/key.result
+++ b/mysql-test/main/key.result
@@ -1,4 +1,3 @@
-drop table if exists t1,t2,t3;
SET SQL_WARNINGS=1;
CREATE TABLE t1 (
ID CHAR(32) NOT NULL,
@@ -685,3 +684,8 @@ c c
9 10
10 11
drop table t1,t2;
+#
+# MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
+#
+create table t1 (a int, b int, key(a), key(a desc));
+drop table t1;
diff --git a/mysql-test/main/key.test b/mysql-test/main/key.test
index fe7a5f48e2d..29e08b8834a 100644
--- a/mysql-test/main/key.test
+++ b/mysql-test/main/key.test
@@ -1,6 +1,3 @@
---disable_warnings
-drop table if exists t1,t2,t3;
---enable_warnings
--source include/have_sequence.inc
SET SQL_WARNINGS=1;
@@ -605,3 +602,9 @@ EXPLAIN SELECT t1.c, t2.c FROM t1, t2 WHERE t1.b=t2.a and t1.c=t2.b;
SELECT t1.c, t2.c FROM t1, t2 WHERE t1.b=t2.a and t1.c=t2.b;
drop table t1,t2;
+
+--echo #
+--echo # MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
+--echo #
+create table t1 (a int, b int, key(a), key(a desc));
+drop table t1;
diff --git a/mysql-test/main/long_unique_bugs.test b/mysql-test/main/long_unique_bugs.test
index 86003a6881c..27bb402bd8b 100644
--- a/mysql-test/main/long_unique_bugs.test
+++ b/mysql-test/main/long_unique_bugs.test
@@ -174,7 +174,7 @@ ALTER TABLE t1 DROP KEY f, ADD INDEX idx1(f), ALGORITHM=INSTANT;
ALTER TABLE t1 ADD KEY idx2(f);
DROP TABLE t1;
CREATE TABLE t1(a blob , b blob , unique(a,b));
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop column b;
insert into t1 values(1,1);
--error ER_DUP_ENTRY
diff --git a/mysql-test/main/mdl_sync.test b/mysql-test/main/mdl_sync.test
index 557fbe261a2..3df19aca806 100644
--- a/mysql-test/main/mdl_sync.test
+++ b/mysql-test/main/mdl_sync.test
@@ -113,7 +113,7 @@ insert into t1 values (1), (1);
--echo # Check that SU lock is compatible with it. To do this use ALTER TABLE
--echo # which will fail when constructing .frm and thus obtaining SU metadata
--echo # lock.
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 add index (not_exist);
--echo # Check that SNW lock is compatible with it. To do this use ALTER TABLE
--echo # which will fail during copying the table and thus obtaining SNW metadata
@@ -190,7 +190,7 @@ insert into t1 values (1);
--echo # Check that SU lock is compatible with it. To do this use ALTER TABLE
--echo # which will fail when constructing .frm and thus obtaining SU metadata
--echo # lock.
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 add index (not_exist);
--echo # Check that SNW lock is compatible with it. To do this use ALTER TABLE
--echo # which will fail during copying the table and thus obtaining SNW metadata
@@ -309,7 +309,7 @@ insert into t1 values (1);
--echo # Check that SU lock is compatible with it. To do this use ALTER TABLE
--echo # which will fail when constructing .frm and thus obtaining SU metadata
--echo # lock.
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 add index (not_exist);
--echo # Check that SNW lock is compatible with it. To do this use ALTER TABLE
--echo # which will fail during copying the table and thus obtaining SNW metadata
@@ -418,7 +418,7 @@ insert into t1 values (1);
--echo # Check that SU lock is compatible with it. To do this use ALTER TABLE
--echo # which will fail when constructing .frm and thus obtaining SU metadata
--echo # lock.
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 add index (not_exist);
--echo # Check that SNW lock is not compatible with SW lock.
--echo # Again we use ALTER TABLE which fails during copying
diff --git a/mysql-test/main/merge.result b/mysql-test/main/merge.result
index 1e671e2504f..230fcf48e9d 100644
--- a/mysql-test/main/merge.result
+++ b/mysql-test/main/merge.result
@@ -1,8 +1,6 @@
set @save_default_storage_engine=@@global.default_storage_engine;
set global default_storage_engine=myisam;
set session default_storage_engine=myisam;
-drop table if exists t1,t2,t3,t4,t5,t6;
-drop database if exists mysqltest;
create table t1 (a int not null primary key auto_increment, message char(20));
create table t2 (a int not null primary key auto_increment, message char(20));
INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
@@ -2266,7 +2264,6 @@ DROP TABLE t1;
# Bug45781 infinite hang/crash in "opening tables" after handler tries to
# open merge table
#
-DROP TABLE IF EXISTS m1,t1;
CREATE TABLE t1(a int)engine=myisam;
CREATE TABLE t2(a int)engine=myisam;
CREATE TABLE t3(a int)engine=myisam;
@@ -2376,7 +2373,6 @@ DROP TABLE t2, t1;
#
# Bug#46339 - crash on REPAIR TABLE merge table USE_FRM
#
-DROP TABLE IF EXISTS m1, t1;
CREATE TABLE t1 (c1 INT) ENGINE=MYISAM;
CREATE TABLE m1 (c1 INT) ENGINE=MRG_MyISAM UNION=(t1) INSERT_METHOD=LAST;
LOCK TABLE m1 READ;
@@ -2565,7 +2561,6 @@ DROP TABLE t1;
#
# Test merge table with too many merge children.
#
-drop table if exists t_parent;
set @save_table_open_cache=@@global.table_open_cache;
#
# Set @@global.table_open_cache to minimum
@@ -2595,7 +2590,6 @@ deallocate prepare stmt;
#
drop table t_parent;
set @@global.table_open_cache=@save_table_open_cache;
-DROP DATABASE IF EXISTS mysql_test1;
CREATE DATABASE mysql_test1;
CREATE TABLE t1 ... DATA DIRECTORY=... INDEX DIRECTORY=...
CREATE TABLE mysql_test1.t2 ... DATA DIRECTORY=... INDEX DIRECTORY=...
@@ -2881,7 +2875,6 @@ DROP TABLE t1;
# More tests with TEMPORARY MERGE table and permanent children.
# First without locked tables.
#
-DROP TABLE IF EXISTS t1, t2, t3, t4, m1, m2;
#
CREATE TABLE t1 (c1 INT, c2 INT) ENGINE=MyISAM;
CREATE TABLE t2 (c1 INT, c2 INT) ENGINE=MyISAM;
@@ -3582,7 +3575,6 @@ DROP TABLE t1, t2, t3, t4, m1, m2;
# Test that merge tables are closed correctly when opened using
# HANDLER ... OPEN.
# The general case.
-DROP TABLE IF EXISTS t1, t2, t3;
connect con1,localhost,root,,;
CREATE TABLE t1 (c1 int);
CREATE TABLE t2 (c1 int);
@@ -3635,7 +3627,6 @@ drop table t4, t3, t2, t1;
#
# Bug#51240 ALTER TABLE of a locked MERGE table fails
#
-DROP TABLE IF EXISTS m1, t1;
CREATE TABLE t1 (c1 INT);
CREATE TABLE m1 (c1 INT) ENGINE=MRG_MyISAM UNION=(t1);
LOCK TABLE m1 WRITE;
@@ -3657,7 +3648,6 @@ DROP TABLE m1, t1;
#
# Test for bug #37371 "CREATE TABLE LIKE merge loses UNION parameter"
#
-drop tables if exists t1, m1, m2;
create table t1 (i int) engine=myisam;
create table m1 (i int) engine=mrg_myisam union=(t1) insert_method=first;
create table m2 like m1;
@@ -3677,7 +3667,6 @@ drop tables m1, m2, t1;
# Test case for Bug#54811 "Assert in mysql_lock_have_duplicate()"
# Check that unique_table() works correctly for merge tables.
#
-drop table if exists t1, t2, t3, m1, m2;
create table t1 (a int);
create table t2 (a int);
create table t3 (b int);
@@ -3723,7 +3712,6 @@ drop table t1, t2, t3, m1, m2;
# Bug#56494 Segfault in upgrade_shared_lock_to_exclusive() for
# REPAIR of merge table
#
-DROP TABLE IF EXISTS t1, t2, t_not_exists;
CREATE TABLE t1(a INT);
ALTER TABLE t1 engine= MERGE UNION (t_not_exists);
ANALYZE TABLE t1;
@@ -3767,7 +3755,6 @@ DROP TABLE t1, t2;
# Bug#57002 Assert in upgrade_shared_lock_to_exclusive()
# for ALTER TABLE + MERGE tables
#
-DROP TABLE IF EXISTS t1, m1;
CREATE TABLE t1(a INT) engine=myisam;
CREATE TABLE m1(a INT) engine=merge UNION(t1);
LOCK TABLES t1 READ, m1 WRITE;
@@ -3779,7 +3766,6 @@ DROP TABLE m1, t1;
# Test for bug #11754210 - "45777: CHECK TABLE DOESN'T SHOW ALL
# PROBLEMS FOR MERGE TABLE COMPLIANCE IN 5.1"
#
-drop tables if exists t1, t2, t3, t4, m1;
create table t1(id int) engine=myisam;
create view t3 as select 1 as id;
create table t4(id int) engine=memory;
@@ -3809,8 +3795,7 @@ test.m1 repair error Corrupt
drop tables m1, t1, t4;
drop view t3;
#
-# MDEV-10424 - Assertion `ticket == __null' failed in
-# MDL_request::set_type
+# MDEV-10424 Assertion `ticket == __null' failed in MDL_request::set_type
#
CREATE TABLE t1 (f1 INT) ENGINE=MyISAM;
CREATE TABLE tmerge (f1 INT) ENGINE=MERGE UNION=(t1);
@@ -3829,7 +3814,9 @@ test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status Table is already up to date
DEALLOCATE PREPARE stmt;
DROP TABLE t1, tmerge;
-End of 5.5 tests
+#
+# End of 5.5 tests
+#
#
# Additional coverage for refactoring which is made as part
# of fix for bug #27480 "Extend CREATE TEMPORARY TABLES privilege
@@ -3837,8 +3824,7 @@ End of 5.5 tests
#
# Check that prelocking works correctly for various variants of
# merge tables.
-drop table if exists t1, t2, m1;
-drop function if exists f1;
+#
create table t1 (j int);
insert into t1 values (1);
create function f1() returns int return (select count(*) from m1);
@@ -3904,11 +3890,6 @@ checksum table m1;
Table Checksum
test.m1 3459908756
drop tables t1, m1;
-DROP TABLE IF EXISTS t1;
-DROP TABLE IF EXISTS m1;
-DROP TRIGGER IF EXISTS trg1;
-DROP TABLE IF EXISTS q1;
-DROP TABLE IF EXISTS q2;
CREATE TABLE t1(a INT);
CREATE TABLE m1(a INT) ENGINE = MERGE UNION (q1, q2);
CREATE TRIGGER trg1 BEFORE DELETE ON t1
@@ -3919,3 +3900,32 @@ ERROR HY000: Unable to open underlying table which is differently defined or of
DROP TRIGGER trg1;
DROP TABLE t1;
DROP TABLE m1;
+set global default_storage_engine=@save_default_storage_engine;
+#
+# End of 10.0 tests
+#
+#
+# MDEV-27407 Different ASC/DESC index attributes on MERGE and underlying table can cause wrong results
+#
+create table t (a int, key(a desc)) engine=myisam;
+create table tm (a int, key(a)) engine=merge union(t);
+select * from tm;
+ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
+drop table tm, t;
+#
+# MDEV-27586 Auto-increment does not work with DESC on MERGE table
+#
+create table t (a int not null, primary key(a desc)) engine=myisam;
+create table tm (a int not null auto_increment, primary key(a desc)) engine=merge union=(t) insert_method=first;
+insert into tm () values ();
+insert into tm () values ();
+insert into tm () values ();
+select * from tm;
+a
+3
+2
+1
+drop table tm, t;
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/main/merge.test b/mysql-test/main/merge.test
index 99cce370beb..0485f3ed1c3 100644
--- a/mysql-test/main/merge.test
+++ b/mysql-test/main/merge.test
@@ -13,12 +13,6 @@ set session default_storage_engine=myisam;
# This test assumes a stable character set
--source include/default_charset.inc
-# Clean up resources used in this test case.
---disable_warnings
-drop table if exists t1,t2,t3,t4,t5,t6;
-drop database if exists mysqltest;
---enable_warnings
-
let $MYSQLD_DATADIR= `select @@datadir`;
create table t1 (a int not null primary key auto_increment, message char(20));
create table t2 (a int not null primary key auto_increment, message char(20));
@@ -1652,10 +1646,6 @@ DROP TABLE t1;
--echo # open merge table
--echo #
---disable_warnings
-DROP TABLE IF EXISTS m1,t1;
---enable_warnings
-
CREATE TABLE t1(a int)engine=myisam;
CREATE TABLE t2(a int)engine=myisam;
CREATE TABLE t3(a int)engine=myisam;
@@ -1756,9 +1746,6 @@ DROP TABLE t2, t1;
--echo #
--echo # Bug#46339 - crash on REPAIR TABLE merge table USE_FRM
--echo #
---disable_warnings
-DROP TABLE IF EXISTS m1, t1;
---enable_warnings
#
# Test derived from a proposal of Shane Bester.
#
@@ -1893,9 +1880,6 @@ DROP TABLE t1;
--echo #
--echo # Test merge table with too many merge children.
--echo #
---disable_warnings
-drop table if exists t_parent;
---enable_warnings
set @save_table_open_cache=@@global.table_open_cache;
--echo #
--echo # Set @@global.table_open_cache to minimum
@@ -1910,9 +1894,6 @@ let $1 = `select @@table_open_cache;`;
--disable_query_log
while ($1)
{
---disable_warnings
- eval drop table if exists t$1;
---enable_warnings
eval create table t$1 (a int) engine=myisam;
eval set @a=ifnull(concat(@a, ", ", "t$1"), "t$1");
dec $1;
@@ -1956,9 +1937,6 @@ set @@global.table_open_cache=@save_table_open_cache;
#
# Test DATA/INDEX DIRECTORY
#
---disable_warnings
-DROP DATABASE IF EXISTS mysql_test1;
---enable_warnings
CREATE DATABASE mysql_test1;
--disable_query_log
# data/index directory don't work in HAVE_purify builds. Disable
@@ -2269,9 +2247,6 @@ DROP TABLE t1;
--echo # More tests with TEMPORARY MERGE table and permanent children.
--echo # First without locked tables.
--echo #
---disable_warnings
-DROP TABLE IF EXISTS t1, t2, t3, t4, m1, m2;
---enable_warnings
#
--echo #
CREATE TABLE t1 (c1 INT, c2 INT) ENGINE=MyISAM;
@@ -2590,9 +2565,6 @@ DROP TABLE t1, t2, t3, t4, m1, m2;
--echo # Test that merge tables are closed correctly when opened using
--echo # HANDLER ... OPEN.
--echo # The general case.
---disable_warnings
-DROP TABLE IF EXISTS t1, t2, t3;
---enable_warnings
connect (con1,localhost,root,,);
CREATE TABLE t1 (c1 int);
CREATE TABLE t2 (c1 int);
@@ -2648,10 +2620,6 @@ drop table t4, t3, t2, t1;
--echo # Bug#51240 ALTER TABLE of a locked MERGE table fails
--echo #
---disable_warnings
-DROP TABLE IF EXISTS m1, t1;
---enable_warnings
-
CREATE TABLE t1 (c1 INT);
CREATE TABLE m1 (c1 INT) ENGINE=MRG_MyISAM UNION=(t1);
LOCK TABLE m1 WRITE;
@@ -2677,9 +2645,6 @@ DROP TABLE m1, t1;
--echo #
--echo # Test for bug #37371 "CREATE TABLE LIKE merge loses UNION parameter"
--echo #
---disable_warnings
-drop tables if exists t1, m1, m2;
---enable_warnings
create table t1 (i int) engine=myisam;
create table m1 (i int) engine=mrg_myisam union=(t1) insert_method=first;
create table m2 like m1;
@@ -2692,9 +2657,6 @@ drop tables m1, m2, t1;
--echo # Test case for Bug#54811 "Assert in mysql_lock_have_duplicate()"
--echo # Check that unique_table() works correctly for merge tables.
--echo #
---disable_warnings
-drop table if exists t1, t2, t3, m1, m2;
---enable_warnings
create table t1 (a int);
create table t2 (a int);
create table t3 (b int);
@@ -2749,10 +2711,6 @@ drop table t1, t2, t3, m1, m2;
--echo # REPAIR of merge table
--echo #
---disable_warnings
-DROP TABLE IF EXISTS t1, t2, t_not_exists;
---enable_warnings
-
CREATE TABLE t1(a INT);
ALTER TABLE t1 engine= MERGE UNION (t_not_exists);
# This caused the segfault
@@ -2779,10 +2737,6 @@ DROP TABLE t1, t2;
--echo # for ALTER TABLE + MERGE tables
--echo #
---disable_warnings
-DROP TABLE IF EXISTS t1, m1;
---enable_warnings
-
CREATE TABLE t1(a INT) engine=myisam;
CREATE TABLE m1(a INT) engine=merge UNION(t1);
LOCK TABLES t1 READ, m1 WRITE;
@@ -2799,9 +2753,6 @@ DROP TABLE m1, t1;
--echo # Test for bug #11754210 - "45777: CHECK TABLE DOESN'T SHOW ALL
--echo # PROBLEMS FOR MERGE TABLE COMPLIANCE IN 5.1"
--echo #
---disable_warnings
-drop tables if exists t1, t2, t3, t4, m1;
---enable_warnings
create table t1(id int) engine=myisam;
create view t3 as select 1 as id;
create table t4(id int) engine=memory;
@@ -2821,8 +2772,7 @@ drop view t3;
--echo #
---echo # MDEV-10424 - Assertion `ticket == __null' failed in
---echo # MDL_request::set_type
+--echo # MDEV-10424 Assertion `ticket == __null' failed in MDL_request::set_type
--echo #
CREATE TABLE t1 (f1 INT) ENGINE=MyISAM;
CREATE TABLE tmerge (f1 INT) ENGINE=MERGE UNION=(t1);
@@ -2832,9 +2782,9 @@ EXECUTE stmt;
DEALLOCATE PREPARE stmt;
DROP TABLE t1, tmerge;
-
---echo End of 5.5 tests
-
+--echo #
+--echo # End of 5.5 tests
+--echo #
--echo #
--echo # Additional coverage for refactoring which is made as part
@@ -2843,10 +2793,7 @@ DROP TABLE t1, tmerge;
--echo #
--echo # Check that prelocking works correctly for various variants of
--echo # merge tables.
---disable_warnings
-drop table if exists t1, t2, m1;
-drop function if exists f1;
---enable_warnings
+--echo #
create table t1 (j int);
insert into t1 values (1);
create function f1() returns int return (select count(*) from m1);
@@ -2892,14 +2839,6 @@ drop tables t1, m1;
# Check effect of Bug#27480-preliminary patch:
# a merge-table with non-existing children, opened from a prelocked list.
---disable_warnings
-DROP TABLE IF EXISTS t1;
-DROP TABLE IF EXISTS m1;
-DROP TRIGGER IF EXISTS trg1;
-DROP TABLE IF EXISTS q1;
-DROP TABLE IF EXISTS q2;
---enable_warnings
-
CREATE TABLE t1(a INT);
CREATE TABLE m1(a INT) ENGINE = MERGE UNION (q1, q2);
@@ -2914,12 +2853,36 @@ DROP TRIGGER trg1;
DROP TABLE t1;
DROP TABLE m1;
---disable_result_log
---disable_query_log
set global default_storage_engine=@save_default_storage_engine;
---enable_result_log
---enable_query_log
# Check that all connections opened by test cases in this file are really
# gone so execution of other tests won't be affected by their presence.
--source include/wait_until_count_sessions.inc
+
+--echo #
+--echo # End of 10.0 tests
+--echo #
+
+--echo #
+--echo # MDEV-27407 Different ASC/DESC index attributes on MERGE and underlying table can cause wrong results
+--echo #
+create table t (a int, key(a desc)) engine=myisam;
+create table tm (a int, key(a)) engine=merge union(t);
+--error ER_WRONG_MRG_TABLE
+select * from tm;
+drop table tm, t;
+
+--echo #
+--echo # MDEV-27586 Auto-increment does not work with DESC on MERGE table
+--echo #
+create table t (a int not null, primary key(a desc)) engine=myisam;
+create table tm (a int not null auto_increment, primary key(a desc)) engine=merge union=(t) insert_method=first;
+insert into tm () values ();
+insert into tm () values ();
+insert into tm () values ();
+select * from tm;
+drop table tm, t;
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/main/metadata.result b/mysql-test/main/metadata.result
index 175b09e5a2b..5786e2fd461 100644
--- a/mysql-test/main/metadata.result
+++ b/mysql-test/main/metadata.result
@@ -553,19 +553,19 @@ d0l d09 d10
# MDEV-12862 Data type of @a:=1e0 depends on the session character set
#
SET NAMES utf8;
-CREATE TABLE t1 AS SELECT @:=1e0;
+CREATE TABLE t1 AS SELECT @a:=1e0;
SELECT * FROM t1;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def test t1 t1 @:=1e0 @:=1e0 5 3 1 N 36865 31 63
-@:=1e0
+def test t1 t1 @a:=1e0 @a:=1e0 5 3 1 N 36865 31 63
+@a:=1e0
1
DROP TABLE t1;
SET NAMES latin1;
-CREATE TABLE t1 AS SELECT @:=1e0;
+CREATE TABLE t1 AS SELECT @a:=1e0;
SELECT * FROM t1;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def test t1 t1 @:=1e0 @:=1e0 5 3 1 N 36865 31 63
-@:=1e0
+def test t1 t1 @a:=1e0 @a:=1e0 5 3 1 N 36865 31 63
+@a:=1e0
1
DROP TABLE t1;
#
diff --git a/mysql-test/main/metadata.test b/mysql-test/main/metadata.test
index eade0e0ff01..6cbf99d16b7 100644
--- a/mysql-test/main/metadata.test
+++ b/mysql-test/main/metadata.test
@@ -347,11 +347,11 @@ SELECT
--echo #
--enable_metadata
SET NAMES utf8;
-CREATE TABLE t1 AS SELECT @:=1e0;
+CREATE TABLE t1 AS SELECT @a:=1e0;
SELECT * FROM t1;
DROP TABLE t1;
SET NAMES latin1;
-CREATE TABLE t1 AS SELECT @:=1e0;
+CREATE TABLE t1 AS SELECT @a:=1e0;
SELECT * FROM t1;
DROP TABLE t1;
--disable_metadata
diff --git a/mysql-test/main/multi_update.result b/mysql-test/main/multi_update.result
index d6cf9ba685f..2112c6d5480 100644
--- a/mysql-test/main/multi_update.result
+++ b/mysql-test/main/multi_update.result
@@ -1184,22 +1184,28 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "partitions": ["Current"],
- "access_type": "system",
- "possible_keys": ["PRIMARY"],
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "t1",
- "partitions": ["Current"],
- "access_type": "system",
- "possible_keys": ["PRIMARY"],
- "rows": 1,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "partitions": ["Current"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "partitions": ["Current"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
}
}
# Expecting partition "Relevant"
@@ -1208,22 +1214,28 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "partitions": ["Relevant"],
- "access_type": "system",
- "possible_keys": ["PRIMARY"],
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "t1",
- "partitions": ["Relevant"],
- "access_type": "system",
- "possible_keys": ["PRIMARY"],
- "rows": 1,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "partitions": ["Relevant"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "partitions": ["Relevant"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
}
}
# Expecting partition "Archive"
@@ -1232,22 +1244,28 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "partitions": ["Archive"],
- "access_type": "system",
- "possible_keys": ["PRIMARY"],
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "t1",
- "partitions": ["Archive"],
- "access_type": "system",
- "possible_keys": ["PRIMARY"],
- "rows": 1,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "partitions": ["Archive"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "partitions": ["Archive"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ]
}
}
DROP TABLES t1, t2;
diff --git a/mysql-test/main/my_print_defaults.result b/mysql-test/main/my_print_defaults.result
index 64aa7b45ca8..45765de0a1a 100644
--- a/mysql-test/main/my_print_defaults.result
+++ b/mysql-test/main/my_print_defaults.result
@@ -14,10 +14,6 @@
#
# MDEV-25908: -e does not work for my_print_defaults
#
-# Testing -e
---key_buffer_size=20M
---max_allowed_packet=250M
---table_open_cache=1000
#Testing --defaults-extra-file
--key_buffer_size=20M
--max_allowed_packet=250M
@@ -25,27 +21,38 @@
#
# Testing other options
#
-# Testing -c option
---key_buffer_size=20M
---max_allowed_packet=250M
---table_open_cache=1000
# Testing --defaults-file
--key_buffer_size=20M
--max_allowed_packet=250M
--table_open_cache=1000
-# Testing -g option
+# Testing --defaults-group-suffix
--key_buffer_size=20M
--max_allowed_packet=250M
--table_open_cache=1000
--table_definition_cache=2000
--read_buffer_size=1M
--thread_cache_size=8
-# Testing --defaults-group-suffix
+# Testing --no-defaults
+# End of 10.5 Test
+# Beginning of 10.7 test
+#
+# MDEV-26238: Remove inconsistent behaviour of --default-* options in
+# my_print_defaults
+#
+# checking that --defaults* option only works when mentioned at beginning
+# Testing --defaults-file at beginning only
+--key_buffer_size=20M
+--max_allowed_packet=250M
+--table_open_cache=1000
+# Testing --defaults-extra-file works at beginning only
+--key_buffer_size=20M
+--max_allowed_packet=250M
+--table_open_cache=1000
+# Testing --defaults-group-suffix works at beginning only
--key_buffer_size=20M
--max_allowed_packet=250M
--table_open_cache=1000
--table_definition_cache=2000
--read_buffer_size=1M
--thread_cache_size=8
-# Testing --no-defaults
-# End of 10.5 Test
+# End of 10.7 test
diff --git a/mysql-test/main/my_print_defaults.test b/mysql-test/main/my_print_defaults.test
index bfd4e563826..bb650f49e83 100644
--- a/mysql-test/main/my_print_defaults.test
+++ b/mysql-test/main/my_print_defaults.test
@@ -30,7 +30,7 @@ long_query_time=60
slow_query_log=1
EOF
---exec $MYSQL_MY_PRINT_DEFAULTS --defaults-extra-file=$MYSQLTEST_VARDIR/tmp/tmp1.cnf -c $MYSQLTEST_VARDIR/tmp/tmp2.cnf --mysqld mysql.server
+--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-extra-file=$MYSQLTEST_VARDIR/tmp/tmp1.cnf --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp2.cnf --mysqld mysql.server
--remove_file $MYSQLTEST_VARDIR/tmp/tmp1.cnf
--remove_file $MYSQLTEST_VARDIR/tmp/tmp2.cnf
@@ -55,10 +55,8 @@ max_allowed_packet=250M
table_open_cache=1000
EOF
---echo # Testing -e
---exec $MYSQL_MY_PRINT_DEFAULTS -e $MYSQLTEST_VARDIR/tmp/tmp1.cnf -c $MYSQLTEST_VARDIR/tmp/tmp2.cnf --mysqld mysql.server
--echo #Testing --defaults-extra-file
---exec $MYSQL_MY_PRINT_DEFAULTS --defaults-extra-file=$MYSQLTEST_VARDIR/tmp/tmp1.cnf -c $MYSQLTEST_VARDIR/tmp/tmp2.cnf --mysqld mysql.server
+--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-extra-file=$MYSQLTEST_VARDIR/tmp/tmp1.cnf --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp2.cnf --mysqld mysql.server
--remove_file $MYSQLTEST_VARDIR/tmp/tmp1.cnf
--remove_file $MYSQLTEST_VARDIR/tmp/tmp2.cnf
@@ -87,20 +85,80 @@ read_buffer_size=1M
thread_cache_size=8
EOF
---echo # Testing -c option
---exec $MYSQL_MY_PRINT_DEFAULTS -c $MYSQLTEST_VARDIR/tmp/tmp2.cnf --mysqld mysql.server
--echo # Testing --defaults-file
--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp2.cnf --mysqld mysql.server
---echo # Testing -g option
---exec $MYSQL_MY_PRINT_DEFAULTS -c $MYSQLTEST_VARDIR/tmp/tmp3.cnf --mysqld mysql.server -g .1
--echo # Testing --defaults-group-suffix
---exec $MYSQL_MY_PRINT_DEFAULTS -c $MYSQLTEST_VARDIR/tmp/tmp3.cnf --mysqld mysql.server --defaults-group-suffix=.1
+--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp3.cnf --defaults-group-suffix=.1 --mysqld mysql.server
--echo # Testing --no-defaults
---exec $MYSQL_MY_PRINT_DEFAULTS --no-defaults
+--exec $MYSQL_MY_PRINT_DEFAULTS --no-defaults --mysqld
--remove_file $MYSQLTEST_VARDIR/tmp/tmp2.cnf
--remove_file $MYSQLTEST_VARDIR/tmp/tmp3.cnf
--echo # End of 10.5 Test
+
+--echo # Beginning of 10.7 test
+
+--echo #
+--echo # MDEV-26238: Remove inconsistent behaviour of --default-* options in
+--echo # my_print_defaults
+--echo #
+
+--write_file $MYSQLTEST_VARDIR/tmp/tmp1.cnf
+[mariadb]
+key_buffer_size=20M
+max_allowed_packet=250M
+table_open_cache=1000
+EOF
+
+--write_file $MYSQLTEST_VARDIR/tmp/tmp2.cnf
+[mariadb]
+key_buffer_size=10M
+max_allowed_packet=250M
+table_open_cache=1000
+EOF
+
+--write_file $MYSQLTEST_VARDIR/tmp/tmp3.cnf
+[mariadb]
+key_buffer_size=30M
+max_allowed_packet=250M
+table_open_cache=1000
+EOF
+
+--echo # checking that --defaults* option only works when mentioned at beginning
+
+--echo # Testing --defaults-file at beginning only
+--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp1.cnf --mysqld
+--error 7
+--exec $MYSQL_MY_PRINT_DEFAULTS --mysqld --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp1.cnf
+--remove_file $MYSQLTEST_VARDIR/tmp/tmp3.cnf
+
+--echo # Testing --defaults-extra-file works at beginning only
+--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp1.cnf --defaults-extra-file=$MYSQLTEST_VARDIR/tmp/tmp2.cnf --mysqld
+--error 7
+--exec $MYSQL_MY_PRINT_DEFAULTS --mysqld --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp1.cnf --defaults-extra-file=$MYSQLTEST_VARDIR/tmp/tmp2.cnf
+
+--write_file $MYSQLTEST_VARDIR/tmp/tmp3.cnf
+[mariadb]
+key_buffer_size=20M
+max_allowed_packet=250M
+table_open_cache=1000
+
+[mariadb.1]
+table_definition_cache=2000
+read_buffer_size=1M
+thread_cache_size=8
+EOF
+
+--echo # Testing --defaults-group-suffix works at beginning only
+--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp3.cnf --defaults-group-suffix=.1 --mysqld
+--error 7
+--exec $MYSQL_MY_PRINT_DEFAULTS --mysqld --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp3.cnf --defaults-group-suffix=.1
+
+--remove_file $MYSQLTEST_VARDIR/tmp/tmp1.cnf
+--remove_file $MYSQLTEST_VARDIR/tmp/tmp2.cnf
+--remove_file $MYSQLTEST_VARDIR/tmp/tmp3.cnf
+
+--echo # End of 10.7 test
diff --git a/mysql-test/main/myisam-optimize.result b/mysql-test/main/myisam-optimize.result
deleted file mode 100644
index 63cdcd9f248..00000000000
--- a/mysql-test/main/myisam-optimize.result
+++ /dev/null
@@ -1,83 +0,0 @@
-#
-# MDEV-8475 stale .TMM file causes Aria engine to stop serving the table
-#
-create table t1 (pk int primary key, i int) engine=MyISAM;
-insert into t1 values (1,1),(2,2);
-connect con1,localhost,root,,;
-SHOW CREATE TABLE t1;
-Table Create Table
-t1 CREATE TABLE `t1` (
- `pk` int(11) NOT NULL,
- `i` int(11) DEFAULT NULL,
- PRIMARY KEY (`pk`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-OPTIMIZE TABLE t1;
-Table Op Msg_type Msg_text
-test.t1 optimize status OK
-disconnect con1;
-connect con1,localhost,root,,;
-SHOW CREATE TABLE t1;
-Table Create Table
-t1 CREATE TABLE `t1` (
- `pk` int(11) NOT NULL,
- `i` int(11) DEFAULT NULL,
- PRIMARY KEY (`pk`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-OPTIMIZE TABLE t1;
-Table Op Msg_type Msg_text
-test.t1 optimize status Table is already up to date
-disconnect con1;
-connect con1,localhost,root,,;
-SHOW CREATE TABLE t1;
-Table Create Table
-t1 CREATE TABLE `t1` (
- `pk` int(11) NOT NULL,
- `i` int(11) DEFAULT NULL,
- PRIMARY KEY (`pk`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-OPTIMIZE TABLE t1;
-Table Op Msg_type Msg_text
-test.t1 optimize status Table is already up to date
-disconnect con1;
-connection default;
-DROP TABLE t1;
-create table t1 (pk int primary key, i int) engine=aria;
-insert into t1 values (1,1),(2,2);
-connect con1,localhost,root,,;
-SHOW CREATE TABLE t1;
-Table Create Table
-t1 CREATE TABLE `t1` (
- `pk` int(11) NOT NULL,
- `i` int(11) DEFAULT NULL,
- PRIMARY KEY (`pk`)
-) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
-OPTIMIZE TABLE t1;
-Table Op Msg_type Msg_text
-test.t1 optimize status OK
-disconnect con1;
-connect con1,localhost,root,,;
-SHOW CREATE TABLE t1;
-Table Create Table
-t1 CREATE TABLE `t1` (
- `pk` int(11) NOT NULL,
- `i` int(11) DEFAULT NULL,
- PRIMARY KEY (`pk`)
-) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
-OPTIMIZE TABLE t1;
-Table Op Msg_type Msg_text
-test.t1 optimize status Table is already up to date
-disconnect con1;
-connect con1,localhost,root,,;
-SHOW CREATE TABLE t1;
-Table Create Table
-t1 CREATE TABLE `t1` (
- `pk` int(11) NOT NULL,
- `i` int(11) DEFAULT NULL,
- PRIMARY KEY (`pk`)
-) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
-OPTIMIZE TABLE t1;
-Table Op Msg_type Msg_text
-test.t1 optimize status Table is already up to date
-disconnect con1;
-connection default;
-DROP TABLE t1;
diff --git a/mysql-test/main/myisam-optimize.test b/mysql-test/main/myisam-optimize.test
deleted file mode 100644
index 44e38e1e708..00000000000
--- a/mysql-test/main/myisam-optimize.test
+++ /dev/null
@@ -1,60 +0,0 @@
---echo #
---echo # MDEV-8475 stale .TMM file causes Aria engine to stop serving the table
---echo #
---disable_service_connection
-create table t1 (pk int primary key, i int) engine=MyISAM;
-insert into t1 values (1,1),(2,2);
---let $datadir=`SELECT @@datadir`
-
---write_file $datadir/test/t1.TMM
-EOF
-
---connect (con1,localhost,root,,)
-SHOW CREATE TABLE t1;
-OPTIMIZE TABLE t1;
---disconnect con1
-
---connect (con1,localhost,root,,)
-SHOW CREATE TABLE t1;
-OPTIMIZE TABLE t1;
---disconnect con1
-
---connect (con1,localhost,root,,)
-SHOW CREATE TABLE t1;
-OPTIMIZE TABLE t1;
---disconnect con1
-
-# Cleanup
---connection default
-DROP TABLE t1;
-
-#
-# Test also Aria
-#
-
-create table t1 (pk int primary key, i int) engine=aria;
-insert into t1 values (1,1),(2,2);
---let $datadir=`SELECT @@datadir`
-
---write_file $datadir/test/t1.TMM
-EOF
-
---connect (con1,localhost,root,,)
-SHOW CREATE TABLE t1;
-OPTIMIZE TABLE t1;
---disconnect con1
-
---connect (con1,localhost,root,,)
-SHOW CREATE TABLE t1;
-OPTIMIZE TABLE t1;
---disconnect con1
-
---connect (con1,localhost,root,,)
-SHOW CREATE TABLE t1;
-OPTIMIZE TABLE t1;
---disconnect con1
-
-# Cleanup
---connection default
-DROP TABLE t1;
---enable_service_connection
diff --git a/mysql-test/main/myisam.result b/mysql-test/main/myisam.result
index 1b6a5cba915..0b0099d7b84 100644
--- a/mysql-test/main/myisam.result
+++ b/mysql-test/main/myisam.result
@@ -1,6 +1,5 @@
call mtr.add_suppression("Can't find record in '.*'");
call mtr.add_suppression("Table 't1' is marked as crashed and should be repaired");
-drop table if exists t1,t2,t3;
SET SQL_WARNINGS=1;
CREATE TABLE t1 (
STRING_DATA char(255) default NULL,
@@ -2706,3 +2705,108 @@ DROP TABLE t1;
#
# End of 5.5 tests
#
+#
+# MDEV-27303 Table corruption after insert into a non-InnoDB table with DESC index
+#
+create table t1 (
+a bigint default 0,
+b bigint default 0,
+c binary(128) not null,
+d datetime default '0000-00-00 00:00:00',
+key (c desc,b,d,a)
+) engine=aria;
+insert into t1 (c) values
+('xx'),('bb'),('tt'),('pp'),('mm'),('yy'),('rr'),('bb'),('yy'),('gg'),
+('dd'),('fx'),('wi'),('ix'),('ox'),('mu'),('ux'),('pm'),('mx'),('xu'),
+('ul'),('lp'),('px'),('lp'),('xx'),('pq'),('qs'),('se'),('ee'),('xx'),
+('rv'),('ff'),('vj'),('jy'),('yn'),('nc'),('nx'),('hj'),('ji'),('ik'),
+('kk'),('ww'),('xx'),('yd'),('dw'),('wk'),('kr'),('dd'),('rj'),('jf'),
+('bx'),('fc'),('cp'),('pm'),('mw'),('wy'),('yl'),('li'),('ic'),('he'),
+('ci'),('il'),('lz'),('zd'),('gz'),('xd'),('ze'),('dm'),('ms'),('xd'),
+('sw'),('we'),('nb'),('tx'),('vr'),('xw'),('aa'),('ah'),('hd'),('jl'),
+('lf'),('fw'),('wx'),('xh'),('hr'),('zx'),('vw'),('rm'),('mx'),('xt'),
+('tp'),('ps'),('sh'),('ga'),('df'),('as'),('gz'),('xd'),('yy'),('xr');
+check table t1 extended;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+drop table t1;
+#
+# MDEV-27309 Server crash or ASAN memcpy-param-overlap upon INSERT into Aria/MyISAM table with DESC key
+#
+CREATE TABLE t1 (id INT, c BINARY(80), PRIMARY KEY(id));
+ALTER TABLE t1 ADD KEY(c DESC, id);
+INSERT INTO t1 VALUES (1,NULL),(2,''),(3,'');
+DROP TABLE t1;
+#
+# MDEV-27330 Wrong sorting order with DESC index and empty strings in MyISAM/Aria table
+#
+create table t (id int, c char(128) not null, key (c desc));
+insert into t values (1,''),(2,'foo'),(3,''),(4,'bar');
+select c from t order by c;
+c
+
+
+bar
+foo
+drop table t;
+#
+# MDEV-27340 NULL gets lost (becomes empty string), SELECT hangs with DESC index on MyISAM/Aria table
+#
+create table t (c char(8), key(c desc)) character set utf8mb4;
+insert into t values (''),('foo'),(null),(''),('bar');
+check table t;
+Table Op Msg_type Msg_text
+test.t check status OK
+check table t extended;
+Table Op Msg_type Msg_text
+test.t check status OK
+select distinct c from t;
+c
+NULL
+
+bar
+foo
+select c from t;
+c
+foo
+bar
+
+
+NULL
+drop table t;
+#
+# MDEV-27434 DESC attribute does not work with auto-increment on secondary column of multi-part index
+#
+create table t (a int auto_increment, b int, unique(b,a desc)) engine=myisam;
+insert ignore into t (b) values (10),(10),(10);
+select * from t;
+a b
+3 10
+2 10
+1 10
+drop table t;
+#
+# MDEV-27585 Auto-increment on secondary column increments unexpectedly with DESC key
+#
+create table t (c char(16), i int auto_increment, index (c,i desc)) engine=myisam collate latin1_swedish_ci;
+insert into t (c) values ('ä'),('a');
+select hex(c),c,i from t order by c, i;
+hex(c) c i
+61 a 1
+C3A4 ä 1
+drop table t;
+#
+# MDEV-27617 HANDLER KEY > (x) does not work with DESC keys, Spider is affected and returns wrong results
+#
+create table t (a int, b char(1), primary key(a desc)) engine=myisam;
+insert into t VALUES (1,'f'),(2,'g'),(3,'j'), (4,'i'),(5,'h');
+handler t open;
+# MUST return 2,'g'. '>' always means READ_AFTER_KEY. desc or not.
+handler t read `primary` > (3);
+a b
+2 g
+handler t close;
+drop table t;
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/main/myisam.test b/mysql-test/main/myisam.test
index 58d094d7d08..ec49e71bc2d 100644
--- a/mysql-test/main/myisam.test
+++ b/mysql-test/main/myisam.test
@@ -8,9 +8,6 @@ call mtr.add_suppression("Can't find record in '.*'");
call mtr.add_suppression("Table 't1' is marked as crashed and should be repaired");
# Initialise
---disable_warnings
-drop table if exists t1,t2,t3;
---enable_warnings
SET SQL_WARNINGS=1;
#
@@ -1831,3 +1828,85 @@ DROP TABLE t1;
--echo #
--echo # End of 5.5 tests
--echo #
+
+--echo #
+--echo # MDEV-27303 Table corruption after insert into a non-InnoDB table with DESC index
+--echo #
+create table t1 (
+ a bigint default 0,
+ b bigint default 0,
+ c binary(128) not null,
+ d datetime default '0000-00-00 00:00:00',
+ key (c desc,b,d,a)
+) engine=aria;
+insert into t1 (c) values
+ ('xx'),('bb'),('tt'),('pp'),('mm'),('yy'),('rr'),('bb'),('yy'),('gg'),
+ ('dd'),('fx'),('wi'),('ix'),('ox'),('mu'),('ux'),('pm'),('mx'),('xu'),
+ ('ul'),('lp'),('px'),('lp'),('xx'),('pq'),('qs'),('se'),('ee'),('xx'),
+ ('rv'),('ff'),('vj'),('jy'),('yn'),('nc'),('nx'),('hj'),('ji'),('ik'),
+ ('kk'),('ww'),('xx'),('yd'),('dw'),('wk'),('kr'),('dd'),('rj'),('jf'),
+ ('bx'),('fc'),('cp'),('pm'),('mw'),('wy'),('yl'),('li'),('ic'),('he'),
+ ('ci'),('il'),('lz'),('zd'),('gz'),('xd'),('ze'),('dm'),('ms'),('xd'),
+ ('sw'),('we'),('nb'),('tx'),('vr'),('xw'),('aa'),('ah'),('hd'),('jl'),
+ ('lf'),('fw'),('wx'),('xh'),('hr'),('zx'),('vw'),('rm'),('mx'),('xt'),
+ ('tp'),('ps'),('sh'),('ga'),('df'),('as'),('gz'),('xd'),('yy'),('xr');
+check table t1 extended;
+drop table t1;
+
+--echo #
+--echo # MDEV-27309 Server crash or ASAN memcpy-param-overlap upon INSERT into Aria/MyISAM table with DESC key
+--echo #
+CREATE TABLE t1 (id INT, c BINARY(80), PRIMARY KEY(id));
+ALTER TABLE t1 ADD KEY(c DESC, id);
+INSERT INTO t1 VALUES (1,NULL),(2,''),(3,'');
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-27330 Wrong sorting order with DESC index and empty strings in MyISAM/Aria table
+--echo #
+create table t (id int, c char(128) not null, key (c desc));
+insert into t values (1,''),(2,'foo'),(3,''),(4,'bar');
+select c from t order by c;
+drop table t;
+
+--echo #
+--echo # MDEV-27340 NULL gets lost (becomes empty string), SELECT hangs with DESC index on MyISAM/Aria table
+--echo #
+create table t (c char(8), key(c desc)) character set utf8mb4;
+insert into t values (''),('foo'),(null),(''),('bar');
+check table t;
+check table t extended;
+select distinct c from t;
+select c from t;
+drop table t;
+
+--echo #
+--echo # MDEV-27434 DESC attribute does not work with auto-increment on secondary column of multi-part index
+--echo #
+create table t (a int auto_increment, b int, unique(b,a desc)) engine=myisam;
+insert ignore into t (b) values (10),(10),(10);
+select * from t;
+drop table t;
+
+--echo #
+--echo # MDEV-27585 Auto-increment on secondary column increments unexpectedly with DESC key
+--echo #
+create table t (c char(16), i int auto_increment, index (c,i desc)) engine=myisam collate latin1_swedish_ci;
+insert into t (c) values ('ä'),('a');
+select hex(c),c,i from t order by c, i;
+drop table t;
+
+--echo #
+--echo # MDEV-27617 HANDLER KEY > (x) does not work with DESC keys, Spider is affected and returns wrong results
+--echo #
+create table t (a int, b char(1), primary key(a desc)) engine=myisam;
+insert into t VALUES (1,'f'),(2,'g'),(3,'j'), (4,'i'),(5,'h');
+handler t open;
+--echo # MUST return 2,'g'. '>' always means READ_AFTER_KEY. desc or not.
+handler t read `primary` > (3);
+handler t close;
+drop table t;
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/main/myisam_optimize.result b/mysql-test/main/myisam_optimize.result
index f71d524fadb..28c9caa83b2 100644
--- a/mysql-test/main/myisam_optimize.result
+++ b/mysql-test/main/myisam_optimize.result
@@ -43,3 +43,86 @@ i
UNLOCK TABLES;
DROP TABLE t1;
# End of 10.0 tests
+#
+# MDEV-8475 stale .TMM file causes Aria engine to stop serving the table
+#
+create table t1 (pk int primary key, i int) engine=MyISAM;
+insert into t1 values (1,1),(2,2);
+connect con1,localhost,root,,;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `pk` int(11) NOT NULL,
+ `i` int(11) DEFAULT NULL,
+ PRIMARY KEY (`pk`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+OPTIMIZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 optimize status OK
+disconnect con1;
+connect con1,localhost,root,,;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `pk` int(11) NOT NULL,
+ `i` int(11) DEFAULT NULL,
+ PRIMARY KEY (`pk`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+OPTIMIZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 optimize status Table is already up to date
+disconnect con1;
+connect con1,localhost,root,,;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `pk` int(11) NOT NULL,
+ `i` int(11) DEFAULT NULL,
+ PRIMARY KEY (`pk`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+OPTIMIZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 optimize status Table is already up to date
+disconnect con1;
+connection default;
+DROP TABLE t1;
+create table t1 (pk int primary key, i int) engine=aria;
+insert into t1 values (1,1),(2,2);
+connect con1,localhost,root,,;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `pk` int(11) NOT NULL,
+ `i` int(11) DEFAULT NULL,
+ PRIMARY KEY (`pk`)
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+OPTIMIZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 optimize status OK
+disconnect con1;
+connect con1,localhost,root,,;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `pk` int(11) NOT NULL,
+ `i` int(11) DEFAULT NULL,
+ PRIMARY KEY (`pk`)
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+OPTIMIZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 optimize status Table is already up to date
+disconnect con1;
+connect con1,localhost,root,,;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `pk` int(11) NOT NULL,
+ `i` int(11) DEFAULT NULL,
+ PRIMARY KEY (`pk`)
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+OPTIMIZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 optimize status Table is already up to date
+disconnect con1;
+connection default;
+DROP TABLE t1;
diff --git a/mysql-test/main/myisam_optimize.test b/mysql-test/main/myisam_optimize.test
index 82096f0b4e3..44215fd2848 100644
--- a/mysql-test/main/myisam_optimize.test
+++ b/mysql-test/main/myisam_optimize.test
@@ -64,4 +64,64 @@ UNLOCK TABLES;
DROP TABLE t1;
--echo # End of 10.0 tests
+--echo #
+--echo # MDEV-8475 stale .TMM file causes Aria engine to stop serving the table
+--echo #
+create table t1 (pk int primary key, i int) engine=MyISAM;
+insert into t1 values (1,1),(2,2);
+--let $datadir=`SELECT @@datadir`
+
+--write_file $datadir/test/t1.TMM
+EOF
+
+--connect (con1,localhost,root,,)
+SHOW CREATE TABLE t1;
+OPTIMIZE TABLE t1;
+--disconnect con1
+
+--connect (con1,localhost,root,,)
+SHOW CREATE TABLE t1;
+OPTIMIZE TABLE t1;
+--disconnect con1
+
+--connect (con1,localhost,root,,)
+SHOW CREATE TABLE t1;
+OPTIMIZE TABLE t1;
+--disconnect con1
+
+# Cleanup
+--connection default
+DROP TABLE t1;
+
+#
+# Test also Aria
+#
+
+create table t1 (pk int primary key, i int) engine=aria;
+insert into t1 values (1,1),(2,2);
+--let $datadir=`SELECT @@datadir`
+
+--write_file $datadir/test/t1.TMM
+EOF
+
+--connect (con1,localhost,root,,)
+SHOW CREATE TABLE t1;
+OPTIMIZE TABLE t1;
+--disconnect con1
+
+--connect (con1,localhost,root,,)
+SHOW CREATE TABLE t1;
+OPTIMIZE TABLE t1;
+--disconnect con1
+
+--connect (con1,localhost,root,,)
+SHOW CREATE TABLE t1;
+OPTIMIZE TABLE t1;
+--disconnect con1
+
+# Cleanup
+--connection default
+DROP TABLE t1;
+
--enable_service_connection
+
diff --git a/mysql-test/main/mysql.result b/mysql-test/main/mysql.result
index 5363bcd12b2..0b91b513b17 100644
--- a/mysql-test/main/mysql.result
+++ b/mysql-test/main/mysql.result
@@ -558,7 +558,9 @@ CREATE TABLE `a1\``b1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `a1\``b1` VALUES (1),(2);
+INSERT INTO `a1\``b1` VALUES
+(1),
+(2);
insert `a1\``b1` values (4),(5);
show create table `a1\``b1`;
Table Create Table
@@ -587,7 +589,9 @@ CREATE TABLE "a1\""b1" (
"a" int(11) DEFAULT NULL
);
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO "a1\""b1" VALUES (1),(2);
+INSERT INTO "a1\""b1" VALUES
+(1),
+(2);
insert "a1\""b1" values (4),(5);
show create table "a1\""b1";
Table Create Table
@@ -603,11 +607,11 @@ set sql_mode=default;
create table t1 (a text);
select count(*) from t1;
count(*)
-41
+43
truncate table t1;
select count(*) from t1;
count(*)
-41
+43
truncate table t1;
select count(*) from t1;
count(*)
@@ -619,7 +623,7 @@ count(*)
truncate table t1;
select count(*) from t1;
count(*)
-41
+43
truncate table t1;
select count(*) from t1;
count(*)
diff --git a/mysql-test/main/mysql_install_db_win_utf8.result b/mysql-test/main/mysql_install_db_win_utf8.result
new file mode 100644
index 00000000000..744c982b291
--- /dev/null
+++ b/mysql-test/main/mysql_install_db_win_utf8.result
@@ -0,0 +1,14 @@
+Running bootstrap
+Creating my.ini file
+Removing default user
+Allowing remote access for user root
+Setting root password
+Creation of the database was successful
+# Kill the server
+connect con1,localhost,root,パスワード,mysql;
+SELECT @@datadir;
+@@datadir
+DATADIR/
+# Kill the server
+connection default;
+# restart
diff --git a/mysql-test/main/mysql_install_db_win_utf8.test b/mysql-test/main/mysql_install_db_win_utf8.test
new file mode 100644
index 00000000000..fc67b66d3ca
--- /dev/null
+++ b/mysql-test/main/mysql_install_db_win_utf8.test
@@ -0,0 +1,35 @@
+--source include/windows.inc
+--source include/check_utf8_cli.inc
+
+# Create database in tmp directory using mysql_install_db.exe,
+# and start server from this directory.
+let $ddir= $MYSQLTEST_VARDIR/tmp/датадир;
+--error 0,1
+rmdir $ddir;
+exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --password=パスワード -R;
+--source include/kill_mysqld.inc
+
+# Note "restart" via MTR does not work, if server's command line has
+# non-ASCII characters used (or, characters outside of ANSI codepage).
+# This is a perl limitation, which is worked around in this test -
+# the server started in background, via exec $MYSQLD
+
+--replace_result $MYSQLD MYSQLD $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
+exec $MYSQLD --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffix=.1 --datadir=$ddir --loose-innodb > NUL 2>&1 &;
+--enable_reconnect
+--source include/wait_until_connected_again.inc
+--disable_reconnect
+
+connect (con1,localhost,root,パスワード,mysql);
+
+# Smoke test - check that we're actually using datadir
+# we've created (i.e restart_parameters worked)
+--replace_result $ddir DATADIR
+SELECT @@datadir;
+# restart in the original datadir again
+--source include/kill_mysqld.inc
+rmdir $ddir;
+
+connection default;
+--source include/start_mysqld.inc
+
diff --git a/mysql-test/main/mysql_upgrade.result b/mysql-test/main/mysql_upgrade.result
index b4c42d6828d..f119937bf59 100644
--- a/mysql-test/main/mysql_upgrade.result
+++ b/mysql-test/main/mysql_upgrade.result
@@ -1,4 +1,5 @@
set sql_mode="";
+call mtr.add_suppression("Incorrect definition of table mysql.column_stats:.*");
Run mysql_upgrade once
Phase 1/7: Checking and upgrading mysql database
Processing databases
diff --git a/mysql-test/main/mysql_upgrade.test b/mysql-test/main/mysql_upgrade.test
index 0751cee7429..b9ff05401f7 100644
--- a/mysql-test/main/mysql_upgrade.test
+++ b/mysql-test/main/mysql_upgrade.test
@@ -6,6 +6,7 @@
set sql_mode="";
+call mtr.add_suppression("Incorrect definition of table mysql.column_stats:.*");
#
# Basic test that we can run mysql_upgrde and that it finds the
# expected binaries it uses.
diff --git a/mysql-test/main/mysqld--help.result b/mysql-test/main/mysqld--help.result
index a3dac7fcfcb..4e1563086bf 100644
--- a/mysql-test/main/mysqld--help.result
+++ b/mysql-test/main/mysqld--help.result
@@ -42,6 +42,9 @@ The following specify which files/extra groups are read (specified before remain
full' errors. No longer needed, as the server now handles
this automatically.
--bind-address=name IP address to bind to.
+ --binlog-alter-two-phase
+ When set, split ALTER at binary logging into 2
+ statements: START ALTER and COMMIT/ROLLBACK ALTER
--binlog-annotate-row-events
Tells the master to annotate RBR events with the
statement that caused these events
@@ -370,7 +373,8 @@ The following specify which files/extra groups are read (specified before remain
Specifies type of the histograms created by ANALYZE.
Possible values are: SINGLE_PREC_HB - single precision
height-balanced, DOUBLE_PREC_HB - double precision
- height-balanced.
+ height-balanced, JSON_HB - height-balanced, stored as
+ JSON.
--host-cache-size=# How many host names should be cached to avoid resolving.
(Automatically configured unless set explicitly)
--idle-readonly-transaction-timeout=#
@@ -1479,6 +1483,7 @@ automatic-sp-privileges TRUE
back-log 80
big-tables FALSE
bind-address (No default value)
+binlog-alter-two-phase FALSE
binlog-annotate-row-events TRUE
binlog-cache-size 32768
binlog-checksum CRC32
@@ -1713,7 +1718,7 @@ performance-schema-max-socket-classes 10
performance-schema-max-socket-instances -1
performance-schema-max-sql-text-length 1024
performance-schema-max-stage-classes 160
-performance-schema-max-statement-classes 222
+performance-schema-max-statement-classes 221
performance-schema-max-statement-stack 10
performance-schema-max-table-handles -1
performance-schema-max-table-instances -1
diff --git a/mysql-test/main/mysqld--help.test b/mysql-test/main/mysqld--help.test
index f918670d319..42f551974d9 100644
--- a/mysql-test/main/mysqld--help.test
+++ b/mysql-test/main/mysqld--help.test
@@ -27,16 +27,18 @@ perl;
large-files-support lower-case-file-system system-time-zone
collation-server character-set-server log-tc-size table-cache
table-open-cache table-open-cache-instances max-connections
- tls-version version.*/;
+ tls-version version.* password-reuse-check
+ password-reuse-check-interval/;
# Plugins which may or may not be there:
@plugins=qw/innodb archive blackhole federated partition s3
feedback debug temp-pool ssl des-key-file xtradb sequence
thread-concurrency super-large-pages mutex-deadlock-detector
connect null-audit aria oqgraph sphinx thread-handling
- test-sql-discovery query-cache-info
+ test-sql-discovery query-cache-info password-reuse-check
query-response-time metadata-lock-info locales unix-socket
wsrep file-key-management cracklib-password-check user-variables
+ provider-bzip2 provider-lzma provider-lzo
thread-pool-groups thread-pool-queues thread-pool-stats thread-pool-waits/;
# And substitute the content some environment variables with their
diff --git a/mysql-test/main/mysqldump-max.result b/mysql-test/main/mysqldump-max.result
index eb2cf2aec08..7dd1030eac1 100644
--- a/mysql-test/main/mysqldump-max.result
+++ b/mysql-test/main/mysqldump-max.result
@@ -102,7 +102,12 @@ CREATE TABLE `t1` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t1` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED IGNORE INTO `t1` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
DROP TABLE IF EXISTS `t2`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -114,7 +119,12 @@ CREATE TABLE `t2` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t2` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED IGNORE INTO `t2` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
DROP TABLE IF EXISTS `t3`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -126,7 +136,12 @@ CREATE TABLE `t3` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t3` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED IGNORE INTO `t3` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t3` ENABLE KEYS */;
DROP TABLE IF EXISTS `t4`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -138,7 +153,12 @@ CREATE TABLE `t4` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t4` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED IGNORE INTO `t4` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t4` ENABLE KEYS */;
DROP TABLE IF EXISTS `t5`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -150,7 +170,12 @@ CREATE TABLE `t5` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t5` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED IGNORE INTO `t5` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t5` ENABLE KEYS */;
DROP TABLE IF EXISTS `t6`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -162,7 +187,12 @@ CREATE TABLE `t6` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t6` DISABLE KEYS */;
-INSERT IGNORE INTO `t6` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT IGNORE INTO `t6` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t6` ENABLE KEYS */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -199,7 +229,12 @@ CREATE TABLE `t1` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT DELAYED INTO `t1` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED INTO `t1` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
DROP TABLE IF EXISTS `t2`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -211,7 +246,12 @@ CREATE TABLE `t2` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
-INSERT DELAYED INTO `t2` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED INTO `t2` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
DROP TABLE IF EXISTS `t3`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -223,7 +263,12 @@ CREATE TABLE `t3` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
-INSERT DELAYED INTO `t3` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED INTO `t3` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t3` ENABLE KEYS */;
DROP TABLE IF EXISTS `t4`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -235,7 +280,12 @@ CREATE TABLE `t4` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
-INSERT DELAYED INTO `t4` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED INTO `t4` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t4` ENABLE KEYS */;
DROP TABLE IF EXISTS `t5`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -247,7 +297,12 @@ CREATE TABLE `t5` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
-INSERT DELAYED INTO `t5` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT DELAYED INTO `t5` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t5` ENABLE KEYS */;
DROP TABLE IF EXISTS `t6`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -259,7 +314,12 @@ CREATE TABLE `t6` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t6` DISABLE KEYS */;
-INSERT INTO `t6` VALUES (1,'first value'),(2,'first value'),(3,'first value'),(4,'first value'),(5,'first value');
+INSERT INTO `t6` VALUES
+(1,'first value'),
+(2,'first value'),
+(3,'first value'),
+(4,'first value'),
+(5,'first value');
/*!40000 ALTER TABLE `t6` ENABLE KEYS */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
diff --git a/mysql-test/main/mysqldump-system.result b/mysql-test/main/mysqldump-system.result
index 12b4c763f5d..559f6f29f44 100644
--- a/mysql-test/main/mysqldump-system.result
+++ b/mysql-test/main/mysqldump-system.result
@@ -23,15 +23,17 @@ create table mysql.tz like mysql.time_zone_transition;
alter table mysql.tz engine=innodb;
insert into mysql.tz select * from mysql.time_zone_transition;
set global innodb_stats_persistent=1;
+set time_zone="+03:00";
+SET TIMESTAMP= UNIX_TIMESTAMP('2022-01-07 07:07:00');
ANALYZE TABLE mysql.tz PERSISTENT FOR ALL;
Table Op Msg_type Msg_text
mysql.tz analyze status Engine-independent statistics collected
mysql.tz analyze status OK
delete from mysql.index_stats where prefix_arity!=1;
delete from mysql.column_stats where column_name!='Time_zone_id';
-set time_zone="+03:00";
update mysql.innodb_index_stats set last_update="2020-01-01" where database_name="mysql" and table_name="tz";
update mysql.innodb_table_stats set last_update="2020-01-01" where database_name="mysql" and table_name="tz";
+update mysql.column_stats set histogram=json_replace(histogram, '$.collected_by', replace(json_value(histogram, '$.collected_by'), @@version, 'version'));
set global innodb_stats_persistent= @save_innodb_stats_persistent;
alter table mysql.time_zone_name ORDER BY Name;
CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(Host 'localhost');
@@ -93,31 +95,39 @@ USE mysql;
LOCK TABLES `column_stats` WRITE;
/*!40000 ALTER TABLE `column_stats` DISABLE KEYS */;
-REPLACE INTO `column_stats` VALUES ('mysql','tz','Time_zone_id','1','5',0.0000,4.0000,98.2500,254,'DOUBLE_PREC_HB','\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿');
+REPLACE INTO `column_stats` VALUES
+('mysql','tz','Time_zone_id','1','5',0.0000,4.0000,98.2500,4,'JSON_HB','{\"target_histogram_size\": 254, \"collected_at\": \"2022-01-07 07:07:00\", \"collected_by\": \"version\", \"histogram_hb\": [{\"start\": \"1\", \"size\": 0.340966921, \"ndv\": 1}, {\"start\": \"3\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"4\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"5\", \"end\": \"5\", \"size\": 0.002544529, \"ndv\": 1}]}');
/*!40000 ALTER TABLE `column_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `index_stats` WRITE;
/*!40000 ALTER TABLE `index_stats` DISABLE KEYS */;
-REPLACE INTO `index_stats` VALUES ('mysql','tz','PRIMARY',1,98.2500);
+REPLACE INTO `index_stats` VALUES
+('mysql','tz','PRIMARY',1,98.2500);
/*!40000 ALTER TABLE `index_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `table_stats` WRITE;
/*!40000 ALTER TABLE `table_stats` DISABLE KEYS */;
-REPLACE INTO `table_stats` VALUES ('mysql','tz',393);
+REPLACE INTO `table_stats` VALUES
+('mysql','tz',393);
/*!40000 ALTER TABLE `table_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `innodb_index_stats` WRITE;
/*!40000 ALTER TABLE `innodb_index_stats` DISABLE KEYS */;
-REPLACE INTO `innodb_index_stats` VALUES ('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',4,1,'Time_zone_id'),('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',393,1,'Time_zone_id,Transition_time'),('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),('mysql','tz','PRIMARY','2019-12-31 21:00:00','size',1,NULL,'Number of pages in the index');
+REPLACE INTO `innodb_index_stats` VALUES
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',4,1,'Time_zone_id'),
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',393,1,'Time_zone_id,Transition_time'),
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','size',1,NULL,'Number of pages in the index');
/*!40000 ALTER TABLE `innodb_index_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `innodb_table_stats` WRITE;
/*!40000 ALTER TABLE `innodb_table_stats` DISABLE KEYS */;
-REPLACE INTO `innodb_table_stats` VALUES ('mysql','tz','2019-12-31 21:00:00',393,1,0);
+REPLACE INTO `innodb_table_stats` VALUES
+('mysql','tz','2019-12-31 21:00:00',393,1,0);
/*!40000 ALTER TABLE `innodb_table_stats` ENABLE KEYS */;
UNLOCK TABLES;
@@ -125,31 +135,488 @@ USE mysql;
LOCK TABLES `time_zone` WRITE;
/*!40000 ALTER TABLE `time_zone` DISABLE KEYS */;
-REPLACE INTO `time_zone` VALUES (1,'N'),(2,'N'),(3,'N'),(4,'Y'),(5,'N');
+REPLACE INTO `time_zone` VALUES
+(1,'N'),
+(2,'N'),
+(3,'N'),
+(4,'Y'),
+(5,'N');
/*!40000 ALTER TABLE `time_zone` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_name` WRITE;
/*!40000 ALTER TABLE `time_zone_name` DISABLE KEYS */;
-REPLACE INTO `time_zone_name` VALUES ('Europe/Moscow',3),('Japan',5),('leap/Europe/Moscow',4),('MET',1),('Universal',2),('UTC',2);
+REPLACE INTO `time_zone_name` VALUES
+('Europe/Moscow',3),
+('Japan',5),
+('leap/Europe/Moscow',4),
+('MET',1),
+('Universal',2),
+('UTC',2);
/*!40000 ALTER TABLE `time_zone_name` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_leap_second` WRITE;
/*!40000 ALTER TABLE `time_zone_leap_second` DISABLE KEYS */;
-REPLACE INTO `time_zone_leap_second` VALUES (78796800,1),(94694401,2),(126230402,3),(157766403,4),(189302404,5),(220924805,6),(252460806,7),(283996807,8),(315532808,9),(362793609,10),(394329610,11),(425865611,12),(489024012,13),(567993613,14),(631152014,15),(662688015,16),(709948816,17),(741484817,18),(773020818,19),(820454419,20),(867715220,21),(915148821,22);
+REPLACE INTO `time_zone_leap_second` VALUES
+(78796800,1),
+(94694401,2),
+(126230402,3),
+(157766403,4),
+(189302404,5),
+(220924805,6),
+(252460806,7),
+(283996807,8),
+(315532808,9),
+(362793609,10),
+(394329610,11),
+(425865611,12),
+(489024012,13),
+(567993613,14),
+(631152014,15),
+(662688015,16),
+(709948816,17),
+(741484817,18),
+(773020818,19),
+(820454419,20),
+(867715220,21),
+(915148821,22);
/*!40000 ALTER TABLE `time_zone_leap_second` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_transition` WRITE;
/*!40000 ALTER TABLE `time_zone_transition` DISABLE KEYS */;
-REPLACE INTO `time_zone_transition` VALUES (1,-1693706400,0),(1,-1680483600,1),(1,-1663455600,2),(1,-1650150000,3),(1,-1632006000,2),(1,-1618700400,3),(1,-938905200,2),(1,-857257200,3),(1,-844556400,2),(1,-828226800,3),(1,-812502000,2),(1,-796777200,3),(1,228877200,2),(1,243997200,3),(1,260326800,2),(1,276051600,3),(1,291776400,2),(1,307501200,3),(1,323830800,2),(1,338950800,3),(1,354675600,2),(1,370400400,3),(1,386125200,2),(1,401850000,3),(1,417574800,2),(1,433299600,3),(1,449024400,2),(1,465354000,3),(1,481078800,2),(1,496803600,3),(1,512528400,2),(1,528253200,3),(1,543978000,2),(1,559702800,3),(1,575427600,2),(1,591152400,3),(1,606877200,2),(1,622602000,3),(1,638326800,2),(1,654656400,3),(1,670381200,2),(1,686106000,3),(1,701830800,2),(1,717555600,3),(1,733280400,2),(1,749005200,3),(1,764730000,2),(1,780454800,3),(1,796179600,2),(1,811904400,3),(1,828234000,2),(1,846378000,3),(1,859683600,2),(1,877827600,3),(1,891133200,2),(1,909277200,3),(1,922582800,2),(1,941331600,3),(1,954032400,2),(1,972781200,3),(1,985482000,2),(1,1004230800,3),(1,1017536400,2),(1,1035680400,3),(1,1048986000,2),(1,1067130000,3),(1,1080435600,2),(1,1099184400,3),(1,1111885200,2),(1,1130634000,3),(1,1143334800,2),(1,1162083600,3),(1,1174784400,2),(1,1193533200,3),(1,1206838800,2),(1,1224982800,3),(1,1238288400,2),(1,1256432400,3),(1,1269738000,2),(1,1288486800,3),(1,1301187600,2),(1,1319936400,3),(1,1332637200,2),(1,1351386000,3),(1,1364691600,2),(1,1382835600,3),(1,1396141200,2),(1,1414285200,3),(1,1427590800,2),(1,1445734800,3),(1,1459040400,2),(1,1477789200,3),(1,1490490000,2),(1,1509238800,3),(1,1521939600,2),(1,1540688400,3),(1,1553994000,2),(1,1572138000,3),(1,1585443600,2),(1,1603587600,3),(1,1616893200,2),(1,1635642000,3),(1,1648342800,2),(1,1667091600,3),(1,1679792400,2),(1,1698541200,3),(1,1711846800,2),(1,1729990800,3),(1,1743296400,2),(1,1761440400,3),(1,1774746000,2),(1,1792890000,3),(1,1806195600,2),(1,1824944400,3),(1,1837645200,2),(1,1856394000,3),(1,1869094800,2),(1,1887843600,3),(1,1901149200,2),(1,1919293200,3),(1,1932598800,2),(1,1950742800,3),(1,1964048400,2),(1,1982797200,3),(1,1995498000,2),(1,2014246800,3),(1,2026947600,2),(1,2045696400,3),(1,2058397200,2),(1,2077146000,3),(1,2090451600,2),(1,2108595600,3),(1,2121901200,2),(1,2140045200,3),(3,-1688265000,2),(3,-1656819048,1),(3,-1641353448,2),(3,-1627965048,3),(3,-1618716648,1),(3,-1596429048,3),(3,-1593829848,5),(3,-1589860800,4),(3,-1542427200,5),(3,-1539493200,6),(3,-1525323600,5),(3,-1522728000,4),(3,-1491188400,7),(3,-1247536800,4),(3,354920400,5),(3,370728000,4),(3,386456400,5),(3,402264000,4),(3,417992400,5),(3,433800000,4),(3,449614800,5),(3,465346800,8),(3,481071600,9),(3,496796400,8),(3,512521200,9),(3,528246000,8),(3,543970800,9),(3,559695600,8),(3,575420400,9),(3,591145200,8),(3,606870000,9),(3,622594800,8),(3,638319600,9),(3,654649200,8),(3,670374000,10),(3,686102400,11),(3,695779200,8),(3,701812800,5),(3,717534000,4),(3,733273200,9),(3,748998000,8),(3,764722800,9),(3,780447600,8),(3,796172400,9),(3,811897200,8),(3,828226800,9),(3,846370800,8),(3,859676400,9),(3,877820400,8),(3,891126000,9),(3,909270000,8),(3,922575600,9),(3,941324400,8),(3,954025200,9),(3,972774000,8),(3,985474800,9),(3,1004223600,8),(3,1017529200,9),(3,1035673200,8),(3,1048978800,9),(3,1067122800,8),(3,1080428400,9),(3,1099177200,8),(3,1111878000,9),(3,1130626800,8),(3,1143327600,9),(3,1162076400,8),(3,1174777200,9),(3,1193526000,8),(3,1206831600,9),(3,1224975600,8),(3,1238281200,9),(3,1256425200,8),(3,1269730800,9),(3,1288479600,8),(3,1301180400,9),(3,1319929200,8),(3,1332630000,9),(3,1351378800,8),(3,1364684400,9),(3,1382828400,8),(3,1396134000,9),(3,1414278000,8),(3,1427583600,9),(3,1445727600,8),(3,1459033200,9),(3,1477782000,8),(3,1490482800,9),(3,1509231600,8),(3,1521932400,9),(3,1540681200,8),(3,1553986800,9),(3,1572130800,8),(3,1585436400,9),(3,1603580400,8),(3,1616886000,9),(3,1635634800,8),(3,1648335600,9),(3,1667084400,8),(3,1679785200,9),(3,1698534000,8),(3,1711839600,9),(3,1729983600,8),(3,1743289200,9),(3,1761433200,8),(3,1774738800,9),(3,1792882800,8),(3,1806188400,9),(3,1824937200,8),(3,1837638000,9),(3,1856386800,8),(3,1869087600,9),(3,1887836400,8),(3,1901142000,9),(3,1919286000,8),(3,1932591600,9),(3,1950735600,8),(3,1964041200,9),(3,1982790000,8),(3,1995490800,9),(3,2014239600,8),(3,2026940400,9),(3,2045689200,8),(3,2058390000,9),(3,2077138800,8),(3,2090444400,9),(3,2108588400,8),(3,2121894000,9),(3,2140038000,8),(4,-1688265000,2),(4,-1656819048,1),(4,-1641353448,2),(4,-1627965048,3),(4,-1618716648,1),(4,-1596429048,3),(4,-1593829848,5),(4,-1589860800,4),(4,-1542427200,5),(4,-1539493200,6),(4,-1525323600,5),(4,-1522728000,4),(4,-1491188400,7),(4,-1247536800,4),(4,354920409,5),(4,370728010,4),(4,386456410,5),(4,402264011,4),(4,417992411,5),(4,433800012,4),(4,449614812,5),(4,465346812,8),(4,481071612,9),(4,496796413,8),(4,512521213,9),(4,528246013,8),(4,543970813,9),(4,559695613,8),(4,575420414,9),(4,591145214,8),(4,606870014,9),(4,622594814,8),(4,638319615,9),(4,654649215,8),(4,670374016,10),(4,686102416,11),(4,695779216,8),(4,701812816,5),(4,717534017,4),(4,733273217,9),(4,748998018,8),(4,764722818,9),(4,780447619,8),(4,796172419,9),(4,811897219,8),(4,828226820,9),(4,846370820,8),(4,859676420,9),(4,877820421,8),(4,891126021,9),(4,909270021,8),(4,922575622,9),(4,941324422,8),(4,954025222,9),(4,972774022,8),(4,985474822,9),(4,1004223622,8),(4,1017529222,9),(4,1035673222,8),(4,1048978822,9),(4,1067122822,8),(4,1080428422,9),(4,1099177222,8),(4,1111878022,9),(4,1130626822,8),(4,1143327622,9),(4,1162076422,8),(4,1174777222,9),(4,1193526022,8),(4,1206831622,9),(4,1224975622,8),(4,1238281222,9),(4,1256425222,8),(4,1269730822,9),(4,1288479622,8),(4,1301180422,9),(4,1319929222,8),(4,1332630022,9),(4,1351378822,8),(4,1364684422,9),(4,1382828422,8),(4,1396134022,9),(4,1414278022,8),(4,1427583622,9),(4,1445727622,8),(4,1459033222,9),(4,1477782022,8),(4,1490482822,9),(4,1509231622,8),(4,1521932422,9),(4,1540681222,8),(4,1553986822,9),(4,1572130822,8),(4,1585436422,9),(4,1603580422,8),(4,1616886022,9),(4,1635634822,8),(4,1648335622,9),(4,1667084422,8),(4,1679785222,9),(4,1698534022,8),(4,1711839622,9),(4,1729983622,8),(4,1743289222,9),(4,1761433222,8),(4,1774738822,9),(4,1792882822,8),(4,1806188422,9),(4,1824937222,8),(4,1837638022,9),(4,1856386822,8),(4,1869087622,9),(4,1887836422,8),(4,1901142022,9),(4,1919286022,8),(4,1932591622,9),(4,1950735622,8),(4,1964041222,9),(4,1982790022,8),(4,1995490822,9),(4,2014239622,8),(4,2026940422,9),(4,2045689222,8),(4,2058390022,9),(4,2077138822,8),(4,2090444422,9),(4,2108588422,8),(4,2121894022,9),(4,2140038022,8),(5,-1009875600,1);
+REPLACE INTO `time_zone_transition` VALUES
+(1,-1693706400,0),
+(1,-1680483600,1),
+(1,-1663455600,2),
+(1,-1650150000,3),
+(1,-1632006000,2),
+(1,-1618700400,3),
+(1,-938905200,2),
+(1,-857257200,3),
+(1,-844556400,2),
+(1,-828226800,3),
+(1,-812502000,2),
+(1,-796777200,3),
+(1,228877200,2),
+(1,243997200,3),
+(1,260326800,2),
+(1,276051600,3),
+(1,291776400,2),
+(1,307501200,3),
+(1,323830800,2),
+(1,338950800,3),
+(1,354675600,2),
+(1,370400400,3),
+(1,386125200,2),
+(1,401850000,3),
+(1,417574800,2),
+(1,433299600,3),
+(1,449024400,2),
+(1,465354000,3),
+(1,481078800,2),
+(1,496803600,3),
+(1,512528400,2),
+(1,528253200,3),
+(1,543978000,2),
+(1,559702800,3),
+(1,575427600,2),
+(1,591152400,3),
+(1,606877200,2),
+(1,622602000,3),
+(1,638326800,2),
+(1,654656400,3),
+(1,670381200,2),
+(1,686106000,3),
+(1,701830800,2),
+(1,717555600,3),
+(1,733280400,2),
+(1,749005200,3),
+(1,764730000,2),
+(1,780454800,3),
+(1,796179600,2),
+(1,811904400,3),
+(1,828234000,2),
+(1,846378000,3),
+(1,859683600,2),
+(1,877827600,3),
+(1,891133200,2),
+(1,909277200,3),
+(1,922582800,2),
+(1,941331600,3),
+(1,954032400,2),
+(1,972781200,3),
+(1,985482000,2),
+(1,1004230800,3),
+(1,1017536400,2),
+(1,1035680400,3),
+(1,1048986000,2),
+(1,1067130000,3),
+(1,1080435600,2),
+(1,1099184400,3),
+(1,1111885200,2),
+(1,1130634000,3),
+(1,1143334800,2),
+(1,1162083600,3),
+(1,1174784400,2),
+(1,1193533200,3),
+(1,1206838800,2),
+(1,1224982800,3),
+(1,1238288400,2),
+(1,1256432400,3),
+(1,1269738000,2),
+(1,1288486800,3),
+(1,1301187600,2),
+(1,1319936400,3),
+(1,1332637200,2),
+(1,1351386000,3),
+(1,1364691600,2),
+(1,1382835600,3),
+(1,1396141200,2),
+(1,1414285200,3),
+(1,1427590800,2),
+(1,1445734800,3),
+(1,1459040400,2),
+(1,1477789200,3),
+(1,1490490000,2),
+(1,1509238800,3),
+(1,1521939600,2),
+(1,1540688400,3),
+(1,1553994000,2),
+(1,1572138000,3),
+(1,1585443600,2),
+(1,1603587600,3),
+(1,1616893200,2),
+(1,1635642000,3),
+(1,1648342800,2),
+(1,1667091600,3),
+(1,1679792400,2),
+(1,1698541200,3),
+(1,1711846800,2),
+(1,1729990800,3),
+(1,1743296400,2),
+(1,1761440400,3),
+(1,1774746000,2),
+(1,1792890000,3),
+(1,1806195600,2),
+(1,1824944400,3),
+(1,1837645200,2),
+(1,1856394000,3),
+(1,1869094800,2),
+(1,1887843600,3),
+(1,1901149200,2),
+(1,1919293200,3),
+(1,1932598800,2),
+(1,1950742800,3),
+(1,1964048400,2),
+(1,1982797200,3),
+(1,1995498000,2),
+(1,2014246800,3),
+(1,2026947600,2),
+(1,2045696400,3),
+(1,2058397200,2),
+(1,2077146000,3),
+(1,2090451600,2),
+(1,2108595600,3),
+(1,2121901200,2),
+(1,2140045200,3),
+(3,-1688265000,2),
+(3,-1656819048,1),
+(3,-1641353448,2),
+(3,-1627965048,3),
+(3,-1618716648,1),
+(3,-1596429048,3),
+(3,-1593829848,5),
+(3,-1589860800,4),
+(3,-1542427200,5),
+(3,-1539493200,6),
+(3,-1525323600,5),
+(3,-1522728000,4),
+(3,-1491188400,7),
+(3,-1247536800,4),
+(3,354920400,5),
+(3,370728000,4),
+(3,386456400,5),
+(3,402264000,4),
+(3,417992400,5),
+(3,433800000,4),
+(3,449614800,5),
+(3,465346800,8),
+(3,481071600,9),
+(3,496796400,8),
+(3,512521200,9),
+(3,528246000,8),
+(3,543970800,9),
+(3,559695600,8),
+(3,575420400,9),
+(3,591145200,8),
+(3,606870000,9),
+(3,622594800,8),
+(3,638319600,9),
+(3,654649200,8),
+(3,670374000,10),
+(3,686102400,11),
+(3,695779200,8),
+(3,701812800,5),
+(3,717534000,4),
+(3,733273200,9),
+(3,748998000,8),
+(3,764722800,9),
+(3,780447600,8),
+(3,796172400,9),
+(3,811897200,8),
+(3,828226800,9),
+(3,846370800,8),
+(3,859676400,9),
+(3,877820400,8),
+(3,891126000,9),
+(3,909270000,8),
+(3,922575600,9),
+(3,941324400,8),
+(3,954025200,9),
+(3,972774000,8),
+(3,985474800,9),
+(3,1004223600,8),
+(3,1017529200,9),
+(3,1035673200,8),
+(3,1048978800,9),
+(3,1067122800,8),
+(3,1080428400,9),
+(3,1099177200,8),
+(3,1111878000,9),
+(3,1130626800,8),
+(3,1143327600,9),
+(3,1162076400,8),
+(3,1174777200,9),
+(3,1193526000,8),
+(3,1206831600,9),
+(3,1224975600,8),
+(3,1238281200,9),
+(3,1256425200,8),
+(3,1269730800,9),
+(3,1288479600,8),
+(3,1301180400,9),
+(3,1319929200,8),
+(3,1332630000,9),
+(3,1351378800,8),
+(3,1364684400,9),
+(3,1382828400,8),
+(3,1396134000,9),
+(3,1414278000,8),
+(3,1427583600,9),
+(3,1445727600,8),
+(3,1459033200,9),
+(3,1477782000,8),
+(3,1490482800,9),
+(3,1509231600,8),
+(3,1521932400,9),
+(3,1540681200,8),
+(3,1553986800,9),
+(3,1572130800,8),
+(3,1585436400,9),
+(3,1603580400,8),
+(3,1616886000,9),
+(3,1635634800,8),
+(3,1648335600,9),
+(3,1667084400,8),
+(3,1679785200,9),
+(3,1698534000,8),
+(3,1711839600,9),
+(3,1729983600,8),
+(3,1743289200,9),
+(3,1761433200,8),
+(3,1774738800,9),
+(3,1792882800,8),
+(3,1806188400,9),
+(3,1824937200,8),
+(3,1837638000,9),
+(3,1856386800,8),
+(3,1869087600,9),
+(3,1887836400,8),
+(3,1901142000,9),
+(3,1919286000,8),
+(3,1932591600,9),
+(3,1950735600,8),
+(3,1964041200,9),
+(3,1982790000,8),
+(3,1995490800,9),
+(3,2014239600,8),
+(3,2026940400,9),
+(3,2045689200,8),
+(3,2058390000,9),
+(3,2077138800,8),
+(3,2090444400,9),
+(3,2108588400,8),
+(3,2121894000,9),
+(3,2140038000,8),
+(4,-1688265000,2),
+(4,-1656819048,1),
+(4,-1641353448,2),
+(4,-1627965048,3),
+(4,-1618716648,1),
+(4,-1596429048,3),
+(4,-1593829848,5),
+(4,-1589860800,4),
+(4,-1542427200,5),
+(4,-1539493200,6),
+(4,-1525323600,5),
+(4,-1522728000,4),
+(4,-1491188400,7),
+(4,-1247536800,4),
+(4,354920409,5),
+(4,370728010,4),
+(4,386456410,5),
+(4,402264011,4),
+(4,417992411,5),
+(4,433800012,4),
+(4,449614812,5),
+(4,465346812,8),
+(4,481071612,9),
+(4,496796413,8),
+(4,512521213,9),
+(4,528246013,8),
+(4,543970813,9),
+(4,559695613,8),
+(4,575420414,9),
+(4,591145214,8),
+(4,606870014,9),
+(4,622594814,8),
+(4,638319615,9),
+(4,654649215,8),
+(4,670374016,10),
+(4,686102416,11),
+(4,695779216,8),
+(4,701812816,5),
+(4,717534017,4),
+(4,733273217,9),
+(4,748998018,8),
+(4,764722818,9),
+(4,780447619,8),
+(4,796172419,9),
+(4,811897219,8),
+(4,828226820,9),
+(4,846370820,8),
+(4,859676420,9),
+(4,877820421,8),
+(4,891126021,9),
+(4,909270021,8),
+(4,922575622,9),
+(4,941324422,8),
+(4,954025222,9),
+(4,972774022,8),
+(4,985474822,9),
+(4,1004223622,8),
+(4,1017529222,9),
+(4,1035673222,8),
+(4,1048978822,9),
+(4,1067122822,8),
+(4,1080428422,9),
+(4,1099177222,8),
+(4,1111878022,9),
+(4,1130626822,8),
+(4,1143327622,9),
+(4,1162076422,8),
+(4,1174777222,9),
+(4,1193526022,8),
+(4,1206831622,9),
+(4,1224975622,8),
+(4,1238281222,9),
+(4,1256425222,8),
+(4,1269730822,9),
+(4,1288479622,8),
+(4,1301180422,9),
+(4,1319929222,8),
+(4,1332630022,9),
+(4,1351378822,8),
+(4,1364684422,9),
+(4,1382828422,8),
+(4,1396134022,9),
+(4,1414278022,8),
+(4,1427583622,9),
+(4,1445727622,8),
+(4,1459033222,9),
+(4,1477782022,8),
+(4,1490482822,9),
+(4,1509231622,8),
+(4,1521932422,9),
+(4,1540681222,8),
+(4,1553986822,9),
+(4,1572130822,8),
+(4,1585436422,9),
+(4,1603580422,8),
+(4,1616886022,9),
+(4,1635634822,8),
+(4,1648335622,9),
+(4,1667084422,8),
+(4,1679785222,9),
+(4,1698534022,8),
+(4,1711839622,9),
+(4,1729983622,8),
+(4,1743289222,9),
+(4,1761433222,8),
+(4,1774738822,9),
+(4,1792882822,8),
+(4,1806188422,9),
+(4,1824937222,8),
+(4,1837638022,9),
+(4,1856386822,8),
+(4,1869087622,9),
+(4,1887836422,8),
+(4,1901142022,9),
+(4,1919286022,8),
+(4,1932591622,9),
+(4,1950735622,8),
+(4,1964041222,9),
+(4,1982790022,8),
+(4,1995490822,9),
+(4,2014239622,8),
+(4,2026940422,9),
+(4,2045689222,8),
+(4,2058390022,9),
+(4,2077138822,8),
+(4,2090444422,9),
+(4,2108588422,8),
+(4,2121894022,9),
+(4,2140038022,8),
+(5,-1009875600,1);
/*!40000 ALTER TABLE `time_zone_transition` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_transition_type` WRITE;
/*!40000 ALTER TABLE `time_zone_transition_type` DISABLE KEYS */;
-REPLACE INTO `time_zone_transition_type` VALUES (1,0,7200,1,'MEST'),(1,1,3600,0,'MET'),(1,2,7200,1,'MEST'),(1,3,3600,0,'MET'),(2,0,0,0,'UTC'),(3,0,9000,0,'MMT'),(3,1,12648,1,'MST'),(3,2,9048,0,'MMT'),(3,3,16248,1,'MDST'),(3,4,10800,0,'MSK'),(3,5,14400,1,'MSD'),(3,6,18000,1,'MSD'),(3,7,7200,0,'EET'),(3,8,10800,0,'MSK'),(3,9,14400,1,'MSD'),(3,10,10800,1,'EEST'),(3,11,7200,0,'EET'),(4,0,9000,0,'MMT'),(4,1,12648,1,'MST'),(4,2,9048,0,'MMT'),(4,3,16248,1,'MDST'),(4,4,10800,0,'MSK'),(4,5,14400,1,'MSD'),(4,6,18000,1,'MSD'),(4,7,7200,0,'EET'),(4,8,10800,0,'MSK'),(4,9,14400,1,'MSD'),(4,10,10800,1,'EEST'),(4,11,7200,0,'EET'),(5,0,32400,0,'CJT'),(5,1,32400,0,'JST');
+REPLACE INTO `time_zone_transition_type` VALUES
+(1,0,7200,1,'MEST'),
+(1,1,3600,0,'MET'),
+(1,2,7200,1,'MEST'),
+(1,3,3600,0,'MET'),
+(2,0,0,0,'UTC'),
+(3,0,9000,0,'MMT'),
+(3,1,12648,1,'MST'),
+(3,2,9048,0,'MMT'),
+(3,3,16248,1,'MDST'),
+(3,4,10800,0,'MSK'),
+(3,5,14400,1,'MSD'),
+(3,6,18000,1,'MSD'),
+(3,7,7200,0,'EET'),
+(3,8,10800,0,'MSK'),
+(3,9,14400,1,'MSD'),
+(3,10,10800,1,'EEST'),
+(3,11,7200,0,'EET'),
+(4,0,9000,0,'MMT'),
+(4,1,12648,1,'MST'),
+(4,2,9048,0,'MMT'),
+(4,3,16248,1,'MDST'),
+(4,4,10800,0,'MSK'),
+(4,5,14400,1,'MSD'),
+(4,6,18000,1,'MSD'),
+(4,7,7200,0,'EET'),
+(4,8,10800,0,'MSK'),
+(4,9,14400,1,'MSD'),
+(4,10,10800,1,'EEST'),
+(4,11,7200,0,'EET'),
+(5,0,32400,0,'CJT'),
+(5,1,32400,0,'JST');
/*!40000 ALTER TABLE `time_zone_transition_type` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -242,31 +709,39 @@ USE mysql;
LOCK TABLES `column_stats` WRITE;
/*!40000 ALTER TABLE `column_stats` DISABLE KEYS */;
-REPLACE INTO `column_stats` VALUES ('mysql','tz','Time_zone_id','1','5',0.0000,4.0000,98.2500,254,'DOUBLE_PREC_HB','\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿');
+REPLACE INTO `column_stats` VALUES
+('mysql','tz','Time_zone_id','1','5',0.0000,4.0000,98.2500,4,'JSON_HB','{\"target_histogram_size\": 254, \"collected_at\": \"2022-01-07 07:07:00\", \"collected_by\": \"version\", \"histogram_hb\": [{\"start\": \"1\", \"size\": 0.340966921, \"ndv\": 1}, {\"start\": \"3\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"4\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"5\", \"end\": \"5\", \"size\": 0.002544529, \"ndv\": 1}]}');
/*!40000 ALTER TABLE `column_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `index_stats` WRITE;
/*!40000 ALTER TABLE `index_stats` DISABLE KEYS */;
-REPLACE INTO `index_stats` VALUES ('mysql','tz','PRIMARY',1,98.2500);
+REPLACE INTO `index_stats` VALUES
+('mysql','tz','PRIMARY',1,98.2500);
/*!40000 ALTER TABLE `index_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `table_stats` WRITE;
/*!40000 ALTER TABLE `table_stats` DISABLE KEYS */;
-REPLACE INTO `table_stats` VALUES ('mysql','tz',393);
+REPLACE INTO `table_stats` VALUES
+('mysql','tz',393);
/*!40000 ALTER TABLE `table_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `innodb_index_stats` WRITE;
/*!40000 ALTER TABLE `innodb_index_stats` DISABLE KEYS */;
-REPLACE INTO `innodb_index_stats` VALUES ('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',4,1,'Time_zone_id'),('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',393,1,'Time_zone_id,Transition_time'),('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),('mysql','tz','PRIMARY','2019-12-31 21:00:00','size',1,NULL,'Number of pages in the index');
+REPLACE INTO `innodb_index_stats` VALUES
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',4,1,'Time_zone_id'),
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',393,1,'Time_zone_id,Transition_time'),
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','size',1,NULL,'Number of pages in the index');
/*!40000 ALTER TABLE `innodb_index_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `innodb_table_stats` WRITE;
/*!40000 ALTER TABLE `innodb_table_stats` DISABLE KEYS */;
-REPLACE INTO `innodb_table_stats` VALUES ('mysql','tz','2019-12-31 21:00:00',393,1,0);
+REPLACE INTO `innodb_table_stats` VALUES
+('mysql','tz','2019-12-31 21:00:00',393,1,0);
/*!40000 ALTER TABLE `innodb_table_stats` ENABLE KEYS */;
UNLOCK TABLES;
@@ -274,31 +749,488 @@ USE mysql;
LOCK TABLES `time_zone` WRITE;
/*!40000 ALTER TABLE `time_zone` DISABLE KEYS */;
-REPLACE INTO `time_zone` VALUES (1,'N'),(2,'N'),(3,'N'),(4,'Y'),(5,'N');
+REPLACE INTO `time_zone` VALUES
+(1,'N'),
+(2,'N'),
+(3,'N'),
+(4,'Y'),
+(5,'N');
/*!40000 ALTER TABLE `time_zone` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_name` WRITE;
/*!40000 ALTER TABLE `time_zone_name` DISABLE KEYS */;
-REPLACE INTO `time_zone_name` VALUES ('Europe/Moscow',3),('Japan',5),('leap/Europe/Moscow',4),('MET',1),('Universal',2),('UTC',2);
+REPLACE INTO `time_zone_name` VALUES
+('Europe/Moscow',3),
+('Japan',5),
+('leap/Europe/Moscow',4),
+('MET',1),
+('Universal',2),
+('UTC',2);
/*!40000 ALTER TABLE `time_zone_name` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_leap_second` WRITE;
/*!40000 ALTER TABLE `time_zone_leap_second` DISABLE KEYS */;
-REPLACE INTO `time_zone_leap_second` VALUES (78796800,1),(94694401,2),(126230402,3),(157766403,4),(189302404,5),(220924805,6),(252460806,7),(283996807,8),(315532808,9),(362793609,10),(394329610,11),(425865611,12),(489024012,13),(567993613,14),(631152014,15),(662688015,16),(709948816,17),(741484817,18),(773020818,19),(820454419,20),(867715220,21),(915148821,22);
+REPLACE INTO `time_zone_leap_second` VALUES
+(78796800,1),
+(94694401,2),
+(126230402,3),
+(157766403,4),
+(189302404,5),
+(220924805,6),
+(252460806,7),
+(283996807,8),
+(315532808,9),
+(362793609,10),
+(394329610,11),
+(425865611,12),
+(489024012,13),
+(567993613,14),
+(631152014,15),
+(662688015,16),
+(709948816,17),
+(741484817,18),
+(773020818,19),
+(820454419,20),
+(867715220,21),
+(915148821,22);
/*!40000 ALTER TABLE `time_zone_leap_second` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_transition` WRITE;
/*!40000 ALTER TABLE `time_zone_transition` DISABLE KEYS */;
-REPLACE INTO `time_zone_transition` VALUES (1,-1693706400,0),(1,-1680483600,1),(1,-1663455600,2),(1,-1650150000,3),(1,-1632006000,2),(1,-1618700400,3),(1,-938905200,2),(1,-857257200,3),(1,-844556400,2),(1,-828226800,3),(1,-812502000,2),(1,-796777200,3),(1,228877200,2),(1,243997200,3),(1,260326800,2),(1,276051600,3),(1,291776400,2),(1,307501200,3),(1,323830800,2),(1,338950800,3),(1,354675600,2),(1,370400400,3),(1,386125200,2),(1,401850000,3),(1,417574800,2),(1,433299600,3),(1,449024400,2),(1,465354000,3),(1,481078800,2),(1,496803600,3),(1,512528400,2),(1,528253200,3),(1,543978000,2),(1,559702800,3),(1,575427600,2),(1,591152400,3),(1,606877200,2),(1,622602000,3),(1,638326800,2),(1,654656400,3),(1,670381200,2),(1,686106000,3),(1,701830800,2),(1,717555600,3),(1,733280400,2),(1,749005200,3),(1,764730000,2),(1,780454800,3),(1,796179600,2),(1,811904400,3),(1,828234000,2),(1,846378000,3),(1,859683600,2),(1,877827600,3),(1,891133200,2),(1,909277200,3),(1,922582800,2),(1,941331600,3),(1,954032400,2),(1,972781200,3),(1,985482000,2),(1,1004230800,3),(1,1017536400,2),(1,1035680400,3),(1,1048986000,2),(1,1067130000,3),(1,1080435600,2),(1,1099184400,3),(1,1111885200,2),(1,1130634000,3),(1,1143334800,2),(1,1162083600,3),(1,1174784400,2),(1,1193533200,3),(1,1206838800,2),(1,1224982800,3),(1,1238288400,2),(1,1256432400,3),(1,1269738000,2),(1,1288486800,3),(1,1301187600,2),(1,1319936400,3),(1,1332637200,2),(1,1351386000,3),(1,1364691600,2),(1,1382835600,3),(1,1396141200,2),(1,1414285200,3),(1,1427590800,2),(1,1445734800,3),(1,1459040400,2),(1,1477789200,3),(1,1490490000,2),(1,1509238800,3),(1,1521939600,2),(1,1540688400,3),(1,1553994000,2),(1,1572138000,3),(1,1585443600,2),(1,1603587600,3),(1,1616893200,2),(1,1635642000,3),(1,1648342800,2),(1,1667091600,3),(1,1679792400,2),(1,1698541200,3),(1,1711846800,2),(1,1729990800,3),(1,1743296400,2),(1,1761440400,3),(1,1774746000,2),(1,1792890000,3),(1,1806195600,2),(1,1824944400,3),(1,1837645200,2),(1,1856394000,3),(1,1869094800,2),(1,1887843600,3),(1,1901149200,2),(1,1919293200,3),(1,1932598800,2),(1,1950742800,3),(1,1964048400,2),(1,1982797200,3),(1,1995498000,2),(1,2014246800,3),(1,2026947600,2),(1,2045696400,3),(1,2058397200,2),(1,2077146000,3),(1,2090451600,2),(1,2108595600,3),(1,2121901200,2),(1,2140045200,3),(3,-1688265000,2),(3,-1656819048,1),(3,-1641353448,2),(3,-1627965048,3),(3,-1618716648,1),(3,-1596429048,3),(3,-1593829848,5),(3,-1589860800,4),(3,-1542427200,5),(3,-1539493200,6),(3,-1525323600,5),(3,-1522728000,4),(3,-1491188400,7),(3,-1247536800,4),(3,354920400,5),(3,370728000,4),(3,386456400,5),(3,402264000,4),(3,417992400,5),(3,433800000,4),(3,449614800,5),(3,465346800,8),(3,481071600,9),(3,496796400,8),(3,512521200,9),(3,528246000,8),(3,543970800,9),(3,559695600,8),(3,575420400,9),(3,591145200,8),(3,606870000,9),(3,622594800,8),(3,638319600,9),(3,654649200,8),(3,670374000,10),(3,686102400,11),(3,695779200,8),(3,701812800,5),(3,717534000,4),(3,733273200,9),(3,748998000,8),(3,764722800,9),(3,780447600,8),(3,796172400,9),(3,811897200,8),(3,828226800,9),(3,846370800,8),(3,859676400,9),(3,877820400,8),(3,891126000,9),(3,909270000,8),(3,922575600,9),(3,941324400,8),(3,954025200,9),(3,972774000,8),(3,985474800,9),(3,1004223600,8),(3,1017529200,9),(3,1035673200,8),(3,1048978800,9),(3,1067122800,8),(3,1080428400,9),(3,1099177200,8),(3,1111878000,9),(3,1130626800,8),(3,1143327600,9),(3,1162076400,8),(3,1174777200,9),(3,1193526000,8),(3,1206831600,9),(3,1224975600,8),(3,1238281200,9),(3,1256425200,8),(3,1269730800,9),(3,1288479600,8),(3,1301180400,9),(3,1319929200,8),(3,1332630000,9),(3,1351378800,8),(3,1364684400,9),(3,1382828400,8),(3,1396134000,9),(3,1414278000,8),(3,1427583600,9),(3,1445727600,8),(3,1459033200,9),(3,1477782000,8),(3,1490482800,9),(3,1509231600,8),(3,1521932400,9),(3,1540681200,8),(3,1553986800,9),(3,1572130800,8),(3,1585436400,9),(3,1603580400,8),(3,1616886000,9),(3,1635634800,8),(3,1648335600,9),(3,1667084400,8),(3,1679785200,9),(3,1698534000,8),(3,1711839600,9),(3,1729983600,8),(3,1743289200,9),(3,1761433200,8),(3,1774738800,9),(3,1792882800,8),(3,1806188400,9),(3,1824937200,8),(3,1837638000,9),(3,1856386800,8),(3,1869087600,9),(3,1887836400,8),(3,1901142000,9),(3,1919286000,8),(3,1932591600,9),(3,1950735600,8),(3,1964041200,9),(3,1982790000,8),(3,1995490800,9),(3,2014239600,8),(3,2026940400,9),(3,2045689200,8),(3,2058390000,9),(3,2077138800,8),(3,2090444400,9),(3,2108588400,8),(3,2121894000,9),(3,2140038000,8),(4,-1688265000,2),(4,-1656819048,1),(4,-1641353448,2),(4,-1627965048,3),(4,-1618716648,1),(4,-1596429048,3),(4,-1593829848,5),(4,-1589860800,4),(4,-1542427200,5),(4,-1539493200,6),(4,-1525323600,5),(4,-1522728000,4),(4,-1491188400,7),(4,-1247536800,4),(4,354920409,5),(4,370728010,4),(4,386456410,5),(4,402264011,4),(4,417992411,5),(4,433800012,4),(4,449614812,5),(4,465346812,8),(4,481071612,9),(4,496796413,8),(4,512521213,9),(4,528246013,8),(4,543970813,9),(4,559695613,8),(4,575420414,9),(4,591145214,8),(4,606870014,9),(4,622594814,8),(4,638319615,9),(4,654649215,8),(4,670374016,10),(4,686102416,11),(4,695779216,8),(4,701812816,5),(4,717534017,4),(4,733273217,9),(4,748998018,8),(4,764722818,9),(4,780447619,8),(4,796172419,9),(4,811897219,8),(4,828226820,9),(4,846370820,8),(4,859676420,9),(4,877820421,8),(4,891126021,9),(4,909270021,8),(4,922575622,9),(4,941324422,8),(4,954025222,9),(4,972774022,8),(4,985474822,9),(4,1004223622,8),(4,1017529222,9),(4,1035673222,8),(4,1048978822,9),(4,1067122822,8),(4,1080428422,9),(4,1099177222,8),(4,1111878022,9),(4,1130626822,8),(4,1143327622,9),(4,1162076422,8),(4,1174777222,9),(4,1193526022,8),(4,1206831622,9),(4,1224975622,8),(4,1238281222,9),(4,1256425222,8),(4,1269730822,9),(4,1288479622,8),(4,1301180422,9),(4,1319929222,8),(4,1332630022,9),(4,1351378822,8),(4,1364684422,9),(4,1382828422,8),(4,1396134022,9),(4,1414278022,8),(4,1427583622,9),(4,1445727622,8),(4,1459033222,9),(4,1477782022,8),(4,1490482822,9),(4,1509231622,8),(4,1521932422,9),(4,1540681222,8),(4,1553986822,9),(4,1572130822,8),(4,1585436422,9),(4,1603580422,8),(4,1616886022,9),(4,1635634822,8),(4,1648335622,9),(4,1667084422,8),(4,1679785222,9),(4,1698534022,8),(4,1711839622,9),(4,1729983622,8),(4,1743289222,9),(4,1761433222,8),(4,1774738822,9),(4,1792882822,8),(4,1806188422,9),(4,1824937222,8),(4,1837638022,9),(4,1856386822,8),(4,1869087622,9),(4,1887836422,8),(4,1901142022,9),(4,1919286022,8),(4,1932591622,9),(4,1950735622,8),(4,1964041222,9),(4,1982790022,8),(4,1995490822,9),(4,2014239622,8),(4,2026940422,9),(4,2045689222,8),(4,2058390022,9),(4,2077138822,8),(4,2090444422,9),(4,2108588422,8),(4,2121894022,9),(4,2140038022,8),(5,-1009875600,1);
+REPLACE INTO `time_zone_transition` VALUES
+(1,-1693706400,0),
+(1,-1680483600,1),
+(1,-1663455600,2),
+(1,-1650150000,3),
+(1,-1632006000,2),
+(1,-1618700400,3),
+(1,-938905200,2),
+(1,-857257200,3),
+(1,-844556400,2),
+(1,-828226800,3),
+(1,-812502000,2),
+(1,-796777200,3),
+(1,228877200,2),
+(1,243997200,3),
+(1,260326800,2),
+(1,276051600,3),
+(1,291776400,2),
+(1,307501200,3),
+(1,323830800,2),
+(1,338950800,3),
+(1,354675600,2),
+(1,370400400,3),
+(1,386125200,2),
+(1,401850000,3),
+(1,417574800,2),
+(1,433299600,3),
+(1,449024400,2),
+(1,465354000,3),
+(1,481078800,2),
+(1,496803600,3),
+(1,512528400,2),
+(1,528253200,3),
+(1,543978000,2),
+(1,559702800,3),
+(1,575427600,2),
+(1,591152400,3),
+(1,606877200,2),
+(1,622602000,3),
+(1,638326800,2),
+(1,654656400,3),
+(1,670381200,2),
+(1,686106000,3),
+(1,701830800,2),
+(1,717555600,3),
+(1,733280400,2),
+(1,749005200,3),
+(1,764730000,2),
+(1,780454800,3),
+(1,796179600,2),
+(1,811904400,3),
+(1,828234000,2),
+(1,846378000,3),
+(1,859683600,2),
+(1,877827600,3),
+(1,891133200,2),
+(1,909277200,3),
+(1,922582800,2),
+(1,941331600,3),
+(1,954032400,2),
+(1,972781200,3),
+(1,985482000,2),
+(1,1004230800,3),
+(1,1017536400,2),
+(1,1035680400,3),
+(1,1048986000,2),
+(1,1067130000,3),
+(1,1080435600,2),
+(1,1099184400,3),
+(1,1111885200,2),
+(1,1130634000,3),
+(1,1143334800,2),
+(1,1162083600,3),
+(1,1174784400,2),
+(1,1193533200,3),
+(1,1206838800,2),
+(1,1224982800,3),
+(1,1238288400,2),
+(1,1256432400,3),
+(1,1269738000,2),
+(1,1288486800,3),
+(1,1301187600,2),
+(1,1319936400,3),
+(1,1332637200,2),
+(1,1351386000,3),
+(1,1364691600,2),
+(1,1382835600,3),
+(1,1396141200,2),
+(1,1414285200,3),
+(1,1427590800,2),
+(1,1445734800,3),
+(1,1459040400,2),
+(1,1477789200,3),
+(1,1490490000,2),
+(1,1509238800,3),
+(1,1521939600,2),
+(1,1540688400,3),
+(1,1553994000,2),
+(1,1572138000,3),
+(1,1585443600,2),
+(1,1603587600,3),
+(1,1616893200,2),
+(1,1635642000,3),
+(1,1648342800,2),
+(1,1667091600,3),
+(1,1679792400,2),
+(1,1698541200,3),
+(1,1711846800,2),
+(1,1729990800,3),
+(1,1743296400,2),
+(1,1761440400,3),
+(1,1774746000,2),
+(1,1792890000,3),
+(1,1806195600,2),
+(1,1824944400,3),
+(1,1837645200,2),
+(1,1856394000,3),
+(1,1869094800,2),
+(1,1887843600,3),
+(1,1901149200,2),
+(1,1919293200,3),
+(1,1932598800,2),
+(1,1950742800,3),
+(1,1964048400,2),
+(1,1982797200,3),
+(1,1995498000,2),
+(1,2014246800,3),
+(1,2026947600,2),
+(1,2045696400,3),
+(1,2058397200,2),
+(1,2077146000,3),
+(1,2090451600,2),
+(1,2108595600,3),
+(1,2121901200,2),
+(1,2140045200,3),
+(3,-1688265000,2),
+(3,-1656819048,1),
+(3,-1641353448,2),
+(3,-1627965048,3),
+(3,-1618716648,1),
+(3,-1596429048,3),
+(3,-1593829848,5),
+(3,-1589860800,4),
+(3,-1542427200,5),
+(3,-1539493200,6),
+(3,-1525323600,5),
+(3,-1522728000,4),
+(3,-1491188400,7),
+(3,-1247536800,4),
+(3,354920400,5),
+(3,370728000,4),
+(3,386456400,5),
+(3,402264000,4),
+(3,417992400,5),
+(3,433800000,4),
+(3,449614800,5),
+(3,465346800,8),
+(3,481071600,9),
+(3,496796400,8),
+(3,512521200,9),
+(3,528246000,8),
+(3,543970800,9),
+(3,559695600,8),
+(3,575420400,9),
+(3,591145200,8),
+(3,606870000,9),
+(3,622594800,8),
+(3,638319600,9),
+(3,654649200,8),
+(3,670374000,10),
+(3,686102400,11),
+(3,695779200,8),
+(3,701812800,5),
+(3,717534000,4),
+(3,733273200,9),
+(3,748998000,8),
+(3,764722800,9),
+(3,780447600,8),
+(3,796172400,9),
+(3,811897200,8),
+(3,828226800,9),
+(3,846370800,8),
+(3,859676400,9),
+(3,877820400,8),
+(3,891126000,9),
+(3,909270000,8),
+(3,922575600,9),
+(3,941324400,8),
+(3,954025200,9),
+(3,972774000,8),
+(3,985474800,9),
+(3,1004223600,8),
+(3,1017529200,9),
+(3,1035673200,8),
+(3,1048978800,9),
+(3,1067122800,8),
+(3,1080428400,9),
+(3,1099177200,8),
+(3,1111878000,9),
+(3,1130626800,8),
+(3,1143327600,9),
+(3,1162076400,8),
+(3,1174777200,9),
+(3,1193526000,8),
+(3,1206831600,9),
+(3,1224975600,8),
+(3,1238281200,9),
+(3,1256425200,8),
+(3,1269730800,9),
+(3,1288479600,8),
+(3,1301180400,9),
+(3,1319929200,8),
+(3,1332630000,9),
+(3,1351378800,8),
+(3,1364684400,9),
+(3,1382828400,8),
+(3,1396134000,9),
+(3,1414278000,8),
+(3,1427583600,9),
+(3,1445727600,8),
+(3,1459033200,9),
+(3,1477782000,8),
+(3,1490482800,9),
+(3,1509231600,8),
+(3,1521932400,9),
+(3,1540681200,8),
+(3,1553986800,9),
+(3,1572130800,8),
+(3,1585436400,9),
+(3,1603580400,8),
+(3,1616886000,9),
+(3,1635634800,8),
+(3,1648335600,9),
+(3,1667084400,8),
+(3,1679785200,9),
+(3,1698534000,8),
+(3,1711839600,9),
+(3,1729983600,8),
+(3,1743289200,9),
+(3,1761433200,8),
+(3,1774738800,9),
+(3,1792882800,8),
+(3,1806188400,9),
+(3,1824937200,8),
+(3,1837638000,9),
+(3,1856386800,8),
+(3,1869087600,9),
+(3,1887836400,8),
+(3,1901142000,9),
+(3,1919286000,8),
+(3,1932591600,9),
+(3,1950735600,8),
+(3,1964041200,9),
+(3,1982790000,8),
+(3,1995490800,9),
+(3,2014239600,8),
+(3,2026940400,9),
+(3,2045689200,8),
+(3,2058390000,9),
+(3,2077138800,8),
+(3,2090444400,9),
+(3,2108588400,8),
+(3,2121894000,9),
+(3,2140038000,8),
+(4,-1688265000,2),
+(4,-1656819048,1),
+(4,-1641353448,2),
+(4,-1627965048,3),
+(4,-1618716648,1),
+(4,-1596429048,3),
+(4,-1593829848,5),
+(4,-1589860800,4),
+(4,-1542427200,5),
+(4,-1539493200,6),
+(4,-1525323600,5),
+(4,-1522728000,4),
+(4,-1491188400,7),
+(4,-1247536800,4),
+(4,354920409,5),
+(4,370728010,4),
+(4,386456410,5),
+(4,402264011,4),
+(4,417992411,5),
+(4,433800012,4),
+(4,449614812,5),
+(4,465346812,8),
+(4,481071612,9),
+(4,496796413,8),
+(4,512521213,9),
+(4,528246013,8),
+(4,543970813,9),
+(4,559695613,8),
+(4,575420414,9),
+(4,591145214,8),
+(4,606870014,9),
+(4,622594814,8),
+(4,638319615,9),
+(4,654649215,8),
+(4,670374016,10),
+(4,686102416,11),
+(4,695779216,8),
+(4,701812816,5),
+(4,717534017,4),
+(4,733273217,9),
+(4,748998018,8),
+(4,764722818,9),
+(4,780447619,8),
+(4,796172419,9),
+(4,811897219,8),
+(4,828226820,9),
+(4,846370820,8),
+(4,859676420,9),
+(4,877820421,8),
+(4,891126021,9),
+(4,909270021,8),
+(4,922575622,9),
+(4,941324422,8),
+(4,954025222,9),
+(4,972774022,8),
+(4,985474822,9),
+(4,1004223622,8),
+(4,1017529222,9),
+(4,1035673222,8),
+(4,1048978822,9),
+(4,1067122822,8),
+(4,1080428422,9),
+(4,1099177222,8),
+(4,1111878022,9),
+(4,1130626822,8),
+(4,1143327622,9),
+(4,1162076422,8),
+(4,1174777222,9),
+(4,1193526022,8),
+(4,1206831622,9),
+(4,1224975622,8),
+(4,1238281222,9),
+(4,1256425222,8),
+(4,1269730822,9),
+(4,1288479622,8),
+(4,1301180422,9),
+(4,1319929222,8),
+(4,1332630022,9),
+(4,1351378822,8),
+(4,1364684422,9),
+(4,1382828422,8),
+(4,1396134022,9),
+(4,1414278022,8),
+(4,1427583622,9),
+(4,1445727622,8),
+(4,1459033222,9),
+(4,1477782022,8),
+(4,1490482822,9),
+(4,1509231622,8),
+(4,1521932422,9),
+(4,1540681222,8),
+(4,1553986822,9),
+(4,1572130822,8),
+(4,1585436422,9),
+(4,1603580422,8),
+(4,1616886022,9),
+(4,1635634822,8),
+(4,1648335622,9),
+(4,1667084422,8),
+(4,1679785222,9),
+(4,1698534022,8),
+(4,1711839622,9),
+(4,1729983622,8),
+(4,1743289222,9),
+(4,1761433222,8),
+(4,1774738822,9),
+(4,1792882822,8),
+(4,1806188422,9),
+(4,1824937222,8),
+(4,1837638022,9),
+(4,1856386822,8),
+(4,1869087622,9),
+(4,1887836422,8),
+(4,1901142022,9),
+(4,1919286022,8),
+(4,1932591622,9),
+(4,1950735622,8),
+(4,1964041222,9),
+(4,1982790022,8),
+(4,1995490822,9),
+(4,2014239622,8),
+(4,2026940422,9),
+(4,2045689222,8),
+(4,2058390022,9),
+(4,2077138822,8),
+(4,2090444422,9),
+(4,2108588422,8),
+(4,2121894022,9),
+(4,2140038022,8),
+(5,-1009875600,1);
/*!40000 ALTER TABLE `time_zone_transition` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_transition_type` WRITE;
/*!40000 ALTER TABLE `time_zone_transition_type` DISABLE KEYS */;
-REPLACE INTO `time_zone_transition_type` VALUES (1,0,7200,1,'MEST'),(1,1,3600,0,'MET'),(1,2,7200,1,'MEST'),(1,3,3600,0,'MET'),(2,0,0,0,'UTC'),(3,0,9000,0,'MMT'),(3,1,12648,1,'MST'),(3,2,9048,0,'MMT'),(3,3,16248,1,'MDST'),(3,4,10800,0,'MSK'),(3,5,14400,1,'MSD'),(3,6,18000,1,'MSD'),(3,7,7200,0,'EET'),(3,8,10800,0,'MSK'),(3,9,14400,1,'MSD'),(3,10,10800,1,'EEST'),(3,11,7200,0,'EET'),(4,0,9000,0,'MMT'),(4,1,12648,1,'MST'),(4,2,9048,0,'MMT'),(4,3,16248,1,'MDST'),(4,4,10800,0,'MSK'),(4,5,14400,1,'MSD'),(4,6,18000,1,'MSD'),(4,7,7200,0,'EET'),(4,8,10800,0,'MSK'),(4,9,14400,1,'MSD'),(4,10,10800,1,'EEST'),(4,11,7200,0,'EET'),(5,0,32400,0,'CJT'),(5,1,32400,0,'JST');
+REPLACE INTO `time_zone_transition_type` VALUES
+(1,0,7200,1,'MEST'),
+(1,1,3600,0,'MET'),
+(1,2,7200,1,'MEST'),
+(1,3,3600,0,'MET'),
+(2,0,0,0,'UTC'),
+(3,0,9000,0,'MMT'),
+(3,1,12648,1,'MST'),
+(3,2,9048,0,'MMT'),
+(3,3,16248,1,'MDST'),
+(3,4,10800,0,'MSK'),
+(3,5,14400,1,'MSD'),
+(3,6,18000,1,'MSD'),
+(3,7,7200,0,'EET'),
+(3,8,10800,0,'MSK'),
+(3,9,14400,1,'MSD'),
+(3,10,10800,1,'EEST'),
+(3,11,7200,0,'EET'),
+(4,0,9000,0,'MMT'),
+(4,1,12648,1,'MST'),
+(4,2,9048,0,'MMT'),
+(4,3,16248,1,'MDST'),
+(4,4,10800,0,'MSK'),
+(4,5,14400,1,'MSD'),
+(4,6,18000,1,'MSD'),
+(4,7,7200,0,'EET'),
+(4,8,10800,0,'MSK'),
+(4,9,14400,1,'MSD'),
+(4,10,10800,1,'EEST'),
+(4,11,7200,0,'EET'),
+(5,0,32400,0,'CJT'),
+(5,1,32400,0,'JST');
/*!40000 ALTER TABLE `time_zone_transition_type` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -368,31 +1300,39 @@ USE mysql;
LOCK TABLES `column_stats` WRITE;
/*!40000 ALTER TABLE `column_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `column_stats` VALUES ('mysql','tz','Time_zone_id','1','5',0.0000,4.0000,98.2500,254,'DOUBLE_PREC_HB','\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿');
+INSERT IGNORE INTO `column_stats` VALUES
+('mysql','tz','Time_zone_id','1','5',0.0000,4.0000,98.2500,4,'JSON_HB','{\"target_histogram_size\": 254, \"collected_at\": \"2022-01-07 07:07:00\", \"collected_by\": \"version\", \"histogram_hb\": [{\"start\": \"1\", \"size\": 0.340966921, \"ndv\": 1}, {\"start\": \"3\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"4\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"5\", \"end\": \"5\", \"size\": 0.002544529, \"ndv\": 1}]}');
/*!40000 ALTER TABLE `column_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `index_stats` WRITE;
/*!40000 ALTER TABLE `index_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `index_stats` VALUES ('mysql','tz','PRIMARY',1,98.2500);
+INSERT IGNORE INTO `index_stats` VALUES
+('mysql','tz','PRIMARY',1,98.2500);
/*!40000 ALTER TABLE `index_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `table_stats` WRITE;
/*!40000 ALTER TABLE `table_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `table_stats` VALUES ('mysql','tz',393);
+INSERT IGNORE INTO `table_stats` VALUES
+('mysql','tz',393);
/*!40000 ALTER TABLE `table_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `innodb_index_stats` WRITE;
/*!40000 ALTER TABLE `innodb_index_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `innodb_index_stats` VALUES ('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',4,1,'Time_zone_id'),('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',393,1,'Time_zone_id,Transition_time'),('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),('mysql','tz','PRIMARY','2019-12-31 21:00:00','size',1,NULL,'Number of pages in the index');
+INSERT IGNORE INTO `innodb_index_stats` VALUES
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',4,1,'Time_zone_id'),
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',393,1,'Time_zone_id,Transition_time'),
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),
+('mysql','tz','PRIMARY','2019-12-31 21:00:00','size',1,NULL,'Number of pages in the index');
/*!40000 ALTER TABLE `innodb_index_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `innodb_table_stats` WRITE;
/*!40000 ALTER TABLE `innodb_table_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `innodb_table_stats` VALUES ('mysql','tz','2019-12-31 21:00:00',393,1,0);
+INSERT IGNORE INTO `innodb_table_stats` VALUES
+('mysql','tz','2019-12-31 21:00:00',393,1,0);
/*!40000 ALTER TABLE `innodb_table_stats` ENABLE KEYS */;
UNLOCK TABLES;
@@ -400,31 +1340,488 @@ USE mysql;
LOCK TABLES `time_zone` WRITE;
/*!40000 ALTER TABLE `time_zone` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone` VALUES (1,'N'),(2,'N'),(3,'N'),(4,'Y'),(5,'N');
+INSERT IGNORE INTO `time_zone` VALUES
+(1,'N'),
+(2,'N'),
+(3,'N'),
+(4,'Y'),
+(5,'N');
/*!40000 ALTER TABLE `time_zone` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_name` WRITE;
/*!40000 ALTER TABLE `time_zone_name` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone_name` VALUES ('Europe/Moscow',3),('Japan',5),('leap/Europe/Moscow',4),('MET',1),('Universal',2),('UTC',2);
+INSERT IGNORE INTO `time_zone_name` VALUES
+('Europe/Moscow',3),
+('Japan',5),
+('leap/Europe/Moscow',4),
+('MET',1),
+('Universal',2),
+('UTC',2);
/*!40000 ALTER TABLE `time_zone_name` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_leap_second` WRITE;
/*!40000 ALTER TABLE `time_zone_leap_second` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone_leap_second` VALUES (78796800,1),(94694401,2),(126230402,3),(157766403,4),(189302404,5),(220924805,6),(252460806,7),(283996807,8),(315532808,9),(362793609,10),(394329610,11),(425865611,12),(489024012,13),(567993613,14),(631152014,15),(662688015,16),(709948816,17),(741484817,18),(773020818,19),(820454419,20),(867715220,21),(915148821,22);
+INSERT IGNORE INTO `time_zone_leap_second` VALUES
+(78796800,1),
+(94694401,2),
+(126230402,3),
+(157766403,4),
+(189302404,5),
+(220924805,6),
+(252460806,7),
+(283996807,8),
+(315532808,9),
+(362793609,10),
+(394329610,11),
+(425865611,12),
+(489024012,13),
+(567993613,14),
+(631152014,15),
+(662688015,16),
+(709948816,17),
+(741484817,18),
+(773020818,19),
+(820454419,20),
+(867715220,21),
+(915148821,22);
/*!40000 ALTER TABLE `time_zone_leap_second` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_transition` WRITE;
/*!40000 ALTER TABLE `time_zone_transition` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone_transition` VALUES (1,-1693706400,0),(1,-1680483600,1),(1,-1663455600,2),(1,-1650150000,3),(1,-1632006000,2),(1,-1618700400,3),(1,-938905200,2),(1,-857257200,3),(1,-844556400,2),(1,-828226800,3),(1,-812502000,2),(1,-796777200,3),(1,228877200,2),(1,243997200,3),(1,260326800,2),(1,276051600,3),(1,291776400,2),(1,307501200,3),(1,323830800,2),(1,338950800,3),(1,354675600,2),(1,370400400,3),(1,386125200,2),(1,401850000,3),(1,417574800,2),(1,433299600,3),(1,449024400,2),(1,465354000,3),(1,481078800,2),(1,496803600,3),(1,512528400,2),(1,528253200,3),(1,543978000,2),(1,559702800,3),(1,575427600,2),(1,591152400,3),(1,606877200,2),(1,622602000,3),(1,638326800,2),(1,654656400,3),(1,670381200,2),(1,686106000,3),(1,701830800,2),(1,717555600,3),(1,733280400,2),(1,749005200,3),(1,764730000,2),(1,780454800,3),(1,796179600,2),(1,811904400,3),(1,828234000,2),(1,846378000,3),(1,859683600,2),(1,877827600,3),(1,891133200,2),(1,909277200,3),(1,922582800,2),(1,941331600,3),(1,954032400,2),(1,972781200,3),(1,985482000,2),(1,1004230800,3),(1,1017536400,2),(1,1035680400,3),(1,1048986000,2),(1,1067130000,3),(1,1080435600,2),(1,1099184400,3),(1,1111885200,2),(1,1130634000,3),(1,1143334800,2),(1,1162083600,3),(1,1174784400,2),(1,1193533200,3),(1,1206838800,2),(1,1224982800,3),(1,1238288400,2),(1,1256432400,3),(1,1269738000,2),(1,1288486800,3),(1,1301187600,2),(1,1319936400,3),(1,1332637200,2),(1,1351386000,3),(1,1364691600,2),(1,1382835600,3),(1,1396141200,2),(1,1414285200,3),(1,1427590800,2),(1,1445734800,3),(1,1459040400,2),(1,1477789200,3),(1,1490490000,2),(1,1509238800,3),(1,1521939600,2),(1,1540688400,3),(1,1553994000,2),(1,1572138000,3),(1,1585443600,2),(1,1603587600,3),(1,1616893200,2),(1,1635642000,3),(1,1648342800,2),(1,1667091600,3),(1,1679792400,2),(1,1698541200,3),(1,1711846800,2),(1,1729990800,3),(1,1743296400,2),(1,1761440400,3),(1,1774746000,2),(1,1792890000,3),(1,1806195600,2),(1,1824944400,3),(1,1837645200,2),(1,1856394000,3),(1,1869094800,2),(1,1887843600,3),(1,1901149200,2),(1,1919293200,3),(1,1932598800,2),(1,1950742800,3),(1,1964048400,2),(1,1982797200,3),(1,1995498000,2),(1,2014246800,3),(1,2026947600,2),(1,2045696400,3),(1,2058397200,2),(1,2077146000,3),(1,2090451600,2),(1,2108595600,3),(1,2121901200,2),(1,2140045200,3),(3,-1688265000,2),(3,-1656819048,1),(3,-1641353448,2),(3,-1627965048,3),(3,-1618716648,1),(3,-1596429048,3),(3,-1593829848,5),(3,-1589860800,4),(3,-1542427200,5),(3,-1539493200,6),(3,-1525323600,5),(3,-1522728000,4),(3,-1491188400,7),(3,-1247536800,4),(3,354920400,5),(3,370728000,4),(3,386456400,5),(3,402264000,4),(3,417992400,5),(3,433800000,4),(3,449614800,5),(3,465346800,8),(3,481071600,9),(3,496796400,8),(3,512521200,9),(3,528246000,8),(3,543970800,9),(3,559695600,8),(3,575420400,9),(3,591145200,8),(3,606870000,9),(3,622594800,8),(3,638319600,9),(3,654649200,8),(3,670374000,10),(3,686102400,11),(3,695779200,8),(3,701812800,5),(3,717534000,4),(3,733273200,9),(3,748998000,8),(3,764722800,9),(3,780447600,8),(3,796172400,9),(3,811897200,8),(3,828226800,9),(3,846370800,8),(3,859676400,9),(3,877820400,8),(3,891126000,9),(3,909270000,8),(3,922575600,9),(3,941324400,8),(3,954025200,9),(3,972774000,8),(3,985474800,9),(3,1004223600,8),(3,1017529200,9),(3,1035673200,8),(3,1048978800,9),(3,1067122800,8),(3,1080428400,9),(3,1099177200,8),(3,1111878000,9),(3,1130626800,8),(3,1143327600,9),(3,1162076400,8),(3,1174777200,9),(3,1193526000,8),(3,1206831600,9),(3,1224975600,8),(3,1238281200,9),(3,1256425200,8),(3,1269730800,9),(3,1288479600,8),(3,1301180400,9),(3,1319929200,8),(3,1332630000,9),(3,1351378800,8),(3,1364684400,9),(3,1382828400,8),(3,1396134000,9),(3,1414278000,8),(3,1427583600,9),(3,1445727600,8),(3,1459033200,9),(3,1477782000,8),(3,1490482800,9),(3,1509231600,8),(3,1521932400,9),(3,1540681200,8),(3,1553986800,9),(3,1572130800,8),(3,1585436400,9),(3,1603580400,8),(3,1616886000,9),(3,1635634800,8),(3,1648335600,9),(3,1667084400,8),(3,1679785200,9),(3,1698534000,8),(3,1711839600,9),(3,1729983600,8),(3,1743289200,9),(3,1761433200,8),(3,1774738800,9),(3,1792882800,8),(3,1806188400,9),(3,1824937200,8),(3,1837638000,9),(3,1856386800,8),(3,1869087600,9),(3,1887836400,8),(3,1901142000,9),(3,1919286000,8),(3,1932591600,9),(3,1950735600,8),(3,1964041200,9),(3,1982790000,8),(3,1995490800,9),(3,2014239600,8),(3,2026940400,9),(3,2045689200,8),(3,2058390000,9),(3,2077138800,8),(3,2090444400,9),(3,2108588400,8),(3,2121894000,9),(3,2140038000,8),(4,-1688265000,2),(4,-1656819048,1),(4,-1641353448,2),(4,-1627965048,3),(4,-1618716648,1),(4,-1596429048,3),(4,-1593829848,5),(4,-1589860800,4),(4,-1542427200,5),(4,-1539493200,6),(4,-1525323600,5),(4,-1522728000,4),(4,-1491188400,7),(4,-1247536800,4),(4,354920409,5),(4,370728010,4),(4,386456410,5),(4,402264011,4),(4,417992411,5),(4,433800012,4),(4,449614812,5),(4,465346812,8),(4,481071612,9),(4,496796413,8),(4,512521213,9),(4,528246013,8),(4,543970813,9),(4,559695613,8),(4,575420414,9),(4,591145214,8),(4,606870014,9),(4,622594814,8),(4,638319615,9),(4,654649215,8),(4,670374016,10),(4,686102416,11),(4,695779216,8),(4,701812816,5),(4,717534017,4),(4,733273217,9),(4,748998018,8),(4,764722818,9),(4,780447619,8),(4,796172419,9),(4,811897219,8),(4,828226820,9),(4,846370820,8),(4,859676420,9),(4,877820421,8),(4,891126021,9),(4,909270021,8),(4,922575622,9),(4,941324422,8),(4,954025222,9),(4,972774022,8),(4,985474822,9),(4,1004223622,8),(4,1017529222,9),(4,1035673222,8),(4,1048978822,9),(4,1067122822,8),(4,1080428422,9),(4,1099177222,8),(4,1111878022,9),(4,1130626822,8),(4,1143327622,9),(4,1162076422,8),(4,1174777222,9),(4,1193526022,8),(4,1206831622,9),(4,1224975622,8),(4,1238281222,9),(4,1256425222,8),(4,1269730822,9),(4,1288479622,8),(4,1301180422,9),(4,1319929222,8),(4,1332630022,9),(4,1351378822,8),(4,1364684422,9),(4,1382828422,8),(4,1396134022,9),(4,1414278022,8),(4,1427583622,9),(4,1445727622,8),(4,1459033222,9),(4,1477782022,8),(4,1490482822,9),(4,1509231622,8),(4,1521932422,9),(4,1540681222,8),(4,1553986822,9),(4,1572130822,8),(4,1585436422,9),(4,1603580422,8),(4,1616886022,9),(4,1635634822,8),(4,1648335622,9),(4,1667084422,8),(4,1679785222,9),(4,1698534022,8),(4,1711839622,9),(4,1729983622,8),(4,1743289222,9),(4,1761433222,8),(4,1774738822,9),(4,1792882822,8),(4,1806188422,9),(4,1824937222,8),(4,1837638022,9),(4,1856386822,8),(4,1869087622,9),(4,1887836422,8),(4,1901142022,9),(4,1919286022,8),(4,1932591622,9),(4,1950735622,8),(4,1964041222,9),(4,1982790022,8),(4,1995490822,9),(4,2014239622,8),(4,2026940422,9),(4,2045689222,8),(4,2058390022,9),(4,2077138822,8),(4,2090444422,9),(4,2108588422,8),(4,2121894022,9),(4,2140038022,8),(5,-1009875600,1);
+INSERT IGNORE INTO `time_zone_transition` VALUES
+(1,-1693706400,0),
+(1,-1680483600,1),
+(1,-1663455600,2),
+(1,-1650150000,3),
+(1,-1632006000,2),
+(1,-1618700400,3),
+(1,-938905200,2),
+(1,-857257200,3),
+(1,-844556400,2),
+(1,-828226800,3),
+(1,-812502000,2),
+(1,-796777200,3),
+(1,228877200,2),
+(1,243997200,3),
+(1,260326800,2),
+(1,276051600,3),
+(1,291776400,2),
+(1,307501200,3),
+(1,323830800,2),
+(1,338950800,3),
+(1,354675600,2),
+(1,370400400,3),
+(1,386125200,2),
+(1,401850000,3),
+(1,417574800,2),
+(1,433299600,3),
+(1,449024400,2),
+(1,465354000,3),
+(1,481078800,2),
+(1,496803600,3),
+(1,512528400,2),
+(1,528253200,3),
+(1,543978000,2),
+(1,559702800,3),
+(1,575427600,2),
+(1,591152400,3),
+(1,606877200,2),
+(1,622602000,3),
+(1,638326800,2),
+(1,654656400,3),
+(1,670381200,2),
+(1,686106000,3),
+(1,701830800,2),
+(1,717555600,3),
+(1,733280400,2),
+(1,749005200,3),
+(1,764730000,2),
+(1,780454800,3),
+(1,796179600,2),
+(1,811904400,3),
+(1,828234000,2),
+(1,846378000,3),
+(1,859683600,2),
+(1,877827600,3),
+(1,891133200,2),
+(1,909277200,3),
+(1,922582800,2),
+(1,941331600,3),
+(1,954032400,2),
+(1,972781200,3),
+(1,985482000,2),
+(1,1004230800,3),
+(1,1017536400,2),
+(1,1035680400,3),
+(1,1048986000,2),
+(1,1067130000,3),
+(1,1080435600,2),
+(1,1099184400,3),
+(1,1111885200,2),
+(1,1130634000,3),
+(1,1143334800,2),
+(1,1162083600,3),
+(1,1174784400,2),
+(1,1193533200,3),
+(1,1206838800,2),
+(1,1224982800,3),
+(1,1238288400,2),
+(1,1256432400,3),
+(1,1269738000,2),
+(1,1288486800,3),
+(1,1301187600,2),
+(1,1319936400,3),
+(1,1332637200,2),
+(1,1351386000,3),
+(1,1364691600,2),
+(1,1382835600,3),
+(1,1396141200,2),
+(1,1414285200,3),
+(1,1427590800,2),
+(1,1445734800,3),
+(1,1459040400,2),
+(1,1477789200,3),
+(1,1490490000,2),
+(1,1509238800,3),
+(1,1521939600,2),
+(1,1540688400,3),
+(1,1553994000,2),
+(1,1572138000,3),
+(1,1585443600,2),
+(1,1603587600,3),
+(1,1616893200,2),
+(1,1635642000,3),
+(1,1648342800,2),
+(1,1667091600,3),
+(1,1679792400,2),
+(1,1698541200,3),
+(1,1711846800,2),
+(1,1729990800,3),
+(1,1743296400,2),
+(1,1761440400,3),
+(1,1774746000,2),
+(1,1792890000,3),
+(1,1806195600,2),
+(1,1824944400,3),
+(1,1837645200,2),
+(1,1856394000,3),
+(1,1869094800,2),
+(1,1887843600,3),
+(1,1901149200,2),
+(1,1919293200,3),
+(1,1932598800,2),
+(1,1950742800,3),
+(1,1964048400,2),
+(1,1982797200,3),
+(1,1995498000,2),
+(1,2014246800,3),
+(1,2026947600,2),
+(1,2045696400,3),
+(1,2058397200,2),
+(1,2077146000,3),
+(1,2090451600,2),
+(1,2108595600,3),
+(1,2121901200,2),
+(1,2140045200,3),
+(3,-1688265000,2),
+(3,-1656819048,1),
+(3,-1641353448,2),
+(3,-1627965048,3),
+(3,-1618716648,1),
+(3,-1596429048,3),
+(3,-1593829848,5),
+(3,-1589860800,4),
+(3,-1542427200,5),
+(3,-1539493200,6),
+(3,-1525323600,5),
+(3,-1522728000,4),
+(3,-1491188400,7),
+(3,-1247536800,4),
+(3,354920400,5),
+(3,370728000,4),
+(3,386456400,5),
+(3,402264000,4),
+(3,417992400,5),
+(3,433800000,4),
+(3,449614800,5),
+(3,465346800,8),
+(3,481071600,9),
+(3,496796400,8),
+(3,512521200,9),
+(3,528246000,8),
+(3,543970800,9),
+(3,559695600,8),
+(3,575420400,9),
+(3,591145200,8),
+(3,606870000,9),
+(3,622594800,8),
+(3,638319600,9),
+(3,654649200,8),
+(3,670374000,10),
+(3,686102400,11),
+(3,695779200,8),
+(3,701812800,5),
+(3,717534000,4),
+(3,733273200,9),
+(3,748998000,8),
+(3,764722800,9),
+(3,780447600,8),
+(3,796172400,9),
+(3,811897200,8),
+(3,828226800,9),
+(3,846370800,8),
+(3,859676400,9),
+(3,877820400,8),
+(3,891126000,9),
+(3,909270000,8),
+(3,922575600,9),
+(3,941324400,8),
+(3,954025200,9),
+(3,972774000,8),
+(3,985474800,9),
+(3,1004223600,8),
+(3,1017529200,9),
+(3,1035673200,8),
+(3,1048978800,9),
+(3,1067122800,8),
+(3,1080428400,9),
+(3,1099177200,8),
+(3,1111878000,9),
+(3,1130626800,8),
+(3,1143327600,9),
+(3,1162076400,8),
+(3,1174777200,9),
+(3,1193526000,8),
+(3,1206831600,9),
+(3,1224975600,8),
+(3,1238281200,9),
+(3,1256425200,8),
+(3,1269730800,9),
+(3,1288479600,8),
+(3,1301180400,9),
+(3,1319929200,8),
+(3,1332630000,9),
+(3,1351378800,8),
+(3,1364684400,9),
+(3,1382828400,8),
+(3,1396134000,9),
+(3,1414278000,8),
+(3,1427583600,9),
+(3,1445727600,8),
+(3,1459033200,9),
+(3,1477782000,8),
+(3,1490482800,9),
+(3,1509231600,8),
+(3,1521932400,9),
+(3,1540681200,8),
+(3,1553986800,9),
+(3,1572130800,8),
+(3,1585436400,9),
+(3,1603580400,8),
+(3,1616886000,9),
+(3,1635634800,8),
+(3,1648335600,9),
+(3,1667084400,8),
+(3,1679785200,9),
+(3,1698534000,8),
+(3,1711839600,9),
+(3,1729983600,8),
+(3,1743289200,9),
+(3,1761433200,8),
+(3,1774738800,9),
+(3,1792882800,8),
+(3,1806188400,9),
+(3,1824937200,8),
+(3,1837638000,9),
+(3,1856386800,8),
+(3,1869087600,9),
+(3,1887836400,8),
+(3,1901142000,9),
+(3,1919286000,8),
+(3,1932591600,9),
+(3,1950735600,8),
+(3,1964041200,9),
+(3,1982790000,8),
+(3,1995490800,9),
+(3,2014239600,8),
+(3,2026940400,9),
+(3,2045689200,8),
+(3,2058390000,9),
+(3,2077138800,8),
+(3,2090444400,9),
+(3,2108588400,8),
+(3,2121894000,9),
+(3,2140038000,8),
+(4,-1688265000,2),
+(4,-1656819048,1),
+(4,-1641353448,2),
+(4,-1627965048,3),
+(4,-1618716648,1),
+(4,-1596429048,3),
+(4,-1593829848,5),
+(4,-1589860800,4),
+(4,-1542427200,5),
+(4,-1539493200,6),
+(4,-1525323600,5),
+(4,-1522728000,4),
+(4,-1491188400,7),
+(4,-1247536800,4),
+(4,354920409,5),
+(4,370728010,4),
+(4,386456410,5),
+(4,402264011,4),
+(4,417992411,5),
+(4,433800012,4),
+(4,449614812,5),
+(4,465346812,8),
+(4,481071612,9),
+(4,496796413,8),
+(4,512521213,9),
+(4,528246013,8),
+(4,543970813,9),
+(4,559695613,8),
+(4,575420414,9),
+(4,591145214,8),
+(4,606870014,9),
+(4,622594814,8),
+(4,638319615,9),
+(4,654649215,8),
+(4,670374016,10),
+(4,686102416,11),
+(4,695779216,8),
+(4,701812816,5),
+(4,717534017,4),
+(4,733273217,9),
+(4,748998018,8),
+(4,764722818,9),
+(4,780447619,8),
+(4,796172419,9),
+(4,811897219,8),
+(4,828226820,9),
+(4,846370820,8),
+(4,859676420,9),
+(4,877820421,8),
+(4,891126021,9),
+(4,909270021,8),
+(4,922575622,9),
+(4,941324422,8),
+(4,954025222,9),
+(4,972774022,8),
+(4,985474822,9),
+(4,1004223622,8),
+(4,1017529222,9),
+(4,1035673222,8),
+(4,1048978822,9),
+(4,1067122822,8),
+(4,1080428422,9),
+(4,1099177222,8),
+(4,1111878022,9),
+(4,1130626822,8),
+(4,1143327622,9),
+(4,1162076422,8),
+(4,1174777222,9),
+(4,1193526022,8),
+(4,1206831622,9),
+(4,1224975622,8),
+(4,1238281222,9),
+(4,1256425222,8),
+(4,1269730822,9),
+(4,1288479622,8),
+(4,1301180422,9),
+(4,1319929222,8),
+(4,1332630022,9),
+(4,1351378822,8),
+(4,1364684422,9),
+(4,1382828422,8),
+(4,1396134022,9),
+(4,1414278022,8),
+(4,1427583622,9),
+(4,1445727622,8),
+(4,1459033222,9),
+(4,1477782022,8),
+(4,1490482822,9),
+(4,1509231622,8),
+(4,1521932422,9),
+(4,1540681222,8),
+(4,1553986822,9),
+(4,1572130822,8),
+(4,1585436422,9),
+(4,1603580422,8),
+(4,1616886022,9),
+(4,1635634822,8),
+(4,1648335622,9),
+(4,1667084422,8),
+(4,1679785222,9),
+(4,1698534022,8),
+(4,1711839622,9),
+(4,1729983622,8),
+(4,1743289222,9),
+(4,1761433222,8),
+(4,1774738822,9),
+(4,1792882822,8),
+(4,1806188422,9),
+(4,1824937222,8),
+(4,1837638022,9),
+(4,1856386822,8),
+(4,1869087622,9),
+(4,1887836422,8),
+(4,1901142022,9),
+(4,1919286022,8),
+(4,1932591622,9),
+(4,1950735622,8),
+(4,1964041222,9),
+(4,1982790022,8),
+(4,1995490822,9),
+(4,2014239622,8),
+(4,2026940422,9),
+(4,2045689222,8),
+(4,2058390022,9),
+(4,2077138822,8),
+(4,2090444422,9),
+(4,2108588422,8),
+(4,2121894022,9),
+(4,2140038022,8),
+(5,-1009875600,1);
/*!40000 ALTER TABLE `time_zone_transition` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `time_zone_transition_type` WRITE;
/*!40000 ALTER TABLE `time_zone_transition_type` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone_transition_type` VALUES (1,0,7200,1,'MEST'),(1,1,3600,0,'MET'),(1,2,7200,1,'MEST'),(1,3,3600,0,'MET'),(2,0,0,0,'UTC'),(3,0,9000,0,'MMT'),(3,1,12648,1,'MST'),(3,2,9048,0,'MMT'),(3,3,16248,1,'MDST'),(3,4,10800,0,'MSK'),(3,5,14400,1,'MSD'),(3,6,18000,1,'MSD'),(3,7,7200,0,'EET'),(3,8,10800,0,'MSK'),(3,9,14400,1,'MSD'),(3,10,10800,1,'EEST'),(3,11,7200,0,'EET'),(4,0,9000,0,'MMT'),(4,1,12648,1,'MST'),(4,2,9048,0,'MMT'),(4,3,16248,1,'MDST'),(4,4,10800,0,'MSK'),(4,5,14400,1,'MSD'),(4,6,18000,1,'MSD'),(4,7,7200,0,'EET'),(4,8,10800,0,'MSK'),(4,9,14400,1,'MSD'),(4,10,10800,1,'EEST'),(4,11,7200,0,'EET'),(5,0,32400,0,'CJT'),(5,1,32400,0,'JST');
+INSERT IGNORE INTO `time_zone_transition_type` VALUES
+(1,0,7200,1,'MEST'),
+(1,1,3600,0,'MET'),
+(1,2,7200,1,'MEST'),
+(1,3,3600,0,'MET'),
+(2,0,0,0,'UTC'),
+(3,0,9000,0,'MMT'),
+(3,1,12648,1,'MST'),
+(3,2,9048,0,'MMT'),
+(3,3,16248,1,'MDST'),
+(3,4,10800,0,'MSK'),
+(3,5,14400,1,'MSD'),
+(3,6,18000,1,'MSD'),
+(3,7,7200,0,'EET'),
+(3,8,10800,0,'MSK'),
+(3,9,14400,1,'MSD'),
+(3,10,10800,1,'EEST'),
+(3,11,7200,0,'EET'),
+(4,0,9000,0,'MMT'),
+(4,1,12648,1,'MST'),
+(4,2,9048,0,'MMT'),
+(4,3,16248,1,'MDST'),
+(4,4,10800,0,'MSK'),
+(4,5,14400,1,'MSD'),
+(4,6,18000,1,'MSD'),
+(4,7,7200,0,'EET'),
+(4,8,10800,0,'MSK'),
+(4,9,14400,1,'MSD'),
+(4,10,10800,1,'EEST'),
+(4,11,7200,0,'EET'),
+(5,0,32400,0,'CJT'),
+(5,1,32400,0,'JST');
/*!40000 ALTER TABLE `time_zone_transition_type` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
diff --git a/mysql-test/main/mysqldump-system.test b/mysql-test/main/mysqldump-system.test
index 7e85fcc1a11..85ad44211a8 100644
--- a/mysql-test/main/mysqldump-system.test
+++ b/mysql-test/main/mysqldump-system.test
@@ -43,13 +43,15 @@ create table mysql.tz like mysql.time_zone_transition;
alter table mysql.tz engine=innodb;
insert into mysql.tz select * from mysql.time_zone_transition;
set global innodb_stats_persistent=1;
+set time_zone="+03:00";
+SET TIMESTAMP= UNIX_TIMESTAMP('2022-01-07 07:07:00');
ANALYZE TABLE mysql.tz PERSISTENT FOR ALL;
# for predictable output in tests
delete from mysql.index_stats where prefix_arity!=1;
delete from mysql.column_stats where column_name!='Time_zone_id';
-set time_zone="+03:00";
update mysql.innodb_index_stats set last_update="2020-01-01" where database_name="mysql" and table_name="tz";
update mysql.innodb_table_stats set last_update="2020-01-01" where database_name="mysql" and table_name="tz";
+update mysql.column_stats set histogram=json_replace(histogram, '$.collected_by', replace(json_value(histogram, '$.collected_by'), @@version, 'version'));
set global innodb_stats_persistent= @save_innodb_stats_persistent;
alter table mysql.time_zone_name ORDER BY Name;
diff --git a/mysql-test/main/mysqldump-timing.result b/mysql-test/main/mysqldump-timing.result
index fe44a1eadd4..7fa11893274 100644
--- a/mysql-test/main/mysqldump-timing.result
+++ b/mysql-test/main/mysqldump-timing.result
@@ -51,7 +51,8 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (0);
+INSERT INTO `t1` VALUES
+(0);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
diff --git a/mysql-test/main/mysqldump-utf8mb4.result b/mysql-test/main/mysqldump-utf8mb4.result
index 50c23c5efa9..904771302f8 100644
--- a/mysql-test/main/mysqldump-utf8mb4.result
+++ b/mysql-test/main/mysqldump-utf8mb4.result
@@ -56,7 +56,8 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES ('01f300','🌀','U+1F300 CYCLONE');
+INSERT INTO `t1` VALUES
+('01f300','🌀','U+1F300 CYCLONE');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
diff --git a/mysql-test/main/mysqldump.result b/mysql-test/main/mysqldump.result
index 2fdd3bbadd6..0a84b89b687 100644
--- a/mysql-test/main/mysqldump.result
+++ b/mysql-test/main/mysqldump.result
@@ -37,7 +37,9 @@ CREATE TABLE `t1` (
`a` decimal(64,20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1234567890123456789012345678901234567890.00000000000000000000),(987654321098765432109876543210987654321.00000000000000000000);
+INSERT INTO `t1` VALUES
+(1234567890123456789012345678901234567890.00000000000000000000),
+(987654321098765432109876543210987654321.00000000000000000000);
DROP TABLE t1;
#
# Bug#2055 mysqldump should replace "-inf" numeric field values with "NULL"
@@ -52,7 +54,8 @@ CREATE TABLE `t1` (
`a` double DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (-1.7976931348623157e308);
+INSERT INTO `t1` VALUES
+(-1.7976931348623157e308);
DROP TABLE t1;
#
# Bug#3361 mysqldump quotes DECIMAL values inconsistently
@@ -74,7 +77,12 @@ CREATE TABLE `t1` (
`b` float DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456);
+INSERT INTO `t1` VALUES
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
@@ -82,7 +90,12 @@ CREATE TABLE `t1` (
`b` float DEFAULT NULL
);
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456);
+INSERT INTO `t1` VALUES
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456);
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -105,7 +118,12 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456);
+INSERT INTO `t1` VALUES
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -132,7 +150,12 @@ CREATE TABLE `t1` (
);
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456),(1.23450,2.3456);
+INSERT INTO `t1` VALUES
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456),
+(1.23450,2.3456);
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
@@ -248,7 +271,9 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1),(2);
+INSERT INTO `t1` VALUES
+(1),
+(2);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -271,7 +296,9 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1),(2);
+INSERT INTO `t1` VALUES
+(1),
+(2);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -534,7 +561,8 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES ('ÄÖÜß');
+INSERT INTO `t1` VALUES
+('ÄÖÜß');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -567,7 +595,8 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES ('Ž™šá');
+INSERT INTO `t1` VALUES
+('Ž™šá');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -590,7 +619,8 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES ('Ž™šá');
+INSERT INTO `t1` VALUES
+('Ž™šá');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -613,7 +643,8 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES ('ÄÖÜß');
+INSERT INTO `t1` VALUES
+('ÄÖÜß');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -652,7 +683,10 @@ CREATE TABLE `t2` (
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
-INSERT INTO `t2` VALUES (4),(5),(6);
+INSERT INTO `t2` VALUES
+(4),
+(5),
+(6);
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -734,7 +768,13 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT IGNORE INTO `t1` VALUES (1),(2),(3),(4),(5),(6);
+INSERT IGNORE INTO `t1` VALUES
+(1),
+(2),
+(3),
+(4),
+(5),
+(6);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -767,7 +807,13 @@ CREATE TABLE `t1` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t1` VALUES (1),(2),(3),(4),(5),(6);
+INSERT DELAYED IGNORE INTO `t1` VALUES
+(1),
+(2),
+(3),
+(4),
+(5),
+(6);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -1512,7 +1558,10 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1),(2),(3);
+INSERT INTO `t1` VALUES
+(1),
+(2),
+(3);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -1731,13 +1780,20 @@ insert into t2 (a, b) values (NULL, NULL),(10, NULL),(NULL, "twenty"),(30, "thir
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (NULL),(10),(20);
+INSERT INTO `t1` VALUES
+(NULL),
+(10),
+(20);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
-INSERT INTO `t2` VALUES (1,NULL,NULL,NULL,NULL,NULL),(2,10,NULL,NULL,NULL,NULL),(3,NULL,'twenty',NULL,NULL,NULL),(4,30,'thirty',NULL,NULL,NULL);
+INSERT INTO `t2` VALUES
+(1,NULL,NULL,NULL,NULL,NULL),
+(2,10,NULL,NULL,NULL,NULL),
+(3,NULL,'twenty',NULL,NULL,NULL),
+(4,30,'thirty',NULL,NULL,NULL);
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -1770,7 +1826,10 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (NULL),(10),(20);
+INSERT INTO `t1` VALUES
+(NULL),
+(10),
+(20);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `t2`;
@@ -1789,7 +1848,11 @@ CREATE TABLE `t2` (
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
-INSERT INTO `t2` VALUES (1,NULL,NULL,NULL,NULL,NULL),(2,10,NULL,NULL,NULL,NULL),(3,NULL,'twenty',NULL,NULL,NULL),(4,30,'thirty',NULL,NULL,NULL);
+INSERT INTO `t2` VALUES
+(1,NULL,NULL,NULL,NULL,NULL),
+(2,10,NULL,NULL,NULL,NULL),
+(3,NULL,'twenty',NULL,NULL,NULL),
+(4,30,'thirty',NULL,NULL,NULL);
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -1976,7 +2039,8 @@ CREATE TABLE "t1" (
LOCK TABLES "t1" WRITE;
/*!40000 ALTER TABLE "t1" DISABLE KEYS */;
-INSERT INTO "t1" VALUES (815,4711,2006);
+INSERT INTO "t1" VALUES
+(815,4711,2006);
/*!40000 ALTER TABLE "t1" ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -2010,7 +2074,8 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (815,4711,2006);
+INSERT INTO `t1` VALUES
+(815,4711,2006);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -2062,7 +2127,12 @@ CREATE TABLE `t2` (
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
-INSERT INTO `t2` VALUES ('alfred'),('angie'),('bingo'),('waffle'),('lemon');
+INSERT INTO `t2` VALUES
+('alfred'),
+('angie'),
+('bingo'),
+('waffle'),
+('lemon');
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `v2`;
@@ -2226,7 +2296,12 @@ CREATE TABLE `t2` (
LOCK TABLES `t2` WRITE;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
-INSERT INTO `t2` VALUES ('alfred'),('angie'),('bingo'),('waffle'),('lemon');
+INSERT INTO `t2` VALUES
+('alfred'),
+('angie'),
+('bingo'),
+('waffle'),
+('lemon');
/*!40000 ALTER TABLE `t2` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `v2`;
@@ -2290,7 +2365,8 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES ('\'');
+INSERT INTO `t1` VALUES
+('\'');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -2338,7 +2414,10 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1,2,'one'),(2,4,'two'),(3,6,'three');
+INSERT INTO `t1` VALUES
+(1,2,'one'),
+(2,4,'two'),
+(3,6,'three');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `v1`;
@@ -2490,7 +2569,11 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1,NULL),(2,NULL),(4,NULL),(11,NULL);
+INSERT INTO `t1` VALUES
+(1,NULL),
+(2,NULL),
+(4,NULL),
+(11,NULL);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
@@ -2619,7 +2702,11 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1,NULL),(2,NULL),(4,NULL),(11,NULL);
+INSERT INTO `t1` VALUES
+(1,NULL),
+(2,NULL),
+(4,NULL),
+(11,NULL);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `t2`;
@@ -2765,7 +2852,12 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1),(2),(3),(4),(5);
+INSERT INTO `t1` VALUES
+(1),
+(2),
+(3),
+(4),
+(5);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
@@ -2917,7 +3009,9 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES ('2003-10-25 22:00:00'),('2003-10-25 23:00:00');
+INSERT INTO `t1` VALUES
+('2003-10-25 22:00:00'),
+('2003-10-25 23:00:00');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -2954,7 +3048,9 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES ('2003-10-26 02:00:00'),('2003-10-26 02:00:00');
+INSERT INTO `t1` VALUES
+('2003-10-26 02:00:00'),
+('2003-10-26 02:00:00');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
@@ -3006,7 +3102,10 @@ CREATE TABLE "t1 test" (
LOCK TABLES "t1 test" WRITE;
/*!40000 ALTER TABLE "t1 test" DISABLE KEYS */;
-INSERT INTO "t1 test" VALUES (1),(2),(3);
+INSERT INTO "t1 test" VALUES
+(1),
+(2),
+(3);
/*!40000 ALTER TABLE "t1 test" ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
@@ -3035,7 +3134,10 @@ CREATE TABLE "t2 test" (
LOCK TABLES "t2 test" WRITE;
/*!40000 ALTER TABLE "t2 test" DISABLE KEYS */;
-INSERT INTO "t2 test" VALUES (1),(2),(3);
+INSERT INTO "t2 test" VALUES
+(1),
+(2),
+(3);
/*!40000 ALTER TABLE "t2 test" ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -3091,7 +3193,10 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1,'first value','xxxx'),(2,'second value','tttt'),(3,'third value','vvv vvv');
+INSERT INTO `t1` VALUES
+(1,'first value','xxxx'),
+(2,'second value','tttt'),
+(3,'third value','vvv vvv');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `v0`;
@@ -3309,7 +3414,8 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (0x00,'');
+INSERT INTO `t1` VALUES
+(0x00,'');
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -3489,7 +3595,11 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1232131),(4711),(3231),(815);
+INSERT INTO `t1` VALUES
+(1232131),
+(4711),
+(3231),
+(815);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `v1`;
@@ -3874,7 +3984,8 @@ CREATE TABLE `t1` (
`c2` longblob DEFAULT NULL
);
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (11,0x7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171);
+INSERT INTO `t1` VALUES
+(11,0x7171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171);
DROP TABLE t1;
#
# Bug#28524 mysqldump --skip-add-drop-table is not
@@ -4106,7 +4217,11 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-REPLACE INTO `t1` VALUES (1,1),(2,3),(3,4),(4,5);
+REPLACE INTO `t1` VALUES
+(1,1),
+(2,3),
+(3,4),
+(4,5);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -4381,7 +4496,11 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1232131),(4711),(3231),(815);
+INSERT INTO `t1` VALUES
+(1232131),
+(4711),
+(3231),
+(815);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
DROP TABLE IF EXISTS `v1`;
@@ -5477,7 +5596,9 @@ CREATE TABLE `basetable` (
`id` smallint(6) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `basetable` VALUES (5),(6);
+INSERT INTO `basetable` VALUES
+(5),
+(6);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `nonunique_table_name` (
@@ -5500,14 +5621,18 @@ CREATE TABLE `nonunique_table_name` (
UNIQUE KEY `i1` (`i1`)
) ENGINE=MEMORY AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `nonunique_table_name` VALUES (1),(2);
+INSERT INTO `nonunique_table_name` VALUES
+(1),
+(2);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `nonunique_table_view_name` (
`i2` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `nonunique_table_view_name` VALUES (3),(4);
+INSERT INTO `nonunique_table_view_name` VALUES
+(3),
+(4);
USE `db1`;
/*!50001 DROP VIEW IF EXISTS `nonunique_table_view_name`*/;
@@ -5536,14 +5661,18 @@ CREATE TABLE `nonunique_table_name` (
UNIQUE KEY `i1` (`i1`)
) ENGINE=MEMORY AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `nonunique_table_name` VALUES (1),(2);
+INSERT INTO `nonunique_table_name` VALUES
+(1),
+(2);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `nonunique_table_view_name` (
`i2` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `nonunique_table_view_name` VALUES (3),(4);
+INSERT INTO `nonunique_table_view_name` VALUES
+(3),
+(4);
##################################################
# --compact --delayed-insert --no-data-med=0 --databases db2 db1
@@ -5558,14 +5687,18 @@ CREATE TABLE `nonunique_table_name` (
UNIQUE KEY `i1` (`i1`)
) ENGINE=MEMORY AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT DELAYED INTO `nonunique_table_name` VALUES (1),(2);
+INSERT DELAYED INTO `nonunique_table_name` VALUES
+(1),
+(2);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `nonunique_table_view_name` (
`i2` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `nonunique_table_view_name` VALUES (3),(4);
+INSERT INTO `nonunique_table_view_name` VALUES
+(3),
+(4);
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */;
@@ -5576,14 +5709,18 @@ CREATE TABLE `basetable` (
`id` smallint(6) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT DELAYED INTO `basetable` VALUES (5),(6);
+INSERT DELAYED INTO `basetable` VALUES
+(5),
+(6);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `nonunique_table_name` (
`i3` smallint(6) DEFAULT NULL
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci INSERT_METHOD=LAST UNION=(`basetable`);
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `nonunique_table_name` VALUES (5),(6);
+INSERT INTO `nonunique_table_name` VALUES
+(5),
+(6);
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE VIEW `nonunique_table_view_name` AS SELECT
@@ -6049,7 +6186,8 @@ CREATE TABLE `t1` (
`b` int(11) INVISIBLE DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` (`a`, `b`) VALUES (1,NULL),(1,2);
+INSERT INTO `t1` (`a`, `b`) VALUES (1,NULL),
+(1,2);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
@@ -6057,7 +6195,9 @@ CREATE TABLE `t2` (
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t2` VALUES (1,2),(1,2);
+INSERT INTO `t2` VALUES
+(1,2),
+(1,2);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t3` (
@@ -6066,14 +6206,18 @@ CREATE TABLE `t3` (
`ds=~!@ \# $% ^ & * ( ) _ - = +` int(11) INVISIBLE DEFAULT 5
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t3` (`invisible`, `a b c & $!@#$%^&*( )`, `ds=~!@ \# $% ^ & * ( ) _ - = +`) VALUES (1,4,5),(5,4,5),(2,4,5),(1,2,3);
+INSERT INTO `t3` (`invisible`, `a b c & $!@#$%^&*( )`, `ds=~!@ \# $% ^ & * ( ) _ - = +`) VALUES (1,4,5),
+(5,4,5),
+(2,4,5),
+(1,2,3);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t4` (
`ËÃÃŒÃÎËÃ1` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t4` VALUES (1);
+INSERT INTO `t4` VALUES
+(1);
#Check side effect on --complete insert
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
@@ -6082,7 +6226,8 @@ CREATE TABLE `t1` (
`b` int(11) INVISIBLE DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` (`a`, `b`) VALUES (1,NULL),(1,2);
+INSERT INTO `t1` (`a`, `b`) VALUES (1,NULL),
+(1,2);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
@@ -6090,7 +6235,8 @@ CREATE TABLE `t2` (
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t2` (`a`, `b`) VALUES (1,2),(1,2);
+INSERT INTO `t2` (`a`, `b`) VALUES (1,2),
+(1,2);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t3` (
@@ -6099,7 +6245,10 @@ CREATE TABLE `t3` (
`ds=~!@ \# $% ^ & * ( ) _ - = +` int(11) INVISIBLE DEFAULT 5
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t3` (`invisible`, `a b c & $!@#$%^&*( )`, `ds=~!@ \# $% ^ & * ( ) _ - = +`) VALUES (1,4,5),(5,4,5),(2,4,5),(1,2,3);
+INSERT INTO `t3` (`invisible`, `a b c & $!@#$%^&*( )`, `ds=~!@ \# $% ^ & * ( ) _ - = +`) VALUES (1,4,5),
+(5,4,5),
+(2,4,5),
+(1,2,3);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t4` (
diff --git a/mysql-test/main/mysqldump.test b/mysql-test/main/mysqldump.test
index 7dc3cfe8558..238d90e4cdc 100644
--- a/mysql-test/main/mysqldump.test
+++ b/mysql-test/main/mysqldump.test
@@ -965,8 +965,8 @@ DROP TABLE t1, t2;
[mysqltest1]
port=1234
EOF
---exec $MYSQL_MY_PRINT_DEFAULTS -c $MYSQLTEST_VARDIR/tmp/tmp.cnf mysqltest1
---exec $MYSQL_MY_PRINT_DEFAULTS -e $MYSQLTEST_VARDIR/tmp/tmp.cnf mysqltest1 mysqltest1
+--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-file=$MYSQLTEST_VARDIR/tmp/tmp.cnf mysqltest1
+--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-extra-file=$MYSQLTEST_VARDIR/tmp/tmp.cnf mysqltest1 mysqltest1
--remove_file $MYSQLTEST_VARDIR/tmp/tmp.cnf
--echo #
diff --git a/mysql-test/main/natural_sort_key.result b/mysql-test/main/natural_sort_key.result
new file mode 100644
index 00000000000..218a3e2cd9c
--- /dev/null
+++ b/mysql-test/main/natural_sort_key.result
@@ -0,0 +1,214 @@
+SET NAMES utf8mb4;
+SELECT NATURAL_SORT_KEY(NULL);
+NATURAL_SORT_KEY(NULL)
+NULL
+SELECT NATURAL_SORT_KEY(repeat('a1',@@max_allowed_packet/2-1));
+NATURAL_SORT_KEY(repeat('a1',@@max_allowed_packet/2-1))
+NULL
+Warnings:
+Warning 1301 Result of natural_sort_key() was larger than max_allowed_packet (16777216) - truncated
+SELECT NATURAL_SORT_KEY(repeat('1',@@max_allowed_packet-1));
+NATURAL_SORT_KEY(repeat('1',@@max_allowed_packet-1))
+NULL
+Warnings:
+Warning 1301 Result of natural_sort_key() was larger than max_allowed_packet (16777216) - truncated
+CREATE TABLE t1(
+c VARCHAR(30) CHARACTER SET latin1 COLLATE latin1_bin,
+k VARCHAR(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci AS (NATURAL_SORT_KEY(CONVERT(c USING utf8mb4))) VIRTUAL INVISIBLE);
+INSERT INTO t1 values
+('A1'),('a1'),('A100'),('a100'),('A2'),('ä2'),('a2'),('A99'),
+('äb'),('B1'),('B100'),('B9'),('C'),('100');
+#Natural sort order.
+SELECT c FROM t1 ORDER BY k,c;
+c
+100
+A1
+a1
+A2
+a2
+ä2
+A99
+A100
+a100
+äb
+B1
+B9
+B100
+C
+#Unnatural but unicode aware) sort order
+SELECT c FROM t1 ORDER BY CONVERT(c USING utf8mb4) COLLATE utf8mb4_unicode_ci,c;
+c
+100
+A1
+a1
+A100
+a100
+A2
+a2
+ä2
+A99
+äb
+B1
+B100
+B9
+C
+CREATE TABLE t2 AS SELECT c, NATURAL_SORT_KEY(c) FROM t1 WHERE 0;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `c` varchar(30) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
+ `NATURAL_SORT_KEY(c)` varchar(45) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t1,t2;
+CREATE TABLE t1(c VARCHAR(1), k VARCHAR(2) AS (NATURAL_SORT_KEY(c)) STORED);
+ERROR HY000: Function or expression 'natural_sort_key()' cannot be used in the GENERATED ALWAYS AS clause of `k`
+SELECT RPAD(val,28,' ') value , RPAD(NATURAL_SORT_KEY(val),36,' ') sortkey , LENGTH(NATURAL_SORT_KEY(val)) - LENGTH(val) encoding_overhead
+FROM
+(
+SELECT '0' val
+UNION SELECT seq FROM seq_1_to_9
+UNION SELECT CONCAT('1',repeat('0',seq)) FROM seq_1_to_27
+) AS numbers ORDER BY sortkey;
+value sortkey encoding_overhead
+0 00 1
+1 01 1
+2 02 1
+3 03 1
+4 04 1
+5 05 1
+6 06 1
+7 07 1
+8 08 1
+9 09 1
+10 110 1
+100 2100 1
+1000 31000 1
+10000 410000 1
+100000 5100000 1
+1000000 61000000 1
+10000000 710000000 1
+100000000 8100000000 1
+1000000000 901000000000 2
+10000000000 9110000000000 2
+100000000000 92100000000000 2
+1000000000000 931000000000000 2
+10000000000000 9410000000000000 2
+100000000000000 95100000000000000 2
+1000000000000000 961000000000000000 2
+10000000000000000 9710000000000000000 2
+100000000000000000 98100000000000000000 2
+1000000000000000000 9901000000000000000000 3
+10000000000000000000 99110000000000000000000 3
+100000000000000000000 992100000000000000000000 3
+1000000000000000000000 9931000000000000000000000 3
+10000000000000000000000 99410000000000000000000000 3
+100000000000000000000000 995100000000000000000000000 3
+1000000000000000000000000 9961000000000000000000000000 3
+10000000000000000000000000 99710000000000000000000000000 3
+100000000000000000000000000 998100000000000000000000000000 3
+1000000000000000000000000000 99901271000000000000000000000000000 7
+SELECT natural_sort_key('1') = natural_sort_key('0001');
+natural_sort_key('1') = natural_sort_key('0001')
+1
+SELECT natural_sort_key('1.1') = natural_sort_key('1.00001');
+natural_sort_key('1.1') = natural_sort_key('1.00001')
+1
+SELECT RPAD(val,20,' ') value, NATURAL_SORT_KEY(val) FROM
+(SELECT '' val WHERE 0 UNION VALUES
+('fred'),
+('pic2'),
+('pic100a'),
+('pic120'),
+('pic121'),
+('jane'),
+('tom'),
+('pic02a'),
+('pic3'),
+('pic4'),
+('1-20'),
+('pic100'),
+('pic02000'),
+('10-20'),
+('1-02'),
+('1-2'),
+('pic01'),
+('pic02'),
+('pic 6'),
+('pic 7'),
+('pic 5'),
+('pic05'),
+('pic 5 '),
+('pic 5 something'),
+('pic 4 else'),
+('2000-1-10'),
+('1999-12-25'),
+('1999-3-3'),
+('2000-3-23'),
+('2000-1-2'),
+('100.200.300.400'),
+('100.50.60.70'),
+('100.8.9.0'),
+('a1b1'),
+('a01b2'),
+('a1b2'),
+('a01b3')
+)AS data ORDER BY 2,1;
+value NATURAL_SORT_KEY(val)
+1-02 01-02
+1-2 01-02
+1-20 01-120
+10-20 110-120
+100.8.9.0 2100.08.09.00
+100.50.60.70 2100.150.160.170
+100.200.300.400 2100.2200.2300.2400
+1999-3-3 31999-03-03
+1999-12-25 31999-112-125
+2000-1-2 32000-01-02
+2000-1-10 32000-01-110
+2000-3-23 32000-03-123
+a1b1 a01b01
+a01b2 a01b02
+a1b2 a01b02
+a01b3 a01b03
+fred fred
+jane jane
+pic 7 pic 07
+pic 4 else pic 04 else
+pic 5 pic 05
+pic 5 something pic 05 something
+pic 6 pic 06
+pic01 pic01
+pic02 pic02
+pic2 pic02
+pic02a pic02a
+pic3 pic03
+pic4 pic04
+pic05 pic05
+pic100 pic2100
+pic100a pic2100a
+pic120 pic2120
+pic121 pic2121
+pic02000 pic32000
+tom tom
+create table t (a varchar(8), b varchar(8) as (natural_sort_key(a)));
+insert into t (a) values ('a2'),(NULL),('a11');
+select * from t order by b;
+a b
+NULL NULL
+a2 a02
+a11 a111
+select a, b from t order by b;
+a b
+NULL NULL
+a2 a02
+a11 a111
+drop table t;
+select natural_sort_key(_utf16 0x0031),natural_sort_key(_ucs2 0x0031), natural_sort_key(_utf32 0x00000031);
+natural_sort_key(_utf16 0x0031) natural_sort_key(_ucs2 0x0031) natural_sort_key(_utf32 0x00000031)
+01 01 01
+select get_lock('a', 0);
+get_lock('a', 0)
+1
+select natural_sort_key(release_lock('a'));
+natural_sort_key(release_lock('a'))
+01
diff --git a/mysql-test/main/natural_sort_key.test b/mysql-test/main/natural_sort_key.test
new file mode 100644
index 00000000000..811f937750c
--- /dev/null
+++ b/mysql-test/main/natural_sort_key.test
@@ -0,0 +1,102 @@
+--source include/have_sequence.inc
+
+SET NAMES utf8mb4;
+SELECT NATURAL_SORT_KEY(NULL);
+
+#Test that max packet overflow produces NULL plus warning
+SELECT NATURAL_SORT_KEY(repeat('a1',@@max_allowed_packet/2-1));
+SELECT NATURAL_SORT_KEY(repeat('1',@@max_allowed_packet-1));
+
+#Test with virtual
+CREATE TABLE t1(
+ c VARCHAR(30) CHARACTER SET latin1 COLLATE latin1_bin,
+ k VARCHAR(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci AS (NATURAL_SORT_KEY(CONVERT(c USING utf8mb4))) VIRTUAL INVISIBLE);
+
+INSERT INTO t1 values
+ ('A1'),('a1'),('A100'),('a100'),('A2'),('ä2'),('a2'),('A99'),
+ ('äb'),('B1'),('B100'),('B9'),('C'),('100');
+
+-- echo #Natural sort order.
+# We sort by 2 colums, for stable sort,as we do not currenly have a case and accent insensitive Unicode collation.
+SELECT c FROM t1 ORDER BY k,c;
+-- echo #Unnatural but unicode aware) sort order
+SELECT c FROM t1 ORDER BY CONVERT(c USING utf8mb4) COLLATE utf8mb4_unicode_ci,c;
+# CREATE TABLE AS SELECT, to see that length of the column is correct.
+CREATE TABLE t2 AS SELECT c, NATURAL_SORT_KEY(c) FROM t1 WHERE 0;
+SHOW CREATE TABLE t2;
+DROP TABLE t1,t2;
+
+#Virtual STORED is temporarily disabled
+--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED
+CREATE TABLE t1(c VARCHAR(1), k VARCHAR(2) AS (NATURAL_SORT_KEY(c)) STORED);
+
+#Show encoding of numbers.
+SELECT RPAD(val,28,' ') value , RPAD(NATURAL_SORT_KEY(val),36,' ') sortkey , LENGTH(NATURAL_SORT_KEY(val)) - LENGTH(val) encoding_overhead
+FROM
+(
+SELECT '0' val
+UNION SELECT seq FROM seq_1_to_9
+UNION SELECT CONCAT('1',repeat('0',seq)) FROM seq_1_to_27
+) AS numbers ORDER BY sortkey;
+
+# leading zeros ignored
+SELECT natural_sort_key('1') = natural_sort_key('0001');
+SELECT natural_sort_key('1.1') = natural_sort_key('1.00001');
+
+# Some examples from https://github.com/sourcefrog/natsort/
+# words
+SELECT RPAD(val,20,' ') value, NATURAL_SORT_KEY(val) FROM
+(SELECT '' val WHERE 0 UNION VALUES
+('fred'),
+('pic2'),
+('pic100a'),
+('pic120'),
+('pic121'),
+('jane'),
+('tom'),
+('pic02a'),
+('pic3'),
+('pic4'),
+('1-20'),
+('pic100'),
+('pic02000'),
+('10-20'),
+('1-02'),
+('1-2'),
+('pic01'),
+('pic02'),
+('pic 6'),
+('pic 7'),
+('pic 5'),
+('pic05'),
+('pic 5 '),
+('pic 5 something'),
+('pic 4 else'),
+('2000-1-10'),
+('1999-12-25'),
+('1999-3-3'),
+('2000-3-23'),
+('2000-1-2'),
+('100.200.300.400'),
+('100.50.60.70'),
+('100.8.9.0'),
+('a1b1'),
+('a01b2'),
+('a1b2'),
+('a01b3')
+)AS data ORDER BY 2,1;
+
+# MDEV-27686 (null value indicator not always reset)
+create table t (a varchar(8), b varchar(8) as (natural_sort_key(a)));
+insert into t (a) values ('a2'),(NULL),('a11');
+select * from t order by b;
+select a, b from t order by b;
+drop table t;
+
+# MDEV-26796 Natural sort does not work for utf32/utf16/ucs2
+select natural_sort_key(_utf16 0x0031),natural_sort_key(_ucs2 0x0031), natural_sort_key(_utf32 0x00000031);
+
+# MDEV-26806 Server crash in Charset::charset / Item_func_natural_sort_key::val_str
+select get_lock('a', 0);
+select natural_sort_key(release_lock('a'));
+
diff --git a/mysql-test/main/openssl_1.result b/mysql-test/main/openssl_1.result
index 029fa47f263..a5ac8956b2f 100644
--- a/mysql-test/main/openssl_1.result
+++ b/mysql-test/main/openssl_1.result
@@ -98,7 +98,9 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1),(2);
+INSERT INTO `t1` VALUES
+(1),
+(2);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -132,7 +134,9 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1),(2);
+INSERT INTO `t1` VALUES
+(1),
+(2);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -166,7 +170,9 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT INTO `t1` VALUES (1),(2);
+INSERT INTO `t1` VALUES
+(1),
+(2);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result
index 6a6032e5271..02b448eabc3 100644
--- a/mysql-test/main/opt_trace.result
+++ b/mysql-test/main/opt_trace.result
@@ -1019,7 +1019,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b {
"access_type": "ref",
"index": "a",
"used_range_estimates": false,
- "cause": "not available",
+ "reason": "not available",
"rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 200.0585794,
@@ -1076,7 +1076,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b {
"access_type": "ref",
"index": "a",
"used_range_estimates": false,
- "cause": "not available",
+ "reason": "not available",
"rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 200.0585794,
@@ -2082,12 +2082,12 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 {
{
"column_name": "a",
"ranges": ["1 <= a <= 1"],
- "selectivity_from_histogram": 0.1796875
+ "selectivity_from_histogram": 0.181
},
{
"column_name": "b",
"ranges": ["2 <= b <= 2"],
- "selectivity_from_histogram": 0.015625
+ "selectivity_from_histogram": 0.021
}
],
"cond_selectivity": 0.021
@@ -2167,6 +2167,7 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 {
{
"index": "a_a",
"can_resolve_order": true,
+ "direction": 1,
"updated_limit": 47,
"index_scan_time": 47,
"usable": false,
@@ -2175,6 +2176,7 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 {
{
"index": "a_c",
"can_resolve_order": true,
+ "direction": 1,
"updated_limit": 47,
"range_scan_time": 4.331020747,
"index_scan_time": 4.331020747,
@@ -2813,15 +2815,6 @@ explain extended select * from t1 where a in (select pk from t10) {
"transformation": {
"select_id": 2,
"from": "IN (SELECT)",
- "to": "materialization",
- "sjm_scan_allowed": true,
- "possible": true
- }
- },
- {
- "transformation": {
- "select_id": 2,
- "from": "IN (SELECT)",
"to": "semijoin",
"chosen": true
}
@@ -2846,6 +2839,15 @@ explain extended select * from t1 where a in (select pk from t10) {
"transformation": {
"select_id": 2,
"from": "IN (SELECT)",
+ "to": "materialization",
+ "sjm_scan_allowed": true,
+ "possible": true
+ }
+ },
+ {
+ "transformation": {
+ "select_id": 2,
+ "from": "IN (SELECT)",
"to": "semijoin",
"converted_to_semi_join": true
}
@@ -4029,7 +4031,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 {
"access_type": "ref",
"index": "a",
"used_range_estimates": false,
- "cause": "not better than ref estimates",
+ "reason": "not better than ref estimates",
"rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 3.001757383,
@@ -4086,7 +4088,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 {
"index": "a",
"rec_per_key_stats_missing": true,
"used_range_estimates": false,
- "cause": "not better than ref estimates",
+ "reason": "not better than ref estimates",
"rowid_filter_skipped": "worst/max seeks clipping",
"rows": 2,
"cost": 3.003514767,
@@ -4383,15 +4385,6 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_
"transformation": {
"select_id": 2,
"from": "IN (SELECT)",
- "to": "materialization",
- "sjm_scan_allowed": true,
- "possible": true
- }
- },
- {
- "transformation": {
- "select_id": 2,
- "from": "IN (SELECT)",
"to": "semijoin",
"chosen": true
}
@@ -4416,6 +4409,15 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_
"transformation": {
"select_id": 2,
"from": "IN (SELECT)",
+ "to": "materialization",
+ "sjm_scan_allowed": true,
+ "possible": true
+ }
+ },
+ {
+ "transformation": {
+ "select_id": 2,
+ "from": "IN (SELECT)",
"to": "semijoin",
"converted_to_semi_join": true
}
@@ -4832,15 +4834,6 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"transformation": {
"select_id": 2,
"from": "IN (SELECT)",
- "to": "materialization",
- "sjm_scan_allowed": true,
- "possible": true
- }
- },
- {
- "transformation": {
- "select_id": 2,
- "from": "IN (SELECT)",
"to": "semijoin",
"chosen": true
}
@@ -4859,15 +4852,6 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"transformation": {
"select_id": 3,
"from": "IN (SELECT)",
- "to": "materialization",
- "sjm_scan_allowed": true,
- "possible": true
- }
- },
- {
- "transformation": {
- "select_id": 3,
- "from": "IN (SELECT)",
"to": "semijoin",
"chosen": true
}
@@ -4892,6 +4876,15 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"transformation": {
"select_id": 2,
"from": "IN (SELECT)",
+ "to": "materialization",
+ "sjm_scan_allowed": true,
+ "possible": true
+ }
+ },
+ {
+ "transformation": {
+ "select_id": 2,
+ "from": "IN (SELECT)",
"to": "semijoin",
"converted_to_semi_join": true
}
@@ -4900,6 +4893,15 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"transformation": {
"select_id": 3,
"from": "IN (SELECT)",
+ "to": "materialization",
+ "sjm_scan_allowed": true,
+ "possible": true
+ }
+ },
+ {
+ "transformation": {
+ "select_id": 3,
+ "from": "IN (SELECT)",
"to": "semijoin",
"converted_to_semi_join": true
}
@@ -6406,15 +6408,6 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"transformation": {
"select_id": 2,
"from": "IN (SELECT)",
- "to": "materialization",
- "sjm_scan_allowed": true,
- "possible": true
- }
- },
- {
- "transformation": {
- "select_id": 2,
- "from": "IN (SELECT)",
"to": "semijoin",
"chosen": true
}
@@ -6433,15 +6426,6 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"transformation": {
"select_id": 3,
"from": "IN (SELECT)",
- "to": "materialization",
- "sjm_scan_allowed": true,
- "possible": true
- }
- },
- {
- "transformation": {
- "select_id": 3,
- "from": "IN (SELECT)",
"to": "semijoin",
"chosen": true
}
@@ -6466,6 +6450,15 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"transformation": {
"select_id": 2,
"from": "IN (SELECT)",
+ "to": "materialization",
+ "sjm_scan_allowed": true,
+ "possible": true
+ }
+ },
+ {
+ "transformation": {
+ "select_id": 2,
+ "from": "IN (SELECT)",
"to": "semijoin",
"converted_to_semi_join": true
}
@@ -6474,6 +6467,15 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"transformation": {
"select_id": 3,
"from": "IN (SELECT)",
+ "to": "materialization",
+ "sjm_scan_allowed": true,
+ "possible": true
+ }
+ },
+ {
+ "transformation": {
+ "select_id": 3,
+ "from": "IN (SELECT)",
"to": "semijoin",
"converted_to_semi_join": true
}
@@ -7898,17 +7900,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["start_date"],
- "key": "start_date",
- "key_length": "8",
- "used_key_parts": ["start_date", "end_date"],
- "rows": 1000,
- "filtered": 100,
- "index_condition": "t1.start_date >= '2019-02-10' and t1.end_date < '2019-04-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["start_date"],
+ "key": "start_date",
+ "key_length": "8",
+ "used_key_parts": ["start_date", "end_date"],
+ "rows": 1000,
+ "filtered": 100,
+ "index_condition": "t1.start_date >= '2019-02-10' and t1.end_date < '2019-04-01'"
+ }
+ }
+ ]
}
}
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -7984,20 +7990,20 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
[
{
"access_type": "scan",
- "resulting_rows": 5.9375,
- "cost": 2.829589844,
+ "resulting_rows": 5,
+ "cost": 3.017089844,
"chosen": true
}
],
"chosen_access_method":
{
"type": "scan",
- "records": 5.9375,
- "cost": 2.829589844,
+ "records": 5,
+ "cost": 3.017089844,
"uses_join_buffering": false
}
},
- "rows_for_plan": 5.9375,
+ "rows_for_plan": 5,
"cost_for_plan": 4.017089844,
"rest_of_plan":
[
@@ -8011,21 +8017,21 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
[
{
"access_type": "scan",
- "resulting_rows": 804.6875,
- "cost": 256.8548584,
+ "resulting_rows": 800,
+ "cost": 220.9863281,
"chosen": true
}
],
"chosen_access_method":
{
"type": "scan",
- "records": 804.6875,
- "cost": 256.8548584,
+ "records": 800,
+ "cost": 220.9863281,
"uses_join_buffering": false
}
},
- "rows_for_plan": 4777.832031,
- "cost_for_plan": 1216.438354
+ "rows_for_plan": 4000,
+ "cost_for_plan": 1025.003418
}
]
},
@@ -8039,20 +8045,20 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
[
{
"access_type": "scan",
- "resulting_rows": 804.6875,
- "cost": 43.25976562,
+ "resulting_rows": 800,
+ "cost": 44.19726562,
"chosen": true
}
],
"chosen_access_method":
{
"type": "scan",
- "records": 804.6875,
- "cost": 43.25976562,
+ "records": 800,
+ "cost": 44.19726562,
"uses_join_buffering": false
}
},
- "rows_for_plan": 804.6875,
+ "rows_for_plan": 800,
"cost_for_plan": 204.1972656,
"pruned_by_heuristic": true
}
@@ -8107,7 +8113,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"access_type": "ref",
"index": "b",
"used_range_estimates": false,
- "cause": "not available",
+ "reason": "not available",
"rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 20.00585794,
@@ -8115,8 +8121,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
},
{
"access_type": "scan",
- "resulting_rows": 804.6875,
- "cost": 43.25976562,
+ "resulting_rows": 800,
+ "cost": 44.19726562,
"chosen": false
}
],
@@ -8130,8 +8136,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
},
"rows_for_plan": 10,
"cost_for_plan": 26.02294779,
- "selectivity": 0.8046875,
- "estimated_join_cardinality": 8.046875
+ "selectivity": 0.8,
+ "estimated_join_cardinality": 8
}
]
},
@@ -8145,20 +8151,20 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
[
{
"access_type": "scan",
- "resulting_rows": 804.6875,
- "cost": 43.25976562,
+ "resulting_rows": 800,
+ "cost": 44.19726562,
"chosen": true
}
],
"chosen_access_method":
{
"type": "scan",
- "records": 804.6875,
- "cost": 43.25976562,
+ "records": 800,
+ "cost": 44.19726562,
"uses_join_buffering": false
}
},
- "rows_for_plan": 804.6875,
+ "rows_for_plan": 800,
"cost_for_plan": 204.1972656,
"pruned_by_cost": true
}
@@ -8310,7 +8316,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"access_type": "ref",
"index": "a",
"used_range_estimates": false,
- "cause": "not available",
+ "reason": "not available",
"rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 20.00585794,
@@ -8378,7 +8384,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"access_type": "ref",
"index": "a",
"used_range_estimates": false,
- "cause": "not available",
+ "reason": "not available",
"rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 200.0585794,
@@ -8421,7 +8427,7 @@ test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
EXPLAIN EXTENDED SELECT * from t1 WHERE a between 1 and 5 and b <= 5;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 0.22 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 0.25 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` between 1 and 5 and `test`.`t1`.`b` <= 5
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -8432,19 +8438,19 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
"column_name": "a",
"ranges":
["1 <= a <= 5"],
- "selectivity_from_histogram": 0.046875
+ "selectivity_from_histogram": 0.05
},
{
"column_name": "b",
"ranges":
["NULL < b <= 5"],
- "selectivity_from_histogram": 0.046875
+ "selectivity_from_histogram": 0.05
}
]
]
EXPLAIN EXTENDED SELECT * from t1 WHERE a != 5;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 99.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` <> 5
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -8458,13 +8464,13 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
"NULL < a < 5",
"5 < a"
],
- "selectivity_from_histogram": 1
+ "selectivity_from_histogram": 0.99
}
]
]
EXPLAIN EXTENDED SELECT * from t1 WHERE b >= 10 and b < 25;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 15.62 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 15.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`b` >= 10 and `test`.`t1`.`b` < 25
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -8475,7 +8481,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
"column_name": "b",
"ranges":
["10 <= b < 25"],
- "selectivity_from_histogram": 0.15625
+ "selectivity_from_histogram": 0.15
}
]
]
@@ -8728,16 +8734,6 @@ json_detailed(json_extract(trace, '$**.in_to_subquery_conversion'))
{
"select_id": 2,
"from": "IN (SELECT)",
- "to": "materialization",
- "sjm_scan_allowed": true,
- "possible": true
- }
- },
- {
- "transformation":
- {
- "select_id": 2,
- "from": "IN (SELECT)",
"to": "semijoin",
"chosen": true
}
@@ -8998,7 +8994,7 @@ json_detailed(json_extract(trace, '$**.choose_best_splitting'))
"access_type": "ref",
"index": "idx_a",
"used_range_estimates": false,
- "cause": "not available",
+ "reason": "not available",
"rows": 1.8367,
"cost": 2.000585794,
"chosen": true
diff --git a/mysql-test/main/opt_trace_ucs2.result b/mysql-test/main/opt_trace_ucs2.result
index 8eb3ec521fa..9e4f25f3150 100644
--- a/mysql-test/main/opt_trace_ucs2.result
+++ b/mysql-test/main/opt_trace_ucs2.result
@@ -7,17 +7,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["col1"],
- "key": "col1",
- "key_length": "21",
- "used_key_parts": ["col1"],
- "rows": 2,
- "filtered": 100,
- "index_condition": "t1.col1 >= 'a'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["col1"],
+ "key": "col1",
+ "key_length": "21",
+ "used_key_parts": ["col1"],
+ "rows": 2,
+ "filtered": 100,
+ "index_condition": "t1.col1 >= 'a'"
+ }
+ }
+ ]
}
}
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
diff --git a/mysql-test/main/order_by.result b/mysql-test/main/order_by.result
index 5f56201af9c..b6345cd142e 100644
--- a/mysql-test/main/order_by.result
+++ b/mysql-test/main/order_by.result
@@ -1,5 +1,4 @@
call mtr.add_suppression("Sort aborted.*");
-drop table if exists t1,t2,t3;
call mtr.add_suppression("Out of sort memory; increase server sort buffer size");
CREATE TABLE t1 (
id int(6) DEFAULT '0' NOT NULL,
@@ -3401,30 +3400,34 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 5,
- "filesort": {
- "sort_key": "t1.a",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_limit": 5,
- "r_used_priority_queue": false,
- "r_output_rows": 100,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "sort_key,packed_addon_fields",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 100,
- "r_rows": 100,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "r_rows": 5,
+ "filesort": {
+ "sort_key": "t1.a",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_limit": 5,
+ "r_used_priority_queue": false,
+ "r_output_rows": 100,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "sort_key,packed_addon_fields",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 100,
+ "r_rows": 100,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
SELECT * FROM t1 ORDER BY a LIMIT 5;
@@ -3751,29 +3754,33 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 100,
- "filesort": {
- "sort_key": "t1.a, t1.b, t1.c",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 100,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "sort_key,packed_addon_fields",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 100,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 100,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "filesort": {
+ "sort_key": "t1.a, t1.b, t1.c",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 100,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "sort_key,packed_addon_fields",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 100,
+ "r_rows": 100,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
select * from t1 order by a,b,c;
@@ -3910,29 +3917,33 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 5,
- "filesort": {
- "sort_key": "t1.b desc",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 5,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "packed_sort_key,rowid",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 5,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 5,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "filesort": {
+ "sort_key": "t1.b desc",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 5,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "packed_sort_key,rowid",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 5,
+ "r_rows": 5,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
drop table t1;
@@ -3952,29 +3963,33 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 6,
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 6,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "packed_sort_key,rowid",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 6,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 6,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "packed_sort_key,rowid",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 6,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
select a, b, c from t1 order by a, b;
@@ -4000,29 +4015,33 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 6,
- "filesort": {
- "sort_key": "t1.a, t1.b",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 6,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "sort_key,packed_addon_fields",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 6,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "filesort": {
+ "sort_key": "t1.a, t1.b",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 6,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "sort_key,packed_addon_fields",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 6,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
select a, b, c from t1 order by a, b;
@@ -4062,29 +4081,33 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 10,
- "filesort": {
- "sort_key": "t1.a",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 10,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "packed_sort_key,packed_addon_fields",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "filesort": {
+ "sort_key": "t1.a",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 10,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "packed_sort_key,packed_addon_fields",
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
drop table t1;
@@ -4237,17 +4260,21 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 50,
- "r_rows": 50,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 50,
+ "r_rows": 50,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
@@ -4266,18 +4293,22 @@ ANALYZE
"r_buffer_size": "REPLACED" across executions)",
"r_sort_mode": "sort_key,rowid",
"temporary_table": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 50,
- "rows": 50,
- "r_rows": 50,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 2,
- "attached_condition": "t1.b = t2.b"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 50,
+ "rows": 50,
+ "r_rows": 50,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 2,
+ "attached_condition": "t1.b = t2.b"
+ }
+ }
+ ]
}
}
}
@@ -4367,43 +4398,53 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "read_sorted_file": {
- "filesort": {
- "sort_key": "t1.a desc",
- "table": {
- "table_name": "<subquery2>",
- "access_type": "ALL",
- "possible_keys": ["distinct_key"],
- "rows": 3,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t2.b = 3 and t2.a is not null"
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "t1.a desc",
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "ALL",
+ "possible_keys": ["distinct_key"],
+ "rows": 3,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t2.b = 3 and t2.a is not null"
+ }
+ }
+ ]
+ }
}
}
}
}
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 1,
+ "filtered": 100,
+ "using_index": true
+ }
}
- },
- "table": {
- "table_name": "t1",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 1,
- "filtered": 100,
- "using_index": true
- }
+ ]
}
}
SELECT t1.a
@@ -4430,42 +4471,52 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "read_sorted_file": {
- "filesort": {
- "sort_key": "t1.a desc",
- "table": {
- "table_name": "<subquery2>",
- "access_type": "ALL",
- "possible_keys": ["distinct_key"],
- "rows": 3,
- "filtered": 100,
- "materialized": {
- "unique": 1,
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100,
- "attached_condition": "t2.b = 3 and t2.a is not null"
+ "nested_loop": [
+ {
+ "read_sorted_file": {
+ "filesort": {
+ "sort_key": "t1.a desc",
+ "table": {
+ "table_name": "<subquery2>",
+ "access_type": "ALL",
+ "possible_keys": ["distinct_key"],
+ "rows": 3,
+ "filtered": 100,
+ "materialized": {
+ "unique": 1,
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "t2.b = 3 and t2.a is not null"
+ }
+ }
+ ]
+ }
}
}
}
}
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.a"],
+ "rows": 1,
+ "filtered": 100
+ }
}
- },
- "table": {
- "table_name": "t1",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["a"],
- "ref": ["test.t2.a"],
- "rows": 1,
- "filtered": 100
- }
+ ]
}
}
SELECT t1.a, group_concat(t1.b)
@@ -4478,3 +4529,38 @@ a group_concat(t1.b)
58 1
DROP TABLE t1, t2;
# End of 10.6 tests
+#
+# MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
+#
+create table t1 (a int, b int, c int, key r (a desc, b asc));
+insert t1 select seq % 10, seq div 10, seq from seq_1_to_55;
+insert t1 values (NULL, NULL, NULL), (9, NULL, NULL);
+explain select * from t1 force index(r) order by a,b limit 20;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 57 Using filesort
+explain select * from t1 force index(r) order by a desc,b limit 20;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index NULL r 10 NULL 20
+select * from t1 force index(r) order by a desc,b limit 20;
+a b c
+9 NULL NULL
+9 0 9
+9 1 19
+9 2 29
+9 3 39
+9 4 49
+8 0 8
+8 1 18
+8 2 28
+8 3 38
+8 4 48
+7 0 7
+7 1 17
+7 2 27
+7 3 37
+7 4 47
+6 0 6
+6 1 16
+6 2 26
+6 3 36
+drop table t1;
diff --git a/mysql-test/main/order_by.test b/mysql-test/main/order_by.test
index fee2880bac9..1cd9efa2710 100644
--- a/mysql-test/main/order_by.test
+++ b/mysql-test/main/order_by.test
@@ -9,11 +9,6 @@
--source include/no_view_protocol.inc
call mtr.add_suppression("Sort aborted.*");
-
---disable_warnings
-drop table if exists t1,t2,t3;
---enable_warnings
-
call mtr.add_suppression("Out of sort memory; increase server sort buffer size");
--source include/have_sequence.inc
@@ -21,8 +16,6 @@ call mtr.add_suppression("Out of sort memory; increase server sort buffer size")
# Test old ORDER BY bug
#
---source include/have_sequence.inc
-
CREATE TABLE t1 (
id int(6) DEFAULT '0' NOT NULL,
idservice int(5),
@@ -2703,3 +2696,14 @@ eval $query;
DROP TABLE t1, t2;
--echo # End of 10.6 tests
+
+--echo #
+--echo # MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
+--echo #
+create table t1 (a int, b int, c int, key r (a desc, b asc));
+insert t1 select seq % 10, seq div 10, seq from seq_1_to_55;
+insert t1 values (NULL, NULL, NULL), (9, NULL, NULL);
+explain select * from t1 force index(r) order by a,b limit 20;
+explain select * from t1 force index(r) order by a desc,b limit 20;
+ select * from t1 force index(r) order by a desc,b limit 20;
+drop table t1;
diff --git a/mysql-test/main/order_by_innodb.result b/mysql-test/main/order_by_innodb.result
index 1d96a62e423..741084c8a6c 100644
--- a/mysql-test/main/order_by_innodb.result
+++ b/mysql-test/main/order_by_innodb.result
@@ -176,7 +176,7 @@ id id
1 NULL
2 1
3 3
-create index for_latest_sort on t2 (d1 desc, d2 desc, id desc);
+create index for_latest_sort on t2 (d1, d2, id);
select
t1.id,t2.id
from
@@ -194,6 +194,36 @@ id id
1 NULL
2 1
3 3
+# Now, same as above but use a DESC index
+CREATE TABLE t3 (
+id int NOT NULL PRIMARY KEY,
+id2 int NOT NULL,
+d1 datetime,
+d2 timestamp NOT NULL,
+KEY id2 (id2)
+) engine=innodb;
+insert into t3 values
+(1,2,'2019-03-05 00:00:00','2019-03-06 00:00:00'),
+(2,3,'2019-03-05 00:00:00','2019-03-06 00:00:00'),
+(3,3,'2019-03-06 00:00:00','2019-03-05 00:00:00');
+create index for_latest_sort on t3 (d1 desc, d2 desc, id desc);
+select
+t1.id,t3.id
+from
+t1 left join
+t3 on t3.id2 = t1.id and
+t3.id = (select dd.id
+from t3 dd
+where
+dd.id2 = t1.id and
+d1 > '2019-02-06 00:00:00'
+ order by
+dd.d1 desc, dd.d2 desc, dd.id desc limit 1
+);
+id id
+1 NULL
+2 1
+3 3
#
# MDEV-27270: Wrong query plan with Range Checked for Each Record and ORDER BY ... LIMIT
#
@@ -217,5 +247,40 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 index NULL PRIMARY 4 NULL # Using index
1 PRIMARY t2 eq_ref PRIMARY,id2 PRIMARY 4 func # Using where
2 DEPENDENT SUBQUERY dd range id2,for_latest_sort for_latest_sort 6 NULL # Using where
-drop table t1,t2;
+drop table t1,t2,t3;
# End of 10.2 tests
+#
+# MDEV-26938 Support descending indexes internally in InnoDB
+#
+create table t1 (a int, b int, c int, key r (a desc, b asc));
+insert t1 select seq % 10, seq div 10, seq from seq_1_to_55;
+insert t1 values (NULL, NULL, NULL), (9, NULL, NULL);
+explain select * from t1 force index(r) order by a,b limit 20;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 57 Using filesort
+explain select * from t1 force index(r) order by a desc,b limit 20;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index NULL r 10 NULL 20
+select * from t1 force index(r) order by a desc,b limit 20;
+a b c
+9 NULL NULL
+9 0 9
+9 1 19
+9 2 29
+9 3 39
+9 4 49
+8 0 8
+8 1 18
+8 2 28
+8 3 38
+8 4 48
+7 0 7
+7 1 17
+7 2 27
+7 3 37
+7 4 47
+6 0 6
+6 1 16
+6 2 26
+6 3 36
+drop table t1;
diff --git a/mysql-test/main/order_by_innodb.test b/mysql-test/main/order_by_innodb.test
index fbff825e26e..bdaef56672f 100644
--- a/mysql-test/main/order_by_innodb.test
+++ b/mysql-test/main/order_by_innodb.test
@@ -162,7 +162,7 @@ from
dd.d1 desc, dd.d2 desc, dd.id desc limit 1
);
-create index for_latest_sort on t2 (d1 desc, d2 desc, id desc);
+create index for_latest_sort on t2 (d1, d2, id);
select
t1.id,t2.id
@@ -178,6 +178,38 @@ from
dd.d1 desc, dd.d2 desc, dd.id desc limit 1
);
+--echo # Now, same as above but use a DESC index
+
+CREATE TABLE t3 (
+ id int NOT NULL PRIMARY KEY,
+ id2 int NOT NULL,
+ d1 datetime,
+ d2 timestamp NOT NULL,
+ KEY id2 (id2)
+) engine=innodb;
+
+insert into t3 values
+ (1,2,'2019-03-05 00:00:00','2019-03-06 00:00:00'),
+ (2,3,'2019-03-05 00:00:00','2019-03-06 00:00:00'),
+ (3,3,'2019-03-06 00:00:00','2019-03-05 00:00:00');
+create index for_latest_sort on t3 (d1 desc, d2 desc, id desc);
+
+
+select
+ t1.id,t3.id
+from
+ t1 left join
+ t3 on t3.id2 = t1.id and
+ t3.id = (select dd.id
+ from t3 dd
+ where
+ dd.id2 = t1.id and
+ d1 > '2019-02-06 00:00:00'
+ order by
+ dd.d1 desc, dd.d2 desc, dd.id desc limit 1
+ );
+
+
--echo #
--echo # MDEV-27270: Wrong query plan with Range Checked for Each Record and ORDER BY ... LIMIT
--echo #
@@ -199,6 +231,18 @@ from
order by
dd.d1, dd.d2, dd.id limit 1
);
-drop table t1,t2;
+
+drop table t1,t2,t3;
--echo # End of 10.2 tests
+
+--echo #
+--echo # MDEV-26938 Support descending indexes internally in InnoDB
+--echo #
+create table t1 (a int, b int, c int, key r (a desc, b asc));
+insert t1 select seq % 10, seq div 10, seq from seq_1_to_55;
+insert t1 values (NULL, NULL, NULL), (9, NULL, NULL);
+explain select * from t1 force index(r) order by a,b limit 20;
+explain select * from t1 force index(r) order by a desc,b limit 20;
+ select * from t1 force index(r) order by a desc,b limit 20;
+drop table t1;
diff --git a/mysql-test/main/order_by_pack_big.result b/mysql-test/main/order_by_pack_big.result
index a7cf2436bcc..e34b1a4a90a 100644
--- a/mysql-test/main/order_by_pack_big.result
+++ b/mysql-test/main/order_by_pack_big.result
@@ -93,29 +93,33 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 10000,
- "filesort": {
- "sort_key": "t3.`id` DIV 100",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 10000,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "sort_key,packed_addon_fields",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10000,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 10000,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "filesort": {
+ "sort_key": "t3.`id` DIV 100",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 10000,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "sort_key,packed_addon_fields",
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10000,
+ "r_rows": 10000,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
flush status;
@@ -250,30 +254,34 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 10000,
- "filesort": {
- "sort_key": "t3.`id` DIV 100",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 10000,
- "r_sort_passes": 4,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "sort_key,packed_addon_fields",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10000,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 10000,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "filesort": {
+ "sort_key": "t3.`id` DIV 100",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 10000,
+ "r_sort_passes": 4,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "sort_key,packed_addon_fields",
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10000,
+ "r_rows": 10000,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
flush status;
@@ -405,29 +413,33 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 10000,
- "filesort": {
- "sort_key": "t3.`names`, t3.address",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 10000,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "packed_sort_key,packed_addon_fields",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10000,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 10000,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "filesort": {
+ "sort_key": "t3.`names`, t3.address",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 10000,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "packed_sort_key,packed_addon_fields",
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10000,
+ "r_rows": 10000,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
flush status;
@@ -454,29 +466,33 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "read_sorted_file": {
- "r_rows": 10000,
- "filesort": {
- "sort_key": "t3.`names`, t3.address",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 10000,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "packed_sort_key,rowid",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10000,
+ "nested_loop": [
+ {
+ "read_sorted_file": {
"r_rows": 10000,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
+ "filesort": {
+ "sort_key": "t3.`names`, t3.address",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 10000,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "packed_sort_key,rowid",
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10000,
+ "r_rows": 10000,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
}
}
- }
+ ]
}
}
flush status;
diff --git a/mysql-test/main/partition.result b/mysql-test/main/partition.result
index b2b34b975e3..0d37d4cb168 100644
--- a/mysql-test/main/partition.result
+++ b/mysql-test/main/partition.result
@@ -2643,7 +2643,7 @@ Note 1517 Duplicate partition name p5
alter table t1 drop partition if exists p5;
alter table t1 drop partition if exists p5;
Warnings:
-Note 1507 Error in list of partitions to DROP
+Note 1507 Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (a INT) ENGINE=MyISAM PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN (0));
ALTER TABLE t1 ADD PARTITION (PARTITION p2 VALUES LESS THAN (1));
@@ -2741,7 +2741,7 @@ id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t2 p1,p2 ALL NULL NULL NULL NULL 400 Using where
explain extended select * from t2 where b=5;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t2 ALL NULL NULL NULL NULL 1000 19.61 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 1000 0.10 Using where
Warnings:
Note 1003 select `test`.`t2`.`part_key` AS `part_key`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t2` where `test`.`t2`.`b` = 5
explain partitions select * from t2 where b=5;
@@ -2749,7 +2749,7 @@ id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t2 p0,p1,p2,p3,p4 ALL NULL NULL NULL NULL 1000 Using where
explain extended select * from t2 partition(p0) where b=1;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t2 ALL NULL NULL NULL NULL 200 19.61 Using where
+1 SIMPLE t2 ALL NULL NULL NULL NULL 200 20.00 Using where
Warnings:
Note 1003 select `test`.`t2`.`part_key` AS `part_key`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t2` PARTITION (`p0`) where `test`.`t2`.`b` = 1
set @@use_stat_tables= @save_use_stat_tables;
diff --git a/mysql-test/main/partition_alter.result b/mysql-test/main/partition_alter.result
index cbe133fa1f9..5a2d1ada4a4 100644
--- a/mysql-test/main/partition_alter.result
+++ b/mysql-test/main/partition_alter.result
@@ -326,3 +326,68 @@ test.t check status OK
delete from t order by b limit 1;
drop table t;
# End of 10.5 tests
+create or replace table t1 (x int primary key)
+partition by range(x) (
+p1 values less than (10),
+partition p2 values less than (20),
+p3 values less than (30),
+partition p4 values less than (40),
+p5 values less than (50),
+pn values less than maxvalue);
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+create or replace table t1 (x int)
+partition by list(x) (
+partition p1 values in (2, 3, 4),
+partition p2 values in (12, 13, 14),
+partition p3 values in (22, 23, 24),
+p4 values in (32, 33, 34),
+p5 values in (42, 43, 44),
+pn values in (52, 53, 54));
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY LIST (`x`)
+(PARTITION `p1` VALUES IN (2,3,4) ENGINE = MyISAM,
+ PARTITION `p2` VALUES IN (12,13,14) ENGINE = MyISAM,
+ PARTITION `p3` VALUES IN (22,23,24) ENGINE = MyISAM,
+ PARTITION `p4` VALUES IN (32,33,34) ENGINE = MyISAM,
+ PARTITION `p5` VALUES IN (42,43,44) ENGINE = MyISAM,
+ PARTITION `pn` VALUES IN (52,53,54) ENGINE = MyISAM)
+create or replace table t1 (x int)
+partition by list(x) (
+partition partition p1 values in (2, 3, 4),
+pn values in (52, 53, 54));
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'partition p1 values in (2, 3, 4),
+pn values in (52, 53, 54))' at line 3
+create or replace table t1 (x int)
+partition by list(x) (
+partition partition values in (2, 3, 4),
+pn values in (52, 53, 54));
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'partition values in (2, 3, 4),
+pn values in (52, 53, 54))' at line 3
+create or replace table t1 (x int)
+partition by list(x) (
+partition values in (2, 3, 4),
+pn values in (52, 53, 54));
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'in (2, 3, 4),
+pn values in (52, 53, 54))' at line 3
+create or replace table t1 (x int)
+partition by list(x) (
+partitio values in (2, 3, 4),
+pn values in (52, 53, 54));
+drop table t1;
+# End of 10.7 tests
diff --git a/mysql-test/main/partition_alter.test b/mysql-test/main/partition_alter.test
index f5441fe4334..a4f2d529109 100644
--- a/mysql-test/main/partition_alter.test
+++ b/mysql-test/main/partition_alter.test
@@ -274,3 +274,52 @@ delete from t order by b limit 1;
drop table t;
--echo # End of 10.5 tests
+
+create or replace table t1 (x int primary key)
+partition by range(x) (
+ p1 values less than (10),
+ partition p2 values less than (20),
+ p3 values less than (30),
+ partition p4 values less than (40),
+ p5 values less than (50),
+ pn values less than maxvalue);
+
+show create table t1;
+
+create or replace table t1 (x int)
+partition by list(x) (
+ partition p1 values in (2, 3, 4),
+ partition p2 values in (12, 13, 14),
+ partition p3 values in (22, 23, 24),
+ p4 values in (32, 33, 34),
+ p5 values in (42, 43, 44),
+ pn values in (52, 53, 54));
+
+show create table t1;
+
+--error ER_PARSE_ERROR
+create or replace table t1 (x int)
+partition by list(x) (
+ partition partition p1 values in (2, 3, 4),
+ pn values in (52, 53, 54));
+
+--error ER_PARSE_ERROR
+create or replace table t1 (x int)
+partition by list(x) (
+ partition partition values in (2, 3, 4),
+ pn values in (52, 53, 54));
+
+--error ER_PARSE_ERROR
+create or replace table t1 (x int)
+partition by list(x) (
+ partition values in (2, 3, 4),
+ pn values in (52, 53, 54));
+
+create or replace table t1 (x int)
+partition by list(x) (
+ partitio values in (2, 3, 4),
+ pn values in (52, 53, 54));
+
+drop table t1;
+
+--echo # End of 10.7 tests
diff --git a/mysql-test/main/partition_binlog.result b/mysql-test/main/partition_binlog.result
index 3e6100b51d8..45cd636c1f9 100644
--- a/mysql-test/main/partition_binlog.result
+++ b/mysql-test/main/partition_binlog.result
@@ -11,20 +11,20 @@ INSERT INTO t1 VALUES (1), (10), (100), (1000);
ALTER TABLE t1 TRUNCATE PARTITION p1;
ERROR HY000: Unknown partition 'p1' in table 't1'
ALTER TABLE t1 DROP PARTITION p1;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
# No error returned, output in table format instead:
ALTER TABLE t1 ANALYZE PARTITION p1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
ALTER TABLE t1 CHECK PARTITION p1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
ALTER TABLE t1 OPTIMIZE PARTITION p1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
ALTER TABLE t1 REPAIR PARTITION p1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
ALTER TABLE t1 ANALYZE PARTITION p0;
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
diff --git a/mysql-test/main/partition_binlog.test b/mysql-test/main/partition_binlog.test
index d6986c86ebe..665293d4881 100644
--- a/mysql-test/main/partition_binlog.test
+++ b/mysql-test/main/partition_binlog.test
@@ -22,7 +22,7 @@ INSERT INTO t1 VALUES (1), (10), (100), (1000);
--error ER_UNKNOWN_PARTITION
ALTER TABLE t1 TRUNCATE PARTITION p1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION p1;
--echo # No error returned, output in table format instead:
diff --git a/mysql-test/main/partition_error.result b/mysql-test/main/partition_error.result
index 350e8733220..0b07fe30130 100644
--- a/mysql-test/main/partition_error.result
+++ b/mysql-test/main/partition_error.result
@@ -29,7 +29,7 @@ INSERT INTO t1 VALUES (5,3),(5,6);
ALTER TABLE t1 PARTITION BY KEY(b) PARTITIONS 3 ;
ALTER TABLE t1 REPAIR PARTITION p1, p3;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
ALTER TABLE t1 ORDER BY b;
DROP TABLE t1;
#
@@ -43,7 +43,7 @@ PARTITION p1 VALUES LESS THAN MAXVALUE ) ;
ALTER TABLE t1 DROP PARTITION p1;
ALTER TABLE t1 ANALYZE PARTITION p0, p1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
ALTER TABLE t1 COMMENT 'altered';
DROP TABLE t1;
#
@@ -765,7 +765,7 @@ ERROR HY000: Field 'c' is of a not allowed type for this type of partitioning
#
CREATE TABLE t1 (a INT) PARTITION BY HASH(a);
CREATE TEMPORARY TABLE tmp_t1 LIKE t1;
-ERROR HY000: Partitioned tables do not support CREATE TEMPORARY TABLE
+ERROR HY000: Table storage engine 'partition' does not support the create option 'TEMPORARY'
DROP TABLE t1;
#
# Bug#42954: SQL MODE 'NO_DIR_IN_CREATE' does not work with
@@ -907,7 +907,7 @@ partitions 3
(partition tablespace ts1,
partition x2 tablespace ts2,
partition x3 tablespace ts3);
-ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ts1,
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '
partition x2 tablespace ts2,
partition x3 tablespace ts3)' at line 8
CREATE TABLE t1 (
diff --git a/mysql-test/main/partition_error.test b/mysql-test/main/partition_error.test
index edfe7c827be..b8d07e595e5 100644
--- a/mysql-test/main/partition_error.test
+++ b/mysql-test/main/partition_error.test
@@ -800,7 +800,7 @@ PARTITION BY HASH (c) PARTITIONS 4;
--echo # with temporary table and partitions
--echo #
CREATE TABLE t1 (a INT) PARTITION BY HASH(a);
---error ER_FEATURE_NOT_SUPPORTED_WITH_PARTITIONING
+--error ER_ILLEGAL_HA_CREATE_OPTION
CREATE TEMPORARY TABLE tmp_t1 LIKE t1;
DROP TABLE t1;
--echo #
diff --git a/mysql-test/main/partition_exchange.result b/mysql-test/main/partition_exchange.result
index c82d8d2071b..b7c9be3480e 100644
--- a/mysql-test/main/partition_exchange.result
+++ b/mysql-test/main/partition_exchange.result
@@ -1,4 +1,3 @@
-DROP TABLE IF EXISTS t1, t2, t3, t, tp, tsp, tmp;
#
# Bug#11894100: EXCHANGE PARTITION CAN'T BE EXECUTED IF
# ROW_FORMAT WAS SET EXPLICITLY
@@ -6,25 +5,19 @@ DROP TABLE IF EXISTS t1, t2, t3, t, tp, tsp, tmp;
# Same definition (both have ROW_FORMAT set)
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT=COMPACT
PARTITION BY HASH (id)
PARTITIONS 2;
-Warnings:
-Note 1287 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
CREATE TABLE t2 LIKE t1;
-Warnings:
-Note 1287 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
ALTER TABLE t2 REMOVE PARTITIONING;
-Warnings:
-Note 1287 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
@@ -34,7 +27,7 @@ SHOW CREATE TABLE t2;
Table t2
Create Table CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
@@ -53,15 +46,11 @@ ENGINE InnoDB
ROW_FORMAT Compact
CREATE_OPTIONS row_format=COMPACT
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
@@ -71,7 +60,7 @@ SHOW CREATE TABLE t2;
Table t2
Create Table CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
@@ -93,24 +82,16 @@ DROP TABLE t2;
# Only the partitioned table have ROW_FORMAT set.
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
@@ -120,7 +101,7 @@ SHOW CREATE TABLE t2;
Table t2
Create Table CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
@@ -142,36 +123,24 @@ CREATE_OPTIONS
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB
PARTITION BY HASH (id)
PARTITIONS 2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = COMPACT;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
@@ -181,7 +150,7 @@ SHOW CREATE TABLE t2;
Table t2
Create Table CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
@@ -203,36 +172,24 @@ CREATE_OPTIONS row_format=COMPACT
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB
PARTITION BY HASH (id)
PARTITIONS 2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
@@ -242,7 +199,7 @@ SHOW CREATE TABLE t2;
Table t2
Create Table CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
@@ -264,36 +221,24 @@ CREATE_OPTIONS
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = REDUNDANT
PARTITION BY HASH (id)
PARTITIONS 2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = REDUNDANT;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT
@@ -303,7 +248,7 @@ SHOW CREATE TABLE t2;
Table t2
Create Table CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT
@@ -325,33 +270,25 @@ CREATE_OPTIONS row_format=REDUNDANT
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB
PARTITION BY HASH (id)
PARTITIONS 2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = REDUNDANT;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
ERROR HY000: Non matching attribute 'ROW_FORMAT' between partition and table
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
@@ -361,7 +298,7 @@ SHOW CREATE TABLE t2;
Table t2
Create Table CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT
@@ -383,33 +320,25 @@ CREATE_OPTIONS row_format=REDUNDANT
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = COMPACT
PARTITION BY HASH (id)
PARTITIONS 2;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
-year year(2) DEFAULT NULL,
+year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = REDUNDANT;
-Warnings:
-Level Note
-Code 1287
-Message 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
ERROR HY000: Non matching attribute 'ROW_FORMAT' between partition and table
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
@@ -419,7 +348,7 @@ SHOW CREATE TABLE t2;
Table t2
Create Table CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `year` year(2) DEFAULT NULL,
+ `year` year(4) DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT
@@ -1306,7 +1235,6 @@ ALTER TABLE t1 ADD PARTITION (PARTITION pm TABLESPACE = `innodb_file_per_table`)
CREATE TABLE t2 like t1;
ALTER TABLE t2 REMOVE PARTITIONING;
ALTER TABLE t1 EXCHANGE PARTITION pm WITH TABLE t2;
-ERROR HY000: Non matching attribute 'TABLESPACE' between partition and table
DROP TABLE t1, t2;
#
# MDEV-14642 Assertion `table->s->db_create_options == part_table->s->db_create_options' failed in compare_table_with_partition
@@ -1321,3 +1249,14 @@ CREATE TABLE t2 (a INT, PRIMARY KEY(a)) CHECKSUM=1, ENGINE=InnoDB;
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Tables have different definitions
DROP TABLE t1, t2;
+#
+# MDEV-27683 EXCHANGE PARTITION allows different index direction, but causes further errors
+#
+CREATE TABLE t1 (a INT, KEY(a DESC)) PARTITION BY KEY(a) PARTITIONS 4;
+CREATE TABLE t2 (a INT, KEY(a));
+ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
+ERROR HY000: Tables have different definitions
+DROP TABLE t1, t2;
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/main/partition_exchange.test b/mysql-test/main/partition_exchange.test
index 09629a52add..82ccc29e00e 100644
--- a/mysql-test/main/partition_exchange.test
+++ b/mysql-test/main/partition_exchange.test
@@ -1,11 +1,6 @@
--source include/have_innodb.inc
--source include/have_partition.inc
---disable_warnings
-DROP TABLE IF EXISTS t1, t2, t3, t, tp, tsp, tmp;
---enable_warnings
-
---enable_prepare_warnings
--echo #
--echo # Bug#11894100: EXCHANGE PARTITION CAN'T BE EXECUTED IF
--echo # ROW_FORMAT WAS SET EXPLICITLY
@@ -14,7 +9,7 @@ DROP TABLE IF EXISTS t1, t2, t3, t, tp, tsp, tmp;
--echo # Same definition (both have ROW_FORMAT set)
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT=COMPACT
@@ -46,7 +41,7 @@ DROP TABLE t2;
--echo # Only the partitioned table have ROW_FORMAT set.
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB;
@@ -63,7 +58,7 @@ ORDER BY TABLE_NAME;
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB
@@ -71,7 +66,7 @@ PARTITION BY HASH (id)
PARTITIONS 2;
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = COMPACT;
@@ -88,7 +83,7 @@ ORDER BY TABLE_NAME;
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB
@@ -96,7 +91,7 @@ PARTITION BY HASH (id)
PARTITIONS 2;
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB;
@@ -113,7 +108,7 @@ ORDER BY TABLE_NAME;
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = REDUNDANT
@@ -121,7 +116,7 @@ PARTITION BY HASH (id)
PARTITIONS 2;
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = REDUNDANT;
@@ -138,7 +133,7 @@ ORDER BY TABLE_NAME;
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB
@@ -146,7 +141,7 @@ PARTITION BY HASH (id)
PARTITIONS 2;
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = REDUNDANT;
@@ -164,7 +159,7 @@ ORDER BY TABLE_NAME;
DROP TABLE t1, t2;
CREATE TABLE t1 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = COMPACT
@@ -172,7 +167,7 @@ PARTITION BY HASH (id)
PARTITIONS 2;
CREATE TABLE t2 (
id int(11) NOT NULL AUTO_INCREMENT,
- year year(2) DEFAULT NULL,
+ year year DEFAULT NULL,
modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT = REDUNDANT;
@@ -533,7 +528,7 @@ CREATE TABLE t1 (a VARCHAR(200)) PARTITION BY KEY(a) partitions 10;
ALTER TABLE t1 ADD PARTITION (PARTITION pm TABLESPACE = `innodb_file_per_table`);
CREATE TABLE t2 like t1;
ALTER TABLE t2 REMOVE PARTITIONING;
---error ER_PARTITION_EXCHANGE_DIFFERENT_OPTION
+# The following works as table spaces are not checked anymore
ALTER TABLE t1 EXCHANGE PARTITION pm WITH TABLE t2;
DROP TABLE t1, t2;
@@ -556,4 +551,15 @@ ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
# Cleanup
DROP TABLE t1, t2;
---disable_prepare_warnings
+--echo #
+--echo # MDEV-27683 EXCHANGE PARTITION allows different index direction, but causes further errors
+--echo #
+CREATE TABLE t1 (a INT, KEY(a DESC)) PARTITION BY KEY(a) PARTITIONS 4;
+CREATE TABLE t2 (a INT, KEY(a));
+--error ER_TABLES_DIFFERENT_METADATA
+ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
+DROP TABLE t1, t2;
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/main/partition_mgm_err.result b/mysql-test/main/partition_mgm_err.result
index 01adc4f5adf..864b1cbd37f 100644
--- a/mysql-test/main/partition_mgm_err.result
+++ b/mysql-test/main/partition_mgm_err.result
@@ -16,13 +16,13 @@ ALTER TABLE t1 REORGANIZE PARTITION x0,x1 INTO
PARTITION x11 VALUES LESS THAN (5));
ERROR HY000: Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range
ALTER TABLE t1 DROP PARTITION x0, x1, x2, x3, x3;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION x0, x1, x2, x10;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION x10, x1, x2, x1;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION x10, x1, x2, x3;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 REORGANIZE PARTITION x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 INTO
(PARTITION x11 VALUES LESS THAN (22));
ERROR HY000: More partitions to reorganize than there are partitions
@@ -34,7 +34,7 @@ ALTER TABLE t1 REORGANIZE PARTITION x0, x2 INTO
ERROR HY000: When reorganizing a set of partitions they must be in consecutive order
ALTER TABLE t1 REORGANIZE PARTITION x0, x1, x1 INTO
(PARTITION x11 VALUES LESS THAN (4));
-ERROR HY000: Error in list of partitions to REORGANIZE
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 REORGANIZE PARTITION x0,x1 INTO
(PARTITION x01 VALUES LESS THAN (5));
ERROR HY000: Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range
@@ -113,7 +113,7 @@ PARTITION x1 VALUES LESS THAN (8));
ALTER TABLE t1 ADD PARTITION PARTITIONS 1;
ERROR HY000: For RANGE partitions each partition must be defined
ALTER TABLE t1 DROP PARTITION x2;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 COALESCE PARTITION 1;
ERROR HY000: COALESCE PARTITION can only be used on HASH/KEY partitions
ALTER TABLE t1 DROP PARTITION x1;
diff --git a/mysql-test/main/partition_mgm_err.test b/mysql-test/main/partition_mgm_err.test
index 0987c427fc7..82b9db7bbe1 100644
--- a/mysql-test/main/partition_mgm_err.test
+++ b/mysql-test/main/partition_mgm_err.test
@@ -29,16 +29,16 @@ ALTER TABLE t1 REORGANIZE PARTITION x0,x1 INTO
(PARTITION x01 VALUES LESS THAN (2),
PARTITION x11 VALUES LESS THAN (5));
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION x0, x1, x2, x3, x3;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION x0, x1, x2, x10;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION x10, x1, x2, x1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION x10, x1, x2, x3;
--error ER_REORG_PARTITION_NOT_EXIST
@@ -53,7 +53,7 @@ ALTER TABLE t1 REORGANIZE PARTITION x0,x1,x2 INTO
ALTER TABLE t1 REORGANIZE PARTITION x0, x2 INTO
(PARTITION x11 VALUES LESS THAN (2));
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 REORGANIZE PARTITION x0, x1, x1 INTO
(PARTITION x11 VALUES LESS THAN (4));
@@ -167,7 +167,7 @@ PARTITION BY RANGE (a)
--error ER_PARTITIONS_MUST_BE_DEFINED_ERROR
ALTER TABLE t1 ADD PARTITION PARTITIONS 1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION x2;
--error ER_COALESCE_ONLY_ON_HASH_PARTITION
diff --git a/mysql-test/main/partition_order.result b/mysql-test/main/partition_order.result
index cecfc90eefb..d4a0c133d10 100644
--- a/mysql-test/main/partition_order.result
+++ b/mysql-test/main/partition_order.result
@@ -1,4 +1,3 @@
-drop table if exists t1;
CREATE TABLE t1 (
a int not null,
b int not null,
@@ -783,3 +782,17 @@ a b c
1 1 1
1 NULL NULL
drop table t1;
+#
+# MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
+#
+create table t1 (a int, b int, key(a desc)) partition by hash(a) partitions 4;
+insert into t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6);
+explain select * from t1 order by a limit 3;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index NULL a 5 NULL 3
+select * from t1 order by a limit 3;
+a b
+1 1
+2 2
+3 3
+drop table t1;
diff --git a/mysql-test/main/partition_order.test b/mysql-test/main/partition_order.test
index ad956361d00..f5cd4c25074 100644
--- a/mysql-test/main/partition_order.test
+++ b/mysql-test/main/partition_order.test
@@ -1,14 +1,9 @@
-#--disable_abort_on_error
#
# Simple test for the partition storage engine
# Focuses on tests of ordered index read
#
-- source include/have_partition.inc
---disable_warnings
-drop table if exists t1;
---enable_warnings
-
#
# Ordered index read, int type
#
@@ -842,3 +837,12 @@ INSERT into t1 values (1, NULL, NULL), (2, NULL, '10');
select * from t1 where a = 1 order by a desc, b desc;
select * from t1 where a = 1 order by b desc;
drop table t1;
+
+--echo #
+--echo # MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
+--echo #
+create table t1 (a int, b int, key(a desc)) partition by hash(a) partitions 4;
+insert into t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6);
+explain select * from t1 order by a limit 3;
+select * from t1 order by a limit 3;
+drop table t1;
diff --git a/mysql-test/main/partition_range.result b/mysql-test/main/partition_range.result
index 213997e0758..9cefe83e1e2 100644
--- a/mysql-test/main/partition_range.result
+++ b/mysql-test/main/partition_range.result
@@ -294,9 +294,9 @@ t1 CREATE TABLE `t1` (
PRIMARY KEY (`a`,`b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
PARTITION BY RANGE (`a`)
-(PARTITION `x1` VALUES LESS THAN (5) TABLESPACE = ts1 ENGINE = MyISAM,
- PARTITION `x2` VALUES LESS THAN (10) TABLESPACE = ts2 ENGINE = MyISAM,
- PARTITION `x3` VALUES LESS THAN MAXVALUE TABLESPACE = ts3 ENGINE = MyISAM)
+(PARTITION `x1` VALUES LESS THAN (5) ENGINE = MyISAM,
+ PARTITION `x2` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `x3` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
ALTER TABLE t1
partition by range (a)
partitions 3
@@ -318,9 +318,9 @@ t1 CREATE TABLE `t1` (
PRIMARY KEY (`a`,`b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
PARTITION BY RANGE (`a`)
-(PARTITION `x1` VALUES LESS THAN (5) TABLESPACE = ts1 ENGINE = MyISAM,
- PARTITION `x2` VALUES LESS THAN (10) TABLESPACE = ts2 ENGINE = MyISAM,
- PARTITION `x3` VALUES LESS THAN MAXVALUE TABLESPACE = ts3 ENGINE = MyISAM)
+(PARTITION `x1` VALUES LESS THAN (5) ENGINE = MyISAM,
+ PARTITION `x2` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `x3` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
drop table if exists t1;
CREATE TABLE t1 (
a int not null,
diff --git a/mysql-test/main/partition_sync.result b/mysql-test/main/partition_sync.result
index badcb10e5da..149eadf257b 100644
--- a/mysql-test/main/partition_sync.result
+++ b/mysql-test/main/partition_sync.result
@@ -15,7 +15,7 @@ a
1
connection default;
ALTER TABLE t1 DROP PARTITION p3;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
connection con1;
# This failed with deadlock and should not do so.
SELECT * FROM t1;
diff --git a/mysql-test/main/partition_sync.test b/mysql-test/main/partition_sync.test
index a07fb6e5c13..9b75ab79edd 100644
--- a/mysql-test/main/partition_sync.test
+++ b/mysql-test/main/partition_sync.test
@@ -22,7 +22,7 @@ BEGIN;
SELECT * FROM t1;
connection default;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION p3;
connection con1;
diff --git a/mysql-test/main/plugin.result b/mysql-test/main/plugin.result
index 092e817c48e..50a82efe55a 100644
--- a/mysql-test/main/plugin.result
+++ b/mysql-test/main/plugin.result
@@ -12,7 +12,7 @@ PLUGIN_STATUS ACTIVE
PLUGIN_TYPE STORAGE ENGINE
PLUGIN_TYPE_VERSION #
PLUGIN_LIBRARY ha_example.so
-PLUGIN_LIBRARY_VERSION 1.14
+PLUGIN_LIBRARY_VERSION 1.15
PLUGIN_AUTHOR Brian Aker, MySQL AB
PLUGIN_DESCRIPTION Example storage engine
PLUGIN_LICENSE GPL
@@ -25,7 +25,7 @@ PLUGIN_STATUS ACTIVE
PLUGIN_TYPE DAEMON
PLUGIN_TYPE_VERSION #
PLUGIN_LIBRARY ha_example.so
-PLUGIN_LIBRARY_VERSION 1.14
+PLUGIN_LIBRARY_VERSION 1.15
PLUGIN_AUTHOR Sergei Golubchik
PLUGIN_DESCRIPTION Unusable Daemon
PLUGIN_LICENSE GPL
@@ -68,7 +68,7 @@ PLUGIN_STATUS DELETED
PLUGIN_TYPE STORAGE ENGINE
PLUGIN_TYPE_VERSION #
PLUGIN_LIBRARY ha_example.so
-PLUGIN_LIBRARY_VERSION 1.14
+PLUGIN_LIBRARY_VERSION 1.15
PLUGIN_AUTHOR Brian Aker, MySQL AB
PLUGIN_DESCRIPTION Example storage engine
PLUGIN_LICENSE GPL
diff --git a/mysql-test/main/ps.result b/mysql-test/main/ps.result
index 9dc2c8dfded..d5e501b06ef 100644
--- a/mysql-test/main/ps.result
+++ b/mysql-test/main/ps.result
@@ -5241,13 +5241,13 @@ DECLARE a DATETIME;
CALL p1(a);
END;
$$
-ERROR 22007: Incorrect datetime value: '10' for column ``.``.`a` at row 1
+ERROR 22007: Incorrect datetime value: '10' for column ``.``.`a` at row 0
BEGIN NOT ATOMIC
DECLARE a DATETIME;
EXECUTE IMMEDIATE 'CALL p1(?)' USING a;
END;
$$
-ERROR 22007: Incorrect datetime value: '10' for column ``.``.`a` at row 1
+ERROR 22007: Incorrect datetime value: '10' for column ``.``.`a` at row 0
BEGIN NOT ATOMIC
DECLARE a DATETIME;
PREPARE stmt FROM 'CALL p1(?)';
@@ -5255,7 +5255,7 @@ EXECUTE stmt USING a;
DEALLOCATE PREPARE stmt;
END;
$$
-ERROR 22007: Incorrect datetime value: '10' for column ``.``.`a` at row 1
+ERROR 22007: Incorrect datetime value: '10' for column ``.``.`a` at row 0
DROP PROCEDURE p1;
#
# MDEV-14454 Binary protocol returns wrong collation ID for SP OUT parameters
diff --git a/mysql-test/main/ps_missed_cmds.result b/mysql-test/main/ps_missed_cmds.result
index 966c4c6313b..bde750434b3 100644
--- a/mysql-test/main/ps_missed_cmds.result
+++ b/mysql-test/main/ps_missed_cmds.result
@@ -521,27 +521,4 @@ EXECUTE stmt_2;
DROP TABLE t1;
DEALLOCATE PREPARE stmt_1;
DEALLOCATE PREPARE stmt_2;
-# Test Test case 25: Check the statements 'CREATE/ALTER/DROP TABLEPSPACE'
-# can be executed as a prepared statement
-PREPARE stmt_1 FROM "CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' ENGINE=InnoDB";
-PREPARE stmt_2 FROM "ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd' ENGINE=InnoDB";
-PREPARE stmt_3 FROM "DROP TABLESPACE ts1 ENGINE=InnoDB";
-EXECUTE stmt_1;
-# Execute the same prepared statement the second time to check that
-# no internal structures used for handling the 'CREATE TABLESPACE'
-# statement were damaged.
-EXECUTE stmt_1;
-EXECUTE stmt_2;
-# Execute the same prepared statement the second time to check that
-# no internal structures used for handling the 'ALTER TABLESPACE'
-# statement were damaged.
-EXECUTE stmt_2;
-EXECUTE stmt_3;
-# Execute the same prepared statement the second time to check that
-# no internal structures used for handling the 'DROP TABLESPACE'
-# statement were damaged.
-EXECUTE stmt_3;
-DEALLOCATE PREPARE stmt_1;
-DEALLOCATE PREPARE stmt_2;
-DEALLOCATE PREPARE stmt_3;
SET default_storage_engine= @save_storage_engine;
diff --git a/mysql-test/main/ps_missed_cmds.test b/mysql-test/main/ps_missed_cmds.test
index 8b80a7c7e5d..e8b4e263008 100644
--- a/mysql-test/main/ps_missed_cmds.test
+++ b/mysql-test/main/ps_missed_cmds.test
@@ -590,50 +590,5 @@ DROP TABLE t1;
DEALLOCATE PREPARE stmt_1;
DEALLOCATE PREPARE stmt_2;
---echo # Test Test case 25: Check the statements 'CREATE/ALTER/DROP TABLEPSPACE'
---echo # can be executed as a prepared statement
-
-PREPARE stmt_1 FROM "CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' ENGINE=InnoDB";
-PREPARE stmt_2 FROM "ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd' ENGINE=InnoDB";
-PREPARE stmt_3 FROM "DROP TABLESPACE ts1 ENGINE=InnoDB";
-
-# Since MariaDB supports for tablespaces only on syntax level disable warnings
-# before run CREATE/ALTER/DROP TABLESPACE statements in order to exclude
-# the following in result output
-# Warning 1478 Table storage engine 'InnoDB' does not support the create option 'TABLESPACE
---disable_warnings
-
-EXECUTE stmt_1;
---echo # Execute the same prepared statement the second time to check that
---echo # no internal structures used for handling the 'CREATE TABLESPACE'
---echo # statement were damaged.
-# Since the 'CREATE TABLESPACE' statement is supported by MariaDB on syntax
-# level only the second invocation of the CREATE TABLESPACE statement for
-# the same tablespace name doesn't lead to error.
-EXECUTE stmt_1;
-
-EXECUTE stmt_2;
---echo # Execute the same prepared statement the second time to check that
---echo # no internal structures used for handling the 'ALTER TABLESPACE'
---echo # statement were damaged.
-EXECUTE stmt_2;
-
-EXECUTE stmt_3;
---echo # Execute the same prepared statement the second time to check that
---echo # no internal structures used for handling the 'DROP TABLESPACE'
---echo # statement were damaged.
-
-# Since the 'DROP TABLESPACE' statement is supported by MariaDB on syntax
-# level only the second invocation of the DROP TABLESPACE statement for
-# the same tablespace name doesn't lead to an error that tablespace
-# doesn't exist.
-EXECUTE stmt_3;
-
---enable_warnings
-
-DEALLOCATE PREPARE stmt_1;
-DEALLOCATE PREPARE stmt_2;
-DEALLOCATE PREPARE stmt_3;
-
--enable_ps_protocol
SET default_storage_engine= @save_storage_engine;
diff --git a/mysql-test/main/ps_missed_cmds_bin_prot.result b/mysql-test/main/ps_missed_cmds_bin_prot.result
index 0d75d2b84fc..adb6eda2c56 100644
--- a/mysql-test/main/ps_missed_cmds_bin_prot.result
+++ b/mysql-test/main/ps_missed_cmds_bin_prot.result
@@ -219,9 +219,4 @@ SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO=30001, MESSAGE_TEXT='Hello, world!';
ERROR 45000: Hello, world!
RESIGNAL SET MESSAGE_TEXT = 'New error message';
ERROR 0K000: RESIGNAL when handler not active
-# Test Test case 29: Check the statements 'CREATE/ALTER/DROP TABLEPSPACE'
-# can be executed as a prepared statement
-CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' ENGINE=InnoDB;
-ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd' ENGINE=InnoDB;
-DROP TABLESPACE ts1 ENGINE=InnoDB;
SET default_storage_engine= @save_storage_engine;
diff --git a/mysql-test/main/ps_missed_cmds_bin_prot.test b/mysql-test/main/ps_missed_cmds_bin_prot.test
index 47f9e5b8e0f..44db5192629 100644
--- a/mysql-test/main/ps_missed_cmds_bin_prot.test
+++ b/mysql-test/main/ps_missed_cmds_bin_prot.test
@@ -254,19 +254,6 @@ SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO=30001, MESSAGE_TEXT='Hello, world!';
--error ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER
RESIGNAL SET MESSAGE_TEXT = 'New error message';
---echo # Test Test case 29: Check the statements 'CREATE/ALTER/DROP TABLEPSPACE'
---echo # can be executed as a prepared statement
-
-# Since MariaDB supports for tablespaces only on syntax level disable warnings
-# before run CREATE/ALTER/DROP TABLESPACE statements in order to exclude
-# the following in result output
-# Warning 1478 Table storage engine 'InnoDB' does not support the create option 'TABLESPACE
---disable_warnings
-
-CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' ENGINE=InnoDB;
-ALTER TABLESPACE ts1 ADD DATAFILE 'ts1_1.ibd' ENGINE=InnoDB;
-DROP TABLESPACE ts1 ENGINE=InnoDB;
-
--enable_warnings
SET default_storage_engine= @save_storage_engine;
diff --git a/mysql-test/main/range.result b/mysql-test/main/range.result
index 31777773240..6ff4f409666 100644
--- a/mysql-test/main/range.result
+++ b/mysql-test/main/range.result
@@ -2412,17 +2412,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "10",
- "used_key_parts": ["a", "b"],
- "rows": 6,
- "filtered": 100,
- "attached_condition": "(t1.a,t1.b) in (<cache>((2,3)),<cache>((3,3)),<cache>((8,8)),<cache>((7,7)))"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "10",
+ "used_key_parts": ["a", "b"],
+ "rows": 6,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t1.b) in (<cache>((2,3)),<cache>((3,3)),<cache>((8,8)),<cache>((7,7)))"
+ }
+ }
+ ]
}
}
select * from t1 where (a,b) IN ((2, 3),(3,3),(8,8),(7,7));
@@ -2472,17 +2476,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a,t1.b + t1.a) in (<cache>((4,9)),<cache>((8,8)),<cache>((7,7)))"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t1.b + t1.a) in (<cache>((4,9)),<cache>((8,8)),<cache>((7,7)))"
+ }
+ }
+ ]
}
}
select * from t1 where (a,b+a) IN ((4,9),(8,8),(7,7));
@@ -2498,17 +2506,21 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a,t1.b) in ((4,t1.a - 1),(8,t1.a + 8),(7,t1.a + 7))"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t1.b) in ((4,t1.a - 1),(8,t1.a + 8),(7,t1.a + 7))"
+ }
+ }
+ ]
}
}
select * from t1 where (a,b) IN ((4,a-1),(8,a+8),(7,a+7));
@@ -2538,37 +2550,43 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "5",
- "used_key_parts": ["d"],
- "rowid_filter": {
- "range": {
- "key": "idx2",
- "used_key_parts": ["e"]
- },
- "rows": 12,
- "selectivity_pct": 60
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "rowid_filter": {
+ "range": {
+ "key": "idx2",
+ "used_key_parts": ["e"]
+ },
+ "rows": 12,
+ "selectivity_pct": 60
+ },
+ "rows": 3,
+ "filtered": 60,
+ "index_condition": "t2.d is not null",
+ "attached_condition": "(t2.d,t2.e) in (<cache>((3,3)),<cache>((7,7)),<cache>((2,2)))"
+ }
},
- "rows": 3,
- "filtered": 60,
- "index_condition": "t2.d is not null",
- "attached_condition": "(t2.d,t2.e) in (<cache>((3,3)),<cache>((7,7)),<cache>((2,2)))"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.d"],
- "rows": 8,
- "filtered": 100
- }
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.d"],
+ "rows": 8,
+ "filtered": 100
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2618,37 +2636,43 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "5",
- "used_key_parts": ["d"],
- "rowid_filter": {
- "range": {
- "key": "idx2",
- "used_key_parts": ["e"]
- },
- "rows": 15,
- "selectivity_pct": 14.42307692
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "rowid_filter": {
+ "range": {
+ "key": "idx2",
+ "used_key_parts": ["e"]
+ },
+ "rows": 15,
+ "selectivity_pct": 14.42307692
+ },
+ "rows": 8,
+ "filtered": 14.42307663,
+ "index_condition": "t2.d is not null",
+ "attached_condition": "(t2.d,t2.e) in (<cache>((3,3)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
+ }
},
- "rows": 8,
- "filtered": 14.42307663,
- "index_condition": "t2.d is not null",
- "attached_condition": "(t2.d,t2.e) in (<cache>((3,3)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.d"],
- "rows": 8,
- "filtered": 100
- }
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.d"],
+ "rows": 8,
+ "filtered": 100
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2723,37 +2747,43 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "5",
- "used_key_parts": ["d"],
- "rowid_filter": {
- "range": {
- "key": "idx2",
- "used_key_parts": ["e"]
- },
- "rows": 7,
- "selectivity_pct": 6.730769231
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "rowid_filter": {
+ "range": {
+ "key": "idx2",
+ "used_key_parts": ["e"]
+ },
+ "rows": 7,
+ "selectivity_pct": 6.730769231
+ },
+ "rows": 7,
+ "filtered": 6.730769157,
+ "index_condition": "t2.d is not null",
+ "attached_condition": "(t2.d,t2.e) in (<cache>((4,4)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
+ }
},
- "rows": 7,
- "filtered": 6.730769157,
- "index_condition": "t2.d is not null",
- "attached_condition": "(t2.d,t2.e) in (<cache>((4,4)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.d"],
- "rows": 11,
- "filtered": 100
- }
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.d"],
+ "rows": 11,
+ "filtered": 100
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2781,29 +2811,35 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "10",
- "used_key_parts": ["d", "e"],
- "rows": 5,
- "filtered": 100,
- "index_condition": "t2.d is not null",
- "attached_condition": "(t2.d,t2.e) in (<cache>((4,4)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.d"],
- "rows": 11,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "10",
+ "used_key_parts": ["d", "e"],
+ "rows": 5,
+ "filtered": 100,
+ "index_condition": "t2.d is not null",
+ "attached_condition": "(t2.d,t2.e) in (<cache>((4,4)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.d"],
+ "rows": 11,
+ "filtered": 100
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2830,29 +2866,35 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 15,
- "filtered": 100,
- "index_condition": "t1.a is not null"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "5",
- "used_key_parts": ["d"],
- "ref": ["test.t1.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "(t1.a,t2.e) in ((4,t1.a + 1),(7,t1.a + 1),(8,t1.a + 1)) and octet_length(t2.f) = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 15,
+ "filtered": 100,
+ "index_condition": "t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "ref": ["test.t1.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t2.e) in ((4,t1.a + 1),(7,t1.a + 1),(8,t1.a + 1)) and octet_length(t2.f) = 1"
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2887,26 +2929,32 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 144,
- "filtered": 100,
- "attached_condition": "t1.a is not null"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "5",
- "used_key_parts": ["d"],
- "ref": ["test.t1.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "(t1.a,t2.e) in ((t2.e,t1.a + 1),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 144,
+ "filtered": 100,
+ "attached_condition": "t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "ref": ["test.t1.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t2.e) in ((t2.e,t1.a + 1),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2935,30 +2983,36 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 12,
- "filtered": 100,
- "index_condition": "t1.a is not null",
- "attached_condition": "(t1.a,2) in (<cache>((2,2)),<cache>((7,7)),<cache>((8,8))) and octet_length(t1.c) = 1"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "5",
- "used_key_parts": ["d"],
- "ref": ["test.t1.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "octet_length(t2.f) = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 12,
+ "filtered": 100,
+ "index_condition": "t1.a is not null",
+ "attached_condition": "(t1.a,2) in (<cache>((2,2)),<cache>((7,7)),<cache>((8,8))) and octet_length(t1.c) = 1"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "ref": ["test.t1.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "octet_length(t2.f) = 1"
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -3012,41 +3066,49 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "const",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["id"],
- "ref": ["const"],
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 12,
- "filtered": 100,
- "index_condition": "t1.a is not null",
- "attached_condition": "(t1.a,1 + 1) in (<cache>((2,2)),<cache>((7,7)),<cache>((8,8))) and octet_length(t1.c) = 1"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "5",
- "used_key_parts": ["d"],
- "ref": ["test.t1.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "octet_length(t2.f) = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "const",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["id"],
+ "ref": ["const"],
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 12,
+ "filtered": 100,
+ "index_condition": "t1.a is not null",
+ "attached_condition": "(t1.a,1 + 1) in (<cache>((2,2)),<cache>((7,7)),<cache>((8,8))) and octet_length(t1.c) = 1"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "ref": ["test.t1.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "octet_length(t2.f) = 1"
+ }
+ }
+ ]
}
}
select * from t1,t2,t3
diff --git a/mysql-test/main/range_mrr_icp.result b/mysql-test/main/range_mrr_icp.result
index 6817edd30cd..c2c715a0a89 100644
--- a/mysql-test/main/range_mrr_icp.result
+++ b/mysql-test/main/range_mrr_icp.result
@@ -2415,18 +2415,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "10",
- "used_key_parts": ["a", "b"],
- "rows": 6,
- "filtered": 100,
- "attached_condition": "(t1.a,t1.b) in (<cache>((2,3)),<cache>((3,3)),<cache>((8,8)),<cache>((7,7)))",
- "mrr_type": "Rowid-ordered scan"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "10",
+ "used_key_parts": ["a", "b"],
+ "rows": 6,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t1.b) in (<cache>((2,3)),<cache>((3,3)),<cache>((8,8)),<cache>((7,7)))",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ }
+ ]
}
}
select * from t1 where (a,b) IN ((2, 3),(3,3),(8,8),(7,7));
@@ -2476,18 +2480,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a,t1.b + t1.a) in (<cache>((4,9)),<cache>((8,8)),<cache>((7,7)))",
- "mrr_type": "Rowid-ordered scan"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t1.b + t1.a) in (<cache>((4,9)),<cache>((8,8)),<cache>((7,7)))",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ }
+ ]
}
}
select * from t1 where (a,b+a) IN ((4,9),(8,8),(7,7));
@@ -2503,18 +2511,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 5,
- "filtered": 100,
- "attached_condition": "(t1.a,t1.b) in ((4,t1.a - 1),(8,t1.a + 8),(7,t1.a + 7))",
- "mrr_type": "Rowid-ordered scan"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t1.b) in ((4,t1.a - 1),(8,t1.a + 8),(7,t1.a + 7))",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ }
+ ]
}
}
select * from t1 where (a,b) IN ((4,a-1),(8,a+8),(7,a+7));
@@ -2544,30 +2556,36 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "5",
- "used_key_parts": ["d"],
- "rows": 3,
- "filtered": 60,
- "index_condition": "t2.d is not null",
- "attached_condition": "(t2.d,t2.e) in (<cache>((3,3)),<cache>((7,7)),<cache>((2,2)))",
- "mrr_type": "Rowid-ordered scan"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.d"],
- "rows": 8,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "rows": 3,
+ "filtered": 60,
+ "index_condition": "t2.d is not null",
+ "attached_condition": "(t2.d,t2.e) in (<cache>((3,3)),<cache>((7,7)),<cache>((2,2)))",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.d"],
+ "rows": 8,
+ "filtered": 100
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2617,30 +2635,36 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "5",
- "used_key_parts": ["d"],
- "rows": 8,
- "filtered": 14.42307663,
- "index_condition": "t2.d is not null",
- "attached_condition": "(t2.d,t2.e) in (<cache>((3,3)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1",
- "mrr_type": "Rowid-ordered scan"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.d"],
- "rows": 8,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "rows": 8,
+ "filtered": 14.42307663,
+ "index_condition": "t2.d is not null",
+ "attached_condition": "(t2.d,t2.e) in (<cache>((3,3)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.d"],
+ "rows": 8,
+ "filtered": 100
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2715,30 +2739,36 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "5",
- "used_key_parts": ["d"],
- "rows": 7,
- "filtered": 6.730769157,
- "index_condition": "t2.d is not null",
- "attached_condition": "(t2.d,t2.e) in (<cache>((4,4)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1",
- "mrr_type": "Rowid-ordered scan"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.d"],
- "rows": 11,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "rows": 7,
+ "filtered": 6.730769157,
+ "index_condition": "t2.d is not null",
+ "attached_condition": "(t2.d,t2.e) in (<cache>((4,4)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.d"],
+ "rows": 11,
+ "filtered": 100
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2766,30 +2796,36 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "10",
- "used_key_parts": ["d", "e"],
- "rows": 5,
- "filtered": 100,
- "index_condition": "t2.d is not null",
- "attached_condition": "(t2.d,t2.e) in (<cache>((4,4)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1",
- "mrr_type": "Rowid-ordered scan"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "ref": ["test.t2.d"],
- "rows": 11,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "10",
+ "used_key_parts": ["d", "e"],
+ "rows": 5,
+ "filtered": 100,
+ "index_condition": "t2.d is not null",
+ "attached_condition": "(t2.d,t2.e) in (<cache>((4,4)),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "ref": ["test.t2.d"],
+ "rows": 11,
+ "filtered": 100
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2816,30 +2852,36 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 15,
- "filtered": 100,
- "index_condition": "t1.a is not null",
- "mrr_type": "Rowid-ordered scan"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "5",
- "used_key_parts": ["d"],
- "ref": ["test.t1.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "(t1.a,t2.e) in ((4,t1.a + 1),(7,t1.a + 1),(8,t1.a + 1)) and octet_length(t2.f) = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 15,
+ "filtered": 100,
+ "index_condition": "t1.a is not null",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "ref": ["test.t1.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t2.e) in ((4,t1.a + 1),(7,t1.a + 1),(8,t1.a + 1)) and octet_length(t2.f) = 1"
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2874,26 +2916,32 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "possible_keys": ["idx"],
- "rows": 144,
- "filtered": 100,
- "attached_condition": "t1.a is not null"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "5",
- "used_key_parts": ["d"],
- "ref": ["test.t1.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "(t1.a,t2.e) in ((t2.e,t1.a + 1),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "possible_keys": ["idx"],
+ "rows": 144,
+ "filtered": 100,
+ "attached_condition": "t1.a is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "ref": ["test.t1.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "(t1.a,t2.e) in ((t2.e,t1.a + 1),<cache>((7,7)),<cache>((8,8))) and octet_length(t2.f) = 1"
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -2922,31 +2970,37 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 12,
- "filtered": 100,
- "index_condition": "t1.a is not null",
- "attached_condition": "(t1.a,2) in (<cache>((2,2)),<cache>((7,7)),<cache>((8,8))) and octet_length(t1.c) = 1",
- "mrr_type": "Rowid-ordered scan"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "5",
- "used_key_parts": ["d"],
- "ref": ["test.t1.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "octet_length(t2.f) = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 12,
+ "filtered": 100,
+ "index_condition": "t1.a is not null",
+ "attached_condition": "(t1.a,2) in (<cache>((2,2)),<cache>((7,7)),<cache>((8,8))) and octet_length(t1.c) = 1",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "ref": ["test.t1.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "octet_length(t2.f) = 1"
+ }
+ }
+ ]
}
}
select * from t1,t2
@@ -3000,42 +3054,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "const",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["id"],
- "ref": ["const"],
- "rows": 1,
- "filtered": 100
- },
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx"],
- "key": "idx",
- "key_length": "5",
- "used_key_parts": ["a"],
- "rows": 12,
- "filtered": 100,
- "index_condition": "t1.a is not null",
- "attached_condition": "(t1.a,1 + 1) in (<cache>((2,2)),<cache>((7,7)),<cache>((8,8))) and octet_length(t1.c) = 1",
- "mrr_type": "Rowid-ordered scan"
- },
- "table": {
- "table_name": "t2",
- "access_type": "ref",
- "possible_keys": ["idx3"],
- "key": "idx3",
- "key_length": "5",
- "used_key_parts": ["d"],
- "ref": ["test.t1.a"],
- "rows": 3,
- "filtered": 100,
- "attached_condition": "octet_length(t2.f) = 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "const",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["id"],
+ "ref": ["const"],
+ "rows": 1,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx"],
+ "key": "idx",
+ "key_length": "5",
+ "used_key_parts": ["a"],
+ "rows": 12,
+ "filtered": 100,
+ "index_condition": "t1.a is not null",
+ "attached_condition": "(t1.a,1 + 1) in (<cache>((2,2)),<cache>((7,7)),<cache>((8,8))) and octet_length(t1.c) = 1",
+ "mrr_type": "Rowid-ordered scan"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ref",
+ "possible_keys": ["idx3"],
+ "key": "idx3",
+ "key_length": "5",
+ "used_key_parts": ["d"],
+ "ref": ["test.t1.a"],
+ "rows": 3,
+ "filtered": 100,
+ "attached_condition": "octet_length(t2.f) = 1"
+ }
+ }
+ ]
}
}
select * from t1,t2,t3
diff --git a/mysql-test/main/rowid_filter.result b/mysql-test/main/rowid_filter.result
index 9860b2e9ad3..5f1a4a1db76 100644
--- a/mysql-test/main/rowid_filter.result
+++ b/mysql-test/main/rowid_filter.result
@@ -77,26 +77,30 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": ["i_l_shipdate", "i_l_quantity"],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rowid_filter": {
- "range": {
- "key": "i_l_quantity",
- "used_key_parts": ["l_quantity"]
- },
- "rows": 702,
- "selectivity_pct": 11.69025812
- },
- "rows": 509,
- "filtered": 11.69025803,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": ["i_l_shipdate", "i_l_quantity"],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_quantity",
+ "used_key_parts": ["l_quantity"]
+ },
+ "rows": 702,
+ "selectivity_pct": 11.69025812
+ },
+ "rows": 509,
+ "filtered": 11.69025803,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT l_orderkey, l_linenumber, l_shipdate, l_quantity FROM lineitem
@@ -113,36 +117,40 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": ["i_l_shipdate", "i_l_quantity"],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rowid_filter": {
- "range": {
- "key": "i_l_quantity",
- "used_key_parts": ["l_quantity"]
- },
- "rows": 702,
- "selectivity_pct": 11.69025812,
- "r_rows": 605,
- "r_lookups": 510,
- "r_selectivity_pct": 11.76470588,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 509,
- "r_rows": 60,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 11.69025803,
- "r_filtered": 100,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": ["i_l_shipdate", "i_l_quantity"],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_quantity",
+ "used_key_parts": ["l_quantity"]
+ },
+ "rows": 702,
+ "selectivity_pct": 11.69025812,
+ "r_rows": 605,
+ "r_lookups": 510,
+ "r_selectivity_pct": 11.76470588,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 509,
+ "r_rows": 60,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 11.69025803,
+ "r_filtered": 100,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT l_orderkey, l_linenumber, l_shipdate, l_quantity FROM lineitem
@@ -221,18 +229,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": ["i_l_shipdate", "i_l_quantity"],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rows": 509,
- "filtered": 11.69025803,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": ["i_l_shipdate", "i_l_quantity"],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rows": 509,
+ "filtered": 11.69025803,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT l_orderkey, l_linenumber, l_shipdate, l_quantity FROM lineitem
@@ -249,23 +261,27 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": ["i_l_shipdate", "i_l_quantity"],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "r_loops": 1,
- "rows": 509,
- "r_rows": 510,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 11.69025803,
- "r_filtered": 11.76470588,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": ["i_l_shipdate", "i_l_quantity"],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "r_loops": 1,
+ "rows": 509,
+ "r_rows": 510,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 11.69025803,
+ "r_filtered": 11.76470588,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT l_orderkey, l_linenumber, l_shipdate, l_quantity FROM lineitem
@@ -347,42 +363,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rows": 98,
- "filtered": 100,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_o_totalprice",
- "used_key_parts": ["o_totalprice"]
- },
- "rows": 69,
- "selectivity_pct": 4.6
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rows": 98,
+ "filtered": 100,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'"
+ }
},
- "rows": 1,
- "filtered": 4.599999905,
- "attached_condition": "orders.o_totalprice between 200000 and 230000"
- }
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_o_totalprice",
+ "used_key_parts": ["o_totalprice"]
+ },
+ "rows": 69,
+ "selectivity_pct": 4.6
+ },
+ "rows": 1,
+ "filtered": 4.599999905,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -402,57 +424,63 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "r_loops": 1,
- "rows": 98,
- "r_rows": 98,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_o_totalprice",
- "used_key_parts": ["o_totalprice"]
- },
- "rows": 69,
- "selectivity_pct": 4.6,
- "r_rows": 71,
- "r_lookups": 96,
- "r_selectivity_pct": 10.41666667,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "r_loops": 1,
+ "rows": 98,
+ "r_rows": 98,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'"
+ }
},
- "r_loops": 98,
- "rows": 1,
- "r_rows": 0.112244898,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 4.599999905,
- "r_filtered": 100,
- "attached_condition": "orders.o_totalprice between 200000 and 230000"
- }
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_o_totalprice",
+ "used_key_parts": ["o_totalprice"]
+ },
+ "rows": 69,
+ "selectivity_pct": 4.6,
+ "r_rows": 71,
+ "r_lookups": 96,
+ "r_selectivity_pct": 10.41666667,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 98,
+ "rows": 1,
+ "r_rows": 0.112244898,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 4.599999905,
+ "r_filtered": 100,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -486,34 +514,40 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rows": 98,
- "filtered": 100,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rows": 1,
- "filtered": 4.599999905,
- "attached_condition": "orders.o_totalprice between 200000 and 230000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rows": 98,
+ "filtered": 100,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rows": 1,
+ "filtered": 4.599999905,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -533,44 +567,50 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "r_loops": 1,
- "rows": 98,
- "r_rows": 98,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "r_loops": 98,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 4.599999905,
- "r_filtered": 11.2244898,
- "attached_condition": "orders.o_totalprice between 200000 and 230000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "r_loops": 1,
+ "rows": 98,
+ "r_rows": 98,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "r_loops": 98,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 4.599999905,
+ "r_filtered": 11.2244898,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -606,52 +646,58 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity",
- "i_l_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rowid_filter": {
- "range": {
- "key": "i_l_quantity",
- "used_key_parts": ["l_quantity"]
- },
- "rows": 702,
- "selectivity_pct": 11.69025812
- },
- "rows": 509,
- "filtered": 11.69025803,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_o_totalprice",
- "used_key_parts": ["o_totalprice"]
- },
- "rows": 139,
- "selectivity_pct": 9.266666667
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity",
+ "i_l_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_quantity",
+ "used_key_parts": ["l_quantity"]
+ },
+ "rows": 702,
+ "selectivity_pct": 11.69025812
+ },
+ "rows": 509,
+ "filtered": 11.69025803,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
},
- "rows": 1,
- "filtered": 9.266666412,
- "attached_condition": "orders.o_totalprice between 180000 and 230000"
- }
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_o_totalprice",
+ "used_key_parts": ["o_totalprice"]
+ },
+ "rows": 139,
+ "selectivity_pct": 9.266666667
+ },
+ "rows": 1,
+ "filtered": 9.266666412,
+ "attached_condition": "orders.o_totalprice between 180000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
@@ -673,72 +719,78 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity",
- "i_l_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rowid_filter": {
- "range": {
- "key": "i_l_quantity",
- "used_key_parts": ["l_quantity"]
- },
- "rows": 702,
- "selectivity_pct": 11.69025812,
- "r_rows": 605,
- "r_lookups": 510,
- "r_selectivity_pct": 11.76470588,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 509,
- "r_rows": 60,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 11.69025803,
- "r_filtered": 100,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_o_totalprice",
- "used_key_parts": ["o_totalprice"]
- },
- "rows": 139,
- "selectivity_pct": 9.266666667,
- "r_rows": 144,
- "r_lookups": 59,
- "r_selectivity_pct": 25.42372881,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity",
+ "i_l_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_quantity",
+ "used_key_parts": ["l_quantity"]
+ },
+ "rows": 702,
+ "selectivity_pct": 11.69025812,
+ "r_rows": 605,
+ "r_lookups": 510,
+ "r_selectivity_pct": 11.76470588,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 509,
+ "r_rows": 60,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 11.69025803,
+ "r_filtered": 100,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
},
- "r_loops": 60,
- "rows": 1,
- "r_rows": 0.266666667,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 9.266666412,
- "r_filtered": 100,
- "attached_condition": "orders.o_totalprice between 180000 and 230000"
- }
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_o_totalprice",
+ "used_key_parts": ["o_totalprice"]
+ },
+ "rows": 139,
+ "selectivity_pct": 9.266666667,
+ "r_rows": 144,
+ "r_lookups": 59,
+ "r_selectivity_pct": 25.42372881,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 60,
+ "rows": 1,
+ "r_rows": 0.266666667,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 9.266666412,
+ "r_filtered": 100,
+ "attached_condition": "orders.o_totalprice between 180000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
@@ -780,36 +832,42 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity",
- "i_l_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rows": 509,
- "filtered": 11.69025803,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rows": 1,
- "filtered": 9.266666412,
- "attached_condition": "orders.o_totalprice between 180000 and 230000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity",
+ "i_l_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rows": 509,
+ "filtered": 11.69025803,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rows": 1,
+ "filtered": 9.266666412,
+ "attached_condition": "orders.o_totalprice between 180000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
@@ -831,46 +889,52 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity",
- "i_l_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "r_loops": 1,
- "rows": 509,
- "r_rows": 510,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 11.69025803,
- "r_filtered": 11.76470588,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "r_loops": 60,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 9.266666412,
- "r_filtered": 26.66666667,
- "attached_condition": "orders.o_totalprice between 180000 and 230000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity",
+ "i_l_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "r_loops": 1,
+ "rows": 509,
+ "r_rows": 510,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 11.69025803,
+ "r_filtered": 11.76470588,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "r_loops": 60,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 9.266666412,
+ "r_filtered": 26.66666667,
+ "attached_condition": "orders.o_totalprice between 180000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
@@ -910,42 +974,48 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "rows": 69,
- "filtered": 100,
- "index_condition": "orders.o_totalprice between 200000 and 230000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_l_shipdate",
- "used_key_parts": ["l_shipDATE"]
- },
- "rows": 509,
- "selectivity_pct": 8.476269775
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "rows": 69,
+ "filtered": 100,
+ "index_condition": "orders.o_totalprice between 200000 and 230000"
+ }
},
- "rows": 4,
- "filtered": 8.476269722,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
- }
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_shipdate",
+ "used_key_parts": ["l_shipDATE"]
+ },
+ "rows": 509,
+ "selectivity_pct": 8.476269775
+ },
+ "rows": 4,
+ "filtered": 8.476269722,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -965,57 +1035,63 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "r_loops": 1,
- "rows": 69,
- "r_rows": 71,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "index_condition": "orders.o_totalprice between 200000 and 230000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_l_shipdate",
- "used_key_parts": ["l_shipDATE"]
- },
- "rows": 509,
- "selectivity_pct": 8.476269775,
- "r_rows": 510,
- "r_lookups": 476,
- "r_selectivity_pct": 7.773109244,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "r_loops": 1,
+ "rows": 69,
+ "r_rows": 71,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "index_condition": "orders.o_totalprice between 200000 and 230000"
+ }
},
- "r_loops": 71,
- "rows": 4,
- "r_rows": 0.521126761,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 8.476269722,
- "r_filtered": 100,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
- }
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_shipdate",
+ "used_key_parts": ["l_shipDATE"]
+ },
+ "rows": 509,
+ "selectivity_pct": 8.476269775,
+ "r_rows": 510,
+ "r_lookups": 476,
+ "r_selectivity_pct": 7.773109244,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 71,
+ "rows": 4,
+ "r_rows": 0.521126761,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 8.476269722,
+ "r_filtered": 100,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -1075,34 +1151,40 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "rows": 69,
- "filtered": 100,
- "index_condition": "orders.o_totalprice between 200000 and 230000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": 8.476269722,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "rows": 69,
+ "filtered": 100,
+ "index_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": 8.476269722,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -1122,44 +1204,50 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "r_loops": 1,
- "rows": 69,
- "r_rows": 71,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "index_condition": "orders.o_totalprice between 200000 and 230000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 71,
- "rows": 4,
- "r_rows": 6.704225352,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 8.476269722,
- "r_filtered": 7.773109244,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "r_loops": 1,
+ "rows": 69,
+ "r_rows": 71,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "index_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 71,
+ "rows": 4,
+ "r_rows": 6.704225352,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 8.476269722,
+ "r_filtered": 7.773109244,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -1230,36 +1318,42 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_receiptdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_receiptdate",
- "key_length": "4",
- "used_key_parts": ["l_receiptDATE"],
- "rows": 18,
- "filtered": 0.566194832,
- "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rows": 1,
- "filtered": 7.466666698,
- "attached_condition": "orders.o_totalprice between 200000 and 250000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_receiptdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_receiptdate",
+ "key_length": "4",
+ "used_key_parts": ["l_receiptDATE"],
+ "rows": 18,
+ "filtered": 0.566194832,
+ "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rows": 1,
+ "filtered": 7.466666698,
+ "attached_condition": "orders.o_totalprice between 200000 and 250000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT l_shipdate, l_receiptdate, o_totalprice
@@ -1283,46 +1377,52 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_receiptdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_receiptdate",
- "key_length": "4",
- "used_key_parts": ["l_receiptDATE"],
- "r_loops": 1,
- "rows": 18,
- "r_rows": 18,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 0.566194832,
- "r_filtered": 38.88888889,
- "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "r_loops": 7,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 7.466666698,
- "r_filtered": 14.28571429,
- "attached_condition": "orders.o_totalprice between 200000 and 250000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_receiptdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_receiptdate",
+ "key_length": "4",
+ "used_key_parts": ["l_receiptDATE"],
+ "r_loops": 1,
+ "rows": 18,
+ "r_rows": 18,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 0.566194832,
+ "r_filtered": 38.88888889,
+ "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "r_loops": 7,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 7.466666698,
+ "r_filtered": 14.28571429,
+ "attached_condition": "orders.o_totalprice between 200000 and 250000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT l_shipdate, l_receiptdate, o_totalprice
@@ -1352,36 +1452,42 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_receiptdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_receiptdate",
- "key_length": "4",
- "used_key_parts": ["l_receiptDATE"],
- "rows": 18,
- "filtered": 0.566194832,
- "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rows": 1,
- "filtered": 7.466666698,
- "attached_condition": "orders.o_totalprice between 200000 and 250000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_receiptdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_receiptdate",
+ "key_length": "4",
+ "used_key_parts": ["l_receiptDATE"],
+ "rows": 18,
+ "filtered": 0.566194832,
+ "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rows": 1,
+ "filtered": 7.466666698,
+ "attached_condition": "orders.o_totalprice between 200000 and 250000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT l_shipdate, l_receiptdate, o_totalprice
@@ -1405,46 +1511,52 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_receiptdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_receiptdate",
- "key_length": "4",
- "used_key_parts": ["l_receiptDATE"],
- "r_loops": 1,
- "rows": 18,
- "r_rows": 18,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 0.566194832,
- "r_filtered": 38.88888889,
- "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "r_loops": 7,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 7.466666698,
- "r_filtered": 14.28571429,
- "attached_condition": "orders.o_totalprice between 200000 and 250000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_receiptdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_receiptdate",
+ "key_length": "4",
+ "used_key_parts": ["l_receiptDATE"],
+ "r_loops": 1,
+ "rows": 18,
+ "r_rows": 18,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 0.566194832,
+ "r_filtered": 38.88888889,
+ "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "r_loops": 7,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 7.466666698,
+ "r_filtered": 14.28571429,
+ "attached_condition": "orders.o_totalprice between 200000 and 250000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT l_shipdate, l_receiptdate, o_totalprice
@@ -1481,35 +1593,41 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "rows": 39,
- "filtered": 3.200000048,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": 3.047460556,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "rows": 39,
+ "filtered": 3.200000048,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": 3.047460556,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1533,45 +1651,51 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "r_loops": 1,
- "rows": 39,
- "r_rows": 41,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 3.200000048,
- "r_filtered": 2.43902439,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 1,
- "rows": 4,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 3.047460556,
- "r_filtered": 66.66666667,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "r_loops": 1,
+ "rows": 39,
+ "r_rows": 41,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 3.200000048,
+ "r_filtered": 2.43902439,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 3.047460556,
+ "r_filtered": 66.66666667,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1604,35 +1728,41 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "rows": 39,
- "filtered": 3.200000048,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": 3.047460556,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "rows": 39,
+ "filtered": 3.200000048,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": 3.047460556,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1656,45 +1786,51 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "r_loops": 1,
- "rows": 39,
- "r_rows": 41,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 3.200000048,
- "r_filtered": 2.43902439,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 1,
- "rows": 4,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 3.047460556,
- "r_filtered": 66.66666667,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "r_loops": 1,
+ "rows": 39,
+ "r_rows": 41,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 3.200000048,
+ "r_filtered": 2.43902439,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 3.047460556,
+ "r_filtered": 66.66666667,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1730,40 +1866,46 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_o_orderdate",
- "i_o_totalprice",
- "i_o_totaldiscount"
- ],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "rows": 39,
- "filtered": "REPLACED",
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": "REPLACED",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_o_orderdate",
+ "i_o_totalprice",
+ "i_o_totaldiscount"
+ ],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "rows": 39,
+ "filtered": "REPLACED",
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": "REPLACED",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1787,50 +1929,56 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_o_orderdate",
- "i_o_totalprice",
- "i_o_totaldiscount"
- ],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "r_loops": 1,
- "rows": 39,
- "r_rows": 41,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": "REPLACED",
- "r_filtered": 2.43902439,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 1,
- "rows": 4,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": "REPLACED",
- "r_filtered": 66.66666667,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_o_orderdate",
+ "i_o_totalprice",
+ "i_o_totaldiscount"
+ ],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "r_loops": 1,
+ "rows": 39,
+ "r_rows": 41,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": "REPLACED",
+ "r_filtered": 2.43902439,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": "REPLACED",
+ "r_filtered": 66.66666667,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1863,40 +2011,46 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_o_orderdate",
- "i_o_totalprice",
- "i_o_totaldiscount"
- ],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "rows": 39,
- "filtered": "REPLACED",
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": "REPLACED",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_o_orderdate",
+ "i_o_totalprice",
+ "i_o_totaldiscount"
+ ],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "rows": 39,
+ "filtered": "REPLACED",
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": "REPLACED",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1920,50 +2074,56 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_o_orderdate",
- "i_o_totalprice",
- "i_o_totaldiscount"
- ],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "r_loops": 1,
- "rows": 39,
- "r_rows": 41,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": "REPLACED",
- "r_filtered": 2.43902439,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_orderkey",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 1,
- "rows": 4,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": "REPLACED",
- "r_filtered": 66.66666667,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_o_orderdate",
+ "i_o_totalprice",
+ "i_o_totaldiscount"
+ ],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "r_loops": 1,
+ "rows": 39,
+ "r_rows": 41,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": "REPLACED",
+ "r_filtered": 2.43902439,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_orderkey",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": "REPLACED",
+ "r_filtered": 66.66666667,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -2108,40 +2268,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 101,
- "filtered": 100,
- "attached_condition": "t2.a2 is not null"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["a1", "b1"],
- "key": "a1",
- "key_length": "5",
- "used_key_parts": ["a1"],
- "ref": ["test.t2.a2"],
- "rows": 36,
- "filtered": 28.75,
- "attached_condition": "t1.b1 <= (subquery#2) and t1.pk1 + 1 = t2.pk2 + 2"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 101,
+ "filtered": 100,
+ "attached_condition": "t2.a2 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["a1", "b1"],
+ "key": "a1",
+ "key_length": "5",
+ "used_key_parts": ["a1"],
+ "ref": ["test.t2.a2"],
+ "rows": 36,
+ "filtered": 28.75,
+ "attached_condition": "t1.b1 <= (subquery#2) and t1.pk1 + 1 = t2.pk2 + 2"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk2"],
- "rows": 1,
- "filtered": 100,
- "index_condition": "t2.pk2 <= 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk2"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t2.pk2 <= 1"
+ }
+ }
+ ]
}
}
]
@@ -2317,23 +2487,27 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "35",
- "used_key_parts": ["nm"],
- "r_loops": 1,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 49.20000076,
- "r_filtered": 100,
- "index_condition": "t1.nm like '500%'",
- "attached_condition": "t1.fl2 = 0"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "35",
+ "used_key_parts": ["nm"],
+ "r_loops": 1,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 49.20000076,
+ "r_filtered": 100,
+ "index_condition": "t1.nm like '500%'",
+ "attached_condition": "t1.fl2 = 0"
+ }
+ }
+ ]
}
}
select * from t1 where nm like '500%' AND fl2 = 0;
@@ -2363,23 +2537,27 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "35",
- "used_key_parts": ["nm"],
- "r_loops": 1,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 49.20000076,
- "r_filtered": 100,
- "index_condition": "t1.nm like '500%'",
- "attached_condition": "t1.fl2 = 0"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "35",
+ "used_key_parts": ["nm"],
+ "r_loops": 1,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 49.20000076,
+ "r_filtered": 100,
+ "index_condition": "t1.nm like '500%'",
+ "attached_condition": "t1.fl2 = 0"
+ }
+ }
+ ]
}
}
select * from t1 where nm like '500%' AND fl2 = 0;
@@ -2434,36 +2612,40 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx2",
- "key_length": "2",
- "used_key_parts": ["fl2"],
- "ref": ["const"],
- "rowid_filter": {
- "range": {
- "key": "idx1",
- "used_key_parts": ["nm"]
- },
- "rows": 115,
- "selectivity_pct": 1.15,
- "r_rows": 111,
- "r_lookups": 100,
- "r_selectivity_pct": 2,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 55,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 1.149999976,
- "r_filtered": 100,
- "attached_condition": "t1.nm like '75%'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx2",
+ "key_length": "2",
+ "used_key_parts": ["fl2"],
+ "ref": ["const"],
+ "rowid_filter": {
+ "range": {
+ "key": "idx1",
+ "used_key_parts": ["nm"]
+ },
+ "rows": 115,
+ "selectivity_pct": 1.15,
+ "r_rows": 111,
+ "r_lookups": 100,
+ "r_selectivity_pct": 2,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 55,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 1.149999976,
+ "r_filtered": 100,
+ "attached_condition": "t1.nm like '75%'"
+ }
+ }
+ ]
}
}
select * from t1 where nm like '75%' AND fl2 = 0;
@@ -2541,36 +2723,40 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx2",
- "key_length": "5",
- "used_key_parts": ["fl2"],
- "ref": ["const"],
- "rowid_filter": {
- "range": {
- "key": "idx1",
- "used_key_parts": ["nm"]
- },
- "rows": 44,
- "selectivity_pct": 0.44,
- "r_rows": 44,
- "r_lookups": 1000,
- "r_selectivity_pct": 0,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 863,
- "r_rows": 0,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 0.439999998,
- "r_filtered": 100,
- "attached_condition": "t1.nm like '3400%' or t1.nm like '3402%' or t1.nm like '3403%' or t1.nm like '3404%' or t1.nm like '3405%' or t1.nm like '3406%' or t1.nm like '3407%' or t1.nm like '3409%' or t1.nm like '3411%' or t1.nm like '3412%' or t1.nm like '3413%' or t1.nm like '3414%' or t1.nm like '3415%' or t1.nm like '3416%' or t1.nm like '3417%' or t1.nm like '3418%' or t1.nm like '3419%' or t1.nm like '3421%' or t1.nm like '3422%' or t1.nm like '3423%' or t1.nm like '3424%' or t1.nm like '3425%' or t1.nm like '3426%' or t1.nm like '3427%' or t1.nm like '3428%' or t1.nm like '3429%' or t1.nm like '3430%' or t1.nm like '3431%' or t1.nm like '3432%' or t1.nm like '3433%' or t1.nm like '3434%' or t1.nm like '3435%' or t1.nm like '3436%' or t1.nm like '3437%' or t1.nm like '3439%' or t1.nm like '3440%' or t1.nm like '3441%' or t1.nm like '3442%' or t1.nm like '3443%' or t1.nm like '3444%' or t1.nm like '3445%' or t1.nm like '3446%' or t1.nm like '3447%' or t1.nm like '3448%'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx2",
+ "key_length": "5",
+ "used_key_parts": ["fl2"],
+ "ref": ["const"],
+ "rowid_filter": {
+ "range": {
+ "key": "idx1",
+ "used_key_parts": ["nm"]
+ },
+ "rows": 44,
+ "selectivity_pct": 0.44,
+ "r_rows": 44,
+ "r_lookups": 1000,
+ "r_selectivity_pct": 0,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 863,
+ "r_rows": 0,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 0.439999998,
+ "r_filtered": 100,
+ "attached_condition": "t1.nm like '3400%' or t1.nm like '3402%' or t1.nm like '3403%' or t1.nm like '3404%' or t1.nm like '3405%' or t1.nm like '3406%' or t1.nm like '3407%' or t1.nm like '3409%' or t1.nm like '3411%' or t1.nm like '3412%' or t1.nm like '3413%' or t1.nm like '3414%' or t1.nm like '3415%' or t1.nm like '3416%' or t1.nm like '3417%' or t1.nm like '3418%' or t1.nm like '3419%' or t1.nm like '3421%' or t1.nm like '3422%' or t1.nm like '3423%' or t1.nm like '3424%' or t1.nm like '3425%' or t1.nm like '3426%' or t1.nm like '3427%' or t1.nm like '3428%' or t1.nm like '3429%' or t1.nm like '3430%' or t1.nm like '3431%' or t1.nm like '3432%' or t1.nm like '3433%' or t1.nm like '3434%' or t1.nm like '3435%' or t1.nm like '3436%' or t1.nm like '3437%' or t1.nm like '3439%' or t1.nm like '3440%' or t1.nm like '3441%' or t1.nm like '3442%' or t1.nm like '3443%' or t1.nm like '3444%' or t1.nm like '3445%' or t1.nm like '3446%' or t1.nm like '3447%' or t1.nm like '3448%'"
+ }
+ }
+ ]
}
}
create table t0 select * from t1 where nm like '34%';
@@ -2600,34 +2786,38 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx2",
- "key_length": "5",
- "used_key_parts": ["fl2"],
- "ref": ["const"],
- "rowid_filter": {
- "range": {
- "key": "idx1",
- "used_key_parts": ["nm"]
- },
- "rows": 44,
- "selectivity_pct": 0.44,
- "r_rows": 0,
- "r_lookups": 0,
- "r_selectivity_pct": 0,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 853,
- "r_rows": 0,
- "filtered": 0.439999998,
- "r_filtered": 100,
- "attached_condition": "t1.nm like '3400%' or t1.nm like '3402%' or t1.nm like '3403%' or t1.nm like '3404%' or t1.nm like '3405%' or t1.nm like '3406%' or t1.nm like '3407%' or t1.nm like '3409%' or t1.nm like '3411%' or t1.nm like '3412%' or t1.nm like '3413%' or t1.nm like '3414%' or t1.nm like '3415%' or t1.nm like '3416%' or t1.nm like '3417%' or t1.nm like '3418%' or t1.nm like '3419%' or t1.nm like '3421%' or t1.nm like '3422%' or t1.nm like '3423%' or t1.nm like '3424%' or t1.nm like '3425%' or t1.nm like '3426%' or t1.nm like '3427%' or t1.nm like '3428%' or t1.nm like '3429%' or t1.nm like '3430%' or t1.nm like '3431%' or t1.nm like '3432%' or t1.nm like '3433%' or t1.nm like '3434%' or t1.nm like '3435%' or t1.nm like '3436%' or t1.nm like '3437%' or t1.nm like '3439%' or t1.nm like '3440%' or t1.nm like '3441%' or t1.nm like '3442%' or t1.nm like '3443%' or t1.nm like '3444%' or t1.nm like '3445%' or t1.nm like '3446%' or t1.nm like '3447%' or t1.nm like '3448%'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx2",
+ "key_length": "5",
+ "used_key_parts": ["fl2"],
+ "ref": ["const"],
+ "rowid_filter": {
+ "range": {
+ "key": "idx1",
+ "used_key_parts": ["nm"]
+ },
+ "rows": 44,
+ "selectivity_pct": 0.44,
+ "r_rows": 0,
+ "r_lookups": 0,
+ "r_selectivity_pct": 0,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 853,
+ "r_rows": 0,
+ "filtered": 0.439999998,
+ "r_filtered": 100,
+ "attached_condition": "t1.nm like '3400%' or t1.nm like '3402%' or t1.nm like '3403%' or t1.nm like '3404%' or t1.nm like '3405%' or t1.nm like '3406%' or t1.nm like '3407%' or t1.nm like '3409%' or t1.nm like '3411%' or t1.nm like '3412%' or t1.nm like '3413%' or t1.nm like '3414%' or t1.nm like '3415%' or t1.nm like '3416%' or t1.nm like '3417%' or t1.nm like '3418%' or t1.nm like '3419%' or t1.nm like '3421%' or t1.nm like '3422%' or t1.nm like '3423%' or t1.nm like '3424%' or t1.nm like '3425%' or t1.nm like '3426%' or t1.nm like '3427%' or t1.nm like '3428%' or t1.nm like '3429%' or t1.nm like '3430%' or t1.nm like '3431%' or t1.nm like '3432%' or t1.nm like '3433%' or t1.nm like '3434%' or t1.nm like '3435%' or t1.nm like '3436%' or t1.nm like '3437%' or t1.nm like '3439%' or t1.nm like '3440%' or t1.nm like '3441%' or t1.nm like '3442%' or t1.nm like '3443%' or t1.nm like '3444%' or t1.nm like '3445%' or t1.nm like '3446%' or t1.nm like '3447%' or t1.nm like '3448%'"
+ }
+ }
+ ]
}
}
drop table t0;
diff --git a/mysql-test/main/rowid_filter_innodb.result b/mysql-test/main/rowid_filter_innodb.result
index 3e673afbc99..990c6b4e894 100644
--- a/mysql-test/main/rowid_filter_innodb.result
+++ b/mysql-test/main/rowid_filter_innodb.result
@@ -80,26 +80,30 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": ["i_l_shipdate", "i_l_quantity"],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rowid_filter": {
- "range": {
- "key": "i_l_quantity",
- "used_key_parts": ["l_quantity"]
- },
- "rows": 605,
- "selectivity_pct": 10.07493755
- },
- "rows": 510,
- "filtered": 10.07493782,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": ["i_l_shipdate", "i_l_quantity"],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_quantity",
+ "used_key_parts": ["l_quantity"]
+ },
+ "rows": 605,
+ "selectivity_pct": 10.07493755
+ },
+ "rows": 510,
+ "filtered": 10.07493782,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT l_orderkey, l_linenumber, l_shipdate, l_quantity FROM lineitem
@@ -116,36 +120,40 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": ["i_l_shipdate", "i_l_quantity"],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rowid_filter": {
- "range": {
- "key": "i_l_quantity",
- "used_key_parts": ["l_quantity"]
- },
- "rows": 605,
- "selectivity_pct": 10.07493755,
- "r_rows": 605,
- "r_lookups": 510,
- "r_selectivity_pct": 11.76470588,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 510,
- "r_rows": 60,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 10.07493782,
- "r_filtered": 100,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": ["i_l_shipdate", "i_l_quantity"],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_quantity",
+ "used_key_parts": ["l_quantity"]
+ },
+ "rows": 605,
+ "selectivity_pct": 10.07493755,
+ "r_rows": 605,
+ "r_lookups": 510,
+ "r_selectivity_pct": 11.76470588,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 510,
+ "r_rows": 60,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 10.07493782,
+ "r_filtered": 100,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT l_orderkey, l_linenumber, l_shipdate, l_quantity FROM lineitem
@@ -224,18 +232,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": ["i_l_shipdate", "i_l_quantity"],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rows": 510,
- "filtered": 10.07493782,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": ["i_l_shipdate", "i_l_quantity"],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rows": 510,
+ "filtered": 10.07493782,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT l_orderkey, l_linenumber, l_shipdate, l_quantity FROM lineitem
@@ -252,23 +264,27 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": ["i_l_shipdate", "i_l_quantity"],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "r_loops": 1,
- "rows": 510,
- "r_rows": 510,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 10.07493782,
- "r_filtered": 11.76470588,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": ["i_l_shipdate", "i_l_quantity"],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "r_loops": 1,
+ "rows": 510,
+ "r_rows": 510,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 10.07493782,
+ "r_filtered": 11.76470588,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT l_orderkey, l_linenumber, l_shipdate, l_quantity FROM lineitem
@@ -350,35 +366,41 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rows": 98,
- "filtered": 100,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'",
- "using_index": true
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rows": 1,
- "filtered": 4.733333111,
- "attached_condition": "orders.o_totalprice between 200000 and 230000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rows": 98,
+ "filtered": 100,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rows": 1,
+ "filtered": 4.733333111,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -398,45 +420,51 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "r_loops": 1,
- "rows": 98,
- "r_rows": 98,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'",
- "using_index": true
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "r_loops": 98,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 4.733333111,
- "r_filtered": 11.2244898,
- "attached_condition": "orders.o_totalprice between 200000 and 230000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "r_loops": 1,
+ "rows": 98,
+ "r_rows": 98,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "r_loops": 98,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 4.733333111,
+ "r_filtered": 11.2244898,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -470,35 +498,41 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rows": 98,
- "filtered": 100,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'",
- "using_index": true
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rows": 1,
- "filtered": 4.733333111,
- "attached_condition": "orders.o_totalprice between 200000 and 230000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rows": 98,
+ "filtered": 100,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rows": 1,
+ "filtered": 4.733333111,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -518,45 +552,51 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "r_loops": 1,
- "rows": 98,
- "r_rows": 98,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'",
- "using_index": true
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "r_loops": 98,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 4.733333111,
- "r_filtered": 11.2244898,
- "attached_condition": "orders.o_totalprice between 200000 and 230000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "r_loops": 1,
+ "rows": 98,
+ "r_rows": 98,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-01-31'",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "r_loops": 98,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 4.733333111,
+ "r_filtered": 11.2244898,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -592,44 +632,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity",
- "i_l_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rowid_filter": {
- "range": {
- "key": "i_l_quantity",
- "used_key_parts": ["l_quantity"]
- },
- "rows": 605,
- "selectivity_pct": 10.07493755
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity",
+ "i_l_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_quantity",
+ "used_key_parts": ["l_quantity"]
+ },
+ "rows": 605,
+ "selectivity_pct": 10.07493755
+ },
+ "rows": 510,
+ "filtered": 10.07493782,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
},
- "rows": 510,
- "filtered": 10.07493782,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rows": 1,
- "filtered": 9.600000381,
- "attached_condition": "orders.o_totalprice between 180000 and 230000"
- }
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rows": 1,
+ "filtered": 9.600000381,
+ "attached_condition": "orders.o_totalprice between 180000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
@@ -651,59 +697,65 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity",
- "i_l_quantity"
- ],
- "key": "i_l_shipdate",
- "key_length": "4",
- "used_key_parts": ["l_shipDATE"],
- "rowid_filter": {
- "range": {
- "key": "i_l_quantity",
- "used_key_parts": ["l_quantity"]
- },
- "rows": 605,
- "selectivity_pct": 10.07493755,
- "r_rows": 605,
- "r_lookups": 510,
- "r_selectivity_pct": 11.76470588,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity",
+ "i_l_quantity"
+ ],
+ "key": "i_l_shipdate",
+ "key_length": "4",
+ "used_key_parts": ["l_shipDATE"],
+ "rowid_filter": {
+ "range": {
+ "key": "i_l_quantity",
+ "used_key_parts": ["l_quantity"]
+ },
+ "rows": 605,
+ "selectivity_pct": 10.07493755,
+ "r_rows": 605,
+ "r_lookups": 510,
+ "r_selectivity_pct": 11.76470588,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 510,
+ "r_rows": 60,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 10.07493782,
+ "r_filtered": 100,
+ "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
+ "attached_condition": "lineitem.l_quantity > 45"
+ }
},
- "r_loops": 1,
- "rows": 510,
- "r_rows": 60,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 10.07493782,
- "r_filtered": 100,
- "index_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'",
- "attached_condition": "lineitem.l_quantity > 45"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "r_loops": 60,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 9.600000381,
- "r_filtered": 26.66666667,
- "attached_condition": "orders.o_totalprice between 180000 and 230000"
- }
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "r_loops": 60,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 9.600000381,
+ "r_filtered": 26.66666667,
+ "attached_condition": "orders.o_totalprice between 180000 and 230000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
@@ -745,36 +797,42 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "rows": 144,
- "filtered": 100,
- "attached_condition": "orders.o_totalprice between 180000 and 230000",
- "using_index": true
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity",
- "i_l_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": 0.855656624,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30' and lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "rows": 144,
+ "filtered": 100,
+ "attached_condition": "orders.o_totalprice between 180000 and 230000",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity",
+ "i_l_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": 0.855656624,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30' and lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
@@ -796,46 +854,52 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "r_loops": 1,
- "rows": 144,
- "r_rows": 144,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "orders.o_totalprice between 180000 and 230000",
- "using_index": true
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity",
- "i_l_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 144,
- "rows": 4,
- "r_rows": 6.625,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 0.855656624,
- "r_filtered": 1.677148847,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30' and lineitem.l_quantity > 45"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "r_loops": 1,
+ "rows": 144,
+ "r_rows": 144,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "orders.o_totalprice between 180000 and 230000",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity",
+ "i_l_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 144,
+ "rows": 4,
+ "r_rows": 6.625,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 0.855656624,
+ "r_filtered": 1.677148847,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30' and lineitem.l_quantity > 45"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
@@ -875,35 +939,41 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "rows": 71,
- "filtered": 100,
- "attached_condition": "orders.o_totalprice between 200000 and 230000",
- "using_index": true
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": 8.492922783,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "rows": 71,
+ "filtered": 100,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": 8.492922783,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -923,45 +993,51 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "r_loops": 1,
- "rows": 71,
- "r_rows": 71,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "orders.o_totalprice between 200000 and 230000",
- "using_index": true
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 71,
- "rows": 4,
- "r_rows": 6.704225352,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 8.492922783,
- "r_filtered": 7.773109244,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "r_loops": 1,
+ "rows": 71,
+ "r_rows": 71,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 71,
+ "rows": 4,
+ "r_rows": 6.704225352,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 8.492922783,
+ "r_filtered": 7.773109244,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -1021,35 +1097,41 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "rows": 71,
- "filtered": 100,
- "attached_condition": "orders.o_totalprice between 200000 and 230000",
- "using_index": true
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": 8.492922783,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "rows": 71,
+ "filtered": 100,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": 8.492922783,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -1069,45 +1151,51 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "i_o_totalprice",
- "key_length": "9",
- "used_key_parts": ["o_totalprice"],
- "r_loops": 1,
- "rows": 71,
- "r_rows": 71,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "orders.o_totalprice between 200000 and 230000",
- "using_index": true
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 71,
- "rows": 4,
- "r_rows": 6.704225352,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 8.492922783,
- "r_filtered": 7.773109244,
- "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "i_o_totalprice",
+ "key_length": "9",
+ "used_key_parts": ["o_totalprice"],
+ "r_loops": 1,
+ "rows": 71,
+ "r_rows": 71,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "orders.o_totalprice between 200000 and 230000",
+ "using_index": true
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 71,
+ "rows": 4,
+ "r_rows": 6.704225352,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 8.492922783,
+ "r_filtered": 7.773109244,
+ "attached_condition": "lineitem.l_shipDATE between '1997-01-01' and '1997-06-30'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
@@ -1178,36 +1266,42 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_receiptdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_receiptdate",
- "key_length": "4",
- "used_key_parts": ["l_receiptDATE"],
- "rows": 18,
- "filtered": 0.566194832,
- "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rows": 1,
- "filtered": 5.666666508,
- "attached_condition": "orders.o_totalprice between 200000 and 250000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_receiptdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_receiptdate",
+ "key_length": "4",
+ "used_key_parts": ["l_receiptDATE"],
+ "rows": 18,
+ "filtered": 0.566194832,
+ "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rows": 1,
+ "filtered": 5.666666508,
+ "attached_condition": "orders.o_totalprice between 200000 and 250000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT l_shipdate, l_receiptdate, o_totalprice
@@ -1231,46 +1325,52 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_receiptdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_receiptdate",
- "key_length": "4",
- "used_key_parts": ["l_receiptDATE"],
- "r_loops": 1,
- "rows": 18,
- "r_rows": 18,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 0.566194832,
- "r_filtered": 38.88888889,
- "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "r_loops": 7,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 5.666666508,
- "r_filtered": 14.28571429,
- "attached_condition": "orders.o_totalprice between 200000 and 250000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_receiptdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_receiptdate",
+ "key_length": "4",
+ "used_key_parts": ["l_receiptDATE"],
+ "r_loops": 1,
+ "rows": 18,
+ "r_rows": 18,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 0.566194832,
+ "r_filtered": 38.88888889,
+ "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "r_loops": 7,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 5.666666508,
+ "r_filtered": 14.28571429,
+ "attached_condition": "orders.o_totalprice between 200000 and 250000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT l_shipdate, l_receiptdate, o_totalprice
@@ -1300,36 +1400,42 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_receiptdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_receiptdate",
- "key_length": "4",
- "used_key_parts": ["l_receiptDATE"],
- "rows": 18,
- "filtered": 0.566194832,
- "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rows": 1,
- "filtered": 5.666666508,
- "attached_condition": "orders.o_totalprice between 200000 and 250000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_receiptdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_receiptdate",
+ "key_length": "4",
+ "used_key_parts": ["l_receiptDATE"],
+ "rows": 18,
+ "filtered": 0.566194832,
+ "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "rows": 1,
+ "filtered": 5.666666508,
+ "attached_condition": "orders.o_totalprice between 200000 and 250000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT l_shipdate, l_receiptdate, o_totalprice
@@ -1353,46 +1459,52 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "lineitem",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_receiptdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "i_l_receiptdate",
- "key_length": "4",
- "used_key_parts": ["l_receiptDATE"],
- "r_loops": 1,
- "rows": 18,
- "r_rows": 18,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 0.566194832,
- "r_filtered": 38.88888889,
- "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
- },
- "table": {
- "table_name": "orders",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "i_o_totalprice"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["o_orderkey"],
- "ref": ["dbt3_s001.lineitem.l_orderkey"],
- "r_loops": 7,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 5.666666508,
- "r_filtered": 14.28571429,
- "attached_condition": "orders.o_totalprice between 200000 and 250000"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_receiptdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "i_l_receiptdate",
+ "key_length": "4",
+ "used_key_parts": ["l_receiptDATE"],
+ "r_loops": 1,
+ "rows": 18,
+ "r_rows": 18,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 0.566194832,
+ "r_filtered": 38.88888889,
+ "index_condition": "lineitem.l_receiptDATE between '1996-10-05' and '1996-10-10'",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-10-10'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "i_o_totalprice"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["o_orderkey"],
+ "ref": ["dbt3_s001.lineitem.l_orderkey"],
+ "r_loops": 7,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 5.666666508,
+ "r_filtered": 14.28571429,
+ "attached_condition": "orders.o_totalprice between 200000 and 250000"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT l_shipdate, l_receiptdate, o_totalprice
@@ -1429,35 +1541,41 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "rows": 41,
- "filtered": 3.333333254,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": 3.047460556,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "rows": 41,
+ "filtered": 3.333333254,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": 3.047460556,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1481,45 +1599,51 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "r_loops": 1,
- "rows": 41,
- "r_rows": 41,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 3.333333254,
- "r_filtered": 2.43902439,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 1,
- "rows": 4,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 3.047460556,
- "r_filtered": 66.66666667,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "r_loops": 1,
+ "rows": 41,
+ "r_rows": 41,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 3.333333254,
+ "r_filtered": 2.43902439,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 3.047460556,
+ "r_filtered": 66.66666667,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1552,35 +1676,41 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "rows": 41,
- "filtered": 3.333333254,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": 3.047460556,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "rows": 41,
+ "filtered": 3.333333254,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": 3.047460556,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1604,45 +1734,51 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "r_loops": 1,
- "rows": 41,
- "r_rows": 41,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 3.333333254,
- "r_filtered": 2.43902439,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 1,
- "rows": 4,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 3.047460556,
- "r_filtered": 66.66666667,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY", "i_o_totalprice", "i_o_totaldiscount"],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "r_loops": 1,
+ "rows": 41,
+ "r_rows": 41,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 3.333333254,
+ "r_filtered": 2.43902439,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 3.047460556,
+ "r_filtered": 66.66666667,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1678,40 +1814,46 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_o_orderdate",
- "i_o_totalprice",
- "i_o_totaldiscount"
- ],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "rows": 41,
- "filtered": "REPLACED",
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": "REPLACED",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_o_orderdate",
+ "i_o_totalprice",
+ "i_o_totaldiscount"
+ ],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "rows": 41,
+ "filtered": "REPLACED",
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": "REPLACED",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for ANALYZE SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1735,50 +1877,56 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_o_orderdate",
- "i_o_totalprice",
- "i_o_totaldiscount"
- ],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "r_loops": 1,
- "rows": 41,
- "r_rows": 41,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": "REPLACED",
- "r_filtered": 2.43902439,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 1,
- "rows": 4,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": "REPLACED",
- "r_filtered": 66.66666667,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_o_orderdate",
+ "i_o_totalprice",
+ "i_o_totaldiscount"
+ ],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "r_loops": 1,
+ "rows": 41,
+ "r_rows": 41,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": "REPLACED",
+ "r_filtered": 2.43902439,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": "REPLACED",
+ "r_filtered": 66.66666667,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=on' for SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1811,40 +1959,46 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_o_orderdate",
- "i_o_totalprice",
- "i_o_totaldiscount"
- ],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "rows": 41,
- "filtered": "REPLACED",
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "rows": 4,
- "filtered": "REPLACED",
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_o_orderdate",
+ "i_o_totalprice",
+ "i_o_totaldiscount"
+ ],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "rows": 41,
+ "filtered": "REPLACED",
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "rows": 4,
+ "filtered": "REPLACED",
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for ANALYZE SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -1868,50 +2022,56 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "orders",
- "access_type": "range",
- "possible_keys": [
- "PRIMARY",
- "i_o_orderdate",
- "i_o_totalprice",
- "i_o_totaldiscount"
- ],
- "key": "i_o_totaldiscount",
- "key_length": "9",
- "used_key_parts": ["o_totaldiscount"],
- "r_loops": 1,
- "rows": 41,
- "r_rows": 41,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": "REPLACED",
- "r_filtered": 2.43902439,
- "index_condition": "orders.o_totaldiscount between 18000 and 20000",
- "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
- },
- "table": {
- "table_name": "lineitem",
- "access_type": "ref",
- "possible_keys": [
- "PRIMARY",
- "i_l_shipdate",
- "i_l_orderkey",
- "i_l_orderkey_quantity"
- ],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["l_orderkey"],
- "ref": ["dbt3_s001.orders.o_orderkey"],
- "r_loops": 1,
- "rows": 4,
- "r_rows": 6,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": "REPLACED",
- "r_filtered": 66.66666667,
- "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "orders",
+ "access_type": "range",
+ "possible_keys": [
+ "PRIMARY",
+ "i_o_orderdate",
+ "i_o_totalprice",
+ "i_o_totaldiscount"
+ ],
+ "key": "i_o_totaldiscount",
+ "key_length": "9",
+ "used_key_parts": ["o_totaldiscount"],
+ "r_loops": 1,
+ "rows": 41,
+ "r_rows": 41,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": "REPLACED",
+ "r_filtered": 2.43902439,
+ "index_condition": "orders.o_totaldiscount between 18000 and 20000",
+ "attached_condition": "orders.o_totalprice between 200000 and 220000 and orders.o_orderDATE between '1992-12-01' and '1997-01-01'"
+ }
+ },
+ {
+ "table": {
+ "table_name": "lineitem",
+ "access_type": "ref",
+ "possible_keys": [
+ "PRIMARY",
+ "i_l_shipdate",
+ "i_l_orderkey",
+ "i_l_orderkey_quantity"
+ ],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["l_orderkey"],
+ "ref": ["dbt3_s001.orders.o_orderkey"],
+ "r_loops": 1,
+ "rows": 4,
+ "r_rows": 6,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": "REPLACED",
+ "r_filtered": 66.66666667,
+ "attached_condition": "lineitem.l_shipDATE between '1996-10-01' and '1996-12-01'"
+ }
+ }
+ ]
}
}
set statement optimizer_switch='rowid_filter=off' for SELECT o_totaldiscount, o_totalprice, l_shipdate
@@ -2056,40 +2216,50 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 101,
- "filtered": 100,
- "attached_condition": "t2.a2 is not null"
- },
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["a1", "b1"],
- "key": "a1",
- "key_length": "5",
- "used_key_parts": ["a1"],
- "ref": ["test.t2.a2"],
- "rows": 36,
- "filtered": 28.75,
- "attached_condition": "t1.b1 <= (subquery#2) and t1.pk1 + 1 = t2.pk2 + 2"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 101,
+ "filtered": 100,
+ "attached_condition": "t2.a2 is not null"
+ }
+ },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["a1", "b1"],
+ "key": "a1",
+ "key_length": "5",
+ "used_key_parts": ["a1"],
+ "ref": ["test.t2.a2"],
+ "rows": 36,
+ "filtered": 28.75,
+ "attached_condition": "t1.b1 <= (subquery#2) and t1.pk1 + 1 = t2.pk2 + 2"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "range",
- "possible_keys": ["PRIMARY"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk2"],
- "rows": 1,
- "filtered": 100,
- "index_condition": "t2.pk2 <= 1"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "range",
+ "possible_keys": ["PRIMARY"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk2"],
+ "rows": 1,
+ "filtered": 100,
+ "index_condition": "t2.pk2 <= 1"
+ }
+ }
+ ]
}
}
]
@@ -2265,23 +2435,27 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "35",
- "used_key_parts": ["nm"],
- "r_loops": 1,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 49.20000076,
- "r_filtered": 100,
- "index_condition": "t1.nm like '500%'",
- "attached_condition": "t1.fl2 = 0"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "35",
+ "used_key_parts": ["nm"],
+ "r_loops": 1,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 49.20000076,
+ "r_filtered": 100,
+ "index_condition": "t1.nm like '500%'",
+ "attached_condition": "t1.fl2 = 0"
+ }
+ }
+ ]
}
}
select * from t1 where nm like '500%' AND fl2 = 0;
@@ -2311,23 +2485,27 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "range",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx1",
- "key_length": "35",
- "used_key_parts": ["nm"],
- "r_loops": 1,
- "rows": 1,
- "r_rows": 1,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 49.20000076,
- "r_filtered": 100,
- "index_condition": "t1.nm like '500%'",
- "attached_condition": "t1.fl2 = 0"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "range",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx1",
+ "key_length": "35",
+ "used_key_parts": ["nm"],
+ "r_loops": 1,
+ "rows": 1,
+ "r_rows": 1,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 49.20000076,
+ "r_filtered": 100,
+ "index_condition": "t1.nm like '500%'",
+ "attached_condition": "t1.fl2 = 0"
+ }
+ }
+ ]
}
}
select * from t1 where nm like '500%' AND fl2 = 0;
@@ -2382,36 +2560,40 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx2",
- "key_length": "2",
- "used_key_parts": ["fl2"],
- "ref": ["const"],
- "rowid_filter": {
- "range": {
- "key": "idx1",
- "used_key_parts": ["nm"]
- },
- "rows": 115,
- "selectivity_pct": 1.15,
- "r_rows": 111,
- "r_lookups": 100,
- "r_selectivity_pct": 2,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 55,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 1.149999976,
- "r_filtered": 100,
- "attached_condition": "t1.nm like '75%'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx2",
+ "key_length": "2",
+ "used_key_parts": ["fl2"],
+ "ref": ["const"],
+ "rowid_filter": {
+ "range": {
+ "key": "idx1",
+ "used_key_parts": ["nm"]
+ },
+ "rows": 115,
+ "selectivity_pct": 1.15,
+ "r_rows": 111,
+ "r_lookups": 100,
+ "r_selectivity_pct": 2,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 55,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 1.149999976,
+ "r_filtered": 100,
+ "attached_condition": "t1.nm like '75%'"
+ }
+ }
+ ]
}
}
select * from t1 where nm like '75%' AND fl2 = 0;
@@ -2489,36 +2671,40 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx2",
- "key_length": "5",
- "used_key_parts": ["fl2"],
- "ref": ["const"],
- "rowid_filter": {
- "range": {
- "key": "idx1",
- "used_key_parts": ["nm"]
- },
- "rows": 44,
- "selectivity_pct": 0.44,
- "r_rows": 44,
- "r_lookups": 1000,
- "r_selectivity_pct": 0,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 863,
- "r_rows": 0,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 0.439999998,
- "r_filtered": 100,
- "attached_condition": "t1.nm like '3400%' or t1.nm like '3402%' or t1.nm like '3403%' or t1.nm like '3404%' or t1.nm like '3405%' or t1.nm like '3406%' or t1.nm like '3407%' or t1.nm like '3409%' or t1.nm like '3411%' or t1.nm like '3412%' or t1.nm like '3413%' or t1.nm like '3414%' or t1.nm like '3415%' or t1.nm like '3416%' or t1.nm like '3417%' or t1.nm like '3418%' or t1.nm like '3419%' or t1.nm like '3421%' or t1.nm like '3422%' or t1.nm like '3423%' or t1.nm like '3424%' or t1.nm like '3425%' or t1.nm like '3426%' or t1.nm like '3427%' or t1.nm like '3428%' or t1.nm like '3429%' or t1.nm like '3430%' or t1.nm like '3431%' or t1.nm like '3432%' or t1.nm like '3433%' or t1.nm like '3434%' or t1.nm like '3435%' or t1.nm like '3436%' or t1.nm like '3437%' or t1.nm like '3439%' or t1.nm like '3440%' or t1.nm like '3441%' or t1.nm like '3442%' or t1.nm like '3443%' or t1.nm like '3444%' or t1.nm like '3445%' or t1.nm like '3446%' or t1.nm like '3447%' or t1.nm like '3448%'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx2",
+ "key_length": "5",
+ "used_key_parts": ["fl2"],
+ "ref": ["const"],
+ "rowid_filter": {
+ "range": {
+ "key": "idx1",
+ "used_key_parts": ["nm"]
+ },
+ "rows": 44,
+ "selectivity_pct": 0.44,
+ "r_rows": 44,
+ "r_lookups": 1000,
+ "r_selectivity_pct": 0,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 863,
+ "r_rows": 0,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 0.439999998,
+ "r_filtered": 100,
+ "attached_condition": "t1.nm like '3400%' or t1.nm like '3402%' or t1.nm like '3403%' or t1.nm like '3404%' or t1.nm like '3405%' or t1.nm like '3406%' or t1.nm like '3407%' or t1.nm like '3409%' or t1.nm like '3411%' or t1.nm like '3412%' or t1.nm like '3413%' or t1.nm like '3414%' or t1.nm like '3415%' or t1.nm like '3416%' or t1.nm like '3417%' or t1.nm like '3418%' or t1.nm like '3419%' or t1.nm like '3421%' or t1.nm like '3422%' or t1.nm like '3423%' or t1.nm like '3424%' or t1.nm like '3425%' or t1.nm like '3426%' or t1.nm like '3427%' or t1.nm like '3428%' or t1.nm like '3429%' or t1.nm like '3430%' or t1.nm like '3431%' or t1.nm like '3432%' or t1.nm like '3433%' or t1.nm like '3434%' or t1.nm like '3435%' or t1.nm like '3436%' or t1.nm like '3437%' or t1.nm like '3439%' or t1.nm like '3440%' or t1.nm like '3441%' or t1.nm like '3442%' or t1.nm like '3443%' or t1.nm like '3444%' or t1.nm like '3445%' or t1.nm like '3446%' or t1.nm like '3447%' or t1.nm like '3448%'"
+ }
+ }
+ ]
}
}
create table t0 select * from t1 where nm like '34%';
@@ -2548,34 +2734,38 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["idx1", "idx2"],
- "key": "idx2",
- "key_length": "5",
- "used_key_parts": ["fl2"],
- "ref": ["const"],
- "rowid_filter": {
- "range": {
- "key": "idx1",
- "used_key_parts": ["nm"]
- },
- "rows": 44,
- "selectivity_pct": 0.44,
- "r_rows": 0,
- "r_lookups": 0,
- "r_selectivity_pct": 0,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 853,
- "r_rows": 0,
- "filtered": 0.439999998,
- "r_filtered": 100,
- "attached_condition": "t1.nm like '3400%' or t1.nm like '3402%' or t1.nm like '3403%' or t1.nm like '3404%' or t1.nm like '3405%' or t1.nm like '3406%' or t1.nm like '3407%' or t1.nm like '3409%' or t1.nm like '3411%' or t1.nm like '3412%' or t1.nm like '3413%' or t1.nm like '3414%' or t1.nm like '3415%' or t1.nm like '3416%' or t1.nm like '3417%' or t1.nm like '3418%' or t1.nm like '3419%' or t1.nm like '3421%' or t1.nm like '3422%' or t1.nm like '3423%' or t1.nm like '3424%' or t1.nm like '3425%' or t1.nm like '3426%' or t1.nm like '3427%' or t1.nm like '3428%' or t1.nm like '3429%' or t1.nm like '3430%' or t1.nm like '3431%' or t1.nm like '3432%' or t1.nm like '3433%' or t1.nm like '3434%' or t1.nm like '3435%' or t1.nm like '3436%' or t1.nm like '3437%' or t1.nm like '3439%' or t1.nm like '3440%' or t1.nm like '3441%' or t1.nm like '3442%' or t1.nm like '3443%' or t1.nm like '3444%' or t1.nm like '3445%' or t1.nm like '3446%' or t1.nm like '3447%' or t1.nm like '3448%'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["idx1", "idx2"],
+ "key": "idx2",
+ "key_length": "5",
+ "used_key_parts": ["fl2"],
+ "ref": ["const"],
+ "rowid_filter": {
+ "range": {
+ "key": "idx1",
+ "used_key_parts": ["nm"]
+ },
+ "rows": 44,
+ "selectivity_pct": 0.44,
+ "r_rows": 0,
+ "r_lookups": 0,
+ "r_selectivity_pct": 0,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 853,
+ "r_rows": 0,
+ "filtered": 0.439999998,
+ "r_filtered": 100,
+ "attached_condition": "t1.nm like '3400%' or t1.nm like '3402%' or t1.nm like '3403%' or t1.nm like '3404%' or t1.nm like '3405%' or t1.nm like '3406%' or t1.nm like '3407%' or t1.nm like '3409%' or t1.nm like '3411%' or t1.nm like '3412%' or t1.nm like '3413%' or t1.nm like '3414%' or t1.nm like '3415%' or t1.nm like '3416%' or t1.nm like '3417%' or t1.nm like '3418%' or t1.nm like '3419%' or t1.nm like '3421%' or t1.nm like '3422%' or t1.nm like '3423%' or t1.nm like '3424%' or t1.nm like '3425%' or t1.nm like '3426%' or t1.nm like '3427%' or t1.nm like '3428%' or t1.nm like '3429%' or t1.nm like '3430%' or t1.nm like '3431%' or t1.nm like '3432%' or t1.nm like '3433%' or t1.nm like '3434%' or t1.nm like '3435%' or t1.nm like '3436%' or t1.nm like '3437%' or t1.nm like '3439%' or t1.nm like '3440%' or t1.nm like '3441%' or t1.nm like '3442%' or t1.nm like '3443%' or t1.nm like '3444%' or t1.nm like '3445%' or t1.nm like '3446%' or t1.nm like '3447%' or t1.nm like '3448%'"
+ }
+ }
+ ]
}
}
drop table t0;
@@ -2641,54 +2831,62 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["f1", "f2"],
- "key": "f1",
- "key_length": "13",
- "used_key_parts": ["f1"],
- "ref": ["const"],
- "rowid_filter": {
- "range": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["f1", "f2"],
"key": "f1",
- "used_key_parts": ["f1"]
- },
- "rows": 1,
- "selectivity_pct": 1.587301587
- },
- "rows": 1,
- "filtered": 1.587301612,
- "index_condition": "t1.f1 is null",
- "attached_condition": "t1.f2 is null and (t1.f2 between 'a' and 'z' or t1.f1 = 'a')"
- }
+ "key_length": "13",
+ "used_key_parts": ["f1"],
+ "ref": ["const"],
+ "rowid_filter": {
+ "range": {
+ "key": "f1",
+ "used_key_parts": ["f1"]
+ },
+ "rows": 1,
+ "selectivity_pct": 1.587301587
+ },
+ "rows": 1,
+ "filtered": 1.587301612,
+ "index_condition": "t1.f1 is null",
+ "attached_condition": "t1.f2 is null and (t1.f2 between 'a' and 'z' or t1.f1 = 'a')"
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 2,
"operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ref",
- "possible_keys": ["f1", "f2"],
- "key": "f1",
- "key_length": "13",
- "used_key_parts": ["f1"],
- "ref": ["const"],
- "rowid_filter": {
- "range": {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ref",
+ "possible_keys": ["f1", "f2"],
"key": "f1",
- "used_key_parts": ["f1"]
- },
- "rows": 1,
- "selectivity_pct": 1.587301587
- },
- "rows": 1,
- "filtered": 1.587301612,
- "index_condition": "t1.f1 is null",
- "attached_condition": "t1.f2 is null and (t1.f2 between 'a' and 'z' or t1.f1 = 'a')"
- }
+ "key_length": "13",
+ "used_key_parts": ["f1"],
+ "ref": ["const"],
+ "rowid_filter": {
+ "range": {
+ "key": "f1",
+ "used_key_parts": ["f1"]
+ },
+ "rows": 1,
+ "selectivity_pct": 1.587301587
+ },
+ "rows": 1,
+ "filtered": 1.587301612,
+ "index_condition": "t1.f1 is null",
+ "attached_condition": "t1.f2 is null and (t1.f2 between 'a' and 'z' or t1.f1 = 'a')"
+ }
+ }
+ ]
}
}
]
@@ -3636,81 +3834,93 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t",
- "access_type": "index_merge",
- "possible_keys": ["PRIMARY", "acli_rid", "acli_tp"],
- "key_length": "2,767",
- "index_merge": {
- "intersect": {
- "range": {
- "key": "acli_tp",
- "used_key_parts": ["tp"]
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t",
+ "access_type": "index_merge",
+ "possible_keys": ["PRIMARY", "acli_rid", "acli_tp"],
+ "key_length": "2,767",
+ "index_merge": {
+ "intersect": [
+ {
+ "range": {
+ "key": "acli_tp",
+ "used_key_parts": ["tp"]
+ }
+ },
+ {
+ "range": {
+ "key": "acli_rid",
+ "used_key_parts": ["rid"]
+ }
+ }
+ ]
},
- "range": {
- "key": "acli_rid",
- "used_key_parts": ["rid"]
- }
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "attached_condition": "t.tp = 121 and t.rid = 'B5FCC8C7111E4E3CBC21AAF5012F59C2'",
+ "using_index": true
}
},
- "r_loops": 1,
- "rows": 2,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "attached_condition": "t.tp = 121 and t.rid = 'B5FCC8C7111E4E3CBC21AAF5012F59C2'",
- "using_index": true
- },
- "block-nl-join": {
- "table": {
- "table_name": "a",
- "access_type": "ref",
- "possible_keys": ["PRIMARY", "acei_aclid"],
- "key": "acei_aclid",
- "key_length": "8",
- "used_key_parts": ["aclid"],
- "ref": ["test.t.id"],
- "r_loops": 1,
- "rows": 1,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "buffer_type": "flat",
- "buffer_size": "8Kb",
- "join_type": "BKA",
- "mrr_type": "Rowid-ordered scan",
- "attached_condition": "a.atp = 1",
- "r_filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "fi",
- "access_type": "ref",
- "possible_keys": ["filt_aceid", "filt_fh"],
- "key": "filt_aceid",
- "key_length": "8",
- "used_key_parts": ["aceid"],
- "ref": ["test.a.id"],
- "r_loops": 1,
- "rows": 24,
- "r_rows": 80,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 14.46428585,
- "r_filtered": 100
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "a",
+ "access_type": "ref",
+ "possible_keys": ["PRIMARY", "acei_aclid"],
+ "key": "acei_aclid",
+ "key_length": "8",
+ "used_key_parts": ["aclid"],
+ "ref": ["test.t.id"],
+ "r_loops": 1,
+ "rows": 1,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "8Kb",
+ "join_type": "BKA",
+ "mrr_type": "Rowid-ordered scan",
+ "attached_condition": "a.atp = 1",
+ "r_filtered": 100
+ }
},
- "buffer_type": "incremental",
- "buffer_size": "4Kb",
- "join_type": "BKA",
- "mrr_type": "Rowid-ordered scan",
- "attached_condition": "fi.fh in (6311439873746261694,-397087483897438286,8518228073041491534,-5420422472375069774)",
- "r_filtered": 40
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "fi",
+ "access_type": "ref",
+ "possible_keys": ["filt_aceid", "filt_fh"],
+ "key": "filt_aceid",
+ "key_length": "8",
+ "used_key_parts": ["aceid"],
+ "ref": ["test.a.id"],
+ "r_loops": 1,
+ "rows": 24,
+ "r_rows": 80,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 14.46428585,
+ "r_filtered": 100
+ },
+ "buffer_type": "incremental",
+ "buffer_size": "4Kb",
+ "join_type": "BKA",
+ "mrr_type": "Rowid-ordered scan",
+ "attached_condition": "fi.fh in (6311439873746261694,-397087483897438286,8518228073041491534,-5420422472375069774)",
+ "r_filtered": 40
+ }
+ }
+ ]
}
}
set optimizer_switch=@save_optimizer_switch;
diff --git a/mysql-test/main/selectivity.result b/mysql-test/main/selectivity.result
index 1143a4deb46..cc82c2b0f25 100644
--- a/mysql-test/main/selectivity.result
+++ b/mysql-test/main/selectivity.result
@@ -1245,8 +1245,8 @@ EXPLAIN EXTENDED
SELECT * FROM language, country, continent
WHERE country_group = lang_group AND lang_group IS NULL;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE country ALL NULL NULL NULL NULL 2 0.00 Using where
-1 SIMPLE language ALL NULL NULL NULL NULL 6 0.00 Using where; Using join buffer (flat, BNL join)
+1 SIMPLE country ALL NULL NULL NULL NULL 2 50.00 Using where
+1 SIMPLE language ALL NULL NULL NULL NULL 6 16.67 Using where; Using join buffer (flat, BNL join)
1 SIMPLE continent ALL NULL NULL NULL NULL 6 100.00 Using join buffer (incremental, BNL join)
Warnings:
Note 1003 select `test`.`language`.`lang_group` AS `lang_group`,`test`.`language`.`lang` AS `lang`,`test`.`country`.`code` AS `code`,`test`.`country`.`country_group` AS `country_group`,`test`.`continent`.`cont_group` AS `cont_group`,`test`.`continent`.`cont` AS `cont` from `test`.`language` join `test`.`country` join `test`.`continent` where `test`.`language`.`lang_group` = `test`.`country`.`country_group` and `test`.`country`.`country_group` is null
@@ -1372,14 +1372,14 @@ test.t2 analyze status Table is already up to date
explain extended
select * from t1 straight_join t2 where t1.a=t2.a and t1.a<10;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1.96 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1.00 Using where
1 SIMPLE t2 ref a a 5 test.t1.a 10 100.00
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t1` straight_join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`a` and `test`.`t1`.`a` < 10
explain extended
select * from t1 straight_join t2 where t1.a=t2.a and t2.a<10;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1.96 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1.00 Using where
1 SIMPLE t2 ref a a 5 test.t1.a 10 100.00
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t1` straight_join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`a` and `test`.`t1`.`a` < 10
@@ -1649,12 +1649,12 @@ test.t1 analyze status Table is already up to date
# Check what info the optimizer has about selectivities
explain extended select * from t1 use index () where a in (17,51,5);
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 3.90 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 2.90 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` USE INDEX () where `test`.`t1`.`a` in (17,51,5)
explain extended select * from t1 use index () where b=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 2.34 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 2.40 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` USE INDEX () where `test`.`t1`.`b` = 2
# Now, the equality is used for ref access, while the range condition
@@ -1901,7 +1901,7 @@ test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
EXPLAIN EXTENDED SELECT * from t1 where t1.a >= 81;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 3 66.41 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 3 66.67 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` >= 81
SELECT HEX(a), b from t1 where t1.a >= 81;
@@ -1925,7 +1925,7 @@ test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 5 39.84 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 5 40.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2
SET optimizer_use_condition_selectivity=3;
diff --git a/mysql-test/main/selectivity_innodb.result b/mysql-test/main/selectivity_innodb.result
index e909e85a2c8..2ef0d2f5630 100644
--- a/mysql-test/main/selectivity_innodb.result
+++ b/mysql-test/main/selectivity_innodb.result
@@ -1257,8 +1257,8 @@ EXPLAIN EXTENDED
SELECT * FROM language, country, continent
WHERE country_group = lang_group AND lang_group IS NULL;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE country ALL NULL NULL NULL NULL 2 0.00 Using where
-1 SIMPLE language ALL NULL NULL NULL NULL 6 0.00 Using where; Using join buffer (flat, BNL join)
+1 SIMPLE country ALL NULL NULL NULL NULL 2 50.00 Using where
+1 SIMPLE language ALL NULL NULL NULL NULL 6 16.67 Using where; Using join buffer (flat, BNL join)
1 SIMPLE continent ALL NULL NULL NULL NULL 6 100.00 Using join buffer (incremental, BNL join)
Warnings:
Note 1003 select `test`.`language`.`lang_group` AS `lang_group`,`test`.`language`.`lang` AS `lang`,`test`.`country`.`code` AS `code`,`test`.`country`.`country_group` AS `country_group`,`test`.`continent`.`cont_group` AS `cont_group`,`test`.`continent`.`cont` AS `cont` from `test`.`language` join `test`.`country` join `test`.`continent` where `test`.`language`.`lang_group` = `test`.`country`.`country_group` and `test`.`country`.`country_group` is null
@@ -1384,14 +1384,14 @@ test.t2 analyze status OK
explain extended
select * from t1 straight_join t2 where t1.a=t2.a and t1.a<10;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1.96 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1.00 Using where
1 SIMPLE t2 ref a a 5 test.t1.a 10 100.00
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t1` straight_join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`a` and `test`.`t1`.`a` < 10
explain extended
select * from t1 straight_join t2 where t1.a=t2.a and t2.a<10;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1.96 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1.00 Using where
1 SIMPLE t2 ref a a 5 test.t1.a 10 100.00
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t1` straight_join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`a` and `test`.`t1`.`a` < 10
@@ -1661,12 +1661,12 @@ test.t1 analyze status OK
# Check what info the optimizer has about selectivities
explain extended select * from t1 use index () where a in (17,51,5);
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 3.90 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 2.90 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` USE INDEX () where `test`.`t1`.`a` in (17,51,5)
explain extended select * from t1 use index () where b=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 2.34 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 2.40 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` USE INDEX () where `test`.`t1`.`b` = 2
# Now, the equality is used for ref access, while the range condition
@@ -1913,7 +1913,7 @@ test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
EXPLAIN EXTENDED SELECT * from t1 where t1.a >= 81;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 3 66.41 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 3 66.67 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` >= 81
SELECT HEX(a), b from t1 where t1.a >= 81;
@@ -1937,7 +1937,7 @@ test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 5 39.84 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 5 40.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2
SET optimizer_use_condition_selectivity=3;
diff --git a/mysql-test/main/set_operation.result b/mysql-test/main/set_operation.result
index dd3912629bb..fa0fe21d156 100644
--- a/mysql-test/main/set_operation.result
+++ b/mysql-test/main/set_operation.result
@@ -571,192 +571,244 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 8,
"operation": "UNION",
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "table_name": "<intersect2,3,4>",
- "access_type": "ALL",
- "query_specifications": [
- {
- "query_block": {
- "select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 6,
- "filtered": 100
- }
- }
- },
- {
- "query_block": {
- "select_id": 3,
- "operation": "INTERSECT",
- "table": {
- "message": "No tables used"
- }
- }
- },
- {
- "query_block": {
- "select_id": 4,
- "operation": "INTERSECT",
- "table": {
- "table_name": "<derived5>",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "union_result": {
- "query_specifications": [
- {
- "query_block": {
- "select_id": 5,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- }
- }
- },
- {
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "union_result": {
+ "table_name": "<intersect2,3,4>",
+ "access_type": "ALL",
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 2,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 6,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 3,
+ "operation": "INTERSECT",
+ "table": {
+ "message": "No tables used"
+ }
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 4,
+ "operation": "INTERSECT",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "<derived5>",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100,
+ "materialized": {
"query_block": {
- "select_id": 6,
- "operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
+ "union_result": {
+ "query_specifications": [
+ {
+ "query_block": {
+ "select_id": 5,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "query_block": {
+ "select_id": 6,
+ "operation": "UNION",
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
+ }
+ }
+ ]
}
}
}
- ]
+ }
}
- }
+ ]
}
}
- }
+ ]
}
- ]
+ }
}
}
}
- }
+ ]
}
},
{
"query_block": {
"select_id": 7,
"operation": "EXCEPT",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 9,
"operation": "UNION",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 6,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 6,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 10,
"operation": "UNION",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 11,
"operation": "EXCEPT",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 6,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 6,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL"
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 12,
"operation": "UNION",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100,
- "attached_condition": "t1.a < 4"
- },
- "block-nl-join": {
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 6,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100,
+ "attached_condition": "t1.a < 4"
+ }
},
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL"
- }
+ {
+ "block-nl-join": {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 6,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL"
+ }
+ }
+ ]
}
},
{
"query_block": {
"select_id": 13,
"operation": "UNION",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ }
+ }
+ ]
}
}
]
diff --git a/mysql-test/main/set_statement.result b/mysql-test/main/set_statement.result
index c5ad11c74c0..7e8266d2ab3 100644
--- a/mysql-test/main/set_statement.result
+++ b/mysql-test/main/set_statement.result
@@ -132,6 +132,8 @@ sort_buffer_size 100000
'#------------------ STATEMENT Test 6 -----------------------#'
'# Initialize variables to known setting'
SET SESSION keep_files_on_create=ON;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Pre-STATEMENT variable value'
SHOW SESSION VARIABLES LIKE 'keep_files_on_create';
@@ -142,6 +144,9 @@ SET STATEMENT keep_files_on_create=OFF FOR SELECT *,@@keep_files_on_create FROM
v1 v2 @@keep_files_on_create
1 2 0
3 4 0
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT variable value'
SHOW SESSION VARIABLES LIKE 'keep_files_on_create';
@@ -174,6 +179,8 @@ myisam_repair_threads=1,
sort_buffer_size = 200000,
max_join_size=2222220000000,
keep_files_on_create=ON;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# LONG '
SHOW SESSION VARIABLES LIKE 'sort_buffer_size';
@@ -195,6 +202,9 @@ SET STATEMENT keep_files_on_create=OFF
FOR SHOW SESSION VARIABLES LIKE 'keep_files_on_create';
Variable_name Value
keep_files_on_create OFF
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SHOW SESSION VARIABLES LIKE 'keep_files_on_create';
Variable_name Value
keep_files_on_create ON
@@ -231,6 +241,8 @@ sort_buffer_size=100000,
binlog_format=mixed,
keep_files_on_create=ON,
max_join_size=2222220000000;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
''
'# Pre-STATEMENT variable value
@@ -263,6 +275,9 @@ max_join_size=4444440000000 FOR
SELECT myProc(123.45);
myProc(123.45)
200006.17
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SET STATEMENT myisam_sort_buffer_size=400000,
myisam_repair_threads=2,
sort_buffer_size=300000,
@@ -272,6 +287,9 @@ max_join_size=4444440000000 FOR
SELECT myProc(123.45);
myProc(123.45)
300006.17
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT No 1 variable value Pre-STATEMENT for No 2'
SELECT @@myisam_sort_buffer_size,
@@ -290,6 +308,9 @@ binlog_format=row,
keep_files_on_create=OFF,
max_join_size=4444440000000 FOR
DROP FUNCTION myProc;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT No 2 variable value
SELECT @@myisam_sort_buffer_size,
@@ -309,6 +330,8 @@ sort_buffer_size=100000,
binlog_format=mixed,
keep_files_on_create=ON,
max_join_size=2222220000000;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
''
'# Pre-STATEMENT variable value
@@ -329,6 +352,9 @@ keep_files_on_create=OFF,
max_join_size=4444440000000 FOR
PREPARE stmt1 FROM
'SET STATEMENT binlog_format=row FOR SELECT *,@@binlog_format,@@sort_buffer_size FROM t1';
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'Test No 1 Post Value & Test 2 Pre values'
SELECT @@myisam_sort_buffer_size,
@@ -350,6 +376,9 @@ EXECUTE stmt1;
v1 v2 @@binlog_format @@sort_buffer_size
1 2 ROW 200000
3 4 ROW 200000
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT No 2
SELECT @@myisam_sort_buffer_size,
@@ -370,6 +399,8 @@ sort_buffer_size=100000,
binlog_format=mixed,
keep_files_on_create=ON,
max_join_size=2222220000000;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
''
'# Pre-STATEMENT variable value
@@ -397,6 +428,9 @@ SELECT @@myisam_sort_buffer_size,
@@keep_files_on_create,
@@max_join_size;
END|
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'Test No 1 Post Value & Test 2 Pre values'
SELECT @@myisam_sort_buffer_size,
@@ -418,6 +452,9 @@ max_join_size=4444440000001 FOR
CALL p1();
@@myisam_sort_buffer_size @@myisam_repair_threads @@sort_buffer_size @@binlog_format @@keep_files_on_create @@max_join_size
400001 3 200001 ROW 0 4444440000001
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT No 2
SELECT @@myisam_sort_buffer_size,
@@ -438,6 +475,8 @@ sort_buffer_size=100000,
binlog_format=mixed,
keep_files_on_create=ON,
max_join_size=2222220000000;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
''
CREATE PROCEDURE p2() BEGIN
@@ -470,6 +509,11 @@ max_join_size=4444440000000 FOR
CALL p2();
@@myisam_sort_buffer_size @@myisam_repair_threads @@sort_buffer_size @@binlog_format @@keep_files_on_create @@max_join_size
400000 3 300000 MIXED 0 3333330000000
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT
SELECT @@myisam_sort_buffer_size,
@@ -490,6 +534,8 @@ sort_buffer_size=100000,
binlog_format=mixed,
keep_files_on_create=ON,
max_join_size=2222220000000;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
''
CREATE PROCEDURE p3() BEGIN
@@ -530,6 +576,13 @@ CALL p3();
400000 2 200000 ROW 0 4444440000000
@@myisam_sort_buffer_size @@myisam_repair_threads @@sort_buffer_size @@binlog_format @@keep_files_on_create @@max_join_size
400000 3 300000 MIXED 0 3333330000000
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT
SELECT @@myisam_sort_buffer_size,
@@ -552,6 +605,8 @@ sort_buffer_size=100000,
binlog_format=mixed,
keep_files_on_create=ON,
max_join_size=2222220000000;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
''
CREATE PROCEDURE p4() BEGIN
@@ -625,6 +680,11 @@ CALL p4();
320000 2 220022 ROW 1 2222220000000
@@myisam_sort_buffer_size @@myisam_repair_threads @@sort_buffer_size @@binlog_format @@keep_files_on_create @@max_join_size
320000 2 220022 ROW 1 2222220000000
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT
SELECT @@myisam_sort_buffer_size,
@@ -768,6 +828,8 @@ sort_buffer_size=100000,
binlog_format=mixed,
keep_files_on_create=ON,
max_join_size=2222220000000;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Pre-STATEMENT variable value
SELECT @@myisam_sort_buffer_size,
@@ -793,6 +855,10 @@ sort_buffer_size=230013,
binlog_format=row,
keep_files_on_create=ON,
max_join_size=2323230000000;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT
SELECT @@myisam_sort_buffer_size,
@@ -813,6 +879,8 @@ sort_buffer_size=100000,
binlog_format=mixed,
keep_files_on_create=ON,
max_join_size=2222220000000;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Pre-STATEMENT variable value
SELECT @@myisam_sort_buffer_size,
@@ -859,6 +927,10 @@ CALL p5();
400000 2 200000 ROW 0 4444440000000
@@myisam_sort_buffer_size @@myisam_repair_threads @@sort_buffer_size @@binlog_format @@keep_files_on_create @@max_join_size
260000 3 230013 ROW 1 2323230000000
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
''
'# Post-STATEMENT
SELECT @@myisam_sort_buffer_size,
@@ -970,6 +1042,8 @@ SELECT @@binlog_format;
ROW
SET @@binlog_format = @save_binlog_format;
SET @@keep_files_on_create = @save_keep_files_on_create;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SET @@max_join_size = @save_max_join_size;
SET @@myisam_repair_threads = @save_myisam_repair_threads;
SET @@myisam_sort_buffer_size = @save_myisam_sort_buffer_size;
diff --git a/mysql-test/main/shutdown_not_windows.combinations b/mysql-test/main/shutdown_debug.combinations
index 684d4cfd61d..684d4cfd61d 100644
--- a/mysql-test/main/shutdown_not_windows.combinations
+++ b/mysql-test/main/shutdown_debug.combinations
diff --git a/mysql-test/main/shutdown_not_windows.result b/mysql-test/main/shutdown_debug.result
index 524cdf20fa2..524cdf20fa2 100644
--- a/mysql-test/main/shutdown_not_windows.result
+++ b/mysql-test/main/shutdown_debug.result
diff --git a/mysql-test/main/shutdown_not_windows.test b/mysql-test/main/shutdown_debug.test
index 43063ced494..587b88dc55e 100644
--- a/mysql-test/main/shutdown_not_windows.test
+++ b/mysql-test/main/shutdown_debug.test
@@ -1,4 +1,3 @@
-source include/not_windows.inc;
source include/not_embedded.inc;
source include/have_debug.inc;
-- source include/no_view_protocol.inc
@@ -10,7 +9,7 @@ call mtr.add_suppression('Thread .* did not exit');
set @old_dbug=@@global.debug_dbug;
set global debug_dbug='+d,CONNECT_wait';
select variable_value into @cons from information_schema.global_status where variable_name='connections';
-exec $MYSQL -e 'select sleep(3600)' >/dev/null 2>&1 &;
+exec $MYSQL -e "select sleep(3600)" >/dev/null 2>&1 &;
let $wait_condition= select variable_value>@cons from information_schema.global_status where variable_name='connections';
source include/wait_condition.inc;
source include/restart_mysqld.inc;
diff --git a/mysql-test/main/signal_code.result b/mysql-test/main/signal_code.result
index 32192251fe9..2ea3a7e56b2 100644
--- a/mysql-test/main/signal_code.result
+++ b/mysql-test/main/signal_code.result
@@ -20,16 +20,16 @@ return 0;
end $$
show procedure code signal_proc;
Pos Instruction
-0 stmt 130 "SIGNAL foo"
-1 stmt 130 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
-2 stmt 131 "RESIGNAL foo"
-3 stmt 131 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
+0 stmt 129 "SIGNAL foo"
+1 stmt 129 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
+2 stmt 130 "RESIGNAL foo"
+3 stmt 130 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
drop procedure signal_proc;
show function code signal_func;
Pos Instruction
-0 stmt 130 "SIGNAL foo"
-1 stmt 130 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
-2 stmt 131 "RESIGNAL foo"
-3 stmt 131 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
+0 stmt 129 "SIGNAL foo"
+1 stmt 129 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
+2 stmt 130 "RESIGNAL foo"
+3 stmt 130 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
4 freturn int 0
drop function signal_func;
diff --git a/mysql-test/main/signal_sqlmode.result b/mysql-test/main/signal_sqlmode.result
index db7ac68041c..cb9bd4a8bba 100644
--- a/mysql-test/main/signal_sqlmode.result
+++ b/mysql-test/main/signal_sqlmode.result
@@ -32,7 +32,7 @@ call p;
length(utf8_var) utf8_var
128 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Warnings:
-Warning 1265 Data truncated for column 'utf8_var' at row 1
+Warning 1265 Data truncated for column 'utf8_var' at row 0
call p2;
length(msg) msg
129 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX
@@ -71,7 +71,7 @@ table_name = name;
end
$$
call p;
-ERROR 22001: Data too long for column 'utf8_var' at row 1
+ERROR 22001: Data too long for column 'utf8_var' at row 0
call p2;
length(msg) msg
513 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX
diff --git a/mysql-test/main/sp-anchor-row-type-table.result b/mysql-test/main/sp-anchor-row-type-table.result
index c28d26304db..00fda5f12ad 100644
--- a/mysql-test/main/sp-anchor-row-type-table.result
+++ b/mysql-test/main/sp-anchor-row-type-table.result
@@ -707,7 +707,7 @@ Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) DEFAULT NULL,
`b` text DEFAULT NULL,
- `c` char(1) DEFAULT NULL
+ `c` varchar(1) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
DROP PROCEDURE p2;
DROP PROCEDURE p1;
diff --git a/mysql-test/main/sp-anchor-type.result b/mysql-test/main/sp-anchor-type.result
index 73699d7ed03..94e5182acb2 100644
--- a/mysql-test/main/sp-anchor-type.result
+++ b/mysql-test/main/sp-anchor-type.result
@@ -62,7 +62,7 @@ CALL p1();
a b
127 200
Warnings:
-Warning 1264 Out of range value for column 'a' at row 1
+Warning 1264 Out of range value for column 'a' at row 0
DROP PROCEDURE p1;
DROP TABLE t1;
SET sql_mode=DEFAULT;
@@ -469,8 +469,8 @@ t2 CREATE TABLE `t2` (
`t2` text DEFAULT NULL,
`t3` mediumtext DEFAULT NULL,
`t4` longtext DEFAULT NULL,
- `enum1` char(1) DEFAULT NULL,
- `set1` char(5) DEFAULT NULL,
+ `enum1` varchar(1) DEFAULT NULL,
+ `set1` varchar(5) DEFAULT NULL,
`blob1` tinyblob DEFAULT NULL,
`blob2` blob DEFAULT NULL,
`blob3` mediumblob DEFAULT NULL,
@@ -631,8 +631,8 @@ t2 CREATE TABLE `t2` (
`t2` text DEFAULT NULL,
`t3` mediumtext DEFAULT NULL,
`t4` longtext DEFAULT NULL,
- `enum1` char(1) DEFAULT NULL,
- `set1` char(5) DEFAULT NULL,
+ `enum1` varchar(1) DEFAULT NULL,
+ `set1` varchar(5) DEFAULT NULL,
`blob1` tinyblob DEFAULT NULL,
`blob2` blob DEFAULT NULL,
`blob3` mediumblob DEFAULT NULL,
@@ -1044,7 +1044,7 @@ t1 CREATE TABLE `t1` (
`a_flt0` float DEFAULT NULL,
`a_dbl0` double DEFAULT NULL,
`a_bit3` bit(3) DEFAULT NULL,
- `a_enum0` char(1) DEFAULT NULL,
+ `a_enum0` varchar(1) DEFAULT NULL,
`a_varchar10` varchar(10) DEFAULT NULL,
`a_text1` text DEFAULT NULL,
`a_tinytext1` tinytext DEFAULT NULL,
@@ -1062,7 +1062,7 @@ t1 CREATE TABLE `t1` (
`aa_flt0` float DEFAULT NULL,
`aa_dbl0` double DEFAULT NULL,
`aa_bit3` bit(3) DEFAULT NULL,
- `aa_enum0` char(1) DEFAULT NULL,
+ `aa_enum0` varchar(1) DEFAULT NULL,
`aa_varchar10` varchar(10) DEFAULT NULL,
`aa_text1` text DEFAULT NULL,
`aa_tinytext1` tinytext DEFAULT NULL,
diff --git a/mysql-test/main/sp-cursor.result b/mysql-test/main/sp-cursor.result
index 230bf8c66ef..83b05264339 100644
--- a/mysql-test/main/sp-cursor.result
+++ b/mysql-test/main/sp-cursor.result
@@ -167,12 +167,12 @@ CALL p1('1b');
v_a
1
Warnings:
-Warning 1265 Data truncated for column 'p_a' at row 1
+Warning 1265 Data truncated for column 'p_a' at row 0
CALL p1('b1');
v_a
0
Warnings:
-Warning 1366 Incorrect integer value: 'b1' for column ``.``.`p_a` at row 1
+Warning 1366 Incorrect integer value: 'b1' for column ``.``.`p_a` at row 0
DROP PROCEDURE p1;
SET sql_mode=DEFAULT;
#
@@ -812,3 +812,43 @@ DROP TABLE t;
#
# End of 10.6 tests
#
+#
+# Start of 10.8 tests
+#
+#
+# MDEV-10654 IN, OUT, INOUT parameters in CREATE FUNCTION
+#
+BEGIN NOT ATOMIC
+DECLARE va INT;
+DECLARE cur CURSOR (IN a INT) FOR SELECT a FROM dual;
+OPEN cur(1);
+FETCH cur INTO va;
+CLOSE cur;
+SELECT va;
+END;
+$$
+va
+1
+BEGIN NOT ATOMIC
+DECLARE va INT;
+DECLARE cur CURSOR (OUT a INT) FOR SELECT a FROM dual;
+OPEN cur(1);
+FETCH cur INTO va;
+CLOSE cur;
+SELECT va;
+END;
+$$
+ERROR 42000: This version of MariaDB doesn't yet support 'OUT/INOUT cursor parameter'
+BEGIN NOT ATOMIC
+DECLARE va INT;
+DECLARE cur CURSOR (INOUT a INT) FOR SELECT a FROM dual;
+OPEN cur(1);
+FETCH cur INTO va;
+CLOSE cur;
+SELECT va;
+END;
+$$
+ERROR 42000: This version of MariaDB doesn't yet support 'OUT/INOUT cursor parameter'
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/main/sp-cursor.test b/mysql-test/main/sp-cursor.test
index c95d59b1d3b..feb681201a2 100644
--- a/mysql-test/main/sp-cursor.test
+++ b/mysql-test/main/sp-cursor.test
@@ -821,3 +821,54 @@ DROP TABLE t;
--echo #
--echo # End of 10.6 tests
--echo #
+
+
+--echo #
+--echo # Start of 10.8 tests
+--echo #
+
+--echo #
+--echo # MDEV-10654 IN, OUT, INOUT parameters in CREATE FUNCTION
+--echo #
+
+DELIMITER $$;
+BEGIN NOT ATOMIC
+ DECLARE va INT;
+ DECLARE cur CURSOR (IN a INT) FOR SELECT a FROM dual;
+ OPEN cur(1);
+ FETCH cur INTO va;
+ CLOSE cur;
+ SELECT va;
+END;
+$$
+DELIMITER ;$$
+
+DELIMITER $$;
+--error ER_NOT_SUPPORTED_YET
+BEGIN NOT ATOMIC
+ DECLARE va INT;
+ DECLARE cur CURSOR (OUT a INT) FOR SELECT a FROM dual;
+ OPEN cur(1);
+ FETCH cur INTO va;
+ CLOSE cur;
+ SELECT va;
+END;
+$$
+DELIMITER ;$$
+
+DELIMITER $$;
+--error ER_NOT_SUPPORTED_YET
+BEGIN NOT ATOMIC
+ DECLARE va INT;
+ DECLARE cur CURSOR (INOUT a INT) FOR SELECT a FROM dual;
+ OPEN cur(1);
+ FETCH cur INTO va;
+ CLOSE cur;
+ SELECT va;
+END;
+$$
+DELIMITER ;$$
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/main/sp-error.result b/mysql-test/main/sp-error.result
index 3832d63c073..c77f58b6a66 100644
--- a/mysql-test/main/sp-error.result
+++ b/mysql-test/main/sp-error.result
@@ -2780,7 +2780,7 @@ END|
CALL p1()|
Warnings:
-Warning 1366 Incorrect integer value: 'string' for column ``.``.`var1` at row 1
+Warning 1366 Incorrect integer value: 'string' for column ``.``.`var1` at row 0
SET sql_mode = DEFAULT|
CREATE PROCEDURE p2()
diff --git a/mysql-test/main/sp-inout.result b/mysql-test/main/sp-inout.result
new file mode 100644
index 00000000000..a1e7ffa9799
--- /dev/null
+++ b/mysql-test/main/sp-inout.result
@@ -0,0 +1,2033 @@
+#
+# MDEV-10654 IN, OUT, INOUT parameters in CREATE FUNCTION
+#
+#
+# CREATE FUNCTION with IN, OUT, INOUT qualifiers
+# SHOW CREATE FUNCTION
+#
+CREATE FUNCTION add_func(IN a INT, IN b INT, OUT c INT, INOUT d INT) RETURNS INT
+BEGIN
+SET c= 100;
+SET d= d + 1;
+RETURN a + b;
+END;
+$$
+SHOW CREATE FUNCTION add_func;
+Function sql_mode Create Function character_set_client collation_connection Database Collation
+add_func STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` FUNCTION `add_func`(IN a INT, IN b INT, OUT c INT, INOUT d INT) RETURNS int(11)
+BEGIN
+SET c= 100;
+SET d= d + 1;
+RETURN a + b;
+END latin1 latin1_swedish_ci latin1_swedish_ci
+DROP FUNCTION add_func;
+#
+# CREATE PROCEDURE with IN, OUT, INOUT qualifiers
+# SHOW CREATE PROCEDURE
+#
+CREATE PROCEDURE add_proc(IN a INT, IN b INT, INOUT c INT, OUT d INT)
+BEGIN
+SET d= a + b + c + d;
+END;
+$$
+SHOW CREATE PROCEDURE add_proc;
+Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
+add_proc STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `add_proc`(IN a INT, IN b INT, INOUT c INT, OUT d INT)
+BEGIN
+SET d= a + b + c + d;
+END latin1 latin1_swedish_ci latin1_swedish_ci
+DROP PROCEDURE add_proc;
+#
+# Call function from SELECT query
+# SELECT > FUNCTION(IN)
+#
+CREATE FUNCTION add_func2(IN a INT, IN b INT) RETURNS INT
+BEGIN
+RETURN a + b;
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SELECT add_func2(@a, @b);
+add_func2(@a, @b)
+5
+DROP FUNCTION add_func2;
+#
+# Call function from SELECT query
+# SELECT > FUNCTION(OUT)
+#
+CREATE FUNCTION add_func3(IN a INT, IN b INT, OUT c INT) RETURNS INT
+BEGIN
+SET c = 100;
+RETURN a + b;
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+SET @res= add_func3(@a, @b, @c);
+SELECT @res, @a, @b, @c;
+@res @a @b @c
+5 2 3 100
+SELECT add_func3(@a, @b, @c);
+ERROR HY000: OUT or INOUT argument 3 for function add_func3 is not allowed here
+DROP FUNCTION add_func3;
+#
+# Call function from SELECT query
+# SELECT > FUNCTION(INOUT)
+#
+CREATE FUNCTION add_func4(IN a INT, IN b INT, OUT c INT, INOUT d INT) RETURNS INT
+BEGIN
+SET c = 100;
+SET d = d + 1;
+RETURN a + b;
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+SET @d = 9;
+SET @res= add_func4(@a, @b, @c, @d);
+SELECT @res, @a, @b, @c, @d;
+@res @a @b @c @d
+5 2 3 100 10
+SELECT add_func4(@a, @b, @c, @d);
+ERROR HY000: OUT or INOUT argument 3 for function add_func4 is not allowed here
+DROP FUNCTION add_func4;
+#
+# Call from procedure
+# PROCEDURE(OUT) > FUNCTION(IN)
+#
+CREATE FUNCTION add_func2(IN a INT, IN b INT) RETURNS INT
+BEGIN
+RETURN a + b;
+END;
+$$
+CREATE PROCEDURE add_proc2(IN a INT, IN b INT, OUT c INT)
+BEGIN
+SET c = add_func2(a, b);
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL add_proc2(@a, @b, @c);
+SELECT @a, @b, @c;
+@a @b @c
+2 3 5
+DROP FUNCTION add_func2;
+DROP PROCEDURE add_proc2;
+#
+# Call from procedure
+# PROCEDURE(OUT) > FUNCTION(OUT)
+#
+CREATE FUNCTION add_func3(IN a INT, IN b INT, OUT c INT) RETURNS INT
+BEGIN
+SET c = 100;
+RETURN a + b;
+END;
+$$
+CREATE PROCEDURE add_proc3(IN a INT, IN b INT, OUT c INT)
+BEGIN
+DECLARE res INT;
+SET res = add_func3(a, b, c);
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL add_proc3(@a, @b, @c);
+SELECT @a, @b, @c;
+@a @b @c
+2 3 100
+DROP FUNCTION add_func3;
+DROP PROCEDURE add_proc3;
+#
+# Call from procedure
+# PROCEDURE(OUT) > FUNCTION(INOUT)
+#
+CREATE FUNCTION add_func4(IN a INT, IN b INT, OUT c INT, INOUT d INT) RETURNS INT
+BEGIN
+SET c = 100;
+SET d = d + 1;
+RETURN a + b;
+END;
+$$
+CREATE PROCEDURE add_proc4(IN a INT, IN b INT, OUT res INT)
+BEGIN
+DECLARE c INT;
+DECLARE d INT;
+SET d = 30;
+SET res = add_func4(a, b, c, d);
+SET res = c + d;
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SET @res = 0;
+CALL add_proc4(@a, @b, @res);
+SELECT @a, @b, @res;
+@a @b @res
+2 3 131
+DROP FUNCTION add_func4;
+DROP PROCEDURE add_proc4;
+#
+# Call from procedure
+# PROCEDURE(OUT) > PROCEDURE(OUT)
+#
+CREATE PROCEDURE add_proc(IN a INT, IN b INT, OUT c INT)
+BEGIN
+SET c = a + b;
+END;
+$$
+CREATE PROCEDURE test_proc1(IN a INT, IN b INT, OUT c INT)
+BEGIN
+CALL add_proc(a, b, c);
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL test_proc1(@a, @b, @c);
+SELECT @a, @b, @c;
+@a @b @c
+2 3 5
+DROP PROCEDURE add_proc;
+DROP PROCEDURE test_proc1;
+#
+# Argument's order change
+# PROCEDURE(a IN, b IN, c OUT) > FUNCTION(b IN, a IN, c OUT)
+#
+CREATE FUNCTION func_sub(IN b INT, IN a INT, OUT c INT) RETURNS INT
+BEGIN
+DECLARE res INT;
+SET c = a - b;
+SET res = a;
+RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, IN b INT, OUT c INT)
+BEGIN
+DECLARE res INT;
+SET res = func_sub(b, a, c);
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL proc_main(@a, @b, @c);
+SELECT @a, @b, @c;
+@a @b @c
+2 3 -1
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# Argument's order change
+# PROCEDURE(a IN, b IN, c OUT) > FUNCTION(c OUT, b IN, a IN)
+#
+CREATE FUNCTION func_sub(OUT c INT, IN b INT, IN a INT) RETURNS INT
+BEGIN
+DECLARE res INT;
+SET c = a - b;
+SET res = a;
+RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, IN b INT, OUT c INT)
+BEGIN
+DECLARE res INT;
+SET res = func_sub(c, b, a);
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL proc_main(@a, @b, @c);
+SELECT @a, @b, @c;
+@a @b @c
+2 3 -1
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# Argument's order change
+# PROCEDURE(a IN, b IN, c INOUT, d OUT) > FUNCTION(d OUT, a IN, b IN, c INOUT)
+#
+CREATE FUNCTION func_sub(OUT d INT, IN a INT, IN b INT, INOUT c INT) RETURNS INT
+BEGIN
+SET c = c + 6;
+SET d = 10;
+RETURN a - b;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, IN b INT, INOUT c INT, OUT d INT)
+BEGIN
+DECLARE res INT;
+SET res = func_sub(d, a, b, c);
+SET d = d + c + res;
+END;
+$$
+SET @a = 15;
+SET @b = 5;
+SET @c = 4;
+SET @d= 0;
+CALL proc_main(@a, @b, @c, @d);
+SELECT @a, @b, @c, @d;
+@a @b @c @d
+15 5 10 30
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# Argument's order change
+# PROCEDURE(IN a INT, IN b INT, INOUT c INT, OUT d INT) > FUNCTION1(c INOUT INT, IN b INT) > FUNCTION2(d OUT INT, IN a INT)
+#
+CREATE FUNCTION func_sub1(INOUT c INT, IN b INT) RETURNS INT
+BEGIN
+SET c = c + b;
+RETURN 0;
+END;
+$$
+CREATE FUNCTION func_sub2(OUT d INT, IN a INT) RETURNS INT
+BEGIN
+SET d = 5 + a;
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, IN b INT, INOUT c INT, OUT d INT)
+BEGIN
+DECLARE res1 INT;
+DECLARE res2 INT;
+SET res1 = func_sub1(c, b);
+SET res2 = func_sub2(d, a);
+SET d = d + c;
+END;
+$$
+SET @a = 15;
+SET @b = 6;
+SET @c = 4;
+SET @d= 0;
+CALL proc_main(@a, @b, @c, @d);
+SELECT @a, @b, @c, @d;
+@a @b @c @d
+15 6 10 30
+DROP FUNCTION func_sub1;
+DROP FUNCTION func_sub2;
+DROP PROCEDURE proc_main;
+#
+# Argument's order change
+# FUNCTION1(a IN, b IN) > FUNCTION2(b IN, c OUT, a IN)
+#
+CREATE FUNCTION func_sub(IN b INT, OUT c INT, IN a INT) RETURNS INT
+BEGIN
+SET c = 100;
+RETURN a + b;
+END;
+$$
+CREATE FUNCTION func_main(IN a INT, IN b INT) RETURNS INT
+BEGIN
+DECLARE c INT;
+DECLARE res INT;
+SET res = func_sub(b, c, a);
+RETURN res + c;
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SELECT func_main(@a, @b);
+func_main(@a, @b)
+105
+DROP FUNCTION func_sub;
+DROP FUNCTION func_main;
+#
+# Call procedure inside function
+# FUNCTION1(a IN, b IN) > PROCEDURE(a IN, b IN, c OUT)
+#
+CREATE PROCEDURE proc_sub(IN a INT, IN b INT, OUT c INT)
+BEGIN
+SET c = a + b;
+END;
+$$
+CREATE FUNCTION func_main(IN b INT, IN a INT) RETURNS INT
+BEGIN
+DECLARE c INT;
+CALL proc_sub(a, b, c);
+RETURN c;
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SELECT func_main(@a, @b);
+func_main(@a, @b)
+5
+DROP PROCEDURE proc_sub;
+DROP FUNCTION func_main;
+#
+# Call procedure inside function
+# FUNCTION1(a IN, b IN) > PROCEDURE(a IN, b INOUT)
+#
+CREATE PROCEDURE proc_sub(IN a INT, INOUT b INT)
+BEGIN
+SET b = a + b;
+END;
+$$
+CREATE FUNCTION func_main(IN b INT, IN a INT) RETURNS INT
+BEGIN
+CALL proc_sub(a, b);
+RETURN b;
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SELECT func_main(@a, @b);
+func_main(@a, @b)
+5
+DROP PROCEDURE proc_sub;
+DROP FUNCTION func_main;
+#
+# Call procedure inside function
+# FUNCTION1(a IN, b IN, c OUT) > PROCEDURE(a IN, b IN, c OUT)
+#
+CREATE PROCEDURE proc_sub(IN a INT, IN b INT, OUT c INT)
+BEGIN
+SET c = a + b;
+END;
+$$
+CREATE FUNCTION func_main(IN b INT, IN a INT, OUT c INT) RETURNS INT
+BEGIN
+DECLARE res INT;
+CALL proc_sub(a, b, c);
+RETURN 0;
+END;
+$$
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+DO func_main(@a, @b, @c);
+SELECT @a, @b, @c;
+@a @b @c
+2 3 5
+SELECT func_main(@a, @b, @c);
+ERROR HY000: OUT or INOUT argument 3 for function func_main is not allowed here
+DROP PROCEDURE proc_sub;
+DROP FUNCTION func_main;
+#
+# Call function from UPDATE query
+# UPDATE <table> SET <column> = FUNCTION(a IN)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+RETURN a * 10;
+END;
+$$
+SET @a = 5;
+UPDATE Persons SET Age = func(@a) WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+DROP TABLE Persons;
+DROP FUNCTION func;
+#
+# Call function from UPDATE query
+# UPDATE <table> SET <column> = FUNCTION(a OUT)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+SET a = 5;
+RETURN 80;
+END;
+$$
+SET @a = 0;
+UPDATE Persons SET Age = func(@a) WHERE ID = 1;
+ERROR HY000: OUT or INOUT argument 1 for function func is not allowed here
+DROP TABLE Persons;
+DROP FUNCTION func;
+#
+# Call function from INSERT query
+# INSERT INTO <table> SELECT <val1>, <val2>, FUNCTION(a IN)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+RETURN a * 10;
+END;
+$$
+SET @a = 4;
+INSERT INTO Persons SELECT 4, 'DDD', func(@a);
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+DROP TABLE Persons;
+DROP FUNCTION func;
+#
+# Call function from INSERT query
+# INSERT INTO <table> SELECT <val1>, <val2>, FUNCTION(a OUT)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+SET a = 45;
+RETURN 40;
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SET @a = 0;
+INSERT INTO Persons SELECT 5, 'EEE', func(@a);
+ERROR HY000: OUT or INOUT argument 1 for function func is not allowed here
+DROP TABLE Persons;
+DROP FUNCTION func;
+#
+# Call function from DELETE query
+# DELETE FROM <table> WHERE <column> = FUNCTION(a IN)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+RETURN a;
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+SET @a = 4;
+DELETE FROM Persons WHERE ID = func(@a);
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+DROP TABLE Persons;
+DROP FUNCTION func;
+#
+# Call function from DELETE query
+# DELETE FROM <table> WHERE <column> = FUNCTION(a OUT)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+SET a = 40;
+RETURN 4;
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+SET @a = 0;
+DELETE FROM Persons WHERE ID = func(@a);
+ERROR HY000: OUT or INOUT argument 1 for function func is not allowed here
+DROP TABLE Persons;
+DROP FUNCTION func;
+#
+# SELECT query inside function
+# FUNCTION(a IN) > SELECT … FROM <table>
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+DECLARE c INT;
+SELECT AGE INTO c FROM Persons WHERE ID = a;
+RETURN c;
+END;
+$$
+SET @a = 3;
+SELECT func_main(@a);
+func_main(@a)
+30
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+#
+# SELECT query inside function
+# FUNCTION(a OUT) > SELECT … FROM <table>
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func_main(OUT a INT) RETURNS INT
+BEGIN
+SELECT AGE INTO a FROM Persons WHERE ID = 3;
+RETURN 0;
+END;
+$$
+SET @a = 0;
+SELECT func_main(@a);
+ERROR HY000: OUT or INOUT argument 1 for function func_main is not allowed here
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+#
+# SELECT query inside function
+# FUNCTION(a INOUT) > SELECT … FROM <table>
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func_main(INOUT a INT) RETURNS INT
+BEGIN
+SELECT AGE INTO a FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+$$
+SET @a = 1;
+SELECT func_main(@a);
+ERROR HY000: OUT or INOUT argument 1 for function func_main is not allowed here
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+#
+# SELECT query inside function
+# FUNCTION(a IN) > FUNCTION(a IN, b OUT) > SELECT … FROM <table>
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+$$
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+DECLARE b INT;
+DECLARE res INT;
+SET res = func_sub(a, b);
+RETURN b;
+END;
+$$
+SET @a = 2;
+SELECT func_main(@a);
+func_main(@a)
+20
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP FUNCTION func_main;
+#
+# UPDATE query inside function
+# FUNCTION(a IN) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+DECLARE c INT;
+UPDATE Persons SET AGE = 50 WHERE ID = a;
+SELECT AGE INTO c FROM Persons WHERE ID = a;
+RETURN c;
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+SET @a = 5;
+SELECT func_main(@a);
+func_main(@a)
+50
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 50
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+#
+# UPDATE query inside function
+# FUNCTION(a IN, b OUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE FUNCTION func_main(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+UPDATE Persons SET AGE = 60 WHERE ID = a;
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+$$
+SET @a = 5;
+SET @b = 0;
+SELECT func_main(@a, @b);
+ERROR HY000: OUT or INOUT argument 2 for function func_main is not allowed here
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+#
+# UPDATE query inside function
+# FUNCTION(a IN, b INOUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE FUNCTION func_main(IN a INT, INOUT b INT) RETURNS INT
+BEGIN
+UPDATE Persons SET AGE = 60 WHERE ID = a;
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+$$
+SET @a = 5;
+SET @b = 0;
+SELECT func_main(@a, @b);
+ERROR HY000: OUT or INOUT argument 2 for function func_main is not allowed here
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+#
+# UPDATE query inside function
+# FUNCTION(a IN) > FUNCTION(a IN, b OUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 80);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+UPDATE Persons SET AGE = 10 WHERE ID = a;
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+$$
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+DECLARE b INT;
+DECLARE res INT;
+SET res = func_sub(a, b);
+RETURN b;
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 80
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+SET @a = 1;
+SELECT func_main(@a);
+func_main(@a)
+10
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP FUNCTION func_main;
+#
+# INSERT query inside function
+# FUNCTION(a IN) > INSERT INTO <table> VALUES …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 50);
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+DECLARE b INT;
+INSERT INTO Persons VALUE (a, 'FFF', 60);
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN b;
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 50
+SET @a = 6;
+SELECT func_main(@a);
+func_main(@a)
+60
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 50
+6 FFF 60
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+#
+# INSERT query inside function
+# FUNCTION(a IN, b OUT) > INSERT INTO <table> VALUES …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 50);
+CREATE FUNCTION func_main(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+INSERT INTO Persons VALUE (a, 'FFF', 60);
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 50
+SET @a = 6;
+SET @b = 0;
+SELECT func_main(@a, @b);
+ERROR HY000: OUT or INOUT argument 2 for function func_main is not allowed here
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+#
+# INSERT query inside function
+# FUNCTION(a IN, b INOUT) > INSERT INTO <table> VALUES …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE FUNCTION func_main(IN a INT, INOUT b INT) RETURNS INT
+BEGIN
+INSERT INTO Persons VALUE (a, 'FFF', 60);
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+SET @a = 6;
+SET @b = 0;
+SELECT func_main(@a, @b);
+ERROR HY000: OUT or INOUT argument 2 for function func_main is not allowed here
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+#
+# INSERT query inside function
+# FUNCTION(a IN) > FUNCTION(a IN, b OUT) > INSERT INTO <table> VALUES …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+INSERT INTO Persons VALUE (a, 'FFF', 60);
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+$$
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+DECLARE b INT;
+DECLARE res INT;
+SET res = func_sub(a, b);
+RETURN b;
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+SET @a = 6;
+SELECT func_main(@a);
+func_main(@a)
+60
+SELECT * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+6 FFF 60
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP FUNCTION func_main;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(IN) > SELECT FROM <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func_sub(IN a INT) RETURNS INT
+BEGIN
+DECLARE b INT;
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN b;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+SET b = func_sub(a);
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+SET @a = 2;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+@b
+20
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(OUT) > SELECT FROM <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+DECLARE res INT;
+SET res = func_sub(a, b);
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+SET @a = 1;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+@b
+50
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(INOUT) > SELECT FROM <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func_sub(IN a INT, INOUT c INT) RETURNS INT
+BEGIN
+DECLARE res INT;
+SELECT AGE INTO res FROM Persons WHERE ID = a;
+SET c = c * 100;
+RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+DECLARE c INT;
+DECLARE res INT;
+SET c = 5;
+SET res = func_sub(a, c);
+SET b = c;
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+SET @a = 2;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+@b
+500
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(IN) > INSESRT INTO <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE FUNCTION func_sub(IN a INT) RETURNS INT
+BEGIN
+INSERT INTO Persons VALUE (a, 'FFF', 50);
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+SET b = func_sub(a);
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+SET @a = 5;
+SET @b = 1;
+CALL proc_main(@a, @b);
+SELECT @b;
+@b
+0
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(OUT) > INSESRT INTO <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+INSERT INTO Persons VALUE (a, 'GGG', 60);
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+DECLARE res INT;
+SET res = func_sub(a, b);
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+SET @a = 6;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+6 GGG 60
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(INOUT) > INSESRT INTO <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+CREATE FUNCTION func_sub(IN a INT, INOUT c INT) RETURNS INT
+BEGIN
+DECLARE res INT;
+INSERT INTO Persons VALUE (a, 'HHH', 70);
+SET c = c * 100;
+RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+DECLARE c INT;
+DECLARE res INT;
+SET c = 5;
+SET res = func_sub(a, c);
+SET b = c;
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+6 GGG 60
+SET @a = 7;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+@b
+500
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+6 GGG 60
+7 HHH 70
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(IN) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+CREATE FUNCTION func_sub(IN a INT) RETURNS INT
+BEGIN
+UPDATE Persons SET AGE = 100 WHERE ID = a;
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+SET b = func_sub(a);
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+6 GGG 60
+7 HHH 70
+SET @a = 5;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 60
+7 HHH 70
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 100);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+UPDATE Persons SET AGE = 100 WHERE ID = a;
+SET b = 1;
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+DECLARE res INT;
+SET res = func_sub(a, b);
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 60
+7 HHH 70
+SET @a = 6;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+@b
+1
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 100
+7 HHH 70
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(INOUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 100);
+INSERT INTO Persons VALUES (6, 'GGG', 100);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+CREATE FUNCTION func_sub(IN a INT, INOUT c INT) RETURNS INT
+BEGIN
+DECLARE res INT;
+UPDATE Persons SET AGE = 100 WHERE ID = a;
+SET c = c * 100;
+RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+DECLARE c INT;
+DECLARE res INT;
+SET c = 5;
+SET res = func_sub(a, c);
+SET b = c;
+END;
+$$
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 100
+7 HHH 70
+SET @a = 7;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+@b
+500
+SELECT * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 100
+7 HHH 100
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 20 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 20
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(IN) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+a;
+RETURN 0;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+DECLARE a INT;
+DECLARE res INT;
+SET a = 1;
+SET res = 0;
+SET res = func(a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 30 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 30
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(OUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 40);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE FUNCTION func(IN age_in INT, OUT age_out INT) RETURNS INT
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+SET age_out = age_in + 1;
+RETURN 0;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+BEFORE UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+DECLARE res INT DEFAULT (func(OLD.age, NEW.age));
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 40
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 41
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(INOUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE FUNCTION func(INOUT a INT) RETURNS INT
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+SET a = 100;
+RETURN 0;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+DECLARE a INT;
+DECLARE res INT;
+SET a = 10;
+SET res = 0;
+SET res = func(a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 60 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 60
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(IN) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE PROCEDURE proc(IN a INT)
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+a;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+CALL proc(1);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 30 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 30
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE PROCEDURE proc(IN old_age INT, OUT new_age INT)
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+SET new_age=old_age+41;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+BEFORE UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+CALL proc(OLD.age, NEW.age);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 51
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(INOUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE PROCEDURE proc(INOUT a INT)
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+SET a = 51;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+BEFORE UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+CALL proc(NEW.age);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 51
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(IN) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc(OUT a INT)
+BEGIN
+DECLARE res INT;
+SET a = 100;
+SET res = func(a);
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+CALL proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 60 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 60
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+SET a = 200;
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc(OUT a INT)
+BEGIN
+DECLARE res INT;
+SET a = 100;
+SET res = func(a);
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+CALL proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 80 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 80
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP FUNCTION func;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(INOUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE FUNCTION func(INOUT a INT) RETURNS INT
+BEGIN
+SET a = 200;
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc(OUT a INT)
+BEGIN
+DECLARE res INT;
+SET a = 100;
+SET res = func(a);
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+CALL proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 90 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 90
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE TABLE2 with OUT argument (to check if OUT is returning by reference)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+SET a = 111;
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc(OUT a INT)
+BEGIN
+DECLARE res INT;
+SET res = func(a);
+UPDATE PersonsLog SET UpdateCount = a;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+CALL proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 80 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 80
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+111
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
diff --git a/mysql-test/main/sp-inout.test b/mysql-test/main/sp-inout.test
new file mode 100644
index 00000000000..8f3f134b675
--- /dev/null
+++ b/mysql-test/main/sp-inout.test
@@ -0,0 +1,1964 @@
+--echo #
+--echo # MDEV-10654 IN, OUT, INOUT parameters in CREATE FUNCTION
+--echo #
+
+
+--echo #
+--echo # CREATE FUNCTION with IN, OUT, INOUT qualifiers
+--echo # SHOW CREATE FUNCTION
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION add_func(IN a INT, IN b INT, OUT c INT, INOUT d INT) RETURNS INT
+BEGIN
+ SET c= 100;
+ SET d= d + 1;
+ RETURN a + b;
+END;
+$$
+DELIMITER ;$$
+
+SHOW CREATE FUNCTION add_func;
+DROP FUNCTION add_func;
+
+--echo #
+--echo # CREATE PROCEDURE with IN, OUT, INOUT qualifiers
+--echo # SHOW CREATE PROCEDURE
+--echo #
+
+DELIMITER $$;
+CREATE PROCEDURE add_proc(IN a INT, IN b INT, INOUT c INT, OUT d INT)
+BEGIN
+ SET d= a + b + c + d;
+END;
+$$
+DELIMITER ;$$
+
+SHOW CREATE PROCEDURE add_proc;
+DROP PROCEDURE add_proc;
+
+--echo #
+--echo # Call function from SELECT query
+--echo # SELECT > FUNCTION(IN)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION add_func2(IN a INT, IN b INT) RETURNS INT
+BEGIN
+ RETURN a + b;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SELECT add_func2(@a, @b);
+DROP FUNCTION add_func2;
+
+--echo #
+--echo # Call function from SELECT query
+--echo # SELECT > FUNCTION(OUT)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION add_func3(IN a INT, IN b INT, OUT c INT) RETURNS INT
+BEGIN
+ SET c = 100;
+ RETURN a + b;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+SET @res= add_func3(@a, @b, @c);
+SELECT @res, @a, @b, @c;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+SELECT add_func3(@a, @b, @c);
+DROP FUNCTION add_func3;
+
+--echo #
+--echo # Call function from SELECT query
+--echo # SELECT > FUNCTION(INOUT)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION add_func4(IN a INT, IN b INT, OUT c INT, INOUT d INT) RETURNS INT
+BEGIN
+ SET c = 100;
+ SET d = d + 1;
+ RETURN a + b;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+SET @d = 9;
+SET @res= add_func4(@a, @b, @c, @d);
+SELECT @res, @a, @b, @c, @d;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+SELECT add_func4(@a, @b, @c, @d);
+DROP FUNCTION add_func4;
+
+--echo #
+--echo # Call from procedure
+--echo # PROCEDURE(OUT) > FUNCTION(IN)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION add_func2(IN a INT, IN b INT) RETURNS INT
+BEGIN
+ RETURN a + b;
+END;
+$$
+CREATE PROCEDURE add_proc2(IN a INT, IN b INT, OUT c INT)
+BEGIN
+ SET c = add_func2(a, b);
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL add_proc2(@a, @b, @c);
+SELECT @a, @b, @c;
+DROP FUNCTION add_func2;
+DROP PROCEDURE add_proc2;
+
+--echo #
+--echo # Call from procedure
+--echo # PROCEDURE(OUT) > FUNCTION(OUT)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION add_func3(IN a INT, IN b INT, OUT c INT) RETURNS INT
+BEGIN
+ SET c = 100;
+ RETURN a + b;
+END;
+$$
+CREATE PROCEDURE add_proc3(IN a INT, IN b INT, OUT c INT)
+BEGIN
+ DECLARE res INT;
+ SET res = add_func3(a, b, c);
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL add_proc3(@a, @b, @c);
+SELECT @a, @b, @c;
+DROP FUNCTION add_func3;
+DROP PROCEDURE add_proc3;
+
+--echo #
+--echo # Call from procedure
+--echo # PROCEDURE(OUT) > FUNCTION(INOUT)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION add_func4(IN a INT, IN b INT, OUT c INT, INOUT d INT) RETURNS INT
+BEGIN
+ SET c = 100;
+ SET d = d + 1;
+ RETURN a + b;
+END;
+$$
+CREATE PROCEDURE add_proc4(IN a INT, IN b INT, OUT res INT)
+BEGIN
+ DECLARE c INT;
+ DECLARE d INT;
+ SET d = 30;
+ SET res = add_func4(a, b, c, d);
+ SET res = c + d;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SET @res = 0;
+CALL add_proc4(@a, @b, @res);
+SELECT @a, @b, @res;
+DROP FUNCTION add_func4;
+DROP PROCEDURE add_proc4;
+
+--echo #
+--echo # Call from procedure
+--echo # PROCEDURE(OUT) > PROCEDURE(OUT)
+--echo #
+
+DELIMITER $$;
+CREATE PROCEDURE add_proc(IN a INT, IN b INT, OUT c INT)
+BEGIN
+ SET c = a + b;
+END;
+$$
+CREATE PROCEDURE test_proc1(IN a INT, IN b INT, OUT c INT)
+BEGIN
+ CALL add_proc(a, b, c);
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL test_proc1(@a, @b, @c);
+SELECT @a, @b, @c;
+DROP PROCEDURE add_proc;
+DROP PROCEDURE test_proc1;
+
+--echo #
+--echo # Argument's order change
+--echo # PROCEDURE(a IN, b IN, c OUT) > FUNCTION(b IN, a IN, c OUT)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN b INT, IN a INT, OUT c INT) RETURNS INT
+BEGIN
+ DECLARE res INT;
+ SET c = a - b;
+ SET res = a;
+ RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, IN b INT, OUT c INT)
+BEGIN
+ DECLARE res INT;
+ SET res = func_sub(b, a, c);
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL proc_main(@a, @b, @c);
+SELECT @a, @b, @c;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+--echo #
+--echo # Argument's order change
+--echo # PROCEDURE(a IN, b IN, c OUT) > FUNCTION(c OUT, b IN, a IN)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(OUT c INT, IN b INT, IN a INT) RETURNS INT
+BEGIN
+ DECLARE res INT;
+ SET c = a - b;
+ SET res = a;
+ RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, IN b INT, OUT c INT)
+BEGIN
+ DECLARE res INT;
+ SET res = func_sub(c, b, a);
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+CALL proc_main(@a, @b, @c);
+SELECT @a, @b, @c;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+--echo #
+--echo # Argument's order change
+--echo # PROCEDURE(a IN, b IN, c INOUT, d OUT) > FUNCTION(d OUT, a IN, b IN, c INOUT)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(OUT d INT, IN a INT, IN b INT, INOUT c INT) RETURNS INT
+BEGIN
+ SET c = c + 6;
+ SET d = 10;
+ RETURN a - b;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, IN b INT, INOUT c INT, OUT d INT)
+BEGIN
+ DECLARE res INT;
+ SET res = func_sub(d, a, b, c);
+ SET d = d + c + res;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 15;
+SET @b = 5;
+SET @c = 4;
+SET @d= 0;
+CALL proc_main(@a, @b, @c, @d);
+SELECT @a, @b, @c, @d;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+--echo #
+--echo # Argument's order change
+--echo # PROCEDURE(IN a INT, IN b INT, INOUT c INT, OUT d INT) > FUNCTION1(c INOUT INT, IN b INT) > FUNCTION2(d OUT INT, IN a INT)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION func_sub1(INOUT c INT, IN b INT) RETURNS INT
+BEGIN
+ SET c = c + b;
+ RETURN 0;
+END;
+$$
+CREATE FUNCTION func_sub2(OUT d INT, IN a INT) RETURNS INT
+BEGIN
+ SET d = 5 + a;
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, IN b INT, INOUT c INT, OUT d INT)
+BEGIN
+ DECLARE res1 INT;
+ DECLARE res2 INT;
+ SET res1 = func_sub1(c, b);
+ SET res2 = func_sub2(d, a);
+ SET d = d + c;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 15;
+SET @b = 6;
+SET @c = 4;
+SET @d= 0;
+CALL proc_main(@a, @b, @c, @d);
+SELECT @a, @b, @c, @d;
+DROP FUNCTION func_sub1;
+DROP FUNCTION func_sub2;
+DROP PROCEDURE proc_main;
+
+--echo #
+--echo # Argument's order change
+--echo # FUNCTION1(a IN, b IN) > FUNCTION2(b IN, c OUT, a IN)
+--echo #
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN b INT, OUT c INT, IN a INT) RETURNS INT
+BEGIN
+ SET c = 100;
+ RETURN a + b;
+END;
+$$
+CREATE FUNCTION func_main(IN a INT, IN b INT) RETURNS INT
+BEGIN
+ DECLARE c INT;
+ DECLARE res INT;
+ SET res = func_sub(b, c, a);
+ RETURN res + c;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SELECT func_main(@a, @b);
+DROP FUNCTION func_sub;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # Call procedure inside function
+--echo # FUNCTION1(a IN, b IN) > PROCEDURE(a IN, b IN, c OUT)
+--echo #
+
+DELIMITER $$;
+CREATE PROCEDURE proc_sub(IN a INT, IN b INT, OUT c INT)
+BEGIN
+ SET c = a + b;
+END;
+$$
+CREATE FUNCTION func_main(IN b INT, IN a INT) RETURNS INT
+BEGIN
+ DECLARE c INT;
+ CALL proc_sub(a, b, c);
+ RETURN c;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SELECT func_main(@a, @b);
+DROP PROCEDURE proc_sub;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # Call procedure inside function
+--echo # FUNCTION1(a IN, b IN) > PROCEDURE(a IN, b INOUT)
+--echo #
+
+DELIMITER $$;
+CREATE PROCEDURE proc_sub(IN a INT, INOUT b INT)
+BEGIN
+ SET b = a + b;
+END;
+$$
+CREATE FUNCTION func_main(IN b INT, IN a INT) RETURNS INT
+BEGIN
+ CALL proc_sub(a, b);
+ RETURN b;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SELECT func_main(@a, @b);
+DROP PROCEDURE proc_sub;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # Call procedure inside function
+--echo # FUNCTION1(a IN, b IN, c OUT) > PROCEDURE(a IN, b IN, c OUT)
+--echo #
+
+DELIMITER $$;
+CREATE PROCEDURE proc_sub(IN a INT, IN b INT, OUT c INT)
+BEGIN
+ SET c = a + b;
+END;
+$$
+CREATE FUNCTION func_main(IN b INT, IN a INT, OUT c INT) RETURNS INT
+BEGIN
+ DECLARE res INT;
+ CALL proc_sub(a, b, c);
+ RETURN 0;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SET @b = 3;
+SET @c = 0;
+DO func_main(@a, @b, @c);
+SELECT @a, @b, @c;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+SELECT func_main(@a, @b, @c);
+DROP PROCEDURE proc_sub;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # Call function from UPDATE query
+--echo # UPDATE <table> SET <column> = FUNCTION(a IN)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+DELIMITER $$;
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+ RETURN a * 10;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 5;
+UPDATE Persons SET Age = func(@a) WHERE ID = 1;
+SELECT * FROM Persons;
+DROP TABLE Persons;
+DROP FUNCTION func;
+
+--echo #
+--echo # Call function from UPDATE query
+--echo # UPDATE <table> SET <column> = FUNCTION(a OUT)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+DELIMITER $$;
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+ SET a = 5;
+ RETURN 80;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+UPDATE Persons SET Age = func(@a) WHERE ID = 1;
+DROP TABLE Persons;
+DROP FUNCTION func;
+
+--echo #
+--echo # Call function from INSERT query
+--echo # INSERT INTO <table> SELECT <val1>, <val2>, FUNCTION(a IN)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+DELIMITER $$;
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+ RETURN a * 10;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 4;
+INSERT INTO Persons SELECT 4, 'DDD', func(@a);
+SELECT * FROM Persons;
+DROP TABLE Persons;
+DROP FUNCTION func;
+
+--echo #
+--echo # Call function from INSERT query
+--echo # INSERT INTO <table> SELECT <val1>, <val2>, FUNCTION(a OUT)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+DELIMITER $$;
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+ SET a = 45;
+ RETURN 40;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SET @a = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+INSERT INTO Persons SELECT 5, 'EEE', func(@a);
+DROP TABLE Persons;
+DROP FUNCTION func;
+
+--echo #
+--echo # Call function from DELETE query
+--echo # DELETE FROM <table> WHERE <column> = FUNCTION(a IN)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+ RETURN a;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SET @a = 4;
+DELETE FROM Persons WHERE ID = func(@a);
+SELECT * FROM Persons;
+DROP TABLE Persons;
+DROP FUNCTION func;
+
+--echo #
+--echo # Call function from DELETE query
+--echo # DELETE FROM <table> WHERE <column> = FUNCTION(a OUT)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+ SET a = 40;
+ RETURN 4;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SET @a = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+DELETE FROM Persons WHERE ID = func(@a);
+DROP TABLE Persons;
+DROP FUNCTION func;
+
+--echo #
+--echo # SELECT query inside function
+--echo # FUNCTION(a IN) > SELECT … FROM <table>
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+ DECLARE c INT;
+ SELECT AGE INTO c FROM Persons WHERE ID = a;
+ RETURN c;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 3;
+SELECT func_main(@a);
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # SELECT query inside function
+--echo # FUNCTION(a OUT) > SELECT … FROM <table>
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_main(OUT a INT) RETURNS INT
+BEGIN
+ SELECT AGE INTO a FROM Persons WHERE ID = 3;
+ RETURN 0;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+SELECT func_main(@a);
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # SELECT query inside function
+--echo # FUNCTION(a INOUT) > SELECT … FROM <table>
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_main(INOUT a INT) RETURNS INT
+BEGIN
+ SELECT AGE INTO a FROM Persons WHERE ID = a;
+ RETURN 0;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 1;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+SELECT func_main(@a);
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # SELECT query inside function
+--echo # FUNCTION(a IN) > FUNCTION(a IN, b OUT) > SELECT … FROM <table>
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+END;
+$$
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+ DECLARE b INT;
+ DECLARE res INT;
+ SET res = func_sub(a, b);
+ RETURN b;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 2;
+SELECT func_main(@a);
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # UPDATE query inside function
+--echo # FUNCTION(a IN) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+ DECLARE c INT;
+ UPDATE Persons SET AGE = 50 WHERE ID = a;
+ SELECT AGE INTO c FROM Persons WHERE ID = a;
+ RETURN c;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 5;
+SELECT func_main(@a);
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # UPDATE query inside function
+--echo # FUNCTION(a IN, b OUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_main(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+ UPDATE Persons SET AGE = 60 WHERE ID = a;
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 5;
+SET @b = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+SELECT func_main(@a, @b);
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # UPDATE query inside function
+--echo # FUNCTION(a IN, b INOUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_main(IN a INT, INOUT b INT) RETURNS INT
+BEGIN
+ UPDATE Persons SET AGE = 60 WHERE ID = a;
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+END;
+$$
+DELIMITER ;$$
+
+SET @a = 5;
+SET @b = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+SELECT func_main(@a, @b);
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # UPDATE query inside function
+--echo # FUNCTION(a IN) > FUNCTION(a IN, b OUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 80);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+ UPDATE Persons SET AGE = 10 WHERE ID = a;
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+END;
+$$
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+ DECLARE b INT;
+ DECLARE res INT;
+ SET res = func_sub(a, b);
+ RETURN b;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 1;
+SELECT func_main(@a);
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP FUNCTION func_main;
+
+
+--echo #
+--echo # INSERT query inside function
+--echo # FUNCTION(a IN) > INSERT INTO <table> VALUES …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 50);
+
+DELIMITER $$;
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+ DECLARE b INT;
+ INSERT INTO Persons VALUE (a, 'FFF', 60);
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN b;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 6;
+SELECT func_main(@a);
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # INSERT query inside function
+--echo # FUNCTION(a IN, b OUT) > INSERT INTO <table> VALUES …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 50);
+
+DELIMITER $$;
+CREATE FUNCTION func_main(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+ INSERT INTO Persons VALUE (a, 'FFF', 60);
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 6;
+SET @b = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+SELECT func_main(@a, @b);
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # INSERT query inside function
+--echo # FUNCTION(a IN, b INOUT) > INSERT INTO <table> VALUES …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_main(IN a INT, INOUT b INT) RETURNS INT
+BEGIN
+ INSERT INTO Persons VALUE (a, 'FFF', 60);
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 6;
+SET @b = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+SELECT func_main(@a, @b);
+DROP TABLE Persons;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # INSERT query inside function
+--echo # FUNCTION(a IN) > FUNCTION(a IN, b OUT) > INSERT INTO <table> VALUES …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+ INSERT INTO Persons VALUE (a, 'FFF', 60);
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+END;
+$$
+CREATE FUNCTION func_main(IN a INT) RETURNS INT
+BEGIN
+ DECLARE b INT;
+ DECLARE res INT;
+ SET res = func_sub(a, b);
+ RETURN b;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 6;
+SELECT func_main(@a);
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP FUNCTION func_main;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(IN) > SELECT FROM <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT) RETURNS INT
+BEGIN
+ DECLARE b INT;
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN b;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+ SET b = func_sub(a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 2;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(OUT) > SELECT FROM <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+ DECLARE res INT;
+ SET res = func_sub(a, b);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 1;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(INOUT) > SELECT FROM <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT, INOUT c INT) RETURNS INT
+BEGIN
+ DECLARE res INT;
+ SELECT AGE INTO res FROM Persons WHERE ID = a;
+ SET c = c * 100;
+ RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+ DECLARE c INT;
+ DECLARE res INT;
+ SET c = 5;
+ SET res = func_sub(a, c);
+ SET b = c;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 2;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(IN) > INSESRT INTO <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT) RETURNS INT
+BEGIN
+ INSERT INTO Persons VALUE (a, 'FFF', 50);
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+ SET b = func_sub(a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 5;
+SET @b = 1;
+CALL proc_main(@a, @b);
+SELECT @b;
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(OUT) > INSESRT INTO <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+ INSERT INTO Persons VALUE (a, 'GGG', 60);
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+ DECLARE res INT;
+ SET res = func_sub(a, b);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 6;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(INOUT) > INSESRT INTO <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT, INOUT c INT) RETURNS INT
+BEGIN
+ DECLARE res INT;
+ INSERT INTO Persons VALUE (a, 'HHH', 70);
+ SET c = c * 100;
+ RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+ DECLARE c INT;
+ DECLARE res INT;
+ SET c = 5;
+ SET res = func_sub(a, c);
+ SET b = c;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 7;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(IN) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT) RETURNS INT
+BEGIN
+ UPDATE Persons SET AGE = 100 WHERE ID = a;
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+ SET b = func_sub(a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 5;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 100);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT, OUT b INT) RETURNS INT
+BEGIN
+ UPDATE Persons SET AGE = 100 WHERE ID = a;
+ SET b = 1;
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+ DECLARE res INT;
+ SET res = func_sub(a, b);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 6;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(INOUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 100);
+INSERT INTO Persons VALUES (6, 'GGG', 100);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+
+DELIMITER $$;
+CREATE FUNCTION func_sub(IN a INT, INOUT c INT) RETURNS INT
+BEGIN
+ DECLARE res INT;
+ UPDATE Persons SET AGE = 100 WHERE ID = a;
+ SET c = c * 100;
+ RETURN res;
+END;
+$$
+CREATE PROCEDURE proc_main(IN a INT, OUT b INT)
+BEGIN
+ DECLARE c INT;
+ DECLARE res INT;
+ SET c = 5;
+ SET res = func_sub(a, c);
+ SET b = c;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * from Persons;
+SET @a = 7;
+SET @b = 0;
+CALL proc_main(@a, @b);
+SELECT @b;
+SELECT * from Persons;
+DROP TABLE Persons;
+DROP FUNCTION func_sub;
+DROP PROCEDURE proc_main;
+
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 20 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(IN) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+a;
+ RETURN 0;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ DECLARE a INT;
+ DECLARE res INT;
+ SET a = 1;
+ SET res = 0;
+ SET res = func(a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 30 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(OUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 40);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE FUNCTION func(IN age_in INT, OUT age_out INT) RETURNS INT
+BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ SET age_out = age_in + 1;
+ RETURN 0;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+BEFORE UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ DECLARE res INT DEFAULT (func(OLD.age, NEW.age));
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(INOUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE FUNCTION func(INOUT a INT) RETURNS INT
+BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ SET a = 100;
+ RETURN 0;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ DECLARE a INT;
+ DECLARE res INT;
+ SET a = 10;
+ SET res = 0;
+ SET res = func(a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 60 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(IN) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE PROCEDURE proc(IN a INT)
+BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+a;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ CALL proc(1);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 30 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE PROCEDURE proc(IN old_age INT, OUT new_age INT)
+BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ SET new_age=old_age+41;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+BEFORE UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ CALL proc(OLD.age, NEW.age);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(INOUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE PROCEDURE proc(INOUT a INT)
+BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ SET a = 51;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+BEFORE UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ CALL proc(NEW.age);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(IN) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE FUNCTION func(IN a INT) RETURNS INT
+BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc(OUT a INT)
+BEGIN
+ DECLARE res INT;
+ SET a = 100;
+ SET res = func(a);
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ CALL proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 60 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+ SET a = 200;
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc(OUT a INT)
+BEGIN
+ DECLARE res INT;
+ SET a = 100;
+ SET res = func(a);
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ CALL proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 80 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP FUNCTION func;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(INOUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE FUNCTION func(INOUT a INT) RETURNS INT
+BEGIN
+ SET a = 200;
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc(OUT a INT)
+BEGIN
+ DECLARE res INT;
+ SET a = 100;
+ SET res = func(a);
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ CALL proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 90 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE TABLE2 with OUT argument (to check if OUT is returning by reference)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE FUNCTION func(OUT a INT) RETURNS INT
+BEGIN
+ SET a = 111;
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ RETURN 0;
+END;
+$$
+CREATE PROCEDURE proc(OUT a INT)
+BEGIN
+ DECLARE res INT;
+ SET res = func(a);
+ UPDATE PersonsLog SET UpdateCount = a;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ CALL proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 80 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP FUNCTION func;
+DROP PROCEDURE proc;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
diff --git a/mysql-test/main/sp-row.result b/mysql-test/main/sp-row.result
index 36a371d8c04..b66455dfdb9 100644
--- a/mysql-test/main/sp-row.result
+++ b/mysql-test/main/sp-row.result
@@ -20,7 +20,7 @@ RETURN a;
END;
$$
SELECT f1(ROW(10,20));
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `f1(ROW(10,20))`
DROP FUNCTION f1;
#
# ROW as an SP parameter
@@ -236,7 +236,7 @@ SELECT f1(a);
END;
$$
CALL p1();
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `a`
DROP PROCEDURE p1;
DROP FUNCTION f1;
#
@@ -286,7 +286,7 @@ RETURN rec;
END;
$$
SELECT f1(10);
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `f1(10)`
DROP FUNCTION f1;
#
# Using the entire ROW in SELECT..CREATE
diff --git a/mysql-test/main/sp-row.test b/mysql-test/main/sp-row.test
index 527ff9455bd..c49ea293bfe 100644
--- a/mysql-test/main/sp-row.test
+++ b/mysql-test/main/sp-row.test
@@ -27,7 +27,7 @@ BEGIN
END;
$$
DELIMITER ;$$
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
SELECT f1(ROW(10,20));
DROP FUNCTION f1;
@@ -307,7 +307,7 @@ BEGIN
END;
$$
DELIMITER ;$$
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
CALL p1();
DROP PROCEDURE p1;
DROP FUNCTION f1;
@@ -393,7 +393,7 @@ BEGIN
END;
$$
DELIMITER ;$$
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
SELECT f1(10);
DROP FUNCTION f1;
diff --git a/mysql-test/main/sp-vars.result b/mysql-test/main/sp-vars.result
index 2ee3f730788..a5616b9e231 100644
--- a/mysql-test/main/sp-vars.result
+++ b/mysql-test/main/sp-vars.result
@@ -110,7 +110,7 @@ v7 v8 v9 v10 v11 v12 v13 v14 v15 v16
v17 v18 v19 v20
12.00 12.12 12.00 12.12
Warnings:
-Note 1265 Data truncated for column 'v20' at row 1
+Note 1265 Data truncated for column 'v20' at row 0
CALL sp_vars_check_assignment();
i1 i2 i3 i4
127 -128 127 -128
@@ -130,22 +130,22 @@ SELECT sp_vars_check_ret1();
sp_vars_check_ret1()
127
Warnings:
-Warning 1264 Out of range value for column 'sp_vars_check_ret1()' at row 1
+Warning 1264 Out of range value for column 'sp_vars_check_ret1()' at row 0
SELECT sp_vars_check_ret2();
sp_vars_check_ret2()
127
Warnings:
-Warning 1264 Out of range value for column 'sp_vars_check_ret2()' at row 1
+Warning 1264 Out of range value for column 'sp_vars_check_ret2()' at row 0
SELECT sp_vars_check_ret3();
sp_vars_check_ret3()
0
Warnings:
-Warning 1366 Incorrect integer value: 'Hello, world' for column ``.``.`sp_vars_check_ret3()` at row 1
+Warning 1366 Incorrect integer value: 'Hello, world' for column ``.``.`sp_vars_check_ret3()` at row 0
SELECT sp_vars_check_ret4();
sp_vars_check_ret4()
154.12
Warnings:
-Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
+Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 0
SELECT sp_vars_div_zero();
sp_vars_div_zero()
NULL
@@ -165,7 +165,7 @@ v7 v8 v9 v10 v11 v12 v13 v14 v15 v16
v17 v18 v19 v20
12.00 12.12 12.00 12.12
Warnings:
-Note 1265 Data truncated for column 'v20' at row 1
+Note 1265 Data truncated for column 'v20' at row 0
CALL sp_vars_check_assignment();
i1 i2 i3 i4
127 -128 127 -128
@@ -185,22 +185,22 @@ SELECT sp_vars_check_ret1();
sp_vars_check_ret1()
127
Warnings:
-Warning 1264 Out of range value for column 'sp_vars_check_ret1()' at row 1
+Warning 1264 Out of range value for column 'sp_vars_check_ret1()' at row 0
SELECT sp_vars_check_ret2();
sp_vars_check_ret2()
127
Warnings:
-Warning 1264 Out of range value for column 'sp_vars_check_ret2()' at row 1
+Warning 1264 Out of range value for column 'sp_vars_check_ret2()' at row 0
SELECT sp_vars_check_ret3();
sp_vars_check_ret3()
0
Warnings:
-Warning 1366 Incorrect integer value: 'Hello, world' for column ``.``.`sp_vars_check_ret3()` at row 1
+Warning 1366 Incorrect integer value: 'Hello, world' for column ``.``.`sp_vars_check_ret3()` at row 0
SELECT sp_vars_check_ret4();
sp_vars_check_ret4()
154.12
Warnings:
-Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
+Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 0
SELECT sp_vars_div_zero();
sp_vars_div_zero()
NULL
@@ -306,20 +306,20 @@ Calling the routines, created in TRADITIONAL mode.
---------------------------------------------------------------
CALL sp_vars_check_dflt();
-ERROR 22003: Out of range value for column 'v1' at row 1
+ERROR 22003: Out of range value for column 'v1' at row 0
CALL sp_vars_check_assignment();
-ERROR 22003: Out of range value for column 'i1' at row 1
+ERROR 22003: Out of range value for column 'i1' at row 0
SELECT sp_vars_check_ret1();
-ERROR 22003: Out of range value for column 'sp_vars_check_ret1()' at row 1
+ERROR 22003: Out of range value for column 'sp_vars_check_ret1()' at row 0
SELECT sp_vars_check_ret2();
-ERROR 22003: Out of range value for column 'sp_vars_check_ret2()' at row 1
+ERROR 22003: Out of range value for column 'sp_vars_check_ret2()' at row 0
SELECT sp_vars_check_ret3();
-ERROR 22007: Incorrect integer value: 'Hello, world' for column ``.``.`sp_vars_check_ret3()` at row 1
+ERROR 22007: Incorrect integer value: 'Hello, world' for column ``.``.`sp_vars_check_ret3()` at row 0
SELECT sp_vars_check_ret4();
sp_vars_check_ret4()
154.12
Warnings:
-Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
+Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 0
SELECT sp_vars_div_zero();
ERROR 22012: Division by 0
SET @@sql_mode = 'ansi';
@@ -385,7 +385,7 @@ FF
HEX(v10)
FF
Warnings:
-Warning 1264 Out of range value for column 'v5' at row 1
+Warning 1264 Out of range value for column 'v5' at row 0
DROP PROCEDURE p1;
---------------------------------------------------------------
@@ -602,7 +602,7 @@ CALL p1('alpha', 'abcdef');
x y
alpha abc
Warnings:
-Warning 1265 Data truncated for column 'y' at row 1
+Warning 1265 Data truncated for column 'y' at row 0
DROP PROCEDURE p1;
---------------------------------------------------------------
@@ -628,7 +628,7 @@ t1 CREATE TABLE "t1" (
"x" datetime DEFAULT NULL
)
Warnings:
-Warning 1265 Data truncated for column 'x' at row 1
+Warning 1265 Data truncated for column 'x' at row 0
DROP PROCEDURE p1;
---------------------------------------------------------------
@@ -777,17 +777,17 @@ SET var := arg;
SELECT arg, var;
END|
CALL p1();
-ERROR 22003: Out of range value for column 'v' at row 1
+ERROR 22003: Out of range value for column 'v' at row 0
CALL p2();
-ERROR 22003: Out of range value for column 'v' at row 1
+ERROR 22003: Out of range value for column 'v' at row 0
CALL p3();
-ERROR 22001: Data too long for column 'v' at row 1
+ERROR 22001: Data too long for column 'v' at row 0
CALL p4('aaa');
-ERROR 22001: Data too long for column 'arg' at row 1
+ERROR 22001: Data too long for column 'arg' at row 0
CALL p5('aa');
-ERROR 22001: Data too long for column 'var' at row 1
+ERROR 22001: Data too long for column 'var' at row 0
CALL p6(10);
-ERROR 22003: Out of range value for column 'var' at row 1
+ERROR 22003: Out of range value for column 'var' at row 0
SET @@sql_mode = 'ansi';
DROP PROCEDURE p1;
DROP PROCEDURE p2;
@@ -817,7 +817,7 @@ CALL p1(1929.003);
var
1929.00
Warnings:
-Note 1265 Data truncated for column 'arg' at row 1
+Note 1265 Data truncated for column 'arg' at row 0
DROP PROCEDURE p1;
---------------------------------------------------------------
@@ -950,17 +950,17 @@ CALL p1('c');
arg
Warnings:
-Warning 1265 Data truncated for column 'arg' at row 1
+Warning 1265 Data truncated for column 'arg' at row 0
CALL p2('a');
arg var
a
Warnings:
-Warning 1265 Data truncated for column 'var' at row 1
+Warning 1265 Data truncated for column 'var' at row 0
SELECT f1('a');
f1('a')
Warnings:
-Warning 1265 Data truncated for column 'f1('a')' at row 1
+Warning 1265 Data truncated for column 'f1('a')' at row 0
DROP PROCEDURE p1;
DROP PROCEDURE p2;
DROP FUNCTION f1;
@@ -1026,11 +1026,11 @@ BEGIN
SELECT arg;
END|
CALL p1((1, 2));
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'tinyint' in assignment of `arg`
CALL p1((SELECT * FROM t1 LIMIT 1));
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'tinyint' in assignment of `arg`
CALL p1((SELECT col1, col2 FROM t1 LIMIT 1));
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'tinyint' in assignment of `arg`
DROP PROCEDURE p1;
DROP TABLE t1;
@@ -1307,7 +1307,7 @@ $$
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE "t1" (
- "var" char(1) DEFAULT NULL
+ "var" varchar(1) DEFAULT NULL
)
DROP TABLE t1;
#
diff --git a/mysql-test/main/sp-vars.test b/mysql-test/main/sp-vars.test
index 9edf245acbe..5e1e07888ca 100644
--- a/mysql-test/main/sp-vars.test
+++ b/mysql-test/main/sp-vars.test
@@ -1221,13 +1221,13 @@ BEGIN
END|
delimiter ;|
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
CALL p1((1, 2));
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
CALL p1((SELECT * FROM t1 LIMIT 1));
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
CALL p1((SELECT col1, col2 FROM t1 LIMIT 1));
#
diff --git a/mysql-test/main/sp.result b/mysql-test/main/sp.result
index 88df800b0e0..37c22e45b45 100644
--- a/mysql-test/main/sp.result
+++ b/mysql-test/main/sp.result
@@ -255,7 +255,7 @@ return i+1|
call sub1("sub1a", (select 7))|
call sub1("sub1b", (select max(i) from t2))|
call sub1("sub1c", (select i,d from t2 limit 1))|
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `x`
call sub1("sub1d", (select 1 from (select 1) a))|
call sub2("sub2")|
select * from t1 order by id|
@@ -3073,14 +3073,14 @@ select bug9775('a'),bug9775('b'),bug9775('c')|
bug9775('a') bug9775('b') bug9775('c')
a b
Warnings:
-Warning 1265 Data truncated for column 'bug9775('c')' at row 1
+Warning 1265 Data truncated for column 'bug9775('c')' at row 0
drop function bug9775|
create function bug9775(v1 int) returns enum('a','b') return v1|
select bug9775(1),bug9775(2),bug9775(3)|
bug9775(1) bug9775(2) bug9775(3)
a b
Warnings:
-Warning 1265 Data truncated for column 'bug9775(3)' at row 1
+Warning 1265 Data truncated for column 'bug9775(3)' at row 0
drop function bug9775|
create function bug9775(v1 char(1)) returns set('a','b') return v1|
select bug9775('a'),bug9775('b'),bug9775('a,b'),bug9775('c')|
@@ -3088,14 +3088,14 @@ bug9775('a') bug9775('b') bug9775('a,b') bug9775('c')
a b a
Warnings:
Warning 1265 Data truncated for column 'v1' at row 1
-Warning 1265 Data truncated for column 'bug9775('c')' at row 1
+Warning 1265 Data truncated for column 'bug9775('c')' at row 0
drop function bug9775|
create function bug9775(v1 int) returns set('a','b') return v1|
select bug9775(1),bug9775(2),bug9775(3),bug9775(4)|
bug9775(1) bug9775(2) bug9775(3) bug9775(4)
a b a,b
Warnings:
-Warning 1265 Data truncated for column 'bug9775(4)' at row 1
+Warning 1265 Data truncated for column 'bug9775(4)' at row 0
drop function bug9775|
drop function if exists bug8861|
create function bug8861(v1 int) returns year return v1|
@@ -3118,10 +3118,10 @@ create procedure bug9004_2(x char(16))
call bug9004_1(x)|
call bug9004_1('12345678901234567')|
Warnings:
-Warning 1265 Data truncated for column 'x' at row 1
+Warning 1265 Data truncated for column 'x' at row 0
call bug9004_2('12345678901234567890')|
Warnings:
-Warning 1265 Data truncated for column 'x' at row 1
+Warning 1265 Data truncated for column 'x' at row 0
delete from t1|
drop procedure bug9004_1|
drop procedure bug9004_2|
@@ -4591,7 +4591,7 @@ call bug15231_3()|
Result
Missed it (correct)
Level Code Message
-Warning 1366 Incorrect decimal value: 'zap' for column ``.``.`x` at row 1
+Warning 1366 Incorrect decimal value: 'zap' for column ``.``.`x` at row 0
Result
Caught it (correct)
call bug15231_5()|
@@ -6438,7 +6438,7 @@ DROP TABLE t1;
CALL p1('text');
Warnings:
-Warning 1265 Data truncated for column 'v' at row 1
+Warning 1265 Data truncated for column 'v' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -6458,7 +6458,7 @@ DROP TABLE t1;
CALL p2('text');
Warnings:
-Warning 1366 Incorrect integer value: 'text' for column ``.``.`v` at row 1
+Warning 1366 Incorrect integer value: 'text' for column ``.``.`v` at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -7070,10 +7070,10 @@ CALL p1(4, 'a');
1
1
Warnings:
-Warning 1265 Data truncated for column 'b' at row 1
-Warning 1265 Data truncated for column 'b' at row 1
-Warning 1265 Data truncated for column 'b' at row 1
-Warning 1265 Data truncated for column 'b' at row 1
+Warning 1265 Data truncated for column 'b' at row 0
+Warning 1265 Data truncated for column 'b' at row 0
+Warning 1265 Data truncated for column 'b' at row 0
+Warning 1265 Data truncated for column 'b' at row 0
SET @@max_sp_recursion_depth= @save_max_sp_recursion;
DROP PROCEDURE p1;
DROP PROCEDURE IF EXISTS p1;
@@ -7091,7 +7091,7 @@ CAST('10 ' as UNSIGNED INTEGER)
1
1
Warnings:
-Warning 1265 Data truncated for column 'a' at row 1
+Warning 1265 Data truncated for column 'a' at row 0
Note 1292 Truncated incorrect INTEGER value: '10 '
DROP PROCEDURE p1;
DROP PROCEDURE IF EXISTS p1;
@@ -7144,7 +7144,7 @@ SELECT f1();
f1()
a
Warnings:
-Warning 1265 Data truncated for column 'f4()' at row 1
+Warning 1265 Data truncated for column 'f4()' at row 0
DROP FUNCTION f1;
DROP FUNCTION f2;
DROP FUNCTION f3;
@@ -8972,3 +8972,15 @@ select @counter;
5
drop function f1;
drop table t1,t2;
+#
+# MDEV-28129: MariaDB UAF issue at lex_end_nops(LEX*)
+#
+CREATE PROCEDURE sp() SELECT 1 INTO @;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+CREATE PROCEDURE sp() SET @=1;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '=1' at line 1
+CREATE PROCEDURE sp() SELECT @;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test
index baf89eeaba5..2e3a492659e 100644
--- a/mysql-test/main/sp.test
+++ b/mysql-test/main/sp.test
@@ -387,7 +387,7 @@ create function sub3(i int) returns int deterministic
call sub1("sub1a", (select 7))|
call sub1("sub1b", (select max(i) from t2))|
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
call sub1("sub1c", (select i,d from t2 limit 1))|
call sub1("sub1d", (select 1 from (select 1) a))|
call sub2("sub2")|
@@ -10556,3 +10556,20 @@ select f1(col1) from t2 order by col2 desc limit 5;
select @counter;
drop function f1;
drop table t1,t2;
+
+--echo #
+--echo # MDEV-28129: MariaDB UAF issue at lex_end_nops(LEX*)
+--echo #
+
+--error ER_PARSE_ERROR
+CREATE PROCEDURE sp() SELECT 1 INTO @;
+
+--error ER_PARSE_ERROR
+CREATE PROCEDURE sp() SET @=1;
+
+--error ER_PARSE_ERROR
+CREATE PROCEDURE sp() SELECT @;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/statistics.result b/mysql-test/main/statistics.result
index 8677b992b03..5ecb439bacc 100644
--- a/mysql-test/main/statistics.result
+++ b/mysql-test/main/statistics.result
@@ -1,9 +1,11 @@
-drop table if exists t1,t2;
+set @SINGLE_PREC_TYPE='single_prec_hb';
+set @DOUBLE_PREC_TYPE='double_prec_hb';
+set @DEFAULT_HIST_TYPE='double_prec_hb';
set @save_use_stat_tables=@@use_stat_tables;
set @save_histogram_size=@@global.histogram_size;
set @@global.histogram_size=0,@@local.histogram_size=0;
-set @save_hist_type=@@histogram_type;
-set histogram_type='single_prec_hb';
+set @save_hist_type=@DEFAULT_HIST_TYPE;
+set histogram_type=@SINGLE_PREC_TYPE;
DELETE FROM mysql.table_stats;
DELETE FROM mysql.column_stats;
DELETE FROM mysql.index_stats;
@@ -220,18 +222,19 @@ test.t1 analyze status Table is already up to date
SELECT db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
-hist_size, hist_type, HEX(histogram)
-FROM mysql.column_stats;
-db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type HEX(histogram)
-test t1 a 0 49 0.0000 1.0000 4 SINGLE_PREC_HB 2E62A1D0
-test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 6.4000 4 SINGLE_PREC_HB 003FBFFF
-test t1 c aaaa dddddddd 0.1250 7.0000 4 SINGLE_PREC_HB 0055AAFF
-test t1 d 1989-03-12 1999-07-23 0.1500 8.5000 4 SINGLE_PREC_HB 001919FF
-test t1 e 0.01 0.112 0.2250 6.2000 4 SINGLE_PREC_HB 000564E1
-test t1 f 1 5 0.2000 6.4000 4 SINGLE_PREC_HB 3F7FBFBF
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t1 a 0 49 0.0000 1.0000 4 SINGLE_PREC_HB 0.180,0.204,0.247,0.184,0.184
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 6.4000 4 SINGLE_PREC_HB 0.000,0.247,0.502,0.251,0.000
+test t1 c aaaa dddddddd 0.1250 7.0000 4 SINGLE_PREC_HB 0.000,0.333,0.333,0.333,0.000
+test t1 d 1989-03-12 1999-07-23 0.1500 8.5000 4 SINGLE_PREC_HB 0.000,0.098,0.000,0.902,0.000
+test t1 e 0.01 0.112 0.2250 6.2000 4 SINGLE_PREC_HB 0.000,0.020,0.373,0.490,0.118
+test t1 f 1 5 0.2000 6.4000 4 SINGLE_PREC_HB 0.247,0.251,0.251,0.000,0.251
DELETE FROM mysql.column_stats;
set histogram_size=8;
-set histogram_type='DOUBLE_PREC_HB';
+set histogram_type=@DOUBLE_PREC_TYPE;
ANALYZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
@@ -239,18 +242,19 @@ test.t1 analyze status Table is already up to date
SELECT db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
-hist_size, hist_type, HEX(histogram)
-FROM mysql.column_stats;
-db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type HEX(histogram)
-test t1 a 0 49 0.0000 1.0000 8 DOUBLE_PREC_HB 052F4363F4A1F9D0
-test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 6.4000 8 DOUBLE_PREC_HB 0000FF3FFFBFFFFF
-test t1 c aaaa dddddddd 0.1250 7.0000 8 DOUBLE_PREC_HB 00005555AAAAFFFF
-test t1 d 1989-03-12 1999-07-23 0.1500 8.5000 8 DOUBLE_PREC_HB 0000031A031AFFFF
-test t1 e 0.01 0.112 0.2250 6.2000 8 DOUBLE_PREC_HB 000005056464E1E1
-test t1 f 1 5 0.2000 6.4000 8 DOUBLE_PREC_HB FF3FFF7FFFBFFFBF
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t1 a 0 49 0.0000 1.0000 8 DOUBLE_PREC_HB 0.18367,0.20407,0.24489,0.18367,0.18369
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 6.4000 8 DOUBLE_PREC_HB 0.00000,0.24999,0.50001,0.25000,0.00000
+test t1 c aaaa dddddddd 0.1250 7.0000 8 DOUBLE_PREC_HB 0.00000,0.33333,0.33333,0.33333,0.00000
+test t1 d 1989-03-12 1999-07-23 0.1500 8.5000 8 DOUBLE_PREC_HB 0.00000,0.10161,0.00000,0.89839,0.00000
+test t1 e 0.01 0.112 0.2250 6.2000 8 DOUBLE_PREC_HB 0.00000,0.01961,0.37255,0.49020,0.11765
+test t1 f 1 5 0.2000 6.4000 8 DOUBLE_PREC_HB 0.24999,0.25000,0.25000,0.00000,0.25000
DELETE FROM mysql.column_stats;
set histogram_size= 0;
-set histogram_type='single_prec_hb';
+set histogram_type=@SINGLE_PREC_TYPE;
ANALYZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
@@ -1476,13 +1480,13 @@ WORLD_INNODB COUNTRYLANGUAGE Percentage 1 2.7640
use world;
set use_stat_tables='preferably';
set histogram_size=100;
-set histogram_type='SINGLE_PREC_HB';
+set histogram_type=@SINGLE_PREC_TYPE;
ANALYZE TABLE CountryLanguage;
set histogram_size=254;
-set histogram_type='DOUBLE_PREC_HB';
+set histogram_type=@DOUBLE_PREC_TYPE;
ANALYZE TABLE City;
FLUSH TABLES;
-select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,hex(histogram),decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='COUNTRYLANGUAGE' and UPPER(column_name) = 'PERCENTAGE';;
+select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='COUNTRYLANGUAGE' and UPPER(column_name) = 'PERCENTAGE';;
UPPER(db_name) WORLD
UPPER(table_name) COUNTRYLANGUAGE
UPPER(column_name) PERCENTAGE
@@ -1493,9 +1497,8 @@ avg_length 4.0000
avg_frequency 2.7640
hist_size 100
hist_type SINGLE_PREC_HB
-hex(histogram) 0000000000000000000000000101010101010101010202020303030304040404050505050606070707080809090A0A0B0C0D0D0E0E0F10111213131415161718191B1C1E202224292A2E33373B4850575F6A76818C9AA7B9C4CFDADFE5EBF0F4F8FAFCFF
decode_histogram(hist_type,histogram) 0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.000,0.000,0.004,0.000,0.000,0.000,0.004,0.000,0.000,0.000,0.004,0.000,0.000,0.000,0.004,0.000,0.004,0.000,0.000,0.004,0.000,0.004,0.000,0.004,0.000,0.004,0.004,0.004,0.000,0.004,0.000,0.004,0.004,0.004,0.004,0.004,0.000,0.004,0.004,0.004,0.004,0.004,0.004,0.008,0.004,0.008,0.008,0.008,0.008,0.020,0.004,0.016,0.020,0.016,0.016,0.051,0.031,0.027,0.031,0.043,0.047,0.043,0.043,0.055,0.051,0.071,0.043,0.043,0.043,0.020,0.024,0.024,0.020,0.016,0.016,0.008,0.008,0.012,0.000
-select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,hex(histogram),decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='CITY' and UPPER(column_name) = 'POPULATION';;
+select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='CITY' and UPPER(column_name) = 'POPULATION';;
UPPER(db_name) WORLD
UPPER(table_name) CITY
UPPER(column_name) POPULATION
@@ -1506,9 +1509,8 @@ avg_length 4.0000
avg_frequency 1.0467
hist_size 254
hist_type DOUBLE_PREC_HB
-hex(histogram) 1F00A1002B023002350238023F02430249024E02520258025D02630268026E02720276027B02800285028C02920297029D02A102A802AC02B402BC02C402CC02D302DA02E302EA02F102F802010305030C03120319031F03290333033D0343034F03590363036D037803840390039A03A603B303C303D103E003F203020412042404330440045304600472047F049104A204B804C804DE04F2040A0526053F0558056F058E05B305D905F4051306380667068406AB06DA06020731075C079407C507F8072E085E08A508DF0824096909CC092E0A760AD50A400BA90B150CAD0C310D240E130F0E103B11B9126B14F0166B192F1CB71FFF240630483FC567
decode_histogram(hist_type,histogram) 0.00047,0.00198,0.00601,0.00008,0.00008,0.00005,0.00011,0.00006,0.00009,0.00008,0.00006,0.00009,0.00008,0.00009,0.00008,0.00009,0.00006,0.00006,0.00008,0.00008,0.00008,0.00011,0.00009,0.00008,0.00009,0.00006,0.00011,0.00006,0.00012,0.00012,0.00012,0.00012,0.00011,0.00011,0.00014,0.00011,0.00011,0.00011,0.00014,0.00006,0.00011,0.00009,0.00011,0.00009,0.00015,0.00015,0.00015,0.00009,0.00018,0.00015,0.00015,0.00015,0.00017,0.00018,0.00018,0.00015,0.00018,0.00020,0.00024,0.00021,0.00023,0.00027,0.00024,0.00024,0.00027,0.00023,0.00020,0.00029,0.00020,0.00027,0.00020,0.00027,0.00026,0.00034,0.00024,0.00034,0.00031,0.00037,0.00043,0.00038,0.00038,0.00035,0.00047,0.00056,0.00058,0.00041,0.00047,0.00056,0.00072,0.00044,0.00060,0.00072,0.00061,0.00072,0.00066,0.00085,0.00075,0.00078,0.00082,0.00073,0.00108,0.00089,0.00105,0.00105,0.00151,0.00150,0.00110,0.00145,0.00163,0.00160,0.00165,0.00232,0.00201,0.00371,0.00365,0.00383,0.00459,0.00583,0.00662,0.00984,0.00969,0.01080,0.01379,0.02063,0.04308,0.05960,0.15816,0.59464
-set histogram_type='single_prec_hb';
+set histogram_type=@SINGLE_PREC_TYPE;
set histogram_size=0;
use test;
DROP DATABASE world;
@@ -1575,10 +1577,11 @@ test.t1 analyze status OK
select db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
-hist_size, hist_type, HEX(histogram)
-FROM mysql.column_stats;
-db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type HEX(histogram)
-test t1 a 1 3 0.0000 1.0000 10 SINGLE_PREC_HB 0000007F7F7F7FFFFFFF
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t1 a 1 3 0.0000 1.0000 10 SINGLE_PREC_HB 0.000,0.000,0.000,0.498,0.000,0.000,0.000,0.502,0.000,0.000,0.000
set histogram_size=default;
drop table t1;
#
@@ -1588,7 +1591,7 @@ drop table t1;
create table t1 ( a int);
insert into t1 values (1),(2),(3),(4),(5);
set histogram_size=10;
-set histogram_type='double_prec_hb';
+set histogram_type=@DOUBLE_PREC_TYPE;
show variables like 'histogram%';
Variable_name Value
histogram_size 10
@@ -1600,12 +1603,13 @@ test.t1 analyze status OK
select db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
-hist_size, hist_type, HEX(histogram)
-FROM mysql.column_stats;
-db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type HEX(histogram)
-test t1 a 1 5 0.0000 1.0000 10 DOUBLE_PREC_HB 0000FF3FFF7FFFBFFFFF
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t1 a 1 5 0.0000 1.0000 10 DOUBLE_PREC_HB 0.00000,0.24999,0.25000,0.25000,0.25000,0.00000
set histogram_size=0;
-set histogram_type='single_prec_hb';
+set histogram_type=@SINGLE_PREC_TYPE;
drop table t1;
#
# Bug mdev-4369: histogram for a column with many distinct values
@@ -1641,10 +1645,10 @@ test.t2 analyze status OK
select db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
-hist_size, hist_type, HEX(histogram)
+hist_size, hist_type, decode_histogram(hist_type,histogram)
FROM mysql.column_stats;
-db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type HEX(histogram)
-test t2 id 1 1024 0.0000 8.0000 63 SINGLE_PREC_HB 03070B0F13171B1F23272B2F33373B3F43474B4F53575B5F63676B6F73777B7F83878B8F93979B9FA3A7ABAFB3B7BBBFC3C7CBCFD3D7DBDFE3E7EBEFF3F7FB
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t2 id 1 1024 0.0000 8.0000 63 SINGLE_PREC_HB 0.012,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016,0.016
set histogram_size=0;
drop table t1, t2;
set use_stat_tables=@save_use_stat_tables;
@@ -1662,9 +1666,9 @@ Level Code Message
select db_name, table_name, column_name,
HEX(min_value), HEX(max_value),
nulls_ratio, avg_frequency,
-hist_size, hist_type, HEX(histogram)
+hist_size, hist_type, decode_histogram(hist_type,histogram)
FROM mysql.column_stats;
-db_name table_name column_name HEX(min_value) HEX(max_value) nulls_ratio avg_frequency hist_size hist_type HEX(histogram)
+db_name table_name column_name HEX(min_value) HEX(max_value) nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
test t1 a D879626AF872675F73E662F8 D879626AF872675F73E662F8 0.0000 1.0000 0 NULL NULL
drop table t1;
#
@@ -1760,12 +1764,12 @@ set use_stat_tables=@save_use_stat_tables;
#
# MDEV-10134 Add full support for DEFAULT
#
-CREATE TABLE t1 (a BLOB, b TEXT DEFAULT DECODE_HISTOGRAM('SINGLE_PREC_HB',a));
+CREATE TABLE t1 (a BLOB, b TEXT DEFAULT DECODE_HISTOGRAM(@SINGLE_PREC_TYPE,a));
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` blob DEFAULT NULL,
- `b` text DEFAULT decode_histogram('SINGLE_PREC_HB',`a`)
+ `b` text DEFAULT decode_histogram(@`SINGLE_PREC_TYPE`,`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO t1 (a) VALUES (0x0000000000000000000000000101010101010101010202020303030304040404050505050606070707080809090A0A0B0C0D0D0E0E0F10111213131415161718191B1C1E202224292A2E33373B4850575F6A76818C9AA7B9C4CFDADFE5EBF0F4F8FAFCFF);
SELECT b FROM t1;
@@ -1878,6 +1882,7 @@ t1 id 1 17384 0.0000 4.0000 14.0000 0.15705,0.15711,0.21463,0.15705,0.15711,0.15
explain select * from t1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 229376
+drop table t0;
drop table t1;
set analyze_sample_percentage=@save_analyze_sample_percentage;
set histogram_size=@save_histogram_size;
diff --git a/mysql-test/main/statistics.test b/mysql-test/main/statistics.test
index 8d9ef79b69f..525836abba8 100644
--- a/mysql-test/main/statistics.test
+++ b/mysql-test/main/statistics.test
@@ -1,15 +1,22 @@
--source include/no_valgrind_without_big.inc
--source include/have_stat_tables.inc
--source include/have_innodb.inc
---disable_warnings
-drop table if exists t1,t2;
---enable_warnings
+
+set @SINGLE_PREC_TYPE='single_prec_hb';
+set @DOUBLE_PREC_TYPE='double_prec_hb';
+set @DEFAULT_HIST_TYPE='double_prec_hb';
+
+if ($histogram_type_override) {
+ eval set @SINGLE_PREC_TYPE=$histogram_type_override;
+ eval set @DOUBLE_PREC_TYPE=$histogram_type_override;
+ eval set @DEFAULT_HIST_TYPE=$histogram_type_override;
+}
set @save_use_stat_tables=@@use_stat_tables;
set @save_histogram_size=@@global.histogram_size;
set @@global.histogram_size=0,@@local.histogram_size=0;
-set @save_hist_type=@@histogram_type;
-set histogram_type='single_prec_hb';
+set @save_hist_type=@DEFAULT_HIST_TYPE;
+set histogram_type=@SINGLE_PREC_TYPE;
DELETE FROM mysql.table_stats;
--sorted_result
@@ -82,6 +89,7 @@ SELECT * FROM mysql.index_stats;
SELECT COUNT(*) FROM t1;
+
SELECT * FROM mysql.column_stats
WHERE db_name='test' AND table_name='t1' AND column_name='a';
SELECT MIN(t1.a), MAX(t1.a),
@@ -178,30 +186,32 @@ DELETE FROM mysql.column_stats;
set histogram_size=4;
ANALYZE TABLE t1;
---sorted_result
+--source include/histogram_replaces.inc
SELECT db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
- hist_size, hist_type, HEX(histogram)
- FROM mysql.column_stats;
+ hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
DELETE FROM mysql.column_stats;
set histogram_size=8;
-set histogram_type='DOUBLE_PREC_HB';
+set histogram_type=@DOUBLE_PREC_TYPE;
ANALYZE TABLE t1;
---sorted_result
+--source include/histogram_replaces.inc
SELECT db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
- hist_size, hist_type, HEX(histogram)
- FROM mysql.column_stats;
+ hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
DELETE FROM mysql.column_stats;
set histogram_size= 0;
-set histogram_type='single_prec_hb';
+set histogram_type=@SINGLE_PREC_TYPE;
ANALYZE TABLE t1;
@@ -653,20 +663,22 @@ use world;
set use_stat_tables='preferably';
--disable_result_log
set histogram_size=100;
-set histogram_type='SINGLE_PREC_HB';
+set histogram_type=@SINGLE_PREC_TYPE;
ANALYZE TABLE CountryLanguage;
set histogram_size=254;
-set histogram_type='DOUBLE_PREC_HB';
+set histogram_type=@DOUBLE_PREC_TYPE;
ANALYZE TABLE City;
FLUSH TABLES;
--enable_result_log
--disable_view_protocol
---query_vertical select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,hex(histogram),decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='COUNTRYLANGUAGE' and UPPER(column_name) = 'PERCENTAGE';
---query_vertical select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,hex(histogram),decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='CITY' and UPPER(column_name) = 'POPULATION';
+--source include/histogram_replaces.inc
+--query_vertical select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='COUNTRYLANGUAGE' and UPPER(column_name) = 'PERCENTAGE';
+--source include/histogram_replaces.inc
+--query_vertical select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='CITY' and UPPER(column_name) = 'POPULATION';
--enable_view_protocol
-set histogram_type='single_prec_hb';
+set histogram_type=@SINGLE_PREC_TYPE;
set histogram_size=0;
use test;
@@ -710,11 +722,13 @@ set histogram_size=10;
analyze table t1 persistent for all;
+--source include/histogram_replaces.inc
select db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
- hist_size, hist_type, HEX(histogram)
- FROM mysql.column_stats;
+ hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
set histogram_size=default;
@@ -729,20 +743,22 @@ create table t1 ( a int);
insert into t1 values (1),(2),(3),(4),(5);
set histogram_size=10;
-set histogram_type='double_prec_hb';
+set histogram_type=@DOUBLE_PREC_TYPE;
show variables like 'histogram%';
analyze table t1 persistent for all;
+--source include/histogram_replaces.inc
select db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
- hist_size, hist_type, HEX(histogram)
- FROM mysql.column_stats;
+ hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
set histogram_size=0;
-set histogram_type='single_prec_hb';
+set histogram_type=@SINGLE_PREC_TYPE;
drop table t1;
@@ -779,10 +795,11 @@ set histogram_size=63;
analyze table t2 persistent for all;
+--source include/histogram_replaces.inc
select db_name, table_name, column_name,
min_value, max_value,
nulls_ratio, avg_frequency,
- hist_size, hist_type, HEX(histogram)
+ hist_size, hist_type, decode_histogram(hist_type,histogram)
FROM mysql.column_stats;
set histogram_size=0;
@@ -800,10 +817,11 @@ insert into t1 values(unhex('D879626AF872675F73E662F8'));
analyze table t1 persistent for all;
show warnings;
+--source include/histogram_replaces.inc
select db_name, table_name, column_name,
HEX(min_value), HEX(max_value),
nulls_ratio, avg_frequency,
- hist_size, hist_type, HEX(histogram)
+ hist_size, hist_type, decode_histogram(hist_type,histogram)
FROM mysql.column_stats;
drop table t1;
@@ -913,11 +931,14 @@ set use_stat_tables=@save_use_stat_tables;
--echo # MDEV-10134 Add full support for DEFAULT
--echo #
-CREATE TABLE t1 (a BLOB, b TEXT DEFAULT DECODE_HISTOGRAM('SINGLE_PREC_HB',a));
+# disable for JSON histograms
+if (!$histogram_type_override) {
+CREATE TABLE t1 (a BLOB, b TEXT DEFAULT DECODE_HISTOGRAM(@SINGLE_PREC_TYPE,a));
SHOW CREATE TABLE t1;
INSERT INTO t1 (a) VALUES (0x0000000000000000000000000101010101010101010202020303030304040404050505050606070707080809090A0A0B0C0D0D0E0E0F10111213131415161718191B1C1E202224292A2E33373B4850575F6A76818C9AA7B9C4CFDADFE5EBF0F4F8FAFCFF);
SELECT b FROM t1;
DROP TABLE t1;
+}
--echo #
--echo # End of 10.2 tests
@@ -964,6 +985,7 @@ INSERT INTO t1 SELECT id+9192 FROM t1;
--echo # This query will should show a full table scan analysis.
--echo #
ANALYZE TABLE t1;
+--source include/histogram_replaces.inc
select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
DECODE_HISTOGRAM(hist_type, histogram)
from mysql.column_stats;
@@ -974,6 +996,7 @@ set analyze_sample_percentage=0.1;
--echo # This query will show an innacurate avg_frequency value.
--echo #
ANALYZE TABLE t1;
+--source include/histogram_replaces.inc
select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
DECODE_HISTOGRAM(hist_type, histogram)
from mysql.column_stats;
@@ -983,6 +1006,7 @@ from mysql.column_stats;
--echo #
set analyze_sample_percentage=25;
ANALYZE TABLE t1;
+--source include/histogram_replaces.inc
select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
DECODE_HISTOGRAM(hist_type, histogram)
from mysql.column_stats;
@@ -993,6 +1017,7 @@ set analyze_sample_percentage=0;
--echo # Test self adjusting sampling level.
--echo #
ANALYZE TABLE t1;
+--source include/histogram_replaces.inc
select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
DECODE_HISTOGRAM(hist_type, histogram)
from mysql.column_stats;
@@ -1004,12 +1029,13 @@ explain select * from t1;
set analyze_sample_percentage=100;
ANALYZE TABLE t1;
+--source include/histogram_replaces.inc
select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
DECODE_HISTOGRAM(hist_type, histogram)
from mysql.column_stats;
explain select * from t1;
-
+drop table t0;
drop table t1;
set analyze_sample_percentage=@save_analyze_sample_percentage;
set histogram_size=@save_histogram_size;
diff --git a/mysql-test/main/statistics_json.result b/mysql-test/main/statistics_json.result
new file mode 100644
index 00000000000..748287152b1
--- /dev/null
+++ b/mysql-test/main/statistics_json.result
@@ -0,0 +1,8354 @@
+#
+# Test that we can store JSON arrays in histogram field mysql.column_stats when histogram_type=JSON
+#
+set @SINGLE_PREC_TYPE='single_prec_hb';
+set @DOUBLE_PREC_TYPE='double_prec_hb';
+set @DEFAULT_HIST_TYPE='double_prec_hb';
+set @SINGLE_PREC_TYPE='JSON_HB';
+set @DOUBLE_PREC_TYPE='JSON_HB';
+set @DEFAULT_HIST_TYPE='JSON_HB';
+set @save_use_stat_tables=@@use_stat_tables;
+set @save_histogram_size=@@global.histogram_size;
+set @@global.histogram_size=0,@@local.histogram_size=0;
+set @save_hist_type=@DEFAULT_HIST_TYPE;
+set histogram_type=@SINGLE_PREC_TYPE;
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
+set use_stat_tables='preferably';
+CREATE TABLE t1 (
+a int NOT NULL PRIMARY KEY,
+b varchar(32),
+c char(16),
+d date,
+e double,
+f bit(3),
+INDEX idx1 (b, e),
+INDEX idx2 (c, d),
+INDEX idx3 (d),
+INDEX idx4 (e, b, d)
+) ENGINE= MYISAM;
+INSERT INTO t1 VALUES
+(0, NULL, NULL, NULL, NULL, NULL),
+(7, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'dddddddd', '1990-05-15', 0.1, b'100'),
+(17, 'vvvvvvvvvvvvv', 'aaaa', '1989-03-12', 0.01, b'101'),
+(1, 'vvvvvvvvvvvvv', NULL, '1989-03-12', 0.01, b'100'),
+(12, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'dddddddd', '1999-07-23', 0.112, b'001'),
+(23, 'vvvvvvvvvvvvv', 'dddddddd', '1999-07-23', 0.1, b'100'),
+(8, 'vvvvvvvvvvvvv', 'aaaa', '1999-07-23', 0.1, b'100'),
+(22, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'aaaa', '1989-03-12', 0.112, b'001'),
+(31, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'aaaa', '1999-07-23', 0.01, b'001'),
+(10, NULL, 'aaaa', NULL, 0.01, b'010'),
+(5, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'dddddddd', '1999-07-23', 0.1, b'100'),
+(15, 'vvvvvvvvvvvvv', 'ccccccccc', '1990-05-15', 0.1, b'010'),
+(30, NULL, 'bbbbbb', NULL, NULL, b'100'),
+(38, 'zzzzzzzzzzzzzzzzzz', 'bbbbbb', NULL, NULL, NULL),
+(18, 'zzzzzzzzzzzzzzzzzz', 'ccccccccc', '1990-05-15', 0.01, b'010'),
+(9, 'yyy', 'bbbbbb', '1998-08-28', 0.01, NULL),
+(29, 'vvvvvvvvvvvvv', 'dddddddd', '1999-07-23', 0.012, b'010'),
+(3, 'yyy', 'dddddddd', '1990-05-15', 0.112, b'010'),
+(39, 'zzzzzzzzzzzzzzzzzz', 'bbbbbb', NULL, 0.01, b'100'),
+(14, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'ccccccccc', '1990-05-15', 0.1, b'100'),
+(40, 'zzzzzzzzzzzzzzzzzz', 'bbbbbb', '1989-03-12', NULL, NULL),
+(44, NULL, 'aaaa', '1989-03-12', NULL, b'010'),
+(19, 'vvvvvvvvvvvvv', 'ccccccccc', '1990-05-15', 0.012, b'011'),
+(21, 'zzzzzzzzzzzzzzzzzz', 'dddddddd', '1989-03-12', 0.112, b'100'),
+(45, NULL, NULL, '1989-03-12', NULL, b'011'),
+(2, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'ccccccccc', '1990-05-15', 0.1, b'001'),
+(35, 'yyy', 'aaaa', '1990-05-15', 0.05, b'011'),
+(4, 'vvvvvvvvvvvvv', 'dddddddd', '1999-07-23', 0.01, b'101'),
+(47, NULL, 'aaaa', '1990-05-15', 0.05, b'010'),
+(42, NULL, 'ccccccccc', '1989-03-12', 0.01, b'010'),
+(32, NULL, 'bbbbbb', '1990-05-15', 0.01, b'011'),
+(49, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww' , 'aaaa', '1990-05-15', NULL, NULL),
+(43, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww' , 'bbbbbb', '1990-05-15', NULL, b'100'),
+(37, 'yyy', NULL, '1989-03-12', 0.05, b'011'),
+(41, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'ccccccccc', '1990-05-15', 0.05, NULL),
+(34, 'yyy', NULL, NULL, NULL, NULL),
+(33, 'zzzzzzzzzzzzzzzzzz', 'dddddddd', '1989-03-12', 0.05, b'011'),
+(24, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'dddddddd', '1990-05-15', 0.01, b'101'),
+(11, 'yyy', 'ccccccccc', '1999-07-23', 0.1, NULL),
+(25, 'zzzzzzzzzzzzzzzzzz', 'bbb', '1989-03-12', 0.01, b'101');
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+40
+SELECT * FROM mysql.column_stats
+WHERE db_name='test' AND table_name='t1' AND column_name='a';
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+SELECT MIN(t1.a), MAX(t1.a),
+(SELECT COUNT(*) FROM t1 WHERE t1.b IS NULL) /
+(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.a)",
+(SELECT COUNT(t1.a) FROM t1) /
+(SELECT COUNT(DISTINCT t1.a) FROM t1) AS "AVG_FREQUENCY(t1.a)"
+FROM t1;
+MIN(t1.a) MAX(t1.a) NULLS_RATIO(t1.a) AVG_FREQUENCY(t1.a)
+0 49 0.2000 1.0000
+SELECT * FROM mysql.column_stats
+WHERE db_name='test' AND table_name='t1' AND column_name='b';
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+SELECT MIN(t1.b), MAX(t1.b),
+(SELECT COUNT(*) FROM t1 WHERE t1.b IS NULL) /
+(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.b)",
+(SELECT COUNT(t1.b) FROM t1) /
+(SELECT COUNT(DISTINCT t1.b) FROM t1) AS "AVG_FREQUENCY(t1.b)"
+FROM t1;
+MIN(t1.b) MAX(t1.b) NULLS_RATIO(t1.b) AVG_FREQUENCY(t1.b)
+vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 6.4000
+SELECT * FROM mysql.column_stats
+WHERE db_name='test' AND table_name='t1' AND column_name='c';
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+SELECT MIN(t1.c), MAX(t1.c),
+(SELECT COUNT(*) FROM t1 WHERE t1.c IS NULL) /
+(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.c)",
+(SELECT COUNT(t1.c) FROM t1) /
+(SELECT COUNT(DISTINCT t1.c) FROM t1) AS "AVG_FREQUENCY(t1.c)"
+FROM t1;
+MIN(t1.c) MAX(t1.c) NULLS_RATIO(t1.c) AVG_FREQUENCY(t1.c)
+aaaa dddddddd 0.1250 7.0000
+SELECT * FROM mysql.column_stats
+WHERE db_name='test' AND table_name='t1' AND column_name='d';
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+SELECT MIN(t1.d), MAX(t1.d),
+(SELECT COUNT(*) FROM t1 WHERE t1.d IS NULL) /
+(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.d)",
+(SELECT COUNT(t1.d) FROM t1) /
+(SELECT COUNT(DISTINCT t1.d) FROM t1) AS "AVG_FREQUENCY(t1.d)"
+FROM t1;
+MIN(t1.d) MAX(t1.d) NULLS_RATIO(t1.d) AVG_FREQUENCY(t1.d)
+1989-03-12 1999-07-23 0.1500 8.5000
+SELECT * FROM mysql.column_stats
+WHERE db_name='test' AND table_name='t1' AND column_name='e';
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+SELECT MIN(t1.e), MAX(t1.e),
+(SELECT COUNT(*) FROM t1 WHERE t1.e IS NULL) /
+(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.e)",
+(SELECT COUNT(t1.e) FROM t1) /
+(SELECT COUNT(DISTINCT t1.e) FROM t1) AS "AVG_FREQUENCY(t1.e)"
+FROM t1;
+MIN(t1.e) MAX(t1.e) NULLS_RATIO(t1.e) AVG_FREQUENCY(t1.e)
+0.01 0.112 0.2250 6.2000
+SELECT * FROM mysql.index_stats
+WHERE db_name='test' AND table_name='t1' AND index_name='idx1';
+db_name table_name index_name prefix_arity avg_frequency
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+SELECT
+(SELECT COUNT(*) FROM t1 WHERE t1.b IS NOT NULL) /
+(SELECT COUNT(DISTINCT t1.b) FROM t1 WHERE t1.b IS NOT NULL)
+AS 'ARITY 1',
+(SELECT COUNT(*) FROM t1 WHERE t1.b IS NOT NULL AND t1.e IS NOT NULL) /
+(SELECT COUNT(DISTINCT t1.b, t1.e) FROM t1
+WHERE t1.b IS NOT NULL AND t1.e IS NOT NULL)
+AS 'ARITY 2';
+ARITY 1 ARITY 2
+6.4000 1.6875
+SELECT * FROM mysql.index_stats
+WHERE db_name='test' AND table_name='t1' AND index_name='idx2';
+db_name table_name index_name prefix_arity avg_frequency
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+SELECT
+(SELECT COUNT(*) FROM t1 WHERE t1.c IS NOT NULL) /
+(SELECT COUNT(DISTINCT t1.c) FROM t1 WHERE t1.c IS NOT NULL)
+AS 'ARITY 1',
+(SELECT COUNT(*) FROM t1 WHERE t1.c IS NOT NULL AND t1.d IS NOT NULL) /
+(SELECT COUNT(DISTINCT t1.c, t1.d) FROM t1
+WHERE t1.c IS NOT NULL AND t1.d IS NOT NULL)
+AS 'ARITY 2';
+ARITY 1 ARITY 2
+7.0000 2.3846
+SELECT * FROM mysql.index_stats
+WHERE db_name='test' AND table_name='t1' AND index_name='idx3';
+db_name table_name index_name prefix_arity avg_frequency
+test t1 idx3 1 8.5000
+SELECT
+(SELECT COUNT(*) FROM t1 WHERE t1.d IS NOT NULL) /
+(SELECT COUNT(DISTINCT t1.d) FROM t1 WHERE t1.d IS NOT NULL)
+AS 'ARITY 1';
+ARITY 1
+8.5000
+SELECT * FROM mysql.index_stats
+WHERE db_name='test' AND table_name='t1' AND index_name='idx4';
+db_name table_name index_name prefix_arity avg_frequency
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+SELECT
+(SELECT COUNT(*) FROM t1 WHERE t1.e IS NOT NULL) /
+(SELECT COUNT(DISTINCT t1.e) FROM t1 WHERE t1.e IS NOT NULL)
+AS 'ARITY 1',
+(SELECT COUNT(*) FROM t1 WHERE t1.e IS NOT NULL AND t1.b IS NOT NULL) /
+(SELECT COUNT(DISTINCT t1.e, t1.b) FROM t1
+WHERE t1.e IS NOT NULL AND t1.b IS NOT NULL)
+AS 'ARITY 2',
+(SELECT COUNT(*) FROM t1
+WHERE t1.e IS NOT NULL AND t1.b IS NOT NULL AND t1.d IS NOT NULL) /
+(SELECT COUNT(DISTINCT t1.e, t1.b, t1.d) FROM t1
+WHERE t1.e IS NOT NULL AND t1.b IS NOT NULL AND t1.d IS NOT NULL)
+AS 'ARITY 3';
+ARITY 1 ARITY 2 ARITY 3
+6.2000 1.6875 1.1304
+DELETE FROM mysql.column_stats;
+set histogram_size=4;
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+SELECT db_name, table_name, column_name,
+min_value, max_value,
+nulls_ratio, avg_frequency,
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t1 a 0 49 0.0000 1.0000 4 JSON_HB {
+ "target_histogram_size": 4,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "0",
+ "size": 0.275,
+ "ndv": 11
+ },
+ {
+ "start": "12",
+ "size": 0.275,
+ "ndv": 11
+ },
+ {
+ "start": "29",
+ "size": 0.275,
+ "ndv": 11
+ },
+ {
+ "start": "41",
+ "end": "49",
+ "size": 0.175,
+ "ndv": 7
+ }
+ ]
+}
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 6.4000 4 JSON_HB {
+ "target_histogram_size": 4,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "vvvvvvvvvvvvv",
+ "size": 0.28125,
+ "ndv": 2
+ },
+ {
+ "start": "wwwwwwwwwwwwwwwwwwwwwwwwwwww",
+ "size": 0.28125,
+ "ndv": 2
+ },
+ {
+ "start": "xxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "size": 0.28125,
+ "ndv": 3
+ },
+ {
+ "start": "zzzzzzzzzzzzzzzzzz",
+ "end": "zzzzzzzzzzzzzzzzzz",
+ "size": 0.15625,
+ "ndv": 1
+ }
+ ]
+}
+test t1 c aaaa dddddddd 0.1250 7.0000 4 JSON_HB {
+ "target_histogram_size": 4,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "aaaa",
+ "size": 0.257142857,
+ "ndv": 1
+ },
+ {
+ "start": "bbb",
+ "size": 0.257142857,
+ "ndv": 3
+ },
+ {
+ "start": "ccccccccc",
+ "size": 0.257142857,
+ "ndv": 2
+ },
+ {
+ "start": "dddddddd",
+ "end": "dddddddd",
+ "size": 0.228571429,
+ "ndv": 1
+ }
+ ]
+}
+test t1 d 1989-03-12 1999-07-23 0.1500 8.5000 3 JSON_HB {
+ "target_histogram_size": 4,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1989-03-12",
+ "size": 0.323529412,
+ "ndv": 1
+ },
+ {
+ "start": "1990-05-15",
+ "size": 0.411764706,
+ "ndv": 1
+ },
+ {
+ "start": "1998-08-28",
+ "end": "1999-07-23",
+ "size": 0.264705882,
+ "ndv": 2
+ }
+ ]
+}
+test t1 e 0.01 0.112 0.2250 6.2000 4 JSON_HB {
+ "target_histogram_size": 4,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "0.01",
+ "size": 0.387096774,
+ "ndv": 1
+ },
+ {
+ "start": "0.012",
+ "size": 0.258064516,
+ "ndv": 3
+ },
+ {
+ "start": "0.1",
+ "size": 0.258064516,
+ "ndv": 2
+ },
+ {
+ "start": "0.112",
+ "end": "0.112",
+ "size": 0.096774194,
+ "ndv": 1
+ }
+ ]
+}
+test t1 f 1 5 0.2000 6.4000 4 JSON_HB {
+ "target_histogram_size": 4,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start_hex": "01",
+ "size": 0.28125,
+ "ndv": 2
+ },
+ {
+ "start_hex": "02",
+ "size": 0.28125,
+ "ndv": 2
+ },
+ {
+ "start_hex": "04",
+ "size": 0.3125,
+ "ndv": 1
+ },
+ {
+ "start_hex": "05",
+ "end_hex": "05",
+ "size": 0.125,
+ "ndv": 1
+ }
+ ]
+}
+DELETE FROM mysql.column_stats;
+set histogram_size=8;
+set histogram_type=@DOUBLE_PREC_TYPE;
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+SELECT db_name, table_name, column_name,
+min_value, max_value,
+nulls_ratio, avg_frequency,
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t1 a 0 49 0.0000 1.0000 7 JSON_HB {
+ "target_histogram_size": 8,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "0",
+ "size": 0.15,
+ "ndv": 6
+ },
+ {
+ "start": "7",
+ "size": 0.15,
+ "ndv": 6
+ },
+ {
+ "start": "14",
+ "size": 0.15,
+ "ndv": 6
+ },
+ {
+ "start": "22",
+ "size": 0.15,
+ "ndv": 6
+ },
+ {
+ "start": "31",
+ "size": 0.15,
+ "ndv": 6
+ },
+ {
+ "start": "38",
+ "size": 0.15,
+ "ndv": 6
+ },
+ {
+ "start": "44",
+ "end": "49",
+ "size": 0.1,
+ "ndv": 4
+ }
+ ]
+}
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 6.4000 5 JSON_HB {
+ "target_histogram_size": 8,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "vvvvvvvvvvvvv",
+ "size": 0.25,
+ "ndv": 1
+ },
+ {
+ "start": "wwwwwwwwwwwwwwwwwwwwwwwwwwww",
+ "size": 0.21875,
+ "ndv": 1
+ },
+ {
+ "start": "xxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "size": 0.125,
+ "ndv": 1
+ },
+ {
+ "start": "yyy",
+ "size": 0.1875,
+ "ndv": 1
+ },
+ {
+ "start": "zzzzzzzzzzzzzzzzzz",
+ "end": "zzzzzzzzzzzzzzzzzz",
+ "size": 0.21875,
+ "ndv": 1
+ }
+ ]
+}
+test t1 c aaaa dddddddd 0.1250 7.0000 5 JSON_HB {
+ "target_histogram_size": 8,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "aaaa",
+ "size": 0.257142857,
+ "ndv": 1
+ },
+ {
+ "start": "bbb",
+ "size": 0.142857143,
+ "ndv": 2
+ },
+ {
+ "start": "bbbbbb",
+ "size": 0.085714286,
+ "ndv": 1
+ },
+ {
+ "start": "ccccccccc",
+ "size": 0.228571429,
+ "ndv": 1
+ },
+ {
+ "start": "dddddddd",
+ "end": "dddddddd",
+ "size": 0.285714286,
+ "ndv": 1
+ }
+ ]
+}
+test t1 d 1989-03-12 1999-07-23 0.1500 8.5000 4 JSON_HB {
+ "target_histogram_size": 8,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1989-03-12",
+ "size": 0.323529412,
+ "ndv": 1
+ },
+ {
+ "start": "1990-05-15",
+ "size": 0.411764706,
+ "ndv": 1
+ },
+ {
+ "start": "1998-08-28",
+ "size": 0.147058824,
+ "ndv": 2
+ },
+ {
+ "start": "1999-07-23",
+ "end": "1999-07-23",
+ "size": 0.117647059,
+ "ndv": 1
+ }
+ ]
+}
+test t1 e 0.01 0.112 0.2250 6.2000 5 JSON_HB {
+ "target_histogram_size": 8,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "0.01",
+ "size": 0.387096774,
+ "ndv": 1
+ },
+ {
+ "start": "0.012",
+ "size": 0.129032258,
+ "ndv": 2
+ },
+ {
+ "start": "0.05",
+ "size": 0.096774194,
+ "ndv": 1
+ },
+ {
+ "start": "0.1",
+ "size": 0.258064516,
+ "ndv": 1
+ },
+ {
+ "start": "0.112",
+ "end": "0.112",
+ "size": 0.129032258,
+ "ndv": 1
+ }
+ ]
+}
+test t1 f 1 5 0.2000 6.4000 5 JSON_HB {
+ "target_histogram_size": 8,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start_hex": "01",
+ "size": 0.125,
+ "ndv": 1
+ },
+ {
+ "start_hex": "02",
+ "size": 0.25,
+ "ndv": 1
+ },
+ {
+ "start_hex": "03",
+ "size": 0.1875,
+ "ndv": 1
+ },
+ {
+ "start_hex": "04",
+ "size": 0.3125,
+ "ndv": 1
+ },
+ {
+ "start_hex": "05",
+ "end_hex": "05",
+ "size": 0.125,
+ "ndv": 1
+ }
+ ]
+}
+DELETE FROM mysql.column_stats;
+set histogram_size= 0;
+set histogram_type=@SINGLE_PREC_TYPE;
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+CREATE TABLE t3 (
+a int NOT NULL PRIMARY KEY,
+b varchar(32),
+c char(16),
+INDEX idx (c)
+) ENGINE=MYISAM;
+INSERT INTO t3 VALUES
+(0, NULL, NULL),
+(7, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'dddddddd'),
+(17, 'vvvvvvvvvvvvv', 'aaaa'),
+(1, 'vvvvvvvvvvvvv', NULL),
+(12, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'dddddddd'),
+(23, 'vvvvvvvvvvvvv', 'dddddddd'),
+(8, 'vvvvvvvvvvvvv', 'aaaa'),
+(22, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'aaaa'),
+(31, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'aaaa'),
+(10, NULL, 'aaaa'),
+(5, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'dddddddd'),
+(15, 'vvvvvvvvvvvvv', 'ccccccccc'),
+(30, NULL, 'bbbbbb'),
+(38, 'zzzzzzzzzzzzzzzzzz', 'bbbbbb'),
+(18, 'zzzzzzzzzzzzzzzzzz', 'ccccccccc'),
+(9, 'yyy', 'bbbbbb'),
+(29, 'vvvvvvvvvvvvv', 'dddddddd');
+ANALYZE TABLE t3;
+Table Op Msg_type Msg_text
+test.t3 analyze status Engine-independent statistics collected
+test.t3 analyze status OK
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+test t3 17
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+test t3 a 0 38 0.0000 4.0000 1.0000 0 NULL NULL
+test t3 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.1765 18.0714 2.8000 0 NULL NULL
+test t3 c aaaa dddddddd 0.1176 6.4000 3.7500 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+test t3 PRIMARY 1 1.0000
+test t3 idx 1 3.7500
+ALTER TABLE t1 RENAME TO s1;
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test s1 40
+test t3 17
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test s1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test s1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test s1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test s1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test s1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test s1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+test t3 a 0 38 0.0000 4.0000 1.0000 0 NULL NULL
+test t3 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.1765 18.0714 2.8000 0 NULL NULL
+test t3 c aaaa dddddddd 0.1176 6.4000 3.7500 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test s1 PRIMARY 1 1.0000
+test s1 idx1 1 6.4000
+test s1 idx1 2 1.6875
+test s1 idx2 1 7.0000
+test s1 idx2 2 2.3846
+test s1 idx3 1 8.5000
+test s1 idx4 1 6.2000
+test s1 idx4 2 1.6875
+test s1 idx4 3 1.1304
+test t3 PRIMARY 1 1.0000
+test t3 idx 1 3.7500
+RENAME TABLE s1 TO t1;
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+test t3 17
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+test t3 a 0 38 0.0000 4.0000 1.0000 0 NULL NULL
+test t3 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.1765 18.0714 2.8000 0 NULL NULL
+test t3 c aaaa dddddddd 0.1176 6.4000 3.7500 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+test t3 PRIMARY 1 1.0000
+test t3 idx 1 3.7500
+DROP TABLE t3;
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+CREATE TEMPORARY TABLE t0 (
+a int NOT NULL PRIMARY KEY,
+b varchar(32)
+);
+INSERT INTO t0 SELECT a,b FROM t1;
+ALTER TABLE t1 CHANGE COLUMN b x varchar(32),
+CHANGE COLUMN e y double;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `x` varchar(32) DEFAULT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `y` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`x`,`y`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`y`,`x`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+test t1 x vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 y 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+ALTER TABLE t1 CHANGE COLUMN x b varchar(32),
+CHANGE COLUMN y e double;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `b` varchar(32) DEFAULT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`b`,`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`e`,`b`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+ALTER TABLE t1 RENAME TO s1, CHANGE COLUMN b x varchar(32);
+SHOW CREATE TABLE s1;
+Table Create Table
+s1 CREATE TABLE `s1` (
+ `a` int(11) NOT NULL,
+ `x` varchar(32) DEFAULT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`x`,`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`e`,`x`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test s1 40
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test s1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test s1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test s1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test s1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test s1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+test s1 x vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test s1 PRIMARY 1 1.0000
+test s1 idx1 1 6.4000
+test s1 idx1 2 1.6875
+test s1 idx2 1 7.0000
+test s1 idx2 2 2.3846
+test s1 idx3 1 8.5000
+test s1 idx4 1 6.2000
+test s1 idx4 2 1.6875
+test s1 idx4 3 1.1304
+ALTER TABLE s1 RENAME TO t1, CHANGE COLUMN x b varchar(32);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `b` varchar(32) DEFAULT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`b`,`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`e`,`b`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+ALTER TABLE t1 CHANGE COLUMN b x varchar(30);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `x` varchar(30) DEFAULT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`x`,`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`e`,`x`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+ALTER TABLE t1 CHANGE COLUMN x b varchar(32);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `b` varchar(32) DEFAULT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`b`,`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`e`,`b`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(b) INDEXES(idx1, idx4);
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+SELECT * INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/save_column_stats'
+ FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
+ FROM mysql.column_stats WHERE column_name='b';
+SELECT * INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/save_index_stats'
+ FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
+ FROM mysql.index_stats WHERE index_name IN ('idx1', 'idx4');
+ALTER TABLE t1 CHANGE COLUMN b x varchar(30);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `x` varchar(30) DEFAULT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`x`,`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`e`,`x`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+ALTER TABLE t1 CHANGE COLUMN x b varchar(32);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `b` varchar(32) DEFAULT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`b`,`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`e`,`b`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/save_column_stats'
+ INTO TABLE mysql.column_stats
+FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';
+LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/save_index_stats'
+ INTO TABLE mysql.index_stats
+FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+ALTER TABLE t1 DROP COLUMN b;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`e`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+DROP INDEX idx2 ON t1;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx1` (`e`),
+ KEY `idx3` (`d`),
+ KEY `idx4` (`e`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx3 1 8.5000
+DROP INDEX idx1 ON t1;
+DROP INDEX idx4 ON t1;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx3` (`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ALTER TABLE t1 ADD COLUMN b varchar(32);
+CREATE INDEX idx1 ON t1(b, e);
+CREATE INDEX idx2 ON t1(c, d);
+CREATE INDEX idx4 ON t1(e, b, d);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ `b` varchar(32) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx3` (`d`),
+ KEY `idx1` (`b`,`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx4` (`e`,`b`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx3 1 8.5000
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(b) INDEXES(idx1, idx2, idx4);
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b NULL NULL 1.0000 NULL NULL 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 NULL
+test t1 idx1 2 NULL
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 NULL
+test t1 idx4 3 NULL
+UPDATE t1 SET b=(SELECT b FROM t0 WHERE t0.a= t1.a);
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(b) INDEXES(idx1, idx2, idx4);
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+ALTER TABLE t1 DROP COLUMN b,
+DROP INDEX idx1, DROP INDEX idx2, DROP INDEX idx4;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx3` (`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx3 1 8.5000
+ALTER TABLE t1 ADD COLUMN b varchar(32);
+ALTER TABLE t1
+ADD INDEX idx1 (b, e), ADD INDEX idx2 (c, d), ADD INDEX idx4 (e, b, d);
+UPDATE t1 SET b=(SELECT b FROM t0 WHERE t0.a= t1.a);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `c` char(16) DEFAULT NULL,
+ `d` date DEFAULT NULL,
+ `e` double DEFAULT NULL,
+ `f` bit(3) DEFAULT NULL,
+ `b` varchar(32) DEFAULT NULL,
+ PRIMARY KEY (`a`),
+ KEY `idx3` (`d`),
+ KEY `idx1` (`b`,`e`),
+ KEY `idx2` (`c`,`d`),
+ KEY `idx4` (`e`,`b`,`d`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx3 1 8.5000
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(b) INDEXES(idx1, idx2, idx4);
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS() INDEXES();
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(c,e,b) INDEXES(idx2,idx4);
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+DELETE FROM mysql.index_stats WHERE table_name='t1' AND index_name='primary';
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS() INDEXES(primary);
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS ALL INDEXES ALL;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t1 idx4 3 1.1304
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ENGINE=InnoDB;
+INSERT INTO t2 SELECT * FROM t1;
+set optimizer_switch='extended_keys=off';
+ANALYZE TABLE t2;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+test t2 40
+SELECT * FROM mysql.column_stats ORDER BY column_name, table_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t2 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t2 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t2 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t2 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t2 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+test t2 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t2 PRIMARY 1 1.0000
+test t1 idx1 1 6.4000
+test t2 idx1 1 6.4000
+test t1 idx1 2 1.6875
+test t2 idx1 2 1.6875
+test t1 idx2 1 7.0000
+test t2 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t2 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t2 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t2 idx4 1 6.2000
+test t1 idx4 2 1.6875
+test t2 idx4 2 1.6875
+test t1 idx4 3 1.1304
+test t2 idx4 3 1.1304
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
+set optimizer_switch='extended_keys=on';
+ANALYZE TABLE t2;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t2 40
+SELECT * FROM mysql.column_stats ORDER BY column_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t2 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t2 b vvvvvvvvvvvvv zzzzzzzzzzzzzzzzzz 0.2000 17.1250 6.4000 0 NULL NULL
+test t2 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t2 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t2 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t2 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 PRIMARY 1 1.0000
+test t2 idx1 1 6.4000
+test t2 idx1 2 1.6875
+test t2 idx1 3 1.0000
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx2 3 1.0000
+test t2 idx3 1 8.5000
+test t2 idx3 2 1.0000
+test t2 idx4 1 6.2000
+test t2 idx4 2 1.6875
+test t2 idx4 3 1.1304
+test t2 idx4 4 1.0000
+ALTER TABLE t2 DROP PRIMARY KEY, DROP INDEX idx1;
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx3 1 8.5000
+test t2 idx4 1 6.2000
+test t2 idx4 2 1.6875
+test t2 idx4 3 1.1304
+UPDATE t2 SET b=0 WHERE b IS NULL;
+ALTER TABLE t2 ADD PRIMARY KEY (a,b);
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx3 1 8.5000
+test t2 idx4 1 6.2000
+test t2 idx4 2 1.6875
+test t2 idx4 3 1.1304
+ANALYZE TABLE t2 PERSISTENT FOR COLUMNS() INDEXES ALL;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 PRIMARY 1 1.0000
+test t2 PRIMARY 2 1.0000
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx2 3 1.0000
+test t2 idx2 4 1.0000
+test t2 idx3 1 8.5000
+test t2 idx3 2 1.0000
+test t2 idx3 3 1.0000
+test t2 idx4 1 6.2000
+test t2 idx4 2 1.7222
+test t2 idx4 3 1.1154
+test t2 idx4 4 1.0000
+ALTER TABLE t2 CHANGE COLUMN b b varchar(30);
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx3 1 8.5000
+ANALYZE TABLE t2 PERSISTENT FOR COLUMNS ALL INDEXES ALL;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 PRIMARY 1 1.0000
+test t2 PRIMARY 2 1.0000
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx2 3 1.0000
+test t2 idx2 4 1.0000
+test t2 idx3 1 8.5000
+test t2 idx3 2 1.0000
+test t2 idx3 3 1.0000
+test t2 idx4 1 6.2000
+test t2 idx4 2 1.7222
+test t2 idx4 3 1.1154
+test t2 idx4 4 1.0000
+ALTER TABLE t2 CHANGE COLUMN b b varchar(32);
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 PRIMARY 1 1.0000
+test t2 PRIMARY 2 1.0000
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx2 3 1.0000
+test t2 idx2 4 1.0000
+test t2 idx3 1 8.5000
+test t2 idx3 2 1.0000
+test t2 idx3 3 1.0000
+test t2 idx4 1 6.2000
+test t2 idx4 2 1.7222
+test t2 idx4 3 1.1154
+test t2 idx4 4 1.0000
+ANALYZE TABLE t2 PERSISTENT FOR COLUMNS ALL INDEXES ALL;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 PRIMARY 1 1.0000
+test t2 PRIMARY 2 1.0000
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx2 3 1.0000
+test t2 idx2 4 1.0000
+test t2 idx3 1 8.5000
+test t2 idx3 2 1.0000
+test t2 idx3 3 1.0000
+test t2 idx4 1 6.2000
+test t2 idx4 2 1.7222
+test t2 idx4 3 1.1154
+test t2 idx4 4 1.0000
+ALTER TABLE t2 DROP COLUMN b, DROP PRIMARY KEY, ADD PRIMARY KEY(a);
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx3 1 8.5000
+ANALYZE TABLE t2 PERSISTENT FOR COLUMNS() INDEXES ALL;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+SELECT * FROM mysql.index_stats ORDER BY index_name, prefix_arity, table_name;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 PRIMARY 1 1.0000
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx2 3 1.0000
+test t2 idx3 1 8.5000
+test t2 idx3 2 1.0000
+test t2 idx4 1 6.2000
+test t2 idx4 2 2.2308
+test t2 idx4 3 1.0000
+set optimizer_switch='extended_keys=off';
+ALTER TABLE t1
+DROP INDEX idx1,
+DROP INDEX idx4;
+ALTER TABLE t1
+MODIFY COLUMN b text,
+ADD INDEX idx1 (b(4), e),
+ADD INDEX idx4 (e, b(4), d);
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t2 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t2 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t2 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t2 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t2 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t2 PRIMARY 1 1.0000
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx2 3 1.0000
+test t2 idx3 1 8.5000
+test t2 idx3 2 1.0000
+test t2 idx4 1 6.2000
+test t2 idx4 2 2.2308
+test t2 idx4 3 1.0000
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze Warning Engine-independent statistics are not collected for column 'b'
+test.t1 analyze status OK
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+test t2 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t2 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t2 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t2 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t2 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 NULL
+test t1 idx1 2 NULL
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 NULL
+test t1 idx4 3 NULL
+test t2 PRIMARY 1 1.0000
+test t2 idx2 1 7.0000
+test t2 idx2 2 2.3846
+test t2 idx2 3 1.0000
+test t2 idx3 1 8.5000
+test t2 idx3 2 1.0000
+test t2 idx4 1 6.2000
+test t2 idx4 2 2.2308
+test t2 idx4 3 1.0000
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
+ANALYZE TABLE mysql.column_stats PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+mysql.column_stats analyze error Invalid argument
+ANALYZE TABLE mysql.column_stats;
+Table Op Msg_type Msg_text
+mysql.column_stats analyze status OK
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+set use_stat_tables='never';
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze Warning Engine-independent statistics are not collected for column 'b'
+test.t1 analyze status Table is already up to date
+SELECT * FROM mysql.table_stats;
+db_name table_name cardinality
+test t1 40
+SELECT * FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 49 0.0000 4.0000 1.0000 0 NULL NULL
+test t1 c aaaa dddddddd 0.1250 6.6571 7.0000 0 NULL NULL
+test t1 d 1989-03-12 1999-07-23 0.1500 3.0000 8.5000 0 NULL NULL
+test t1 e 0.01 0.112 0.2250 8.0000 6.2000 0 NULL NULL
+test t1 f 1 5 0.2000 1.0000 6.4000 0 NULL NULL
+SELECT * FROM mysql.index_stats;
+db_name table_name index_name prefix_arity avg_frequency
+test t1 PRIMARY 1 1.0000
+test t1 idx1 1 NULL
+test t1 idx1 2 NULL
+test t1 idx2 1 7.0000
+test t1 idx2 2 2.3846
+test t1 idx3 1 8.5000
+test t1 idx4 1 6.2000
+test t1 idx4 2 NULL
+test t1 idx4 3 NULL
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(b) INDEXES();
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze Warning Engine-independent statistics are not collected for column 'b'
+test.t1 analyze status Table is already up to date
+ANALYZE TABLE t1 PERSISTENT FOR columns(a,b) INDEXES();
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze Warning Engine-independent statistics are not collected for column 'b'
+test.t1 analyze status Table is already up to date
+ANALYZE TABLE t1 PERSISTENT FOR columns(b) indexes(idx2);
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze Warning Engine-independent statistics are not collected for column 'b'
+test.t1 analyze status Table is already up to date
+ANALYZE TABLE t1 PERSISTENT FOR columns() indexes(idx2);
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
+DROP TABLE t1,t2;
+set names utf8;
+CREATE DATABASE world;
+use world;
+CREATE TABLE Country (
+Code char(3) NOT NULL default '',
+Name char(52) NOT NULL default '',
+SurfaceArea float(10,2) NOT NULL default '0.00',
+Population int(11) NOT NULL default '0',
+Capital int(11) default NULL,
+PRIMARY KEY (Code),
+UNIQUE INDEX (Name)
+) CHARACTER SET utf8 COLLATE utf8_bin;
+CREATE TABLE City (
+ID int(11) NOT NULL auto_increment,
+Name char(35) NOT NULL default '',
+Country char(3) NOT NULL default '',
+Population int(11) NOT NULL default '0',
+PRIMARY KEY (ID),
+INDEX (Population),
+INDEX (Country)
+) CHARACTER SET utf8 COLLATE utf8_bin;
+CREATE TABLE CountryLanguage (
+Country char(3) NOT NULL default '',
+Language char(30) NOT NULL default '',
+Percentage float(3,1) NOT NULL default '0.0',
+PRIMARY KEY (Country, Language),
+INDEX (Percentage)
+) CHARACTER SET utf8 COLLATE utf8_bin;
+set use_stat_tables='preferably';
+ANALYZE TABLE Country, City, CountryLanguage;
+SELECT UPPER(db_name), UPPER(table_name), cardinality
+FROM mysql.table_stats;
+UPPER(db_name) UPPER(table_name) cardinality
+WORLD CITY 4079
+WORLD COUNTRY 239
+WORLD COUNTRYLANGUAGE 984
+SELECT UPPER(db_name), UPPER(table_name),
+column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency
+FROM mysql.column_stats;
+UPPER(db_name) UPPER(table_name) column_name min_value max_value nulls_ratio avg_length avg_frequency
+WORLD CITY Country ABW ZWE 0.0000 3.0000 17.5819
+WORLD CITY ID 1 4079 0.0000 4.0000 1.0000
+WORLD CITY Name A Coruña (La Coruña) Ürgenc 0.0000 8.6416 1.0195
+WORLD CITY Population 42 10500000 0.0000 4.0000 1.0467
+WORLD COUNTRY Capital 1 4074 0.0293 4.0000 1.0000
+WORLD COUNTRY Code ABW ZWE 0.0000 3.0000 1.0000
+WORLD COUNTRY Name Afghanistan Zimbabwe 0.0000 10.1088 1.0000
+WORLD COUNTRY Population 0 1277558000 0.0000 4.0000 1.0575
+WORLD COUNTRY SurfaceArea 0.40 17075400.00 0.0000 4.0000 1.0042
+WORLD COUNTRYLANGUAGE Country ABW ZWE 0.0000 3.0000 4.2232
+WORLD COUNTRYLANGUAGE Language Abhyasi [South]Mande 0.0000 7.1778 2.1532
+WORLD COUNTRYLANGUAGE Percentage 0.0 99.9 0.0000 4.0000 2.7640
+SELECT UPPER(db_name), UPPER(table_name),
+index_name, prefix_arity, avg_frequency
+FROM mysql.index_stats;
+UPPER(db_name) UPPER(table_name) index_name prefix_arity avg_frequency
+WORLD CITY Country 1 17.5819
+WORLD CITY PRIMARY 1 1.0000
+WORLD CITY Population 1 1.0467
+WORLD COUNTRY Name 1 1.0000
+WORLD COUNTRY PRIMARY 1 1.0000
+WORLD COUNTRYLANGUAGE PRIMARY 1 4.2232
+WORLD COUNTRYLANGUAGE PRIMARY 2 1.0000
+WORLD COUNTRYLANGUAGE Percentage 1 2.7640
+use test;
+set use_stat_tables='never';
+CREATE DATABASE world_innodb;
+use world_innodb;
+CREATE TABLE Country (
+Code char(3) NOT NULL default '',
+Name char(52) NOT NULL default '',
+SurfaceArea float(10,2) NOT NULL default '0.00',
+Population int(11) NOT NULL default '0',
+Capital int(11) default NULL,
+PRIMARY KEY (Code),
+UNIQUE INDEX (Name)
+) CHARACTER SET utf8 COLLATE utf8_bin;
+CREATE TABLE City (
+ID int(11) NOT NULL auto_increment,
+Name char(35) NOT NULL default '',
+Country char(3) NOT NULL default '',
+Population int(11) NOT NULL default '0',
+PRIMARY KEY (ID),
+INDEX (Population),
+INDEX (Country)
+) CHARACTER SET utf8 COLLATE utf8_bin;
+CREATE TABLE CountryLanguage (
+Country char(3) NOT NULL default '',
+Language char(30) NOT NULL default '',
+Percentage float(3,1) NOT NULL default '0.0',
+PRIMARY KEY (Country, Language),
+INDEX (Percentage)
+) CHARACTER SET utf8 COLLATE utf8_bin;
+ALTER TABLE Country ENGINE=InnoDB;
+ALTER TABLE City ENGINE=InnoDB;
+ALTER TABLE CountryLanguage ENGINE=InnoDB;
+set use_stat_tables='preferably';
+ANALYZE TABLE Country, City, CountryLanguage;
+SELECT UPPER(db_name), UPPER(table_name), cardinality
+FROM mysql.table_stats;
+UPPER(db_name) UPPER(table_name) cardinality
+WORLD CITY 4079
+WORLD COUNTRY 239
+WORLD COUNTRYLANGUAGE 984
+WORLD_INNODB CITY 4079
+WORLD_INNODB COUNTRY 239
+WORLD_INNODB COUNTRYLANGUAGE 984
+SELECT UPPER(db_name), UPPER(table_name),
+column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency
+FROM mysql.column_stats;
+UPPER(db_name) UPPER(table_name) column_name min_value max_value nulls_ratio avg_length avg_frequency
+WORLD CITY Country ABW ZWE 0.0000 3.0000 17.5819
+WORLD CITY ID 1 4079 0.0000 4.0000 1.0000
+WORLD CITY Name A Coruña (La Coruña) Ürgenc 0.0000 8.6416 1.0195
+WORLD CITY Population 42 10500000 0.0000 4.0000 1.0467
+WORLD COUNTRY Capital 1 4074 0.0293 4.0000 1.0000
+WORLD COUNTRY Code ABW ZWE 0.0000 3.0000 1.0000
+WORLD COUNTRY Name Afghanistan Zimbabwe 0.0000 10.1088 1.0000
+WORLD COUNTRY Population 0 1277558000 0.0000 4.0000 1.0575
+WORLD COUNTRY SurfaceArea 0.40 17075400.00 0.0000 4.0000 1.0042
+WORLD COUNTRYLANGUAGE Country ABW ZWE 0.0000 3.0000 4.2232
+WORLD COUNTRYLANGUAGE Language Abhyasi [South]Mande 0.0000 7.1778 2.1532
+WORLD COUNTRYLANGUAGE Percentage 0.0 99.9 0.0000 4.0000 2.7640
+WORLD_INNODB CITY Country ABW ZWE 0.0000 3.0000 17.5819
+WORLD_INNODB CITY ID 1 4079 0.0000 4.0000 1.0000
+WORLD_INNODB CITY Name A Coruña (La Coruña) Ürgenc 0.0000 8.6416 1.0195
+WORLD_INNODB CITY Population 42 10500000 0.0000 4.0000 1.0467
+WORLD_INNODB COUNTRY Capital 1 4074 0.0293 4.0000 1.0000
+WORLD_INNODB COUNTRY Code ABW ZWE 0.0000 3.0000 1.0000
+WORLD_INNODB COUNTRY Name Afghanistan Zimbabwe 0.0000 10.1088 1.0000
+WORLD_INNODB COUNTRY Population 0 1277558000 0.0000 4.0000 1.0575
+WORLD_INNODB COUNTRY SurfaceArea 0.40 17075400.00 0.0000 4.0000 1.0042
+WORLD_INNODB COUNTRYLANGUAGE Country ABW ZWE 0.0000 3.0000 4.2232
+WORLD_INNODB COUNTRYLANGUAGE Language Abhyasi [South]Mande 0.0000 7.1778 2.1532
+WORLD_INNODB COUNTRYLANGUAGE Percentage 0.0 99.9 0.0000 4.0000 2.7640
+SELECT UPPER(db_name), UPPER(table_name),
+index_name, prefix_arity, avg_frequency
+FROM mysql.index_stats;
+UPPER(db_name) UPPER(table_name) index_name prefix_arity avg_frequency
+WORLD CITY Country 1 17.5819
+WORLD CITY PRIMARY 1 1.0000
+WORLD CITY Population 1 1.0467
+WORLD COUNTRY Name 1 1.0000
+WORLD COUNTRY PRIMARY 1 1.0000
+WORLD COUNTRYLANGUAGE PRIMARY 1 4.2232
+WORLD COUNTRYLANGUAGE PRIMARY 2 1.0000
+WORLD COUNTRYLANGUAGE Percentage 1 2.7640
+WORLD_INNODB CITY Country 1 17.5819
+WORLD_INNODB CITY PRIMARY 1 1.0000
+WORLD_INNODB CITY Population 1 1.0467
+WORLD_INNODB COUNTRY Name 1 1.0000
+WORLD_INNODB COUNTRY PRIMARY 1 1.0000
+WORLD_INNODB COUNTRYLANGUAGE PRIMARY 1 4.2232
+WORLD_INNODB COUNTRYLANGUAGE PRIMARY 2 1.0000
+WORLD_INNODB COUNTRYLANGUAGE Percentage 1 2.7640
+use world;
+set use_stat_tables='preferably';
+set histogram_size=100;
+set histogram_type=@SINGLE_PREC_TYPE;
+ANALYZE TABLE CountryLanguage;
+set histogram_size=254;
+set histogram_type=@DOUBLE_PREC_TYPE;
+ANALYZE TABLE City;
+FLUSH TABLES;
+select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='COUNTRYLANGUAGE' and UPPER(column_name) = 'PERCENTAGE';;
+UPPER(db_name) WORLD
+UPPER(table_name) COUNTRYLANGUAGE
+UPPER(column_name) PERCENTAGE
+min_value 0.0
+max_value 99.9
+nulls_ratio 0.0000
+avg_length 4.0000
+avg_frequency 2.7640
+hist_size 85
+hist_type JSON_HB
+decode_histogram(hist_type,histogram) {
+ "target_histogram_size": 100,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "0.0",
+ "size": 0.066056911,
+ "ndv": 1
+ },
+ {
+ "start": "0.1",
+ "size": 0.020325203,
+ "ndv": 1
+ },
+ {
+ "start": "0.2",
+ "size": 0.022357724,
+ "ndv": 1
+ },
+ {
+ "start": "0.3",
+ "size": 0.017276423,
+ "ndv": 1
+ },
+ {
+ "start": "0.4",
+ "size": 0.025406504,
+ "ndv": 1
+ },
+ {
+ "start": "0.5",
+ "size": 0.020325203,
+ "ndv": 1
+ },
+ {
+ "start": "0.6",
+ "size": 0.020325203,
+ "ndv": 1
+ },
+ {
+ "start": "0.7",
+ "size": 0.017276423,
+ "ndv": 1
+ },
+ {
+ "start": "0.8",
+ "size": 0.010162602,
+ "ndv": 1
+ },
+ {
+ "start": "0.9",
+ "size": 0.010162602,
+ "ndv": 1
+ },
+ {
+ "start": "1.0",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "1.1",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "1.3",
+ "size": 0.012195122,
+ "ndv": 1
+ },
+ {
+ "start": "1.4",
+ "size": 0.015243902,
+ "ndv": 1
+ },
+ {
+ "start": "1.5",
+ "size": 0.005081301,
+ "ndv": 1
+ },
+ {
+ "start": "1.6",
+ "size": 0.015243902,
+ "ndv": 1
+ },
+ {
+ "start": "1.7",
+ "size": 0.010162602,
+ "ndv": 1
+ },
+ {
+ "start": "1.8",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "1.9",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "2.0",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "2.2",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "2.3",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "2.4",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "2.5",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "2.7",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "2.8",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "3.0",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "3.2",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "3.3",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "3.5",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "3.7",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "3.8",
+ "size": 0.010162602,
+ "ndv": 4
+ },
+ {
+ "start": "4.1",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "4.4",
+ "size": 0.010162602,
+ "ndv": 4
+ },
+ {
+ "start": "4.8",
+ "size": 0.010162602,
+ "ndv": 2
+ },
+ {
+ "start": "4.9",
+ "size": 0.010162602,
+ "ndv": 5
+ },
+ {
+ "start": "5.3",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "5.5",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "5.7",
+ "size": 0.010162602,
+ "ndv": 4
+ },
+ {
+ "start": "6.0",
+ "size": 0.010162602,
+ "ndv": 5
+ },
+ {
+ "start": "6.4",
+ "size": 0.010162602,
+ "ndv": 4
+ },
+ {
+ "start": "6.7",
+ "size": 0.010162602,
+ "ndv": 5
+ },
+ {
+ "start": "7.2",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "7.4",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "7.7",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "8.0",
+ "size": 0.010162602,
+ "ndv": 4
+ },
+ {
+ "start": "8.5",
+ "size": 0.010162602,
+ "ndv": 3
+ },
+ {
+ "start": "8.7",
+ "size": 0.010162602,
+ "ndv": 4
+ },
+ {
+ "start": "9.1",
+ "size": 0.010162602,
+ "ndv": 4
+ },
+ {
+ "start": "9.5",
+ "size": 0.010162602,
+ "ndv": 4
+ },
+ {
+ "start": "10.1",
+ "size": 0.010162602,
+ "ndv": 6
+ },
+ {
+ "start": "10.8",
+ "size": 0.010162602,
+ "ndv": 6
+ },
+ {
+ "start": "11.4",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "12.1",
+ "size": 0.010162602,
+ "ndv": 6
+ },
+ {
+ "start": "12.8",
+ "size": 0.010162602,
+ "ndv": 8
+ },
+ {
+ "start": "13.8",
+ "size": 0.010162602,
+ "ndv": 6
+ },
+ {
+ "start": "14.6",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "16.1",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "17.1",
+ "size": 0.010162602,
+ "ndv": 8
+ },
+ {
+ "start": "19.0",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "20.3",
+ "size": 0.010162602,
+ "ndv": 8
+ },
+ {
+ "start": "22.7",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "23.8",
+ "size": 0.010162602,
+ "ndv": 9
+ },
+ {
+ "start": "29.7",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "32.1",
+ "size": 0.010162602,
+ "ndv": 9
+ },
+ {
+ "start": "34.8",
+ "size": 0.010162602,
+ "ndv": 8
+ },
+ {
+ "start": "39.9",
+ "size": 0.010162602,
+ "ndv": 9
+ },
+ {
+ "start": "44.6",
+ "size": 0.010162602,
+ "ndv": 10
+ },
+ {
+ "start": "49.1",
+ "size": 0.010162602,
+ "ndv": 9
+ },
+ {
+ "start": "52.0",
+ "size": 0.010162602,
+ "ndv": 8
+ },
+ {
+ "start": "58.4",
+ "size": 0.010162602,
+ "ndv": 10
+ },
+ {
+ "start": "64.7",
+ "size": 0.010162602,
+ "ndv": 9
+ },
+ {
+ "start": "69.9",
+ "size": 0.010162602,
+ "ndv": 10
+ },
+ {
+ "start": "76.7",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "80.0",
+ "size": 0.010162602,
+ "ndv": 8
+ },
+ {
+ "start": "85.0",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "87.0",
+ "size": 0.010162602,
+ "ndv": 9
+ },
+ {
+ "start": "89.5",
+ "size": 0.010162602,
+ "ndv": 8
+ },
+ {
+ "start": "92.0",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "93.6",
+ "size": 0.010162602,
+ "ndv": 8
+ },
+ {
+ "start": "95.7",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "96.9",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "98.0",
+ "size": 0.010162602,
+ "ndv": 7
+ },
+ {
+ "start": "99.0",
+ "size": 0.006097561,
+ "ndv": 4
+ },
+ {
+ "start": "99.9",
+ "end": "99.9",
+ "size": 0.015243902,
+ "ndv": 1
+ }
+ ]
+}
+select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,decode_histogram(hist_type,histogram) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='CITY' and UPPER(column_name) = 'POPULATION';;
+UPPER(db_name) WORLD
+UPPER(table_name) CITY
+UPPER(column_name) POPULATION
+min_value 42
+max_value 10500000
+nulls_ratio 0.0000
+avg_length 4.0000
+avg_frequency 1.0467
+hist_size 240
+hist_type JSON_HB
+decode_histogram(hist_type,histogram) {
+ "target_histogram_size": 254,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "42",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "1636",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "5808",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "16243",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "29034",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "71000",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "89200",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "89447",
+ "size": 0.004167688,
+ "ndv": 10
+ },
+ {
+ "start": "90000",
+ "size": 0.004167688,
+ "ndv": 11
+ },
+ {
+ "start": "90500",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "90814",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "91100",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "91700",
+ "size": 0.004167688,
+ "ndv": 13
+ },
+ {
+ "start": "92044",
+ "size": 0.004167688,
+ "ndv": 14
+ },
+ {
+ "start": "92574",
+ "size": 0.004167688,
+ "ndv": 13
+ },
+ {
+ "start": "92988",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "93342",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "93900",
+ "size": 0.004167688,
+ "ndv": 13
+ },
+ {
+ "start": "94200",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "94700",
+ "size": 0.004167688,
+ "ndv": 14
+ },
+ {
+ "start": "95052",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "95521",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "96100",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "96626",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "96938",
+ "size": 0.004167688,
+ "ndv": 14
+ },
+ {
+ "start": "97300",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "97929",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "98293",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "98640",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "99300",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "99781",
+ "size": 0.004167688,
+ "ndv": 14
+ },
+ {
+ "start": "100118",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "100490",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "100924",
+ "size": 0.004167688,
+ "ndv": 12
+ },
+ {
+ "start": "101295",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "101660",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "102121",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "102379",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "102820",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "103300",
+ "size": 0.004167688,
+ "ndv": 14
+ },
+ {
+ "start": "103653",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "104400",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "105080",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "105530",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "106000",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "106400",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "106996",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "107329",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "107770",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "108254",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "108600",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "109225",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "109600",
+ "size": 0.004167688,
+ "ndv": 14
+ },
+ {
+ "start": "110034",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "110700",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "111454",
+ "size": 0.004167688,
+ "ndv": 12
+ },
+ {
+ "start": "112007",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "112673",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "113494",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "114065",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "114815",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "115483",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "116132",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "116695",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "117258",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "118080",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "118815",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "119391",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "119990",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "120700",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "121197",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "121842",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "122400",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "123273",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "123776",
+ "size": 0.004167688,
+ "ndv": 14
+ },
+ {
+ "start": "124072",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "124600",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "125236",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "125700",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "126282",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "126872",
+ "size": 0.004167688,
+ "ndv": 14
+ },
+ {
+ "start": "127350",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "127898",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "128651",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "129688",
+ "size": 0.004167688,
+ "ndv": 13
+ },
+ {
+ "start": "130215",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "131149",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "132127",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "132820",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "133443",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "133936",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "134835",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "136062",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "137000",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "137700",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "138418",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "139357",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "140169",
+ "size": 0.004167688,
+ "ndv": 13
+ },
+ {
+ "start": "141132",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "142170",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "142990",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "144126",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "145150",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "146105",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "147124",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "147939",
+ "size": 0.004167688,
+ "ndv": 14
+ },
+ {
+ "start": "148867",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "149900",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "151000",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "152194",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "153344",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "154980",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "155941",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "157358",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "158720",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "160359",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "161500",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "163100",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "164367",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "165583",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "167183",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "168953",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "170123",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "171363",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "172648",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "173878",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "174984",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "176576",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "178200",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "179258",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "180400",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "182148",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "183261",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "184500",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "185951",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "187557",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "189036",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "190255",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "192509",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "194100",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "195468",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "197000",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "199000",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "200901",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "202451",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "204900",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "206338",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "208054",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "211068",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "213271",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "215373",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "217499",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "219761",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "222030",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "224044",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "226573",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "229212",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "232811",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "235760",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "239124",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "241769",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "243825",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "246535",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "249200",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "253587",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "255617",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "259537",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "262947",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "265211",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "269393",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "272058",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "275990",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "278829",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "282197",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "286848",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "291000",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "294125",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "299118",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "301504",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "305699",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "311200",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "315083",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "319373",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "324662",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "328711",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "332800",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "337966",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "342200",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "348100",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "353400",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "358663",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "362470",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "366712",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "375000",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "381725",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "386236",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "395402",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "403151",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "411542",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "419000",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "425579",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "433180",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "441649",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "450180",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "459884",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "469533",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "476668",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "483155",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "495540",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "510000",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "520000",
+ "size": 0.004167688,
+ "ndv": 15
+ },
+ {
+ "start": "530965",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "554636",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "568855",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "587211",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "606932",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "624269",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "650100",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "669181",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "701827",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "728060",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "762000",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "794246",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "830000",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "879000",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "947483",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "1002239",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "1060257",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "1119117",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "1186926",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "1248700",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "1346176",
+ "size": 0.004167688,
+ "ndv": 16
+ },
+ {
+ "start": "1458483",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "1615369",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "1861265",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "2117500",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "2500000",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "2896016",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "4017733",
+ "size": 0.004167688,
+ "ndv": 17
+ },
+ {
+ "start": "6758845",
+ "end": "10500000",
+ "size": 0.00392253,
+ "ndv": 16
+ }
+ ]
+}
+set histogram_type=@SINGLE_PREC_TYPE;
+set histogram_size=0;
+use test;
+DROP DATABASE world;
+SELECT UPPER(db_name), UPPER(table_name), cardinality
+FROM mysql.table_stats;
+UPPER(db_name) UPPER(table_name) cardinality
+WORLD_INNODB CITY 4079
+WORLD_INNODB COUNTRY 239
+WORLD_INNODB COUNTRYLANGUAGE 984
+SELECT UPPER(db_name), UPPER(table_name),
+column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency
+FROM mysql.column_stats;
+UPPER(db_name) UPPER(table_name) column_name min_value max_value nulls_ratio avg_length avg_frequency
+WORLD_INNODB CITY Country ABW ZWE 0.0000 3.0000 17.5819
+WORLD_INNODB CITY ID 1 4079 0.0000 4.0000 1.0000
+WORLD_INNODB CITY Name A Coruña (La Coruña) Ürgenc 0.0000 8.6416 1.0195
+WORLD_INNODB CITY Population 42 10500000 0.0000 4.0000 1.0467
+WORLD_INNODB COUNTRY Capital 1 4074 0.0293 4.0000 1.0000
+WORLD_INNODB COUNTRY Code ABW ZWE 0.0000 3.0000 1.0000
+WORLD_INNODB COUNTRY Name Afghanistan Zimbabwe 0.0000 10.1088 1.0000
+WORLD_INNODB COUNTRY Population 0 1277558000 0.0000 4.0000 1.0575
+WORLD_INNODB COUNTRY SurfaceArea 0.40 17075400.00 0.0000 4.0000 1.0042
+WORLD_INNODB COUNTRYLANGUAGE Country ABW ZWE 0.0000 3.0000 4.2232
+WORLD_INNODB COUNTRYLANGUAGE Language Abhyasi [South]Mande 0.0000 7.1778 2.1532
+WORLD_INNODB COUNTRYLANGUAGE Percentage 0.0 99.9 0.0000 4.0000 2.7640
+SELECT UPPER(db_name), UPPER(table_name),
+index_name, prefix_arity, avg_frequency
+FROM mysql.index_stats;
+UPPER(db_name) UPPER(table_name) index_name prefix_arity avg_frequency
+WORLD_INNODB CITY Country 1 17.5819
+WORLD_INNODB CITY PRIMARY 1 1.0000
+WORLD_INNODB CITY Population 1 1.0467
+WORLD_INNODB COUNTRY Name 1 1.0000
+WORLD_INNODB COUNTRY PRIMARY 1 1.0000
+WORLD_INNODB COUNTRYLANGUAGE PRIMARY 1 4.2232
+WORLD_INNODB COUNTRYLANGUAGE PRIMARY 2 1.0000
+WORLD_INNODB COUNTRYLANGUAGE Percentage 1 2.7640
+DROP DATABASE world_innodb;
+SELECT UPPER(db_name), UPPER(table_name), cardinality
+FROM mysql.table_stats;
+UPPER(db_name) UPPER(table_name) cardinality
+SELECT UPPER(db_name), UPPER(table_name),
+column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency
+FROM mysql.column_stats;
+UPPER(db_name) UPPER(table_name) column_name min_value max_value nulls_ratio avg_length avg_frequency
+SELECT UPPER(db_name), UPPER(table_name),
+index_name, prefix_arity, avg_frequency
+FROM mysql.index_stats;
+UPPER(db_name) UPPER(table_name) index_name prefix_arity avg_frequency
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
+#
+# Bug mdev-4357: empty string as a value of the HIST_SIZE column
+# from mysql.column_stats
+#
+create table t1 (a int);
+insert into t1 values (1),(2),(3);
+set histogram_size=10;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select db_name, table_name, column_name,
+min_value, max_value,
+nulls_ratio, avg_frequency,
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t1 a 1 3 0.0000 1.0000 3 JSON_HB {
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.333333333,
+ "ndv": 1
+ },
+ {
+ "start": "2",
+ "size": 0.333333333,
+ "ndv": 1
+ },
+ {
+ "start": "3",
+ "end": "3",
+ "size": 0.333333333,
+ "ndv": 1
+ }
+ ]
+}
+set histogram_size=default;
+drop table t1;
+#
+# Bug mdev-4359: wrong setting of the HIST_SIZE column
+# (see also mdev-4357) from mysql.column_stats
+#
+create table t1 ( a int);
+insert into t1 values (1),(2),(3),(4),(5);
+set histogram_size=10;
+set histogram_type=@DOUBLE_PREC_TYPE;
+show variables like 'histogram%';
+Variable_name Value
+histogram_size 10
+histogram_type JSON_HB
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select db_name, table_name, column_name,
+min_value, max_value,
+nulls_ratio, avg_frequency,
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats
+ORDER BY db_name, table_name, column_name;
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t1 a 1 5 0.0000 1.0000 5 JSON_HB {
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.2,
+ "ndv": 1
+ },
+ {
+ "start": "2",
+ "size": 0.2,
+ "ndv": 1
+ },
+ {
+ "start": "3",
+ "size": 0.2,
+ "ndv": 1
+ },
+ {
+ "start": "4",
+ "size": 0.2,
+ "ndv": 1
+ },
+ {
+ "start": "5",
+ "end": "5",
+ "size": 0.2,
+ "ndv": 1
+ }
+ ]
+}
+set histogram_size=0;
+set histogram_type=@SINGLE_PREC_TYPE;
+drop table t1;
+#
+# Bug mdev-4369: histogram for a column with many distinct values
+#
+CREATE TABLE t1 (id int);
+CREATE TABLE t2 (id int);
+INSERT INTO t1 (id) VALUES (1), (1), (1),(1);
+INSERT INTO t1 (id) SELECT id FROM t1;
+INSERT INTO t1 SELECT id+1 FROM t1;
+INSERT INTO t1 SELECT id+2 FROM t1;
+INSERT INTO t1 SELECT id+4 FROM t1;
+INSERT INTO t1 SELECT id+8 FROM t1;
+INSERT INTO t1 SELECT id+16 FROM t1;
+INSERT INTO t1 SELECT id+32 FROM t1;
+INSERT INTO t1 SELECT id+64 FROM t1;
+INSERT INTO t1 SELECT id+128 FROM t1;
+INSERT INTO t1 SELECT id+256 FROM t1;
+INSERT INTO t1 SELECT id+512 FROM t1;
+INSERT INTO t2 SELECT id FROM t1 ORDER BY id*rand();
+SELECT COUNT(*) FROM t2;
+COUNT(*)
+8192
+SELECT COUNT(DISTINCT id) FROM t2;
+COUNT(DISTINCT id)
+1024
+set @@tmp_table_size=1024*16;
+set @@max_heap_table_size=1024*16;
+set histogram_size=63;
+analyze table t2 persistent for all;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+select db_name, table_name, column_name,
+min_value, max_value,
+nulls_ratio, avg_frequency,
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats;
+db_name table_name column_name min_value max_value nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t2 id 1 1024 0.0000 8.0000 63 JSON_HB {
+ "target_histogram_size": 63,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "17",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "33",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "50",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "66",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "82",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "99",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "115",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "132",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "148",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "164",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "181",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "197",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "213",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "230",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "246",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "263",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "279",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "295",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "312",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "328",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "344",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "361",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "377",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "394",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "410",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "426",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "443",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "459",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "475",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "492",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "508",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "525",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "541",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "557",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "574",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "590",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "606",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "623",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "639",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "656",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "672",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "688",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "705",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "721",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "737",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "754",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "770",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "787",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "803",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "819",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "836",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "852",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "868",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "885",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "901",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "918",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "934",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "950",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "967",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "983",
+ "size": 0.015991211,
+ "ndv": 17
+ },
+ {
+ "start": "999",
+ "size": 0.015991211,
+ "ndv": 18
+ },
+ {
+ "start": "1016",
+ "end": "1024",
+ "size": 0.008544922,
+ "ndv": 9
+ }
+ ]
+}
+set histogram_size=0;
+drop table t1, t2;
+set use_stat_tables=@save_use_stat_tables;
+#
+# Bug MDEV-7383: min/max value for a column not utf8 compatible
+#
+create table t1 (a varchar(100)) engine=MyISAM;
+insert into t1 values(unhex('D879626AF872675F73E662F8'));
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+show warnings;
+Level Code Message
+select db_name, table_name, column_name,
+HEX(min_value), HEX(max_value),
+nulls_ratio, avg_frequency,
+hist_size, hist_type, decode_histogram(hist_type,histogram)
+FROM mysql.column_stats;
+db_name table_name column_name HEX(min_value) HEX(max_value) nulls_ratio avg_frequency hist_size hist_type decode_histogram(hist_type,histogram)
+test t1 a D879626AF872675F73E662F8 D879626AF872675F73E662F8 0.0000 1.0000 0 NULL NULL
+drop table t1;
+#
+# MDEB-9744: session optimizer_use_condition_selectivity=5 causing SQL Error (1918):
+# Encountered illegal value '' when converting to DECIMAL
+#
+set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
+set optimizer_use_condition_selectivity=3, use_stat_tables=preferably;
+create table t1 (id int(10),cost decimal(9,2)) engine=innodb;
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+create temporary table t2 (id int);
+insert into t2 (id) select id from t1 where cost > 0;
+select * from t2;
+id
+set use_stat_tables=@save_use_stat_tables;
+set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
+drop table t1,t2;
+#
+# MDEV-16507: statistics for temporary tables should not be used
+#
+SET
+@save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
+SET @@use_stat_tables = preferably ;
+SET @@optimizer_use_condition_selectivity = 4;
+CREATE TABLE t1 (
+TIMESTAMP TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+ON UPDATE CURRENT_TIMESTAMP
+);
+SET @had_t1_table= @@warning_count != 0;
+CREATE TEMPORARY TABLE tmp_t1 LIKE t1;
+INSERT INTO tmp_t1 VALUES (now());
+INSERT INTO t1 SELECT * FROM tmp_t1 WHERE @had_t1_table=0;
+DROP TABLE t1;
+SET
+use_stat_tables=@save_use_stat_tables;
+SET
+optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
+# End of 10.0 tests
+#
+# MDEV-9590: Always print "Engine-independent statistic" warnings and
+# might be filtering columns unintentionally from engines
+#
+set use_stat_tables='NEVER';
+create table t1 (test blob);
+show variables like 'use_stat_tables';
+Variable_name Value
+use_stat_tables NEVER
+analyze table t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Table is already up to date
+drop table t1;
+#
+# MDEV-10435 crash with bad stat tables
+#
+set use_stat_tables='preferably';
+call mtr.add_suppression("Column count of mysql.table_stats is wrong. Expected 3, found 1. The table is probably corrupted");
+rename table mysql.table_stats to test.table_stats;
+flush tables;
+create table t1 (a int);
+rename table t1 to t2, t3 to t4;
+ERROR 42S02: Table 'test.t3' doesn't exist
+drop table t1;
+rename table test.table_stats to mysql.table_stats;
+rename table mysql.table_stats to test.table_stats;
+create table mysql.table_stats (a int);
+flush tables;
+create table t1 (a int);
+rename table t1 to t2, t3 to t4;
+ERROR 42S02: Table 'test.t3' doesn't exist
+drop table t1, mysql.table_stats;
+rename table test.table_stats to mysql.table_stats;
+#
+# MDEV-19334: bool is_eits_usable(Field*): Assertion `field->table->stats_is_read' failed.
+#
+create temporary table t1(a int);
+insert into t1 values (1),(2),(3);
+set use_stat_tables=preferably;
+set @optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
+set optimizer_use_condition_selectivity=4;
+select * from t1 where a >= 2;
+a
+2
+3
+drop table t1;
+set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
+set use_stat_tables=@save_use_stat_tables;
+#
+# Start of 10.2 tests
+#
+#
+# MDEV-10134 Add full support for DEFAULT
+#
+#
+# End of 10.2 tests
+#
+set histogram_size=@save_histogram_size, histogram_type=@save_hist_type;
+#
+# Start of 10.4 tests
+#
+#
+# Test analyze_sample_percentage system variable.
+#
+set @save_use_stat_tables=@@use_stat_tables;
+set @save_analyze_sample_percentage=@@analyze_sample_percentage;
+set session rand_seed1=42;
+set session rand_seed2=62;
+set use_stat_tables=PREFERABLY;
+set histogram_size=10;
+CREATE TABLE t1 (id int);
+INSERT INTO t1 (id) VALUES (1), (1), (1), (1), (1), (1), (1);
+INSERT INTO t1 (id) SELECT id FROM t1;
+INSERT INTO t1 SELECT id+1 FROM t1;
+INSERT INTO t1 SELECT id+2 FROM t1;
+INSERT INTO t1 SELECT id+4 FROM t1;
+INSERT INTO t1 SELECT id+8 FROM t1;
+INSERT INTO t1 SELECT id+16 FROM t1;
+INSERT INTO t1 SELECT id+32 FROM t1;
+INSERT INTO t1 SELECT id+64 FROM t1;
+INSERT INTO t1 SELECT id+128 FROM t1;
+INSERT INTO t1 SELECT id+256 FROM t1;
+INSERT INTO t1 SELECT id+512 FROM t1;
+INSERT INTO t1 SELECT id+1024 FROM t1;
+INSERT INTO t1 SELECT id+2048 FROM t1;
+INSERT INTO t1 SELECT id+4096 FROM t1;
+INSERT INTO t1 SELECT id+9192 FROM t1;
+#
+# This query will should show a full table scan analysis.
+#
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
+DECODE_HISTOGRAM(hist_type, histogram)
+from mysql.column_stats;
+table_name column_name min_value max_value nulls_ratio avg_length avg_frequency DECODE_HISTOGRAM(hist_type, histogram)
+t1 id 1 17384 0.0000 4.0000 14.0000 {
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "1639",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "3277",
+ "size": 0.100001744,
+ "ndv": 1640
+ },
+ {
+ "start": "4916",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "6554",
+ "size": 0.100001744,
+ "ndv": 1640
+ },
+ {
+ "start": "9193",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "10831",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "12470",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "14108",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "15746",
+ "end": "17384",
+ "size": 0.099984305,
+ "ndv": 1639
+ }
+ ]
+}
+set analyze_sample_percentage=0.1;
+#
+# This query will show an innacurate avg_frequency value.
+#
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
+DECODE_HISTOGRAM(hist_type, histogram)
+from mysql.column_stats;
+table_name column_name min_value max_value nulls_ratio avg_length avg_frequency DECODE_HISTOGRAM(hist_type, histogram)
+t1 id 111 17026 0.0000 4.0000 10.4739 {
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "111",
+ "size": 0.103773585,
+ "ndv": 21
+ },
+ {
+ "start": "1074",
+ "size": 0.103773585,
+ "ndv": 22
+ },
+ {
+ "start": "2504",
+ "size": 0.103773585,
+ "ndv": 22
+ },
+ {
+ "start": "4395",
+ "size": 0.103773585,
+ "ndv": 22
+ },
+ {
+ "start": "6165",
+ "size": 0.103773585,
+ "ndv": 22
+ },
+ {
+ "start": "8082",
+ "size": 0.103773585,
+ "ndv": 22
+ },
+ {
+ "start": "10671",
+ "size": 0.103773585,
+ "ndv": 22
+ },
+ {
+ "start": "12738",
+ "size": 0.103773585,
+ "ndv": 22
+ },
+ {
+ "start": "14487",
+ "size": 0.103773585,
+ "ndv": 22
+ },
+ {
+ "start": "15785",
+ "end": "17026",
+ "size": 0.066037736,
+ "ndv": 14
+ }
+ ]
+}
+#
+# This query will show a better avg_frequency value.
+#
+set analyze_sample_percentage=25;
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
+DECODE_HISTOGRAM(hist_type, histogram)
+from mysql.column_stats;
+table_name column_name min_value max_value nulls_ratio avg_length avg_frequency DECODE_HISTOGRAM(hist_type, histogram)
+t1 id 1 17384 0.0000 4.0000 14.0401 {
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.100015657,
+ "ndv": 1591
+ },
+ {
+ "start": "1624",
+ "size": 0.100015657,
+ "ndv": 1599
+ },
+ {
+ "start": "3252",
+ "size": 0.100015657,
+ "ndv": 1587
+ },
+ {
+ "start": "4868",
+ "size": 0.100015657,
+ "ndv": 1594
+ },
+ {
+ "start": "6483",
+ "size": 0.100015657,
+ "ndv": 1632
+ },
+ {
+ "start": "8153",
+ "size": 0.100015657,
+ "ndv": 1607
+ },
+ {
+ "start": "10791",
+ "size": 0.100015657,
+ "ndv": 1619
+ },
+ {
+ "start": "12435",
+ "size": 0.100015657,
+ "ndv": 1627
+ },
+ {
+ "start": "14080",
+ "size": 0.100015657,
+ "ndv": 1613
+ },
+ {
+ "start": "15727",
+ "end": "17384",
+ "size": 0.099859084,
+ "ndv": 1622
+ }
+ ]
+}
+set analyze_sample_percentage=0;
+#
+# Test self adjusting sampling level.
+#
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
+DECODE_HISTOGRAM(hist_type, histogram)
+from mysql.column_stats;
+table_name column_name min_value max_value nulls_ratio avg_length avg_frequency DECODE_HISTOGRAM(hist_type, histogram)
+t1 id 1 17384 0.0000 4.0000 13.9812 {
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.100007372,
+ "ndv": 1651
+ },
+ {
+ "start": "1651",
+ "size": 0.100007372,
+ "ndv": 1656
+ },
+ {
+ "start": "3306",
+ "size": 0.100007372,
+ "ndv": 1643
+ },
+ {
+ "start": "4949",
+ "size": 0.100007372,
+ "ndv": 1648
+ },
+ {
+ "start": "6597",
+ "size": 0.100007372,
+ "ndv": 1644
+ },
+ {
+ "start": "9240",
+ "size": 0.100007372,
+ "ndv": 1624
+ },
+ {
+ "start": "10864",
+ "size": 0.100007372,
+ "ndv": 1633
+ },
+ {
+ "start": "12496",
+ "size": 0.100007372,
+ "ndv": 1619
+ },
+ {
+ "start": "14114",
+ "size": 0.100007372,
+ "ndv": 1645
+ },
+ {
+ "start": "15758",
+ "end": "17384",
+ "size": 0.099933656,
+ "ndv": 1627
+ }
+ ]
+}
+#
+# Test record estimation is working properly.
+#
+select count(*) from t1;
+count(*)
+229376
+explain select * from t1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 229060
+set analyze_sample_percentage=100;
+ANALYZE TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status Table is already up to date
+select table_name, column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency,
+DECODE_HISTOGRAM(hist_type, histogram)
+from mysql.column_stats;
+table_name column_name min_value max_value nulls_ratio avg_length avg_frequency DECODE_HISTOGRAM(hist_type, histogram)
+t1 id 1 17384 0.0000 4.0000 14.0000 {
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "1639",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "3277",
+ "size": 0.100001744,
+ "ndv": 1640
+ },
+ {
+ "start": "4916",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "6554",
+ "size": 0.100001744,
+ "ndv": 1640
+ },
+ {
+ "start": "9193",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "10831",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "12470",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "14108",
+ "size": 0.100001744,
+ "ndv": 1639
+ },
+ {
+ "start": "15746",
+ "end": "17384",
+ "size": 0.099984305,
+ "ndv": 1639
+ }
+ ]
+}
+explain select * from t1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 229376
+drop table t0;
+drop table t1;
+set analyze_sample_percentage=@save_analyze_sample_percentage;
+set histogram_size=@save_histogram_size;
+set use_stat_tables=@save_use_stat_tables;
+set @@global.histogram_size=@save_histogram_size;
+drop table if exists t1;
+set @save_histogram_type=@@histogram_type;
+set @save_histogram_size=@@histogram_size;
+call mtr.add_suppression("Failed to parse histogram for table .*");
+create table ten(a int primary key);
+insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+set histogram_size=100;
+set histogram_type='double_prec_hb';
+create table t1_bin (a varchar(255));
+insert into t1_bin select concat('a-', a) from ten;
+analyze table t1_bin persistent for all;
+Table Op Msg_type Msg_text
+test.t1_bin analyze status Engine-independent statistics collected
+test.t1_bin analyze status OK
+select hex(histogram) from mysql.column_stats where table_name='t1_bin';
+hex(histogram)
+00000000000000000000711C711C711C711C711CE338E338E338E338E33855555555555555555555C671C671C671C671C671388E388E388E388E388EAAAAAAAAAAAAAAAAAAAA1BC71BC71BC71BC71BC78DE38DE38DE38DE38DE3FFFFFFFFFFFFFFFFFFFF
+explain extended select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1_bin ALL NULL NULL NULL NULL 10 58.82 Using where
+Warnings:
+Note 1003 select `test`.`t1_bin`.`a` AS `a` from `test`.`t1_bin` where `test`.`t1_bin`.`a` between 'a-3a' and 'zzzzzzzzz'
+analyze select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1_bin ALL NULL NULL NULL NULL 10 10.00 58.82 60.00 Using where
+set histogram_type=json_hb;
+create table t1_json (a varchar(255));
+insert into t1_json select concat('a-', a) from ten;
+analyze table t1_json persistent for all;
+Table Op Msg_type Msg_text
+test.t1_json analyze status Engine-independent statistics collected
+test.t1_json analyze status OK
+select * from mysql.column_stats where table_name='t1_json';
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1_json a a-0 a-9 0.0000 3.0000 1.0000 10 JSON_HB {
+ "target_histogram_size": 100,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "a-0",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "a-1",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "a-2",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "a-3",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "a-4",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "a-5",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "a-6",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "a-7",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "a-8",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "a-9",
+ "end": "a-9",
+ "size": 0.1,
+ "ndv": 1
+ }
+ ]
+}
+explain extended select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10 60.00 Using where
+Warnings:
+Note 1003 select `test`.`t1_json`.`a` AS `a` from `test`.`t1_json` where `test`.`t1_json`.`a` between 'a-3a' and 'zzzzzzzzz'
+analyze select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10 10.00 60.00 60.00 Using where
+explain extended select * from t1_json where a < 'b-1a';
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1_json`.`a` AS `a` from `test`.`t1_json` where `test`.`t1_json`.`a` < 'b-1a'
+analyze select * from t1_json where a > 'zzzzzzzzz';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10 10.00 0.00 0.00 Using where
+drop table ten;
+UPDATE mysql.column_stats
+SET histogram='["not-what-you-expect"]' WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10
+Warnings:
+Warning 4186 Failed to parse histogram for table test.t1_json: Root JSON element must be a JSON object at offset 1.
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":"not-histogram"}' WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10
+Warnings:
+Warning 4186 Failed to parse histogram for table test.t1_json: histogram_hb must contain an array at offset 32.
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":["not-a-bucket"]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10
+Warnings:
+Warning 4186 Failed to parse histogram for table test.t1_json: Expected an object in the buckets array at offset 32.
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"no-expected-members":1}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10
+Warnings:
+Warning 4186 Failed to parse histogram for table test.t1_json: "start" element not present at offset 42.
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"start":{}}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10
+Warnings:
+Warning 4186 Failed to parse histogram for table test.t1_json: String or number expected at offset 27.
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"start":"aaa", "size":"not-an-integer"}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10
+Warnings:
+Warning 4186 Failed to parse histogram for table test.t1_json: "ndv" element not present at offset 57.
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"start":"aaa", "size":0.25}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10
+Warnings:
+Warning 4186 Failed to parse histogram for table test.t1_json: "ndv" element not present at offset 45.
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"start":"aaa", "size":0.25, "ndv":1}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1_json ALL NULL NULL NULL NULL 10
+Warnings:
+Warning 4186 Failed to parse histogram for table test.t1_json: Histogram must have at least one bucket at offset 19.
+create table t2 (
+city varchar(100)
+);
+set histogram_size=50;
+insert into t2 select 'Moscow' from seq_1_to_99;
+insert into t2 select 'Helsinki' from seq_1_to_2;
+set histogram_type=json_hb;
+analyze table t2 persistent for all;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+explain extended select * from t2 where city = 'Moscow';
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 101 98.02 Using where
+Warnings:
+Note 1003 select `test`.`t2`.`city` AS `city` from `test`.`t2` where `test`.`t2`.`city` = 'Moscow'
+analyze select * from t2 where city = 'Moscow';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 101 101.00 98.02 98.02 Using where
+explain extended select * from t2 where city = 'Helsinki';
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 101 1.98 Using where
+Warnings:
+Note 1003 select `test`.`t2`.`city` AS `city` from `test`.`t2` where `test`.`t2`.`city` = 'Helsinki'
+analyze select * from t2 where city = 'helsinki';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 101 101.00 1.98 1.98 Using where
+explain extended select * from t2 where city < 'Lagos';
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 101 1.98 Using where
+Warnings:
+Note 1003 select `test`.`t2`.`city` AS `city` from `test`.`t2` where `test`.`t2`.`city` < 'Lagos'
+drop table t1_bin;
+drop table t1_json;
+drop table t2;
+DELETE FROM mysql.column_stats;
+create schema world;
+use world;
+set histogram_type='JSON_HB';
+set histogram_size=50;
+ANALYZE TABLE Country, City, CountryLanguage persistent for all;
+SELECT column_name, min_value, max_value, hist_size, hist_type, histogram FROM mysql.column_stats;
+column_name min_value max_value hist_size hist_type histogram
+Code ABW ZWE 48 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "ABW",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "AND",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "ASM",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "AUT",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "BFA",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "BIH",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "BRA",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "BWA",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "CHL",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "COG",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "CRI",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "CZE",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "DOM",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "ESH",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "FJI",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "GAB",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "GIN",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "GRC",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "GUM",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "HRV",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "IOT",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "ISR",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "KAZ",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "KNA",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "LBR",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "LSO",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "MAR",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "MEX",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "MMR",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "MSR",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "MYT",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "NGA",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "NPL",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "PAN",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "PNG",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "PRY",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "ROM",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "SEN",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "SLB",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "SPM",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "SWE",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "TCD",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "TKM",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "TUR",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "UKR",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "VAT",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "VNM",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "YUG",
+ "end": "ZWE",
+ "size": 0.016736402,
+ "ndv": 4
+ }
+ ]
+}
+Country ABW ZWE 39 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "ABW",
+ "size": 0.020102966,
+ "ndv": 11
+ },
+ {
+ "start": "ATG",
+ "size": 0.020102966,
+ "ndv": 14
+ },
+ {
+ "start": "BLR",
+ "size": 0.006619269,
+ "ndv": 4
+ },
+ {
+ "start": "BRA",
+ "size": 0.061289532,
+ "ndv": 1
+ },
+ {
+ "start": "BRB",
+ "size": 0.020102966,
+ "ndv": 9
+ },
+ {
+ "start": "CHL",
+ "size": 0.002206423,
+ "ndv": 1
+ },
+ {
+ "start": "CHN",
+ "size": 0.0889924,
+ "ndv": 1
+ },
+ {
+ "start": "CIV",
+ "size": 0.020102966,
+ "ndv": 10
+ },
+ {
+ "start": "CUB",
+ "size": 0.020102966,
+ "ndv": 6
+ },
+ {
+ "start": "DEU",
+ "size": 0.020102966,
+ "ndv": 8
+ },
+ {
+ "start": "EGY",
+ "size": 0.020102966,
+ "ndv": 4
+ },
+ {
+ "start": "ESP",
+ "size": 0.020102966,
+ "ndv": 11
+ },
+ {
+ "start": "GBR",
+ "size": 0.020102966,
+ "ndv": 3
+ },
+ {
+ "start": "GIB",
+ "size": 0.020102966,
+ "ndv": 19
+ },
+ {
+ "start": "IDN",
+ "size": 0.012503064,
+ "ndv": 1
+ },
+ {
+ "start": "IND",
+ "size": 0.083598921,
+ "ndv": 1
+ },
+ {
+ "start": "IRL",
+ "size": 0.020102966,
+ "ndv": 3
+ },
+ {
+ "start": "IRQ",
+ "size": 0.020102966,
+ "ndv": 6
+ },
+ {
+ "start": "JOR",
+ "size": 2.451581e-4,
+ "ndv": 1
+ },
+ {
+ "start": "JPN",
+ "size": 0.060799215,
+ "ndv": 1
+ },
+ {
+ "start": "KAZ",
+ "size": 0.020102966,
+ "ndv": 7
+ },
+ {
+ "start": "KOR",
+ "size": 0.020102966,
+ "ndv": 16
+ },
+ {
+ "start": "MDA",
+ "size": 0.002451581,
+ "ndv": 3
+ },
+ {
+ "start": "MEX",
+ "size": 0.042412356,
+ "ndv": 1
+ },
+ {
+ "start": "MHL",
+ "size": 0.020102966,
+ "ndv": 20
+ },
+ {
+ "start": "NGA",
+ "size": 0.020102966,
+ "ndv": 4
+ },
+ {
+ "start": "NLD",
+ "size": 0.020102966,
+ "ndv": 7
+ },
+ {
+ "start": "PAK",
+ "size": 0.007354744,
+ "ndv": 4
+ },
+ {
+ "start": "PHL",
+ "size": 0.033341505,
+ "ndv": 1
+ },
+ {
+ "start": "PLW",
+ "size": 0.020102966,
+ "ndv": 8
+ },
+ {
+ "start": "PSE",
+ "size": 0.008580534,
+ "ndv": 5
+ },
+ {
+ "start": "RUS",
+ "size": 0.046334886,
+ "ndv": 1
+ },
+ {
+ "start": "RWA",
+ "size": 0.020102966,
+ "ndv": 18
+ },
+ {
+ "start": "SWE",
+ "size": 0.020102966,
+ "ndv": 16
+ },
+ {
+ "start": "TUR",
+ "size": 0.020102966,
+ "ndv": 4
+ },
+ {
+ "start": "TZA",
+ "size": 0.015199804,
+ "ndv": 4
+ },
+ {
+ "start": "USA",
+ "size": 0.067173327,
+ "ndv": 1
+ },
+ {
+ "start": "UZB",
+ "size": 0.020102966,
+ "ndv": 7
+ },
+ {
+ "start": "VNM",
+ "end": "ZWE",
+ "size": 0.018632018,
+ "ndv": 9
+ }
+ ]
+}
+Name Afghanistan Zimbabwe 48 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "Afghanistan",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Angola",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Armenia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Bahamas",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Belgium",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Bolivia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "British Indian Ocean Territory",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Cambodia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Central African Republic",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Cocos (Keeling) Islands",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Cook Islands",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Czech Republic",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Dominican Republic",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Equatorial Guinea",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Faroe Islands",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "French Polynesia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Germany",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Grenada",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Guinea-Bissau",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Honduras",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Indonesia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Italy",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Kenya",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Latvia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Liechtenstein",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Madagascar",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Malta",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Mayotte",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Mongolia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Namibia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "New Caledonia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Niue",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Oman",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Papua New Guinea",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Poland",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Russian Federation",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Saint Lucia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Sao Tome and Principe",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Singapore",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "South Africa",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Sudan",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Switzerland",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Thailand",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Tunisia",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Uganda",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "United States Minor Outlying Islands",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Vietnam",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "Yemen",
+ "end": "Zimbabwe",
+ "size": 0.016736402,
+ "ndv": 4
+ }
+ ]
+}
+SurfaceArea 0.40 17075400.00 48 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "0.40",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "16.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "49.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "96.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "181.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "242.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "314.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "373.00",
+ "size": 0.020920502,
+ "ndv": 4
+ },
+ {
+ "start": "455.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "618.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "726.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "1102.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "2510.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "4033.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "8875.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "11295.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "17364.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "21041.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "26338.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "28896.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "36125.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "45227.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "51197.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "65301.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "75517.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "88946.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "102173.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "111369.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "120538.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "147181.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "185180.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "236800.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "245857.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "283561.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "323250.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "342000.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "438317.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "475442.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "551500.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "622984.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "756626.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "883749.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "1098581.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "1246700.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "1648195.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "2166090.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "2780400.00",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "9572900.00",
+ "end": "17075400.00",
+ "size": 0.016736402,
+ "ndv": 4
+ }
+ ]
+}
+Population 0 1277558000 48 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "0",
+ "size": 0.029288703,
+ "ndv": 1
+ },
+ {
+ "start": "50",
+ "size": 0.020920502,
+ "ndv": 4
+ },
+ {
+ "start": "2000",
+ "size": 0.020920502,
+ "ndv": 4
+ },
+ {
+ "start": "7000",
+ "size": 0.020920502,
+ "ndv": 4
+ },
+ {
+ "start": "15000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "25000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "38000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "68000",
+ "size": 0.020920502,
+ "ndv": 4
+ },
+ {
+ "start": "78000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "103000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "154000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "214000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "279000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "380200",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "444000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "599000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "817000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "1213000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "1622000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "2124000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "2583000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "3101000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "3520000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "3850000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "4380000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "4699000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "5083000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "5496000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "6276000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "7430000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "8190900",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "9169000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "10097000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "10640000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "11234000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "12878000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "15942000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "18886000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "22244000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "23930000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "28351000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "33517000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "42321000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "57680000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "66591000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "82164700",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "146934000",
+ "size": 0.020920502,
+ "ndv": 5
+ },
+ {
+ "start": "1013662000",
+ "end": "1277558000",
+ "size": 0.008368201,
+ "ndv": 2
+ }
+ ]
+}
+Capital 1 4074 47 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "54",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "65",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "144",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "179",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "194",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "537",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "553",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "586",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "652",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "764",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "905",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "919",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "928",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "939",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "1449",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "1530",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "1792",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "1864",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2256",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2317",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2413",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2437",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2447",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2460",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2484",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2511",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2695",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2726",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2754",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2821",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2885",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "2919",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3014",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3048",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3067",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3171",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3207",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3217",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3248",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3315",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3336",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3419",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3483",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3520",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "3580",
+ "size": 0.021551724,
+ "ndv": 5
+ },
+ {
+ "start": "4068",
+ "end": "4074",
+ "size": 0.00862069,
+ "ndv": 2
+ }
+ ]
+}
+ID 1 4079 50 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "83",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "165",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "247",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "329",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "411",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "493",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "575",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "657",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "739",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "821",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "903",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "985",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1067",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1149",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1231",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1313",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1395",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1477",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1559",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1641",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1723",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1805",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1887",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "1969",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2051",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2133",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2215",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2297",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2379",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2461",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2543",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2625",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2707",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2789",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2871",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "2953",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3035",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3117",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3199",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3281",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3363",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3445",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3527",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3609",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3691",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3773",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3855",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "3937",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "4019",
+ "end": "4079",
+ "size": 0.014954646,
+ "ndv": 61
+ }
+ ]
+}
+Name A Coruña (La Coruña) Ürgenc 50 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "A Coruña (La Coruña)",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Almería",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Araras",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Bakersfield",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Bayamo",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Bilaspur",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Bridgeport",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Cambridge",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Chatsworth",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Cizah",
+ "size": 0.020102966,
+ "ndv": 78
+ },
+ {
+ "start": "Da Nang",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Djougou",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Emeishan",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Freiburg im Breisgau",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Giugliano in Campania",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "Györ",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "Herat",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Hyesan",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Itabira",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Jiangyou",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "Kamjanets-Podilskyi",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Khouribga",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Koudougou",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Lahore",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Linköping",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Machilipatnam (Masulipatam)",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Marikina",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Miami Beach",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Moscow",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Nanded (Nander)",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Nizni Tagil",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Okazaki",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Pak Kret",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Petah Tiqwa",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Porto-Novo",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Qomsheh",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Rimini",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Salamanca",
+ "size": 0.020102966,
+ "ndv": 70
+ },
+ {
+ "start": "Sanaa",
+ "size": 0.020102966,
+ "ndv": 78
+ },
+ {
+ "start": "Secunderabad",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "Silay",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Subotica",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Tagum",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Tema",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Tongling",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Udine",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "Verona",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "Wichita Falls",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "Yibin",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "Zixing",
+ "end": "Ãœrgenc",
+ "size": 0.014954646,
+ "ndv": 61
+ }
+ ]
+}
+Population 42 10500000 50 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "42",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "56601",
+ "size": 0.020102966,
+ "ndv": 64
+ },
+ {
+ "start": "90674",
+ "size": 0.020102966,
+ "ndv": 70
+ },
+ {
+ "start": "92700",
+ "size": 0.020102966,
+ "ndv": 76
+ },
+ {
+ "start": "94800",
+ "size": 0.020102966,
+ "ndv": 74
+ },
+ {
+ "start": "96984",
+ "size": 0.020102966,
+ "ndv": 75
+ },
+ {
+ "start": "99296",
+ "size": 0.020102966,
+ "ndv": 73
+ },
+ {
+ "start": "101144",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "103211",
+ "size": 0.020102966,
+ "ndv": 73
+ },
+ {
+ "start": "105700",
+ "size": 0.020102966,
+ "ndv": 77
+ },
+ {
+ "start": "107800",
+ "size": 0.020102966,
+ "ndv": 76
+ },
+ {
+ "start": "110048",
+ "size": 0.020102966,
+ "ndv": 76
+ },
+ {
+ "start": "113336",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "116485",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "119675",
+ "size": 0.020102966,
+ "ndv": 77
+ },
+ {
+ "start": "122700",
+ "size": 0.020102966,
+ "ndv": 77
+ },
+ {
+ "start": "125300",
+ "size": 0.020102966,
+ "ndv": 77
+ },
+ {
+ "start": "127898",
+ "size": 0.020102966,
+ "ndv": 77
+ },
+ {
+ "start": "131831",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "135621",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "139712",
+ "size": 0.020102966,
+ "ndv": 75
+ },
+ {
+ "start": "144282",
+ "size": 0.020102966,
+ "ndv": 77
+ },
+ {
+ "start": "149000",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "154976",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "161191",
+ "size": 0.020102966,
+ "ndv": 78
+ },
+ {
+ "start": "167795",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "174381",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "180650",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "187691",
+ "size": 0.020102966,
+ "ndv": 76
+ },
+ {
+ "start": "195400",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "203500",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "214901",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "224897",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "239810",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "253587",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "268013",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "285114",
+ "size": 0.020102966,
+ "ndv": 77
+ },
+ {
+ "start": "303346",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "325790",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "348845",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "374945",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "410000",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "445555",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "487148",
+ "size": 0.020102966,
+ "ndv": 79
+ },
+ {
+ "start": "559249",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "651154",
+ "size": 0.020102966,
+ "ndv": 82
+ },
+ {
+ "start": "791926",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "1040000",
+ "size": 0.020102966,
+ "ndv": 80
+ },
+ {
+ "start": "1398800",
+ "size": 0.020102966,
+ "ndv": 81
+ },
+ {
+ "start": "2641312",
+ "end": "10500000",
+ "size": 0.014954646,
+ "ndv": 61
+ }
+ ]
+}
+Country ABW ZWE 50 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "ABW",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "ALB",
+ "size": 0.020325203,
+ "ndv": 8
+ },
+ {
+ "start": "ATG",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "AZE",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "BFA",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "BLR",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "BRN",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "CAN",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "CHN",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "CMR",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "COK",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "CXR",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "DJI",
+ "size": 0.020325203,
+ "ndv": 8
+ },
+ {
+ "start": "ERI",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "ETH",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "FSM",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "GHA",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "GNB",
+ "size": 0.020325203,
+ "ndv": 8
+ },
+ {
+ "start": "GUM",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "HUN",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "IND",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "IRQ",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "JOR",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "KEN",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "KWT",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "LCA",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "LVA",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "MDA",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "MLI",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "MNP",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "MRT",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "MYS",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "NFK",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "NLD",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "OMN",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "PHL",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "PRI",
+ "size": 0.020325203,
+ "ndv": 8
+ },
+ {
+ "start": "REU",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "RWA",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "SGP",
+ "size": 0.020325203,
+ "ndv": 8
+ },
+ {
+ "start": "SPM",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "SWZ",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "TGO",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "TON",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "TZA",
+ "size": 0.020325203,
+ "ndv": 2
+ },
+ {
+ "start": "UGA",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "USA",
+ "size": 0.020325203,
+ "ndv": 8
+ },
+ {
+ "start": "VNM",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "YUG",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "ZWE",
+ "end": "ZWE",
+ "size": 0.004065041,
+ "ndv": 1
+ }
+ ]
+}
+Language Abhyasi [South]Mande 48 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "Abhyasi",
+ "size": 0.020325203,
+ "ndv": 12
+ },
+ {
+ "start": "Ami",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "Arabic",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "Armenian",
+ "size": 0.020325203,
+ "ndv": 11
+ },
+ {
+ "start": "Balochi",
+ "size": 0.020325203,
+ "ndv": 13
+ },
+ {
+ "start": "Belorussian",
+ "size": 0.020325203,
+ "ndv": 13
+ },
+ {
+ "start": "Bullom-sherbro",
+ "size": 0.020325203,
+ "ndv": 15
+ },
+ {
+ "start": "Chechen",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "Chinese",
+ "size": 0.020325203,
+ "ndv": 12
+ },
+ {
+ "start": "Creole English",
+ "size": 0.020325203,
+ "ndv": 2
+ },
+ {
+ "start": "Creole French",
+ "size": 0.020325203,
+ "ndv": 13
+ },
+ {
+ "start": "Dorbet",
+ "size": 0.012195122,
+ "ndv": 8
+ },
+ {
+ "start": "English",
+ "size": 0.06097561,
+ "ndv": 1
+ },
+ {
+ "start": "Eskimo Languages",
+ "size": 0.020325203,
+ "ndv": 9
+ },
+ {
+ "start": "French",
+ "size": 0.020325203,
+ "ndv": 2
+ },
+ {
+ "start": "Friuli",
+ "size": 0.020325203,
+ "ndv": 9
+ },
+ {
+ "start": "Ganda",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "German",
+ "size": 0.020325203,
+ "ndv": 11
+ },
+ {
+ "start": "Guaymí",
+ "size": 0.020325203,
+ "ndv": 15
+ },
+ {
+ "start": "Hehet",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "Hungarian",
+ "size": 0.020325203,
+ "ndv": 10
+ },
+ {
+ "start": "Italian",
+ "size": 0.020325203,
+ "ndv": 10
+ },
+ {
+ "start": "Kanuri",
+ "size": 0.020325203,
+ "ndv": 10
+ },
+ {
+ "start": "Khoekhoe",
+ "size": 0.020325203,
+ "ndv": 11
+ },
+ {
+ "start": "Kotokoli",
+ "size": 0.020325203,
+ "ndv": 14
+ },
+ {
+ "start": "Lithuanian",
+ "size": 0.020325203,
+ "ndv": 16
+ },
+ {
+ "start": "Macedonian",
+ "size": 0.020325203,
+ "ndv": 13
+ },
+ {
+ "start": "Malenasian Languages",
+ "size": 0.020325203,
+ "ndv": 12
+ },
+ {
+ "start": "Maranao",
+ "size": 0.020325203,
+ "ndv": 18
+ },
+ {
+ "start": "Miao",
+ "size": 0.020325203,
+ "ndv": 17
+ },
+ {
+ "start": "Muong",
+ "size": 0.020325203,
+ "ndv": 15
+ },
+ {
+ "start": "Norwegian",
+ "size": 0.020325203,
+ "ndv": 18
+ },
+ {
+ "start": "Paiwan",
+ "size": 0.020325203,
+ "ndv": 13
+ },
+ {
+ "start": "Polish",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "Portuguese",
+ "size": 0.020325203,
+ "ndv": 9
+ },
+ {
+ "start": "Romanian",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "Russian",
+ "size": 0.020325203,
+ "ndv": 10
+ },
+ {
+ "start": "Saraiki",
+ "size": 0.020325203,
+ "ndv": 10
+ },
+ {
+ "start": "Sidamo",
+ "size": 0.020325203,
+ "ndv": 12
+ },
+ {
+ "start": "Soninke",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "Spanish",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "Sunda",
+ "size": 0.020325203,
+ "ndv": 11
+ },
+ {
+ "start": "Tamil",
+ "size": 0.020325203,
+ "ndv": 11
+ },
+ {
+ "start": "Tigre",
+ "size": 0.020325203,
+ "ndv": 15
+ },
+ {
+ "start": "Turkish",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "Ukrainian",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "Uzbek",
+ "size": 0.020325203,
+ "ndv": 13
+ },
+ {
+ "start": "Yap",
+ "end": "[South]Mande",
+ "size": 0.012195122,
+ "ndv": 9
+ }
+ ]
+}
+Percentage 0.0 99.9 47 JSON_HB {
+ "target_histogram_size": 50,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "0.0",
+ "size": 0.066056911,
+ "ndv": 1
+ },
+ {
+ "start": "0.1",
+ "size": 0.020325203,
+ "ndv": 1
+ },
+ {
+ "start": "0.2",
+ "size": 0.022357724,
+ "ndv": 1
+ },
+ {
+ "start": "0.3",
+ "size": 0.017276423,
+ "ndv": 1
+ },
+ {
+ "start": "0.4",
+ "size": 0.025406504,
+ "ndv": 1
+ },
+ {
+ "start": "0.5",
+ "size": 0.020325203,
+ "ndv": 1
+ },
+ {
+ "start": "0.6",
+ "size": 0.020325203,
+ "ndv": 1
+ },
+ {
+ "start": "0.7",
+ "size": 0.020325203,
+ "ndv": 2
+ },
+ {
+ "start": "0.8",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "1.0",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "1.3",
+ "size": 0.020325203,
+ "ndv": 2
+ },
+ {
+ "start": "1.4",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "1.6",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "1.8",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "2.1",
+ "size": 0.020325203,
+ "ndv": 3
+ },
+ {
+ "start": "2.3",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "2.6",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "2.9",
+ "size": 0.020325203,
+ "ndv": 4
+ },
+ {
+ "start": "3.2",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "3.6",
+ "size": 0.020325203,
+ "ndv": 5
+ },
+ {
+ "start": "4.1",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "4.6",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "5.1",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "5.7",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "6.2",
+ "size": 0.020325203,
+ "ndv": 8
+ },
+ {
+ "start": "6.9",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "7.6",
+ "size": 0.020325203,
+ "ndv": 6
+ },
+ {
+ "start": "8.2",
+ "size": 0.020325203,
+ "ndv": 7
+ },
+ {
+ "start": "8.9",
+ "size": 0.020325203,
+ "ndv": 9
+ },
+ {
+ "start": "9.7",
+ "size": 0.020325203,
+ "ndv": 11
+ },
+ {
+ "start": "11.0",
+ "size": 0.020325203,
+ "ndv": 15
+ },
+ {
+ "start": "12.4",
+ "size": 0.020325203,
+ "ndv": 14
+ },
+ {
+ "start": "14.1",
+ "size": 0.020325203,
+ "ndv": 13
+ },
+ {
+ "start": "16.5",
+ "size": 0.020325203,
+ "ndv": 17
+ },
+ {
+ "start": "19.7",
+ "size": 0.020325203,
+ "ndv": 14
+ },
+ {
+ "start": "23.3",
+ "size": 0.020325203,
+ "ndv": 16
+ },
+ {
+ "start": "31.7",
+ "size": 0.020325203,
+ "ndv": 16
+ },
+ {
+ "start": "37.5",
+ "size": 0.020325203,
+ "ndv": 19
+ },
+ {
+ "start": "47.4",
+ "size": 0.020325203,
+ "ndv": 18
+ },
+ {
+ "start": "55.1",
+ "size": 0.020325203,
+ "ndv": 19
+ },
+ {
+ "start": "66.7",
+ "size": 0.020325203,
+ "ndv": 18
+ },
+ {
+ "start": "78.1",
+ "size": 0.020325203,
+ "ndv": 15
+ },
+ {
+ "start": "86.2",
+ "size": 0.020325203,
+ "ndv": 18
+ },
+ {
+ "start": "90.7",
+ "size": 0.020325203,
+ "ndv": 15
+ },
+ {
+ "start": "95.1",
+ "size": 0.020325203,
+ "ndv": 14
+ },
+ {
+ "start": "97.6",
+ "size": 0.020325203,
+ "ndv": 14
+ },
+ {
+ "start": "99.9",
+ "end": "99.9",
+ "size": 0.015243902,
+ "ndv": 1
+ }
+ ]
+}
+analyze select * from Country use index () where Code between 'BBC' and 'GGG';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE Country ALL NULL NULL NULL NULL 239 239.00 24.58 25.52 Using where
+analyze select * from Country use index () where Code < 'BBC';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE Country ALL NULL NULL NULL NULL 239 239.00 8.37 7.11 Using where
+set histogram_type=@save_histogram_type;
+set histogram_size=@save_histogram_size;
+DROP SCHEMA world;
+use test;
+create table t10 (
+a varchar(10)
+);
+#
+# Histograms are not collected for empty tables:
+#
+analyze table t10 persistent for all;
+Table Op Msg_type Msg_text
+test.t10 analyze status Engine-independent statistics collected
+test.t10 analyze status Table is already up to date
+select histogram
+from mysql.column_stats where table_name='t10' and db_name=database();
+histogram
+NULL
+#
+# Try with n_buckets > n_rows
+#
+insert into t10 values ('Berlin'),('Paris'),('Rome');
+set histogram_size=10, histogram_type='json_hb';
+analyze table t10 persistent for all;
+Table Op Msg_type Msg_text
+test.t10 analyze status Engine-independent statistics collected
+test.t10 analyze status OK
+select histogram
+from mysql.column_stats where table_name='t10' and db_name=database();
+histogram
+{
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "Berlin",
+ "size": 0.333333333,
+ "ndv": 1
+ },
+ {
+ "start": "Paris",
+ "size": 0.333333333,
+ "ndv": 1
+ },
+ {
+ "start": "Rome",
+ "end": "Rome",
+ "size": 0.333333333,
+ "ndv": 1
+ }
+ ]
+}
+drop table t10;
+#
+# MDEV-26590: Stack smashing/buffer overflow in Histogram_json_hb::parse upon UPDATE on table with long VARCHAR
+#
+CREATE TABLE t1 (b INT, a VARCHAR(3176));
+INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
+SET histogram_type= JSON_HB;
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+SELECT * FROM t1;
+b a
+1 foo
+2 bar
+drop table t1;
+#
+# MDEV-26589: Assertion failure upon DECODE_HISTOGRAM with NULLs in first column
+#
+CREATE TABLE t1 (a INT, b INT);
+INSERT INTO t1 VALUES (NULL,1), (NULL,2);
+SET histogram_type = JSON_HB;
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+SELECT DECODE_HISTOGRAM(hist_type, histogram) from mysql.column_stats;
+DECODE_HISTOGRAM(hist_type, histogram)
+NULL
+{
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.5,
+ "ndv": 1
+ },
+ {
+ "start": "2",
+ "end": "2",
+ "size": 0.5,
+ "ndv": 1
+ }
+ ]
+}
+drop table t1;
+#
+# MDEV-26711: Values in JSON histograms are not properly quoted
+#
+create table t1 (a varchar(32));
+insert into t1 values ('this is "quoted" text');
+set histogram_type= JSON_HB;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select * from t1 where a = 'foo';
+a
+drop table t1;
+#
+# MDEV-26724 Endless loop in json_escape_to_string upon ... empty string
+#
+CREATE TABLE t1 (f VARCHAR(8));
+INSERT INTO t1 VALUES ('a'),(''),('b');
+SET histogram_type=JSON_HB;
+ANALYZE TABLE t PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+test.t analyze Error Table 'test.t' doesn't exist
+test.t analyze status Operation failed
+select * from t1;
+f
+a
+
+b
+drop table t1;
+create table t1 (a char(1)) character set latin1;
+insert into t1 values (0xD1);
+select hex(a) from t1;
+hex(a)
+D1
+set histogram_type='json_hb';
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select decode_histogram(hist_type, histogram)
+from mysql.column_stats
+where db_name=database() and table_name='t1';
+decode_histogram(hist_type, histogram)
+{
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "Ñ",
+ "end": "Ñ",
+ "size": 1,
+ "ndv": 1
+ }
+ ]
+}
+select * from t1;
+a
+Ñ
+drop table t1;
+#
+# Another testcase: use a character that cannot be represented in utf8:
+# Also, now it's testcase for:
+# MDEV-26764: JSON_HB Histograms: handle BINARY and unassigned characters
+#
+create table t1 ( a varchar(100) character set cp1251);
+insert into t1 values ( _cp1251 x'88'),( _cp1251 x'88'), ( _cp1251 x'88');
+insert into t1 values ( _cp1251 x'98'),( _cp1251 x'98');
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select hist_type, histogram
+from mysql.column_stats
+where db_name=database() and table_name='t1';
+hist_type histogram
+JSON_HB {
+ "target_histogram_size": 10,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "€",
+ "size": 0.6,
+ "ndv": 1
+ },
+ {
+ "start_hex": "98",
+ "end_hex": "98",
+ "size": 0.4,
+ "ndv": 1
+ }
+ ]
+}
+analyze select * from t1 where a=_cp1251 x'88';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 5 5.00 60.00 60.00 Using where
+drop table t1;
+#
+# ASAN use-after-poison my_strnxfrm_simple_internal / Histogram_json_hb::range_selectivity ...
+# (Just the testcase)
+#
+CREATE TABLE t1 (f CHAR(8));
+INSERT INTO t1 VALUES ('foo'),('bar');
+SET histogram_type = JSON_HB;
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+SELECT * FROM t1 WHERE f > 'qux';
+f
+DROP TABLE t1;
+#
+# MDEV-26737: Outdated VARIABLE_COMMENT for HISTOGRAM_TYPE in I_S.SYSTEM_VARIABLES
+#
+select variable_comment from information_schema.system_variables where VARIABLE_NAME='HISTOGRAM_TYPE';
+variable_comment
+Specifies type of the histograms created by ANALYZE. Possible values are: SINGLE_PREC_HB - single precision height-balanced, DOUBLE_PREC_HB - double precision height-balanced, JSON_HB - height-balanced, stored as JSON.
+#
+# MDEV-26709: JSON histogram may contain bucketS than histogram_size allows
+#
+create table t1 (a int);
+insert into t1 values (1),(3),(5),(7);
+insert into t1 select 2 from seq_1_to_25;
+insert into t1 select 4 from seq_1_to_25;
+insert into t1 select 6 from seq_1_to_25;
+set histogram_size=4, histogram_type=JSON_HB;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select histogram from mysql.column_stats where table_name = 't1';
+histogram
+{
+ "target_histogram_size": 4,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "1",
+ "size": 0.253164557,
+ "ndv": 2
+ },
+ {
+ "start": "2",
+ "size": 0.253164557,
+ "ndv": 3
+ },
+ {
+ "start": "4",
+ "size": 0.253164557,
+ "ndv": 3
+ },
+ {
+ "start": "6",
+ "end": "7",
+ "size": 0.240506329,
+ "ndv": 2
+ }
+ ]
+}
+drop table t1;
+#
+# MDEV-26750: Estimation for filtered rows is far off with JSON_HB histogram
+#
+create table t1 (c char(8));
+insert into t1 values ('1x');
+insert into t1 values ('1x');
+insert into t1 values ('1xx');
+insert into t1 values ('0xx');
+insert into t1 select * from t1;
+insert into t1 select * from t1;
+set histogram_type= JSON_HB;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+analyze
+select c from t1 where c > '1';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 16 16.00 75.00 75.00 Using where
+drop table t1;
+#
+# MDEV-26849: JSON Histograms: point selectivity estimates are off for non-existent values
+#
+create table t0(a int);
+insert into t0 (a) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+create table t1(a int);
+insert into t1 select 100*A.a from t0 A, t0 B, t0 C;
+select a, count(*) from t1 group by a order by a;
+a count(*)
+0 100
+100 100
+200 100
+300 100
+400 100
+500 100
+600 100
+700 100
+800 100
+900 100
+set histogram_type=json_hb, histogram_size=default;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select * from mysql.column_stats where table_name='t1';
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+test t1 a 0 900 0.0000 4.0000 100.0000 10 JSON_HB {
+ "target_histogram_size": 254,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start": "0",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "100",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "200",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "300",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "400",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "500",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "600",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "700",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "800",
+ "size": 0.1,
+ "ndv": 1
+ },
+ {
+ "start": "900",
+ "end": "900",
+ "size": 0.1,
+ "ndv": 1
+ }
+ ]
+}
+analyze select * from t1 where a=0;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1000.00 10.00 10.00 Using where
+analyze select * from t1 where a=50;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1000.00 0.10 0.00 Using where
+analyze select * from t1 where a=70;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1000.00 0.10 0.00 Using where
+analyze select * from t1 where a=100;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1000.00 10.00 10.00 Using where
+analyze select * from t1 where a=150;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1000.00 0.10 0.00 Using where
+analyze select * from t1 where a=200;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1000.00 10.00 10.00 Using where
+drop table t0,t1;
+#
+# MDEV-26892: JSON histograms become invalid with a specific (corrupt) value in t
+#
+create table t1 (a varchar(32)) DEFAULT CHARSET=cp1257;
+set histogram_type= JSON_HB, histogram_size= 1;
+insert into t1 values ('foo'),(unhex('9C'));
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select * from t1;
+a
+foo
+?
+drop table t1;
+#
+# MDEV-26911: Unexpected ER_DUP_KEY, ASAN errors, double free detected in tcache with JSON_HB histogram
+#
+SET histogram_type= JSON_HB;
+CREATE TABLE t1 (pk INT AUTO_INCREMENT, f VARCHAR(8), PRIMARY KEY (pk));
+INSERT INTO t1 (f) VALUES ('foo');
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+ALTER TABLE t1 MODIFY f TEXT, ORDER BY pk;
+INSERT INTO t1 (f) VALUES ('bar');
+DROP TABLE t1;
+#
+# MDEV-26886: Estimation for filtered rows less precise with JSON histogram
+#
+create table t1 (a tinyint) as select if(seq%3,seq,0) as a from seq_1_to_100;
+select count(*) from t1 where a <= 0;
+count(*)
+33
+set histogram_type = JSON_HB, histogram_size=default;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+analyze select * from t1 where a <= 0;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 33.00 33.00 Using where
+analyze select * from t1 where a < 0;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 1.00 0.00 Using where
+analyze select * from t1 where a > 0;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 67.00 67.00 Using where
+analyze select * from t1 where a >= 0;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 100.00 100.00 Using where
+drop table t1;
+#
+# More test coverage
+#
+create table t0(a int);
+insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+create table t1(a int);
+insert into t1 select A.a + B.a* 10 + C.a * 100 from t0 A, t0 B, t0 C;
+create table t2 (a int);
+insert into t2 select 1 from t1;
+insert into t2 select (a+1)*10 from t0;
+insert into t2 values (0);
+analyze table t2 persistent for all;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+analyze select * from t2 where a < 1;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 1011 1011.00 0.10 0.10 Using where
+analyze select * from t2 where a =100;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t2 ALL NULL NULL NULL NULL 1011 1011.00 0.10 0.10 Using where
+drop table t0,t1,t2;
+#
+# MDEV-27230: Estimation for filtered rows less precise ...
+#
+create table t1 (a char(1));
+insert into t1 select chr(seq%26+97) from seq_1_to_50;
+insert into t1 select ':' from t1;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+analyze select COUNT(*) FROM t1 WHERE a <> 'a';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 99.00 99.00 Using where
+analyze select COUNT(*) FROM t1 WHERE a < 'a';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 50.00 50.00 Using where
+drop table t1;
+#
+# MDEV-27229: Estimation for filtered rows less precise ... #5
+#
+create table t1 (id int, a varchar(8));
+insert into t1 select seq, 'bar' from seq_1_to_100;
+insert into t1 select id, 'qux' from t1;
+set histogram_type=JSON_HB;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+analyze select COUNT(*) FROM t1 WHERE a > 'foo';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 200 200.00 50.00 50.00 Using where
+analyze select COUNT(*) FROM t1 WHERE a > 'aaa';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 200 200.00 100.00 100.00 Using where
+analyze select COUNT(*) FROM t1 WHERE a >='aaa';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 200 200.00 100.00 100.00 Using where
+analyze select COUNT(*) FROM t1 WHERE a > 'bar';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 200 200.00 50.00 50.00 Using where
+analyze select COUNT(*) FROM t1 WHERE a >='bar';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 200 200.00 100.00 100.00 Using where
+analyze select COUNT(*) FROM t1 WHERE a < 'aaa';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 200 200.00 0.50 0.00 Using where
+analyze select COUNT(*) FROM t1 WHERE a <='aaa';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 200 200.00 0.50 0.00 Using where
+analyze select COUNT(*) FROM t1 WHERE a < 'bar';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 200 200.00 0.50 0.00 Using where
+analyze select COUNT(*) FROM t1 WHERE a <='bar';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 200 200.00 50.00 50.00 Using where
+drop table t1;
+#
+# MDEV-27243: Estimation for filtered rows less precise ... #7
+# (Testcase only)
+CREATE TABLE t1 (f TIME);
+INSERT INTO t1 SELECT IF(seq%2,'00:00:00',SEC_TO_TIME(seq+7200)) FROM seq_1_to_1000;
+SET histogram_type= JSON_HB;
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+ANALYZE SELECT * FROM t1 WHERE f > '00:01:00';
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 1000.00 50.00 50.00 Using where
+drop table t1;
+#
+# MDEV-26901: Estimation for filtered rows less precise ... #4
+#
+create table t1 (f int);
+insert into t1 values
+(7),(5),(0),(5),(112),(9),(9),(7),(5),(9),
+(1),(7),(0),(6),(6),(2),(1),(6),(169),(7);
+select f from t1 where f in (77, 1, 144, 73, 14, 12);
+f
+1
+1
+set histogram_type= JSON_HB;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+analyze select f from t1 where f in (77, 1, 144, 73, 14, 12);
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 20 20.00 10.00 10.00 Using where
+drop table t1;
+#
+# Test that histograms over BIT fields use hex
+#
+create table t1 (a BIT(64));
+insert into t1 values
+(x'01'),(x'10'),(x'BE562B1A99001918');
+set histogram_type= JSON_HB;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select histogram
+from mysql.column_stats where table_name='t1' and db_name=database();
+histogram
+{
+ "target_histogram_size": 254,
+ "collected_at": "REPLACED",
+ "collected_by": "REPLACED",
+ "histogram_hb": [
+ {
+ "start_hex": "0000000000000001",
+ "size": 0.333333333,
+ "ndv": 1
+ },
+ {
+ "start_hex": "0000000000000010",
+ "size": 0.333333333,
+ "ndv": 1
+ },
+ {
+ "start_hex": "BE562B1A99001918",
+ "end_hex": "BE562B1A99001918",
+ "size": 0.333333333,
+ "ndv": 1
+ }
+ ]
+}
+drop table t1;
+#
+# MDEV-28882: Assertion `tmp >= 0' failed in best_access_path
+#
+CREATE TABLE t1 (a varchar(1));
+INSERT INTO t1 VALUES ('o'),('s'),('j'),('s'),('y'),('s'),('l'),
+('q'),('x'),('m'),('t'),('d'),('v'),('j'),('p'),('t'),('b'),('q');
+set histogram_type=json_hb;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+# filtered must not be negative:
+explain format=json select * from t1 where a > 'y';
+EXPLAIN
+{
+ "query_block": {
+ "select_id": 1,
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 18,
+ "filtered": 5.555555344,
+ "attached_condition": "t1.a > 'y'"
+ }
+ }
+ ]
+ }
+}
+drop table t1;
diff --git a/mysql-test/main/statistics_json.test b/mysql-test/main/statistics_json.test
new file mode 100644
index 00000000000..5263a98fff7
--- /dev/null
+++ b/mysql-test/main/statistics_json.test
@@ -0,0 +1,483 @@
+--echo #
+--echo # Test that we can store JSON arrays in histogram field mysql.column_stats when histogram_type=JSON
+--echo #
+
+let $histogram_type_override='JSON_HB';
+--source statistics.test
+
+--source include/have_innodb.inc
+--source include/have_stat_tables.inc
+--source include/have_sequence.inc
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+
+set @save_histogram_type=@@histogram_type;
+set @save_histogram_size=@@histogram_size;
+
+call mtr.add_suppression("Failed to parse histogram for table .*");
+create table ten(a int primary key);
+insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+
+set histogram_size=100;
+set histogram_type='double_prec_hb';
+create table t1_bin (a varchar(255));
+insert into t1_bin select concat('a-', a) from ten;
+analyze table t1_bin persistent for all;
+select hex(histogram) from mysql.column_stats where table_name='t1_bin';
+explain extended select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
+analyze select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
+
+set histogram_type=json_hb;
+create table t1_json (a varchar(255));
+insert into t1_json select concat('a-', a) from ten;
+analyze table t1_json persistent for all;
+--source include/json_hb_histogram.inc
+select * from mysql.column_stats where table_name='t1_json';
+explain extended select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
+analyze select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
+explain extended select * from t1_json where a < 'b-1a';
+analyze select * from t1_json where a > 'zzzzzzzzz';
+
+drop table ten;
+
+#
+# Test different valid JSON strings that are invalid histograms.
+#
+UPDATE mysql.column_stats
+SET histogram='["not-what-you-expect"]' WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":"not-histogram"}' WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":["not-a-bucket"]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"no-expected-members":1}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"start":{}}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"start":"aaa", "size":"not-an-integer"}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"start":"aaa", "size":0.25}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[{"start":"aaa", "size":0.25, "ndv":1}]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+
+UPDATE mysql.column_stats
+SET histogram='{"histogram_hb":[]}'
+WHERE table_name='t1_json';
+FLUSH TABLES;
+explain select * from t1_json limit 1;
+
+--source include/have_sequence.inc
+create table t2 (
+ city varchar(100)
+);
+set histogram_size=50;
+insert into t2 select 'Moscow' from seq_1_to_99;
+insert into t2 select 'Helsinki' from seq_1_to_2;
+set histogram_type=json_hb;
+analyze table t2 persistent for all;
+explain extended select * from t2 where city = 'Moscow';
+analyze select * from t2 where city = 'Moscow';
+explain extended select * from t2 where city = 'Helsinki';
+analyze select * from t2 where city = 'helsinki';
+explain extended select * from t2 where city < 'Lagos';
+
+drop table t1_bin;
+drop table t1_json;
+drop table t2;
+
+DELETE FROM mysql.column_stats;
+
+--disable_service_connection
+
+create schema world;
+use world;
+--disable_query_log
+--disable_result_log
+--disable_warnings
+--source include/world_schema_utf8.inc
+--source include/world.inc
+--enable_warnings
+--enable_result_log
+--enable_query_log
+
+set histogram_type='JSON_HB';
+set histogram_size=50;
+--disable_result_log
+ANALYZE TABLE Country, City, CountryLanguage persistent for all;
+--enable_result_log
+
+--source include/histogram_replaces.inc
+SELECT column_name, min_value, max_value, hist_size, hist_type, histogram FROM mysql.column_stats;
+analyze select * from Country use index () where Code between 'BBC' and 'GGG';
+analyze select * from Country use index () where Code < 'BBC';
+
+set histogram_type=@save_histogram_type;
+set histogram_size=@save_histogram_size;
+
+DROP SCHEMA world;
+
+--enable_service_connection
+
+use test;
+
+create table t10 (
+ a varchar(10)
+);
+
+--echo #
+--echo # Histograms are not collected for empty tables:
+--echo #
+analyze table t10 persistent for all;
+select histogram
+from mysql.column_stats where table_name='t10' and db_name=database();
+
+--echo #
+--echo # Try with n_buckets > n_rows
+--echo #
+insert into t10 values ('Berlin'),('Paris'),('Rome');
+set histogram_size=10, histogram_type='json_hb';
+analyze table t10 persistent for all;
+--source include/histogram_replaces.inc
+select histogram
+from mysql.column_stats where table_name='t10' and db_name=database();
+drop table t10;
+
+--echo #
+--echo # MDEV-26590: Stack smashing/buffer overflow in Histogram_json_hb::parse upon UPDATE on table with long VARCHAR
+--echo #
+
+CREATE TABLE t1 (b INT, a VARCHAR(3176));
+INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
+SET histogram_type= JSON_HB;
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+SELECT * FROM t1;
+drop table t1;
+
+--echo #
+--echo # MDEV-26589: Assertion failure upon DECODE_HISTOGRAM with NULLs in first column
+--echo #
+
+CREATE TABLE t1 (a INT, b INT);
+INSERT INTO t1 VALUES (NULL,1), (NULL,2);
+SET histogram_type = JSON_HB;
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+--source include/histogram_replaces.inc
+SELECT DECODE_HISTOGRAM(hist_type, histogram) from mysql.column_stats;
+drop table t1;
+
+--echo #
+--echo # MDEV-26711: Values in JSON histograms are not properly quoted
+--echo #
+
+create table t1 (a varchar(32));
+insert into t1 values ('this is "quoted" text');
+set histogram_type= JSON_HB;
+analyze table t1 persistent for all;
+select * from t1 where a = 'foo';
+drop table t1;
+
+--echo #
+--echo # MDEV-26724 Endless loop in json_escape_to_string upon ... empty string
+--echo #
+CREATE TABLE t1 (f VARCHAR(8));
+INSERT INTO t1 VALUES ('a'),(''),('b');
+SET histogram_type=JSON_HB;
+ANALYZE TABLE t PERSISTENT FOR ALL;
+select * from t1;
+drop table t1;
+
+create table t1 (a char(1)) character set latin1;
+insert into t1 values (0xD1);
+select hex(a) from t1;
+set histogram_type='json_hb';
+analyze table t1 persistent for all;
+
+--source include/histogram_replaces.inc
+select decode_histogram(hist_type, histogram)
+from mysql.column_stats
+where db_name=database() and table_name='t1';
+
+select * from t1;
+drop table t1;
+
+--echo #
+--echo # Another testcase: use a character that cannot be represented in utf8:
+--echo # Also, now it's testcase for:
+--echo # MDEV-26764: JSON_HB Histograms: handle BINARY and unassigned characters
+--echo #
+create table t1 ( a varchar(100) character set cp1251);
+insert into t1 values ( _cp1251 x'88'),( _cp1251 x'88'), ( _cp1251 x'88');
+insert into t1 values ( _cp1251 x'98'),( _cp1251 x'98');
+analyze table t1 persistent for all;
+
+--source include/histogram_replaces.inc
+select hist_type, histogram
+from mysql.column_stats
+where db_name=database() and table_name='t1';
+
+analyze select * from t1 where a=_cp1251 x'88';
+
+drop table t1;
+
+--echo #
+--echo # ASAN use-after-poison my_strnxfrm_simple_internal / Histogram_json_hb::range_selectivity ...
+--echo # (Just the testcase)
+--echo #
+
+CREATE TABLE t1 (f CHAR(8));
+INSERT INTO t1 VALUES ('foo'),('bar');
+
+SET histogram_type = JSON_HB;
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+
+SELECT * FROM t1 WHERE f > 'qux';
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26737: Outdated VARIABLE_COMMENT for HISTOGRAM_TYPE in I_S.SYSTEM_VARIABLES
+--echo #
+select variable_comment from information_schema.system_variables where VARIABLE_NAME='HISTOGRAM_TYPE';
+
+--echo #
+--echo # MDEV-26709: JSON histogram may contain bucketS than histogram_size allows
+--echo #
+create table t1 (a int);
+insert into t1 values (1),(3),(5),(7);
+insert into t1 select 2 from seq_1_to_25;
+insert into t1 select 4 from seq_1_to_25;
+insert into t1 select 6 from seq_1_to_25;
+
+set histogram_size=4, histogram_type=JSON_HB;
+analyze table t1 persistent for all;
+
+--source include/json_hb_histogram.inc
+select histogram from mysql.column_stats where table_name = 't1';
+
+drop table t1;
+
+--echo #
+--echo # MDEV-26750: Estimation for filtered rows is far off with JSON_HB histogram
+--echo #
+create table t1 (c char(8));
+
+insert into t1 values ('1x');
+insert into t1 values ('1x');
+insert into t1 values ('1xx');
+insert into t1 values ('0xx');
+insert into t1 select * from t1;
+insert into t1 select * from t1;
+
+set histogram_type= JSON_HB;
+analyze table t1 persistent for all;
+analyze
+select c from t1 where c > '1';
+
+drop table t1;
+
+--echo #
+--echo # MDEV-26849: JSON Histograms: point selectivity estimates are off for non-existent values
+--echo #
+
+create table t0(a int);
+insert into t0 (a) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+create table t1(a int);
+insert into t1 select 100*A.a from t0 A, t0 B, t0 C;
+select a, count(*) from t1 group by a order by a;
+set histogram_type=json_hb, histogram_size=default;
+analyze table t1 persistent for all;
+--source include/json_hb_histogram.inc
+select * from mysql.column_stats where table_name='t1';
+analyze select * from t1 where a=0;
+analyze select * from t1 where a=50;
+analyze select * from t1 where a=70;
+analyze select * from t1 where a=100;
+analyze select * from t1 where a=150;
+analyze select * from t1 where a=200;
+
+drop table t0,t1;
+
+--echo #
+--echo # MDEV-26892: JSON histograms become invalid with a specific (corrupt) value in t
+--echo #
+create table t1 (a varchar(32)) DEFAULT CHARSET=cp1257;
+set histogram_type= JSON_HB, histogram_size= 1;
+insert into t1 values ('foo'),(unhex('9C'));
+analyze table t1 persistent for all;
+
+select * from t1;
+drop table t1;
+
+--echo #
+--echo # MDEV-26911: Unexpected ER_DUP_KEY, ASAN errors, double free detected in tcache with JSON_HB histogram
+--echo #
+
+SET histogram_type= JSON_HB;
+
+CREATE TABLE t1 (pk INT AUTO_INCREMENT, f VARCHAR(8), PRIMARY KEY (pk));
+INSERT INTO t1 (f) VALUES ('foo');
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+ALTER TABLE t1 MODIFY f TEXT, ORDER BY pk;
+INSERT INTO t1 (f) VALUES ('bar');
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26886: Estimation for filtered rows less precise with JSON histogram
+--echo #
+create table t1 (a tinyint) as select if(seq%3,seq,0) as a from seq_1_to_100;
+select count(*) from t1 where a <= 0;
+
+set histogram_type = JSON_HB, histogram_size=default;
+analyze table t1 persistent for all;
+analyze select * from t1 where a <= 0;
+analyze select * from t1 where a < 0;
+analyze select * from t1 where a > 0;
+analyze select * from t1 where a >= 0;
+drop table t1;
+
+
+--echo #
+--echo # More test coverage
+--echo #
+create table t0(a int);
+insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+
+create table t1(a int);
+insert into t1 select A.a + B.a* 10 + C.a * 100 from t0 A, t0 B, t0 C;
+
+create table t2 (a int);
+insert into t2 select 1 from t1;
+insert into t2 select (a+1)*10 from t0;
+insert into t2 values (0);
+
+analyze table t2 persistent for all;
+analyze select * from t2 where a < 1;
+analyze select * from t2 where a =100;
+
+drop table t0,t1,t2;
+
+--echo #
+--echo # MDEV-27230: Estimation for filtered rows less precise ...
+--echo #
+create table t1 (a char(1));
+insert into t1 select chr(seq%26+97) from seq_1_to_50;
+insert into t1 select ':' from t1;
+analyze table t1 persistent for all;
+analyze select COUNT(*) FROM t1 WHERE a <> 'a';
+analyze select COUNT(*) FROM t1 WHERE a < 'a';
+drop table t1;
+
+--echo #
+--echo # MDEV-27229: Estimation for filtered rows less precise ... #5
+--echo #
+create table t1 (id int, a varchar(8));
+insert into t1 select seq, 'bar' from seq_1_to_100;
+insert into t1 select id, 'qux' from t1;
+
+set histogram_type=JSON_HB;
+analyze table t1 persistent for all;
+analyze select COUNT(*) FROM t1 WHERE a > 'foo';
+
+analyze select COUNT(*) FROM t1 WHERE a > 'aaa';
+analyze select COUNT(*) FROM t1 WHERE a >='aaa';
+
+analyze select COUNT(*) FROM t1 WHERE a > 'bar';
+analyze select COUNT(*) FROM t1 WHERE a >='bar';
+
+# Can enable these after get_avg_frequency issue is resolved:
+analyze select COUNT(*) FROM t1 WHERE a < 'aaa';
+analyze select COUNT(*) FROM t1 WHERE a <='aaa';
+analyze select COUNT(*) FROM t1 WHERE a < 'bar';
+
+analyze select COUNT(*) FROM t1 WHERE a <='bar';
+
+drop table t1;
+
+--echo #
+--echo # MDEV-27243: Estimation for filtered rows less precise ... #7
+--echo # (Testcase only)
+
+CREATE TABLE t1 (f TIME);
+INSERT INTO t1 SELECT IF(seq%2,'00:00:00',SEC_TO_TIME(seq+7200)) FROM seq_1_to_1000;
+
+SET histogram_type= JSON_HB;
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+ANALYZE SELECT * FROM t1 WHERE f > '00:01:00';
+drop table t1;
+
+--echo #
+--echo # MDEV-26901: Estimation for filtered rows less precise ... #4
+--echo #
+create table t1 (f int);
+insert into t1 values
+ (7),(5),(0),(5),(112),(9),(9),(7),(5),(9),
+ (1),(7),(0),(6),(6),(2),(1),(6),(169),(7);
+
+select f from t1 where f in (77, 1, 144, 73, 14, 12);
+
+set histogram_type= JSON_HB;
+analyze table t1 persistent for all;
+
+analyze select f from t1 where f in (77, 1, 144, 73, 14, 12);
+drop table t1;
+
+
+--echo #
+--echo # Test that histograms over BIT fields use hex
+--echo #
+create table t1 (a BIT(64));
+insert into t1 values
+ (x'01'),(x'10'),(x'BE562B1A99001918');
+set histogram_type= JSON_HB;
+analyze table t1 persistent for all;
+--source include/json_hb_histogram.inc
+select histogram
+from mysql.column_stats where table_name='t1' and db_name=database();
+
+drop table t1;
+
+--echo #
+--echo # MDEV-28882: Assertion `tmp >= 0' failed in best_access_path
+--echo #
+
+CREATE TABLE t1 (a varchar(1));
+
+INSERT INTO t1 VALUES ('o'),('s'),('j'),('s'),('y'),('s'),('l'),
+ ('q'),('x'),('m'),('t'),('d'),('v'),('j'),('p'),('t'),('b'),('q');
+
+set histogram_type=json_hb;
+analyze table t1 persistent for all;
+--echo # filtered must not be negative:
+explain format=json select * from t1 where a > 'y';
+
+drop table t1;
+
diff --git a/mysql-test/main/statistics_upgrade.result b/mysql-test/main/statistics_upgrade.result
new file mode 100644
index 00000000000..87e2b23570d
--- /dev/null
+++ b/mysql-test/main/statistics_upgrade.result
@@ -0,0 +1,91 @@
+call mtr.add_suppression("Incorrect definition of table mysql.column_stats:.*");
+set histogram_type=single_prec_hb;
+create table t1 (a int);
+insert into t1 select seq from seq_1_to_100;
+analyze table t1 persistent for all;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+set histogram_type=double_prec_hb, histogram_size=20;
+create table t2 (a int);
+insert into t2 select seq from seq_1_to_100;
+analyze table t2 persistent for all;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status OK
+CREATE TABLE IF NOT EXISTS t3 (
+db_name varchar(64) NOT NULL,
+table_name varchar(64) NOT NULL,
+column_name varchar(64) NOT NULL,
+min_value varbinary(255) DEFAULT NULL,
+max_value varbinary(255) DEFAULT NULL,
+nulls_ratio decimal(12,4) DEFAULT NULL,
+avg_length decimal(12,4) DEFAULT NULL,
+avg_frequency decimal(12,4) DEFAULT NULL,
+hist_size tinyint unsigned,
+hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB'),
+histogram varbinary(255),
+PRIMARY KEY (db_name,table_name,column_name)
+) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Columns';
+insert into t3 select * from mysql.column_stats;
+create table t4 like t3;
+insert into t4 select * from t3;
+drop table mysql.column_stats;
+alter table t3 rename mysql.column_stats;
+# Run mysql_upgrade
+mysql.innodb_index_stats
+Error : Unknown storage engine 'InnoDB'
+error : Corrupt
+mysql.innodb_table_stats
+Error : Unknown storage engine 'InnoDB'
+error : Corrupt
+mysql.transaction_registry
+Error : Unknown storage engine 'InnoDB'
+error : Corrupt
+mysql.innodb_index_stats
+Error : Unknown storage engine 'InnoDB'
+error : Corrupt
+mysql.innodb_table_stats
+Error : Unknown storage engine 'InnoDB'
+error : Corrupt
+mysql.transaction_registry
+Error : Unknown storage engine 'InnoDB'
+error : Corrupt
+#
+# Table definition after upgrade:
+#
+show create table mysql.column_stats;
+Table Create Table
+column_stats CREATE TABLE `column_stats` (
+ `db_name` varchar(64) NOT NULL,
+ `table_name` varchar(64) NOT NULL,
+ `column_name` varchar(64) NOT NULL,
+ `min_value` varbinary(255) DEFAULT NULL,
+ `max_value` varbinary(255) DEFAULT NULL,
+ `nulls_ratio` decimal(12,4) DEFAULT NULL,
+ `avg_length` decimal(12,4) DEFAULT NULL,
+ `avg_frequency` decimal(12,4) DEFAULT NULL,
+ `hist_size` tinyint(3) unsigned DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') DEFAULT NULL,
+ `histogram` longblob DEFAULT NULL,
+ PRIMARY KEY (`db_name`,`table_name`,`column_name`)
+) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns'
+select
+A.db_name,
+A.table_name,
+A.hist_type = B.hist_type as hist_type_equal,
+A.histogram = B.histogram as histogram_equal
+from
+t4 A
+left join
+mysql.column_stats B on A.db_name=B.db_name and
+A.table_name=B.table_name and
+A.column_name=B.column_name;
+db_name table_name hist_type_equal histogram_equal
+test t1 1 1
+test t2 1 1
+drop table t1,t2,t4;
+#
+# MDEV-28866 mariadb-upgrade to 10.8 mysql.column_stats hist_type + histogram errors
+#
+FOUND 2 /Incorrect definition of table mysql.column_stats:/ in mysqld.1.err
diff --git a/mysql-test/main/statistics_upgrade.test b/mysql-test/main/statistics_upgrade.test
new file mode 100644
index 00000000000..9f47ab1a83b
--- /dev/null
+++ b/mysql-test/main/statistics_upgrade.test
@@ -0,0 +1,77 @@
+-- source include/mysql_upgrade_preparation.inc
+--source include/have_sequence.inc
+
+call mtr.add_suppression("Incorrect definition of table mysql.column_stats:.*");
+
+set histogram_type=single_prec_hb;
+create table t1 (a int);
+insert into t1 select seq from seq_1_to_100;
+analyze table t1 persistent for all;
+
+set histogram_type=double_prec_hb, histogram_size=20;
+create table t2 (a int);
+insert into t2 select seq from seq_1_to_100;
+analyze table t2 persistent for all;
+
+# Create a table with old definition
+CREATE TABLE IF NOT EXISTS t3 (
+ db_name varchar(64) NOT NULL,
+ table_name varchar(64) NOT NULL,
+ column_name varchar(64) NOT NULL,
+ min_value varbinary(255) DEFAULT NULL,
+ max_value varbinary(255) DEFAULT NULL,
+ nulls_ratio decimal(12,4) DEFAULT NULL,
+ avg_length decimal(12,4) DEFAULT NULL,
+ avg_frequency decimal(12,4) DEFAULT NULL,
+ hist_size tinyint unsigned,
+ hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB'),
+ histogram varbinary(255),
+ PRIMARY KEY (db_name,table_name,column_name)
+) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Columns';
+
+# Copy the data there
+insert into t3 select * from mysql.column_stats;
+
+create table t4 like t3;
+insert into t4 select * from t3;
+
+# Put the old table in place of mysql.column_stats
+
+drop table mysql.column_stats;
+alter table t3 rename mysql.column_stats;
+--echo # Run mysql_upgrade
+
+--exec $MYSQL_UPGRADE --upgrade-system-tables --force --silent 2>&1
+
+let $MYSQLD_DATADIR= `select @@datadir`;
+--file_exists $MYSQLD_DATADIR/mysql_upgrade_info
+--remove_file $MYSQLD_DATADIR/mysql_upgrade_info
+
+--echo #
+--echo # Table definition after upgrade:
+--echo #
+show create table mysql.column_stats;
+
+select
+ A.db_name,
+ A.table_name,
+ A.hist_type = B.hist_type as hist_type_equal,
+ A.histogram = B.histogram as histogram_equal
+from
+ t4 A
+ left join
+ mysql.column_stats B on A.db_name=B.db_name and
+ A.table_name=B.table_name and
+ A.column_name=B.column_name;
+
+drop table t1,t2,t4;
+
+--echo #
+--echo # MDEV-28866 mariadb-upgrade to 10.8 mysql.column_stats hist_type + histogram errors
+--echo #
+# There should only be two count here corresponding the test creation of mysql.column_stats, and
+# none generated by the $MYSQL_UPGRADE run.
+--let $error_log= $MYSQLTEST_VARDIR/log/mysqld.1.err
+--let SEARCH_FILE= $error_log
+--let SEARCH_PATTERN= Incorrect definition of table mysql.column_stats:
+--source include/search_pattern_in_file.inc
diff --git a/mysql-test/main/statistics_upgrade_not_done.result b/mysql-test/main/statistics_upgrade_not_done.result
new file mode 100644
index 00000000000..902bf25c242
--- /dev/null
+++ b/mysql-test/main/statistics_upgrade_not_done.result
@@ -0,0 +1,44 @@
+# Create the old-version of the table
+call mtr.add_suppression(".*Incorrect definition of table mysql.column_stats:.*");
+alter table mysql.column_stats rename test.t1;
+CREATE TABLE mysql.column_stats (
+`db_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
+`table_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
+`column_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
+`min_value` varbinary(255) DEFAULT NULL,
+`max_value` varbinary(255) DEFAULT NULL,
+`nulls_ratio` decimal(12,4) DEFAULT NULL,
+`avg_length` decimal(12,4) DEFAULT NULL,
+`avg_frequency` decimal(12,4) DEFAULT NULL,
+`hist_size` tinyint(3) unsigned DEFAULT NULL,
+`hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') COLLATE utf8mb3_bin DEFAULT NULL,
+`histogram` varbinary(255) DEFAULT NULL,
+PRIMARY KEY (`db_name`,`table_name`,`column_name`)
+) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns';
+create table t0(a int);
+insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+INSERT INTO mysql.column_stats VALUES
+('test','t0','a','0','9',0.0000,4.0000,1.0000,5,'DOUBLE_PREC_HB', x'5555AAAA00');
+flush tables;
+analyze select * from t0 where a<3;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t0 ALL NULL NULL NULL NULL 10 10.00 100.00 30.00 Using where
+# restart
+select hex(histogram) from mysql.column_stats where table_name='t0' and db_name='test';
+hex(histogram)
+5555AAAA00
+analyze select * from t0 where a<3;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t0 ALL NULL NULL NULL NULL 10 10.00 100.00 30.00 Using where
+create table t2 (a int);
+# This currently just pretends that the histogram was collected.
+analyze table t2 persistent for all;
+Table Op Msg_type Msg_text
+test.t2 analyze status Engine-independent statistics collected
+test.t2 analyze status Table is already up to date
+select * from mysql.column_stats where table_name='t2' and db_name='test';
+db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
+analyze select * from t0 where a<3;
+id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
+1 SIMPLE t0 ALL NULL NULL NULL NULL 10 10.00 33.33 30.00 Using where
+drop table t0, t1, t2;
diff --git a/mysql-test/main/statistics_upgrade_not_done.test b/mysql-test/main/statistics_upgrade_not_done.test
new file mode 100644
index 00000000000..a74a5f35d83
--- /dev/null
+++ b/mysql-test/main/statistics_upgrade_not_done.test
@@ -0,0 +1,57 @@
+--source include/not_embedded.inc
+--source include/mysql_upgrade_preparation.inc
+--source include/have_innodb.inc
+
+#
+# This is like the upgrade test in statistics_upgrade.test, except that we also
+# check what happens if one doesn't do the upgrade and attempts to use the new
+# server with the old mysql.column_stats table
+#
+--echo # Create the old-version of the table
+
+call mtr.add_suppression(".*Incorrect definition of table mysql.column_stats:.*");
+
+alter table mysql.column_stats rename test.t1;
+
+CREATE TABLE mysql.column_stats (
+ `db_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
+ `table_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
+ `column_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
+ `min_value` varbinary(255) DEFAULT NULL,
+ `max_value` varbinary(255) DEFAULT NULL,
+ `nulls_ratio` decimal(12,4) DEFAULT NULL,
+ `avg_length` decimal(12,4) DEFAULT NULL,
+ `avg_frequency` decimal(12,4) DEFAULT NULL,
+ `hist_size` tinyint(3) unsigned DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') COLLATE utf8mb3_bin DEFAULT NULL,
+ `histogram` varbinary(255) DEFAULT NULL,
+ PRIMARY KEY (`db_name`,`table_name`,`column_name`)
+) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns';
+
+create table t0(a int);
+insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+INSERT INTO mysql.column_stats VALUES
+('test','t0','a','0','9',0.0000,4.0000,1.0000,5,'DOUBLE_PREC_HB', x'5555AAAA00');
+
+flush tables;
+analyze select * from t0 where a<3;
+
+# Restart the server
+
+--source include/restart_mysqld.inc
+
+select hex(histogram) from mysql.column_stats where table_name='t0' and db_name='test';
+analyze select * from t0 where a<3;
+
+create table t2 (a int);
+-- echo # This currently just pretends that the histogram was collected.
+analyze table t2 persistent for all;
+select * from mysql.column_stats where table_name='t2' and db_name='test';
+
+--exec $MYSQL_UPGRADE --upgrade-system-tables --force --silent 2>&1
+let $MYSQLD_DATADIR= `select @@datadir`;
+--file_exists $MYSQLD_DATADIR/mysql_upgrade_info
+--remove_file $MYSQLD_DATADIR/mysql_upgrade_info
+
+analyze select * from t0 where a<3;
+drop table t0, t1, t2;
diff --git a/mysql-test/main/subselect4.result b/mysql-test/main/subselect4.result
index e749bafd211..d00f7ccd690 100644
--- a/mysql-test/main/subselect4.result
+++ b/mysql-test/main/subselect4.result
@@ -2923,17 +2923,21 @@ ANALYZE
"r_total_time_ms": "REPLACED",
"duplicate_removal": {
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
@@ -2943,35 +2947,43 @@ ANALYZE
"select_id": 2,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 50,
- "attached_condition": "<nop>(<in_optimizer>(t1.b,(subquery#3) >= 4))"
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 50,
+ "attached_condition": "<nop>(<in_optimizer>(t1.b,(subquery#3) >= 4))"
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 3,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 2,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 2,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
]
diff --git a/mysql-test/main/subselect_cache.result b/mysql-test/main/subselect_cache.result
index 9722acbd0e6..e859ebbd2e8 100644
--- a/mysql-test/main/subselect_cache.result
+++ b/mysql-test/main/subselect_cache.result
@@ -48,17 +48,21 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
@@ -68,18 +72,22 @@ ANALYZE
"select_id": 2,
"r_loops": 4,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 4,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 18.75,
- "attached_condition": "t1.b = t2.c"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 4,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 18.75,
+ "attached_condition": "t1.b = t2.c"
+ }
+ }
+ ]
}
}
}
@@ -94,17 +102,21 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 10,
- "r_rows": 10,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 10,
+ "r_rows": 10,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
@@ -122,18 +134,22 @@ ANALYZE
"select_id": 3,
"r_loops": 4,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 4,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 18.75,
- "attached_condition": "t1.b = t2.c"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 4,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 18.75,
+ "attached_condition": "t1.b = t2.c"
+ }
+ }
+ ]
}
},
{
@@ -158,18 +174,22 @@ ANALYZE
"select_id": 2,
"r_loops": 4,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "r_loops": 4,
- "rows": 4,
- "r_rows": 4,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 18.75,
- "attached_condition": "t1.b = t2.c"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "r_loops": 4,
+ "rows": 4,
+ "r_rows": 4,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 18.75,
+ "attached_condition": "t1.b = t2.c"
+ }
+ }
+ ]
}
}
}
@@ -182,25 +202,33 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
"state": "uninitialized",
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t1.b = t2.c"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t1.b = t2.c"
+ }
+ }
+ ]
}
}
}
@@ -213,12 +241,16 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"expression_cache": {
@@ -231,13 +263,17 @@ EXPLAIN
{
"query_block": {
"select_id": 3,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t1.b = t2.c"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t1.b = t2.c"
+ }
+ }
+ ]
}
},
{
@@ -259,13 +295,17 @@ EXPLAIN
"state": "uninitialized",
"query_block": {
"select_id": 2,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 4,
- "filtered": 100,
- "attached_condition": "t1.b = t2.c"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 4,
+ "filtered": 100,
+ "attached_condition": "t1.b = t2.c"
+ }
+ }
+ ]
}
}
}
diff --git a/mysql-test/main/subselect_mat.result b/mysql-test/main/subselect_mat.result
index bbe81cec319..271b3c18a30 100644
--- a/mysql-test/main/subselect_mat.result
+++ b/mysql-test/main/subselect_mat.result
@@ -61,7 +61,7 @@ explain extended
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <expr_cache><`test`.`t1`.`a1`>(<in_optimizer>(`test`.`t1`.`a1`,`test`.`t1`.`a1` in ( <materialize> (/* select#2 */ select `test`.`t2`.`b1` from `test`.`t2` where `test`.`t2`.`b1` > '0' ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where `test`.`t1`.`a1` = `<subquery2>`.`b1`))))
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
@@ -72,7 +72,7 @@ explain extended
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <expr_cache><`test`.`t1`.`a1`>(<in_optimizer>(`test`.`t1`.`a1`,`test`.`t1`.`a1` in ( <materialize> (/* select#2 */ select `test`.`t2`.`b1` from `test`.`t2` where `test`.`t2`.`b1` > '0' ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where `test`.`t1`.`a1` = `<subquery2>`.`b1`))))
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
@@ -83,7 +83,7 @@ explain extended
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <expr_cache><`test`.`t1`.`a1`,`test`.`t1`.`a2`>(<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (/* select#2 */ select `test`.`t2`.`b1`,`test`.`t2`.`b2` from `test`.`t2` where `test`.`t2`.`b1` > '0' ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where `test`.`t1`.`a1` = `<subquery2>`.`b1` and `test`.`t1`.`a2` = `<subquery2>`.`b2`))))
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
@@ -94,7 +94,7 @@ explain extended
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where; Using temporary
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using temporary
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <expr_cache><`test`.`t1`.`a1`,`test`.`t1`.`a2`>(<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (/* select#2 */ select `test`.`t2`.`b1`,min(`test`.`t2`.`b2`) from `test`.`t2` where `test`.`t2`.`b1` > '0' group by `test`.`t2`.`b1` ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where `test`.`t1`.`a1` = `<subquery2>`.`b1` and `test`.`t1`.`a2` = `<subquery2>`.`min(b2)`))))
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
@@ -321,7 +321,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
3 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
4 MATERIALIZED t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <expr_cache><`test`.`t1`.`a1`,`test`.`t1`.`a2`>(<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (/* select#2 */ select `test`.`t2`.`b1`,`test`.`t2`.`b2` from `test`.`t2` where `test`.`t2`.`b1` > '0' ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where `test`.`t1`.`a1` = `<subquery2>`.`b1` and `test`.`t1`.`a2` = `<subquery2>`.`b2`)))) and <expr_cache><`test`.`t1`.`a1`,`test`.`t1`.`a2`>(<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (/* select#3 */ select `test`.`t3`.`c1`,`test`.`t3`.`c2` from `test`.`t3` where <expr_cache><`test`.`t3`.`c1`,`test`.`t3`.`c2`>(<in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (/* select#4 */ select `test`.`t2i`.`b1`,`test`.`t2i`.`b2` from `test`.`t2i` where `test`.`t2i`.`b2` > '0' ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where `test`.`t3`.`c1` = `<subquery4>`.`b1` and `test`.`t3`.`c2` = `<subquery4>`.`b2`)))) ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where `test`.`t1`.`a1` = `<subquery3>`.`c1` and `test`.`t1`.`a2` = `<subquery3>`.`c2`))))
select * from t1
@@ -451,8 +451,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
4 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
5 MATERIALIZED t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
-2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 99.22 Using where
-3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
+3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <expr_cache><`test`.`t1`.`a1`,`test`.`t1`.`a2`>(<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(/* select#2 */ select `test`.`t1`.`a1`,`test`.`t1`.`a2` from `test`.`t1` where `test`.`t1`.`a1` > '0' and <cache>(`test`.`t1`.`a1`) = `test`.`t1`.`a1` and <cache>(`test`.`t1`.`a2`) = `test`.`t1`.`a2` union /* select#3 */ select `test`.`t2`.`b1`,`test`.`t2`.`b2` from `test`.`t2` where `test`.`t2`.`b1` < '9' and <cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1` and <cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`))) and <expr_cache><`test`.`t1`.`a1`,`test`.`t1`.`a2`>(<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (/* select#4 */ select `test`.`t3`.`c1`,`test`.`t3`.`c2` from `test`.`t3` where <expr_cache><`test`.`t3`.`c1`,`test`.`t3`.`c2`>(<in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (/* select#5 */ select `test`.`t2i`.`b1`,`test`.`t2i`.`b2` from `test`.`t2i` where `test`.`t2i`.`b2` > '0' ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where `test`.`t3`.`c1` = `<subquery5>`.`b1` and `test`.`t3`.`c2` = `<subquery5>`.`b2`)))) ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where `test`.`t1`.`a1` = `<subquery4>`.`c1` and `test`.`t1`.`a2` = `<subquery4>`.`c2`))))
@@ -474,8 +474,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t3 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer (flat, BNL join)
4 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
5 MATERIALIZED t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
-2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 99.22 Using where
-3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
+3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2`,`test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t1` join `test`.`t3` where `test`.`t3`.`c1` = `test`.`t1`.`a1` and <expr_cache><`test`.`t1`.`a1`,`test`.`t1`.`a2`>(<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(/* select#2 */ select `test`.`t1`.`a1`,`test`.`t1`.`a2` from `test`.`t1` where `test`.`t1`.`a1` > '0' and <cache>(`test`.`t1`.`a1`) = `test`.`t1`.`a1` and <cache>(`test`.`t1`.`a2`) = `test`.`t1`.`a2` union /* select#3 */ select `test`.`t2`.`b1`,`test`.`t2`.`b2` from `test`.`t2` where `test`.`t2`.`b1` < '9' and <cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1` and <cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`))) and <expr_cache><`test`.`t3`.`c1`,`test`.`t3`.`c2`>(<in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (/* select#4 */ select `test`.`t3`.`c1`,`test`.`t3`.`c2` from `test`.`t3` where <expr_cache><`test`.`t3`.`c1`,`test`.`t3`.`c2`>(<in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (/* select#5 */ select `test`.`t2i`.`b1`,`test`.`t2i`.`b2` from `test`.`t2i` where `test`.`t2i`.`b2` > '0' ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where `test`.`t3`.`c1` = `<subquery5>`.`b1` and `test`.`t3`.`c2` = `<subquery5>`.`b2`)))) ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where `test`.`t3`.`c1` = `<subquery4>`.`c1` and `test`.`t3`.`c2` = `<subquery4>`.`c2`))))
@@ -496,8 +496,8 @@ select * from t3
where c1 in (select a1 from t1 where a1 > '0' UNION select b1 from t2 where b1 < '9');
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
-2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 99.22 Using where
-3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
+3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
Warnings:
Note 1003 /* select#1 */ select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t3` where <expr_cache><`test`.`t3`.`c1`>(<in_optimizer>(`test`.`t3`.`c1`,<exists>(/* select#2 */ select `test`.`t1`.`a1` from `test`.`t1` where `test`.`t1`.`a1` > '0' and <cache>(`test`.`t3`.`c1`) = `test`.`t1`.`a1` union /* select#3 */ select `test`.`t2`.`b1` from `test`.`t2` where `test`.`t2`.`b1` < '9' and <cache>(`test`.`t3`.`c1`) = `test`.`t2`.`b1`)))
@@ -711,7 +711,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
2 DEPENDENT SUBQUERY t1_16 ALL NULL NULL NULL NULL 3 100.00 Using where
3 DEPENDENT SUBQUERY t2_16 ALL NULL NULL NULL NULL 3 100.00 Using where
3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using join buffer (flat, BNL join)
-4 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 99.22 Using where
+4 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <expr_cache><concat(`test`.`t1`.`a1`,'x')>(<in_optimizer>(concat(`test`.`t1`.`a1`,'x'),<exists>(/* select#2 */ select left(`test`.`t1_16`.`a1`,8) from `test`.`t1_16` where <expr_cache><`test`.`t1_16`.`a1`,`test`.`t1_16`.`a2`>(<in_optimizer>((`test`.`t1_16`.`a1`,`test`.`t1_16`.`a2`),<exists>(/* select#3 */ select `test`.`t2_16`.`b1`,`test`.`t2_16`.`b2` from `test`.`t2_16` join `test`.`t2` where `test`.`t2`.`b2` = substr(`test`.`t2_16`.`b2`,1,6) and <expr_cache><`test`.`t2`.`b1`>(<in_optimizer>(`test`.`t2`.`b1`,`test`.`t2`.`b1` in ( <materialize> (/* select#4 */ select `test`.`t3`.`c1` from `test`.`t3` where `test`.`t3`.`c2` > '0' ), <primary_index_lookup>(`test`.`t2`.`b1` in <temporary table> on distinct_key where `test`.`t2`.`b1` = `<subquery4>`.`c1`)))) and <cache>(`test`.`t1_16`.`a1`) = `test`.`t2_16`.`b1` and <cache>(`test`.`t1_16`.`a2`) = `test`.`t2_16`.`b2`))) and <cache>(concat(`test`.`t1`.`a1`,'x')) = left(`test`.`t1_16`.`a1`,8))))
drop table t1_16, t2_16, t3_16;
diff --git a/mysql-test/main/subselect_no_semijoin.result b/mysql-test/main/subselect_no_semijoin.result
index a06a4aef99b..88f8f78019e 100644
--- a/mysql-test/main/subselect_no_semijoin.result
+++ b/mysql-test/main/subselect_no_semijoin.result
@@ -7415,34 +7415,46 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 2,
"pseudo_bits_condition": "1 = t1.a or <in_optimizer>(1,<exists>(subquery#3))",
- "table": {
- "table_name": "t2",
- "access_type": "system",
- "rows": 1,
- "filtered": 100
- },
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "system",
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+ ],
"subqueries": [
{
"query_block": {
"select_id": 3,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100,
- "attached_condition": "1 = t3.c"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100,
+ "attached_condition": "1 = t3.c"
+ }
+ }
+ ]
}
}
]
diff --git a/mysql-test/main/subselect_sj_mat.result b/mysql-test/main/subselect_sj_mat.result
index fe232009f42..2cc35c1896c 100644
--- a/mysql-test/main/subselect_sj_mat.result
+++ b/mysql-test/main/subselect_sj_mat.result
@@ -59,9 +59,9 @@ set @@optimizer_switch='materialization=on,in_to_exists=off,firstmatch=off';
explain extended
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 3 99.22
+1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 8 func 1 100.00
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` semi join (`test`.`t2`) where `test`.`t2`.`b1` > '0'
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
@@ -71,9 +71,9 @@ a1 a2
explain extended
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 3 99.22
+1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 8 func 1 100.00
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` semi join (`test`.`t2`) where `test`.`t2`.`b1` > '0'
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
@@ -83,9 +83,9 @@ a1 a2
explain extended
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 3 99.22
+1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 16 func,func 1 100.00
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` semi join (`test`.`t2`) where `test`.`t2`.`b1` > '0'
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
@@ -97,7 +97,7 @@ select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' gr
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 16 test.t1.a1,test.t1.a2 1 100.00
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where; Using temporary
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using temporary
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (/* select#2 */ select `test`.`t2`.`b1`,min(`test`.`t2`.`b2`) from `test`.`t2` where `test`.`t2`.`b1` > '0' group by `test`.`t2`.`b1`) join `test`.`t1` where `<subquery2>`.`b1` = `test`.`t1`.`a1` and `<subquery2>`.`min(b2)` = `test`.`t1`.`a2`
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
@@ -331,12 +331,12 @@ where (a1, a2) in (select b1, b2 from t2 where b1 > '0') and
(a1, a2) in (select c1, c2 from t3
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 3 98.44
+1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 16 func,func 1 100.00
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 16 func,func 1 100.00
-3 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 98.44 Using where
+3 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
3 MATERIALIZED t2i ref it2i1,it2i2,it2i3 it2i3 18 test.t3.c1,test.t3.c2 1 100.00 Using index
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 98.44 Using where
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` semi join (`test`.`t2`) semi join (`test`.`t2i` join `test`.`t3`) where `test`.`t2i`.`b1` = `test`.`t3`.`c1` and `test`.`t2i`.`b2` = `test`.`t3`.`c2` and `test`.`t2`.`b1` > '0' and `test`.`t3`.`c2` > '0'
select * from t1
@@ -375,12 +375,12 @@ b2 in (select c2 from t3 where c2 LIKE '%03')) and
(a1, a2) in (select c1, c2 from t3
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 3 99.22
+1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
1 PRIMARY <subquery5> eq_ref distinct_key distinct_key 16 func,func 1 100.00
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 16 func,func 1 100.00
-5 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 99.22 Using where
+5 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
5 MATERIALIZED t2i ref it2i1,it2i2,it2i3 it2i3 18 test.t3.c1,test.t3.c2 1 100.00 Using index
-2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 100.00 Using where
4 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
3 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
Warnings:
@@ -401,10 +401,10 @@ b2 in (select c2 from t3 t3b where c2 LIKE '%03')) and
(a1, a2) in (select c1, c2 from t3 t3c
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 3 99.22
+1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
1 PRIMARY <subquery5> eq_ref distinct_key distinct_key 16 func,func 1 100.00
-1 PRIMARY t2 ALL NULL NULL NULL NULL 5 99.22 Using where; Start temporary; End temporary; Using join buffer (flat, BNL join)
-5 MATERIALIZED t3c ALL NULL NULL NULL NULL 4 99.22 Using where
+1 PRIMARY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Start temporary; End temporary; Using join buffer (flat, BNL join)
+5 MATERIALIZED t3c ALL NULL NULL NULL NULL 4 100.00 Using where
5 MATERIALIZED t2i ref it2i1,it2i2,it2i3 it2i3 18 test.t3c.c1,test.t3c.c2 1 100.00 Using index
4 MATERIALIZED t3b ALL NULL NULL NULL NULL 4 100.00 Using where
3 DEPENDENT SUBQUERY t3a ALL NULL NULL NULL NULL 4 100.00 Using where
@@ -434,12 +434,12 @@ where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
(a1, a2) in (select c1, c2 from t3i
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')));
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t1 ALL NULL # # # 3 99.22 #
+1 PRIMARY t1 ALL NULL # # # 3 100.00 #
1 PRIMARY <subquery5> eq_ref distinct_key # # # 1 100.00 #
1 PRIMARY <subquery2> eq_ref distinct_key # # # 1 100.00 #
-5 MATERIALIZED t3 ALL NULL # # # 4 99.22 #
+5 MATERIALIZED t3 ALL NULL # # # 4 100.00 #
5 MATERIALIZED t2i ref it2i1,it2i2,it2i3 # # # 1 100.00 #
-2 MATERIALIZED t2 ALL NULL # # # 5 99.22 #
+2 MATERIALIZED t2 ALL NULL # # # 5 100.00 #
4 MATERIALIZED t3 ALL NULL # # # 4 100.00 #
3 MATERIALIZED t3 ALL NULL # # # 4 100.00 #
7 UNION t1i range it1i1,it1i2,it1i3 # # # 3 100.00 #
@@ -472,12 +472,12 @@ where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where
(a1, a2) in (select c1, c2 from t3
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 3 99.22 Using where
+1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
1 PRIMARY <subquery4> eq_ref distinct_key distinct_key 16 func,func 1 100.00
-4 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 99.22 Using where
+4 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
4 MATERIALIZED t2i ref it2i1,it2i2,it2i3 it2i3 18 test.t3.c1,test.t3.c2 1 100.00 Using index
-2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 99.22 Using where
-3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
+3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` semi join (`test`.`t2i` join `test`.`t3`) where `test`.`t2i`.`b1` = `test`.`t3`.`c1` and `test`.`t2i`.`b2` = `test`.`t3`.`c2` and <expr_cache><`test`.`t1`.`a1`,`test`.`t1`.`a2`>(<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(/* select#2 */ select `test`.`t1`.`a1`,`test`.`t1`.`a2` from `test`.`t1` where `test`.`t1`.`a1` > '0' and <cache>(`test`.`t1`.`a1`) = `test`.`t1`.`a1` and <cache>(`test`.`t1`.`a2`) = `test`.`t1`.`a2` union /* select#3 */ select `test`.`t2`.`b1`,`test`.`t2`.`b2` from `test`.`t2` where `test`.`t2`.`b1` < '9' and <cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1` and <cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`))) and `test`.`t3`.`c2` > '0'
@@ -496,12 +496,12 @@ where (c1, c2) in (select b1, b2 from t2i where b2 > '0')) and
a1 = c1;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
-1 PRIMARY t3 ALL NULL NULL NULL NULL 4 99.22 Using where; Using join buffer (flat, BNL join)
+1 PRIMARY t3 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer (flat, BNL join)
1 PRIMARY <subquery4> eq_ref distinct_key distinct_key 16 func,func 1 100.00
-4 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 99.22 Using where
+4 MATERIALIZED t3 ALL NULL NULL NULL NULL 4 100.00 Using where
4 MATERIALIZED t2i ref it2i1,it2i2,it2i3 it2i3 18 test.t3.c1,test.t3.c2 1 100.00 Using index
-2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 99.22 Using where
-3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
+3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2`,`test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t1` semi join (`test`.`t2i` join `test`.`t3`) join `test`.`t3` where `test`.`t3`.`c1` = `test`.`t1`.`a1` and `test`.`t2i`.`b1` = `test`.`t3`.`c1` and `test`.`t2i`.`b2` = `test`.`t3`.`c2` and <expr_cache><`test`.`t1`.`a1`,`test`.`t1`.`a2`>(<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(/* select#2 */ select `test`.`t1`.`a1`,`test`.`t1`.`a2` from `test`.`t1` where `test`.`t1`.`a1` > '0' and <cache>(`test`.`t1`.`a1`) = `test`.`t1`.`a1` and <cache>(`test`.`t1`.`a2`) = `test`.`t1`.`a2` union /* select#3 */ select `test`.`t2`.`b1`,`test`.`t2`.`b2` from `test`.`t2` where `test`.`t2`.`b1` < '9' and <cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1` and <cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`))) and `test`.`t3`.`c2` > '0'
@@ -522,8 +522,8 @@ select * from t3
where c1 in (select a1 from t1 where a1 > '0' UNION select b1 from t2 where b1 < '9');
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
-2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 99.22 Using where
-3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 99.22 Using where
+2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
+3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
Warnings:
Note 1003 /* select#1 */ select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t3` where <expr_cache><`test`.`t3`.`c1`>(<in_optimizer>(`test`.`t3`.`c1`,<exists>(/* select#2 */ select `test`.`t1`.`a1` from `test`.`t1` where `test`.`t1`.`a1` > '0' and <cache>(`test`.`t3`.`c1`) = `test`.`t1`.`a1` union /* select#3 */ select `test`.`t2`.`b1` from `test`.`t2` where `test`.`t2`.`b1` < '9' and <cache>(`test`.`t3`.`c1`) = `test`.`t2`.`b1`)))
@@ -738,7 +738,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
1 PRIMARY t1_16 ALL NULL NULL NULL NULL 3 100.00 Using where; Start temporary; Using join buffer (flat, BNL join)
1 PRIMARY t2_16 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (flat, BNL join)
-1 PRIMARY t3 ALL NULL NULL NULL NULL 4 99.22 Using where; Using join buffer (flat, BNL join)
+1 PRIMARY t3 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer (flat, BNL join)
1 PRIMARY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; End temporary; Using join buffer (flat, BNL join)
Warnings:
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` semi join (`test`.`t3` join `test`.`t2_16` join `test`.`t2` join `test`.`t1_16`) where `test`.`t2`.`b1` = `test`.`t3`.`c1` and `test`.`t2_16`.`b1` = `test`.`t1_16`.`a1` and `test`.`t2_16`.`b2` = `test`.`t1_16`.`a2` and `test`.`t2`.`b2` = substr(`test`.`t1_16`.`a2`,1,6) and `test`.`t3`.`c2` > '0' and concat(`test`.`t1`.`a1`,'x') = left(`test`.`t1_16`.`a1`,8)
diff --git a/mysql-test/main/symlink.result b/mysql-test/main/symlink.result
index 67d067be1f9..f6a18edbd94 100644
--- a/mysql-test/main/symlink.result
+++ b/mysql-test/main/symlink.result
@@ -157,9 +157,13 @@ a
drop table t1;
End of 4.1 tests
SET SESSION keep_files_on_create = TRUE;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
CREATE TABLE t1 (a INT) ENGINE MYISAM;
Got one of the listed errors
SET SESSION keep_files_on_create = FALSE;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
CREATE TABLE t1 (a INT) ENGINE MYISAM;
DROP TABLE t1;
End of 5.0 tests
diff --git a/mysql-test/main/system_mysql_db.result b/mysql-test/main/system_mysql_db.result
index a14f8c8108d..2c97d0c6809 100644
--- a/mysql-test/main/system_mysql_db.result
+++ b/mysql-test/main/system_mysql_db.result
@@ -234,8 +234,8 @@ column_stats CREATE TABLE `column_stats` (
`avg_length` decimal(12,4) DEFAULT NULL,
`avg_frequency` decimal(12,4) DEFAULT NULL,
`hist_size` tinyint(3) unsigned DEFAULT NULL,
- `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') DEFAULT NULL,
- `histogram` varbinary(255) DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') DEFAULT NULL,
+ `histogram` longblob DEFAULT NULL,
PRIMARY KEY (`db_name`,`table_name`,`column_name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns'
show create table index_stats;
diff --git a/mysql-test/main/system_mysql_db_fix40123.result b/mysql-test/main/system_mysql_db_fix40123.result
index 686c53d212d..57845704fa1 100644
--- a/mysql-test/main/system_mysql_db_fix40123.result
+++ b/mysql-test/main/system_mysql_db_fix40123.result
@@ -272,8 +272,8 @@ column_stats CREATE TABLE `column_stats` (
`avg_length` decimal(12,4) DEFAULT NULL,
`avg_frequency` decimal(12,4) DEFAULT NULL,
`hist_size` tinyint(3) unsigned DEFAULT NULL,
- `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') DEFAULT NULL,
- `histogram` varbinary(255) DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') DEFAULT NULL,
+ `histogram` longblob DEFAULT NULL,
PRIMARY KEY (`db_name`,`table_name`,`column_name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns'
show create table index_stats;
diff --git a/mysql-test/main/system_mysql_db_fix50030.result b/mysql-test/main/system_mysql_db_fix50030.result
index cb957a03240..377a3790754 100644
--- a/mysql-test/main/system_mysql_db_fix50030.result
+++ b/mysql-test/main/system_mysql_db_fix50030.result
@@ -276,8 +276,8 @@ column_stats CREATE TABLE `column_stats` (
`avg_length` decimal(12,4) DEFAULT NULL,
`avg_frequency` decimal(12,4) DEFAULT NULL,
`hist_size` tinyint(3) unsigned DEFAULT NULL,
- `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') DEFAULT NULL,
- `histogram` varbinary(255) DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') DEFAULT NULL,
+ `histogram` longblob DEFAULT NULL,
PRIMARY KEY (`db_name`,`table_name`,`column_name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns'
show create table index_stats;
diff --git a/mysql-test/main/system_mysql_db_fix50117.result b/mysql-test/main/system_mysql_db_fix50117.result
index fba7c6365fe..2811e0fc660 100644
--- a/mysql-test/main/system_mysql_db_fix50117.result
+++ b/mysql-test/main/system_mysql_db_fix50117.result
@@ -256,8 +256,8 @@ column_stats CREATE TABLE `column_stats` (
`avg_length` decimal(12,4) DEFAULT NULL,
`avg_frequency` decimal(12,4) DEFAULT NULL,
`hist_size` tinyint(3) unsigned DEFAULT NULL,
- `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') DEFAULT NULL,
- `histogram` varbinary(255) DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') DEFAULT NULL,
+ `histogram` longblob DEFAULT NULL,
PRIMARY KEY (`db_name`,`table_name`,`column_name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns'
show create table index_stats;
diff --git a/mysql-test/main/timezone.result b/mysql-test/main/timezone.result
index d84fe54ba8c..2ba1e3fb1d5 100644
--- a/mysql-test/main/timezone.result
+++ b/mysql-test/main/timezone.result
@@ -1,13 +1,18 @@
-DROP TABLE IF EXISTS t1;
show variables like "system_time_zone";
Variable_name Value
system_time_zone MET
+#
+# Test unix timestamp
+#
select @a:=FROM_UNIXTIME(1);
@a:=FROM_UNIXTIME(1)
1970-01-01 01:00:01
select unix_timestamp(@a);
unix_timestamp(@a)
1
+#
+# Test of some values, including some with daylight saving time
+#
CREATE TABLE t1 (ts int);
INSERT INTO t1 (ts) VALUES (Unix_timestamp('2002-10-27 01:00'));
INSERT INTO t1 (ts) VALUES (Unix_timestamp('2002-10-27 02:00'));
@@ -32,6 +37,9 @@ ts from_unixtime(ts)
1048989599 2003-03-30 03:59:59
1048989601 2003-03-30 04:00:01
DROP TABLE t1;
+#
+# Test of warning for spring time-gap values for system time zone
+#
CREATE TABLE t1 (ts timestamp);
INSERT INTO t1 (ts) VALUES ('2003-03-30 01:59:59'),
('2003-03-30 02:59:59'),
@@ -39,6 +47,9 @@ INSERT INTO t1 (ts) VALUES ('2003-03-30 01:59:59'),
Warnings:
Warning 1299 Invalid TIMESTAMP value in column 'ts' at row 2
DROP TABLE t1;
+#
+# Test for fix for Bug#2523 Check that boundary dates are processed correctly.
+#
select unix_timestamp('1970-01-01 01:00:00'),
unix_timestamp('1970-01-01 01:00:01'),
unix_timestamp('2038-01-19 04:14:07'),
@@ -48,3 +59,19 @@ unix_timestamp('1970-01-01 01:00:00') unix_timestamp('1970-01-01 01:00:01') unix
select unix_timestamp('1969-12-31 23:59:59'), unix_timestamp('1970-01-01 00:00:00'), unix_timestamp('1970-01-01 00:59:59');
unix_timestamp('1969-12-31 23:59:59') unix_timestamp('1970-01-01 00:00:00') unix_timestamp('1970-01-01 00:59:59')
NULL NULL NULL
+#
+# End of 4.1 tests
+#
+#
+# MDEV-27393 Timezone tables cannot have descending indexes
+#
+call mtr.add_suppression('mysql.time_zone_transition_type table is incorrectly defined or corrupted');
+alter table mysql.time_zone_transition_type drop primary key;
+alter table mysql.time_zone_transition_type add primary key (time_zone_id,transition_type_id desc);
+SET @@time_zone='Japan';
+ERROR HY000: Unknown or incorrect time zone: 'Japan'
+alter table mysql.time_zone_transition_type drop primary key;
+alter table mysql.time_zone_transition_type add primary key (time_zone_id,transition_type_id);
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/main/timezone.test b/mysql-test/main/timezone.test
index ec1d50cf0ae..89c3ab5cfc1 100644
--- a/mysql-test/main/timezone.test
+++ b/mysql-test/main/timezone.test
@@ -7,24 +7,19 @@ disable_query_log;
select FROM_UNIXTIME(24*3600);
enable_query_log;
-# Initialization
---disable_warnings
-DROP TABLE IF EXISTS t1;
---enable_warnings
-
# The following is because of daylight saving time
--replace_result MEST MET
show variables like "system_time_zone";
-#
-# Test unix timestamp
-#
+--echo #
+--echo # Test unix timestamp
+--echo #
select @a:=FROM_UNIXTIME(1);
select unix_timestamp(@a);
-#
-# Test of some values, including some with daylight saving time
-#
+--echo #
+--echo # Test of some values, including some with daylight saving time
+--echo #
CREATE TABLE t1 (ts int);
INSERT INTO t1 (ts) VALUES (Unix_timestamp('2002-10-27 01:00'));
@@ -42,19 +37,18 @@ SELECT ts,from_unixtime(ts) FROM t1;
DROP TABLE t1;
-#
-# Test of warning for spring time-gap values for system time zone
-#
+--echo #
+--echo # Test of warning for spring time-gap values for system time zone
+--echo #
CREATE TABLE t1 (ts timestamp);
INSERT INTO t1 (ts) VALUES ('2003-03-30 01:59:59'),
('2003-03-30 02:59:59'),
('2003-03-30 03:00:00');
DROP TABLE t1;
-#
-# Test for fix for Bug#2523 Check that boundary dates are processed
-# correctly.
-#
+--echo #
+--echo # Test for fix for Bug#2523 Check that boundary dates are processed correctly.
+--echo #
select unix_timestamp('1970-01-01 01:00:00'),
unix_timestamp('1970-01-01 01:00:01'),
unix_timestamp('2038-01-19 04:14:07'),
@@ -62,4 +56,21 @@ select unix_timestamp('1970-01-01 01:00:00'),
select unix_timestamp('1969-12-31 23:59:59'), unix_timestamp('1970-01-01 00:00:00'), unix_timestamp('1970-01-01 00:59:59');
-# End of 4.1 tests
+--echo #
+--echo # End of 4.1 tests
+--echo #
+
+--echo #
+--echo # MDEV-27393 Timezone tables cannot have descending indexes
+--echo #
+call mtr.add_suppression('mysql.time_zone_transition_type table is incorrectly defined or corrupted');
+alter table mysql.time_zone_transition_type drop primary key;
+alter table mysql.time_zone_transition_type add primary key (time_zone_id,transition_type_id desc);
+--error ER_UNKNOWN_TIME_ZONE
+SET @@time_zone='Japan';
+alter table mysql.time_zone_transition_type drop primary key;
+alter table mysql.time_zone_transition_type add primary key (time_zone_id,transition_type_id);
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/main/trigger.result b/mysql-test/main/trigger.result
index 55ca537f992..410c5a53ce2 100644
--- a/mysql-test/main/trigger.result
+++ b/mysql-test/main/trigger.result
@@ -2308,18 +2308,20 @@ DROP TABLE t1, t2;
set time_zone="+00:00";
SET TIMESTAMP=UNIX_TIMESTAMP('2001-01-01 10:20:30');
SET @@session.sql_mode = 'STRICT_ALL_TABLES,STRICT_TRANS_TABLES';
+set @rpt=1;
CREATE TABLE t1 (c CHAR(1) NOT NULL);
CREATE TRIGGER t1_bi
BEFORE INSERT
ON t1
FOR EACH ROW
BEGIN
-SET NEW.c = 'www';
+SET NEW.c = repeat(@rpt,@rpt);
+set @rpt=@rpt+1;
END;
|
SET @@session.sql_mode = default;
-INSERT INTO t1 VALUES ('a');
-ERROR 22001: Data too long for column 'c' at row 1
+INSERT INTO t1 VALUES ('a'),('b');
+ERROR 22001: Data too long for column 'c' at row 0
show create trigger t1_bi;
Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation Created
t1_bi STRICT_TRANS_TABLES,STRICT_ALL_TABLES CREATE DEFINER=`root`@`localhost` TRIGGER t1_bi
@@ -2327,7 +2329,8 @@ BEFORE INSERT
ON t1
FOR EACH ROW
BEGIN
-SET NEW.c = 'www';
+SET NEW.c = repeat(@rpt,@rpt);
+set @rpt=@rpt+1;
END latin1 latin1_swedish_ci latin1_swedish_ci 2001-01-01 10:20:30.00
DROP TRIGGER t1_bi;
DROP TABLE t1;
diff --git a/mysql-test/main/trigger.test b/mysql-test/main/trigger.test
index 4e51c0ae434..466e9b8f3e5 100644
--- a/mysql-test/main/trigger.test
+++ b/mysql-test/main/trigger.test
@@ -2630,6 +2630,7 @@ DROP TABLE t1, t2;
set time_zone="+00:00";
SET TIMESTAMP=UNIX_TIMESTAMP('2001-01-01 10:20:30');
SET @@session.sql_mode = 'STRICT_ALL_TABLES,STRICT_TRANS_TABLES';
+set @rpt=1;
CREATE TABLE t1 (c CHAR(1) NOT NULL);
DELIMITER |;
CREATE TRIGGER t1_bi
@@ -2637,13 +2638,14 @@ CREATE TRIGGER t1_bi
ON t1
FOR EACH ROW
BEGIN
- SET NEW.c = 'www';
+ SET NEW.c = repeat(@rpt,@rpt);
+ set @rpt=@rpt+1;
END;
|
DELIMITER ;|
SET @@session.sql_mode = default;
--error ER_DATA_TOO_LONG
-INSERT INTO t1 VALUES ('a');
+INSERT INTO t1 VALUES ('a'),('b'); # this is a BUG, must be "at row 2"
show create trigger t1_bi;
DROP TRIGGER t1_bi;
DROP TABLE t1;
diff --git a/mysql-test/main/truncate_notembedded.result b/mysql-test/main/truncate_notembedded.result
index 67beb79707c..e8bf6c2575b 100644
--- a/mysql-test/main/truncate_notembedded.result
+++ b/mysql-test/main/truncate_notembedded.result
@@ -5,7 +5,7 @@
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
LOCK TABLE t1 READ;
connect con1,localhost,root,,test;
-SET SESSION max_session_mem_used= 45500;
+SET SESSION max_session_mem_used= 8192;
LOCK TABLE t1 WRITE;
connection default;
SELECT * FROM t1;
@@ -13,6 +13,7 @@ a
UNLOCK TABLES;
connection con1;
TRUNCATE TABLE t1;
+ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement
disconnect con1;
connection default;
DROP TABLE t1;
diff --git a/mysql-test/main/truncate_notembedded.test b/mysql-test/main/truncate_notembedded.test
index bf5606aa51b..764a353ad34 100644
--- a/mysql-test/main/truncate_notembedded.test
+++ b/mysql-test/main/truncate_notembedded.test
@@ -10,7 +10,7 @@ CREATE TABLE t1 (a INT) ENGINE=MyISAM;
LOCK TABLE t1 READ;
--connect (con1,localhost,root,,test)
-SET SESSION max_session_mem_used= 45500;
+SET SESSION max_session_mem_used= 8192;
--send
LOCK TABLE t1 WRITE;
@@ -21,10 +21,7 @@ UNLOCK TABLES;
--connection con1
--error 0,ER_OPTION_PREVENTS_STATEMENT
--reap
-# This may work or fail as different servers uses different amount of
-# memory and the statement may work or not. What is important is that we
-# don't get a crash here!
---error 0,ER_OPTION_PREVENTS_STATEMENT
+--error ER_OPTION_PREVENTS_STATEMENT
TRUNCATE TABLE t1;
--disconnect con1
diff --git a/mysql-test/main/type_date.result b/mysql-test/main/type_date.result
index 8af3e224c8a..feac3295faf 100644
--- a/mysql-test/main/type_date.result
+++ b/mysql-test/main/type_date.result
@@ -390,7 +390,7 @@ call test5041();
d
2013-09-21
Warnings:
-Note 1265 Data truncated for column 'd' at row 1
+Note 1265 Data truncated for column 'd' at row 0
drop procedure test5041;
SET @@timestamp=DEFAULT;
#
diff --git a/mysql-test/main/type_datetime.result b/mysql-test/main/type_datetime.result
index 2293050292a..3e864d0ffa9 100644
--- a/mysql-test/main/type_datetime.result
+++ b/mysql-test/main/type_datetime.result
@@ -199,7 +199,7 @@ CAST(CAST('10:11:12.098700' AS TIME(6)) AS DECIMAL(20,6))
set @org_mode=@@sql_mode;
create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03');
Warnings:
-Note 1265 Data truncated for column 'da' at row 1
+Note 1265 Data truncated for column 'da' at row 0
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -595,7 +595,7 @@ End of 5.0 tests
set @org_mode=@@sql_mode;
create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03');
Warnings:
-Note 1265 Data truncated for column 'da' at row 1
+Note 1265 Data truncated for column 'da' at row 0
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
diff --git a/mysql-test/main/type_decimal.result b/mysql-test/main/type_decimal.result
index 29067f8f5a5..3643dbea272 100644
--- a/mysql-test/main/type_decimal.result
+++ b/mysql-test/main/type_decimal.result
@@ -1091,7 +1091,7 @@ a
Warnings:
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
Warning 1292 Truncated incorrect DECIMAL value: '.00000000000000000000000000000000000001e111111111111111111111'
-Warning 1264 Out of range value for column 'a' at row 1
+Warning 1264 Out of range value for column 'a' at row 0
CREATE TABLE t1 (str VARCHAR(128), comment VARCHAR(128));
INSERT INTO t1 VALUES
('0e111111111111111111111', 'Zero mantissa and a huge positive exponent'),
@@ -1152,13 +1152,13 @@ CAST(str AS DECIMAL(38,0))
Level Code Message
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
Warning 1292 Truncated incorrect DECIMAL value: '1e111111111111111111111'
-Warning 1264 Out of range value for column 'CAST(str AS DECIMAL(38,0))' at row 1
+Warning 1264 Out of range value for column 'CAST(str AS DECIMAL(38,0))' at row 2
CAST(CONCAT(str,'garbage') AS DECIMAL(38,0))
99999999999999999999999999999999999999
Level Code Message
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
Warning 1292 Truncated incorrect DECIMAL value: '1e111111111111111111111garbage'
-Warning 1264 Out of range value for column 'CAST(CONCAT(str,'garbage') AS DECIMAL(38,0))' at row 1
+Warning 1264 Out of range value for column 'CAST(CONCAT(str,'garbage') AS DECIMAL(38,0))' at row 2
DROP TABLE t1;
#
# End of 10.2 tests
diff --git a/mysql-test/main/type_decimal.test b/mysql-test/main/type_decimal.test
index 1076592fe62..9e294410a38 100644
--- a/mysql-test/main/type_decimal.test
+++ b/mysql-test/main/type_decimal.test
@@ -675,7 +675,10 @@ DROP TABLE t1dec102;
SELECT CAST('0e111111111' AS DECIMAL(38,0)) AS a;
SELECT CAST('0e1111111111' AS DECIMAL(38,0)) AS a;
+#enable after fix MDEV-29647
+--disable_view_protocol
SELECT CAST('.00000000000000000000000000000000000001e111111111111111111111' AS DECIMAL(38,0)) AS a;
+--disable_view_protocol
CREATE TABLE t1 (str VARCHAR(128), comment VARCHAR(128));
INSERT INTO t1 VALUES
diff --git a/mysql-test/main/type_enum.result b/mysql-test/main/type_enum.result
index f9300b81b39..9e313f5b302 100644
--- a/mysql-test/main/type_enum.result
+++ b/mysql-test/main/type_enum.result
@@ -2353,3 +2353,34 @@ a FLOOR(a) CEILING(a) TRUNCATE(a,0) ROUND(a)
999999999999999999999999999999999999999999999999999999999999 1 1 1 1
DROP TABLE t2;
DROP TABLE t1;
+#
+# MDEV-29062 Wrong result set metadata for a mix of INT+ENUM
+#
+CREATE TABLE t1
+(
+c_int INT,
+c_enum ENUM('1')
+);
+CREATE TABLE t2 AS SELECT c_int FROM t1 UNION SELECT c_enum FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `c_int` varchar(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+CREATE OR REPLACE TABLE t2 AS SELECT COALESCE(c_int, c_enum) FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `COALESCE(c_int, c_enum)` varchar(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+SELECT c_int FROM t1 UNION SELECT c_enum FROM t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def c_int c_int 253 11 0 Y 0 0 8
+c_int
+SELECT COALESCE(c_int, c_enum) FROM t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def COALESCE(c_int, c_enum) 253 11 0 Y 0 39 8
+COALESCE(c_int, c_enum)
+DROP TABLE t1;
diff --git a/mysql-test/main/type_enum.test b/mysql-test/main/type_enum.test
index bcbc4cc520e..30a10407f89 100644
--- a/mysql-test/main/type_enum.test
+++ b/mysql-test/main/type_enum.test
@@ -555,3 +555,33 @@ SHOW CREATE TABLE t2;
SELECT * FROM t2;
DROP TABLE t2;
DROP TABLE t1;
+
+
+--echo #
+--echo # MDEV-29062 Wrong result set metadata for a mix of INT+ENUM
+--echo #
+
+CREATE TABLE t1
+(
+ c_int INT,
+ c_enum ENUM('1')
+);
+
+CREATE TABLE t2 AS SELECT c_int FROM t1 UNION SELECT c_enum FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+CREATE OR REPLACE TABLE t2 AS SELECT COALESCE(c_int, c_enum) FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+--disable_view_protocol
+--disable_ps_protocol
+--enable_metadata
+SELECT c_int FROM t1 UNION SELECT c_enum FROM t1;
+SELECT COALESCE(c_int, c_enum) FROM t1;
+--disable_metadata
+--enable_ps_protocol
+--enable_view_protocol
+
+DROP TABLE t1;
diff --git a/mysql-test/main/type_geometry_mix_int.result b/mysql-test/main/type_geometry_mix_int.result
new file mode 100644
index 00000000000..773eaabc65a
--- /dev/null
+++ b/mysql-test/main/type_geometry_mix_int.result
@@ -0,0 +1,351 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target GEOMETRY DEFAULT POINT(1,1), source INT DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` geometry DEFAULT point(1,1),
+ `source` int(11) DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+SELECT * FROM v3;
+id target source
+1 POINT(1 1) 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+SELECT * FROM v3;
+id target source
+1 POINT(1 1) 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target int(11)
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(11) DEFAULT NULL;
+DECLARE dst geometry DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a geometry) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a geometry) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst geometry)
+BEGIN
+DECLARE src int(11) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst geometry DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'int' as 'geometry' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS geometry
+BEGIN
+DECLARE rc int(11) DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(11) DEFAULT NULL;
+DECLARE cur1 CURSOR(t geometry) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst geometry DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target INT DEFAULT 0, source GEOMETRY DEFAULT POINT(1,1));
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` int(11) DEFAULT 0,
+ `source` geometry DEFAULT point(1,1),
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1366 Incorrect integer value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF0?\x00\x00\x00\x00\x00\x00\xF0?' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 POINT(1 1)
+2 0 POINT(1 1)
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect integer value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF0?\x00\x00\x00\x00\x00\x00\xF0?' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 POINT(1 1)
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target geometry
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src geometry DEFAULT NULL;
+DECLARE dst int(11) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a int(11)) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a int(11)) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst int(11))
+BEGIN
+DECLARE src geometry DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst int(11) DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'geometry' as 'int' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS int(11)
+BEGIN
+DECLARE rc geometry DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src geometry DEFAULT NULL;
+DECLARE cur1 CURSOR(t int(11)) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst int(11) DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'geometry' as 'int' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/type_geometry_mix_int.test b/mysql-test/main/type_geometry_mix_int.test
new file mode 100644
index 00000000000..1c64a13e1e8
--- /dev/null
+++ b/mysql-test/main/type_geometry_mix_int.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target GEOMETRY DEFAULT POINT(1,1), source INT DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target INT DEFAULT 0, source GEOMETRY DEFAULT POINT(1,1));
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/type_newdecimal.result b/mysql-test/main/type_newdecimal.result
index 645178db2ce..1aa8c28b44a 100644
--- a/mysql-test/main/type_newdecimal.result
+++ b/mysql-test/main/type_newdecimal.result
@@ -956,14 +956,14 @@ f6 decimal unsigned not null default 199.91,
f7 decimal unsigned not null default 999.9,
f8 decimal unsigned not null default 9999.99);
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
-Note 1265 Data truncated for column 'f2' at row 1
-Note 1265 Data truncated for column 'f3' at row 1
-Note 1265 Data truncated for column 'f4' at row 1
-Note 1265 Data truncated for column 'f5' at row 1
-Note 1265 Data truncated for column 'f6' at row 1
-Note 1265 Data truncated for column 'f7' at row 1
-Note 1265 Data truncated for column 'f8' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
+Note 1265 Data truncated for column 'f2' at row 0
+Note 1265 Data truncated for column 'f3' at row 0
+Note 1265 Data truncated for column 'f4' at row 0
+Note 1265 Data truncated for column 'f5' at row 0
+Note 1265 Data truncated for column 'f6' at row 0
+Note 1265 Data truncated for column 'f7' at row 0
+Note 1265 Data truncated for column 'f8' at row 0
insert into t1 (f1) values (1);
select * from t1;
f1 f2 f3 f4 f5 f6 f7 f8
@@ -1458,8 +1458,8 @@ cast(a as DECIMAL(3,2))
9.99
Warnings:
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
-Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
-Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
+Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 2
+Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 3
select cast(a as DECIMAL(3,2)), count(*)
from (select 11.1233 as a
UNION select 11.1234
@@ -1470,8 +1470,8 @@ cast(a as DECIMAL(3,2)) count(*)
Warnings:
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
-Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
-Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 1
+Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 2
+Warning 1264 Out of range value for column 'cast(a as DECIMAL(3,2))' at row 3
create table t1 (s varchar(100));
insert into t1 values (0.00000000010000000000000000364321973154977415791655470655996396089904010295867919921875);
drop table t1;
@@ -2292,7 +2292,7 @@ a
DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '1e-10000');
Warnings:
-Note 1265 Data truncated for column 'a' at row 1
+Note 1265 Data truncated for column 'a' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -2301,7 +2301,7 @@ t1 CREATE TABLE `t1` (
DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '0.1 ');
Warnings:
-Note 1265 Data truncated for column 'a' at row 1
+Note 1265 Data truncated for column 'a' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -2310,7 +2310,7 @@ t1 CREATE TABLE `t1` (
DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '0.10001 ');
Warnings:
-Note 1265 Data truncated for column 'a' at row 1
+Note 1265 Data truncated for column 'a' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -2319,7 +2319,7 @@ t1 CREATE TABLE `t1` (
DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '0.10001');
Warnings:
-Note 1265 Data truncated for column 'a' at row 1
+Note 1265 Data truncated for column 'a' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -2328,7 +2328,7 @@ t1 CREATE TABLE `t1` (
DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 0.10001);
Warnings:
-Note 1265 Data truncated for column 'a' at row 1
+Note 1265 Data truncated for column 'a' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -2337,7 +2337,7 @@ t1 CREATE TABLE `t1` (
DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 0.10001e0);
Warnings:
-Note 1265 Data truncated for column 'a' at row 1
+Note 1265 Data truncated for column 'a' at row 0
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
diff --git a/mysql-test/main/type_row.result b/mysql-test/main/type_row.result
index dc74cfc88a4..45f4fd895bf 100644
--- a/mysql-test/main/type_row.result
+++ b/mysql-test/main/type_row.result
@@ -49,3 +49,26 @@ ERROR HY000: Illegal parameter data types row and int for operation 'MOD'
#
# End of 10.5 tests
#
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-29356 Assertion `0' failed in Type_handler_row::Item_save_in_field on INSERT
+#
+SET sql_mode='';
+CREATE TABLE t1 (c1 INT,c2 INT);
+CREATE TRIGGER t BEFORE INSERT ON t1 FOR EACH ROW SET NEW.c1=(SELECT * FROM t1);
+INSERT INTO t1 VALUES (0,0);
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `test`.`t1`.`c1`
+DROP TABLE t1;
+SET sql_mode=DEFAULT;
+SET sql_mode='';
+CREATE TABLE t1 (c1 INT,c2 INT) ENGINE=MyISAM;
+CREATE TRIGGER t BEFORE INSERT ON t1 FOR EACH ROW SET NEW.c1=ROW(1,1);
+INSERT INTO t1 VALUES (0,0);
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `test`.`t1`.`c1`
+DROP TABLE t1;
+SET sql_mode=DEFAULT;
+#
+# End of 10.7 tests
+#
diff --git a/mysql-test/main/type_row.test b/mysql-test/main/type_row.test
index 2a5902351e2..6f8312d5f18 100644
--- a/mysql-test/main/type_row.test
+++ b/mysql-test/main/type_row.test
@@ -60,3 +60,31 @@ SELECT ROW(1,1) % 1;
--echo #
--echo # End of 10.5 tests
--echo #
+
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-29356 Assertion `0' failed in Type_handler_row::Item_save_in_field on INSERT
+--echo #
+
+SET sql_mode='';
+CREATE TABLE t1 (c1 INT,c2 INT);
+CREATE TRIGGER t BEFORE INSERT ON t1 FOR EACH ROW SET NEW.c1=(SELECT * FROM t1);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+INSERT INTO t1 VALUES (0,0);
+DROP TABLE t1;
+SET sql_mode=DEFAULT;
+
+SET sql_mode='';
+CREATE TABLE t1 (c1 INT,c2 INT) ENGINE=MyISAM;
+CREATE TRIGGER t BEFORE INSERT ON t1 FOR EACH ROW SET NEW.c1=ROW(1,1);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+INSERT INTO t1 VALUES (0,0);
+DROP TABLE t1;
+SET sql_mode=DEFAULT;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/mysql-test/main/type_set.result b/mysql-test/main/type_set.result
index ea057157569..571e0d36eaf 100644
--- a/mysql-test/main/type_set.result
+++ b/mysql-test/main/type_set.result
@@ -379,3 +379,34 @@ a FLOOR(a) CEILING(a) TRUNCATE(a,0) ROUND(a)
999999999999999999999999999999999999999999999999999999999999 1 1 1 1
DROP TABLE t2;
DROP TABLE t1;
+#
+# MDEV-29062 Wrong result set metadata for a mix of INT+ENUM
+#
+CREATE TABLE t1
+(
+c_int INT,
+c_set SET('1')
+);
+CREATE TABLE t2 AS SELECT c_int FROM t1 UNION SELECT c_set FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `c_int` varchar(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+CREATE OR REPLACE TABLE t2 AS SELECT COALESCE(c_int, c_set) FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `COALESCE(c_int, c_set)` varchar(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+SELECT c_int FROM t1 UNION SELECT c_set FROM t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def c_int c_int 253 33 0 Y 0 0 33
+c_int
+SELECT COALESCE(c_int, c_set) FROM t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def COALESCE(c_int, c_set) 253 33 0 Y 0 39 33
+COALESCE(c_int, c_set)
+DROP TABLE t1;
diff --git a/mysql-test/main/type_set.test b/mysql-test/main/type_set.test
index 2d0c81340ae..0ef2d158c4d 100644
--- a/mysql-test/main/type_set.test
+++ b/mysql-test/main/type_set.test
@@ -261,3 +261,33 @@ SHOW CREATE TABLE t2;
SELECT * FROM t2;
DROP TABLE t2;
DROP TABLE t1;
+
+
+--echo #
+--echo # MDEV-29062 Wrong result set metadata for a mix of INT+ENUM
+--echo #
+
+CREATE TABLE t1
+(
+ c_int INT,
+ c_set SET('1')
+);
+
+CREATE TABLE t2 AS SELECT c_int FROM t1 UNION SELECT c_set FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+CREATE OR REPLACE TABLE t2 AS SELECT COALESCE(c_int, c_set) FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+--disable_view_protocol
+--disable_ps_protocol
+--enable_metadata
+SELECT c_int FROM t1 UNION SELECT c_set FROM t1;
+SELECT COALESCE(c_int, c_set) FROM t1;
+--disable_metadata
+--enable_ps_protocol
+--enable_view_protocol
+
+DROP TABLE t1;
diff --git a/mysql-test/main/type_time_hires.result b/mysql-test/main/type_time_hires.result
index cf7dce59f1f..ed00a8d473d 100644
--- a/mysql-test/main/type_time_hires.result
+++ b/mysql-test/main/type_time_hires.result
@@ -271,8 +271,8 @@ create table t1 (a time(6), b time(6));
create procedure foo(x time, y time(4)) insert into t1 values (x, y);
call foo('2010-02-03 4:5:6.789123', '2010-02-03 4:5:6.789123');
Warnings:
-Note 1265 Data truncated for column 'x' at row 1
-Note 1265 Data truncated for column 'y' at row 1
+Note 1265 Data truncated for column 'x' at row 0
+Note 1265 Data truncated for column 'y' at row 0
select * from t1;
a b
04:05:06.000000 04:05:06.789100
@@ -284,7 +284,7 @@ insert t1 values (b, c + interval a microsecond);
end|
call bar(1111111, '2011-01-02 3:4:5.123456');
Warnings:
-Note 1265 Data truncated for column 'c' at row 1
+Note 1265 Data truncated for column 'c' at row 0
select * from t1;
a b
04:05:06.000000 04:05:06.789100
@@ -297,7 +297,7 @@ select xyz('1:1:1.010101');
xyz('1:1:1.010101')
11:11:11.1111
Warnings:
-Note 1265 Data truncated for column 'xyz('1:1:1.010101')' at row 1
+Note 1265 Data truncated for column 'xyz('1:1:1.010101')' at row 0
drop function xyz;
create view v1 as select * from t1 group by a,b;
select * from v1;
diff --git a/mysql-test/main/type_timestamp.result b/mysql-test/main/type_timestamp.result
index f23c66e10a5..275d35ac476 100644
--- a/mysql-test/main/type_timestamp.result
+++ b/mysql-test/main/type_timestamp.result
@@ -575,7 +575,7 @@ a
2010-02-01 09:31:02
2010-02-01 09:31:03
2010-02-01 09:31:04
-CREATE TABLE t2 ( a TIMESTAMP, KEY ( a DESC ) );
+CREATE TABLE t2 ( a TIMESTAMP, KEY ( a ) );
INSERT INTO t2 VALUES( '2010-02-01 09:31:01' );
INSERT INTO t2 VALUES( '2010-02-01 09:31:02' );
INSERT INTO t2 VALUES( '2010-02-01 09:31:03' );
diff --git a/mysql-test/main/type_timestamp.test b/mysql-test/main/type_timestamp.test
index a0f1f2c3d78..bff33c030b5 100644
--- a/mysql-test/main/type_timestamp.test
+++ b/mysql-test/main/type_timestamp.test
@@ -386,7 +386,7 @@ EXPLAIN
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
-CREATE TABLE t2 ( a TIMESTAMP, KEY ( a DESC ) );
+CREATE TABLE t2 ( a TIMESTAMP, KEY ( a ) );
INSERT INTO t2 VALUES( '2010-02-01 09:31:01' );
INSERT INTO t2 VALUES( '2010-02-01 09:31:02' );
diff --git a/mysql-test/main/type_varchar.result b/mysql-test/main/type_varchar.result
index d00531018a4..ea31dddabda 100644
--- a/mysql-test/main/type_varchar.result
+++ b/mysql-test/main/type_varchar.result
@@ -709,14 +709,14 @@ CREATE TABLE t1 (c VARCHAR(1) DEFAULT 'foo');
ERROR 42000: Invalid default value for 'c'
SHOW WARNINGS;
Level Code Message
-Warning 1265 Data truncated for column 'c' at row 1
+Warning 1265 Data truncated for column 'c' at row 0
Error 1067 Invalid default value for 'c'
SET sql_mode='STRICT_ALL_TABLES';
CREATE TABLE t1 (c VARCHAR(1) DEFAULT 'foo');
ERROR 42000: Invalid default value for 'c'
SHOW WARNINGS;
Level Code Message
-Warning 1265 Data truncated for column 'c' at row 1
+Warning 1265 Data truncated for column 'c' at row 0
Error 1067 Invalid default value for 'c'
CREATE TABLE t1 (c VARCHAR(1));
SET sql_mode='';
@@ -724,14 +724,14 @@ ALTER TABLE t1 ALTER column c SET DEFAULT 'foo';
ERROR 42000: Invalid default value for 'c'
SHOW WARNINGS;
Level Code Message
-Warning 1265 Data truncated for column 'c' at row 1
+Warning 1265 Data truncated for column 'c' at row 0
Error 1067 Invalid default value for 'c'
SET sql_mode='STRICT_ALL_TABLES';
ALTER TABLE t1 ALTER column c SET DEFAULT 'foo';
ERROR 42000: Invalid default value for 'c'
SHOW WARNINGS;
Level Code Message
-Warning 1265 Data truncated for column 'c' at row 1
+Warning 1265 Data truncated for column 'c' at row 0
Error 1067 Invalid default value for 'c'
DROP TABLE t1;
SET sql_mode=DEFAULT;
diff --git a/mysql-test/main/union.test b/mysql-test/main/union.test
index 4ced290480a..4cebdcff9bb 100644
--- a/mysql-test/main/union.test
+++ b/mysql-test/main/union.test
@@ -1910,7 +1910,7 @@ set @save_default_storage_engine=@@default_storage_engine;
SET @@default_storage_engine=MEMORY;
CREATE TABLE t1 SELECT NULL UNION SELECT NULL;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
ALTER TABLE t1 ADD INDEX (`PRIMARY`);
CREATE TABLE t2 SELECT NULL;
diff --git a/mysql-test/main/win.result b/mysql-test/main/win.result
index 48eea7a3add..109296ef2a1 100644
--- a/mysql-test/main/win.result
+++ b/mysql-test/main/win.result
@@ -1403,18 +1403,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t0.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t0.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1434,18 +1440,24 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "sum(t1.b)"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "sum(t1.b)"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1463,18 +1475,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "sum(t1.b)"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "sum(t1.b)"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1497,18 +1515,24 @@ EXPLAIN
"filesort": {
"sort_key": "t1.b",
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.b"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.b"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1642,18 +1666,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.c, t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.c, t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1668,18 +1698,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1694,18 +1730,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.c, t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.c, t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1720,18 +1762,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.c, t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.c, t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1776,18 +1824,24 @@ EXPLAIN
"filesort": {
"sort_key": "row_number() over ( order by t1.s1,t1.s2) desc",
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.s1, t1.s2"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.s1, t1.s2"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 6,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 6,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1929,18 +1983,24 @@ EXPLAIN
"select_id": 1,
"duplicate_removal": {
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.part_id, t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.part_id, t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -2102,18 +2162,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.a, t1.pk"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.a, t1.pk"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -2163,18 +2229,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.a, t1.b"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.a, t1.b"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 6,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 6,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -3755,29 +3827,35 @@ ANALYZE
"r_loops": 1,
"r_total_time_ms": "REPLACED",
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "`row_number() OVER()`",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 3,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "sort_key,rowid"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "`row_number() OVER()`",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 3,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "sort_key,rowid"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
}
diff --git a/mysql-test/main/win_empty_over.result b/mysql-test/main/win_empty_over.result
index a5ee74b943a..4fa53bb4eae 100644
--- a/mysql-test/main/win_empty_over.result
+++ b/mysql-test/main/win_empty_over.result
@@ -37,22 +37,28 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "pk"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "pk"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "index",
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk"],
- "rows": 11,
- "filtered": 100,
- "using_index": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "index",
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk"],
+ "rows": 11,
+ "filtered": 100,
+ "using_index": true
+ }
+ }
+ ]
}
}
}
@@ -63,22 +69,28 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "`row_number() over ()`"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "`row_number() over ()`"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "index",
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk"],
- "rows": 11,
- "filtered": 100,
- "using_index": true
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "index",
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk"],
+ "rows": 11,
+ "filtered": 100,
+ "using_index": true
+ }
+ }
+ ]
}
}
}
diff --git a/mysql-test/main/winservice.inc b/mysql-test/main/winservice.inc
new file mode 100644
index 00000000000..2d8f6ccae1e
--- /dev/null
+++ b/mysql-test/main/winservice.inc
@@ -0,0 +1,75 @@
+source include/check_windows_admin.inc;
+
+# The test uses return code from sc.exe utility, which are as follows
+let $ERROR_SERVICE_DOES_NOT_EXIST= 1060;
+let $ERROR_SERVICE_CANNOT_ACCEPT_CTRL=1061;# intermediate, during start or stop
+let $ERROR_SERVICE_NOT_ACTIVE=1062;# service stopped
+
+let $sc_exe= C:\Windows\System32\sc.exe;
+let $ddir= $MYSQLTEST_VARDIR/tmp/$datadir_name;
+let $service_name=$service_name_prefix$MASTER_MYPORT;
+
+
+error 0,1;
+rmdir $ddir;
+
+--disable_result_log
+error 0,$ERROR_SERVICE_DOES_NOT_EXIST;
+exec $sc_exe delete $service_name;
+--enable_result_log
+
+source include/shutdown_mysqld.inc;
+echo # run mysql_install_db with --service parameter;
+--disable_result_log
+exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --port=$MASTER_MYPORT --password=$password --service=$service_name -R;
+--enable_result_log
+
+echo # Start service;
+--disable_result_log
+exec $sc_exe start $service_name;
+--enable_result_log
+
+enable_reconnect;
+source include/wait_until_connected_again.inc;
+disable_reconnect;
+
+echo # Connect with root user password=$password;
+connect (con1,localhost,root,$password,mysql);
+
+# Smoke test - check that we're actually using datadir
+# we've created (i.e restart_parameters worked)
+replace_result $ddir DATADIR;
+select @@datadir;
+
+echo # Stop service and wait until it is down;
+
+# stop service
+--disable_result_log
+exec $sc_exe stop $service_name;
+# Wait until stopped
+let $sys_errno=0;
+while($sys_errno != $ERROR_SERVICE_NOT_ACTIVE)
+{
+ --error 0,$ERROR_SERVICE_CANNOT_ACCEPT_CTRL,$ERROR_SERVICE_NOT_ACTIVE
+ exec $sc_exe stop $service_name;
+ if($sys_errno != $ERROR_SERVICE_NOT_ACTIVE)
+ {
+ --real_sleep 0.1
+ }
+}
+--enable_result_log
+
+echo # Delete service;
+let $sys_errno=0;
+--disable_result_log
+exec $sc_exe delete $service_name;
+--enable_result_log
+
+# Cleanup
+source include/wait_until_disconnected.inc;
+rmdir $ddir;
+
+#restart original server
+connection default;
+source include/start_mysqld.inc;
+
diff --git a/mysql-test/main/winservice_basic.result b/mysql-test/main/winservice_basic.result
new file mode 100644
index 00000000000..0a5e8693b6b
--- /dev/null
+++ b/mysql-test/main/winservice_basic.result
@@ -0,0 +1,11 @@
+# run mysql_install_db with --service parameter
+# Start service
+# Connect with root user password=password
+connect con1,localhost,root,$password,mysql;
+select @@datadir;
+@@datadir
+DATADIR/
+# Stop service and wait until it is down
+# Delete service
+connection default;
+# restart
diff --git a/mysql-test/main/winservice_basic.test b/mysql-test/main/winservice_basic.test
new file mode 100644
index 00000000000..33d072b4f70
--- /dev/null
+++ b/mysql-test/main/winservice_basic.test
@@ -0,0 +1,5 @@
+source include/windows.inc;
+let $datadir_name=data;
+let $service_name_prefix=mariadb;
+let $password=password;
+source winservice.inc;
diff --git a/mysql-test/main/winservice_i18n.result b/mysql-test/main/winservice_i18n.result
new file mode 100644
index 00000000000..8d5eba3df38
--- /dev/null
+++ b/mysql-test/main/winservice_i18n.result
@@ -0,0 +1,11 @@
+# run mysql_install_db with --service parameter
+# Start service
+# Connect with root user password=パスワード
+connect con1,localhost,root,$password,mysql;
+select @@datadir;
+@@datadir
+DATADIR/
+# Stop service and wait until it is down
+# Delete service
+connection default;
+# restart
diff --git a/mysql-test/main/winservice_i18n.test b/mysql-test/main/winservice_i18n.test
new file mode 100644
index 00000000000..c63b38fd2b8
--- /dev/null
+++ b/mysql-test/main/winservice_i18n.test
@@ -0,0 +1,7 @@
+source include/windows.inc;
+source include/check_utf8_cli.inc;
+
+let $datadir_name=датадир;
+let $service_name_prefix=mariadb_sörvis;
+let $password=パスワード;
+source winservice.inc;
diff --git a/mysql-test/std_data/ldml/Index.xml b/mysql-test/std_data/ldml/Index.xml
index cd4ddde3d72..a6fee091d02 100644
--- a/mysql-test/std_data/ldml/Index.xml
+++ b/mysql-test/std_data/ldml/Index.xml
@@ -9,6 +9,9 @@
<i>\u0029</i> <!-- right parenthesis -->
<i>\u002B</i> <!-- plus -->
<i>\u002D</i> <!-- hyphen -->
+ <i>tel.</i>
+ <i>tél.</i>
+ <i>Å¥el.</i>
</rules>
</collation>
<collation name="utf8mb3_test_ci" id="353">
diff --git a/mysql-test/std_data/unicode/allkeys400.txt b/mysql-test/std_data/unicode/allkeys400.txt
new file mode 100644
index 00000000000..80848ce3d02
--- /dev/null
+++ b/mysql-test/std_data/unicode/allkeys400.txt
@@ -0,0 +1,15169 @@
+# allkeys-4.0.0.txt
+#
+# Created: 2003-Aug-21
+# Edited: 2003-Nov-01
+# Posted: 2003-Nov-01
+#
+# Derived from: unidata-4.0.0d5.txt
+# Delta level for release: allkeys-4.0.0d5.txt
+# Sifter version: 4.0.0d3, 2003-Sep-08
+
+@version 4.0.0
+
+0000 ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
+0001 ; [.0000.0000.0000.0000] # [0001] START OF HEADING (in 6429)
+0002 ; [.0000.0000.0000.0000] # [0002] START OF TEXT (in 6429)
+0003 ; [.0000.0000.0000.0000] # [0003] END OF TEXT (in 6429)
+0004 ; [.0000.0000.0000.0000] # [0004] END OF TRANSMISSION (in 6429)
+0005 ; [.0000.0000.0000.0000] # [0005] ENQUIRY (in 6429)
+0006 ; [.0000.0000.0000.0000] # [0006] ACKNOWLEDGE (in 6429)
+0007 ; [.0000.0000.0000.0000] # [0007] BELL (in 6429)
+0008 ; [.0000.0000.0000.0000] # [0008] BACKSPACE (in 6429)
+000E ; [.0000.0000.0000.0000] # [000E] SHIFT OUT (in 6429)
+000F ; [.0000.0000.0000.0000] # [000F] SHIFT IN (in 6429)
+0010 ; [.0000.0000.0000.0000] # [0010] DATA LINK ESCAPE (in 6429)
+0011 ; [.0000.0000.0000.0000] # [0011] DEVICE CONTROL ONE (in 6429)
+0012 ; [.0000.0000.0000.0000] # [0012] DEVICE CONTROL TWO (in 6429)
+0013 ; [.0000.0000.0000.0000] # [0013] DEVICE CONTROL THREE (in 6429)
+0014 ; [.0000.0000.0000.0000] # [0014] DEVICE CONTROL FOUR (in 6429)
+0015 ; [.0000.0000.0000.0000] # [0015] NEGATIVE ACKNOWLEDGE (in 6429)
+0016 ; [.0000.0000.0000.0000] # [0016] SYNCHRONOUS IDLE (in 6429)
+0017 ; [.0000.0000.0000.0000] # [0017] END OF TRANSMISSION BLOCK (in 6429)
+0018 ; [.0000.0000.0000.0000] # [0018] CANCEL (in 6429)
+0019 ; [.0000.0000.0000.0000] # [0019] END OF MEDIUM (in 6429)
+001A ; [.0000.0000.0000.0000] # [001A] SUBSTITUTE (in 6429)
+001B ; [.0000.0000.0000.0000] # [001B] ESCAPE (in 6429)
+001C ; [.0000.0000.0000.0000] # [001C] FILE SEPARATOR (in 6429)
+001D ; [.0000.0000.0000.0000] # [001D] GROUP SEPARATOR (in 6429)
+001E ; [.0000.0000.0000.0000] # [001E] RECORD SEPARATOR (in 6429)
+001F ; [.0000.0000.0000.0000] # [001F] UNIT SEPARATOR (in 6429)
+007F ; [.0000.0000.0000.0000] # [007F] DELETE (in 6429)
+0080 ; [.0000.0000.0000.0000] # [0080] <control>
+0081 ; [.0000.0000.0000.0000] # [0081] <control>
+0082 ; [.0000.0000.0000.0000] # [0082] BREAK PERMITTED HERE (in 6429)
+0083 ; [.0000.0000.0000.0000] # [0083] NO BREAK HERE (in 6429)
+0084 ; [.0000.0000.0000.0000] # [0084] <control>
+0086 ; [.0000.0000.0000.0000] # [0086] START OF SELECTED AREA (in 6429)
+0087 ; [.0000.0000.0000.0000] # [0087] END OF SELECTED AREA (in 6429)
+0088 ; [.0000.0000.0000.0000] # [0088] CHARACTER TABULATION SET (in 6429)
+0089 ; [.0000.0000.0000.0000] # [0089] CHARACTER TABULATION WITH JUSTIFICATION (in 6429)
+008A ; [.0000.0000.0000.0000] # [008A] LINE TABULATION SET (in 6429)
+008B ; [.0000.0000.0000.0000] # [008B] PARTIAL LINE FORWARD (in 6429)
+008C ; [.0000.0000.0000.0000] # [008C] PARTIAL LINE BACKWARD (in 6429)
+008D ; [.0000.0000.0000.0000] # [008D] PARTIAL LINE FEED (in 6429)
+008E ; [.0000.0000.0000.0000] # [008E] SINGLE SHIFT TWO (in 6429)
+008F ; [.0000.0000.0000.0000] # [008F] SINGLE SHIFT THREE (in 6429)
+0090 ; [.0000.0000.0000.0000] # [0090] DEVICE CONTROL STRING (in 6429)
+0091 ; [.0000.0000.0000.0000] # [0091] PRIVATE USE ONE (in 6429)
+0092 ; [.0000.0000.0000.0000] # [0092] PRIVATE USE TWO (in 6429)
+0093 ; [.0000.0000.0000.0000] # [0093] SET TRANSMIT STATE (in 6429)
+0094 ; [.0000.0000.0000.0000] # [0094] CANCEL CHARACTER (in 6429)
+0095 ; [.0000.0000.0000.0000] # [0095] MESSAGE WAITING (in 6429)
+0096 ; [.0000.0000.0000.0000] # [0096] START OF GUARDED AREA (in 6429)
+0097 ; [.0000.0000.0000.0000] # [0097] END OF GUARDED AREA (in 6429)
+0098 ; [.0000.0000.0000.0000] # [0098] START OF STRING (in 6429)
+0099 ; [.0000.0000.0000.0000] # [0099] <control>
+009A ; [.0000.0000.0000.0000] # [009A] SINGLE CHARACTER INTRODUCER (in 6429)
+009B ; [.0000.0000.0000.0000] # [009B] CONTROL SEQUENCE INTRODUCER (in 6429)
+009C ; [.0000.0000.0000.0000] # [009C] STRING TERMINATOR (in 6429)
+009D ; [.0000.0000.0000.0000] # [009D] OPERATING SYSTEM COMMAND (in 6429)
+009E ; [.0000.0000.0000.0000] # [009E] PRIVACY MESSAGE (in 6429)
+009F ; [.0000.0000.0000.0000] # [009F] APPLICATION PROGRAM COMMAND (in 6429)
+0600 ; [.0000.0000.0000.0000] # [0600] ARABIC NUMBER SIGN
+0601 ; [.0000.0000.0000.0000] # [0601] ARABIC SIGN SANAH
+0602 ; [.0000.0000.0000.0000] # [0602] ARABIC FOOTNOTE MARKER
+0603 ; [.0000.0000.0000.0000] # [0603] ARABIC SIGN SAFHA
+06DD ; [.0000.0000.0000.0000] # [06DD] ARABIC END OF AYAH
+070F ; [.0000.0000.0000.0000] # [070F] SYRIAC ABBREVIATION MARK
+180B ; [.0000.0000.0000.0000] # [180B] MONGOLIAN FREE VARIATION SELECTOR ONE
+180C ; [.0000.0000.0000.0000] # [180C] MONGOLIAN FREE VARIATION SELECTOR TWO
+180D ; [.0000.0000.0000.0000] # [180D] MONGOLIAN FREE VARIATION SELECTOR THREE
+180E ; [.0000.0000.0000.0000] # [180E] MONGOLIAN VOWEL SEPARATOR
+200B ; [.0000.0000.0000.0000] # [200B] ZERO WIDTH SPACE
+200C ; [.0000.0000.0000.0000] # [200C] ZERO WIDTH NON-JOINER
+200D ; [.0000.0000.0000.0000] # [200D] ZERO WIDTH JOINER
+200E ; [.0000.0000.0000.0000] # [200E] LEFT-TO-RIGHT MARK
+200F ; [.0000.0000.0000.0000] # [200F] RIGHT-TO-LEFT MARK
+202A ; [.0000.0000.0000.0000] # [202A] LEFT-TO-RIGHT EMBEDDING
+202B ; [.0000.0000.0000.0000] # [202B] RIGHT-TO-LEFT EMBEDDING
+202C ; [.0000.0000.0000.0000] # [202C] POP DIRECTIONAL FORMATTING
+202D ; [.0000.0000.0000.0000] # [202D] LEFT-TO-RIGHT OVERRIDE
+202E ; [.0000.0000.0000.0000] # [202E] RIGHT-TO-LEFT OVERRIDE
+2060 ; [.0000.0000.0000.0000] # [2060] WORD JOINER
+2061 ; [.0000.0000.0000.0000] # [2061] FUNCTION APPLICATION
+2062 ; [.0000.0000.0000.0000] # [2062] INVISIBLE TIMES
+2063 ; [.0000.0000.0000.0000] # [2063] INVISIBLE SEPARATOR
+206A ; [.0000.0000.0000.0000] # [206A] INHIBIT SYMMETRIC SWAPPING
+206B ; [.0000.0000.0000.0000] # [206B] ACTIVATE SYMMETRIC SWAPPING
+206C ; [.0000.0000.0000.0000] # [206C] INHIBIT ARABIC FORM SHAPING
+206D ; [.0000.0000.0000.0000] # [206D] ACTIVATE ARABIC FORM SHAPING
+206E ; [.0000.0000.0000.0000] # [206E] NATIONAL DIGIT SHAPES
+206F ; [.0000.0000.0000.0000] # [206F] NOMINAL DIGIT SHAPES
+FE00 ; [.0000.0000.0000.0000] # [FE00] VARIATION SELECTOR-1
+FE01 ; [.0000.0000.0000.0000] # [FE01] VARIATION SELECTOR-2
+FE02 ; [.0000.0000.0000.0000] # [FE02] VARIATION SELECTOR-3
+FE03 ; [.0000.0000.0000.0000] # [FE03] VARIATION SELECTOR-4
+FE04 ; [.0000.0000.0000.0000] # [FE04] VARIATION SELECTOR-5
+FE05 ; [.0000.0000.0000.0000] # [FE05] VARIATION SELECTOR-6
+FE06 ; [.0000.0000.0000.0000] # [FE06] VARIATION SELECTOR-7
+FE07 ; [.0000.0000.0000.0000] # [FE07] VARIATION SELECTOR-8
+FE08 ; [.0000.0000.0000.0000] # [FE08] VARIATION SELECTOR-9
+FE09 ; [.0000.0000.0000.0000] # [FE09] VARIATION SELECTOR-10
+FE0A ; [.0000.0000.0000.0000] # [FE0A] VARIATION SELECTOR-11
+FE0B ; [.0000.0000.0000.0000] # [FE0B] VARIATION SELECTOR-12
+FE0C ; [.0000.0000.0000.0000] # [FE0C] VARIATION SELECTOR-13
+FE0D ; [.0000.0000.0000.0000] # [FE0D] VARIATION SELECTOR-14
+FE0E ; [.0000.0000.0000.0000] # [FE0E] VARIATION SELECTOR-15
+FE0F ; [.0000.0000.0000.0000] # [FE0F] VARIATION SELECTOR-16
+FEFF ; [.0000.0000.0000.0000] # [FEFF] ZERO WIDTH NO-BREAK SPACE
+FFF9 ; [.0000.0000.0000.0000] # [FFF9] INTERLINEAR ANNOTATION ANCHOR
+FFFA ; [.0000.0000.0000.0000] # [FFFA] INTERLINEAR ANNOTATION SEPARATOR
+FFFB ; [.0000.0000.0000.0000] # [FFFB] INTERLINEAR ANNOTATION TERMINATOR
+1D173 ; [.0000.0000.0000.0000] # [1D173] MUSICAL SYMBOL BEGIN BEAM
+1D174 ; [.0000.0000.0000.0000] # [1D174] MUSICAL SYMBOL END BEAM
+1D175 ; [.0000.0000.0000.0000] # [1D175] MUSICAL SYMBOL BEGIN TIE
+1D176 ; [.0000.0000.0000.0000] # [1D176] MUSICAL SYMBOL END TIE
+1D177 ; [.0000.0000.0000.0000] # [1D177] MUSICAL SYMBOL BEGIN SLUR
+1D178 ; [.0000.0000.0000.0000] # [1D178] MUSICAL SYMBOL END SLUR
+1D179 ; [.0000.0000.0000.0000] # [1D179] MUSICAL SYMBOL BEGIN PHRASE
+1D17A ; [.0000.0000.0000.0000] # [1D17A] MUSICAL SYMBOL END PHRASE
+E0001 ; [.0000.0000.0000.0000] # [E0001] LANGUAGE TAG
+E0020 ; [.0000.0000.0000.0000] # [E0020] TAG SPACE
+E0021 ; [.0000.0000.0000.0000] # [E0021] TAG EXCLAMATION MARK
+E0022 ; [.0000.0000.0000.0000] # [E0022] TAG QUOTATION MARK
+E0023 ; [.0000.0000.0000.0000] # [E0023] TAG NUMBER SIGN
+E0024 ; [.0000.0000.0000.0000] # [E0024] TAG DOLLAR SIGN
+E0025 ; [.0000.0000.0000.0000] # [E0025] TAG PERCENT SIGN
+E0026 ; [.0000.0000.0000.0000] # [E0026] TAG AMPERSAND
+E0027 ; [.0000.0000.0000.0000] # [E0027] TAG APOSTROPHE
+E0028 ; [.0000.0000.0000.0000] # [E0028] TAG LEFT PARENTHESIS
+E0029 ; [.0000.0000.0000.0000] # [E0029] TAG RIGHT PARENTHESIS
+E002A ; [.0000.0000.0000.0000] # [E002A] TAG ASTERISK
+E002B ; [.0000.0000.0000.0000] # [E002B] TAG PLUS SIGN
+E002C ; [.0000.0000.0000.0000] # [E002C] TAG COMMA
+E002D ; [.0000.0000.0000.0000] # [E002D] TAG HYPHEN-MINUS
+E002E ; [.0000.0000.0000.0000] # [E002E] TAG FULL STOP
+E002F ; [.0000.0000.0000.0000] # [E002F] TAG SOLIDUS
+E0030 ; [.0000.0000.0000.0000] # [E0030] TAG DIGIT ZERO
+E0031 ; [.0000.0000.0000.0000] # [E0031] TAG DIGIT ONE
+E0032 ; [.0000.0000.0000.0000] # [E0032] TAG DIGIT TWO
+E0033 ; [.0000.0000.0000.0000] # [E0033] TAG DIGIT THREE
+E0034 ; [.0000.0000.0000.0000] # [E0034] TAG DIGIT FOUR
+E0035 ; [.0000.0000.0000.0000] # [E0035] TAG DIGIT FIVE
+E0036 ; [.0000.0000.0000.0000] # [E0036] TAG DIGIT SIX
+E0037 ; [.0000.0000.0000.0000] # [E0037] TAG DIGIT SEVEN
+E0038 ; [.0000.0000.0000.0000] # [E0038] TAG DIGIT EIGHT
+E0039 ; [.0000.0000.0000.0000] # [E0039] TAG DIGIT NINE
+E003A ; [.0000.0000.0000.0000] # [E003A] TAG COLON
+E003B ; [.0000.0000.0000.0000] # [E003B] TAG SEMICOLON
+E003C ; [.0000.0000.0000.0000] # [E003C] TAG LESS-THAN SIGN
+E003D ; [.0000.0000.0000.0000] # [E003D] TAG EQUALS SIGN
+E003E ; [.0000.0000.0000.0000] # [E003E] TAG GREATER-THAN SIGN
+E003F ; [.0000.0000.0000.0000] # [E003F] TAG QUESTION MARK
+E0040 ; [.0000.0000.0000.0000] # [E0040] TAG COMMERCIAL AT
+E0041 ; [.0000.0000.0000.0000] # [E0041] TAG LATIN CAPITAL LETTER A
+E0042 ; [.0000.0000.0000.0000] # [E0042] TAG LATIN CAPITAL LETTER B
+E0043 ; [.0000.0000.0000.0000] # [E0043] TAG LATIN CAPITAL LETTER C
+E0044 ; [.0000.0000.0000.0000] # [E0044] TAG LATIN CAPITAL LETTER D
+E0045 ; [.0000.0000.0000.0000] # [E0045] TAG LATIN CAPITAL LETTER E
+E0046 ; [.0000.0000.0000.0000] # [E0046] TAG LATIN CAPITAL LETTER F
+E0047 ; [.0000.0000.0000.0000] # [E0047] TAG LATIN CAPITAL LETTER G
+E0048 ; [.0000.0000.0000.0000] # [E0048] TAG LATIN CAPITAL LETTER H
+E0049 ; [.0000.0000.0000.0000] # [E0049] TAG LATIN CAPITAL LETTER I
+E004A ; [.0000.0000.0000.0000] # [E004A] TAG LATIN CAPITAL LETTER J
+E004B ; [.0000.0000.0000.0000] # [E004B] TAG LATIN CAPITAL LETTER K
+E004C ; [.0000.0000.0000.0000] # [E004C] TAG LATIN CAPITAL LETTER L
+E004D ; [.0000.0000.0000.0000] # [E004D] TAG LATIN CAPITAL LETTER M
+E004E ; [.0000.0000.0000.0000] # [E004E] TAG LATIN CAPITAL LETTER N
+E004F ; [.0000.0000.0000.0000] # [E004F] TAG LATIN CAPITAL LETTER O
+E0050 ; [.0000.0000.0000.0000] # [E0050] TAG LATIN CAPITAL LETTER P
+E0051 ; [.0000.0000.0000.0000] # [E0051] TAG LATIN CAPITAL LETTER Q
+E0052 ; [.0000.0000.0000.0000] # [E0052] TAG LATIN CAPITAL LETTER R
+E0053 ; [.0000.0000.0000.0000] # [E0053] TAG LATIN CAPITAL LETTER S
+E0054 ; [.0000.0000.0000.0000] # [E0054] TAG LATIN CAPITAL LETTER T
+E0055 ; [.0000.0000.0000.0000] # [E0055] TAG LATIN CAPITAL LETTER U
+E0056 ; [.0000.0000.0000.0000] # [E0056] TAG LATIN CAPITAL LETTER V
+E0057 ; [.0000.0000.0000.0000] # [E0057] TAG LATIN CAPITAL LETTER W
+E0058 ; [.0000.0000.0000.0000] # [E0058] TAG LATIN CAPITAL LETTER X
+E0059 ; [.0000.0000.0000.0000] # [E0059] TAG LATIN CAPITAL LETTER Y
+E005A ; [.0000.0000.0000.0000] # [E005A] TAG LATIN CAPITAL LETTER Z
+E005B ; [.0000.0000.0000.0000] # [E005B] TAG LEFT SQUARE BRACKET
+E005C ; [.0000.0000.0000.0000] # [E005C] TAG REVERSE SOLIDUS
+E005D ; [.0000.0000.0000.0000] # [E005D] TAG RIGHT SQUARE BRACKET
+E005E ; [.0000.0000.0000.0000] # [E005E] TAG CIRCUMFLEX ACCENT
+E005F ; [.0000.0000.0000.0000] # [E005F] TAG LOW LINE
+E0060 ; [.0000.0000.0000.0000] # [E0060] TAG GRAVE ACCENT
+E0061 ; [.0000.0000.0000.0000] # [E0061] TAG LATIN SMALL LETTER A
+E0062 ; [.0000.0000.0000.0000] # [E0062] TAG LATIN SMALL LETTER B
+E0063 ; [.0000.0000.0000.0000] # [E0063] TAG LATIN SMALL LETTER C
+E0064 ; [.0000.0000.0000.0000] # [E0064] TAG LATIN SMALL LETTER D
+E0065 ; [.0000.0000.0000.0000] # [E0065] TAG LATIN SMALL LETTER E
+E0066 ; [.0000.0000.0000.0000] # [E0066] TAG LATIN SMALL LETTER F
+E0067 ; [.0000.0000.0000.0000] # [E0067] TAG LATIN SMALL LETTER G
+E0068 ; [.0000.0000.0000.0000] # [E0068] TAG LATIN SMALL LETTER H
+E0069 ; [.0000.0000.0000.0000] # [E0069] TAG LATIN SMALL LETTER I
+E006A ; [.0000.0000.0000.0000] # [E006A] TAG LATIN SMALL LETTER J
+E006B ; [.0000.0000.0000.0000] # [E006B] TAG LATIN SMALL LETTER K
+E006C ; [.0000.0000.0000.0000] # [E006C] TAG LATIN SMALL LETTER L
+E006D ; [.0000.0000.0000.0000] # [E006D] TAG LATIN SMALL LETTER M
+E006E ; [.0000.0000.0000.0000] # [E006E] TAG LATIN SMALL LETTER N
+E006F ; [.0000.0000.0000.0000] # [E006F] TAG LATIN SMALL LETTER O
+E0070 ; [.0000.0000.0000.0000] # [E0070] TAG LATIN SMALL LETTER P
+E0071 ; [.0000.0000.0000.0000] # [E0071] TAG LATIN SMALL LETTER Q
+E0072 ; [.0000.0000.0000.0000] # [E0072] TAG LATIN SMALL LETTER R
+E0073 ; [.0000.0000.0000.0000] # [E0073] TAG LATIN SMALL LETTER S
+E0074 ; [.0000.0000.0000.0000] # [E0074] TAG LATIN SMALL LETTER T
+E0075 ; [.0000.0000.0000.0000] # [E0075] TAG LATIN SMALL LETTER U
+E0076 ; [.0000.0000.0000.0000] # [E0076] TAG LATIN SMALL LETTER V
+E0077 ; [.0000.0000.0000.0000] # [E0077] TAG LATIN SMALL LETTER W
+E0078 ; [.0000.0000.0000.0000] # [E0078] TAG LATIN SMALL LETTER X
+E0079 ; [.0000.0000.0000.0000] # [E0079] TAG LATIN SMALL LETTER Y
+E007A ; [.0000.0000.0000.0000] # [E007A] TAG LATIN SMALL LETTER Z
+E007B ; [.0000.0000.0000.0000] # [E007B] TAG LEFT CURLY BRACKET
+E007C ; [.0000.0000.0000.0000] # [E007C] TAG VERTICAL LINE
+E007D ; [.0000.0000.0000.0000] # [E007D] TAG RIGHT CURLY BRACKET
+E007E ; [.0000.0000.0000.0000] # [E007E] TAG TILDE
+E007F ; [.0000.0000.0000.0000] # [E007F] CANCEL TAG
+E0100 ; [.0000.0000.0000.0000] # [E0100] VARIATION SELECTOR-17
+E0101 ; [.0000.0000.0000.0000] # [E0101] VARIATION SELECTOR-18
+E0102 ; [.0000.0000.0000.0000] # [E0102] VARIATION SELECTOR-19
+E0103 ; [.0000.0000.0000.0000] # [E0103] VARIATION SELECTOR-20
+E0104 ; [.0000.0000.0000.0000] # [E0104] VARIATION SELECTOR-21
+E0105 ; [.0000.0000.0000.0000] # [E0105] VARIATION SELECTOR-22
+E0106 ; [.0000.0000.0000.0000] # [E0106] VARIATION SELECTOR-23
+E0107 ; [.0000.0000.0000.0000] # [E0107] VARIATION SELECTOR-24
+E0108 ; [.0000.0000.0000.0000] # [E0108] VARIATION SELECTOR-25
+E0109 ; [.0000.0000.0000.0000] # [E0109] VARIATION SELECTOR-26
+E010A ; [.0000.0000.0000.0000] # [E010A] VARIATION SELECTOR-27
+E010B ; [.0000.0000.0000.0000] # [E010B] VARIATION SELECTOR-28
+E010C ; [.0000.0000.0000.0000] # [E010C] VARIATION SELECTOR-29
+E010D ; [.0000.0000.0000.0000] # [E010D] VARIATION SELECTOR-30
+E010E ; [.0000.0000.0000.0000] # [E010E] VARIATION SELECTOR-31
+E010F ; [.0000.0000.0000.0000] # [E010F] VARIATION SELECTOR-32
+E0110 ; [.0000.0000.0000.0000] # [E0110] VARIATION SELECTOR-33
+E0111 ; [.0000.0000.0000.0000] # [E0111] VARIATION SELECTOR-34
+E0112 ; [.0000.0000.0000.0000] # [E0112] VARIATION SELECTOR-35
+E0113 ; [.0000.0000.0000.0000] # [E0113] VARIATION SELECTOR-36
+E0114 ; [.0000.0000.0000.0000] # [E0114] VARIATION SELECTOR-37
+E0115 ; [.0000.0000.0000.0000] # [E0115] VARIATION SELECTOR-38
+E0116 ; [.0000.0000.0000.0000] # [E0116] VARIATION SELECTOR-39
+E0117 ; [.0000.0000.0000.0000] # [E0117] VARIATION SELECTOR-40
+E0118 ; [.0000.0000.0000.0000] # [E0118] VARIATION SELECTOR-41
+E0119 ; [.0000.0000.0000.0000] # [E0119] VARIATION SELECTOR-42
+E011A ; [.0000.0000.0000.0000] # [E011A] VARIATION SELECTOR-43
+E011B ; [.0000.0000.0000.0000] # [E011B] VARIATION SELECTOR-44
+E011C ; [.0000.0000.0000.0000] # [E011C] VARIATION SELECTOR-45
+E011D ; [.0000.0000.0000.0000] # [E011D] VARIATION SELECTOR-46
+E011E ; [.0000.0000.0000.0000] # [E011E] VARIATION SELECTOR-47
+E011F ; [.0000.0000.0000.0000] # [E011F] VARIATION SELECTOR-48
+E0120 ; [.0000.0000.0000.0000] # [E0120] VARIATION SELECTOR-49
+E0121 ; [.0000.0000.0000.0000] # [E0121] VARIATION SELECTOR-50
+E0122 ; [.0000.0000.0000.0000] # [E0122] VARIATION SELECTOR-51
+E0123 ; [.0000.0000.0000.0000] # [E0123] VARIATION SELECTOR-52
+E0124 ; [.0000.0000.0000.0000] # [E0124] VARIATION SELECTOR-53
+E0125 ; [.0000.0000.0000.0000] # [E0125] VARIATION SELECTOR-54
+E0126 ; [.0000.0000.0000.0000] # [E0126] VARIATION SELECTOR-55
+E0127 ; [.0000.0000.0000.0000] # [E0127] VARIATION SELECTOR-56
+E0128 ; [.0000.0000.0000.0000] # [E0128] VARIATION SELECTOR-57
+E0129 ; [.0000.0000.0000.0000] # [E0129] VARIATION SELECTOR-58
+E012A ; [.0000.0000.0000.0000] # [E012A] VARIATION SELECTOR-59
+E012B ; [.0000.0000.0000.0000] # [E012B] VARIATION SELECTOR-60
+E012C ; [.0000.0000.0000.0000] # [E012C] VARIATION SELECTOR-61
+E012D ; [.0000.0000.0000.0000] # [E012D] VARIATION SELECTOR-62
+E012E ; [.0000.0000.0000.0000] # [E012E] VARIATION SELECTOR-63
+E012F ; [.0000.0000.0000.0000] # [E012F] VARIATION SELECTOR-64
+E0130 ; [.0000.0000.0000.0000] # [E0130] VARIATION SELECTOR-65
+E0131 ; [.0000.0000.0000.0000] # [E0131] VARIATION SELECTOR-66
+E0132 ; [.0000.0000.0000.0000] # [E0132] VARIATION SELECTOR-67
+E0133 ; [.0000.0000.0000.0000] # [E0133] VARIATION SELECTOR-68
+E0134 ; [.0000.0000.0000.0000] # [E0134] VARIATION SELECTOR-69
+E0135 ; [.0000.0000.0000.0000] # [E0135] VARIATION SELECTOR-70
+E0136 ; [.0000.0000.0000.0000] # [E0136] VARIATION SELECTOR-71
+E0137 ; [.0000.0000.0000.0000] # [E0137] VARIATION SELECTOR-72
+E0138 ; [.0000.0000.0000.0000] # [E0138] VARIATION SELECTOR-73
+E0139 ; [.0000.0000.0000.0000] # [E0139] VARIATION SELECTOR-74
+E013A ; [.0000.0000.0000.0000] # [E013A] VARIATION SELECTOR-75
+E013B ; [.0000.0000.0000.0000] # [E013B] VARIATION SELECTOR-76
+E013C ; [.0000.0000.0000.0000] # [E013C] VARIATION SELECTOR-77
+E013D ; [.0000.0000.0000.0000] # [E013D] VARIATION SELECTOR-78
+E013E ; [.0000.0000.0000.0000] # [E013E] VARIATION SELECTOR-79
+E013F ; [.0000.0000.0000.0000] # [E013F] VARIATION SELECTOR-80
+E0140 ; [.0000.0000.0000.0000] # [E0140] VARIATION SELECTOR-81
+E0141 ; [.0000.0000.0000.0000] # [E0141] VARIATION SELECTOR-82
+E0142 ; [.0000.0000.0000.0000] # [E0142] VARIATION SELECTOR-83
+E0143 ; [.0000.0000.0000.0000] # [E0143] VARIATION SELECTOR-84
+E0144 ; [.0000.0000.0000.0000] # [E0144] VARIATION SELECTOR-85
+E0145 ; [.0000.0000.0000.0000] # [E0145] VARIATION SELECTOR-86
+E0146 ; [.0000.0000.0000.0000] # [E0146] VARIATION SELECTOR-87
+E0147 ; [.0000.0000.0000.0000] # [E0147] VARIATION SELECTOR-88
+E0148 ; [.0000.0000.0000.0000] # [E0148] VARIATION SELECTOR-89
+E0149 ; [.0000.0000.0000.0000] # [E0149] VARIATION SELECTOR-90
+E014A ; [.0000.0000.0000.0000] # [E014A] VARIATION SELECTOR-91
+E014B ; [.0000.0000.0000.0000] # [E014B] VARIATION SELECTOR-92
+E014C ; [.0000.0000.0000.0000] # [E014C] VARIATION SELECTOR-93
+E014D ; [.0000.0000.0000.0000] # [E014D] VARIATION SELECTOR-94
+E014E ; [.0000.0000.0000.0000] # [E014E] VARIATION SELECTOR-95
+E014F ; [.0000.0000.0000.0000] # [E014F] VARIATION SELECTOR-96
+E0150 ; [.0000.0000.0000.0000] # [E0150] VARIATION SELECTOR-97
+E0151 ; [.0000.0000.0000.0000] # [E0151] VARIATION SELECTOR-98
+E0152 ; [.0000.0000.0000.0000] # [E0152] VARIATION SELECTOR-99
+E0153 ; [.0000.0000.0000.0000] # [E0153] VARIATION SELECTOR-100
+E0154 ; [.0000.0000.0000.0000] # [E0154] VARIATION SELECTOR-101
+E0155 ; [.0000.0000.0000.0000] # [E0155] VARIATION SELECTOR-102
+E0156 ; [.0000.0000.0000.0000] # [E0156] VARIATION SELECTOR-103
+E0157 ; [.0000.0000.0000.0000] # [E0157] VARIATION SELECTOR-104
+E0158 ; [.0000.0000.0000.0000] # [E0158] VARIATION SELECTOR-105
+E0159 ; [.0000.0000.0000.0000] # [E0159] VARIATION SELECTOR-106
+E015A ; [.0000.0000.0000.0000] # [E015A] VARIATION SELECTOR-107
+E015B ; [.0000.0000.0000.0000] # [E015B] VARIATION SELECTOR-108
+E015C ; [.0000.0000.0000.0000] # [E015C] VARIATION SELECTOR-109
+E015D ; [.0000.0000.0000.0000] # [E015D] VARIATION SELECTOR-110
+E015E ; [.0000.0000.0000.0000] # [E015E] VARIATION SELECTOR-111
+E015F ; [.0000.0000.0000.0000] # [E015F] VARIATION SELECTOR-112
+E0160 ; [.0000.0000.0000.0000] # [E0160] VARIATION SELECTOR-113
+E0161 ; [.0000.0000.0000.0000] # [E0161] VARIATION SELECTOR-114
+E0162 ; [.0000.0000.0000.0000] # [E0162] VARIATION SELECTOR-115
+E0163 ; [.0000.0000.0000.0000] # [E0163] VARIATION SELECTOR-116
+E0164 ; [.0000.0000.0000.0000] # [E0164] VARIATION SELECTOR-117
+E0165 ; [.0000.0000.0000.0000] # [E0165] VARIATION SELECTOR-118
+E0166 ; [.0000.0000.0000.0000] # [E0166] VARIATION SELECTOR-119
+E0167 ; [.0000.0000.0000.0000] # [E0167] VARIATION SELECTOR-120
+E0168 ; [.0000.0000.0000.0000] # [E0168] VARIATION SELECTOR-121
+E0169 ; [.0000.0000.0000.0000] # [E0169] VARIATION SELECTOR-122
+E016A ; [.0000.0000.0000.0000] # [E016A] VARIATION SELECTOR-123
+E016B ; [.0000.0000.0000.0000] # [E016B] VARIATION SELECTOR-124
+E016C ; [.0000.0000.0000.0000] # [E016C] VARIATION SELECTOR-125
+E016D ; [.0000.0000.0000.0000] # [E016D] VARIATION SELECTOR-126
+E016E ; [.0000.0000.0000.0000] # [E016E] VARIATION SELECTOR-127
+E016F ; [.0000.0000.0000.0000] # [E016F] VARIATION SELECTOR-128
+E0170 ; [.0000.0000.0000.0000] # [E0170] VARIATION SELECTOR-129
+E0171 ; [.0000.0000.0000.0000] # [E0171] VARIATION SELECTOR-130
+E0172 ; [.0000.0000.0000.0000] # [E0172] VARIATION SELECTOR-131
+E0173 ; [.0000.0000.0000.0000] # [E0173] VARIATION SELECTOR-132
+E0174 ; [.0000.0000.0000.0000] # [E0174] VARIATION SELECTOR-133
+E0175 ; [.0000.0000.0000.0000] # [E0175] VARIATION SELECTOR-134
+E0176 ; [.0000.0000.0000.0000] # [E0176] VARIATION SELECTOR-135
+E0177 ; [.0000.0000.0000.0000] # [E0177] VARIATION SELECTOR-136
+E0178 ; [.0000.0000.0000.0000] # [E0178] VARIATION SELECTOR-137
+E0179 ; [.0000.0000.0000.0000] # [E0179] VARIATION SELECTOR-138
+E017A ; [.0000.0000.0000.0000] # [E017A] VARIATION SELECTOR-139
+E017B ; [.0000.0000.0000.0000] # [E017B] VARIATION SELECTOR-140
+E017C ; [.0000.0000.0000.0000] # [E017C] VARIATION SELECTOR-141
+E017D ; [.0000.0000.0000.0000] # [E017D] VARIATION SELECTOR-142
+E017E ; [.0000.0000.0000.0000] # [E017E] VARIATION SELECTOR-143
+E017F ; [.0000.0000.0000.0000] # [E017F] VARIATION SELECTOR-144
+E0180 ; [.0000.0000.0000.0000] # [E0180] VARIATION SELECTOR-145
+E0181 ; [.0000.0000.0000.0000] # [E0181] VARIATION SELECTOR-146
+E0182 ; [.0000.0000.0000.0000] # [E0182] VARIATION SELECTOR-147
+E0183 ; [.0000.0000.0000.0000] # [E0183] VARIATION SELECTOR-148
+E0184 ; [.0000.0000.0000.0000] # [E0184] VARIATION SELECTOR-149
+E0185 ; [.0000.0000.0000.0000] # [E0185] VARIATION SELECTOR-150
+E0186 ; [.0000.0000.0000.0000] # [E0186] VARIATION SELECTOR-151
+E0187 ; [.0000.0000.0000.0000] # [E0187] VARIATION SELECTOR-152
+E0188 ; [.0000.0000.0000.0000] # [E0188] VARIATION SELECTOR-153
+E0189 ; [.0000.0000.0000.0000] # [E0189] VARIATION SELECTOR-154
+E018A ; [.0000.0000.0000.0000] # [E018A] VARIATION SELECTOR-155
+E018B ; [.0000.0000.0000.0000] # [E018B] VARIATION SELECTOR-156
+E018C ; [.0000.0000.0000.0000] # [E018C] VARIATION SELECTOR-157
+E018D ; [.0000.0000.0000.0000] # [E018D] VARIATION SELECTOR-158
+E018E ; [.0000.0000.0000.0000] # [E018E] VARIATION SELECTOR-159
+E018F ; [.0000.0000.0000.0000] # [E018F] VARIATION SELECTOR-160
+E0190 ; [.0000.0000.0000.0000] # [E0190] VARIATION SELECTOR-161
+E0191 ; [.0000.0000.0000.0000] # [E0191] VARIATION SELECTOR-162
+E0192 ; [.0000.0000.0000.0000] # [E0192] VARIATION SELECTOR-163
+E0193 ; [.0000.0000.0000.0000] # [E0193] VARIATION SELECTOR-164
+E0194 ; [.0000.0000.0000.0000] # [E0194] VARIATION SELECTOR-165
+E0195 ; [.0000.0000.0000.0000] # [E0195] VARIATION SELECTOR-166
+E0196 ; [.0000.0000.0000.0000] # [E0196] VARIATION SELECTOR-167
+E0197 ; [.0000.0000.0000.0000] # [E0197] VARIATION SELECTOR-168
+E0198 ; [.0000.0000.0000.0000] # [E0198] VARIATION SELECTOR-169
+E0199 ; [.0000.0000.0000.0000] # [E0199] VARIATION SELECTOR-170
+E019A ; [.0000.0000.0000.0000] # [E019A] VARIATION SELECTOR-171
+E019B ; [.0000.0000.0000.0000] # [E019B] VARIATION SELECTOR-172
+E019C ; [.0000.0000.0000.0000] # [E019C] VARIATION SELECTOR-173
+E019D ; [.0000.0000.0000.0000] # [E019D] VARIATION SELECTOR-174
+E019E ; [.0000.0000.0000.0000] # [E019E] VARIATION SELECTOR-175
+E019F ; [.0000.0000.0000.0000] # [E019F] VARIATION SELECTOR-176
+E01A0 ; [.0000.0000.0000.0000] # [E01A0] VARIATION SELECTOR-177
+E01A1 ; [.0000.0000.0000.0000] # [E01A1] VARIATION SELECTOR-178
+E01A2 ; [.0000.0000.0000.0000] # [E01A2] VARIATION SELECTOR-179
+E01A3 ; [.0000.0000.0000.0000] # [E01A3] VARIATION SELECTOR-180
+E01A4 ; [.0000.0000.0000.0000] # [E01A4] VARIATION SELECTOR-181
+E01A5 ; [.0000.0000.0000.0000] # [E01A5] VARIATION SELECTOR-182
+E01A6 ; [.0000.0000.0000.0000] # [E01A6] VARIATION SELECTOR-183
+E01A7 ; [.0000.0000.0000.0000] # [E01A7] VARIATION SELECTOR-184
+E01A8 ; [.0000.0000.0000.0000] # [E01A8] VARIATION SELECTOR-185
+E01A9 ; [.0000.0000.0000.0000] # [E01A9] VARIATION SELECTOR-186
+E01AA ; [.0000.0000.0000.0000] # [E01AA] VARIATION SELECTOR-187
+E01AB ; [.0000.0000.0000.0000] # [E01AB] VARIATION SELECTOR-188
+E01AC ; [.0000.0000.0000.0000] # [E01AC] VARIATION SELECTOR-189
+E01AD ; [.0000.0000.0000.0000] # [E01AD] VARIATION SELECTOR-190
+E01AE ; [.0000.0000.0000.0000] # [E01AE] VARIATION SELECTOR-191
+E01AF ; [.0000.0000.0000.0000] # [E01AF] VARIATION SELECTOR-192
+E01B0 ; [.0000.0000.0000.0000] # [E01B0] VARIATION SELECTOR-193
+E01B1 ; [.0000.0000.0000.0000] # [E01B1] VARIATION SELECTOR-194
+E01B2 ; [.0000.0000.0000.0000] # [E01B2] VARIATION SELECTOR-195
+E01B3 ; [.0000.0000.0000.0000] # [E01B3] VARIATION SELECTOR-196
+E01B4 ; [.0000.0000.0000.0000] # [E01B4] VARIATION SELECTOR-197
+E01B5 ; [.0000.0000.0000.0000] # [E01B5] VARIATION SELECTOR-198
+E01B6 ; [.0000.0000.0000.0000] # [E01B6] VARIATION SELECTOR-199
+E01B7 ; [.0000.0000.0000.0000] # [E01B7] VARIATION SELECTOR-200
+E01B8 ; [.0000.0000.0000.0000] # [E01B8] VARIATION SELECTOR-201
+E01B9 ; [.0000.0000.0000.0000] # [E01B9] VARIATION SELECTOR-202
+E01BA ; [.0000.0000.0000.0000] # [E01BA] VARIATION SELECTOR-203
+E01BB ; [.0000.0000.0000.0000] # [E01BB] VARIATION SELECTOR-204
+E01BC ; [.0000.0000.0000.0000] # [E01BC] VARIATION SELECTOR-205
+E01BD ; [.0000.0000.0000.0000] # [E01BD] VARIATION SELECTOR-206
+E01BE ; [.0000.0000.0000.0000] # [E01BE] VARIATION SELECTOR-207
+E01BF ; [.0000.0000.0000.0000] # [E01BF] VARIATION SELECTOR-208
+E01C0 ; [.0000.0000.0000.0000] # [E01C0] VARIATION SELECTOR-209
+E01C1 ; [.0000.0000.0000.0000] # [E01C1] VARIATION SELECTOR-210
+E01C2 ; [.0000.0000.0000.0000] # [E01C2] VARIATION SELECTOR-211
+E01C3 ; [.0000.0000.0000.0000] # [E01C3] VARIATION SELECTOR-212
+E01C4 ; [.0000.0000.0000.0000] # [E01C4] VARIATION SELECTOR-213
+E01C5 ; [.0000.0000.0000.0000] # [E01C5] VARIATION SELECTOR-214
+E01C6 ; [.0000.0000.0000.0000] # [E01C6] VARIATION SELECTOR-215
+E01C7 ; [.0000.0000.0000.0000] # [E01C7] VARIATION SELECTOR-216
+E01C8 ; [.0000.0000.0000.0000] # [E01C8] VARIATION SELECTOR-217
+E01C9 ; [.0000.0000.0000.0000] # [E01C9] VARIATION SELECTOR-218
+E01CA ; [.0000.0000.0000.0000] # [E01CA] VARIATION SELECTOR-219
+E01CB ; [.0000.0000.0000.0000] # [E01CB] VARIATION SELECTOR-220
+E01CC ; [.0000.0000.0000.0000] # [E01CC] VARIATION SELECTOR-221
+E01CD ; [.0000.0000.0000.0000] # [E01CD] VARIATION SELECTOR-222
+E01CE ; [.0000.0000.0000.0000] # [E01CE] VARIATION SELECTOR-223
+E01CF ; [.0000.0000.0000.0000] # [E01CF] VARIATION SELECTOR-224
+E01D0 ; [.0000.0000.0000.0000] # [E01D0] VARIATION SELECTOR-225
+E01D1 ; [.0000.0000.0000.0000] # [E01D1] VARIATION SELECTOR-226
+E01D2 ; [.0000.0000.0000.0000] # [E01D2] VARIATION SELECTOR-227
+E01D3 ; [.0000.0000.0000.0000] # [E01D3] VARIATION SELECTOR-228
+E01D4 ; [.0000.0000.0000.0000] # [E01D4] VARIATION SELECTOR-229
+E01D5 ; [.0000.0000.0000.0000] # [E01D5] VARIATION SELECTOR-230
+E01D6 ; [.0000.0000.0000.0000] # [E01D6] VARIATION SELECTOR-231
+E01D7 ; [.0000.0000.0000.0000] # [E01D7] VARIATION SELECTOR-232
+E01D8 ; [.0000.0000.0000.0000] # [E01D8] VARIATION SELECTOR-233
+E01D9 ; [.0000.0000.0000.0000] # [E01D9] VARIATION SELECTOR-234
+E01DA ; [.0000.0000.0000.0000] # [E01DA] VARIATION SELECTOR-235
+E01DB ; [.0000.0000.0000.0000] # [E01DB] VARIATION SELECTOR-236
+E01DC ; [.0000.0000.0000.0000] # [E01DC] VARIATION SELECTOR-237
+E01DD ; [.0000.0000.0000.0000] # [E01DD] VARIATION SELECTOR-238
+E01DE ; [.0000.0000.0000.0000] # [E01DE] VARIATION SELECTOR-239
+E01DF ; [.0000.0000.0000.0000] # [E01DF] VARIATION SELECTOR-240
+E01E0 ; [.0000.0000.0000.0000] # [E01E0] VARIATION SELECTOR-241
+E01E1 ; [.0000.0000.0000.0000] # [E01E1] VARIATION SELECTOR-242
+E01E2 ; [.0000.0000.0000.0000] # [E01E2] VARIATION SELECTOR-243
+E01E3 ; [.0000.0000.0000.0000] # [E01E3] VARIATION SELECTOR-244
+E01E4 ; [.0000.0000.0000.0000] # [E01E4] VARIATION SELECTOR-245
+E01E5 ; [.0000.0000.0000.0000] # [E01E5] VARIATION SELECTOR-246
+E01E6 ; [.0000.0000.0000.0000] # [E01E6] VARIATION SELECTOR-247
+E01E7 ; [.0000.0000.0000.0000] # [E01E7] VARIATION SELECTOR-248
+E01E8 ; [.0000.0000.0000.0000] # [E01E8] VARIATION SELECTOR-249
+E01E9 ; [.0000.0000.0000.0000] # [E01E9] VARIATION SELECTOR-250
+E01EA ; [.0000.0000.0000.0000] # [E01EA] VARIATION SELECTOR-251
+E01EB ; [.0000.0000.0000.0000] # [E01EB] VARIATION SELECTOR-252
+E01EC ; [.0000.0000.0000.0000] # [E01EC] VARIATION SELECTOR-253
+E01ED ; [.0000.0000.0000.0000] # [E01ED] VARIATION SELECTOR-254
+E01EE ; [.0000.0000.0000.0000] # [E01EE] VARIATION SELECTOR-255
+E01EF ; [.0000.0000.0000.0000] # [E01EF] VARIATION SELECTOR-256
+0009 ; [*0201.0020.0002.0009] # HORIZONTAL TABULATION (in 6429)
+000A ; [*0202.0020.0002.000A] # LINE FEED (in 6429)
+000B ; [*0203.0020.0002.000B] # VERTICAL TABULATION (in 6429)
+000C ; [*0204.0020.0002.000C] # FORM FEED (in 6429)
+000D ; [*0205.0020.0002.000D] # CARRIAGE RETURN (in 6429)
+0020 ; [*0209.0020.0002.0020] # SPACE
+0021 ; [*0251.0020.0002.0021] # EXCLAMATION MARK
+0022 ; [*027E.0020.0002.0022] # QUOTATION MARK
+0023 ; [*02D2.0020.0002.0023] # NUMBER SIGN
+0025 ; [*02D3.0020.0002.0025] # PERCENT SIGN
+0026 ; [*02CF.0020.0002.0026] # AMPERSAND
+0027 ; [*0277.0020.0002.0027] # APOSTROPHE
+0028 ; [*0288.0020.0002.0028] # LEFT PARENTHESIS
+0029 ; [*0289.0020.0002.0029] # RIGHT PARENTHESIS
+002A ; [*02C8.0020.0002.002A] # ASTERISK
+002B ; [*0428.0020.0002.002B] # PLUS SIGN
+002C ; [*022F.0020.0002.002C] # COMMA
+002D ; [*0221.0020.0002.002D] # HYPHEN-MINUS
+002E ; [*025D.0020.0002.002E] # FULL STOP
+002F ; [*02CC.0020.0002.002F] # SOLIDUS
+003A ; [*023D.0020.0002.003A] # COLON
+003B ; [*023A.0020.0002.003B] # SEMICOLON
+003C ; [*042C.0020.0002.003C] # LESS-THAN SIGN
+003D ; [*042D.0020.0002.003D] # EQUALS SIGN
+003E ; [*042E.0020.0002.003E] # GREATER-THAN SIGN
+003F ; [*0255.0020.0002.003F] # QUESTION MARK
+0040 ; [*02C7.0020.0002.0040] # COMMERCIAL AT
+005B ; [*028A.0020.0002.005B] # LEFT SQUARE BRACKET
+005C ; [*02CE.0020.0002.005C] # REVERSE SOLIDUS
+005D ; [*028B.0020.0002.005D] # RIGHT SQUARE BRACKET
+005E ; [*020F.0020.0002.005E] # CIRCUMFLEX ACCENT
+005F ; [*021B.0020.0002.005F] # LOW LINE
+0060 ; [*020C.0020.0002.0060] # GRAVE ACCENT
+007B ; [*028C.0020.0002.007B] # LEFT CURLY BRACKET
+007C ; [*0430.0020.0002.007C] # VERTICAL LINE
+007D ; [*028D.0020.0002.007D] # RIGHT CURLY BRACKET
+007E ; [*0433.0020.0002.007E] # TILDE
+0085 ; [*0206.0020.0002.0085] # NEXT LINE (in 6429)
+00A0 ; [*0209.0020.001B.00A0] # NO-BREAK SPACE; QQK
+00A1 ; [*0252.0020.0002.00A1] # INVERTED EXCLAMATION MARK
+00A6 ; [*0431.0020.0002.00A6] # BROKEN BAR
+00A7 ; [*02C2.0020.0002.00A7] # SECTION SIGN
+00A8 ; [*0214.0020.0002.00A8] # DIAERESIS
+00A9 ; [*02C5.0020.0002.00A9] # COPYRIGHT SIGN
+00AB ; [*0286.0020.0002.00AB] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; [*042F.0020.0002.00AC] # NOT SIGN
+00AD ; [*0220.0020.0002.00AD] # SOFT HYPHEN
+00AE ; [*02C6.0020.0002.00AE] # REGISTERED SIGN
+00AF ; [*0210.0020.0002.00AF] # MACRON
+00B0 ; [*034A.0020.0002.00B0] # DEGREE SIGN
+00B1 ; [*0429.0020.0002.00B1] # PLUS-MINUS SIGN
+00B4 ; [*020D.0020.0002.00B4] # ACUTE ACCENT
+00B6 ; [*02C3.0020.0002.00B6] # PILCROW SIGN
+00B7 ; [*0267.0020.0002.00B7] # MIDDLE DOT
+00B8 ; [*0219.0020.0002.00B8] # CEDILLA
+00BB ; [*0287.0020.0002.00BB] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF ; [*0256.0020.0002.00BF] # INVERTED QUESTION MARK
+00D7 ; [*042B.0020.0002.00D7] # MULTIPLICATION SIGN
+00F7 ; [*042A.0020.0002.00F7] # DIVISION SIGN
+02B9 ; [*0317.0020.0002.02B9] # MODIFIER LETTER PRIME
+02BA ; [*0319.0020.0002.02BA] # MODIFIER LETTER DOUBLE PRIME
+02C2 ; [*031A.0020.0002.02C2] # MODIFIER LETTER LEFT ARROWHEAD
+02C3 ; [*031B.0020.0002.02C3] # MODIFIER LETTER RIGHT ARROWHEAD
+02C4 ; [*031C.0020.0002.02C4] # MODIFIER LETTER UP ARROWHEAD
+02C5 ; [*031D.0020.0002.02C5] # MODIFIER LETTER DOWN ARROWHEAD
+02C6 ; [*031E.0020.0002.02C6] # MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7 ; [*031F.0020.0002.02C7] # CARON
+02C8 ; [*0320.0020.0002.02C8] # MODIFIER LETTER VERTICAL LINE
+02C9 ; [*0321.0020.0002.02C9] # MODIFIER LETTER MACRON
+02CA ; [*0322.0020.0002.02CA] # MODIFIER LETTER ACUTE ACCENT
+02CB ; [*0323.0020.0002.02CB] # MODIFIER LETTER GRAVE ACCENT
+02CC ; [*0324.0020.0002.02CC] # MODIFIER LETTER LOW VERTICAL LINE
+02CD ; [*0325.0020.0002.02CD] # MODIFIER LETTER LOW MACRON
+02CE ; [*0326.0020.0002.02CE] # MODIFIER LETTER LOW GRAVE ACCENT
+02CF ; [*0327.0020.0002.02CF] # MODIFIER LETTER LOW ACUTE ACCENT
+02D2 ; [*0328.0020.0002.02D2] # MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3 ; [*0329.0020.0002.02D3] # MODIFIER LETTER CENTRED LEFT HALF RING
+02D4 ; [*032A.0020.0002.02D4] # MODIFIER LETTER UP TACK
+02D5 ; [*032B.0020.0002.02D5] # MODIFIER LETTER DOWN TACK
+02D6 ; [*032C.0020.0002.02D6] # MODIFIER LETTER PLUS SIGN
+02D7 ; [*032D.0020.0002.02D7] # MODIFIER LETTER MINUS SIGN
+02D8 ; [*0212.0020.0002.02D8] # BREVE
+02D9 ; [*0213.0020.0002.02D9] # DOT ABOVE
+02DA ; [*0215.0020.0002.02DA] # RING ABOVE
+02DB ; [*021A.0020.0002.02DB] # OGONEK
+02DC ; [*020E.0020.0002.02DC] # SMALL TILDE
+02DD ; [*0216.0020.0002.02DD] # DOUBLE ACUTE ACCENT
+02DE ; [*032E.0020.0002.02DE] # MODIFIER LETTER RHOTIC HOOK
+02DF ; [*032F.0020.0002.02DF] # MODIFIER LETTER CROSS ACCENT
+02E5 ; [*0330.0020.0002.02E5] # MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6 ; [*0331.0020.0002.02E6] # MODIFIER LETTER HIGH TONE BAR
+02E7 ; [*0332.0020.0002.02E7] # MODIFIER LETTER MID TONE BAR
+02E8 ; [*0333.0020.0002.02E8] # MODIFIER LETTER LOW TONE BAR
+02E9 ; [*0334.0020.0002.02E9] # MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA ; [*0335.0020.0002.02EA] # MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB ; [*0336.0020.0002.02EB] # MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; [*0337.0020.0002.02EC] # MODIFIER LETTER VOICING
+02ED ; [*0338.0020.0002.02ED] # MODIFIER LETTER UNASPIRATED
+02EF ; [*0339.0020.0002.02EF] # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0 ; [*033A.0020.0002.02F0] # MODIFIER LETTER LOW UP ARROWHEAD
+02F1 ; [*033B.0020.0002.02F1] # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2 ; [*033C.0020.0002.02F2] # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3 ; [*033D.0020.0002.02F3] # MODIFIER LETTER LOW RING
+02F4 ; [*033E.0020.0002.02F4] # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5 ; [*033F.0020.0002.02F5] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6 ; [*0340.0020.0002.02F6] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7 ; [*0341.0020.0002.02F7] # MODIFIER LETTER LOW TILDE
+02F8 ; [*0342.0020.0002.02F8] # MODIFIER LETTER RAISED COLON
+02F9 ; [*0343.0020.0002.02F9] # MODIFIER LETTER BEGIN HIGH TONE
+02FA ; [*0344.0020.0002.02FA] # MODIFIER LETTER END HIGH TONE
+02FB ; [*0345.0020.0002.02FB] # MODIFIER LETTER BEGIN LOW TONE
+02FC ; [*0346.0020.0002.02FC] # MODIFIER LETTER END LOW TONE
+02FD ; [*0347.0020.0002.02FD] # MODIFIER LETTER SHELF
+02FE ; [*0348.0020.0002.02FE] # MODIFIER LETTER OPEN SHELF
+02FF ; [*0349.0020.0002.02FF] # MODIFIER LETTER LOW LEFT ARROW
+034F ; [.0000.0000.0000.034F] # COMBINING GRAPHEME JOINER
+0374 ; [*0317.0020.0002.0374] # GREEK NUMERAL SIGN; QQC
+0375 ; [*0318.0020.0002.0375] # GREEK LOWER NUMERAL SIGN
+037E ; [*023A.0020.0002.037E] # GREEK QUESTION MARK; QQC
+0384 ; [*020D.0020.0002.0384] # GREEK TONOS; QQC
+0385 ; [*0214.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA TONOS; QQCM
+0387 ; [*0267.0020.0002.0387] # GREEK ANO TELEIA; QQC
+03F6 ; [*0423.0020.0002.03F6] # GREEK REVERSED LUNATE EPSILON SYMBOL
+0482 ; [*034B.0020.0002.0482] # CYRILLIC THOUSANDS SIGN
+0488 ; [.0000.0000.0000.0488] # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489 ; [.0000.0000.0000.0489] # COMBINING CYRILLIC MILLIONS SIGN
+055A ; [*02EC.0020.0002.055A] # ARMENIAN APOSTROPHE
+055B ; [*02ED.0020.0002.055B] # ARMENIAN EMPHASIS MARK
+055C ; [*0253.0020.0002.055C] # ARMENIAN EXCLAMATION MARK
+055D ; [*0230.0020.0002.055D] # ARMENIAN COMMA
+055E ; [*0257.0020.0002.055E] # ARMENIAN QUESTION MARK
+055F ; [*02EE.0020.0002.055F] # ARMENIAN ABBREVIATION MARK
+0589 ; [*023E.0020.0002.0589] # ARMENIAN FULL STOP
+058A ; [*0222.0020.0002.058A] # ARMENIAN HYPHEN
+0591 ; [.0000.0000.0000.0591] # HEBREW ACCENT ETNAHTA
+0592 ; [.0000.0000.0000.0592] # HEBREW ACCENT SEGOL
+0593 ; [.0000.0000.0000.0593] # HEBREW ACCENT SHALSHELET
+0594 ; [.0000.0000.0000.0594] # HEBREW ACCENT ZAQEF QATAN
+0595 ; [.0000.0000.0000.0595] # HEBREW ACCENT ZAQEF GADOL
+0596 ; [.0000.0000.0000.0596] # HEBREW ACCENT TIPEHA
+0597 ; [.0000.0000.0000.0597] # HEBREW ACCENT REVIA
+0598 ; [.0000.0000.0000.0598] # HEBREW ACCENT ZARQA
+0599 ; [.0000.0000.0000.0599] # HEBREW ACCENT PASHTA
+059A ; [.0000.0000.0000.059A] # HEBREW ACCENT YETIV
+059B ; [.0000.0000.0000.059B] # HEBREW ACCENT TEVIR
+059C ; [.0000.0000.0000.059C] # HEBREW ACCENT GERESH
+059D ; [.0000.0000.0000.059D] # HEBREW ACCENT GERESH MUQDAM
+059E ; [.0000.0000.0000.059E] # HEBREW ACCENT GERSHAYIM
+059F ; [.0000.0000.0000.059F] # HEBREW ACCENT QARNEY PARA
+05A0 ; [.0000.0000.0000.05A0] # HEBREW ACCENT TELISHA GEDOLA
+05A1 ; [.0000.0000.0000.05A1] # HEBREW ACCENT PAZER
+05A3 ; [.0000.0000.0000.05A3] # HEBREW ACCENT MUNAH
+05A4 ; [.0000.0000.0000.05A4] # HEBREW ACCENT MAHAPAKH
+05A5 ; [.0000.0000.0000.05A5] # HEBREW ACCENT MERKHA
+05A6 ; [.0000.0000.0000.05A6] # HEBREW ACCENT MERKHA KEFULA
+05A7 ; [.0000.0000.0000.05A7] # HEBREW ACCENT DARGA
+05A8 ; [.0000.0000.0000.05A8] # HEBREW ACCENT QADMA
+05A9 ; [.0000.0000.0000.05A9] # HEBREW ACCENT TELISHA QETANA
+05AA ; [.0000.0000.0000.05AA] # HEBREW ACCENT YERAH BEN YOMO
+05AB ; [.0000.0000.0000.05AB] # HEBREW ACCENT OLE
+05AC ; [.0000.0000.0000.05AC] # HEBREW ACCENT ILUY
+05AD ; [.0000.0000.0000.05AD] # HEBREW ACCENT DEHI
+05AE ; [.0000.0000.0000.05AE] # HEBREW ACCENT ZINOR
+05AF ; [.0000.0000.0000.05AF] # HEBREW MARK MASORA CIRCLE
+05BD ; [.0000.0000.0000.05BD] # HEBREW POINT METEG
+05BE ; [*02EF.0020.0002.05BE] # HEBREW PUNCTUATION MAQAF
+05C0 ; [*02F0.0020.0002.05C0] # HEBREW PUNCTUATION PASEQ
+05C3 ; [*02F1.0020.0002.05C3] # HEBREW PUNCTUATION SOF PASUQ
+05C4 ; [.0000.0000.0000.05C4] # HEBREW MARK UPPER DOT
+05F3 ; [*02F2.0020.0002.05F3] # HEBREW PUNCTUATION GERESH
+05F4 ; [*02F3.0020.0002.05F4] # HEBREW PUNCTUATION GERSHAYIM
+060C ; [*0231.0020.0002.060C] # ARABIC COMMA
+060D ; [*0232.0020.0002.060D] # ARABIC DATE SEPARATOR
+060E ; [*034C.0020.0002.060E] # ARABIC POETIC VERSE SIGN
+060F ; [*034D.0020.0002.060F] # ARABIC SIGN MISRA
+0610 ; [.0000.0000.0000.0610] # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611 ; [.0000.0000.0000.0611] # ARABIC SIGN ALAYHE ASSALLAM
+0612 ; [.0000.0000.0000.0612] # ARABIC SIGN RAHMATULLAH ALAYHE
+0613 ; [.0000.0000.0000.0613] # ARABIC SIGN RADI ALLAHOU ANHU
+0614 ; [.0000.0000.0000.0614] # ARABIC SIGN TAKHALLUS
+0615 ; [.0000.0000.0000.0615] # ARABIC SMALL HIGH TAH
+061B ; [*023B.0020.0002.061B] # ARABIC SEMICOLON
+061F ; [*0258.0020.0002.061F] # ARABIC QUESTION MARK
+0640 ; [*020B.0020.0002.0640] # ARABIC TATWEEL
+066A ; [*02D4.0020.0002.066A] # ARABIC PERCENT SIGN
+066B ; [*0233.0020.0002.066B] # ARABIC DECIMAL SEPARATOR
+066C ; [*0234.0020.0002.066C] # ARABIC THOUSANDS SEPARATOR
+066D ; [*02CB.0020.0002.066D] # ARABIC FIVE POINTED STAR
+06D4 ; [*025F.0020.0002.06D4] # ARABIC FULL STOP
+06D6 ; [.0000.0000.0000.06D6] # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7 ; [.0000.0000.0000.06D7] # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8 ; [.0000.0000.0000.06D8] # ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9 ; [.0000.0000.0000.06D9] # ARABIC SMALL HIGH LAM ALEF
+06DA ; [.0000.0000.0000.06DA] # ARABIC SMALL HIGH JEEM
+06DB ; [.0000.0000.0000.06DB] # ARABIC SMALL HIGH THREE DOTS
+06DC ; [.0000.0000.0000.06DC] # ARABIC SMALL HIGH SEEN
+06DE ; [.0000.0000.0000.06DE] # ARABIC START OF RUB EL HIZB
+06DF ; [.0000.0000.0000.06DF] # ARABIC SMALL HIGH ROUNDED ZERO
+06E0 ; [.0000.0000.0000.06E0] # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1 ; [.0000.0000.0000.06E1] # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2 ; [.0000.0000.0000.06E2] # ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3 ; [.0000.0000.0000.06E3] # ARABIC SMALL LOW SEEN
+06E4 ; [.0000.0000.0000.06E4] # ARABIC SMALL HIGH MADDA
+06E7 ; [.0000.0000.0000.06E7] # ARABIC SMALL HIGH YEH
+06E8 ; [.0000.0000.0000.06E8] # ARABIC SMALL HIGH NOON
+06E9 ; [*034E.0020.0002.06E9] # ARABIC PLACE OF SAJDAH
+06EA ; [.0000.0000.0000.06EA] # ARABIC EMPTY CENTRE LOW STOP
+06EB ; [.0000.0000.0000.06EB] # ARABIC EMPTY CENTRE HIGH STOP
+06EC ; [.0000.0000.0000.06EC] # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED ; [.0000.0000.0000.06ED] # ARABIC SMALL LOW MEEM
+0700 ; [*0270.0020.0002.0700] # SYRIAC END OF PARAGRAPH
+0701 ; [*0260.0020.0002.0701] # SYRIAC SUPRALINEAR FULL STOP
+0702 ; [*0261.0020.0002.0702] # SYRIAC SUBLINEAR FULL STOP
+0703 ; [*023F.0020.0002.0703] # SYRIAC SUPRALINEAR COLON
+0704 ; [*0240.0020.0002.0704] # SYRIAC SUBLINEAR COLON
+0705 ; [*0241.0020.0002.0705] # SYRIAC HORIZONTAL COLON
+0706 ; [*0242.0020.0002.0706] # SYRIAC COLON SKEWED LEFT
+0707 ; [*0243.0020.0002.0707] # SYRIAC COLON SKEWED RIGHT
+0708 ; [*0244.0020.0002.0708] # SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709 ; [*0259.0020.0002.0709] # SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A ; [*02F4.0020.0002.070A] # SYRIAC CONTRACTION
+070B ; [*02F5.0020.0002.070B] # SYRIAC HARKLEAN OBELUS
+070C ; [*02F6.0020.0002.070C] # SYRIAC HARKLEAN METOBELUS
+070D ; [*02F7.0020.0002.070D] # SYRIAC HARKLEAN ASTERISCUS
+0964 ; [*0268.0020.0002.0964] # DEVANAGARI DANDA
+0965 ; [*0269.0020.0002.0965] # DEVANAGARI DOUBLE DANDA
+0970 ; [*02FA.0020.0002.0970] # DEVANAGARI ABBREVIATION SIGN
+09F8 ; [*0DC7.0020.0002.09F8] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9 ; [*0DC8.0020.0002.09F9] # BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA ; [*0350.0020.0002.09FA] # BENGALI ISSHAR
+0B70 ; [*0351.0020.0002.0B70] # ORIYA ISSHAR
+0BF0 ; [*0DC9.0020.0002.0BF0] # TAMIL NUMBER TEN
+0BF1 ; [*0DCA.0020.0002.0BF1] # TAMIL NUMBER ONE HUNDRED
+0BF2 ; [*0DCB.0020.0002.0BF2] # TAMIL NUMBER ONE THOUSAND
+0BF3 ; [*0352.0020.0002.0BF3] # TAMIL DAY SIGN
+0BF4 ; [*0353.0020.0002.0BF4] # TAMIL MONTH SIGN
+0BF5 ; [*0354.0020.0002.0BF5] # TAMIL YEAR SIGN
+0BF6 ; [*0355.0020.0002.0BF6] # TAMIL DEBIT SIGN
+0BF7 ; [*0356.0020.0002.0BF7] # TAMIL CREDIT SIGN
+0BF8 ; [*0357.0020.0002.0BF8] # TAMIL AS ABOVE SIGN
+0BFA ; [*0358.0020.0002.0BFA] # TAMIL NUMBER SIGN
+0DF4 ; [*02FB.0020.0002.0DF4] # SINHALA PUNCTUATION KUNDDALIYA
+0E4E ; [.0000.0000.0000.0E4E] # THAI CHARACTER YAMAKKAN
+0E4F ; [*0359.0020.0002.0E4F] # THAI CHARACTER FONGMAN
+0E5A ; [*02FC.0020.0002.0E5A] # THAI CHARACTER ANGKHANKHU
+0E5B ; [*02FD.0020.0002.0E5B] # THAI CHARACTER KHOMUT
+0F01 ; [*035A.0020.0002.0F01] # TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02 ; [*035B.0020.0002.0F02] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03 ; [*035C.0020.0002.0F03] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04 ; [*02FE.0020.0002.0F04] # TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05 ; [*02FF.0020.0002.0F05] # TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06 ; [*0300.0020.0002.0F06] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07 ; [*0301.0020.0002.0F07] # TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08 ; [*0302.0020.0002.0F08] # TIBETAN MARK SBRUL SHAD
+0F09 ; [*0303.0020.0002.0F09] # TIBETAN MARK BSKUR YIG MGO
+0F0A ; [*0304.0020.0002.0F0A] # TIBETAN MARK BKA- SHOG YIG MGO
+0F0B ; [*0305.0020.0002.0F0B] # TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C ; [*0305.0020.001B.0F0C] # TIBETAN MARK DELIMITER TSHEG BSTAR; QQK
+0F0D ; [*0306.0020.0002.0F0D] # TIBETAN MARK SHAD
+0F0E ; [*0307.0020.0002.0F0E] # TIBETAN MARK NYIS SHAD
+0F0F ; [*0308.0020.0002.0F0F] # TIBETAN MARK TSHEG SHAD
+0F10 ; [*0309.0020.0002.0F10] # TIBETAN MARK NYIS TSHEG SHAD
+0F11 ; [*030A.0020.0002.0F11] # TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12 ; [*030B.0020.0002.0F12] # TIBETAN MARK RGYA GRAM SHAD
+0F13 ; [*035D.0020.0002.0F13] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14 ; [*024C.0020.0002.0F14] # TIBETAN MARK GTER TSHEG
+0F15 ; [*035E.0020.0002.0F15] # TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16 ; [*035F.0020.0002.0F16] # TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17 ; [*0360.0020.0002.0F17] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18 ; [.0000.0000.0000.0F18] # TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19 ; [.0000.0000.0000.0F19] # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A ; [*0361.0020.0002.0F1A] # TIBETAN SIGN RDEL DKAR GCIG
+0F1B ; [*0362.0020.0002.0F1B] # TIBETAN SIGN RDEL DKAR GNYIS
+0F1C ; [*0363.0020.0002.0F1C] # TIBETAN SIGN RDEL DKAR GSUM
+0F1D ; [*0364.0020.0002.0F1D] # TIBETAN SIGN RDEL NAG GCIG
+0F1E ; [*0365.0020.0002.0F1E] # TIBETAN SIGN RDEL NAG GNYIS
+0F1F ; [*0366.0020.0002.0F1F] # TIBETAN SIGN RDEL DKAR RDEL NAG
+0F34 ; [*0367.0020.0002.0F34] # TIBETAN MARK BSDUS RTAGS
+0F35 ; [.0000.0000.0000.0F35] # TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36 ; [*0368.0020.0002.0F36] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37 ; [.0000.0000.0000.0F37] # TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38 ; [*0369.0020.0002.0F38] # TIBETAN MARK CHE MGO
+0F3A ; [*028E.0020.0002.0F3A] # TIBETAN MARK GUG RTAGS GYON
+0F3B ; [*028F.0020.0002.0F3B] # TIBETAN MARK GUG RTAGS GYAS
+0F3C ; [*0290.0020.0002.0F3C] # TIBETAN MARK ANG KHANG GYON
+0F3D ; [*0291.0020.0002.0F3D] # TIBETAN MARK ANG KHANG GYAS
+0F3E ; [*036A.0020.0002.0F3E] # TIBETAN SIGN YAR TSHES
+0F3F ; [*036B.0020.0002.0F3F] # TIBETAN SIGN MAR TSHES
+0F82 ; [.0000.0000.0000.0F82] # TIBETAN SIGN NYI ZLA NAA DA
+0F83 ; [.0000.0000.0000.0F83] # TIBETAN SIGN SNA LDAN
+0F85 ; [*030C.0020.0002.0F85] # TIBETAN MARK PALUTA
+0F86 ; [.0000.0000.0000.0F86] # TIBETAN SIGN LCI RTAGS
+0F87 ; [.0000.0000.0000.0F87] # TIBETAN SIGN YANG RTAGS
+0FBE ; [*036C.0020.0002.0FBE] # TIBETAN KU RU KHA
+0FBF ; [*036D.0020.0002.0FBF] # TIBETAN KU RU KHA BZHI MIG CAN
+0FC0 ; [*036E.0020.0002.0FC0] # TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1 ; [*036F.0020.0002.0FC1] # TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2 ; [*0370.0020.0002.0FC2] # TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3 ; [*0371.0020.0002.0FC3] # TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4 ; [*0372.0020.0002.0FC4] # TIBETAN SYMBOL DRIL BU
+0FC5 ; [*0373.0020.0002.0FC5] # TIBETAN SYMBOL RDO RJE
+0FC6 ; [.0000.0000.0000.0FC6] # TIBETAN SYMBOL PADMA GDAN
+0FC7 ; [*0374.0020.0002.0FC7] # TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8 ; [*0375.0020.0002.0FC8] # TIBETAN SYMBOL PHUR PA
+0FC9 ; [*0376.0020.0002.0FC9] # TIBETAN SYMBOL NOR BU
+0FCA ; [*0377.0020.0002.0FCA] # TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB ; [*0378.0020.0002.0FCB] # TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC ; [*0379.0020.0002.0FCC] # TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCF ; [*037A.0020.0002.0FCF] # TIBETAN SIGN RDEL NAG GSUM
+104A ; [*026C.0020.0002.104A] # MYANMAR SIGN LITTLE SECTION
+104B ; [*026D.0020.0002.104B] # MYANMAR SIGN SECTION
+104C ; [*030E.0020.0002.104C] # MYANMAR SYMBOL LOCATIVE
+104D ; [*030F.0020.0002.104D] # MYANMAR SYMBOL COMPLETED
+104E ; [*0310.0020.0002.104E] # MYANMAR SYMBOL AFOREMENTIONED
+104F ; [*0311.0020.0002.104F] # MYANMAR SYMBOL GENITIVE
+10FB ; [*0271.0020.0002.10FB] # GEORGIAN PARAGRAPH SEPARATOR
+1361 ; [*0245.0020.0002.1361] # ETHIOPIC WORDSPACE
+1362 ; [*0262.0020.0002.1362] # ETHIOPIC FULL STOP
+1363 ; [*0246.0020.0002.1363] # ETHIOPIC COMMA
+1364 ; [*0247.0020.0002.1364] # ETHIOPIC SEMICOLON
+1365 ; [*0248.0020.0002.1365] # ETHIOPIC COLON
+1366 ; [*0249.0020.0002.1366] # ETHIOPIC PREFACE COLON
+1367 ; [*025A.0020.0002.1367] # ETHIOPIC QUESTION MARK
+1368 ; [*0272.0020.0002.1368] # ETHIOPIC PARAGRAPH SEPARATOR
+1372 ; [*0DCC.0020.0002.1372] # ETHIOPIC NUMBER TEN
+1373 ; [*0DCD.0020.0002.1373] # ETHIOPIC NUMBER TWENTY
+1374 ; [*0DCE.0020.0002.1374] # ETHIOPIC NUMBER THIRTY
+1375 ; [*0DCF.0020.0002.1375] # ETHIOPIC NUMBER FORTY
+1376 ; [*0DD0.0020.0002.1376] # ETHIOPIC NUMBER FIFTY
+1377 ; [*0DD1.0020.0002.1377] # ETHIOPIC NUMBER SIXTY
+1378 ; [*0DD2.0020.0002.1378] # ETHIOPIC NUMBER SEVENTY
+1379 ; [*0DD3.0020.0002.1379] # ETHIOPIC NUMBER EIGHTY
+137A ; [*0DD4.0020.0002.137A] # ETHIOPIC NUMBER NINETY
+137B ; [*0DD5.0020.0002.137B] # ETHIOPIC NUMBER HUNDRED
+137C ; [*0DD6.0020.0002.137C] # ETHIOPIC NUMBER TEN THOUSAND
+166D ; [*0316.0020.0002.166D] # CANADIAN SYLLABICS CHI SIGN
+166E ; [*0265.0020.0002.166E] # CANADIAN SYLLABICS FULL STOP
+1680 ; [*020A.0020.0002.1680] # OGHAM SPACE MARK
+169B ; [*0292.0020.0002.169B] # OGHAM FEATHER MARK
+169C ; [*0293.0020.0002.169C] # OGHAM REVERSED FEATHER MARK
+16EB ; [*024E.0020.0002.16EB] # RUNIC SINGLE PUNCTUATION
+16EC ; [*024F.0020.0002.16EC] # RUNIC MULTIPLE PUNCTUATION
+16ED ; [*0250.0020.0002.16ED] # RUNIC CROSS PUNCTUATION
+1735 ; [*026A.0020.0002.1735] # PHILIPPINE SINGLE PUNCTUATION
+1736 ; [*026B.0020.0002.1736] # PHILIPPINE DOUBLE PUNCTUATION
+17D4 ; [*026E.0020.0002.17D4] # KHMER SIGN KHAN
+17D5 ; [*026F.0020.0002.17D5] # KHMER SIGN BARIYOOSAN
+17D6 ; [*024D.0020.0002.17D6] # KHMER SIGN CAMNUC PII KUUH
+17D7 ; [*0312.0020.0002.17D7] # KHMER SIGN LEK TOO
+17D8 ; [*0313.0020.0002.17D8] # KHMER SIGN BEYYAL
+17D9 ; [*0314.0020.0002.17D9] # KHMER SIGN PHNAEK MUAN
+17DA ; [*0315.0020.0002.17DA] # KHMER SIGN KOOMUUT
+1800 ; [*02F8.0020.0002.1800] # MONGOLIAN BIRGA
+1801 ; [*025E.0020.0002.1801] # MONGOLIAN ELLIPSIS
+1802 ; [*0235.0020.0002.1802] # MONGOLIAN COMMA
+1803 ; [*0263.0020.0002.1803] # MONGOLIAN FULL STOP
+1804 ; [*024A.0020.0002.1804] # MONGOLIAN COLON
+1805 ; [*024B.0020.0002.1805] # MONGOLIAN FOUR DOTS
+1806 ; [*0223.0020.0002.1806] # MONGOLIAN TODO SOFT HYPHEN
+1807 ; [*0224.0020.0002.1807] # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808 ; [*0236.0020.0002.1808] # MONGOLIAN MANCHU COMMA
+1809 ; [*0264.0020.0002.1809] # MONGOLIAN MANCHU FULL STOP
+180A ; [*02F9.0020.0002.180A] # MONGOLIAN NIRUGU
+1940 ; [*030D.0020.0002.1940] # LIMBU SIGN LOO
+1944 ; [*0254.0020.0002.1944] # LIMBU EXCLAMATION MARK
+1945 ; [*025B.0020.0002.1945] # LIMBU QUESTION MARK
+19E0 ; [*037B.0020.0002.19E0] # KHMER SYMBOL PATHAMASAT
+19E1 ; [*037C.0020.0002.19E1] # KHMER SYMBOL MUOY KOET
+19E2 ; [*037D.0020.0002.19E2] # KHMER SYMBOL PII KOET
+19E3 ; [*037E.0020.0002.19E3] # KHMER SYMBOL BEI KOET
+19E4 ; [*037F.0020.0002.19E4] # KHMER SYMBOL BUON KOET
+19E5 ; [*0380.0020.0002.19E5] # KHMER SYMBOL PRAM KOET
+19E6 ; [*0381.0020.0002.19E6] # KHMER SYMBOL PRAM-MUOY KOET
+19E7 ; [*0382.0020.0002.19E7] # KHMER SYMBOL PRAM-PII KOET
+19E8 ; [*0383.0020.0002.19E8] # KHMER SYMBOL PRAM-BEI KOET
+19E9 ; [*0384.0020.0002.19E9] # KHMER SYMBOL PRAM-BUON KOET
+19EA ; [*0385.0020.0002.19EA] # KHMER SYMBOL DAP KOET
+19EB ; [*0386.0020.0002.19EB] # KHMER SYMBOL DAP-MUOY KOET
+19EC ; [*0387.0020.0002.19EC] # KHMER SYMBOL DAP-PII KOET
+19ED ; [*0388.0020.0002.19ED] # KHMER SYMBOL DAP-BEI KOET
+19EE ; [*0389.0020.0002.19EE] # KHMER SYMBOL DAP-BUON KOET
+19EF ; [*038A.0020.0002.19EF] # KHMER SYMBOL DAP-PRAM KOET
+19F0 ; [*038B.0020.0002.19F0] # KHMER SYMBOL TUTEYASAT
+19F1 ; [*038C.0020.0002.19F1] # KHMER SYMBOL MUOY ROC
+19F2 ; [*038D.0020.0002.19F2] # KHMER SYMBOL PII ROC
+19F3 ; [*038E.0020.0002.19F3] # KHMER SYMBOL BEI ROC
+19F4 ; [*038F.0020.0002.19F4] # KHMER SYMBOL BUON ROC
+19F5 ; [*0390.0020.0002.19F5] # KHMER SYMBOL PRAM ROC
+19F6 ; [*0391.0020.0002.19F6] # KHMER SYMBOL PRAM-MUOY ROC
+19F7 ; [*0392.0020.0002.19F7] # KHMER SYMBOL PRAM-PII ROC
+19F8 ; [*0393.0020.0002.19F8] # KHMER SYMBOL PRAM-BEI ROC
+19F9 ; [*0394.0020.0002.19F9] # KHMER SYMBOL PRAM-BUON ROC
+19FA ; [*0395.0020.0002.19FA] # KHMER SYMBOL DAP ROC
+19FB ; [*0396.0020.0002.19FB] # KHMER SYMBOL DAP-MUOY ROC
+19FC ; [*0397.0020.0002.19FC] # KHMER SYMBOL DAP-PII ROC
+19FD ; [*0398.0020.0002.19FD] # KHMER SYMBOL DAP-BEI ROC
+19FE ; [*0399.0020.0002.19FE] # KHMER SYMBOL DAP-BUON ROC
+19FF ; [*039A.0020.0002.19FF] # KHMER SYMBOL DAP-PRAM ROC
+1FBD ; [*0217.0020.0002.1FBD] # GREEK KORONIS; QQC
+1FBF ; [*0217.0020.0002.1FBF] # GREEK PSILI
+1FC0 ; [*021D.0020.0002.1FC0] # GREEK PERISPOMENI
+1FC1 ; [*0214.0020.0002.00A8][.0000.0045.0002.0342] # GREEK DIALYTIKA AND PERISPOMENI; QQCM
+1FCD ; [*0217.0020.0002.1FBF][.0000.0035.0002.0300] # GREEK PSILI AND VARIA; QQCM
+1FCE ; [*0217.0020.0002.1FBF][.0000.0032.0002.0301] # GREEK PSILI AND OXIA; QQCM
+1FCF ; [*0217.0020.0002.1FBF][.0000.0045.0002.0342] # GREEK PSILI AND PERISPOMENI; QQCM
+1FDD ; [*0218.0020.0002.1FFE][.0000.0035.0002.0300] # GREEK DASIA AND VARIA; QQCM
+1FDE ; [*0218.0020.0002.1FFE][.0000.0032.0002.0301] # GREEK DASIA AND OXIA; QQCM
+1FDF ; [*0218.0020.0002.1FFE][.0000.0045.0002.0342] # GREEK DASIA AND PERISPOMENI; QQCM
+1FED ; [*0214.0020.0002.00A8][.0000.0035.0002.0300] # GREEK DIALYTIKA AND VARIA; QQCM
+1FEE ; [*0214.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA AND OXIA; QQCM
+1FEF ; [*020C.0020.0002.1FEF] # GREEK VARIA; QQC
+1FFD ; [*020D.0020.0002.1FFD] # GREEK OXIA; QQC
+1FFE ; [*0218.0020.0002.1FFE] # GREEK DASIA
+2000 ; [*0209.0020.0004.2000] # EN QUAD; QQK
+2001 ; [*0209.0020.0004.2001] # EM QUAD; QQK
+2002 ; [*0209.0020.0004.2002] # EN SPACE; QQK
+2003 ; [*0209.0020.0004.2003] # EM SPACE; QQK
+2004 ; [*0209.0020.0004.2004] # THREE-PER-EM SPACE; QQK
+2005 ; [*0209.0020.0004.2005] # FOUR-PER-EM SPACE; QQK
+2006 ; [*0209.0020.0004.2006] # SIX-PER-EM SPACE; QQK
+2007 ; [*0209.0020.001B.2007] # FIGURE SPACE; QQK
+2008 ; [*0209.0020.0004.2008] # PUNCTUATION SPACE; QQK
+2009 ; [*0209.0020.0004.2009] # THIN SPACE; QQK
+200A ; [*0209.0020.0004.200A] # HAIR SPACE; QQK
+2010 ; [*0225.0020.0002.2010] # HYPHEN
+2011 ; [*0225.0020.001B.2011] # NON-BREAKING HYPHEN; QQK
+2012 ; [*0226.0020.0002.2012] # FIGURE DASH
+2013 ; [*0227.0020.0002.2013] # EN DASH
+2014 ; [*0228.0020.0002.2014] # EM DASH
+2015 ; [*0229.0020.0002.2015] # HORIZONTAL BAR
+2016 ; [*0432.0020.0002.2016] # DOUBLE VERTICAL LINE
+2017 ; [*021C.0020.0002.2017] # DOUBLE LOW LINE
+2018 ; [*0278.0020.0002.2018] # LEFT SINGLE QUOTATION MARK
+2019 ; [*0279.0020.0002.2019] # RIGHT SINGLE QUOTATION MARK
+201A ; [*027A.0020.0002.201A] # SINGLE LOW-9 QUOTATION MARK
+201B ; [*027B.0020.0002.201B] # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C ; [*027F.0020.0002.201C] # LEFT DOUBLE QUOTATION MARK
+201D ; [*0280.0020.0002.201D] # RIGHT DOUBLE QUOTATION MARK
+201E ; [*0281.0020.0002.201E] # DOUBLE LOW-9 QUOTATION MARK
+201F ; [*0282.0020.0002.201F] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020 ; [*02D8.0020.0002.2020] # DAGGER
+2021 ; [*02D9.0020.0002.2021] # DOUBLE DAGGER
+2022 ; [*02DA.0020.0002.2022] # BULLET
+2023 ; [*02DB.0020.0002.2023] # TRIANGULAR BULLET
+2024 ; [*025D.0020.0004.2024] # ONE DOT LEADER; QQK
+2025 ; [*025D.0020.0004.2025][*025D.0020.0004.2025] # TWO DOT LEADER; QQKN
+2026 ; [*025D.0020.0004.2026][*025D.0020.0004.2026][*025D.0020.001F.2026] # HORIZONTAL ELLIPSIS; QQKN
+2027 ; [*02DC.0020.0002.2027] # HYPHENATION POINT
+2028 ; [*0207.0020.0002.2028] # LINE SEPARATOR
+2029 ; [*0208.0020.0002.2029] # PARAGRAPH SEPARATOR
+202F ; [*0209.0020.001B.202F] # NARROW NO-BREAK SPACE; QQK
+2030 ; [*02D5.0020.0002.2030] # PER MILLE SIGN
+2031 ; [*02D6.0020.0002.2031] # PER TEN THOUSAND SIGN
+2032 ; [*02E0.0020.0002.2032] # PRIME
+2033 ; [*02E0.0020.0004.2033][*02E0.0020.0004.2033] # DOUBLE PRIME; QQKN
+2034 ; [*02E0.0020.0004.2034][*02E0.0020.0004.2034][*02E0.0020.001F.2034] # TRIPLE PRIME; QQKN
+2035 ; [*02E1.0020.0002.2035] # REVERSED PRIME
+2036 ; [*02E1.0020.0004.2036][*02E1.0020.0004.2036] # REVERSED DOUBLE PRIME; QQKN
+2037 ; [*02E1.0020.0004.2037][*02E1.0020.0004.2037][*02E1.0020.001F.2037] # REVERSED TRIPLE PRIME; QQKN
+2038 ; [*02E4.0020.0002.2038] # CARET
+2039 ; [*027C.0020.0002.2039] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; [*027D.0020.0002.203A] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B ; [*02E5.0020.0002.203B] # REFERENCE MARK
+203C ; [*0251.0020.0004.203C][*0251.0020.0004.203C] # DOUBLE EXCLAMATION MARK; QQKN
+203D ; [*025C.0020.0002.203D] # INTERROBANG
+203E ; [*0211.0020.0002.203E] # OVERLINE
+203F ; [*02E6.0020.0002.203F] # UNDERTIE
+2040 ; [*02E8.0020.0002.2040] # CHARACTER TIE
+2041 ; [*02EA.0020.0002.2041] # CARET INSERTION POINT
+2042 ; [*02EB.0020.0002.2042] # ASTERISM
+2043 ; [*02DD.0020.0002.2043] # HYPHEN BULLET
+2044 ; [*02CD.0020.0002.2044] # FRACTION SLASH
+2045 ; [*0294.0020.0002.2045] # LEFT SQUARE BRACKET WITH QUILL
+2046 ; [*0295.0020.0002.2046] # RIGHT SQUARE BRACKET WITH QUILL
+2047 ; [*0255.0020.0004.2047][*0255.0020.0004.2047] # DOUBLE QUESTION MARK; QQKN
+2048 ; [*0255.0020.0004.2048][*0251.0020.0004.2048] # QUESTION EXCLAMATION MARK; QQKN
+2049 ; [*0251.0020.0004.2049][*0255.0020.0004.2049] # EXCLAMATION QUESTION MARK; QQKN
+204A ; [*02D1.0020.0002.204A] # TIRONIAN SIGN ET
+204B ; [*02C4.0020.0002.204B] # REVERSED PILCROW SIGN
+204C ; [*02DE.0020.0002.204C] # BLACK LEFTWARDS BULLET
+204D ; [*02DF.0020.0002.204D] # BLACK RIGHTWARDS BULLET
+204E ; [*02C9.0020.0002.204E] # LOW ASTERISK
+204F ; [*023C.0020.0002.204F] # REVERSED SEMICOLON
+2050 ; [*02E9.0020.0002.2050] # CLOSE UP
+2051 ; [*02CA.0020.0002.2051] # TWO ASTERISKS ALIGNED VERTICALLY
+2052 ; [*02D7.0020.0002.2052] # COMMERCIAL MINUS SIGN
+2053 ; [*022A.0020.0002.2053] # SWUNG DASH
+2054 ; [*02E7.0020.0002.2054] # INVERTED UNDERTIE
+2057 ; [*02E0.0020.0004.2057][*02E0.0020.0004.2057][*02E0.0020.001F.2057][*02E0.0020.001F.2057] # QUADRUPLE PRIME; QQKN
+205F ; [*0209.0020.0004.205F] # MEDIUM MATHEMATICAL SPACE; QQK
+207A ; [*0428.0020.0014.207A] # SUPERSCRIPT PLUS SIGN; QQK
+207B ; [*0434.0020.0014.207B] # SUPERSCRIPT MINUS; QQK
+207C ; [*042D.0020.0014.207C] # SUPERSCRIPT EQUALS SIGN; QQK
+207D ; [*0288.0020.0014.207D] # SUPERSCRIPT LEFT PARENTHESIS; QQK
+207E ; [*0289.0020.0014.207E] # SUPERSCRIPT RIGHT PARENTHESIS; QQK
+208A ; [*0428.0020.0015.208A] # SUBSCRIPT PLUS SIGN; QQK
+208B ; [*0434.0020.0015.208B] # SUBSCRIPT MINUS; QQK
+208C ; [*042D.0020.0015.208C] # SUBSCRIPT EQUALS SIGN; QQK
+208D ; [*0288.0020.0015.208D] # SUBSCRIPT LEFT PARENTHESIS; QQK
+208E ; [*0289.0020.0015.208E] # SUBSCRIPT RIGHT PARENTHESIS; QQK
+2104 ; [*039B.0020.0002.2104] # CENTRE LINE SYMBOL
+2108 ; [*039C.0020.0002.2108] # SCRUPLE
+2114 ; [*039D.0020.0002.2114] # L B BAR SYMBOL
+2117 ; [*039E.0020.0002.2117] # SOUND RECORDING COPYRIGHT
+2118 ; [*039F.0020.0002.2118] # SCRIPT CAPITAL P
+211E ; [*03A0.0020.0002.211E] # PRESCRIPTION TAKE
+211F ; [*03A1.0020.0002.211F] # RESPONSE
+2123 ; [*03A2.0020.0002.2123] # VERSICLE
+2125 ; [*03A3.0020.0002.2125] # OUNCE SIGN
+2127 ; [*03A4.0020.0002.2127] # INVERTED OHM SIGN
+2129 ; [*03A5.0020.0002.2129] # TURNED GREEK SMALL LETTER IOTA
+212E ; [*03A6.0020.0002.212E] # ESTIMATED SYMBOL
+2132 ; [*03A7.0020.0002.2132] # TURNED CAPITAL F
+213A ; [*03A8.0020.0002.213A] # ROTATED CAPITAL Q
+2140 ; [*0427.0020.0005.2140] # DOUBLE-STRUCK N-ARY SUMMATION; QQK
+2141 ; [*03A9.0020.0002.2141] # TURNED SANS-SERIF CAPITAL G
+2142 ; [*03AA.0020.0002.2142] # TURNED SANS-SERIF CAPITAL L
+2143 ; [*03AB.0020.0002.2143] # REVERSED SANS-SERIF CAPITAL L
+2144 ; [*03AC.0020.0002.2144] # TURNED SANS-SERIF CAPITAL Y
+214A ; [*03AD.0020.0002.214A] # PROPERTY LINE
+214B ; [*02D0.0020.0002.214B] # TURNED AMPERSAND
+2180 ; [*0DD7.0020.0002.2180] # ROMAN NUMERAL ONE THOUSAND C D
+2181 ; [*0DD8.0020.0002.2181] # ROMAN NUMERAL FIVE THOUSAND
+2182 ; [*0DD9.0020.0002.2182] # ROMAN NUMERAL TEN THOUSAND
+2183 ; [*0DDA.0020.0002.2183] # ROMAN NUMERAL REVERSED ONE HUNDRED
+2190 ; [*03AE.0020.0002.2190] # LEFTWARDS ARROW
+2191 ; [*03B0.0020.0002.2191] # UPWARDS ARROW
+2192 ; [*03AF.0020.0002.2192] # RIGHTWARDS ARROW
+2193 ; [*03B1.0020.0002.2193] # DOWNWARDS ARROW
+2194 ; [*03B2.0020.0002.2194] # LEFT RIGHT ARROW
+2195 ; [*03B3.0020.0002.2195] # UP DOWN ARROW
+2196 ; [*03B4.0020.0002.2196] # NORTH WEST ARROW
+2197 ; [*03B5.0020.0002.2197] # NORTH EAST ARROW
+2198 ; [*03B6.0020.0002.2198] # SOUTH EAST ARROW
+2199 ; [*03B7.0020.0002.2199] # SOUTH WEST ARROW
+219A ; [*03AE.0020.0002.2190][.0000.0054.0002.0338] # LEFTWARDS ARROW WITH STROKE; QQCM
+219B ; [*03AF.0020.0002.2192][.0000.0054.0002.0338] # RIGHTWARDS ARROW WITH STROKE; QQCM
+219C ; [*03B8.0020.0002.219C] # LEFTWARDS WAVE ARROW
+219D ; [*03B9.0020.0002.219D] # RIGHTWARDS WAVE ARROW
+219E ; [*03BA.0020.0002.219E] # LEFTWARDS TWO HEADED ARROW
+219F ; [*03BB.0020.0002.219F] # UPWARDS TWO HEADED ARROW
+21A0 ; [*03BC.0020.0002.21A0] # RIGHTWARDS TWO HEADED ARROW
+21A1 ; [*03BD.0020.0002.21A1] # DOWNWARDS TWO HEADED ARROW
+21A2 ; [*03BE.0020.0002.21A2] # LEFTWARDS ARROW WITH TAIL
+21A3 ; [*03BF.0020.0002.21A3] # RIGHTWARDS ARROW WITH TAIL
+21A4 ; [*03C0.0020.0002.21A4] # LEFTWARDS ARROW FROM BAR
+21A5 ; [*03C1.0020.0002.21A5] # UPWARDS ARROW FROM BAR
+21A6 ; [*03C2.0020.0002.21A6] # RIGHTWARDS ARROW FROM BAR
+21A7 ; [*03C3.0020.0002.21A7] # DOWNWARDS ARROW FROM BAR
+21A8 ; [*03C4.0020.0002.21A8] # UP DOWN ARROW WITH BASE
+21A9 ; [*03C5.0020.0002.21A9] # LEFTWARDS ARROW WITH HOOK
+21AA ; [*03C6.0020.0002.21AA] # RIGHTWARDS ARROW WITH HOOK
+21AB ; [*03C7.0020.0002.21AB] # LEFTWARDS ARROW WITH LOOP
+21AC ; [*03C8.0020.0002.21AC] # RIGHTWARDS ARROW WITH LOOP
+21AD ; [*03C9.0020.0002.21AD] # LEFT RIGHT WAVE ARROW
+21AE ; [*03B2.0020.0002.2194][.0000.0054.0002.0338] # LEFT RIGHT ARROW WITH STROKE; QQCM
+21AF ; [*03CA.0020.0002.21AF] # DOWNWARDS ZIGZAG ARROW
+21B0 ; [*03CB.0020.0002.21B0] # UPWARDS ARROW WITH TIP LEFTWARDS
+21B1 ; [*03CC.0020.0002.21B1] # UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2 ; [*03CD.0020.0002.21B2] # DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3 ; [*03CE.0020.0002.21B3] # DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4 ; [*03CF.0020.0002.21B4] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5 ; [*03D0.0020.0002.21B5] # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6 ; [*03D1.0020.0002.21B6] # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7 ; [*03D2.0020.0002.21B7] # CLOCKWISE TOP SEMICIRCLE ARROW
+21B8 ; [*03D3.0020.0002.21B8] # NORTH WEST ARROW TO LONG BAR
+21B9 ; [*03D4.0020.0002.21B9] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA ; [*03D5.0020.0002.21BA] # ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB ; [*03D6.0020.0002.21BB] # CLOCKWISE OPEN CIRCLE ARROW
+21BC ; [*03D7.0020.0002.21BC] # LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD ; [*03D8.0020.0002.21BD] # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE ; [*03D9.0020.0002.21BE] # UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF ; [*03DA.0020.0002.21BF] # UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0 ; [*03DB.0020.0002.21C0] # RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1 ; [*03DC.0020.0002.21C1] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2 ; [*03DD.0020.0002.21C2] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3 ; [*03DE.0020.0002.21C3] # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4 ; [*03DF.0020.0002.21C4] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5 ; [*03E0.0020.0002.21C5] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6 ; [*03E1.0020.0002.21C6] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7 ; [*03E2.0020.0002.21C7] # LEFTWARDS PAIRED ARROWS
+21C8 ; [*03E3.0020.0002.21C8] # UPWARDS PAIRED ARROWS
+21C9 ; [*03E4.0020.0002.21C9] # RIGHTWARDS PAIRED ARROWS
+21CA ; [*03E5.0020.0002.21CA] # DOWNWARDS PAIRED ARROWS
+21CB ; [*03E6.0020.0002.21CB] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC ; [*03E7.0020.0002.21CC] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD ; [*03E8.0020.0002.21D0][.0000.0054.0002.0338] # LEFTWARDS DOUBLE ARROW WITH STROKE; QQCM
+21CE ; [*03EC.0020.0002.21D4][.0000.0054.0002.0338] # LEFT RIGHT DOUBLE ARROW WITH STROKE; QQCM
+21CF ; [*03EA.0020.0002.21D2][.0000.0054.0002.0338] # RIGHTWARDS DOUBLE ARROW WITH STROKE; QQCM
+21D0 ; [*03E8.0020.0002.21D0] # LEFTWARDS DOUBLE ARROW
+21D1 ; [*03E9.0020.0002.21D1] # UPWARDS DOUBLE ARROW
+21D2 ; [*03EA.0020.0002.21D2] # RIGHTWARDS DOUBLE ARROW
+21D3 ; [*03EB.0020.0002.21D3] # DOWNWARDS DOUBLE ARROW
+21D4 ; [*03EC.0020.0002.21D4] # LEFT RIGHT DOUBLE ARROW
+21D5 ; [*03ED.0020.0002.21D5] # UP DOWN DOUBLE ARROW
+21D6 ; [*03EE.0020.0002.21D6] # NORTH WEST DOUBLE ARROW
+21D7 ; [*03EF.0020.0002.21D7] # NORTH EAST DOUBLE ARROW
+21D8 ; [*03F0.0020.0002.21D8] # SOUTH EAST DOUBLE ARROW
+21D9 ; [*03F1.0020.0002.21D9] # SOUTH WEST DOUBLE ARROW
+21DA ; [*03F2.0020.0002.21DA] # LEFTWARDS TRIPLE ARROW
+21DB ; [*03F3.0020.0002.21DB] # RIGHTWARDS TRIPLE ARROW
+21DC ; [*03F4.0020.0002.21DC] # LEFTWARDS SQUIGGLE ARROW
+21DD ; [*03F5.0020.0002.21DD] # RIGHTWARDS SQUIGGLE ARROW
+21DE ; [*03F6.0020.0002.21DE] # UPWARDS ARROW WITH DOUBLE STROKE
+21DF ; [*03F7.0020.0002.21DF] # DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0 ; [*03F8.0020.0002.21E0] # LEFTWARDS DASHED ARROW
+21E1 ; [*03F9.0020.0002.21E1] # UPWARDS DASHED ARROW
+21E2 ; [*03FA.0020.0002.21E2] # RIGHTWARDS DASHED ARROW
+21E3 ; [*03FB.0020.0002.21E3] # DOWNWARDS DASHED ARROW
+21E4 ; [*03FC.0020.0002.21E4] # LEFTWARDS ARROW TO BAR
+21E5 ; [*03FD.0020.0002.21E5] # RIGHTWARDS ARROW TO BAR
+21E6 ; [*03FE.0020.0002.21E6] # LEFTWARDS WHITE ARROW
+21E7 ; [*03FF.0020.0002.21E7] # UPWARDS WHITE ARROW
+21E8 ; [*0400.0020.0002.21E8] # RIGHTWARDS WHITE ARROW
+21E9 ; [*0401.0020.0002.21E9] # DOWNWARDS WHITE ARROW
+21EA ; [*0402.0020.0002.21EA] # UPWARDS WHITE ARROW FROM BAR
+21EB ; [*0403.0020.0002.21EB] # UPWARDS WHITE ARROW ON PEDESTAL
+21EC ; [*0404.0020.0002.21EC] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED ; [*0405.0020.0002.21ED] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE ; [*0406.0020.0002.21EE] # UPWARDS WHITE DOUBLE ARROW
+21EF ; [*0407.0020.0002.21EF] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0 ; [*0408.0020.0002.21F0] # RIGHTWARDS WHITE ARROW FROM WALL
+21F1 ; [*0409.0020.0002.21F1] # NORTH WEST ARROW TO CORNER
+21F2 ; [*040A.0020.0002.21F2] # SOUTH EAST ARROW TO CORNER
+21F3 ; [*040B.0020.0002.21F3] # UP DOWN WHITE ARROW
+21F4 ; [*040C.0020.0002.21F4] # RIGHT ARROW WITH SMALL CIRCLE
+21F5 ; [*040D.0020.0002.21F5] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6 ; [*040E.0020.0002.21F6] # THREE RIGHTWARDS ARROWS
+21F7 ; [*040F.0020.0002.21F7] # LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8 ; [*0410.0020.0002.21F8] # RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9 ; [*0411.0020.0002.21F9] # LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA ; [*0412.0020.0002.21FA] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB ; [*0413.0020.0002.21FB] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC ; [*0414.0020.0002.21FC] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD ; [*0415.0020.0002.21FD] # LEFTWARDS OPEN-HEADED ARROW
+21FE ; [*0416.0020.0002.21FE] # RIGHTWARDS OPEN-HEADED ARROW
+21FF ; [*0417.0020.0002.21FF] # LEFT RIGHT OPEN-HEADED ARROW
+2200 ; [*0418.0020.0002.2200] # FOR ALL
+2201 ; [*0419.0020.0002.2201] # COMPLEMENT
+2202 ; [*041A.0020.0002.2202] # PARTIAL DIFFERENTIAL
+2203 ; [*041B.0020.0002.2203] # THERE EXISTS
+2204 ; [*041B.0020.0002.2203][.0000.0054.0002.0338] # THERE DOES NOT EXIST; QQCM
+2205 ; [*041C.0020.0002.2205] # EMPTY SET
+2206 ; [*041D.0020.0002.2206] # INCREMENT
+2207 ; [*041E.0020.0002.2207] # NABLA
+2208 ; [*041F.0020.0002.2208] # ELEMENT OF
+2209 ; [*041F.0020.0002.2208][.0000.0054.0002.0338] # NOT AN ELEMENT OF; QQCM
+220A ; [*0420.0020.0002.220A] # SMALL ELEMENT OF
+220B ; [*0421.0020.0002.220B] # CONTAINS AS MEMBER
+220C ; [*0421.0020.0002.220B][.0000.0054.0002.0338] # DOES NOT CONTAIN AS MEMBER; QQCM
+220D ; [*0422.0020.0002.220D] # SMALL CONTAINS AS MEMBER
+220E ; [*0424.0020.0002.220E] # END OF PROOF
+220F ; [*0425.0020.0002.220F] # N-ARY PRODUCT
+2210 ; [*0426.0020.0002.2210] # N-ARY COPRODUCT
+2211 ; [*0427.0020.0002.2211] # N-ARY SUMMATION
+2212 ; [*0434.0020.0002.2212] # MINUS SIGN
+2213 ; [*0435.0020.0002.2213] # MINUS-OR-PLUS SIGN
+2214 ; [*0436.0020.0002.2214] # DOT PLUS
+2215 ; [*0437.0020.0002.2215] # DIVISION SLASH
+2216 ; [*0438.0020.0002.2216] # SET MINUS
+2217 ; [*0439.0020.0002.2217] # ASTERISK OPERATOR
+2218 ; [*043A.0020.0002.2218] # RING OPERATOR
+2219 ; [*043B.0020.0002.2219] # BULLET OPERATOR
+221A ; [*043C.0020.0002.221A] # SQUARE ROOT
+221B ; [*043D.0020.0002.221B] # CUBE ROOT
+221C ; [*043E.0020.0002.221C] # FOURTH ROOT
+221D ; [*043F.0020.0002.221D] # PROPORTIONAL TO
+221E ; [*0440.0020.0002.221E] # INFINITY
+221F ; [*0441.0020.0002.221F] # RIGHT ANGLE
+2220 ; [*0442.0020.0002.2220] # ANGLE
+2221 ; [*0443.0020.0002.2221] # MEASURED ANGLE
+2222 ; [*0444.0020.0002.2222] # SPHERICAL ANGLE
+2223 ; [*0445.0020.0002.2223] # DIVIDES
+2224 ; [*0445.0020.0002.2223][.0000.0054.0002.0338] # DOES NOT DIVIDE; QQCM
+2225 ; [*0446.0020.0002.2225] # PARALLEL TO
+2226 ; [*0446.0020.0002.2225][.0000.0054.0002.0338] # NOT PARALLEL TO; QQCM
+2227 ; [*0447.0020.0002.2227] # LOGICAL AND
+2228 ; [*0448.0020.0002.2228] # LOGICAL OR
+2229 ; [*0449.0020.0002.2229] # INTERSECTION
+222A ; [*044A.0020.0002.222A] # UNION
+222B ; [*044B.0020.0002.222B] # INTEGRAL
+222C ; [*044B.0020.0004.222C][*044B.0020.0004.222C] # DOUBLE INTEGRAL; QQKN
+222D ; [*044B.0020.0004.222D][*044B.0020.0004.222D][*044B.0020.001F.222D] # TRIPLE INTEGRAL; QQKN
+222E ; [*044C.0020.0002.222E] # CONTOUR INTEGRAL
+222F ; [*044C.0020.0004.222F][*044C.0020.0004.222F] # SURFACE INTEGRAL; QQKN
+2230 ; [*044C.0020.0004.2230][*044C.0020.0004.2230][*044C.0020.001F.2230] # VOLUME INTEGRAL; QQKN
+2231 ; [*044D.0020.0002.2231] # CLOCKWISE INTEGRAL
+2232 ; [*044E.0020.0002.2232] # CLOCKWISE CONTOUR INTEGRAL
+2233 ; [*044F.0020.0002.2233] # ANTICLOCKWISE CONTOUR INTEGRAL
+2234 ; [*0450.0020.0002.2234] # THEREFORE
+2235 ; [*0451.0020.0002.2235] # BECAUSE
+2236 ; [*0452.0020.0002.2236] # RATIO
+2237 ; [*0453.0020.0002.2237] # PROPORTION
+2238 ; [*0454.0020.0002.2238] # DOT MINUS
+2239 ; [*0455.0020.0002.2239] # EXCESS
+223A ; [*0456.0020.0002.223A] # GEOMETRIC PROPORTION
+223B ; [*0457.0020.0002.223B] # HOMOTHETIC
+223C ; [*0458.0020.0002.223C] # TILDE OPERATOR
+223D ; [*0459.0020.0002.223D] # REVERSED TILDE
+223E ; [*045A.0020.0002.223E] # INVERTED LAZY S
+223F ; [*045B.0020.0002.223F] # SINE WAVE
+2240 ; [*045C.0020.0002.2240] # WREATH PRODUCT
+2241 ; [*0458.0020.0002.223C][.0000.0054.0002.0338] # NOT TILDE; QQCM
+2242 ; [*045D.0020.0002.2242] # MINUS TILDE
+2243 ; [*045E.0020.0002.2243] # ASYMPTOTICALLY EQUAL TO
+2244 ; [*045E.0020.0002.2243][.0000.0054.0002.0338] # NOT ASYMPTOTICALLY EQUAL TO; QQCM
+2245 ; [*045F.0020.0002.2245] # APPROXIMATELY EQUAL TO
+2246 ; [*0460.0020.0002.2246] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247 ; [*045F.0020.0002.2245][.0000.0054.0002.0338] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO; QQCM
+2248 ; [*0461.0020.0002.2248] # ALMOST EQUAL TO
+2249 ; [*0461.0020.0002.2248][.0000.0054.0002.0338] # NOT ALMOST EQUAL TO; QQCM
+224A ; [*0462.0020.0002.224A] # ALMOST EQUAL OR EQUAL TO
+224B ; [*0463.0020.0002.224B] # TRIPLE TILDE
+224C ; [*0464.0020.0002.224C] # ALL EQUAL TO
+224D ; [*0465.0020.0002.224D] # EQUIVALENT TO
+224E ; [*0466.0020.0002.224E] # GEOMETRICALLY EQUIVALENT TO
+224F ; [*0467.0020.0002.224F] # DIFFERENCE BETWEEN
+2250 ; [*0468.0020.0002.2250] # APPROACHES THE LIMIT
+2251 ; [*0469.0020.0002.2251] # GEOMETRICALLY EQUAL TO
+2252 ; [*046A.0020.0002.2252] # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253 ; [*046B.0020.0002.2253] # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254 ; [*046C.0020.0002.2254] # COLON EQUALS
+2255 ; [*046D.0020.0002.2255] # EQUALS COLON
+2256 ; [*046E.0020.0002.2256] # RING IN EQUAL TO
+2257 ; [*046F.0020.0002.2257] # RING EQUAL TO
+2258 ; [*0470.0020.0002.2258] # CORRESPONDS TO
+2259 ; [*0471.0020.0002.2259] # ESTIMATES
+225A ; [*0472.0020.0002.225A] # EQUIANGULAR TO
+225B ; [*0473.0020.0002.225B] # STAR EQUALS
+225C ; [*0474.0020.0002.225C] # DELTA EQUAL TO
+225D ; [*0475.0020.0002.225D] # EQUAL TO BY DEFINITION
+225E ; [*0476.0020.0002.225E] # MEASURED BY
+225F ; [*0477.0020.0002.225F] # QUESTIONED EQUAL TO
+2260 ; [*042D.0020.0002.003D][.0000.0054.0002.0338] # NOT EQUAL TO; QQCM
+2261 ; [*0478.0020.0002.2261] # IDENTICAL TO
+2262 ; [*0478.0020.0002.2261][.0000.0054.0002.0338] # NOT IDENTICAL TO; QQCM
+2263 ; [*0479.0020.0002.2263] # STRICTLY EQUIVALENT TO
+2264 ; [*047A.0020.0002.2264] # LESS-THAN OR EQUAL TO
+2265 ; [*047B.0020.0002.2265] # GREATER-THAN OR EQUAL TO
+2266 ; [*047C.0020.0002.2266] # LESS-THAN OVER EQUAL TO
+2267 ; [*047D.0020.0002.2267] # GREATER-THAN OVER EQUAL TO
+2268 ; [*047E.0020.0002.2268] # LESS-THAN BUT NOT EQUAL TO
+2269 ; [*047F.0020.0002.2269] # GREATER-THAN BUT NOT EQUAL TO
+226A ; [*0480.0020.0002.226A] # MUCH LESS-THAN
+226B ; [*0481.0020.0002.226B] # MUCH GREATER-THAN
+226C ; [*0482.0020.0002.226C] # BETWEEN
+226D ; [*0465.0020.0002.224D][.0000.0054.0002.0338] # NOT EQUIVALENT TO; QQCM
+226E ; [*042C.0020.0002.003C][.0000.0054.0002.0338] # NOT LESS-THAN; QQCM
+226F ; [*042E.0020.0002.003E][.0000.0054.0002.0338] # NOT GREATER-THAN; QQCM
+2270 ; [*047A.0020.0002.2264][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUAL TO; QQCM
+2271 ; [*047B.0020.0002.2265][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUAL TO; QQCM
+2272 ; [*0483.0020.0002.2272] # LESS-THAN OR EQUIVALENT TO
+2273 ; [*0484.0020.0002.2273] # GREATER-THAN OR EQUIVALENT TO
+2274 ; [*0483.0020.0002.2272][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUIVALENT TO; QQCM
+2275 ; [*0484.0020.0002.2273][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUIVALENT TO; QQCM
+2276 ; [*0485.0020.0002.2276] # LESS-THAN OR GREATER-THAN
+2277 ; [*0486.0020.0002.2277] # GREATER-THAN OR LESS-THAN
+2278 ; [*0485.0020.0002.2276][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR GREATER-THAN; QQCM
+2279 ; [*0486.0020.0002.2277][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR LESS-THAN; QQCM
+227A ; [*0487.0020.0002.227A] # PRECEDES
+227B ; [*0488.0020.0002.227B] # SUCCEEDS
+227C ; [*0489.0020.0002.227C] # PRECEDES OR EQUAL TO
+227D ; [*048A.0020.0002.227D] # SUCCEEDS OR EQUAL TO
+227E ; [*048B.0020.0002.227E] # PRECEDES OR EQUIVALENT TO
+227F ; [*048C.0020.0002.227F] # SUCCEEDS OR EQUIVALENT TO
+2280 ; [*0487.0020.0002.227A][.0000.0054.0002.0338] # DOES NOT PRECEDE; QQCM
+2281 ; [*0488.0020.0002.227B][.0000.0054.0002.0338] # DOES NOT SUCCEED; QQCM
+2282 ; [*048D.0020.0002.2282] # SUBSET OF
+2283 ; [*048E.0020.0002.2283] # SUPERSET OF
+2284 ; [*048D.0020.0002.2282][.0000.0054.0002.0338] # NOT A SUBSET OF; QQCM
+2285 ; [*048E.0020.0002.2283][.0000.0054.0002.0338] # NOT A SUPERSET OF; QQCM
+2286 ; [*048F.0020.0002.2286] # SUBSET OF OR EQUAL TO
+2287 ; [*0490.0020.0002.2287] # SUPERSET OF OR EQUAL TO
+2288 ; [*048F.0020.0002.2286][.0000.0054.0002.0338] # NEITHER A SUBSET OF NOR EQUAL TO; QQCM
+2289 ; [*0490.0020.0002.2287][.0000.0054.0002.0338] # NEITHER A SUPERSET OF NOR EQUAL TO; QQCM
+228A ; [*0491.0020.0002.228A] # SUBSET OF WITH NOT EQUAL TO
+228B ; [*0492.0020.0002.228B] # SUPERSET OF WITH NOT EQUAL TO
+228C ; [*0493.0020.0002.228C] # MULTISET
+228D ; [*0494.0020.0002.228D] # MULTISET MULTIPLICATION
+228E ; [*0495.0020.0002.228E] # MULTISET UNION
+228F ; [*0496.0020.0002.228F] # SQUARE IMAGE OF
+2290 ; [*0497.0020.0002.2290] # SQUARE ORIGINAL OF
+2291 ; [*0498.0020.0002.2291] # SQUARE IMAGE OF OR EQUAL TO
+2292 ; [*0499.0020.0002.2292] # SQUARE ORIGINAL OF OR EQUAL TO
+2293 ; [*049A.0020.0002.2293] # SQUARE CAP
+2294 ; [*049B.0020.0002.2294] # SQUARE CUP
+2295 ; [*049C.0020.0002.2295] # CIRCLED PLUS
+2296 ; [*049D.0020.0002.2296] # CIRCLED MINUS
+2297 ; [*049E.0020.0002.2297] # CIRCLED TIMES
+2298 ; [*049F.0020.0002.2298] # CIRCLED DIVISION SLASH
+2299 ; [*04A0.0020.0002.2299] # CIRCLED DOT OPERATOR
+229A ; [*04A1.0020.0002.229A] # CIRCLED RING OPERATOR
+229B ; [*04A2.0020.0002.229B] # CIRCLED ASTERISK OPERATOR
+229C ; [*04A3.0020.0002.229C] # CIRCLED EQUALS
+229D ; [*04A4.0020.0002.229D] # CIRCLED DASH
+229E ; [*04A5.0020.0002.229E] # SQUARED PLUS
+229F ; [*04A6.0020.0002.229F] # SQUARED MINUS
+22A0 ; [*04A7.0020.0002.22A0] # SQUARED TIMES
+22A1 ; [*04A8.0020.0002.22A1] # SQUARED DOT OPERATOR
+22A2 ; [*04A9.0020.0002.22A2] # RIGHT TACK
+22A3 ; [*04AA.0020.0002.22A3] # LEFT TACK
+22A4 ; [*04AB.0020.0002.22A4] # DOWN TACK
+22A5 ; [*04AC.0020.0002.22A5] # UP TACK
+22A6 ; [*04AD.0020.0002.22A6] # ASSERTION
+22A7 ; [*04AE.0020.0002.22A7] # MODELS
+22A8 ; [*04AF.0020.0002.22A8] # TRUE
+22A9 ; [*04B0.0020.0002.22A9] # FORCES
+22AA ; [*04B1.0020.0002.22AA] # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB ; [*04B2.0020.0002.22AB] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC ; [*04A9.0020.0002.22A2][.0000.0054.0002.0338] # DOES NOT PROVE; QQCM
+22AD ; [*04AF.0020.0002.22A8][.0000.0054.0002.0338] # NOT TRUE; QQCM
+22AE ; [*04B0.0020.0002.22A9][.0000.0054.0002.0338] # DOES NOT FORCE; QQCM
+22AF ; [*04B2.0020.0002.22AB][.0000.0054.0002.0338] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE; QQCM
+22B0 ; [*04B3.0020.0002.22B0] # PRECEDES UNDER RELATION
+22B1 ; [*04B4.0020.0002.22B1] # SUCCEEDS UNDER RELATION
+22B2 ; [*04B5.0020.0002.22B2] # NORMAL SUBGROUP OF
+22B3 ; [*04B6.0020.0002.22B3] # CONTAINS AS NORMAL SUBGROUP
+22B4 ; [*04B7.0020.0002.22B4] # NORMAL SUBGROUP OF OR EQUAL TO
+22B5 ; [*04B8.0020.0002.22B5] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6 ; [*04B9.0020.0002.22B6] # ORIGINAL OF
+22B7 ; [*04BA.0020.0002.22B7] # IMAGE OF
+22B8 ; [*04BB.0020.0002.22B8] # MULTIMAP
+22B9 ; [*04BC.0020.0002.22B9] # HERMITIAN CONJUGATE MATRIX
+22BA ; [*04BD.0020.0002.22BA] # INTERCALATE
+22BB ; [*04BE.0020.0002.22BB] # XOR
+22BC ; [*04BF.0020.0002.22BC] # NAND
+22BD ; [*04C0.0020.0002.22BD] # NOR
+22BE ; [*04C1.0020.0002.22BE] # RIGHT ANGLE WITH ARC
+22BF ; [*04C2.0020.0002.22BF] # RIGHT TRIANGLE
+22C0 ; [*04C3.0020.0002.22C0] # N-ARY LOGICAL AND
+22C1 ; [*04C4.0020.0002.22C1] # N-ARY LOGICAL OR
+22C2 ; [*04C5.0020.0002.22C2] # N-ARY INTERSECTION
+22C3 ; [*04C6.0020.0002.22C3] # N-ARY UNION
+22C4 ; [*04C7.0020.0002.22C4] # DIAMOND OPERATOR
+22C5 ; [*04C8.0020.0002.22C5] # DOT OPERATOR
+22C6 ; [*04C9.0020.0002.22C6] # STAR OPERATOR
+22C7 ; [*04CA.0020.0002.22C7] # DIVISION TIMES
+22C8 ; [*04CB.0020.0002.22C8] # BOWTIE
+22C9 ; [*04CC.0020.0002.22C9] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA ; [*04CD.0020.0002.22CA] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB ; [*04CE.0020.0002.22CB] # LEFT SEMIDIRECT PRODUCT
+22CC ; [*04CF.0020.0002.22CC] # RIGHT SEMIDIRECT PRODUCT
+22CD ; [*04D0.0020.0002.22CD] # REVERSED TILDE EQUALS
+22CE ; [*04D1.0020.0002.22CE] # CURLY LOGICAL OR
+22CF ; [*04D2.0020.0002.22CF] # CURLY LOGICAL AND
+22D0 ; [*04D3.0020.0002.22D0] # DOUBLE SUBSET
+22D1 ; [*04D4.0020.0002.22D1] # DOUBLE SUPERSET
+22D2 ; [*04D5.0020.0002.22D2] # DOUBLE INTERSECTION
+22D3 ; [*04D6.0020.0002.22D3] # DOUBLE UNION
+22D4 ; [*04D7.0020.0002.22D4] # PITCHFORK
+22D5 ; [*04D8.0020.0002.22D5] # EQUAL AND PARALLEL TO
+22D6 ; [*04D9.0020.0002.22D6] # LESS-THAN WITH DOT
+22D7 ; [*04DA.0020.0002.22D7] # GREATER-THAN WITH DOT
+22D8 ; [*04DB.0020.0002.22D8] # VERY MUCH LESS-THAN
+22D9 ; [*04DC.0020.0002.22D9] # VERY MUCH GREATER-THAN
+22DA ; [*04DD.0020.0002.22DA] # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB ; [*04DE.0020.0002.22DB] # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC ; [*04DF.0020.0002.22DC] # EQUAL TO OR LESS-THAN
+22DD ; [*04E0.0020.0002.22DD] # EQUAL TO OR GREATER-THAN
+22DE ; [*04E1.0020.0002.22DE] # EQUAL TO OR PRECEDES
+22DF ; [*04E2.0020.0002.22DF] # EQUAL TO OR SUCCEEDS
+22E0 ; [*0489.0020.0002.227C][.0000.0054.0002.0338] # DOES NOT PRECEDE OR EQUAL; QQCM
+22E1 ; [*048A.0020.0002.227D][.0000.0054.0002.0338] # DOES NOT SUCCEED OR EQUAL; QQCM
+22E2 ; [*0498.0020.0002.2291][.0000.0054.0002.0338] # NOT SQUARE IMAGE OF OR EQUAL TO; QQCM
+22E3 ; [*0499.0020.0002.2292][.0000.0054.0002.0338] # NOT SQUARE ORIGINAL OF OR EQUAL TO; QQCM
+22E4 ; [*04E3.0020.0002.22E4] # SQUARE IMAGE OF OR NOT EQUAL TO
+22E5 ; [*04E4.0020.0002.22E5] # SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6 ; [*04E5.0020.0002.22E6] # LESS-THAN BUT NOT EQUIVALENT TO
+22E7 ; [*04E6.0020.0002.22E7] # GREATER-THAN BUT NOT EQUIVALENT TO
+22E8 ; [*04E7.0020.0002.22E8] # PRECEDES BUT NOT EQUIVALENT TO
+22E9 ; [*04E8.0020.0002.22E9] # SUCCEEDS BUT NOT EQUIVALENT TO
+22EA ; [*04B5.0020.0002.22B2][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF; QQCM
+22EB ; [*04B6.0020.0002.22B3][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP; QQCM
+22EC ; [*04B7.0020.0002.22B4][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF OR EQUAL TO; QQCM
+22ED ; [*04B8.0020.0002.22B5][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL; QQCM
+22EE ; [*04E9.0020.0002.22EE] # VERTICAL ELLIPSIS
+22EF ; [*04EA.0020.0002.22EF] # MIDLINE HORIZONTAL ELLIPSIS
+22F0 ; [*04EB.0020.0002.22F0] # UP RIGHT DIAGONAL ELLIPSIS
+22F1 ; [*04EC.0020.0002.22F1] # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2 ; [*04ED.0020.0002.22F2] # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3 ; [*04EE.0020.0002.22F3] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4 ; [*04EF.0020.0002.22F4] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5 ; [*04F0.0020.0002.22F5] # ELEMENT OF WITH DOT ABOVE
+22F6 ; [*04F1.0020.0002.22F6] # ELEMENT OF WITH OVERBAR
+22F7 ; [*04F2.0020.0002.22F7] # SMALL ELEMENT OF WITH OVERBAR
+22F8 ; [*04F3.0020.0002.22F8] # ELEMENT OF WITH UNDERBAR
+22F9 ; [*04F4.0020.0002.22F9] # ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA ; [*04F5.0020.0002.22FA] # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB ; [*04F6.0020.0002.22FB] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC ; [*04F7.0020.0002.22FC] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD ; [*04F8.0020.0002.22FD] # CONTAINS WITH OVERBAR
+22FE ; [*04F9.0020.0002.22FE] # SMALL CONTAINS WITH OVERBAR
+22FF ; [*04FA.0020.0002.22FF] # Z NOTATION BAG MEMBERSHIP
+2300 ; [*04FB.0020.0002.2300] # DIAMETER SIGN
+2301 ; [*04FC.0020.0002.2301] # ELECTRIC ARROW
+2302 ; [*04FD.0020.0002.2302] # HOUSE
+2303 ; [*04FE.0020.0002.2303] # UP ARROWHEAD
+2304 ; [*04FF.0020.0002.2304] # DOWN ARROWHEAD
+2305 ; [*0500.0020.0002.2305] # PROJECTIVE
+2306 ; [*0501.0020.0002.2306] # PERSPECTIVE
+2307 ; [*0502.0020.0002.2307] # WAVY LINE
+2308 ; [*0503.0020.0002.2308] # LEFT CEILING
+2309 ; [*0504.0020.0002.2309] # RIGHT CEILING
+230A ; [*0505.0020.0002.230A] # LEFT FLOOR
+230B ; [*0506.0020.0002.230B] # RIGHT FLOOR
+230C ; [*0507.0020.0002.230C] # BOTTOM RIGHT CROP
+230D ; [*0508.0020.0002.230D] # BOTTOM LEFT CROP
+230E ; [*0509.0020.0002.230E] # TOP RIGHT CROP
+230F ; [*050A.0020.0002.230F] # TOP LEFT CROP
+2310 ; [*050B.0020.0002.2310] # REVERSED NOT SIGN
+2311 ; [*050C.0020.0002.2311] # SQUARE LOZENGE
+2312 ; [*050D.0020.0002.2312] # ARC
+2313 ; [*050E.0020.0002.2313] # SEGMENT
+2314 ; [*050F.0020.0002.2314] # SECTOR
+2315 ; [*0510.0020.0002.2315] # TELEPHONE RECORDER
+2316 ; [*0511.0020.0002.2316] # POSITION INDICATOR
+2317 ; [*0512.0020.0002.2317] # VIEWDATA SQUARE
+2318 ; [*0513.0020.0002.2318] # PLACE OF INTEREST SIGN
+2319 ; [*0514.0020.0002.2319] # TURNED NOT SIGN
+231A ; [*0515.0020.0002.231A] # WATCH
+231B ; [*0516.0020.0002.231B] # HOURGLASS
+231C ; [*0517.0020.0002.231C] # TOP LEFT CORNER
+231D ; [*0518.0020.0002.231D] # TOP RIGHT CORNER
+231E ; [*0519.0020.0002.231E] # BOTTOM LEFT CORNER
+231F ; [*051A.0020.0002.231F] # BOTTOM RIGHT CORNER
+2320 ; [*051B.0020.0002.2320] # TOP HALF INTEGRAL
+2321 ; [*051C.0020.0002.2321] # BOTTOM HALF INTEGRAL
+2322 ; [*051D.0020.0002.2322] # FROWN
+2323 ; [*051E.0020.0002.2323] # SMILE
+2324 ; [*051F.0020.0002.2324] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325 ; [*0520.0020.0002.2325] # OPTION KEY
+2326 ; [*0521.0020.0002.2326] # ERASE TO THE RIGHT
+2327 ; [*0522.0020.0002.2327] # X IN A RECTANGLE BOX
+2328 ; [*0523.0020.0002.2328] # KEYBOARD
+2329 ; [*02AE.0020.0002.2329] # LEFT-POINTING ANGLE BRACKET; QQC
+232A ; [*02AF.0020.0002.232A] # RIGHT-POINTING ANGLE BRACKET; QQC
+232B ; [*0524.0020.0002.232B] # ERASE TO THE LEFT
+232C ; [*0525.0020.0002.232C] # BENZENE RING
+232D ; [*0526.0020.0002.232D] # CYLINDRICITY
+232E ; [*0527.0020.0002.232E] # ALL AROUND-PROFILE
+232F ; [*0528.0020.0002.232F] # SYMMETRY
+2330 ; [*0529.0020.0002.2330] # TOTAL RUNOUT
+2331 ; [*052A.0020.0002.2331] # DIMENSION ORIGIN
+2332 ; [*052B.0020.0002.2332] # CONICAL TAPER
+2333 ; [*052C.0020.0002.2333] # SLOPE
+2334 ; [*052D.0020.0002.2334] # COUNTERBORE
+2335 ; [*052E.0020.0002.2335] # COUNTERSINK
+2336 ; [*052F.0020.0002.2336] # APL FUNCTIONAL SYMBOL I-BEAM
+2337 ; [*0530.0020.0002.2337] # APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338 ; [*0531.0020.0002.2338] # APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339 ; [*0532.0020.0002.2339] # APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A ; [*0533.0020.0002.233A] # APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B ; [*0534.0020.0002.233B] # APL FUNCTIONAL SYMBOL QUAD JOT
+233C ; [*0535.0020.0002.233C] # APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D ; [*0536.0020.0002.233D] # APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E ; [*0537.0020.0002.233E] # APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F ; [*0538.0020.0002.233F] # APL FUNCTIONAL SYMBOL SLASH BAR
+2340 ; [*0539.0020.0002.2340] # APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341 ; [*053A.0020.0002.2341] # APL FUNCTIONAL SYMBOL QUAD SLASH
+2342 ; [*053B.0020.0002.2342] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343 ; [*053C.0020.0002.2343] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344 ; [*053D.0020.0002.2344] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345 ; [*053E.0020.0002.2345] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346 ; [*053F.0020.0002.2346] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347 ; [*0540.0020.0002.2347] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348 ; [*0541.0020.0002.2348] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349 ; [*0542.0020.0002.2349] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A ; [*0543.0020.0002.234A] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B ; [*0544.0020.0002.234B] # APL FUNCTIONAL SYMBOL DELTA STILE
+234C ; [*0545.0020.0002.234C] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D ; [*0546.0020.0002.234D] # APL FUNCTIONAL SYMBOL QUAD DELTA
+234E ; [*0547.0020.0002.234E] # APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F ; [*0548.0020.0002.234F] # APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350 ; [*0549.0020.0002.2350] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351 ; [*054A.0020.0002.2351] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352 ; [*054B.0020.0002.2352] # APL FUNCTIONAL SYMBOL DEL STILE
+2353 ; [*054C.0020.0002.2353] # APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354 ; [*054D.0020.0002.2354] # APL FUNCTIONAL SYMBOL QUAD DEL
+2355 ; [*054E.0020.0002.2355] # APL FUNCTIONAL SYMBOL UP TACK JOT
+2356 ; [*054F.0020.0002.2356] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357 ; [*0550.0020.0002.2357] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358 ; [*0551.0020.0002.2358] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359 ; [*0552.0020.0002.2359] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A ; [*0553.0020.0002.235A] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B ; [*0554.0020.0002.235B] # APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C ; [*0555.0020.0002.235C] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D ; [*0556.0020.0002.235D] # APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E ; [*0557.0020.0002.235E] # APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F ; [*0558.0020.0002.235F] # APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360 ; [*0559.0020.0002.2360] # APL FUNCTIONAL SYMBOL QUAD COLON
+2361 ; [*055A.0020.0002.2361] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362 ; [*055B.0020.0002.2362] # APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363 ; [*055C.0020.0002.2363] # APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364 ; [*055D.0020.0002.2364] # APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365 ; [*055E.0020.0002.2365] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366 ; [*055F.0020.0002.2366] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367 ; [*0560.0020.0002.2367] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368 ; [*0561.0020.0002.2368] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369 ; [*0562.0020.0002.2369] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A ; [*0563.0020.0002.236A] # APL FUNCTIONAL SYMBOL COMMA BAR
+236B ; [*0564.0020.0002.236B] # APL FUNCTIONAL SYMBOL DEL TILDE
+236C ; [*0565.0020.0002.236C] # APL FUNCTIONAL SYMBOL ZILDE
+236D ; [*0566.0020.0002.236D] # APL FUNCTIONAL SYMBOL STILE TILDE
+236E ; [*0567.0020.0002.236E] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F ; [*0568.0020.0002.236F] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370 ; [*0569.0020.0002.2370] # APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371 ; [*056A.0020.0002.2371] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372 ; [*056B.0020.0002.2372] # APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373 ; [*056C.0020.0002.2373] # APL FUNCTIONAL SYMBOL IOTA
+2374 ; [*056D.0020.0002.2374] # APL FUNCTIONAL SYMBOL RHO
+2375 ; [*056E.0020.0002.2375] # APL FUNCTIONAL SYMBOL OMEGA
+2376 ; [*056F.0020.0002.2376] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377 ; [*0570.0020.0002.2377] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378 ; [*0571.0020.0002.2378] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379 ; [*0572.0020.0002.2379] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A ; [*0573.0020.0002.237A] # APL FUNCTIONAL SYMBOL ALPHA
+237B ; [*0574.0020.0002.237B] # NOT CHECK MARK
+237C ; [*0575.0020.0002.237C] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D ; [*0576.0020.0002.237D] # SHOULDERED OPEN BOX
+237E ; [*0577.0020.0002.237E] # BELL SYMBOL
+237F ; [*0578.0020.0002.237F] # VERTICAL LINE WITH MIDDLE DOT
+2380 ; [*0579.0020.0002.2380] # INSERTION SYMBOL
+2381 ; [*057A.0020.0002.2381] # CONTINUOUS UNDERLINE SYMBOL
+2382 ; [*057B.0020.0002.2382] # DISCONTINUOUS UNDERLINE SYMBOL
+2383 ; [*057C.0020.0002.2383] # EMPHASIS SYMBOL
+2384 ; [*057D.0020.0002.2384] # COMPOSITION SYMBOL
+2385 ; [*057E.0020.0002.2385] # WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386 ; [*057F.0020.0002.2386] # ENTER SYMBOL
+2387 ; [*0580.0020.0002.2387] # ALTERNATIVE KEY SYMBOL
+2388 ; [*0581.0020.0002.2388] # HELM SYMBOL
+2389 ; [*0582.0020.0002.2389] # CIRCLED HORIZONTAL BAR WITH NOTCH
+238A ; [*0583.0020.0002.238A] # CIRCLED TRIANGLE DOWN
+238B ; [*0584.0020.0002.238B] # BROKEN CIRCLE WITH NORTHWEST ARROW
+238C ; [*0585.0020.0002.238C] # UNDO SYMBOL
+238D ; [*0586.0020.0002.238D] # MONOSTABLE SYMBOL
+238E ; [*0587.0020.0002.238E] # HYSTERESIS SYMBOL
+238F ; [*0588.0020.0002.238F] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390 ; [*0589.0020.0002.2390] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391 ; [*058A.0020.0002.2391] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392 ; [*058B.0020.0002.2392] # PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393 ; [*058C.0020.0002.2393] # DIRECT CURRENT SYMBOL FORM TWO
+2394 ; [*058D.0020.0002.2394] # SOFTWARE-FUNCTION SYMBOL
+2395 ; [*058E.0020.0002.2395] # APL FUNCTIONAL SYMBOL QUAD
+2396 ; [*058F.0020.0002.2396] # DECIMAL SEPARATOR KEY SYMBOL
+2397 ; [*0590.0020.0002.2397] # PREVIOUS PAGE
+2398 ; [*0591.0020.0002.2398] # NEXT PAGE
+2399 ; [*0592.0020.0002.2399] # PRINT SCREEN SYMBOL
+239A ; [*0593.0020.0002.239A] # CLEAR SCREEN SYMBOL
+239B ; [*0594.0020.0002.239B] # LEFT PARENTHESIS UPPER HOOK
+239C ; [*0595.0020.0002.239C] # LEFT PARENTHESIS EXTENSION
+239D ; [*0596.0020.0002.239D] # LEFT PARENTHESIS LOWER HOOK
+239E ; [*0597.0020.0002.239E] # RIGHT PARENTHESIS UPPER HOOK
+239F ; [*0598.0020.0002.239F] # RIGHT PARENTHESIS EXTENSION
+23A0 ; [*0599.0020.0002.23A0] # RIGHT PARENTHESIS LOWER HOOK
+23A1 ; [*059A.0020.0002.23A1] # LEFT SQUARE BRACKET UPPER CORNER
+23A2 ; [*059B.0020.0002.23A2] # LEFT SQUARE BRACKET EXTENSION
+23A3 ; [*059C.0020.0002.23A3] # LEFT SQUARE BRACKET LOWER CORNER
+23A4 ; [*059D.0020.0002.23A4] # RIGHT SQUARE BRACKET UPPER CORNER
+23A5 ; [*059E.0020.0002.23A5] # RIGHT SQUARE BRACKET EXTENSION
+23A6 ; [*059F.0020.0002.23A6] # RIGHT SQUARE BRACKET LOWER CORNER
+23A7 ; [*05A0.0020.0002.23A7] # LEFT CURLY BRACKET UPPER HOOK
+23A8 ; [*05A1.0020.0002.23A8] # LEFT CURLY BRACKET MIDDLE PIECE
+23A9 ; [*05A2.0020.0002.23A9] # LEFT CURLY BRACKET LOWER HOOK
+23AA ; [*05A3.0020.0002.23AA] # CURLY BRACKET EXTENSION
+23AB ; [*05A4.0020.0002.23AB] # RIGHT CURLY BRACKET UPPER HOOK
+23AC ; [*05A5.0020.0002.23AC] # RIGHT CURLY BRACKET MIDDLE PIECE
+23AD ; [*05A6.0020.0002.23AD] # RIGHT CURLY BRACKET LOWER HOOK
+23AE ; [*05A7.0020.0002.23AE] # INTEGRAL EXTENSION
+23AF ; [*05A8.0020.0002.23AF] # HORIZONTAL LINE EXTENSION
+23B0 ; [*05A9.0020.0002.23B0] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1 ; [*05AA.0020.0002.23B1] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2 ; [*05AB.0020.0002.23B2] # SUMMATION TOP
+23B3 ; [*05AC.0020.0002.23B3] # SUMMATION BOTTOM
+23B4 ; [*05AD.0020.0002.23B4] # TOP SQUARE BRACKET
+23B5 ; [*05AE.0020.0002.23B5] # BOTTOM SQUARE BRACKET
+23B6 ; [*05AF.0020.0002.23B6] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7 ; [*05B0.0020.0002.23B7] # RADICAL SYMBOL BOTTOM
+23B8 ; [*05B1.0020.0002.23B8] # LEFT VERTICAL BOX LINE
+23B9 ; [*05B2.0020.0002.23B9] # RIGHT VERTICAL BOX LINE
+23BA ; [*05B3.0020.0002.23BA] # HORIZONTAL SCAN LINE-1
+23BB ; [*05B4.0020.0002.23BB] # HORIZONTAL SCAN LINE-3
+23BC ; [*05B5.0020.0002.23BC] # HORIZONTAL SCAN LINE-7
+23BD ; [*05B6.0020.0002.23BD] # HORIZONTAL SCAN LINE-9
+23BE ; [*05B7.0020.0002.23BE] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF ; [*05B8.0020.0002.23BF] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0 ; [*05B9.0020.0002.23C0] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1 ; [*05BA.0020.0002.23C1] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2 ; [*05BB.0020.0002.23C2] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3 ; [*05BC.0020.0002.23C3] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4 ; [*05BD.0020.0002.23C4] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5 ; [*05BE.0020.0002.23C5] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6 ; [*05BF.0020.0002.23C6] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7 ; [*05C0.0020.0002.23C7] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8 ; [*05C1.0020.0002.23C8] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9 ; [*05C2.0020.0002.23C9] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA ; [*05C3.0020.0002.23CA] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB ; [*05C4.0020.0002.23CB] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC ; [*05C5.0020.0002.23CC] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD ; [*05C6.0020.0002.23CD] # SQUARE FOOT
+23CE ; [*05C7.0020.0002.23CE] # RETURN SYMBOL
+23CF ; [*05C8.0020.0002.23CF] # EJECT SYMBOL
+23D0 ; [*05C9.0020.0002.23D0] # VERTICAL LINE EXTENSION
+2400 ; [*05CA.0020.0002.2400] # SYMBOL FOR NULL
+2401 ; [*05CB.0020.0002.2401] # SYMBOL FOR START OF HEADING
+2402 ; [*05CC.0020.0002.2402] # SYMBOL FOR START OF TEXT
+2403 ; [*05CD.0020.0002.2403] # SYMBOL FOR END OF TEXT
+2404 ; [*05CE.0020.0002.2404] # SYMBOL FOR END OF TRANSMISSION
+2405 ; [*05CF.0020.0002.2405] # SYMBOL FOR ENQUIRY
+2406 ; [*05D0.0020.0002.2406] # SYMBOL FOR ACKNOWLEDGE
+2407 ; [*05D1.0020.0002.2407] # SYMBOL FOR BELL
+2408 ; [*05D2.0020.0002.2408] # SYMBOL FOR BACKSPACE
+2409 ; [*05D3.0020.0002.2409] # SYMBOL FOR HORIZONTAL TABULATION
+240A ; [*05D4.0020.0002.240A] # SYMBOL FOR LINE FEED
+240B ; [*05D5.0020.0002.240B] # SYMBOL FOR VERTICAL TABULATION
+240C ; [*05D6.0020.0002.240C] # SYMBOL FOR FORM FEED
+240D ; [*05D7.0020.0002.240D] # SYMBOL FOR CARRIAGE RETURN
+240E ; [*05D8.0020.0002.240E] # SYMBOL FOR SHIFT OUT
+240F ; [*05D9.0020.0002.240F] # SYMBOL FOR SHIFT IN
+2410 ; [*05DA.0020.0002.2410] # SYMBOL FOR DATA LINK ESCAPE
+2411 ; [*05DB.0020.0002.2411] # SYMBOL FOR DEVICE CONTROL ONE
+2412 ; [*05DC.0020.0002.2412] # SYMBOL FOR DEVICE CONTROL TWO
+2413 ; [*05DD.0020.0002.2413] # SYMBOL FOR DEVICE CONTROL THREE
+2414 ; [*05DE.0020.0002.2414] # SYMBOL FOR DEVICE CONTROL FOUR
+2415 ; [*05DF.0020.0002.2415] # SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416 ; [*05E0.0020.0002.2416] # SYMBOL FOR SYNCHRONOUS IDLE
+2417 ; [*05E1.0020.0002.2417] # SYMBOL FOR END OF TRANSMISSION BLOCK
+2418 ; [*05E2.0020.0002.2418] # SYMBOL FOR CANCEL
+2419 ; [*05E3.0020.0002.2419] # SYMBOL FOR END OF MEDIUM
+241A ; [*05E4.0020.0002.241A] # SYMBOL FOR SUBSTITUTE
+241B ; [*05E5.0020.0002.241B] # SYMBOL FOR ESCAPE
+241C ; [*05E6.0020.0002.241C] # SYMBOL FOR FILE SEPARATOR
+241D ; [*05E7.0020.0002.241D] # SYMBOL FOR GROUP SEPARATOR
+241E ; [*05E8.0020.0002.241E] # SYMBOL FOR RECORD SEPARATOR
+241F ; [*05E9.0020.0002.241F] # SYMBOL FOR UNIT SEPARATOR
+2420 ; [*05EA.0020.0002.2420] # SYMBOL FOR SPACE
+2421 ; [*05EB.0020.0002.2421] # SYMBOL FOR DELETE
+2422 ; [*05EC.0020.0002.2422] # BLANK SYMBOL
+2423 ; [*05ED.0020.0002.2423] # OPEN BOX
+2424 ; [*05EE.0020.0002.2424] # SYMBOL FOR NEWLINE
+2425 ; [*05EF.0020.0002.2425] # SYMBOL FOR DELETE FORM TWO
+2426 ; [*05F0.0020.0002.2426] # SYMBOL FOR SUBSTITUTE FORM TWO
+2440 ; [*05F1.0020.0002.2440] # OCR HOOK
+2441 ; [*05F2.0020.0002.2441] # OCR CHAIR
+2442 ; [*05F3.0020.0002.2442] # OCR FORK
+2443 ; [*05F4.0020.0002.2443] # OCR INVERTED FORK
+2444 ; [*05F5.0020.0002.2444] # OCR BELT BUCKLE
+2445 ; [*05F6.0020.0002.2445] # OCR BOW TIE
+2446 ; [*05F7.0020.0002.2446] # OCR BRANCH BANK IDENTIFICATION
+2447 ; [*05F8.0020.0002.2447] # OCR AMOUNT OF CHECK
+2448 ; [*05F9.0020.0002.2448] # OCR DASH
+2449 ; [*05FA.0020.0002.2449] # OCR CUSTOMER ACCOUNT NUMBER
+244A ; [*05FB.0020.0002.244A] # OCR DOUBLE BACKSLASH
+2500 ; [*05FC.0020.0002.2500] # BOX DRAWINGS LIGHT HORIZONTAL
+2501 ; [*05FD.0020.0002.2501] # BOX DRAWINGS HEAVY HORIZONTAL
+2502 ; [*05FE.0020.0002.2502] # BOX DRAWINGS LIGHT VERTICAL
+2503 ; [*05FF.0020.0002.2503] # BOX DRAWINGS HEAVY VERTICAL
+2504 ; [*0600.0020.0002.2504] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505 ; [*0601.0020.0002.2505] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506 ; [*0602.0020.0002.2506] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507 ; [*0603.0020.0002.2507] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508 ; [*0604.0020.0002.2508] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509 ; [*0605.0020.0002.2509] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A ; [*0606.0020.0002.250A] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B ; [*0607.0020.0002.250B] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C ; [*0608.0020.0002.250C] # BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D ; [*0609.0020.0002.250D] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E ; [*060A.0020.0002.250E] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F ; [*060B.0020.0002.250F] # BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510 ; [*060C.0020.0002.2510] # BOX DRAWINGS LIGHT DOWN AND LEFT
+2511 ; [*060D.0020.0002.2511] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512 ; [*060E.0020.0002.2512] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513 ; [*060F.0020.0002.2513] # BOX DRAWINGS HEAVY DOWN AND LEFT
+2514 ; [*0610.0020.0002.2514] # BOX DRAWINGS LIGHT UP AND RIGHT
+2515 ; [*0611.0020.0002.2515] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516 ; [*0612.0020.0002.2516] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517 ; [*0613.0020.0002.2517] # BOX DRAWINGS HEAVY UP AND RIGHT
+2518 ; [*0614.0020.0002.2518] # BOX DRAWINGS LIGHT UP AND LEFT
+2519 ; [*0615.0020.0002.2519] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A ; [*0616.0020.0002.251A] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B ; [*0617.0020.0002.251B] # BOX DRAWINGS HEAVY UP AND LEFT
+251C ; [*0618.0020.0002.251C] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D ; [*0619.0020.0002.251D] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E ; [*061A.0020.0002.251E] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F ; [*061B.0020.0002.251F] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520 ; [*061C.0020.0002.2520] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521 ; [*061D.0020.0002.2521] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522 ; [*061E.0020.0002.2522] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523 ; [*061F.0020.0002.2523] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524 ; [*0620.0020.0002.2524] # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525 ; [*0621.0020.0002.2525] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526 ; [*0622.0020.0002.2526] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527 ; [*0623.0020.0002.2527] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528 ; [*0624.0020.0002.2528] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529 ; [*0625.0020.0002.2529] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A ; [*0626.0020.0002.252A] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B ; [*0627.0020.0002.252B] # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C ; [*0628.0020.0002.252C] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D ; [*0629.0020.0002.252D] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E ; [*062A.0020.0002.252E] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F ; [*062B.0020.0002.252F] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530 ; [*062C.0020.0002.2530] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531 ; [*062D.0020.0002.2531] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532 ; [*062E.0020.0002.2532] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533 ; [*062F.0020.0002.2533] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534 ; [*0630.0020.0002.2534] # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535 ; [*0631.0020.0002.2535] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536 ; [*0632.0020.0002.2536] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537 ; [*0633.0020.0002.2537] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538 ; [*0634.0020.0002.2538] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539 ; [*0635.0020.0002.2539] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A ; [*0636.0020.0002.253A] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B ; [*0637.0020.0002.253B] # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C ; [*0638.0020.0002.253C] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D ; [*0639.0020.0002.253D] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E ; [*063A.0020.0002.253E] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F ; [*063B.0020.0002.253F] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540 ; [*063C.0020.0002.2540] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541 ; [*063D.0020.0002.2541] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542 ; [*063E.0020.0002.2542] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543 ; [*063F.0020.0002.2543] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544 ; [*0640.0020.0002.2544] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545 ; [*0641.0020.0002.2545] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546 ; [*0642.0020.0002.2546] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547 ; [*0643.0020.0002.2547] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548 ; [*0644.0020.0002.2548] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549 ; [*0645.0020.0002.2549] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A ; [*0646.0020.0002.254A] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B ; [*0647.0020.0002.254B] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C ; [*0648.0020.0002.254C] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D ; [*0649.0020.0002.254D] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E ; [*064A.0020.0002.254E] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F ; [*064B.0020.0002.254F] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550 ; [*064C.0020.0002.2550] # BOX DRAWINGS DOUBLE HORIZONTAL
+2551 ; [*064D.0020.0002.2551] # BOX DRAWINGS DOUBLE VERTICAL
+2552 ; [*064E.0020.0002.2552] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553 ; [*064F.0020.0002.2553] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554 ; [*0650.0020.0002.2554] # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555 ; [*0651.0020.0002.2555] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556 ; [*0652.0020.0002.2556] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557 ; [*0653.0020.0002.2557] # BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558 ; [*0654.0020.0002.2558] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559 ; [*0655.0020.0002.2559] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A ; [*0656.0020.0002.255A] # BOX DRAWINGS DOUBLE UP AND RIGHT
+255B ; [*0657.0020.0002.255B] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C ; [*0658.0020.0002.255C] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D ; [*0659.0020.0002.255D] # BOX DRAWINGS DOUBLE UP AND LEFT
+255E ; [*065A.0020.0002.255E] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F ; [*065B.0020.0002.255F] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560 ; [*065C.0020.0002.2560] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561 ; [*065D.0020.0002.2561] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562 ; [*065E.0020.0002.2562] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563 ; [*065F.0020.0002.2563] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564 ; [*0660.0020.0002.2564] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565 ; [*0661.0020.0002.2565] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566 ; [*0662.0020.0002.2566] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567 ; [*0663.0020.0002.2567] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568 ; [*0664.0020.0002.2568] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569 ; [*0665.0020.0002.2569] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A ; [*0666.0020.0002.256A] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B ; [*0667.0020.0002.256B] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C ; [*0668.0020.0002.256C] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D ; [*0669.0020.0002.256D] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E ; [*066A.0020.0002.256E] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F ; [*066B.0020.0002.256F] # BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570 ; [*066C.0020.0002.2570] # BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571 ; [*066D.0020.0002.2571] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572 ; [*066E.0020.0002.2572] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573 ; [*066F.0020.0002.2573] # BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574 ; [*0670.0020.0002.2574] # BOX DRAWINGS LIGHT LEFT
+2575 ; [*0671.0020.0002.2575] # BOX DRAWINGS LIGHT UP
+2576 ; [*0672.0020.0002.2576] # BOX DRAWINGS LIGHT RIGHT
+2577 ; [*0673.0020.0002.2577] # BOX DRAWINGS LIGHT DOWN
+2578 ; [*0674.0020.0002.2578] # BOX DRAWINGS HEAVY LEFT
+2579 ; [*0675.0020.0002.2579] # BOX DRAWINGS HEAVY UP
+257A ; [*0676.0020.0002.257A] # BOX DRAWINGS HEAVY RIGHT
+257B ; [*0677.0020.0002.257B] # BOX DRAWINGS HEAVY DOWN
+257C ; [*0678.0020.0002.257C] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D ; [*0679.0020.0002.257D] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E ; [*067A.0020.0002.257E] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F ; [*067B.0020.0002.257F] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580 ; [*067C.0020.0002.2580] # UPPER HALF BLOCK
+2581 ; [*067D.0020.0002.2581] # LOWER ONE EIGHTH BLOCK
+2582 ; [*067E.0020.0002.2582] # LOWER ONE QUARTER BLOCK
+2583 ; [*067F.0020.0002.2583] # LOWER THREE EIGHTHS BLOCK
+2584 ; [*0680.0020.0002.2584] # LOWER HALF BLOCK
+2585 ; [*0681.0020.0002.2585] # LOWER FIVE EIGHTHS BLOCK
+2586 ; [*0682.0020.0002.2586] # LOWER THREE QUARTERS BLOCK
+2587 ; [*0683.0020.0002.2587] # LOWER SEVEN EIGHTHS BLOCK
+2588 ; [*0684.0020.0002.2588] # FULL BLOCK
+2589 ; [*0685.0020.0002.2589] # LEFT SEVEN EIGHTHS BLOCK
+258A ; [*0686.0020.0002.258A] # LEFT THREE QUARTERS BLOCK
+258B ; [*0687.0020.0002.258B] # LEFT FIVE EIGHTHS BLOCK
+258C ; [*0688.0020.0002.258C] # LEFT HALF BLOCK
+258D ; [*0689.0020.0002.258D] # LEFT THREE EIGHTHS BLOCK
+258E ; [*068A.0020.0002.258E] # LEFT ONE QUARTER BLOCK
+258F ; [*068B.0020.0002.258F] # LEFT ONE EIGHTH BLOCK
+2590 ; [*068C.0020.0002.2590] # RIGHT HALF BLOCK
+2591 ; [*068D.0020.0002.2591] # LIGHT SHADE
+2592 ; [*068E.0020.0002.2592] # MEDIUM SHADE
+2593 ; [*068F.0020.0002.2593] # DARK SHADE
+2594 ; [*0690.0020.0002.2594] # UPPER ONE EIGHTH BLOCK
+2595 ; [*0691.0020.0002.2595] # RIGHT ONE EIGHTH BLOCK
+2596 ; [*0692.0020.0002.2596] # QUADRANT LOWER LEFT
+2597 ; [*0693.0020.0002.2597] # QUADRANT LOWER RIGHT
+2598 ; [*0694.0020.0002.2598] # QUADRANT UPPER LEFT
+2599 ; [*0695.0020.0002.2599] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A ; [*0696.0020.0002.259A] # QUADRANT UPPER LEFT AND LOWER RIGHT
+259B ; [*0697.0020.0002.259B] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C ; [*0698.0020.0002.259C] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D ; [*0699.0020.0002.259D] # QUADRANT UPPER RIGHT
+259E ; [*069A.0020.0002.259E] # QUADRANT UPPER RIGHT AND LOWER LEFT
+259F ; [*069B.0020.0002.259F] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0 ; [*069C.0020.0002.25A0] # BLACK SQUARE
+25A1 ; [*069D.0020.0002.25A1] # WHITE SQUARE
+25A2 ; [*069E.0020.0002.25A2] # WHITE SQUARE WITH ROUNDED CORNERS
+25A3 ; [*069F.0020.0002.25A3] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4 ; [*06A0.0020.0002.25A4] # SQUARE WITH HORIZONTAL FILL
+25A5 ; [*06A1.0020.0002.25A5] # SQUARE WITH VERTICAL FILL
+25A6 ; [*06A2.0020.0002.25A6] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7 ; [*06A3.0020.0002.25A7] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8 ; [*06A4.0020.0002.25A8] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9 ; [*06A5.0020.0002.25A9] # SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA ; [*06A6.0020.0002.25AA] # BLACK SMALL SQUARE
+25AB ; [*06A7.0020.0002.25AB] # WHITE SMALL SQUARE
+25AC ; [*06A8.0020.0002.25AC] # BLACK RECTANGLE
+25AD ; [*06A9.0020.0002.25AD] # WHITE RECTANGLE
+25AE ; [*06AA.0020.0002.25AE] # BLACK VERTICAL RECTANGLE
+25AF ; [*06AB.0020.0002.25AF] # WHITE VERTICAL RECTANGLE
+25B0 ; [*06AC.0020.0002.25B0] # BLACK PARALLELOGRAM
+25B1 ; [*06AD.0020.0002.25B1] # WHITE PARALLELOGRAM
+25B2 ; [*06AE.0020.0002.25B2] # BLACK UP-POINTING TRIANGLE
+25B3 ; [*06AF.0020.0002.25B3] # WHITE UP-POINTING TRIANGLE
+25B4 ; [*06B0.0020.0002.25B4] # BLACK UP-POINTING SMALL TRIANGLE
+25B5 ; [*06B1.0020.0002.25B5] # WHITE UP-POINTING SMALL TRIANGLE
+25B6 ; [*06B2.0020.0002.25B6] # BLACK RIGHT-POINTING TRIANGLE
+25B7 ; [*06B3.0020.0002.25B7] # WHITE RIGHT-POINTING TRIANGLE
+25B8 ; [*06B4.0020.0002.25B8] # BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9 ; [*06B5.0020.0002.25B9] # WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA ; [*06B6.0020.0002.25BA] # BLACK RIGHT-POINTING POINTER
+25BB ; [*06B7.0020.0002.25BB] # WHITE RIGHT-POINTING POINTER
+25BC ; [*06B8.0020.0002.25BC] # BLACK DOWN-POINTING TRIANGLE
+25BD ; [*06B9.0020.0002.25BD] # WHITE DOWN-POINTING TRIANGLE
+25BE ; [*06BA.0020.0002.25BE] # BLACK DOWN-POINTING SMALL TRIANGLE
+25BF ; [*06BB.0020.0002.25BF] # WHITE DOWN-POINTING SMALL TRIANGLE
+25C0 ; [*06BC.0020.0002.25C0] # BLACK LEFT-POINTING TRIANGLE
+25C1 ; [*06BD.0020.0002.25C1] # WHITE LEFT-POINTING TRIANGLE
+25C2 ; [*06BE.0020.0002.25C2] # BLACK LEFT-POINTING SMALL TRIANGLE
+25C3 ; [*06BF.0020.0002.25C3] # WHITE LEFT-POINTING SMALL TRIANGLE
+25C4 ; [*06C0.0020.0002.25C4] # BLACK LEFT-POINTING POINTER
+25C5 ; [*06C1.0020.0002.25C5] # WHITE LEFT-POINTING POINTER
+25C6 ; [*06C2.0020.0002.25C6] # BLACK DIAMOND
+25C7 ; [*06C3.0020.0002.25C7] # WHITE DIAMOND
+25C8 ; [*06C4.0020.0002.25C8] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9 ; [*06C5.0020.0002.25C9] # FISHEYE
+25CA ; [*06C6.0020.0002.25CA] # LOZENGE
+25CB ; [*06C7.0020.0002.25CB] # WHITE CIRCLE
+25CC ; [*06C8.0020.0002.25CC] # DOTTED CIRCLE
+25CD ; [*06C9.0020.0002.25CD] # CIRCLE WITH VERTICAL FILL
+25CE ; [*06CA.0020.0002.25CE] # BULLSEYE
+25CF ; [*06CB.0020.0002.25CF] # BLACK CIRCLE
+25D0 ; [*06CC.0020.0002.25D0] # CIRCLE WITH LEFT HALF BLACK
+25D1 ; [*06CD.0020.0002.25D1] # CIRCLE WITH RIGHT HALF BLACK
+25D2 ; [*06CE.0020.0002.25D2] # CIRCLE WITH LOWER HALF BLACK
+25D3 ; [*06CF.0020.0002.25D3] # CIRCLE WITH UPPER HALF BLACK
+25D4 ; [*06D0.0020.0002.25D4] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5 ; [*06D1.0020.0002.25D5] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6 ; [*06D2.0020.0002.25D6] # LEFT HALF BLACK CIRCLE
+25D7 ; [*06D3.0020.0002.25D7] # RIGHT HALF BLACK CIRCLE
+25D8 ; [*06D4.0020.0002.25D8] # INVERSE BULLET
+25D9 ; [*06D5.0020.0002.25D9] # INVERSE WHITE CIRCLE
+25DA ; [*06D6.0020.0002.25DA] # UPPER HALF INVERSE WHITE CIRCLE
+25DB ; [*06D7.0020.0002.25DB] # LOWER HALF INVERSE WHITE CIRCLE
+25DC ; [*06D8.0020.0002.25DC] # UPPER LEFT QUADRANT CIRCULAR ARC
+25DD ; [*06D9.0020.0002.25DD] # UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE ; [*06DA.0020.0002.25DE] # LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF ; [*06DB.0020.0002.25DF] # LOWER LEFT QUADRANT CIRCULAR ARC
+25E0 ; [*06DC.0020.0002.25E0] # UPPER HALF CIRCLE
+25E1 ; [*06DD.0020.0002.25E1] # LOWER HALF CIRCLE
+25E2 ; [*06DE.0020.0002.25E2] # BLACK LOWER RIGHT TRIANGLE
+25E3 ; [*06DF.0020.0002.25E3] # BLACK LOWER LEFT TRIANGLE
+25E4 ; [*06E0.0020.0002.25E4] # BLACK UPPER LEFT TRIANGLE
+25E5 ; [*06E1.0020.0002.25E5] # BLACK UPPER RIGHT TRIANGLE
+25E6 ; [*06E2.0020.0002.25E6] # WHITE BULLET
+25E7 ; [*06E3.0020.0002.25E7] # SQUARE WITH LEFT HALF BLACK
+25E8 ; [*06E4.0020.0002.25E8] # SQUARE WITH RIGHT HALF BLACK
+25E9 ; [*06E5.0020.0002.25E9] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA ; [*06E6.0020.0002.25EA] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB ; [*06E7.0020.0002.25EB] # WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC ; [*06E8.0020.0002.25EC] # WHITE UP-POINTING TRIANGLE WITH DOT
+25ED ; [*06E9.0020.0002.25ED] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE ; [*06EA.0020.0002.25EE] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF ; [*06EB.0020.0002.25EF] # LARGE CIRCLE
+25F0 ; [*06EC.0020.0002.25F0] # WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1 ; [*06ED.0020.0002.25F1] # WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2 ; [*06EE.0020.0002.25F2] # WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3 ; [*06EF.0020.0002.25F3] # WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4 ; [*06F0.0020.0002.25F4] # WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5 ; [*06F1.0020.0002.25F5] # WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6 ; [*06F2.0020.0002.25F6] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7 ; [*06F3.0020.0002.25F7] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8 ; [*06F4.0020.0002.25F8] # UPPER LEFT TRIANGLE
+25F9 ; [*06F5.0020.0002.25F9] # UPPER RIGHT TRIANGLE
+25FA ; [*06F6.0020.0002.25FA] # LOWER LEFT TRIANGLE
+25FB ; [*06F7.0020.0002.25FB] # WHITE MEDIUM SQUARE
+25FC ; [*06F8.0020.0002.25FC] # BLACK MEDIUM SQUARE
+25FD ; [*06F9.0020.0002.25FD] # WHITE MEDIUM SMALL SQUARE
+25FE ; [*06FA.0020.0002.25FE] # BLACK MEDIUM SMALL SQUARE
+25FF ; [*06FB.0020.0002.25FF] # LOWER RIGHT TRIANGLE
+2600 ; [*06FC.0020.0002.2600] # BLACK SUN WITH RAYS
+2601 ; [*06FD.0020.0002.2601] # CLOUD
+2602 ; [*06FE.0020.0002.2602] # UMBRELLA
+2603 ; [*06FF.0020.0002.2603] # SNOWMAN
+2604 ; [*0700.0020.0002.2604] # COMET
+2605 ; [*0701.0020.0002.2605] # BLACK STAR
+2606 ; [*0702.0020.0002.2606] # WHITE STAR
+2607 ; [*0703.0020.0002.2607] # LIGHTNING
+2608 ; [*0704.0020.0002.2608] # THUNDERSTORM
+2609 ; [*0705.0020.0002.2609] # SUN
+260A ; [*0706.0020.0002.260A] # ASCENDING NODE
+260B ; [*0707.0020.0002.260B] # DESCENDING NODE
+260C ; [*0708.0020.0002.260C] # CONJUNCTION
+260D ; [*0709.0020.0002.260D] # OPPOSITION
+260E ; [*070A.0020.0002.260E] # BLACK TELEPHONE
+260F ; [*070B.0020.0002.260F] # WHITE TELEPHONE
+2610 ; [*070C.0020.0002.2610] # BALLOT BOX
+2611 ; [*070D.0020.0002.2611] # BALLOT BOX WITH CHECK
+2612 ; [*070E.0020.0002.2612] # BALLOT BOX WITH X
+2613 ; [*070F.0020.0002.2613] # SALTIRE
+2614 ; [*0710.0020.0002.2614] # UMBRELLA WITH RAIN DROPS
+2615 ; [*0711.0020.0002.2615] # HOT BEVERAGE
+2616 ; [*0712.0020.0002.2616] # WHITE SHOGI PIECE
+2617 ; [*0713.0020.0002.2617] # BLACK SHOGI PIECE
+2619 ; [*0714.0020.0002.2619] # REVERSED ROTATED FLORAL HEART BULLET
+261A ; [*0715.0020.0002.261A] # BLACK LEFT POINTING INDEX
+261B ; [*0716.0020.0002.261B] # BLACK RIGHT POINTING INDEX
+261C ; [*0717.0020.0002.261C] # WHITE LEFT POINTING INDEX
+261D ; [*0718.0020.0002.261D] # WHITE UP POINTING INDEX
+261E ; [*0719.0020.0002.261E] # WHITE RIGHT POINTING INDEX
+261F ; [*071A.0020.0002.261F] # WHITE DOWN POINTING INDEX
+2620 ; [*071B.0020.0002.2620] # SKULL AND CROSSBONES
+2621 ; [*071C.0020.0002.2621] # CAUTION SIGN
+2622 ; [*071D.0020.0002.2622] # RADIOACTIVE SIGN
+2623 ; [*071E.0020.0002.2623] # BIOHAZARD SIGN
+2624 ; [*071F.0020.0002.2624] # CADUCEUS
+2625 ; [*0720.0020.0002.2625] # ANKH
+2626 ; [*0721.0020.0002.2626] # ORTHODOX CROSS
+2627 ; [*0722.0020.0002.2627] # CHI RHO
+2628 ; [*0723.0020.0002.2628] # CROSS OF LORRAINE
+2629 ; [*0724.0020.0002.2629] # CROSS OF JERUSALEM
+262A ; [*0725.0020.0002.262A] # STAR AND CRESCENT
+262B ; [*0726.0020.0002.262B] # FARSI SYMBOL
+262C ; [*0727.0020.0002.262C] # ADI SHAKTI
+262D ; [*0728.0020.0002.262D] # HAMMER AND SICKLE
+262E ; [*0729.0020.0002.262E] # PEACE SYMBOL
+262F ; [*072A.0020.0002.262F] # YIN YANG
+2630 ; [*0B2F.0020.0002.2630] # TRIGRAM FOR HEAVEN
+2631 ; [*0B30.0020.0002.2631] # TRIGRAM FOR LAKE
+2632 ; [*0B31.0020.0002.2632] # TRIGRAM FOR FIRE
+2633 ; [*0B32.0020.0002.2633] # TRIGRAM FOR THUNDER
+2634 ; [*0B33.0020.0002.2634] # TRIGRAM FOR WIND
+2635 ; [*0B34.0020.0002.2635] # TRIGRAM FOR WATER
+2636 ; [*0B35.0020.0002.2636] # TRIGRAM FOR MOUNTAIN
+2637 ; [*0B36.0020.0002.2637] # TRIGRAM FOR EARTH
+2638 ; [*072B.0020.0002.2638] # WHEEL OF DHARMA
+2639 ; [*072C.0020.0002.2639] # WHITE FROWNING FACE
+263A ; [*072D.0020.0002.263A] # WHITE SMILING FACE
+263B ; [*072E.0020.0002.263B] # BLACK SMILING FACE
+263C ; [*072F.0020.0002.263C] # WHITE SUN WITH RAYS
+263D ; [*0730.0020.0002.263D] # FIRST QUARTER MOON
+263E ; [*0731.0020.0002.263E] # LAST QUARTER MOON
+263F ; [*0732.0020.0002.263F] # MERCURY
+2640 ; [*0733.0020.0002.2640] # FEMALE SIGN
+2641 ; [*0734.0020.0002.2641] # EARTH
+2642 ; [*0735.0020.0002.2642] # MALE SIGN
+2643 ; [*0736.0020.0002.2643] # JUPITER
+2644 ; [*0737.0020.0002.2644] # SATURN
+2645 ; [*0738.0020.0002.2645] # URANUS
+2646 ; [*0739.0020.0002.2646] # NEPTUNE
+2647 ; [*073A.0020.0002.2647] # PLUTO
+2648 ; [*073B.0020.0002.2648] # ARIES
+2649 ; [*073C.0020.0002.2649] # TAURUS
+264A ; [*073D.0020.0002.264A] # GEMINI
+264B ; [*073E.0020.0002.264B] # CANCER
+264C ; [*073F.0020.0002.264C] # LEO
+264D ; [*0740.0020.0002.264D] # VIRGO
+264E ; [*0741.0020.0002.264E] # LIBRA
+264F ; [*0742.0020.0002.264F] # SCORPIUS
+2650 ; [*0743.0020.0002.2650] # SAGITTARIUS
+2651 ; [*0744.0020.0002.2651] # CAPRICORN
+2652 ; [*0745.0020.0002.2652] # AQUARIUS
+2653 ; [*0746.0020.0002.2653] # PISCES
+2654 ; [*0747.0020.0002.2654] # WHITE CHESS KING
+2655 ; [*0748.0020.0002.2655] # WHITE CHESS QUEEN
+2656 ; [*0749.0020.0002.2656] # WHITE CHESS ROOK
+2657 ; [*074A.0020.0002.2657] # WHITE CHESS BISHOP
+2658 ; [*074B.0020.0002.2658] # WHITE CHESS KNIGHT
+2659 ; [*074C.0020.0002.2659] # WHITE CHESS PAWN
+265A ; [*074D.0020.0002.265A] # BLACK CHESS KING
+265B ; [*074E.0020.0002.265B] # BLACK CHESS QUEEN
+265C ; [*074F.0020.0002.265C] # BLACK CHESS ROOK
+265D ; [*0750.0020.0002.265D] # BLACK CHESS BISHOP
+265E ; [*0751.0020.0002.265E] # BLACK CHESS KNIGHT
+265F ; [*0752.0020.0002.265F] # BLACK CHESS PAWN
+2660 ; [*0753.0020.0002.2660] # BLACK SPADE SUIT
+2661 ; [*0754.0020.0002.2661] # WHITE HEART SUIT
+2662 ; [*0755.0020.0002.2662] # WHITE DIAMOND SUIT
+2663 ; [*0756.0020.0002.2663] # BLACK CLUB SUIT
+2664 ; [*0757.0020.0002.2664] # WHITE SPADE SUIT
+2665 ; [*0758.0020.0002.2665] # BLACK HEART SUIT
+2666 ; [*0759.0020.0002.2666] # BLACK DIAMOND SUIT
+2667 ; [*075A.0020.0002.2667] # WHITE CLUB SUIT
+2668 ; [*075B.0020.0002.2668] # HOT SPRINGS
+2669 ; [*075C.0020.0002.2669] # QUARTER NOTE
+266A ; [*075D.0020.0002.266A] # EIGHTH NOTE
+266B ; [*075E.0020.0002.266B] # BEAMED EIGHTH NOTES
+266C ; [*075F.0020.0002.266C] # BEAMED SIXTEENTH NOTES
+266D ; [*0D2B.0020.0002.266D] # MUSIC FLAT SIGN
+266E ; [*0D2C.0020.0002.266E] # MUSIC NATURAL SIGN
+266F ; [*0D2D.0020.0002.266F] # MUSIC SHARP SIGN
+2670 ; [*0760.0020.0002.2670] # WEST SYRIAC CROSS
+2671 ; [*0761.0020.0002.2671] # EAST SYRIAC CROSS
+2672 ; [*0762.0020.0002.2672] # UNIVERSAL RECYCLING SYMBOL
+2673 ; [*0763.0020.0002.2673] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674 ; [*0764.0020.0002.2674] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675 ; [*0765.0020.0002.2675] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676 ; [*0766.0020.0002.2676] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677 ; [*0767.0020.0002.2677] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678 ; [*0768.0020.0002.2678] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679 ; [*0769.0020.0002.2679] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A ; [*076A.0020.0002.267A] # RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B ; [*076B.0020.0002.267B] # BLACK UNIVERSAL RECYCLING SYMBOL
+267C ; [*076C.0020.0002.267C] # RECYCLED PAPER SYMBOL
+267D ; [*076D.0020.0002.267D] # PARTIALLY-RECYCLED PAPER SYMBOL
+2680 ; [*076E.0020.0002.2680] # DIE FACE-1
+2681 ; [*076F.0020.0002.2681] # DIE FACE-2
+2682 ; [*0770.0020.0002.2682] # DIE FACE-3
+2683 ; [*0771.0020.0002.2683] # DIE FACE-4
+2684 ; [*0772.0020.0002.2684] # DIE FACE-5
+2685 ; [*0773.0020.0002.2685] # DIE FACE-6
+2686 ; [*0774.0020.0002.2686] # WHITE CIRCLE WITH DOT RIGHT
+2687 ; [*0775.0020.0002.2687] # WHITE CIRCLE WITH TWO DOTS
+2688 ; [*0776.0020.0002.2688] # BLACK CIRCLE WITH WHITE DOT RIGHT
+2689 ; [*0777.0020.0002.2689] # BLACK CIRCLE WITH TWO WHITE DOTS
+268A ; [*0B29.0020.0002.268A] # MONOGRAM FOR YANG
+268B ; [*0B2A.0020.0002.268B] # MONOGRAM FOR YIN
+268C ; [*0B2B.0020.0002.268C] # DIGRAM FOR GREATER YANG
+268D ; [*0B2C.0020.0002.268D] # DIGRAM FOR LESSER YIN
+268E ; [*0B2D.0020.0002.268E] # DIGRAM FOR LESSER YANG
+268F ; [*0B2E.0020.0002.268F] # DIGRAM FOR GREATER YIN
+2690 ; [*0778.0020.0002.2690] # WHITE FLAG
+2691 ; [*0779.0020.0002.2691] # BLACK FLAG
+26A0 ; [*077A.0020.0002.26A0] # WARNING SIGN
+26A1 ; [*077B.0020.0002.26A1] # HIGH VOLTAGE SIGN
+2701 ; [*077C.0020.0002.2701] # UPPER BLADE SCISSORS
+2702 ; [*077D.0020.0002.2702] # BLACK SCISSORS
+2703 ; [*077E.0020.0002.2703] # LOWER BLADE SCISSORS
+2704 ; [*077F.0020.0002.2704] # WHITE SCISSORS
+2706 ; [*0780.0020.0002.2706] # TELEPHONE LOCATION SIGN
+2707 ; [*0781.0020.0002.2707] # TAPE DRIVE
+2708 ; [*0782.0020.0002.2708] # AIRPLANE
+2709 ; [*0783.0020.0002.2709] # ENVELOPE
+270C ; [*0784.0020.0002.270C] # VICTORY HAND
+270D ; [*0785.0020.0002.270D] # WRITING HAND
+270E ; [*0786.0020.0002.270E] # LOWER RIGHT PENCIL
+270F ; [*0787.0020.0002.270F] # PENCIL
+2710 ; [*0788.0020.0002.2710] # UPPER RIGHT PENCIL
+2711 ; [*0789.0020.0002.2711] # WHITE NIB
+2712 ; [*078A.0020.0002.2712] # BLACK NIB
+2713 ; [*078B.0020.0002.2713] # CHECK MARK
+2714 ; [*078C.0020.0002.2714] # HEAVY CHECK MARK
+2715 ; [*078D.0020.0002.2715] # MULTIPLICATION X
+2716 ; [*078E.0020.0002.2716] # HEAVY MULTIPLICATION X
+2717 ; [*078F.0020.0002.2717] # BALLOT X
+2718 ; [*0790.0020.0002.2718] # HEAVY BALLOT X
+2719 ; [*0791.0020.0002.2719] # OUTLINED GREEK CROSS
+271A ; [*0792.0020.0002.271A] # HEAVY GREEK CROSS
+271B ; [*0793.0020.0002.271B] # OPEN CENTRE CROSS
+271C ; [*0794.0020.0002.271C] # HEAVY OPEN CENTRE CROSS
+271D ; [*0795.0020.0002.271D] # LATIN CROSS
+271E ; [*0796.0020.0002.271E] # SHADOWED WHITE LATIN CROSS
+271F ; [*0797.0020.0002.271F] # OUTLINED LATIN CROSS
+2720 ; [*0798.0020.0002.2720] # MALTESE CROSS
+2721 ; [*0799.0020.0002.2721] # STAR OF DAVID
+2722 ; [*079A.0020.0002.2722] # FOUR TEARDROP-SPOKED ASTERISK
+2723 ; [*079B.0020.0002.2723] # FOUR BALLOON-SPOKED ASTERISK
+2724 ; [*079C.0020.0002.2724] # HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725 ; [*079D.0020.0002.2725] # FOUR CLUB-SPOKED ASTERISK
+2726 ; [*079E.0020.0002.2726] # BLACK FOUR POINTED STAR
+2727 ; [*079F.0020.0002.2727] # WHITE FOUR POINTED STAR
+2729 ; [*07A0.0020.0002.2729] # STRESS OUTLINED WHITE STAR
+272A ; [*07A1.0020.0002.272A] # CIRCLED WHITE STAR
+272B ; [*07A2.0020.0002.272B] # OPEN CENTRE BLACK STAR
+272C ; [*07A3.0020.0002.272C] # BLACK CENTRE WHITE STAR
+272D ; [*07A4.0020.0002.272D] # OUTLINED BLACK STAR
+272E ; [*07A5.0020.0002.272E] # HEAVY OUTLINED BLACK STAR
+272F ; [*07A6.0020.0002.272F] # PINWHEEL STAR
+2730 ; [*07A7.0020.0002.2730] # SHADOWED WHITE STAR
+2731 ; [*07A8.0020.0002.2731] # HEAVY ASTERISK
+2732 ; [*07A9.0020.0002.2732] # OPEN CENTRE ASTERISK
+2733 ; [*07AA.0020.0002.2733] # EIGHT SPOKED ASTERISK
+2734 ; [*07AB.0020.0002.2734] # EIGHT POINTED BLACK STAR
+2735 ; [*07AC.0020.0002.2735] # EIGHT POINTED PINWHEEL STAR
+2736 ; [*07AD.0020.0002.2736] # SIX POINTED BLACK STAR
+2737 ; [*07AE.0020.0002.2737] # EIGHT POINTED RECTILINEAR BLACK STAR
+2738 ; [*07AF.0020.0002.2738] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739 ; [*07B0.0020.0002.2739] # TWELVE POINTED BLACK STAR
+273A ; [*07B1.0020.0002.273A] # SIXTEEN POINTED ASTERISK
+273B ; [*07B2.0020.0002.273B] # TEARDROP-SPOKED ASTERISK
+273C ; [*07B3.0020.0002.273C] # OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D ; [*07B4.0020.0002.273D] # HEAVY TEARDROP-SPOKED ASTERISK
+273E ; [*07B5.0020.0002.273E] # SIX PETALLED BLACK AND WHITE FLORETTE
+273F ; [*07B6.0020.0002.273F] # BLACK FLORETTE
+2740 ; [*07B7.0020.0002.2740] # WHITE FLORETTE
+2741 ; [*07B8.0020.0002.2741] # EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742 ; [*07B9.0020.0002.2742] # CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743 ; [*07BA.0020.0002.2743] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744 ; [*07BB.0020.0002.2744] # SNOWFLAKE
+2745 ; [*07BC.0020.0002.2745] # TIGHT TRIFOLIATE SNOWFLAKE
+2746 ; [*07BD.0020.0002.2746] # HEAVY CHEVRON SNOWFLAKE
+2747 ; [*07BE.0020.0002.2747] # SPARKLE
+2748 ; [*07BF.0020.0002.2748] # HEAVY SPARKLE
+2749 ; [*07C0.0020.0002.2749] # BALLOON-SPOKED ASTERISK
+274A ; [*07C1.0020.0002.274A] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B ; [*07C2.0020.0002.274B] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D ; [*07C3.0020.0002.274D] # SHADOWED WHITE CIRCLE
+274F ; [*07C4.0020.0002.274F] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750 ; [*07C5.0020.0002.2750] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751 ; [*07C6.0020.0002.2751] # LOWER RIGHT SHADOWED WHITE SQUARE
+2752 ; [*07C7.0020.0002.2752] # UPPER RIGHT SHADOWED WHITE SQUARE
+2756 ; [*07C8.0020.0002.2756] # BLACK DIAMOND MINUS WHITE X
+2758 ; [*07C9.0020.0002.2758] # LIGHT VERTICAL BAR
+2759 ; [*07CA.0020.0002.2759] # MEDIUM VERTICAL BAR
+275A ; [*07CB.0020.0002.275A] # HEAVY VERTICAL BAR
+275B ; [*07CC.0020.0002.275B] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C ; [*07CD.0020.0002.275C] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D ; [*07CE.0020.0002.275D] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E ; [*07CF.0020.0002.275E] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761 ; [*07D0.0020.0002.2761] # CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762 ; [*07D1.0020.0002.2762] # HEAVY EXCLAMATION MARK ORNAMENT
+2763 ; [*07D2.0020.0002.2763] # HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764 ; [*07D3.0020.0002.2764] # HEAVY BLACK HEART
+2765 ; [*07D4.0020.0002.2765] # ROTATED HEAVY BLACK HEART BULLET
+2766 ; [*07D5.0020.0002.2766] # FLORAL HEART
+2767 ; [*07D6.0020.0002.2767] # ROTATED FLORAL HEART BULLET
+2768 ; [*07D7.0020.0002.2768] # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 ; [*07D8.0020.0002.2769] # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A ; [*07D9.0020.0002.276A] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B ; [*07DA.0020.0002.276B] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C ; [*07DB.0020.0002.276C] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D ; [*07DC.0020.0002.276D] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E ; [*07DD.0020.0002.276E] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F ; [*07DE.0020.0002.276F] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 ; [*07DF.0020.0002.2770] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 ; [*07E0.0020.0002.2771] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 ; [*07E1.0020.0002.2772] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 ; [*07E2.0020.0002.2773] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 ; [*07E3.0020.0002.2774] # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 ; [*07E4.0020.0002.2775] # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2794 ; [*07E5.0020.0002.2794] # HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798 ; [*07E6.0020.0002.2798] # HEAVY SOUTH EAST ARROW
+2799 ; [*07E7.0020.0002.2799] # HEAVY RIGHTWARDS ARROW
+279A ; [*07E8.0020.0002.279A] # HEAVY NORTH EAST ARROW
+279B ; [*07E9.0020.0002.279B] # DRAFTING POINT RIGHTWARDS ARROW
+279C ; [*07EA.0020.0002.279C] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D ; [*07EB.0020.0002.279D] # TRIANGLE-HEADED RIGHTWARDS ARROW
+279E ; [*07EC.0020.0002.279E] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F ; [*07ED.0020.0002.279F] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0 ; [*07EE.0020.0002.27A0] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1 ; [*07EF.0020.0002.27A1] # BLACK RIGHTWARDS ARROW
+27A2 ; [*07F0.0020.0002.27A2] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3 ; [*07F1.0020.0002.27A3] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4 ; [*07F2.0020.0002.27A4] # BLACK RIGHTWARDS ARROWHEAD
+27A5 ; [*07F3.0020.0002.27A5] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6 ; [*07F4.0020.0002.27A6] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7 ; [*07F5.0020.0002.27A7] # SQUAT BLACK RIGHTWARDS ARROW
+27A8 ; [*07F6.0020.0002.27A8] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9 ; [*07F7.0020.0002.27A9] # RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA ; [*07F8.0020.0002.27AA] # LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB ; [*07F9.0020.0002.27AB] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC ; [*07FA.0020.0002.27AC] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD ; [*07FB.0020.0002.27AD] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE ; [*07FC.0020.0002.27AE] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF ; [*07FD.0020.0002.27AF] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1 ; [*07FE.0020.0002.27B1] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2 ; [*07FF.0020.0002.27B2] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3 ; [*0800.0020.0002.27B3] # WHITE-FEATHERED RIGHTWARDS ARROW
+27B4 ; [*0801.0020.0002.27B4] # BLACK-FEATHERED SOUTH EAST ARROW
+27B5 ; [*0802.0020.0002.27B5] # BLACK-FEATHERED RIGHTWARDS ARROW
+27B6 ; [*0803.0020.0002.27B6] # BLACK-FEATHERED NORTH EAST ARROW
+27B7 ; [*0804.0020.0002.27B7] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8 ; [*0805.0020.0002.27B8] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9 ; [*0806.0020.0002.27B9] # HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA ; [*0807.0020.0002.27BA] # TEARDROP-BARBED RIGHTWARDS ARROW
+27BB ; [*0808.0020.0002.27BB] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC ; [*0809.0020.0002.27BC] # WEDGE-TAILED RIGHTWARDS ARROW
+27BD ; [*080A.0020.0002.27BD] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE ; [*080B.0020.0002.27BE] # OPEN-OUTLINED RIGHTWARDS ARROW
+27D0 ; [*080C.0020.0002.27D0] # WHITE DIAMOND WITH CENTRED DOT
+27D1 ; [*080D.0020.0002.27D1] # AND WITH DOT
+27D2 ; [*080E.0020.0002.27D2] # ELEMENT OF OPENING UPWARDS
+27D3 ; [*080F.0020.0002.27D3] # LOWER RIGHT CORNER WITH DOT
+27D4 ; [*0810.0020.0002.27D4] # UPPER LEFT CORNER WITH DOT
+27D5 ; [*0811.0020.0002.27D5] # LEFT OUTER JOIN
+27D6 ; [*0812.0020.0002.27D6] # RIGHT OUTER JOIN
+27D7 ; [*0813.0020.0002.27D7] # FULL OUTER JOIN
+27D8 ; [*0814.0020.0002.27D8] # LARGE UP TACK
+27D9 ; [*0815.0020.0002.27D9] # LARGE DOWN TACK
+27DA ; [*0816.0020.0002.27DA] # LEFT AND RIGHT DOUBLE TURNSTILE
+27DB ; [*0817.0020.0002.27DB] # LEFT AND RIGHT TACK
+27DC ; [*0818.0020.0002.27DC] # LEFT MULTIMAP
+27DD ; [*0819.0020.0002.27DD] # LONG RIGHT TACK
+27DE ; [*081A.0020.0002.27DE] # LONG LEFT TACK
+27DF ; [*081B.0020.0002.27DF] # UP TACK WITH CIRCLE ABOVE
+27E0 ; [*081C.0020.0002.27E0] # LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1 ; [*081D.0020.0002.27E1] # WHITE CONCAVE-SIDED DIAMOND
+27E2 ; [*081E.0020.0002.27E2] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3 ; [*081F.0020.0002.27E3] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4 ; [*0820.0020.0002.27E4] # WHITE SQUARE WITH LEFTWARDS TICK
+27E5 ; [*0821.0020.0002.27E5] # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; [*0822.0020.0002.27E6] # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; [*0823.0020.0002.27E7] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; [*0824.0020.0002.27E8] # MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; [*0825.0020.0002.27E9] # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; [*0826.0020.0002.27EA] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; [*0827.0020.0002.27EB] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27F0 ; [*0828.0020.0002.27F0] # UPWARDS QUADRUPLE ARROW
+27F1 ; [*0829.0020.0002.27F1] # DOWNWARDS QUADRUPLE ARROW
+27F2 ; [*082A.0020.0002.27F2] # ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3 ; [*082B.0020.0002.27F3] # CLOCKWISE GAPPED CIRCLE ARROW
+27F4 ; [*082C.0020.0002.27F4] # RIGHT ARROW WITH CIRCLED PLUS
+27F5 ; [*082D.0020.0002.27F5] # LONG LEFTWARDS ARROW
+27F6 ; [*082E.0020.0002.27F6] # LONG RIGHTWARDS ARROW
+27F7 ; [*082F.0020.0002.27F7] # LONG LEFT RIGHT ARROW
+27F8 ; [*0830.0020.0002.27F8] # LONG LEFTWARDS DOUBLE ARROW
+27F9 ; [*0831.0020.0002.27F9] # LONG RIGHTWARDS DOUBLE ARROW
+27FA ; [*0832.0020.0002.27FA] # LONG LEFT RIGHT DOUBLE ARROW
+27FB ; [*0833.0020.0002.27FB] # LONG LEFTWARDS ARROW FROM BAR
+27FC ; [*0834.0020.0002.27FC] # LONG RIGHTWARDS ARROW FROM BAR
+27FD ; [*0835.0020.0002.27FD] # LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE ; [*0836.0020.0002.27FE] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF ; [*0837.0020.0002.27FF] # LONG RIGHTWARDS SQUIGGLE ARROW
+2800 ; [*0A29.0020.0002.2800] # BRAILLE PATTERN BLANK
+2801 ; [*0A2A.0020.0002.2801] # BRAILLE PATTERN DOTS-1
+2802 ; [*0A2B.0020.0002.2802] # BRAILLE PATTERN DOTS-2
+2803 ; [*0A2C.0020.0002.2803] # BRAILLE PATTERN DOTS-12
+2804 ; [*0A2D.0020.0002.2804] # BRAILLE PATTERN DOTS-3
+2805 ; [*0A2E.0020.0002.2805] # BRAILLE PATTERN DOTS-13
+2806 ; [*0A2F.0020.0002.2806] # BRAILLE PATTERN DOTS-23
+2807 ; [*0A30.0020.0002.2807] # BRAILLE PATTERN DOTS-123
+2808 ; [*0A31.0020.0002.2808] # BRAILLE PATTERN DOTS-4
+2809 ; [*0A32.0020.0002.2809] # BRAILLE PATTERN DOTS-14
+280A ; [*0A33.0020.0002.280A] # BRAILLE PATTERN DOTS-24
+280B ; [*0A34.0020.0002.280B] # BRAILLE PATTERN DOTS-124
+280C ; [*0A35.0020.0002.280C] # BRAILLE PATTERN DOTS-34
+280D ; [*0A36.0020.0002.280D] # BRAILLE PATTERN DOTS-134
+280E ; [*0A37.0020.0002.280E] # BRAILLE PATTERN DOTS-234
+280F ; [*0A38.0020.0002.280F] # BRAILLE PATTERN DOTS-1234
+2810 ; [*0A39.0020.0002.2810] # BRAILLE PATTERN DOTS-5
+2811 ; [*0A3A.0020.0002.2811] # BRAILLE PATTERN DOTS-15
+2812 ; [*0A3B.0020.0002.2812] # BRAILLE PATTERN DOTS-25
+2813 ; [*0A3C.0020.0002.2813] # BRAILLE PATTERN DOTS-125
+2814 ; [*0A3D.0020.0002.2814] # BRAILLE PATTERN DOTS-35
+2815 ; [*0A3E.0020.0002.2815] # BRAILLE PATTERN DOTS-135
+2816 ; [*0A3F.0020.0002.2816] # BRAILLE PATTERN DOTS-235
+2817 ; [*0A40.0020.0002.2817] # BRAILLE PATTERN DOTS-1235
+2818 ; [*0A41.0020.0002.2818] # BRAILLE PATTERN DOTS-45
+2819 ; [*0A42.0020.0002.2819] # BRAILLE PATTERN DOTS-145
+281A ; [*0A43.0020.0002.281A] # BRAILLE PATTERN DOTS-245
+281B ; [*0A44.0020.0002.281B] # BRAILLE PATTERN DOTS-1245
+281C ; [*0A45.0020.0002.281C] # BRAILLE PATTERN DOTS-345
+281D ; [*0A46.0020.0002.281D] # BRAILLE PATTERN DOTS-1345
+281E ; [*0A47.0020.0002.281E] # BRAILLE PATTERN DOTS-2345
+281F ; [*0A48.0020.0002.281F] # BRAILLE PATTERN DOTS-12345
+2820 ; [*0A49.0020.0002.2820] # BRAILLE PATTERN DOTS-6
+2821 ; [*0A4A.0020.0002.2821] # BRAILLE PATTERN DOTS-16
+2822 ; [*0A4B.0020.0002.2822] # BRAILLE PATTERN DOTS-26
+2823 ; [*0A4C.0020.0002.2823] # BRAILLE PATTERN DOTS-126
+2824 ; [*0A4D.0020.0002.2824] # BRAILLE PATTERN DOTS-36
+2825 ; [*0A4E.0020.0002.2825] # BRAILLE PATTERN DOTS-136
+2826 ; [*0A4F.0020.0002.2826] # BRAILLE PATTERN DOTS-236
+2827 ; [*0A50.0020.0002.2827] # BRAILLE PATTERN DOTS-1236
+2828 ; [*0A51.0020.0002.2828] # BRAILLE PATTERN DOTS-46
+2829 ; [*0A52.0020.0002.2829] # BRAILLE PATTERN DOTS-146
+282A ; [*0A53.0020.0002.282A] # BRAILLE PATTERN DOTS-246
+282B ; [*0A54.0020.0002.282B] # BRAILLE PATTERN DOTS-1246
+282C ; [*0A55.0020.0002.282C] # BRAILLE PATTERN DOTS-346
+282D ; [*0A56.0020.0002.282D] # BRAILLE PATTERN DOTS-1346
+282E ; [*0A57.0020.0002.282E] # BRAILLE PATTERN DOTS-2346
+282F ; [*0A58.0020.0002.282F] # BRAILLE PATTERN DOTS-12346
+2830 ; [*0A59.0020.0002.2830] # BRAILLE PATTERN DOTS-56
+2831 ; [*0A5A.0020.0002.2831] # BRAILLE PATTERN DOTS-156
+2832 ; [*0A5B.0020.0002.2832] # BRAILLE PATTERN DOTS-256
+2833 ; [*0A5C.0020.0002.2833] # BRAILLE PATTERN DOTS-1256
+2834 ; [*0A5D.0020.0002.2834] # BRAILLE PATTERN DOTS-356
+2835 ; [*0A5E.0020.0002.2835] # BRAILLE PATTERN DOTS-1356
+2836 ; [*0A5F.0020.0002.2836] # BRAILLE PATTERN DOTS-2356
+2837 ; [*0A60.0020.0002.2837] # BRAILLE PATTERN DOTS-12356
+2838 ; [*0A61.0020.0002.2838] # BRAILLE PATTERN DOTS-456
+2839 ; [*0A62.0020.0002.2839] # BRAILLE PATTERN DOTS-1456
+283A ; [*0A63.0020.0002.283A] # BRAILLE PATTERN DOTS-2456
+283B ; [*0A64.0020.0002.283B] # BRAILLE PATTERN DOTS-12456
+283C ; [*0A65.0020.0002.283C] # BRAILLE PATTERN DOTS-3456
+283D ; [*0A66.0020.0002.283D] # BRAILLE PATTERN DOTS-13456
+283E ; [*0A67.0020.0002.283E] # BRAILLE PATTERN DOTS-23456
+283F ; [*0A68.0020.0002.283F] # BRAILLE PATTERN DOTS-123456
+2840 ; [*0A69.0020.0002.2840] # BRAILLE PATTERN DOTS-7
+2841 ; [*0A6A.0020.0002.2841] # BRAILLE PATTERN DOTS-17
+2842 ; [*0A6B.0020.0002.2842] # BRAILLE PATTERN DOTS-27
+2843 ; [*0A6C.0020.0002.2843] # BRAILLE PATTERN DOTS-127
+2844 ; [*0A6D.0020.0002.2844] # BRAILLE PATTERN DOTS-37
+2845 ; [*0A6E.0020.0002.2845] # BRAILLE PATTERN DOTS-137
+2846 ; [*0A6F.0020.0002.2846] # BRAILLE PATTERN DOTS-237
+2847 ; [*0A70.0020.0002.2847] # BRAILLE PATTERN DOTS-1237
+2848 ; [*0A71.0020.0002.2848] # BRAILLE PATTERN DOTS-47
+2849 ; [*0A72.0020.0002.2849] # BRAILLE PATTERN DOTS-147
+284A ; [*0A73.0020.0002.284A] # BRAILLE PATTERN DOTS-247
+284B ; [*0A74.0020.0002.284B] # BRAILLE PATTERN DOTS-1247
+284C ; [*0A75.0020.0002.284C] # BRAILLE PATTERN DOTS-347
+284D ; [*0A76.0020.0002.284D] # BRAILLE PATTERN DOTS-1347
+284E ; [*0A77.0020.0002.284E] # BRAILLE PATTERN DOTS-2347
+284F ; [*0A78.0020.0002.284F] # BRAILLE PATTERN DOTS-12347
+2850 ; [*0A79.0020.0002.2850] # BRAILLE PATTERN DOTS-57
+2851 ; [*0A7A.0020.0002.2851] # BRAILLE PATTERN DOTS-157
+2852 ; [*0A7B.0020.0002.2852] # BRAILLE PATTERN DOTS-257
+2853 ; [*0A7C.0020.0002.2853] # BRAILLE PATTERN DOTS-1257
+2854 ; [*0A7D.0020.0002.2854] # BRAILLE PATTERN DOTS-357
+2855 ; [*0A7E.0020.0002.2855] # BRAILLE PATTERN DOTS-1357
+2856 ; [*0A7F.0020.0002.2856] # BRAILLE PATTERN DOTS-2357
+2857 ; [*0A80.0020.0002.2857] # BRAILLE PATTERN DOTS-12357
+2858 ; [*0A81.0020.0002.2858] # BRAILLE PATTERN DOTS-457
+2859 ; [*0A82.0020.0002.2859] # BRAILLE PATTERN DOTS-1457
+285A ; [*0A83.0020.0002.285A] # BRAILLE PATTERN DOTS-2457
+285B ; [*0A84.0020.0002.285B] # BRAILLE PATTERN DOTS-12457
+285C ; [*0A85.0020.0002.285C] # BRAILLE PATTERN DOTS-3457
+285D ; [*0A86.0020.0002.285D] # BRAILLE PATTERN DOTS-13457
+285E ; [*0A87.0020.0002.285E] # BRAILLE PATTERN DOTS-23457
+285F ; [*0A88.0020.0002.285F] # BRAILLE PATTERN DOTS-123457
+2860 ; [*0A89.0020.0002.2860] # BRAILLE PATTERN DOTS-67
+2861 ; [*0A8A.0020.0002.2861] # BRAILLE PATTERN DOTS-167
+2862 ; [*0A8B.0020.0002.2862] # BRAILLE PATTERN DOTS-267
+2863 ; [*0A8C.0020.0002.2863] # BRAILLE PATTERN DOTS-1267
+2864 ; [*0A8D.0020.0002.2864] # BRAILLE PATTERN DOTS-367
+2865 ; [*0A8E.0020.0002.2865] # BRAILLE PATTERN DOTS-1367
+2866 ; [*0A8F.0020.0002.2866] # BRAILLE PATTERN DOTS-2367
+2867 ; [*0A90.0020.0002.2867] # BRAILLE PATTERN DOTS-12367
+2868 ; [*0A91.0020.0002.2868] # BRAILLE PATTERN DOTS-467
+2869 ; [*0A92.0020.0002.2869] # BRAILLE PATTERN DOTS-1467
+286A ; [*0A93.0020.0002.286A] # BRAILLE PATTERN DOTS-2467
+286B ; [*0A94.0020.0002.286B] # BRAILLE PATTERN DOTS-12467
+286C ; [*0A95.0020.0002.286C] # BRAILLE PATTERN DOTS-3467
+286D ; [*0A96.0020.0002.286D] # BRAILLE PATTERN DOTS-13467
+286E ; [*0A97.0020.0002.286E] # BRAILLE PATTERN DOTS-23467
+286F ; [*0A98.0020.0002.286F] # BRAILLE PATTERN DOTS-123467
+2870 ; [*0A99.0020.0002.2870] # BRAILLE PATTERN DOTS-567
+2871 ; [*0A9A.0020.0002.2871] # BRAILLE PATTERN DOTS-1567
+2872 ; [*0A9B.0020.0002.2872] # BRAILLE PATTERN DOTS-2567
+2873 ; [*0A9C.0020.0002.2873] # BRAILLE PATTERN DOTS-12567
+2874 ; [*0A9D.0020.0002.2874] # BRAILLE PATTERN DOTS-3567
+2875 ; [*0A9E.0020.0002.2875] # BRAILLE PATTERN DOTS-13567
+2876 ; [*0A9F.0020.0002.2876] # BRAILLE PATTERN DOTS-23567
+2877 ; [*0AA0.0020.0002.2877] # BRAILLE PATTERN DOTS-123567
+2878 ; [*0AA1.0020.0002.2878] # BRAILLE PATTERN DOTS-4567
+2879 ; [*0AA2.0020.0002.2879] # BRAILLE PATTERN DOTS-14567
+287A ; [*0AA3.0020.0002.287A] # BRAILLE PATTERN DOTS-24567
+287B ; [*0AA4.0020.0002.287B] # BRAILLE PATTERN DOTS-124567
+287C ; [*0AA5.0020.0002.287C] # BRAILLE PATTERN DOTS-34567
+287D ; [*0AA6.0020.0002.287D] # BRAILLE PATTERN DOTS-134567
+287E ; [*0AA7.0020.0002.287E] # BRAILLE PATTERN DOTS-234567
+287F ; [*0AA8.0020.0002.287F] # BRAILLE PATTERN DOTS-1234567
+2880 ; [*0AA9.0020.0002.2880] # BRAILLE PATTERN DOTS-8
+2881 ; [*0AAA.0020.0002.2881] # BRAILLE PATTERN DOTS-18
+2882 ; [*0AAB.0020.0002.2882] # BRAILLE PATTERN DOTS-28
+2883 ; [*0AAC.0020.0002.2883] # BRAILLE PATTERN DOTS-128
+2884 ; [*0AAD.0020.0002.2884] # BRAILLE PATTERN DOTS-38
+2885 ; [*0AAE.0020.0002.2885] # BRAILLE PATTERN DOTS-138
+2886 ; [*0AAF.0020.0002.2886] # BRAILLE PATTERN DOTS-238
+2887 ; [*0AB0.0020.0002.2887] # BRAILLE PATTERN DOTS-1238
+2888 ; [*0AB1.0020.0002.2888] # BRAILLE PATTERN DOTS-48
+2889 ; [*0AB2.0020.0002.2889] # BRAILLE PATTERN DOTS-148
+288A ; [*0AB3.0020.0002.288A] # BRAILLE PATTERN DOTS-248
+288B ; [*0AB4.0020.0002.288B] # BRAILLE PATTERN DOTS-1248
+288C ; [*0AB5.0020.0002.288C] # BRAILLE PATTERN DOTS-348
+288D ; [*0AB6.0020.0002.288D] # BRAILLE PATTERN DOTS-1348
+288E ; [*0AB7.0020.0002.288E] # BRAILLE PATTERN DOTS-2348
+288F ; [*0AB8.0020.0002.288F] # BRAILLE PATTERN DOTS-12348
+2890 ; [*0AB9.0020.0002.2890] # BRAILLE PATTERN DOTS-58
+2891 ; [*0ABA.0020.0002.2891] # BRAILLE PATTERN DOTS-158
+2892 ; [*0ABB.0020.0002.2892] # BRAILLE PATTERN DOTS-258
+2893 ; [*0ABC.0020.0002.2893] # BRAILLE PATTERN DOTS-1258
+2894 ; [*0ABD.0020.0002.2894] # BRAILLE PATTERN DOTS-358
+2895 ; [*0ABE.0020.0002.2895] # BRAILLE PATTERN DOTS-1358
+2896 ; [*0ABF.0020.0002.2896] # BRAILLE PATTERN DOTS-2358
+2897 ; [*0AC0.0020.0002.2897] # BRAILLE PATTERN DOTS-12358
+2898 ; [*0AC1.0020.0002.2898] # BRAILLE PATTERN DOTS-458
+2899 ; [*0AC2.0020.0002.2899] # BRAILLE PATTERN DOTS-1458
+289A ; [*0AC3.0020.0002.289A] # BRAILLE PATTERN DOTS-2458
+289B ; [*0AC4.0020.0002.289B] # BRAILLE PATTERN DOTS-12458
+289C ; [*0AC5.0020.0002.289C] # BRAILLE PATTERN DOTS-3458
+289D ; [*0AC6.0020.0002.289D] # BRAILLE PATTERN DOTS-13458
+289E ; [*0AC7.0020.0002.289E] # BRAILLE PATTERN DOTS-23458
+289F ; [*0AC8.0020.0002.289F] # BRAILLE PATTERN DOTS-123458
+28A0 ; [*0AC9.0020.0002.28A0] # BRAILLE PATTERN DOTS-68
+28A1 ; [*0ACA.0020.0002.28A1] # BRAILLE PATTERN DOTS-168
+28A2 ; [*0ACB.0020.0002.28A2] # BRAILLE PATTERN DOTS-268
+28A3 ; [*0ACC.0020.0002.28A3] # BRAILLE PATTERN DOTS-1268
+28A4 ; [*0ACD.0020.0002.28A4] # BRAILLE PATTERN DOTS-368
+28A5 ; [*0ACE.0020.0002.28A5] # BRAILLE PATTERN DOTS-1368
+28A6 ; [*0ACF.0020.0002.28A6] # BRAILLE PATTERN DOTS-2368
+28A7 ; [*0AD0.0020.0002.28A7] # BRAILLE PATTERN DOTS-12368
+28A8 ; [*0AD1.0020.0002.28A8] # BRAILLE PATTERN DOTS-468
+28A9 ; [*0AD2.0020.0002.28A9] # BRAILLE PATTERN DOTS-1468
+28AA ; [*0AD3.0020.0002.28AA] # BRAILLE PATTERN DOTS-2468
+28AB ; [*0AD4.0020.0002.28AB] # BRAILLE PATTERN DOTS-12468
+28AC ; [*0AD5.0020.0002.28AC] # BRAILLE PATTERN DOTS-3468
+28AD ; [*0AD6.0020.0002.28AD] # BRAILLE PATTERN DOTS-13468
+28AE ; [*0AD7.0020.0002.28AE] # BRAILLE PATTERN DOTS-23468
+28AF ; [*0AD8.0020.0002.28AF] # BRAILLE PATTERN DOTS-123468
+28B0 ; [*0AD9.0020.0002.28B0] # BRAILLE PATTERN DOTS-568
+28B1 ; [*0ADA.0020.0002.28B1] # BRAILLE PATTERN DOTS-1568
+28B2 ; [*0ADB.0020.0002.28B2] # BRAILLE PATTERN DOTS-2568
+28B3 ; [*0ADC.0020.0002.28B3] # BRAILLE PATTERN DOTS-12568
+28B4 ; [*0ADD.0020.0002.28B4] # BRAILLE PATTERN DOTS-3568
+28B5 ; [*0ADE.0020.0002.28B5] # BRAILLE PATTERN DOTS-13568
+28B6 ; [*0ADF.0020.0002.28B6] # BRAILLE PATTERN DOTS-23568
+28B7 ; [*0AE0.0020.0002.28B7] # BRAILLE PATTERN DOTS-123568
+28B8 ; [*0AE1.0020.0002.28B8] # BRAILLE PATTERN DOTS-4568
+28B9 ; [*0AE2.0020.0002.28B9] # BRAILLE PATTERN DOTS-14568
+28BA ; [*0AE3.0020.0002.28BA] # BRAILLE PATTERN DOTS-24568
+28BB ; [*0AE4.0020.0002.28BB] # BRAILLE PATTERN DOTS-124568
+28BC ; [*0AE5.0020.0002.28BC] # BRAILLE PATTERN DOTS-34568
+28BD ; [*0AE6.0020.0002.28BD] # BRAILLE PATTERN DOTS-134568
+28BE ; [*0AE7.0020.0002.28BE] # BRAILLE PATTERN DOTS-234568
+28BF ; [*0AE8.0020.0002.28BF] # BRAILLE PATTERN DOTS-1234568
+28C0 ; [*0AE9.0020.0002.28C0] # BRAILLE PATTERN DOTS-78
+28C1 ; [*0AEA.0020.0002.28C1] # BRAILLE PATTERN DOTS-178
+28C2 ; [*0AEB.0020.0002.28C2] # BRAILLE PATTERN DOTS-278
+28C3 ; [*0AEC.0020.0002.28C3] # BRAILLE PATTERN DOTS-1278
+28C4 ; [*0AED.0020.0002.28C4] # BRAILLE PATTERN DOTS-378
+28C5 ; [*0AEE.0020.0002.28C5] # BRAILLE PATTERN DOTS-1378
+28C6 ; [*0AEF.0020.0002.28C6] # BRAILLE PATTERN DOTS-2378
+28C7 ; [*0AF0.0020.0002.28C7] # BRAILLE PATTERN DOTS-12378
+28C8 ; [*0AF1.0020.0002.28C8] # BRAILLE PATTERN DOTS-478
+28C9 ; [*0AF2.0020.0002.28C9] # BRAILLE PATTERN DOTS-1478
+28CA ; [*0AF3.0020.0002.28CA] # BRAILLE PATTERN DOTS-2478
+28CB ; [*0AF4.0020.0002.28CB] # BRAILLE PATTERN DOTS-12478
+28CC ; [*0AF5.0020.0002.28CC] # BRAILLE PATTERN DOTS-3478
+28CD ; [*0AF6.0020.0002.28CD] # BRAILLE PATTERN DOTS-13478
+28CE ; [*0AF7.0020.0002.28CE] # BRAILLE PATTERN DOTS-23478
+28CF ; [*0AF8.0020.0002.28CF] # BRAILLE PATTERN DOTS-123478
+28D0 ; [*0AF9.0020.0002.28D0] # BRAILLE PATTERN DOTS-578
+28D1 ; [*0AFA.0020.0002.28D1] # BRAILLE PATTERN DOTS-1578
+28D2 ; [*0AFB.0020.0002.28D2] # BRAILLE PATTERN DOTS-2578
+28D3 ; [*0AFC.0020.0002.28D3] # BRAILLE PATTERN DOTS-12578
+28D4 ; [*0AFD.0020.0002.28D4] # BRAILLE PATTERN DOTS-3578
+28D5 ; [*0AFE.0020.0002.28D5] # BRAILLE PATTERN DOTS-13578
+28D6 ; [*0AFF.0020.0002.28D6] # BRAILLE PATTERN DOTS-23578
+28D7 ; [*0B00.0020.0002.28D7] # BRAILLE PATTERN DOTS-123578
+28D8 ; [*0B01.0020.0002.28D8] # BRAILLE PATTERN DOTS-4578
+28D9 ; [*0B02.0020.0002.28D9] # BRAILLE PATTERN DOTS-14578
+28DA ; [*0B03.0020.0002.28DA] # BRAILLE PATTERN DOTS-24578
+28DB ; [*0B04.0020.0002.28DB] # BRAILLE PATTERN DOTS-124578
+28DC ; [*0B05.0020.0002.28DC] # BRAILLE PATTERN DOTS-34578
+28DD ; [*0B06.0020.0002.28DD] # BRAILLE PATTERN DOTS-134578
+28DE ; [*0B07.0020.0002.28DE] # BRAILLE PATTERN DOTS-234578
+28DF ; [*0B08.0020.0002.28DF] # BRAILLE PATTERN DOTS-1234578
+28E0 ; [*0B09.0020.0002.28E0] # BRAILLE PATTERN DOTS-678
+28E1 ; [*0B0A.0020.0002.28E1] # BRAILLE PATTERN DOTS-1678
+28E2 ; [*0B0B.0020.0002.28E2] # BRAILLE PATTERN DOTS-2678
+28E3 ; [*0B0C.0020.0002.28E3] # BRAILLE PATTERN DOTS-12678
+28E4 ; [*0B0D.0020.0002.28E4] # BRAILLE PATTERN DOTS-3678
+28E5 ; [*0B0E.0020.0002.28E5] # BRAILLE PATTERN DOTS-13678
+28E6 ; [*0B0F.0020.0002.28E6] # BRAILLE PATTERN DOTS-23678
+28E7 ; [*0B10.0020.0002.28E7] # BRAILLE PATTERN DOTS-123678
+28E8 ; [*0B11.0020.0002.28E8] # BRAILLE PATTERN DOTS-4678
+28E9 ; [*0B12.0020.0002.28E9] # BRAILLE PATTERN DOTS-14678
+28EA ; [*0B13.0020.0002.28EA] # BRAILLE PATTERN DOTS-24678
+28EB ; [*0B14.0020.0002.28EB] # BRAILLE PATTERN DOTS-124678
+28EC ; [*0B15.0020.0002.28EC] # BRAILLE PATTERN DOTS-34678
+28ED ; [*0B16.0020.0002.28ED] # BRAILLE PATTERN DOTS-134678
+28EE ; [*0B17.0020.0002.28EE] # BRAILLE PATTERN DOTS-234678
+28EF ; [*0B18.0020.0002.28EF] # BRAILLE PATTERN DOTS-1234678
+28F0 ; [*0B19.0020.0002.28F0] # BRAILLE PATTERN DOTS-5678
+28F1 ; [*0B1A.0020.0002.28F1] # BRAILLE PATTERN DOTS-15678
+28F2 ; [*0B1B.0020.0002.28F2] # BRAILLE PATTERN DOTS-25678
+28F3 ; [*0B1C.0020.0002.28F3] # BRAILLE PATTERN DOTS-125678
+28F4 ; [*0B1D.0020.0002.28F4] # BRAILLE PATTERN DOTS-35678
+28F5 ; [*0B1E.0020.0002.28F5] # BRAILLE PATTERN DOTS-135678
+28F6 ; [*0B1F.0020.0002.28F6] # BRAILLE PATTERN DOTS-235678
+28F7 ; [*0B20.0020.0002.28F7] # BRAILLE PATTERN DOTS-1235678
+28F8 ; [*0B21.0020.0002.28F8] # BRAILLE PATTERN DOTS-45678
+28F9 ; [*0B22.0020.0002.28F9] # BRAILLE PATTERN DOTS-145678
+28FA ; [*0B23.0020.0002.28FA] # BRAILLE PATTERN DOTS-245678
+28FB ; [*0B24.0020.0002.28FB] # BRAILLE PATTERN DOTS-1245678
+28FC ; [*0B25.0020.0002.28FC] # BRAILLE PATTERN DOTS-345678
+28FD ; [*0B26.0020.0002.28FD] # BRAILLE PATTERN DOTS-1345678
+28FE ; [*0B27.0020.0002.28FE] # BRAILLE PATTERN DOTS-2345678
+28FF ; [*0B28.0020.0002.28FF] # BRAILLE PATTERN DOTS-12345678
+2900 ; [*0838.0020.0002.2900] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901 ; [*0839.0020.0002.2901] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902 ; [*083A.0020.0002.2902] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903 ; [*083B.0020.0002.2903] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904 ; [*083C.0020.0002.2904] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905 ; [*083D.0020.0002.2905] # RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906 ; [*083E.0020.0002.2906] # LEFTWARDS DOUBLE ARROW FROM BAR
+2907 ; [*083F.0020.0002.2907] # RIGHTWARDS DOUBLE ARROW FROM BAR
+2908 ; [*0840.0020.0002.2908] # DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909 ; [*0841.0020.0002.2909] # UPWARDS ARROW WITH HORIZONTAL STROKE
+290A ; [*0842.0020.0002.290A] # UPWARDS TRIPLE ARROW
+290B ; [*0843.0020.0002.290B] # DOWNWARDS TRIPLE ARROW
+290C ; [*0844.0020.0002.290C] # LEFTWARDS DOUBLE DASH ARROW
+290D ; [*0845.0020.0002.290D] # RIGHTWARDS DOUBLE DASH ARROW
+290E ; [*0846.0020.0002.290E] # LEFTWARDS TRIPLE DASH ARROW
+290F ; [*0847.0020.0002.290F] # RIGHTWARDS TRIPLE DASH ARROW
+2910 ; [*0848.0020.0002.2910] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911 ; [*0849.0020.0002.2911] # RIGHTWARDS ARROW WITH DOTTED STEM
+2912 ; [*084A.0020.0002.2912] # UPWARDS ARROW TO BAR
+2913 ; [*084B.0020.0002.2913] # DOWNWARDS ARROW TO BAR
+2914 ; [*084C.0020.0002.2914] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915 ; [*084D.0020.0002.2915] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916 ; [*084E.0020.0002.2916] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917 ; [*084F.0020.0002.2917] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918 ; [*0850.0020.0002.2918] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919 ; [*0851.0020.0002.2919] # LEFTWARDS ARROW-TAIL
+291A ; [*0852.0020.0002.291A] # RIGHTWARDS ARROW-TAIL
+291B ; [*0853.0020.0002.291B] # LEFTWARDS DOUBLE ARROW-TAIL
+291C ; [*0854.0020.0002.291C] # RIGHTWARDS DOUBLE ARROW-TAIL
+291D ; [*0855.0020.0002.291D] # LEFTWARDS ARROW TO BLACK DIAMOND
+291E ; [*0856.0020.0002.291E] # RIGHTWARDS ARROW TO BLACK DIAMOND
+291F ; [*0857.0020.0002.291F] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920 ; [*0858.0020.0002.2920] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921 ; [*0859.0020.0002.2921] # NORTH WEST AND SOUTH EAST ARROW
+2922 ; [*085A.0020.0002.2922] # NORTH EAST AND SOUTH WEST ARROW
+2923 ; [*085B.0020.0002.2923] # NORTH WEST ARROW WITH HOOK
+2924 ; [*085C.0020.0002.2924] # NORTH EAST ARROW WITH HOOK
+2925 ; [*085D.0020.0002.2925] # SOUTH EAST ARROW WITH HOOK
+2926 ; [*085E.0020.0002.2926] # SOUTH WEST ARROW WITH HOOK
+2927 ; [*085F.0020.0002.2927] # NORTH WEST ARROW AND NORTH EAST ARROW
+2928 ; [*0860.0020.0002.2928] # NORTH EAST ARROW AND SOUTH EAST ARROW
+2929 ; [*0861.0020.0002.2929] # SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A ; [*0862.0020.0002.292A] # SOUTH WEST ARROW AND NORTH WEST ARROW
+292B ; [*0863.0020.0002.292B] # RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C ; [*0864.0020.0002.292C] # FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D ; [*0865.0020.0002.292D] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E ; [*0866.0020.0002.292E] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F ; [*0867.0020.0002.292F] # FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930 ; [*0868.0020.0002.2930] # RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931 ; [*0869.0020.0002.2931] # NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932 ; [*086A.0020.0002.2932] # NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933 ; [*086B.0020.0002.2933] # WAVE ARROW POINTING DIRECTLY RIGHT
+2934 ; [*086C.0020.0002.2934] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935 ; [*086D.0020.0002.2935] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936 ; [*086E.0020.0002.2936] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937 ; [*086F.0020.0002.2937] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938 ; [*0870.0020.0002.2938] # RIGHT-SIDE ARC CLOCKWISE ARROW
+2939 ; [*0871.0020.0002.2939] # LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A ; [*0872.0020.0002.293A] # TOP ARC ANTICLOCKWISE ARROW
+293B ; [*0873.0020.0002.293B] # BOTTOM ARC ANTICLOCKWISE ARROW
+293C ; [*0874.0020.0002.293C] # TOP ARC CLOCKWISE ARROW WITH MINUS
+293D ; [*0875.0020.0002.293D] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E ; [*0876.0020.0002.293E] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F ; [*0877.0020.0002.293F] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940 ; [*0878.0020.0002.2940] # ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941 ; [*0879.0020.0002.2941] # CLOCKWISE CLOSED CIRCLE ARROW
+2942 ; [*087A.0020.0002.2942] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943 ; [*087B.0020.0002.2943] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944 ; [*087C.0020.0002.2944] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945 ; [*087D.0020.0002.2945] # RIGHTWARDS ARROW WITH PLUS BELOW
+2946 ; [*087E.0020.0002.2946] # LEFTWARDS ARROW WITH PLUS BELOW
+2947 ; [*087F.0020.0002.2947] # RIGHTWARDS ARROW THROUGH X
+2948 ; [*0880.0020.0002.2948] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949 ; [*0881.0020.0002.2949] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A ; [*0882.0020.0002.294A] # LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B ; [*0883.0020.0002.294B] # LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C ; [*0884.0020.0002.294C] # UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D ; [*0885.0020.0002.294D] # UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E ; [*0886.0020.0002.294E] # LEFT BARB UP RIGHT BARB UP HARPOON
+294F ; [*0887.0020.0002.294F] # UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950 ; [*0888.0020.0002.2950] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951 ; [*0889.0020.0002.2951] # UP BARB LEFT DOWN BARB LEFT HARPOON
+2952 ; [*088A.0020.0002.2952] # LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953 ; [*088B.0020.0002.2953] # RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954 ; [*088C.0020.0002.2954] # UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955 ; [*088D.0020.0002.2955] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956 ; [*088E.0020.0002.2956] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957 ; [*088F.0020.0002.2957] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958 ; [*0890.0020.0002.2958] # UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959 ; [*0891.0020.0002.2959] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A ; [*0892.0020.0002.295A] # LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B ; [*0893.0020.0002.295B] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C ; [*0894.0020.0002.295C] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D ; [*0895.0020.0002.295D] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E ; [*0896.0020.0002.295E] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F ; [*0897.0020.0002.295F] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960 ; [*0898.0020.0002.2960] # UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961 ; [*0899.0020.0002.2961] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962 ; [*089A.0020.0002.2962] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963 ; [*089B.0020.0002.2963] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964 ; [*089C.0020.0002.2964] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965 ; [*089D.0020.0002.2965] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966 ; [*089E.0020.0002.2966] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967 ; [*089F.0020.0002.2967] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968 ; [*08A0.0020.0002.2968] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969 ; [*08A1.0020.0002.2969] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A ; [*08A2.0020.0002.296A] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B ; [*08A3.0020.0002.296B] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C ; [*08A4.0020.0002.296C] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D ; [*08A5.0020.0002.296D] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E ; [*08A6.0020.0002.296E] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F ; [*08A7.0020.0002.296F] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970 ; [*08A8.0020.0002.2970] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971 ; [*08A9.0020.0002.2971] # EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972 ; [*08AA.0020.0002.2972] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973 ; [*08AB.0020.0002.2973] # LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974 ; [*08AC.0020.0002.2974] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975 ; [*08AD.0020.0002.2975] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976 ; [*08AE.0020.0002.2976] # LESS-THAN ABOVE LEFTWARDS ARROW
+2977 ; [*08AF.0020.0002.2977] # LEFTWARDS ARROW THROUGH LESS-THAN
+2978 ; [*08B0.0020.0002.2978] # GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979 ; [*08B1.0020.0002.2979] # SUBSET ABOVE RIGHTWARDS ARROW
+297A ; [*08B2.0020.0002.297A] # LEFTWARDS ARROW THROUGH SUBSET
+297B ; [*08B3.0020.0002.297B] # SUPERSET ABOVE LEFTWARDS ARROW
+297C ; [*08B4.0020.0002.297C] # LEFT FISH TAIL
+297D ; [*08B5.0020.0002.297D] # RIGHT FISH TAIL
+297E ; [*08B6.0020.0002.297E] # UP FISH TAIL
+297F ; [*08B7.0020.0002.297F] # DOWN FISH TAIL
+2980 ; [*08B8.0020.0002.2980] # TRIPLE VERTICAL BAR DELIMITER
+2981 ; [*08B9.0020.0002.2981] # Z NOTATION SPOT
+2982 ; [*08BA.0020.0002.2982] # Z NOTATION TYPE COLON
+2983 ; [*0298.0020.0002.2983] # LEFT WHITE CURLY BRACKET
+2984 ; [*0299.0020.0002.2984] # RIGHT WHITE CURLY BRACKET
+2985 ; [*029A.0020.0002.2985] # LEFT WHITE PARENTHESIS
+2986 ; [*029B.0020.0002.2986] # RIGHT WHITE PARENTHESIS
+2987 ; [*029C.0020.0002.2987] # Z NOTATION LEFT IMAGE BRACKET
+2988 ; [*029D.0020.0002.2988] # Z NOTATION RIGHT IMAGE BRACKET
+2989 ; [*029E.0020.0002.2989] # Z NOTATION LEFT BINDING BRACKET
+298A ; [*029F.0020.0002.298A] # Z NOTATION RIGHT BINDING BRACKET
+298B ; [*02A0.0020.0002.298B] # LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; [*02A1.0020.0002.298C] # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; [*02A2.0020.0002.298D] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; [*02A3.0020.0002.298E] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; [*02A4.0020.0002.298F] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; [*02A5.0020.0002.2990] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; [*02A6.0020.0002.2991] # LEFT ANGLE BRACKET WITH DOT
+2992 ; [*02A7.0020.0002.2992] # RIGHT ANGLE BRACKET WITH DOT
+2993 ; [*02A8.0020.0002.2993] # LEFT ARC LESS-THAN BRACKET
+2994 ; [*02A9.0020.0002.2994] # RIGHT ARC GREATER-THAN BRACKET
+2995 ; [*02AA.0020.0002.2995] # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; [*02AB.0020.0002.2996] # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; [*02AC.0020.0002.2997] # LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; [*02AD.0020.0002.2998] # RIGHT BLACK TORTOISE SHELL BRACKET
+2999 ; [*08BB.0020.0002.2999] # DOTTED FENCE
+299A ; [*08BC.0020.0002.299A] # VERTICAL ZIGZAG LINE
+299B ; [*08BD.0020.0002.299B] # MEASURED ANGLE OPENING LEFT
+299C ; [*08BE.0020.0002.299C] # RIGHT ANGLE VARIANT WITH SQUARE
+299D ; [*08BF.0020.0002.299D] # MEASURED RIGHT ANGLE WITH DOT
+299E ; [*08C0.0020.0002.299E] # ANGLE WITH S INSIDE
+299F ; [*08C1.0020.0002.299F] # ACUTE ANGLE
+29A0 ; [*08C2.0020.0002.29A0] # SPHERICAL ANGLE OPENING LEFT
+29A1 ; [*08C3.0020.0002.29A1] # SPHERICAL ANGLE OPENING UP
+29A2 ; [*08C4.0020.0002.29A2] # TURNED ANGLE
+29A3 ; [*08C5.0020.0002.29A3] # REVERSED ANGLE
+29A4 ; [*08C6.0020.0002.29A4] # ANGLE WITH UNDERBAR
+29A5 ; [*08C7.0020.0002.29A5] # REVERSED ANGLE WITH UNDERBAR
+29A6 ; [*08C8.0020.0002.29A6] # OBLIQUE ANGLE OPENING UP
+29A7 ; [*08C9.0020.0002.29A7] # OBLIQUE ANGLE OPENING DOWN
+29A8 ; [*08CA.0020.0002.29A8] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9 ; [*08CB.0020.0002.29A9] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA ; [*08CC.0020.0002.29AA] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB ; [*08CD.0020.0002.29AB] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC ; [*08CE.0020.0002.29AC] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD ; [*08CF.0020.0002.29AD] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE ; [*08D0.0020.0002.29AE] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF ; [*08D1.0020.0002.29AF] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0 ; [*08D2.0020.0002.29B0] # REVERSED EMPTY SET
+29B1 ; [*08D3.0020.0002.29B1] # EMPTY SET WITH OVERBAR
+29B2 ; [*08D4.0020.0002.29B2] # EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3 ; [*08D5.0020.0002.29B3] # EMPTY SET WITH RIGHT ARROW ABOVE
+29B4 ; [*08D6.0020.0002.29B4] # EMPTY SET WITH LEFT ARROW ABOVE
+29B5 ; [*08D7.0020.0002.29B5] # CIRCLE WITH HORIZONTAL BAR
+29B6 ; [*08D8.0020.0002.29B6] # CIRCLED VERTICAL BAR
+29B7 ; [*08D9.0020.0002.29B7] # CIRCLED PARALLEL
+29B8 ; [*08DA.0020.0002.29B8] # CIRCLED REVERSE SOLIDUS
+29B9 ; [*08DB.0020.0002.29B9] # CIRCLED PERPENDICULAR
+29BA ; [*08DC.0020.0002.29BA] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB ; [*08DD.0020.0002.29BB] # CIRCLE WITH SUPERIMPOSED X
+29BC ; [*08DE.0020.0002.29BC] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD ; [*08DF.0020.0002.29BD] # UP ARROW THROUGH CIRCLE
+29BE ; [*08E0.0020.0002.29BE] # CIRCLED WHITE BULLET
+29BF ; [*08E1.0020.0002.29BF] # CIRCLED BULLET
+29C0 ; [*08E2.0020.0002.29C0] # CIRCLED LESS-THAN
+29C1 ; [*08E3.0020.0002.29C1] # CIRCLED GREATER-THAN
+29C2 ; [*08E4.0020.0002.29C2] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3 ; [*08E5.0020.0002.29C3] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4 ; [*08E6.0020.0002.29C4] # SQUARED RISING DIAGONAL SLASH
+29C5 ; [*08E7.0020.0002.29C5] # SQUARED FALLING DIAGONAL SLASH
+29C6 ; [*08E8.0020.0002.29C6] # SQUARED ASTERISK
+29C7 ; [*08E9.0020.0002.29C7] # SQUARED SMALL CIRCLE
+29C8 ; [*08EA.0020.0002.29C8] # SQUARED SQUARE
+29C9 ; [*08EB.0020.0002.29C9] # TWO JOINED SQUARES
+29CA ; [*08EC.0020.0002.29CA] # TRIANGLE WITH DOT ABOVE
+29CB ; [*08ED.0020.0002.29CB] # TRIANGLE WITH UNDERBAR
+29CC ; [*08EE.0020.0002.29CC] # S IN TRIANGLE
+29CD ; [*08EF.0020.0002.29CD] # TRIANGLE WITH SERIFS AT BOTTOM
+29CE ; [*08F0.0020.0002.29CE] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF ; [*08F1.0020.0002.29CF] # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0 ; [*08F2.0020.0002.29D0] # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1 ; [*08F3.0020.0002.29D1] # BOWTIE WITH LEFT HALF BLACK
+29D2 ; [*08F4.0020.0002.29D2] # BOWTIE WITH RIGHT HALF BLACK
+29D3 ; [*08F5.0020.0002.29D3] # BLACK BOWTIE
+29D4 ; [*08F6.0020.0002.29D4] # TIMES WITH LEFT HALF BLACK
+29D5 ; [*08F7.0020.0002.29D5] # TIMES WITH RIGHT HALF BLACK
+29D6 ; [*08F8.0020.0002.29D6] # WHITE HOURGLASS
+29D7 ; [*08F9.0020.0002.29D7] # BLACK HOURGLASS
+29D8 ; [*08FA.0020.0002.29D8] # LEFT WIGGLY FENCE
+29D9 ; [*08FB.0020.0002.29D9] # RIGHT WIGGLY FENCE
+29DA ; [*08FC.0020.0002.29DA] # LEFT DOUBLE WIGGLY FENCE
+29DB ; [*08FD.0020.0002.29DB] # RIGHT DOUBLE WIGGLY FENCE
+29DC ; [*08FE.0020.0002.29DC] # INCOMPLETE INFINITY
+29DD ; [*08FF.0020.0002.29DD] # TIE OVER INFINITY
+29DE ; [*0900.0020.0002.29DE] # INFINITY NEGATED WITH VERTICAL BAR
+29DF ; [*0901.0020.0002.29DF] # DOUBLE-ENDED MULTIMAP
+29E0 ; [*0902.0020.0002.29E0] # SQUARE WITH CONTOURED OUTLINE
+29E1 ; [*0903.0020.0002.29E1] # INCREASES AS
+29E2 ; [*0904.0020.0002.29E2] # SHUFFLE PRODUCT
+29E3 ; [*0905.0020.0002.29E3] # EQUALS SIGN AND SLANTED PARALLEL
+29E4 ; [*0906.0020.0002.29E4] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5 ; [*0907.0020.0002.29E5] # IDENTICAL TO AND SLANTED PARALLEL
+29E6 ; [*0908.0020.0002.29E6] # GLEICH STARK
+29E7 ; [*0909.0020.0002.29E7] # THERMODYNAMIC
+29E8 ; [*090A.0020.0002.29E8] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9 ; [*090B.0020.0002.29E9] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA ; [*090C.0020.0002.29EA] # BLACK DIAMOND WITH DOWN ARROW
+29EB ; [*090D.0020.0002.29EB] # BLACK LOZENGE
+29EC ; [*090E.0020.0002.29EC] # WHITE CIRCLE WITH DOWN ARROW
+29ED ; [*090F.0020.0002.29ED] # BLACK CIRCLE WITH DOWN ARROW
+29EE ; [*0910.0020.0002.29EE] # ERROR-BARRED WHITE SQUARE
+29EF ; [*0911.0020.0002.29EF] # ERROR-BARRED BLACK SQUARE
+29F0 ; [*0912.0020.0002.29F0] # ERROR-BARRED WHITE DIAMOND
+29F1 ; [*0913.0020.0002.29F1] # ERROR-BARRED BLACK DIAMOND
+29F2 ; [*0914.0020.0002.29F2] # ERROR-BARRED WHITE CIRCLE
+29F3 ; [*0915.0020.0002.29F3] # ERROR-BARRED BLACK CIRCLE
+29F4 ; [*0916.0020.0002.29F4] # RULE-DELAYED
+29F5 ; [*0917.0020.0002.29F5] # REVERSE SOLIDUS OPERATOR
+29F6 ; [*0918.0020.0002.29F6] # SOLIDUS WITH OVERBAR
+29F7 ; [*0919.0020.0002.29F7] # REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8 ; [*091A.0020.0002.29F8] # BIG SOLIDUS
+29F9 ; [*091B.0020.0002.29F9] # BIG REVERSE SOLIDUS
+29FA ; [*091C.0020.0002.29FA] # DOUBLE PLUS
+29FB ; [*091D.0020.0002.29FB] # TRIPLE PLUS
+29FC ; [*0296.0020.0002.29FC] # LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; [*0297.0020.0002.29FD] # RIGHT-POINTING CURVED ANGLE BRACKET
+29FE ; [*091E.0020.0002.29FE] # TINY
+29FF ; [*091F.0020.0002.29FF] # MINY
+2A00 ; [*0920.0020.0002.2A00] # N-ARY CIRCLED DOT OPERATOR
+2A01 ; [*0921.0020.0002.2A01] # N-ARY CIRCLED PLUS OPERATOR
+2A02 ; [*0922.0020.0002.2A02] # N-ARY CIRCLED TIMES OPERATOR
+2A03 ; [*0923.0020.0002.2A03] # N-ARY UNION OPERATOR WITH DOT
+2A04 ; [*0924.0020.0002.2A04] # N-ARY UNION OPERATOR WITH PLUS
+2A05 ; [*0925.0020.0002.2A05] # N-ARY SQUARE INTERSECTION OPERATOR
+2A06 ; [*0926.0020.0002.2A06] # N-ARY SQUARE UNION OPERATOR
+2A07 ; [*0927.0020.0002.2A07] # TWO LOGICAL AND OPERATOR
+2A08 ; [*0928.0020.0002.2A08] # TWO LOGICAL OR OPERATOR
+2A09 ; [*0929.0020.0002.2A09] # N-ARY TIMES OPERATOR
+2A0A ; [*092A.0020.0002.2A0A] # MODULO TWO SUM
+2A0B ; [*092B.0020.0002.2A0B] # SUMMATION WITH INTEGRAL
+2A0C ; [*044B.0020.0004.2A0C][*044B.0020.0004.2A0C][*044B.0020.001F.2A0C][*044B.0020.001F.2A0C] # QUADRUPLE INTEGRAL OPERATOR; QQKN
+2A0D ; [*092C.0020.0002.2A0D] # FINITE PART INTEGRAL
+2A0E ; [*092D.0020.0002.2A0E] # INTEGRAL WITH DOUBLE STROKE
+2A0F ; [*092E.0020.0002.2A0F] # INTEGRAL AVERAGE WITH SLASH
+2A10 ; [*092F.0020.0002.2A10] # CIRCULATION FUNCTION
+2A11 ; [*0930.0020.0002.2A11] # ANTICLOCKWISE INTEGRATION
+2A12 ; [*0931.0020.0002.2A12] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13 ; [*0932.0020.0002.2A13] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14 ; [*0933.0020.0002.2A14] # LINE INTEGRATION NOT INCLUDING THE POLE
+2A15 ; [*0934.0020.0002.2A15] # INTEGRAL AROUND A POINT OPERATOR
+2A16 ; [*0935.0020.0002.2A16] # QUATERNION INTEGRAL OPERATOR
+2A17 ; [*0936.0020.0002.2A17] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18 ; [*0937.0020.0002.2A18] # INTEGRAL WITH TIMES SIGN
+2A19 ; [*0938.0020.0002.2A19] # INTEGRAL WITH INTERSECTION
+2A1A ; [*0939.0020.0002.2A1A] # INTEGRAL WITH UNION
+2A1B ; [*093A.0020.0002.2A1B] # INTEGRAL WITH OVERBAR
+2A1C ; [*093B.0020.0002.2A1C] # INTEGRAL WITH UNDERBAR
+2A1D ; [*093C.0020.0002.2A1D] # JOIN
+2A1E ; [*093D.0020.0002.2A1E] # LARGE LEFT TRIANGLE OPERATOR
+2A1F ; [*093E.0020.0002.2A1F] # Z NOTATION SCHEMA COMPOSITION
+2A20 ; [*093F.0020.0002.2A20] # Z NOTATION SCHEMA PIPING
+2A21 ; [*0940.0020.0002.2A21] # Z NOTATION SCHEMA PROJECTION
+2A22 ; [*0941.0020.0002.2A22] # PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23 ; [*0942.0020.0002.2A23] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24 ; [*0943.0020.0002.2A24] # PLUS SIGN WITH TILDE ABOVE
+2A25 ; [*0944.0020.0002.2A25] # PLUS SIGN WITH DOT BELOW
+2A26 ; [*0945.0020.0002.2A26] # PLUS SIGN WITH TILDE BELOW
+2A27 ; [*0946.0020.0002.2A27] # PLUS SIGN WITH SUBSCRIPT TWO
+2A28 ; [*0947.0020.0002.2A28] # PLUS SIGN WITH BLACK TRIANGLE
+2A29 ; [*0948.0020.0002.2A29] # MINUS SIGN WITH COMMA ABOVE
+2A2A ; [*0949.0020.0002.2A2A] # MINUS SIGN WITH DOT BELOW
+2A2B ; [*094A.0020.0002.2A2B] # MINUS SIGN WITH FALLING DOTS
+2A2C ; [*094B.0020.0002.2A2C] # MINUS SIGN WITH RISING DOTS
+2A2D ; [*094C.0020.0002.2A2D] # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E ; [*094D.0020.0002.2A2E] # PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F ; [*094E.0020.0002.2A2F] # VECTOR OR CROSS PRODUCT
+2A30 ; [*094F.0020.0002.2A30] # MULTIPLICATION SIGN WITH DOT ABOVE
+2A31 ; [*0950.0020.0002.2A31] # MULTIPLICATION SIGN WITH UNDERBAR
+2A32 ; [*0951.0020.0002.2A32] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33 ; [*0952.0020.0002.2A33] # SMASH PRODUCT
+2A34 ; [*0953.0020.0002.2A34] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35 ; [*0954.0020.0002.2A35] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36 ; [*0955.0020.0002.2A36] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37 ; [*0956.0020.0002.2A37] # MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38 ; [*0957.0020.0002.2A38] # CIRCLED DIVISION SIGN
+2A39 ; [*0958.0020.0002.2A39] # PLUS SIGN IN TRIANGLE
+2A3A ; [*0959.0020.0002.2A3A] # MINUS SIGN IN TRIANGLE
+2A3B ; [*095A.0020.0002.2A3B] # MULTIPLICATION SIGN IN TRIANGLE
+2A3C ; [*095B.0020.0002.2A3C] # INTERIOR PRODUCT
+2A3D ; [*095C.0020.0002.2A3D] # RIGHTHAND INTERIOR PRODUCT
+2A3E ; [*095D.0020.0002.2A3E] # Z NOTATION RELATIONAL COMPOSITION
+2A3F ; [*095E.0020.0002.2A3F] # AMALGAMATION OR COPRODUCT
+2A40 ; [*095F.0020.0002.2A40] # INTERSECTION WITH DOT
+2A41 ; [*0960.0020.0002.2A41] # UNION WITH MINUS SIGN
+2A42 ; [*0961.0020.0002.2A42] # UNION WITH OVERBAR
+2A43 ; [*0962.0020.0002.2A43] # INTERSECTION WITH OVERBAR
+2A44 ; [*0963.0020.0002.2A44] # INTERSECTION WITH LOGICAL AND
+2A45 ; [*0964.0020.0002.2A45] # UNION WITH LOGICAL OR
+2A46 ; [*0965.0020.0002.2A46] # UNION ABOVE INTERSECTION
+2A47 ; [*0966.0020.0002.2A47] # INTERSECTION ABOVE UNION
+2A48 ; [*0967.0020.0002.2A48] # UNION ABOVE BAR ABOVE INTERSECTION
+2A49 ; [*0968.0020.0002.2A49] # INTERSECTION ABOVE BAR ABOVE UNION
+2A4A ; [*0969.0020.0002.2A4A] # UNION BESIDE AND JOINED WITH UNION
+2A4B ; [*096A.0020.0002.2A4B] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C ; [*096B.0020.0002.2A4C] # CLOSED UNION WITH SERIFS
+2A4D ; [*096C.0020.0002.2A4D] # CLOSED INTERSECTION WITH SERIFS
+2A4E ; [*096D.0020.0002.2A4E] # DOUBLE SQUARE INTERSECTION
+2A4F ; [*096E.0020.0002.2A4F] # DOUBLE SQUARE UNION
+2A50 ; [*096F.0020.0002.2A50] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51 ; [*0970.0020.0002.2A51] # LOGICAL AND WITH DOT ABOVE
+2A52 ; [*0971.0020.0002.2A52] # LOGICAL OR WITH DOT ABOVE
+2A53 ; [*0972.0020.0002.2A53] # DOUBLE LOGICAL AND
+2A54 ; [*0973.0020.0002.2A54] # DOUBLE LOGICAL OR
+2A55 ; [*0974.0020.0002.2A55] # TWO INTERSECTING LOGICAL AND
+2A56 ; [*0975.0020.0002.2A56] # TWO INTERSECTING LOGICAL OR
+2A57 ; [*0976.0020.0002.2A57] # SLOPING LARGE OR
+2A58 ; [*0977.0020.0002.2A58] # SLOPING LARGE AND
+2A59 ; [*0978.0020.0002.2A59] # LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A ; [*0979.0020.0002.2A5A] # LOGICAL AND WITH MIDDLE STEM
+2A5B ; [*097A.0020.0002.2A5B] # LOGICAL OR WITH MIDDLE STEM
+2A5C ; [*097B.0020.0002.2A5C] # LOGICAL AND WITH HORIZONTAL DASH
+2A5D ; [*097C.0020.0002.2A5D] # LOGICAL OR WITH HORIZONTAL DASH
+2A5E ; [*097D.0020.0002.2A5E] # LOGICAL AND WITH DOUBLE OVERBAR
+2A5F ; [*097E.0020.0002.2A5F] # LOGICAL AND WITH UNDERBAR
+2A60 ; [*097F.0020.0002.2A60] # LOGICAL AND WITH DOUBLE UNDERBAR
+2A61 ; [*0980.0020.0002.2A61] # SMALL VEE WITH UNDERBAR
+2A62 ; [*0981.0020.0002.2A62] # LOGICAL OR WITH DOUBLE OVERBAR
+2A63 ; [*0982.0020.0002.2A63] # LOGICAL OR WITH DOUBLE UNDERBAR
+2A64 ; [*0983.0020.0002.2A64] # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65 ; [*0984.0020.0002.2A65] # Z NOTATION RANGE ANTIRESTRICTION
+2A66 ; [*0985.0020.0002.2A66] # EQUALS SIGN WITH DOT BELOW
+2A67 ; [*0986.0020.0002.2A67] # IDENTICAL WITH DOT ABOVE
+2A68 ; [*0987.0020.0002.2A68] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69 ; [*0988.0020.0002.2A69] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A ; [*0989.0020.0002.2A6A] # TILDE OPERATOR WITH DOT ABOVE
+2A6B ; [*098A.0020.0002.2A6B] # TILDE OPERATOR WITH RISING DOTS
+2A6C ; [*098B.0020.0002.2A6C] # SIMILAR MINUS SIMILAR
+2A6D ; [*098C.0020.0002.2A6D] # CONGRUENT WITH DOT ABOVE
+2A6E ; [*098D.0020.0002.2A6E] # EQUALS WITH ASTERISK
+2A6F ; [*098E.0020.0002.2A6F] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70 ; [*098F.0020.0002.2A70] # APPROXIMATELY EQUAL OR EQUAL TO
+2A71 ; [*0990.0020.0002.2A71] # EQUALS SIGN ABOVE PLUS SIGN
+2A72 ; [*0991.0020.0002.2A72] # PLUS SIGN ABOVE EQUALS SIGN
+2A73 ; [*0992.0020.0002.2A73] # EQUALS SIGN ABOVE TILDE OPERATOR
+2A74 ; [*023D.0020.0004.2A74][*023D.0020.0004.2A74][*042D.0020.001F.2A74] # DOUBLE COLON EQUAL; QQKN
+2A75 ; [*042D.0020.0004.2A75][*042D.0020.0004.2A75] # TWO CONSECUTIVE EQUALS SIGNS; QQKN
+2A76 ; [*042D.0020.0004.2A76][*042D.0020.0004.2A76][*042D.0020.001F.2A76] # THREE CONSECUTIVE EQUALS SIGNS; QQKN
+2A77 ; [*0993.0020.0002.2A77] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78 ; [*0994.0020.0002.2A78] # EQUIVALENT WITH FOUR DOTS ABOVE
+2A79 ; [*0995.0020.0002.2A79] # LESS-THAN WITH CIRCLE INSIDE
+2A7A ; [*0996.0020.0002.2A7A] # GREATER-THAN WITH CIRCLE INSIDE
+2A7B ; [*0997.0020.0002.2A7B] # LESS-THAN WITH QUESTION MARK ABOVE
+2A7C ; [*0998.0020.0002.2A7C] # GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D ; [*0999.0020.0002.2A7D] # LESS-THAN OR SLANTED EQUAL TO
+2A7E ; [*099A.0020.0002.2A7E] # GREATER-THAN OR SLANTED EQUAL TO
+2A7F ; [*099B.0020.0002.2A7F] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80 ; [*099C.0020.0002.2A80] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81 ; [*099D.0020.0002.2A81] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82 ; [*099E.0020.0002.2A82] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83 ; [*099F.0020.0002.2A83] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84 ; [*09A0.0020.0002.2A84] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85 ; [*09A1.0020.0002.2A85] # LESS-THAN OR APPROXIMATE
+2A86 ; [*09A2.0020.0002.2A86] # GREATER-THAN OR APPROXIMATE
+2A87 ; [*09A3.0020.0002.2A87] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88 ; [*09A4.0020.0002.2A88] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89 ; [*09A5.0020.0002.2A89] # LESS-THAN AND NOT APPROXIMATE
+2A8A ; [*09A6.0020.0002.2A8A] # GREATER-THAN AND NOT APPROXIMATE
+2A8B ; [*09A7.0020.0002.2A8B] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C ; [*09A8.0020.0002.2A8C] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D ; [*09A9.0020.0002.2A8D] # LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E ; [*09AA.0020.0002.2A8E] # GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F ; [*09AB.0020.0002.2A8F] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90 ; [*09AC.0020.0002.2A90] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91 ; [*09AD.0020.0002.2A91] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92 ; [*09AE.0020.0002.2A92] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93 ; [*09AF.0020.0002.2A93] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94 ; [*09B0.0020.0002.2A94] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95 ; [*09B1.0020.0002.2A95] # SLANTED EQUAL TO OR LESS-THAN
+2A96 ; [*09B2.0020.0002.2A96] # SLANTED EQUAL TO OR GREATER-THAN
+2A97 ; [*09B3.0020.0002.2A97] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98 ; [*09B4.0020.0002.2A98] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99 ; [*09B5.0020.0002.2A99] # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A ; [*09B6.0020.0002.2A9A] # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B ; [*09B7.0020.0002.2A9B] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C ; [*09B8.0020.0002.2A9C] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D ; [*09B9.0020.0002.2A9D] # SIMILAR OR LESS-THAN
+2A9E ; [*09BA.0020.0002.2A9E] # SIMILAR OR GREATER-THAN
+2A9F ; [*09BB.0020.0002.2A9F] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0 ; [*09BC.0020.0002.2AA0] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1 ; [*09BD.0020.0002.2AA1] # DOUBLE NESTED LESS-THAN
+2AA2 ; [*09BE.0020.0002.2AA2] # DOUBLE NESTED GREATER-THAN
+2AA3 ; [*09BF.0020.0002.2AA3] # DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4 ; [*09C0.0020.0002.2AA4] # GREATER-THAN OVERLAPPING LESS-THAN
+2AA5 ; [*09C1.0020.0002.2AA5] # GREATER-THAN BESIDE LESS-THAN
+2AA6 ; [*09C2.0020.0002.2AA6] # LESS-THAN CLOSED BY CURVE
+2AA7 ; [*09C3.0020.0002.2AA7] # GREATER-THAN CLOSED BY CURVE
+2AA8 ; [*09C4.0020.0002.2AA8] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9 ; [*09C5.0020.0002.2AA9] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA ; [*09C6.0020.0002.2AAA] # SMALLER THAN
+2AAB ; [*09C7.0020.0002.2AAB] # LARGER THAN
+2AAC ; [*09C8.0020.0002.2AAC] # SMALLER THAN OR EQUAL TO
+2AAD ; [*09C9.0020.0002.2AAD] # LARGER THAN OR EQUAL TO
+2AAE ; [*09CA.0020.0002.2AAE] # EQUALS SIGN WITH BUMPY ABOVE
+2AAF ; [*09CB.0020.0002.2AAF] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0 ; [*09CC.0020.0002.2AB0] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1 ; [*09CD.0020.0002.2AB1] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2 ; [*09CE.0020.0002.2AB2] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3 ; [*09CF.0020.0002.2AB3] # PRECEDES ABOVE EQUALS SIGN
+2AB4 ; [*09D0.0020.0002.2AB4] # SUCCEEDS ABOVE EQUALS SIGN
+2AB5 ; [*09D1.0020.0002.2AB5] # PRECEDES ABOVE NOT EQUAL TO
+2AB6 ; [*09D2.0020.0002.2AB6] # SUCCEEDS ABOVE NOT EQUAL TO
+2AB7 ; [*09D3.0020.0002.2AB7] # PRECEDES ABOVE ALMOST EQUAL TO
+2AB8 ; [*09D4.0020.0002.2AB8] # SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9 ; [*09D5.0020.0002.2AB9] # PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA ; [*09D6.0020.0002.2ABA] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB ; [*09D7.0020.0002.2ABB] # DOUBLE PRECEDES
+2ABC ; [*09D8.0020.0002.2ABC] # DOUBLE SUCCEEDS
+2ABD ; [*09D9.0020.0002.2ABD] # SUBSET WITH DOT
+2ABE ; [*09DA.0020.0002.2ABE] # SUPERSET WITH DOT
+2ABF ; [*09DB.0020.0002.2ABF] # SUBSET WITH PLUS SIGN BELOW
+2AC0 ; [*09DC.0020.0002.2AC0] # SUPERSET WITH PLUS SIGN BELOW
+2AC1 ; [*09DD.0020.0002.2AC1] # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2 ; [*09DE.0020.0002.2AC2] # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3 ; [*09DF.0020.0002.2AC3] # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4 ; [*09E0.0020.0002.2AC4] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5 ; [*09E1.0020.0002.2AC5] # SUBSET OF ABOVE EQUALS SIGN
+2AC6 ; [*09E2.0020.0002.2AC6] # SUPERSET OF ABOVE EQUALS SIGN
+2AC7 ; [*09E3.0020.0002.2AC7] # SUBSET OF ABOVE TILDE OPERATOR
+2AC8 ; [*09E4.0020.0002.2AC8] # SUPERSET OF ABOVE TILDE OPERATOR
+2AC9 ; [*09E5.0020.0002.2AC9] # SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA ; [*09E6.0020.0002.2ACA] # SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB ; [*09E7.0020.0002.2ACB] # SUBSET OF ABOVE NOT EQUAL TO
+2ACC ; [*09E8.0020.0002.2ACC] # SUPERSET OF ABOVE NOT EQUAL TO
+2ACD ; [*09E9.0020.0002.2ACD] # SQUARE LEFT OPEN BOX OPERATOR
+2ACE ; [*09EA.0020.0002.2ACE] # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF ; [*09EB.0020.0002.2ACF] # CLOSED SUBSET
+2AD0 ; [*09EC.0020.0002.2AD0] # CLOSED SUPERSET
+2AD1 ; [*09ED.0020.0002.2AD1] # CLOSED SUBSET OR EQUAL TO
+2AD2 ; [*09EE.0020.0002.2AD2] # CLOSED SUPERSET OR EQUAL TO
+2AD3 ; [*09EF.0020.0002.2AD3] # SUBSET ABOVE SUPERSET
+2AD4 ; [*09F0.0020.0002.2AD4] # SUPERSET ABOVE SUBSET
+2AD5 ; [*09F1.0020.0002.2AD5] # SUBSET ABOVE SUBSET
+2AD6 ; [*09F2.0020.0002.2AD6] # SUPERSET ABOVE SUPERSET
+2AD7 ; [*09F3.0020.0002.2AD7] # SUPERSET BESIDE SUBSET
+2AD8 ; [*09F4.0020.0002.2AD8] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9 ; [*09F5.0020.0002.2AD9] # ELEMENT OF OPENING DOWNWARDS
+2ADA ; [*09F6.0020.0002.2ADA] # PITCHFORK WITH TEE TOP
+2ADB ; [*09F7.0020.0002.2ADB] # TRANSVERSAL INTERSECTION
+2ADC ; [*09F8.0020.0002.2ADD][.0000.0054.0002.0338] # FORKING; QQCM
+2ADD ; [*09F8.0020.0002.2ADD] # NONFORKING
+2ADE ; [*09F9.0020.0002.2ADE] # SHORT LEFT TACK
+2ADF ; [*09FA.0020.0002.2ADF] # SHORT DOWN TACK
+2AE0 ; [*09FB.0020.0002.2AE0] # SHORT UP TACK
+2AE1 ; [*09FC.0020.0002.2AE1] # PERPENDICULAR WITH S
+2AE2 ; [*09FD.0020.0002.2AE2] # VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3 ; [*09FE.0020.0002.2AE3] # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4 ; [*09FF.0020.0002.2AE4] # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5 ; [*0A00.0020.0002.2AE5] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6 ; [*0A01.0020.0002.2AE6] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7 ; [*0A02.0020.0002.2AE7] # SHORT DOWN TACK WITH OVERBAR
+2AE8 ; [*0A03.0020.0002.2AE8] # SHORT UP TACK WITH UNDERBAR
+2AE9 ; [*0A04.0020.0002.2AE9] # SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA ; [*0A05.0020.0002.2AEA] # DOUBLE DOWN TACK
+2AEB ; [*0A06.0020.0002.2AEB] # DOUBLE UP TACK
+2AEC ; [*0A07.0020.0002.2AEC] # DOUBLE STROKE NOT SIGN
+2AED ; [*0A08.0020.0002.2AED] # REVERSED DOUBLE STROKE NOT SIGN
+2AEE ; [*0A09.0020.0002.2AEE] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF ; [*0A0A.0020.0002.2AEF] # VERTICAL LINE WITH CIRCLE ABOVE
+2AF0 ; [*0A0B.0020.0002.2AF0] # VERTICAL LINE WITH CIRCLE BELOW
+2AF1 ; [*0A0C.0020.0002.2AF1] # DOWN TACK WITH CIRCLE BELOW
+2AF2 ; [*0A0D.0020.0002.2AF2] # PARALLEL WITH HORIZONTAL STROKE
+2AF3 ; [*0A0E.0020.0002.2AF3] # PARALLEL WITH TILDE OPERATOR
+2AF4 ; [*0A0F.0020.0002.2AF4] # TRIPLE VERTICAL BAR BINARY RELATION
+2AF5 ; [*0A10.0020.0002.2AF5] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6 ; [*0A11.0020.0002.2AF6] # TRIPLE COLON OPERATOR
+2AF7 ; [*0A12.0020.0002.2AF7] # TRIPLE NESTED LESS-THAN
+2AF8 ; [*0A13.0020.0002.2AF8] # TRIPLE NESTED GREATER-THAN
+2AF9 ; [*0A14.0020.0002.2AF9] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA ; [*0A15.0020.0002.2AFA] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB ; [*0A16.0020.0002.2AFB] # TRIPLE SOLIDUS BINARY RELATION
+2AFC ; [*0A17.0020.0002.2AFC] # LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD ; [*0A18.0020.0002.2AFD] # DOUBLE SOLIDUS OPERATOR
+2AFE ; [*0A19.0020.0002.2AFE] # WHITE VERTICAL BAR
+2AFF ; [*0A1A.0020.0002.2AFF] # N-ARY WHITE VERTICAL BAR
+2B00 ; [*0A1B.0020.0002.2B00] # NORTH EAST WHITE ARROW
+2B01 ; [*0A1C.0020.0002.2B01] # NORTH WEST WHITE ARROW
+2B02 ; [*0A1D.0020.0002.2B02] # SOUTH EAST WHITE ARROW
+2B03 ; [*0A1E.0020.0002.2B03] # SOUTH WEST WHITE ARROW
+2B04 ; [*0A1F.0020.0002.2B04] # LEFT RIGHT WHITE ARROW
+2B05 ; [*0A20.0020.0002.2B05] # LEFTWARDS BLACK ARROW
+2B06 ; [*0A21.0020.0002.2B06] # UPWARDS BLACK ARROW
+2B07 ; [*0A22.0020.0002.2B07] # DOWNWARDS BLACK ARROW
+2B08 ; [*0A23.0020.0002.2B08] # NORTH EAST BLACK ARROW
+2B09 ; [*0A24.0020.0002.2B09] # NORTH WEST BLACK ARROW
+2B0A ; [*0A25.0020.0002.2B0A] # SOUTH EAST BLACK ARROW
+2B0B ; [*0A26.0020.0002.2B0B] # SOUTH WEST BLACK ARROW
+2B0C ; [*0A27.0020.0002.2B0C] # LEFT RIGHT BLACK ARROW
+2B0D ; [*0A28.0020.0002.2B0D] # UP DOWN BLACK ARROW
+2FF0 ; [*0DAF.0020.0002.2FF0] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1 ; [*0DB0.0020.0002.2FF1] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2 ; [*0DB1.0020.0002.2FF2] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3 ; [*0DB2.0020.0002.2FF3] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4 ; [*0DB3.0020.0002.2FF4] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5 ; [*0DB4.0020.0002.2FF5] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6 ; [*0DB5.0020.0002.2FF6] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7 ; [*0DB6.0020.0002.2FF7] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8 ; [*0DB7.0020.0002.2FF8] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9 ; [*0DB8.0020.0002.2FF9] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA ; [*0DB9.0020.0002.2FFA] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB ; [*0DBA.0020.0002.2FFB] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000 ; [*0209.0020.0003.3000] # IDEOGRAPHIC SPACE; QQK
+3001 ; [*0237.0020.0002.3001] # IDEOGRAPHIC COMMA
+3002 ; [*0266.0020.0002.3002] # IDEOGRAPHIC FULL STOP
+3003 ; [*02E2.0020.0002.3003] # DITTO MARK
+3004 ; [*0DBB.0020.0002.3004] # JAPANESE INDUSTRIAL STANDARD SYMBOL
+3008 ; [*02AE.0020.0002.3008] # LEFT ANGLE BRACKET
+3009 ; [*02AF.0020.0002.3009] # RIGHT ANGLE BRACKET
+300A ; [*02B0.0020.0002.300A] # LEFT DOUBLE ANGLE BRACKET
+300B ; [*02B1.0020.0002.300B] # RIGHT DOUBLE ANGLE BRACKET
+300C ; [*02B2.0020.0002.300C] # LEFT CORNER BRACKET
+300D ; [*02B3.0020.0002.300D] # RIGHT CORNER BRACKET
+300E ; [*02B4.0020.0002.300E] # LEFT WHITE CORNER BRACKET
+300F ; [*02B5.0020.0002.300F] # RIGHT WHITE CORNER BRACKET
+3010 ; [*02B6.0020.0002.3010] # LEFT BLACK LENTICULAR BRACKET
+3011 ; [*02B7.0020.0002.3011] # RIGHT BLACK LENTICULAR BRACKET
+3012 ; [*0DBC.0020.0002.3012] # POSTAL MARK
+3013 ; [*0DBD.0020.0002.3013] # GETA MARK
+3014 ; [*02B8.0020.0002.3014] # LEFT TORTOISE SHELL BRACKET
+3015 ; [*02B9.0020.0002.3015] # RIGHT TORTOISE SHELL BRACKET
+3016 ; [*02BA.0020.0002.3016] # LEFT WHITE LENTICULAR BRACKET
+3017 ; [*02BB.0020.0002.3017] # RIGHT WHITE LENTICULAR BRACKET
+3018 ; [*02BC.0020.0002.3018] # LEFT WHITE TORTOISE SHELL BRACKET
+3019 ; [*02BD.0020.0002.3019] # RIGHT WHITE TORTOISE SHELL BRACKET
+301A ; [*02BE.0020.0002.301A] # LEFT WHITE SQUARE BRACKET
+301B ; [*02BF.0020.0002.301B] # RIGHT WHITE SQUARE BRACKET
+301C ; [*022B.0020.0002.301C] # WAVE DASH
+301D ; [*0283.0020.0002.301D] # REVERSED DOUBLE PRIME QUOTATION MARK
+301E ; [*0284.0020.0002.301E] # DOUBLE PRIME QUOTATION MARK
+301F ; [*0285.0020.0002.301F] # LOW DOUBLE PRIME QUOTATION MARK
+3020 ; [*0DBE.0020.0002.3020] # POSTAL MARK FACE
+3030 ; [*022C.0020.0002.3030] # WAVY DASH
+3036 ; [*0DBC.0020.0004.3036] # CIRCLED POSTAL MARK; QQK
+3037 ; [*0DBF.0020.0002.3037] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+303D ; [*02E3.0020.0002.303D] # PART ALTERNATION MARK
+303E ; [*0DC0.0020.0002.303E] # IDEOGRAPHIC VARIATION INDICATOR
+303F ; [*0DC1.0020.0002.303F] # IDEOGRAPHIC HALF FILL SPACE
+309B ; [*021E.0020.0002.309B] # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C ; [*021F.0020.0002.309C] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30A0 ; [*022D.0020.0002.30A0] # KATAKANA-HIRAGANA DOUBLE HYPHEN
+30FB ; [*022E.0020.0002.30FB] # KATAKANA MIDDLE DOT
+3190 ; [*0DC2.0020.0002.3190] # IDEOGRAPHIC ANNOTATION LINKING MARK
+3191 ; [*0DC3.0020.0002.3191] # IDEOGRAPHIC ANNOTATION REVERSE MARK
+327F ; [*0DC4.0020.0002.327F] # KOREAN STANDARD SYMBOL
+4DC0 ; [*0B37.0020.0002.4DC0] # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1 ; [*0B38.0020.0002.4DC1] # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2 ; [*0B39.0020.0002.4DC2] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3 ; [*0B3A.0020.0002.4DC3] # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4 ; [*0B3B.0020.0002.4DC4] # HEXAGRAM FOR WAITING
+4DC5 ; [*0B3C.0020.0002.4DC5] # HEXAGRAM FOR CONFLICT
+4DC6 ; [*0B3D.0020.0002.4DC6] # HEXAGRAM FOR THE ARMY
+4DC7 ; [*0B3E.0020.0002.4DC7] # HEXAGRAM FOR HOLDING TOGETHER
+4DC8 ; [*0B3F.0020.0002.4DC8] # HEXAGRAM FOR SMALL TAMING
+4DC9 ; [*0B40.0020.0002.4DC9] # HEXAGRAM FOR TREADING
+4DCA ; [*0B41.0020.0002.4DCA] # HEXAGRAM FOR PEACE
+4DCB ; [*0B42.0020.0002.4DCB] # HEXAGRAM FOR STANDSTILL
+4DCC ; [*0B43.0020.0002.4DCC] # HEXAGRAM FOR FELLOWSHIP
+4DCD ; [*0B44.0020.0002.4DCD] # HEXAGRAM FOR GREAT POSSESSION
+4DCE ; [*0B45.0020.0002.4DCE] # HEXAGRAM FOR MODESTY
+4DCF ; [*0B46.0020.0002.4DCF] # HEXAGRAM FOR ENTHUSIASM
+4DD0 ; [*0B47.0020.0002.4DD0] # HEXAGRAM FOR FOLLOWING
+4DD1 ; [*0B48.0020.0002.4DD1] # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2 ; [*0B49.0020.0002.4DD2] # HEXAGRAM FOR APPROACH
+4DD3 ; [*0B4A.0020.0002.4DD3] # HEXAGRAM FOR CONTEMPLATION
+4DD4 ; [*0B4B.0020.0002.4DD4] # HEXAGRAM FOR BITING THROUGH
+4DD5 ; [*0B4C.0020.0002.4DD5] # HEXAGRAM FOR GRACE
+4DD6 ; [*0B4D.0020.0002.4DD6] # HEXAGRAM FOR SPLITTING APART
+4DD7 ; [*0B4E.0020.0002.4DD7] # HEXAGRAM FOR RETURN
+4DD8 ; [*0B4F.0020.0002.4DD8] # HEXAGRAM FOR INNOCENCE
+4DD9 ; [*0B50.0020.0002.4DD9] # HEXAGRAM FOR GREAT TAMING
+4DDA ; [*0B51.0020.0002.4DDA] # HEXAGRAM FOR MOUTH CORNERS
+4DDB ; [*0B52.0020.0002.4DDB] # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC ; [*0B53.0020.0002.4DDC] # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD ; [*0B54.0020.0002.4DDD] # HEXAGRAM FOR THE CLINGING FIRE
+4DDE ; [*0B55.0020.0002.4DDE] # HEXAGRAM FOR INFLUENCE
+4DDF ; [*0B56.0020.0002.4DDF] # HEXAGRAM FOR DURATION
+4DE0 ; [*0B57.0020.0002.4DE0] # HEXAGRAM FOR RETREAT
+4DE1 ; [*0B58.0020.0002.4DE1] # HEXAGRAM FOR GREAT POWER
+4DE2 ; [*0B59.0020.0002.4DE2] # HEXAGRAM FOR PROGRESS
+4DE3 ; [*0B5A.0020.0002.4DE3] # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4 ; [*0B5B.0020.0002.4DE4] # HEXAGRAM FOR THE FAMILY
+4DE5 ; [*0B5C.0020.0002.4DE5] # HEXAGRAM FOR OPPOSITION
+4DE6 ; [*0B5D.0020.0002.4DE6] # HEXAGRAM FOR OBSTRUCTION
+4DE7 ; [*0B5E.0020.0002.4DE7] # HEXAGRAM FOR DELIVERANCE
+4DE8 ; [*0B5F.0020.0002.4DE8] # HEXAGRAM FOR DECREASE
+4DE9 ; [*0B60.0020.0002.4DE9] # HEXAGRAM FOR INCREASE
+4DEA ; [*0B61.0020.0002.4DEA] # HEXAGRAM FOR BREAKTHROUGH
+4DEB ; [*0B62.0020.0002.4DEB] # HEXAGRAM FOR COMING TO MEET
+4DEC ; [*0B63.0020.0002.4DEC] # HEXAGRAM FOR GATHERING TOGETHER
+4DED ; [*0B64.0020.0002.4DED] # HEXAGRAM FOR PUSHING UPWARD
+4DEE ; [*0B65.0020.0002.4DEE] # HEXAGRAM FOR OPPRESSION
+4DEF ; [*0B66.0020.0002.4DEF] # HEXAGRAM FOR THE WELL
+4DF0 ; [*0B67.0020.0002.4DF0] # HEXAGRAM FOR REVOLUTION
+4DF1 ; [*0B68.0020.0002.4DF1] # HEXAGRAM FOR THE CAULDRON
+4DF2 ; [*0B69.0020.0002.4DF2] # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3 ; [*0B6A.0020.0002.4DF3] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4 ; [*0B6B.0020.0002.4DF4] # HEXAGRAM FOR DEVELOPMENT
+4DF5 ; [*0B6C.0020.0002.4DF5] # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6 ; [*0B6D.0020.0002.4DF6] # HEXAGRAM FOR ABUNDANCE
+4DF7 ; [*0B6E.0020.0002.4DF7] # HEXAGRAM FOR THE WANDERER
+4DF8 ; [*0B6F.0020.0002.4DF8] # HEXAGRAM FOR THE GENTLE WIND
+4DF9 ; [*0B70.0020.0002.4DF9] # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA ; [*0B71.0020.0002.4DFA] # HEXAGRAM FOR DISPERSION
+4DFB ; [*0B72.0020.0002.4DFB] # HEXAGRAM FOR LIMITATION
+4DFC ; [*0B73.0020.0002.4DFC] # HEXAGRAM FOR INNER TRUTH
+4DFD ; [*0B74.0020.0002.4DFD] # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE ; [*0B75.0020.0002.4DFE] # HEXAGRAM FOR AFTER COMPLETION
+4DFF ; [*0B76.0020.0002.4DFF] # HEXAGRAM FOR BEFORE COMPLETION
+A490 ; [*0BCE.0020.0002.A490] # YI RADICAL QOT
+A491 ; [*0BCF.0020.0002.A491] # YI RADICAL LI
+A492 ; [*0BD0.0020.0002.A492] # YI RADICAL KIT
+A493 ; [*0BD1.0020.0002.A493] # YI RADICAL NYIP
+A494 ; [*0BD2.0020.0002.A494] # YI RADICAL CYP
+A495 ; [*0BD3.0020.0002.A495] # YI RADICAL SSI
+A496 ; [*0BD4.0020.0002.A496] # YI RADICAL GGOP
+A497 ; [*0BD5.0020.0002.A497] # YI RADICAL GEP
+A498 ; [*0BD6.0020.0002.A498] # YI RADICAL MI
+A499 ; [*0BD7.0020.0002.A499] # YI RADICAL HXIT
+A49A ; [*0BD8.0020.0002.A49A] # YI RADICAL LYR
+A49B ; [*0BD9.0020.0002.A49B] # YI RADICAL BBUT
+A49C ; [*0BDA.0020.0002.A49C] # YI RADICAL MOP
+A49D ; [*0BDB.0020.0002.A49D] # YI RADICAL YO
+A49E ; [*0BDC.0020.0002.A49E] # YI RADICAL PUT
+A49F ; [*0BDD.0020.0002.A49F] # YI RADICAL HXUO
+A4A0 ; [*0BDE.0020.0002.A4A0] # YI RADICAL TAT
+A4A1 ; [*0BDF.0020.0002.A4A1] # YI RADICAL GA
+A4A2 ; [*0BE0.0020.0002.A4A2] # YI RADICAL ZUP
+A4A3 ; [*0BE1.0020.0002.A4A3] # YI RADICAL CYT
+A4A4 ; [*0BE2.0020.0002.A4A4] # YI RADICAL DDUR
+A4A5 ; [*0BE3.0020.0002.A4A5] # YI RADICAL BUR
+A4A6 ; [*0BE4.0020.0002.A4A6] # YI RADICAL GGUO
+A4A7 ; [*0BE5.0020.0002.A4A7] # YI RADICAL NYOP
+A4A8 ; [*0BE6.0020.0002.A4A8] # YI RADICAL TU
+A4A9 ; [*0BE7.0020.0002.A4A9] # YI RADICAL OP
+A4AA ; [*0BE8.0020.0002.A4AA] # YI RADICAL JJUT
+A4AB ; [*0BE9.0020.0002.A4AB] # YI RADICAL ZOT
+A4AC ; [*0BEA.0020.0002.A4AC] # YI RADICAL PYT
+A4AD ; [*0BEB.0020.0002.A4AD] # YI RADICAL HMO
+A4AE ; [*0BEC.0020.0002.A4AE] # YI RADICAL YIT
+A4AF ; [*0BED.0020.0002.A4AF] # YI RADICAL VUR
+A4B0 ; [*0BEE.0020.0002.A4B0] # YI RADICAL SHY
+A4B1 ; [*0BEF.0020.0002.A4B1] # YI RADICAL VEP
+A4B2 ; [*0BF0.0020.0002.A4B2] # YI RADICAL ZA
+A4B3 ; [*0BF1.0020.0002.A4B3] # YI RADICAL JO
+A4B4 ; [*0BF2.0020.0002.A4B4] # YI RADICAL NZUP
+A4B5 ; [*0BF3.0020.0002.A4B5] # YI RADICAL JJY
+A4B6 ; [*0BF4.0020.0002.A4B6] # YI RADICAL GOT
+A4B7 ; [*0BF5.0020.0002.A4B7] # YI RADICAL JJIE
+A4B8 ; [*0BF6.0020.0002.A4B8] # YI RADICAL WO
+A4B9 ; [*0BF7.0020.0002.A4B9] # YI RADICAL DU
+A4BA ; [*0BF8.0020.0002.A4BA] # YI RADICAL SHUR
+A4BB ; [*0BF9.0020.0002.A4BB] # YI RADICAL LIE
+A4BC ; [*0BFA.0020.0002.A4BC] # YI RADICAL CY
+A4BD ; [*0BFB.0020.0002.A4BD] # YI RADICAL CUOP
+A4BE ; [*0BFC.0020.0002.A4BE] # YI RADICAL CIP
+A4BF ; [*0BFD.0020.0002.A4BF] # YI RADICAL HXOP
+A4C0 ; [*0BFE.0020.0002.A4C0] # YI RADICAL SHAT
+A4C1 ; [*0BFF.0020.0002.A4C1] # YI RADICAL ZUR
+A4C2 ; [*0C00.0020.0002.A4C2] # YI RADICAL SHOP
+A4C3 ; [*0C01.0020.0002.A4C3] # YI RADICAL CHE
+A4C4 ; [*0C02.0020.0002.A4C4] # YI RADICAL ZZIET
+A4C5 ; [*0C03.0020.0002.A4C5] # YI RADICAL NBIE
+A4C6 ; [*0C04.0020.0002.A4C6] # YI RADICAL KE
+FB29 ; [*0428.0020.0005.FB29] # HEBREW LETTER ALTERNATIVE PLUS SIGN; QQK
+FD3E ; [*02C0.0020.0002.FD3E] # ORNATE LEFT PARENTHESIS
+FD3F ; [*02C1.0020.0002.FD3F] # ORNATE RIGHT PARENTHESIS
+FDFD ; [*034F.0020.0002.FDFD] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE21 ; [.0000.0000.0000.FE21] # COMBINING LIGATURE RIGHT HALF
+FE23 ; [.0000.0000.0000.FE23] # COMBINING DOUBLE TILDE RIGHT HALF
+FE30 ; [*025D.0020.0016.FE30][*025D.0020.0016.FE30] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER; QQKN
+FE31 ; [*0228.0020.0016.FE31] # PRESENTATION FORM FOR VERTICAL EM DASH; QQK
+FE32 ; [*0227.0020.0016.FE32] # PRESENTATION FORM FOR VERTICAL EN DASH; QQK
+FE33 ; [*021B.0020.0016.FE33] # PRESENTATION FORM FOR VERTICAL LOW LINE; QQK
+FE34 ; [*021B.0020.0016.FE34] # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE; QQK
+FE35 ; [*0288.0020.0016.FE35] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS; QQK
+FE36 ; [*0289.0020.0016.FE36] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS; QQK
+FE37 ; [*028C.0020.0016.FE37] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET; QQK
+FE38 ; [*028D.0020.0016.FE38] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET; QQK
+FE39 ; [*02B8.0020.0016.FE39] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET; QQK
+FE3A ; [*02B9.0020.0016.FE3A] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET; QQK
+FE3B ; [*02B6.0020.0016.FE3B] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET; QQK
+FE3C ; [*02B7.0020.0016.FE3C] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET; QQK
+FE3D ; [*02B0.0020.0016.FE3D] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET; QQK
+FE3E ; [*02B1.0020.0016.FE3E] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET; QQK
+FE3F ; [*02AE.0020.0016.FE3F] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET; QQK
+FE40 ; [*02AF.0020.0016.FE40] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET; QQK
+FE41 ; [*02B2.0020.0016.FE41] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET; QQK
+FE42 ; [*02B3.0020.0016.FE42] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET; QQK
+FE43 ; [*02B4.0020.0016.FE43] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET; QQK
+FE44 ; [*02B5.0020.0016.FE44] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET; QQK
+FE45 ; [*0238.0020.0002.FE45] # SESAME DOT
+FE46 ; [*0239.0020.0002.FE46] # WHITE SESAME DOT
+FE47 ; [*028A.0020.0016.FE47] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET; QQK
+FE48 ; [*028B.0020.0016.FE48] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET; QQK
+FE49 ; [*0211.0020.0004.FE49] # DASHED OVERLINE; QQK
+FE4A ; [*0211.0020.0004.FE4A] # CENTRELINE OVERLINE; QQK
+FE4B ; [*0211.0020.0004.FE4B] # WAVY OVERLINE; QQK
+FE4C ; [*0211.0020.0004.FE4C] # DOUBLE WAVY OVERLINE; QQK
+FE4D ; [*021B.0020.0004.FE4D] # DASHED LOW LINE; QQK
+FE4E ; [*021B.0020.0004.FE4E] # CENTRELINE LOW LINE; QQK
+FE4F ; [*021B.0020.0004.FE4F] # WAVY LOW LINE; QQK
+FE50 ; [*022F.0020.000F.FE50] # SMALL COMMA; QQK
+FE51 ; [*0237.0020.000F.FE51] # SMALL IDEOGRAPHIC COMMA; QQK
+FE52 ; [*025D.0020.000F.FE52] # SMALL FULL STOP; QQK
+FE54 ; [*023A.0020.000F.FE54] # SMALL SEMICOLON; QQK
+FE55 ; [*023D.0020.000F.FE55] # SMALL COLON; QQK
+FE56 ; [*0255.0020.000F.FE56] # SMALL QUESTION MARK; QQK
+FE57 ; [*0251.0020.000F.FE57] # SMALL EXCLAMATION MARK; QQK
+FE58 ; [*0228.0020.000F.FE58] # SMALL EM DASH; QQK
+FE59 ; [*0288.0020.000F.FE59] # SMALL LEFT PARENTHESIS; QQK
+FE5A ; [*0289.0020.000F.FE5A] # SMALL RIGHT PARENTHESIS; QQK
+FE5B ; [*028C.0020.000F.FE5B] # SMALL LEFT CURLY BRACKET; QQK
+FE5C ; [*028D.0020.000F.FE5C] # SMALL RIGHT CURLY BRACKET; QQK
+FE5D ; [*02B8.0020.000F.FE5D] # SMALL LEFT TORTOISE SHELL BRACKET; QQK
+FE5E ; [*02B9.0020.000F.FE5E] # SMALL RIGHT TORTOISE SHELL BRACKET; QQK
+FE5F ; [*02D2.0020.000F.FE5F] # SMALL NUMBER SIGN; QQK
+FE60 ; [*02CF.0020.000F.FE60] # SMALL AMPERSAND; QQK
+FE61 ; [*02C8.0020.000F.FE61] # SMALL ASTERISK; QQK
+FE62 ; [*0428.0020.000F.FE62] # SMALL PLUS SIGN; QQK
+FE63 ; [*0221.0020.000F.FE63] # SMALL HYPHEN-MINUS; QQK
+FE64 ; [*042C.0020.000F.FE64] # SMALL LESS-THAN SIGN; QQK
+FE65 ; [*042E.0020.000F.FE65] # SMALL GREATER-THAN SIGN; QQK
+FE66 ; [*042D.0020.000F.FE66] # SMALL EQUALS SIGN; QQK
+FE68 ; [*02CE.0020.000F.FE68] # SMALL REVERSE SOLIDUS; QQK
+FE6A ; [*02D3.0020.000F.FE6A] # SMALL PERCENT SIGN; QQK
+FE6B ; [*02C7.0020.000F.FE6B] # SMALL COMMERCIAL AT; QQK
+FE73 ; [.0000.0000.0000.FE73] # ARABIC TAIL FRAGMENT
+FF01 ; [*0251.0020.0003.FF01] # FULLWIDTH EXCLAMATION MARK; QQK
+FF02 ; [*027E.0020.0003.FF02] # FULLWIDTH QUOTATION MARK; QQK
+FF03 ; [*02D2.0020.0003.FF03] # FULLWIDTH NUMBER SIGN; QQK
+FF05 ; [*02D3.0020.0003.FF05] # FULLWIDTH PERCENT SIGN; QQK
+FF06 ; [*02CF.0020.0003.FF06] # FULLWIDTH AMPERSAND; QQK
+FF07 ; [*0277.0020.0003.FF07] # FULLWIDTH APOSTROPHE; QQK
+FF08 ; [*0288.0020.0003.FF08] # FULLWIDTH LEFT PARENTHESIS; QQK
+FF09 ; [*0289.0020.0003.FF09] # FULLWIDTH RIGHT PARENTHESIS; QQK
+FF0A ; [*02C8.0020.0003.FF0A] # FULLWIDTH ASTERISK; QQK
+FF0B ; [*0428.0020.0003.FF0B] # FULLWIDTH PLUS SIGN; QQK
+FF0C ; [*022F.0020.0003.FF0C] # FULLWIDTH COMMA; QQK
+FF0D ; [*0221.0020.0003.FF0D] # FULLWIDTH HYPHEN-MINUS; QQK
+FF0E ; [*025D.0020.0003.FF0E] # FULLWIDTH FULL STOP; QQK
+FF0F ; [*02CC.0020.0003.FF0F] # FULLWIDTH SOLIDUS; QQK
+FF1A ; [*023D.0020.0003.FF1A] # FULLWIDTH COLON; QQK
+FF1B ; [*023A.0020.0003.FF1B] # FULLWIDTH SEMICOLON; QQK
+FF1C ; [*042C.0020.0003.FF1C] # FULLWIDTH LESS-THAN SIGN; QQK
+FF1D ; [*042D.0020.0003.FF1D] # FULLWIDTH EQUALS SIGN; QQK
+FF1E ; [*042E.0020.0003.FF1E] # FULLWIDTH GREATER-THAN SIGN; QQK
+FF1F ; [*0255.0020.0003.FF1F] # FULLWIDTH QUESTION MARK; QQK
+FF20 ; [*02C7.0020.0003.FF20] # FULLWIDTH COMMERCIAL AT; QQK
+FF3B ; [*028A.0020.0003.FF3B] # FULLWIDTH LEFT SQUARE BRACKET; QQK
+FF3C ; [*02CE.0020.0003.FF3C] # FULLWIDTH REVERSE SOLIDUS; QQK
+FF3D ; [*028B.0020.0003.FF3D] # FULLWIDTH RIGHT SQUARE BRACKET; QQK
+FF3E ; [*020F.0020.0003.FF3E] # FULLWIDTH CIRCUMFLEX ACCENT; QQK
+FF3F ; [*021B.0020.0003.FF3F] # FULLWIDTH LOW LINE; QQK
+FF40 ; [*020C.0020.0003.FF40] # FULLWIDTH GRAVE ACCENT; QQK
+FF5B ; [*028C.0020.0003.FF5B] # FULLWIDTH LEFT CURLY BRACKET; QQK
+FF5C ; [*0430.0020.0003.FF5C] # FULLWIDTH VERTICAL LINE; QQK
+FF5D ; [*028D.0020.0003.FF5D] # FULLWIDTH RIGHT CURLY BRACKET; QQK
+FF5E ; [*0433.0020.0003.FF5E] # FULLWIDTH TILDE; QQK
+FF5F ; [*029A.0020.0003.FF5F] # FULLWIDTH LEFT WHITE PARENTHESIS; QQK
+FF60 ; [*029B.0020.0003.FF60] # FULLWIDTH RIGHT WHITE PARENTHESIS; QQK
+FF61 ; [*0266.0020.0012.FF61] # HALFWIDTH IDEOGRAPHIC FULL STOP; QQK
+FF62 ; [*02B2.0020.0012.FF62] # HALFWIDTH LEFT CORNER BRACKET; QQK
+FF63 ; [*02B3.0020.0012.FF63] # HALFWIDTH RIGHT CORNER BRACKET; QQK
+FF64 ; [*0237.0020.0012.FF64] # HALFWIDTH IDEOGRAPHIC COMMA; QQK
+FF65 ; [*022E.0020.0012.FF65] # HALFWIDTH KATAKANA MIDDLE DOT; QQK
+FFE2 ; [*042F.0020.0003.FFE2] # FULLWIDTH NOT SIGN; QQK
+FFE3 ; [*0210.0020.0003.FFE3] # FULLWIDTH MACRON; QQK
+FFE4 ; [*0431.0020.0003.FFE4] # FULLWIDTH BROKEN BAR; QQK
+FFE8 ; [*05FE.0020.0012.FFE8] # HALFWIDTH FORMS LIGHT VERTICAL; QQK
+FFE9 ; [*03AE.0020.0012.FFE9] # HALFWIDTH LEFTWARDS ARROW; QQK
+FFEA ; [*03B0.0020.0012.FFEA] # HALFWIDTH UPWARDS ARROW; QQK
+FFEB ; [*03AF.0020.0012.FFEB] # HALFWIDTH RIGHTWARDS ARROW; QQK
+FFEC ; [*03B1.0020.0012.FFEC] # HALFWIDTH DOWNWARDS ARROW; QQK
+FFED ; [*069C.0020.0012.FFED] # HALFWIDTH BLACK SQUARE; QQK
+FFEE ; [*06C7.0020.0012.FFEE] # HALFWIDTH WHITE CIRCLE; QQK
+FFFC ; [*0DC5.0020.0002.FFFC] # OBJECT REPLACEMENT CHARACTER
+FFFD ; [*0DC6.0020.0002.FFFD] # REPLACEMENT CHARACTER
+10100 ; [*0273.0020.0002.10100] # AEGEAN WORD SEPARATOR LINE
+10101 ; [*0274.0020.0002.10101] # AEGEAN WORD SEPARATOR DOT
+10102 ; [*0275.0020.0002.10102] # AEGEAN CHECK MARK
+10110 ; [*0DDD.0020.0002.10110] # AEGEAN NUMBER TEN
+10111 ; [*0DDE.0020.0002.10111] # AEGEAN NUMBER TWENTY
+10112 ; [*0DDF.0020.0002.10112] # AEGEAN NUMBER THIRTY
+10113 ; [*0DE0.0020.0002.10113] # AEGEAN NUMBER FORTY
+10114 ; [*0DE1.0020.0002.10114] # AEGEAN NUMBER FIFTY
+10115 ; [*0DE2.0020.0002.10115] # AEGEAN NUMBER SIXTY
+10116 ; [*0DE3.0020.0002.10116] # AEGEAN NUMBER SEVENTY
+10117 ; [*0DE4.0020.0002.10117] # AEGEAN NUMBER EIGHTY
+10118 ; [*0DE5.0020.0002.10118] # AEGEAN NUMBER NINETY
+10119 ; [*0DE6.0020.0002.10119] # AEGEAN NUMBER ONE HUNDRED
+1011A ; [*0DE7.0020.0002.1011A] # AEGEAN NUMBER TWO HUNDRED
+1011B ; [*0DE8.0020.0002.1011B] # AEGEAN NUMBER THREE HUNDRED
+1011C ; [*0DE9.0020.0002.1011C] # AEGEAN NUMBER FOUR HUNDRED
+1011D ; [*0DEA.0020.0002.1011D] # AEGEAN NUMBER FIVE HUNDRED
+1011E ; [*0DEB.0020.0002.1011E] # AEGEAN NUMBER SIX HUNDRED
+1011F ; [*0DEC.0020.0002.1011F] # AEGEAN NUMBER SEVEN HUNDRED
+10120 ; [*0DED.0020.0002.10120] # AEGEAN NUMBER EIGHT HUNDRED
+10121 ; [*0DEE.0020.0002.10121] # AEGEAN NUMBER NINE HUNDRED
+10122 ; [*0DEF.0020.0002.10122] # AEGEAN NUMBER ONE THOUSAND
+10123 ; [*0DF0.0020.0002.10123] # AEGEAN NUMBER TWO THOUSAND
+10124 ; [*0DF1.0020.0002.10124] # AEGEAN NUMBER THREE THOUSAND
+10125 ; [*0DF2.0020.0002.10125] # AEGEAN NUMBER FOUR THOUSAND
+10126 ; [*0DF3.0020.0002.10126] # AEGEAN NUMBER FIVE THOUSAND
+10127 ; [*0DF4.0020.0002.10127] # AEGEAN NUMBER SIX THOUSAND
+10128 ; [*0DF5.0020.0002.10128] # AEGEAN NUMBER SEVEN THOUSAND
+10129 ; [*0DF6.0020.0002.10129] # AEGEAN NUMBER EIGHT THOUSAND
+1012A ; [*0DF7.0020.0002.1012A] # AEGEAN NUMBER NINE THOUSAND
+1012B ; [*0DF8.0020.0002.1012B] # AEGEAN NUMBER TEN THOUSAND
+1012C ; [*0DF9.0020.0002.1012C] # AEGEAN NUMBER TWENTY THOUSAND
+1012D ; [*0DFA.0020.0002.1012D] # AEGEAN NUMBER THIRTY THOUSAND
+1012E ; [*0DFB.0020.0002.1012E] # AEGEAN NUMBER FORTY THOUSAND
+1012F ; [*0DFC.0020.0002.1012F] # AEGEAN NUMBER FIFTY THOUSAND
+10130 ; [*0DFD.0020.0002.10130] # AEGEAN NUMBER SIXTY THOUSAND
+10131 ; [*0DFE.0020.0002.10131] # AEGEAN NUMBER SEVENTY THOUSAND
+10132 ; [*0DFF.0020.0002.10132] # AEGEAN NUMBER EIGHTY THOUSAND
+10133 ; [*0E00.0020.0002.10133] # AEGEAN NUMBER NINETY THOUSAND
+10137 ; [*0C05.0020.0002.10137] # AEGEAN WEIGHT BASE UNIT
+10138 ; [*0C06.0020.0002.10138] # AEGEAN WEIGHT FIRST SUBUNIT
+10139 ; [*0C07.0020.0002.10139] # AEGEAN WEIGHT SECOND SUBUNIT
+1013A ; [*0C08.0020.0002.1013A] # AEGEAN WEIGHT THIRD SUBUNIT
+1013B ; [*0C09.0020.0002.1013B] # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C ; [*0C0A.0020.0002.1013C] # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D ; [*0C0B.0020.0002.1013D] # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E ; [*0C0C.0020.0002.1013E] # AEGEAN MEASURE SECOND SUBUNIT
+1013F ; [*0C0D.0020.0002.1013F] # AEGEAN MEASURE THIRD SUBUNIT
+10322 ; [*0DDB.0020.0002.10322] # OLD ITALIC NUMERAL TEN
+10323 ; [*0DDC.0020.0002.10323] # OLD ITALIC NUMERAL FIFTY
+1039F ; [*0276.0020.0002.1039F] # UGARITIC WORD DIVIDER
+1D000 ; [*0C0E.0020.0002.1D000] # BYZANTINE MUSICAL SYMBOL PSILI
+1D001 ; [*0C0F.0020.0002.1D001] # BYZANTINE MUSICAL SYMBOL DASEIA
+1D002 ; [*0C10.0020.0002.1D002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003 ; [*0C11.0020.0002.1D003] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004 ; [*0C12.0020.0002.1D004] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005 ; [*0C13.0020.0002.1D005] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006 ; [*0C14.0020.0002.1D006] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007 ; [*0C15.0020.0002.1D007] # BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008 ; [*0C16.0020.0002.1D008] # BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009 ; [*0C17.0020.0002.1D009] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A ; [*0C18.0020.0002.1D00A] # BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B ; [*0C19.0020.0002.1D00B] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C ; [*0C1A.0020.0002.1D00C] # BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D ; [*0C1B.0020.0002.1D00D] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E ; [*0C1C.0020.0002.1D00E] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F ; [*0C1D.0020.0002.1D00F] # BYZANTINE MUSICAL SYMBOL TELEIA
+1D010 ; [*0C1E.0020.0002.1D010] # BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011 ; [*0C1F.0020.0002.1D011] # BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012 ; [*0C20.0020.0002.1D012] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013 ; [*0C21.0020.0002.1D013] # BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014 ; [*0C22.0020.0002.1D014] # BYZANTINE MUSICAL SYMBOL THITA
+1D015 ; [*0C23.0020.0002.1D015] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016 ; [*0C24.0020.0002.1D016] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017 ; [*0C25.0020.0002.1D017] # BYZANTINE MUSICAL SYMBOL PSILON
+1D018 ; [*0C26.0020.0002.1D018] # BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019 ; [*0C27.0020.0002.1D019] # BYZANTINE MUSICAL SYMBOL VATHY
+1D01A ; [*0C28.0020.0002.1D01A] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B ; [*0C29.0020.0002.1D01B] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C ; [*0C2A.0020.0002.1D01C] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D ; [*0C2B.0020.0002.1D01D] # BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E ; [*0C2C.0020.0002.1D01E] # BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F ; [*0C2D.0020.0002.1D01F] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020 ; [*0C2E.0020.0002.1D020] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021 ; [*0C2F.0020.0002.1D021] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022 ; [*0C30.0020.0002.1D022] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023 ; [*0C31.0020.0002.1D023] # BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024 ; [*0C32.0020.0002.1D024] # BYZANTINE MUSICAL SYMBOL KLASMA
+1D025 ; [*0C33.0020.0002.1D025] # BYZANTINE MUSICAL SYMBOL REVMA
+1D026 ; [*0C34.0020.0002.1D026] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027 ; [*0C35.0020.0002.1D027] # BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028 ; [*0C36.0020.0002.1D028] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029 ; [*0C37.0020.0002.1D029] # BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A ; [*0C38.0020.0002.1D02A] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B ; [*0C39.0020.0002.1D02B] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C ; [*0C3A.0020.0002.1D02C] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D ; [*0C3B.0020.0002.1D02D] # BYZANTINE MUSICAL SYMBOL THEMA
+1D02E ; [*0C3C.0020.0002.1D02E] # BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F ; [*0C3D.0020.0002.1D02F] # BYZANTINE MUSICAL SYMBOL DYO
+1D030 ; [*0C3E.0020.0002.1D030] # BYZANTINE MUSICAL SYMBOL TRIA
+1D031 ; [*0C3F.0020.0002.1D031] # BYZANTINE MUSICAL SYMBOL TESSERA
+1D032 ; [*0C40.0020.0002.1D032] # BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033 ; [*0C41.0020.0002.1D033] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034 ; [*0C42.0020.0002.1D034] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035 ; [*0C43.0020.0002.1D035] # BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036 ; [*0C44.0020.0002.1D036] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037 ; [*0C45.0020.0002.1D037] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038 ; [*0C46.0020.0002.1D038] # BYZANTINE MUSICAL SYMBOL PELASTON
+1D039 ; [*0C47.0020.0002.1D039] # BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A ; [*0C48.0020.0002.1D03A] # BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B ; [*0C49.0020.0002.1D03B] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C ; [*0C4A.0020.0002.1D03C] # BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D ; [*0C4B.0020.0002.1D03D] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E ; [*0C4C.0020.0002.1D03E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F ; [*0C4D.0020.0002.1D03F] # BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040 ; [*0C4E.0020.0002.1D040] # BYZANTINE MUSICAL SYMBOL NANA
+1D041 ; [*0C4F.0020.0002.1D041] # BYZANTINE MUSICAL SYMBOL PETASMA
+1D042 ; [*0C50.0020.0002.1D042] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043 ; [*0C51.0020.0002.1D043] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044 ; [*0C52.0020.0002.1D044] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045 ; [*0C53.0020.0002.1D045] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046 ; [*0C54.0020.0002.1D046] # BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047 ; [*0C55.0020.0002.1D047] # BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048 ; [*0C56.0020.0002.1D048] # BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049 ; [*0C57.0020.0002.1D049] # BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A ; [*0C58.0020.0002.1D04A] # BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B ; [*0C59.0020.0002.1D04B] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C ; [*0C5A.0020.0002.1D04C] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D ; [*0C5B.0020.0002.1D04D] # BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E ; [*0C5C.0020.0002.1D04E] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F ; [*0C5D.0020.0002.1D04F] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050 ; [*0C5E.0020.0002.1D050] # BYZANTINE MUSICAL SYMBOL YPSILI
+1D051 ; [*0C5F.0020.0002.1D051] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052 ; [*0C60.0020.0002.1D052] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053 ; [*0C61.0020.0002.1D053] # BYZANTINE MUSICAL SYMBOL YPORROI
+1D054 ; [*0C62.0020.0002.1D054] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055 ; [*0C63.0020.0002.1D055] # BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056 ; [*0C64.0020.0002.1D056] # BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057 ; [*0C65.0020.0002.1D057] # BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058 ; [*0C66.0020.0002.1D058] # BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059 ; [*0C67.0020.0002.1D059] # BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A ; [*0C68.0020.0002.1D05A] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B ; [*0C69.0020.0002.1D05B] # BYZANTINE MUSICAL SYMBOL OMALON
+1D05C ; [*0C6A.0020.0002.1D05C] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D ; [*0C6B.0020.0002.1D05D] # BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E ; [*0C6C.0020.0002.1D05E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F ; [*0C6D.0020.0002.1D05F] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060 ; [*0C6E.0020.0002.1D060] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061 ; [*0C6F.0020.0002.1D061] # BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062 ; [*0C70.0020.0002.1D062] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063 ; [*0C71.0020.0002.1D063] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064 ; [*0C72.0020.0002.1D064] # BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065 ; [*0C73.0020.0002.1D065] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066 ; [*0C74.0020.0002.1D066] # BYZANTINE MUSICAL SYMBOL SYRMA
+1D067 ; [*0C75.0020.0002.1D067] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068 ; [*0C76.0020.0002.1D068] # BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069 ; [*0C77.0020.0002.1D069] # BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A ; [*0C78.0020.0002.1D06A] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B ; [*0C79.0020.0002.1D06B] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C ; [*0C7A.0020.0002.1D06C] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D ; [*0C7B.0020.0002.1D06D] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E ; [*0C7C.0020.0002.1D06E] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F ; [*0C7D.0020.0002.1D06F] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070 ; [*0C7E.0020.0002.1D070] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071 ; [*0C7F.0020.0002.1D071] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072 ; [*0C80.0020.0002.1D072] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073 ; [*0C81.0020.0002.1D073] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074 ; [*0C82.0020.0002.1D074] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075 ; [*0C83.0020.0002.1D075] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076 ; [*0C84.0020.0002.1D076] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077 ; [*0C85.0020.0002.1D077] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078 ; [*0C86.0020.0002.1D078] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079 ; [*0C87.0020.0002.1D079] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A ; [*0C88.0020.0002.1D07A] # BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B ; [*0C89.0020.0002.1D07B] # BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C ; [*0C8A.0020.0002.1D07C] # BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D ; [*0C8B.0020.0002.1D07D] # BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E ; [*0C8C.0020.0002.1D07E] # BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F ; [*0C8D.0020.0002.1D07F] # BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080 ; [*0C8E.0020.0002.1D080] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081 ; [*0C8F.0020.0002.1D081] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082 ; [*0C90.0020.0002.1D082] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083 ; [*0C91.0020.0002.1D083] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084 ; [*0C92.0020.0002.1D084] # BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085 ; [*0C93.0020.0002.1D085] # BYZANTINE MUSICAL SYMBOL APLI
+1D086 ; [*0C94.0020.0002.1D086] # BYZANTINE MUSICAL SYMBOL DIPLI
+1D087 ; [*0C95.0020.0002.1D087] # BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088 ; [*0C96.0020.0002.1D088] # BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089 ; [*0C97.0020.0002.1D089] # BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A ; [*0C98.0020.0002.1D08A] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B ; [*0C99.0020.0002.1D08B] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C ; [*0C9A.0020.0002.1D08C] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D ; [*0C9B.0020.0002.1D08D] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E ; [*0C9C.0020.0002.1D08E] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F ; [*0C9D.0020.0002.1D08F] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090 ; [*0C9E.0020.0002.1D090] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091 ; [*0C9F.0020.0002.1D091] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092 ; [*0CA0.0020.0002.1D092] # BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093 ; [*0CA1.0020.0002.1D093] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094 ; [*0CA2.0020.0002.1D094] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095 ; [*0CA3.0020.0002.1D095] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096 ; [*0CA4.0020.0002.1D096] # BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097 ; [*0CA5.0020.0002.1D097] # BYZANTINE MUSICAL SYMBOL ARGON
+1D098 ; [*0CA6.0020.0002.1D098] # BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099 ; [*0CA7.0020.0002.1D099] # BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A ; [*0CA8.0020.0002.1D09A] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B ; [*0CA9.0020.0002.1D09B] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C ; [*0CAA.0020.0002.1D09C] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D ; [*0CAB.0020.0002.1D09D] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E ; [*0CAC.0020.0002.1D09E] # BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F ; [*0CAD.0020.0002.1D09F] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0 ; [*0CAE.0020.0002.1D0A0] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1 ; [*0CAF.0020.0002.1D0A1] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2 ; [*0CB0.0020.0002.1D0A2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3 ; [*0CB1.0020.0002.1D0A3] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4 ; [*0CB2.0020.0002.1D0A4] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5 ; [*0CB3.0020.0002.1D0A5] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6 ; [*0CB4.0020.0002.1D0A6] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7 ; [*0CB5.0020.0002.1D0A7] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8 ; [*0CB6.0020.0002.1D0A8] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9 ; [*0CB7.0020.0002.1D0A9] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA ; [*0CB8.0020.0002.1D0AA] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB ; [*0CB9.0020.0002.1D0AB] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC ; [*0CBA.0020.0002.1D0AC] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD ; [*0CBB.0020.0002.1D0AD] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE ; [*0CBC.0020.0002.1D0AE] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF ; [*0CBD.0020.0002.1D0AF] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0 ; [*0CBE.0020.0002.1D0B0] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1 ; [*0CBF.0020.0002.1D0B1] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2 ; [*0CC0.0020.0002.1D0B2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3 ; [*0CC1.0020.0002.1D0B3] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4 ; [*0CC2.0020.0002.1D0B4] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5 ; [*0CC3.0020.0002.1D0B5] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6 ; [*0CC4.0020.0002.1D0B6] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7 ; [*0CC5.0020.0002.1D0B7] # BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8 ; [*0CC6.0020.0002.1D0B8] # BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9 ; [*0CC7.0020.0002.1D0B9] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA ; [*0CC8.0020.0002.1D0BA] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB ; [*0CC9.0020.0002.1D0BB] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC ; [*0CCA.0020.0002.1D0BC] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD ; [*0CCB.0020.0002.1D0BD] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE ; [*0CCC.0020.0002.1D0BE] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF ; [*0CCD.0020.0002.1D0BF] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0 ; [*0CCE.0020.0002.1D0C0] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1 ; [*0CCF.0020.0002.1D0C1] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2 ; [*0CD0.0020.0002.1D0C2] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3 ; [*0CD1.0020.0002.1D0C3] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4 ; [*0CD2.0020.0002.1D0C4] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5 ; [*0CD3.0020.0002.1D0C5] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6 ; [*0CD4.0020.0002.1D0C6] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7 ; [*0CD5.0020.0002.1D0C7] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8 ; [*0CD6.0020.0002.1D0C8] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9 ; [*0CD7.0020.0002.1D0C9] # BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA ; [*0CD8.0020.0002.1D0CA] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB ; [*0CD9.0020.0002.1D0CB] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC ; [*0CDA.0020.0002.1D0CC] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD ; [*0CDB.0020.0002.1D0CD] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE ; [*0CDC.0020.0002.1D0CE] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF ; [*0CDD.0020.0002.1D0CF] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0 ; [*0CDE.0020.0002.1D0D0] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1 ; [*0CDF.0020.0002.1D0D1] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2 ; [*0CE0.0020.0002.1D0D2] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3 ; [*0CE1.0020.0002.1D0D3] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4 ; [*0CE2.0020.0002.1D0D4] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5 ; [*0CE3.0020.0002.1D0D5] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6 ; [*0CE4.0020.0002.1D0D6] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7 ; [*0CE5.0020.0002.1D0D7] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8 ; [*0CE6.0020.0002.1D0D8] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9 ; [*0CE7.0020.0002.1D0D9] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA ; [*0CE8.0020.0002.1D0DA] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB ; [*0CE9.0020.0002.1D0DB] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC ; [*0CEA.0020.0002.1D0DC] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD ; [*0CEB.0020.0002.1D0DD] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE ; [*0CEC.0020.0002.1D0DE] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF ; [*0CED.0020.0002.1D0DF] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0 ; [*0CEE.0020.0002.1D0E0] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1 ; [*0CEF.0020.0002.1D0E1] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2 ; [*0CF0.0020.0002.1D0E2] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3 ; [*0CF1.0020.0002.1D0E3] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4 ; [*0CF2.0020.0002.1D0E4] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5 ; [*0CF3.0020.0002.1D0E5] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6 ; [*0CF4.0020.0002.1D0E6] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7 ; [*0CF5.0020.0002.1D0E7] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8 ; [*0CF6.0020.0002.1D0E8] # BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9 ; [*0CF7.0020.0002.1D0E9] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA ; [*0CF8.0020.0002.1D0EA] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB ; [*0CF9.0020.0002.1D0EB] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC ; [*0CFA.0020.0002.1D0EC] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED ; [*0CFB.0020.0002.1D0ED] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE ; [*0CFC.0020.0002.1D0EE] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF ; [*0CFD.0020.0002.1D0EF] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0 ; [*0CFE.0020.0002.1D0F0] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1 ; [*0CFF.0020.0002.1D0F1] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2 ; [*0D00.0020.0002.1D0F2] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3 ; [*0D01.0020.0002.1D0F3] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4 ; [*0D02.0020.0002.1D0F4] # BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5 ; [*0D03.0020.0002.1D0F5] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100 ; [*0D04.0020.0002.1D100] # MUSICAL SYMBOL SINGLE BARLINE
+1D101 ; [*0D05.0020.0002.1D101] # MUSICAL SYMBOL DOUBLE BARLINE
+1D102 ; [*0D06.0020.0002.1D102] # MUSICAL SYMBOL FINAL BARLINE
+1D103 ; [*0D07.0020.0002.1D103] # MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104 ; [*0D08.0020.0002.1D104] # MUSICAL SYMBOL DASHED BARLINE
+1D105 ; [*0D09.0020.0002.1D105] # MUSICAL SYMBOL SHORT BARLINE
+1D106 ; [*0D0A.0020.0002.1D106] # MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107 ; [*0D0B.0020.0002.1D107] # MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108 ; [*0D0C.0020.0002.1D108] # MUSICAL SYMBOL REPEAT DOTS
+1D109 ; [*0D0D.0020.0002.1D109] # MUSICAL SYMBOL DAL SEGNO
+1D10A ; [*0D0E.0020.0002.1D10A] # MUSICAL SYMBOL DA CAPO
+1D10B ; [*0D0F.0020.0002.1D10B] # MUSICAL SYMBOL SEGNO
+1D10C ; [*0D10.0020.0002.1D10C] # MUSICAL SYMBOL CODA
+1D10D ; [*0D11.0020.0002.1D10D] # MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E ; [*0D12.0020.0002.1D10E] # MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F ; [*0D13.0020.0002.1D10F] # MUSICAL SYMBOL REPEATED FIGURE-3
+1D110 ; [*0D14.0020.0002.1D110] # MUSICAL SYMBOL FERMATA
+1D111 ; [*0D15.0020.0002.1D111] # MUSICAL SYMBOL FERMATA BELOW
+1D112 ; [*0D16.0020.0002.1D112] # MUSICAL SYMBOL BREATH MARK
+1D113 ; [*0D17.0020.0002.1D113] # MUSICAL SYMBOL CAESURA
+1D114 ; [*0D18.0020.0002.1D114] # MUSICAL SYMBOL BRACE
+1D115 ; [*0D19.0020.0002.1D115] # MUSICAL SYMBOL BRACKET
+1D116 ; [*0D1A.0020.0002.1D116] # MUSICAL SYMBOL ONE-LINE STAFF
+1D117 ; [*0D1B.0020.0002.1D117] # MUSICAL SYMBOL TWO-LINE STAFF
+1D118 ; [*0D1C.0020.0002.1D118] # MUSICAL SYMBOL THREE-LINE STAFF
+1D119 ; [*0D1D.0020.0002.1D119] # MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A ; [*0D1E.0020.0002.1D11A] # MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B ; [*0D1F.0020.0002.1D11B] # MUSICAL SYMBOL SIX-LINE STAFF
+1D11C ; [*0D20.0020.0002.1D11C] # MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D ; [*0D21.0020.0002.1D11D] # MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E ; [*0D22.0020.0002.1D11E] # MUSICAL SYMBOL G CLEF
+1D11F ; [*0D23.0020.0002.1D11F] # MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120 ; [*0D24.0020.0002.1D120] # MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121 ; [*0D25.0020.0002.1D121] # MUSICAL SYMBOL C CLEF
+1D122 ; [*0D26.0020.0002.1D122] # MUSICAL SYMBOL F CLEF
+1D123 ; [*0D27.0020.0002.1D123] # MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124 ; [*0D28.0020.0002.1D124] # MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125 ; [*0D29.0020.0002.1D125] # MUSICAL SYMBOL DRUM CLEF-1
+1D126 ; [*0D2A.0020.0002.1D126] # MUSICAL SYMBOL DRUM CLEF-2
+1D12A ; [*0D2E.0020.0002.1D12A] # MUSICAL SYMBOL DOUBLE SHARP
+1D12B ; [*0D2F.0020.0002.1D12B] # MUSICAL SYMBOL DOUBLE FLAT
+1D12C ; [*0D30.0020.0002.1D12C] # MUSICAL SYMBOL FLAT UP
+1D12D ; [*0D31.0020.0002.1D12D] # MUSICAL SYMBOL FLAT DOWN
+1D12E ; [*0D32.0020.0002.1D12E] # MUSICAL SYMBOL NATURAL UP
+1D12F ; [*0D33.0020.0002.1D12F] # MUSICAL SYMBOL NATURAL DOWN
+1D130 ; [*0D34.0020.0002.1D130] # MUSICAL SYMBOL SHARP UP
+1D131 ; [*0D35.0020.0002.1D131] # MUSICAL SYMBOL SHARP DOWN
+1D132 ; [*0D36.0020.0002.1D132] # MUSICAL SYMBOL QUARTER TONE SHARP
+1D133 ; [*0D37.0020.0002.1D133] # MUSICAL SYMBOL QUARTER TONE FLAT
+1D134 ; [*0D38.0020.0002.1D134] # MUSICAL SYMBOL COMMON TIME
+1D135 ; [*0D39.0020.0002.1D135] # MUSICAL SYMBOL CUT TIME
+1D136 ; [*0D3A.0020.0002.1D136] # MUSICAL SYMBOL OTTAVA ALTA
+1D137 ; [*0D3B.0020.0002.1D137] # MUSICAL SYMBOL OTTAVA BASSA
+1D138 ; [*0D3C.0020.0002.1D138] # MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139 ; [*0D3D.0020.0002.1D139] # MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A ; [*0D3E.0020.0002.1D13A] # MUSICAL SYMBOL MULTI REST
+1D13B ; [*0D3F.0020.0002.1D13B] # MUSICAL SYMBOL WHOLE REST
+1D13C ; [*0D40.0020.0002.1D13C] # MUSICAL SYMBOL HALF REST
+1D13D ; [*0D41.0020.0002.1D13D] # MUSICAL SYMBOL QUARTER REST
+1D13E ; [*0D42.0020.0002.1D13E] # MUSICAL SYMBOL EIGHTH REST
+1D13F ; [*0D43.0020.0002.1D13F] # MUSICAL SYMBOL SIXTEENTH REST
+1D140 ; [*0D44.0020.0002.1D140] # MUSICAL SYMBOL THIRTY-SECOND REST
+1D141 ; [*0D45.0020.0002.1D141] # MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142 ; [*0D46.0020.0002.1D142] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143 ; [*0D47.0020.0002.1D143] # MUSICAL SYMBOL X NOTEHEAD
+1D144 ; [*0D48.0020.0002.1D144] # MUSICAL SYMBOL PLUS NOTEHEAD
+1D145 ; [*0D49.0020.0002.1D145] # MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146 ; [*0D4A.0020.0002.1D146] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147 ; [*0D4B.0020.0002.1D147] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148 ; [*0D4C.0020.0002.1D148] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149 ; [*0D4D.0020.0002.1D149] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A ; [*0D4E.0020.0002.1D14A] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B ; [*0D4F.0020.0002.1D14B] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C ; [*0D50.0020.0002.1D14C] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D ; [*0D51.0020.0002.1D14D] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E ; [*0D52.0020.0002.1D14E] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F ; [*0D53.0020.0002.1D14F] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150 ; [*0D54.0020.0002.1D150] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151 ; [*0D55.0020.0002.1D151] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152 ; [*0D56.0020.0002.1D152] # MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153 ; [*0D57.0020.0002.1D153] # MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154 ; [*0D58.0020.0002.1D154] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155 ; [*0D59.0020.0002.1D155] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156 ; [*0D5A.0020.0002.1D156] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157 ; [*0D5B.0020.0002.1D157] # MUSICAL SYMBOL VOID NOTEHEAD
+1D158 ; [*0D5C.0020.0002.1D158] # MUSICAL SYMBOL NOTEHEAD BLACK
+1D159 ; [*0D5D.0020.0002.1D159] # MUSICAL SYMBOL NULL NOTEHEAD
+1D15A ; [*0D5E.0020.0002.1D15A] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B ; [*0D5F.0020.0002.1D15B] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C ; [*0D60.0020.0002.1D15C] # MUSICAL SYMBOL BREVE
+1D15D ; [*0D61.0020.0002.1D15D] # MUSICAL SYMBOL WHOLE NOTE
+1D15E ; [*0D5B.0020.0002.1D157][.0000.0000.0000.1D165] # MUSICAL SYMBOL HALF NOTE; QQCN
+1D15F ; [*0D5C.0020.0002.1D158][.0000.0000.0000.1D165] # MUSICAL SYMBOL QUARTER NOTE; QQCN
+1D160 ; [*0D5C.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL EIGHTH NOTE; QQCN
+1D161 ; [*0D5C.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL SIXTEENTH NOTE; QQCN
+1D162 ; [*0D5C.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D170] # MUSICAL SYMBOL THIRTY-SECOND NOTE; QQCN
+1D163 ; [*0D5C.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D171] # MUSICAL SYMBOL SIXTY-FOURTH NOTE; QQCN
+1D164 ; [*0D5C.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D172] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE; QQCN
+1D165 ; [.0000.0000.0000.1D165] # MUSICAL SYMBOL COMBINING STEM
+1D166 ; [.0000.0000.0000.1D166] # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167 ; [.0000.0000.0000.1D167] # MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168 ; [.0000.0000.0000.1D168] # MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169 ; [.0000.0000.0000.1D169] # MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A ; [*0D62.0020.0002.1D16A] # MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B ; [*0D63.0020.0002.1D16B] # MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C ; [*0D64.0020.0002.1D16C] # MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D ; [.0000.0000.0000.1D16D] # MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E ; [.0000.0000.0000.1D16E] # MUSICAL SYMBOL COMBINING FLAG-1
+1D16F ; [.0000.0000.0000.1D16F] # MUSICAL SYMBOL COMBINING FLAG-2
+1D170 ; [.0000.0000.0000.1D170] # MUSICAL SYMBOL COMBINING FLAG-3
+1D171 ; [.0000.0000.0000.1D171] # MUSICAL SYMBOL COMBINING FLAG-4
+1D172 ; [.0000.0000.0000.1D172] # MUSICAL SYMBOL COMBINING FLAG-5
+1D17B ; [.0000.0000.0000.1D17B] # MUSICAL SYMBOL COMBINING ACCENT
+1D17C ; [.0000.0000.0000.1D17C] # MUSICAL SYMBOL COMBINING STACCATO
+1D17D ; [.0000.0000.0000.1D17D] # MUSICAL SYMBOL COMBINING TENUTO
+1D17E ; [.0000.0000.0000.1D17E] # MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F ; [.0000.0000.0000.1D17F] # MUSICAL SYMBOL COMBINING MARCATO
+1D180 ; [.0000.0000.0000.1D180] # MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181 ; [.0000.0000.0000.1D181] # MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182 ; [.0000.0000.0000.1D182] # MUSICAL SYMBOL COMBINING LOURE
+1D183 ; [*0D65.0020.0002.1D183] # MUSICAL SYMBOL ARPEGGIATO UP
+1D184 ; [*0D66.0020.0002.1D184] # MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185 ; [.0000.0000.0000.1D185] # MUSICAL SYMBOL COMBINING DOIT
+1D186 ; [.0000.0000.0000.1D186] # MUSICAL SYMBOL COMBINING RIP
+1D187 ; [.0000.0000.0000.1D187] # MUSICAL SYMBOL COMBINING FLIP
+1D188 ; [.0000.0000.0000.1D188] # MUSICAL SYMBOL COMBINING SMEAR
+1D189 ; [.0000.0000.0000.1D189] # MUSICAL SYMBOL COMBINING BEND
+1D18A ; [.0000.0000.0000.1D18A] # MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B ; [.0000.0000.0000.1D18B] # MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C ; [*0D67.0020.0002.1D18C] # MUSICAL SYMBOL RINFORZANDO
+1D18D ; [*0D68.0020.0002.1D18D] # MUSICAL SYMBOL SUBITO
+1D18E ; [*0D69.0020.0002.1D18E] # MUSICAL SYMBOL Z
+1D18F ; [*0D6A.0020.0002.1D18F] # MUSICAL SYMBOL PIANO
+1D190 ; [*0D6B.0020.0002.1D190] # MUSICAL SYMBOL MEZZO
+1D191 ; [*0D6C.0020.0002.1D191] # MUSICAL SYMBOL FORTE
+1D192 ; [*0D6D.0020.0002.1D192] # MUSICAL SYMBOL CRESCENDO
+1D193 ; [*0D6E.0020.0002.1D193] # MUSICAL SYMBOL DECRESCENDO
+1D194 ; [*0D6F.0020.0002.1D194] # MUSICAL SYMBOL GRACE NOTE SLASH
+1D195 ; [*0D70.0020.0002.1D195] # MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196 ; [*0D71.0020.0002.1D196] # MUSICAL SYMBOL TR
+1D197 ; [*0D72.0020.0002.1D197] # MUSICAL SYMBOL TURN
+1D198 ; [*0D73.0020.0002.1D198] # MUSICAL SYMBOL INVERTED TURN
+1D199 ; [*0D74.0020.0002.1D199] # MUSICAL SYMBOL TURN SLASH
+1D19A ; [*0D75.0020.0002.1D19A] # MUSICAL SYMBOL TURN UP
+1D19B ; [*0D76.0020.0002.1D19B] # MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C ; [*0D77.0020.0002.1D19C] # MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D ; [*0D78.0020.0002.1D19D] # MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E ; [*0D79.0020.0002.1D19E] # MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F ; [*0D7A.0020.0002.1D19F] # MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0 ; [*0D7B.0020.0002.1D1A0] # MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1 ; [*0D7C.0020.0002.1D1A1] # MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2 ; [*0D7D.0020.0002.1D1A2] # MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3 ; [*0D7E.0020.0002.1D1A3] # MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4 ; [*0D7F.0020.0002.1D1A4] # MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5 ; [*0D80.0020.0002.1D1A5] # MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6 ; [*0D81.0020.0002.1D1A6] # MUSICAL SYMBOL HAUPTSTIMME
+1D1A7 ; [*0D82.0020.0002.1D1A7] # MUSICAL SYMBOL NEBENSTIMME
+1D1A8 ; [*0D83.0020.0002.1D1A8] # MUSICAL SYMBOL END OF STIMME
+1D1A9 ; [*0D84.0020.0002.1D1A9] # MUSICAL SYMBOL DEGREE SLASH
+1D1AA ; [.0000.0000.0000.1D1AA] # MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB ; [.0000.0000.0000.1D1AB] # MUSICAL SYMBOL COMBINING UP BOW
+1D1AC ; [.0000.0000.0000.1D1AC] # MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD ; [.0000.0000.0000.1D1AD] # MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE ; [*0D85.0020.0002.1D1AE] # MUSICAL SYMBOL PEDAL MARK
+1D1AF ; [*0D86.0020.0002.1D1AF] # MUSICAL SYMBOL PEDAL UP MARK
+1D1B0 ; [*0D87.0020.0002.1D1B0] # MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1 ; [*0D88.0020.0002.1D1B1] # MUSICAL SYMBOL GLISSANDO UP
+1D1B2 ; [*0D89.0020.0002.1D1B2] # MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3 ; [*0D8A.0020.0002.1D1B3] # MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4 ; [*0D8B.0020.0002.1D1B4] # MUSICAL SYMBOL DAMP
+1D1B5 ; [*0D8C.0020.0002.1D1B5] # MUSICAL SYMBOL DAMP ALL
+1D1B6 ; [*0D8D.0020.0002.1D1B6] # MUSICAL SYMBOL MAXIMA
+1D1B7 ; [*0D8E.0020.0002.1D1B7] # MUSICAL SYMBOL LONGA
+1D1B8 ; [*0D8F.0020.0002.1D1B8] # MUSICAL SYMBOL BREVIS
+1D1B9 ; [*0D90.0020.0002.1D1B9] # MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA ; [*0D91.0020.0002.1D1BA] # MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB ; [*0D90.0020.0002.1D1B9][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA; QQCN
+1D1BC ; [*0D91.0020.0002.1D1BA][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA BLACK; QQCN
+1D1BD ; [*0D90.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA WHITE; QQCN
+1D1BE ; [*0D91.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA BLACK; QQCN
+1D1BF ; [*0D90.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA WHITE; QQCN
+1D1C0 ; [*0D91.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA BLACK; QQCN
+1D1C1 ; [*0D92.0020.0002.1D1C1] # MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2 ; [*0D93.0020.0002.1D1C2] # MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3 ; [*0D94.0020.0002.1D1C3] # MUSICAL SYMBOL BREVIS REST
+1D1C4 ; [*0D95.0020.0002.1D1C4] # MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5 ; [*0D96.0020.0002.1D1C5] # MUSICAL SYMBOL MINIMA REST
+1D1C6 ; [*0D97.0020.0002.1D1C6] # MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7 ; [*0D98.0020.0002.1D1C7] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8 ; [*0D99.0020.0002.1D1C8] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9 ; [*0D9A.0020.0002.1D1C9] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA ; [*0D9B.0020.0002.1D1CA] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB ; [*0D9C.0020.0002.1D1CB] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC ; [*0D9D.0020.0002.1D1CC] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD ; [*0D9E.0020.0002.1D1CD] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE ; [*0D9F.0020.0002.1D1CE] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF ; [*0DA0.0020.0002.1D1CF] # MUSICAL SYMBOL CROIX
+1D1D0 ; [*0DA1.0020.0002.1D1D0] # MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1 ; [*0DA2.0020.0002.1D1D1] # MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2 ; [*0DA3.0020.0002.1D1D2] # MUSICAL SYMBOL SQUARE B
+1D1D3 ; [*0DA4.0020.0002.1D1D3] # MUSICAL SYMBOL VIRGA
+1D1D4 ; [*0DA5.0020.0002.1D1D4] # MUSICAL SYMBOL PODATUS
+1D1D5 ; [*0DA6.0020.0002.1D1D5] # MUSICAL SYMBOL CLIVIS
+1D1D6 ; [*0DA7.0020.0002.1D1D6] # MUSICAL SYMBOL SCANDICUS
+1D1D7 ; [*0DA8.0020.0002.1D1D7] # MUSICAL SYMBOL CLIMACUS
+1D1D8 ; [*0DA9.0020.0002.1D1D8] # MUSICAL SYMBOL TORCULUS
+1D1D9 ; [*0DAA.0020.0002.1D1D9] # MUSICAL SYMBOL PORRECTUS
+1D1DA ; [*0DAB.0020.0002.1D1DA] # MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB ; [*0DAC.0020.0002.1D1DB] # MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC ; [*0DAD.0020.0002.1D1DC] # MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD ; [*0DAE.0020.0002.1D1DD] # MUSICAL SYMBOL PES SUBPUNCTIS
+1D300 ; [*0B77.0020.0002.1D300] # MONOGRAM FOR EARTH
+1D301 ; [*0B78.0020.0002.1D301] # DIGRAM FOR HEAVENLY EARTH
+1D302 ; [*0B79.0020.0002.1D302] # DIGRAM FOR HUMAN EARTH
+1D303 ; [*0B7A.0020.0002.1D303] # DIGRAM FOR EARTHLY HEAVEN
+1D304 ; [*0B7B.0020.0002.1D304] # DIGRAM FOR EARTHLY HUMAN
+1D305 ; [*0B7C.0020.0002.1D305] # DIGRAM FOR EARTH
+1D306 ; [*0B7D.0020.0002.1D306] # TETRAGRAM FOR CENTRE
+1D307 ; [*0B7E.0020.0002.1D307] # TETRAGRAM FOR FULL CIRCLE
+1D308 ; [*0B7F.0020.0002.1D308] # TETRAGRAM FOR MIRED
+1D309 ; [*0B80.0020.0002.1D309] # TETRAGRAM FOR BARRIER
+1D30A ; [*0B81.0020.0002.1D30A] # TETRAGRAM FOR KEEPING SMALL
+1D30B ; [*0B82.0020.0002.1D30B] # TETRAGRAM FOR CONTRARIETY
+1D30C ; [*0B83.0020.0002.1D30C] # TETRAGRAM FOR ASCENT
+1D30D ; [*0B84.0020.0002.1D30D] # TETRAGRAM FOR OPPOSITION
+1D30E ; [*0B85.0020.0002.1D30E] # TETRAGRAM FOR BRANCHING OUT
+1D30F ; [*0B86.0020.0002.1D30F] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310 ; [*0B87.0020.0002.1D310] # TETRAGRAM FOR DIVERGENCE
+1D311 ; [*0B88.0020.0002.1D311] # TETRAGRAM FOR YOUTHFULNESS
+1D312 ; [*0B89.0020.0002.1D312] # TETRAGRAM FOR INCREASE
+1D313 ; [*0B8A.0020.0002.1D313] # TETRAGRAM FOR PENETRATION
+1D314 ; [*0B8B.0020.0002.1D314] # TETRAGRAM FOR REACH
+1D315 ; [*0B8C.0020.0002.1D315] # TETRAGRAM FOR CONTACT
+1D316 ; [*0B8D.0020.0002.1D316] # TETRAGRAM FOR HOLDING BACK
+1D317 ; [*0B8E.0020.0002.1D317] # TETRAGRAM FOR WAITING
+1D318 ; [*0B8F.0020.0002.1D318] # TETRAGRAM FOR FOLLOWING
+1D319 ; [*0B90.0020.0002.1D319] # TETRAGRAM FOR ADVANCE
+1D31A ; [*0B91.0020.0002.1D31A] # TETRAGRAM FOR RELEASE
+1D31B ; [*0B92.0020.0002.1D31B] # TETRAGRAM FOR RESISTANCE
+1D31C ; [*0B93.0020.0002.1D31C] # TETRAGRAM FOR EASE
+1D31D ; [*0B94.0020.0002.1D31D] # TETRAGRAM FOR JOY
+1D31E ; [*0B95.0020.0002.1D31E] # TETRAGRAM FOR CONTENTION
+1D31F ; [*0B96.0020.0002.1D31F] # TETRAGRAM FOR ENDEAVOUR
+1D320 ; [*0B97.0020.0002.1D320] # TETRAGRAM FOR DUTIES
+1D321 ; [*0B98.0020.0002.1D321] # TETRAGRAM FOR CHANGE
+1D322 ; [*0B99.0020.0002.1D322] # TETRAGRAM FOR DECISIVENESS
+1D323 ; [*0B9A.0020.0002.1D323] # TETRAGRAM FOR BOLD RESOLUTION
+1D324 ; [*0B9B.0020.0002.1D324] # TETRAGRAM FOR PACKING
+1D325 ; [*0B9C.0020.0002.1D325] # TETRAGRAM FOR LEGION
+1D326 ; [*0B9D.0020.0002.1D326] # TETRAGRAM FOR CLOSENESS
+1D327 ; [*0B9E.0020.0002.1D327] # TETRAGRAM FOR KINSHIP
+1D328 ; [*0B9F.0020.0002.1D328] # TETRAGRAM FOR GATHERING
+1D329 ; [*0BA0.0020.0002.1D329] # TETRAGRAM FOR STRENGTH
+1D32A ; [*0BA1.0020.0002.1D32A] # TETRAGRAM FOR PURITY
+1D32B ; [*0BA2.0020.0002.1D32B] # TETRAGRAM FOR FULLNESS
+1D32C ; [*0BA3.0020.0002.1D32C] # TETRAGRAM FOR RESIDENCE
+1D32D ; [*0BA4.0020.0002.1D32D] # TETRAGRAM FOR LAW OR MODEL
+1D32E ; [*0BA5.0020.0002.1D32E] # TETRAGRAM FOR RESPONSE
+1D32F ; [*0BA6.0020.0002.1D32F] # TETRAGRAM FOR GOING TO MEET
+1D330 ; [*0BA7.0020.0002.1D330] # TETRAGRAM FOR ENCOUNTERS
+1D331 ; [*0BA8.0020.0002.1D331] # TETRAGRAM FOR STOVE
+1D332 ; [*0BA9.0020.0002.1D332] # TETRAGRAM FOR GREATNESS
+1D333 ; [*0BAA.0020.0002.1D333] # TETRAGRAM FOR ENLARGEMENT
+1D334 ; [*0BAB.0020.0002.1D334] # TETRAGRAM FOR PATTERN
+1D335 ; [*0BAC.0020.0002.1D335] # TETRAGRAM FOR RITUAL
+1D336 ; [*0BAD.0020.0002.1D336] # TETRAGRAM FOR FLIGHT
+1D337 ; [*0BAE.0020.0002.1D337] # TETRAGRAM FOR VASTNESS OR WASTING
+1D338 ; [*0BAF.0020.0002.1D338] # TETRAGRAM FOR CONSTANCY
+1D339 ; [*0BB0.0020.0002.1D339] # TETRAGRAM FOR MEASURE
+1D33A ; [*0BB1.0020.0002.1D33A] # TETRAGRAM FOR ETERNITY
+1D33B ; [*0BB2.0020.0002.1D33B] # TETRAGRAM FOR UNITY
+1D33C ; [*0BB3.0020.0002.1D33C] # TETRAGRAM FOR DIMINISHMENT
+1D33D ; [*0BB4.0020.0002.1D33D] # TETRAGRAM FOR CLOSED MOUTH
+1D33E ; [*0BB5.0020.0002.1D33E] # TETRAGRAM FOR GUARDEDNESS
+1D33F ; [*0BB6.0020.0002.1D33F] # TETRAGRAM FOR GATHERING IN
+1D340 ; [*0BB7.0020.0002.1D340] # TETRAGRAM FOR MASSING
+1D341 ; [*0BB8.0020.0002.1D341] # TETRAGRAM FOR ACCUMULATION
+1D342 ; [*0BB9.0020.0002.1D342] # TETRAGRAM FOR EMBELLISHMENT
+1D343 ; [*0BBA.0020.0002.1D343] # TETRAGRAM FOR DOUBT
+1D344 ; [*0BBB.0020.0002.1D344] # TETRAGRAM FOR WATCH
+1D345 ; [*0BBC.0020.0002.1D345] # TETRAGRAM FOR SINKING
+1D346 ; [*0BBD.0020.0002.1D346] # TETRAGRAM FOR INNER
+1D347 ; [*0BBE.0020.0002.1D347] # TETRAGRAM FOR DEPARTURE
+1D348 ; [*0BBF.0020.0002.1D348] # TETRAGRAM FOR DARKENING
+1D349 ; [*0BC0.0020.0002.1D349] # TETRAGRAM FOR DIMMING
+1D34A ; [*0BC1.0020.0002.1D34A] # TETRAGRAM FOR EXHAUSTION
+1D34B ; [*0BC2.0020.0002.1D34B] # TETRAGRAM FOR SEVERANCE
+1D34C ; [*0BC3.0020.0002.1D34C] # TETRAGRAM FOR STOPPAGE
+1D34D ; [*0BC4.0020.0002.1D34D] # TETRAGRAM FOR HARDNESS
+1D34E ; [*0BC5.0020.0002.1D34E] # TETRAGRAM FOR COMPLETION
+1D34F ; [*0BC6.0020.0002.1D34F] # TETRAGRAM FOR CLOSURE
+1D350 ; [*0BC7.0020.0002.1D350] # TETRAGRAM FOR FAILURE
+1D351 ; [*0BC8.0020.0002.1D351] # TETRAGRAM FOR AGGRAVATION
+1D352 ; [*0BC9.0020.0002.1D352] # TETRAGRAM FOR COMPLIANCE
+1D353 ; [*0BCA.0020.0002.1D353] # TETRAGRAM FOR ON THE VERGE
+1D354 ; [*0BCB.0020.0002.1D354] # TETRAGRAM FOR DIFFICULTIES
+1D355 ; [*0BCC.0020.0002.1D355] # TETRAGRAM FOR LABOURING
+1D356 ; [*0BCD.0020.0002.1D356] # TETRAGRAM FOR FOSTERING
+1D6C1 ; [*041E.0020.0005.1D6C1] # MATHEMATICAL BOLD NABLA; QQK
+1D6DB ; [*041A.0020.0005.1D6DB] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL; QQK
+1D6FB ; [*041E.0020.0005.1D6FB] # MATHEMATICAL ITALIC NABLA; QQK
+1D715 ; [*041A.0020.0005.1D715] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL; QQK
+1D735 ; [*041E.0020.0005.1D735] # MATHEMATICAL BOLD ITALIC NABLA; QQK
+1D74F ; [*041A.0020.0005.1D74F] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL; QQK
+1D76F ; [*041E.0020.0005.1D76F] # MATHEMATICAL SANS-SERIF BOLD NABLA; QQK
+1D789 ; [*041A.0020.0005.1D789] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL; QQK
+1D7A9 ; [*041E.0020.0005.1D7A9] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA; QQK
+1D7C3 ; [*041A.0020.0005.1D7C3] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL; QQK
+0332 ; [.0000.0021.0002.0332] # COMBINING LOW LINE
+0313 ; [.0000.0022.0002.0313] # COMBINING COMMA ABOVE
+0343 ; [.0000.0022.0002.0343] # COMBINING GREEK KORONIS; QQC
+0314 ; [.0000.002A.0002.0314] # COMBINING REVERSED COMMA ABOVE
+0301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
+0341 ; [.0000.0032.0002.0341] # COMBINING ACUTE TONE MARK; QQC
+0300 ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT
+0340 ; [.0000.0035.0002.0340] # COMBINING GRAVE TONE MARK; QQC
+0306 ; [.0000.0037.0002.0306] # COMBINING BREVE
+0302 ; [.0000.003C.0002.0302] # COMBINING CIRCUMFLEX ACCENT
+030C ; [.0000.0041.0002.030C] # COMBINING CARON
+030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
+0342 ; [.0000.0045.0002.0342] # COMBINING GREEK PERISPOMENI
+0308 ; [.0000.0047.0002.0308] # COMBINING DIAERESIS
+0344 ; [.0000.0047.0002.0308][.0000.0032.0002.0301] # COMBINING GREEK DIALYTIKA TONOS; QQCM
+030B ; [.0000.004D.0002.030B] # COMBINING DOUBLE ACUTE ACCENT
+0303 ; [.0000.004E.0002.0303] # COMBINING TILDE
+0307 ; [.0000.0052.0002.0307] # COMBINING DOT ABOVE
+0338 ; [.0000.0054.0002.0338] # COMBINING LONG SOLIDUS OVERLAY
+0327 ; [.0000.0055.0002.0327] # COMBINING CEDILLA
+0328 ; [.0000.0058.0002.0328] # COMBINING OGONEK
+0304 ; [.0000.005A.0002.0304] # COMBINING MACRON
+0305 ; [.0000.005E.0002.0305] # COMBINING OVERLINE
+0309 ; [.0000.005F.0002.0309] # COMBINING HOOK ABOVE
+030D ; [.0000.0060.0002.030D] # COMBINING VERTICAL LINE ABOVE
+030E ; [.0000.0061.0002.030E] # COMBINING DOUBLE VERTICAL LINE ABOVE
+030F ; [.0000.0062.0002.030F] # COMBINING DOUBLE GRAVE ACCENT
+0310 ; [.0000.0063.0002.0310] # COMBINING CANDRABINDU
+0311 ; [.0000.0064.0002.0311] # COMBINING INVERTED BREVE
+0312 ; [.0000.0065.0002.0312] # COMBINING TURNED COMMA ABOVE
+0315 ; [.0000.0066.0002.0315] # COMBINING COMMA ABOVE RIGHT
+0316 ; [.0000.0067.0002.0316] # COMBINING GRAVE ACCENT BELOW
+0317 ; [.0000.0068.0002.0317] # COMBINING ACUTE ACCENT BELOW
+0318 ; [.0000.0069.0002.0318] # COMBINING LEFT TACK BELOW
+0319 ; [.0000.006A.0002.0319] # COMBINING RIGHT TACK BELOW
+031A ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE
+031B ; [.0000.006C.0002.031B] # COMBINING HORN
+031C ; [.0000.0072.0002.031C] # COMBINING LEFT HALF RING BELOW
+031D ; [.0000.0073.0002.031D] # COMBINING UP TACK BELOW
+031E ; [.0000.0074.0002.031E] # COMBINING DOWN TACK BELOW
+031F ; [.0000.0075.0002.031F] # COMBINING PLUS SIGN BELOW
+0320 ; [.0000.0076.0002.0320] # COMBINING MINUS SIGN BELOW
+0321 ; [.0000.0077.0002.0321] # COMBINING PALATALIZED HOOK BELOW
+0322 ; [.0000.0078.0002.0322] # COMBINING RETROFLEX HOOK BELOW
+0323 ; [.0000.0079.0002.0323] # COMBINING DOT BELOW
+0324 ; [.0000.007E.0002.0324] # COMBINING DIAERESIS BELOW
+0325 ; [.0000.007F.0002.0325] # COMBINING RING BELOW
+0326 ; [.0000.0080.0002.0326] # COMBINING COMMA BELOW
+0329 ; [.0000.0081.0002.0329] # COMBINING VERTICAL LINE BELOW
+032A ; [.0000.0082.0002.032A] # COMBINING BRIDGE BELOW
+032B ; [.0000.0083.0002.032B] # COMBINING INVERTED DOUBLE ARCH BELOW
+032C ; [.0000.0084.0002.032C] # COMBINING CARON BELOW
+032D ; [.0000.0085.0002.032D] # COMBINING CIRCUMFLEX ACCENT BELOW
+032E ; [.0000.0086.0002.032E] # COMBINING BREVE BELOW
+032F ; [.0000.0087.0002.032F] # COMBINING INVERTED BREVE BELOW
+0330 ; [.0000.0088.0002.0330] # COMBINING TILDE BELOW
+0331 ; [.0000.0089.0002.0331] # COMBINING MACRON BELOW
+0333 ; [.0000.008A.0002.0333] # COMBINING DOUBLE LOW LINE
+0334 ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
+0335 ; [.0000.008C.0002.0335] # COMBINING SHORT STROKE OVERLAY
+0336 ; [.0000.008D.0002.0336] # COMBINING LONG STROKE OVERLAY
+0337 ; [.0000.008E.0002.0337] # COMBINING SHORT SOLIDUS OVERLAY
+0339 ; [.0000.008F.0002.0339] # COMBINING RIGHT HALF RING BELOW
+033A ; [.0000.0090.0002.033A] # COMBINING INVERTED BRIDGE BELOW
+033B ; [.0000.0091.0002.033B] # COMBINING SQUARE BELOW
+033C ; [.0000.0092.0002.033C] # COMBINING SEAGULL BELOW
+033D ; [.0000.0093.0002.033D] # COMBINING X ABOVE
+033E ; [.0000.0094.0002.033E] # COMBINING VERTICAL TILDE
+033F ; [.0000.0095.0002.033F] # COMBINING DOUBLE OVERLINE
+0345 ; [.0000.0096.0002.0345] # COMBINING GREEK YPOGEGRAMMENI
+0346 ; [.0000.0097.0002.0346] # COMBINING BRIDGE ABOVE
+0347 ; [.0000.0098.0002.0347] # COMBINING EQUALS SIGN BELOW
+0348 ; [.0000.0099.0002.0348] # COMBINING DOUBLE VERTICAL LINE BELOW
+0349 ; [.0000.009A.0002.0349] # COMBINING LEFT ANGLE BELOW
+034A ; [.0000.009B.0002.034A] # COMBINING NOT TILDE ABOVE
+034B ; [.0000.009C.0002.034B] # COMBINING HOMOTHETIC ABOVE
+034C ; [.0000.009D.0002.034C] # COMBINING ALMOST EQUAL TO ABOVE
+034D ; [.0000.009E.0002.034D] # COMBINING LEFT RIGHT ARROW BELOW
+034E ; [.0000.009F.0002.034E] # COMBINING UPWARDS ARROW BELOW
+0350 ; [.0000.00A0.0002.0350] # COMBINING RIGHT ARROWHEAD ABOVE
+0351 ; [.0000.00A1.0002.0351] # COMBINING LEFT HALF RING ABOVE
+0352 ; [.0000.00A2.0002.0352] # COMBINING FERMATA
+0353 ; [.0000.00A3.0002.0353] # COMBINING X BELOW
+0354 ; [.0000.00A4.0002.0354] # COMBINING LEFT ARROWHEAD BELOW
+0355 ; [.0000.00A5.0002.0355] # COMBINING RIGHT ARROWHEAD BELOW
+0356 ; [.0000.00A6.0002.0356] # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357 ; [.0000.00A7.0002.0357] # COMBINING RIGHT HALF RING ABOVE
+035D ; [.0000.00A8.0002.035D] # COMBINING DOUBLE BREVE
+035E ; [.0000.00A9.0002.035E] # COMBINING DOUBLE MACRON
+035F ; [.0000.00AA.0002.035F] # COMBINING DOUBLE MACRON BELOW
+0360 ; [.0000.00AB.0002.0360] # COMBINING DOUBLE TILDE
+FE22 ; [.0000.00AB.0002.FE22] # COMBINING DOUBLE TILDE LEFT HALF; QQC
+0361 ; [.0000.00AC.0002.0361] # COMBINING DOUBLE INVERTED BREVE
+FE20 ; [.0000.00AC.0002.FE20] # COMBINING LIGATURE LEFT HALF; QQC
+0362 ; [.0000.00AD.0002.0362] # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0483 ; [.0000.00AE.0002.0483] # COMBINING CYRILLIC TITLO
+0484 ; [.0000.00AF.0002.0484] # COMBINING CYRILLIC PALATALIZATION
+0485 ; [.0000.00B0.0002.0485] # COMBINING CYRILLIC DASIA PNEUMATA
+0486 ; [.0000.00B1.0002.0486] # COMBINING CYRILLIC PSILI PNEUMATA
+05B0 ; [.0000.00B2.0002.05B0] # HEBREW POINT SHEVA
+05B1 ; [.0000.00B3.0002.05B1] # HEBREW POINT HATAF SEGOL
+05B2 ; [.0000.00B4.0002.05B2] # HEBREW POINT HATAF PATAH
+05B3 ; [.0000.00B5.0002.05B3] # HEBREW POINT HATAF QAMATS
+05B4 ; [.0000.00B6.0002.05B4] # HEBREW POINT HIRIQ
+05B5 ; [.0000.00B7.0002.05B5] # HEBREW POINT TSERE
+05B6 ; [.0000.00B8.0002.05B6] # HEBREW POINT SEGOL
+05B7 ; [.0000.00B9.0002.05B7] # HEBREW POINT PATAH
+05B8 ; [.0000.00BA.0002.05B8] # HEBREW POINT QAMATS
+05B9 ; [.0000.00BB.0002.05B9] # HEBREW POINT HOLAM
+05BB ; [.0000.00BC.0002.05BB] # HEBREW POINT QUBUTS
+05C2 ; [.0000.00BD.0002.05C2] # HEBREW POINT SIN DOT
+05C1 ; [.0000.00BE.0002.05C1] # HEBREW POINT SHIN DOT
+05BC ; [.0000.00BF.0002.05BC] # HEBREW POINT DAGESH OR MAPIQ
+05BF ; [.0000.00C2.0002.05BF] # HEBREW POINT RAFE
+FB1E ; [.0000.00C3.0002.FB1E] # HEBREW POINT JUDEO-SPANISH VARIKA
+064B ; [.0000.00C4.0002.064B] # ARABIC FATHATAN
+FE71 ; [.0000.00C4.0018.FE71] # ARABIC TATWEEL WITH FATHATAN ABOVE; QQK
+FE70 ; [.0000.00C4.001A.FE70] # ARABIC FATHATAN ISOLATED FORM; QQK
+064C ; [.0000.00C5.0002.064C] # ARABIC DAMMATAN
+FE72 ; [.0000.00C5.001A.FE72] # ARABIC DAMMATAN ISOLATED FORM; QQK
+064D ; [.0000.00C7.0002.064D] # ARABIC KASRATAN
+FE74 ; [.0000.00C7.001A.FE74] # ARABIC KASRATAN ISOLATED FORM; QQK
+064E ; [.0000.00C9.0002.064E] # ARABIC FATHA
+FE77 ; [.0000.00C9.0018.FE77] # ARABIC FATHA MEDIAL FORM; QQK
+FE76 ; [.0000.00C9.001A.FE76] # ARABIC FATHA ISOLATED FORM; QQK
+064F ; [.0000.00CB.0002.064F] # ARABIC DAMMA
+FE79 ; [.0000.00CB.0018.FE79] # ARABIC DAMMA MEDIAL FORM; QQK
+FE78 ; [.0000.00CB.001A.FE78] # ARABIC DAMMA ISOLATED FORM; QQK
+0650 ; [.0000.00CD.0002.0650] # ARABIC KASRA
+FE7B ; [.0000.00CD.0018.FE7B] # ARABIC KASRA MEDIAL FORM; QQK
+FE7A ; [.0000.00CD.001A.FE7A] # ARABIC KASRA ISOLATED FORM; QQK
+0651 ; [.0000.00CF.0002.0651] # ARABIC SHADDA
+FCF2 ; [.0000.00CF.0018.FCF2] # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM; QQKM
+FCF3 ; [.0000.00CF.0018.FCF3] # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM; QQKM
+FCF4 ; [.0000.00CF.0018.FCF4] # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM; QQKM
+FE7D ; [.0000.00CF.0018.FE7D] # ARABIC SHADDA MEDIAL FORM; QQK
+FC5E ; [.0000.00CF.001A.FC5E] # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM; QQKM
+FC5F ; [.0000.00CF.001A.FC5F] # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM; QQKM
+FC60 ; [.0000.00CF.001A.FC60] # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM; QQKM
+FC61 ; [.0000.00CF.001A.FC61] # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM; QQKM
+FC62 ; [.0000.00CF.001A.FC62] # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM; QQKM
+FE7C ; [.0000.00CF.001A.FE7C] # ARABIC SHADDA ISOLATED FORM; QQK
+FC63 ; [.0000.00CF.001A.FC63][.0000.00D8.001A.FC63] # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+0652 ; [.0000.00D1.0002.0652] # ARABIC SUKUN
+FE7F ; [.0000.00D1.0018.FE7F] # ARABIC SUKUN MEDIAL FORM; QQK
+FE7E ; [.0000.00D1.001A.FE7E] # ARABIC SUKUN ISOLATED FORM; QQK
+0653 ; [.0000.00D2.0002.0653] # ARABIC MADDAH ABOVE
+0654 ; [.0000.00D3.0002.0654] # ARABIC HAMZA ABOVE
+0655 ; [.0000.00D4.0002.0655] # ARABIC HAMZA BELOW
+0656 ; [.0000.00D5.0002.0656] # ARABIC SUBSCRIPT ALEF
+0657 ; [.0000.00D6.0002.0657] # ARABIC INVERTED DAMMA
+0658 ; [.0000.00D7.0002.0658] # ARABIC MARK NOON GHUNNA
+0670 ; [.0000.00D8.0002.0670] # ARABIC LETTER SUPERSCRIPT ALEF
+0711 ; [.0000.00D9.0002.0711] # SYRIAC LETTER SUPERSCRIPT ALAPH
+0730 ; [.0000.00DA.0002.0730] # SYRIAC PTHAHA ABOVE
+0731 ; [.0000.00DB.0002.0731] # SYRIAC PTHAHA BELOW
+0732 ; [.0000.00DC.0002.0732] # SYRIAC PTHAHA DOTTED
+0733 ; [.0000.00DD.0002.0733] # SYRIAC ZQAPHA ABOVE
+0734 ; [.0000.00DE.0002.0734] # SYRIAC ZQAPHA BELOW
+0735 ; [.0000.00DF.0002.0735] # SYRIAC ZQAPHA DOTTED
+0736 ; [.0000.00E0.0002.0736] # SYRIAC RBASA ABOVE
+0737 ; [.0000.00E1.0002.0737] # SYRIAC RBASA BELOW
+0738 ; [.0000.00E2.0002.0738] # SYRIAC DOTTED ZLAMA HORIZONTAL
+0739 ; [.0000.00E3.0002.0739] # SYRIAC DOTTED ZLAMA ANGULAR
+073A ; [.0000.00E4.0002.073A] # SYRIAC HBASA ABOVE
+073B ; [.0000.00E5.0002.073B] # SYRIAC HBASA BELOW
+073C ; [.0000.00E6.0002.073C] # SYRIAC HBASA-ESASA DOTTED
+073D ; [.0000.00E7.0002.073D] # SYRIAC ESASA ABOVE
+073E ; [.0000.00E8.0002.073E] # SYRIAC ESASA BELOW
+073F ; [.0000.00E9.0002.073F] # SYRIAC RWAHA
+0740 ; [.0000.00EA.0002.0740] # SYRIAC FEMININE DOT
+0741 ; [.0000.00EB.0002.0741] # SYRIAC QUSHSHAYA
+0742 ; [.0000.00EC.0002.0742] # SYRIAC RUKKAKHA
+0743 ; [.0000.00ED.0002.0743] # SYRIAC TWO VERTICAL DOTS ABOVE
+0744 ; [.0000.00EE.0002.0744] # SYRIAC TWO VERTICAL DOTS BELOW
+0745 ; [.0000.00EF.0002.0745] # SYRIAC THREE DOTS ABOVE
+0746 ; [.0000.00F0.0002.0746] # SYRIAC THREE DOTS BELOW
+0747 ; [.0000.00F1.0002.0747] # SYRIAC OBLIQUE LINE ABOVE
+0748 ; [.0000.00F2.0002.0748] # SYRIAC OBLIQUE LINE BELOW
+0749 ; [.0000.00F3.0002.0749] # SYRIAC MUSIC
+074A ; [.0000.00F4.0002.074A] # SYRIAC BARREKH
+093C ; [.0000.00F5.0002.093C] # DEVANAGARI SIGN NUKTA
+0901 ; [.0000.00F6.0002.0901] # DEVANAGARI SIGN CANDRABINDU
+0902 ; [.0000.00F7.0002.0902] # DEVANAGARI SIGN ANUSVARA
+0903 ; [.0000.00F8.0002.0903] # DEVANAGARI SIGN VISARGA
+0951 ; [.0000.00F9.0002.0951] # DEVANAGARI STRESS SIGN UDATTA
+0952 ; [.0000.00FA.0002.0952] # DEVANAGARI STRESS SIGN ANUDATTA
+0953 ; [.0000.00FB.0002.0953] # DEVANAGARI GRAVE ACCENT
+0954 ; [.0000.00FC.0002.0954] # DEVANAGARI ACUTE ACCENT
+09BC ; [.0000.00FD.0002.09BC] # BENGALI SIGN NUKTA
+0981 ; [.0000.00FE.0002.0981] # BENGALI SIGN CANDRABINDU
+0982 ; [.0000.00FF.0002.0982] # BENGALI SIGN ANUSVARA
+0983 ; [.0000.0100.0002.0983] # BENGALI SIGN VISARGA
+0A3C ; [.0000.0101.0002.0A3C] # GURMUKHI SIGN NUKTA
+0A01 ; [.0000.0102.0002.0A01] # GURMUKHI SIGN ADAK BINDI
+0A02 ; [.0000.0103.0002.0A02] # GURMUKHI SIGN BINDI
+0A03 ; [.0000.0104.0002.0A03] # GURMUKHI SIGN VISARGA
+0A70 ; [.0000.0105.0002.0A70] # GURMUKHI TIPPI
+0A71 ; [.0000.0106.0002.0A71] # GURMUKHI ADDAK
+0ABC ; [.0000.0107.0002.0ABC] # GUJARATI SIGN NUKTA
+0A81 ; [.0000.0108.0002.0A81] # GUJARATI SIGN CANDRABINDU
+0A82 ; [.0000.0109.0002.0A82] # GUJARATI SIGN ANUSVARA
+0A83 ; [.0000.010A.0002.0A83] # GUJARATI SIGN VISARGA
+0B3C ; [.0000.010B.0002.0B3C] # ORIYA SIGN NUKTA
+0B01 ; [.0000.010C.0002.0B01] # ORIYA SIGN CANDRABINDU
+0B02 ; [.0000.010D.0002.0B02] # ORIYA SIGN ANUSVARA
+0B03 ; [.0000.010E.0002.0B03] # ORIYA SIGN VISARGA
+0B82 ; [.0000.010F.0002.0B82] # TAMIL SIGN ANUSVARA
+0C01 ; [.0000.0110.0002.0C01] # TELUGU SIGN CANDRABINDU
+0C02 ; [.0000.0111.0002.0C02] # TELUGU SIGN ANUSVARA
+0C03 ; [.0000.0112.0002.0C03] # TELUGU SIGN VISARGA
+0CBC ; [.0000.0113.0002.0CBC] # KANNADA SIGN NUKTA
+0C82 ; [.0000.0114.0002.0C82] # KANNADA SIGN ANUSVARA
+0C83 ; [.0000.0115.0002.0C83] # KANNADA SIGN VISARGA
+0D02 ; [.0000.0116.0002.0D02] # MALAYALAM SIGN ANUSVARA
+0D03 ; [.0000.0117.0002.0D03] # MALAYALAM SIGN VISARGA
+0D82 ; [.0000.0118.0002.0D82] # SINHALA SIGN ANUSVARAYA
+0D83 ; [.0000.0119.0002.0D83] # SINHALA SIGN VISARGAYA
+0E47 ; [.0000.011A.0002.0E47] # THAI CHARACTER MAITAIKHU
+0E48 ; [.0000.011B.0002.0E48] # THAI CHARACTER MAI EK
+0E49 ; [.0000.011C.0002.0E49] # THAI CHARACTER MAI THO
+0E4A ; [.0000.011D.0002.0E4A] # THAI CHARACTER MAI TRI
+0E4B ; [.0000.011E.0002.0E4B] # THAI CHARACTER MAI CHATTAWA
+0EC8 ; [.0000.011F.0002.0EC8] # LAO TONE MAI EK
+0EC9 ; [.0000.0120.0002.0EC9] # LAO TONE MAI THO
+0ECA ; [.0000.0121.0002.0ECA] # LAO TONE MAI TI
+0ECB ; [.0000.0122.0002.0ECB] # LAO TONE MAI CATAWA
+0F39 ; [.0000.0123.0002.0F39] # TIBETAN MARK TSA -PHRU
+0F7E ; [.0000.0124.0002.0F7E] # TIBETAN SIGN RJES SU NGA RO
+0F7F ; [.0000.0125.0002.0F7F] # TIBETAN SIGN RNAM BCAD
+1036 ; [.0000.0126.0002.1036] # MYANMAR SIGN ANUSVARA
+1037 ; [.0000.0127.0002.1037] # MYANMAR SIGN DOT BELOW
+1038 ; [.0000.0128.0002.1038] # MYANMAR SIGN VISARGA
+17C6 ; [.0000.0129.0002.17C6] # KHMER SIGN NIKAHIT
+17C7 ; [.0000.012A.0002.17C7] # KHMER SIGN REAHMUK
+17C8 ; [.0000.012B.0002.17C8] # KHMER SIGN YUUKALEAPINTU
+17C9 ; [.0000.012C.0002.17C9] # KHMER SIGN MUUSIKATOAN
+17CA ; [.0000.012D.0002.17CA] # KHMER SIGN TRIISAP
+17CB ; [.0000.012E.0002.17CB] # KHMER SIGN BANTOC
+17CC ; [.0000.012F.0002.17CC] # KHMER SIGN ROBAT
+17CD ; [.0000.0130.0002.17CD] # KHMER SIGN TOANDAKHIAT
+17CE ; [.0000.0131.0002.17CE] # KHMER SIGN KAKABAT
+17CF ; [.0000.0132.0002.17CF] # KHMER SIGN AHSDA
+17D0 ; [.0000.0133.0002.17D0] # KHMER SIGN SAMYOK SANNYA
+17D1 ; [.0000.0134.0002.17D1] # KHMER SIGN VIRIAM
+17D3 ; [.0000.0135.0002.17D3] # KHMER SIGN BATHAMASAT
+17DD ; [.0000.0136.0002.17DD] # KHMER SIGN ATTHACAN
+1939 ; [.0000.0137.0002.1939] # LIMBU SIGN MUKPHRENG
+193A ; [.0000.0138.0002.193A] # LIMBU SIGN KEMPHRENG
+193B ; [.0000.0139.0002.193B] # LIMBU SIGN SA-I
+302A ; [.0000.013A.0002.302A] # IDEOGRAPHIC LEVEL TONE MARK
+302B ; [.0000.013B.0002.302B] # IDEOGRAPHIC RISING TONE MARK
+302C ; [.0000.013C.0002.302C] # IDEOGRAPHIC DEPARTING TONE MARK
+302D ; [.0000.013D.0002.302D] # IDEOGRAPHIC ENTERING TONE MARK
+302E ; [.0000.013E.0002.302E] # HANGUL SINGLE DOT TONE MARK
+302F ; [.0000.013F.0002.302F] # HANGUL DOUBLE DOT TONE MARK
+3099 ; [.0000.0140.0002.3099] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+FF9E ; [.0000.0140.0012.FF9E] # HALFWIDTH KATAKANA VOICED SOUND MARK; QQK
+309A ; [.0000.0141.0002.309A] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FF9F ; [.0000.0141.0012.FF9F] # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK; QQK
+20D0 ; [.0000.0142.0002.20D0] # COMBINING LEFT HARPOON ABOVE
+20D1 ; [.0000.0143.0002.20D1] # COMBINING RIGHT HARPOON ABOVE
+20D2 ; [.0000.0144.0002.20D2] # COMBINING LONG VERTICAL LINE OVERLAY
+20D3 ; [.0000.0145.0002.20D3] # COMBINING SHORT VERTICAL LINE OVERLAY
+20D4 ; [.0000.0146.0002.20D4] # COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5 ; [.0000.0147.0002.20D5] # COMBINING CLOCKWISE ARROW ABOVE
+20D6 ; [.0000.0148.0002.20D6] # COMBINING LEFT ARROW ABOVE
+20D7 ; [.0000.0149.0002.20D7] # COMBINING RIGHT ARROW ABOVE
+20D8 ; [.0000.014A.0002.20D8] # COMBINING RING OVERLAY
+20D9 ; [.0000.014B.0002.20D9] # COMBINING CLOCKWISE RING OVERLAY
+20DA ; [.0000.014C.0002.20DA] # COMBINING ANTICLOCKWISE RING OVERLAY
+20DB ; [.0000.014D.0002.20DB] # COMBINING THREE DOTS ABOVE
+20DC ; [.0000.014E.0002.20DC] # COMBINING FOUR DOTS ABOVE
+20DD ; [.0000.014F.0002.20DD] # COMBINING ENCLOSING CIRCLE
+20DE ; [.0000.0150.0002.20DE] # COMBINING ENCLOSING SQUARE
+20DF ; [.0000.0151.0002.20DF] # COMBINING ENCLOSING DIAMOND
+20E0 ; [.0000.0152.0002.20E0] # COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 ; [.0000.0153.0002.20E1] # COMBINING LEFT RIGHT ARROW ABOVE
+20E2 ; [.0000.0154.0002.20E2] # COMBINING ENCLOSING SCREEN
+20E3 ; [.0000.0155.0002.20E3] # COMBINING ENCLOSING KEYCAP
+20E4 ; [.0000.0156.0002.20E4] # COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5 ; [.0000.0157.0002.20E5] # COMBINING REVERSE SOLIDUS OVERLAY
+20E6 ; [.0000.0158.0002.20E6] # COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7 ; [.0000.0159.0002.20E7] # COMBINING ANNUITY SYMBOL
+20E8 ; [.0000.015A.0002.20E8] # COMBINING TRIPLE UNDERDOT
+20E9 ; [.0000.015B.0002.20E9] # COMBINING WIDE BRIDGE ABOVE
+20EA ; [.0000.015C.0002.20EA] # COMBINING LEFTWARDS ARROW OVERLAY
+02D0 ; [.0E01.0020.0002.02D0] # MODIFIER LETTER TRIANGULAR COLON
+02D1 ; [.0E02.0020.0002.02D1] # MODIFIER LETTER HALF TRIANGULAR COLON
+0E46 ; [.0E03.0020.0002.0E46] # THAI CHARACTER MAIYAMOK
+0EC6 ; [.0E04.0020.0002.0EC6] # LAO KO LA
+3005 ; [.0E05.0020.0002.3005] # IDEOGRAPHIC ITERATION MARK
+303B ; [.0E06.0020.0002.303B] # VERTICAL IDEOGRAPHIC ITERATION MARK
+3031 ; [.0E07.0020.0002.3031] # VERTICAL KANA REPEAT MARK
+3032 ; [.0E07.0020.0002.3031][.0000.0140.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK; QQCM
+3033 ; [.0E08.0020.0002.3033] # VERTICAL KANA REPEAT MARK UPPER HALF
+3034 ; [.0E08.0020.0002.3033][.0000.0140.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF; QQCM
+3035 ; [.0E09.0020.0002.3035] # VERTICAL KANA REPEAT MARK LOWER HALF
+309D ; [.0E0A.0020.0002.309D] # HIRAGANA ITERATION MARK
+309E ; [.0E0A.0020.0002.309D][.0000.0140.0002.3099] # HIRAGANA VOICED ITERATION MARK; QQCM
+30FC ; [.0E0B.0020.0002.30FC] # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF70 ; [.0E0B.0020.0012.FF70] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK; QQK
+30FD ; [.0E0C.0020.0002.30FD] # KATAKANA ITERATION MARK
+30FE ; [.0E0C.0020.0002.30FD][.0000.0140.0002.3099] # KATAKANA VOICED ITERATION MARK; QQCM
+00A4 ; [.0E0D.0020.0002.00A4] # CURRENCY SIGN
+00A2 ; [.0E0E.0020.0002.00A2] # CENT SIGN
+FFE0 ; [.0E0E.0020.0003.FFE0] # FULLWIDTH CENT SIGN; QQK
+0024 ; [.0E0F.0020.0002.0024] # DOLLAR SIGN
+FF04 ; [.0E0F.0020.0003.FF04] # FULLWIDTH DOLLAR SIGN; QQK
+FE69 ; [.0E0F.0020.000F.FE69] # SMALL DOLLAR SIGN; QQK
+00A3 ; [.0E10.0020.0002.00A3] # POUND SIGN
+FFE1 ; [.0E10.0020.0003.FFE1] # FULLWIDTH POUND SIGN; QQK
+00A5 ; [.0E11.0020.0002.00A5] # YEN SIGN
+FFE5 ; [.0E11.0020.0003.FFE5] # FULLWIDTH YEN SIGN; QQK
+09F2 ; [.0E12.0020.0002.09F2] # BENGALI RUPEE MARK
+09F3 ; [.0E13.0020.0002.09F3] # BENGALI RUPEE SIGN
+0AF1 ; [.0E14.0020.0002.0AF1] # GUJARATI RUPEE SIGN
+0BF9 ; [.0E15.0020.0002.0BF9] # TAMIL RUPEE SIGN
+0E3F ; [.0E16.0020.0002.0E3F] # THAI CURRENCY SYMBOL BAHT
+17DB ; [.0E17.0020.0002.17DB] # KHMER CURRENCY SYMBOL RIEL
+20A0 ; [.0E18.0020.0002.20A0] # EURO-CURRENCY SIGN
+20A1 ; [.0E19.0020.0002.20A1] # COLON SIGN
+20A2 ; [.0E1A.0020.0002.20A2] # CRUZEIRO SIGN
+20A3 ; [.0E1B.0020.0002.20A3] # FRENCH FRANC SIGN
+20A4 ; [.0E1C.0020.0002.20A4] # LIRA SIGN
+20A5 ; [.0E1D.0020.0002.20A5] # MILL SIGN
+20A6 ; [.0E1E.0020.0002.20A6] # NAIRA SIGN
+20A7 ; [.0E1F.0020.0002.20A7] # PESETA SIGN
+20A9 ; [.0E20.0020.0002.20A9] # WON SIGN
+FFE6 ; [.0E20.0020.0003.FFE6] # FULLWIDTH WON SIGN; QQK
+20AA ; [.0E21.0020.0002.20AA] # NEW SHEQEL SIGN
+20AB ; [.0E22.0020.0002.20AB] # DONG SIGN
+20AC ; [.0E23.0020.0002.20AC] # EURO SIGN
+20AD ; [.0E24.0020.0002.20AD] # KIP SIGN
+20AE ; [.0E25.0020.0002.20AE] # TUGRIK SIGN
+20AF ; [.0E26.0020.0002.20AF] # DRACHMA SIGN
+20B0 ; [.0E27.0020.0002.20B0] # GERMAN PENNY SIGN
+20B1 ; [.0E28.0020.0002.20B1] # PESO SIGN
+0030 ; [.0E29.0020.0002.0030] # DIGIT ZERO
+FF10 ; [.0E29.0020.0003.FF10] # FULLWIDTH DIGIT ZERO; QQK
+1D7CE ; [.0E29.0020.0005.1D7CE] # MATHEMATICAL BOLD DIGIT ZERO; QQK
+1D7D8 ; [.0E29.0020.0005.1D7D8] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO; QQK
+1D7E2 ; [.0E29.0020.0005.1D7E2] # MATHEMATICAL SANS-SERIF DIGIT ZERO; QQK
+1D7EC ; [.0E29.0020.0005.1D7EC] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO; QQK
+1D7F6 ; [.0E29.0020.0005.1D7F6] # MATHEMATICAL MONOSPACE DIGIT ZERO; QQK
+24EA ; [.0E29.0020.0006.24EA] # CIRCLED DIGIT ZERO; QQK
+24FF ; [.0E29.0020.0006.24FF] # NEGATIVE CIRCLED DIGIT ZERO; QQK
+2070 ; [.0E29.0020.0014.2070] # SUPERSCRIPT ZERO; QQK
+2080 ; [.0E29.0020.0015.2080] # SUBSCRIPT ZERO; QQK
+0660 ; [.0E29.0020.0002.0660][.0000.0163.0002.0660] # ARABIC-INDIC DIGIT ZERO
+06F0 ; [.0E29.0020.0002.06F0][.0000.0164.0002.06F0] # EXTENDED ARABIC-INDIC DIGIT ZERO
+104A0 ; [.0E29.0020.0002.104A0][.0000.0166.0002.104A0] # OSMANYA DIGIT ZERO
+0966 ; [.0E29.0020.0002.0966][.0000.0167.0002.0966] # DEVANAGARI DIGIT ZERO
+09E6 ; [.0E29.0020.0002.09E6][.0000.0168.0002.09E6] # BENGALI DIGIT ZERO
+0A66 ; [.0E29.0020.0002.0A66][.0000.016A.0002.0A66] # GURMUKHI DIGIT ZERO
+0AE6 ; [.0E29.0020.0002.0AE6][.0000.016B.0002.0AE6] # GUJARATI DIGIT ZERO
+0B66 ; [.0E29.0020.0002.0B66][.0000.016C.0002.0B66] # ORIYA DIGIT ZERO
+0C66 ; [.0E29.0020.0002.0C66][.0000.016E.0002.0C66] # TELUGU DIGIT ZERO
+0CE6 ; [.0E29.0020.0002.0CE6][.0000.016F.0002.0CE6] # KANNADA DIGIT ZERO
+0D66 ; [.0E29.0020.0002.0D66][.0000.0170.0002.0D66] # MALAYALAM DIGIT ZERO
+1946 ; [.0E29.0020.0002.1946][.0000.0171.0002.1946] # LIMBU DIGIT ZERO
+0E50 ; [.0E29.0020.0002.0E50][.0000.0172.0002.0E50] # THAI DIGIT ZERO
+0ED0 ; [.0E29.0020.0002.0ED0][.0000.0173.0002.0ED0] # LAO DIGIT ZERO
+0F20 ; [.0E29.0020.0002.0F20][.0000.0174.0002.0F20] # TIBETAN DIGIT ZERO
+0F33 ; [.0E29.0020.0004.0F33][.0000.0174.0004.0F33] # TIBETAN DIGIT HALF ZERO; QQK
+1040 ; [.0E29.0020.0002.1040][.0000.0175.0002.1040] # MYANMAR DIGIT ZERO
+17E0 ; [.0E29.0020.0002.17E0][.0000.0176.0002.17E0] # KHMER DIGIT ZERO
+17F0 ; [.0E29.0020.0002.17F0][.0000.0177.0002.17F0] # KHMER SYMBOL LEK ATTAK SON
+1810 ; [.0E29.0020.0002.1810][.0000.0178.0002.1810] # MONGOLIAN DIGIT ZERO
+3007 ; [.0E29.0020.0002.3007][.0000.0179.0002.3007] # IDEOGRAPHIC NUMBER ZERO
+3358 ; [.0E29.0020.0004.3358][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO; QQKN
+0031 ; [.0E2A.0020.0002.0031] # DIGIT ONE
+FF11 ; [.0E2A.0020.0003.FF11] # FULLWIDTH DIGIT ONE; QQK
+2474 ; [*0288.0020.0004.2474][.0E2A.0020.0004.2474][*0289.0020.001F.2474] # PARENTHESIZED DIGIT ONE; QQKN
+2488 ; [.0E2A.0020.0004.2488][*025D.0020.0004.2488] # DIGIT ONE FULL STOP; QQKN
+1D7CF ; [.0E2A.0020.0005.1D7CF] # MATHEMATICAL BOLD DIGIT ONE; QQK
+1D7D9 ; [.0E2A.0020.0005.1D7D9] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE; QQK
+1D7E3 ; [.0E2A.0020.0005.1D7E3] # MATHEMATICAL SANS-SERIF DIGIT ONE; QQK
+1D7ED ; [.0E2A.0020.0005.1D7ED] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE; QQK
+1D7F7 ; [.0E2A.0020.0005.1D7F7] # MATHEMATICAL MONOSPACE DIGIT ONE; QQK
+2460 ; [.0E2A.0020.0006.2460] # CIRCLED DIGIT ONE; QQK
+24F5 ; [.0E2A.0020.0006.24F5] # DOUBLE CIRCLED DIGIT ONE; QQK
+2776 ; [.0E2A.0020.0006.2776] # DINGBAT NEGATIVE CIRCLED DIGIT ONE; QQK
+2780 ; [.0E2A.0020.0006.2780] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE; QQK
+278A ; [.0E2A.0020.0006.278A] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE; QQK
+00B9 ; [.0E2A.0020.0014.00B9] # SUPERSCRIPT ONE; QQK
+2081 ; [.0E2A.0020.0015.2081] # SUBSCRIPT ONE; QQK
+215F ; [.0E2A.0020.001E.215F][*02CD.0020.001E.215F] # FRACTION NUMERATOR ONE; QQKN
+0661 ; [.0E2A.0020.0002.0661][.0000.0163.0002.0661] # ARABIC-INDIC DIGIT ONE
+06F1 ; [.0E2A.0020.0002.06F1][.0000.0164.0002.06F1] # EXTENDED ARABIC-INDIC DIGIT ONE
+1369 ; [.0E2A.0020.0002.1369][.0000.0165.0002.1369] # ETHIOPIC DIGIT ONE
+104A1 ; [.0E2A.0020.0002.104A1][.0000.0166.0002.104A1] # OSMANYA DIGIT ONE
+0967 ; [.0E2A.0020.0002.0967][.0000.0167.0002.0967] # DEVANAGARI DIGIT ONE
+09E7 ; [.0E2A.0020.0002.09E7][.0000.0168.0002.09E7] # BENGALI DIGIT ONE
+09F4 ; [.0E2A.0020.0002.09F4][.0000.0169.0002.09F4] # BENGALI CURRENCY NUMERATOR ONE
+0A67 ; [.0E2A.0020.0002.0A67][.0000.016A.0002.0A67] # GURMUKHI DIGIT ONE
+0AE7 ; [.0E2A.0020.0002.0AE7][.0000.016B.0002.0AE7] # GUJARATI DIGIT ONE
+0B67 ; [.0E2A.0020.0002.0B67][.0000.016C.0002.0B67] # ORIYA DIGIT ONE
+0BE7 ; [.0E2A.0020.0002.0BE7][.0000.016D.0002.0BE7] # TAMIL DIGIT ONE
+0C67 ; [.0E2A.0020.0002.0C67][.0000.016E.0002.0C67] # TELUGU DIGIT ONE
+0CE7 ; [.0E2A.0020.0002.0CE7][.0000.016F.0002.0CE7] # KANNADA DIGIT ONE
+0D67 ; [.0E2A.0020.0002.0D67][.0000.0170.0002.0D67] # MALAYALAM DIGIT ONE
+1947 ; [.0E2A.0020.0002.1947][.0000.0171.0002.1947] # LIMBU DIGIT ONE
+0E51 ; [.0E2A.0020.0002.0E51][.0000.0172.0002.0E51] # THAI DIGIT ONE
+0ED1 ; [.0E2A.0020.0002.0ED1][.0000.0173.0002.0ED1] # LAO DIGIT ONE
+0F21 ; [.0E2A.0020.0002.0F21][.0000.0174.0002.0F21] # TIBETAN DIGIT ONE
+0F2A ; [.0E2A.0020.0004.0F2A][.0000.0174.0004.0F2A] # TIBETAN DIGIT HALF ONE; QQK
+1041 ; [.0E2A.0020.0002.1041][.0000.0175.0002.1041] # MYANMAR DIGIT ONE
+17E1 ; [.0E2A.0020.0002.17E1][.0000.0176.0002.17E1] # KHMER DIGIT ONE
+17F1 ; [.0E2A.0020.0002.17F1][.0000.0177.0002.17F1] # KHMER SYMBOL LEK ATTAK MUOY
+1811 ; [.0E2A.0020.0002.1811][.0000.0178.0002.1811] # MONGOLIAN DIGIT ONE
+3021 ; [.0E2A.0020.0002.3021][.0000.0179.0002.3021] # HANGZHOU NUMERAL ONE
+10107 ; [.0E2A.0020.0002.10107][.0000.017A.0002.10107] # AEGEAN NUMBER ONE
+10320 ; [.0E2A.0020.0002.10320][.0000.017B.0002.10320] # OLD ITALIC NUMERAL ONE
+2491 ; [.0E2A.0020.0004.2491][.0E29.0020.0004.2491][*025D.0020.001F.2491] # NUMBER TEN FULL STOP; QQKN
+247D ; [*0288.0020.0004.247D][.0E2A.0020.0004.247D][.0E29.0020.001F.247D][*0289.0020.001F.247D] # PARENTHESIZED NUMBER TEN; QQKN
+2469 ; [.0E2A.0020.0006.2469][.0E29.0020.0006.2469] # CIRCLED NUMBER TEN; QQKN
+24FE ; [.0E2A.0020.0006.24FE][.0E29.0020.0006.24FE] # DOUBLE CIRCLED NUMBER TEN; QQKN
+277F ; [.0E2A.0020.0006.277F][.0E29.0020.0006.277F] # DINGBAT NEGATIVE CIRCLED NUMBER TEN; QQKN
+2789 ; [.0E2A.0020.0006.2789][.0E29.0020.0006.2789] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN; QQKN
+2793 ; [.0E2A.0020.0006.2793][.0E29.0020.0006.2793] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN; QQKN
+33E9 ; [.0E2A.0020.0004.33E9][.0E29.0020.0004.33E9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN; QQKN
+32C9 ; [.0E2A.0020.0004.32C9][.0E29.0020.0004.32C9][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER; QQKN
+3362 ; [.0E2A.0020.0004.3362][.0E29.0020.0004.3362][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN; QQKN
+2492 ; [.0E2A.0020.0004.2492][.0E2A.0020.0004.2492][*025D.0020.001F.2492] # NUMBER ELEVEN FULL STOP; QQKN
+247E ; [*0288.0020.0004.247E][.0E2A.0020.0004.247E][.0E2A.0020.001F.247E][*0289.0020.001F.247E] # PARENTHESIZED NUMBER ELEVEN; QQKN
+246A ; [.0E2A.0020.0006.246A][.0E2A.0020.0006.246A] # CIRCLED NUMBER ELEVEN; QQKN
+24EB ; [.0E2A.0020.0006.24EB][.0E2A.0020.0006.24EB] # NEGATIVE CIRCLED NUMBER ELEVEN; QQKN
+33EA ; [.0E2A.0020.0004.33EA][.0E2A.0020.0004.33EA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN; QQKN
+32CA ; [.0E2A.0020.0004.32CA][.0E2A.0020.0004.32CA][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER; QQKN
+3363 ; [.0E2A.0020.0004.3363][.0E2A.0020.0004.3363][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN; QQKN
+2493 ; [.0E2A.0020.0004.2493][.0E2B.0020.0004.2493][*025D.0020.001F.2493] # NUMBER TWELVE FULL STOP; QQKN
+247F ; [*0288.0020.0004.247F][.0E2A.0020.0004.247F][.0E2B.0020.001F.247F][*0289.0020.001F.247F] # PARENTHESIZED NUMBER TWELVE; QQKN
+246B ; [.0E2A.0020.0006.246B][.0E2B.0020.0006.246B] # CIRCLED NUMBER TWELVE; QQKN
+24EC ; [.0E2A.0020.0006.24EC][.0E2B.0020.0006.24EC] # NEGATIVE CIRCLED NUMBER TWELVE; QQKN
+00BD ; [.0E2A.0020.001E.00BD][*02CD.0020.001E.00BD][.0E2B.0020.001F.00BD] # VULGAR FRACTION ONE HALF; QQKN
+33EB ; [.0E2A.0020.0004.33EB][.0E2B.0020.0004.33EB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE; QQKN
+32CB ; [.0E2A.0020.0004.32CB][.0E2B.0020.0004.32CB][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER; QQKN
+3364 ; [.0E2A.0020.0004.3364][.0E2B.0020.0004.3364][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE; QQKN
+2494 ; [.0E2A.0020.0004.2494][.0E2C.0020.0004.2494][*025D.0020.001F.2494] # NUMBER THIRTEEN FULL STOP; QQKN
+2480 ; [*0288.0020.0004.2480][.0E2A.0020.0004.2480][.0E2C.0020.001F.2480][*0289.0020.001F.2480] # PARENTHESIZED NUMBER THIRTEEN; QQKN
+246C ; [.0E2A.0020.0006.246C][.0E2C.0020.0006.246C] # CIRCLED NUMBER THIRTEEN; QQKN
+24ED ; [.0E2A.0020.0006.24ED][.0E2C.0020.0006.24ED] # NEGATIVE CIRCLED NUMBER THIRTEEN; QQKN
+2153 ; [.0E2A.0020.001E.2153][*02CD.0020.001E.2153][.0E2C.0020.001F.2153] # VULGAR FRACTION ONE THIRD; QQKN
+33EC ; [.0E2A.0020.0004.33EC][.0E2C.0020.0004.33EC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN; QQKN
+3365 ; [.0E2A.0020.0004.3365][.0E2C.0020.0004.3365][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN; QQKN
+2495 ; [.0E2A.0020.0004.2495][.0E2D.0020.0004.2495][*025D.0020.001F.2495] # NUMBER FOURTEEN FULL STOP; QQKN
+2481 ; [*0288.0020.0004.2481][.0E2A.0020.0004.2481][.0E2D.0020.001F.2481][*0289.0020.001F.2481] # PARENTHESIZED NUMBER FOURTEEN; QQKN
+246D ; [.0E2A.0020.0006.246D][.0E2D.0020.0006.246D] # CIRCLED NUMBER FOURTEEN; QQKN
+24EE ; [.0E2A.0020.0006.24EE][.0E2D.0020.0006.24EE] # NEGATIVE CIRCLED NUMBER FOURTEEN; QQKN
+00BC ; [.0E2A.0020.001E.00BC][*02CD.0020.001E.00BC][.0E2D.0020.001F.00BC] # VULGAR FRACTION ONE QUARTER; QQKN
+33ED ; [.0E2A.0020.0004.33ED][.0E2D.0020.0004.33ED][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN; QQKN
+3366 ; [.0E2A.0020.0004.3366][.0E2D.0020.0004.3366][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN; QQKN
+2496 ; [.0E2A.0020.0004.2496][.0E2E.0020.0004.2496][*025D.0020.001F.2496] # NUMBER FIFTEEN FULL STOP; QQKN
+2482 ; [*0288.0020.0004.2482][.0E2A.0020.0004.2482][.0E2E.0020.001F.2482][*0289.0020.001F.2482] # PARENTHESIZED NUMBER FIFTEEN; QQKN
+246E ; [.0E2A.0020.0006.246E][.0E2E.0020.0006.246E] # CIRCLED NUMBER FIFTEEN; QQKN
+24EF ; [.0E2A.0020.0006.24EF][.0E2E.0020.0006.24EF] # NEGATIVE CIRCLED NUMBER FIFTEEN; QQKN
+2155 ; [.0E2A.0020.001E.2155][*02CD.0020.001E.2155][.0E2E.0020.001F.2155] # VULGAR FRACTION ONE FIFTH; QQKN
+33EE ; [.0E2A.0020.0004.33EE][.0E2E.0020.0004.33EE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN; QQKN
+3367 ; [.0E2A.0020.0004.3367][.0E2E.0020.0004.3367][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN; QQKN
+2497 ; [.0E2A.0020.0004.2497][.0E2F.0020.0004.2497][*025D.0020.001F.2497] # NUMBER SIXTEEN FULL STOP; QQKN
+2483 ; [*0288.0020.0004.2483][.0E2A.0020.0004.2483][.0E2F.0020.001F.2483][*0289.0020.001F.2483] # PARENTHESIZED NUMBER SIXTEEN; QQKN
+246F ; [.0E2A.0020.0006.246F][.0E2F.0020.0006.246F] # CIRCLED NUMBER SIXTEEN; QQKN
+24F0 ; [.0E2A.0020.0006.24F0][.0E2F.0020.0006.24F0] # NEGATIVE CIRCLED NUMBER SIXTEEN; QQKN
+2159 ; [.0E2A.0020.001E.2159][*02CD.0020.001E.2159][.0E2F.0020.001F.2159] # VULGAR FRACTION ONE SIXTH; QQKN
+33EF ; [.0E2A.0020.0004.33EF][.0E2F.0020.0004.33EF][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN; QQKN
+3368 ; [.0E2A.0020.0004.3368][.0E2F.0020.0004.3368][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN; QQKN
+2498 ; [.0E2A.0020.0004.2498][.0E30.0020.0004.2498][*025D.0020.001F.2498] # NUMBER SEVENTEEN FULL STOP; QQKN
+2484 ; [*0288.0020.0004.2484][.0E2A.0020.0004.2484][.0E30.0020.001F.2484][*0289.0020.001F.2484] # PARENTHESIZED NUMBER SEVENTEEN; QQKN
+2470 ; [.0E2A.0020.0006.2470][.0E30.0020.0006.2470] # CIRCLED NUMBER SEVENTEEN; QQKN
+24F1 ; [.0E2A.0020.0006.24F1][.0E30.0020.0006.24F1] # NEGATIVE CIRCLED NUMBER SEVENTEEN; QQKN
+33F0 ; [.0E2A.0020.0004.33F0][.0E30.0020.0004.33F0][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN; QQKN
+3369 ; [.0E2A.0020.0004.3369][.0E30.0020.0004.3369][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN; QQKN
+2499 ; [.0E2A.0020.0004.2499][.0E31.0020.0004.2499][*025D.0020.001F.2499] # NUMBER EIGHTEEN FULL STOP; QQKN
+2485 ; [*0288.0020.0004.2485][.0E2A.0020.0004.2485][.0E31.0020.001F.2485][*0289.0020.001F.2485] # PARENTHESIZED NUMBER EIGHTEEN; QQKN
+2471 ; [.0E2A.0020.0006.2471][.0E31.0020.0006.2471] # CIRCLED NUMBER EIGHTEEN; QQKN
+24F2 ; [.0E2A.0020.0006.24F2][.0E31.0020.0006.24F2] # NEGATIVE CIRCLED NUMBER EIGHTEEN; QQKN
+215B ; [.0E2A.0020.001E.215B][*02CD.0020.001E.215B][.0E31.0020.001F.215B] # VULGAR FRACTION ONE EIGHTH; QQKN
+33F1 ; [.0E2A.0020.0004.33F1][.0E31.0020.0004.33F1][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN; QQKN
+336A ; [.0E2A.0020.0004.336A][.0E31.0020.0004.336A][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN; QQKN
+249A ; [.0E2A.0020.0004.249A][.0E32.0020.0004.249A][*025D.0020.001F.249A] # NUMBER NINETEEN FULL STOP; QQKN
+2486 ; [*0288.0020.0004.2486][.0E2A.0020.0004.2486][.0E32.0020.001F.2486][*0289.0020.001F.2486] # PARENTHESIZED NUMBER NINETEEN; QQKN
+2472 ; [.0E2A.0020.0006.2472][.0E32.0020.0006.2472] # CIRCLED NUMBER NINETEEN; QQKN
+24F3 ; [.0E2A.0020.0006.24F3][.0E32.0020.0006.24F3] # NEGATIVE CIRCLED NUMBER NINETEEN; QQKN
+33F2 ; [.0E2A.0020.0004.33F2][.0E32.0020.0004.33F2][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN; QQKN
+336B ; [.0E2A.0020.0004.336B][.0E32.0020.0004.336B][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN; QQKN
+33E0 ; [.0E2A.0020.0004.33E0][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE; QQKN
+32C0 ; [.0E2A.0020.0004.32C0][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY; QQKN
+3359 ; [.0E2A.0020.0004.3359][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE; QQKN
+0032 ; [.0E2B.0020.0002.0032] # DIGIT TWO
+FF12 ; [.0E2B.0020.0003.FF12] # FULLWIDTH DIGIT TWO; QQK
+2475 ; [*0288.0020.0004.2475][.0E2B.0020.0004.2475][*0289.0020.001F.2475] # PARENTHESIZED DIGIT TWO; QQKN
+2489 ; [.0E2B.0020.0004.2489][*025D.0020.0004.2489] # DIGIT TWO FULL STOP; QQKN
+1D7D0 ; [.0E2B.0020.0005.1D7D0] # MATHEMATICAL BOLD DIGIT TWO; QQK
+1D7DA ; [.0E2B.0020.0005.1D7DA] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO; QQK
+1D7E4 ; [.0E2B.0020.0005.1D7E4] # MATHEMATICAL SANS-SERIF DIGIT TWO; QQK
+1D7EE ; [.0E2B.0020.0005.1D7EE] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO; QQK
+1D7F8 ; [.0E2B.0020.0005.1D7F8] # MATHEMATICAL MONOSPACE DIGIT TWO; QQK
+2461 ; [.0E2B.0020.0006.2461] # CIRCLED DIGIT TWO; QQK
+24F6 ; [.0E2B.0020.0006.24F6] # DOUBLE CIRCLED DIGIT TWO; QQK
+2777 ; [.0E2B.0020.0006.2777] # DINGBAT NEGATIVE CIRCLED DIGIT TWO; QQK
+2781 ; [.0E2B.0020.0006.2781] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO; QQK
+278B ; [.0E2B.0020.0006.278B] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO; QQK
+00B2 ; [.0E2B.0020.0014.00B2] # SUPERSCRIPT TWO; QQK
+2082 ; [.0E2B.0020.0015.2082] # SUBSCRIPT TWO; QQK
+0662 ; [.0E2B.0020.0002.0662][.0000.0163.0002.0662] # ARABIC-INDIC DIGIT TWO
+06F2 ; [.0E2B.0020.0002.06F2][.0000.0164.0002.06F2] # EXTENDED ARABIC-INDIC DIGIT TWO
+136A ; [.0E2B.0020.0002.136A][.0000.0165.0002.136A] # ETHIOPIC DIGIT TWO
+104A2 ; [.0E2B.0020.0002.104A2][.0000.0166.0002.104A2] # OSMANYA DIGIT TWO
+0968 ; [.0E2B.0020.0002.0968][.0000.0167.0002.0968] # DEVANAGARI DIGIT TWO
+09E8 ; [.0E2B.0020.0002.09E8][.0000.0168.0002.09E8] # BENGALI DIGIT TWO
+09F5 ; [.0E2B.0020.0002.09F5][.0000.0169.0002.09F5] # BENGALI CURRENCY NUMERATOR TWO
+0A68 ; [.0E2B.0020.0002.0A68][.0000.016A.0002.0A68] # GURMUKHI DIGIT TWO
+0AE8 ; [.0E2B.0020.0002.0AE8][.0000.016B.0002.0AE8] # GUJARATI DIGIT TWO
+0B68 ; [.0E2B.0020.0002.0B68][.0000.016C.0002.0B68] # ORIYA DIGIT TWO
+0BE8 ; [.0E2B.0020.0002.0BE8][.0000.016D.0002.0BE8] # TAMIL DIGIT TWO
+0C68 ; [.0E2B.0020.0002.0C68][.0000.016E.0002.0C68] # TELUGU DIGIT TWO
+0CE8 ; [.0E2B.0020.0002.0CE8][.0000.016F.0002.0CE8] # KANNADA DIGIT TWO
+0D68 ; [.0E2B.0020.0002.0D68][.0000.0170.0002.0D68] # MALAYALAM DIGIT TWO
+1948 ; [.0E2B.0020.0002.1948][.0000.0171.0002.1948] # LIMBU DIGIT TWO
+0E52 ; [.0E2B.0020.0002.0E52][.0000.0172.0002.0E52] # THAI DIGIT TWO
+0ED2 ; [.0E2B.0020.0002.0ED2][.0000.0173.0002.0ED2] # LAO DIGIT TWO
+0F22 ; [.0E2B.0020.0002.0F22][.0000.0174.0002.0F22] # TIBETAN DIGIT TWO
+0F2B ; [.0E2B.0020.0004.0F2B][.0000.0174.0004.0F2B] # TIBETAN DIGIT HALF TWO; QQK
+1042 ; [.0E2B.0020.0002.1042][.0000.0175.0002.1042] # MYANMAR DIGIT TWO
+17E2 ; [.0E2B.0020.0002.17E2][.0000.0176.0002.17E2] # KHMER DIGIT TWO
+17F2 ; [.0E2B.0020.0002.17F2][.0000.0177.0002.17F2] # KHMER SYMBOL LEK ATTAK PII
+1812 ; [.0E2B.0020.0002.1812][.0000.0178.0002.1812] # MONGOLIAN DIGIT TWO
+3022 ; [.0E2B.0020.0002.3022][.0000.0179.0002.3022] # HANGZHOU NUMERAL TWO
+10108 ; [.0E2B.0020.0002.10108][.0000.017A.0002.10108] # AEGEAN NUMBER TWO
+249B ; [.0E2B.0020.0004.249B][.0E29.0020.0004.249B][*025D.0020.001F.249B] # NUMBER TWENTY FULL STOP; QQKN
+2487 ; [*0288.0020.0004.2487][.0E2B.0020.0004.2487][.0E29.0020.001F.2487][*0289.0020.001F.2487] # PARENTHESIZED NUMBER TWENTY; QQKN
+2473 ; [.0E2B.0020.0006.2473][.0E29.0020.0006.2473] # CIRCLED NUMBER TWENTY; QQKN
+24F4 ; [.0E2B.0020.0006.24F4][.0E29.0020.0006.24F4] # NEGATIVE CIRCLED NUMBER TWENTY; QQKN
+33F3 ; [.0E2B.0020.0004.33F3][.0E29.0020.0004.33F3][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY; QQKN
+336C ; [.0E2B.0020.0004.336C][.0E29.0020.0004.336C][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY; QQKN
+3251 ; [.0E2B.0020.0006.3251][.0E2A.0020.0006.3251] # CIRCLED NUMBER TWENTY ONE; QQKN
+33F4 ; [.0E2B.0020.0004.33F4][.0E2A.0020.0004.33F4][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE; QQKN
+336D ; [.0E2B.0020.0004.336D][.0E2A.0020.0004.336D][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE; QQKN
+3252 ; [.0E2B.0020.0006.3252][.0E2B.0020.0006.3252] # CIRCLED NUMBER TWENTY TWO; QQKN
+33F5 ; [.0E2B.0020.0004.33F5][.0E2B.0020.0004.33F5][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO; QQKN
+336E ; [.0E2B.0020.0004.336E][.0E2B.0020.0004.336E][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO; QQKN
+3253 ; [.0E2B.0020.0006.3253][.0E2C.0020.0006.3253] # CIRCLED NUMBER TWENTY THREE; QQKN
+2154 ; [.0E2B.0020.001E.2154][*02CD.0020.001E.2154][.0E2C.0020.001F.2154] # VULGAR FRACTION TWO THIRDS; QQKN
+33F6 ; [.0E2B.0020.0004.33F6][.0E2C.0020.0004.33F6][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE; QQKN
+336F ; [.0E2B.0020.0004.336F][.0E2C.0020.0004.336F][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE; QQKN
+3254 ; [.0E2B.0020.0006.3254][.0E2D.0020.0006.3254] # CIRCLED NUMBER TWENTY FOUR; QQKN
+33F7 ; [.0E2B.0020.0004.33F7][.0E2D.0020.0004.33F7][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR; QQKN
+3370 ; [.0E2B.0020.0004.3370][.0E2D.0020.0004.3370][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR; QQKN
+3255 ; [.0E2B.0020.0006.3255][.0E2E.0020.0006.3255] # CIRCLED NUMBER TWENTY FIVE; QQKN
+2156 ; [.0E2B.0020.001E.2156][*02CD.0020.001E.2156][.0E2E.0020.001F.2156] # VULGAR FRACTION TWO FIFTHS; QQKN
+33F8 ; [.0E2B.0020.0004.33F8][.0E2E.0020.0004.33F8][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE; QQKN
+3256 ; [.0E2B.0020.0006.3256][.0E2F.0020.0006.3256] # CIRCLED NUMBER TWENTY SIX; QQKN
+33F9 ; [.0E2B.0020.0004.33F9][.0E2F.0020.0004.33F9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX; QQKN
+3257 ; [.0E2B.0020.0006.3257][.0E30.0020.0006.3257] # CIRCLED NUMBER TWENTY SEVEN; QQKN
+33FA ; [.0E2B.0020.0004.33FA][.0E30.0020.0004.33FA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN; QQKN
+3258 ; [.0E2B.0020.0006.3258][.0E31.0020.0006.3258] # CIRCLED NUMBER TWENTY EIGHT; QQKN
+33FB ; [.0E2B.0020.0004.33FB][.0E31.0020.0004.33FB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT; QQKN
+3259 ; [.0E2B.0020.0006.3259][.0E32.0020.0006.3259] # CIRCLED NUMBER TWENTY NINE; QQKN
+33FC ; [.0E2B.0020.0004.33FC][.0E32.0020.0004.33FC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE; QQKN
+33E1 ; [.0E2B.0020.0004.33E1][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO; QQKN
+32C1 ; [.0E2B.0020.0004.32C1][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY; QQKN
+335A ; [.0E2B.0020.0004.335A][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO; QQKN
+0033 ; [.0E2C.0020.0002.0033] # DIGIT THREE
+FF13 ; [.0E2C.0020.0003.FF13] # FULLWIDTH DIGIT THREE; QQK
+2476 ; [*0288.0020.0004.2476][.0E2C.0020.0004.2476][*0289.0020.001F.2476] # PARENTHESIZED DIGIT THREE; QQKN
+248A ; [.0E2C.0020.0004.248A][*025D.0020.0004.248A] # DIGIT THREE FULL STOP; QQKN
+1D7D1 ; [.0E2C.0020.0005.1D7D1] # MATHEMATICAL BOLD DIGIT THREE; QQK
+1D7DB ; [.0E2C.0020.0005.1D7DB] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE; QQK
+1D7E5 ; [.0E2C.0020.0005.1D7E5] # MATHEMATICAL SANS-SERIF DIGIT THREE; QQK
+1D7EF ; [.0E2C.0020.0005.1D7EF] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE; QQK
+1D7F9 ; [.0E2C.0020.0005.1D7F9] # MATHEMATICAL MONOSPACE DIGIT THREE; QQK
+2462 ; [.0E2C.0020.0006.2462] # CIRCLED DIGIT THREE; QQK
+24F7 ; [.0E2C.0020.0006.24F7] # DOUBLE CIRCLED DIGIT THREE; QQK
+2778 ; [.0E2C.0020.0006.2778] # DINGBAT NEGATIVE CIRCLED DIGIT THREE; QQK
+2782 ; [.0E2C.0020.0006.2782] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE; QQK
+278C ; [.0E2C.0020.0006.278C] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE; QQK
+00B3 ; [.0E2C.0020.0014.00B3] # SUPERSCRIPT THREE; QQK
+2083 ; [.0E2C.0020.0015.2083] # SUBSCRIPT THREE; QQK
+0663 ; [.0E2C.0020.0002.0663][.0000.0163.0002.0663] # ARABIC-INDIC DIGIT THREE
+06F3 ; [.0E2C.0020.0002.06F3][.0000.0164.0002.06F3] # EXTENDED ARABIC-INDIC DIGIT THREE
+136B ; [.0E2C.0020.0002.136B][.0000.0165.0002.136B] # ETHIOPIC DIGIT THREE
+104A3 ; [.0E2C.0020.0002.104A3][.0000.0166.0002.104A3] # OSMANYA DIGIT THREE
+0969 ; [.0E2C.0020.0002.0969][.0000.0167.0002.0969] # DEVANAGARI DIGIT THREE
+09E9 ; [.0E2C.0020.0002.09E9][.0000.0168.0002.09E9] # BENGALI DIGIT THREE
+09F6 ; [.0E2C.0020.0002.09F6][.0000.0169.0002.09F6] # BENGALI CURRENCY NUMERATOR THREE
+0A69 ; [.0E2C.0020.0002.0A69][.0000.016A.0002.0A69] # GURMUKHI DIGIT THREE
+0AE9 ; [.0E2C.0020.0002.0AE9][.0000.016B.0002.0AE9] # GUJARATI DIGIT THREE
+0B69 ; [.0E2C.0020.0002.0B69][.0000.016C.0002.0B69] # ORIYA DIGIT THREE
+0BE9 ; [.0E2C.0020.0002.0BE9][.0000.016D.0002.0BE9] # TAMIL DIGIT THREE
+0C69 ; [.0E2C.0020.0002.0C69][.0000.016E.0002.0C69] # TELUGU DIGIT THREE
+0CE9 ; [.0E2C.0020.0002.0CE9][.0000.016F.0002.0CE9] # KANNADA DIGIT THREE
+0D69 ; [.0E2C.0020.0002.0D69][.0000.0170.0002.0D69] # MALAYALAM DIGIT THREE
+1949 ; [.0E2C.0020.0002.1949][.0000.0171.0002.1949] # LIMBU DIGIT THREE
+0E53 ; [.0E2C.0020.0002.0E53][.0000.0172.0002.0E53] # THAI DIGIT THREE
+0ED3 ; [.0E2C.0020.0002.0ED3][.0000.0173.0002.0ED3] # LAO DIGIT THREE
+0F23 ; [.0E2C.0020.0002.0F23][.0000.0174.0002.0F23] # TIBETAN DIGIT THREE
+0F2C ; [.0E2C.0020.0004.0F2C][.0000.0174.0004.0F2C] # TIBETAN DIGIT HALF THREE; QQK
+1043 ; [.0E2C.0020.0002.1043][.0000.0175.0002.1043] # MYANMAR DIGIT THREE
+17E3 ; [.0E2C.0020.0002.17E3][.0000.0176.0002.17E3] # KHMER DIGIT THREE
+17F3 ; [.0E2C.0020.0002.17F3][.0000.0177.0002.17F3] # KHMER SYMBOL LEK ATTAK BEI
+1813 ; [.0E2C.0020.0002.1813][.0000.0178.0002.1813] # MONGOLIAN DIGIT THREE
+3023 ; [.0E2C.0020.0002.3023][.0000.0179.0002.3023] # HANGZHOU NUMERAL THREE
+10109 ; [.0E2C.0020.0002.10109][.0000.017A.0002.10109] # AEGEAN NUMBER THREE
+325A ; [.0E2C.0020.0006.325A][.0E29.0020.0006.325A] # CIRCLED NUMBER THIRTY; QQKN
+33FD ; [.0E2C.0020.0004.33FD][.0E29.0020.0004.33FD][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY; QQKN
+325B ; [.0E2C.0020.0006.325B][.0E2A.0020.0006.325B] # CIRCLED NUMBER THIRTY ONE; QQKN
+33FE ; [.0E2C.0020.0004.33FE][.0E2A.0020.0004.33FE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE; QQKN
+325C ; [.0E2C.0020.0006.325C][.0E2B.0020.0006.325C] # CIRCLED NUMBER THIRTY TWO; QQKN
+325D ; [.0E2C.0020.0006.325D][.0E2C.0020.0006.325D] # CIRCLED NUMBER THIRTY THREE; QQKN
+325E ; [.0E2C.0020.0006.325E][.0E2D.0020.0006.325E] # CIRCLED NUMBER THIRTY FOUR; QQKN
+00BE ; [.0E2C.0020.001E.00BE][*02CD.0020.001E.00BE][.0E2D.0020.001F.00BE] # VULGAR FRACTION THREE QUARTERS; QQKN
+325F ; [.0E2C.0020.0006.325F][.0E2E.0020.0006.325F] # CIRCLED NUMBER THIRTY FIVE; QQKN
+2157 ; [.0E2C.0020.001E.2157][*02CD.0020.001E.2157][.0E2E.0020.001F.2157] # VULGAR FRACTION THREE FIFTHS; QQKN
+32B1 ; [.0E2C.0020.0006.32B1][.0E2F.0020.0006.32B1] # CIRCLED NUMBER THIRTY SIX; QQKN
+32B2 ; [.0E2C.0020.0006.32B2][.0E30.0020.0006.32B2] # CIRCLED NUMBER THIRTY SEVEN; QQKN
+32B3 ; [.0E2C.0020.0006.32B3][.0E31.0020.0006.32B3] # CIRCLED NUMBER THIRTY EIGHT; QQKN
+215C ; [.0E2C.0020.001E.215C][*02CD.0020.001E.215C][.0E31.0020.001F.215C] # VULGAR FRACTION THREE EIGHTHS; QQKN
+32B4 ; [.0E2C.0020.0006.32B4][.0E32.0020.0006.32B4] # CIRCLED NUMBER THIRTY NINE; QQKN
+33E2 ; [.0E2C.0020.0004.33E2][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE; QQKN
+32C2 ; [.0E2C.0020.0004.32C2][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH; QQKN
+335B ; [.0E2C.0020.0004.335B][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE; QQKN
+0034 ; [.0E2D.0020.0002.0034] # DIGIT FOUR
+FF14 ; [.0E2D.0020.0003.FF14] # FULLWIDTH DIGIT FOUR; QQK
+2477 ; [*0288.0020.0004.2477][.0E2D.0020.0004.2477][*0289.0020.001F.2477] # PARENTHESIZED DIGIT FOUR; QQKN
+248B ; [.0E2D.0020.0004.248B][*025D.0020.0004.248B] # DIGIT FOUR FULL STOP; QQKN
+1D7D2 ; [.0E2D.0020.0005.1D7D2] # MATHEMATICAL BOLD DIGIT FOUR; QQK
+1D7DC ; [.0E2D.0020.0005.1D7DC] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR; QQK
+1D7E6 ; [.0E2D.0020.0005.1D7E6] # MATHEMATICAL SANS-SERIF DIGIT FOUR; QQK
+1D7F0 ; [.0E2D.0020.0005.1D7F0] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR; QQK
+1D7FA ; [.0E2D.0020.0005.1D7FA] # MATHEMATICAL MONOSPACE DIGIT FOUR; QQK
+2463 ; [.0E2D.0020.0006.2463] # CIRCLED DIGIT FOUR; QQK
+24F8 ; [.0E2D.0020.0006.24F8] # DOUBLE CIRCLED DIGIT FOUR; QQK
+2779 ; [.0E2D.0020.0006.2779] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR; QQK
+2783 ; [.0E2D.0020.0006.2783] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR; QQK
+278D ; [.0E2D.0020.0006.278D] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR; QQK
+2074 ; [.0E2D.0020.0014.2074] # SUPERSCRIPT FOUR; QQK
+2084 ; [.0E2D.0020.0015.2084] # SUBSCRIPT FOUR; QQK
+0664 ; [.0E2D.0020.0002.0664][.0000.0163.0002.0664] # ARABIC-INDIC DIGIT FOUR
+06F4 ; [.0E2D.0020.0002.06F4][.0000.0164.0002.06F4] # EXTENDED ARABIC-INDIC DIGIT FOUR
+136C ; [.0E2D.0020.0002.136C][.0000.0165.0002.136C] # ETHIOPIC DIGIT FOUR
+104A4 ; [.0E2D.0020.0002.104A4][.0000.0166.0002.104A4] # OSMANYA DIGIT FOUR
+096A ; [.0E2D.0020.0002.096A][.0000.0167.0002.096A] # DEVANAGARI DIGIT FOUR
+09EA ; [.0E2D.0020.0002.09EA][.0000.0168.0002.09EA] # BENGALI DIGIT FOUR
+09F7 ; [.0E2D.0020.0002.09F7][.0000.0169.0002.09F7] # BENGALI CURRENCY NUMERATOR FOUR
+0A6A ; [.0E2D.0020.0002.0A6A][.0000.016A.0002.0A6A] # GURMUKHI DIGIT FOUR
+0AEA ; [.0E2D.0020.0002.0AEA][.0000.016B.0002.0AEA] # GUJARATI DIGIT FOUR
+0B6A ; [.0E2D.0020.0002.0B6A][.0000.016C.0002.0B6A] # ORIYA DIGIT FOUR
+0BEA ; [.0E2D.0020.0002.0BEA][.0000.016D.0002.0BEA] # TAMIL DIGIT FOUR
+0C6A ; [.0E2D.0020.0002.0C6A][.0000.016E.0002.0C6A] # TELUGU DIGIT FOUR
+0CEA ; [.0E2D.0020.0002.0CEA][.0000.016F.0002.0CEA] # KANNADA DIGIT FOUR
+0D6A ; [.0E2D.0020.0002.0D6A][.0000.0170.0002.0D6A] # MALAYALAM DIGIT FOUR
+194A ; [.0E2D.0020.0002.194A][.0000.0171.0002.194A] # LIMBU DIGIT FOUR
+0E54 ; [.0E2D.0020.0002.0E54][.0000.0172.0002.0E54] # THAI DIGIT FOUR
+0ED4 ; [.0E2D.0020.0002.0ED4][.0000.0173.0002.0ED4] # LAO DIGIT FOUR
+0F24 ; [.0E2D.0020.0002.0F24][.0000.0174.0002.0F24] # TIBETAN DIGIT FOUR
+0F2D ; [.0E2D.0020.0004.0F2D][.0000.0174.0004.0F2D] # TIBETAN DIGIT HALF FOUR; QQK
+1044 ; [.0E2D.0020.0002.1044][.0000.0175.0002.1044] # MYANMAR DIGIT FOUR
+17E4 ; [.0E2D.0020.0002.17E4][.0000.0176.0002.17E4] # KHMER DIGIT FOUR
+17F4 ; [.0E2D.0020.0002.17F4][.0000.0177.0002.17F4] # KHMER SYMBOL LEK ATTAK BUON
+1814 ; [.0E2D.0020.0002.1814][.0000.0178.0002.1814] # MONGOLIAN DIGIT FOUR
+3024 ; [.0E2D.0020.0002.3024][.0000.0179.0002.3024] # HANGZHOU NUMERAL FOUR
+1010A ; [.0E2D.0020.0002.1010A][.0000.017A.0002.1010A] # AEGEAN NUMBER FOUR
+32B5 ; [.0E2D.0020.0006.32B5][.0E29.0020.0006.32B5] # CIRCLED NUMBER FORTY; QQKN
+32B6 ; [.0E2D.0020.0006.32B6][.0E2A.0020.0006.32B6] # CIRCLED NUMBER FORTY ONE; QQKN
+32B7 ; [.0E2D.0020.0006.32B7][.0E2B.0020.0006.32B7] # CIRCLED NUMBER FORTY TWO; QQKN
+32B8 ; [.0E2D.0020.0006.32B8][.0E2C.0020.0006.32B8] # CIRCLED NUMBER FORTY THREE; QQKN
+32B9 ; [.0E2D.0020.0006.32B9][.0E2D.0020.0006.32B9] # CIRCLED NUMBER FORTY FOUR; QQKN
+32BA ; [.0E2D.0020.0006.32BA][.0E2E.0020.0006.32BA] # CIRCLED NUMBER FORTY FIVE; QQKN
+2158 ; [.0E2D.0020.001E.2158][*02CD.0020.001E.2158][.0E2E.0020.001F.2158] # VULGAR FRACTION FOUR FIFTHS; QQKN
+32BB ; [.0E2D.0020.0006.32BB][.0E2F.0020.0006.32BB] # CIRCLED NUMBER FORTY SIX; QQKN
+32BC ; [.0E2D.0020.0006.32BC][.0E30.0020.0006.32BC] # CIRCLED NUMBER FORTY SEVEN; QQKN
+32BD ; [.0E2D.0020.0006.32BD][.0E31.0020.0006.32BD] # CIRCLED NUMBER FORTY EIGHT; QQKN
+32BE ; [.0E2D.0020.0006.32BE][.0E32.0020.0006.32BE] # CIRCLED NUMBER FORTY NINE; QQKN
+33E3 ; [.0E2D.0020.0004.33E3][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR; QQKN
+32C3 ; [.0E2D.0020.0004.32C3][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL; QQKN
+335C ; [.0E2D.0020.0004.335C][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR; QQKN
+0035 ; [.0E2E.0020.0002.0035] # DIGIT FIVE
+FF15 ; [.0E2E.0020.0003.FF15] # FULLWIDTH DIGIT FIVE; QQK
+2478 ; [*0288.0020.0004.2478][.0E2E.0020.0004.2478][*0289.0020.001F.2478] # PARENTHESIZED DIGIT FIVE; QQKN
+248C ; [.0E2E.0020.0004.248C][*025D.0020.0004.248C] # DIGIT FIVE FULL STOP; QQKN
+1D7D3 ; [.0E2E.0020.0005.1D7D3] # MATHEMATICAL BOLD DIGIT FIVE; QQK
+1D7DD ; [.0E2E.0020.0005.1D7DD] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE; QQK
+1D7E7 ; [.0E2E.0020.0005.1D7E7] # MATHEMATICAL SANS-SERIF DIGIT FIVE; QQK
+1D7F1 ; [.0E2E.0020.0005.1D7F1] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE; QQK
+1D7FB ; [.0E2E.0020.0005.1D7FB] # MATHEMATICAL MONOSPACE DIGIT FIVE; QQK
+2464 ; [.0E2E.0020.0006.2464] # CIRCLED DIGIT FIVE; QQK
+24F9 ; [.0E2E.0020.0006.24F9] # DOUBLE CIRCLED DIGIT FIVE; QQK
+277A ; [.0E2E.0020.0006.277A] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE; QQK
+2784 ; [.0E2E.0020.0006.2784] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE; QQK
+278E ; [.0E2E.0020.0006.278E] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE; QQK
+2075 ; [.0E2E.0020.0014.2075] # SUPERSCRIPT FIVE; QQK
+2085 ; [.0E2E.0020.0015.2085] # SUBSCRIPT FIVE; QQK
+0665 ; [.0E2E.0020.0002.0665][.0000.0163.0002.0665] # ARABIC-INDIC DIGIT FIVE
+06F5 ; [.0E2E.0020.0002.06F5][.0000.0164.0002.06F5] # EXTENDED ARABIC-INDIC DIGIT FIVE
+136D ; [.0E2E.0020.0002.136D][.0000.0165.0002.136D] # ETHIOPIC DIGIT FIVE
+104A5 ; [.0E2E.0020.0002.104A5][.0000.0166.0002.104A5] # OSMANYA DIGIT FIVE
+096B ; [.0E2E.0020.0002.096B][.0000.0167.0002.096B] # DEVANAGARI DIGIT FIVE
+09EB ; [.0E2E.0020.0002.09EB][.0000.0168.0002.09EB] # BENGALI DIGIT FIVE
+0A6B ; [.0E2E.0020.0002.0A6B][.0000.016A.0002.0A6B] # GURMUKHI DIGIT FIVE
+0AEB ; [.0E2E.0020.0002.0AEB][.0000.016B.0002.0AEB] # GUJARATI DIGIT FIVE
+0B6B ; [.0E2E.0020.0002.0B6B][.0000.016C.0002.0B6B] # ORIYA DIGIT FIVE
+0BEB ; [.0E2E.0020.0002.0BEB][.0000.016D.0002.0BEB] # TAMIL DIGIT FIVE
+0C6B ; [.0E2E.0020.0002.0C6B][.0000.016E.0002.0C6B] # TELUGU DIGIT FIVE
+0CEB ; [.0E2E.0020.0002.0CEB][.0000.016F.0002.0CEB] # KANNADA DIGIT FIVE
+0D6B ; [.0E2E.0020.0002.0D6B][.0000.0170.0002.0D6B] # MALAYALAM DIGIT FIVE
+194B ; [.0E2E.0020.0002.194B][.0000.0171.0002.194B] # LIMBU DIGIT FIVE
+0E55 ; [.0E2E.0020.0002.0E55][.0000.0172.0002.0E55] # THAI DIGIT FIVE
+0ED5 ; [.0E2E.0020.0002.0ED5][.0000.0173.0002.0ED5] # LAO DIGIT FIVE
+0F25 ; [.0E2E.0020.0002.0F25][.0000.0174.0002.0F25] # TIBETAN DIGIT FIVE
+0F2E ; [.0E2E.0020.0004.0F2E][.0000.0174.0004.0F2E] # TIBETAN DIGIT HALF FIVE; QQK
+1045 ; [.0E2E.0020.0002.1045][.0000.0175.0002.1045] # MYANMAR DIGIT FIVE
+17E5 ; [.0E2E.0020.0002.17E5][.0000.0176.0002.17E5] # KHMER DIGIT FIVE
+17F5 ; [.0E2E.0020.0002.17F5][.0000.0177.0002.17F5] # KHMER SYMBOL LEK ATTAK PRAM
+1815 ; [.0E2E.0020.0002.1815][.0000.0178.0002.1815] # MONGOLIAN DIGIT FIVE
+3025 ; [.0E2E.0020.0002.3025][.0000.0179.0002.3025] # HANGZHOU NUMERAL FIVE
+1010B ; [.0E2E.0020.0002.1010B][.0000.017A.0002.1010B] # AEGEAN NUMBER FIVE
+10321 ; [.0E2E.0020.0002.10321][.0000.017B.0002.10321] # OLD ITALIC NUMERAL FIVE
+32BF ; [.0E2E.0020.0006.32BF][.0E29.0020.0006.32BF] # CIRCLED NUMBER FIFTY; QQKN
+215A ; [.0E2E.0020.001E.215A][*02CD.0020.001E.215A][.0E2F.0020.001F.215A] # VULGAR FRACTION FIVE SIXTHS; QQKN
+215D ; [.0E2E.0020.001E.215D][*02CD.0020.001E.215D][.0E31.0020.001F.215D] # VULGAR FRACTION FIVE EIGHTHS; QQKN
+33E4 ; [.0E2E.0020.0004.33E4][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE; QQKN
+32C4 ; [.0E2E.0020.0004.32C4][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY; QQKN
+335D ; [.0E2E.0020.0004.335D][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE; QQKN
+0036 ; [.0E2F.0020.0002.0036] # DIGIT SIX
+FF16 ; [.0E2F.0020.0003.FF16] # FULLWIDTH DIGIT SIX; QQK
+2479 ; [*0288.0020.0004.2479][.0E2F.0020.0004.2479][*0289.0020.001F.2479] # PARENTHESIZED DIGIT SIX; QQKN
+248D ; [.0E2F.0020.0004.248D][*025D.0020.0004.248D] # DIGIT SIX FULL STOP; QQKN
+1D7D4 ; [.0E2F.0020.0005.1D7D4] # MATHEMATICAL BOLD DIGIT SIX; QQK
+1D7DE ; [.0E2F.0020.0005.1D7DE] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX; QQK
+1D7E8 ; [.0E2F.0020.0005.1D7E8] # MATHEMATICAL SANS-SERIF DIGIT SIX; QQK
+1D7F2 ; [.0E2F.0020.0005.1D7F2] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX; QQK
+1D7FC ; [.0E2F.0020.0005.1D7FC] # MATHEMATICAL MONOSPACE DIGIT SIX; QQK
+2465 ; [.0E2F.0020.0006.2465] # CIRCLED DIGIT SIX; QQK
+24FA ; [.0E2F.0020.0006.24FA] # DOUBLE CIRCLED DIGIT SIX; QQK
+277B ; [.0E2F.0020.0006.277B] # DINGBAT NEGATIVE CIRCLED DIGIT SIX; QQK
+2785 ; [.0E2F.0020.0006.2785] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX; QQK
+278F ; [.0E2F.0020.0006.278F] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX; QQK
+2076 ; [.0E2F.0020.0014.2076] # SUPERSCRIPT SIX; QQK
+2086 ; [.0E2F.0020.0015.2086] # SUBSCRIPT SIX; QQK
+0666 ; [.0E2F.0020.0002.0666][.0000.0163.0002.0666] # ARABIC-INDIC DIGIT SIX
+06F6 ; [.0E2F.0020.0002.06F6][.0000.0164.0002.06F6] # EXTENDED ARABIC-INDIC DIGIT SIX
+136E ; [.0E2F.0020.0002.136E][.0000.0165.0002.136E] # ETHIOPIC DIGIT SIX
+104A6 ; [.0E2F.0020.0002.104A6][.0000.0166.0002.104A6] # OSMANYA DIGIT SIX
+096C ; [.0E2F.0020.0002.096C][.0000.0167.0002.096C] # DEVANAGARI DIGIT SIX
+09EC ; [.0E2F.0020.0002.09EC][.0000.0168.0002.09EC] # BENGALI DIGIT SIX
+0A6C ; [.0E2F.0020.0002.0A6C][.0000.016A.0002.0A6C] # GURMUKHI DIGIT SIX
+0AEC ; [.0E2F.0020.0002.0AEC][.0000.016B.0002.0AEC] # GUJARATI DIGIT SIX
+0B6C ; [.0E2F.0020.0002.0B6C][.0000.016C.0002.0B6C] # ORIYA DIGIT SIX
+0BEC ; [.0E2F.0020.0002.0BEC][.0000.016D.0002.0BEC] # TAMIL DIGIT SIX
+0C6C ; [.0E2F.0020.0002.0C6C][.0000.016E.0002.0C6C] # TELUGU DIGIT SIX
+0CEC ; [.0E2F.0020.0002.0CEC][.0000.016F.0002.0CEC] # KANNADA DIGIT SIX
+0D6C ; [.0E2F.0020.0002.0D6C][.0000.0170.0002.0D6C] # MALAYALAM DIGIT SIX
+194C ; [.0E2F.0020.0002.194C][.0000.0171.0002.194C] # LIMBU DIGIT SIX
+0E56 ; [.0E2F.0020.0002.0E56][.0000.0172.0002.0E56] # THAI DIGIT SIX
+0ED6 ; [.0E2F.0020.0002.0ED6][.0000.0173.0002.0ED6] # LAO DIGIT SIX
+0F26 ; [.0E2F.0020.0002.0F26][.0000.0174.0002.0F26] # TIBETAN DIGIT SIX
+0F2F ; [.0E2F.0020.0004.0F2F][.0000.0174.0004.0F2F] # TIBETAN DIGIT HALF SIX; QQK
+1046 ; [.0E2F.0020.0002.1046][.0000.0175.0002.1046] # MYANMAR DIGIT SIX
+17E6 ; [.0E2F.0020.0002.17E6][.0000.0176.0002.17E6] # KHMER DIGIT SIX
+17F6 ; [.0E2F.0020.0002.17F6][.0000.0177.0002.17F6] # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+1816 ; [.0E2F.0020.0002.1816][.0000.0178.0002.1816] # MONGOLIAN DIGIT SIX
+3026 ; [.0E2F.0020.0002.3026][.0000.0179.0002.3026] # HANGZHOU NUMERAL SIX
+1010C ; [.0E2F.0020.0002.1010C][.0000.017A.0002.1010C] # AEGEAN NUMBER SIX
+33E5 ; [.0E2F.0020.0004.33E5][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX; QQKN
+32C5 ; [.0E2F.0020.0004.32C5][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE; QQKN
+335E ; [.0E2F.0020.0004.335E][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX; QQKN
+0037 ; [.0E30.0020.0002.0037] # DIGIT SEVEN
+FF17 ; [.0E30.0020.0003.FF17] # FULLWIDTH DIGIT SEVEN; QQK
+247A ; [*0288.0020.0004.247A][.0E30.0020.0004.247A][*0289.0020.001F.247A] # PARENTHESIZED DIGIT SEVEN; QQKN
+248E ; [.0E30.0020.0004.248E][*025D.0020.0004.248E] # DIGIT SEVEN FULL STOP; QQKN
+1D7D5 ; [.0E30.0020.0005.1D7D5] # MATHEMATICAL BOLD DIGIT SEVEN; QQK
+1D7DF ; [.0E30.0020.0005.1D7DF] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN; QQK
+1D7E9 ; [.0E30.0020.0005.1D7E9] # MATHEMATICAL SANS-SERIF DIGIT SEVEN; QQK
+1D7F3 ; [.0E30.0020.0005.1D7F3] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN; QQK
+1D7FD ; [.0E30.0020.0005.1D7FD] # MATHEMATICAL MONOSPACE DIGIT SEVEN; QQK
+2466 ; [.0E30.0020.0006.2466] # CIRCLED DIGIT SEVEN; QQK
+24FB ; [.0E30.0020.0006.24FB] # DOUBLE CIRCLED DIGIT SEVEN; QQK
+277C ; [.0E30.0020.0006.277C] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN; QQK
+2786 ; [.0E30.0020.0006.2786] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN; QQK
+2790 ; [.0E30.0020.0006.2790] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN; QQK
+2077 ; [.0E30.0020.0014.2077] # SUPERSCRIPT SEVEN; QQK
+2087 ; [.0E30.0020.0015.2087] # SUBSCRIPT SEVEN; QQK
+0667 ; [.0E30.0020.0002.0667][.0000.0163.0002.0667] # ARABIC-INDIC DIGIT SEVEN
+06F7 ; [.0E30.0020.0002.06F7][.0000.0164.0002.06F7] # EXTENDED ARABIC-INDIC DIGIT SEVEN
+136F ; [.0E30.0020.0002.136F][.0000.0165.0002.136F] # ETHIOPIC DIGIT SEVEN
+104A7 ; [.0E30.0020.0002.104A7][.0000.0166.0002.104A7] # OSMANYA DIGIT SEVEN
+096D ; [.0E30.0020.0002.096D][.0000.0167.0002.096D] # DEVANAGARI DIGIT SEVEN
+09ED ; [.0E30.0020.0002.09ED][.0000.0168.0002.09ED] # BENGALI DIGIT SEVEN
+0A6D ; [.0E30.0020.0002.0A6D][.0000.016A.0002.0A6D] # GURMUKHI DIGIT SEVEN
+0AED ; [.0E30.0020.0002.0AED][.0000.016B.0002.0AED] # GUJARATI DIGIT SEVEN
+0B6D ; [.0E30.0020.0002.0B6D][.0000.016C.0002.0B6D] # ORIYA DIGIT SEVEN
+0BED ; [.0E30.0020.0002.0BED][.0000.016D.0002.0BED] # TAMIL DIGIT SEVEN
+0C6D ; [.0E30.0020.0002.0C6D][.0000.016E.0002.0C6D] # TELUGU DIGIT SEVEN
+0CED ; [.0E30.0020.0002.0CED][.0000.016F.0002.0CED] # KANNADA DIGIT SEVEN
+0D6D ; [.0E30.0020.0002.0D6D][.0000.0170.0002.0D6D] # MALAYALAM DIGIT SEVEN
+194D ; [.0E30.0020.0002.194D][.0000.0171.0002.194D] # LIMBU DIGIT SEVEN
+0E57 ; [.0E30.0020.0002.0E57][.0000.0172.0002.0E57] # THAI DIGIT SEVEN
+0ED7 ; [.0E30.0020.0002.0ED7][.0000.0173.0002.0ED7] # LAO DIGIT SEVEN
+0F27 ; [.0E30.0020.0002.0F27][.0000.0174.0002.0F27] # TIBETAN DIGIT SEVEN
+0F30 ; [.0E30.0020.0004.0F30][.0000.0174.0004.0F30] # TIBETAN DIGIT HALF SEVEN; QQK
+1047 ; [.0E30.0020.0002.1047][.0000.0175.0002.1047] # MYANMAR DIGIT SEVEN
+17E7 ; [.0E30.0020.0002.17E7][.0000.0176.0002.17E7] # KHMER DIGIT SEVEN
+17F7 ; [.0E30.0020.0002.17F7][.0000.0177.0002.17F7] # KHMER SYMBOL LEK ATTAK PRAM-PII
+1817 ; [.0E30.0020.0002.1817][.0000.0178.0002.1817] # MONGOLIAN DIGIT SEVEN
+3027 ; [.0E30.0020.0002.3027][.0000.0179.0002.3027] # HANGZHOU NUMERAL SEVEN
+1010D ; [.0E30.0020.0002.1010D][.0000.017A.0002.1010D] # AEGEAN NUMBER SEVEN
+215E ; [.0E30.0020.001E.215E][*02CD.0020.001E.215E][.0E31.0020.001F.215E] # VULGAR FRACTION SEVEN EIGHTHS; QQKN
+33E6 ; [.0E30.0020.0004.33E6][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN; QQKN
+32C6 ; [.0E30.0020.0004.32C6][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY; QQKN
+335F ; [.0E30.0020.0004.335F][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN; QQKN
+0038 ; [.0E31.0020.0002.0038] # DIGIT EIGHT
+FF18 ; [.0E31.0020.0003.FF18] # FULLWIDTH DIGIT EIGHT; QQK
+247B ; [*0288.0020.0004.247B][.0E31.0020.0004.247B][*0289.0020.001F.247B] # PARENTHESIZED DIGIT EIGHT; QQKN
+248F ; [.0E31.0020.0004.248F][*025D.0020.0004.248F] # DIGIT EIGHT FULL STOP; QQKN
+1D7D6 ; [.0E31.0020.0005.1D7D6] # MATHEMATICAL BOLD DIGIT EIGHT; QQK
+1D7E0 ; [.0E31.0020.0005.1D7E0] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT; QQK
+1D7EA ; [.0E31.0020.0005.1D7EA] # MATHEMATICAL SANS-SERIF DIGIT EIGHT; QQK
+1D7F4 ; [.0E31.0020.0005.1D7F4] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT; QQK
+1D7FE ; [.0E31.0020.0005.1D7FE] # MATHEMATICAL MONOSPACE DIGIT EIGHT; QQK
+2467 ; [.0E31.0020.0006.2467] # CIRCLED DIGIT EIGHT; QQK
+24FC ; [.0E31.0020.0006.24FC] # DOUBLE CIRCLED DIGIT EIGHT; QQK
+277D ; [.0E31.0020.0006.277D] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT; QQK
+2787 ; [.0E31.0020.0006.2787] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT; QQK
+2791 ; [.0E31.0020.0006.2791] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT; QQK
+2078 ; [.0E31.0020.0014.2078] # SUPERSCRIPT EIGHT; QQK
+2088 ; [.0E31.0020.0015.2088] # SUBSCRIPT EIGHT; QQK
+0668 ; [.0E31.0020.0002.0668][.0000.0163.0002.0668] # ARABIC-INDIC DIGIT EIGHT
+06F8 ; [.0E31.0020.0002.06F8][.0000.0164.0002.06F8] # EXTENDED ARABIC-INDIC DIGIT EIGHT
+1370 ; [.0E31.0020.0002.1370][.0000.0165.0002.1370] # ETHIOPIC DIGIT EIGHT
+104A8 ; [.0E31.0020.0002.104A8][.0000.0166.0002.104A8] # OSMANYA DIGIT EIGHT
+096E ; [.0E31.0020.0002.096E][.0000.0167.0002.096E] # DEVANAGARI DIGIT EIGHT
+09EE ; [.0E31.0020.0002.09EE][.0000.0168.0002.09EE] # BENGALI DIGIT EIGHT
+0A6E ; [.0E31.0020.0002.0A6E][.0000.016A.0002.0A6E] # GURMUKHI DIGIT EIGHT
+0AEE ; [.0E31.0020.0002.0AEE][.0000.016B.0002.0AEE] # GUJARATI DIGIT EIGHT
+0B6E ; [.0E31.0020.0002.0B6E][.0000.016C.0002.0B6E] # ORIYA DIGIT EIGHT
+0BEE ; [.0E31.0020.0002.0BEE][.0000.016D.0002.0BEE] # TAMIL DIGIT EIGHT
+0C6E ; [.0E31.0020.0002.0C6E][.0000.016E.0002.0C6E] # TELUGU DIGIT EIGHT
+0CEE ; [.0E31.0020.0002.0CEE][.0000.016F.0002.0CEE] # KANNADA DIGIT EIGHT
+0D6E ; [.0E31.0020.0002.0D6E][.0000.0170.0002.0D6E] # MALAYALAM DIGIT EIGHT
+194E ; [.0E31.0020.0002.194E][.0000.0171.0002.194E] # LIMBU DIGIT EIGHT
+0E58 ; [.0E31.0020.0002.0E58][.0000.0172.0002.0E58] # THAI DIGIT EIGHT
+0ED8 ; [.0E31.0020.0002.0ED8][.0000.0173.0002.0ED8] # LAO DIGIT EIGHT
+0F28 ; [.0E31.0020.0002.0F28][.0000.0174.0002.0F28] # TIBETAN DIGIT EIGHT
+0F31 ; [.0E31.0020.0004.0F31][.0000.0174.0004.0F31] # TIBETAN DIGIT HALF EIGHT; QQK
+1048 ; [.0E31.0020.0002.1048][.0000.0175.0002.1048] # MYANMAR DIGIT EIGHT
+17E8 ; [.0E31.0020.0002.17E8][.0000.0176.0002.17E8] # KHMER DIGIT EIGHT
+17F8 ; [.0E31.0020.0002.17F8][.0000.0177.0002.17F8] # KHMER SYMBOL LEK ATTAK PRAM-BEI
+1818 ; [.0E31.0020.0002.1818][.0000.0178.0002.1818] # MONGOLIAN DIGIT EIGHT
+3028 ; [.0E31.0020.0002.3028][.0000.0179.0002.3028] # HANGZHOU NUMERAL EIGHT
+1010E ; [.0E31.0020.0002.1010E][.0000.017A.0002.1010E] # AEGEAN NUMBER EIGHT
+33E7 ; [.0E31.0020.0004.33E7][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT; QQKN
+32C7 ; [.0E31.0020.0004.32C7][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST; QQKN
+3360 ; [.0E31.0020.0004.3360][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT; QQKN
+0039 ; [.0E32.0020.0002.0039] # DIGIT NINE
+FF19 ; [.0E32.0020.0003.FF19] # FULLWIDTH DIGIT NINE; QQK
+247C ; [*0288.0020.0004.247C][.0E32.0020.0004.247C][*0289.0020.001F.247C] # PARENTHESIZED DIGIT NINE; QQKN
+2490 ; [.0E32.0020.0004.2490][*025D.0020.0004.2490] # DIGIT NINE FULL STOP; QQKN
+1D7D7 ; [.0E32.0020.0005.1D7D7] # MATHEMATICAL BOLD DIGIT NINE; QQK
+1D7E1 ; [.0E32.0020.0005.1D7E1] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE; QQK
+1D7EB ; [.0E32.0020.0005.1D7EB] # MATHEMATICAL SANS-SERIF DIGIT NINE; QQK
+1D7F5 ; [.0E32.0020.0005.1D7F5] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE; QQK
+1D7FF ; [.0E32.0020.0005.1D7FF] # MATHEMATICAL MONOSPACE DIGIT NINE; QQK
+2468 ; [.0E32.0020.0006.2468] # CIRCLED DIGIT NINE; QQK
+24FD ; [.0E32.0020.0006.24FD] # DOUBLE CIRCLED DIGIT NINE; QQK
+277E ; [.0E32.0020.0006.277E] # DINGBAT NEGATIVE CIRCLED DIGIT NINE; QQK
+2788 ; [.0E32.0020.0006.2788] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE; QQK
+2792 ; [.0E32.0020.0006.2792] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE; QQK
+2079 ; [.0E32.0020.0014.2079] # SUPERSCRIPT NINE; QQK
+2089 ; [.0E32.0020.0015.2089] # SUBSCRIPT NINE; QQK
+0669 ; [.0E32.0020.0002.0669][.0000.0163.0002.0669] # ARABIC-INDIC DIGIT NINE
+06F9 ; [.0E32.0020.0002.06F9][.0000.0164.0002.06F9] # EXTENDED ARABIC-INDIC DIGIT NINE
+1371 ; [.0E32.0020.0002.1371][.0000.0165.0002.1371] # ETHIOPIC DIGIT NINE
+104A9 ; [.0E32.0020.0002.104A9][.0000.0166.0002.104A9] # OSMANYA DIGIT NINE
+096F ; [.0E32.0020.0002.096F][.0000.0167.0002.096F] # DEVANAGARI DIGIT NINE
+09EF ; [.0E32.0020.0002.09EF][.0000.0168.0002.09EF] # BENGALI DIGIT NINE
+0A6F ; [.0E32.0020.0002.0A6F][.0000.016A.0002.0A6F] # GURMUKHI DIGIT NINE
+0AEF ; [.0E32.0020.0002.0AEF][.0000.016B.0002.0AEF] # GUJARATI DIGIT NINE
+0B6F ; [.0E32.0020.0002.0B6F][.0000.016C.0002.0B6F] # ORIYA DIGIT NINE
+0BEF ; [.0E32.0020.0002.0BEF][.0000.016D.0002.0BEF] # TAMIL DIGIT NINE
+0C6F ; [.0E32.0020.0002.0C6F][.0000.016E.0002.0C6F] # TELUGU DIGIT NINE
+0CEF ; [.0E32.0020.0002.0CEF][.0000.016F.0002.0CEF] # KANNADA DIGIT NINE
+0D6F ; [.0E32.0020.0002.0D6F][.0000.0170.0002.0D6F] # MALAYALAM DIGIT NINE
+194F ; [.0E32.0020.0002.194F][.0000.0171.0002.194F] # LIMBU DIGIT NINE
+0E59 ; [.0E32.0020.0002.0E59][.0000.0172.0002.0E59] # THAI DIGIT NINE
+0ED9 ; [.0E32.0020.0002.0ED9][.0000.0173.0002.0ED9] # LAO DIGIT NINE
+0F29 ; [.0E32.0020.0002.0F29][.0000.0174.0002.0F29] # TIBETAN DIGIT NINE
+0F32 ; [.0E32.0020.0004.0F32][.0000.0174.0004.0F32] # TIBETAN DIGIT HALF NINE; QQK
+1049 ; [.0E32.0020.0002.1049][.0000.0175.0002.1049] # MYANMAR DIGIT NINE
+17E9 ; [.0E32.0020.0002.17E9][.0000.0176.0002.17E9] # KHMER DIGIT NINE
+17F9 ; [.0E32.0020.0002.17F9][.0000.0177.0002.17F9] # KHMER SYMBOL LEK ATTAK PRAM-BUON
+1819 ; [.0E32.0020.0002.1819][.0000.0178.0002.1819] # MONGOLIAN DIGIT NINE
+3029 ; [.0E32.0020.0002.3029][.0000.0179.0002.3029] # HANGZHOU NUMERAL NINE
+1010F ; [.0E32.0020.0002.1010F][.0000.017A.0002.1010F] # AEGEAN NUMBER NINE
+33E8 ; [.0E32.0020.0004.33E8][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE; QQKN
+32C8 ; [.0E32.0020.0004.32C8][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER; QQKN
+3361 ; [.0E32.0020.0004.3361][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE; QQKN
+0061 ; [.0E33.0020.0002.0061] # LATIN SMALL LETTER A
+FF41 ; [.0E33.0020.0003.FF41] # FULLWIDTH LATIN SMALL LETTER A; QQK
+0363 ; [.0E33.0020.0004.0363] # COMBINING LATIN SMALL LETTER A; QQK
+249C ; [*0288.0020.0004.249C][.0E33.0020.0004.249C][*0289.0020.001F.249C] # PARENTHESIZED LATIN SMALL LETTER A; QQKN
+1D41A ; [.0E33.0020.0005.1D41A] # MATHEMATICAL BOLD SMALL A; QQK
+1D44E ; [.0E33.0020.0005.1D44E] # MATHEMATICAL ITALIC SMALL A; QQK
+1D482 ; [.0E33.0020.0005.1D482] # MATHEMATICAL BOLD ITALIC SMALL A; QQK
+1D4B6 ; [.0E33.0020.0005.1D4B6] # MATHEMATICAL SCRIPT SMALL A; QQK
+1D4EA ; [.0E33.0020.0005.1D4EA] # MATHEMATICAL BOLD SCRIPT SMALL A; QQK
+1D51E ; [.0E33.0020.0005.1D51E] # MATHEMATICAL FRAKTUR SMALL A; QQK
+1D552 ; [.0E33.0020.0005.1D552] # MATHEMATICAL DOUBLE-STRUCK SMALL A; QQK
+1D586 ; [.0E33.0020.0005.1D586] # MATHEMATICAL BOLD FRAKTUR SMALL A; QQK
+1D5BA ; [.0E33.0020.0005.1D5BA] # MATHEMATICAL SANS-SERIF SMALL A; QQK
+1D5EE ; [.0E33.0020.0005.1D5EE] # MATHEMATICAL SANS-SERIF BOLD SMALL A; QQK
+1D622 ; [.0E33.0020.0005.1D622] # MATHEMATICAL SANS-SERIF ITALIC SMALL A; QQK
+1D656 ; [.0E33.0020.0005.1D656] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A; QQK
+1D68A ; [.0E33.0020.0005.1D68A] # MATHEMATICAL MONOSPACE SMALL A; QQK
+24D0 ; [.0E33.0020.0006.24D0] # CIRCLED LATIN SMALL LETTER A; QQK
+0041 ; [.0E33.0020.0008.0041] # LATIN CAPITAL LETTER A
+FF21 ; [.0E33.0020.0009.FF21] # FULLWIDTH LATIN CAPITAL LETTER A; QQK
+1D400 ; [.0E33.0020.000B.1D400] # MATHEMATICAL BOLD CAPITAL A; QQK
+1D434 ; [.0E33.0020.000B.1D434] # MATHEMATICAL ITALIC CAPITAL A; QQK
+1D468 ; [.0E33.0020.000B.1D468] # MATHEMATICAL BOLD ITALIC CAPITAL A; QQK
+1D49C ; [.0E33.0020.000B.1D49C] # MATHEMATICAL SCRIPT CAPITAL A; QQK
+1D4D0 ; [.0E33.0020.000B.1D4D0] # MATHEMATICAL BOLD SCRIPT CAPITAL A; QQK
+1D504 ; [.0E33.0020.000B.1D504] # MATHEMATICAL FRAKTUR CAPITAL A; QQK
+1D538 ; [.0E33.0020.000B.1D538] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A; QQK
+1D56C ; [.0E33.0020.000B.1D56C] # MATHEMATICAL BOLD FRAKTUR CAPITAL A; QQK
+1D5A0 ; [.0E33.0020.000B.1D5A0] # MATHEMATICAL SANS-SERIF CAPITAL A; QQK
+1D5D4 ; [.0E33.0020.000B.1D5D4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A; QQK
+1D608 ; [.0E33.0020.000B.1D608] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A; QQK
+1D63C ; [.0E33.0020.000B.1D63C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A; QQK
+1D670 ; [.0E33.0020.000B.1D670] # MATHEMATICAL MONOSPACE CAPITAL A; QQK
+24B6 ; [.0E33.0020.000C.24B6] # CIRCLED LATIN CAPITAL LETTER A; QQK
+00AA ; [.0E33.0020.0014.00AA] # FEMININE ORDINAL INDICATOR; QQK
+1D2C ; [.0E33.0020.0014.1D2C] # MODIFIER LETTER CAPITAL A; QQK
+1D43 ; [.0E33.0020.0014.1D43] # MODIFIER LETTER SMALL A; QQK
+00E1 ; [.0E33.0020.0002.0061][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH ACUTE; QQCM
+00C1 ; [.0E33.0020.0008.0041][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH ACUTE; QQCM
+00E0 ; [.0E33.0020.0002.0061][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH GRAVE; QQCM
+00C0 ; [.0E33.0020.0008.0041][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH GRAVE; QQCM
+0103 ; [.0E33.0020.0002.0061][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE; QQCM
+0102 ; [.0E33.0020.0008.0041][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE; QQCM
+1EAF ; [.0E33.0020.0002.0061][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH BREVE AND ACUTE; QQCM
+1EAE ; [.0E33.0020.0008.0041][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE; QQCM
+1EB1 ; [.0E33.0020.0002.0061][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH BREVE AND GRAVE; QQCM
+1EB0 ; [.0E33.0020.0008.0041][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE; QQCM
+1EB5 ; [.0E33.0020.0002.0061][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH BREVE AND TILDE; QQCM
+1EB4 ; [.0E33.0020.0008.0041][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE; QQCM
+1EB3 ; [.0E33.0020.0002.0061][.0000.0037.0002.0306][.0000.005F.0002.0309] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE; QQCM
+1EB2 ; [.0E33.0020.0008.0041][.0000.0037.0002.0306][.0000.005F.0002.0309] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE; QQCM
+00E2 ; [.0E33.0020.0002.0061][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX; QQCM
+00C2 ; [.0E33.0020.0008.0041][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX; QQCM
+1EA5 ; [.0E33.0020.0002.0061][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE; QQCM
+1EA4 ; [.0E33.0020.0008.0041][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE; QQCM
+1EA7 ; [.0E33.0020.0002.0061][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE; QQCM
+1EA6 ; [.0E33.0020.0008.0041][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE; QQCM
+1EAB ; [.0E33.0020.0002.0061][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE; QQCM
+1EAA ; [.0E33.0020.0008.0041][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE; QQCM
+1EA9 ; [.0E33.0020.0002.0061][.0000.003C.0002.0302][.0000.005F.0002.0309] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1EA8 ; [.0E33.0020.0008.0041][.0000.003C.0002.0302][.0000.005F.0002.0309] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+01CE ; [.0E33.0020.0002.0061][.0000.0041.0002.030C] # LATIN SMALL LETTER A WITH CARON; QQCM
+01CD ; [.0E33.0020.0008.0041][.0000.0041.0002.030C] # LATIN CAPITAL LETTER A WITH CARON; QQCM
+00E5 ; [.0E33.0020.0002.0061][.0000.0043.0002.030A] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
+00C5 ; [.0E33.0020.0008.0041][.0000.0043.0002.030A] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
+212B ; [.0E33.0020.0008.0041][.0000.0043.0002.030A] # ANGSTROM SIGN; QQCM
+01FB ; [.0E33.0020.0002.0061][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE; QQCM
+01FA ; [.0E33.0020.0008.0041][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE; QQCM
+00E4 ; [.0E33.0020.0002.0061][.0000.0047.0002.0308] # LATIN SMALL LETTER A WITH DIAERESIS; QQCM
+00C4 ; [.0E33.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS; QQCM
+01DF ; [.0E33.0020.0002.0061][.0000.0047.0002.0308][.0000.005A.0002.0304] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON; QQCM
+01DE ; [.0E33.0020.0008.0041][.0000.0047.0002.0308][.0000.005A.0002.0304] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON; QQCM
+00E3 ; [.0E33.0020.0002.0061][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH TILDE; QQCM
+00C3 ; [.0E33.0020.0008.0041][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH TILDE; QQCM
+0227 ; [.0E33.0020.0002.0061][.0000.0052.0002.0307] # LATIN SMALL LETTER A WITH DOT ABOVE; QQCM
+0226 ; [.0E33.0020.0008.0041][.0000.0052.0002.0307] # LATIN CAPITAL LETTER A WITH DOT ABOVE; QQCM
+01E1 ; [.0E33.0020.0002.0061][.0000.0052.0002.0307][.0000.005A.0002.0304] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON; QQCM
+01E0 ; [.0E33.0020.0008.0041][.0000.0052.0002.0307][.0000.005A.0002.0304] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON; QQCM
+0105 ; [.0E33.0020.0002.0061][.0000.0058.0002.0328] # LATIN SMALL LETTER A WITH OGONEK; QQCM
+0104 ; [.0E33.0020.0008.0041][.0000.0058.0002.0328] # LATIN CAPITAL LETTER A WITH OGONEK; QQCM
+0101 ; [.0E33.0020.0002.0061][.0000.005A.0002.0304] # LATIN SMALL LETTER A WITH MACRON; QQCM
+0100 ; [.0E33.0020.0008.0041][.0000.005A.0002.0304] # LATIN CAPITAL LETTER A WITH MACRON; QQCM
+1EA3 ; [.0E33.0020.0002.0061][.0000.005F.0002.0309] # LATIN SMALL LETTER A WITH HOOK ABOVE; QQCM
+1EA2 ; [.0E33.0020.0008.0041][.0000.005F.0002.0309] # LATIN CAPITAL LETTER A WITH HOOK ABOVE; QQCM
+0201 ; [.0E33.0020.0002.0061][.0000.0062.0002.030F] # LATIN SMALL LETTER A WITH DOUBLE GRAVE; QQCM
+0200 ; [.0E33.0020.0008.0041][.0000.0062.0002.030F] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE; QQCM
+0203 ; [.0E33.0020.0002.0061][.0000.0064.0002.0311] # LATIN SMALL LETTER A WITH INVERTED BREVE; QQCM
+0202 ; [.0E33.0020.0008.0041][.0000.0064.0002.0311] # LATIN CAPITAL LETTER A WITH INVERTED BREVE; QQCM
+1EA1 ; [.0E33.0020.0002.0061][.0000.0079.0002.0323] # LATIN SMALL LETTER A WITH DOT BELOW; QQCM
+1EA0 ; [.0E33.0020.0008.0041][.0000.0079.0002.0323] # LATIN CAPITAL LETTER A WITH DOT BELOW; QQCM
+1EB7 ; [.0E33.0020.0002.0061][.0000.0079.0002.0323][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW; QQCM
+1EB6 ; [.0E33.0020.0008.0041][.0000.0079.0002.0323][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW; QQCM
+1EAD ; [.0E33.0020.0002.0061][.0000.0079.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1EAC ; [.0E33.0020.0008.0041][.0000.0079.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1E01 ; [.0E33.0020.0002.0061][.0000.007F.0002.0325] # LATIN SMALL LETTER A WITH RING BELOW; QQCM
+1E00 ; [.0E33.0020.0008.0041][.0000.007F.0002.0325] # LATIN CAPITAL LETTER A WITH RING BELOW; QQCM
+2100 ; [.0E33.0020.0004.2100][*02CC.0020.0004.2100][.0E60.0020.001F.2100] # ACCOUNT OF; QQKN
+33C2 ; [.0E33.0020.001C.33C2][*025D.0020.001C.33C2][.0F5B.0020.001F.33C2][*025D.0020.001F.33C2] # SQUARE AM; QQKN
+33DF ; [.0E33.0020.001D.33DF][*0437.0020.001C.33DF][.0F5B.0020.001F.33DF] # SQUARE A OVER M; QQKN
+2101 ; [.0E33.0020.0004.2101][*02CC.0020.0004.2101][.0FEA.0020.001F.2101] # ADDRESSED TO THE SUBJECT; QQKN
+3373 ; [.0E33.0020.001D.3373][.101F.0020.001D.3373] # SQUARE AU; QQKN
+1E9A ; [.0E33.0020.0004.1E9A][.10B3.0020.0004.1E9A] # LATIN SMALL LETTER A WITH RIGHT HALF RING; QQKN
+1D00 ; [.0E37.0020.0002.1D00] # LATIN LETTER SMALL CAPITAL A
+00E6 ; [.0E38.0020.0002.00E6] # LATIN SMALL LETTER AE
+00C6 ; [.0E38.0020.0008.00C6] # LATIN CAPITAL LETTER AE
+1D2D ; [.0E38.0020.0014.1D2D] # MODIFIER LETTER CAPITAL AE; QQK
+01FD ; [.0E38.0020.0002.00E6][.0000.0032.0002.0301] # LATIN SMALL LETTER AE WITH ACUTE; QQCM
+01FC ; [.0E38.0020.0008.00C6][.0000.0032.0002.0301] # LATIN CAPITAL LETTER AE WITH ACUTE; QQCM
+01E3 ; [.0E38.0020.0002.00E6][.0000.005A.0002.0304] # LATIN SMALL LETTER AE WITH MACRON; QQCM
+01E2 ; [.0E38.0020.0008.00C6][.0000.005A.0002.0304] # LATIN CAPITAL LETTER AE WITH MACRON; QQCM
+1D01 ; [.0E3C.0020.0002.1D01] # LATIN LETTER SMALL CAPITAL AE
+1D02 ; [.0E3D.0020.0002.1D02] # LATIN SMALL LETTER TURNED AE
+1D46 ; [.0E3D.0020.0014.1D46] # MODIFIER LETTER SMALL TURNED AE; QQK
+0250 ; [.0E3E.0020.0002.0250] # LATIN SMALL LETTER TURNED A
+1D44 ; [.0E3E.0020.0014.1D44] # MODIFIER LETTER SMALL TURNED A; QQK
+0251 ; [.0E42.0020.0002.0251] # LATIN SMALL LETTER ALPHA
+1D45 ; [.0E42.0020.0014.1D45] # MODIFIER LETTER SMALL ALPHA; QQK
+0252 ; [.0E46.0020.0002.0252] # LATIN SMALL LETTER TURNED ALPHA
+0062 ; [.0E4A.0020.0002.0062] # LATIN SMALL LETTER B
+FF42 ; [.0E4A.0020.0003.FF42] # FULLWIDTH LATIN SMALL LETTER B; QQK
+249D ; [*0288.0020.0004.249D][.0E4A.0020.0004.249D][*0289.0020.001F.249D] # PARENTHESIZED LATIN SMALL LETTER B; QQKN
+1D41B ; [.0E4A.0020.0005.1D41B] # MATHEMATICAL BOLD SMALL B; QQK
+1D44F ; [.0E4A.0020.0005.1D44F] # MATHEMATICAL ITALIC SMALL B; QQK
+1D483 ; [.0E4A.0020.0005.1D483] # MATHEMATICAL BOLD ITALIC SMALL B; QQK
+1D4B7 ; [.0E4A.0020.0005.1D4B7] # MATHEMATICAL SCRIPT SMALL B; QQK
+1D4EB ; [.0E4A.0020.0005.1D4EB] # MATHEMATICAL BOLD SCRIPT SMALL B; QQK
+1D51F ; [.0E4A.0020.0005.1D51F] # MATHEMATICAL FRAKTUR SMALL B; QQK
+1D553 ; [.0E4A.0020.0005.1D553] # MATHEMATICAL DOUBLE-STRUCK SMALL B; QQK
+1D587 ; [.0E4A.0020.0005.1D587] # MATHEMATICAL BOLD FRAKTUR SMALL B; QQK
+1D5BB ; [.0E4A.0020.0005.1D5BB] # MATHEMATICAL SANS-SERIF SMALL B; QQK
+1D5EF ; [.0E4A.0020.0005.1D5EF] # MATHEMATICAL SANS-SERIF BOLD SMALL B; QQK
+1D623 ; [.0E4A.0020.0005.1D623] # MATHEMATICAL SANS-SERIF ITALIC SMALL B; QQK
+1D657 ; [.0E4A.0020.0005.1D657] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B; QQK
+1D68B ; [.0E4A.0020.0005.1D68B] # MATHEMATICAL MONOSPACE SMALL B; QQK
+24D1 ; [.0E4A.0020.0006.24D1] # CIRCLED LATIN SMALL LETTER B; QQK
+0042 ; [.0E4A.0020.0008.0042] # LATIN CAPITAL LETTER B
+FF22 ; [.0E4A.0020.0009.FF22] # FULLWIDTH LATIN CAPITAL LETTER B; QQK
+212C ; [.0E4A.0020.000B.212C] # SCRIPT CAPITAL B; QQK
+1D401 ; [.0E4A.0020.000B.1D401] # MATHEMATICAL BOLD CAPITAL B; QQK
+1D435 ; [.0E4A.0020.000B.1D435] # MATHEMATICAL ITALIC CAPITAL B; QQK
+1D469 ; [.0E4A.0020.000B.1D469] # MATHEMATICAL BOLD ITALIC CAPITAL B; QQK
+1D4D1 ; [.0E4A.0020.000B.1D4D1] # MATHEMATICAL BOLD SCRIPT CAPITAL B; QQK
+1D505 ; [.0E4A.0020.000B.1D505] # MATHEMATICAL FRAKTUR CAPITAL B; QQK
+1D539 ; [.0E4A.0020.000B.1D539] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B; QQK
+1D56D ; [.0E4A.0020.000B.1D56D] # MATHEMATICAL BOLD FRAKTUR CAPITAL B; QQK
+1D5A1 ; [.0E4A.0020.000B.1D5A1] # MATHEMATICAL SANS-SERIF CAPITAL B; QQK
+1D5D5 ; [.0E4A.0020.000B.1D5D5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B; QQK
+1D609 ; [.0E4A.0020.000B.1D609] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B; QQK
+1D63D ; [.0E4A.0020.000B.1D63D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B; QQK
+1D671 ; [.0E4A.0020.000B.1D671] # MATHEMATICAL MONOSPACE CAPITAL B; QQK
+24B7 ; [.0E4A.0020.000C.24B7] # CIRCLED LATIN CAPITAL LETTER B; QQK
+1D2E ; [.0E4A.0020.0014.1D2E] # MODIFIER LETTER CAPITAL B; QQK
+1D47 ; [.0E4A.0020.0014.1D47] # MODIFIER LETTER SMALL B; QQK
+1E03 ; [.0E4A.0020.0002.0062][.0000.0052.0002.0307] # LATIN SMALL LETTER B WITH DOT ABOVE; QQCM
+1E02 ; [.0E4A.0020.0008.0042][.0000.0052.0002.0307] # LATIN CAPITAL LETTER B WITH DOT ABOVE; QQCM
+1E05 ; [.0E4A.0020.0002.0062][.0000.0079.0002.0323] # LATIN SMALL LETTER B WITH DOT BELOW; QQCM
+1E04 ; [.0E4A.0020.0008.0042][.0000.0079.0002.0323] # LATIN CAPITAL LETTER B WITH DOT BELOW; QQCM
+1E07 ; [.0E4A.0020.0002.0062][.0000.0089.0002.0331] # LATIN SMALL LETTER B WITH LINE BELOW; QQCM
+1E06 ; [.0E4A.0020.0008.0042][.0000.0089.0002.0331] # LATIN CAPITAL LETTER B WITH LINE BELOW; QQCM
+3374 ; [.0E4A.0020.001C.3374][.0E33.0020.001C.3374][.0FC0.0020.001F.3374] # SQUARE BAR; QQKN
+33C3 ; [.0E4A.0020.001D.33C3][.0FB4.0020.001C.33C3] # SQUARE BQ; QQKN
+0299 ; [.0E4E.0020.0002.0299] # LATIN LETTER SMALL CAPITAL B
+0180 ; [.0E52.0020.0002.0180] # LATIN SMALL LETTER B WITH STROKE
+1D2F ; [.0E56.0020.0002.1D2F] # MODIFIER LETTER CAPITAL BARRED B
+1D03 ; [.0E57.0020.0002.1D03] # LATIN LETTER SMALL CAPITAL BARRED B
+0253 ; [.0E58.0020.0002.0253] # LATIN SMALL LETTER B WITH HOOK
+0181 ; [.0E58.0020.0008.0181] # LATIN CAPITAL LETTER B WITH HOOK
+0183 ; [.0E5C.0020.0002.0183] # LATIN SMALL LETTER B WITH TOPBAR
+0182 ; [.0E5C.0020.0008.0182] # LATIN CAPITAL LETTER B WITH TOPBAR
+0063 ; [.0E60.0020.0002.0063] # LATIN SMALL LETTER C
+FF43 ; [.0E60.0020.0003.FF43] # FULLWIDTH LATIN SMALL LETTER C; QQK
+0368 ; [.0E60.0020.0004.0368] # COMBINING LATIN SMALL LETTER C; QQK
+217D ; [.0E60.0020.0004.217D] # SMALL ROMAN NUMERAL ONE HUNDRED; QQK
+249E ; [*0288.0020.0004.249E][.0E60.0020.0004.249E][*0289.0020.001F.249E] # PARENTHESIZED LATIN SMALL LETTER C; QQKN
+1D41C ; [.0E60.0020.0005.1D41C] # MATHEMATICAL BOLD SMALL C; QQK
+1D450 ; [.0E60.0020.0005.1D450] # MATHEMATICAL ITALIC SMALL C; QQK
+1D484 ; [.0E60.0020.0005.1D484] # MATHEMATICAL BOLD ITALIC SMALL C; QQK
+1D4B8 ; [.0E60.0020.0005.1D4B8] # MATHEMATICAL SCRIPT SMALL C; QQK
+1D4EC ; [.0E60.0020.0005.1D4EC] # MATHEMATICAL BOLD SCRIPT SMALL C; QQK
+1D520 ; [.0E60.0020.0005.1D520] # MATHEMATICAL FRAKTUR SMALL C; QQK
+1D554 ; [.0E60.0020.0005.1D554] # MATHEMATICAL DOUBLE-STRUCK SMALL C; QQK
+1D588 ; [.0E60.0020.0005.1D588] # MATHEMATICAL BOLD FRAKTUR SMALL C; QQK
+1D5BC ; [.0E60.0020.0005.1D5BC] # MATHEMATICAL SANS-SERIF SMALL C; QQK
+1D5F0 ; [.0E60.0020.0005.1D5F0] # MATHEMATICAL SANS-SERIF BOLD SMALL C; QQK
+1D624 ; [.0E60.0020.0005.1D624] # MATHEMATICAL SANS-SERIF ITALIC SMALL C; QQK
+1D658 ; [.0E60.0020.0005.1D658] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C; QQK
+1D68C ; [.0E60.0020.0005.1D68C] # MATHEMATICAL MONOSPACE SMALL C; QQK
+24D2 ; [.0E60.0020.0006.24D2] # CIRCLED LATIN SMALL LETTER C; QQK
+0043 ; [.0E60.0020.0008.0043] # LATIN CAPITAL LETTER C
+FF23 ; [.0E60.0020.0009.FF23] # FULLWIDTH LATIN CAPITAL LETTER C; QQK
+2103 ; [*034A.0020.0004.2103][.0E60.0020.000A.2103] # DEGREE CELSIUS; QQKN
+216D ; [.0E60.0020.000A.216D] # ROMAN NUMERAL ONE HUNDRED; QQK
+2102 ; [.0E60.0020.000B.2102] # DOUBLE-STRUCK CAPITAL C; QQK
+212D ; [.0E60.0020.000B.212D] # BLACK-LETTER CAPITAL C; QQK
+1D402 ; [.0E60.0020.000B.1D402] # MATHEMATICAL BOLD CAPITAL C; QQK
+1D436 ; [.0E60.0020.000B.1D436] # MATHEMATICAL ITALIC CAPITAL C; QQK
+1D46A ; [.0E60.0020.000B.1D46A] # MATHEMATICAL BOLD ITALIC CAPITAL C; QQK
+1D49E ; [.0E60.0020.000B.1D49E] # MATHEMATICAL SCRIPT CAPITAL C; QQK
+1D4D2 ; [.0E60.0020.000B.1D4D2] # MATHEMATICAL BOLD SCRIPT CAPITAL C; QQK
+1D56E ; [.0E60.0020.000B.1D56E] # MATHEMATICAL BOLD FRAKTUR CAPITAL C; QQK
+1D5A2 ; [.0E60.0020.000B.1D5A2] # MATHEMATICAL SANS-SERIF CAPITAL C; QQK
+1D5D6 ; [.0E60.0020.000B.1D5D6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C; QQK
+1D60A ; [.0E60.0020.000B.1D60A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C; QQK
+1D63E ; [.0E60.0020.000B.1D63E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C; QQK
+1D672 ; [.0E60.0020.000B.1D672] # MATHEMATICAL MONOSPACE CAPITAL C; QQK
+24B8 ; [.0E60.0020.000C.24B8] # CIRCLED LATIN CAPITAL LETTER C; QQK
+0107 ; [.0E60.0020.0002.0063][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH ACUTE; QQCM
+0106 ; [.0E60.0020.0008.0043][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH ACUTE; QQCM
+0109 ; [.0E60.0020.0002.0063][.0000.003C.0002.0302] # LATIN SMALL LETTER C WITH CIRCUMFLEX; QQCM
+0108 ; [.0E60.0020.0008.0043][.0000.003C.0002.0302] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX; QQCM
+010D ; [.0E60.0020.0002.0063][.0000.0041.0002.030C] # LATIN SMALL LETTER C WITH CARON; QQCM
+010C ; [.0E60.0020.0008.0043][.0000.0041.0002.030C] # LATIN CAPITAL LETTER C WITH CARON; QQCM
+010B ; [.0E60.0020.0002.0063][.0000.0052.0002.0307] # LATIN SMALL LETTER C WITH DOT ABOVE; QQCM
+010A ; [.0E60.0020.0008.0043][.0000.0052.0002.0307] # LATIN CAPITAL LETTER C WITH DOT ABOVE; QQCM
+00E7 ; [.0E60.0020.0002.0063][.0000.0055.0002.0327] # LATIN SMALL LETTER C WITH CEDILLA; QQCM
+00C7 ; [.0E60.0020.0008.0043][.0000.0055.0002.0327] # LATIN CAPITAL LETTER C WITH CEDILLA; QQCM
+1E09 ; [.0E60.0020.0002.0063][.0000.0055.0002.0327][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE; QQCM
+1E08 ; [.0E60.0020.0008.0043][.0000.0055.0002.0327][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE; QQCM
+3388 ; [.0E60.0020.001C.3388][.0E33.0020.001C.3388][.0F2E.0020.001F.3388] # SQUARE CAL; QQKN
+33C4 ; [.0E60.0020.001C.33C4][.0E60.0020.001C.33C4] # SQUARE CC; QQKN
+33C5 ; [.0E60.0020.001C.33C5][.0E6D.0020.001C.33C5] # SQUARE CD; QQKN
+33C6 ; [.0E60.0020.001D.33C6][*0437.0020.001C.33C6][.0F21.0020.001F.33C6][.0EC1.0020.001F.33C6] # SQUARE C OVER KG; QQKN
+339D ; [.0E60.0020.001C.339D][.0F5B.0020.001C.339D] # SQUARE CM; QQKN
+33A0 ; [.0E60.0020.001C.33A0][.0F5B.0020.001C.33A0][.0E2B.0020.001F.33A0] # SQUARE CM SQUARED; QQKN
+33A4 ; [.0E60.0020.001C.33A4][.0F5B.0020.001C.33A4][.0E2C.0020.001F.33A4] # SQUARE CM CUBED; QQKN
+2105 ; [.0E60.0020.0004.2105][*02CC.0020.0004.2105][.0F82.0020.001F.2105] # CARE OF; QQKN
+33C7 ; [.0E60.0020.001D.33C7][.0F82.0020.001C.33C7][*025D.0020.001F.33C7] # SQUARE CO; QQKN
+2106 ; [.0E60.0020.0004.2106][*02CC.0020.0004.2106][.101F.0020.001F.2106] # CADA UNA; QQKN
+1D04 ; [.0E64.0020.0002.1D04] # LATIN LETTER SMALL CAPITAL C
+0188 ; [.0E65.0020.0002.0188] # LATIN SMALL LETTER C WITH HOOK
+0187 ; [.0E65.0020.0008.0187] # LATIN CAPITAL LETTER C WITH HOOK
+0255 ; [.0E69.0020.0002.0255] # LATIN SMALL LETTER C WITH CURL
+0064 ; [.0E6D.0020.0002.0064] # LATIN SMALL LETTER D
+FF44 ; [.0E6D.0020.0003.FF44] # FULLWIDTH LATIN SMALL LETTER D; QQK
+0369 ; [.0E6D.0020.0004.0369] # COMBINING LATIN SMALL LETTER D; QQK
+217E ; [.0E6D.0020.0004.217E] # SMALL ROMAN NUMERAL FIVE HUNDRED; QQK
+249F ; [*0288.0020.0004.249F][.0E6D.0020.0004.249F][*0289.0020.001F.249F] # PARENTHESIZED LATIN SMALL LETTER D; QQKN
+2146 ; [.0E6D.0020.0005.2146] # DOUBLE-STRUCK ITALIC SMALL D; QQK
+1D41D ; [.0E6D.0020.0005.1D41D] # MATHEMATICAL BOLD SMALL D; QQK
+1D451 ; [.0E6D.0020.0005.1D451] # MATHEMATICAL ITALIC SMALL D; QQK
+1D485 ; [.0E6D.0020.0005.1D485] # MATHEMATICAL BOLD ITALIC SMALL D; QQK
+1D4B9 ; [.0E6D.0020.0005.1D4B9] # MATHEMATICAL SCRIPT SMALL D; QQK
+1D4ED ; [.0E6D.0020.0005.1D4ED] # MATHEMATICAL BOLD SCRIPT SMALL D; QQK
+1D521 ; [.0E6D.0020.0005.1D521] # MATHEMATICAL FRAKTUR SMALL D; QQK
+1D555 ; [.0E6D.0020.0005.1D555] # MATHEMATICAL DOUBLE-STRUCK SMALL D; QQK
+1D589 ; [.0E6D.0020.0005.1D589] # MATHEMATICAL BOLD FRAKTUR SMALL D; QQK
+1D5BD ; [.0E6D.0020.0005.1D5BD] # MATHEMATICAL SANS-SERIF SMALL D; QQK
+1D5F1 ; [.0E6D.0020.0005.1D5F1] # MATHEMATICAL SANS-SERIF BOLD SMALL D; QQK
+1D625 ; [.0E6D.0020.0005.1D625] # MATHEMATICAL SANS-SERIF ITALIC SMALL D; QQK
+1D659 ; [.0E6D.0020.0005.1D659] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D; QQK
+1D68D ; [.0E6D.0020.0005.1D68D] # MATHEMATICAL MONOSPACE SMALL D; QQK
+24D3 ; [.0E6D.0020.0006.24D3] # CIRCLED LATIN SMALL LETTER D; QQK
+0044 ; [.0E6D.0020.0008.0044] # LATIN CAPITAL LETTER D
+FF24 ; [.0E6D.0020.0009.FF24] # FULLWIDTH LATIN CAPITAL LETTER D; QQK
+216E ; [.0E6D.0020.000A.216E] # ROMAN NUMERAL FIVE HUNDRED; QQK
+2145 ; [.0E6D.0020.000B.2145] # DOUBLE-STRUCK ITALIC CAPITAL D; QQK
+1D403 ; [.0E6D.0020.000B.1D403] # MATHEMATICAL BOLD CAPITAL D; QQK
+1D437 ; [.0E6D.0020.000B.1D437] # MATHEMATICAL ITALIC CAPITAL D; QQK
+1D46B ; [.0E6D.0020.000B.1D46B] # MATHEMATICAL BOLD ITALIC CAPITAL D; QQK
+1D49F ; [.0E6D.0020.000B.1D49F] # MATHEMATICAL SCRIPT CAPITAL D; QQK
+1D4D3 ; [.0E6D.0020.000B.1D4D3] # MATHEMATICAL BOLD SCRIPT CAPITAL D; QQK
+1D507 ; [.0E6D.0020.000B.1D507] # MATHEMATICAL FRAKTUR CAPITAL D; QQK
+1D53B ; [.0E6D.0020.000B.1D53B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D; QQK
+1D56F ; [.0E6D.0020.000B.1D56F] # MATHEMATICAL BOLD FRAKTUR CAPITAL D; QQK
+1D5A3 ; [.0E6D.0020.000B.1D5A3] # MATHEMATICAL SANS-SERIF CAPITAL D; QQK
+1D5D7 ; [.0E6D.0020.000B.1D5D7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D; QQK
+1D60B ; [.0E6D.0020.000B.1D60B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D; QQK
+1D63F ; [.0E6D.0020.000B.1D63F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D; QQK
+1D673 ; [.0E6D.0020.000B.1D673] # MATHEMATICAL MONOSPACE CAPITAL D; QQK
+24B9 ; [.0E6D.0020.000C.24B9] # CIRCLED LATIN CAPITAL LETTER D; QQK
+1D30 ; [.0E6D.0020.0014.1D30] # MODIFIER LETTER CAPITAL D; QQK
+1D48 ; [.0E6D.0020.0014.1D48] # MODIFIER LETTER SMALL D; QQK
+010F ; [.0E6D.0020.0002.0064][.0000.0041.0002.030C] # LATIN SMALL LETTER D WITH CARON; QQCM
+010E ; [.0E6D.0020.0008.0044][.0000.0041.0002.030C] # LATIN CAPITAL LETTER D WITH CARON; QQCM
+1E0B ; [.0E6D.0020.0002.0064][.0000.0052.0002.0307] # LATIN SMALL LETTER D WITH DOT ABOVE; QQCM
+1E0A ; [.0E6D.0020.0008.0044][.0000.0052.0002.0307] # LATIN CAPITAL LETTER D WITH DOT ABOVE; QQCM
+1E11 ; [.0E6D.0020.0002.0064][.0000.0055.0002.0327] # LATIN SMALL LETTER D WITH CEDILLA; QQCM
+1E10 ; [.0E6D.0020.0008.0044][.0000.0055.0002.0327] # LATIN CAPITAL LETTER D WITH CEDILLA; QQCM
+1E0D ; [.0E6D.0020.0002.0064][.0000.0079.0002.0323] # LATIN SMALL LETTER D WITH DOT BELOW; QQCM
+1E0C ; [.0E6D.0020.0008.0044][.0000.0079.0002.0323] # LATIN CAPITAL LETTER D WITH DOT BELOW; QQCM
+1E13 ; [.0E6D.0020.0002.0064][.0000.0085.0002.032D] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW; QQCM
+1E12 ; [.0E6D.0020.0008.0044][.0000.0085.0002.032D] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW; QQCM
+1E0F ; [.0E6D.0020.0002.0064][.0000.0089.0002.0331] # LATIN SMALL LETTER D WITH LINE BELOW; QQCM
+1E0E ; [.0E6D.0020.0008.0044][.0000.0089.0002.0331] # LATIN CAPITAL LETTER D WITH LINE BELOW; QQCM
+3372 ; [.0E6D.0020.001C.3372][.0E33.0020.001C.3372] # SQUARE DA; QQKN
+33C8 ; [.0E6D.0020.001C.33C8][.0E4A.0020.001D.33C8] # SQUARE DB; QQKN
+3397 ; [.0E6D.0020.001C.3397][.0F2E.0020.001C.3397] # SQUARE DL; QQKN
+3377 ; [.0E6D.0020.001C.3377][.0F5B.0020.001C.3377] # SQUARE DM; QQKN
+3378 ; [.0E6D.0020.001C.3378][.0F5B.0020.001C.3378][.0E2B.0020.001F.3378] # SQUARE DM SQUARED; QQKN
+3379 ; [.0E6D.0020.001C.3379][.0F5B.0020.001C.3379][.0E2C.0020.001F.3379] # SQUARE DM CUBED; QQKN
+01F3 ; [.0E6D.0020.0004.01F3][.106A.0020.0004.01F3] # LATIN SMALL LETTER DZ; QQKN
+02A3 ; [.0E6D.0020.0004.02A3][.106A.0020.0004.02A3] # LATIN SMALL LETTER DZ DIGRAPH; QQKN
+01F2 ; [.0E6D.0020.000A.01F2][.106A.0020.0004.01F2] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z; QQKN
+01F1 ; [.0E6D.0020.000A.01F1][.106A.0020.000A.01F1] # LATIN CAPITAL LETTER DZ; QQKN
+01C6 ; [.0E6D.0020.0004.01C6][.106A.0020.0004.01C6][.0000.0041.001F.01C6] # LATIN SMALL LETTER DZ WITH CARON; QQKN
+01C5 ; [.0E6D.0020.000A.01C5][.106A.0020.0004.01C5][.0000.0041.001F.01C5] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON; QQKN
+01C4 ; [.0E6D.0020.000A.01C4][.106A.0020.000A.01C4][.0000.0041.001F.01C4] # LATIN CAPITAL LETTER DZ WITH CARON; QQKN
+02A5 ; [.0E6D.0020.0004.02A5][.107B.0020.0004.02A5] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL; QQKN
+02A4 ; [.0E6D.0020.0004.02A4][.107F.0020.0004.02A4] # LATIN SMALL LETTER DEZH DIGRAPH; QQKN
+1D05 ; [.0E71.0020.0002.1D05] # LATIN LETTER SMALL CAPITAL D
+0111 ; [.0E72.0020.0002.0111] # LATIN SMALL LETTER D WITH STROKE
+0110 ; [.0E72.0020.0008.0110] # LATIN CAPITAL LETTER D WITH STROKE
+0256 ; [.0E76.0020.0002.0256] # LATIN SMALL LETTER D WITH TAIL
+0189 ; [.0E76.0020.0008.0189] # LATIN CAPITAL LETTER AFRICAN D
+0257 ; [.0E7A.0020.0002.0257] # LATIN SMALL LETTER D WITH HOOK
+018A ; [.0E7A.0020.0008.018A] # LATIN CAPITAL LETTER D WITH HOOK
+018C ; [.0E7E.0020.0002.018C] # LATIN SMALL LETTER D WITH TOPBAR
+018B ; [.0E7E.0020.0008.018B] # LATIN CAPITAL LETTER D WITH TOPBAR
+0221 ; [.0E82.0020.0002.0221] # LATIN SMALL LETTER D WITH CURL
+00F0 ; [.0E86.0020.0002.00F0] # LATIN SMALL LETTER ETH
+00D0 ; [.0E86.0020.0008.00D0] # LATIN CAPITAL LETTER ETH
+1D06 ; [.0E8A.0020.0002.1D06] # LATIN LETTER SMALL CAPITAL ETH
+0065 ; [.0E8B.0020.0002.0065] # LATIN SMALL LETTER E
+FF45 ; [.0E8B.0020.0003.FF45] # FULLWIDTH LATIN SMALL LETTER E; QQK
+0364 ; [.0E8B.0020.0004.0364] # COMBINING LATIN SMALL LETTER E; QQK
+24A0 ; [*0288.0020.0004.24A0][.0E8B.0020.0004.24A0][*0289.0020.001F.24A0] # PARENTHESIZED LATIN SMALL LETTER E; QQKN
+212F ; [.0E8B.0020.0005.212F] # SCRIPT SMALL E; QQK
+2147 ; [.0E8B.0020.0005.2147] # DOUBLE-STRUCK ITALIC SMALL E; QQK
+1D41E ; [.0E8B.0020.0005.1D41E] # MATHEMATICAL BOLD SMALL E; QQK
+1D452 ; [.0E8B.0020.0005.1D452] # MATHEMATICAL ITALIC SMALL E; QQK
+1D486 ; [.0E8B.0020.0005.1D486] # MATHEMATICAL BOLD ITALIC SMALL E; QQK
+1D4EE ; [.0E8B.0020.0005.1D4EE] # MATHEMATICAL BOLD SCRIPT SMALL E; QQK
+1D522 ; [.0E8B.0020.0005.1D522] # MATHEMATICAL FRAKTUR SMALL E; QQK
+1D556 ; [.0E8B.0020.0005.1D556] # MATHEMATICAL DOUBLE-STRUCK SMALL E; QQK
+1D58A ; [.0E8B.0020.0005.1D58A] # MATHEMATICAL BOLD FRAKTUR SMALL E; QQK
+1D5BE ; [.0E8B.0020.0005.1D5BE] # MATHEMATICAL SANS-SERIF SMALL E; QQK
+1D5F2 ; [.0E8B.0020.0005.1D5F2] # MATHEMATICAL SANS-SERIF BOLD SMALL E; QQK
+1D626 ; [.0E8B.0020.0005.1D626] # MATHEMATICAL SANS-SERIF ITALIC SMALL E; QQK
+1D65A ; [.0E8B.0020.0005.1D65A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E; QQK
+1D68E ; [.0E8B.0020.0005.1D68E] # MATHEMATICAL MONOSPACE SMALL E; QQK
+24D4 ; [.0E8B.0020.0006.24D4] # CIRCLED LATIN SMALL LETTER E; QQK
+0045 ; [.0E8B.0020.0008.0045] # LATIN CAPITAL LETTER E
+FF25 ; [.0E8B.0020.0009.FF25] # FULLWIDTH LATIN CAPITAL LETTER E; QQK
+2130 ; [.0E8B.0020.000B.2130] # SCRIPT CAPITAL E; QQK
+1D404 ; [.0E8B.0020.000B.1D404] # MATHEMATICAL BOLD CAPITAL E; QQK
+1D438 ; [.0E8B.0020.000B.1D438] # MATHEMATICAL ITALIC CAPITAL E; QQK
+1D46C ; [.0E8B.0020.000B.1D46C] # MATHEMATICAL BOLD ITALIC CAPITAL E; QQK
+1D4D4 ; [.0E8B.0020.000B.1D4D4] # MATHEMATICAL BOLD SCRIPT CAPITAL E; QQK
+1D508 ; [.0E8B.0020.000B.1D508] # MATHEMATICAL FRAKTUR CAPITAL E; QQK
+1D53C ; [.0E8B.0020.000B.1D53C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E; QQK
+1D570 ; [.0E8B.0020.000B.1D570] # MATHEMATICAL BOLD FRAKTUR CAPITAL E; QQK
+1D5A4 ; [.0E8B.0020.000B.1D5A4] # MATHEMATICAL SANS-SERIF CAPITAL E; QQK
+1D5D8 ; [.0E8B.0020.000B.1D5D8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E; QQK
+1D60C ; [.0E8B.0020.000B.1D60C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E; QQK
+1D640 ; [.0E8B.0020.000B.1D640] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E; QQK
+1D674 ; [.0E8B.0020.000B.1D674] # MATHEMATICAL MONOSPACE CAPITAL E; QQK
+24BA ; [.0E8B.0020.000C.24BA] # CIRCLED LATIN CAPITAL LETTER E; QQK
+1D31 ; [.0E8B.0020.0014.1D31] # MODIFIER LETTER CAPITAL E; QQK
+1D49 ; [.0E8B.0020.0014.1D49] # MODIFIER LETTER SMALL E; QQK
+00E9 ; [.0E8B.0020.0002.0065][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH ACUTE; QQCM
+00C9 ; [.0E8B.0020.0008.0045][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH ACUTE; QQCM
+00E8 ; [.0E8B.0020.0002.0065][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH GRAVE; QQCM
+00C8 ; [.0E8B.0020.0008.0045][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH GRAVE; QQCM
+0115 ; [.0E8B.0020.0002.0065][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH BREVE; QQCM
+0114 ; [.0E8B.0020.0008.0045][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH BREVE; QQCM
+00EA ; [.0E8B.0020.0002.0065][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX; QQCM
+00CA ; [.0E8B.0020.0008.0045][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX; QQCM
+1EBF ; [.0E8B.0020.0002.0065][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE; QQCM
+1EBE ; [.0E8B.0020.0008.0045][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE; QQCM
+1EC1 ; [.0E8B.0020.0002.0065][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE; QQCM
+1EC0 ; [.0E8B.0020.0008.0045][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE; QQCM
+1EC5 ; [.0E8B.0020.0002.0065][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE; QQCM
+1EC4 ; [.0E8B.0020.0008.0045][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE; QQCM
+1EC3 ; [.0E8B.0020.0002.0065][.0000.003C.0002.0302][.0000.005F.0002.0309] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1EC2 ; [.0E8B.0020.0008.0045][.0000.003C.0002.0302][.0000.005F.0002.0309] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+011B ; [.0E8B.0020.0002.0065][.0000.0041.0002.030C] # LATIN SMALL LETTER E WITH CARON; QQCM
+011A ; [.0E8B.0020.0008.0045][.0000.0041.0002.030C] # LATIN CAPITAL LETTER E WITH CARON; QQCM
+00EB ; [.0E8B.0020.0002.0065][.0000.0047.0002.0308] # LATIN SMALL LETTER E WITH DIAERESIS; QQCM
+00CB ; [.0E8B.0020.0008.0045][.0000.0047.0002.0308] # LATIN CAPITAL LETTER E WITH DIAERESIS; QQCM
+1EBD ; [.0E8B.0020.0002.0065][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH TILDE; QQCM
+1EBC ; [.0E8B.0020.0008.0045][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH TILDE; QQCM
+0117 ; [.0E8B.0020.0002.0065][.0000.0052.0002.0307] # LATIN SMALL LETTER E WITH DOT ABOVE; QQCM
+0116 ; [.0E8B.0020.0008.0045][.0000.0052.0002.0307] # LATIN CAPITAL LETTER E WITH DOT ABOVE; QQCM
+0229 ; [.0E8B.0020.0002.0065][.0000.0055.0002.0327] # LATIN SMALL LETTER E WITH CEDILLA; QQCM
+0228 ; [.0E8B.0020.0008.0045][.0000.0055.0002.0327] # LATIN CAPITAL LETTER E WITH CEDILLA; QQCM
+1E1D ; [.0E8B.0020.0002.0065][.0000.0055.0002.0327][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE; QQCM
+1E1C ; [.0E8B.0020.0008.0045][.0000.0055.0002.0327][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE; QQCM
+0119 ; [.0E8B.0020.0002.0065][.0000.0058.0002.0328] # LATIN SMALL LETTER E WITH OGONEK; QQCM
+0118 ; [.0E8B.0020.0008.0045][.0000.0058.0002.0328] # LATIN CAPITAL LETTER E WITH OGONEK; QQCM
+0113 ; [.0E8B.0020.0002.0065][.0000.005A.0002.0304] # LATIN SMALL LETTER E WITH MACRON; QQCM
+0112 ; [.0E8B.0020.0008.0045][.0000.005A.0002.0304] # LATIN CAPITAL LETTER E WITH MACRON; QQCM
+1E17 ; [.0E8B.0020.0002.0065][.0000.005A.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH MACRON AND ACUTE; QQCM
+1E16 ; [.0E8B.0020.0008.0045][.0000.005A.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE; QQCM
+1E15 ; [.0E8B.0020.0002.0065][.0000.005A.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH MACRON AND GRAVE; QQCM
+1E14 ; [.0E8B.0020.0008.0045][.0000.005A.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE; QQCM
+1EBB ; [.0E8B.0020.0002.0065][.0000.005F.0002.0309] # LATIN SMALL LETTER E WITH HOOK ABOVE; QQCM
+1EBA ; [.0E8B.0020.0008.0045][.0000.005F.0002.0309] # LATIN CAPITAL LETTER E WITH HOOK ABOVE; QQCM
+0205 ; [.0E8B.0020.0002.0065][.0000.0062.0002.030F] # LATIN SMALL LETTER E WITH DOUBLE GRAVE; QQCM
+0204 ; [.0E8B.0020.0008.0045][.0000.0062.0002.030F] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE; QQCM
+0207 ; [.0E8B.0020.0002.0065][.0000.0064.0002.0311] # LATIN SMALL LETTER E WITH INVERTED BREVE; QQCM
+0206 ; [.0E8B.0020.0008.0045][.0000.0064.0002.0311] # LATIN CAPITAL LETTER E WITH INVERTED BREVE; QQCM
+1EB9 ; [.0E8B.0020.0002.0065][.0000.0079.0002.0323] # LATIN SMALL LETTER E WITH DOT BELOW; QQCM
+1EB8 ; [.0E8B.0020.0008.0045][.0000.0079.0002.0323] # LATIN CAPITAL LETTER E WITH DOT BELOW; QQCM
+1EC7 ; [.0E8B.0020.0002.0065][.0000.0079.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1EC6 ; [.0E8B.0020.0008.0045][.0000.0079.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1E19 ; [.0E8B.0020.0002.0065][.0000.0085.0002.032D] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW; QQCM
+1E18 ; [.0E8B.0020.0008.0045][.0000.0085.0002.032D] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW; QQCM
+1E1B ; [.0E8B.0020.0002.0065][.0000.0088.0002.0330] # LATIN SMALL LETTER E WITH TILDE BELOW; QQCM
+1E1A ; [.0E8B.0020.0008.0045][.0000.0088.0002.0330] # LATIN CAPITAL LETTER E WITH TILDE BELOW; QQCM
+32CD ; [.0E8B.0020.001C.32CD][.0FC0.0020.001C.32CD][.0EC1.0020.001F.32CD] # SQUARE ERG; QQKN
+32CE ; [.0E8B.0020.001C.32CE][.1044.0020.001D.32CE] # SQUARE EV; QQKN
+1D07 ; [.0E8F.0020.0002.1D07] # LATIN LETTER SMALL CAPITAL E
+01DD ; [.0E90.0020.0002.01DD] # LATIN SMALL LETTER TURNED E
+018E ; [.0E90.0020.0008.018E] # LATIN CAPITAL LETTER REVERSED E
+1D32 ; [.0E90.0020.0014.1D32] # MODIFIER LETTER CAPITAL REVERSED E; QQK
+0259 ; [.0E94.0020.0002.0259] # LATIN SMALL LETTER SCHWA
+018F ; [.0E94.0020.0008.018F] # LATIN CAPITAL LETTER SCHWA
+1D4A ; [.0E94.0020.0014.1D4A] # MODIFIER LETTER SMALL SCHWA; QQK
+025B ; [.0E98.0020.0002.025B] # LATIN SMALL LETTER OPEN E
+0190 ; [.0E98.0020.0008.0190] # LATIN CAPITAL LETTER OPEN E
+2107 ; [.0E98.0020.000A.2107] # EULER CONSTANT; QQK
+1D4B ; [.0E98.0020.0014.1D4B] # MODIFIER LETTER SMALL OPEN E; QQK
+0258 ; [.0E9C.0020.0002.0258] # LATIN SMALL LETTER REVERSED E
+025A ; [.0EA0.0020.0002.025A] # LATIN SMALL LETTER SCHWA WITH HOOK
+025C ; [.0EA4.0020.0002.025C] # LATIN SMALL LETTER REVERSED OPEN E
+1D08 ; [.0EA8.0020.0002.1D08] # LATIN SMALL LETTER TURNED OPEN E
+1D4C ; [.0EA8.0020.0014.1D4C] # MODIFIER LETTER SMALL TURNED OPEN E; QQK
+025D ; [.0EA9.0020.0002.025D] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E ; [.0EAD.0020.0002.025E] # LATIN SMALL LETTER CLOSED REVERSED OPEN E
+029A ; [.0EB1.0020.0002.029A] # LATIN SMALL LETTER CLOSED OPEN E
+0264 ; [.0EB5.0020.0002.0264] # LATIN SMALL LETTER RAMS HORN
+0066 ; [.0EB9.0020.0002.0066] # LATIN SMALL LETTER F
+FF46 ; [.0EB9.0020.0003.FF46] # FULLWIDTH LATIN SMALL LETTER F; QQK
+24A1 ; [*0288.0020.0004.24A1][.0EB9.0020.0004.24A1][*0289.0020.001F.24A1] # PARENTHESIZED LATIN SMALL LETTER F; QQKN
+1D41F ; [.0EB9.0020.0005.1D41F] # MATHEMATICAL BOLD SMALL F; QQK
+1D453 ; [.0EB9.0020.0005.1D453] # MATHEMATICAL ITALIC SMALL F; QQK
+1D487 ; [.0EB9.0020.0005.1D487] # MATHEMATICAL BOLD ITALIC SMALL F; QQK
+1D4BB ; [.0EB9.0020.0005.1D4BB] # MATHEMATICAL SCRIPT SMALL F; QQK
+1D4EF ; [.0EB9.0020.0005.1D4EF] # MATHEMATICAL BOLD SCRIPT SMALL F; QQK
+1D523 ; [.0EB9.0020.0005.1D523] # MATHEMATICAL FRAKTUR SMALL F; QQK
+1D557 ; [.0EB9.0020.0005.1D557] # MATHEMATICAL DOUBLE-STRUCK SMALL F; QQK
+1D58B ; [.0EB9.0020.0005.1D58B] # MATHEMATICAL BOLD FRAKTUR SMALL F; QQK
+1D5BF ; [.0EB9.0020.0005.1D5BF] # MATHEMATICAL SANS-SERIF SMALL F; QQK
+1D5F3 ; [.0EB9.0020.0005.1D5F3] # MATHEMATICAL SANS-SERIF BOLD SMALL F; QQK
+1D627 ; [.0EB9.0020.0005.1D627] # MATHEMATICAL SANS-SERIF ITALIC SMALL F; QQK
+1D65B ; [.0EB9.0020.0005.1D65B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F; QQK
+1D68F ; [.0EB9.0020.0005.1D68F] # MATHEMATICAL MONOSPACE SMALL F; QQK
+24D5 ; [.0EB9.0020.0006.24D5] # CIRCLED LATIN SMALL LETTER F; QQK
+0046 ; [.0EB9.0020.0008.0046] # LATIN CAPITAL LETTER F
+FF26 ; [.0EB9.0020.0009.FF26] # FULLWIDTH LATIN CAPITAL LETTER F; QQK
+2109 ; [*034A.0020.0004.2109][.0EB9.0020.000A.2109] # DEGREE FAHRENHEIT; QQKN
+2131 ; [.0EB9.0020.000B.2131] # SCRIPT CAPITAL F; QQK
+1D405 ; [.0EB9.0020.000B.1D405] # MATHEMATICAL BOLD CAPITAL F; QQK
+1D439 ; [.0EB9.0020.000B.1D439] # MATHEMATICAL ITALIC CAPITAL F; QQK
+1D46D ; [.0EB9.0020.000B.1D46D] # MATHEMATICAL BOLD ITALIC CAPITAL F; QQK
+1D4D5 ; [.0EB9.0020.000B.1D4D5] # MATHEMATICAL BOLD SCRIPT CAPITAL F; QQK
+1D509 ; [.0EB9.0020.000B.1D509] # MATHEMATICAL FRAKTUR CAPITAL F; QQK
+1D53D ; [.0EB9.0020.000B.1D53D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F; QQK
+1D571 ; [.0EB9.0020.000B.1D571] # MATHEMATICAL BOLD FRAKTUR CAPITAL F; QQK
+1D5A5 ; [.0EB9.0020.000B.1D5A5] # MATHEMATICAL SANS-SERIF CAPITAL F; QQK
+1D5D9 ; [.0EB9.0020.000B.1D5D9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F; QQK
+1D60D ; [.0EB9.0020.000B.1D60D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F; QQK
+1D641 ; [.0EB9.0020.000B.1D641] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F; QQK
+1D675 ; [.0EB9.0020.000B.1D675] # MATHEMATICAL MONOSPACE CAPITAL F; QQK
+24BB ; [.0EB9.0020.000C.24BB] # CIRCLED LATIN CAPITAL LETTER F; QQK
+1E1F ; [.0EB9.0020.0002.0066][.0000.0052.0002.0307] # LATIN SMALL LETTER F WITH DOT ABOVE; QQCM
+1E1E ; [.0EB9.0020.0008.0046][.0000.0052.0002.0307] # LATIN CAPITAL LETTER F WITH DOT ABOVE; QQCM
+213B ; [.0EB9.0020.000A.213B][.0E33.0020.000A.213B][.105A.0020.001F.213B] # FACSIMILE SIGN; QQKN
+FB00 ; [.0EB9.0020.0004.FB00][.0EB9.0020.0004.FB00] # LATIN SMALL LIGATURE FF; QQKN
+FB03 ; [.0EB9.0020.0004.FB03][.0EB9.0020.0004.FB03][.0EFB.0020.001F.FB03] # LATIN SMALL LIGATURE FFI; QQKN
+FB04 ; [.0EB9.0020.0004.FB04][.0EB9.0020.0004.FB04][.0F2E.0020.001F.FB04] # LATIN SMALL LIGATURE FFL; QQKN
+FB01 ; [.0EB9.0020.0004.FB01][.0EFB.0020.0004.FB01] # LATIN SMALL LIGATURE FI; QQKN
+FB02 ; [.0EB9.0020.0004.FB02][.0F2E.0020.0004.FB02] # LATIN SMALL LIGATURE FL; QQKN
+3399 ; [.0EB9.0020.001C.3399][.0F5B.0020.001C.3399] # SQUARE FM; QQKN
+02A9 ; [.0EB9.0020.0004.02A9][.0F7E.0020.0004.02A9] # LATIN SMALL LETTER FENG DIGRAPH; QQKN
+0192 ; [.0EBD.0020.0002.0192] # LATIN SMALL LETTER F WITH HOOK
+0191 ; [.0EBD.0020.0008.0191] # LATIN CAPITAL LETTER F WITH HOOK
+0067 ; [.0EC1.0020.0002.0067] # LATIN SMALL LETTER G
+FF47 ; [.0EC1.0020.0003.FF47] # FULLWIDTH LATIN SMALL LETTER G; QQK
+24A2 ; [*0288.0020.0004.24A2][.0EC1.0020.0004.24A2][*0289.0020.001F.24A2] # PARENTHESIZED LATIN SMALL LETTER G; QQKN
+210A ; [.0EC1.0020.0005.210A] # SCRIPT SMALL G; QQK
+1D420 ; [.0EC1.0020.0005.1D420] # MATHEMATICAL BOLD SMALL G; QQK
+1D454 ; [.0EC1.0020.0005.1D454] # MATHEMATICAL ITALIC SMALL G; QQK
+1D488 ; [.0EC1.0020.0005.1D488] # MATHEMATICAL BOLD ITALIC SMALL G; QQK
+1D4F0 ; [.0EC1.0020.0005.1D4F0] # MATHEMATICAL BOLD SCRIPT SMALL G; QQK
+1D524 ; [.0EC1.0020.0005.1D524] # MATHEMATICAL FRAKTUR SMALL G; QQK
+1D558 ; [.0EC1.0020.0005.1D558] # MATHEMATICAL DOUBLE-STRUCK SMALL G; QQK
+1D58C ; [.0EC1.0020.0005.1D58C] # MATHEMATICAL BOLD FRAKTUR SMALL G; QQK
+1D5C0 ; [.0EC1.0020.0005.1D5C0] # MATHEMATICAL SANS-SERIF SMALL G; QQK
+1D5F4 ; [.0EC1.0020.0005.1D5F4] # MATHEMATICAL SANS-SERIF BOLD SMALL G; QQK
+1D628 ; [.0EC1.0020.0005.1D628] # MATHEMATICAL SANS-SERIF ITALIC SMALL G; QQK
+1D65C ; [.0EC1.0020.0005.1D65C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G; QQK
+1D690 ; [.0EC1.0020.0005.1D690] # MATHEMATICAL MONOSPACE SMALL G; QQK
+24D6 ; [.0EC1.0020.0006.24D6] # CIRCLED LATIN SMALL LETTER G; QQK
+0047 ; [.0EC1.0020.0008.0047] # LATIN CAPITAL LETTER G
+FF27 ; [.0EC1.0020.0009.FF27] # FULLWIDTH LATIN CAPITAL LETTER G; QQK
+1D406 ; [.0EC1.0020.000B.1D406] # MATHEMATICAL BOLD CAPITAL G; QQK
+1D43A ; [.0EC1.0020.000B.1D43A] # MATHEMATICAL ITALIC CAPITAL G; QQK
+1D46E ; [.0EC1.0020.000B.1D46E] # MATHEMATICAL BOLD ITALIC CAPITAL G; QQK
+1D4A2 ; [.0EC1.0020.000B.1D4A2] # MATHEMATICAL SCRIPT CAPITAL G; QQK
+1D4D6 ; [.0EC1.0020.000B.1D4D6] # MATHEMATICAL BOLD SCRIPT CAPITAL G; QQK
+1D50A ; [.0EC1.0020.000B.1D50A] # MATHEMATICAL FRAKTUR CAPITAL G; QQK
+1D53E ; [.0EC1.0020.000B.1D53E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G; QQK
+1D572 ; [.0EC1.0020.000B.1D572] # MATHEMATICAL BOLD FRAKTUR CAPITAL G; QQK
+1D5A6 ; [.0EC1.0020.000B.1D5A6] # MATHEMATICAL SANS-SERIF CAPITAL G; QQK
+1D5DA ; [.0EC1.0020.000B.1D5DA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G; QQK
+1D60E ; [.0EC1.0020.000B.1D60E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G; QQK
+1D642 ; [.0EC1.0020.000B.1D642] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G; QQK
+1D676 ; [.0EC1.0020.000B.1D676] # MATHEMATICAL MONOSPACE CAPITAL G; QQK
+24BC ; [.0EC1.0020.000C.24BC] # CIRCLED LATIN CAPITAL LETTER G; QQK
+1D33 ; [.0EC1.0020.0014.1D33] # MODIFIER LETTER CAPITAL G; QQK
+1D4D ; [.0EC1.0020.0014.1D4D] # MODIFIER LETTER SMALL G; QQK
+01F5 ; [.0EC1.0020.0002.0067][.0000.0032.0002.0301] # LATIN SMALL LETTER G WITH ACUTE; QQCM
+01F4 ; [.0EC1.0020.0008.0047][.0000.0032.0002.0301] # LATIN CAPITAL LETTER G WITH ACUTE; QQCM
+011F ; [.0EC1.0020.0002.0067][.0000.0037.0002.0306] # LATIN SMALL LETTER G WITH BREVE; QQCM
+011E ; [.0EC1.0020.0008.0047][.0000.0037.0002.0306] # LATIN CAPITAL LETTER G WITH BREVE; QQCM
+011D ; [.0EC1.0020.0002.0067][.0000.003C.0002.0302] # LATIN SMALL LETTER G WITH CIRCUMFLEX; QQCM
+011C ; [.0EC1.0020.0008.0047][.0000.003C.0002.0302] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX; QQCM
+01E7 ; [.0EC1.0020.0002.0067][.0000.0041.0002.030C] # LATIN SMALL LETTER G WITH CARON; QQCM
+01E6 ; [.0EC1.0020.0008.0047][.0000.0041.0002.030C] # LATIN CAPITAL LETTER G WITH CARON; QQCM
+0121 ; [.0EC1.0020.0002.0067][.0000.0052.0002.0307] # LATIN SMALL LETTER G WITH DOT ABOVE; QQCM
+0120 ; [.0EC1.0020.0008.0047][.0000.0052.0002.0307] # LATIN CAPITAL LETTER G WITH DOT ABOVE; QQCM
+0123 ; [.0EC1.0020.0002.0067][.0000.0055.0002.0327] # LATIN SMALL LETTER G WITH CEDILLA; QQCM
+0122 ; [.0EC1.0020.0008.0047][.0000.0055.0002.0327] # LATIN CAPITAL LETTER G WITH CEDILLA; QQCM
+1E21 ; [.0EC1.0020.0002.0067][.0000.005A.0002.0304] # LATIN SMALL LETTER G WITH MACRON; QQCM
+1E20 ; [.0EC1.0020.0008.0047][.0000.005A.0002.0304] # LATIN CAPITAL LETTER G WITH MACRON; QQCM
+33FF ; [.0EC1.0020.001C.33FF][.0E33.0020.001C.33FF][.0F2E.0020.001F.33FF] # SQUARE GAL; QQKN
+3387 ; [.0EC1.0020.001D.3387][.0E4A.0020.001D.3387] # SQUARE GB; QQKN
+3393 ; [.0EC1.0020.001D.3393][.0EE1.0020.001D.3393][.106A.0020.001F.3393] # SQUARE GHZ; QQKN
+33AC ; [.0EC1.0020.001D.33AC][.0FA7.0020.001D.33AC][.0E33.0020.001F.33AC] # SQUARE GPA; QQKN
+33C9 ; [.0EC1.0020.001D.33C9][.105E.0020.001C.33C9] # SQUARE GY; QQKN
+0261 ; [.0EC5.0020.0002.0261] # LATIN SMALL LETTER SCRIPT G
+0262 ; [.0EC9.0020.0002.0262] # LATIN LETTER SMALL CAPITAL G
+01E5 ; [.0ECD.0020.0002.01E5] # LATIN SMALL LETTER G WITH STROKE
+01E4 ; [.0ECD.0020.0008.01E4] # LATIN CAPITAL LETTER G WITH STROKE
+0260 ; [.0ED1.0020.0002.0260] # LATIN SMALL LETTER G WITH HOOK
+0193 ; [.0ED1.0020.0008.0193] # LATIN CAPITAL LETTER G WITH HOOK
+029B ; [.0ED5.0020.0002.029B] # LATIN LETTER SMALL CAPITAL G WITH HOOK
+0263 ; [.0ED9.0020.0002.0263] # LATIN SMALL LETTER GAMMA
+0194 ; [.0ED9.0020.0008.0194] # LATIN CAPITAL LETTER GAMMA
+02E0 ; [.0ED9.0020.0014.02E0] # MODIFIER LETTER SMALL GAMMA; QQK
+01A3 ; [.0EDD.0020.0002.01A3] # LATIN SMALL LETTER OI
+01A2 ; [.0EDD.0020.0008.01A2] # LATIN CAPITAL LETTER OI
+0068 ; [.0EE1.0020.0002.0068] # LATIN SMALL LETTER H
+FF48 ; [.0EE1.0020.0003.FF48] # FULLWIDTH LATIN SMALL LETTER H; QQK
+036A ; [.0EE1.0020.0004.036A] # COMBINING LATIN SMALL LETTER H; QQK
+24A3 ; [*0288.0020.0004.24A3][.0EE1.0020.0004.24A3][*0289.0020.001F.24A3] # PARENTHESIZED LATIN SMALL LETTER H; QQKN
+210E ; [.0EE1.0020.0005.210E] # PLANCK CONSTANT; QQK
+1D421 ; [.0EE1.0020.0005.1D421] # MATHEMATICAL BOLD SMALL H; QQK
+1D489 ; [.0EE1.0020.0005.1D489] # MATHEMATICAL BOLD ITALIC SMALL H; QQK
+1D4BD ; [.0EE1.0020.0005.1D4BD] # MATHEMATICAL SCRIPT SMALL H; QQK
+1D4F1 ; [.0EE1.0020.0005.1D4F1] # MATHEMATICAL BOLD SCRIPT SMALL H; QQK
+1D525 ; [.0EE1.0020.0005.1D525] # MATHEMATICAL FRAKTUR SMALL H; QQK
+1D559 ; [.0EE1.0020.0005.1D559] # MATHEMATICAL DOUBLE-STRUCK SMALL H; QQK
+1D58D ; [.0EE1.0020.0005.1D58D] # MATHEMATICAL BOLD FRAKTUR SMALL H; QQK
+1D5C1 ; [.0EE1.0020.0005.1D5C1] # MATHEMATICAL SANS-SERIF SMALL H; QQK
+1D5F5 ; [.0EE1.0020.0005.1D5F5] # MATHEMATICAL SANS-SERIF BOLD SMALL H; QQK
+1D629 ; [.0EE1.0020.0005.1D629] # MATHEMATICAL SANS-SERIF ITALIC SMALL H; QQK
+1D65D ; [.0EE1.0020.0005.1D65D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H; QQK
+1D691 ; [.0EE1.0020.0005.1D691] # MATHEMATICAL MONOSPACE SMALL H; QQK
+24D7 ; [.0EE1.0020.0006.24D7] # CIRCLED LATIN SMALL LETTER H; QQK
+0048 ; [.0EE1.0020.0008.0048] # LATIN CAPITAL LETTER H
+FF28 ; [.0EE1.0020.0009.FF28] # FULLWIDTH LATIN CAPITAL LETTER H; QQK
+210B ; [.0EE1.0020.000B.210B] # SCRIPT CAPITAL H; QQK
+210C ; [.0EE1.0020.000B.210C] # BLACK-LETTER CAPITAL H; QQK
+210D ; [.0EE1.0020.000B.210D] # DOUBLE-STRUCK CAPITAL H; QQK
+1D407 ; [.0EE1.0020.000B.1D407] # MATHEMATICAL BOLD CAPITAL H; QQK
+1D43B ; [.0EE1.0020.000B.1D43B] # MATHEMATICAL ITALIC CAPITAL H; QQK
+1D46F ; [.0EE1.0020.000B.1D46F] # MATHEMATICAL BOLD ITALIC CAPITAL H; QQK
+1D4D7 ; [.0EE1.0020.000B.1D4D7] # MATHEMATICAL BOLD SCRIPT CAPITAL H; QQK
+1D573 ; [.0EE1.0020.000B.1D573] # MATHEMATICAL BOLD FRAKTUR CAPITAL H; QQK
+1D5A7 ; [.0EE1.0020.000B.1D5A7] # MATHEMATICAL SANS-SERIF CAPITAL H; QQK
+1D5DB ; [.0EE1.0020.000B.1D5DB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H; QQK
+1D60F ; [.0EE1.0020.000B.1D60F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H; QQK
+1D643 ; [.0EE1.0020.000B.1D643] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H; QQK
+1D677 ; [.0EE1.0020.000B.1D677] # MATHEMATICAL MONOSPACE CAPITAL H; QQK
+24BD ; [.0EE1.0020.000C.24BD] # CIRCLED LATIN CAPITAL LETTER H; QQK
+02B0 ; [.0EE1.0020.0014.02B0] # MODIFIER LETTER SMALL H; QQK
+1D34 ; [.0EE1.0020.0014.1D34] # MODIFIER LETTER CAPITAL H; QQK
+0125 ; [.0EE1.0020.0002.0068][.0000.003C.0002.0302] # LATIN SMALL LETTER H WITH CIRCUMFLEX; QQCM
+0124 ; [.0EE1.0020.0008.0048][.0000.003C.0002.0302] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX; QQCM
+021F ; [.0EE1.0020.0002.0068][.0000.0041.0002.030C] # LATIN SMALL LETTER H WITH CARON; QQCM
+021E ; [.0EE1.0020.0008.0048][.0000.0041.0002.030C] # LATIN CAPITAL LETTER H WITH CARON; QQCM
+1E27 ; [.0EE1.0020.0002.0068][.0000.0047.0002.0308] # LATIN SMALL LETTER H WITH DIAERESIS; QQCM
+1E26 ; [.0EE1.0020.0008.0048][.0000.0047.0002.0308] # LATIN CAPITAL LETTER H WITH DIAERESIS; QQCM
+1E23 ; [.0EE1.0020.0002.0068][.0000.0052.0002.0307] # LATIN SMALL LETTER H WITH DOT ABOVE; QQCM
+1E22 ; [.0EE1.0020.0008.0048][.0000.0052.0002.0307] # LATIN CAPITAL LETTER H WITH DOT ABOVE; QQCM
+1E29 ; [.0EE1.0020.0002.0068][.0000.0055.0002.0327] # LATIN SMALL LETTER H WITH CEDILLA; QQCM
+1E28 ; [.0EE1.0020.0008.0048][.0000.0055.0002.0327] # LATIN CAPITAL LETTER H WITH CEDILLA; QQCM
+1E25 ; [.0EE1.0020.0002.0068][.0000.0079.0002.0323] # LATIN SMALL LETTER H WITH DOT BELOW; QQCM
+1E24 ; [.0EE1.0020.0008.0048][.0000.0079.0002.0323] # LATIN CAPITAL LETTER H WITH DOT BELOW; QQCM
+1E2B ; [.0EE1.0020.0002.0068][.0000.0086.0002.032E] # LATIN SMALL LETTER H WITH BREVE BELOW; QQCM
+1E2A ; [.0EE1.0020.0008.0048][.0000.0086.0002.032E] # LATIN CAPITAL LETTER H WITH BREVE BELOW; QQCM
+1E96 ; [.0EE1.0020.0002.0068][.0000.0089.0002.0331] # LATIN SMALL LETTER H WITH LINE BELOW; QQCM
+33CA ; [.0EE1.0020.001C.33CA][.0E33.0020.001C.33CA] # SQUARE HA; QQKN
+32CC ; [.0EE1.0020.001D.32CC][.0EC1.0020.001C.32CC] # SQUARE HG; QQKN
+33CB ; [.0EE1.0020.001D.33CB][.0FA7.0020.001D.33CB] # SQUARE HP; QQKN
+3371 ; [.0EE1.0020.001C.3371][.0FA7.0020.001D.3371][.0E33.0020.001F.3371] # SQUARE HPA; QQKN
+3390 ; [.0EE1.0020.001D.3390][.106A.0020.001C.3390] # SQUARE HZ; QQKN
+029C ; [.0EE5.0020.0002.029C] # LATIN LETTER SMALL CAPITAL H
+0195 ; [.0EE9.0020.0002.0195] # LATIN SMALL LETTER HV
+01F6 ; [.0EE9.0020.0008.01F6] # LATIN CAPITAL LETTER HWAIR
+0127 ; [.0EED.0020.0002.0127] # LATIN SMALL LETTER H WITH STROKE
+210F ; [.0EED.0020.0005.210F] # PLANCK CONSTANT OVER TWO PI; QQK
+0126 ; [.0EED.0020.0008.0126] # LATIN CAPITAL LETTER H WITH STROKE
+0266 ; [.0EF1.0020.0002.0266] # LATIN SMALL LETTER H WITH HOOK
+02B1 ; [.0EF1.0020.0014.02B1] # MODIFIER LETTER SMALL H WITH HOOK; QQK
+0267 ; [.0EF5.0020.0002.0267] # LATIN SMALL LETTER HENG WITH HOOK
+02BB ; [.0EF9.0020.0002.02BB] # MODIFIER LETTER TURNED COMMA
+02BD ; [.0EFA.0020.0002.02BD] # MODIFIER LETTER REVERSED COMMA
+0069 ; [.0EFB.0020.0002.0069] # LATIN SMALL LETTER I
+FF49 ; [.0EFB.0020.0003.FF49] # FULLWIDTH LATIN SMALL LETTER I; QQK
+0365 ; [.0EFB.0020.0004.0365] # COMBINING LATIN SMALL LETTER I; QQK
+2170 ; [.0EFB.0020.0004.2170] # SMALL ROMAN NUMERAL ONE; QQK
+24A4 ; [*0288.0020.0004.24A4][.0EFB.0020.0004.24A4][*0289.0020.001F.24A4] # PARENTHESIZED LATIN SMALL LETTER I; QQKN
+2139 ; [.0EFB.0020.0005.2139] # INFORMATION SOURCE; QQK
+2148 ; [.0EFB.0020.0005.2148] # DOUBLE-STRUCK ITALIC SMALL I; QQK
+1D422 ; [.0EFB.0020.0005.1D422] # MATHEMATICAL BOLD SMALL I; QQK
+1D456 ; [.0EFB.0020.0005.1D456] # MATHEMATICAL ITALIC SMALL I; QQK
+1D48A ; [.0EFB.0020.0005.1D48A] # MATHEMATICAL BOLD ITALIC SMALL I; QQK
+1D4BE ; [.0EFB.0020.0005.1D4BE] # MATHEMATICAL SCRIPT SMALL I; QQK
+1D4F2 ; [.0EFB.0020.0005.1D4F2] # MATHEMATICAL BOLD SCRIPT SMALL I; QQK
+1D526 ; [.0EFB.0020.0005.1D526] # MATHEMATICAL FRAKTUR SMALL I; QQK
+1D55A ; [.0EFB.0020.0005.1D55A] # MATHEMATICAL DOUBLE-STRUCK SMALL I; QQK
+1D58E ; [.0EFB.0020.0005.1D58E] # MATHEMATICAL BOLD FRAKTUR SMALL I; QQK
+1D5C2 ; [.0EFB.0020.0005.1D5C2] # MATHEMATICAL SANS-SERIF SMALL I; QQK
+1D5F6 ; [.0EFB.0020.0005.1D5F6] # MATHEMATICAL SANS-SERIF BOLD SMALL I; QQK
+1D62A ; [.0EFB.0020.0005.1D62A] # MATHEMATICAL SANS-SERIF ITALIC SMALL I; QQK
+1D65E ; [.0EFB.0020.0005.1D65E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I; QQK
+1D692 ; [.0EFB.0020.0005.1D692] # MATHEMATICAL MONOSPACE SMALL I; QQK
+24D8 ; [.0EFB.0020.0006.24D8] # CIRCLED LATIN SMALL LETTER I; QQK
+0049 ; [.0EFB.0020.0008.0049] # LATIN CAPITAL LETTER I
+FF29 ; [.0EFB.0020.0009.FF29] # FULLWIDTH LATIN CAPITAL LETTER I; QQK
+2160 ; [.0EFB.0020.000A.2160] # ROMAN NUMERAL ONE; QQK
+2110 ; [.0EFB.0020.000B.2110] # SCRIPT CAPITAL I; QQK
+2111 ; [.0EFB.0020.000B.2111] # BLACK-LETTER CAPITAL I; QQK
+1D408 ; [.0EFB.0020.000B.1D408] # MATHEMATICAL BOLD CAPITAL I; QQK
+1D43C ; [.0EFB.0020.000B.1D43C] # MATHEMATICAL ITALIC CAPITAL I; QQK
+1D470 ; [.0EFB.0020.000B.1D470] # MATHEMATICAL BOLD ITALIC CAPITAL I; QQK
+1D4D8 ; [.0EFB.0020.000B.1D4D8] # MATHEMATICAL BOLD SCRIPT CAPITAL I; QQK
+1D540 ; [.0EFB.0020.000B.1D540] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I; QQK
+1D574 ; [.0EFB.0020.000B.1D574] # MATHEMATICAL BOLD FRAKTUR CAPITAL I; QQK
+1D5A8 ; [.0EFB.0020.000B.1D5A8] # MATHEMATICAL SANS-SERIF CAPITAL I; QQK
+1D5DC ; [.0EFB.0020.000B.1D5DC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I; QQK
+1D610 ; [.0EFB.0020.000B.1D610] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I; QQK
+1D644 ; [.0EFB.0020.000B.1D644] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I; QQK
+1D678 ; [.0EFB.0020.000B.1D678] # MATHEMATICAL MONOSPACE CAPITAL I; QQK
+24BE ; [.0EFB.0020.000C.24BE] # CIRCLED LATIN CAPITAL LETTER I; QQK
+1D35 ; [.0EFB.0020.0014.1D35] # MODIFIER LETTER CAPITAL I; QQK
+2071 ; [.0EFB.0020.0014.2071] # SUPERSCRIPT LATIN SMALL LETTER I; QQK
+1D62 ; [.0EFB.0020.0015.1D62] # LATIN SUBSCRIPT SMALL LETTER I; QQK
+00ED ; [.0EFB.0020.0002.0069][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH ACUTE; QQCM
+00CD ; [.0EFB.0020.0008.0049][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH ACUTE; QQCM
+00EC ; [.0EFB.0020.0002.0069][.0000.0035.0002.0300] # LATIN SMALL LETTER I WITH GRAVE; QQCM
+00CC ; [.0EFB.0020.0008.0049][.0000.0035.0002.0300] # LATIN CAPITAL LETTER I WITH GRAVE; QQCM
+012D ; [.0EFB.0020.0002.0069][.0000.0037.0002.0306] # LATIN SMALL LETTER I WITH BREVE; QQCM
+012C ; [.0EFB.0020.0008.0049][.0000.0037.0002.0306] # LATIN CAPITAL LETTER I WITH BREVE; QQCM
+00EE ; [.0EFB.0020.0002.0069][.0000.003C.0002.0302] # LATIN SMALL LETTER I WITH CIRCUMFLEX; QQCM
+00CE ; [.0EFB.0020.0008.0049][.0000.003C.0002.0302] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX; QQCM
+01D0 ; [.0EFB.0020.0002.0069][.0000.0041.0002.030C] # LATIN SMALL LETTER I WITH CARON; QQCM
+01CF ; [.0EFB.0020.0008.0049][.0000.0041.0002.030C] # LATIN CAPITAL LETTER I WITH CARON; QQCM
+00EF ; [.0EFB.0020.0002.0069][.0000.0047.0002.0308] # LATIN SMALL LETTER I WITH DIAERESIS; QQCM
+00CF ; [.0EFB.0020.0008.0049][.0000.0047.0002.0308] # LATIN CAPITAL LETTER I WITH DIAERESIS; QQCM
+1E2F ; [.0EFB.0020.0002.0069][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE; QQCM
+1E2E ; [.0EFB.0020.0008.0049][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE; QQCM
+0129 ; [.0EFB.0020.0002.0069][.0000.004E.0002.0303] # LATIN SMALL LETTER I WITH TILDE; QQCM
+0128 ; [.0EFB.0020.0008.0049][.0000.004E.0002.0303] # LATIN CAPITAL LETTER I WITH TILDE; QQCM
+0130 ; [.0EFB.0020.0008.0049][.0000.0052.0002.0307] # LATIN CAPITAL LETTER I WITH DOT ABOVE; QQCM
+012F ; [.0EFB.0020.0002.0069][.0000.0058.0002.0328] # LATIN SMALL LETTER I WITH OGONEK; QQCM
+012E ; [.0EFB.0020.0008.0049][.0000.0058.0002.0328] # LATIN CAPITAL LETTER I WITH OGONEK; QQCM
+012B ; [.0EFB.0020.0002.0069][.0000.005A.0002.0304] # LATIN SMALL LETTER I WITH MACRON; QQCM
+012A ; [.0EFB.0020.0008.0049][.0000.005A.0002.0304] # LATIN CAPITAL LETTER I WITH MACRON; QQCM
+1EC9 ; [.0EFB.0020.0002.0069][.0000.005F.0002.0309] # LATIN SMALL LETTER I WITH HOOK ABOVE; QQCM
+1EC8 ; [.0EFB.0020.0008.0049][.0000.005F.0002.0309] # LATIN CAPITAL LETTER I WITH HOOK ABOVE; QQCM
+0209 ; [.0EFB.0020.0002.0069][.0000.0062.0002.030F] # LATIN SMALL LETTER I WITH DOUBLE GRAVE; QQCM
+0208 ; [.0EFB.0020.0008.0049][.0000.0062.0002.030F] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE; QQCM
+020B ; [.0EFB.0020.0002.0069][.0000.0064.0002.0311] # LATIN SMALL LETTER I WITH INVERTED BREVE; QQCM
+020A ; [.0EFB.0020.0008.0049][.0000.0064.0002.0311] # LATIN CAPITAL LETTER I WITH INVERTED BREVE; QQCM
+1ECB ; [.0EFB.0020.0002.0069][.0000.0079.0002.0323] # LATIN SMALL LETTER I WITH DOT BELOW; QQCM
+1ECA ; [.0EFB.0020.0008.0049][.0000.0079.0002.0323] # LATIN CAPITAL LETTER I WITH DOT BELOW; QQCM
+1E2D ; [.0EFB.0020.0002.0069][.0000.0088.0002.0330] # LATIN SMALL LETTER I WITH TILDE BELOW; QQCM
+1E2C ; [.0EFB.0020.0008.0049][.0000.0088.0002.0330] # LATIN CAPITAL LETTER I WITH TILDE BELOW; QQCM
+2171 ; [.0EFB.0020.0004.2171][.0EFB.0020.0004.2171] # SMALL ROMAN NUMERAL TWO; QQKN
+2161 ; [.0EFB.0020.000A.2161][.0EFB.0020.000A.2161] # ROMAN NUMERAL TWO; QQKN
+2172 ; [.0EFB.0020.0004.2172][.0EFB.0020.0004.2172][.0EFB.0020.001F.2172] # SMALL ROMAN NUMERAL THREE; QQKN
+2162 ; [.0EFB.0020.000A.2162][.0EFB.0020.000A.2162][.0EFB.0020.001F.2162] # ROMAN NUMERAL THREE; QQKN
+0133 ; [.0EFB.0020.0004.0133][.0F10.0020.0004.0133] # LATIN SMALL LIGATURE IJ; QQKN
+0132 ; [.0EFB.0020.000A.0132][.0F10.0020.000A.0132] # LATIN CAPITAL LIGATURE IJ; QQKN
+33CC ; [.0EFB.0020.001C.33CC][.0F64.0020.001C.33CC] # SQUARE IN; QQKN
+337A ; [.0EFB.0020.001D.337A][.101F.0020.001D.337A] # SQUARE IU; QQKN
+2173 ; [.0EFB.0020.0004.2173][.1044.0020.0004.2173] # SMALL ROMAN NUMERAL FOUR; QQKN
+2163 ; [.0EFB.0020.000A.2163][.1044.0020.000A.2163] # ROMAN NUMERAL FOUR; QQKN
+2178 ; [.0EFB.0020.0004.2178][.105A.0020.0004.2178] # SMALL ROMAN NUMERAL NINE; QQKN
+2168 ; [.0EFB.0020.000A.2168][.105A.0020.000A.2168] # ROMAN NUMERAL NINE; QQKN
+0131 ; [.0EFF.0020.0002.0131] # LATIN SMALL LETTER DOTLESS I
+026A ; [.0F03.0020.0002.026A] # LATIN LETTER SMALL CAPITAL I
+1D09 ; [.0F07.0020.0002.1D09] # LATIN SMALL LETTER TURNED I
+1D4E ; [.0F07.0020.0014.1D4E] # MODIFIER LETTER SMALL TURNED I; QQK
+0268 ; [.0F08.0020.0002.0268] # LATIN SMALL LETTER I WITH STROKE
+0197 ; [.0F08.0020.0008.0197] # LATIN CAPITAL LETTER I WITH STROKE
+0269 ; [.0F0C.0020.0002.0269] # LATIN SMALL LETTER IOTA
+0196 ; [.0F0C.0020.0008.0196] # LATIN CAPITAL LETTER IOTA
+006A ; [.0F10.0020.0002.006A] # LATIN SMALL LETTER J
+FF4A ; [.0F10.0020.0003.FF4A] # FULLWIDTH LATIN SMALL LETTER J; QQK
+24A5 ; [*0288.0020.0004.24A5][.0F10.0020.0004.24A5][*0289.0020.001F.24A5] # PARENTHESIZED LATIN SMALL LETTER J; QQKN
+2149 ; [.0F10.0020.0005.2149] # DOUBLE-STRUCK ITALIC SMALL J; QQK
+1D423 ; [.0F10.0020.0005.1D423] # MATHEMATICAL BOLD SMALL J; QQK
+1D457 ; [.0F10.0020.0005.1D457] # MATHEMATICAL ITALIC SMALL J; QQK
+1D48B ; [.0F10.0020.0005.1D48B] # MATHEMATICAL BOLD ITALIC SMALL J; QQK
+1D4BF ; [.0F10.0020.0005.1D4BF] # MATHEMATICAL SCRIPT SMALL J; QQK
+1D4F3 ; [.0F10.0020.0005.1D4F3] # MATHEMATICAL BOLD SCRIPT SMALL J; QQK
+1D527 ; [.0F10.0020.0005.1D527] # MATHEMATICAL FRAKTUR SMALL J; QQK
+1D55B ; [.0F10.0020.0005.1D55B] # MATHEMATICAL DOUBLE-STRUCK SMALL J; QQK
+1D58F ; [.0F10.0020.0005.1D58F] # MATHEMATICAL BOLD FRAKTUR SMALL J; QQK
+1D5C3 ; [.0F10.0020.0005.1D5C3] # MATHEMATICAL SANS-SERIF SMALL J; QQK
+1D5F7 ; [.0F10.0020.0005.1D5F7] # MATHEMATICAL SANS-SERIF BOLD SMALL J; QQK
+1D62B ; [.0F10.0020.0005.1D62B] # MATHEMATICAL SANS-SERIF ITALIC SMALL J; QQK
+1D65F ; [.0F10.0020.0005.1D65F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J; QQK
+1D693 ; [.0F10.0020.0005.1D693] # MATHEMATICAL MONOSPACE SMALL J; QQK
+24D9 ; [.0F10.0020.0006.24D9] # CIRCLED LATIN SMALL LETTER J; QQK
+004A ; [.0F10.0020.0008.004A] # LATIN CAPITAL LETTER J
+FF2A ; [.0F10.0020.0009.FF2A] # FULLWIDTH LATIN CAPITAL LETTER J; QQK
+1D409 ; [.0F10.0020.000B.1D409] # MATHEMATICAL BOLD CAPITAL J; QQK
+1D43D ; [.0F10.0020.000B.1D43D] # MATHEMATICAL ITALIC CAPITAL J; QQK
+1D471 ; [.0F10.0020.000B.1D471] # MATHEMATICAL BOLD ITALIC CAPITAL J; QQK
+1D4A5 ; [.0F10.0020.000B.1D4A5] # MATHEMATICAL SCRIPT CAPITAL J; QQK
+1D4D9 ; [.0F10.0020.000B.1D4D9] # MATHEMATICAL BOLD SCRIPT CAPITAL J; QQK
+1D50D ; [.0F10.0020.000B.1D50D] # MATHEMATICAL FRAKTUR CAPITAL J; QQK
+1D541 ; [.0F10.0020.000B.1D541] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J; QQK
+1D575 ; [.0F10.0020.000B.1D575] # MATHEMATICAL BOLD FRAKTUR CAPITAL J; QQK
+1D5A9 ; [.0F10.0020.000B.1D5A9] # MATHEMATICAL SANS-SERIF CAPITAL J; QQK
+1D5DD ; [.0F10.0020.000B.1D5DD] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J; QQK
+1D611 ; [.0F10.0020.000B.1D611] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J; QQK
+1D645 ; [.0F10.0020.000B.1D645] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J; QQK
+1D679 ; [.0F10.0020.000B.1D679] # MATHEMATICAL MONOSPACE CAPITAL J; QQK
+24BF ; [.0F10.0020.000C.24BF] # CIRCLED LATIN CAPITAL LETTER J; QQK
+02B2 ; [.0F10.0020.0014.02B2] # MODIFIER LETTER SMALL J; QQK
+1D36 ; [.0F10.0020.0014.1D36] # MODIFIER LETTER CAPITAL J; QQK
+0135 ; [.0F10.0020.0002.006A][.0000.003C.0002.0302] # LATIN SMALL LETTER J WITH CIRCUMFLEX; QQCM
+0134 ; [.0F10.0020.0008.004A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX; QQCM
+01F0 ; [.0F10.0020.0002.006A][.0000.0041.0002.030C] # LATIN SMALL LETTER J WITH CARON; QQCM
+1D0A ; [.0F14.0020.0002.1D0A] # LATIN LETTER SMALL CAPITAL J
+029D ; [.0F15.0020.0002.029D] # LATIN SMALL LETTER J WITH CROSSED-TAIL
+025F ; [.0F19.0020.0002.025F] # LATIN SMALL LETTER DOTLESS J WITH STROKE
+0284 ; [.0F1D.0020.0002.0284] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+006B ; [.0F21.0020.0002.006B] # LATIN SMALL LETTER K
+FF4B ; [.0F21.0020.0003.FF4B] # FULLWIDTH LATIN SMALL LETTER K; QQK
+24A6 ; [*0288.0020.0004.24A6][.0F21.0020.0004.24A6][*0289.0020.001F.24A6] # PARENTHESIZED LATIN SMALL LETTER K; QQKN
+1D424 ; [.0F21.0020.0005.1D424] # MATHEMATICAL BOLD SMALL K; QQK
+1D458 ; [.0F21.0020.0005.1D458] # MATHEMATICAL ITALIC SMALL K; QQK
+1D48C ; [.0F21.0020.0005.1D48C] # MATHEMATICAL BOLD ITALIC SMALL K; QQK
+1D4C0 ; [.0F21.0020.0005.1D4C0] # MATHEMATICAL SCRIPT SMALL K; QQK
+1D4F4 ; [.0F21.0020.0005.1D4F4] # MATHEMATICAL BOLD SCRIPT SMALL K; QQK
+1D528 ; [.0F21.0020.0005.1D528] # MATHEMATICAL FRAKTUR SMALL K; QQK
+1D55C ; [.0F21.0020.0005.1D55C] # MATHEMATICAL DOUBLE-STRUCK SMALL K; QQK
+1D590 ; [.0F21.0020.0005.1D590] # MATHEMATICAL BOLD FRAKTUR SMALL K; QQK
+1D5C4 ; [.0F21.0020.0005.1D5C4] # MATHEMATICAL SANS-SERIF SMALL K; QQK
+1D5F8 ; [.0F21.0020.0005.1D5F8] # MATHEMATICAL SANS-SERIF BOLD SMALL K; QQK
+1D62C ; [.0F21.0020.0005.1D62C] # MATHEMATICAL SANS-SERIF ITALIC SMALL K; QQK
+1D660 ; [.0F21.0020.0005.1D660] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K; QQK
+1D694 ; [.0F21.0020.0005.1D694] # MATHEMATICAL MONOSPACE SMALL K; QQK
+24DA ; [.0F21.0020.0006.24DA] # CIRCLED LATIN SMALL LETTER K; QQK
+004B ; [.0F21.0020.0008.004B] # LATIN CAPITAL LETTER K
+212A ; [.0F21.0020.0008.212A] # KELVIN SIGN; QQC
+FF2B ; [.0F21.0020.0009.FF2B] # FULLWIDTH LATIN CAPITAL LETTER K; QQK
+1D40A ; [.0F21.0020.000B.1D40A] # MATHEMATICAL BOLD CAPITAL K; QQK
+1D43E ; [.0F21.0020.000B.1D43E] # MATHEMATICAL ITALIC CAPITAL K; QQK
+1D472 ; [.0F21.0020.000B.1D472] # MATHEMATICAL BOLD ITALIC CAPITAL K; QQK
+1D4A6 ; [.0F21.0020.000B.1D4A6] # MATHEMATICAL SCRIPT CAPITAL K; QQK
+1D4DA ; [.0F21.0020.000B.1D4DA] # MATHEMATICAL BOLD SCRIPT CAPITAL K; QQK
+1D50E ; [.0F21.0020.000B.1D50E] # MATHEMATICAL FRAKTUR CAPITAL K; QQK
+1D542 ; [.0F21.0020.000B.1D542] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K; QQK
+1D576 ; [.0F21.0020.000B.1D576] # MATHEMATICAL BOLD FRAKTUR CAPITAL K; QQK
+1D5AA ; [.0F21.0020.000B.1D5AA] # MATHEMATICAL SANS-SERIF CAPITAL K; QQK
+1D5DE ; [.0F21.0020.000B.1D5DE] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K; QQK
+1D612 ; [.0F21.0020.000B.1D612] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K; QQK
+1D646 ; [.0F21.0020.000B.1D646] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K; QQK
+1D67A ; [.0F21.0020.000B.1D67A] # MATHEMATICAL MONOSPACE CAPITAL K; QQK
+24C0 ; [.0F21.0020.000C.24C0] # CIRCLED LATIN CAPITAL LETTER K; QQK
+1D37 ; [.0F21.0020.0014.1D37] # MODIFIER LETTER CAPITAL K; QQK
+1D4F ; [.0F21.0020.0014.1D4F] # MODIFIER LETTER SMALL K; QQK
+1E31 ; [.0F21.0020.0002.006B][.0000.0032.0002.0301] # LATIN SMALL LETTER K WITH ACUTE; QQCM
+1E30 ; [.0F21.0020.0008.004B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER K WITH ACUTE; QQCM
+01E9 ; [.0F21.0020.0002.006B][.0000.0041.0002.030C] # LATIN SMALL LETTER K WITH CARON; QQCM
+01E8 ; [.0F21.0020.0008.004B][.0000.0041.0002.030C] # LATIN CAPITAL LETTER K WITH CARON; QQCM
+0137 ; [.0F21.0020.0002.006B][.0000.0055.0002.0327] # LATIN SMALL LETTER K WITH CEDILLA; QQCM
+0136 ; [.0F21.0020.0008.004B][.0000.0055.0002.0327] # LATIN CAPITAL LETTER K WITH CEDILLA; QQCM
+1E33 ; [.0F21.0020.0002.006B][.0000.0079.0002.0323] # LATIN SMALL LETTER K WITH DOT BELOW; QQCM
+1E32 ; [.0F21.0020.0008.004B][.0000.0079.0002.0323] # LATIN CAPITAL LETTER K WITH DOT BELOW; QQCM
+1E35 ; [.0F21.0020.0002.006B][.0000.0089.0002.0331] # LATIN SMALL LETTER K WITH LINE BELOW; QQCM
+1E34 ; [.0F21.0020.0008.004B][.0000.0089.0002.0331] # LATIN CAPITAL LETTER K WITH LINE BELOW; QQCM
+3384 ; [.0F21.0020.001C.3384][.0E33.0020.001D.3384] # SQUARE KA; QQKN
+3385 ; [.0F21.0020.001D.3385][.0E4A.0020.001D.3385] # SQUARE KB; QQKN
+3389 ; [.0F21.0020.001C.3389][.0E60.0020.001C.3389][.0E33.0020.001F.3389][.0F2E.0020.001F.3389] # SQUARE KCAL; QQKN
+338F ; [.0F21.0020.001C.338F][.0EC1.0020.001C.338F] # SQUARE KG; QQKN
+3391 ; [.0F21.0020.001C.3391][.0EE1.0020.001D.3391][.106A.0020.001F.3391] # SQUARE KHZ; QQKN
+33CD ; [.0F21.0020.001D.33CD][.0F21.0020.001D.33CD] # SQUARE KK; QQKN
+3398 ; [.0F21.0020.001C.3398][.0F2E.0020.001C.3398] # SQUARE KL; QQKN
+339E ; [.0F21.0020.001C.339E][.0F5B.0020.001C.339E] # SQUARE KM; QQKN
+33CE ; [.0F21.0020.001D.33CE][.0F5B.0020.001D.33CE] # SQUARE KM CAPITAL; QQKN
+33A2 ; [.0F21.0020.001C.33A2][.0F5B.0020.001C.33A2][.0E2B.0020.001F.33A2] # SQUARE KM SQUARED; QQKN
+33A6 ; [.0F21.0020.001C.33A6][.0F5B.0020.001C.33A6][.0E2C.0020.001F.33A6] # SQUARE KM CUBED; QQKN
+33AA ; [.0F21.0020.001C.33AA][.0FA7.0020.001D.33AA][.0E33.0020.001F.33AA] # SQUARE KPA; QQKN
+33CF ; [.0F21.0020.001C.33CF][.1002.0020.001C.33CF] # SQUARE KT; QQKN
+33B8 ; [.0F21.0020.001C.33B8][.1044.0020.001D.33B8] # SQUARE KV; QQKN
+33BE ; [.0F21.0020.001C.33BE][.1051.0020.001D.33BE] # SQUARE KW; QQKN
+33C0 ; [.0F21.0020.001C.33C0][.1109.0020.001D.33C0] # SQUARE K OHM; QQKN
+1D0B ; [.0F25.0020.0002.1D0B] # LATIN LETTER SMALL CAPITAL K
+0199 ; [.0F26.0020.0002.0199] # LATIN SMALL LETTER K WITH HOOK
+0198 ; [.0F26.0020.0008.0198] # LATIN CAPITAL LETTER K WITH HOOK
+029E ; [.0F2A.0020.0002.029E] # LATIN SMALL LETTER TURNED K
+006C ; [.0F2E.0020.0002.006C] # LATIN SMALL LETTER L
+FF4C ; [.0F2E.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK
+0140 ; [.0F2E.0020.0004.0140][*0267.0020.0004.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT; QQKN
+217C ; [.0F2E.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK
+24A7 ; [*0288.0020.0004.24A7][.0F2E.0020.0004.24A7][*0289.0020.001F.24A7] # PARENTHESIZED LATIN SMALL LETTER L; QQKN
+2113 ; [.0F2E.0020.0005.2113] # SCRIPT SMALL L; QQK
+1D425 ; [.0F2E.0020.0005.1D425] # MATHEMATICAL BOLD SMALL L; QQK
+1D459 ; [.0F2E.0020.0005.1D459] # MATHEMATICAL ITALIC SMALL L; QQK
+1D48D ; [.0F2E.0020.0005.1D48D] # MATHEMATICAL BOLD ITALIC SMALL L; QQK
+1D4C1 ; [.0F2E.0020.0005.1D4C1] # MATHEMATICAL SCRIPT SMALL L; QQK
+1D4F5 ; [.0F2E.0020.0005.1D4F5] # MATHEMATICAL BOLD SCRIPT SMALL L; QQK
+1D529 ; [.0F2E.0020.0005.1D529] # MATHEMATICAL FRAKTUR SMALL L; QQK
+1D55D ; [.0F2E.0020.0005.1D55D] # MATHEMATICAL DOUBLE-STRUCK SMALL L; QQK
+1D591 ; [.0F2E.0020.0005.1D591] # MATHEMATICAL BOLD FRAKTUR SMALL L; QQK
+1D5C5 ; [.0F2E.0020.0005.1D5C5] # MATHEMATICAL SANS-SERIF SMALL L; QQK
+1D5F9 ; [.0F2E.0020.0005.1D5F9] # MATHEMATICAL SANS-SERIF BOLD SMALL L; QQK
+1D62D ; [.0F2E.0020.0005.1D62D] # MATHEMATICAL SANS-SERIF ITALIC SMALL L; QQK
+1D661 ; [.0F2E.0020.0005.1D661] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L; QQK
+1D695 ; [.0F2E.0020.0005.1D695] # MATHEMATICAL MONOSPACE SMALL L; QQK
+24DB ; [.0F2E.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK
+004C ; [.0F2E.0020.0008.004C] # LATIN CAPITAL LETTER L
+FF2C ; [.0F2E.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK
+013F ; [.0F2E.0020.000A.013F][*0267.0020.0004.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT; QQKN
+216C ; [.0F2E.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK
+2112 ; [.0F2E.0020.000B.2112] # SCRIPT CAPITAL L; QQK
+1D40B ; [.0F2E.0020.000B.1D40B] # MATHEMATICAL BOLD CAPITAL L; QQK
+1D43F ; [.0F2E.0020.000B.1D43F] # MATHEMATICAL ITALIC CAPITAL L; QQK
+1D473 ; [.0F2E.0020.000B.1D473] # MATHEMATICAL BOLD ITALIC CAPITAL L; QQK
+1D4DB ; [.0F2E.0020.000B.1D4DB] # MATHEMATICAL BOLD SCRIPT CAPITAL L; QQK
+1D50F ; [.0F2E.0020.000B.1D50F] # MATHEMATICAL FRAKTUR CAPITAL L; QQK
+1D543 ; [.0F2E.0020.000B.1D543] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L; QQK
+1D577 ; [.0F2E.0020.000B.1D577] # MATHEMATICAL BOLD FRAKTUR CAPITAL L; QQK
+1D5AB ; [.0F2E.0020.000B.1D5AB] # MATHEMATICAL SANS-SERIF CAPITAL L; QQK
+1D5DF ; [.0F2E.0020.000B.1D5DF] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L; QQK
+1D613 ; [.0F2E.0020.000B.1D613] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L; QQK
+1D647 ; [.0F2E.0020.000B.1D647] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L; QQK
+1D67B ; [.0F2E.0020.000B.1D67B] # MATHEMATICAL MONOSPACE CAPITAL L; QQK
+24C1 ; [.0F2E.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK
+02E1 ; [.0F2E.0020.0014.02E1] # MODIFIER LETTER SMALL L; QQK
+1D38 ; [.0F2E.0020.0014.1D38] # MODIFIER LETTER CAPITAL L; QQK
+013A ; [.0F2E.0020.0002.006C][.0000.0032.0002.0301] # LATIN SMALL LETTER L WITH ACUTE; QQCM
+0139 ; [.0F2E.0020.0008.004C][.0000.0032.0002.0301] # LATIN CAPITAL LETTER L WITH ACUTE; QQCM
+013E ; [.0F2E.0020.0002.006C][.0000.0041.0002.030C] # LATIN SMALL LETTER L WITH CARON; QQCM
+013D ; [.0F2E.0020.0008.004C][.0000.0041.0002.030C] # LATIN CAPITAL LETTER L WITH CARON; QQCM
+013C ; [.0F2E.0020.0002.006C][.0000.0055.0002.0327] # LATIN SMALL LETTER L WITH CEDILLA; QQCM
+013B ; [.0F2E.0020.0008.004C][.0000.0055.0002.0327] # LATIN CAPITAL LETTER L WITH CEDILLA; QQCM
+1E37 ; [.0F2E.0020.0002.006C][.0000.0079.0002.0323] # LATIN SMALL LETTER L WITH DOT BELOW; QQCM
+1E36 ; [.0F2E.0020.0008.004C][.0000.0079.0002.0323] # LATIN CAPITAL LETTER L WITH DOT BELOW; QQCM
+1E39 ; [.0F2E.0020.0002.006C][.0000.0079.0002.0323][.0000.005A.0002.0304] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON; QQCM
+1E38 ; [.0F2E.0020.0008.004C][.0000.0079.0002.0323][.0000.005A.0002.0304] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON; QQCM
+1E3D ; [.0F2E.0020.0002.006C][.0000.0085.0002.032D] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW; QQCM
+1E3C ; [.0F2E.0020.0008.004C][.0000.0085.0002.032D] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW; QQCM
+1E3B ; [.0F2E.0020.0002.006C][.0000.0089.0002.0331] # LATIN SMALL LETTER L WITH LINE BELOW; QQCM
+1E3A ; [.0F2E.0020.0008.004C][.0000.0089.0002.0331] # LATIN CAPITAL LETTER L WITH LINE BELOW; QQCM
+01C9 ; [.0F2E.0020.0004.01C9][.0F10.0020.0004.01C9] # LATIN SMALL LETTER LJ; QQKN
+01C8 ; [.0F2E.0020.000A.01C8][.0F10.0020.0004.01C8] # LATIN CAPITAL LETTER L WITH SMALL LETTER J; QQKN
+01C7 ; [.0F2E.0020.000A.01C7][.0F10.0020.000A.01C7] # LATIN CAPITAL LETTER LJ; QQKN
+33D0 ; [.0F2E.0020.001C.33D0][.0F5B.0020.001C.33D0] # SQUARE LM; QQKN
+33D1 ; [.0F2E.0020.001C.33D1][.0F64.0020.001C.33D1] # SQUARE LN; QQKN
+33D2 ; [.0F2E.0020.001C.33D2][.0F82.0020.001C.33D2][.0EC1.0020.001F.33D2] # SQUARE LOG; QQKN
+02AA ; [.0F2E.0020.0004.02AA][.0FEA.0020.0004.02AA] # LATIN SMALL LETTER LS DIGRAPH; QQKN
+32CF ; [.0F2E.0020.001D.32CF][.1002.0020.001D.32CF][.0E6D.0020.001F.32CF] # LIMITED LIABILITY SIGN; QQKN
+33D3 ; [.0F2E.0020.001C.33D3][.105A.0020.001C.33D3] # SQUARE LX; QQKN
+02AB ; [.0F2E.0020.0004.02AB][.106A.0020.0004.02AB] # LATIN SMALL LETTER LZ DIGRAPH; QQKN
+029F ; [.0F32.0020.0002.029F] # LATIN LETTER SMALL CAPITAL L
+0142 ; [.0F36.0020.0002.0142] # LATIN SMALL LETTER L WITH STROKE
+0141 ; [.0F36.0020.0008.0141] # LATIN CAPITAL LETTER L WITH STROKE
+1D0C ; [.0F3A.0020.0002.1D0C] # LATIN LETTER SMALL CAPITAL L WITH STROKE
+019A ; [.0F3B.0020.0002.019A] # LATIN SMALL LETTER L WITH BAR
+026B ; [.0F3F.0020.0002.026B] # LATIN SMALL LETTER L WITH MIDDLE TILDE
+026C ; [.0F43.0020.0002.026C] # LATIN SMALL LETTER L WITH BELT
+026D ; [.0F47.0020.0002.026D] # LATIN SMALL LETTER L WITH RETROFLEX HOOK
+0234 ; [.0F4B.0020.0002.0234] # LATIN SMALL LETTER L WITH CURL
+026E ; [.0F4F.0020.0002.026E] # LATIN SMALL LETTER LEZH
+019B ; [.0F53.0020.0002.019B] # LATIN SMALL LETTER LAMBDA WITH STROKE
+028E ; [.0F57.0020.0002.028E] # LATIN SMALL LETTER TURNED Y
+006D ; [.0F5B.0020.0002.006D] # LATIN SMALL LETTER M
+FF4D ; [.0F5B.0020.0003.FF4D] # FULLWIDTH LATIN SMALL LETTER M; QQK
+036B ; [.0F5B.0020.0004.036B] # COMBINING LATIN SMALL LETTER M; QQK
+217F ; [.0F5B.0020.0004.217F] # SMALL ROMAN NUMERAL ONE THOUSAND; QQK
+24A8 ; [*0288.0020.0004.24A8][.0F5B.0020.0004.24A8][*0289.0020.001F.24A8] # PARENTHESIZED LATIN SMALL LETTER M; QQKN
+1D426 ; [.0F5B.0020.0005.1D426] # MATHEMATICAL BOLD SMALL M; QQK
+1D45A ; [.0F5B.0020.0005.1D45A] # MATHEMATICAL ITALIC SMALL M; QQK
+1D48E ; [.0F5B.0020.0005.1D48E] # MATHEMATICAL BOLD ITALIC SMALL M; QQK
+1D4C2 ; [.0F5B.0020.0005.1D4C2] # MATHEMATICAL SCRIPT SMALL M; QQK
+1D4F6 ; [.0F5B.0020.0005.1D4F6] # MATHEMATICAL BOLD SCRIPT SMALL M; QQK
+1D52A ; [.0F5B.0020.0005.1D52A] # MATHEMATICAL FRAKTUR SMALL M; QQK
+1D55E ; [.0F5B.0020.0005.1D55E] # MATHEMATICAL DOUBLE-STRUCK SMALL M; QQK
+1D592 ; [.0F5B.0020.0005.1D592] # MATHEMATICAL BOLD FRAKTUR SMALL M; QQK
+1D5C6 ; [.0F5B.0020.0005.1D5C6] # MATHEMATICAL SANS-SERIF SMALL M; QQK
+1D5FA ; [.0F5B.0020.0005.1D5FA] # MATHEMATICAL SANS-SERIF BOLD SMALL M; QQK
+1D62E ; [.0F5B.0020.0005.1D62E] # MATHEMATICAL SANS-SERIF ITALIC SMALL M; QQK
+1D662 ; [.0F5B.0020.0005.1D662] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M; QQK
+1D696 ; [.0F5B.0020.0005.1D696] # MATHEMATICAL MONOSPACE SMALL M; QQK
+24DC ; [.0F5B.0020.0006.24DC] # CIRCLED LATIN SMALL LETTER M; QQK
+004D ; [.0F5B.0020.0008.004D] # LATIN CAPITAL LETTER M
+FF2D ; [.0F5B.0020.0009.FF2D] # FULLWIDTH LATIN CAPITAL LETTER M; QQK
+216F ; [.0F5B.0020.000A.216F] # ROMAN NUMERAL ONE THOUSAND; QQK
+2133 ; [.0F5B.0020.000B.2133] # SCRIPT CAPITAL M; QQK
+1D40C ; [.0F5B.0020.000B.1D40C] # MATHEMATICAL BOLD CAPITAL M; QQK
+1D440 ; [.0F5B.0020.000B.1D440] # MATHEMATICAL ITALIC CAPITAL M; QQK
+1D474 ; [.0F5B.0020.000B.1D474] # MATHEMATICAL BOLD ITALIC CAPITAL M; QQK
+1D4DC ; [.0F5B.0020.000B.1D4DC] # MATHEMATICAL BOLD SCRIPT CAPITAL M; QQK
+1D510 ; [.0F5B.0020.000B.1D510] # MATHEMATICAL FRAKTUR CAPITAL M; QQK
+1D544 ; [.0F5B.0020.000B.1D544] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M; QQK
+1D578 ; [.0F5B.0020.000B.1D578] # MATHEMATICAL BOLD FRAKTUR CAPITAL M; QQK
+1D5AC ; [.0F5B.0020.000B.1D5AC] # MATHEMATICAL SANS-SERIF CAPITAL M; QQK
+1D5E0 ; [.0F5B.0020.000B.1D5E0] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M; QQK
+1D614 ; [.0F5B.0020.000B.1D614] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M; QQK
+1D648 ; [.0F5B.0020.000B.1D648] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M; QQK
+1D67C ; [.0F5B.0020.000B.1D67C] # MATHEMATICAL MONOSPACE CAPITAL M; QQK
+24C2 ; [.0F5B.0020.000C.24C2] # CIRCLED LATIN CAPITAL LETTER M; QQK
+1D39 ; [.0F5B.0020.0014.1D39] # MODIFIER LETTER CAPITAL M; QQK
+1D50 ; [.0F5B.0020.0014.1D50] # MODIFIER LETTER SMALL M; QQK
+1E3F ; [.0F5B.0020.0002.006D][.0000.0032.0002.0301] # LATIN SMALL LETTER M WITH ACUTE; QQCM
+1E3E ; [.0F5B.0020.0008.004D][.0000.0032.0002.0301] # LATIN CAPITAL LETTER M WITH ACUTE; QQCM
+1E41 ; [.0F5B.0020.0002.006D][.0000.0052.0002.0307] # LATIN SMALL LETTER M WITH DOT ABOVE; QQCM
+1E40 ; [.0F5B.0020.0008.004D][.0000.0052.0002.0307] # LATIN CAPITAL LETTER M WITH DOT ABOVE; QQCM
+1E43 ; [.0F5B.0020.0002.006D][.0000.0079.0002.0323] # LATIN SMALL LETTER M WITH DOT BELOW; QQCM
+1E42 ; [.0F5B.0020.0008.004D][.0000.0079.0002.0323] # LATIN CAPITAL LETTER M WITH DOT BELOW; QQCM
+33A1 ; [.0F5B.0020.001C.33A1][.0E2B.0020.001C.33A1] # SQUARE M SQUARED; QQKN
+33A5 ; [.0F5B.0020.001C.33A5][.0E2C.0020.001C.33A5] # SQUARE M CUBED; QQKN
+3383 ; [.0F5B.0020.001C.3383][.0E33.0020.001D.3383] # SQUARE MA; QQKN
+33D4 ; [.0F5B.0020.001C.33D4][.0E4A.0020.001C.33D4] # SQUARE MB SMALL; QQKN
+3386 ; [.0F5B.0020.001D.3386][.0E4A.0020.001D.3386] # SQUARE MB; QQKN
+338E ; [.0F5B.0020.001C.338E][.0EC1.0020.001C.338E] # SQUARE MG; QQKN
+3392 ; [.0F5B.0020.001D.3392][.0EE1.0020.001D.3392][.106A.0020.001F.3392] # SQUARE MHZ; QQKN
+33D5 ; [.0F5B.0020.001C.33D5][.0EFB.0020.001C.33D5][.0F2E.0020.001F.33D5] # SQUARE MIL; QQKN
+3396 ; [.0F5B.0020.001C.3396][.0F2E.0020.001C.3396] # SQUARE ML; QQKN
+339C ; [.0F5B.0020.001C.339C][.0F5B.0020.001C.339C] # SQUARE MM; QQKN
+339F ; [.0F5B.0020.001C.339F][.0F5B.0020.001C.339F][.0E2B.0020.001F.339F] # SQUARE MM SQUARED; QQKN
+33A3 ; [.0F5B.0020.001C.33A3][.0F5B.0020.001C.33A3][.0E2C.0020.001F.33A3] # SQUARE MM CUBED; QQKN
+33D6 ; [.0F5B.0020.001C.33D6][.0F82.0020.001C.33D6][.0F2E.0020.001F.33D6] # SQUARE MOL; QQKN
+33AB ; [.0F5B.0020.001D.33AB][.0FA7.0020.001D.33AB][.0E33.0020.001F.33AB] # SQUARE MPA; QQKN
+33B3 ; [.0F5B.0020.001C.33B3][.0FEA.0020.001C.33B3] # SQUARE MS; QQKN
+33A7 ; [.0F5B.0020.001C.33A7][*0437.0020.001C.33A7][.0FEA.0020.001F.33A7] # SQUARE M OVER S; QQKN
+33A8 ; [.0F5B.0020.001C.33A8][*0437.0020.001C.33A8][.0FEA.0020.001F.33A8][.0E2B.0020.001F.33A8] # SQUARE M OVER S SQUARED; QQKN
+33B7 ; [.0F5B.0020.001C.33B7][.1044.0020.001D.33B7] # SQUARE MV; QQKN
+33B9 ; [.0F5B.0020.001D.33B9][.1044.0020.001D.33B9] # SQUARE MV MEGA; QQKN
+33BD ; [.0F5B.0020.001C.33BD][.1051.0020.001D.33BD] # SQUARE MW; QQKN
+33BF ; [.0F5B.0020.001D.33BF][.1051.0020.001D.33BF] # SQUARE MW MEGA; QQKN
+33C1 ; [.0F5B.0020.001D.33C1][.1109.0020.001D.33C1] # SQUARE M OHM; QQKN
+1D0D ; [.0F5F.0020.0002.1D0D] # LATIN LETTER SMALL CAPITAL M
+0271 ; [.0F60.0020.0002.0271] # LATIN SMALL LETTER M WITH HOOK
+006E ; [.0F64.0020.0002.006E] # LATIN SMALL LETTER N
+FF4E ; [.0F64.0020.0003.FF4E] # FULLWIDTH LATIN SMALL LETTER N; QQK
+24A9 ; [*0288.0020.0004.24A9][.0F64.0020.0004.24A9][*0289.0020.001F.24A9] # PARENTHESIZED LATIN SMALL LETTER N; QQKN
+1D427 ; [.0F64.0020.0005.1D427] # MATHEMATICAL BOLD SMALL N; QQK
+1D45B ; [.0F64.0020.0005.1D45B] # MATHEMATICAL ITALIC SMALL N; QQK
+1D48F ; [.0F64.0020.0005.1D48F] # MATHEMATICAL BOLD ITALIC SMALL N; QQK
+1D4C3 ; [.0F64.0020.0005.1D4C3] # MATHEMATICAL SCRIPT SMALL N; QQK
+1D4F7 ; [.0F64.0020.0005.1D4F7] # MATHEMATICAL BOLD SCRIPT SMALL N; QQK
+1D52B ; [.0F64.0020.0005.1D52B] # MATHEMATICAL FRAKTUR SMALL N; QQK
+1D55F ; [.0F64.0020.0005.1D55F] # MATHEMATICAL DOUBLE-STRUCK SMALL N; QQK
+1D593 ; [.0F64.0020.0005.1D593] # MATHEMATICAL BOLD FRAKTUR SMALL N; QQK
+1D5C7 ; [.0F64.0020.0005.1D5C7] # MATHEMATICAL SANS-SERIF SMALL N; QQK
+1D5FB ; [.0F64.0020.0005.1D5FB] # MATHEMATICAL SANS-SERIF BOLD SMALL N; QQK
+1D62F ; [.0F64.0020.0005.1D62F] # MATHEMATICAL SANS-SERIF ITALIC SMALL N; QQK
+1D663 ; [.0F64.0020.0005.1D663] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N; QQK
+1D697 ; [.0F64.0020.0005.1D697] # MATHEMATICAL MONOSPACE SMALL N; QQK
+24DD ; [.0F64.0020.0006.24DD] # CIRCLED LATIN SMALL LETTER N; QQK
+004E ; [.0F64.0020.0008.004E] # LATIN CAPITAL LETTER N
+FF2E ; [.0F64.0020.0009.FF2E] # FULLWIDTH LATIN CAPITAL LETTER N; QQK
+2115 ; [.0F64.0020.000B.2115] # DOUBLE-STRUCK CAPITAL N; QQK
+1D40D ; [.0F64.0020.000B.1D40D] # MATHEMATICAL BOLD CAPITAL N; QQK
+1D441 ; [.0F64.0020.000B.1D441] # MATHEMATICAL ITALIC CAPITAL N; QQK
+1D475 ; [.0F64.0020.000B.1D475] # MATHEMATICAL BOLD ITALIC CAPITAL N; QQK
+1D4A9 ; [.0F64.0020.000B.1D4A9] # MATHEMATICAL SCRIPT CAPITAL N; QQK
+1D4DD ; [.0F64.0020.000B.1D4DD] # MATHEMATICAL BOLD SCRIPT CAPITAL N; QQK
+1D511 ; [.0F64.0020.000B.1D511] # MATHEMATICAL FRAKTUR CAPITAL N; QQK
+1D579 ; [.0F64.0020.000B.1D579] # MATHEMATICAL BOLD FRAKTUR CAPITAL N; QQK
+1D5AD ; [.0F64.0020.000B.1D5AD] # MATHEMATICAL SANS-SERIF CAPITAL N; QQK
+1D5E1 ; [.0F64.0020.000B.1D5E1] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N; QQK
+1D615 ; [.0F64.0020.000B.1D615] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N; QQK
+1D649 ; [.0F64.0020.000B.1D649] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N; QQK
+1D67D ; [.0F64.0020.000B.1D67D] # MATHEMATICAL MONOSPACE CAPITAL N; QQK
+24C3 ; [.0F64.0020.000C.24C3] # CIRCLED LATIN CAPITAL LETTER N; QQK
+1D3A ; [.0F64.0020.0014.1D3A] # MODIFIER LETTER CAPITAL N; QQK
+207F ; [.0F64.0020.0014.207F] # SUPERSCRIPT LATIN SMALL LETTER N; QQK
+0144 ; [.0F64.0020.0002.006E][.0000.0032.0002.0301] # LATIN SMALL LETTER N WITH ACUTE; QQCM
+0143 ; [.0F64.0020.0008.004E][.0000.0032.0002.0301] # LATIN CAPITAL LETTER N WITH ACUTE; QQCM
+01F9 ; [.0F64.0020.0002.006E][.0000.0035.0002.0300] # LATIN SMALL LETTER N WITH GRAVE; QQCM
+01F8 ; [.0F64.0020.0008.004E][.0000.0035.0002.0300] # LATIN CAPITAL LETTER N WITH GRAVE; QQCM
+0148 ; [.0F64.0020.0002.006E][.0000.0041.0002.030C] # LATIN SMALL LETTER N WITH CARON; QQCM
+0147 ; [.0F64.0020.0008.004E][.0000.0041.0002.030C] # LATIN CAPITAL LETTER N WITH CARON; QQCM
+00F1 ; [.0F64.0020.0002.006E][.0000.004E.0002.0303] # LATIN SMALL LETTER N WITH TILDE; QQCM
+00D1 ; [.0F64.0020.0008.004E][.0000.004E.0002.0303] # LATIN CAPITAL LETTER N WITH TILDE; QQCM
+1E45 ; [.0F64.0020.0002.006E][.0000.0052.0002.0307] # LATIN SMALL LETTER N WITH DOT ABOVE; QQCM
+1E44 ; [.0F64.0020.0008.004E][.0000.0052.0002.0307] # LATIN CAPITAL LETTER N WITH DOT ABOVE; QQCM
+0146 ; [.0F64.0020.0002.006E][.0000.0055.0002.0327] # LATIN SMALL LETTER N WITH CEDILLA; QQCM
+0145 ; [.0F64.0020.0008.004E][.0000.0055.0002.0327] # LATIN CAPITAL LETTER N WITH CEDILLA; QQCM
+1E47 ; [.0F64.0020.0002.006E][.0000.0079.0002.0323] # LATIN SMALL LETTER N WITH DOT BELOW; QQCM
+1E46 ; [.0F64.0020.0008.004E][.0000.0079.0002.0323] # LATIN CAPITAL LETTER N WITH DOT BELOW; QQCM
+1E4B ; [.0F64.0020.0002.006E][.0000.0085.0002.032D] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW; QQCM
+1E4A ; [.0F64.0020.0008.004E][.0000.0085.0002.032D] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW; QQCM
+1E49 ; [.0F64.0020.0002.006E][.0000.0089.0002.0331] # LATIN SMALL LETTER N WITH LINE BELOW; QQCM
+1E48 ; [.0F64.0020.0008.004E][.0000.0089.0002.0331] # LATIN CAPITAL LETTER N WITH LINE BELOW; QQCM
+3381 ; [.0F64.0020.001C.3381][.0E33.0020.001D.3381] # SQUARE NA; QQKN
+338B ; [.0F64.0020.001C.338B][.0EB9.0020.001D.338B] # SQUARE NF; QQKN
+01CC ; [.0F64.0020.0004.01CC][.0F10.0020.0004.01CC] # LATIN SMALL LETTER NJ; QQKN
+01CB ; [.0F64.0020.000A.01CB][.0F10.0020.0004.01CB] # LATIN CAPITAL LETTER N WITH SMALL LETTER J; QQKN
+01CA ; [.0F64.0020.000A.01CA][.0F10.0020.000A.01CA] # LATIN CAPITAL LETTER NJ; QQKN
+339A ; [.0F64.0020.001C.339A][.0F5B.0020.001C.339A] # SQUARE NM; QQKN
+2116 ; [.0F64.0020.000A.2116][.0F82.0020.0004.2116] # NUMERO SIGN; QQKN
+33B1 ; [.0F64.0020.001C.33B1][.0FEA.0020.001C.33B1] # SQUARE NS; QQKN
+33B5 ; [.0F64.0020.001C.33B5][.1044.0020.001D.33B5] # SQUARE NV; QQKN
+33BB ; [.0F64.0020.001C.33BB][.1051.0020.001D.33BB] # SQUARE NW; QQKN
+0274 ; [.0F68.0020.0002.0274] # LATIN LETTER SMALL CAPITAL N
+1D3B ; [.0F6C.0020.0002.1D3B] # MODIFIER LETTER CAPITAL REVERSED N
+1D0E ; [.0F6D.0020.0002.1D0E] # LATIN LETTER SMALL CAPITAL REVERSED N
+0272 ; [.0F6E.0020.0002.0272] # LATIN SMALL LETTER N WITH LEFT HOOK
+019D ; [.0F6E.0020.0008.019D] # LATIN CAPITAL LETTER N WITH LEFT HOOK
+019E ; [.0F72.0020.0002.019E] # LATIN SMALL LETTER N WITH LONG RIGHT LEG
+0220 ; [.0F72.0020.0008.0220] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0273 ; [.0F76.0020.0002.0273] # LATIN SMALL LETTER N WITH RETROFLEX HOOK
+0235 ; [.0F7A.0020.0002.0235] # LATIN SMALL LETTER N WITH CURL
+014B ; [.0F7E.0020.0002.014B] # LATIN SMALL LETTER ENG
+014A ; [.0F7E.0020.0008.014A] # LATIN CAPITAL LETTER ENG
+1D51 ; [.0F7E.0020.0014.1D51] # MODIFIER LETTER SMALL ENG; QQK
+006F ; [.0F82.0020.0002.006F] # LATIN SMALL LETTER O
+FF4F ; [.0F82.0020.0003.FF4F] # FULLWIDTH LATIN SMALL LETTER O; QQK
+0366 ; [.0F82.0020.0004.0366] # COMBINING LATIN SMALL LETTER O; QQK
+24AA ; [*0288.0020.0004.24AA][.0F82.0020.0004.24AA][*0289.0020.001F.24AA] # PARENTHESIZED LATIN SMALL LETTER O; QQKN
+2134 ; [.0F82.0020.0005.2134] # SCRIPT SMALL O; QQK
+1D428 ; [.0F82.0020.0005.1D428] # MATHEMATICAL BOLD SMALL O; QQK
+1D45C ; [.0F82.0020.0005.1D45C] # MATHEMATICAL ITALIC SMALL O; QQK
+1D490 ; [.0F82.0020.0005.1D490] # MATHEMATICAL BOLD ITALIC SMALL O; QQK
+1D4F8 ; [.0F82.0020.0005.1D4F8] # MATHEMATICAL BOLD SCRIPT SMALL O; QQK
+1D52C ; [.0F82.0020.0005.1D52C] # MATHEMATICAL FRAKTUR SMALL O; QQK
+1D560 ; [.0F82.0020.0005.1D560] # MATHEMATICAL DOUBLE-STRUCK SMALL O; QQK
+1D594 ; [.0F82.0020.0005.1D594] # MATHEMATICAL BOLD FRAKTUR SMALL O; QQK
+1D5C8 ; [.0F82.0020.0005.1D5C8] # MATHEMATICAL SANS-SERIF SMALL O; QQK
+1D5FC ; [.0F82.0020.0005.1D5FC] # MATHEMATICAL SANS-SERIF BOLD SMALL O; QQK
+1D630 ; [.0F82.0020.0005.1D630] # MATHEMATICAL SANS-SERIF ITALIC SMALL O; QQK
+1D664 ; [.0F82.0020.0005.1D664] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O; QQK
+1D698 ; [.0F82.0020.0005.1D698] # MATHEMATICAL MONOSPACE SMALL O; QQK
+24DE ; [.0F82.0020.0006.24DE] # CIRCLED LATIN SMALL LETTER O; QQK
+004F ; [.0F82.0020.0008.004F] # LATIN CAPITAL LETTER O
+FF2F ; [.0F82.0020.0009.FF2F] # FULLWIDTH LATIN CAPITAL LETTER O; QQK
+1D40E ; [.0F82.0020.000B.1D40E] # MATHEMATICAL BOLD CAPITAL O; QQK
+1D442 ; [.0F82.0020.000B.1D442] # MATHEMATICAL ITALIC CAPITAL O; QQK
+1D476 ; [.0F82.0020.000B.1D476] # MATHEMATICAL BOLD ITALIC CAPITAL O; QQK
+1D4AA ; [.0F82.0020.000B.1D4AA] # MATHEMATICAL SCRIPT CAPITAL O; QQK
+1D4DE ; [.0F82.0020.000B.1D4DE] # MATHEMATICAL BOLD SCRIPT CAPITAL O; QQK
+1D512 ; [.0F82.0020.000B.1D512] # MATHEMATICAL FRAKTUR CAPITAL O; QQK
+1D546 ; [.0F82.0020.000B.1D546] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O; QQK
+1D57A ; [.0F82.0020.000B.1D57A] # MATHEMATICAL BOLD FRAKTUR CAPITAL O; QQK
+1D5AE ; [.0F82.0020.000B.1D5AE] # MATHEMATICAL SANS-SERIF CAPITAL O; QQK
+1D5E2 ; [.0F82.0020.000B.1D5E2] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O; QQK
+1D616 ; [.0F82.0020.000B.1D616] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O; QQK
+1D64A ; [.0F82.0020.000B.1D64A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O; QQK
+1D67E ; [.0F82.0020.000B.1D67E] # MATHEMATICAL MONOSPACE CAPITAL O; QQK
+24C4 ; [.0F82.0020.000C.24C4] # CIRCLED LATIN CAPITAL LETTER O; QQK
+00BA ; [.0F82.0020.0014.00BA] # MASCULINE ORDINAL INDICATOR; QQK
+1D3C ; [.0F82.0020.0014.1D3C] # MODIFIER LETTER CAPITAL O; QQK
+1D52 ; [.0F82.0020.0014.1D52] # MODIFIER LETTER SMALL O; QQK
+00F3 ; [.0F82.0020.0002.006F][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH ACUTE; QQCM
+00D3 ; [.0F82.0020.0008.004F][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH ACUTE; QQCM
+00F2 ; [.0F82.0020.0002.006F][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH GRAVE; QQCM
+00D2 ; [.0F82.0020.0008.004F][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH GRAVE; QQCM
+014F ; [.0F82.0020.0002.006F][.0000.0037.0002.0306] # LATIN SMALL LETTER O WITH BREVE; QQCM
+014E ; [.0F82.0020.0008.004F][.0000.0037.0002.0306] # LATIN CAPITAL LETTER O WITH BREVE; QQCM
+00F4 ; [.0F82.0020.0002.006F][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX; QQCM
+00D4 ; [.0F82.0020.0008.004F][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX; QQCM
+1ED1 ; [.0F82.0020.0002.006F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE; QQCM
+1ED0 ; [.0F82.0020.0008.004F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE; QQCM
+1ED3 ; [.0F82.0020.0002.006F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE; QQCM
+1ED2 ; [.0F82.0020.0008.004F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE; QQCM
+1ED7 ; [.0F82.0020.0002.006F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE; QQCM
+1ED6 ; [.0F82.0020.0008.004F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE; QQCM
+1ED5 ; [.0F82.0020.0002.006F][.0000.003C.0002.0302][.0000.005F.0002.0309] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1ED4 ; [.0F82.0020.0008.004F][.0000.003C.0002.0302][.0000.005F.0002.0309] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+01D2 ; [.0F82.0020.0002.006F][.0000.0041.0002.030C] # LATIN SMALL LETTER O WITH CARON; QQCM
+01D1 ; [.0F82.0020.0008.004F][.0000.0041.0002.030C] # LATIN CAPITAL LETTER O WITH CARON; QQCM
+00F6 ; [.0F82.0020.0002.006F][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH DIAERESIS; QQCM
+00D6 ; [.0F82.0020.0008.004F][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH DIAERESIS; QQCM
+022B ; [.0F82.0020.0002.006F][.0000.0047.0002.0308][.0000.005A.0002.0304] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON; QQCM
+022A ; [.0F82.0020.0008.004F][.0000.0047.0002.0308][.0000.005A.0002.0304] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON; QQCM
+0151 ; [.0F82.0020.0002.006F][.0000.004D.0002.030B] # LATIN SMALL LETTER O WITH DOUBLE ACUTE; QQCM
+0150 ; [.0F82.0020.0008.004F][.0000.004D.0002.030B] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE; QQCM
+00F5 ; [.0F82.0020.0002.006F][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH TILDE; QQCM
+00D5 ; [.0F82.0020.0008.004F][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH TILDE; QQCM
+1E4D ; [.0F82.0020.0002.006F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH TILDE AND ACUTE; QQCM
+1E4C ; [.0F82.0020.0008.004F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE; QQCM
+1E4F ; [.0F82.0020.0002.006F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS; QQCM
+1E4E ; [.0F82.0020.0008.004F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS; QQCM
+022D ; [.0F82.0020.0002.006F][.0000.004E.0002.0303][.0000.005A.0002.0304] # LATIN SMALL LETTER O WITH TILDE AND MACRON; QQCM
+022C ; [.0F82.0020.0008.004F][.0000.004E.0002.0303][.0000.005A.0002.0304] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON; QQCM
+022F ; [.0F82.0020.0002.006F][.0000.0052.0002.0307] # LATIN SMALL LETTER O WITH DOT ABOVE; QQCM
+022E ; [.0F82.0020.0008.004F][.0000.0052.0002.0307] # LATIN CAPITAL LETTER O WITH DOT ABOVE; QQCM
+0231 ; [.0F82.0020.0002.006F][.0000.0052.0002.0307][.0000.005A.0002.0304] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON; QQCM
+0230 ; [.0F82.0020.0008.004F][.0000.0052.0002.0307][.0000.005A.0002.0304] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON; QQCM
+01EB ; [.0F82.0020.0002.006F][.0000.0058.0002.0328] # LATIN SMALL LETTER O WITH OGONEK; QQCM
+01EA ; [.0F82.0020.0008.004F][.0000.0058.0002.0328] # LATIN CAPITAL LETTER O WITH OGONEK; QQCM
+01ED ; [.0F82.0020.0002.006F][.0000.0058.0002.0328][.0000.005A.0002.0304] # LATIN SMALL LETTER O WITH OGONEK AND MACRON; QQCM
+01EC ; [.0F82.0020.0008.004F][.0000.0058.0002.0328][.0000.005A.0002.0304] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON; QQCM
+014D ; [.0F82.0020.0002.006F][.0000.005A.0002.0304] # LATIN SMALL LETTER O WITH MACRON; QQCM
+014C ; [.0F82.0020.0008.004F][.0000.005A.0002.0304] # LATIN CAPITAL LETTER O WITH MACRON; QQCM
+1E53 ; [.0F82.0020.0002.006F][.0000.005A.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH MACRON AND ACUTE; QQCM
+1E52 ; [.0F82.0020.0008.004F][.0000.005A.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE; QQCM
+1E51 ; [.0F82.0020.0002.006F][.0000.005A.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH MACRON AND GRAVE; QQCM
+1E50 ; [.0F82.0020.0008.004F][.0000.005A.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE; QQCM
+1ECF ; [.0F82.0020.0002.006F][.0000.005F.0002.0309] # LATIN SMALL LETTER O WITH HOOK ABOVE; QQCM
+1ECE ; [.0F82.0020.0008.004F][.0000.005F.0002.0309] # LATIN CAPITAL LETTER O WITH HOOK ABOVE; QQCM
+020D ; [.0F82.0020.0002.006F][.0000.0062.0002.030F] # LATIN SMALL LETTER O WITH DOUBLE GRAVE; QQCM
+020C ; [.0F82.0020.0008.004F][.0000.0062.0002.030F] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE; QQCM
+020F ; [.0F82.0020.0002.006F][.0000.0064.0002.0311] # LATIN SMALL LETTER O WITH INVERTED BREVE; QQCM
+020E ; [.0F82.0020.0008.004F][.0000.0064.0002.0311] # LATIN CAPITAL LETTER O WITH INVERTED BREVE; QQCM
+01A1 ; [.0F82.0020.0002.006F][.0000.006C.0002.031B] # LATIN SMALL LETTER O WITH HORN; QQCM
+01A0 ; [.0F82.0020.0008.004F][.0000.006C.0002.031B] # LATIN CAPITAL LETTER O WITH HORN; QQCM
+1EDB ; [.0F82.0020.0002.006F][.0000.006C.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH HORN AND ACUTE; QQCM
+1EDA ; [.0F82.0020.0008.004F][.0000.006C.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE; QQCM
+1EDD ; [.0F82.0020.0002.006F][.0000.006C.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH HORN AND GRAVE; QQCM
+1EDC ; [.0F82.0020.0008.004F][.0000.006C.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE; QQCM
+1EE1 ; [.0F82.0020.0002.006F][.0000.006C.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH HORN AND TILDE; QQCM
+1EE0 ; [.0F82.0020.0008.004F][.0000.006C.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH HORN AND TILDE; QQCM
+1EDF ; [.0F82.0020.0002.006F][.0000.006C.0002.031B][.0000.005F.0002.0309] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE; QQCM
+1EDE ; [.0F82.0020.0008.004F][.0000.006C.0002.031B][.0000.005F.0002.0309] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE; QQCM
+1EE3 ; [.0F82.0020.0002.006F][.0000.006C.0002.031B][.0000.0079.0002.0323] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW; QQCM
+1EE2 ; [.0F82.0020.0008.004F][.0000.006C.0002.031B][.0000.0079.0002.0323] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW; QQCM
+1ECD ; [.0F82.0020.0002.006F][.0000.0079.0002.0323] # LATIN SMALL LETTER O WITH DOT BELOW; QQCM
+1ECC ; [.0F82.0020.0008.004F][.0000.0079.0002.0323] # LATIN CAPITAL LETTER O WITH DOT BELOW; QQCM
+1ED9 ; [.0F82.0020.0002.006F][.0000.0079.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1ED8 ; [.0F82.0020.0008.004F][.0000.0079.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW; QQCM
+0153 ; [.0F82.0020.0004.0153][.0000.015D.0004.0153][.0E8B.0020.001F.0153] # LATIN SMALL LIGATURE OE; QQKN
+0152 ; [.0F82.0020.000A.0152][.0000.015D.0004.0152][.0E8B.0020.001F.0152] # LATIN CAPITAL LIGATURE OE; QQKN
+3375 ; [.0F82.0020.001C.3375][.1044.0020.001D.3375] # SQUARE OV; QQKN
+1D0F ; [.0F86.0020.0002.1D0F] # LATIN LETTER SMALL CAPITAL O
+1D11 ; [.0F87.0020.0002.1D11] # LATIN SMALL LETTER SIDEWAYS O
+0276 ; [.0F88.0020.0002.0276] # LATIN LETTER SMALL CAPITAL OE
+1D14 ; [.0F8C.0020.0002.1D14] # LATIN SMALL LETTER TURNED OE
+00F8 ; [.0F8D.0020.0002.00F8] # LATIN SMALL LETTER O WITH STROKE
+00D8 ; [.0F8D.0020.0008.00D8] # LATIN CAPITAL LETTER O WITH STROKE
+01FF ; [.0F8D.0020.0002.00F8][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH STROKE AND ACUTE; QQCM
+01FE ; [.0F8D.0020.0008.00D8][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE; QQCM
+1D13 ; [.0F91.0020.0002.1D13] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+0254 ; [.0F92.0020.0002.0254] # LATIN SMALL LETTER OPEN O
+0186 ; [.0F92.0020.0008.0186] # LATIN CAPITAL LETTER OPEN O
+1D53 ; [.0F92.0020.0014.1D53] # MODIFIER LETTER SMALL OPEN O; QQK
+1D10 ; [.0F96.0020.0002.1D10] # LATIN LETTER SMALL CAPITAL OPEN O
+1D12 ; [.0F97.0020.0002.1D12] # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D16 ; [.0F98.0020.0002.1D16] # LATIN SMALL LETTER TOP HALF O
+1D54 ; [.0F98.0020.0014.1D54] # MODIFIER LETTER SMALL TOP HALF O; QQK
+1D17 ; [.0F99.0020.0002.1D17] # LATIN SMALL LETTER BOTTOM HALF O
+1D55 ; [.0F99.0020.0014.1D55] # MODIFIER LETTER SMALL BOTTOM HALF O; QQK
+0275 ; [.0F9A.0020.0002.0275] # LATIN SMALL LETTER BARRED O
+019F ; [.0F9A.0020.0008.019F] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+0277 ; [.0F9E.0020.0002.0277] # LATIN SMALL LETTER CLOSED OMEGA
+0223 ; [.0FA2.0020.0002.0223] # LATIN SMALL LETTER OU
+0222 ; [.0FA2.0020.0008.0222] # LATIN CAPITAL LETTER OU
+1D3D ; [.0FA2.0020.0014.1D3D] # MODIFIER LETTER CAPITAL OU; QQK
+1D15 ; [.0FA6.0020.0002.1D15] # LATIN LETTER SMALL CAPITAL OU
+0070 ; [.0FA7.0020.0002.0070] # LATIN SMALL LETTER P
+FF50 ; [.0FA7.0020.0003.FF50] # FULLWIDTH LATIN SMALL LETTER P; QQK
+24AB ; [*0288.0020.0004.24AB][.0FA7.0020.0004.24AB][*0289.0020.001F.24AB] # PARENTHESIZED LATIN SMALL LETTER P; QQKN
+1D429 ; [.0FA7.0020.0005.1D429] # MATHEMATICAL BOLD SMALL P; QQK
+1D45D ; [.0FA7.0020.0005.1D45D] # MATHEMATICAL ITALIC SMALL P; QQK
+1D491 ; [.0FA7.0020.0005.1D491] # MATHEMATICAL BOLD ITALIC SMALL P; QQK
+1D4C5 ; [.0FA7.0020.0005.1D4C5] # MATHEMATICAL SCRIPT SMALL P; QQK
+1D4F9 ; [.0FA7.0020.0005.1D4F9] # MATHEMATICAL BOLD SCRIPT SMALL P; QQK
+1D52D ; [.0FA7.0020.0005.1D52D] # MATHEMATICAL FRAKTUR SMALL P; QQK
+1D561 ; [.0FA7.0020.0005.1D561] # MATHEMATICAL DOUBLE-STRUCK SMALL P; QQK
+1D595 ; [.0FA7.0020.0005.1D595] # MATHEMATICAL BOLD FRAKTUR SMALL P; QQK
+1D5C9 ; [.0FA7.0020.0005.1D5C9] # MATHEMATICAL SANS-SERIF SMALL P; QQK
+1D5FD ; [.0FA7.0020.0005.1D5FD] # MATHEMATICAL SANS-SERIF BOLD SMALL P; QQK
+1D631 ; [.0FA7.0020.0005.1D631] # MATHEMATICAL SANS-SERIF ITALIC SMALL P; QQK
+1D665 ; [.0FA7.0020.0005.1D665] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P; QQK
+1D699 ; [.0FA7.0020.0005.1D699] # MATHEMATICAL MONOSPACE SMALL P; QQK
+24DF ; [.0FA7.0020.0006.24DF] # CIRCLED LATIN SMALL LETTER P; QQK
+0050 ; [.0FA7.0020.0008.0050] # LATIN CAPITAL LETTER P
+FF30 ; [.0FA7.0020.0009.FF30] # FULLWIDTH LATIN CAPITAL LETTER P; QQK
+2119 ; [.0FA7.0020.000B.2119] # DOUBLE-STRUCK CAPITAL P; QQK
+1D40F ; [.0FA7.0020.000B.1D40F] # MATHEMATICAL BOLD CAPITAL P; QQK
+1D443 ; [.0FA7.0020.000B.1D443] # MATHEMATICAL ITALIC CAPITAL P; QQK
+1D477 ; [.0FA7.0020.000B.1D477] # MATHEMATICAL BOLD ITALIC CAPITAL P; QQK
+1D4AB ; [.0FA7.0020.000B.1D4AB] # MATHEMATICAL SCRIPT CAPITAL P; QQK
+1D4DF ; [.0FA7.0020.000B.1D4DF] # MATHEMATICAL BOLD SCRIPT CAPITAL P; QQK
+1D513 ; [.0FA7.0020.000B.1D513] # MATHEMATICAL FRAKTUR CAPITAL P; QQK
+1D57B ; [.0FA7.0020.000B.1D57B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P; QQK
+1D5AF ; [.0FA7.0020.000B.1D5AF] # MATHEMATICAL SANS-SERIF CAPITAL P; QQK
+1D5E3 ; [.0FA7.0020.000B.1D5E3] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P; QQK
+1D617 ; [.0FA7.0020.000B.1D617] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P; QQK
+1D64B ; [.0FA7.0020.000B.1D64B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P; QQK
+1D67F ; [.0FA7.0020.000B.1D67F] # MATHEMATICAL MONOSPACE CAPITAL P; QQK
+24C5 ; [.0FA7.0020.000C.24C5] # CIRCLED LATIN CAPITAL LETTER P; QQK
+1D3E ; [.0FA7.0020.0014.1D3E] # MODIFIER LETTER CAPITAL P; QQK
+1D56 ; [.0FA7.0020.0014.1D56] # MODIFIER LETTER SMALL P; QQK
+1E55 ; [.0FA7.0020.0002.0070][.0000.0032.0002.0301] # LATIN SMALL LETTER P WITH ACUTE; QQCM
+1E54 ; [.0FA7.0020.0008.0050][.0000.0032.0002.0301] # LATIN CAPITAL LETTER P WITH ACUTE; QQCM
+1E57 ; [.0FA7.0020.0002.0070][.0000.0052.0002.0307] # LATIN SMALL LETTER P WITH DOT ABOVE; QQCM
+1E56 ; [.0FA7.0020.0008.0050][.0000.0052.0002.0307] # LATIN CAPITAL LETTER P WITH DOT ABOVE; QQCM
+3380 ; [.0FA7.0020.001C.3380][.0E33.0020.001D.3380] # SQUARE PA AMPS; QQKN
+33A9 ; [.0FA7.0020.001D.33A9][.0E33.0020.001C.33A9] # SQUARE PA; QQKN
+3376 ; [.0FA7.0020.001C.3376][.0E60.0020.001C.3376] # SQUARE PC; QQKN
+338A ; [.0FA7.0020.001C.338A][.0EB9.0020.001D.338A] # SQUARE PF; QQKN
+33D7 ; [.0FA7.0020.001D.33D7][.0EE1.0020.001D.33D7] # SQUARE PH; QQKN
+33D8 ; [.0FA7.0020.001C.33D8][*025D.0020.001C.33D8][.0F5B.0020.001F.33D8][*025D.0020.001F.33D8] # SQUARE PM; QQKN
+33D9 ; [.0FA7.0020.001D.33D9][.0FA7.0020.001D.33D9][.0F5B.0020.001F.33D9] # SQUARE PPM; QQKN
+33DA ; [.0FA7.0020.001D.33DA][.0FC0.0020.001D.33DA] # SQUARE PR; QQKN
+33B0 ; [.0FA7.0020.001C.33B0][.0FEA.0020.001C.33B0] # SQUARE PS; QQKN
+3250 ; [.0FA7.0020.001D.3250][.1002.0020.001D.3250][.0E8B.0020.001F.3250] # PARTNERSHIP SIGN; QQKN
+33B4 ; [.0FA7.0020.001C.33B4][.1044.0020.001D.33B4] # SQUARE PV; QQKN
+33BA ; [.0FA7.0020.001C.33BA][.1051.0020.001D.33BA] # SQUARE PW; QQKN
+1D18 ; [.0FAB.0020.0002.1D18] # LATIN LETTER SMALL CAPITAL P
+01A5 ; [.0FAC.0020.0002.01A5] # LATIN SMALL LETTER P WITH HOOK
+01A4 ; [.0FAC.0020.0008.01A4] # LATIN CAPITAL LETTER P WITH HOOK
+0278 ; [.0FB0.0020.0002.0278] # LATIN SMALL LETTER PHI
+0071 ; [.0FB4.0020.0002.0071] # LATIN SMALL LETTER Q
+FF51 ; [.0FB4.0020.0003.FF51] # FULLWIDTH LATIN SMALL LETTER Q; QQK
+24AC ; [*0288.0020.0004.24AC][.0FB4.0020.0004.24AC][*0289.0020.001F.24AC] # PARENTHESIZED LATIN SMALL LETTER Q; QQKN
+1D42A ; [.0FB4.0020.0005.1D42A] # MATHEMATICAL BOLD SMALL Q; QQK
+1D45E ; [.0FB4.0020.0005.1D45E] # MATHEMATICAL ITALIC SMALL Q; QQK
+1D492 ; [.0FB4.0020.0005.1D492] # MATHEMATICAL BOLD ITALIC SMALL Q; QQK
+1D4C6 ; [.0FB4.0020.0005.1D4C6] # MATHEMATICAL SCRIPT SMALL Q; QQK
+1D4FA ; [.0FB4.0020.0005.1D4FA] # MATHEMATICAL BOLD SCRIPT SMALL Q; QQK
+1D52E ; [.0FB4.0020.0005.1D52E] # MATHEMATICAL FRAKTUR SMALL Q; QQK
+1D562 ; [.0FB4.0020.0005.1D562] # MATHEMATICAL DOUBLE-STRUCK SMALL Q; QQK
+1D596 ; [.0FB4.0020.0005.1D596] # MATHEMATICAL BOLD FRAKTUR SMALL Q; QQK
+1D5CA ; [.0FB4.0020.0005.1D5CA] # MATHEMATICAL SANS-SERIF SMALL Q; QQK
+1D5FE ; [.0FB4.0020.0005.1D5FE] # MATHEMATICAL SANS-SERIF BOLD SMALL Q; QQK
+1D632 ; [.0FB4.0020.0005.1D632] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q; QQK
+1D666 ; [.0FB4.0020.0005.1D666] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q; QQK
+1D69A ; [.0FB4.0020.0005.1D69A] # MATHEMATICAL MONOSPACE SMALL Q; QQK
+24E0 ; [.0FB4.0020.0006.24E0] # CIRCLED LATIN SMALL LETTER Q; QQK
+0051 ; [.0FB4.0020.0008.0051] # LATIN CAPITAL LETTER Q
+FF31 ; [.0FB4.0020.0009.FF31] # FULLWIDTH LATIN CAPITAL LETTER Q; QQK
+211A ; [.0FB4.0020.000B.211A] # DOUBLE-STRUCK CAPITAL Q; QQK
+1D410 ; [.0FB4.0020.000B.1D410] # MATHEMATICAL BOLD CAPITAL Q; QQK
+1D444 ; [.0FB4.0020.000B.1D444] # MATHEMATICAL ITALIC CAPITAL Q; QQK
+1D478 ; [.0FB4.0020.000B.1D478] # MATHEMATICAL BOLD ITALIC CAPITAL Q; QQK
+1D4AC ; [.0FB4.0020.000B.1D4AC] # MATHEMATICAL SCRIPT CAPITAL Q; QQK
+1D4E0 ; [.0FB4.0020.000B.1D4E0] # MATHEMATICAL BOLD SCRIPT CAPITAL Q; QQK
+1D514 ; [.0FB4.0020.000B.1D514] # MATHEMATICAL FRAKTUR CAPITAL Q; QQK
+1D57C ; [.0FB4.0020.000B.1D57C] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q; QQK
+1D5B0 ; [.0FB4.0020.000B.1D5B0] # MATHEMATICAL SANS-SERIF CAPITAL Q; QQK
+1D5E4 ; [.0FB4.0020.000B.1D5E4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q; QQK
+1D618 ; [.0FB4.0020.000B.1D618] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q; QQK
+1D64C ; [.0FB4.0020.000B.1D64C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q; QQK
+1D680 ; [.0FB4.0020.000B.1D680] # MATHEMATICAL MONOSPACE CAPITAL Q; QQK
+24C6 ; [.0FB4.0020.000C.24C6] # CIRCLED LATIN CAPITAL LETTER Q; QQK
+02A0 ; [.0FB8.0020.0002.02A0] # LATIN SMALL LETTER Q WITH HOOK
+0138 ; [.0FBC.0020.0002.0138] # LATIN SMALL LETTER KRA
+0072 ; [.0FC0.0020.0002.0072] # LATIN SMALL LETTER R
+FF52 ; [.0FC0.0020.0003.FF52] # FULLWIDTH LATIN SMALL LETTER R; QQK
+036C ; [.0FC0.0020.0004.036C] # COMBINING LATIN SMALL LETTER R; QQK
+24AD ; [*0288.0020.0004.24AD][.0FC0.0020.0004.24AD][*0289.0020.001F.24AD] # PARENTHESIZED LATIN SMALL LETTER R; QQKN
+1D42B ; [.0FC0.0020.0005.1D42B] # MATHEMATICAL BOLD SMALL R; QQK
+1D45F ; [.0FC0.0020.0005.1D45F] # MATHEMATICAL ITALIC SMALL R; QQK
+1D493 ; [.0FC0.0020.0005.1D493] # MATHEMATICAL BOLD ITALIC SMALL R; QQK
+1D4C7 ; [.0FC0.0020.0005.1D4C7] # MATHEMATICAL SCRIPT SMALL R; QQK
+1D4FB ; [.0FC0.0020.0005.1D4FB] # MATHEMATICAL BOLD SCRIPT SMALL R; QQK
+1D52F ; [.0FC0.0020.0005.1D52F] # MATHEMATICAL FRAKTUR SMALL R; QQK
+1D563 ; [.0FC0.0020.0005.1D563] # MATHEMATICAL DOUBLE-STRUCK SMALL R; QQK
+1D597 ; [.0FC0.0020.0005.1D597] # MATHEMATICAL BOLD FRAKTUR SMALL R; QQK
+1D5CB ; [.0FC0.0020.0005.1D5CB] # MATHEMATICAL SANS-SERIF SMALL R; QQK
+1D5FF ; [.0FC0.0020.0005.1D5FF] # MATHEMATICAL SANS-SERIF BOLD SMALL R; QQK
+1D633 ; [.0FC0.0020.0005.1D633] # MATHEMATICAL SANS-SERIF ITALIC SMALL R; QQK
+1D667 ; [.0FC0.0020.0005.1D667] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R; QQK
+1D69B ; [.0FC0.0020.0005.1D69B] # MATHEMATICAL MONOSPACE SMALL R; QQK
+24E1 ; [.0FC0.0020.0006.24E1] # CIRCLED LATIN SMALL LETTER R; QQK
+0052 ; [.0FC0.0020.0008.0052] # LATIN CAPITAL LETTER R
+FF32 ; [.0FC0.0020.0009.FF32] # FULLWIDTH LATIN CAPITAL LETTER R; QQK
+211B ; [.0FC0.0020.000B.211B] # SCRIPT CAPITAL R; QQK
+211C ; [.0FC0.0020.000B.211C] # BLACK-LETTER CAPITAL R; QQK
+211D ; [.0FC0.0020.000B.211D] # DOUBLE-STRUCK CAPITAL R; QQK
+1D411 ; [.0FC0.0020.000B.1D411] # MATHEMATICAL BOLD CAPITAL R; QQK
+1D445 ; [.0FC0.0020.000B.1D445] # MATHEMATICAL ITALIC CAPITAL R; QQK
+1D479 ; [.0FC0.0020.000B.1D479] # MATHEMATICAL BOLD ITALIC CAPITAL R; QQK
+1D4E1 ; [.0FC0.0020.000B.1D4E1] # MATHEMATICAL BOLD SCRIPT CAPITAL R; QQK
+1D57D ; [.0FC0.0020.000B.1D57D] # MATHEMATICAL BOLD FRAKTUR CAPITAL R; QQK
+1D5B1 ; [.0FC0.0020.000B.1D5B1] # MATHEMATICAL SANS-SERIF CAPITAL R; QQK
+1D5E5 ; [.0FC0.0020.000B.1D5E5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R; QQK
+1D619 ; [.0FC0.0020.000B.1D619] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R; QQK
+1D64D ; [.0FC0.0020.000B.1D64D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R; QQK
+1D681 ; [.0FC0.0020.000B.1D681] # MATHEMATICAL MONOSPACE CAPITAL R; QQK
+24C7 ; [.0FC0.0020.000C.24C7] # CIRCLED LATIN CAPITAL LETTER R; QQK
+02B3 ; [.0FC0.0020.0014.02B3] # MODIFIER LETTER SMALL R; QQK
+1D3F ; [.0FC0.0020.0014.1D3F] # MODIFIER LETTER CAPITAL R; QQK
+1D63 ; [.0FC0.0020.0015.1D63] # LATIN SUBSCRIPT SMALL LETTER R; QQK
+0155 ; [.0FC0.0020.0002.0072][.0000.0032.0002.0301] # LATIN SMALL LETTER R WITH ACUTE; QQCM
+0154 ; [.0FC0.0020.0008.0052][.0000.0032.0002.0301] # LATIN CAPITAL LETTER R WITH ACUTE; QQCM
+0159 ; [.0FC0.0020.0002.0072][.0000.0041.0002.030C] # LATIN SMALL LETTER R WITH CARON; QQCM
+0158 ; [.0FC0.0020.0008.0052][.0000.0041.0002.030C] # LATIN CAPITAL LETTER R WITH CARON; QQCM
+1E59 ; [.0FC0.0020.0002.0072][.0000.0052.0002.0307] # LATIN SMALL LETTER R WITH DOT ABOVE; QQCM
+1E58 ; [.0FC0.0020.0008.0052][.0000.0052.0002.0307] # LATIN CAPITAL LETTER R WITH DOT ABOVE; QQCM
+0157 ; [.0FC0.0020.0002.0072][.0000.0055.0002.0327] # LATIN SMALL LETTER R WITH CEDILLA; QQCM
+0156 ; [.0FC0.0020.0008.0052][.0000.0055.0002.0327] # LATIN CAPITAL LETTER R WITH CEDILLA; QQCM
+0211 ; [.0FC0.0020.0002.0072][.0000.0062.0002.030F] # LATIN SMALL LETTER R WITH DOUBLE GRAVE; QQCM
+0210 ; [.0FC0.0020.0008.0052][.0000.0062.0002.030F] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE; QQCM
+0213 ; [.0FC0.0020.0002.0072][.0000.0064.0002.0311] # LATIN SMALL LETTER R WITH INVERTED BREVE; QQCM
+0212 ; [.0FC0.0020.0008.0052][.0000.0064.0002.0311] # LATIN CAPITAL LETTER R WITH INVERTED BREVE; QQCM
+1E5B ; [.0FC0.0020.0002.0072][.0000.0079.0002.0323] # LATIN SMALL LETTER R WITH DOT BELOW; QQCM
+1E5A ; [.0FC0.0020.0008.0052][.0000.0079.0002.0323] # LATIN CAPITAL LETTER R WITH DOT BELOW; QQCM
+1E5D ; [.0FC0.0020.0002.0072][.0000.0079.0002.0323][.0000.005A.0002.0304] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON; QQCM
+1E5C ; [.0FC0.0020.0008.0052][.0000.0079.0002.0323][.0000.005A.0002.0304] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON; QQCM
+1E5F ; [.0FC0.0020.0002.0072][.0000.0089.0002.0331] # LATIN SMALL LETTER R WITH LINE BELOW; QQCM
+1E5E ; [.0FC0.0020.0008.0052][.0000.0089.0002.0331] # LATIN CAPITAL LETTER R WITH LINE BELOW; QQCM
+33AD ; [.0FC0.0020.001C.33AD][.0E33.0020.001C.33AD][.0E6D.0020.001F.33AD] # SQUARE RAD; QQKN
+33AE ; [.0FC0.0020.001C.33AE][.0E33.0020.001C.33AE][.0E6D.0020.001F.33AE][*0437.0020.001F.33AE][.0FEA.0020.001F.33AE] # SQUARE RAD OVER S; QQKN
+33AF ; [.0FC0.0020.001C.33AF][.0E33.0020.001C.33AF][.0E6D.0020.001F.33AF][*0437.0020.001F.33AF][.0FEA.0020.001F.33AF][.0E2B.0020.001F.33AF] # SQUARE RAD OVER S SQUARED; QQKN
+20A8 ; [.0FC0.0020.000A.20A8][.0FEA.0020.0004.20A8] # RUPEE SIGN; QQKN
+0280 ; [.0FC4.0020.0002.0280] # LATIN LETTER SMALL CAPITAL R
+01A6 ; [.0FC4.0020.0008.01A6] # LATIN LETTER YR
+1D19 ; [.0FC8.0020.0002.1D19] # LATIN LETTER SMALL CAPITAL REVERSED R
+0279 ; [.0FC9.0020.0002.0279] # LATIN SMALL LETTER TURNED R
+02B4 ; [.0FC9.0020.0014.02B4] # MODIFIER LETTER SMALL TURNED R; QQK
+1D1A ; [.0FCD.0020.0002.1D1A] # LATIN LETTER SMALL CAPITAL TURNED R
+027A ; [.0FCE.0020.0002.027A] # LATIN SMALL LETTER TURNED R WITH LONG LEG
+027B ; [.0FD2.0020.0002.027B] # LATIN SMALL LETTER TURNED R WITH HOOK
+02B5 ; [.0FD2.0020.0014.02B5] # MODIFIER LETTER SMALL TURNED R WITH HOOK; QQK
+027C ; [.0FD6.0020.0002.027C] # LATIN SMALL LETTER R WITH LONG LEG
+027D ; [.0FDA.0020.0002.027D] # LATIN SMALL LETTER R WITH TAIL
+027E ; [.0FDE.0020.0002.027E] # LATIN SMALL LETTER R WITH FISHHOOK
+027F ; [.0FE2.0020.0002.027F] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0281 ; [.0FE6.0020.0002.0281] # LATIN LETTER SMALL CAPITAL INVERTED R
+02B6 ; [.0FE6.0020.0014.02B6] # MODIFIER LETTER SMALL CAPITAL INVERTED R; QQK
+0073 ; [.0FEA.0020.0002.0073] # LATIN SMALL LETTER S
+FF53 ; [.0FEA.0020.0003.FF53] # FULLWIDTH LATIN SMALL LETTER S; QQK
+24AE ; [*0288.0020.0004.24AE][.0FEA.0020.0004.24AE][*0289.0020.001F.24AE] # PARENTHESIZED LATIN SMALL LETTER S; QQKN
+1D42C ; [.0FEA.0020.0005.1D42C] # MATHEMATICAL BOLD SMALL S; QQK
+1D460 ; [.0FEA.0020.0005.1D460] # MATHEMATICAL ITALIC SMALL S; QQK
+1D494 ; [.0FEA.0020.0005.1D494] # MATHEMATICAL BOLD ITALIC SMALL S; QQK
+1D4C8 ; [.0FEA.0020.0005.1D4C8] # MATHEMATICAL SCRIPT SMALL S; QQK
+1D4FC ; [.0FEA.0020.0005.1D4FC] # MATHEMATICAL BOLD SCRIPT SMALL S; QQK
+1D530 ; [.0FEA.0020.0005.1D530] # MATHEMATICAL FRAKTUR SMALL S; QQK
+1D564 ; [.0FEA.0020.0005.1D564] # MATHEMATICAL DOUBLE-STRUCK SMALL S; QQK
+1D598 ; [.0FEA.0020.0005.1D598] # MATHEMATICAL BOLD FRAKTUR SMALL S; QQK
+1D5CC ; [.0FEA.0020.0005.1D5CC] # MATHEMATICAL SANS-SERIF SMALL S; QQK
+1D600 ; [.0FEA.0020.0005.1D600] # MATHEMATICAL SANS-SERIF BOLD SMALL S; QQK
+1D634 ; [.0FEA.0020.0005.1D634] # MATHEMATICAL SANS-SERIF ITALIC SMALL S; QQK
+1D668 ; [.0FEA.0020.0005.1D668] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S; QQK
+1D69C ; [.0FEA.0020.0005.1D69C] # MATHEMATICAL MONOSPACE SMALL S; QQK
+24E2 ; [.0FEA.0020.0006.24E2] # CIRCLED LATIN SMALL LETTER S; QQK
+0053 ; [.0FEA.0020.0008.0053] # LATIN CAPITAL LETTER S
+FF33 ; [.0FEA.0020.0009.FF33] # FULLWIDTH LATIN CAPITAL LETTER S; QQK
+1D412 ; [.0FEA.0020.000B.1D412] # MATHEMATICAL BOLD CAPITAL S; QQK
+1D446 ; [.0FEA.0020.000B.1D446] # MATHEMATICAL ITALIC CAPITAL S; QQK
+1D47A ; [.0FEA.0020.000B.1D47A] # MATHEMATICAL BOLD ITALIC CAPITAL S; QQK
+1D4AE ; [.0FEA.0020.000B.1D4AE] # MATHEMATICAL SCRIPT CAPITAL S; QQK
+1D4E2 ; [.0FEA.0020.000B.1D4E2] # MATHEMATICAL BOLD SCRIPT CAPITAL S; QQK
+1D516 ; [.0FEA.0020.000B.1D516] # MATHEMATICAL FRAKTUR CAPITAL S; QQK
+1D54A ; [.0FEA.0020.000B.1D54A] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S; QQK
+1D57E ; [.0FEA.0020.000B.1D57E] # MATHEMATICAL BOLD FRAKTUR CAPITAL S; QQK
+1D5B2 ; [.0FEA.0020.000B.1D5B2] # MATHEMATICAL SANS-SERIF CAPITAL S; QQK
+1D5E6 ; [.0FEA.0020.000B.1D5E6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S; QQK
+1D61A ; [.0FEA.0020.000B.1D61A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S; QQK
+1D64E ; [.0FEA.0020.000B.1D64E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S; QQK
+1D682 ; [.0FEA.0020.000B.1D682] # MATHEMATICAL MONOSPACE CAPITAL S; QQK
+24C8 ; [.0FEA.0020.000C.24C8] # CIRCLED LATIN CAPITAL LETTER S; QQK
+02E2 ; [.0FEA.0020.0014.02E2] # MODIFIER LETTER SMALL S; QQK
+015B ; [.0FEA.0020.0002.0073][.0000.0032.0002.0301] # LATIN SMALL LETTER S WITH ACUTE; QQCM
+015A ; [.0FEA.0020.0008.0053][.0000.0032.0002.0301] # LATIN CAPITAL LETTER S WITH ACUTE; QQCM
+1E65 ; [.0FEA.0020.0002.0073][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE; QQCM
+1E64 ; [.0FEA.0020.0008.0053][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE; QQCM
+015D ; [.0FEA.0020.0002.0073][.0000.003C.0002.0302] # LATIN SMALL LETTER S WITH CIRCUMFLEX; QQCM
+015C ; [.0FEA.0020.0008.0053][.0000.003C.0002.0302] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX; QQCM
+0161 ; [.0FEA.0020.0002.0073][.0000.0041.0002.030C] # LATIN SMALL LETTER S WITH CARON; QQCM
+0160 ; [.0FEA.0020.0008.0053][.0000.0041.0002.030C] # LATIN CAPITAL LETTER S WITH CARON; QQCM
+1E67 ; [.0FEA.0020.0002.0073][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE; QQCM
+1E66 ; [.0FEA.0020.0008.0053][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE; QQCM
+1E61 ; [.0FEA.0020.0002.0073][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT ABOVE; QQCM
+1E60 ; [.0FEA.0020.0008.0053][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT ABOVE; QQCM
+015F ; [.0FEA.0020.0002.0073][.0000.0055.0002.0327] # LATIN SMALL LETTER S WITH CEDILLA; QQCM
+015E ; [.0FEA.0020.0008.0053][.0000.0055.0002.0327] # LATIN CAPITAL LETTER S WITH CEDILLA; QQCM
+1E63 ; [.0FEA.0020.0002.0073][.0000.0079.0002.0323] # LATIN SMALL LETTER S WITH DOT BELOW; QQCM
+1E62 ; [.0FEA.0020.0008.0053][.0000.0079.0002.0323] # LATIN CAPITAL LETTER S WITH DOT BELOW; QQCM
+1E69 ; [.0FEA.0020.0002.0073][.0000.0079.0002.0323][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE; QQCM
+1E68 ; [.0FEA.0020.0008.0053][.0000.0079.0002.0323][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE; QQCM
+0219 ; [.0FEA.0020.0002.0073][.0000.0080.0002.0326] # LATIN SMALL LETTER S WITH COMMA BELOW; QQCM
+0218 ; [.0FEA.0020.0008.0053][.0000.0080.0002.0326] # LATIN CAPITAL LETTER S WITH COMMA BELOW; QQCM
+017F ; [.0FEA.0020.0004.017F][.0000.015E.0004.017F] # LATIN SMALL LETTER LONG S; QQKN
+1E9B ; [.0FEA.0020.0004.1E9B][.0000.015E.0004.1E9B][.0000.0052.0002.1E9B] # LATIN SMALL LETTER LONG S WITH DOT ABOVE; QQKN
+2120 ; [.0FEA.0020.0014.2120][.0F5B.0020.0014.2120] # SERVICE MARK; QQKN
+33DB ; [.0FEA.0020.001C.33DB][.0FC0.0020.001C.33DB] # SQUARE SR; QQKN
+00DF ; [.0FEA.0020.0004.00DF][.0000.015D.0004.00DF][.0FEA.0020.001F.00DF] # LATIN SMALL LETTER SHARP S; QQKN
+FB06 ; [.0FEA.0020.0004.FB06][.1002.0020.0004.FB06] # LATIN SMALL LIGATURE ST; QQKN
+FB05 ; [.0FEA.0020.0004.FB05][.0000.015E.0004.FB05][.1002.0020.001F.FB05] # LATIN SMALL LIGATURE LONG S T; QQKN
+33DC ; [.0FEA.0020.001D.33DC][.1044.0020.001C.33DC] # SQUARE SV; QQKN
+0282 ; [.0FEE.0020.0002.0282] # LATIN SMALL LETTER S WITH HOOK
+0283 ; [.0FF2.0020.0002.0283] # LATIN SMALL LETTER ESH
+01A9 ; [.0FF2.0020.0008.01A9] # LATIN CAPITAL LETTER ESH
+01AA ; [.0FF6.0020.0002.01AA] # LATIN LETTER REVERSED ESH LOOP
+0285 ; [.0FFA.0020.0002.0285] # LATIN SMALL LETTER SQUAT REVERSED ESH
+0286 ; [.0FFE.0020.0002.0286] # LATIN SMALL LETTER ESH WITH CURL
+0074 ; [.1002.0020.0002.0074] # LATIN SMALL LETTER T
+FF54 ; [.1002.0020.0003.FF54] # FULLWIDTH LATIN SMALL LETTER T; QQK
+036D ; [.1002.0020.0004.036D] # COMBINING LATIN SMALL LETTER T; QQK
+24AF ; [*0288.0020.0004.24AF][.1002.0020.0004.24AF][*0289.0020.001F.24AF] # PARENTHESIZED LATIN SMALL LETTER T; QQKN
+1D42D ; [.1002.0020.0005.1D42D] # MATHEMATICAL BOLD SMALL T; QQK
+1D461 ; [.1002.0020.0005.1D461] # MATHEMATICAL ITALIC SMALL T; QQK
+1D495 ; [.1002.0020.0005.1D495] # MATHEMATICAL BOLD ITALIC SMALL T; QQK
+1D4C9 ; [.1002.0020.0005.1D4C9] # MATHEMATICAL SCRIPT SMALL T; QQK
+1D4FD ; [.1002.0020.0005.1D4FD] # MATHEMATICAL BOLD SCRIPT SMALL T; QQK
+1D531 ; [.1002.0020.0005.1D531] # MATHEMATICAL FRAKTUR SMALL T; QQK
+1D565 ; [.1002.0020.0005.1D565] # MATHEMATICAL DOUBLE-STRUCK SMALL T; QQK
+1D599 ; [.1002.0020.0005.1D599] # MATHEMATICAL BOLD FRAKTUR SMALL T; QQK
+1D5CD ; [.1002.0020.0005.1D5CD] # MATHEMATICAL SANS-SERIF SMALL T; QQK
+1D601 ; [.1002.0020.0005.1D601] # MATHEMATICAL SANS-SERIF BOLD SMALL T; QQK
+1D635 ; [.1002.0020.0005.1D635] # MATHEMATICAL SANS-SERIF ITALIC SMALL T; QQK
+1D669 ; [.1002.0020.0005.1D669] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T; QQK
+1D69D ; [.1002.0020.0005.1D69D] # MATHEMATICAL MONOSPACE SMALL T; QQK
+24E3 ; [.1002.0020.0006.24E3] # CIRCLED LATIN SMALL LETTER T; QQK
+0054 ; [.1002.0020.0008.0054] # LATIN CAPITAL LETTER T
+FF34 ; [.1002.0020.0009.FF34] # FULLWIDTH LATIN CAPITAL LETTER T; QQK
+1D413 ; [.1002.0020.000B.1D413] # MATHEMATICAL BOLD CAPITAL T; QQK
+1D447 ; [.1002.0020.000B.1D447] # MATHEMATICAL ITALIC CAPITAL T; QQK
+1D47B ; [.1002.0020.000B.1D47B] # MATHEMATICAL BOLD ITALIC CAPITAL T; QQK
+1D4AF ; [.1002.0020.000B.1D4AF] # MATHEMATICAL SCRIPT CAPITAL T; QQK
+1D4E3 ; [.1002.0020.000B.1D4E3] # MATHEMATICAL BOLD SCRIPT CAPITAL T; QQK
+1D517 ; [.1002.0020.000B.1D517] # MATHEMATICAL FRAKTUR CAPITAL T; QQK
+1D54B ; [.1002.0020.000B.1D54B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T; QQK
+1D57F ; [.1002.0020.000B.1D57F] # MATHEMATICAL BOLD FRAKTUR CAPITAL T; QQK
+1D5B3 ; [.1002.0020.000B.1D5B3] # MATHEMATICAL SANS-SERIF CAPITAL T; QQK
+1D5E7 ; [.1002.0020.000B.1D5E7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T; QQK
+1D61B ; [.1002.0020.000B.1D61B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T; QQK
+1D64F ; [.1002.0020.000B.1D64F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T; QQK
+1D683 ; [.1002.0020.000B.1D683] # MATHEMATICAL MONOSPACE CAPITAL T; QQK
+24C9 ; [.1002.0020.000C.24C9] # CIRCLED LATIN CAPITAL LETTER T; QQK
+1D40 ; [.1002.0020.0014.1D40] # MODIFIER LETTER CAPITAL T; QQK
+1D57 ; [.1002.0020.0014.1D57] # MODIFIER LETTER SMALL T; QQK
+0165 ; [.1002.0020.0002.0074][.0000.0041.0002.030C] # LATIN SMALL LETTER T WITH CARON; QQCM
+0164 ; [.1002.0020.0008.0054][.0000.0041.0002.030C] # LATIN CAPITAL LETTER T WITH CARON; QQCM
+1E97 ; [.1002.0020.0002.0074][.0000.0047.0002.0308] # LATIN SMALL LETTER T WITH DIAERESIS; QQCM
+1E6B ; [.1002.0020.0002.0074][.0000.0052.0002.0307] # LATIN SMALL LETTER T WITH DOT ABOVE; QQCM
+1E6A ; [.1002.0020.0008.0054][.0000.0052.0002.0307] # LATIN CAPITAL LETTER T WITH DOT ABOVE; QQCM
+0163 ; [.1002.0020.0002.0074][.0000.0055.0002.0327] # LATIN SMALL LETTER T WITH CEDILLA; QQCM
+0162 ; [.1002.0020.0008.0054][.0000.0055.0002.0327] # LATIN CAPITAL LETTER T WITH CEDILLA; QQCM
+1E6D ; [.1002.0020.0002.0074][.0000.0079.0002.0323] # LATIN SMALL LETTER T WITH DOT BELOW; QQCM
+1E6C ; [.1002.0020.0008.0054][.0000.0079.0002.0323] # LATIN CAPITAL LETTER T WITH DOT BELOW; QQCM
+021B ; [.1002.0020.0002.0074][.0000.0080.0002.0326] # LATIN SMALL LETTER T WITH COMMA BELOW; QQCM
+021A ; [.1002.0020.0008.0054][.0000.0080.0002.0326] # LATIN CAPITAL LETTER T WITH COMMA BELOW; QQCM
+1E71 ; [.1002.0020.0002.0074][.0000.0085.0002.032D] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW; QQCM
+1E70 ; [.1002.0020.0008.0054][.0000.0085.0002.032D] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW; QQCM
+1E6F ; [.1002.0020.0002.0074][.0000.0089.0002.0331] # LATIN SMALL LETTER T WITH LINE BELOW; QQCM
+1E6E ; [.1002.0020.0008.0054][.0000.0089.0002.0331] # LATIN CAPITAL LETTER T WITH LINE BELOW; QQCM
+02A8 ; [.1002.0020.0004.02A8][.0E69.0020.0004.02A8] # LATIN SMALL LETTER TC DIGRAPH WITH CURL; QQKN
+2121 ; [.1002.0020.000A.2121][.0E8B.0020.000A.2121][.0F2E.0020.001F.2121] # TELEPHONE SIGN; QQKN
+3394 ; [.1002.0020.001D.3394][.0EE1.0020.001D.3394][.106A.0020.001F.3394] # SQUARE THZ; QQKN
+2122 ; [.1002.0020.0014.2122][.0F5B.0020.0014.2122] # TRADE MARK SIGN; QQKN
+01BE ; [.1002.0020.0004.01BE][.0FEA.0020.0004.01BE] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE; QQKN
+02A6 ; [.1002.0020.0004.02A6][.0FEA.0020.0004.02A6] # LATIN SMALL LETTER TS DIGRAPH; QQKN
+02A7 ; [.1002.0020.0004.02A7][.0FF2.0020.0004.02A7] # LATIN SMALL LETTER TESH DIGRAPH; QQKN
+1D1B ; [.1006.0020.0002.1D1B] # LATIN LETTER SMALL CAPITAL T
+0167 ; [.1007.0020.0002.0167] # LATIN SMALL LETTER T WITH STROKE
+0166 ; [.1007.0020.0008.0166] # LATIN CAPITAL LETTER T WITH STROKE
+01AB ; [.100B.0020.0002.01AB] # LATIN SMALL LETTER T WITH PALATAL HOOK
+01AD ; [.100F.0020.0002.01AD] # LATIN SMALL LETTER T WITH HOOK
+01AC ; [.100F.0020.0008.01AC] # LATIN CAPITAL LETTER T WITH HOOK
+0288 ; [.1013.0020.0002.0288] # LATIN SMALL LETTER T WITH RETROFLEX HOOK
+01AE ; [.1013.0020.0008.01AE] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+0236 ; [.1017.0020.0002.0236] # LATIN SMALL LETTER T WITH CURL
+0287 ; [.101B.0020.0002.0287] # LATIN SMALL LETTER TURNED T
+0075 ; [.101F.0020.0002.0075] # LATIN SMALL LETTER U
+FF55 ; [.101F.0020.0003.FF55] # FULLWIDTH LATIN SMALL LETTER U; QQK
+0367 ; [.101F.0020.0004.0367] # COMBINING LATIN SMALL LETTER U; QQK
+24B0 ; [*0288.0020.0004.24B0][.101F.0020.0004.24B0][*0289.0020.001F.24B0] # PARENTHESIZED LATIN SMALL LETTER U; QQKN
+1D42E ; [.101F.0020.0005.1D42E] # MATHEMATICAL BOLD SMALL U; QQK
+1D462 ; [.101F.0020.0005.1D462] # MATHEMATICAL ITALIC SMALL U; QQK
+1D496 ; [.101F.0020.0005.1D496] # MATHEMATICAL BOLD ITALIC SMALL U; QQK
+1D4CA ; [.101F.0020.0005.1D4CA] # MATHEMATICAL SCRIPT SMALL U; QQK
+1D4FE ; [.101F.0020.0005.1D4FE] # MATHEMATICAL BOLD SCRIPT SMALL U; QQK
+1D532 ; [.101F.0020.0005.1D532] # MATHEMATICAL FRAKTUR SMALL U; QQK
+1D566 ; [.101F.0020.0005.1D566] # MATHEMATICAL DOUBLE-STRUCK SMALL U; QQK
+1D59A ; [.101F.0020.0005.1D59A] # MATHEMATICAL BOLD FRAKTUR SMALL U; QQK
+1D5CE ; [.101F.0020.0005.1D5CE] # MATHEMATICAL SANS-SERIF SMALL U; QQK
+1D602 ; [.101F.0020.0005.1D602] # MATHEMATICAL SANS-SERIF BOLD SMALL U; QQK
+1D636 ; [.101F.0020.0005.1D636] # MATHEMATICAL SANS-SERIF ITALIC SMALL U; QQK
+1D66A ; [.101F.0020.0005.1D66A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U; QQK
+1D69E ; [.101F.0020.0005.1D69E] # MATHEMATICAL MONOSPACE SMALL U; QQK
+24E4 ; [.101F.0020.0006.24E4] # CIRCLED LATIN SMALL LETTER U; QQK
+0055 ; [.101F.0020.0008.0055] # LATIN CAPITAL LETTER U
+FF35 ; [.101F.0020.0009.FF35] # FULLWIDTH LATIN CAPITAL LETTER U; QQK
+1D414 ; [.101F.0020.000B.1D414] # MATHEMATICAL BOLD CAPITAL U; QQK
+1D448 ; [.101F.0020.000B.1D448] # MATHEMATICAL ITALIC CAPITAL U; QQK
+1D47C ; [.101F.0020.000B.1D47C] # MATHEMATICAL BOLD ITALIC CAPITAL U; QQK
+1D4B0 ; [.101F.0020.000B.1D4B0] # MATHEMATICAL SCRIPT CAPITAL U; QQK
+1D4E4 ; [.101F.0020.000B.1D4E4] # MATHEMATICAL BOLD SCRIPT CAPITAL U; QQK
+1D518 ; [.101F.0020.000B.1D518] # MATHEMATICAL FRAKTUR CAPITAL U; QQK
+1D54C ; [.101F.0020.000B.1D54C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U; QQK
+1D580 ; [.101F.0020.000B.1D580] # MATHEMATICAL BOLD FRAKTUR CAPITAL U; QQK
+1D5B4 ; [.101F.0020.000B.1D5B4] # MATHEMATICAL SANS-SERIF CAPITAL U; QQK
+1D5E8 ; [.101F.0020.000B.1D5E8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U; QQK
+1D61C ; [.101F.0020.000B.1D61C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U; QQK
+1D650 ; [.101F.0020.000B.1D650] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U; QQK
+1D684 ; [.101F.0020.000B.1D684] # MATHEMATICAL MONOSPACE CAPITAL U; QQK
+24CA ; [.101F.0020.000C.24CA] # CIRCLED LATIN CAPITAL LETTER U; QQK
+1D41 ; [.101F.0020.0014.1D41] # MODIFIER LETTER CAPITAL U; QQK
+1D58 ; [.101F.0020.0014.1D58] # MODIFIER LETTER SMALL U; QQK
+1D64 ; [.101F.0020.0015.1D64] # LATIN SUBSCRIPT SMALL LETTER U; QQK
+00FA ; [.101F.0020.0002.0075][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH ACUTE; QQCM
+00DA ; [.101F.0020.0008.0055][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH ACUTE; QQCM
+00F9 ; [.101F.0020.0002.0075][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH GRAVE; QQCM
+00D9 ; [.101F.0020.0008.0055][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH GRAVE; QQCM
+016D ; [.101F.0020.0002.0075][.0000.0037.0002.0306] # LATIN SMALL LETTER U WITH BREVE; QQCM
+016C ; [.101F.0020.0008.0055][.0000.0037.0002.0306] # LATIN CAPITAL LETTER U WITH BREVE; QQCM
+00FB ; [.101F.0020.0002.0075][.0000.003C.0002.0302] # LATIN SMALL LETTER U WITH CIRCUMFLEX; QQCM
+00DB ; [.101F.0020.0008.0055][.0000.003C.0002.0302] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX; QQCM
+01D4 ; [.101F.0020.0002.0075][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH CARON; QQCM
+01D3 ; [.101F.0020.0008.0055][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH CARON; QQCM
+016F ; [.101F.0020.0002.0075][.0000.0043.0002.030A] # LATIN SMALL LETTER U WITH RING ABOVE; QQCM
+016E ; [.101F.0020.0008.0055][.0000.0043.0002.030A] # LATIN CAPITAL LETTER U WITH RING ABOVE; QQCM
+00FC ; [.101F.0020.0002.0075][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH DIAERESIS; QQCM
+00DC ; [.101F.0020.0008.0055][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH DIAERESIS; QQCM
+01D8 ; [.101F.0020.0002.0075][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE; QQCM
+01D7 ; [.101F.0020.0008.0055][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE; QQCM
+01DC ; [.101F.0020.0002.0075][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE; QQCM
+01DB ; [.101F.0020.0008.0055][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE; QQCM
+01DA ; [.101F.0020.0002.0075][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON; QQCM
+01D9 ; [.101F.0020.0008.0055][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON; QQCM
+01D6 ; [.101F.0020.0002.0075][.0000.0047.0002.0308][.0000.005A.0002.0304] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON; QQCM
+01D5 ; [.101F.0020.0008.0055][.0000.0047.0002.0308][.0000.005A.0002.0304] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON; QQCM
+0171 ; [.101F.0020.0002.0075][.0000.004D.0002.030B] # LATIN SMALL LETTER U WITH DOUBLE ACUTE; QQCM
+0170 ; [.101F.0020.0008.0055][.0000.004D.0002.030B] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE; QQCM
+0169 ; [.101F.0020.0002.0075][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH TILDE; QQCM
+0168 ; [.101F.0020.0008.0055][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH TILDE; QQCM
+1E79 ; [.101F.0020.0002.0075][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH TILDE AND ACUTE; QQCM
+1E78 ; [.101F.0020.0008.0055][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE; QQCM
+0173 ; [.101F.0020.0002.0075][.0000.0058.0002.0328] # LATIN SMALL LETTER U WITH OGONEK; QQCM
+0172 ; [.101F.0020.0008.0055][.0000.0058.0002.0328] # LATIN CAPITAL LETTER U WITH OGONEK; QQCM
+016B ; [.101F.0020.0002.0075][.0000.005A.0002.0304] # LATIN SMALL LETTER U WITH MACRON; QQCM
+016A ; [.101F.0020.0008.0055][.0000.005A.0002.0304] # LATIN CAPITAL LETTER U WITH MACRON; QQCM
+1E7B ; [.101F.0020.0002.0075][.0000.005A.0002.0304][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS; QQCM
+1E7A ; [.101F.0020.0008.0055][.0000.005A.0002.0304][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS; QQCM
+1EE7 ; [.101F.0020.0002.0075][.0000.005F.0002.0309] # LATIN SMALL LETTER U WITH HOOK ABOVE; QQCM
+1EE6 ; [.101F.0020.0008.0055][.0000.005F.0002.0309] # LATIN CAPITAL LETTER U WITH HOOK ABOVE; QQCM
+0215 ; [.101F.0020.0002.0075][.0000.0062.0002.030F] # LATIN SMALL LETTER U WITH DOUBLE GRAVE; QQCM
+0214 ; [.101F.0020.0008.0055][.0000.0062.0002.030F] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE; QQCM
+0217 ; [.101F.0020.0002.0075][.0000.0064.0002.0311] # LATIN SMALL LETTER U WITH INVERTED BREVE; QQCM
+0216 ; [.101F.0020.0008.0055][.0000.0064.0002.0311] # LATIN CAPITAL LETTER U WITH INVERTED BREVE; QQCM
+01B0 ; [.101F.0020.0002.0075][.0000.006C.0002.031B] # LATIN SMALL LETTER U WITH HORN; QQCM
+01AF ; [.101F.0020.0008.0055][.0000.006C.0002.031B] # LATIN CAPITAL LETTER U WITH HORN; QQCM
+1EE9 ; [.101F.0020.0002.0075][.0000.006C.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH HORN AND ACUTE; QQCM
+1EE8 ; [.101F.0020.0008.0055][.0000.006C.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE; QQCM
+1EEB ; [.101F.0020.0002.0075][.0000.006C.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH HORN AND GRAVE; QQCM
+1EEA ; [.101F.0020.0008.0055][.0000.006C.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE; QQCM
+1EEF ; [.101F.0020.0002.0075][.0000.006C.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH HORN AND TILDE; QQCM
+1EEE ; [.101F.0020.0008.0055][.0000.006C.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH HORN AND TILDE; QQCM
+1EED ; [.101F.0020.0002.0075][.0000.006C.0002.031B][.0000.005F.0002.0309] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE; QQCM
+1EEC ; [.101F.0020.0008.0055][.0000.006C.0002.031B][.0000.005F.0002.0309] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE; QQCM
+1EF1 ; [.101F.0020.0002.0075][.0000.006C.0002.031B][.0000.0079.0002.0323] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW; QQCM
+1EF0 ; [.101F.0020.0008.0055][.0000.006C.0002.031B][.0000.0079.0002.0323] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW; QQCM
+1EE5 ; [.101F.0020.0002.0075][.0000.0079.0002.0323] # LATIN SMALL LETTER U WITH DOT BELOW; QQCM
+1EE4 ; [.101F.0020.0008.0055][.0000.0079.0002.0323] # LATIN CAPITAL LETTER U WITH DOT BELOW; QQCM
+1E73 ; [.101F.0020.0002.0075][.0000.007E.0002.0324] # LATIN SMALL LETTER U WITH DIAERESIS BELOW; QQCM
+1E72 ; [.101F.0020.0008.0055][.0000.007E.0002.0324] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW; QQCM
+1E77 ; [.101F.0020.0002.0075][.0000.0085.0002.032D] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW; QQCM
+1E76 ; [.101F.0020.0008.0055][.0000.0085.0002.032D] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW; QQCM
+1E75 ; [.101F.0020.0002.0075][.0000.0088.0002.0330] # LATIN SMALL LETTER U WITH TILDE BELOW; QQCM
+1E74 ; [.101F.0020.0008.0055][.0000.0088.0002.0330] # LATIN CAPITAL LETTER U WITH TILDE BELOW; QQCM
+1D1C ; [.1023.0020.0002.1D1C] # LATIN LETTER SMALL CAPITAL U
+1D1D ; [.1024.0020.0002.1D1D] # LATIN SMALL LETTER SIDEWAYS U
+1D59 ; [.1024.0020.0014.1D59] # MODIFIER LETTER SMALL SIDEWAYS U; QQK
+1D1E ; [.1025.0020.0002.1D1E] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D6B ; [.1026.0020.0002.1D6B] # LATIN SMALL LETTER UE
+0289 ; [.1027.0020.0002.0289] # LATIN SMALL LETTER U BAR
+0265 ; [.102B.0020.0002.0265] # LATIN SMALL LETTER TURNED H
+02AE ; [.102F.0020.0002.02AE] # LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF ; [.1033.0020.0002.02AF] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+026F ; [.1037.0020.0002.026F] # LATIN SMALL LETTER TURNED M
+019C ; [.1037.0020.0008.019C] # LATIN CAPITAL LETTER TURNED M
+1D5A ; [.1037.0020.0014.1D5A] # MODIFIER LETTER SMALL TURNED M; QQK
+1D1F ; [.103B.0020.0002.1D1F] # LATIN SMALL LETTER SIDEWAYS TURNED M
+0270 ; [.103C.0020.0002.0270] # LATIN SMALL LETTER TURNED M WITH LONG LEG
+028A ; [.1040.0020.0002.028A] # LATIN SMALL LETTER UPSILON
+01B1 ; [.1040.0020.0008.01B1] # LATIN CAPITAL LETTER UPSILON
+0076 ; [.1044.0020.0002.0076] # LATIN SMALL LETTER V
+FF56 ; [.1044.0020.0003.FF56] # FULLWIDTH LATIN SMALL LETTER V; QQK
+036E ; [.1044.0020.0004.036E] # COMBINING LATIN SMALL LETTER V; QQK
+2174 ; [.1044.0020.0004.2174] # SMALL ROMAN NUMERAL FIVE; QQK
+24B1 ; [*0288.0020.0004.24B1][.1044.0020.0004.24B1][*0289.0020.001F.24B1] # PARENTHESIZED LATIN SMALL LETTER V; QQKN
+1D42F ; [.1044.0020.0005.1D42F] # MATHEMATICAL BOLD SMALL V; QQK
+1D463 ; [.1044.0020.0005.1D463] # MATHEMATICAL ITALIC SMALL V; QQK
+1D497 ; [.1044.0020.0005.1D497] # MATHEMATICAL BOLD ITALIC SMALL V; QQK
+1D4CB ; [.1044.0020.0005.1D4CB] # MATHEMATICAL SCRIPT SMALL V; QQK
+1D4FF ; [.1044.0020.0005.1D4FF] # MATHEMATICAL BOLD SCRIPT SMALL V; QQK
+1D533 ; [.1044.0020.0005.1D533] # MATHEMATICAL FRAKTUR SMALL V; QQK
+1D567 ; [.1044.0020.0005.1D567] # MATHEMATICAL DOUBLE-STRUCK SMALL V; QQK
+1D59B ; [.1044.0020.0005.1D59B] # MATHEMATICAL BOLD FRAKTUR SMALL V; QQK
+1D5CF ; [.1044.0020.0005.1D5CF] # MATHEMATICAL SANS-SERIF SMALL V; QQK
+1D603 ; [.1044.0020.0005.1D603] # MATHEMATICAL SANS-SERIF BOLD SMALL V; QQK
+1D637 ; [.1044.0020.0005.1D637] # MATHEMATICAL SANS-SERIF ITALIC SMALL V; QQK
+1D66B ; [.1044.0020.0005.1D66B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V; QQK
+1D69F ; [.1044.0020.0005.1D69F] # MATHEMATICAL MONOSPACE SMALL V; QQK
+24E5 ; [.1044.0020.0006.24E5] # CIRCLED LATIN SMALL LETTER V; QQK
+0056 ; [.1044.0020.0008.0056] # LATIN CAPITAL LETTER V
+FF36 ; [.1044.0020.0009.FF36] # FULLWIDTH LATIN CAPITAL LETTER V; QQK
+2164 ; [.1044.0020.000A.2164] # ROMAN NUMERAL FIVE; QQK
+1D415 ; [.1044.0020.000B.1D415] # MATHEMATICAL BOLD CAPITAL V; QQK
+1D449 ; [.1044.0020.000B.1D449] # MATHEMATICAL ITALIC CAPITAL V; QQK
+1D47D ; [.1044.0020.000B.1D47D] # MATHEMATICAL BOLD ITALIC CAPITAL V; QQK
+1D4B1 ; [.1044.0020.000B.1D4B1] # MATHEMATICAL SCRIPT CAPITAL V; QQK
+1D4E5 ; [.1044.0020.000B.1D4E5] # MATHEMATICAL BOLD SCRIPT CAPITAL V; QQK
+1D519 ; [.1044.0020.000B.1D519] # MATHEMATICAL FRAKTUR CAPITAL V; QQK
+1D54D ; [.1044.0020.000B.1D54D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V; QQK
+1D581 ; [.1044.0020.000B.1D581] # MATHEMATICAL BOLD FRAKTUR CAPITAL V; QQK
+1D5B5 ; [.1044.0020.000B.1D5B5] # MATHEMATICAL SANS-SERIF CAPITAL V; QQK
+1D5E9 ; [.1044.0020.000B.1D5E9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V; QQK
+1D61D ; [.1044.0020.000B.1D61D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V; QQK
+1D651 ; [.1044.0020.000B.1D651] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V; QQK
+1D685 ; [.1044.0020.000B.1D685] # MATHEMATICAL MONOSPACE CAPITAL V; QQK
+24CB ; [.1044.0020.000C.24CB] # CIRCLED LATIN CAPITAL LETTER V; QQK
+1D5B ; [.1044.0020.0014.1D5B] # MODIFIER LETTER SMALL V; QQK
+1D65 ; [.1044.0020.0015.1D65] # LATIN SUBSCRIPT SMALL LETTER V; QQK
+1E7D ; [.1044.0020.0002.0076][.0000.004E.0002.0303] # LATIN SMALL LETTER V WITH TILDE; QQCM
+1E7C ; [.1044.0020.0008.0056][.0000.004E.0002.0303] # LATIN CAPITAL LETTER V WITH TILDE; QQCM
+1E7F ; [.1044.0020.0002.0076][.0000.0079.0002.0323] # LATIN SMALL LETTER V WITH DOT BELOW; QQCM
+1E7E ; [.1044.0020.0008.0056][.0000.0079.0002.0323] # LATIN CAPITAL LETTER V WITH DOT BELOW; QQCM
+2175 ; [.1044.0020.0004.2175][.0EFB.0020.0004.2175] # SMALL ROMAN NUMERAL SIX; QQKN
+2165 ; [.1044.0020.000A.2165][.0EFB.0020.000A.2165] # ROMAN NUMERAL SIX; QQKN
+2176 ; [.1044.0020.0004.2176][.0EFB.0020.0004.2176][.0EFB.0020.001F.2176] # SMALL ROMAN NUMERAL SEVEN; QQKN
+2166 ; [.1044.0020.000A.2166][.0EFB.0020.000A.2166][.0EFB.0020.001F.2166] # ROMAN NUMERAL SEVEN; QQKN
+2177 ; [.1044.0020.0004.2177][.0EFB.0020.0004.2177][.0EFB.0020.001F.2177][.0EFB.0020.001F.2177] # SMALL ROMAN NUMERAL EIGHT; QQKN
+2167 ; [.1044.0020.000A.2167][.0EFB.0020.000A.2167][.0EFB.0020.001F.2167][.0EFB.0020.001F.2167] # ROMAN NUMERAL EIGHT; QQKN
+33DE ; [.1044.0020.001D.33DE][*0437.0020.001C.33DE][.0F5B.0020.001F.33DE] # SQUARE V OVER M; QQKN
+1D20 ; [.1048.0020.0002.1D20] # LATIN LETTER SMALL CAPITAL V
+028B ; [.1049.0020.0002.028B] # LATIN SMALL LETTER V WITH HOOK
+01B2 ; [.1049.0020.0008.01B2] # LATIN CAPITAL LETTER V WITH HOOK
+028C ; [.104D.0020.0002.028C] # LATIN SMALL LETTER TURNED V
+0077 ; [.1051.0020.0002.0077] # LATIN SMALL LETTER W
+FF57 ; [.1051.0020.0003.FF57] # FULLWIDTH LATIN SMALL LETTER W; QQK
+24B2 ; [*0288.0020.0004.24B2][.1051.0020.0004.24B2][*0289.0020.001F.24B2] # PARENTHESIZED LATIN SMALL LETTER W; QQKN
+1D430 ; [.1051.0020.0005.1D430] # MATHEMATICAL BOLD SMALL W; QQK
+1D464 ; [.1051.0020.0005.1D464] # MATHEMATICAL ITALIC SMALL W; QQK
+1D498 ; [.1051.0020.0005.1D498] # MATHEMATICAL BOLD ITALIC SMALL W; QQK
+1D4CC ; [.1051.0020.0005.1D4CC] # MATHEMATICAL SCRIPT SMALL W; QQK
+1D500 ; [.1051.0020.0005.1D500] # MATHEMATICAL BOLD SCRIPT SMALL W; QQK
+1D534 ; [.1051.0020.0005.1D534] # MATHEMATICAL FRAKTUR SMALL W; QQK
+1D568 ; [.1051.0020.0005.1D568] # MATHEMATICAL DOUBLE-STRUCK SMALL W; QQK
+1D59C ; [.1051.0020.0005.1D59C] # MATHEMATICAL BOLD FRAKTUR SMALL W; QQK
+1D5D0 ; [.1051.0020.0005.1D5D0] # MATHEMATICAL SANS-SERIF SMALL W; QQK
+1D604 ; [.1051.0020.0005.1D604] # MATHEMATICAL SANS-SERIF BOLD SMALL W; QQK
+1D638 ; [.1051.0020.0005.1D638] # MATHEMATICAL SANS-SERIF ITALIC SMALL W; QQK
+1D66C ; [.1051.0020.0005.1D66C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W; QQK
+1D6A0 ; [.1051.0020.0005.1D6A0] # MATHEMATICAL MONOSPACE SMALL W; QQK
+24E6 ; [.1051.0020.0006.24E6] # CIRCLED LATIN SMALL LETTER W; QQK
+0057 ; [.1051.0020.0008.0057] # LATIN CAPITAL LETTER W
+FF37 ; [.1051.0020.0009.FF37] # FULLWIDTH LATIN CAPITAL LETTER W; QQK
+1D416 ; [.1051.0020.000B.1D416] # MATHEMATICAL BOLD CAPITAL W; QQK
+1D44A ; [.1051.0020.000B.1D44A] # MATHEMATICAL ITALIC CAPITAL W; QQK
+1D47E ; [.1051.0020.000B.1D47E] # MATHEMATICAL BOLD ITALIC CAPITAL W; QQK
+1D4B2 ; [.1051.0020.000B.1D4B2] # MATHEMATICAL SCRIPT CAPITAL W; QQK
+1D4E6 ; [.1051.0020.000B.1D4E6] # MATHEMATICAL BOLD SCRIPT CAPITAL W; QQK
+1D51A ; [.1051.0020.000B.1D51A] # MATHEMATICAL FRAKTUR CAPITAL W; QQK
+1D54E ; [.1051.0020.000B.1D54E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W; QQK
+1D582 ; [.1051.0020.000B.1D582] # MATHEMATICAL BOLD FRAKTUR CAPITAL W; QQK
+1D5B6 ; [.1051.0020.000B.1D5B6] # MATHEMATICAL SANS-SERIF CAPITAL W; QQK
+1D5EA ; [.1051.0020.000B.1D5EA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W; QQK
+1D61E ; [.1051.0020.000B.1D61E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W; QQK
+1D652 ; [.1051.0020.000B.1D652] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W; QQK
+1D686 ; [.1051.0020.000B.1D686] # MATHEMATICAL MONOSPACE CAPITAL W; QQK
+24CC ; [.1051.0020.000C.24CC] # CIRCLED LATIN CAPITAL LETTER W; QQK
+02B7 ; [.1051.0020.0014.02B7] # MODIFIER LETTER SMALL W; QQK
+1D42 ; [.1051.0020.0014.1D42] # MODIFIER LETTER CAPITAL W; QQK
+1E83 ; [.1051.0020.0002.0077][.0000.0032.0002.0301] # LATIN SMALL LETTER W WITH ACUTE; QQCM
+1E82 ; [.1051.0020.0008.0057][.0000.0032.0002.0301] # LATIN CAPITAL LETTER W WITH ACUTE; QQCM
+1E81 ; [.1051.0020.0002.0077][.0000.0035.0002.0300] # LATIN SMALL LETTER W WITH GRAVE; QQCM
+1E80 ; [.1051.0020.0008.0057][.0000.0035.0002.0300] # LATIN CAPITAL LETTER W WITH GRAVE; QQCM
+0175 ; [.1051.0020.0002.0077][.0000.003C.0002.0302] # LATIN SMALL LETTER W WITH CIRCUMFLEX; QQCM
+0174 ; [.1051.0020.0008.0057][.0000.003C.0002.0302] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX; QQCM
+1E98 ; [.1051.0020.0002.0077][.0000.0043.0002.030A] # LATIN SMALL LETTER W WITH RING ABOVE; QQCM
+1E85 ; [.1051.0020.0002.0077][.0000.0047.0002.0308] # LATIN SMALL LETTER W WITH DIAERESIS; QQCM
+1E84 ; [.1051.0020.0008.0057][.0000.0047.0002.0308] # LATIN CAPITAL LETTER W WITH DIAERESIS; QQCM
+1E87 ; [.1051.0020.0002.0077][.0000.0052.0002.0307] # LATIN SMALL LETTER W WITH DOT ABOVE; QQCM
+1E86 ; [.1051.0020.0008.0057][.0000.0052.0002.0307] # LATIN CAPITAL LETTER W WITH DOT ABOVE; QQCM
+1E89 ; [.1051.0020.0002.0077][.0000.0079.0002.0323] # LATIN SMALL LETTER W WITH DOT BELOW; QQCM
+1E88 ; [.1051.0020.0008.0057][.0000.0079.0002.0323] # LATIN CAPITAL LETTER W WITH DOT BELOW; QQCM
+33DD ; [.1051.0020.001D.33DD][.0E4A.0020.001C.33DD] # SQUARE WB; QQKN
+1D21 ; [.1055.0020.0002.1D21] # LATIN LETTER SMALL CAPITAL W
+028D ; [.1056.0020.0002.028D] # LATIN SMALL LETTER TURNED W
+0078 ; [.105A.0020.0002.0078] # LATIN SMALL LETTER X
+FF58 ; [.105A.0020.0003.FF58] # FULLWIDTH LATIN SMALL LETTER X; QQK
+036F ; [.105A.0020.0004.036F] # COMBINING LATIN SMALL LETTER X; QQK
+2179 ; [.105A.0020.0004.2179] # SMALL ROMAN NUMERAL TEN; QQK
+24B3 ; [*0288.0020.0004.24B3][.105A.0020.0004.24B3][*0289.0020.001F.24B3] # PARENTHESIZED LATIN SMALL LETTER X; QQKN
+1D431 ; [.105A.0020.0005.1D431] # MATHEMATICAL BOLD SMALL X; QQK
+1D465 ; [.105A.0020.0005.1D465] # MATHEMATICAL ITALIC SMALL X; QQK
+1D499 ; [.105A.0020.0005.1D499] # MATHEMATICAL BOLD ITALIC SMALL X; QQK
+1D4CD ; [.105A.0020.0005.1D4CD] # MATHEMATICAL SCRIPT SMALL X; QQK
+1D501 ; [.105A.0020.0005.1D501] # MATHEMATICAL BOLD SCRIPT SMALL X; QQK
+1D535 ; [.105A.0020.0005.1D535] # MATHEMATICAL FRAKTUR SMALL X; QQK
+1D569 ; [.105A.0020.0005.1D569] # MATHEMATICAL DOUBLE-STRUCK SMALL X; QQK
+1D59D ; [.105A.0020.0005.1D59D] # MATHEMATICAL BOLD FRAKTUR SMALL X; QQK
+1D5D1 ; [.105A.0020.0005.1D5D1] # MATHEMATICAL SANS-SERIF SMALL X; QQK
+1D605 ; [.105A.0020.0005.1D605] # MATHEMATICAL SANS-SERIF BOLD SMALL X; QQK
+1D639 ; [.105A.0020.0005.1D639] # MATHEMATICAL SANS-SERIF ITALIC SMALL X; QQK
+1D66D ; [.105A.0020.0005.1D66D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X; QQK
+1D6A1 ; [.105A.0020.0005.1D6A1] # MATHEMATICAL MONOSPACE SMALL X; QQK
+24E7 ; [.105A.0020.0006.24E7] # CIRCLED LATIN SMALL LETTER X; QQK
+0058 ; [.105A.0020.0008.0058] # LATIN CAPITAL LETTER X
+FF38 ; [.105A.0020.0009.FF38] # FULLWIDTH LATIN CAPITAL LETTER X; QQK
+2169 ; [.105A.0020.000A.2169] # ROMAN NUMERAL TEN; QQK
+1D417 ; [.105A.0020.000B.1D417] # MATHEMATICAL BOLD CAPITAL X; QQK
+1D44B ; [.105A.0020.000B.1D44B] # MATHEMATICAL ITALIC CAPITAL X; QQK
+1D47F ; [.105A.0020.000B.1D47F] # MATHEMATICAL BOLD ITALIC CAPITAL X; QQK
+1D4B3 ; [.105A.0020.000B.1D4B3] # MATHEMATICAL SCRIPT CAPITAL X; QQK
+1D4E7 ; [.105A.0020.000B.1D4E7] # MATHEMATICAL BOLD SCRIPT CAPITAL X; QQK
+1D51B ; [.105A.0020.000B.1D51B] # MATHEMATICAL FRAKTUR CAPITAL X; QQK
+1D54F ; [.105A.0020.000B.1D54F] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X; QQK
+1D583 ; [.105A.0020.000B.1D583] # MATHEMATICAL BOLD FRAKTUR CAPITAL X; QQK
+1D5B7 ; [.105A.0020.000B.1D5B7] # MATHEMATICAL SANS-SERIF CAPITAL X; QQK
+1D5EB ; [.105A.0020.000B.1D5EB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X; QQK
+1D61F ; [.105A.0020.000B.1D61F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X; QQK
+1D653 ; [.105A.0020.000B.1D653] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X; QQK
+1D687 ; [.105A.0020.000B.1D687] # MATHEMATICAL MONOSPACE CAPITAL X; QQK
+24CD ; [.105A.0020.000C.24CD] # CIRCLED LATIN CAPITAL LETTER X; QQK
+02E3 ; [.105A.0020.0014.02E3] # MODIFIER LETTER SMALL X; QQK
+1E8D ; [.105A.0020.0002.0078][.0000.0047.0002.0308] # LATIN SMALL LETTER X WITH DIAERESIS; QQCM
+1E8C ; [.105A.0020.0008.0058][.0000.0047.0002.0308] # LATIN CAPITAL LETTER X WITH DIAERESIS; QQCM
+1E8B ; [.105A.0020.0002.0078][.0000.0052.0002.0307] # LATIN SMALL LETTER X WITH DOT ABOVE; QQCM
+1E8A ; [.105A.0020.0008.0058][.0000.0052.0002.0307] # LATIN CAPITAL LETTER X WITH DOT ABOVE; QQCM
+217A ; [.105A.0020.0004.217A][.0EFB.0020.0004.217A] # SMALL ROMAN NUMERAL ELEVEN; QQKN
+216A ; [.105A.0020.000A.216A][.0EFB.0020.000A.216A] # ROMAN NUMERAL ELEVEN; QQKN
+217B ; [.105A.0020.0004.217B][.0EFB.0020.0004.217B][.0EFB.0020.001F.217B] # SMALL ROMAN NUMERAL TWELVE; QQKN
+216B ; [.105A.0020.000A.216B][.0EFB.0020.000A.216B][.0EFB.0020.001F.216B] # ROMAN NUMERAL TWELVE; QQKN
+0079 ; [.105E.0020.0002.0079] # LATIN SMALL LETTER Y
+FF59 ; [.105E.0020.0003.FF59] # FULLWIDTH LATIN SMALL LETTER Y; QQK
+24B4 ; [*0288.0020.0004.24B4][.105E.0020.0004.24B4][*0289.0020.001F.24B4] # PARENTHESIZED LATIN SMALL LETTER Y; QQKN
+1D432 ; [.105E.0020.0005.1D432] # MATHEMATICAL BOLD SMALL Y; QQK
+1D466 ; [.105E.0020.0005.1D466] # MATHEMATICAL ITALIC SMALL Y; QQK
+1D49A ; [.105E.0020.0005.1D49A] # MATHEMATICAL BOLD ITALIC SMALL Y; QQK
+1D4CE ; [.105E.0020.0005.1D4CE] # MATHEMATICAL SCRIPT SMALL Y; QQK
+1D502 ; [.105E.0020.0005.1D502] # MATHEMATICAL BOLD SCRIPT SMALL Y; QQK
+1D536 ; [.105E.0020.0005.1D536] # MATHEMATICAL FRAKTUR SMALL Y; QQK
+1D56A ; [.105E.0020.0005.1D56A] # MATHEMATICAL DOUBLE-STRUCK SMALL Y; QQK
+1D59E ; [.105E.0020.0005.1D59E] # MATHEMATICAL BOLD FRAKTUR SMALL Y; QQK
+1D5D2 ; [.105E.0020.0005.1D5D2] # MATHEMATICAL SANS-SERIF SMALL Y; QQK
+1D606 ; [.105E.0020.0005.1D606] # MATHEMATICAL SANS-SERIF BOLD SMALL Y; QQK
+1D63A ; [.105E.0020.0005.1D63A] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y; QQK
+1D66E ; [.105E.0020.0005.1D66E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y; QQK
+1D6A2 ; [.105E.0020.0005.1D6A2] # MATHEMATICAL MONOSPACE SMALL Y; QQK
+24E8 ; [.105E.0020.0006.24E8] # CIRCLED LATIN SMALL LETTER Y; QQK
+0059 ; [.105E.0020.0008.0059] # LATIN CAPITAL LETTER Y
+FF39 ; [.105E.0020.0009.FF39] # FULLWIDTH LATIN CAPITAL LETTER Y; QQK
+1D418 ; [.105E.0020.000B.1D418] # MATHEMATICAL BOLD CAPITAL Y; QQK
+1D44C ; [.105E.0020.000B.1D44C] # MATHEMATICAL ITALIC CAPITAL Y; QQK
+1D480 ; [.105E.0020.000B.1D480] # MATHEMATICAL BOLD ITALIC CAPITAL Y; QQK
+1D4B4 ; [.105E.0020.000B.1D4B4] # MATHEMATICAL SCRIPT CAPITAL Y; QQK
+1D4E8 ; [.105E.0020.000B.1D4E8] # MATHEMATICAL BOLD SCRIPT CAPITAL Y; QQK
+1D51C ; [.105E.0020.000B.1D51C] # MATHEMATICAL FRAKTUR CAPITAL Y; QQK
+1D550 ; [.105E.0020.000B.1D550] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y; QQK
+1D584 ; [.105E.0020.000B.1D584] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y; QQK
+1D5B8 ; [.105E.0020.000B.1D5B8] # MATHEMATICAL SANS-SERIF CAPITAL Y; QQK
+1D5EC ; [.105E.0020.000B.1D5EC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y; QQK
+1D620 ; [.105E.0020.000B.1D620] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y; QQK
+1D654 ; [.105E.0020.000B.1D654] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y; QQK
+1D688 ; [.105E.0020.000B.1D688] # MATHEMATICAL MONOSPACE CAPITAL Y; QQK
+24CE ; [.105E.0020.000C.24CE] # CIRCLED LATIN CAPITAL LETTER Y; QQK
+02B8 ; [.105E.0020.0014.02B8] # MODIFIER LETTER SMALL Y; QQK
+00FD ; [.105E.0020.0002.0079][.0000.0032.0002.0301] # LATIN SMALL LETTER Y WITH ACUTE; QQCM
+00DD ; [.105E.0020.0008.0059][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Y WITH ACUTE; QQCM
+1EF3 ; [.105E.0020.0002.0079][.0000.0035.0002.0300] # LATIN SMALL LETTER Y WITH GRAVE; QQCM
+1EF2 ; [.105E.0020.0008.0059][.0000.0035.0002.0300] # LATIN CAPITAL LETTER Y WITH GRAVE; QQCM
+0177 ; [.105E.0020.0002.0079][.0000.003C.0002.0302] # LATIN SMALL LETTER Y WITH CIRCUMFLEX; QQCM
+0176 ; [.105E.0020.0008.0059][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX; QQCM
+1E99 ; [.105E.0020.0002.0079][.0000.0043.0002.030A] # LATIN SMALL LETTER Y WITH RING ABOVE; QQCM
+00FF ; [.105E.0020.0002.0079][.0000.0047.0002.0308] # LATIN SMALL LETTER Y WITH DIAERESIS; QQCM
+0178 ; [.105E.0020.0008.0059][.0000.0047.0002.0308] # LATIN CAPITAL LETTER Y WITH DIAERESIS; QQCM
+1EF9 ; [.105E.0020.0002.0079][.0000.004E.0002.0303] # LATIN SMALL LETTER Y WITH TILDE; QQCM
+1EF8 ; [.105E.0020.0008.0059][.0000.004E.0002.0303] # LATIN CAPITAL LETTER Y WITH TILDE; QQCM
+1E8F ; [.105E.0020.0002.0079][.0000.0052.0002.0307] # LATIN SMALL LETTER Y WITH DOT ABOVE; QQCM
+1E8E ; [.105E.0020.0008.0059][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Y WITH DOT ABOVE; QQCM
+0233 ; [.105E.0020.0002.0079][.0000.005A.0002.0304] # LATIN SMALL LETTER Y WITH MACRON; QQCM
+0232 ; [.105E.0020.0008.0059][.0000.005A.0002.0304] # LATIN CAPITAL LETTER Y WITH MACRON; QQCM
+1EF7 ; [.105E.0020.0002.0079][.0000.005F.0002.0309] # LATIN SMALL LETTER Y WITH HOOK ABOVE; QQCM
+1EF6 ; [.105E.0020.0008.0059][.0000.005F.0002.0309] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE; QQCM
+1EF5 ; [.105E.0020.0002.0079][.0000.0079.0002.0323] # LATIN SMALL LETTER Y WITH DOT BELOW; QQCM
+1EF4 ; [.105E.0020.0008.0059][.0000.0079.0002.0323] # LATIN CAPITAL LETTER Y WITH DOT BELOW; QQCM
+028F ; [.1062.0020.0002.028F] # LATIN LETTER SMALL CAPITAL Y
+01B4 ; [.1066.0020.0002.01B4] # LATIN SMALL LETTER Y WITH HOOK
+01B3 ; [.1066.0020.0008.01B3] # LATIN CAPITAL LETTER Y WITH HOOK
+007A ; [.106A.0020.0002.007A] # LATIN SMALL LETTER Z
+FF5A ; [.106A.0020.0003.FF5A] # FULLWIDTH LATIN SMALL LETTER Z; QQK
+24B5 ; [*0288.0020.0004.24B5][.106A.0020.0004.24B5][*0289.0020.001F.24B5] # PARENTHESIZED LATIN SMALL LETTER Z; QQKN
+1D433 ; [.106A.0020.0005.1D433] # MATHEMATICAL BOLD SMALL Z; QQK
+1D467 ; [.106A.0020.0005.1D467] # MATHEMATICAL ITALIC SMALL Z; QQK
+1D49B ; [.106A.0020.0005.1D49B] # MATHEMATICAL BOLD ITALIC SMALL Z; QQK
+1D4CF ; [.106A.0020.0005.1D4CF] # MATHEMATICAL SCRIPT SMALL Z; QQK
+1D503 ; [.106A.0020.0005.1D503] # MATHEMATICAL BOLD SCRIPT SMALL Z; QQK
+1D537 ; [.106A.0020.0005.1D537] # MATHEMATICAL FRAKTUR SMALL Z; QQK
+1D56B ; [.106A.0020.0005.1D56B] # MATHEMATICAL DOUBLE-STRUCK SMALL Z; QQK
+1D59F ; [.106A.0020.0005.1D59F] # MATHEMATICAL BOLD FRAKTUR SMALL Z; QQK
+1D5D3 ; [.106A.0020.0005.1D5D3] # MATHEMATICAL SANS-SERIF SMALL Z; QQK
+1D607 ; [.106A.0020.0005.1D607] # MATHEMATICAL SANS-SERIF BOLD SMALL Z; QQK
+1D63B ; [.106A.0020.0005.1D63B] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z; QQK
+1D66F ; [.106A.0020.0005.1D66F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z; QQK
+1D6A3 ; [.106A.0020.0005.1D6A3] # MATHEMATICAL MONOSPACE SMALL Z; QQK
+24E9 ; [.106A.0020.0006.24E9] # CIRCLED LATIN SMALL LETTER Z; QQK
+005A ; [.106A.0020.0008.005A] # LATIN CAPITAL LETTER Z
+FF3A ; [.106A.0020.0009.FF3A] # FULLWIDTH LATIN CAPITAL LETTER Z; QQK
+2124 ; [.106A.0020.000B.2124] # DOUBLE-STRUCK CAPITAL Z; QQK
+2128 ; [.106A.0020.000B.2128] # BLACK-LETTER CAPITAL Z; QQK
+1D419 ; [.106A.0020.000B.1D419] # MATHEMATICAL BOLD CAPITAL Z; QQK
+1D44D ; [.106A.0020.000B.1D44D] # MATHEMATICAL ITALIC CAPITAL Z; QQK
+1D481 ; [.106A.0020.000B.1D481] # MATHEMATICAL BOLD ITALIC CAPITAL Z; QQK
+1D4B5 ; [.106A.0020.000B.1D4B5] # MATHEMATICAL SCRIPT CAPITAL Z; QQK
+1D4E9 ; [.106A.0020.000B.1D4E9] # MATHEMATICAL BOLD SCRIPT CAPITAL Z; QQK
+1D585 ; [.106A.0020.000B.1D585] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z; QQK
+1D5B9 ; [.106A.0020.000B.1D5B9] # MATHEMATICAL SANS-SERIF CAPITAL Z; QQK
+1D5ED ; [.106A.0020.000B.1D5ED] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z; QQK
+1D621 ; [.106A.0020.000B.1D621] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z; QQK
+1D655 ; [.106A.0020.000B.1D655] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z; QQK
+1D689 ; [.106A.0020.000B.1D689] # MATHEMATICAL MONOSPACE CAPITAL Z; QQK
+24CF ; [.106A.0020.000C.24CF] # CIRCLED LATIN CAPITAL LETTER Z; QQK
+017A ; [.106A.0020.0002.007A][.0000.0032.0002.0301] # LATIN SMALL LETTER Z WITH ACUTE; QQCM
+0179 ; [.106A.0020.0008.005A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Z WITH ACUTE; QQCM
+1E91 ; [.106A.0020.0002.007A][.0000.003C.0002.0302] # LATIN SMALL LETTER Z WITH CIRCUMFLEX; QQCM
+1E90 ; [.106A.0020.0008.005A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX; QQCM
+017E ; [.106A.0020.0002.007A][.0000.0041.0002.030C] # LATIN SMALL LETTER Z WITH CARON; QQCM
+017D ; [.106A.0020.0008.005A][.0000.0041.0002.030C] # LATIN CAPITAL LETTER Z WITH CARON; QQCM
+017C ; [.106A.0020.0002.007A][.0000.0052.0002.0307] # LATIN SMALL LETTER Z WITH DOT ABOVE; QQCM
+017B ; [.106A.0020.0008.005A][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Z WITH DOT ABOVE; QQCM
+1E93 ; [.106A.0020.0002.007A][.0000.0079.0002.0323] # LATIN SMALL LETTER Z WITH DOT BELOW; QQCM
+1E92 ; [.106A.0020.0008.005A][.0000.0079.0002.0323] # LATIN CAPITAL LETTER Z WITH DOT BELOW; QQCM
+1E95 ; [.106A.0020.0002.007A][.0000.0089.0002.0331] # LATIN SMALL LETTER Z WITH LINE BELOW; QQCM
+1E94 ; [.106A.0020.0008.005A][.0000.0089.0002.0331] # LATIN CAPITAL LETTER Z WITH LINE BELOW; QQCM
+018D ; [.106A.0020.0004.018D][.1051.0020.0004.018D] # LATIN SMALL LETTER TURNED DELTA; QQKN
+1D22 ; [.106E.0020.0002.1D22] # LATIN LETTER SMALL CAPITAL Z
+01B6 ; [.106F.0020.0002.01B6] # LATIN SMALL LETTER Z WITH STROKE
+01B5 ; [.106F.0020.0008.01B5] # LATIN CAPITAL LETTER Z WITH STROKE
+0225 ; [.1073.0020.0002.0225] # LATIN SMALL LETTER Z WITH HOOK
+0224 ; [.1073.0020.0008.0224] # LATIN CAPITAL LETTER Z WITH HOOK
+0290 ; [.1077.0020.0002.0290] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+0291 ; [.107B.0020.0002.0291] # LATIN SMALL LETTER Z WITH CURL
+0292 ; [.107F.0020.0002.0292] # LATIN SMALL LETTER EZH
+01B7 ; [.107F.0020.0008.01B7] # LATIN CAPITAL LETTER EZH
+01EF ; [.107F.0020.0002.0292][.0000.0041.0002.030C] # LATIN SMALL LETTER EZH WITH CARON; QQCM
+01EE ; [.107F.0020.0008.01B7][.0000.0041.0002.030C] # LATIN CAPITAL LETTER EZH WITH CARON; QQCM
+1D23 ; [.1083.0020.0002.1D23] # LATIN LETTER SMALL CAPITAL EZH
+01B9 ; [.1084.0020.0002.01B9] # LATIN SMALL LETTER EZH REVERSED
+01B8 ; [.1084.0020.0008.01B8] # LATIN CAPITAL LETTER EZH REVERSED
+01BA ; [.1088.0020.0002.01BA] # LATIN SMALL LETTER EZH WITH TAIL
+0293 ; [.108C.0020.0002.0293] # LATIN SMALL LETTER EZH WITH CURL
+021D ; [.1090.0020.0002.021D] # LATIN SMALL LETTER YOGH
+021C ; [.1090.0020.0008.021C] # LATIN CAPITAL LETTER YOGH
+00FE ; [.1094.0020.0002.00FE] # LATIN SMALL LETTER THORN
+00DE ; [.1094.0020.0008.00DE] # LATIN CAPITAL LETTER THORN
+01BF ; [.1098.0020.0002.01BF] # LATIN LETTER WYNN
+01F7 ; [.1098.0020.0008.01F7] # LATIN CAPITAL LETTER WYNN
+01BB ; [.109C.0020.0002.01BB] # LATIN LETTER TWO WITH STROKE
+01A8 ; [.10A0.0020.0002.01A8] # LATIN SMALL LETTER TONE TWO
+01A7 ; [.10A0.0020.0008.01A7] # LATIN CAPITAL LETTER TONE TWO
+01BD ; [.10A4.0020.0002.01BD] # LATIN SMALL LETTER TONE FIVE
+01BC ; [.10A4.0020.0008.01BC] # LATIN CAPITAL LETTER TONE FIVE
+0185 ; [.10A8.0020.0002.0185] # LATIN SMALL LETTER TONE SIX
+0184 ; [.10A8.0020.0008.0184] # LATIN CAPITAL LETTER TONE SIX
+0294 ; [.10AC.0020.0002.0294] # LATIN LETTER GLOTTAL STOP
+02C0 ; [.10B0.0020.0002.02C0] # MODIFIER LETTER GLOTTAL STOP
+02BC ; [.10B1.0020.0002.02BC] # MODIFIER LETTER APOSTROPHE
+0149 ; [.10B1.0020.0004.0149][.0F64.0020.0004.0149] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE; QQKN
+02EE ; [.10B2.0020.0002.02EE] # MODIFIER LETTER DOUBLE APOSTROPHE
+02BE ; [.10B3.0020.0002.02BE] # MODIFIER LETTER RIGHT HALF RING
+0295 ; [.10B4.0020.0002.0295] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+02E4 ; [.10B4.0020.0014.02E4] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP; QQK
+02BF ; [.10B8.0020.0002.02BF] # MODIFIER LETTER LEFT HALF RING
+02C1 ; [.10B9.0020.0002.02C1] # MODIFIER LETTER REVERSED GLOTTAL STOP
+1D24 ; [.10BA.0020.0002.1D24] # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25 ; [.10BB.0020.0002.1D25] # LATIN LETTER AIN
+1D5C ; [.10BB.0020.0014.1D5C] # MODIFIER LETTER SMALL AIN; QQK
+02A1 ; [.10BC.0020.0002.02A1] # LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2 ; [.10C0.0020.0002.02A2] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+0296 ; [.10C4.0020.0002.0296] # LATIN LETTER INVERTED GLOTTAL STOP
+01C0 ; [.10C8.0020.0002.01C0] # LATIN LETTER DENTAL CLICK
+01C1 ; [.10CC.0020.0002.01C1] # LATIN LETTER LATERAL CLICK
+01C2 ; [.10D0.0020.0002.01C2] # LATIN LETTER ALVEOLAR CLICK
+01C3 ; [.10D4.0020.0002.01C3] # LATIN LETTER RETROFLEX CLICK
+0297 ; [.10D8.0020.0002.0297] # LATIN LETTER STRETCHED C
+0298 ; [.10DC.0020.0002.0298] # LATIN LETTER BILABIAL CLICK
+02AC ; [.10E0.0020.0002.02AC] # LATIN LETTER BILABIAL PERCUSSIVE
+02AD ; [.10E4.0020.0002.02AD] # LATIN LETTER BIDENTAL PERCUSSIVE
+03B1 ; [.10E8.0020.0002.03B1] # GREEK SMALL LETTER ALPHA
+1D6C2 ; [.10E8.0020.0005.1D6C2] # MATHEMATICAL BOLD SMALL ALPHA; QQK
+1D6FC ; [.10E8.0020.0005.1D6FC] # MATHEMATICAL ITALIC SMALL ALPHA; QQK
+1D736 ; [.10E8.0020.0005.1D736] # MATHEMATICAL BOLD ITALIC SMALL ALPHA; QQK
+1D770 ; [.10E8.0020.0005.1D770] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA; QQK
+1D7AA ; [.10E8.0020.0005.1D7AA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA; QQK
+0391 ; [.10E8.0020.0008.0391] # GREEK CAPITAL LETTER ALPHA
+1D6A8 ; [.10E8.0020.000B.1D6A8] # MATHEMATICAL BOLD CAPITAL ALPHA; QQK
+1D6E2 ; [.10E8.0020.000B.1D6E2] # MATHEMATICAL ITALIC CAPITAL ALPHA; QQK
+1D71C ; [.10E8.0020.000B.1D71C] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA; QQK
+1D756 ; [.10E8.0020.000B.1D756] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA; QQK
+1D790 ; [.10E8.0020.000B.1D790] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA; QQK
+1F00 ; [.10E8.0020.0002.03B1][.0000.0022.0002.0313] # GREEK SMALL LETTER ALPHA WITH PSILI; QQCM
+1F08 ; [.10E8.0020.0008.0391][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ALPHA WITH PSILI; QQCM
+1F04 ; [.10E8.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA; QQCM
+1F0C ; [.10E8.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA; QQCM
+1F84 ; [.10E8.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1F8C ; [.10E8.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F02 ; [.10E8.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA; QQCM
+1F0A ; [.10E8.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA; QQCM
+1F82 ; [.10E8.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1F8A ; [.10E8.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F06 ; [.10E8.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI; QQCM
+1F0E ; [.10E8.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI; QQCM
+1F86 ; [.10E8.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F8E ; [.10E8.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F80 ; [.10E8.0020.0002.03B1][.0000.0022.0002.0313][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1F88 ; [.10E8.0020.0008.0391][.0000.0022.0002.0313][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F01 ; [.10E8.0020.0002.03B1][.0000.002A.0002.0314] # GREEK SMALL LETTER ALPHA WITH DASIA; QQCM
+1F09 ; [.10E8.0020.0008.0391][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ALPHA WITH DASIA; QQCM
+1F05 ; [.10E8.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA; QQCM
+1F0D ; [.10E8.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA; QQCM
+1F85 ; [.10E8.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1F8D ; [.10E8.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F03 ; [.10E8.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA; QQCM
+1F0B ; [.10E8.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA; QQCM
+1F83 ; [.10E8.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1F8B ; [.10E8.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F07 ; [.10E8.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI; QQCM
+1F0F ; [.10E8.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI; QQCM
+1F87 ; [.10E8.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F8F ; [.10E8.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F81 ; [.10E8.0020.0002.03B1][.0000.002A.0002.0314][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1F89 ; [.10E8.0020.0008.0391][.0000.002A.0002.0314][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03AC ; [.10E8.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH TONOS; QQCM
+1F71 ; [.10E8.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH OXIA; QQCM
+0386 ; [.10E8.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH TONOS; QQCM
+1FBB ; [.10E8.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH OXIA; QQCM
+1FB4 ; [.10E8.0020.0002.03B1][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F70 ; [.10E8.0020.0002.03B1][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH VARIA; QQCM
+1FBA ; [.10E8.0020.0008.0391][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH VARIA; QQCM
+1FB2 ; [.10E8.0020.0002.03B1][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FB0 ; [.10E8.0020.0002.03B1][.0000.0037.0002.0306] # GREEK SMALL LETTER ALPHA WITH VRACHY; QQCM
+1FB8 ; [.10E8.0020.0008.0391][.0000.0037.0002.0306] # GREEK CAPITAL LETTER ALPHA WITH VRACHY; QQCM
+1FB6 ; [.10E8.0020.0002.03B1][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI; QQCM
+1FB7 ; [.10E8.0020.0002.03B1][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FB1 ; [.10E8.0020.0002.03B1][.0000.005A.0002.0304] # GREEK SMALL LETTER ALPHA WITH MACRON; QQCM
+1FB9 ; [.10E8.0020.0008.0391][.0000.005A.0002.0304] # GREEK CAPITAL LETTER ALPHA WITH MACRON; QQCM
+1FB3 ; [.10E8.0020.0002.03B1][.0000.0096.0002.0345] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI; QQCM
+1FBC ; [.10E8.0020.0008.0391][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI; QQCM
+03B2 ; [.10E9.0020.0002.03B2] # GREEK SMALL LETTER BETA
+03D0 ; [.10E9.0020.0004.03D0] # GREEK BETA SYMBOL; QQK
+1D6C3 ; [.10E9.0020.0005.1D6C3] # MATHEMATICAL BOLD SMALL BETA; QQK
+1D6FD ; [.10E9.0020.0005.1D6FD] # MATHEMATICAL ITALIC SMALL BETA; QQK
+1D737 ; [.10E9.0020.0005.1D737] # MATHEMATICAL BOLD ITALIC SMALL BETA; QQK
+1D771 ; [.10E9.0020.0005.1D771] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA; QQK
+1D7AB ; [.10E9.0020.0005.1D7AB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA; QQK
+0392 ; [.10E9.0020.0008.0392] # GREEK CAPITAL LETTER BETA
+1D6A9 ; [.10E9.0020.000B.1D6A9] # MATHEMATICAL BOLD CAPITAL BETA; QQK
+1D6E3 ; [.10E9.0020.000B.1D6E3] # MATHEMATICAL ITALIC CAPITAL BETA; QQK
+1D71D ; [.10E9.0020.000B.1D71D] # MATHEMATICAL BOLD ITALIC CAPITAL BETA; QQK
+1D757 ; [.10E9.0020.000B.1D757] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA; QQK
+1D791 ; [.10E9.0020.000B.1D791] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA; QQK
+1D5D ; [.10E9.0020.0014.1D5D] # MODIFIER LETTER SMALL BETA; QQK
+1D66 ; [.10E9.0020.0015.1D66] # GREEK SUBSCRIPT SMALL LETTER BETA; QQK
+03B3 ; [.10EA.0020.0002.03B3] # GREEK SMALL LETTER GAMMA
+213D ; [.10EA.0020.0005.213D] # DOUBLE-STRUCK SMALL GAMMA; QQK
+1D6C4 ; [.10EA.0020.0005.1D6C4] # MATHEMATICAL BOLD SMALL GAMMA; QQK
+1D6FE ; [.10EA.0020.0005.1D6FE] # MATHEMATICAL ITALIC SMALL GAMMA; QQK
+1D738 ; [.10EA.0020.0005.1D738] # MATHEMATICAL BOLD ITALIC SMALL GAMMA; QQK
+1D772 ; [.10EA.0020.0005.1D772] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA; QQK
+1D7AC ; [.10EA.0020.0005.1D7AC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA; QQK
+0393 ; [.10EA.0020.0008.0393] # GREEK CAPITAL LETTER GAMMA
+213E ; [.10EA.0020.000B.213E] # DOUBLE-STRUCK CAPITAL GAMMA; QQK
+1D6AA ; [.10EA.0020.000B.1D6AA] # MATHEMATICAL BOLD CAPITAL GAMMA; QQK
+1D6E4 ; [.10EA.0020.000B.1D6E4] # MATHEMATICAL ITALIC CAPITAL GAMMA; QQK
+1D71E ; [.10EA.0020.000B.1D71E] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA; QQK
+1D758 ; [.10EA.0020.000B.1D758] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA; QQK
+1D792 ; [.10EA.0020.000B.1D792] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA; QQK
+1D5E ; [.10EA.0020.0014.1D5E] # MODIFIER LETTER SMALL GREEK GAMMA; QQK
+1D67 ; [.10EA.0020.0015.1D67] # GREEK SUBSCRIPT SMALL LETTER GAMMA; QQK
+1D26 ; [.10EB.0020.0002.1D26] # GREEK LETTER SMALL CAPITAL GAMMA
+03B4 ; [.10EC.0020.0002.03B4] # GREEK SMALL LETTER DELTA
+1D6C5 ; [.10EC.0020.0005.1D6C5] # MATHEMATICAL BOLD SMALL DELTA; QQK
+1D6FF ; [.10EC.0020.0005.1D6FF] # MATHEMATICAL ITALIC SMALL DELTA; QQK
+1D739 ; [.10EC.0020.0005.1D739] # MATHEMATICAL BOLD ITALIC SMALL DELTA; QQK
+1D773 ; [.10EC.0020.0005.1D773] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA; QQK
+1D7AD ; [.10EC.0020.0005.1D7AD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA; QQK
+0394 ; [.10EC.0020.0008.0394] # GREEK CAPITAL LETTER DELTA
+1D6AB ; [.10EC.0020.000B.1D6AB] # MATHEMATICAL BOLD CAPITAL DELTA; QQK
+1D6E5 ; [.10EC.0020.000B.1D6E5] # MATHEMATICAL ITALIC CAPITAL DELTA; QQK
+1D71F ; [.10EC.0020.000B.1D71F] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA; QQK
+1D759 ; [.10EC.0020.000B.1D759] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA; QQK
+1D793 ; [.10EC.0020.000B.1D793] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA; QQK
+1D5F ; [.10EC.0020.0014.1D5F] # MODIFIER LETTER SMALL DELTA; QQK
+03B5 ; [.10ED.0020.0002.03B5] # GREEK SMALL LETTER EPSILON
+03F5 ; [.10ED.0020.0004.03F5] # GREEK LUNATE EPSILON SYMBOL; QQK
+1D6C6 ; [.10ED.0020.0005.1D6C6] # MATHEMATICAL BOLD SMALL EPSILON; QQK
+1D6DC ; [.10ED.0020.0005.1D6DC] # MATHEMATICAL BOLD EPSILON SYMBOL; QQK
+1D700 ; [.10ED.0020.0005.1D700] # MATHEMATICAL ITALIC SMALL EPSILON; QQK
+1D716 ; [.10ED.0020.0005.1D716] # MATHEMATICAL ITALIC EPSILON SYMBOL; QQK
+1D73A ; [.10ED.0020.0005.1D73A] # MATHEMATICAL BOLD ITALIC SMALL EPSILON; QQK
+1D750 ; [.10ED.0020.0005.1D750] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL; QQK
+1D774 ; [.10ED.0020.0005.1D774] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON; QQK
+1D78A ; [.10ED.0020.0005.1D78A] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL; QQK
+1D7AE ; [.10ED.0020.0005.1D7AE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON; QQK
+1D7C4 ; [.10ED.0020.0005.1D7C4] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL; QQK
+0395 ; [.10ED.0020.0008.0395] # GREEK CAPITAL LETTER EPSILON
+1D6AC ; [.10ED.0020.000B.1D6AC] # MATHEMATICAL BOLD CAPITAL EPSILON; QQK
+1D6E6 ; [.10ED.0020.000B.1D6E6] # MATHEMATICAL ITALIC CAPITAL EPSILON; QQK
+1D720 ; [.10ED.0020.000B.1D720] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON; QQK
+1D75A ; [.10ED.0020.000B.1D75A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON; QQK
+1D794 ; [.10ED.0020.000B.1D794] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON; QQK
+1F10 ; [.10ED.0020.0002.03B5][.0000.0022.0002.0313] # GREEK SMALL LETTER EPSILON WITH PSILI; QQCM
+1F18 ; [.10ED.0020.0008.0395][.0000.0022.0002.0313] # GREEK CAPITAL LETTER EPSILON WITH PSILI; QQCM
+1F14 ; [.10ED.0020.0002.03B5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA; QQCM
+1F1C ; [.10ED.0020.0008.0395][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA; QQCM
+1F12 ; [.10ED.0020.0002.03B5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA; QQCM
+1F1A ; [.10ED.0020.0008.0395][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA; QQCM
+1F11 ; [.10ED.0020.0002.03B5][.0000.002A.0002.0314] # GREEK SMALL LETTER EPSILON WITH DASIA; QQCM
+1F19 ; [.10ED.0020.0008.0395][.0000.002A.0002.0314] # GREEK CAPITAL LETTER EPSILON WITH DASIA; QQCM
+1F15 ; [.10ED.0020.0002.03B5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA; QQCM
+1F1D ; [.10ED.0020.0008.0395][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA; QQCM
+1F13 ; [.10ED.0020.0002.03B5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA; QQCM
+1F1B ; [.10ED.0020.0008.0395][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA; QQCM
+03AD ; [.10ED.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH TONOS; QQCM
+1F73 ; [.10ED.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH OXIA; QQCM
+0388 ; [.10ED.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH TONOS; QQCM
+1FC9 ; [.10ED.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH OXIA; QQCM
+1F72 ; [.10ED.0020.0002.03B5][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH VARIA; QQCM
+1FC8 ; [.10ED.0020.0008.0395][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH VARIA; QQCM
+03DD ; [.10EE.0020.0002.03DD] # GREEK SMALL LETTER DIGAMMA
+03DC ; [.10EE.0020.0008.03DC] # GREEK LETTER DIGAMMA
+03DB ; [.10EF.0020.0002.03DB] # GREEK SMALL LETTER STIGMA
+03DA ; [.10EF.0020.0008.03DA] # GREEK LETTER STIGMA
+03B6 ; [.10F0.0020.0002.03B6] # GREEK SMALL LETTER ZETA
+1D6C7 ; [.10F0.0020.0005.1D6C7] # MATHEMATICAL BOLD SMALL ZETA; QQK
+1D701 ; [.10F0.0020.0005.1D701] # MATHEMATICAL ITALIC SMALL ZETA; QQK
+1D73B ; [.10F0.0020.0005.1D73B] # MATHEMATICAL BOLD ITALIC SMALL ZETA; QQK
+1D775 ; [.10F0.0020.0005.1D775] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA; QQK
+1D7AF ; [.10F0.0020.0005.1D7AF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA; QQK
+0396 ; [.10F0.0020.0008.0396] # GREEK CAPITAL LETTER ZETA
+1D6AD ; [.10F0.0020.000B.1D6AD] # MATHEMATICAL BOLD CAPITAL ZETA; QQK
+1D6E7 ; [.10F0.0020.000B.1D6E7] # MATHEMATICAL ITALIC CAPITAL ZETA; QQK
+1D721 ; [.10F0.0020.000B.1D721] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA; QQK
+1D75B ; [.10F0.0020.000B.1D75B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA; QQK
+1D795 ; [.10F0.0020.000B.1D795] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA; QQK
+03B7 ; [.10F1.0020.0002.03B7] # GREEK SMALL LETTER ETA
+1D6C8 ; [.10F1.0020.0005.1D6C8] # MATHEMATICAL BOLD SMALL ETA; QQK
+1D702 ; [.10F1.0020.0005.1D702] # MATHEMATICAL ITALIC SMALL ETA; QQK
+1D73C ; [.10F1.0020.0005.1D73C] # MATHEMATICAL BOLD ITALIC SMALL ETA; QQK
+1D776 ; [.10F1.0020.0005.1D776] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA; QQK
+1D7B0 ; [.10F1.0020.0005.1D7B0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA; QQK
+0397 ; [.10F1.0020.0008.0397] # GREEK CAPITAL LETTER ETA
+1D6AE ; [.10F1.0020.000B.1D6AE] # MATHEMATICAL BOLD CAPITAL ETA; QQK
+1D6E8 ; [.10F1.0020.000B.1D6E8] # MATHEMATICAL ITALIC CAPITAL ETA; QQK
+1D722 ; [.10F1.0020.000B.1D722] # MATHEMATICAL BOLD ITALIC CAPITAL ETA; QQK
+1D75C ; [.10F1.0020.000B.1D75C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA; QQK
+1D796 ; [.10F1.0020.000B.1D796] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA; QQK
+1F20 ; [.10F1.0020.0002.03B7][.0000.0022.0002.0313] # GREEK SMALL LETTER ETA WITH PSILI; QQCM
+1F28 ; [.10F1.0020.0008.0397][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ETA WITH PSILI; QQCM
+1F24 ; [.10F1.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA; QQCM
+1F2C ; [.10F1.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA; QQCM
+1F94 ; [.10F1.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1F9C ; [.10F1.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F22 ; [.10F1.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA; QQCM
+1F2A ; [.10F1.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA; QQCM
+1F92 ; [.10F1.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1F9A ; [.10F1.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F26 ; [.10F1.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI; QQCM
+1F2E ; [.10F1.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI; QQCM
+1F96 ; [.10F1.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F9E ; [.10F1.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F90 ; [.10F1.0020.0002.03B7][.0000.0022.0002.0313][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1F98 ; [.10F1.0020.0008.0397][.0000.0022.0002.0313][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F21 ; [.10F1.0020.0002.03B7][.0000.002A.0002.0314] # GREEK SMALL LETTER ETA WITH DASIA; QQCM
+1F29 ; [.10F1.0020.0008.0397][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ETA WITH DASIA; QQCM
+1F25 ; [.10F1.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA; QQCM
+1F2D ; [.10F1.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA; QQCM
+1F95 ; [.10F1.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1F9D ; [.10F1.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F23 ; [.10F1.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA; QQCM
+1F2B ; [.10F1.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA; QQCM
+1F93 ; [.10F1.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1F9B ; [.10F1.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F27 ; [.10F1.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI; QQCM
+1F2F ; [.10F1.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI; QQCM
+1F97 ; [.10F1.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F9F ; [.10F1.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F91 ; [.10F1.0020.0002.03B7][.0000.002A.0002.0314][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1F99 ; [.10F1.0020.0008.0397][.0000.002A.0002.0314][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03AE ; [.10F1.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH TONOS; QQCM
+1F75 ; [.10F1.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH OXIA; QQCM
+0389 ; [.10F1.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH TONOS; QQCM
+1FCB ; [.10F1.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH OXIA; QQCM
+1FC4 ; [.10F1.0020.0002.03B7][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F74 ; [.10F1.0020.0002.03B7][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH VARIA; QQCM
+1FCA ; [.10F1.0020.0008.0397][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH VARIA; QQCM
+1FC2 ; [.10F1.0020.0002.03B7][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FC6 ; [.10F1.0020.0002.03B7][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PERISPOMENI; QQCM
+1FC7 ; [.10F1.0020.0002.03B7][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FC3 ; [.10F1.0020.0002.03B7][.0000.0096.0002.0345] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI; QQCM
+1FCC ; [.10F1.0020.0008.0397][.0000.0096.0002.0345] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI; QQCM
+03B8 ; [.10F2.0020.0002.03B8] # GREEK SMALL LETTER THETA
+03D1 ; [.10F2.0020.0004.03D1] # GREEK THETA SYMBOL; QQK
+1D6C9 ; [.10F2.0020.0005.1D6C9] # MATHEMATICAL BOLD SMALL THETA; QQK
+1D6DD ; [.10F2.0020.0005.1D6DD] # MATHEMATICAL BOLD THETA SYMBOL; QQK
+1D703 ; [.10F2.0020.0005.1D703] # MATHEMATICAL ITALIC SMALL THETA; QQK
+1D717 ; [.10F2.0020.0005.1D717] # MATHEMATICAL ITALIC THETA SYMBOL; QQK
+1D73D ; [.10F2.0020.0005.1D73D] # MATHEMATICAL BOLD ITALIC SMALL THETA; QQK
+1D751 ; [.10F2.0020.0005.1D751] # MATHEMATICAL BOLD ITALIC THETA SYMBOL; QQK
+1D777 ; [.10F2.0020.0005.1D777] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA; QQK
+1D78B ; [.10F2.0020.0005.1D78B] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL; QQK
+1D7B1 ; [.10F2.0020.0005.1D7B1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA; QQK
+1D7C5 ; [.10F2.0020.0005.1D7C5] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL; QQK
+0398 ; [.10F2.0020.0008.0398] # GREEK CAPITAL LETTER THETA
+03F4 ; [.10F2.0020.000A.03F4] # GREEK CAPITAL THETA SYMBOL; QQK
+1D6AF ; [.10F2.0020.000B.1D6AF] # MATHEMATICAL BOLD CAPITAL THETA; QQK
+1D6B9 ; [.10F2.0020.000B.1D6B9] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL; QQK
+1D6E9 ; [.10F2.0020.000B.1D6E9] # MATHEMATICAL ITALIC CAPITAL THETA; QQK
+1D6F3 ; [.10F2.0020.000B.1D6F3] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL; QQK
+1D723 ; [.10F2.0020.000B.1D723] # MATHEMATICAL BOLD ITALIC CAPITAL THETA; QQK
+1D72D ; [.10F2.0020.000B.1D72D] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL; QQK
+1D75D ; [.10F2.0020.000B.1D75D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA; QQK
+1D767 ; [.10F2.0020.000B.1D767] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL; QQK
+1D797 ; [.10F2.0020.000B.1D797] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA; QQK
+1D7A1 ; [.10F2.0020.000B.1D7A1] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL; QQK
+03B9 ; [.10F3.0020.0002.03B9] # GREEK SMALL LETTER IOTA
+1FBE ; [.10F3.0020.0002.1FBE] # GREEK PROSGEGRAMMENI; QQC
+037A ; [.10F3.0020.0004.037A] # GREEK YPOGEGRAMMENI; QQK
+1D6CA ; [.10F3.0020.0005.1D6CA] # MATHEMATICAL BOLD SMALL IOTA; QQK
+1D704 ; [.10F3.0020.0005.1D704] # MATHEMATICAL ITALIC SMALL IOTA; QQK
+1D73E ; [.10F3.0020.0005.1D73E] # MATHEMATICAL BOLD ITALIC SMALL IOTA; QQK
+1D778 ; [.10F3.0020.0005.1D778] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA; QQK
+1D7B2 ; [.10F3.0020.0005.1D7B2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA; QQK
+0399 ; [.10F3.0020.0008.0399] # GREEK CAPITAL LETTER IOTA
+1D6B0 ; [.10F3.0020.000B.1D6B0] # MATHEMATICAL BOLD CAPITAL IOTA; QQK
+1D6EA ; [.10F3.0020.000B.1D6EA] # MATHEMATICAL ITALIC CAPITAL IOTA; QQK
+1D724 ; [.10F3.0020.000B.1D724] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA; QQK
+1D75E ; [.10F3.0020.000B.1D75E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA; QQK
+1D798 ; [.10F3.0020.000B.1D798] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA; QQK
+1F30 ; [.10F3.0020.0002.03B9][.0000.0022.0002.0313] # GREEK SMALL LETTER IOTA WITH PSILI; QQCM
+1F38 ; [.10F3.0020.0008.0399][.0000.0022.0002.0313] # GREEK CAPITAL LETTER IOTA WITH PSILI; QQCM
+1F34 ; [.10F3.0020.0002.03B9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA; QQCM
+1F3C ; [.10F3.0020.0008.0399][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA; QQCM
+1F32 ; [.10F3.0020.0002.03B9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA; QQCM
+1F3A ; [.10F3.0020.0008.0399][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA; QQCM
+1F36 ; [.10F3.0020.0002.03B9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI; QQCM
+1F3E ; [.10F3.0020.0008.0399][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI; QQCM
+1F31 ; [.10F3.0020.0002.03B9][.0000.002A.0002.0314] # GREEK SMALL LETTER IOTA WITH DASIA; QQCM
+1F39 ; [.10F3.0020.0008.0399][.0000.002A.0002.0314] # GREEK CAPITAL LETTER IOTA WITH DASIA; QQCM
+1F35 ; [.10F3.0020.0002.03B9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA; QQCM
+1F3D ; [.10F3.0020.0008.0399][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA; QQCM
+1F33 ; [.10F3.0020.0002.03B9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA; QQCM
+1F3B ; [.10F3.0020.0008.0399][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA; QQCM
+1F37 ; [.10F3.0020.0002.03B9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI; QQCM
+1F3F ; [.10F3.0020.0008.0399][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI; QQCM
+03AF ; [.10F3.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH TONOS; QQCM
+1F77 ; [.10F3.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH OXIA; QQCM
+038A ; [.10F3.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH TONOS; QQCM
+1FDB ; [.10F3.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH OXIA; QQCM
+1F76 ; [.10F3.0020.0002.03B9][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH VARIA; QQCM
+1FDA ; [.10F3.0020.0008.0399][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH VARIA; QQCM
+1FD0 ; [.10F3.0020.0002.03B9][.0000.0037.0002.0306] # GREEK SMALL LETTER IOTA WITH VRACHY; QQCM
+1FD8 ; [.10F3.0020.0008.0399][.0000.0037.0002.0306] # GREEK CAPITAL LETTER IOTA WITH VRACHY; QQCM
+1FD6 ; [.10F3.0020.0002.03B9][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PERISPOMENI; QQCM
+03CA ; [.10F3.0020.0002.03B9][.0000.0047.0002.0308] # GREEK SMALL LETTER IOTA WITH DIALYTIKA; QQCM
+03AA ; [.10F3.0020.0008.0399][.0000.0047.0002.0308] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA; QQCM
+0390 ; [.10F3.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS; QQCM
+1FD3 ; [.10F3.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA; QQCM
+1FD2 ; [.10F3.0020.0002.03B9][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA; QQCM
+1FD7 ; [.10F3.0020.0002.03B9][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI; QQCM
+1FD1 ; [.10F3.0020.0002.03B9][.0000.005A.0002.0304] # GREEK SMALL LETTER IOTA WITH MACRON; QQCM
+1FD9 ; [.10F3.0020.0008.0399][.0000.005A.0002.0304] # GREEK CAPITAL LETTER IOTA WITH MACRON; QQCM
+03F3 ; [.10F4.0020.0002.03F3] # GREEK LETTER YOT
+03BA ; [.10F5.0020.0002.03BA] # GREEK SMALL LETTER KAPPA
+03F0 ; [.10F5.0020.0004.03F0] # GREEK KAPPA SYMBOL; QQK
+1D6CB ; [.10F5.0020.0005.1D6CB] # MATHEMATICAL BOLD SMALL KAPPA; QQK
+1D6DE ; [.10F5.0020.0005.1D6DE] # MATHEMATICAL BOLD KAPPA SYMBOL; QQK
+1D705 ; [.10F5.0020.0005.1D705] # MATHEMATICAL ITALIC SMALL KAPPA; QQK
+1D718 ; [.10F5.0020.0005.1D718] # MATHEMATICAL ITALIC KAPPA SYMBOL; QQK
+1D73F ; [.10F5.0020.0005.1D73F] # MATHEMATICAL BOLD ITALIC SMALL KAPPA; QQK
+1D752 ; [.10F5.0020.0005.1D752] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL; QQK
+1D779 ; [.10F5.0020.0005.1D779] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA; QQK
+1D78C ; [.10F5.0020.0005.1D78C] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL; QQK
+1D7B3 ; [.10F5.0020.0005.1D7B3] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA; QQK
+1D7C6 ; [.10F5.0020.0005.1D7C6] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL; QQK
+039A ; [.10F5.0020.0008.039A] # GREEK CAPITAL LETTER KAPPA
+1D6B1 ; [.10F5.0020.000B.1D6B1] # MATHEMATICAL BOLD CAPITAL KAPPA; QQK
+1D6EB ; [.10F5.0020.000B.1D6EB] # MATHEMATICAL ITALIC CAPITAL KAPPA; QQK
+1D725 ; [.10F5.0020.000B.1D725] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA; QQK
+1D75F ; [.10F5.0020.000B.1D75F] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA; QQK
+1D799 ; [.10F5.0020.000B.1D799] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA; QQK
+03D7 ; [.10F5.0020.0004.03D7][.10E8.0020.0004.03D7][.10F3.0020.001F.03D7] # GREEK KAI SYMBOL; QQKN
+03BB ; [.10F6.0020.0002.03BB] # GREEK SMALL LETTER LAMDA
+1D6CC ; [.10F6.0020.0005.1D6CC] # MATHEMATICAL BOLD SMALL LAMDA; QQK
+1D706 ; [.10F6.0020.0005.1D706] # MATHEMATICAL ITALIC SMALL LAMDA; QQK
+1D740 ; [.10F6.0020.0005.1D740] # MATHEMATICAL BOLD ITALIC SMALL LAMDA; QQK
+1D77A ; [.10F6.0020.0005.1D77A] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA; QQK
+1D7B4 ; [.10F6.0020.0005.1D7B4] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA; QQK
+039B ; [.10F6.0020.0008.039B] # GREEK CAPITAL LETTER LAMDA
+1D6B2 ; [.10F6.0020.000B.1D6B2] # MATHEMATICAL BOLD CAPITAL LAMDA; QQK
+1D6EC ; [.10F6.0020.000B.1D6EC] # MATHEMATICAL ITALIC CAPITAL LAMDA; QQK
+1D726 ; [.10F6.0020.000B.1D726] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA; QQK
+1D760 ; [.10F6.0020.000B.1D760] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA; QQK
+1D79A ; [.10F6.0020.000B.1D79A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA; QQK
+1D27 ; [.10F7.0020.0002.1D27] # GREEK LETTER SMALL CAPITAL LAMDA
+03BC ; [.10F8.0020.0002.03BC] # GREEK SMALL LETTER MU
+00B5 ; [.10F8.0020.0004.00B5] # MICRO SIGN; QQK
+1D6CD ; [.10F8.0020.0005.1D6CD] # MATHEMATICAL BOLD SMALL MU; QQK
+1D707 ; [.10F8.0020.0005.1D707] # MATHEMATICAL ITALIC SMALL MU; QQK
+1D741 ; [.10F8.0020.0005.1D741] # MATHEMATICAL BOLD ITALIC SMALL MU; QQK
+1D77B ; [.10F8.0020.0005.1D77B] # MATHEMATICAL SANS-SERIF BOLD SMALL MU; QQK
+1D7B5 ; [.10F8.0020.0005.1D7B5] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU; QQK
+039C ; [.10F8.0020.0008.039C] # GREEK CAPITAL LETTER MU
+1D6B3 ; [.10F8.0020.000B.1D6B3] # MATHEMATICAL BOLD CAPITAL MU; QQK
+1D6ED ; [.10F8.0020.000B.1D6ED] # MATHEMATICAL ITALIC CAPITAL MU; QQK
+1D727 ; [.10F8.0020.000B.1D727] # MATHEMATICAL BOLD ITALIC CAPITAL MU; QQK
+1D761 ; [.10F8.0020.000B.1D761] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU; QQK
+1D79B ; [.10F8.0020.000B.1D79B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU; QQK
+3382 ; [.10F8.0020.001C.3382][.0E33.0020.001D.3382] # SQUARE MU A; QQKN
+338C ; [.10F8.0020.001C.338C][.0EB9.0020.001D.338C] # SQUARE MU F; QQKN
+338D ; [.10F8.0020.001C.338D][.0EC1.0020.001C.338D] # SQUARE MU G; QQKN
+3395 ; [.10F8.0020.001C.3395][.0F2E.0020.001C.3395] # SQUARE MU L; QQKN
+339B ; [.10F8.0020.001C.339B][.0F5B.0020.001C.339B] # SQUARE MU M; QQKN
+33B2 ; [.10F8.0020.001C.33B2][.0FEA.0020.001C.33B2] # SQUARE MU S; QQKN
+33B6 ; [.10F8.0020.001C.33B6][.1044.0020.001D.33B6] # SQUARE MU V; QQKN
+33BC ; [.10F8.0020.001C.33BC][.1051.0020.001D.33BC] # SQUARE MU W; QQKN
+03BD ; [.10F9.0020.0002.03BD] # GREEK SMALL LETTER NU
+1D6CE ; [.10F9.0020.0005.1D6CE] # MATHEMATICAL BOLD SMALL NU; QQK
+1D708 ; [.10F9.0020.0005.1D708] # MATHEMATICAL ITALIC SMALL NU; QQK
+1D742 ; [.10F9.0020.0005.1D742] # MATHEMATICAL BOLD ITALIC SMALL NU; QQK
+1D77C ; [.10F9.0020.0005.1D77C] # MATHEMATICAL SANS-SERIF BOLD SMALL NU; QQK
+1D7B6 ; [.10F9.0020.0005.1D7B6] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU; QQK
+039D ; [.10F9.0020.0008.039D] # GREEK CAPITAL LETTER NU
+1D6B4 ; [.10F9.0020.000B.1D6B4] # MATHEMATICAL BOLD CAPITAL NU; QQK
+1D6EE ; [.10F9.0020.000B.1D6EE] # MATHEMATICAL ITALIC CAPITAL NU; QQK
+1D728 ; [.10F9.0020.000B.1D728] # MATHEMATICAL BOLD ITALIC CAPITAL NU; QQK
+1D762 ; [.10F9.0020.000B.1D762] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU; QQK
+1D79C ; [.10F9.0020.000B.1D79C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU; QQK
+03BE ; [.10FA.0020.0002.03BE] # GREEK SMALL LETTER XI
+1D6CF ; [.10FA.0020.0005.1D6CF] # MATHEMATICAL BOLD SMALL XI; QQK
+1D709 ; [.10FA.0020.0005.1D709] # MATHEMATICAL ITALIC SMALL XI; QQK
+1D743 ; [.10FA.0020.0005.1D743] # MATHEMATICAL BOLD ITALIC SMALL XI; QQK
+1D77D ; [.10FA.0020.0005.1D77D] # MATHEMATICAL SANS-SERIF BOLD SMALL XI; QQK
+1D7B7 ; [.10FA.0020.0005.1D7B7] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI; QQK
+039E ; [.10FA.0020.0008.039E] # GREEK CAPITAL LETTER XI
+1D6B5 ; [.10FA.0020.000B.1D6B5] # MATHEMATICAL BOLD CAPITAL XI; QQK
+1D6EF ; [.10FA.0020.000B.1D6EF] # MATHEMATICAL ITALIC CAPITAL XI; QQK
+1D729 ; [.10FA.0020.000B.1D729] # MATHEMATICAL BOLD ITALIC CAPITAL XI; QQK
+1D763 ; [.10FA.0020.000B.1D763] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI; QQK
+1D79D ; [.10FA.0020.000B.1D79D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI; QQK
+03BF ; [.10FB.0020.0002.03BF] # GREEK SMALL LETTER OMICRON
+1D6D0 ; [.10FB.0020.0005.1D6D0] # MATHEMATICAL BOLD SMALL OMICRON; QQK
+1D70A ; [.10FB.0020.0005.1D70A] # MATHEMATICAL ITALIC SMALL OMICRON; QQK
+1D744 ; [.10FB.0020.0005.1D744] # MATHEMATICAL BOLD ITALIC SMALL OMICRON; QQK
+1D77E ; [.10FB.0020.0005.1D77E] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON; QQK
+1D7B8 ; [.10FB.0020.0005.1D7B8] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON; QQK
+039F ; [.10FB.0020.0008.039F] # GREEK CAPITAL LETTER OMICRON
+1D6B6 ; [.10FB.0020.000B.1D6B6] # MATHEMATICAL BOLD CAPITAL OMICRON; QQK
+1D6F0 ; [.10FB.0020.000B.1D6F0] # MATHEMATICAL ITALIC CAPITAL OMICRON; QQK
+1D72A ; [.10FB.0020.000B.1D72A] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON; QQK
+1D764 ; [.10FB.0020.000B.1D764] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON; QQK
+1D79E ; [.10FB.0020.000B.1D79E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON; QQK
+1F40 ; [.10FB.0020.0002.03BF][.0000.0022.0002.0313] # GREEK SMALL LETTER OMICRON WITH PSILI; QQCM
+1F48 ; [.10FB.0020.0008.039F][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMICRON WITH PSILI; QQCM
+1F44 ; [.10FB.0020.0002.03BF][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA; QQCM
+1F4C ; [.10FB.0020.0008.039F][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA; QQCM
+1F42 ; [.10FB.0020.0002.03BF][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA; QQCM
+1F4A ; [.10FB.0020.0008.039F][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA; QQCM
+1F41 ; [.10FB.0020.0002.03BF][.0000.002A.0002.0314] # GREEK SMALL LETTER OMICRON WITH DASIA; QQCM
+1F49 ; [.10FB.0020.0008.039F][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMICRON WITH DASIA; QQCM
+1F45 ; [.10FB.0020.0002.03BF][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA; QQCM
+1F4D ; [.10FB.0020.0008.039F][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA; QQCM
+1F43 ; [.10FB.0020.0002.03BF][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA; QQCM
+1F4B ; [.10FB.0020.0008.039F][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA; QQCM
+03CC ; [.10FB.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH TONOS; QQCM
+1F79 ; [.10FB.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH OXIA; QQCM
+038C ; [.10FB.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH TONOS; QQCM
+1FF9 ; [.10FB.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH OXIA; QQCM
+1F78 ; [.10FB.0020.0002.03BF][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH VARIA; QQCM
+1FF8 ; [.10FB.0020.0008.039F][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH VARIA; QQCM
+03C0 ; [.10FC.0020.0002.03C0] # GREEK SMALL LETTER PI
+03D6 ; [.10FC.0020.0004.03D6] # GREEK PI SYMBOL; QQK
+1D6D1 ; [.10FC.0020.0005.1D6D1] # MATHEMATICAL BOLD SMALL PI; QQK
+1D6E1 ; [.10FC.0020.0005.1D6E1] # MATHEMATICAL BOLD PI SYMBOL; QQK
+1D70B ; [.10FC.0020.0005.1D70B] # MATHEMATICAL ITALIC SMALL PI; QQK
+1D71B ; [.10FC.0020.0005.1D71B] # MATHEMATICAL ITALIC PI SYMBOL; QQK
+1D745 ; [.10FC.0020.0005.1D745] # MATHEMATICAL BOLD ITALIC SMALL PI; QQK
+1D755 ; [.10FC.0020.0005.1D755] # MATHEMATICAL BOLD ITALIC PI SYMBOL; QQK
+1D77F ; [.10FC.0020.0005.1D77F] # MATHEMATICAL SANS-SERIF BOLD SMALL PI; QQK
+1D78F ; [.10FC.0020.0005.1D78F] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL; QQK
+1D7B9 ; [.10FC.0020.0005.1D7B9] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI; QQK
+1D7C9 ; [.10FC.0020.0005.1D7C9] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL; QQK
+03A0 ; [.10FC.0020.0008.03A0] # GREEK CAPITAL LETTER PI
+213F ; [.10FC.0020.000B.213F] # DOUBLE-STRUCK CAPITAL PI; QQK
+1D6B7 ; [.10FC.0020.000B.1D6B7] # MATHEMATICAL BOLD CAPITAL PI; QQK
+1D6F1 ; [.10FC.0020.000B.1D6F1] # MATHEMATICAL ITALIC CAPITAL PI; QQK
+1D72B ; [.10FC.0020.000B.1D72B] # MATHEMATICAL BOLD ITALIC CAPITAL PI; QQK
+1D765 ; [.10FC.0020.000B.1D765] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI; QQK
+1D79F ; [.10FC.0020.000B.1D79F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI; QQK
+1D28 ; [.10FD.0020.0002.1D28] # GREEK LETTER SMALL CAPITAL PI
+03DF ; [.10FE.0020.0002.03DF] # GREEK SMALL LETTER KOPPA
+03DE ; [.10FE.0020.0008.03DE] # GREEK LETTER KOPPA
+03D9 ; [.10FF.0020.0002.03D9] # GREEK SMALL LETTER ARCHAIC KOPPA
+03D8 ; [.10FF.0020.0008.03D8] # GREEK LETTER ARCHAIC KOPPA
+03C1 ; [.1100.0020.0002.03C1] # GREEK SMALL LETTER RHO
+03F1 ; [.1100.0020.0004.03F1] # GREEK RHO SYMBOL; QQK
+1D6D2 ; [.1100.0020.0005.1D6D2] # MATHEMATICAL BOLD SMALL RHO; QQK
+1D6E0 ; [.1100.0020.0005.1D6E0] # MATHEMATICAL BOLD RHO SYMBOL; QQK
+1D70C ; [.1100.0020.0005.1D70C] # MATHEMATICAL ITALIC SMALL RHO; QQK
+1D71A ; [.1100.0020.0005.1D71A] # MATHEMATICAL ITALIC RHO SYMBOL; QQK
+1D746 ; [.1100.0020.0005.1D746] # MATHEMATICAL BOLD ITALIC SMALL RHO; QQK
+1D754 ; [.1100.0020.0005.1D754] # MATHEMATICAL BOLD ITALIC RHO SYMBOL; QQK
+1D780 ; [.1100.0020.0005.1D780] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO; QQK
+1D78E ; [.1100.0020.0005.1D78E] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL; QQK
+1D7BA ; [.1100.0020.0005.1D7BA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO; QQK
+1D7C8 ; [.1100.0020.0005.1D7C8] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL; QQK
+03A1 ; [.1100.0020.0008.03A1] # GREEK CAPITAL LETTER RHO
+1D6B8 ; [.1100.0020.000B.1D6B8] # MATHEMATICAL BOLD CAPITAL RHO; QQK
+1D6F2 ; [.1100.0020.000B.1D6F2] # MATHEMATICAL ITALIC CAPITAL RHO; QQK
+1D72C ; [.1100.0020.000B.1D72C] # MATHEMATICAL BOLD ITALIC CAPITAL RHO; QQK
+1D766 ; [.1100.0020.000B.1D766] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO; QQK
+1D7A0 ; [.1100.0020.000B.1D7A0] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO; QQK
+1D68 ; [.1100.0020.0015.1D68] # GREEK SUBSCRIPT SMALL LETTER RHO; QQK
+1FE4 ; [.1100.0020.0002.03C1][.0000.0022.0002.0313] # GREEK SMALL LETTER RHO WITH PSILI; QQCM
+1FE5 ; [.1100.0020.0002.03C1][.0000.002A.0002.0314] # GREEK SMALL LETTER RHO WITH DASIA; QQCM
+1FEC ; [.1100.0020.0008.03A1][.0000.002A.0002.0314] # GREEK CAPITAL LETTER RHO WITH DASIA; QQCM
+1D29 ; [.1101.0020.0002.1D29] # GREEK LETTER SMALL CAPITAL RHO
+03C3 ; [.1102.0020.0002.03C3] # GREEK SMALL LETTER SIGMA
+03F2 ; [.1102.0020.0004.03F2] # GREEK LUNATE SIGMA SYMBOL; QQK
+1D6D3 ; [.1102.0020.0005.1D6D3] # MATHEMATICAL BOLD SMALL FINAL SIGMA; QQK
+1D6D4 ; [.1102.0020.0005.1D6D4] # MATHEMATICAL BOLD SMALL SIGMA; QQK
+1D70D ; [.1102.0020.0005.1D70D] # MATHEMATICAL ITALIC SMALL FINAL SIGMA; QQK
+1D70E ; [.1102.0020.0005.1D70E] # MATHEMATICAL ITALIC SMALL SIGMA; QQK
+1D747 ; [.1102.0020.0005.1D747] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA; QQK
+1D748 ; [.1102.0020.0005.1D748] # MATHEMATICAL BOLD ITALIC SMALL SIGMA; QQK
+1D781 ; [.1102.0020.0005.1D781] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA; QQK
+1D782 ; [.1102.0020.0005.1D782] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA; QQK
+1D7BB ; [.1102.0020.0005.1D7BB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA; QQK
+1D7BC ; [.1102.0020.0005.1D7BC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA; QQK
+03A3 ; [.1102.0020.0008.03A3] # GREEK CAPITAL LETTER SIGMA
+03F9 ; [.1102.0020.000A.03F9] # GREEK CAPITAL LUNATE SIGMA SYMBOL; QQK
+1D6BA ; [.1102.0020.000B.1D6BA] # MATHEMATICAL BOLD CAPITAL SIGMA; QQK
+1D6F4 ; [.1102.0020.000B.1D6F4] # MATHEMATICAL ITALIC CAPITAL SIGMA; QQK
+1D72E ; [.1102.0020.000B.1D72E] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA; QQK
+1D768 ; [.1102.0020.000B.1D768] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA; QQK
+1D7A2 ; [.1102.0020.000B.1D7A2] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA; QQK
+03C2 ; [.1102.0020.0019.03C2] # GREEK SMALL LETTER FINAL SIGMA; QQK
+03C4 ; [.1103.0020.0002.03C4] # GREEK SMALL LETTER TAU
+1D6D5 ; [.1103.0020.0005.1D6D5] # MATHEMATICAL BOLD SMALL TAU; QQK
+1D70F ; [.1103.0020.0005.1D70F] # MATHEMATICAL ITALIC SMALL TAU; QQK
+1D749 ; [.1103.0020.0005.1D749] # MATHEMATICAL BOLD ITALIC SMALL TAU; QQK
+1D783 ; [.1103.0020.0005.1D783] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU; QQK
+1D7BD ; [.1103.0020.0005.1D7BD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU; QQK
+03A4 ; [.1103.0020.0008.03A4] # GREEK CAPITAL LETTER TAU
+1D6BB ; [.1103.0020.000B.1D6BB] # MATHEMATICAL BOLD CAPITAL TAU; QQK
+1D6F5 ; [.1103.0020.000B.1D6F5] # MATHEMATICAL ITALIC CAPITAL TAU; QQK
+1D72F ; [.1103.0020.000B.1D72F] # MATHEMATICAL BOLD ITALIC CAPITAL TAU; QQK
+1D769 ; [.1103.0020.000B.1D769] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU; QQK
+1D7A3 ; [.1103.0020.000B.1D7A3] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU; QQK
+03C5 ; [.1104.0020.0002.03C5] # GREEK SMALL LETTER UPSILON
+1D6D6 ; [.1104.0020.0005.1D6D6] # MATHEMATICAL BOLD SMALL UPSILON; QQK
+1D710 ; [.1104.0020.0005.1D710] # MATHEMATICAL ITALIC SMALL UPSILON; QQK
+1D74A ; [.1104.0020.0005.1D74A] # MATHEMATICAL BOLD ITALIC SMALL UPSILON; QQK
+1D784 ; [.1104.0020.0005.1D784] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON; QQK
+1D7BE ; [.1104.0020.0005.1D7BE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON; QQK
+03A5 ; [.1104.0020.0008.03A5] # GREEK CAPITAL LETTER UPSILON
+03D2 ; [.1104.0020.000A.03D2] # GREEK UPSILON WITH HOOK SYMBOL; QQK
+1D6BC ; [.1104.0020.000B.1D6BC] # MATHEMATICAL BOLD CAPITAL UPSILON; QQK
+1D6F6 ; [.1104.0020.000B.1D6F6] # MATHEMATICAL ITALIC CAPITAL UPSILON; QQK
+1D730 ; [.1104.0020.000B.1D730] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON; QQK
+1D76A ; [.1104.0020.000B.1D76A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON; QQK
+1D7A4 ; [.1104.0020.000B.1D7A4] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON; QQK
+1F50 ; [.1104.0020.0002.03C5][.0000.0022.0002.0313] # GREEK SMALL LETTER UPSILON WITH PSILI; QQCM
+1F54 ; [.1104.0020.0002.03C5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA; QQCM
+1F52 ; [.1104.0020.0002.03C5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA; QQCM
+1F56 ; [.1104.0020.0002.03C5][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI; QQCM
+1F51 ; [.1104.0020.0002.03C5][.0000.002A.0002.0314] # GREEK SMALL LETTER UPSILON WITH DASIA; QQCM
+1F59 ; [.1104.0020.0008.03A5][.0000.002A.0002.0314] # GREEK CAPITAL LETTER UPSILON WITH DASIA; QQCM
+1F55 ; [.1104.0020.0002.03C5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA; QQCM
+1F5D ; [.1104.0020.0008.03A5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA; QQCM
+1F53 ; [.1104.0020.0002.03C5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA; QQCM
+1F5B ; [.1104.0020.0008.03A5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA; QQCM
+1F57 ; [.1104.0020.0002.03C5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI; QQCM
+1F5F ; [.1104.0020.0008.03A5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI; QQCM
+03CD ; [.1104.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH TONOS; QQCM
+1F7B ; [.1104.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH OXIA; QQCM
+038E ; [.1104.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH TONOS; QQCM
+1FEB ; [.1104.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH OXIA; QQCM
+03D3 ; [.1104.0020.000A.03D3][.0000.0032.0002.03D3] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL; QQKN
+1F7A ; [.1104.0020.0002.03C5][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH VARIA; QQCM
+1FEA ; [.1104.0020.0008.03A5][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH VARIA; QQCM
+1FE0 ; [.1104.0020.0002.03C5][.0000.0037.0002.0306] # GREEK SMALL LETTER UPSILON WITH VRACHY; QQCM
+1FE8 ; [.1104.0020.0008.03A5][.0000.0037.0002.0306] # GREEK CAPITAL LETTER UPSILON WITH VRACHY; QQCM
+1FE6 ; [.1104.0020.0002.03C5][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI; QQCM
+03CB ; [.1104.0020.0002.03C5][.0000.0047.0002.0308] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA; QQCM
+03AB ; [.1104.0020.0008.03A5][.0000.0047.0002.0308] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA; QQCM
+03D4 ; [.1104.0020.000A.03D4][.0000.0047.0002.03D4] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL; QQKN
+03B0 ; [.1104.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS; QQCM
+1FE3 ; [.1104.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA; QQCM
+1FE2 ; [.1104.0020.0002.03C5][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA; QQCM
+1FE7 ; [.1104.0020.0002.03C5][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI; QQCM
+1FE1 ; [.1104.0020.0002.03C5][.0000.005A.0002.0304] # GREEK SMALL LETTER UPSILON WITH MACRON; QQCM
+1FE9 ; [.1104.0020.0008.03A5][.0000.005A.0002.0304] # GREEK CAPITAL LETTER UPSILON WITH MACRON; QQCM
+03C6 ; [.1105.0020.0002.03C6] # GREEK SMALL LETTER PHI
+03D5 ; [.1105.0020.0004.03D5] # GREEK PHI SYMBOL; QQK
+1D6D7 ; [.1105.0020.0005.1D6D7] # MATHEMATICAL BOLD SMALL PHI; QQK
+1D6DF ; [.1105.0020.0005.1D6DF] # MATHEMATICAL BOLD PHI SYMBOL; QQK
+1D711 ; [.1105.0020.0005.1D711] # MATHEMATICAL ITALIC SMALL PHI; QQK
+1D719 ; [.1105.0020.0005.1D719] # MATHEMATICAL ITALIC PHI SYMBOL; QQK
+1D74B ; [.1105.0020.0005.1D74B] # MATHEMATICAL BOLD ITALIC SMALL PHI; QQK
+1D753 ; [.1105.0020.0005.1D753] # MATHEMATICAL BOLD ITALIC PHI SYMBOL; QQK
+1D785 ; [.1105.0020.0005.1D785] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI; QQK
+1D78D ; [.1105.0020.0005.1D78D] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL; QQK
+1D7BF ; [.1105.0020.0005.1D7BF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI; QQK
+1D7C7 ; [.1105.0020.0005.1D7C7] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL; QQK
+03A6 ; [.1105.0020.0008.03A6] # GREEK CAPITAL LETTER PHI
+1D6BD ; [.1105.0020.000B.1D6BD] # MATHEMATICAL BOLD CAPITAL PHI; QQK
+1D6F7 ; [.1105.0020.000B.1D6F7] # MATHEMATICAL ITALIC CAPITAL PHI; QQK
+1D731 ; [.1105.0020.000B.1D731] # MATHEMATICAL BOLD ITALIC CAPITAL PHI; QQK
+1D76B ; [.1105.0020.000B.1D76B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI; QQK
+1D7A5 ; [.1105.0020.000B.1D7A5] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI; QQK
+1D60 ; [.1105.0020.0014.1D60] # MODIFIER LETTER SMALL GREEK PHI; QQK
+1D69 ; [.1105.0020.0015.1D69] # GREEK SUBSCRIPT SMALL LETTER PHI; QQK
+03C7 ; [.1106.0020.0002.03C7] # GREEK SMALL LETTER CHI
+1D6D8 ; [.1106.0020.0005.1D6D8] # MATHEMATICAL BOLD SMALL CHI; QQK
+1D712 ; [.1106.0020.0005.1D712] # MATHEMATICAL ITALIC SMALL CHI; QQK
+1D74C ; [.1106.0020.0005.1D74C] # MATHEMATICAL BOLD ITALIC SMALL CHI; QQK
+1D786 ; [.1106.0020.0005.1D786] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI; QQK
+1D7C0 ; [.1106.0020.0005.1D7C0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI; QQK
+03A7 ; [.1106.0020.0008.03A7] # GREEK CAPITAL LETTER CHI
+1D6BE ; [.1106.0020.000B.1D6BE] # MATHEMATICAL BOLD CAPITAL CHI; QQK
+1D6F8 ; [.1106.0020.000B.1D6F8] # MATHEMATICAL ITALIC CAPITAL CHI; QQK
+1D732 ; [.1106.0020.000B.1D732] # MATHEMATICAL BOLD ITALIC CAPITAL CHI; QQK
+1D76C ; [.1106.0020.000B.1D76C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI; QQK
+1D7A6 ; [.1106.0020.000B.1D7A6] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI; QQK
+1D61 ; [.1106.0020.0014.1D61] # MODIFIER LETTER SMALL CHI; QQK
+1D6A ; [.1106.0020.0015.1D6A] # GREEK SUBSCRIPT SMALL LETTER CHI; QQK
+03C8 ; [.1107.0020.0002.03C8] # GREEK SMALL LETTER PSI
+1D6D9 ; [.1107.0020.0005.1D6D9] # MATHEMATICAL BOLD SMALL PSI; QQK
+1D713 ; [.1107.0020.0005.1D713] # MATHEMATICAL ITALIC SMALL PSI; QQK
+1D74D ; [.1107.0020.0005.1D74D] # MATHEMATICAL BOLD ITALIC SMALL PSI; QQK
+1D787 ; [.1107.0020.0005.1D787] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI; QQK
+1D7C1 ; [.1107.0020.0005.1D7C1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI; QQK
+03A8 ; [.1107.0020.0008.03A8] # GREEK CAPITAL LETTER PSI
+1D6BF ; [.1107.0020.000B.1D6BF] # MATHEMATICAL BOLD CAPITAL PSI; QQK
+1D6F9 ; [.1107.0020.000B.1D6F9] # MATHEMATICAL ITALIC CAPITAL PSI; QQK
+1D733 ; [.1107.0020.000B.1D733] # MATHEMATICAL BOLD ITALIC CAPITAL PSI; QQK
+1D76D ; [.1107.0020.000B.1D76D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI; QQK
+1D7A7 ; [.1107.0020.000B.1D7A7] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI; QQK
+1D2A ; [.1108.0020.0002.1D2A] # GREEK LETTER SMALL CAPITAL PSI
+03C9 ; [.1109.0020.0002.03C9] # GREEK SMALL LETTER OMEGA
+1D6DA ; [.1109.0020.0005.1D6DA] # MATHEMATICAL BOLD SMALL OMEGA; QQK
+1D714 ; [.1109.0020.0005.1D714] # MATHEMATICAL ITALIC SMALL OMEGA; QQK
+1D74E ; [.1109.0020.0005.1D74E] # MATHEMATICAL BOLD ITALIC SMALL OMEGA; QQK
+1D788 ; [.1109.0020.0005.1D788] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA; QQK
+1D7C2 ; [.1109.0020.0005.1D7C2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA; QQK
+03A9 ; [.1109.0020.0008.03A9] # GREEK CAPITAL LETTER OMEGA
+2126 ; [.1109.0020.0008.2126] # OHM SIGN; QQC
+1D6C0 ; [.1109.0020.000B.1D6C0] # MATHEMATICAL BOLD CAPITAL OMEGA; QQK
+1D6FA ; [.1109.0020.000B.1D6FA] # MATHEMATICAL ITALIC CAPITAL OMEGA; QQK
+1D734 ; [.1109.0020.000B.1D734] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA; QQK
+1D76E ; [.1109.0020.000B.1D76E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA; QQK
+1D7A8 ; [.1109.0020.000B.1D7A8] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA; QQK
+1F60 ; [.1109.0020.0002.03C9][.0000.0022.0002.0313] # GREEK SMALL LETTER OMEGA WITH PSILI; QQCM
+1F68 ; [.1109.0020.0008.03A9][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMEGA WITH PSILI; QQCM
+1F64 ; [.1109.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA; QQCM
+1F6C ; [.1109.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA; QQCM
+1FA4 ; [.1109.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1FAC ; [.1109.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F62 ; [.1109.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA; QQCM
+1F6A ; [.1109.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA; QQCM
+1FA2 ; [.1109.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1FAA ; [.1109.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F66 ; [.1109.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI; QQCM
+1F6E ; [.1109.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI; QQCM
+1FA6 ; [.1109.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FAE ; [.1109.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1FA0 ; [.1109.0020.0002.03C9][.0000.0022.0002.0313][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1FA8 ; [.1109.0020.0008.03A9][.0000.0022.0002.0313][.0000.0096.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F61 ; [.1109.0020.0002.03C9][.0000.002A.0002.0314] # GREEK SMALL LETTER OMEGA WITH DASIA; QQCM
+1F69 ; [.1109.0020.0008.03A9][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMEGA WITH DASIA; QQCM
+1F65 ; [.1109.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA; QQCM
+1F6D ; [.1109.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA; QQCM
+1FA5 ; [.1109.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1FAD ; [.1109.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F63 ; [.1109.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA; QQCM
+1F6B ; [.1109.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA; QQCM
+1FA3 ; [.1109.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1FAB ; [.1109.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F67 ; [.1109.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI; QQCM
+1F6F ; [.1109.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI; QQCM
+1FA7 ; [.1109.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FAF ; [.1109.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1FA1 ; [.1109.0020.0002.03C9][.0000.002A.0002.0314][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1FA9 ; [.1109.0020.0008.03A9][.0000.002A.0002.0314][.0000.0096.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03CE ; [.1109.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH TONOS; QQCM
+1F7D ; [.1109.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH OXIA; QQCM
+038F ; [.1109.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH TONOS; QQCM
+1FFB ; [.1109.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH OXIA; QQCM
+1FF4 ; [.1109.0020.0002.03C9][.0000.0032.0002.0301][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F7C ; [.1109.0020.0002.03C9][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH VARIA; QQCM
+1FFA ; [.1109.0020.0008.03A9][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH VARIA; QQCM
+1FF2 ; [.1109.0020.0002.03C9][.0000.0035.0002.0300][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FF6 ; [.1109.0020.0002.03C9][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI; QQCM
+1FF7 ; [.1109.0020.0002.03C9][.0000.0045.0002.0342][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FF3 ; [.1109.0020.0002.03C9][.0000.0096.0002.0345] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI; QQCM
+1FFC ; [.1109.0020.0008.03A9][.0000.0096.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI; QQCM
+03E1 ; [.110A.0020.0002.03E1] # GREEK SMALL LETTER SAMPI
+03E0 ; [.110A.0020.0008.03E0] # GREEK LETTER SAMPI
+03F8 ; [.110B.0020.0002.03F8] # GREEK SMALL LETTER SHO
+03F7 ; [.110B.0020.0008.03F7] # GREEK CAPITAL LETTER SHO
+03FB ; [.110C.0020.0002.03FB] # GREEK SMALL LETTER SAN
+03FA ; [.110C.0020.0008.03FA] # GREEK CAPITAL LETTER SAN
+03E3 ; [.110D.0020.0002.03E3] # COPTIC SMALL LETTER SHEI
+03E2 ; [.110D.0020.0008.03E2] # COPTIC CAPITAL LETTER SHEI
+03E5 ; [.110E.0020.0002.03E5] # COPTIC SMALL LETTER FEI
+03E4 ; [.110E.0020.0008.03E4] # COPTIC CAPITAL LETTER FEI
+03E7 ; [.110F.0020.0002.03E7] # COPTIC SMALL LETTER KHEI
+03E6 ; [.110F.0020.0008.03E6] # COPTIC CAPITAL LETTER KHEI
+03E9 ; [.1110.0020.0002.03E9] # COPTIC SMALL LETTER HORI
+03E8 ; [.1110.0020.0008.03E8] # COPTIC CAPITAL LETTER HORI
+03EB ; [.1111.0020.0002.03EB] # COPTIC SMALL LETTER GANGIA
+03EA ; [.1111.0020.0008.03EA] # COPTIC CAPITAL LETTER GANGIA
+03ED ; [.1112.0020.0002.03ED] # COPTIC SMALL LETTER SHIMA
+03EC ; [.1112.0020.0008.03EC] # COPTIC CAPITAL LETTER SHIMA
+03EF ; [.1113.0020.0002.03EF] # COPTIC SMALL LETTER DEI
+03EE ; [.1113.0020.0008.03EE] # COPTIC CAPITAL LETTER DEI
+0430 ; [.1114.0020.0002.0430] # CYRILLIC SMALL LETTER A
+0410 ; [.1114.0020.0008.0410] # CYRILLIC CAPITAL LETTER A
+04D1 ; [.1118.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE
+0430 0306 ; [.1118.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE
+04D0 ; [.1118.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE
+0410 0306 ; [.1118.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D3 ; [.111C.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+0430 0308 ; [.111C.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D2 ; [.111C.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+0410 0308 ; [.111C.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D9 ; [.1120.0020.0002.04D9] # CYRILLIC SMALL LETTER SCHWA
+04D8 ; [.1120.0020.0008.04D8] # CYRILLIC CAPITAL LETTER SCHWA
+04DB ; [.1124.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04D9 0308 ; [.1124.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DA ; [.1124.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04D8 0308 ; [.1124.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04D5 ; [.1128.0020.0002.04D5] # CYRILLIC SMALL LIGATURE A IE
+04D4 ; [.1128.0020.0008.04D4] # CYRILLIC CAPITAL LIGATURE A IE
+0431 ; [.112C.0020.0002.0431] # CYRILLIC SMALL LETTER BE
+0411 ; [.112C.0020.0008.0411] # CYRILLIC CAPITAL LETTER BE
+0432 ; [.1130.0020.0002.0432] # CYRILLIC SMALL LETTER VE
+0412 ; [.1130.0020.0008.0412] # CYRILLIC CAPITAL LETTER VE
+0433 ; [.1134.0020.0002.0433] # CYRILLIC SMALL LETTER GHE
+0413 ; [.1134.0020.0008.0413] # CYRILLIC CAPITAL LETTER GHE
+0491 ; [.1134.0020.0004.0491][.0000.015E.0004.0491] # CYRILLIC SMALL LETTER GHE WITH UPTURN; QQKN
+0490 ; [.1134.0020.000A.0490][.0000.015E.0004.0490] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN; QQKN
+0493 ; [.1138.0020.0002.0493] # CYRILLIC SMALL LETTER GHE WITH STROKE
+0492 ; [.1138.0020.0008.0492] # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0495 ; [.113C.0020.0002.0495] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0494 ; [.113C.0020.0008.0494] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0434 ; [.1140.0020.0002.0434] # CYRILLIC SMALL LETTER DE
+0414 ; [.1140.0020.0008.0414] # CYRILLIC CAPITAL LETTER DE
+0501 ; [.1144.0020.0002.0501] # CYRILLIC SMALL LETTER KOMI DE
+0500 ; [.1144.0020.0008.0500] # CYRILLIC CAPITAL LETTER KOMI DE
+0452 ; [.1145.0020.0002.0452] # CYRILLIC SMALL LETTER DJE
+0402 ; [.1145.0020.0008.0402] # CYRILLIC CAPITAL LETTER DJE
+0503 ; [.1149.0020.0002.0503] # CYRILLIC SMALL LETTER KOMI DJE
+0502 ; [.1149.0020.0008.0502] # CYRILLIC CAPITAL LETTER KOMI DJE
+0453 ; [.114A.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0433 0301 ; [.114A.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0403 ; [.114A.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0413 0301 ; [.114A.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0499 ; [.114E.0020.0002.0499] # CYRILLIC SMALL LETTER ZE WITH DESCENDER
+0498 ; [.114E.0020.0008.0498] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0435 ; [.1152.0020.0002.0435] # CYRILLIC SMALL LETTER IE
+0415 ; [.1152.0020.0008.0415] # CYRILLIC CAPITAL LETTER IE
+0450 ; [.1152.0020.0002.0435][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER IE WITH GRAVE; QQCM
+0400 ; [.1152.0020.0008.0415][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER IE WITH GRAVE; QQCM
+0451 ; [.1152.0020.0002.0435][.0000.0047.0002.0308] # CYRILLIC SMALL LETTER IO; QQCM
+0401 ; [.1152.0020.0008.0415][.0000.0047.0002.0308] # CYRILLIC CAPITAL LETTER IO; QQCM
+04D7 ; [.1156.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE
+0435 0306 ; [.1156.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE
+04D6 ; [.1156.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE
+0415 0306 ; [.1156.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE
+0454 ; [.115A.0020.0002.0454] # CYRILLIC SMALL LETTER UKRAINIAN IE
+0404 ; [.115A.0020.0008.0404] # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0436 ; [.115E.0020.0002.0436] # CYRILLIC SMALL LETTER ZHE
+0416 ; [.115E.0020.0008.0416] # CYRILLIC CAPITAL LETTER ZHE
+04C2 ; [.115E.0020.0002.0436][.0000.0037.0002.0306] # CYRILLIC SMALL LETTER ZHE WITH BREVE; QQCM
+04C1 ; [.115E.0020.0008.0416][.0000.0037.0002.0306] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE; QQCM
+04DD ; [.1162.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+0436 0308 ; [.1162.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DC ; [.1162.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+0416 0308 ; [.1162.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+0497 ; [.1166.0020.0002.0497] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0496 ; [.1166.0020.0008.0496] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0437 ; [.116A.0020.0002.0437] # CYRILLIC SMALL LETTER ZE
+0417 ; [.116A.0020.0008.0417] # CYRILLIC CAPITAL LETTER ZE
+0505 ; [.116E.0020.0002.0505] # CYRILLIC SMALL LETTER KOMI ZJE
+0504 ; [.116E.0020.0008.0504] # CYRILLIC CAPITAL LETTER KOMI ZJE
+04DF ; [.116F.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+0437 0308 ; [.116F.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04DE ; [.116F.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+0417 0308 ; [.116F.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+0455 ; [.1173.0020.0002.0455] # CYRILLIC SMALL LETTER DZE
+0405 ; [.1173.0020.0008.0405] # CYRILLIC CAPITAL LETTER DZE
+04E1 ; [.1177.0020.0002.04E1] # CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E0 ; [.1177.0020.0008.04E0] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+0507 ; [.117B.0020.0002.0507] # CYRILLIC SMALL LETTER KOMI DZJE
+0506 ; [.117B.0020.0008.0506] # CYRILLIC CAPITAL LETTER KOMI DZJE
+0438 ; [.117C.0020.0002.0438] # CYRILLIC SMALL LETTER I
+0418 ; [.117C.0020.0008.0418] # CYRILLIC CAPITAL LETTER I
+045D ; [.117C.0020.0002.0438][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER I WITH GRAVE; QQCM
+040D ; [.117C.0020.0008.0418][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER I WITH GRAVE; QQCM
+04E3 ; [.117C.0020.0002.0438][.0000.005A.0002.0304] # CYRILLIC SMALL LETTER I WITH MACRON; QQCM
+04E2 ; [.117C.0020.0008.0418][.0000.005A.0002.0304] # CYRILLIC CAPITAL LETTER I WITH MACRON; QQCM
+048B ; [.1180.0020.0002.048B] # CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048A ; [.1180.0020.0008.048A] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+04E5 ; [.1184.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS
+0438 0308 ; [.1184.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E4 ; [.1184.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+0418 0308 ; [.1184.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+0456 ; [.1188.0020.0002.0456] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0406 ; [.1188.0020.0008.0406] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0457 ; [.118C.0020.0002.0457] # CYRILLIC SMALL LETTER YI
+0456 0308 ; [.118C.0020.0002.0457] # CYRILLIC SMALL LETTER YI
+0407 ; [.118C.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI
+0406 0308 ; [.118C.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI
+0439 ; [.1190.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I
+0438 0306 ; [.1190.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I
+0419 ; [.1190.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I
+0418 0306 ; [.1190.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I
+0458 ; [.1194.0020.0002.0458] # CYRILLIC SMALL LETTER JE
+0408 ; [.1194.0020.0008.0408] # CYRILLIC CAPITAL LETTER JE
+043A ; [.1198.0020.0002.043A] # CYRILLIC SMALL LETTER KA
+041A ; [.1198.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA
+049B ; [.119C.0020.0002.049B] # CYRILLIC SMALL LETTER KA WITH DESCENDER
+049A ; [.119C.0020.0008.049A] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+04C4 ; [.11A0.0020.0002.04C4] # CYRILLIC SMALL LETTER KA WITH HOOK
+04C3 ; [.11A0.0020.0008.04C3] # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04A1 ; [.11A4.0020.0002.04A1] # CYRILLIC SMALL LETTER BASHKIR KA
+04A0 ; [.11A4.0020.0008.04A0] # CYRILLIC CAPITAL LETTER BASHKIR KA
+049F ; [.11A8.0020.0002.049F] # CYRILLIC SMALL LETTER KA WITH STROKE
+049E ; [.11A8.0020.0008.049E] # CYRILLIC CAPITAL LETTER KA WITH STROKE
+049D ; [.11AC.0020.0002.049D] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049C ; [.11AC.0020.0008.049C] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+043B ; [.11B0.0020.0002.043B] # CYRILLIC SMALL LETTER EL
+041B ; [.11B0.0020.0008.041B] # CYRILLIC CAPITAL LETTER EL
+1D2B ; [.11B4.0020.0002.1D2B] # CYRILLIC LETTER SMALL CAPITAL EL
+04C6 ; [.11B5.0020.0002.04C6] # CYRILLIC SMALL LETTER EL WITH TAIL
+04C5 ; [.11B5.0020.0008.04C5] # CYRILLIC CAPITAL LETTER EL WITH TAIL
+0459 ; [.11B9.0020.0002.0459] # CYRILLIC SMALL LETTER LJE
+0409 ; [.11B9.0020.0008.0409] # CYRILLIC CAPITAL LETTER LJE
+0509 ; [.11BD.0020.0002.0509] # CYRILLIC SMALL LETTER KOMI LJE
+0508 ; [.11BD.0020.0008.0508] # CYRILLIC CAPITAL LETTER KOMI LJE
+043C ; [.11BE.0020.0002.043C] # CYRILLIC SMALL LETTER EM
+041C ; [.11BE.0020.0008.041C] # CYRILLIC CAPITAL LETTER EM
+04CE ; [.11C2.0020.0002.04CE] # CYRILLIC SMALL LETTER EM WITH TAIL
+04CD ; [.11C2.0020.0008.04CD] # CYRILLIC CAPITAL LETTER EM WITH TAIL
+043D ; [.11C6.0020.0002.043D] # CYRILLIC SMALL LETTER EN
+041D ; [.11C6.0020.0008.041D] # CYRILLIC CAPITAL LETTER EN
+04CA ; [.11CA.0020.0002.04CA] # CYRILLIC SMALL LETTER EN WITH TAIL
+04C9 ; [.11CA.0020.0008.04C9] # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04A3 ; [.11CE.0020.0002.04A3] # CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A2 ; [.11CE.0020.0008.04A2] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04C8 ; [.11D2.0020.0002.04C8] # CYRILLIC SMALL LETTER EN WITH HOOK
+04C7 ; [.11D2.0020.0008.04C7] # CYRILLIC CAPITAL LETTER EN WITH HOOK
+04A5 ; [.11D6.0020.0002.04A5] # CYRILLIC SMALL LIGATURE EN GHE
+04A4 ; [.11D6.0020.0008.04A4] # CYRILLIC CAPITAL LIGATURE EN GHE
+045A ; [.11DA.0020.0002.045A] # CYRILLIC SMALL LETTER NJE
+040A ; [.11DA.0020.0008.040A] # CYRILLIC CAPITAL LETTER NJE
+050B ; [.11DE.0020.0002.050B] # CYRILLIC SMALL LETTER KOMI NJE
+050A ; [.11DE.0020.0008.050A] # CYRILLIC CAPITAL LETTER KOMI NJE
+043E ; [.11DF.0020.0002.043E] # CYRILLIC SMALL LETTER O
+041E ; [.11DF.0020.0008.041E] # CYRILLIC CAPITAL LETTER O
+04E7 ; [.11E3.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS
+043E 0308 ; [.11E3.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E6 ; [.11E3.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+041E 0308 ; [.11E3.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E9 ; [.11E7.0020.0002.04E9] # CYRILLIC SMALL LETTER BARRED O
+04E8 ; [.11E7.0020.0008.04E8] # CYRILLIC CAPITAL LETTER BARRED O
+04EB ; [.11EB.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04E9 0308 ; [.11EB.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EA ; [.11EB.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04E8 0308 ; [.11EB.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+043F ; [.11EF.0020.0002.043F] # CYRILLIC SMALL LETTER PE
+041F ; [.11EF.0020.0008.041F] # CYRILLIC CAPITAL LETTER PE
+04A7 ; [.11F3.0020.0002.04A7] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A6 ; [.11F3.0020.0008.04A6] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+0481 ; [.11F7.0020.0002.0481] # CYRILLIC SMALL LETTER KOPPA
+0480 ; [.11F7.0020.0008.0480] # CYRILLIC CAPITAL LETTER KOPPA
+0440 ; [.11FB.0020.0002.0440] # CYRILLIC SMALL LETTER ER
+0420 ; [.11FB.0020.0008.0420] # CYRILLIC CAPITAL LETTER ER
+048F ; [.11FF.0020.0002.048F] # CYRILLIC SMALL LETTER ER WITH TICK
+048E ; [.11FF.0020.0008.048E] # CYRILLIC CAPITAL LETTER ER WITH TICK
+0441 ; [.1203.0020.0002.0441] # CYRILLIC SMALL LETTER ES
+0421 ; [.1203.0020.0008.0421] # CYRILLIC CAPITAL LETTER ES
+050D ; [.1207.0020.0002.050D] # CYRILLIC SMALL LETTER KOMI SJE
+050C ; [.1207.0020.0008.050C] # CYRILLIC CAPITAL LETTER KOMI SJE
+04AB ; [.1208.0020.0002.04AB] # CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AA ; [.1208.0020.0008.04AA] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+0442 ; [.120C.0020.0002.0442] # CYRILLIC SMALL LETTER TE
+0422 ; [.120C.0020.0008.0422] # CYRILLIC CAPITAL LETTER TE
+050F ; [.1210.0020.0002.050F] # CYRILLIC SMALL LETTER KOMI TJE
+050E ; [.1210.0020.0008.050E] # CYRILLIC CAPITAL LETTER KOMI TJE
+04AD ; [.1211.0020.0002.04AD] # CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AC ; [.1211.0020.0008.04AC] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+045B ; [.1215.0020.0002.045B] # CYRILLIC SMALL LETTER TSHE
+040B ; [.1215.0020.0008.040B] # CYRILLIC CAPITAL LETTER TSHE
+045C ; [.1219.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+043A 0301 ; [.1219.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+040C ; [.1219.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+041A 0301 ; [.1219.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+0443 ; [.121D.0020.0002.0443] # CYRILLIC SMALL LETTER U
+0423 ; [.121D.0020.0008.0423] # CYRILLIC CAPITAL LETTER U
+04EF ; [.121D.0020.0002.0443][.0000.005A.0002.0304] # CYRILLIC SMALL LETTER U WITH MACRON; QQCM
+04EE ; [.121D.0020.0008.0423][.0000.005A.0002.0304] # CYRILLIC CAPITAL LETTER U WITH MACRON; QQCM
+045E ; [.1221.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U
+0443 0306 ; [.1221.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U
+040E ; [.1221.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U
+0423 0306 ; [.1221.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U
+04F1 ; [.1225.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS
+0443 0308 ; [.1225.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F0 ; [.1225.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+0423 0308 ; [.1225.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F3 ; [.1229.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+0443 030B ; [.1229.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F2 ; [.1229.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+0423 030B ; [.1229.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04AF ; [.122D.0020.0002.04AF] # CYRILLIC SMALL LETTER STRAIGHT U
+04AE ; [.122D.0020.0008.04AE] # CYRILLIC CAPITAL LETTER STRAIGHT U
+04B1 ; [.1231.0020.0002.04B1] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B0 ; [.1231.0020.0008.04B0] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+0479 ; [.1235.0020.0002.0479] # CYRILLIC SMALL LETTER UK
+0478 ; [.1235.0020.0008.0478] # CYRILLIC CAPITAL LETTER UK
+0444 ; [.1239.0020.0002.0444] # CYRILLIC SMALL LETTER EF
+0424 ; [.1239.0020.0008.0424] # CYRILLIC CAPITAL LETTER EF
+0445 ; [.123D.0020.0002.0445] # CYRILLIC SMALL LETTER HA
+0425 ; [.123D.0020.0008.0425] # CYRILLIC CAPITAL LETTER HA
+04B3 ; [.1241.0020.0002.04B3] # CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B2 ; [.1241.0020.0008.04B2] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04BB ; [.1245.0020.0002.04BB] # CYRILLIC SMALL LETTER SHHA
+04BA ; [.1245.0020.0008.04BA] # CYRILLIC CAPITAL LETTER SHHA
+0461 ; [.1249.0020.0002.0461] # CYRILLIC SMALL LETTER OMEGA
+0460 ; [.1249.0020.0008.0460] # CYRILLIC CAPITAL LETTER OMEGA
+047F ; [.124D.0020.0002.047F] # CYRILLIC SMALL LETTER OT
+047E ; [.124D.0020.0008.047E] # CYRILLIC CAPITAL LETTER OT
+047D ; [.1251.0020.0002.047D] # CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047C ; [.1251.0020.0008.047C] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047B ; [.1255.0020.0002.047B] # CYRILLIC SMALL LETTER ROUND OMEGA
+047A ; [.1255.0020.0008.047A] # CYRILLIC CAPITAL LETTER ROUND OMEGA
+0446 ; [.1259.0020.0002.0446] # CYRILLIC SMALL LETTER TSE
+0426 ; [.1259.0020.0008.0426] # CYRILLIC CAPITAL LETTER TSE
+04B5 ; [.125D.0020.0002.04B5] # CYRILLIC SMALL LIGATURE TE TSE
+04B4 ; [.125D.0020.0008.04B4] # CYRILLIC CAPITAL LIGATURE TE TSE
+0447 ; [.1261.0020.0002.0447] # CYRILLIC SMALL LETTER CHE
+0427 ; [.1261.0020.0008.0427] # CYRILLIC CAPITAL LETTER CHE
+04F5 ; [.1265.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+0447 0308 ; [.1265.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F4 ; [.1265.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+0427 0308 ; [.1265.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04B7 ; [.1269.0020.0002.04B7] # CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B6 ; [.1269.0020.0008.04B6] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04CC ; [.126D.0020.0002.04CC] # CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CB ; [.126D.0020.0008.04CB] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04B9 ; [.1271.0020.0002.04B9] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04B8 ; [.1271.0020.0008.04B8] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04BD ; [.1275.0020.0002.04BD] # CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BC ; [.1275.0020.0008.04BC] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BF ; [.1279.0020.0002.04BF] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04BE ; [.1279.0020.0008.04BE] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+045F ; [.127D.0020.0002.045F] # CYRILLIC SMALL LETTER DZHE
+040F ; [.127D.0020.0008.040F] # CYRILLIC CAPITAL LETTER DZHE
+0448 ; [.1281.0020.0002.0448] # CYRILLIC SMALL LETTER SHA
+0428 ; [.1281.0020.0008.0428] # CYRILLIC CAPITAL LETTER SHA
+0449 ; [.1285.0020.0002.0449] # CYRILLIC SMALL LETTER SHCHA
+0429 ; [.1285.0020.0008.0429] # CYRILLIC CAPITAL LETTER SHCHA
+044A ; [.1289.0020.0002.044A] # CYRILLIC SMALL LETTER HARD SIGN
+042A ; [.1289.0020.0008.042A] # CYRILLIC CAPITAL LETTER HARD SIGN
+044B ; [.128D.0020.0002.044B] # CYRILLIC SMALL LETTER YERU
+042B ; [.128D.0020.0008.042B] # CYRILLIC CAPITAL LETTER YERU
+04F9 ; [.1291.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+044B 0308 ; [.1291.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04F8 ; [.1291.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+042B 0308 ; [.1291.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+044C ; [.1295.0020.0002.044C] # CYRILLIC SMALL LETTER SOFT SIGN
+042C ; [.1295.0020.0008.042C] # CYRILLIC CAPITAL LETTER SOFT SIGN
+048D ; [.1299.0020.0002.048D] # CYRILLIC SMALL LETTER SEMISOFT SIGN
+048C ; [.1299.0020.0008.048C] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+0463 ; [.129D.0020.0002.0463] # CYRILLIC SMALL LETTER YAT
+0462 ; [.129D.0020.0008.0462] # CYRILLIC CAPITAL LETTER YAT
+044D ; [.12A1.0020.0002.044D] # CYRILLIC SMALL LETTER E
+042D ; [.12A1.0020.0008.042D] # CYRILLIC CAPITAL LETTER E
+04ED ; [.12A5.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS
+044D 0308 ; [.12A5.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EC ; [.12A5.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+042D 0308 ; [.12A5.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+044E ; [.12A9.0020.0002.044E] # CYRILLIC SMALL LETTER YU
+042E ; [.12A9.0020.0008.042E] # CYRILLIC CAPITAL LETTER YU
+044F ; [.12AD.0020.0002.044F] # CYRILLIC SMALL LETTER YA
+042F ; [.12AD.0020.0008.042F] # CYRILLIC CAPITAL LETTER YA
+0465 ; [.12B1.0020.0002.0465] # CYRILLIC SMALL LETTER IOTIFIED E
+0464 ; [.12B1.0020.0008.0464] # CYRILLIC CAPITAL LETTER IOTIFIED E
+0467 ; [.12B5.0020.0002.0467] # CYRILLIC SMALL LETTER LITTLE YUS
+0466 ; [.12B5.0020.0008.0466] # CYRILLIC CAPITAL LETTER LITTLE YUS
+046B ; [.12B9.0020.0002.046B] # CYRILLIC SMALL LETTER BIG YUS
+046A ; [.12B9.0020.0008.046A] # CYRILLIC CAPITAL LETTER BIG YUS
+0469 ; [.12BD.0020.0002.0469] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+0468 ; [.12BD.0020.0008.0468] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+046D ; [.12C1.0020.0002.046D] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+046C ; [.12C1.0020.0008.046C] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046F ; [.12C5.0020.0002.046F] # CYRILLIC SMALL LETTER KSI
+046E ; [.12C5.0020.0008.046E] # CYRILLIC CAPITAL LETTER KSI
+0471 ; [.12C9.0020.0002.0471] # CYRILLIC SMALL LETTER PSI
+0470 ; [.12C9.0020.0008.0470] # CYRILLIC CAPITAL LETTER PSI
+0473 ; [.12CD.0020.0002.0473] # CYRILLIC SMALL LETTER FITA
+0472 ; [.12CD.0020.0008.0472] # CYRILLIC CAPITAL LETTER FITA
+0475 ; [.12D1.0020.0002.0475] # CYRILLIC SMALL LETTER IZHITSA
+0474 ; [.12D1.0020.0008.0474] # CYRILLIC CAPITAL LETTER IZHITSA
+0477 ; [.12D5.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0475 030F ; [.12D5.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0476 ; [.12D5.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0474 030F ; [.12D5.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+04A9 ; [.12D9.0020.0002.04A9] # CYRILLIC SMALL LETTER ABKHASIAN HA
+04A8 ; [.12D9.0020.0008.04A8] # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04C0 ; [.12DD.0020.0008.04C0] # CYRILLIC LETTER PALOCHKA
+10D0 ; [.12E1.0020.0002.10D0] # GEORGIAN LETTER AN
+10A0 ; [.12E1.0020.0008.10A0] # GEORGIAN CAPITAL LETTER AN
+10D1 ; [.12E2.0020.0002.10D1] # GEORGIAN LETTER BAN
+10A1 ; [.12E2.0020.0008.10A1] # GEORGIAN CAPITAL LETTER BAN
+10D2 ; [.12E3.0020.0002.10D2] # GEORGIAN LETTER GAN
+10A2 ; [.12E3.0020.0008.10A2] # GEORGIAN CAPITAL LETTER GAN
+10D3 ; [.12E4.0020.0002.10D3] # GEORGIAN LETTER DON
+10A3 ; [.12E4.0020.0008.10A3] # GEORGIAN CAPITAL LETTER DON
+10D4 ; [.12E5.0020.0002.10D4] # GEORGIAN LETTER EN
+10A4 ; [.12E5.0020.0008.10A4] # GEORGIAN CAPITAL LETTER EN
+10D5 ; [.12E6.0020.0002.10D5] # GEORGIAN LETTER VIN
+10A5 ; [.12E6.0020.0008.10A5] # GEORGIAN CAPITAL LETTER VIN
+10D6 ; [.12E7.0020.0002.10D6] # GEORGIAN LETTER ZEN
+10A6 ; [.12E7.0020.0008.10A6] # GEORGIAN CAPITAL LETTER ZEN
+10F1 ; [.12E8.0020.0002.10F1] # GEORGIAN LETTER HE
+10C1 ; [.12E8.0020.0008.10C1] # GEORGIAN CAPITAL LETTER HE
+10D7 ; [.12E9.0020.0002.10D7] # GEORGIAN LETTER TAN
+10A7 ; [.12E9.0020.0008.10A7] # GEORGIAN CAPITAL LETTER TAN
+10D8 ; [.12EA.0020.0002.10D8] # GEORGIAN LETTER IN
+10A8 ; [.12EA.0020.0008.10A8] # GEORGIAN CAPITAL LETTER IN
+10D9 ; [.12EB.0020.0002.10D9] # GEORGIAN LETTER KAN
+10A9 ; [.12EB.0020.0008.10A9] # GEORGIAN CAPITAL LETTER KAN
+10DA ; [.12EC.0020.0002.10DA] # GEORGIAN LETTER LAS
+10AA ; [.12EC.0020.0008.10AA] # GEORGIAN CAPITAL LETTER LAS
+10DB ; [.12ED.0020.0002.10DB] # GEORGIAN LETTER MAN
+10AB ; [.12ED.0020.0008.10AB] # GEORGIAN CAPITAL LETTER MAN
+10DC ; [.12EE.0020.0002.10DC] # GEORGIAN LETTER NAR
+10AC ; [.12EE.0020.0008.10AC] # GEORGIAN CAPITAL LETTER NAR
+10F2 ; [.12EF.0020.0002.10F2] # GEORGIAN LETTER HIE
+10C2 ; [.12EF.0020.0008.10C2] # GEORGIAN CAPITAL LETTER HIE
+10DD ; [.12F0.0020.0002.10DD] # GEORGIAN LETTER ON
+10AD ; [.12F0.0020.0008.10AD] # GEORGIAN CAPITAL LETTER ON
+10DE ; [.12F1.0020.0002.10DE] # GEORGIAN LETTER PAR
+10AE ; [.12F1.0020.0008.10AE] # GEORGIAN CAPITAL LETTER PAR
+10DF ; [.12F2.0020.0002.10DF] # GEORGIAN LETTER ZHAR
+10AF ; [.12F2.0020.0008.10AF] # GEORGIAN CAPITAL LETTER ZHAR
+10E0 ; [.12F3.0020.0002.10E0] # GEORGIAN LETTER RAE
+10B0 ; [.12F3.0020.0008.10B0] # GEORGIAN CAPITAL LETTER RAE
+10E1 ; [.12F4.0020.0002.10E1] # GEORGIAN LETTER SAN
+10B1 ; [.12F4.0020.0008.10B1] # GEORGIAN CAPITAL LETTER SAN
+10E2 ; [.12F5.0020.0002.10E2] # GEORGIAN LETTER TAR
+10B2 ; [.12F5.0020.0008.10B2] # GEORGIAN CAPITAL LETTER TAR
+10F3 ; [.12F6.0020.0002.10F3] # GEORGIAN LETTER WE
+10C3 ; [.12F6.0020.0008.10C3] # GEORGIAN CAPITAL LETTER WE
+10E3 ; [.12F7.0020.0002.10E3] # GEORGIAN LETTER UN
+10B3 ; [.12F7.0020.0008.10B3] # GEORGIAN CAPITAL LETTER UN
+10E4 ; [.12F8.0020.0002.10E4] # GEORGIAN LETTER PHAR
+10B4 ; [.12F8.0020.0008.10B4] # GEORGIAN CAPITAL LETTER PHAR
+10E5 ; [.12F9.0020.0002.10E5] # GEORGIAN LETTER KHAR
+10B5 ; [.12F9.0020.0008.10B5] # GEORGIAN CAPITAL LETTER KHAR
+10E6 ; [.12FA.0020.0002.10E6] # GEORGIAN LETTER GHAN
+10B6 ; [.12FA.0020.0008.10B6] # GEORGIAN CAPITAL LETTER GHAN
+10E7 ; [.12FB.0020.0002.10E7] # GEORGIAN LETTER QAR
+10B7 ; [.12FB.0020.0008.10B7] # GEORGIAN CAPITAL LETTER QAR
+10E8 ; [.12FC.0020.0002.10E8] # GEORGIAN LETTER SHIN
+10B8 ; [.12FC.0020.0008.10B8] # GEORGIAN CAPITAL LETTER SHIN
+10E9 ; [.12FD.0020.0002.10E9] # GEORGIAN LETTER CHIN
+10B9 ; [.12FD.0020.0008.10B9] # GEORGIAN CAPITAL LETTER CHIN
+10EA ; [.12FE.0020.0002.10EA] # GEORGIAN LETTER CAN
+10BA ; [.12FE.0020.0008.10BA] # GEORGIAN CAPITAL LETTER CAN
+10EB ; [.12FF.0020.0002.10EB] # GEORGIAN LETTER JIL
+10BB ; [.12FF.0020.0008.10BB] # GEORGIAN CAPITAL LETTER JIL
+10EC ; [.1300.0020.0002.10EC] # GEORGIAN LETTER CIL
+10BC ; [.1300.0020.0008.10BC] # GEORGIAN CAPITAL LETTER CIL
+10ED ; [.1301.0020.0002.10ED] # GEORGIAN LETTER CHAR
+10BD ; [.1301.0020.0008.10BD] # GEORGIAN CAPITAL LETTER CHAR
+10EE ; [.1302.0020.0002.10EE] # GEORGIAN LETTER XAN
+10BE ; [.1302.0020.0008.10BE] # GEORGIAN CAPITAL LETTER XAN
+10F4 ; [.1303.0020.0002.10F4] # GEORGIAN LETTER HAR
+10C4 ; [.1303.0020.0008.10C4] # GEORGIAN CAPITAL LETTER HAR
+10EF ; [.1304.0020.0002.10EF] # GEORGIAN LETTER JHAN
+10BF ; [.1304.0020.0008.10BF] # GEORGIAN CAPITAL LETTER JHAN
+10F0 ; [.1305.0020.0002.10F0] # GEORGIAN LETTER HAE
+10C0 ; [.1305.0020.0008.10C0] # GEORGIAN CAPITAL LETTER HAE
+10F5 ; [.1306.0020.0002.10F5] # GEORGIAN LETTER HOE
+10C5 ; [.1306.0020.0008.10C5] # GEORGIAN CAPITAL LETTER HOE
+10F6 ; [.1307.0020.0002.10F6] # GEORGIAN LETTER FI
+10F7 ; [.1308.0020.0002.10F7] # GEORGIAN LETTER YN
+10F8 ; [.1309.0020.0002.10F8] # GEORGIAN LETTER ELIFI
+0561 ; [.130A.0020.0002.0561] # ARMENIAN SMALL LETTER AYB
+0531 ; [.130A.0020.0008.0531] # ARMENIAN CAPITAL LETTER AYB
+0562 ; [.130B.0020.0002.0562] # ARMENIAN SMALL LETTER BEN
+0532 ; [.130B.0020.0008.0532] # ARMENIAN CAPITAL LETTER BEN
+0563 ; [.130C.0020.0002.0563] # ARMENIAN SMALL LETTER GIM
+0533 ; [.130C.0020.0008.0533] # ARMENIAN CAPITAL LETTER GIM
+0564 ; [.130D.0020.0002.0564] # ARMENIAN SMALL LETTER DA
+0534 ; [.130D.0020.0008.0534] # ARMENIAN CAPITAL LETTER DA
+0565 ; [.130E.0020.0002.0565] # ARMENIAN SMALL LETTER ECH
+0535 ; [.130E.0020.0008.0535] # ARMENIAN CAPITAL LETTER ECH
+0587 ; [.130E.0020.0004.0587][.132B.0020.0004.0587] # ARMENIAN SMALL LIGATURE ECH YIWN; QQKN
+0566 ; [.130F.0020.0002.0566] # ARMENIAN SMALL LETTER ZA
+0536 ; [.130F.0020.0008.0536] # ARMENIAN CAPITAL LETTER ZA
+0567 ; [.1310.0020.0002.0567] # ARMENIAN SMALL LETTER EH
+0537 ; [.1310.0020.0008.0537] # ARMENIAN CAPITAL LETTER EH
+0568 ; [.1311.0020.0002.0568] # ARMENIAN SMALL LETTER ET
+0538 ; [.1311.0020.0008.0538] # ARMENIAN CAPITAL LETTER ET
+0569 ; [.1312.0020.0002.0569] # ARMENIAN SMALL LETTER TO
+0539 ; [.1312.0020.0008.0539] # ARMENIAN CAPITAL LETTER TO
+056A ; [.1313.0020.0002.056A] # ARMENIAN SMALL LETTER ZHE
+053A ; [.1313.0020.0008.053A] # ARMENIAN CAPITAL LETTER ZHE
+056B ; [.1314.0020.0002.056B] # ARMENIAN SMALL LETTER INI
+053B ; [.1314.0020.0008.053B] # ARMENIAN CAPITAL LETTER INI
+056C ; [.1315.0020.0002.056C] # ARMENIAN SMALL LETTER LIWN
+053C ; [.1315.0020.0008.053C] # ARMENIAN CAPITAL LETTER LIWN
+056D ; [.1316.0020.0002.056D] # ARMENIAN SMALL LETTER XEH
+053D ; [.1316.0020.0008.053D] # ARMENIAN CAPITAL LETTER XEH
+056E ; [.1317.0020.0002.056E] # ARMENIAN SMALL LETTER CA
+053E ; [.1317.0020.0008.053E] # ARMENIAN CAPITAL LETTER CA
+056F ; [.1318.0020.0002.056F] # ARMENIAN SMALL LETTER KEN
+053F ; [.1318.0020.0008.053F] # ARMENIAN CAPITAL LETTER KEN
+0570 ; [.1319.0020.0002.0570] # ARMENIAN SMALL LETTER HO
+0540 ; [.1319.0020.0008.0540] # ARMENIAN CAPITAL LETTER HO
+0571 ; [.131A.0020.0002.0571] # ARMENIAN SMALL LETTER JA
+0541 ; [.131A.0020.0008.0541] # ARMENIAN CAPITAL LETTER JA
+0572 ; [.131B.0020.0002.0572] # ARMENIAN SMALL LETTER GHAD
+0542 ; [.131B.0020.0008.0542] # ARMENIAN CAPITAL LETTER GHAD
+0573 ; [.131C.0020.0002.0573] # ARMENIAN SMALL LETTER CHEH
+0543 ; [.131C.0020.0008.0543] # ARMENIAN CAPITAL LETTER CHEH
+0574 ; [.131D.0020.0002.0574] # ARMENIAN SMALL LETTER MEN
+0544 ; [.131D.0020.0008.0544] # ARMENIAN CAPITAL LETTER MEN
+FB14 ; [.131D.0020.0004.FB14][.130E.0020.0004.FB14] # ARMENIAN SMALL LIGATURE MEN ECH; QQKN
+FB15 ; [.131D.0020.0004.FB15][.1314.0020.0004.FB15] # ARMENIAN SMALL LIGATURE MEN INI; QQKN
+FB17 ; [.131D.0020.0004.FB17][.1316.0020.0004.FB17] # ARMENIAN SMALL LIGATURE MEN XEH; QQKN
+FB13 ; [.131D.0020.0004.FB13][.131F.0020.0004.FB13] # ARMENIAN SMALL LIGATURE MEN NOW; QQKN
+0575 ; [.131E.0020.0002.0575] # ARMENIAN SMALL LETTER YI
+0545 ; [.131E.0020.0008.0545] # ARMENIAN CAPITAL LETTER YI
+0576 ; [.131F.0020.0002.0576] # ARMENIAN SMALL LETTER NOW
+0546 ; [.131F.0020.0008.0546] # ARMENIAN CAPITAL LETTER NOW
+0577 ; [.1320.0020.0002.0577] # ARMENIAN SMALL LETTER SHA
+0547 ; [.1320.0020.0008.0547] # ARMENIAN CAPITAL LETTER SHA
+0578 ; [.1321.0020.0002.0578] # ARMENIAN SMALL LETTER VO
+0548 ; [.1321.0020.0008.0548] # ARMENIAN CAPITAL LETTER VO
+0579 ; [.1322.0020.0002.0579] # ARMENIAN SMALL LETTER CHA
+0549 ; [.1322.0020.0008.0549] # ARMENIAN CAPITAL LETTER CHA
+057A ; [.1323.0020.0002.057A] # ARMENIAN SMALL LETTER PEH
+054A ; [.1323.0020.0008.054A] # ARMENIAN CAPITAL LETTER PEH
+057B ; [.1324.0020.0002.057B] # ARMENIAN SMALL LETTER JHEH
+054B ; [.1324.0020.0008.054B] # ARMENIAN CAPITAL LETTER JHEH
+057C ; [.1325.0020.0002.057C] # ARMENIAN SMALL LETTER RA
+054C ; [.1325.0020.0008.054C] # ARMENIAN CAPITAL LETTER RA
+057D ; [.1326.0020.0002.057D] # ARMENIAN SMALL LETTER SEH
+054D ; [.1326.0020.0008.054D] # ARMENIAN CAPITAL LETTER SEH
+057E ; [.1327.0020.0002.057E] # ARMENIAN SMALL LETTER VEW
+054E ; [.1327.0020.0008.054E] # ARMENIAN CAPITAL LETTER VEW
+FB16 ; [.1327.0020.0004.FB16][.131F.0020.0004.FB16] # ARMENIAN SMALL LIGATURE VEW NOW; QQKN
+057F ; [.1328.0020.0002.057F] # ARMENIAN SMALL LETTER TIWN
+054F ; [.1328.0020.0008.054F] # ARMENIAN CAPITAL LETTER TIWN
+0580 ; [.1329.0020.0002.0580] # ARMENIAN SMALL LETTER REH
+0550 ; [.1329.0020.0008.0550] # ARMENIAN CAPITAL LETTER REH
+0581 ; [.132A.0020.0002.0581] # ARMENIAN SMALL LETTER CO
+0551 ; [.132A.0020.0008.0551] # ARMENIAN CAPITAL LETTER CO
+0582 ; [.132B.0020.0002.0582] # ARMENIAN SMALL LETTER YIWN
+0552 ; [.132B.0020.0008.0552] # ARMENIAN CAPITAL LETTER YIWN
+0583 ; [.132C.0020.0002.0583] # ARMENIAN SMALL LETTER PIWR
+0553 ; [.132C.0020.0008.0553] # ARMENIAN CAPITAL LETTER PIWR
+0584 ; [.132D.0020.0002.0584] # ARMENIAN SMALL LETTER KEH
+0554 ; [.132D.0020.0008.0554] # ARMENIAN CAPITAL LETTER KEH
+0585 ; [.132E.0020.0002.0585] # ARMENIAN SMALL LETTER OH
+0555 ; [.132E.0020.0008.0555] # ARMENIAN CAPITAL LETTER OH
+0586 ; [.132F.0020.0002.0586] # ARMENIAN SMALL LETTER FEH
+0556 ; [.132F.0020.0008.0556] # ARMENIAN CAPITAL LETTER FEH
+0559 ; [.1330.0020.0002.0559] # ARMENIAN MODIFIER LETTER LEFT HALF RING
+05D0 ; [.1331.0020.0002.05D0] # HEBREW LETTER ALEF
+2135 ; [.1331.0020.0004.2135] # ALEF SYMBOL; QQK
+FB21 ; [.1331.0020.0005.FB21] # HEBREW LETTER WIDE ALEF; QQK
+FB2E ; [.1331.0020.0002.05D0][.0000.00B9.0002.05B7] # HEBREW LETTER ALEF WITH PATAH; QQCM
+FB2F ; [.1331.0020.0002.05D0][.0000.00BA.0002.05B8] # HEBREW LETTER ALEF WITH QAMATS; QQCM
+FB30 ; [.1331.0020.0002.05D0][.0000.00BF.0002.05BC] # HEBREW LETTER ALEF WITH MAPIQ; QQCM
+FB4F ; [.1331.0020.0004.FB4F][.133C.0020.0004.FB4F] # HEBREW LIGATURE ALEF LAMED; QQKN
+05D1 ; [.1332.0020.0002.05D1] # HEBREW LETTER BET
+2136 ; [.1332.0020.0004.2136] # BET SYMBOL; QQK
+FB31 ; [.1332.0020.0002.05D1][.0000.00BF.0002.05BC] # HEBREW LETTER BET WITH DAGESH; QQCM
+FB4C ; [.1332.0020.0002.05D1][.0000.00C2.0002.05BF] # HEBREW LETTER BET WITH RAFE; QQCM
+05D2 ; [.1333.0020.0002.05D2] # HEBREW LETTER GIMEL
+2137 ; [.1333.0020.0004.2137] # GIMEL SYMBOL; QQK
+FB32 ; [.1333.0020.0002.05D2][.0000.00BF.0002.05BC] # HEBREW LETTER GIMEL WITH DAGESH; QQCM
+05D3 ; [.1334.0020.0002.05D3] # HEBREW LETTER DALET
+2138 ; [.1334.0020.0004.2138] # DALET SYMBOL; QQK
+FB22 ; [.1334.0020.0005.FB22] # HEBREW LETTER WIDE DALET; QQK
+FB33 ; [.1334.0020.0002.05D3][.0000.00BF.0002.05BC] # HEBREW LETTER DALET WITH DAGESH; QQCM
+05D4 ; [.1335.0020.0002.05D4] # HEBREW LETTER HE
+FB23 ; [.1335.0020.0005.FB23] # HEBREW LETTER WIDE HE; QQK
+FB34 ; [.1335.0020.0002.05D4][.0000.00BF.0002.05BC] # HEBREW LETTER HE WITH MAPIQ; QQCM
+05D5 ; [.1336.0020.0002.05D5] # HEBREW LETTER VAV
+FB4B ; [.1336.0020.0002.05D5][.0000.00BB.0002.05B9] # HEBREW LETTER VAV WITH HOLAM; QQCM
+FB35 ; [.1336.0020.0002.05D5][.0000.00BF.0002.05BC] # HEBREW LETTER VAV WITH DAGESH; QQCM
+05F0 ; [.1336.0020.0004.05F0][.1336.0020.0004.05F0] # HEBREW LIGATURE YIDDISH DOUBLE VAV; QQKN
+05F1 ; [.1336.0020.0004.05F1][.133A.0020.0004.05F1] # HEBREW LIGATURE YIDDISH VAV YOD; QQKN
+05D6 ; [.1337.0020.0002.05D6] # HEBREW LETTER ZAYIN
+FB36 ; [.1337.0020.0002.05D6][.0000.00BF.0002.05BC] # HEBREW LETTER ZAYIN WITH DAGESH; QQCM
+05D7 ; [.1338.0020.0002.05D7] # HEBREW LETTER HET
+05D8 ; [.1339.0020.0002.05D8] # HEBREW LETTER TET
+FB38 ; [.1339.0020.0002.05D8][.0000.00BF.0002.05BC] # HEBREW LETTER TET WITH DAGESH; QQCM
+05D9 ; [.133A.0020.0002.05D9] # HEBREW LETTER YOD
+FB1D ; [.133A.0020.0002.05D9][.0000.00B6.0002.05B4] # HEBREW LETTER YOD WITH HIRIQ; QQCM
+FB39 ; [.133A.0020.0002.05D9][.0000.00BF.0002.05BC] # HEBREW LETTER YOD WITH DAGESH; QQCM
+05F2 ; [.133A.0020.0004.05F2][.133A.0020.0004.05F2] # HEBREW LIGATURE YIDDISH DOUBLE YOD; QQKN
+FB1F ; [.133A.0020.0004.FB1F][.133A.0020.0004.FB1F][.0000.00B9.0002.FB1F] # HEBREW LIGATURE YIDDISH YOD YOD PATAH; QQKN
+05DB ; [.133B.0020.0002.05DB] # HEBREW LETTER KAF
+FB24 ; [.133B.0020.0005.FB24] # HEBREW LETTER WIDE KAF; QQK
+05DA ; [.133B.0020.0019.05DA] # HEBREW LETTER FINAL KAF; QQK
+FB3B ; [.133B.0020.0002.05DB][.0000.00BF.0002.05BC] # HEBREW LETTER KAF WITH DAGESH; QQCM
+FB3A ; [.133B.0020.0019.FB3A][.0000.00BF.0002.FB3A] # HEBREW LETTER FINAL KAF WITH DAGESH; QQKN
+FB4D ; [.133B.0020.0002.05DB][.0000.00C2.0002.05BF] # HEBREW LETTER KAF WITH RAFE; QQCM
+05DC ; [.133C.0020.0002.05DC] # HEBREW LETTER LAMED
+FB25 ; [.133C.0020.0005.FB25] # HEBREW LETTER WIDE LAMED; QQK
+FB3C ; [.133C.0020.0002.05DC][.0000.00BF.0002.05BC] # HEBREW LETTER LAMED WITH DAGESH; QQCM
+05DE ; [.133D.0020.0002.05DE] # HEBREW LETTER MEM
+FB26 ; [.133D.0020.0005.FB26] # HEBREW LETTER WIDE FINAL MEM; QQK
+05DD ; [.133D.0020.0019.05DD] # HEBREW LETTER FINAL MEM; QQK
+FB3E ; [.133D.0020.0002.05DE][.0000.00BF.0002.05BC] # HEBREW LETTER MEM WITH DAGESH; QQCM
+05E0 ; [.133E.0020.0002.05E0] # HEBREW LETTER NUN
+05DF ; [.133E.0020.0019.05DF] # HEBREW LETTER FINAL NUN; QQK
+FB40 ; [.133E.0020.0002.05E0][.0000.00BF.0002.05BC] # HEBREW LETTER NUN WITH DAGESH; QQCM
+05E1 ; [.133F.0020.0002.05E1] # HEBREW LETTER SAMEKH
+FB41 ; [.133F.0020.0002.05E1][.0000.00BF.0002.05BC] # HEBREW LETTER SAMEKH WITH DAGESH; QQCM
+05E2 ; [.1340.0020.0002.05E2] # HEBREW LETTER AYIN
+FB20 ; [.1340.0020.0005.FB20] # HEBREW LETTER ALTERNATIVE AYIN; QQK
+05E4 ; [.1341.0020.0002.05E4] # HEBREW LETTER PE
+05E3 ; [.1341.0020.0019.05E3] # HEBREW LETTER FINAL PE; QQK
+FB44 ; [.1341.0020.0002.05E4][.0000.00BF.0002.05BC] # HEBREW LETTER PE WITH DAGESH; QQCM
+FB43 ; [.1341.0020.0019.FB43][.0000.00BF.0002.FB43] # HEBREW LETTER FINAL PE WITH DAGESH; QQKN
+FB4E ; [.1341.0020.0002.05E4][.0000.00C2.0002.05BF] # HEBREW LETTER PE WITH RAFE; QQCM
+05E6 ; [.1342.0020.0002.05E6] # HEBREW LETTER TSADI
+05E5 ; [.1342.0020.0019.05E5] # HEBREW LETTER FINAL TSADI; QQK
+FB46 ; [.1342.0020.0002.05E6][.0000.00BF.0002.05BC] # HEBREW LETTER TSADI WITH DAGESH; QQCM
+05E7 ; [.1343.0020.0002.05E7] # HEBREW LETTER QOF
+FB47 ; [.1343.0020.0002.05E7][.0000.00BF.0002.05BC] # HEBREW LETTER QOF WITH DAGESH; QQCM
+05E8 ; [.1344.0020.0002.05E8] # HEBREW LETTER RESH
+FB27 ; [.1344.0020.0005.FB27] # HEBREW LETTER WIDE RESH; QQK
+FB48 ; [.1344.0020.0002.05E8][.0000.00BF.0002.05BC] # HEBREW LETTER RESH WITH DAGESH; QQCM
+05E9 ; [.1345.0020.0002.05E9] # HEBREW LETTER SHIN
+FB2B ; [.1345.0020.0002.05E9][.0000.00BD.0002.05C2] # HEBREW LETTER SHIN WITH SIN DOT; QQCM
+FB2A ; [.1345.0020.0002.05E9][.0000.00BE.0002.05C1] # HEBREW LETTER SHIN WITH SHIN DOT; QQCM
+FB49 ; [.1345.0020.0002.05E9][.0000.00BF.0002.05BC] # HEBREW LETTER SHIN WITH DAGESH; QQCM
+FB2D ; [.1345.0020.0002.05E9][.0000.00BF.0002.05BC][.0000.00BD.0002.05C2] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT; QQCM
+FB2C ; [.1345.0020.0002.05E9][.0000.00BF.0002.05BC][.0000.00BE.0002.05C1] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT; QQCM
+05EA ; [.1346.0020.0002.05EA] # HEBREW LETTER TAV
+FB28 ; [.1346.0020.0005.FB28] # HEBREW LETTER WIDE TAV; QQK
+FB4A ; [.1346.0020.0002.05EA][.0000.00BF.0002.05BC] # HEBREW LETTER TAV WITH DAGESH; QQCM
+0621 ; [.1347.0020.0002.0621] # ARABIC LETTER HAMZA
+0674 ; [.1347.0020.0004.0674] # ARABIC LETTER HIGH HAMZA; QQK
+FE80 ; [.1347.0020.001A.FE80] # ARABIC LETTER HAMZA ISOLATED FORM; QQK
+06FD ; [.1347.0020.0004.06FD][.0000.015E.0004.06FD] # ARABIC SIGN SINDHI AMPERSAND; QQKN
+0622 ; [.1348.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE
+0627 0653 ; [.1348.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE
+FE82 ; [.1348.0020.0019.FE82] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM; QQK
+FE81 ; [.1348.0020.001A.FE81] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM; QQK
+0623 ; [.1349.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0627 0654 ; [.1349.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE
+FE84 ; [.1349.0020.0019.FE84] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM; QQK
+FE83 ; [.1349.0020.001A.FE83] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM; QQK
+0672 ; [.134A.0020.0002.0672] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0671 ; [.134B.0020.0002.0671] # ARABIC LETTER ALEF WASLA
+FB51 ; [.134B.0020.0019.FB51] # ARABIC LETTER ALEF WASLA FINAL FORM; QQK
+FB50 ; [.134B.0020.001A.FB50] # ARABIC LETTER ALEF WASLA ISOLATED FORM; QQK
+0624 ; [.134C.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE
+0648 0654 ; [.134C.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE
+FE86 ; [.134C.0020.0019.FE86] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM; QQK
+FE85 ; [.134C.0020.001A.FE85] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM; QQK
+0625 ; [.134D.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW
+0627 0655 ; [.134D.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW
+FE88 ; [.134D.0020.0019.FE88] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM; QQK
+FE87 ; [.134D.0020.001A.FE87] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM; QQK
+0673 ; [.134E.0020.0002.0673] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0626 ; [.134F.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE
+064A 0654 ; [.134F.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE
+FE8B ; [.134F.0020.0017.FE8B] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM; QQK
+FE8C ; [.134F.0020.0018.FE8C] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM; QQK
+FE8A ; [.134F.0020.0019.FE8A] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM; QQK
+FE89 ; [.134F.0020.001A.FE89] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM; QQK
+FBEB ; [.134F.0020.0019.FBEB][.1350.0020.0019.FBEB] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM; QQKN
+FBEA ; [.134F.0020.001A.FBEA][.1350.0020.001A.FBEA] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM; QQKN
+FC97 ; [.134F.0020.0017.FC97][.135E.0020.0017.FC97] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM; QQKN
+FC00 ; [.134F.0020.001A.FC00][.135E.0020.001A.FC00] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM; QQKN
+FC98 ; [.134F.0020.0017.FC98][.1364.0020.0017.FC98] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM; QQKN
+FC01 ; [.134F.0020.001A.FC01][.1364.0020.001A.FC01] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM; QQKN
+FC99 ; [.134F.0020.0017.FC99][.1365.0020.0017.FC99] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM; QQKN
+FC64 ; [.134F.0020.0019.FC64][.1375.0020.0019.FC64] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM; QQKN
+FC65 ; [.134F.0020.0019.FC65][.1376.0020.0019.FC65] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM; QQKN
+FC9A ; [.134F.0020.0017.FC9A][.13B0.0020.0017.FC9A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM; QQKN
+FCDF ; [.134F.0020.0018.FCDF][.13B0.0020.0018.FCDF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM; QQKN
+FC66 ; [.134F.0020.0019.FC66][.13B0.0020.0019.FC66] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM; QQKN
+FC02 ; [.134F.0020.001A.FC02][.13B0.0020.001A.FC02] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM; QQKN
+FC67 ; [.134F.0020.0019.FC67][.13B1.0020.0019.FC67] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM; QQKN
+FC9B ; [.134F.0020.0017.FC9B][.13B7.0020.0017.FC9B] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM; QQKN
+FCE0 ; [.134F.0020.0018.FCE0][.13B7.0020.0018.FCE0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM; QQKN
+FBED ; [.134F.0020.0019.FBED][.13BC.0020.0019.FBED] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM; QQKN
+FBEC ; [.134F.0020.001A.FBEC][.13BC.0020.001A.FBEC] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM; QQKN
+FBEF ; [.134F.0020.0019.FBEF][.13BD.0020.0019.FBEF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM; QQKN
+FBEE ; [.134F.0020.001A.FBEE][.13BD.0020.001A.FBEE] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM; QQKN
+FBF3 ; [.134F.0020.0019.FBF3][.13C0.0020.0019.FBF3] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM; QQKN
+FBF2 ; [.134F.0020.001A.FBF2][.13C0.0020.001A.FBF2] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM; QQKN
+FBF1 ; [.134F.0020.0019.FBF1][.13C1.0020.0019.FBF1] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM; QQKN
+FBF0 ; [.134F.0020.001A.FBF0][.13C1.0020.001A.FBF0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM; QQKN
+FBF5 ; [.134F.0020.0019.FBF5][.13C2.0020.0019.FBF5] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM; QQKN
+FBF4 ; [.134F.0020.001A.FBF4][.13C2.0020.001A.FBF4] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM; QQKN
+FBFB ; [.134F.0020.0017.FBFB][.13C7.0020.0017.FBFB] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM; QQKN
+FBFA ; [.134F.0020.0019.FBFA][.13C7.0020.0019.FBFA] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM; QQKN
+FC68 ; [.134F.0020.0019.FC68][.13C7.0020.0019.FC68] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM; QQKN
+FBF9 ; [.134F.0020.001A.FBF9][.13C7.0020.001A.FBF9] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC03 ; [.134F.0020.001A.FC03][.13C7.0020.001A.FC03] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC69 ; [.134F.0020.0019.FC69][.13C8.0020.0019.FC69] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM; QQKN
+FC04 ; [.134F.0020.001A.FC04][.13C8.0020.001A.FC04] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM; QQKN
+FBF8 ; [.134F.0020.0017.FBF8][.13CC.0020.0017.FBF8] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM; QQKN
+FBF7 ; [.134F.0020.0019.FBF7][.13CC.0020.0019.FBF7] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM; QQKN
+FBF6 ; [.134F.0020.001A.FBF6][.13CC.0020.001A.FBF6] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM; QQKN
+0627 ; [.1350.0020.0002.0627] # ARABIC LETTER ALEF
+FE8E ; [.1350.0020.0019.FE8E] # ARABIC LETTER ALEF FINAL FORM; QQK
+FE8D ; [.1350.0020.001A.FE8D] # ARABIC LETTER ALEF ISOLATED FORM; QQK
+FD3C ; [.1350.0020.0019.FD3C][.0000.00C4.0019.FD3C] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM; QQKN
+FD3D ; [.1350.0020.001A.FD3D][.0000.00C4.001A.FD3D] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM; QQKN
+0675 ; [.1350.0020.0004.0675][.1347.0020.0004.0675] # ARABIC LETTER HIGH HAMZA ALEF; QQKN
+FDF3 ; [.1350.0020.001A.FDF3][.139E.0020.001A.FDF3][.1352.0020.001F.FDF3][.1375.0020.001F.FDF3] # ARABIC LIGATURE AKBAR ISOLATED FORM; QQKN
+FDF2 ; [.1350.0020.001A.FDF2][.13AB.0020.001A.FDF2][.13AB.0020.001F.FDF2][.13B7.0020.001F.FDF2] # ARABIC LIGATURE ALLAH ISOLATED FORM; QQKN
+066E ; [.1351.0020.0002.066E] # ARABIC LETTER DOTLESS BEH
+0628 ; [.1352.0020.0002.0628] # ARABIC LETTER BEH
+FE91 ; [.1352.0020.0017.FE91] # ARABIC LETTER BEH INITIAL FORM; QQK
+FE92 ; [.1352.0020.0018.FE92] # ARABIC LETTER BEH MEDIAL FORM; QQK
+FE90 ; [.1352.0020.0019.FE90] # ARABIC LETTER BEH FINAL FORM; QQK
+FE8F ; [.1352.0020.001A.FE8F] # ARABIC LETTER BEH ISOLATED FORM; QQK
+FC9C ; [.1352.0020.0017.FC9C][.135E.0020.0017.FC9C] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM; QQKN
+FC05 ; [.1352.0020.001A.FC05][.135E.0020.001A.FC05] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM; QQKN
+FC9D ; [.1352.0020.0017.FC9D][.1364.0020.0017.FC9D] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM; QQKN
+FC06 ; [.1352.0020.001A.FC06][.1364.0020.001A.FC06] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM; QQKN
+FDC2 ; [.1352.0020.0019.FDC2][.1364.0020.0019.FDC2][.13C8.0020.001F.FDC2] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM; QQKN
+FC9E ; [.1352.0020.0017.FC9E][.1365.0020.0017.FC9E] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM; QQKN
+FC07 ; [.1352.0020.001A.FC07][.1365.0020.001A.FC07] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM; QQKN
+FD9E ; [.1352.0020.0019.FD9E][.1365.0020.0019.FD9E][.13C8.0020.001F.FD9E] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM; QQKN
+FC6A ; [.1352.0020.0019.FC6A][.1375.0020.0019.FC6A] # ARABIC LIGATURE BEH WITH REH FINAL FORM; QQKN
+FC6B ; [.1352.0020.0019.FC6B][.1376.0020.0019.FC6B] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM; QQKN
+FC9F ; [.1352.0020.0017.FC9F][.13B0.0020.0017.FC9F] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM; QQKN
+FCE1 ; [.1352.0020.0018.FCE1][.13B0.0020.0018.FCE1] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM; QQKN
+FC6C ; [.1352.0020.0019.FC6C][.13B0.0020.0019.FC6C] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM; QQKN
+FC08 ; [.1352.0020.001A.FC08][.13B0.0020.001A.FC08] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM; QQKN
+FC6D ; [.1352.0020.0019.FC6D][.13B1.0020.0019.FC6D] # ARABIC LIGATURE BEH WITH NOON FINAL FORM; QQKN
+FCA0 ; [.1352.0020.0017.FCA0][.13B7.0020.0017.FCA0] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM; QQKN
+FCE2 ; [.1352.0020.0018.FCE2][.13B7.0020.0018.FCE2] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM; QQKN
+FC6E ; [.1352.0020.0019.FC6E][.13C7.0020.0019.FC6E] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC09 ; [.1352.0020.001A.FC09][.13C7.0020.001A.FC09] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC6F ; [.1352.0020.0019.FC6F][.13C8.0020.0019.FC6F] # ARABIC LIGATURE BEH WITH YEH FINAL FORM; QQKN
+FC0A ; [.1352.0020.001A.FC0A][.13C8.0020.001A.FC0A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM; QQKN
+067B ; [.1353.0020.0002.067B] # ARABIC LETTER BEEH
+FB54 ; [.1353.0020.0017.FB54] # ARABIC LETTER BEEH INITIAL FORM; QQK
+FB55 ; [.1353.0020.0018.FB55] # ARABIC LETTER BEEH MEDIAL FORM; QQK
+FB53 ; [.1353.0020.0019.FB53] # ARABIC LETTER BEEH FINAL FORM; QQK
+FB52 ; [.1353.0020.001A.FB52] # ARABIC LETTER BEEH ISOLATED FORM; QQK
+067E ; [.1354.0020.0002.067E] # ARABIC LETTER PEH
+FB58 ; [.1354.0020.0017.FB58] # ARABIC LETTER PEH INITIAL FORM; QQK
+FB59 ; [.1354.0020.0018.FB59] # ARABIC LETTER PEH MEDIAL FORM; QQK
+FB57 ; [.1354.0020.0019.FB57] # ARABIC LETTER PEH FINAL FORM; QQK
+FB56 ; [.1354.0020.001A.FB56] # ARABIC LETTER PEH ISOLATED FORM; QQK
+0680 ; [.1355.0020.0002.0680] # ARABIC LETTER BEHEH
+FB5C ; [.1355.0020.0017.FB5C] # ARABIC LETTER BEHEH INITIAL FORM; QQK
+FB5D ; [.1355.0020.0018.FB5D] # ARABIC LETTER BEHEH MEDIAL FORM; QQK
+FB5B ; [.1355.0020.0019.FB5B] # ARABIC LETTER BEHEH FINAL FORM; QQK
+FB5A ; [.1355.0020.001A.FB5A] # ARABIC LETTER BEHEH ISOLATED FORM; QQK
+0629 ; [.1356.0020.0002.0629] # ARABIC LETTER TEH MARBUTA
+FE94 ; [.1356.0020.0019.FE94] # ARABIC LETTER TEH MARBUTA FINAL FORM; QQK
+FE93 ; [.1356.0020.001A.FE93] # ARABIC LETTER TEH MARBUTA ISOLATED FORM; QQK
+062A ; [.1357.0020.0002.062A] # ARABIC LETTER TEH
+FE97 ; [.1357.0020.0017.FE97] # ARABIC LETTER TEH INITIAL FORM; QQK
+FE98 ; [.1357.0020.0018.FE98] # ARABIC LETTER TEH MEDIAL FORM; QQK
+FE96 ; [.1357.0020.0019.FE96] # ARABIC LETTER TEH FINAL FORM; QQK
+FE95 ; [.1357.0020.001A.FE95] # ARABIC LETTER TEH ISOLATED FORM; QQK
+FCA1 ; [.1357.0020.0017.FCA1][.135E.0020.0017.FCA1] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM; QQKN
+FC0B ; [.1357.0020.001A.FC0B][.135E.0020.001A.FC0B] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM; QQKN
+FD50 ; [.1357.0020.0017.FD50][.135E.0020.0017.FD50][.13B0.0020.001F.FD50] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDA0 ; [.1357.0020.0019.FDA0][.135E.0020.0019.FDA0][.13C7.0020.001F.FDA0] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD9F ; [.1357.0020.0019.FD9F][.135E.0020.0019.FD9F][.13C8.0020.001F.FD9F] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCA2 ; [.1357.0020.0017.FCA2][.1364.0020.0017.FCA2] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM; QQKN
+FC0C ; [.1357.0020.001A.FC0C][.1364.0020.001A.FC0C] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM; QQKN
+FD52 ; [.1357.0020.0017.FD52][.1364.0020.0017.FD52][.135E.0020.001F.FD52] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM; QQKN
+FD51 ; [.1357.0020.0019.FD51][.1364.0020.0019.FD51][.135E.0020.001F.FD51] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM; QQKN
+FD53 ; [.1357.0020.0017.FD53][.1364.0020.0017.FD53][.13B0.0020.001F.FD53] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM; QQKN
+FCA3 ; [.1357.0020.0017.FCA3][.1365.0020.0017.FCA3] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM; QQKN
+FC0D ; [.1357.0020.001A.FC0D][.1365.0020.001A.FC0D] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM; QQKN
+FD54 ; [.1357.0020.0017.FD54][.1365.0020.0017.FD54][.13B0.0020.001F.FD54] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FDA2 ; [.1357.0020.0019.FDA2][.1365.0020.0019.FDA2][.13C7.0020.001F.FDA2] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA1 ; [.1357.0020.0019.FDA1][.1365.0020.0019.FDA1][.13C8.0020.001F.FDA1] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM; QQKN
+FC70 ; [.1357.0020.0019.FC70][.1375.0020.0019.FC70] # ARABIC LIGATURE TEH WITH REH FINAL FORM; QQKN
+FC71 ; [.1357.0020.0019.FC71][.1376.0020.0019.FC71] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM; QQKN
+FCA4 ; [.1357.0020.0017.FCA4][.13B0.0020.0017.FCA4] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM; QQKN
+FCE3 ; [.1357.0020.0018.FCE3][.13B0.0020.0018.FCE3] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM; QQKN
+FC72 ; [.1357.0020.0019.FC72][.13B0.0020.0019.FC72] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM; QQKN
+FC0E ; [.1357.0020.001A.FC0E][.13B0.0020.001A.FC0E] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM; QQKN
+FD55 ; [.1357.0020.0017.FD55][.13B0.0020.0017.FD55][.135E.0020.001F.FD55] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD56 ; [.1357.0020.0017.FD56][.13B0.0020.0017.FD56][.1364.0020.001F.FD56] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD57 ; [.1357.0020.0017.FD57][.13B0.0020.0017.FD57][.1365.0020.001F.FD57] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM; QQKN
+FDA4 ; [.1357.0020.0019.FDA4][.13B0.0020.0019.FDA4][.13C7.0020.001F.FDA4] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA3 ; [.1357.0020.0019.FDA3][.13B0.0020.0019.FDA3][.13C8.0020.001F.FDA3] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC73 ; [.1357.0020.0019.FC73][.13B1.0020.0019.FC73] # ARABIC LIGATURE TEH WITH NOON FINAL FORM; QQKN
+FCA5 ; [.1357.0020.0017.FCA5][.13B7.0020.0017.FCA5] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM; QQKN
+FCE4 ; [.1357.0020.0018.FCE4][.13B7.0020.0018.FCE4] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM; QQKN
+FC74 ; [.1357.0020.0019.FC74][.13C7.0020.0019.FC74] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC0F ; [.1357.0020.001A.FC0F][.13C7.0020.001A.FC0F] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC75 ; [.1357.0020.0019.FC75][.13C8.0020.0019.FC75] # ARABIC LIGATURE TEH WITH YEH FINAL FORM; QQKN
+FC10 ; [.1357.0020.001A.FC10][.13C8.0020.001A.FC10] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM; QQKN
+062B ; [.1358.0020.0002.062B] # ARABIC LETTER THEH
+FE9B ; [.1358.0020.0017.FE9B] # ARABIC LETTER THEH INITIAL FORM; QQK
+FE9C ; [.1358.0020.0018.FE9C] # ARABIC LETTER THEH MEDIAL FORM; QQK
+FE9A ; [.1358.0020.0019.FE9A] # ARABIC LETTER THEH FINAL FORM; QQK
+FE99 ; [.1358.0020.001A.FE99] # ARABIC LETTER THEH ISOLATED FORM; QQK
+FC11 ; [.1358.0020.001A.FC11][.135E.0020.001A.FC11] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM; QQKN
+FC76 ; [.1358.0020.0019.FC76][.1375.0020.0019.FC76] # ARABIC LIGATURE THEH WITH REH FINAL FORM; QQKN
+FC77 ; [.1358.0020.0019.FC77][.1376.0020.0019.FC77] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM; QQKN
+FCA6 ; [.1358.0020.0017.FCA6][.13B0.0020.0017.FCA6] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM; QQKN
+FCE5 ; [.1358.0020.0018.FCE5][.13B0.0020.0018.FCE5] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM; QQKN
+FC78 ; [.1358.0020.0019.FC78][.13B0.0020.0019.FC78] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM; QQKN
+FC12 ; [.1358.0020.001A.FC12][.13B0.0020.001A.FC12] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM; QQKN
+FC79 ; [.1358.0020.0019.FC79][.13B1.0020.0019.FC79] # ARABIC LIGATURE THEH WITH NOON FINAL FORM; QQKN
+FCE6 ; [.1358.0020.0018.FCE6][.13B7.0020.0018.FCE6] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM; QQKN
+FC7A ; [.1358.0020.0019.FC7A][.13C7.0020.0019.FC7A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC13 ; [.1358.0020.001A.FC13][.13C7.0020.001A.FC13] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7B ; [.1358.0020.0019.FC7B][.13C8.0020.0019.FC7B] # ARABIC LIGATURE THEH WITH YEH FINAL FORM; QQKN
+FC14 ; [.1358.0020.001A.FC14][.13C8.0020.001A.FC14] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM; QQKN
+0679 ; [.1359.0020.0002.0679] # ARABIC LETTER TTEH
+FB68 ; [.1359.0020.0017.FB68] # ARABIC LETTER TTEH INITIAL FORM; QQK
+FB69 ; [.1359.0020.0018.FB69] # ARABIC LETTER TTEH MEDIAL FORM; QQK
+FB67 ; [.1359.0020.0019.FB67] # ARABIC LETTER TTEH FINAL FORM; QQK
+FB66 ; [.1359.0020.001A.FB66] # ARABIC LETTER TTEH ISOLATED FORM; QQK
+067A ; [.135A.0020.0002.067A] # ARABIC LETTER TTEHEH
+FB60 ; [.135A.0020.0017.FB60] # ARABIC LETTER TTEHEH INITIAL FORM; QQK
+FB61 ; [.135A.0020.0018.FB61] # ARABIC LETTER TTEHEH MEDIAL FORM; QQK
+FB5F ; [.135A.0020.0019.FB5F] # ARABIC LETTER TTEHEH FINAL FORM; QQK
+FB5E ; [.135A.0020.001A.FB5E] # ARABIC LETTER TTEHEH ISOLATED FORM; QQK
+067C ; [.135B.0020.0002.067C] # ARABIC LETTER TEH WITH RING
+067D ; [.135C.0020.0002.067D] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067F ; [.135D.0020.0002.067F] # ARABIC LETTER TEHEH
+FB64 ; [.135D.0020.0017.FB64] # ARABIC LETTER TEHEH INITIAL FORM; QQK
+FB65 ; [.135D.0020.0018.FB65] # ARABIC LETTER TEHEH MEDIAL FORM; QQK
+FB63 ; [.135D.0020.0019.FB63] # ARABIC LETTER TEHEH FINAL FORM; QQK
+FB62 ; [.135D.0020.001A.FB62] # ARABIC LETTER TEHEH ISOLATED FORM; QQK
+062C ; [.135E.0020.0002.062C] # ARABIC LETTER JEEM
+FE9F ; [.135E.0020.0017.FE9F] # ARABIC LETTER JEEM INITIAL FORM; QQK
+FEA0 ; [.135E.0020.0018.FEA0] # ARABIC LETTER JEEM MEDIAL FORM; QQK
+FE9E ; [.135E.0020.0019.FE9E] # ARABIC LETTER JEEM FINAL FORM; QQK
+FE9D ; [.135E.0020.001A.FE9D] # ARABIC LETTER JEEM ISOLATED FORM; QQK
+FCA7 ; [.135E.0020.0017.FCA7][.1364.0020.0017.FCA7] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM; QQKN
+FC15 ; [.135E.0020.001A.FC15][.1364.0020.001A.FC15] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM; QQKN
+FDA6 ; [.135E.0020.0019.FDA6][.1364.0020.0019.FDA6][.13C7.0020.001F.FDA6] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDBE ; [.135E.0020.0019.FDBE][.1364.0020.0019.FDBE][.13C8.0020.001F.FDBE] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM; QQKN
+FDFB ; [.135E.0020.001A.FDFB][.13AB.0020.001A.FDFB][*0209.0020.001F.FDFB][.135E.0020.001F.FDFB][.13AB.0020.001F.FDFB][.1350.0020.001F.FDFB][.13AB.0020.001F.FDFB][.13B7.0020.001F.FDFB] # ARABIC LIGATURE JALLAJALALOUHOU; QQKN
+FCA8 ; [.135E.0020.0017.FCA8][.13B0.0020.0017.FCA8] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM; QQKN
+FC16 ; [.135E.0020.001A.FC16][.13B0.0020.001A.FC16] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM; QQKN
+FD59 ; [.135E.0020.0017.FD59][.13B0.0020.0017.FD59][.1364.0020.001F.FD59] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD58 ; [.135E.0020.0019.FD58][.13B0.0020.0019.FD58][.1364.0020.001F.FD58] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM; QQKN
+FDA7 ; [.135E.0020.0019.FDA7][.13B0.0020.0019.FDA7][.13C7.0020.001F.FDA7] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA5 ; [.135E.0020.0019.FDA5][.13B0.0020.0019.FDA5][.13C8.0020.001F.FDA5] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM; QQKN
+FD1D ; [.135E.0020.0019.FD1D][.13C7.0020.0019.FD1D] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD01 ; [.135E.0020.001A.FD01][.13C7.0020.001A.FD01] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1E ; [.135E.0020.0019.FD1E][.13C8.0020.0019.FD1E] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM; QQKN
+FD02 ; [.135E.0020.001A.FD02][.13C8.0020.001A.FD02] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM; QQKN
+0683 ; [.135F.0020.0002.0683] # ARABIC LETTER NYEH
+FB78 ; [.135F.0020.0017.FB78] # ARABIC LETTER NYEH INITIAL FORM; QQK
+FB79 ; [.135F.0020.0018.FB79] # ARABIC LETTER NYEH MEDIAL FORM; QQK
+FB77 ; [.135F.0020.0019.FB77] # ARABIC LETTER NYEH FINAL FORM; QQK
+FB76 ; [.135F.0020.001A.FB76] # ARABIC LETTER NYEH ISOLATED FORM; QQK
+0684 ; [.1360.0020.0002.0684] # ARABIC LETTER DYEH
+FB74 ; [.1360.0020.0017.FB74] # ARABIC LETTER DYEH INITIAL FORM; QQK
+FB75 ; [.1360.0020.0018.FB75] # ARABIC LETTER DYEH MEDIAL FORM; QQK
+FB73 ; [.1360.0020.0019.FB73] # ARABIC LETTER DYEH FINAL FORM; QQK
+FB72 ; [.1360.0020.001A.FB72] # ARABIC LETTER DYEH ISOLATED FORM; QQK
+0686 ; [.1361.0020.0002.0686] # ARABIC LETTER TCHEH
+FB7C ; [.1361.0020.0017.FB7C] # ARABIC LETTER TCHEH INITIAL FORM; QQK
+FB7D ; [.1361.0020.0018.FB7D] # ARABIC LETTER TCHEH MEDIAL FORM; QQK
+FB7B ; [.1361.0020.0019.FB7B] # ARABIC LETTER TCHEH FINAL FORM; QQK
+FB7A ; [.1361.0020.001A.FB7A] # ARABIC LETTER TCHEH ISOLATED FORM; QQK
+06BF ; [.1362.0020.0002.06BF] # ARABIC LETTER TCHEH WITH DOT ABOVE
+0687 ; [.1363.0020.0002.0687] # ARABIC LETTER TCHEHEH
+FB80 ; [.1363.0020.0017.FB80] # ARABIC LETTER TCHEHEH INITIAL FORM; QQK
+FB81 ; [.1363.0020.0018.FB81] # ARABIC LETTER TCHEHEH MEDIAL FORM; QQK
+FB7F ; [.1363.0020.0019.FB7F] # ARABIC LETTER TCHEHEH FINAL FORM; QQK
+FB7E ; [.1363.0020.001A.FB7E] # ARABIC LETTER TCHEHEH ISOLATED FORM; QQK
+062D ; [.1364.0020.0002.062D] # ARABIC LETTER HAH
+FEA3 ; [.1364.0020.0017.FEA3] # ARABIC LETTER HAH INITIAL FORM; QQK
+FEA4 ; [.1364.0020.0018.FEA4] # ARABIC LETTER HAH MEDIAL FORM; QQK
+FEA2 ; [.1364.0020.0019.FEA2] # ARABIC LETTER HAH FINAL FORM; QQK
+FEA1 ; [.1364.0020.001A.FEA1] # ARABIC LETTER HAH ISOLATED FORM; QQK
+FCA9 ; [.1364.0020.0017.FCA9][.135E.0020.0017.FCA9] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM; QQKN
+FC17 ; [.1364.0020.001A.FC17][.135E.0020.001A.FC17] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM; QQKN
+FDBF ; [.1364.0020.0019.FDBF][.135E.0020.0019.FDBF][.13C8.0020.001F.FDBF] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCAA ; [.1364.0020.0017.FCAA][.13B0.0020.0017.FCAA] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM; QQKN
+FC18 ; [.1364.0020.001A.FC18][.13B0.0020.001A.FC18] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM; QQKN
+FD5B ; [.1364.0020.0019.FD5B][.13B0.0020.0019.FD5B][.13C7.0020.001F.FD5B] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD5A ; [.1364.0020.0019.FD5A][.13B0.0020.0019.FD5A][.13C8.0020.001F.FD5A] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM; QQKN
+FD1B ; [.1364.0020.0019.FD1B][.13C7.0020.0019.FD1B] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFF ; [.1364.0020.001A.FCFF][.13C7.0020.001A.FCFF] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1C ; [.1364.0020.0019.FD1C][.13C8.0020.0019.FD1C] # ARABIC LIGATURE HAH WITH YEH FINAL FORM; QQKN
+FD00 ; [.1364.0020.001A.FD00][.13C8.0020.001A.FD00] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM; QQKN
+062E ; [.1365.0020.0002.062E] # ARABIC LETTER KHAH
+FEA7 ; [.1365.0020.0017.FEA7] # ARABIC LETTER KHAH INITIAL FORM; QQK
+FEA8 ; [.1365.0020.0018.FEA8] # ARABIC LETTER KHAH MEDIAL FORM; QQK
+FEA6 ; [.1365.0020.0019.FEA6] # ARABIC LETTER KHAH FINAL FORM; QQK
+FEA5 ; [.1365.0020.001A.FEA5] # ARABIC LETTER KHAH ISOLATED FORM; QQK
+FCAB ; [.1365.0020.0017.FCAB][.135E.0020.0017.FCAB] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM; QQKN
+FC19 ; [.1365.0020.001A.FC19][.135E.0020.001A.FC19] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM; QQKN
+FC1A ; [.1365.0020.001A.FC1A][.1364.0020.001A.FC1A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM; QQKN
+FCAC ; [.1365.0020.0017.FCAC][.13B0.0020.0017.FCAC] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM; QQKN
+FC1B ; [.1365.0020.001A.FC1B][.13B0.0020.001A.FC1B] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM; QQKN
+FD1F ; [.1365.0020.0019.FD1F][.13C7.0020.0019.FD1F] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FD03 ; [.1365.0020.001A.FD03][.13C7.0020.001A.FD03] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD20 ; [.1365.0020.0019.FD20][.13C8.0020.0019.FD20] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM; QQKN
+FD04 ; [.1365.0020.001A.FD04][.13C8.0020.001A.FD04] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM; QQKN
+0681 ; [.1366.0020.0002.0681] # ARABIC LETTER HAH WITH HAMZA ABOVE
+0682 ; [.1367.0020.0002.0682] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0685 ; [.1368.0020.0002.0685] # ARABIC LETTER HAH WITH THREE DOTS ABOVE
+062F ; [.1369.0020.0002.062F] # ARABIC LETTER DAL
+FEAA ; [.1369.0020.0019.FEAA] # ARABIC LETTER DAL FINAL FORM; QQK
+FEA9 ; [.1369.0020.001A.FEA9] # ARABIC LETTER DAL ISOLATED FORM; QQK
+0630 ; [.136A.0020.0002.0630] # ARABIC LETTER THAL
+FEAC ; [.136A.0020.0019.FEAC] # ARABIC LETTER THAL FINAL FORM; QQK
+FEAB ; [.136A.0020.001A.FEAB] # ARABIC LETTER THAL ISOLATED FORM; QQK
+FC5B ; [.136A.0020.001A.FC5B][.0000.00D8.001A.FC5B] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+0688 ; [.136B.0020.0002.0688] # ARABIC LETTER DDAL
+FB89 ; [.136B.0020.0019.FB89] # ARABIC LETTER DDAL FINAL FORM; QQK
+FB88 ; [.136B.0020.001A.FB88] # ARABIC LETTER DDAL ISOLATED FORM; QQK
+0689 ; [.136C.0020.0002.0689] # ARABIC LETTER DAL WITH RING
+068A ; [.136D.0020.0002.068A] # ARABIC LETTER DAL WITH DOT BELOW
+068B ; [.136E.0020.0002.068B] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C ; [.136F.0020.0002.068C] # ARABIC LETTER DAHAL
+FB85 ; [.136F.0020.0019.FB85] # ARABIC LETTER DAHAL FINAL FORM; QQK
+FB84 ; [.136F.0020.001A.FB84] # ARABIC LETTER DAHAL ISOLATED FORM; QQK
+068D ; [.1370.0020.0002.068D] # ARABIC LETTER DDAHAL
+FB83 ; [.1370.0020.0019.FB83] # ARABIC LETTER DDAHAL FINAL FORM; QQK
+FB82 ; [.1370.0020.001A.FB82] # ARABIC LETTER DDAHAL ISOLATED FORM; QQK
+068E ; [.1371.0020.0002.068E] # ARABIC LETTER DUL
+FB87 ; [.1371.0020.0019.FB87] # ARABIC LETTER DUL FINAL FORM; QQK
+FB86 ; [.1371.0020.001A.FB86] # ARABIC LETTER DUL ISOLATED FORM; QQK
+068F ; [.1372.0020.0002.068F] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690 ; [.1373.0020.0002.0690] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+06EE ; [.1374.0020.0002.06EE] # ARABIC LETTER DAL WITH INVERTED V
+0631 ; [.1375.0020.0002.0631] # ARABIC LETTER REH
+FEAE ; [.1375.0020.0019.FEAE] # ARABIC LETTER REH FINAL FORM; QQK
+FEAD ; [.1375.0020.001A.FEAD] # ARABIC LETTER REH ISOLATED FORM; QQK
+FC5C ; [.1375.0020.001A.FC5C][.0000.00D8.001A.FC5C] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+FDF6 ; [.1375.0020.001A.FDF6][.1381.0020.001A.FDF6][.13BD.0020.001F.FDF6][.13AB.0020.001F.FDF6] # ARABIC LIGATURE RASOUL ISOLATED FORM; QQKN
+FDFC ; [.1375.0020.001A.FDFC][.13C9.0020.001A.FDFC][.1350.0020.001F.FDFC][.13AB.0020.001F.FDFC] # RIAL SIGN; QQKN
+0632 ; [.1376.0020.0002.0632] # ARABIC LETTER ZAIN
+FEB0 ; [.1376.0020.0019.FEB0] # ARABIC LETTER ZAIN FINAL FORM; QQK
+FEAF ; [.1376.0020.001A.FEAF] # ARABIC LETTER ZAIN ISOLATED FORM; QQK
+0691 ; [.1377.0020.0002.0691] # ARABIC LETTER RREH
+FB8D ; [.1377.0020.0019.FB8D] # ARABIC LETTER RREH FINAL FORM; QQK
+FB8C ; [.1377.0020.001A.FB8C] # ARABIC LETTER RREH ISOLATED FORM; QQK
+0692 ; [.1378.0020.0002.0692] # ARABIC LETTER REH WITH SMALL V
+0693 ; [.1379.0020.0002.0693] # ARABIC LETTER REH WITH RING
+0694 ; [.137A.0020.0002.0694] # ARABIC LETTER REH WITH DOT BELOW
+0695 ; [.137B.0020.0002.0695] # ARABIC LETTER REH WITH SMALL V BELOW
+0696 ; [.137C.0020.0002.0696] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697 ; [.137D.0020.0002.0697] # ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698 ; [.137E.0020.0002.0698] # ARABIC LETTER JEH
+FB8B ; [.137E.0020.0019.FB8B] # ARABIC LETTER JEH FINAL FORM; QQK
+FB8A ; [.137E.0020.001A.FB8A] # ARABIC LETTER JEH ISOLATED FORM; QQK
+0699 ; [.137F.0020.0002.0699] # ARABIC LETTER REH WITH FOUR DOTS ABOVE
+06EF ; [.1380.0020.0002.06EF] # ARABIC LETTER REH WITH INVERTED V
+0633 ; [.1381.0020.0002.0633] # ARABIC LETTER SEEN
+FEB3 ; [.1381.0020.0017.FEB3] # ARABIC LETTER SEEN INITIAL FORM; QQK
+FEB4 ; [.1381.0020.0018.FEB4] # ARABIC LETTER SEEN MEDIAL FORM; QQK
+FEB2 ; [.1381.0020.0019.FEB2] # ARABIC LETTER SEEN FINAL FORM; QQK
+FEB1 ; [.1381.0020.001A.FEB1] # ARABIC LETTER SEEN ISOLATED FORM; QQK
+FCAD ; [.1381.0020.0017.FCAD][.135E.0020.0017.FCAD] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM; QQKN
+FD34 ; [.1381.0020.0018.FD34][.135E.0020.0018.FD34] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM; QQKN
+FC1C ; [.1381.0020.001A.FC1C][.135E.0020.001A.FC1C] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM; QQKN
+FD5D ; [.1381.0020.0017.FD5D][.135E.0020.0017.FD5D][.1364.0020.001F.FD5D] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM; QQKN
+FD5E ; [.1381.0020.0019.FD5E][.135E.0020.0019.FD5E][.13C7.0020.001F.FD5E] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FCAE ; [.1381.0020.0017.FCAE][.1364.0020.0017.FCAE] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM; QQKN
+FD35 ; [.1381.0020.0018.FD35][.1364.0020.0018.FD35] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM; QQKN
+FC1D ; [.1381.0020.001A.FC1D][.1364.0020.001A.FC1D] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM; QQKN
+FD5C ; [.1381.0020.0017.FD5C][.1364.0020.0017.FD5C][.135E.0020.001F.FD5C] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM; QQKN
+FCAF ; [.1381.0020.0017.FCAF][.1365.0020.0017.FCAF] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM; QQKN
+FD36 ; [.1381.0020.0018.FD36][.1365.0020.0018.FD36] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM; QQKN
+FC1E ; [.1381.0020.001A.FC1E][.1365.0020.001A.FC1E] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM; QQKN
+FDA8 ; [.1381.0020.0019.FDA8][.1365.0020.0019.FDA8][.13C7.0020.001F.FDA8] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDC6 ; [.1381.0020.0019.FDC6][.1365.0020.0019.FDC6][.13C8.0020.001F.FDC6] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM; QQKN
+FD2A ; [.1381.0020.0019.FD2A][.1375.0020.0019.FD2A] # ARABIC LIGATURE SEEN WITH REH FINAL FORM; QQKN
+FD0E ; [.1381.0020.001A.FD0E][.1375.0020.001A.FD0E] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM; QQKN
+FCB0 ; [.1381.0020.0017.FCB0][.13B0.0020.0017.FCB0] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM; QQKN
+FCE7 ; [.1381.0020.0018.FCE7][.13B0.0020.0018.FCE7] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM; QQKN
+FC1F ; [.1381.0020.001A.FC1F][.13B0.0020.001A.FC1F] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM; QQKN
+FD61 ; [.1381.0020.0017.FD61][.13B0.0020.0017.FD61][.135E.0020.001F.FD61] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD60 ; [.1381.0020.0017.FD60][.13B0.0020.0017.FD60][.1364.0020.001F.FD60] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD5F ; [.1381.0020.0019.FD5F][.13B0.0020.0019.FD5F][.1364.0020.001F.FD5F] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM; QQKN
+FD63 ; [.1381.0020.0017.FD63][.13B0.0020.0017.FD63][.13B0.0020.001F.FD63] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD62 ; [.1381.0020.0019.FD62][.13B0.0020.0019.FD62][.13B0.0020.001F.FD62] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD31 ; [.1381.0020.0017.FD31][.13B7.0020.0017.FD31] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM; QQKN
+FCE8 ; [.1381.0020.0018.FCE8][.13B7.0020.0018.FCE8] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM; QQKN
+FD17 ; [.1381.0020.0019.FD17][.13C7.0020.0019.FD17] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFB ; [.1381.0020.001A.FCFB][.13C7.0020.001A.FCFB] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD18 ; [.1381.0020.0019.FD18][.13C8.0020.0019.FD18] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM; QQKN
+FCFC ; [.1381.0020.001A.FCFC][.13C8.0020.001A.FCFC] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM; QQKN
+0634 ; [.1382.0020.0002.0634] # ARABIC LETTER SHEEN
+FEB7 ; [.1382.0020.0017.FEB7] # ARABIC LETTER SHEEN INITIAL FORM; QQK
+FEB8 ; [.1382.0020.0018.FEB8] # ARABIC LETTER SHEEN MEDIAL FORM; QQK
+FEB6 ; [.1382.0020.0019.FEB6] # ARABIC LETTER SHEEN FINAL FORM; QQK
+FEB5 ; [.1382.0020.001A.FEB5] # ARABIC LETTER SHEEN ISOLATED FORM; QQK
+FD2D ; [.1382.0020.0017.FD2D][.135E.0020.0017.FD2D] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM; QQKN
+FD37 ; [.1382.0020.0018.FD37][.135E.0020.0018.FD37] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM; QQKN
+FD25 ; [.1382.0020.0019.FD25][.135E.0020.0019.FD25] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM; QQKN
+FD09 ; [.1382.0020.001A.FD09][.135E.0020.001A.FD09] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM; QQKN
+FD69 ; [.1382.0020.0019.FD69][.135E.0020.0019.FD69][.13C8.0020.001F.FD69] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM; QQKN
+FD2E ; [.1382.0020.0017.FD2E][.1364.0020.0017.FD2E] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM; QQKN
+FD38 ; [.1382.0020.0018.FD38][.1364.0020.0018.FD38] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM; QQKN
+FD26 ; [.1382.0020.0019.FD26][.1364.0020.0019.FD26] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM; QQKN
+FD0A ; [.1382.0020.001A.FD0A][.1364.0020.001A.FD0A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM; QQKN
+FD68 ; [.1382.0020.0017.FD68][.1364.0020.0017.FD68][.13B0.0020.001F.FD68] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD67 ; [.1382.0020.0019.FD67][.1364.0020.0019.FD67][.13B0.0020.001F.FD67] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM; QQKN
+FDAA ; [.1382.0020.0019.FDAA][.1364.0020.0019.FDAA][.13C8.0020.001F.FDAA] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM; QQKN
+FD2F ; [.1382.0020.0017.FD2F][.1365.0020.0017.FD2F] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM; QQKN
+FD39 ; [.1382.0020.0018.FD39][.1365.0020.0018.FD39] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM; QQKN
+FD27 ; [.1382.0020.0019.FD27][.1365.0020.0019.FD27] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM; QQKN
+FD0B ; [.1382.0020.001A.FD0B][.1365.0020.001A.FD0B] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM; QQKN
+FD29 ; [.1382.0020.0019.FD29][.1375.0020.0019.FD29] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM; QQKN
+FD0D ; [.1382.0020.001A.FD0D][.1375.0020.001A.FD0D] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM; QQKN
+FD30 ; [.1382.0020.0017.FD30][.13B0.0020.0017.FD30] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM; QQKN
+FCE9 ; [.1382.0020.0018.FCE9][.13B0.0020.0018.FCE9] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM; QQKN
+FD28 ; [.1382.0020.0019.FD28][.13B0.0020.0019.FD28] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM; QQKN
+FD0C ; [.1382.0020.001A.FD0C][.13B0.0020.001A.FD0C] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM; QQKN
+FD6B ; [.1382.0020.0017.FD6B][.13B0.0020.0017.FD6B][.1365.0020.001F.FD6B] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM; QQKN
+FD6A ; [.1382.0020.0019.FD6A][.13B0.0020.0019.FD6A][.1365.0020.001F.FD6A] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM; QQKN
+FD6D ; [.1382.0020.0017.FD6D][.13B0.0020.0017.FD6D][.13B0.0020.001F.FD6D] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD6C ; [.1382.0020.0019.FD6C][.13B0.0020.0019.FD6C][.13B0.0020.001F.FD6C] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD32 ; [.1382.0020.0017.FD32][.13B7.0020.0017.FD32] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM; QQKN
+FCEA ; [.1382.0020.0018.FCEA][.13B7.0020.0018.FCEA] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM; QQKN
+FD19 ; [.1382.0020.0019.FD19][.13C7.0020.0019.FD19] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFD ; [.1382.0020.001A.FCFD][.13C7.0020.001A.FCFD] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1A ; [.1382.0020.0019.FD1A][.13C8.0020.0019.FD1A] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM; QQKN
+FCFE ; [.1382.0020.001A.FCFE][.13C8.0020.001A.FCFE] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM; QQKN
+069A ; [.1383.0020.0002.069A] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B ; [.1384.0020.0002.069B] # ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C ; [.1385.0020.0002.069C] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+06FA ; [.1386.0020.0002.06FA] # ARABIC LETTER SHEEN WITH DOT BELOW
+0635 ; [.1387.0020.0002.0635] # ARABIC LETTER SAD
+FEBB ; [.1387.0020.0017.FEBB] # ARABIC LETTER SAD INITIAL FORM; QQK
+FEBC ; [.1387.0020.0018.FEBC] # ARABIC LETTER SAD MEDIAL FORM; QQK
+FEBA ; [.1387.0020.0019.FEBA] # ARABIC LETTER SAD FINAL FORM; QQK
+FEB9 ; [.1387.0020.001A.FEB9] # ARABIC LETTER SAD ISOLATED FORM; QQK
+FCB1 ; [.1387.0020.0017.FCB1][.1364.0020.0017.FCB1] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM; QQKN
+FC20 ; [.1387.0020.001A.FC20][.1364.0020.001A.FC20] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM; QQKN
+FD65 ; [.1387.0020.0017.FD65][.1364.0020.0017.FD65][.1364.0020.001F.FD65] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM; QQKN
+FD64 ; [.1387.0020.0019.FD64][.1364.0020.0019.FD64][.1364.0020.001F.FD64] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM; QQKN
+FDA9 ; [.1387.0020.0019.FDA9][.1364.0020.0019.FDA9][.13C8.0020.001F.FDA9] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM; QQKN
+FCB2 ; [.1387.0020.0017.FCB2][.1365.0020.0017.FCB2] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM; QQKN
+FD2B ; [.1387.0020.0019.FD2B][.1375.0020.0019.FD2B] # ARABIC LIGATURE SAD WITH REH FINAL FORM; QQKN
+FD0F ; [.1387.0020.001A.FD0F][.1375.0020.001A.FD0F] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM; QQKN
+FDF5 ; [.1387.0020.001A.FDF5][.13AB.0020.001A.FDF5][.138F.0020.001F.FDF5][.13B0.0020.001F.FDF5] # ARABIC LIGATURE SALAM ISOLATED FORM; QQKN
+FDF9 ; [.1387.0020.001A.FDF9][.13AB.0020.001A.FDF9][.13C7.0020.001F.FDF9] # ARABIC LIGATURE SALLA ISOLATED FORM; QQKN
+FDFA ; [.1387.0020.001A.FDFA][.13AB.0020.001A.FDFA][.13C7.0020.001F.FDFA][*0209.0020.001F.FDFA][.1350.0020.001F.FDFA][.13AB.0020.001F.FDFA][.13AB.0020.001F.FDFA][.13B7.0020.001F.FDFA][*0209.0020.001F.FDFA][.138F.0020.001F.FDFA][.13AB.0020.001F.FDFA][.13C8.0020.001F.FDFA][.13B7.0020.001F.FDFA][*0209.0020.001F.FDFA][.13BD.0020.001F.FDFA][.1381.0020.001F.FDFA][.13AB.0020.001F.FDFA][.13B0.0020.001F.FDFA] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM; QQKN
+FDF0 ; [.1387.0020.001A.FDF0][.13AB.0020.001A.FDF0][.13CE.0020.001F.FDF0] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM; QQKN
+FCB3 ; [.1387.0020.0017.FCB3][.13B0.0020.0017.FCB3] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM; QQKN
+FC21 ; [.1387.0020.001A.FC21][.13B0.0020.001A.FC21] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM; QQKN
+FDC5 ; [.1387.0020.0017.FDC5][.13B0.0020.0017.FDC5][.13B0.0020.001F.FDC5] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD66 ; [.1387.0020.0019.FD66][.13B0.0020.0019.FD66][.13B0.0020.001F.FD66] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD21 ; [.1387.0020.0019.FD21][.13C7.0020.0019.FD21] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM; QQKN
+FD05 ; [.1387.0020.001A.FD05][.13C7.0020.001A.FD05] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD22 ; [.1387.0020.0019.FD22][.13C8.0020.0019.FD22] # ARABIC LIGATURE SAD WITH YEH FINAL FORM; QQKN
+FD06 ; [.1387.0020.001A.FD06][.13C8.0020.001A.FD06] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM; QQKN
+0636 ; [.1388.0020.0002.0636] # ARABIC LETTER DAD
+FEBF ; [.1388.0020.0017.FEBF] # ARABIC LETTER DAD INITIAL FORM; QQK
+FEC0 ; [.1388.0020.0018.FEC0] # ARABIC LETTER DAD MEDIAL FORM; QQK
+FEBE ; [.1388.0020.0019.FEBE] # ARABIC LETTER DAD FINAL FORM; QQK
+FEBD ; [.1388.0020.001A.FEBD] # ARABIC LETTER DAD ISOLATED FORM; QQK
+FCB4 ; [.1388.0020.0017.FCB4][.135E.0020.0017.FCB4] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM; QQKN
+FC22 ; [.1388.0020.001A.FC22][.135E.0020.001A.FC22] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM; QQKN
+FCB5 ; [.1388.0020.0017.FCB5][.1364.0020.0017.FCB5] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM; QQKN
+FC23 ; [.1388.0020.001A.FC23][.1364.0020.001A.FC23] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM; QQKN
+FD6E ; [.1388.0020.0019.FD6E][.1364.0020.0019.FD6E][.13C7.0020.001F.FD6E] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDAB ; [.1388.0020.0019.FDAB][.1364.0020.0019.FDAB][.13C8.0020.001F.FDAB] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM; QQKN
+FCB6 ; [.1388.0020.0017.FCB6][.1365.0020.0017.FCB6] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM; QQKN
+FC24 ; [.1388.0020.001A.FC24][.1365.0020.001A.FC24] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM; QQKN
+FD70 ; [.1388.0020.0017.FD70][.1365.0020.0017.FD70][.13B0.0020.001F.FD70] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD6F ; [.1388.0020.0019.FD6F][.1365.0020.0019.FD6F][.13B0.0020.001F.FD6F] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM; QQKN
+FD2C ; [.1388.0020.0019.FD2C][.1375.0020.0019.FD2C] # ARABIC LIGATURE DAD WITH REH FINAL FORM; QQKN
+FD10 ; [.1388.0020.001A.FD10][.1375.0020.001A.FD10] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM; QQKN
+FCB7 ; [.1388.0020.0017.FCB7][.13B0.0020.0017.FCB7] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM; QQKN
+FC25 ; [.1388.0020.001A.FC25][.13B0.0020.001A.FC25] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM; QQKN
+FD23 ; [.1388.0020.0019.FD23][.13C7.0020.0019.FD23] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM; QQKN
+FD07 ; [.1388.0020.001A.FD07][.13C7.0020.001A.FD07] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD24 ; [.1388.0020.0019.FD24][.13C8.0020.0019.FD24] # ARABIC LIGATURE DAD WITH YEH FINAL FORM; QQKN
+FD08 ; [.1388.0020.001A.FD08][.13C8.0020.001A.FD08] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM; QQKN
+069D ; [.1389.0020.0002.069D] # ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E ; [.138A.0020.0002.069E] # ARABIC LETTER SAD WITH THREE DOTS ABOVE
+06FB ; [.138B.0020.0002.06FB] # ARABIC LETTER DAD WITH DOT BELOW
+0637 ; [.138C.0020.0002.0637] # ARABIC LETTER TAH
+FEC3 ; [.138C.0020.0017.FEC3] # ARABIC LETTER TAH INITIAL FORM; QQK
+FEC4 ; [.138C.0020.0018.FEC4] # ARABIC LETTER TAH MEDIAL FORM; QQK
+FEC2 ; [.138C.0020.0019.FEC2] # ARABIC LETTER TAH FINAL FORM; QQK
+FEC1 ; [.138C.0020.001A.FEC1] # ARABIC LETTER TAH ISOLATED FORM; QQK
+FCB8 ; [.138C.0020.0017.FCB8][.1364.0020.0017.FCB8] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM; QQKN
+FC26 ; [.138C.0020.001A.FC26][.1364.0020.001A.FC26] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM; QQKN
+FD33 ; [.138C.0020.0017.FD33][.13B0.0020.0017.FD33] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM; QQKN
+FD3A ; [.138C.0020.0018.FD3A][.13B0.0020.0018.FD3A] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM; QQKN
+FC27 ; [.138C.0020.001A.FC27][.13B0.0020.001A.FC27] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM; QQKN
+FD72 ; [.138C.0020.0017.FD72][.13B0.0020.0017.FD72][.1364.0020.001F.FD72] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD71 ; [.138C.0020.0019.FD71][.13B0.0020.0019.FD71][.1364.0020.001F.FD71] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM; QQKN
+FD73 ; [.138C.0020.0017.FD73][.13B0.0020.0017.FD73][.13B0.0020.001F.FD73] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD74 ; [.138C.0020.0019.FD74][.13B0.0020.0019.FD74][.13C8.0020.001F.FD74] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM; QQKN
+FD11 ; [.138C.0020.0019.FD11][.13C7.0020.0019.FD11] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF5 ; [.138C.0020.001A.FCF5][.13C7.0020.001A.FCF5] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD12 ; [.138C.0020.0019.FD12][.13C8.0020.0019.FD12] # ARABIC LIGATURE TAH WITH YEH FINAL FORM; QQKN
+FCF6 ; [.138C.0020.001A.FCF6][.13C8.0020.001A.FCF6] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM; QQKN
+0638 ; [.138D.0020.0002.0638] # ARABIC LETTER ZAH
+FEC7 ; [.138D.0020.0017.FEC7] # ARABIC LETTER ZAH INITIAL FORM; QQK
+FEC8 ; [.138D.0020.0018.FEC8] # ARABIC LETTER ZAH MEDIAL FORM; QQK
+FEC6 ; [.138D.0020.0019.FEC6] # ARABIC LETTER ZAH FINAL FORM; QQK
+FEC5 ; [.138D.0020.001A.FEC5] # ARABIC LETTER ZAH ISOLATED FORM; QQK
+FCB9 ; [.138D.0020.0017.FCB9][.13B0.0020.0017.FCB9] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM; QQKN
+FD3B ; [.138D.0020.0018.FD3B][.13B0.0020.0018.FD3B] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM; QQKN
+FC28 ; [.138D.0020.001A.FC28][.13B0.0020.001A.FC28] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM; QQKN
+069F ; [.138E.0020.0002.069F] # ARABIC LETTER TAH WITH THREE DOTS ABOVE
+0639 ; [.138F.0020.0002.0639] # ARABIC LETTER AIN
+FECB ; [.138F.0020.0017.FECB] # ARABIC LETTER AIN INITIAL FORM; QQK
+FECC ; [.138F.0020.0018.FECC] # ARABIC LETTER AIN MEDIAL FORM; QQK
+FECA ; [.138F.0020.0019.FECA] # ARABIC LETTER AIN FINAL FORM; QQK
+FEC9 ; [.138F.0020.001A.FEC9] # ARABIC LETTER AIN ISOLATED FORM; QQK
+FCBA ; [.138F.0020.0017.FCBA][.135E.0020.0017.FCBA] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM; QQKN
+FC29 ; [.138F.0020.001A.FC29][.135E.0020.001A.FC29] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM; QQKN
+FDC4 ; [.138F.0020.0017.FDC4][.135E.0020.0017.FDC4][.13B0.0020.001F.FDC4] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FD75 ; [.138F.0020.0019.FD75][.135E.0020.0019.FD75][.13B0.0020.001F.FD75] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM; QQKN
+FDF7 ; [.138F.0020.001A.FDF7][.13AB.0020.001A.FDF7][.13C8.0020.001F.FDF7][.13B7.0020.001F.FDF7] # ARABIC LIGATURE ALAYHE ISOLATED FORM; QQKN
+FCBB ; [.138F.0020.0017.FCBB][.13B0.0020.0017.FCBB] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM; QQKN
+FC2A ; [.138F.0020.001A.FC2A][.13B0.0020.001A.FC2A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM; QQKN
+FD77 ; [.138F.0020.0017.FD77][.13B0.0020.0017.FD77][.13B0.0020.001F.FD77] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD76 ; [.138F.0020.0019.FD76][.13B0.0020.0019.FD76][.13B0.0020.001F.FD76] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD78 ; [.138F.0020.0019.FD78][.13B0.0020.0019.FD78][.13C7.0020.001F.FD78] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDB6 ; [.138F.0020.0019.FDB6][.13B0.0020.0019.FDB6][.13C8.0020.001F.FDB6] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM; QQKN
+FD13 ; [.138F.0020.0019.FD13][.13C7.0020.0019.FD13] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF7 ; [.138F.0020.001A.FCF7][.13C7.0020.001A.FCF7] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD14 ; [.138F.0020.0019.FD14][.13C8.0020.0019.FD14] # ARABIC LIGATURE AIN WITH YEH FINAL FORM; QQKN
+FCF8 ; [.138F.0020.001A.FCF8][.13C8.0020.001A.FCF8] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM; QQKN
+063A ; [.1390.0020.0002.063A] # ARABIC LETTER GHAIN
+FECF ; [.1390.0020.0017.FECF] # ARABIC LETTER GHAIN INITIAL FORM; QQK
+FED0 ; [.1390.0020.0018.FED0] # ARABIC LETTER GHAIN MEDIAL FORM; QQK
+FECE ; [.1390.0020.0019.FECE] # ARABIC LETTER GHAIN FINAL FORM; QQK
+FECD ; [.1390.0020.001A.FECD] # ARABIC LETTER GHAIN ISOLATED FORM; QQK
+FCBC ; [.1390.0020.0017.FCBC][.135E.0020.0017.FCBC] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM; QQKN
+FC2B ; [.1390.0020.001A.FC2B][.135E.0020.001A.FC2B] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM; QQKN
+FCBD ; [.1390.0020.0017.FCBD][.13B0.0020.0017.FCBD] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM; QQKN
+FC2C ; [.1390.0020.001A.FC2C][.13B0.0020.001A.FC2C] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM; QQKN
+FD79 ; [.1390.0020.0019.FD79][.13B0.0020.0019.FD79][.13B0.0020.001F.FD79] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD7B ; [.1390.0020.0019.FD7B][.13B0.0020.0019.FD7B][.13C7.0020.001F.FD7B] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD7A ; [.1390.0020.0019.FD7A][.13B0.0020.0019.FD7A][.13C8.0020.001F.FD7A] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM; QQKN
+FD15 ; [.1390.0020.0019.FD15][.13C7.0020.0019.FD15] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF9 ; [.1390.0020.001A.FCF9][.13C7.0020.001A.FCF9] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD16 ; [.1390.0020.0019.FD16][.13C8.0020.0019.FD16] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM; QQKN
+FCFA ; [.1390.0020.001A.FCFA][.13C8.0020.001A.FCFA] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM; QQKN
+06A0 ; [.1391.0020.0002.06A0] # ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06FC ; [.1392.0020.0002.06FC] # ARABIC LETTER GHAIN WITH DOT BELOW
+0641 ; [.1393.0020.0002.0641] # ARABIC LETTER FEH
+FED3 ; [.1393.0020.0017.FED3] # ARABIC LETTER FEH INITIAL FORM; QQK
+FED4 ; [.1393.0020.0018.FED4] # ARABIC LETTER FEH MEDIAL FORM; QQK
+FED2 ; [.1393.0020.0019.FED2] # ARABIC LETTER FEH FINAL FORM; QQK
+FED1 ; [.1393.0020.001A.FED1] # ARABIC LETTER FEH ISOLATED FORM; QQK
+FCBE ; [.1393.0020.0017.FCBE][.135E.0020.0017.FCBE] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM; QQKN
+FC2D ; [.1393.0020.001A.FC2D][.135E.0020.001A.FC2D] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM; QQKN
+FCBF ; [.1393.0020.0017.FCBF][.1364.0020.0017.FCBF] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM; QQKN
+FC2E ; [.1393.0020.001A.FC2E][.1364.0020.001A.FC2E] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM; QQKN
+FCC0 ; [.1393.0020.0017.FCC0][.1365.0020.0017.FCC0] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM; QQKN
+FC2F ; [.1393.0020.001A.FC2F][.1365.0020.001A.FC2F] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM; QQKN
+FD7D ; [.1393.0020.0017.FD7D][.1365.0020.0017.FD7D][.13B0.0020.001F.FD7D] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD7C ; [.1393.0020.0019.FD7C][.1365.0020.0019.FD7C][.13B0.0020.001F.FD7C] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM; QQKN
+FCC1 ; [.1393.0020.0017.FCC1][.13B0.0020.0017.FCC1] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM; QQKN
+FC30 ; [.1393.0020.001A.FC30][.13B0.0020.001A.FC30] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM; QQKN
+FDC1 ; [.1393.0020.0019.FDC1][.13B0.0020.0019.FDC1][.13C8.0020.001F.FDC1] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC7C ; [.1393.0020.0019.FC7C][.13C7.0020.0019.FC7C] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC31 ; [.1393.0020.001A.FC31][.13C7.0020.001A.FC31] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7D ; [.1393.0020.0019.FC7D][.13C8.0020.0019.FC7D] # ARABIC LIGATURE FEH WITH YEH FINAL FORM; QQKN
+FC32 ; [.1393.0020.001A.FC32][.13C8.0020.001A.FC32] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM; QQKN
+06A1 ; [.1394.0020.0002.06A1] # ARABIC LETTER DOTLESS FEH
+06A2 ; [.1395.0020.0002.06A2] # ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3 ; [.1396.0020.0002.06A3] # ARABIC LETTER FEH WITH DOT BELOW
+06A4 ; [.1397.0020.0002.06A4] # ARABIC LETTER VEH
+FB6C ; [.1397.0020.0017.FB6C] # ARABIC LETTER VEH INITIAL FORM; QQK
+FB6D ; [.1397.0020.0018.FB6D] # ARABIC LETTER VEH MEDIAL FORM; QQK
+FB6B ; [.1397.0020.0019.FB6B] # ARABIC LETTER VEH FINAL FORM; QQK
+FB6A ; [.1397.0020.001A.FB6A] # ARABIC LETTER VEH ISOLATED FORM; QQK
+06A5 ; [.1398.0020.0002.06A5] # ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6 ; [.1399.0020.0002.06A6] # ARABIC LETTER PEHEH
+FB70 ; [.1399.0020.0017.FB70] # ARABIC LETTER PEHEH INITIAL FORM; QQK
+FB71 ; [.1399.0020.0018.FB71] # ARABIC LETTER PEHEH MEDIAL FORM; QQK
+FB6F ; [.1399.0020.0019.FB6F] # ARABIC LETTER PEHEH FINAL FORM; QQK
+FB6E ; [.1399.0020.001A.FB6E] # ARABIC LETTER PEHEH ISOLATED FORM; QQK
+066F ; [.139A.0020.0002.066F] # ARABIC LETTER DOTLESS QAF
+0642 ; [.139B.0020.0002.0642] # ARABIC LETTER QAF
+FED7 ; [.139B.0020.0017.FED7] # ARABIC LETTER QAF INITIAL FORM; QQK
+FED8 ; [.139B.0020.0018.FED8] # ARABIC LETTER QAF MEDIAL FORM; QQK
+FED6 ; [.139B.0020.0019.FED6] # ARABIC LETTER QAF FINAL FORM; QQK
+FED5 ; [.139B.0020.001A.FED5] # ARABIC LETTER QAF ISOLATED FORM; QQK
+FCC2 ; [.139B.0020.0017.FCC2][.1364.0020.0017.FCC2] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM; QQKN
+FC33 ; [.139B.0020.001A.FC33][.1364.0020.001A.FC33] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM; QQKN
+FDF1 ; [.139B.0020.001A.FDF1][.13AB.0020.001A.FDF1][.13CE.0020.001F.FDF1] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM; QQKN
+FCC3 ; [.139B.0020.0017.FCC3][.13B0.0020.0017.FCC3] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM; QQKN
+FC34 ; [.139B.0020.001A.FC34][.13B0.0020.001A.FC34] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM; QQKN
+FDB4 ; [.139B.0020.0017.FDB4][.13B0.0020.0017.FDB4][.1364.0020.001F.FDB4] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD7E ; [.139B.0020.0019.FD7E][.13B0.0020.0019.FD7E][.1364.0020.001F.FD7E] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM; QQKN
+FD7F ; [.139B.0020.0019.FD7F][.13B0.0020.0019.FD7F][.13B0.0020.001F.FD7F] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB2 ; [.139B.0020.0019.FDB2][.13B0.0020.0019.FDB2][.13C8.0020.001F.FDB2] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM; QQKN
+FC7E ; [.139B.0020.0019.FC7E][.13C7.0020.0019.FC7E] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM; QQKN
+FC35 ; [.139B.0020.001A.FC35][.13C7.0020.001A.FC35] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7F ; [.139B.0020.0019.FC7F][.13C8.0020.0019.FC7F] # ARABIC LIGATURE QAF WITH YEH FINAL FORM; QQKN
+FC36 ; [.139B.0020.001A.FC36][.13C8.0020.001A.FC36] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM; QQKN
+06A7 ; [.139C.0020.0002.06A7] # ARABIC LETTER QAF WITH DOT ABOVE
+06A8 ; [.139D.0020.0002.06A8] # ARABIC LETTER QAF WITH THREE DOTS ABOVE
+0643 ; [.139E.0020.0002.0643] # ARABIC LETTER KAF
+FEDB ; [.139E.0020.0017.FEDB] # ARABIC LETTER KAF INITIAL FORM; QQK
+FEDC ; [.139E.0020.0018.FEDC] # ARABIC LETTER KAF MEDIAL FORM; QQK
+FEDA ; [.139E.0020.0019.FEDA] # ARABIC LETTER KAF FINAL FORM; QQK
+FED9 ; [.139E.0020.001A.FED9] # ARABIC LETTER KAF ISOLATED FORM; QQK
+FC80 ; [.139E.0020.0019.FC80][.1350.0020.0019.FC80] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM; QQKN
+FC37 ; [.139E.0020.001A.FC37][.1350.0020.001A.FC37] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM; QQKN
+FCC4 ; [.139E.0020.0017.FCC4][.135E.0020.0017.FCC4] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM; QQKN
+FC38 ; [.139E.0020.001A.FC38][.135E.0020.001A.FC38] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM; QQKN
+FCC5 ; [.139E.0020.0017.FCC5][.1364.0020.0017.FCC5] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM; QQKN
+FC39 ; [.139E.0020.001A.FC39][.1364.0020.001A.FC39] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM; QQKN
+FCC6 ; [.139E.0020.0017.FCC6][.1365.0020.0017.FCC6] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM; QQKN
+FC3A ; [.139E.0020.001A.FC3A][.1365.0020.001A.FC3A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM; QQKN
+FCC7 ; [.139E.0020.0017.FCC7][.13AB.0020.0017.FCC7] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM; QQKN
+FCEB ; [.139E.0020.0018.FCEB][.13AB.0020.0018.FCEB] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM; QQKN
+FC81 ; [.139E.0020.0019.FC81][.13AB.0020.0019.FC81] # ARABIC LIGATURE KAF WITH LAM FINAL FORM; QQKN
+FC3B ; [.139E.0020.001A.FC3B][.13AB.0020.001A.FC3B] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM; QQKN
+FCC8 ; [.139E.0020.0017.FCC8][.13B0.0020.0017.FCC8] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM; QQKN
+FCEC ; [.139E.0020.0018.FCEC][.13B0.0020.0018.FCEC] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM; QQKN
+FC82 ; [.139E.0020.0019.FC82][.13B0.0020.0019.FC82] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM; QQKN
+FC3C ; [.139E.0020.001A.FC3C][.13B0.0020.001A.FC3C] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM; QQKN
+FDC3 ; [.139E.0020.0017.FDC3][.13B0.0020.0017.FDC3][.13B0.0020.001F.FDC3] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FDBB ; [.139E.0020.0019.FDBB][.13B0.0020.0019.FDBB][.13B0.0020.001F.FDBB] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB7 ; [.139E.0020.0019.FDB7][.13B0.0020.0019.FDB7][.13C8.0020.001F.FDB7] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM; QQKN
+FC83 ; [.139E.0020.0019.FC83][.13C7.0020.0019.FC83] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM; QQKN
+FC3D ; [.139E.0020.001A.FC3D][.13C7.0020.001A.FC3D] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC84 ; [.139E.0020.0019.FC84][.13C8.0020.0019.FC84] # ARABIC LIGATURE KAF WITH YEH FINAL FORM; QQKN
+FC3E ; [.139E.0020.001A.FC3E][.13C8.0020.001A.FC3E] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM; QQKN
+06A9 ; [.139F.0020.0002.06A9] # ARABIC LETTER KEHEH
+FB90 ; [.139F.0020.0017.FB90] # ARABIC LETTER KEHEH INITIAL FORM; QQK
+FB91 ; [.139F.0020.0018.FB91] # ARABIC LETTER KEHEH MEDIAL FORM; QQK
+FB8F ; [.139F.0020.0019.FB8F] # ARABIC LETTER KEHEH FINAL FORM; QQK
+FB8E ; [.139F.0020.001A.FB8E] # ARABIC LETTER KEHEH ISOLATED FORM; QQK
+06AA ; [.13A0.0020.0002.06AA] # ARABIC LETTER SWASH KAF
+06AB ; [.13A1.0020.0002.06AB] # ARABIC LETTER KAF WITH RING
+06AC ; [.13A2.0020.0002.06AC] # ARABIC LETTER KAF WITH DOT ABOVE
+06AD ; [.13A3.0020.0002.06AD] # ARABIC LETTER NG
+FBD5 ; [.13A3.0020.0017.FBD5] # ARABIC LETTER NG INITIAL FORM; QQK
+FBD6 ; [.13A3.0020.0018.FBD6] # ARABIC LETTER NG MEDIAL FORM; QQK
+FBD4 ; [.13A3.0020.0019.FBD4] # ARABIC LETTER NG FINAL FORM; QQK
+FBD3 ; [.13A3.0020.001A.FBD3] # ARABIC LETTER NG ISOLATED FORM; QQK
+06AE ; [.13A4.0020.0002.06AE] # ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF ; [.13A5.0020.0002.06AF] # ARABIC LETTER GAF
+FB94 ; [.13A5.0020.0017.FB94] # ARABIC LETTER GAF INITIAL FORM; QQK
+FB95 ; [.13A5.0020.0018.FB95] # ARABIC LETTER GAF MEDIAL FORM; QQK
+FB93 ; [.13A5.0020.0019.FB93] # ARABIC LETTER GAF FINAL FORM; QQK
+FB92 ; [.13A5.0020.001A.FB92] # ARABIC LETTER GAF ISOLATED FORM; QQK
+06B0 ; [.13A6.0020.0002.06B0] # ARABIC LETTER GAF WITH RING
+06B1 ; [.13A7.0020.0002.06B1] # ARABIC LETTER NGOEH
+FB9C ; [.13A7.0020.0017.FB9C] # ARABIC LETTER NGOEH INITIAL FORM; QQK
+FB9D ; [.13A7.0020.0018.FB9D] # ARABIC LETTER NGOEH MEDIAL FORM; QQK
+FB9B ; [.13A7.0020.0019.FB9B] # ARABIC LETTER NGOEH FINAL FORM; QQK
+FB9A ; [.13A7.0020.001A.FB9A] # ARABIC LETTER NGOEH ISOLATED FORM; QQK
+06B2 ; [.13A8.0020.0002.06B2] # ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3 ; [.13A9.0020.0002.06B3] # ARABIC LETTER GUEH
+FB98 ; [.13A9.0020.0017.FB98] # ARABIC LETTER GUEH INITIAL FORM; QQK
+FB99 ; [.13A9.0020.0018.FB99] # ARABIC LETTER GUEH MEDIAL FORM; QQK
+FB97 ; [.13A9.0020.0019.FB97] # ARABIC LETTER GUEH FINAL FORM; QQK
+FB96 ; [.13A9.0020.001A.FB96] # ARABIC LETTER GUEH ISOLATED FORM; QQK
+06B4 ; [.13AA.0020.0002.06B4] # ARABIC LETTER GAF WITH THREE DOTS ABOVE
+0644 ; [.13AB.0020.0002.0644] # ARABIC LETTER LAM
+FEDF ; [.13AB.0020.0017.FEDF] # ARABIC LETTER LAM INITIAL FORM; QQK
+FEE0 ; [.13AB.0020.0018.FEE0] # ARABIC LETTER LAM MEDIAL FORM; QQK
+FEDE ; [.13AB.0020.0019.FEDE] # ARABIC LETTER LAM FINAL FORM; QQK
+FEDD ; [.13AB.0020.001A.FEDD] # ARABIC LETTER LAM ISOLATED FORM; QQK
+FEF6 ; [.13AB.0020.0019.FEF6][.1348.0020.0019.FEF6] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM; QQKN
+FEF5 ; [.13AB.0020.001A.FEF5][.1348.0020.001A.FEF5] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM; QQKN
+FEF8 ; [.13AB.0020.0019.FEF8][.1349.0020.0019.FEF8] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM; QQKN
+FEF7 ; [.13AB.0020.001A.FEF7][.1349.0020.001A.FEF7] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM; QQKN
+FEFA ; [.13AB.0020.0019.FEFA][.134D.0020.0019.FEFA] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM; QQKN
+FEF9 ; [.13AB.0020.001A.FEF9][.134D.0020.001A.FEF9] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM; QQKN
+FEFC ; [.13AB.0020.0019.FEFC][.1350.0020.0019.FEFC] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM; QQKN
+FEFB ; [.13AB.0020.001A.FEFB][.1350.0020.001A.FEFB] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM; QQKN
+FCC9 ; [.13AB.0020.0017.FCC9][.135E.0020.0017.FCC9] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM; QQKN
+FC3F ; [.13AB.0020.001A.FC3F][.135E.0020.001A.FC3F] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM; QQKN
+FD83 ; [.13AB.0020.0017.FD83][.135E.0020.0017.FD83][.135E.0020.001F.FD83] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM; QQKN
+FD84 ; [.13AB.0020.0019.FD84][.135E.0020.0019.FD84][.135E.0020.001F.FD84] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM; QQKN
+FDBA ; [.13AB.0020.0017.FDBA][.135E.0020.0017.FDBA][.13B0.0020.001F.FDBA] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDBC ; [.13AB.0020.0019.FDBC][.135E.0020.0019.FDBC][.13B0.0020.001F.FDBC] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM; QQKN
+FDAC ; [.13AB.0020.0019.FDAC][.135E.0020.0019.FDAC][.13C8.0020.001F.FDAC] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM; QQKN
+FCCA ; [.13AB.0020.0017.FCCA][.1364.0020.0017.FCCA] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM; QQKN
+FC40 ; [.13AB.0020.001A.FC40][.1364.0020.001A.FC40] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM; QQKN
+FDB5 ; [.13AB.0020.0017.FDB5][.1364.0020.0017.FDB5][.13B0.0020.001F.FDB5] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD80 ; [.13AB.0020.0019.FD80][.1364.0020.0019.FD80][.13B0.0020.001F.FD80] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM; QQKN
+FD82 ; [.13AB.0020.0019.FD82][.1364.0020.0019.FD82][.13C7.0020.001F.FD82] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FD81 ; [.13AB.0020.0019.FD81][.1364.0020.0019.FD81][.13C8.0020.001F.FD81] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM; QQKN
+FCCB ; [.13AB.0020.0017.FCCB][.1365.0020.0017.FCCB] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM; QQKN
+FC41 ; [.13AB.0020.001A.FC41][.1365.0020.001A.FC41] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM; QQKN
+FD86 ; [.13AB.0020.0017.FD86][.1365.0020.0017.FD86][.13B0.0020.001F.FD86] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD85 ; [.13AB.0020.0019.FD85][.1365.0020.0019.FD85][.13B0.0020.001F.FD85] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM; QQKN
+FCCC ; [.13AB.0020.0017.FCCC][.13B0.0020.0017.FCCC] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM; QQKN
+FCED ; [.13AB.0020.0018.FCED][.13B0.0020.0018.FCED] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM; QQKN
+FC85 ; [.13AB.0020.0019.FC85][.13B0.0020.0019.FC85] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM; QQKN
+FC42 ; [.13AB.0020.001A.FC42][.13B0.0020.001A.FC42] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM; QQKN
+FD88 ; [.13AB.0020.0017.FD88][.13B0.0020.0017.FD88][.1364.0020.001F.FD88] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD87 ; [.13AB.0020.0019.FD87][.13B0.0020.0019.FD87][.1364.0020.001F.FD87] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM; QQKN
+FDAD ; [.13AB.0020.0019.FDAD][.13B0.0020.0019.FDAD][.13C8.0020.001F.FDAD] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM; QQKN
+FCCD ; [.13AB.0020.0017.FCCD][.13B7.0020.0017.FCCD] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM; QQKN
+FC86 ; [.13AB.0020.0019.FC86][.13C7.0020.0019.FC86] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM; QQKN
+FC43 ; [.13AB.0020.001A.FC43][.13C7.0020.001A.FC43] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC87 ; [.13AB.0020.0019.FC87][.13C8.0020.0019.FC87] # ARABIC LIGATURE LAM WITH YEH FINAL FORM; QQKN
+FC44 ; [.13AB.0020.001A.FC44][.13C8.0020.001A.FC44] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM; QQKN
+06B5 ; [.13AC.0020.0002.06B5] # ARABIC LETTER LAM WITH SMALL V
+06B6 ; [.13AD.0020.0002.06B6] # ARABIC LETTER LAM WITH DOT ABOVE
+06B7 ; [.13AE.0020.0002.06B7] # ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8 ; [.13AF.0020.0002.06B8] # ARABIC LETTER LAM WITH THREE DOTS BELOW
+0645 ; [.13B0.0020.0002.0645] # ARABIC LETTER MEEM
+FEE3 ; [.13B0.0020.0017.FEE3] # ARABIC LETTER MEEM INITIAL FORM; QQK
+FEE4 ; [.13B0.0020.0018.FEE4] # ARABIC LETTER MEEM MEDIAL FORM; QQK
+FEE2 ; [.13B0.0020.0019.FEE2] # ARABIC LETTER MEEM FINAL FORM; QQK
+FEE1 ; [.13B0.0020.001A.FEE1] # ARABIC LETTER MEEM ISOLATED FORM; QQK
+06FE ; [.13B0.0020.0004.06FE][.0000.015E.0004.06FE] # ARABIC SIGN SINDHI POSTPOSITION MEN; QQKN
+FC88 ; [.13B0.0020.0019.FC88][.1350.0020.0019.FC88] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM; QQKN
+FCCE ; [.13B0.0020.0017.FCCE][.135E.0020.0017.FCCE] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM; QQKN
+FC45 ; [.13B0.0020.001A.FC45][.135E.0020.001A.FC45] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM; QQKN
+FD8C ; [.13B0.0020.0017.FD8C][.135E.0020.0017.FD8C][.1364.0020.001F.FD8C] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM; QQKN
+FD92 ; [.13B0.0020.0017.FD92][.135E.0020.0017.FD92][.1365.0020.001F.FD92] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM; QQKN
+FD8D ; [.13B0.0020.0017.FD8D][.135E.0020.0017.FD8D][.13B0.0020.001F.FD8D] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDC0 ; [.13B0.0020.0019.FDC0][.135E.0020.0019.FDC0][.13C8.0020.001F.FDC0] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM; QQKN
+FCCF ; [.13B0.0020.0017.FCCF][.1364.0020.0017.FCCF] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM; QQKN
+FC46 ; [.13B0.0020.001A.FC46][.1364.0020.001A.FC46] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM; QQKN
+FD89 ; [.13B0.0020.0017.FD89][.1364.0020.0017.FD89][.135E.0020.001F.FD89] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM; QQKN
+FD8A ; [.13B0.0020.0017.FD8A][.1364.0020.0017.FD8A][.13B0.0020.001F.FD8A] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM; QQKN
+FDF4 ; [.13B0.0020.001A.FDF4][.1364.0020.001A.FDF4][.13B0.0020.001F.FDF4][.1369.0020.001F.FDF4] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM; QQKN
+FD8B ; [.13B0.0020.0019.FD8B][.1364.0020.0019.FD8B][.13C8.0020.001F.FD8B] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM; QQKN
+FCD0 ; [.13B0.0020.0017.FCD0][.1365.0020.0017.FCD0] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM; QQKN
+FC47 ; [.13B0.0020.001A.FC47][.1365.0020.001A.FC47] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM; QQKN
+FD8E ; [.13B0.0020.0017.FD8E][.1365.0020.0017.FD8E][.135E.0020.001F.FD8E] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM; QQKN
+FD8F ; [.13B0.0020.0017.FD8F][.1365.0020.0017.FD8F][.13B0.0020.001F.FD8F] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FDB9 ; [.13B0.0020.0019.FDB9][.1365.0020.0019.FDB9][.13C8.0020.001F.FDB9] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM; QQKN
+FCD1 ; [.13B0.0020.0017.FCD1][.13B0.0020.0017.FCD1] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM; QQKN
+FC89 ; [.13B0.0020.0019.FC89][.13B0.0020.0019.FC89] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM; QQKN
+FC48 ; [.13B0.0020.001A.FC48][.13B0.0020.001A.FC48] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM; QQKN
+FDB1 ; [.13B0.0020.0019.FDB1][.13B0.0020.0019.FDB1][.13C8.0020.001F.FDB1] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM; QQKN
+FC49 ; [.13B0.0020.001A.FC49][.13C7.0020.001A.FC49] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC4A ; [.13B0.0020.001A.FC4A][.13C8.0020.001A.FC4A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM; QQKN
+0646 ; [.13B1.0020.0002.0646] # ARABIC LETTER NOON
+FEE7 ; [.13B1.0020.0017.FEE7] # ARABIC LETTER NOON INITIAL FORM; QQK
+FEE8 ; [.13B1.0020.0018.FEE8] # ARABIC LETTER NOON MEDIAL FORM; QQK
+FEE6 ; [.13B1.0020.0019.FEE6] # ARABIC LETTER NOON FINAL FORM; QQK
+FEE5 ; [.13B1.0020.001A.FEE5] # ARABIC LETTER NOON ISOLATED FORM; QQK
+FCD2 ; [.13B1.0020.0017.FCD2][.135E.0020.0017.FCD2] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM; QQKN
+FC4B ; [.13B1.0020.001A.FC4B][.135E.0020.001A.FC4B] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM; QQKN
+FDB8 ; [.13B1.0020.0017.FDB8][.135E.0020.0017.FDB8][.1364.0020.001F.FDB8] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM; QQKN
+FDBD ; [.13B1.0020.0019.FDBD][.135E.0020.0019.FDBD][.1364.0020.001F.FDBD] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM; QQKN
+FD98 ; [.13B1.0020.0017.FD98][.135E.0020.0017.FD98][.13B0.0020.001F.FD98] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FD97 ; [.13B1.0020.0019.FD97][.135E.0020.0019.FD97][.13B0.0020.001F.FD97] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM; QQKN
+FD99 ; [.13B1.0020.0019.FD99][.135E.0020.0019.FD99][.13C7.0020.001F.FD99] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDC7 ; [.13B1.0020.0019.FDC7][.135E.0020.0019.FDC7][.13C8.0020.001F.FDC7] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM; QQKN
+FCD3 ; [.13B1.0020.0017.FCD3][.1364.0020.0017.FCD3] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM; QQKN
+FC4C ; [.13B1.0020.001A.FC4C][.1364.0020.001A.FC4C] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM; QQKN
+FD95 ; [.13B1.0020.0017.FD95][.1364.0020.0017.FD95][.13B0.0020.001F.FD95] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD96 ; [.13B1.0020.0019.FD96][.1364.0020.0019.FD96][.13C7.0020.001F.FD96] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDB3 ; [.13B1.0020.0019.FDB3][.1364.0020.0019.FDB3][.13C8.0020.001F.FDB3] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM; QQKN
+FCD4 ; [.13B1.0020.0017.FCD4][.1365.0020.0017.FCD4] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM; QQKN
+FC4D ; [.13B1.0020.001A.FC4D][.1365.0020.001A.FC4D] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM; QQKN
+FC8A ; [.13B1.0020.0019.FC8A][.1375.0020.0019.FC8A] # ARABIC LIGATURE NOON WITH REH FINAL FORM; QQKN
+FC8B ; [.13B1.0020.0019.FC8B][.1376.0020.0019.FC8B] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM; QQKN
+FCD5 ; [.13B1.0020.0017.FCD5][.13B0.0020.0017.FCD5] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM; QQKN
+FCEE ; [.13B1.0020.0018.FCEE][.13B0.0020.0018.FCEE] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM; QQKN
+FC8C ; [.13B1.0020.0019.FC8C][.13B0.0020.0019.FC8C] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM; QQKN
+FC4E ; [.13B1.0020.001A.FC4E][.13B0.0020.001A.FC4E] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM; QQKN
+FD9B ; [.13B1.0020.0019.FD9B][.13B0.0020.0019.FD9B][.13C7.0020.001F.FD9B] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD9A ; [.13B1.0020.0019.FD9A][.13B0.0020.0019.FD9A][.13C8.0020.001F.FD9A] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM; QQKN
+FC8D ; [.13B1.0020.0019.FC8D][.13B1.0020.0019.FC8D] # ARABIC LIGATURE NOON WITH NOON FINAL FORM; QQKN
+FCD6 ; [.13B1.0020.0017.FCD6][.13B7.0020.0017.FCD6] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM; QQKN
+FCEF ; [.13B1.0020.0018.FCEF][.13B7.0020.0018.FCEF] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM; QQKN
+FC8E ; [.13B1.0020.0019.FC8E][.13C7.0020.0019.FC8E] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM; QQKN
+FC4F ; [.13B1.0020.001A.FC4F][.13C7.0020.001A.FC4F] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC8F ; [.13B1.0020.0019.FC8F][.13C8.0020.0019.FC8F] # ARABIC LIGATURE NOON WITH YEH FINAL FORM; QQKN
+FC50 ; [.13B1.0020.001A.FC50][.13C8.0020.001A.FC50] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM; QQKN
+06BA ; [.13B2.0020.0002.06BA] # ARABIC LETTER NOON GHUNNA
+FB9F ; [.13B2.0020.0019.FB9F] # ARABIC LETTER NOON GHUNNA FINAL FORM; QQK
+FB9E ; [.13B2.0020.001A.FB9E] # ARABIC LETTER NOON GHUNNA ISOLATED FORM; QQK
+06BB ; [.13B3.0020.0002.06BB] # ARABIC LETTER RNOON
+FBA2 ; [.13B3.0020.0017.FBA2] # ARABIC LETTER RNOON INITIAL FORM; QQK
+FBA3 ; [.13B3.0020.0018.FBA3] # ARABIC LETTER RNOON MEDIAL FORM; QQK
+FBA1 ; [.13B3.0020.0019.FBA1] # ARABIC LETTER RNOON FINAL FORM; QQK
+FBA0 ; [.13B3.0020.001A.FBA0] # ARABIC LETTER RNOON ISOLATED FORM; QQK
+06BC ; [.13B4.0020.0002.06BC] # ARABIC LETTER NOON WITH RING
+06BD ; [.13B5.0020.0002.06BD] # ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06B9 ; [.13B6.0020.0002.06B9] # ARABIC LETTER NOON WITH DOT BELOW
+0647 ; [.13B7.0020.0002.0647] # ARABIC LETTER HEH
+FEEB ; [.13B7.0020.0017.FEEB] # ARABIC LETTER HEH INITIAL FORM; QQK
+FEEC ; [.13B7.0020.0018.FEEC] # ARABIC LETTER HEH MEDIAL FORM; QQK
+FEEA ; [.13B7.0020.0019.FEEA] # ARABIC LETTER HEH FINAL FORM; QQK
+FEE9 ; [.13B7.0020.001A.FEE9] # ARABIC LETTER HEH ISOLATED FORM; QQK
+FCD9 ; [.13B7.0020.0017.FCD9][.0000.00D8.0017.FCD9] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM; QQKN
+FCD7 ; [.13B7.0020.0017.FCD7][.135E.0020.0017.FCD7] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM; QQKN
+FC51 ; [.13B7.0020.001A.FC51][.135E.0020.001A.FC51] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM; QQKN
+FCD8 ; [.13B7.0020.0017.FCD8][.13B0.0020.0017.FCD8] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM; QQKN
+FC52 ; [.13B7.0020.001A.FC52][.13B0.0020.001A.FC52] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM; QQKN
+FD93 ; [.13B7.0020.0017.FD93][.13B0.0020.0017.FD93][.135E.0020.001F.FD93] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD94 ; [.13B7.0020.0017.FD94][.13B0.0020.0017.FD94][.13B0.0020.001F.FD94] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FC53 ; [.13B7.0020.001A.FC53][.13C7.0020.001A.FC53] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC54 ; [.13B7.0020.001A.FC54][.13C8.0020.001A.FC54] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM; QQKN
+06BE ; [.13B8.0020.0002.06BE] # ARABIC LETTER HEH DOACHASHMEE
+FBAC ; [.13B8.0020.0017.FBAC] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM; QQK
+FBAD ; [.13B8.0020.0018.FBAD] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM; QQK
+FBAB ; [.13B8.0020.0019.FBAB] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM; QQK
+FBAA ; [.13B8.0020.001A.FBAA] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM; QQK
+06C1 ; [.13B9.0020.0002.06C1] # ARABIC LETTER HEH GOAL
+FBA8 ; [.13B9.0020.0017.FBA8] # ARABIC LETTER HEH GOAL INITIAL FORM; QQK
+FBA9 ; [.13B9.0020.0018.FBA9] # ARABIC LETTER HEH GOAL MEDIAL FORM; QQK
+FBA7 ; [.13B9.0020.0019.FBA7] # ARABIC LETTER HEH GOAL FINAL FORM; QQK
+FBA6 ; [.13B9.0020.001A.FBA6] # ARABIC LETTER HEH GOAL ISOLATED FORM; QQK
+06C2 ; [.13B9.0020.0002.06C1][.0000.00D3.0002.0654] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE; QQCM
+06C3 ; [.13BA.0020.0002.06C3] # ARABIC LETTER TEH MARBUTA GOAL
+06FF ; [.13BB.0020.0002.06FF] # ARABIC LETTER HEH WITH INVERTED V
+06D5 ; [.13BC.0020.0002.06D5] # ARABIC LETTER AE
+06C0 ; [.13BC.0020.0002.06D5][.0000.00D3.0002.0654] # ARABIC LETTER HEH WITH YEH ABOVE; QQCM
+FBA5 ; [.13BC.0020.0019.FBA5][.0000.00D3.0019.FBA5] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM; QQKN
+FBA4 ; [.13BC.0020.001A.FBA4][.0000.00D3.001A.FBA4] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM; QQKN
+0648 ; [.13BD.0020.0002.0648] # ARABIC LETTER WAW
+06E5 ; [.13BD.0020.0004.06E5] # ARABIC SMALL WAW; QQK
+FEEE ; [.13BD.0020.0019.FEEE] # ARABIC LETTER WAW FINAL FORM; QQK
+FEED ; [.13BD.0020.001A.FEED] # ARABIC LETTER WAW ISOLATED FORM; QQK
+0676 ; [.13BD.0020.0004.0676][.1347.0020.0004.0676] # ARABIC LETTER HIGH HAMZA WAW; QQKN
+FDF8 ; [.13BD.0020.001A.FDF8][.1381.0020.001A.FDF8][.13AB.0020.001F.FDF8][.13B0.0020.001F.FDF8] # ARABIC LIGATURE WASALLAM ISOLATED FORM; QQKN
+06C4 ; [.13BE.0020.0002.06C4] # ARABIC LETTER WAW WITH RING
+06C5 ; [.13BF.0020.0002.06C5] # ARABIC LETTER KIRGHIZ OE
+FBE1 ; [.13BF.0020.0019.FBE1] # ARABIC LETTER KIRGHIZ OE FINAL FORM; QQK
+FBE0 ; [.13BF.0020.001A.FBE0] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM; QQK
+06C6 ; [.13C0.0020.0002.06C6] # ARABIC LETTER OE
+FBDA ; [.13C0.0020.0019.FBDA] # ARABIC LETTER OE FINAL FORM; QQK
+FBD9 ; [.13C0.0020.001A.FBD9] # ARABIC LETTER OE ISOLATED FORM; QQK
+06C7 ; [.13C1.0020.0002.06C7] # ARABIC LETTER U
+FBD8 ; [.13C1.0020.0019.FBD8] # ARABIC LETTER U FINAL FORM; QQK
+FBD7 ; [.13C1.0020.001A.FBD7] # ARABIC LETTER U ISOLATED FORM; QQK
+0677 ; [.13C1.0020.0004.0677][.1347.0020.0004.0677] # ARABIC LETTER U WITH HAMZA ABOVE; QQKN
+FBDD ; [.13C1.0020.001A.FBDD][.1347.0020.001A.FBDD] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM; QQKN
+06C8 ; [.13C2.0020.0002.06C8] # ARABIC LETTER YU
+FBDC ; [.13C2.0020.0019.FBDC] # ARABIC LETTER YU FINAL FORM; QQK
+FBDB ; [.13C2.0020.001A.FBDB] # ARABIC LETTER YU ISOLATED FORM; QQK
+06C9 ; [.13C3.0020.0002.06C9] # ARABIC LETTER KIRGHIZ YU
+FBE3 ; [.13C3.0020.0019.FBE3] # ARABIC LETTER KIRGHIZ YU FINAL FORM; QQK
+FBE2 ; [.13C3.0020.001A.FBE2] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM; QQK
+06CA ; [.13C4.0020.0002.06CA] # ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB ; [.13C5.0020.0002.06CB] # ARABIC LETTER VE
+FBDF ; [.13C5.0020.0019.FBDF] # ARABIC LETTER VE FINAL FORM; QQK
+FBDE ; [.13C5.0020.001A.FBDE] # ARABIC LETTER VE ISOLATED FORM; QQK
+06CF ; [.13C6.0020.0002.06CF] # ARABIC LETTER WAW WITH DOT ABOVE
+0649 ; [.13C7.0020.0002.0649] # ARABIC LETTER ALEF MAKSURA
+FBE8 ; [.13C7.0020.0017.FBE8] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM; QQK
+FBE9 ; [.13C7.0020.0018.FBE9] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM; QQK
+FEF0 ; [.13C7.0020.0019.FEF0] # ARABIC LETTER ALEF MAKSURA FINAL FORM; QQK
+FEEF ; [.13C7.0020.001A.FEEF] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM; QQK
+FC90 ; [.13C7.0020.0019.FC90][.0000.00D8.0019.FC90] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM; QQKN
+FC5D ; [.13C7.0020.001A.FC5D][.0000.00D8.001A.FC5D] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+064A ; [.13C8.0020.0002.064A] # ARABIC LETTER YEH
+06E6 ; [.13C8.0020.0004.06E6] # ARABIC SMALL YEH; QQK
+FEF3 ; [.13C8.0020.0017.FEF3] # ARABIC LETTER YEH INITIAL FORM; QQK
+FEF4 ; [.13C8.0020.0018.FEF4] # ARABIC LETTER YEH MEDIAL FORM; QQK
+FEF2 ; [.13C8.0020.0019.FEF2] # ARABIC LETTER YEH FINAL FORM; QQK
+FEF1 ; [.13C8.0020.001A.FEF1] # ARABIC LETTER YEH ISOLATED FORM; QQK
+0678 ; [.13C8.0020.0004.0678][.1347.0020.0004.0678] # ARABIC LETTER HIGH HAMZA YEH; QQKN
+FCDA ; [.13C8.0020.0017.FCDA][.135E.0020.0017.FCDA] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM; QQKN
+FC55 ; [.13C8.0020.001A.FC55][.135E.0020.001A.FC55] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM; QQKN
+FDAF ; [.13C8.0020.0019.FDAF][.135E.0020.0019.FDAF][.13C8.0020.001F.FDAF] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCDB ; [.13C8.0020.0017.FCDB][.1364.0020.0017.FCDB] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM; QQKN
+FC56 ; [.13C8.0020.001A.FC56][.1364.0020.001A.FC56] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM; QQKN
+FDAE ; [.13C8.0020.0019.FDAE][.1364.0020.0019.FDAE][.13C8.0020.001F.FDAE] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM; QQKN
+FCDC ; [.13C8.0020.0017.FCDC][.1365.0020.0017.FCDC] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM; QQKN
+FC57 ; [.13C8.0020.001A.FC57][.1365.0020.001A.FC57] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM; QQKN
+FC91 ; [.13C8.0020.0019.FC91][.1375.0020.0019.FC91] # ARABIC LIGATURE YEH WITH REH FINAL FORM; QQKN
+FC92 ; [.13C8.0020.0019.FC92][.1376.0020.0019.FC92] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM; QQKN
+FCDD ; [.13C8.0020.0017.FCDD][.13B0.0020.0017.FCDD] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM; QQKN
+FCF0 ; [.13C8.0020.0018.FCF0][.13B0.0020.0018.FCF0] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM; QQKN
+FC93 ; [.13C8.0020.0019.FC93][.13B0.0020.0019.FC93] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM; QQKN
+FC58 ; [.13C8.0020.001A.FC58][.13B0.0020.001A.FC58] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM; QQKN
+FD9D ; [.13C8.0020.0017.FD9D][.13B0.0020.0017.FD9D][.13B0.0020.001F.FD9D] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD9C ; [.13C8.0020.0019.FD9C][.13B0.0020.0019.FD9C][.13B0.0020.001F.FD9C] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB0 ; [.13C8.0020.0019.FDB0][.13B0.0020.0019.FDB0][.13C8.0020.001F.FDB0] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC94 ; [.13C8.0020.0019.FC94][.13B1.0020.0019.FC94] # ARABIC LIGATURE YEH WITH NOON FINAL FORM; QQKN
+FCDE ; [.13C8.0020.0017.FCDE][.13B7.0020.0017.FCDE] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM; QQKN
+FCF1 ; [.13C8.0020.0018.FCF1][.13B7.0020.0018.FCF1] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM; QQKN
+FC95 ; [.13C8.0020.0019.FC95][.13C7.0020.0019.FC95] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC59 ; [.13C8.0020.001A.FC59][.13C7.0020.001A.FC59] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC96 ; [.13C8.0020.0019.FC96][.13C8.0020.0019.FC96] # ARABIC LIGATURE YEH WITH YEH FINAL FORM; QQKN
+FC5A ; [.13C8.0020.001A.FC5A][.13C8.0020.001A.FC5A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM; QQKN
+06CC ; [.13C9.0020.0002.06CC] # ARABIC LETTER FARSI YEH
+FBFE ; [.13C9.0020.0017.FBFE] # ARABIC LETTER FARSI YEH INITIAL FORM; QQK
+FBFF ; [.13C9.0020.0018.FBFF] # ARABIC LETTER FARSI YEH MEDIAL FORM; QQK
+FBFD ; [.13C9.0020.0019.FBFD] # ARABIC LETTER FARSI YEH FINAL FORM; QQK
+FBFC ; [.13C9.0020.001A.FBFC] # ARABIC LETTER FARSI YEH ISOLATED FORM; QQK
+06CD ; [.13CA.0020.0002.06CD] # ARABIC LETTER YEH WITH TAIL
+06CE ; [.13CB.0020.0002.06CE] # ARABIC LETTER YEH WITH SMALL V
+06D0 ; [.13CC.0020.0002.06D0] # ARABIC LETTER E
+FBE6 ; [.13CC.0020.0017.FBE6] # ARABIC LETTER E INITIAL FORM; QQK
+FBE7 ; [.13CC.0020.0018.FBE7] # ARABIC LETTER E MEDIAL FORM; QQK
+FBE5 ; [.13CC.0020.0019.FBE5] # ARABIC LETTER E FINAL FORM; QQK
+FBE4 ; [.13CC.0020.001A.FBE4] # ARABIC LETTER E ISOLATED FORM; QQK
+06D1 ; [.13CD.0020.0002.06D1] # ARABIC LETTER YEH WITH THREE DOTS BELOW
+06D2 ; [.13CE.0020.0002.06D2] # ARABIC LETTER YEH BARREE
+FBAF ; [.13CE.0020.0019.FBAF] # ARABIC LETTER YEH BARREE FINAL FORM; QQK
+FBAE ; [.13CE.0020.001A.FBAE] # ARABIC LETTER YEH BARREE ISOLATED FORM; QQK
+06D3 ; [.13CE.0020.0002.06D2][.0000.00D3.0002.0654] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE; QQCM
+FBB1 ; [.13CE.0020.0019.FBB1][.0000.00D3.0019.FBB1] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM; QQKN
+FBB0 ; [.13CE.0020.001A.FBB0][.0000.00D3.001A.FBB0] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM; QQKN
+0710 ; [.13CF.0020.0002.0710] # SYRIAC LETTER ALAPH
+0712 ; [.13D0.0020.0002.0712] # SYRIAC LETTER BETH
+072D ; [.13D0.0020.0004.072D][.0000.0160.0004.072D] # SYRIAC LETTER PERSIAN BHETH; QQKN
+0713 ; [.13D1.0020.0002.0713] # SYRIAC LETTER GAMAL
+0714 ; [.13D1.0020.0004.0714][.0000.015E.0004.0714] # SYRIAC LETTER GAMAL GARSHUNI; QQKN
+072E ; [.13D1.0020.0004.072E][.0000.0160.0004.072E] # SYRIAC LETTER PERSIAN GHAMAL; QQKN
+0716 ; [.13D2.0020.0002.0716] # SYRIAC LETTER DOTLESS DALATH RISH
+0715 ; [.13D3.0020.0002.0715] # SYRIAC LETTER DALATH
+072F ; [.13D3.0020.0004.072F][.0000.0160.0004.072F] # SYRIAC LETTER PERSIAN DHALATH; QQKN
+0717 ; [.13D4.0020.0002.0717] # SYRIAC LETTER HE
+0718 ; [.13D5.0020.0002.0718] # SYRIAC LETTER WAW
+0719 ; [.13D6.0020.0002.0719] # SYRIAC LETTER ZAIN
+074D ; [.13D7.0020.0002.074D] # SYRIAC LETTER SOGDIAN ZHAIN
+071A ; [.13D8.0020.0002.071A] # SYRIAC LETTER HETH
+071B ; [.13D9.0020.0002.071B] # SYRIAC LETTER TETH
+071C ; [.13D9.0020.0004.071C][.0000.015E.0004.071C] # SYRIAC LETTER TETH GARSHUNI; QQKN
+071D ; [.13DA.0020.0002.071D] # SYRIAC LETTER YUDH
+071E ; [.13DB.0020.0002.071E] # SYRIAC LETTER YUDH HE
+071F ; [.13DC.0020.0002.071F] # SYRIAC LETTER KAPH
+074E ; [.13DD.0020.0002.074E] # SYRIAC LETTER SOGDIAN KHAPH
+0720 ; [.13DE.0020.0002.0720] # SYRIAC LETTER LAMADH
+0721 ; [.13DF.0020.0002.0721] # SYRIAC LETTER MIM
+0722 ; [.13E0.0020.0002.0722] # SYRIAC LETTER NUN
+0723 ; [.13E1.0020.0002.0723] # SYRIAC LETTER SEMKATH
+0724 ; [.13E1.0020.0019.0724] # SYRIAC LETTER FINAL SEMKATH; QQK
+0725 ; [.13E2.0020.0002.0725] # SYRIAC LETTER E
+0726 ; [.13E3.0020.0002.0726] # SYRIAC LETTER PE
+0727 ; [.13E3.0020.0004.0727][.0000.015E.0004.0727] # SYRIAC LETTER REVERSED PE; QQKN
+074F ; [.13E4.0020.0002.074F] # SYRIAC LETTER SOGDIAN FE
+0728 ; [.13E5.0020.0002.0728] # SYRIAC LETTER SADHE
+0729 ; [.13E6.0020.0002.0729] # SYRIAC LETTER QAPH
+072A ; [.13E7.0020.0002.072A] # SYRIAC LETTER RISH
+072B ; [.13E8.0020.0002.072B] # SYRIAC LETTER SHIN
+072C ; [.13E9.0020.0002.072C] # SYRIAC LETTER TAW
+0780 ; [.13EA.0020.0002.0780] # THAANA LETTER HAA
+0799 ; [.13EB.0020.0002.0799] # THAANA LETTER HHAA
+079A ; [.13EC.0020.0002.079A] # THAANA LETTER KHAA
+0781 ; [.13ED.0020.0002.0781] # THAANA LETTER SHAVIYANI
+0782 ; [.13EE.0020.0002.0782] # THAANA LETTER NOONU
+0783 ; [.13EF.0020.0002.0783] # THAANA LETTER RAA
+079C ; [.13F0.0020.0002.079C] # THAANA LETTER ZAA
+0784 ; [.13F1.0020.0002.0784] # THAANA LETTER BAA
+0785 ; [.13F2.0020.0002.0785] # THAANA LETTER LHAVIYANI
+0786 ; [.13F3.0020.0002.0786] # THAANA LETTER KAAFU
+0787 ; [.13F4.0020.0002.0787] # THAANA LETTER ALIFU
+07A2 ; [.13F5.0020.0002.07A2] # THAANA LETTER AINU
+07A3 ; [.13F6.0020.0002.07A3] # THAANA LETTER GHAINU
+0788 ; [.13F7.0020.0002.0788] # THAANA LETTER VAAVU
+07A5 ; [.13F8.0020.0002.07A5] # THAANA LETTER WAAVU
+0789 ; [.13F9.0020.0002.0789] # THAANA LETTER MEEMU
+078A ; [.13FA.0020.0002.078A] # THAANA LETTER FAAFU
+078B ; [.13FB.0020.0002.078B] # THAANA LETTER DHAALU
+079B ; [.13FC.0020.0002.079B] # THAANA LETTER THAALU
+078C ; [.13FD.0020.0002.078C] # THAANA LETTER THAA
+0798 ; [.13FE.0020.0002.0798] # THAANA LETTER TTAA
+07A0 ; [.13FF.0020.0002.07A0] # THAANA LETTER TO
+07A1 ; [.1400.0020.0002.07A1] # THAANA LETTER ZO
+078D ; [.1401.0020.0002.078D] # THAANA LETTER LAAMU
+078E ; [.1402.0020.0002.078E] # THAANA LETTER GAAFU
+07A4 ; [.1403.0020.0002.07A4] # THAANA LETTER QAAFU
+078F ; [.1404.0020.0002.078F] # THAANA LETTER GNAVIYANI
+0790 ; [.1405.0020.0002.0790] # THAANA LETTER SEENU
+079D ; [.1406.0020.0002.079D] # THAANA LETTER SHEENU
+079E ; [.1407.0020.0002.079E] # THAANA LETTER SAADHU
+079F ; [.1408.0020.0002.079F] # THAANA LETTER DAADHU
+0791 ; [.1409.0020.0002.0791] # THAANA LETTER DAVIYANI
+0792 ; [.140A.0020.0002.0792] # THAANA LETTER ZAVIYANI
+0793 ; [.140B.0020.0002.0793] # THAANA LETTER TAVIYANI
+0794 ; [.140C.0020.0002.0794] # THAANA LETTER YAA
+0795 ; [.140D.0020.0002.0795] # THAANA LETTER PAVIYANI
+0796 ; [.140E.0020.0002.0796] # THAANA LETTER JAVIYANI
+0797 ; [.140F.0020.0002.0797] # THAANA LETTER CHAVIYANI
+07B1 ; [.1410.0020.0002.07B1] # THAANA LETTER NAA
+07A6 ; [.1411.0020.0002.07A6] # THAANA ABAFILI
+07A7 ; [.1412.0020.0002.07A7] # THAANA AABAAFILI
+07A8 ; [.1413.0020.0002.07A8] # THAANA IBIFILI
+07A9 ; [.1414.0020.0002.07A9] # THAANA EEBEEFILI
+07AA ; [.1415.0020.0002.07AA] # THAANA UBUFILI
+07AB ; [.1416.0020.0002.07AB] # THAANA OOBOOFILI
+07AC ; [.1417.0020.0002.07AC] # THAANA EBEFILI
+07AD ; [.1418.0020.0002.07AD] # THAANA EYBEYFILI
+07AE ; [.1419.0020.0002.07AE] # THAANA OBOFILI
+07AF ; [.141A.0020.0002.07AF] # THAANA OABOAFILI
+07B0 ; [.141B.0020.0002.07B0] # THAANA SUKUN
+1200 ; [.141C.0020.0002.1200] # ETHIOPIC SYLLABLE HA
+1201 ; [.141D.0020.0002.1201] # ETHIOPIC SYLLABLE HU
+1202 ; [.141E.0020.0002.1202] # ETHIOPIC SYLLABLE HI
+1203 ; [.141F.0020.0002.1203] # ETHIOPIC SYLLABLE HAA
+1204 ; [.1420.0020.0002.1204] # ETHIOPIC SYLLABLE HEE
+1205 ; [.1421.0020.0002.1205] # ETHIOPIC SYLLABLE HE
+1206 ; [.1422.0020.0002.1206] # ETHIOPIC SYLLABLE HO
+1208 ; [.1423.0020.0002.1208] # ETHIOPIC SYLLABLE LA
+1209 ; [.1424.0020.0002.1209] # ETHIOPIC SYLLABLE LU
+120A ; [.1425.0020.0002.120A] # ETHIOPIC SYLLABLE LI
+120B ; [.1426.0020.0002.120B] # ETHIOPIC SYLLABLE LAA
+120C ; [.1427.0020.0002.120C] # ETHIOPIC SYLLABLE LEE
+120D ; [.1428.0020.0002.120D] # ETHIOPIC SYLLABLE LE
+120E ; [.1429.0020.0002.120E] # ETHIOPIC SYLLABLE LO
+120F ; [.142A.0020.0002.120F] # ETHIOPIC SYLLABLE LWA
+1210 ; [.142B.0020.0002.1210] # ETHIOPIC SYLLABLE HHA
+1211 ; [.142C.0020.0002.1211] # ETHIOPIC SYLLABLE HHU
+1212 ; [.142D.0020.0002.1212] # ETHIOPIC SYLLABLE HHI
+1213 ; [.142E.0020.0002.1213] # ETHIOPIC SYLLABLE HHAA
+1214 ; [.142F.0020.0002.1214] # ETHIOPIC SYLLABLE HHEE
+1215 ; [.1430.0020.0002.1215] # ETHIOPIC SYLLABLE HHE
+1216 ; [.1431.0020.0002.1216] # ETHIOPIC SYLLABLE HHO
+1217 ; [.1432.0020.0002.1217] # ETHIOPIC SYLLABLE HHWA
+1218 ; [.1433.0020.0002.1218] # ETHIOPIC SYLLABLE MA
+1219 ; [.1434.0020.0002.1219] # ETHIOPIC SYLLABLE MU
+121A ; [.1435.0020.0002.121A] # ETHIOPIC SYLLABLE MI
+121B ; [.1436.0020.0002.121B] # ETHIOPIC SYLLABLE MAA
+121C ; [.1437.0020.0002.121C] # ETHIOPIC SYLLABLE MEE
+121D ; [.1438.0020.0002.121D] # ETHIOPIC SYLLABLE ME
+121E ; [.1439.0020.0002.121E] # ETHIOPIC SYLLABLE MO
+121F ; [.143A.0020.0002.121F] # ETHIOPIC SYLLABLE MWA
+1220 ; [.143B.0020.0002.1220] # ETHIOPIC SYLLABLE SZA
+1221 ; [.143C.0020.0002.1221] # ETHIOPIC SYLLABLE SZU
+1222 ; [.143D.0020.0002.1222] # ETHIOPIC SYLLABLE SZI
+1223 ; [.143E.0020.0002.1223] # ETHIOPIC SYLLABLE SZAA
+1224 ; [.143F.0020.0002.1224] # ETHIOPIC SYLLABLE SZEE
+1225 ; [.1440.0020.0002.1225] # ETHIOPIC SYLLABLE SZE
+1226 ; [.1441.0020.0002.1226] # ETHIOPIC SYLLABLE SZO
+1227 ; [.1442.0020.0002.1227] # ETHIOPIC SYLLABLE SZWA
+1228 ; [.1443.0020.0002.1228] # ETHIOPIC SYLLABLE RA
+1229 ; [.1444.0020.0002.1229] # ETHIOPIC SYLLABLE RU
+122A ; [.1445.0020.0002.122A] # ETHIOPIC SYLLABLE RI
+122B ; [.1446.0020.0002.122B] # ETHIOPIC SYLLABLE RAA
+122C ; [.1447.0020.0002.122C] # ETHIOPIC SYLLABLE REE
+122D ; [.1448.0020.0002.122D] # ETHIOPIC SYLLABLE RE
+122E ; [.1449.0020.0002.122E] # ETHIOPIC SYLLABLE RO
+122F ; [.144A.0020.0002.122F] # ETHIOPIC SYLLABLE RWA
+1230 ; [.144B.0020.0002.1230] # ETHIOPIC SYLLABLE SA
+1231 ; [.144C.0020.0002.1231] # ETHIOPIC SYLLABLE SU
+1232 ; [.144D.0020.0002.1232] # ETHIOPIC SYLLABLE SI
+1233 ; [.144E.0020.0002.1233] # ETHIOPIC SYLLABLE SAA
+1234 ; [.144F.0020.0002.1234] # ETHIOPIC SYLLABLE SEE
+1235 ; [.1450.0020.0002.1235] # ETHIOPIC SYLLABLE SE
+1236 ; [.1451.0020.0002.1236] # ETHIOPIC SYLLABLE SO
+1237 ; [.1452.0020.0002.1237] # ETHIOPIC SYLLABLE SWA
+1238 ; [.1453.0020.0002.1238] # ETHIOPIC SYLLABLE SHA
+1239 ; [.1454.0020.0002.1239] # ETHIOPIC SYLLABLE SHU
+123A ; [.1455.0020.0002.123A] # ETHIOPIC SYLLABLE SHI
+123B ; [.1456.0020.0002.123B] # ETHIOPIC SYLLABLE SHAA
+123C ; [.1457.0020.0002.123C] # ETHIOPIC SYLLABLE SHEE
+123D ; [.1458.0020.0002.123D] # ETHIOPIC SYLLABLE SHE
+123E ; [.1459.0020.0002.123E] # ETHIOPIC SYLLABLE SHO
+123F ; [.145A.0020.0002.123F] # ETHIOPIC SYLLABLE SHWA
+1240 ; [.145B.0020.0002.1240] # ETHIOPIC SYLLABLE QA
+1241 ; [.145C.0020.0002.1241] # ETHIOPIC SYLLABLE QU
+1242 ; [.145D.0020.0002.1242] # ETHIOPIC SYLLABLE QI
+1243 ; [.145E.0020.0002.1243] # ETHIOPIC SYLLABLE QAA
+1244 ; [.145F.0020.0002.1244] # ETHIOPIC SYLLABLE QEE
+1245 ; [.1460.0020.0002.1245] # ETHIOPIC SYLLABLE QE
+1246 ; [.1461.0020.0002.1246] # ETHIOPIC SYLLABLE QO
+1248 ; [.1462.0020.0002.1248] # ETHIOPIC SYLLABLE QWA
+124A ; [.1463.0020.0002.124A] # ETHIOPIC SYLLABLE QWI
+124B ; [.1464.0020.0002.124B] # ETHIOPIC SYLLABLE QWAA
+124C ; [.1465.0020.0002.124C] # ETHIOPIC SYLLABLE QWEE
+124D ; [.1466.0020.0002.124D] # ETHIOPIC SYLLABLE QWE
+1250 ; [.1467.0020.0002.1250] # ETHIOPIC SYLLABLE QHA
+1251 ; [.1468.0020.0002.1251] # ETHIOPIC SYLLABLE QHU
+1252 ; [.1469.0020.0002.1252] # ETHIOPIC SYLLABLE QHI
+1253 ; [.146A.0020.0002.1253] # ETHIOPIC SYLLABLE QHAA
+1254 ; [.146B.0020.0002.1254] # ETHIOPIC SYLLABLE QHEE
+1255 ; [.146C.0020.0002.1255] # ETHIOPIC SYLLABLE QHE
+1256 ; [.146D.0020.0002.1256] # ETHIOPIC SYLLABLE QHO
+1258 ; [.146E.0020.0002.1258] # ETHIOPIC SYLLABLE QHWA
+125A ; [.146F.0020.0002.125A] # ETHIOPIC SYLLABLE QHWI
+125B ; [.1470.0020.0002.125B] # ETHIOPIC SYLLABLE QHWAA
+125C ; [.1471.0020.0002.125C] # ETHIOPIC SYLLABLE QHWEE
+125D ; [.1472.0020.0002.125D] # ETHIOPIC SYLLABLE QHWE
+1260 ; [.1473.0020.0002.1260] # ETHIOPIC SYLLABLE BA
+1261 ; [.1474.0020.0002.1261] # ETHIOPIC SYLLABLE BU
+1262 ; [.1475.0020.0002.1262] # ETHIOPIC SYLLABLE BI
+1263 ; [.1476.0020.0002.1263] # ETHIOPIC SYLLABLE BAA
+1264 ; [.1477.0020.0002.1264] # ETHIOPIC SYLLABLE BEE
+1265 ; [.1478.0020.0002.1265] # ETHIOPIC SYLLABLE BE
+1266 ; [.1479.0020.0002.1266] # ETHIOPIC SYLLABLE BO
+1267 ; [.147A.0020.0002.1267] # ETHIOPIC SYLLABLE BWA
+1268 ; [.147B.0020.0002.1268] # ETHIOPIC SYLLABLE VA
+1269 ; [.147C.0020.0002.1269] # ETHIOPIC SYLLABLE VU
+126A ; [.147D.0020.0002.126A] # ETHIOPIC SYLLABLE VI
+126B ; [.147E.0020.0002.126B] # ETHIOPIC SYLLABLE VAA
+126C ; [.147F.0020.0002.126C] # ETHIOPIC SYLLABLE VEE
+126D ; [.1480.0020.0002.126D] # ETHIOPIC SYLLABLE VE
+126E ; [.1481.0020.0002.126E] # ETHIOPIC SYLLABLE VO
+126F ; [.1482.0020.0002.126F] # ETHIOPIC SYLLABLE VWA
+1270 ; [.1483.0020.0002.1270] # ETHIOPIC SYLLABLE TA
+1271 ; [.1484.0020.0002.1271] # ETHIOPIC SYLLABLE TU
+1272 ; [.1485.0020.0002.1272] # ETHIOPIC SYLLABLE TI
+1273 ; [.1486.0020.0002.1273] # ETHIOPIC SYLLABLE TAA
+1274 ; [.1487.0020.0002.1274] # ETHIOPIC SYLLABLE TEE
+1275 ; [.1488.0020.0002.1275] # ETHIOPIC SYLLABLE TE
+1276 ; [.1489.0020.0002.1276] # ETHIOPIC SYLLABLE TO
+1277 ; [.148A.0020.0002.1277] # ETHIOPIC SYLLABLE TWA
+1278 ; [.148B.0020.0002.1278] # ETHIOPIC SYLLABLE CA
+1279 ; [.148C.0020.0002.1279] # ETHIOPIC SYLLABLE CU
+127A ; [.148D.0020.0002.127A] # ETHIOPIC SYLLABLE CI
+127B ; [.148E.0020.0002.127B] # ETHIOPIC SYLLABLE CAA
+127C ; [.148F.0020.0002.127C] # ETHIOPIC SYLLABLE CEE
+127D ; [.1490.0020.0002.127D] # ETHIOPIC SYLLABLE CE
+127E ; [.1491.0020.0002.127E] # ETHIOPIC SYLLABLE CO
+127F ; [.1492.0020.0002.127F] # ETHIOPIC SYLLABLE CWA
+1280 ; [.1493.0020.0002.1280] # ETHIOPIC SYLLABLE XA
+1281 ; [.1494.0020.0002.1281] # ETHIOPIC SYLLABLE XU
+1282 ; [.1495.0020.0002.1282] # ETHIOPIC SYLLABLE XI
+1283 ; [.1496.0020.0002.1283] # ETHIOPIC SYLLABLE XAA
+1284 ; [.1497.0020.0002.1284] # ETHIOPIC SYLLABLE XEE
+1285 ; [.1498.0020.0002.1285] # ETHIOPIC SYLLABLE XE
+1286 ; [.1499.0020.0002.1286] # ETHIOPIC SYLLABLE XO
+1288 ; [.149A.0020.0002.1288] # ETHIOPIC SYLLABLE XWA
+128A ; [.149B.0020.0002.128A] # ETHIOPIC SYLLABLE XWI
+128B ; [.149C.0020.0002.128B] # ETHIOPIC SYLLABLE XWAA
+128C ; [.149D.0020.0002.128C] # ETHIOPIC SYLLABLE XWEE
+128D ; [.149E.0020.0002.128D] # ETHIOPIC SYLLABLE XWE
+1290 ; [.149F.0020.0002.1290] # ETHIOPIC SYLLABLE NA
+1291 ; [.14A0.0020.0002.1291] # ETHIOPIC SYLLABLE NU
+1292 ; [.14A1.0020.0002.1292] # ETHIOPIC SYLLABLE NI
+1293 ; [.14A2.0020.0002.1293] # ETHIOPIC SYLLABLE NAA
+1294 ; [.14A3.0020.0002.1294] # ETHIOPIC SYLLABLE NEE
+1295 ; [.14A4.0020.0002.1295] # ETHIOPIC SYLLABLE NE
+1296 ; [.14A5.0020.0002.1296] # ETHIOPIC SYLLABLE NO
+1297 ; [.14A6.0020.0002.1297] # ETHIOPIC SYLLABLE NWA
+1298 ; [.14A7.0020.0002.1298] # ETHIOPIC SYLLABLE NYA
+1299 ; [.14A8.0020.0002.1299] # ETHIOPIC SYLLABLE NYU
+129A ; [.14A9.0020.0002.129A] # ETHIOPIC SYLLABLE NYI
+129B ; [.14AA.0020.0002.129B] # ETHIOPIC SYLLABLE NYAA
+129C ; [.14AB.0020.0002.129C] # ETHIOPIC SYLLABLE NYEE
+129D ; [.14AC.0020.0002.129D] # ETHIOPIC SYLLABLE NYE
+129E ; [.14AD.0020.0002.129E] # ETHIOPIC SYLLABLE NYO
+129F ; [.14AE.0020.0002.129F] # ETHIOPIC SYLLABLE NYWA
+12A0 ; [.14AF.0020.0002.12A0] # ETHIOPIC SYLLABLE GLOTTAL A
+12A1 ; [.14B0.0020.0002.12A1] # ETHIOPIC SYLLABLE GLOTTAL U
+12A2 ; [.14B1.0020.0002.12A2] # ETHIOPIC SYLLABLE GLOTTAL I
+12A3 ; [.14B2.0020.0002.12A3] # ETHIOPIC SYLLABLE GLOTTAL AA
+12A4 ; [.14B3.0020.0002.12A4] # ETHIOPIC SYLLABLE GLOTTAL EE
+12A5 ; [.14B4.0020.0002.12A5] # ETHIOPIC SYLLABLE GLOTTAL E
+12A6 ; [.14B5.0020.0002.12A6] # ETHIOPIC SYLLABLE GLOTTAL O
+12A7 ; [.14B6.0020.0002.12A7] # ETHIOPIC SYLLABLE GLOTTAL WA
+12A8 ; [.14B7.0020.0002.12A8] # ETHIOPIC SYLLABLE KA
+12A9 ; [.14B8.0020.0002.12A9] # ETHIOPIC SYLLABLE KU
+12AA ; [.14B9.0020.0002.12AA] # ETHIOPIC SYLLABLE KI
+12AB ; [.14BA.0020.0002.12AB] # ETHIOPIC SYLLABLE KAA
+12AC ; [.14BB.0020.0002.12AC] # ETHIOPIC SYLLABLE KEE
+12AD ; [.14BC.0020.0002.12AD] # ETHIOPIC SYLLABLE KE
+12AE ; [.14BD.0020.0002.12AE] # ETHIOPIC SYLLABLE KO
+12B0 ; [.14BE.0020.0002.12B0] # ETHIOPIC SYLLABLE KWA
+12B2 ; [.14BF.0020.0002.12B2] # ETHIOPIC SYLLABLE KWI
+12B3 ; [.14C0.0020.0002.12B3] # ETHIOPIC SYLLABLE KWAA
+12B4 ; [.14C1.0020.0002.12B4] # ETHIOPIC SYLLABLE KWEE
+12B5 ; [.14C2.0020.0002.12B5] # ETHIOPIC SYLLABLE KWE
+12B8 ; [.14C3.0020.0002.12B8] # ETHIOPIC SYLLABLE KXA
+12B9 ; [.14C4.0020.0002.12B9] # ETHIOPIC SYLLABLE KXU
+12BA ; [.14C5.0020.0002.12BA] # ETHIOPIC SYLLABLE KXI
+12BB ; [.14C6.0020.0002.12BB] # ETHIOPIC SYLLABLE KXAA
+12BC ; [.14C7.0020.0002.12BC] # ETHIOPIC SYLLABLE KXEE
+12BD ; [.14C8.0020.0002.12BD] # ETHIOPIC SYLLABLE KXE
+12BE ; [.14C9.0020.0002.12BE] # ETHIOPIC SYLLABLE KXO
+12C0 ; [.14CA.0020.0002.12C0] # ETHIOPIC SYLLABLE KXWA
+12C2 ; [.14CB.0020.0002.12C2] # ETHIOPIC SYLLABLE KXWI
+12C3 ; [.14CC.0020.0002.12C3] # ETHIOPIC SYLLABLE KXWAA
+12C4 ; [.14CD.0020.0002.12C4] # ETHIOPIC SYLLABLE KXWEE
+12C5 ; [.14CE.0020.0002.12C5] # ETHIOPIC SYLLABLE KXWE
+12C8 ; [.14CF.0020.0002.12C8] # ETHIOPIC SYLLABLE WA
+12C9 ; [.14D0.0020.0002.12C9] # ETHIOPIC SYLLABLE WU
+12CA ; [.14D1.0020.0002.12CA] # ETHIOPIC SYLLABLE WI
+12CB ; [.14D2.0020.0002.12CB] # ETHIOPIC SYLLABLE WAA
+12CC ; [.14D3.0020.0002.12CC] # ETHIOPIC SYLLABLE WEE
+12CD ; [.14D4.0020.0002.12CD] # ETHIOPIC SYLLABLE WE
+12CE ; [.14D5.0020.0002.12CE] # ETHIOPIC SYLLABLE WO
+12D0 ; [.14D6.0020.0002.12D0] # ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1 ; [.14D7.0020.0002.12D1] # ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2 ; [.14D8.0020.0002.12D2] # ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3 ; [.14D9.0020.0002.12D3] # ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4 ; [.14DA.0020.0002.12D4] # ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5 ; [.14DB.0020.0002.12D5] # ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6 ; [.14DC.0020.0002.12D6] # ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8 ; [.14DD.0020.0002.12D8] # ETHIOPIC SYLLABLE ZA
+12D9 ; [.14DE.0020.0002.12D9] # ETHIOPIC SYLLABLE ZU
+12DA ; [.14DF.0020.0002.12DA] # ETHIOPIC SYLLABLE ZI
+12DB ; [.14E0.0020.0002.12DB] # ETHIOPIC SYLLABLE ZAA
+12DC ; [.14E1.0020.0002.12DC] # ETHIOPIC SYLLABLE ZEE
+12DD ; [.14E2.0020.0002.12DD] # ETHIOPIC SYLLABLE ZE
+12DE ; [.14E3.0020.0002.12DE] # ETHIOPIC SYLLABLE ZO
+12DF ; [.14E4.0020.0002.12DF] # ETHIOPIC SYLLABLE ZWA
+12E0 ; [.14E5.0020.0002.12E0] # ETHIOPIC SYLLABLE ZHA
+12E1 ; [.14E6.0020.0002.12E1] # ETHIOPIC SYLLABLE ZHU
+12E2 ; [.14E7.0020.0002.12E2] # ETHIOPIC SYLLABLE ZHI
+12E3 ; [.14E8.0020.0002.12E3] # ETHIOPIC SYLLABLE ZHAA
+12E4 ; [.14E9.0020.0002.12E4] # ETHIOPIC SYLLABLE ZHEE
+12E5 ; [.14EA.0020.0002.12E5] # ETHIOPIC SYLLABLE ZHE
+12E6 ; [.14EB.0020.0002.12E6] # ETHIOPIC SYLLABLE ZHO
+12E7 ; [.14EC.0020.0002.12E7] # ETHIOPIC SYLLABLE ZHWA
+12E8 ; [.14ED.0020.0002.12E8] # ETHIOPIC SYLLABLE YA
+12E9 ; [.14EE.0020.0002.12E9] # ETHIOPIC SYLLABLE YU
+12EA ; [.14EF.0020.0002.12EA] # ETHIOPIC SYLLABLE YI
+12EB ; [.14F0.0020.0002.12EB] # ETHIOPIC SYLLABLE YAA
+12EC ; [.14F1.0020.0002.12EC] # ETHIOPIC SYLLABLE YEE
+12ED ; [.14F2.0020.0002.12ED] # ETHIOPIC SYLLABLE YE
+12EE ; [.14F3.0020.0002.12EE] # ETHIOPIC SYLLABLE YO
+12F0 ; [.14F4.0020.0002.12F0] # ETHIOPIC SYLLABLE DA
+12F1 ; [.14F5.0020.0002.12F1] # ETHIOPIC SYLLABLE DU
+12F2 ; [.14F6.0020.0002.12F2] # ETHIOPIC SYLLABLE DI
+12F3 ; [.14F7.0020.0002.12F3] # ETHIOPIC SYLLABLE DAA
+12F4 ; [.14F8.0020.0002.12F4] # ETHIOPIC SYLLABLE DEE
+12F5 ; [.14F9.0020.0002.12F5] # ETHIOPIC SYLLABLE DE
+12F6 ; [.14FA.0020.0002.12F6] # ETHIOPIC SYLLABLE DO
+12F7 ; [.14FB.0020.0002.12F7] # ETHIOPIC SYLLABLE DWA
+12F8 ; [.14FC.0020.0002.12F8] # ETHIOPIC SYLLABLE DDA
+12F9 ; [.14FD.0020.0002.12F9] # ETHIOPIC SYLLABLE DDU
+12FA ; [.14FE.0020.0002.12FA] # ETHIOPIC SYLLABLE DDI
+12FB ; [.14FF.0020.0002.12FB] # ETHIOPIC SYLLABLE DDAA
+12FC ; [.1500.0020.0002.12FC] # ETHIOPIC SYLLABLE DDEE
+12FD ; [.1501.0020.0002.12FD] # ETHIOPIC SYLLABLE DDE
+12FE ; [.1502.0020.0002.12FE] # ETHIOPIC SYLLABLE DDO
+12FF ; [.1503.0020.0002.12FF] # ETHIOPIC SYLLABLE DDWA
+1300 ; [.1504.0020.0002.1300] # ETHIOPIC SYLLABLE JA
+1301 ; [.1505.0020.0002.1301] # ETHIOPIC SYLLABLE JU
+1302 ; [.1506.0020.0002.1302] # ETHIOPIC SYLLABLE JI
+1303 ; [.1507.0020.0002.1303] # ETHIOPIC SYLLABLE JAA
+1304 ; [.1508.0020.0002.1304] # ETHIOPIC SYLLABLE JEE
+1305 ; [.1509.0020.0002.1305] # ETHIOPIC SYLLABLE JE
+1306 ; [.150A.0020.0002.1306] # ETHIOPIC SYLLABLE JO
+1307 ; [.150B.0020.0002.1307] # ETHIOPIC SYLLABLE JWA
+1308 ; [.150C.0020.0002.1308] # ETHIOPIC SYLLABLE GA
+1309 ; [.150D.0020.0002.1309] # ETHIOPIC SYLLABLE GU
+130A ; [.150E.0020.0002.130A] # ETHIOPIC SYLLABLE GI
+130B ; [.150F.0020.0002.130B] # ETHIOPIC SYLLABLE GAA
+130C ; [.1510.0020.0002.130C] # ETHIOPIC SYLLABLE GEE
+130D ; [.1511.0020.0002.130D] # ETHIOPIC SYLLABLE GE
+130E ; [.1512.0020.0002.130E] # ETHIOPIC SYLLABLE GO
+1310 ; [.1513.0020.0002.1310] # ETHIOPIC SYLLABLE GWA
+1312 ; [.1514.0020.0002.1312] # ETHIOPIC SYLLABLE GWI
+1313 ; [.1515.0020.0002.1313] # ETHIOPIC SYLLABLE GWAA
+1314 ; [.1516.0020.0002.1314] # ETHIOPIC SYLLABLE GWEE
+1315 ; [.1517.0020.0002.1315] # ETHIOPIC SYLLABLE GWE
+1318 ; [.1518.0020.0002.1318] # ETHIOPIC SYLLABLE GGA
+1319 ; [.1519.0020.0002.1319] # ETHIOPIC SYLLABLE GGU
+131A ; [.151A.0020.0002.131A] # ETHIOPIC SYLLABLE GGI
+131B ; [.151B.0020.0002.131B] # ETHIOPIC SYLLABLE GGAA
+131C ; [.151C.0020.0002.131C] # ETHIOPIC SYLLABLE GGEE
+131D ; [.151D.0020.0002.131D] # ETHIOPIC SYLLABLE GGE
+131E ; [.151E.0020.0002.131E] # ETHIOPIC SYLLABLE GGO
+1320 ; [.151F.0020.0002.1320] # ETHIOPIC SYLLABLE THA
+1321 ; [.1520.0020.0002.1321] # ETHIOPIC SYLLABLE THU
+1322 ; [.1521.0020.0002.1322] # ETHIOPIC SYLLABLE THI
+1323 ; [.1522.0020.0002.1323] # ETHIOPIC SYLLABLE THAA
+1324 ; [.1523.0020.0002.1324] # ETHIOPIC SYLLABLE THEE
+1325 ; [.1524.0020.0002.1325] # ETHIOPIC SYLLABLE THE
+1326 ; [.1525.0020.0002.1326] # ETHIOPIC SYLLABLE THO
+1327 ; [.1526.0020.0002.1327] # ETHIOPIC SYLLABLE THWA
+1328 ; [.1527.0020.0002.1328] # ETHIOPIC SYLLABLE CHA
+1329 ; [.1528.0020.0002.1329] # ETHIOPIC SYLLABLE CHU
+132A ; [.1529.0020.0002.132A] # ETHIOPIC SYLLABLE CHI
+132B ; [.152A.0020.0002.132B] # ETHIOPIC SYLLABLE CHAA
+132C ; [.152B.0020.0002.132C] # ETHIOPIC SYLLABLE CHEE
+132D ; [.152C.0020.0002.132D] # ETHIOPIC SYLLABLE CHE
+132E ; [.152D.0020.0002.132E] # ETHIOPIC SYLLABLE CHO
+132F ; [.152E.0020.0002.132F] # ETHIOPIC SYLLABLE CHWA
+1330 ; [.152F.0020.0002.1330] # ETHIOPIC SYLLABLE PHA
+1331 ; [.1530.0020.0002.1331] # ETHIOPIC SYLLABLE PHU
+1332 ; [.1531.0020.0002.1332] # ETHIOPIC SYLLABLE PHI
+1333 ; [.1532.0020.0002.1333] # ETHIOPIC SYLLABLE PHAA
+1334 ; [.1533.0020.0002.1334] # ETHIOPIC SYLLABLE PHEE
+1335 ; [.1534.0020.0002.1335] # ETHIOPIC SYLLABLE PHE
+1336 ; [.1535.0020.0002.1336] # ETHIOPIC SYLLABLE PHO
+1337 ; [.1536.0020.0002.1337] # ETHIOPIC SYLLABLE PHWA
+1338 ; [.1537.0020.0002.1338] # ETHIOPIC SYLLABLE TSA
+1339 ; [.1538.0020.0002.1339] # ETHIOPIC SYLLABLE TSU
+133A ; [.1539.0020.0002.133A] # ETHIOPIC SYLLABLE TSI
+133B ; [.153A.0020.0002.133B] # ETHIOPIC SYLLABLE TSAA
+133C ; [.153B.0020.0002.133C] # ETHIOPIC SYLLABLE TSEE
+133D ; [.153C.0020.0002.133D] # ETHIOPIC SYLLABLE TSE
+133E ; [.153D.0020.0002.133E] # ETHIOPIC SYLLABLE TSO
+133F ; [.153E.0020.0002.133F] # ETHIOPIC SYLLABLE TSWA
+1340 ; [.153F.0020.0002.1340] # ETHIOPIC SYLLABLE TZA
+1341 ; [.1540.0020.0002.1341] # ETHIOPIC SYLLABLE TZU
+1342 ; [.1541.0020.0002.1342] # ETHIOPIC SYLLABLE TZI
+1343 ; [.1542.0020.0002.1343] # ETHIOPIC SYLLABLE TZAA
+1344 ; [.1543.0020.0002.1344] # ETHIOPIC SYLLABLE TZEE
+1345 ; [.1544.0020.0002.1345] # ETHIOPIC SYLLABLE TZE
+1346 ; [.1545.0020.0002.1346] # ETHIOPIC SYLLABLE TZO
+1348 ; [.1546.0020.0002.1348] # ETHIOPIC SYLLABLE FA
+1349 ; [.1547.0020.0002.1349] # ETHIOPIC SYLLABLE FU
+134A ; [.1548.0020.0002.134A] # ETHIOPIC SYLLABLE FI
+134B ; [.1549.0020.0002.134B] # ETHIOPIC SYLLABLE FAA
+134C ; [.154A.0020.0002.134C] # ETHIOPIC SYLLABLE FEE
+134D ; [.154B.0020.0002.134D] # ETHIOPIC SYLLABLE FE
+134E ; [.154C.0020.0002.134E] # ETHIOPIC SYLLABLE FO
+134F ; [.154D.0020.0002.134F] # ETHIOPIC SYLLABLE FWA
+1350 ; [.154E.0020.0002.1350] # ETHIOPIC SYLLABLE PA
+1351 ; [.154F.0020.0002.1351] # ETHIOPIC SYLLABLE PU
+1352 ; [.1550.0020.0002.1352] # ETHIOPIC SYLLABLE PI
+1353 ; [.1551.0020.0002.1353] # ETHIOPIC SYLLABLE PAA
+1354 ; [.1552.0020.0002.1354] # ETHIOPIC SYLLABLE PEE
+1355 ; [.1553.0020.0002.1355] # ETHIOPIC SYLLABLE PE
+1356 ; [.1554.0020.0002.1356] # ETHIOPIC SYLLABLE PO
+1357 ; [.1555.0020.0002.1357] # ETHIOPIC SYLLABLE PWA
+1358 ; [.1556.0020.0002.1358] # ETHIOPIC SYLLABLE RYA
+1359 ; [.1557.0020.0002.1359] # ETHIOPIC SYLLABLE MYA
+135A ; [.1558.0020.0002.135A] # ETHIOPIC SYLLABLE FYA
+0950 ; [.1559.0020.0002.0950] # DEVANAGARI OM
+0904 ; [.155A.0020.0002.0904] # DEVANAGARI LETTER SHORT A
+0905 ; [.155B.0020.0002.0905] # DEVANAGARI LETTER A
+0906 ; [.155C.0020.0002.0906] # DEVANAGARI LETTER AA
+0907 ; [.155D.0020.0002.0907] # DEVANAGARI LETTER I
+0908 ; [.155E.0020.0002.0908] # DEVANAGARI LETTER II
+0909 ; [.155F.0020.0002.0909] # DEVANAGARI LETTER U
+090A ; [.1560.0020.0002.090A] # DEVANAGARI LETTER UU
+090B ; [.1561.0020.0002.090B] # DEVANAGARI LETTER VOCALIC R
+0960 ; [.1562.0020.0002.0960] # DEVANAGARI LETTER VOCALIC RR
+090C ; [.1563.0020.0002.090C] # DEVANAGARI LETTER VOCALIC L
+0961 ; [.1564.0020.0002.0961] # DEVANAGARI LETTER VOCALIC LL
+090D ; [.1565.0020.0002.090D] # DEVANAGARI LETTER CANDRA E
+090E ; [.1566.0020.0002.090E] # DEVANAGARI LETTER SHORT E
+090F ; [.1567.0020.0002.090F] # DEVANAGARI LETTER E
+0910 ; [.1568.0020.0002.0910] # DEVANAGARI LETTER AI
+0911 ; [.1569.0020.0002.0911] # DEVANAGARI LETTER CANDRA O
+0912 ; [.156A.0020.0002.0912] # DEVANAGARI LETTER SHORT O
+0913 ; [.156B.0020.0002.0913] # DEVANAGARI LETTER O
+0914 ; [.156C.0020.0002.0914] # DEVANAGARI LETTER AU
+0915 ; [.156D.0020.0002.0915] # DEVANAGARI LETTER KA
+0958 ; [.156D.0020.0002.0915][.0000.00F5.0002.093C] # DEVANAGARI LETTER QA; QQCM
+0916 ; [.156E.0020.0002.0916] # DEVANAGARI LETTER KHA
+0959 ; [.156E.0020.0002.0916][.0000.00F5.0002.093C] # DEVANAGARI LETTER KHHA; QQCM
+0917 ; [.156F.0020.0002.0917] # DEVANAGARI LETTER GA
+095A ; [.156F.0020.0002.0917][.0000.00F5.0002.093C] # DEVANAGARI LETTER GHHA; QQCM
+0918 ; [.1570.0020.0002.0918] # DEVANAGARI LETTER GHA
+0919 ; [.1571.0020.0002.0919] # DEVANAGARI LETTER NGA
+091A ; [.1572.0020.0002.091A] # DEVANAGARI LETTER CA
+091B ; [.1573.0020.0002.091B] # DEVANAGARI LETTER CHA
+091C ; [.1574.0020.0002.091C] # DEVANAGARI LETTER JA
+095B ; [.1574.0020.0002.091C][.0000.00F5.0002.093C] # DEVANAGARI LETTER ZA; QQCM
+091D ; [.1575.0020.0002.091D] # DEVANAGARI LETTER JHA
+091E ; [.1576.0020.0002.091E] # DEVANAGARI LETTER NYA
+091F ; [.1577.0020.0002.091F] # DEVANAGARI LETTER TTA
+0920 ; [.1578.0020.0002.0920] # DEVANAGARI LETTER TTHA
+0921 ; [.1579.0020.0002.0921] # DEVANAGARI LETTER DDA
+095C ; [.1579.0020.0002.0921][.0000.00F5.0002.093C] # DEVANAGARI LETTER DDDHA; QQCM
+0922 ; [.157A.0020.0002.0922] # DEVANAGARI LETTER DDHA
+095D ; [.157A.0020.0002.0922][.0000.00F5.0002.093C] # DEVANAGARI LETTER RHA; QQCM
+0923 ; [.157B.0020.0002.0923] # DEVANAGARI LETTER NNA
+0924 ; [.157C.0020.0002.0924] # DEVANAGARI LETTER TA
+0925 ; [.157D.0020.0002.0925] # DEVANAGARI LETTER THA
+0926 ; [.157E.0020.0002.0926] # DEVANAGARI LETTER DA
+0927 ; [.157F.0020.0002.0927] # DEVANAGARI LETTER DHA
+0928 ; [.1580.0020.0002.0928] # DEVANAGARI LETTER NA
+0929 ; [.1580.0020.0002.0928][.0000.00F5.0002.093C] # DEVANAGARI LETTER NNNA; QQCM
+092A ; [.1581.0020.0002.092A] # DEVANAGARI LETTER PA
+092B ; [.1582.0020.0002.092B] # DEVANAGARI LETTER PHA
+095E ; [.1582.0020.0002.092B][.0000.00F5.0002.093C] # DEVANAGARI LETTER FA; QQCM
+092C ; [.1583.0020.0002.092C] # DEVANAGARI LETTER BA
+092D ; [.1584.0020.0002.092D] # DEVANAGARI LETTER BHA
+092E ; [.1585.0020.0002.092E] # DEVANAGARI LETTER MA
+092F ; [.1586.0020.0002.092F] # DEVANAGARI LETTER YA
+095F ; [.1586.0020.0002.092F][.0000.00F5.0002.093C] # DEVANAGARI LETTER YYA; QQCM
+0930 ; [.1587.0020.0002.0930] # DEVANAGARI LETTER RA
+0931 ; [.1587.0020.0002.0930][.0000.00F5.0002.093C] # DEVANAGARI LETTER RRA; QQCM
+0932 ; [.1588.0020.0002.0932] # DEVANAGARI LETTER LA
+0933 ; [.1589.0020.0002.0933] # DEVANAGARI LETTER LLA
+0934 ; [.1589.0020.0002.0933][.0000.00F5.0002.093C] # DEVANAGARI LETTER LLLA; QQCM
+0935 ; [.158A.0020.0002.0935] # DEVANAGARI LETTER VA
+0936 ; [.158B.0020.0002.0936] # DEVANAGARI LETTER SHA
+0937 ; [.158C.0020.0002.0937] # DEVANAGARI LETTER SSA
+0938 ; [.158D.0020.0002.0938] # DEVANAGARI LETTER SA
+0939 ; [.158E.0020.0002.0939] # DEVANAGARI LETTER HA
+093D ; [.158F.0020.0002.093D] # DEVANAGARI SIGN AVAGRAHA
+093E ; [.1590.0020.0002.093E] # DEVANAGARI VOWEL SIGN AA
+093F ; [.1591.0020.0002.093F] # DEVANAGARI VOWEL SIGN I
+0940 ; [.1592.0020.0002.0940] # DEVANAGARI VOWEL SIGN II
+0941 ; [.1593.0020.0002.0941] # DEVANAGARI VOWEL SIGN U
+0942 ; [.1594.0020.0002.0942] # DEVANAGARI VOWEL SIGN UU
+0943 ; [.1595.0020.0002.0943] # DEVANAGARI VOWEL SIGN VOCALIC R
+0944 ; [.1596.0020.0002.0944] # DEVANAGARI VOWEL SIGN VOCALIC RR
+0962 ; [.1597.0020.0002.0962] # DEVANAGARI VOWEL SIGN VOCALIC L
+0963 ; [.1598.0020.0002.0963] # DEVANAGARI VOWEL SIGN VOCALIC LL
+0945 ; [.1599.0020.0002.0945] # DEVANAGARI VOWEL SIGN CANDRA E
+0946 ; [.159A.0020.0002.0946] # DEVANAGARI VOWEL SIGN SHORT E
+0947 ; [.159B.0020.0002.0947] # DEVANAGARI VOWEL SIGN E
+0948 ; [.159C.0020.0002.0948] # DEVANAGARI VOWEL SIGN AI
+0949 ; [.159D.0020.0002.0949] # DEVANAGARI VOWEL SIGN CANDRA O
+094A ; [.159E.0020.0002.094A] # DEVANAGARI VOWEL SIGN SHORT O
+094B ; [.159F.0020.0002.094B] # DEVANAGARI VOWEL SIGN O
+094C ; [.15A0.0020.0002.094C] # DEVANAGARI VOWEL SIGN AU
+094D ; [.15A1.0020.0002.094D] # DEVANAGARI SIGN VIRAMA
+0985 ; [.15A2.0020.0002.0985] # BENGALI LETTER A
+0986 ; [.15A3.0020.0002.0986] # BENGALI LETTER AA
+0987 ; [.15A4.0020.0002.0987] # BENGALI LETTER I
+0988 ; [.15A5.0020.0002.0988] # BENGALI LETTER II
+0989 ; [.15A6.0020.0002.0989] # BENGALI LETTER U
+098A ; [.15A7.0020.0002.098A] # BENGALI LETTER UU
+098B ; [.15A8.0020.0002.098B] # BENGALI LETTER VOCALIC R
+09E0 ; [.15A9.0020.0002.09E0] # BENGALI LETTER VOCALIC RR
+098C ; [.15AA.0020.0002.098C] # BENGALI LETTER VOCALIC L
+09E1 ; [.15AB.0020.0002.09E1] # BENGALI LETTER VOCALIC LL
+098F ; [.15AC.0020.0002.098F] # BENGALI LETTER E
+0990 ; [.15AD.0020.0002.0990] # BENGALI LETTER AI
+0993 ; [.15AE.0020.0002.0993] # BENGALI LETTER O
+0994 ; [.15AF.0020.0002.0994] # BENGALI LETTER AU
+0995 ; [.15B0.0020.0002.0995] # BENGALI LETTER KA
+0996 ; [.15B1.0020.0002.0996] # BENGALI LETTER KHA
+0997 ; [.15B2.0020.0002.0997] # BENGALI LETTER GA
+0998 ; [.15B3.0020.0002.0998] # BENGALI LETTER GHA
+0999 ; [.15B4.0020.0002.0999] # BENGALI LETTER NGA
+099A ; [.15B5.0020.0002.099A] # BENGALI LETTER CA
+099B ; [.15B6.0020.0002.099B] # BENGALI LETTER CHA
+099C ; [.15B7.0020.0002.099C] # BENGALI LETTER JA
+099D ; [.15B8.0020.0002.099D] # BENGALI LETTER JHA
+099E ; [.15B9.0020.0002.099E] # BENGALI LETTER NYA
+099F ; [.15BA.0020.0002.099F] # BENGALI LETTER TTA
+09A0 ; [.15BB.0020.0002.09A0] # BENGALI LETTER TTHA
+09A1 ; [.15BC.0020.0002.09A1] # BENGALI LETTER DDA
+09DC ; [.15BC.0020.0002.09A1][.0000.00FD.0002.09BC] # BENGALI LETTER RRA; QQCM
+09A2 ; [.15BD.0020.0002.09A2] # BENGALI LETTER DDHA
+09DD ; [.15BD.0020.0002.09A2][.0000.00FD.0002.09BC] # BENGALI LETTER RHA; QQCM
+09A3 ; [.15BE.0020.0002.09A3] # BENGALI LETTER NNA
+09A4 ; [.15BF.0020.0002.09A4] # BENGALI LETTER TA
+09A5 ; [.15C0.0020.0002.09A5] # BENGALI LETTER THA
+09A6 ; [.15C1.0020.0002.09A6] # BENGALI LETTER DA
+09A7 ; [.15C2.0020.0002.09A7] # BENGALI LETTER DHA
+09A8 ; [.15C3.0020.0002.09A8] # BENGALI LETTER NA
+09AA ; [.15C4.0020.0002.09AA] # BENGALI LETTER PA
+09AB ; [.15C5.0020.0002.09AB] # BENGALI LETTER PHA
+09AC ; [.15C6.0020.0002.09AC] # BENGALI LETTER BA
+09AD ; [.15C7.0020.0002.09AD] # BENGALI LETTER BHA
+09AE ; [.15C8.0020.0002.09AE] # BENGALI LETTER MA
+09AF ; [.15C9.0020.0002.09AF] # BENGALI LETTER YA
+09DF ; [.15C9.0020.0002.09AF][.0000.00FD.0002.09BC] # BENGALI LETTER YYA; QQCM
+09B0 ; [.15CA.0020.0002.09B0] # BENGALI LETTER RA
+09F0 ; [.15CB.0020.0002.09F0] # BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09B2 ; [.15CC.0020.0002.09B2] # BENGALI LETTER LA
+09F1 ; [.15CD.0020.0002.09F1] # BENGALI LETTER RA WITH LOWER DIAGONAL
+09B6 ; [.15CE.0020.0002.09B6] # BENGALI LETTER SHA
+09B7 ; [.15CF.0020.0002.09B7] # BENGALI LETTER SSA
+09B8 ; [.15D0.0020.0002.09B8] # BENGALI LETTER SA
+09B9 ; [.15D1.0020.0002.09B9] # BENGALI LETTER HA
+09BD ; [.15D2.0020.0002.09BD] # BENGALI SIGN AVAGRAHA
+09BE ; [.15D3.0020.0002.09BE] # BENGALI VOWEL SIGN AA
+09BF ; [.15D4.0020.0002.09BF] # BENGALI VOWEL SIGN I
+09C0 ; [.15D5.0020.0002.09C0] # BENGALI VOWEL SIGN II
+09C1 ; [.15D6.0020.0002.09C1] # BENGALI VOWEL SIGN U
+09C2 ; [.15D7.0020.0002.09C2] # BENGALI VOWEL SIGN UU
+09C3 ; [.15D8.0020.0002.09C3] # BENGALI VOWEL SIGN VOCALIC R
+09C4 ; [.15D9.0020.0002.09C4] # BENGALI VOWEL SIGN VOCALIC RR
+09E2 ; [.15DA.0020.0002.09E2] # BENGALI VOWEL SIGN VOCALIC L
+09E3 ; [.15DB.0020.0002.09E3] # BENGALI VOWEL SIGN VOCALIC LL
+09C7 ; [.15DC.0020.0002.09C7] # BENGALI VOWEL SIGN E
+09C8 ; [.15DD.0020.0002.09C8] # BENGALI VOWEL SIGN AI
+09CB ; [.15DE.0020.0002.09CB] # BENGALI VOWEL SIGN O
+09C7 09BE ; [.15DE.0020.0002.09CB] # BENGALI VOWEL SIGN O
+09CC ; [.15DF.0020.0002.09CC] # BENGALI VOWEL SIGN AU
+09C7 09D7 ; [.15DF.0020.0002.09CC] # BENGALI VOWEL SIGN AU
+09CD ; [.15E0.0020.0002.09CD] # BENGALI SIGN VIRAMA
+09D7 ; [.15E1.0020.0002.09D7] # BENGALI AU LENGTH MARK
+0A74 ; [.15E2.0020.0002.0A74] # GURMUKHI EK ONKAR
+0A73 ; [.15E3.0020.0002.0A73] # GURMUKHI URA
+0A09 ; [.15E4.0020.0002.0A09] # GURMUKHI LETTER U
+0A0A ; [.15E5.0020.0002.0A0A] # GURMUKHI LETTER UU
+0A13 ; [.15E6.0020.0002.0A13] # GURMUKHI LETTER OO
+0A05 ; [.15E7.0020.0002.0A05] # GURMUKHI LETTER A
+0A06 ; [.15E8.0020.0002.0A06] # GURMUKHI LETTER AA
+0A10 ; [.15E9.0020.0002.0A10] # GURMUKHI LETTER AI
+0A14 ; [.15EA.0020.0002.0A14] # GURMUKHI LETTER AU
+0A72 ; [.15EB.0020.0002.0A72] # GURMUKHI IRI
+0A07 ; [.15EC.0020.0002.0A07] # GURMUKHI LETTER I
+0A08 ; [.15ED.0020.0002.0A08] # GURMUKHI LETTER II
+0A0F ; [.15EE.0020.0002.0A0F] # GURMUKHI LETTER EE
+0A38 ; [.15EF.0020.0002.0A38] # GURMUKHI LETTER SA
+0A36 ; [.15EF.0020.0002.0A38][.0000.0101.0002.0A3C] # GURMUKHI LETTER SHA; QQCM
+0A39 ; [.15F0.0020.0002.0A39] # GURMUKHI LETTER HA
+0A15 ; [.15F1.0020.0002.0A15] # GURMUKHI LETTER KA
+0A16 ; [.15F2.0020.0002.0A16] # GURMUKHI LETTER KHA
+0A59 ; [.15F2.0020.0002.0A16][.0000.0101.0002.0A3C] # GURMUKHI LETTER KHHA; QQCM
+0A17 ; [.15F3.0020.0002.0A17] # GURMUKHI LETTER GA
+0A5A ; [.15F3.0020.0002.0A17][.0000.0101.0002.0A3C] # GURMUKHI LETTER GHHA; QQCM
+0A18 ; [.15F4.0020.0002.0A18] # GURMUKHI LETTER GHA
+0A19 ; [.15F5.0020.0002.0A19] # GURMUKHI LETTER NGA
+0A1A ; [.15F6.0020.0002.0A1A] # GURMUKHI LETTER CA
+0A1B ; [.15F7.0020.0002.0A1B] # GURMUKHI LETTER CHA
+0A1C ; [.15F8.0020.0002.0A1C] # GURMUKHI LETTER JA
+0A5B ; [.15F8.0020.0002.0A1C][.0000.0101.0002.0A3C] # GURMUKHI LETTER ZA; QQCM
+0A1D ; [.15F9.0020.0002.0A1D] # GURMUKHI LETTER JHA
+0A1E ; [.15FA.0020.0002.0A1E] # GURMUKHI LETTER NYA
+0A1F ; [.15FB.0020.0002.0A1F] # GURMUKHI LETTER TTA
+0A20 ; [.15FC.0020.0002.0A20] # GURMUKHI LETTER TTHA
+0A21 ; [.15FD.0020.0002.0A21] # GURMUKHI LETTER DDA
+0A22 ; [.15FE.0020.0002.0A22] # GURMUKHI LETTER DDHA
+0A23 ; [.15FF.0020.0002.0A23] # GURMUKHI LETTER NNA
+0A24 ; [.1600.0020.0002.0A24] # GURMUKHI LETTER TA
+0A25 ; [.1601.0020.0002.0A25] # GURMUKHI LETTER THA
+0A26 ; [.1602.0020.0002.0A26] # GURMUKHI LETTER DA
+0A27 ; [.1603.0020.0002.0A27] # GURMUKHI LETTER DHA
+0A28 ; [.1604.0020.0002.0A28] # GURMUKHI LETTER NA
+0A2A ; [.1605.0020.0002.0A2A] # GURMUKHI LETTER PA
+0A2B ; [.1606.0020.0002.0A2B] # GURMUKHI LETTER PHA
+0A5E ; [.1606.0020.0002.0A2B][.0000.0101.0002.0A3C] # GURMUKHI LETTER FA; QQCM
+0A2C ; [.1607.0020.0002.0A2C] # GURMUKHI LETTER BA
+0A2D ; [.1608.0020.0002.0A2D] # GURMUKHI LETTER BHA
+0A2E ; [.1609.0020.0002.0A2E] # GURMUKHI LETTER MA
+0A2F ; [.160A.0020.0002.0A2F] # GURMUKHI LETTER YA
+0A30 ; [.160B.0020.0002.0A30] # GURMUKHI LETTER RA
+0A32 ; [.160C.0020.0002.0A32] # GURMUKHI LETTER LA
+0A33 ; [.160C.0020.0002.0A32][.0000.0101.0002.0A3C] # GURMUKHI LETTER LLA; QQCM
+0A35 ; [.160D.0020.0002.0A35] # GURMUKHI LETTER VA
+0A5C ; [.160E.0020.0002.0A5C] # GURMUKHI LETTER RRA
+0A3E ; [.160F.0020.0002.0A3E] # GURMUKHI VOWEL SIGN AA
+0A3F ; [.1610.0020.0002.0A3F] # GURMUKHI VOWEL SIGN I
+0A40 ; [.1611.0020.0002.0A40] # GURMUKHI VOWEL SIGN II
+0A41 ; [.1612.0020.0002.0A41] # GURMUKHI VOWEL SIGN U
+0A42 ; [.1613.0020.0002.0A42] # GURMUKHI VOWEL SIGN UU
+0A47 ; [.1614.0020.0002.0A47] # GURMUKHI VOWEL SIGN EE
+0A48 ; [.1615.0020.0002.0A48] # GURMUKHI VOWEL SIGN AI
+0A4B ; [.1616.0020.0002.0A4B] # GURMUKHI VOWEL SIGN OO
+0A4C ; [.1617.0020.0002.0A4C] # GURMUKHI VOWEL SIGN AU
+0A4D ; [.1618.0020.0002.0A4D] # GURMUKHI SIGN VIRAMA
+0AD0 ; [.1619.0020.0002.0AD0] # GUJARATI OM
+0A85 ; [.161A.0020.0002.0A85] # GUJARATI LETTER A
+0A86 ; [.161B.0020.0002.0A86] # GUJARATI LETTER AA
+0A87 ; [.161C.0020.0002.0A87] # GUJARATI LETTER I
+0A88 ; [.161D.0020.0002.0A88] # GUJARATI LETTER II
+0A89 ; [.161E.0020.0002.0A89] # GUJARATI LETTER U
+0A8A ; [.161F.0020.0002.0A8A] # GUJARATI LETTER UU
+0A8B ; [.1620.0020.0002.0A8B] # GUJARATI LETTER VOCALIC R
+0AE0 ; [.1621.0020.0002.0AE0] # GUJARATI LETTER VOCALIC RR
+0A8C ; [.1622.0020.0002.0A8C] # GUJARATI LETTER VOCALIC L
+0AE1 ; [.1623.0020.0002.0AE1] # GUJARATI LETTER VOCALIC LL
+0A8D ; [.1624.0020.0002.0A8D] # GUJARATI VOWEL CANDRA E
+0A8F ; [.1625.0020.0002.0A8F] # GUJARATI LETTER E
+0A90 ; [.1626.0020.0002.0A90] # GUJARATI LETTER AI
+0A91 ; [.1627.0020.0002.0A91] # GUJARATI VOWEL CANDRA O
+0A93 ; [.1628.0020.0002.0A93] # GUJARATI LETTER O
+0A94 ; [.1629.0020.0002.0A94] # GUJARATI LETTER AU
+0A95 ; [.162A.0020.0002.0A95] # GUJARATI LETTER KA
+0A96 ; [.162B.0020.0002.0A96] # GUJARATI LETTER KHA
+0A97 ; [.162C.0020.0002.0A97] # GUJARATI LETTER GA
+0A98 ; [.162D.0020.0002.0A98] # GUJARATI LETTER GHA
+0A99 ; [.162E.0020.0002.0A99] # GUJARATI LETTER NGA
+0A9A ; [.162F.0020.0002.0A9A] # GUJARATI LETTER CA
+0A9B ; [.1630.0020.0002.0A9B] # GUJARATI LETTER CHA
+0A9C ; [.1631.0020.0002.0A9C] # GUJARATI LETTER JA
+0A9D ; [.1632.0020.0002.0A9D] # GUJARATI LETTER JHA
+0A9E ; [.1633.0020.0002.0A9E] # GUJARATI LETTER NYA
+0A9F ; [.1634.0020.0002.0A9F] # GUJARATI LETTER TTA
+0AA0 ; [.1635.0020.0002.0AA0] # GUJARATI LETTER TTHA
+0AA1 ; [.1636.0020.0002.0AA1] # GUJARATI LETTER DDA
+0AA2 ; [.1637.0020.0002.0AA2] # GUJARATI LETTER DDHA
+0AA3 ; [.1638.0020.0002.0AA3] # GUJARATI LETTER NNA
+0AA4 ; [.1639.0020.0002.0AA4] # GUJARATI LETTER TA
+0AA5 ; [.163A.0020.0002.0AA5] # GUJARATI LETTER THA
+0AA6 ; [.163B.0020.0002.0AA6] # GUJARATI LETTER DA
+0AA7 ; [.163C.0020.0002.0AA7] # GUJARATI LETTER DHA
+0AA8 ; [.163D.0020.0002.0AA8] # GUJARATI LETTER NA
+0AAA ; [.163E.0020.0002.0AAA] # GUJARATI LETTER PA
+0AAB ; [.163F.0020.0002.0AAB] # GUJARATI LETTER PHA
+0AAC ; [.1640.0020.0002.0AAC] # GUJARATI LETTER BA
+0AAD ; [.1641.0020.0002.0AAD] # GUJARATI LETTER BHA
+0AAE ; [.1642.0020.0002.0AAE] # GUJARATI LETTER MA
+0AAF ; [.1643.0020.0002.0AAF] # GUJARATI LETTER YA
+0AB0 ; [.1644.0020.0002.0AB0] # GUJARATI LETTER RA
+0AB2 ; [.1645.0020.0002.0AB2] # GUJARATI LETTER LA
+0AB3 ; [.1646.0020.0002.0AB3] # GUJARATI LETTER LLA
+0AB5 ; [.1647.0020.0002.0AB5] # GUJARATI LETTER VA
+0AB6 ; [.1648.0020.0002.0AB6] # GUJARATI LETTER SHA
+0AB7 ; [.1649.0020.0002.0AB7] # GUJARATI LETTER SSA
+0AB8 ; [.164A.0020.0002.0AB8] # GUJARATI LETTER SA
+0AB9 ; [.164B.0020.0002.0AB9] # GUJARATI LETTER HA
+0ABD ; [.164C.0020.0002.0ABD] # GUJARATI SIGN AVAGRAHA
+0ABE ; [.164D.0020.0002.0ABE] # GUJARATI VOWEL SIGN AA
+0ABF ; [.164E.0020.0002.0ABF] # GUJARATI VOWEL SIGN I
+0AC0 ; [.164F.0020.0002.0AC0] # GUJARATI VOWEL SIGN II
+0AC1 ; [.1650.0020.0002.0AC1] # GUJARATI VOWEL SIGN U
+0AC2 ; [.1651.0020.0002.0AC2] # GUJARATI VOWEL SIGN UU
+0AC3 ; [.1652.0020.0002.0AC3] # GUJARATI VOWEL SIGN VOCALIC R
+0AC4 ; [.1653.0020.0002.0AC4] # GUJARATI VOWEL SIGN VOCALIC RR
+0AE2 ; [.1654.0020.0002.0AE2] # GUJARATI VOWEL SIGN VOCALIC L
+0AE3 ; [.1655.0020.0002.0AE3] # GUJARATI VOWEL SIGN VOCALIC LL
+0AC5 ; [.1656.0020.0002.0AC5] # GUJARATI VOWEL SIGN CANDRA E
+0AC7 ; [.1657.0020.0002.0AC7] # GUJARATI VOWEL SIGN E
+0AC8 ; [.1658.0020.0002.0AC8] # GUJARATI VOWEL SIGN AI
+0AC9 ; [.1659.0020.0002.0AC9] # GUJARATI VOWEL SIGN CANDRA O
+0ACB ; [.165A.0020.0002.0ACB] # GUJARATI VOWEL SIGN O
+0ACC ; [.165B.0020.0002.0ACC] # GUJARATI VOWEL SIGN AU
+0ACD ; [.165C.0020.0002.0ACD] # GUJARATI SIGN VIRAMA
+0B05 ; [.165D.0020.0002.0B05] # ORIYA LETTER A
+0B06 ; [.165E.0020.0002.0B06] # ORIYA LETTER AA
+0B07 ; [.165F.0020.0002.0B07] # ORIYA LETTER I
+0B08 ; [.1660.0020.0002.0B08] # ORIYA LETTER II
+0B09 ; [.1661.0020.0002.0B09] # ORIYA LETTER U
+0B0A ; [.1662.0020.0002.0B0A] # ORIYA LETTER UU
+0B0B ; [.1663.0020.0002.0B0B] # ORIYA LETTER VOCALIC R
+0B60 ; [.1664.0020.0002.0B60] # ORIYA LETTER VOCALIC RR
+0B0C ; [.1665.0020.0002.0B0C] # ORIYA LETTER VOCALIC L
+0B61 ; [.1666.0020.0002.0B61] # ORIYA LETTER VOCALIC LL
+0B0F ; [.1667.0020.0002.0B0F] # ORIYA LETTER E
+0B10 ; [.1668.0020.0002.0B10] # ORIYA LETTER AI
+0B13 ; [.1669.0020.0002.0B13] # ORIYA LETTER O
+0B14 ; [.166A.0020.0002.0B14] # ORIYA LETTER AU
+0B15 ; [.166B.0020.0002.0B15] # ORIYA LETTER KA
+0B16 ; [.166C.0020.0002.0B16] # ORIYA LETTER KHA
+0B17 ; [.166D.0020.0002.0B17] # ORIYA LETTER GA
+0B18 ; [.166E.0020.0002.0B18] # ORIYA LETTER GHA
+0B19 ; [.166F.0020.0002.0B19] # ORIYA LETTER NGA
+0B1A ; [.1670.0020.0002.0B1A] # ORIYA LETTER CA
+0B1B ; [.1671.0020.0002.0B1B] # ORIYA LETTER CHA
+0B1C ; [.1672.0020.0002.0B1C] # ORIYA LETTER JA
+0B1D ; [.1673.0020.0002.0B1D] # ORIYA LETTER JHA
+0B1E ; [.1674.0020.0002.0B1E] # ORIYA LETTER NYA
+0B1F ; [.1675.0020.0002.0B1F] # ORIYA LETTER TTA
+0B20 ; [.1676.0020.0002.0B20] # ORIYA LETTER TTHA
+0B21 ; [.1677.0020.0002.0B21] # ORIYA LETTER DDA
+0B5C ; [.1677.0020.0002.0B21][.0000.010B.0002.0B3C] # ORIYA LETTER RRA; QQCM
+0B22 ; [.1678.0020.0002.0B22] # ORIYA LETTER DDHA
+0B5D ; [.1678.0020.0002.0B22][.0000.010B.0002.0B3C] # ORIYA LETTER RHA; QQCM
+0B23 ; [.1679.0020.0002.0B23] # ORIYA LETTER NNA
+0B24 ; [.167A.0020.0002.0B24] # ORIYA LETTER TA
+0B25 ; [.167B.0020.0002.0B25] # ORIYA LETTER THA
+0B26 ; [.167C.0020.0002.0B26] # ORIYA LETTER DA
+0B27 ; [.167D.0020.0002.0B27] # ORIYA LETTER DHA
+0B28 ; [.167E.0020.0002.0B28] # ORIYA LETTER NA
+0B2A ; [.167F.0020.0002.0B2A] # ORIYA LETTER PA
+0B2B ; [.1680.0020.0002.0B2B] # ORIYA LETTER PHA
+0B2C ; [.1681.0020.0002.0B2C] # ORIYA LETTER BA
+0B2D ; [.1682.0020.0002.0B2D] # ORIYA LETTER BHA
+0B2E ; [.1683.0020.0002.0B2E] # ORIYA LETTER MA
+0B2F ; [.1684.0020.0002.0B2F] # ORIYA LETTER YA
+0B5F ; [.1685.0020.0002.0B5F] # ORIYA LETTER YYA
+0B30 ; [.1686.0020.0002.0B30] # ORIYA LETTER RA
+0B32 ; [.1687.0020.0002.0B32] # ORIYA LETTER LA
+0B33 ; [.1688.0020.0002.0B33] # ORIYA LETTER LLA
+0B35 ; [.1689.0020.0002.0B35] # ORIYA LETTER VA
+0B71 ; [.168A.0020.0002.0B71] # ORIYA LETTER WA
+0B36 ; [.168B.0020.0002.0B36] # ORIYA LETTER SHA
+0B37 ; [.168C.0020.0002.0B37] # ORIYA LETTER SSA
+0B38 ; [.168D.0020.0002.0B38] # ORIYA LETTER SA
+0B39 ; [.168E.0020.0002.0B39] # ORIYA LETTER HA
+0B3D ; [.168F.0020.0002.0B3D] # ORIYA SIGN AVAGRAHA
+0B3E ; [.1690.0020.0002.0B3E] # ORIYA VOWEL SIGN AA
+0B3F ; [.1691.0020.0002.0B3F] # ORIYA VOWEL SIGN I
+0B40 ; [.1692.0020.0002.0B40] # ORIYA VOWEL SIGN II
+0B41 ; [.1693.0020.0002.0B41] # ORIYA VOWEL SIGN U
+0B42 ; [.1694.0020.0002.0B42] # ORIYA VOWEL SIGN UU
+0B43 ; [.1695.0020.0002.0B43] # ORIYA VOWEL SIGN VOCALIC R
+0B47 ; [.1696.0020.0002.0B47] # ORIYA VOWEL SIGN E
+0B48 ; [.1697.0020.0002.0B48] # ORIYA VOWEL SIGN AI
+0B47 0B56 ; [.1697.0020.0002.0B48] # ORIYA VOWEL SIGN AI
+0B4B ; [.1698.0020.0002.0B4B] # ORIYA VOWEL SIGN O
+0B47 0B3E ; [.1698.0020.0002.0B4B] # ORIYA VOWEL SIGN O
+0B4C ; [.1699.0020.0002.0B4C] # ORIYA VOWEL SIGN AU
+0B47 0B57 ; [.1699.0020.0002.0B4C] # ORIYA VOWEL SIGN AU
+0B4D ; [.169A.0020.0002.0B4D] # ORIYA SIGN VIRAMA
+0B56 ; [.169B.0020.0002.0B56] # ORIYA AI LENGTH MARK
+0B57 ; [.169C.0020.0002.0B57] # ORIYA AU LENGTH MARK
+0B83 ; [.169D.0020.0002.0B83] # TAMIL SIGN VISARGA
+0B85 ; [.169E.0020.0002.0B85] # TAMIL LETTER A
+0B86 ; [.169F.0020.0002.0B86] # TAMIL LETTER AA
+0B87 ; [.16A0.0020.0002.0B87] # TAMIL LETTER I
+0B88 ; [.16A1.0020.0002.0B88] # TAMIL LETTER II
+0B89 ; [.16A2.0020.0002.0B89] # TAMIL LETTER U
+0B8A ; [.16A3.0020.0002.0B8A] # TAMIL LETTER UU
+0B8E ; [.16A4.0020.0002.0B8E] # TAMIL LETTER E
+0B8F ; [.16A5.0020.0002.0B8F] # TAMIL LETTER EE
+0B90 ; [.16A6.0020.0002.0B90] # TAMIL LETTER AI
+0B92 ; [.16A7.0020.0002.0B92] # TAMIL LETTER O
+0B93 ; [.16A8.0020.0002.0B93] # TAMIL LETTER OO
+0B94 ; [.16A9.0020.0002.0B94] # TAMIL LETTER AU
+0B92 0BD7 ; [.16A9.0020.0002.0B94] # TAMIL LETTER AU
+0B95 ; [.16AA.0020.0002.0B95] # TAMIL LETTER KA
+0B99 ; [.16AB.0020.0002.0B99] # TAMIL LETTER NGA
+0B9A ; [.16AC.0020.0002.0B9A] # TAMIL LETTER CA
+0B9C ; [.16AD.0020.0002.0B9C] # TAMIL LETTER JA
+0B9E ; [.16AE.0020.0002.0B9E] # TAMIL LETTER NYA
+0B9F ; [.16AF.0020.0002.0B9F] # TAMIL LETTER TTA
+0BA3 ; [.16B0.0020.0002.0BA3] # TAMIL LETTER NNA
+0BA4 ; [.16B1.0020.0002.0BA4] # TAMIL LETTER TA
+0BA8 ; [.16B2.0020.0002.0BA8] # TAMIL LETTER NA
+0BA9 ; [.16B3.0020.0002.0BA9] # TAMIL LETTER NNNA
+0BAA ; [.16B4.0020.0002.0BAA] # TAMIL LETTER PA
+0BAE ; [.16B5.0020.0002.0BAE] # TAMIL LETTER MA
+0BAF ; [.16B6.0020.0002.0BAF] # TAMIL LETTER YA
+0BB0 ; [.16B7.0020.0002.0BB0] # TAMIL LETTER RA
+0BB1 ; [.16B8.0020.0002.0BB1] # TAMIL LETTER RRA
+0BB2 ; [.16B9.0020.0002.0BB2] # TAMIL LETTER LA
+0BB3 ; [.16BA.0020.0002.0BB3] # TAMIL LETTER LLA
+0BB4 ; [.16BB.0020.0002.0BB4] # TAMIL LETTER LLLA
+0BB5 ; [.16BC.0020.0002.0BB5] # TAMIL LETTER VA
+0BB7 ; [.16BD.0020.0002.0BB7] # TAMIL LETTER SSA
+0BB8 ; [.16BE.0020.0002.0BB8] # TAMIL LETTER SA
+0BB9 ; [.16BF.0020.0002.0BB9] # TAMIL LETTER HA
+0BBE ; [.16C0.0020.0002.0BBE] # TAMIL VOWEL SIGN AA
+0BBF ; [.16C1.0020.0002.0BBF] # TAMIL VOWEL SIGN I
+0BC0 ; [.16C2.0020.0002.0BC0] # TAMIL VOWEL SIGN II
+0BC1 ; [.16C3.0020.0002.0BC1] # TAMIL VOWEL SIGN U
+0BC2 ; [.16C4.0020.0002.0BC2] # TAMIL VOWEL SIGN UU
+0BC6 ; [.16C5.0020.0002.0BC6] # TAMIL VOWEL SIGN E
+0BC7 ; [.16C6.0020.0002.0BC7] # TAMIL VOWEL SIGN EE
+0BC8 ; [.16C7.0020.0002.0BC8] # TAMIL VOWEL SIGN AI
+0BCA ; [.16C8.0020.0002.0BCA] # TAMIL VOWEL SIGN O
+0BC6 0BBE ; [.16C8.0020.0002.0BCA] # TAMIL VOWEL SIGN O
+0BCB ; [.16C9.0020.0002.0BCB] # TAMIL VOWEL SIGN OO
+0BC7 0BBE ; [.16C9.0020.0002.0BCB] # TAMIL VOWEL SIGN OO
+0BCC ; [.16CA.0020.0002.0BCC] # TAMIL VOWEL SIGN AU
+0BC6 0BD7 ; [.16CA.0020.0002.0BCC] # TAMIL VOWEL SIGN AU
+0BCD ; [.16CB.0020.0002.0BCD] # TAMIL SIGN VIRAMA
+0BD7 ; [.16CC.0020.0002.0BD7] # TAMIL AU LENGTH MARK
+0C05 ; [.16CD.0020.0002.0C05] # TELUGU LETTER A
+0C06 ; [.16CE.0020.0002.0C06] # TELUGU LETTER AA
+0C07 ; [.16CF.0020.0002.0C07] # TELUGU LETTER I
+0C08 ; [.16D0.0020.0002.0C08] # TELUGU LETTER II
+0C09 ; [.16D1.0020.0002.0C09] # TELUGU LETTER U
+0C0A ; [.16D2.0020.0002.0C0A] # TELUGU LETTER UU
+0C0B ; [.16D3.0020.0002.0C0B] # TELUGU LETTER VOCALIC R
+0C60 ; [.16D4.0020.0002.0C60] # TELUGU LETTER VOCALIC RR
+0C0C ; [.16D5.0020.0002.0C0C] # TELUGU LETTER VOCALIC L
+0C61 ; [.16D6.0020.0002.0C61] # TELUGU LETTER VOCALIC LL
+0C0E ; [.16D7.0020.0002.0C0E] # TELUGU LETTER E
+0C0F ; [.16D8.0020.0002.0C0F] # TELUGU LETTER EE
+0C10 ; [.16D9.0020.0002.0C10] # TELUGU LETTER AI
+0C12 ; [.16DA.0020.0002.0C12] # TELUGU LETTER O
+0C13 ; [.16DB.0020.0002.0C13] # TELUGU LETTER OO
+0C14 ; [.16DC.0020.0002.0C14] # TELUGU LETTER AU
+0C15 ; [.16DD.0020.0002.0C15] # TELUGU LETTER KA
+0C16 ; [.16DE.0020.0002.0C16] # TELUGU LETTER KHA
+0C17 ; [.16DF.0020.0002.0C17] # TELUGU LETTER GA
+0C18 ; [.16E0.0020.0002.0C18] # TELUGU LETTER GHA
+0C19 ; [.16E1.0020.0002.0C19] # TELUGU LETTER NGA
+0C1A ; [.16E2.0020.0002.0C1A] # TELUGU LETTER CA
+0C1B ; [.16E3.0020.0002.0C1B] # TELUGU LETTER CHA
+0C1C ; [.16E4.0020.0002.0C1C] # TELUGU LETTER JA
+0C1D ; [.16E5.0020.0002.0C1D] # TELUGU LETTER JHA
+0C1E ; [.16E6.0020.0002.0C1E] # TELUGU LETTER NYA
+0C1F ; [.16E7.0020.0002.0C1F] # TELUGU LETTER TTA
+0C20 ; [.16E8.0020.0002.0C20] # TELUGU LETTER TTHA
+0C21 ; [.16E9.0020.0002.0C21] # TELUGU LETTER DDA
+0C22 ; [.16EA.0020.0002.0C22] # TELUGU LETTER DDHA
+0C23 ; [.16EB.0020.0002.0C23] # TELUGU LETTER NNA
+0C24 ; [.16EC.0020.0002.0C24] # TELUGU LETTER TA
+0C25 ; [.16ED.0020.0002.0C25] # TELUGU LETTER THA
+0C26 ; [.16EE.0020.0002.0C26] # TELUGU LETTER DA
+0C27 ; [.16EF.0020.0002.0C27] # TELUGU LETTER DHA
+0C28 ; [.16F0.0020.0002.0C28] # TELUGU LETTER NA
+0C2A ; [.16F1.0020.0002.0C2A] # TELUGU LETTER PA
+0C2B ; [.16F2.0020.0002.0C2B] # TELUGU LETTER PHA
+0C2C ; [.16F3.0020.0002.0C2C] # TELUGU LETTER BA
+0C2D ; [.16F4.0020.0002.0C2D] # TELUGU LETTER BHA
+0C2E ; [.16F5.0020.0002.0C2E] # TELUGU LETTER MA
+0C2F ; [.16F6.0020.0002.0C2F] # TELUGU LETTER YA
+0C30 ; [.16F7.0020.0002.0C30] # TELUGU LETTER RA
+0C31 ; [.16F8.0020.0002.0C31] # TELUGU LETTER RRA
+0C32 ; [.16F9.0020.0002.0C32] # TELUGU LETTER LA
+0C33 ; [.16FA.0020.0002.0C33] # TELUGU LETTER LLA
+0C35 ; [.16FB.0020.0002.0C35] # TELUGU LETTER VA
+0C36 ; [.16FC.0020.0002.0C36] # TELUGU LETTER SHA
+0C37 ; [.16FD.0020.0002.0C37] # TELUGU LETTER SSA
+0C38 ; [.16FE.0020.0002.0C38] # TELUGU LETTER SA
+0C39 ; [.16FF.0020.0002.0C39] # TELUGU LETTER HA
+0C3E ; [.1700.0020.0002.0C3E] # TELUGU VOWEL SIGN AA
+0C3F ; [.1701.0020.0002.0C3F] # TELUGU VOWEL SIGN I
+0C40 ; [.1702.0020.0002.0C40] # TELUGU VOWEL SIGN II
+0C41 ; [.1703.0020.0002.0C41] # TELUGU VOWEL SIGN U
+0C42 ; [.1704.0020.0002.0C42] # TELUGU VOWEL SIGN UU
+0C43 ; [.1705.0020.0002.0C43] # TELUGU VOWEL SIGN VOCALIC R
+0C44 ; [.1706.0020.0002.0C44] # TELUGU VOWEL SIGN VOCALIC RR
+0C46 ; [.1707.0020.0002.0C46] # TELUGU VOWEL SIGN E
+0C47 ; [.1708.0020.0002.0C47] # TELUGU VOWEL SIGN EE
+0C48 ; [.1709.0020.0002.0C48] # TELUGU VOWEL SIGN AI
+0C46 0C56 ; [.1709.0020.0002.0C48] # TELUGU VOWEL SIGN AI
+0C4A ; [.170A.0020.0002.0C4A] # TELUGU VOWEL SIGN O
+0C4B ; [.170B.0020.0002.0C4B] # TELUGU VOWEL SIGN OO
+0C4C ; [.170C.0020.0002.0C4C] # TELUGU VOWEL SIGN AU
+0C4D ; [.170D.0020.0002.0C4D] # TELUGU SIGN VIRAMA
+0C55 ; [.170E.0020.0002.0C55] # TELUGU LENGTH MARK
+0C56 ; [.170F.0020.0002.0C56] # TELUGU AI LENGTH MARK
+0C85 ; [.1710.0020.0002.0C85] # KANNADA LETTER A
+0C86 ; [.1711.0020.0002.0C86] # KANNADA LETTER AA
+0C87 ; [.1712.0020.0002.0C87] # KANNADA LETTER I
+0C88 ; [.1713.0020.0002.0C88] # KANNADA LETTER II
+0C89 ; [.1714.0020.0002.0C89] # KANNADA LETTER U
+0C8A ; [.1715.0020.0002.0C8A] # KANNADA LETTER UU
+0C8B ; [.1716.0020.0002.0C8B] # KANNADA LETTER VOCALIC R
+0CE0 ; [.1717.0020.0002.0CE0] # KANNADA LETTER VOCALIC RR
+0C8C ; [.1718.0020.0002.0C8C] # KANNADA LETTER VOCALIC L
+0CE1 ; [.1719.0020.0002.0CE1] # KANNADA LETTER VOCALIC LL
+0C8E ; [.171A.0020.0002.0C8E] # KANNADA LETTER E
+0C8F ; [.171B.0020.0002.0C8F] # KANNADA LETTER EE
+0C90 ; [.171C.0020.0002.0C90] # KANNADA LETTER AI
+0C92 ; [.171D.0020.0002.0C92] # KANNADA LETTER O
+0C93 ; [.171E.0020.0002.0C93] # KANNADA LETTER OO
+0C94 ; [.171F.0020.0002.0C94] # KANNADA LETTER AU
+0C95 ; [.1720.0020.0002.0C95] # KANNADA LETTER KA
+0C96 ; [.1721.0020.0002.0C96] # KANNADA LETTER KHA
+0C97 ; [.1722.0020.0002.0C97] # KANNADA LETTER GA
+0C98 ; [.1723.0020.0002.0C98] # KANNADA LETTER GHA
+0C99 ; [.1724.0020.0002.0C99] # KANNADA LETTER NGA
+0C9A ; [.1725.0020.0002.0C9A] # KANNADA LETTER CA
+0C9B ; [.1726.0020.0002.0C9B] # KANNADA LETTER CHA
+0C9C ; [.1727.0020.0002.0C9C] # KANNADA LETTER JA
+0C9D ; [.1728.0020.0002.0C9D] # KANNADA LETTER JHA
+0C9E ; [.1729.0020.0002.0C9E] # KANNADA LETTER NYA
+0C9F ; [.172A.0020.0002.0C9F] # KANNADA LETTER TTA
+0CA0 ; [.172B.0020.0002.0CA0] # KANNADA LETTER TTHA
+0CA1 ; [.172C.0020.0002.0CA1] # KANNADA LETTER DDA
+0CA2 ; [.172D.0020.0002.0CA2] # KANNADA LETTER DDHA
+0CA3 ; [.172E.0020.0002.0CA3] # KANNADA LETTER NNA
+0CA4 ; [.172F.0020.0002.0CA4] # KANNADA LETTER TA
+0CA5 ; [.1730.0020.0002.0CA5] # KANNADA LETTER THA
+0CA6 ; [.1731.0020.0002.0CA6] # KANNADA LETTER DA
+0CA7 ; [.1732.0020.0002.0CA7] # KANNADA LETTER DHA
+0CA8 ; [.1733.0020.0002.0CA8] # KANNADA LETTER NA
+0CAA ; [.1734.0020.0002.0CAA] # KANNADA LETTER PA
+0CAB ; [.1735.0020.0002.0CAB] # KANNADA LETTER PHA
+0CAC ; [.1736.0020.0002.0CAC] # KANNADA LETTER BA
+0CAD ; [.1737.0020.0002.0CAD] # KANNADA LETTER BHA
+0CAE ; [.1738.0020.0002.0CAE] # KANNADA LETTER MA
+0CAF ; [.1739.0020.0002.0CAF] # KANNADA LETTER YA
+0CB0 ; [.173A.0020.0002.0CB0] # KANNADA LETTER RA
+0CB1 ; [.173B.0020.0002.0CB1] # KANNADA LETTER RRA
+0CB2 ; [.173C.0020.0002.0CB2] # KANNADA LETTER LA
+0CB5 ; [.173D.0020.0002.0CB5] # KANNADA LETTER VA
+0CB6 ; [.173E.0020.0002.0CB6] # KANNADA LETTER SHA
+0CB7 ; [.173F.0020.0002.0CB7] # KANNADA LETTER SSA
+0CB8 ; [.1740.0020.0002.0CB8] # KANNADA LETTER SA
+0CB9 ; [.1741.0020.0002.0CB9] # KANNADA LETTER HA
+0CBD ; [.1742.0020.0002.0CBD] # KANNADA SIGN AVAGRAHA
+0CB3 ; [.1743.0020.0002.0CB3] # KANNADA LETTER LLA
+0CDE ; [.1744.0020.0002.0CDE] # KANNADA LETTER FA
+0CBE ; [.1745.0020.0002.0CBE] # KANNADA VOWEL SIGN AA
+0CBF ; [.1746.0020.0002.0CBF] # KANNADA VOWEL SIGN I
+0CC0 ; [.1747.0020.0002.0CC0] # KANNADA VOWEL SIGN II
+0CBF 0CD5 ; [.1747.0020.0002.0CC0] # KANNADA VOWEL SIGN II
+0CC1 ; [.1748.0020.0002.0CC1] # KANNADA VOWEL SIGN U
+0CC2 ; [.1749.0020.0002.0CC2] # KANNADA VOWEL SIGN UU
+0CC3 ; [.174A.0020.0002.0CC3] # KANNADA VOWEL SIGN VOCALIC R
+0CC4 ; [.174B.0020.0002.0CC4] # KANNADA VOWEL SIGN VOCALIC RR
+0CC6 ; [.174C.0020.0002.0CC6] # KANNADA VOWEL SIGN E
+0CC7 ; [.174D.0020.0002.0CC7] # KANNADA VOWEL SIGN EE
+0CC6 0CD5 ; [.174D.0020.0002.0CC7] # KANNADA VOWEL SIGN EE
+0CC8 ; [.174E.0020.0002.0CC8] # KANNADA VOWEL SIGN AI
+0CC6 0CD6 ; [.174E.0020.0002.0CC8] # KANNADA VOWEL SIGN AI
+0CCA ; [.174F.0020.0002.0CCA] # KANNADA VOWEL SIGN O
+0CC6 0CC2 ; [.174F.0020.0002.0CCA] # KANNADA VOWEL SIGN O
+0CCB ; [.1750.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CC6 0CC2 0CD5 ; [.1750.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CCC ; [.1751.0020.0002.0CCC] # KANNADA VOWEL SIGN AU
+0CCD ; [.1752.0020.0002.0CCD] # KANNADA SIGN VIRAMA
+0CD5 ; [.1753.0020.0002.0CD5] # KANNADA LENGTH MARK
+0CD6 ; [.1754.0020.0002.0CD6] # KANNADA AI LENGTH MARK
+0D05 ; [.1755.0020.0002.0D05] # MALAYALAM LETTER A
+0D06 ; [.1756.0020.0002.0D06] # MALAYALAM LETTER AA
+0D07 ; [.1757.0020.0002.0D07] # MALAYALAM LETTER I
+0D08 ; [.1758.0020.0002.0D08] # MALAYALAM LETTER II
+0D09 ; [.1759.0020.0002.0D09] # MALAYALAM LETTER U
+0D0A ; [.175A.0020.0002.0D0A] # MALAYALAM LETTER UU
+0D0B ; [.175B.0020.0002.0D0B] # MALAYALAM LETTER VOCALIC R
+0D60 ; [.175C.0020.0002.0D60] # MALAYALAM LETTER VOCALIC RR
+0D0C ; [.175D.0020.0002.0D0C] # MALAYALAM LETTER VOCALIC L
+0D61 ; [.175E.0020.0002.0D61] # MALAYALAM LETTER VOCALIC LL
+0D0E ; [.175F.0020.0002.0D0E] # MALAYALAM LETTER E
+0D0F ; [.1760.0020.0002.0D0F] # MALAYALAM LETTER EE
+0D10 ; [.1761.0020.0002.0D10] # MALAYALAM LETTER AI
+0D12 ; [.1762.0020.0002.0D12] # MALAYALAM LETTER O
+0D13 ; [.1763.0020.0002.0D13] # MALAYALAM LETTER OO
+0D14 ; [.1764.0020.0002.0D14] # MALAYALAM LETTER AU
+0D15 ; [.1765.0020.0002.0D15] # MALAYALAM LETTER KA
+0D16 ; [.1766.0020.0002.0D16] # MALAYALAM LETTER KHA
+0D17 ; [.1767.0020.0002.0D17] # MALAYALAM LETTER GA
+0D18 ; [.1768.0020.0002.0D18] # MALAYALAM LETTER GHA
+0D19 ; [.1769.0020.0002.0D19] # MALAYALAM LETTER NGA
+0D1A ; [.176A.0020.0002.0D1A] # MALAYALAM LETTER CA
+0D1B ; [.176B.0020.0002.0D1B] # MALAYALAM LETTER CHA
+0D1C ; [.176C.0020.0002.0D1C] # MALAYALAM LETTER JA
+0D1D ; [.176D.0020.0002.0D1D] # MALAYALAM LETTER JHA
+0D1E ; [.176E.0020.0002.0D1E] # MALAYALAM LETTER NYA
+0D1F ; [.176F.0020.0002.0D1F] # MALAYALAM LETTER TTA
+0D20 ; [.1770.0020.0002.0D20] # MALAYALAM LETTER TTHA
+0D21 ; [.1771.0020.0002.0D21] # MALAYALAM LETTER DDA
+0D22 ; [.1772.0020.0002.0D22] # MALAYALAM LETTER DDHA
+0D23 ; [.1773.0020.0002.0D23] # MALAYALAM LETTER NNA
+0D24 ; [.1774.0020.0002.0D24] # MALAYALAM LETTER TA
+0D25 ; [.1775.0020.0002.0D25] # MALAYALAM LETTER THA
+0D26 ; [.1776.0020.0002.0D26] # MALAYALAM LETTER DA
+0D27 ; [.1777.0020.0002.0D27] # MALAYALAM LETTER DHA
+0D28 ; [.1778.0020.0002.0D28] # MALAYALAM LETTER NA
+0D2A ; [.1779.0020.0002.0D2A] # MALAYALAM LETTER PA
+0D2B ; [.177A.0020.0002.0D2B] # MALAYALAM LETTER PHA
+0D2C ; [.177B.0020.0002.0D2C] # MALAYALAM LETTER BA
+0D2D ; [.177C.0020.0002.0D2D] # MALAYALAM LETTER BHA
+0D2E ; [.177D.0020.0002.0D2E] # MALAYALAM LETTER MA
+0D2F ; [.177E.0020.0002.0D2F] # MALAYALAM LETTER YA
+0D30 ; [.177F.0020.0002.0D30] # MALAYALAM LETTER RA
+0D31 ; [.1780.0020.0002.0D31] # MALAYALAM LETTER RRA
+0D32 ; [.1781.0020.0002.0D32] # MALAYALAM LETTER LA
+0D33 ; [.1782.0020.0002.0D33] # MALAYALAM LETTER LLA
+0D34 ; [.1783.0020.0002.0D34] # MALAYALAM LETTER LLLA
+0D35 ; [.1784.0020.0002.0D35] # MALAYALAM LETTER VA
+0D36 ; [.1785.0020.0002.0D36] # MALAYALAM LETTER SHA
+0D37 ; [.1786.0020.0002.0D37] # MALAYALAM LETTER SSA
+0D38 ; [.1787.0020.0002.0D38] # MALAYALAM LETTER SA
+0D39 ; [.1788.0020.0002.0D39] # MALAYALAM LETTER HA
+0D3E ; [.1789.0020.0002.0D3E] # MALAYALAM VOWEL SIGN AA
+0D3F ; [.178A.0020.0002.0D3F] # MALAYALAM VOWEL SIGN I
+0D40 ; [.178B.0020.0002.0D40] # MALAYALAM VOWEL SIGN II
+0D41 ; [.178C.0020.0002.0D41] # MALAYALAM VOWEL SIGN U
+0D42 ; [.178D.0020.0002.0D42] # MALAYALAM VOWEL SIGN UU
+0D43 ; [.178E.0020.0002.0D43] # MALAYALAM VOWEL SIGN VOCALIC R
+0D46 ; [.178F.0020.0002.0D46] # MALAYALAM VOWEL SIGN E
+0D47 ; [.1790.0020.0002.0D47] # MALAYALAM VOWEL SIGN EE
+0D48 ; [.1791.0020.0002.0D48] # MALAYALAM VOWEL SIGN AI
+0D4A ; [.1792.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O
+0D46 0D3E ; [.1792.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O
+0D4B ; [.1793.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO
+0D47 0D3E ; [.1793.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO
+0D4C ; [.1794.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU
+0D46 0D57 ; [.1794.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU
+0D4D ; [.1795.0020.0002.0D4D] # MALAYALAM SIGN VIRAMA
+0D57 ; [.1796.0020.0002.0D57] # MALAYALAM AU LENGTH MARK
+0D85 ; [.1797.0020.0002.0D85] # SINHALA LETTER AYANNA
+0D86 ; [.1798.0020.0002.0D86] # SINHALA LETTER AAYANNA
+0D87 ; [.1799.0020.0002.0D87] # SINHALA LETTER AEYANNA
+0D88 ; [.179A.0020.0002.0D88] # SINHALA LETTER AEEYANNA
+0D89 ; [.179B.0020.0002.0D89] # SINHALA LETTER IYANNA
+0D8A ; [.179C.0020.0002.0D8A] # SINHALA LETTER IIYANNA
+0D8B ; [.179D.0020.0002.0D8B] # SINHALA LETTER UYANNA
+0D8C ; [.179E.0020.0002.0D8C] # SINHALA LETTER UUYANNA
+0D8D ; [.179F.0020.0002.0D8D] # SINHALA LETTER IRUYANNA
+0D8E ; [.17A0.0020.0002.0D8E] # SINHALA LETTER IRUUYANNA
+0D8F ; [.17A1.0020.0002.0D8F] # SINHALA LETTER ILUYANNA
+0D90 ; [.17A2.0020.0002.0D90] # SINHALA LETTER ILUUYANNA
+0D91 ; [.17A3.0020.0002.0D91] # SINHALA LETTER EYANNA
+0D92 ; [.17A4.0020.0002.0D92] # SINHALA LETTER EEYANNA
+0D93 ; [.17A5.0020.0002.0D93] # SINHALA LETTER AIYANNA
+0D94 ; [.17A6.0020.0002.0D94] # SINHALA LETTER OYANNA
+0D95 ; [.17A7.0020.0002.0D95] # SINHALA LETTER OOYANNA
+0D96 ; [.17A8.0020.0002.0D96] # SINHALA LETTER AUYANNA
+0D9A ; [.17A9.0020.0002.0D9A] # SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B ; [.17AA.0020.0002.0D9B] # SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C ; [.17AB.0020.0002.0D9C] # SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D ; [.17AC.0020.0002.0D9D] # SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E ; [.17AD.0020.0002.0D9E] # SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F ; [.17AE.0020.0002.0D9F] # SINHALA LETTER SANYAKA GAYANNA
+0DA0 ; [.17AF.0020.0002.0DA0] # SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1 ; [.17B0.0020.0002.0DA1] # SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2 ; [.17B1.0020.0002.0DA2] # SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3 ; [.17B2.0020.0002.0DA3] # SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4 ; [.17B3.0020.0002.0DA4] # SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5 ; [.17B4.0020.0002.0DA5] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6 ; [.17B5.0020.0002.0DA6] # SINHALA LETTER SANYAKA JAYANNA
+0DA7 ; [.17B6.0020.0002.0DA7] # SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8 ; [.17B7.0020.0002.0DA8] # SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9 ; [.17B8.0020.0002.0DA9] # SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA ; [.17B9.0020.0002.0DAA] # SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB ; [.17BA.0020.0002.0DAB] # SINHALA LETTER MUURDHAJA NAYANNA
+0DAC ; [.17BB.0020.0002.0DAC] # SINHALA LETTER SANYAKA DDAYANNA
+0DAD ; [.17BC.0020.0002.0DAD] # SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE ; [.17BD.0020.0002.0DAE] # SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF ; [.17BE.0020.0002.0DAF] # SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0 ; [.17BF.0020.0002.0DB0] # SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1 ; [.17C0.0020.0002.0DB1] # SINHALA LETTER DANTAJA NAYANNA
+0DB3 ; [.17C1.0020.0002.0DB3] # SINHALA LETTER SANYAKA DAYANNA
+0DB4 ; [.17C2.0020.0002.0DB4] # SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5 ; [.17C3.0020.0002.0DB5] # SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6 ; [.17C4.0020.0002.0DB6] # SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7 ; [.17C5.0020.0002.0DB7] # SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8 ; [.17C6.0020.0002.0DB8] # SINHALA LETTER MAYANNA
+0DB9 ; [.17C7.0020.0002.0DB9] # SINHALA LETTER AMBA BAYANNA
+0DBA ; [.17C8.0020.0002.0DBA] # SINHALA LETTER YAYANNA
+0DBB ; [.17C9.0020.0002.0DBB] # SINHALA LETTER RAYANNA
+0DBD ; [.17CA.0020.0002.0DBD] # SINHALA LETTER DANTAJA LAYANNA
+0DC0 ; [.17CB.0020.0002.0DC0] # SINHALA LETTER VAYANNA
+0DC1 ; [.17CC.0020.0002.0DC1] # SINHALA LETTER TAALUJA SAYANNA
+0DC2 ; [.17CD.0020.0002.0DC2] # SINHALA LETTER MUURDHAJA SAYANNA
+0DC3 ; [.17CE.0020.0002.0DC3] # SINHALA LETTER DANTAJA SAYANNA
+0DC4 ; [.17CF.0020.0002.0DC4] # SINHALA LETTER HAYANNA
+0DC5 ; [.17D0.0020.0002.0DC5] # SINHALA LETTER MUURDHAJA LAYANNA
+0DC6 ; [.17D1.0020.0002.0DC6] # SINHALA LETTER FAYANNA
+0DCA ; [.17D2.0020.0002.0DCA] # SINHALA SIGN AL-LAKUNA
+0DCF ; [.17D3.0020.0002.0DCF] # SINHALA VOWEL SIGN AELA-PILLA
+0DD0 ; [.17D4.0020.0002.0DD0] # SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1 ; [.17D5.0020.0002.0DD1] # SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2 ; [.17D6.0020.0002.0DD2] # SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3 ; [.17D7.0020.0002.0DD3] # SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4 ; [.17D8.0020.0002.0DD4] # SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; [.17D9.0020.0002.0DD6] # SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8 ; [.17DA.0020.0002.0DD8] # SINHALA VOWEL SIGN GAETTA-PILLA
+0DD9 ; [.17DB.0020.0002.0DD9] # SINHALA VOWEL SIGN KOMBUVA
+0DDA ; [.17DC.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DD9 0DCA ; [.17DC.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB ; [.17DD.0020.0002.0DDB] # SINHALA VOWEL SIGN KOMBU DEKA
+0DDC ; [.17DE.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DD9 0DCF ; [.17DE.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD ; [.17DF.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DD9 0DCF 0DCA ; [.17DF.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE ; [.17E0.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DD9 0DDF ; [.17E0.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DDF ; [.17E1.0020.0002.0DDF] # SINHALA VOWEL SIGN GAYANUKITTA
+0DF2 ; [.17E2.0020.0002.0DF2] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DF3 ; [.17E3.0020.0002.0DF3] # SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0E01 ; [.17E4.0020.0002.0E01] # THAI CHARACTER KO KAI
+0E02 ; [.17E5.0020.0002.0E02] # THAI CHARACTER KHO KHAI
+0E03 ; [.17E6.0020.0002.0E03] # THAI CHARACTER KHO KHUAT
+0E04 ; [.17E7.0020.0002.0E04] # THAI CHARACTER KHO KHWAI
+0E05 ; [.17E8.0020.0002.0E05] # THAI CHARACTER KHO KHON
+0E06 ; [.17E9.0020.0002.0E06] # THAI CHARACTER KHO RAKHANG
+0E07 ; [.17EA.0020.0002.0E07] # THAI CHARACTER NGO NGU
+0E08 ; [.17EB.0020.0002.0E08] # THAI CHARACTER CHO CHAN
+0E09 ; [.17EC.0020.0002.0E09] # THAI CHARACTER CHO CHING
+0E0A ; [.17ED.0020.0002.0E0A] # THAI CHARACTER CHO CHANG
+0E0B ; [.17EE.0020.0002.0E0B] # THAI CHARACTER SO SO
+0E0C ; [.17EF.0020.0002.0E0C] # THAI CHARACTER CHO CHOE
+0E0D ; [.17F0.0020.0002.0E0D] # THAI CHARACTER YO YING
+0E0E ; [.17F1.0020.0002.0E0E] # THAI CHARACTER DO CHADA
+0E0F ; [.17F2.0020.0002.0E0F] # THAI CHARACTER TO PATAK
+0E10 ; [.17F3.0020.0002.0E10] # THAI CHARACTER THO THAN
+0E11 ; [.17F4.0020.0002.0E11] # THAI CHARACTER THO NANGMONTHO
+0E12 ; [.17F5.0020.0002.0E12] # THAI CHARACTER THO PHUTHAO
+0E13 ; [.17F6.0020.0002.0E13] # THAI CHARACTER NO NEN
+0E14 ; [.17F7.0020.0002.0E14] # THAI CHARACTER DO DEK
+0E15 ; [.17F8.0020.0002.0E15] # THAI CHARACTER TO TAO
+0E16 ; [.17F9.0020.0002.0E16] # THAI CHARACTER THO THUNG
+0E17 ; [.17FA.0020.0002.0E17] # THAI CHARACTER THO THAHAN
+0E18 ; [.17FB.0020.0002.0E18] # THAI CHARACTER THO THONG
+0E19 ; [.17FC.0020.0002.0E19] # THAI CHARACTER NO NU
+0E1A ; [.17FD.0020.0002.0E1A] # THAI CHARACTER BO BAIMAI
+0E1B ; [.17FE.0020.0002.0E1B] # THAI CHARACTER PO PLA
+0E1C ; [.17FF.0020.0002.0E1C] # THAI CHARACTER PHO PHUNG
+0E1D ; [.1800.0020.0002.0E1D] # THAI CHARACTER FO FA
+0E1E ; [.1801.0020.0002.0E1E] # THAI CHARACTER PHO PHAN
+0E1F ; [.1802.0020.0002.0E1F] # THAI CHARACTER FO FAN
+0E20 ; [.1803.0020.0002.0E20] # THAI CHARACTER PHO SAMPHAO
+0E21 ; [.1804.0020.0002.0E21] # THAI CHARACTER MO MA
+0E22 ; [.1805.0020.0002.0E22] # THAI CHARACTER YO YAK
+0E23 ; [.1806.0020.0002.0E23] # THAI CHARACTER RO RUA
+0E24 ; [.1807.0020.0002.0E24] # THAI CHARACTER RU
+0E25 ; [.1808.0020.0002.0E25] # THAI CHARACTER LO LING
+0E26 ; [.1809.0020.0002.0E26] # THAI CHARACTER LU
+0E27 ; [.180A.0020.0002.0E27] # THAI CHARACTER WO WAEN
+0E28 ; [.180B.0020.0002.0E28] # THAI CHARACTER SO SALA
+0E29 ; [.180C.0020.0002.0E29] # THAI CHARACTER SO RUSI
+0E2A ; [.180D.0020.0002.0E2A] # THAI CHARACTER SO SUA
+0E2B ; [.180E.0020.0002.0E2B] # THAI CHARACTER HO HIP
+0E2C ; [.180F.0020.0002.0E2C] # THAI CHARACTER LO CHULA
+0E2D ; [.1810.0020.0002.0E2D] # THAI CHARACTER O ANG
+0E2E ; [.1811.0020.0002.0E2E] # THAI CHARACTER HO NOKHUK
+0E2F ; [.1812.0020.0002.0E2F] # THAI CHARACTER PAIYANNOI
+0E30 ; [.1813.0020.0002.0E30] # THAI CHARACTER SARA A
+0E31 ; [.1814.0020.0002.0E31] # THAI CHARACTER MAI HAN-AKAT
+0E32 ; [.1815.0020.0002.0E32] # THAI CHARACTER SARA AA
+0E33 ; [.1816.0020.0002.0E33] # THAI CHARACTER SARA AM
+0E4D 0E32 ; [.1816.0020.0002.0E33] # THAI CHARACTER SARA AM
+0E34 ; [.1817.0020.0002.0E34] # THAI CHARACTER SARA I
+0E35 ; [.1818.0020.0002.0E35] # THAI CHARACTER SARA II
+0E36 ; [.1819.0020.0002.0E36] # THAI CHARACTER SARA UE
+0E37 ; [.181A.0020.0002.0E37] # THAI CHARACTER SARA UEE
+0E38 ; [.181B.0020.0002.0E38] # THAI CHARACTER SARA U
+0E39 ; [.181C.0020.0002.0E39] # THAI CHARACTER SARA UU
+0E3A ; [.181D.0020.0002.0E3A] # THAI CHARACTER PHINTHU
+0E40 ; [.181E.0020.0002.0E40] # THAI CHARACTER SARA E
+0E41 ; [.181F.0020.0002.0E41] # THAI CHARACTER SARA AE
+0E42 ; [.1820.0020.0002.0E42] # THAI CHARACTER SARA O
+0E43 ; [.1821.0020.0002.0E43] # THAI CHARACTER SARA AI MAIMUAN
+0E44 ; [.1822.0020.0002.0E44] # THAI CHARACTER SARA AI MAIMALAI
+0E45 ; [.1823.0020.0002.0E45] # THAI CHARACTER LAKKHANGYAO
+0E4C ; [.1824.0020.0002.0E4C] # THAI CHARACTER THANTHAKHAT
+0E4D ; [.1825.0020.0002.0E4D] # THAI CHARACTER NIKHAHIT
+0E81 ; [.1826.0020.0002.0E81] # LAO LETTER KO
+0E82 ; [.1827.0020.0002.0E82] # LAO LETTER KHO SUNG
+0E84 ; [.1828.0020.0002.0E84] # LAO LETTER KHO TAM
+0E87 ; [.1829.0020.0002.0E87] # LAO LETTER NGO
+0E88 ; [.182A.0020.0002.0E88] # LAO LETTER CO
+0E8A ; [.182B.0020.0002.0E8A] # LAO LETTER SO TAM
+0E8D ; [.182C.0020.0002.0E8D] # LAO LETTER NYO
+0E94 ; [.182D.0020.0002.0E94] # LAO LETTER DO
+0E95 ; [.182E.0020.0002.0E95] # LAO LETTER TO
+0E96 ; [.182F.0020.0002.0E96] # LAO LETTER THO SUNG
+0E97 ; [.1830.0020.0002.0E97] # LAO LETTER THO TAM
+0E99 ; [.1831.0020.0002.0E99] # LAO LETTER NO
+0E9A ; [.1832.0020.0002.0E9A] # LAO LETTER BO
+0E9B ; [.1833.0020.0002.0E9B] # LAO LETTER PO
+0E9C ; [.1834.0020.0002.0E9C] # LAO LETTER PHO SUNG
+0E9D ; [.1835.0020.0002.0E9D] # LAO LETTER FO TAM
+0E9E ; [.1836.0020.0002.0E9E] # LAO LETTER PHO TAM
+0E9F ; [.1837.0020.0002.0E9F] # LAO LETTER FO SUNG
+0EA1 ; [.1838.0020.0002.0EA1] # LAO LETTER MO
+0EA2 ; [.1839.0020.0002.0EA2] # LAO LETTER YO
+0EA3 ; [.183A.0020.0002.0EA3] # LAO LETTER LO LING
+0EA5 ; [.183B.0020.0002.0EA5] # LAO LETTER LO LOOT
+0EA7 ; [.183C.0020.0002.0EA7] # LAO LETTER WO
+0EAA ; [.183D.0020.0002.0EAA] # LAO LETTER SO SUNG
+0EAB ; [.183E.0020.0002.0EAB] # LAO LETTER HO SUNG
+0EDC ; [.183E.0020.0004.0EDC][.1831.0020.0004.0EDC] # LAO HO NO; QQKN
+0EDD ; [.183E.0020.0004.0EDD][.1838.0020.0004.0EDD] # LAO HO MO; QQKN
+0EAD ; [.183F.0020.0002.0EAD] # LAO LETTER O
+0EAE ; [.1840.0020.0002.0EAE] # LAO LETTER HO TAM
+0EAF ; [.1841.0020.0002.0EAF] # LAO ELLIPSIS
+0EB0 ; [.1842.0020.0002.0EB0] # LAO VOWEL SIGN A
+0EB1 ; [.1843.0020.0002.0EB1] # LAO VOWEL SIGN MAI KAN
+0EB2 ; [.1844.0020.0002.0EB2] # LAO VOWEL SIGN AA
+0EB3 ; [.1845.0020.0002.0EB3] # LAO VOWEL SIGN AM
+0ECD 0EB2 ; [.1845.0020.0002.0EB3] # LAO VOWEL SIGN AM
+0EB4 ; [.1846.0020.0002.0EB4] # LAO VOWEL SIGN I
+0EB5 ; [.1847.0020.0002.0EB5] # LAO VOWEL SIGN II
+0EB6 ; [.1848.0020.0002.0EB6] # LAO VOWEL SIGN Y
+0EB7 ; [.1849.0020.0002.0EB7] # LAO VOWEL SIGN YY
+0EB8 ; [.184A.0020.0002.0EB8] # LAO VOWEL SIGN U
+0EB9 ; [.184B.0020.0002.0EB9] # LAO VOWEL SIGN UU
+0EBB ; [.184C.0020.0002.0EBB] # LAO VOWEL SIGN MAI KON
+0EBC ; [.184D.0020.0002.0EBC] # LAO SEMIVOWEL SIGN LO
+0EBD ; [.184E.0020.0002.0EBD] # LAO SEMIVOWEL SIGN NYO
+0EC0 ; [.184F.0020.0002.0EC0] # LAO VOWEL SIGN E
+0EC1 ; [.1850.0020.0002.0EC1] # LAO VOWEL SIGN EI
+0EC2 ; [.1851.0020.0002.0EC2] # LAO VOWEL SIGN O
+0EC3 ; [.1852.0020.0002.0EC3] # LAO VOWEL SIGN AY
+0EC4 ; [.1853.0020.0002.0EC4] # LAO VOWEL SIGN AI
+0ECC ; [.1854.0020.0002.0ECC] # LAO CANCELLATION MARK
+0ECD ; [.1855.0020.0002.0ECD] # LAO NIGGAHITA
+0F40 ; [.1856.0020.0002.0F40] # TIBETAN LETTER KA
+0F69 ; [.1856.0020.0002.0F40][.1895.0020.0002.0FB5] # TIBETAN LETTER KSSA; QQCN
+0F90 ; [.1857.0020.0002.0F90] # TIBETAN SUBJOINED LETTER KA
+0FB9 ; [.1857.0020.0002.0F90][.1895.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER KSSA; QQCN
+0F41 ; [.1858.0020.0002.0F41] # TIBETAN LETTER KHA
+0F91 ; [.1859.0020.0002.0F91] # TIBETAN SUBJOINED LETTER KHA
+0F42 ; [.185A.0020.0002.0F42] # TIBETAN LETTER GA
+0F43 ; [.185A.0020.0002.0F42][.1899.0020.0002.0FB7] # TIBETAN LETTER GHA; QQCN
+0F92 ; [.185B.0020.0002.0F92] # TIBETAN SUBJOINED LETTER GA
+0F93 ; [.185B.0020.0002.0F92][.1899.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER GHA; QQCN
+0F44 ; [.185C.0020.0002.0F44] # TIBETAN LETTER NGA
+0F94 ; [.185D.0020.0002.0F94] # TIBETAN SUBJOINED LETTER NGA
+0F45 ; [.185E.0020.0002.0F45] # TIBETAN LETTER CA
+0F95 ; [.185F.0020.0002.0F95] # TIBETAN SUBJOINED LETTER CA
+0F46 ; [.1860.0020.0002.0F46] # TIBETAN LETTER CHA
+0F96 ; [.1861.0020.0002.0F96] # TIBETAN SUBJOINED LETTER CHA
+0F47 ; [.1862.0020.0002.0F47] # TIBETAN LETTER JA
+0F97 ; [.1863.0020.0002.0F97] # TIBETAN SUBJOINED LETTER JA
+0F49 ; [.1864.0020.0002.0F49] # TIBETAN LETTER NYA
+0F99 ; [.1865.0020.0002.0F99] # TIBETAN SUBJOINED LETTER NYA
+0F4A ; [.1866.0020.0002.0F4A] # TIBETAN LETTER TTA
+0F9A ; [.1867.0020.0002.0F9A] # TIBETAN SUBJOINED LETTER TTA
+0F4B ; [.1868.0020.0002.0F4B] # TIBETAN LETTER TTHA
+0F9B ; [.1869.0020.0002.0F9B] # TIBETAN SUBJOINED LETTER TTHA
+0F4C ; [.186A.0020.0002.0F4C] # TIBETAN LETTER DDA
+0F4D ; [.186A.0020.0002.0F4C][.1899.0020.0002.0FB7] # TIBETAN LETTER DDHA; QQCN
+0F9C ; [.186B.0020.0002.0F9C] # TIBETAN SUBJOINED LETTER DDA
+0F9D ; [.186B.0020.0002.0F9C][.1899.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DDHA; QQCN
+0F4E ; [.186C.0020.0002.0F4E] # TIBETAN LETTER NNA
+0F9E ; [.186D.0020.0002.0F9E] # TIBETAN SUBJOINED LETTER NNA
+0F4F ; [.186E.0020.0002.0F4F] # TIBETAN LETTER TA
+0F9F ; [.186F.0020.0002.0F9F] # TIBETAN SUBJOINED LETTER TA
+0F50 ; [.1870.0020.0002.0F50] # TIBETAN LETTER THA
+0FA0 ; [.1871.0020.0002.0FA0] # TIBETAN SUBJOINED LETTER THA
+0F51 ; [.1872.0020.0002.0F51] # TIBETAN LETTER DA
+0F52 ; [.1872.0020.0002.0F51][.1899.0020.0002.0FB7] # TIBETAN LETTER DHA; QQCN
+0FA1 ; [.1873.0020.0002.0FA1] # TIBETAN SUBJOINED LETTER DA
+0FA2 ; [.1873.0020.0002.0FA1][.1899.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DHA; QQCN
+0F53 ; [.1874.0020.0002.0F53] # TIBETAN LETTER NA
+0FA3 ; [.1875.0020.0002.0FA3] # TIBETAN SUBJOINED LETTER NA
+0F54 ; [.1876.0020.0002.0F54] # TIBETAN LETTER PA
+0FA4 ; [.1877.0020.0002.0FA4] # TIBETAN SUBJOINED LETTER PA
+0F55 ; [.1878.0020.0002.0F55] # TIBETAN LETTER PHA
+0FA5 ; [.1879.0020.0002.0FA5] # TIBETAN SUBJOINED LETTER PHA
+0F56 ; [.187A.0020.0002.0F56] # TIBETAN LETTER BA
+0F57 ; [.187A.0020.0002.0F56][.1899.0020.0002.0FB7] # TIBETAN LETTER BHA; QQCN
+0FA6 ; [.187B.0020.0002.0FA6] # TIBETAN SUBJOINED LETTER BA
+0FA7 ; [.187B.0020.0002.0FA6][.1899.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER BHA; QQCN
+0F58 ; [.187C.0020.0002.0F58] # TIBETAN LETTER MA
+0FA8 ; [.187D.0020.0002.0FA8] # TIBETAN SUBJOINED LETTER MA
+0F59 ; [.187E.0020.0002.0F59] # TIBETAN LETTER TSA
+0FA9 ; [.187F.0020.0002.0FA9] # TIBETAN SUBJOINED LETTER TSA
+0F5A ; [.1880.0020.0002.0F5A] # TIBETAN LETTER TSHA
+0FAA ; [.1881.0020.0002.0FAA] # TIBETAN SUBJOINED LETTER TSHA
+0F5B ; [.1882.0020.0002.0F5B] # TIBETAN LETTER DZA
+0F5C ; [.1882.0020.0002.0F5B][.1899.0020.0002.0FB7] # TIBETAN LETTER DZHA; QQCN
+0FAB ; [.1883.0020.0002.0FAB] # TIBETAN SUBJOINED LETTER DZA
+0FAC ; [.1883.0020.0002.0FAB][.1899.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DZHA; QQCN
+0F5D ; [.1884.0020.0002.0F5D] # TIBETAN LETTER WA
+0FAD ; [.1885.0020.0002.0FAD] # TIBETAN SUBJOINED LETTER WA
+0FBA ; [.1885.0020.0004.0FBA][.0000.015E.0004.0FBA] # TIBETAN SUBJOINED LETTER FIXED-FORM WA; QQKN
+0F5E ; [.1886.0020.0002.0F5E] # TIBETAN LETTER ZHA
+0FAE ; [.1887.0020.0002.0FAE] # TIBETAN SUBJOINED LETTER ZHA
+0F5F ; [.1888.0020.0002.0F5F] # TIBETAN LETTER ZA
+0FAF ; [.1889.0020.0002.0FAF] # TIBETAN SUBJOINED LETTER ZA
+0F60 ; [.188A.0020.0002.0F60] # TIBETAN LETTER -A
+0FB0 ; [.188B.0020.0002.0FB0] # TIBETAN SUBJOINED LETTER -A
+0F61 ; [.188C.0020.0002.0F61] # TIBETAN LETTER YA
+0FB1 ; [.188D.0020.0002.0FB1] # TIBETAN SUBJOINED LETTER YA
+0FBB ; [.188D.0020.0004.0FBB][.0000.015E.0004.0FBB] # TIBETAN SUBJOINED LETTER FIXED-FORM YA; QQKN
+0F62 ; [.188E.0020.0002.0F62] # TIBETAN LETTER RA
+0F6A ; [.188E.0020.0004.0F6A][.0000.015E.0004.0F6A] # TIBETAN LETTER FIXED-FORM RA; QQKN
+0FB2 ; [.188F.0020.0002.0FB2] # TIBETAN SUBJOINED LETTER RA
+0FBC ; [.188F.0020.0004.0FBC][.0000.015E.0004.0FBC] # TIBETAN SUBJOINED LETTER FIXED-FORM RA; QQKN
+0F63 ; [.1890.0020.0002.0F63] # TIBETAN LETTER LA
+0FB3 ; [.1891.0020.0002.0FB3] # TIBETAN SUBJOINED LETTER LA
+0F64 ; [.1892.0020.0002.0F64] # TIBETAN LETTER SHA
+0FB4 ; [.1893.0020.0002.0FB4] # TIBETAN SUBJOINED LETTER SHA
+0F65 ; [.1894.0020.0002.0F65] # TIBETAN LETTER SSA
+0FB5 ; [.1895.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER SSA
+0F66 ; [.1896.0020.0002.0F66] # TIBETAN LETTER SA
+0FB6 ; [.1897.0020.0002.0FB6] # TIBETAN SUBJOINED LETTER SA
+0F67 ; [.1898.0020.0002.0F67] # TIBETAN LETTER HA
+0FB7 ; [.1899.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER HA
+0F68 ; [.189A.0020.0002.0F68] # TIBETAN LETTER A
+0F00 ; [.189A.0020.0004.0F00][.18AD.0020.0004.0F00][.0000.0124.001F.0F00] # TIBETAN SYLLABLE OM; QQKN
+0FB8 ; [.189B.0020.0002.0FB8] # TIBETAN SUBJOINED LETTER A
+0F88 ; [.189C.0020.0002.0F88] # TIBETAN SIGN LCE TSA CAN
+0F89 ; [.189D.0020.0002.0F89] # TIBETAN SIGN MCHU CAN
+0F8A ; [.189E.0020.0002.0F8A] # TIBETAN SIGN GRU CAN RGYINGS
+0F8B ; [.189F.0020.0002.0F8B] # TIBETAN SIGN GRU MED RGYINGS
+0F71 ; [.18A0.0020.0002.0F71] # TIBETAN VOWEL SIGN AA
+0F72 ; [.18A1.0020.0002.0F72] # TIBETAN VOWEL SIGN I
+0F73 ; [.18A2.0020.0002.0F73] # TIBETAN VOWEL SIGN II
+0F71 0F72 ; [.18A2.0020.0002.0F73] # TIBETAN VOWEL SIGN II
+0F80 ; [.18A3.0020.0002.0F80] # TIBETAN VOWEL SIGN REVERSED I
+0F81 ; [.18A4.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
+0F71 0F80 ; [.18A4.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
+0F74 ; [.18A5.0020.0002.0F74] # TIBETAN VOWEL SIGN U
+0F75 ; [.18A6.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
+0F71 0F74 ; [.18A6.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
+0F76 ; [.18A7.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
+0FB2 0F80 ; [.18A7.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
+0F77 ; [.18A8.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0FB2 0F71 0F80 ; [.18A8.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0F78 ; [.18A9.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
+0FB3 0F80 ; [.18A9.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
+0F79 ; [.18AA.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0FB3 0F71 0F80 ; [.18AA.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0F7A ; [.18AB.0020.0002.0F7A] # TIBETAN VOWEL SIGN E
+0F7B ; [.18AC.0020.0002.0F7B] # TIBETAN VOWEL SIGN EE
+0F7C ; [.18AD.0020.0002.0F7C] # TIBETAN VOWEL SIGN O
+0F7D ; [.18AE.0020.0002.0F7D] # TIBETAN VOWEL SIGN OO
+0F84 ; [.18AF.0020.0002.0F84] # TIBETAN MARK HALANTA
+1900 ; [.18B0.0020.0002.1900] # LIMBU VOWEL-CARRIER LETTER
+1901 ; [.18B1.0020.0002.1901] # LIMBU LETTER KA
+1902 ; [.18B2.0020.0002.1902] # LIMBU LETTER KHA
+1903 ; [.18B3.0020.0002.1903] # LIMBU LETTER GA
+1904 ; [.18B4.0020.0002.1904] # LIMBU LETTER GHA
+1905 ; [.18B5.0020.0002.1905] # LIMBU LETTER NGA
+1906 ; [.18B6.0020.0002.1906] # LIMBU LETTER CA
+1907 ; [.18B7.0020.0002.1907] # LIMBU LETTER CHA
+1908 ; [.18B8.0020.0002.1908] # LIMBU LETTER JA
+1909 ; [.18B9.0020.0002.1909] # LIMBU LETTER JHA
+190A ; [.18BA.0020.0002.190A] # LIMBU LETTER YAN
+190B ; [.18BB.0020.0002.190B] # LIMBU LETTER TA
+190C ; [.18BC.0020.0002.190C] # LIMBU LETTER THA
+190D ; [.18BD.0020.0002.190D] # LIMBU LETTER DA
+190E ; [.18BE.0020.0002.190E] # LIMBU LETTER DHA
+190F ; [.18BF.0020.0002.190F] # LIMBU LETTER NA
+1910 ; [.18C0.0020.0002.1910] # LIMBU LETTER PA
+1911 ; [.18C1.0020.0002.1911] # LIMBU LETTER PHA
+1912 ; [.18C2.0020.0002.1912] # LIMBU LETTER BA
+1913 ; [.18C3.0020.0002.1913] # LIMBU LETTER BHA
+1914 ; [.18C4.0020.0002.1914] # LIMBU LETTER MA
+1915 ; [.18C5.0020.0002.1915] # LIMBU LETTER YA
+1916 ; [.18C6.0020.0002.1916] # LIMBU LETTER RA
+1917 ; [.18C7.0020.0002.1917] # LIMBU LETTER LA
+1918 ; [.18C8.0020.0002.1918] # LIMBU LETTER WA
+1919 ; [.18C9.0020.0002.1919] # LIMBU LETTER SHA
+191A ; [.18CA.0020.0002.191A] # LIMBU LETTER SSA
+191B ; [.18CB.0020.0002.191B] # LIMBU LETTER SA
+191C ; [.18CC.0020.0002.191C] # LIMBU LETTER HA
+1920 ; [.18CD.0020.0002.1920] # LIMBU VOWEL SIGN A
+1921 ; [.18CE.0020.0002.1921] # LIMBU VOWEL SIGN I
+1922 ; [.18CF.0020.0002.1922] # LIMBU VOWEL SIGN U
+1923 ; [.18D0.0020.0002.1923] # LIMBU VOWEL SIGN EE
+1924 ; [.18D1.0020.0002.1924] # LIMBU VOWEL SIGN AI
+1925 ; [.18D2.0020.0002.1925] # LIMBU VOWEL SIGN OO
+1926 ; [.18D3.0020.0002.1926] # LIMBU VOWEL SIGN AU
+1927 ; [.18D4.0020.0002.1927] # LIMBU VOWEL SIGN E
+1928 ; [.18D5.0020.0002.1928] # LIMBU VOWEL SIGN O
+1929 ; [.18D6.0020.0002.1929] # LIMBU SUBJOINED LETTER YA
+192A ; [.18D7.0020.0002.192A] # LIMBU SUBJOINED LETTER RA
+192B ; [.18D8.0020.0002.192B] # LIMBU SUBJOINED LETTER WA
+1930 ; [.18D9.0020.0002.1930] # LIMBU SMALL LETTER KA
+1931 ; [.18DA.0020.0002.1931] # LIMBU SMALL LETTER NGA
+1932 ; [.18DB.0020.0002.1932] # LIMBU SMALL LETTER ANUSVARA
+1933 ; [.18DC.0020.0002.1933] # LIMBU SMALL LETTER TA
+1934 ; [.18DD.0020.0002.1934] # LIMBU SMALL LETTER NA
+1935 ; [.18DE.0020.0002.1935] # LIMBU SMALL LETTER PA
+1936 ; [.18DF.0020.0002.1936] # LIMBU SMALL LETTER MA
+1937 ; [.18E0.0020.0002.1937] # LIMBU SMALL LETTER RA
+1938 ; [.18E1.0020.0002.1938] # LIMBU SMALL LETTER LA
+1700 ; [.18E2.0020.0002.1700] # TAGALOG LETTER A
+1701 ; [.18E3.0020.0002.1701] # TAGALOG LETTER I
+1702 ; [.18E4.0020.0002.1702] # TAGALOG LETTER U
+1703 ; [.18E5.0020.0002.1703] # TAGALOG LETTER KA
+1704 ; [.18E6.0020.0002.1704] # TAGALOG LETTER GA
+1705 ; [.18E7.0020.0002.1705] # TAGALOG LETTER NGA
+1706 ; [.18E8.0020.0002.1706] # TAGALOG LETTER TA
+1707 ; [.18E9.0020.0002.1707] # TAGALOG LETTER DA
+1708 ; [.18EA.0020.0002.1708] # TAGALOG LETTER NA
+1709 ; [.18EB.0020.0002.1709] # TAGALOG LETTER PA
+170A ; [.18EC.0020.0002.170A] # TAGALOG LETTER BA
+170B ; [.18ED.0020.0002.170B] # TAGALOG LETTER MA
+170C ; [.18EE.0020.0002.170C] # TAGALOG LETTER YA
+170E ; [.18EF.0020.0002.170E] # TAGALOG LETTER LA
+170F ; [.18F0.0020.0002.170F] # TAGALOG LETTER WA
+1710 ; [.18F1.0020.0002.1710] # TAGALOG LETTER SA
+1711 ; [.18F2.0020.0002.1711] # TAGALOG LETTER HA
+1712 ; [.18F3.0020.0002.1712] # TAGALOG VOWEL SIGN I
+1713 ; [.18F4.0020.0002.1713] # TAGALOG VOWEL SIGN U
+1714 ; [.18F5.0020.0002.1714] # TAGALOG SIGN VIRAMA
+1720 ; [.18F6.0020.0002.1720] # HANUNOO LETTER A
+1721 ; [.18F7.0020.0002.1721] # HANUNOO LETTER I
+1722 ; [.18F8.0020.0002.1722] # HANUNOO LETTER U
+1723 ; [.18F9.0020.0002.1723] # HANUNOO LETTER KA
+1724 ; [.18FA.0020.0002.1724] # HANUNOO LETTER GA
+1725 ; [.18FB.0020.0002.1725] # HANUNOO LETTER NGA
+1726 ; [.18FC.0020.0002.1726] # HANUNOO LETTER TA
+1727 ; [.18FD.0020.0002.1727] # HANUNOO LETTER DA
+1728 ; [.18FE.0020.0002.1728] # HANUNOO LETTER NA
+1729 ; [.18FF.0020.0002.1729] # HANUNOO LETTER PA
+172A ; [.1900.0020.0002.172A] # HANUNOO LETTER BA
+172B ; [.1901.0020.0002.172B] # HANUNOO LETTER MA
+172C ; [.1902.0020.0002.172C] # HANUNOO LETTER YA
+172D ; [.1903.0020.0002.172D] # HANUNOO LETTER RA
+172E ; [.1904.0020.0002.172E] # HANUNOO LETTER LA
+172F ; [.1905.0020.0002.172F] # HANUNOO LETTER WA
+1730 ; [.1906.0020.0002.1730] # HANUNOO LETTER SA
+1731 ; [.1907.0020.0002.1731] # HANUNOO LETTER HA
+1732 ; [.1908.0020.0002.1732] # HANUNOO VOWEL SIGN I
+1733 ; [.1909.0020.0002.1733] # HANUNOO VOWEL SIGN U
+1734 ; [.190A.0020.0002.1734] # HANUNOO SIGN PAMUDPOD
+1740 ; [.190B.0020.0002.1740] # BUHID LETTER A
+1741 ; [.190C.0020.0002.1741] # BUHID LETTER I
+1742 ; [.190D.0020.0002.1742] # BUHID LETTER U
+1743 ; [.190E.0020.0002.1743] # BUHID LETTER KA
+1744 ; [.190F.0020.0002.1744] # BUHID LETTER GA
+1745 ; [.1910.0020.0002.1745] # BUHID LETTER NGA
+1746 ; [.1911.0020.0002.1746] # BUHID LETTER TA
+1747 ; [.1912.0020.0002.1747] # BUHID LETTER DA
+1748 ; [.1913.0020.0002.1748] # BUHID LETTER NA
+1749 ; [.1914.0020.0002.1749] # BUHID LETTER PA
+174A ; [.1915.0020.0002.174A] # BUHID LETTER BA
+174B ; [.1916.0020.0002.174B] # BUHID LETTER MA
+174C ; [.1917.0020.0002.174C] # BUHID LETTER YA
+174D ; [.1918.0020.0002.174D] # BUHID LETTER RA
+174E ; [.1919.0020.0002.174E] # BUHID LETTER LA
+174F ; [.191A.0020.0002.174F] # BUHID LETTER WA
+1750 ; [.191B.0020.0002.1750] # BUHID LETTER SA
+1751 ; [.191C.0020.0002.1751] # BUHID LETTER HA
+1752 ; [.191D.0020.0002.1752] # BUHID VOWEL SIGN I
+1753 ; [.191E.0020.0002.1753] # BUHID VOWEL SIGN U
+1760 ; [.191F.0020.0002.1760] # TAGBANWA LETTER A
+1761 ; [.1920.0020.0002.1761] # TAGBANWA LETTER I
+1762 ; [.1921.0020.0002.1762] # TAGBANWA LETTER U
+1763 ; [.1922.0020.0002.1763] # TAGBANWA LETTER KA
+1764 ; [.1923.0020.0002.1764] # TAGBANWA LETTER GA
+1765 ; [.1924.0020.0002.1765] # TAGBANWA LETTER NGA
+1766 ; [.1925.0020.0002.1766] # TAGBANWA LETTER TA
+1767 ; [.1926.0020.0002.1767] # TAGBANWA LETTER DA
+1768 ; [.1927.0020.0002.1768] # TAGBANWA LETTER NA
+1769 ; [.1928.0020.0002.1769] # TAGBANWA LETTER PA
+176A ; [.1929.0020.0002.176A] # TAGBANWA LETTER BA
+176B ; [.192A.0020.0002.176B] # TAGBANWA LETTER MA
+176C ; [.192B.0020.0002.176C] # TAGBANWA LETTER YA
+176E ; [.192C.0020.0002.176E] # TAGBANWA LETTER LA
+176F ; [.192D.0020.0002.176F] # TAGBANWA LETTER WA
+1770 ; [.192E.0020.0002.1770] # TAGBANWA LETTER SA
+1772 ; [.192F.0020.0002.1772] # TAGBANWA VOWEL SIGN I
+1773 ; [.1930.0020.0002.1773] # TAGBANWA VOWEL SIGN U
+1000 ; [.1931.0020.0002.1000] # MYANMAR LETTER KA
+1001 ; [.1932.0020.0002.1001] # MYANMAR LETTER KHA
+1002 ; [.1933.0020.0002.1002] # MYANMAR LETTER GA
+1003 ; [.1934.0020.0002.1003] # MYANMAR LETTER GHA
+1004 ; [.1935.0020.0002.1004] # MYANMAR LETTER NGA
+1005 ; [.1936.0020.0002.1005] # MYANMAR LETTER CA
+1006 ; [.1937.0020.0002.1006] # MYANMAR LETTER CHA
+1007 ; [.1938.0020.0002.1007] # MYANMAR LETTER JA
+1008 ; [.1939.0020.0002.1008] # MYANMAR LETTER JHA
+1009 ; [.193A.0020.0002.1009] # MYANMAR LETTER NYA
+100A ; [.193B.0020.0002.100A] # MYANMAR LETTER NNYA
+100B ; [.193C.0020.0002.100B] # MYANMAR LETTER TTA
+100C ; [.193D.0020.0002.100C] # MYANMAR LETTER TTHA
+100D ; [.193E.0020.0002.100D] # MYANMAR LETTER DDA
+100E ; [.193F.0020.0002.100E] # MYANMAR LETTER DDHA
+100F ; [.1940.0020.0002.100F] # MYANMAR LETTER NNA
+1010 ; [.1941.0020.0002.1010] # MYANMAR LETTER TA
+1011 ; [.1942.0020.0002.1011] # MYANMAR LETTER THA
+1012 ; [.1943.0020.0002.1012] # MYANMAR LETTER DA
+1013 ; [.1944.0020.0002.1013] # MYANMAR LETTER DHA
+1014 ; [.1945.0020.0002.1014] # MYANMAR LETTER NA
+1015 ; [.1946.0020.0002.1015] # MYANMAR LETTER PA
+1016 ; [.1947.0020.0002.1016] # MYANMAR LETTER PHA
+1017 ; [.1948.0020.0002.1017] # MYANMAR LETTER BA
+1018 ; [.1949.0020.0002.1018] # MYANMAR LETTER BHA
+1019 ; [.194A.0020.0002.1019] # MYANMAR LETTER MA
+101A ; [.194B.0020.0002.101A] # MYANMAR LETTER YA
+101B ; [.194C.0020.0002.101B] # MYANMAR LETTER RA
+101C ; [.194D.0020.0002.101C] # MYANMAR LETTER LA
+101D ; [.194E.0020.0002.101D] # MYANMAR LETTER WA
+1050 ; [.194F.0020.0002.1050] # MYANMAR LETTER SHA
+1051 ; [.1950.0020.0002.1051] # MYANMAR LETTER SSA
+101E ; [.1951.0020.0002.101E] # MYANMAR LETTER SA
+101F ; [.1952.0020.0002.101F] # MYANMAR LETTER HA
+1020 ; [.1953.0020.0002.1020] # MYANMAR LETTER LLA
+1021 ; [.1954.0020.0002.1021] # MYANMAR LETTER A
+1023 ; [.1955.0020.0002.1023] # MYANMAR LETTER I
+1024 ; [.1956.0020.0002.1024] # MYANMAR LETTER II
+1025 ; [.1957.0020.0002.1025] # MYANMAR LETTER U
+1026 ; [.1958.0020.0002.1026] # MYANMAR LETTER UU
+1025 102E ; [.1958.0020.0002.1026] # MYANMAR LETTER UU
+1027 ; [.1959.0020.0002.1027] # MYANMAR LETTER E
+1029 ; [.195A.0020.0002.1029] # MYANMAR LETTER O
+102A ; [.195B.0020.0002.102A] # MYANMAR LETTER AU
+1052 ; [.195C.0020.0002.1052] # MYANMAR LETTER VOCALIC R
+1053 ; [.195D.0020.0002.1053] # MYANMAR LETTER VOCALIC RR
+1054 ; [.195E.0020.0002.1054] # MYANMAR LETTER VOCALIC L
+1055 ; [.195F.0020.0002.1055] # MYANMAR LETTER VOCALIC LL
+102C ; [.1960.0020.0002.102C] # MYANMAR VOWEL SIGN AA
+102D ; [.1961.0020.0002.102D] # MYANMAR VOWEL SIGN I
+102E ; [.1962.0020.0002.102E] # MYANMAR VOWEL SIGN II
+102F ; [.1963.0020.0002.102F] # MYANMAR VOWEL SIGN U
+1030 ; [.1964.0020.0002.1030] # MYANMAR VOWEL SIGN UU
+1031 ; [.1965.0020.0002.1031] # MYANMAR VOWEL SIGN E
+1032 ; [.1966.0020.0002.1032] # MYANMAR VOWEL SIGN AI
+1056 ; [.1967.0020.0002.1056] # MYANMAR VOWEL SIGN VOCALIC R
+1057 ; [.1968.0020.0002.1057] # MYANMAR VOWEL SIGN VOCALIC RR
+1058 ; [.1969.0020.0002.1058] # MYANMAR VOWEL SIGN VOCALIC L
+1059 ; [.196A.0020.0002.1059] # MYANMAR VOWEL SIGN VOCALIC LL
+1039 ; [.196B.0020.0002.1039] # MYANMAR SIGN VIRAMA
+1780 ; [.196C.0020.0002.1780] # KHMER LETTER KA
+1781 ; [.196D.0020.0002.1781] # KHMER LETTER KHA
+1782 ; [.196E.0020.0002.1782] # KHMER LETTER KO
+1783 ; [.196F.0020.0002.1783] # KHMER LETTER KHO
+1784 ; [.1970.0020.0002.1784] # KHMER LETTER NGO
+1785 ; [.1971.0020.0002.1785] # KHMER LETTER CA
+1786 ; [.1972.0020.0002.1786] # KHMER LETTER CHA
+1787 ; [.1973.0020.0002.1787] # KHMER LETTER CO
+1788 ; [.1974.0020.0002.1788] # KHMER LETTER CHO
+1789 ; [.1975.0020.0002.1789] # KHMER LETTER NYO
+178A ; [.1976.0020.0002.178A] # KHMER LETTER DA
+178B ; [.1977.0020.0002.178B] # KHMER LETTER TTHA
+178C ; [.1978.0020.0002.178C] # KHMER LETTER DO
+178D ; [.1979.0020.0002.178D] # KHMER LETTER TTHO
+178E ; [.197A.0020.0002.178E] # KHMER LETTER NNO
+178F ; [.197B.0020.0002.178F] # KHMER LETTER TA
+1790 ; [.197C.0020.0002.1790] # KHMER LETTER THA
+1791 ; [.197D.0020.0002.1791] # KHMER LETTER TO
+1792 ; [.197E.0020.0002.1792] # KHMER LETTER THO
+1793 ; [.197F.0020.0002.1793] # KHMER LETTER NO
+1794 ; [.1980.0020.0002.1794] # KHMER LETTER BA
+1795 ; [.1981.0020.0002.1795] # KHMER LETTER PHA
+1796 ; [.1982.0020.0002.1796] # KHMER LETTER PO
+1797 ; [.1983.0020.0002.1797] # KHMER LETTER PHO
+1798 ; [.1984.0020.0002.1798] # KHMER LETTER MO
+1799 ; [.1985.0020.0002.1799] # KHMER LETTER YO
+179A ; [.1986.0020.0002.179A] # KHMER LETTER RO
+179B ; [.1987.0020.0002.179B] # KHMER LETTER LO
+179C ; [.1988.0020.0002.179C] # KHMER LETTER VO
+179D ; [.1989.0020.0002.179D] # KHMER LETTER SHA
+179E ; [.198A.0020.0002.179E] # KHMER LETTER SSO
+179F ; [.198B.0020.0002.179F] # KHMER LETTER SA
+17A0 ; [.198C.0020.0002.17A0] # KHMER LETTER HA
+17A1 ; [.198D.0020.0002.17A1] # KHMER LETTER LA
+17A2 ; [.198E.0020.0002.17A2] # KHMER LETTER QA
+17DC ; [.198F.0020.0002.17DC] # KHMER SIGN AVAKRAHASANYA
+17A3 ; [.1990.0020.0002.17A3] # KHMER INDEPENDENT VOWEL QAQ
+17A4 ; [.1991.0020.0002.17A4] # KHMER INDEPENDENT VOWEL QAA
+17A5 ; [.1992.0020.0002.17A5] # KHMER INDEPENDENT VOWEL QI
+17A6 ; [.1993.0020.0002.17A6] # KHMER INDEPENDENT VOWEL QII
+17A7 ; [.1994.0020.0002.17A7] # KHMER INDEPENDENT VOWEL QU
+17A8 ; [.1995.0020.0002.17A8] # KHMER INDEPENDENT VOWEL QUK
+17A9 ; [.1996.0020.0002.17A9] # KHMER INDEPENDENT VOWEL QUU
+17AA ; [.1997.0020.0002.17AA] # KHMER INDEPENDENT VOWEL QUUV
+17AB ; [.1998.0020.0002.17AB] # KHMER INDEPENDENT VOWEL RY
+17AC ; [.1999.0020.0002.17AC] # KHMER INDEPENDENT VOWEL RYY
+17AD ; [.199A.0020.0002.17AD] # KHMER INDEPENDENT VOWEL LY
+17AE ; [.199B.0020.0002.17AE] # KHMER INDEPENDENT VOWEL LYY
+17AF ; [.199C.0020.0002.17AF] # KHMER INDEPENDENT VOWEL QE
+17B0 ; [.199D.0020.0002.17B0] # KHMER INDEPENDENT VOWEL QAI
+17B1 ; [.199E.0020.0002.17B1] # KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2 ; [.199F.0020.0002.17B2] # KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3 ; [.19A0.0020.0002.17B3] # KHMER INDEPENDENT VOWEL QAU
+17B4 ; [.19A1.0020.0002.17B4] # KHMER VOWEL INHERENT AQ
+17B5 ; [.19A2.0020.0002.17B5] # KHMER VOWEL INHERENT AA
+17B6 ; [.19A3.0020.0002.17B6] # KHMER VOWEL SIGN AA
+17B7 ; [.19A4.0020.0002.17B7] # KHMER VOWEL SIGN I
+17B8 ; [.19A5.0020.0002.17B8] # KHMER VOWEL SIGN II
+17B9 ; [.19A6.0020.0002.17B9] # KHMER VOWEL SIGN Y
+17BA ; [.19A7.0020.0002.17BA] # KHMER VOWEL SIGN YY
+17BB ; [.19A8.0020.0002.17BB] # KHMER VOWEL SIGN U
+17BC ; [.19A9.0020.0002.17BC] # KHMER VOWEL SIGN UU
+17BD ; [.19AA.0020.0002.17BD] # KHMER VOWEL SIGN UA
+17BE ; [.19AB.0020.0002.17BE] # KHMER VOWEL SIGN OE
+17BF ; [.19AC.0020.0002.17BF] # KHMER VOWEL SIGN YA
+17C0 ; [.19AD.0020.0002.17C0] # KHMER VOWEL SIGN IE
+17C1 ; [.19AE.0020.0002.17C1] # KHMER VOWEL SIGN E
+17C2 ; [.19AF.0020.0002.17C2] # KHMER VOWEL SIGN AE
+17C3 ; [.19B0.0020.0002.17C3] # KHMER VOWEL SIGN AI
+17C4 ; [.19B1.0020.0002.17C4] # KHMER VOWEL SIGN OO
+17C5 ; [.19B2.0020.0002.17C5] # KHMER VOWEL SIGN AU
+17D2 ; [.19B3.0020.0002.17D2] # KHMER SIGN COENG
+1950 ; [.19B4.0020.0002.1950] # TAI LE LETTER KA
+1951 ; [.19B5.0020.0002.1951] # TAI LE LETTER XA
+1952 ; [.19B6.0020.0002.1952] # TAI LE LETTER NGA
+1953 ; [.19B7.0020.0002.1953] # TAI LE LETTER TSA
+1954 ; [.19B8.0020.0002.1954] # TAI LE LETTER SA
+1955 ; [.19B9.0020.0002.1955] # TAI LE LETTER YA
+1956 ; [.19BA.0020.0002.1956] # TAI LE LETTER TA
+1957 ; [.19BB.0020.0002.1957] # TAI LE LETTER THA
+1958 ; [.19BC.0020.0002.1958] # TAI LE LETTER LA
+1959 ; [.19BD.0020.0002.1959] # TAI LE LETTER PA
+195A ; [.19BE.0020.0002.195A] # TAI LE LETTER PHA
+195B ; [.19BF.0020.0002.195B] # TAI LE LETTER MA
+195C ; [.19C0.0020.0002.195C] # TAI LE LETTER FA
+195D ; [.19C1.0020.0002.195D] # TAI LE LETTER VA
+195E ; [.19C2.0020.0002.195E] # TAI LE LETTER HA
+195F ; [.19C3.0020.0002.195F] # TAI LE LETTER QA
+1960 ; [.19C4.0020.0002.1960] # TAI LE LETTER KHA
+1961 ; [.19C5.0020.0002.1961] # TAI LE LETTER TSHA
+1962 ; [.19C6.0020.0002.1962] # TAI LE LETTER NA
+1963 ; [.19C7.0020.0002.1963] # TAI LE LETTER A
+1964 ; [.19C8.0020.0002.1964] # TAI LE LETTER I
+1965 ; [.19C9.0020.0002.1965] # TAI LE LETTER EE
+1966 ; [.19CA.0020.0002.1966] # TAI LE LETTER EH
+1967 ; [.19CB.0020.0002.1967] # TAI LE LETTER U
+1968 ; [.19CC.0020.0002.1968] # TAI LE LETTER OO
+1969 ; [.19CD.0020.0002.1969] # TAI LE LETTER O
+196A ; [.19CE.0020.0002.196A] # TAI LE LETTER UE
+196B ; [.19CF.0020.0002.196B] # TAI LE LETTER E
+196C ; [.19D0.0020.0002.196C] # TAI LE LETTER AUE
+196D ; [.19D1.0020.0002.196D] # TAI LE LETTER AI
+1970 ; [.19D2.0020.0002.1970] # TAI LE LETTER TONE-2
+1971 ; [.19D3.0020.0002.1971] # TAI LE LETTER TONE-3
+1972 ; [.19D4.0020.0002.1972] # TAI LE LETTER TONE-4
+1973 ; [.19D5.0020.0002.1973] # TAI LE LETTER TONE-5
+1974 ; [.19D6.0020.0002.1974] # TAI LE LETTER TONE-6
+1880 ; [.19D7.0020.0002.1880] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881 ; [.19D8.0020.0002.1881] # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882 ; [.19D9.0020.0002.1882] # MONGOLIAN LETTER ALI GALI DAMARU
+1883 ; [.19DA.0020.0002.1883] # MONGOLIAN LETTER ALI GALI UBADAMA
+1884 ; [.19DB.0020.0002.1884] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885 ; [.19DC.0020.0002.1885] # MONGOLIAN LETTER ALI GALI BALUDA
+1886 ; [.19DD.0020.0002.1886] # MONGOLIAN LETTER ALI GALI THREE BALUDA
+1843 ; [.19DE.0020.0002.1843] # MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1820 ; [.19DF.0020.0002.1820] # MONGOLIAN LETTER A
+1887 ; [.19E0.0020.0002.1887] # MONGOLIAN LETTER ALI GALI A
+1821 ; [.19E1.0020.0002.1821] # MONGOLIAN LETTER E
+1844 ; [.19E2.0020.0002.1844] # MONGOLIAN LETTER TODO E
+185D ; [.19E3.0020.0002.185D] # MONGOLIAN LETTER SIBE E
+1822 ; [.19E4.0020.0002.1822] # MONGOLIAN LETTER I
+1845 ; [.19E5.0020.0002.1845] # MONGOLIAN LETTER TODO I
+185E ; [.19E6.0020.0002.185E] # MONGOLIAN LETTER SIBE I
+1873 ; [.19E7.0020.0002.1873] # MONGOLIAN LETTER MANCHU I
+1888 ; [.19E8.0020.0002.1888] # MONGOLIAN LETTER ALI GALI I
+185F ; [.19E9.0020.0002.185F] # MONGOLIAN LETTER SIBE IY
+1823 ; [.19EA.0020.0002.1823] # MONGOLIAN LETTER O
+1846 ; [.19EB.0020.0002.1846] # MONGOLIAN LETTER TODO O
+1824 ; [.19EC.0020.0002.1824] # MONGOLIAN LETTER U
+1847 ; [.19ED.0020.0002.1847] # MONGOLIAN LETTER TODO U
+1861 ; [.19EE.0020.0002.1861] # MONGOLIAN LETTER SIBE U
+1825 ; [.19EF.0020.0002.1825] # MONGOLIAN LETTER OE
+1848 ; [.19F0.0020.0002.1848] # MONGOLIAN LETTER TODO OE
+1826 ; [.19F1.0020.0002.1826] # MONGOLIAN LETTER UE
+1849 ; [.19F2.0020.0002.1849] # MONGOLIAN LETTER TODO UE
+1860 ; [.19F3.0020.0002.1860] # MONGOLIAN LETTER SIBE UE
+1827 ; [.19F4.0020.0002.1827] # MONGOLIAN LETTER EE
+1828 ; [.19F5.0020.0002.1828] # MONGOLIAN LETTER NA
+1829 ; [.19F6.0020.0002.1829] # MONGOLIAN LETTER ANG
+184A ; [.19F7.0020.0002.184A] # MONGOLIAN LETTER TODO ANG
+1862 ; [.19F8.0020.0002.1862] # MONGOLIAN LETTER SIBE ANG
+188A ; [.19F9.0020.0002.188A] # MONGOLIAN LETTER ALI GALI NGA
+189B ; [.19FA.0020.0002.189B] # MONGOLIAN LETTER MANCHU ALI GALI NGA
+182A ; [.19FB.0020.0002.182A] # MONGOLIAN LETTER BA
+184B ; [.19FC.0020.0002.184B] # MONGOLIAN LETTER TODO BA
+182B ; [.19FD.0020.0002.182B] # MONGOLIAN LETTER PA
+184C ; [.19FE.0020.0002.184C] # MONGOLIAN LETTER TODO PA
+1866 ; [.19FF.0020.0002.1866] # MONGOLIAN LETTER SIBE PA
+182C ; [.1A00.0020.0002.182C] # MONGOLIAN LETTER QA
+184D ; [.1A01.0020.0002.184D] # MONGOLIAN LETTER TODO QA
+182D ; [.1A02.0020.0002.182D] # MONGOLIAN LETTER GA
+184E ; [.1A03.0020.0002.184E] # MONGOLIAN LETTER TODO GA
+1864 ; [.1A04.0020.0002.1864] # MONGOLIAN LETTER SIBE GA
+189A ; [.1A05.0020.0002.189A] # MONGOLIAN LETTER MANCHU ALI GALI GHA
+1865 ; [.1A06.0020.0002.1865] # MONGOLIAN LETTER SIBE HA
+182E ; [.1A07.0020.0002.182E] # MONGOLIAN LETTER MA
+184F ; [.1A08.0020.0002.184F] # MONGOLIAN LETTER TODO MA
+182F ; [.1A09.0020.0002.182F] # MONGOLIAN LETTER LA
+1830 ; [.1A0A.0020.0002.1830] # MONGOLIAN LETTER SA
+1831 ; [.1A0B.0020.0002.1831] # MONGOLIAN LETTER SHA
+1867 ; [.1A0C.0020.0002.1867] # MONGOLIAN LETTER SIBE SHA
+189C ; [.1A0D.0020.0002.189C] # MONGOLIAN LETTER MANCHU ALI GALI CA
+189D ; [.1A0E.0020.0002.189D] # MONGOLIAN LETTER MANCHU ALI GALI JHA
+18A2 ; [.1A0F.0020.0002.18A2] # MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A4 ; [.1A10.0020.0002.18A4] # MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5 ; [.1A11.0020.0002.18A5] # MONGOLIAN LETTER MANCHU ALI GALI ZA
+1832 ; [.1A12.0020.0002.1832] # MONGOLIAN LETTER TA
+1850 ; [.1A13.0020.0002.1850] # MONGOLIAN LETTER TODO TA
+1868 ; [.1A14.0020.0002.1868] # MONGOLIAN LETTER SIBE TA
+1833 ; [.1A15.0020.0002.1833] # MONGOLIAN LETTER DA
+1851 ; [.1A16.0020.0002.1851] # MONGOLIAN LETTER TODO DA
+1869 ; [.1A17.0020.0002.1869] # MONGOLIAN LETTER SIBE DA
+1834 ; [.1A18.0020.0002.1834] # MONGOLIAN LETTER CHA
+1852 ; [.1A19.0020.0002.1852] # MONGOLIAN LETTER TODO CHA
+1871 ; [.1A1A.0020.0002.1871] # MONGOLIAN LETTER SIBE CHA
+185C ; [.1A1B.0020.0002.185C] # MONGOLIAN LETTER TODO DZA
+188B ; [.1A1C.0020.0002.188B] # MONGOLIAN LETTER ALI GALI CA
+1835 ; [.1A1D.0020.0002.1835] # MONGOLIAN LETTER JA
+1853 ; [.1A1E.0020.0002.1853] # MONGOLIAN LETTER TODO JA
+186A ; [.1A1F.0020.0002.186A] # MONGOLIAN LETTER SIBE JA
+1877 ; [.1A20.0020.0002.1877] # MONGOLIAN LETTER MANCHU ZHA
+1836 ; [.1A21.0020.0002.1836] # MONGOLIAN LETTER YA
+1855 ; [.1A22.0020.0002.1855] # MONGOLIAN LETTER TODO YA
+1872 ; [.1A23.0020.0002.1872] # MONGOLIAN LETTER SIBE ZHA
+1837 ; [.1A24.0020.0002.1837] # MONGOLIAN LETTER RA
+1875 ; [.1A25.0020.0002.1875] # MONGOLIAN LETTER MANCHU RA
+1838 ; [.1A26.0020.0002.1838] # MONGOLIAN LETTER WA
+1856 ; [.1A27.0020.0002.1856] # MONGOLIAN LETTER TODO WA
+1839 ; [.1A28.0020.0002.1839] # MONGOLIAN LETTER FA
+186B ; [.1A29.0020.0002.186B] # MONGOLIAN LETTER SIBE FA
+1876 ; [.1A2A.0020.0002.1876] # MONGOLIAN LETTER MANCHU FA
+183A ; [.1A2B.0020.0002.183A] # MONGOLIAN LETTER KA
+1857 ; [.1A2C.0020.0002.1857] # MONGOLIAN LETTER TODO KA
+1863 ; [.1A2D.0020.0002.1863] # MONGOLIAN LETTER SIBE KA
+1874 ; [.1A2E.0020.0002.1874] # MONGOLIAN LETTER MANCHU KA
+1889 ; [.1A2F.0020.0002.1889] # MONGOLIAN LETTER ALI GALI KA
+183B ; [.1A30.0020.0002.183B] # MONGOLIAN LETTER KHA
+183C ; [.1A31.0020.0002.183C] # MONGOLIAN LETTER TSA
+1854 ; [.1A32.0020.0002.1854] # MONGOLIAN LETTER TODO TSA
+186E ; [.1A33.0020.0002.186E] # MONGOLIAN LETTER SIBE TSA
+183D ; [.1A34.0020.0002.183D] # MONGOLIAN LETTER ZA
+186F ; [.1A35.0020.0002.186F] # MONGOLIAN LETTER SIBE ZA
+1858 ; [.1A36.0020.0002.1858] # MONGOLIAN LETTER TODO GAA
+186C ; [.1A37.0020.0002.186C] # MONGOLIAN LETTER SIBE GAA
+183E ; [.1A38.0020.0002.183E] # MONGOLIAN LETTER HAA
+1859 ; [.1A39.0020.0002.1859] # MONGOLIAN LETTER TODO HAA
+186D ; [.1A3A.0020.0002.186D] # MONGOLIAN LETTER SIBE HAA
+183F ; [.1A3B.0020.0002.183F] # MONGOLIAN LETTER ZRA
+1840 ; [.1A3C.0020.0002.1840] # MONGOLIAN LETTER LHA
+1841 ; [.1A3D.0020.0002.1841] # MONGOLIAN LETTER ZHI
+1842 ; [.1A3E.0020.0002.1842] # MONGOLIAN LETTER CHI
+185A ; [.1A3F.0020.0002.185A] # MONGOLIAN LETTER TODO JIA
+185B ; [.1A40.0020.0002.185B] # MONGOLIAN LETTER TODO NIA
+1870 ; [.1A41.0020.0002.1870] # MONGOLIAN LETTER SIBE RAA
+188C ; [.1A42.0020.0002.188C] # MONGOLIAN LETTER ALI GALI TTA
+189E ; [.1A43.0020.0002.189E] # MONGOLIAN LETTER MANCHU ALI GALI TTA
+188D ; [.1A44.0020.0002.188D] # MONGOLIAN LETTER ALI GALI TTHA
+188E ; [.1A45.0020.0002.188E] # MONGOLIAN LETTER ALI GALI DDA
+189F ; [.1A46.0020.0002.189F] # MONGOLIAN LETTER MANCHU ALI GALI DDHA
+188F ; [.1A47.0020.0002.188F] # MONGOLIAN LETTER ALI GALI NNA
+1890 ; [.1A48.0020.0002.1890] # MONGOLIAN LETTER ALI GALI TA
+1898 ; [.1A49.0020.0002.1898] # MONGOLIAN LETTER TODO ALI GALI TA
+18A0 ; [.1A4A.0020.0002.18A0] # MONGOLIAN LETTER MANCHU ALI GALI TA
+1891 ; [.1A4B.0020.0002.1891] # MONGOLIAN LETTER ALI GALI DA
+18A1 ; [.1A4C.0020.0002.18A1] # MONGOLIAN LETTER MANCHU ALI GALI DHA
+1892 ; [.1A4D.0020.0002.1892] # MONGOLIAN LETTER ALI GALI PA
+1893 ; [.1A4E.0020.0002.1893] # MONGOLIAN LETTER ALI GALI PHA
+18A8 ; [.1A4F.0020.0002.18A8] # MONGOLIAN LETTER MANCHU ALI GALI BHA
+1894 ; [.1A50.0020.0002.1894] # MONGOLIAN LETTER ALI GALI SSA
+18A3 ; [.1A51.0020.0002.18A3] # MONGOLIAN LETTER MANCHU ALI GALI CYA
+1895 ; [.1A52.0020.0002.1895] # MONGOLIAN LETTER ALI GALI ZHA
+1899 ; [.1A53.0020.0002.1899] # MONGOLIAN LETTER TODO ALI GALI ZHA
+1896 ; [.1A54.0020.0002.1896] # MONGOLIAN LETTER ALI GALI ZA
+1897 ; [.1A55.0020.0002.1897] # MONGOLIAN LETTER ALI GALI AH
+18A6 ; [.1A56.0020.0002.18A6] # MONGOLIAN LETTER ALI GALI HALF U
+18A7 ; [.1A57.0020.0002.18A7] # MONGOLIAN LETTER ALI GALI HALF YA
+18A9 ; [.1A58.0020.0002.18A9] # MONGOLIAN LETTER ALI GALI DAGALGA
+13A0 ; [.1A59.0020.0002.13A0] # CHEROKEE LETTER A
+13A1 ; [.1A5A.0020.0002.13A1] # CHEROKEE LETTER E
+13A2 ; [.1A5B.0020.0002.13A2] # CHEROKEE LETTER I
+13A3 ; [.1A5C.0020.0002.13A3] # CHEROKEE LETTER O
+13A4 ; [.1A5D.0020.0002.13A4] # CHEROKEE LETTER U
+13A5 ; [.1A5E.0020.0002.13A5] # CHEROKEE LETTER V
+13A6 ; [.1A5F.0020.0002.13A6] # CHEROKEE LETTER GA
+13A7 ; [.1A60.0020.0002.13A7] # CHEROKEE LETTER KA
+13A8 ; [.1A61.0020.0002.13A8] # CHEROKEE LETTER GE
+13A9 ; [.1A62.0020.0002.13A9] # CHEROKEE LETTER GI
+13AA ; [.1A63.0020.0002.13AA] # CHEROKEE LETTER GO
+13AB ; [.1A64.0020.0002.13AB] # CHEROKEE LETTER GU
+13AC ; [.1A65.0020.0002.13AC] # CHEROKEE LETTER GV
+13AD ; [.1A66.0020.0002.13AD] # CHEROKEE LETTER HA
+13AE ; [.1A67.0020.0002.13AE] # CHEROKEE LETTER HE
+13AF ; [.1A68.0020.0002.13AF] # CHEROKEE LETTER HI
+13B0 ; [.1A69.0020.0002.13B0] # CHEROKEE LETTER HO
+13B1 ; [.1A6A.0020.0002.13B1] # CHEROKEE LETTER HU
+13B2 ; [.1A6B.0020.0002.13B2] # CHEROKEE LETTER HV
+13B3 ; [.1A6C.0020.0002.13B3] # CHEROKEE LETTER LA
+13B4 ; [.1A6D.0020.0002.13B4] # CHEROKEE LETTER LE
+13B5 ; [.1A6E.0020.0002.13B5] # CHEROKEE LETTER LI
+13B6 ; [.1A6F.0020.0002.13B6] # CHEROKEE LETTER LO
+13B7 ; [.1A70.0020.0002.13B7] # CHEROKEE LETTER LU
+13B8 ; [.1A71.0020.0002.13B8] # CHEROKEE LETTER LV
+13B9 ; [.1A72.0020.0002.13B9] # CHEROKEE LETTER MA
+13BA ; [.1A73.0020.0002.13BA] # CHEROKEE LETTER ME
+13BB ; [.1A74.0020.0002.13BB] # CHEROKEE LETTER MI
+13BC ; [.1A75.0020.0002.13BC] # CHEROKEE LETTER MO
+13BD ; [.1A76.0020.0002.13BD] # CHEROKEE LETTER MU
+13BE ; [.1A77.0020.0002.13BE] # CHEROKEE LETTER NA
+13BF ; [.1A78.0020.0002.13BF] # CHEROKEE LETTER HNA
+13C0 ; [.1A79.0020.0002.13C0] # CHEROKEE LETTER NAH
+13C1 ; [.1A7A.0020.0002.13C1] # CHEROKEE LETTER NE
+13C2 ; [.1A7B.0020.0002.13C2] # CHEROKEE LETTER NI
+13C3 ; [.1A7C.0020.0002.13C3] # CHEROKEE LETTER NO
+13C4 ; [.1A7D.0020.0002.13C4] # CHEROKEE LETTER NU
+13C5 ; [.1A7E.0020.0002.13C5] # CHEROKEE LETTER NV
+13C6 ; [.1A7F.0020.0002.13C6] # CHEROKEE LETTER QUA
+13C7 ; [.1A80.0020.0002.13C7] # CHEROKEE LETTER QUE
+13C8 ; [.1A81.0020.0002.13C8] # CHEROKEE LETTER QUI
+13C9 ; [.1A82.0020.0002.13C9] # CHEROKEE LETTER QUO
+13CA ; [.1A83.0020.0002.13CA] # CHEROKEE LETTER QUU
+13CB ; [.1A84.0020.0002.13CB] # CHEROKEE LETTER QUV
+13CC ; [.1A85.0020.0002.13CC] # CHEROKEE LETTER SA
+13CD ; [.1A86.0020.0002.13CD] # CHEROKEE LETTER S
+13CE ; [.1A87.0020.0002.13CE] # CHEROKEE LETTER SE
+13CF ; [.1A88.0020.0002.13CF] # CHEROKEE LETTER SI
+13D0 ; [.1A89.0020.0002.13D0] # CHEROKEE LETTER SO
+13D1 ; [.1A8A.0020.0002.13D1] # CHEROKEE LETTER SU
+13D2 ; [.1A8B.0020.0002.13D2] # CHEROKEE LETTER SV
+13D3 ; [.1A8C.0020.0002.13D3] # CHEROKEE LETTER DA
+13D4 ; [.1A8D.0020.0002.13D4] # CHEROKEE LETTER TA
+13D5 ; [.1A8E.0020.0002.13D5] # CHEROKEE LETTER DE
+13D6 ; [.1A8F.0020.0002.13D6] # CHEROKEE LETTER TE
+13D7 ; [.1A90.0020.0002.13D7] # CHEROKEE LETTER DI
+13D8 ; [.1A91.0020.0002.13D8] # CHEROKEE LETTER TI
+13D9 ; [.1A92.0020.0002.13D9] # CHEROKEE LETTER DO
+13DA ; [.1A93.0020.0002.13DA] # CHEROKEE LETTER DU
+13DB ; [.1A94.0020.0002.13DB] # CHEROKEE LETTER DV
+13DC ; [.1A95.0020.0002.13DC] # CHEROKEE LETTER DLA
+13DD ; [.1A96.0020.0002.13DD] # CHEROKEE LETTER TLA
+13DE ; [.1A97.0020.0002.13DE] # CHEROKEE LETTER TLE
+13DF ; [.1A98.0020.0002.13DF] # CHEROKEE LETTER TLI
+13E0 ; [.1A99.0020.0002.13E0] # CHEROKEE LETTER TLO
+13E1 ; [.1A9A.0020.0002.13E1] # CHEROKEE LETTER TLU
+13E2 ; [.1A9B.0020.0002.13E2] # CHEROKEE LETTER TLV
+13E3 ; [.1A9C.0020.0002.13E3] # CHEROKEE LETTER TSA
+13E4 ; [.1A9D.0020.0002.13E4] # CHEROKEE LETTER TSE
+13E5 ; [.1A9E.0020.0002.13E5] # CHEROKEE LETTER TSI
+13E6 ; [.1A9F.0020.0002.13E6] # CHEROKEE LETTER TSO
+13E7 ; [.1AA0.0020.0002.13E7] # CHEROKEE LETTER TSU
+13E8 ; [.1AA1.0020.0002.13E8] # CHEROKEE LETTER TSV
+13E9 ; [.1AA2.0020.0002.13E9] # CHEROKEE LETTER WA
+13EA ; [.1AA3.0020.0002.13EA] # CHEROKEE LETTER WE
+13EB ; [.1AA4.0020.0002.13EB] # CHEROKEE LETTER WI
+13EC ; [.1AA5.0020.0002.13EC] # CHEROKEE LETTER WO
+13ED ; [.1AA6.0020.0002.13ED] # CHEROKEE LETTER WU
+13EE ; [.1AA7.0020.0002.13EE] # CHEROKEE LETTER WV
+13EF ; [.1AA8.0020.0002.13EF] # CHEROKEE LETTER YA
+13F0 ; [.1AA9.0020.0002.13F0] # CHEROKEE LETTER YE
+13F1 ; [.1AAA.0020.0002.13F1] # CHEROKEE LETTER YI
+13F2 ; [.1AAB.0020.0002.13F2] # CHEROKEE LETTER YO
+13F3 ; [.1AAC.0020.0002.13F3] # CHEROKEE LETTER YU
+13F4 ; [.1AAD.0020.0002.13F4] # CHEROKEE LETTER YV
+1401 ; [.1AAE.0020.0002.1401] # CANADIAN SYLLABICS E
+1402 ; [.1AAF.0020.0002.1402] # CANADIAN SYLLABICS AAI
+1403 ; [.1AB0.0020.0002.1403] # CANADIAN SYLLABICS I
+1404 ; [.1AB1.0020.0002.1404] # CANADIAN SYLLABICS II
+1405 ; [.1AB2.0020.0002.1405] # CANADIAN SYLLABICS O
+1406 ; [.1AB3.0020.0002.1406] # CANADIAN SYLLABICS OO
+1407 ; [.1AB4.0020.0002.1407] # CANADIAN SYLLABICS Y-CREE OO
+1408 ; [.1AB5.0020.0002.1408] # CANADIAN SYLLABICS CARRIER EE
+1409 ; [.1AB6.0020.0002.1409] # CANADIAN SYLLABICS CARRIER I
+140A ; [.1AB7.0020.0002.140A] # CANADIAN SYLLABICS A
+140B ; [.1AB8.0020.0002.140B] # CANADIAN SYLLABICS AA
+140C ; [.1AB9.0020.0002.140C] # CANADIAN SYLLABICS WE
+140D ; [.1ABA.0020.0002.140D] # CANADIAN SYLLABICS WEST-CREE WE
+140E ; [.1ABB.0020.0002.140E] # CANADIAN SYLLABICS WI
+140F ; [.1ABC.0020.0002.140F] # CANADIAN SYLLABICS WEST-CREE WI
+1410 ; [.1ABD.0020.0002.1410] # CANADIAN SYLLABICS WII
+1411 ; [.1ABE.0020.0002.1411] # CANADIAN SYLLABICS WEST-CREE WII
+1412 ; [.1ABF.0020.0002.1412] # CANADIAN SYLLABICS WO
+1413 ; [.1AC0.0020.0002.1413] # CANADIAN SYLLABICS WEST-CREE WO
+1414 ; [.1AC1.0020.0002.1414] # CANADIAN SYLLABICS WOO
+1415 ; [.1AC2.0020.0002.1415] # CANADIAN SYLLABICS WEST-CREE WOO
+1416 ; [.1AC3.0020.0002.1416] # CANADIAN SYLLABICS NASKAPI WOO
+1417 ; [.1AC4.0020.0002.1417] # CANADIAN SYLLABICS WA
+1418 ; [.1AC5.0020.0002.1418] # CANADIAN SYLLABICS WEST-CREE WA
+1419 ; [.1AC6.0020.0002.1419] # CANADIAN SYLLABICS WAA
+141A ; [.1AC7.0020.0002.141A] # CANADIAN SYLLABICS WEST-CREE WAA
+141B ; [.1AC8.0020.0002.141B] # CANADIAN SYLLABICS NASKAPI WAA
+141C ; [.1AC9.0020.0002.141C] # CANADIAN SYLLABICS AI
+141D ; [.1ACA.0020.0002.141D] # CANADIAN SYLLABICS Y-CREE W
+141E ; [.1ACB.0020.0002.141E] # CANADIAN SYLLABICS GLOTTAL STOP
+141F ; [.1ACC.0020.0002.141F] # CANADIAN SYLLABICS FINAL ACUTE
+1420 ; [.1ACD.0020.0002.1420] # CANADIAN SYLLABICS FINAL GRAVE
+1421 ; [.1ACE.0020.0002.1421] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422 ; [.1ACF.0020.0002.1422] # CANADIAN SYLLABICS FINAL TOP HALF RING
+1423 ; [.1AD0.0020.0002.1423] # CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424 ; [.1AD1.0020.0002.1424] # CANADIAN SYLLABICS FINAL RING
+1425 ; [.1AD2.0020.0002.1425] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426 ; [.1AD3.0020.0002.1426] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427 ; [.1AD4.0020.0002.1427] # CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428 ; [.1AD5.0020.0002.1428] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429 ; [.1AD6.0020.0002.1429] # CANADIAN SYLLABICS FINAL PLUS
+142A ; [.1AD7.0020.0002.142A] # CANADIAN SYLLABICS FINAL DOWN TACK
+142B ; [.1AD8.0020.0002.142B] # CANADIAN SYLLABICS EN
+142C ; [.1AD9.0020.0002.142C] # CANADIAN SYLLABICS IN
+142D ; [.1ADA.0020.0002.142D] # CANADIAN SYLLABICS ON
+142E ; [.1ADB.0020.0002.142E] # CANADIAN SYLLABICS AN
+142F ; [.1ADC.0020.0002.142F] # CANADIAN SYLLABICS PE
+1430 ; [.1ADD.0020.0002.1430] # CANADIAN SYLLABICS PAAI
+1431 ; [.1ADE.0020.0002.1431] # CANADIAN SYLLABICS PI
+1432 ; [.1ADF.0020.0002.1432] # CANADIAN SYLLABICS PII
+1433 ; [.1AE0.0020.0002.1433] # CANADIAN SYLLABICS PO
+1434 ; [.1AE1.0020.0002.1434] # CANADIAN SYLLABICS POO
+1435 ; [.1AE2.0020.0002.1435] # CANADIAN SYLLABICS Y-CREE POO
+1436 ; [.1AE3.0020.0002.1436] # CANADIAN SYLLABICS CARRIER HEE
+1437 ; [.1AE4.0020.0002.1437] # CANADIAN SYLLABICS CARRIER HI
+1438 ; [.1AE5.0020.0002.1438] # CANADIAN SYLLABICS PA
+1439 ; [.1AE6.0020.0002.1439] # CANADIAN SYLLABICS PAA
+143A ; [.1AE7.0020.0002.143A] # CANADIAN SYLLABICS PWE
+143B ; [.1AE8.0020.0002.143B] # CANADIAN SYLLABICS WEST-CREE PWE
+143C ; [.1AE9.0020.0002.143C] # CANADIAN SYLLABICS PWI
+143D ; [.1AEA.0020.0002.143D] # CANADIAN SYLLABICS WEST-CREE PWI
+143E ; [.1AEB.0020.0002.143E] # CANADIAN SYLLABICS PWII
+143F ; [.1AEC.0020.0002.143F] # CANADIAN SYLLABICS WEST-CREE PWII
+1440 ; [.1AED.0020.0002.1440] # CANADIAN SYLLABICS PWO
+1441 ; [.1AEE.0020.0002.1441] # CANADIAN SYLLABICS WEST-CREE PWO
+1442 ; [.1AEF.0020.0002.1442] # CANADIAN SYLLABICS PWOO
+1443 ; [.1AF0.0020.0002.1443] # CANADIAN SYLLABICS WEST-CREE PWOO
+1444 ; [.1AF1.0020.0002.1444] # CANADIAN SYLLABICS PWA
+1445 ; [.1AF2.0020.0002.1445] # CANADIAN SYLLABICS WEST-CREE PWA
+1446 ; [.1AF3.0020.0002.1446] # CANADIAN SYLLABICS PWAA
+1447 ; [.1AF4.0020.0002.1447] # CANADIAN SYLLABICS WEST-CREE PWAA
+1448 ; [.1AF5.0020.0002.1448] # CANADIAN SYLLABICS Y-CREE PWAA
+1449 ; [.1AF6.0020.0002.1449] # CANADIAN SYLLABICS P
+144A ; [.1AF7.0020.0002.144A] # CANADIAN SYLLABICS WEST-CREE P
+144B ; [.1AF8.0020.0002.144B] # CANADIAN SYLLABICS CARRIER H
+144C ; [.1AF9.0020.0002.144C] # CANADIAN SYLLABICS TE
+144D ; [.1AFA.0020.0002.144D] # CANADIAN SYLLABICS TAAI
+144E ; [.1AFB.0020.0002.144E] # CANADIAN SYLLABICS TI
+144F ; [.1AFC.0020.0002.144F] # CANADIAN SYLLABICS TII
+1450 ; [.1AFD.0020.0002.1450] # CANADIAN SYLLABICS TO
+1451 ; [.1AFE.0020.0002.1451] # CANADIAN SYLLABICS TOO
+1452 ; [.1AFF.0020.0002.1452] # CANADIAN SYLLABICS Y-CREE TOO
+1453 ; [.1B00.0020.0002.1453] # CANADIAN SYLLABICS CARRIER DEE
+1454 ; [.1B01.0020.0002.1454] # CANADIAN SYLLABICS CARRIER DI
+1455 ; [.1B02.0020.0002.1455] # CANADIAN SYLLABICS TA
+1456 ; [.1B03.0020.0002.1456] # CANADIAN SYLLABICS TAA
+1457 ; [.1B04.0020.0002.1457] # CANADIAN SYLLABICS TWE
+1458 ; [.1B05.0020.0002.1458] # CANADIAN SYLLABICS WEST-CREE TWE
+1459 ; [.1B06.0020.0002.1459] # CANADIAN SYLLABICS TWI
+145A ; [.1B07.0020.0002.145A] # CANADIAN SYLLABICS WEST-CREE TWI
+145B ; [.1B08.0020.0002.145B] # CANADIAN SYLLABICS TWII
+145C ; [.1B09.0020.0002.145C] # CANADIAN SYLLABICS WEST-CREE TWII
+145D ; [.1B0A.0020.0002.145D] # CANADIAN SYLLABICS TWO
+145E ; [.1B0B.0020.0002.145E] # CANADIAN SYLLABICS WEST-CREE TWO
+145F ; [.1B0C.0020.0002.145F] # CANADIAN SYLLABICS TWOO
+1460 ; [.1B0D.0020.0002.1460] # CANADIAN SYLLABICS WEST-CREE TWOO
+1461 ; [.1B0E.0020.0002.1461] # CANADIAN SYLLABICS TWA
+1462 ; [.1B0F.0020.0002.1462] # CANADIAN SYLLABICS WEST-CREE TWA
+1463 ; [.1B10.0020.0002.1463] # CANADIAN SYLLABICS TWAA
+1464 ; [.1B11.0020.0002.1464] # CANADIAN SYLLABICS WEST-CREE TWAA
+1465 ; [.1B12.0020.0002.1465] # CANADIAN SYLLABICS NASKAPI TWAA
+1466 ; [.1B13.0020.0002.1466] # CANADIAN SYLLABICS T
+1467 ; [.1B14.0020.0002.1467] # CANADIAN SYLLABICS TTE
+1468 ; [.1B15.0020.0002.1468] # CANADIAN SYLLABICS TTI
+1469 ; [.1B16.0020.0002.1469] # CANADIAN SYLLABICS TTO
+146A ; [.1B17.0020.0002.146A] # CANADIAN SYLLABICS TTA
+146B ; [.1B18.0020.0002.146B] # CANADIAN SYLLABICS KE
+146C ; [.1B19.0020.0002.146C] # CANADIAN SYLLABICS KAAI
+146D ; [.1B1A.0020.0002.146D] # CANADIAN SYLLABICS KI
+146E ; [.1B1B.0020.0002.146E] # CANADIAN SYLLABICS KII
+146F ; [.1B1C.0020.0002.146F] # CANADIAN SYLLABICS KO
+1470 ; [.1B1D.0020.0002.1470] # CANADIAN SYLLABICS KOO
+1471 ; [.1B1E.0020.0002.1471] # CANADIAN SYLLABICS Y-CREE KOO
+1472 ; [.1B1F.0020.0002.1472] # CANADIAN SYLLABICS KA
+1473 ; [.1B20.0020.0002.1473] # CANADIAN SYLLABICS KAA
+1474 ; [.1B21.0020.0002.1474] # CANADIAN SYLLABICS KWE
+1475 ; [.1B22.0020.0002.1475] # CANADIAN SYLLABICS WEST-CREE KWE
+1476 ; [.1B23.0020.0002.1476] # CANADIAN SYLLABICS KWI
+1477 ; [.1B24.0020.0002.1477] # CANADIAN SYLLABICS WEST-CREE KWI
+1478 ; [.1B25.0020.0002.1478] # CANADIAN SYLLABICS KWII
+1479 ; [.1B26.0020.0002.1479] # CANADIAN SYLLABICS WEST-CREE KWII
+147A ; [.1B27.0020.0002.147A] # CANADIAN SYLLABICS KWO
+147B ; [.1B28.0020.0002.147B] # CANADIAN SYLLABICS WEST-CREE KWO
+147C ; [.1B29.0020.0002.147C] # CANADIAN SYLLABICS KWOO
+147D ; [.1B2A.0020.0002.147D] # CANADIAN SYLLABICS WEST-CREE KWOO
+147E ; [.1B2B.0020.0002.147E] # CANADIAN SYLLABICS KWA
+147F ; [.1B2C.0020.0002.147F] # CANADIAN SYLLABICS WEST-CREE KWA
+1480 ; [.1B2D.0020.0002.1480] # CANADIAN SYLLABICS KWAA
+1481 ; [.1B2E.0020.0002.1481] # CANADIAN SYLLABICS WEST-CREE KWAA
+1482 ; [.1B2F.0020.0002.1482] # CANADIAN SYLLABICS NASKAPI KWAA
+1483 ; [.1B30.0020.0002.1483] # CANADIAN SYLLABICS K
+1484 ; [.1B31.0020.0002.1484] # CANADIAN SYLLABICS KW
+1485 ; [.1B32.0020.0002.1485] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486 ; [.1B33.0020.0002.1486] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487 ; [.1B34.0020.0002.1487] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488 ; [.1B35.0020.0002.1488] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489 ; [.1B36.0020.0002.1489] # CANADIAN SYLLABICS CE
+148A ; [.1B37.0020.0002.148A] # CANADIAN SYLLABICS CAAI
+148B ; [.1B38.0020.0002.148B] # CANADIAN SYLLABICS CI
+148C ; [.1B39.0020.0002.148C] # CANADIAN SYLLABICS CII
+148D ; [.1B3A.0020.0002.148D] # CANADIAN SYLLABICS CO
+148E ; [.1B3B.0020.0002.148E] # CANADIAN SYLLABICS COO
+148F ; [.1B3C.0020.0002.148F] # CANADIAN SYLLABICS Y-CREE COO
+1490 ; [.1B3D.0020.0002.1490] # CANADIAN SYLLABICS CA
+1491 ; [.1B3E.0020.0002.1491] # CANADIAN SYLLABICS CAA
+1492 ; [.1B3F.0020.0002.1492] # CANADIAN SYLLABICS CWE
+1493 ; [.1B40.0020.0002.1493] # CANADIAN SYLLABICS WEST-CREE CWE
+1494 ; [.1B41.0020.0002.1494] # CANADIAN SYLLABICS CWI
+1495 ; [.1B42.0020.0002.1495] # CANADIAN SYLLABICS WEST-CREE CWI
+1496 ; [.1B43.0020.0002.1496] # CANADIAN SYLLABICS CWII
+1497 ; [.1B44.0020.0002.1497] # CANADIAN SYLLABICS WEST-CREE CWII
+1498 ; [.1B45.0020.0002.1498] # CANADIAN SYLLABICS CWO
+1499 ; [.1B46.0020.0002.1499] # CANADIAN SYLLABICS WEST-CREE CWO
+149A ; [.1B47.0020.0002.149A] # CANADIAN SYLLABICS CWOO
+149B ; [.1B48.0020.0002.149B] # CANADIAN SYLLABICS WEST-CREE CWOO
+149C ; [.1B49.0020.0002.149C] # CANADIAN SYLLABICS CWA
+149D ; [.1B4A.0020.0002.149D] # CANADIAN SYLLABICS WEST-CREE CWA
+149E ; [.1B4B.0020.0002.149E] # CANADIAN SYLLABICS CWAA
+149F ; [.1B4C.0020.0002.149F] # CANADIAN SYLLABICS WEST-CREE CWAA
+14A0 ; [.1B4D.0020.0002.14A0] # CANADIAN SYLLABICS NASKAPI CWAA
+14A1 ; [.1B4E.0020.0002.14A1] # CANADIAN SYLLABICS C
+14A2 ; [.1B4F.0020.0002.14A2] # CANADIAN SYLLABICS SAYISI TH
+14A3 ; [.1B50.0020.0002.14A3] # CANADIAN SYLLABICS ME
+14A4 ; [.1B51.0020.0002.14A4] # CANADIAN SYLLABICS MAAI
+14A5 ; [.1B52.0020.0002.14A5] # CANADIAN SYLLABICS MI
+14A6 ; [.1B53.0020.0002.14A6] # CANADIAN SYLLABICS MII
+14A7 ; [.1B54.0020.0002.14A7] # CANADIAN SYLLABICS MO
+14A8 ; [.1B55.0020.0002.14A8] # CANADIAN SYLLABICS MOO
+14A9 ; [.1B56.0020.0002.14A9] # CANADIAN SYLLABICS Y-CREE MOO
+14AA ; [.1B57.0020.0002.14AA] # CANADIAN SYLLABICS MA
+14AB ; [.1B58.0020.0002.14AB] # CANADIAN SYLLABICS MAA
+14AC ; [.1B59.0020.0002.14AC] # CANADIAN SYLLABICS MWE
+14AD ; [.1B5A.0020.0002.14AD] # CANADIAN SYLLABICS WEST-CREE MWE
+14AE ; [.1B5B.0020.0002.14AE] # CANADIAN SYLLABICS MWI
+14AF ; [.1B5C.0020.0002.14AF] # CANADIAN SYLLABICS WEST-CREE MWI
+14B0 ; [.1B5D.0020.0002.14B0] # CANADIAN SYLLABICS MWII
+14B1 ; [.1B5E.0020.0002.14B1] # CANADIAN SYLLABICS WEST-CREE MWII
+14B2 ; [.1B5F.0020.0002.14B2] # CANADIAN SYLLABICS MWO
+14B3 ; [.1B60.0020.0002.14B3] # CANADIAN SYLLABICS WEST-CREE MWO
+14B4 ; [.1B61.0020.0002.14B4] # CANADIAN SYLLABICS MWOO
+14B5 ; [.1B62.0020.0002.14B5] # CANADIAN SYLLABICS WEST-CREE MWOO
+14B6 ; [.1B63.0020.0002.14B6] # CANADIAN SYLLABICS MWA
+14B7 ; [.1B64.0020.0002.14B7] # CANADIAN SYLLABICS WEST-CREE MWA
+14B8 ; [.1B65.0020.0002.14B8] # CANADIAN SYLLABICS MWAA
+14B9 ; [.1B66.0020.0002.14B9] # CANADIAN SYLLABICS WEST-CREE MWAA
+14BA ; [.1B67.0020.0002.14BA] # CANADIAN SYLLABICS NASKAPI MWAA
+14BB ; [.1B68.0020.0002.14BB] # CANADIAN SYLLABICS M
+14BC ; [.1B69.0020.0002.14BC] # CANADIAN SYLLABICS WEST-CREE M
+14BD ; [.1B6A.0020.0002.14BD] # CANADIAN SYLLABICS MH
+14BE ; [.1B6B.0020.0002.14BE] # CANADIAN SYLLABICS ATHAPASCAN M
+14BF ; [.1B6C.0020.0002.14BF] # CANADIAN SYLLABICS SAYISI M
+14C0 ; [.1B6D.0020.0002.14C0] # CANADIAN SYLLABICS NE
+14C1 ; [.1B6E.0020.0002.14C1] # CANADIAN SYLLABICS NAAI
+14C2 ; [.1B6F.0020.0002.14C2] # CANADIAN SYLLABICS NI
+14C3 ; [.1B70.0020.0002.14C3] # CANADIAN SYLLABICS NII
+14C4 ; [.1B71.0020.0002.14C4] # CANADIAN SYLLABICS NO
+14C5 ; [.1B72.0020.0002.14C5] # CANADIAN SYLLABICS NOO
+14C6 ; [.1B73.0020.0002.14C6] # CANADIAN SYLLABICS Y-CREE NOO
+14C7 ; [.1B74.0020.0002.14C7] # CANADIAN SYLLABICS NA
+14C8 ; [.1B75.0020.0002.14C8] # CANADIAN SYLLABICS NAA
+14C9 ; [.1B76.0020.0002.14C9] # CANADIAN SYLLABICS NWE
+14CA ; [.1B77.0020.0002.14CA] # CANADIAN SYLLABICS WEST-CREE NWE
+14CB ; [.1B78.0020.0002.14CB] # CANADIAN SYLLABICS NWA
+14CC ; [.1B79.0020.0002.14CC] # CANADIAN SYLLABICS WEST-CREE NWA
+14CD ; [.1B7A.0020.0002.14CD] # CANADIAN SYLLABICS NWAA
+14CE ; [.1B7B.0020.0002.14CE] # CANADIAN SYLLABICS WEST-CREE NWAA
+14CF ; [.1B7C.0020.0002.14CF] # CANADIAN SYLLABICS NASKAPI NWAA
+14D0 ; [.1B7D.0020.0002.14D0] # CANADIAN SYLLABICS N
+14D1 ; [.1B7E.0020.0002.14D1] # CANADIAN SYLLABICS CARRIER NG
+14D2 ; [.1B7F.0020.0002.14D2] # CANADIAN SYLLABICS NH
+14D3 ; [.1B80.0020.0002.14D3] # CANADIAN SYLLABICS LE
+14D4 ; [.1B81.0020.0002.14D4] # CANADIAN SYLLABICS LAAI
+14D5 ; [.1B82.0020.0002.14D5] # CANADIAN SYLLABICS LI
+14D6 ; [.1B83.0020.0002.14D6] # CANADIAN SYLLABICS LII
+14D7 ; [.1B84.0020.0002.14D7] # CANADIAN SYLLABICS LO
+14D8 ; [.1B85.0020.0002.14D8] # CANADIAN SYLLABICS LOO
+14D9 ; [.1B86.0020.0002.14D9] # CANADIAN SYLLABICS Y-CREE LOO
+14DA ; [.1B87.0020.0002.14DA] # CANADIAN SYLLABICS LA
+14DB ; [.1B88.0020.0002.14DB] # CANADIAN SYLLABICS LAA
+14DC ; [.1B89.0020.0002.14DC] # CANADIAN SYLLABICS LWE
+14DD ; [.1B8A.0020.0002.14DD] # CANADIAN SYLLABICS WEST-CREE LWE
+14DE ; [.1B8B.0020.0002.14DE] # CANADIAN SYLLABICS LWI
+14DF ; [.1B8C.0020.0002.14DF] # CANADIAN SYLLABICS WEST-CREE LWI
+14E0 ; [.1B8D.0020.0002.14E0] # CANADIAN SYLLABICS LWII
+14E1 ; [.1B8E.0020.0002.14E1] # CANADIAN SYLLABICS WEST-CREE LWII
+14E2 ; [.1B8F.0020.0002.14E2] # CANADIAN SYLLABICS LWO
+14E3 ; [.1B90.0020.0002.14E3] # CANADIAN SYLLABICS WEST-CREE LWO
+14E4 ; [.1B91.0020.0002.14E4] # CANADIAN SYLLABICS LWOO
+14E5 ; [.1B92.0020.0002.14E5] # CANADIAN SYLLABICS WEST-CREE LWOO
+14E6 ; [.1B93.0020.0002.14E6] # CANADIAN SYLLABICS LWA
+14E7 ; [.1B94.0020.0002.14E7] # CANADIAN SYLLABICS WEST-CREE LWA
+14E8 ; [.1B95.0020.0002.14E8] # CANADIAN SYLLABICS LWAA
+14E9 ; [.1B96.0020.0002.14E9] # CANADIAN SYLLABICS WEST-CREE LWAA
+14EA ; [.1B97.0020.0002.14EA] # CANADIAN SYLLABICS L
+14EB ; [.1B98.0020.0002.14EB] # CANADIAN SYLLABICS WEST-CREE L
+14EC ; [.1B99.0020.0002.14EC] # CANADIAN SYLLABICS MEDIAL L
+14ED ; [.1B9A.0020.0002.14ED] # CANADIAN SYLLABICS SE
+14EE ; [.1B9B.0020.0002.14EE] # CANADIAN SYLLABICS SAAI
+14EF ; [.1B9C.0020.0002.14EF] # CANADIAN SYLLABICS SI
+14F0 ; [.1B9D.0020.0002.14F0] # CANADIAN SYLLABICS SII
+14F1 ; [.1B9E.0020.0002.14F1] # CANADIAN SYLLABICS SO
+14F2 ; [.1B9F.0020.0002.14F2] # CANADIAN SYLLABICS SOO
+14F3 ; [.1BA0.0020.0002.14F3] # CANADIAN SYLLABICS Y-CREE SOO
+14F4 ; [.1BA1.0020.0002.14F4] # CANADIAN SYLLABICS SA
+14F5 ; [.1BA2.0020.0002.14F5] # CANADIAN SYLLABICS SAA
+14F6 ; [.1BA3.0020.0002.14F6] # CANADIAN SYLLABICS SWE
+14F7 ; [.1BA4.0020.0002.14F7] # CANADIAN SYLLABICS WEST-CREE SWE
+14F8 ; [.1BA5.0020.0002.14F8] # CANADIAN SYLLABICS SWI
+14F9 ; [.1BA6.0020.0002.14F9] # CANADIAN SYLLABICS WEST-CREE SWI
+14FA ; [.1BA7.0020.0002.14FA] # CANADIAN SYLLABICS SWII
+14FB ; [.1BA8.0020.0002.14FB] # CANADIAN SYLLABICS WEST-CREE SWII
+14FC ; [.1BA9.0020.0002.14FC] # CANADIAN SYLLABICS SWO
+14FD ; [.1BAA.0020.0002.14FD] # CANADIAN SYLLABICS WEST-CREE SWO
+14FE ; [.1BAB.0020.0002.14FE] # CANADIAN SYLLABICS SWOO
+14FF ; [.1BAC.0020.0002.14FF] # CANADIAN SYLLABICS WEST-CREE SWOO
+1500 ; [.1BAD.0020.0002.1500] # CANADIAN SYLLABICS SWA
+1501 ; [.1BAE.0020.0002.1501] # CANADIAN SYLLABICS WEST-CREE SWA
+1502 ; [.1BAF.0020.0002.1502] # CANADIAN SYLLABICS SWAA
+1503 ; [.1BB0.0020.0002.1503] # CANADIAN SYLLABICS WEST-CREE SWAA
+1504 ; [.1BB1.0020.0002.1504] # CANADIAN SYLLABICS NASKAPI SWAA
+1505 ; [.1BB2.0020.0002.1505] # CANADIAN SYLLABICS S
+1506 ; [.1BB3.0020.0002.1506] # CANADIAN SYLLABICS ATHAPASCAN S
+1507 ; [.1BB4.0020.0002.1507] # CANADIAN SYLLABICS SW
+1508 ; [.1BB5.0020.0002.1508] # CANADIAN SYLLABICS BLACKFOOT S
+1509 ; [.1BB6.0020.0002.1509] # CANADIAN SYLLABICS MOOSE-CREE SK
+150A ; [.1BB7.0020.0002.150A] # CANADIAN SYLLABICS NASKAPI SKW
+150B ; [.1BB8.0020.0002.150B] # CANADIAN SYLLABICS NASKAPI S-W
+150C ; [.1BB9.0020.0002.150C] # CANADIAN SYLLABICS NASKAPI SPWA
+150D ; [.1BBA.0020.0002.150D] # CANADIAN SYLLABICS NASKAPI STWA
+150E ; [.1BBB.0020.0002.150E] # CANADIAN SYLLABICS NASKAPI SKWA
+150F ; [.1BBC.0020.0002.150F] # CANADIAN SYLLABICS NASKAPI SCWA
+1510 ; [.1BBD.0020.0002.1510] # CANADIAN SYLLABICS SHE
+1511 ; [.1BBE.0020.0002.1511] # CANADIAN SYLLABICS SHI
+1512 ; [.1BBF.0020.0002.1512] # CANADIAN SYLLABICS SHII
+1513 ; [.1BC0.0020.0002.1513] # CANADIAN SYLLABICS SHO
+1514 ; [.1BC1.0020.0002.1514] # CANADIAN SYLLABICS SHOO
+1515 ; [.1BC2.0020.0002.1515] # CANADIAN SYLLABICS SHA
+1516 ; [.1BC3.0020.0002.1516] # CANADIAN SYLLABICS SHAA
+1517 ; [.1BC4.0020.0002.1517] # CANADIAN SYLLABICS SHWE
+1518 ; [.1BC5.0020.0002.1518] # CANADIAN SYLLABICS WEST-CREE SHWE
+1519 ; [.1BC6.0020.0002.1519] # CANADIAN SYLLABICS SHWI
+151A ; [.1BC7.0020.0002.151A] # CANADIAN SYLLABICS WEST-CREE SHWI
+151B ; [.1BC8.0020.0002.151B] # CANADIAN SYLLABICS SHWII
+151C ; [.1BC9.0020.0002.151C] # CANADIAN SYLLABICS WEST-CREE SHWII
+151D ; [.1BCA.0020.0002.151D] # CANADIAN SYLLABICS SHWO
+151E ; [.1BCB.0020.0002.151E] # CANADIAN SYLLABICS WEST-CREE SHWO
+151F ; [.1BCC.0020.0002.151F] # CANADIAN SYLLABICS SHWOO
+1520 ; [.1BCD.0020.0002.1520] # CANADIAN SYLLABICS WEST-CREE SHWOO
+1521 ; [.1BCE.0020.0002.1521] # CANADIAN SYLLABICS SHWA
+1522 ; [.1BCF.0020.0002.1522] # CANADIAN SYLLABICS WEST-CREE SHWA
+1523 ; [.1BD0.0020.0002.1523] # CANADIAN SYLLABICS SHWAA
+1524 ; [.1BD1.0020.0002.1524] # CANADIAN SYLLABICS WEST-CREE SHWAA
+1525 ; [.1BD2.0020.0002.1525] # CANADIAN SYLLABICS SH
+1526 ; [.1BD3.0020.0002.1526] # CANADIAN SYLLABICS YE
+1527 ; [.1BD4.0020.0002.1527] # CANADIAN SYLLABICS YAAI
+1528 ; [.1BD5.0020.0002.1528] # CANADIAN SYLLABICS YI
+1529 ; [.1BD6.0020.0002.1529] # CANADIAN SYLLABICS YII
+152A ; [.1BD7.0020.0002.152A] # CANADIAN SYLLABICS YO
+152B ; [.1BD8.0020.0002.152B] # CANADIAN SYLLABICS YOO
+152C ; [.1BD9.0020.0002.152C] # CANADIAN SYLLABICS Y-CREE YOO
+152D ; [.1BDA.0020.0002.152D] # CANADIAN SYLLABICS YA
+152E ; [.1BDB.0020.0002.152E] # CANADIAN SYLLABICS YAA
+152F ; [.1BDC.0020.0002.152F] # CANADIAN SYLLABICS YWE
+1530 ; [.1BDD.0020.0002.1530] # CANADIAN SYLLABICS WEST-CREE YWE
+1531 ; [.1BDE.0020.0002.1531] # CANADIAN SYLLABICS YWI
+1532 ; [.1BDF.0020.0002.1532] # CANADIAN SYLLABICS WEST-CREE YWI
+1533 ; [.1BE0.0020.0002.1533] # CANADIAN SYLLABICS YWII
+1534 ; [.1BE1.0020.0002.1534] # CANADIAN SYLLABICS WEST-CREE YWII
+1535 ; [.1BE2.0020.0002.1535] # CANADIAN SYLLABICS YWO
+1536 ; [.1BE3.0020.0002.1536] # CANADIAN SYLLABICS WEST-CREE YWO
+1537 ; [.1BE4.0020.0002.1537] # CANADIAN SYLLABICS YWOO
+1538 ; [.1BE5.0020.0002.1538] # CANADIAN SYLLABICS WEST-CREE YWOO
+1539 ; [.1BE6.0020.0002.1539] # CANADIAN SYLLABICS YWA
+153A ; [.1BE7.0020.0002.153A] # CANADIAN SYLLABICS WEST-CREE YWA
+153B ; [.1BE8.0020.0002.153B] # CANADIAN SYLLABICS YWAA
+153C ; [.1BE9.0020.0002.153C] # CANADIAN SYLLABICS WEST-CREE YWAA
+153D ; [.1BEA.0020.0002.153D] # CANADIAN SYLLABICS NASKAPI YWAA
+153E ; [.1BEB.0020.0002.153E] # CANADIAN SYLLABICS Y
+153F ; [.1BEC.0020.0002.153F] # CANADIAN SYLLABICS BIBLE-CREE Y
+1540 ; [.1BED.0020.0002.1540] # CANADIAN SYLLABICS WEST-CREE Y
+1541 ; [.1BEE.0020.0002.1541] # CANADIAN SYLLABICS SAYISI YI
+1542 ; [.1BEF.0020.0002.1542] # CANADIAN SYLLABICS RE
+1543 ; [.1BF0.0020.0002.1543] # CANADIAN SYLLABICS R-CREE RE
+1544 ; [.1BF1.0020.0002.1544] # CANADIAN SYLLABICS WEST-CREE LE
+1545 ; [.1BF2.0020.0002.1545] # CANADIAN SYLLABICS RAAI
+1546 ; [.1BF3.0020.0002.1546] # CANADIAN SYLLABICS RI
+1547 ; [.1BF4.0020.0002.1547] # CANADIAN SYLLABICS RII
+1548 ; [.1BF5.0020.0002.1548] # CANADIAN SYLLABICS RO
+1549 ; [.1BF6.0020.0002.1549] # CANADIAN SYLLABICS ROO
+154A ; [.1BF7.0020.0002.154A] # CANADIAN SYLLABICS WEST-CREE LO
+154B ; [.1BF8.0020.0002.154B] # CANADIAN SYLLABICS RA
+154C ; [.1BF9.0020.0002.154C] # CANADIAN SYLLABICS RAA
+154D ; [.1BFA.0020.0002.154D] # CANADIAN SYLLABICS WEST-CREE LA
+154E ; [.1BFB.0020.0002.154E] # CANADIAN SYLLABICS RWAA
+154F ; [.1BFC.0020.0002.154F] # CANADIAN SYLLABICS WEST-CREE RWAA
+1550 ; [.1BFD.0020.0002.1550] # CANADIAN SYLLABICS R
+1551 ; [.1BFE.0020.0002.1551] # CANADIAN SYLLABICS WEST-CREE R
+1552 ; [.1BFF.0020.0002.1552] # CANADIAN SYLLABICS MEDIAL R
+1553 ; [.1C00.0020.0002.1553] # CANADIAN SYLLABICS FE
+1554 ; [.1C01.0020.0002.1554] # CANADIAN SYLLABICS FAAI
+1555 ; [.1C02.0020.0002.1555] # CANADIAN SYLLABICS FI
+1556 ; [.1C03.0020.0002.1556] # CANADIAN SYLLABICS FII
+1557 ; [.1C04.0020.0002.1557] # CANADIAN SYLLABICS FO
+1558 ; [.1C05.0020.0002.1558] # CANADIAN SYLLABICS FOO
+1559 ; [.1C06.0020.0002.1559] # CANADIAN SYLLABICS FA
+155A ; [.1C07.0020.0002.155A] # CANADIAN SYLLABICS FAA
+155B ; [.1C08.0020.0002.155B] # CANADIAN SYLLABICS FWAA
+155C ; [.1C09.0020.0002.155C] # CANADIAN SYLLABICS WEST-CREE FWAA
+155D ; [.1C0A.0020.0002.155D] # CANADIAN SYLLABICS F
+155E ; [.1C0B.0020.0002.155E] # CANADIAN SYLLABICS THE
+155F ; [.1C0C.0020.0002.155F] # CANADIAN SYLLABICS N-CREE THE
+1560 ; [.1C0D.0020.0002.1560] # CANADIAN SYLLABICS THI
+1561 ; [.1C0E.0020.0002.1561] # CANADIAN SYLLABICS N-CREE THI
+1562 ; [.1C0F.0020.0002.1562] # CANADIAN SYLLABICS THII
+1563 ; [.1C10.0020.0002.1563] # CANADIAN SYLLABICS N-CREE THII
+1564 ; [.1C11.0020.0002.1564] # CANADIAN SYLLABICS THO
+1565 ; [.1C12.0020.0002.1565] # CANADIAN SYLLABICS THOO
+1566 ; [.1C13.0020.0002.1566] # CANADIAN SYLLABICS THA
+1567 ; [.1C14.0020.0002.1567] # CANADIAN SYLLABICS THAA
+1568 ; [.1C15.0020.0002.1568] # CANADIAN SYLLABICS THWAA
+1569 ; [.1C16.0020.0002.1569] # CANADIAN SYLLABICS WEST-CREE THWAA
+156A ; [.1C17.0020.0002.156A] # CANADIAN SYLLABICS TH
+156B ; [.1C18.0020.0002.156B] # CANADIAN SYLLABICS TTHE
+156C ; [.1C19.0020.0002.156C] # CANADIAN SYLLABICS TTHI
+156D ; [.1C1A.0020.0002.156D] # CANADIAN SYLLABICS TTHO
+156E ; [.1C1B.0020.0002.156E] # CANADIAN SYLLABICS TTHA
+156F ; [.1C1C.0020.0002.156F] # CANADIAN SYLLABICS TTH
+1570 ; [.1C1D.0020.0002.1570] # CANADIAN SYLLABICS TYE
+1571 ; [.1C1E.0020.0002.1571] # CANADIAN SYLLABICS TYI
+1572 ; [.1C1F.0020.0002.1572] # CANADIAN SYLLABICS TYO
+1573 ; [.1C20.0020.0002.1573] # CANADIAN SYLLABICS TYA
+1574 ; [.1C21.0020.0002.1574] # CANADIAN SYLLABICS NUNAVIK HE
+1575 ; [.1C22.0020.0002.1575] # CANADIAN SYLLABICS NUNAVIK HI
+1576 ; [.1C23.0020.0002.1576] # CANADIAN SYLLABICS NUNAVIK HII
+1577 ; [.1C24.0020.0002.1577] # CANADIAN SYLLABICS NUNAVIK HO
+1578 ; [.1C25.0020.0002.1578] # CANADIAN SYLLABICS NUNAVIK HOO
+1579 ; [.1C26.0020.0002.1579] # CANADIAN SYLLABICS NUNAVIK HA
+157A ; [.1C27.0020.0002.157A] # CANADIAN SYLLABICS NUNAVIK HAA
+157B ; [.1C28.0020.0002.157B] # CANADIAN SYLLABICS NUNAVIK H
+157D ; [.1C29.0020.0002.157D] # CANADIAN SYLLABICS HK
+166F ; [.1C2A.0020.0002.166F] # CANADIAN SYLLABICS QAI
+157E ; [.1C2B.0020.0002.157E] # CANADIAN SYLLABICS QAAI
+157F ; [.1C2C.0020.0002.157F] # CANADIAN SYLLABICS QI
+1580 ; [.1C2D.0020.0002.1580] # CANADIAN SYLLABICS QII
+1581 ; [.1C2E.0020.0002.1581] # CANADIAN SYLLABICS QO
+1582 ; [.1C2F.0020.0002.1582] # CANADIAN SYLLABICS QOO
+1583 ; [.1C30.0020.0002.1583] # CANADIAN SYLLABICS QA
+1584 ; [.1C31.0020.0002.1584] # CANADIAN SYLLABICS QAA
+1585 ; [.1C32.0020.0002.1585] # CANADIAN SYLLABICS Q
+1586 ; [.1C33.0020.0002.1586] # CANADIAN SYLLABICS TLHE
+1587 ; [.1C34.0020.0002.1587] # CANADIAN SYLLABICS TLHI
+1588 ; [.1C35.0020.0002.1588] # CANADIAN SYLLABICS TLHO
+1589 ; [.1C36.0020.0002.1589] # CANADIAN SYLLABICS TLHA
+158A ; [.1C37.0020.0002.158A] # CANADIAN SYLLABICS WEST-CREE RE
+158B ; [.1C38.0020.0002.158B] # CANADIAN SYLLABICS WEST-CREE RI
+158C ; [.1C39.0020.0002.158C] # CANADIAN SYLLABICS WEST-CREE RO
+158D ; [.1C3A.0020.0002.158D] # CANADIAN SYLLABICS WEST-CREE RA
+1670 ; [.1C3B.0020.0002.1670] # CANADIAN SYLLABICS NGAI
+158E ; [.1C3C.0020.0002.158E] # CANADIAN SYLLABICS NGAAI
+158F ; [.1C3D.0020.0002.158F] # CANADIAN SYLLABICS NGI
+1590 ; [.1C3E.0020.0002.1590] # CANADIAN SYLLABICS NGII
+1591 ; [.1C3F.0020.0002.1591] # CANADIAN SYLLABICS NGO
+1592 ; [.1C40.0020.0002.1592] # CANADIAN SYLLABICS NGOO
+1593 ; [.1C41.0020.0002.1593] # CANADIAN SYLLABICS NGA
+1594 ; [.1C42.0020.0002.1594] # CANADIAN SYLLABICS NGAA
+1595 ; [.1C43.0020.0002.1595] # CANADIAN SYLLABICS NG
+1671 ; [.1C44.0020.0002.1671] # CANADIAN SYLLABICS NNGI
+1672 ; [.1C45.0020.0002.1672] # CANADIAN SYLLABICS NNGII
+1673 ; [.1C46.0020.0002.1673] # CANADIAN SYLLABICS NNGO
+1674 ; [.1C47.0020.0002.1674] # CANADIAN SYLLABICS NNGOO
+1675 ; [.1C48.0020.0002.1675] # CANADIAN SYLLABICS NNGA
+1676 ; [.1C49.0020.0002.1676] # CANADIAN SYLLABICS NNGAA
+1596 ; [.1C4A.0020.0002.1596] # CANADIAN SYLLABICS NNG
+1597 ; [.1C4B.0020.0002.1597] # CANADIAN SYLLABICS SAYISI SHE
+1598 ; [.1C4C.0020.0002.1598] # CANADIAN SYLLABICS SAYISI SHI
+1599 ; [.1C4D.0020.0002.1599] # CANADIAN SYLLABICS SAYISI SHO
+159A ; [.1C4E.0020.0002.159A] # CANADIAN SYLLABICS SAYISI SHA
+159B ; [.1C4F.0020.0002.159B] # CANADIAN SYLLABICS WOODS-CREE THE
+159C ; [.1C50.0020.0002.159C] # CANADIAN SYLLABICS WOODS-CREE THI
+159D ; [.1C51.0020.0002.159D] # CANADIAN SYLLABICS WOODS-CREE THO
+159E ; [.1C52.0020.0002.159E] # CANADIAN SYLLABICS WOODS-CREE THA
+159F ; [.1C53.0020.0002.159F] # CANADIAN SYLLABICS WOODS-CREE TH
+15A0 ; [.1C54.0020.0002.15A0] # CANADIAN SYLLABICS LHI
+15A1 ; [.1C55.0020.0002.15A1] # CANADIAN SYLLABICS LHII
+15A2 ; [.1C56.0020.0002.15A2] # CANADIAN SYLLABICS LHO
+15A3 ; [.1C57.0020.0002.15A3] # CANADIAN SYLLABICS LHOO
+15A4 ; [.1C58.0020.0002.15A4] # CANADIAN SYLLABICS LHA
+15A5 ; [.1C59.0020.0002.15A5] # CANADIAN SYLLABICS LHAA
+15A6 ; [.1C5A.0020.0002.15A6] # CANADIAN SYLLABICS LH
+157C ; [.1C5B.0020.0002.157C] # CANADIAN SYLLABICS NUNAVUT H
+15A7 ; [.1C5C.0020.0002.15A7] # CANADIAN SYLLABICS TH-CREE THE
+15A8 ; [.1C5D.0020.0002.15A8] # CANADIAN SYLLABICS TH-CREE THI
+15A9 ; [.1C5E.0020.0002.15A9] # CANADIAN SYLLABICS TH-CREE THII
+15AA ; [.1C5F.0020.0002.15AA] # CANADIAN SYLLABICS TH-CREE THO
+15AB ; [.1C60.0020.0002.15AB] # CANADIAN SYLLABICS TH-CREE THOO
+15AC ; [.1C61.0020.0002.15AC] # CANADIAN SYLLABICS TH-CREE THA
+15AD ; [.1C62.0020.0002.15AD] # CANADIAN SYLLABICS TH-CREE THAA
+15AE ; [.1C63.0020.0002.15AE] # CANADIAN SYLLABICS TH-CREE TH
+15AF ; [.1C64.0020.0002.15AF] # CANADIAN SYLLABICS AIVILIK B
+15B0 ; [.1C65.0020.0002.15B0] # CANADIAN SYLLABICS BLACKFOOT E
+15B1 ; [.1C66.0020.0002.15B1] # CANADIAN SYLLABICS BLACKFOOT I
+15B2 ; [.1C67.0020.0002.15B2] # CANADIAN SYLLABICS BLACKFOOT O
+15B3 ; [.1C68.0020.0002.15B3] # CANADIAN SYLLABICS BLACKFOOT A
+15B4 ; [.1C69.0020.0002.15B4] # CANADIAN SYLLABICS BLACKFOOT WE
+15B5 ; [.1C6A.0020.0002.15B5] # CANADIAN SYLLABICS BLACKFOOT WI
+15B6 ; [.1C6B.0020.0002.15B6] # CANADIAN SYLLABICS BLACKFOOT WO
+15B7 ; [.1C6C.0020.0002.15B7] # CANADIAN SYLLABICS BLACKFOOT WA
+15B8 ; [.1C6D.0020.0002.15B8] # CANADIAN SYLLABICS BLACKFOOT NE
+15B9 ; [.1C6E.0020.0002.15B9] # CANADIAN SYLLABICS BLACKFOOT NI
+15BA ; [.1C6F.0020.0002.15BA] # CANADIAN SYLLABICS BLACKFOOT NO
+15BB ; [.1C70.0020.0002.15BB] # CANADIAN SYLLABICS BLACKFOOT NA
+15BC ; [.1C71.0020.0002.15BC] # CANADIAN SYLLABICS BLACKFOOT KE
+15BD ; [.1C72.0020.0002.15BD] # CANADIAN SYLLABICS BLACKFOOT KI
+15BE ; [.1C73.0020.0002.15BE] # CANADIAN SYLLABICS BLACKFOOT KO
+15BF ; [.1C74.0020.0002.15BF] # CANADIAN SYLLABICS BLACKFOOT KA
+15C0 ; [.1C75.0020.0002.15C0] # CANADIAN SYLLABICS SAYISI HE
+15C1 ; [.1C76.0020.0002.15C1] # CANADIAN SYLLABICS SAYISI HI
+15C2 ; [.1C77.0020.0002.15C2] # CANADIAN SYLLABICS SAYISI HO
+15C3 ; [.1C78.0020.0002.15C3] # CANADIAN SYLLABICS SAYISI HA
+15C4 ; [.1C79.0020.0002.15C4] # CANADIAN SYLLABICS CARRIER GHU
+15C5 ; [.1C7A.0020.0002.15C5] # CANADIAN SYLLABICS CARRIER GHO
+15C6 ; [.1C7B.0020.0002.15C6] # CANADIAN SYLLABICS CARRIER GHE
+15C7 ; [.1C7C.0020.0002.15C7] # CANADIAN SYLLABICS CARRIER GHEE
+15C8 ; [.1C7D.0020.0002.15C8] # CANADIAN SYLLABICS CARRIER GHI
+15C9 ; [.1C7E.0020.0002.15C9] # CANADIAN SYLLABICS CARRIER GHA
+15CA ; [.1C7F.0020.0002.15CA] # CANADIAN SYLLABICS CARRIER RU
+15CB ; [.1C80.0020.0002.15CB] # CANADIAN SYLLABICS CARRIER RO
+15CC ; [.1C81.0020.0002.15CC] # CANADIAN SYLLABICS CARRIER RE
+15CD ; [.1C82.0020.0002.15CD] # CANADIAN SYLLABICS CARRIER REE
+15CE ; [.1C83.0020.0002.15CE] # CANADIAN SYLLABICS CARRIER RI
+15CF ; [.1C84.0020.0002.15CF] # CANADIAN SYLLABICS CARRIER RA
+15D0 ; [.1C85.0020.0002.15D0] # CANADIAN SYLLABICS CARRIER WU
+15D1 ; [.1C86.0020.0002.15D1] # CANADIAN SYLLABICS CARRIER WO
+15D2 ; [.1C87.0020.0002.15D2] # CANADIAN SYLLABICS CARRIER WE
+15D3 ; [.1C88.0020.0002.15D3] # CANADIAN SYLLABICS CARRIER WEE
+15D4 ; [.1C89.0020.0002.15D4] # CANADIAN SYLLABICS CARRIER WI
+15D5 ; [.1C8A.0020.0002.15D5] # CANADIAN SYLLABICS CARRIER WA
+15D6 ; [.1C8B.0020.0002.15D6] # CANADIAN SYLLABICS CARRIER HWU
+15D7 ; [.1C8C.0020.0002.15D7] # CANADIAN SYLLABICS CARRIER HWO
+15D8 ; [.1C8D.0020.0002.15D8] # CANADIAN SYLLABICS CARRIER HWE
+15D9 ; [.1C8E.0020.0002.15D9] # CANADIAN SYLLABICS CARRIER HWEE
+15DA ; [.1C8F.0020.0002.15DA] # CANADIAN SYLLABICS CARRIER HWI
+15DB ; [.1C90.0020.0002.15DB] # CANADIAN SYLLABICS CARRIER HWA
+15DC ; [.1C91.0020.0002.15DC] # CANADIAN SYLLABICS CARRIER THU
+15DD ; [.1C92.0020.0002.15DD] # CANADIAN SYLLABICS CARRIER THO
+15DE ; [.1C93.0020.0002.15DE] # CANADIAN SYLLABICS CARRIER THE
+15DF ; [.1C94.0020.0002.15DF] # CANADIAN SYLLABICS CARRIER THEE
+15E0 ; [.1C95.0020.0002.15E0] # CANADIAN SYLLABICS CARRIER THI
+15E1 ; [.1C96.0020.0002.15E1] # CANADIAN SYLLABICS CARRIER THA
+15E2 ; [.1C97.0020.0002.15E2] # CANADIAN SYLLABICS CARRIER TTU
+15E3 ; [.1C98.0020.0002.15E3] # CANADIAN SYLLABICS CARRIER TTO
+15E4 ; [.1C99.0020.0002.15E4] # CANADIAN SYLLABICS CARRIER TTE
+15E5 ; [.1C9A.0020.0002.15E5] # CANADIAN SYLLABICS CARRIER TTEE
+15E6 ; [.1C9B.0020.0002.15E6] # CANADIAN SYLLABICS CARRIER TTI
+15E7 ; [.1C9C.0020.0002.15E7] # CANADIAN SYLLABICS CARRIER TTA
+15E8 ; [.1C9D.0020.0002.15E8] # CANADIAN SYLLABICS CARRIER PU
+15E9 ; [.1C9E.0020.0002.15E9] # CANADIAN SYLLABICS CARRIER PO
+15EA ; [.1C9F.0020.0002.15EA] # CANADIAN SYLLABICS CARRIER PE
+15EB ; [.1CA0.0020.0002.15EB] # CANADIAN SYLLABICS CARRIER PEE
+15EC ; [.1CA1.0020.0002.15EC] # CANADIAN SYLLABICS CARRIER PI
+15ED ; [.1CA2.0020.0002.15ED] # CANADIAN SYLLABICS CARRIER PA
+15EE ; [.1CA3.0020.0002.15EE] # CANADIAN SYLLABICS CARRIER P
+15EF ; [.1CA4.0020.0002.15EF] # CANADIAN SYLLABICS CARRIER GU
+15F0 ; [.1CA5.0020.0002.15F0] # CANADIAN SYLLABICS CARRIER GO
+15F1 ; [.1CA6.0020.0002.15F1] # CANADIAN SYLLABICS CARRIER GE
+15F2 ; [.1CA7.0020.0002.15F2] # CANADIAN SYLLABICS CARRIER GEE
+15F3 ; [.1CA8.0020.0002.15F3] # CANADIAN SYLLABICS CARRIER GI
+15F4 ; [.1CA9.0020.0002.15F4] # CANADIAN SYLLABICS CARRIER GA
+15F5 ; [.1CAA.0020.0002.15F5] # CANADIAN SYLLABICS CARRIER KHU
+15F6 ; [.1CAB.0020.0002.15F6] # CANADIAN SYLLABICS CARRIER KHO
+15F7 ; [.1CAC.0020.0002.15F7] # CANADIAN SYLLABICS CARRIER KHE
+15F8 ; [.1CAD.0020.0002.15F8] # CANADIAN SYLLABICS CARRIER KHEE
+15F9 ; [.1CAE.0020.0002.15F9] # CANADIAN SYLLABICS CARRIER KHI
+15FA ; [.1CAF.0020.0002.15FA] # CANADIAN SYLLABICS CARRIER KHA
+15FB ; [.1CB0.0020.0002.15FB] # CANADIAN SYLLABICS CARRIER KKU
+15FC ; [.1CB1.0020.0002.15FC] # CANADIAN SYLLABICS CARRIER KKO
+15FD ; [.1CB2.0020.0002.15FD] # CANADIAN SYLLABICS CARRIER KKE
+15FE ; [.1CB3.0020.0002.15FE] # CANADIAN SYLLABICS CARRIER KKEE
+15FF ; [.1CB4.0020.0002.15FF] # CANADIAN SYLLABICS CARRIER KKI
+1600 ; [.1CB5.0020.0002.1600] # CANADIAN SYLLABICS CARRIER KKA
+1601 ; [.1CB6.0020.0002.1601] # CANADIAN SYLLABICS CARRIER KK
+1602 ; [.1CB7.0020.0002.1602] # CANADIAN SYLLABICS CARRIER NU
+1603 ; [.1CB8.0020.0002.1603] # CANADIAN SYLLABICS CARRIER NO
+1604 ; [.1CB9.0020.0002.1604] # CANADIAN SYLLABICS CARRIER NE
+1605 ; [.1CBA.0020.0002.1605] # CANADIAN SYLLABICS CARRIER NEE
+1606 ; [.1CBB.0020.0002.1606] # CANADIAN SYLLABICS CARRIER NI
+1607 ; [.1CBC.0020.0002.1607] # CANADIAN SYLLABICS CARRIER NA
+1608 ; [.1CBD.0020.0002.1608] # CANADIAN SYLLABICS CARRIER MU
+1609 ; [.1CBE.0020.0002.1609] # CANADIAN SYLLABICS CARRIER MO
+160A ; [.1CBF.0020.0002.160A] # CANADIAN SYLLABICS CARRIER ME
+160B ; [.1CC0.0020.0002.160B] # CANADIAN SYLLABICS CARRIER MEE
+160C ; [.1CC1.0020.0002.160C] # CANADIAN SYLLABICS CARRIER MI
+160D ; [.1CC2.0020.0002.160D] # CANADIAN SYLLABICS CARRIER MA
+160E ; [.1CC3.0020.0002.160E] # CANADIAN SYLLABICS CARRIER YU
+160F ; [.1CC4.0020.0002.160F] # CANADIAN SYLLABICS CARRIER YO
+1610 ; [.1CC5.0020.0002.1610] # CANADIAN SYLLABICS CARRIER YE
+1611 ; [.1CC6.0020.0002.1611] # CANADIAN SYLLABICS CARRIER YEE
+1612 ; [.1CC7.0020.0002.1612] # CANADIAN SYLLABICS CARRIER YI
+1613 ; [.1CC8.0020.0002.1613] # CANADIAN SYLLABICS CARRIER YA
+1614 ; [.1CC9.0020.0002.1614] # CANADIAN SYLLABICS CARRIER JU
+1615 ; [.1CCA.0020.0002.1615] # CANADIAN SYLLABICS SAYISI JU
+1616 ; [.1CCB.0020.0002.1616] # CANADIAN SYLLABICS CARRIER JO
+1617 ; [.1CCC.0020.0002.1617] # CANADIAN SYLLABICS CARRIER JE
+1618 ; [.1CCD.0020.0002.1618] # CANADIAN SYLLABICS CARRIER JEE
+1619 ; [.1CCE.0020.0002.1619] # CANADIAN SYLLABICS CARRIER JI
+161A ; [.1CCF.0020.0002.161A] # CANADIAN SYLLABICS SAYISI JI
+161B ; [.1CD0.0020.0002.161B] # CANADIAN SYLLABICS CARRIER JA
+161C ; [.1CD1.0020.0002.161C] # CANADIAN SYLLABICS CARRIER JJU
+161D ; [.1CD2.0020.0002.161D] # CANADIAN SYLLABICS CARRIER JJO
+161E ; [.1CD3.0020.0002.161E] # CANADIAN SYLLABICS CARRIER JJE
+161F ; [.1CD4.0020.0002.161F] # CANADIAN SYLLABICS CARRIER JJEE
+1620 ; [.1CD5.0020.0002.1620] # CANADIAN SYLLABICS CARRIER JJI
+1621 ; [.1CD6.0020.0002.1621] # CANADIAN SYLLABICS CARRIER JJA
+1622 ; [.1CD7.0020.0002.1622] # CANADIAN SYLLABICS CARRIER LU
+1623 ; [.1CD8.0020.0002.1623] # CANADIAN SYLLABICS CARRIER LO
+1624 ; [.1CD9.0020.0002.1624] # CANADIAN SYLLABICS CARRIER LE
+1625 ; [.1CDA.0020.0002.1625] # CANADIAN SYLLABICS CARRIER LEE
+1626 ; [.1CDB.0020.0002.1626] # CANADIAN SYLLABICS CARRIER LI
+1627 ; [.1CDC.0020.0002.1627] # CANADIAN SYLLABICS CARRIER LA
+1628 ; [.1CDD.0020.0002.1628] # CANADIAN SYLLABICS CARRIER DLU
+1629 ; [.1CDE.0020.0002.1629] # CANADIAN SYLLABICS CARRIER DLO
+162A ; [.1CDF.0020.0002.162A] # CANADIAN SYLLABICS CARRIER DLE
+162B ; [.1CE0.0020.0002.162B] # CANADIAN SYLLABICS CARRIER DLEE
+162C ; [.1CE1.0020.0002.162C] # CANADIAN SYLLABICS CARRIER DLI
+162D ; [.1CE2.0020.0002.162D] # CANADIAN SYLLABICS CARRIER DLA
+162E ; [.1CE3.0020.0002.162E] # CANADIAN SYLLABICS CARRIER LHU
+162F ; [.1CE4.0020.0002.162F] # CANADIAN SYLLABICS CARRIER LHO
+1630 ; [.1CE5.0020.0002.1630] # CANADIAN SYLLABICS CARRIER LHE
+1631 ; [.1CE6.0020.0002.1631] # CANADIAN SYLLABICS CARRIER LHEE
+1632 ; [.1CE7.0020.0002.1632] # CANADIAN SYLLABICS CARRIER LHI
+1633 ; [.1CE8.0020.0002.1633] # CANADIAN SYLLABICS CARRIER LHA
+1634 ; [.1CE9.0020.0002.1634] # CANADIAN SYLLABICS CARRIER TLHU
+1635 ; [.1CEA.0020.0002.1635] # CANADIAN SYLLABICS CARRIER TLHO
+1636 ; [.1CEB.0020.0002.1636] # CANADIAN SYLLABICS CARRIER TLHE
+1637 ; [.1CEC.0020.0002.1637] # CANADIAN SYLLABICS CARRIER TLHEE
+1638 ; [.1CED.0020.0002.1638] # CANADIAN SYLLABICS CARRIER TLHI
+1639 ; [.1CEE.0020.0002.1639] # CANADIAN SYLLABICS CARRIER TLHA
+163A ; [.1CEF.0020.0002.163A] # CANADIAN SYLLABICS CARRIER TLU
+163B ; [.1CF0.0020.0002.163B] # CANADIAN SYLLABICS CARRIER TLO
+163C ; [.1CF1.0020.0002.163C] # CANADIAN SYLLABICS CARRIER TLE
+163D ; [.1CF2.0020.0002.163D] # CANADIAN SYLLABICS CARRIER TLEE
+163E ; [.1CF3.0020.0002.163E] # CANADIAN SYLLABICS CARRIER TLI
+163F ; [.1CF4.0020.0002.163F] # CANADIAN SYLLABICS CARRIER TLA
+1640 ; [.1CF5.0020.0002.1640] # CANADIAN SYLLABICS CARRIER ZU
+1641 ; [.1CF6.0020.0002.1641] # CANADIAN SYLLABICS CARRIER ZO
+1642 ; [.1CF7.0020.0002.1642] # CANADIAN SYLLABICS CARRIER ZE
+1643 ; [.1CF8.0020.0002.1643] # CANADIAN SYLLABICS CARRIER ZEE
+1644 ; [.1CF9.0020.0002.1644] # CANADIAN SYLLABICS CARRIER ZI
+1645 ; [.1CFA.0020.0002.1645] # CANADIAN SYLLABICS CARRIER ZA
+1646 ; [.1CFB.0020.0002.1646] # CANADIAN SYLLABICS CARRIER Z
+1647 ; [.1CFC.0020.0002.1647] # CANADIAN SYLLABICS CARRIER INITIAL Z
+1648 ; [.1CFD.0020.0002.1648] # CANADIAN SYLLABICS CARRIER DZU
+1649 ; [.1CFE.0020.0002.1649] # CANADIAN SYLLABICS CARRIER DZO
+164A ; [.1CFF.0020.0002.164A] # CANADIAN SYLLABICS CARRIER DZE
+164B ; [.1D00.0020.0002.164B] # CANADIAN SYLLABICS CARRIER DZEE
+164C ; [.1D01.0020.0002.164C] # CANADIAN SYLLABICS CARRIER DZI
+164D ; [.1D02.0020.0002.164D] # CANADIAN SYLLABICS CARRIER DZA
+164E ; [.1D03.0020.0002.164E] # CANADIAN SYLLABICS CARRIER SU
+164F ; [.1D04.0020.0002.164F] # CANADIAN SYLLABICS CARRIER SO
+1650 ; [.1D05.0020.0002.1650] # CANADIAN SYLLABICS CARRIER SE
+1651 ; [.1D06.0020.0002.1651] # CANADIAN SYLLABICS CARRIER SEE
+1652 ; [.1D07.0020.0002.1652] # CANADIAN SYLLABICS CARRIER SI
+1653 ; [.1D08.0020.0002.1653] # CANADIAN SYLLABICS CARRIER SA
+1654 ; [.1D09.0020.0002.1654] # CANADIAN SYLLABICS CARRIER SHU
+1655 ; [.1D0A.0020.0002.1655] # CANADIAN SYLLABICS CARRIER SHO
+1656 ; [.1D0B.0020.0002.1656] # CANADIAN SYLLABICS CARRIER SHE
+1657 ; [.1D0C.0020.0002.1657] # CANADIAN SYLLABICS CARRIER SHEE
+1658 ; [.1D0D.0020.0002.1658] # CANADIAN SYLLABICS CARRIER SHI
+1659 ; [.1D0E.0020.0002.1659] # CANADIAN SYLLABICS CARRIER SHA
+165A ; [.1D0F.0020.0002.165A] # CANADIAN SYLLABICS CARRIER SH
+165B ; [.1D10.0020.0002.165B] # CANADIAN SYLLABICS CARRIER TSU
+165C ; [.1D11.0020.0002.165C] # CANADIAN SYLLABICS CARRIER TSO
+165D ; [.1D12.0020.0002.165D] # CANADIAN SYLLABICS CARRIER TSE
+165E ; [.1D13.0020.0002.165E] # CANADIAN SYLLABICS CARRIER TSEE
+165F ; [.1D14.0020.0002.165F] # CANADIAN SYLLABICS CARRIER TSI
+1660 ; [.1D15.0020.0002.1660] # CANADIAN SYLLABICS CARRIER TSA
+1661 ; [.1D16.0020.0002.1661] # CANADIAN SYLLABICS CARRIER CHU
+1662 ; [.1D17.0020.0002.1662] # CANADIAN SYLLABICS CARRIER CHO
+1663 ; [.1D18.0020.0002.1663] # CANADIAN SYLLABICS CARRIER CHE
+1664 ; [.1D19.0020.0002.1664] # CANADIAN SYLLABICS CARRIER CHEE
+1665 ; [.1D1A.0020.0002.1665] # CANADIAN SYLLABICS CARRIER CHI
+1666 ; [.1D1B.0020.0002.1666] # CANADIAN SYLLABICS CARRIER CHA
+1667 ; [.1D1C.0020.0002.1667] # CANADIAN SYLLABICS CARRIER TTSU
+1668 ; [.1D1D.0020.0002.1668] # CANADIAN SYLLABICS CARRIER TTSO
+1669 ; [.1D1E.0020.0002.1669] # CANADIAN SYLLABICS CARRIER TTSE
+166A ; [.1D1F.0020.0002.166A] # CANADIAN SYLLABICS CARRIER TTSEE
+166B ; [.1D20.0020.0002.166B] # CANADIAN SYLLABICS CARRIER TTSI
+166C ; [.1D21.0020.0002.166C] # CANADIAN SYLLABICS CARRIER TTSA
+1681 ; [.1D22.0020.0002.1681] # OGHAM LETTER BEITH
+1682 ; [.1D23.0020.0002.1682] # OGHAM LETTER LUIS
+1683 ; [.1D24.0020.0002.1683] # OGHAM LETTER FEARN
+1684 ; [.1D25.0020.0002.1684] # OGHAM LETTER SAIL
+1685 ; [.1D26.0020.0002.1685] # OGHAM LETTER NION
+1686 ; [.1D27.0020.0002.1686] # OGHAM LETTER UATH
+1687 ; [.1D28.0020.0002.1687] # OGHAM LETTER DAIR
+1688 ; [.1D29.0020.0002.1688] # OGHAM LETTER TINNE
+1689 ; [.1D2A.0020.0002.1689] # OGHAM LETTER COLL
+168A ; [.1D2B.0020.0002.168A] # OGHAM LETTER CEIRT
+168B ; [.1D2C.0020.0002.168B] # OGHAM LETTER MUIN
+168C ; [.1D2D.0020.0002.168C] # OGHAM LETTER GORT
+168D ; [.1D2E.0020.0002.168D] # OGHAM LETTER NGEADAL
+168E ; [.1D2F.0020.0002.168E] # OGHAM LETTER STRAIF
+168F ; [.1D30.0020.0002.168F] # OGHAM LETTER RUIS
+1690 ; [.1D31.0020.0002.1690] # OGHAM LETTER AILM
+1691 ; [.1D32.0020.0002.1691] # OGHAM LETTER ONN
+1692 ; [.1D33.0020.0002.1692] # OGHAM LETTER UR
+1693 ; [.1D34.0020.0002.1693] # OGHAM LETTER EADHADH
+1694 ; [.1D35.0020.0002.1694] # OGHAM LETTER IODHADH
+1695 ; [.1D36.0020.0002.1695] # OGHAM LETTER EABHADH
+1696 ; [.1D37.0020.0002.1696] # OGHAM LETTER OR
+1697 ; [.1D38.0020.0002.1697] # OGHAM LETTER UILLEANN
+1698 ; [.1D39.0020.0002.1698] # OGHAM LETTER IFIN
+1699 ; [.1D3A.0020.0002.1699] # OGHAM LETTER EAMHANCHOLL
+169A ; [.1D3B.0020.0002.169A] # OGHAM LETTER PEITH
+16A0 ; [.1D3C.0020.0002.16A0] # RUNIC LETTER FEHU FEOH FE F
+16A1 ; [.1D3C.0020.0004.16A1][.0000.015D.0004.16A1] # RUNIC LETTER V; QQKN
+16A2 ; [.1D3D.0020.0002.16A2] # RUNIC LETTER URUZ UR U
+16A4 ; [.1D3D.0020.0004.16A4][.0000.015D.0004.16A4] # RUNIC LETTER Y; QQKN
+16A5 ; [.1D3D.0020.0004.16A5][.0000.015E.0004.16A5] # RUNIC LETTER W; QQKN
+16A6 ; [.1D3E.0020.0002.16A6] # RUNIC LETTER THURISAZ THURS THORN
+16A7 ; [.1D3E.0020.0004.16A7][.0000.015D.0004.16A7] # RUNIC LETTER ETH; QQKN
+16F0 ; [.1D3E.0020.0004.16F0][.1D3E.0020.0004.16F0] # RUNIC BELGTHOR SYMBOL; QQKN
+16A8 ; [.1D3F.0020.0002.16A8] # RUNIC LETTER ANSUZ A
+16A9 ; [.1D3F.0020.0004.16A9][.0000.015D.0004.16A9] # RUNIC LETTER OS O; QQKN
+16AC ; [.1D3F.0020.0004.16AC][.0000.015E.0004.16AC] # RUNIC LETTER LONG-BRANCH-OSS O; QQKN
+16AD ; [.1D3F.0020.0004.16AD][.0000.0160.0004.16AD] # RUNIC LETTER SHORT-TWIG-OSS O; QQKN
+16AE ; [.1D3F.0020.0004.16AE][.0000.0161.0004.16AE] # RUNIC LETTER O; QQKN
+16AF ; [.1D40.0020.0002.16AF] # RUNIC LETTER OE
+16B0 ; [.1D41.0020.0002.16B0] # RUNIC LETTER ON
+16B1 ; [.1D42.0020.0002.16B1] # RUNIC LETTER RAIDO RAD REID R
+16B2 ; [.1D43.0020.0002.16B2] # RUNIC LETTER KAUNA
+16B3 ; [.1D43.0020.0004.16B3][.0000.015D.0004.16B3] # RUNIC LETTER CEN; QQKN
+16B4 ; [.1D43.0020.0004.16B4][.0000.015E.0004.16B4] # RUNIC LETTER KAUN K; QQKN
+16B5 ; [.1D43.0020.0004.16B5][.0000.0160.0004.16B5] # RUNIC LETTER G; QQKN
+16B6 ; [.1D43.0020.0004.16B6][.0000.0161.0004.16B6] # RUNIC LETTER ENG; QQKN
+16B7 ; [.1D44.0020.0002.16B7] # RUNIC LETTER GEBO GYFU G
+16B9 ; [.1D45.0020.0002.16B9] # RUNIC LETTER WUNJO WYNN W
+16E9 ; [.1D45.0020.0004.16E9][.0000.015D.0004.16E9] # RUNIC LETTER Q; QQKN
+16BA ; [.1D46.0020.0002.16BA] # RUNIC LETTER HAGLAZ H
+16BB ; [.1D46.0020.0004.16BB][.0000.015D.0004.16BB] # RUNIC LETTER HAEGL H; QQKN
+16BC ; [.1D46.0020.0004.16BC][.0000.015E.0004.16BC] # RUNIC LETTER LONG-BRANCH-HAGALL H; QQKN
+16BD ; [.1D46.0020.0004.16BD][.0000.0160.0004.16BD] # RUNIC LETTER SHORT-TWIG-HAGALL H; QQKN
+16BE ; [.1D47.0020.0002.16BE] # RUNIC LETTER NAUDIZ NYD NAUD N
+16BF ; [.1D47.0020.0004.16BF][.0000.015D.0004.16BF] # RUNIC LETTER SHORT-TWIG-NAUD N; QQKN
+16C0 ; [.1D47.0020.0004.16C0][.0000.015E.0004.16C0] # RUNIC LETTER DOTTED-N; QQKN
+16C1 ; [.1D48.0020.0002.16C1] # RUNIC LETTER ISAZ IS ISS I
+16C2 ; [.1D48.0020.0004.16C2][.0000.015D.0004.16C2] # RUNIC LETTER E; QQKN
+16C3 ; [.1D49.0020.0002.16C3] # RUNIC LETTER JERAN J
+16C4 ; [.1D49.0020.0004.16C4][.0000.015D.0004.16C4] # RUNIC LETTER GER; QQKN
+16C5 ; [.1D4A.0020.0002.16C5] # RUNIC LETTER LONG-BRANCH-AR AE
+16C6 ; [.1D4A.0020.0004.16C6][.0000.015D.0004.16C6] # RUNIC LETTER SHORT-TWIG-AR A; QQKN
+16EE ; [.1D4A.0020.0004.16EE][.1D53.0020.0004.16EE] # RUNIC ARLAUG SYMBOL; QQKN
+16C7 ; [.1D4B.0020.0002.16C7] # RUNIC LETTER IWAZ EOH
+16C8 ; [.1D4C.0020.0002.16C8] # RUNIC LETTER PERTHO PEORTH P
+16D5 ; [.1D4C.0020.0004.16D5][.0000.015D.0004.16D5] # RUNIC LETTER OPEN-P; QQKN
+16C9 ; [.1D4D.0020.0002.16C9] # RUNIC LETTER ALGIZ EOLHX
+16CA ; [.1D4E.0020.0002.16CA] # RUNIC LETTER SOWILO S
+16CB ; [.1D4E.0020.0004.16CB][.0000.015D.0004.16CB] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S; QQKN
+16EA ; [.1D4E.0020.0004.16EA][.0000.015E.0004.16EA] # RUNIC LETTER X; QQKN
+16CC ; [.1D4E.0020.0004.16CC][.0000.0160.0004.16CC] # RUNIC LETTER SHORT-TWIG-SOL S; QQKN
+16CD ; [.1D4E.0020.0004.16CD][.0000.0161.0004.16CD] # RUNIC LETTER C; QQKN
+16CE ; [.1D4E.0020.0004.16CE][.0000.0162.0004.16CE] # RUNIC LETTER Z; QQKN
+16CF ; [.1D4F.0020.0002.16CF] # RUNIC LETTER TIWAZ TIR TYR T
+16D0 ; [.1D4F.0020.0004.16D0][.0000.015D.0004.16D0] # RUNIC LETTER SHORT-TWIG-TYR T; QQKN
+16D1 ; [.1D4F.0020.0004.16D1][.0000.015E.0004.16D1] # RUNIC LETTER D; QQKN
+16D2 ; [.1D50.0020.0002.16D2] # RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3 ; [.1D50.0020.0004.16D3][.0000.015D.0004.16D3] # RUNIC LETTER SHORT-TWIG-BJARKAN B; QQKN
+16D4 ; [.1D50.0020.0004.16D4][.0000.015E.0004.16D4] # RUNIC LETTER DOTTED-P; QQKN
+16D6 ; [.1D51.0020.0002.16D6] # RUNIC LETTER EHWAZ EH E
+16D7 ; [.1D52.0020.0002.16D7] # RUNIC LETTER MANNAZ MAN M
+16D8 ; [.1D52.0020.0004.16D8][.0000.015D.0004.16D8] # RUNIC LETTER LONG-BRANCH-MADR M; QQKN
+16D9 ; [.1D52.0020.0004.16D9][.0000.015E.0004.16D9] # RUNIC LETTER SHORT-TWIG-MADR M; QQKN
+16EF ; [.1D52.0020.0004.16EF][.0000.015D.0004.16EF][.1D52.0020.001F.16EF][.0000.015D.001F.16EF] # RUNIC TVIMADUR SYMBOL; QQKN
+16DA ; [.1D53.0020.0002.16DA] # RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB ; [.1D53.0020.0004.16DB][.0000.015D.0004.16DB] # RUNIC LETTER DOTTED-L; QQKN
+16DC ; [.1D54.0020.0002.16DC] # RUNIC LETTER INGWAZ
+16DD ; [.1D54.0020.0004.16DD][.0000.015D.0004.16DD] # RUNIC LETTER ING; QQKN
+16DE ; [.1D55.0020.0002.16DE] # RUNIC LETTER DAGAZ DAEG D
+16DF ; [.1D56.0020.0002.16DF] # RUNIC LETTER OTHALAN ETHEL O
+16AA ; [.1D57.0020.0002.16AA] # RUNIC LETTER AC A
+16AB ; [.1D58.0020.0002.16AB] # RUNIC LETTER AESC
+16A3 ; [.1D59.0020.0002.16A3] # RUNIC LETTER YR
+16E0 ; [.1D5A.0020.0002.16E0] # RUNIC LETTER EAR
+16E3 ; [.1D5B.0020.0002.16E3] # RUNIC LETTER CALC
+16B8 ; [.1D5C.0020.0002.16B8] # RUNIC LETTER GAR
+16E4 ; [.1D5D.0020.0002.16E4] # RUNIC LETTER CEALC
+16E1 ; [.1D5E.0020.0002.16E1] # RUNIC LETTER IOR
+16E2 ; [.1D5F.0020.0002.16E2] # RUNIC LETTER CWEORTH
+16E5 ; [.1D60.0020.0002.16E5] # RUNIC LETTER STAN
+16E6 ; [.1D61.0020.0002.16E6] # RUNIC LETTER LONG-BRANCH-YR
+16E7 ; [.1D61.0020.0004.16E7][.0000.015D.0004.16E7] # RUNIC LETTER SHORT-TWIG-YR; QQKN
+16E8 ; [.1D61.0020.0004.16E8][.0000.015E.0004.16E8] # RUNIC LETTER ICELANDIC-YR; QQKN
+1100 ; [.1D62.0020.0002.1100] # HANGUL CHOSEONG KIYEOK
+3131 ; [.1D62.0020.0004.3131] # HANGUL LETTER KIYEOK; QQK
+3200 ; [*0288.0020.0004.3200][.1D62.0020.0004.3200][*0289.0020.001F.3200] # PARENTHESIZED HANGUL KIYEOK; QQKN
+3260 ; [.1D62.0020.0006.3260] # CIRCLED HANGUL KIYEOK; QQK
+FFA1 ; [.1D62.0020.0012.FFA1] # HALFWIDTH HANGUL LETTER KIYEOK; QQK
+320E ; [*0288.0020.0004.320E][.1D62.0020.0004.320E][.1DBE.0020.001F.320E][*0289.0020.001F.320E] # PARENTHESIZED HANGUL KIYEOK A; QQKN
+326E ; [.1D62.0020.0006.326E][.1DBE.0020.0006.326E] # CIRCLED HANGUL KIYEOK A; QQKN
+1101 ; [.1D63.0020.0002.1101] # HANGUL CHOSEONG SSANGKIYEOK
+3132 ; [.1D63.0020.0004.3132] # HANGUL LETTER SSANGKIYEOK; QQK
+FFA2 ; [.1D63.0020.0012.FFA2] # HALFWIDTH HANGUL LETTER SSANGKIYEOK; QQK
+1102 ; [.1D64.0020.0002.1102] # HANGUL CHOSEONG NIEUN
+3134 ; [.1D64.0020.0004.3134] # HANGUL LETTER NIEUN; QQK
+3201 ; [*0288.0020.0004.3201][.1D64.0020.0004.3201][*0289.0020.001F.3201] # PARENTHESIZED HANGUL NIEUN; QQKN
+3261 ; [.1D64.0020.0006.3261] # CIRCLED HANGUL NIEUN; QQK
+FFA4 ; [.1D64.0020.0012.FFA4] # HALFWIDTH HANGUL LETTER NIEUN; QQK
+320F ; [*0288.0020.0004.320F][.1D64.0020.0004.320F][.1DBE.0020.001F.320F][*0289.0020.001F.320F] # PARENTHESIZED HANGUL NIEUN A; QQKN
+326F ; [.1D64.0020.0006.326F][.1DBE.0020.0006.326F] # CIRCLED HANGUL NIEUN A; QQKN
+1103 ; [.1D65.0020.0002.1103] # HANGUL CHOSEONG TIKEUT
+3137 ; [.1D65.0020.0004.3137] # HANGUL LETTER TIKEUT; QQK
+3202 ; [*0288.0020.0004.3202][.1D65.0020.0004.3202][*0289.0020.001F.3202] # PARENTHESIZED HANGUL TIKEUT; QQKN
+3262 ; [.1D65.0020.0006.3262] # CIRCLED HANGUL TIKEUT; QQK
+FFA7 ; [.1D65.0020.0012.FFA7] # HALFWIDTH HANGUL LETTER TIKEUT; QQK
+3210 ; [*0288.0020.0004.3210][.1D65.0020.0004.3210][.1DBE.0020.001F.3210][*0289.0020.001F.3210] # PARENTHESIZED HANGUL TIKEUT A; QQKN
+3270 ; [.1D65.0020.0006.3270][.1DBE.0020.0006.3270] # CIRCLED HANGUL TIKEUT A; QQKN
+1104 ; [.1D66.0020.0002.1104] # HANGUL CHOSEONG SSANGTIKEUT
+3138 ; [.1D66.0020.0004.3138] # HANGUL LETTER SSANGTIKEUT; QQK
+FFA8 ; [.1D66.0020.0012.FFA8] # HALFWIDTH HANGUL LETTER SSANGTIKEUT; QQK
+1105 ; [.1D67.0020.0002.1105] # HANGUL CHOSEONG RIEUL
+3139 ; [.1D67.0020.0004.3139] # HANGUL LETTER RIEUL; QQK
+3203 ; [*0288.0020.0004.3203][.1D67.0020.0004.3203][*0289.0020.001F.3203] # PARENTHESIZED HANGUL RIEUL; QQKN
+3263 ; [.1D67.0020.0006.3263] # CIRCLED HANGUL RIEUL; QQK
+FFA9 ; [.1D67.0020.0012.FFA9] # HALFWIDTH HANGUL LETTER RIEUL; QQK
+3211 ; [*0288.0020.0004.3211][.1D67.0020.0004.3211][.1DBE.0020.001F.3211][*0289.0020.001F.3211] # PARENTHESIZED HANGUL RIEUL A; QQKN
+3271 ; [.1D67.0020.0006.3271][.1DBE.0020.0006.3271] # CIRCLED HANGUL RIEUL A; QQKN
+1106 ; [.1D68.0020.0002.1106] # HANGUL CHOSEONG MIEUM
+3141 ; [.1D68.0020.0004.3141] # HANGUL LETTER MIEUM; QQK
+3204 ; [*0288.0020.0004.3204][.1D68.0020.0004.3204][*0289.0020.001F.3204] # PARENTHESIZED HANGUL MIEUM; QQKN
+3264 ; [.1D68.0020.0006.3264] # CIRCLED HANGUL MIEUM; QQK
+FFB1 ; [.1D68.0020.0012.FFB1] # HALFWIDTH HANGUL LETTER MIEUM; QQK
+3212 ; [*0288.0020.0004.3212][.1D68.0020.0004.3212][.1DBE.0020.001F.3212][*0289.0020.001F.3212] # PARENTHESIZED HANGUL MIEUM A; QQKN
+3272 ; [.1D68.0020.0006.3272][.1DBE.0020.0006.3272] # CIRCLED HANGUL MIEUM A; QQKN
+1107 ; [.1D69.0020.0002.1107] # HANGUL CHOSEONG PIEUP
+3142 ; [.1D69.0020.0004.3142] # HANGUL LETTER PIEUP; QQK
+3205 ; [*0288.0020.0004.3205][.1D69.0020.0004.3205][*0289.0020.001F.3205] # PARENTHESIZED HANGUL PIEUP; QQKN
+3265 ; [.1D69.0020.0006.3265] # CIRCLED HANGUL PIEUP; QQK
+FFB2 ; [.1D69.0020.0012.FFB2] # HALFWIDTH HANGUL LETTER PIEUP; QQK
+3213 ; [*0288.0020.0004.3213][.1D69.0020.0004.3213][.1DBE.0020.001F.3213][*0289.0020.001F.3213] # PARENTHESIZED HANGUL PIEUP A; QQKN
+3273 ; [.1D69.0020.0006.3273][.1DBE.0020.0006.3273] # CIRCLED HANGUL PIEUP A; QQKN
+1108 ; [.1D6A.0020.0002.1108] # HANGUL CHOSEONG SSANGPIEUP
+3143 ; [.1D6A.0020.0004.3143] # HANGUL LETTER SSANGPIEUP; QQK
+FFB3 ; [.1D6A.0020.0012.FFB3] # HALFWIDTH HANGUL LETTER SSANGPIEUP; QQK
+1109 ; [.1D6B.0020.0002.1109] # HANGUL CHOSEONG SIOS
+3145 ; [.1D6B.0020.0004.3145] # HANGUL LETTER SIOS; QQK
+3206 ; [*0288.0020.0004.3206][.1D6B.0020.0004.3206][*0289.0020.001F.3206] # PARENTHESIZED HANGUL SIOS; QQKN
+3266 ; [.1D6B.0020.0006.3266] # CIRCLED HANGUL SIOS; QQK
+FFB5 ; [.1D6B.0020.0012.FFB5] # HALFWIDTH HANGUL LETTER SIOS; QQK
+3214 ; [*0288.0020.0004.3214][.1D6B.0020.0004.3214][.1DBE.0020.001F.3214][*0289.0020.001F.3214] # PARENTHESIZED HANGUL SIOS A; QQKN
+3274 ; [.1D6B.0020.0006.3274][.1DBE.0020.0006.3274] # CIRCLED HANGUL SIOS A; QQKN
+110A ; [.1D6C.0020.0002.110A] # HANGUL CHOSEONG SSANGSIOS
+3146 ; [.1D6C.0020.0004.3146] # HANGUL LETTER SSANGSIOS; QQK
+FFB6 ; [.1D6C.0020.0012.FFB6] # HALFWIDTH HANGUL LETTER SSANGSIOS; QQK
+110B ; [.1D6D.0020.0002.110B] # HANGUL CHOSEONG IEUNG
+3147 ; [.1D6D.0020.0004.3147] # HANGUL LETTER IEUNG; QQK
+3207 ; [*0288.0020.0004.3207][.1D6D.0020.0004.3207][*0289.0020.001F.3207] # PARENTHESIZED HANGUL IEUNG; QQKN
+3267 ; [.1D6D.0020.0006.3267] # CIRCLED HANGUL IEUNG; QQK
+FFB7 ; [.1D6D.0020.0012.FFB7] # HALFWIDTH HANGUL LETTER IEUNG; QQK
+3215 ; [*0288.0020.0004.3215][.1D6D.0020.0004.3215][.1DBE.0020.001F.3215][*0289.0020.001F.3215] # PARENTHESIZED HANGUL IEUNG A; QQKN
+3275 ; [.1D6D.0020.0006.3275][.1DBE.0020.0006.3275] # CIRCLED HANGUL IEUNG A; QQKN
+321D ; [*0288.0020.0004.321D][.1D6D.0020.0004.321D][.1DC6.0020.001F.321D][.1D6E.0020.001F.321D][.1DC2.0020.001F.321D][.1E03.0020.001F.321D][*0289.0020.001F.321D] # PARENTHESIZED KOREAN CHARACTER OJEON; QQKN
+321E ; [*0288.0020.0004.321E][.1D6D.0020.0004.321E][.1DC6.0020.001F.321E][.1D74.0020.001F.321E][.1DCB.0020.001F.321E][*0289.0020.001F.321E] # PARENTHESIZED KOREAN CHARACTER O HU; QQKN
+110C ; [.1D6E.0020.0002.110C] # HANGUL CHOSEONG CIEUC
+3148 ; [.1D6E.0020.0004.3148] # HANGUL LETTER CIEUC; QQK
+3208 ; [*0288.0020.0004.3208][.1D6E.0020.0004.3208][*0289.0020.001F.3208] # PARENTHESIZED HANGUL CIEUC; QQKN
+3268 ; [.1D6E.0020.0006.3268] # CIRCLED HANGUL CIEUC; QQK
+FFB8 ; [.1D6E.0020.0012.FFB8] # HALFWIDTH HANGUL LETTER CIEUC; QQK
+3216 ; [*0288.0020.0004.3216][.1D6E.0020.0004.3216][.1DBE.0020.001F.3216][*0289.0020.001F.3216] # PARENTHESIZED HANGUL CIEUC A; QQKN
+3276 ; [.1D6E.0020.0006.3276][.1DBE.0020.0006.3276] # CIRCLED HANGUL CIEUC A; QQKN
+321C ; [*0288.0020.0004.321C][.1D6E.0020.0004.321C][.1DCB.0020.001F.321C][*0289.0020.001F.321C] # PARENTHESIZED HANGUL CIEUC U; QQKN
+327D ; [.1D6E.0020.0006.327D][.1DCB.0020.0006.327D][.1D6D.0020.001F.327D][.1DD1.0020.001F.327D] # CIRCLED KOREAN CHARACTER JUEUI; QQKN
+110D ; [.1D6F.0020.0002.110D] # HANGUL CHOSEONG SSANGCIEUC
+3149 ; [.1D6F.0020.0004.3149] # HANGUL LETTER SSANGCIEUC; QQK
+FFB9 ; [.1D6F.0020.0012.FFB9] # HALFWIDTH HANGUL LETTER SSANGCIEUC; QQK
+110E ; [.1D70.0020.0002.110E] # HANGUL CHOSEONG CHIEUCH
+314A ; [.1D70.0020.0004.314A] # HANGUL LETTER CHIEUCH; QQK
+3209 ; [*0288.0020.0004.3209][.1D70.0020.0004.3209][*0289.0020.001F.3209] # PARENTHESIZED HANGUL CHIEUCH; QQKN
+3269 ; [.1D70.0020.0006.3269] # CIRCLED HANGUL CHIEUCH; QQK
+FFBA ; [.1D70.0020.0012.FFBA] # HALFWIDTH HANGUL LETTER CHIEUCH; QQK
+3217 ; [*0288.0020.0004.3217][.1D70.0020.0004.3217][.1DBE.0020.001F.3217][*0289.0020.001F.3217] # PARENTHESIZED HANGUL CHIEUCH A; QQKN
+3277 ; [.1D70.0020.0006.3277][.1DBE.0020.0006.3277] # CIRCLED HANGUL CHIEUCH A; QQKN
+327C ; [.1D70.0020.0006.327C][.1DBE.0020.0006.327C][.1E0F.0020.001F.327C][.1D62.0020.001F.327C][.1DC6.0020.001F.327C] # CIRCLED KOREAN CHARACTER CHAMKO; QQKN
+110F ; [.1D71.0020.0002.110F] # HANGUL CHOSEONG KHIEUKH
+314B ; [.1D71.0020.0004.314B] # HANGUL LETTER KHIEUKH; QQK
+320A ; [*0288.0020.0004.320A][.1D71.0020.0004.320A][*0289.0020.001F.320A] # PARENTHESIZED HANGUL KHIEUKH; QQKN
+326A ; [.1D71.0020.0006.326A] # CIRCLED HANGUL KHIEUKH; QQK
+FFBB ; [.1D71.0020.0012.FFBB] # HALFWIDTH HANGUL LETTER KHIEUKH; QQK
+3218 ; [*0288.0020.0004.3218][.1D71.0020.0004.3218][.1DBE.0020.001F.3218][*0289.0020.001F.3218] # PARENTHESIZED HANGUL KHIEUKH A; QQKN
+3278 ; [.1D71.0020.0006.3278][.1DBE.0020.0006.3278] # CIRCLED HANGUL KHIEUKH A; QQKN
+1110 ; [.1D72.0020.0002.1110] # HANGUL CHOSEONG THIEUTH
+314C ; [.1D72.0020.0004.314C] # HANGUL LETTER THIEUTH; QQK
+320B ; [*0288.0020.0004.320B][.1D72.0020.0004.320B][*0289.0020.001F.320B] # PARENTHESIZED HANGUL THIEUTH; QQKN
+326B ; [.1D72.0020.0006.326B] # CIRCLED HANGUL THIEUTH; QQK
+FFBC ; [.1D72.0020.0012.FFBC] # HALFWIDTH HANGUL LETTER THIEUTH; QQK
+3219 ; [*0288.0020.0004.3219][.1D72.0020.0004.3219][.1DBE.0020.001F.3219][*0289.0020.001F.3219] # PARENTHESIZED HANGUL THIEUTH A; QQKN
+3279 ; [.1D72.0020.0006.3279][.1DBE.0020.0006.3279] # CIRCLED HANGUL THIEUTH A; QQKN
+1111 ; [.1D73.0020.0002.1111] # HANGUL CHOSEONG PHIEUPH
+314D ; [.1D73.0020.0004.314D] # HANGUL LETTER PHIEUPH; QQK
+320C ; [*0288.0020.0004.320C][.1D73.0020.0004.320C][*0289.0020.001F.320C] # PARENTHESIZED HANGUL PHIEUPH; QQKN
+326C ; [.1D73.0020.0006.326C] # CIRCLED HANGUL PHIEUPH; QQK
+FFBD ; [.1D73.0020.0012.FFBD] # HALFWIDTH HANGUL LETTER PHIEUPH; QQK
+321A ; [*0288.0020.0004.321A][.1D73.0020.0004.321A][.1DBE.0020.001F.321A][*0289.0020.001F.321A] # PARENTHESIZED HANGUL PHIEUPH A; QQKN
+327A ; [.1D73.0020.0006.327A][.1DBE.0020.0006.327A] # CIRCLED HANGUL PHIEUPH A; QQKN
+1112 ; [.1D74.0020.0002.1112] # HANGUL CHOSEONG HIEUH
+314E ; [.1D74.0020.0004.314E] # HANGUL LETTER HIEUH; QQK
+320D ; [*0288.0020.0004.320D][.1D74.0020.0004.320D][*0289.0020.001F.320D] # PARENTHESIZED HANGUL HIEUH; QQKN
+326D ; [.1D74.0020.0006.326D] # CIRCLED HANGUL HIEUH; QQK
+FFBE ; [.1D74.0020.0012.FFBE] # HALFWIDTH HANGUL LETTER HIEUH; QQK
+321B ; [*0288.0020.0004.321B][.1D74.0020.0004.321B][.1DBE.0020.001F.321B][*0289.0020.001F.321B] # PARENTHESIZED HANGUL HIEUH A; QQKN
+327B ; [.1D74.0020.0006.327B][.1DBE.0020.0006.327B] # CIRCLED HANGUL HIEUH A; QQKN
+1113 ; [.1D75.0020.0002.1113] # HANGUL CHOSEONG NIEUN-KIYEOK
+1114 ; [.1D76.0020.0002.1114] # HANGUL CHOSEONG SSANGNIEUN
+3165 ; [.1D76.0020.0004.3165] # HANGUL LETTER SSANGNIEUN; QQK
+1115 ; [.1D77.0020.0002.1115] # HANGUL CHOSEONG NIEUN-TIKEUT
+3166 ; [.1D77.0020.0004.3166] # HANGUL LETTER NIEUN-TIKEUT; QQK
+1116 ; [.1D78.0020.0002.1116] # HANGUL CHOSEONG NIEUN-PIEUP
+1117 ; [.1D79.0020.0002.1117] # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118 ; [.1D7A.0020.0002.1118] # HANGUL CHOSEONG RIEUL-NIEUN
+1119 ; [.1D7B.0020.0002.1119] # HANGUL CHOSEONG SSANGRIEUL
+111A ; [.1D7C.0020.0002.111A] # HANGUL CHOSEONG RIEUL-HIEUH
+3140 ; [.1D7C.0020.0004.3140] # HANGUL LETTER RIEUL-HIEUH; QQK
+FFB0 ; [.1D7C.0020.0012.FFB0] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH; QQK
+111B ; [.1D7D.0020.0002.111B] # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C ; [.1D7E.0020.0002.111C] # HANGUL CHOSEONG MIEUM-PIEUP
+316E ; [.1D7E.0020.0004.316E] # HANGUL LETTER MIEUM-PIEUP; QQK
+111D ; [.1D7F.0020.0002.111D] # HANGUL CHOSEONG KAPYEOUNMIEUM
+3171 ; [.1D7F.0020.0004.3171] # HANGUL LETTER KAPYEOUNMIEUM; QQK
+111E ; [.1D80.0020.0002.111E] # HANGUL CHOSEONG PIEUP-KIYEOK
+3172 ; [.1D80.0020.0004.3172] # HANGUL LETTER PIEUP-KIYEOK; QQK
+111F ; [.1D81.0020.0002.111F] # HANGUL CHOSEONG PIEUP-NIEUN
+1120 ; [.1D82.0020.0002.1120] # HANGUL CHOSEONG PIEUP-TIKEUT
+3173 ; [.1D82.0020.0004.3173] # HANGUL LETTER PIEUP-TIKEUT; QQK
+1121 ; [.1D83.0020.0002.1121] # HANGUL CHOSEONG PIEUP-SIOS
+3144 ; [.1D83.0020.0004.3144] # HANGUL LETTER PIEUP-SIOS; QQK
+FFB4 ; [.1D83.0020.0012.FFB4] # HALFWIDTH HANGUL LETTER PIEUP-SIOS; QQK
+1122 ; [.1D84.0020.0002.1122] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+3174 ; [.1D84.0020.0004.3174] # HANGUL LETTER PIEUP-SIOS-KIYEOK; QQK
+1123 ; [.1D85.0020.0002.1123] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+3175 ; [.1D85.0020.0004.3175] # HANGUL LETTER PIEUP-SIOS-TIKEUT; QQK
+1124 ; [.1D86.0020.0002.1124] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125 ; [.1D87.0020.0002.1125] # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126 ; [.1D88.0020.0002.1126] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127 ; [.1D89.0020.0002.1127] # HANGUL CHOSEONG PIEUP-CIEUC
+3176 ; [.1D89.0020.0004.3176] # HANGUL LETTER PIEUP-CIEUC; QQK
+1128 ; [.1D8A.0020.0002.1128] # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129 ; [.1D8B.0020.0002.1129] # HANGUL CHOSEONG PIEUP-THIEUTH
+3177 ; [.1D8B.0020.0004.3177] # HANGUL LETTER PIEUP-THIEUTH; QQK
+112A ; [.1D8C.0020.0002.112A] # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B ; [.1D8D.0020.0002.112B] # HANGUL CHOSEONG KAPYEOUNPIEUP
+3178 ; [.1D8D.0020.0004.3178] # HANGUL LETTER KAPYEOUNPIEUP; QQK
+112C ; [.1D8E.0020.0002.112C] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+3179 ; [.1D8E.0020.0004.3179] # HANGUL LETTER KAPYEOUNSSANGPIEUP; QQK
+112D ; [.1D8F.0020.0002.112D] # HANGUL CHOSEONG SIOS-KIYEOK
+317A ; [.1D8F.0020.0004.317A] # HANGUL LETTER SIOS-KIYEOK; QQK
+112E ; [.1D90.0020.0002.112E] # HANGUL CHOSEONG SIOS-NIEUN
+317B ; [.1D90.0020.0004.317B] # HANGUL LETTER SIOS-NIEUN; QQK
+112F ; [.1D91.0020.0002.112F] # HANGUL CHOSEONG SIOS-TIKEUT
+317C ; [.1D91.0020.0004.317C] # HANGUL LETTER SIOS-TIKEUT; QQK
+1130 ; [.1D92.0020.0002.1130] # HANGUL CHOSEONG SIOS-RIEUL
+1131 ; [.1D93.0020.0002.1131] # HANGUL CHOSEONG SIOS-MIEUM
+1132 ; [.1D94.0020.0002.1132] # HANGUL CHOSEONG SIOS-PIEUP
+317D ; [.1D94.0020.0004.317D] # HANGUL LETTER SIOS-PIEUP; QQK
+1133 ; [.1D95.0020.0002.1133] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134 ; [.1D96.0020.0002.1134] # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135 ; [.1D97.0020.0002.1135] # HANGUL CHOSEONG SIOS-IEUNG
+1136 ; [.1D98.0020.0002.1136] # HANGUL CHOSEONG SIOS-CIEUC
+317E ; [.1D98.0020.0004.317E] # HANGUL LETTER SIOS-CIEUC; QQK
+1137 ; [.1D99.0020.0002.1137] # HANGUL CHOSEONG SIOS-CHIEUCH
+1138 ; [.1D9A.0020.0002.1138] # HANGUL CHOSEONG SIOS-KHIEUKH
+1139 ; [.1D9B.0020.0002.1139] # HANGUL CHOSEONG SIOS-THIEUTH
+113A ; [.1D9C.0020.0002.113A] # HANGUL CHOSEONG SIOS-PHIEUPH
+113B ; [.1D9D.0020.0002.113B] # HANGUL CHOSEONG SIOS-HIEUH
+113C ; [.1D9E.0020.0002.113C] # HANGUL CHOSEONG CHITUEUMSIOS
+113D ; [.1D9F.0020.0002.113D] # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E ; [.1DA0.0020.0002.113E] # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F ; [.1DA1.0020.0002.113F] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140 ; [.1DA2.0020.0002.1140] # HANGUL CHOSEONG PANSIOS
+317F ; [.1DA2.0020.0004.317F] # HANGUL LETTER PANSIOS; QQK
+1141 ; [.1DA3.0020.0002.1141] # HANGUL CHOSEONG IEUNG-KIYEOK
+1142 ; [.1DA4.0020.0002.1142] # HANGUL CHOSEONG IEUNG-TIKEUT
+1143 ; [.1DA5.0020.0002.1143] # HANGUL CHOSEONG IEUNG-MIEUM
+1144 ; [.1DA6.0020.0002.1144] # HANGUL CHOSEONG IEUNG-PIEUP
+1145 ; [.1DA7.0020.0002.1145] # HANGUL CHOSEONG IEUNG-SIOS
+1146 ; [.1DA8.0020.0002.1146] # HANGUL CHOSEONG IEUNG-PANSIOS
+1147 ; [.1DA9.0020.0002.1147] # HANGUL CHOSEONG SSANGIEUNG
+3180 ; [.1DA9.0020.0004.3180] # HANGUL LETTER SSANGIEUNG; QQK
+1148 ; [.1DAA.0020.0002.1148] # HANGUL CHOSEONG IEUNG-CIEUC
+1149 ; [.1DAB.0020.0002.1149] # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A ; [.1DAC.0020.0002.114A] # HANGUL CHOSEONG IEUNG-THIEUTH
+114B ; [.1DAD.0020.0002.114B] # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C ; [.1DAE.0020.0002.114C] # HANGUL CHOSEONG YESIEUNG
+3181 ; [.1DAE.0020.0004.3181] # HANGUL LETTER YESIEUNG; QQK
+114D ; [.1DAF.0020.0002.114D] # HANGUL CHOSEONG CIEUC-IEUNG
+114E ; [.1DB0.0020.0002.114E] # HANGUL CHOSEONG CHITUEUMCIEUC
+114F ; [.1DB1.0020.0002.114F] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150 ; [.1DB2.0020.0002.1150] # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151 ; [.1DB3.0020.0002.1151] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152 ; [.1DB4.0020.0002.1152] # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153 ; [.1DB5.0020.0002.1153] # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154 ; [.1DB6.0020.0002.1154] # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155 ; [.1DB7.0020.0002.1155] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156 ; [.1DB8.0020.0002.1156] # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157 ; [.1DB9.0020.0002.1157] # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+3184 ; [.1DB9.0020.0004.3184] # HANGUL LETTER KAPYEOUNPHIEUPH; QQK
+1158 ; [.1DBA.0020.0002.1158] # HANGUL CHOSEONG SSANGHIEUH
+3185 ; [.1DBA.0020.0004.3185] # HANGUL LETTER SSANGHIEUH; QQK
+1159 ; [.1DBB.0020.0002.1159] # HANGUL CHOSEONG YEORINHIEUH
+3186 ; [.1DBB.0020.0004.3186] # HANGUL LETTER YEORINHIEUH; QQK
+115F ; [.1DBC.0020.0002.115F] # HANGUL CHOSEONG FILLER
+1160 ; [.1DBD.0020.0002.1160] # HANGUL JUNGSEONG FILLER
+3164 ; [.1DBD.0020.0004.3164] # HANGUL FILLER; QQK
+FFA0 ; [.1DBD.0020.0012.FFA0] # HALFWIDTH HANGUL FILLER; QQK
+1161 ; [.1DBE.0020.0002.1161] # HANGUL JUNGSEONG A
+314F ; [.1DBE.0020.0004.314F] # HANGUL LETTER A; QQK
+FFC2 ; [.1DBE.0020.0012.FFC2] # HALFWIDTH HANGUL LETTER A; QQK
+1162 ; [.1DBF.0020.0002.1162] # HANGUL JUNGSEONG AE
+3150 ; [.1DBF.0020.0004.3150] # HANGUL LETTER AE; QQK
+FFC3 ; [.1DBF.0020.0012.FFC3] # HALFWIDTH HANGUL LETTER AE; QQK
+1163 ; [.1DC0.0020.0002.1163] # HANGUL JUNGSEONG YA
+3151 ; [.1DC0.0020.0004.3151] # HANGUL LETTER YA; QQK
+FFC4 ; [.1DC0.0020.0012.FFC4] # HALFWIDTH HANGUL LETTER YA; QQK
+1164 ; [.1DC1.0020.0002.1164] # HANGUL JUNGSEONG YAE
+3152 ; [.1DC1.0020.0004.3152] # HANGUL LETTER YAE; QQK
+FFC5 ; [.1DC1.0020.0012.FFC5] # HALFWIDTH HANGUL LETTER YAE; QQK
+1165 ; [.1DC2.0020.0002.1165] # HANGUL JUNGSEONG EO
+3153 ; [.1DC2.0020.0004.3153] # HANGUL LETTER EO; QQK
+FFC6 ; [.1DC2.0020.0012.FFC6] # HALFWIDTH HANGUL LETTER EO; QQK
+1166 ; [.1DC3.0020.0002.1166] # HANGUL JUNGSEONG E
+3154 ; [.1DC3.0020.0004.3154] # HANGUL LETTER E; QQK
+FFC7 ; [.1DC3.0020.0012.FFC7] # HALFWIDTH HANGUL LETTER E; QQK
+1167 ; [.1DC4.0020.0002.1167] # HANGUL JUNGSEONG YEO
+3155 ; [.1DC4.0020.0004.3155] # HANGUL LETTER YEO; QQK
+FFCA ; [.1DC4.0020.0012.FFCA] # HALFWIDTH HANGUL LETTER YEO; QQK
+1168 ; [.1DC5.0020.0002.1168] # HANGUL JUNGSEONG YE
+3156 ; [.1DC5.0020.0004.3156] # HANGUL LETTER YE; QQK
+FFCB ; [.1DC5.0020.0012.FFCB] # HALFWIDTH HANGUL LETTER YE; QQK
+1169 ; [.1DC6.0020.0002.1169] # HANGUL JUNGSEONG O
+3157 ; [.1DC6.0020.0004.3157] # HANGUL LETTER O; QQK
+FFCC ; [.1DC6.0020.0012.FFCC] # HALFWIDTH HANGUL LETTER O; QQK
+116A ; [.1DC7.0020.0002.116A] # HANGUL JUNGSEONG WA
+3158 ; [.1DC7.0020.0004.3158] # HANGUL LETTER WA; QQK
+FFCD ; [.1DC7.0020.0012.FFCD] # HALFWIDTH HANGUL LETTER WA; QQK
+116B ; [.1DC8.0020.0002.116B] # HANGUL JUNGSEONG WAE
+3159 ; [.1DC8.0020.0004.3159] # HANGUL LETTER WAE; QQK
+FFCE ; [.1DC8.0020.0012.FFCE] # HALFWIDTH HANGUL LETTER WAE; QQK
+116C ; [.1DC9.0020.0002.116C] # HANGUL JUNGSEONG OE
+315A ; [.1DC9.0020.0004.315A] # HANGUL LETTER OE; QQK
+FFCF ; [.1DC9.0020.0012.FFCF] # HALFWIDTH HANGUL LETTER OE; QQK
+116D ; [.1DCA.0020.0002.116D] # HANGUL JUNGSEONG YO
+315B ; [.1DCA.0020.0004.315B] # HANGUL LETTER YO; QQK
+FFD2 ; [.1DCA.0020.0012.FFD2] # HALFWIDTH HANGUL LETTER YO; QQK
+116E ; [.1DCB.0020.0002.116E] # HANGUL JUNGSEONG U
+315C ; [.1DCB.0020.0004.315C] # HANGUL LETTER U; QQK
+FFD3 ; [.1DCB.0020.0012.FFD3] # HALFWIDTH HANGUL LETTER U; QQK
+116F ; [.1DCC.0020.0002.116F] # HANGUL JUNGSEONG WEO
+315D ; [.1DCC.0020.0004.315D] # HANGUL LETTER WEO; QQK
+FFD4 ; [.1DCC.0020.0012.FFD4] # HALFWIDTH HANGUL LETTER WEO; QQK
+1170 ; [.1DCD.0020.0002.1170] # HANGUL JUNGSEONG WE
+315E ; [.1DCD.0020.0004.315E] # HANGUL LETTER WE; QQK
+FFD5 ; [.1DCD.0020.0012.FFD5] # HALFWIDTH HANGUL LETTER WE; QQK
+1171 ; [.1DCE.0020.0002.1171] # HANGUL JUNGSEONG WI
+315F ; [.1DCE.0020.0004.315F] # HANGUL LETTER WI; QQK
+FFD6 ; [.1DCE.0020.0012.FFD6] # HALFWIDTH HANGUL LETTER WI; QQK
+1172 ; [.1DCF.0020.0002.1172] # HANGUL JUNGSEONG YU
+3160 ; [.1DCF.0020.0004.3160] # HANGUL LETTER YU; QQK
+FFD7 ; [.1DCF.0020.0012.FFD7] # HALFWIDTH HANGUL LETTER YU; QQK
+1173 ; [.1DD0.0020.0002.1173] # HANGUL JUNGSEONG EU
+3161 ; [.1DD0.0020.0004.3161] # HANGUL LETTER EU; QQK
+FFDA ; [.1DD0.0020.0012.FFDA] # HALFWIDTH HANGUL LETTER EU; QQK
+1174 ; [.1DD1.0020.0002.1174] # HANGUL JUNGSEONG YI
+3162 ; [.1DD1.0020.0004.3162] # HANGUL LETTER YI; QQK
+FFDB ; [.1DD1.0020.0012.FFDB] # HALFWIDTH HANGUL LETTER YI; QQK
+1175 ; [.1DD2.0020.0002.1175] # HANGUL JUNGSEONG I
+3163 ; [.1DD2.0020.0004.3163] # HANGUL LETTER I; QQK
+FFDC ; [.1DD2.0020.0012.FFDC] # HALFWIDTH HANGUL LETTER I; QQK
+1176 ; [.1DD3.0020.0002.1176] # HANGUL JUNGSEONG A-O
+1177 ; [.1DD4.0020.0002.1177] # HANGUL JUNGSEONG A-U
+1178 ; [.1DD5.0020.0002.1178] # HANGUL JUNGSEONG YA-O
+1179 ; [.1DD6.0020.0002.1179] # HANGUL JUNGSEONG YA-YO
+117A ; [.1DD7.0020.0002.117A] # HANGUL JUNGSEONG EO-O
+117B ; [.1DD8.0020.0002.117B] # HANGUL JUNGSEONG EO-U
+117C ; [.1DD9.0020.0002.117C] # HANGUL JUNGSEONG EO-EU
+117D ; [.1DDA.0020.0002.117D] # HANGUL JUNGSEONG YEO-O
+117E ; [.1DDB.0020.0002.117E] # HANGUL JUNGSEONG YEO-U
+117F ; [.1DDC.0020.0002.117F] # HANGUL JUNGSEONG O-EO
+1180 ; [.1DDD.0020.0002.1180] # HANGUL JUNGSEONG O-E
+1181 ; [.1DDE.0020.0002.1181] # HANGUL JUNGSEONG O-YE
+1182 ; [.1DDF.0020.0002.1182] # HANGUL JUNGSEONG O-O
+1183 ; [.1DE0.0020.0002.1183] # HANGUL JUNGSEONG O-U
+1184 ; [.1DE1.0020.0002.1184] # HANGUL JUNGSEONG YO-YA
+3187 ; [.1DE1.0020.0004.3187] # HANGUL LETTER YO-YA; QQK
+1185 ; [.1DE2.0020.0002.1185] # HANGUL JUNGSEONG YO-YAE
+3188 ; [.1DE2.0020.0004.3188] # HANGUL LETTER YO-YAE; QQK
+1186 ; [.1DE3.0020.0002.1186] # HANGUL JUNGSEONG YO-YEO
+1187 ; [.1DE4.0020.0002.1187] # HANGUL JUNGSEONG YO-O
+1188 ; [.1DE5.0020.0002.1188] # HANGUL JUNGSEONG YO-I
+3189 ; [.1DE5.0020.0004.3189] # HANGUL LETTER YO-I; QQK
+1189 ; [.1DE6.0020.0002.1189] # HANGUL JUNGSEONG U-A
+118A ; [.1DE7.0020.0002.118A] # HANGUL JUNGSEONG U-AE
+118B ; [.1DE8.0020.0002.118B] # HANGUL JUNGSEONG U-EO-EU
+118C ; [.1DE9.0020.0002.118C] # HANGUL JUNGSEONG U-YE
+118D ; [.1DEA.0020.0002.118D] # HANGUL JUNGSEONG U-U
+118E ; [.1DEB.0020.0002.118E] # HANGUL JUNGSEONG YU-A
+118F ; [.1DEC.0020.0002.118F] # HANGUL JUNGSEONG YU-EO
+1190 ; [.1DED.0020.0002.1190] # HANGUL JUNGSEONG YU-E
+1191 ; [.1DEE.0020.0002.1191] # HANGUL JUNGSEONG YU-YEO
+318A ; [.1DEE.0020.0004.318A] # HANGUL LETTER YU-YEO; QQK
+1192 ; [.1DEF.0020.0002.1192] # HANGUL JUNGSEONG YU-YE
+318B ; [.1DEF.0020.0004.318B] # HANGUL LETTER YU-YE; QQK
+1193 ; [.1DF0.0020.0002.1193] # HANGUL JUNGSEONG YU-U
+1194 ; [.1DF1.0020.0002.1194] # HANGUL JUNGSEONG YU-I
+318C ; [.1DF1.0020.0004.318C] # HANGUL LETTER YU-I; QQK
+1195 ; [.1DF2.0020.0002.1195] # HANGUL JUNGSEONG EU-U
+1196 ; [.1DF3.0020.0002.1196] # HANGUL JUNGSEONG EU-EU
+1197 ; [.1DF4.0020.0002.1197] # HANGUL JUNGSEONG YI-U
+1198 ; [.1DF5.0020.0002.1198] # HANGUL JUNGSEONG I-A
+1199 ; [.1DF6.0020.0002.1199] # HANGUL JUNGSEONG I-YA
+119A ; [.1DF7.0020.0002.119A] # HANGUL JUNGSEONG I-O
+119B ; [.1DF8.0020.0002.119B] # HANGUL JUNGSEONG I-U
+119C ; [.1DF9.0020.0002.119C] # HANGUL JUNGSEONG I-EU
+119D ; [.1DFA.0020.0002.119D] # HANGUL JUNGSEONG I-ARAEA
+119E ; [.1DFB.0020.0002.119E] # HANGUL JUNGSEONG ARAEA
+318D ; [.1DFB.0020.0004.318D] # HANGUL LETTER ARAEA; QQK
+119F ; [.1DFC.0020.0002.119F] # HANGUL JUNGSEONG ARAEA-EO
+11A0 ; [.1DFD.0020.0002.11A0] # HANGUL JUNGSEONG ARAEA-U
+11A1 ; [.1DFE.0020.0002.11A1] # HANGUL JUNGSEONG ARAEA-I
+318E ; [.1DFE.0020.0004.318E] # HANGUL LETTER ARAEAE; QQK
+11A2 ; [.1DFF.0020.0002.11A2] # HANGUL JUNGSEONG SSANGARAEA
+11A8 ; [.1E00.0020.0002.11A8] # HANGUL JONGSEONG KIYEOK
+11A9 ; [.1E01.0020.0002.11A9] # HANGUL JONGSEONG SSANGKIYEOK
+11AA ; [.1E02.0020.0002.11AA] # HANGUL JONGSEONG KIYEOK-SIOS
+3133 ; [.1E02.0020.0004.3133] # HANGUL LETTER KIYEOK-SIOS; QQK
+FFA3 ; [.1E02.0020.0012.FFA3] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS; QQK
+11AB ; [.1E03.0020.0002.11AB] # HANGUL JONGSEONG NIEUN
+11AC ; [.1E04.0020.0002.11AC] # HANGUL JONGSEONG NIEUN-CIEUC
+3135 ; [.1E04.0020.0004.3135] # HANGUL LETTER NIEUN-CIEUC; QQK
+FFA5 ; [.1E04.0020.0012.FFA5] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC; QQK
+11AD ; [.1E05.0020.0002.11AD] # HANGUL JONGSEONG NIEUN-HIEUH
+3136 ; [.1E05.0020.0004.3136] # HANGUL LETTER NIEUN-HIEUH; QQK
+FFA6 ; [.1E05.0020.0012.FFA6] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH; QQK
+11AE ; [.1E06.0020.0002.11AE] # HANGUL JONGSEONG TIKEUT
+11AF ; [.1E07.0020.0002.11AF] # HANGUL JONGSEONG RIEUL
+11B0 ; [.1E08.0020.0002.11B0] # HANGUL JONGSEONG RIEUL-KIYEOK
+313A ; [.1E08.0020.0004.313A] # HANGUL LETTER RIEUL-KIYEOK; QQK
+FFAA ; [.1E08.0020.0012.FFAA] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK; QQK
+11B1 ; [.1E09.0020.0002.11B1] # HANGUL JONGSEONG RIEUL-MIEUM
+313B ; [.1E09.0020.0004.313B] # HANGUL LETTER RIEUL-MIEUM; QQK
+FFAB ; [.1E09.0020.0012.FFAB] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM; QQK
+11B2 ; [.1E0A.0020.0002.11B2] # HANGUL JONGSEONG RIEUL-PIEUP
+313C ; [.1E0A.0020.0004.313C] # HANGUL LETTER RIEUL-PIEUP; QQK
+FFAC ; [.1E0A.0020.0012.FFAC] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP; QQK
+11B3 ; [.1E0B.0020.0002.11B3] # HANGUL JONGSEONG RIEUL-SIOS
+313D ; [.1E0B.0020.0004.313D] # HANGUL LETTER RIEUL-SIOS; QQK
+FFAD ; [.1E0B.0020.0012.FFAD] # HALFWIDTH HANGUL LETTER RIEUL-SIOS; QQK
+11B4 ; [.1E0C.0020.0002.11B4] # HANGUL JONGSEONG RIEUL-THIEUTH
+313E ; [.1E0C.0020.0004.313E] # HANGUL LETTER RIEUL-THIEUTH; QQK
+FFAE ; [.1E0C.0020.0012.FFAE] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH; QQK
+11B5 ; [.1E0D.0020.0002.11B5] # HANGUL JONGSEONG RIEUL-PHIEUPH
+313F ; [.1E0D.0020.0004.313F] # HANGUL LETTER RIEUL-PHIEUPH; QQK
+FFAF ; [.1E0D.0020.0012.FFAF] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH; QQK
+11B6 ; [.1E0E.0020.0002.11B6] # HANGUL JONGSEONG RIEUL-HIEUH
+11B7 ; [.1E0F.0020.0002.11B7] # HANGUL JONGSEONG MIEUM
+11B8 ; [.1E10.0020.0002.11B8] # HANGUL JONGSEONG PIEUP
+11B9 ; [.1E11.0020.0002.11B9] # HANGUL JONGSEONG PIEUP-SIOS
+11BA ; [.1E12.0020.0002.11BA] # HANGUL JONGSEONG SIOS
+11BB ; [.1E13.0020.0002.11BB] # HANGUL JONGSEONG SSANGSIOS
+11BC ; [.1E14.0020.0002.11BC] # HANGUL JONGSEONG IEUNG
+11BD ; [.1E15.0020.0002.11BD] # HANGUL JONGSEONG CIEUC
+11BE ; [.1E16.0020.0002.11BE] # HANGUL JONGSEONG CHIEUCH
+11BF ; [.1E17.0020.0002.11BF] # HANGUL JONGSEONG KHIEUKH
+11C0 ; [.1E18.0020.0002.11C0] # HANGUL JONGSEONG THIEUTH
+11C1 ; [.1E19.0020.0002.11C1] # HANGUL JONGSEONG PHIEUPH
+11C2 ; [.1E1A.0020.0002.11C2] # HANGUL JONGSEONG HIEUH
+11C3 ; [.1E1B.0020.0002.11C3] # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4 ; [.1E1C.0020.0002.11C4] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5 ; [.1E1D.0020.0002.11C5] # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6 ; [.1E1E.0020.0002.11C6] # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7 ; [.1E1F.0020.0002.11C7] # HANGUL JONGSEONG NIEUN-SIOS
+3167 ; [.1E1F.0020.0004.3167] # HANGUL LETTER NIEUN-SIOS; QQK
+11C8 ; [.1E20.0020.0002.11C8] # HANGUL JONGSEONG NIEUN-PANSIOS
+3168 ; [.1E20.0020.0004.3168] # HANGUL LETTER NIEUN-PANSIOS; QQK
+11C9 ; [.1E21.0020.0002.11C9] # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA ; [.1E22.0020.0002.11CA] # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB ; [.1E23.0020.0002.11CB] # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC ; [.1E24.0020.0002.11CC] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+3169 ; [.1E24.0020.0004.3169] # HANGUL LETTER RIEUL-KIYEOK-SIOS; QQK
+11CD ; [.1E25.0020.0002.11CD] # HANGUL JONGSEONG RIEUL-NIEUN
+11CE ; [.1E26.0020.0002.11CE] # HANGUL JONGSEONG RIEUL-TIKEUT
+316A ; [.1E26.0020.0004.316A] # HANGUL LETTER RIEUL-TIKEUT; QQK
+11CF ; [.1E27.0020.0002.11CF] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0 ; [.1E28.0020.0002.11D0] # HANGUL JONGSEONG SSANGRIEUL
+11D1 ; [.1E29.0020.0002.11D1] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2 ; [.1E2A.0020.0002.11D2] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3 ; [.1E2B.0020.0002.11D3] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+316B ; [.1E2B.0020.0004.316B] # HANGUL LETTER RIEUL-PIEUP-SIOS; QQK
+11D4 ; [.1E2C.0020.0002.11D4] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5 ; [.1E2D.0020.0002.11D5] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6 ; [.1E2E.0020.0002.11D6] # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7 ; [.1E2F.0020.0002.11D7] # HANGUL JONGSEONG RIEUL-PANSIOS
+316C ; [.1E2F.0020.0004.316C] # HANGUL LETTER RIEUL-PANSIOS; QQK
+11D8 ; [.1E30.0020.0002.11D8] # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9 ; [.1E31.0020.0002.11D9] # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+316D ; [.1E31.0020.0004.316D] # HANGUL LETTER RIEUL-YEORINHIEUH; QQK
+11DA ; [.1E32.0020.0002.11DA] # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB ; [.1E33.0020.0002.11DB] # HANGUL JONGSEONG MIEUM-RIEUL
+11DC ; [.1E34.0020.0002.11DC] # HANGUL JONGSEONG MIEUM-PIEUP
+11DD ; [.1E35.0020.0002.11DD] # HANGUL JONGSEONG MIEUM-SIOS
+316F ; [.1E35.0020.0004.316F] # HANGUL LETTER MIEUM-SIOS; QQK
+11DE ; [.1E36.0020.0002.11DE] # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF ; [.1E37.0020.0002.11DF] # HANGUL JONGSEONG MIEUM-PANSIOS
+3170 ; [.1E37.0020.0004.3170] # HANGUL LETTER MIEUM-PANSIOS; QQK
+11E0 ; [.1E38.0020.0002.11E0] # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1 ; [.1E39.0020.0002.11E1] # HANGUL JONGSEONG MIEUM-HIEUH
+11E2 ; [.1E3A.0020.0002.11E2] # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3 ; [.1E3B.0020.0002.11E3] # HANGUL JONGSEONG PIEUP-RIEUL
+11E4 ; [.1E3C.0020.0002.11E4] # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5 ; [.1E3D.0020.0002.11E5] # HANGUL JONGSEONG PIEUP-HIEUH
+11E6 ; [.1E3E.0020.0002.11E6] # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7 ; [.1E3F.0020.0002.11E7] # HANGUL JONGSEONG SIOS-KIYEOK
+11E8 ; [.1E40.0020.0002.11E8] # HANGUL JONGSEONG SIOS-TIKEUT
+11E9 ; [.1E41.0020.0002.11E9] # HANGUL JONGSEONG SIOS-RIEUL
+11EA ; [.1E42.0020.0002.11EA] # HANGUL JONGSEONG SIOS-PIEUP
+11EB ; [.1E43.0020.0002.11EB] # HANGUL JONGSEONG PANSIOS
+11EC ; [.1E44.0020.0002.11EC] # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED ; [.1E45.0020.0002.11ED] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE ; [.1E46.0020.0002.11EE] # HANGUL JONGSEONG SSANGIEUNG
+11EF ; [.1E47.0020.0002.11EF] # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0 ; [.1E48.0020.0002.11F0] # HANGUL JONGSEONG YESIEUNG
+11F1 ; [.1E49.0020.0002.11F1] # HANGUL JONGSEONG YESIEUNG-SIOS
+3182 ; [.1E49.0020.0004.3182] # HANGUL LETTER YESIEUNG-SIOS; QQK
+11F2 ; [.1E4A.0020.0002.11F2] # HANGUL JONGSEONG YESIEUNG-PANSIOS
+3183 ; [.1E4A.0020.0004.3183] # HANGUL LETTER YESIEUNG-PANSIOS; QQK
+11F3 ; [.1E4B.0020.0002.11F3] # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4 ; [.1E4C.0020.0002.11F4] # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5 ; [.1E4D.0020.0002.11F5] # HANGUL JONGSEONG HIEUH-NIEUN
+11F6 ; [.1E4E.0020.0002.11F6] # HANGUL JONGSEONG HIEUH-RIEUL
+11F7 ; [.1E4F.0020.0002.11F7] # HANGUL JONGSEONG HIEUH-MIEUM
+11F8 ; [.1E50.0020.0002.11F8] # HANGUL JONGSEONG HIEUH-PIEUP
+11F9 ; [.1E51.0020.0002.11F9] # HANGUL JONGSEONG YEORINHIEUH
+3041 ; [.1E52.0020.000D.3041] # HIRAGANA LETTER SMALL A
+3042 ; [.1E52.0020.000E.3042] # HIRAGANA LETTER A
+30A1 ; [.1E52.0020.000F.30A1] # KATAKANA LETTER SMALL A
+FF67 ; [.1E52.0020.0010.FF67] # HALFWIDTH KATAKANA LETTER SMALL A; QQK
+30A2 ; [.1E52.0020.0011.30A2] # KATAKANA LETTER A
+FF71 ; [.1E52.0020.0012.FF71] # HALFWIDTH KATAKANA LETTER A; QQK
+32D0 ; [.1E52.0020.0013.32D0] # CIRCLED KATAKANA A; QQK
+3303 ; [.1E52.0020.001C.3303][.0E0B.0020.001C.3303][.1E7A.0020.001F.3303] # SQUARE AARU; QQKN
+3300 ; [.1E52.0020.001C.3300][.1E6B.0020.001C.3300][.0000.0141.001F.3300][.0E0B.0020.001F.3300][.1E65.0020.001F.3300] # SQUARE APAATO; QQKN
+3301 ; [.1E52.0020.001C.3301][.1E7A.0020.001C.3301][.1E6D.0020.001F.3301][.1E52.0020.001F.3301] # SQUARE ARUHUA; QQKN
+3302 ; [.1E52.0020.001C.3302][.1E81.0020.001C.3302][.1E6E.0020.001F.3302][.0000.0141.001F.3302][.1E52.0020.001F.3302] # SQUARE ANPEA; QQKN
+3043 ; [.1E53.0020.000D.3043] # HIRAGANA LETTER SMALL I
+3044 ; [.1E53.0020.000E.3044] # HIRAGANA LETTER I
+30A3 ; [.1E53.0020.000F.30A3] # KATAKANA LETTER SMALL I
+FF68 ; [.1E53.0020.0010.FF68] # HALFWIDTH KATAKANA LETTER SMALL I; QQK
+30A4 ; [.1E53.0020.0011.30A4] # KATAKANA LETTER I
+FF72 ; [.1E53.0020.0012.FF72] # HALFWIDTH KATAKANA LETTER I; QQK
+32D1 ; [.1E53.0020.0013.32D1] # CIRCLED KATAKANA I; QQK
+3304 ; [.1E53.0020.001C.3304][.1E67.0020.001C.3304][.1E81.0020.001F.3304][.1E59.0020.001F.3304][.0000.0140.001F.3304] # SQUARE ININGU; QQKN
+3305 ; [.1E53.0020.001C.3305][.1E81.0020.001C.3305][.1E62.0020.001F.3305] # SQUARE INTI; QQKN
+3045 ; [.1E54.0020.000D.3045] # HIRAGANA LETTER SMALL U
+3046 ; [.1E54.0020.000E.3046] # HIRAGANA LETTER U
+30A5 ; [.1E54.0020.000F.30A5] # KATAKANA LETTER SMALL U
+FF69 ; [.1E54.0020.0010.FF69] # HALFWIDTH KATAKANA LETTER SMALL U; QQK
+30A6 ; [.1E54.0020.0011.30A6] # KATAKANA LETTER U
+FF73 ; [.1E54.0020.0012.FF73] # HALFWIDTH KATAKANA LETTER U; QQK
+32D2 ; [.1E54.0020.0013.32D2] # CIRCLED KATAKANA U; QQK
+3094 ; [.1E54.0020.000E.3046][.0000.0140.0002.3099] # HIRAGANA LETTER VU; QQCM
+30F4 ; [.1E54.0020.0011.30A6][.0000.0140.0002.3099] # KATAKANA LETTER VU; QQCM
+3306 ; [.1E54.0020.001C.3306][.1E56.0020.001C.3306][.1E81.0020.001F.3306] # SQUARE UON; QQKN
+3047 ; [.1E55.0020.000D.3047] # HIRAGANA LETTER SMALL E
+3048 ; [.1E55.0020.000E.3048] # HIRAGANA LETTER E
+30A7 ; [.1E55.0020.000F.30A7] # KATAKANA LETTER SMALL E
+FF6A ; [.1E55.0020.0010.FF6A] # HALFWIDTH KATAKANA LETTER SMALL E; QQK
+30A8 ; [.1E55.0020.0011.30A8] # KATAKANA LETTER E
+FF74 ; [.1E55.0020.0012.FF74] # HALFWIDTH KATAKANA LETTER E; QQK
+32D3 ; [.1E55.0020.0013.32D3] # CIRCLED KATAKANA E; QQK
+3308 ; [.1E55.0020.001C.3308][.0E0B.0020.001C.3308][.1E57.0020.001F.3308][.0E0B.0020.001F.3308] # SQUARE EEKAA; QQKN
+3307 ; [.1E55.0020.001C.3307][.1E5E.0020.001C.3307][.1E59.0020.001F.3307][.0E0B.0020.001F.3307][.1E65.0020.001F.3307][.0000.0140.001F.3307] # SQUARE ESUKUUDO; QQKN
+3049 ; [.1E56.0020.000D.3049] # HIRAGANA LETTER SMALL O
+304A ; [.1E56.0020.000E.304A] # HIRAGANA LETTER O
+30A9 ; [.1E56.0020.000F.30A9] # KATAKANA LETTER SMALL O
+FF6B ; [.1E56.0020.0010.FF6B] # HALFWIDTH KATAKANA LETTER SMALL O; QQK
+30AA ; [.1E56.0020.0011.30AA] # KATAKANA LETTER O
+FF75 ; [.1E56.0020.0012.FF75] # HALFWIDTH KATAKANA LETTER O; QQK
+32D4 ; [.1E56.0020.0013.32D4] # CIRCLED KATAKANA O; QQK
+330A ; [.1E56.0020.001C.330A][.0E0B.0020.001C.330A][.1E72.0020.001F.330A] # SQUARE OOMU; QQKN
+3309 ; [.1E56.0020.001C.3309][.1E81.0020.001C.3309][.1E5E.0020.001F.3309] # SQUARE ONSU; QQKN
+3095 ; [.1E57.0020.000D.3095] # HIRAGANA LETTER SMALL KA
+304B ; [.1E57.0020.000E.304B] # HIRAGANA LETTER KA
+30F5 ; [.1E57.0020.000F.30F5] # KATAKANA LETTER SMALL KA
+30AB ; [.1E57.0020.0011.30AB] # KATAKANA LETTER KA
+FF76 ; [.1E57.0020.0012.FF76] # HALFWIDTH KATAKANA LETTER KA; QQK
+32D5 ; [.1E57.0020.0013.32D5] # CIRCLED KATAKANA KA; QQK
+304C ; [.1E57.0020.000E.304B][.0000.0140.0002.3099] # HIRAGANA LETTER GA; QQCM
+30AC ; [.1E57.0020.0011.30AB][.0000.0140.0002.3099] # KATAKANA LETTER GA; QQCM
+330B ; [.1E57.0020.001C.330B][.1E53.0020.001C.330B][.1E79.0020.001F.330B] # SQUARE KAIRI; QQKN
+330C ; [.1E57.0020.001C.330C][.1E78.0020.001C.330C][.1E63.0020.001F.330C][.1E65.0020.001F.330C] # SQUARE KARATTO; QQKN
+330D ; [.1E57.0020.001C.330D][.1E7C.0020.001C.330D][.1E79.0020.001F.330D][.0E0B.0020.001F.330D] # SQUARE KARORII; QQKN
+330E ; [.1E57.0020.001C.330E][.0000.0140.001C.330E][.1E7C.0020.001F.330E][.1E81.0020.001F.330E] # SQUARE GARON; QQKN
+330F ; [.1E57.0020.001C.330F][.0000.0140.001C.330F][.1E81.0020.001F.330F][.1E70.0020.001F.330F] # SQUARE GANMA; QQKN
+304D ; [.1E58.0020.000E.304D] # HIRAGANA LETTER KI
+30AD ; [.1E58.0020.0011.30AD] # KATAKANA LETTER KI
+FF77 ; [.1E58.0020.0012.FF77] # HALFWIDTH KATAKANA LETTER KI; QQK
+32D6 ; [.1E58.0020.0013.32D6] # CIRCLED KATAKANA KI; QQK
+304E ; [.1E58.0020.000E.304D][.0000.0140.0002.3099] # HIRAGANA LETTER GI; QQCM
+30AE ; [.1E58.0020.0011.30AD][.0000.0140.0002.3099] # KATAKANA LETTER GI; QQCM
+3310 ; [.1E58.0020.001C.3310][.0000.0140.001C.3310][.1E57.0020.001F.3310][.0000.0140.001F.3310] # SQUARE GIGA; QQKN
+3311 ; [.1E58.0020.001C.3311][.0000.0140.001C.3311][.1E67.0020.001F.3311][.0E0B.0020.001F.3311] # SQUARE GINII; QQKN
+3312 ; [.1E58.0020.001C.3312][.1E76.0020.001C.3312][.1E79.0020.001F.3312][.0E0B.0020.001F.3312] # SQUARE KYURII; QQKN
+3313 ; [.1E58.0020.001C.3313][.0000.0140.001C.3313][.1E7A.0020.001F.3313][.1E61.0020.001F.3313][.0000.0140.001F.3313][.0E0B.0020.001F.3313] # SQUARE GIRUDAA; QQKN
+3314 ; [.1E58.0020.001C.3314][.1E7C.0020.001C.3314] # SQUARE KIRO; QQKN
+3315 ; [.1E58.0020.001C.3315][.1E7C.0020.001C.3315][.1E59.0020.001F.3315][.0000.0140.001F.3315][.1E78.0020.001F.3315][.1E72.0020.001F.3315] # SQUARE KIROGURAMU; QQKN
+3316 ; [.1E58.0020.001C.3316][.1E7C.0020.001C.3316][.1E73.0020.001F.3316][.0E0B.0020.001F.3316][.1E65.0020.001F.3316][.1E7A.0020.001F.3316] # SQUARE KIROMEETORU; QQKN
+3317 ; [.1E58.0020.001C.3317][.1E7C.0020.001C.3317][.1E7D.0020.001F.3317][.1E63.0020.001F.3317][.1E65.0020.001F.3317] # SQUARE KIROWATTO; QQKN
+304F ; [.1E59.0020.000E.304F] # HIRAGANA LETTER KU
+31F0 ; [.1E59.0020.000F.31F0] # KATAKANA LETTER SMALL KU
+30AF ; [.1E59.0020.0011.30AF] # KATAKANA LETTER KU
+FF78 ; [.1E59.0020.0012.FF78] # HALFWIDTH KATAKANA LETTER KU; QQK
+32D7 ; [.1E59.0020.0013.32D7] # CIRCLED KATAKANA KU; QQK
+3050 ; [.1E59.0020.000E.304F][.0000.0140.0002.3099] # HIRAGANA LETTER GU; QQCM
+30B0 ; [.1E59.0020.0011.30AF][.0000.0140.0002.3099] # KATAKANA LETTER GU; QQCM
+3318 ; [.1E59.0020.001C.3318][.0000.0140.001C.3318][.1E78.0020.001F.3318][.1E72.0020.001F.3318] # SQUARE GURAMU; QQKN
+3319 ; [.1E59.0020.001C.3319][.0000.0140.001C.3319][.1E78.0020.001F.3319][.1E72.0020.001F.3319][.1E65.0020.001F.3319][.1E81.0020.001F.3319] # SQUARE GURAMUTON; QQKN
+331A ; [.1E59.0020.001C.331A][.1E7A.0020.001C.331A][.1E5F.0020.001F.331A][.0000.0140.001F.331A][.1E53.0020.001F.331A][.1E7C.0020.001F.331A] # SQUARE KURUZEIRO; QQKN
+331B ; [.1E59.0020.001C.331B][.1E7C.0020.001C.331B][.0E0B.0020.001F.331B][.1E69.0020.001F.331B] # SQUARE KUROONE; QQKN
+3096 ; [.1E5A.0020.000D.3096] # HIRAGANA LETTER SMALL KE
+3051 ; [.1E5A.0020.000E.3051] # HIRAGANA LETTER KE
+30F6 ; [.1E5A.0020.000F.30F6] # KATAKANA LETTER SMALL KE
+30B1 ; [.1E5A.0020.0011.30B1] # KATAKANA LETTER KE
+FF79 ; [.1E5A.0020.0012.FF79] # HALFWIDTH KATAKANA LETTER KE; QQK
+32D8 ; [.1E5A.0020.0013.32D8] # CIRCLED KATAKANA KE; QQK
+3052 ; [.1E5A.0020.000E.3051][.0000.0140.0002.3099] # HIRAGANA LETTER GE; QQCM
+30B2 ; [.1E5A.0020.0011.30B1][.0000.0140.0002.3099] # KATAKANA LETTER GE; QQCM
+331C ; [.1E5A.0020.001C.331C][.0E0B.0020.001C.331C][.1E5E.0020.001F.331C] # SQUARE KEESU; QQKN
+3053 ; [.1E5B.0020.000E.3053] # HIRAGANA LETTER KO
+30B3 ; [.1E5B.0020.0011.30B3] # KATAKANA LETTER KO
+FF7A ; [.1E5B.0020.0012.FF7A] # HALFWIDTH KATAKANA LETTER KO; QQK
+32D9 ; [.1E5B.0020.0013.32D9] # CIRCLED KATAKANA KO; QQK
+3054 ; [.1E5B.0020.000E.3053][.0000.0140.0002.3099] # HIRAGANA LETTER GO; QQCM
+30B4 ; [.1E5B.0020.0011.30B3][.0000.0140.0002.3099] # KATAKANA LETTER GO; QQCM
+331E ; [.1E5B.0020.001C.331E][.0E0B.0020.001C.331E][.1E6F.0020.001F.331E][.0000.0141.001F.331E] # SQUARE KOOPO; QQKN
+30FF ; [.1E5B.0020.0016.30FF][.1E65.0020.0016.30FF] # KATAKANA DIGRAPH KOTO; QQKN
+331D ; [.1E5B.0020.001C.331D][.1E7A.0020.001C.331D][.1E66.0020.001F.331D] # SQUARE KORUNA; QQKN
+3055 ; [.1E5C.0020.000E.3055] # HIRAGANA LETTER SA
+30B5 ; [.1E5C.0020.0011.30B5] # KATAKANA LETTER SA
+FF7B ; [.1E5C.0020.0012.FF7B] # HALFWIDTH KATAKANA LETTER SA; QQK
+32DA ; [.1E5C.0020.0013.32DA] # CIRCLED KATAKANA SA; QQK
+3056 ; [.1E5C.0020.000E.3055][.0000.0140.0002.3099] # HIRAGANA LETTER ZA; QQCM
+30B6 ; [.1E5C.0020.0011.30B5][.0000.0140.0002.3099] # KATAKANA LETTER ZA; QQCM
+331F ; [.1E5C.0020.001C.331F][.1E53.0020.001C.331F][.1E59.0020.001F.331F][.1E7A.0020.001F.331F] # SQUARE SAIKURU; QQKN
+3320 ; [.1E5C.0020.001C.3320][.1E81.0020.001C.3320][.1E62.0020.001F.3320][.0E0B.0020.001F.3320][.1E72.0020.001F.3320] # SQUARE SANTIIMU; QQKN
+3057 ; [.1E5D.0020.000E.3057] # HIRAGANA LETTER SI
+31F1 ; [.1E5D.0020.000F.31F1] # KATAKANA LETTER SMALL SI
+30B7 ; [.1E5D.0020.0011.30B7] # KATAKANA LETTER SI
+FF7C ; [.1E5D.0020.0012.FF7C] # HALFWIDTH KATAKANA LETTER SI; QQK
+32DB ; [.1E5D.0020.0013.32DB] # CIRCLED KATAKANA SI; QQK
+3058 ; [.1E5D.0020.000E.3057][.0000.0140.0002.3099] # HIRAGANA LETTER ZI; QQCM
+30B8 ; [.1E5D.0020.0011.30B7][.0000.0140.0002.3099] # KATAKANA LETTER ZI; QQCM
+3006 ; [.1E5D.0020.0004.3006][.1E73.0020.0004.3006] # IDEOGRAPHIC CLOSING MARK; QQKN
+3321 ; [.1E5D.0020.001C.3321][.1E79.0020.001C.3321][.1E81.0020.001F.3321][.1E59.0020.001F.3321][.0000.0140.001F.3321] # SQUARE SIRINGU; QQKN
+3059 ; [.1E5E.0020.000E.3059] # HIRAGANA LETTER SU
+31F2 ; [.1E5E.0020.000F.31F2] # KATAKANA LETTER SMALL SU
+30B9 ; [.1E5E.0020.0011.30B9] # KATAKANA LETTER SU
+FF7D ; [.1E5E.0020.0012.FF7D] # HALFWIDTH KATAKANA LETTER SU; QQK
+32DC ; [.1E5E.0020.0013.32DC] # CIRCLED KATAKANA SU; QQK
+305A ; [.1E5E.0020.000E.3059][.0000.0140.0002.3099] # HIRAGANA LETTER ZU; QQCM
+30BA ; [.1E5E.0020.0011.30B9][.0000.0140.0002.3099] # KATAKANA LETTER ZU; QQCM
+305B ; [.1E5F.0020.000E.305B] # HIRAGANA LETTER SE
+30BB ; [.1E5F.0020.0011.30BB] # KATAKANA LETTER SE
+FF7E ; [.1E5F.0020.0012.FF7E] # HALFWIDTH KATAKANA LETTER SE; QQK
+32DD ; [.1E5F.0020.0013.32DD] # CIRCLED KATAKANA SE; QQK
+305C ; [.1E5F.0020.000E.305B][.0000.0140.0002.3099] # HIRAGANA LETTER ZE; QQCM
+30BC ; [.1E5F.0020.0011.30BB][.0000.0140.0002.3099] # KATAKANA LETTER ZE; QQCM
+3322 ; [.1E5F.0020.001C.3322][.1E81.0020.001C.3322][.1E62.0020.001F.3322] # SQUARE SENTI; QQKN
+3323 ; [.1E5F.0020.001C.3323][.1E81.0020.001C.3323][.1E65.0020.001F.3323] # SQUARE SENTO; QQKN
+305D ; [.1E60.0020.000E.305D] # HIRAGANA LETTER SO
+30BD ; [.1E60.0020.0011.30BD] # KATAKANA LETTER SO
+FF7F ; [.1E60.0020.0012.FF7F] # HALFWIDTH KATAKANA LETTER SO; QQK
+32DE ; [.1E60.0020.0013.32DE] # CIRCLED KATAKANA SO; QQK
+305E ; [.1E60.0020.000E.305D][.0000.0140.0002.3099] # HIRAGANA LETTER ZO; QQCM
+30BE ; [.1E60.0020.0011.30BD][.0000.0140.0002.3099] # KATAKANA LETTER ZO; QQCM
+305F ; [.1E61.0020.000E.305F] # HIRAGANA LETTER TA
+30BF ; [.1E61.0020.0011.30BF] # KATAKANA LETTER TA
+FF80 ; [.1E61.0020.0012.FF80] # HALFWIDTH KATAKANA LETTER TA; QQK
+32DF ; [.1E61.0020.0013.32DF] # CIRCLED KATAKANA TA; QQK
+3060 ; [.1E61.0020.000E.305F][.0000.0140.0002.3099] # HIRAGANA LETTER DA; QQCM
+30C0 ; [.1E61.0020.0011.30BF][.0000.0140.0002.3099] # KATAKANA LETTER DA; QQCM
+3324 ; [.1E61.0020.001C.3324][.0000.0140.001C.3324][.0E0B.0020.001F.3324][.1E5E.0020.001F.3324] # SQUARE DAASU; QQKN
+3061 ; [.1E62.0020.000E.3061] # HIRAGANA LETTER TI
+30C1 ; [.1E62.0020.0011.30C1] # KATAKANA LETTER TI
+FF81 ; [.1E62.0020.0012.FF81] # HALFWIDTH KATAKANA LETTER TI; QQK
+32E0 ; [.1E62.0020.0013.32E0] # CIRCLED KATAKANA TI; QQK
+3062 ; [.1E62.0020.000E.3061][.0000.0140.0002.3099] # HIRAGANA LETTER DI; QQCM
+30C2 ; [.1E62.0020.0011.30C1][.0000.0140.0002.3099] # KATAKANA LETTER DI; QQCM
+3063 ; [.1E63.0020.000D.3063] # HIRAGANA LETTER SMALL TU
+3064 ; [.1E63.0020.000E.3064] # HIRAGANA LETTER TU
+30C3 ; [.1E63.0020.000F.30C3] # KATAKANA LETTER SMALL TU
+FF6F ; [.1E63.0020.0010.FF6F] # HALFWIDTH KATAKANA LETTER SMALL TU; QQK
+30C4 ; [.1E63.0020.0011.30C4] # KATAKANA LETTER TU
+FF82 ; [.1E63.0020.0012.FF82] # HALFWIDTH KATAKANA LETTER TU; QQK
+32E1 ; [.1E63.0020.0013.32E1] # CIRCLED KATAKANA TU; QQK
+3065 ; [.1E63.0020.000E.3064][.0000.0140.0002.3099] # HIRAGANA LETTER DU; QQCM
+30C5 ; [.1E63.0020.0011.30C4][.0000.0140.0002.3099] # KATAKANA LETTER DU; QQCM
+3066 ; [.1E64.0020.000E.3066] # HIRAGANA LETTER TE
+30C6 ; [.1E64.0020.0011.30C6] # KATAKANA LETTER TE
+FF83 ; [.1E64.0020.0012.FF83] # HALFWIDTH KATAKANA LETTER TE; QQK
+32E2 ; [.1E64.0020.0013.32E2] # CIRCLED KATAKANA TE; QQK
+3067 ; [.1E64.0020.000E.3066][.0000.0140.0002.3099] # HIRAGANA LETTER DE; QQCM
+30C7 ; [.1E64.0020.0011.30C6][.0000.0140.0002.3099] # KATAKANA LETTER DE; QQCM
+3325 ; [.1E64.0020.001C.3325][.0000.0140.001C.3325][.1E5D.0020.001F.3325] # SQUARE DESI; QQKN
+3068 ; [.1E65.0020.000E.3068] # HIRAGANA LETTER TO
+31F3 ; [.1E65.0020.000F.31F3] # KATAKANA LETTER SMALL TO
+30C8 ; [.1E65.0020.0011.30C8] # KATAKANA LETTER TO
+FF84 ; [.1E65.0020.0012.FF84] # HALFWIDTH KATAKANA LETTER TO; QQK
+32E3 ; [.1E65.0020.0013.32E3] # CIRCLED KATAKANA TO; QQK
+3069 ; [.1E65.0020.000E.3068][.0000.0140.0002.3099] # HIRAGANA LETTER DO; QQCM
+30C9 ; [.1E65.0020.0011.30C8][.0000.0140.0002.3099] # KATAKANA LETTER DO; QQCM
+3326 ; [.1E65.0020.001C.3326][.0000.0140.001C.3326][.1E7A.0020.001F.3326] # SQUARE DORU; QQKN
+3327 ; [.1E65.0020.001C.3327][.1E81.0020.001C.3327] # SQUARE TON; QQKN
+306A ; [.1E66.0020.000E.306A] # HIRAGANA LETTER NA
+30CA ; [.1E66.0020.0011.30CA] # KATAKANA LETTER NA
+FF85 ; [.1E66.0020.0012.FF85] # HALFWIDTH KATAKANA LETTER NA; QQK
+32E4 ; [.1E66.0020.0013.32E4] # CIRCLED KATAKANA NA; QQK
+3328 ; [.1E66.0020.001C.3328][.1E6A.0020.001C.3328] # SQUARE NANO; QQKN
+306B ; [.1E67.0020.000E.306B] # HIRAGANA LETTER NI
+30CB ; [.1E67.0020.0011.30CB] # KATAKANA LETTER NI
+FF86 ; [.1E67.0020.0012.FF86] # HALFWIDTH KATAKANA LETTER NI; QQK
+32E5 ; [.1E67.0020.0013.32E5] # CIRCLED KATAKANA NI; QQK
+306C ; [.1E68.0020.000E.306C] # HIRAGANA LETTER NU
+31F4 ; [.1E68.0020.000F.31F4] # KATAKANA LETTER SMALL NU
+30CC ; [.1E68.0020.0011.30CC] # KATAKANA LETTER NU
+FF87 ; [.1E68.0020.0012.FF87] # HALFWIDTH KATAKANA LETTER NU; QQK
+32E6 ; [.1E68.0020.0013.32E6] # CIRCLED KATAKANA NU; QQK
+306D ; [.1E69.0020.000E.306D] # HIRAGANA LETTER NE
+30CD ; [.1E69.0020.0011.30CD] # KATAKANA LETTER NE
+FF88 ; [.1E69.0020.0012.FF88] # HALFWIDTH KATAKANA LETTER NE; QQK
+32E7 ; [.1E69.0020.0013.32E7] # CIRCLED KATAKANA NE; QQK
+306E ; [.1E6A.0020.000E.306E] # HIRAGANA LETTER NO
+30CE ; [.1E6A.0020.0011.30CE] # KATAKANA LETTER NO
+FF89 ; [.1E6A.0020.0012.FF89] # HALFWIDTH KATAKANA LETTER NO; QQK
+32E8 ; [.1E6A.0020.0013.32E8] # CIRCLED KATAKANA NO; QQK
+3329 ; [.1E6A.0020.001C.3329][.1E63.0020.001C.3329][.1E65.0020.001F.3329] # SQUARE NOTTO; QQKN
+306F ; [.1E6B.0020.000E.306F] # HIRAGANA LETTER HA
+31F5 ; [.1E6B.0020.000F.31F5] # KATAKANA LETTER SMALL HA
+30CF ; [.1E6B.0020.0011.30CF] # KATAKANA LETTER HA
+FF8A ; [.1E6B.0020.0012.FF8A] # HALFWIDTH KATAKANA LETTER HA; QQK
+32E9 ; [.1E6B.0020.0013.32E9] # CIRCLED KATAKANA HA; QQK
+3070 ; [.1E6B.0020.000E.306F][.0000.0140.0002.3099] # HIRAGANA LETTER BA; QQCM
+30D0 ; [.1E6B.0020.0011.30CF][.0000.0140.0002.3099] # KATAKANA LETTER BA; QQCM
+3071 ; [.1E6B.0020.000E.306F][.0000.0141.0002.309A] # HIRAGANA LETTER PA; QQCM
+30D1 ; [.1E6B.0020.0011.30CF][.0000.0141.0002.309A] # KATAKANA LETTER PA; QQCM
+332B ; [.1E6B.0020.001C.332B][.0000.0141.001C.332B][.0E0B.0020.001F.332B][.1E5F.0020.001F.332B][.1E81.0020.001F.332B][.1E65.0020.001F.332B] # SQUARE PAASENTO; QQKN
+332C ; [.1E6B.0020.001C.332C][.0000.0141.001C.332C][.0E0B.0020.001F.332C][.1E63.0020.001F.332C] # SQUARE PAATU; QQKN
+332D ; [.1E6B.0020.001C.332D][.0000.0140.001C.332D][.0E0B.0020.001F.332D][.1E7B.0020.001F.332D][.1E7A.0020.001F.332D] # SQUARE BAARERU; QQKN
+332A ; [.1E6B.0020.001C.332A][.1E53.0020.001C.332A][.1E63.0020.001F.332A] # SQUARE HAITU; QQKN
+3072 ; [.1E6C.0020.000E.3072] # HIRAGANA LETTER HI
+31F6 ; [.1E6C.0020.000F.31F6] # KATAKANA LETTER SMALL HI
+30D2 ; [.1E6C.0020.0011.30D2] # KATAKANA LETTER HI
+FF8B ; [.1E6C.0020.0012.FF8B] # HALFWIDTH KATAKANA LETTER HI; QQK
+32EA ; [.1E6C.0020.0013.32EA] # CIRCLED KATAKANA HI; QQK
+3073 ; [.1E6C.0020.000E.3072][.0000.0140.0002.3099] # HIRAGANA LETTER BI; QQCM
+30D3 ; [.1E6C.0020.0011.30D2][.0000.0140.0002.3099] # KATAKANA LETTER BI; QQCM
+3074 ; [.1E6C.0020.000E.3072][.0000.0141.0002.309A] # HIRAGANA LETTER PI; QQCM
+30D4 ; [.1E6C.0020.0011.30D2][.0000.0141.0002.309A] # KATAKANA LETTER PI; QQCM
+332E ; [.1E6C.0020.001C.332E][.0000.0141.001C.332E][.1E52.0020.001F.332E][.1E5E.0020.001F.332E][.1E65.0020.001F.332E][.1E7A.0020.001F.332E] # SQUARE PIASUTORU; QQKN
+332F ; [.1E6C.0020.001C.332F][.0000.0141.001C.332F][.1E59.0020.001F.332F][.1E7A.0020.001F.332F] # SQUARE PIKURU; QQKN
+3330 ; [.1E6C.0020.001C.3330][.0000.0141.001C.3330][.1E5B.0020.001F.3330] # SQUARE PIKO; QQKN
+3331 ; [.1E6C.0020.001C.3331][.0000.0140.001C.3331][.1E7A.0020.001F.3331] # SQUARE BIRU; QQKN
+3075 ; [.1E6D.0020.000E.3075] # HIRAGANA LETTER HU
+31F7 ; [.1E6D.0020.000F.31F7] # KATAKANA LETTER SMALL HU
+30D5 ; [.1E6D.0020.0011.30D5] # KATAKANA LETTER HU
+FF8C ; [.1E6D.0020.0012.FF8C] # HALFWIDTH KATAKANA LETTER HU; QQK
+32EB ; [.1E6D.0020.0013.32EB] # CIRCLED KATAKANA HU; QQK
+3076 ; [.1E6D.0020.000E.3075][.0000.0140.0002.3099] # HIRAGANA LETTER BU; QQCM
+30D6 ; [.1E6D.0020.0011.30D5][.0000.0140.0002.3099] # KATAKANA LETTER BU; QQCM
+3077 ; [.1E6D.0020.000E.3075][.0000.0141.0002.309A] # HIRAGANA LETTER PU; QQCM
+30D7 ; [.1E6D.0020.0011.30D5][.0000.0141.0002.309A] # KATAKANA LETTER PU; QQCM
+3332 ; [.1E6D.0020.001C.3332][.1E52.0020.001C.3332][.1E78.0020.001F.3332][.1E63.0020.001F.3332][.1E65.0020.001F.3332][.0000.0140.001F.3332] # SQUARE HUARADDO; QQKN
+3333 ; [.1E6D.0020.001C.3333][.1E53.0020.001C.3333][.0E0B.0020.001F.3333][.1E65.0020.001F.3333] # SQUARE HUIITO; QQKN
+3334 ; [.1E6D.0020.001C.3334][.0000.0140.001C.3334][.1E63.0020.001F.3334][.1E5D.0020.001F.3334][.1E55.0020.001F.3334][.1E7A.0020.001F.3334] # SQUARE BUSSYERU; QQKN
+3335 ; [.1E6D.0020.001C.3335][.1E78.0020.001C.3335][.1E81.0020.001F.3335] # SQUARE HURAN; QQKN
+3078 ; [.1E6E.0020.000E.3078] # HIRAGANA LETTER HE
+31F8 ; [.1E6E.0020.000F.31F8] # KATAKANA LETTER SMALL HE
+30D8 ; [.1E6E.0020.0011.30D8] # KATAKANA LETTER HE
+FF8D ; [.1E6E.0020.0012.FF8D] # HALFWIDTH KATAKANA LETTER HE; QQK
+32EC ; [.1E6E.0020.0013.32EC] # CIRCLED KATAKANA HE; QQK
+3079 ; [.1E6E.0020.000E.3078][.0000.0140.0002.3099] # HIRAGANA LETTER BE; QQCM
+30D9 ; [.1E6E.0020.0011.30D8][.0000.0140.0002.3099] # KATAKANA LETTER BE; QQCM
+307A ; [.1E6E.0020.000E.3078][.0000.0141.0002.309A] # HIRAGANA LETTER PE; QQCM
+30DA ; [.1E6E.0020.0011.30D8][.0000.0141.0002.309A] # KATAKANA LETTER PE; QQCM
+333B ; [.1E6E.0020.001C.333B][.0000.0141.001C.333B][.0E0B.0020.001F.333B][.1E5D.0020.001F.333B][.0000.0140.001F.333B] # SQUARE PEEZI; QQKN
+333C ; [.1E6E.0020.001C.333C][.0000.0140.001C.333C][.0E0B.0020.001F.333C][.1E61.0020.001F.333C] # SQUARE BEETA; QQKN
+3336 ; [.1E6E.0020.001C.3336][.1E59.0020.001C.3336][.1E61.0020.001F.3336][.0E0B.0020.001F.3336][.1E7A.0020.001F.3336] # SQUARE HEKUTAARU; QQKN
+3337 ; [.1E6E.0020.001C.3337][.0000.0141.001C.3337][.1E60.0020.001F.3337] # SQUARE PESO; QQKN
+3338 ; [.1E6E.0020.001C.3338][.0000.0141.001C.3338][.1E67.0020.001F.3338][.1E6C.0020.001F.3338] # SQUARE PENIHI; QQKN
+3339 ; [.1E6E.0020.001C.3339][.1E7A.0020.001C.3339][.1E63.0020.001F.3339] # SQUARE HERUTU; QQKN
+333A ; [.1E6E.0020.001C.333A][.0000.0141.001C.333A][.1E81.0020.001F.333A][.1E5E.0020.001F.333A] # SQUARE PENSU; QQKN
+307B ; [.1E6F.0020.000E.307B] # HIRAGANA LETTER HO
+31F9 ; [.1E6F.0020.000F.31F9] # KATAKANA LETTER SMALL HO
+30DB ; [.1E6F.0020.0011.30DB] # KATAKANA LETTER HO
+FF8E ; [.1E6F.0020.0012.FF8E] # HALFWIDTH KATAKANA LETTER HO; QQK
+32ED ; [.1E6F.0020.0013.32ED] # CIRCLED KATAKANA HO; QQK
+307C ; [.1E6F.0020.000E.307B][.0000.0140.0002.3099] # HIRAGANA LETTER BO; QQCM
+30DC ; [.1E6F.0020.0011.30DB][.0000.0140.0002.3099] # KATAKANA LETTER BO; QQCM
+307D ; [.1E6F.0020.000E.307B][.0000.0141.0002.309A] # HIRAGANA LETTER PO; QQCM
+30DD ; [.1E6F.0020.0011.30DB][.0000.0141.0002.309A] # KATAKANA LETTER PO; QQCM
+3341 ; [.1E6F.0020.001C.3341][.0E0B.0020.001C.3341][.1E7A.0020.001F.3341] # SQUARE HOORU; QQKN
+3342 ; [.1E6F.0020.001C.3342][.0E0B.0020.001C.3342][.1E81.0020.001F.3342] # SQUARE HOON; QQKN
+333D ; [.1E6F.0020.001C.333D][.0000.0141.001C.333D][.1E53.0020.001F.333D][.1E81.0020.001F.333D][.1E65.0020.001F.333D] # SQUARE POINTO; QQKN
+333E ; [.1E6F.0020.001C.333E][.0000.0140.001C.333E][.1E7A.0020.001F.333E][.1E65.0020.001F.333E] # SQUARE BORUTO; QQKN
+333F ; [.1E6F.0020.001C.333F][.1E81.0020.001C.333F] # SQUARE HON; QQKN
+3340 ; [.1E6F.0020.001C.3340][.0000.0141.001C.3340][.1E81.0020.001F.3340][.1E65.0020.001F.3340][.0000.0140.001F.3340] # SQUARE PONDO; QQKN
+307E ; [.1E70.0020.000E.307E] # HIRAGANA LETTER MA
+30DE ; [.1E70.0020.0011.30DE] # KATAKANA LETTER MA
+FF8F ; [.1E70.0020.0012.FF8F] # HALFWIDTH KATAKANA LETTER MA; QQK
+32EE ; [.1E70.0020.0013.32EE] # CIRCLED KATAKANA MA; QQK
+3343 ; [.1E70.0020.001C.3343][.1E53.0020.001C.3343][.1E59.0020.001F.3343][.1E7C.0020.001F.3343] # SQUARE MAIKURO; QQKN
+3344 ; [.1E70.0020.001C.3344][.1E53.0020.001C.3344][.1E7A.0020.001F.3344] # SQUARE MAIRU; QQKN
+303C ; [.1E70.0020.0004.303C][.1E5E.0020.0004.303C] # MASU MARK; QQKN
+3345 ; [.1E70.0020.001C.3345][.1E63.0020.001C.3345][.1E6B.0020.001F.3345] # SQUARE MAHHA; QQKN
+3346 ; [.1E70.0020.001C.3346][.1E7A.0020.001C.3346][.1E59.0020.001F.3346] # SQUARE MARUKU; QQKN
+3347 ; [.1E70.0020.001C.3347][.1E81.0020.001C.3347][.1E5D.0020.001F.3347][.1E77.0020.001F.3347][.1E81.0020.001F.3347] # SQUARE MANSYON; QQKN
+307F ; [.1E71.0020.000E.307F] # HIRAGANA LETTER MI
+30DF ; [.1E71.0020.0011.30DF] # KATAKANA LETTER MI
+FF90 ; [.1E71.0020.0012.FF90] # HALFWIDTH KATAKANA LETTER MI; QQK
+32EF ; [.1E71.0020.0013.32EF] # CIRCLED KATAKANA MI; QQK
+3348 ; [.1E71.0020.001C.3348][.1E59.0020.001C.3348][.1E7C.0020.001F.3348][.1E81.0020.001F.3348] # SQUARE MIKURON; QQKN
+3349 ; [.1E71.0020.001C.3349][.1E79.0020.001C.3349] # SQUARE MIRI; QQKN
+334A ; [.1E71.0020.001C.334A][.1E79.0020.001C.334A][.1E6B.0020.001F.334A][.0000.0140.001F.334A][.0E0B.0020.001F.334A][.1E7A.0020.001F.334A] # SQUARE MIRIBAARU; QQKN
+3080 ; [.1E72.0020.000E.3080] # HIRAGANA LETTER MU
+31FA ; [.1E72.0020.000F.31FA] # KATAKANA LETTER SMALL MU
+30E0 ; [.1E72.0020.0011.30E0] # KATAKANA LETTER MU
+FF91 ; [.1E72.0020.0012.FF91] # HALFWIDTH KATAKANA LETTER MU; QQK
+32F0 ; [.1E72.0020.0013.32F0] # CIRCLED KATAKANA MU; QQK
+3081 ; [.1E73.0020.000E.3081] # HIRAGANA LETTER ME
+30E1 ; [.1E73.0020.0011.30E1] # KATAKANA LETTER ME
+FF92 ; [.1E73.0020.0012.FF92] # HALFWIDTH KATAKANA LETTER ME; QQK
+32F1 ; [.1E73.0020.0013.32F1] # CIRCLED KATAKANA ME; QQK
+334D ; [.1E73.0020.001C.334D][.0E0B.0020.001C.334D][.1E65.0020.001F.334D][.1E7A.0020.001F.334D] # SQUARE MEETORU; QQKN
+334B ; [.1E73.0020.001C.334B][.1E57.0020.001C.334B][.0000.0140.001F.334B] # SQUARE MEGA; QQKN
+334C ; [.1E73.0020.001C.334C][.1E57.0020.001C.334C][.0000.0140.001F.334C][.1E65.0020.001F.334C][.1E81.0020.001F.334C] # SQUARE MEGATON; QQKN
+3082 ; [.1E74.0020.000E.3082] # HIRAGANA LETTER MO
+30E2 ; [.1E74.0020.0011.30E2] # KATAKANA LETTER MO
+FF93 ; [.1E74.0020.0012.FF93] # HALFWIDTH KATAKANA LETTER MO; QQK
+32F2 ; [.1E74.0020.0013.32F2] # CIRCLED KATAKANA MO; QQK
+3083 ; [.1E75.0020.000D.3083] # HIRAGANA LETTER SMALL YA
+3084 ; [.1E75.0020.000E.3084] # HIRAGANA LETTER YA
+30E3 ; [.1E75.0020.000F.30E3] # KATAKANA LETTER SMALL YA
+FF6C ; [.1E75.0020.0010.FF6C] # HALFWIDTH KATAKANA LETTER SMALL YA; QQK
+30E4 ; [.1E75.0020.0011.30E4] # KATAKANA LETTER YA
+FF94 ; [.1E75.0020.0012.FF94] # HALFWIDTH KATAKANA LETTER YA; QQK
+32F3 ; [.1E75.0020.0013.32F3] # CIRCLED KATAKANA YA; QQK
+334E ; [.1E75.0020.001C.334E][.0E0B.0020.001C.334E][.1E65.0020.001F.334E][.0000.0140.001F.334E] # SQUARE YAADO; QQKN
+334F ; [.1E75.0020.001C.334F][.0E0B.0020.001C.334F][.1E7A.0020.001F.334F] # SQUARE YAARU; QQKN
+3085 ; [.1E76.0020.000D.3085] # HIRAGANA LETTER SMALL YU
+3086 ; [.1E76.0020.000E.3086] # HIRAGANA LETTER YU
+30E5 ; [.1E76.0020.000F.30E5] # KATAKANA LETTER SMALL YU
+FF6D ; [.1E76.0020.0010.FF6D] # HALFWIDTH KATAKANA LETTER SMALL YU; QQK
+30E6 ; [.1E76.0020.0011.30E6] # KATAKANA LETTER YU
+FF95 ; [.1E76.0020.0012.FF95] # HALFWIDTH KATAKANA LETTER YU; QQK
+32F4 ; [.1E76.0020.0013.32F4] # CIRCLED KATAKANA YU; QQK
+3350 ; [.1E76.0020.001C.3350][.1E52.0020.001C.3350][.1E81.0020.001F.3350] # SQUARE YUAN; QQKN
+3087 ; [.1E77.0020.000D.3087] # HIRAGANA LETTER SMALL YO
+3088 ; [.1E77.0020.000E.3088] # HIRAGANA LETTER YO
+30E7 ; [.1E77.0020.000F.30E7] # KATAKANA LETTER SMALL YO
+FF6E ; [.1E77.0020.0010.FF6E] # HALFWIDTH KATAKANA LETTER SMALL YO; QQK
+30E8 ; [.1E77.0020.0011.30E8] # KATAKANA LETTER YO
+FF96 ; [.1E77.0020.0012.FF96] # HALFWIDTH KATAKANA LETTER YO; QQK
+32F5 ; [.1E77.0020.0013.32F5] # CIRCLED KATAKANA YO; QQK
+309F ; [.1E77.0020.0016.309F][.1E79.0020.0016.309F] # HIRAGANA DIGRAPH YORI; QQKN
+3089 ; [.1E78.0020.000E.3089] # HIRAGANA LETTER RA
+31FB ; [.1E78.0020.000F.31FB] # KATAKANA LETTER SMALL RA
+30E9 ; [.1E78.0020.0011.30E9] # KATAKANA LETTER RA
+FF97 ; [.1E78.0020.0012.FF97] # HALFWIDTH KATAKANA LETTER RA; QQK
+32F6 ; [.1E78.0020.0013.32F6] # CIRCLED KATAKANA RA; QQK
+308A ; [.1E79.0020.000E.308A] # HIRAGANA LETTER RI
+31FC ; [.1E79.0020.000F.31FC] # KATAKANA LETTER SMALL RI
+30EA ; [.1E79.0020.0011.30EA] # KATAKANA LETTER RI
+FF98 ; [.1E79.0020.0012.FF98] # HALFWIDTH KATAKANA LETTER RI; QQK
+32F7 ; [.1E79.0020.0013.32F7] # CIRCLED KATAKANA RI; QQK
+3351 ; [.1E79.0020.001C.3351][.1E63.0020.001C.3351][.1E65.0020.001F.3351][.1E7A.0020.001F.3351] # SQUARE RITTORU; QQKN
+3352 ; [.1E79.0020.001C.3352][.1E78.0020.001C.3352] # SQUARE RIRA; QQKN
+308B ; [.1E7A.0020.000E.308B] # HIRAGANA LETTER RU
+31FD ; [.1E7A.0020.000F.31FD] # KATAKANA LETTER SMALL RU
+30EB ; [.1E7A.0020.0011.30EB] # KATAKANA LETTER RU
+FF99 ; [.1E7A.0020.0012.FF99] # HALFWIDTH KATAKANA LETTER RU; QQK
+32F8 ; [.1E7A.0020.0013.32F8] # CIRCLED KATAKANA RU; QQK
+3354 ; [.1E7A.0020.001C.3354][.0E0B.0020.001C.3354][.1E6D.0020.001F.3354][.0000.0140.001F.3354][.1E7A.0020.001F.3354] # SQUARE RUUBURU; QQKN
+3353 ; [.1E7A.0020.001C.3353][.1E6C.0020.001C.3353][.0000.0141.001F.3353][.0E0B.0020.001F.3353] # SQUARE RUPII; QQKN
+308C ; [.1E7B.0020.000E.308C] # HIRAGANA LETTER RE
+31FE ; [.1E7B.0020.000F.31FE] # KATAKANA LETTER SMALL RE
+30EC ; [.1E7B.0020.0011.30EC] # KATAKANA LETTER RE
+FF9A ; [.1E7B.0020.0012.FF9A] # HALFWIDTH KATAKANA LETTER RE; QQK
+32F9 ; [.1E7B.0020.0013.32F9] # CIRCLED KATAKANA RE; QQK
+3355 ; [.1E7B.0020.001C.3355][.1E72.0020.001C.3355] # SQUARE REMU; QQKN
+3356 ; [.1E7B.0020.001C.3356][.1E81.0020.001C.3356][.1E65.0020.001F.3356][.1E5A.0020.001F.3356][.0000.0140.001F.3356][.1E81.0020.001F.3356] # SQUARE RENTOGEN; QQKN
+308D ; [.1E7C.0020.000E.308D] # HIRAGANA LETTER RO
+31FF ; [.1E7C.0020.000F.31FF] # KATAKANA LETTER SMALL RO
+30ED ; [.1E7C.0020.0011.30ED] # KATAKANA LETTER RO
+FF9B ; [.1E7C.0020.0012.FF9B] # HALFWIDTH KATAKANA LETTER RO; QQK
+32FA ; [.1E7C.0020.0013.32FA] # CIRCLED KATAKANA RO; QQK
+308E ; [.1E7D.0020.000D.308E] # HIRAGANA LETTER SMALL WA
+308F ; [.1E7D.0020.000E.308F] # HIRAGANA LETTER WA
+30EE ; [.1E7D.0020.000F.30EE] # KATAKANA LETTER SMALL WA
+30EF ; [.1E7D.0020.0011.30EF] # KATAKANA LETTER WA
+FF9C ; [.1E7D.0020.0012.FF9C] # HALFWIDTH KATAKANA LETTER WA; QQK
+32FB ; [.1E7D.0020.0013.32FB] # CIRCLED KATAKANA WA; QQK
+30F7 ; [.1E7D.0020.0011.30EF][.0000.0140.0002.3099] # KATAKANA LETTER VA; QQCM
+3357 ; [.1E7D.0020.001C.3357][.1E63.0020.001C.3357][.1E65.0020.001F.3357] # SQUARE WATTO; QQKN
+3090 ; [.1E7E.0020.000E.3090] # HIRAGANA LETTER WI
+30F0 ; [.1E7E.0020.0011.30F0] # KATAKANA LETTER WI
+32FC ; [.1E7E.0020.0013.32FC] # CIRCLED KATAKANA WI; QQK
+30F8 ; [.1E7E.0020.0011.30F0][.0000.0140.0002.3099] # KATAKANA LETTER VI; QQCM
+3091 ; [.1E7F.0020.000E.3091] # HIRAGANA LETTER WE
+30F1 ; [.1E7F.0020.0011.30F1] # KATAKANA LETTER WE
+32FD ; [.1E7F.0020.0013.32FD] # CIRCLED KATAKANA WE; QQK
+30F9 ; [.1E7F.0020.0011.30F1][.0000.0140.0002.3099] # KATAKANA LETTER VE; QQCM
+3092 ; [.1E80.0020.000E.3092] # HIRAGANA LETTER WO
+30F2 ; [.1E80.0020.0011.30F2] # KATAKANA LETTER WO
+FF66 ; [.1E80.0020.0012.FF66] # HALFWIDTH KATAKANA LETTER WO; QQK
+32FE ; [.1E80.0020.0013.32FE] # CIRCLED KATAKANA WO; QQK
+30FA ; [.1E80.0020.0011.30F2][.0000.0140.0002.3099] # KATAKANA LETTER VO; QQCM
+3093 ; [.1E81.0020.000E.3093] # HIRAGANA LETTER N
+30F3 ; [.1E81.0020.0011.30F3] # KATAKANA LETTER N
+FF9D ; [.1E81.0020.0012.FF9D] # HALFWIDTH KATAKANA LETTER N; QQK
+3105 ; [.1E82.0020.0002.3105] # BOPOMOFO LETTER B
+31A0 ; [.1E82.0020.0004.31A0][.0000.015E.0004.31A0] # BOPOMOFO LETTER BU; QQKN
+3106 ; [.1E83.0020.0002.3106] # BOPOMOFO LETTER P
+31B4 ; [.1E83.0020.0019.31B4] # BOPOMOFO FINAL LETTER P; QQK
+3107 ; [.1E84.0020.0002.3107] # BOPOMOFO LETTER M
+3108 ; [.1E85.0020.0002.3108] # BOPOMOFO LETTER F
+312A ; [.1E86.0020.0002.312A] # BOPOMOFO LETTER V
+3109 ; [.1E87.0020.0002.3109] # BOPOMOFO LETTER D
+310A ; [.1E88.0020.0002.310A] # BOPOMOFO LETTER T
+31B5 ; [.1E88.0020.0019.31B5] # BOPOMOFO FINAL LETTER T; QQK
+310B ; [.1E89.0020.0002.310B] # BOPOMOFO LETTER N
+310C ; [.1E8A.0020.0002.310C] # BOPOMOFO LETTER L
+310D ; [.1E8B.0020.0002.310D] # BOPOMOFO LETTER G
+31A3 ; [.1E8B.0020.0004.31A3][.0000.015E.0004.31A3] # BOPOMOFO LETTER GU; QQKN
+310E ; [.1E8C.0020.0002.310E] # BOPOMOFO LETTER K
+31B6 ; [.1E8C.0020.0019.31B6] # BOPOMOFO FINAL LETTER K; QQK
+312B ; [.1E8D.0020.0002.312B] # BOPOMOFO LETTER NG
+31AD ; [.1E8E.0020.0002.31AD] # BOPOMOFO LETTER NGG
+310F ; [.1E8F.0020.0002.310F] # BOPOMOFO LETTER H
+31B7 ; [.1E8F.0020.0019.31B7] # BOPOMOFO FINAL LETTER H; QQK
+3110 ; [.1E90.0020.0002.3110] # BOPOMOFO LETTER J
+31A2 ; [.1E90.0020.0004.31A2][.0000.015E.0004.31A2] # BOPOMOFO LETTER JI; QQKN
+3111 ; [.1E91.0020.0002.3111] # BOPOMOFO LETTER Q
+3112 ; [.1E92.0020.0002.3112] # BOPOMOFO LETTER X
+312C ; [.1E93.0020.0002.312C] # BOPOMOFO LETTER GN
+3113 ; [.1E94.0020.0002.3113] # BOPOMOFO LETTER ZH
+3114 ; [.1E95.0020.0002.3114] # BOPOMOFO LETTER CH
+3115 ; [.1E96.0020.0002.3115] # BOPOMOFO LETTER SH
+3116 ; [.1E97.0020.0002.3116] # BOPOMOFO LETTER R
+3117 ; [.1E98.0020.0002.3117] # BOPOMOFO LETTER Z
+31A1 ; [.1E98.0020.0004.31A1][.0000.015E.0004.31A1] # BOPOMOFO LETTER ZI; QQKN
+3118 ; [.1E99.0020.0002.3118] # BOPOMOFO LETTER C
+3119 ; [.1E9A.0020.0002.3119] # BOPOMOFO LETTER S
+311A ; [.1E9B.0020.0002.311A] # BOPOMOFO LETTER A
+31A9 ; [.1E9B.0020.0004.31A9][.0000.015E.0004.31A9] # BOPOMOFO LETTER ANN; QQKN
+311B ; [.1E9C.0020.0002.311B] # BOPOMOFO LETTER O
+31A7 ; [.1E9C.0020.0004.31A7][.0000.015E.0004.31A7] # BOPOMOFO LETTER ONN; QQKN
+31A6 ; [.1E9D.0020.0002.31A6] # BOPOMOFO LETTER OO
+311C ; [.1E9E.0020.0002.311C] # BOPOMOFO LETTER E
+311D ; [.1E9F.0020.0002.311D] # BOPOMOFO LETTER EH
+31A4 ; [.1EA0.0020.0002.31A4] # BOPOMOFO LETTER EE
+31A5 ; [.1EA0.0020.0004.31A5][.0000.015E.0004.31A5] # BOPOMOFO LETTER ENN; QQKN
+311E ; [.1EA1.0020.0002.311E] # BOPOMOFO LETTER AI
+31AE ; [.1EA1.0020.0004.31AE][.0000.015E.0004.31AE] # BOPOMOFO LETTER AINN; QQKN
+311F ; [.1EA2.0020.0002.311F] # BOPOMOFO LETTER EI
+3120 ; [.1EA3.0020.0002.3120] # BOPOMOFO LETTER AU
+31AF ; [.1EA3.0020.0004.31AF][.0000.015E.0004.31AF] # BOPOMOFO LETTER AUNN; QQKN
+3121 ; [.1EA4.0020.0002.3121] # BOPOMOFO LETTER OU
+3122 ; [.1EA5.0020.0002.3122] # BOPOMOFO LETTER AN
+3123 ; [.1EA6.0020.0002.3123] # BOPOMOFO LETTER EN
+3124 ; [.1EA7.0020.0002.3124] # BOPOMOFO LETTER ANG
+31B2 ; [.1EA8.0020.0002.31B2] # BOPOMOFO LETTER ONG
+3125 ; [.1EA9.0020.0002.3125] # BOPOMOFO LETTER ENG
+31B0 ; [.1EAA.0020.0002.31B0] # BOPOMOFO LETTER AM
+31B1 ; [.1EAB.0020.0002.31B1] # BOPOMOFO LETTER OM
+31AC ; [.1EAC.0020.0002.31AC] # BOPOMOFO LETTER IM
+3126 ; [.1EAD.0020.0002.3126] # BOPOMOFO LETTER ER
+3127 ; [.1EAE.0020.0002.3127] # BOPOMOFO LETTER I
+31AA ; [.1EAE.0020.0004.31AA][.0000.015E.0004.31AA] # BOPOMOFO LETTER INN; QQKN
+31B3 ; [.1EAE.0020.0016.31B3][.0000.015E.0016.31B3] # BOPOMOFO LETTER INNN; QQKN
+3128 ; [.1EAF.0020.0002.3128] # BOPOMOFO LETTER U
+31AB ; [.1EAF.0020.0004.31AB][.0000.015E.0004.31AB] # BOPOMOFO LETTER UNN; QQKN
+31A8 ; [.1EAF.0020.0004.31A8][.0000.0160.0004.31A8] # BOPOMOFO LETTER IR; QQKN
+3129 ; [.1EB0.0020.0002.3129] # BOPOMOFO LETTER IU
+A000 ; [.1EB1.0020.0002.A000] # YI SYLLABLE IT
+A001 ; [.1EB2.0020.0002.A001] # YI SYLLABLE IX
+A002 ; [.1EB3.0020.0002.A002] # YI SYLLABLE I
+A003 ; [.1EB4.0020.0002.A003] # YI SYLLABLE IP
+A004 ; [.1EB5.0020.0002.A004] # YI SYLLABLE IET
+A005 ; [.1EB6.0020.0002.A005] # YI SYLLABLE IEX
+A006 ; [.1EB7.0020.0002.A006] # YI SYLLABLE IE
+A007 ; [.1EB8.0020.0002.A007] # YI SYLLABLE IEP
+A008 ; [.1EB9.0020.0002.A008] # YI SYLLABLE AT
+A009 ; [.1EBA.0020.0002.A009] # YI SYLLABLE AX
+A00A ; [.1EBB.0020.0002.A00A] # YI SYLLABLE A
+A00B ; [.1EBC.0020.0002.A00B] # YI SYLLABLE AP
+A00C ; [.1EBD.0020.0002.A00C] # YI SYLLABLE UOX
+A00D ; [.1EBE.0020.0002.A00D] # YI SYLLABLE UO
+A00E ; [.1EBF.0020.0002.A00E] # YI SYLLABLE UOP
+A00F ; [.1EC0.0020.0002.A00F] # YI SYLLABLE OT
+A010 ; [.1EC1.0020.0002.A010] # YI SYLLABLE OX
+A011 ; [.1EC2.0020.0002.A011] # YI SYLLABLE O
+A012 ; [.1EC3.0020.0002.A012] # YI SYLLABLE OP
+A013 ; [.1EC4.0020.0002.A013] # YI SYLLABLE EX
+A014 ; [.1EC5.0020.0002.A014] # YI SYLLABLE E
+A015 ; [.1EC6.0020.0002.A015] # YI SYLLABLE WU
+A016 ; [.1EC7.0020.0002.A016] # YI SYLLABLE BIT
+A017 ; [.1EC8.0020.0002.A017] # YI SYLLABLE BIX
+A018 ; [.1EC9.0020.0002.A018] # YI SYLLABLE BI
+A019 ; [.1ECA.0020.0002.A019] # YI SYLLABLE BIP
+A01A ; [.1ECB.0020.0002.A01A] # YI SYLLABLE BIET
+A01B ; [.1ECC.0020.0002.A01B] # YI SYLLABLE BIEX
+A01C ; [.1ECD.0020.0002.A01C] # YI SYLLABLE BIE
+A01D ; [.1ECE.0020.0002.A01D] # YI SYLLABLE BIEP
+A01E ; [.1ECF.0020.0002.A01E] # YI SYLLABLE BAT
+A01F ; [.1ED0.0020.0002.A01F] # YI SYLLABLE BAX
+A020 ; [.1ED1.0020.0002.A020] # YI SYLLABLE BA
+A021 ; [.1ED2.0020.0002.A021] # YI SYLLABLE BAP
+A022 ; [.1ED3.0020.0002.A022] # YI SYLLABLE BUOX
+A023 ; [.1ED4.0020.0002.A023] # YI SYLLABLE BUO
+A024 ; [.1ED5.0020.0002.A024] # YI SYLLABLE BUOP
+A025 ; [.1ED6.0020.0002.A025] # YI SYLLABLE BOT
+A026 ; [.1ED7.0020.0002.A026] # YI SYLLABLE BOX
+A027 ; [.1ED8.0020.0002.A027] # YI SYLLABLE BO
+A028 ; [.1ED9.0020.0002.A028] # YI SYLLABLE BOP
+A029 ; [.1EDA.0020.0002.A029] # YI SYLLABLE BEX
+A02A ; [.1EDB.0020.0002.A02A] # YI SYLLABLE BE
+A02B ; [.1EDC.0020.0002.A02B] # YI SYLLABLE BEP
+A02C ; [.1EDD.0020.0002.A02C] # YI SYLLABLE BUT
+A02D ; [.1EDE.0020.0002.A02D] # YI SYLLABLE BUX
+A02E ; [.1EDF.0020.0002.A02E] # YI SYLLABLE BU
+A02F ; [.1EE0.0020.0002.A02F] # YI SYLLABLE BUP
+A030 ; [.1EE1.0020.0002.A030] # YI SYLLABLE BURX
+A031 ; [.1EE2.0020.0002.A031] # YI SYLLABLE BUR
+A032 ; [.1EE3.0020.0002.A032] # YI SYLLABLE BYT
+A033 ; [.1EE4.0020.0002.A033] # YI SYLLABLE BYX
+A034 ; [.1EE5.0020.0002.A034] # YI SYLLABLE BY
+A035 ; [.1EE6.0020.0002.A035] # YI SYLLABLE BYP
+A036 ; [.1EE7.0020.0002.A036] # YI SYLLABLE BYRX
+A037 ; [.1EE8.0020.0002.A037] # YI SYLLABLE BYR
+A038 ; [.1EE9.0020.0002.A038] # YI SYLLABLE PIT
+A039 ; [.1EEA.0020.0002.A039] # YI SYLLABLE PIX
+A03A ; [.1EEB.0020.0002.A03A] # YI SYLLABLE PI
+A03B ; [.1EEC.0020.0002.A03B] # YI SYLLABLE PIP
+A03C ; [.1EED.0020.0002.A03C] # YI SYLLABLE PIEX
+A03D ; [.1EEE.0020.0002.A03D] # YI SYLLABLE PIE
+A03E ; [.1EEF.0020.0002.A03E] # YI SYLLABLE PIEP
+A03F ; [.1EF0.0020.0002.A03F] # YI SYLLABLE PAT
+A040 ; [.1EF1.0020.0002.A040] # YI SYLLABLE PAX
+A041 ; [.1EF2.0020.0002.A041] # YI SYLLABLE PA
+A042 ; [.1EF3.0020.0002.A042] # YI SYLLABLE PAP
+A043 ; [.1EF4.0020.0002.A043] # YI SYLLABLE PUOX
+A044 ; [.1EF5.0020.0002.A044] # YI SYLLABLE PUO
+A045 ; [.1EF6.0020.0002.A045] # YI SYLLABLE PUOP
+A046 ; [.1EF7.0020.0002.A046] # YI SYLLABLE POT
+A047 ; [.1EF8.0020.0002.A047] # YI SYLLABLE POX
+A048 ; [.1EF9.0020.0002.A048] # YI SYLLABLE PO
+A049 ; [.1EFA.0020.0002.A049] # YI SYLLABLE POP
+A04A ; [.1EFB.0020.0002.A04A] # YI SYLLABLE PUT
+A04B ; [.1EFC.0020.0002.A04B] # YI SYLLABLE PUX
+A04C ; [.1EFD.0020.0002.A04C] # YI SYLLABLE PU
+A04D ; [.1EFE.0020.0002.A04D] # YI SYLLABLE PUP
+A04E ; [.1EFF.0020.0002.A04E] # YI SYLLABLE PURX
+A04F ; [.1F00.0020.0002.A04F] # YI SYLLABLE PUR
+A050 ; [.1F01.0020.0002.A050] # YI SYLLABLE PYT
+A051 ; [.1F02.0020.0002.A051] # YI SYLLABLE PYX
+A052 ; [.1F03.0020.0002.A052] # YI SYLLABLE PY
+A053 ; [.1F04.0020.0002.A053] # YI SYLLABLE PYP
+A054 ; [.1F05.0020.0002.A054] # YI SYLLABLE PYRX
+A055 ; [.1F06.0020.0002.A055] # YI SYLLABLE PYR
+A056 ; [.1F07.0020.0002.A056] # YI SYLLABLE BBIT
+A057 ; [.1F08.0020.0002.A057] # YI SYLLABLE BBIX
+A058 ; [.1F09.0020.0002.A058] # YI SYLLABLE BBI
+A059 ; [.1F0A.0020.0002.A059] # YI SYLLABLE BBIP
+A05A ; [.1F0B.0020.0002.A05A] # YI SYLLABLE BBIET
+A05B ; [.1F0C.0020.0002.A05B] # YI SYLLABLE BBIEX
+A05C ; [.1F0D.0020.0002.A05C] # YI SYLLABLE BBIE
+A05D ; [.1F0E.0020.0002.A05D] # YI SYLLABLE BBIEP
+A05E ; [.1F0F.0020.0002.A05E] # YI SYLLABLE BBAT
+A05F ; [.1F10.0020.0002.A05F] # YI SYLLABLE BBAX
+A060 ; [.1F11.0020.0002.A060] # YI SYLLABLE BBA
+A061 ; [.1F12.0020.0002.A061] # YI SYLLABLE BBAP
+A062 ; [.1F13.0020.0002.A062] # YI SYLLABLE BBUOX
+A063 ; [.1F14.0020.0002.A063] # YI SYLLABLE BBUO
+A064 ; [.1F15.0020.0002.A064] # YI SYLLABLE BBUOP
+A065 ; [.1F16.0020.0002.A065] # YI SYLLABLE BBOT
+A066 ; [.1F17.0020.0002.A066] # YI SYLLABLE BBOX
+A067 ; [.1F18.0020.0002.A067] # YI SYLLABLE BBO
+A068 ; [.1F19.0020.0002.A068] # YI SYLLABLE BBOP
+A069 ; [.1F1A.0020.0002.A069] # YI SYLLABLE BBEX
+A06A ; [.1F1B.0020.0002.A06A] # YI SYLLABLE BBE
+A06B ; [.1F1C.0020.0002.A06B] # YI SYLLABLE BBEP
+A06C ; [.1F1D.0020.0002.A06C] # YI SYLLABLE BBUT
+A06D ; [.1F1E.0020.0002.A06D] # YI SYLLABLE BBUX
+A06E ; [.1F1F.0020.0002.A06E] # YI SYLLABLE BBU
+A06F ; [.1F20.0020.0002.A06F] # YI SYLLABLE BBUP
+A070 ; [.1F21.0020.0002.A070] # YI SYLLABLE BBURX
+A071 ; [.1F22.0020.0002.A071] # YI SYLLABLE BBUR
+A072 ; [.1F23.0020.0002.A072] # YI SYLLABLE BBYT
+A073 ; [.1F24.0020.0002.A073] # YI SYLLABLE BBYX
+A074 ; [.1F25.0020.0002.A074] # YI SYLLABLE BBY
+A075 ; [.1F26.0020.0002.A075] # YI SYLLABLE BBYP
+A076 ; [.1F27.0020.0002.A076] # YI SYLLABLE NBIT
+A077 ; [.1F28.0020.0002.A077] # YI SYLLABLE NBIX
+A078 ; [.1F29.0020.0002.A078] # YI SYLLABLE NBI
+A079 ; [.1F2A.0020.0002.A079] # YI SYLLABLE NBIP
+A07A ; [.1F2B.0020.0002.A07A] # YI SYLLABLE NBIEX
+A07B ; [.1F2C.0020.0002.A07B] # YI SYLLABLE NBIE
+A07C ; [.1F2D.0020.0002.A07C] # YI SYLLABLE NBIEP
+A07D ; [.1F2E.0020.0002.A07D] # YI SYLLABLE NBAT
+A07E ; [.1F2F.0020.0002.A07E] # YI SYLLABLE NBAX
+A07F ; [.1F30.0020.0002.A07F] # YI SYLLABLE NBA
+A080 ; [.1F31.0020.0002.A080] # YI SYLLABLE NBAP
+A081 ; [.1F32.0020.0002.A081] # YI SYLLABLE NBOT
+A082 ; [.1F33.0020.0002.A082] # YI SYLLABLE NBOX
+A083 ; [.1F34.0020.0002.A083] # YI SYLLABLE NBO
+A084 ; [.1F35.0020.0002.A084] # YI SYLLABLE NBOP
+A085 ; [.1F36.0020.0002.A085] # YI SYLLABLE NBUT
+A086 ; [.1F37.0020.0002.A086] # YI SYLLABLE NBUX
+A087 ; [.1F38.0020.0002.A087] # YI SYLLABLE NBU
+A088 ; [.1F39.0020.0002.A088] # YI SYLLABLE NBUP
+A089 ; [.1F3A.0020.0002.A089] # YI SYLLABLE NBURX
+A08A ; [.1F3B.0020.0002.A08A] # YI SYLLABLE NBUR
+A08B ; [.1F3C.0020.0002.A08B] # YI SYLLABLE NBYT
+A08C ; [.1F3D.0020.0002.A08C] # YI SYLLABLE NBYX
+A08D ; [.1F3E.0020.0002.A08D] # YI SYLLABLE NBY
+A08E ; [.1F3F.0020.0002.A08E] # YI SYLLABLE NBYP
+A08F ; [.1F40.0020.0002.A08F] # YI SYLLABLE NBYRX
+A090 ; [.1F41.0020.0002.A090] # YI SYLLABLE NBYR
+A091 ; [.1F42.0020.0002.A091] # YI SYLLABLE HMIT
+A092 ; [.1F43.0020.0002.A092] # YI SYLLABLE HMIX
+A093 ; [.1F44.0020.0002.A093] # YI SYLLABLE HMI
+A094 ; [.1F45.0020.0002.A094] # YI SYLLABLE HMIP
+A095 ; [.1F46.0020.0002.A095] # YI SYLLABLE HMIEX
+A096 ; [.1F47.0020.0002.A096] # YI SYLLABLE HMIE
+A097 ; [.1F48.0020.0002.A097] # YI SYLLABLE HMIEP
+A098 ; [.1F49.0020.0002.A098] # YI SYLLABLE HMAT
+A099 ; [.1F4A.0020.0002.A099] # YI SYLLABLE HMAX
+A09A ; [.1F4B.0020.0002.A09A] # YI SYLLABLE HMA
+A09B ; [.1F4C.0020.0002.A09B] # YI SYLLABLE HMAP
+A09C ; [.1F4D.0020.0002.A09C] # YI SYLLABLE HMUOX
+A09D ; [.1F4E.0020.0002.A09D] # YI SYLLABLE HMUO
+A09E ; [.1F4F.0020.0002.A09E] # YI SYLLABLE HMUOP
+A09F ; [.1F50.0020.0002.A09F] # YI SYLLABLE HMOT
+A0A0 ; [.1F51.0020.0002.A0A0] # YI SYLLABLE HMOX
+A0A1 ; [.1F52.0020.0002.A0A1] # YI SYLLABLE HMO
+A0A2 ; [.1F53.0020.0002.A0A2] # YI SYLLABLE HMOP
+A0A3 ; [.1F54.0020.0002.A0A3] # YI SYLLABLE HMUT
+A0A4 ; [.1F55.0020.0002.A0A4] # YI SYLLABLE HMUX
+A0A5 ; [.1F56.0020.0002.A0A5] # YI SYLLABLE HMU
+A0A6 ; [.1F57.0020.0002.A0A6] # YI SYLLABLE HMUP
+A0A7 ; [.1F58.0020.0002.A0A7] # YI SYLLABLE HMURX
+A0A8 ; [.1F59.0020.0002.A0A8] # YI SYLLABLE HMUR
+A0A9 ; [.1F5A.0020.0002.A0A9] # YI SYLLABLE HMYX
+A0AA ; [.1F5B.0020.0002.A0AA] # YI SYLLABLE HMY
+A0AB ; [.1F5C.0020.0002.A0AB] # YI SYLLABLE HMYP
+A0AC ; [.1F5D.0020.0002.A0AC] # YI SYLLABLE HMYRX
+A0AD ; [.1F5E.0020.0002.A0AD] # YI SYLLABLE HMYR
+A0AE ; [.1F5F.0020.0002.A0AE] # YI SYLLABLE MIT
+A0AF ; [.1F60.0020.0002.A0AF] # YI SYLLABLE MIX
+A0B0 ; [.1F61.0020.0002.A0B0] # YI SYLLABLE MI
+A0B1 ; [.1F62.0020.0002.A0B1] # YI SYLLABLE MIP
+A0B2 ; [.1F63.0020.0002.A0B2] # YI SYLLABLE MIEX
+A0B3 ; [.1F64.0020.0002.A0B3] # YI SYLLABLE MIE
+A0B4 ; [.1F65.0020.0002.A0B4] # YI SYLLABLE MIEP
+A0B5 ; [.1F66.0020.0002.A0B5] # YI SYLLABLE MAT
+A0B6 ; [.1F67.0020.0002.A0B6] # YI SYLLABLE MAX
+A0B7 ; [.1F68.0020.0002.A0B7] # YI SYLLABLE MA
+A0B8 ; [.1F69.0020.0002.A0B8] # YI SYLLABLE MAP
+A0B9 ; [.1F6A.0020.0002.A0B9] # YI SYLLABLE MUOT
+A0BA ; [.1F6B.0020.0002.A0BA] # YI SYLLABLE MUOX
+A0BB ; [.1F6C.0020.0002.A0BB] # YI SYLLABLE MUO
+A0BC ; [.1F6D.0020.0002.A0BC] # YI SYLLABLE MUOP
+A0BD ; [.1F6E.0020.0002.A0BD] # YI SYLLABLE MOT
+A0BE ; [.1F6F.0020.0002.A0BE] # YI SYLLABLE MOX
+A0BF ; [.1F70.0020.0002.A0BF] # YI SYLLABLE MO
+A0C0 ; [.1F71.0020.0002.A0C0] # YI SYLLABLE MOP
+A0C1 ; [.1F72.0020.0002.A0C1] # YI SYLLABLE MEX
+A0C2 ; [.1F73.0020.0002.A0C2] # YI SYLLABLE ME
+A0C3 ; [.1F74.0020.0002.A0C3] # YI SYLLABLE MUT
+A0C4 ; [.1F75.0020.0002.A0C4] # YI SYLLABLE MUX
+A0C5 ; [.1F76.0020.0002.A0C5] # YI SYLLABLE MU
+A0C6 ; [.1F77.0020.0002.A0C6] # YI SYLLABLE MUP
+A0C7 ; [.1F78.0020.0002.A0C7] # YI SYLLABLE MURX
+A0C8 ; [.1F79.0020.0002.A0C8] # YI SYLLABLE MUR
+A0C9 ; [.1F7A.0020.0002.A0C9] # YI SYLLABLE MYT
+A0CA ; [.1F7B.0020.0002.A0CA] # YI SYLLABLE MYX
+A0CB ; [.1F7C.0020.0002.A0CB] # YI SYLLABLE MY
+A0CC ; [.1F7D.0020.0002.A0CC] # YI SYLLABLE MYP
+A0CD ; [.1F7E.0020.0002.A0CD] # YI SYLLABLE FIT
+A0CE ; [.1F7F.0020.0002.A0CE] # YI SYLLABLE FIX
+A0CF ; [.1F80.0020.0002.A0CF] # YI SYLLABLE FI
+A0D0 ; [.1F81.0020.0002.A0D0] # YI SYLLABLE FIP
+A0D1 ; [.1F82.0020.0002.A0D1] # YI SYLLABLE FAT
+A0D2 ; [.1F83.0020.0002.A0D2] # YI SYLLABLE FAX
+A0D3 ; [.1F84.0020.0002.A0D3] # YI SYLLABLE FA
+A0D4 ; [.1F85.0020.0002.A0D4] # YI SYLLABLE FAP
+A0D5 ; [.1F86.0020.0002.A0D5] # YI SYLLABLE FOX
+A0D6 ; [.1F87.0020.0002.A0D6] # YI SYLLABLE FO
+A0D7 ; [.1F88.0020.0002.A0D7] # YI SYLLABLE FOP
+A0D8 ; [.1F89.0020.0002.A0D8] # YI SYLLABLE FUT
+A0D9 ; [.1F8A.0020.0002.A0D9] # YI SYLLABLE FUX
+A0DA ; [.1F8B.0020.0002.A0DA] # YI SYLLABLE FU
+A0DB ; [.1F8C.0020.0002.A0DB] # YI SYLLABLE FUP
+A0DC ; [.1F8D.0020.0002.A0DC] # YI SYLLABLE FURX
+A0DD ; [.1F8E.0020.0002.A0DD] # YI SYLLABLE FUR
+A0DE ; [.1F8F.0020.0002.A0DE] # YI SYLLABLE FYT
+A0DF ; [.1F90.0020.0002.A0DF] # YI SYLLABLE FYX
+A0E0 ; [.1F91.0020.0002.A0E0] # YI SYLLABLE FY
+A0E1 ; [.1F92.0020.0002.A0E1] # YI SYLLABLE FYP
+A0E2 ; [.1F93.0020.0002.A0E2] # YI SYLLABLE VIT
+A0E3 ; [.1F94.0020.0002.A0E3] # YI SYLLABLE VIX
+A0E4 ; [.1F95.0020.0002.A0E4] # YI SYLLABLE VI
+A0E5 ; [.1F96.0020.0002.A0E5] # YI SYLLABLE VIP
+A0E6 ; [.1F97.0020.0002.A0E6] # YI SYLLABLE VIET
+A0E7 ; [.1F98.0020.0002.A0E7] # YI SYLLABLE VIEX
+A0E8 ; [.1F99.0020.0002.A0E8] # YI SYLLABLE VIE
+A0E9 ; [.1F9A.0020.0002.A0E9] # YI SYLLABLE VIEP
+A0EA ; [.1F9B.0020.0002.A0EA] # YI SYLLABLE VAT
+A0EB ; [.1F9C.0020.0002.A0EB] # YI SYLLABLE VAX
+A0EC ; [.1F9D.0020.0002.A0EC] # YI SYLLABLE VA
+A0ED ; [.1F9E.0020.0002.A0ED] # YI SYLLABLE VAP
+A0EE ; [.1F9F.0020.0002.A0EE] # YI SYLLABLE VOT
+A0EF ; [.1FA0.0020.0002.A0EF] # YI SYLLABLE VOX
+A0F0 ; [.1FA1.0020.0002.A0F0] # YI SYLLABLE VO
+A0F1 ; [.1FA2.0020.0002.A0F1] # YI SYLLABLE VOP
+A0F2 ; [.1FA3.0020.0002.A0F2] # YI SYLLABLE VEX
+A0F3 ; [.1FA4.0020.0002.A0F3] # YI SYLLABLE VEP
+A0F4 ; [.1FA5.0020.0002.A0F4] # YI SYLLABLE VUT
+A0F5 ; [.1FA6.0020.0002.A0F5] # YI SYLLABLE VUX
+A0F6 ; [.1FA7.0020.0002.A0F6] # YI SYLLABLE VU
+A0F7 ; [.1FA8.0020.0002.A0F7] # YI SYLLABLE VUP
+A0F8 ; [.1FA9.0020.0002.A0F8] # YI SYLLABLE VURX
+A0F9 ; [.1FAA.0020.0002.A0F9] # YI SYLLABLE VUR
+A0FA ; [.1FAB.0020.0002.A0FA] # YI SYLLABLE VYT
+A0FB ; [.1FAC.0020.0002.A0FB] # YI SYLLABLE VYX
+A0FC ; [.1FAD.0020.0002.A0FC] # YI SYLLABLE VY
+A0FD ; [.1FAE.0020.0002.A0FD] # YI SYLLABLE VYP
+A0FE ; [.1FAF.0020.0002.A0FE] # YI SYLLABLE VYRX
+A0FF ; [.1FB0.0020.0002.A0FF] # YI SYLLABLE VYR
+A100 ; [.1FB1.0020.0002.A100] # YI SYLLABLE DIT
+A101 ; [.1FB2.0020.0002.A101] # YI SYLLABLE DIX
+A102 ; [.1FB3.0020.0002.A102] # YI SYLLABLE DI
+A103 ; [.1FB4.0020.0002.A103] # YI SYLLABLE DIP
+A104 ; [.1FB5.0020.0002.A104] # YI SYLLABLE DIEX
+A105 ; [.1FB6.0020.0002.A105] # YI SYLLABLE DIE
+A106 ; [.1FB7.0020.0002.A106] # YI SYLLABLE DIEP
+A107 ; [.1FB8.0020.0002.A107] # YI SYLLABLE DAT
+A108 ; [.1FB9.0020.0002.A108] # YI SYLLABLE DAX
+A109 ; [.1FBA.0020.0002.A109] # YI SYLLABLE DA
+A10A ; [.1FBB.0020.0002.A10A] # YI SYLLABLE DAP
+A10B ; [.1FBC.0020.0002.A10B] # YI SYLLABLE DUOX
+A10C ; [.1FBD.0020.0002.A10C] # YI SYLLABLE DUO
+A10D ; [.1FBE.0020.0002.A10D] # YI SYLLABLE DOT
+A10E ; [.1FBF.0020.0002.A10E] # YI SYLLABLE DOX
+A10F ; [.1FC0.0020.0002.A10F] # YI SYLLABLE DO
+A110 ; [.1FC1.0020.0002.A110] # YI SYLLABLE DOP
+A111 ; [.1FC2.0020.0002.A111] # YI SYLLABLE DEX
+A112 ; [.1FC3.0020.0002.A112] # YI SYLLABLE DE
+A113 ; [.1FC4.0020.0002.A113] # YI SYLLABLE DEP
+A114 ; [.1FC5.0020.0002.A114] # YI SYLLABLE DUT
+A115 ; [.1FC6.0020.0002.A115] # YI SYLLABLE DUX
+A116 ; [.1FC7.0020.0002.A116] # YI SYLLABLE DU
+A117 ; [.1FC8.0020.0002.A117] # YI SYLLABLE DUP
+A118 ; [.1FC9.0020.0002.A118] # YI SYLLABLE DURX
+A119 ; [.1FCA.0020.0002.A119] # YI SYLLABLE DUR
+A11A ; [.1FCB.0020.0002.A11A] # YI SYLLABLE TIT
+A11B ; [.1FCC.0020.0002.A11B] # YI SYLLABLE TIX
+A11C ; [.1FCD.0020.0002.A11C] # YI SYLLABLE TI
+A11D ; [.1FCE.0020.0002.A11D] # YI SYLLABLE TIP
+A11E ; [.1FCF.0020.0002.A11E] # YI SYLLABLE TIEX
+A11F ; [.1FD0.0020.0002.A11F] # YI SYLLABLE TIE
+A120 ; [.1FD1.0020.0002.A120] # YI SYLLABLE TIEP
+A121 ; [.1FD2.0020.0002.A121] # YI SYLLABLE TAT
+A122 ; [.1FD3.0020.0002.A122] # YI SYLLABLE TAX
+A123 ; [.1FD4.0020.0002.A123] # YI SYLLABLE TA
+A124 ; [.1FD5.0020.0002.A124] # YI SYLLABLE TAP
+A125 ; [.1FD6.0020.0002.A125] # YI SYLLABLE TUOT
+A126 ; [.1FD7.0020.0002.A126] # YI SYLLABLE TUOX
+A127 ; [.1FD8.0020.0002.A127] # YI SYLLABLE TUO
+A128 ; [.1FD9.0020.0002.A128] # YI SYLLABLE TUOP
+A129 ; [.1FDA.0020.0002.A129] # YI SYLLABLE TOT
+A12A ; [.1FDB.0020.0002.A12A] # YI SYLLABLE TOX
+A12B ; [.1FDC.0020.0002.A12B] # YI SYLLABLE TO
+A12C ; [.1FDD.0020.0002.A12C] # YI SYLLABLE TOP
+A12D ; [.1FDE.0020.0002.A12D] # YI SYLLABLE TEX
+A12E ; [.1FDF.0020.0002.A12E] # YI SYLLABLE TE
+A12F ; [.1FE0.0020.0002.A12F] # YI SYLLABLE TEP
+A130 ; [.1FE1.0020.0002.A130] # YI SYLLABLE TUT
+A131 ; [.1FE2.0020.0002.A131] # YI SYLLABLE TUX
+A132 ; [.1FE3.0020.0002.A132] # YI SYLLABLE TU
+A133 ; [.1FE4.0020.0002.A133] # YI SYLLABLE TUP
+A134 ; [.1FE5.0020.0002.A134] # YI SYLLABLE TURX
+A135 ; [.1FE6.0020.0002.A135] # YI SYLLABLE TUR
+A136 ; [.1FE7.0020.0002.A136] # YI SYLLABLE DDIT
+A137 ; [.1FE8.0020.0002.A137] # YI SYLLABLE DDIX
+A138 ; [.1FE9.0020.0002.A138] # YI SYLLABLE DDI
+A139 ; [.1FEA.0020.0002.A139] # YI SYLLABLE DDIP
+A13A ; [.1FEB.0020.0002.A13A] # YI SYLLABLE DDIEX
+A13B ; [.1FEC.0020.0002.A13B] # YI SYLLABLE DDIE
+A13C ; [.1FED.0020.0002.A13C] # YI SYLLABLE DDIEP
+A13D ; [.1FEE.0020.0002.A13D] # YI SYLLABLE DDAT
+A13E ; [.1FEF.0020.0002.A13E] # YI SYLLABLE DDAX
+A13F ; [.1FF0.0020.0002.A13F] # YI SYLLABLE DDA
+A140 ; [.1FF1.0020.0002.A140] # YI SYLLABLE DDAP
+A141 ; [.1FF2.0020.0002.A141] # YI SYLLABLE DDUOX
+A142 ; [.1FF3.0020.0002.A142] # YI SYLLABLE DDUO
+A143 ; [.1FF4.0020.0002.A143] # YI SYLLABLE DDUOP
+A144 ; [.1FF5.0020.0002.A144] # YI SYLLABLE DDOT
+A145 ; [.1FF6.0020.0002.A145] # YI SYLLABLE DDOX
+A146 ; [.1FF7.0020.0002.A146] # YI SYLLABLE DDO
+A147 ; [.1FF8.0020.0002.A147] # YI SYLLABLE DDOP
+A148 ; [.1FF9.0020.0002.A148] # YI SYLLABLE DDEX
+A149 ; [.1FFA.0020.0002.A149] # YI SYLLABLE DDE
+A14A ; [.1FFB.0020.0002.A14A] # YI SYLLABLE DDEP
+A14B ; [.1FFC.0020.0002.A14B] # YI SYLLABLE DDUT
+A14C ; [.1FFD.0020.0002.A14C] # YI SYLLABLE DDUX
+A14D ; [.1FFE.0020.0002.A14D] # YI SYLLABLE DDU
+A14E ; [.1FFF.0020.0002.A14E] # YI SYLLABLE DDUP
+A14F ; [.2000.0020.0002.A14F] # YI SYLLABLE DDURX
+A150 ; [.2001.0020.0002.A150] # YI SYLLABLE DDUR
+A151 ; [.2002.0020.0002.A151] # YI SYLLABLE NDIT
+A152 ; [.2003.0020.0002.A152] # YI SYLLABLE NDIX
+A153 ; [.2004.0020.0002.A153] # YI SYLLABLE NDI
+A154 ; [.2005.0020.0002.A154] # YI SYLLABLE NDIP
+A155 ; [.2006.0020.0002.A155] # YI SYLLABLE NDIEX
+A156 ; [.2007.0020.0002.A156] # YI SYLLABLE NDIE
+A157 ; [.2008.0020.0002.A157] # YI SYLLABLE NDAT
+A158 ; [.2009.0020.0002.A158] # YI SYLLABLE NDAX
+A159 ; [.200A.0020.0002.A159] # YI SYLLABLE NDA
+A15A ; [.200B.0020.0002.A15A] # YI SYLLABLE NDAP
+A15B ; [.200C.0020.0002.A15B] # YI SYLLABLE NDOT
+A15C ; [.200D.0020.0002.A15C] # YI SYLLABLE NDOX
+A15D ; [.200E.0020.0002.A15D] # YI SYLLABLE NDO
+A15E ; [.200F.0020.0002.A15E] # YI SYLLABLE NDOP
+A15F ; [.2010.0020.0002.A15F] # YI SYLLABLE NDEX
+A160 ; [.2011.0020.0002.A160] # YI SYLLABLE NDE
+A161 ; [.2012.0020.0002.A161] # YI SYLLABLE NDEP
+A162 ; [.2013.0020.0002.A162] # YI SYLLABLE NDUT
+A163 ; [.2014.0020.0002.A163] # YI SYLLABLE NDUX
+A164 ; [.2015.0020.0002.A164] # YI SYLLABLE NDU
+A165 ; [.2016.0020.0002.A165] # YI SYLLABLE NDUP
+A166 ; [.2017.0020.0002.A166] # YI SYLLABLE NDURX
+A167 ; [.2018.0020.0002.A167] # YI SYLLABLE NDUR
+A168 ; [.2019.0020.0002.A168] # YI SYLLABLE HNIT
+A169 ; [.201A.0020.0002.A169] # YI SYLLABLE HNIX
+A16A ; [.201B.0020.0002.A16A] # YI SYLLABLE HNI
+A16B ; [.201C.0020.0002.A16B] # YI SYLLABLE HNIP
+A16C ; [.201D.0020.0002.A16C] # YI SYLLABLE HNIET
+A16D ; [.201E.0020.0002.A16D] # YI SYLLABLE HNIEX
+A16E ; [.201F.0020.0002.A16E] # YI SYLLABLE HNIE
+A16F ; [.2020.0020.0002.A16F] # YI SYLLABLE HNIEP
+A170 ; [.2021.0020.0002.A170] # YI SYLLABLE HNAT
+A171 ; [.2022.0020.0002.A171] # YI SYLLABLE HNAX
+A172 ; [.2023.0020.0002.A172] # YI SYLLABLE HNA
+A173 ; [.2024.0020.0002.A173] # YI SYLLABLE HNAP
+A174 ; [.2025.0020.0002.A174] # YI SYLLABLE HNUOX
+A175 ; [.2026.0020.0002.A175] # YI SYLLABLE HNUO
+A176 ; [.2027.0020.0002.A176] # YI SYLLABLE HNOT
+A177 ; [.2028.0020.0002.A177] # YI SYLLABLE HNOX
+A178 ; [.2029.0020.0002.A178] # YI SYLLABLE HNOP
+A179 ; [.202A.0020.0002.A179] # YI SYLLABLE HNEX
+A17A ; [.202B.0020.0002.A17A] # YI SYLLABLE HNE
+A17B ; [.202C.0020.0002.A17B] # YI SYLLABLE HNEP
+A17C ; [.202D.0020.0002.A17C] # YI SYLLABLE HNUT
+A17D ; [.202E.0020.0002.A17D] # YI SYLLABLE NIT
+A17E ; [.202F.0020.0002.A17E] # YI SYLLABLE NIX
+A17F ; [.2030.0020.0002.A17F] # YI SYLLABLE NI
+A180 ; [.2031.0020.0002.A180] # YI SYLLABLE NIP
+A181 ; [.2032.0020.0002.A181] # YI SYLLABLE NIEX
+A182 ; [.2033.0020.0002.A182] # YI SYLLABLE NIE
+A183 ; [.2034.0020.0002.A183] # YI SYLLABLE NIEP
+A184 ; [.2035.0020.0002.A184] # YI SYLLABLE NAX
+A185 ; [.2036.0020.0002.A185] # YI SYLLABLE NA
+A186 ; [.2037.0020.0002.A186] # YI SYLLABLE NAP
+A187 ; [.2038.0020.0002.A187] # YI SYLLABLE NUOX
+A188 ; [.2039.0020.0002.A188] # YI SYLLABLE NUO
+A189 ; [.203A.0020.0002.A189] # YI SYLLABLE NUOP
+A18A ; [.203B.0020.0002.A18A] # YI SYLLABLE NOT
+A18B ; [.203C.0020.0002.A18B] # YI SYLLABLE NOX
+A18C ; [.203D.0020.0002.A18C] # YI SYLLABLE NO
+A18D ; [.203E.0020.0002.A18D] # YI SYLLABLE NOP
+A18E ; [.203F.0020.0002.A18E] # YI SYLLABLE NEX
+A18F ; [.2040.0020.0002.A18F] # YI SYLLABLE NE
+A190 ; [.2041.0020.0002.A190] # YI SYLLABLE NEP
+A191 ; [.2042.0020.0002.A191] # YI SYLLABLE NUT
+A192 ; [.2043.0020.0002.A192] # YI SYLLABLE NUX
+A193 ; [.2044.0020.0002.A193] # YI SYLLABLE NU
+A194 ; [.2045.0020.0002.A194] # YI SYLLABLE NUP
+A195 ; [.2046.0020.0002.A195] # YI SYLLABLE NURX
+A196 ; [.2047.0020.0002.A196] # YI SYLLABLE NUR
+A197 ; [.2048.0020.0002.A197] # YI SYLLABLE HLIT
+A198 ; [.2049.0020.0002.A198] # YI SYLLABLE HLIX
+A199 ; [.204A.0020.0002.A199] # YI SYLLABLE HLI
+A19A ; [.204B.0020.0002.A19A] # YI SYLLABLE HLIP
+A19B ; [.204C.0020.0002.A19B] # YI SYLLABLE HLIEX
+A19C ; [.204D.0020.0002.A19C] # YI SYLLABLE HLIE
+A19D ; [.204E.0020.0002.A19D] # YI SYLLABLE HLIEP
+A19E ; [.204F.0020.0002.A19E] # YI SYLLABLE HLAT
+A19F ; [.2050.0020.0002.A19F] # YI SYLLABLE HLAX
+A1A0 ; [.2051.0020.0002.A1A0] # YI SYLLABLE HLA
+A1A1 ; [.2052.0020.0002.A1A1] # YI SYLLABLE HLAP
+A1A2 ; [.2053.0020.0002.A1A2] # YI SYLLABLE HLUOX
+A1A3 ; [.2054.0020.0002.A1A3] # YI SYLLABLE HLUO
+A1A4 ; [.2055.0020.0002.A1A4] # YI SYLLABLE HLUOP
+A1A5 ; [.2056.0020.0002.A1A5] # YI SYLLABLE HLOX
+A1A6 ; [.2057.0020.0002.A1A6] # YI SYLLABLE HLO
+A1A7 ; [.2058.0020.0002.A1A7] # YI SYLLABLE HLOP
+A1A8 ; [.2059.0020.0002.A1A8] # YI SYLLABLE HLEX
+A1A9 ; [.205A.0020.0002.A1A9] # YI SYLLABLE HLE
+A1AA ; [.205B.0020.0002.A1AA] # YI SYLLABLE HLEP
+A1AB ; [.205C.0020.0002.A1AB] # YI SYLLABLE HLUT
+A1AC ; [.205D.0020.0002.A1AC] # YI SYLLABLE HLUX
+A1AD ; [.205E.0020.0002.A1AD] # YI SYLLABLE HLU
+A1AE ; [.205F.0020.0002.A1AE] # YI SYLLABLE HLUP
+A1AF ; [.2060.0020.0002.A1AF] # YI SYLLABLE HLURX
+A1B0 ; [.2061.0020.0002.A1B0] # YI SYLLABLE HLUR
+A1B1 ; [.2062.0020.0002.A1B1] # YI SYLLABLE HLYT
+A1B2 ; [.2063.0020.0002.A1B2] # YI SYLLABLE HLYX
+A1B3 ; [.2064.0020.0002.A1B3] # YI SYLLABLE HLY
+A1B4 ; [.2065.0020.0002.A1B4] # YI SYLLABLE HLYP
+A1B5 ; [.2066.0020.0002.A1B5] # YI SYLLABLE HLYRX
+A1B6 ; [.2067.0020.0002.A1B6] # YI SYLLABLE HLYR
+A1B7 ; [.2068.0020.0002.A1B7] # YI SYLLABLE LIT
+A1B8 ; [.2069.0020.0002.A1B8] # YI SYLLABLE LIX
+A1B9 ; [.206A.0020.0002.A1B9] # YI SYLLABLE LI
+A1BA ; [.206B.0020.0002.A1BA] # YI SYLLABLE LIP
+A1BB ; [.206C.0020.0002.A1BB] # YI SYLLABLE LIET
+A1BC ; [.206D.0020.0002.A1BC] # YI SYLLABLE LIEX
+A1BD ; [.206E.0020.0002.A1BD] # YI SYLLABLE LIE
+A1BE ; [.206F.0020.0002.A1BE] # YI SYLLABLE LIEP
+A1BF ; [.2070.0020.0002.A1BF] # YI SYLLABLE LAT
+A1C0 ; [.2071.0020.0002.A1C0] # YI SYLLABLE LAX
+A1C1 ; [.2072.0020.0002.A1C1] # YI SYLLABLE LA
+A1C2 ; [.2073.0020.0002.A1C2] # YI SYLLABLE LAP
+A1C3 ; [.2074.0020.0002.A1C3] # YI SYLLABLE LUOT
+A1C4 ; [.2075.0020.0002.A1C4] # YI SYLLABLE LUOX
+A1C5 ; [.2076.0020.0002.A1C5] # YI SYLLABLE LUO
+A1C6 ; [.2077.0020.0002.A1C6] # YI SYLLABLE LUOP
+A1C7 ; [.2078.0020.0002.A1C7] # YI SYLLABLE LOT
+A1C8 ; [.2079.0020.0002.A1C8] # YI SYLLABLE LOX
+A1C9 ; [.207A.0020.0002.A1C9] # YI SYLLABLE LO
+A1CA ; [.207B.0020.0002.A1CA] # YI SYLLABLE LOP
+A1CB ; [.207C.0020.0002.A1CB] # YI SYLLABLE LEX
+A1CC ; [.207D.0020.0002.A1CC] # YI SYLLABLE LE
+A1CD ; [.207E.0020.0002.A1CD] # YI SYLLABLE LEP
+A1CE ; [.207F.0020.0002.A1CE] # YI SYLLABLE LUT
+A1CF ; [.2080.0020.0002.A1CF] # YI SYLLABLE LUX
+A1D0 ; [.2081.0020.0002.A1D0] # YI SYLLABLE LU
+A1D1 ; [.2082.0020.0002.A1D1] # YI SYLLABLE LUP
+A1D2 ; [.2083.0020.0002.A1D2] # YI SYLLABLE LURX
+A1D3 ; [.2084.0020.0002.A1D3] # YI SYLLABLE LUR
+A1D4 ; [.2085.0020.0002.A1D4] # YI SYLLABLE LYT
+A1D5 ; [.2086.0020.0002.A1D5] # YI SYLLABLE LYX
+A1D6 ; [.2087.0020.0002.A1D6] # YI SYLLABLE LY
+A1D7 ; [.2088.0020.0002.A1D7] # YI SYLLABLE LYP
+A1D8 ; [.2089.0020.0002.A1D8] # YI SYLLABLE LYRX
+A1D9 ; [.208A.0020.0002.A1D9] # YI SYLLABLE LYR
+A1DA ; [.208B.0020.0002.A1DA] # YI SYLLABLE GIT
+A1DB ; [.208C.0020.0002.A1DB] # YI SYLLABLE GIX
+A1DC ; [.208D.0020.0002.A1DC] # YI SYLLABLE GI
+A1DD ; [.208E.0020.0002.A1DD] # YI SYLLABLE GIP
+A1DE ; [.208F.0020.0002.A1DE] # YI SYLLABLE GIET
+A1DF ; [.2090.0020.0002.A1DF] # YI SYLLABLE GIEX
+A1E0 ; [.2091.0020.0002.A1E0] # YI SYLLABLE GIE
+A1E1 ; [.2092.0020.0002.A1E1] # YI SYLLABLE GIEP
+A1E2 ; [.2093.0020.0002.A1E2] # YI SYLLABLE GAT
+A1E3 ; [.2094.0020.0002.A1E3] # YI SYLLABLE GAX
+A1E4 ; [.2095.0020.0002.A1E4] # YI SYLLABLE GA
+A1E5 ; [.2096.0020.0002.A1E5] # YI SYLLABLE GAP
+A1E6 ; [.2097.0020.0002.A1E6] # YI SYLLABLE GUOT
+A1E7 ; [.2098.0020.0002.A1E7] # YI SYLLABLE GUOX
+A1E8 ; [.2099.0020.0002.A1E8] # YI SYLLABLE GUO
+A1E9 ; [.209A.0020.0002.A1E9] # YI SYLLABLE GUOP
+A1EA ; [.209B.0020.0002.A1EA] # YI SYLLABLE GOT
+A1EB ; [.209C.0020.0002.A1EB] # YI SYLLABLE GOX
+A1EC ; [.209D.0020.0002.A1EC] # YI SYLLABLE GO
+A1ED ; [.209E.0020.0002.A1ED] # YI SYLLABLE GOP
+A1EE ; [.209F.0020.0002.A1EE] # YI SYLLABLE GET
+A1EF ; [.20A0.0020.0002.A1EF] # YI SYLLABLE GEX
+A1F0 ; [.20A1.0020.0002.A1F0] # YI SYLLABLE GE
+A1F1 ; [.20A2.0020.0002.A1F1] # YI SYLLABLE GEP
+A1F2 ; [.20A3.0020.0002.A1F2] # YI SYLLABLE GUT
+A1F3 ; [.20A4.0020.0002.A1F3] # YI SYLLABLE GUX
+A1F4 ; [.20A5.0020.0002.A1F4] # YI SYLLABLE GU
+A1F5 ; [.20A6.0020.0002.A1F5] # YI SYLLABLE GUP
+A1F6 ; [.20A7.0020.0002.A1F6] # YI SYLLABLE GURX
+A1F7 ; [.20A8.0020.0002.A1F7] # YI SYLLABLE GUR
+A1F8 ; [.20A9.0020.0002.A1F8] # YI SYLLABLE KIT
+A1F9 ; [.20AA.0020.0002.A1F9] # YI SYLLABLE KIX
+A1FA ; [.20AB.0020.0002.A1FA] # YI SYLLABLE KI
+A1FB ; [.20AC.0020.0002.A1FB] # YI SYLLABLE KIP
+A1FC ; [.20AD.0020.0002.A1FC] # YI SYLLABLE KIEX
+A1FD ; [.20AE.0020.0002.A1FD] # YI SYLLABLE KIE
+A1FE ; [.20AF.0020.0002.A1FE] # YI SYLLABLE KIEP
+A1FF ; [.20B0.0020.0002.A1FF] # YI SYLLABLE KAT
+A200 ; [.20B1.0020.0002.A200] # YI SYLLABLE KAX
+A201 ; [.20B2.0020.0002.A201] # YI SYLLABLE KA
+A202 ; [.20B3.0020.0002.A202] # YI SYLLABLE KAP
+A203 ; [.20B4.0020.0002.A203] # YI SYLLABLE KUOX
+A204 ; [.20B5.0020.0002.A204] # YI SYLLABLE KUO
+A205 ; [.20B6.0020.0002.A205] # YI SYLLABLE KUOP
+A206 ; [.20B7.0020.0002.A206] # YI SYLLABLE KOT
+A207 ; [.20B8.0020.0002.A207] # YI SYLLABLE KOX
+A208 ; [.20B9.0020.0002.A208] # YI SYLLABLE KO
+A209 ; [.20BA.0020.0002.A209] # YI SYLLABLE KOP
+A20A ; [.20BB.0020.0002.A20A] # YI SYLLABLE KET
+A20B ; [.20BC.0020.0002.A20B] # YI SYLLABLE KEX
+A20C ; [.20BD.0020.0002.A20C] # YI SYLLABLE KE
+A20D ; [.20BE.0020.0002.A20D] # YI SYLLABLE KEP
+A20E ; [.20BF.0020.0002.A20E] # YI SYLLABLE KUT
+A20F ; [.20C0.0020.0002.A20F] # YI SYLLABLE KUX
+A210 ; [.20C1.0020.0002.A210] # YI SYLLABLE KU
+A211 ; [.20C2.0020.0002.A211] # YI SYLLABLE KUP
+A212 ; [.20C3.0020.0002.A212] # YI SYLLABLE KURX
+A213 ; [.20C4.0020.0002.A213] # YI SYLLABLE KUR
+A214 ; [.20C5.0020.0002.A214] # YI SYLLABLE GGIT
+A215 ; [.20C6.0020.0002.A215] # YI SYLLABLE GGIX
+A216 ; [.20C7.0020.0002.A216] # YI SYLLABLE GGI
+A217 ; [.20C8.0020.0002.A217] # YI SYLLABLE GGIEX
+A218 ; [.20C9.0020.0002.A218] # YI SYLLABLE GGIE
+A219 ; [.20CA.0020.0002.A219] # YI SYLLABLE GGIEP
+A21A ; [.20CB.0020.0002.A21A] # YI SYLLABLE GGAT
+A21B ; [.20CC.0020.0002.A21B] # YI SYLLABLE GGAX
+A21C ; [.20CD.0020.0002.A21C] # YI SYLLABLE GGA
+A21D ; [.20CE.0020.0002.A21D] # YI SYLLABLE GGAP
+A21E ; [.20CF.0020.0002.A21E] # YI SYLLABLE GGUOT
+A21F ; [.20D0.0020.0002.A21F] # YI SYLLABLE GGUOX
+A220 ; [.20D1.0020.0002.A220] # YI SYLLABLE GGUO
+A221 ; [.20D2.0020.0002.A221] # YI SYLLABLE GGUOP
+A222 ; [.20D3.0020.0002.A222] # YI SYLLABLE GGOT
+A223 ; [.20D4.0020.0002.A223] # YI SYLLABLE GGOX
+A224 ; [.20D5.0020.0002.A224] # YI SYLLABLE GGO
+A225 ; [.20D6.0020.0002.A225] # YI SYLLABLE GGOP
+A226 ; [.20D7.0020.0002.A226] # YI SYLLABLE GGET
+A227 ; [.20D8.0020.0002.A227] # YI SYLLABLE GGEX
+A228 ; [.20D9.0020.0002.A228] # YI SYLLABLE GGE
+A229 ; [.20DA.0020.0002.A229] # YI SYLLABLE GGEP
+A22A ; [.20DB.0020.0002.A22A] # YI SYLLABLE GGUT
+A22B ; [.20DC.0020.0002.A22B] # YI SYLLABLE GGUX
+A22C ; [.20DD.0020.0002.A22C] # YI SYLLABLE GGU
+A22D ; [.20DE.0020.0002.A22D] # YI SYLLABLE GGUP
+A22E ; [.20DF.0020.0002.A22E] # YI SYLLABLE GGURX
+A22F ; [.20E0.0020.0002.A22F] # YI SYLLABLE GGUR
+A230 ; [.20E1.0020.0002.A230] # YI SYLLABLE MGIEX
+A231 ; [.20E2.0020.0002.A231] # YI SYLLABLE MGIE
+A232 ; [.20E3.0020.0002.A232] # YI SYLLABLE MGAT
+A233 ; [.20E4.0020.0002.A233] # YI SYLLABLE MGAX
+A234 ; [.20E5.0020.0002.A234] # YI SYLLABLE MGA
+A235 ; [.20E6.0020.0002.A235] # YI SYLLABLE MGAP
+A236 ; [.20E7.0020.0002.A236] # YI SYLLABLE MGUOX
+A237 ; [.20E8.0020.0002.A237] # YI SYLLABLE MGUO
+A238 ; [.20E9.0020.0002.A238] # YI SYLLABLE MGUOP
+A239 ; [.20EA.0020.0002.A239] # YI SYLLABLE MGOT
+A23A ; [.20EB.0020.0002.A23A] # YI SYLLABLE MGOX
+A23B ; [.20EC.0020.0002.A23B] # YI SYLLABLE MGO
+A23C ; [.20ED.0020.0002.A23C] # YI SYLLABLE MGOP
+A23D ; [.20EE.0020.0002.A23D] # YI SYLLABLE MGEX
+A23E ; [.20EF.0020.0002.A23E] # YI SYLLABLE MGE
+A23F ; [.20F0.0020.0002.A23F] # YI SYLLABLE MGEP
+A240 ; [.20F1.0020.0002.A240] # YI SYLLABLE MGUT
+A241 ; [.20F2.0020.0002.A241] # YI SYLLABLE MGUX
+A242 ; [.20F3.0020.0002.A242] # YI SYLLABLE MGU
+A243 ; [.20F4.0020.0002.A243] # YI SYLLABLE MGUP
+A244 ; [.20F5.0020.0002.A244] # YI SYLLABLE MGURX
+A245 ; [.20F6.0020.0002.A245] # YI SYLLABLE MGUR
+A246 ; [.20F7.0020.0002.A246] # YI SYLLABLE HXIT
+A247 ; [.20F8.0020.0002.A247] # YI SYLLABLE HXIX
+A248 ; [.20F9.0020.0002.A248] # YI SYLLABLE HXI
+A249 ; [.20FA.0020.0002.A249] # YI SYLLABLE HXIP
+A24A ; [.20FB.0020.0002.A24A] # YI SYLLABLE HXIET
+A24B ; [.20FC.0020.0002.A24B] # YI SYLLABLE HXIEX
+A24C ; [.20FD.0020.0002.A24C] # YI SYLLABLE HXIE
+A24D ; [.20FE.0020.0002.A24D] # YI SYLLABLE HXIEP
+A24E ; [.20FF.0020.0002.A24E] # YI SYLLABLE HXAT
+A24F ; [.2100.0020.0002.A24F] # YI SYLLABLE HXAX
+A250 ; [.2101.0020.0002.A250] # YI SYLLABLE HXA
+A251 ; [.2102.0020.0002.A251] # YI SYLLABLE HXAP
+A252 ; [.2103.0020.0002.A252] # YI SYLLABLE HXUOT
+A253 ; [.2104.0020.0002.A253] # YI SYLLABLE HXUOX
+A254 ; [.2105.0020.0002.A254] # YI SYLLABLE HXUO
+A255 ; [.2106.0020.0002.A255] # YI SYLLABLE HXUOP
+A256 ; [.2107.0020.0002.A256] # YI SYLLABLE HXOT
+A257 ; [.2108.0020.0002.A257] # YI SYLLABLE HXOX
+A258 ; [.2109.0020.0002.A258] # YI SYLLABLE HXO
+A259 ; [.210A.0020.0002.A259] # YI SYLLABLE HXOP
+A25A ; [.210B.0020.0002.A25A] # YI SYLLABLE HXEX
+A25B ; [.210C.0020.0002.A25B] # YI SYLLABLE HXE
+A25C ; [.210D.0020.0002.A25C] # YI SYLLABLE HXEP
+A25D ; [.210E.0020.0002.A25D] # YI SYLLABLE NGIEX
+A25E ; [.210F.0020.0002.A25E] # YI SYLLABLE NGIE
+A25F ; [.2110.0020.0002.A25F] # YI SYLLABLE NGIEP
+A260 ; [.2111.0020.0002.A260] # YI SYLLABLE NGAT
+A261 ; [.2112.0020.0002.A261] # YI SYLLABLE NGAX
+A262 ; [.2113.0020.0002.A262] # YI SYLLABLE NGA
+A263 ; [.2114.0020.0002.A263] # YI SYLLABLE NGAP
+A264 ; [.2115.0020.0002.A264] # YI SYLLABLE NGUOT
+A265 ; [.2116.0020.0002.A265] # YI SYLLABLE NGUOX
+A266 ; [.2117.0020.0002.A266] # YI SYLLABLE NGUO
+A267 ; [.2118.0020.0002.A267] # YI SYLLABLE NGOT
+A268 ; [.2119.0020.0002.A268] # YI SYLLABLE NGOX
+A269 ; [.211A.0020.0002.A269] # YI SYLLABLE NGO
+A26A ; [.211B.0020.0002.A26A] # YI SYLLABLE NGOP
+A26B ; [.211C.0020.0002.A26B] # YI SYLLABLE NGEX
+A26C ; [.211D.0020.0002.A26C] # YI SYLLABLE NGE
+A26D ; [.211E.0020.0002.A26D] # YI SYLLABLE NGEP
+A26E ; [.211F.0020.0002.A26E] # YI SYLLABLE HIT
+A26F ; [.2120.0020.0002.A26F] # YI SYLLABLE HIEX
+A270 ; [.2121.0020.0002.A270] # YI SYLLABLE HIE
+A271 ; [.2122.0020.0002.A271] # YI SYLLABLE HAT
+A272 ; [.2123.0020.0002.A272] # YI SYLLABLE HAX
+A273 ; [.2124.0020.0002.A273] # YI SYLLABLE HA
+A274 ; [.2125.0020.0002.A274] # YI SYLLABLE HAP
+A275 ; [.2126.0020.0002.A275] # YI SYLLABLE HUOT
+A276 ; [.2127.0020.0002.A276] # YI SYLLABLE HUOX
+A277 ; [.2128.0020.0002.A277] # YI SYLLABLE HUO
+A278 ; [.2129.0020.0002.A278] # YI SYLLABLE HUOP
+A279 ; [.212A.0020.0002.A279] # YI SYLLABLE HOT
+A27A ; [.212B.0020.0002.A27A] # YI SYLLABLE HOX
+A27B ; [.212C.0020.0002.A27B] # YI SYLLABLE HO
+A27C ; [.212D.0020.0002.A27C] # YI SYLLABLE HOP
+A27D ; [.212E.0020.0002.A27D] # YI SYLLABLE HEX
+A27E ; [.212F.0020.0002.A27E] # YI SYLLABLE HE
+A27F ; [.2130.0020.0002.A27F] # YI SYLLABLE HEP
+A280 ; [.2131.0020.0002.A280] # YI SYLLABLE WAT
+A281 ; [.2132.0020.0002.A281] # YI SYLLABLE WAX
+A282 ; [.2133.0020.0002.A282] # YI SYLLABLE WA
+A283 ; [.2134.0020.0002.A283] # YI SYLLABLE WAP
+A284 ; [.2135.0020.0002.A284] # YI SYLLABLE WUOX
+A285 ; [.2136.0020.0002.A285] # YI SYLLABLE WUO
+A286 ; [.2137.0020.0002.A286] # YI SYLLABLE WUOP
+A287 ; [.2138.0020.0002.A287] # YI SYLLABLE WOX
+A288 ; [.2139.0020.0002.A288] # YI SYLLABLE WO
+A289 ; [.213A.0020.0002.A289] # YI SYLLABLE WOP
+A28A ; [.213B.0020.0002.A28A] # YI SYLLABLE WEX
+A28B ; [.213C.0020.0002.A28B] # YI SYLLABLE WE
+A28C ; [.213D.0020.0002.A28C] # YI SYLLABLE WEP
+A28D ; [.213E.0020.0002.A28D] # YI SYLLABLE ZIT
+A28E ; [.213F.0020.0002.A28E] # YI SYLLABLE ZIX
+A28F ; [.2140.0020.0002.A28F] # YI SYLLABLE ZI
+A290 ; [.2141.0020.0002.A290] # YI SYLLABLE ZIP
+A291 ; [.2142.0020.0002.A291] # YI SYLLABLE ZIEX
+A292 ; [.2143.0020.0002.A292] # YI SYLLABLE ZIE
+A293 ; [.2144.0020.0002.A293] # YI SYLLABLE ZIEP
+A294 ; [.2145.0020.0002.A294] # YI SYLLABLE ZAT
+A295 ; [.2146.0020.0002.A295] # YI SYLLABLE ZAX
+A296 ; [.2147.0020.0002.A296] # YI SYLLABLE ZA
+A297 ; [.2148.0020.0002.A297] # YI SYLLABLE ZAP
+A298 ; [.2149.0020.0002.A298] # YI SYLLABLE ZUOX
+A299 ; [.214A.0020.0002.A299] # YI SYLLABLE ZUO
+A29A ; [.214B.0020.0002.A29A] # YI SYLLABLE ZUOP
+A29B ; [.214C.0020.0002.A29B] # YI SYLLABLE ZOT
+A29C ; [.214D.0020.0002.A29C] # YI SYLLABLE ZOX
+A29D ; [.214E.0020.0002.A29D] # YI SYLLABLE ZO
+A29E ; [.214F.0020.0002.A29E] # YI SYLLABLE ZOP
+A29F ; [.2150.0020.0002.A29F] # YI SYLLABLE ZEX
+A2A0 ; [.2151.0020.0002.A2A0] # YI SYLLABLE ZE
+A2A1 ; [.2152.0020.0002.A2A1] # YI SYLLABLE ZEP
+A2A2 ; [.2153.0020.0002.A2A2] # YI SYLLABLE ZUT
+A2A3 ; [.2154.0020.0002.A2A3] # YI SYLLABLE ZUX
+A2A4 ; [.2155.0020.0002.A2A4] # YI SYLLABLE ZU
+A2A5 ; [.2156.0020.0002.A2A5] # YI SYLLABLE ZUP
+A2A6 ; [.2157.0020.0002.A2A6] # YI SYLLABLE ZURX
+A2A7 ; [.2158.0020.0002.A2A7] # YI SYLLABLE ZUR
+A2A8 ; [.2159.0020.0002.A2A8] # YI SYLLABLE ZYT
+A2A9 ; [.215A.0020.0002.A2A9] # YI SYLLABLE ZYX
+A2AA ; [.215B.0020.0002.A2AA] # YI SYLLABLE ZY
+A2AB ; [.215C.0020.0002.A2AB] # YI SYLLABLE ZYP
+A2AC ; [.215D.0020.0002.A2AC] # YI SYLLABLE ZYRX
+A2AD ; [.215E.0020.0002.A2AD] # YI SYLLABLE ZYR
+A2AE ; [.215F.0020.0002.A2AE] # YI SYLLABLE CIT
+A2AF ; [.2160.0020.0002.A2AF] # YI SYLLABLE CIX
+A2B0 ; [.2161.0020.0002.A2B0] # YI SYLLABLE CI
+A2B1 ; [.2162.0020.0002.A2B1] # YI SYLLABLE CIP
+A2B2 ; [.2163.0020.0002.A2B2] # YI SYLLABLE CIET
+A2B3 ; [.2164.0020.0002.A2B3] # YI SYLLABLE CIEX
+A2B4 ; [.2165.0020.0002.A2B4] # YI SYLLABLE CIE
+A2B5 ; [.2166.0020.0002.A2B5] # YI SYLLABLE CIEP
+A2B6 ; [.2167.0020.0002.A2B6] # YI SYLLABLE CAT
+A2B7 ; [.2168.0020.0002.A2B7] # YI SYLLABLE CAX
+A2B8 ; [.2169.0020.0002.A2B8] # YI SYLLABLE CA
+A2B9 ; [.216A.0020.0002.A2B9] # YI SYLLABLE CAP
+A2BA ; [.216B.0020.0002.A2BA] # YI SYLLABLE CUOX
+A2BB ; [.216C.0020.0002.A2BB] # YI SYLLABLE CUO
+A2BC ; [.216D.0020.0002.A2BC] # YI SYLLABLE CUOP
+A2BD ; [.216E.0020.0002.A2BD] # YI SYLLABLE COT
+A2BE ; [.216F.0020.0002.A2BE] # YI SYLLABLE COX
+A2BF ; [.2170.0020.0002.A2BF] # YI SYLLABLE CO
+A2C0 ; [.2171.0020.0002.A2C0] # YI SYLLABLE COP
+A2C1 ; [.2172.0020.0002.A2C1] # YI SYLLABLE CEX
+A2C2 ; [.2173.0020.0002.A2C2] # YI SYLLABLE CE
+A2C3 ; [.2174.0020.0002.A2C3] # YI SYLLABLE CEP
+A2C4 ; [.2175.0020.0002.A2C4] # YI SYLLABLE CUT
+A2C5 ; [.2176.0020.0002.A2C5] # YI SYLLABLE CUX
+A2C6 ; [.2177.0020.0002.A2C6] # YI SYLLABLE CU
+A2C7 ; [.2178.0020.0002.A2C7] # YI SYLLABLE CUP
+A2C8 ; [.2179.0020.0002.A2C8] # YI SYLLABLE CURX
+A2C9 ; [.217A.0020.0002.A2C9] # YI SYLLABLE CUR
+A2CA ; [.217B.0020.0002.A2CA] # YI SYLLABLE CYT
+A2CB ; [.217C.0020.0002.A2CB] # YI SYLLABLE CYX
+A2CC ; [.217D.0020.0002.A2CC] # YI SYLLABLE CY
+A2CD ; [.217E.0020.0002.A2CD] # YI SYLLABLE CYP
+A2CE ; [.217F.0020.0002.A2CE] # YI SYLLABLE CYRX
+A2CF ; [.2180.0020.0002.A2CF] # YI SYLLABLE CYR
+A2D0 ; [.2181.0020.0002.A2D0] # YI SYLLABLE ZZIT
+A2D1 ; [.2182.0020.0002.A2D1] # YI SYLLABLE ZZIX
+A2D2 ; [.2183.0020.0002.A2D2] # YI SYLLABLE ZZI
+A2D3 ; [.2184.0020.0002.A2D3] # YI SYLLABLE ZZIP
+A2D4 ; [.2185.0020.0002.A2D4] # YI SYLLABLE ZZIET
+A2D5 ; [.2186.0020.0002.A2D5] # YI SYLLABLE ZZIEX
+A2D6 ; [.2187.0020.0002.A2D6] # YI SYLLABLE ZZIE
+A2D7 ; [.2188.0020.0002.A2D7] # YI SYLLABLE ZZIEP
+A2D8 ; [.2189.0020.0002.A2D8] # YI SYLLABLE ZZAT
+A2D9 ; [.218A.0020.0002.A2D9] # YI SYLLABLE ZZAX
+A2DA ; [.218B.0020.0002.A2DA] # YI SYLLABLE ZZA
+A2DB ; [.218C.0020.0002.A2DB] # YI SYLLABLE ZZAP
+A2DC ; [.218D.0020.0002.A2DC] # YI SYLLABLE ZZOX
+A2DD ; [.218E.0020.0002.A2DD] # YI SYLLABLE ZZO
+A2DE ; [.218F.0020.0002.A2DE] # YI SYLLABLE ZZOP
+A2DF ; [.2190.0020.0002.A2DF] # YI SYLLABLE ZZEX
+A2E0 ; [.2191.0020.0002.A2E0] # YI SYLLABLE ZZE
+A2E1 ; [.2192.0020.0002.A2E1] # YI SYLLABLE ZZEP
+A2E2 ; [.2193.0020.0002.A2E2] # YI SYLLABLE ZZUX
+A2E3 ; [.2194.0020.0002.A2E3] # YI SYLLABLE ZZU
+A2E4 ; [.2195.0020.0002.A2E4] # YI SYLLABLE ZZUP
+A2E5 ; [.2196.0020.0002.A2E5] # YI SYLLABLE ZZURX
+A2E6 ; [.2197.0020.0002.A2E6] # YI SYLLABLE ZZUR
+A2E7 ; [.2198.0020.0002.A2E7] # YI SYLLABLE ZZYT
+A2E8 ; [.2199.0020.0002.A2E8] # YI SYLLABLE ZZYX
+A2E9 ; [.219A.0020.0002.A2E9] # YI SYLLABLE ZZY
+A2EA ; [.219B.0020.0002.A2EA] # YI SYLLABLE ZZYP
+A2EB ; [.219C.0020.0002.A2EB] # YI SYLLABLE ZZYRX
+A2EC ; [.219D.0020.0002.A2EC] # YI SYLLABLE ZZYR
+A2ED ; [.219E.0020.0002.A2ED] # YI SYLLABLE NZIT
+A2EE ; [.219F.0020.0002.A2EE] # YI SYLLABLE NZIX
+A2EF ; [.21A0.0020.0002.A2EF] # YI SYLLABLE NZI
+A2F0 ; [.21A1.0020.0002.A2F0] # YI SYLLABLE NZIP
+A2F1 ; [.21A2.0020.0002.A2F1] # YI SYLLABLE NZIEX
+A2F2 ; [.21A3.0020.0002.A2F2] # YI SYLLABLE NZIE
+A2F3 ; [.21A4.0020.0002.A2F3] # YI SYLLABLE NZIEP
+A2F4 ; [.21A5.0020.0002.A2F4] # YI SYLLABLE NZAT
+A2F5 ; [.21A6.0020.0002.A2F5] # YI SYLLABLE NZAX
+A2F6 ; [.21A7.0020.0002.A2F6] # YI SYLLABLE NZA
+A2F7 ; [.21A8.0020.0002.A2F7] # YI SYLLABLE NZAP
+A2F8 ; [.21A9.0020.0002.A2F8] # YI SYLLABLE NZUOX
+A2F9 ; [.21AA.0020.0002.A2F9] # YI SYLLABLE NZUO
+A2FA ; [.21AB.0020.0002.A2FA] # YI SYLLABLE NZOX
+A2FB ; [.21AC.0020.0002.A2FB] # YI SYLLABLE NZOP
+A2FC ; [.21AD.0020.0002.A2FC] # YI SYLLABLE NZEX
+A2FD ; [.21AE.0020.0002.A2FD] # YI SYLLABLE NZE
+A2FE ; [.21AF.0020.0002.A2FE] # YI SYLLABLE NZUX
+A2FF ; [.21B0.0020.0002.A2FF] # YI SYLLABLE NZU
+A300 ; [.21B1.0020.0002.A300] # YI SYLLABLE NZUP
+A301 ; [.21B2.0020.0002.A301] # YI SYLLABLE NZURX
+A302 ; [.21B3.0020.0002.A302] # YI SYLLABLE NZUR
+A303 ; [.21B4.0020.0002.A303] # YI SYLLABLE NZYT
+A304 ; [.21B5.0020.0002.A304] # YI SYLLABLE NZYX
+A305 ; [.21B6.0020.0002.A305] # YI SYLLABLE NZY
+A306 ; [.21B7.0020.0002.A306] # YI SYLLABLE NZYP
+A307 ; [.21B8.0020.0002.A307] # YI SYLLABLE NZYRX
+A308 ; [.21B9.0020.0002.A308] # YI SYLLABLE NZYR
+A309 ; [.21BA.0020.0002.A309] # YI SYLLABLE SIT
+A30A ; [.21BB.0020.0002.A30A] # YI SYLLABLE SIX
+A30B ; [.21BC.0020.0002.A30B] # YI SYLLABLE SI
+A30C ; [.21BD.0020.0002.A30C] # YI SYLLABLE SIP
+A30D ; [.21BE.0020.0002.A30D] # YI SYLLABLE SIEX
+A30E ; [.21BF.0020.0002.A30E] # YI SYLLABLE SIE
+A30F ; [.21C0.0020.0002.A30F] # YI SYLLABLE SIEP
+A310 ; [.21C1.0020.0002.A310] # YI SYLLABLE SAT
+A311 ; [.21C2.0020.0002.A311] # YI SYLLABLE SAX
+A312 ; [.21C3.0020.0002.A312] # YI SYLLABLE SA
+A313 ; [.21C4.0020.0002.A313] # YI SYLLABLE SAP
+A314 ; [.21C5.0020.0002.A314] # YI SYLLABLE SUOX
+A315 ; [.21C6.0020.0002.A315] # YI SYLLABLE SUO
+A316 ; [.21C7.0020.0002.A316] # YI SYLLABLE SUOP
+A317 ; [.21C8.0020.0002.A317] # YI SYLLABLE SOT
+A318 ; [.21C9.0020.0002.A318] # YI SYLLABLE SOX
+A319 ; [.21CA.0020.0002.A319] # YI SYLLABLE SO
+A31A ; [.21CB.0020.0002.A31A] # YI SYLLABLE SOP
+A31B ; [.21CC.0020.0002.A31B] # YI SYLLABLE SEX
+A31C ; [.21CD.0020.0002.A31C] # YI SYLLABLE SE
+A31D ; [.21CE.0020.0002.A31D] # YI SYLLABLE SEP
+A31E ; [.21CF.0020.0002.A31E] # YI SYLLABLE SUT
+A31F ; [.21D0.0020.0002.A31F] # YI SYLLABLE SUX
+A320 ; [.21D1.0020.0002.A320] # YI SYLLABLE SU
+A321 ; [.21D2.0020.0002.A321] # YI SYLLABLE SUP
+A322 ; [.21D3.0020.0002.A322] # YI SYLLABLE SURX
+A323 ; [.21D4.0020.0002.A323] # YI SYLLABLE SUR
+A324 ; [.21D5.0020.0002.A324] # YI SYLLABLE SYT
+A325 ; [.21D6.0020.0002.A325] # YI SYLLABLE SYX
+A326 ; [.21D7.0020.0002.A326] # YI SYLLABLE SY
+A327 ; [.21D8.0020.0002.A327] # YI SYLLABLE SYP
+A328 ; [.21D9.0020.0002.A328] # YI SYLLABLE SYRX
+A329 ; [.21DA.0020.0002.A329] # YI SYLLABLE SYR
+A32A ; [.21DB.0020.0002.A32A] # YI SYLLABLE SSIT
+A32B ; [.21DC.0020.0002.A32B] # YI SYLLABLE SSIX
+A32C ; [.21DD.0020.0002.A32C] # YI SYLLABLE SSI
+A32D ; [.21DE.0020.0002.A32D] # YI SYLLABLE SSIP
+A32E ; [.21DF.0020.0002.A32E] # YI SYLLABLE SSIEX
+A32F ; [.21E0.0020.0002.A32F] # YI SYLLABLE SSIE
+A330 ; [.21E1.0020.0002.A330] # YI SYLLABLE SSIEP
+A331 ; [.21E2.0020.0002.A331] # YI SYLLABLE SSAT
+A332 ; [.21E3.0020.0002.A332] # YI SYLLABLE SSAX
+A333 ; [.21E4.0020.0002.A333] # YI SYLLABLE SSA
+A334 ; [.21E5.0020.0002.A334] # YI SYLLABLE SSAP
+A335 ; [.21E6.0020.0002.A335] # YI SYLLABLE SSOT
+A336 ; [.21E7.0020.0002.A336] # YI SYLLABLE SSOX
+A337 ; [.21E8.0020.0002.A337] # YI SYLLABLE SSO
+A338 ; [.21E9.0020.0002.A338] # YI SYLLABLE SSOP
+A339 ; [.21EA.0020.0002.A339] # YI SYLLABLE SSEX
+A33A ; [.21EB.0020.0002.A33A] # YI SYLLABLE SSE
+A33B ; [.21EC.0020.0002.A33B] # YI SYLLABLE SSEP
+A33C ; [.21ED.0020.0002.A33C] # YI SYLLABLE SSUT
+A33D ; [.21EE.0020.0002.A33D] # YI SYLLABLE SSUX
+A33E ; [.21EF.0020.0002.A33E] # YI SYLLABLE SSU
+A33F ; [.21F0.0020.0002.A33F] # YI SYLLABLE SSUP
+A340 ; [.21F1.0020.0002.A340] # YI SYLLABLE SSYT
+A341 ; [.21F2.0020.0002.A341] # YI SYLLABLE SSYX
+A342 ; [.21F3.0020.0002.A342] # YI SYLLABLE SSY
+A343 ; [.21F4.0020.0002.A343] # YI SYLLABLE SSYP
+A344 ; [.21F5.0020.0002.A344] # YI SYLLABLE SSYRX
+A345 ; [.21F6.0020.0002.A345] # YI SYLLABLE SSYR
+A346 ; [.21F7.0020.0002.A346] # YI SYLLABLE ZHAT
+A347 ; [.21F8.0020.0002.A347] # YI SYLLABLE ZHAX
+A348 ; [.21F9.0020.0002.A348] # YI SYLLABLE ZHA
+A349 ; [.21FA.0020.0002.A349] # YI SYLLABLE ZHAP
+A34A ; [.21FB.0020.0002.A34A] # YI SYLLABLE ZHUOX
+A34B ; [.21FC.0020.0002.A34B] # YI SYLLABLE ZHUO
+A34C ; [.21FD.0020.0002.A34C] # YI SYLLABLE ZHUOP
+A34D ; [.21FE.0020.0002.A34D] # YI SYLLABLE ZHOT
+A34E ; [.21FF.0020.0002.A34E] # YI SYLLABLE ZHOX
+A34F ; [.2200.0020.0002.A34F] # YI SYLLABLE ZHO
+A350 ; [.2201.0020.0002.A350] # YI SYLLABLE ZHOP
+A351 ; [.2202.0020.0002.A351] # YI SYLLABLE ZHET
+A352 ; [.2203.0020.0002.A352] # YI SYLLABLE ZHEX
+A353 ; [.2204.0020.0002.A353] # YI SYLLABLE ZHE
+A354 ; [.2205.0020.0002.A354] # YI SYLLABLE ZHEP
+A355 ; [.2206.0020.0002.A355] # YI SYLLABLE ZHUT
+A356 ; [.2207.0020.0002.A356] # YI SYLLABLE ZHUX
+A357 ; [.2208.0020.0002.A357] # YI SYLLABLE ZHU
+A358 ; [.2209.0020.0002.A358] # YI SYLLABLE ZHUP
+A359 ; [.220A.0020.0002.A359] # YI SYLLABLE ZHURX
+A35A ; [.220B.0020.0002.A35A] # YI SYLLABLE ZHUR
+A35B ; [.220C.0020.0002.A35B] # YI SYLLABLE ZHYT
+A35C ; [.220D.0020.0002.A35C] # YI SYLLABLE ZHYX
+A35D ; [.220E.0020.0002.A35D] # YI SYLLABLE ZHY
+A35E ; [.220F.0020.0002.A35E] # YI SYLLABLE ZHYP
+A35F ; [.2210.0020.0002.A35F] # YI SYLLABLE ZHYRX
+A360 ; [.2211.0020.0002.A360] # YI SYLLABLE ZHYR
+A361 ; [.2212.0020.0002.A361] # YI SYLLABLE CHAT
+A362 ; [.2213.0020.0002.A362] # YI SYLLABLE CHAX
+A363 ; [.2214.0020.0002.A363] # YI SYLLABLE CHA
+A364 ; [.2215.0020.0002.A364] # YI SYLLABLE CHAP
+A365 ; [.2216.0020.0002.A365] # YI SYLLABLE CHUOT
+A366 ; [.2217.0020.0002.A366] # YI SYLLABLE CHUOX
+A367 ; [.2218.0020.0002.A367] # YI SYLLABLE CHUO
+A368 ; [.2219.0020.0002.A368] # YI SYLLABLE CHUOP
+A369 ; [.221A.0020.0002.A369] # YI SYLLABLE CHOT
+A36A ; [.221B.0020.0002.A36A] # YI SYLLABLE CHOX
+A36B ; [.221C.0020.0002.A36B] # YI SYLLABLE CHO
+A36C ; [.221D.0020.0002.A36C] # YI SYLLABLE CHOP
+A36D ; [.221E.0020.0002.A36D] # YI SYLLABLE CHET
+A36E ; [.221F.0020.0002.A36E] # YI SYLLABLE CHEX
+A36F ; [.2220.0020.0002.A36F] # YI SYLLABLE CHE
+A370 ; [.2221.0020.0002.A370] # YI SYLLABLE CHEP
+A371 ; [.2222.0020.0002.A371] # YI SYLLABLE CHUX
+A372 ; [.2223.0020.0002.A372] # YI SYLLABLE CHU
+A373 ; [.2224.0020.0002.A373] # YI SYLLABLE CHUP
+A374 ; [.2225.0020.0002.A374] # YI SYLLABLE CHURX
+A375 ; [.2226.0020.0002.A375] # YI SYLLABLE CHUR
+A376 ; [.2227.0020.0002.A376] # YI SYLLABLE CHYT
+A377 ; [.2228.0020.0002.A377] # YI SYLLABLE CHYX
+A378 ; [.2229.0020.0002.A378] # YI SYLLABLE CHY
+A379 ; [.222A.0020.0002.A379] # YI SYLLABLE CHYP
+A37A ; [.222B.0020.0002.A37A] # YI SYLLABLE CHYRX
+A37B ; [.222C.0020.0002.A37B] # YI SYLLABLE CHYR
+A37C ; [.222D.0020.0002.A37C] # YI SYLLABLE RRAX
+A37D ; [.222E.0020.0002.A37D] # YI SYLLABLE RRA
+A37E ; [.222F.0020.0002.A37E] # YI SYLLABLE RRUOX
+A37F ; [.2230.0020.0002.A37F] # YI SYLLABLE RRUO
+A380 ; [.2231.0020.0002.A380] # YI SYLLABLE RROT
+A381 ; [.2232.0020.0002.A381] # YI SYLLABLE RROX
+A382 ; [.2233.0020.0002.A382] # YI SYLLABLE RRO
+A383 ; [.2234.0020.0002.A383] # YI SYLLABLE RROP
+A384 ; [.2235.0020.0002.A384] # YI SYLLABLE RRET
+A385 ; [.2236.0020.0002.A385] # YI SYLLABLE RREX
+A386 ; [.2237.0020.0002.A386] # YI SYLLABLE RRE
+A387 ; [.2238.0020.0002.A387] # YI SYLLABLE RREP
+A388 ; [.2239.0020.0002.A388] # YI SYLLABLE RRUT
+A389 ; [.223A.0020.0002.A389] # YI SYLLABLE RRUX
+A38A ; [.223B.0020.0002.A38A] # YI SYLLABLE RRU
+A38B ; [.223C.0020.0002.A38B] # YI SYLLABLE RRUP
+A38C ; [.223D.0020.0002.A38C] # YI SYLLABLE RRURX
+A38D ; [.223E.0020.0002.A38D] # YI SYLLABLE RRUR
+A38E ; [.223F.0020.0002.A38E] # YI SYLLABLE RRYT
+A38F ; [.2240.0020.0002.A38F] # YI SYLLABLE RRYX
+A390 ; [.2241.0020.0002.A390] # YI SYLLABLE RRY
+A391 ; [.2242.0020.0002.A391] # YI SYLLABLE RRYP
+A392 ; [.2243.0020.0002.A392] # YI SYLLABLE RRYRX
+A393 ; [.2244.0020.0002.A393] # YI SYLLABLE RRYR
+A394 ; [.2245.0020.0002.A394] # YI SYLLABLE NRAT
+A395 ; [.2246.0020.0002.A395] # YI SYLLABLE NRAX
+A396 ; [.2247.0020.0002.A396] # YI SYLLABLE NRA
+A397 ; [.2248.0020.0002.A397] # YI SYLLABLE NRAP
+A398 ; [.2249.0020.0002.A398] # YI SYLLABLE NROX
+A399 ; [.224A.0020.0002.A399] # YI SYLLABLE NRO
+A39A ; [.224B.0020.0002.A39A] # YI SYLLABLE NROP
+A39B ; [.224C.0020.0002.A39B] # YI SYLLABLE NRET
+A39C ; [.224D.0020.0002.A39C] # YI SYLLABLE NREX
+A39D ; [.224E.0020.0002.A39D] # YI SYLLABLE NRE
+A39E ; [.224F.0020.0002.A39E] # YI SYLLABLE NREP
+A39F ; [.2250.0020.0002.A39F] # YI SYLLABLE NRUT
+A3A0 ; [.2251.0020.0002.A3A0] # YI SYLLABLE NRUX
+A3A1 ; [.2252.0020.0002.A3A1] # YI SYLLABLE NRU
+A3A2 ; [.2253.0020.0002.A3A2] # YI SYLLABLE NRUP
+A3A3 ; [.2254.0020.0002.A3A3] # YI SYLLABLE NRURX
+A3A4 ; [.2255.0020.0002.A3A4] # YI SYLLABLE NRUR
+A3A5 ; [.2256.0020.0002.A3A5] # YI SYLLABLE NRYT
+A3A6 ; [.2257.0020.0002.A3A6] # YI SYLLABLE NRYX
+A3A7 ; [.2258.0020.0002.A3A7] # YI SYLLABLE NRY
+A3A8 ; [.2259.0020.0002.A3A8] # YI SYLLABLE NRYP
+A3A9 ; [.225A.0020.0002.A3A9] # YI SYLLABLE NRYRX
+A3AA ; [.225B.0020.0002.A3AA] # YI SYLLABLE NRYR
+A3AB ; [.225C.0020.0002.A3AB] # YI SYLLABLE SHAT
+A3AC ; [.225D.0020.0002.A3AC] # YI SYLLABLE SHAX
+A3AD ; [.225E.0020.0002.A3AD] # YI SYLLABLE SHA
+A3AE ; [.225F.0020.0002.A3AE] # YI SYLLABLE SHAP
+A3AF ; [.2260.0020.0002.A3AF] # YI SYLLABLE SHUOX
+A3B0 ; [.2261.0020.0002.A3B0] # YI SYLLABLE SHUO
+A3B1 ; [.2262.0020.0002.A3B1] # YI SYLLABLE SHUOP
+A3B2 ; [.2263.0020.0002.A3B2] # YI SYLLABLE SHOT
+A3B3 ; [.2264.0020.0002.A3B3] # YI SYLLABLE SHOX
+A3B4 ; [.2265.0020.0002.A3B4] # YI SYLLABLE SHO
+A3B5 ; [.2266.0020.0002.A3B5] # YI SYLLABLE SHOP
+A3B6 ; [.2267.0020.0002.A3B6] # YI SYLLABLE SHET
+A3B7 ; [.2268.0020.0002.A3B7] # YI SYLLABLE SHEX
+A3B8 ; [.2269.0020.0002.A3B8] # YI SYLLABLE SHE
+A3B9 ; [.226A.0020.0002.A3B9] # YI SYLLABLE SHEP
+A3BA ; [.226B.0020.0002.A3BA] # YI SYLLABLE SHUT
+A3BB ; [.226C.0020.0002.A3BB] # YI SYLLABLE SHUX
+A3BC ; [.226D.0020.0002.A3BC] # YI SYLLABLE SHU
+A3BD ; [.226E.0020.0002.A3BD] # YI SYLLABLE SHUP
+A3BE ; [.226F.0020.0002.A3BE] # YI SYLLABLE SHURX
+A3BF ; [.2270.0020.0002.A3BF] # YI SYLLABLE SHUR
+A3C0 ; [.2271.0020.0002.A3C0] # YI SYLLABLE SHYT
+A3C1 ; [.2272.0020.0002.A3C1] # YI SYLLABLE SHYX
+A3C2 ; [.2273.0020.0002.A3C2] # YI SYLLABLE SHY
+A3C3 ; [.2274.0020.0002.A3C3] # YI SYLLABLE SHYP
+A3C4 ; [.2275.0020.0002.A3C4] # YI SYLLABLE SHYRX
+A3C5 ; [.2276.0020.0002.A3C5] # YI SYLLABLE SHYR
+A3C6 ; [.2277.0020.0002.A3C6] # YI SYLLABLE RAT
+A3C7 ; [.2278.0020.0002.A3C7] # YI SYLLABLE RAX
+A3C8 ; [.2279.0020.0002.A3C8] # YI SYLLABLE RA
+A3C9 ; [.227A.0020.0002.A3C9] # YI SYLLABLE RAP
+A3CA ; [.227B.0020.0002.A3CA] # YI SYLLABLE RUOX
+A3CB ; [.227C.0020.0002.A3CB] # YI SYLLABLE RUO
+A3CC ; [.227D.0020.0002.A3CC] # YI SYLLABLE RUOP
+A3CD ; [.227E.0020.0002.A3CD] # YI SYLLABLE ROT
+A3CE ; [.227F.0020.0002.A3CE] # YI SYLLABLE ROX
+A3CF ; [.2280.0020.0002.A3CF] # YI SYLLABLE RO
+A3D0 ; [.2281.0020.0002.A3D0] # YI SYLLABLE ROP
+A3D1 ; [.2282.0020.0002.A3D1] # YI SYLLABLE REX
+A3D2 ; [.2283.0020.0002.A3D2] # YI SYLLABLE RE
+A3D3 ; [.2284.0020.0002.A3D3] # YI SYLLABLE REP
+A3D4 ; [.2285.0020.0002.A3D4] # YI SYLLABLE RUT
+A3D5 ; [.2286.0020.0002.A3D5] # YI SYLLABLE RUX
+A3D6 ; [.2287.0020.0002.A3D6] # YI SYLLABLE RU
+A3D7 ; [.2288.0020.0002.A3D7] # YI SYLLABLE RUP
+A3D8 ; [.2289.0020.0002.A3D8] # YI SYLLABLE RURX
+A3D9 ; [.228A.0020.0002.A3D9] # YI SYLLABLE RUR
+A3DA ; [.228B.0020.0002.A3DA] # YI SYLLABLE RYT
+A3DB ; [.228C.0020.0002.A3DB] # YI SYLLABLE RYX
+A3DC ; [.228D.0020.0002.A3DC] # YI SYLLABLE RY
+A3DD ; [.228E.0020.0002.A3DD] # YI SYLLABLE RYP
+A3DE ; [.228F.0020.0002.A3DE] # YI SYLLABLE RYRX
+A3DF ; [.2290.0020.0002.A3DF] # YI SYLLABLE RYR
+A3E0 ; [.2291.0020.0002.A3E0] # YI SYLLABLE JIT
+A3E1 ; [.2292.0020.0002.A3E1] # YI SYLLABLE JIX
+A3E2 ; [.2293.0020.0002.A3E2] # YI SYLLABLE JI
+A3E3 ; [.2294.0020.0002.A3E3] # YI SYLLABLE JIP
+A3E4 ; [.2295.0020.0002.A3E4] # YI SYLLABLE JIET
+A3E5 ; [.2296.0020.0002.A3E5] # YI SYLLABLE JIEX
+A3E6 ; [.2297.0020.0002.A3E6] # YI SYLLABLE JIE
+A3E7 ; [.2298.0020.0002.A3E7] # YI SYLLABLE JIEP
+A3E8 ; [.2299.0020.0002.A3E8] # YI SYLLABLE JUOT
+A3E9 ; [.229A.0020.0002.A3E9] # YI SYLLABLE JUOX
+A3EA ; [.229B.0020.0002.A3EA] # YI SYLLABLE JUO
+A3EB ; [.229C.0020.0002.A3EB] # YI SYLLABLE JUOP
+A3EC ; [.229D.0020.0002.A3EC] # YI SYLLABLE JOT
+A3ED ; [.229E.0020.0002.A3ED] # YI SYLLABLE JOX
+A3EE ; [.229F.0020.0002.A3EE] # YI SYLLABLE JO
+A3EF ; [.22A0.0020.0002.A3EF] # YI SYLLABLE JOP
+A3F0 ; [.22A1.0020.0002.A3F0] # YI SYLLABLE JUT
+A3F1 ; [.22A2.0020.0002.A3F1] # YI SYLLABLE JUX
+A3F2 ; [.22A3.0020.0002.A3F2] # YI SYLLABLE JU
+A3F3 ; [.22A4.0020.0002.A3F3] # YI SYLLABLE JUP
+A3F4 ; [.22A5.0020.0002.A3F4] # YI SYLLABLE JURX
+A3F5 ; [.22A6.0020.0002.A3F5] # YI SYLLABLE JUR
+A3F6 ; [.22A7.0020.0002.A3F6] # YI SYLLABLE JYT
+A3F7 ; [.22A8.0020.0002.A3F7] # YI SYLLABLE JYX
+A3F8 ; [.22A9.0020.0002.A3F8] # YI SYLLABLE JY
+A3F9 ; [.22AA.0020.0002.A3F9] # YI SYLLABLE JYP
+A3FA ; [.22AB.0020.0002.A3FA] # YI SYLLABLE JYRX
+A3FB ; [.22AC.0020.0002.A3FB] # YI SYLLABLE JYR
+A3FC ; [.22AD.0020.0002.A3FC] # YI SYLLABLE QIT
+A3FD ; [.22AE.0020.0002.A3FD] # YI SYLLABLE QIX
+A3FE ; [.22AF.0020.0002.A3FE] # YI SYLLABLE QI
+A3FF ; [.22B0.0020.0002.A3FF] # YI SYLLABLE QIP
+A400 ; [.22B1.0020.0002.A400] # YI SYLLABLE QIET
+A401 ; [.22B2.0020.0002.A401] # YI SYLLABLE QIEX
+A402 ; [.22B3.0020.0002.A402] # YI SYLLABLE QIE
+A403 ; [.22B4.0020.0002.A403] # YI SYLLABLE QIEP
+A404 ; [.22B5.0020.0002.A404] # YI SYLLABLE QUOT
+A405 ; [.22B6.0020.0002.A405] # YI SYLLABLE QUOX
+A406 ; [.22B7.0020.0002.A406] # YI SYLLABLE QUO
+A407 ; [.22B8.0020.0002.A407] # YI SYLLABLE QUOP
+A408 ; [.22B9.0020.0002.A408] # YI SYLLABLE QOT
+A409 ; [.22BA.0020.0002.A409] # YI SYLLABLE QOX
+A40A ; [.22BB.0020.0002.A40A] # YI SYLLABLE QO
+A40B ; [.22BC.0020.0002.A40B] # YI SYLLABLE QOP
+A40C ; [.22BD.0020.0002.A40C] # YI SYLLABLE QUT
+A40D ; [.22BE.0020.0002.A40D] # YI SYLLABLE QUX
+A40E ; [.22BF.0020.0002.A40E] # YI SYLLABLE QU
+A40F ; [.22C0.0020.0002.A40F] # YI SYLLABLE QUP
+A410 ; [.22C1.0020.0002.A410] # YI SYLLABLE QURX
+A411 ; [.22C2.0020.0002.A411] # YI SYLLABLE QUR
+A412 ; [.22C3.0020.0002.A412] # YI SYLLABLE QYT
+A413 ; [.22C4.0020.0002.A413] # YI SYLLABLE QYX
+A414 ; [.22C5.0020.0002.A414] # YI SYLLABLE QY
+A415 ; [.22C6.0020.0002.A415] # YI SYLLABLE QYP
+A416 ; [.22C7.0020.0002.A416] # YI SYLLABLE QYRX
+A417 ; [.22C8.0020.0002.A417] # YI SYLLABLE QYR
+A418 ; [.22C9.0020.0002.A418] # YI SYLLABLE JJIT
+A419 ; [.22CA.0020.0002.A419] # YI SYLLABLE JJIX
+A41A ; [.22CB.0020.0002.A41A] # YI SYLLABLE JJI
+A41B ; [.22CC.0020.0002.A41B] # YI SYLLABLE JJIP
+A41C ; [.22CD.0020.0002.A41C] # YI SYLLABLE JJIET
+A41D ; [.22CE.0020.0002.A41D] # YI SYLLABLE JJIEX
+A41E ; [.22CF.0020.0002.A41E] # YI SYLLABLE JJIE
+A41F ; [.22D0.0020.0002.A41F] # YI SYLLABLE JJIEP
+A420 ; [.22D1.0020.0002.A420] # YI SYLLABLE JJUOX
+A421 ; [.22D2.0020.0002.A421] # YI SYLLABLE JJUO
+A422 ; [.22D3.0020.0002.A422] # YI SYLLABLE JJUOP
+A423 ; [.22D4.0020.0002.A423] # YI SYLLABLE JJOT
+A424 ; [.22D5.0020.0002.A424] # YI SYLLABLE JJOX
+A425 ; [.22D6.0020.0002.A425] # YI SYLLABLE JJO
+A426 ; [.22D7.0020.0002.A426] # YI SYLLABLE JJOP
+A427 ; [.22D8.0020.0002.A427] # YI SYLLABLE JJUT
+A428 ; [.22D9.0020.0002.A428] # YI SYLLABLE JJUX
+A429 ; [.22DA.0020.0002.A429] # YI SYLLABLE JJU
+A42A ; [.22DB.0020.0002.A42A] # YI SYLLABLE JJUP
+A42B ; [.22DC.0020.0002.A42B] # YI SYLLABLE JJURX
+A42C ; [.22DD.0020.0002.A42C] # YI SYLLABLE JJUR
+A42D ; [.22DE.0020.0002.A42D] # YI SYLLABLE JJYT
+A42E ; [.22DF.0020.0002.A42E] # YI SYLLABLE JJYX
+A42F ; [.22E0.0020.0002.A42F] # YI SYLLABLE JJY
+A430 ; [.22E1.0020.0002.A430] # YI SYLLABLE JJYP
+A431 ; [.22E2.0020.0002.A431] # YI SYLLABLE NJIT
+A432 ; [.22E3.0020.0002.A432] # YI SYLLABLE NJIX
+A433 ; [.22E4.0020.0002.A433] # YI SYLLABLE NJI
+A434 ; [.22E5.0020.0002.A434] # YI SYLLABLE NJIP
+A435 ; [.22E6.0020.0002.A435] # YI SYLLABLE NJIET
+A436 ; [.22E7.0020.0002.A436] # YI SYLLABLE NJIEX
+A437 ; [.22E8.0020.0002.A437] # YI SYLLABLE NJIE
+A438 ; [.22E9.0020.0002.A438] # YI SYLLABLE NJIEP
+A439 ; [.22EA.0020.0002.A439] # YI SYLLABLE NJUOX
+A43A ; [.22EB.0020.0002.A43A] # YI SYLLABLE NJUO
+A43B ; [.22EC.0020.0002.A43B] # YI SYLLABLE NJOT
+A43C ; [.22ED.0020.0002.A43C] # YI SYLLABLE NJOX
+A43D ; [.22EE.0020.0002.A43D] # YI SYLLABLE NJO
+A43E ; [.22EF.0020.0002.A43E] # YI SYLLABLE NJOP
+A43F ; [.22F0.0020.0002.A43F] # YI SYLLABLE NJUX
+A440 ; [.22F1.0020.0002.A440] # YI SYLLABLE NJU
+A441 ; [.22F2.0020.0002.A441] # YI SYLLABLE NJUP
+A442 ; [.22F3.0020.0002.A442] # YI SYLLABLE NJURX
+A443 ; [.22F4.0020.0002.A443] # YI SYLLABLE NJUR
+A444 ; [.22F5.0020.0002.A444] # YI SYLLABLE NJYT
+A445 ; [.22F6.0020.0002.A445] # YI SYLLABLE NJYX
+A446 ; [.22F7.0020.0002.A446] # YI SYLLABLE NJY
+A447 ; [.22F8.0020.0002.A447] # YI SYLLABLE NJYP
+A448 ; [.22F9.0020.0002.A448] # YI SYLLABLE NJYRX
+A449 ; [.22FA.0020.0002.A449] # YI SYLLABLE NJYR
+A44A ; [.22FB.0020.0002.A44A] # YI SYLLABLE NYIT
+A44B ; [.22FC.0020.0002.A44B] # YI SYLLABLE NYIX
+A44C ; [.22FD.0020.0002.A44C] # YI SYLLABLE NYI
+A44D ; [.22FE.0020.0002.A44D] # YI SYLLABLE NYIP
+A44E ; [.22FF.0020.0002.A44E] # YI SYLLABLE NYIET
+A44F ; [.2300.0020.0002.A44F] # YI SYLLABLE NYIEX
+A450 ; [.2301.0020.0002.A450] # YI SYLLABLE NYIE
+A451 ; [.2302.0020.0002.A451] # YI SYLLABLE NYIEP
+A452 ; [.2303.0020.0002.A452] # YI SYLLABLE NYUOX
+A453 ; [.2304.0020.0002.A453] # YI SYLLABLE NYUO
+A454 ; [.2305.0020.0002.A454] # YI SYLLABLE NYUOP
+A455 ; [.2306.0020.0002.A455] # YI SYLLABLE NYOT
+A456 ; [.2307.0020.0002.A456] # YI SYLLABLE NYOX
+A457 ; [.2308.0020.0002.A457] # YI SYLLABLE NYO
+A458 ; [.2309.0020.0002.A458] # YI SYLLABLE NYOP
+A459 ; [.230A.0020.0002.A459] # YI SYLLABLE NYUT
+A45A ; [.230B.0020.0002.A45A] # YI SYLLABLE NYUX
+A45B ; [.230C.0020.0002.A45B] # YI SYLLABLE NYU
+A45C ; [.230D.0020.0002.A45C] # YI SYLLABLE NYUP
+A45D ; [.230E.0020.0002.A45D] # YI SYLLABLE XIT
+A45E ; [.230F.0020.0002.A45E] # YI SYLLABLE XIX
+A45F ; [.2310.0020.0002.A45F] # YI SYLLABLE XI
+A460 ; [.2311.0020.0002.A460] # YI SYLLABLE XIP
+A461 ; [.2312.0020.0002.A461] # YI SYLLABLE XIET
+A462 ; [.2313.0020.0002.A462] # YI SYLLABLE XIEX
+A463 ; [.2314.0020.0002.A463] # YI SYLLABLE XIE
+A464 ; [.2315.0020.0002.A464] # YI SYLLABLE XIEP
+A465 ; [.2316.0020.0002.A465] # YI SYLLABLE XUOX
+A466 ; [.2317.0020.0002.A466] # YI SYLLABLE XUO
+A467 ; [.2318.0020.0002.A467] # YI SYLLABLE XOT
+A468 ; [.2319.0020.0002.A468] # YI SYLLABLE XOX
+A469 ; [.231A.0020.0002.A469] # YI SYLLABLE XO
+A46A ; [.231B.0020.0002.A46A] # YI SYLLABLE XOP
+A46B ; [.231C.0020.0002.A46B] # YI SYLLABLE XYT
+A46C ; [.231D.0020.0002.A46C] # YI SYLLABLE XYX
+A46D ; [.231E.0020.0002.A46D] # YI SYLLABLE XY
+A46E ; [.231F.0020.0002.A46E] # YI SYLLABLE XYP
+A46F ; [.2320.0020.0002.A46F] # YI SYLLABLE XYRX
+A470 ; [.2321.0020.0002.A470] # YI SYLLABLE XYR
+A471 ; [.2322.0020.0002.A471] # YI SYLLABLE YIT
+A472 ; [.2323.0020.0002.A472] # YI SYLLABLE YIX
+A473 ; [.2324.0020.0002.A473] # YI SYLLABLE YI
+A474 ; [.2325.0020.0002.A474] # YI SYLLABLE YIP
+A475 ; [.2326.0020.0002.A475] # YI SYLLABLE YIET
+A476 ; [.2327.0020.0002.A476] # YI SYLLABLE YIEX
+A477 ; [.2328.0020.0002.A477] # YI SYLLABLE YIE
+A478 ; [.2329.0020.0002.A478] # YI SYLLABLE YIEP
+A479 ; [.232A.0020.0002.A479] # YI SYLLABLE YUOT
+A47A ; [.232B.0020.0002.A47A] # YI SYLLABLE YUOX
+A47B ; [.232C.0020.0002.A47B] # YI SYLLABLE YUO
+A47C ; [.232D.0020.0002.A47C] # YI SYLLABLE YUOP
+A47D ; [.232E.0020.0002.A47D] # YI SYLLABLE YOT
+A47E ; [.232F.0020.0002.A47E] # YI SYLLABLE YOX
+A47F ; [.2330.0020.0002.A47F] # YI SYLLABLE YO
+A480 ; [.2331.0020.0002.A480] # YI SYLLABLE YOP
+A481 ; [.2332.0020.0002.A481] # YI SYLLABLE YUT
+A482 ; [.2333.0020.0002.A482] # YI SYLLABLE YUX
+A483 ; [.2334.0020.0002.A483] # YI SYLLABLE YU
+A484 ; [.2335.0020.0002.A484] # YI SYLLABLE YUP
+A485 ; [.2336.0020.0002.A485] # YI SYLLABLE YURX
+A486 ; [.2337.0020.0002.A486] # YI SYLLABLE YUR
+A487 ; [.2338.0020.0002.A487] # YI SYLLABLE YYT
+A488 ; [.2339.0020.0002.A488] # YI SYLLABLE YYX
+A489 ; [.233A.0020.0002.A489] # YI SYLLABLE YY
+A48A ; [.233B.0020.0002.A48A] # YI SYLLABLE YYP
+A48B ; [.233C.0020.0002.A48B] # YI SYLLABLE YYRX
+A48C ; [.233D.0020.0002.A48C] # YI SYLLABLE YYR
+10300 ; [.233E.0020.0002.10300] # OLD ITALIC LETTER A
+10301 ; [.233F.0020.0002.10301] # OLD ITALIC LETTER BE
+10302 ; [.2340.0020.0002.10302] # OLD ITALIC LETTER KE
+10303 ; [.2341.0020.0002.10303] # OLD ITALIC LETTER DE
+10304 ; [.2342.0020.0002.10304] # OLD ITALIC LETTER E
+10305 ; [.2343.0020.0002.10305] # OLD ITALIC LETTER VE
+10306 ; [.2344.0020.0002.10306] # OLD ITALIC LETTER ZE
+10307 ; [.2345.0020.0002.10307] # OLD ITALIC LETTER HE
+10308 ; [.2346.0020.0002.10308] # OLD ITALIC LETTER THE
+10309 ; [.2347.0020.0002.10309] # OLD ITALIC LETTER I
+1030A ; [.2348.0020.0002.1030A] # OLD ITALIC LETTER KA
+1030B ; [.2349.0020.0002.1030B] # OLD ITALIC LETTER EL
+1030C ; [.234A.0020.0002.1030C] # OLD ITALIC LETTER EM
+1030D ; [.234B.0020.0002.1030D] # OLD ITALIC LETTER EN
+1030E ; [.234C.0020.0002.1030E] # OLD ITALIC LETTER ESH
+1030F ; [.234D.0020.0002.1030F] # OLD ITALIC LETTER O
+10310 ; [.234E.0020.0002.10310] # OLD ITALIC LETTER PE
+10311 ; [.234F.0020.0002.10311] # OLD ITALIC LETTER SHE
+10312 ; [.2350.0020.0002.10312] # OLD ITALIC LETTER KU
+10313 ; [.2351.0020.0002.10313] # OLD ITALIC LETTER ER
+10314 ; [.2352.0020.0002.10314] # OLD ITALIC LETTER ES
+10315 ; [.2353.0020.0002.10315] # OLD ITALIC LETTER TE
+10316 ; [.2354.0020.0002.10316] # OLD ITALIC LETTER U
+10317 ; [.2355.0020.0002.10317] # OLD ITALIC LETTER EKS
+10318 ; [.2356.0020.0002.10318] # OLD ITALIC LETTER PHE
+10319 ; [.2357.0020.0002.10319] # OLD ITALIC LETTER KHE
+1031A ; [.2358.0020.0002.1031A] # OLD ITALIC LETTER EF
+1031B ; [.2359.0020.0002.1031B] # OLD ITALIC LETTER ERS
+1031C ; [.235A.0020.0002.1031C] # OLD ITALIC LETTER CHE
+1031D ; [.235B.0020.0002.1031D] # OLD ITALIC LETTER II
+1031E ; [.235C.0020.0002.1031E] # OLD ITALIC LETTER UU
+10330 ; [.235D.0020.0002.10330] # GOTHIC LETTER AHSA
+10331 ; [.235E.0020.0002.10331] # GOTHIC LETTER BAIRKAN
+10332 ; [.235F.0020.0002.10332] # GOTHIC LETTER GIBA
+10333 ; [.2360.0020.0002.10333] # GOTHIC LETTER DAGS
+10334 ; [.2361.0020.0002.10334] # GOTHIC LETTER AIHVUS
+10335 ; [.2362.0020.0002.10335] # GOTHIC LETTER QAIRTHRA
+10336 ; [.2363.0020.0002.10336] # GOTHIC LETTER IUJA
+10337 ; [.2364.0020.0002.10337] # GOTHIC LETTER HAGL
+10338 ; [.2365.0020.0002.10338] # GOTHIC LETTER THIUTH
+10339 ; [.2366.0020.0002.10339] # GOTHIC LETTER EIS
+1033A ; [.2367.0020.0002.1033A] # GOTHIC LETTER KUSMA
+1033B ; [.2368.0020.0002.1033B] # GOTHIC LETTER LAGUS
+1033C ; [.2369.0020.0002.1033C] # GOTHIC LETTER MANNA
+1033D ; [.236A.0020.0002.1033D] # GOTHIC LETTER NAUTHS
+1033E ; [.236B.0020.0002.1033E] # GOTHIC LETTER JER
+1033F ; [.236C.0020.0002.1033F] # GOTHIC LETTER URUS
+10340 ; [.236D.0020.0002.10340] # GOTHIC LETTER PAIRTHRA
+10341 ; [.236E.0020.0002.10341] # GOTHIC LETTER NINETY
+10342 ; [.236F.0020.0002.10342] # GOTHIC LETTER RAIDA
+10343 ; [.2370.0020.0002.10343] # GOTHIC LETTER SAUIL
+10344 ; [.2371.0020.0002.10344] # GOTHIC LETTER TEIWS
+10345 ; [.2372.0020.0002.10345] # GOTHIC LETTER WINJA
+10346 ; [.2373.0020.0002.10346] # GOTHIC LETTER FAIHU
+10347 ; [.2374.0020.0002.10347] # GOTHIC LETTER IGGWS
+10348 ; [.2375.0020.0002.10348] # GOTHIC LETTER HWAIR
+10349 ; [.2376.0020.0002.10349] # GOTHIC LETTER OTHAL
+1034A ; [.2377.0020.0002.1034A] # GOTHIC LETTER NINE HUNDRED
+10428 ; [.2378.0020.0002.10428] # DESERET SMALL LETTER LONG I
+10400 ; [.2378.0020.0008.10400] # DESERET CAPITAL LETTER LONG I
+10429 ; [.2379.0020.0002.10429] # DESERET SMALL LETTER LONG E
+10401 ; [.2379.0020.0008.10401] # DESERET CAPITAL LETTER LONG E
+1042A ; [.237A.0020.0002.1042A] # DESERET SMALL LETTER LONG A
+10402 ; [.237A.0020.0008.10402] # DESERET CAPITAL LETTER LONG A
+1042B ; [.237B.0020.0002.1042B] # DESERET SMALL LETTER LONG AH
+10403 ; [.237B.0020.0008.10403] # DESERET CAPITAL LETTER LONG AH
+1042C ; [.237C.0020.0002.1042C] # DESERET SMALL LETTER LONG O
+10404 ; [.237C.0020.0008.10404] # DESERET CAPITAL LETTER LONG O
+1042D ; [.237D.0020.0002.1042D] # DESERET SMALL LETTER LONG OO
+10405 ; [.237D.0020.0008.10405] # DESERET CAPITAL LETTER LONG OO
+1042E ; [.237E.0020.0002.1042E] # DESERET SMALL LETTER SHORT I
+10406 ; [.237E.0020.0008.10406] # DESERET CAPITAL LETTER SHORT I
+1042F ; [.237F.0020.0002.1042F] # DESERET SMALL LETTER SHORT E
+10407 ; [.237F.0020.0008.10407] # DESERET CAPITAL LETTER SHORT E
+10430 ; [.2380.0020.0002.10430] # DESERET SMALL LETTER SHORT A
+10408 ; [.2380.0020.0008.10408] # DESERET CAPITAL LETTER SHORT A
+10431 ; [.2381.0020.0002.10431] # DESERET SMALL LETTER SHORT AH
+10409 ; [.2381.0020.0008.10409] # DESERET CAPITAL LETTER SHORT AH
+10432 ; [.2382.0020.0002.10432] # DESERET SMALL LETTER SHORT O
+1040A ; [.2382.0020.0008.1040A] # DESERET CAPITAL LETTER SHORT O
+10433 ; [.2383.0020.0002.10433] # DESERET SMALL LETTER SHORT OO
+1040B ; [.2383.0020.0008.1040B] # DESERET CAPITAL LETTER SHORT OO
+10434 ; [.2384.0020.0002.10434] # DESERET SMALL LETTER AY
+1040C ; [.2384.0020.0008.1040C] # DESERET CAPITAL LETTER AY
+10435 ; [.2385.0020.0002.10435] # DESERET SMALL LETTER OW
+1040D ; [.2385.0020.0008.1040D] # DESERET CAPITAL LETTER OW
+10436 ; [.2386.0020.0002.10436] # DESERET SMALL LETTER WU
+1040E ; [.2386.0020.0008.1040E] # DESERET CAPITAL LETTER WU
+10437 ; [.2387.0020.0002.10437] # DESERET SMALL LETTER YEE
+1040F ; [.2387.0020.0008.1040F] # DESERET CAPITAL LETTER YEE
+10438 ; [.2388.0020.0002.10438] # DESERET SMALL LETTER H
+10410 ; [.2388.0020.0008.10410] # DESERET CAPITAL LETTER H
+10439 ; [.2389.0020.0002.10439] # DESERET SMALL LETTER PEE
+10411 ; [.2389.0020.0008.10411] # DESERET CAPITAL LETTER PEE
+1043A ; [.238A.0020.0002.1043A] # DESERET SMALL LETTER BEE
+10412 ; [.238A.0020.0008.10412] # DESERET CAPITAL LETTER BEE
+1043B ; [.238B.0020.0002.1043B] # DESERET SMALL LETTER TEE
+10413 ; [.238B.0020.0008.10413] # DESERET CAPITAL LETTER TEE
+1043C ; [.238C.0020.0002.1043C] # DESERET SMALL LETTER DEE
+10414 ; [.238C.0020.0008.10414] # DESERET CAPITAL LETTER DEE
+1043D ; [.238D.0020.0002.1043D] # DESERET SMALL LETTER CHEE
+10415 ; [.238D.0020.0008.10415] # DESERET CAPITAL LETTER CHEE
+1043E ; [.238E.0020.0002.1043E] # DESERET SMALL LETTER JEE
+10416 ; [.238E.0020.0008.10416] # DESERET CAPITAL LETTER JEE
+1043F ; [.238F.0020.0002.1043F] # DESERET SMALL LETTER KAY
+10417 ; [.238F.0020.0008.10417] # DESERET CAPITAL LETTER KAY
+10440 ; [.2390.0020.0002.10440] # DESERET SMALL LETTER GAY
+10418 ; [.2390.0020.0008.10418] # DESERET CAPITAL LETTER GAY
+10441 ; [.2391.0020.0002.10441] # DESERET SMALL LETTER EF
+10419 ; [.2391.0020.0008.10419] # DESERET CAPITAL LETTER EF
+10442 ; [.2392.0020.0002.10442] # DESERET SMALL LETTER VEE
+1041A ; [.2392.0020.0008.1041A] # DESERET CAPITAL LETTER VEE
+10443 ; [.2393.0020.0002.10443] # DESERET SMALL LETTER ETH
+1041B ; [.2393.0020.0008.1041B] # DESERET CAPITAL LETTER ETH
+10444 ; [.2394.0020.0002.10444] # DESERET SMALL LETTER THEE
+1041C ; [.2394.0020.0008.1041C] # DESERET CAPITAL LETTER THEE
+10445 ; [.2395.0020.0002.10445] # DESERET SMALL LETTER ES
+1041D ; [.2395.0020.0008.1041D] # DESERET CAPITAL LETTER ES
+10446 ; [.2396.0020.0002.10446] # DESERET SMALL LETTER ZEE
+1041E ; [.2396.0020.0008.1041E] # DESERET CAPITAL LETTER ZEE
+10447 ; [.2397.0020.0002.10447] # DESERET SMALL LETTER ESH
+1041F ; [.2397.0020.0008.1041F] # DESERET CAPITAL LETTER ESH
+10448 ; [.2398.0020.0002.10448] # DESERET SMALL LETTER ZHEE
+10420 ; [.2398.0020.0008.10420] # DESERET CAPITAL LETTER ZHEE
+10449 ; [.2399.0020.0002.10449] # DESERET SMALL LETTER ER
+10421 ; [.2399.0020.0008.10421] # DESERET CAPITAL LETTER ER
+1044A ; [.239A.0020.0002.1044A] # DESERET SMALL LETTER EL
+10422 ; [.239A.0020.0008.10422] # DESERET CAPITAL LETTER EL
+1044B ; [.239B.0020.0002.1044B] # DESERET SMALL LETTER EM
+10423 ; [.239B.0020.0008.10423] # DESERET CAPITAL LETTER EM
+1044C ; [.239C.0020.0002.1044C] # DESERET SMALL LETTER EN
+10424 ; [.239C.0020.0008.10424] # DESERET CAPITAL LETTER EN
+1044D ; [.239D.0020.0002.1044D] # DESERET SMALL LETTER ENG
+10425 ; [.239D.0020.0008.10425] # DESERET CAPITAL LETTER ENG
+1044E ; [.239E.0020.0002.1044E] # DESERET SMALL LETTER OI
+10426 ; [.239E.0020.0008.10426] # DESERET CAPITAL LETTER OI
+1044F ; [.239F.0020.0002.1044F] # DESERET SMALL LETTER EW
+10427 ; [.239F.0020.0008.10427] # DESERET CAPITAL LETTER EW
+10450 ; [.23A0.0020.0002.10450] # SHAVIAN LETTER PEEP
+10451 ; [.23A1.0020.0002.10451] # SHAVIAN LETTER TOT
+10452 ; [.23A2.0020.0002.10452] # SHAVIAN LETTER KICK
+10453 ; [.23A3.0020.0002.10453] # SHAVIAN LETTER FEE
+10454 ; [.23A4.0020.0002.10454] # SHAVIAN LETTER THIGH
+10455 ; [.23A5.0020.0002.10455] # SHAVIAN LETTER SO
+10456 ; [.23A6.0020.0002.10456] # SHAVIAN LETTER SURE
+10457 ; [.23A7.0020.0002.10457] # SHAVIAN LETTER CHURCH
+10458 ; [.23A8.0020.0002.10458] # SHAVIAN LETTER YEA
+10459 ; [.23A9.0020.0002.10459] # SHAVIAN LETTER HUNG
+1045A ; [.23AA.0020.0002.1045A] # SHAVIAN LETTER BIB
+1045B ; [.23AB.0020.0002.1045B] # SHAVIAN LETTER DEAD
+1045C ; [.23AC.0020.0002.1045C] # SHAVIAN LETTER GAG
+1045D ; [.23AD.0020.0002.1045D] # SHAVIAN LETTER VOW
+1045E ; [.23AE.0020.0002.1045E] # SHAVIAN LETTER THEY
+1045F ; [.23AF.0020.0002.1045F] # SHAVIAN LETTER ZOO
+10460 ; [.23B0.0020.0002.10460] # SHAVIAN LETTER MEASURE
+10461 ; [.23B1.0020.0002.10461] # SHAVIAN LETTER JUDGE
+10462 ; [.23B2.0020.0002.10462] # SHAVIAN LETTER WOE
+10463 ; [.23B3.0020.0002.10463] # SHAVIAN LETTER HA-HA
+10464 ; [.23B4.0020.0002.10464] # SHAVIAN LETTER LOLL
+10465 ; [.23B5.0020.0002.10465] # SHAVIAN LETTER MIME
+10466 ; [.23B6.0020.0002.10466] # SHAVIAN LETTER IF
+10467 ; [.23B7.0020.0002.10467] # SHAVIAN LETTER EGG
+10468 ; [.23B8.0020.0002.10468] # SHAVIAN LETTER ASH
+10469 ; [.23B9.0020.0002.10469] # SHAVIAN LETTER ADO
+1046A ; [.23BA.0020.0002.1046A] # SHAVIAN LETTER ON
+1046B ; [.23BB.0020.0002.1046B] # SHAVIAN LETTER WOOL
+1046C ; [.23BC.0020.0002.1046C] # SHAVIAN LETTER OUT
+1046D ; [.23BD.0020.0002.1046D] # SHAVIAN LETTER AH
+1046E ; [.23BE.0020.0002.1046E] # SHAVIAN LETTER ROAR
+1046F ; [.23BF.0020.0002.1046F] # SHAVIAN LETTER NUN
+10470 ; [.23C0.0020.0002.10470] # SHAVIAN LETTER EAT
+10471 ; [.23C1.0020.0002.10471] # SHAVIAN LETTER AGE
+10472 ; [.23C2.0020.0002.10472] # SHAVIAN LETTER ICE
+10473 ; [.23C3.0020.0002.10473] # SHAVIAN LETTER UP
+10474 ; [.23C4.0020.0002.10474] # SHAVIAN LETTER OAK
+10475 ; [.23C5.0020.0002.10475] # SHAVIAN LETTER OOZE
+10476 ; [.23C6.0020.0002.10476] # SHAVIAN LETTER OIL
+10477 ; [.23C7.0020.0002.10477] # SHAVIAN LETTER AWE
+10478 ; [.23C8.0020.0002.10478] # SHAVIAN LETTER ARE
+10479 ; [.23C9.0020.0002.10479] # SHAVIAN LETTER OR
+1047A ; [.23CA.0020.0002.1047A] # SHAVIAN LETTER AIR
+1047B ; [.23CB.0020.0002.1047B] # SHAVIAN LETTER ERR
+1047C ; [.23CC.0020.0002.1047C] # SHAVIAN LETTER ARRAY
+1047D ; [.23CD.0020.0002.1047D] # SHAVIAN LETTER EAR
+1047E ; [.23CE.0020.0002.1047E] # SHAVIAN LETTER IAN
+1047F ; [.23CF.0020.0002.1047F] # SHAVIAN LETTER YEW
+10480 ; [.23D0.0020.0002.10480] # OSMANYA LETTER ALEF
+10481 ; [.23D1.0020.0002.10481] # OSMANYA LETTER BA
+10482 ; [.23D2.0020.0002.10482] # OSMANYA LETTER TA
+10483 ; [.23D3.0020.0002.10483] # OSMANYA LETTER JA
+10484 ; [.23D4.0020.0002.10484] # OSMANYA LETTER XA
+10485 ; [.23D5.0020.0002.10485] # OSMANYA LETTER KHA
+10486 ; [.23D6.0020.0002.10486] # OSMANYA LETTER DEEL
+10487 ; [.23D7.0020.0002.10487] # OSMANYA LETTER RA
+10488 ; [.23D8.0020.0002.10488] # OSMANYA LETTER SA
+10489 ; [.23D9.0020.0002.10489] # OSMANYA LETTER SHIIN
+1048A ; [.23DA.0020.0002.1048A] # OSMANYA LETTER DHA
+1048B ; [.23DB.0020.0002.1048B] # OSMANYA LETTER CAYN
+1048C ; [.23DC.0020.0002.1048C] # OSMANYA LETTER GA
+1048D ; [.23DD.0020.0002.1048D] # OSMANYA LETTER FA
+1048E ; [.23DE.0020.0002.1048E] # OSMANYA LETTER QAAF
+1048F ; [.23DF.0020.0002.1048F] # OSMANYA LETTER KAAF
+10490 ; [.23E0.0020.0002.10490] # OSMANYA LETTER LAAN
+10491 ; [.23E1.0020.0002.10491] # OSMANYA LETTER MIIN
+10492 ; [.23E2.0020.0002.10492] # OSMANYA LETTER NUUN
+10493 ; [.23E3.0020.0002.10493] # OSMANYA LETTER WAW
+10494 ; [.23E4.0020.0002.10494] # OSMANYA LETTER HA
+10495 ; [.23E5.0020.0002.10495] # OSMANYA LETTER YA
+10496 ; [.23E6.0020.0002.10496] # OSMANYA LETTER A
+10497 ; [.23E7.0020.0002.10497] # OSMANYA LETTER E
+10498 ; [.23E8.0020.0002.10498] # OSMANYA LETTER I
+10499 ; [.23E9.0020.0002.10499] # OSMANYA LETTER O
+1049A ; [.23EA.0020.0002.1049A] # OSMANYA LETTER U
+1049B ; [.23EB.0020.0002.1049B] # OSMANYA LETTER AA
+1049C ; [.23EC.0020.0002.1049C] # OSMANYA LETTER EE
+1049D ; [.23ED.0020.0002.1049D] # OSMANYA LETTER OO
+10000 ; [.23EE.0020.0002.10000] # LINEAR B SYLLABLE B008 A
+10001 ; [.23EF.0020.0002.10001] # LINEAR B SYLLABLE B038 E
+10002 ; [.23F0.0020.0002.10002] # LINEAR B SYLLABLE B028 I
+10003 ; [.23F1.0020.0002.10003] # LINEAR B SYLLABLE B061 O
+10004 ; [.23F2.0020.0002.10004] # LINEAR B SYLLABLE B010 U
+10005 ; [.23F3.0020.0002.10005] # LINEAR B SYLLABLE B001 DA
+10006 ; [.23F4.0020.0002.10006] # LINEAR B SYLLABLE B045 DE
+10007 ; [.23F5.0020.0002.10007] # LINEAR B SYLLABLE B007 DI
+10008 ; [.23F6.0020.0002.10008] # LINEAR B SYLLABLE B014 DO
+10009 ; [.23F7.0020.0002.10009] # LINEAR B SYLLABLE B051 DU
+1000A ; [.23F8.0020.0002.1000A] # LINEAR B SYLLABLE B057 JA
+1000B ; [.23F9.0020.0002.1000B] # LINEAR B SYLLABLE B046 JE
+1000D ; [.23FA.0020.0002.1000D] # LINEAR B SYLLABLE B036 JO
+1000E ; [.23FB.0020.0002.1000E] # LINEAR B SYLLABLE B065 JU
+1000F ; [.23FC.0020.0002.1000F] # LINEAR B SYLLABLE B077 KA
+10010 ; [.23FD.0020.0002.10010] # LINEAR B SYLLABLE B044 KE
+10011 ; [.23FE.0020.0002.10011] # LINEAR B SYLLABLE B067 KI
+10012 ; [.23FF.0020.0002.10012] # LINEAR B SYLLABLE B070 KO
+10013 ; [.2400.0020.0002.10013] # LINEAR B SYLLABLE B081 KU
+10014 ; [.2401.0020.0002.10014] # LINEAR B SYLLABLE B080 MA
+10015 ; [.2402.0020.0002.10015] # LINEAR B SYLLABLE B013 ME
+10016 ; [.2403.0020.0002.10016] # LINEAR B SYLLABLE B073 MI
+10017 ; [.2404.0020.0002.10017] # LINEAR B SYLLABLE B015 MO
+10018 ; [.2405.0020.0002.10018] # LINEAR B SYLLABLE B023 MU
+10019 ; [.2406.0020.0002.10019] # LINEAR B SYLLABLE B006 NA
+1001A ; [.2407.0020.0002.1001A] # LINEAR B SYLLABLE B024 NE
+1001B ; [.2408.0020.0002.1001B] # LINEAR B SYLLABLE B030 NI
+1001C ; [.2409.0020.0002.1001C] # LINEAR B SYLLABLE B052 NO
+1001D ; [.240A.0020.0002.1001D] # LINEAR B SYLLABLE B055 NU
+1001E ; [.240B.0020.0002.1001E] # LINEAR B SYLLABLE B003 PA
+1001F ; [.240C.0020.0002.1001F] # LINEAR B SYLLABLE B072 PE
+10020 ; [.240D.0020.0002.10020] # LINEAR B SYLLABLE B039 PI
+10021 ; [.240E.0020.0002.10021] # LINEAR B SYLLABLE B011 PO
+10022 ; [.240F.0020.0002.10022] # LINEAR B SYLLABLE B050 PU
+10023 ; [.2410.0020.0002.10023] # LINEAR B SYLLABLE B016 QA
+10024 ; [.2411.0020.0002.10024] # LINEAR B SYLLABLE B078 QE
+10025 ; [.2412.0020.0002.10025] # LINEAR B SYLLABLE B021 QI
+10026 ; [.2413.0020.0002.10026] # LINEAR B SYLLABLE B032 QO
+10028 ; [.2414.0020.0002.10028] # LINEAR B SYLLABLE B060 RA
+10029 ; [.2415.0020.0002.10029] # LINEAR B SYLLABLE B027 RE
+1002A ; [.2416.0020.0002.1002A] # LINEAR B SYLLABLE B053 RI
+1002B ; [.2417.0020.0002.1002B] # LINEAR B SYLLABLE B002 RO
+1002C ; [.2418.0020.0002.1002C] # LINEAR B SYLLABLE B026 RU
+1002D ; [.2419.0020.0002.1002D] # LINEAR B SYLLABLE B031 SA
+1002E ; [.241A.0020.0002.1002E] # LINEAR B SYLLABLE B009 SE
+1002F ; [.241B.0020.0002.1002F] # LINEAR B SYLLABLE B041 SI
+10030 ; [.241C.0020.0002.10030] # LINEAR B SYLLABLE B012 SO
+10031 ; [.241D.0020.0002.10031] # LINEAR B SYLLABLE B058 SU
+10032 ; [.241E.0020.0002.10032] # LINEAR B SYLLABLE B059 TA
+10033 ; [.241F.0020.0002.10033] # LINEAR B SYLLABLE B004 TE
+10034 ; [.2420.0020.0002.10034] # LINEAR B SYLLABLE B037 TI
+10035 ; [.2421.0020.0002.10035] # LINEAR B SYLLABLE B005 TO
+10036 ; [.2422.0020.0002.10036] # LINEAR B SYLLABLE B069 TU
+10037 ; [.2423.0020.0002.10037] # LINEAR B SYLLABLE B054 WA
+10038 ; [.2424.0020.0002.10038] # LINEAR B SYLLABLE B075 WE
+10039 ; [.2425.0020.0002.10039] # LINEAR B SYLLABLE B040 WI
+1003A ; [.2426.0020.0002.1003A] # LINEAR B SYLLABLE B042 WO
+1003C ; [.2427.0020.0002.1003C] # LINEAR B SYLLABLE B017 ZA
+1003D ; [.2428.0020.0002.1003D] # LINEAR B SYLLABLE B074 ZE
+1003F ; [.2429.0020.0002.1003F] # LINEAR B SYLLABLE B020 ZO
+10040 ; [.242A.0020.0002.10040] # LINEAR B SYLLABLE B025 A2
+10041 ; [.242B.0020.0002.10041] # LINEAR B SYLLABLE B043 A3
+10042 ; [.242C.0020.0002.10042] # LINEAR B SYLLABLE B085 AU
+10043 ; [.242D.0020.0002.10043] # LINEAR B SYLLABLE B071 DWE
+10044 ; [.242E.0020.0002.10044] # LINEAR B SYLLABLE B090 DWO
+10045 ; [.242F.0020.0002.10045] # LINEAR B SYLLABLE B048 NWA
+10046 ; [.2430.0020.0002.10046] # LINEAR B SYLLABLE B029 PU2
+10047 ; [.2431.0020.0002.10047] # LINEAR B SYLLABLE B062 PTE
+10048 ; [.2432.0020.0002.10048] # LINEAR B SYLLABLE B076 RA2
+10049 ; [.2433.0020.0002.10049] # LINEAR B SYLLABLE B033 RA3
+1004A ; [.2434.0020.0002.1004A] # LINEAR B SYLLABLE B068 RO2
+1004B ; [.2435.0020.0002.1004B] # LINEAR B SYLLABLE B066 TA2
+1004C ; [.2436.0020.0002.1004C] # LINEAR B SYLLABLE B087 TWE
+1004D ; [.2437.0020.0002.1004D] # LINEAR B SYLLABLE B091 TWO
+10050 ; [.2438.0020.0002.10050] # LINEAR B SYMBOL B018
+10051 ; [.2439.0020.0002.10051] # LINEAR B SYMBOL B019
+10052 ; [.243A.0020.0002.10052] # LINEAR B SYMBOL B022
+10053 ; [.243B.0020.0002.10053] # LINEAR B SYMBOL B034
+10054 ; [.243C.0020.0002.10054] # LINEAR B SYMBOL B047
+10055 ; [.243D.0020.0002.10055] # LINEAR B SYMBOL B049
+10056 ; [.243E.0020.0002.10056] # LINEAR B SYMBOL B056
+10057 ; [.243F.0020.0002.10057] # LINEAR B SYMBOL B063
+10058 ; [.2440.0020.0002.10058] # LINEAR B SYMBOL B064
+10059 ; [.2441.0020.0002.10059] # LINEAR B SYMBOL B079
+1005A ; [.2442.0020.0002.1005A] # LINEAR B SYMBOL B082
+1005B ; [.2443.0020.0002.1005B] # LINEAR B SYMBOL B083
+1005C ; [.2444.0020.0002.1005C] # LINEAR B SYMBOL B086
+1005D ; [.2445.0020.0002.1005D] # LINEAR B SYMBOL B089
+10080 ; [.2446.0020.0002.10080] # LINEAR B IDEOGRAM B100 MAN
+10081 ; [.2447.0020.0002.10081] # LINEAR B IDEOGRAM B102 WOMAN
+10082 ; [.2448.0020.0002.10082] # LINEAR B IDEOGRAM B104 DEER
+10083 ; [.2449.0020.0002.10083] # LINEAR B IDEOGRAM B105 EQUID
+10084 ; [.244A.0020.0002.10084] # LINEAR B IDEOGRAM B105F MARE
+10085 ; [.244B.0020.0002.10085] # LINEAR B IDEOGRAM B105M STALLION
+10086 ; [.244C.0020.0002.10086] # LINEAR B IDEOGRAM B106F EWE
+10087 ; [.244D.0020.0002.10087] # LINEAR B IDEOGRAM B106M RAM
+10088 ; [.244E.0020.0002.10088] # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089 ; [.244F.0020.0002.10089] # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A ; [.2450.0020.0002.1008A] # LINEAR B IDEOGRAM B108F SOW
+1008B ; [.2451.0020.0002.1008B] # LINEAR B IDEOGRAM B108M BOAR
+1008C ; [.2452.0020.0002.1008C] # LINEAR B IDEOGRAM B109F COW
+1008D ; [.2453.0020.0002.1008D] # LINEAR B IDEOGRAM B109M BULL
+1008E ; [.2454.0020.0002.1008E] # LINEAR B IDEOGRAM B120 WHEAT
+1008F ; [.2455.0020.0002.1008F] # LINEAR B IDEOGRAM B121 BARLEY
+10090 ; [.2456.0020.0002.10090] # LINEAR B IDEOGRAM B122 OLIVE
+10091 ; [.2457.0020.0002.10091] # LINEAR B IDEOGRAM B123 SPICE
+10092 ; [.2458.0020.0002.10092] # LINEAR B IDEOGRAM B125 CYPERUS
+10093 ; [.2459.0020.0002.10093] # LINEAR B MONOGRAM B127 KAPO
+10094 ; [.245A.0020.0002.10094] # LINEAR B MONOGRAM B128 KANAKO
+10095 ; [.245B.0020.0002.10095] # LINEAR B IDEOGRAM B130 OIL
+10096 ; [.245C.0020.0002.10096] # LINEAR B IDEOGRAM B131 WINE
+10097 ; [.245D.0020.0002.10097] # LINEAR B IDEOGRAM B132
+10098 ; [.245E.0020.0002.10098] # LINEAR B MONOGRAM B133 AREPA
+10099 ; [.245F.0020.0002.10099] # LINEAR B MONOGRAM B135 MERI
+1009A ; [.2460.0020.0002.1009A] # LINEAR B IDEOGRAM B140 BRONZE
+1009B ; [.2461.0020.0002.1009B] # LINEAR B IDEOGRAM B141 GOLD
+1009C ; [.2462.0020.0002.1009C] # LINEAR B IDEOGRAM B142
+1009D ; [.2463.0020.0002.1009D] # LINEAR B IDEOGRAM B145 WOOL
+1009E ; [.2464.0020.0002.1009E] # LINEAR B IDEOGRAM B146
+1009F ; [.2465.0020.0002.1009F] # LINEAR B IDEOGRAM B150
+100A0 ; [.2466.0020.0002.100A0] # LINEAR B IDEOGRAM B151 HORN
+100A1 ; [.2467.0020.0002.100A1] # LINEAR B IDEOGRAM B152
+100A2 ; [.2468.0020.0002.100A2] # LINEAR B IDEOGRAM B153
+100A3 ; [.2469.0020.0002.100A3] # LINEAR B IDEOGRAM B154
+100A4 ; [.246A.0020.0002.100A4] # LINEAR B MONOGRAM B156 TURO2
+100A5 ; [.246B.0020.0002.100A5] # LINEAR B IDEOGRAM B157
+100A6 ; [.246C.0020.0002.100A6] # LINEAR B IDEOGRAM B158
+100A7 ; [.246D.0020.0002.100A7] # LINEAR B IDEOGRAM B159 CLOTH
+100A8 ; [.246E.0020.0002.100A8] # LINEAR B IDEOGRAM B160
+100A9 ; [.246F.0020.0002.100A9] # LINEAR B IDEOGRAM B161
+100AA ; [.2470.0020.0002.100AA] # LINEAR B IDEOGRAM B162 GARMENT
+100AB ; [.2471.0020.0002.100AB] # LINEAR B IDEOGRAM B163 ARMOUR
+100AC ; [.2472.0020.0002.100AC] # LINEAR B IDEOGRAM B164
+100AD ; [.2473.0020.0002.100AD] # LINEAR B IDEOGRAM B165
+100AE ; [.2474.0020.0002.100AE] # LINEAR B IDEOGRAM B166
+100AF ; [.2475.0020.0002.100AF] # LINEAR B IDEOGRAM B167
+100B0 ; [.2476.0020.0002.100B0] # LINEAR B IDEOGRAM B168
+100B1 ; [.2477.0020.0002.100B1] # LINEAR B IDEOGRAM B169
+100B2 ; [.2478.0020.0002.100B2] # LINEAR B IDEOGRAM B170
+100B3 ; [.2479.0020.0002.100B3] # LINEAR B IDEOGRAM B171
+100B4 ; [.247A.0020.0002.100B4] # LINEAR B IDEOGRAM B172
+100B5 ; [.247B.0020.0002.100B5] # LINEAR B IDEOGRAM B173 MONTH
+100B6 ; [.247C.0020.0002.100B6] # LINEAR B IDEOGRAM B174
+100B7 ; [.247D.0020.0002.100B7] # LINEAR B IDEOGRAM B176 TREE
+100B8 ; [.247E.0020.0002.100B8] # LINEAR B IDEOGRAM B177
+100B9 ; [.247F.0020.0002.100B9] # LINEAR B IDEOGRAM B178
+100BA ; [.2480.0020.0002.100BA] # LINEAR B IDEOGRAM B179
+100BB ; [.2481.0020.0002.100BB] # LINEAR B IDEOGRAM B180
+100BC ; [.2482.0020.0002.100BC] # LINEAR B IDEOGRAM B181
+100BD ; [.2483.0020.0002.100BD] # LINEAR B IDEOGRAM B182
+100BE ; [.2484.0020.0002.100BE] # LINEAR B IDEOGRAM B183
+100BF ; [.2485.0020.0002.100BF] # LINEAR B IDEOGRAM B184
+100C0 ; [.2486.0020.0002.100C0] # LINEAR B IDEOGRAM B185
+100C1 ; [.2487.0020.0002.100C1] # LINEAR B IDEOGRAM B189
+100C2 ; [.2488.0020.0002.100C2] # LINEAR B IDEOGRAM B190
+100C3 ; [.2489.0020.0002.100C3] # LINEAR B IDEOGRAM B191 HELMET
+100C4 ; [.248A.0020.0002.100C4] # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5 ; [.248B.0020.0002.100C5] # LINEAR B IDEOGRAM B225 BATHTUB
+100C6 ; [.248C.0020.0002.100C6] # LINEAR B IDEOGRAM B230 SPEAR
+100C7 ; [.248D.0020.0002.100C7] # LINEAR B IDEOGRAM B231 ARROW
+100C8 ; [.248E.0020.0002.100C8] # LINEAR B IDEOGRAM B232
+100C9 ; [.248F.0020.0002.100C9] # LINEAR B IDEOGRAM B233 SWORD
+100CA ; [.2490.0020.0002.100CA] # LINEAR B IDEOGRAM B234
+100CB ; [.2491.0020.0002.100CB] # LINEAR B IDEOGRAM B236
+100CC ; [.2492.0020.0002.100CC] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD ; [.2493.0020.0002.100CD] # LINEAR B IDEOGRAM B241 CHARIOT
+100CE ; [.2494.0020.0002.100CE] # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF ; [.2495.0020.0002.100CF] # LINEAR B IDEOGRAM B243 WHEEL
+100D0 ; [.2496.0020.0002.100D0] # LINEAR B IDEOGRAM B245
+100D1 ; [.2497.0020.0002.100D1] # LINEAR B IDEOGRAM B246
+100D2 ; [.2498.0020.0002.100D2] # LINEAR B MONOGRAM B247 DIPTE
+100D3 ; [.2499.0020.0002.100D3] # LINEAR B IDEOGRAM B248
+100D4 ; [.249A.0020.0002.100D4] # LINEAR B IDEOGRAM B249
+100D5 ; [.249B.0020.0002.100D5] # LINEAR B IDEOGRAM B251
+100D6 ; [.249C.0020.0002.100D6] # LINEAR B IDEOGRAM B252
+100D7 ; [.249D.0020.0002.100D7] # LINEAR B IDEOGRAM B253
+100D8 ; [.249E.0020.0002.100D8] # LINEAR B IDEOGRAM B254 DART
+100D9 ; [.249F.0020.0002.100D9] # LINEAR B IDEOGRAM B255
+100DA ; [.24A0.0020.0002.100DA] # LINEAR B IDEOGRAM B256
+100DB ; [.24A1.0020.0002.100DB] # LINEAR B IDEOGRAM B257
+100DC ; [.24A2.0020.0002.100DC] # LINEAR B IDEOGRAM B258
+100DD ; [.24A3.0020.0002.100DD] # LINEAR B IDEOGRAM B259
+100DE ; [.24A4.0020.0002.100DE] # LINEAR B IDEOGRAM VESSEL B155
+100DF ; [.24A5.0020.0002.100DF] # LINEAR B IDEOGRAM VESSEL B200
+100E0 ; [.24A6.0020.0002.100E0] # LINEAR B IDEOGRAM VESSEL B201
+100E1 ; [.24A7.0020.0002.100E1] # LINEAR B IDEOGRAM VESSEL B202
+100E2 ; [.24A8.0020.0002.100E2] # LINEAR B IDEOGRAM VESSEL B203
+100E3 ; [.24A9.0020.0002.100E3] # LINEAR B IDEOGRAM VESSEL B204
+100E4 ; [.24AA.0020.0002.100E4] # LINEAR B IDEOGRAM VESSEL B205
+100E5 ; [.24AB.0020.0002.100E5] # LINEAR B IDEOGRAM VESSEL B206
+100E6 ; [.24AC.0020.0002.100E6] # LINEAR B IDEOGRAM VESSEL B207
+100E7 ; [.24AD.0020.0002.100E7] # LINEAR B IDEOGRAM VESSEL B208
+100E8 ; [.24AE.0020.0002.100E8] # LINEAR B IDEOGRAM VESSEL B209
+100E9 ; [.24AF.0020.0002.100E9] # LINEAR B IDEOGRAM VESSEL B210
+100EA ; [.24B0.0020.0002.100EA] # LINEAR B IDEOGRAM VESSEL B211
+100EB ; [.24B1.0020.0002.100EB] # LINEAR B IDEOGRAM VESSEL B212
+100EC ; [.24B2.0020.0002.100EC] # LINEAR B IDEOGRAM VESSEL B213
+100ED ; [.24B3.0020.0002.100ED] # LINEAR B IDEOGRAM VESSEL B214
+100EE ; [.24B4.0020.0002.100EE] # LINEAR B IDEOGRAM VESSEL B215
+100EF ; [.24B5.0020.0002.100EF] # LINEAR B IDEOGRAM VESSEL B216
+100F0 ; [.24B6.0020.0002.100F0] # LINEAR B IDEOGRAM VESSEL B217
+100F1 ; [.24B7.0020.0002.100F1] # LINEAR B IDEOGRAM VESSEL B218
+100F2 ; [.24B8.0020.0002.100F2] # LINEAR B IDEOGRAM VESSEL B219
+100F3 ; [.24B9.0020.0002.100F3] # LINEAR B IDEOGRAM VESSEL B221
+100F4 ; [.24BA.0020.0002.100F4] # LINEAR B IDEOGRAM VESSEL B222
+100F5 ; [.24BB.0020.0002.100F5] # LINEAR B IDEOGRAM VESSEL B226
+100F6 ; [.24BC.0020.0002.100F6] # LINEAR B IDEOGRAM VESSEL B227
+100F7 ; [.24BD.0020.0002.100F7] # LINEAR B IDEOGRAM VESSEL B228
+100F8 ; [.24BE.0020.0002.100F8] # LINEAR B IDEOGRAM VESSEL B229
+100F9 ; [.24BF.0020.0002.100F9] # LINEAR B IDEOGRAM VESSEL B250
+100FA ; [.24C0.0020.0002.100FA] # LINEAR B IDEOGRAM VESSEL B305
+10800 ; [.24C1.0020.0002.10800] # CYPRIOT SYLLABLE A
+10801 ; [.24C2.0020.0002.10801] # CYPRIOT SYLLABLE E
+10802 ; [.24C3.0020.0002.10802] # CYPRIOT SYLLABLE I
+10803 ; [.24C4.0020.0002.10803] # CYPRIOT SYLLABLE O
+10804 ; [.24C5.0020.0002.10804] # CYPRIOT SYLLABLE U
+10805 ; [.24C6.0020.0002.10805] # CYPRIOT SYLLABLE JA
+10808 ; [.24C7.0020.0002.10808] # CYPRIOT SYLLABLE JO
+1080A ; [.24C8.0020.0002.1080A] # CYPRIOT SYLLABLE KA
+1080B ; [.24C9.0020.0002.1080B] # CYPRIOT SYLLABLE KE
+1080C ; [.24CA.0020.0002.1080C] # CYPRIOT SYLLABLE KI
+1080D ; [.24CB.0020.0002.1080D] # CYPRIOT SYLLABLE KO
+1080E ; [.24CC.0020.0002.1080E] # CYPRIOT SYLLABLE KU
+1080F ; [.24CD.0020.0002.1080F] # CYPRIOT SYLLABLE LA
+10810 ; [.24CE.0020.0002.10810] # CYPRIOT SYLLABLE LE
+10811 ; [.24CF.0020.0002.10811] # CYPRIOT SYLLABLE LI
+10812 ; [.24D0.0020.0002.10812] # CYPRIOT SYLLABLE LO
+10813 ; [.24D1.0020.0002.10813] # CYPRIOT SYLLABLE LU
+10814 ; [.24D2.0020.0002.10814] # CYPRIOT SYLLABLE MA
+10815 ; [.24D3.0020.0002.10815] # CYPRIOT SYLLABLE ME
+10816 ; [.24D4.0020.0002.10816] # CYPRIOT SYLLABLE MI
+10817 ; [.24D5.0020.0002.10817] # CYPRIOT SYLLABLE MO
+10818 ; [.24D6.0020.0002.10818] # CYPRIOT SYLLABLE MU
+10819 ; [.24D7.0020.0002.10819] # CYPRIOT SYLLABLE NA
+1081A ; [.24D8.0020.0002.1081A] # CYPRIOT SYLLABLE NE
+1081B ; [.24D9.0020.0002.1081B] # CYPRIOT SYLLABLE NI
+1081C ; [.24DA.0020.0002.1081C] # CYPRIOT SYLLABLE NO
+1081D ; [.24DB.0020.0002.1081D] # CYPRIOT SYLLABLE NU
+1081E ; [.24DC.0020.0002.1081E] # CYPRIOT SYLLABLE PA
+1081F ; [.24DD.0020.0002.1081F] # CYPRIOT SYLLABLE PE
+10820 ; [.24DE.0020.0002.10820] # CYPRIOT SYLLABLE PI
+10821 ; [.24DF.0020.0002.10821] # CYPRIOT SYLLABLE PO
+10822 ; [.24E0.0020.0002.10822] # CYPRIOT SYLLABLE PU
+10823 ; [.24E1.0020.0002.10823] # CYPRIOT SYLLABLE RA
+10824 ; [.24E2.0020.0002.10824] # CYPRIOT SYLLABLE RE
+10825 ; [.24E3.0020.0002.10825] # CYPRIOT SYLLABLE RI
+10826 ; [.24E4.0020.0002.10826] # CYPRIOT SYLLABLE RO
+10827 ; [.24E5.0020.0002.10827] # CYPRIOT SYLLABLE RU
+10828 ; [.24E6.0020.0002.10828] # CYPRIOT SYLLABLE SA
+10829 ; [.24E7.0020.0002.10829] # CYPRIOT SYLLABLE SE
+1082A ; [.24E8.0020.0002.1082A] # CYPRIOT SYLLABLE SI
+1082B ; [.24E9.0020.0002.1082B] # CYPRIOT SYLLABLE SO
+1082C ; [.24EA.0020.0002.1082C] # CYPRIOT SYLLABLE SU
+1082D ; [.24EB.0020.0002.1082D] # CYPRIOT SYLLABLE TA
+1082E ; [.24EC.0020.0002.1082E] # CYPRIOT SYLLABLE TE
+1082F ; [.24ED.0020.0002.1082F] # CYPRIOT SYLLABLE TI
+10830 ; [.24EE.0020.0002.10830] # CYPRIOT SYLLABLE TO
+10831 ; [.24EF.0020.0002.10831] # CYPRIOT SYLLABLE TU
+10832 ; [.24F0.0020.0002.10832] # CYPRIOT SYLLABLE WA
+10833 ; [.24F1.0020.0002.10833] # CYPRIOT SYLLABLE WE
+10834 ; [.24F2.0020.0002.10834] # CYPRIOT SYLLABLE WI
+10835 ; [.24F3.0020.0002.10835] # CYPRIOT SYLLABLE WO
+10837 ; [.24F4.0020.0002.10837] # CYPRIOT SYLLABLE XA
+10838 ; [.24F5.0020.0002.10838] # CYPRIOT SYLLABLE XE
+1083C ; [.24F6.0020.0002.1083C] # CYPRIOT SYLLABLE ZA
+1083F ; [.24F7.0020.0002.1083F] # CYPRIOT SYLLABLE ZO
+10380 ; [.24F8.0020.0002.10380] # UGARITIC LETTER ALPA
+10381 ; [.24F9.0020.0002.10381] # UGARITIC LETTER BETA
+10382 ; [.24FA.0020.0002.10382] # UGARITIC LETTER GAMLA
+10383 ; [.24FB.0020.0002.10383] # UGARITIC LETTER KHA
+10384 ; [.24FC.0020.0002.10384] # UGARITIC LETTER DELTA
+10385 ; [.24FD.0020.0002.10385] # UGARITIC LETTER HO
+10386 ; [.24FE.0020.0002.10386] # UGARITIC LETTER WO
+10387 ; [.24FF.0020.0002.10387] # UGARITIC LETTER ZETA
+10388 ; [.2500.0020.0002.10388] # UGARITIC LETTER HOTA
+10389 ; [.2501.0020.0002.10389] # UGARITIC LETTER TET
+1038A ; [.2502.0020.0002.1038A] # UGARITIC LETTER YOD
+1038B ; [.2503.0020.0002.1038B] # UGARITIC LETTER KAF
+1038C ; [.2504.0020.0002.1038C] # UGARITIC LETTER SHIN
+1038D ; [.2505.0020.0002.1038D] # UGARITIC LETTER LAMDA
+1038E ; [.2506.0020.0002.1038E] # UGARITIC LETTER MEM
+1038F ; [.2507.0020.0002.1038F] # UGARITIC LETTER DHAL
+10390 ; [.2508.0020.0002.10390] # UGARITIC LETTER NUN
+10391 ; [.2509.0020.0002.10391] # UGARITIC LETTER ZU
+10392 ; [.250A.0020.0002.10392] # UGARITIC LETTER SAMKA
+10393 ; [.250B.0020.0002.10393] # UGARITIC LETTER AIN
+10394 ; [.250C.0020.0002.10394] # UGARITIC LETTER PU
+10395 ; [.250D.0020.0002.10395] # UGARITIC LETTER SADE
+10396 ; [.250E.0020.0002.10396] # UGARITIC LETTER QOPA
+10397 ; [.250F.0020.0002.10397] # UGARITIC LETTER RASHA
+10398 ; [.2510.0020.0002.10398] # UGARITIC LETTER THANNA
+10399 ; [.2511.0020.0002.10399] # UGARITIC LETTER GHAIN
+1039A ; [.2512.0020.0002.1039A] # UGARITIC LETTER TO
+1039B ; [.2513.0020.0002.1039B] # UGARITIC LETTER I
+1039C ; [.2514.0020.0002.1039C] # UGARITIC LETTER U
+1039D ; [.2515.0020.0002.1039D] # UGARITIC LETTER SSU
+2F00 ; [.FB40.0020.0004.4E00][.CE00.0000.0000.4E00] # KANGXI RADICAL ONE; QQK
+3220 ; [*0288.0020.0004.3220][.FB40.0020.0004.4E00][.CE00.0000.0000.4E00][*0289.0020.001F.3220] # PARENTHESIZED IDEOGRAPH ONE; QQKN
+3280 ; [.FB40.0020.0006.4E00][.CE00.0000.0000.4E00] # CIRCLED IDEOGRAPH ONE; QQK
+3192 ; [.FB40.0020.0014.4E00][.CE00.0000.0000.4E00] # IDEOGRAPHIC ANNOTATION ONE MARK; QQK
+319C ; [.FB40.0020.0014.4E01][.CE01.0000.0000.4E01] # IDEOGRAPHIC ANNOTATION FOURTH MARK; QQK
+3226 ; [*0288.0020.0004.3226][.FB40.0020.0004.4E03][.CE03.0000.0000.4E03][*0289.0020.001F.3226] # PARENTHESIZED IDEOGRAPH SEVEN; QQKN
+3286 ; [.FB40.0020.0006.4E03][.CE03.0000.0000.4E03] # CIRCLED IDEOGRAPH SEVEN; QQK
+3222 ; [*0288.0020.0004.3222][.FB40.0020.0004.4E09][.CE09.0000.0000.4E09][*0289.0020.001F.3222] # PARENTHESIZED IDEOGRAPH THREE; QQKN
+3282 ; [.FB40.0020.0006.4E09][.CE09.0000.0000.4E09] # CIRCLED IDEOGRAPH THREE; QQK
+3194 ; [.FB40.0020.0014.4E09][.CE09.0000.0000.4E09] # IDEOGRAPHIC ANNOTATION THREE MARK; QQK
+32A4 ; [.FB40.0020.0006.4E0A][.CE0A.0000.0000.4E0A] # CIRCLED IDEOGRAPH HIGH; QQK
+3196 ; [.FB40.0020.0014.4E0A][.CE0A.0000.0000.4E0A] # IDEOGRAPHIC ANNOTATION TOP MARK; QQK
+32A6 ; [.FB40.0020.0006.4E0B][.CE0B.0000.0000.4E0B] # CIRCLED IDEOGRAPH LOW; QQK
+3198 ; [.FB40.0020.0014.4E0B][.CE0B.0000.0000.4E0B] # IDEOGRAPHIC ANNOTATION BOTTOM MARK; QQK
+F967 ; [.FB40.0020.0002.4E0D][.CE0D.0000.0000.4E0D] # CJK COMPATIBILITY IDEOGRAPH-F967; QQC
+319B ; [.FB40.0020.0014.4E19][.CE19.0000.0000.4E19] # IDEOGRAPHIC ANNOTATION THIRD MARK; QQK
+2F01 ; [.FB40.0020.0004.4E28][.CE28.0000.0000.4E28] # KANGXI RADICAL LINE; QQK
+2EA6 ; [.FB40.0020.0004.4E2C][.CE2C.0000.0000.4E2C] # CJK RADICAL SIMPLIFIED HALF TREE TRUNK; QQK
+32A5 ; [.FB40.0020.0006.4E2D][.CE2D.0000.0000.4E2D] # CIRCLED IDEOGRAPH CENTRE; QQK
+3197 ; [.FB40.0020.0014.4E2D][.CE2D.0000.0000.4E2D] # IDEOGRAPHIC ANNOTATION MIDDLE MARK; QQK
+F905 ; [.FB40.0020.0002.4E32][.CE32.0000.0000.4E32] # CJK COMPATIBILITY IDEOGRAPH-F905; QQC
+2F02 ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36] # KANGXI RADICAL DOT; QQK
+2E80 ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36][.0000.015D.001F.2E80] # CJK RADICAL REPEAT; QQKN
+2F801 ; [.FB40.0020.0002.4E38][.CE38.0000.0000.4E38] # CJK COMPATIBILITY IDEOGRAPH-2F801; QQC
+F95E ; [.FB40.0020.0002.4E39][.CE39.0000.0000.4E39] # CJK COMPATIBILITY IDEOGRAPH-F95E; QQC
+2F800 ; [.FB40.0020.0002.4E3D][.CE3D.0000.0000.4E3D] # CJK COMPATIBILITY IDEOGRAPH-2F800; QQC
+2F03 ; [.FB40.0020.0004.4E3F][.CE3F.0000.0000.4E3F] # KANGXI RADICAL SLASH; QQK
+2F802 ; [.FB40.0020.0002.4E41][.CE41.0000.0000.4E41] # CJK COMPATIBILITY IDEOGRAPH-2F802; QQC
+2F04 ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59] # KANGXI RADICAL SECOND; QQK
+319A ; [.FB40.0020.0014.4E59][.CE59.0000.0000.4E59] # IDEOGRAPHIC ANNOTATION SECOND MARK; QQK
+2E84 ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59][.0000.015D.001F.2E84] # CJK RADICAL SECOND THREE; QQKN
+2E83 ; [.FB40.0020.0004.4E5A][.CE5A.0000.0000.4E5A] # CJK RADICAL SECOND TWO; QQK
+2E82 ; [.FB40.0020.0004.4E5B][.CE5B.0000.0000.4E5B] # CJK RADICAL SECOND ONE; QQK
+3228 ; [*0288.0020.0004.3228][.FB40.0020.0004.4E5D][.CE5D.0000.0000.4E5D][*0289.0020.001F.3228] # PARENTHESIZED IDEOGRAPH NINE; QQKN
+3288 ; [.FB40.0020.0006.4E5D][.CE5D.0000.0000.4E5D] # CIRCLED IDEOGRAPH NINE; QQK
+F91B ; [.FB40.0020.0002.4E82][.CE82.0000.0000.4E82] # CJK COMPATIBILITY IDEOGRAPH-F91B; QQC
+2F05 ; [.FB40.0020.0004.4E85][.CE85.0000.0000.4E85] # KANGXI RADICAL HOOK; QQK
+F9BA ; [.FB40.0020.0002.4E86][.CE86.0000.0000.4E86] # CJK COMPATIBILITY IDEOGRAPH-F9BA; QQC
+2F06 ; [.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C] # KANGXI RADICAL TWO; QQK
+3221 ; [*0288.0020.0004.3221][.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C][*0289.0020.001F.3221] # PARENTHESIZED IDEOGRAPH TWO; QQKN
+3281 ; [.FB40.0020.0006.4E8C][.CE8C.0000.0000.4E8C] # CIRCLED IDEOGRAPH TWO; QQK
+3193 ; [.FB40.0020.0014.4E8C][.CE8C.0000.0000.4E8C] # IDEOGRAPHIC ANNOTATION TWO MARK; QQK
+3224 ; [*0288.0020.0004.3224][.FB40.0020.0004.4E94][.CE94.0000.0000.4E94][*0289.0020.001F.3224] # PARENTHESIZED IDEOGRAPH FIVE; QQKN
+3284 ; [.FB40.0020.0006.4E94][.CE94.0000.0000.4E94] # CIRCLED IDEOGRAPH FIVE; QQK
+2F07 ; [.FB40.0020.0004.4EA0][.CEA0.0000.0000.4EA0] # KANGXI RADICAL LID; QQK
+F977 ; [.FB40.0020.0002.4EAE][.CEAE.0000.0000.4EAE] # CJK COMPATIBILITY IDEOGRAPH-F977; QQC
+2F08 ; [.FB40.0020.0004.4EBA][.CEBA.0000.0000.4EBA] # KANGXI RADICAL MAN; QQK
+319F ; [.FB40.0020.0014.4EBA][.CEBA.0000.0000.4EBA] # IDEOGRAPHIC ANNOTATION MAN MARK; QQK
+2E85 ; [.FB40.0020.0004.4EBB][.CEBB.0000.0000.4EBB] # CJK RADICAL PERSON; QQK
+F9FD ; [.FB40.0020.0002.4EC0][.CEC0.0000.0000.4EC0] # CJK COMPATIBILITY IDEOGRAPH-F9FD; QQC
+2F819 ; [.FB40.0020.0002.4ECC][.CECC.0000.0000.4ECC] # CJK COMPATIBILITY IDEOGRAPH-2F819; QQC
+3239 ; [*0288.0020.0004.3239][.FB40.0020.0004.4EE3][.CEE3.0000.0000.4EE3][*0289.0020.001F.3239] # PARENTHESIZED IDEOGRAPH REPRESENT; QQKN
+F9A8 ; [.FB40.0020.0002.4EE4][.CEE4.0000.0000.4EE4] # CJK COMPATIBILITY IDEOGRAPH-F9A8; QQC
+323D ; [*0288.0020.0004.323D][.FB40.0020.0004.4F01][.CF01.0000.0000.4F01][*0289.0020.001F.323D] # PARENTHESIZED IDEOGRAPH ENTERPRISE; QQKN
+32AD ; [.FB40.0020.0006.4F01][.CF01.0000.0000.4F01] # CIRCLED IDEOGRAPH ENTERPRISE; QQK
+3241 ; [*0288.0020.0004.3241][.FB40.0020.0004.4F11][.CF11.0000.0000.4F11][*0289.0020.001F.3241] # PARENTHESIZED IDEOGRAPH REST; QQKN
+32A1 ; [.FB40.0020.0006.4F11][.CF11.0000.0000.4F11] # CIRCLED IDEOGRAPH REST; QQK
+2F804 ; [.FB40.0020.0002.4F60][.CF60.0000.0000.4F60] # CJK COMPATIBILITY IDEOGRAPH-2F804; QQC
+F92D ; [.FB40.0020.0002.4F86][.CF86.0000.0000.4F86] # CJK COMPATIBILITY IDEOGRAPH-F92D; QQC
+F9B5 ; [.FB40.0020.0002.4F8B][.CF8B.0000.0000.4F8B] # CJK COMPATIBILITY IDEOGRAPH-F9B5; QQC
+FA30 ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-FA30; QQC
+2F805 ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-2F805; QQC
+2F806 ; [.FB40.0020.0002.4FBB][.CFBB.0000.0000.4FBB] # CJK COMPATIBILITY IDEOGRAPH-2F806; QQC
+F965 ; [.FB40.0020.0002.4FBF][.CFBF.0000.0000.4FBF] # CJK COMPATIBILITY IDEOGRAPH-F965; QQC
+2F807 ; [.FB40.0020.0002.5002][.D002.0000.0000.5002] # CJK COMPATIBILITY IDEOGRAPH-2F807; QQC
+F9D4 ; [.FB40.0020.0002.502B][.D02B.0000.0000.502B] # CJK COMPATIBILITY IDEOGRAPH-F9D4; QQC
+2F808 ; [.FB40.0020.0002.507A][.D07A.0000.0000.507A] # CJK COMPATIBILITY IDEOGRAPH-2F808; QQC
+2F809 ; [.FB40.0020.0002.5099][.D099.0000.0000.5099] # CJK COMPATIBILITY IDEOGRAPH-2F809; QQC
+2F80B ; [.FB40.0020.0002.50CF][.D0CF.0000.0000.50CF] # CJK COMPATIBILITY IDEOGRAPH-2F80B; QQC
+F9BB ; [.FB40.0020.0002.50DA][.D0DA.0000.0000.50DA] # CJK COMPATIBILITY IDEOGRAPH-F9BB; QQC
+FA31 ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-FA31; QQC
+2F80A ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-2F80A; QQC
+329D ; [.FB40.0020.0006.512A][.D12A.0000.0000.512A] # CIRCLED IDEOGRAPH EXCELLENT; QQK
+2F09 ; [.FB40.0020.0004.513F][.D13F.0000.0000.513F] # KANGXI RADICAL LEGS; QQK
+FA0C ; [.FB40.0020.0002.5140][.D140.0000.0000.5140] # CJK COMPATIBILITY IDEOGRAPH-FA0C; QQC
+FA32 ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-FA32; QQC
+2F80E ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-2F80E; QQC
+2F80F ; [.FB40.0020.0002.5154][.D154.0000.0000.5154] # CJK COMPATIBILITY IDEOGRAPH-2F80F; QQC
+2F810 ; [.FB40.0020.0002.5164][.D164.0000.0000.5164] # CJK COMPATIBILITY IDEOGRAPH-2F810; QQC
+2F0A ; [.FB40.0020.0004.5165][.D165.0000.0000.5165] # KANGXI RADICAL ENTER; QQK
+2F814 ; [.FB40.0020.0002.5167][.D167.0000.0000.5167] # CJK COMPATIBILITY IDEOGRAPH-2F814; QQC
+F978 ; [.FB40.0020.0002.5169][.D169.0000.0000.5169] # CJK COMPATIBILITY IDEOGRAPH-F978; QQC
+2F0B ; [.FB40.0020.0004.516B][.D16B.0000.0000.516B] # KANGXI RADICAL EIGHT; QQK
+3227 ; [*0288.0020.0004.3227][.FB40.0020.0004.516B][.D16B.0000.0000.516B][*0289.0020.001F.3227] # PARENTHESIZED IDEOGRAPH EIGHT; QQKN
+3287 ; [.FB40.0020.0006.516B][.D16B.0000.0000.516B] # CIRCLED IDEOGRAPH EIGHT; QQK
+F9D1 ; [.FB40.0020.0002.516D][.D16D.0000.0000.516D] # CJK COMPATIBILITY IDEOGRAPH-F9D1; QQC
+3225 ; [*0288.0020.0004.3225][.FB40.0020.0004.516D][.D16D.0000.0000.516D][*0289.0020.001F.3225] # PARENTHESIZED IDEOGRAPH SIX; QQKN
+3285 ; [.FB40.0020.0006.516D][.D16D.0000.0000.516D] # CIRCLED IDEOGRAPH SIX; QQK
+2F811 ; [.FB40.0020.0002.5177][.D177.0000.0000.5177] # CJK COMPATIBILITY IDEOGRAPH-2F811; QQC
+2F0C ; [.FB40.0020.0004.5182][.D182.0000.0000.5182] # KANGXI RADICAL DOWN BOX; QQK
+2E86 ; [.FB40.0020.0004.5182][.D182.0000.0000.5182][.0000.015D.001F.2E86] # CJK RADICAL BOX; QQKN
+2F815 ; [.FB40.0020.0002.518D][.D18D.0000.0000.518D] # CJK COMPATIBILITY IDEOGRAPH-2F815; QQC
+2F8D2 ; [.FB40.0020.0002.5192][.D192.0000.0000.5192] # CJK COMPATIBILITY IDEOGRAPH-2F8D2; QQC
+2F8D3 ; [.FB40.0020.0002.5195][.D195.0000.0000.5195] # CJK COMPATIBILITY IDEOGRAPH-2F8D3; QQC
+2F0D ; [.FB40.0020.0004.5196][.D196.0000.0000.5196] # KANGXI RADICAL COVER; QQK
+2F817 ; [.FB40.0020.0002.5197][.D197.0000.0000.5197] # CJK COMPATIBILITY IDEOGRAPH-2F817; QQC
+32A2 ; [.FB40.0020.0006.5199][.D199.0000.0000.5199] # CIRCLED IDEOGRAPH COPY; QQK
+2F818 ; [.FB40.0020.0002.51A4][.D1A4.0000.0000.51A4] # CJK COMPATIBILITY IDEOGRAPH-2F818; QQC
+2F0E ; [.FB40.0020.0004.51AB][.D1AB.0000.0000.51AB] # KANGXI RADICAL ICE; QQK
+2F81A ; [.FB40.0020.0002.51AC][.D1AC.0000.0000.51AC] # CJK COMPATIBILITY IDEOGRAPH-2F81A; QQC
+2F81B ; [.FB40.0020.0002.51B5][.D1B5.0000.0000.51B5] # CJK COMPATIBILITY IDEOGRAPH-2F81B; QQC
+F92E ; [.FB40.0020.0002.51B7][.D1B7.0000.0000.51B7] # CJK COMPATIBILITY IDEOGRAPH-F92E; QQC
+F979 ; [.FB40.0020.0002.51C9][.D1C9.0000.0000.51C9] # CJK COMPATIBILITY IDEOGRAPH-F979; QQC
+F955 ; [.FB40.0020.0002.51CC][.D1CC.0000.0000.51CC] # CJK COMPATIBILITY IDEOGRAPH-F955; QQC
+F954 ; [.FB40.0020.0002.51DC][.D1DC.0000.0000.51DC] # CJK COMPATIBILITY IDEOGRAPH-F954; QQC
+FA15 ; [.FB40.0020.0002.51DE][.D1DE.0000.0000.51DE] # CJK COMPATIBILITY IDEOGRAPH-FA15; QQC
+2F0F ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0] # KANGXI RADICAL TABLE; QQK
+2E87 ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0][.0000.015D.001F.2E87] # CJK RADICAL TABLE; QQKN
+2F81D ; [.FB40.0020.0002.51F5][.D1F5.0000.0000.51F5] # CJK COMPATIBILITY IDEOGRAPH-2F81D; QQC
+2F10 ; [.FB40.0020.0004.51F5][.D1F5.0000.0000.51F5] # KANGXI RADICAL OPEN BOX; QQK
+2F11 ; [.FB40.0020.0004.5200][.D200.0000.0000.5200] # KANGXI RADICAL KNIFE; QQK
+2E88 ; [.FB40.0020.0004.5200][.D200.0000.0000.5200][.0000.015D.001F.2E88] # CJK RADICAL KNIFE ONE; QQKN
+2E89 ; [.FB40.0020.0004.5202][.D202.0000.0000.5202] # CJK RADICAL KNIFE TWO; QQK
+2F81E ; [.FB40.0020.0002.5203][.D203.0000.0000.5203] # CJK COMPATIBILITY IDEOGRAPH-2F81E; QQC
+FA00 ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-FA00; QQC
+2F850 ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-2F850; QQC
+F99C ; [.FB40.0020.0002.5217][.D217.0000.0000.5217] # CJK COMPATIBILITY IDEOGRAPH-F99C; QQC
+F9DD ; [.FB40.0020.0002.5229][.D229.0000.0000.5229] # CJK COMPATIBILITY IDEOGRAPH-F9DD; QQC
+F9FF ; [.FB40.0020.0002.523A][.D23A.0000.0000.523A] # CJK COMPATIBILITY IDEOGRAPH-F9FF; QQC
+2F820 ; [.FB40.0020.0002.523B][.D23B.0000.0000.523B] # CJK COMPATIBILITY IDEOGRAPH-2F820; QQC
+2F821 ; [.FB40.0020.0002.5246][.D246.0000.0000.5246] # CJK COMPATIBILITY IDEOGRAPH-2F821; QQC
+2F822 ; [.FB40.0020.0002.5272][.D272.0000.0000.5272] # CJK COMPATIBILITY IDEOGRAPH-2F822; QQC
+2F823 ; [.FB40.0020.0002.5277][.D277.0000.0000.5277] # CJK COMPATIBILITY IDEOGRAPH-2F823; QQC
+F9C7 ; [.FB40.0020.0002.5289][.D289.0000.0000.5289] # CJK COMPATIBILITY IDEOGRAPH-F9C7; QQC
+F98A ; [.FB40.0020.0002.529B][.D29B.0000.0000.529B] # CJK COMPATIBILITY IDEOGRAPH-F98A; QQC
+2F12 ; [.FB40.0020.0004.529B][.D29B.0000.0000.529B] # KANGXI RADICAL POWER; QQK
+F99D ; [.FB40.0020.0002.52A3][.D2A3.0000.0000.52A3] # CJK COMPATIBILITY IDEOGRAPH-F99D; QQC
+2F992 ; [.FB40.0020.0002.52B3][.D2B3.0000.0000.52B3] # CJK COMPATIBILITY IDEOGRAPH-2F992; QQC
+3238 ; [*0288.0020.0004.3238][.FB40.0020.0004.52B4][.D2B4.0000.0000.52B4][*0289.0020.001F.3238] # PARENTHESIZED IDEOGRAPH LABOR; QQKN
+3298 ; [.FB40.0020.0006.52B4][.D2B4.0000.0000.52B4] # CIRCLED IDEOGRAPH LABOR; QQK
+2F825 ; [.FB40.0020.0002.52C7][.D2C7.0000.0000.52C7] # CJK COMPATIBILITY IDEOGRAPH-2F825; QQC
+FA33 ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-FA33; QQC
+2F826 ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-2F826; QQC
+F952 ; [.FB40.0020.0002.52D2][.D2D2.0000.0000.52D2] # CJK COMPATIBILITY IDEOGRAPH-F952; QQC
+F92F ; [.FB40.0020.0002.52DE][.D2DE.0000.0000.52DE] # CJK COMPATIBILITY IDEOGRAPH-F92F; QQC
+FA34 ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-FA34; QQC
+2F827 ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-2F827; QQC
+F97F ; [.FB40.0020.0002.52F5][.D2F5.0000.0000.52F5] # CJK COMPATIBILITY IDEOGRAPH-F97F; QQC
+2F13 ; [.FB40.0020.0004.52F9][.D2F9.0000.0000.52F9] # KANGXI RADICAL WRAP; QQK
+2F828 ; [.FB40.0020.0002.52FA][.D2FA.0000.0000.52FA] # CJK COMPATIBILITY IDEOGRAPH-2F828; QQC
+2F829 ; [.FB40.0020.0002.5305][.D305.0000.0000.5305] # CJK COMPATIBILITY IDEOGRAPH-2F829; QQC
+2F82A ; [.FB40.0020.0002.5306][.D306.0000.0000.5306] # CJK COMPATIBILITY IDEOGRAPH-2F82A; QQC
+2F14 ; [.FB40.0020.0004.5315][.D315.0000.0000.5315] # KANGXI RADICAL SPOON; QQK
+F963 ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-F963; QQC
+2F82B ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-2F82B; QQC
+2F15 ; [.FB40.0020.0004.531A][.D31A.0000.0000.531A] # KANGXI RADICAL RIGHT OPEN BOX; QQK
+2F16 ; [.FB40.0020.0004.5338][.D338.0000.0000.5338] # KANGXI RADICAL HIDING ENCLOSURE; QQK
+32A9 ; [.FB40.0020.0006.533B][.D33B.0000.0000.533B] # CIRCLED IDEOGRAPH MEDICINE; QQK
+F9EB ; [.FB40.0020.0002.533F][.D33F.0000.0000.533F] # CJK COMPATIBILITY IDEOGRAPH-F9EB; QQC
+2F17 ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # KANGXI RADICAL TEN; QQK
+3038 ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # HANGZHOU NUMERAL TEN; QQK
+3229 ; [*0288.0020.0004.3229][.FB40.0020.0004.5341][.D341.0000.0000.5341][*0289.0020.001F.3229] # PARENTHESIZED IDEOGRAPH TEN; QQKN
+3289 ; [.FB40.0020.0006.5341][.D341.0000.0000.5341] # CIRCLED IDEOGRAPH TEN; QQK
+3039 ; [.FB40.0020.0004.5344][.D344.0000.0000.5344] # HANGZHOU NUMERAL TWENTY; QQK
+303A ; [.FB40.0020.0004.5345][.D345.0000.0000.5345] # HANGZHOU NUMERAL THIRTY; QQK
+2F82C ; [.FB40.0020.0002.5349][.D349.0000.0000.5349] # CJK COMPATIBILITY IDEOGRAPH-2F82C; QQC
+FA35 ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-FA35; QQC
+2F82D ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-2F82D; QQC
+323F ; [*0288.0020.0004.323F][.FB40.0020.0004.5354][.D354.0000.0000.5354][*0289.0020.001F.323F] # PARENTHESIZED IDEOGRAPH ALLIANCE; QQKN
+32AF ; [.FB40.0020.0006.5354][.D354.0000.0000.5354] # CIRCLED IDEOGRAPH ALLIANCE; QQK
+2F82E ; [.FB40.0020.0002.535A][.D35A.0000.0000.535A] # CJK COMPATIBILITY IDEOGRAPH-2F82E; QQC
+2F18 ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C] # KANGXI RADICAL DIVINATION; QQK
+2E8A ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C][.0000.015D.001F.2E8A] # CJK RADICAL DIVINATION; QQKN
+2F19 ; [.FB40.0020.0004.5369][.D369.0000.0000.5369] # KANGXI RADICAL SEAL; QQK
+2E8B ; [.FB40.0020.0004.5369][.D369.0000.0000.5369][.0000.015D.001F.2E8B] # CJK RADICAL SEAL; QQKN
+329E ; [.FB40.0020.0006.5370][.D370.0000.0000.5370] # CIRCLED IDEOGRAPH PRINT; QQK
+2F82F ; [.FB40.0020.0002.5373][.D373.0000.0000.5373] # CJK COMPATIBILITY IDEOGRAPH-2F82F; QQC
+F91C ; [.FB40.0020.0002.5375][.D375.0000.0000.5375] # CJK COMPATIBILITY IDEOGRAPH-F91C; QQC
+2F830 ; [.FB40.0020.0002.537D][.D37D.0000.0000.537D] # CJK COMPATIBILITY IDEOGRAPH-2F830; QQC
+2F831 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F831; QQC
+2F832 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F832; QQC
+2F833 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F833; QQC
+2F1A ; [.FB40.0020.0004.5382][.D382.0000.0000.5382] # KANGXI RADICAL CLIFF; QQK
+2E81 ; [.FB40.0020.0004.5382][.D382.0000.0000.5382][.0000.015D.001F.2E81] # CJK RADICAL CLIFF; QQKN
+2F1B ; [.FB40.0020.0004.53B6][.D3B6.0000.0000.53B6] # KANGXI RADICAL PRIVATE; QQK
+F96B ; [.FB40.0020.0002.53C3][.D3C3.0000.0000.53C3] # CJK COMPATIBILITY IDEOGRAPH-F96B; QQC
+2F1C ; [.FB40.0020.0004.53C8][.D3C8.0000.0000.53C8] # KANGXI RADICAL AGAIN; QQK
+2F836 ; [.FB40.0020.0002.53CA][.D3CA.0000.0000.53CA] # CJK COMPATIBILITY IDEOGRAPH-2F836; QQC
+2F837 ; [.FB40.0020.0002.53DF][.D3DF.0000.0000.53DF] # CJK COMPATIBILITY IDEOGRAPH-2F837; QQC
+2F1D ; [.FB40.0020.0004.53E3][.D3E3.0000.0000.53E3] # KANGXI RADICAL MOUTH; QQK
+F906 ; [.FB40.0020.0002.53E5][.D3E5.0000.0000.53E5] # CJK COMPATIBILITY IDEOGRAPH-F906; QQC
+2F839 ; [.FB40.0020.0002.53EB][.D3EB.0000.0000.53EB] # CJK COMPATIBILITY IDEOGRAPH-2F839; QQC
+2F83A ; [.FB40.0020.0002.53F1][.D3F1.0000.0000.53F1] # CJK COMPATIBILITY IDEOGRAPH-2F83A; QQC
+32A8 ; [.FB40.0020.0006.53F3][.D3F3.0000.0000.53F3] # CIRCLED IDEOGRAPH RIGHT; QQK
+2F83B ; [.FB40.0020.0002.5406][.D406.0000.0000.5406] # CJK COMPATIBILITY IDEOGRAPH-2F83B; QQC
+3234 ; [*0288.0020.0004.3234][.FB40.0020.0004.540D][.D40D.0000.0000.540D][*0289.0020.001F.3234] # PARENTHESIZED IDEOGRAPH NAME; QQKN
+3294 ; [.FB40.0020.0006.540D][.D40D.0000.0000.540D] # CIRCLED IDEOGRAPH NAME; QQK
+F9DE ; [.FB40.0020.0002.540F][.D40F.0000.0000.540F] # CJK COMPATIBILITY IDEOGRAPH-F9DE; QQC
+F9ED ; [.FB40.0020.0002.541D][.D41D.0000.0000.541D] # CJK COMPATIBILITY IDEOGRAPH-F9ED; QQC
+2F83D ; [.FB40.0020.0002.5438][.D438.0000.0000.5438] # CJK COMPATIBILITY IDEOGRAPH-2F83D; QQC
+F980 ; [.FB40.0020.0002.5442][.D442.0000.0000.5442] # CJK COMPATIBILITY IDEOGRAPH-F980; QQC
+2F83E ; [.FB40.0020.0002.5448][.D448.0000.0000.5448] # CJK COMPATIBILITY IDEOGRAPH-2F83E; QQC
+2F83F ; [.FB40.0020.0002.5468][.D468.0000.0000.5468] # CJK COMPATIBILITY IDEOGRAPH-2F83F; QQC
+323A ; [*0288.0020.0004.323A][.FB40.0020.0004.547C][.D47C.0000.0000.547C][*0289.0020.001F.323A] # PARENTHESIZED IDEOGRAPH CALL; QQKN
+2F83C ; [.FB40.0020.0002.549E][.D49E.0000.0000.549E] # CJK COMPATIBILITY IDEOGRAPH-2F83C; QQC
+2F840 ; [.FB40.0020.0002.54A2][.D4A2.0000.0000.54A2] # CJK COMPATIBILITY IDEOGRAPH-2F840; QQC
+F99E ; [.FB40.0020.0002.54BD][.D4BD.0000.0000.54BD] # CJK COMPATIBILITY IDEOGRAPH-F99E; QQC
+2F841 ; [.FB40.0020.0002.54F6][.D4F6.0000.0000.54F6] # CJK COMPATIBILITY IDEOGRAPH-2F841; QQC
+2F842 ; [.FB40.0020.0002.5510][.D510.0000.0000.5510] # CJK COMPATIBILITY IDEOGRAPH-2F842; QQC
+2F843 ; [.FB40.0020.0002.5553][.D553.0000.0000.5553] # CJK COMPATIBILITY IDEOGRAPH-2F843; QQC
+2F844 ; [.FB40.0020.0002.5563][.D563.0000.0000.5563] # CJK COMPATIBILITY IDEOGRAPH-2F844; QQC
+2F845 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F845; QQC
+2F846 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F846; QQC
+F90B ; [.FB40.0020.0002.5587][.D587.0000.0000.5587] # CJK COMPATIBILITY IDEOGRAPH-F90B; QQC
+2F847 ; [.FB40.0020.0002.5599][.D599.0000.0000.5599] # CJK COMPATIBILITY IDEOGRAPH-2F847; QQC
+FA36 ; [.FB40.0020.0002.559D][.D59D.0000.0000.559D] # CJK COMPATIBILITY IDEOGRAPH-FA36; QQC
+2F848 ; [.FB40.0020.0002.55AB][.D5AB.0000.0000.55AB] # CJK COMPATIBILITY IDEOGRAPH-2F848; QQC
+2F849 ; [.FB40.0020.0002.55B3][.D5B3.0000.0000.55B3] # CJK COMPATIBILITY IDEOGRAPH-2F849; QQC
+FA0D ; [.FB40.0020.0002.55C0][.D5C0.0000.0000.55C0] # CJK COMPATIBILITY IDEOGRAPH-FA0D; QQC
+2F84A ; [.FB40.0020.0002.55C2][.D5C2.0000.0000.55C2] # CJK COMPATIBILITY IDEOGRAPH-2F84A; QQC
+FA37 ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-FA37; QQC
+2F84C ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-2F84C; QQC
+2F84E ; [.FB40.0020.0002.5651][.D651.0000.0000.5651] # CJK COMPATIBILITY IDEOGRAPH-2F84E; QQC
+FA38 ; [.FB40.0020.0002.5668][.D668.0000.0000.5668] # CJK COMPATIBILITY IDEOGRAPH-FA38; QQC
+2F84F ; [.FB40.0020.0002.5674][.D674.0000.0000.5674] # CJK COMPATIBILITY IDEOGRAPH-2F84F; QQC
+2F1E ; [.FB40.0020.0004.56D7][.D6D7.0000.0000.56D7] # KANGXI RADICAL ENCLOSURE; QQK
+3223 ; [*0288.0020.0004.3223][.FB40.0020.0004.56DB][.D6DB.0000.0000.56DB][*0289.0020.001F.3223] # PARENTHESIZED IDEOGRAPH FOUR; QQKN
+3283 ; [.FB40.0020.0006.56DB][.D6DB.0000.0000.56DB] # CIRCLED IDEOGRAPH FOUR; QQK
+3195 ; [.FB40.0020.0014.56DB][.D6DB.0000.0000.56DB] # IDEOGRAPHIC ANNOTATION FOUR MARK; QQK
+F9A9 ; [.FB40.0020.0002.56F9][.D6F9.0000.0000.56F9] # CJK COMPATIBILITY IDEOGRAPH-F9A9; QQC
+2F84B ; [.FB40.0020.0002.5716][.D716.0000.0000.5716] # CJK COMPATIBILITY IDEOGRAPH-2F84B; QQC
+2F84D ; [.FB40.0020.0002.5717][.D717.0000.0000.5717] # CJK COMPATIBILITY IDEOGRAPH-2F84D; QQC
+2F1F ; [.FB40.0020.0004.571F][.D71F.0000.0000.571F] # KANGXI RADICAL EARTH; QQK
+322F ; [*0288.0020.0004.322F][.FB40.0020.0004.571F][.D71F.0000.0000.571F][*0289.0020.001F.322F] # PARENTHESIZED IDEOGRAPH EARTH; QQKN
+328F ; [.FB40.0020.0006.571F][.D71F.0000.0000.571F] # CIRCLED IDEOGRAPH EARTH; QQK
+319E ; [.FB40.0020.0014.5730][.D730.0000.0000.5730] # IDEOGRAPHIC ANNOTATION EARTH MARK; QQK
+2F855 ; [.FB40.0020.0002.578B][.D78B.0000.0000.578B] # CJK COMPATIBILITY IDEOGRAPH-2F855; QQC
+2F852 ; [.FB40.0020.0002.57CE][.D7CE.0000.0000.57CE] # CJK COMPATIBILITY IDEOGRAPH-2F852; QQC
+2F853 ; [.FB40.0020.0002.57F4][.D7F4.0000.0000.57F4] # CJK COMPATIBILITY IDEOGRAPH-2F853; QQC
+2F854 ; [.FB40.0020.0002.580D][.D80D.0000.0000.580D] # CJK COMPATIBILITY IDEOGRAPH-2F854; QQC
+2F857 ; [.FB40.0020.0002.5831][.D831.0000.0000.5831] # CJK COMPATIBILITY IDEOGRAPH-2F857; QQC
+2F856 ; [.FB40.0020.0002.5832][.D832.0000.0000.5832] # CJK COMPATIBILITY IDEOGRAPH-2F856; QQC
+FA39 ; [.FB40.0020.0002.5840][.D840.0000.0000.5840] # CJK COMPATIBILITY IDEOGRAPH-FA39; QQC
+FA10 ; [.FB40.0020.0002.585A][.D85A.0000.0000.585A] # CJK COMPATIBILITY IDEOGRAPH-FA10; QQC
+F96C ; [.FB40.0020.0002.585E][.D85E.0000.0000.585E] # CJK COMPATIBILITY IDEOGRAPH-F96C; QQC
+FA3A ; [.FB40.0020.0002.58A8][.D8A8.0000.0000.58A8] # CJK COMPATIBILITY IDEOGRAPH-FA3A; QQC
+2F858 ; [.FB40.0020.0002.58AC][.D8AC.0000.0000.58AC] # CJK COMPATIBILITY IDEOGRAPH-2F858; QQC
+F94A ; [.FB40.0020.0002.58D8][.D8D8.0000.0000.58D8] # CJK COMPATIBILITY IDEOGRAPH-F94A; QQC
+F942 ; [.FB40.0020.0002.58DF][.D8DF.0000.0000.58DF] # CJK COMPATIBILITY IDEOGRAPH-F942; QQC
+2F20 ; [.FB40.0020.0004.58EB][.D8EB.0000.0000.58EB] # KANGXI RADICAL SCHOLAR; QQK
+2F851 ; [.FB40.0020.0002.58EE][.D8EE.0000.0000.58EE] # CJK COMPATIBILITY IDEOGRAPH-2F851; QQC
+2F85A ; [.FB40.0020.0002.58F2][.D8F2.0000.0000.58F2] # CJK COMPATIBILITY IDEOGRAPH-2F85A; QQC
+2F85B ; [.FB40.0020.0002.58F7][.D8F7.0000.0000.58F7] # CJK COMPATIBILITY IDEOGRAPH-2F85B; QQC
+2F21 ; [.FB40.0020.0004.5902][.D902.0000.0000.5902] # KANGXI RADICAL GO; QQK
+2F85C ; [.FB40.0020.0002.5906][.D906.0000.0000.5906] # CJK COMPATIBILITY IDEOGRAPH-2F85C; QQC
+2F22 ; [.FB40.0020.0004.590A][.D90A.0000.0000.590A] # KANGXI RADICAL GO SLOWLY; QQK
+2F23 ; [.FB40.0020.0004.5915][.D915.0000.0000.5915] # KANGXI RADICAL EVENING; QQK
+2F85D ; [.FB40.0020.0002.591A][.D91A.0000.0000.591A] # CJK COMPATIBILITY IDEOGRAPH-2F85D; QQC
+32B0 ; [.FB40.0020.0006.591C][.D91C.0000.0000.591C] # CIRCLED IDEOGRAPH NIGHT; QQK
+2F85E ; [.FB40.0020.0002.5922][.D922.0000.0000.5922] # CJK COMPATIBILITY IDEOGRAPH-2F85E; QQC
+2F24 ; [.FB40.0020.0004.5927][.D927.0000.0000.5927] # KANGXI RADICAL BIG; QQK
+337D ; [.FB40.0020.001C.5927][.D927.0000.0000.5927][.FB40.0020.001F.6B63][.EB63.0000.0000.6B63] # SQUARE ERA NAME TAISYOU; QQKN
+319D ; [.FB40.0020.0014.5929][.D929.0000.0000.5929] # IDEOGRAPHIC ANNOTATION HEAVEN MARK; QQK
+F90C ; [.FB40.0020.0002.5948][.D948.0000.0000.5948] # CJK COMPATIBILITY IDEOGRAPH-F90C; QQC
+F909 ; [.FB40.0020.0002.5951][.D951.0000.0000.5951] # CJK COMPATIBILITY IDEOGRAPH-F909; QQC
+2F85F ; [.FB40.0020.0002.5962][.D962.0000.0000.5962] # CJK COMPATIBILITY IDEOGRAPH-2F85F; QQC
+F981 ; [.FB40.0020.0002.5973][.D973.0000.0000.5973] # CJK COMPATIBILITY IDEOGRAPH-F981; QQC
+2F25 ; [.FB40.0020.0004.5973][.D973.0000.0000.5973] # KANGXI RADICAL WOMAN; QQK
+329B ; [.FB40.0020.0006.5973][.D973.0000.0000.5973] # CIRCLED IDEOGRAPH FEMALE; QQK
+2F865 ; [.FB40.0020.0002.59D8][.D9D8.0000.0000.59D8] # CJK COMPATIBILITY IDEOGRAPH-2F865; QQC
+2F862 ; [.FB40.0020.0002.59EC][.D9EC.0000.0000.59EC] # CJK COMPATIBILITY IDEOGRAPH-2F862; QQC
+2F863 ; [.FB40.0020.0002.5A1B][.DA1B.0000.0000.5A1B] # CJK COMPATIBILITY IDEOGRAPH-2F863; QQC
+2F864 ; [.FB40.0020.0002.5A27][.DA27.0000.0000.5A27] # CJK COMPATIBILITY IDEOGRAPH-2F864; QQC
+2F866 ; [.FB40.0020.0002.5A66][.DA66.0000.0000.5A66] # CJK COMPATIBILITY IDEOGRAPH-2F866; QQC
+2F986 ; [.FB40.0020.0002.5AB5][.DAB5.0000.0000.5AB5] # CJK COMPATIBILITY IDEOGRAPH-2F986; QQC
+2F869 ; [.FB40.0020.0002.5B08][.DB08.0000.0000.5B08] # CJK COMPATIBILITY IDEOGRAPH-2F869; QQC
+2F86A ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86A; QQC
+2F86B ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86B; QQC
+2F26 ; [.FB40.0020.0004.5B50][.DB50.0000.0000.5B50] # KANGXI RADICAL CHILD; QQK
+323B ; [*0288.0020.0004.323B][.FB40.0020.0004.5B66][.DB66.0000.0000.5B66][*0289.0020.001F.323B] # PARENTHESIZED IDEOGRAPH STUDY; QQKN
+32AB ; [.FB40.0020.0006.5B66][.DB66.0000.0000.5B66] # CIRCLED IDEOGRAPH STUDY; QQK
+2F27 ; [.FB40.0020.0004.5B80][.DB80.0000.0000.5B80] # KANGXI RADICAL ROOF; QQK
+FA04 ; [.FB40.0020.0002.5B85][.DB85.0000.0000.5B85] # CJK COMPATIBILITY IDEOGRAPH-FA04; QQC
+32AA ; [.FB40.0020.0006.5B97][.DB97.0000.0000.5B97] # CIRCLED IDEOGRAPH RELIGION; QQK
+2F86D ; [.FB40.0020.0002.5BC3][.DBC3.0000.0000.5BC3] # CJK COMPATIBILITY IDEOGRAPH-2F86D; QQC
+2F86E ; [.FB40.0020.0002.5BD8][.DBD8.0000.0000.5BD8] # CJK COMPATIBILITY IDEOGRAPH-2F86E; QQC
+F95F ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F95F; QQC
+F9AA ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F9AA; QQC
+2F86F ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-2F86F; QQC
+F9BC ; [.FB40.0020.0002.5BEE][.DBEE.0000.0000.5BEE] # CJK COMPATIBILITY IDEOGRAPH-F9BC; QQC
+2F870 ; [.FB40.0020.0002.5BF3][.DBF3.0000.0000.5BF3] # CJK COMPATIBILITY IDEOGRAPH-2F870; QQC
+2F28 ; [.FB40.0020.0004.5BF8][.DBF8.0000.0000.5BF8] # KANGXI RADICAL INCH; QQK
+2F872 ; [.FB40.0020.0002.5BFF][.DBFF.0000.0000.5BFF] # CJK COMPATIBILITY IDEOGRAPH-2F872; QQC
+2F873 ; [.FB40.0020.0002.5C06][.DC06.0000.0000.5C06] # CJK COMPATIBILITY IDEOGRAPH-2F873; QQC
+2F29 ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F] # KANGXI RADICAL SMALL; QQK
+2E8C ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.015D.001F.2E8C] # CJK RADICAL SMALL ONE; QQKN
+2E8D ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.015E.001F.2E8D] # CJK RADICAL SMALL TWO; QQKN
+2F875 ; [.FB40.0020.0002.5C22][.DC22.0000.0000.5C22] # CJK COMPATIBILITY IDEOGRAPH-2F875; QQC
+2E90 ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # CJK RADICAL LAME THREE; QQK
+2F2A ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # KANGXI RADICAL LAME; QQK
+2E8E ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22][.0000.015D.001F.2E8E] # CJK RADICAL LAME ONE; QQKN
+2E8F ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23] # CJK RADICAL LAME TWO; QQK
+2E91 ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23][.0000.015D.001F.2E91] # CJK RADICAL LAME FOUR; QQKN
+2F2B ; [.FB40.0020.0004.5C38][.DC38.0000.0000.5C38] # KANGXI RADICAL CORPSE; QQK
+F9BD ; [.FB40.0020.0002.5C3F][.DC3F.0000.0000.5C3F] # CJK COMPATIBILITY IDEOGRAPH-F9BD; QQC
+2F877 ; [.FB40.0020.0002.5C60][.DC60.0000.0000.5C60] # CJK COMPATIBILITY IDEOGRAPH-2F877; QQC
+F94B ; [.FB40.0020.0002.5C62][.DC62.0000.0000.5C62] # CJK COMPATIBILITY IDEOGRAPH-F94B; QQC
+FA3B ; [.FB40.0020.0002.5C64][.DC64.0000.0000.5C64] # CJK COMPATIBILITY IDEOGRAPH-FA3B; QQC
+F9DF ; [.FB40.0020.0002.5C65][.DC65.0000.0000.5C65] # CJK COMPATIBILITY IDEOGRAPH-F9DF; QQC
+FA3C ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-FA3C; QQC
+2F878 ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-2F878; QQC
+2F2C ; [.FB40.0020.0004.5C6E][.DC6E.0000.0000.5C6E] # KANGXI RADICAL SPROUT; QQK
+2F2D ; [.FB40.0020.0004.5C71][.DC71.0000.0000.5C71] # KANGXI RADICAL MOUNTAIN; QQK
+2F87A ; [.FB40.0020.0002.5C8D][.DC8D.0000.0000.5C8D] # CJK COMPATIBILITY IDEOGRAPH-2F87A; QQC
+2F879 ; [.FB40.0020.0002.5CC0][.DCC0.0000.0000.5CC0] # CJK COMPATIBILITY IDEOGRAPH-2F879; QQC
+F9D5 ; [.FB40.0020.0002.5D19][.DD19.0000.0000.5D19] # CJK COMPATIBILITY IDEOGRAPH-F9D5; QQC
+2F87C ; [.FB40.0020.0002.5D43][.DD43.0000.0000.5D43] # CJK COMPATIBILITY IDEOGRAPH-2F87C; QQC
+F921 ; [.FB40.0020.0002.5D50][.DD50.0000.0000.5D50] # CJK COMPATIBILITY IDEOGRAPH-F921; QQC
+2F87F ; [.FB40.0020.0002.5D6B][.DD6B.0000.0000.5D6B] # CJK COMPATIBILITY IDEOGRAPH-2F87F; QQC
+2F87E ; [.FB40.0020.0002.5D6E][.DD6E.0000.0000.5D6E] # CJK COMPATIBILITY IDEOGRAPH-2F87E; QQC
+2F880 ; [.FB40.0020.0002.5D7C][.DD7C.0000.0000.5D7C] # CJK COMPATIBILITY IDEOGRAPH-2F880; QQC
+2F9F4 ; [.FB40.0020.0002.5DB2][.DDB2.0000.0000.5DB2] # CJK COMPATIBILITY IDEOGRAPH-2F9F4; QQC
+F9AB ; [.FB40.0020.0002.5DBA][.DDBA.0000.0000.5DBA] # CJK COMPATIBILITY IDEOGRAPH-F9AB; QQC
+2F2E ; [.FB40.0020.0004.5DDB][.DDDB.0000.0000.5DDB] # KANGXI RADICAL RIVER; QQK
+2F881 ; [.FB40.0020.0002.5DE1][.DDE1.0000.0000.5DE1] # CJK COMPATIBILITY IDEOGRAPH-2F881; QQC
+2F882 ; [.FB40.0020.0002.5DE2][.DDE2.0000.0000.5DE2] # CJK COMPATIBILITY IDEOGRAPH-2F882; QQC
+2F2F ; [.FB40.0020.0004.5DE5][.DDE5.0000.0000.5DE5] # KANGXI RADICAL WORK; QQK
+32A7 ; [.FB40.0020.0006.5DE6][.DDE6.0000.0000.5DE6] # CIRCLED IDEOGRAPH LEFT; QQK
+2F30 ; [.FB40.0020.0004.5DF1][.DDF1.0000.0000.5DF1] # KANGXI RADICAL ONESELF; QQK
+2E92 ; [.FB40.0020.0004.5DF3][.DDF3.0000.0000.5DF3] # CJK RADICAL SNAKE; QQK
+2F884 ; [.FB40.0020.0002.5DFD][.DDFD.0000.0000.5DFD] # CJK COMPATIBILITY IDEOGRAPH-2F884; QQC
+2F31 ; [.FB40.0020.0004.5DFE][.DDFE.0000.0000.5DFE] # KANGXI RADICAL TURBAN; QQK
+2F885 ; [.FB40.0020.0002.5E28][.DE28.0000.0000.5E28] # CJK COMPATIBILITY IDEOGRAPH-2F885; QQC
+2F886 ; [.FB40.0020.0002.5E3D][.DE3D.0000.0000.5E3D] # CJK COMPATIBILITY IDEOGRAPH-2F886; QQC
+2F887 ; [.FB40.0020.0002.5E69][.DE69.0000.0000.5E69] # CJK COMPATIBILITY IDEOGRAPH-2F887; QQC
+2F32 ; [.FB40.0020.0004.5E72][.DE72.0000.0000.5E72] # KANGXI RADICAL DRY; QQK
+337B ; [.FB40.0020.001C.5E73][.DE73.0000.0000.5E73][.FB40.0020.001F.6210][.E210.0000.0000.6210] # SQUARE ERA NAME HEISEI; QQKN
+F98E ; [.FB40.0020.0002.5E74][.DE74.0000.0000.5E74] # CJK COMPATIBILITY IDEOGRAPH-F98E; QQC
+2E93 ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # CJK RADICAL THREAD; QQK
+2F33 ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # KANGXI RADICAL SHORT THREAD; QQK
+2F34 ; [.FB40.0020.0004.5E7F][.DE7F.0000.0000.5E7F] # KANGXI RADICAL DOTTED CLIFF; QQK
+FA01 ; [.FB40.0020.0002.5EA6][.DEA6.0000.0000.5EA6] # CJK COMPATIBILITY IDEOGRAPH-FA01; QQC
+2F88B ; [.FB40.0020.0002.5EB0][.DEB0.0000.0000.5EB0] # CJK COMPATIBILITY IDEOGRAPH-2F88B; QQC
+2F88C ; [.FB40.0020.0002.5EB3][.DEB3.0000.0000.5EB3] # CJK COMPATIBILITY IDEOGRAPH-2F88C; QQC
+2F88D ; [.FB40.0020.0002.5EB6][.DEB6.0000.0000.5EB6] # CJK COMPATIBILITY IDEOGRAPH-2F88D; QQC
+F9A2 ; [.FB40.0020.0002.5EC9][.DEC9.0000.0000.5EC9] # CJK COMPATIBILITY IDEOGRAPH-F9A2; QQC
+F928 ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-F928; QQC
+2F88E ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-2F88E; QQC
+FA0B ; [.FB40.0020.0002.5ED3][.DED3.0000.0000.5ED3] # CJK COMPATIBILITY IDEOGRAPH-FA0B; QQC
+F982 ; [.FB40.0020.0002.5EEC][.DEEC.0000.0000.5EEC] # CJK COMPATIBILITY IDEOGRAPH-F982; QQC
+2F35 ; [.FB40.0020.0004.5EF4][.DEF4.0000.0000.5EF4] # KANGXI RADICAL LONG STRIDE; QQK
+2F890 ; [.FB40.0020.0002.5EFE][.DEFE.0000.0000.5EFE] # CJK COMPATIBILITY IDEOGRAPH-2F890; QQC
+2F36 ; [.FB40.0020.0004.5EFE][.DEFE.0000.0000.5EFE] # KANGXI RADICAL TWO HANDS; QQK
+F943 ; [.FB40.0020.0002.5F04][.DF04.0000.0000.5F04] # CJK COMPATIBILITY IDEOGRAPH-F943; QQC
+2F37 ; [.FB40.0020.0004.5F0B][.DF0B.0000.0000.5F0B] # KANGXI RADICAL SHOOT; QQK
+2F38 ; [.FB40.0020.0004.5F13][.DF13.0000.0000.5F13] # KANGXI RADICAL BOW; QQK
+2F894 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F894; QQC
+2F895 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F895; QQC
+2F39 ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50] # KANGXI RADICAL SNOUT; QQK
+2E95 ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50][.0000.015D.001F.2E95] # CJK RADICAL SNOUT TWO; QQKN
+2E94 ; [.FB40.0020.0004.5F51][.DF51.0000.0000.5F51] # CJK RADICAL SNOUT ONE; QQK
+2F874 ; [.FB40.0020.0002.5F53][.DF53.0000.0000.5F53] # CJK COMPATIBILITY IDEOGRAPH-2F874; QQC
+2F3A ; [.FB40.0020.0004.5F61][.DF61.0000.0000.5F61] # KANGXI RADICAL BRISTLE; QQK
+2F899 ; [.FB40.0020.0002.5F62][.DF62.0000.0000.5F62] # CJK COMPATIBILITY IDEOGRAPH-2F899; QQC
+2F89A ; [.FB40.0020.0002.5F6B][.DF6B.0000.0000.5F6B] # CJK COMPATIBILITY IDEOGRAPH-2F89A; QQC
+2F3B ; [.FB40.0020.0004.5F73][.DF73.0000.0000.5F73] # KANGXI RADICAL STEP; QQK
+F9D8 ; [.FB40.0020.0002.5F8B][.DF8B.0000.0000.5F8B] # CJK COMPATIBILITY IDEOGRAPH-F9D8; QQC
+2F89C ; [.FB40.0020.0002.5F9A][.DF9A.0000.0000.5F9A] # CJK COMPATIBILITY IDEOGRAPH-2F89C; QQC
+F966 ; [.FB40.0020.0002.5FA9][.DFA9.0000.0000.5FA9] # CJK COMPATIBILITY IDEOGRAPH-F966; QQC
+2F3C ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3] # KANGXI RADICAL HEART; QQK
+2E97 ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3][.0000.015D.001F.2E97] # CJK RADICAL HEART TWO; QQKN
+2E96 ; [.FB40.0020.0004.5FC4][.DFC4.0000.0000.5FC4] # CJK RADICAL HEART ONE; QQK
+2F89D ; [.FB40.0020.0002.5FCD][.DFCD.0000.0000.5FCD] # CJK COMPATIBILITY IDEOGRAPH-2F89D; QQC
+2F89E ; [.FB40.0020.0002.5FD7][.DFD7.0000.0000.5FD7] # CJK COMPATIBILITY IDEOGRAPH-2F89E; QQC
+F9A3 ; [.FB40.0020.0002.5FF5][.DFF5.0000.0000.5FF5] # CJK COMPATIBILITY IDEOGRAPH-F9A3; QQC
+2F89F ; [.FB40.0020.0002.5FF9][.DFF9.0000.0000.5FF9] # CJK COMPATIBILITY IDEOGRAPH-2F89F; QQC
+F960 ; [.FB40.0020.0002.6012][.E012.0000.0000.6012] # CJK COMPATIBILITY IDEOGRAPH-F960; QQC
+F9AC ; [.FB40.0020.0002.601C][.E01C.0000.0000.601C] # CJK COMPATIBILITY IDEOGRAPH-F9AC; QQC
+2F8A0 ; [.FB40.0020.0002.6081][.E081.0000.0000.6081] # CJK COMPATIBILITY IDEOGRAPH-2F8A0; QQC
+FA3D ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-FA3D; QQC
+2F8A3 ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-2F8A3; QQC
+2F8A5 ; [.FB40.0020.0002.60C7][.E0C7.0000.0000.60C7] # CJK COMPATIBILITY IDEOGRAPH-2F8A5; QQC
+F9B9 ; [.FB40.0020.0002.60E1][.E0E1.0000.0000.60E1] # CJK COMPATIBILITY IDEOGRAPH-F9B9; QQC
+F9D9 ; [.FB40.0020.0002.6144][.E144.0000.0000.6144] # CJK COMPATIBILITY IDEOGRAPH-F9D9; QQC
+2F8A6 ; [.FB40.0020.0002.6148][.E148.0000.0000.6148] # CJK COMPATIBILITY IDEOGRAPH-2F8A6; QQC
+2F8A7 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A7; QQC
+2F8A9 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A9; QQC
+2F8A8 ; [.FB40.0020.0002.614E][.E14E.0000.0000.614E] # CJK COMPATIBILITY IDEOGRAPH-2F8A8; QQC
+FA3E ; [.FB40.0020.0002.6168][.E168.0000.0000.6168] # CJK COMPATIBILITY IDEOGRAPH-FA3E; QQC
+2F8AA ; [.FB40.0020.0002.617A][.E17A.0000.0000.617A] # CJK COMPATIBILITY IDEOGRAPH-2F8AA; QQC
+FA3F ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-FA3F; QQC
+2F8AB ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-2F8AB; QQC
+F98F ; [.FB40.0020.0002.6190][.E190.0000.0000.6190] # CJK COMPATIBILITY IDEOGRAPH-F98F; QQC
+2F8AD ; [.FB40.0020.0002.61A4][.E1A4.0000.0000.61A4] # CJK COMPATIBILITY IDEOGRAPH-2F8AD; QQC
+2F8AE ; [.FB40.0020.0002.61AF][.E1AF.0000.0000.61AF] # CJK COMPATIBILITY IDEOGRAPH-2F8AE; QQC
+2F8AC ; [.FB40.0020.0002.61B2][.E1B2.0000.0000.61B2] # CJK COMPATIBILITY IDEOGRAPH-2F8AC; QQC
+2F8AF ; [.FB40.0020.0002.61DE][.E1DE.0000.0000.61DE] # CJK COMPATIBILITY IDEOGRAPH-2F8AF; QQC
+FA40 ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-FA40; QQC
+2F8B0 ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-2F8B0; QQC
+F90D ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-F90D; QQC
+2F8B1 ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-2F8B1; QQC
+F990 ; [.FB40.0020.0002.6200][.E200.0000.0000.6200] # CJK COMPATIBILITY IDEOGRAPH-F990; QQC
+2F3D ; [.FB40.0020.0004.6208][.E208.0000.0000.6208] # KANGXI RADICAL HALBERD; QQK
+2F8B2 ; [.FB40.0020.0002.6210][.E210.0000.0000.6210] # CJK COMPATIBILITY IDEOGRAPH-2F8B2; QQC
+2F8B3 ; [.FB40.0020.0002.621B][.E21B.0000.0000.621B] # CJK COMPATIBILITY IDEOGRAPH-2F8B3; QQC
+F9D2 ; [.FB40.0020.0002.622E][.E22E.0000.0000.622E] # CJK COMPATIBILITY IDEOGRAPH-F9D2; QQC
+2F3E ; [.FB40.0020.0004.6236][.E236.0000.0000.6236] # KANGXI RADICAL DOOR; QQK
+2F3F ; [.FB40.0020.0004.624B][.E24B.0000.0000.624B] # KANGXI RADICAL HAND; QQK
+2E98 ; [.FB40.0020.0004.624C][.E24C.0000.0000.624C] # CJK RADICAL HAND; QQK
+2F8B4 ; [.FB40.0020.0002.625D][.E25D.0000.0000.625D] # CJK COMPATIBILITY IDEOGRAPH-2F8B4; QQC
+2F8B5 ; [.FB40.0020.0002.62B1][.E2B1.0000.0000.62B1] # CJK COMPATIBILITY IDEOGRAPH-2F8B5; QQC
+F925 ; [.FB40.0020.0002.62C9][.E2C9.0000.0000.62C9] # CJK COMPATIBILITY IDEOGRAPH-F925; QQC
+F95B ; [.FB40.0020.0002.62CF][.E2CF.0000.0000.62CF] # CJK COMPATIBILITY IDEOGRAPH-F95B; QQC
+FA02 ; [.FB40.0020.0002.62D3][.E2D3.0000.0000.62D3] # CJK COMPATIBILITY IDEOGRAPH-FA02; QQC
+2F8B6 ; [.FB40.0020.0002.62D4][.E2D4.0000.0000.62D4] # CJK COMPATIBILITY IDEOGRAPH-2F8B6; QQC
+2F8BA ; [.FB40.0020.0002.62FC][.E2FC.0000.0000.62FC] # CJK COMPATIBILITY IDEOGRAPH-2F8BA; QQC
+F973 ; [.FB40.0020.0002.62FE][.E2FE.0000.0000.62FE] # CJK COMPATIBILITY IDEOGRAPH-F973; QQC
+2F8B9 ; [.FB40.0020.0002.633D][.E33D.0000.0000.633D] # CJK COMPATIBILITY IDEOGRAPH-2F8B9; QQC
+2F8B7 ; [.FB40.0020.0002.6350][.E350.0000.0000.6350] # CJK COMPATIBILITY IDEOGRAPH-2F8B7; QQC
+2F8BB ; [.FB40.0020.0002.6368][.E368.0000.0000.6368] # CJK COMPATIBILITY IDEOGRAPH-2F8BB; QQC
+F9A4 ; [.FB40.0020.0002.637B][.E37B.0000.0000.637B] # CJK COMPATIBILITY IDEOGRAPH-F9A4; QQC
+2F8BC ; [.FB40.0020.0002.6383][.E383.0000.0000.6383] # CJK COMPATIBILITY IDEOGRAPH-2F8BC; QQC
+F975 ; [.FB40.0020.0002.63A0][.E3A0.0000.0000.63A0] # CJK COMPATIBILITY IDEOGRAPH-F975; QQC
+2F8C1 ; [.FB40.0020.0002.63A9][.E3A9.0000.0000.63A9] # CJK COMPATIBILITY IDEOGRAPH-2F8C1; QQC
+2F8C0 ; [.FB40.0020.0002.63C5][.E3C5.0000.0000.63C5] # CJK COMPATIBILITY IDEOGRAPH-2F8C0; QQC
+2F8BD ; [.FB40.0020.0002.63E4][.E3E4.0000.0000.63E4] # CJK COMPATIBILITY IDEOGRAPH-2F8BD; QQC
+2F8BF ; [.FB40.0020.0002.6422][.E422.0000.0000.6422] # CJK COMPATIBILITY IDEOGRAPH-2F8BF; QQC
+2F8C3 ; [.FB40.0020.0002.6469][.E469.0000.0000.6469] # CJK COMPATIBILITY IDEOGRAPH-2F8C3; QQC
+2F8C6 ; [.FB40.0020.0002.6477][.E477.0000.0000.6477] # CJK COMPATIBILITY IDEOGRAPH-2F8C6; QQC
+2F8C4 ; [.FB40.0020.0002.647E][.E47E.0000.0000.647E] # CJK COMPATIBILITY IDEOGRAPH-2F8C4; QQC
+F991 ; [.FB40.0020.0002.649A][.E49A.0000.0000.649A] # CJK COMPATIBILITY IDEOGRAPH-F991; QQC
+2F8C5 ; [.FB40.0020.0002.649D][.E49D.0000.0000.649D] # CJK COMPATIBILITY IDEOGRAPH-2F8C5; QQC
+F930 ; [.FB40.0020.0002.64C4][.E4C4.0000.0000.64C4] # CJK COMPATIBILITY IDEOGRAPH-F930; QQC
+2F40 ; [.FB40.0020.0004.652F][.E52F.0000.0000.652F] # KANGXI RADICAL BRANCH; QQK
+2F41 ; [.FB40.0020.0004.6534][.E534.0000.0000.6534] # KANGXI RADICAL RAP; QQK
+2E99 ; [.FB40.0020.0004.6535][.E535.0000.0000.6535] # CJK RADICAL RAP; QQK
+FA41 ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-FA41; QQC
+2F8C8 ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-2F8C8; QQC
+2F8C9 ; [.FB40.0020.0002.656C][.E56C.0000.0000.656C] # CJK COMPATIBILITY IDEOGRAPH-2F8C9; QQC
+F969 ; [.FB40.0020.0002.6578][.E578.0000.0000.6578] # CJK COMPATIBILITY IDEOGRAPH-F969; QQC
+2F42 ; [.FB40.0020.0004.6587][.E587.0000.0000.6587] # KANGXI RADICAL SCRIPT; QQK
+2F43 ; [.FB40.0020.0004.6597][.E597.0000.0000.6597] # KANGXI RADICAL DIPPER; QQK
+F9BE ; [.FB40.0020.0002.6599][.E599.0000.0000.6599] # CJK COMPATIBILITY IDEOGRAPH-F9BE; QQC
+2F44 ; [.FB40.0020.0004.65A4][.E5A4.0000.0000.65A4] # KANGXI RADICAL AXE; QQK
+2F45 ; [.FB40.0020.0004.65B9][.E5B9.0000.0000.65B9] # KANGXI RADICAL SQUARE; QQK
+F983 ; [.FB40.0020.0002.65C5][.E5C5.0000.0000.65C5] # CJK COMPATIBILITY IDEOGRAPH-F983; QQC
+2F46 ; [.FB40.0020.0004.65E0][.E5E0.0000.0000.65E0] # KANGXI RADICAL NOT; QQK
+2E9B ; [.FB40.0020.0004.65E1][.E5E1.0000.0000.65E1] # CJK RADICAL CHOKE; QQK
+FA42 ; [.FB40.0020.0002.65E2][.E5E2.0000.0000.65E2] # CJK COMPATIBILITY IDEOGRAPH-FA42; QQC
+2F8CB ; [.FB40.0020.0002.65E3][.E5E3.0000.0000.65E3] # CJK COMPATIBILITY IDEOGRAPH-2F8CB; QQC
+2F47 ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # KANGXI RADICAL SUN; QQK
+3230 ; [*0288.0020.0004.3230][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][*0289.0020.001F.3230] # PARENTHESIZED IDEOGRAPH SUN; QQKN
+3290 ; [.FB40.0020.0006.65E5][.E5E5.0000.0000.65E5] # CIRCLED IDEOGRAPH SUN; QQK
+2E9C ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][.0000.015D.001F.2E9C] # CJK RADICAL SUN; QQKN
+337E ; [.FB40.0020.001C.660E][.E60E.0000.0000.660E][.FB40.0020.001F.6CBB][.ECBB.0000.0000.6CBB] # SQUARE ERA NAME MEIZI; QQKN
+F9E0 ; [.FB40.0020.0002.6613][.E613.0000.0000.6613] # CJK COMPATIBILITY IDEOGRAPH-F9E0; QQC
+337C ; [.FB40.0020.001C.662D][.E62D.0000.0000.662D][.FB40.0020.001F.548C][.D48C.0000.0000.548C] # SQUARE ERA NAME SYOUWA; QQKN
+2F8CD ; [.FB40.0020.0002.6649][.E649.0000.0000.6649] # CJK COMPATIBILITY IDEOGRAPH-2F8CD; QQC
+FA12 ; [.FB40.0020.0002.6674][.E674.0000.0000.6674] # CJK COMPATIBILITY IDEOGRAPH-FA12; QQC
+F9C5 ; [.FB40.0020.0002.6688][.E688.0000.0000.6688] # CJK COMPATIBILITY IDEOGRAPH-F9C5; QQC
+FA43 ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-FA43; QQC
+2F8CF ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-2F8CF; QQC
+2F8D5 ; [.FB40.0020.0002.669C][.E69C.0000.0000.669C] # CJK COMPATIBILITY IDEOGRAPH-2F8D5; QQC
+FA06 ; [.FB40.0020.0002.66B4][.E6B4.0000.0000.66B4] # CJK COMPATIBILITY IDEOGRAPH-FA06; QQC
+F98B ; [.FB40.0020.0002.66C6][.E6C6.0000.0000.66C6] # CJK COMPATIBILITY IDEOGRAPH-F98B; QQC
+2F48 ; [.FB40.0020.0004.66F0][.E6F0.0000.0000.66F0] # KANGXI RADICAL SAY; QQK
+F901 ; [.FB40.0020.0002.66F4][.E6F4.0000.0000.66F4] # CJK COMPATIBILITY IDEOGRAPH-F901; QQC
+2F8CC ; [.FB40.0020.0002.66F8][.E6F8.0000.0000.66F8] # CJK COMPATIBILITY IDEOGRAPH-2F8CC; QQC
+2F8D4 ; [.FB40.0020.0002.6700][.E700.0000.0000.6700] # CJK COMPATIBILITY IDEOGRAPH-2F8D4; QQC
+2F49 ; [.FB40.0020.0004.6708][.E708.0000.0000.6708] # KANGXI RADICAL MOON; QQK
+322A ; [*0288.0020.0004.322A][.FB40.0020.0004.6708][.E708.0000.0000.6708][*0289.0020.001F.322A] # PARENTHESIZED IDEOGRAPH MOON; QQKN
+328A ; [.FB40.0020.0006.6708][.E708.0000.0000.6708] # CIRCLED IDEOGRAPH MOON; QQK
+2E9D ; [.FB40.0020.0004.6708][.E708.0000.0000.6708][.0000.015D.001F.2E9D] # CJK RADICAL MOON; QQKN
+3232 ; [*0288.0020.0004.3232][.FB40.0020.0004.6709][.E709.0000.0000.6709][*0289.0020.001F.3232] # PARENTHESIZED IDEOGRAPH HAVE; QQKN
+3292 ; [.FB40.0020.0006.6709][.E709.0000.0000.6709] # CIRCLED IDEOGRAPH HAVE; QQK
+F929 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-F929; QQC
+2F8D8 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-2F8D8; QQC
+2F8D9 ; [.FB40.0020.0002.671B][.E71B.0000.0000.671B] # CJK COMPATIBILITY IDEOGRAPH-2F8D9; QQC
+2F8DA ; [.FB40.0020.0002.6721][.E721.0000.0000.6721] # CJK COMPATIBILITY IDEOGRAPH-2F8DA; QQC
+2F4A ; [.FB40.0020.0004.6728][.E728.0000.0000.6728] # KANGXI RADICAL TREE; QQK
+322D ; [*0288.0020.0004.322D][.FB40.0020.0004.6728][.E728.0000.0000.6728][*0289.0020.001F.322D] # PARENTHESIZED IDEOGRAPH WOOD; QQKN
+328D ; [.FB40.0020.0006.6728][.E728.0000.0000.6728] # CIRCLED IDEOGRAPH WOOD; QQK
+F9E1 ; [.FB40.0020.0002.674E][.E74E.0000.0000.674E] # CJK COMPATIBILITY IDEOGRAPH-F9E1; QQC
+2F8DC ; [.FB40.0020.0002.6753][.E753.0000.0000.6753] # CJK COMPATIBILITY IDEOGRAPH-2F8DC; QQC
+2F8DB ; [.FB40.0020.0002.675E][.E75E.0000.0000.675E] # CJK COMPATIBILITY IDEOGRAPH-2F8DB; QQC
+F9C8 ; [.FB40.0020.0002.677B][.E77B.0000.0000.677B] # CJK COMPATIBILITY IDEOGRAPH-F9C8; QQC
+2F8E0 ; [.FB40.0020.0002.6785][.E785.0000.0000.6785] # CJK COMPATIBILITY IDEOGRAPH-2F8E0; QQC
+F9F4 ; [.FB40.0020.0002.6797][.E797.0000.0000.6797] # CJK COMPATIBILITY IDEOGRAPH-F9F4; QQC
+F9C9 ; [.FB40.0020.0002.67F3][.E7F3.0000.0000.67F3] # CJK COMPATIBILITY IDEOGRAPH-F9C9; QQC
+2F8DF ; [.FB40.0020.0002.67FA][.E7FA.0000.0000.67FA] # CJK COMPATIBILITY IDEOGRAPH-2F8DF; QQC
+F9DA ; [.FB40.0020.0002.6817][.E817.0000.0000.6817] # CJK COMPATIBILITY IDEOGRAPH-F9DA; QQC
+2F8E5 ; [.FB40.0020.0002.681F][.E81F.0000.0000.681F] # CJK COMPATIBILITY IDEOGRAPH-2F8E5; QQC
+3231 ; [*0288.0020.0004.3231][.FB40.0020.0004.682A][.E82A.0000.0000.682A][*0289.0020.001F.3231] # PARENTHESIZED IDEOGRAPH STOCK; QQKN
+3291 ; [.FB40.0020.0006.682A][.E82A.0000.0000.682A] # CIRCLED IDEOGRAPH STOCK; QQK
+337F ; [.FB40.0020.001C.682A][.E82A.0000.0000.682A][.FB40.0020.001F.5F0F][.DF0F.0000.0000.5F0F][.FB40.0020.001F.4F1A][.CF1A.0000.0000.4F1A][.FB40.0020.001F.793E][.F93E.0000.0000.793E] # SQUARE CORPORATION; QQKN
+2F8E1 ; [.FB40.0020.0002.6852][.E852.0000.0000.6852] # CJK COMPATIBILITY IDEOGRAPH-2F8E1; QQC
+F97A ; [.FB40.0020.0002.6881][.E881.0000.0000.6881] # CJK COMPATIBILITY IDEOGRAPH-F97A; QQC
+FA44 ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-FA44; QQC
+2F8E2 ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-2F8E2; QQC
+2F8E4 ; [.FB40.0020.0002.688E][.E88E.0000.0000.688E] # CJK COMPATIBILITY IDEOGRAPH-2F8E4; QQC
+F9E2 ; [.FB40.0020.0002.68A8][.E8A8.0000.0000.68A8] # CJK COMPATIBILITY IDEOGRAPH-F9E2; QQC
+2F8E6 ; [.FB40.0020.0002.6914][.E914.0000.0000.6914] # CJK COMPATIBILITY IDEOGRAPH-2F8E6; QQC
+2F8E8 ; [.FB40.0020.0002.6942][.E942.0000.0000.6942] # CJK COMPATIBILITY IDEOGRAPH-2F8E8; QQC
+2F8E9 ; [.FB40.0020.0002.69A3][.E9A3.0000.0000.69A3] # CJK COMPATIBILITY IDEOGRAPH-2F8E9; QQC
+2F8EA ; [.FB40.0020.0002.69EA][.E9EA.0000.0000.69EA] # CJK COMPATIBILITY IDEOGRAPH-2F8EA; QQC
+F914 ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F914; QQC
+F95C ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F95C; QQC
+F9BF ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F9BF; QQC
+F94C ; [.FB40.0020.0002.6A13][.EA13.0000.0000.6A13] # CJK COMPATIBILITY IDEOGRAPH-F94C; QQC
+2F8EB ; [.FB40.0020.0002.6AA8][.EAA8.0000.0000.6AA8] # CJK COMPATIBILITY IDEOGRAPH-2F8EB; QQC
+F931 ; [.FB40.0020.0002.6AD3][.EAD3.0000.0000.6AD3] # CJK COMPATIBILITY IDEOGRAPH-F931; QQC
+2F8ED ; [.FB40.0020.0002.6ADB][.EADB.0000.0000.6ADB] # CJK COMPATIBILITY IDEOGRAPH-2F8ED; QQC
+F91D ; [.FB40.0020.0002.6B04][.EB04.0000.0000.6B04] # CJK COMPATIBILITY IDEOGRAPH-F91D; QQC
+2F4B ; [.FB40.0020.0004.6B20][.EB20.0000.0000.6B20] # KANGXI RADICAL LACK; QQK
+2F8EF ; [.FB40.0020.0002.6B21][.EB21.0000.0000.6B21] # CJK COMPATIBILITY IDEOGRAPH-2F8EF; QQC
+2F8F1 ; [.FB40.0020.0002.6B54][.EB54.0000.0000.6B54] # CJK COMPATIBILITY IDEOGRAPH-2F8F1; QQC
+2F4C ; [.FB40.0020.0004.6B62][.EB62.0000.0000.6B62] # KANGXI RADICAL STOP; QQK
+32A3 ; [.FB40.0020.0006.6B63][.EB63.0000.0000.6B63] # CIRCLED IDEOGRAPH CORRECT; QQK
+2F8F3 ; [.FB40.0020.0002.6B72][.EB72.0000.0000.6B72] # CJK COMPATIBILITY IDEOGRAPH-2F8F3; QQC
+F98C ; [.FB40.0020.0002.6B77][.EB77.0000.0000.6B77] # CJK COMPATIBILITY IDEOGRAPH-F98C; QQC
+2F4D ; [.FB40.0020.0004.6B79][.EB79.0000.0000.6B79] # KANGXI RADICAL DEATH; QQK
+2E9E ; [.FB40.0020.0004.6B7A][.EB7A.0000.0000.6B7A][.0000.015D.001F.2E9E] # CJK RADICAL DEATH; QQKN
+2F8F4 ; [.FB40.0020.0002.6B9F][.EB9F.0000.0000.6B9F] # CJK COMPATIBILITY IDEOGRAPH-2F8F4; QQC
+F9A5 ; [.FB40.0020.0002.6BAE][.EBAE.0000.0000.6BAE] # CJK COMPATIBILITY IDEOGRAPH-F9A5; QQC
+2F4E ; [.FB40.0020.0004.6BB3][.EBB3.0000.0000.6BB3] # KANGXI RADICAL WEAPON; QQK
+F970 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-F970; QQC
+2F8F5 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-2F8F5; QQC
+2F8F6 ; [.FB40.0020.0002.6BBB][.EBBB.0000.0000.6BBB] # CJK COMPATIBILITY IDEOGRAPH-2F8F6; QQC
+2F4F ; [.FB40.0020.0004.6BCB][.EBCB.0000.0000.6BCB] # KANGXI RADICAL DO NOT; QQK
+2E9F ; [.FB40.0020.0004.6BCD][.EBCD.0000.0000.6BCD] # CJK RADICAL MOTHER; QQK
+2F50 ; [.FB40.0020.0004.6BD4][.EBD4.0000.0000.6BD4] # KANGXI RADICAL COMPARE; QQK
+2F51 ; [.FB40.0020.0004.6BDB][.EBDB.0000.0000.6BDB] # KANGXI RADICAL FUR; QQK
+2F52 ; [.FB40.0020.0004.6C0F][.EC0F.0000.0000.6C0F] # KANGXI RADICAL CLAN; QQK
+2EA0 ; [.FB40.0020.0004.6C11][.EC11.0000.0000.6C11] # CJK RADICAL CIVILIAN; QQK
+2F53 ; [.FB40.0020.0004.6C14][.EC14.0000.0000.6C14] # KANGXI RADICAL STEAM; QQK
+2F54 ; [.FB40.0020.0004.6C34][.EC34.0000.0000.6C34] # KANGXI RADICAL WATER; QQK
+322C ; [*0288.0020.0004.322C][.FB40.0020.0004.6C34][.EC34.0000.0000.6C34][*0289.0020.001F.322C] # PARENTHESIZED IDEOGRAPH WATER; QQKN
+328C ; [.FB40.0020.0006.6C34][.EC34.0000.0000.6C34] # CIRCLED IDEOGRAPH WATER; QQK
+2EA1 ; [.FB40.0020.0004.6C35][.EC35.0000.0000.6C35] # CJK RADICAL WATER ONE; QQK
+2EA2 ; [.FB40.0020.0004.6C3A][.EC3A.0000.0000.6C3A] # CJK RADICAL WATER TWO; QQK
+2F8FA ; [.FB40.0020.0002.6C4E][.EC4E.0000.0000.6C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8FA; QQC
+2F8FE ; [.FB40.0020.0002.6C67][.EC67.0000.0000.6C67] # CJK COMPATIBILITY IDEOGRAPH-2F8FE; QQC
+F972 ; [.FB40.0020.0002.6C88][.EC88.0000.0000.6C88] # CJK COMPATIBILITY IDEOGRAPH-F972; QQC
+2F8FC ; [.FB40.0020.0002.6CBF][.ECBF.0000.0000.6CBF] # CJK COMPATIBILITY IDEOGRAPH-2F8FC; QQC
+F968 ; [.FB40.0020.0002.6CCC][.ECCC.0000.0000.6CCC] # CJK COMPATIBILITY IDEOGRAPH-F968; QQC
+2F8FD ; [.FB40.0020.0002.6CCD][.ECCD.0000.0000.6CCD] # CJK COMPATIBILITY IDEOGRAPH-2F8FD; QQC
+F9E3 ; [.FB40.0020.0002.6CE5][.ECE5.0000.0000.6CE5] # CJK COMPATIBILITY IDEOGRAPH-F9E3; QQC
+329F ; [.FB40.0020.0006.6CE8][.ECE8.0000.0000.6CE8] # CIRCLED IDEOGRAPH ATTENTION; QQK
+2F8FF ; [.FB40.0020.0002.6D16][.ED16.0000.0000.6D16] # CJK COMPATIBILITY IDEOGRAPH-2F8FF; QQC
+F915 ; [.FB40.0020.0002.6D1B][.ED1B.0000.0000.6D1B] # CJK COMPATIBILITY IDEOGRAPH-F915; QQC
+FA05 ; [.FB40.0020.0002.6D1E][.ED1E.0000.0000.6D1E] # CJK COMPATIBILITY IDEOGRAPH-FA05; QQC
+2F907 ; [.FB40.0020.0002.6D34][.ED34.0000.0000.6D34] # CJK COMPATIBILITY IDEOGRAPH-2F907; QQC
+2F900 ; [.FB40.0020.0002.6D3E][.ED3E.0000.0000.6D3E] # CJK COMPATIBILITY IDEOGRAPH-2F900; QQC
+F9CA ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-F9CA; QQC
+2F902 ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-2F902; QQC
+2F903 ; [.FB40.0020.0002.6D69][.ED69.0000.0000.6D69] # CJK COMPATIBILITY IDEOGRAPH-2F903; QQC
+F92A ; [.FB40.0020.0002.6D6A][.ED6A.0000.0000.6D6A] # CJK COMPATIBILITY IDEOGRAPH-F92A; QQC
+FA45 ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-FA45; QQC
+2F901 ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-2F901; QQC
+2F904 ; [.FB40.0020.0002.6D78][.ED78.0000.0000.6D78] # CJK COMPATIBILITY IDEOGRAPH-2F904; QQC
+2F905 ; [.FB40.0020.0002.6D85][.ED85.0000.0000.6D85] # CJK COMPATIBILITY IDEOGRAPH-2F905; QQC
+F9F5 ; [.FB40.0020.0002.6DCB][.EDCB.0000.0000.6DCB] # CJK COMPATIBILITY IDEOGRAPH-F9F5; QQC
+F94D ; [.FB40.0020.0002.6DDA][.EDDA.0000.0000.6DDA] # CJK COMPATIBILITY IDEOGRAPH-F94D; QQC
+F9D6 ; [.FB40.0020.0002.6DEA][.EDEA.0000.0000.6DEA] # CJK COMPATIBILITY IDEOGRAPH-F9D6; QQC
+2F90E ; [.FB40.0020.0002.6DF9][.EDF9.0000.0000.6DF9] # CJK COMPATIBILITY IDEOGRAPH-2F90E; QQC
+FA46 ; [.FB40.0020.0002.6E1A][.EE1A.0000.0000.6E1A] # CJK COMPATIBILITY IDEOGRAPH-FA46; QQC
+2F908 ; [.FB40.0020.0002.6E2F][.EE2F.0000.0000.6E2F] # CJK COMPATIBILITY IDEOGRAPH-2F908; QQC
+2F909 ; [.FB40.0020.0002.6E6E][.EE6E.0000.0000.6E6E] # CJK COMPATIBILITY IDEOGRAPH-2F909; QQC
+F9CB ; [.FB40.0020.0002.6E9C][.EE9C.0000.0000.6E9C] # CJK COMPATIBILITY IDEOGRAPH-F9CB; QQC
+F9EC ; [.FB40.0020.0002.6EBA][.EEBA.0000.0000.6EBA] # CJK COMPATIBILITY IDEOGRAPH-F9EC; QQC
+2F90C ; [.FB40.0020.0002.6EC7][.EEC7.0000.0000.6EC7] # CJK COMPATIBILITY IDEOGRAPH-2F90C; QQC
+2F90B ; [.FB40.0020.0002.6ECB][.EECB.0000.0000.6ECB] # CJK COMPATIBILITY IDEOGRAPH-2F90B; QQC
+F904 ; [.FB40.0020.0002.6ED1][.EED1.0000.0000.6ED1] # CJK COMPATIBILITY IDEOGRAPH-F904; QQC
+F94E ; [.FB40.0020.0002.6F0F][.EF0F.0000.0000.6F0F] # CJK COMPATIBILITY IDEOGRAPH-F94E; QQC
+FA47 ; [.FB40.0020.0002.6F22][.EF22.0000.0000.6F22] # CJK COMPATIBILITY IDEOGRAPH-FA47; QQC
+F992 ; [.FB40.0020.0002.6F23][.EF23.0000.0000.6F23] # CJK COMPATIBILITY IDEOGRAPH-F992; QQC
+2F90F ; [.FB40.0020.0002.6F6E][.EF6E.0000.0000.6F6E] # CJK COMPATIBILITY IDEOGRAPH-2F90F; QQC
+2F912 ; [.FB40.0020.0002.6FC6][.EFC6.0000.0000.6FC6] # CJK COMPATIBILITY IDEOGRAPH-2F912; QQC
+F922 ; [.FB40.0020.0002.6FEB][.EFEB.0000.0000.6FEB] # CJK COMPATIBILITY IDEOGRAPH-F922; QQC
+F984 ; [.FB40.0020.0002.6FFE][.EFFE.0000.0000.6FFE] # CJK COMPATIBILITY IDEOGRAPH-F984; QQC
+2F915 ; [.FB40.0020.0002.701B][.F01B.0000.0000.701B] # CJK COMPATIBILITY IDEOGRAPH-2F915; QQC
+2F914 ; [.FB40.0020.0002.701E][.F01E.0000.0000.701E] # CJK COMPATIBILITY IDEOGRAPH-2F914; QQC
+2F913 ; [.FB40.0020.0002.7039][.F039.0000.0000.7039] # CJK COMPATIBILITY IDEOGRAPH-2F913; QQC
+2F917 ; [.FB40.0020.0002.704A][.F04A.0000.0000.704A] # CJK COMPATIBILITY IDEOGRAPH-2F917; QQC
+2F55 ; [.FB40.0020.0004.706B][.F06B.0000.0000.706B] # KANGXI RADICAL FIRE; QQK
+322B ; [*0288.0020.0004.322B][.FB40.0020.0004.706B][.F06B.0000.0000.706B][*0289.0020.001F.322B] # PARENTHESIZED IDEOGRAPH FIRE; QQKN
+328B ; [.FB40.0020.0006.706B][.F06B.0000.0000.706B] # CIRCLED IDEOGRAPH FIRE; QQK
+2EA3 ; [.FB40.0020.0004.706C][.F06C.0000.0000.706C] # CJK RADICAL FIRE; QQK
+2F835 ; [.FB40.0020.0002.7070][.F070.0000.0000.7070] # CJK COMPATIBILITY IDEOGRAPH-2F835; QQC
+2F919 ; [.FB40.0020.0002.7077][.F077.0000.0000.7077] # CJK COMPATIBILITY IDEOGRAPH-2F919; QQC
+2F918 ; [.FB40.0020.0002.707D][.F07D.0000.0000.707D] # CJK COMPATIBILITY IDEOGRAPH-2F918; QQC
+F9FB ; [.FB40.0020.0002.7099][.F099.0000.0000.7099] # CJK COMPATIBILITY IDEOGRAPH-F9FB; QQC
+2F91A ; [.FB40.0020.0002.70AD][.F0AD.0000.0000.70AD] # CJK COMPATIBILITY IDEOGRAPH-2F91A; QQC
+F99F ; [.FB40.0020.0002.70C8][.F0C8.0000.0000.70C8] # CJK COMPATIBILITY IDEOGRAPH-F99F; QQC
+F916 ; [.FB40.0020.0002.70D9][.F0D9.0000.0000.70D9] # CJK COMPATIBILITY IDEOGRAPH-F916; QQC
+2F91C ; [.FB40.0020.0002.7145][.F145.0000.0000.7145] # CJK COMPATIBILITY IDEOGRAPH-2F91C; QQC
+F993 ; [.FB40.0020.0002.7149][.F149.0000.0000.7149] # CJK COMPATIBILITY IDEOGRAPH-F993; QQC
+FA48 ; [.FB40.0020.0002.716E][.F16E.0000.0000.716E] # CJK COMPATIBILITY IDEOGRAPH-FA48; QQC
+2F91E ; [.FB40.0020.0002.719C][.F19C.0000.0000.719C] # CJK COMPATIBILITY IDEOGRAPH-2F91E; QQC
+F9C0 ; [.FB40.0020.0002.71CE][.F1CE.0000.0000.71CE] # CJK COMPATIBILITY IDEOGRAPH-F9C0; QQC
+F9EE ; [.FB40.0020.0002.71D0][.F1D0.0000.0000.71D0] # CJK COMPATIBILITY IDEOGRAPH-F9EE; QQC
+F932 ; [.FB40.0020.0002.7210][.F210.0000.0000.7210] # CJK COMPATIBILITY IDEOGRAPH-F932; QQC
+F91E ; [.FB40.0020.0002.721B][.F21B.0000.0000.721B] # CJK COMPATIBILITY IDEOGRAPH-F91E; QQC
+2F920 ; [.FB40.0020.0002.7228][.F228.0000.0000.7228] # CJK COMPATIBILITY IDEOGRAPH-2F920; QQC
+2F56 ; [.FB40.0020.0004.722A][.F22A.0000.0000.722A] # KANGXI RADICAL CLAW; QQK
+FA49 ; [.FB40.0020.0002.722B][.F22B.0000.0000.722B] # CJK COMPATIBILITY IDEOGRAPH-FA49; QQC
+2EA4 ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B] # CJK RADICAL PAW ONE; QQK
+2EA5 ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B][.0000.015D.001F.2EA5] # CJK RADICAL PAW TWO; QQKN
+2F921 ; [.FB40.0020.0002.7235][.F235.0000.0000.7235] # CJK COMPATIBILITY IDEOGRAPH-2F921; QQC
+2F57 ; [.FB40.0020.0004.7236][.F236.0000.0000.7236] # KANGXI RADICAL FATHER; QQK
+2F58 ; [.FB40.0020.0004.723B][.F23B.0000.0000.723B] # KANGXI RADICAL DOUBLE X; QQK
+2F59 ; [.FB40.0020.0004.723F][.F23F.0000.0000.723F] # KANGXI RADICAL HALF TREE TRUNK; QQK
+2F5A ; [.FB40.0020.0004.7247][.F247.0000.0000.7247] # KANGXI RADICAL SLICE; QQK
+2F922 ; [.FB40.0020.0002.7250][.F250.0000.0000.7250] # CJK COMPATIBILITY IDEOGRAPH-2F922; QQC
+2F5B ; [.FB40.0020.0004.7259][.F259.0000.0000.7259] # KANGXI RADICAL FANG; QQK
+2F5C ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B] # KANGXI RADICAL COW; QQK
+2EA7 ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B][.0000.015D.001F.2EA7] # CJK RADICAL COW; QQKN
+F946 ; [.FB40.0020.0002.7262][.F262.0000.0000.7262] # CJK COMPATIBILITY IDEOGRAPH-F946; QQC
+3235 ; [*0288.0020.0004.3235][.FB40.0020.0004.7279][.F279.0000.0000.7279][*0289.0020.001F.3235] # PARENTHESIZED IDEOGRAPH SPECIAL; QQKN
+3295 ; [.FB40.0020.0006.7279][.F279.0000.0000.7279] # CIRCLED IDEOGRAPH SPECIAL; QQK
+2F924 ; [.FB40.0020.0002.7280][.F280.0000.0000.7280] # CJK COMPATIBILITY IDEOGRAPH-2F924; QQC
+2F925 ; [.FB40.0020.0002.7295][.F295.0000.0000.7295] # CJK COMPATIBILITY IDEOGRAPH-2F925; QQC
+2F5D ; [.FB40.0020.0004.72AC][.F2AC.0000.0000.72AC] # KANGXI RADICAL DOG; QQK
+2EA8 ; [.FB40.0020.0004.72AD][.F2AD.0000.0000.72AD] # CJK RADICAL DOG; QQK
+F9FA ; [.FB40.0020.0002.72C0][.F2C0.0000.0000.72C0] # CJK COMPATIBILITY IDEOGRAPH-F9FA; QQC
+F92B ; [.FB40.0020.0002.72FC][.F2FC.0000.0000.72FC] # CJK COMPATIBILITY IDEOGRAPH-F92B; QQC
+FA16 ; [.FB40.0020.0002.732A][.F32A.0000.0000.732A] # CJK COMPATIBILITY IDEOGRAPH-FA16; QQC
+F9A7 ; [.FB40.0020.0002.7375][.F375.0000.0000.7375] # CJK COMPATIBILITY IDEOGRAPH-F9A7; QQC
+2F928 ; [.FB40.0020.0002.737A][.F37A.0000.0000.737A] # CJK COMPATIBILITY IDEOGRAPH-2F928; QQC
+2F5E ; [.FB40.0020.0004.7384][.F384.0000.0000.7384] # KANGXI RADICAL PROFOUND; QQK
+F961 ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F961; QQC
+F9DB ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F9DB; QQC
+2F5F ; [.FB40.0020.0004.7389][.F389.0000.0000.7389] # KANGXI RADICAL JADE; QQK
+2F929 ; [.FB40.0020.0002.738B][.F38B.0000.0000.738B] # CJK COMPATIBILITY IDEOGRAPH-2F929; QQC
+2EA9 ; [.FB40.0020.0004.738B][.F38B.0000.0000.738B][.0000.015D.001F.2EA9] # CJK RADICAL JADE; QQKN
+2F92B ; [.FB40.0020.0002.73A5][.F3A5.0000.0000.73A5] # CJK COMPATIBILITY IDEOGRAPH-2F92B; QQC
+F9AD ; [.FB40.0020.0002.73B2][.F3B2.0000.0000.73B2] # CJK COMPATIBILITY IDEOGRAPH-F9AD; QQC
+F917 ; [.FB40.0020.0002.73DE][.F3DE.0000.0000.73DE] # CJK COMPATIBILITY IDEOGRAPH-F917; QQC
+F9E4 ; [.FB40.0020.0002.7406][.F406.0000.0000.7406] # CJK COMPATIBILITY IDEOGRAPH-F9E4; QQC
+F9CC ; [.FB40.0020.0002.7409][.F409.0000.0000.7409] # CJK COMPATIBILITY IDEOGRAPH-F9CC; QQC
+FA4A ; [.FB40.0020.0002.7422][.F422.0000.0000.7422] # CJK COMPATIBILITY IDEOGRAPH-FA4A; QQC
+2F92E ; [.FB40.0020.0002.7447][.F447.0000.0000.7447] # CJK COMPATIBILITY IDEOGRAPH-2F92E; QQC
+2F92F ; [.FB40.0020.0002.745C][.F45C.0000.0000.745C] # CJK COMPATIBILITY IDEOGRAPH-2F92F; QQC
+F9AE ; [.FB40.0020.0002.7469][.F469.0000.0000.7469] # CJK COMPATIBILITY IDEOGRAPH-F9AE; QQC
+2F930 ; [.FB40.0020.0002.7471][.F471.0000.0000.7471] # CJK COMPATIBILITY IDEOGRAPH-2F930; QQC
+2F931 ; [.FB40.0020.0002.7485][.F485.0000.0000.7485] # CJK COMPATIBILITY IDEOGRAPH-2F931; QQC
+F994 ; [.FB40.0020.0002.7489][.F489.0000.0000.7489] # CJK COMPATIBILITY IDEOGRAPH-F994; QQC
+F9EF ; [.FB40.0020.0002.7498][.F498.0000.0000.7498] # CJK COMPATIBILITY IDEOGRAPH-F9EF; QQC
+2F932 ; [.FB40.0020.0002.74CA][.F4CA.0000.0000.74CA] # CJK COMPATIBILITY IDEOGRAPH-2F932; QQC
+2F60 ; [.FB40.0020.0004.74DC][.F4DC.0000.0000.74DC] # KANGXI RADICAL MELON; QQK
+2F61 ; [.FB40.0020.0004.74E6][.F4E6.0000.0000.74E6] # KANGXI RADICAL TILE; QQK
+2F62 ; [.FB40.0020.0004.7518][.F518.0000.0000.7518] # KANGXI RADICAL SWEET; QQK
+2F63 ; [.FB40.0020.0004.751F][.F51F.0000.0000.751F] # KANGXI RADICAL LIFE; QQK
+2F934 ; [.FB40.0020.0002.7524][.F524.0000.0000.7524] # CJK COMPATIBILITY IDEOGRAPH-2F934; QQC
+2F64 ; [.FB40.0020.0004.7528][.F528.0000.0000.7528] # KANGXI RADICAL USE; QQK
+2F65 ; [.FB40.0020.0004.7530][.F530.0000.0000.7530] # KANGXI RADICAL FIELD; QQK
+3199 ; [.FB40.0020.0014.7532][.F532.0000.0000.7532] # IDEOGRAPHIC ANNOTATION FIRST MARK; QQK
+329A ; [.FB40.0020.0006.7537][.F537.0000.0000.7537] # CIRCLED IDEOGRAPH MALE; QQK
+2F936 ; [.FB40.0020.0002.753E][.F53E.0000.0000.753E] # CJK COMPATIBILITY IDEOGRAPH-2F936; QQC
+F9CD ; [.FB40.0020.0002.7559][.F559.0000.0000.7559] # CJK COMPATIBILITY IDEOGRAPH-F9CD; QQC
+F976 ; [.FB40.0020.0002.7565][.F565.0000.0000.7565] # CJK COMPATIBILITY IDEOGRAPH-F976; QQC
+F962 ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-F962; QQC
+2F938 ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-2F938; QQC
+2F66 ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B] # KANGXI RADICAL BOLT OF CLOTH; QQK
+2EAA ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B][.0000.015D.001F.2EAA] # CJK RADICAL BOLT OF CLOTH; QQKN
+2F67 ; [.FB40.0020.0004.7592][.F592.0000.0000.7592] # KANGXI RADICAL SICKNESS; QQK
+F9E5 ; [.FB40.0020.0002.75E2][.F5E2.0000.0000.75E2] # CJK COMPATIBILITY IDEOGRAPH-F9E5; QQC
+2F93A ; [.FB40.0020.0002.7610][.F610.0000.0000.7610] # CJK COMPATIBILITY IDEOGRAPH-2F93A; QQC
+F9C1 ; [.FB40.0020.0002.7642][.F642.0000.0000.7642] # CJK COMPATIBILITY IDEOGRAPH-F9C1; QQC
+F90E ; [.FB40.0020.0002.7669][.F669.0000.0000.7669] # CJK COMPATIBILITY IDEOGRAPH-F90E; QQC
+2F68 ; [.FB40.0020.0004.7676][.F676.0000.0000.7676] # KANGXI RADICAL DOTTED TENT; QQK
+2F69 ; [.FB40.0020.0004.767D][.F67D.0000.0000.767D] # KANGXI RADICAL WHITE; QQK
+2F6A ; [.FB40.0020.0004.76AE][.F6AE.0000.0000.76AE] # KANGXI RADICAL SKIN; QQK
+2F6B ; [.FB40.0020.0004.76BF][.F6BF.0000.0000.76BF] # KANGXI RADICAL DISH; QQK
+FA17 ; [.FB40.0020.0002.76CA][.F6CA.0000.0000.76CA] # CJK COMPATIBILITY IDEOGRAPH-FA17; QQC
+323C ; [*0288.0020.0004.323C][.FB40.0020.0004.76E3][.F6E3.0000.0000.76E3][*0289.0020.001F.323C] # PARENTHESIZED IDEOGRAPH SUPERVISE; QQKN
+32AC ; [.FB40.0020.0006.76E3][.F6E3.0000.0000.76E3] # CIRCLED IDEOGRAPH SUPERVISE; QQK
+F933 ; [.FB40.0020.0002.76E7][.F6E7.0000.0000.76E7] # CJK COMPATIBILITY IDEOGRAPH-F933; QQC
+2F6C ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE] # KANGXI RADICAL EYE; QQK
+2EAB ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE][.0000.015D.001F.2EAB] # CJK RADICAL EYE; QQKN
+2F940 ; [.FB40.0020.0002.76F4][.F6F4.0000.0000.76F4] # CJK COMPATIBILITY IDEOGRAPH-2F940; QQC
+F96D ; [.FB40.0020.0002.7701][.F701.0000.0000.7701] # CJK COMPATIBILITY IDEOGRAPH-F96D; QQC
+2F945 ; [.FB40.0020.0002.771E][.F71E.0000.0000.771E] # CJK COMPATIBILITY IDEOGRAPH-2F945; QQC
+2F946 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F946; QQC
+2F947 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F947; QQC
+2F948 ; [.FB40.0020.0002.774A][.F74A.0000.0000.774A] # CJK COMPATIBILITY IDEOGRAPH-2F948; QQC
+2F94A ; [.FB40.0020.0002.778B][.F78B.0000.0000.778B] # CJK COMPATIBILITY IDEOGRAPH-2F94A; QQC
+2F6D ; [.FB40.0020.0004.77DB][.F7DB.0000.0000.77DB] # KANGXI RADICAL SPEAR; QQK
+2F6E ; [.FB40.0020.0004.77E2][.F7E2.0000.0000.77E2] # KANGXI RADICAL ARROW; QQK
+2F6F ; [.FB40.0020.0004.77F3][.F7F3.0000.0000.77F3] # KANGXI RADICAL STONE; QQK
+2F94E ; [.FB40.0020.0002.784E][.F84E.0000.0000.784E] # CJK COMPATIBILITY IDEOGRAPH-2F94E; QQC
+F9CE ; [.FB40.0020.0002.786B][.F86B.0000.0000.786B] # CJK COMPATIBILITY IDEOGRAPH-F9CE; QQC
+F93B ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-F93B; QQC
+2F94F ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-2F94F; QQC
+FA4B ; [.FB40.0020.0002.7891][.F891.0000.0000.7891] # CJK COMPATIBILITY IDEOGRAPH-FA4B; QQC
+F947 ; [.FB40.0020.0002.78CA][.F8CA.0000.0000.78CA] # CJK COMPATIBILITY IDEOGRAPH-F947; QQC
+2F950 ; [.FB40.0020.0002.78CC][.F8CC.0000.0000.78CC] # CJK COMPATIBILITY IDEOGRAPH-2F950; QQC
+F964 ; [.FB40.0020.0002.78FB][.F8FB.0000.0000.78FB] # CJK COMPATIBILITY IDEOGRAPH-F964; QQC
+F985 ; [.FB40.0020.0002.792A][.F92A.0000.0000.792A] # CJK COMPATIBILITY IDEOGRAPH-F985; QQC
+2F70 ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A] # KANGXI RADICAL SPIRIT; QQK
+2EAC ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A][.0000.015D.001F.2EAC] # CJK RADICAL SPIRIT ONE; QQKN
+2EAD ; [.FB40.0020.0004.793B][.F93B.0000.0000.793B] # CJK RADICAL SPIRIT TWO; QQK
+FA18 ; [.FB40.0020.0002.793C][.F93C.0000.0000.793C] # CJK COMPATIBILITY IDEOGRAPH-FA18; QQC
+FA4C ; [.FB40.0020.0002.793E][.F93E.0000.0000.793E] # CJK COMPATIBILITY IDEOGRAPH-FA4C; QQC
+3233 ; [*0288.0020.0004.3233][.FB40.0020.0004.793E][.F93E.0000.0000.793E][*0289.0020.001F.3233] # PARENTHESIZED IDEOGRAPH SOCIETY; QQKN
+3293 ; [.FB40.0020.0006.793E][.F93E.0000.0000.793E] # CIRCLED IDEOGRAPH SOCIETY; QQK
+FA4E ; [.FB40.0020.0002.7948][.F948.0000.0000.7948] # CJK COMPATIBILITY IDEOGRAPH-FA4E; QQC
+FA4D ; [.FB40.0020.0002.7949][.F949.0000.0000.7949] # CJK COMPATIBILITY IDEOGRAPH-FA4D; QQC
+FA4F ; [.FB40.0020.0002.7950][.F950.0000.0000.7950] # CJK COMPATIBILITY IDEOGRAPH-FA4F; QQC
+FA50 ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-FA50; QQC
+2F953 ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-2F953; QQC
+FA51 ; [.FB40.0020.0002.795D][.F95D.0000.0000.795D] # CJK COMPATIBILITY IDEOGRAPH-FA51; QQC
+3237 ; [*0288.0020.0004.3237][.FB40.0020.0004.795D][.F95D.0000.0000.795D][*0289.0020.001F.3237] # PARENTHESIZED IDEOGRAPH CONGRATULATION; QQKN
+3297 ; [.FB40.0020.0006.795D][.F95D.0000.0000.795D] # CIRCLED IDEOGRAPH CONGRATULATION; QQK
+FA19 ; [.FB40.0020.0002.795E][.F95E.0000.0000.795E] # CJK COMPATIBILITY IDEOGRAPH-FA19; QQC
+FA1A ; [.FB40.0020.0002.7965][.F965.0000.0000.7965] # CJK COMPATIBILITY IDEOGRAPH-FA1A; QQC
+3240 ; [*0288.0020.0004.3240][.FB40.0020.0004.796D][.F96D.0000.0000.796D][*0289.0020.001F.3240] # PARENTHESIZED IDEOGRAPH FESTIVAL; QQKN
+F93C ; [.FB40.0020.0002.797F][.F97F.0000.0000.797F] # CJK COMPATIBILITY IDEOGRAPH-F93C; QQC
+FA52 ; [.FB40.0020.0002.798D][.F98D.0000.0000.798D] # CJK COMPATIBILITY IDEOGRAPH-FA52; QQC
+FA53 ; [.FB40.0020.0002.798E][.F98E.0000.0000.798E] # CJK COMPATIBILITY IDEOGRAPH-FA53; QQC
+FA1B ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-FA1B; QQC
+2F956 ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-2F956; QQC
+F9B6 ; [.FB40.0020.0002.79AE][.F9AE.0000.0000.79AE] # CJK COMPATIBILITY IDEOGRAPH-F9B6; QQC
+2F71 ; [.FB40.0020.0004.79B8][.F9B8.0000.0000.79B8] # KANGXI RADICAL TRACK; QQK
+2F72 ; [.FB40.0020.0004.79BE][.F9BE.0000.0000.79BE] # KANGXI RADICAL GRAIN; QQK
+F995 ; [.FB40.0020.0002.79CA][.F9CA.0000.0000.79CA] # CJK COMPATIBILITY IDEOGRAPH-F995; QQC
+3299 ; [.FB40.0020.0006.79D8][.F9D8.0000.0000.79D8] # CIRCLED IDEOGRAPH SECRET; QQK
+2F957 ; [.FB40.0020.0002.79EB][.F9EB.0000.0000.79EB] # CJK COMPATIBILITY IDEOGRAPH-2F957; QQC
+F956 ; [.FB40.0020.0002.7A1C][.FA1C.0000.0000.7A1C] # CJK COMPATIBILITY IDEOGRAPH-F956; QQC
+FA54 ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-FA54; QQC
+2F959 ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-2F959; QQC
+2F95A ; [.FB40.0020.0002.7A4A][.FA4A.0000.0000.7A4A] # CJK COMPATIBILITY IDEOGRAPH-2F95A; QQC
+2F95B ; [.FB40.0020.0002.7A4F][.FA4F.0000.0000.7A4F] # CJK COMPATIBILITY IDEOGRAPH-2F95B; QQC
+2F73 ; [.FB40.0020.0004.7A74][.FA74.0000.0000.7A74] # KANGXI RADICAL CAVE; QQK
+FA55 ; [.FB40.0020.0002.7A81][.FA81.0000.0000.7A81] # CJK COMPATIBILITY IDEOGRAPH-FA55; QQC
+F9F7 ; [.FB40.0020.0002.7ACB][.FACB.0000.0000.7ACB] # CJK COMPATIBILITY IDEOGRAPH-F9F7; QQC
+2F74 ; [.FB40.0020.0004.7ACB][.FACB.0000.0000.7ACB] # KANGXI RADICAL STAND; QQK
+2F95F ; [.FB40.0020.0002.7AEE][.FAEE.0000.0000.7AEE] # CJK COMPATIBILITY IDEOGRAPH-2F95F; QQC
+2F75 ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9] # KANGXI RADICAL BAMBOO; QQK
+2EAE ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9][.0000.015D.001F.2EAE] # CJK RADICAL BAMBOO; QQKN
+F9F8 ; [.FB40.0020.0002.7B20][.FB20.0000.0000.7B20] # CJK COMPATIBILITY IDEOGRAPH-F9F8; QQC
+FA56 ; [.FB40.0020.0002.7BC0][.FBC0.0000.0000.7BC0] # CJK COMPATIBILITY IDEOGRAPH-FA56; QQC
+2F962 ; [.FB40.0020.0002.7BC6][.FBC6.0000.0000.7BC6] # CJK COMPATIBILITY IDEOGRAPH-2F962; QQC
+2F963 ; [.FB40.0020.0002.7BC9][.FBC9.0000.0000.7BC9] # CJK COMPATIBILITY IDEOGRAPH-2F963; QQC
+F9A6 ; [.FB40.0020.0002.7C3E][.FC3E.0000.0000.7C3E] # CJK COMPATIBILITY IDEOGRAPH-F9A6; QQC
+F944 ; [.FB40.0020.0002.7C60][.FC60.0000.0000.7C60] # CJK COMPATIBILITY IDEOGRAPH-F944; QQC
+2F76 ; [.FB40.0020.0004.7C73][.FC73.0000.0000.7C73] # KANGXI RADICAL RICE; QQK
+F9F9 ; [.FB40.0020.0002.7C92][.FC92.0000.0000.7C92] # CJK COMPATIBILITY IDEOGRAPH-F9F9; QQC
+FA1D ; [.FB40.0020.0002.7CBE][.FCBE.0000.0000.7CBE] # CJK COMPATIBILITY IDEOGRAPH-FA1D; QQC
+2F966 ; [.FB40.0020.0002.7CD2][.FCD2.0000.0000.7CD2] # CJK COMPATIBILITY IDEOGRAPH-2F966; QQC
+FA03 ; [.FB40.0020.0002.7CD6][.FCD6.0000.0000.7CD6] # CJK COMPATIBILITY IDEOGRAPH-FA03; QQC
+2F969 ; [.FB40.0020.0002.7CE3][.FCE3.0000.0000.7CE3] # CJK COMPATIBILITY IDEOGRAPH-2F969; QQC
+F97B ; [.FB40.0020.0002.7CE7][.FCE7.0000.0000.7CE7] # CJK COMPATIBILITY IDEOGRAPH-F97B; QQC
+2F968 ; [.FB40.0020.0002.7CE8][.FCE8.0000.0000.7CE8] # CJK COMPATIBILITY IDEOGRAPH-2F968; QQC
+2F77 ; [.FB40.0020.0004.7CF8][.FCF8.0000.0000.7CF8] # KANGXI RADICAL SILK; QQK
+2EAF ; [.FB40.0020.0004.7CF9][.FCF9.0000.0000.7CF9] # CJK RADICAL SILK; QQK
+2F96A ; [.FB40.0020.0002.7D00][.FD00.0000.0000.7D00] # CJK COMPATIBILITY IDEOGRAPH-2F96A; QQC
+F9CF ; [.FB40.0020.0002.7D10][.FD10.0000.0000.7D10] # CJK COMPATIBILITY IDEOGRAPH-F9CF; QQC
+F96A ; [.FB40.0020.0002.7D22][.FD22.0000.0000.7D22] # CJK COMPATIBILITY IDEOGRAPH-F96A; QQC
+F94F ; [.FB40.0020.0002.7D2F][.FD2F.0000.0000.7D2F] # CJK COMPATIBILITY IDEOGRAPH-F94F; QQC
+2F96C ; [.FB40.0020.0002.7D63][.FD63.0000.0000.7D63] # CJK COMPATIBILITY IDEOGRAPH-2F96C; QQC
+F93D ; [.FB40.0020.0002.7DA0][.FDA0.0000.0000.7DA0] # CJK COMPATIBILITY IDEOGRAPH-F93D; QQC
+F957 ; [.FB40.0020.0002.7DBE][.FDBE.0000.0000.7DBE] # CJK COMPATIBILITY IDEOGRAPH-F957; QQC
+2F96E ; [.FB40.0020.0002.7DC7][.FDC7.0000.0000.7DC7] # CJK COMPATIBILITY IDEOGRAPH-2F96E; QQC
+F996 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-F996; QQC
+FA57 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-FA57; QQC
+2F96F ; [.FB40.0020.0002.7E02][.FE02.0000.0000.7E02] # CJK COMPATIBILITY IDEOGRAPH-2F96F; QQC
+FA58 ; [.FB40.0020.0002.7E09][.FE09.0000.0000.7E09] # CJK COMPATIBILITY IDEOGRAPH-FA58; QQC
+F950 ; [.FB40.0020.0002.7E37][.FE37.0000.0000.7E37] # CJK COMPATIBILITY IDEOGRAPH-F950; QQC
+FA59 ; [.FB40.0020.0002.7E41][.FE41.0000.0000.7E41] # CJK COMPATIBILITY IDEOGRAPH-FA59; QQC
+2F970 ; [.FB40.0020.0002.7E45][.FE45.0000.0000.7E45] # CJK COMPATIBILITY IDEOGRAPH-2F970; QQC
+2EB0 ; [.FB40.0020.0004.7E9F][.FE9F.0000.0000.7E9F] # CJK RADICAL C-SIMPLIFIED SILK; QQK
+2F78 ; [.FB40.0020.0004.7F36][.FF36.0000.0000.7F36] # KANGXI RADICAL JAR; QQK
+2F79 ; [.FB40.0020.0004.7F51][.FF51.0000.0000.7F51] # KANGXI RADICAL NET; QQK
+2EB2 ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52] # CJK RADICAL NET TWO; QQK
+2EB5 ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52][.0000.015D.001F.2EB5] # CJK RADICAL MESH; QQKN
+2EB1 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53] # CJK RADICAL NET ONE; QQK
+2EB3 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.015D.001F.2EB3] # CJK RADICAL NET THREE; QQKN
+2EB4 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.015E.001F.2EB4] # CJK RADICAL NET FOUR; QQKN
+FA5A ; [.FB40.0020.0002.7F72][.FF72.0000.0000.7F72] # CJK COMPATIBILITY IDEOGRAPH-FA5A; QQC
+F9E6 ; [.FB40.0020.0002.7F79][.FF79.0000.0000.7F79] # CJK COMPATIBILITY IDEOGRAPH-F9E6; QQC
+2F976 ; [.FB40.0020.0002.7F7A][.FF7A.0000.0000.7F7A] # CJK COMPATIBILITY IDEOGRAPH-2F976; QQC
+F90F ; [.FB40.0020.0002.7F85][.FF85.0000.0000.7F85] # CJK COMPATIBILITY IDEOGRAPH-F90F; QQC
+2F7A ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A] # KANGXI RADICAL SHEEP; QQK
+2EB6 ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.015D.001F.2EB6] # CJK RADICAL SHEEP; QQKN
+2EB7 ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.015E.001F.2EB7] # CJK RADICAL RAM; QQKN
+2EB8 ; [.FB40.0020.0004.7F8B][.FF8B.0000.0000.7F8B] # CJK RADICAL EWE; QQK
+2F978 ; [.FB40.0020.0002.7F95][.FF95.0000.0000.7F95] # CJK COMPATIBILITY IDEOGRAPH-2F978; QQC
+F9AF ; [.FB40.0020.0002.7F9A][.FF9A.0000.0000.7F9A] # CJK COMPATIBILITY IDEOGRAPH-F9AF; QQC
+FA1E ; [.FB40.0020.0002.7FBD][.FFBD.0000.0000.7FBD] # CJK COMPATIBILITY IDEOGRAPH-FA1E; QQC
+2F7B ; [.FB40.0020.0004.7FBD][.FFBD.0000.0000.7FBD] # KANGXI RADICAL FEATHER; QQK
+2F979 ; [.FB40.0020.0002.7FFA][.FFFA.0000.0000.7FFA] # CJK COMPATIBILITY IDEOGRAPH-2F979; QQC
+F934 ; [.FB41.0020.0002.8001][.8001.0000.0000.8001] # CJK COMPATIBILITY IDEOGRAPH-F934; QQC
+2F7C ; [.FB41.0020.0004.8001][.8001.0000.0000.8001] # KANGXI RADICAL OLD; QQK
+2EB9 ; [.FB41.0020.0004.8002][.8002.0000.0000.8002] # CJK RADICAL OLD; QQK
+FA5B ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-FA5B; QQC
+2F97A ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-2F97A; QQC
+2F7D ; [.FB41.0020.0004.800C][.800C.0000.0000.800C] # KANGXI RADICAL AND; QQK
+2F7E ; [.FB41.0020.0004.8012][.8012.0000.0000.8012] # KANGXI RADICAL PLOW; QQK
+2F7F ; [.FB41.0020.0004.8033][.8033.0000.0000.8033] # KANGXI RADICAL EAR; QQK
+F9B0 ; [.FB41.0020.0002.8046][.8046.0000.0000.8046] # CJK COMPATIBILITY IDEOGRAPH-F9B0; QQC
+2F97D ; [.FB41.0020.0002.8060][.8060.0000.0000.8060] # CJK COMPATIBILITY IDEOGRAPH-2F97D; QQC
+F997 ; [.FB41.0020.0002.806F][.806F.0000.0000.806F] # CJK COMPATIBILITY IDEOGRAPH-F997; QQC
+2F97F ; [.FB41.0020.0002.8070][.8070.0000.0000.8070] # CJK COMPATIBILITY IDEOGRAPH-2F97F; QQC
+F945 ; [.FB41.0020.0002.807E][.807E.0000.0000.807E] # CJK COMPATIBILITY IDEOGRAPH-F945; QQC
+2F80 ; [.FB41.0020.0004.807F][.807F.0000.0000.807F] # KANGXI RADICAL BRUSH; QQK
+2EBB ; [.FB41.0020.0004.807F][.807F.0000.0000.807F][.0000.015D.001F.2EBB] # CJK RADICAL BRUSH TWO; QQKN
+2EBA ; [.FB41.0020.0004.8080][.8080.0000.0000.8080] # CJK RADICAL BRUSH ONE; QQK
+2F81 ; [.FB41.0020.0004.8089][.8089.0000.0000.8089] # KANGXI RADICAL MEAT; QQK
+2EBC ; [.FB41.0020.0004.8089][.8089.0000.0000.8089][.0000.015D.001F.2EBC] # CJK RADICAL MEAT; QQKN
+F953 ; [.FB41.0020.0002.808B][.808B.0000.0000.808B] # CJK COMPATIBILITY IDEOGRAPH-F953; QQC
+2F8D6 ; [.FB41.0020.0002.80AD][.80AD.0000.0000.80AD] # CJK COMPATIBILITY IDEOGRAPH-2F8D6; QQC
+2F982 ; [.FB41.0020.0002.80B2][.80B2.0000.0000.80B2] # CJK COMPATIBILITY IDEOGRAPH-2F982; QQC
+2F983 ; [.FB41.0020.0002.8103][.8103.0000.0000.8103] # CJK COMPATIBILITY IDEOGRAPH-2F983; QQC
+2F985 ; [.FB41.0020.0002.813E][.813E.0000.0000.813E] # CJK COMPATIBILITY IDEOGRAPH-2F985; QQC
+F926 ; [.FB41.0020.0002.81D8][.81D8.0000.0000.81D8] # CJK COMPATIBILITY IDEOGRAPH-F926; QQC
+2F82 ; [.FB41.0020.0004.81E3][.81E3.0000.0000.81E3] # KANGXI RADICAL MINISTER; QQK
+F9F6 ; [.FB41.0020.0002.81E8][.81E8.0000.0000.81E8] # CJK COMPATIBILITY IDEOGRAPH-F9F6; QQC
+2F83 ; [.FB41.0020.0004.81EA][.81EA.0000.0000.81EA] # KANGXI RADICAL SELF; QQK
+3242 ; [*0288.0020.0004.3242][.FB41.0020.0004.81EA][.81EA.0000.0000.81EA][*0289.0020.001F.3242] # PARENTHESIZED IDEOGRAPH SELF; QQKN
+FA5C ; [.FB41.0020.0002.81ED][.81ED.0000.0000.81ED] # CJK COMPATIBILITY IDEOGRAPH-FA5C; QQC
+2F84 ; [.FB41.0020.0004.81F3][.81F3.0000.0000.81F3] # KANGXI RADICAL ARRIVE; QQK
+3243 ; [*0288.0020.0004.3243][.FB41.0020.0004.81F3][.81F3.0000.0000.81F3][*0289.0020.001F.3243] # PARENTHESIZED IDEOGRAPH REACH; QQKN
+2F85 ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC] # KANGXI RADICAL MORTAR; QQK
+2EBD ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC][.0000.015D.001F.2EBD] # CJK RADICAL MORTAR; QQKN
+2F893 ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F893; QQC
+2F98B ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F98B; QQC
+2F98C ; [.FB41.0020.0002.8204][.8204.0000.0000.8204] # CJK COMPATIBILITY IDEOGRAPH-2F98C; QQC
+2F86 ; [.FB41.0020.0004.820C][.820C.0000.0000.820C] # KANGXI RADICAL TONGUE; QQK
+2F87 ; [.FB41.0020.0004.821B][.821B.0000.0000.821B] # KANGXI RADICAL OPPOSE; QQK
+2F88 ; [.FB41.0020.0004.821F][.821F.0000.0000.821F] # KANGXI RADICAL BOAT; QQK
+2F89 ; [.FB41.0020.0004.826E][.826E.0000.0000.826E] # KANGXI RADICAL STOPPING; QQK
+F97C ; [.FB41.0020.0002.826F][.826F.0000.0000.826F] # CJK COMPATIBILITY IDEOGRAPH-F97C; QQC
+2F8A ; [.FB41.0020.0004.8272][.8272.0000.0000.8272] # KANGXI RADICAL COLOR; QQK
+2F8B ; [.FB41.0020.0004.8278][.8278.0000.0000.8278] # KANGXI RADICAL GRASS; QQK
+FA5D ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5D; QQC
+FA5E ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5E; QQC
+2EBE ; [.FB41.0020.0004.8279][.8279.0000.0000.8279] # CJK RADICAL GRASS ONE; QQK
+2EBF ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.015D.001F.2EBF] # CJK RADICAL GRASS TWO; QQKN
+2EC0 ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.015E.001F.2EC0] # CJK RADICAL GRASS THREE; QQKN
+2F990 ; [.FB41.0020.0002.828B][.828B.0000.0000.828B] # CJK COMPATIBILITY IDEOGRAPH-2F990; QQC
+2F98F ; [.FB41.0020.0002.8291][.8291.0000.0000.8291] # CJK COMPATIBILITY IDEOGRAPH-2F98F; QQC
+2F991 ; [.FB41.0020.0002.829D][.829D.0000.0000.829D] # CJK COMPATIBILITY IDEOGRAPH-2F991; QQC
+2F993 ; [.FB41.0020.0002.82B1][.82B1.0000.0000.82B1] # CJK COMPATIBILITY IDEOGRAPH-2F993; QQC
+2F994 ; [.FB41.0020.0002.82B3][.82B3.0000.0000.82B3] # CJK COMPATIBILITY IDEOGRAPH-2F994; QQC
+2F995 ; [.FB41.0020.0002.82BD][.82BD.0000.0000.82BD] # CJK COMPATIBILITY IDEOGRAPH-2F995; QQC
+F974 ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-F974; QQC
+2F998 ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-2F998; QQC
+2F996 ; [.FB41.0020.0002.82E6][.82E6.0000.0000.82E6] # CJK COMPATIBILITY IDEOGRAPH-2F996; QQC
+2F999 ; [.FB41.0020.0002.831D][.831D.0000.0000.831D] # CJK COMPATIBILITY IDEOGRAPH-2F999; QQC
+2F99C ; [.FB41.0020.0002.8323][.8323.0000.0000.8323] # CJK COMPATIBILITY IDEOGRAPH-2F99C; QQC
+F9FE ; [.FB41.0020.0002.8336][.8336.0000.0000.8336] # CJK COMPATIBILITY IDEOGRAPH-F9FE; QQC
+2F9A0 ; [.FB41.0020.0002.8353][.8353.0000.0000.8353] # CJK COMPATIBILITY IDEOGRAPH-2F9A0; QQC
+2F99A ; [.FB41.0020.0002.8363][.8363.0000.0000.8363] # CJK COMPATIBILITY IDEOGRAPH-2F99A; QQC
+2F99B ; [.FB41.0020.0002.83AD][.83AD.0000.0000.83AD] # CJK COMPATIBILITY IDEOGRAPH-2F99B; QQC
+2F99D ; [.FB41.0020.0002.83BD][.83BD.0000.0000.83BD] # CJK COMPATIBILITY IDEOGRAPH-2F99D; QQC
+F93E ; [.FB41.0020.0002.83C9][.83C9.0000.0000.83C9] # CJK COMPATIBILITY IDEOGRAPH-F93E; QQC
+2F9A1 ; [.FB41.0020.0002.83CA][.83CA.0000.0000.83CA] # CJK COMPATIBILITY IDEOGRAPH-2F9A1; QQC
+2F9A2 ; [.FB41.0020.0002.83CC][.83CC.0000.0000.83CC] # CJK COMPATIBILITY IDEOGRAPH-2F9A2; QQC
+2F9A3 ; [.FB41.0020.0002.83DC][.83DC.0000.0000.83DC] # CJK COMPATIBILITY IDEOGRAPH-2F9A3; QQC
+2F99E ; [.FB41.0020.0002.83E7][.83E7.0000.0000.83E7] # CJK COMPATIBILITY IDEOGRAPH-2F99E; QQC
+F958 ; [.FB41.0020.0002.83F1][.83F1.0000.0000.83F1] # CJK COMPATIBILITY IDEOGRAPH-F958; QQC
+F918 ; [.FB41.0020.0002.843D][.843D.0000.0000.843D] # CJK COMPATIBILITY IDEOGRAPH-F918; QQC
+F96E ; [.FB41.0020.0002.8449][.8449.0000.0000.8449] # CJK COMPATIBILITY IDEOGRAPH-F96E; QQC
+FA5F ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-FA5F; QQC
+2F99F ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-2F99F; QQC
+F999 ; [.FB41.0020.0002.84EE][.84EE.0000.0000.84EE] # CJK COMPATIBILITY IDEOGRAPH-F999; QQC
+2F9A8 ; [.FB41.0020.0002.84F1][.84F1.0000.0000.84F1] # CJK COMPATIBILITY IDEOGRAPH-2F9A8; QQC
+2F9A9 ; [.FB41.0020.0002.84F3][.84F3.0000.0000.84F3] # CJK COMPATIBILITY IDEOGRAPH-2F9A9; QQC
+F9C2 ; [.FB41.0020.0002.84FC][.84FC.0000.0000.84FC] # CJK COMPATIBILITY IDEOGRAPH-F9C2; QQC
+2F9AA ; [.FB41.0020.0002.8516][.8516.0000.0000.8516] # CJK COMPATIBILITY IDEOGRAPH-2F9AA; QQC
+2F9AC ; [.FB41.0020.0002.8564][.8564.0000.0000.8564] # CJK COMPATIBILITY IDEOGRAPH-2F9AC; QQC
+F923 ; [.FB41.0020.0002.85CD][.85CD.0000.0000.85CD] # CJK COMPATIBILITY IDEOGRAPH-F923; QQC
+F9F0 ; [.FB41.0020.0002.85FA][.85FA.0000.0000.85FA] # CJK COMPATIBILITY IDEOGRAPH-F9F0; QQC
+F935 ; [.FB41.0020.0002.8606][.8606.0000.0000.8606] # CJK COMPATIBILITY IDEOGRAPH-F935; QQC
+FA20 ; [.FB41.0020.0002.8612][.8612.0000.0000.8612] # CJK COMPATIBILITY IDEOGRAPH-FA20; QQC
+F91F ; [.FB41.0020.0002.862D][.862D.0000.0000.862D] # CJK COMPATIBILITY IDEOGRAPH-F91F; QQC
+F910 ; [.FB41.0020.0002.863F][.863F.0000.0000.863F] # CJK COMPATIBILITY IDEOGRAPH-F910; QQC
+2F8C ; [.FB41.0020.0004.864D][.864D.0000.0000.864D] # KANGXI RADICAL TIGER; QQK
+2EC1 ; [.FB41.0020.0004.864E][.864E.0000.0000.864E] # CJK RADICAL TIGER; QQK
+2F9B3 ; [.FB41.0020.0002.8650][.8650.0000.0000.8650] # CJK COMPATIBILITY IDEOGRAPH-2F9B3; QQC
+F936 ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-F936; QQC
+2F9B4 ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-2F9B4; QQC
+2F9B5 ; [.FB41.0020.0002.8667][.8667.0000.0000.8667] # CJK COMPATIBILITY IDEOGRAPH-2F9B5; QQC
+2F9B6 ; [.FB41.0020.0002.8669][.8669.0000.0000.8669] # CJK COMPATIBILITY IDEOGRAPH-2F9B6; QQC
+2F8D ; [.FB41.0020.0004.866B][.866B.0000.0000.866B] # KANGXI RADICAL INSECT; QQK
+2F9B8 ; [.FB41.0020.0002.8688][.8688.0000.0000.8688] # CJK COMPATIBILITY IDEOGRAPH-2F9B8; QQC
+2F9B7 ; [.FB41.0020.0002.86A9][.86A9.0000.0000.86A9] # CJK COMPATIBILITY IDEOGRAPH-2F9B7; QQC
+2F9BA ; [.FB41.0020.0002.86E2][.86E2.0000.0000.86E2] # CJK COMPATIBILITY IDEOGRAPH-2F9BA; QQC
+2F9B9 ; [.FB41.0020.0002.870E][.870E.0000.0000.870E] # CJK COMPATIBILITY IDEOGRAPH-2F9B9; QQC
+2F9BC ; [.FB41.0020.0002.8728][.8728.0000.0000.8728] # CJK COMPATIBILITY IDEOGRAPH-2F9BC; QQC
+2F9BD ; [.FB41.0020.0002.876B][.876B.0000.0000.876B] # CJK COMPATIBILITY IDEOGRAPH-2F9BD; QQC
+2F9BB ; [.FB41.0020.0002.8779][.8779.0000.0000.8779] # CJK COMPATIBILITY IDEOGRAPH-2F9BB; QQC
+2F9BE ; [.FB41.0020.0002.8786][.8786.0000.0000.8786] # CJK COMPATIBILITY IDEOGRAPH-2F9BE; QQC
+F911 ; [.FB41.0020.0002.87BA][.87BA.0000.0000.87BA] # CJK COMPATIBILITY IDEOGRAPH-F911; QQC
+2F9C0 ; [.FB41.0020.0002.87E1][.87E1.0000.0000.87E1] # CJK COMPATIBILITY IDEOGRAPH-2F9C0; QQC
+2F9C1 ; [.FB41.0020.0002.8801][.8801.0000.0000.8801] # CJK COMPATIBILITY IDEOGRAPH-2F9C1; QQC
+F927 ; [.FB41.0020.0002.881F][.881F.0000.0000.881F] # CJK COMPATIBILITY IDEOGRAPH-F927; QQC
+2F8E ; [.FB41.0020.0004.8840][.8840.0000.0000.8840] # KANGXI RADICAL BLOOD; QQK
+FA08 ; [.FB41.0020.0002.884C][.884C.0000.0000.884C] # CJK COMPATIBILITY IDEOGRAPH-FA08; QQC
+2F8F ; [.FB41.0020.0004.884C][.884C.0000.0000.884C] # KANGXI RADICAL WALK ENCLOSURE; QQK
+2F9C3 ; [.FB41.0020.0002.8860][.8860.0000.0000.8860] # CJK COMPATIBILITY IDEOGRAPH-2F9C3; QQC
+2F9C4 ; [.FB41.0020.0002.8863][.8863.0000.0000.8863] # CJK COMPATIBILITY IDEOGRAPH-2F9C4; QQC
+2F90 ; [.FB41.0020.0004.8863][.8863.0000.0000.8863] # KANGXI RADICAL CLOTHES; QQK
+2EC2 ; [.FB41.0020.0004.8864][.8864.0000.0000.8864] # CJK RADICAL CLOTHES; QQK
+F9A0 ; [.FB41.0020.0002.88C2][.88C2.0000.0000.88C2] # CJK COMPATIBILITY IDEOGRAPH-F9A0; QQC
+F9E7 ; [.FB41.0020.0002.88CF][.88CF.0000.0000.88CF] # CJK COMPATIBILITY IDEOGRAPH-F9E7; QQC
+2F9C6 ; [.FB41.0020.0002.88D7][.88D7.0000.0000.88D7] # CJK COMPATIBILITY IDEOGRAPH-2F9C6; QQC
+2F9C7 ; [.FB41.0020.0002.88DE][.88DE.0000.0000.88DE] # CJK COMPATIBILITY IDEOGRAPH-2F9C7; QQC
+F9E8 ; [.FB41.0020.0002.88E1][.88E1.0000.0000.88E1] # CJK COMPATIBILITY IDEOGRAPH-F9E8; QQC
+F912 ; [.FB41.0020.0002.88F8][.88F8.0000.0000.88F8] # CJK COMPATIBILITY IDEOGRAPH-F912; QQC
+2F9C9 ; [.FB41.0020.0002.88FA][.88FA.0000.0000.88FA] # CJK COMPATIBILITY IDEOGRAPH-2F9C9; QQC
+FA60 ; [.FB41.0020.0002.8910][.8910.0000.0000.8910] # CJK COMPATIBILITY IDEOGRAPH-FA60; QQC
+F924 ; [.FB41.0020.0002.8964][.8964.0000.0000.8964] # CJK COMPATIBILITY IDEOGRAPH-F924; QQC
+2F91 ; [.FB41.0020.0004.897E][.897E.0000.0000.897E] # KANGXI RADICAL WEST; QQK
+2EC4 ; [.FB41.0020.0004.897F][.897F.0000.0000.897F] # CJK RADICAL WEST TWO; QQK
+2EC3 ; [.FB41.0020.0004.8980][.8980.0000.0000.8980] # CJK RADICAL WEST ONE; QQK
+FA0A ; [.FB41.0020.0002.898B][.898B.0000.0000.898B] # CJK COMPATIBILITY IDEOGRAPH-FA0A; QQC
+2F92 ; [.FB41.0020.0004.898B][.898B.0000.0000.898B] # KANGXI RADICAL SEE; QQK
+FA61 ; [.FB41.0020.0002.8996][.8996.0000.0000.8996] # CJK COMPATIBILITY IDEOGRAPH-FA61; QQC
+2EC5 ; [.FB41.0020.0004.89C1][.89C1.0000.0000.89C1] # CJK RADICAL C-SIMPLIFIED SEE; QQK
+2EC6 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # CJK RADICAL SIMPLIFIED HORN; QQK
+2F93 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # KANGXI RADICAL HORN; QQK
+2EC7 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2][.0000.015D.001F.2EC7] # CJK RADICAL HORN; QQKN
+2F94 ; [.FB41.0020.0004.8A00][.8A00.0000.0000.8A00] # KANGXI RADICAL SPEECH; QQK
+2F9CF ; [.FB41.0020.0002.8AA0][.8AA0.0000.0000.8AA0] # CJK COMPATIBILITY IDEOGRAPH-2F9CF; QQC
+F96F ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F96F; QQC
+F9A1 ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F9A1; QQC
+F97D ; [.FB41.0020.0002.8AD2][.8AD2.0000.0000.8AD2] # CJK COMPATIBILITY IDEOGRAPH-F97D; QQC
+F941 ; [.FB41.0020.0002.8AD6][.8AD6.0000.0000.8AD6] # CJK COMPATIBILITY IDEOGRAPH-F941; QQC
+2F9D0 ; [.FB41.0020.0002.8AED][.8AED.0000.0000.8AED] # CJK COMPATIBILITY IDEOGRAPH-2F9D0; QQC
+FA22 ; [.FB41.0020.0002.8AF8][.8AF8.0000.0000.8AF8] # CJK COMPATIBILITY IDEOGRAPH-FA22; QQC
+F95D ; [.FB41.0020.0002.8AFE][.8AFE.0000.0000.8AFE] # CJK COMPATIBILITY IDEOGRAPH-F95D; QQC
+FA62 ; [.FB41.0020.0002.8B01][.8B01.0000.0000.8B01] # CJK COMPATIBILITY IDEOGRAPH-FA62; QQC
+FA63 ; [.FB41.0020.0002.8B39][.8B39.0000.0000.8B39] # CJK COMPATIBILITY IDEOGRAPH-FA63; QQC
+F9FC ; [.FB41.0020.0002.8B58][.8B58.0000.0000.8B58] # CJK COMPATIBILITY IDEOGRAPH-F9FC; QQC
+F95A ; [.FB41.0020.0002.8B80][.8B80.0000.0000.8B80] # CJK COMPATIBILITY IDEOGRAPH-F95A; QQC
+2F9D1 ; [.FB41.0020.0002.8B8A][.8B8A.0000.0000.8B8A] # CJK COMPATIBILITY IDEOGRAPH-2F9D1; QQC
+2EC8 ; [.FB41.0020.0004.8BA0][.8BA0.0000.0000.8BA0] # CJK RADICAL C-SIMPLIFIED SPEECH; QQK
+2F95 ; [.FB41.0020.0004.8C37][.8C37.0000.0000.8C37] # KANGXI RADICAL VALLEY; QQK
+2F96 ; [.FB41.0020.0004.8C46][.8C46.0000.0000.8C46] # KANGXI RADICAL BEAN; QQK
+F900 ; [.FB41.0020.0002.8C48][.8C48.0000.0000.8C48] # CJK COMPATIBILITY IDEOGRAPH-F900; QQC
+2F9D2 ; [.FB41.0020.0002.8C55][.8C55.0000.0000.8C55] # CJK COMPATIBILITY IDEOGRAPH-2F9D2; QQC
+2F97 ; [.FB41.0020.0004.8C55][.8C55.0000.0000.8C55] # KANGXI RADICAL PIG; QQK
+2F98 ; [.FB41.0020.0004.8C78][.8C78.0000.0000.8C78] # KANGXI RADICAL BADGER; QQK
+2F99 ; [.FB41.0020.0004.8C9D][.8C9D.0000.0000.8C9D] # KANGXI RADICAL SHELL; QQK
+3236 ; [*0288.0020.0004.3236][.FB41.0020.0004.8CA1][.8CA1.0000.0000.8CA1][*0289.0020.001F.3236] # PARENTHESIZED IDEOGRAPH FINANCIAL; QQKN
+3296 ; [.FB41.0020.0006.8CA1][.8CA1.0000.0000.8CA1] # CIRCLED IDEOGRAPH FINANCIAL; QQK
+2F9D4 ; [.FB41.0020.0002.8CAB][.8CAB.0000.0000.8CAB] # CJK COMPATIBILITY IDEOGRAPH-2F9D4; QQC
+2F9D5 ; [.FB41.0020.0002.8CC1][.8CC1.0000.0000.8CC1] # CJK COMPATIBILITY IDEOGRAPH-2F9D5; QQC
+F948 ; [.FB41.0020.0002.8CC2][.8CC2.0000.0000.8CC2] # CJK COMPATIBILITY IDEOGRAPH-F948; QQC
+323E ; [*0288.0020.0004.323E][.FB41.0020.0004.8CC7][.8CC7.0000.0000.8CC7][*0289.0020.001F.323E] # PARENTHESIZED IDEOGRAPH RESOURCE; QQKN
+32AE ; [.FB41.0020.0006.8CC7][.8CC7.0000.0000.8CC7] # CIRCLED IDEOGRAPH RESOURCE; QQK
+F903 ; [.FB41.0020.0002.8CC8][.8CC8.0000.0000.8CC8] # CJK COMPATIBILITY IDEOGRAPH-F903; QQC
+FA64 ; [.FB41.0020.0002.8CD3][.8CD3.0000.0000.8CD3] # CJK COMPATIBILITY IDEOGRAPH-FA64; QQC
+FA65 ; [.FB41.0020.0002.8D08][.8D08.0000.0000.8D08] # CJK COMPATIBILITY IDEOGRAPH-FA65; QQC
+2F9D6 ; [.FB41.0020.0002.8D1B][.8D1B.0000.0000.8D1B] # CJK COMPATIBILITY IDEOGRAPH-2F9D6; QQC
+2EC9 ; [.FB41.0020.0004.8D1D][.8D1D.0000.0000.8D1D] # CJK RADICAL C-SIMPLIFIED SHELL; QQK
+2F9A ; [.FB41.0020.0004.8D64][.8D64.0000.0000.8D64] # KANGXI RADICAL RED; QQK
+2F9B ; [.FB41.0020.0004.8D70][.8D70.0000.0000.8D70] # KANGXI RADICAL RUN; QQK
+2F9D7 ; [.FB41.0020.0002.8D77][.8D77.0000.0000.8D77] # CJK COMPATIBILITY IDEOGRAPH-2F9D7; QQC
+2F9C ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3] # KANGXI RADICAL FOOT; QQK
+2ECA ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3][.0000.015D.001F.2ECA] # CJK RADICAL FOOT; QQKN
+2F9DB ; [.FB41.0020.0002.8DBC][.8DBC.0000.0000.8DBC] # CJK COMPATIBILITY IDEOGRAPH-2F9DB; QQC
+2F9DA ; [.FB41.0020.0002.8DCB][.8DCB.0000.0000.8DCB] # CJK COMPATIBILITY IDEOGRAPH-2F9DA; QQC
+F937 ; [.FB41.0020.0002.8DEF][.8DEF.0000.0000.8DEF] # CJK COMPATIBILITY IDEOGRAPH-F937; QQC
+2F9DC ; [.FB41.0020.0002.8DF0][.8DF0.0000.0000.8DF0] # CJK COMPATIBILITY IDEOGRAPH-2F9DC; QQC
+2F9D ; [.FB41.0020.0004.8EAB][.8EAB.0000.0000.8EAB] # KANGXI RADICAL BODY; QQK
+F902 ; [.FB41.0020.0002.8ECA][.8ECA.0000.0000.8ECA] # CJK COMPATIBILITY IDEOGRAPH-F902; QQC
+2F9E ; [.FB41.0020.0004.8ECA][.8ECA.0000.0000.8ECA] # KANGXI RADICAL CART; QQK
+2F9DE ; [.FB41.0020.0002.8ED4][.8ED4.0000.0000.8ED4] # CJK COMPATIBILITY IDEOGRAPH-2F9DE; QQC
+F998 ; [.FB41.0020.0002.8F26][.8F26.0000.0000.8F26] # CJK COMPATIBILITY IDEOGRAPH-F998; QQC
+F9D7 ; [.FB41.0020.0002.8F2A][.8F2A.0000.0000.8F2A] # CJK COMPATIBILITY IDEOGRAPH-F9D7; QQC
+2F9DF ; [.FB41.0020.0002.8F38][.8F38.0000.0000.8F38] # CJK COMPATIBILITY IDEOGRAPH-2F9DF; QQC
+FA07 ; [.FB41.0020.0002.8F3B][.8F3B.0000.0000.8F3B] # CJK COMPATIBILITY IDEOGRAPH-FA07; QQC
+F98D ; [.FB41.0020.0002.8F62][.8F62.0000.0000.8F62] # CJK COMPATIBILITY IDEOGRAPH-F98D; QQC
+2ECB ; [.FB41.0020.0004.8F66][.8F66.0000.0000.8F66] # CJK RADICAL C-SIMPLIFIED CART; QQK
+2F9F ; [.FB41.0020.0004.8F9B][.8F9B.0000.0000.8F9B] # KANGXI RADICAL BITTER; QQK
+2F98D ; [.FB41.0020.0002.8F9E][.8F9E.0000.0000.8F9E] # CJK COMPATIBILITY IDEOGRAPH-2F98D; QQC
+F971 ; [.FB41.0020.0002.8FB0][.8FB0.0000.0000.8FB0] # CJK COMPATIBILITY IDEOGRAPH-F971; QQC
+2FA0 ; [.FB41.0020.0004.8FB0][.8FB0.0000.0000.8FB0] # KANGXI RADICAL MORNING; QQK
+2FA1 ; [.FB41.0020.0004.8FB5][.8FB5.0000.0000.8FB5] # KANGXI RADICAL WALK; QQK
+FA66 ; [.FB41.0020.0002.8FB6][.8FB6.0000.0000.8FB6] # CJK COMPATIBILITY IDEOGRAPH-FA66; QQC
+2ECC ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6] # CJK RADICAL SIMPLIFIED WALK; QQK
+2ECD ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.015D.001F.2ECD] # CJK RADICAL WALK ONE; QQKN
+2ECE ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.015E.001F.2ECE] # CJK RADICAL WALK TWO; QQKN
+F99A ; [.FB41.0020.0002.9023][.9023.0000.0000.9023] # CJK COMPATIBILITY IDEOGRAPH-F99A; QQC
+FA25 ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA25; QQC
+FA67 ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA67; QQC
+329C ; [.FB41.0020.0006.9069][.9069.0000.0000.9069] # CIRCLED IDEOGRAPH SUITABLE; QQK
+F9C3 ; [.FB41.0020.0002.907C][.907C.0000.0000.907C] # CJK COMPATIBILITY IDEOGRAPH-F9C3; QQC
+F913 ; [.FB41.0020.0002.908F][.908F.0000.0000.908F] # CJK COMPATIBILITY IDEOGRAPH-F913; QQC
+2FA2 ; [.FB41.0020.0004.9091][.9091.0000.0000.9091] # KANGXI RADICAL CITY; QQK
+2ECF ; [.FB41.0020.0004.9091][.9091.0000.0000.9091][.0000.015D.001F.2ECF] # CJK RADICAL CITY; QQKN
+2F9E2 ; [.FB41.0020.0002.9094][.9094.0000.0000.9094] # CJK COMPATIBILITY IDEOGRAPH-2F9E2; QQC
+F92C ; [.FB41.0020.0002.90CE][.90CE.0000.0000.90CE] # CJK COMPATIBILITY IDEOGRAPH-F92C; QQC
+2F9E3 ; [.FB41.0020.0002.90F1][.90F1.0000.0000.90F1] # CJK COMPATIBILITY IDEOGRAPH-2F9E3; QQC
+FA26 ; [.FB41.0020.0002.90FD][.90FD.0000.0000.90FD] # CJK COMPATIBILITY IDEOGRAPH-FA26; QQC
+2F9E4 ; [.FB41.0020.0002.9111][.9111.0000.0000.9111] # CJK COMPATIBILITY IDEOGRAPH-2F9E4; QQC
+2F9E6 ; [.FB41.0020.0002.911B][.911B.0000.0000.911B] # CJK COMPATIBILITY IDEOGRAPH-2F9E6; QQC
+2FA3 ; [.FB41.0020.0004.9149][.9149.0000.0000.9149] # KANGXI RADICAL WINE; QQK
+F919 ; [.FB41.0020.0002.916A][.916A.0000.0000.916A] # CJK COMPATIBILITY IDEOGRAPH-F919; QQC
+F9B7 ; [.FB41.0020.0002.91B4][.91B4.0000.0000.91B4] # CJK COMPATIBILITY IDEOGRAPH-F9B7; QQC
+2FA4 ; [.FB41.0020.0004.91C6][.91C6.0000.0000.91C6] # KANGXI RADICAL DISTINGUISH; QQK
+F9E9 ; [.FB41.0020.0002.91CC][.91CC.0000.0000.91CC] # CJK COMPATIBILITY IDEOGRAPH-F9E9; QQC
+2FA5 ; [.FB41.0020.0004.91CC][.91CC.0000.0000.91CC] # KANGXI RADICAL VILLAGE; QQK
+F97E ; [.FB41.0020.0002.91CF][.91CF.0000.0000.91CF] # CJK COMPATIBILITY IDEOGRAPH-F97E; QQC
+F90A ; [.FB41.0020.0002.91D1][.91D1.0000.0000.91D1] # CJK COMPATIBILITY IDEOGRAPH-F90A; QQC
+2FA6 ; [.FB41.0020.0004.91D1][.91D1.0000.0000.91D1] # KANGXI RADICAL GOLD; QQK
+322E ; [*0288.0020.0004.322E][.FB41.0020.0004.91D1][.91D1.0000.0000.91D1][*0289.0020.001F.322E] # PARENTHESIZED IDEOGRAPH METAL; QQKN
+328E ; [.FB41.0020.0006.91D1][.91D1.0000.0000.91D1] # CIRCLED IDEOGRAPH METAL; QQK
+F9B1 ; [.FB41.0020.0002.9234][.9234.0000.0000.9234] # CJK COMPATIBILITY IDEOGRAPH-F9B1; QQC
+2F9E7 ; [.FB41.0020.0002.9238][.9238.0000.0000.9238] # CJK COMPATIBILITY IDEOGRAPH-2F9E7; QQC
+2F9EA ; [.FB41.0020.0002.927C][.927C.0000.0000.927C] # CJK COMPATIBILITY IDEOGRAPH-2F9EA; QQC
+2F9E8 ; [.FB41.0020.0002.92D7][.92D7.0000.0000.92D7] # CJK COMPATIBILITY IDEOGRAPH-2F9E8; QQC
+2F9E9 ; [.FB41.0020.0002.92D8][.92D8.0000.0000.92D8] # CJK COMPATIBILITY IDEOGRAPH-2F9E9; QQC
+F93F ; [.FB41.0020.0002.9304][.9304.0000.0000.9304] # CJK COMPATIBILITY IDEOGRAPH-F93F; QQC
+F99B ; [.FB41.0020.0002.934A][.934A.0000.0000.934A] # CJK COMPATIBILITY IDEOGRAPH-F99B; QQC
+2F9EB ; [.FB41.0020.0002.93F9][.93F9.0000.0000.93F9] # CJK COMPATIBILITY IDEOGRAPH-2F9EB; QQC
+2F9EC ; [.FB41.0020.0002.9415][.9415.0000.0000.9415] # CJK COMPATIBILITY IDEOGRAPH-2F9EC; QQC
+2ED0 ; [.FB41.0020.0004.9485][.9485.0000.0000.9485] # CJK RADICAL C-SIMPLIFIED GOLD; QQK
+2ED1 ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # CJK RADICAL LONG ONE; QQK
+2FA7 ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # KANGXI RADICAL LONG; QQK
+2ED2 ; [.FB41.0020.0004.9578][.9578.0000.0000.9578] # CJK RADICAL LONG TWO; QQK
+2ED3 ; [.FB41.0020.0004.957F][.957F.0000.0000.957F] # CJK RADICAL C-SIMPLIFIED LONG; QQK
+2FA8 ; [.FB41.0020.0004.9580][.9580.0000.0000.9580] # KANGXI RADICAL GATE; QQK
+2F9EE ; [.FB41.0020.0002.958B][.958B.0000.0000.958B] # CJK COMPATIBILITY IDEOGRAPH-2F9EE; QQC
+F986 ; [.FB41.0020.0002.95AD][.95AD.0000.0000.95AD] # CJK COMPATIBILITY IDEOGRAPH-F986; QQC
+2F9F0 ; [.FB41.0020.0002.95B7][.95B7.0000.0000.95B7] # CJK COMPATIBILITY IDEOGRAPH-2F9F0; QQC
+2ED4 ; [.FB41.0020.0004.95E8][.95E8.0000.0000.95E8] # CJK RADICAL C-SIMPLIFIED GATE; QQK
+2FA9 ; [.FB41.0020.0004.961C][.961C.0000.0000.961C] # KANGXI RADICAL MOUND; QQK
+2ED5 ; [.FB41.0020.0004.961C][.961C.0000.0000.961C][.0000.015D.001F.2ED5] # CJK RADICAL MOUND ONE; QQKN
+2ED6 ; [.FB41.0020.0004.961D][.961D.0000.0000.961D] # CJK RADICAL MOUND TWO; QQK
+F9C6 ; [.FB41.0020.0002.962E][.962E.0000.0000.962E] # CJK COMPATIBILITY IDEOGRAPH-F9C6; QQC
+F951 ; [.FB41.0020.0002.964B][.964B.0000.0000.964B] # CJK COMPATIBILITY IDEOGRAPH-F951; QQC
+FA09 ; [.FB41.0020.0002.964D][.964D.0000.0000.964D] # CJK COMPATIBILITY IDEOGRAPH-FA09; QQC
+F959 ; [.FB41.0020.0002.9675][.9675.0000.0000.9675] # CJK COMPATIBILITY IDEOGRAPH-F959; QQC
+F9D3 ; [.FB41.0020.0002.9678][.9678.0000.0000.9678] # CJK COMPATIBILITY IDEOGRAPH-F9D3; QQC
+F9DC ; [.FB41.0020.0002.9686][.9686.0000.0000.9686] # CJK COMPATIBILITY IDEOGRAPH-F9DC; QQC
+F9F1 ; [.FB41.0020.0002.96A3][.96A3.0000.0000.96A3] # CJK COMPATIBILITY IDEOGRAPH-F9F1; QQC
+2FAA ; [.FB41.0020.0004.96B6][.96B6.0000.0000.96B6] # KANGXI RADICAL SLAVE; QQK
+F9B8 ; [.FB41.0020.0002.96B8][.96B8.0000.0000.96B8] # CJK COMPATIBILITY IDEOGRAPH-F9B8; QQC
+2FAB ; [.FB41.0020.0004.96B9][.96B9.0000.0000.96B9] # KANGXI RADICAL SHORT TAILED BIRD; QQK
+2F9F3 ; [.FB41.0020.0002.96C3][.96C3.0000.0000.96C3] # CJK COMPATIBILITY IDEOGRAPH-2F9F3; QQC
+F9EA ; [.FB41.0020.0002.96E2][.96E2.0000.0000.96E2] # CJK COMPATIBILITY IDEOGRAPH-F9EA; QQC
+FA68 ; [.FB41.0020.0002.96E3][.96E3.0000.0000.96E3] # CJK COMPATIBILITY IDEOGRAPH-FA68; QQC
+2FAC ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8] # KANGXI RADICAL RAIN; QQK
+2ED7 ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8][.0000.015D.001F.2ED7] # CJK RADICAL RAIN; QQKN
+F9B2 ; [.FB41.0020.0002.96F6][.96F6.0000.0000.96F6] # CJK COMPATIBILITY IDEOGRAPH-F9B2; QQC
+F949 ; [.FB41.0020.0002.96F7][.96F7.0000.0000.96F7] # CJK COMPATIBILITY IDEOGRAPH-F949; QQC
+2F9F5 ; [.FB41.0020.0002.9723][.9723.0000.0000.9723] # CJK COMPATIBILITY IDEOGRAPH-2F9F5; QQC
+F938 ; [.FB41.0020.0002.9732][.9732.0000.0000.9732] # CJK COMPATIBILITY IDEOGRAPH-F938; QQC
+F9B3 ; [.FB41.0020.0002.9748][.9748.0000.0000.9748] # CJK COMPATIBILITY IDEOGRAPH-F9B3; QQC
+2FAD ; [.FB41.0020.0004.9751][.9751.0000.0000.9751] # KANGXI RADICAL BLUE; QQK
+2ED8 ; [.FB41.0020.0004.9752][.9752.0000.0000.9752] # CJK RADICAL BLUE; QQK
+FA1C ; [.FB41.0020.0002.9756][.9756.0000.0000.9756] # CJK COMPATIBILITY IDEOGRAPH-FA1C; QQC
+2FAE ; [.FB41.0020.0004.975E][.975E.0000.0000.975E] # KANGXI RADICAL WRONG; QQK
+2FAF ; [.FB41.0020.0004.9762][.9762.0000.0000.9762] # KANGXI RADICAL FACE; QQK
+2FB0 ; [.FB41.0020.0004.9769][.9769.0000.0000.9769] # KANGXI RADICAL LEATHER; QQK
+2FB1 ; [.FB41.0020.0004.97CB][.97CB.0000.0000.97CB] # KANGXI RADICAL TANNED LEATHER; QQK
+2F9FA ; [.FB41.0020.0002.97E0][.97E0.0000.0000.97E0] # CJK COMPATIBILITY IDEOGRAPH-2F9FA; QQC
+2ED9 ; [.FB41.0020.0004.97E6][.97E6.0000.0000.97E6] # CJK RADICAL C-SIMPLIFIED TANNED LEATHER; QQK
+2FB2 ; [.FB41.0020.0004.97ED][.97ED.0000.0000.97ED] # KANGXI RADICAL LEEK; QQK
+2FB3 ; [.FB41.0020.0004.97F3][.97F3.0000.0000.97F3] # KANGXI RADICAL SOUND; QQK
+FA69 ; [.FB41.0020.0002.97FF][.97FF.0000.0000.97FF] # CJK COMPATIBILITY IDEOGRAPH-FA69; QQC
+2FB4 ; [.FB41.0020.0004.9801][.9801.0000.0000.9801] # KANGXI RADICAL LEAF; QQK
+32A0 ; [.FB41.0020.0006.9805][.9805.0000.0000.9805] # CIRCLED IDEOGRAPH ITEM; QQK
+2F9FE ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FE; QQC
+2F9FF ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FF; QQC
+F9B4 ; [.FB41.0020.0002.9818][.9818.0000.0000.9818] # CJK COMPATIBILITY IDEOGRAPH-F9B4; QQC
+2FA00 ; [.FB41.0020.0002.9829][.9829.0000.0000.9829] # CJK COMPATIBILITY IDEOGRAPH-2FA00; QQC
+FA6A ; [.FB41.0020.0002.983B][.983B.0000.0000.983B] # CJK COMPATIBILITY IDEOGRAPH-FA6A; QQC
+F9D0 ; [.FB41.0020.0002.985E][.985E.0000.0000.985E] # CJK COMPATIBILITY IDEOGRAPH-F9D0; QQC
+2EDA ; [.FB41.0020.0004.9875][.9875.0000.0000.9875] # CJK RADICAL C-SIMPLIFIED LEAF; QQK
+2FB5 ; [.FB41.0020.0004.98A8][.98A8.0000.0000.98A8] # KANGXI RADICAL WIND; QQK
+2EDB ; [.FB41.0020.0004.98CE][.98CE.0000.0000.98CE] # CJK RADICAL C-SIMPLIFIED WIND; QQK
+2FB6 ; [.FB41.0020.0004.98DB][.98DB.0000.0000.98DB] # KANGXI RADICAL FLY; QQK
+2EDC ; [.FB41.0020.0004.98DE][.98DE.0000.0000.98DE] # CJK RADICAL C-SIMPLIFIED FLY; QQK
+2EDD ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # CJK RADICAL EAT ONE; QQK
+2FB7 ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # KANGXI RADICAL EAT; QQK
+2EDF ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0] # CJK RADICAL EAT THREE; QQK
+2EDE ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0][.0000.015D.001F.2EDE] # CJK RADICAL EAT TWO; QQKN
+2FA02 ; [.FB41.0020.0002.98E2][.98E2.0000.0000.98E2] # CJK COMPATIBILITY IDEOGRAPH-2FA02; QQC
+FA2A ; [.FB41.0020.0002.98EF][.98EF.0000.0000.98EF] # CJK COMPATIBILITY IDEOGRAPH-FA2A; QQC
+FA2B ; [.FB41.0020.0002.98FC][.98FC.0000.0000.98FC] # CJK COMPATIBILITY IDEOGRAPH-FA2B; QQC
+FA2C ; [.FB41.0020.0002.9928][.9928.0000.0000.9928] # CJK COMPATIBILITY IDEOGRAPH-FA2C; QQC
+2FA04 ; [.FB41.0020.0002.9929][.9929.0000.0000.9929] # CJK COMPATIBILITY IDEOGRAPH-2FA04; QQC
+2EE0 ; [.FB41.0020.0004.9963][.9963.0000.0000.9963] # CJK RADICAL C-SIMPLIFIED EAT; QQK
+2FB8 ; [.FB41.0020.0004.9996][.9996.0000.0000.9996] # KANGXI RADICAL HEAD; QQK
+2EE1 ; [.FB41.0020.0004.9996][.9996.0000.0000.9996][.0000.015D.001F.2EE1] # CJK RADICAL HEAD; QQKN
+2FB9 ; [.FB41.0020.0004.9999][.9999.0000.0000.9999] # KANGXI RADICAL FRAGRANT; QQK
+2FA05 ; [.FB41.0020.0002.99A7][.99A7.0000.0000.99A7] # CJK COMPATIBILITY IDEOGRAPH-2FA05; QQC
+2FBA ; [.FB41.0020.0004.99AC][.99AC.0000.0000.99AC] # KANGXI RADICAL HORSE; QQK
+2FA06 ; [.FB41.0020.0002.99C2][.99C2.0000.0000.99C2] # CJK COMPATIBILITY IDEOGRAPH-2FA06; QQC
+F91A ; [.FB41.0020.0002.99F1][.99F1.0000.0000.99F1] # CJK COMPATIBILITY IDEOGRAPH-F91A; QQC
+2FA07 ; [.FB41.0020.0002.99FE][.99FE.0000.0000.99FE] # CJK COMPATIBILITY IDEOGRAPH-2FA07; QQC
+F987 ; [.FB41.0020.0002.9A6A][.9A6A.0000.0000.9A6A] # CJK COMPATIBILITY IDEOGRAPH-F987; QQC
+2EE2 ; [.FB41.0020.0004.9A6C][.9A6C.0000.0000.9A6C] # CJK RADICAL C-SIMPLIFIED HORSE; QQK
+2FBB ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8] # KANGXI RADICAL BONE; QQK
+2EE3 ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8][.0000.015D.001F.2EE3] # CJK RADICAL BONE; QQKN
+2FBC ; [.FB41.0020.0004.9AD8][.9AD8.0000.0000.9AD8] # KANGXI RADICAL TALL; QQK
+2FBD ; [.FB41.0020.0004.9ADF][.9ADF.0000.0000.9ADF] # KANGXI RADICAL HAIR; QQK
+2FA0A ; [.FB41.0020.0002.9B12][.9B12.0000.0000.9B12] # CJK COMPATIBILITY IDEOGRAPH-2FA0A; QQC
+2FBE ; [.FB41.0020.0004.9B25][.9B25.0000.0000.9B25] # KANGXI RADICAL FIGHT; QQK
+2FBF ; [.FB41.0020.0004.9B2F][.9B2F.0000.0000.9B2F] # KANGXI RADICAL SACRIFICIAL WINE; QQK
+2FC0 ; [.FB41.0020.0004.9B32][.9B32.0000.0000.9B32] # KANGXI RADICAL CAULDRON; QQK
+2FC1 ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C] # KANGXI RADICAL GHOST; QQK
+2EE4 ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C][.0000.015D.001F.2EE4] # CJK RADICAL GHOST; QQKN
+2FC2 ; [.FB41.0020.0004.9B5A][.9B5A.0000.0000.9B5A] # KANGXI RADICAL FISH; QQK
+F939 ; [.FB41.0020.0002.9B6F][.9B6F.0000.0000.9B6F] # CJK COMPATIBILITY IDEOGRAPH-F939; QQC
+2FA0B ; [.FB41.0020.0002.9C40][.9C40.0000.0000.9C40] # CJK COMPATIBILITY IDEOGRAPH-2FA0B; QQC
+F9F2 ; [.FB41.0020.0002.9C57][.9C57.0000.0000.9C57] # CJK COMPATIBILITY IDEOGRAPH-F9F2; QQC
+2EE5 ; [.FB41.0020.0004.9C7C][.9C7C.0000.0000.9C7C] # CJK RADICAL C-SIMPLIFIED FISH; QQK
+2FC3 ; [.FB41.0020.0004.9CE5][.9CE5.0000.0000.9CE5] # KANGXI RADICAL BIRD; QQK
+2FA0C ; [.FB41.0020.0002.9CFD][.9CFD.0000.0000.9CFD] # CJK COMPATIBILITY IDEOGRAPH-2FA0C; QQC
+2FA0F ; [.FB41.0020.0002.9D67][.9D67.0000.0000.9D67] # CJK COMPATIBILITY IDEOGRAPH-2FA0F; QQC
+FA2D ; [.FB41.0020.0002.9DB4][.9DB4.0000.0000.9DB4] # CJK COMPATIBILITY IDEOGRAPH-FA2D; QQC
+F93A ; [.FB41.0020.0002.9DFA][.9DFA.0000.0000.9DFA] # CJK COMPATIBILITY IDEOGRAPH-F93A; QQC
+F920 ; [.FB41.0020.0002.9E1E][.9E1E.0000.0000.9E1E] # CJK COMPATIBILITY IDEOGRAPH-F920; QQC
+2EE6 ; [.FB41.0020.0004.9E1F][.9E1F.0000.0000.9E1F] # CJK RADICAL C-SIMPLIFIED BIRD; QQK
+2FC4 ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75] # KANGXI RADICAL SALT; QQK
+2EE7 ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75][.0000.015D.001F.2EE7] # CJK RADICAL C-SIMPLIFIED SALT; QQKN
+F940 ; [.FB41.0020.0002.9E7F][.9E7F.0000.0000.9E7F] # CJK COMPATIBILITY IDEOGRAPH-F940; QQC
+2FC5 ; [.FB41.0020.0004.9E7F][.9E7F.0000.0000.9E7F] # KANGXI RADICAL DEER; QQK
+F988 ; [.FB41.0020.0002.9E97][.9E97.0000.0000.9E97] # CJK COMPATIBILITY IDEOGRAPH-F988; QQC
+F9F3 ; [.FB41.0020.0002.9E9F][.9E9F.0000.0000.9E9F] # CJK COMPATIBILITY IDEOGRAPH-F9F3; QQC
+2FC6 ; [.FB41.0020.0004.9EA5][.9EA5.0000.0000.9EA5] # KANGXI RADICAL WHEAT; QQK
+2EE8 ; [.FB41.0020.0004.9EA6][.9EA6.0000.0000.9EA6] # CJK RADICAL SIMPLIFIED WHEAT; QQK
+2FA15 ; [.FB41.0020.0002.9EBB][.9EBB.0000.0000.9EBB] # CJK COMPATIBILITY IDEOGRAPH-2FA15; QQC
+2FC7 ; [.FB41.0020.0004.9EBB][.9EBB.0000.0000.9EBB] # KANGXI RADICAL HEMP; QQK
+2FC8 ; [.FB41.0020.0004.9EC3][.9EC3.0000.0000.9EC3] # KANGXI RADICAL YELLOW; QQK
+2EE9 ; [.FB41.0020.0004.9EC4][.9EC4.0000.0000.9EC4] # CJK RADICAL SIMPLIFIED YELLOW; QQK
+2FC9 ; [.FB41.0020.0004.9ECD][.9ECD.0000.0000.9ECD] # KANGXI RADICAL MILLET; QQK
+F989 ; [.FB41.0020.0002.9ECE][.9ECE.0000.0000.9ECE] # CJK COMPATIBILITY IDEOGRAPH-F989; QQC
+2FCA ; [.FB41.0020.0004.9ED1][.9ED1.0000.0000.9ED1] # KANGXI RADICAL BLACK; QQK
+2FA17 ; [.FB41.0020.0002.9EF9][.9EF9.0000.0000.9EF9] # CJK COMPATIBILITY IDEOGRAPH-2FA17; QQC
+2FCB ; [.FB41.0020.0004.9EF9][.9EF9.0000.0000.9EF9] # KANGXI RADICAL EMBROIDERY; QQK
+2FCC ; [.FB41.0020.0004.9EFD][.9EFD.0000.0000.9EFD] # KANGXI RADICAL FROG; QQK
+2FA18 ; [.FB41.0020.0002.9EFE][.9EFE.0000.0000.9EFE] # CJK COMPATIBILITY IDEOGRAPH-2FA18; QQC
+2EEA ; [.FB41.0020.0004.9EFE][.9EFE.0000.0000.9EFE] # CJK RADICAL C-SIMPLIFIED FROG; QQK
+2FA19 ; [.FB41.0020.0002.9F05][.9F05.0000.0000.9F05] # CJK COMPATIBILITY IDEOGRAPH-2FA19; QQC
+2FCD ; [.FB41.0020.0004.9F0E][.9F0E.0000.0000.9F0E] # KANGXI RADICAL TRIPOD; QQK
+2FA1A ; [.FB41.0020.0002.9F0F][.9F0F.0000.0000.9F0F] # CJK COMPATIBILITY IDEOGRAPH-2FA1A; QQC
+2FCE ; [.FB41.0020.0004.9F13][.9F13.0000.0000.9F13] # KANGXI RADICAL DRUM; QQK
+2FA1B ; [.FB41.0020.0002.9F16][.9F16.0000.0000.9F16] # CJK COMPATIBILITY IDEOGRAPH-2FA1B; QQC
+2FCF ; [.FB41.0020.0004.9F20][.9F20.0000.0000.9F20] # KANGXI RADICAL RAT; QQK
+2FA1C ; [.FB41.0020.0002.9F3B][.9F3B.0000.0000.9F3B] # CJK COMPATIBILITY IDEOGRAPH-2FA1C; QQC
+2FD0 ; [.FB41.0020.0004.9F3B][.9F3B.0000.0000.9F3B] # KANGXI RADICAL NOSE; QQK
+2FD1 ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A] # KANGXI RADICAL EVEN; QQK
+2EEB ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A][.0000.015D.001F.2EEB] # CJK RADICAL J-SIMPLIFIED EVEN; QQKN
+2EEC ; [.FB41.0020.0004.9F50][.9F50.0000.0000.9F50] # CJK RADICAL C-SIMPLIFIED EVEN; QQK
+2FD2 ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52] # KANGXI RADICAL TOOTH; QQK
+2EED ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52][.0000.015D.001F.2EED] # CJK RADICAL J-SIMPLIFIED TOOTH; QQKN
+2EEE ; [.FB41.0020.0004.9F7F][.9F7F.0000.0000.9F7F] # CJK RADICAL C-SIMPLIFIED TOOTH; QQK
+F9C4 ; [.FB41.0020.0002.9F8D][.9F8D.0000.0000.9F8D] # CJK COMPATIBILITY IDEOGRAPH-F9C4; QQC
+2FD3 ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D] # KANGXI RADICAL DRAGON; QQK
+2EEF ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D][.0000.015D.001F.2EEF] # CJK RADICAL J-SIMPLIFIED DRAGON; QQKN
+2EF0 ; [.FB41.0020.0004.9F99][.9F99.0000.0000.9F99] # CJK RADICAL C-SIMPLIFIED DRAGON; QQK
+F907 ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F907; QQC
+F908 ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F908; QQC
+2FD4 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C] # KANGXI RADICAL TURTLE; QQK
+2EF1 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.015D.001F.2EF1] # CJK RADICAL TURTLE; QQKN
+2EF2 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.015E.001F.2EF2] # CJK RADICAL J-SIMPLIFIED TURTLE; QQKN
+2EF3 ; [.FB41.0020.0004.9F9F][.9F9F.0000.0000.9F9F] # CJK RADICAL C-SIMPLIFIED TURTLE; QQK
+2FD5 ; [.FB41.0020.0004.9FA0][.9FA0.0000.0000.9FA0] # KANGXI RADICAL FLUTE; QQK
+FA0E ; [.FB41.0020.0002.FA0E][.FA0E.0000.0000.FA0E] # CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F ; [.FB41.0020.0002.FA0F][.FA0F.0000.0000.FA0F] # CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA11 ; [.FB41.0020.0002.FA11][.FA11.0000.0000.FA11] # CJK COMPATIBILITY IDEOGRAPH-FA11
+FA13 ; [.FB41.0020.0002.FA13][.FA13.0000.0000.FA13] # CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14 ; [.FB41.0020.0002.FA14][.FA14.0000.0000.FA14] # CJK COMPATIBILITY IDEOGRAPH-FA14
+FA1F ; [.FB41.0020.0002.FA1F][.FA1F.0000.0000.FA1F] # CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA21 ; [.FB41.0020.0002.FA21][.FA21.0000.0000.FA21] # CJK COMPATIBILITY IDEOGRAPH-FA21
+FA23 ; [.FB41.0020.0002.FA23][.FA23.0000.0000.FA23] # CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24 ; [.FB41.0020.0002.FA24][.FA24.0000.0000.FA24] # CJK COMPATIBILITY IDEOGRAPH-FA24
+FA27 ; [.FB41.0020.0002.FA27][.FA27.0000.0000.FA27] # CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28 ; [.FB41.0020.0002.FA28][.FA28.0000.0000.FA28] # CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29 ; [.FB41.0020.0002.FA29][.FA29.0000.0000.FA29] # CJK COMPATIBILITY IDEOGRAPH-FA29
+2F80C ; [.FB80.0020.0002.349E][.B49E.0000.0000.349E] # CJK COMPATIBILITY IDEOGRAPH-2F80C; QQC
+2F813 ; [.FB80.0020.0002.34B9][.B4B9.0000.0000.34B9] # CJK COMPATIBILITY IDEOGRAPH-2F813; QQC
+2F9CA ; [.FB80.0020.0002.34BB][.B4BB.0000.0000.34BB] # CJK COMPATIBILITY IDEOGRAPH-2F9CA; QQC
+2F81F ; [.FB80.0020.0002.34DF][.B4DF.0000.0000.34DF] # CJK COMPATIBILITY IDEOGRAPH-2F81F; QQC
+2F824 ; [.FB80.0020.0002.3515][.B515.0000.0000.3515] # CJK COMPATIBILITY IDEOGRAPH-2F824; QQC
+2F867 ; [.FB80.0020.0002.36EE][.B6EE.0000.0000.36EE] # CJK COMPATIBILITY IDEOGRAPH-2F867; QQC
+2F868 ; [.FB80.0020.0002.36FC][.B6FC.0000.0000.36FC] # CJK COMPATIBILITY IDEOGRAPH-2F868; QQC
+2F876 ; [.FB80.0020.0002.3781][.B781.0000.0000.3781] # CJK COMPATIBILITY IDEOGRAPH-2F876; QQC
+2F883 ; [.FB80.0020.0002.382F][.B82F.0000.0000.382F] # CJK COMPATIBILITY IDEOGRAPH-2F883; QQC
+2F888 ; [.FB80.0020.0002.3862][.B862.0000.0000.3862] # CJK COMPATIBILITY IDEOGRAPH-2F888; QQC
+2F88A ; [.FB80.0020.0002.387C][.B87C.0000.0000.387C] # CJK COMPATIBILITY IDEOGRAPH-2F88A; QQC
+2F896 ; [.FB80.0020.0002.38C7][.B8C7.0000.0000.38C7] # CJK COMPATIBILITY IDEOGRAPH-2F896; QQC
+2F89B ; [.FB80.0020.0002.38E3][.B8E3.0000.0000.38E3] # CJK COMPATIBILITY IDEOGRAPH-2F89B; QQC
+2F8A2 ; [.FB80.0020.0002.391C][.B91C.0000.0000.391C] # CJK COMPATIBILITY IDEOGRAPH-2F8A2; QQC
+2F8A1 ; [.FB80.0020.0002.393A][.B93A.0000.0000.393A] # CJK COMPATIBILITY IDEOGRAPH-2F8A1; QQC
+2F8C2 ; [.FB80.0020.0002.3A2E][.BA2E.0000.0000.3A2E] # CJK COMPATIBILITY IDEOGRAPH-2F8C2; QQC
+2F8C7 ; [.FB80.0020.0002.3A6C][.BA6C.0000.0000.3A6C] # CJK COMPATIBILITY IDEOGRAPH-2F8C7; QQC
+2F8D1 ; [.FB80.0020.0002.3AE4][.BAE4.0000.0000.3AE4] # CJK COMPATIBILITY IDEOGRAPH-2F8D1; QQC
+2F8D0 ; [.FB80.0020.0002.3B08][.BB08.0000.0000.3B08] # CJK COMPATIBILITY IDEOGRAPH-2F8D0; QQC
+2F8CE ; [.FB80.0020.0002.3B19][.BB19.0000.0000.3B19] # CJK COMPATIBILITY IDEOGRAPH-2F8CE; QQC
+2F8DE ; [.FB80.0020.0002.3B49][.BB49.0000.0000.3B49] # CJK COMPATIBILITY IDEOGRAPH-2F8DE; QQC
+2F8E7 ; [.FB80.0020.0002.3B9D][.BB9D.0000.0000.3B9D] # CJK COMPATIBILITY IDEOGRAPH-2F8E7; QQC
+2F8EE ; [.FB80.0020.0002.3C18][.BC18.0000.0000.3C18] # CJK COMPATIBILITY IDEOGRAPH-2F8EE; QQC
+2F8F2 ; [.FB80.0020.0002.3C4E][.BC4E.0000.0000.3C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8F2; QQC
+2F90A ; [.FB80.0020.0002.3D33][.BD33.0000.0000.3D33] # CJK COMPATIBILITY IDEOGRAPH-2F90A; QQC
+2F916 ; [.FB80.0020.0002.3D96][.BD96.0000.0000.3D96] # CJK COMPATIBILITY IDEOGRAPH-2F916; QQC
+2F92A ; [.FB80.0020.0002.3EAC][.BEAC.0000.0000.3EAC] # CJK COMPATIBILITY IDEOGRAPH-2F92A; QQC
+2F92C ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92C; QQC
+2F92D ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92D; QQC
+2F933 ; [.FB80.0020.0002.3F1B][.BF1B.0000.0000.3F1B] # CJK COMPATIBILITY IDEOGRAPH-2F933; QQC
+2F93E ; [.FB80.0020.0002.3FFC][.BFFC.0000.0000.3FFC] # CJK COMPATIBILITY IDEOGRAPH-2F93E; QQC
+2F93F ; [.FB80.0020.0002.4008][.C008.0000.0000.4008] # CJK COMPATIBILITY IDEOGRAPH-2F93F; QQC
+2F949 ; [.FB80.0020.0002.4039][.C039.0000.0000.4039] # CJK COMPATIBILITY IDEOGRAPH-2F949; QQC
+2F94B ; [.FB80.0020.0002.4046][.C046.0000.0000.4046] # CJK COMPATIBILITY IDEOGRAPH-2F94B; QQC
+2F94C ; [.FB80.0020.0002.4096][.C096.0000.0000.4096] # CJK COMPATIBILITY IDEOGRAPH-2F94C; QQC
+2F951 ; [.FB80.0020.0002.40E3][.C0E3.0000.0000.40E3] # CJK COMPATIBILITY IDEOGRAPH-2F951; QQC
+2F958 ; [.FB80.0020.0002.412F][.C12F.0000.0000.412F] # CJK COMPATIBILITY IDEOGRAPH-2F958; QQC
+2F960 ; [.FB80.0020.0002.4202][.C202.0000.0000.4202] # CJK COMPATIBILITY IDEOGRAPH-2F960; QQC
+2F964 ; [.FB80.0020.0002.4227][.C227.0000.0000.4227] # CJK COMPATIBILITY IDEOGRAPH-2F964; QQC
+2F967 ; [.FB80.0020.0002.42A0][.C2A0.0000.0000.42A0] # CJK COMPATIBILITY IDEOGRAPH-2F967; QQC
+2F96D ; [.FB80.0020.0002.4301][.C301.0000.0000.4301] # CJK COMPATIBILITY IDEOGRAPH-2F96D; QQC
+2F971 ; [.FB80.0020.0002.4334][.C334.0000.0000.4334] # CJK COMPATIBILITY IDEOGRAPH-2F971; QQC
+2F974 ; [.FB80.0020.0002.4359][.C359.0000.0000.4359] # CJK COMPATIBILITY IDEOGRAPH-2F974; QQC
+2F981 ; [.FB80.0020.0002.43D5][.C3D5.0000.0000.43D5] # CJK COMPATIBILITY IDEOGRAPH-2F981; QQC
+2F8D7 ; [.FB80.0020.0002.43D9][.C3D9.0000.0000.43D9] # CJK COMPATIBILITY IDEOGRAPH-2F8D7; QQC
+2F984 ; [.FB80.0020.0002.440B][.C40B.0000.0000.440B] # CJK COMPATIBILITY IDEOGRAPH-2F984; QQC
+2F98E ; [.FB80.0020.0002.446B][.C46B.0000.0000.446B] # CJK COMPATIBILITY IDEOGRAPH-2F98E; QQC
+2F9A7 ; [.FB80.0020.0002.452B][.C52B.0000.0000.452B] # CJK COMPATIBILITY IDEOGRAPH-2F9A7; QQC
+2F9AE ; [.FB80.0020.0002.455D][.C55D.0000.0000.455D] # CJK COMPATIBILITY IDEOGRAPH-2F9AE; QQC
+2F9AF ; [.FB80.0020.0002.4561][.C561.0000.0000.4561] # CJK COMPATIBILITY IDEOGRAPH-2F9AF; QQC
+2F9B2 ; [.FB80.0020.0002.456B][.C56B.0000.0000.456B] # CJK COMPATIBILITY IDEOGRAPH-2F9B2; QQC
+2F9BF ; [.FB80.0020.0002.45D7][.C5D7.0000.0000.45D7] # CJK COMPATIBILITY IDEOGRAPH-2F9BF; QQC
+2F9C2 ; [.FB80.0020.0002.45F9][.C5F9.0000.0000.45F9] # CJK COMPATIBILITY IDEOGRAPH-2F9C2; QQC
+2F9C8 ; [.FB80.0020.0002.4635][.C635.0000.0000.4635] # CJK COMPATIBILITY IDEOGRAPH-2F9C8; QQC
+2F9CD ; [.FB80.0020.0002.46BE][.C6BE.0000.0000.46BE] # CJK COMPATIBILITY IDEOGRAPH-2F9CD; QQC
+2F9CE ; [.FB80.0020.0002.46C7][.C6C7.0000.0000.46C7] # CJK COMPATIBILITY IDEOGRAPH-2F9CE; QQC
+2F9EF ; [.FB80.0020.0002.4995][.C995.0000.0000.4995] # CJK COMPATIBILITY IDEOGRAPH-2F9EF; QQC
+2F9F2 ; [.FB80.0020.0002.49E6][.C9E6.0000.0000.49E6] # CJK COMPATIBILITY IDEOGRAPH-2F9F2; QQC
+2F9F8 ; [.FB80.0020.0002.4A6E][.CA6E.0000.0000.4A6E] # CJK COMPATIBILITY IDEOGRAPH-2F9F8; QQC
+2F9F9 ; [.FB80.0020.0002.4A76][.CA76.0000.0000.4A76] # CJK COMPATIBILITY IDEOGRAPH-2F9F9; QQC
+2F9FC ; [.FB80.0020.0002.4AB2][.CAB2.0000.0000.4AB2] # CJK COMPATIBILITY IDEOGRAPH-2F9FC; QQC
+2FA03 ; [.FB80.0020.0002.4B33][.CB33.0000.0000.4B33] # CJK COMPATIBILITY IDEOGRAPH-2FA03; QQC
+2FA08 ; [.FB80.0020.0002.4BCE][.CBCE.0000.0000.4BCE] # CJK COMPATIBILITY IDEOGRAPH-2FA08; QQC
+2FA0D ; [.FB80.0020.0002.4CCE][.CCCE.0000.0000.4CCE] # CJK COMPATIBILITY IDEOGRAPH-2FA0D; QQC
+2FA0E ; [.FB80.0020.0002.4CED][.CCED.0000.0000.4CED] # CJK COMPATIBILITY IDEOGRAPH-2FA0E; QQC
+2FA11 ; [.FB80.0020.0002.4CF8][.CCF8.0000.0000.4CF8] # CJK COMPATIBILITY IDEOGRAPH-2FA11; QQC
+2FA16 ; [.FB80.0020.0002.4D56][.CD56.0000.0000.4D56] # CJK COMPATIBILITY IDEOGRAPH-2FA16; QQC
+2F803 ; [.FB84.0020.0002.20122][.8122.0000.0000.20122] # CJK COMPATIBILITY IDEOGRAPH-2F803; QQC
+2F812 ; [.FB84.0020.0002.2051C][.851C.0000.0000.2051C] # CJK COMPATIBILITY IDEOGRAPH-2F812; QQC
+2F91B ; [.FB84.0020.0002.20525][.8525.0000.0000.20525] # CJK COMPATIBILITY IDEOGRAPH-2F91B; QQC
+2F816 ; [.FB84.0020.0002.2054B][.854B.0000.0000.2054B] # CJK COMPATIBILITY IDEOGRAPH-2F816; QQC
+2F80D ; [.FB84.0020.0002.2063A][.863A.0000.0000.2063A] # CJK COMPATIBILITY IDEOGRAPH-2F80D; QQC
+2F9D9 ; [.FB84.0020.0002.20804][.8804.0000.0000.20804] # CJK COMPATIBILITY IDEOGRAPH-2F9D9; QQC
+2F9DD ; [.FB84.0020.0002.208DE][.88DE.0000.0000.208DE] # CJK COMPATIBILITY IDEOGRAPH-2F9DD; QQC
+2F834 ; [.FB84.0020.0002.20A2C][.8A2C.0000.0000.20A2C] # CJK COMPATIBILITY IDEOGRAPH-2F834; QQC
+2F838 ; [.FB84.0020.0002.20B63][.8B63.0000.0000.20B63] # CJK COMPATIBILITY IDEOGRAPH-2F838; QQC
+2F859 ; [.FB84.0020.0002.214E4][.94E4.0000.0000.214E4] # CJK COMPATIBILITY IDEOGRAPH-2F859; QQC
+2F860 ; [.FB84.0020.0002.216A8][.96A8.0000.0000.216A8] # CJK COMPATIBILITY IDEOGRAPH-2F860; QQC
+2F861 ; [.FB84.0020.0002.216EA][.96EA.0000.0000.216EA] # CJK COMPATIBILITY IDEOGRAPH-2F861; QQC
+2F86C ; [.FB84.0020.0002.219C8][.99C8.0000.0000.219C8] # CJK COMPATIBILITY IDEOGRAPH-2F86C; QQC
+2F871 ; [.FB84.0020.0002.21B18][.9B18.0000.0000.21B18] # CJK COMPATIBILITY IDEOGRAPH-2F871; QQC
+2F8F8 ; [.FB84.0020.0002.21D0B][.9D0B.0000.0000.21D0B] # CJK COMPATIBILITY IDEOGRAPH-2F8F8; QQC
+2F87B ; [.FB84.0020.0002.21DE4][.9DE4.0000.0000.21DE4] # CJK COMPATIBILITY IDEOGRAPH-2F87B; QQC
+2F87D ; [.FB84.0020.0002.21DE6][.9DE6.0000.0000.21DE6] # CJK COMPATIBILITY IDEOGRAPH-2F87D; QQC
+2F889 ; [.FB84.0020.0002.22183][.A183.0000.0000.22183] # CJK COMPATIBILITY IDEOGRAPH-2F889; QQC
+2F939 ; [.FB84.0020.0002.2219F][.A19F.0000.0000.2219F] # CJK COMPATIBILITY IDEOGRAPH-2F939; QQC
+2F891 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F891; QQC
+2F892 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F892; QQC
+2F8A4 ; [.FB84.0020.0002.226D4][.A6D4.0000.0000.226D4] # CJK COMPATIBILITY IDEOGRAPH-2F8A4; QQC
+2F8B8 ; [.FB84.0020.0002.22B0C][.AB0C.0000.0000.22B0C] # CJK COMPATIBILITY IDEOGRAPH-2F8B8; QQC
+2F8BE ; [.FB84.0020.0002.22BF1][.ABF1.0000.0000.22BF1] # CJK COMPATIBILITY IDEOGRAPH-2F8BE; QQC
+2F8CA ; [.FB84.0020.0002.2300A][.B00A.0000.0000.2300A] # CJK COMPATIBILITY IDEOGRAPH-2F8CA; QQC
+2F897 ; [.FB84.0020.0002.232B8][.B2B8.0000.0000.232B8] # CJK COMPATIBILITY IDEOGRAPH-2F897; QQC
+2F980 ; [.FB84.0020.0002.2335F][.B35F.0000.0000.2335F] # CJK COMPATIBILITY IDEOGRAPH-2F980; QQC
+2F989 ; [.FB84.0020.0002.23393][.B393.0000.0000.23393] # CJK COMPATIBILITY IDEOGRAPH-2F989; QQC
+2F98A ; [.FB84.0020.0002.2339C][.B39C.0000.0000.2339C] # CJK COMPATIBILITY IDEOGRAPH-2F98A; QQC
+2F8DD ; [.FB84.0020.0002.233C3][.B3C3.0000.0000.233C3] # CJK COMPATIBILITY IDEOGRAPH-2F8DD; QQC
+2F8E3 ; [.FB84.0020.0002.2346D][.B46D.0000.0000.2346D] # CJK COMPATIBILITY IDEOGRAPH-2F8E3; QQC
+2F8EC ; [.FB84.0020.0002.236A3][.B6A3.0000.0000.236A3] # CJK COMPATIBILITY IDEOGRAPH-2F8EC; QQC
+2F8F0 ; [.FB84.0020.0002.238A7][.B8A7.0000.0000.238A7] # CJK COMPATIBILITY IDEOGRAPH-2F8F0; QQC
+2F8F7 ; [.FB84.0020.0002.23A8D][.BA8D.0000.0000.23A8D] # CJK COMPATIBILITY IDEOGRAPH-2F8F7; QQC
+2F8F9 ; [.FB84.0020.0002.23AFA][.BAFA.0000.0000.23AFA] # CJK COMPATIBILITY IDEOGRAPH-2F8F9; QQC
+2F8FB ; [.FB84.0020.0002.23CBC][.BCBC.0000.0000.23CBC] # CJK COMPATIBILITY IDEOGRAPH-2F8FB; QQC
+2F906 ; [.FB84.0020.0002.23D1E][.BD1E.0000.0000.23D1E] # CJK COMPATIBILITY IDEOGRAPH-2F906; QQC
+2F90D ; [.FB84.0020.0002.23ED1][.BED1.0000.0000.23ED1] # CJK COMPATIBILITY IDEOGRAPH-2F90D; QQC
+2F910 ; [.FB84.0020.0002.23F5E][.BF5E.0000.0000.23F5E] # CJK COMPATIBILITY IDEOGRAPH-2F910; QQC
+2F911 ; [.FB84.0020.0002.23F8E][.BF8E.0000.0000.23F8E] # CJK COMPATIBILITY IDEOGRAPH-2F911; QQC
+2F91D ; [.FB84.0020.0002.24263][.C263.0000.0000.24263] # CJK COMPATIBILITY IDEOGRAPH-2F91D; QQC
+2F91F ; [.FB84.0020.0002.243AB][.C3AB.0000.0000.243AB] # CJK COMPATIBILITY IDEOGRAPH-2F91F; QQC
+2F923 ; [.FB84.0020.0002.24608][.C608.0000.0000.24608] # CJK COMPATIBILITY IDEOGRAPH-2F923; QQC
+2F926 ; [.FB84.0020.0002.24735][.C735.0000.0000.24735] # CJK COMPATIBILITY IDEOGRAPH-2F926; QQC
+2F927 ; [.FB84.0020.0002.24814][.C814.0000.0000.24814] # CJK COMPATIBILITY IDEOGRAPH-2F927; QQC
+2F935 ; [.FB84.0020.0002.24C36][.CC36.0000.0000.24C36] # CJK COMPATIBILITY IDEOGRAPH-2F935; QQC
+2F937 ; [.FB84.0020.0002.24C92][.CC92.0000.0000.24C92] # CJK COMPATIBILITY IDEOGRAPH-2F937; QQC
+2F93B ; [.FB84.0020.0002.24FA1][.CFA1.0000.0000.24FA1] # CJK COMPATIBILITY IDEOGRAPH-2F93B; QQC
+2F93C ; [.FB84.0020.0002.24FB8][.CFB8.0000.0000.24FB8] # CJK COMPATIBILITY IDEOGRAPH-2F93C; QQC
+2F93D ; [.FB84.0020.0002.25044][.D044.0000.0000.25044] # CJK COMPATIBILITY IDEOGRAPH-2F93D; QQC
+2F942 ; [.FB84.0020.0002.250F2][.D0F2.0000.0000.250F2] # CJK COMPATIBILITY IDEOGRAPH-2F942; QQC
+2F941 ; [.FB84.0020.0002.250F3][.D0F3.0000.0000.250F3] # CJK COMPATIBILITY IDEOGRAPH-2F941; QQC
+2F943 ; [.FB84.0020.0002.25119][.D119.0000.0000.25119] # CJK COMPATIBILITY IDEOGRAPH-2F943; QQC
+2F944 ; [.FB84.0020.0002.25133][.D133.0000.0000.25133] # CJK COMPATIBILITY IDEOGRAPH-2F944; QQC
+2F94D ; [.FB84.0020.0002.2541D][.D41D.0000.0000.2541D] # CJK COMPATIBILITY IDEOGRAPH-2F94D; QQC
+2F952 ; [.FB84.0020.0002.25626][.D626.0000.0000.25626] # CJK COMPATIBILITY IDEOGRAPH-2F952; QQC
+2F954 ; [.FB84.0020.0002.2569A][.D69A.0000.0000.2569A] # CJK COMPATIBILITY IDEOGRAPH-2F954; QQC
+2F955 ; [.FB84.0020.0002.256C5][.D6C5.0000.0000.256C5] # CJK COMPATIBILITY IDEOGRAPH-2F955; QQC
+2F95C ; [.FB84.0020.0002.2597C][.D97C.0000.0000.2597C] # CJK COMPATIBILITY IDEOGRAPH-2F95C; QQC
+2F95D ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95D; QQC
+2F95E ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95E; QQC
+2F961 ; [.FB84.0020.0002.25BAB][.DBAB.0000.0000.25BAB] # CJK COMPATIBILITY IDEOGRAPH-2F961; QQC
+2F965 ; [.FB84.0020.0002.25C80][.DC80.0000.0000.25C80] # CJK COMPATIBILITY IDEOGRAPH-2F965; QQC
+2F96B ; [.FB84.0020.0002.25F86][.DF86.0000.0000.25F86] # CJK COMPATIBILITY IDEOGRAPH-2F96B; QQC
+2F898 ; [.FB84.0020.0002.261DA][.E1DA.0000.0000.261DA] # CJK COMPATIBILITY IDEOGRAPH-2F898; QQC
+2F972 ; [.FB84.0020.0002.26228][.E228.0000.0000.26228] # CJK COMPATIBILITY IDEOGRAPH-2F972; QQC
+2F973 ; [.FB84.0020.0002.26247][.E247.0000.0000.26247] # CJK COMPATIBILITY IDEOGRAPH-2F973; QQC
+2F975 ; [.FB84.0020.0002.262D9][.E2D9.0000.0000.262D9] # CJK COMPATIBILITY IDEOGRAPH-2F975; QQC
+2F977 ; [.FB84.0020.0002.2633E][.E33E.0000.0000.2633E] # CJK COMPATIBILITY IDEOGRAPH-2F977; QQC
+2F97B ; [.FB84.0020.0002.264DA][.E4DA.0000.0000.264DA] # CJK COMPATIBILITY IDEOGRAPH-2F97B; QQC
+2F97C ; [.FB84.0020.0002.26523][.E523.0000.0000.26523] # CJK COMPATIBILITY IDEOGRAPH-2F97C; QQC
+2F97E ; [.FB84.0020.0002.265A8][.E5A8.0000.0000.265A8] # CJK COMPATIBILITY IDEOGRAPH-2F97E; QQC
+2F987 ; [.FB84.0020.0002.267A7][.E7A7.0000.0000.267A7] # CJK COMPATIBILITY IDEOGRAPH-2F987; QQC
+2F988 ; [.FB84.0020.0002.267B5][.E7B5.0000.0000.267B5] # CJK COMPATIBILITY IDEOGRAPH-2F988; QQC
+2F997 ; [.FB84.0020.0002.26B3C][.EB3C.0000.0000.26B3C] # CJK COMPATIBILITY IDEOGRAPH-2F997; QQC
+2F9A4 ; [.FB84.0020.0002.26C36][.EC36.0000.0000.26C36] # CJK COMPATIBILITY IDEOGRAPH-2F9A4; QQC
+2F9A6 ; [.FB84.0020.0002.26CD5][.ECD5.0000.0000.26CD5] # CJK COMPATIBILITY IDEOGRAPH-2F9A6; QQC
+2F9A5 ; [.FB84.0020.0002.26D6B][.ED6B.0000.0000.26D6B] # CJK COMPATIBILITY IDEOGRAPH-2F9A5; QQC
+2F9AD ; [.FB84.0020.0002.26F2C][.EF2C.0000.0000.26F2C] # CJK COMPATIBILITY IDEOGRAPH-2F9AD; QQC
+2F9B0 ; [.FB84.0020.0002.26FB1][.EFB1.0000.0000.26FB1] # CJK COMPATIBILITY IDEOGRAPH-2F9B0; QQC
+2F9B1 ; [.FB84.0020.0002.270D2][.F0D2.0000.0000.270D2] # CJK COMPATIBILITY IDEOGRAPH-2F9B1; QQC
+2F9AB ; [.FB84.0020.0002.273CA][.F3CA.0000.0000.273CA] # CJK COMPATIBILITY IDEOGRAPH-2F9AB; QQC
+2F9C5 ; [.FB84.0020.0002.27667][.F667.0000.0000.27667] # CJK COMPATIBILITY IDEOGRAPH-2F9C5; QQC
+2F9CB ; [.FB84.0020.0002.278AE][.F8AE.0000.0000.278AE] # CJK COMPATIBILITY IDEOGRAPH-2F9CB; QQC
+2F9CC ; [.FB84.0020.0002.27966][.F966.0000.0000.27966] # CJK COMPATIBILITY IDEOGRAPH-2F9CC; QQC
+2F9D3 ; [.FB84.0020.0002.27CA8][.FCA8.0000.0000.27CA8] # CJK COMPATIBILITY IDEOGRAPH-2F9D3; QQC
+2F9D8 ; [.FB84.0020.0002.27F2F][.FF2F.0000.0000.27F2F] # CJK COMPATIBILITY IDEOGRAPH-2F9D8; QQC
+2F9E0 ; [.FB85.0020.0002.285D2][.85D2.0000.0000.285D2] # CJK COMPATIBILITY IDEOGRAPH-2F9E0; QQC
+2F9E1 ; [.FB85.0020.0002.285ED][.85ED.0000.0000.285ED] # CJK COMPATIBILITY IDEOGRAPH-2F9E1; QQC
+2F9E5 ; [.FB85.0020.0002.2872E][.872E.0000.0000.2872E] # CJK COMPATIBILITY IDEOGRAPH-2F9E5; QQC
+2F9ED ; [.FB85.0020.0002.28BFA][.8BFA.0000.0000.28BFA] # CJK COMPATIBILITY IDEOGRAPH-2F9ED; QQC
+2F9F1 ; [.FB85.0020.0002.28D77][.8D77.0000.0000.28D77] # CJK COMPATIBILITY IDEOGRAPH-2F9F1; QQC
+2F9F6 ; [.FB85.0020.0002.29145][.9145.0000.0000.29145] # CJK COMPATIBILITY IDEOGRAPH-2F9F6; QQC
+2F81C ; [.FB85.0020.0002.291DF][.91DF.0000.0000.291DF] # CJK COMPATIBILITY IDEOGRAPH-2F81C; QQC
+2F9F7 ; [.FB85.0020.0002.2921A][.921A.0000.0000.2921A] # CJK COMPATIBILITY IDEOGRAPH-2F9F7; QQC
+2F9FB ; [.FB85.0020.0002.2940A][.940A.0000.0000.2940A] # CJK COMPATIBILITY IDEOGRAPH-2F9FB; QQC
+2F9FD ; [.FB85.0020.0002.29496][.9496.0000.0000.29496] # CJK COMPATIBILITY IDEOGRAPH-2F9FD; QQC
+2FA01 ; [.FB85.0020.0002.295B6][.95B6.0000.0000.295B6] # CJK COMPATIBILITY IDEOGRAPH-2FA01; QQC
+2FA09 ; [.FB85.0020.0002.29B30][.9B30.0000.0000.29B30] # CJK COMPATIBILITY IDEOGRAPH-2FA09; QQC
+2FA10 ; [.FB85.0020.0002.2A0CE][.A0CE.0000.0000.2A0CE] # CJK COMPATIBILITY IDEOGRAPH-2FA10; QQC
+2FA12 ; [.FB85.0020.0002.2A105][.A105.0000.0000.2A105] # CJK COMPATIBILITY IDEOGRAPH-2FA12; QQC
+2FA13 ; [.FB85.0020.0002.2A20E][.A20E.0000.0000.2A20E] # CJK COMPATIBILITY IDEOGRAPH-2FA13; QQC
+2FA14 ; [.FB85.0020.0002.2A291][.A291.0000.0000.2A291] # CJK COMPATIBILITY IDEOGRAPH-2FA14; QQC
+2F88F ; [.FB85.0020.0002.2A392][.A392.0000.0000.2A392] # CJK COMPATIBILITY IDEOGRAPH-2F88F; QQC
+2FA1D ; [.FB85.0020.0002.2A600][.A600.0000.0000.2A600] # CJK COMPATIBILITY IDEOGRAPH-2FA1D; QQC
diff --git a/mysql-test/std_data/unicode/allkeys520.txt b/mysql-test/std_data/unicode/allkeys520.txt
new file mode 100644
index 00000000000..244c6724e13
--- /dev/null
+++ b/mysql-test/std_data/unicode/allkeys520.txt
@@ -0,0 +1,22542 @@
+# unidata-5.2.0.txt
+# Date: 2009-09-22, 16:23:42 PDT [KW]
+#
+# This file defines the Default Unicode Collation Element Table
+# (DUCET) for the Unicode Collation Algorithm
+#
+# Copyright (c) 2001-2009 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# See UTS #10, Unicode Collation Algorithm, for more information.
+#
+# Diagnostic weight ranges
+# Primary weight range: 0200..3ACA (14539)
+# Secondary weight range: 0020..0192 (371)
+# Variant secondaries: 0159..015E (6)
+# Digit secondaries: 015F..0192 (52)
+# Tertiary weight range: 0002..001F (30)
+#
+@version 5.2.0
+
+0000 ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
+0001 ; [.0000.0000.0000.0000] # [0001] START OF HEADING (in 6429)
+0002 ; [.0000.0000.0000.0000] # [0002] START OF TEXT (in 6429)
+0003 ; [.0000.0000.0000.0000] # [0003] END OF TEXT (in 6429)
+0004 ; [.0000.0000.0000.0000] # [0004] END OF TRANSMISSION (in 6429)
+0005 ; [.0000.0000.0000.0000] # [0005] ENQUIRY (in 6429)
+0006 ; [.0000.0000.0000.0000] # [0006] ACKNOWLEDGE (in 6429)
+0007 ; [.0000.0000.0000.0000] # [0007] BELL (in 6429)
+0008 ; [.0000.0000.0000.0000] # [0008] BACKSPACE (in 6429)
+000E ; [.0000.0000.0000.0000] # [000E] SHIFT OUT (in 6429)
+000F ; [.0000.0000.0000.0000] # [000F] SHIFT IN (in 6429)
+0010 ; [.0000.0000.0000.0000] # [0010] DATA LINK ESCAPE (in 6429)
+0011 ; [.0000.0000.0000.0000] # [0011] DEVICE CONTROL ONE (in 6429)
+0012 ; [.0000.0000.0000.0000] # [0012] DEVICE CONTROL TWO (in 6429)
+0013 ; [.0000.0000.0000.0000] # [0013] DEVICE CONTROL THREE (in 6429)
+0014 ; [.0000.0000.0000.0000] # [0014] DEVICE CONTROL FOUR (in 6429)
+0015 ; [.0000.0000.0000.0000] # [0015] NEGATIVE ACKNOWLEDGE (in 6429)
+0016 ; [.0000.0000.0000.0000] # [0016] SYNCHRONOUS IDLE (in 6429)
+0017 ; [.0000.0000.0000.0000] # [0017] END OF TRANSMISSION BLOCK (in 6429)
+0018 ; [.0000.0000.0000.0000] # [0018] CANCEL (in 6429)
+0019 ; [.0000.0000.0000.0000] # [0019] END OF MEDIUM (in 6429)
+001A ; [.0000.0000.0000.0000] # [001A] SUBSTITUTE (in 6429)
+001B ; [.0000.0000.0000.0000] # [001B] ESCAPE (in 6429)
+001C ; [.0000.0000.0000.0000] # [001C] FILE SEPARATOR (in 6429)
+001D ; [.0000.0000.0000.0000] # [001D] GROUP SEPARATOR (in 6429)
+001E ; [.0000.0000.0000.0000] # [001E] RECORD SEPARATOR (in 6429)
+001F ; [.0000.0000.0000.0000] # [001F] UNIT SEPARATOR (in 6429)
+007F ; [.0000.0000.0000.0000] # [007F] DELETE (in 6429)
+0080 ; [.0000.0000.0000.0000] # [0080] <control>
+0081 ; [.0000.0000.0000.0000] # [0081] <control>
+0082 ; [.0000.0000.0000.0000] # [0082] BREAK PERMITTED HERE (in 6429)
+0083 ; [.0000.0000.0000.0000] # [0083] NO BREAK HERE (in 6429)
+0084 ; [.0000.0000.0000.0000] # [0084] <control>
+0086 ; [.0000.0000.0000.0000] # [0086] START OF SELECTED AREA (in 6429)
+0087 ; [.0000.0000.0000.0000] # [0087] END OF SELECTED AREA (in 6429)
+0088 ; [.0000.0000.0000.0000] # [0088] CHARACTER TABULATION SET (in 6429)
+0089 ; [.0000.0000.0000.0000] # [0089] CHARACTER TABULATION WITH JUSTIFICATION (in 6429)
+008A ; [.0000.0000.0000.0000] # [008A] LINE TABULATION SET (in 6429)
+008B ; [.0000.0000.0000.0000] # [008B] PARTIAL LINE FORWARD (in 6429)
+008C ; [.0000.0000.0000.0000] # [008C] PARTIAL LINE BACKWARD (in 6429)
+008D ; [.0000.0000.0000.0000] # [008D] PARTIAL LINE FEED (in 6429)
+008E ; [.0000.0000.0000.0000] # [008E] SINGLE SHIFT TWO (in 6429)
+008F ; [.0000.0000.0000.0000] # [008F] SINGLE SHIFT THREE (in 6429)
+0090 ; [.0000.0000.0000.0000] # [0090] DEVICE CONTROL STRING (in 6429)
+0091 ; [.0000.0000.0000.0000] # [0091] PRIVATE USE ONE (in 6429)
+0092 ; [.0000.0000.0000.0000] # [0092] PRIVATE USE TWO (in 6429)
+0093 ; [.0000.0000.0000.0000] # [0093] SET TRANSMIT STATE (in 6429)
+0094 ; [.0000.0000.0000.0000] # [0094] CANCEL CHARACTER (in 6429)
+0095 ; [.0000.0000.0000.0000] # [0095] MESSAGE WAITING (in 6429)
+0096 ; [.0000.0000.0000.0000] # [0096] START OF GUARDED AREA (in 6429)
+0097 ; [.0000.0000.0000.0000] # [0097] END OF GUARDED AREA (in 6429)
+0098 ; [.0000.0000.0000.0000] # [0098] START OF STRING (in 6429)
+0099 ; [.0000.0000.0000.0000] # [0099] <control>
+009A ; [.0000.0000.0000.0000] # [009A] SINGLE CHARACTER INTRODUCER (in 6429)
+009B ; [.0000.0000.0000.0000] # [009B] CONTROL SEQUENCE INTRODUCER (in 6429)
+009C ; [.0000.0000.0000.0000] # [009C] STRING TERMINATOR (in 6429)
+009D ; [.0000.0000.0000.0000] # [009D] OPERATING SYSTEM COMMAND (in 6429)
+009E ; [.0000.0000.0000.0000] # [009E] PRIVACY MESSAGE (in 6429)
+009F ; [.0000.0000.0000.0000] # [009F] APPLICATION PROGRAM COMMAND (in 6429)
+070F ; [.0000.0000.0000.0000] # [070F] SYRIAC ABBREVIATION MARK
+180B ; [.0000.0000.0000.0000] # [180B] MONGOLIAN FREE VARIATION SELECTOR ONE
+180C ; [.0000.0000.0000.0000] # [180C] MONGOLIAN FREE VARIATION SELECTOR TWO
+180D ; [.0000.0000.0000.0000] # [180D] MONGOLIAN FREE VARIATION SELECTOR THREE
+200B ; [.0000.0000.0000.0000] # [200B] ZERO WIDTH SPACE
+200C ; [.0000.0000.0000.0000] # [200C] ZERO WIDTH NON-JOINER
+200D ; [.0000.0000.0000.0000] # [200D] ZERO WIDTH JOINER
+200E ; [.0000.0000.0000.0000] # [200E] LEFT-TO-RIGHT MARK
+200F ; [.0000.0000.0000.0000] # [200F] RIGHT-TO-LEFT MARK
+202A ; [.0000.0000.0000.0000] # [202A] LEFT-TO-RIGHT EMBEDDING
+202B ; [.0000.0000.0000.0000] # [202B] RIGHT-TO-LEFT EMBEDDING
+202C ; [.0000.0000.0000.0000] # [202C] POP DIRECTIONAL FORMATTING
+202D ; [.0000.0000.0000.0000] # [202D] LEFT-TO-RIGHT OVERRIDE
+202E ; [.0000.0000.0000.0000] # [202E] RIGHT-TO-LEFT OVERRIDE
+2060 ; [.0000.0000.0000.0000] # [2060] WORD JOINER
+206A ; [.0000.0000.0000.0000] # [206A] INHIBIT SYMMETRIC SWAPPING
+206B ; [.0000.0000.0000.0000] # [206B] ACTIVATE SYMMETRIC SWAPPING
+206C ; [.0000.0000.0000.0000] # [206C] INHIBIT ARABIC FORM SHAPING
+206D ; [.0000.0000.0000.0000] # [206D] ACTIVATE ARABIC FORM SHAPING
+206E ; [.0000.0000.0000.0000] # [206E] NATIONAL DIGIT SHAPES
+206F ; [.0000.0000.0000.0000] # [206F] NOMINAL DIGIT SHAPES
+FE00 ; [.0000.0000.0000.0000] # [FE00] VARIATION SELECTOR-1
+FE01 ; [.0000.0000.0000.0000] # [FE01] VARIATION SELECTOR-2
+FE02 ; [.0000.0000.0000.0000] # [FE02] VARIATION SELECTOR-3
+FE03 ; [.0000.0000.0000.0000] # [FE03] VARIATION SELECTOR-4
+FE04 ; [.0000.0000.0000.0000] # [FE04] VARIATION SELECTOR-5
+FE05 ; [.0000.0000.0000.0000] # [FE05] VARIATION SELECTOR-6
+FE06 ; [.0000.0000.0000.0000] # [FE06] VARIATION SELECTOR-7
+FE07 ; [.0000.0000.0000.0000] # [FE07] VARIATION SELECTOR-8
+FE08 ; [.0000.0000.0000.0000] # [FE08] VARIATION SELECTOR-9
+FE09 ; [.0000.0000.0000.0000] # [FE09] VARIATION SELECTOR-10
+FE0A ; [.0000.0000.0000.0000] # [FE0A] VARIATION SELECTOR-11
+FE0B ; [.0000.0000.0000.0000] # [FE0B] VARIATION SELECTOR-12
+FE0C ; [.0000.0000.0000.0000] # [FE0C] VARIATION SELECTOR-13
+FE0D ; [.0000.0000.0000.0000] # [FE0D] VARIATION SELECTOR-14
+FE0E ; [.0000.0000.0000.0000] # [FE0E] VARIATION SELECTOR-15
+FE0F ; [.0000.0000.0000.0000] # [FE0F] VARIATION SELECTOR-16
+FEFF ; [.0000.0000.0000.0000] # [FEFF] ZERO WIDTH NO-BREAK SPACE
+FFF9 ; [.0000.0000.0000.0000] # [FFF9] INTERLINEAR ANNOTATION ANCHOR
+FFFA ; [.0000.0000.0000.0000] # [FFFA] INTERLINEAR ANNOTATION SEPARATOR
+FFFB ; [.0000.0000.0000.0000] # [FFFB] INTERLINEAR ANNOTATION TERMINATOR
+1D173 ; [.0000.0000.0000.0000] # [1D173] MUSICAL SYMBOL BEGIN BEAM
+1D174 ; [.0000.0000.0000.0000] # [1D174] MUSICAL SYMBOL END BEAM
+1D175 ; [.0000.0000.0000.0000] # [1D175] MUSICAL SYMBOL BEGIN TIE
+1D176 ; [.0000.0000.0000.0000] # [1D176] MUSICAL SYMBOL END TIE
+1D177 ; [.0000.0000.0000.0000] # [1D177] MUSICAL SYMBOL BEGIN SLUR
+1D178 ; [.0000.0000.0000.0000] # [1D178] MUSICAL SYMBOL END SLUR
+1D179 ; [.0000.0000.0000.0000] # [1D179] MUSICAL SYMBOL BEGIN PHRASE
+1D17A ; [.0000.0000.0000.0000] # [1D17A] MUSICAL SYMBOL END PHRASE
+E0001 ; [.0000.0000.0000.0000] # [E0001] LANGUAGE TAG
+E0020 ; [.0000.0000.0000.0000] # [E0020] TAG SPACE
+E0021 ; [.0000.0000.0000.0000] # [E0021] TAG EXCLAMATION MARK
+E0022 ; [.0000.0000.0000.0000] # [E0022] TAG QUOTATION MARK
+E0023 ; [.0000.0000.0000.0000] # [E0023] TAG NUMBER SIGN
+E0024 ; [.0000.0000.0000.0000] # [E0024] TAG DOLLAR SIGN
+E0025 ; [.0000.0000.0000.0000] # [E0025] TAG PERCENT SIGN
+E0026 ; [.0000.0000.0000.0000] # [E0026] TAG AMPERSAND
+E0027 ; [.0000.0000.0000.0000] # [E0027] TAG APOSTROPHE
+E0028 ; [.0000.0000.0000.0000] # [E0028] TAG LEFT PARENTHESIS
+E0029 ; [.0000.0000.0000.0000] # [E0029] TAG RIGHT PARENTHESIS
+E002A ; [.0000.0000.0000.0000] # [E002A] TAG ASTERISK
+E002B ; [.0000.0000.0000.0000] # [E002B] TAG PLUS SIGN
+E002C ; [.0000.0000.0000.0000] # [E002C] TAG COMMA
+E002D ; [.0000.0000.0000.0000] # [E002D] TAG HYPHEN-MINUS
+E002E ; [.0000.0000.0000.0000] # [E002E] TAG FULL STOP
+E002F ; [.0000.0000.0000.0000] # [E002F] TAG SOLIDUS
+E0030 ; [.0000.0000.0000.0000] # [E0030] TAG DIGIT ZERO
+E0031 ; [.0000.0000.0000.0000] # [E0031] TAG DIGIT ONE
+E0032 ; [.0000.0000.0000.0000] # [E0032] TAG DIGIT TWO
+E0033 ; [.0000.0000.0000.0000] # [E0033] TAG DIGIT THREE
+E0034 ; [.0000.0000.0000.0000] # [E0034] TAG DIGIT FOUR
+E0035 ; [.0000.0000.0000.0000] # [E0035] TAG DIGIT FIVE
+E0036 ; [.0000.0000.0000.0000] # [E0036] TAG DIGIT SIX
+E0037 ; [.0000.0000.0000.0000] # [E0037] TAG DIGIT SEVEN
+E0038 ; [.0000.0000.0000.0000] # [E0038] TAG DIGIT EIGHT
+E0039 ; [.0000.0000.0000.0000] # [E0039] TAG DIGIT NINE
+E003A ; [.0000.0000.0000.0000] # [E003A] TAG COLON
+E003B ; [.0000.0000.0000.0000] # [E003B] TAG SEMICOLON
+E003C ; [.0000.0000.0000.0000] # [E003C] TAG LESS-THAN SIGN
+E003D ; [.0000.0000.0000.0000] # [E003D] TAG EQUALS SIGN
+E003E ; [.0000.0000.0000.0000] # [E003E] TAG GREATER-THAN SIGN
+E003F ; [.0000.0000.0000.0000] # [E003F] TAG QUESTION MARK
+E0040 ; [.0000.0000.0000.0000] # [E0040] TAG COMMERCIAL AT
+E0041 ; [.0000.0000.0000.0000] # [E0041] TAG LATIN CAPITAL LETTER A
+E0042 ; [.0000.0000.0000.0000] # [E0042] TAG LATIN CAPITAL LETTER B
+E0043 ; [.0000.0000.0000.0000] # [E0043] TAG LATIN CAPITAL LETTER C
+E0044 ; [.0000.0000.0000.0000] # [E0044] TAG LATIN CAPITAL LETTER D
+E0045 ; [.0000.0000.0000.0000] # [E0045] TAG LATIN CAPITAL LETTER E
+E0046 ; [.0000.0000.0000.0000] # [E0046] TAG LATIN CAPITAL LETTER F
+E0047 ; [.0000.0000.0000.0000] # [E0047] TAG LATIN CAPITAL LETTER G
+E0048 ; [.0000.0000.0000.0000] # [E0048] TAG LATIN CAPITAL LETTER H
+E0049 ; [.0000.0000.0000.0000] # [E0049] TAG LATIN CAPITAL LETTER I
+E004A ; [.0000.0000.0000.0000] # [E004A] TAG LATIN CAPITAL LETTER J
+E004B ; [.0000.0000.0000.0000] # [E004B] TAG LATIN CAPITAL LETTER K
+E004C ; [.0000.0000.0000.0000] # [E004C] TAG LATIN CAPITAL LETTER L
+E004D ; [.0000.0000.0000.0000] # [E004D] TAG LATIN CAPITAL LETTER M
+E004E ; [.0000.0000.0000.0000] # [E004E] TAG LATIN CAPITAL LETTER N
+E004F ; [.0000.0000.0000.0000] # [E004F] TAG LATIN CAPITAL LETTER O
+E0050 ; [.0000.0000.0000.0000] # [E0050] TAG LATIN CAPITAL LETTER P
+E0051 ; [.0000.0000.0000.0000] # [E0051] TAG LATIN CAPITAL LETTER Q
+E0052 ; [.0000.0000.0000.0000] # [E0052] TAG LATIN CAPITAL LETTER R
+E0053 ; [.0000.0000.0000.0000] # [E0053] TAG LATIN CAPITAL LETTER S
+E0054 ; [.0000.0000.0000.0000] # [E0054] TAG LATIN CAPITAL LETTER T
+E0055 ; [.0000.0000.0000.0000] # [E0055] TAG LATIN CAPITAL LETTER U
+E0056 ; [.0000.0000.0000.0000] # [E0056] TAG LATIN CAPITAL LETTER V
+E0057 ; [.0000.0000.0000.0000] # [E0057] TAG LATIN CAPITAL LETTER W
+E0058 ; [.0000.0000.0000.0000] # [E0058] TAG LATIN CAPITAL LETTER X
+E0059 ; [.0000.0000.0000.0000] # [E0059] TAG LATIN CAPITAL LETTER Y
+E005A ; [.0000.0000.0000.0000] # [E005A] TAG LATIN CAPITAL LETTER Z
+E005B ; [.0000.0000.0000.0000] # [E005B] TAG LEFT SQUARE BRACKET
+E005C ; [.0000.0000.0000.0000] # [E005C] TAG REVERSE SOLIDUS
+E005D ; [.0000.0000.0000.0000] # [E005D] TAG RIGHT SQUARE BRACKET
+E005E ; [.0000.0000.0000.0000] # [E005E] TAG CIRCUMFLEX ACCENT
+E005F ; [.0000.0000.0000.0000] # [E005F] TAG LOW LINE
+E0060 ; [.0000.0000.0000.0000] # [E0060] TAG GRAVE ACCENT
+E0061 ; [.0000.0000.0000.0000] # [E0061] TAG LATIN SMALL LETTER A
+E0062 ; [.0000.0000.0000.0000] # [E0062] TAG LATIN SMALL LETTER B
+E0063 ; [.0000.0000.0000.0000] # [E0063] TAG LATIN SMALL LETTER C
+E0064 ; [.0000.0000.0000.0000] # [E0064] TAG LATIN SMALL LETTER D
+E0065 ; [.0000.0000.0000.0000] # [E0065] TAG LATIN SMALL LETTER E
+E0066 ; [.0000.0000.0000.0000] # [E0066] TAG LATIN SMALL LETTER F
+E0067 ; [.0000.0000.0000.0000] # [E0067] TAG LATIN SMALL LETTER G
+E0068 ; [.0000.0000.0000.0000] # [E0068] TAG LATIN SMALL LETTER H
+E0069 ; [.0000.0000.0000.0000] # [E0069] TAG LATIN SMALL LETTER I
+E006A ; [.0000.0000.0000.0000] # [E006A] TAG LATIN SMALL LETTER J
+E006B ; [.0000.0000.0000.0000] # [E006B] TAG LATIN SMALL LETTER K
+E006C ; [.0000.0000.0000.0000] # [E006C] TAG LATIN SMALL LETTER L
+E006D ; [.0000.0000.0000.0000] # [E006D] TAG LATIN SMALL LETTER M
+E006E ; [.0000.0000.0000.0000] # [E006E] TAG LATIN SMALL LETTER N
+E006F ; [.0000.0000.0000.0000] # [E006F] TAG LATIN SMALL LETTER O
+E0070 ; [.0000.0000.0000.0000] # [E0070] TAG LATIN SMALL LETTER P
+E0071 ; [.0000.0000.0000.0000] # [E0071] TAG LATIN SMALL LETTER Q
+E0072 ; [.0000.0000.0000.0000] # [E0072] TAG LATIN SMALL LETTER R
+E0073 ; [.0000.0000.0000.0000] # [E0073] TAG LATIN SMALL LETTER S
+E0074 ; [.0000.0000.0000.0000] # [E0074] TAG LATIN SMALL LETTER T
+E0075 ; [.0000.0000.0000.0000] # [E0075] TAG LATIN SMALL LETTER U
+E0076 ; [.0000.0000.0000.0000] # [E0076] TAG LATIN SMALL LETTER V
+E0077 ; [.0000.0000.0000.0000] # [E0077] TAG LATIN SMALL LETTER W
+E0078 ; [.0000.0000.0000.0000] # [E0078] TAG LATIN SMALL LETTER X
+E0079 ; [.0000.0000.0000.0000] # [E0079] TAG LATIN SMALL LETTER Y
+E007A ; [.0000.0000.0000.0000] # [E007A] TAG LATIN SMALL LETTER Z
+E007B ; [.0000.0000.0000.0000] # [E007B] TAG LEFT CURLY BRACKET
+E007C ; [.0000.0000.0000.0000] # [E007C] TAG VERTICAL LINE
+E007D ; [.0000.0000.0000.0000] # [E007D] TAG RIGHT CURLY BRACKET
+E007E ; [.0000.0000.0000.0000] # [E007E] TAG TILDE
+E007F ; [.0000.0000.0000.0000] # [E007F] CANCEL TAG
+E0100 ; [.0000.0000.0000.0000] # [E0100] VARIATION SELECTOR-17
+E0101 ; [.0000.0000.0000.0000] # [E0101] VARIATION SELECTOR-18
+E0102 ; [.0000.0000.0000.0000] # [E0102] VARIATION SELECTOR-19
+E0103 ; [.0000.0000.0000.0000] # [E0103] VARIATION SELECTOR-20
+E0104 ; [.0000.0000.0000.0000] # [E0104] VARIATION SELECTOR-21
+E0105 ; [.0000.0000.0000.0000] # [E0105] VARIATION SELECTOR-22
+E0106 ; [.0000.0000.0000.0000] # [E0106] VARIATION SELECTOR-23
+E0107 ; [.0000.0000.0000.0000] # [E0107] VARIATION SELECTOR-24
+E0108 ; [.0000.0000.0000.0000] # [E0108] VARIATION SELECTOR-25
+E0109 ; [.0000.0000.0000.0000] # [E0109] VARIATION SELECTOR-26
+E010A ; [.0000.0000.0000.0000] # [E010A] VARIATION SELECTOR-27
+E010B ; [.0000.0000.0000.0000] # [E010B] VARIATION SELECTOR-28
+E010C ; [.0000.0000.0000.0000] # [E010C] VARIATION SELECTOR-29
+E010D ; [.0000.0000.0000.0000] # [E010D] VARIATION SELECTOR-30
+E010E ; [.0000.0000.0000.0000] # [E010E] VARIATION SELECTOR-31
+E010F ; [.0000.0000.0000.0000] # [E010F] VARIATION SELECTOR-32
+E0110 ; [.0000.0000.0000.0000] # [E0110] VARIATION SELECTOR-33
+E0111 ; [.0000.0000.0000.0000] # [E0111] VARIATION SELECTOR-34
+E0112 ; [.0000.0000.0000.0000] # [E0112] VARIATION SELECTOR-35
+E0113 ; [.0000.0000.0000.0000] # [E0113] VARIATION SELECTOR-36
+E0114 ; [.0000.0000.0000.0000] # [E0114] VARIATION SELECTOR-37
+E0115 ; [.0000.0000.0000.0000] # [E0115] VARIATION SELECTOR-38
+E0116 ; [.0000.0000.0000.0000] # [E0116] VARIATION SELECTOR-39
+E0117 ; [.0000.0000.0000.0000] # [E0117] VARIATION SELECTOR-40
+E0118 ; [.0000.0000.0000.0000] # [E0118] VARIATION SELECTOR-41
+E0119 ; [.0000.0000.0000.0000] # [E0119] VARIATION SELECTOR-42
+E011A ; [.0000.0000.0000.0000] # [E011A] VARIATION SELECTOR-43
+E011B ; [.0000.0000.0000.0000] # [E011B] VARIATION SELECTOR-44
+E011C ; [.0000.0000.0000.0000] # [E011C] VARIATION SELECTOR-45
+E011D ; [.0000.0000.0000.0000] # [E011D] VARIATION SELECTOR-46
+E011E ; [.0000.0000.0000.0000] # [E011E] VARIATION SELECTOR-47
+E011F ; [.0000.0000.0000.0000] # [E011F] VARIATION SELECTOR-48
+E0120 ; [.0000.0000.0000.0000] # [E0120] VARIATION SELECTOR-49
+E0121 ; [.0000.0000.0000.0000] # [E0121] VARIATION SELECTOR-50
+E0122 ; [.0000.0000.0000.0000] # [E0122] VARIATION SELECTOR-51
+E0123 ; [.0000.0000.0000.0000] # [E0123] VARIATION SELECTOR-52
+E0124 ; [.0000.0000.0000.0000] # [E0124] VARIATION SELECTOR-53
+E0125 ; [.0000.0000.0000.0000] # [E0125] VARIATION SELECTOR-54
+E0126 ; [.0000.0000.0000.0000] # [E0126] VARIATION SELECTOR-55
+E0127 ; [.0000.0000.0000.0000] # [E0127] VARIATION SELECTOR-56
+E0128 ; [.0000.0000.0000.0000] # [E0128] VARIATION SELECTOR-57
+E0129 ; [.0000.0000.0000.0000] # [E0129] VARIATION SELECTOR-58
+E012A ; [.0000.0000.0000.0000] # [E012A] VARIATION SELECTOR-59
+E012B ; [.0000.0000.0000.0000] # [E012B] VARIATION SELECTOR-60
+E012C ; [.0000.0000.0000.0000] # [E012C] VARIATION SELECTOR-61
+E012D ; [.0000.0000.0000.0000] # [E012D] VARIATION SELECTOR-62
+E012E ; [.0000.0000.0000.0000] # [E012E] VARIATION SELECTOR-63
+E012F ; [.0000.0000.0000.0000] # [E012F] VARIATION SELECTOR-64
+E0130 ; [.0000.0000.0000.0000] # [E0130] VARIATION SELECTOR-65
+E0131 ; [.0000.0000.0000.0000] # [E0131] VARIATION SELECTOR-66
+E0132 ; [.0000.0000.0000.0000] # [E0132] VARIATION SELECTOR-67
+E0133 ; [.0000.0000.0000.0000] # [E0133] VARIATION SELECTOR-68
+E0134 ; [.0000.0000.0000.0000] # [E0134] VARIATION SELECTOR-69
+E0135 ; [.0000.0000.0000.0000] # [E0135] VARIATION SELECTOR-70
+E0136 ; [.0000.0000.0000.0000] # [E0136] VARIATION SELECTOR-71
+E0137 ; [.0000.0000.0000.0000] # [E0137] VARIATION SELECTOR-72
+E0138 ; [.0000.0000.0000.0000] # [E0138] VARIATION SELECTOR-73
+E0139 ; [.0000.0000.0000.0000] # [E0139] VARIATION SELECTOR-74
+E013A ; [.0000.0000.0000.0000] # [E013A] VARIATION SELECTOR-75
+E013B ; [.0000.0000.0000.0000] # [E013B] VARIATION SELECTOR-76
+E013C ; [.0000.0000.0000.0000] # [E013C] VARIATION SELECTOR-77
+E013D ; [.0000.0000.0000.0000] # [E013D] VARIATION SELECTOR-78
+E013E ; [.0000.0000.0000.0000] # [E013E] VARIATION SELECTOR-79
+E013F ; [.0000.0000.0000.0000] # [E013F] VARIATION SELECTOR-80
+E0140 ; [.0000.0000.0000.0000] # [E0140] VARIATION SELECTOR-81
+E0141 ; [.0000.0000.0000.0000] # [E0141] VARIATION SELECTOR-82
+E0142 ; [.0000.0000.0000.0000] # [E0142] VARIATION SELECTOR-83
+E0143 ; [.0000.0000.0000.0000] # [E0143] VARIATION SELECTOR-84
+E0144 ; [.0000.0000.0000.0000] # [E0144] VARIATION SELECTOR-85
+E0145 ; [.0000.0000.0000.0000] # [E0145] VARIATION SELECTOR-86
+E0146 ; [.0000.0000.0000.0000] # [E0146] VARIATION SELECTOR-87
+E0147 ; [.0000.0000.0000.0000] # [E0147] VARIATION SELECTOR-88
+E0148 ; [.0000.0000.0000.0000] # [E0148] VARIATION SELECTOR-89
+E0149 ; [.0000.0000.0000.0000] # [E0149] VARIATION SELECTOR-90
+E014A ; [.0000.0000.0000.0000] # [E014A] VARIATION SELECTOR-91
+E014B ; [.0000.0000.0000.0000] # [E014B] VARIATION SELECTOR-92
+E014C ; [.0000.0000.0000.0000] # [E014C] VARIATION SELECTOR-93
+E014D ; [.0000.0000.0000.0000] # [E014D] VARIATION SELECTOR-94
+E014E ; [.0000.0000.0000.0000] # [E014E] VARIATION SELECTOR-95
+E014F ; [.0000.0000.0000.0000] # [E014F] VARIATION SELECTOR-96
+E0150 ; [.0000.0000.0000.0000] # [E0150] VARIATION SELECTOR-97
+E0151 ; [.0000.0000.0000.0000] # [E0151] VARIATION SELECTOR-98
+E0152 ; [.0000.0000.0000.0000] # [E0152] VARIATION SELECTOR-99
+E0153 ; [.0000.0000.0000.0000] # [E0153] VARIATION SELECTOR-100
+E0154 ; [.0000.0000.0000.0000] # [E0154] VARIATION SELECTOR-101
+E0155 ; [.0000.0000.0000.0000] # [E0155] VARIATION SELECTOR-102
+E0156 ; [.0000.0000.0000.0000] # [E0156] VARIATION SELECTOR-103
+E0157 ; [.0000.0000.0000.0000] # [E0157] VARIATION SELECTOR-104
+E0158 ; [.0000.0000.0000.0000] # [E0158] VARIATION SELECTOR-105
+E0159 ; [.0000.0000.0000.0000] # [E0159] VARIATION SELECTOR-106
+E015A ; [.0000.0000.0000.0000] # [E015A] VARIATION SELECTOR-107
+E015B ; [.0000.0000.0000.0000] # [E015B] VARIATION SELECTOR-108
+E015C ; [.0000.0000.0000.0000] # [E015C] VARIATION SELECTOR-109
+E015D ; [.0000.0000.0000.0000] # [E015D] VARIATION SELECTOR-110
+E015E ; [.0000.0000.0000.0000] # [E015E] VARIATION SELECTOR-111
+E015F ; [.0000.0000.0000.0000] # [E015F] VARIATION SELECTOR-112
+E0160 ; [.0000.0000.0000.0000] # [E0160] VARIATION SELECTOR-113
+E0161 ; [.0000.0000.0000.0000] # [E0161] VARIATION SELECTOR-114
+E0162 ; [.0000.0000.0000.0000] # [E0162] VARIATION SELECTOR-115
+E0163 ; [.0000.0000.0000.0000] # [E0163] VARIATION SELECTOR-116
+E0164 ; [.0000.0000.0000.0000] # [E0164] VARIATION SELECTOR-117
+E0165 ; [.0000.0000.0000.0000] # [E0165] VARIATION SELECTOR-118
+E0166 ; [.0000.0000.0000.0000] # [E0166] VARIATION SELECTOR-119
+E0167 ; [.0000.0000.0000.0000] # [E0167] VARIATION SELECTOR-120
+E0168 ; [.0000.0000.0000.0000] # [E0168] VARIATION SELECTOR-121
+E0169 ; [.0000.0000.0000.0000] # [E0169] VARIATION SELECTOR-122
+E016A ; [.0000.0000.0000.0000] # [E016A] VARIATION SELECTOR-123
+E016B ; [.0000.0000.0000.0000] # [E016B] VARIATION SELECTOR-124
+E016C ; [.0000.0000.0000.0000] # [E016C] VARIATION SELECTOR-125
+E016D ; [.0000.0000.0000.0000] # [E016D] VARIATION SELECTOR-126
+E016E ; [.0000.0000.0000.0000] # [E016E] VARIATION SELECTOR-127
+E016F ; [.0000.0000.0000.0000] # [E016F] VARIATION SELECTOR-128
+E0170 ; [.0000.0000.0000.0000] # [E0170] VARIATION SELECTOR-129
+E0171 ; [.0000.0000.0000.0000] # [E0171] VARIATION SELECTOR-130
+E0172 ; [.0000.0000.0000.0000] # [E0172] VARIATION SELECTOR-131
+E0173 ; [.0000.0000.0000.0000] # [E0173] VARIATION SELECTOR-132
+E0174 ; [.0000.0000.0000.0000] # [E0174] VARIATION SELECTOR-133
+E0175 ; [.0000.0000.0000.0000] # [E0175] VARIATION SELECTOR-134
+E0176 ; [.0000.0000.0000.0000] # [E0176] VARIATION SELECTOR-135
+E0177 ; [.0000.0000.0000.0000] # [E0177] VARIATION SELECTOR-136
+E0178 ; [.0000.0000.0000.0000] # [E0178] VARIATION SELECTOR-137
+E0179 ; [.0000.0000.0000.0000] # [E0179] VARIATION SELECTOR-138
+E017A ; [.0000.0000.0000.0000] # [E017A] VARIATION SELECTOR-139
+E017B ; [.0000.0000.0000.0000] # [E017B] VARIATION SELECTOR-140
+E017C ; [.0000.0000.0000.0000] # [E017C] VARIATION SELECTOR-141
+E017D ; [.0000.0000.0000.0000] # [E017D] VARIATION SELECTOR-142
+E017E ; [.0000.0000.0000.0000] # [E017E] VARIATION SELECTOR-143
+E017F ; [.0000.0000.0000.0000] # [E017F] VARIATION SELECTOR-144
+E0180 ; [.0000.0000.0000.0000] # [E0180] VARIATION SELECTOR-145
+E0181 ; [.0000.0000.0000.0000] # [E0181] VARIATION SELECTOR-146
+E0182 ; [.0000.0000.0000.0000] # [E0182] VARIATION SELECTOR-147
+E0183 ; [.0000.0000.0000.0000] # [E0183] VARIATION SELECTOR-148
+E0184 ; [.0000.0000.0000.0000] # [E0184] VARIATION SELECTOR-149
+E0185 ; [.0000.0000.0000.0000] # [E0185] VARIATION SELECTOR-150
+E0186 ; [.0000.0000.0000.0000] # [E0186] VARIATION SELECTOR-151
+E0187 ; [.0000.0000.0000.0000] # [E0187] VARIATION SELECTOR-152
+E0188 ; [.0000.0000.0000.0000] # [E0188] VARIATION SELECTOR-153
+E0189 ; [.0000.0000.0000.0000] # [E0189] VARIATION SELECTOR-154
+E018A ; [.0000.0000.0000.0000] # [E018A] VARIATION SELECTOR-155
+E018B ; [.0000.0000.0000.0000] # [E018B] VARIATION SELECTOR-156
+E018C ; [.0000.0000.0000.0000] # [E018C] VARIATION SELECTOR-157
+E018D ; [.0000.0000.0000.0000] # [E018D] VARIATION SELECTOR-158
+E018E ; [.0000.0000.0000.0000] # [E018E] VARIATION SELECTOR-159
+E018F ; [.0000.0000.0000.0000] # [E018F] VARIATION SELECTOR-160
+E0190 ; [.0000.0000.0000.0000] # [E0190] VARIATION SELECTOR-161
+E0191 ; [.0000.0000.0000.0000] # [E0191] VARIATION SELECTOR-162
+E0192 ; [.0000.0000.0000.0000] # [E0192] VARIATION SELECTOR-163
+E0193 ; [.0000.0000.0000.0000] # [E0193] VARIATION SELECTOR-164
+E0194 ; [.0000.0000.0000.0000] # [E0194] VARIATION SELECTOR-165
+E0195 ; [.0000.0000.0000.0000] # [E0195] VARIATION SELECTOR-166
+E0196 ; [.0000.0000.0000.0000] # [E0196] VARIATION SELECTOR-167
+E0197 ; [.0000.0000.0000.0000] # [E0197] VARIATION SELECTOR-168
+E0198 ; [.0000.0000.0000.0000] # [E0198] VARIATION SELECTOR-169
+E0199 ; [.0000.0000.0000.0000] # [E0199] VARIATION SELECTOR-170
+E019A ; [.0000.0000.0000.0000] # [E019A] VARIATION SELECTOR-171
+E019B ; [.0000.0000.0000.0000] # [E019B] VARIATION SELECTOR-172
+E019C ; [.0000.0000.0000.0000] # [E019C] VARIATION SELECTOR-173
+E019D ; [.0000.0000.0000.0000] # [E019D] VARIATION SELECTOR-174
+E019E ; [.0000.0000.0000.0000] # [E019E] VARIATION SELECTOR-175
+E019F ; [.0000.0000.0000.0000] # [E019F] VARIATION SELECTOR-176
+E01A0 ; [.0000.0000.0000.0000] # [E01A0] VARIATION SELECTOR-177
+E01A1 ; [.0000.0000.0000.0000] # [E01A1] VARIATION SELECTOR-178
+E01A2 ; [.0000.0000.0000.0000] # [E01A2] VARIATION SELECTOR-179
+E01A3 ; [.0000.0000.0000.0000] # [E01A3] VARIATION SELECTOR-180
+E01A4 ; [.0000.0000.0000.0000] # [E01A4] VARIATION SELECTOR-181
+E01A5 ; [.0000.0000.0000.0000] # [E01A5] VARIATION SELECTOR-182
+E01A6 ; [.0000.0000.0000.0000] # [E01A6] VARIATION SELECTOR-183
+E01A7 ; [.0000.0000.0000.0000] # [E01A7] VARIATION SELECTOR-184
+E01A8 ; [.0000.0000.0000.0000] # [E01A8] VARIATION SELECTOR-185
+E01A9 ; [.0000.0000.0000.0000] # [E01A9] VARIATION SELECTOR-186
+E01AA ; [.0000.0000.0000.0000] # [E01AA] VARIATION SELECTOR-187
+E01AB ; [.0000.0000.0000.0000] # [E01AB] VARIATION SELECTOR-188
+E01AC ; [.0000.0000.0000.0000] # [E01AC] VARIATION SELECTOR-189
+E01AD ; [.0000.0000.0000.0000] # [E01AD] VARIATION SELECTOR-190
+E01AE ; [.0000.0000.0000.0000] # [E01AE] VARIATION SELECTOR-191
+E01AF ; [.0000.0000.0000.0000] # [E01AF] VARIATION SELECTOR-192
+E01B0 ; [.0000.0000.0000.0000] # [E01B0] VARIATION SELECTOR-193
+E01B1 ; [.0000.0000.0000.0000] # [E01B1] VARIATION SELECTOR-194
+E01B2 ; [.0000.0000.0000.0000] # [E01B2] VARIATION SELECTOR-195
+E01B3 ; [.0000.0000.0000.0000] # [E01B3] VARIATION SELECTOR-196
+E01B4 ; [.0000.0000.0000.0000] # [E01B4] VARIATION SELECTOR-197
+E01B5 ; [.0000.0000.0000.0000] # [E01B5] VARIATION SELECTOR-198
+E01B6 ; [.0000.0000.0000.0000] # [E01B6] VARIATION SELECTOR-199
+E01B7 ; [.0000.0000.0000.0000] # [E01B7] VARIATION SELECTOR-200
+E01B8 ; [.0000.0000.0000.0000] # [E01B8] VARIATION SELECTOR-201
+E01B9 ; [.0000.0000.0000.0000] # [E01B9] VARIATION SELECTOR-202
+E01BA ; [.0000.0000.0000.0000] # [E01BA] VARIATION SELECTOR-203
+E01BB ; [.0000.0000.0000.0000] # [E01BB] VARIATION SELECTOR-204
+E01BC ; [.0000.0000.0000.0000] # [E01BC] VARIATION SELECTOR-205
+E01BD ; [.0000.0000.0000.0000] # [E01BD] VARIATION SELECTOR-206
+E01BE ; [.0000.0000.0000.0000] # [E01BE] VARIATION SELECTOR-207
+E01BF ; [.0000.0000.0000.0000] # [E01BF] VARIATION SELECTOR-208
+E01C0 ; [.0000.0000.0000.0000] # [E01C0] VARIATION SELECTOR-209
+E01C1 ; [.0000.0000.0000.0000] # [E01C1] VARIATION SELECTOR-210
+E01C2 ; [.0000.0000.0000.0000] # [E01C2] VARIATION SELECTOR-211
+E01C3 ; [.0000.0000.0000.0000] # [E01C3] VARIATION SELECTOR-212
+E01C4 ; [.0000.0000.0000.0000] # [E01C4] VARIATION SELECTOR-213
+E01C5 ; [.0000.0000.0000.0000] # [E01C5] VARIATION SELECTOR-214
+E01C6 ; [.0000.0000.0000.0000] # [E01C6] VARIATION SELECTOR-215
+E01C7 ; [.0000.0000.0000.0000] # [E01C7] VARIATION SELECTOR-216
+E01C8 ; [.0000.0000.0000.0000] # [E01C8] VARIATION SELECTOR-217
+E01C9 ; [.0000.0000.0000.0000] # [E01C9] VARIATION SELECTOR-218
+E01CA ; [.0000.0000.0000.0000] # [E01CA] VARIATION SELECTOR-219
+E01CB ; [.0000.0000.0000.0000] # [E01CB] VARIATION SELECTOR-220
+E01CC ; [.0000.0000.0000.0000] # [E01CC] VARIATION SELECTOR-221
+E01CD ; [.0000.0000.0000.0000] # [E01CD] VARIATION SELECTOR-222
+E01CE ; [.0000.0000.0000.0000] # [E01CE] VARIATION SELECTOR-223
+E01CF ; [.0000.0000.0000.0000] # [E01CF] VARIATION SELECTOR-224
+E01D0 ; [.0000.0000.0000.0000] # [E01D0] VARIATION SELECTOR-225
+E01D1 ; [.0000.0000.0000.0000] # [E01D1] VARIATION SELECTOR-226
+E01D2 ; [.0000.0000.0000.0000] # [E01D2] VARIATION SELECTOR-227
+E01D3 ; [.0000.0000.0000.0000] # [E01D3] VARIATION SELECTOR-228
+E01D4 ; [.0000.0000.0000.0000] # [E01D4] VARIATION SELECTOR-229
+E01D5 ; [.0000.0000.0000.0000] # [E01D5] VARIATION SELECTOR-230
+E01D6 ; [.0000.0000.0000.0000] # [E01D6] VARIATION SELECTOR-231
+E01D7 ; [.0000.0000.0000.0000] # [E01D7] VARIATION SELECTOR-232
+E01D8 ; [.0000.0000.0000.0000] # [E01D8] VARIATION SELECTOR-233
+E01D9 ; [.0000.0000.0000.0000] # [E01D9] VARIATION SELECTOR-234
+E01DA ; [.0000.0000.0000.0000] # [E01DA] VARIATION SELECTOR-235
+E01DB ; [.0000.0000.0000.0000] # [E01DB] VARIATION SELECTOR-236
+E01DC ; [.0000.0000.0000.0000] # [E01DC] VARIATION SELECTOR-237
+E01DD ; [.0000.0000.0000.0000] # [E01DD] VARIATION SELECTOR-238
+E01DE ; [.0000.0000.0000.0000] # [E01DE] VARIATION SELECTOR-239
+E01DF ; [.0000.0000.0000.0000] # [E01DF] VARIATION SELECTOR-240
+E01E0 ; [.0000.0000.0000.0000] # [E01E0] VARIATION SELECTOR-241
+E01E1 ; [.0000.0000.0000.0000] # [E01E1] VARIATION SELECTOR-242
+E01E2 ; [.0000.0000.0000.0000] # [E01E2] VARIATION SELECTOR-243
+E01E3 ; [.0000.0000.0000.0000] # [E01E3] VARIATION SELECTOR-244
+E01E4 ; [.0000.0000.0000.0000] # [E01E4] VARIATION SELECTOR-245
+E01E5 ; [.0000.0000.0000.0000] # [E01E5] VARIATION SELECTOR-246
+E01E6 ; [.0000.0000.0000.0000] # [E01E6] VARIATION SELECTOR-247
+E01E7 ; [.0000.0000.0000.0000] # [E01E7] VARIATION SELECTOR-248
+E01E8 ; [.0000.0000.0000.0000] # [E01E8] VARIATION SELECTOR-249
+E01E9 ; [.0000.0000.0000.0000] # [E01E9] VARIATION SELECTOR-250
+E01EA ; [.0000.0000.0000.0000] # [E01EA] VARIATION SELECTOR-251
+E01EB ; [.0000.0000.0000.0000] # [E01EB] VARIATION SELECTOR-252
+E01EC ; [.0000.0000.0000.0000] # [E01EC] VARIATION SELECTOR-253
+E01ED ; [.0000.0000.0000.0000] # [E01ED] VARIATION SELECTOR-254
+E01EE ; [.0000.0000.0000.0000] # [E01EE] VARIATION SELECTOR-255
+E01EF ; [.0000.0000.0000.0000] # [E01EF] VARIATION SELECTOR-256
+0009 ; [*0201.0020.0002.0009] # HORIZONTAL TABULATION (in 6429)
+000A ; [*0202.0020.0002.000A] # LINE FEED (in 6429)
+000B ; [*0203.0020.0002.000B] # VERTICAL TABULATION (in 6429)
+000C ; [*0204.0020.0002.000C] # FORM FEED (in 6429)
+000D ; [*0205.0020.0002.000D] # CARRIAGE RETURN (in 6429)
+0020 ; [*020A.0020.0002.0020] # SPACE
+0021 ; [*026E.0020.0002.0021] # EXCLAMATION MARK
+0022 ; [*02F5.0020.0002.0022] # QUOTATION MARK
+0023 ; [*0362.0020.0002.0023] # NUMBER SIGN
+0025 ; [*0363.0020.0002.0025] # PERCENT SIGN
+0026 ; [*035F.0020.0002.0026] # AMPERSAND
+0027 ; [*02EE.0020.0002.0027] # APOSTROPHE
+0028 ; [*02FF.0020.0002.0028] # LEFT PARENTHESIS
+0029 ; [*0300.0020.0002.0029] # RIGHT PARENTHESIS
+002A ; [*0357.0020.0002.002A] # ASTERISK
+002B ; [*0550.0020.0002.002B] # PLUS SIGN
+002C ; [*0234.0020.0002.002C] # COMMA
+002D ; [*0223.0020.0002.002D] # HYPHEN-MINUS
+002E ; [*0281.0020.0002.002E] # FULL STOP
+002F ; [*035C.0020.0002.002F] # SOLIDUS
+003A ; [*0247.0020.0002.003A] # COLON
+003B ; [*0243.0020.0002.003B] # SEMICOLON
+003C ; [*0554.0020.0002.003C] # LESS-THAN SIGN
+003D ; [*0555.0020.0002.003D] # EQUALS SIGN
+003E ; [*0556.0020.0002.003E] # GREATER-THAN SIGN
+003F ; [*0273.0020.0002.003F] # QUESTION MARK
+0040 ; [*0356.0020.0002.0040] # COMMERCIAL AT
+005B ; [*0301.0020.0002.005B] # LEFT SQUARE BRACKET
+005C ; [*035E.0020.0002.005C] # REVERSE SOLIDUS
+005D ; [*0302.0020.0002.005D] # RIGHT SQUARE BRACKET
+005E ; [*0211.0020.0002.005E] # CIRCUMFLEX ACCENT
+005F ; [*021D.0020.0002.005F] # LOW LINE
+0060 ; [*020E.0020.0002.0060] # GRAVE ACCENT
+007B ; [*0303.0020.0002.007B] # LEFT CURLY BRACKET
+007C ; [*0558.0020.0002.007C] # VERTICAL LINE
+007D ; [*0304.0020.0002.007D] # RIGHT CURLY BRACKET
+007E ; [*055B.0020.0002.007E] # TILDE
+0085 ; [*0206.0020.0002.0085] # NEXT LINE (in 6429)
+00A0 ; [*020A.0020.001B.00A0] # NO-BREAK SPACE; QQK
+00A1 ; [*026F.0020.0002.00A1] # INVERTED EXCLAMATION MARK
+00A6 ; [*0559.0020.0002.00A6] # BROKEN BAR
+00A7 ; [*0351.0020.0002.00A7] # SECTION SIGN
+00A8 ; [*0216.0020.0002.00A8] # DIAERESIS
+00A9 ; [*0354.0020.0002.00A9] # COPYRIGHT SIGN
+00AB ; [*02FD.0020.0002.00AB] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; [*0557.0020.0002.00AC] # NOT SIGN
+00AD ; [*0222.0020.0002.00AD] # SOFT HYPHEN
+00AE ; [*0355.0020.0002.00AE] # REGISTERED SIGN
+00AF ; [*0212.0020.0002.00AF] # MACRON
+00B0 ; [*044B.0020.0002.00B0] # DEGREE SIGN
+00B1 ; [*0551.0020.0002.00B1] # PLUS-MINUS SIGN
+00B4 ; [*020F.0020.0002.00B4] # ACUTE ACCENT
+00B6 ; [*0352.0020.0002.00B6] # PILCROW SIGN
+00B7 ; [*0292.0020.0002.00B7] # MIDDLE DOT
+00B8 ; [*021B.0020.0002.00B8] # CEDILLA
+00BB ; [*02FE.0020.0002.00BB] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF ; [*0274.0020.0002.00BF] # INVERTED QUESTION MARK
+00D7 ; [*0553.0020.0002.00D7] # MULTIPLICATION SIGN
+00F7 ; [*0552.0020.0002.00F7] # DIVISION SIGN
+02B9 ; [*03E9.0020.0002.02B9] # MODIFIER LETTER PRIME
+02BA ; [*03EB.0020.0002.02BA] # MODIFIER LETTER DOUBLE PRIME
+02C2 ; [*03EC.0020.0002.02C2] # MODIFIER LETTER LEFT ARROWHEAD
+02C3 ; [*03ED.0020.0002.02C3] # MODIFIER LETTER RIGHT ARROWHEAD
+02C4 ; [*03EE.0020.0002.02C4] # MODIFIER LETTER UP ARROWHEAD
+02C5 ; [*03EF.0020.0002.02C5] # MODIFIER LETTER DOWN ARROWHEAD
+02C6 ; [*03F0.0020.0002.02C6] # MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7 ; [*03F1.0020.0002.02C7] # CARON
+02C8 ; [*03F2.0020.0002.02C8] # MODIFIER LETTER VERTICAL LINE
+02C9 ; [*03F3.0020.0002.02C9] # MODIFIER LETTER MACRON
+02CA ; [*03F4.0020.0002.02CA] # MODIFIER LETTER ACUTE ACCENT
+02CB ; [*03F5.0020.0002.02CB] # MODIFIER LETTER GRAVE ACCENT
+02CC ; [*03F6.0020.0002.02CC] # MODIFIER LETTER LOW VERTICAL LINE
+02CD ; [*03F7.0020.0002.02CD] # MODIFIER LETTER LOW MACRON
+02CE ; [*03F8.0020.0002.02CE] # MODIFIER LETTER LOW GRAVE ACCENT
+02CF ; [*03F9.0020.0002.02CF] # MODIFIER LETTER LOW ACUTE ACCENT
+02D2 ; [*03FA.0020.0002.02D2] # MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3 ; [*03FB.0020.0002.02D3] # MODIFIER LETTER CENTRED LEFT HALF RING
+02D4 ; [*03FC.0020.0002.02D4] # MODIFIER LETTER UP TACK
+02D5 ; [*03FD.0020.0002.02D5] # MODIFIER LETTER DOWN TACK
+02D6 ; [*03FE.0020.0002.02D6] # MODIFIER LETTER PLUS SIGN
+02D7 ; [*03FF.0020.0002.02D7] # MODIFIER LETTER MINUS SIGN
+02D8 ; [*0214.0020.0002.02D8] # BREVE
+02D9 ; [*0215.0020.0002.02D9] # DOT ABOVE
+02DA ; [*0217.0020.0002.02DA] # RING ABOVE
+02DB ; [*021C.0020.0002.02DB] # OGONEK
+02DC ; [*0210.0020.0002.02DC] # SMALL TILDE
+02DD ; [*0218.0020.0002.02DD] # DOUBLE ACUTE ACCENT
+02DE ; [*0400.0020.0002.02DE] # MODIFIER LETTER RHOTIC HOOK
+02DF ; [*0401.0020.0002.02DF] # MODIFIER LETTER CROSS ACCENT
+02E5 ; [*0402.0020.0002.02E5] # MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6 ; [*0403.0020.0002.02E6] # MODIFIER LETTER HIGH TONE BAR
+02E7 ; [*0404.0020.0002.02E7] # MODIFIER LETTER MID TONE BAR
+02E8 ; [*0405.0020.0002.02E8] # MODIFIER LETTER LOW TONE BAR
+02E9 ; [*0406.0020.0002.02E9] # MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA ; [*0407.0020.0002.02EA] # MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB ; [*0408.0020.0002.02EB] # MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC ; [*0409.0020.0002.02EC] # MODIFIER LETTER VOICING
+02ED ; [*040A.0020.0002.02ED] # MODIFIER LETTER UNASPIRATED
+02EF ; [*040B.0020.0002.02EF] # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0 ; [*040C.0020.0002.02F0] # MODIFIER LETTER LOW UP ARROWHEAD
+02F1 ; [*040D.0020.0002.02F1] # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2 ; [*040E.0020.0002.02F2] # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3 ; [*040F.0020.0002.02F3] # MODIFIER LETTER LOW RING
+02F4 ; [*0410.0020.0002.02F4] # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5 ; [*0411.0020.0002.02F5] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6 ; [*0412.0020.0002.02F6] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7 ; [*0413.0020.0002.02F7] # MODIFIER LETTER LOW TILDE
+02F8 ; [*0414.0020.0002.02F8] # MODIFIER LETTER RAISED COLON
+02F9 ; [*0415.0020.0002.02F9] # MODIFIER LETTER BEGIN HIGH TONE
+02FA ; [*0416.0020.0002.02FA] # MODIFIER LETTER END HIGH TONE
+02FB ; [*0417.0020.0002.02FB] # MODIFIER LETTER BEGIN LOW TONE
+02FC ; [*0418.0020.0002.02FC] # MODIFIER LETTER END LOW TONE
+02FD ; [*0419.0020.0002.02FD] # MODIFIER LETTER SHELF
+02FE ; [*041A.0020.0002.02FE] # MODIFIER LETTER OPEN SHELF
+02FF ; [*041B.0020.0002.02FF] # MODIFIER LETTER LOW LEFT ARROW
+034F ; [.0000.0000.0000.034F] # COMBINING GRAPHEME JOINER
+0374 ; [*03E9.0020.0002.0374] # GREEK NUMERAL SIGN; QQC
+0375 ; [*03EA.0020.0002.0375] # GREEK LOWER NUMERAL SIGN
+037E ; [*0243.0020.0002.037E] # GREEK QUESTION MARK; QQC
+0384 ; [*020F.0020.0002.0384] # GREEK TONOS; QQC
+0385 ; [*0216.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA TONOS; QQCM
+0387 ; [*0292.0020.0002.0387] # GREEK ANO TELEIA; QQC
+03F6 ; [*054B.0020.0002.03F6] # GREEK REVERSED LUNATE EPSILON SYMBOL
+0482 ; [*044C.0020.0002.0482] # CYRILLIC THOUSANDS SIGN
+0488 ; [.0000.0000.0000.0488] # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489 ; [.0000.0000.0000.0489] # COMBINING CYRILLIC MILLIONS SIGN
+055A ; [*0392.0020.0002.055A] # ARMENIAN APOSTROPHE
+055B ; [*0393.0020.0002.055B] # ARMENIAN EMPHASIS MARK
+055C ; [*0270.0020.0002.055C] # ARMENIAN EXCLAMATION MARK
+055D ; [*0235.0020.0002.055D] # ARMENIAN COMMA
+055E ; [*0276.0020.0002.055E] # ARMENIAN QUESTION MARK
+055F ; [*0394.0020.0002.055F] # ARMENIAN ABBREVIATION MARK
+0589 ; [*0248.0020.0002.0589] # ARMENIAN FULL STOP
+058A ; [*0224.0020.0002.058A] # ARMENIAN HYPHEN
+0591 ; [.0000.0000.0000.0591] # HEBREW ACCENT ETNAHTA
+0592 ; [.0000.0000.0000.0592] # HEBREW ACCENT SEGOL
+0593 ; [.0000.0000.0000.0593] # HEBREW ACCENT SHALSHELET
+0594 ; [.0000.0000.0000.0594] # HEBREW ACCENT ZAQEF QATAN
+0595 ; [.0000.0000.0000.0595] # HEBREW ACCENT ZAQEF GADOL
+0596 ; [.0000.0000.0000.0596] # HEBREW ACCENT TIPEHA
+0597 ; [.0000.0000.0000.0597] # HEBREW ACCENT REVIA
+0598 ; [.0000.0000.0000.0598] # HEBREW ACCENT ZARQA
+0599 ; [.0000.0000.0000.0599] # HEBREW ACCENT PASHTA
+059A ; [.0000.0000.0000.059A] # HEBREW ACCENT YETIV
+059B ; [.0000.0000.0000.059B] # HEBREW ACCENT TEVIR
+059C ; [.0000.0000.0000.059C] # HEBREW ACCENT GERESH
+059D ; [.0000.0000.0000.059D] # HEBREW ACCENT GERESH MUQDAM
+059E ; [.0000.0000.0000.059E] # HEBREW ACCENT GERSHAYIM
+059F ; [.0000.0000.0000.059F] # HEBREW ACCENT QARNEY PARA
+05A0 ; [.0000.0000.0000.05A0] # HEBREW ACCENT TELISHA GEDOLA
+05A1 ; [.0000.0000.0000.05A1] # HEBREW ACCENT PAZER
+05A2 ; [.0000.0000.0000.05A2] # HEBREW ACCENT ATNAH HAFUKH
+05A3 ; [.0000.0000.0000.05A3] # HEBREW ACCENT MUNAH
+05A4 ; [.0000.0000.0000.05A4] # HEBREW ACCENT MAHAPAKH
+05A5 ; [.0000.0000.0000.05A5] # HEBREW ACCENT MERKHA
+05A6 ; [.0000.0000.0000.05A6] # HEBREW ACCENT MERKHA KEFULA
+05A7 ; [.0000.0000.0000.05A7] # HEBREW ACCENT DARGA
+05A8 ; [.0000.0000.0000.05A8] # HEBREW ACCENT QADMA
+05A9 ; [.0000.0000.0000.05A9] # HEBREW ACCENT TELISHA QETANA
+05AA ; [.0000.0000.0000.05AA] # HEBREW ACCENT YERAH BEN YOMO
+05AB ; [.0000.0000.0000.05AB] # HEBREW ACCENT OLE
+05AC ; [.0000.0000.0000.05AC] # HEBREW ACCENT ILUY
+05AD ; [.0000.0000.0000.05AD] # HEBREW ACCENT DEHI
+05AE ; [.0000.0000.0000.05AE] # HEBREW ACCENT ZINOR
+05AF ; [.0000.0000.0000.05AF] # HEBREW MARK MASORA CIRCLE
+05BD ; [.0000.0000.0000.05BD] # HEBREW POINT METEG
+05BE ; [*0395.0020.0002.05BE] # HEBREW PUNCTUATION MAQAF
+05C0 ; [*0396.0020.0002.05C0] # HEBREW PUNCTUATION PASEQ
+05C3 ; [*0397.0020.0002.05C3] # HEBREW PUNCTUATION SOF PASUQ
+05C4 ; [.0000.0000.0000.05C4] # HEBREW MARK UPPER DOT
+05C5 ; [.0000.0000.0000.05C5] # HEBREW MARK LOWER DOT
+05C6 ; [*0398.0020.0002.05C6] # HEBREW PUNCTUATION NUN HAFUKHA
+05F3 ; [*0399.0020.0002.05F3] # HEBREW PUNCTUATION GERESH
+05F4 ; [*039A.0020.0002.05F4] # HEBREW PUNCTUATION GERSHAYIM
+0600 ; [.0000.0000.0000.0600] # ARABIC NUMBER SIGN
+0601 ; [.0000.0000.0000.0601] # ARABIC SIGN SANAH
+0602 ; [.0000.0000.0000.0602] # ARABIC FOOTNOTE MARKER
+0603 ; [.0000.0000.0000.0603] # ARABIC SIGN SAFHA
+0606 ; [*0566.0020.0002.0606] # ARABIC-INDIC CUBE ROOT
+0607 ; [*0568.0020.0002.0607] # ARABIC-INDIC FOURTH ROOT
+0608 ; [*044D.0020.0002.0608] # ARABIC RAY
+0609 ; [*0366.0020.0002.0609] # ARABIC-INDIC PER MILLE SIGN
+060A ; [*0368.0020.0002.060A] # ARABIC-INDIC PER TEN THOUSAND SIGN
+060C ; [*0236.0020.0002.060C] # ARABIC COMMA
+060D ; [*0237.0020.0002.060D] # ARABIC DATE SEPARATOR
+060E ; [*044E.0020.0002.060E] # ARABIC POETIC VERSE SIGN
+060F ; [*044F.0020.0002.060F] # ARABIC SIGN MISRA
+0610 ; [.0000.0000.0000.0610] # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611 ; [.0000.0000.0000.0611] # ARABIC SIGN ALAYHE ASSALLAM
+0612 ; [.0000.0000.0000.0612] # ARABIC SIGN RAHMATULLAH ALAYHE
+0613 ; [.0000.0000.0000.0613] # ARABIC SIGN RADI ALLAHOU ANHU
+0614 ; [.0000.0000.0000.0614] # ARABIC SIGN TAKHALLUS
+0615 ; [.0000.0000.0000.0615] # ARABIC SMALL HIGH TAH
+0616 ; [.0000.0000.0000.0616] # ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH
+0617 ; [.0000.0000.0000.0617] # ARABIC SMALL HIGH ZAIN
+0618 ; [.0000.0000.0000.0618] # ARABIC SMALL FATHA
+0619 ; [.0000.0000.0000.0619] # ARABIC SMALL DAMMA
+061A ; [.0000.0000.0000.061A] # ARABIC SMALL KASRA
+061B ; [*0244.0020.0002.061B] # ARABIC SEMICOLON
+061E ; [*0249.0020.0002.061E] # ARABIC TRIPLE DOT PUNCTUATION MARK
+061F ; [*0277.0020.0002.061F] # ARABIC QUESTION MARK
+0640 ; [*020C.0020.0002.0640] # ARABIC TATWEEL
+066A ; [*0364.0020.0002.066A] # ARABIC PERCENT SIGN
+066B ; [*0238.0020.0002.066B] # ARABIC DECIMAL SEPARATOR
+066C ; [*0239.0020.0002.066C] # ARABIC THOUSANDS SEPARATOR
+066D ; [*035A.0020.0002.066D] # ARABIC FIVE POINTED STAR
+06D4 ; [*0283.0020.0002.06D4] # ARABIC FULL STOP
+06D6 ; [.0000.0000.0000.06D6] # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7 ; [.0000.0000.0000.06D7] # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8 ; [.0000.0000.0000.06D8] # ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9 ; [.0000.0000.0000.06D9] # ARABIC SMALL HIGH LAM ALEF
+06DA ; [.0000.0000.0000.06DA] # ARABIC SMALL HIGH JEEM
+06DB ; [.0000.0000.0000.06DB] # ARABIC SMALL HIGH THREE DOTS
+06DC ; [.0000.0000.0000.06DC] # ARABIC SMALL HIGH SEEN
+06DD ; [.0000.0000.0000.06DD] # ARABIC END OF AYAH
+06DE ; [.0000.0000.0000.06DE] # ARABIC START OF RUB EL HIZB
+06DF ; [.0000.0000.0000.06DF] # ARABIC SMALL HIGH ROUNDED ZERO
+06E0 ; [.0000.0000.0000.06E0] # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1 ; [.0000.0000.0000.06E1] # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2 ; [.0000.0000.0000.06E2] # ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3 ; [.0000.0000.0000.06E3] # ARABIC SMALL LOW SEEN
+06E4 ; [.0000.0000.0000.06E4] # ARABIC SMALL HIGH MADDA
+06E7 ; [.0000.0000.0000.06E7] # ARABIC SMALL HIGH YEH
+06E8 ; [.0000.0000.0000.06E8] # ARABIC SMALL HIGH NOON
+06E9 ; [*0450.0020.0002.06E9] # ARABIC PLACE OF SAJDAH
+06EA ; [.0000.0000.0000.06EA] # ARABIC EMPTY CENTRE LOW STOP
+06EB ; [.0000.0000.0000.06EB] # ARABIC EMPTY CENTRE HIGH STOP
+06EC ; [.0000.0000.0000.06EC] # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED ; [.0000.0000.0000.06ED] # ARABIC SMALL LOW MEEM
+0700 ; [*02B5.0020.0002.0700] # SYRIAC END OF PARAGRAPH
+0701 ; [*0284.0020.0002.0701] # SYRIAC SUPRALINEAR FULL STOP
+0702 ; [*0285.0020.0002.0702] # SYRIAC SUBLINEAR FULL STOP
+0703 ; [*024A.0020.0002.0703] # SYRIAC SUPRALINEAR COLON
+0704 ; [*024B.0020.0002.0704] # SYRIAC SUBLINEAR COLON
+0705 ; [*024C.0020.0002.0705] # SYRIAC HORIZONTAL COLON
+0706 ; [*024D.0020.0002.0706] # SYRIAC COLON SKEWED LEFT
+0707 ; [*024E.0020.0002.0707] # SYRIAC COLON SKEWED RIGHT
+0708 ; [*024F.0020.0002.0708] # SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709 ; [*0278.0020.0002.0709] # SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A ; [*039B.0020.0002.070A] # SYRIAC CONTRACTION
+070B ; [*039C.0020.0002.070B] # SYRIAC HARKLEAN OBELUS
+070C ; [*039D.0020.0002.070C] # SYRIAC HARKLEAN METOBELUS
+070D ; [*039E.0020.0002.070D] # SYRIAC HARKLEAN ASTERISCUS
+0740 ; [.0000.0000.0000.0740] # SYRIAC FEMININE DOT
+0743 ; [.0000.0000.0000.0743] # SYRIAC TWO VERTICAL DOTS ABOVE
+0744 ; [.0000.0000.0000.0744] # SYRIAC TWO VERTICAL DOTS BELOW
+0747 ; [.0000.0000.0000.0747] # SYRIAC OBLIQUE LINE ABOVE
+0748 ; [.0000.0000.0000.0748] # SYRIAC OBLIQUE LINE BELOW
+0749 ; [.0000.0000.0000.0749] # SYRIAC MUSIC
+074A ; [.0000.0000.0000.074A] # SYRIAC BARREKH
+07F6 ; [*0452.0020.0002.07F6] # NKO SYMBOL OO DENNEN
+07F7 ; [*02B6.0020.0002.07F7] # NKO SYMBOL GBAKURUNEN
+07F8 ; [*023A.0020.0002.07F8] # NKO COMMA
+07F9 ; [*0271.0020.0002.07F9] # NKO EXCLAMATION MARK
+07FA ; [*020D.0020.0002.07FA] # NKO LAJANYALAN
+0830 ; [*0250.0020.0002.0830] # SAMARITAN PUNCTUATION NEQUDAA
+0831 ; [*0251.0020.0002.0831] # SAMARITAN PUNCTUATION AFSAAQ
+0832 ; [*0252.0020.0002.0832] # SAMARITAN PUNCTUATION ANGED
+0833 ; [*0253.0020.0002.0833] # SAMARITAN PUNCTUATION BAU
+0834 ; [*0254.0020.0002.0834] # SAMARITAN PUNCTUATION ATMAAU
+0835 ; [*0255.0020.0002.0835] # SAMARITAN PUNCTUATION SHIYYAALAA
+0836 ; [*0256.0020.0002.0836] # SAMARITAN ABBREVIATION MARK
+0837 ; [*0257.0020.0002.0837] # SAMARITAN PUNCTUATION MELODIC QITSA
+0838 ; [*0258.0020.0002.0838] # SAMARITAN PUNCTUATION ZIQAA
+0839 ; [*0259.0020.0002.0839] # SAMARITAN PUNCTUATION QITSA
+083A ; [*025A.0020.0002.083A] # SAMARITAN PUNCTUATION ZAEF
+083B ; [*025B.0020.0002.083B] # SAMARITAN PUNCTUATION TURU
+083C ; [*025C.0020.0002.083C] # SAMARITAN PUNCTUATION ARKAANU
+083D ; [*025D.0020.0002.083D] # SAMARITAN PUNCTUATION SOF MASHFAAT
+083E ; [*025E.0020.0002.083E] # SAMARITAN PUNCTUATION ANNAAU
+0951 ; [.0000.0000.0000.0951] # DEVANAGARI STRESS SIGN UDATTA
+0952 ; [.0000.0000.0000.0952] # DEVANAGARI STRESS SIGN ANUDATTA
+0964 ; [*0294.0020.0002.0964] # DEVANAGARI DANDA
+0965 ; [*0295.0020.0002.0965] # DEVANAGARI DOUBLE DANDA
+0970 ; [*03A1.0020.0002.0970] # DEVANAGARI ABBREVIATION SIGN
+09F4 ; [*1110.0020.0002.09F4] # BENGALI CURRENCY NUMERATOR ONE
+09F5 ; [*1111.0020.0002.09F5] # BENGALI CURRENCY NUMERATOR TWO
+09F6 ; [*1112.0020.0002.09F6] # BENGALI CURRENCY NUMERATOR THREE
+09F7 ; [*1113.0020.0002.09F7] # BENGALI CURRENCY NUMERATOR FOUR
+09F8 ; [*1114.0020.0002.09F8] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9 ; [*1115.0020.0002.09F9] # BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA ; [*0453.0020.0002.09FA] # BENGALI ISSHAR
+0B70 ; [*0454.0020.0002.0B70] # ORIYA ISSHAR
+0BF0 ; [*111C.0020.0002.0BF0] # TAMIL NUMBER TEN
+0BF1 ; [*111D.0020.0002.0BF1] # TAMIL NUMBER ONE HUNDRED
+0BF2 ; [*111E.0020.0002.0BF2] # TAMIL NUMBER ONE THOUSAND
+0BF3 ; [*0455.0020.0002.0BF3] # TAMIL DAY SIGN
+0BF4 ; [*0456.0020.0002.0BF4] # TAMIL MONTH SIGN
+0BF5 ; [*0457.0020.0002.0BF5] # TAMIL YEAR SIGN
+0BF6 ; [*0458.0020.0002.0BF6] # TAMIL DEBIT SIGN
+0BF7 ; [*0459.0020.0002.0BF7] # TAMIL CREDIT SIGN
+0BF8 ; [*045A.0020.0002.0BF8] # TAMIL AS ABOVE SIGN
+0BFA ; [*045B.0020.0002.0BFA] # TAMIL NUMBER SIGN
+0C7F ; [*045C.0020.0002.0C7F] # TELUGU SIGN TUUMU
+0CF1 ; [*045D.0020.0002.0CF1] # KANNADA SIGN JIHVAMULIYA
+0CF2 ; [*045E.0020.0002.0CF2] # KANNADA SIGN UPADHMANIYA
+0D70 ; [*111F.0020.0002.0D70] # MALAYALAM NUMBER TEN
+0D71 ; [*1120.0020.0002.0D71] # MALAYALAM NUMBER ONE HUNDRED
+0D72 ; [*1121.0020.0002.0D72] # MALAYALAM NUMBER ONE THOUSAND
+0D73 ; [*1122.0020.0002.0D73] # MALAYALAM FRACTION ONE QUARTER
+0D74 ; [*1123.0020.0002.0D74] # MALAYALAM FRACTION ONE HALF
+0D75 ; [*1124.0020.0002.0D75] # MALAYALAM FRACTION THREE QUARTERS
+0D79 ; [*045F.0020.0002.0D79] # MALAYALAM DATE MARK
+0DF4 ; [*03A5.0020.0002.0DF4] # SINHALA PUNCTUATION KUNDDALIYA
+0E4F ; [*0467.0020.0002.0E4F] # THAI CHARACTER FONGMAN
+0E5A ; [*03A6.0020.0002.0E5A] # THAI CHARACTER ANGKHANKHU
+0E5B ; [*03A7.0020.0002.0E5B] # THAI CHARACTER KHOMUT
+0F01 ; [*0468.0020.0002.0F01] # TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02 ; [*0469.0020.0002.0F02] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03 ; [*046A.0020.0002.0F03] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04 ; [*03AA.0020.0002.0F04] # TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05 ; [*03AB.0020.0002.0F05] # TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06 ; [*03AC.0020.0002.0F06] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07 ; [*03AD.0020.0002.0F07] # TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08 ; [*03AE.0020.0002.0F08] # TIBETAN MARK SBRUL SHAD
+0F09 ; [*03AF.0020.0002.0F09] # TIBETAN MARK BSKUR YIG MGO
+0F0A ; [*03B0.0020.0002.0F0A] # TIBETAN MARK BKA- SHOG YIG MGO
+0F0B ; [*03B3.0020.0002.0F0B] # TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C ; [*03B3.0020.001B.0F0C] # TIBETAN MARK DELIMITER TSHEG BSTAR; QQK
+0F0D ; [*03B4.0020.0002.0F0D] # TIBETAN MARK SHAD
+0F0E ; [*03B5.0020.0002.0F0E] # TIBETAN MARK NYIS SHAD
+0F0F ; [*03B6.0020.0002.0F0F] # TIBETAN MARK TSHEG SHAD
+0F10 ; [*03B7.0020.0002.0F10] # TIBETAN MARK NYIS TSHEG SHAD
+0F11 ; [*03B8.0020.0002.0F11] # TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12 ; [*03B9.0020.0002.0F12] # TIBETAN MARK RGYA GRAM SHAD
+0F13 ; [*046B.0020.0002.0F13] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14 ; [*0266.0020.0002.0F14] # TIBETAN MARK GTER TSHEG
+0F15 ; [*046C.0020.0002.0F15] # TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16 ; [*046D.0020.0002.0F16] # TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17 ; [*046E.0020.0002.0F17] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18 ; [.0000.0000.0000.0F18] # TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19 ; [.0000.0000.0000.0F19] # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A ; [*046F.0020.0002.0F1A] # TIBETAN SIGN RDEL DKAR GCIG
+0F1B ; [*0470.0020.0002.0F1B] # TIBETAN SIGN RDEL DKAR GNYIS
+0F1C ; [*0471.0020.0002.0F1C] # TIBETAN SIGN RDEL DKAR GSUM
+0F1D ; [*0472.0020.0002.0F1D] # TIBETAN SIGN RDEL NAG GCIG
+0F1E ; [*0473.0020.0002.0F1E] # TIBETAN SIGN RDEL NAG GNYIS
+0F1F ; [*0474.0020.0002.0F1F] # TIBETAN SIGN RDEL DKAR RDEL NAG
+0F34 ; [*0475.0020.0002.0F34] # TIBETAN MARK BSDUS RTAGS
+0F35 ; [.0000.0000.0000.0F35] # TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36 ; [*0476.0020.0002.0F36] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37 ; [.0000.0000.0000.0F37] # TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38 ; [*0477.0020.0002.0F38] # TIBETAN MARK CHE MGO
+0F3A ; [*0305.0020.0002.0F3A] # TIBETAN MARK GUG RTAGS GYON
+0F3B ; [*0306.0020.0002.0F3B] # TIBETAN MARK GUG RTAGS GYAS
+0F3C ; [*0307.0020.0002.0F3C] # TIBETAN MARK ANG KHANG GYON
+0F3D ; [*0308.0020.0002.0F3D] # TIBETAN MARK ANG KHANG GYAS
+0F3E ; [*0478.0020.0002.0F3E] # TIBETAN SIGN YAR TSHES
+0F3F ; [*0479.0020.0002.0F3F] # TIBETAN SIGN MAR TSHES
+0F82 ; [.0000.0000.0000.0F82] # TIBETAN SIGN NYI ZLA NAA DA
+0F83 ; [.0000.0000.0000.0F83] # TIBETAN SIGN SNA LDAN
+0F85 ; [*03BA.0020.0002.0F85] # TIBETAN MARK PALUTA
+0F86 ; [.0000.0000.0000.0F86] # TIBETAN SIGN LCI RTAGS
+0F87 ; [.0000.0000.0000.0F87] # TIBETAN SIGN YANG RTAGS
+0FBE ; [*047A.0020.0002.0FBE] # TIBETAN KU RU KHA
+0FBF ; [*047B.0020.0002.0FBF] # TIBETAN KU RU KHA BZHI MIG CAN
+0FC0 ; [*047C.0020.0002.0FC0] # TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1 ; [*047D.0020.0002.0FC1] # TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2 ; [*047E.0020.0002.0FC2] # TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3 ; [*047F.0020.0002.0FC3] # TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4 ; [*0480.0020.0002.0FC4] # TIBETAN SYMBOL DRIL BU
+0FC5 ; [*0481.0020.0002.0FC5] # TIBETAN SYMBOL RDO RJE
+0FC6 ; [.0000.0000.0000.0FC6] # TIBETAN SYMBOL PADMA GDAN
+0FC7 ; [*0482.0020.0002.0FC7] # TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8 ; [*0483.0020.0002.0FC8] # TIBETAN SYMBOL PHUR PA
+0FC9 ; [*0484.0020.0002.0FC9] # TIBETAN SYMBOL NOR BU
+0FCA ; [*0485.0020.0002.0FCA] # TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB ; [*0486.0020.0002.0FCB] # TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC ; [*0487.0020.0002.0FCC] # TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE ; [*0488.0020.0002.0FCE] # TIBETAN SIGN RDEL NAG RDEL DKAR
+0FCF ; [*0489.0020.0002.0FCF] # TIBETAN SIGN RDEL NAG GSUM
+0FD0 ; [*03B1.0020.0002.0FD0] # TIBETAN MARK BSKA- SHOG GI MGO RGYAN
+0FD1 ; [*03B2.0020.0002.0FD1] # TIBETAN MARK MNYAM YIG GI MGO RGYAN
+0FD2 ; [*03BB.0020.0002.0FD2] # TIBETAN MARK NYIS TSHEG
+0FD3 ; [*03BC.0020.0002.0FD3] # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA
+0FD4 ; [*03BD.0020.0002.0FD4] # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+0FD5 ; [*048A.0020.0002.0FD5] # RIGHT-FACING SVASTI SIGN
+0FD6 ; [*048B.0020.0002.0FD6] # LEFT-FACING SVASTI SIGN
+0FD7 ; [*048C.0020.0002.0FD7] # RIGHT-FACING SVASTI SIGN WITH DOTS
+0FD8 ; [*048D.0020.0002.0FD8] # LEFT-FACING SVASTI SIGN WITH DOTS
+104A ; [*029F.0020.0002.104A] # MYANMAR SIGN LITTLE SECTION
+104B ; [*02A0.0020.0002.104B] # MYANMAR SIGN SECTION
+104C ; [*03C2.0020.0002.104C] # MYANMAR SYMBOL LOCATIVE
+104D ; [*03C3.0020.0002.104D] # MYANMAR SYMBOL COMPLETED
+104E ; [*03C4.0020.0002.104E] # MYANMAR SYMBOL AFOREMENTIONED
+104F ; [*03C5.0020.0002.104F] # MYANMAR SYMBOL GENITIVE
+109E ; [*03C6.0020.0002.109E] # MYANMAR SYMBOL SHAN ONE
+109F ; [*03C7.0020.0002.109F] # MYANMAR SYMBOL SHAN EXCLAMATION
+10FB ; [*02B7.0020.0002.10FB] # GEORGIAN PARAGRAPH SEPARATOR
+1360 ; [*02B8.0020.0002.1360] # ETHIOPIC SECTION MARK
+1361 ; [*025F.0020.0002.1361] # ETHIOPIC WORDSPACE
+1362 ; [*0286.0020.0002.1362] # ETHIOPIC FULL STOP
+1363 ; [*0260.0020.0002.1363] # ETHIOPIC COMMA
+1364 ; [*0261.0020.0002.1364] # ETHIOPIC SEMICOLON
+1365 ; [*0262.0020.0002.1365] # ETHIOPIC COLON
+1366 ; [*0263.0020.0002.1366] # ETHIOPIC PREFACE COLON
+1367 ; [*0279.0020.0002.1367] # ETHIOPIC QUESTION MARK
+1368 ; [*02B9.0020.0002.1368] # ETHIOPIC PARAGRAPH SEPARATOR
+1372 ; [*1125.0020.0002.1372] # ETHIOPIC NUMBER TEN
+1373 ; [*1126.0020.0002.1373] # ETHIOPIC NUMBER TWENTY
+1374 ; [*1127.0020.0002.1374] # ETHIOPIC NUMBER THIRTY
+1375 ; [*1128.0020.0002.1375] # ETHIOPIC NUMBER FORTY
+1376 ; [*1129.0020.0002.1376] # ETHIOPIC NUMBER FIFTY
+1377 ; [*112A.0020.0002.1377] # ETHIOPIC NUMBER SIXTY
+1378 ; [*112B.0020.0002.1378] # ETHIOPIC NUMBER SEVENTY
+1379 ; [*112C.0020.0002.1379] # ETHIOPIC NUMBER EIGHTY
+137A ; [*112D.0020.0002.137A] # ETHIOPIC NUMBER NINETY
+137B ; [*112E.0020.0002.137B] # ETHIOPIC NUMBER HUNDRED
+137C ; [*112F.0020.0002.137C] # ETHIOPIC NUMBER TEN THOUSAND
+1390 ; [*041C.0020.0002.1390] # ETHIOPIC TONAL MARK YIZET
+1391 ; [*041D.0020.0002.1391] # ETHIOPIC TONAL MARK DERET
+1392 ; [*041E.0020.0002.1392] # ETHIOPIC TONAL MARK RIKRIK
+1393 ; [*041F.0020.0002.1393] # ETHIOPIC TONAL MARK SHORT RIKRIK
+1394 ; [*0420.0020.0002.1394] # ETHIOPIC TONAL MARK DIFAT
+1395 ; [*0421.0020.0002.1395] # ETHIOPIC TONAL MARK KENAT
+1396 ; [*0422.0020.0002.1396] # ETHIOPIC TONAL MARK CHIRET
+1397 ; [*0423.0020.0002.1397] # ETHIOPIC TONAL MARK HIDET
+1398 ; [*0424.0020.0002.1398] # ETHIOPIC TONAL MARK DERET-HIDET
+1399 ; [*0425.0020.0002.1399] # ETHIOPIC TONAL MARK KURT
+1400 ; [*0225.0020.0002.1400] # CANADIAN SYLLABICS HYPHEN
+166D ; [*03D8.0020.0002.166D] # CANADIAN SYLLABICS CHI SIGN
+166E ; [*0289.0020.0002.166E] # CANADIAN SYLLABICS FULL STOP
+1680 ; [*020B.0020.0002.1680] # OGHAM SPACE MARK
+169B ; [*0309.0020.0002.169B] # OGHAM FEATHER MARK
+169C ; [*030A.0020.0002.169C] # OGHAM REVERSED FEATHER MARK
+16EB ; [*026A.0020.0002.16EB] # RUNIC SINGLE PUNCTUATION
+16EC ; [*026B.0020.0002.16EC] # RUNIC MULTIPLE PUNCTUATION
+16ED ; [*026C.0020.0002.16ED] # RUNIC CROSS PUNCTUATION
+1735 ; [*029C.0020.0002.1735] # PHILIPPINE SINGLE PUNCTUATION
+1736 ; [*029D.0020.0002.1736] # PHILIPPINE DOUBLE PUNCTUATION
+17D3 ; [.0000.0000.0000.17D3] # KHMER SIGN BATHAMASAT
+17D4 ; [*02A1.0020.0002.17D4] # KHMER SIGN KHAN
+17D5 ; [*02A2.0020.0002.17D5] # KHMER SIGN BARIYOOSAN
+17D6 ; [*0267.0020.0002.17D6] # KHMER SIGN CAMNUC PII KUUH
+17D7 ; [*03CB.0020.0002.17D7] # KHMER SIGN LEK TOO
+17D8 ; [*03CC.0020.0002.17D8] # KHMER SIGN BEYYAL
+17D9 ; [*03CD.0020.0002.17D9] # KHMER SIGN PHNAEK MUAN
+17DA ; [*03CE.0020.0002.17DA] # KHMER SIGN KOOMUUT
+1800 ; [*039F.0020.0002.1800] # MONGOLIAN BIRGA
+1801 ; [*0282.0020.0002.1801] # MONGOLIAN ELLIPSIS
+1802 ; [*023B.0020.0002.1802] # MONGOLIAN COMMA
+1803 ; [*0287.0020.0002.1803] # MONGOLIAN FULL STOP
+1804 ; [*0264.0020.0002.1804] # MONGOLIAN COLON
+1805 ; [*0265.0020.0002.1805] # MONGOLIAN FOUR DOTS
+1806 ; [*0227.0020.0002.1806] # MONGOLIAN TODO SOFT HYPHEN
+1807 ; [*0228.0020.0002.1807] # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808 ; [*023C.0020.0002.1808] # MONGOLIAN MANCHU COMMA
+1809 ; [*0288.0020.0002.1809] # MONGOLIAN MANCHU FULL STOP
+180A ; [*03A0.0020.0002.180A] # MONGOLIAN NIRUGU
+180E ; [*0207.0020.0002.180E] # MONGOLIAN VOWEL SEPARATOR
+1940 ; [*03C1.0020.0002.1940] # LIMBU SIGN LOO
+1944 ; [*0272.0020.0002.1944] # LIMBU EXCLAMATION MARK
+1945 ; [*027A.0020.0002.1945] # LIMBU QUESTION MARK
+19E0 ; [*048E.0020.0002.19E0] # KHMER SYMBOL PATHAMASAT
+19E1 ; [*048F.0020.0002.19E1] # KHMER SYMBOL MUOY KOET
+19E2 ; [*0490.0020.0002.19E2] # KHMER SYMBOL PII KOET
+19E3 ; [*0491.0020.0002.19E3] # KHMER SYMBOL BEI KOET
+19E4 ; [*0492.0020.0002.19E4] # KHMER SYMBOL BUON KOET
+19E5 ; [*0493.0020.0002.19E5] # KHMER SYMBOL PRAM KOET
+19E6 ; [*0494.0020.0002.19E6] # KHMER SYMBOL PRAM-MUOY KOET
+19E7 ; [*0495.0020.0002.19E7] # KHMER SYMBOL PRAM-PII KOET
+19E8 ; [*0496.0020.0002.19E8] # KHMER SYMBOL PRAM-BEI KOET
+19E9 ; [*0497.0020.0002.19E9] # KHMER SYMBOL PRAM-BUON KOET
+19EA ; [*0498.0020.0002.19EA] # KHMER SYMBOL DAP KOET
+19EB ; [*0499.0020.0002.19EB] # KHMER SYMBOL DAP-MUOY KOET
+19EC ; [*049A.0020.0002.19EC] # KHMER SYMBOL DAP-PII KOET
+19ED ; [*049B.0020.0002.19ED] # KHMER SYMBOL DAP-BEI KOET
+19EE ; [*049C.0020.0002.19EE] # KHMER SYMBOL DAP-BUON KOET
+19EF ; [*049D.0020.0002.19EF] # KHMER SYMBOL DAP-PRAM KOET
+19F0 ; [*049E.0020.0002.19F0] # KHMER SYMBOL TUTEYASAT
+19F1 ; [*049F.0020.0002.19F1] # KHMER SYMBOL MUOY ROC
+19F2 ; [*04A0.0020.0002.19F2] # KHMER SYMBOL PII ROC
+19F3 ; [*04A1.0020.0002.19F3] # KHMER SYMBOL BEI ROC
+19F4 ; [*04A2.0020.0002.19F4] # KHMER SYMBOL BUON ROC
+19F5 ; [*04A3.0020.0002.19F5] # KHMER SYMBOL PRAM ROC
+19F6 ; [*04A4.0020.0002.19F6] # KHMER SYMBOL PRAM-MUOY ROC
+19F7 ; [*04A5.0020.0002.19F7] # KHMER SYMBOL PRAM-PII ROC
+19F8 ; [*04A6.0020.0002.19F8] # KHMER SYMBOL PRAM-BEI ROC
+19F9 ; [*04A7.0020.0002.19F9] # KHMER SYMBOL PRAM-BUON ROC
+19FA ; [*04A8.0020.0002.19FA] # KHMER SYMBOL DAP ROC
+19FB ; [*04A9.0020.0002.19FB] # KHMER SYMBOL DAP-MUOY ROC
+19FC ; [*04AA.0020.0002.19FC] # KHMER SYMBOL DAP-PII ROC
+19FD ; [*04AB.0020.0002.19FD] # KHMER SYMBOL DAP-BEI ROC
+19FE ; [*04AC.0020.0002.19FE] # KHMER SYMBOL DAP-BUON ROC
+19FF ; [*04AD.0020.0002.19FF] # KHMER SYMBOL DAP-PRAM ROC
+1A1E ; [*02BA.0020.0002.1A1E] # BUGINESE PALLAWA
+1A1F ; [*02BB.0020.0002.1A1F] # BUGINESE END OF SECTION
+1A7F ; [.0000.0000.0000.1A7F] # TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1AA0 ; [*03CF.0020.0002.1AA0] # TAI THAM SIGN WIANG
+1AA1 ; [*03D0.0020.0002.1AA1] # TAI THAM SIGN WIANGWAAK
+1AA2 ; [*03D1.0020.0002.1AA2] # TAI THAM SIGN SAWAN
+1AA3 ; [*03D2.0020.0002.1AA3] # TAI THAM SIGN KEOW
+1AA4 ; [*03D3.0020.0002.1AA4] # TAI THAM SIGN HOY
+1AA5 ; [*03D4.0020.0002.1AA5] # TAI THAM SIGN DOKMAI
+1AA6 ; [*03D5.0020.0002.1AA6] # TAI THAM SIGN REVERSED ROTATED RANA
+1AA8 ; [*02A3.0020.0002.1AA8] # TAI THAM SIGN KAAN
+1AA9 ; [*02A4.0020.0002.1AA9] # TAI THAM SIGN KAANKUU
+1AAA ; [*02A5.0020.0002.1AAA] # TAI THAM SIGN SATKAAN
+1AAB ; [*02A6.0020.0002.1AAB] # TAI THAM SIGN SATKAANKUU
+1AAC ; [*03D6.0020.0002.1AAC] # TAI THAM SIGN HANG
+1AAD ; [*03D7.0020.0002.1AAD] # TAI THAM SIGN CAANG
+1B5A ; [*02BC.0020.0002.1B5A] # BALINESE PANTI
+1B5B ; [*02BD.0020.0002.1B5B] # BALINESE PAMADA
+1B5C ; [*028A.0020.0002.1B5C] # BALINESE WINDU
+1B5D ; [*0268.0020.0002.1B5D] # BALINESE CARIK PAMUNGKAH
+1B5E ; [*02A7.0020.0002.1B5E] # BALINESE CARIK SIKI
+1B5F ; [*02A8.0020.0002.1B5F] # BALINESE CARIK PAREREN
+1B60 ; [*0226.0020.0002.1B60] # BALINESE PAMENENG
+1B61 ; [*04AE.0020.0002.1B61] # BALINESE MUSICAL SYMBOL DONG
+1B62 ; [*04AF.0020.0002.1B62] # BALINESE MUSICAL SYMBOL DENG
+1B63 ; [*04B0.0020.0002.1B63] # BALINESE MUSICAL SYMBOL DUNG
+1B64 ; [*04B1.0020.0002.1B64] # BALINESE MUSICAL SYMBOL DANG
+1B65 ; [*04B2.0020.0002.1B65] # BALINESE MUSICAL SYMBOL DANG SURANG
+1B66 ; [*04B3.0020.0002.1B66] # BALINESE MUSICAL SYMBOL DING
+1B67 ; [*04B4.0020.0002.1B67] # BALINESE MUSICAL SYMBOL DAENG
+1B68 ; [*04B5.0020.0002.1B68] # BALINESE MUSICAL SYMBOL DEUNG
+1B69 ; [*04B6.0020.0002.1B69] # BALINESE MUSICAL SYMBOL DAING
+1B6A ; [*04B7.0020.0002.1B6A] # BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B ; [.0000.0000.0000.1B6B] # BALINESE MUSICAL SYMBOL COMBINING TEGEH
+1B6C ; [.0000.0000.0000.1B6C] # BALINESE MUSICAL SYMBOL COMBINING ENDEP
+1B6D ; [.0000.0000.0000.1B6D] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL
+1B6E ; [.0000.0000.0000.1B6E] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI
+1B6F ; [.0000.0000.0000.1B6F] # BALINESE MUSICAL SYMBOL COMBINING JEGOGAN
+1B70 ; [.0000.0000.0000.1B70] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN
+1B71 ; [.0000.0000.0000.1B71] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN
+1B72 ; [.0000.0000.0000.1B72] # BALINESE MUSICAL SYMBOL COMBINING BENDE
+1B73 ; [.0000.0000.0000.1B73] # BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74 ; [*04B8.0020.0002.1B74] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
+1B75 ; [*04B9.0020.0002.1B75] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG
+1B76 ; [*04BA.0020.0002.1B76] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK
+1B77 ; [*04BB.0020.0002.1B77] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK
+1B78 ; [*04BC.0020.0002.1B78] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG
+1B79 ; [*04BD.0020.0002.1B79] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG
+1B7A ; [*04BE.0020.0002.1B7A] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK
+1B7B ; [*04BF.0020.0002.1B7B] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK
+1B7C ; [*04C0.0020.0002.1B7C] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+1C3B ; [*0298.0020.0002.1C3B] # LEPCHA PUNCTUATION TA-ROL
+1C3C ; [*0299.0020.0002.1C3C] # LEPCHA PUNCTUATION NYET THYOOM TA-ROL
+1C3D ; [*03BE.0020.0002.1C3D] # LEPCHA PUNCTUATION CER-WA
+1C3E ; [*03BF.0020.0002.1C3E] # LEPCHA PUNCTUATION TSHOOK CER-WA
+1C3F ; [*03C0.0020.0002.1C3F] # LEPCHA PUNCTUATION TSHOOK
+1C7E ; [*02B3.0020.0002.1C7E] # OL CHIKI PUNCTUATION MUCAAD
+1C7F ; [*02B4.0020.0002.1C7F] # OL CHIKI PUNCTUATION DOUBLE MUCAAD
+1CD0 ; [.0000.0000.0000.1CD0] # VEDIC TONE KARSHANA
+1CD1 ; [.0000.0000.0000.1CD1] # VEDIC TONE SHARA
+1CD2 ; [.0000.0000.0000.1CD2] # VEDIC TONE PRENKHA
+1CD3 ; [.0000.0000.0000.1CD3] # VEDIC SIGN NIHSHVASA
+1CD4 ; [.0000.0000.0000.1CD4] # VEDIC SIGN YAJURVEDIC MIDLINE SVARITA
+1CD5 ; [.0000.0000.0000.1CD5] # VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA
+1CD6 ; [.0000.0000.0000.1CD6] # VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA
+1CD7 ; [.0000.0000.0000.1CD7] # VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA
+1CD8 ; [.0000.0000.0000.1CD8] # VEDIC TONE CANDRA BELOW
+1CD9 ; [.0000.0000.0000.1CD9] # VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER
+1CDA ; [.0000.0000.0000.1CDA] # VEDIC TONE DOUBLE SVARITA
+1CDB ; [.0000.0000.0000.1CDB] # VEDIC TONE TRIPLE SVARITA
+1CDC ; [.0000.0000.0000.1CDC] # VEDIC TONE KATHAKA ANUDATTA
+1CDD ; [.0000.0000.0000.1CDD] # VEDIC TONE DOT BELOW
+1CDE ; [.0000.0000.0000.1CDE] # VEDIC TONE TWO DOTS BELOW
+1CDF ; [.0000.0000.0000.1CDF] # VEDIC TONE THREE DOTS BELOW
+1CE0 ; [.0000.0000.0000.1CE0] # VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE1 ; [.0000.0000.0000.1CE1] # VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CE2 ; [.0000.0000.0000.1CE2] # VEDIC SIGN VISARGA SVARITA
+1CE3 ; [.0000.0000.0000.1CE3] # VEDIC SIGN VISARGA UDATTA
+1CE4 ; [.0000.0000.0000.1CE4] # VEDIC SIGN REVERSED VISARGA UDATTA
+1CE5 ; [.0000.0000.0000.1CE5] # VEDIC SIGN VISARGA ANUDATTA
+1CE6 ; [.0000.0000.0000.1CE6] # VEDIC SIGN REVERSED VISARGA ANUDATTA
+1CE7 ; [.0000.0000.0000.1CE7] # VEDIC SIGN VISARGA UDATTA WITH TAIL
+1CE8 ; [.0000.0000.0000.1CE8] # VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1FBD ; [*0219.0020.0002.1FBD] # GREEK KORONIS; QQC
+1FBF ; [*0219.0020.0002.1FBF] # GREEK PSILI
+1FC0 ; [*021F.0020.0002.1FC0] # GREEK PERISPOMENI
+1FC1 ; [*0216.0020.0002.00A8][.0000.0045.0002.0342] # GREEK DIALYTIKA AND PERISPOMENI; QQCM
+1FCD ; [*0219.0020.0002.1FBF][.0000.0035.0002.0300] # GREEK PSILI AND VARIA; QQCM
+1FCE ; [*0219.0020.0002.1FBF][.0000.0032.0002.0301] # GREEK PSILI AND OXIA; QQCM
+1FCF ; [*0219.0020.0002.1FBF][.0000.0045.0002.0342] # GREEK PSILI AND PERISPOMENI; QQCM
+1FDD ; [*021A.0020.0002.1FFE][.0000.0035.0002.0300] # GREEK DASIA AND VARIA; QQCM
+1FDE ; [*021A.0020.0002.1FFE][.0000.0032.0002.0301] # GREEK DASIA AND OXIA; QQCM
+1FDF ; [*021A.0020.0002.1FFE][.0000.0045.0002.0342] # GREEK DASIA AND PERISPOMENI; QQCM
+1FED ; [*0216.0020.0002.00A8][.0000.0035.0002.0300] # GREEK DIALYTIKA AND VARIA; QQCM
+1FEE ; [*0216.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA AND OXIA; QQCM
+1FEF ; [*020E.0020.0002.1FEF] # GREEK VARIA; QQC
+1FFD ; [*020F.0020.0002.1FFD] # GREEK OXIA; QQC
+1FFE ; [*021A.0020.0002.1FFE] # GREEK DASIA
+2000 ; [*020A.0020.0004.2000] # EN QUAD; QQK
+2001 ; [*020A.0020.0004.2001] # EM QUAD; QQK
+2002 ; [*020A.0020.0004.2002] # EN SPACE; QQK
+2003 ; [*020A.0020.0004.2003] # EM SPACE; QQK
+2004 ; [*020A.0020.0004.2004] # THREE-PER-EM SPACE; QQK
+2005 ; [*020A.0020.0004.2005] # FOUR-PER-EM SPACE; QQK
+2006 ; [*020A.0020.0004.2006] # SIX-PER-EM SPACE; QQK
+2007 ; [*020A.0020.001B.2007] # FIGURE SPACE; QQK
+2008 ; [*020A.0020.0004.2008] # PUNCTUATION SPACE; QQK
+2009 ; [*020A.0020.0004.2009] # THIN SPACE; QQK
+200A ; [*020A.0020.0004.200A] # HAIR SPACE; QQK
+2010 ; [*0229.0020.0002.2010] # HYPHEN
+2011 ; [*0229.0020.001B.2011] # NON-BREAKING HYPHEN; QQK
+2012 ; [*022A.0020.0002.2012] # FIGURE DASH
+2013 ; [*022B.0020.0002.2013] # EN DASH
+2014 ; [*022C.0020.0002.2014] # EM DASH
+2015 ; [*022D.0020.0002.2015] # HORIZONTAL BAR
+2016 ; [*055A.0020.0002.2016] # DOUBLE VERTICAL LINE
+2017 ; [*021E.0020.0002.2017] # DOUBLE LOW LINE
+2018 ; [*02EF.0020.0002.2018] # LEFT SINGLE QUOTATION MARK
+2019 ; [*02F0.0020.0002.2019] # RIGHT SINGLE QUOTATION MARK
+201A ; [*02F1.0020.0002.201A] # SINGLE LOW-9 QUOTATION MARK
+201B ; [*02F2.0020.0002.201B] # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C ; [*02F6.0020.0002.201C] # LEFT DOUBLE QUOTATION MARK
+201D ; [*02F7.0020.0002.201D] # RIGHT DOUBLE QUOTATION MARK
+201E ; [*02F8.0020.0002.201E] # DOUBLE LOW-9 QUOTATION MARK
+201F ; [*02F9.0020.0002.201F] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020 ; [*036A.0020.0002.2020] # DAGGER
+2021 ; [*036B.0020.0002.2021] # DOUBLE DAGGER
+2022 ; [*036C.0020.0002.2022] # BULLET
+2023 ; [*036D.0020.0002.2023] # TRIANGULAR BULLET
+2024 ; [*0281.0020.0004.2024] # ONE DOT LEADER; QQK
+2025 ; [*0281.0020.0004.2025][*0281.0020.0004.2025] # TWO DOT LEADER; QQKN
+2026 ; [*0281.0020.0004.2026][*0281.0020.0004.2026][*0281.0020.001F.2026] # HORIZONTAL ELLIPSIS; QQKN
+2027 ; [*036E.0020.0002.2027] # HYPHENATION POINT
+2028 ; [*0208.0020.0002.2028] # LINE SEPARATOR
+2029 ; [*0209.0020.0002.2029] # PARAGRAPH SEPARATOR
+202F ; [*020A.0020.001B.202F] # NARROW NO-BREAK SPACE; QQK
+2030 ; [*0365.0020.0002.2030] # PER MILLE SIGN
+2031 ; [*0367.0020.0002.2031] # PER TEN THOUSAND SIGN
+2032 ; [*0372.0020.0002.2032] # PRIME
+2033 ; [*0372.0020.0004.2033][*0372.0020.0004.2033] # DOUBLE PRIME; QQKN
+2034 ; [*0372.0020.0004.2034][*0372.0020.0004.2034][*0372.0020.001F.2034] # TRIPLE PRIME; QQKN
+2035 ; [*0373.0020.0002.2035] # REVERSED PRIME
+2036 ; [*0373.0020.0004.2036][*0373.0020.0004.2036] # REVERSED DOUBLE PRIME; QQKN
+2037 ; [*0373.0020.0004.2037][*0373.0020.0004.2037][*0373.0020.001F.2037] # REVERSED TRIPLE PRIME; QQKN
+2038 ; [*0376.0020.0002.2038] # CARET
+2039 ; [*02F3.0020.0002.2039] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; [*02F4.0020.0002.203A] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B ; [*0377.0020.0002.203B] # REFERENCE MARK
+203C ; [*026E.0020.0004.203C][*026E.0020.0004.203C] # DOUBLE EXCLAMATION MARK; QQKN
+203D ; [*027F.0020.0002.203D] # INTERROBANG
+203E ; [*0213.0020.0002.203E] # OVERLINE
+203F ; [*0378.0020.0002.203F] # UNDERTIE
+2040 ; [*037A.0020.0002.2040] # CHARACTER TIE
+2041 ; [*037C.0020.0002.2041] # CARET INSERTION POINT
+2042 ; [*037D.0020.0002.2042] # ASTERISM
+2043 ; [*036F.0020.0002.2043] # HYPHEN BULLET
+2044 ; [*035D.0020.0002.2044] # FRACTION SLASH
+2045 ; [*030B.0020.0002.2045] # LEFT SQUARE BRACKET WITH QUILL
+2046 ; [*030C.0020.0002.2046] # RIGHT SQUARE BRACKET WITH QUILL
+2047 ; [*0273.0020.0004.2047][*0273.0020.0004.2047] # DOUBLE QUESTION MARK; QQKN
+2048 ; [*0273.0020.0004.2048][*026E.0020.0004.2048] # QUESTION EXCLAMATION MARK; QQKN
+2049 ; [*026E.0020.0004.2049][*0273.0020.0004.2049] # EXCLAMATION QUESTION MARK; QQKN
+204A ; [*0361.0020.0002.204A] # TIRONIAN SIGN ET
+204B ; [*0353.0020.0002.204B] # REVERSED PILCROW SIGN
+204C ; [*0370.0020.0002.204C] # BLACK LEFTWARDS BULLET
+204D ; [*0371.0020.0002.204D] # BLACK RIGHTWARDS BULLET
+204E ; [*0358.0020.0002.204E] # LOW ASTERISK
+204F ; [*0245.0020.0002.204F] # REVERSED SEMICOLON
+2050 ; [*037B.0020.0002.2050] # CLOSE UP
+2051 ; [*0359.0020.0002.2051] # TWO ASTERISKS ALIGNED VERTICALLY
+2052 ; [*0369.0020.0002.2052] # COMMERCIAL MINUS SIGN
+2053 ; [*022E.0020.0002.2053] # SWUNG DASH
+2054 ; [*0379.0020.0002.2054] # INVERTED UNDERTIE
+2055 ; [*02D3.0020.0002.2055] # FLOWER PUNCTUATION MARK
+2056 ; [*02D4.0020.0002.2056] # THREE DOT PUNCTUATION
+2057 ; [*0372.0020.0004.2057][*0372.0020.0004.2057][*0372.0020.001F.2057][*0372.0020.001F.2057] # QUADRUPLE PRIME; QQKN
+2058 ; [*02D5.0020.0002.2058] # FOUR DOT PUNCTUATION
+2059 ; [*02D6.0020.0002.2059] # FIVE DOT PUNCTUATION
+205A ; [*02D7.0020.0002.205A] # TWO DOT PUNCTUATION
+205B ; [*02D8.0020.0002.205B] # FOUR DOT MARK
+205C ; [*02D9.0020.0002.205C] # DOTTED CROSS
+205D ; [*02DA.0020.0002.205D] # TRICOLON
+205E ; [*02DB.0020.0002.205E] # VERTICAL FOUR DOTS
+205F ; [*020A.0020.0004.205F] # MEDIUM MATHEMATICAL SPACE; QQK
+2061 ; [.0000.0000.0000.2061] # FUNCTION APPLICATION
+2062 ; [.0000.0000.0000.2062] # INVISIBLE TIMES
+2063 ; [.0000.0000.0000.2063] # INVISIBLE SEPARATOR
+2064 ; [.0000.0000.0000.2064] # INVISIBLE PLUS
+207A ; [*0550.0020.0014.207A] # SUPERSCRIPT PLUS SIGN; QQK
+207B ; [*055C.0020.0014.207B] # SUPERSCRIPT MINUS; QQK
+207C ; [*0555.0020.0014.207C] # SUPERSCRIPT EQUALS SIGN; QQK
+207D ; [*02FF.0020.0014.207D] # SUPERSCRIPT LEFT PARENTHESIS; QQK
+207E ; [*0300.0020.0014.207E] # SUPERSCRIPT RIGHT PARENTHESIS; QQK
+208A ; [*0550.0020.0015.208A] # SUBSCRIPT PLUS SIGN; QQK
+208B ; [*055C.0020.0015.208B] # SUBSCRIPT MINUS; QQK
+208C ; [*0555.0020.0015.208C] # SUBSCRIPT EQUALS SIGN; QQK
+208D ; [*02FF.0020.0015.208D] # SUBSCRIPT LEFT PARENTHESIS; QQK
+208E ; [*0300.0020.0015.208E] # SUBSCRIPT RIGHT PARENTHESIS; QQK
+2104 ; [*04C1.0020.0002.2104] # CENTRE LINE SYMBOL
+2108 ; [*04C2.0020.0002.2108] # SCRUPLE
+2114 ; [*04C3.0020.0002.2114] # L B BAR SYMBOL
+2117 ; [*04C4.0020.0002.2117] # SOUND RECORDING COPYRIGHT
+2118 ; [*04C5.0020.0002.2118] # SCRIPT CAPITAL P
+211E ; [*04C6.0020.0002.211E] # PRESCRIPTION TAKE
+211F ; [*04C7.0020.0002.211F] # RESPONSE
+2123 ; [*04C8.0020.0002.2123] # VERSICLE
+2125 ; [*04C9.0020.0002.2125] # OUNCE SIGN
+2127 ; [*04CA.0020.0002.2127] # INVERTED OHM SIGN
+2129 ; [*04CB.0020.0002.2129] # TURNED GREEK SMALL LETTER IOTA
+212E ; [*04CC.0020.0002.212E] # ESTIMATED SYMBOL
+213A ; [*04CD.0020.0002.213A] # ROTATED CAPITAL Q
+2140 ; [*054F.0020.0005.2140] # DOUBLE-STRUCK N-ARY SUMMATION; QQK
+2141 ; [*04CE.0020.0002.2141] # TURNED SANS-SERIF CAPITAL G
+2142 ; [*04CF.0020.0002.2142] # TURNED SANS-SERIF CAPITAL L
+2143 ; [*04D0.0020.0002.2143] # REVERSED SANS-SERIF CAPITAL L
+2144 ; [*04D1.0020.0002.2144] # TURNED SANS-SERIF CAPITAL Y
+214A ; [*04D2.0020.0002.214A] # PROPERTY LINE
+214B ; [*0360.0020.0002.214B] # TURNED AMPERSAND
+214C ; [*04D3.0020.0002.214C] # PER SIGN
+214D ; [*04D4.0020.0002.214D] # AKTIESELSKAB
+214F ; [*04D5.0020.0002.214F] # SYMBOL FOR SAMARITAN SOURCE
+2180 ; [*1130.0020.0002.2180] # ROMAN NUMERAL ONE THOUSAND C D
+2181 ; [*1131.0020.0002.2181] # ROMAN NUMERAL FIVE THOUSAND
+2182 ; [*1132.0020.0002.2182] # ROMAN NUMERAL TEN THOUSAND
+2186 ; [*1133.0020.0002.2186] # ROMAN NUMERAL FIFTY EARLY FORM
+2187 ; [*1134.0020.0002.2187] # ROMAN NUMERAL FIFTY THOUSAND
+2188 ; [*1135.0020.0002.2188] # ROMAN NUMERAL ONE HUNDRED THOUSAND
+2190 ; [*04D6.0020.0002.2190] # LEFTWARDS ARROW
+2191 ; [*04D8.0020.0002.2191] # UPWARDS ARROW
+2192 ; [*04D7.0020.0002.2192] # RIGHTWARDS ARROW
+2193 ; [*04D9.0020.0002.2193] # DOWNWARDS ARROW
+2194 ; [*04DA.0020.0002.2194] # LEFT RIGHT ARROW
+2195 ; [*04DB.0020.0002.2195] # UP DOWN ARROW
+2196 ; [*04DC.0020.0002.2196] # NORTH WEST ARROW
+2197 ; [*04DD.0020.0002.2197] # NORTH EAST ARROW
+2198 ; [*04DE.0020.0002.2198] # SOUTH EAST ARROW
+2199 ; [*04DF.0020.0002.2199] # SOUTH WEST ARROW
+219A ; [*04D6.0020.0002.2190][.0000.0054.0002.0338] # LEFTWARDS ARROW WITH STROKE; QQCM
+219B ; [*04D7.0020.0002.2192][.0000.0054.0002.0338] # RIGHTWARDS ARROW WITH STROKE; QQCM
+219C ; [*04E0.0020.0002.219C] # LEFTWARDS WAVE ARROW
+219D ; [*04E1.0020.0002.219D] # RIGHTWARDS WAVE ARROW
+219E ; [*04E2.0020.0002.219E] # LEFTWARDS TWO HEADED ARROW
+219F ; [*04E3.0020.0002.219F] # UPWARDS TWO HEADED ARROW
+21A0 ; [*04E4.0020.0002.21A0] # RIGHTWARDS TWO HEADED ARROW
+21A1 ; [*04E5.0020.0002.21A1] # DOWNWARDS TWO HEADED ARROW
+21A2 ; [*04E6.0020.0002.21A2] # LEFTWARDS ARROW WITH TAIL
+21A3 ; [*04E7.0020.0002.21A3] # RIGHTWARDS ARROW WITH TAIL
+21A4 ; [*04E8.0020.0002.21A4] # LEFTWARDS ARROW FROM BAR
+21A5 ; [*04E9.0020.0002.21A5] # UPWARDS ARROW FROM BAR
+21A6 ; [*04EA.0020.0002.21A6] # RIGHTWARDS ARROW FROM BAR
+21A7 ; [*04EB.0020.0002.21A7] # DOWNWARDS ARROW FROM BAR
+21A8 ; [*04EC.0020.0002.21A8] # UP DOWN ARROW WITH BASE
+21A9 ; [*04ED.0020.0002.21A9] # LEFTWARDS ARROW WITH HOOK
+21AA ; [*04EE.0020.0002.21AA] # RIGHTWARDS ARROW WITH HOOK
+21AB ; [*04EF.0020.0002.21AB] # LEFTWARDS ARROW WITH LOOP
+21AC ; [*04F0.0020.0002.21AC] # RIGHTWARDS ARROW WITH LOOP
+21AD ; [*04F1.0020.0002.21AD] # LEFT RIGHT WAVE ARROW
+21AE ; [*04DA.0020.0002.2194][.0000.0054.0002.0338] # LEFT RIGHT ARROW WITH STROKE; QQCM
+21AF ; [*04F2.0020.0002.21AF] # DOWNWARDS ZIGZAG ARROW
+21B0 ; [*04F3.0020.0002.21B0] # UPWARDS ARROW WITH TIP LEFTWARDS
+21B1 ; [*04F4.0020.0002.21B1] # UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2 ; [*04F5.0020.0002.21B2] # DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3 ; [*04F6.0020.0002.21B3] # DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4 ; [*04F7.0020.0002.21B4] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5 ; [*04F8.0020.0002.21B5] # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6 ; [*04F9.0020.0002.21B6] # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7 ; [*04FA.0020.0002.21B7] # CLOCKWISE TOP SEMICIRCLE ARROW
+21B8 ; [*04FB.0020.0002.21B8] # NORTH WEST ARROW TO LONG BAR
+21B9 ; [*04FC.0020.0002.21B9] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA ; [*04FD.0020.0002.21BA] # ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB ; [*04FE.0020.0002.21BB] # CLOCKWISE OPEN CIRCLE ARROW
+21BC ; [*04FF.0020.0002.21BC] # LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD ; [*0500.0020.0002.21BD] # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE ; [*0501.0020.0002.21BE] # UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF ; [*0502.0020.0002.21BF] # UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0 ; [*0503.0020.0002.21C0] # RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1 ; [*0504.0020.0002.21C1] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2 ; [*0505.0020.0002.21C2] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3 ; [*0506.0020.0002.21C3] # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4 ; [*0507.0020.0002.21C4] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5 ; [*0508.0020.0002.21C5] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6 ; [*0509.0020.0002.21C6] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7 ; [*050A.0020.0002.21C7] # LEFTWARDS PAIRED ARROWS
+21C8 ; [*050B.0020.0002.21C8] # UPWARDS PAIRED ARROWS
+21C9 ; [*050C.0020.0002.21C9] # RIGHTWARDS PAIRED ARROWS
+21CA ; [*050D.0020.0002.21CA] # DOWNWARDS PAIRED ARROWS
+21CB ; [*050E.0020.0002.21CB] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC ; [*050F.0020.0002.21CC] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD ; [*0510.0020.0002.21D0][.0000.0054.0002.0338] # LEFTWARDS DOUBLE ARROW WITH STROKE; QQCM
+21CE ; [*0514.0020.0002.21D4][.0000.0054.0002.0338] # LEFT RIGHT DOUBLE ARROW WITH STROKE; QQCM
+21CF ; [*0512.0020.0002.21D2][.0000.0054.0002.0338] # RIGHTWARDS DOUBLE ARROW WITH STROKE; QQCM
+21D0 ; [*0510.0020.0002.21D0] # LEFTWARDS DOUBLE ARROW
+21D1 ; [*0511.0020.0002.21D1] # UPWARDS DOUBLE ARROW
+21D2 ; [*0512.0020.0002.21D2] # RIGHTWARDS DOUBLE ARROW
+21D3 ; [*0513.0020.0002.21D3] # DOWNWARDS DOUBLE ARROW
+21D4 ; [*0514.0020.0002.21D4] # LEFT RIGHT DOUBLE ARROW
+21D5 ; [*0515.0020.0002.21D5] # UP DOWN DOUBLE ARROW
+21D6 ; [*0516.0020.0002.21D6] # NORTH WEST DOUBLE ARROW
+21D7 ; [*0517.0020.0002.21D7] # NORTH EAST DOUBLE ARROW
+21D8 ; [*0518.0020.0002.21D8] # SOUTH EAST DOUBLE ARROW
+21D9 ; [*0519.0020.0002.21D9] # SOUTH WEST DOUBLE ARROW
+21DA ; [*051A.0020.0002.21DA] # LEFTWARDS TRIPLE ARROW
+21DB ; [*051B.0020.0002.21DB] # RIGHTWARDS TRIPLE ARROW
+21DC ; [*051C.0020.0002.21DC] # LEFTWARDS SQUIGGLE ARROW
+21DD ; [*051D.0020.0002.21DD] # RIGHTWARDS SQUIGGLE ARROW
+21DE ; [*051E.0020.0002.21DE] # UPWARDS ARROW WITH DOUBLE STROKE
+21DF ; [*051F.0020.0002.21DF] # DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0 ; [*0520.0020.0002.21E0] # LEFTWARDS DASHED ARROW
+21E1 ; [*0521.0020.0002.21E1] # UPWARDS DASHED ARROW
+21E2 ; [*0522.0020.0002.21E2] # RIGHTWARDS DASHED ARROW
+21E3 ; [*0523.0020.0002.21E3] # DOWNWARDS DASHED ARROW
+21E4 ; [*0524.0020.0002.21E4] # LEFTWARDS ARROW TO BAR
+21E5 ; [*0525.0020.0002.21E5] # RIGHTWARDS ARROW TO BAR
+21E6 ; [*0526.0020.0002.21E6] # LEFTWARDS WHITE ARROW
+21E7 ; [*0527.0020.0002.21E7] # UPWARDS WHITE ARROW
+21E8 ; [*0528.0020.0002.21E8] # RIGHTWARDS WHITE ARROW
+21E9 ; [*0529.0020.0002.21E9] # DOWNWARDS WHITE ARROW
+21EA ; [*052A.0020.0002.21EA] # UPWARDS WHITE ARROW FROM BAR
+21EB ; [*052B.0020.0002.21EB] # UPWARDS WHITE ARROW ON PEDESTAL
+21EC ; [*052C.0020.0002.21EC] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED ; [*052D.0020.0002.21ED] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE ; [*052E.0020.0002.21EE] # UPWARDS WHITE DOUBLE ARROW
+21EF ; [*052F.0020.0002.21EF] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0 ; [*0530.0020.0002.21F0] # RIGHTWARDS WHITE ARROW FROM WALL
+21F1 ; [*0531.0020.0002.21F1] # NORTH WEST ARROW TO CORNER
+21F2 ; [*0532.0020.0002.21F2] # SOUTH EAST ARROW TO CORNER
+21F3 ; [*0533.0020.0002.21F3] # UP DOWN WHITE ARROW
+21F4 ; [*0534.0020.0002.21F4] # RIGHT ARROW WITH SMALL CIRCLE
+21F5 ; [*0535.0020.0002.21F5] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6 ; [*0536.0020.0002.21F6] # THREE RIGHTWARDS ARROWS
+21F7 ; [*0537.0020.0002.21F7] # LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8 ; [*0538.0020.0002.21F8] # RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9 ; [*0539.0020.0002.21F9] # LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA ; [*053A.0020.0002.21FA] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB ; [*053B.0020.0002.21FB] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC ; [*053C.0020.0002.21FC] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD ; [*053D.0020.0002.21FD] # LEFTWARDS OPEN-HEADED ARROW
+21FE ; [*053E.0020.0002.21FE] # RIGHTWARDS OPEN-HEADED ARROW
+21FF ; [*053F.0020.0002.21FF] # LEFT RIGHT OPEN-HEADED ARROW
+2200 ; [*0540.0020.0002.2200] # FOR ALL
+2201 ; [*0541.0020.0002.2201] # COMPLEMENT
+2202 ; [*0542.0020.0002.2202] # PARTIAL DIFFERENTIAL
+2203 ; [*0543.0020.0002.2203] # THERE EXISTS
+2204 ; [*0543.0020.0002.2203][.0000.0054.0002.0338] # THERE DOES NOT EXIST; QQCM
+2205 ; [*0544.0020.0002.2205] # EMPTY SET
+2206 ; [*0545.0020.0002.2206] # INCREMENT
+2207 ; [*0546.0020.0002.2207] # NABLA
+2208 ; [*0547.0020.0002.2208] # ELEMENT OF
+2209 ; [*0547.0020.0002.2208][.0000.0054.0002.0338] # NOT AN ELEMENT OF; QQCM
+220A ; [*0548.0020.0002.220A] # SMALL ELEMENT OF
+220B ; [*0549.0020.0002.220B] # CONTAINS AS MEMBER
+220C ; [*0549.0020.0002.220B][.0000.0054.0002.0338] # DOES NOT CONTAIN AS MEMBER; QQCM
+220D ; [*054A.0020.0002.220D] # SMALL CONTAINS AS MEMBER
+220E ; [*054C.0020.0002.220E] # END OF PROOF
+220F ; [*054D.0020.0002.220F] # N-ARY PRODUCT
+2210 ; [*054E.0020.0002.2210] # N-ARY COPRODUCT
+2211 ; [*054F.0020.0002.2211] # N-ARY SUMMATION
+2212 ; [*055C.0020.0002.2212] # MINUS SIGN
+2213 ; [*055D.0020.0002.2213] # MINUS-OR-PLUS SIGN
+2214 ; [*055E.0020.0002.2214] # DOT PLUS
+2215 ; [*055F.0020.0002.2215] # DIVISION SLASH
+2216 ; [*0560.0020.0002.2216] # SET MINUS
+2217 ; [*0561.0020.0002.2217] # ASTERISK OPERATOR
+2218 ; [*0562.0020.0002.2218] # RING OPERATOR
+2219 ; [*0563.0020.0002.2219] # BULLET OPERATOR
+221A ; [*0564.0020.0002.221A] # SQUARE ROOT
+221B ; [*0565.0020.0002.221B] # CUBE ROOT
+221C ; [*0567.0020.0002.221C] # FOURTH ROOT
+221D ; [*0569.0020.0002.221D] # PROPORTIONAL TO
+221E ; [*056A.0020.0002.221E] # INFINITY
+221F ; [*056B.0020.0002.221F] # RIGHT ANGLE
+2220 ; [*056C.0020.0002.2220] # ANGLE
+2221 ; [*056D.0020.0002.2221] # MEASURED ANGLE
+2222 ; [*056E.0020.0002.2222] # SPHERICAL ANGLE
+2223 ; [*056F.0020.0002.2223] # DIVIDES
+2224 ; [*056F.0020.0002.2223][.0000.0054.0002.0338] # DOES NOT DIVIDE; QQCM
+2225 ; [*0570.0020.0002.2225] # PARALLEL TO
+2226 ; [*0570.0020.0002.2225][.0000.0054.0002.0338] # NOT PARALLEL TO; QQCM
+2227 ; [*0571.0020.0002.2227] # LOGICAL AND
+2228 ; [*0572.0020.0002.2228] # LOGICAL OR
+2229 ; [*0573.0020.0002.2229] # INTERSECTION
+222A ; [*0574.0020.0002.222A] # UNION
+222B ; [*0575.0020.0002.222B] # INTEGRAL
+222C ; [*0575.0020.0004.222C][*0575.0020.0004.222C] # DOUBLE INTEGRAL; QQKN
+222D ; [*0575.0020.0004.222D][*0575.0020.0004.222D][*0575.0020.001F.222D] # TRIPLE INTEGRAL; QQKN
+222E ; [*0576.0020.0002.222E] # CONTOUR INTEGRAL
+222F ; [*0576.0020.0004.222F][*0576.0020.0004.222F] # SURFACE INTEGRAL; QQKN
+2230 ; [*0576.0020.0004.2230][*0576.0020.0004.2230][*0576.0020.001F.2230] # VOLUME INTEGRAL; QQKN
+2231 ; [*0577.0020.0002.2231] # CLOCKWISE INTEGRAL
+2232 ; [*0578.0020.0002.2232] # CLOCKWISE CONTOUR INTEGRAL
+2233 ; [*0579.0020.0002.2233] # ANTICLOCKWISE CONTOUR INTEGRAL
+2234 ; [*057A.0020.0002.2234] # THEREFORE
+2235 ; [*057B.0020.0002.2235] # BECAUSE
+2236 ; [*057C.0020.0002.2236] # RATIO
+2237 ; [*057D.0020.0002.2237] # PROPORTION
+2238 ; [*057E.0020.0002.2238] # DOT MINUS
+2239 ; [*057F.0020.0002.2239] # EXCESS
+223A ; [*0580.0020.0002.223A] # GEOMETRIC PROPORTION
+223B ; [*0581.0020.0002.223B] # HOMOTHETIC
+223C ; [*0582.0020.0002.223C] # TILDE OPERATOR
+223D ; [*0583.0020.0002.223D] # REVERSED TILDE
+223E ; [*0584.0020.0002.223E] # INVERTED LAZY S
+223F ; [*0585.0020.0002.223F] # SINE WAVE
+2240 ; [*0586.0020.0002.2240] # WREATH PRODUCT
+2241 ; [*0582.0020.0002.223C][.0000.0054.0002.0338] # NOT TILDE; QQCM
+2242 ; [*0587.0020.0002.2242] # MINUS TILDE
+2243 ; [*0588.0020.0002.2243] # ASYMPTOTICALLY EQUAL TO
+2244 ; [*0588.0020.0002.2243][.0000.0054.0002.0338] # NOT ASYMPTOTICALLY EQUAL TO; QQCM
+2245 ; [*0589.0020.0002.2245] # APPROXIMATELY EQUAL TO
+2246 ; [*058A.0020.0002.2246] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247 ; [*0589.0020.0002.2245][.0000.0054.0002.0338] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO; QQCM
+2248 ; [*058B.0020.0002.2248] # ALMOST EQUAL TO
+2249 ; [*058B.0020.0002.2248][.0000.0054.0002.0338] # NOT ALMOST EQUAL TO; QQCM
+224A ; [*058C.0020.0002.224A] # ALMOST EQUAL OR EQUAL TO
+224B ; [*058D.0020.0002.224B] # TRIPLE TILDE
+224C ; [*058E.0020.0002.224C] # ALL EQUAL TO
+224D ; [*058F.0020.0002.224D] # EQUIVALENT TO
+224E ; [*0590.0020.0002.224E] # GEOMETRICALLY EQUIVALENT TO
+224F ; [*0591.0020.0002.224F] # DIFFERENCE BETWEEN
+2250 ; [*0592.0020.0002.2250] # APPROACHES THE LIMIT
+2251 ; [*0593.0020.0002.2251] # GEOMETRICALLY EQUAL TO
+2252 ; [*0594.0020.0002.2252] # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253 ; [*0595.0020.0002.2253] # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254 ; [*0596.0020.0002.2254] # COLON EQUALS
+2255 ; [*0597.0020.0002.2255] # EQUALS COLON
+2256 ; [*0598.0020.0002.2256] # RING IN EQUAL TO
+2257 ; [*0599.0020.0002.2257] # RING EQUAL TO
+2258 ; [*059A.0020.0002.2258] # CORRESPONDS TO
+2259 ; [*059B.0020.0002.2259] # ESTIMATES
+225A ; [*059C.0020.0002.225A] # EQUIANGULAR TO
+225B ; [*059D.0020.0002.225B] # STAR EQUALS
+225C ; [*059E.0020.0002.225C] # DELTA EQUAL TO
+225D ; [*059F.0020.0002.225D] # EQUAL TO BY DEFINITION
+225E ; [*05A0.0020.0002.225E] # MEASURED BY
+225F ; [*05A1.0020.0002.225F] # QUESTIONED EQUAL TO
+2260 ; [*0555.0020.0002.003D][.0000.0054.0002.0338] # NOT EQUAL TO; QQCM
+2261 ; [*05A2.0020.0002.2261] # IDENTICAL TO
+2262 ; [*05A2.0020.0002.2261][.0000.0054.0002.0338] # NOT IDENTICAL TO; QQCM
+2263 ; [*05A3.0020.0002.2263] # STRICTLY EQUIVALENT TO
+2264 ; [*05A4.0020.0002.2264] # LESS-THAN OR EQUAL TO
+2265 ; [*05A5.0020.0002.2265] # GREATER-THAN OR EQUAL TO
+2266 ; [*05A6.0020.0002.2266] # LESS-THAN OVER EQUAL TO
+2267 ; [*05A7.0020.0002.2267] # GREATER-THAN OVER EQUAL TO
+2268 ; [*05A8.0020.0002.2268] # LESS-THAN BUT NOT EQUAL TO
+2269 ; [*05A9.0020.0002.2269] # GREATER-THAN BUT NOT EQUAL TO
+226A ; [*05AA.0020.0002.226A] # MUCH LESS-THAN
+226B ; [*05AB.0020.0002.226B] # MUCH GREATER-THAN
+226C ; [*05AC.0020.0002.226C] # BETWEEN
+226D ; [*058F.0020.0002.224D][.0000.0054.0002.0338] # NOT EQUIVALENT TO; QQCM
+226E ; [*0554.0020.0002.003C][.0000.0054.0002.0338] # NOT LESS-THAN; QQCM
+226F ; [*0556.0020.0002.003E][.0000.0054.0002.0338] # NOT GREATER-THAN; QQCM
+2270 ; [*05A4.0020.0002.2264][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUAL TO; QQCM
+2271 ; [*05A5.0020.0002.2265][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUAL TO; QQCM
+2272 ; [*05AD.0020.0002.2272] # LESS-THAN OR EQUIVALENT TO
+2273 ; [*05AE.0020.0002.2273] # GREATER-THAN OR EQUIVALENT TO
+2274 ; [*05AD.0020.0002.2272][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUIVALENT TO; QQCM
+2275 ; [*05AE.0020.0002.2273][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUIVALENT TO; QQCM
+2276 ; [*05AF.0020.0002.2276] # LESS-THAN OR GREATER-THAN
+2277 ; [*05B0.0020.0002.2277] # GREATER-THAN OR LESS-THAN
+2278 ; [*05AF.0020.0002.2276][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR GREATER-THAN; QQCM
+2279 ; [*05B0.0020.0002.2277][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR LESS-THAN; QQCM
+227A ; [*05B1.0020.0002.227A] # PRECEDES
+227B ; [*05B2.0020.0002.227B] # SUCCEEDS
+227C ; [*05B3.0020.0002.227C] # PRECEDES OR EQUAL TO
+227D ; [*05B4.0020.0002.227D] # SUCCEEDS OR EQUAL TO
+227E ; [*05B5.0020.0002.227E] # PRECEDES OR EQUIVALENT TO
+227F ; [*05B6.0020.0002.227F] # SUCCEEDS OR EQUIVALENT TO
+2280 ; [*05B1.0020.0002.227A][.0000.0054.0002.0338] # DOES NOT PRECEDE; QQCM
+2281 ; [*05B2.0020.0002.227B][.0000.0054.0002.0338] # DOES NOT SUCCEED; QQCM
+2282 ; [*05B7.0020.0002.2282] # SUBSET OF
+2283 ; [*05B8.0020.0002.2283] # SUPERSET OF
+2284 ; [*05B7.0020.0002.2282][.0000.0054.0002.0338] # NOT A SUBSET OF; QQCM
+2285 ; [*05B8.0020.0002.2283][.0000.0054.0002.0338] # NOT A SUPERSET OF; QQCM
+2286 ; [*05B9.0020.0002.2286] # SUBSET OF OR EQUAL TO
+2287 ; [*05BA.0020.0002.2287] # SUPERSET OF OR EQUAL TO
+2288 ; [*05B9.0020.0002.2286][.0000.0054.0002.0338] # NEITHER A SUBSET OF NOR EQUAL TO; QQCM
+2289 ; [*05BA.0020.0002.2287][.0000.0054.0002.0338] # NEITHER A SUPERSET OF NOR EQUAL TO; QQCM
+228A ; [*05BB.0020.0002.228A] # SUBSET OF WITH NOT EQUAL TO
+228B ; [*05BC.0020.0002.228B] # SUPERSET OF WITH NOT EQUAL TO
+228C ; [*05BD.0020.0002.228C] # MULTISET
+228D ; [*05BE.0020.0002.228D] # MULTISET MULTIPLICATION
+228E ; [*05BF.0020.0002.228E] # MULTISET UNION
+228F ; [*05C0.0020.0002.228F] # SQUARE IMAGE OF
+2290 ; [*05C1.0020.0002.2290] # SQUARE ORIGINAL OF
+2291 ; [*05C2.0020.0002.2291] # SQUARE IMAGE OF OR EQUAL TO
+2292 ; [*05C3.0020.0002.2292] # SQUARE ORIGINAL OF OR EQUAL TO
+2293 ; [*05C4.0020.0002.2293] # SQUARE CAP
+2294 ; [*05C5.0020.0002.2294] # SQUARE CUP
+2295 ; [*05C6.0020.0002.2295] # CIRCLED PLUS
+2296 ; [*05C7.0020.0002.2296] # CIRCLED MINUS
+2297 ; [*05C8.0020.0002.2297] # CIRCLED TIMES
+2298 ; [*05C9.0020.0002.2298] # CIRCLED DIVISION SLASH
+2299 ; [*05CA.0020.0002.2299] # CIRCLED DOT OPERATOR
+229A ; [*05CB.0020.0002.229A] # CIRCLED RING OPERATOR
+229B ; [*05CC.0020.0002.229B] # CIRCLED ASTERISK OPERATOR
+229C ; [*05CD.0020.0002.229C] # CIRCLED EQUALS
+229D ; [*05CE.0020.0002.229D] # CIRCLED DASH
+229E ; [*05CF.0020.0002.229E] # SQUARED PLUS
+229F ; [*05D0.0020.0002.229F] # SQUARED MINUS
+22A0 ; [*05D1.0020.0002.22A0] # SQUARED TIMES
+22A1 ; [*05D2.0020.0002.22A1] # SQUARED DOT OPERATOR
+22A2 ; [*05D3.0020.0002.22A2] # RIGHT TACK
+22A3 ; [*05D4.0020.0002.22A3] # LEFT TACK
+22A4 ; [*05D5.0020.0002.22A4] # DOWN TACK
+22A5 ; [*05D6.0020.0002.22A5] # UP TACK
+22A6 ; [*05D7.0020.0002.22A6] # ASSERTION
+22A7 ; [*05D8.0020.0002.22A7] # MODELS
+22A8 ; [*05D9.0020.0002.22A8] # TRUE
+22A9 ; [*05DA.0020.0002.22A9] # FORCES
+22AA ; [*05DB.0020.0002.22AA] # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB ; [*05DC.0020.0002.22AB] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC ; [*05D3.0020.0002.22A2][.0000.0054.0002.0338] # DOES NOT PROVE; QQCM
+22AD ; [*05D9.0020.0002.22A8][.0000.0054.0002.0338] # NOT TRUE; QQCM
+22AE ; [*05DA.0020.0002.22A9][.0000.0054.0002.0338] # DOES NOT FORCE; QQCM
+22AF ; [*05DC.0020.0002.22AB][.0000.0054.0002.0338] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE; QQCM
+22B0 ; [*05DD.0020.0002.22B0] # PRECEDES UNDER RELATION
+22B1 ; [*05DE.0020.0002.22B1] # SUCCEEDS UNDER RELATION
+22B2 ; [*05DF.0020.0002.22B2] # NORMAL SUBGROUP OF
+22B3 ; [*05E0.0020.0002.22B3] # CONTAINS AS NORMAL SUBGROUP
+22B4 ; [*05E1.0020.0002.22B4] # NORMAL SUBGROUP OF OR EQUAL TO
+22B5 ; [*05E2.0020.0002.22B5] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6 ; [*05E3.0020.0002.22B6] # ORIGINAL OF
+22B7 ; [*05E4.0020.0002.22B7] # IMAGE OF
+22B8 ; [*05E5.0020.0002.22B8] # MULTIMAP
+22B9 ; [*05E6.0020.0002.22B9] # HERMITIAN CONJUGATE MATRIX
+22BA ; [*05E7.0020.0002.22BA] # INTERCALATE
+22BB ; [*05E8.0020.0002.22BB] # XOR
+22BC ; [*05E9.0020.0002.22BC] # NAND
+22BD ; [*05EA.0020.0002.22BD] # NOR
+22BE ; [*05EB.0020.0002.22BE] # RIGHT ANGLE WITH ARC
+22BF ; [*05EC.0020.0002.22BF] # RIGHT TRIANGLE
+22C0 ; [*05ED.0020.0002.22C0] # N-ARY LOGICAL AND
+22C1 ; [*05EE.0020.0002.22C1] # N-ARY LOGICAL OR
+22C2 ; [*05EF.0020.0002.22C2] # N-ARY INTERSECTION
+22C3 ; [*05F0.0020.0002.22C3] # N-ARY UNION
+22C4 ; [*05F1.0020.0002.22C4] # DIAMOND OPERATOR
+22C5 ; [*05F2.0020.0002.22C5] # DOT OPERATOR
+22C6 ; [*05F3.0020.0002.22C6] # STAR OPERATOR
+22C7 ; [*05F4.0020.0002.22C7] # DIVISION TIMES
+22C8 ; [*05F5.0020.0002.22C8] # BOWTIE
+22C9 ; [*05F6.0020.0002.22C9] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA ; [*05F7.0020.0002.22CA] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB ; [*05F8.0020.0002.22CB] # LEFT SEMIDIRECT PRODUCT
+22CC ; [*05F9.0020.0002.22CC] # RIGHT SEMIDIRECT PRODUCT
+22CD ; [*05FA.0020.0002.22CD] # REVERSED TILDE EQUALS
+22CE ; [*05FB.0020.0002.22CE] # CURLY LOGICAL OR
+22CF ; [*05FC.0020.0002.22CF] # CURLY LOGICAL AND
+22D0 ; [*05FD.0020.0002.22D0] # DOUBLE SUBSET
+22D1 ; [*05FE.0020.0002.22D1] # DOUBLE SUPERSET
+22D2 ; [*05FF.0020.0002.22D2] # DOUBLE INTERSECTION
+22D3 ; [*0600.0020.0002.22D3] # DOUBLE UNION
+22D4 ; [*0601.0020.0002.22D4] # PITCHFORK
+22D5 ; [*0602.0020.0002.22D5] # EQUAL AND PARALLEL TO
+22D6 ; [*0603.0020.0002.22D6] # LESS-THAN WITH DOT
+22D7 ; [*0604.0020.0002.22D7] # GREATER-THAN WITH DOT
+22D8 ; [*0605.0020.0002.22D8] # VERY MUCH LESS-THAN
+22D9 ; [*0606.0020.0002.22D9] # VERY MUCH GREATER-THAN
+22DA ; [*0607.0020.0002.22DA] # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB ; [*0608.0020.0002.22DB] # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC ; [*0609.0020.0002.22DC] # EQUAL TO OR LESS-THAN
+22DD ; [*060A.0020.0002.22DD] # EQUAL TO OR GREATER-THAN
+22DE ; [*060B.0020.0002.22DE] # EQUAL TO OR PRECEDES
+22DF ; [*060C.0020.0002.22DF] # EQUAL TO OR SUCCEEDS
+22E0 ; [*05B3.0020.0002.227C][.0000.0054.0002.0338] # DOES NOT PRECEDE OR EQUAL; QQCM
+22E1 ; [*05B4.0020.0002.227D][.0000.0054.0002.0338] # DOES NOT SUCCEED OR EQUAL; QQCM
+22E2 ; [*05C2.0020.0002.2291][.0000.0054.0002.0338] # NOT SQUARE IMAGE OF OR EQUAL TO; QQCM
+22E3 ; [*05C3.0020.0002.2292][.0000.0054.0002.0338] # NOT SQUARE ORIGINAL OF OR EQUAL TO; QQCM
+22E4 ; [*060D.0020.0002.22E4] # SQUARE IMAGE OF OR NOT EQUAL TO
+22E5 ; [*060E.0020.0002.22E5] # SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6 ; [*060F.0020.0002.22E6] # LESS-THAN BUT NOT EQUIVALENT TO
+22E7 ; [*0610.0020.0002.22E7] # GREATER-THAN BUT NOT EQUIVALENT TO
+22E8 ; [*0611.0020.0002.22E8] # PRECEDES BUT NOT EQUIVALENT TO
+22E9 ; [*0612.0020.0002.22E9] # SUCCEEDS BUT NOT EQUIVALENT TO
+22EA ; [*05DF.0020.0002.22B2][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF; QQCM
+22EB ; [*05E0.0020.0002.22B3][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP; QQCM
+22EC ; [*05E1.0020.0002.22B4][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF OR EQUAL TO; QQCM
+22ED ; [*05E2.0020.0002.22B5][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL; QQCM
+22EE ; [*0613.0020.0002.22EE] # VERTICAL ELLIPSIS
+22EF ; [*0614.0020.0002.22EF] # MIDLINE HORIZONTAL ELLIPSIS
+22F0 ; [*0615.0020.0002.22F0] # UP RIGHT DIAGONAL ELLIPSIS
+22F1 ; [*0616.0020.0002.22F1] # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2 ; [*0617.0020.0002.22F2] # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3 ; [*0618.0020.0002.22F3] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4 ; [*0619.0020.0002.22F4] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5 ; [*061A.0020.0002.22F5] # ELEMENT OF WITH DOT ABOVE
+22F6 ; [*061B.0020.0002.22F6] # ELEMENT OF WITH OVERBAR
+22F7 ; [*061C.0020.0002.22F7] # SMALL ELEMENT OF WITH OVERBAR
+22F8 ; [*061D.0020.0002.22F8] # ELEMENT OF WITH UNDERBAR
+22F9 ; [*061E.0020.0002.22F9] # ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA ; [*061F.0020.0002.22FA] # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB ; [*0620.0020.0002.22FB] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC ; [*0621.0020.0002.22FC] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD ; [*0622.0020.0002.22FD] # CONTAINS WITH OVERBAR
+22FE ; [*0623.0020.0002.22FE] # SMALL CONTAINS WITH OVERBAR
+22FF ; [*0624.0020.0002.22FF] # Z NOTATION BAG MEMBERSHIP
+2300 ; [*0625.0020.0002.2300] # DIAMETER SIGN
+2301 ; [*0626.0020.0002.2301] # ELECTRIC ARROW
+2302 ; [*0627.0020.0002.2302] # HOUSE
+2303 ; [*0628.0020.0002.2303] # UP ARROWHEAD
+2304 ; [*0629.0020.0002.2304] # DOWN ARROWHEAD
+2305 ; [*062A.0020.0002.2305] # PROJECTIVE
+2306 ; [*062B.0020.0002.2306] # PERSPECTIVE
+2307 ; [*062C.0020.0002.2307] # WAVY LINE
+2308 ; [*062D.0020.0002.2308] # LEFT CEILING
+2309 ; [*062E.0020.0002.2309] # RIGHT CEILING
+230A ; [*062F.0020.0002.230A] # LEFT FLOOR
+230B ; [*0630.0020.0002.230B] # RIGHT FLOOR
+230C ; [*0631.0020.0002.230C] # BOTTOM RIGHT CROP
+230D ; [*0632.0020.0002.230D] # BOTTOM LEFT CROP
+230E ; [*0633.0020.0002.230E] # TOP RIGHT CROP
+230F ; [*0634.0020.0002.230F] # TOP LEFT CROP
+2310 ; [*0635.0020.0002.2310] # REVERSED NOT SIGN
+2311 ; [*0636.0020.0002.2311] # SQUARE LOZENGE
+2312 ; [*0637.0020.0002.2312] # ARC
+2313 ; [*0638.0020.0002.2313] # SEGMENT
+2314 ; [*0639.0020.0002.2314] # SECTOR
+2315 ; [*063A.0020.0002.2315] # TELEPHONE RECORDER
+2316 ; [*063B.0020.0002.2316] # POSITION INDICATOR
+2317 ; [*063C.0020.0002.2317] # VIEWDATA SQUARE
+2318 ; [*063D.0020.0002.2318] # PLACE OF INTEREST SIGN
+2319 ; [*063E.0020.0002.2319] # TURNED NOT SIGN
+231A ; [*063F.0020.0002.231A] # WATCH
+231B ; [*0640.0020.0002.231B] # HOURGLASS
+231C ; [*0641.0020.0002.231C] # TOP LEFT CORNER
+231D ; [*0642.0020.0002.231D] # TOP RIGHT CORNER
+231E ; [*0643.0020.0002.231E] # BOTTOM LEFT CORNER
+231F ; [*0644.0020.0002.231F] # BOTTOM RIGHT CORNER
+2320 ; [*0645.0020.0002.2320] # TOP HALF INTEGRAL
+2321 ; [*0646.0020.0002.2321] # BOTTOM HALF INTEGRAL
+2322 ; [*0647.0020.0002.2322] # FROWN
+2323 ; [*0648.0020.0002.2323] # SMILE
+2324 ; [*0649.0020.0002.2324] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325 ; [*064A.0020.0002.2325] # OPTION KEY
+2326 ; [*064B.0020.0002.2326] # ERASE TO THE RIGHT
+2327 ; [*064C.0020.0002.2327] # X IN A RECTANGLE BOX
+2328 ; [*064D.0020.0002.2328] # KEYBOARD
+2329 ; [*033D.0020.0002.2329] # LEFT-POINTING ANGLE BRACKET; QQC
+232A ; [*033E.0020.0002.232A] # RIGHT-POINTING ANGLE BRACKET; QQC
+232B ; [*064E.0020.0002.232B] # ERASE TO THE LEFT
+232C ; [*064F.0020.0002.232C] # BENZENE RING
+232D ; [*0650.0020.0002.232D] # CYLINDRICITY
+232E ; [*0651.0020.0002.232E] # ALL AROUND-PROFILE
+232F ; [*0652.0020.0002.232F] # SYMMETRY
+2330 ; [*0653.0020.0002.2330] # TOTAL RUNOUT
+2331 ; [*0654.0020.0002.2331] # DIMENSION ORIGIN
+2332 ; [*0655.0020.0002.2332] # CONICAL TAPER
+2333 ; [*0656.0020.0002.2333] # SLOPE
+2334 ; [*0657.0020.0002.2334] # COUNTERBORE
+2335 ; [*0658.0020.0002.2335] # COUNTERSINK
+2336 ; [*0659.0020.0002.2336] # APL FUNCTIONAL SYMBOL I-BEAM
+2337 ; [*065A.0020.0002.2337] # APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338 ; [*065B.0020.0002.2338] # APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339 ; [*065C.0020.0002.2339] # APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A ; [*065D.0020.0002.233A] # APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B ; [*065E.0020.0002.233B] # APL FUNCTIONAL SYMBOL QUAD JOT
+233C ; [*065F.0020.0002.233C] # APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D ; [*0660.0020.0002.233D] # APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E ; [*0661.0020.0002.233E] # APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F ; [*0662.0020.0002.233F] # APL FUNCTIONAL SYMBOL SLASH BAR
+2340 ; [*0663.0020.0002.2340] # APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341 ; [*0664.0020.0002.2341] # APL FUNCTIONAL SYMBOL QUAD SLASH
+2342 ; [*0665.0020.0002.2342] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343 ; [*0666.0020.0002.2343] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344 ; [*0667.0020.0002.2344] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345 ; [*0668.0020.0002.2345] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346 ; [*0669.0020.0002.2346] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347 ; [*066A.0020.0002.2347] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348 ; [*066B.0020.0002.2348] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349 ; [*066C.0020.0002.2349] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A ; [*066D.0020.0002.234A] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B ; [*066E.0020.0002.234B] # APL FUNCTIONAL SYMBOL DELTA STILE
+234C ; [*066F.0020.0002.234C] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D ; [*0670.0020.0002.234D] # APL FUNCTIONAL SYMBOL QUAD DELTA
+234E ; [*0671.0020.0002.234E] # APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F ; [*0672.0020.0002.234F] # APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350 ; [*0673.0020.0002.2350] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351 ; [*0674.0020.0002.2351] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352 ; [*0675.0020.0002.2352] # APL FUNCTIONAL SYMBOL DEL STILE
+2353 ; [*0676.0020.0002.2353] # APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354 ; [*0677.0020.0002.2354] # APL FUNCTIONAL SYMBOL QUAD DEL
+2355 ; [*0678.0020.0002.2355] # APL FUNCTIONAL SYMBOL UP TACK JOT
+2356 ; [*0679.0020.0002.2356] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357 ; [*067A.0020.0002.2357] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358 ; [*067B.0020.0002.2358] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359 ; [*067C.0020.0002.2359] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A ; [*067D.0020.0002.235A] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B ; [*067E.0020.0002.235B] # APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C ; [*067F.0020.0002.235C] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D ; [*0680.0020.0002.235D] # APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E ; [*0681.0020.0002.235E] # APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F ; [*0682.0020.0002.235F] # APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360 ; [*0683.0020.0002.2360] # APL FUNCTIONAL SYMBOL QUAD COLON
+2361 ; [*0684.0020.0002.2361] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362 ; [*0685.0020.0002.2362] # APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363 ; [*0686.0020.0002.2363] # APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364 ; [*0687.0020.0002.2364] # APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365 ; [*0688.0020.0002.2365] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366 ; [*0689.0020.0002.2366] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367 ; [*068A.0020.0002.2367] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368 ; [*068B.0020.0002.2368] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369 ; [*068C.0020.0002.2369] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A ; [*068D.0020.0002.236A] # APL FUNCTIONAL SYMBOL COMMA BAR
+236B ; [*068E.0020.0002.236B] # APL FUNCTIONAL SYMBOL DEL TILDE
+236C ; [*068F.0020.0002.236C] # APL FUNCTIONAL SYMBOL ZILDE
+236D ; [*0690.0020.0002.236D] # APL FUNCTIONAL SYMBOL STILE TILDE
+236E ; [*0691.0020.0002.236E] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F ; [*0692.0020.0002.236F] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370 ; [*0693.0020.0002.2370] # APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371 ; [*0694.0020.0002.2371] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372 ; [*0695.0020.0002.2372] # APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373 ; [*0696.0020.0002.2373] # APL FUNCTIONAL SYMBOL IOTA
+2374 ; [*0697.0020.0002.2374] # APL FUNCTIONAL SYMBOL RHO
+2375 ; [*0698.0020.0002.2375] # APL FUNCTIONAL SYMBOL OMEGA
+2376 ; [*0699.0020.0002.2376] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377 ; [*069A.0020.0002.2377] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378 ; [*069B.0020.0002.2378] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379 ; [*069C.0020.0002.2379] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A ; [*069D.0020.0002.237A] # APL FUNCTIONAL SYMBOL ALPHA
+237B ; [*069E.0020.0002.237B] # NOT CHECK MARK
+237C ; [*069F.0020.0002.237C] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D ; [*06A0.0020.0002.237D] # SHOULDERED OPEN BOX
+237E ; [*06A1.0020.0002.237E] # BELL SYMBOL
+237F ; [*06A2.0020.0002.237F] # VERTICAL LINE WITH MIDDLE DOT
+2380 ; [*06A3.0020.0002.2380] # INSERTION SYMBOL
+2381 ; [*06A4.0020.0002.2381] # CONTINUOUS UNDERLINE SYMBOL
+2382 ; [*06A5.0020.0002.2382] # DISCONTINUOUS UNDERLINE SYMBOL
+2383 ; [*06A6.0020.0002.2383] # EMPHASIS SYMBOL
+2384 ; [*06A7.0020.0002.2384] # COMPOSITION SYMBOL
+2385 ; [*06A8.0020.0002.2385] # WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386 ; [*06A9.0020.0002.2386] # ENTER SYMBOL
+2387 ; [*06AA.0020.0002.2387] # ALTERNATIVE KEY SYMBOL
+2388 ; [*06AB.0020.0002.2388] # HELM SYMBOL
+2389 ; [*06AC.0020.0002.2389] # CIRCLED HORIZONTAL BAR WITH NOTCH
+238A ; [*06AD.0020.0002.238A] # CIRCLED TRIANGLE DOWN
+238B ; [*06AE.0020.0002.238B] # BROKEN CIRCLE WITH NORTHWEST ARROW
+238C ; [*06AF.0020.0002.238C] # UNDO SYMBOL
+238D ; [*06B0.0020.0002.238D] # MONOSTABLE SYMBOL
+238E ; [*06B1.0020.0002.238E] # HYSTERESIS SYMBOL
+238F ; [*06B2.0020.0002.238F] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390 ; [*06B3.0020.0002.2390] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391 ; [*06B4.0020.0002.2391] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392 ; [*06B5.0020.0002.2392] # PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393 ; [*06B6.0020.0002.2393] # DIRECT CURRENT SYMBOL FORM TWO
+2394 ; [*06B7.0020.0002.2394] # SOFTWARE-FUNCTION SYMBOL
+2395 ; [*06B8.0020.0002.2395] # APL FUNCTIONAL SYMBOL QUAD
+2396 ; [*06B9.0020.0002.2396] # DECIMAL SEPARATOR KEY SYMBOL
+2397 ; [*06BA.0020.0002.2397] # PREVIOUS PAGE
+2398 ; [*06BB.0020.0002.2398] # NEXT PAGE
+2399 ; [*06BC.0020.0002.2399] # PRINT SCREEN SYMBOL
+239A ; [*06BD.0020.0002.239A] # CLEAR SCREEN SYMBOL
+239B ; [*06BE.0020.0002.239B] # LEFT PARENTHESIS UPPER HOOK
+239C ; [*06BF.0020.0002.239C] # LEFT PARENTHESIS EXTENSION
+239D ; [*06C0.0020.0002.239D] # LEFT PARENTHESIS LOWER HOOK
+239E ; [*06C1.0020.0002.239E] # RIGHT PARENTHESIS UPPER HOOK
+239F ; [*06C2.0020.0002.239F] # RIGHT PARENTHESIS EXTENSION
+23A0 ; [*06C3.0020.0002.23A0] # RIGHT PARENTHESIS LOWER HOOK
+23A1 ; [*06C4.0020.0002.23A1] # LEFT SQUARE BRACKET UPPER CORNER
+23A2 ; [*06C5.0020.0002.23A2] # LEFT SQUARE BRACKET EXTENSION
+23A3 ; [*06C6.0020.0002.23A3] # LEFT SQUARE BRACKET LOWER CORNER
+23A4 ; [*06C7.0020.0002.23A4] # RIGHT SQUARE BRACKET UPPER CORNER
+23A5 ; [*06C8.0020.0002.23A5] # RIGHT SQUARE BRACKET EXTENSION
+23A6 ; [*06C9.0020.0002.23A6] # RIGHT SQUARE BRACKET LOWER CORNER
+23A7 ; [*06CA.0020.0002.23A7] # LEFT CURLY BRACKET UPPER HOOK
+23A8 ; [*06CB.0020.0002.23A8] # LEFT CURLY BRACKET MIDDLE PIECE
+23A9 ; [*06CC.0020.0002.23A9] # LEFT CURLY BRACKET LOWER HOOK
+23AA ; [*06CD.0020.0002.23AA] # CURLY BRACKET EXTENSION
+23AB ; [*06CE.0020.0002.23AB] # RIGHT CURLY BRACKET UPPER HOOK
+23AC ; [*06CF.0020.0002.23AC] # RIGHT CURLY BRACKET MIDDLE PIECE
+23AD ; [*06D0.0020.0002.23AD] # RIGHT CURLY BRACKET LOWER HOOK
+23AE ; [*06D1.0020.0002.23AE] # INTEGRAL EXTENSION
+23AF ; [*06D2.0020.0002.23AF] # HORIZONTAL LINE EXTENSION
+23B0 ; [*06D3.0020.0002.23B0] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1 ; [*06D4.0020.0002.23B1] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2 ; [*06D5.0020.0002.23B2] # SUMMATION TOP
+23B3 ; [*06D6.0020.0002.23B3] # SUMMATION BOTTOM
+23B4 ; [*06D7.0020.0002.23B4] # TOP SQUARE BRACKET
+23B5 ; [*06D8.0020.0002.23B5] # BOTTOM SQUARE BRACKET
+23B6 ; [*06D9.0020.0002.23B6] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7 ; [*06DA.0020.0002.23B7] # RADICAL SYMBOL BOTTOM
+23B8 ; [*06DB.0020.0002.23B8] # LEFT VERTICAL BOX LINE
+23B9 ; [*06DC.0020.0002.23B9] # RIGHT VERTICAL BOX LINE
+23BA ; [*06DD.0020.0002.23BA] # HORIZONTAL SCAN LINE-1
+23BB ; [*06DE.0020.0002.23BB] # HORIZONTAL SCAN LINE-3
+23BC ; [*06DF.0020.0002.23BC] # HORIZONTAL SCAN LINE-7
+23BD ; [*06E0.0020.0002.23BD] # HORIZONTAL SCAN LINE-9
+23BE ; [*06E1.0020.0002.23BE] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF ; [*06E2.0020.0002.23BF] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0 ; [*06E3.0020.0002.23C0] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1 ; [*06E4.0020.0002.23C1] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2 ; [*06E5.0020.0002.23C2] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3 ; [*06E6.0020.0002.23C3] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4 ; [*06E7.0020.0002.23C4] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5 ; [*06E8.0020.0002.23C5] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6 ; [*06E9.0020.0002.23C6] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7 ; [*06EA.0020.0002.23C7] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8 ; [*06EB.0020.0002.23C8] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9 ; [*06EC.0020.0002.23C9] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA ; [*06ED.0020.0002.23CA] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB ; [*06EE.0020.0002.23CB] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC ; [*06EF.0020.0002.23CC] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD ; [*06F0.0020.0002.23CD] # SQUARE FOOT
+23CE ; [*06F1.0020.0002.23CE] # RETURN SYMBOL
+23CF ; [*06F2.0020.0002.23CF] # EJECT SYMBOL
+23D0 ; [*06F3.0020.0002.23D0] # VERTICAL LINE EXTENSION
+23D1 ; [*06F4.0020.0002.23D1] # METRICAL BREVE
+23D2 ; [*06F5.0020.0002.23D2] # METRICAL LONG OVER SHORT
+23D3 ; [*06F6.0020.0002.23D3] # METRICAL SHORT OVER LONG
+23D4 ; [*06F7.0020.0002.23D4] # METRICAL LONG OVER TWO SHORTS
+23D5 ; [*06F8.0020.0002.23D5] # METRICAL TWO SHORTS OVER LONG
+23D6 ; [*06F9.0020.0002.23D6] # METRICAL TWO SHORTS JOINED
+23D7 ; [*06FA.0020.0002.23D7] # METRICAL TRISEME
+23D8 ; [*06FB.0020.0002.23D8] # METRICAL TETRASEME
+23D9 ; [*06FC.0020.0002.23D9] # METRICAL PENTASEME
+23DA ; [*06FD.0020.0002.23DA] # EARTH GROUND
+23DB ; [*06FE.0020.0002.23DB] # FUSE
+23DC ; [*06FF.0020.0002.23DC] # TOP PARENTHESIS
+23DD ; [*0700.0020.0002.23DD] # BOTTOM PARENTHESIS
+23DE ; [*0701.0020.0002.23DE] # TOP CURLY BRACKET
+23DF ; [*0702.0020.0002.23DF] # BOTTOM CURLY BRACKET
+23E0 ; [*0703.0020.0002.23E0] # TOP TORTOISE SHELL BRACKET
+23E1 ; [*0704.0020.0002.23E1] # BOTTOM TORTOISE SHELL BRACKET
+23E2 ; [*0705.0020.0002.23E2] # WHITE TRAPEZIUM
+23E3 ; [*0706.0020.0002.23E3] # BENZENE RING WITH CIRCLE
+23E4 ; [*0707.0020.0002.23E4] # STRAIGHTNESS
+23E5 ; [*0708.0020.0002.23E5] # FLATNESS
+23E6 ; [*0709.0020.0002.23E6] # AC CURRENT
+23E7 ; [*070A.0020.0002.23E7] # ELECTRICAL INTERSECTION
+23E8 ; [*070B.0020.0002.23E8] # DECIMAL EXPONENT SYMBOL
+2400 ; [*070C.0020.0002.2400] # SYMBOL FOR NULL
+2401 ; [*070D.0020.0002.2401] # SYMBOL FOR START OF HEADING
+2402 ; [*070E.0020.0002.2402] # SYMBOL FOR START OF TEXT
+2403 ; [*070F.0020.0002.2403] # SYMBOL FOR END OF TEXT
+2404 ; [*0710.0020.0002.2404] # SYMBOL FOR END OF TRANSMISSION
+2405 ; [*0711.0020.0002.2405] # SYMBOL FOR ENQUIRY
+2406 ; [*0712.0020.0002.2406] # SYMBOL FOR ACKNOWLEDGE
+2407 ; [*0713.0020.0002.2407] # SYMBOL FOR BELL
+2408 ; [*0714.0020.0002.2408] # SYMBOL FOR BACKSPACE
+2409 ; [*0715.0020.0002.2409] # SYMBOL FOR HORIZONTAL TABULATION
+240A ; [*0716.0020.0002.240A] # SYMBOL FOR LINE FEED
+240B ; [*0717.0020.0002.240B] # SYMBOL FOR VERTICAL TABULATION
+240C ; [*0718.0020.0002.240C] # SYMBOL FOR FORM FEED
+240D ; [*0719.0020.0002.240D] # SYMBOL FOR CARRIAGE RETURN
+240E ; [*071A.0020.0002.240E] # SYMBOL FOR SHIFT OUT
+240F ; [*071B.0020.0002.240F] # SYMBOL FOR SHIFT IN
+2410 ; [*071C.0020.0002.2410] # SYMBOL FOR DATA LINK ESCAPE
+2411 ; [*071D.0020.0002.2411] # SYMBOL FOR DEVICE CONTROL ONE
+2412 ; [*071E.0020.0002.2412] # SYMBOL FOR DEVICE CONTROL TWO
+2413 ; [*071F.0020.0002.2413] # SYMBOL FOR DEVICE CONTROL THREE
+2414 ; [*0720.0020.0002.2414] # SYMBOL FOR DEVICE CONTROL FOUR
+2415 ; [*0721.0020.0002.2415] # SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416 ; [*0722.0020.0002.2416] # SYMBOL FOR SYNCHRONOUS IDLE
+2417 ; [*0723.0020.0002.2417] # SYMBOL FOR END OF TRANSMISSION BLOCK
+2418 ; [*0724.0020.0002.2418] # SYMBOL FOR CANCEL
+2419 ; [*0725.0020.0002.2419] # SYMBOL FOR END OF MEDIUM
+241A ; [*0726.0020.0002.241A] # SYMBOL FOR SUBSTITUTE
+241B ; [*0727.0020.0002.241B] # SYMBOL FOR ESCAPE
+241C ; [*0728.0020.0002.241C] # SYMBOL FOR FILE SEPARATOR
+241D ; [*0729.0020.0002.241D] # SYMBOL FOR GROUP SEPARATOR
+241E ; [*072A.0020.0002.241E] # SYMBOL FOR RECORD SEPARATOR
+241F ; [*072B.0020.0002.241F] # SYMBOL FOR UNIT SEPARATOR
+2420 ; [*072C.0020.0002.2420] # SYMBOL FOR SPACE
+2421 ; [*072D.0020.0002.2421] # SYMBOL FOR DELETE
+2422 ; [*072E.0020.0002.2422] # BLANK SYMBOL
+2423 ; [*072F.0020.0002.2423] # OPEN BOX
+2424 ; [*0730.0020.0002.2424] # SYMBOL FOR NEWLINE
+2425 ; [*0731.0020.0002.2425] # SYMBOL FOR DELETE FORM TWO
+2426 ; [*0732.0020.0002.2426] # SYMBOL FOR SUBSTITUTE FORM TWO
+2440 ; [*0733.0020.0002.2440] # OCR HOOK
+2441 ; [*0734.0020.0002.2441] # OCR CHAIR
+2442 ; [*0735.0020.0002.2442] # OCR FORK
+2443 ; [*0736.0020.0002.2443] # OCR INVERTED FORK
+2444 ; [*0737.0020.0002.2444] # OCR BELT BUCKLE
+2445 ; [*0738.0020.0002.2445] # OCR BOW TIE
+2446 ; [*0739.0020.0002.2446] # OCR BRANCH BANK IDENTIFICATION
+2447 ; [*073A.0020.0002.2447] # OCR AMOUNT OF CHECK
+2448 ; [*073B.0020.0002.2448] # OCR DASH
+2449 ; [*073C.0020.0002.2449] # OCR CUSTOMER ACCOUNT NUMBER
+244A ; [*073D.0020.0002.244A] # OCR DOUBLE BACKSLASH
+2500 ; [*073E.0020.0002.2500] # BOX DRAWINGS LIGHT HORIZONTAL
+2501 ; [*073F.0020.0002.2501] # BOX DRAWINGS HEAVY HORIZONTAL
+2502 ; [*0740.0020.0002.2502] # BOX DRAWINGS LIGHT VERTICAL
+2503 ; [*0741.0020.0002.2503] # BOX DRAWINGS HEAVY VERTICAL
+2504 ; [*0742.0020.0002.2504] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505 ; [*0743.0020.0002.2505] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506 ; [*0744.0020.0002.2506] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507 ; [*0745.0020.0002.2507] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508 ; [*0746.0020.0002.2508] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509 ; [*0747.0020.0002.2509] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A ; [*0748.0020.0002.250A] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B ; [*0749.0020.0002.250B] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C ; [*074A.0020.0002.250C] # BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D ; [*074B.0020.0002.250D] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E ; [*074C.0020.0002.250E] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F ; [*074D.0020.0002.250F] # BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510 ; [*074E.0020.0002.2510] # BOX DRAWINGS LIGHT DOWN AND LEFT
+2511 ; [*074F.0020.0002.2511] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512 ; [*0750.0020.0002.2512] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513 ; [*0751.0020.0002.2513] # BOX DRAWINGS HEAVY DOWN AND LEFT
+2514 ; [*0752.0020.0002.2514] # BOX DRAWINGS LIGHT UP AND RIGHT
+2515 ; [*0753.0020.0002.2515] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516 ; [*0754.0020.0002.2516] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517 ; [*0755.0020.0002.2517] # BOX DRAWINGS HEAVY UP AND RIGHT
+2518 ; [*0756.0020.0002.2518] # BOX DRAWINGS LIGHT UP AND LEFT
+2519 ; [*0757.0020.0002.2519] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A ; [*0758.0020.0002.251A] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B ; [*0759.0020.0002.251B] # BOX DRAWINGS HEAVY UP AND LEFT
+251C ; [*075A.0020.0002.251C] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D ; [*075B.0020.0002.251D] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E ; [*075C.0020.0002.251E] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F ; [*075D.0020.0002.251F] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520 ; [*075E.0020.0002.2520] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521 ; [*075F.0020.0002.2521] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522 ; [*0760.0020.0002.2522] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523 ; [*0761.0020.0002.2523] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524 ; [*0762.0020.0002.2524] # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525 ; [*0763.0020.0002.2525] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526 ; [*0764.0020.0002.2526] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527 ; [*0765.0020.0002.2527] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528 ; [*0766.0020.0002.2528] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529 ; [*0767.0020.0002.2529] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A ; [*0768.0020.0002.252A] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B ; [*0769.0020.0002.252B] # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C ; [*076A.0020.0002.252C] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D ; [*076B.0020.0002.252D] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E ; [*076C.0020.0002.252E] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F ; [*076D.0020.0002.252F] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530 ; [*076E.0020.0002.2530] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531 ; [*076F.0020.0002.2531] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532 ; [*0770.0020.0002.2532] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533 ; [*0771.0020.0002.2533] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534 ; [*0772.0020.0002.2534] # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535 ; [*0773.0020.0002.2535] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536 ; [*0774.0020.0002.2536] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537 ; [*0775.0020.0002.2537] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538 ; [*0776.0020.0002.2538] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539 ; [*0777.0020.0002.2539] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A ; [*0778.0020.0002.253A] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B ; [*0779.0020.0002.253B] # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C ; [*077A.0020.0002.253C] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D ; [*077B.0020.0002.253D] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E ; [*077C.0020.0002.253E] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F ; [*077D.0020.0002.253F] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540 ; [*077E.0020.0002.2540] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541 ; [*077F.0020.0002.2541] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542 ; [*0780.0020.0002.2542] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543 ; [*0781.0020.0002.2543] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544 ; [*0782.0020.0002.2544] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545 ; [*0783.0020.0002.2545] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546 ; [*0784.0020.0002.2546] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547 ; [*0785.0020.0002.2547] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548 ; [*0786.0020.0002.2548] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549 ; [*0787.0020.0002.2549] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A ; [*0788.0020.0002.254A] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B ; [*0789.0020.0002.254B] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C ; [*078A.0020.0002.254C] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D ; [*078B.0020.0002.254D] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E ; [*078C.0020.0002.254E] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F ; [*078D.0020.0002.254F] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550 ; [*078E.0020.0002.2550] # BOX DRAWINGS DOUBLE HORIZONTAL
+2551 ; [*078F.0020.0002.2551] # BOX DRAWINGS DOUBLE VERTICAL
+2552 ; [*0790.0020.0002.2552] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553 ; [*0791.0020.0002.2553] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554 ; [*0792.0020.0002.2554] # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555 ; [*0793.0020.0002.2555] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556 ; [*0794.0020.0002.2556] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557 ; [*0795.0020.0002.2557] # BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558 ; [*0796.0020.0002.2558] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559 ; [*0797.0020.0002.2559] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A ; [*0798.0020.0002.255A] # BOX DRAWINGS DOUBLE UP AND RIGHT
+255B ; [*0799.0020.0002.255B] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C ; [*079A.0020.0002.255C] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D ; [*079B.0020.0002.255D] # BOX DRAWINGS DOUBLE UP AND LEFT
+255E ; [*079C.0020.0002.255E] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F ; [*079D.0020.0002.255F] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560 ; [*079E.0020.0002.2560] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561 ; [*079F.0020.0002.2561] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562 ; [*07A0.0020.0002.2562] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563 ; [*07A1.0020.0002.2563] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564 ; [*07A2.0020.0002.2564] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565 ; [*07A3.0020.0002.2565] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566 ; [*07A4.0020.0002.2566] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567 ; [*07A5.0020.0002.2567] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568 ; [*07A6.0020.0002.2568] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569 ; [*07A7.0020.0002.2569] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A ; [*07A8.0020.0002.256A] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B ; [*07A9.0020.0002.256B] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C ; [*07AA.0020.0002.256C] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D ; [*07AB.0020.0002.256D] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E ; [*07AC.0020.0002.256E] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F ; [*07AD.0020.0002.256F] # BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570 ; [*07AE.0020.0002.2570] # BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571 ; [*07AF.0020.0002.2571] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572 ; [*07B0.0020.0002.2572] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573 ; [*07B1.0020.0002.2573] # BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574 ; [*07B2.0020.0002.2574] # BOX DRAWINGS LIGHT LEFT
+2575 ; [*07B3.0020.0002.2575] # BOX DRAWINGS LIGHT UP
+2576 ; [*07B4.0020.0002.2576] # BOX DRAWINGS LIGHT RIGHT
+2577 ; [*07B5.0020.0002.2577] # BOX DRAWINGS LIGHT DOWN
+2578 ; [*07B6.0020.0002.2578] # BOX DRAWINGS HEAVY LEFT
+2579 ; [*07B7.0020.0002.2579] # BOX DRAWINGS HEAVY UP
+257A ; [*07B8.0020.0002.257A] # BOX DRAWINGS HEAVY RIGHT
+257B ; [*07B9.0020.0002.257B] # BOX DRAWINGS HEAVY DOWN
+257C ; [*07BA.0020.0002.257C] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D ; [*07BB.0020.0002.257D] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E ; [*07BC.0020.0002.257E] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F ; [*07BD.0020.0002.257F] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580 ; [*07BE.0020.0002.2580] # UPPER HALF BLOCK
+2581 ; [*07BF.0020.0002.2581] # LOWER ONE EIGHTH BLOCK
+2582 ; [*07C0.0020.0002.2582] # LOWER ONE QUARTER BLOCK
+2583 ; [*07C1.0020.0002.2583] # LOWER THREE EIGHTHS BLOCK
+2584 ; [*07C2.0020.0002.2584] # LOWER HALF BLOCK
+2585 ; [*07C3.0020.0002.2585] # LOWER FIVE EIGHTHS BLOCK
+2586 ; [*07C4.0020.0002.2586] # LOWER THREE QUARTERS BLOCK
+2587 ; [*07C5.0020.0002.2587] # LOWER SEVEN EIGHTHS BLOCK
+2588 ; [*07C6.0020.0002.2588] # FULL BLOCK
+2589 ; [*07C7.0020.0002.2589] # LEFT SEVEN EIGHTHS BLOCK
+258A ; [*07C8.0020.0002.258A] # LEFT THREE QUARTERS BLOCK
+258B ; [*07C9.0020.0002.258B] # LEFT FIVE EIGHTHS BLOCK
+258C ; [*07CA.0020.0002.258C] # LEFT HALF BLOCK
+258D ; [*07CB.0020.0002.258D] # LEFT THREE EIGHTHS BLOCK
+258E ; [*07CC.0020.0002.258E] # LEFT ONE QUARTER BLOCK
+258F ; [*07CD.0020.0002.258F] # LEFT ONE EIGHTH BLOCK
+2590 ; [*07CE.0020.0002.2590] # RIGHT HALF BLOCK
+2591 ; [*07CF.0020.0002.2591] # LIGHT SHADE
+2592 ; [*07D0.0020.0002.2592] # MEDIUM SHADE
+2593 ; [*07D1.0020.0002.2593] # DARK SHADE
+2594 ; [*07D2.0020.0002.2594] # UPPER ONE EIGHTH BLOCK
+2595 ; [*07D3.0020.0002.2595] # RIGHT ONE EIGHTH BLOCK
+2596 ; [*07D4.0020.0002.2596] # QUADRANT LOWER LEFT
+2597 ; [*07D5.0020.0002.2597] # QUADRANT LOWER RIGHT
+2598 ; [*07D6.0020.0002.2598] # QUADRANT UPPER LEFT
+2599 ; [*07D7.0020.0002.2599] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A ; [*07D8.0020.0002.259A] # QUADRANT UPPER LEFT AND LOWER RIGHT
+259B ; [*07D9.0020.0002.259B] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C ; [*07DA.0020.0002.259C] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D ; [*07DB.0020.0002.259D] # QUADRANT UPPER RIGHT
+259E ; [*07DC.0020.0002.259E] # QUADRANT UPPER RIGHT AND LOWER LEFT
+259F ; [*07DD.0020.0002.259F] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0 ; [*07DE.0020.0002.25A0] # BLACK SQUARE
+25A1 ; [*07DF.0020.0002.25A1] # WHITE SQUARE
+25A2 ; [*07E0.0020.0002.25A2] # WHITE SQUARE WITH ROUNDED CORNERS
+25A3 ; [*07E1.0020.0002.25A3] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4 ; [*07E2.0020.0002.25A4] # SQUARE WITH HORIZONTAL FILL
+25A5 ; [*07E3.0020.0002.25A5] # SQUARE WITH VERTICAL FILL
+25A6 ; [*07E4.0020.0002.25A6] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7 ; [*07E5.0020.0002.25A7] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8 ; [*07E6.0020.0002.25A8] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9 ; [*07E7.0020.0002.25A9] # SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA ; [*07E8.0020.0002.25AA] # BLACK SMALL SQUARE
+25AB ; [*07E9.0020.0002.25AB] # WHITE SMALL SQUARE
+25AC ; [*07EA.0020.0002.25AC] # BLACK RECTANGLE
+25AD ; [*07EB.0020.0002.25AD] # WHITE RECTANGLE
+25AE ; [*07EC.0020.0002.25AE] # BLACK VERTICAL RECTANGLE
+25AF ; [*07ED.0020.0002.25AF] # WHITE VERTICAL RECTANGLE
+25B0 ; [*07EE.0020.0002.25B0] # BLACK PARALLELOGRAM
+25B1 ; [*07EF.0020.0002.25B1] # WHITE PARALLELOGRAM
+25B2 ; [*07F0.0020.0002.25B2] # BLACK UP-POINTING TRIANGLE
+25B3 ; [*07F1.0020.0002.25B3] # WHITE UP-POINTING TRIANGLE
+25B4 ; [*07F2.0020.0002.25B4] # BLACK UP-POINTING SMALL TRIANGLE
+25B5 ; [*07F3.0020.0002.25B5] # WHITE UP-POINTING SMALL TRIANGLE
+25B6 ; [*07F4.0020.0002.25B6] # BLACK RIGHT-POINTING TRIANGLE
+25B7 ; [*07F5.0020.0002.25B7] # WHITE RIGHT-POINTING TRIANGLE
+25B8 ; [*07F6.0020.0002.25B8] # BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9 ; [*07F7.0020.0002.25B9] # WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA ; [*07F8.0020.0002.25BA] # BLACK RIGHT-POINTING POINTER
+25BB ; [*07F9.0020.0002.25BB] # WHITE RIGHT-POINTING POINTER
+25BC ; [*07FA.0020.0002.25BC] # BLACK DOWN-POINTING TRIANGLE
+25BD ; [*07FB.0020.0002.25BD] # WHITE DOWN-POINTING TRIANGLE
+25BE ; [*07FC.0020.0002.25BE] # BLACK DOWN-POINTING SMALL TRIANGLE
+25BF ; [*07FD.0020.0002.25BF] # WHITE DOWN-POINTING SMALL TRIANGLE
+25C0 ; [*07FE.0020.0002.25C0] # BLACK LEFT-POINTING TRIANGLE
+25C1 ; [*07FF.0020.0002.25C1] # WHITE LEFT-POINTING TRIANGLE
+25C2 ; [*0800.0020.0002.25C2] # BLACK LEFT-POINTING SMALL TRIANGLE
+25C3 ; [*0801.0020.0002.25C3] # WHITE LEFT-POINTING SMALL TRIANGLE
+25C4 ; [*0802.0020.0002.25C4] # BLACK LEFT-POINTING POINTER
+25C5 ; [*0803.0020.0002.25C5] # WHITE LEFT-POINTING POINTER
+25C6 ; [*0804.0020.0002.25C6] # BLACK DIAMOND
+25C7 ; [*0805.0020.0002.25C7] # WHITE DIAMOND
+25C8 ; [*0806.0020.0002.25C8] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9 ; [*0807.0020.0002.25C9] # FISHEYE
+25CA ; [*0808.0020.0002.25CA] # LOZENGE
+25CB ; [*0809.0020.0002.25CB] # WHITE CIRCLE
+25CC ; [*080A.0020.0002.25CC] # DOTTED CIRCLE
+25CD ; [*080B.0020.0002.25CD] # CIRCLE WITH VERTICAL FILL
+25CE ; [*080C.0020.0002.25CE] # BULLSEYE
+25CF ; [*080D.0020.0002.25CF] # BLACK CIRCLE
+25D0 ; [*080E.0020.0002.25D0] # CIRCLE WITH LEFT HALF BLACK
+25D1 ; [*080F.0020.0002.25D1] # CIRCLE WITH RIGHT HALF BLACK
+25D2 ; [*0810.0020.0002.25D2] # CIRCLE WITH LOWER HALF BLACK
+25D3 ; [*0811.0020.0002.25D3] # CIRCLE WITH UPPER HALF BLACK
+25D4 ; [*0812.0020.0002.25D4] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5 ; [*0813.0020.0002.25D5] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6 ; [*0814.0020.0002.25D6] # LEFT HALF BLACK CIRCLE
+25D7 ; [*0815.0020.0002.25D7] # RIGHT HALF BLACK CIRCLE
+25D8 ; [*0816.0020.0002.25D8] # INVERSE BULLET
+25D9 ; [*0817.0020.0002.25D9] # INVERSE WHITE CIRCLE
+25DA ; [*0818.0020.0002.25DA] # UPPER HALF INVERSE WHITE CIRCLE
+25DB ; [*0819.0020.0002.25DB] # LOWER HALF INVERSE WHITE CIRCLE
+25DC ; [*081A.0020.0002.25DC] # UPPER LEFT QUADRANT CIRCULAR ARC
+25DD ; [*081B.0020.0002.25DD] # UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE ; [*081C.0020.0002.25DE] # LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF ; [*081D.0020.0002.25DF] # LOWER LEFT QUADRANT CIRCULAR ARC
+25E0 ; [*081E.0020.0002.25E0] # UPPER HALF CIRCLE
+25E1 ; [*081F.0020.0002.25E1] # LOWER HALF CIRCLE
+25E2 ; [*0820.0020.0002.25E2] # BLACK LOWER RIGHT TRIANGLE
+25E3 ; [*0821.0020.0002.25E3] # BLACK LOWER LEFT TRIANGLE
+25E4 ; [*0822.0020.0002.25E4] # BLACK UPPER LEFT TRIANGLE
+25E5 ; [*0823.0020.0002.25E5] # BLACK UPPER RIGHT TRIANGLE
+25E6 ; [*0824.0020.0002.25E6] # WHITE BULLET
+25E7 ; [*0825.0020.0002.25E7] # SQUARE WITH LEFT HALF BLACK
+25E8 ; [*0826.0020.0002.25E8] # SQUARE WITH RIGHT HALF BLACK
+25E9 ; [*0827.0020.0002.25E9] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA ; [*0828.0020.0002.25EA] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB ; [*0829.0020.0002.25EB] # WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC ; [*082A.0020.0002.25EC] # WHITE UP-POINTING TRIANGLE WITH DOT
+25ED ; [*082B.0020.0002.25ED] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE ; [*082C.0020.0002.25EE] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF ; [*082D.0020.0002.25EF] # LARGE CIRCLE
+25F0 ; [*082E.0020.0002.25F0] # WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1 ; [*082F.0020.0002.25F1] # WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2 ; [*0830.0020.0002.25F2] # WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3 ; [*0831.0020.0002.25F3] # WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4 ; [*0832.0020.0002.25F4] # WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5 ; [*0833.0020.0002.25F5] # WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6 ; [*0834.0020.0002.25F6] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7 ; [*0835.0020.0002.25F7] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8 ; [*0836.0020.0002.25F8] # UPPER LEFT TRIANGLE
+25F9 ; [*0837.0020.0002.25F9] # UPPER RIGHT TRIANGLE
+25FA ; [*0838.0020.0002.25FA] # LOWER LEFT TRIANGLE
+25FB ; [*0839.0020.0002.25FB] # WHITE MEDIUM SQUARE
+25FC ; [*083A.0020.0002.25FC] # BLACK MEDIUM SQUARE
+25FD ; [*083B.0020.0002.25FD] # WHITE MEDIUM SMALL SQUARE
+25FE ; [*083C.0020.0002.25FE] # BLACK MEDIUM SMALL SQUARE
+25FF ; [*083D.0020.0002.25FF] # LOWER RIGHT TRIANGLE
+2600 ; [*083E.0020.0002.2600] # BLACK SUN WITH RAYS
+2601 ; [*083F.0020.0002.2601] # CLOUD
+2602 ; [*0840.0020.0002.2602] # UMBRELLA
+2603 ; [*0841.0020.0002.2603] # SNOWMAN
+2604 ; [*0842.0020.0002.2604] # COMET
+2605 ; [*0843.0020.0002.2605] # BLACK STAR
+2606 ; [*0844.0020.0002.2606] # WHITE STAR
+2607 ; [*0845.0020.0002.2607] # LIGHTNING
+2608 ; [*0846.0020.0002.2608] # THUNDERSTORM
+2609 ; [*0847.0020.0002.2609] # SUN
+260A ; [*0848.0020.0002.260A] # ASCENDING NODE
+260B ; [*0849.0020.0002.260B] # DESCENDING NODE
+260C ; [*084A.0020.0002.260C] # CONJUNCTION
+260D ; [*084B.0020.0002.260D] # OPPOSITION
+260E ; [*084C.0020.0002.260E] # BLACK TELEPHONE
+260F ; [*084D.0020.0002.260F] # WHITE TELEPHONE
+2610 ; [*084E.0020.0002.2610] # BALLOT BOX
+2611 ; [*084F.0020.0002.2611] # BALLOT BOX WITH CHECK
+2612 ; [*0850.0020.0002.2612] # BALLOT BOX WITH X
+2613 ; [*0851.0020.0002.2613] # SALTIRE
+2614 ; [*0852.0020.0002.2614] # UMBRELLA WITH RAIN DROPS
+2615 ; [*0853.0020.0002.2615] # HOT BEVERAGE
+2616 ; [*0854.0020.0002.2616] # WHITE SHOGI PIECE
+2617 ; [*0855.0020.0002.2617] # BLACK SHOGI PIECE
+2618 ; [*0856.0020.0002.2618] # SHAMROCK
+2619 ; [*0857.0020.0002.2619] # REVERSED ROTATED FLORAL HEART BULLET
+261A ; [*0858.0020.0002.261A] # BLACK LEFT POINTING INDEX
+261B ; [*0859.0020.0002.261B] # BLACK RIGHT POINTING INDEX
+261C ; [*085A.0020.0002.261C] # WHITE LEFT POINTING INDEX
+261D ; [*085B.0020.0002.261D] # WHITE UP POINTING INDEX
+261E ; [*085C.0020.0002.261E] # WHITE RIGHT POINTING INDEX
+261F ; [*085D.0020.0002.261F] # WHITE DOWN POINTING INDEX
+2620 ; [*085E.0020.0002.2620] # SKULL AND CROSSBONES
+2621 ; [*085F.0020.0002.2621] # CAUTION SIGN
+2622 ; [*0860.0020.0002.2622] # RADIOACTIVE SIGN
+2623 ; [*0861.0020.0002.2623] # BIOHAZARD SIGN
+2624 ; [*0862.0020.0002.2624] # CADUCEUS
+2625 ; [*0863.0020.0002.2625] # ANKH
+2626 ; [*0864.0020.0002.2626] # ORTHODOX CROSS
+2627 ; [*0865.0020.0002.2627] # CHI RHO
+2628 ; [*0866.0020.0002.2628] # CROSS OF LORRAINE
+2629 ; [*0867.0020.0002.2629] # CROSS OF JERUSALEM
+262A ; [*0868.0020.0002.262A] # STAR AND CRESCENT
+262B ; [*0869.0020.0002.262B] # FARSI SYMBOL
+262C ; [*086A.0020.0002.262C] # ADI SHAKTI
+262D ; [*086B.0020.0002.262D] # HAMMER AND SICKLE
+262E ; [*086C.0020.0002.262E] # PEACE SYMBOL
+262F ; [*086D.0020.0002.262F] # YIN YANG
+2630 ; [*0D36.0020.0002.2630] # TRIGRAM FOR HEAVEN
+2631 ; [*0D37.0020.0002.2631] # TRIGRAM FOR LAKE
+2632 ; [*0D38.0020.0002.2632] # TRIGRAM FOR FIRE
+2633 ; [*0D39.0020.0002.2633] # TRIGRAM FOR THUNDER
+2634 ; [*0D3A.0020.0002.2634] # TRIGRAM FOR WIND
+2635 ; [*0D3B.0020.0002.2635] # TRIGRAM FOR WATER
+2636 ; [*0D3C.0020.0002.2636] # TRIGRAM FOR MOUNTAIN
+2637 ; [*0D3D.0020.0002.2637] # TRIGRAM FOR EARTH
+2638 ; [*086E.0020.0002.2638] # WHEEL OF DHARMA
+2639 ; [*086F.0020.0002.2639] # WHITE FROWNING FACE
+263A ; [*0870.0020.0002.263A] # WHITE SMILING FACE
+263B ; [*0871.0020.0002.263B] # BLACK SMILING FACE
+263C ; [*0872.0020.0002.263C] # WHITE SUN WITH RAYS
+263D ; [*0873.0020.0002.263D] # FIRST QUARTER MOON
+263E ; [*0874.0020.0002.263E] # LAST QUARTER MOON
+263F ; [*0875.0020.0002.263F] # MERCURY
+2640 ; [*0876.0020.0002.2640] # FEMALE SIGN
+2641 ; [*0877.0020.0002.2641] # EARTH
+2642 ; [*0878.0020.0002.2642] # MALE SIGN
+2643 ; [*0879.0020.0002.2643] # JUPITER
+2644 ; [*087A.0020.0002.2644] # SATURN
+2645 ; [*087B.0020.0002.2645] # URANUS
+2646 ; [*087C.0020.0002.2646] # NEPTUNE
+2647 ; [*087D.0020.0002.2647] # PLUTO
+2648 ; [*087E.0020.0002.2648] # ARIES
+2649 ; [*087F.0020.0002.2649] # TAURUS
+264A ; [*0880.0020.0002.264A] # GEMINI
+264B ; [*0881.0020.0002.264B] # CANCER
+264C ; [*0882.0020.0002.264C] # LEO
+264D ; [*0883.0020.0002.264D] # VIRGO
+264E ; [*0884.0020.0002.264E] # LIBRA
+264F ; [*0885.0020.0002.264F] # SCORPIUS
+2650 ; [*0886.0020.0002.2650] # SAGITTARIUS
+2651 ; [*0887.0020.0002.2651] # CAPRICORN
+2652 ; [*0888.0020.0002.2652] # AQUARIUS
+2653 ; [*0889.0020.0002.2653] # PISCES
+2654 ; [*088A.0020.0002.2654] # WHITE CHESS KING
+2655 ; [*088B.0020.0002.2655] # WHITE CHESS QUEEN
+2656 ; [*088C.0020.0002.2656] # WHITE CHESS ROOK
+2657 ; [*088D.0020.0002.2657] # WHITE CHESS BISHOP
+2658 ; [*088E.0020.0002.2658] # WHITE CHESS KNIGHT
+2659 ; [*088F.0020.0002.2659] # WHITE CHESS PAWN
+265A ; [*0890.0020.0002.265A] # BLACK CHESS KING
+265B ; [*0891.0020.0002.265B] # BLACK CHESS QUEEN
+265C ; [*0892.0020.0002.265C] # BLACK CHESS ROOK
+265D ; [*0893.0020.0002.265D] # BLACK CHESS BISHOP
+265E ; [*0894.0020.0002.265E] # BLACK CHESS KNIGHT
+265F ; [*0895.0020.0002.265F] # BLACK CHESS PAWN
+2660 ; [*0896.0020.0002.2660] # BLACK SPADE SUIT
+2661 ; [*0897.0020.0002.2661] # WHITE HEART SUIT
+2662 ; [*0898.0020.0002.2662] # WHITE DIAMOND SUIT
+2663 ; [*0899.0020.0002.2663] # BLACK CLUB SUIT
+2664 ; [*089A.0020.0002.2664] # WHITE SPADE SUIT
+2665 ; [*089B.0020.0002.2665] # BLACK HEART SUIT
+2666 ; [*089C.0020.0002.2666] # BLACK DIAMOND SUIT
+2667 ; [*089D.0020.0002.2667] # WHITE CLUB SUIT
+2668 ; [*089E.0020.0002.2668] # HOT SPRINGS
+2669 ; [*089F.0020.0002.2669] # QUARTER NOTE
+266A ; [*08A0.0020.0002.266A] # EIGHTH NOTE
+266B ; [*08A1.0020.0002.266B] # BEAMED EIGHTH NOTES
+266C ; [*08A2.0020.0002.266C] # BEAMED SIXTEENTH NOTES
+266D ; [*0F7C.0020.0002.266D] # MUSIC FLAT SIGN
+266E ; [*0F7D.0020.0002.266E] # MUSIC NATURAL SIGN
+266F ; [*0F7E.0020.0002.266F] # MUSIC SHARP SIGN
+2670 ; [*08A3.0020.0002.2670] # WEST SYRIAC CROSS
+2671 ; [*08A4.0020.0002.2671] # EAST SYRIAC CROSS
+2672 ; [*08A5.0020.0002.2672] # UNIVERSAL RECYCLING SYMBOL
+2673 ; [*08A6.0020.0002.2673] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674 ; [*08A7.0020.0002.2674] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675 ; [*08A8.0020.0002.2675] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676 ; [*08A9.0020.0002.2676] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677 ; [*08AA.0020.0002.2677] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678 ; [*08AB.0020.0002.2678] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679 ; [*08AC.0020.0002.2679] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A ; [*08AD.0020.0002.267A] # RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B ; [*08AE.0020.0002.267B] # BLACK UNIVERSAL RECYCLING SYMBOL
+267C ; [*08AF.0020.0002.267C] # RECYCLED PAPER SYMBOL
+267D ; [*08B0.0020.0002.267D] # PARTIALLY-RECYCLED PAPER SYMBOL
+267E ; [*08B1.0020.0002.267E] # PERMANENT PAPER SIGN
+267F ; [*08B2.0020.0002.267F] # WHEELCHAIR SYMBOL
+2680 ; [*08B3.0020.0002.2680] # DIE FACE-1
+2681 ; [*08B4.0020.0002.2681] # DIE FACE-2
+2682 ; [*08B5.0020.0002.2682] # DIE FACE-3
+2683 ; [*08B6.0020.0002.2683] # DIE FACE-4
+2684 ; [*08B7.0020.0002.2684] # DIE FACE-5
+2685 ; [*08B8.0020.0002.2685] # DIE FACE-6
+2686 ; [*08B9.0020.0002.2686] # WHITE CIRCLE WITH DOT RIGHT
+2687 ; [*08BA.0020.0002.2687] # WHITE CIRCLE WITH TWO DOTS
+2688 ; [*08BB.0020.0002.2688] # BLACK CIRCLE WITH WHITE DOT RIGHT
+2689 ; [*08BC.0020.0002.2689] # BLACK CIRCLE WITH TWO WHITE DOTS
+268A ; [*0D30.0020.0002.268A] # MONOGRAM FOR YANG
+268B ; [*0D31.0020.0002.268B] # MONOGRAM FOR YIN
+268C ; [*0D32.0020.0002.268C] # DIGRAM FOR GREATER YANG
+268D ; [*0D33.0020.0002.268D] # DIGRAM FOR LESSER YIN
+268E ; [*0D34.0020.0002.268E] # DIGRAM FOR LESSER YANG
+268F ; [*0D35.0020.0002.268F] # DIGRAM FOR GREATER YIN
+2690 ; [*08BD.0020.0002.2690] # WHITE FLAG
+2691 ; [*08BE.0020.0002.2691] # BLACK FLAG
+2692 ; [*08BF.0020.0002.2692] # HAMMER AND PICK
+2693 ; [*08C0.0020.0002.2693] # ANCHOR
+2694 ; [*08C1.0020.0002.2694] # CROSSED SWORDS
+2695 ; [*08C2.0020.0002.2695] # STAFF OF AESCULAPIUS
+2696 ; [*08C3.0020.0002.2696] # SCALES
+2697 ; [*08C4.0020.0002.2697] # ALEMBIC
+2698 ; [*08C5.0020.0002.2698] # FLOWER
+2699 ; [*08C6.0020.0002.2699] # GEAR
+269A ; [*08C7.0020.0002.269A] # STAFF OF HERMES
+269B ; [*08C8.0020.0002.269B] # ATOM SYMBOL
+269C ; [*08C9.0020.0002.269C] # FLEUR-DE-LIS
+269D ; [*08CA.0020.0002.269D] # OUTLINED WHITE STAR
+269E ; [*08CB.0020.0002.269E] # THREE LINES CONVERGING RIGHT
+269F ; [*08CC.0020.0002.269F] # THREE LINES CONVERGING LEFT
+26A0 ; [*08CD.0020.0002.26A0] # WARNING SIGN
+26A1 ; [*08CE.0020.0002.26A1] # HIGH VOLTAGE SIGN
+26A2 ; [*08CF.0020.0002.26A2] # DOUBLED FEMALE SIGN
+26A3 ; [*08D0.0020.0002.26A3] # DOUBLED MALE SIGN
+26A4 ; [*08D1.0020.0002.26A4] # INTERLOCKED FEMALE AND MALE SIGN
+26A5 ; [*08D2.0020.0002.26A5] # MALE AND FEMALE SIGN
+26A6 ; [*08D3.0020.0002.26A6] # MALE WITH STROKE SIGN
+26A7 ; [*08D4.0020.0002.26A7] # MALE WITH STROKE AND MALE AND FEMALE SIGN
+26A8 ; [*08D5.0020.0002.26A8] # VERTICAL MALE WITH STROKE SIGN
+26A9 ; [*08D6.0020.0002.26A9] # HORIZONTAL MALE WITH STROKE SIGN
+26AA ; [*08D7.0020.0002.26AA] # MEDIUM WHITE CIRCLE
+26AB ; [*08D8.0020.0002.26AB] # MEDIUM BLACK CIRCLE
+26AC ; [*08D9.0020.0002.26AC] # MEDIUM SMALL WHITE CIRCLE
+26AD ; [*08DA.0020.0002.26AD] # MARRIAGE SYMBOL
+26AE ; [*08DB.0020.0002.26AE] # DIVORCE SYMBOL
+26AF ; [*08DC.0020.0002.26AF] # UNMARRIED PARTNERSHIP SYMBOL
+26B0 ; [*08DD.0020.0002.26B0] # COFFIN
+26B1 ; [*08DE.0020.0002.26B1] # FUNERAL URN
+26B2 ; [*08DF.0020.0002.26B2] # NEUTER
+26B3 ; [*08E0.0020.0002.26B3] # CERES
+26B4 ; [*08E1.0020.0002.26B4] # PALLAS
+26B5 ; [*08E2.0020.0002.26B5] # JUNO
+26B6 ; [*08E3.0020.0002.26B6] # VESTA
+26B7 ; [*08E4.0020.0002.26B7] # CHIRON
+26B8 ; [*08E5.0020.0002.26B8] # BLACK MOON LILITH
+26B9 ; [*08E6.0020.0002.26B9] # SEXTILE
+26BA ; [*08E7.0020.0002.26BA] # SEMISEXTILE
+26BB ; [*08E8.0020.0002.26BB] # QUINCUNX
+26BC ; [*08E9.0020.0002.26BC] # SESQUIQUADRATE
+26BD ; [*08EA.0020.0002.26BD] # SOCCER BALL
+26BE ; [*08EB.0020.0002.26BE] # BASEBALL
+26BF ; [*08EC.0020.0002.26BF] # SQUARED KEY
+26C0 ; [*08ED.0020.0002.26C0] # WHITE DRAUGHTS MAN
+26C1 ; [*08EE.0020.0002.26C1] # WHITE DRAUGHTS KING
+26C2 ; [*08EF.0020.0002.26C2] # BLACK DRAUGHTS MAN
+26C3 ; [*08F0.0020.0002.26C3] # BLACK DRAUGHTS KING
+26C4 ; [*08F1.0020.0002.26C4] # SNOWMAN WITHOUT SNOW
+26C5 ; [*08F2.0020.0002.26C5] # SUN BEHIND CLOUD
+26C6 ; [*08F3.0020.0002.26C6] # RAIN
+26C7 ; [*08F4.0020.0002.26C7] # BLACK SNOWMAN
+26C8 ; [*08F5.0020.0002.26C8] # THUNDER CLOUD AND RAIN
+26C9 ; [*08F6.0020.0002.26C9] # TURNED WHITE SHOGI PIECE
+26CA ; [*08F7.0020.0002.26CA] # TURNED BLACK SHOGI PIECE
+26CB ; [*08F8.0020.0002.26CB] # WHITE DIAMOND IN SQUARE
+26CC ; [*08F9.0020.0002.26CC] # CROSSING LANES
+26CD ; [*08FA.0020.0002.26CD] # DISABLED CAR
+26CF ; [*08FB.0020.0002.26CF] # PICK
+26D0 ; [*08FC.0020.0002.26D0] # CAR SLIDING
+26D1 ; [*08FD.0020.0002.26D1] # HELMET WITH WHITE CROSS
+26D2 ; [*08FE.0020.0002.26D2] # CIRCLED CROSSING LANES
+26D3 ; [*08FF.0020.0002.26D3] # CHAINS
+26D4 ; [*0900.0020.0002.26D4] # NO ENTRY
+26D5 ; [*0901.0020.0002.26D5] # ALTERNATE ONE-WAY LEFT WAY TRAFFIC
+26D6 ; [*0902.0020.0002.26D6] # BLACK TWO-WAY LEFT WAY TRAFFIC
+26D7 ; [*0903.0020.0002.26D7] # WHITE TWO-WAY LEFT WAY TRAFFIC
+26D8 ; [*0904.0020.0002.26D8] # BLACK LEFT LANE MERGE
+26D9 ; [*0905.0020.0002.26D9] # WHITE LEFT LANE MERGE
+26DA ; [*0906.0020.0002.26DA] # DRIVE SLOW SIGN
+26DB ; [*0907.0020.0002.26DB] # HEAVY WHITE DOWN-POINTING TRIANGLE
+26DC ; [*0908.0020.0002.26DC] # LEFT CLOSED ENTRY
+26DD ; [*0909.0020.0002.26DD] # SQUARED SALTIRE
+26DE ; [*090A.0020.0002.26DE] # FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE
+26DF ; [*090B.0020.0002.26DF] # BLACK TRUCK
+26E0 ; [*090C.0020.0002.26E0] # RESTRICTED LEFT ENTRY-1
+26E1 ; [*090D.0020.0002.26E1] # RESTRICTED LEFT ENTRY-2
+26E3 ; [*090E.0020.0002.26E3] # HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
+26E8 ; [*090F.0020.0002.26E8] # BLACK CROSS ON SHIELD
+26E9 ; [*0910.0020.0002.26E9] # SHINTO SHRINE
+26EA ; [*0911.0020.0002.26EA] # CHURCH
+26EB ; [*0912.0020.0002.26EB] # CASTLE
+26EC ; [*0913.0020.0002.26EC] # HISTORIC SITE
+26ED ; [*0914.0020.0002.26ED] # GEAR WITHOUT HUB
+26EE ; [*0915.0020.0002.26EE] # GEAR WITH HANDLES
+26EF ; [*0916.0020.0002.26EF] # MAP SYMBOL FOR LIGHTHOUSE
+26F0 ; [*0917.0020.0002.26F0] # MOUNTAIN
+26F1 ; [*0918.0020.0002.26F1] # UMBRELLA ON GROUND
+26F2 ; [*0919.0020.0002.26F2] # FOUNTAIN
+26F3 ; [*091A.0020.0002.26F3] # FLAG IN HOLE
+26F4 ; [*091B.0020.0002.26F4] # FERRY
+26F5 ; [*091C.0020.0002.26F5] # SAILBOAT
+26F6 ; [*091D.0020.0002.26F6] # SQUARE FOUR CORNERS
+26F7 ; [*091E.0020.0002.26F7] # SKIER
+26F8 ; [*091F.0020.0002.26F8] # ICE SKATE
+26F9 ; [*0920.0020.0002.26F9] # PERSON WITH BALL
+26FA ; [*0921.0020.0002.26FA] # TENT
+26FB ; [*0922.0020.0002.26FB] # JAPANESE BANK SYMBOL
+26FC ; [*0923.0020.0002.26FC] # HEADSTONE GRAVEYARD SYMBOL
+26FD ; [*0924.0020.0002.26FD] # FUEL PUMP
+26FE ; [*0925.0020.0002.26FE] # CUP ON BLACK SQUARE
+26FF ; [*0926.0020.0002.26FF] # WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
+2701 ; [*0927.0020.0002.2701] # UPPER BLADE SCISSORS
+2702 ; [*0928.0020.0002.2702] # BLACK SCISSORS
+2703 ; [*0929.0020.0002.2703] # LOWER BLADE SCISSORS
+2704 ; [*092A.0020.0002.2704] # WHITE SCISSORS
+2706 ; [*092B.0020.0002.2706] # TELEPHONE LOCATION SIGN
+2707 ; [*092C.0020.0002.2707] # TAPE DRIVE
+2708 ; [*092D.0020.0002.2708] # AIRPLANE
+2709 ; [*092E.0020.0002.2709] # ENVELOPE
+270C ; [*092F.0020.0002.270C] # VICTORY HAND
+270D ; [*0930.0020.0002.270D] # WRITING HAND
+270E ; [*0931.0020.0002.270E] # LOWER RIGHT PENCIL
+270F ; [*0932.0020.0002.270F] # PENCIL
+2710 ; [*0933.0020.0002.2710] # UPPER RIGHT PENCIL
+2711 ; [*0934.0020.0002.2711] # WHITE NIB
+2712 ; [*0935.0020.0002.2712] # BLACK NIB
+2713 ; [*0936.0020.0002.2713] # CHECK MARK
+2714 ; [*0937.0020.0002.2714] # HEAVY CHECK MARK
+2715 ; [*0938.0020.0002.2715] # MULTIPLICATION X
+2716 ; [*0939.0020.0002.2716] # HEAVY MULTIPLICATION X
+2717 ; [*093A.0020.0002.2717] # BALLOT X
+2718 ; [*093B.0020.0002.2718] # HEAVY BALLOT X
+2719 ; [*093C.0020.0002.2719] # OUTLINED GREEK CROSS
+271A ; [*093D.0020.0002.271A] # HEAVY GREEK CROSS
+271B ; [*093E.0020.0002.271B] # OPEN CENTRE CROSS
+271C ; [*093F.0020.0002.271C] # HEAVY OPEN CENTRE CROSS
+271D ; [*0940.0020.0002.271D] # LATIN CROSS
+271E ; [*0941.0020.0002.271E] # SHADOWED WHITE LATIN CROSS
+271F ; [*0942.0020.0002.271F] # OUTLINED LATIN CROSS
+2720 ; [*0943.0020.0002.2720] # MALTESE CROSS
+2721 ; [*0944.0020.0002.2721] # STAR OF DAVID
+2722 ; [*0945.0020.0002.2722] # FOUR TEARDROP-SPOKED ASTERISK
+2723 ; [*0946.0020.0002.2723] # FOUR BALLOON-SPOKED ASTERISK
+2724 ; [*0947.0020.0002.2724] # HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725 ; [*0948.0020.0002.2725] # FOUR CLUB-SPOKED ASTERISK
+2726 ; [*0949.0020.0002.2726] # BLACK FOUR POINTED STAR
+2727 ; [*094A.0020.0002.2727] # WHITE FOUR POINTED STAR
+2729 ; [*094B.0020.0002.2729] # STRESS OUTLINED WHITE STAR
+272A ; [*094C.0020.0002.272A] # CIRCLED WHITE STAR
+272B ; [*094D.0020.0002.272B] # OPEN CENTRE BLACK STAR
+272C ; [*094E.0020.0002.272C] # BLACK CENTRE WHITE STAR
+272D ; [*094F.0020.0002.272D] # OUTLINED BLACK STAR
+272E ; [*0950.0020.0002.272E] # HEAVY OUTLINED BLACK STAR
+272F ; [*0951.0020.0002.272F] # PINWHEEL STAR
+2730 ; [*0952.0020.0002.2730] # SHADOWED WHITE STAR
+2731 ; [*0953.0020.0002.2731] # HEAVY ASTERISK
+2732 ; [*0954.0020.0002.2732] # OPEN CENTRE ASTERISK
+2733 ; [*0955.0020.0002.2733] # EIGHT SPOKED ASTERISK
+2734 ; [*0956.0020.0002.2734] # EIGHT POINTED BLACK STAR
+2735 ; [*0957.0020.0002.2735] # EIGHT POINTED PINWHEEL STAR
+2736 ; [*0958.0020.0002.2736] # SIX POINTED BLACK STAR
+2737 ; [*0959.0020.0002.2737] # EIGHT POINTED RECTILINEAR BLACK STAR
+2738 ; [*095A.0020.0002.2738] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739 ; [*095B.0020.0002.2739] # TWELVE POINTED BLACK STAR
+273A ; [*095C.0020.0002.273A] # SIXTEEN POINTED ASTERISK
+273B ; [*095D.0020.0002.273B] # TEARDROP-SPOKED ASTERISK
+273C ; [*095E.0020.0002.273C] # OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D ; [*095F.0020.0002.273D] # HEAVY TEARDROP-SPOKED ASTERISK
+273E ; [*0960.0020.0002.273E] # SIX PETALLED BLACK AND WHITE FLORETTE
+273F ; [*0961.0020.0002.273F] # BLACK FLORETTE
+2740 ; [*0962.0020.0002.2740] # WHITE FLORETTE
+2741 ; [*0963.0020.0002.2741] # EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742 ; [*0964.0020.0002.2742] # CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743 ; [*0965.0020.0002.2743] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744 ; [*0966.0020.0002.2744] # SNOWFLAKE
+2745 ; [*0967.0020.0002.2745] # TIGHT TRIFOLIATE SNOWFLAKE
+2746 ; [*0968.0020.0002.2746] # HEAVY CHEVRON SNOWFLAKE
+2747 ; [*0969.0020.0002.2747] # SPARKLE
+2748 ; [*096A.0020.0002.2748] # HEAVY SPARKLE
+2749 ; [*096B.0020.0002.2749] # BALLOON-SPOKED ASTERISK
+274A ; [*096C.0020.0002.274A] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B ; [*096D.0020.0002.274B] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D ; [*096E.0020.0002.274D] # SHADOWED WHITE CIRCLE
+274F ; [*096F.0020.0002.274F] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750 ; [*0970.0020.0002.2750] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751 ; [*0971.0020.0002.2751] # LOWER RIGHT SHADOWED WHITE SQUARE
+2752 ; [*0972.0020.0002.2752] # UPPER RIGHT SHADOWED WHITE SQUARE
+2756 ; [*0973.0020.0002.2756] # BLACK DIAMOND MINUS WHITE X
+2757 ; [*0974.0020.0002.2757] # HEAVY EXCLAMATION MARK SYMBOL
+2758 ; [*0975.0020.0002.2758] # LIGHT VERTICAL BAR
+2759 ; [*0976.0020.0002.2759] # MEDIUM VERTICAL BAR
+275A ; [*0977.0020.0002.275A] # HEAVY VERTICAL BAR
+275B ; [*0978.0020.0002.275B] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C ; [*0979.0020.0002.275C] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D ; [*097A.0020.0002.275D] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E ; [*097B.0020.0002.275E] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761 ; [*097C.0020.0002.2761] # CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762 ; [*097D.0020.0002.2762] # HEAVY EXCLAMATION MARK ORNAMENT
+2763 ; [*097E.0020.0002.2763] # HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764 ; [*097F.0020.0002.2764] # HEAVY BLACK HEART
+2765 ; [*0980.0020.0002.2765] # ROTATED HEAVY BLACK HEART BULLET
+2766 ; [*0981.0020.0002.2766] # FLORAL HEART
+2767 ; [*0982.0020.0002.2767] # ROTATED FLORAL HEART BULLET
+2768 ; [*0983.0020.0002.2768] # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769 ; [*0984.0020.0002.2769] # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A ; [*0985.0020.0002.276A] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B ; [*0986.0020.0002.276B] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C ; [*0987.0020.0002.276C] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D ; [*0988.0020.0002.276D] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E ; [*0989.0020.0002.276E] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F ; [*098A.0020.0002.276F] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770 ; [*098B.0020.0002.2770] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771 ; [*098C.0020.0002.2771] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772 ; [*098D.0020.0002.2772] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773 ; [*098E.0020.0002.2773] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774 ; [*098F.0020.0002.2774] # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775 ; [*0990.0020.0002.2775] # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2794 ; [*0991.0020.0002.2794] # HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798 ; [*0992.0020.0002.2798] # HEAVY SOUTH EAST ARROW
+2799 ; [*0993.0020.0002.2799] # HEAVY RIGHTWARDS ARROW
+279A ; [*0994.0020.0002.279A] # HEAVY NORTH EAST ARROW
+279B ; [*0995.0020.0002.279B] # DRAFTING POINT RIGHTWARDS ARROW
+279C ; [*0996.0020.0002.279C] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D ; [*0997.0020.0002.279D] # TRIANGLE-HEADED RIGHTWARDS ARROW
+279E ; [*0998.0020.0002.279E] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F ; [*0999.0020.0002.279F] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0 ; [*099A.0020.0002.27A0] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1 ; [*099B.0020.0002.27A1] # BLACK RIGHTWARDS ARROW
+27A2 ; [*099C.0020.0002.27A2] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3 ; [*099D.0020.0002.27A3] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4 ; [*099E.0020.0002.27A4] # BLACK RIGHTWARDS ARROWHEAD
+27A5 ; [*099F.0020.0002.27A5] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6 ; [*09A0.0020.0002.27A6] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7 ; [*09A1.0020.0002.27A7] # SQUAT BLACK RIGHTWARDS ARROW
+27A8 ; [*09A2.0020.0002.27A8] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9 ; [*09A3.0020.0002.27A9] # RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA ; [*09A4.0020.0002.27AA] # LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB ; [*09A5.0020.0002.27AB] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC ; [*09A6.0020.0002.27AC] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD ; [*09A7.0020.0002.27AD] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE ; [*09A8.0020.0002.27AE] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF ; [*09A9.0020.0002.27AF] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1 ; [*09AA.0020.0002.27B1] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2 ; [*09AB.0020.0002.27B2] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3 ; [*09AC.0020.0002.27B3] # WHITE-FEATHERED RIGHTWARDS ARROW
+27B4 ; [*09AD.0020.0002.27B4] # BLACK-FEATHERED SOUTH EAST ARROW
+27B5 ; [*09AE.0020.0002.27B5] # BLACK-FEATHERED RIGHTWARDS ARROW
+27B6 ; [*09AF.0020.0002.27B6] # BLACK-FEATHERED NORTH EAST ARROW
+27B7 ; [*09B0.0020.0002.27B7] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8 ; [*09B1.0020.0002.27B8] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9 ; [*09B2.0020.0002.27B9] # HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA ; [*09B3.0020.0002.27BA] # TEARDROP-BARBED RIGHTWARDS ARROW
+27BB ; [*09B4.0020.0002.27BB] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC ; [*09B5.0020.0002.27BC] # WEDGE-TAILED RIGHTWARDS ARROW
+27BD ; [*09B6.0020.0002.27BD] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE ; [*09B7.0020.0002.27BE] # OPEN-OUTLINED RIGHTWARDS ARROW
+27C0 ; [*09B8.0020.0002.27C0] # THREE DIMENSIONAL ANGLE
+27C1 ; [*09B9.0020.0002.27C1] # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+27C2 ; [*09BA.0020.0002.27C2] # PERPENDICULAR
+27C3 ; [*09BB.0020.0002.27C3] # OPEN SUBSET
+27C4 ; [*09BC.0020.0002.27C4] # OPEN SUPERSET
+27C5 ; [*09BD.0020.0002.27C5] # LEFT S-SHAPED BAG DELIMITER
+27C6 ; [*09BE.0020.0002.27C6] # RIGHT S-SHAPED BAG DELIMITER
+27C7 ; [*09BF.0020.0002.27C7] # OR WITH DOT INSIDE
+27C8 ; [*09C0.0020.0002.27C8] # REVERSE SOLIDUS PRECEDING SUBSET
+27C9 ; [*09C1.0020.0002.27C9] # SUPERSET PRECEDING SOLIDUS
+27CA ; [*09C2.0020.0002.27CA] # VERTICAL BAR WITH HORIZONTAL STROKE
+27CC ; [*09C3.0020.0002.27CC] # LONG DIVISION
+27D0 ; [*09C4.0020.0002.27D0] # WHITE DIAMOND WITH CENTRED DOT
+27D1 ; [*09C5.0020.0002.27D1] # AND WITH DOT
+27D2 ; [*09C6.0020.0002.27D2] # ELEMENT OF OPENING UPWARDS
+27D3 ; [*09C7.0020.0002.27D3] # LOWER RIGHT CORNER WITH DOT
+27D4 ; [*09C8.0020.0002.27D4] # UPPER LEFT CORNER WITH DOT
+27D5 ; [*09C9.0020.0002.27D5] # LEFT OUTER JOIN
+27D6 ; [*09CA.0020.0002.27D6] # RIGHT OUTER JOIN
+27D7 ; [*09CB.0020.0002.27D7] # FULL OUTER JOIN
+27D8 ; [*09CC.0020.0002.27D8] # LARGE UP TACK
+27D9 ; [*09CD.0020.0002.27D9] # LARGE DOWN TACK
+27DA ; [*09CE.0020.0002.27DA] # LEFT AND RIGHT DOUBLE TURNSTILE
+27DB ; [*09CF.0020.0002.27DB] # LEFT AND RIGHT TACK
+27DC ; [*09D0.0020.0002.27DC] # LEFT MULTIMAP
+27DD ; [*09D1.0020.0002.27DD] # LONG RIGHT TACK
+27DE ; [*09D2.0020.0002.27DE] # LONG LEFT TACK
+27DF ; [*09D3.0020.0002.27DF] # UP TACK WITH CIRCLE ABOVE
+27E0 ; [*09D4.0020.0002.27E0] # LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1 ; [*09D5.0020.0002.27E1] # WHITE CONCAVE-SIDED DIAMOND
+27E2 ; [*09D6.0020.0002.27E2] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3 ; [*09D7.0020.0002.27E3] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4 ; [*09D8.0020.0002.27E4] # WHITE SQUARE WITH LEFTWARDS TICK
+27E5 ; [*09D9.0020.0002.27E5] # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6 ; [*09DA.0020.0002.27E6] # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7 ; [*09DB.0020.0002.27E7] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8 ; [*09DC.0020.0002.27E8] # MATHEMATICAL LEFT ANGLE BRACKET
+27E9 ; [*09DD.0020.0002.27E9] # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA ; [*09DE.0020.0002.27EA] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB ; [*09DF.0020.0002.27EB] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC ; [*0325.0020.0002.27EC] # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED ; [*0326.0020.0002.27ED] # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE ; [*0327.0020.0002.27EE] # MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF ; [*0328.0020.0002.27EF] # MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0 ; [*09E0.0020.0002.27F0] # UPWARDS QUADRUPLE ARROW
+27F1 ; [*09E1.0020.0002.27F1] # DOWNWARDS QUADRUPLE ARROW
+27F2 ; [*09E2.0020.0002.27F2] # ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3 ; [*09E3.0020.0002.27F3] # CLOCKWISE GAPPED CIRCLE ARROW
+27F4 ; [*09E4.0020.0002.27F4] # RIGHT ARROW WITH CIRCLED PLUS
+27F5 ; [*09E5.0020.0002.27F5] # LONG LEFTWARDS ARROW
+27F6 ; [*09E6.0020.0002.27F6] # LONG RIGHTWARDS ARROW
+27F7 ; [*09E7.0020.0002.27F7] # LONG LEFT RIGHT ARROW
+27F8 ; [*09E8.0020.0002.27F8] # LONG LEFTWARDS DOUBLE ARROW
+27F9 ; [*09E9.0020.0002.27F9] # LONG RIGHTWARDS DOUBLE ARROW
+27FA ; [*09EA.0020.0002.27FA] # LONG LEFT RIGHT DOUBLE ARROW
+27FB ; [*09EB.0020.0002.27FB] # LONG LEFTWARDS ARROW FROM BAR
+27FC ; [*09EC.0020.0002.27FC] # LONG RIGHTWARDS ARROW FROM BAR
+27FD ; [*09ED.0020.0002.27FD] # LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE ; [*09EE.0020.0002.27FE] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF ; [*09EF.0020.0002.27FF] # LONG RIGHTWARDS SQUIGGLE ARROW
+2800 ; [*0C30.0020.0002.2800] # BRAILLE PATTERN BLANK
+2801 ; [*0C31.0020.0002.2801] # BRAILLE PATTERN DOTS-1
+2802 ; [*0C32.0020.0002.2802] # BRAILLE PATTERN DOTS-2
+2803 ; [*0C33.0020.0002.2803] # BRAILLE PATTERN DOTS-12
+2804 ; [*0C34.0020.0002.2804] # BRAILLE PATTERN DOTS-3
+2805 ; [*0C35.0020.0002.2805] # BRAILLE PATTERN DOTS-13
+2806 ; [*0C36.0020.0002.2806] # BRAILLE PATTERN DOTS-23
+2807 ; [*0C37.0020.0002.2807] # BRAILLE PATTERN DOTS-123
+2808 ; [*0C38.0020.0002.2808] # BRAILLE PATTERN DOTS-4
+2809 ; [*0C39.0020.0002.2809] # BRAILLE PATTERN DOTS-14
+280A ; [*0C3A.0020.0002.280A] # BRAILLE PATTERN DOTS-24
+280B ; [*0C3B.0020.0002.280B] # BRAILLE PATTERN DOTS-124
+280C ; [*0C3C.0020.0002.280C] # BRAILLE PATTERN DOTS-34
+280D ; [*0C3D.0020.0002.280D] # BRAILLE PATTERN DOTS-134
+280E ; [*0C3E.0020.0002.280E] # BRAILLE PATTERN DOTS-234
+280F ; [*0C3F.0020.0002.280F] # BRAILLE PATTERN DOTS-1234
+2810 ; [*0C40.0020.0002.2810] # BRAILLE PATTERN DOTS-5
+2811 ; [*0C41.0020.0002.2811] # BRAILLE PATTERN DOTS-15
+2812 ; [*0C42.0020.0002.2812] # BRAILLE PATTERN DOTS-25
+2813 ; [*0C43.0020.0002.2813] # BRAILLE PATTERN DOTS-125
+2814 ; [*0C44.0020.0002.2814] # BRAILLE PATTERN DOTS-35
+2815 ; [*0C45.0020.0002.2815] # BRAILLE PATTERN DOTS-135
+2816 ; [*0C46.0020.0002.2816] # BRAILLE PATTERN DOTS-235
+2817 ; [*0C47.0020.0002.2817] # BRAILLE PATTERN DOTS-1235
+2818 ; [*0C48.0020.0002.2818] # BRAILLE PATTERN DOTS-45
+2819 ; [*0C49.0020.0002.2819] # BRAILLE PATTERN DOTS-145
+281A ; [*0C4A.0020.0002.281A] # BRAILLE PATTERN DOTS-245
+281B ; [*0C4B.0020.0002.281B] # BRAILLE PATTERN DOTS-1245
+281C ; [*0C4C.0020.0002.281C] # BRAILLE PATTERN DOTS-345
+281D ; [*0C4D.0020.0002.281D] # BRAILLE PATTERN DOTS-1345
+281E ; [*0C4E.0020.0002.281E] # BRAILLE PATTERN DOTS-2345
+281F ; [*0C4F.0020.0002.281F] # BRAILLE PATTERN DOTS-12345
+2820 ; [*0C50.0020.0002.2820] # BRAILLE PATTERN DOTS-6
+2821 ; [*0C51.0020.0002.2821] # BRAILLE PATTERN DOTS-16
+2822 ; [*0C52.0020.0002.2822] # BRAILLE PATTERN DOTS-26
+2823 ; [*0C53.0020.0002.2823] # BRAILLE PATTERN DOTS-126
+2824 ; [*0C54.0020.0002.2824] # BRAILLE PATTERN DOTS-36
+2825 ; [*0C55.0020.0002.2825] # BRAILLE PATTERN DOTS-136
+2826 ; [*0C56.0020.0002.2826] # BRAILLE PATTERN DOTS-236
+2827 ; [*0C57.0020.0002.2827] # BRAILLE PATTERN DOTS-1236
+2828 ; [*0C58.0020.0002.2828] # BRAILLE PATTERN DOTS-46
+2829 ; [*0C59.0020.0002.2829] # BRAILLE PATTERN DOTS-146
+282A ; [*0C5A.0020.0002.282A] # BRAILLE PATTERN DOTS-246
+282B ; [*0C5B.0020.0002.282B] # BRAILLE PATTERN DOTS-1246
+282C ; [*0C5C.0020.0002.282C] # BRAILLE PATTERN DOTS-346
+282D ; [*0C5D.0020.0002.282D] # BRAILLE PATTERN DOTS-1346
+282E ; [*0C5E.0020.0002.282E] # BRAILLE PATTERN DOTS-2346
+282F ; [*0C5F.0020.0002.282F] # BRAILLE PATTERN DOTS-12346
+2830 ; [*0C60.0020.0002.2830] # BRAILLE PATTERN DOTS-56
+2831 ; [*0C61.0020.0002.2831] # BRAILLE PATTERN DOTS-156
+2832 ; [*0C62.0020.0002.2832] # BRAILLE PATTERN DOTS-256
+2833 ; [*0C63.0020.0002.2833] # BRAILLE PATTERN DOTS-1256
+2834 ; [*0C64.0020.0002.2834] # BRAILLE PATTERN DOTS-356
+2835 ; [*0C65.0020.0002.2835] # BRAILLE PATTERN DOTS-1356
+2836 ; [*0C66.0020.0002.2836] # BRAILLE PATTERN DOTS-2356
+2837 ; [*0C67.0020.0002.2837] # BRAILLE PATTERN DOTS-12356
+2838 ; [*0C68.0020.0002.2838] # BRAILLE PATTERN DOTS-456
+2839 ; [*0C69.0020.0002.2839] # BRAILLE PATTERN DOTS-1456
+283A ; [*0C6A.0020.0002.283A] # BRAILLE PATTERN DOTS-2456
+283B ; [*0C6B.0020.0002.283B] # BRAILLE PATTERN DOTS-12456
+283C ; [*0C6C.0020.0002.283C] # BRAILLE PATTERN DOTS-3456
+283D ; [*0C6D.0020.0002.283D] # BRAILLE PATTERN DOTS-13456
+283E ; [*0C6E.0020.0002.283E] # BRAILLE PATTERN DOTS-23456
+283F ; [*0C6F.0020.0002.283F] # BRAILLE PATTERN DOTS-123456
+2840 ; [*0C70.0020.0002.2840] # BRAILLE PATTERN DOTS-7
+2841 ; [*0C71.0020.0002.2841] # BRAILLE PATTERN DOTS-17
+2842 ; [*0C72.0020.0002.2842] # BRAILLE PATTERN DOTS-27
+2843 ; [*0C73.0020.0002.2843] # BRAILLE PATTERN DOTS-127
+2844 ; [*0C74.0020.0002.2844] # BRAILLE PATTERN DOTS-37
+2845 ; [*0C75.0020.0002.2845] # BRAILLE PATTERN DOTS-137
+2846 ; [*0C76.0020.0002.2846] # BRAILLE PATTERN DOTS-237
+2847 ; [*0C77.0020.0002.2847] # BRAILLE PATTERN DOTS-1237
+2848 ; [*0C78.0020.0002.2848] # BRAILLE PATTERN DOTS-47
+2849 ; [*0C79.0020.0002.2849] # BRAILLE PATTERN DOTS-147
+284A ; [*0C7A.0020.0002.284A] # BRAILLE PATTERN DOTS-247
+284B ; [*0C7B.0020.0002.284B] # BRAILLE PATTERN DOTS-1247
+284C ; [*0C7C.0020.0002.284C] # BRAILLE PATTERN DOTS-347
+284D ; [*0C7D.0020.0002.284D] # BRAILLE PATTERN DOTS-1347
+284E ; [*0C7E.0020.0002.284E] # BRAILLE PATTERN DOTS-2347
+284F ; [*0C7F.0020.0002.284F] # BRAILLE PATTERN DOTS-12347
+2850 ; [*0C80.0020.0002.2850] # BRAILLE PATTERN DOTS-57
+2851 ; [*0C81.0020.0002.2851] # BRAILLE PATTERN DOTS-157
+2852 ; [*0C82.0020.0002.2852] # BRAILLE PATTERN DOTS-257
+2853 ; [*0C83.0020.0002.2853] # BRAILLE PATTERN DOTS-1257
+2854 ; [*0C84.0020.0002.2854] # BRAILLE PATTERN DOTS-357
+2855 ; [*0C85.0020.0002.2855] # BRAILLE PATTERN DOTS-1357
+2856 ; [*0C86.0020.0002.2856] # BRAILLE PATTERN DOTS-2357
+2857 ; [*0C87.0020.0002.2857] # BRAILLE PATTERN DOTS-12357
+2858 ; [*0C88.0020.0002.2858] # BRAILLE PATTERN DOTS-457
+2859 ; [*0C89.0020.0002.2859] # BRAILLE PATTERN DOTS-1457
+285A ; [*0C8A.0020.0002.285A] # BRAILLE PATTERN DOTS-2457
+285B ; [*0C8B.0020.0002.285B] # BRAILLE PATTERN DOTS-12457
+285C ; [*0C8C.0020.0002.285C] # BRAILLE PATTERN DOTS-3457
+285D ; [*0C8D.0020.0002.285D] # BRAILLE PATTERN DOTS-13457
+285E ; [*0C8E.0020.0002.285E] # BRAILLE PATTERN DOTS-23457
+285F ; [*0C8F.0020.0002.285F] # BRAILLE PATTERN DOTS-123457
+2860 ; [*0C90.0020.0002.2860] # BRAILLE PATTERN DOTS-67
+2861 ; [*0C91.0020.0002.2861] # BRAILLE PATTERN DOTS-167
+2862 ; [*0C92.0020.0002.2862] # BRAILLE PATTERN DOTS-267
+2863 ; [*0C93.0020.0002.2863] # BRAILLE PATTERN DOTS-1267
+2864 ; [*0C94.0020.0002.2864] # BRAILLE PATTERN DOTS-367
+2865 ; [*0C95.0020.0002.2865] # BRAILLE PATTERN DOTS-1367
+2866 ; [*0C96.0020.0002.2866] # BRAILLE PATTERN DOTS-2367
+2867 ; [*0C97.0020.0002.2867] # BRAILLE PATTERN DOTS-12367
+2868 ; [*0C98.0020.0002.2868] # BRAILLE PATTERN DOTS-467
+2869 ; [*0C99.0020.0002.2869] # BRAILLE PATTERN DOTS-1467
+286A ; [*0C9A.0020.0002.286A] # BRAILLE PATTERN DOTS-2467
+286B ; [*0C9B.0020.0002.286B] # BRAILLE PATTERN DOTS-12467
+286C ; [*0C9C.0020.0002.286C] # BRAILLE PATTERN DOTS-3467
+286D ; [*0C9D.0020.0002.286D] # BRAILLE PATTERN DOTS-13467
+286E ; [*0C9E.0020.0002.286E] # BRAILLE PATTERN DOTS-23467
+286F ; [*0C9F.0020.0002.286F] # BRAILLE PATTERN DOTS-123467
+2870 ; [*0CA0.0020.0002.2870] # BRAILLE PATTERN DOTS-567
+2871 ; [*0CA1.0020.0002.2871] # BRAILLE PATTERN DOTS-1567
+2872 ; [*0CA2.0020.0002.2872] # BRAILLE PATTERN DOTS-2567
+2873 ; [*0CA3.0020.0002.2873] # BRAILLE PATTERN DOTS-12567
+2874 ; [*0CA4.0020.0002.2874] # BRAILLE PATTERN DOTS-3567
+2875 ; [*0CA5.0020.0002.2875] # BRAILLE PATTERN DOTS-13567
+2876 ; [*0CA6.0020.0002.2876] # BRAILLE PATTERN DOTS-23567
+2877 ; [*0CA7.0020.0002.2877] # BRAILLE PATTERN DOTS-123567
+2878 ; [*0CA8.0020.0002.2878] # BRAILLE PATTERN DOTS-4567
+2879 ; [*0CA9.0020.0002.2879] # BRAILLE PATTERN DOTS-14567
+287A ; [*0CAA.0020.0002.287A] # BRAILLE PATTERN DOTS-24567
+287B ; [*0CAB.0020.0002.287B] # BRAILLE PATTERN DOTS-124567
+287C ; [*0CAC.0020.0002.287C] # BRAILLE PATTERN DOTS-34567
+287D ; [*0CAD.0020.0002.287D] # BRAILLE PATTERN DOTS-134567
+287E ; [*0CAE.0020.0002.287E] # BRAILLE PATTERN DOTS-234567
+287F ; [*0CAF.0020.0002.287F] # BRAILLE PATTERN DOTS-1234567
+2880 ; [*0CB0.0020.0002.2880] # BRAILLE PATTERN DOTS-8
+2881 ; [*0CB1.0020.0002.2881] # BRAILLE PATTERN DOTS-18
+2882 ; [*0CB2.0020.0002.2882] # BRAILLE PATTERN DOTS-28
+2883 ; [*0CB3.0020.0002.2883] # BRAILLE PATTERN DOTS-128
+2884 ; [*0CB4.0020.0002.2884] # BRAILLE PATTERN DOTS-38
+2885 ; [*0CB5.0020.0002.2885] # BRAILLE PATTERN DOTS-138
+2886 ; [*0CB6.0020.0002.2886] # BRAILLE PATTERN DOTS-238
+2887 ; [*0CB7.0020.0002.2887] # BRAILLE PATTERN DOTS-1238
+2888 ; [*0CB8.0020.0002.2888] # BRAILLE PATTERN DOTS-48
+2889 ; [*0CB9.0020.0002.2889] # BRAILLE PATTERN DOTS-148
+288A ; [*0CBA.0020.0002.288A] # BRAILLE PATTERN DOTS-248
+288B ; [*0CBB.0020.0002.288B] # BRAILLE PATTERN DOTS-1248
+288C ; [*0CBC.0020.0002.288C] # BRAILLE PATTERN DOTS-348
+288D ; [*0CBD.0020.0002.288D] # BRAILLE PATTERN DOTS-1348
+288E ; [*0CBE.0020.0002.288E] # BRAILLE PATTERN DOTS-2348
+288F ; [*0CBF.0020.0002.288F] # BRAILLE PATTERN DOTS-12348
+2890 ; [*0CC0.0020.0002.2890] # BRAILLE PATTERN DOTS-58
+2891 ; [*0CC1.0020.0002.2891] # BRAILLE PATTERN DOTS-158
+2892 ; [*0CC2.0020.0002.2892] # BRAILLE PATTERN DOTS-258
+2893 ; [*0CC3.0020.0002.2893] # BRAILLE PATTERN DOTS-1258
+2894 ; [*0CC4.0020.0002.2894] # BRAILLE PATTERN DOTS-358
+2895 ; [*0CC5.0020.0002.2895] # BRAILLE PATTERN DOTS-1358
+2896 ; [*0CC6.0020.0002.2896] # BRAILLE PATTERN DOTS-2358
+2897 ; [*0CC7.0020.0002.2897] # BRAILLE PATTERN DOTS-12358
+2898 ; [*0CC8.0020.0002.2898] # BRAILLE PATTERN DOTS-458
+2899 ; [*0CC9.0020.0002.2899] # BRAILLE PATTERN DOTS-1458
+289A ; [*0CCA.0020.0002.289A] # BRAILLE PATTERN DOTS-2458
+289B ; [*0CCB.0020.0002.289B] # BRAILLE PATTERN DOTS-12458
+289C ; [*0CCC.0020.0002.289C] # BRAILLE PATTERN DOTS-3458
+289D ; [*0CCD.0020.0002.289D] # BRAILLE PATTERN DOTS-13458
+289E ; [*0CCE.0020.0002.289E] # BRAILLE PATTERN DOTS-23458
+289F ; [*0CCF.0020.0002.289F] # BRAILLE PATTERN DOTS-123458
+28A0 ; [*0CD0.0020.0002.28A0] # BRAILLE PATTERN DOTS-68
+28A1 ; [*0CD1.0020.0002.28A1] # BRAILLE PATTERN DOTS-168
+28A2 ; [*0CD2.0020.0002.28A2] # BRAILLE PATTERN DOTS-268
+28A3 ; [*0CD3.0020.0002.28A3] # BRAILLE PATTERN DOTS-1268
+28A4 ; [*0CD4.0020.0002.28A4] # BRAILLE PATTERN DOTS-368
+28A5 ; [*0CD5.0020.0002.28A5] # BRAILLE PATTERN DOTS-1368
+28A6 ; [*0CD6.0020.0002.28A6] # BRAILLE PATTERN DOTS-2368
+28A7 ; [*0CD7.0020.0002.28A7] # BRAILLE PATTERN DOTS-12368
+28A8 ; [*0CD8.0020.0002.28A8] # BRAILLE PATTERN DOTS-468
+28A9 ; [*0CD9.0020.0002.28A9] # BRAILLE PATTERN DOTS-1468
+28AA ; [*0CDA.0020.0002.28AA] # BRAILLE PATTERN DOTS-2468
+28AB ; [*0CDB.0020.0002.28AB] # BRAILLE PATTERN DOTS-12468
+28AC ; [*0CDC.0020.0002.28AC] # BRAILLE PATTERN DOTS-3468
+28AD ; [*0CDD.0020.0002.28AD] # BRAILLE PATTERN DOTS-13468
+28AE ; [*0CDE.0020.0002.28AE] # BRAILLE PATTERN DOTS-23468
+28AF ; [*0CDF.0020.0002.28AF] # BRAILLE PATTERN DOTS-123468
+28B0 ; [*0CE0.0020.0002.28B0] # BRAILLE PATTERN DOTS-568
+28B1 ; [*0CE1.0020.0002.28B1] # BRAILLE PATTERN DOTS-1568
+28B2 ; [*0CE2.0020.0002.28B2] # BRAILLE PATTERN DOTS-2568
+28B3 ; [*0CE3.0020.0002.28B3] # BRAILLE PATTERN DOTS-12568
+28B4 ; [*0CE4.0020.0002.28B4] # BRAILLE PATTERN DOTS-3568
+28B5 ; [*0CE5.0020.0002.28B5] # BRAILLE PATTERN DOTS-13568
+28B6 ; [*0CE6.0020.0002.28B6] # BRAILLE PATTERN DOTS-23568
+28B7 ; [*0CE7.0020.0002.28B7] # BRAILLE PATTERN DOTS-123568
+28B8 ; [*0CE8.0020.0002.28B8] # BRAILLE PATTERN DOTS-4568
+28B9 ; [*0CE9.0020.0002.28B9] # BRAILLE PATTERN DOTS-14568
+28BA ; [*0CEA.0020.0002.28BA] # BRAILLE PATTERN DOTS-24568
+28BB ; [*0CEB.0020.0002.28BB] # BRAILLE PATTERN DOTS-124568
+28BC ; [*0CEC.0020.0002.28BC] # BRAILLE PATTERN DOTS-34568
+28BD ; [*0CED.0020.0002.28BD] # BRAILLE PATTERN DOTS-134568
+28BE ; [*0CEE.0020.0002.28BE] # BRAILLE PATTERN DOTS-234568
+28BF ; [*0CEF.0020.0002.28BF] # BRAILLE PATTERN DOTS-1234568
+28C0 ; [*0CF0.0020.0002.28C0] # BRAILLE PATTERN DOTS-78
+28C1 ; [*0CF1.0020.0002.28C1] # BRAILLE PATTERN DOTS-178
+28C2 ; [*0CF2.0020.0002.28C2] # BRAILLE PATTERN DOTS-278
+28C3 ; [*0CF3.0020.0002.28C3] # BRAILLE PATTERN DOTS-1278
+28C4 ; [*0CF4.0020.0002.28C4] # BRAILLE PATTERN DOTS-378
+28C5 ; [*0CF5.0020.0002.28C5] # BRAILLE PATTERN DOTS-1378
+28C6 ; [*0CF6.0020.0002.28C6] # BRAILLE PATTERN DOTS-2378
+28C7 ; [*0CF7.0020.0002.28C7] # BRAILLE PATTERN DOTS-12378
+28C8 ; [*0CF8.0020.0002.28C8] # BRAILLE PATTERN DOTS-478
+28C9 ; [*0CF9.0020.0002.28C9] # BRAILLE PATTERN DOTS-1478
+28CA ; [*0CFA.0020.0002.28CA] # BRAILLE PATTERN DOTS-2478
+28CB ; [*0CFB.0020.0002.28CB] # BRAILLE PATTERN DOTS-12478
+28CC ; [*0CFC.0020.0002.28CC] # BRAILLE PATTERN DOTS-3478
+28CD ; [*0CFD.0020.0002.28CD] # BRAILLE PATTERN DOTS-13478
+28CE ; [*0CFE.0020.0002.28CE] # BRAILLE PATTERN DOTS-23478
+28CF ; [*0CFF.0020.0002.28CF] # BRAILLE PATTERN DOTS-123478
+28D0 ; [*0D00.0020.0002.28D0] # BRAILLE PATTERN DOTS-578
+28D1 ; [*0D01.0020.0002.28D1] # BRAILLE PATTERN DOTS-1578
+28D2 ; [*0D02.0020.0002.28D2] # BRAILLE PATTERN DOTS-2578
+28D3 ; [*0D03.0020.0002.28D3] # BRAILLE PATTERN DOTS-12578
+28D4 ; [*0D04.0020.0002.28D4] # BRAILLE PATTERN DOTS-3578
+28D5 ; [*0D05.0020.0002.28D5] # BRAILLE PATTERN DOTS-13578
+28D6 ; [*0D06.0020.0002.28D6] # BRAILLE PATTERN DOTS-23578
+28D7 ; [*0D07.0020.0002.28D7] # BRAILLE PATTERN DOTS-123578
+28D8 ; [*0D08.0020.0002.28D8] # BRAILLE PATTERN DOTS-4578
+28D9 ; [*0D09.0020.0002.28D9] # BRAILLE PATTERN DOTS-14578
+28DA ; [*0D0A.0020.0002.28DA] # BRAILLE PATTERN DOTS-24578
+28DB ; [*0D0B.0020.0002.28DB] # BRAILLE PATTERN DOTS-124578
+28DC ; [*0D0C.0020.0002.28DC] # BRAILLE PATTERN DOTS-34578
+28DD ; [*0D0D.0020.0002.28DD] # BRAILLE PATTERN DOTS-134578
+28DE ; [*0D0E.0020.0002.28DE] # BRAILLE PATTERN DOTS-234578
+28DF ; [*0D0F.0020.0002.28DF] # BRAILLE PATTERN DOTS-1234578
+28E0 ; [*0D10.0020.0002.28E0] # BRAILLE PATTERN DOTS-678
+28E1 ; [*0D11.0020.0002.28E1] # BRAILLE PATTERN DOTS-1678
+28E2 ; [*0D12.0020.0002.28E2] # BRAILLE PATTERN DOTS-2678
+28E3 ; [*0D13.0020.0002.28E3] # BRAILLE PATTERN DOTS-12678
+28E4 ; [*0D14.0020.0002.28E4] # BRAILLE PATTERN DOTS-3678
+28E5 ; [*0D15.0020.0002.28E5] # BRAILLE PATTERN DOTS-13678
+28E6 ; [*0D16.0020.0002.28E6] # BRAILLE PATTERN DOTS-23678
+28E7 ; [*0D17.0020.0002.28E7] # BRAILLE PATTERN DOTS-123678
+28E8 ; [*0D18.0020.0002.28E8] # BRAILLE PATTERN DOTS-4678
+28E9 ; [*0D19.0020.0002.28E9] # BRAILLE PATTERN DOTS-14678
+28EA ; [*0D1A.0020.0002.28EA] # BRAILLE PATTERN DOTS-24678
+28EB ; [*0D1B.0020.0002.28EB] # BRAILLE PATTERN DOTS-124678
+28EC ; [*0D1C.0020.0002.28EC] # BRAILLE PATTERN DOTS-34678
+28ED ; [*0D1D.0020.0002.28ED] # BRAILLE PATTERN DOTS-134678
+28EE ; [*0D1E.0020.0002.28EE] # BRAILLE PATTERN DOTS-234678
+28EF ; [*0D1F.0020.0002.28EF] # BRAILLE PATTERN DOTS-1234678
+28F0 ; [*0D20.0020.0002.28F0] # BRAILLE PATTERN DOTS-5678
+28F1 ; [*0D21.0020.0002.28F1] # BRAILLE PATTERN DOTS-15678
+28F2 ; [*0D22.0020.0002.28F2] # BRAILLE PATTERN DOTS-25678
+28F3 ; [*0D23.0020.0002.28F3] # BRAILLE PATTERN DOTS-125678
+28F4 ; [*0D24.0020.0002.28F4] # BRAILLE PATTERN DOTS-35678
+28F5 ; [*0D25.0020.0002.28F5] # BRAILLE PATTERN DOTS-135678
+28F6 ; [*0D26.0020.0002.28F6] # BRAILLE PATTERN DOTS-235678
+28F7 ; [*0D27.0020.0002.28F7] # BRAILLE PATTERN DOTS-1235678
+28F8 ; [*0D28.0020.0002.28F8] # BRAILLE PATTERN DOTS-45678
+28F9 ; [*0D29.0020.0002.28F9] # BRAILLE PATTERN DOTS-145678
+28FA ; [*0D2A.0020.0002.28FA] # BRAILLE PATTERN DOTS-245678
+28FB ; [*0D2B.0020.0002.28FB] # BRAILLE PATTERN DOTS-1245678
+28FC ; [*0D2C.0020.0002.28FC] # BRAILLE PATTERN DOTS-345678
+28FD ; [*0D2D.0020.0002.28FD] # BRAILLE PATTERN DOTS-1345678
+28FE ; [*0D2E.0020.0002.28FE] # BRAILLE PATTERN DOTS-2345678
+28FF ; [*0D2F.0020.0002.28FF] # BRAILLE PATTERN DOTS-12345678
+2900 ; [*09F0.0020.0002.2900] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901 ; [*09F1.0020.0002.2901] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902 ; [*09F2.0020.0002.2902] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903 ; [*09F3.0020.0002.2903] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904 ; [*09F4.0020.0002.2904] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905 ; [*09F5.0020.0002.2905] # RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906 ; [*09F6.0020.0002.2906] # LEFTWARDS DOUBLE ARROW FROM BAR
+2907 ; [*09F7.0020.0002.2907] # RIGHTWARDS DOUBLE ARROW FROM BAR
+2908 ; [*09F8.0020.0002.2908] # DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909 ; [*09F9.0020.0002.2909] # UPWARDS ARROW WITH HORIZONTAL STROKE
+290A ; [*09FA.0020.0002.290A] # UPWARDS TRIPLE ARROW
+290B ; [*09FB.0020.0002.290B] # DOWNWARDS TRIPLE ARROW
+290C ; [*09FC.0020.0002.290C] # LEFTWARDS DOUBLE DASH ARROW
+290D ; [*09FD.0020.0002.290D] # RIGHTWARDS DOUBLE DASH ARROW
+290E ; [*09FE.0020.0002.290E] # LEFTWARDS TRIPLE DASH ARROW
+290F ; [*09FF.0020.0002.290F] # RIGHTWARDS TRIPLE DASH ARROW
+2910 ; [*0A00.0020.0002.2910] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911 ; [*0A01.0020.0002.2911] # RIGHTWARDS ARROW WITH DOTTED STEM
+2912 ; [*0A02.0020.0002.2912] # UPWARDS ARROW TO BAR
+2913 ; [*0A03.0020.0002.2913] # DOWNWARDS ARROW TO BAR
+2914 ; [*0A04.0020.0002.2914] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915 ; [*0A05.0020.0002.2915] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916 ; [*0A06.0020.0002.2916] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917 ; [*0A07.0020.0002.2917] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918 ; [*0A08.0020.0002.2918] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919 ; [*0A09.0020.0002.2919] # LEFTWARDS ARROW-TAIL
+291A ; [*0A0A.0020.0002.291A] # RIGHTWARDS ARROW-TAIL
+291B ; [*0A0B.0020.0002.291B] # LEFTWARDS DOUBLE ARROW-TAIL
+291C ; [*0A0C.0020.0002.291C] # RIGHTWARDS DOUBLE ARROW-TAIL
+291D ; [*0A0D.0020.0002.291D] # LEFTWARDS ARROW TO BLACK DIAMOND
+291E ; [*0A0E.0020.0002.291E] # RIGHTWARDS ARROW TO BLACK DIAMOND
+291F ; [*0A0F.0020.0002.291F] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920 ; [*0A10.0020.0002.2920] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921 ; [*0A11.0020.0002.2921] # NORTH WEST AND SOUTH EAST ARROW
+2922 ; [*0A12.0020.0002.2922] # NORTH EAST AND SOUTH WEST ARROW
+2923 ; [*0A13.0020.0002.2923] # NORTH WEST ARROW WITH HOOK
+2924 ; [*0A14.0020.0002.2924] # NORTH EAST ARROW WITH HOOK
+2925 ; [*0A15.0020.0002.2925] # SOUTH EAST ARROW WITH HOOK
+2926 ; [*0A16.0020.0002.2926] # SOUTH WEST ARROW WITH HOOK
+2927 ; [*0A17.0020.0002.2927] # NORTH WEST ARROW AND NORTH EAST ARROW
+2928 ; [*0A18.0020.0002.2928] # NORTH EAST ARROW AND SOUTH EAST ARROW
+2929 ; [*0A19.0020.0002.2929] # SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A ; [*0A1A.0020.0002.292A] # SOUTH WEST ARROW AND NORTH WEST ARROW
+292B ; [*0A1B.0020.0002.292B] # RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C ; [*0A1C.0020.0002.292C] # FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D ; [*0A1D.0020.0002.292D] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E ; [*0A1E.0020.0002.292E] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F ; [*0A1F.0020.0002.292F] # FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930 ; [*0A20.0020.0002.2930] # RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931 ; [*0A21.0020.0002.2931] # NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932 ; [*0A22.0020.0002.2932] # NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933 ; [*0A23.0020.0002.2933] # WAVE ARROW POINTING DIRECTLY RIGHT
+2934 ; [*0A24.0020.0002.2934] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935 ; [*0A25.0020.0002.2935] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936 ; [*0A26.0020.0002.2936] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937 ; [*0A27.0020.0002.2937] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938 ; [*0A28.0020.0002.2938] # RIGHT-SIDE ARC CLOCKWISE ARROW
+2939 ; [*0A29.0020.0002.2939] # LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A ; [*0A2A.0020.0002.293A] # TOP ARC ANTICLOCKWISE ARROW
+293B ; [*0A2B.0020.0002.293B] # BOTTOM ARC ANTICLOCKWISE ARROW
+293C ; [*0A2C.0020.0002.293C] # TOP ARC CLOCKWISE ARROW WITH MINUS
+293D ; [*0A2D.0020.0002.293D] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E ; [*0A2E.0020.0002.293E] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F ; [*0A2F.0020.0002.293F] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940 ; [*0A30.0020.0002.2940] # ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941 ; [*0A31.0020.0002.2941] # CLOCKWISE CLOSED CIRCLE ARROW
+2942 ; [*0A32.0020.0002.2942] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943 ; [*0A33.0020.0002.2943] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944 ; [*0A34.0020.0002.2944] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945 ; [*0A35.0020.0002.2945] # RIGHTWARDS ARROW WITH PLUS BELOW
+2946 ; [*0A36.0020.0002.2946] # LEFTWARDS ARROW WITH PLUS BELOW
+2947 ; [*0A37.0020.0002.2947] # RIGHTWARDS ARROW THROUGH X
+2948 ; [*0A38.0020.0002.2948] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949 ; [*0A39.0020.0002.2949] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A ; [*0A3A.0020.0002.294A] # LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B ; [*0A3B.0020.0002.294B] # LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C ; [*0A3C.0020.0002.294C] # UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D ; [*0A3D.0020.0002.294D] # UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E ; [*0A3E.0020.0002.294E] # LEFT BARB UP RIGHT BARB UP HARPOON
+294F ; [*0A3F.0020.0002.294F] # UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950 ; [*0A40.0020.0002.2950] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951 ; [*0A41.0020.0002.2951] # UP BARB LEFT DOWN BARB LEFT HARPOON
+2952 ; [*0A42.0020.0002.2952] # LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953 ; [*0A43.0020.0002.2953] # RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954 ; [*0A44.0020.0002.2954] # UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955 ; [*0A45.0020.0002.2955] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956 ; [*0A46.0020.0002.2956] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957 ; [*0A47.0020.0002.2957] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958 ; [*0A48.0020.0002.2958] # UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959 ; [*0A49.0020.0002.2959] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A ; [*0A4A.0020.0002.295A] # LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B ; [*0A4B.0020.0002.295B] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C ; [*0A4C.0020.0002.295C] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D ; [*0A4D.0020.0002.295D] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E ; [*0A4E.0020.0002.295E] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F ; [*0A4F.0020.0002.295F] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960 ; [*0A50.0020.0002.2960] # UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961 ; [*0A51.0020.0002.2961] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962 ; [*0A52.0020.0002.2962] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963 ; [*0A53.0020.0002.2963] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964 ; [*0A54.0020.0002.2964] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965 ; [*0A55.0020.0002.2965] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966 ; [*0A56.0020.0002.2966] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967 ; [*0A57.0020.0002.2967] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968 ; [*0A58.0020.0002.2968] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969 ; [*0A59.0020.0002.2969] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A ; [*0A5A.0020.0002.296A] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B ; [*0A5B.0020.0002.296B] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C ; [*0A5C.0020.0002.296C] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D ; [*0A5D.0020.0002.296D] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E ; [*0A5E.0020.0002.296E] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F ; [*0A5F.0020.0002.296F] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970 ; [*0A60.0020.0002.2970] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971 ; [*0A61.0020.0002.2971] # EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972 ; [*0A62.0020.0002.2972] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973 ; [*0A63.0020.0002.2973] # LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974 ; [*0A64.0020.0002.2974] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975 ; [*0A65.0020.0002.2975] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976 ; [*0A66.0020.0002.2976] # LESS-THAN ABOVE LEFTWARDS ARROW
+2977 ; [*0A67.0020.0002.2977] # LEFTWARDS ARROW THROUGH LESS-THAN
+2978 ; [*0A68.0020.0002.2978] # GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979 ; [*0A69.0020.0002.2979] # SUBSET ABOVE RIGHTWARDS ARROW
+297A ; [*0A6A.0020.0002.297A] # LEFTWARDS ARROW THROUGH SUBSET
+297B ; [*0A6B.0020.0002.297B] # SUPERSET ABOVE LEFTWARDS ARROW
+297C ; [*0A6C.0020.0002.297C] # LEFT FISH TAIL
+297D ; [*0A6D.0020.0002.297D] # RIGHT FISH TAIL
+297E ; [*0A6E.0020.0002.297E] # UP FISH TAIL
+297F ; [*0A6F.0020.0002.297F] # DOWN FISH TAIL
+2980 ; [*0A70.0020.0002.2980] # TRIPLE VERTICAL BAR DELIMITER
+2981 ; [*0A71.0020.0002.2981] # Z NOTATION SPOT
+2982 ; [*0A72.0020.0002.2982] # Z NOTATION TYPE COLON
+2983 ; [*030F.0020.0002.2983] # LEFT WHITE CURLY BRACKET
+2984 ; [*0310.0020.0002.2984] # RIGHT WHITE CURLY BRACKET
+2985 ; [*0311.0020.0002.2985] # LEFT WHITE PARENTHESIS
+2986 ; [*0312.0020.0002.2986] # RIGHT WHITE PARENTHESIS
+2987 ; [*0313.0020.0002.2987] # Z NOTATION LEFT IMAGE BRACKET
+2988 ; [*0314.0020.0002.2988] # Z NOTATION RIGHT IMAGE BRACKET
+2989 ; [*0315.0020.0002.2989] # Z NOTATION LEFT BINDING BRACKET
+298A ; [*0316.0020.0002.298A] # Z NOTATION RIGHT BINDING BRACKET
+298B ; [*0317.0020.0002.298B] # LEFT SQUARE BRACKET WITH UNDERBAR
+298C ; [*0318.0020.0002.298C] # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D ; [*0319.0020.0002.298D] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E ; [*031A.0020.0002.298E] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F ; [*031B.0020.0002.298F] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990 ; [*031C.0020.0002.2990] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991 ; [*031D.0020.0002.2991] # LEFT ANGLE BRACKET WITH DOT
+2992 ; [*031E.0020.0002.2992] # RIGHT ANGLE BRACKET WITH DOT
+2993 ; [*031F.0020.0002.2993] # LEFT ARC LESS-THAN BRACKET
+2994 ; [*0320.0020.0002.2994] # RIGHT ARC GREATER-THAN BRACKET
+2995 ; [*0321.0020.0002.2995] # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996 ; [*0322.0020.0002.2996] # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997 ; [*0323.0020.0002.2997] # LEFT BLACK TORTOISE SHELL BRACKET
+2998 ; [*0324.0020.0002.2998] # RIGHT BLACK TORTOISE SHELL BRACKET
+2999 ; [*0A73.0020.0002.2999] # DOTTED FENCE
+299A ; [*0A74.0020.0002.299A] # VERTICAL ZIGZAG LINE
+299B ; [*0A75.0020.0002.299B] # MEASURED ANGLE OPENING LEFT
+299C ; [*0A76.0020.0002.299C] # RIGHT ANGLE VARIANT WITH SQUARE
+299D ; [*0A77.0020.0002.299D] # MEASURED RIGHT ANGLE WITH DOT
+299E ; [*0A78.0020.0002.299E] # ANGLE WITH S INSIDE
+299F ; [*0A79.0020.0002.299F] # ACUTE ANGLE
+29A0 ; [*0A7A.0020.0002.29A0] # SPHERICAL ANGLE OPENING LEFT
+29A1 ; [*0A7B.0020.0002.29A1] # SPHERICAL ANGLE OPENING UP
+29A2 ; [*0A7C.0020.0002.29A2] # TURNED ANGLE
+29A3 ; [*0A7D.0020.0002.29A3] # REVERSED ANGLE
+29A4 ; [*0A7E.0020.0002.29A4] # ANGLE WITH UNDERBAR
+29A5 ; [*0A7F.0020.0002.29A5] # REVERSED ANGLE WITH UNDERBAR
+29A6 ; [*0A80.0020.0002.29A6] # OBLIQUE ANGLE OPENING UP
+29A7 ; [*0A81.0020.0002.29A7] # OBLIQUE ANGLE OPENING DOWN
+29A8 ; [*0A82.0020.0002.29A8] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9 ; [*0A83.0020.0002.29A9] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA ; [*0A84.0020.0002.29AA] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB ; [*0A85.0020.0002.29AB] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC ; [*0A86.0020.0002.29AC] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD ; [*0A87.0020.0002.29AD] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE ; [*0A88.0020.0002.29AE] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF ; [*0A89.0020.0002.29AF] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0 ; [*0A8A.0020.0002.29B0] # REVERSED EMPTY SET
+29B1 ; [*0A8B.0020.0002.29B1] # EMPTY SET WITH OVERBAR
+29B2 ; [*0A8C.0020.0002.29B2] # EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3 ; [*0A8D.0020.0002.29B3] # EMPTY SET WITH RIGHT ARROW ABOVE
+29B4 ; [*0A8E.0020.0002.29B4] # EMPTY SET WITH LEFT ARROW ABOVE
+29B5 ; [*0A8F.0020.0002.29B5] # CIRCLE WITH HORIZONTAL BAR
+29B6 ; [*0A90.0020.0002.29B6] # CIRCLED VERTICAL BAR
+29B7 ; [*0A91.0020.0002.29B7] # CIRCLED PARALLEL
+29B8 ; [*0A92.0020.0002.29B8] # CIRCLED REVERSE SOLIDUS
+29B9 ; [*0A93.0020.0002.29B9] # CIRCLED PERPENDICULAR
+29BA ; [*0A94.0020.0002.29BA] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB ; [*0A95.0020.0002.29BB] # CIRCLE WITH SUPERIMPOSED X
+29BC ; [*0A96.0020.0002.29BC] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD ; [*0A97.0020.0002.29BD] # UP ARROW THROUGH CIRCLE
+29BE ; [*0A98.0020.0002.29BE] # CIRCLED WHITE BULLET
+29BF ; [*0A99.0020.0002.29BF] # CIRCLED BULLET
+29C0 ; [*0A9A.0020.0002.29C0] # CIRCLED LESS-THAN
+29C1 ; [*0A9B.0020.0002.29C1] # CIRCLED GREATER-THAN
+29C2 ; [*0A9C.0020.0002.29C2] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3 ; [*0A9D.0020.0002.29C3] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4 ; [*0A9E.0020.0002.29C4] # SQUARED RISING DIAGONAL SLASH
+29C5 ; [*0A9F.0020.0002.29C5] # SQUARED FALLING DIAGONAL SLASH
+29C6 ; [*0AA0.0020.0002.29C6] # SQUARED ASTERISK
+29C7 ; [*0AA1.0020.0002.29C7] # SQUARED SMALL CIRCLE
+29C8 ; [*0AA2.0020.0002.29C8] # SQUARED SQUARE
+29C9 ; [*0AA3.0020.0002.29C9] # TWO JOINED SQUARES
+29CA ; [*0AA4.0020.0002.29CA] # TRIANGLE WITH DOT ABOVE
+29CB ; [*0AA5.0020.0002.29CB] # TRIANGLE WITH UNDERBAR
+29CC ; [*0AA6.0020.0002.29CC] # S IN TRIANGLE
+29CD ; [*0AA7.0020.0002.29CD] # TRIANGLE WITH SERIFS AT BOTTOM
+29CE ; [*0AA8.0020.0002.29CE] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF ; [*0AA9.0020.0002.29CF] # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0 ; [*0AAA.0020.0002.29D0] # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1 ; [*0AAB.0020.0002.29D1] # BOWTIE WITH LEFT HALF BLACK
+29D2 ; [*0AAC.0020.0002.29D2] # BOWTIE WITH RIGHT HALF BLACK
+29D3 ; [*0AAD.0020.0002.29D3] # BLACK BOWTIE
+29D4 ; [*0AAE.0020.0002.29D4] # TIMES WITH LEFT HALF BLACK
+29D5 ; [*0AAF.0020.0002.29D5] # TIMES WITH RIGHT HALF BLACK
+29D6 ; [*0AB0.0020.0002.29D6] # WHITE HOURGLASS
+29D7 ; [*0AB1.0020.0002.29D7] # BLACK HOURGLASS
+29D8 ; [*0AB2.0020.0002.29D8] # LEFT WIGGLY FENCE
+29D9 ; [*0AB3.0020.0002.29D9] # RIGHT WIGGLY FENCE
+29DA ; [*0AB4.0020.0002.29DA] # LEFT DOUBLE WIGGLY FENCE
+29DB ; [*0AB5.0020.0002.29DB] # RIGHT DOUBLE WIGGLY FENCE
+29DC ; [*0AB6.0020.0002.29DC] # INCOMPLETE INFINITY
+29DD ; [*0AB7.0020.0002.29DD] # TIE OVER INFINITY
+29DE ; [*0AB8.0020.0002.29DE] # INFINITY NEGATED WITH VERTICAL BAR
+29DF ; [*0AB9.0020.0002.29DF] # DOUBLE-ENDED MULTIMAP
+29E0 ; [*0ABA.0020.0002.29E0] # SQUARE WITH CONTOURED OUTLINE
+29E1 ; [*0ABB.0020.0002.29E1] # INCREASES AS
+29E2 ; [*0ABC.0020.0002.29E2] # SHUFFLE PRODUCT
+29E3 ; [*0ABD.0020.0002.29E3] # EQUALS SIGN AND SLANTED PARALLEL
+29E4 ; [*0ABE.0020.0002.29E4] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5 ; [*0ABF.0020.0002.29E5] # IDENTICAL TO AND SLANTED PARALLEL
+29E6 ; [*0AC0.0020.0002.29E6] # GLEICH STARK
+29E7 ; [*0AC1.0020.0002.29E7] # THERMODYNAMIC
+29E8 ; [*0AC2.0020.0002.29E8] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9 ; [*0AC3.0020.0002.29E9] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA ; [*0AC4.0020.0002.29EA] # BLACK DIAMOND WITH DOWN ARROW
+29EB ; [*0AC5.0020.0002.29EB] # BLACK LOZENGE
+29EC ; [*0AC6.0020.0002.29EC] # WHITE CIRCLE WITH DOWN ARROW
+29ED ; [*0AC7.0020.0002.29ED] # BLACK CIRCLE WITH DOWN ARROW
+29EE ; [*0AC8.0020.0002.29EE] # ERROR-BARRED WHITE SQUARE
+29EF ; [*0AC9.0020.0002.29EF] # ERROR-BARRED BLACK SQUARE
+29F0 ; [*0ACA.0020.0002.29F0] # ERROR-BARRED WHITE DIAMOND
+29F1 ; [*0ACB.0020.0002.29F1] # ERROR-BARRED BLACK DIAMOND
+29F2 ; [*0ACC.0020.0002.29F2] # ERROR-BARRED WHITE CIRCLE
+29F3 ; [*0ACD.0020.0002.29F3] # ERROR-BARRED BLACK CIRCLE
+29F4 ; [*0ACE.0020.0002.29F4] # RULE-DELAYED
+29F5 ; [*0ACF.0020.0002.29F5] # REVERSE SOLIDUS OPERATOR
+29F6 ; [*0AD0.0020.0002.29F6] # SOLIDUS WITH OVERBAR
+29F7 ; [*0AD1.0020.0002.29F7] # REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8 ; [*0AD2.0020.0002.29F8] # BIG SOLIDUS
+29F9 ; [*0AD3.0020.0002.29F9] # BIG REVERSE SOLIDUS
+29FA ; [*0AD4.0020.0002.29FA] # DOUBLE PLUS
+29FB ; [*0AD5.0020.0002.29FB] # TRIPLE PLUS
+29FC ; [*030D.0020.0002.29FC] # LEFT-POINTING CURVED ANGLE BRACKET
+29FD ; [*030E.0020.0002.29FD] # RIGHT-POINTING CURVED ANGLE BRACKET
+29FE ; [*0AD6.0020.0002.29FE] # TINY
+29FF ; [*0AD7.0020.0002.29FF] # MINY
+2A00 ; [*0AD8.0020.0002.2A00] # N-ARY CIRCLED DOT OPERATOR
+2A01 ; [*0AD9.0020.0002.2A01] # N-ARY CIRCLED PLUS OPERATOR
+2A02 ; [*0ADA.0020.0002.2A02] # N-ARY CIRCLED TIMES OPERATOR
+2A03 ; [*0ADB.0020.0002.2A03] # N-ARY UNION OPERATOR WITH DOT
+2A04 ; [*0ADC.0020.0002.2A04] # N-ARY UNION OPERATOR WITH PLUS
+2A05 ; [*0ADD.0020.0002.2A05] # N-ARY SQUARE INTERSECTION OPERATOR
+2A06 ; [*0ADE.0020.0002.2A06] # N-ARY SQUARE UNION OPERATOR
+2A07 ; [*0ADF.0020.0002.2A07] # TWO LOGICAL AND OPERATOR
+2A08 ; [*0AE0.0020.0002.2A08] # TWO LOGICAL OR OPERATOR
+2A09 ; [*0AE1.0020.0002.2A09] # N-ARY TIMES OPERATOR
+2A0A ; [*0AE2.0020.0002.2A0A] # MODULO TWO SUM
+2A0B ; [*0AE3.0020.0002.2A0B] # SUMMATION WITH INTEGRAL
+2A0C ; [*0575.0020.0004.2A0C][*0575.0020.0004.2A0C][*0575.0020.001F.2A0C][*0575.0020.001F.2A0C] # QUADRUPLE INTEGRAL OPERATOR; QQKN
+2A0D ; [*0AE4.0020.0002.2A0D] # FINITE PART INTEGRAL
+2A0E ; [*0AE5.0020.0002.2A0E] # INTEGRAL WITH DOUBLE STROKE
+2A0F ; [*0AE6.0020.0002.2A0F] # INTEGRAL AVERAGE WITH SLASH
+2A10 ; [*0AE7.0020.0002.2A10] # CIRCULATION FUNCTION
+2A11 ; [*0AE8.0020.0002.2A11] # ANTICLOCKWISE INTEGRATION
+2A12 ; [*0AE9.0020.0002.2A12] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13 ; [*0AEA.0020.0002.2A13] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14 ; [*0AEB.0020.0002.2A14] # LINE INTEGRATION NOT INCLUDING THE POLE
+2A15 ; [*0AEC.0020.0002.2A15] # INTEGRAL AROUND A POINT OPERATOR
+2A16 ; [*0AED.0020.0002.2A16] # QUATERNION INTEGRAL OPERATOR
+2A17 ; [*0AEE.0020.0002.2A17] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18 ; [*0AEF.0020.0002.2A18] # INTEGRAL WITH TIMES SIGN
+2A19 ; [*0AF0.0020.0002.2A19] # INTEGRAL WITH INTERSECTION
+2A1A ; [*0AF1.0020.0002.2A1A] # INTEGRAL WITH UNION
+2A1B ; [*0AF2.0020.0002.2A1B] # INTEGRAL WITH OVERBAR
+2A1C ; [*0AF3.0020.0002.2A1C] # INTEGRAL WITH UNDERBAR
+2A1D ; [*0AF4.0020.0002.2A1D] # JOIN
+2A1E ; [*0AF5.0020.0002.2A1E] # LARGE LEFT TRIANGLE OPERATOR
+2A1F ; [*0AF6.0020.0002.2A1F] # Z NOTATION SCHEMA COMPOSITION
+2A20 ; [*0AF7.0020.0002.2A20] # Z NOTATION SCHEMA PIPING
+2A21 ; [*0AF8.0020.0002.2A21] # Z NOTATION SCHEMA PROJECTION
+2A22 ; [*0AF9.0020.0002.2A22] # PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23 ; [*0AFA.0020.0002.2A23] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24 ; [*0AFB.0020.0002.2A24] # PLUS SIGN WITH TILDE ABOVE
+2A25 ; [*0AFC.0020.0002.2A25] # PLUS SIGN WITH DOT BELOW
+2A26 ; [*0AFD.0020.0002.2A26] # PLUS SIGN WITH TILDE BELOW
+2A27 ; [*0AFE.0020.0002.2A27] # PLUS SIGN WITH SUBSCRIPT TWO
+2A28 ; [*0AFF.0020.0002.2A28] # PLUS SIGN WITH BLACK TRIANGLE
+2A29 ; [*0B00.0020.0002.2A29] # MINUS SIGN WITH COMMA ABOVE
+2A2A ; [*0B01.0020.0002.2A2A] # MINUS SIGN WITH DOT BELOW
+2A2B ; [*0B02.0020.0002.2A2B] # MINUS SIGN WITH FALLING DOTS
+2A2C ; [*0B03.0020.0002.2A2C] # MINUS SIGN WITH RISING DOTS
+2A2D ; [*0B04.0020.0002.2A2D] # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E ; [*0B05.0020.0002.2A2E] # PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F ; [*0B06.0020.0002.2A2F] # VECTOR OR CROSS PRODUCT
+2A30 ; [*0B07.0020.0002.2A30] # MULTIPLICATION SIGN WITH DOT ABOVE
+2A31 ; [*0B08.0020.0002.2A31] # MULTIPLICATION SIGN WITH UNDERBAR
+2A32 ; [*0B09.0020.0002.2A32] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33 ; [*0B0A.0020.0002.2A33] # SMASH PRODUCT
+2A34 ; [*0B0B.0020.0002.2A34] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35 ; [*0B0C.0020.0002.2A35] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36 ; [*0B0D.0020.0002.2A36] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37 ; [*0B0E.0020.0002.2A37] # MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38 ; [*0B0F.0020.0002.2A38] # CIRCLED DIVISION SIGN
+2A39 ; [*0B10.0020.0002.2A39] # PLUS SIGN IN TRIANGLE
+2A3A ; [*0B11.0020.0002.2A3A] # MINUS SIGN IN TRIANGLE
+2A3B ; [*0B12.0020.0002.2A3B] # MULTIPLICATION SIGN IN TRIANGLE
+2A3C ; [*0B13.0020.0002.2A3C] # INTERIOR PRODUCT
+2A3D ; [*0B14.0020.0002.2A3D] # RIGHTHAND INTERIOR PRODUCT
+2A3E ; [*0B15.0020.0002.2A3E] # Z NOTATION RELATIONAL COMPOSITION
+2A3F ; [*0B16.0020.0002.2A3F] # AMALGAMATION OR COPRODUCT
+2A40 ; [*0B17.0020.0002.2A40] # INTERSECTION WITH DOT
+2A41 ; [*0B18.0020.0002.2A41] # UNION WITH MINUS SIGN
+2A42 ; [*0B19.0020.0002.2A42] # UNION WITH OVERBAR
+2A43 ; [*0B1A.0020.0002.2A43] # INTERSECTION WITH OVERBAR
+2A44 ; [*0B1B.0020.0002.2A44] # INTERSECTION WITH LOGICAL AND
+2A45 ; [*0B1C.0020.0002.2A45] # UNION WITH LOGICAL OR
+2A46 ; [*0B1D.0020.0002.2A46] # UNION ABOVE INTERSECTION
+2A47 ; [*0B1E.0020.0002.2A47] # INTERSECTION ABOVE UNION
+2A48 ; [*0B1F.0020.0002.2A48] # UNION ABOVE BAR ABOVE INTERSECTION
+2A49 ; [*0B20.0020.0002.2A49] # INTERSECTION ABOVE BAR ABOVE UNION
+2A4A ; [*0B21.0020.0002.2A4A] # UNION BESIDE AND JOINED WITH UNION
+2A4B ; [*0B22.0020.0002.2A4B] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C ; [*0B23.0020.0002.2A4C] # CLOSED UNION WITH SERIFS
+2A4D ; [*0B24.0020.0002.2A4D] # CLOSED INTERSECTION WITH SERIFS
+2A4E ; [*0B25.0020.0002.2A4E] # DOUBLE SQUARE INTERSECTION
+2A4F ; [*0B26.0020.0002.2A4F] # DOUBLE SQUARE UNION
+2A50 ; [*0B27.0020.0002.2A50] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51 ; [*0B28.0020.0002.2A51] # LOGICAL AND WITH DOT ABOVE
+2A52 ; [*0B29.0020.0002.2A52] # LOGICAL OR WITH DOT ABOVE
+2A53 ; [*0B2A.0020.0002.2A53] # DOUBLE LOGICAL AND
+2A54 ; [*0B2B.0020.0002.2A54] # DOUBLE LOGICAL OR
+2A55 ; [*0B2C.0020.0002.2A55] # TWO INTERSECTING LOGICAL AND
+2A56 ; [*0B2D.0020.0002.2A56] # TWO INTERSECTING LOGICAL OR
+2A57 ; [*0B2E.0020.0002.2A57] # SLOPING LARGE OR
+2A58 ; [*0B2F.0020.0002.2A58] # SLOPING LARGE AND
+2A59 ; [*0B30.0020.0002.2A59] # LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A ; [*0B31.0020.0002.2A5A] # LOGICAL AND WITH MIDDLE STEM
+2A5B ; [*0B32.0020.0002.2A5B] # LOGICAL OR WITH MIDDLE STEM
+2A5C ; [*0B33.0020.0002.2A5C] # LOGICAL AND WITH HORIZONTAL DASH
+2A5D ; [*0B34.0020.0002.2A5D] # LOGICAL OR WITH HORIZONTAL DASH
+2A5E ; [*0B35.0020.0002.2A5E] # LOGICAL AND WITH DOUBLE OVERBAR
+2A5F ; [*0B36.0020.0002.2A5F] # LOGICAL AND WITH UNDERBAR
+2A60 ; [*0B37.0020.0002.2A60] # LOGICAL AND WITH DOUBLE UNDERBAR
+2A61 ; [*0B38.0020.0002.2A61] # SMALL VEE WITH UNDERBAR
+2A62 ; [*0B39.0020.0002.2A62] # LOGICAL OR WITH DOUBLE OVERBAR
+2A63 ; [*0B3A.0020.0002.2A63] # LOGICAL OR WITH DOUBLE UNDERBAR
+2A64 ; [*0B3B.0020.0002.2A64] # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65 ; [*0B3C.0020.0002.2A65] # Z NOTATION RANGE ANTIRESTRICTION
+2A66 ; [*0B3D.0020.0002.2A66] # EQUALS SIGN WITH DOT BELOW
+2A67 ; [*0B3E.0020.0002.2A67] # IDENTICAL WITH DOT ABOVE
+2A68 ; [*0B3F.0020.0002.2A68] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69 ; [*0B40.0020.0002.2A69] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A ; [*0B41.0020.0002.2A6A] # TILDE OPERATOR WITH DOT ABOVE
+2A6B ; [*0B42.0020.0002.2A6B] # TILDE OPERATOR WITH RISING DOTS
+2A6C ; [*0B43.0020.0002.2A6C] # SIMILAR MINUS SIMILAR
+2A6D ; [*0B44.0020.0002.2A6D] # CONGRUENT WITH DOT ABOVE
+2A6E ; [*0B45.0020.0002.2A6E] # EQUALS WITH ASTERISK
+2A6F ; [*0B46.0020.0002.2A6F] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70 ; [*0B47.0020.0002.2A70] # APPROXIMATELY EQUAL OR EQUAL TO
+2A71 ; [*0B48.0020.0002.2A71] # EQUALS SIGN ABOVE PLUS SIGN
+2A72 ; [*0B49.0020.0002.2A72] # PLUS SIGN ABOVE EQUALS SIGN
+2A73 ; [*0B4A.0020.0002.2A73] # EQUALS SIGN ABOVE TILDE OPERATOR
+2A74 ; [*0247.0020.0004.2A74][*0247.0020.0004.2A74][*0555.0020.001F.2A74] # DOUBLE COLON EQUAL; QQKN
+2A75 ; [*0555.0020.0004.2A75][*0555.0020.0004.2A75] # TWO CONSECUTIVE EQUALS SIGNS; QQKN
+2A76 ; [*0555.0020.0004.2A76][*0555.0020.0004.2A76][*0555.0020.001F.2A76] # THREE CONSECUTIVE EQUALS SIGNS; QQKN
+2A77 ; [*0B4B.0020.0002.2A77] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78 ; [*0B4C.0020.0002.2A78] # EQUIVALENT WITH FOUR DOTS ABOVE
+2A79 ; [*0B4D.0020.0002.2A79] # LESS-THAN WITH CIRCLE INSIDE
+2A7A ; [*0B4E.0020.0002.2A7A] # GREATER-THAN WITH CIRCLE INSIDE
+2A7B ; [*0B4F.0020.0002.2A7B] # LESS-THAN WITH QUESTION MARK ABOVE
+2A7C ; [*0B50.0020.0002.2A7C] # GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D ; [*0B51.0020.0002.2A7D] # LESS-THAN OR SLANTED EQUAL TO
+2A7E ; [*0B52.0020.0002.2A7E] # GREATER-THAN OR SLANTED EQUAL TO
+2A7F ; [*0B53.0020.0002.2A7F] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80 ; [*0B54.0020.0002.2A80] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81 ; [*0B55.0020.0002.2A81] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82 ; [*0B56.0020.0002.2A82] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83 ; [*0B57.0020.0002.2A83] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84 ; [*0B58.0020.0002.2A84] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85 ; [*0B59.0020.0002.2A85] # LESS-THAN OR APPROXIMATE
+2A86 ; [*0B5A.0020.0002.2A86] # GREATER-THAN OR APPROXIMATE
+2A87 ; [*0B5B.0020.0002.2A87] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88 ; [*0B5C.0020.0002.2A88] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89 ; [*0B5D.0020.0002.2A89] # LESS-THAN AND NOT APPROXIMATE
+2A8A ; [*0B5E.0020.0002.2A8A] # GREATER-THAN AND NOT APPROXIMATE
+2A8B ; [*0B5F.0020.0002.2A8B] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C ; [*0B60.0020.0002.2A8C] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D ; [*0B61.0020.0002.2A8D] # LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E ; [*0B62.0020.0002.2A8E] # GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F ; [*0B63.0020.0002.2A8F] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90 ; [*0B64.0020.0002.2A90] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91 ; [*0B65.0020.0002.2A91] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92 ; [*0B66.0020.0002.2A92] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93 ; [*0B67.0020.0002.2A93] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94 ; [*0B68.0020.0002.2A94] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95 ; [*0B69.0020.0002.2A95] # SLANTED EQUAL TO OR LESS-THAN
+2A96 ; [*0B6A.0020.0002.2A96] # SLANTED EQUAL TO OR GREATER-THAN
+2A97 ; [*0B6B.0020.0002.2A97] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98 ; [*0B6C.0020.0002.2A98] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99 ; [*0B6D.0020.0002.2A99] # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A ; [*0B6E.0020.0002.2A9A] # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B ; [*0B6F.0020.0002.2A9B] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C ; [*0B70.0020.0002.2A9C] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D ; [*0B71.0020.0002.2A9D] # SIMILAR OR LESS-THAN
+2A9E ; [*0B72.0020.0002.2A9E] # SIMILAR OR GREATER-THAN
+2A9F ; [*0B73.0020.0002.2A9F] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0 ; [*0B74.0020.0002.2AA0] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1 ; [*0B75.0020.0002.2AA1] # DOUBLE NESTED LESS-THAN
+2AA2 ; [*0B76.0020.0002.2AA2] # DOUBLE NESTED GREATER-THAN
+2AA3 ; [*0B77.0020.0002.2AA3] # DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4 ; [*0B78.0020.0002.2AA4] # GREATER-THAN OVERLAPPING LESS-THAN
+2AA5 ; [*0B79.0020.0002.2AA5] # GREATER-THAN BESIDE LESS-THAN
+2AA6 ; [*0B7A.0020.0002.2AA6] # LESS-THAN CLOSED BY CURVE
+2AA7 ; [*0B7B.0020.0002.2AA7] # GREATER-THAN CLOSED BY CURVE
+2AA8 ; [*0B7C.0020.0002.2AA8] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9 ; [*0B7D.0020.0002.2AA9] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA ; [*0B7E.0020.0002.2AAA] # SMALLER THAN
+2AAB ; [*0B7F.0020.0002.2AAB] # LARGER THAN
+2AAC ; [*0B80.0020.0002.2AAC] # SMALLER THAN OR EQUAL TO
+2AAD ; [*0B81.0020.0002.2AAD] # LARGER THAN OR EQUAL TO
+2AAE ; [*0B82.0020.0002.2AAE] # EQUALS SIGN WITH BUMPY ABOVE
+2AAF ; [*0B83.0020.0002.2AAF] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0 ; [*0B84.0020.0002.2AB0] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1 ; [*0B85.0020.0002.2AB1] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2 ; [*0B86.0020.0002.2AB2] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3 ; [*0B87.0020.0002.2AB3] # PRECEDES ABOVE EQUALS SIGN
+2AB4 ; [*0B88.0020.0002.2AB4] # SUCCEEDS ABOVE EQUALS SIGN
+2AB5 ; [*0B89.0020.0002.2AB5] # PRECEDES ABOVE NOT EQUAL TO
+2AB6 ; [*0B8A.0020.0002.2AB6] # SUCCEEDS ABOVE NOT EQUAL TO
+2AB7 ; [*0B8B.0020.0002.2AB7] # PRECEDES ABOVE ALMOST EQUAL TO
+2AB8 ; [*0B8C.0020.0002.2AB8] # SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9 ; [*0B8D.0020.0002.2AB9] # PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA ; [*0B8E.0020.0002.2ABA] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB ; [*0B8F.0020.0002.2ABB] # DOUBLE PRECEDES
+2ABC ; [*0B90.0020.0002.2ABC] # DOUBLE SUCCEEDS
+2ABD ; [*0B91.0020.0002.2ABD] # SUBSET WITH DOT
+2ABE ; [*0B92.0020.0002.2ABE] # SUPERSET WITH DOT
+2ABF ; [*0B93.0020.0002.2ABF] # SUBSET WITH PLUS SIGN BELOW
+2AC0 ; [*0B94.0020.0002.2AC0] # SUPERSET WITH PLUS SIGN BELOW
+2AC1 ; [*0B95.0020.0002.2AC1] # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2 ; [*0B96.0020.0002.2AC2] # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3 ; [*0B97.0020.0002.2AC3] # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4 ; [*0B98.0020.0002.2AC4] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5 ; [*0B99.0020.0002.2AC5] # SUBSET OF ABOVE EQUALS SIGN
+2AC6 ; [*0B9A.0020.0002.2AC6] # SUPERSET OF ABOVE EQUALS SIGN
+2AC7 ; [*0B9B.0020.0002.2AC7] # SUBSET OF ABOVE TILDE OPERATOR
+2AC8 ; [*0B9C.0020.0002.2AC8] # SUPERSET OF ABOVE TILDE OPERATOR
+2AC9 ; [*0B9D.0020.0002.2AC9] # SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA ; [*0B9E.0020.0002.2ACA] # SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB ; [*0B9F.0020.0002.2ACB] # SUBSET OF ABOVE NOT EQUAL TO
+2ACC ; [*0BA0.0020.0002.2ACC] # SUPERSET OF ABOVE NOT EQUAL TO
+2ACD ; [*0BA1.0020.0002.2ACD] # SQUARE LEFT OPEN BOX OPERATOR
+2ACE ; [*0BA2.0020.0002.2ACE] # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF ; [*0BA3.0020.0002.2ACF] # CLOSED SUBSET
+2AD0 ; [*0BA4.0020.0002.2AD0] # CLOSED SUPERSET
+2AD1 ; [*0BA5.0020.0002.2AD1] # CLOSED SUBSET OR EQUAL TO
+2AD2 ; [*0BA6.0020.0002.2AD2] # CLOSED SUPERSET OR EQUAL TO
+2AD3 ; [*0BA7.0020.0002.2AD3] # SUBSET ABOVE SUPERSET
+2AD4 ; [*0BA8.0020.0002.2AD4] # SUPERSET ABOVE SUBSET
+2AD5 ; [*0BA9.0020.0002.2AD5] # SUBSET ABOVE SUBSET
+2AD6 ; [*0BAA.0020.0002.2AD6] # SUPERSET ABOVE SUPERSET
+2AD7 ; [*0BAB.0020.0002.2AD7] # SUPERSET BESIDE SUBSET
+2AD8 ; [*0BAC.0020.0002.2AD8] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9 ; [*0BAD.0020.0002.2AD9] # ELEMENT OF OPENING DOWNWARDS
+2ADA ; [*0BAE.0020.0002.2ADA] # PITCHFORK WITH TEE TOP
+2ADB ; [*0BAF.0020.0002.2ADB] # TRANSVERSAL INTERSECTION
+2ADC ; [*0BB0.0020.0002.2ADD][.0000.0054.0002.0338] # FORKING; QQCM
+2ADD ; [*0BB0.0020.0002.2ADD] # NONFORKING
+2ADE ; [*0BB1.0020.0002.2ADE] # SHORT LEFT TACK
+2ADF ; [*0BB2.0020.0002.2ADF] # SHORT DOWN TACK
+2AE0 ; [*0BB3.0020.0002.2AE0] # SHORT UP TACK
+2AE1 ; [*0BB4.0020.0002.2AE1] # PERPENDICULAR WITH S
+2AE2 ; [*0BB5.0020.0002.2AE2] # VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3 ; [*0BB6.0020.0002.2AE3] # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4 ; [*0BB7.0020.0002.2AE4] # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5 ; [*0BB8.0020.0002.2AE5] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6 ; [*0BB9.0020.0002.2AE6] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7 ; [*0BBA.0020.0002.2AE7] # SHORT DOWN TACK WITH OVERBAR
+2AE8 ; [*0BBB.0020.0002.2AE8] # SHORT UP TACK WITH UNDERBAR
+2AE9 ; [*0BBC.0020.0002.2AE9] # SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA ; [*0BBD.0020.0002.2AEA] # DOUBLE DOWN TACK
+2AEB ; [*0BBE.0020.0002.2AEB] # DOUBLE UP TACK
+2AEC ; [*0BBF.0020.0002.2AEC] # DOUBLE STROKE NOT SIGN
+2AED ; [*0BC0.0020.0002.2AED] # REVERSED DOUBLE STROKE NOT SIGN
+2AEE ; [*0BC1.0020.0002.2AEE] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF ; [*0BC2.0020.0002.2AEF] # VERTICAL LINE WITH CIRCLE ABOVE
+2AF0 ; [*0BC3.0020.0002.2AF0] # VERTICAL LINE WITH CIRCLE BELOW
+2AF1 ; [*0BC4.0020.0002.2AF1] # DOWN TACK WITH CIRCLE BELOW
+2AF2 ; [*0BC5.0020.0002.2AF2] # PARALLEL WITH HORIZONTAL STROKE
+2AF3 ; [*0BC6.0020.0002.2AF3] # PARALLEL WITH TILDE OPERATOR
+2AF4 ; [*0BC7.0020.0002.2AF4] # TRIPLE VERTICAL BAR BINARY RELATION
+2AF5 ; [*0BC8.0020.0002.2AF5] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6 ; [*0BC9.0020.0002.2AF6] # TRIPLE COLON OPERATOR
+2AF7 ; [*0BCA.0020.0002.2AF7] # TRIPLE NESTED LESS-THAN
+2AF8 ; [*0BCB.0020.0002.2AF8] # TRIPLE NESTED GREATER-THAN
+2AF9 ; [*0BCC.0020.0002.2AF9] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA ; [*0BCD.0020.0002.2AFA] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB ; [*0BCE.0020.0002.2AFB] # TRIPLE SOLIDUS BINARY RELATION
+2AFC ; [*0BCF.0020.0002.2AFC] # LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD ; [*0BD0.0020.0002.2AFD] # DOUBLE SOLIDUS OPERATOR
+2AFE ; [*0BD1.0020.0002.2AFE] # WHITE VERTICAL BAR
+2AFF ; [*0BD2.0020.0002.2AFF] # N-ARY WHITE VERTICAL BAR
+2B00 ; [*0BD3.0020.0002.2B00] # NORTH EAST WHITE ARROW
+2B01 ; [*0BD4.0020.0002.2B01] # NORTH WEST WHITE ARROW
+2B02 ; [*0BD5.0020.0002.2B02] # SOUTH EAST WHITE ARROW
+2B03 ; [*0BD6.0020.0002.2B03] # SOUTH WEST WHITE ARROW
+2B04 ; [*0BD7.0020.0002.2B04] # LEFT RIGHT WHITE ARROW
+2B05 ; [*0BD8.0020.0002.2B05] # LEFTWARDS BLACK ARROW
+2B06 ; [*0BD9.0020.0002.2B06] # UPWARDS BLACK ARROW
+2B07 ; [*0BDA.0020.0002.2B07] # DOWNWARDS BLACK ARROW
+2B08 ; [*0BDB.0020.0002.2B08] # NORTH EAST BLACK ARROW
+2B09 ; [*0BDC.0020.0002.2B09] # NORTH WEST BLACK ARROW
+2B0A ; [*0BDD.0020.0002.2B0A] # SOUTH EAST BLACK ARROW
+2B0B ; [*0BDE.0020.0002.2B0B] # SOUTH WEST BLACK ARROW
+2B0C ; [*0BDF.0020.0002.2B0C] # LEFT RIGHT BLACK ARROW
+2B0D ; [*0BE0.0020.0002.2B0D] # UP DOWN BLACK ARROW
+2B0E ; [*0BE1.0020.0002.2B0E] # RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F ; [*0BE2.0020.0002.2B0F] # RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10 ; [*0BE3.0020.0002.2B10] # LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11 ; [*0BE4.0020.0002.2B11] # LEFTWARDS ARROW WITH TIP UPWARDS
+2B12 ; [*0BE5.0020.0002.2B12] # SQUARE WITH TOP HALF BLACK
+2B13 ; [*0BE6.0020.0002.2B13] # SQUARE WITH BOTTOM HALF BLACK
+2B14 ; [*0BE7.0020.0002.2B14] # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK
+2B15 ; [*0BE8.0020.0002.2B15] # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK
+2B16 ; [*0BE9.0020.0002.2B16] # DIAMOND WITH LEFT HALF BLACK
+2B17 ; [*0BEA.0020.0002.2B17] # DIAMOND WITH RIGHT HALF BLACK
+2B18 ; [*0BEB.0020.0002.2B18] # DIAMOND WITH TOP HALF BLACK
+2B19 ; [*0BEC.0020.0002.2B19] # DIAMOND WITH BOTTOM HALF BLACK
+2B1A ; [*0BED.0020.0002.2B1A] # DOTTED SQUARE
+2B1B ; [*0BEE.0020.0002.2B1B] # BLACK LARGE SQUARE
+2B1C ; [*0BEF.0020.0002.2B1C] # WHITE LARGE SQUARE
+2B1D ; [*0BF0.0020.0002.2B1D] # BLACK VERY SMALL SQUARE
+2B1E ; [*0BF1.0020.0002.2B1E] # WHITE VERY SMALL SQUARE
+2B1F ; [*0BF2.0020.0002.2B1F] # BLACK PENTAGON
+2B20 ; [*0BF3.0020.0002.2B20] # WHITE PENTAGON
+2B21 ; [*0BF4.0020.0002.2B21] # WHITE HEXAGON
+2B22 ; [*0BF5.0020.0002.2B22] # BLACK HEXAGON
+2B23 ; [*0BF6.0020.0002.2B23] # HORIZONTAL BLACK HEXAGON
+2B24 ; [*0BF7.0020.0002.2B24] # BLACK LARGE CIRCLE
+2B25 ; [*0BF8.0020.0002.2B25] # BLACK MEDIUM DIAMOND
+2B26 ; [*0BF9.0020.0002.2B26] # WHITE MEDIUM DIAMOND
+2B27 ; [*0BFA.0020.0002.2B27] # BLACK MEDIUM LOZENGE
+2B28 ; [*0BFB.0020.0002.2B28] # WHITE MEDIUM LOZENGE
+2B29 ; [*0BFC.0020.0002.2B29] # BLACK SMALL DIAMOND
+2B2A ; [*0BFD.0020.0002.2B2A] # BLACK SMALL LOZENGE
+2B2B ; [*0BFE.0020.0002.2B2B] # WHITE SMALL LOZENGE
+2B2C ; [*0BFF.0020.0002.2B2C] # BLACK HORIZONTAL ELLIPSE
+2B2D ; [*0C00.0020.0002.2B2D] # WHITE HORIZONTAL ELLIPSE
+2B2E ; [*0C01.0020.0002.2B2E] # BLACK VERTICAL ELLIPSE
+2B2F ; [*0C02.0020.0002.2B2F] # WHITE VERTICAL ELLIPSE
+2B30 ; [*0C03.0020.0002.2B30] # LEFT ARROW WITH SMALL CIRCLE
+2B31 ; [*0C04.0020.0002.2B31] # THREE LEFTWARDS ARROWS
+2B32 ; [*0C05.0020.0002.2B32] # LEFT ARROW WITH CIRCLED PLUS
+2B33 ; [*0C06.0020.0002.2B33] # LONG LEFTWARDS SQUIGGLE ARROW
+2B34 ; [*0C07.0020.0002.2B34] # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2B35 ; [*0C08.0020.0002.2B35] # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2B36 ; [*0C09.0020.0002.2B36] # LEFTWARDS TWO-HEADED ARROW FROM BAR
+2B37 ; [*0C0A.0020.0002.2B37] # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW
+2B38 ; [*0C0B.0020.0002.2B38] # LEFTWARDS ARROW WITH DOTTED STEM
+2B39 ; [*0C0C.0020.0002.2B39] # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2B3A ; [*0C0D.0020.0002.2B3A] # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3B ; [*0C0E.0020.0002.2B3B] # LEFTWARDS TWO-HEADED ARROW WITH TAIL
+2B3C ; [*0C0F.0020.0002.2B3C] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2B3D ; [*0C10.0020.0002.2B3D] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3E ; [*0C11.0020.0002.2B3E] # LEFTWARDS ARROW THROUGH X
+2B3F ; [*0C12.0020.0002.2B3F] # WAVE ARROW POINTING DIRECTLY LEFT
+2B40 ; [*0C13.0020.0002.2B40] # EQUALS SIGN ABOVE LEFTWARDS ARROW
+2B41 ; [*0C14.0020.0002.2B41] # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B42 ; [*0C15.0020.0002.2B42] # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B43 ; [*0C16.0020.0002.2B43] # RIGHTWARDS ARROW THROUGH GREATER-THAN
+2B44 ; [*0C17.0020.0002.2B44] # RIGHTWARDS ARROW THROUGH SUPERSET
+2B45 ; [*0C18.0020.0002.2B45] # LEFTWARDS QUADRUPLE ARROW
+2B46 ; [*0C19.0020.0002.2B46] # RIGHTWARDS QUADRUPLE ARROW
+2B47 ; [*0C1A.0020.0002.2B47] # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2B48 ; [*0C1B.0020.0002.2B48] # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B49 ; [*0C1C.0020.0002.2B49] # TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B4A ; [*0C1D.0020.0002.2B4A] # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO
+2B4B ; [*0C1E.0020.0002.2B4B] # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B4C ; [*0C1F.0020.0002.2B4C] # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B50 ; [*0C20.0020.0002.2B50] # WHITE MEDIUM STAR
+2B51 ; [*0C21.0020.0002.2B51] # BLACK SMALL STAR
+2B52 ; [*0C22.0020.0002.2B52] # WHITE SMALL STAR
+2B53 ; [*0C23.0020.0002.2B53] # BLACK RIGHT-POINTING PENTAGON
+2B54 ; [*0C24.0020.0002.2B54] # WHITE RIGHT-POINTING PENTAGON
+2B55 ; [*0C25.0020.0002.2B55] # HEAVY LARGE CIRCLE
+2B56 ; [*0C26.0020.0002.2B56] # HEAVY OVAL WITH OVAL INSIDE
+2B57 ; [*0C27.0020.0002.2B57] # HEAVY CIRCLE WITH CIRCLE INSIDE
+2B58 ; [*0C28.0020.0002.2B58] # HEAVY CIRCLE
+2B59 ; [*0C29.0020.0002.2B59] # HEAVY CIRCLED SALTIRE
+2CE5 ; [*0C2A.0020.0002.2CE5] # COPTIC SYMBOL MI RO
+2CE6 ; [*0C2B.0020.0002.2CE6] # COPTIC SYMBOL PI RO
+2CE7 ; [*0C2C.0020.0002.2CE7] # COPTIC SYMBOL STAUROS
+2CE8 ; [*0C2D.0020.0002.2CE8] # COPTIC SYMBOL TAU RO
+2CE9 ; [*0C2E.0020.0002.2CE9] # COPTIC SYMBOL KHI RO
+2CEA ; [*0C2F.0020.0002.2CEA] # COPTIC SYMBOL SHIMA SIMA
+2CF9 ; [*028B.0020.0002.2CF9] # COPTIC OLD NUBIAN FULL STOP
+2CFA ; [*027B.0020.0002.2CFA] # COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB ; [*027C.0020.0002.2CFB] # COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC ; [*02E0.0020.0002.2CFC] # COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD ; [*114C.0020.0002.2CFD] # COPTIC FRACTION ONE HALF
+2CFE ; [*028C.0020.0002.2CFE] # COPTIC FULL STOP
+2CFF ; [*02E1.0020.0002.2CFF] # COPTIC MORPHOLOGICAL DIVIDER
+2E00 ; [*037E.0020.0002.2E00] # RIGHT ANGLE SUBSTITUTION MARKER
+2E01 ; [*037F.0020.0002.2E01] # RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02 ; [*0329.0020.0002.2E02] # LEFT SUBSTITUTION BRACKET
+2E03 ; [*032A.0020.0002.2E03] # RIGHT SUBSTITUTION BRACKET
+2E04 ; [*032B.0020.0002.2E04] # LEFT DOTTED SUBSTITUTION BRACKET
+2E05 ; [*032C.0020.0002.2E05] # RIGHT DOTTED SUBSTITUTION BRACKET
+2E06 ; [*0380.0020.0002.2E06] # RAISED INTERPOLATION MARKER
+2E07 ; [*0381.0020.0002.2E07] # RAISED DOTTED INTERPOLATION MARKER
+2E08 ; [*0382.0020.0002.2E08] # DOTTED TRANSPOSITION MARKER
+2E09 ; [*032D.0020.0002.2E09] # LEFT TRANSPOSITION BRACKET
+2E0A ; [*032E.0020.0002.2E0A] # RIGHT TRANSPOSITION BRACKET
+2E0B ; [*0383.0020.0002.2E0B] # RAISED SQUARE
+2E0C ; [*032F.0020.0002.2E0C] # LEFT RAISED OMISSION BRACKET
+2E0D ; [*0330.0020.0002.2E0D] # RIGHT RAISED OMISSION BRACKET
+2E0E ; [*0384.0020.0002.2E0E] # EDITORIAL CORONIS
+2E0F ; [*0385.0020.0002.2E0F] # PARAGRAPHOS
+2E10 ; [*0386.0020.0002.2E10] # FORKED PARAGRAPHOS
+2E11 ; [*0387.0020.0002.2E11] # REVERSED FORKED PARAGRAPHOS
+2E12 ; [*0388.0020.0002.2E12] # HYPODIASTOLE
+2E13 ; [*0389.0020.0002.2E13] # DOTTED OBELOS
+2E14 ; [*038A.0020.0002.2E14] # DOWNWARDS ANCORA
+2E15 ; [*038B.0020.0002.2E15] # UPWARDS ANCORA
+2E16 ; [*038C.0020.0002.2E16] # DOTTED RIGHT-POINTING ANGLE
+2E17 ; [*022F.0020.0002.2E17] # DOUBLE OBLIQUE HYPHEN
+2E18 ; [*0280.0020.0002.2E18] # INVERTED INTERROBANG
+2E19 ; [*02E2.0020.0002.2E19] # PALM BRANCH
+2E1A ; [*038D.0020.0002.2E1A] # HYPHEN WITH DIAERESIS
+2E1B ; [*038E.0020.0002.2E1B] # TILDE WITH RING ABOVE
+2E1C ; [*0331.0020.0002.2E1C] # LEFT LOW PARAPHRASE BRACKET
+2E1D ; [*0332.0020.0002.2E1D] # RIGHT LOW PARAPHRASE BRACKET
+2E1E ; [*038F.0020.0002.2E1E] # TILDE WITH DOT ABOVE
+2E1F ; [*0390.0020.0002.2E1F] # TILDE WITH DOT BELOW
+2E20 ; [*0333.0020.0002.2E20] # LEFT VERTICAL BAR WITH QUILL
+2E21 ; [*0334.0020.0002.2E21] # RIGHT VERTICAL BAR WITH QUILL
+2E22 ; [*0335.0020.0002.2E22] # TOP LEFT HALF BRACKET
+2E23 ; [*0336.0020.0002.2E23] # TOP RIGHT HALF BRACKET
+2E24 ; [*0337.0020.0002.2E24] # BOTTOM LEFT HALF BRACKET
+2E25 ; [*0338.0020.0002.2E25] # BOTTOM RIGHT HALF BRACKET
+2E26 ; [*0339.0020.0002.2E26] # LEFT SIDEWAYS U BRACKET
+2E27 ; [*033A.0020.0002.2E27] # RIGHT SIDEWAYS U BRACKET
+2E28 ; [*033B.0020.0002.2E28] # LEFT DOUBLE PARENTHESIS
+2E29 ; [*033C.0020.0002.2E29] # RIGHT DOUBLE PARENTHESIS
+2E2A ; [*02DC.0020.0002.2E2A] # TWO DOTS OVER ONE DOT PUNCTUATION
+2E2B ; [*02DD.0020.0002.2E2B] # ONE DOT OVER TWO DOTS PUNCTUATION
+2E2C ; [*02DE.0020.0002.2E2C] # SQUARED FOUR DOT PUNCTUATION
+2E2D ; [*02DF.0020.0002.2E2D] # FIVE DOT MARK
+2E2E ; [*0275.0020.0002.2E2E] # REVERSED QUESTION MARK
+2E30 ; [*028D.0020.0002.2E30] # RING POINT
+2E31 ; [*0293.0020.0002.2E31] # WORD SEPARATOR MIDDLE DOT
+2FF0 ; [*10D4.0020.0002.2FF0] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1 ; [*10D5.0020.0002.2FF1] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2 ; [*10D6.0020.0002.2FF2] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3 ; [*10D7.0020.0002.2FF3] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4 ; [*10D8.0020.0002.2FF4] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5 ; [*10D9.0020.0002.2FF5] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6 ; [*10DA.0020.0002.2FF6] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7 ; [*10DB.0020.0002.2FF7] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8 ; [*10DC.0020.0002.2FF8] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9 ; [*10DD.0020.0002.2FF9] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA ; [*10DE.0020.0002.2FFA] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB ; [*10DF.0020.0002.2FFB] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000 ; [*020A.0020.0003.3000] # IDEOGRAPHIC SPACE; QQK
+3001 ; [*0240.0020.0002.3001] # IDEOGRAPHIC COMMA
+3002 ; [*0291.0020.0002.3002] # IDEOGRAPHIC FULL STOP
+3003 ; [*0374.0020.0002.3003] # DITTO MARK
+3004 ; [*1104.0020.0002.3004] # JAPANESE INDUSTRIAL STANDARD SYMBOL
+3008 ; [*033D.0020.0002.3008] # LEFT ANGLE BRACKET
+3009 ; [*033E.0020.0002.3009] # RIGHT ANGLE BRACKET
+300A ; [*033F.0020.0002.300A] # LEFT DOUBLE ANGLE BRACKET
+300B ; [*0340.0020.0002.300B] # RIGHT DOUBLE ANGLE BRACKET
+300C ; [*0341.0020.0002.300C] # LEFT CORNER BRACKET
+300D ; [*0342.0020.0002.300D] # RIGHT CORNER BRACKET
+300E ; [*0343.0020.0002.300E] # LEFT WHITE CORNER BRACKET
+300F ; [*0344.0020.0002.300F] # RIGHT WHITE CORNER BRACKET
+3010 ; [*0345.0020.0002.3010] # LEFT BLACK LENTICULAR BRACKET
+3011 ; [*0346.0020.0002.3011] # RIGHT BLACK LENTICULAR BRACKET
+3012 ; [*1105.0020.0002.3012] # POSTAL MARK
+3013 ; [*1106.0020.0002.3013] # GETA MARK
+3014 ; [*0347.0020.0002.3014] # LEFT TORTOISE SHELL BRACKET
+3015 ; [*0348.0020.0002.3015] # RIGHT TORTOISE SHELL BRACKET
+3016 ; [*0349.0020.0002.3016] # LEFT WHITE LENTICULAR BRACKET
+3017 ; [*034A.0020.0002.3017] # RIGHT WHITE LENTICULAR BRACKET
+3018 ; [*034B.0020.0002.3018] # LEFT WHITE TORTOISE SHELL BRACKET
+3019 ; [*034C.0020.0002.3019] # RIGHT WHITE TORTOISE SHELL BRACKET
+301A ; [*034D.0020.0002.301A] # LEFT WHITE SQUARE BRACKET
+301B ; [*034E.0020.0002.301B] # RIGHT WHITE SQUARE BRACKET
+301C ; [*0230.0020.0002.301C] # WAVE DASH
+301D ; [*02FA.0020.0002.301D] # REVERSED DOUBLE PRIME QUOTATION MARK
+301E ; [*02FB.0020.0002.301E] # DOUBLE PRIME QUOTATION MARK
+301F ; [*02FC.0020.0002.301F] # LOW DOUBLE PRIME QUOTATION MARK
+3020 ; [*1107.0020.0002.3020] # POSTAL MARK FACE
+3030 ; [*0231.0020.0002.3030] # WAVY DASH
+3036 ; [*1105.0020.0004.3036] # CIRCLED POSTAL MARK; QQK
+3037 ; [*1108.0020.0002.3037] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+303D ; [*0375.0020.0002.303D] # PART ALTERNATION MARK
+303E ; [*1109.0020.0002.303E] # IDEOGRAPHIC VARIATION INDICATOR
+303F ; [*110A.0020.0002.303F] # IDEOGRAPHIC HALF FILL SPACE
+309B ; [*0220.0020.0002.309B] # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C ; [*0221.0020.0002.309C] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30A0 ; [*0232.0020.0002.30A0] # KATAKANA-HIRAGANA DOUBLE HYPHEN
+30FB ; [*0233.0020.0002.30FB] # KATAKANA MIDDLE DOT
+3190 ; [*110B.0020.0002.3190] # IDEOGRAPHIC ANNOTATION LINKING MARK
+3191 ; [*110C.0020.0002.3191] # IDEOGRAPHIC ANNOTATION REVERSE MARK
+31C0 ; [*10E0.0020.0002.31C0] # CJK STROKE T
+31C1 ; [*10E1.0020.0002.31C1] # CJK STROKE WG
+31C2 ; [*10E2.0020.0002.31C2] # CJK STROKE XG
+31C3 ; [*10E3.0020.0002.31C3] # CJK STROKE BXG
+31C4 ; [*10E4.0020.0002.31C4] # CJK STROKE SW
+31C5 ; [*10E5.0020.0002.31C5] # CJK STROKE HZZ
+31C6 ; [*10E6.0020.0002.31C6] # CJK STROKE HZG
+31C7 ; [*10E7.0020.0002.31C7] # CJK STROKE HP
+31C8 ; [*10E8.0020.0002.31C8] # CJK STROKE HZWG
+31C9 ; [*10E9.0020.0002.31C9] # CJK STROKE SZWG
+31CA ; [*10EA.0020.0002.31CA] # CJK STROKE HZT
+31CB ; [*10EB.0020.0002.31CB] # CJK STROKE HZZP
+31CC ; [*10EC.0020.0002.31CC] # CJK STROKE HPWG
+31CD ; [*10ED.0020.0002.31CD] # CJK STROKE HZW
+31CE ; [*10EE.0020.0002.31CE] # CJK STROKE HZZZ
+31CF ; [*10EF.0020.0002.31CF] # CJK STROKE N
+31D0 ; [*10F0.0020.0002.31D0] # CJK STROKE H
+31D1 ; [*10F1.0020.0002.31D1] # CJK STROKE S
+31D2 ; [*10F2.0020.0002.31D2] # CJK STROKE P
+31D3 ; [*10F3.0020.0002.31D3] # CJK STROKE SP
+31D4 ; [*10F4.0020.0002.31D4] # CJK STROKE D
+31D5 ; [*10F5.0020.0002.31D5] # CJK STROKE HZ
+31D6 ; [*10F6.0020.0002.31D6] # CJK STROKE HG
+31D7 ; [*10F7.0020.0002.31D7] # CJK STROKE SZ
+31D8 ; [*10F8.0020.0002.31D8] # CJK STROKE SWZ
+31D9 ; [*10F9.0020.0002.31D9] # CJK STROKE ST
+31DA ; [*10FA.0020.0002.31DA] # CJK STROKE SG
+31DB ; [*10FB.0020.0002.31DB] # CJK STROKE PD
+31DC ; [*10FC.0020.0002.31DC] # CJK STROKE PZ
+31DD ; [*10FD.0020.0002.31DD] # CJK STROKE TN
+31DE ; [*10FE.0020.0002.31DE] # CJK STROKE SZZ
+31DF ; [*10FF.0020.0002.31DF] # CJK STROKE SWG
+31E0 ; [*1100.0020.0002.31E0] # CJK STROKE HXWG
+31E1 ; [*1101.0020.0002.31E1] # CJK STROKE HZZZG
+31E2 ; [*1102.0020.0002.31E2] # CJK STROKE PG
+31E3 ; [*1103.0020.0002.31E3] # CJK STROKE Q
+327F ; [*110D.0020.0002.327F] # KOREAN STANDARD SYMBOL
+4DC0 ; [*0D3E.0020.0002.4DC0] # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1 ; [*0D3F.0020.0002.4DC1] # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2 ; [*0D40.0020.0002.4DC2] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3 ; [*0D41.0020.0002.4DC3] # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4 ; [*0D42.0020.0002.4DC4] # HEXAGRAM FOR WAITING
+4DC5 ; [*0D43.0020.0002.4DC5] # HEXAGRAM FOR CONFLICT
+4DC6 ; [*0D44.0020.0002.4DC6] # HEXAGRAM FOR THE ARMY
+4DC7 ; [*0D45.0020.0002.4DC7] # HEXAGRAM FOR HOLDING TOGETHER
+4DC8 ; [*0D46.0020.0002.4DC8] # HEXAGRAM FOR SMALL TAMING
+4DC9 ; [*0D47.0020.0002.4DC9] # HEXAGRAM FOR TREADING
+4DCA ; [*0D48.0020.0002.4DCA] # HEXAGRAM FOR PEACE
+4DCB ; [*0D49.0020.0002.4DCB] # HEXAGRAM FOR STANDSTILL
+4DCC ; [*0D4A.0020.0002.4DCC] # HEXAGRAM FOR FELLOWSHIP
+4DCD ; [*0D4B.0020.0002.4DCD] # HEXAGRAM FOR GREAT POSSESSION
+4DCE ; [*0D4C.0020.0002.4DCE] # HEXAGRAM FOR MODESTY
+4DCF ; [*0D4D.0020.0002.4DCF] # HEXAGRAM FOR ENTHUSIASM
+4DD0 ; [*0D4E.0020.0002.4DD0] # HEXAGRAM FOR FOLLOWING
+4DD1 ; [*0D4F.0020.0002.4DD1] # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2 ; [*0D50.0020.0002.4DD2] # HEXAGRAM FOR APPROACH
+4DD3 ; [*0D51.0020.0002.4DD3] # HEXAGRAM FOR CONTEMPLATION
+4DD4 ; [*0D52.0020.0002.4DD4] # HEXAGRAM FOR BITING THROUGH
+4DD5 ; [*0D53.0020.0002.4DD5] # HEXAGRAM FOR GRACE
+4DD6 ; [*0D54.0020.0002.4DD6] # HEXAGRAM FOR SPLITTING APART
+4DD7 ; [*0D55.0020.0002.4DD7] # HEXAGRAM FOR RETURN
+4DD8 ; [*0D56.0020.0002.4DD8] # HEXAGRAM FOR INNOCENCE
+4DD9 ; [*0D57.0020.0002.4DD9] # HEXAGRAM FOR GREAT TAMING
+4DDA ; [*0D58.0020.0002.4DDA] # HEXAGRAM FOR MOUTH CORNERS
+4DDB ; [*0D59.0020.0002.4DDB] # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC ; [*0D5A.0020.0002.4DDC] # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD ; [*0D5B.0020.0002.4DDD] # HEXAGRAM FOR THE CLINGING FIRE
+4DDE ; [*0D5C.0020.0002.4DDE] # HEXAGRAM FOR INFLUENCE
+4DDF ; [*0D5D.0020.0002.4DDF] # HEXAGRAM FOR DURATION
+4DE0 ; [*0D5E.0020.0002.4DE0] # HEXAGRAM FOR RETREAT
+4DE1 ; [*0D5F.0020.0002.4DE1] # HEXAGRAM FOR GREAT POWER
+4DE2 ; [*0D60.0020.0002.4DE2] # HEXAGRAM FOR PROGRESS
+4DE3 ; [*0D61.0020.0002.4DE3] # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4 ; [*0D62.0020.0002.4DE4] # HEXAGRAM FOR THE FAMILY
+4DE5 ; [*0D63.0020.0002.4DE5] # HEXAGRAM FOR OPPOSITION
+4DE6 ; [*0D64.0020.0002.4DE6] # HEXAGRAM FOR OBSTRUCTION
+4DE7 ; [*0D65.0020.0002.4DE7] # HEXAGRAM FOR DELIVERANCE
+4DE8 ; [*0D66.0020.0002.4DE8] # HEXAGRAM FOR DECREASE
+4DE9 ; [*0D67.0020.0002.4DE9] # HEXAGRAM FOR INCREASE
+4DEA ; [*0D68.0020.0002.4DEA] # HEXAGRAM FOR BREAKTHROUGH
+4DEB ; [*0D69.0020.0002.4DEB] # HEXAGRAM FOR COMING TO MEET
+4DEC ; [*0D6A.0020.0002.4DEC] # HEXAGRAM FOR GATHERING TOGETHER
+4DED ; [*0D6B.0020.0002.4DED] # HEXAGRAM FOR PUSHING UPWARD
+4DEE ; [*0D6C.0020.0002.4DEE] # HEXAGRAM FOR OPPRESSION
+4DEF ; [*0D6D.0020.0002.4DEF] # HEXAGRAM FOR THE WELL
+4DF0 ; [*0D6E.0020.0002.4DF0] # HEXAGRAM FOR REVOLUTION
+4DF1 ; [*0D6F.0020.0002.4DF1] # HEXAGRAM FOR THE CAULDRON
+4DF2 ; [*0D70.0020.0002.4DF2] # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3 ; [*0D71.0020.0002.4DF3] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4 ; [*0D72.0020.0002.4DF4] # HEXAGRAM FOR DEVELOPMENT
+4DF5 ; [*0D73.0020.0002.4DF5] # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6 ; [*0D74.0020.0002.4DF6] # HEXAGRAM FOR ABUNDANCE
+4DF7 ; [*0D75.0020.0002.4DF7] # HEXAGRAM FOR THE WANDERER
+4DF8 ; [*0D76.0020.0002.4DF8] # HEXAGRAM FOR THE GENTLE WIND
+4DF9 ; [*0D77.0020.0002.4DF9] # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA ; [*0D78.0020.0002.4DFA] # HEXAGRAM FOR DISPERSION
+4DFB ; [*0D79.0020.0002.4DFB] # HEXAGRAM FOR LIMITATION
+4DFC ; [*0D7A.0020.0002.4DFC] # HEXAGRAM FOR INNER TRUTH
+4DFD ; [*0D7B.0020.0002.4DFD] # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE ; [*0D7C.0020.0002.4DFE] # HEXAGRAM FOR AFTER COMPLETION
+4DFF ; [*0D7D.0020.0002.4DFF] # HEXAGRAM FOR BEFORE COMPLETION
+A490 ; [*0DD5.0020.0002.A490] # YI RADICAL QOT
+A491 ; [*0DD6.0020.0002.A491] # YI RADICAL LI
+A492 ; [*0DD7.0020.0002.A492] # YI RADICAL KIT
+A493 ; [*0DD8.0020.0002.A493] # YI RADICAL NYIP
+A494 ; [*0DD9.0020.0002.A494] # YI RADICAL CYP
+A495 ; [*0DDA.0020.0002.A495] # YI RADICAL SSI
+A496 ; [*0DDB.0020.0002.A496] # YI RADICAL GGOP
+A497 ; [*0DDC.0020.0002.A497] # YI RADICAL GEP
+A498 ; [*0DDD.0020.0002.A498] # YI RADICAL MI
+A499 ; [*0DDE.0020.0002.A499] # YI RADICAL HXIT
+A49A ; [*0DDF.0020.0002.A49A] # YI RADICAL LYR
+A49B ; [*0DE0.0020.0002.A49B] # YI RADICAL BBUT
+A49C ; [*0DE1.0020.0002.A49C] # YI RADICAL MOP
+A49D ; [*0DE2.0020.0002.A49D] # YI RADICAL YO
+A49E ; [*0DE3.0020.0002.A49E] # YI RADICAL PUT
+A49F ; [*0DE4.0020.0002.A49F] # YI RADICAL HXUO
+A4A0 ; [*0DE5.0020.0002.A4A0] # YI RADICAL TAT
+A4A1 ; [*0DE6.0020.0002.A4A1] # YI RADICAL GA
+A4A2 ; [*0DE7.0020.0002.A4A2] # YI RADICAL ZUP
+A4A3 ; [*0DE8.0020.0002.A4A3] # YI RADICAL CYT
+A4A4 ; [*0DE9.0020.0002.A4A4] # YI RADICAL DDUR
+A4A5 ; [*0DEA.0020.0002.A4A5] # YI RADICAL BUR
+A4A6 ; [*0DEB.0020.0002.A4A6] # YI RADICAL GGUO
+A4A7 ; [*0DEC.0020.0002.A4A7] # YI RADICAL NYOP
+A4A8 ; [*0DED.0020.0002.A4A8] # YI RADICAL TU
+A4A9 ; [*0DEE.0020.0002.A4A9] # YI RADICAL OP
+A4AA ; [*0DEF.0020.0002.A4AA] # YI RADICAL JJUT
+A4AB ; [*0DF0.0020.0002.A4AB] # YI RADICAL ZOT
+A4AC ; [*0DF1.0020.0002.A4AC] # YI RADICAL PYT
+A4AD ; [*0DF2.0020.0002.A4AD] # YI RADICAL HMO
+A4AE ; [*0DF3.0020.0002.A4AE] # YI RADICAL YIT
+A4AF ; [*0DF4.0020.0002.A4AF] # YI RADICAL VUR
+A4B0 ; [*0DF5.0020.0002.A4B0] # YI RADICAL SHY
+A4B1 ; [*0DF6.0020.0002.A4B1] # YI RADICAL VEP
+A4B2 ; [*0DF7.0020.0002.A4B2] # YI RADICAL ZA
+A4B3 ; [*0DF8.0020.0002.A4B3] # YI RADICAL JO
+A4B4 ; [*0DF9.0020.0002.A4B4] # YI RADICAL NZUP
+A4B5 ; [*0DFA.0020.0002.A4B5] # YI RADICAL JJY
+A4B6 ; [*0DFB.0020.0002.A4B6] # YI RADICAL GOT
+A4B7 ; [*0DFC.0020.0002.A4B7] # YI RADICAL JJIE
+A4B8 ; [*0DFD.0020.0002.A4B8] # YI RADICAL WO
+A4B9 ; [*0DFE.0020.0002.A4B9] # YI RADICAL DU
+A4BA ; [*0DFF.0020.0002.A4BA] # YI RADICAL SHUR
+A4BB ; [*0E00.0020.0002.A4BB] # YI RADICAL LIE
+A4BC ; [*0E01.0020.0002.A4BC] # YI RADICAL CY
+A4BD ; [*0E02.0020.0002.A4BD] # YI RADICAL CUOP
+A4BE ; [*0E03.0020.0002.A4BE] # YI RADICAL CIP
+A4BF ; [*0E04.0020.0002.A4BF] # YI RADICAL HXOP
+A4C0 ; [*0E05.0020.0002.A4C0] # YI RADICAL SHAT
+A4C1 ; [*0E06.0020.0002.A4C1] # YI RADICAL ZUR
+A4C2 ; [*0E07.0020.0002.A4C2] # YI RADICAL SHOP
+A4C3 ; [*0E08.0020.0002.A4C3] # YI RADICAL CHE
+A4C4 ; [*0E09.0020.0002.A4C4] # YI RADICAL ZZIET
+A4C5 ; [*0E0A.0020.0002.A4C5] # YI RADICAL NBIE
+A4C6 ; [*0E0B.0020.0002.A4C6] # YI RADICAL KE
+A4FE ; [*023D.0020.0002.A4FE] # LISU PUNCTUATION COMMA
+A4FF ; [*028E.0020.0002.A4FF] # LISU PUNCTUATION FULL STOP
+A60D ; [*023E.0020.0002.A60D] # VAI COMMA
+A60E ; [*028F.0020.0002.A60E] # VAI FULL STOP
+A60F ; [*027D.0020.0002.A60F] # VAI QUESTION MARK
+A670 ; [.0000.0000.0000.A670] # COMBINING CYRILLIC TEN MILLIONS SIGN
+A671 ; [.0000.0000.0000.A671] # COMBINING CYRILLIC HUNDRED MILLIONS SIGN
+A672 ; [.0000.0000.0000.A672] # COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A673 ; [*035B.0020.0002.A673] # SLAVONIC ASTERISK
+A67E ; [*0391.0020.0002.A67E] # CYRILLIC KAVYKA
+A6F2 ; [*02C8.0020.0002.A6F2] # BAMUM NJAEMLI
+A6F3 ; [*0290.0020.0002.A6F3] # BAMUM FULL STOP
+A6F4 ; [*026D.0020.0002.A6F4] # BAMUM COLON
+A6F5 ; [*023F.0020.0002.A6F5] # BAMUM COMMA
+A6F6 ; [*0246.0020.0002.A6F6] # BAMUM SEMICOLON
+A6F7 ; [*027E.0020.0002.A6F7] # BAMUM QUESTION MARK
+A700 ; [*0426.0020.0002.A700] # MODIFIER LETTER CHINESE TONE YIN PING
+A701 ; [*0427.0020.0002.A701] # MODIFIER LETTER CHINESE TONE YANG PING
+A702 ; [*0428.0020.0002.A702] # MODIFIER LETTER CHINESE TONE YIN SHANG
+A703 ; [*0429.0020.0002.A703] # MODIFIER LETTER CHINESE TONE YANG SHANG
+A704 ; [*042A.0020.0002.A704] # MODIFIER LETTER CHINESE TONE YIN QU
+A705 ; [*042B.0020.0002.A705] # MODIFIER LETTER CHINESE TONE YANG QU
+A706 ; [*042C.0020.0002.A706] # MODIFIER LETTER CHINESE TONE YIN RU
+A707 ; [*042D.0020.0002.A707] # MODIFIER LETTER CHINESE TONE YANG RU
+A708 ; [*042E.0020.0002.A708] # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709 ; [*042F.0020.0002.A709] # MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A ; [*0430.0020.0002.A70A] # MODIFIER LETTER MID DOTTED TONE BAR
+A70B ; [*0431.0020.0002.A70B] # MODIFIER LETTER LOW DOTTED TONE BAR
+A70C ; [*0432.0020.0002.A70C] # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D ; [*0433.0020.0002.A70D] # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E ; [*0434.0020.0002.A70E] # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F ; [*0435.0020.0002.A70F] # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710 ; [*0436.0020.0002.A710] # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711 ; [*0437.0020.0002.A711] # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+A712 ; [*0438.0020.0002.A712] # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713 ; [*0439.0020.0002.A713] # MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714 ; [*043A.0020.0002.A714] # MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715 ; [*043B.0020.0002.A715] # MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716 ; [*043C.0020.0002.A716] # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717 ; [*043D.0020.0002.A717] # MODIFIER LETTER DOT VERTICAL BAR
+A718 ; [*043E.0020.0002.A718] # MODIFIER LETTER DOT SLASH
+A719 ; [*043F.0020.0002.A719] # MODIFIER LETTER DOT HORIZONTAL BAR
+A71A ; [*0440.0020.0002.A71A] # MODIFIER LETTER LOWER RIGHT CORNER ANGLE
+A71B ; [*0441.0020.0002.A71B] # MODIFIER LETTER RAISED UP ARROW
+A71C ; [*0442.0020.0002.A71C] # MODIFIER LETTER RAISED DOWN ARROW
+A71D ; [*0443.0020.0002.A71D] # MODIFIER LETTER RAISED EXCLAMATION MARK
+A71E ; [*0444.0020.0002.A71E] # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK
+A71F ; [*0445.0020.0002.A71F] # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720 ; [*0446.0020.0002.A720] # MODIFIER LETTER STRESS AND HIGH TONE
+A721 ; [*0447.0020.0002.A721] # MODIFIER LETTER STRESS AND LOW TONE
+A788 ; [*0448.0020.0002.A788] # MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789 ; [*0449.0020.0002.A789] # MODIFIER LETTER COLON
+A78A ; [*044A.0020.0002.A78A] # MODIFIER LETTER SHORT EQUALS SIGN
+A828 ; [*0460.0020.0002.A828] # SYLOTI NAGRI POETRY MARK-1
+A829 ; [*0461.0020.0002.A829] # SYLOTI NAGRI POETRY MARK-2
+A82A ; [*0462.0020.0002.A82A] # SYLOTI NAGRI POETRY MARK-3
+A82B ; [*0463.0020.0002.A82B] # SYLOTI NAGRI POETRY MARK-4
+A830 ; [*1116.0020.0002.A830] # NORTH INDIC FRACTION ONE QUARTER
+A831 ; [*1117.0020.0002.A831] # NORTH INDIC FRACTION ONE HALF
+A832 ; [*1118.0020.0002.A832] # NORTH INDIC FRACTION THREE QUARTERS
+A833 ; [*1119.0020.0002.A833] # NORTH INDIC FRACTION ONE SIXTEENTH
+A834 ; [*111A.0020.0002.A834] # NORTH INDIC FRACTION ONE EIGHTH
+A835 ; [*111B.0020.0002.A835] # NORTH INDIC FRACTION THREE SIXTEENTHS
+A836 ; [*0464.0020.0002.A836] # NORTH INDIC QUARTER MARK
+A837 ; [*0465.0020.0002.A837] # NORTH INDIC PLACEHOLDER MARK
+A839 ; [*0466.0020.0002.A839] # NORTH INDIC QUANTITY MARK
+A874 ; [*03D9.0020.0002.A874] # PHAGS-PA SINGLE HEAD MARK
+A875 ; [*03DA.0020.0002.A875] # PHAGS-PA DOUBLE HEAD MARK
+A876 ; [*029A.0020.0002.A876] # PHAGS-PA MARK SHAD
+A877 ; [*029B.0020.0002.A877] # PHAGS-PA MARK DOUBLE SHAD
+A8CE ; [*0296.0020.0002.A8CE] # SAURASHTRA DANDA
+A8CF ; [*0297.0020.0002.A8CF] # SAURASHTRA DOUBLE DANDA
+A8E0 ; [.0000.0000.0000.A8E0] # COMBINING DEVANAGARI DIGIT ZERO
+A8E1 ; [.0000.0000.0000.A8E1] # COMBINING DEVANAGARI DIGIT ONE
+A8E2 ; [.0000.0000.0000.A8E2] # COMBINING DEVANAGARI DIGIT TWO
+A8E3 ; [.0000.0000.0000.A8E3] # COMBINING DEVANAGARI DIGIT THREE
+A8E4 ; [.0000.0000.0000.A8E4] # COMBINING DEVANAGARI DIGIT FOUR
+A8E5 ; [.0000.0000.0000.A8E5] # COMBINING DEVANAGARI DIGIT FIVE
+A8E6 ; [.0000.0000.0000.A8E6] # COMBINING DEVANAGARI DIGIT SIX
+A8E7 ; [.0000.0000.0000.A8E7] # COMBINING DEVANAGARI DIGIT SEVEN
+A8E8 ; [.0000.0000.0000.A8E8] # COMBINING DEVANAGARI DIGIT EIGHT
+A8E9 ; [.0000.0000.0000.A8E9] # COMBINING DEVANAGARI DIGIT NINE
+A8EA ; [.0000.0000.0000.A8EA] # COMBINING DEVANAGARI LETTER A
+A8EB ; [.0000.0000.0000.A8EB] # COMBINING DEVANAGARI LETTER U
+A8EC ; [.0000.0000.0000.A8EC] # COMBINING DEVANAGARI LETTER KA
+A8ED ; [.0000.0000.0000.A8ED] # COMBINING DEVANAGARI LETTER NA
+A8EE ; [.0000.0000.0000.A8EE] # COMBINING DEVANAGARI LETTER PA
+A8EF ; [.0000.0000.0000.A8EF] # COMBINING DEVANAGARI LETTER RA
+A8F0 ; [.0000.0000.0000.A8F0] # COMBINING DEVANAGARI LETTER VI
+A8F1 ; [.0000.0000.0000.A8F1] # COMBINING DEVANAGARI SIGN AVAGRAHA
+A8F8 ; [*03A2.0020.0002.A8F8] # DEVANAGARI SIGN PUSHPIKA
+A8F9 ; [*03A3.0020.0002.A8F9] # DEVANAGARI GAP FILLER
+A8FA ; [*03A4.0020.0002.A8FA] # DEVANAGARI CARET
+A92E ; [*03DB.0020.0002.A92E] # KAYAH LI SIGN CWI
+A92F ; [*029E.0020.0002.A92F] # KAYAH LI SIGN SHYA
+A95F ; [*02C9.0020.0002.A95F] # REJANG SECTION MARK
+A9C1 ; [*02BE.0020.0002.A9C1] # JAVANESE LEFT RERENGGAN
+A9C2 ; [*02BF.0020.0002.A9C2] # JAVANESE RIGHT RERENGGAN
+A9C3 ; [*02C0.0020.0002.A9C3] # JAVANESE PADA ANDAP
+A9C4 ; [*02C1.0020.0002.A9C4] # JAVANESE PADA MADYA
+A9C5 ; [*02C2.0020.0002.A9C5] # JAVANESE PADA LUHUR
+A9C6 ; [*02C3.0020.0002.A9C6] # JAVANESE PADA WINDU
+A9C7 ; [*0269.0020.0002.A9C7] # JAVANESE PADA PANGKAT
+A9C8 ; [*02A9.0020.0002.A9C8] # JAVANESE PADA LINGSA
+A9C9 ; [*02AA.0020.0002.A9C9] # JAVANESE PADA LUNGSI
+A9CA ; [*02C4.0020.0002.A9CA] # JAVANESE PADA ADEG
+A9CB ; [*02C5.0020.0002.A9CB] # JAVANESE PADA ADEG ADEG
+A9CC ; [*02C6.0020.0002.A9CC] # JAVANESE PADA PISELEH
+A9CD ; [*02C7.0020.0002.A9CD] # JAVANESE TURNED PADA PISELEH
+A9DE ; [*03DC.0020.0002.A9DE] # JAVANESE PADA TIRTA TUMETES
+A9DF ; [*03DD.0020.0002.A9DF] # JAVANESE PADA ISEN-ISEN
+AA5C ; [*03DE.0020.0002.AA5C] # CHAM PUNCTUATION SPIRAL
+AA5D ; [*02AB.0020.0002.AA5D] # CHAM PUNCTUATION DANDA
+AA5E ; [*02AC.0020.0002.AA5E] # CHAM PUNCTUATION DOUBLE DANDA
+AA5F ; [*02AD.0020.0002.AA5F] # CHAM PUNCTUATION TRIPLE DANDA
+AA77 ; [*03C8.0020.0002.AA77] # MYANMAR SYMBOL AITON EXCLAMATION
+AA78 ; [*03C9.0020.0002.AA78] # MYANMAR SYMBOL AITON ONE
+AA79 ; [*03CA.0020.0002.AA79] # MYANMAR SYMBOL AITON TWO
+AADE ; [*03A8.0020.0002.AADE] # TAI VIET SYMBOL HO HOI
+AADF ; [*03A9.0020.0002.AADF] # TAI VIET SYMBOL KOI KOI
+ABEB ; [*02AE.0020.0002.ABEB] # MEETEI MAYEK CHEIKHEI
+FB29 ; [*0550.0020.0005.FB29] # HEBREW LETTER ALTERNATIVE PLUS SIGN; QQK
+FD3E ; [*034F.0020.0002.FD3E] # ORNATE LEFT PARENTHESIS
+FD3F ; [*0350.0020.0002.FD3F] # ORNATE RIGHT PARENTHESIS
+FDFD ; [*0451.0020.0002.FDFD] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE10 ; [*0234.0020.0016.FE10] # PRESENTATION FORM FOR VERTICAL COMMA; QQK
+FE11 ; [*0240.0020.0016.FE11] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA; QQK
+FE12 ; [*0291.0020.0016.FE12] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP; QQK
+FE13 ; [*0247.0020.0016.FE13] # PRESENTATION FORM FOR VERTICAL COLON; QQK
+FE14 ; [*0243.0020.0016.FE14] # PRESENTATION FORM FOR VERTICAL SEMICOLON; QQK
+FE15 ; [*026E.0020.0016.FE15] # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK; QQK
+FE16 ; [*0273.0020.0016.FE16] # PRESENTATION FORM FOR VERTICAL QUESTION MARK; QQK
+FE17 ; [*0349.0020.0016.FE17] # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET; QQK
+FE18 ; [*034A.0020.0016.FE18] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET; QQK
+FE19 ; [*0281.0020.0016.FE19][*0281.0020.0016.FE19][*0281.0020.001F.FE19] # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS; QQKN
+FE21 ; [.0000.0000.0000.FE21] # COMBINING LIGATURE RIGHT HALF
+FE23 ; [.0000.0000.0000.FE23] # COMBINING DOUBLE TILDE RIGHT HALF
+FE24 ; [.0000.0000.0000.FE24] # COMBINING MACRON LEFT HALF
+FE25 ; [.0000.0000.0000.FE25] # COMBINING MACRON RIGHT HALF
+FE26 ; [.0000.0000.0000.FE26] # COMBINING CONJOINING MACRON
+FE30 ; [*0281.0020.0016.FE30][*0281.0020.0016.FE30] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER; QQKN
+FE31 ; [*022C.0020.0016.FE31] # PRESENTATION FORM FOR VERTICAL EM DASH; QQK
+FE32 ; [*022B.0020.0016.FE32] # PRESENTATION FORM FOR VERTICAL EN DASH; QQK
+FE33 ; [*021D.0020.0016.FE33] # PRESENTATION FORM FOR VERTICAL LOW LINE; QQK
+FE34 ; [*021D.0020.0016.FE34] # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE; QQK
+FE35 ; [*02FF.0020.0016.FE35] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS; QQK
+FE36 ; [*0300.0020.0016.FE36] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS; QQK
+FE37 ; [*0303.0020.0016.FE37] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET; QQK
+FE38 ; [*0304.0020.0016.FE38] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET; QQK
+FE39 ; [*0347.0020.0016.FE39] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET; QQK
+FE3A ; [*0348.0020.0016.FE3A] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET; QQK
+FE3B ; [*0345.0020.0016.FE3B] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET; QQK
+FE3C ; [*0346.0020.0016.FE3C] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET; QQK
+FE3D ; [*033F.0020.0016.FE3D] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET; QQK
+FE3E ; [*0340.0020.0016.FE3E] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET; QQK
+FE3F ; [*033D.0020.0016.FE3F] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET; QQK
+FE40 ; [*033E.0020.0016.FE40] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET; QQK
+FE41 ; [*0341.0020.0016.FE41] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET; QQK
+FE42 ; [*0342.0020.0016.FE42] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET; QQK
+FE43 ; [*0343.0020.0016.FE43] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET; QQK
+FE44 ; [*0344.0020.0016.FE44] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET; QQK
+FE45 ; [*0241.0020.0002.FE45] # SESAME DOT
+FE46 ; [*0242.0020.0002.FE46] # WHITE SESAME DOT
+FE47 ; [*0301.0020.0016.FE47] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET; QQK
+FE48 ; [*0302.0020.0016.FE48] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET; QQK
+FE49 ; [*0213.0020.0004.FE49] # DASHED OVERLINE; QQK
+FE4A ; [*0213.0020.0004.FE4A] # CENTRELINE OVERLINE; QQK
+FE4B ; [*0213.0020.0004.FE4B] # WAVY OVERLINE; QQK
+FE4C ; [*0213.0020.0004.FE4C] # DOUBLE WAVY OVERLINE; QQK
+FE4D ; [*021D.0020.0004.FE4D] # DASHED LOW LINE; QQK
+FE4E ; [*021D.0020.0004.FE4E] # CENTRELINE LOW LINE; QQK
+FE4F ; [*021D.0020.0004.FE4F] # WAVY LOW LINE; QQK
+FE50 ; [*0234.0020.000F.FE50] # SMALL COMMA; QQK
+FE51 ; [*0240.0020.000F.FE51] # SMALL IDEOGRAPHIC COMMA; QQK
+FE52 ; [*0281.0020.000F.FE52] # SMALL FULL STOP; QQK
+FE54 ; [*0243.0020.000F.FE54] # SMALL SEMICOLON; QQK
+FE55 ; [*0247.0020.000F.FE55] # SMALL COLON; QQK
+FE56 ; [*0273.0020.000F.FE56] # SMALL QUESTION MARK; QQK
+FE57 ; [*026E.0020.000F.FE57] # SMALL EXCLAMATION MARK; QQK
+FE58 ; [*022C.0020.000F.FE58] # SMALL EM DASH; QQK
+FE59 ; [*02FF.0020.000F.FE59] # SMALL LEFT PARENTHESIS; QQK
+FE5A ; [*0300.0020.000F.FE5A] # SMALL RIGHT PARENTHESIS; QQK
+FE5B ; [*0303.0020.000F.FE5B] # SMALL LEFT CURLY BRACKET; QQK
+FE5C ; [*0304.0020.000F.FE5C] # SMALL RIGHT CURLY BRACKET; QQK
+FE5D ; [*0347.0020.000F.FE5D] # SMALL LEFT TORTOISE SHELL BRACKET; QQK
+FE5E ; [*0348.0020.000F.FE5E] # SMALL RIGHT TORTOISE SHELL BRACKET; QQK
+FE5F ; [*0362.0020.000F.FE5F] # SMALL NUMBER SIGN; QQK
+FE60 ; [*035F.0020.000F.FE60] # SMALL AMPERSAND; QQK
+FE61 ; [*0357.0020.000F.FE61] # SMALL ASTERISK; QQK
+FE62 ; [*0550.0020.000F.FE62] # SMALL PLUS SIGN; QQK
+FE63 ; [*0223.0020.000F.FE63] # SMALL HYPHEN-MINUS; QQK
+FE64 ; [*0554.0020.000F.FE64] # SMALL LESS-THAN SIGN; QQK
+FE65 ; [*0556.0020.000F.FE65] # SMALL GREATER-THAN SIGN; QQK
+FE66 ; [*0555.0020.000F.FE66] # SMALL EQUALS SIGN; QQK
+FE68 ; [*035E.0020.000F.FE68] # SMALL REVERSE SOLIDUS; QQK
+FE6A ; [*0363.0020.000F.FE6A] # SMALL PERCENT SIGN; QQK
+FE6B ; [*0356.0020.000F.FE6B] # SMALL COMMERCIAL AT; QQK
+FE73 ; [.0000.0000.0000.FE73] # ARABIC TAIL FRAGMENT
+FF01 ; [*026E.0020.0003.FF01] # FULLWIDTH EXCLAMATION MARK; QQK
+FF02 ; [*02F5.0020.0003.FF02] # FULLWIDTH QUOTATION MARK; QQK
+FF03 ; [*0362.0020.0003.FF03] # FULLWIDTH NUMBER SIGN; QQK
+FF05 ; [*0363.0020.0003.FF05] # FULLWIDTH PERCENT SIGN; QQK
+FF06 ; [*035F.0020.0003.FF06] # FULLWIDTH AMPERSAND; QQK
+FF07 ; [*02EE.0020.0003.FF07] # FULLWIDTH APOSTROPHE; QQK
+FF08 ; [*02FF.0020.0003.FF08] # FULLWIDTH LEFT PARENTHESIS; QQK
+FF09 ; [*0300.0020.0003.FF09] # FULLWIDTH RIGHT PARENTHESIS; QQK
+FF0A ; [*0357.0020.0003.FF0A] # FULLWIDTH ASTERISK; QQK
+FF0B ; [*0550.0020.0003.FF0B] # FULLWIDTH PLUS SIGN; QQK
+FF0C ; [*0234.0020.0003.FF0C] # FULLWIDTH COMMA; QQK
+FF0D ; [*0223.0020.0003.FF0D] # FULLWIDTH HYPHEN-MINUS; QQK
+FF0E ; [*0281.0020.0003.FF0E] # FULLWIDTH FULL STOP; QQK
+FF0F ; [*035C.0020.0003.FF0F] # FULLWIDTH SOLIDUS; QQK
+FF1A ; [*0247.0020.0003.FF1A] # FULLWIDTH COLON; QQK
+FF1B ; [*0243.0020.0003.FF1B] # FULLWIDTH SEMICOLON; QQK
+FF1C ; [*0554.0020.0003.FF1C] # FULLWIDTH LESS-THAN SIGN; QQK
+FF1D ; [*0555.0020.0003.FF1D] # FULLWIDTH EQUALS SIGN; QQK
+FF1E ; [*0556.0020.0003.FF1E] # FULLWIDTH GREATER-THAN SIGN; QQK
+FF1F ; [*0273.0020.0003.FF1F] # FULLWIDTH QUESTION MARK; QQK
+FF20 ; [*0356.0020.0003.FF20] # FULLWIDTH COMMERCIAL AT; QQK
+FF3B ; [*0301.0020.0003.FF3B] # FULLWIDTH LEFT SQUARE BRACKET; QQK
+FF3C ; [*035E.0020.0003.FF3C] # FULLWIDTH REVERSE SOLIDUS; QQK
+FF3D ; [*0302.0020.0003.FF3D] # FULLWIDTH RIGHT SQUARE BRACKET; QQK
+FF3E ; [*0211.0020.0003.FF3E] # FULLWIDTH CIRCUMFLEX ACCENT; QQK
+FF3F ; [*021D.0020.0003.FF3F] # FULLWIDTH LOW LINE; QQK
+FF40 ; [*020E.0020.0003.FF40] # FULLWIDTH GRAVE ACCENT; QQK
+FF5B ; [*0303.0020.0003.FF5B] # FULLWIDTH LEFT CURLY BRACKET; QQK
+FF5C ; [*0558.0020.0003.FF5C] # FULLWIDTH VERTICAL LINE; QQK
+FF5D ; [*0304.0020.0003.FF5D] # FULLWIDTH RIGHT CURLY BRACKET; QQK
+FF5E ; [*055B.0020.0003.FF5E] # FULLWIDTH TILDE; QQK
+FF5F ; [*0311.0020.0003.FF5F] # FULLWIDTH LEFT WHITE PARENTHESIS; QQK
+FF60 ; [*0312.0020.0003.FF60] # FULLWIDTH RIGHT WHITE PARENTHESIS; QQK
+FF61 ; [*0291.0020.0012.FF61] # HALFWIDTH IDEOGRAPHIC FULL STOP; QQK
+FF62 ; [*0341.0020.0012.FF62] # HALFWIDTH LEFT CORNER BRACKET; QQK
+FF63 ; [*0342.0020.0012.FF63] # HALFWIDTH RIGHT CORNER BRACKET; QQK
+FF64 ; [*0240.0020.0012.FF64] # HALFWIDTH IDEOGRAPHIC COMMA; QQK
+FF65 ; [*0233.0020.0012.FF65] # HALFWIDTH KATAKANA MIDDLE DOT; QQK
+FFE2 ; [*0557.0020.0003.FFE2] # FULLWIDTH NOT SIGN; QQK
+FFE3 ; [*0212.0020.0003.FFE3] # FULLWIDTH MACRON; QQK
+FFE4 ; [*0559.0020.0003.FFE4] # FULLWIDTH BROKEN BAR; QQK
+FFE8 ; [*0740.0020.0012.FFE8] # HALFWIDTH FORMS LIGHT VERTICAL; QQK
+FFE9 ; [*04D6.0020.0012.FFE9] # HALFWIDTH LEFTWARDS ARROW; QQK
+FFEA ; [*04D8.0020.0012.FFEA] # HALFWIDTH UPWARDS ARROW; QQK
+FFEB ; [*04D7.0020.0012.FFEB] # HALFWIDTH RIGHTWARDS ARROW; QQK
+FFEC ; [*04D9.0020.0012.FFEC] # HALFWIDTH DOWNWARDS ARROW; QQK
+FFED ; [*07DE.0020.0012.FFED] # HALFWIDTH BLACK SQUARE; QQK
+FFEE ; [*0809.0020.0012.FFEE] # HALFWIDTH WHITE CIRCLE; QQK
+FFFC ; [*110E.0020.0002.FFFC] # OBJECT REPLACEMENT CHARACTER
+FFFD ; [*110F.0020.0002.FFFD] # REPLACEMENT CHARACTER
+10100 ; [*02E4.0020.0002.10100] # AEGEAN WORD SEPARATOR LINE
+10101 ; [*02E5.0020.0002.10101] # AEGEAN WORD SEPARATOR DOT
+10102 ; [*02E6.0020.0002.10102] # AEGEAN CHECK MARK
+10110 ; [*114F.0020.0002.10110] # AEGEAN NUMBER TEN
+10111 ; [*1150.0020.0002.10111] # AEGEAN NUMBER TWENTY
+10112 ; [*1151.0020.0002.10112] # AEGEAN NUMBER THIRTY
+10113 ; [*1152.0020.0002.10113] # AEGEAN NUMBER FORTY
+10114 ; [*1153.0020.0002.10114] # AEGEAN NUMBER FIFTY
+10115 ; [*1154.0020.0002.10115] # AEGEAN NUMBER SIXTY
+10116 ; [*1155.0020.0002.10116] # AEGEAN NUMBER SEVENTY
+10117 ; [*1156.0020.0002.10117] # AEGEAN NUMBER EIGHTY
+10118 ; [*1157.0020.0002.10118] # AEGEAN NUMBER NINETY
+10119 ; [*1158.0020.0002.10119] # AEGEAN NUMBER ONE HUNDRED
+1011A ; [*1159.0020.0002.1011A] # AEGEAN NUMBER TWO HUNDRED
+1011B ; [*115A.0020.0002.1011B] # AEGEAN NUMBER THREE HUNDRED
+1011C ; [*115B.0020.0002.1011C] # AEGEAN NUMBER FOUR HUNDRED
+1011D ; [*115C.0020.0002.1011D] # AEGEAN NUMBER FIVE HUNDRED
+1011E ; [*115D.0020.0002.1011E] # AEGEAN NUMBER SIX HUNDRED
+1011F ; [*115E.0020.0002.1011F] # AEGEAN NUMBER SEVEN HUNDRED
+10120 ; [*115F.0020.0002.10120] # AEGEAN NUMBER EIGHT HUNDRED
+10121 ; [*1160.0020.0002.10121] # AEGEAN NUMBER NINE HUNDRED
+10122 ; [*1161.0020.0002.10122] # AEGEAN NUMBER ONE THOUSAND
+10123 ; [*1162.0020.0002.10123] # AEGEAN NUMBER TWO THOUSAND
+10124 ; [*1163.0020.0002.10124] # AEGEAN NUMBER THREE THOUSAND
+10125 ; [*1164.0020.0002.10125] # AEGEAN NUMBER FOUR THOUSAND
+10126 ; [*1165.0020.0002.10126] # AEGEAN NUMBER FIVE THOUSAND
+10127 ; [*1166.0020.0002.10127] # AEGEAN NUMBER SIX THOUSAND
+10128 ; [*1167.0020.0002.10128] # AEGEAN NUMBER SEVEN THOUSAND
+10129 ; [*1168.0020.0002.10129] # AEGEAN NUMBER EIGHT THOUSAND
+1012A ; [*1169.0020.0002.1012A] # AEGEAN NUMBER NINE THOUSAND
+1012B ; [*116A.0020.0002.1012B] # AEGEAN NUMBER TEN THOUSAND
+1012C ; [*116B.0020.0002.1012C] # AEGEAN NUMBER TWENTY THOUSAND
+1012D ; [*116C.0020.0002.1012D] # AEGEAN NUMBER THIRTY THOUSAND
+1012E ; [*116D.0020.0002.1012E] # AEGEAN NUMBER FORTY THOUSAND
+1012F ; [*116E.0020.0002.1012F] # AEGEAN NUMBER FIFTY THOUSAND
+10130 ; [*116F.0020.0002.10130] # AEGEAN NUMBER SIXTY THOUSAND
+10131 ; [*1170.0020.0002.10131] # AEGEAN NUMBER SEVENTY THOUSAND
+10132 ; [*1171.0020.0002.10132] # AEGEAN NUMBER EIGHTY THOUSAND
+10133 ; [*1172.0020.0002.10133] # AEGEAN NUMBER NINETY THOUSAND
+10137 ; [*0E0C.0020.0002.10137] # AEGEAN WEIGHT BASE UNIT
+10138 ; [*0E0D.0020.0002.10138] # AEGEAN WEIGHT FIRST SUBUNIT
+10139 ; [*0E0E.0020.0002.10139] # AEGEAN WEIGHT SECOND SUBUNIT
+1013A ; [*0E0F.0020.0002.1013A] # AEGEAN WEIGHT THIRD SUBUNIT
+1013B ; [*0E10.0020.0002.1013B] # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C ; [*0E11.0020.0002.1013C] # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D ; [*0E12.0020.0002.1013D] # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E ; [*0E13.0020.0002.1013E] # AEGEAN MEASURE SECOND SUBUNIT
+1013F ; [*0E14.0020.0002.1013F] # AEGEAN MEASURE THIRD SUBUNIT
+10140 ; [*1173.0020.0002.10140] # GREEK ACROPHONIC ATTIC ONE QUARTER
+10141 ; [*1174.0020.0002.10141] # GREEK ACROPHONIC ATTIC ONE HALF
+10144 ; [*1175.0020.0002.10144] # GREEK ACROPHONIC ATTIC FIFTY
+10145 ; [*1176.0020.0002.10145] # GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146 ; [*1177.0020.0002.10146] # GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147 ; [*1178.0020.0002.10147] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10149 ; [*1179.0020.0002.10149] # GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A ; [*117A.0020.0002.1014A] # GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B ; [*117B.0020.0002.1014B] # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C ; [*117C.0020.0002.1014C] # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D ; [*117D.0020.0002.1014D] # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E ; [*117E.0020.0002.1014E] # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+10150 ; [*117F.0020.0002.10150] # GREEK ACROPHONIC ATTIC TEN STATERS
+10151 ; [*1180.0020.0002.10151] # GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152 ; [*1181.0020.0002.10152] # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153 ; [*1182.0020.0002.10153] # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154 ; [*1183.0020.0002.10154] # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155 ; [*1184.0020.0002.10155] # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156 ; [*1185.0020.0002.10156] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157 ; [*1186.0020.0002.10157] # GREEK ACROPHONIC ATTIC TEN MNAS
+10160 ; [*1187.0020.0002.10160] # GREEK ACROPHONIC TROEZENIAN TEN
+10161 ; [*1188.0020.0002.10161] # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162 ; [*1189.0020.0002.10162] # GREEK ACROPHONIC HERMIONIAN TEN
+10163 ; [*118A.0020.0002.10163] # GREEK ACROPHONIC MESSENIAN TEN
+10164 ; [*118B.0020.0002.10164] # GREEK ACROPHONIC THESPIAN TEN
+10165 ; [*118C.0020.0002.10165] # GREEK ACROPHONIC THESPIAN THIRTY
+10166 ; [*118D.0020.0002.10166] # GREEK ACROPHONIC TROEZENIAN FIFTY
+10167 ; [*118E.0020.0002.10167] # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168 ; [*118F.0020.0002.10168] # GREEK ACROPHONIC HERMIONIAN FIFTY
+10169 ; [*1190.0020.0002.10169] # GREEK ACROPHONIC THESPIAN FIFTY
+1016A ; [*1191.0020.0002.1016A] # GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B ; [*1192.0020.0002.1016B] # GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C ; [*1193.0020.0002.1016C] # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D ; [*1194.0020.0002.1016D] # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E ; [*1195.0020.0002.1016E] # GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F ; [*1196.0020.0002.1016F] # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170 ; [*1197.0020.0002.10170] # GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171 ; [*1198.0020.0002.10171] # GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172 ; [*1199.0020.0002.10172] # GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10174 ; [*119A.0020.0002.10174] # GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175 ; [*119B.0020.0002.10175] # GREEK ONE HALF SIGN
+10176 ; [*119C.0020.0002.10176] # GREEK ONE HALF SIGN ALTERNATE FORM
+10177 ; [*119D.0020.0002.10177] # GREEK TWO THIRDS SIGN
+10178 ; [*119E.0020.0002.10178] # GREEK THREE QUARTERS SIGN
+10179 ; [*0E15.0020.0002.10179] # GREEK YEAR SIGN
+1017A ; [*0E16.0020.0002.1017A] # GREEK TALENT SIGN
+1017B ; [*0E17.0020.0002.1017B] # GREEK DRACHMA SIGN
+1017C ; [*0E18.0020.0002.1017C] # GREEK OBOL SIGN
+1017D ; [*0E19.0020.0002.1017D] # GREEK TWO OBOLS SIGN
+1017E ; [*0E1A.0020.0002.1017E] # GREEK THREE OBOLS SIGN
+1017F ; [*0E1B.0020.0002.1017F] # GREEK FOUR OBOLS SIGN
+10180 ; [*0E1C.0020.0002.10180] # GREEK FIVE OBOLS SIGN
+10181 ; [*0E1D.0020.0002.10181] # GREEK METRETES SIGN
+10182 ; [*0E1E.0020.0002.10182] # GREEK KYATHOS BASE SIGN
+10183 ; [*0E1F.0020.0002.10183] # GREEK LITRA SIGN
+10184 ; [*0E20.0020.0002.10184] # GREEK OUNKIA SIGN
+10185 ; [*0E21.0020.0002.10185] # GREEK XESTES SIGN
+10186 ; [*0E22.0020.0002.10186] # GREEK ARTABE SIGN
+10187 ; [*0E23.0020.0002.10187] # GREEK AROURA SIGN
+10188 ; [*0E24.0020.0002.10188] # GREEK GRAMMA SIGN
+10189 ; [*0E25.0020.0002.10189] # GREEK TRYBLION BASE SIGN
+10190 ; [*0E26.0020.0002.10190] # ROMAN SEXTANS SIGN
+10191 ; [*0E27.0020.0002.10191] # ROMAN UNCIA SIGN
+10192 ; [*0E28.0020.0002.10192] # ROMAN SEMUNCIA SIGN
+10193 ; [*0E29.0020.0002.10193] # ROMAN SEXTULA SIGN
+10194 ; [*0E2A.0020.0002.10194] # ROMAN DIMIDIA SEXTULA SIGN
+10195 ; [*0E2B.0020.0002.10195] # ROMAN SILIQUA SIGN
+10196 ; [*0E2C.0020.0002.10196] # ROMAN DENARIUS SIGN
+10197 ; [*0E2D.0020.0002.10197] # ROMAN QUINARIUS SIGN
+10198 ; [*0E2E.0020.0002.10198] # ROMAN SESTERTIUS SIGN
+10199 ; [*0E2F.0020.0002.10199] # ROMAN DUPONDIUS SIGN
+1019A ; [*0E30.0020.0002.1019A] # ROMAN AS SIGN
+1019B ; [*0E31.0020.0002.1019B] # ROMAN CENTURIAL SIGN
+101D0 ; [*0E32.0020.0002.101D0] # PHAISTOS DISC SIGN PEDESTRIAN
+101D1 ; [*0E33.0020.0002.101D1] # PHAISTOS DISC SIGN PLUMED HEAD
+101D2 ; [*0E34.0020.0002.101D2] # PHAISTOS DISC SIGN TATTOOED HEAD
+101D3 ; [*0E35.0020.0002.101D3] # PHAISTOS DISC SIGN CAPTIVE
+101D4 ; [*0E36.0020.0002.101D4] # PHAISTOS DISC SIGN CHILD
+101D5 ; [*0E37.0020.0002.101D5] # PHAISTOS DISC SIGN WOMAN
+101D6 ; [*0E38.0020.0002.101D6] # PHAISTOS DISC SIGN HELMET
+101D7 ; [*0E39.0020.0002.101D7] # PHAISTOS DISC SIGN GAUNTLET
+101D8 ; [*0E3A.0020.0002.101D8] # PHAISTOS DISC SIGN TIARA
+101D9 ; [*0E3B.0020.0002.101D9] # PHAISTOS DISC SIGN ARROW
+101DA ; [*0E3C.0020.0002.101DA] # PHAISTOS DISC SIGN BOW
+101DB ; [*0E3D.0020.0002.101DB] # PHAISTOS DISC SIGN SHIELD
+101DC ; [*0E3E.0020.0002.101DC] # PHAISTOS DISC SIGN CLUB
+101DD ; [*0E3F.0020.0002.101DD] # PHAISTOS DISC SIGN MANACLES
+101DE ; [*0E40.0020.0002.101DE] # PHAISTOS DISC SIGN MATTOCK
+101DF ; [*0E41.0020.0002.101DF] # PHAISTOS DISC SIGN SAW
+101E0 ; [*0E42.0020.0002.101E0] # PHAISTOS DISC SIGN LID
+101E1 ; [*0E43.0020.0002.101E1] # PHAISTOS DISC SIGN BOOMERANG
+101E2 ; [*0E44.0020.0002.101E2] # PHAISTOS DISC SIGN CARPENTRY PLANE
+101E3 ; [*0E45.0020.0002.101E3] # PHAISTOS DISC SIGN DOLIUM
+101E4 ; [*0E46.0020.0002.101E4] # PHAISTOS DISC SIGN COMB
+101E5 ; [*0E47.0020.0002.101E5] # PHAISTOS DISC SIGN SLING
+101E6 ; [*0E48.0020.0002.101E6] # PHAISTOS DISC SIGN COLUMN
+101E7 ; [*0E49.0020.0002.101E7] # PHAISTOS DISC SIGN BEEHIVE
+101E8 ; [*0E4A.0020.0002.101E8] # PHAISTOS DISC SIGN SHIP
+101E9 ; [*0E4B.0020.0002.101E9] # PHAISTOS DISC SIGN HORN
+101EA ; [*0E4C.0020.0002.101EA] # PHAISTOS DISC SIGN HIDE
+101EB ; [*0E4D.0020.0002.101EB] # PHAISTOS DISC SIGN BULLS LEG
+101EC ; [*0E4E.0020.0002.101EC] # PHAISTOS DISC SIGN CAT
+101ED ; [*0E4F.0020.0002.101ED] # PHAISTOS DISC SIGN RAM
+101EE ; [*0E50.0020.0002.101EE] # PHAISTOS DISC SIGN EAGLE
+101EF ; [*0E51.0020.0002.101EF] # PHAISTOS DISC SIGN DOVE
+101F0 ; [*0E52.0020.0002.101F0] # PHAISTOS DISC SIGN TUNNY
+101F1 ; [*0E53.0020.0002.101F1] # PHAISTOS DISC SIGN BEE
+101F2 ; [*0E54.0020.0002.101F2] # PHAISTOS DISC SIGN PLANE TREE
+101F3 ; [*0E55.0020.0002.101F3] # PHAISTOS DISC SIGN VINE
+101F4 ; [*0E56.0020.0002.101F4] # PHAISTOS DISC SIGN PAPYRUS
+101F5 ; [*0E57.0020.0002.101F5] # PHAISTOS DISC SIGN ROSETTE
+101F6 ; [*0E58.0020.0002.101F6] # PHAISTOS DISC SIGN LILY
+101F7 ; [*0E59.0020.0002.101F7] # PHAISTOS DISC SIGN OX BACK
+101F8 ; [*0E5A.0020.0002.101F8] # PHAISTOS DISC SIGN FLUTE
+101F9 ; [*0E5B.0020.0002.101F9] # PHAISTOS DISC SIGN GRATER
+101FA ; [*0E5C.0020.0002.101FA] # PHAISTOS DISC SIGN STRAINER
+101FB ; [*0E5D.0020.0002.101FB] # PHAISTOS DISC SIGN SMALL AXE
+101FC ; [*0E5E.0020.0002.101FC] # PHAISTOS DISC SIGN WAVY BAND
+10322 ; [*114D.0020.0002.10322] # OLD ITALIC NUMERAL TEN
+10323 ; [*114E.0020.0002.10323] # OLD ITALIC NUMERAL FIFTY
+1039F ; [*02E7.0020.0002.1039F] # UGARITIC WORD DIVIDER
+103D0 ; [*02E8.0020.0002.103D0] # OLD PERSIAN WORD DIVIDER
+103D3 ; [*119F.0020.0002.103D3] # OLD PERSIAN NUMBER TEN
+103D4 ; [*11A0.0020.0002.103D4] # OLD PERSIAN NUMBER TWENTY
+103D5 ; [*11A1.0020.0002.103D5] # OLD PERSIAN NUMBER HUNDRED
+10857 ; [*02CA.0020.0002.10857] # IMPERIAL ARAMAIC SECTION SIGN
+1085B ; [*11A7.0020.0002.1085B] # IMPERIAL ARAMAIC NUMBER TEN
+1085C ; [*11A8.0020.0002.1085C] # IMPERIAL ARAMAIC NUMBER TWENTY
+1085D ; [*11A9.0020.0002.1085D] # IMPERIAL ARAMAIC NUMBER ONE HUNDRED
+1085E ; [*11AA.0020.0002.1085E] # IMPERIAL ARAMAIC NUMBER ONE THOUSAND
+1085F ; [*11AB.0020.0002.1085F] # IMPERIAL ARAMAIC NUMBER TEN THOUSAND
+10917 ; [*11A4.0020.0002.10917] # PHOENICIAN NUMBER TEN
+10918 ; [*11A5.0020.0002.10918] # PHOENICIAN NUMBER TWENTY
+10919 ; [*11A6.0020.0002.10919] # PHOENICIAN NUMBER ONE HUNDRED
+1091F ; [*02E9.0020.0002.1091F] # PHOENICIAN WORD SEPARATOR
+1093F ; [*02E3.0020.0002.1093F] # LYDIAN TRIANGULAR MARK
+10A44 ; [*11B4.0020.0002.10A44] # KHAROSHTHI NUMBER TEN
+10A45 ; [*11B5.0020.0002.10A45] # KHAROSHTHI NUMBER TWENTY
+10A46 ; [*11B6.0020.0002.10A46] # KHAROSHTHI NUMBER ONE HUNDRED
+10A47 ; [*11B7.0020.0002.10A47] # KHAROSHTHI NUMBER ONE THOUSAND
+10A50 ; [*03DF.0020.0002.10A50] # KHAROSHTHI PUNCTUATION DOT
+10A51 ; [*03E0.0020.0002.10A51] # KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52 ; [*03E1.0020.0002.10A52] # KHAROSHTHI PUNCTUATION CIRCLE
+10A53 ; [*03E2.0020.0002.10A53] # KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54 ; [*03E3.0020.0002.10A54] # KHAROSHTHI PUNCTUATION MANGALAM
+10A55 ; [*03E4.0020.0002.10A55] # KHAROSHTHI PUNCTUATION LOTUS
+10A56 ; [*02AF.0020.0002.10A56] # KHAROSHTHI PUNCTUATION DANDA
+10A57 ; [*02B0.0020.0002.10A57] # KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58 ; [*03E5.0020.0002.10A58] # KHAROSHTHI PUNCTUATION LINES
+10A7E ; [*11A2.0020.0002.10A7E] # OLD SOUTH ARABIAN NUMBER FIFTY
+10A7F ; [*11A3.0020.0002.10A7F] # OLD SOUTH ARABIAN NUMERIC INDICATOR
+10B39 ; [*03E6.0020.0002.10B39] # AVESTAN ABBREVIATION MARK
+10B3A ; [*02CB.0020.0002.10B3A] # TINY TWO DOTS OVER ONE DOT PUNCTUATION
+10B3B ; [*02CC.0020.0002.10B3B] # SMALL TWO DOTS OVER ONE DOT PUNCTUATION
+10B3C ; [*02CD.0020.0002.10B3C] # LARGE TWO DOTS OVER ONE DOT PUNCTUATION
+10B3D ; [*02CE.0020.0002.10B3D] # LARGE ONE DOT OVER TWO DOTS PUNCTUATION
+10B3E ; [*02CF.0020.0002.10B3E] # LARGE TWO RINGS OVER ONE RING PUNCTUATION
+10B3F ; [*02D0.0020.0002.10B3F] # LARGE ONE RING OVER TWO RINGS PUNCTUATION
+10B5C ; [*11AC.0020.0002.10B5C] # INSCRIPTIONAL PARTHIAN NUMBER TEN
+10B5D ; [*11AD.0020.0002.10B5D] # INSCRIPTIONAL PARTHIAN NUMBER TWENTY
+10B5E ; [*11AE.0020.0002.10B5E] # INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED
+10B5F ; [*11AF.0020.0002.10B5F] # INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND
+10B7C ; [*11B0.0020.0002.10B7C] # INSCRIPTIONAL PAHLAVI NUMBER TEN
+10B7D ; [*11B1.0020.0002.10B7D] # INSCRIPTIONAL PAHLAVI NUMBER TWENTY
+10B7E ; [*11B2.0020.0002.10B7E] # INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED
+10B7F ; [*11B3.0020.0002.10B7F] # INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND
+10E69 ; [*1136.0020.0002.10E69] # RUMI NUMBER TEN
+10E6A ; [*1137.0020.0002.10E6A] # RUMI NUMBER TWENTY
+10E6B ; [*1138.0020.0002.10E6B] # RUMI NUMBER THIRTY
+10E6C ; [*1139.0020.0002.10E6C] # RUMI NUMBER FORTY
+10E6D ; [*113A.0020.0002.10E6D] # RUMI NUMBER FIFTY
+10E6E ; [*113B.0020.0002.10E6E] # RUMI NUMBER SIXTY
+10E6F ; [*113C.0020.0002.10E6F] # RUMI NUMBER SEVENTY
+10E70 ; [*113D.0020.0002.10E70] # RUMI NUMBER EIGHTY
+10E71 ; [*113E.0020.0002.10E71] # RUMI NUMBER NINETY
+10E72 ; [*113F.0020.0002.10E72] # RUMI NUMBER ONE HUNDRED
+10E73 ; [*1140.0020.0002.10E73] # RUMI NUMBER TWO HUNDRED
+10E74 ; [*1141.0020.0002.10E74] # RUMI NUMBER THREE HUNDRED
+10E75 ; [*1142.0020.0002.10E75] # RUMI NUMBER FOUR HUNDRED
+10E76 ; [*1143.0020.0002.10E76] # RUMI NUMBER FIVE HUNDRED
+10E77 ; [*1144.0020.0002.10E77] # RUMI NUMBER SIX HUNDRED
+10E78 ; [*1145.0020.0002.10E78] # RUMI NUMBER SEVEN HUNDRED
+10E79 ; [*1146.0020.0002.10E79] # RUMI NUMBER EIGHT HUNDRED
+10E7A ; [*1147.0020.0002.10E7A] # RUMI NUMBER NINE HUNDRED
+10E7B ; [*1148.0020.0002.10E7B] # RUMI FRACTION ONE HALF
+10E7C ; [*1149.0020.0002.10E7C] # RUMI FRACTION ONE QUARTER
+10E7D ; [*114A.0020.0002.10E7D] # RUMI FRACTION ONE THIRD
+10E7E ; [*114B.0020.0002.10E7E] # RUMI FRACTION TWO THIRDS
+110BB ; [*03E7.0020.0002.110BB] # KAITHI ABBREVIATION SIGN
+110BC ; [*03E8.0020.0002.110BC] # KAITHI ENUMERATION SIGN
+110BD ; [.0000.0000.0000.110BD] # KAITHI NUMBER SIGN
+110BE ; [*02D1.0020.0002.110BE] # KAITHI SECTION MARK
+110BF ; [*02D2.0020.0002.110BF] # KAITHI DOUBLE SECTION MARK
+110C0 ; [*02B1.0020.0002.110C0] # KAITHI DANDA
+110C1 ; [*02B2.0020.0002.110C1] # KAITHI DOUBLE DANDA
+12432 ; [*11B8.0020.0002.12432] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH
+12433 ; [*11B9.0020.0002.12433] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN
+12456 ; [*11BA.0020.0002.12456] # CUNEIFORM NUMERIC SIGN NIGIDAMIN
+12457 ; [*11BB.0020.0002.12457] # CUNEIFORM NUMERIC SIGN NIGIDAESH
+1245A ; [*11BC.0020.0002.1245A] # CUNEIFORM NUMERIC SIGN ONE THIRD DISH
+1245B ; [*11BD.0020.0002.1245B] # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH
+1245C ; [*11BE.0020.0002.1245C] # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH
+1245D ; [*11BF.0020.0002.1245D] # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A
+1245E ; [*11C0.0020.0002.1245E] # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A
+1245F ; [*11C1.0020.0002.1245F] # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH
+12460 ; [*11C2.0020.0002.12460] # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH
+12461 ; [*11C3.0020.0002.12461] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH
+12462 ; [*11C4.0020.0002.12462] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470 ; [*02EA.0020.0002.12470] # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
+12471 ; [*02EB.0020.0002.12471] # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON
+12472 ; [*02EC.0020.0002.12472] # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON
+12473 ; [*02ED.0020.0002.12473] # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+1D000 ; [*0E5F.0020.0002.1D000] # BYZANTINE MUSICAL SYMBOL PSILI
+1D001 ; [*0E60.0020.0002.1D001] # BYZANTINE MUSICAL SYMBOL DASEIA
+1D002 ; [*0E61.0020.0002.1D002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003 ; [*0E62.0020.0002.1D003] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004 ; [*0E63.0020.0002.1D004] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005 ; [*0E64.0020.0002.1D005] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006 ; [*0E65.0020.0002.1D006] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007 ; [*0E66.0020.0002.1D007] # BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008 ; [*0E67.0020.0002.1D008] # BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009 ; [*0E68.0020.0002.1D009] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A ; [*0E69.0020.0002.1D00A] # BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B ; [*0E6A.0020.0002.1D00B] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C ; [*0E6B.0020.0002.1D00C] # BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D ; [*0E6C.0020.0002.1D00D] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E ; [*0E6D.0020.0002.1D00E] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F ; [*0E6E.0020.0002.1D00F] # BYZANTINE MUSICAL SYMBOL TELEIA
+1D010 ; [*0E6F.0020.0002.1D010] # BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011 ; [*0E70.0020.0002.1D011] # BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012 ; [*0E71.0020.0002.1D012] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013 ; [*0E72.0020.0002.1D013] # BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014 ; [*0E73.0020.0002.1D014] # BYZANTINE MUSICAL SYMBOL THITA
+1D015 ; [*0E74.0020.0002.1D015] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016 ; [*0E75.0020.0002.1D016] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017 ; [*0E76.0020.0002.1D017] # BYZANTINE MUSICAL SYMBOL PSILON
+1D018 ; [*0E77.0020.0002.1D018] # BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019 ; [*0E78.0020.0002.1D019] # BYZANTINE MUSICAL SYMBOL VATHY
+1D01A ; [*0E79.0020.0002.1D01A] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B ; [*0E7A.0020.0002.1D01B] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C ; [*0E7B.0020.0002.1D01C] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D ; [*0E7C.0020.0002.1D01D] # BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E ; [*0E7D.0020.0002.1D01E] # BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F ; [*0E7E.0020.0002.1D01F] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020 ; [*0E7F.0020.0002.1D020] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021 ; [*0E80.0020.0002.1D021] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022 ; [*0E81.0020.0002.1D022] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023 ; [*0E82.0020.0002.1D023] # BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024 ; [*0E83.0020.0002.1D024] # BYZANTINE MUSICAL SYMBOL KLASMA
+1D025 ; [*0E84.0020.0002.1D025] # BYZANTINE MUSICAL SYMBOL REVMA
+1D026 ; [*0E85.0020.0002.1D026] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027 ; [*0E86.0020.0002.1D027] # BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028 ; [*0E87.0020.0002.1D028] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029 ; [*0E88.0020.0002.1D029] # BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A ; [*0E89.0020.0002.1D02A] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B ; [*0E8A.0020.0002.1D02B] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C ; [*0E8B.0020.0002.1D02C] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D ; [*0E8C.0020.0002.1D02D] # BYZANTINE MUSICAL SYMBOL THEMA
+1D02E ; [*0E8D.0020.0002.1D02E] # BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F ; [*0E8E.0020.0002.1D02F] # BYZANTINE MUSICAL SYMBOL DYO
+1D030 ; [*0E8F.0020.0002.1D030] # BYZANTINE MUSICAL SYMBOL TRIA
+1D031 ; [*0E90.0020.0002.1D031] # BYZANTINE MUSICAL SYMBOL TESSERA
+1D032 ; [*0E91.0020.0002.1D032] # BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033 ; [*0E92.0020.0002.1D033] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034 ; [*0E93.0020.0002.1D034] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035 ; [*0E94.0020.0002.1D035] # BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036 ; [*0E95.0020.0002.1D036] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037 ; [*0E96.0020.0002.1D037] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038 ; [*0E97.0020.0002.1D038] # BYZANTINE MUSICAL SYMBOL PELASTON
+1D039 ; [*0E98.0020.0002.1D039] # BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A ; [*0E99.0020.0002.1D03A] # BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B ; [*0E9A.0020.0002.1D03B] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C ; [*0E9B.0020.0002.1D03C] # BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D ; [*0E9C.0020.0002.1D03D] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E ; [*0E9D.0020.0002.1D03E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F ; [*0E9E.0020.0002.1D03F] # BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040 ; [*0E9F.0020.0002.1D040] # BYZANTINE MUSICAL SYMBOL NANA
+1D041 ; [*0EA0.0020.0002.1D041] # BYZANTINE MUSICAL SYMBOL PETASMA
+1D042 ; [*0EA1.0020.0002.1D042] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043 ; [*0EA2.0020.0002.1D043] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044 ; [*0EA3.0020.0002.1D044] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045 ; [*0EA4.0020.0002.1D045] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046 ; [*0EA5.0020.0002.1D046] # BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047 ; [*0EA6.0020.0002.1D047] # BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048 ; [*0EA7.0020.0002.1D048] # BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049 ; [*0EA8.0020.0002.1D049] # BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A ; [*0EA9.0020.0002.1D04A] # BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B ; [*0EAA.0020.0002.1D04B] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C ; [*0EAB.0020.0002.1D04C] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D ; [*0EAC.0020.0002.1D04D] # BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E ; [*0EAD.0020.0002.1D04E] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F ; [*0EAE.0020.0002.1D04F] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050 ; [*0EAF.0020.0002.1D050] # BYZANTINE MUSICAL SYMBOL YPSILI
+1D051 ; [*0EB0.0020.0002.1D051] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052 ; [*0EB1.0020.0002.1D052] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053 ; [*0EB2.0020.0002.1D053] # BYZANTINE MUSICAL SYMBOL YPORROI
+1D054 ; [*0EB3.0020.0002.1D054] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055 ; [*0EB4.0020.0002.1D055] # BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056 ; [*0EB5.0020.0002.1D056] # BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057 ; [*0EB6.0020.0002.1D057] # BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058 ; [*0EB7.0020.0002.1D058] # BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059 ; [*0EB8.0020.0002.1D059] # BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A ; [*0EB9.0020.0002.1D05A] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B ; [*0EBA.0020.0002.1D05B] # BYZANTINE MUSICAL SYMBOL OMALON
+1D05C ; [*0EBB.0020.0002.1D05C] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D ; [*0EBC.0020.0002.1D05D] # BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E ; [*0EBD.0020.0002.1D05E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F ; [*0EBE.0020.0002.1D05F] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060 ; [*0EBF.0020.0002.1D060] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061 ; [*0EC0.0020.0002.1D061] # BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062 ; [*0EC1.0020.0002.1D062] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063 ; [*0EC2.0020.0002.1D063] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064 ; [*0EC3.0020.0002.1D064] # BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065 ; [*0EC4.0020.0002.1D065] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066 ; [*0EC5.0020.0002.1D066] # BYZANTINE MUSICAL SYMBOL SYRMA
+1D067 ; [*0EC6.0020.0002.1D067] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068 ; [*0EC7.0020.0002.1D068] # BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069 ; [*0EC8.0020.0002.1D069] # BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A ; [*0EC9.0020.0002.1D06A] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B ; [*0ECA.0020.0002.1D06B] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C ; [*0ECB.0020.0002.1D06C] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D ; [*0ECC.0020.0002.1D06D] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E ; [*0ECD.0020.0002.1D06E] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F ; [*0ECE.0020.0002.1D06F] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070 ; [*0ECF.0020.0002.1D070] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071 ; [*0ED0.0020.0002.1D071] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072 ; [*0ED1.0020.0002.1D072] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073 ; [*0ED2.0020.0002.1D073] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074 ; [*0ED3.0020.0002.1D074] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075 ; [*0ED4.0020.0002.1D075] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076 ; [*0ED5.0020.0002.1D076] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077 ; [*0ED6.0020.0002.1D077] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078 ; [*0ED7.0020.0002.1D078] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079 ; [*0ED8.0020.0002.1D079] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A ; [*0ED9.0020.0002.1D07A] # BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B ; [*0EDA.0020.0002.1D07B] # BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C ; [*0EDB.0020.0002.1D07C] # BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D ; [*0EDC.0020.0002.1D07D] # BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E ; [*0EDD.0020.0002.1D07E] # BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F ; [*0EDE.0020.0002.1D07F] # BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080 ; [*0EDF.0020.0002.1D080] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081 ; [*0EE0.0020.0002.1D081] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082 ; [*0EE1.0020.0002.1D082] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083 ; [*0EE2.0020.0002.1D083] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084 ; [*0EE3.0020.0002.1D084] # BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085 ; [*0EE4.0020.0002.1D085] # BYZANTINE MUSICAL SYMBOL APLI
+1D086 ; [*0EE5.0020.0002.1D086] # BYZANTINE MUSICAL SYMBOL DIPLI
+1D087 ; [*0EE6.0020.0002.1D087] # BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088 ; [*0EE7.0020.0002.1D088] # BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089 ; [*0EE8.0020.0002.1D089] # BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A ; [*0EE9.0020.0002.1D08A] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B ; [*0EEA.0020.0002.1D08B] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C ; [*0EEB.0020.0002.1D08C] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D ; [*0EEC.0020.0002.1D08D] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E ; [*0EED.0020.0002.1D08E] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F ; [*0EEE.0020.0002.1D08F] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090 ; [*0EEF.0020.0002.1D090] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091 ; [*0EF0.0020.0002.1D091] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092 ; [*0EF1.0020.0002.1D092] # BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093 ; [*0EF2.0020.0002.1D093] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094 ; [*0EF3.0020.0002.1D094] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095 ; [*0EF4.0020.0002.1D095] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096 ; [*0EF5.0020.0002.1D096] # BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097 ; [*0EF6.0020.0002.1D097] # BYZANTINE MUSICAL SYMBOL ARGON
+1D098 ; [*0EF7.0020.0002.1D098] # BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099 ; [*0EF8.0020.0002.1D099] # BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A ; [*0EF9.0020.0002.1D09A] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B ; [*0EFA.0020.0002.1D09B] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C ; [*0EFB.0020.0002.1D09C] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D ; [*0EFC.0020.0002.1D09D] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E ; [*0EFD.0020.0002.1D09E] # BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F ; [*0EFE.0020.0002.1D09F] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0 ; [*0EFF.0020.0002.1D0A0] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1 ; [*0F00.0020.0002.1D0A1] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2 ; [*0F01.0020.0002.1D0A2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3 ; [*0F02.0020.0002.1D0A3] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4 ; [*0F03.0020.0002.1D0A4] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5 ; [*0F04.0020.0002.1D0A5] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6 ; [*0F05.0020.0002.1D0A6] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7 ; [*0F06.0020.0002.1D0A7] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8 ; [*0F07.0020.0002.1D0A8] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9 ; [*0F08.0020.0002.1D0A9] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA ; [*0F09.0020.0002.1D0AA] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB ; [*0F0A.0020.0002.1D0AB] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC ; [*0F0B.0020.0002.1D0AC] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD ; [*0F0C.0020.0002.1D0AD] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE ; [*0F0D.0020.0002.1D0AE] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF ; [*0F0E.0020.0002.1D0AF] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0 ; [*0F0F.0020.0002.1D0B0] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1 ; [*0F10.0020.0002.1D0B1] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2 ; [*0F11.0020.0002.1D0B2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3 ; [*0F12.0020.0002.1D0B3] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4 ; [*0F13.0020.0002.1D0B4] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5 ; [*0F14.0020.0002.1D0B5] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6 ; [*0F15.0020.0002.1D0B6] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7 ; [*0F16.0020.0002.1D0B7] # BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8 ; [*0F17.0020.0002.1D0B8] # BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9 ; [*0F18.0020.0002.1D0B9] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA ; [*0F19.0020.0002.1D0BA] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB ; [*0F1A.0020.0002.1D0BB] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC ; [*0F1B.0020.0002.1D0BC] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD ; [*0F1C.0020.0002.1D0BD] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE ; [*0F1D.0020.0002.1D0BE] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF ; [*0F1E.0020.0002.1D0BF] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0 ; [*0F1F.0020.0002.1D0C0] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1 ; [*0F20.0020.0002.1D0C1] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2 ; [*0F21.0020.0002.1D0C2] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3 ; [*0F22.0020.0002.1D0C3] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4 ; [*0F23.0020.0002.1D0C4] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5 ; [*0F24.0020.0002.1D0C5] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6 ; [*0F25.0020.0002.1D0C6] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7 ; [*0F26.0020.0002.1D0C7] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8 ; [*0F27.0020.0002.1D0C8] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9 ; [*0F28.0020.0002.1D0C9] # BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA ; [*0F29.0020.0002.1D0CA] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB ; [*0F2A.0020.0002.1D0CB] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC ; [*0F2B.0020.0002.1D0CC] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD ; [*0F2C.0020.0002.1D0CD] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE ; [*0F2D.0020.0002.1D0CE] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF ; [*0F2E.0020.0002.1D0CF] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0 ; [*0F2F.0020.0002.1D0D0] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1 ; [*0F30.0020.0002.1D0D1] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2 ; [*0F31.0020.0002.1D0D2] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3 ; [*0F32.0020.0002.1D0D3] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4 ; [*0F33.0020.0002.1D0D4] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5 ; [*0F34.0020.0002.1D0D5] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6 ; [*0F35.0020.0002.1D0D6] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7 ; [*0F36.0020.0002.1D0D7] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8 ; [*0F37.0020.0002.1D0D8] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9 ; [*0F38.0020.0002.1D0D9] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA ; [*0F39.0020.0002.1D0DA] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB ; [*0F3A.0020.0002.1D0DB] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC ; [*0F3B.0020.0002.1D0DC] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD ; [*0F3C.0020.0002.1D0DD] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE ; [*0F3D.0020.0002.1D0DE] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF ; [*0F3E.0020.0002.1D0DF] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0 ; [*0F3F.0020.0002.1D0E0] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1 ; [*0F40.0020.0002.1D0E1] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2 ; [*0F41.0020.0002.1D0E2] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3 ; [*0F42.0020.0002.1D0E3] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4 ; [*0F43.0020.0002.1D0E4] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5 ; [*0F44.0020.0002.1D0E5] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6 ; [*0F45.0020.0002.1D0E6] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7 ; [*0F46.0020.0002.1D0E7] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8 ; [*0F47.0020.0002.1D0E8] # BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9 ; [*0F48.0020.0002.1D0E9] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA ; [*0F49.0020.0002.1D0EA] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB ; [*0F4A.0020.0002.1D0EB] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC ; [*0F4B.0020.0002.1D0EC] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED ; [*0F4C.0020.0002.1D0ED] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE ; [*0F4D.0020.0002.1D0EE] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF ; [*0F4E.0020.0002.1D0EF] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0 ; [*0F4F.0020.0002.1D0F0] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1 ; [*0F50.0020.0002.1D0F1] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2 ; [*0F51.0020.0002.1D0F2] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3 ; [*0F52.0020.0002.1D0F3] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4 ; [*0F53.0020.0002.1D0F4] # BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5 ; [*0F54.0020.0002.1D0F5] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100 ; [*0F55.0020.0002.1D100] # MUSICAL SYMBOL SINGLE BARLINE
+1D101 ; [*0F56.0020.0002.1D101] # MUSICAL SYMBOL DOUBLE BARLINE
+1D102 ; [*0F57.0020.0002.1D102] # MUSICAL SYMBOL FINAL BARLINE
+1D103 ; [*0F58.0020.0002.1D103] # MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104 ; [*0F59.0020.0002.1D104] # MUSICAL SYMBOL DASHED BARLINE
+1D105 ; [*0F5A.0020.0002.1D105] # MUSICAL SYMBOL SHORT BARLINE
+1D106 ; [*0F5B.0020.0002.1D106] # MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107 ; [*0F5C.0020.0002.1D107] # MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108 ; [*0F5D.0020.0002.1D108] # MUSICAL SYMBOL REPEAT DOTS
+1D109 ; [*0F5E.0020.0002.1D109] # MUSICAL SYMBOL DAL SEGNO
+1D10A ; [*0F5F.0020.0002.1D10A] # MUSICAL SYMBOL DA CAPO
+1D10B ; [*0F60.0020.0002.1D10B] # MUSICAL SYMBOL SEGNO
+1D10C ; [*0F61.0020.0002.1D10C] # MUSICAL SYMBOL CODA
+1D10D ; [*0F62.0020.0002.1D10D] # MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E ; [*0F63.0020.0002.1D10E] # MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F ; [*0F64.0020.0002.1D10F] # MUSICAL SYMBOL REPEATED FIGURE-3
+1D110 ; [*0F65.0020.0002.1D110] # MUSICAL SYMBOL FERMATA
+1D111 ; [*0F66.0020.0002.1D111] # MUSICAL SYMBOL FERMATA BELOW
+1D112 ; [*0F67.0020.0002.1D112] # MUSICAL SYMBOL BREATH MARK
+1D113 ; [*0F68.0020.0002.1D113] # MUSICAL SYMBOL CAESURA
+1D114 ; [*0F69.0020.0002.1D114] # MUSICAL SYMBOL BRACE
+1D115 ; [*0F6A.0020.0002.1D115] # MUSICAL SYMBOL BRACKET
+1D116 ; [*0F6B.0020.0002.1D116] # MUSICAL SYMBOL ONE-LINE STAFF
+1D117 ; [*0F6C.0020.0002.1D117] # MUSICAL SYMBOL TWO-LINE STAFF
+1D118 ; [*0F6D.0020.0002.1D118] # MUSICAL SYMBOL THREE-LINE STAFF
+1D119 ; [*0F6E.0020.0002.1D119] # MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A ; [*0F6F.0020.0002.1D11A] # MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B ; [*0F70.0020.0002.1D11B] # MUSICAL SYMBOL SIX-LINE STAFF
+1D11C ; [*0F71.0020.0002.1D11C] # MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D ; [*0F72.0020.0002.1D11D] # MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E ; [*0F73.0020.0002.1D11E] # MUSICAL SYMBOL G CLEF
+1D11F ; [*0F74.0020.0002.1D11F] # MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120 ; [*0F75.0020.0002.1D120] # MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121 ; [*0F76.0020.0002.1D121] # MUSICAL SYMBOL C CLEF
+1D122 ; [*0F77.0020.0002.1D122] # MUSICAL SYMBOL F CLEF
+1D123 ; [*0F78.0020.0002.1D123] # MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124 ; [*0F79.0020.0002.1D124] # MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125 ; [*0F7A.0020.0002.1D125] # MUSICAL SYMBOL DRUM CLEF-1
+1D126 ; [*0F7B.0020.0002.1D126] # MUSICAL SYMBOL DRUM CLEF-2
+1D129 ; [*0F8F.0020.0002.1D129] # MUSICAL SYMBOL MULTIPLE MEASURE REST
+1D12A ; [*0F7F.0020.0002.1D12A] # MUSICAL SYMBOL DOUBLE SHARP
+1D12B ; [*0F80.0020.0002.1D12B] # MUSICAL SYMBOL DOUBLE FLAT
+1D12C ; [*0F81.0020.0002.1D12C] # MUSICAL SYMBOL FLAT UP
+1D12D ; [*0F82.0020.0002.1D12D] # MUSICAL SYMBOL FLAT DOWN
+1D12E ; [*0F83.0020.0002.1D12E] # MUSICAL SYMBOL NATURAL UP
+1D12F ; [*0F84.0020.0002.1D12F] # MUSICAL SYMBOL NATURAL DOWN
+1D130 ; [*0F85.0020.0002.1D130] # MUSICAL SYMBOL SHARP UP
+1D131 ; [*0F86.0020.0002.1D131] # MUSICAL SYMBOL SHARP DOWN
+1D132 ; [*0F87.0020.0002.1D132] # MUSICAL SYMBOL QUARTER TONE SHARP
+1D133 ; [*0F88.0020.0002.1D133] # MUSICAL SYMBOL QUARTER TONE FLAT
+1D134 ; [*0F89.0020.0002.1D134] # MUSICAL SYMBOL COMMON TIME
+1D135 ; [*0F8A.0020.0002.1D135] # MUSICAL SYMBOL CUT TIME
+1D136 ; [*0F8B.0020.0002.1D136] # MUSICAL SYMBOL OTTAVA ALTA
+1D137 ; [*0F8C.0020.0002.1D137] # MUSICAL SYMBOL OTTAVA BASSA
+1D138 ; [*0F8D.0020.0002.1D138] # MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139 ; [*0F8E.0020.0002.1D139] # MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A ; [*0F90.0020.0002.1D13A] # MUSICAL SYMBOL MULTI REST
+1D13B ; [*0F91.0020.0002.1D13B] # MUSICAL SYMBOL WHOLE REST
+1D13C ; [*0F92.0020.0002.1D13C] # MUSICAL SYMBOL HALF REST
+1D13D ; [*0F93.0020.0002.1D13D] # MUSICAL SYMBOL QUARTER REST
+1D13E ; [*0F94.0020.0002.1D13E] # MUSICAL SYMBOL EIGHTH REST
+1D13F ; [*0F95.0020.0002.1D13F] # MUSICAL SYMBOL SIXTEENTH REST
+1D140 ; [*0F96.0020.0002.1D140] # MUSICAL SYMBOL THIRTY-SECOND REST
+1D141 ; [*0F97.0020.0002.1D141] # MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142 ; [*0F98.0020.0002.1D142] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143 ; [*0F99.0020.0002.1D143] # MUSICAL SYMBOL X NOTEHEAD
+1D144 ; [*0F9A.0020.0002.1D144] # MUSICAL SYMBOL PLUS NOTEHEAD
+1D145 ; [*0F9B.0020.0002.1D145] # MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146 ; [*0F9C.0020.0002.1D146] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147 ; [*0F9D.0020.0002.1D147] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148 ; [*0F9E.0020.0002.1D148] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149 ; [*0F9F.0020.0002.1D149] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A ; [*0FA0.0020.0002.1D14A] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B ; [*0FA1.0020.0002.1D14B] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C ; [*0FA2.0020.0002.1D14C] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D ; [*0FA3.0020.0002.1D14D] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E ; [*0FA4.0020.0002.1D14E] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F ; [*0FA5.0020.0002.1D14F] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150 ; [*0FA6.0020.0002.1D150] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151 ; [*0FA7.0020.0002.1D151] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152 ; [*0FA8.0020.0002.1D152] # MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153 ; [*0FA9.0020.0002.1D153] # MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154 ; [*0FAA.0020.0002.1D154] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155 ; [*0FAB.0020.0002.1D155] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156 ; [*0FAC.0020.0002.1D156] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157 ; [*0FAD.0020.0002.1D157] # MUSICAL SYMBOL VOID NOTEHEAD
+1D158 ; [*0FAE.0020.0002.1D158] # MUSICAL SYMBOL NOTEHEAD BLACK
+1D159 ; [*0FAF.0020.0002.1D159] # MUSICAL SYMBOL NULL NOTEHEAD
+1D15A ; [*0FB0.0020.0002.1D15A] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B ; [*0FB1.0020.0002.1D15B] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C ; [*0FB2.0020.0002.1D15C] # MUSICAL SYMBOL BREVE
+1D15D ; [*0FB3.0020.0002.1D15D] # MUSICAL SYMBOL WHOLE NOTE
+1D15E ; [*0FAD.0020.0002.1D157][.0000.0000.0000.1D165] # MUSICAL SYMBOL HALF NOTE; QQCN
+1D15F ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165] # MUSICAL SYMBOL QUARTER NOTE; QQCN
+1D160 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL EIGHTH NOTE; QQCN
+1D161 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL SIXTEENTH NOTE; QQCN
+1D162 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D170] # MUSICAL SYMBOL THIRTY-SECOND NOTE; QQCN
+1D163 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D171] # MUSICAL SYMBOL SIXTY-FOURTH NOTE; QQCN
+1D164 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D172] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE; QQCN
+1D165 ; [.0000.0000.0000.1D165] # MUSICAL SYMBOL COMBINING STEM
+1D166 ; [.0000.0000.0000.1D166] # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167 ; [.0000.0000.0000.1D167] # MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168 ; [.0000.0000.0000.1D168] # MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169 ; [.0000.0000.0000.1D169] # MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A ; [*0FB4.0020.0002.1D16A] # MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B ; [*0FB5.0020.0002.1D16B] # MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C ; [*0FB6.0020.0002.1D16C] # MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D ; [.0000.0000.0000.1D16D] # MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E ; [.0000.0000.0000.1D16E] # MUSICAL SYMBOL COMBINING FLAG-1
+1D16F ; [.0000.0000.0000.1D16F] # MUSICAL SYMBOL COMBINING FLAG-2
+1D170 ; [.0000.0000.0000.1D170] # MUSICAL SYMBOL COMBINING FLAG-3
+1D171 ; [.0000.0000.0000.1D171] # MUSICAL SYMBOL COMBINING FLAG-4
+1D172 ; [.0000.0000.0000.1D172] # MUSICAL SYMBOL COMBINING FLAG-5
+1D17B ; [.0000.0000.0000.1D17B] # MUSICAL SYMBOL COMBINING ACCENT
+1D17C ; [.0000.0000.0000.1D17C] # MUSICAL SYMBOL COMBINING STACCATO
+1D17D ; [.0000.0000.0000.1D17D] # MUSICAL SYMBOL COMBINING TENUTO
+1D17E ; [.0000.0000.0000.1D17E] # MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F ; [.0000.0000.0000.1D17F] # MUSICAL SYMBOL COMBINING MARCATO
+1D180 ; [.0000.0000.0000.1D180] # MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181 ; [.0000.0000.0000.1D181] # MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182 ; [.0000.0000.0000.1D182] # MUSICAL SYMBOL COMBINING LOURE
+1D183 ; [*0FB7.0020.0002.1D183] # MUSICAL SYMBOL ARPEGGIATO UP
+1D184 ; [*0FB8.0020.0002.1D184] # MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185 ; [.0000.0000.0000.1D185] # MUSICAL SYMBOL COMBINING DOIT
+1D186 ; [.0000.0000.0000.1D186] # MUSICAL SYMBOL COMBINING RIP
+1D187 ; [.0000.0000.0000.1D187] # MUSICAL SYMBOL COMBINING FLIP
+1D188 ; [.0000.0000.0000.1D188] # MUSICAL SYMBOL COMBINING SMEAR
+1D189 ; [.0000.0000.0000.1D189] # MUSICAL SYMBOL COMBINING BEND
+1D18A ; [.0000.0000.0000.1D18A] # MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B ; [.0000.0000.0000.1D18B] # MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C ; [*0FB9.0020.0002.1D18C] # MUSICAL SYMBOL RINFORZANDO
+1D18D ; [*0FBA.0020.0002.1D18D] # MUSICAL SYMBOL SUBITO
+1D18E ; [*0FBB.0020.0002.1D18E] # MUSICAL SYMBOL Z
+1D18F ; [*0FBC.0020.0002.1D18F] # MUSICAL SYMBOL PIANO
+1D190 ; [*0FBD.0020.0002.1D190] # MUSICAL SYMBOL MEZZO
+1D191 ; [*0FBE.0020.0002.1D191] # MUSICAL SYMBOL FORTE
+1D192 ; [*0FBF.0020.0002.1D192] # MUSICAL SYMBOL CRESCENDO
+1D193 ; [*0FC0.0020.0002.1D193] # MUSICAL SYMBOL DECRESCENDO
+1D194 ; [*0FC1.0020.0002.1D194] # MUSICAL SYMBOL GRACE NOTE SLASH
+1D195 ; [*0FC2.0020.0002.1D195] # MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196 ; [*0FC3.0020.0002.1D196] # MUSICAL SYMBOL TR
+1D197 ; [*0FC4.0020.0002.1D197] # MUSICAL SYMBOL TURN
+1D198 ; [*0FC5.0020.0002.1D198] # MUSICAL SYMBOL INVERTED TURN
+1D199 ; [*0FC6.0020.0002.1D199] # MUSICAL SYMBOL TURN SLASH
+1D19A ; [*0FC7.0020.0002.1D19A] # MUSICAL SYMBOL TURN UP
+1D19B ; [*0FC8.0020.0002.1D19B] # MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C ; [*0FC9.0020.0002.1D19C] # MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D ; [*0FCA.0020.0002.1D19D] # MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E ; [*0FCB.0020.0002.1D19E] # MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F ; [*0FCC.0020.0002.1D19F] # MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0 ; [*0FCD.0020.0002.1D1A0] # MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1 ; [*0FCE.0020.0002.1D1A1] # MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2 ; [*0FCF.0020.0002.1D1A2] # MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3 ; [*0FD0.0020.0002.1D1A3] # MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4 ; [*0FD1.0020.0002.1D1A4] # MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5 ; [*0FD2.0020.0002.1D1A5] # MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6 ; [*0FD3.0020.0002.1D1A6] # MUSICAL SYMBOL HAUPTSTIMME
+1D1A7 ; [*0FD4.0020.0002.1D1A7] # MUSICAL SYMBOL NEBENSTIMME
+1D1A8 ; [*0FD5.0020.0002.1D1A8] # MUSICAL SYMBOL END OF STIMME
+1D1A9 ; [*0FD6.0020.0002.1D1A9] # MUSICAL SYMBOL DEGREE SLASH
+1D1AA ; [.0000.0000.0000.1D1AA] # MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB ; [.0000.0000.0000.1D1AB] # MUSICAL SYMBOL COMBINING UP BOW
+1D1AC ; [.0000.0000.0000.1D1AC] # MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD ; [.0000.0000.0000.1D1AD] # MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE ; [*0FD7.0020.0002.1D1AE] # MUSICAL SYMBOL PEDAL MARK
+1D1AF ; [*0FD8.0020.0002.1D1AF] # MUSICAL SYMBOL PEDAL UP MARK
+1D1B0 ; [*0FD9.0020.0002.1D1B0] # MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1 ; [*0FDA.0020.0002.1D1B1] # MUSICAL SYMBOL GLISSANDO UP
+1D1B2 ; [*0FDB.0020.0002.1D1B2] # MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3 ; [*0FDC.0020.0002.1D1B3] # MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4 ; [*0FDD.0020.0002.1D1B4] # MUSICAL SYMBOL DAMP
+1D1B5 ; [*0FDE.0020.0002.1D1B5] # MUSICAL SYMBOL DAMP ALL
+1D1B6 ; [*0FDF.0020.0002.1D1B6] # MUSICAL SYMBOL MAXIMA
+1D1B7 ; [*0FE0.0020.0002.1D1B7] # MUSICAL SYMBOL LONGA
+1D1B8 ; [*0FE1.0020.0002.1D1B8] # MUSICAL SYMBOL BREVIS
+1D1B9 ; [*0FE2.0020.0002.1D1B9] # MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA ; [*0FE3.0020.0002.1D1BA] # MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB ; [*0FE2.0020.0002.1D1B9][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA; QQCN
+1D1BC ; [*0FE3.0020.0002.1D1BA][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA BLACK; QQCN
+1D1BD ; [*0FE2.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA WHITE; QQCN
+1D1BE ; [*0FE3.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA BLACK; QQCN
+1D1BF ; [*0FE2.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA WHITE; QQCN
+1D1C0 ; [*0FE3.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA BLACK; QQCN
+1D1C1 ; [*0FE4.0020.0002.1D1C1] # MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2 ; [*0FE5.0020.0002.1D1C2] # MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3 ; [*0FE6.0020.0002.1D1C3] # MUSICAL SYMBOL BREVIS REST
+1D1C4 ; [*0FE7.0020.0002.1D1C4] # MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5 ; [*0FE8.0020.0002.1D1C5] # MUSICAL SYMBOL MINIMA REST
+1D1C6 ; [*0FE9.0020.0002.1D1C6] # MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7 ; [*0FEA.0020.0002.1D1C7] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8 ; [*0FEB.0020.0002.1D1C8] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9 ; [*0FEC.0020.0002.1D1C9] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA ; [*0FED.0020.0002.1D1CA] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB ; [*0FEE.0020.0002.1D1CB] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC ; [*0FEF.0020.0002.1D1CC] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD ; [*0FF0.0020.0002.1D1CD] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE ; [*0FF1.0020.0002.1D1CE] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF ; [*0FF2.0020.0002.1D1CF] # MUSICAL SYMBOL CROIX
+1D1D0 ; [*0FF3.0020.0002.1D1D0] # MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1 ; [*0FF4.0020.0002.1D1D1] # MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2 ; [*0FF5.0020.0002.1D1D2] # MUSICAL SYMBOL SQUARE B
+1D1D3 ; [*0FF6.0020.0002.1D1D3] # MUSICAL SYMBOL VIRGA
+1D1D4 ; [*0FF7.0020.0002.1D1D4] # MUSICAL SYMBOL PODATUS
+1D1D5 ; [*0FF8.0020.0002.1D1D5] # MUSICAL SYMBOL CLIVIS
+1D1D6 ; [*0FF9.0020.0002.1D1D6] # MUSICAL SYMBOL SCANDICUS
+1D1D7 ; [*0FFA.0020.0002.1D1D7] # MUSICAL SYMBOL CLIMACUS
+1D1D8 ; [*0FFB.0020.0002.1D1D8] # MUSICAL SYMBOL TORCULUS
+1D1D9 ; [*0FFC.0020.0002.1D1D9] # MUSICAL SYMBOL PORRECTUS
+1D1DA ; [*0FFD.0020.0002.1D1DA] # MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB ; [*0FFE.0020.0002.1D1DB] # MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC ; [*0FFF.0020.0002.1D1DC] # MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD ; [*1000.0020.0002.1D1DD] # MUSICAL SYMBOL PES SUBPUNCTIS
+1D200 ; [*1001.0020.0002.1D200] # GREEK VOCAL NOTATION SYMBOL-1
+1D201 ; [*1002.0020.0002.1D201] # GREEK VOCAL NOTATION SYMBOL-2
+1D202 ; [*1003.0020.0002.1D202] # GREEK VOCAL NOTATION SYMBOL-3
+1D203 ; [*1004.0020.0002.1D203] # GREEK VOCAL NOTATION SYMBOL-4
+1D204 ; [*1005.0020.0002.1D204] # GREEK VOCAL NOTATION SYMBOL-5
+1D205 ; [*1006.0020.0002.1D205] # GREEK VOCAL NOTATION SYMBOL-6
+1D206 ; [*1007.0020.0002.1D206] # GREEK VOCAL NOTATION SYMBOL-7
+1D207 ; [*1008.0020.0002.1D207] # GREEK VOCAL NOTATION SYMBOL-8
+1D208 ; [*1009.0020.0002.1D208] # GREEK VOCAL NOTATION SYMBOL-9
+1D209 ; [*100A.0020.0002.1D209] # GREEK VOCAL NOTATION SYMBOL-10
+1D20A ; [*100B.0020.0002.1D20A] # GREEK VOCAL NOTATION SYMBOL-11
+1D20B ; [*100C.0020.0002.1D20B] # GREEK VOCAL NOTATION SYMBOL-12
+1D20C ; [*100D.0020.0002.1D20C] # GREEK VOCAL NOTATION SYMBOL-13
+1D20D ; [*100E.0020.0002.1D20D] # GREEK VOCAL NOTATION SYMBOL-14
+1D20E ; [*100F.0020.0002.1D20E] # GREEK VOCAL NOTATION SYMBOL-15
+1D20F ; [*1010.0020.0002.1D20F] # GREEK VOCAL NOTATION SYMBOL-16
+1D210 ; [*1011.0020.0002.1D210] # GREEK VOCAL NOTATION SYMBOL-17
+1D211 ; [*1012.0020.0002.1D211] # GREEK VOCAL NOTATION SYMBOL-18
+1D212 ; [*1013.0020.0002.1D212] # GREEK VOCAL NOTATION SYMBOL-19
+1D213 ; [*1014.0020.0002.1D213] # GREEK VOCAL NOTATION SYMBOL-20
+1D214 ; [*1015.0020.0002.1D214] # GREEK VOCAL NOTATION SYMBOL-21
+1D215 ; [*1016.0020.0002.1D215] # GREEK VOCAL NOTATION SYMBOL-22
+1D216 ; [*1017.0020.0002.1D216] # GREEK VOCAL NOTATION SYMBOL-23
+1D217 ; [*1018.0020.0002.1D217] # GREEK VOCAL NOTATION SYMBOL-24
+1D218 ; [*1019.0020.0002.1D218] # GREEK VOCAL NOTATION SYMBOL-50
+1D219 ; [*101A.0020.0002.1D219] # GREEK VOCAL NOTATION SYMBOL-51
+1D21A ; [*101B.0020.0002.1D21A] # GREEK VOCAL NOTATION SYMBOL-52
+1D21B ; [*101C.0020.0002.1D21B] # GREEK VOCAL NOTATION SYMBOL-53
+1D21C ; [*101D.0020.0002.1D21C] # GREEK VOCAL NOTATION SYMBOL-54
+1D21D ; [*101E.0020.0002.1D21D] # GREEK INSTRUMENTAL NOTATION SYMBOL-1
+1D21E ; [*101F.0020.0002.1D21E] # GREEK INSTRUMENTAL NOTATION SYMBOL-2
+1D21F ; [*1020.0020.0002.1D21F] # GREEK INSTRUMENTAL NOTATION SYMBOL-4
+1D220 ; [*1021.0020.0002.1D220] # GREEK INSTRUMENTAL NOTATION SYMBOL-5
+1D221 ; [*1022.0020.0002.1D221] # GREEK INSTRUMENTAL NOTATION SYMBOL-7
+1D222 ; [*1023.0020.0002.1D222] # GREEK INSTRUMENTAL NOTATION SYMBOL-8
+1D223 ; [*1024.0020.0002.1D223] # GREEK INSTRUMENTAL NOTATION SYMBOL-11
+1D224 ; [*1025.0020.0002.1D224] # GREEK INSTRUMENTAL NOTATION SYMBOL-12
+1D225 ; [*1026.0020.0002.1D225] # GREEK INSTRUMENTAL NOTATION SYMBOL-13
+1D226 ; [*1027.0020.0002.1D226] # GREEK INSTRUMENTAL NOTATION SYMBOL-14
+1D227 ; [*1028.0020.0002.1D227] # GREEK INSTRUMENTAL NOTATION SYMBOL-17
+1D228 ; [*1029.0020.0002.1D228] # GREEK INSTRUMENTAL NOTATION SYMBOL-18
+1D229 ; [*102A.0020.0002.1D229] # GREEK INSTRUMENTAL NOTATION SYMBOL-19
+1D22A ; [*102B.0020.0002.1D22A] # GREEK INSTRUMENTAL NOTATION SYMBOL-23
+1D22B ; [*102C.0020.0002.1D22B] # GREEK INSTRUMENTAL NOTATION SYMBOL-24
+1D22C ; [*102D.0020.0002.1D22C] # GREEK INSTRUMENTAL NOTATION SYMBOL-25
+1D22D ; [*102E.0020.0002.1D22D] # GREEK INSTRUMENTAL NOTATION SYMBOL-26
+1D22E ; [*102F.0020.0002.1D22E] # GREEK INSTRUMENTAL NOTATION SYMBOL-27
+1D22F ; [*1030.0020.0002.1D22F] # GREEK INSTRUMENTAL NOTATION SYMBOL-29
+1D230 ; [*1031.0020.0002.1D230] # GREEK INSTRUMENTAL NOTATION SYMBOL-30
+1D231 ; [*1032.0020.0002.1D231] # GREEK INSTRUMENTAL NOTATION SYMBOL-32
+1D232 ; [*1033.0020.0002.1D232] # GREEK INSTRUMENTAL NOTATION SYMBOL-36
+1D233 ; [*1034.0020.0002.1D233] # GREEK INSTRUMENTAL NOTATION SYMBOL-37
+1D234 ; [*1035.0020.0002.1D234] # GREEK INSTRUMENTAL NOTATION SYMBOL-38
+1D235 ; [*1036.0020.0002.1D235] # GREEK INSTRUMENTAL NOTATION SYMBOL-39
+1D236 ; [*1037.0020.0002.1D236] # GREEK INSTRUMENTAL NOTATION SYMBOL-40
+1D237 ; [*1038.0020.0002.1D237] # GREEK INSTRUMENTAL NOTATION SYMBOL-42
+1D238 ; [*1039.0020.0002.1D238] # GREEK INSTRUMENTAL NOTATION SYMBOL-43
+1D239 ; [*103A.0020.0002.1D239] # GREEK INSTRUMENTAL NOTATION SYMBOL-45
+1D23A ; [*103B.0020.0002.1D23A] # GREEK INSTRUMENTAL NOTATION SYMBOL-47
+1D23B ; [*103C.0020.0002.1D23B] # GREEK INSTRUMENTAL NOTATION SYMBOL-48
+1D23C ; [*103D.0020.0002.1D23C] # GREEK INSTRUMENTAL NOTATION SYMBOL-49
+1D23D ; [*103E.0020.0002.1D23D] # GREEK INSTRUMENTAL NOTATION SYMBOL-50
+1D23E ; [*103F.0020.0002.1D23E] # GREEK INSTRUMENTAL NOTATION SYMBOL-51
+1D23F ; [*1040.0020.0002.1D23F] # GREEK INSTRUMENTAL NOTATION SYMBOL-52
+1D240 ; [*1041.0020.0002.1D240] # GREEK INSTRUMENTAL NOTATION SYMBOL-53
+1D241 ; [*1042.0020.0002.1D241] # GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242 ; [.0000.0000.0000.1D242] # COMBINING GREEK MUSICAL TRISEME
+1D243 ; [.0000.0000.0000.1D243] # COMBINING GREEK MUSICAL TETRASEME
+1D244 ; [.0000.0000.0000.1D244] # COMBINING GREEK MUSICAL PENTASEME
+1D245 ; [*1043.0020.0002.1D245] # GREEK MUSICAL LEIMMA
+1D300 ; [*0D7E.0020.0002.1D300] # MONOGRAM FOR EARTH
+1D301 ; [*0D7F.0020.0002.1D301] # DIGRAM FOR HEAVENLY EARTH
+1D302 ; [*0D80.0020.0002.1D302] # DIGRAM FOR HUMAN EARTH
+1D303 ; [*0D81.0020.0002.1D303] # DIGRAM FOR EARTHLY HEAVEN
+1D304 ; [*0D82.0020.0002.1D304] # DIGRAM FOR EARTHLY HUMAN
+1D305 ; [*0D83.0020.0002.1D305] # DIGRAM FOR EARTH
+1D306 ; [*0D84.0020.0002.1D306] # TETRAGRAM FOR CENTRE
+1D307 ; [*0D85.0020.0002.1D307] # TETRAGRAM FOR FULL CIRCLE
+1D308 ; [*0D86.0020.0002.1D308] # TETRAGRAM FOR MIRED
+1D309 ; [*0D87.0020.0002.1D309] # TETRAGRAM FOR BARRIER
+1D30A ; [*0D88.0020.0002.1D30A] # TETRAGRAM FOR KEEPING SMALL
+1D30B ; [*0D89.0020.0002.1D30B] # TETRAGRAM FOR CONTRARIETY
+1D30C ; [*0D8A.0020.0002.1D30C] # TETRAGRAM FOR ASCENT
+1D30D ; [*0D8B.0020.0002.1D30D] # TETRAGRAM FOR OPPOSITION
+1D30E ; [*0D8C.0020.0002.1D30E] # TETRAGRAM FOR BRANCHING OUT
+1D30F ; [*0D8D.0020.0002.1D30F] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310 ; [*0D8E.0020.0002.1D310] # TETRAGRAM FOR DIVERGENCE
+1D311 ; [*0D8F.0020.0002.1D311] # TETRAGRAM FOR YOUTHFULNESS
+1D312 ; [*0D90.0020.0002.1D312] # TETRAGRAM FOR INCREASE
+1D313 ; [*0D91.0020.0002.1D313] # TETRAGRAM FOR PENETRATION
+1D314 ; [*0D92.0020.0002.1D314] # TETRAGRAM FOR REACH
+1D315 ; [*0D93.0020.0002.1D315] # TETRAGRAM FOR CONTACT
+1D316 ; [*0D94.0020.0002.1D316] # TETRAGRAM FOR HOLDING BACK
+1D317 ; [*0D95.0020.0002.1D317] # TETRAGRAM FOR WAITING
+1D318 ; [*0D96.0020.0002.1D318] # TETRAGRAM FOR FOLLOWING
+1D319 ; [*0D97.0020.0002.1D319] # TETRAGRAM FOR ADVANCE
+1D31A ; [*0D98.0020.0002.1D31A] # TETRAGRAM FOR RELEASE
+1D31B ; [*0D99.0020.0002.1D31B] # TETRAGRAM FOR RESISTANCE
+1D31C ; [*0D9A.0020.0002.1D31C] # TETRAGRAM FOR EASE
+1D31D ; [*0D9B.0020.0002.1D31D] # TETRAGRAM FOR JOY
+1D31E ; [*0D9C.0020.0002.1D31E] # TETRAGRAM FOR CONTENTION
+1D31F ; [*0D9D.0020.0002.1D31F] # TETRAGRAM FOR ENDEAVOUR
+1D320 ; [*0D9E.0020.0002.1D320] # TETRAGRAM FOR DUTIES
+1D321 ; [*0D9F.0020.0002.1D321] # TETRAGRAM FOR CHANGE
+1D322 ; [*0DA0.0020.0002.1D322] # TETRAGRAM FOR DECISIVENESS
+1D323 ; [*0DA1.0020.0002.1D323] # TETRAGRAM FOR BOLD RESOLUTION
+1D324 ; [*0DA2.0020.0002.1D324] # TETRAGRAM FOR PACKING
+1D325 ; [*0DA3.0020.0002.1D325] # TETRAGRAM FOR LEGION
+1D326 ; [*0DA4.0020.0002.1D326] # TETRAGRAM FOR CLOSENESS
+1D327 ; [*0DA5.0020.0002.1D327] # TETRAGRAM FOR KINSHIP
+1D328 ; [*0DA6.0020.0002.1D328] # TETRAGRAM FOR GATHERING
+1D329 ; [*0DA7.0020.0002.1D329] # TETRAGRAM FOR STRENGTH
+1D32A ; [*0DA8.0020.0002.1D32A] # TETRAGRAM FOR PURITY
+1D32B ; [*0DA9.0020.0002.1D32B] # TETRAGRAM FOR FULLNESS
+1D32C ; [*0DAA.0020.0002.1D32C] # TETRAGRAM FOR RESIDENCE
+1D32D ; [*0DAB.0020.0002.1D32D] # TETRAGRAM FOR LAW OR MODEL
+1D32E ; [*0DAC.0020.0002.1D32E] # TETRAGRAM FOR RESPONSE
+1D32F ; [*0DAD.0020.0002.1D32F] # TETRAGRAM FOR GOING TO MEET
+1D330 ; [*0DAE.0020.0002.1D330] # TETRAGRAM FOR ENCOUNTERS
+1D331 ; [*0DAF.0020.0002.1D331] # TETRAGRAM FOR STOVE
+1D332 ; [*0DB0.0020.0002.1D332] # TETRAGRAM FOR GREATNESS
+1D333 ; [*0DB1.0020.0002.1D333] # TETRAGRAM FOR ENLARGEMENT
+1D334 ; [*0DB2.0020.0002.1D334] # TETRAGRAM FOR PATTERN
+1D335 ; [*0DB3.0020.0002.1D335] # TETRAGRAM FOR RITUAL
+1D336 ; [*0DB4.0020.0002.1D336] # TETRAGRAM FOR FLIGHT
+1D337 ; [*0DB5.0020.0002.1D337] # TETRAGRAM FOR VASTNESS OR WASTING
+1D338 ; [*0DB6.0020.0002.1D338] # TETRAGRAM FOR CONSTANCY
+1D339 ; [*0DB7.0020.0002.1D339] # TETRAGRAM FOR MEASURE
+1D33A ; [*0DB8.0020.0002.1D33A] # TETRAGRAM FOR ETERNITY
+1D33B ; [*0DB9.0020.0002.1D33B] # TETRAGRAM FOR UNITY
+1D33C ; [*0DBA.0020.0002.1D33C] # TETRAGRAM FOR DIMINISHMENT
+1D33D ; [*0DBB.0020.0002.1D33D] # TETRAGRAM FOR CLOSED MOUTH
+1D33E ; [*0DBC.0020.0002.1D33E] # TETRAGRAM FOR GUARDEDNESS
+1D33F ; [*0DBD.0020.0002.1D33F] # TETRAGRAM FOR GATHERING IN
+1D340 ; [*0DBE.0020.0002.1D340] # TETRAGRAM FOR MASSING
+1D341 ; [*0DBF.0020.0002.1D341] # TETRAGRAM FOR ACCUMULATION
+1D342 ; [*0DC0.0020.0002.1D342] # TETRAGRAM FOR EMBELLISHMENT
+1D343 ; [*0DC1.0020.0002.1D343] # TETRAGRAM FOR DOUBT
+1D344 ; [*0DC2.0020.0002.1D344] # TETRAGRAM FOR WATCH
+1D345 ; [*0DC3.0020.0002.1D345] # TETRAGRAM FOR SINKING
+1D346 ; [*0DC4.0020.0002.1D346] # TETRAGRAM FOR INNER
+1D347 ; [*0DC5.0020.0002.1D347] # TETRAGRAM FOR DEPARTURE
+1D348 ; [*0DC6.0020.0002.1D348] # TETRAGRAM FOR DARKENING
+1D349 ; [*0DC7.0020.0002.1D349] # TETRAGRAM FOR DIMMING
+1D34A ; [*0DC8.0020.0002.1D34A] # TETRAGRAM FOR EXHAUSTION
+1D34B ; [*0DC9.0020.0002.1D34B] # TETRAGRAM FOR SEVERANCE
+1D34C ; [*0DCA.0020.0002.1D34C] # TETRAGRAM FOR STOPPAGE
+1D34D ; [*0DCB.0020.0002.1D34D] # TETRAGRAM FOR HARDNESS
+1D34E ; [*0DCC.0020.0002.1D34E] # TETRAGRAM FOR COMPLETION
+1D34F ; [*0DCD.0020.0002.1D34F] # TETRAGRAM FOR CLOSURE
+1D350 ; [*0DCE.0020.0002.1D350] # TETRAGRAM FOR FAILURE
+1D351 ; [*0DCF.0020.0002.1D351] # TETRAGRAM FOR AGGRAVATION
+1D352 ; [*0DD0.0020.0002.1D352] # TETRAGRAM FOR COMPLIANCE
+1D353 ; [*0DD1.0020.0002.1D353] # TETRAGRAM FOR ON THE VERGE
+1D354 ; [*0DD2.0020.0002.1D354] # TETRAGRAM FOR DIFFICULTIES
+1D355 ; [*0DD3.0020.0002.1D355] # TETRAGRAM FOR LABOURING
+1D356 ; [*0DD4.0020.0002.1D356] # TETRAGRAM FOR FOSTERING
+1D369 ; [*11C5.0020.0002.1D369] # COUNTING ROD TENS DIGIT ONE
+1D36A ; [*11C6.0020.0002.1D36A] # COUNTING ROD TENS DIGIT TWO
+1D36B ; [*11C7.0020.0002.1D36B] # COUNTING ROD TENS DIGIT THREE
+1D36C ; [*11C8.0020.0002.1D36C] # COUNTING ROD TENS DIGIT FOUR
+1D36D ; [*11C9.0020.0002.1D36D] # COUNTING ROD TENS DIGIT FIVE
+1D36E ; [*11CA.0020.0002.1D36E] # COUNTING ROD TENS DIGIT SIX
+1D36F ; [*11CB.0020.0002.1D36F] # COUNTING ROD TENS DIGIT SEVEN
+1D370 ; [*11CC.0020.0002.1D370] # COUNTING ROD TENS DIGIT EIGHT
+1D371 ; [*11CD.0020.0002.1D371] # COUNTING ROD TENS DIGIT NINE
+1D6C1 ; [*0546.0020.0005.1D6C1] # MATHEMATICAL BOLD NABLA; QQK
+1D6DB ; [*0542.0020.0005.1D6DB] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL; QQK
+1D6FB ; [*0546.0020.0005.1D6FB] # MATHEMATICAL ITALIC NABLA; QQK
+1D715 ; [*0542.0020.0005.1D715] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL; QQK
+1D735 ; [*0546.0020.0005.1D735] # MATHEMATICAL BOLD ITALIC NABLA; QQK
+1D74F ; [*0542.0020.0005.1D74F] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL; QQK
+1D76F ; [*0546.0020.0005.1D76F] # MATHEMATICAL SANS-SERIF BOLD NABLA; QQK
+1D789 ; [*0542.0020.0005.1D789] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL; QQK
+1D7A9 ; [*0546.0020.0005.1D7A9] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA; QQK
+1D7C3 ; [*0542.0020.0005.1D7C3] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL; QQK
+1F000 ; [*1044.0020.0002.1F000] # MAHJONG TILE EAST WIND
+1F001 ; [*1045.0020.0002.1F001] # MAHJONG TILE SOUTH WIND
+1F002 ; [*1046.0020.0002.1F002] # MAHJONG TILE WEST WIND
+1F003 ; [*1047.0020.0002.1F003] # MAHJONG TILE NORTH WIND
+1F004 ; [*1048.0020.0002.1F004] # MAHJONG TILE RED DRAGON
+1F005 ; [*1049.0020.0002.1F005] # MAHJONG TILE GREEN DRAGON
+1F006 ; [*104A.0020.0002.1F006] # MAHJONG TILE WHITE DRAGON
+1F007 ; [*104B.0020.0002.1F007] # MAHJONG TILE ONE OF CHARACTERS
+1F008 ; [*104C.0020.0002.1F008] # MAHJONG TILE TWO OF CHARACTERS
+1F009 ; [*104D.0020.0002.1F009] # MAHJONG TILE THREE OF CHARACTERS
+1F00A ; [*104E.0020.0002.1F00A] # MAHJONG TILE FOUR OF CHARACTERS
+1F00B ; [*104F.0020.0002.1F00B] # MAHJONG TILE FIVE OF CHARACTERS
+1F00C ; [*1050.0020.0002.1F00C] # MAHJONG TILE SIX OF CHARACTERS
+1F00D ; [*1051.0020.0002.1F00D] # MAHJONG TILE SEVEN OF CHARACTERS
+1F00E ; [*1052.0020.0002.1F00E] # MAHJONG TILE EIGHT OF CHARACTERS
+1F00F ; [*1053.0020.0002.1F00F] # MAHJONG TILE NINE OF CHARACTERS
+1F010 ; [*1054.0020.0002.1F010] # MAHJONG TILE ONE OF BAMBOOS
+1F011 ; [*1055.0020.0002.1F011] # MAHJONG TILE TWO OF BAMBOOS
+1F012 ; [*1056.0020.0002.1F012] # MAHJONG TILE THREE OF BAMBOOS
+1F013 ; [*1057.0020.0002.1F013] # MAHJONG TILE FOUR OF BAMBOOS
+1F014 ; [*1058.0020.0002.1F014] # MAHJONG TILE FIVE OF BAMBOOS
+1F015 ; [*1059.0020.0002.1F015] # MAHJONG TILE SIX OF BAMBOOS
+1F016 ; [*105A.0020.0002.1F016] # MAHJONG TILE SEVEN OF BAMBOOS
+1F017 ; [*105B.0020.0002.1F017] # MAHJONG TILE EIGHT OF BAMBOOS
+1F018 ; [*105C.0020.0002.1F018] # MAHJONG TILE NINE OF BAMBOOS
+1F019 ; [*105D.0020.0002.1F019] # MAHJONG TILE ONE OF CIRCLES
+1F01A ; [*105E.0020.0002.1F01A] # MAHJONG TILE TWO OF CIRCLES
+1F01B ; [*105F.0020.0002.1F01B] # MAHJONG TILE THREE OF CIRCLES
+1F01C ; [*1060.0020.0002.1F01C] # MAHJONG TILE FOUR OF CIRCLES
+1F01D ; [*1061.0020.0002.1F01D] # MAHJONG TILE FIVE OF CIRCLES
+1F01E ; [*1062.0020.0002.1F01E] # MAHJONG TILE SIX OF CIRCLES
+1F01F ; [*1063.0020.0002.1F01F] # MAHJONG TILE SEVEN OF CIRCLES
+1F020 ; [*1064.0020.0002.1F020] # MAHJONG TILE EIGHT OF CIRCLES
+1F021 ; [*1065.0020.0002.1F021] # MAHJONG TILE NINE OF CIRCLES
+1F022 ; [*1066.0020.0002.1F022] # MAHJONG TILE PLUM
+1F023 ; [*1067.0020.0002.1F023] # MAHJONG TILE ORCHID
+1F024 ; [*1068.0020.0002.1F024] # MAHJONG TILE BAMBOO
+1F025 ; [*1069.0020.0002.1F025] # MAHJONG TILE CHRYSANTHEMUM
+1F026 ; [*106A.0020.0002.1F026] # MAHJONG TILE SPRING
+1F027 ; [*106B.0020.0002.1F027] # MAHJONG TILE SUMMER
+1F028 ; [*106C.0020.0002.1F028] # MAHJONG TILE AUTUMN
+1F029 ; [*106D.0020.0002.1F029] # MAHJONG TILE WINTER
+1F02A ; [*106E.0020.0002.1F02A] # MAHJONG TILE JOKER
+1F02B ; [*106F.0020.0002.1F02B] # MAHJONG TILE BACK
+1F030 ; [*1070.0020.0002.1F030] # DOMINO TILE HORIZONTAL BACK
+1F031 ; [*1071.0020.0002.1F031] # DOMINO TILE HORIZONTAL-00-00
+1F032 ; [*1072.0020.0002.1F032] # DOMINO TILE HORIZONTAL-00-01
+1F033 ; [*1073.0020.0002.1F033] # DOMINO TILE HORIZONTAL-00-02
+1F034 ; [*1074.0020.0002.1F034] # DOMINO TILE HORIZONTAL-00-03
+1F035 ; [*1075.0020.0002.1F035] # DOMINO TILE HORIZONTAL-00-04
+1F036 ; [*1076.0020.0002.1F036] # DOMINO TILE HORIZONTAL-00-05
+1F037 ; [*1077.0020.0002.1F037] # DOMINO TILE HORIZONTAL-00-06
+1F038 ; [*1078.0020.0002.1F038] # DOMINO TILE HORIZONTAL-01-00
+1F039 ; [*1079.0020.0002.1F039] # DOMINO TILE HORIZONTAL-01-01
+1F03A ; [*107A.0020.0002.1F03A] # DOMINO TILE HORIZONTAL-01-02
+1F03B ; [*107B.0020.0002.1F03B] # DOMINO TILE HORIZONTAL-01-03
+1F03C ; [*107C.0020.0002.1F03C] # DOMINO TILE HORIZONTAL-01-04
+1F03D ; [*107D.0020.0002.1F03D] # DOMINO TILE HORIZONTAL-01-05
+1F03E ; [*107E.0020.0002.1F03E] # DOMINO TILE HORIZONTAL-01-06
+1F03F ; [*107F.0020.0002.1F03F] # DOMINO TILE HORIZONTAL-02-00
+1F040 ; [*1080.0020.0002.1F040] # DOMINO TILE HORIZONTAL-02-01
+1F041 ; [*1081.0020.0002.1F041] # DOMINO TILE HORIZONTAL-02-02
+1F042 ; [*1082.0020.0002.1F042] # DOMINO TILE HORIZONTAL-02-03
+1F043 ; [*1083.0020.0002.1F043] # DOMINO TILE HORIZONTAL-02-04
+1F044 ; [*1084.0020.0002.1F044] # DOMINO TILE HORIZONTAL-02-05
+1F045 ; [*1085.0020.0002.1F045] # DOMINO TILE HORIZONTAL-02-06
+1F046 ; [*1086.0020.0002.1F046] # DOMINO TILE HORIZONTAL-03-00
+1F047 ; [*1087.0020.0002.1F047] # DOMINO TILE HORIZONTAL-03-01
+1F048 ; [*1088.0020.0002.1F048] # DOMINO TILE HORIZONTAL-03-02
+1F049 ; [*1089.0020.0002.1F049] # DOMINO TILE HORIZONTAL-03-03
+1F04A ; [*108A.0020.0002.1F04A] # DOMINO TILE HORIZONTAL-03-04
+1F04B ; [*108B.0020.0002.1F04B] # DOMINO TILE HORIZONTAL-03-05
+1F04C ; [*108C.0020.0002.1F04C] # DOMINO TILE HORIZONTAL-03-06
+1F04D ; [*108D.0020.0002.1F04D] # DOMINO TILE HORIZONTAL-04-00
+1F04E ; [*108E.0020.0002.1F04E] # DOMINO TILE HORIZONTAL-04-01
+1F04F ; [*108F.0020.0002.1F04F] # DOMINO TILE HORIZONTAL-04-02
+1F050 ; [*1090.0020.0002.1F050] # DOMINO TILE HORIZONTAL-04-03
+1F051 ; [*1091.0020.0002.1F051] # DOMINO TILE HORIZONTAL-04-04
+1F052 ; [*1092.0020.0002.1F052] # DOMINO TILE HORIZONTAL-04-05
+1F053 ; [*1093.0020.0002.1F053] # DOMINO TILE HORIZONTAL-04-06
+1F054 ; [*1094.0020.0002.1F054] # DOMINO TILE HORIZONTAL-05-00
+1F055 ; [*1095.0020.0002.1F055] # DOMINO TILE HORIZONTAL-05-01
+1F056 ; [*1096.0020.0002.1F056] # DOMINO TILE HORIZONTAL-05-02
+1F057 ; [*1097.0020.0002.1F057] # DOMINO TILE HORIZONTAL-05-03
+1F058 ; [*1098.0020.0002.1F058] # DOMINO TILE HORIZONTAL-05-04
+1F059 ; [*1099.0020.0002.1F059] # DOMINO TILE HORIZONTAL-05-05
+1F05A ; [*109A.0020.0002.1F05A] # DOMINO TILE HORIZONTAL-05-06
+1F05B ; [*109B.0020.0002.1F05B] # DOMINO TILE HORIZONTAL-06-00
+1F05C ; [*109C.0020.0002.1F05C] # DOMINO TILE HORIZONTAL-06-01
+1F05D ; [*109D.0020.0002.1F05D] # DOMINO TILE HORIZONTAL-06-02
+1F05E ; [*109E.0020.0002.1F05E] # DOMINO TILE HORIZONTAL-06-03
+1F05F ; [*109F.0020.0002.1F05F] # DOMINO TILE HORIZONTAL-06-04
+1F060 ; [*10A0.0020.0002.1F060] # DOMINO TILE HORIZONTAL-06-05
+1F061 ; [*10A1.0020.0002.1F061] # DOMINO TILE HORIZONTAL-06-06
+1F062 ; [*10A2.0020.0002.1F062] # DOMINO TILE VERTICAL BACK
+1F063 ; [*10A3.0020.0002.1F063] # DOMINO TILE VERTICAL-00-00
+1F064 ; [*10A4.0020.0002.1F064] # DOMINO TILE VERTICAL-00-01
+1F065 ; [*10A5.0020.0002.1F065] # DOMINO TILE VERTICAL-00-02
+1F066 ; [*10A6.0020.0002.1F066] # DOMINO TILE VERTICAL-00-03
+1F067 ; [*10A7.0020.0002.1F067] # DOMINO TILE VERTICAL-00-04
+1F068 ; [*10A8.0020.0002.1F068] # DOMINO TILE VERTICAL-00-05
+1F069 ; [*10A9.0020.0002.1F069] # DOMINO TILE VERTICAL-00-06
+1F06A ; [*10AA.0020.0002.1F06A] # DOMINO TILE VERTICAL-01-00
+1F06B ; [*10AB.0020.0002.1F06B] # DOMINO TILE VERTICAL-01-01
+1F06C ; [*10AC.0020.0002.1F06C] # DOMINO TILE VERTICAL-01-02
+1F06D ; [*10AD.0020.0002.1F06D] # DOMINO TILE VERTICAL-01-03
+1F06E ; [*10AE.0020.0002.1F06E] # DOMINO TILE VERTICAL-01-04
+1F06F ; [*10AF.0020.0002.1F06F] # DOMINO TILE VERTICAL-01-05
+1F070 ; [*10B0.0020.0002.1F070] # DOMINO TILE VERTICAL-01-06
+1F071 ; [*10B1.0020.0002.1F071] # DOMINO TILE VERTICAL-02-00
+1F072 ; [*10B2.0020.0002.1F072] # DOMINO TILE VERTICAL-02-01
+1F073 ; [*10B3.0020.0002.1F073] # DOMINO TILE VERTICAL-02-02
+1F074 ; [*10B4.0020.0002.1F074] # DOMINO TILE VERTICAL-02-03
+1F075 ; [*10B5.0020.0002.1F075] # DOMINO TILE VERTICAL-02-04
+1F076 ; [*10B6.0020.0002.1F076] # DOMINO TILE VERTICAL-02-05
+1F077 ; [*10B7.0020.0002.1F077] # DOMINO TILE VERTICAL-02-06
+1F078 ; [*10B8.0020.0002.1F078] # DOMINO TILE VERTICAL-03-00
+1F079 ; [*10B9.0020.0002.1F079] # DOMINO TILE VERTICAL-03-01
+1F07A ; [*10BA.0020.0002.1F07A] # DOMINO TILE VERTICAL-03-02
+1F07B ; [*10BB.0020.0002.1F07B] # DOMINO TILE VERTICAL-03-03
+1F07C ; [*10BC.0020.0002.1F07C] # DOMINO TILE VERTICAL-03-04
+1F07D ; [*10BD.0020.0002.1F07D] # DOMINO TILE VERTICAL-03-05
+1F07E ; [*10BE.0020.0002.1F07E] # DOMINO TILE VERTICAL-03-06
+1F07F ; [*10BF.0020.0002.1F07F] # DOMINO TILE VERTICAL-04-00
+1F080 ; [*10C0.0020.0002.1F080] # DOMINO TILE VERTICAL-04-01
+1F081 ; [*10C1.0020.0002.1F081] # DOMINO TILE VERTICAL-04-02
+1F082 ; [*10C2.0020.0002.1F082] # DOMINO TILE VERTICAL-04-03
+1F083 ; [*10C3.0020.0002.1F083] # DOMINO TILE VERTICAL-04-04
+1F084 ; [*10C4.0020.0002.1F084] # DOMINO TILE VERTICAL-04-05
+1F085 ; [*10C5.0020.0002.1F085] # DOMINO TILE VERTICAL-04-06
+1F086 ; [*10C6.0020.0002.1F086] # DOMINO TILE VERTICAL-05-00
+1F087 ; [*10C7.0020.0002.1F087] # DOMINO TILE VERTICAL-05-01
+1F088 ; [*10C8.0020.0002.1F088] # DOMINO TILE VERTICAL-05-02
+1F089 ; [*10C9.0020.0002.1F089] # DOMINO TILE VERTICAL-05-03
+1F08A ; [*10CA.0020.0002.1F08A] # DOMINO TILE VERTICAL-05-04
+1F08B ; [*10CB.0020.0002.1F08B] # DOMINO TILE VERTICAL-05-05
+1F08C ; [*10CC.0020.0002.1F08C] # DOMINO TILE VERTICAL-05-06
+1F08D ; [*10CD.0020.0002.1F08D] # DOMINO TILE VERTICAL-06-00
+1F08E ; [*10CE.0020.0002.1F08E] # DOMINO TILE VERTICAL-06-01
+1F08F ; [*10CF.0020.0002.1F08F] # DOMINO TILE VERTICAL-06-02
+1F090 ; [*10D0.0020.0002.1F090] # DOMINO TILE VERTICAL-06-03
+1F091 ; [*10D1.0020.0002.1F091] # DOMINO TILE VERTICAL-06-04
+1F092 ; [*10D2.0020.0002.1F092] # DOMINO TILE VERTICAL-06-05
+1F093 ; [*10D3.0020.0002.1F093] # DOMINO TILE VERTICAL-06-06
+0332 ; [.0000.0021.0002.0332] # COMBINING LOW LINE
+0313 ; [.0000.0022.0002.0313] # COMBINING COMMA ABOVE
+0343 ; [.0000.0022.0002.0343] # COMBINING GREEK KORONIS; QQC
+0486 ; [.0000.0022.0002.0486] # COMBINING CYRILLIC PSILI PNEUMATA; QQC
+2CF1 ; [.0000.0022.0002.2CF1] # COPTIC COMBINING SPIRITUS LENIS; QQC
+0314 ; [.0000.002A.0002.0314] # COMBINING REVERSED COMMA ABOVE
+0485 ; [.0000.002A.0002.0485] # COMBINING CYRILLIC DASIA PNEUMATA; QQC
+2CF0 ; [.0000.002A.0002.2CF0] # COPTIC COMBINING SPIRITUS ASPER; QQC
+0301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
+0341 ; [.0000.0032.0002.0341] # COMBINING ACUTE TONE MARK; QQC
+0954 ; [.0000.0032.0002.0954] # DEVANAGARI ACUTE ACCENT; QQC
+0300 ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT
+0340 ; [.0000.0035.0002.0340] # COMBINING GRAVE TONE MARK; QQC
+0953 ; [.0000.0035.0002.0953] # DEVANAGARI GRAVE ACCENT; QQC
+0306 ; [.0000.0037.0002.0306] # COMBINING BREVE
+0302 ; [.0000.003C.0002.0302] # COMBINING CIRCUMFLEX ACCENT
+030C ; [.0000.0041.0002.030C] # COMBINING CARON
+030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
+0342 ; [.0000.0045.0002.0342] # COMBINING GREEK PERISPOMENI
+0308 ; [.0000.0047.0002.0308] # COMBINING DIAERESIS
+0344 ; [.0000.0047.0002.0308][.0000.0032.0002.0301] # COMBINING GREEK DIALYTIKA TONOS; QQCM
+030B ; [.0000.004D.0002.030B] # COMBINING DOUBLE ACUTE ACCENT
+0303 ; [.0000.004E.0002.0303] # COMBINING TILDE
+0307 ; [.0000.0052.0002.0307] # COMBINING DOT ABOVE
+0338 ; [.0000.0054.0002.0338] # COMBINING LONG SOLIDUS OVERLAY
+0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
+0328 ; [.0000.0059.0002.0328] # COMBINING OGONEK
+0304 ; [.0000.005B.0002.0304] # COMBINING MACRON
+030D ; [.0000.005F.0002.030D] # COMBINING VERTICAL LINE ABOVE; QQC
+030E ; [.0000.005F.0002.030E] # COMBINING DOUBLE VERTICAL LINE ABOVE; QQC
+0312 ; [.0000.005F.0002.0312] # COMBINING TURNED COMMA ABOVE; QQC
+0315 ; [.0000.005F.0002.0315] # COMBINING COMMA ABOVE RIGHT; QQC
+031A ; [.0000.005F.0002.031A] # COMBINING LEFT ANGLE ABOVE; QQC
+033D ; [.0000.005F.0002.033D] # COMBINING X ABOVE; QQC
+033E ; [.0000.005F.0002.033E] # COMBINING VERTICAL TILDE; QQC
+033F ; [.0000.005F.0002.033F] # COMBINING DOUBLE OVERLINE; QQC
+0346 ; [.0000.005F.0002.0346] # COMBINING BRIDGE ABOVE; QQC
+034A ; [.0000.005F.0002.034A] # COMBINING NOT TILDE ABOVE; QQC
+034B ; [.0000.005F.0002.034B] # COMBINING HOMOTHETIC ABOVE; QQC
+034C ; [.0000.005F.0002.034C] # COMBINING ALMOST EQUAL TO ABOVE; QQC
+0350 ; [.0000.005F.0002.0350] # COMBINING RIGHT ARROWHEAD ABOVE; QQC
+0351 ; [.0000.005F.0002.0351] # COMBINING LEFT HALF RING ABOVE; QQC
+0352 ; [.0000.005F.0002.0352] # COMBINING FERMATA; QQC
+0357 ; [.0000.005F.0002.0357] # COMBINING RIGHT HALF RING ABOVE; QQC
+035B ; [.0000.005F.0002.035B] # COMBINING ZIGZAG ABOVE; QQC
+035D ; [.0000.005F.0002.035D] # COMBINING DOUBLE BREVE; QQC
+035E ; [.0000.005F.0002.035E] # COMBINING DOUBLE MACRON; QQC
+0484 ; [.0000.005F.0002.0484] # COMBINING CYRILLIC PALATALIZATION; QQC
+0487 ; [.0000.005F.0002.0487] # COMBINING CYRILLIC POKRYTIE; QQC
+0741 ; [.0000.005F.0002.0741] # SYRIAC QUSHSHAYA; QQC
+0745 ; [.0000.005F.0002.0745] # SYRIAC THREE DOTS ABOVE; QQC
+17CB ; [.0000.005F.0002.17CB] # KHMER SIGN BANTOC; QQC
+17CC ; [.0000.005F.0002.17CC] # KHMER SIGN ROBAT; QQC
+17CD ; [.0000.005F.0002.17CD] # KHMER SIGN TOANDAKHIAT; QQC
+17CE ; [.0000.005F.0002.17CE] # KHMER SIGN KAKABAT; QQC
+17CF ; [.0000.005F.0002.17CF] # KHMER SIGN AHSDA; QQC
+17D0 ; [.0000.005F.0002.17D0] # KHMER SIGN SAMYOK SANNYA; QQC
+17D1 ; [.0000.005F.0002.17D1] # KHMER SIGN VIRIAM; QQC
+17DD ; [.0000.005F.0002.17DD] # KHMER SIGN ATTHACAN; QQC
+1DC0 ; [.0000.005F.0002.1DC0] # COMBINING DOTTED GRAVE ACCENT; QQC
+1DC1 ; [.0000.005F.0002.1DC1] # COMBINING DOTTED ACUTE ACCENT; QQC
+1DC3 ; [.0000.005F.0002.1DC3] # COMBINING SUSPENSION MARK; QQC
+1DC4 ; [.0000.005F.0002.1DC4] # COMBINING MACRON-ACUTE; QQC
+1DC5 ; [.0000.005F.0002.1DC5] # COMBINING GRAVE-MACRON; QQC
+1DC6 ; [.0000.005F.0002.1DC6] # COMBINING MACRON-GRAVE; QQC
+1DC7 ; [.0000.005F.0002.1DC7] # COMBINING ACUTE-MACRON; QQC
+1DC8 ; [.0000.005F.0002.1DC8] # COMBINING GRAVE-ACUTE-GRAVE; QQC
+1DC9 ; [.0000.005F.0002.1DC9] # COMBINING ACUTE-GRAVE-ACUTE; QQC
+1DCB ; [.0000.005F.0002.1DCB] # COMBINING BREVE-MACRON; QQC
+1DCC ; [.0000.005F.0002.1DCC] # COMBINING MACRON-BREVE; QQC
+1DCD ; [.0000.005F.0002.1DCD] # COMBINING DOUBLE CIRCUMFLEX ABOVE; QQC
+1DCE ; [.0000.005F.0002.1DCE] # COMBINING OGONEK ABOVE; QQC
+1DD1 ; [.0000.005F.0002.1DD1] # COMBINING UR ABOVE; QQC
+1DFE ; [.0000.005F.0002.1DFE] # COMBINING LEFT ARROWHEAD ABOVE; QQC
+20F0 ; [.0000.005F.0002.20F0] # COMBINING ASTERISK ABOVE; QQC
+2CEF ; [.0000.005F.0002.2CEF] # COPTIC COMBINING NI ABOVE; QQC
+A67C ; [.0000.005F.0002.A67C] # COMBINING CYRILLIC KAVYKA; QQC
+A67D ; [.0000.005F.0002.A67D] # COMBINING CYRILLIC PAYEROK; QQC
+0316 ; [.0000.0060.0002.0316] # COMBINING GRAVE ACCENT BELOW; QQC
+0317 ; [.0000.0060.0002.0317] # COMBINING ACUTE ACCENT BELOW; QQC
+0318 ; [.0000.0060.0002.0318] # COMBINING LEFT TACK BELOW; QQC
+0319 ; [.0000.0060.0002.0319] # COMBINING RIGHT TACK BELOW; QQC
+031C ; [.0000.0060.0002.031C] # COMBINING LEFT HALF RING BELOW; QQC
+031D ; [.0000.0060.0002.031D] # COMBINING UP TACK BELOW; QQC
+031E ; [.0000.0060.0002.031E] # COMBINING DOWN TACK BELOW; QQC
+031F ; [.0000.0060.0002.031F] # COMBINING PLUS SIGN BELOW; QQC
+0320 ; [.0000.0060.0002.0320] # COMBINING MINUS SIGN BELOW; QQC
+0329 ; [.0000.0060.0002.0329] # COMBINING VERTICAL LINE BELOW; QQC
+032A ; [.0000.0060.0002.032A] # COMBINING BRIDGE BELOW; QQC
+032B ; [.0000.0060.0002.032B] # COMBINING INVERTED DOUBLE ARCH BELOW; QQC
+032C ; [.0000.0060.0002.032C] # COMBINING CARON BELOW; QQC
+032F ; [.0000.0060.0002.032F] # COMBINING INVERTED BREVE BELOW; QQC
+0333 ; [.0000.0060.0002.0333] # COMBINING DOUBLE LOW LINE; QQC
+033A ; [.0000.0060.0002.033A] # COMBINING INVERTED BRIDGE BELOW; QQC
+033B ; [.0000.0060.0002.033B] # COMBINING SQUARE BELOW; QQC
+033C ; [.0000.0060.0002.033C] # COMBINING SEAGULL BELOW; QQC
+0347 ; [.0000.0060.0002.0347] # COMBINING EQUALS SIGN BELOW; QQC
+0348 ; [.0000.0060.0002.0348] # COMBINING DOUBLE VERTICAL LINE BELOW; QQC
+0349 ; [.0000.0060.0002.0349] # COMBINING LEFT ANGLE BELOW; QQC
+034D ; [.0000.0060.0002.034D] # COMBINING LEFT RIGHT ARROW BELOW; QQC
+034E ; [.0000.0060.0002.034E] # COMBINING UPWARDS ARROW BELOW; QQC
+0353 ; [.0000.0060.0002.0353] # COMBINING X BELOW; QQC
+0354 ; [.0000.0060.0002.0354] # COMBINING LEFT ARROWHEAD BELOW; QQC
+0355 ; [.0000.0060.0002.0355] # COMBINING RIGHT ARROWHEAD BELOW; QQC
+0356 ; [.0000.0060.0002.0356] # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW; QQC
+0359 ; [.0000.0060.0002.0359] # COMBINING ASTERISK BELOW; QQC
+035A ; [.0000.0060.0002.035A] # COMBINING DOUBLE RING BELOW; QQC
+035C ; [.0000.0060.0002.035C] # COMBINING DOUBLE BREVE BELOW; QQC
+035F ; [.0000.0060.0002.035F] # COMBINING DOUBLE MACRON BELOW; QQC
+0362 ; [.0000.0060.0002.0362] # COMBINING DOUBLE RIGHTWARDS ARROW BELOW; QQC
+0742 ; [.0000.0060.0002.0742] # SYRIAC RUKKAKHA; QQC
+0746 ; [.0000.0060.0002.0746] # SYRIAC THREE DOTS BELOW; QQC
+1DC2 ; [.0000.0060.0002.1DC2] # COMBINING SNAKE BELOW; QQC
+1DCF ; [.0000.0060.0002.1DCF] # COMBINING ZIGZAG BELOW; QQC
+1DD0 ; [.0000.0060.0002.1DD0] # COMBINING IS BELOW; QQC
+1DFD ; [.0000.0060.0002.1DFD] # COMBINING ALMOST EQUAL TO BELOW; QQC
+1DFF ; [.0000.0060.0002.1DFF] # COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW; QQC
+20EC ; [.0000.0060.0002.20EC] # COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS; QQC
+20ED ; [.0000.0060.0002.20ED] # COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS; QQC
+20EE ; [.0000.0060.0002.20EE] # COMBINING LEFT ARROW BELOW; QQC
+20EF ; [.0000.0060.0002.20EF] # COMBINING RIGHT ARROW BELOW; QQC
+10A0D ; [.0000.0060.0002.10A0D] # KHAROSHTHI SIGN DOUBLE RING BELOW; QQC
+0336 ; [.0000.0061.0002.0336] # COMBINING LONG STROKE OVERLAY; QQC
+0337 ; [.0000.0061.0002.0337] # COMBINING SHORT SOLIDUS OVERLAY; QQC
+20D8 ; [.0000.0061.0002.20D8] # COMBINING RING OVERLAY; QQC
+20D9 ; [.0000.0061.0002.20D9] # COMBINING CLOCKWISE RING OVERLAY; QQC
+20DA ; [.0000.0061.0002.20DA] # COMBINING ANTICLOCKWISE RING OVERLAY; QQC
+20E5 ; [.0000.0061.0002.20E5] # COMBINING REVERSE SOLIDUS OVERLAY; QQC
+20EA ; [.0000.0061.0002.20EA] # COMBINING LEFTWARDS ARROW OVERLAY; QQC
+20EB ; [.0000.0061.0002.20EB] # COMBINING LONG DOUBLE SOLIDUS OVERLAY; QQC
+20DD ; [.0000.0062.0002.20DD] # COMBINING ENCLOSING CIRCLE; QQC
+20DE ; [.0000.0062.0002.20DE] # COMBINING ENCLOSING SQUARE; QQC
+20DF ; [.0000.0062.0002.20DF] # COMBINING ENCLOSING DIAMOND; QQC
+20E0 ; [.0000.0062.0002.20E0] # COMBINING ENCLOSING CIRCLE BACKSLASH; QQC
+20E2 ; [.0000.0062.0002.20E2] # COMBINING ENCLOSING SCREEN; QQC
+20E3 ; [.0000.0062.0002.20E3] # COMBINING ENCLOSING KEYCAP; QQC
+20E4 ; [.0000.0062.0002.20E4] # COMBINING ENCLOSING UPWARD POINTING TRIANGLE; QQC
+0305 ; [.0000.0063.0002.0305] # COMBINING OVERLINE
+0309 ; [.0000.0064.0002.0309] # COMBINING HOOK ABOVE
+030F ; [.0000.0065.0002.030F] # COMBINING DOUBLE GRAVE ACCENT
+0310 ; [.0000.0066.0002.0310] # COMBINING CANDRABINDU
+0311 ; [.0000.0067.0002.0311] # COMBINING INVERTED BREVE
+031B ; [.0000.0068.0002.031B] # COMBINING HORN
+0321 ; [.0000.006E.0002.0321] # COMBINING PALATALIZED HOOK BELOW
+0322 ; [.0000.006F.0002.0322] # COMBINING RETROFLEX HOOK BELOW
+0323 ; [.0000.0070.0002.0323] # COMBINING DOT BELOW
+0324 ; [.0000.0075.0002.0324] # COMBINING DIAERESIS BELOW
+0325 ; [.0000.0076.0002.0325] # COMBINING RING BELOW
+0326 ; [.0000.0077.0002.0326] # COMBINING COMMA BELOW
+032D ; [.0000.0078.0002.032D] # COMBINING CIRCUMFLEX ACCENT BELOW
+032E ; [.0000.0079.0002.032E] # COMBINING BREVE BELOW
+0330 ; [.0000.007A.0002.0330] # COMBINING TILDE BELOW
+0331 ; [.0000.007B.0002.0331] # COMBINING MACRON BELOW
+0334 ; [.0000.007C.0002.0334] # COMBINING TILDE OVERLAY
+0335 ; [.0000.007D.0002.0335] # COMBINING SHORT STROKE OVERLAY
+0339 ; [.0000.007E.0002.0339] # COMBINING RIGHT HALF RING BELOW
+0345 ; [.0000.007F.0002.0345] # COMBINING GREEK YPOGEGRAMMENI
+0358 ; [.0000.0080.0002.0358] # COMBINING DOT ABOVE RIGHT
+0360 ; [.0000.0081.0002.0360] # COMBINING DOUBLE TILDE
+FE22 ; [.0000.0081.0002.FE22] # COMBINING DOUBLE TILDE LEFT HALF; QQC
+0361 ; [.0000.0082.0002.0361] # COMBINING DOUBLE INVERTED BREVE
+FE20 ; [.0000.0082.0002.FE20] # COMBINING LIGATURE LEFT HALF; QQC
+0483 ; [.0000.0083.0002.0483] # COMBINING CYRILLIC TITLO
+A66F ; [.0000.0084.0002.A66F] # COMBINING CYRILLIC VZMET
+05B0 ; [.0000.0085.0002.05B0] # HEBREW POINT SHEVA
+05B1 ; [.0000.0086.0002.05B1] # HEBREW POINT HATAF SEGOL
+05B2 ; [.0000.0087.0002.05B2] # HEBREW POINT HATAF PATAH
+05B3 ; [.0000.0088.0002.05B3] # HEBREW POINT HATAF QAMATS
+05B4 ; [.0000.0089.0002.05B4] # HEBREW POINT HIRIQ
+05B5 ; [.0000.008A.0002.05B5] # HEBREW POINT TSERE
+05B6 ; [.0000.008B.0002.05B6] # HEBREW POINT SEGOL
+05B7 ; [.0000.008C.0002.05B7] # HEBREW POINT PATAH
+05B8 ; [.0000.008D.0002.05B8] # HEBREW POINT QAMATS
+05C7 ; [.0000.008D.0002.05C7] # HEBREW POINT QAMATS QATAN; QQC
+05B9 ; [.0000.008E.0002.05B9] # HEBREW POINT HOLAM
+05BA ; [.0000.008E.0002.05BA] # HEBREW POINT HOLAM HASER FOR VAV; QQC
+05BB ; [.0000.008F.0002.05BB] # HEBREW POINT QUBUTS
+05C2 ; [.0000.0090.0002.05C2] # HEBREW POINT SIN DOT
+05C1 ; [.0000.0091.0002.05C1] # HEBREW POINT SHIN DOT
+05BC ; [.0000.0092.0002.05BC] # HEBREW POINT DAGESH OR MAPIQ
+05BF ; [.0000.0095.0002.05BF] # HEBREW POINT RAFE
+FB1E ; [.0000.0096.0002.FB1E] # HEBREW POINT JUDEO-SPANISH VARIKA
+081C ; [.0000.0097.0002.081C] # SAMARITAN VOWEL SIGN LONG E; QQC
+081D ; [.0000.0097.0002.081D] # SAMARITAN VOWEL SIGN E
+081E ; [.0000.0098.0002.081E] # SAMARITAN VOWEL SIGN OVERLONG AA; QQC
+081F ; [.0000.0098.0002.081F] # SAMARITAN VOWEL SIGN LONG AA; QQC
+0820 ; [.0000.0098.0002.0820] # SAMARITAN VOWEL SIGN AA
+0821 ; [.0000.0099.0002.0821] # SAMARITAN VOWEL SIGN OVERLONG A; QQC
+0822 ; [.0000.0099.0002.0822] # SAMARITAN VOWEL SIGN LONG A; QQC
+0823 ; [.0000.0099.0002.0823] # SAMARITAN VOWEL SIGN A
+0824 ; [.0000.009A.0002.0824] # SAMARITAN MODIFIER LETTER SHORT A; QQC
+0825 ; [.0000.009A.0002.0825] # SAMARITAN VOWEL SIGN SHORT A
+0826 ; [.0000.009B.0002.0826] # SAMARITAN VOWEL SIGN LONG U; QQC
+0827 ; [.0000.009B.0002.0827] # SAMARITAN VOWEL SIGN U
+0828 ; [.0000.009C.0002.0828] # SAMARITAN MODIFIER LETTER I; QQC
+0829 ; [.0000.009C.0002.0829] # SAMARITAN VOWEL SIGN LONG I; QQC
+082A ; [.0000.009C.0002.082A] # SAMARITAN VOWEL SIGN I
+082B ; [.0000.009D.0002.082B] # SAMARITAN VOWEL SIGN O
+082C ; [.0000.009E.0002.082C] # SAMARITAN VOWEL SIGN SUKUN
+0818 ; [.0000.009F.0002.0818] # SAMARITAN MARK DAGESH
+0819 ; [.0000.00A0.0002.0819] # SAMARITAN MARK OCCLUSION
+082D ; [.0000.00A1.0002.082D] # SAMARITAN MARK NEQUDAA
+064B ; [.0000.00A2.0002.064B] # ARABIC FATHATAN
+FE71 ; [.0000.00A2.0018.FE71] # ARABIC TATWEEL WITH FATHATAN ABOVE; QQK
+FE70 ; [.0000.00A2.001A.FE70] # ARABIC FATHATAN ISOLATED FORM; QQK
+064C ; [.0000.00A3.0002.064C] # ARABIC DAMMATAN
+FE72 ; [.0000.00A3.001A.FE72] # ARABIC DAMMATAN ISOLATED FORM; QQK
+FC5E ; [.0000.00A3.001A.FC5E][.0000.00AD.001A.FC5E] # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM; QQKA
+064D ; [.0000.00A5.0002.064D] # ARABIC KASRATAN
+FE74 ; [.0000.00A5.001A.FE74] # ARABIC KASRATAN ISOLATED FORM; QQK
+FC5F ; [.0000.00A5.001A.FC5F][.0000.00AD.001A.FC5F] # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM; QQKA
+064E ; [.0000.00A7.0002.064E] # ARABIC FATHA
+FE77 ; [.0000.00A7.0018.FE77] # ARABIC FATHA MEDIAL FORM; QQK
+FE76 ; [.0000.00A7.001A.FE76] # ARABIC FATHA ISOLATED FORM; QQK
+FCF2 ; [.0000.00A7.0018.FCF2][.0000.00AD.0018.FCF2] # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM; QQKA
+FC60 ; [.0000.00A7.001A.FC60][.0000.00AD.001A.FC60] # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM; QQKA
+064F ; [.0000.00A9.0002.064F] # ARABIC DAMMA
+FE79 ; [.0000.00A9.0018.FE79] # ARABIC DAMMA MEDIAL FORM; QQK
+FE78 ; [.0000.00A9.001A.FE78] # ARABIC DAMMA ISOLATED FORM; QQK
+FCF3 ; [.0000.00A9.0018.FCF3][.0000.00AD.0018.FCF3] # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM; QQKA
+FC61 ; [.0000.00A9.001A.FC61][.0000.00AD.001A.FC61] # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM; QQKA
+0650 ; [.0000.00AB.0002.0650] # ARABIC KASRA
+FE7B ; [.0000.00AB.0018.FE7B] # ARABIC KASRA MEDIAL FORM; QQK
+FE7A ; [.0000.00AB.001A.FE7A] # ARABIC KASRA ISOLATED FORM; QQK
+FCF4 ; [.0000.00AB.0018.FCF4][.0000.00AD.0018.FCF4] # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM; QQKA
+FC62 ; [.0000.00AB.001A.FC62][.0000.00AD.001A.FC62] # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM; QQKA
+0651 ; [.0000.00AD.0002.0651] # ARABIC SHADDA
+FE7D ; [.0000.00AD.0018.FE7D] # ARABIC SHADDA MEDIAL FORM; QQK
+FE7C ; [.0000.00AD.001A.FE7C] # ARABIC SHADDA ISOLATED FORM; QQK
+FC63 ; [.0000.00AD.001A.FC63][.0000.00BC.001A.FC63] # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+0652 ; [.0000.00AF.0002.0652] # ARABIC SUKUN
+FE7F ; [.0000.00AF.0018.FE7F] # ARABIC SUKUN MEDIAL FORM; QQK
+FE7E ; [.0000.00AF.001A.FE7E] # ARABIC SUKUN ISOLATED FORM; QQK
+0653 ; [.0000.00B0.0002.0653] # ARABIC MADDAH ABOVE
+0654 ; [.0000.00B1.0002.0654] # ARABIC HAMZA ABOVE
+0655 ; [.0000.00B2.0002.0655] # ARABIC HAMZA BELOW
+0656 ; [.0000.00B3.0002.0656] # ARABIC SUBSCRIPT ALEF
+0657 ; [.0000.00B4.0002.0657] # ARABIC INVERTED DAMMA
+0658 ; [.0000.00B5.0002.0658] # ARABIC MARK NOON GHUNNA
+0659 ; [.0000.00B6.0002.0659] # ARABIC ZWARAKAY
+065A ; [.0000.00B7.0002.065A] # ARABIC VOWEL SIGN SMALL V ABOVE
+065B ; [.0000.00B8.0002.065B] # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+065C ; [.0000.00B9.0002.065C] # ARABIC VOWEL SIGN DOT BELOW
+065D ; [.0000.00BA.0002.065D] # ARABIC REVERSED DAMMA
+065E ; [.0000.00BB.0002.065E] # ARABIC FATHA WITH TWO DOTS
+0670 ; [.0000.00BC.0002.0670] # ARABIC LETTER SUPERSCRIPT ALEF
+0711 ; [.0000.00BD.0002.0711] # SYRIAC LETTER SUPERSCRIPT ALAPH
+0730 ; [.0000.00BE.0002.0730] # SYRIAC PTHAHA ABOVE
+0731 ; [.0000.00BF.0002.0731] # SYRIAC PTHAHA BELOW
+0732 ; [.0000.00C0.0002.0732] # SYRIAC PTHAHA DOTTED
+0733 ; [.0000.00C1.0002.0733] # SYRIAC ZQAPHA ABOVE
+0734 ; [.0000.00C2.0002.0734] # SYRIAC ZQAPHA BELOW
+0735 ; [.0000.00C3.0002.0735] # SYRIAC ZQAPHA DOTTED
+0736 ; [.0000.00C4.0002.0736] # SYRIAC RBASA ABOVE
+0737 ; [.0000.00C5.0002.0737] # SYRIAC RBASA BELOW
+0738 ; [.0000.00C6.0002.0738] # SYRIAC DOTTED ZLAMA HORIZONTAL
+0739 ; [.0000.00C7.0002.0739] # SYRIAC DOTTED ZLAMA ANGULAR
+073A ; [.0000.00C8.0002.073A] # SYRIAC HBASA ABOVE
+073B ; [.0000.00C9.0002.073B] # SYRIAC HBASA BELOW
+073C ; [.0000.00CA.0002.073C] # SYRIAC HBASA-ESASA DOTTED
+073D ; [.0000.00CB.0002.073D] # SYRIAC ESASA ABOVE
+073E ; [.0000.00CC.0002.073E] # SYRIAC ESASA BELOW
+073F ; [.0000.00CD.0002.073F] # SYRIAC RWAHA
+07EB ; [.0000.00CE.0002.07EB] # NKO COMBINING SHORT HIGH TONE
+07EC ; [.0000.00CF.0002.07EC] # NKO COMBINING SHORT LOW TONE
+07ED ; [.0000.00D0.0002.07ED] # NKO COMBINING SHORT RISING TONE
+07EE ; [.0000.00D1.0002.07EE] # NKO COMBINING LONG DESCENDING TONE
+07EF ; [.0000.00D2.0002.07EF] # NKO COMBINING LONG HIGH TONE
+07F0 ; [.0000.00D3.0002.07F0] # NKO COMBINING LONG LOW TONE
+07F1 ; [.0000.00D4.0002.07F1] # NKO COMBINING LONG RISING TONE
+07F2 ; [.0000.00D5.0002.07F2] # NKO COMBINING NASALIZATION MARK
+07F3 ; [.0000.00D6.0002.07F3] # NKO COMBINING DOUBLE DOT ABOVE
+135F ; [.0000.00D7.0002.135F] # ETHIOPIC COMBINING GEMINATION MARK
+A6F0 ; [.0000.00D8.0002.A6F0] # BAMUM COMBINING MARK KOQNDON
+A6F1 ; [.0000.00D9.0002.A6F1] # BAMUM COMBINING MARK TUKWENTIS
+093C ; [.0000.00DA.0002.093C] # DEVANAGARI SIGN NUKTA
+0900 ; [.0000.00DB.0002.0900] # DEVANAGARI SIGN INVERTED CANDRABINDU; QQC
+0901 ; [.0000.00DB.0002.0901] # DEVANAGARI SIGN CANDRABINDU
+0902 ; [.0000.00DC.0002.0902] # DEVANAGARI SIGN ANUSVARA
+1CED ; [.0000.00DC.0002.1CED] # VEDIC SIGN TIRYAK; QQC
+0903 ; [.0000.00DD.0002.0903] # DEVANAGARI SIGN VISARGA
+1CF2 ; [.0000.00DD.0002.1CF2] # VEDIC SIGN ARDHAVISARGA; QQC
+09BC ; [.0000.00DE.0002.09BC] # BENGALI SIGN NUKTA
+0981 ; [.0000.00DF.0002.0981] # BENGALI SIGN CANDRABINDU
+0982 ; [.0000.00E0.0002.0982] # BENGALI SIGN ANUSVARA
+0983 ; [.0000.00E1.0002.0983] # BENGALI SIGN VISARGA
+0A3C ; [.0000.00E2.0002.0A3C] # GURMUKHI SIGN NUKTA
+0A01 ; [.0000.00E3.0002.0A01] # GURMUKHI SIGN ADAK BINDI
+0A02 ; [.0000.00E4.0002.0A02] # GURMUKHI SIGN BINDI
+0A03 ; [.0000.00E5.0002.0A03] # GURMUKHI SIGN VISARGA
+0A70 ; [.0000.00E6.0002.0A70] # GURMUKHI TIPPI
+0A71 ; [.0000.00E7.0002.0A71] # GURMUKHI ADDAK
+0ABC ; [.0000.00E8.0002.0ABC] # GUJARATI SIGN NUKTA
+0A81 ; [.0000.00E9.0002.0A81] # GUJARATI SIGN CANDRABINDU
+0A82 ; [.0000.00EA.0002.0A82] # GUJARATI SIGN ANUSVARA
+0A83 ; [.0000.00EB.0002.0A83] # GUJARATI SIGN VISARGA
+0B3C ; [.0000.00EC.0002.0B3C] # ORIYA SIGN NUKTA
+0B01 ; [.0000.00ED.0002.0B01] # ORIYA SIGN CANDRABINDU
+0B02 ; [.0000.00EE.0002.0B02] # ORIYA SIGN ANUSVARA
+0B03 ; [.0000.00EF.0002.0B03] # ORIYA SIGN VISARGA
+0B82 ; [.0000.00F0.0002.0B82] # TAMIL SIGN ANUSVARA
+0C01 ; [.0000.00F1.0002.0C01] # TELUGU SIGN CANDRABINDU
+0C02 ; [.0000.00F2.0002.0C02] # TELUGU SIGN ANUSVARA
+0C03 ; [.0000.00F3.0002.0C03] # TELUGU SIGN VISARGA
+0CBC ; [.0000.00F4.0002.0CBC] # KANNADA SIGN NUKTA
+0C82 ; [.0000.00F5.0002.0C82] # KANNADA SIGN ANUSVARA
+0C83 ; [.0000.00F6.0002.0C83] # KANNADA SIGN VISARGA
+0D02 ; [.0000.00F7.0002.0D02] # MALAYALAM SIGN ANUSVARA
+0D03 ; [.0000.00F8.0002.0D03] # MALAYALAM SIGN VISARGA
+0D82 ; [.0000.00F9.0002.0D82] # SINHALA SIGN ANUSVARAYA
+0D83 ; [.0000.00FA.0002.0D83] # SINHALA SIGN VISARGAYA
+1B34 ; [.0000.00FB.0002.1B34] # BALINESE SIGN REREKAN
+1B00 ; [.0000.00FC.0002.1B00] # BALINESE SIGN ULU RICEM
+1B01 ; [.0000.00FD.0002.1B01] # BALINESE SIGN ULU CANDRA
+1B02 ; [.0000.00FE.0002.1B02] # BALINESE SIGN CECEK
+1B03 ; [.0000.00FF.0002.1B03] # BALINESE SIGN SURANG
+1B04 ; [.0000.0100.0002.1B04] # BALINESE SIGN BISAH
+A9B3 ; [.0000.0101.0002.A9B3] # JAVANESE SIGN CECAK TELU
+A980 ; [.0000.0102.0002.A980] # JAVANESE SIGN PANYANGGA
+A981 ; [.0000.0103.0002.A981] # JAVANESE SIGN CECAK
+A982 ; [.0000.0104.0002.A982] # JAVANESE SIGN LAYAR
+A983 ; [.0000.0105.0002.A983] # JAVANESE SIGN WIGNYAN
+1B80 ; [.0000.0106.0002.1B80] # SUNDANESE SIGN PANYECEK
+1B81 ; [.0000.0107.0002.1B81] # SUNDANESE SIGN PANGLAYAR
+1B82 ; [.0000.0108.0002.1B82] # SUNDANESE SIGN PANGWISAD
+ABEC ; [.0000.0109.0002.ABEC] # MEETEI MAYEK LUM IYEK
+A80B ; [.0000.010A.0002.A80B] # SYLOTI NAGRI SIGN ANUSVARA
+A880 ; [.0000.010B.0002.A880] # SAURASHTRA SIGN ANUSVARA
+A881 ; [.0000.010C.0002.A881] # SAURASHTRA SIGN VISARGA
+10A0E ; [.0000.010D.0002.10A0E] # KHAROSHTHI SIGN ANUSVARA
+10A0F ; [.0000.010E.0002.10A0F] # KHAROSHTHI SIGN VISARGA
+10A38 ; [.0000.010F.0002.10A38] # KHAROSHTHI SIGN BAR ABOVE
+10A39 ; [.0000.0110.0002.10A39] # KHAROSHTHI SIGN CAUDA
+10A3A ; [.0000.0111.0002.10A3A] # KHAROSHTHI SIGN DOT BELOW
+110BA ; [.0000.0112.0002.110BA] # KAITHI SIGN NUKTA
+11080 ; [.0000.0113.0002.11080] # KAITHI SIGN CANDRABINDU
+11081 ; [.0000.0114.0002.11081] # KAITHI SIGN ANUSVARA
+11082 ; [.0000.0115.0002.11082] # KAITHI SIGN VISARGA
+0E4E ; [.0000.0116.0002.0E4E] # THAI CHARACTER YAMAKKAN
+0E47 ; [.0000.0117.0002.0E47] # THAI CHARACTER MAITAIKHU
+0E48 ; [.0000.0118.0002.0E48] # THAI CHARACTER MAI EK
+0E49 ; [.0000.0119.0002.0E49] # THAI CHARACTER MAI THO
+0E4A ; [.0000.011A.0002.0E4A] # THAI CHARACTER MAI TRI
+0E4B ; [.0000.011B.0002.0E4B] # THAI CHARACTER MAI CHATTAWA
+0E4C ; [.0000.011C.0002.0E4C] # THAI CHARACTER THANTHAKHAT
+0E4D ; [.0000.011D.0002.0E4D] # THAI CHARACTER NIKHAHIT
+0EC8 ; [.0000.011E.0002.0EC8] # LAO TONE MAI EK
+0EC9 ; [.0000.011F.0002.0EC9] # LAO TONE MAI THO
+0ECA ; [.0000.0120.0002.0ECA] # LAO TONE MAI TI
+0ECB ; [.0000.0121.0002.0ECB] # LAO TONE MAI CATAWA
+0ECC ; [.0000.0122.0002.0ECC] # LAO CANCELLATION MARK
+0ECD ; [.0000.0123.0002.0ECD] # LAO NIGGAHITA
+AABF ; [.0000.0124.0002.AABF] # TAI VIET TONE MAI EK
+AAC1 ; [.0000.0125.0002.AAC1] # TAI VIET TONE MAI THO
+0F39 ; [.0000.0126.0002.0F39] # TIBETAN MARK TSA -PHRU
+0F7E ; [.0000.0127.0002.0F7E] # TIBETAN SIGN RJES SU NGA RO
+0F7F ; [.0000.0128.0002.0F7F] # TIBETAN SIGN RNAM BCAD
+1C37 ; [.0000.0129.0002.1C37] # LEPCHA SIGN NUKTA
+A92B ; [.0000.012A.0002.A92B] # KAYAH LI TONE PLOPHU
+A92C ; [.0000.012B.0002.A92C] # KAYAH LI TONE CALYA
+A92D ; [.0000.012C.0002.A92D] # KAYAH LI TONE CALYA PLOPHU
+1036 ; [.0000.012D.0002.1036] # MYANMAR SIGN ANUSVARA
+1037 ; [.0000.012E.0002.1037] # MYANMAR SIGN DOT BELOW
+1038 ; [.0000.012F.0002.1038] # MYANMAR SIGN VISARGA
+108D ; [.0000.0130.0002.108D] # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+17C6 ; [.0000.0131.0002.17C6] # KHMER SIGN NIKAHIT
+17C7 ; [.0000.0132.0002.17C7] # KHMER SIGN REAHMUK
+17C8 ; [.0000.0133.0002.17C8] # KHMER SIGN YUUKALEAPINTU
+17C9 ; [.0000.0134.0002.17C9] # KHMER SIGN MUUSIKATOAN
+17CA ; [.0000.0135.0002.17CA] # KHMER SIGN TRIISAP
+1A74 ; [.0000.0136.0002.1A74] # TAI THAM SIGN MAI KANG
+1A75 ; [.0000.0137.0002.1A75] # TAI THAM SIGN TONE-1
+1A76 ; [.0000.0138.0002.1A76] # TAI THAM SIGN TONE-2
+1A77 ; [.0000.0139.0002.1A77] # TAI THAM SIGN KHUEN TONE-3
+1A78 ; [.0000.013A.0002.1A78] # TAI THAM SIGN KHUEN TONE-4
+1A79 ; [.0000.013B.0002.1A79] # TAI THAM SIGN KHUEN TONE-5
+1A7A ; [.0000.013C.0002.1A7A] # TAI THAM SIGN RA HAAM
+1A7B ; [.0000.013D.0002.1A7B] # TAI THAM SIGN MAI SAM
+1A7C ; [.0000.013E.0002.1A7C] # TAI THAM SIGN KHUEN-LUE KARAN
+1939 ; [.0000.013F.0002.1939] # LIMBU SIGN MUKPHRENG
+193A ; [.0000.0140.0002.193A] # LIMBU SIGN KEMPHRENG
+193B ; [.0000.0141.0002.193B] # LIMBU SIGN SA-I
+302A ; [.0000.0142.0002.302A] # IDEOGRAPHIC LEVEL TONE MARK
+302B ; [.0000.0143.0002.302B] # IDEOGRAPHIC RISING TONE MARK
+302C ; [.0000.0144.0002.302C] # IDEOGRAPHIC DEPARTING TONE MARK
+302D ; [.0000.0145.0002.302D] # IDEOGRAPHIC ENTERING TONE MARK
+302E ; [.0000.0146.0002.302E] # HANGUL SINGLE DOT TONE MARK
+302F ; [.0000.0147.0002.302F] # HANGUL DOUBLE DOT TONE MARK
+3099 ; [.0000.0148.0002.3099] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+FF9E ; [.0000.0148.0012.FF9E] # HALFWIDTH KATAKANA VOICED SOUND MARK; QQK
+309A ; [.0000.0149.0002.309A] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FF9F ; [.0000.0149.0012.FF9F] # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK; QQK
+20D0 ; [.0000.014A.0002.20D0] # COMBINING LEFT HARPOON ABOVE
+20D1 ; [.0000.014B.0002.20D1] # COMBINING RIGHT HARPOON ABOVE
+20D2 ; [.0000.014C.0002.20D2] # COMBINING LONG VERTICAL LINE OVERLAY
+20D3 ; [.0000.014C.0002.20D3] # COMBINING SHORT VERTICAL LINE OVERLAY; QQC
+20D4 ; [.0000.014D.0002.20D4] # COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5 ; [.0000.014E.0002.20D5] # COMBINING CLOCKWISE ARROW ABOVE
+20D6 ; [.0000.014F.0002.20D6] # COMBINING LEFT ARROW ABOVE
+20D7 ; [.0000.0150.0002.20D7] # COMBINING RIGHT ARROW ABOVE
+20DB ; [.0000.0151.0002.20DB] # COMBINING THREE DOTS ABOVE
+20DC ; [.0000.0152.0002.20DC] # COMBINING FOUR DOTS ABOVE
+20E1 ; [.0000.0153.0002.20E1] # COMBINING LEFT RIGHT ARROW ABOVE
+20E6 ; [.0000.0154.0002.20E6] # COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7 ; [.0000.0155.0002.20E7] # COMBINING ANNUITY SYMBOL
+20E8 ; [.0000.0156.0002.20E8] # COMBINING TRIPLE UNDERDOT
+20E9 ; [.0000.0157.0002.20E9] # COMBINING WIDE BRIDGE ABOVE
+101FD ; [.0000.0158.0002.101FD] # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+02D0 ; [.11CE.0020.0002.02D0] # MODIFIER LETTER TRIANGULAR COLON
+02D1 ; [.11CF.0020.0002.02D1] # MODIFIER LETTER HALF TRIANGULAR COLON
+0971 ; [.11D0.0020.0002.0971] # DEVANAGARI SIGN HIGH SPACING DOT
+0E46 ; [.11D1.0020.0002.0E46] # THAI CHARACTER MAIYAMOK
+0EC6 ; [.11D2.0020.0002.0EC6] # LAO KO LA
+1AA7 ; [.11D3.0020.0002.1AA7] # TAI THAM SIGN MAI YAMOK
+A9CF ; [.11D4.0020.0002.A9CF] # JAVANESE PANGRANGKEP
+AA70 ; [.11D5.0020.0002.AA70] # MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AADD ; [.11D6.0020.0002.AADD] # TAI VIET SYMBOL SAM
+3005 ; [.11D7.0020.0002.3005] # IDEOGRAPHIC ITERATION MARK
+303B ; [.11D8.0020.0002.303B] # VERTICAL IDEOGRAPHIC ITERATION MARK
+3031 ; [.11D9.0020.0002.3031] # VERTICAL KANA REPEAT MARK
+3032 ; [.11D9.0020.0002.3031][.0000.0148.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK; QQCM
+3033 ; [.11DA.0020.0002.3033] # VERTICAL KANA REPEAT MARK UPPER HALF
+3034 ; [.11DA.0020.0002.3033][.0000.0148.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF; QQCM
+3035 ; [.11DB.0020.0002.3035] # VERTICAL KANA REPEAT MARK LOWER HALF
+309D ; [.11DC.0020.0002.309D] # HIRAGANA ITERATION MARK
+309E ; [.11DC.0020.0002.309D][.0000.0148.0002.3099] # HIRAGANA VOICED ITERATION MARK; QQCM
+30FC ; [.11DD.0020.0002.30FC] # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF70 ; [.11DD.0020.0012.FF70] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK; QQK
+30FD ; [.11DE.0020.0002.30FD] # KATAKANA ITERATION MARK
+30FE ; [.11DE.0020.0002.30FD][.0000.0148.0002.3099] # KATAKANA VOICED ITERATION MARK; QQCM
+00A4 ; [.11DF.0020.0002.00A4] # CURRENCY SIGN
+00A2 ; [.11E0.0020.0002.00A2] # CENT SIGN
+FFE0 ; [.11E0.0020.0003.FFE0] # FULLWIDTH CENT SIGN; QQK
+0024 ; [.11E1.0020.0002.0024] # DOLLAR SIGN
+FF04 ; [.11E1.0020.0003.FF04] # FULLWIDTH DOLLAR SIGN; QQK
+FE69 ; [.11E1.0020.000F.FE69] # SMALL DOLLAR SIGN; QQK
+00A3 ; [.11E2.0020.0002.00A3] # POUND SIGN
+FFE1 ; [.11E2.0020.0003.FFE1] # FULLWIDTH POUND SIGN; QQK
+00A5 ; [.11E3.0020.0002.00A5] # YEN SIGN
+FFE5 ; [.11E3.0020.0003.FFE5] # FULLWIDTH YEN SIGN; QQK
+060B ; [.11E4.0020.0002.060B] # AFGHANI SIGN
+09F2 ; [.11E5.0020.0002.09F2] # BENGALI RUPEE MARK
+09F3 ; [.11E6.0020.0002.09F3] # BENGALI RUPEE SIGN
+09FB ; [.11E7.0020.0002.09FB] # BENGALI GANDA MARK
+0AF1 ; [.11E8.0020.0002.0AF1] # GUJARATI RUPEE SIGN
+A838 ; [.11E9.0020.0002.A838] # NORTH INDIC RUPEE MARK
+0BF9 ; [.11EA.0020.0002.0BF9] # TAMIL RUPEE SIGN
+0E3F ; [.11EB.0020.0002.0E3F] # THAI CURRENCY SYMBOL BAHT
+17DB ; [.11EC.0020.0002.17DB] # KHMER CURRENCY SYMBOL RIEL
+20A0 ; [.11ED.0020.0002.20A0] # EURO-CURRENCY SIGN
+20A1 ; [.11EE.0020.0002.20A1] # COLON SIGN
+20A2 ; [.11EF.0020.0002.20A2] # CRUZEIRO SIGN
+20A3 ; [.11F0.0020.0002.20A3] # FRENCH FRANC SIGN
+20A4 ; [.11F1.0020.0002.20A4] # LIRA SIGN
+20A5 ; [.11F2.0020.0002.20A5] # MILL SIGN
+20A6 ; [.11F3.0020.0002.20A6] # NAIRA SIGN
+20A7 ; [.11F4.0020.0002.20A7] # PESETA SIGN
+20A9 ; [.11F5.0020.0002.20A9] # WON SIGN
+FFE6 ; [.11F5.0020.0003.FFE6] # FULLWIDTH WON SIGN; QQK
+20AA ; [.11F6.0020.0002.20AA] # NEW SHEQEL SIGN
+20AB ; [.11F7.0020.0002.20AB] # DONG SIGN
+20AC ; [.11F8.0020.0002.20AC] # EURO SIGN
+20AD ; [.11F9.0020.0002.20AD] # KIP SIGN
+20AE ; [.11FA.0020.0002.20AE] # TUGRIK SIGN
+20AF ; [.11FB.0020.0002.20AF] # DRACHMA SIGN
+20B0 ; [.11FC.0020.0002.20B0] # GERMAN PENNY SIGN
+20B1 ; [.11FD.0020.0002.20B1] # PESO SIGN
+20B2 ; [.11FE.0020.0002.20B2] # GUARANI SIGN
+20B3 ; [.11FF.0020.0002.20B3] # AUSTRAL SIGN
+20B4 ; [.1200.0020.0002.20B4] # HRYVNIA SIGN
+20B5 ; [.1201.0020.0002.20B5] # CEDI SIGN
+20B6 ; [.1202.0020.0002.20B6] # LIVRE TOURNOIS SIGN
+20B7 ; [.1203.0020.0002.20B7] # SPESMILO SIGN
+20B8 ; [.1204.0020.0002.20B8] # TENGE SIGN
+0030 ; [.1205.0020.0002.0030] # DIGIT ZERO
+FF10 ; [.1205.0020.0003.FF10] # FULLWIDTH DIGIT ZERO; QQK
+1F100 ; [.1205.0020.0004.1F100][*0281.0020.0004.1F100] # DIGIT ZERO FULL STOP; QQKN
+1F101 ; [.1205.0020.0004.1F101][*0234.0020.0004.1F101] # DIGIT ZERO COMMA; QQKN
+1D7CE ; [.1205.0020.0005.1D7CE] # MATHEMATICAL BOLD DIGIT ZERO; QQK
+1D7D8 ; [.1205.0020.0005.1D7D8] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO; QQK
+1D7E2 ; [.1205.0020.0005.1D7E2] # MATHEMATICAL SANS-SERIF DIGIT ZERO; QQK
+1D7EC ; [.1205.0020.0005.1D7EC] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO; QQK
+1D7F6 ; [.1205.0020.0005.1D7F6] # MATHEMATICAL MONOSPACE DIGIT ZERO; QQK
+24EA ; [.1205.0020.0006.24EA] # CIRCLED DIGIT ZERO; QQK
+24FF ; [.1205.0020.0006.24FF] # NEGATIVE CIRCLED DIGIT ZERO; QQK
+2070 ; [.1205.0020.0014.2070] # SUPERSCRIPT ZERO; QQK
+2080 ; [.1205.0020.0015.2080] # SUBSCRIPT ZERO; QQK
+0660 ; [.1205.0020.0002.0660][.0000.015F.0002.0660] # ARABIC-INDIC DIGIT ZERO
+06F0 ; [.1205.0020.0002.06F0][.0000.0160.0002.06F0] # EXTENDED ARABIC-INDIC DIGIT ZERO
+07C0 ; [.1205.0020.0002.07C0][.0000.0162.0002.07C0] # NKO DIGIT ZERO
+104A0 ; [.1205.0020.0002.104A0][.0000.0164.0002.104A0] # OSMANYA DIGIT ZERO
+0966 ; [.1205.0020.0002.0966][.0000.0165.0002.0966] # DEVANAGARI DIGIT ZERO
+09E6 ; [.1205.0020.0002.09E6][.0000.0166.0002.09E6] # BENGALI DIGIT ZERO
+0A66 ; [.1205.0020.0002.0A66][.0000.0167.0002.0A66] # GURMUKHI DIGIT ZERO
+0AE6 ; [.1205.0020.0002.0AE6][.0000.0168.0002.0AE6] # GUJARATI DIGIT ZERO
+0B66 ; [.1205.0020.0002.0B66][.0000.0169.0002.0B66] # ORIYA DIGIT ZERO
+0BE6 ; [.1205.0020.0002.0BE6][.0000.016A.0002.0BE6] # TAMIL DIGIT ZERO
+0C66 ; [.1205.0020.0002.0C66][.0000.016B.0002.0C66] # TELUGU DIGIT ZERO
+0C78 ; [.1205.0020.0002.0C78][.0000.016B.0002.0C78] # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR
+0CE6 ; [.1205.0020.0002.0CE6][.0000.016C.0002.0CE6] # KANNADA DIGIT ZERO
+0D66 ; [.1205.0020.0002.0D66][.0000.016D.0002.0D66] # MALAYALAM DIGIT ZERO
+ABF0 ; [.1205.0020.0002.ABF0][.0000.016E.0002.ABF0] # MEETEI MAYEK DIGIT ZERO
+A8D0 ; [.1205.0020.0002.A8D0][.0000.016F.0002.A8D0] # SAURASHTRA DIGIT ZERO
+1946 ; [.1205.0020.0002.1946][.0000.0170.0002.1946] # LIMBU DIGIT ZERO
+19D0 ; [.1205.0020.0002.19D0][.0000.0171.0002.19D0] # NEW TAI LUE DIGIT ZERO
+1A80 ; [.1205.0020.0002.1A80][.0000.0173.0002.1A80] # TAI THAM HORA DIGIT ZERO
+1A90 ; [.1205.0020.0002.1A90][.0000.0174.0002.1A90] # TAI THAM THAM DIGIT ZERO
+0E50 ; [.1205.0020.0002.0E50][.0000.0175.0002.0E50] # THAI DIGIT ZERO
+0ED0 ; [.1205.0020.0002.0ED0][.0000.0176.0002.0ED0] # LAO DIGIT ZERO
+0F20 ; [.1205.0020.0002.0F20][.0000.0177.0002.0F20] # TIBETAN DIGIT ZERO
+0F33 ; [.1205.0020.0004.0F33][.0000.0177.0004.0F33] # TIBETAN DIGIT HALF ZERO; QQK
+1C40 ; [.1205.0020.0002.1C40][.0000.0178.0002.1C40] # LEPCHA DIGIT ZERO
+A900 ; [.1205.0020.0002.A900][.0000.0179.0002.A900] # KAYAH LI DIGIT ZERO
+1040 ; [.1205.0020.0002.1040][.0000.017A.0002.1040] # MYANMAR DIGIT ZERO
+1090 ; [.1205.0020.0002.1090][.0000.017B.0002.1090] # MYANMAR SHAN DIGIT ZERO
+17E0 ; [.1205.0020.0002.17E0][.0000.017C.0002.17E0] # KHMER DIGIT ZERO
+17F0 ; [.1205.0020.0002.17F0][.0000.017D.0002.17F0] # KHMER SYMBOL LEK ATTAK SON
+AA50 ; [.1205.0020.0002.AA50][.0000.017E.0002.AA50] # CHAM DIGIT ZERO
+1B50 ; [.1205.0020.0002.1B50][.0000.017F.0002.1B50] # BALINESE DIGIT ZERO
+A9D0 ; [.1205.0020.0002.A9D0][.0000.0180.0002.A9D0] # JAVANESE DIGIT ZERO
+1BB0 ; [.1205.0020.0002.1BB0][.0000.0181.0002.1BB0] # SUNDANESE DIGIT ZERO
+1810 ; [.1205.0020.0002.1810][.0000.0182.0002.1810] # MONGOLIAN DIGIT ZERO
+1C50 ; [.1205.0020.0002.1C50][.0000.0183.0002.1C50] # OL CHIKI DIGIT ZERO
+A620 ; [.1205.0020.0002.A620][.0000.0184.0002.A620] # VAI DIGIT ZERO
+3007 ; [.1205.0020.0002.3007][.0000.0185.0002.3007] # IDEOGRAPHIC NUMBER ZERO
+1018A ; [.1205.0020.0002.1018A][.0000.0187.0002.1018A] # GREEK ZERO SIGN
+2189 ; [.1205.0020.001E.2189][*035D.0020.001E.2189][.1208.0020.001F.2189] # VULGAR FRACTION ZERO THIRDS; QQKN
+3358 ; [.1205.0020.0004.3358][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO; QQKN
+0031 ; [.1206.0020.0002.0031] # DIGIT ONE
+FF11 ; [.1206.0020.0003.FF11] # FULLWIDTH DIGIT ONE; QQK
+2474 ; [*02FF.0020.0004.2474][.1206.0020.0004.2474][*0300.0020.001F.2474] # PARENTHESIZED DIGIT ONE; QQKN
+2488 ; [.1206.0020.0004.2488][*0281.0020.0004.2488] # DIGIT ONE FULL STOP; QQKN
+1F102 ; [.1206.0020.0004.1F102][*0234.0020.0004.1F102] # DIGIT ONE COMMA; QQKN
+1D7CF ; [.1206.0020.0005.1D7CF] # MATHEMATICAL BOLD DIGIT ONE; QQK
+1D7D9 ; [.1206.0020.0005.1D7D9] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE; QQK
+1D7E3 ; [.1206.0020.0005.1D7E3] # MATHEMATICAL SANS-SERIF DIGIT ONE; QQK
+1D7ED ; [.1206.0020.0005.1D7ED] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE; QQK
+1D7F7 ; [.1206.0020.0005.1D7F7] # MATHEMATICAL MONOSPACE DIGIT ONE; QQK
+2460 ; [.1206.0020.0006.2460] # CIRCLED DIGIT ONE; QQK
+24F5 ; [.1206.0020.0006.24F5] # DOUBLE CIRCLED DIGIT ONE; QQK
+2776 ; [.1206.0020.0006.2776] # DINGBAT NEGATIVE CIRCLED DIGIT ONE; QQK
+2780 ; [.1206.0020.0006.2780] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE; QQK
+278A ; [.1206.0020.0006.278A] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE; QQK
+00B9 ; [.1206.0020.0014.00B9] # SUPERSCRIPT ONE; QQK
+2081 ; [.1206.0020.0015.2081] # SUBSCRIPT ONE; QQK
+215F ; [.1206.0020.001E.215F][*035D.0020.001E.215F] # FRACTION NUMERATOR ONE; QQKN
+0661 ; [.1206.0020.0002.0661][.0000.015F.0002.0661] # ARABIC-INDIC DIGIT ONE
+06F1 ; [.1206.0020.0002.06F1][.0000.0160.0002.06F1] # EXTENDED ARABIC-INDIC DIGIT ONE
+10E60 ; [.1206.0020.0002.10E60][.0000.0161.0002.10E60] # RUMI DIGIT ONE
+07C1 ; [.1206.0020.0002.07C1][.0000.0162.0002.07C1] # NKO DIGIT ONE
+1369 ; [.1206.0020.0002.1369][.0000.0163.0002.1369] # ETHIOPIC DIGIT ONE
+104A1 ; [.1206.0020.0002.104A1][.0000.0164.0002.104A1] # OSMANYA DIGIT ONE
+0967 ; [.1206.0020.0002.0967][.0000.0165.0002.0967] # DEVANAGARI DIGIT ONE
+09E7 ; [.1206.0020.0002.09E7][.0000.0166.0002.09E7] # BENGALI DIGIT ONE
+0A67 ; [.1206.0020.0002.0A67][.0000.0167.0002.0A67] # GURMUKHI DIGIT ONE
+0AE7 ; [.1206.0020.0002.0AE7][.0000.0168.0002.0AE7] # GUJARATI DIGIT ONE
+0B67 ; [.1206.0020.0002.0B67][.0000.0169.0002.0B67] # ORIYA DIGIT ONE
+0BE7 ; [.1206.0020.0002.0BE7][.0000.016A.0002.0BE7] # TAMIL DIGIT ONE
+0C67 ; [.1206.0020.0002.0C67][.0000.016B.0002.0C67] # TELUGU DIGIT ONE
+0C79 ; [.1206.0020.0002.0C79][.0000.016B.0002.0C79] # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR
+0C7C ; [.1206.0020.0002.0C7C][.0000.016B.0002.0C7C] # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR
+0CE7 ; [.1206.0020.0002.0CE7][.0000.016C.0002.0CE7] # KANNADA DIGIT ONE
+0D67 ; [.1206.0020.0002.0D67][.0000.016D.0002.0D67] # MALAYALAM DIGIT ONE
+ABF1 ; [.1206.0020.0002.ABF1][.0000.016E.0002.ABF1] # MEETEI MAYEK DIGIT ONE
+A8D1 ; [.1206.0020.0002.A8D1][.0000.016F.0002.A8D1] # SAURASHTRA DIGIT ONE
+1947 ; [.1206.0020.0002.1947][.0000.0170.0002.1947] # LIMBU DIGIT ONE
+19D1 ; [.1206.0020.0002.19D1][.0000.0171.0002.19D1] # NEW TAI LUE DIGIT ONE
+19DA ; [.1206.0020.0002.19DA][.0000.0172.0002.19DA] # NEW TAI LUE THAM DIGIT ONE
+1A81 ; [.1206.0020.0002.1A81][.0000.0173.0002.1A81] # TAI THAM HORA DIGIT ONE
+1A91 ; [.1206.0020.0002.1A91][.0000.0174.0002.1A91] # TAI THAM THAM DIGIT ONE
+0E51 ; [.1206.0020.0002.0E51][.0000.0175.0002.0E51] # THAI DIGIT ONE
+0ED1 ; [.1206.0020.0002.0ED1][.0000.0176.0002.0ED1] # LAO DIGIT ONE
+0F21 ; [.1206.0020.0002.0F21][.0000.0177.0002.0F21] # TIBETAN DIGIT ONE
+0F2A ; [.1206.0020.0004.0F2A][.0000.0177.0004.0F2A] # TIBETAN DIGIT HALF ONE; QQK
+1C41 ; [.1206.0020.0002.1C41][.0000.0178.0002.1C41] # LEPCHA DIGIT ONE
+A901 ; [.1206.0020.0002.A901][.0000.0179.0002.A901] # KAYAH LI DIGIT ONE
+1041 ; [.1206.0020.0002.1041][.0000.017A.0002.1041] # MYANMAR DIGIT ONE
+1091 ; [.1206.0020.0002.1091][.0000.017B.0002.1091] # MYANMAR SHAN DIGIT ONE
+17E1 ; [.1206.0020.0002.17E1][.0000.017C.0002.17E1] # KHMER DIGIT ONE
+17F1 ; [.1206.0020.0002.17F1][.0000.017D.0002.17F1] # KHMER SYMBOL LEK ATTAK MUOY
+AA51 ; [.1206.0020.0002.AA51][.0000.017E.0002.AA51] # CHAM DIGIT ONE
+1B51 ; [.1206.0020.0002.1B51][.0000.017F.0002.1B51] # BALINESE DIGIT ONE
+A9D1 ; [.1206.0020.0002.A9D1][.0000.0180.0002.A9D1] # JAVANESE DIGIT ONE
+1BB1 ; [.1206.0020.0002.1BB1][.0000.0181.0002.1BB1] # SUNDANESE DIGIT ONE
+1811 ; [.1206.0020.0002.1811][.0000.0182.0002.1811] # MONGOLIAN DIGIT ONE
+1C51 ; [.1206.0020.0002.1C51][.0000.0183.0002.1C51] # OL CHIKI DIGIT ONE
+A621 ; [.1206.0020.0002.A621][.0000.0184.0002.A621] # VAI DIGIT ONE
+3021 ; [.1206.0020.0002.3021][.0000.0185.0002.3021] # HANGZHOU NUMERAL ONE
+10107 ; [.1206.0020.0002.10107][.0000.0186.0002.10107] # AEGEAN NUMBER ONE
+10142 ; [.1206.0020.0002.10142][.0000.0187.0002.10142] # GREEK ACROPHONIC ATTIC ONE DRACHMA
+10158 ; [.1206.0020.0002.10158][.0000.0187.0002.10158] # GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159 ; [.1206.0020.0002.10159][.0000.0187.0002.10159] # GREEK ACROPHONIC THESPIAN ONE
+1015A ; [.1206.0020.0002.1015A][.0000.0187.0002.1015A] # GREEK ACROPHONIC HERMIONIAN ONE
+10320 ; [.1206.0020.0002.10320][.0000.0189.0002.10320] # OLD ITALIC NUMERAL ONE
+103D1 ; [.1206.0020.0002.103D1][.0000.018A.0002.103D1] # OLD PERSIAN NUMBER ONE
+12415 ; [.1206.0020.0002.12415][.0000.018B.0002.12415] # CUNEIFORM NUMERIC SIGN ONE GESH2
+1241E ; [.1206.0020.0002.1241E][.0000.018B.0002.1241E] # CUNEIFORM NUMERIC SIGN ONE GESHU
+1242C ; [.1206.0020.0002.1242C][.0000.018B.0002.1242C] # CUNEIFORM NUMERIC SIGN ONE SHARU
+12434 ; [.1206.0020.0002.12434][.0000.018B.0002.12434] # CUNEIFORM NUMERIC SIGN ONE BURU
+1244F ; [.1206.0020.0002.1244F][.0000.018B.0002.1244F] # CUNEIFORM NUMERIC SIGN ONE BAN2
+12458 ; [.1206.0020.0002.12458][.0000.018B.0002.12458] # CUNEIFORM NUMERIC SIGN ONE ESHE3
+10A7D ; [.1206.0020.0002.10A7D][.0000.018C.0002.10A7D] # OLD SOUTH ARABIAN NUMBER ONE
+10916 ; [.1206.0020.0002.10916][.0000.018D.0002.10916] # PHOENICIAN NUMBER ONE
+10858 ; [.1206.0020.0002.10858][.0000.018E.0002.10858] # IMPERIAL ARAMAIC NUMBER ONE
+10B58 ; [.1206.0020.0002.10B58][.0000.018F.0002.10B58] # INSCRIPTIONAL PARTHIAN NUMBER ONE
+10B78 ; [.1206.0020.0002.10B78][.0000.0190.0002.10B78] # INSCRIPTIONAL PAHLAVI NUMBER ONE
+10A40 ; [.1206.0020.0002.10A40][.0000.0191.0002.10A40] # KHAROSHTHI DIGIT ONE
+1D360 ; [.1206.0020.0002.1D360][.0000.0192.0002.1D360] # COUNTING ROD UNIT DIGIT ONE
+2491 ; [.1206.0020.0004.2491][.1205.0020.0004.2491][*0281.0020.001F.2491] # NUMBER TEN FULL STOP; QQKN
+247D ; [*02FF.0020.0004.247D][.1206.0020.0004.247D][.1205.0020.001F.247D][*0300.0020.001F.247D] # PARENTHESIZED NUMBER TEN; QQKN
+2469 ; [.1206.0020.0006.2469][.1205.0020.0006.2469] # CIRCLED NUMBER TEN; QQKN
+24FE ; [.1206.0020.0006.24FE][.1205.0020.0006.24FE] # DOUBLE CIRCLED NUMBER TEN; QQKN
+277F ; [.1206.0020.0006.277F][.1205.0020.0006.277F] # DINGBAT NEGATIVE CIRCLED NUMBER TEN; QQKN
+2789 ; [.1206.0020.0006.2789][.1205.0020.0006.2789] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN; QQKN
+2793 ; [.1206.0020.0006.2793][.1205.0020.0006.2793] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN; QQKN
+3248 ; [.1206.0020.0006.3248][.1205.0020.0006.3248] # CIRCLED NUMBER TEN ON BLACK SQUARE; QQKN
+33E9 ; [.1206.0020.0004.33E9][.1205.0020.0004.33E9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN; QQKN
+32C9 ; [.1206.0020.0004.32C9][.1205.0020.0004.32C9][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER; QQKN
+3362 ; [.1206.0020.0004.3362][.1205.0020.0004.3362][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN; QQKN
+2492 ; [.1206.0020.0004.2492][.1206.0020.0004.2492][*0281.0020.001F.2492] # NUMBER ELEVEN FULL STOP; QQKN
+247E ; [*02FF.0020.0004.247E][.1206.0020.0004.247E][.1206.0020.001F.247E][*0300.0020.001F.247E] # PARENTHESIZED NUMBER ELEVEN; QQKN
+246A ; [.1206.0020.0006.246A][.1206.0020.0006.246A] # CIRCLED NUMBER ELEVEN; QQKN
+24EB ; [.1206.0020.0006.24EB][.1206.0020.0006.24EB] # NEGATIVE CIRCLED NUMBER ELEVEN; QQKN
+2152 ; [.1206.0020.001E.2152][*035D.0020.001E.2152][.1206.0020.001F.2152][.1205.0020.001F.2152] # VULGAR FRACTION ONE TENTH; QQKN
+33EA ; [.1206.0020.0004.33EA][.1206.0020.0004.33EA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN; QQKN
+32CA ; [.1206.0020.0004.32CA][.1206.0020.0004.32CA][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER; QQKN
+3363 ; [.1206.0020.0004.3363][.1206.0020.0004.3363][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN; QQKN
+2493 ; [.1206.0020.0004.2493][.1207.0020.0004.2493][*0281.0020.001F.2493] # NUMBER TWELVE FULL STOP; QQKN
+247F ; [*02FF.0020.0004.247F][.1206.0020.0004.247F][.1207.0020.001F.247F][*0300.0020.001F.247F] # PARENTHESIZED NUMBER TWELVE; QQKN
+246B ; [.1206.0020.0006.246B][.1207.0020.0006.246B] # CIRCLED NUMBER TWELVE; QQKN
+24EC ; [.1206.0020.0006.24EC][.1207.0020.0006.24EC] # NEGATIVE CIRCLED NUMBER TWELVE; QQKN
+00BD ; [.1206.0020.001E.00BD][*035D.0020.001E.00BD][.1207.0020.001F.00BD] # VULGAR FRACTION ONE HALF; QQKN
+33EB ; [.1206.0020.0004.33EB][.1207.0020.0004.33EB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE; QQKN
+32CB ; [.1206.0020.0004.32CB][.1207.0020.0004.32CB][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER; QQKN
+3364 ; [.1206.0020.0004.3364][.1207.0020.0004.3364][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE; QQKN
+2494 ; [.1206.0020.0004.2494][.1208.0020.0004.2494][*0281.0020.001F.2494] # NUMBER THIRTEEN FULL STOP; QQKN
+2480 ; [*02FF.0020.0004.2480][.1206.0020.0004.2480][.1208.0020.001F.2480][*0300.0020.001F.2480] # PARENTHESIZED NUMBER THIRTEEN; QQKN
+246C ; [.1206.0020.0006.246C][.1208.0020.0006.246C] # CIRCLED NUMBER THIRTEEN; QQKN
+24ED ; [.1206.0020.0006.24ED][.1208.0020.0006.24ED] # NEGATIVE CIRCLED NUMBER THIRTEEN; QQKN
+2153 ; [.1206.0020.001E.2153][*035D.0020.001E.2153][.1208.0020.001F.2153] # VULGAR FRACTION ONE THIRD; QQKN
+33EC ; [.1206.0020.0004.33EC][.1208.0020.0004.33EC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN; QQKN
+3365 ; [.1206.0020.0004.3365][.1208.0020.0004.3365][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN; QQKN
+2495 ; [.1206.0020.0004.2495][.1209.0020.0004.2495][*0281.0020.001F.2495] # NUMBER FOURTEEN FULL STOP; QQKN
+2481 ; [*02FF.0020.0004.2481][.1206.0020.0004.2481][.1209.0020.001F.2481][*0300.0020.001F.2481] # PARENTHESIZED NUMBER FOURTEEN; QQKN
+246D ; [.1206.0020.0006.246D][.1209.0020.0006.246D] # CIRCLED NUMBER FOURTEEN; QQKN
+24EE ; [.1206.0020.0006.24EE][.1209.0020.0006.24EE] # NEGATIVE CIRCLED NUMBER FOURTEEN; QQKN
+00BC ; [.1206.0020.001E.00BC][*035D.0020.001E.00BC][.1209.0020.001F.00BC] # VULGAR FRACTION ONE QUARTER; QQKN
+33ED ; [.1206.0020.0004.33ED][.1209.0020.0004.33ED][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN; QQKN
+3366 ; [.1206.0020.0004.3366][.1209.0020.0004.3366][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN; QQKN
+2496 ; [.1206.0020.0004.2496][.120A.0020.0004.2496][*0281.0020.001F.2496] # NUMBER FIFTEEN FULL STOP; QQKN
+2482 ; [*02FF.0020.0004.2482][.1206.0020.0004.2482][.120A.0020.001F.2482][*0300.0020.001F.2482] # PARENTHESIZED NUMBER FIFTEEN; QQKN
+246E ; [.1206.0020.0006.246E][.120A.0020.0006.246E] # CIRCLED NUMBER FIFTEEN; QQKN
+24EF ; [.1206.0020.0006.24EF][.120A.0020.0006.24EF] # NEGATIVE CIRCLED NUMBER FIFTEEN; QQKN
+2155 ; [.1206.0020.001E.2155][*035D.0020.001E.2155][.120A.0020.001F.2155] # VULGAR FRACTION ONE FIFTH; QQKN
+33EE ; [.1206.0020.0004.33EE][.120A.0020.0004.33EE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN; QQKN
+3367 ; [.1206.0020.0004.3367][.120A.0020.0004.3367][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN; QQKN
+2497 ; [.1206.0020.0004.2497][.120B.0020.0004.2497][*0281.0020.001F.2497] # NUMBER SIXTEEN FULL STOP; QQKN
+2483 ; [*02FF.0020.0004.2483][.1206.0020.0004.2483][.120B.0020.001F.2483][*0300.0020.001F.2483] # PARENTHESIZED NUMBER SIXTEEN; QQKN
+246F ; [.1206.0020.0006.246F][.120B.0020.0006.246F] # CIRCLED NUMBER SIXTEEN; QQKN
+24F0 ; [.1206.0020.0006.24F0][.120B.0020.0006.24F0] # NEGATIVE CIRCLED NUMBER SIXTEEN; QQKN
+2159 ; [.1206.0020.001E.2159][*035D.0020.001E.2159][.120B.0020.001F.2159] # VULGAR FRACTION ONE SIXTH; QQKN
+33EF ; [.1206.0020.0004.33EF][.120B.0020.0004.33EF][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN; QQKN
+3368 ; [.1206.0020.0004.3368][.120B.0020.0004.3368][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN; QQKN
+2498 ; [.1206.0020.0004.2498][.120C.0020.0004.2498][*0281.0020.001F.2498] # NUMBER SEVENTEEN FULL STOP; QQKN
+2484 ; [*02FF.0020.0004.2484][.1206.0020.0004.2484][.120C.0020.001F.2484][*0300.0020.001F.2484] # PARENTHESIZED NUMBER SEVENTEEN; QQKN
+2470 ; [.1206.0020.0006.2470][.120C.0020.0006.2470] # CIRCLED NUMBER SEVENTEEN; QQKN
+24F1 ; [.1206.0020.0006.24F1][.120C.0020.0006.24F1] # NEGATIVE CIRCLED NUMBER SEVENTEEN; QQKN
+2150 ; [.1206.0020.001E.2150][*035D.0020.001E.2150][.120C.0020.001F.2150] # VULGAR FRACTION ONE SEVENTH; QQKN
+33F0 ; [.1206.0020.0004.33F0][.120C.0020.0004.33F0][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN; QQKN
+3369 ; [.1206.0020.0004.3369][.120C.0020.0004.3369][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN; QQKN
+2499 ; [.1206.0020.0004.2499][.120D.0020.0004.2499][*0281.0020.001F.2499] # NUMBER EIGHTEEN FULL STOP; QQKN
+2485 ; [*02FF.0020.0004.2485][.1206.0020.0004.2485][.120D.0020.001F.2485][*0300.0020.001F.2485] # PARENTHESIZED NUMBER EIGHTEEN; QQKN
+2471 ; [.1206.0020.0006.2471][.120D.0020.0006.2471] # CIRCLED NUMBER EIGHTEEN; QQKN
+24F2 ; [.1206.0020.0006.24F2][.120D.0020.0006.24F2] # NEGATIVE CIRCLED NUMBER EIGHTEEN; QQKN
+215B ; [.1206.0020.001E.215B][*035D.0020.001E.215B][.120D.0020.001F.215B] # VULGAR FRACTION ONE EIGHTH; QQKN
+33F1 ; [.1206.0020.0004.33F1][.120D.0020.0004.33F1][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN; QQKN
+336A ; [.1206.0020.0004.336A][.120D.0020.0004.336A][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN; QQKN
+249A ; [.1206.0020.0004.249A][.120E.0020.0004.249A][*0281.0020.001F.249A] # NUMBER NINETEEN FULL STOP; QQKN
+2486 ; [*02FF.0020.0004.2486][.1206.0020.0004.2486][.120E.0020.001F.2486][*0300.0020.001F.2486] # PARENTHESIZED NUMBER NINETEEN; QQKN
+2472 ; [.1206.0020.0006.2472][.120E.0020.0006.2472] # CIRCLED NUMBER NINETEEN; QQKN
+24F3 ; [.1206.0020.0006.24F3][.120E.0020.0006.24F3] # NEGATIVE CIRCLED NUMBER NINETEEN; QQKN
+2151 ; [.1206.0020.001E.2151][*035D.0020.001E.2151][.120E.0020.001F.2151] # VULGAR FRACTION ONE NINTH; QQKN
+33F2 ; [.1206.0020.0004.33F2][.120E.0020.0004.33F2][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN; QQKN
+336B ; [.1206.0020.0004.336B][.120E.0020.0004.336B][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN; QQKN
+33E0 ; [.1206.0020.0004.33E0][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE; QQKN
+32C0 ; [.1206.0020.0004.32C0][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY; QQKN
+3359 ; [.1206.0020.0004.3359][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE; QQKN
+0032 ; [.1207.0020.0002.0032] # DIGIT TWO
+FF12 ; [.1207.0020.0003.FF12] # FULLWIDTH DIGIT TWO; QQK
+2475 ; [*02FF.0020.0004.2475][.1207.0020.0004.2475][*0300.0020.001F.2475] # PARENTHESIZED DIGIT TWO; QQKN
+2489 ; [.1207.0020.0004.2489][*0281.0020.0004.2489] # DIGIT TWO FULL STOP; QQKN
+1F103 ; [.1207.0020.0004.1F103][*0234.0020.0004.1F103] # DIGIT TWO COMMA; QQKN
+1D7D0 ; [.1207.0020.0005.1D7D0] # MATHEMATICAL BOLD DIGIT TWO; QQK
+1D7DA ; [.1207.0020.0005.1D7DA] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO; QQK
+1D7E4 ; [.1207.0020.0005.1D7E4] # MATHEMATICAL SANS-SERIF DIGIT TWO; QQK
+1D7EE ; [.1207.0020.0005.1D7EE] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO; QQK
+1D7F8 ; [.1207.0020.0005.1D7F8] # MATHEMATICAL MONOSPACE DIGIT TWO; QQK
+2461 ; [.1207.0020.0006.2461] # CIRCLED DIGIT TWO; QQK
+24F6 ; [.1207.0020.0006.24F6] # DOUBLE CIRCLED DIGIT TWO; QQK
+2777 ; [.1207.0020.0006.2777] # DINGBAT NEGATIVE CIRCLED DIGIT TWO; QQK
+2781 ; [.1207.0020.0006.2781] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO; QQK
+278B ; [.1207.0020.0006.278B] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO; QQK
+00B2 ; [.1207.0020.0014.00B2] # SUPERSCRIPT TWO; QQK
+2082 ; [.1207.0020.0015.2082] # SUBSCRIPT TWO; QQK
+0662 ; [.1207.0020.0002.0662][.0000.015F.0002.0662] # ARABIC-INDIC DIGIT TWO
+06F2 ; [.1207.0020.0002.06F2][.0000.0160.0002.06F2] # EXTENDED ARABIC-INDIC DIGIT TWO
+10E61 ; [.1207.0020.0002.10E61][.0000.0161.0002.10E61] # RUMI DIGIT TWO
+07C2 ; [.1207.0020.0002.07C2][.0000.0162.0002.07C2] # NKO DIGIT TWO
+136A ; [.1207.0020.0002.136A][.0000.0163.0002.136A] # ETHIOPIC DIGIT TWO
+104A2 ; [.1207.0020.0002.104A2][.0000.0164.0002.104A2] # OSMANYA DIGIT TWO
+0968 ; [.1207.0020.0002.0968][.0000.0165.0002.0968] # DEVANAGARI DIGIT TWO
+09E8 ; [.1207.0020.0002.09E8][.0000.0166.0002.09E8] # BENGALI DIGIT TWO
+0A68 ; [.1207.0020.0002.0A68][.0000.0167.0002.0A68] # GURMUKHI DIGIT TWO
+0AE8 ; [.1207.0020.0002.0AE8][.0000.0168.0002.0AE8] # GUJARATI DIGIT TWO
+0B68 ; [.1207.0020.0002.0B68][.0000.0169.0002.0B68] # ORIYA DIGIT TWO
+0BE8 ; [.1207.0020.0002.0BE8][.0000.016A.0002.0BE8] # TAMIL DIGIT TWO
+0C68 ; [.1207.0020.0002.0C68][.0000.016B.0002.0C68] # TELUGU DIGIT TWO
+0C7A ; [.1207.0020.0002.0C7A][.0000.016B.0002.0C7A] # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR
+0C7D ; [.1207.0020.0002.0C7D][.0000.016B.0002.0C7D] # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR
+0CE8 ; [.1207.0020.0002.0CE8][.0000.016C.0002.0CE8] # KANNADA DIGIT TWO
+0D68 ; [.1207.0020.0002.0D68][.0000.016D.0002.0D68] # MALAYALAM DIGIT TWO
+ABF2 ; [.1207.0020.0002.ABF2][.0000.016E.0002.ABF2] # MEETEI MAYEK DIGIT TWO
+A8D2 ; [.1207.0020.0002.A8D2][.0000.016F.0002.A8D2] # SAURASHTRA DIGIT TWO
+1948 ; [.1207.0020.0002.1948][.0000.0170.0002.1948] # LIMBU DIGIT TWO
+19D2 ; [.1207.0020.0002.19D2][.0000.0171.0002.19D2] # NEW TAI LUE DIGIT TWO
+1A82 ; [.1207.0020.0002.1A82][.0000.0173.0002.1A82] # TAI THAM HORA DIGIT TWO
+1A92 ; [.1207.0020.0002.1A92][.0000.0174.0002.1A92] # TAI THAM THAM DIGIT TWO
+0E52 ; [.1207.0020.0002.0E52][.0000.0175.0002.0E52] # THAI DIGIT TWO
+0ED2 ; [.1207.0020.0002.0ED2][.0000.0176.0002.0ED2] # LAO DIGIT TWO
+0F22 ; [.1207.0020.0002.0F22][.0000.0177.0002.0F22] # TIBETAN DIGIT TWO
+0F2B ; [.1207.0020.0004.0F2B][.0000.0177.0004.0F2B] # TIBETAN DIGIT HALF TWO; QQK
+1C42 ; [.1207.0020.0002.1C42][.0000.0178.0002.1C42] # LEPCHA DIGIT TWO
+A902 ; [.1207.0020.0002.A902][.0000.0179.0002.A902] # KAYAH LI DIGIT TWO
+1042 ; [.1207.0020.0002.1042][.0000.017A.0002.1042] # MYANMAR DIGIT TWO
+1092 ; [.1207.0020.0002.1092][.0000.017B.0002.1092] # MYANMAR SHAN DIGIT TWO
+17E2 ; [.1207.0020.0002.17E2][.0000.017C.0002.17E2] # KHMER DIGIT TWO
+17F2 ; [.1207.0020.0002.17F2][.0000.017D.0002.17F2] # KHMER SYMBOL LEK ATTAK PII
+AA52 ; [.1207.0020.0002.AA52][.0000.017E.0002.AA52] # CHAM DIGIT TWO
+1B52 ; [.1207.0020.0002.1B52][.0000.017F.0002.1B52] # BALINESE DIGIT TWO
+A9D2 ; [.1207.0020.0002.A9D2][.0000.0180.0002.A9D2] # JAVANESE DIGIT TWO
+1BB2 ; [.1207.0020.0002.1BB2][.0000.0181.0002.1BB2] # SUNDANESE DIGIT TWO
+1812 ; [.1207.0020.0002.1812][.0000.0182.0002.1812] # MONGOLIAN DIGIT TWO
+1C52 ; [.1207.0020.0002.1C52][.0000.0183.0002.1C52] # OL CHIKI DIGIT TWO
+A622 ; [.1207.0020.0002.A622][.0000.0184.0002.A622] # VAI DIGIT TWO
+3022 ; [.1207.0020.0002.3022][.0000.0185.0002.3022] # HANGZHOU NUMERAL TWO
+10108 ; [.1207.0020.0002.10108][.0000.0186.0002.10108] # AEGEAN NUMBER TWO
+1015B ; [.1207.0020.0002.1015B][.0000.0187.0002.1015B] # GREEK ACROPHONIC EPIDAUREAN TWO
+1015C ; [.1207.0020.0002.1015C][.0000.0187.0002.1015C] # GREEK ACROPHONIC THESPIAN TWO
+1015D ; [.1207.0020.0002.1015D][.0000.0187.0002.1015D] # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E ; [.1207.0020.0002.1015E][.0000.0187.0002.1015E] # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+103D2 ; [.1207.0020.0002.103D2][.0000.018A.0002.103D2] # OLD PERSIAN NUMBER TWO
+12400 ; [.1207.0020.0002.12400][.0000.018B.0002.12400] # CUNEIFORM NUMERIC SIGN TWO ASH
+12416 ; [.1207.0020.0002.12416][.0000.018B.0002.12416] # CUNEIFORM NUMERIC SIGN TWO GESH2
+1241F ; [.1207.0020.0002.1241F][.0000.018B.0002.1241F] # CUNEIFORM NUMERIC SIGN TWO GESHU
+12423 ; [.1207.0020.0002.12423][.0000.018B.0002.12423] # CUNEIFORM NUMERIC SIGN TWO SHAR2
+1242D ; [.1207.0020.0002.1242D][.0000.018B.0002.1242D] # CUNEIFORM NUMERIC SIGN TWO SHARU
+12435 ; [.1207.0020.0002.12435][.0000.018B.0002.12435] # CUNEIFORM NUMERIC SIGN TWO BURU
+1244A ; [.1207.0020.0002.1244A][.0000.018B.0002.1244A] # CUNEIFORM NUMERIC SIGN TWO ASH TENU
+12450 ; [.1207.0020.0002.12450][.0000.018B.0002.12450] # CUNEIFORM NUMERIC SIGN TWO BAN2
+12459 ; [.1207.0020.0002.12459][.0000.018B.0002.12459] # CUNEIFORM NUMERIC SIGN TWO ESHE3
+1091A ; [.1207.0020.0002.1091A][.0000.018D.0002.1091A] # PHOENICIAN NUMBER TWO
+10859 ; [.1207.0020.0002.10859][.0000.018E.0002.10859] # IMPERIAL ARAMAIC NUMBER TWO
+10B59 ; [.1207.0020.0002.10B59][.0000.018F.0002.10B59] # INSCRIPTIONAL PARTHIAN NUMBER TWO
+10B79 ; [.1207.0020.0002.10B79][.0000.0190.0002.10B79] # INSCRIPTIONAL PAHLAVI NUMBER TWO
+10A41 ; [.1207.0020.0002.10A41][.0000.0191.0002.10A41] # KHAROSHTHI DIGIT TWO
+1D361 ; [.1207.0020.0002.1D361][.0000.0192.0002.1D361] # COUNTING ROD UNIT DIGIT TWO
+249B ; [.1207.0020.0004.249B][.1205.0020.0004.249B][*0281.0020.001F.249B] # NUMBER TWENTY FULL STOP; QQKN
+2487 ; [*02FF.0020.0004.2487][.1207.0020.0004.2487][.1205.0020.001F.2487][*0300.0020.001F.2487] # PARENTHESIZED NUMBER TWENTY; QQKN
+2473 ; [.1207.0020.0006.2473][.1205.0020.0006.2473] # CIRCLED NUMBER TWENTY; QQKN
+24F4 ; [.1207.0020.0006.24F4][.1205.0020.0006.24F4] # NEGATIVE CIRCLED NUMBER TWENTY; QQKN
+3249 ; [.1207.0020.0006.3249][.1205.0020.0006.3249] # CIRCLED NUMBER TWENTY ON BLACK SQUARE; QQKN
+33F3 ; [.1207.0020.0004.33F3][.1205.0020.0004.33F3][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY; QQKN
+336C ; [.1207.0020.0004.336C][.1205.0020.0004.336C][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY; QQKN
+3251 ; [.1207.0020.0006.3251][.1206.0020.0006.3251] # CIRCLED NUMBER TWENTY ONE; QQKN
+33F4 ; [.1207.0020.0004.33F4][.1206.0020.0004.33F4][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE; QQKN
+336D ; [.1207.0020.0004.336D][.1206.0020.0004.336D][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE; QQKN
+3252 ; [.1207.0020.0006.3252][.1207.0020.0006.3252] # CIRCLED NUMBER TWENTY TWO; QQKN
+33F5 ; [.1207.0020.0004.33F5][.1207.0020.0004.33F5][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO; QQKN
+336E ; [.1207.0020.0004.336E][.1207.0020.0004.336E][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO; QQKN
+3253 ; [.1207.0020.0006.3253][.1208.0020.0006.3253] # CIRCLED NUMBER TWENTY THREE; QQKN
+2154 ; [.1207.0020.001E.2154][*035D.0020.001E.2154][.1208.0020.001F.2154] # VULGAR FRACTION TWO THIRDS; QQKN
+33F6 ; [.1207.0020.0004.33F6][.1208.0020.0004.33F6][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE; QQKN
+336F ; [.1207.0020.0004.336F][.1208.0020.0004.336F][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE; QQKN
+3254 ; [.1207.0020.0006.3254][.1209.0020.0006.3254] # CIRCLED NUMBER TWENTY FOUR; QQKN
+33F7 ; [.1207.0020.0004.33F7][.1209.0020.0004.33F7][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR; QQKN
+3370 ; [.1207.0020.0004.3370][.1209.0020.0004.3370][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR; QQKN
+3255 ; [.1207.0020.0006.3255][.120A.0020.0006.3255] # CIRCLED NUMBER TWENTY FIVE; QQKN
+2156 ; [.1207.0020.001E.2156][*035D.0020.001E.2156][.120A.0020.001F.2156] # VULGAR FRACTION TWO FIFTHS; QQKN
+33F8 ; [.1207.0020.0004.33F8][.120A.0020.0004.33F8][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE; QQKN
+3256 ; [.1207.0020.0006.3256][.120B.0020.0006.3256] # CIRCLED NUMBER TWENTY SIX; QQKN
+33F9 ; [.1207.0020.0004.33F9][.120B.0020.0004.33F9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX; QQKN
+3257 ; [.1207.0020.0006.3257][.120C.0020.0006.3257] # CIRCLED NUMBER TWENTY SEVEN; QQKN
+33FA ; [.1207.0020.0004.33FA][.120C.0020.0004.33FA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN; QQKN
+3258 ; [.1207.0020.0006.3258][.120D.0020.0006.3258] # CIRCLED NUMBER TWENTY EIGHT; QQKN
+33FB ; [.1207.0020.0004.33FB][.120D.0020.0004.33FB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT; QQKN
+3259 ; [.1207.0020.0006.3259][.120E.0020.0006.3259] # CIRCLED NUMBER TWENTY NINE; QQKN
+33FC ; [.1207.0020.0004.33FC][.120E.0020.0004.33FC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE; QQKN
+33E1 ; [.1207.0020.0004.33E1][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO; QQKN
+32C1 ; [.1207.0020.0004.32C1][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY; QQKN
+335A ; [.1207.0020.0004.335A][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO; QQKN
+0033 ; [.1208.0020.0002.0033] # DIGIT THREE
+FF13 ; [.1208.0020.0003.FF13] # FULLWIDTH DIGIT THREE; QQK
+2476 ; [*02FF.0020.0004.2476][.1208.0020.0004.2476][*0300.0020.001F.2476] # PARENTHESIZED DIGIT THREE; QQKN
+248A ; [.1208.0020.0004.248A][*0281.0020.0004.248A] # DIGIT THREE FULL STOP; QQKN
+1F104 ; [.1208.0020.0004.1F104][*0234.0020.0004.1F104] # DIGIT THREE COMMA; QQKN
+1D7D1 ; [.1208.0020.0005.1D7D1] # MATHEMATICAL BOLD DIGIT THREE; QQK
+1D7DB ; [.1208.0020.0005.1D7DB] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE; QQK
+1D7E5 ; [.1208.0020.0005.1D7E5] # MATHEMATICAL SANS-SERIF DIGIT THREE; QQK
+1D7EF ; [.1208.0020.0005.1D7EF] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE; QQK
+1D7F9 ; [.1208.0020.0005.1D7F9] # MATHEMATICAL MONOSPACE DIGIT THREE; QQK
+2462 ; [.1208.0020.0006.2462] # CIRCLED DIGIT THREE; QQK
+24F7 ; [.1208.0020.0006.24F7] # DOUBLE CIRCLED DIGIT THREE; QQK
+2778 ; [.1208.0020.0006.2778] # DINGBAT NEGATIVE CIRCLED DIGIT THREE; QQK
+2782 ; [.1208.0020.0006.2782] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE; QQK
+278C ; [.1208.0020.0006.278C] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE; QQK
+00B3 ; [.1208.0020.0014.00B3] # SUPERSCRIPT THREE; QQK
+2083 ; [.1208.0020.0015.2083] # SUBSCRIPT THREE; QQK
+0663 ; [.1208.0020.0002.0663][.0000.015F.0002.0663] # ARABIC-INDIC DIGIT THREE
+06F3 ; [.1208.0020.0002.06F3][.0000.0160.0002.06F3] # EXTENDED ARABIC-INDIC DIGIT THREE
+10E62 ; [.1208.0020.0002.10E62][.0000.0161.0002.10E62] # RUMI DIGIT THREE
+07C3 ; [.1208.0020.0002.07C3][.0000.0162.0002.07C3] # NKO DIGIT THREE
+136B ; [.1208.0020.0002.136B][.0000.0163.0002.136B] # ETHIOPIC DIGIT THREE
+104A3 ; [.1208.0020.0002.104A3][.0000.0164.0002.104A3] # OSMANYA DIGIT THREE
+0969 ; [.1208.0020.0002.0969][.0000.0165.0002.0969] # DEVANAGARI DIGIT THREE
+09E9 ; [.1208.0020.0002.09E9][.0000.0166.0002.09E9] # BENGALI DIGIT THREE
+0A69 ; [.1208.0020.0002.0A69][.0000.0167.0002.0A69] # GURMUKHI DIGIT THREE
+0AE9 ; [.1208.0020.0002.0AE9][.0000.0168.0002.0AE9] # GUJARATI DIGIT THREE
+0B69 ; [.1208.0020.0002.0B69][.0000.0169.0002.0B69] # ORIYA DIGIT THREE
+0BE9 ; [.1208.0020.0002.0BE9][.0000.016A.0002.0BE9] # TAMIL DIGIT THREE
+0C69 ; [.1208.0020.0002.0C69][.0000.016B.0002.0C69] # TELUGU DIGIT THREE
+0C7B ; [.1208.0020.0002.0C7B][.0000.016B.0002.0C7B] # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR
+0C7E ; [.1208.0020.0002.0C7E][.0000.016B.0002.0C7E] # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0CE9 ; [.1208.0020.0002.0CE9][.0000.016C.0002.0CE9] # KANNADA DIGIT THREE
+0D69 ; [.1208.0020.0002.0D69][.0000.016D.0002.0D69] # MALAYALAM DIGIT THREE
+ABF3 ; [.1208.0020.0002.ABF3][.0000.016E.0002.ABF3] # MEETEI MAYEK DIGIT THREE
+A8D3 ; [.1208.0020.0002.A8D3][.0000.016F.0002.A8D3] # SAURASHTRA DIGIT THREE
+1949 ; [.1208.0020.0002.1949][.0000.0170.0002.1949] # LIMBU DIGIT THREE
+19D3 ; [.1208.0020.0002.19D3][.0000.0171.0002.19D3] # NEW TAI LUE DIGIT THREE
+1A83 ; [.1208.0020.0002.1A83][.0000.0173.0002.1A83] # TAI THAM HORA DIGIT THREE
+1A93 ; [.1208.0020.0002.1A93][.0000.0174.0002.1A93] # TAI THAM THAM DIGIT THREE
+0E53 ; [.1208.0020.0002.0E53][.0000.0175.0002.0E53] # THAI DIGIT THREE
+0ED3 ; [.1208.0020.0002.0ED3][.0000.0176.0002.0ED3] # LAO DIGIT THREE
+0F23 ; [.1208.0020.0002.0F23][.0000.0177.0002.0F23] # TIBETAN DIGIT THREE
+0F2C ; [.1208.0020.0004.0F2C][.0000.0177.0004.0F2C] # TIBETAN DIGIT HALF THREE; QQK
+1C43 ; [.1208.0020.0002.1C43][.0000.0178.0002.1C43] # LEPCHA DIGIT THREE
+A903 ; [.1208.0020.0002.A903][.0000.0179.0002.A903] # KAYAH LI DIGIT THREE
+1043 ; [.1208.0020.0002.1043][.0000.017A.0002.1043] # MYANMAR DIGIT THREE
+1093 ; [.1208.0020.0002.1093][.0000.017B.0002.1093] # MYANMAR SHAN DIGIT THREE
+17E3 ; [.1208.0020.0002.17E3][.0000.017C.0002.17E3] # KHMER DIGIT THREE
+17F3 ; [.1208.0020.0002.17F3][.0000.017D.0002.17F3] # KHMER SYMBOL LEK ATTAK BEI
+AA53 ; [.1208.0020.0002.AA53][.0000.017E.0002.AA53] # CHAM DIGIT THREE
+1B53 ; [.1208.0020.0002.1B53][.0000.017F.0002.1B53] # BALINESE DIGIT THREE
+A9D3 ; [.1208.0020.0002.A9D3][.0000.0180.0002.A9D3] # JAVANESE DIGIT THREE
+1BB3 ; [.1208.0020.0002.1BB3][.0000.0181.0002.1BB3] # SUNDANESE DIGIT THREE
+1813 ; [.1208.0020.0002.1813][.0000.0182.0002.1813] # MONGOLIAN DIGIT THREE
+1C53 ; [.1208.0020.0002.1C53][.0000.0183.0002.1C53] # OL CHIKI DIGIT THREE
+A623 ; [.1208.0020.0002.A623][.0000.0184.0002.A623] # VAI DIGIT THREE
+3023 ; [.1208.0020.0002.3023][.0000.0185.0002.3023] # HANGZHOU NUMERAL THREE
+10109 ; [.1208.0020.0002.10109][.0000.0186.0002.10109] # AEGEAN NUMBER THREE
+12401 ; [.1208.0020.0002.12401][.0000.018B.0002.12401] # CUNEIFORM NUMERIC SIGN THREE ASH
+12408 ; [.1208.0020.0002.12408][.0000.018B.0002.12408] # CUNEIFORM NUMERIC SIGN THREE DISH
+12417 ; [.1208.0020.0002.12417][.0000.018B.0002.12417] # CUNEIFORM NUMERIC SIGN THREE GESH2
+12420 ; [.1208.0020.0002.12420][.0000.018B.0002.12420] # CUNEIFORM NUMERIC SIGN THREE GESHU
+12424 ; [.1208.0020.0002.12424][.0000.018B.0002.12424] # CUNEIFORM NUMERIC SIGN THREE SHAR2
+12425 ; [.1208.0020.0002.12425][.0000.018B.0002.12425] # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM
+1242E ; [.1208.0020.0002.1242E][.0000.018B.0002.1242E] # CUNEIFORM NUMERIC SIGN THREE SHARU
+1242F ; [.1208.0020.0002.1242F][.0000.018B.0002.1242F] # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM
+12436 ; [.1208.0020.0002.12436][.0000.018B.0002.12436] # CUNEIFORM NUMERIC SIGN THREE BURU
+12437 ; [.1208.0020.0002.12437][.0000.018B.0002.12437] # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM
+1243A ; [.1208.0020.0002.1243A][.0000.018B.0002.1243A] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16
+1243B ; [.1208.0020.0002.1243B][.0000.018B.0002.1243B] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21
+1244B ; [.1208.0020.0002.1244B][.0000.018B.0002.1244B] # CUNEIFORM NUMERIC SIGN THREE ASH TENU
+12451 ; [.1208.0020.0002.12451][.0000.018B.0002.12451] # CUNEIFORM NUMERIC SIGN THREE BAN2
+1091B ; [.1208.0020.0002.1091B][.0000.018D.0002.1091B] # PHOENICIAN NUMBER THREE
+1085A ; [.1208.0020.0002.1085A][.0000.018E.0002.1085A] # IMPERIAL ARAMAIC NUMBER THREE
+10B5A ; [.1208.0020.0002.10B5A][.0000.018F.0002.10B5A] # INSCRIPTIONAL PARTHIAN NUMBER THREE
+10B7A ; [.1208.0020.0002.10B7A][.0000.0190.0002.10B7A] # INSCRIPTIONAL PAHLAVI NUMBER THREE
+10A42 ; [.1208.0020.0002.10A42][.0000.0191.0002.10A42] # KHAROSHTHI DIGIT THREE
+1D362 ; [.1208.0020.0002.1D362][.0000.0192.0002.1D362] # COUNTING ROD UNIT DIGIT THREE
+324A ; [.1208.0020.0006.324A][.1205.0020.0006.324A] # CIRCLED NUMBER THIRTY ON BLACK SQUARE; QQKN
+325A ; [.1208.0020.0006.325A][.1205.0020.0006.325A] # CIRCLED NUMBER THIRTY; QQKN
+33FD ; [.1208.0020.0004.33FD][.1205.0020.0004.33FD][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY; QQKN
+325B ; [.1208.0020.0006.325B][.1206.0020.0006.325B] # CIRCLED NUMBER THIRTY ONE; QQKN
+33FE ; [.1208.0020.0004.33FE][.1206.0020.0004.33FE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE; QQKN
+325C ; [.1208.0020.0006.325C][.1207.0020.0006.325C] # CIRCLED NUMBER THIRTY TWO; QQKN
+325D ; [.1208.0020.0006.325D][.1208.0020.0006.325D] # CIRCLED NUMBER THIRTY THREE; QQKN
+325E ; [.1208.0020.0006.325E][.1209.0020.0006.325E] # CIRCLED NUMBER THIRTY FOUR; QQKN
+00BE ; [.1208.0020.001E.00BE][*035D.0020.001E.00BE][.1209.0020.001F.00BE] # VULGAR FRACTION THREE QUARTERS; QQKN
+325F ; [.1208.0020.0006.325F][.120A.0020.0006.325F] # CIRCLED NUMBER THIRTY FIVE; QQKN
+2157 ; [.1208.0020.001E.2157][*035D.0020.001E.2157][.120A.0020.001F.2157] # VULGAR FRACTION THREE FIFTHS; QQKN
+32B1 ; [.1208.0020.0006.32B1][.120B.0020.0006.32B1] # CIRCLED NUMBER THIRTY SIX; QQKN
+32B2 ; [.1208.0020.0006.32B2][.120C.0020.0006.32B2] # CIRCLED NUMBER THIRTY SEVEN; QQKN
+32B3 ; [.1208.0020.0006.32B3][.120D.0020.0006.32B3] # CIRCLED NUMBER THIRTY EIGHT; QQKN
+215C ; [.1208.0020.001E.215C][*035D.0020.001E.215C][.120D.0020.001F.215C] # VULGAR FRACTION THREE EIGHTHS; QQKN
+32B4 ; [.1208.0020.0006.32B4][.120E.0020.0006.32B4] # CIRCLED NUMBER THIRTY NINE; QQKN
+33E2 ; [.1208.0020.0004.33E2][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE; QQKN
+32C2 ; [.1208.0020.0004.32C2][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH; QQKN
+335B ; [.1208.0020.0004.335B][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE; QQKN
+0034 ; [.1209.0020.0002.0034] # DIGIT FOUR
+FF14 ; [.1209.0020.0003.FF14] # FULLWIDTH DIGIT FOUR; QQK
+2477 ; [*02FF.0020.0004.2477][.1209.0020.0004.2477][*0300.0020.001F.2477] # PARENTHESIZED DIGIT FOUR; QQKN
+248B ; [.1209.0020.0004.248B][*0281.0020.0004.248B] # DIGIT FOUR FULL STOP; QQKN
+1F105 ; [.1209.0020.0004.1F105][*0234.0020.0004.1F105] # DIGIT FOUR COMMA; QQKN
+1D7D2 ; [.1209.0020.0005.1D7D2] # MATHEMATICAL BOLD DIGIT FOUR; QQK
+1D7DC ; [.1209.0020.0005.1D7DC] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR; QQK
+1D7E6 ; [.1209.0020.0005.1D7E6] # MATHEMATICAL SANS-SERIF DIGIT FOUR; QQK
+1D7F0 ; [.1209.0020.0005.1D7F0] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR; QQK
+1D7FA ; [.1209.0020.0005.1D7FA] # MATHEMATICAL MONOSPACE DIGIT FOUR; QQK
+2463 ; [.1209.0020.0006.2463] # CIRCLED DIGIT FOUR; QQK
+24F8 ; [.1209.0020.0006.24F8] # DOUBLE CIRCLED DIGIT FOUR; QQK
+2779 ; [.1209.0020.0006.2779] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR; QQK
+2783 ; [.1209.0020.0006.2783] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR; QQK
+278D ; [.1209.0020.0006.278D] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR; QQK
+2074 ; [.1209.0020.0014.2074] # SUPERSCRIPT FOUR; QQK
+2084 ; [.1209.0020.0015.2084] # SUBSCRIPT FOUR; QQK
+0664 ; [.1209.0020.0002.0664][.0000.015F.0002.0664] # ARABIC-INDIC DIGIT FOUR
+06F4 ; [.1209.0020.0002.06F4][.0000.0160.0002.06F4] # EXTENDED ARABIC-INDIC DIGIT FOUR
+10E63 ; [.1209.0020.0002.10E63][.0000.0161.0002.10E63] # RUMI DIGIT FOUR
+07C4 ; [.1209.0020.0002.07C4][.0000.0162.0002.07C4] # NKO DIGIT FOUR
+136C ; [.1209.0020.0002.136C][.0000.0163.0002.136C] # ETHIOPIC DIGIT FOUR
+104A4 ; [.1209.0020.0002.104A4][.0000.0164.0002.104A4] # OSMANYA DIGIT FOUR
+096A ; [.1209.0020.0002.096A][.0000.0165.0002.096A] # DEVANAGARI DIGIT FOUR
+09EA ; [.1209.0020.0002.09EA][.0000.0166.0002.09EA] # BENGALI DIGIT FOUR
+0A6A ; [.1209.0020.0002.0A6A][.0000.0167.0002.0A6A] # GURMUKHI DIGIT FOUR
+0AEA ; [.1209.0020.0002.0AEA][.0000.0168.0002.0AEA] # GUJARATI DIGIT FOUR
+0B6A ; [.1209.0020.0002.0B6A][.0000.0169.0002.0B6A] # ORIYA DIGIT FOUR
+0BEA ; [.1209.0020.0002.0BEA][.0000.016A.0002.0BEA] # TAMIL DIGIT FOUR
+0C6A ; [.1209.0020.0002.0C6A][.0000.016B.0002.0C6A] # TELUGU DIGIT FOUR
+0CEA ; [.1209.0020.0002.0CEA][.0000.016C.0002.0CEA] # KANNADA DIGIT FOUR
+0D6A ; [.1209.0020.0002.0D6A][.0000.016D.0002.0D6A] # MALAYALAM DIGIT FOUR
+ABF4 ; [.1209.0020.0002.ABF4][.0000.016E.0002.ABF4] # MEETEI MAYEK DIGIT FOUR
+A8D4 ; [.1209.0020.0002.A8D4][.0000.016F.0002.A8D4] # SAURASHTRA DIGIT FOUR
+194A ; [.1209.0020.0002.194A][.0000.0170.0002.194A] # LIMBU DIGIT FOUR
+19D4 ; [.1209.0020.0002.19D4][.0000.0171.0002.19D4] # NEW TAI LUE DIGIT FOUR
+1A84 ; [.1209.0020.0002.1A84][.0000.0173.0002.1A84] # TAI THAM HORA DIGIT FOUR
+1A94 ; [.1209.0020.0002.1A94][.0000.0174.0002.1A94] # TAI THAM THAM DIGIT FOUR
+0E54 ; [.1209.0020.0002.0E54][.0000.0175.0002.0E54] # THAI DIGIT FOUR
+0ED4 ; [.1209.0020.0002.0ED4][.0000.0176.0002.0ED4] # LAO DIGIT FOUR
+0F24 ; [.1209.0020.0002.0F24][.0000.0177.0002.0F24] # TIBETAN DIGIT FOUR
+0F2D ; [.1209.0020.0004.0F2D][.0000.0177.0004.0F2D] # TIBETAN DIGIT HALF FOUR; QQK
+1C44 ; [.1209.0020.0002.1C44][.0000.0178.0002.1C44] # LEPCHA DIGIT FOUR
+A904 ; [.1209.0020.0002.A904][.0000.0179.0002.A904] # KAYAH LI DIGIT FOUR
+1044 ; [.1209.0020.0002.1044][.0000.017A.0002.1044] # MYANMAR DIGIT FOUR
+1094 ; [.1209.0020.0002.1094][.0000.017B.0002.1094] # MYANMAR SHAN DIGIT FOUR
+17E4 ; [.1209.0020.0002.17E4][.0000.017C.0002.17E4] # KHMER DIGIT FOUR
+17F4 ; [.1209.0020.0002.17F4][.0000.017D.0002.17F4] # KHMER SYMBOL LEK ATTAK BUON
+AA54 ; [.1209.0020.0002.AA54][.0000.017E.0002.AA54] # CHAM DIGIT FOUR
+1B54 ; [.1209.0020.0002.1B54][.0000.017F.0002.1B54] # BALINESE DIGIT FOUR
+A9D4 ; [.1209.0020.0002.A9D4][.0000.0180.0002.A9D4] # JAVANESE DIGIT FOUR
+1BB4 ; [.1209.0020.0002.1BB4][.0000.0181.0002.1BB4] # SUNDANESE DIGIT FOUR
+1814 ; [.1209.0020.0002.1814][.0000.0182.0002.1814] # MONGOLIAN DIGIT FOUR
+1C54 ; [.1209.0020.0002.1C54][.0000.0183.0002.1C54] # OL CHIKI DIGIT FOUR
+A624 ; [.1209.0020.0002.A624][.0000.0184.0002.A624] # VAI DIGIT FOUR
+3024 ; [.1209.0020.0002.3024][.0000.0185.0002.3024] # HANGZHOU NUMERAL FOUR
+1010A ; [.1209.0020.0002.1010A][.0000.0186.0002.1010A] # AEGEAN NUMBER FOUR
+12402 ; [.1209.0020.0002.12402][.0000.018B.0002.12402] # CUNEIFORM NUMERIC SIGN FOUR ASH
+12409 ; [.1209.0020.0002.12409][.0000.018B.0002.12409] # CUNEIFORM NUMERIC SIGN FOUR DISH
+1240F ; [.1209.0020.0002.1240F][.0000.018B.0002.1240F] # CUNEIFORM NUMERIC SIGN FOUR U
+12418 ; [.1209.0020.0002.12418][.0000.018B.0002.12418] # CUNEIFORM NUMERIC SIGN FOUR GESH2
+12421 ; [.1209.0020.0002.12421][.0000.018B.0002.12421] # CUNEIFORM NUMERIC SIGN FOUR GESHU
+12426 ; [.1209.0020.0002.12426][.0000.018B.0002.12426] # CUNEIFORM NUMERIC SIGN FOUR SHAR2
+12430 ; [.1209.0020.0002.12430][.0000.018B.0002.12430] # CUNEIFORM NUMERIC SIGN FOUR SHARU
+12438 ; [.1209.0020.0002.12438][.0000.018B.0002.12438] # CUNEIFORM NUMERIC SIGN FOUR BURU
+1243C ; [.1209.0020.0002.1243C][.0000.018B.0002.1243C] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU
+1243D ; [.1209.0020.0002.1243D][.0000.018B.0002.1243D] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4
+1243E ; [.1209.0020.0002.1243E][.0000.018B.0002.1243E] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A
+1243F ; [.1209.0020.0002.1243F][.0000.018B.0002.1243F] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B
+1244C ; [.1209.0020.0002.1244C][.0000.018B.0002.1244C] # CUNEIFORM NUMERIC SIGN FOUR ASH TENU
+12452 ; [.1209.0020.0002.12452][.0000.018B.0002.12452] # CUNEIFORM NUMERIC SIGN FOUR BAN2
+12453 ; [.1209.0020.0002.12453][.0000.018B.0002.12453] # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM
+10B5B ; [.1209.0020.0002.10B5B][.0000.018F.0002.10B5B] # INSCRIPTIONAL PARTHIAN NUMBER FOUR
+10B7B ; [.1209.0020.0002.10B7B][.0000.0190.0002.10B7B] # INSCRIPTIONAL PAHLAVI NUMBER FOUR
+10A43 ; [.1209.0020.0002.10A43][.0000.0191.0002.10A43] # KHAROSHTHI DIGIT FOUR
+1D363 ; [.1209.0020.0002.1D363][.0000.0192.0002.1D363] # COUNTING ROD UNIT DIGIT FOUR
+324B ; [.1209.0020.0006.324B][.1205.0020.0006.324B] # CIRCLED NUMBER FORTY ON BLACK SQUARE; QQKN
+32B5 ; [.1209.0020.0006.32B5][.1205.0020.0006.32B5] # CIRCLED NUMBER FORTY; QQKN
+32B6 ; [.1209.0020.0006.32B6][.1206.0020.0006.32B6] # CIRCLED NUMBER FORTY ONE; QQKN
+32B7 ; [.1209.0020.0006.32B7][.1207.0020.0006.32B7] # CIRCLED NUMBER FORTY TWO; QQKN
+32B8 ; [.1209.0020.0006.32B8][.1208.0020.0006.32B8] # CIRCLED NUMBER FORTY THREE; QQKN
+32B9 ; [.1209.0020.0006.32B9][.1209.0020.0006.32B9] # CIRCLED NUMBER FORTY FOUR; QQKN
+32BA ; [.1209.0020.0006.32BA][.120A.0020.0006.32BA] # CIRCLED NUMBER FORTY FIVE; QQKN
+2158 ; [.1209.0020.001E.2158][*035D.0020.001E.2158][.120A.0020.001F.2158] # VULGAR FRACTION FOUR FIFTHS; QQKN
+32BB ; [.1209.0020.0006.32BB][.120B.0020.0006.32BB] # CIRCLED NUMBER FORTY SIX; QQKN
+32BC ; [.1209.0020.0006.32BC][.120C.0020.0006.32BC] # CIRCLED NUMBER FORTY SEVEN; QQKN
+32BD ; [.1209.0020.0006.32BD][.120D.0020.0006.32BD] # CIRCLED NUMBER FORTY EIGHT; QQKN
+32BE ; [.1209.0020.0006.32BE][.120E.0020.0006.32BE] # CIRCLED NUMBER FORTY NINE; QQKN
+33E3 ; [.1209.0020.0004.33E3][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR; QQKN
+32C3 ; [.1209.0020.0004.32C3][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL; QQKN
+335C ; [.1209.0020.0004.335C][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR; QQKN
+0035 ; [.120A.0020.0002.0035] # DIGIT FIVE
+FF15 ; [.120A.0020.0003.FF15] # FULLWIDTH DIGIT FIVE; QQK
+2478 ; [*02FF.0020.0004.2478][.120A.0020.0004.2478][*0300.0020.001F.2478] # PARENTHESIZED DIGIT FIVE; QQKN
+248C ; [.120A.0020.0004.248C][*0281.0020.0004.248C] # DIGIT FIVE FULL STOP; QQKN
+1F106 ; [.120A.0020.0004.1F106][*0234.0020.0004.1F106] # DIGIT FIVE COMMA; QQKN
+1D7D3 ; [.120A.0020.0005.1D7D3] # MATHEMATICAL BOLD DIGIT FIVE; QQK
+1D7DD ; [.120A.0020.0005.1D7DD] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE; QQK
+1D7E7 ; [.120A.0020.0005.1D7E7] # MATHEMATICAL SANS-SERIF DIGIT FIVE; QQK
+1D7F1 ; [.120A.0020.0005.1D7F1] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE; QQK
+1D7FB ; [.120A.0020.0005.1D7FB] # MATHEMATICAL MONOSPACE DIGIT FIVE; QQK
+2464 ; [.120A.0020.0006.2464] # CIRCLED DIGIT FIVE; QQK
+24F9 ; [.120A.0020.0006.24F9] # DOUBLE CIRCLED DIGIT FIVE; QQK
+277A ; [.120A.0020.0006.277A] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE; QQK
+2784 ; [.120A.0020.0006.2784] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE; QQK
+278E ; [.120A.0020.0006.278E] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE; QQK
+2075 ; [.120A.0020.0014.2075] # SUPERSCRIPT FIVE; QQK
+2085 ; [.120A.0020.0015.2085] # SUBSCRIPT FIVE; QQK
+0665 ; [.120A.0020.0002.0665][.0000.015F.0002.0665] # ARABIC-INDIC DIGIT FIVE
+06F5 ; [.120A.0020.0002.06F5][.0000.0160.0002.06F5] # EXTENDED ARABIC-INDIC DIGIT FIVE
+10E64 ; [.120A.0020.0002.10E64][.0000.0161.0002.10E64] # RUMI DIGIT FIVE
+07C5 ; [.120A.0020.0002.07C5][.0000.0162.0002.07C5] # NKO DIGIT FIVE
+136D ; [.120A.0020.0002.136D][.0000.0163.0002.136D] # ETHIOPIC DIGIT FIVE
+104A5 ; [.120A.0020.0002.104A5][.0000.0164.0002.104A5] # OSMANYA DIGIT FIVE
+096B ; [.120A.0020.0002.096B][.0000.0165.0002.096B] # DEVANAGARI DIGIT FIVE
+09EB ; [.120A.0020.0002.09EB][.0000.0166.0002.09EB] # BENGALI DIGIT FIVE
+0A6B ; [.120A.0020.0002.0A6B][.0000.0167.0002.0A6B] # GURMUKHI DIGIT FIVE
+0AEB ; [.120A.0020.0002.0AEB][.0000.0168.0002.0AEB] # GUJARATI DIGIT FIVE
+0B6B ; [.120A.0020.0002.0B6B][.0000.0169.0002.0B6B] # ORIYA DIGIT FIVE
+0BEB ; [.120A.0020.0002.0BEB][.0000.016A.0002.0BEB] # TAMIL DIGIT FIVE
+0C6B ; [.120A.0020.0002.0C6B][.0000.016B.0002.0C6B] # TELUGU DIGIT FIVE
+0CEB ; [.120A.0020.0002.0CEB][.0000.016C.0002.0CEB] # KANNADA DIGIT FIVE
+0D6B ; [.120A.0020.0002.0D6B][.0000.016D.0002.0D6B] # MALAYALAM DIGIT FIVE
+ABF5 ; [.120A.0020.0002.ABF5][.0000.016E.0002.ABF5] # MEETEI MAYEK DIGIT FIVE
+A8D5 ; [.120A.0020.0002.A8D5][.0000.016F.0002.A8D5] # SAURASHTRA DIGIT FIVE
+194B ; [.120A.0020.0002.194B][.0000.0170.0002.194B] # LIMBU DIGIT FIVE
+19D5 ; [.120A.0020.0002.19D5][.0000.0171.0002.19D5] # NEW TAI LUE DIGIT FIVE
+1A85 ; [.120A.0020.0002.1A85][.0000.0173.0002.1A85] # TAI THAM HORA DIGIT FIVE
+1A95 ; [.120A.0020.0002.1A95][.0000.0174.0002.1A95] # TAI THAM THAM DIGIT FIVE
+0E55 ; [.120A.0020.0002.0E55][.0000.0175.0002.0E55] # THAI DIGIT FIVE
+0ED5 ; [.120A.0020.0002.0ED5][.0000.0176.0002.0ED5] # LAO DIGIT FIVE
+0F25 ; [.120A.0020.0002.0F25][.0000.0177.0002.0F25] # TIBETAN DIGIT FIVE
+0F2E ; [.120A.0020.0004.0F2E][.0000.0177.0004.0F2E] # TIBETAN DIGIT HALF FIVE; QQK
+1C45 ; [.120A.0020.0002.1C45][.0000.0178.0002.1C45] # LEPCHA DIGIT FIVE
+A905 ; [.120A.0020.0002.A905][.0000.0179.0002.A905] # KAYAH LI DIGIT FIVE
+1045 ; [.120A.0020.0002.1045][.0000.017A.0002.1045] # MYANMAR DIGIT FIVE
+1095 ; [.120A.0020.0002.1095][.0000.017B.0002.1095] # MYANMAR SHAN DIGIT FIVE
+17E5 ; [.120A.0020.0002.17E5][.0000.017C.0002.17E5] # KHMER DIGIT FIVE
+17F5 ; [.120A.0020.0002.17F5][.0000.017D.0002.17F5] # KHMER SYMBOL LEK ATTAK PRAM
+AA55 ; [.120A.0020.0002.AA55][.0000.017E.0002.AA55] # CHAM DIGIT FIVE
+1B55 ; [.120A.0020.0002.1B55][.0000.017F.0002.1B55] # BALINESE DIGIT FIVE
+A9D5 ; [.120A.0020.0002.A9D5][.0000.0180.0002.A9D5] # JAVANESE DIGIT FIVE
+1BB5 ; [.120A.0020.0002.1BB5][.0000.0181.0002.1BB5] # SUNDANESE DIGIT FIVE
+1815 ; [.120A.0020.0002.1815][.0000.0182.0002.1815] # MONGOLIAN DIGIT FIVE
+1C55 ; [.120A.0020.0002.1C55][.0000.0183.0002.1C55] # OL CHIKI DIGIT FIVE
+A625 ; [.120A.0020.0002.A625][.0000.0184.0002.A625] # VAI DIGIT FIVE
+3025 ; [.120A.0020.0002.3025][.0000.0185.0002.3025] # HANGZHOU NUMERAL FIVE
+1010B ; [.120A.0020.0002.1010B][.0000.0186.0002.1010B] # AEGEAN NUMBER FIVE
+10143 ; [.120A.0020.0002.10143][.0000.0187.0002.10143] # GREEK ACROPHONIC ATTIC FIVE
+10148 ; [.120A.0020.0002.10148][.0000.0187.0002.10148] # GREEK ACROPHONIC ATTIC FIVE TALENTS
+1014F ; [.120A.0020.0002.1014F][.0000.0187.0002.1014F] # GREEK ACROPHONIC ATTIC FIVE STATERS
+1015F ; [.120A.0020.0002.1015F][.0000.0187.0002.1015F] # GREEK ACROPHONIC TROEZENIAN FIVE
+10173 ; [.120A.0020.0002.10173][.0000.0187.0002.10173] # GREEK ACROPHONIC DELPHIC FIVE MNAS
+10321 ; [.120A.0020.0002.10321][.0000.0189.0002.10321] # OLD ITALIC NUMERAL FIVE
+12403 ; [.120A.0020.0002.12403][.0000.018B.0002.12403] # CUNEIFORM NUMERIC SIGN FIVE ASH
+1240A ; [.120A.0020.0002.1240A][.0000.018B.0002.1240A] # CUNEIFORM NUMERIC SIGN FIVE DISH
+12410 ; [.120A.0020.0002.12410][.0000.018B.0002.12410] # CUNEIFORM NUMERIC SIGN FIVE U
+12419 ; [.120A.0020.0002.12419][.0000.018B.0002.12419] # CUNEIFORM NUMERIC SIGN FIVE GESH2
+12422 ; [.120A.0020.0002.12422][.0000.018B.0002.12422] # CUNEIFORM NUMERIC SIGN FIVE GESHU
+12427 ; [.120A.0020.0002.12427][.0000.018B.0002.12427] # CUNEIFORM NUMERIC SIGN FIVE SHAR2
+12431 ; [.120A.0020.0002.12431][.0000.018B.0002.12431] # CUNEIFORM NUMERIC SIGN FIVE SHARU
+12439 ; [.120A.0020.0002.12439][.0000.018B.0002.12439] # CUNEIFORM NUMERIC SIGN FIVE BURU
+1244D ; [.120A.0020.0002.1244D][.0000.018B.0002.1244D] # CUNEIFORM NUMERIC SIGN FIVE ASH TENU
+12454 ; [.120A.0020.0002.12454][.0000.018B.0002.12454] # CUNEIFORM NUMERIC SIGN FIVE BAN2
+12455 ; [.120A.0020.0002.12455][.0000.018B.0002.12455] # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM
+1D364 ; [.120A.0020.0002.1D364][.0000.0192.0002.1D364] # COUNTING ROD UNIT DIGIT FIVE
+324C ; [.120A.0020.0006.324C][.1205.0020.0006.324C] # CIRCLED NUMBER FIFTY ON BLACK SQUARE; QQKN
+32BF ; [.120A.0020.0006.32BF][.1205.0020.0006.32BF] # CIRCLED NUMBER FIFTY; QQKN
+215A ; [.120A.0020.001E.215A][*035D.0020.001E.215A][.120B.0020.001F.215A] # VULGAR FRACTION FIVE SIXTHS; QQKN
+215D ; [.120A.0020.001E.215D][*035D.0020.001E.215D][.120D.0020.001F.215D] # VULGAR FRACTION FIVE EIGHTHS; QQKN
+33E4 ; [.120A.0020.0004.33E4][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE; QQKN
+32C4 ; [.120A.0020.0004.32C4][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY; QQKN
+335D ; [.120A.0020.0004.335D][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE; QQKN
+0036 ; [.120B.0020.0002.0036] # DIGIT SIX
+FF16 ; [.120B.0020.0003.FF16] # FULLWIDTH DIGIT SIX; QQK
+2479 ; [*02FF.0020.0004.2479][.120B.0020.0004.2479][*0300.0020.001F.2479] # PARENTHESIZED DIGIT SIX; QQKN
+248D ; [.120B.0020.0004.248D][*0281.0020.0004.248D] # DIGIT SIX FULL STOP; QQKN
+1F107 ; [.120B.0020.0004.1F107][*0234.0020.0004.1F107] # DIGIT SIX COMMA; QQKN
+1D7D4 ; [.120B.0020.0005.1D7D4] # MATHEMATICAL BOLD DIGIT SIX; QQK
+1D7DE ; [.120B.0020.0005.1D7DE] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX; QQK
+1D7E8 ; [.120B.0020.0005.1D7E8] # MATHEMATICAL SANS-SERIF DIGIT SIX; QQK
+1D7F2 ; [.120B.0020.0005.1D7F2] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX; QQK
+1D7FC ; [.120B.0020.0005.1D7FC] # MATHEMATICAL MONOSPACE DIGIT SIX; QQK
+2465 ; [.120B.0020.0006.2465] # CIRCLED DIGIT SIX; QQK
+24FA ; [.120B.0020.0006.24FA] # DOUBLE CIRCLED DIGIT SIX; QQK
+277B ; [.120B.0020.0006.277B] # DINGBAT NEGATIVE CIRCLED DIGIT SIX; QQK
+2785 ; [.120B.0020.0006.2785] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX; QQK
+278F ; [.120B.0020.0006.278F] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX; QQK
+2076 ; [.120B.0020.0014.2076] # SUPERSCRIPT SIX; QQK
+2086 ; [.120B.0020.0015.2086] # SUBSCRIPT SIX; QQK
+0666 ; [.120B.0020.0002.0666][.0000.015F.0002.0666] # ARABIC-INDIC DIGIT SIX
+06F6 ; [.120B.0020.0002.06F6][.0000.0160.0002.06F6] # EXTENDED ARABIC-INDIC DIGIT SIX
+10E65 ; [.120B.0020.0002.10E65][.0000.0161.0002.10E65] # RUMI DIGIT SIX
+07C6 ; [.120B.0020.0002.07C6][.0000.0162.0002.07C6] # NKO DIGIT SIX
+136E ; [.120B.0020.0002.136E][.0000.0163.0002.136E] # ETHIOPIC DIGIT SIX
+104A6 ; [.120B.0020.0002.104A6][.0000.0164.0002.104A6] # OSMANYA DIGIT SIX
+096C ; [.120B.0020.0002.096C][.0000.0165.0002.096C] # DEVANAGARI DIGIT SIX
+09EC ; [.120B.0020.0002.09EC][.0000.0166.0002.09EC] # BENGALI DIGIT SIX
+0A6C ; [.120B.0020.0002.0A6C][.0000.0167.0002.0A6C] # GURMUKHI DIGIT SIX
+0AEC ; [.120B.0020.0002.0AEC][.0000.0168.0002.0AEC] # GUJARATI DIGIT SIX
+0B6C ; [.120B.0020.0002.0B6C][.0000.0169.0002.0B6C] # ORIYA DIGIT SIX
+0BEC ; [.120B.0020.0002.0BEC][.0000.016A.0002.0BEC] # TAMIL DIGIT SIX
+0C6C ; [.120B.0020.0002.0C6C][.0000.016B.0002.0C6C] # TELUGU DIGIT SIX
+0CEC ; [.120B.0020.0002.0CEC][.0000.016C.0002.0CEC] # KANNADA DIGIT SIX
+0D6C ; [.120B.0020.0002.0D6C][.0000.016D.0002.0D6C] # MALAYALAM DIGIT SIX
+ABF6 ; [.120B.0020.0002.ABF6][.0000.016E.0002.ABF6] # MEETEI MAYEK DIGIT SIX
+A8D6 ; [.120B.0020.0002.A8D6][.0000.016F.0002.A8D6] # SAURASHTRA DIGIT SIX
+194C ; [.120B.0020.0002.194C][.0000.0170.0002.194C] # LIMBU DIGIT SIX
+19D6 ; [.120B.0020.0002.19D6][.0000.0171.0002.19D6] # NEW TAI LUE DIGIT SIX
+1A86 ; [.120B.0020.0002.1A86][.0000.0173.0002.1A86] # TAI THAM HORA DIGIT SIX
+1A96 ; [.120B.0020.0002.1A96][.0000.0174.0002.1A96] # TAI THAM THAM DIGIT SIX
+0E56 ; [.120B.0020.0002.0E56][.0000.0175.0002.0E56] # THAI DIGIT SIX
+0ED6 ; [.120B.0020.0002.0ED6][.0000.0176.0002.0ED6] # LAO DIGIT SIX
+0F26 ; [.120B.0020.0002.0F26][.0000.0177.0002.0F26] # TIBETAN DIGIT SIX
+0F2F ; [.120B.0020.0004.0F2F][.0000.0177.0004.0F2F] # TIBETAN DIGIT HALF SIX; QQK
+1C46 ; [.120B.0020.0002.1C46][.0000.0178.0002.1C46] # LEPCHA DIGIT SIX
+A906 ; [.120B.0020.0002.A906][.0000.0179.0002.A906] # KAYAH LI DIGIT SIX
+1046 ; [.120B.0020.0002.1046][.0000.017A.0002.1046] # MYANMAR DIGIT SIX
+1096 ; [.120B.0020.0002.1096][.0000.017B.0002.1096] # MYANMAR SHAN DIGIT SIX
+17E6 ; [.120B.0020.0002.17E6][.0000.017C.0002.17E6] # KHMER DIGIT SIX
+17F6 ; [.120B.0020.0002.17F6][.0000.017D.0002.17F6] # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+AA56 ; [.120B.0020.0002.AA56][.0000.017E.0002.AA56] # CHAM DIGIT SIX
+1B56 ; [.120B.0020.0002.1B56][.0000.017F.0002.1B56] # BALINESE DIGIT SIX
+A9D6 ; [.120B.0020.0002.A9D6][.0000.0180.0002.A9D6] # JAVANESE DIGIT SIX
+1BB6 ; [.120B.0020.0002.1BB6][.0000.0181.0002.1BB6] # SUNDANESE DIGIT SIX
+1816 ; [.120B.0020.0002.1816][.0000.0182.0002.1816] # MONGOLIAN DIGIT SIX
+1C56 ; [.120B.0020.0002.1C56][.0000.0183.0002.1C56] # OL CHIKI DIGIT SIX
+A626 ; [.120B.0020.0002.A626][.0000.0184.0002.A626] # VAI DIGIT SIX
+3026 ; [.120B.0020.0002.3026][.0000.0185.0002.3026] # HANGZHOU NUMERAL SIX
+1010C ; [.120B.0020.0002.1010C][.0000.0186.0002.1010C] # AEGEAN NUMBER SIX
+2185 ; [.120B.0020.0002.2185][.0000.0188.0002.2185] # ROMAN NUMERAL SIX LATE FORM
+12404 ; [.120B.0020.0002.12404][.0000.018B.0002.12404] # CUNEIFORM NUMERIC SIGN SIX ASH
+1240B ; [.120B.0020.0002.1240B][.0000.018B.0002.1240B] # CUNEIFORM NUMERIC SIGN SIX DISH
+12411 ; [.120B.0020.0002.12411][.0000.018B.0002.12411] # CUNEIFORM NUMERIC SIGN SIX U
+1241A ; [.120B.0020.0002.1241A][.0000.018B.0002.1241A] # CUNEIFORM NUMERIC SIGN SIX GESH2
+12428 ; [.120B.0020.0002.12428][.0000.018B.0002.12428] # CUNEIFORM NUMERIC SIGN SIX SHAR2
+12440 ; [.120B.0020.0002.12440][.0000.018B.0002.12440] # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9
+1244E ; [.120B.0020.0002.1244E][.0000.018B.0002.1244E] # CUNEIFORM NUMERIC SIGN SIX ASH TENU
+1D365 ; [.120B.0020.0002.1D365][.0000.0192.0002.1D365] # COUNTING ROD UNIT DIGIT SIX
+324D ; [.120B.0020.0006.324D][.1205.0020.0006.324D] # CIRCLED NUMBER SIXTY ON BLACK SQUARE; QQKN
+33E5 ; [.120B.0020.0004.33E5][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX; QQKN
+32C5 ; [.120B.0020.0004.32C5][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE; QQKN
+335E ; [.120B.0020.0004.335E][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX; QQKN
+0037 ; [.120C.0020.0002.0037] # DIGIT SEVEN
+FF17 ; [.120C.0020.0003.FF17] # FULLWIDTH DIGIT SEVEN; QQK
+247A ; [*02FF.0020.0004.247A][.120C.0020.0004.247A][*0300.0020.001F.247A] # PARENTHESIZED DIGIT SEVEN; QQKN
+248E ; [.120C.0020.0004.248E][*0281.0020.0004.248E] # DIGIT SEVEN FULL STOP; QQKN
+1F108 ; [.120C.0020.0004.1F108][*0234.0020.0004.1F108] # DIGIT SEVEN COMMA; QQKN
+1D7D5 ; [.120C.0020.0005.1D7D5] # MATHEMATICAL BOLD DIGIT SEVEN; QQK
+1D7DF ; [.120C.0020.0005.1D7DF] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN; QQK
+1D7E9 ; [.120C.0020.0005.1D7E9] # MATHEMATICAL SANS-SERIF DIGIT SEVEN; QQK
+1D7F3 ; [.120C.0020.0005.1D7F3] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN; QQK
+1D7FD ; [.120C.0020.0005.1D7FD] # MATHEMATICAL MONOSPACE DIGIT SEVEN; QQK
+2466 ; [.120C.0020.0006.2466] # CIRCLED DIGIT SEVEN; QQK
+24FB ; [.120C.0020.0006.24FB] # DOUBLE CIRCLED DIGIT SEVEN; QQK
+277C ; [.120C.0020.0006.277C] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN; QQK
+2786 ; [.120C.0020.0006.2786] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN; QQK
+2790 ; [.120C.0020.0006.2790] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN; QQK
+2077 ; [.120C.0020.0014.2077] # SUPERSCRIPT SEVEN; QQK
+2087 ; [.120C.0020.0015.2087] # SUBSCRIPT SEVEN; QQK
+0667 ; [.120C.0020.0002.0667][.0000.015F.0002.0667] # ARABIC-INDIC DIGIT SEVEN
+06F7 ; [.120C.0020.0002.06F7][.0000.0160.0002.06F7] # EXTENDED ARABIC-INDIC DIGIT SEVEN
+10E66 ; [.120C.0020.0002.10E66][.0000.0161.0002.10E66] # RUMI DIGIT SEVEN
+07C7 ; [.120C.0020.0002.07C7][.0000.0162.0002.07C7] # NKO DIGIT SEVEN
+136F ; [.120C.0020.0002.136F][.0000.0163.0002.136F] # ETHIOPIC DIGIT SEVEN
+104A7 ; [.120C.0020.0002.104A7][.0000.0164.0002.104A7] # OSMANYA DIGIT SEVEN
+096D ; [.120C.0020.0002.096D][.0000.0165.0002.096D] # DEVANAGARI DIGIT SEVEN
+09ED ; [.120C.0020.0002.09ED][.0000.0166.0002.09ED] # BENGALI DIGIT SEVEN
+0A6D ; [.120C.0020.0002.0A6D][.0000.0167.0002.0A6D] # GURMUKHI DIGIT SEVEN
+0AED ; [.120C.0020.0002.0AED][.0000.0168.0002.0AED] # GUJARATI DIGIT SEVEN
+0B6D ; [.120C.0020.0002.0B6D][.0000.0169.0002.0B6D] # ORIYA DIGIT SEVEN
+0BED ; [.120C.0020.0002.0BED][.0000.016A.0002.0BED] # TAMIL DIGIT SEVEN
+0C6D ; [.120C.0020.0002.0C6D][.0000.016B.0002.0C6D] # TELUGU DIGIT SEVEN
+0CED ; [.120C.0020.0002.0CED][.0000.016C.0002.0CED] # KANNADA DIGIT SEVEN
+0D6D ; [.120C.0020.0002.0D6D][.0000.016D.0002.0D6D] # MALAYALAM DIGIT SEVEN
+ABF7 ; [.120C.0020.0002.ABF7][.0000.016E.0002.ABF7] # MEETEI MAYEK DIGIT SEVEN
+A8D7 ; [.120C.0020.0002.A8D7][.0000.016F.0002.A8D7] # SAURASHTRA DIGIT SEVEN
+194D ; [.120C.0020.0002.194D][.0000.0170.0002.194D] # LIMBU DIGIT SEVEN
+19D7 ; [.120C.0020.0002.19D7][.0000.0171.0002.19D7] # NEW TAI LUE DIGIT SEVEN
+1A87 ; [.120C.0020.0002.1A87][.0000.0173.0002.1A87] # TAI THAM HORA DIGIT SEVEN
+1A97 ; [.120C.0020.0002.1A97][.0000.0174.0002.1A97] # TAI THAM THAM DIGIT SEVEN
+0E57 ; [.120C.0020.0002.0E57][.0000.0175.0002.0E57] # THAI DIGIT SEVEN
+0ED7 ; [.120C.0020.0002.0ED7][.0000.0176.0002.0ED7] # LAO DIGIT SEVEN
+0F27 ; [.120C.0020.0002.0F27][.0000.0177.0002.0F27] # TIBETAN DIGIT SEVEN
+0F30 ; [.120C.0020.0004.0F30][.0000.0177.0004.0F30] # TIBETAN DIGIT HALF SEVEN; QQK
+1C47 ; [.120C.0020.0002.1C47][.0000.0178.0002.1C47] # LEPCHA DIGIT SEVEN
+A907 ; [.120C.0020.0002.A907][.0000.0179.0002.A907] # KAYAH LI DIGIT SEVEN
+1047 ; [.120C.0020.0002.1047][.0000.017A.0002.1047] # MYANMAR DIGIT SEVEN
+1097 ; [.120C.0020.0002.1097][.0000.017B.0002.1097] # MYANMAR SHAN DIGIT SEVEN
+17E7 ; [.120C.0020.0002.17E7][.0000.017C.0002.17E7] # KHMER DIGIT SEVEN
+17F7 ; [.120C.0020.0002.17F7][.0000.017D.0002.17F7] # KHMER SYMBOL LEK ATTAK PRAM-PII
+AA57 ; [.120C.0020.0002.AA57][.0000.017E.0002.AA57] # CHAM DIGIT SEVEN
+1B57 ; [.120C.0020.0002.1B57][.0000.017F.0002.1B57] # BALINESE DIGIT SEVEN
+A9D7 ; [.120C.0020.0002.A9D7][.0000.0180.0002.A9D7] # JAVANESE DIGIT SEVEN
+1BB7 ; [.120C.0020.0002.1BB7][.0000.0181.0002.1BB7] # SUNDANESE DIGIT SEVEN
+1817 ; [.120C.0020.0002.1817][.0000.0182.0002.1817] # MONGOLIAN DIGIT SEVEN
+1C57 ; [.120C.0020.0002.1C57][.0000.0183.0002.1C57] # OL CHIKI DIGIT SEVEN
+A627 ; [.120C.0020.0002.A627][.0000.0184.0002.A627] # VAI DIGIT SEVEN
+3027 ; [.120C.0020.0002.3027][.0000.0185.0002.3027] # HANGZHOU NUMERAL SEVEN
+1010D ; [.120C.0020.0002.1010D][.0000.0186.0002.1010D] # AEGEAN NUMBER SEVEN
+12405 ; [.120C.0020.0002.12405][.0000.018B.0002.12405] # CUNEIFORM NUMERIC SIGN SEVEN ASH
+1240C ; [.120C.0020.0002.1240C][.0000.018B.0002.1240C] # CUNEIFORM NUMERIC SIGN SEVEN DISH
+12412 ; [.120C.0020.0002.12412][.0000.018B.0002.12412] # CUNEIFORM NUMERIC SIGN SEVEN U
+1241B ; [.120C.0020.0002.1241B][.0000.018B.0002.1241B] # CUNEIFORM NUMERIC SIGN SEVEN GESH2
+12429 ; [.120C.0020.0002.12429][.0000.018B.0002.12429] # CUNEIFORM NUMERIC SIGN SEVEN SHAR2
+12441 ; [.120C.0020.0002.12441][.0000.018B.0002.12441] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3
+12442 ; [.120C.0020.0002.12442][.0000.018B.0002.12442] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A
+12443 ; [.120C.0020.0002.12443][.0000.018B.0002.12443] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B
+1D366 ; [.120C.0020.0002.1D366][.0000.0192.0002.1D366] # COUNTING ROD UNIT DIGIT SEVEN
+324E ; [.120C.0020.0006.324E][.1205.0020.0006.324E] # CIRCLED NUMBER SEVENTY ON BLACK SQUARE; QQKN
+215E ; [.120C.0020.001E.215E][*035D.0020.001E.215E][.120D.0020.001F.215E] # VULGAR FRACTION SEVEN EIGHTHS; QQKN
+33E6 ; [.120C.0020.0004.33E6][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN; QQKN
+32C6 ; [.120C.0020.0004.32C6][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY; QQKN
+335F ; [.120C.0020.0004.335F][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN; QQKN
+0038 ; [.120D.0020.0002.0038] # DIGIT EIGHT
+FF18 ; [.120D.0020.0003.FF18] # FULLWIDTH DIGIT EIGHT; QQK
+247B ; [*02FF.0020.0004.247B][.120D.0020.0004.247B][*0300.0020.001F.247B] # PARENTHESIZED DIGIT EIGHT; QQKN
+248F ; [.120D.0020.0004.248F][*0281.0020.0004.248F] # DIGIT EIGHT FULL STOP; QQKN
+1F109 ; [.120D.0020.0004.1F109][*0234.0020.0004.1F109] # DIGIT EIGHT COMMA; QQKN
+1D7D6 ; [.120D.0020.0005.1D7D6] # MATHEMATICAL BOLD DIGIT EIGHT; QQK
+1D7E0 ; [.120D.0020.0005.1D7E0] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT; QQK
+1D7EA ; [.120D.0020.0005.1D7EA] # MATHEMATICAL SANS-SERIF DIGIT EIGHT; QQK
+1D7F4 ; [.120D.0020.0005.1D7F4] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT; QQK
+1D7FE ; [.120D.0020.0005.1D7FE] # MATHEMATICAL MONOSPACE DIGIT EIGHT; QQK
+2467 ; [.120D.0020.0006.2467] # CIRCLED DIGIT EIGHT; QQK
+24FC ; [.120D.0020.0006.24FC] # DOUBLE CIRCLED DIGIT EIGHT; QQK
+277D ; [.120D.0020.0006.277D] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT; QQK
+2787 ; [.120D.0020.0006.2787] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT; QQK
+2791 ; [.120D.0020.0006.2791] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT; QQK
+2078 ; [.120D.0020.0014.2078] # SUPERSCRIPT EIGHT; QQK
+2088 ; [.120D.0020.0015.2088] # SUBSCRIPT EIGHT; QQK
+0668 ; [.120D.0020.0002.0668][.0000.015F.0002.0668] # ARABIC-INDIC DIGIT EIGHT
+06F8 ; [.120D.0020.0002.06F8][.0000.0160.0002.06F8] # EXTENDED ARABIC-INDIC DIGIT EIGHT
+10E67 ; [.120D.0020.0002.10E67][.0000.0161.0002.10E67] # RUMI DIGIT EIGHT
+07C8 ; [.120D.0020.0002.07C8][.0000.0162.0002.07C8] # NKO DIGIT EIGHT
+1370 ; [.120D.0020.0002.1370][.0000.0163.0002.1370] # ETHIOPIC DIGIT EIGHT
+104A8 ; [.120D.0020.0002.104A8][.0000.0164.0002.104A8] # OSMANYA DIGIT EIGHT
+096E ; [.120D.0020.0002.096E][.0000.0165.0002.096E] # DEVANAGARI DIGIT EIGHT
+09EE ; [.120D.0020.0002.09EE][.0000.0166.0002.09EE] # BENGALI DIGIT EIGHT
+0A6E ; [.120D.0020.0002.0A6E][.0000.0167.0002.0A6E] # GURMUKHI DIGIT EIGHT
+0AEE ; [.120D.0020.0002.0AEE][.0000.0168.0002.0AEE] # GUJARATI DIGIT EIGHT
+0B6E ; [.120D.0020.0002.0B6E][.0000.0169.0002.0B6E] # ORIYA DIGIT EIGHT
+0BEE ; [.120D.0020.0002.0BEE][.0000.016A.0002.0BEE] # TAMIL DIGIT EIGHT
+0C6E ; [.120D.0020.0002.0C6E][.0000.016B.0002.0C6E] # TELUGU DIGIT EIGHT
+0CEE ; [.120D.0020.0002.0CEE][.0000.016C.0002.0CEE] # KANNADA DIGIT EIGHT
+0D6E ; [.120D.0020.0002.0D6E][.0000.016D.0002.0D6E] # MALAYALAM DIGIT EIGHT
+ABF8 ; [.120D.0020.0002.ABF8][.0000.016E.0002.ABF8] # MEETEI MAYEK DIGIT EIGHT
+A8D8 ; [.120D.0020.0002.A8D8][.0000.016F.0002.A8D8] # SAURASHTRA DIGIT EIGHT
+194E ; [.120D.0020.0002.194E][.0000.0170.0002.194E] # LIMBU DIGIT EIGHT
+19D8 ; [.120D.0020.0002.19D8][.0000.0171.0002.19D8] # NEW TAI LUE DIGIT EIGHT
+1A88 ; [.120D.0020.0002.1A88][.0000.0173.0002.1A88] # TAI THAM HORA DIGIT EIGHT
+1A98 ; [.120D.0020.0002.1A98][.0000.0174.0002.1A98] # TAI THAM THAM DIGIT EIGHT
+0E58 ; [.120D.0020.0002.0E58][.0000.0175.0002.0E58] # THAI DIGIT EIGHT
+0ED8 ; [.120D.0020.0002.0ED8][.0000.0176.0002.0ED8] # LAO DIGIT EIGHT
+0F28 ; [.120D.0020.0002.0F28][.0000.0177.0002.0F28] # TIBETAN DIGIT EIGHT
+0F31 ; [.120D.0020.0004.0F31][.0000.0177.0004.0F31] # TIBETAN DIGIT HALF EIGHT; QQK
+1C48 ; [.120D.0020.0002.1C48][.0000.0178.0002.1C48] # LEPCHA DIGIT EIGHT
+A908 ; [.120D.0020.0002.A908][.0000.0179.0002.A908] # KAYAH LI DIGIT EIGHT
+1048 ; [.120D.0020.0002.1048][.0000.017A.0002.1048] # MYANMAR DIGIT EIGHT
+1098 ; [.120D.0020.0002.1098][.0000.017B.0002.1098] # MYANMAR SHAN DIGIT EIGHT
+17E8 ; [.120D.0020.0002.17E8][.0000.017C.0002.17E8] # KHMER DIGIT EIGHT
+17F8 ; [.120D.0020.0002.17F8][.0000.017D.0002.17F8] # KHMER SYMBOL LEK ATTAK PRAM-BEI
+AA58 ; [.120D.0020.0002.AA58][.0000.017E.0002.AA58] # CHAM DIGIT EIGHT
+1B58 ; [.120D.0020.0002.1B58][.0000.017F.0002.1B58] # BALINESE DIGIT EIGHT
+A9D8 ; [.120D.0020.0002.A9D8][.0000.0180.0002.A9D8] # JAVANESE DIGIT EIGHT
+1BB8 ; [.120D.0020.0002.1BB8][.0000.0181.0002.1BB8] # SUNDANESE DIGIT EIGHT
+1818 ; [.120D.0020.0002.1818][.0000.0182.0002.1818] # MONGOLIAN DIGIT EIGHT
+1C58 ; [.120D.0020.0002.1C58][.0000.0183.0002.1C58] # OL CHIKI DIGIT EIGHT
+A628 ; [.120D.0020.0002.A628][.0000.0184.0002.A628] # VAI DIGIT EIGHT
+3028 ; [.120D.0020.0002.3028][.0000.0185.0002.3028] # HANGZHOU NUMERAL EIGHT
+1010E ; [.120D.0020.0002.1010E][.0000.0186.0002.1010E] # AEGEAN NUMBER EIGHT
+12406 ; [.120D.0020.0002.12406][.0000.018B.0002.12406] # CUNEIFORM NUMERIC SIGN EIGHT ASH
+1240D ; [.120D.0020.0002.1240D][.0000.018B.0002.1240D] # CUNEIFORM NUMERIC SIGN EIGHT DISH
+12413 ; [.120D.0020.0002.12413][.0000.018B.0002.12413] # CUNEIFORM NUMERIC SIGN EIGHT U
+1241C ; [.120D.0020.0002.1241C][.0000.018B.0002.1241C] # CUNEIFORM NUMERIC SIGN EIGHT GESH2
+1242A ; [.120D.0020.0002.1242A][.0000.018B.0002.1242A] # CUNEIFORM NUMERIC SIGN EIGHT SHAR2
+12444 ; [.120D.0020.0002.12444][.0000.018B.0002.12444] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU
+12445 ; [.120D.0020.0002.12445][.0000.018B.0002.12445] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3
+1D367 ; [.120D.0020.0002.1D367][.0000.0192.0002.1D367] # COUNTING ROD UNIT DIGIT EIGHT
+324F ; [.120D.0020.0006.324F][.1205.0020.0006.324F] # CIRCLED NUMBER EIGHTY ON BLACK SQUARE; QQKN
+33E7 ; [.120D.0020.0004.33E7][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT; QQKN
+32C7 ; [.120D.0020.0004.32C7][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST; QQKN
+3360 ; [.120D.0020.0004.3360][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT; QQKN
+0039 ; [.120E.0020.0002.0039] # DIGIT NINE
+FF19 ; [.120E.0020.0003.FF19] # FULLWIDTH DIGIT NINE; QQK
+247C ; [*02FF.0020.0004.247C][.120E.0020.0004.247C][*0300.0020.001F.247C] # PARENTHESIZED DIGIT NINE; QQKN
+2490 ; [.120E.0020.0004.2490][*0281.0020.0004.2490] # DIGIT NINE FULL STOP; QQKN
+1F10A ; [.120E.0020.0004.1F10A][*0234.0020.0004.1F10A] # DIGIT NINE COMMA; QQKN
+1D7D7 ; [.120E.0020.0005.1D7D7] # MATHEMATICAL BOLD DIGIT NINE; QQK
+1D7E1 ; [.120E.0020.0005.1D7E1] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE; QQK
+1D7EB ; [.120E.0020.0005.1D7EB] # MATHEMATICAL SANS-SERIF DIGIT NINE; QQK
+1D7F5 ; [.120E.0020.0005.1D7F5] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE; QQK
+1D7FF ; [.120E.0020.0005.1D7FF] # MATHEMATICAL MONOSPACE DIGIT NINE; QQK
+2468 ; [.120E.0020.0006.2468] # CIRCLED DIGIT NINE; QQK
+24FD ; [.120E.0020.0006.24FD] # DOUBLE CIRCLED DIGIT NINE; QQK
+277E ; [.120E.0020.0006.277E] # DINGBAT NEGATIVE CIRCLED DIGIT NINE; QQK
+2788 ; [.120E.0020.0006.2788] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE; QQK
+2792 ; [.120E.0020.0006.2792] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE; QQK
+2079 ; [.120E.0020.0014.2079] # SUPERSCRIPT NINE; QQK
+2089 ; [.120E.0020.0015.2089] # SUBSCRIPT NINE; QQK
+0669 ; [.120E.0020.0002.0669][.0000.015F.0002.0669] # ARABIC-INDIC DIGIT NINE
+06F9 ; [.120E.0020.0002.06F9][.0000.0160.0002.06F9] # EXTENDED ARABIC-INDIC DIGIT NINE
+10E68 ; [.120E.0020.0002.10E68][.0000.0161.0002.10E68] # RUMI DIGIT NINE
+07C9 ; [.120E.0020.0002.07C9][.0000.0162.0002.07C9] # NKO DIGIT NINE
+1371 ; [.120E.0020.0002.1371][.0000.0163.0002.1371] # ETHIOPIC DIGIT NINE
+104A9 ; [.120E.0020.0002.104A9][.0000.0164.0002.104A9] # OSMANYA DIGIT NINE
+096F ; [.120E.0020.0002.096F][.0000.0165.0002.096F] # DEVANAGARI DIGIT NINE
+09EF ; [.120E.0020.0002.09EF][.0000.0166.0002.09EF] # BENGALI DIGIT NINE
+0A6F ; [.120E.0020.0002.0A6F][.0000.0167.0002.0A6F] # GURMUKHI DIGIT NINE
+0AEF ; [.120E.0020.0002.0AEF][.0000.0168.0002.0AEF] # GUJARATI DIGIT NINE
+0B6F ; [.120E.0020.0002.0B6F][.0000.0169.0002.0B6F] # ORIYA DIGIT NINE
+0BEF ; [.120E.0020.0002.0BEF][.0000.016A.0002.0BEF] # TAMIL DIGIT NINE
+0C6F ; [.120E.0020.0002.0C6F][.0000.016B.0002.0C6F] # TELUGU DIGIT NINE
+0CEF ; [.120E.0020.0002.0CEF][.0000.016C.0002.0CEF] # KANNADA DIGIT NINE
+0D6F ; [.120E.0020.0002.0D6F][.0000.016D.0002.0D6F] # MALAYALAM DIGIT NINE
+ABF9 ; [.120E.0020.0002.ABF9][.0000.016E.0002.ABF9] # MEETEI MAYEK DIGIT NINE
+A8D9 ; [.120E.0020.0002.A8D9][.0000.016F.0002.A8D9] # SAURASHTRA DIGIT NINE
+194F ; [.120E.0020.0002.194F][.0000.0170.0002.194F] # LIMBU DIGIT NINE
+19D9 ; [.120E.0020.0002.19D9][.0000.0171.0002.19D9] # NEW TAI LUE DIGIT NINE
+1A89 ; [.120E.0020.0002.1A89][.0000.0173.0002.1A89] # TAI THAM HORA DIGIT NINE
+1A99 ; [.120E.0020.0002.1A99][.0000.0174.0002.1A99] # TAI THAM THAM DIGIT NINE
+0E59 ; [.120E.0020.0002.0E59][.0000.0175.0002.0E59] # THAI DIGIT NINE
+0ED9 ; [.120E.0020.0002.0ED9][.0000.0176.0002.0ED9] # LAO DIGIT NINE
+0F29 ; [.120E.0020.0002.0F29][.0000.0177.0002.0F29] # TIBETAN DIGIT NINE
+0F32 ; [.120E.0020.0004.0F32][.0000.0177.0004.0F32] # TIBETAN DIGIT HALF NINE; QQK
+1C49 ; [.120E.0020.0002.1C49][.0000.0178.0002.1C49] # LEPCHA DIGIT NINE
+A909 ; [.120E.0020.0002.A909][.0000.0179.0002.A909] # KAYAH LI DIGIT NINE
+1049 ; [.120E.0020.0002.1049][.0000.017A.0002.1049] # MYANMAR DIGIT NINE
+1099 ; [.120E.0020.0002.1099][.0000.017B.0002.1099] # MYANMAR SHAN DIGIT NINE
+17E9 ; [.120E.0020.0002.17E9][.0000.017C.0002.17E9] # KHMER DIGIT NINE
+17F9 ; [.120E.0020.0002.17F9][.0000.017D.0002.17F9] # KHMER SYMBOL LEK ATTAK PRAM-BUON
+AA59 ; [.120E.0020.0002.AA59][.0000.017E.0002.AA59] # CHAM DIGIT NINE
+1B59 ; [.120E.0020.0002.1B59][.0000.017F.0002.1B59] # BALINESE DIGIT NINE
+A9D9 ; [.120E.0020.0002.A9D9][.0000.0180.0002.A9D9] # JAVANESE DIGIT NINE
+1BB9 ; [.120E.0020.0002.1BB9][.0000.0181.0002.1BB9] # SUNDANESE DIGIT NINE
+1819 ; [.120E.0020.0002.1819][.0000.0182.0002.1819] # MONGOLIAN DIGIT NINE
+1C59 ; [.120E.0020.0002.1C59][.0000.0183.0002.1C59] # OL CHIKI DIGIT NINE
+A629 ; [.120E.0020.0002.A629][.0000.0184.0002.A629] # VAI DIGIT NINE
+3029 ; [.120E.0020.0002.3029][.0000.0185.0002.3029] # HANGZHOU NUMERAL NINE
+1010F ; [.120E.0020.0002.1010F][.0000.0186.0002.1010F] # AEGEAN NUMBER NINE
+12407 ; [.120E.0020.0002.12407][.0000.018B.0002.12407] # CUNEIFORM NUMERIC SIGN NINE ASH
+1240E ; [.120E.0020.0002.1240E][.0000.018B.0002.1240E] # CUNEIFORM NUMERIC SIGN NINE DISH
+12414 ; [.120E.0020.0002.12414][.0000.018B.0002.12414] # CUNEIFORM NUMERIC SIGN NINE U
+1241D ; [.120E.0020.0002.1241D][.0000.018B.0002.1241D] # CUNEIFORM NUMERIC SIGN NINE GESH2
+1242B ; [.120E.0020.0002.1242B][.0000.018B.0002.1242B] # CUNEIFORM NUMERIC SIGN NINE SHAR2
+12446 ; [.120E.0020.0002.12446][.0000.018B.0002.12446] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU
+12447 ; [.120E.0020.0002.12447][.0000.018B.0002.12447] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3
+12448 ; [.120E.0020.0002.12448][.0000.018B.0002.12448] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4
+12449 ; [.120E.0020.0002.12449][.0000.018B.0002.12449] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A
+1D368 ; [.120E.0020.0002.1D368][.0000.0192.0002.1D368] # COUNTING ROD UNIT DIGIT NINE
+33E8 ; [.120E.0020.0004.33E8][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE; QQKN
+32C8 ; [.120E.0020.0004.32C8][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER; QQKN
+3361 ; [.120E.0020.0004.3361][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE; QQKN
+0061 ; [.120F.0020.0002.0061] # LATIN SMALL LETTER A
+FF41 ; [.120F.0020.0003.FF41] # FULLWIDTH LATIN SMALL LETTER A; QQK
+0363 ; [.120F.0020.0004.0363] # COMBINING LATIN SMALL LETTER A; QQK
+249C ; [*02FF.0020.0004.249C][.120F.0020.0004.249C][*0300.0020.001F.249C] # PARENTHESIZED LATIN SMALL LETTER A; QQKN
+1D41A ; [.120F.0020.0005.1D41A] # MATHEMATICAL BOLD SMALL A; QQK
+1D44E ; [.120F.0020.0005.1D44E] # MATHEMATICAL ITALIC SMALL A; QQK
+1D482 ; [.120F.0020.0005.1D482] # MATHEMATICAL BOLD ITALIC SMALL A; QQK
+1D4B6 ; [.120F.0020.0005.1D4B6] # MATHEMATICAL SCRIPT SMALL A; QQK
+1D4EA ; [.120F.0020.0005.1D4EA] # MATHEMATICAL BOLD SCRIPT SMALL A; QQK
+1D51E ; [.120F.0020.0005.1D51E] # MATHEMATICAL FRAKTUR SMALL A; QQK
+1D552 ; [.120F.0020.0005.1D552] # MATHEMATICAL DOUBLE-STRUCK SMALL A; QQK
+1D586 ; [.120F.0020.0005.1D586] # MATHEMATICAL BOLD FRAKTUR SMALL A; QQK
+1D5BA ; [.120F.0020.0005.1D5BA] # MATHEMATICAL SANS-SERIF SMALL A; QQK
+1D5EE ; [.120F.0020.0005.1D5EE] # MATHEMATICAL SANS-SERIF BOLD SMALL A; QQK
+1D622 ; [.120F.0020.0005.1D622] # MATHEMATICAL SANS-SERIF ITALIC SMALL A; QQK
+1D656 ; [.120F.0020.0005.1D656] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A; QQK
+1D68A ; [.120F.0020.0005.1D68A] # MATHEMATICAL MONOSPACE SMALL A; QQK
+24D0 ; [.120F.0020.0006.24D0] # CIRCLED LATIN SMALL LETTER A; QQK
+0041 ; [.120F.0020.0008.0041] # LATIN CAPITAL LETTER A
+FF21 ; [.120F.0020.0009.FF21] # FULLWIDTH LATIN CAPITAL LETTER A; QQK
+1F110 ; [*02FF.0020.0004.1F110][.120F.0020.000A.1F110][*0300.0020.001F.1F110] # PARENTHESIZED LATIN CAPITAL LETTER A; QQKN
+1D400 ; [.120F.0020.000B.1D400] # MATHEMATICAL BOLD CAPITAL A; QQK
+1D434 ; [.120F.0020.000B.1D434] # MATHEMATICAL ITALIC CAPITAL A; QQK
+1D468 ; [.120F.0020.000B.1D468] # MATHEMATICAL BOLD ITALIC CAPITAL A; QQK
+1D49C ; [.120F.0020.000B.1D49C] # MATHEMATICAL SCRIPT CAPITAL A; QQK
+1D4D0 ; [.120F.0020.000B.1D4D0] # MATHEMATICAL BOLD SCRIPT CAPITAL A; QQK
+1D504 ; [.120F.0020.000B.1D504] # MATHEMATICAL FRAKTUR CAPITAL A; QQK
+1D538 ; [.120F.0020.000B.1D538] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A; QQK
+1D56C ; [.120F.0020.000B.1D56C] # MATHEMATICAL BOLD FRAKTUR CAPITAL A; QQK
+1D5A0 ; [.120F.0020.000B.1D5A0] # MATHEMATICAL SANS-SERIF CAPITAL A; QQK
+1D5D4 ; [.120F.0020.000B.1D5D4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A; QQK
+1D608 ; [.120F.0020.000B.1D608] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A; QQK
+1D63C ; [.120F.0020.000B.1D63C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A; QQK
+1D670 ; [.120F.0020.000B.1D670] # MATHEMATICAL MONOSPACE CAPITAL A; QQK
+24B6 ; [.120F.0020.000C.24B6] # CIRCLED LATIN CAPITAL LETTER A; QQK
+00AA ; [.120F.0020.0014.00AA] # FEMININE ORDINAL INDICATOR; QQK
+1D43 ; [.120F.0020.0014.1D43] # MODIFIER LETTER SMALL A; QQK
+2090 ; [.120F.0020.0015.2090] # LATIN SUBSCRIPT SMALL LETTER A; QQK
+1D2C ; [.120F.0020.001D.1D2C] # MODIFIER LETTER CAPITAL A; QQK
+00E1 ; [.120F.0020.0002.0061][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH ACUTE; QQCM
+00C1 ; [.120F.0020.0008.0041][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH ACUTE; QQCM
+00E0 ; [.120F.0020.0002.0061][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH GRAVE; QQCM
+00C0 ; [.120F.0020.0008.0041][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH GRAVE; QQCM
+0103 ; [.120F.0020.0002.0061][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE; QQCM
+0102 ; [.120F.0020.0008.0041][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE; QQCM
+1EAF ; [.120F.0020.0002.0061][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH BREVE AND ACUTE; QQCM
+1EAE ; [.120F.0020.0008.0041][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE; QQCM
+1EB1 ; [.120F.0020.0002.0061][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH BREVE AND GRAVE; QQCM
+1EB0 ; [.120F.0020.0008.0041][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE; QQCM
+1EB5 ; [.120F.0020.0002.0061][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH BREVE AND TILDE; QQCM
+1EB4 ; [.120F.0020.0008.0041][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE; QQCM
+1EB3 ; [.120F.0020.0002.0061][.0000.0037.0002.0306][.0000.0064.0002.0309] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE; QQCM
+1EB2 ; [.120F.0020.0008.0041][.0000.0037.0002.0306][.0000.0064.0002.0309] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE; QQCM
+00E2 ; [.120F.0020.0002.0061][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX; QQCM
+00C2 ; [.120F.0020.0008.0041][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX; QQCM
+1EA5 ; [.120F.0020.0002.0061][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE; QQCM
+1EA4 ; [.120F.0020.0008.0041][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE; QQCM
+1EA7 ; [.120F.0020.0002.0061][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE; QQCM
+1EA6 ; [.120F.0020.0008.0041][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE; QQCM
+1EAB ; [.120F.0020.0002.0061][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE; QQCM
+1EAA ; [.120F.0020.0008.0041][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE; QQCM
+1EA9 ; [.120F.0020.0002.0061][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1EA8 ; [.120F.0020.0008.0041][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+01CE ; [.120F.0020.0002.0061][.0000.0041.0002.030C] # LATIN SMALL LETTER A WITH CARON; QQCM
+01CD ; [.120F.0020.0008.0041][.0000.0041.0002.030C] # LATIN CAPITAL LETTER A WITH CARON; QQCM
+00E5 ; [.120F.0020.0002.0061][.0000.0043.0002.030A] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
+00C5 ; [.120F.0020.0008.0041][.0000.0043.0002.030A] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
+212B ; [.120F.0020.0008.0041][.0000.0043.0002.030A] # ANGSTROM SIGN; QQCM
+01FB ; [.120F.0020.0002.0061][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE; QQCM
+01FA ; [.120F.0020.0008.0041][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE; QQCM
+00E4 ; [.120F.0020.0002.0061][.0000.0047.0002.0308] # LATIN SMALL LETTER A WITH DIAERESIS; QQCM
+00C4 ; [.120F.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS; QQCM
+01DF ; [.120F.0020.0002.0061][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON; QQCM
+01DE ; [.120F.0020.0008.0041][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON; QQCM
+00E3 ; [.120F.0020.0002.0061][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH TILDE; QQCM
+00C3 ; [.120F.0020.0008.0041][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH TILDE; QQCM
+0227 ; [.120F.0020.0002.0061][.0000.0052.0002.0307] # LATIN SMALL LETTER A WITH DOT ABOVE; QQCM
+0226 ; [.120F.0020.0008.0041][.0000.0052.0002.0307] # LATIN CAPITAL LETTER A WITH DOT ABOVE; QQCM
+01E1 ; [.120F.0020.0002.0061][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON; QQCM
+01E0 ; [.120F.0020.0008.0041][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON; QQCM
+0105 ; [.120F.0020.0002.0061][.0000.0059.0002.0328] # LATIN SMALL LETTER A WITH OGONEK; QQCM
+0104 ; [.120F.0020.0008.0041][.0000.0059.0002.0328] # LATIN CAPITAL LETTER A WITH OGONEK; QQCM
+0101 ; [.120F.0020.0002.0061][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH MACRON; QQCM
+0100 ; [.120F.0020.0008.0041][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH MACRON; QQCM
+1EA3 ; [.120F.0020.0002.0061][.0000.0064.0002.0309] # LATIN SMALL LETTER A WITH HOOK ABOVE; QQCM
+1EA2 ; [.120F.0020.0008.0041][.0000.0064.0002.0309] # LATIN CAPITAL LETTER A WITH HOOK ABOVE; QQCM
+0201 ; [.120F.0020.0002.0061][.0000.0065.0002.030F] # LATIN SMALL LETTER A WITH DOUBLE GRAVE; QQCM
+0200 ; [.120F.0020.0008.0041][.0000.0065.0002.030F] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE; QQCM
+0203 ; [.120F.0020.0002.0061][.0000.0067.0002.0311] # LATIN SMALL LETTER A WITH INVERTED BREVE; QQCM
+0202 ; [.120F.0020.0008.0041][.0000.0067.0002.0311] # LATIN CAPITAL LETTER A WITH INVERTED BREVE; QQCM
+1EA1 ; [.120F.0020.0002.0061][.0000.0070.0002.0323] # LATIN SMALL LETTER A WITH DOT BELOW; QQCM
+1EA0 ; [.120F.0020.0008.0041][.0000.0070.0002.0323] # LATIN CAPITAL LETTER A WITH DOT BELOW; QQCM
+1EB7 ; [.120F.0020.0002.0061][.0000.0070.0002.0323][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW; QQCM
+1EB6 ; [.120F.0020.0008.0041][.0000.0070.0002.0323][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW; QQCM
+1EAD ; [.120F.0020.0002.0061][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1EAC ; [.120F.0020.0008.0041][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1E01 ; [.120F.0020.0002.0061][.0000.0076.0002.0325] # LATIN SMALL LETTER A WITH RING BELOW; QQCM
+1E00 ; [.120F.0020.0008.0041][.0000.0076.0002.0325] # LATIN CAPITAL LETTER A WITH RING BELOW; QQCM
+1DD3 ; [.120F.0020.0004.1DD3][.0000.0159.0004.1DD3] # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE; QQKN
+A733 ; [.120F.0020.0004.A733][.120F.0020.0004.A733] # LATIN SMALL LETTER AA; QQKN
+A732 ; [.120F.0020.000A.A732][.120F.0020.000A.A732] # LATIN CAPITAL LETTER AA; QQKN
+2100 ; [.120F.0020.0004.2100][*035C.0020.0004.2100][.123D.0020.001F.2100] # ACCOUNT OF; QQKN
+00E6 ; [.120F.0020.0004.00E6][.0000.0159.0004.00E6][.126B.0020.001F.00E6] # LATIN SMALL LETTER AE; QQKN
+1DD4 ; [.120F.0020.0004.1DD4][.0000.0159.0004.1DD4][.126B.0020.001F.1DD4] # COMBINING LATIN SMALL LETTER AE; QQKN
+00C6 ; [.120F.0020.000A.00C6][.0000.0159.0004.00C6][.126B.0020.001F.00C6] # LATIN CAPITAL LETTER AE; QQKN
+1D2D ; [.120F.0020.0014.1D2D][.0000.0159.0014.1D2D][.126B.0020.001F.1D2D] # MODIFIER LETTER CAPITAL AE; QQKN
+01FD ; [.120F.0020.0004.01FD][.0000.0159.0004.01FD][.126B.0020.001F.01FD][.0000.0032.0002.01FD] # LATIN SMALL LETTER AE WITH ACUTE; QQKN
+01FC ; [.120F.0020.000A.01FC][.0000.0159.0004.01FC][.126B.0020.001F.01FC][.0000.0032.0002.01FC] # LATIN CAPITAL LETTER AE WITH ACUTE; QQKN
+01E3 ; [.120F.0020.0004.01E3][.0000.0159.0004.01E3][.126B.0020.001F.01E3][.0000.005B.0002.01E3] # LATIN SMALL LETTER AE WITH MACRON; QQKN
+01E2 ; [.120F.0020.000A.01E2][.0000.0159.0004.01E2][.126B.0020.001F.01E2][.0000.005B.0002.01E2] # LATIN CAPITAL LETTER AE WITH MACRON; QQKN
+33C2 ; [.120F.0020.001C.33C2][*0281.0020.001C.33C2][.135F.0020.001F.33C2][*0281.0020.001F.33C2] # SQUARE AM; QQKN
+33DF ; [.120F.0020.001D.33DF][*055F.0020.001C.33DF][.135F.0020.001F.33DF] # SQUARE A OVER M; QQKN
+1DD5 ; [.120F.0020.0004.1DD5][.138E.0020.0004.1DD5] # COMBINING LATIN SMALL LETTER AO; QQKN
+A735 ; [.120F.0020.0004.A735][.138E.0020.0004.A735] # LATIN SMALL LETTER AO; QQKN
+A734 ; [.120F.0020.000A.A734][.138E.0020.000A.A734] # LATIN CAPITAL LETTER AO; QQKN
+2101 ; [.120F.0020.0004.2101][*035C.0020.0004.2101][.1410.0020.001F.2101] # ADDRESSED TO THE SUBJECT; QQKN
+A737 ; [.120F.0020.0004.A737][.1453.0020.0004.A737] # LATIN SMALL LETTER AU; QQKN
+A736 ; [.120F.0020.000A.A736][.1453.0020.000A.A736] # LATIN CAPITAL LETTER AU; QQKN
+3373 ; [.120F.0020.001D.3373][.1453.0020.001D.3373] # SQUARE AU; QQKN
+1DD6 ; [.120F.0020.0004.1DD6][.147B.0020.0004.1DD6] # COMBINING LATIN SMALL LETTER AV; QQKN
+A739 ; [.120F.0020.0004.A739][.147B.0020.0004.A739] # LATIN SMALL LETTER AV; QQKN
+A738 ; [.120F.0020.000A.A738][.147B.0020.000A.A738] # LATIN CAPITAL LETTER AV; QQKN
+A73B ; [.120F.0020.0004.A73B][.0000.0159.0004.A73B][.147B.0020.001F.A73B] # LATIN SMALL LETTER AV WITH HORIZONTAL BAR; QQKN
+A73A ; [.120F.0020.000A.A73A][.0000.0159.0004.A73A][.147B.0020.001F.A73A] # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR; QQKN
+A73D ; [.120F.0020.0004.A73D][.149C.0020.0004.A73D] # LATIN SMALL LETTER AY; QQKN
+A73C ; [.120F.0020.000A.A73C][.149C.0020.000A.A73C] # LATIN CAPITAL LETTER AY; QQKN
+1E9A ; [.120F.0020.0004.1E9A][.150D.0020.0004.1E9A] # LATIN SMALL LETTER A WITH RIGHT HALF RING; QQKN
+1D00 ; [.1213.0020.0002.1D00] # LATIN LETTER SMALL CAPITAL A
+2C65 ; [.1214.0020.0002.2C65] # LATIN SMALL LETTER A WITH STROKE
+023A ; [.1214.0020.0008.023A] # LATIN CAPITAL LETTER A WITH STROKE
+1D8F ; [.1215.0020.0002.1D8F] # LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D01 ; [.1216.0020.0002.1D01] # LATIN LETTER SMALL CAPITAL AE
+1D02 ; [.1217.0020.0002.1D02] # LATIN SMALL LETTER TURNED AE
+1D46 ; [.1217.0020.0014.1D46] # MODIFIER LETTER SMALL TURNED AE; QQK
+0250 ; [.1218.0020.0002.0250] # LATIN SMALL LETTER TURNED A
+2C6F ; [.1218.0020.0008.2C6F] # LATIN CAPITAL LETTER TURNED A
+1D44 ; [.1218.0020.0014.1D44] # MODIFIER LETTER SMALL TURNED A; QQK
+0251 ; [.121C.0020.0002.0251] # LATIN SMALL LETTER ALPHA
+2C6D ; [.121C.0020.0008.2C6D] # LATIN CAPITAL LETTER ALPHA
+1D45 ; [.121C.0020.0014.1D45] # MODIFIER LETTER SMALL ALPHA; QQK
+1D90 ; [.1220.0020.0002.1D90] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+0252 ; [.1221.0020.0002.0252] # LATIN SMALL LETTER TURNED ALPHA
+2C70 ; [.1221.0020.0008.2C70] # LATIN CAPITAL LETTER TURNED ALPHA
+1D9B ; [.1221.0020.0014.1D9B] # MODIFIER LETTER SMALL TURNED ALPHA; QQK
+0062 ; [.1225.0020.0002.0062] # LATIN SMALL LETTER B
+FF42 ; [.1225.0020.0003.FF42] # FULLWIDTH LATIN SMALL LETTER B; QQK
+249D ; [*02FF.0020.0004.249D][.1225.0020.0004.249D][*0300.0020.001F.249D] # PARENTHESIZED LATIN SMALL LETTER B; QQKN
+1D41B ; [.1225.0020.0005.1D41B] # MATHEMATICAL BOLD SMALL B; QQK
+1D44F ; [.1225.0020.0005.1D44F] # MATHEMATICAL ITALIC SMALL B; QQK
+1D483 ; [.1225.0020.0005.1D483] # MATHEMATICAL BOLD ITALIC SMALL B; QQK
+1D4B7 ; [.1225.0020.0005.1D4B7] # MATHEMATICAL SCRIPT SMALL B; QQK
+1D4EB ; [.1225.0020.0005.1D4EB] # MATHEMATICAL BOLD SCRIPT SMALL B; QQK
+1D51F ; [.1225.0020.0005.1D51F] # MATHEMATICAL FRAKTUR SMALL B; QQK
+1D553 ; [.1225.0020.0005.1D553] # MATHEMATICAL DOUBLE-STRUCK SMALL B; QQK
+1D587 ; [.1225.0020.0005.1D587] # MATHEMATICAL BOLD FRAKTUR SMALL B; QQK
+1D5BB ; [.1225.0020.0005.1D5BB] # MATHEMATICAL SANS-SERIF SMALL B; QQK
+1D5EF ; [.1225.0020.0005.1D5EF] # MATHEMATICAL SANS-SERIF BOLD SMALL B; QQK
+1D623 ; [.1225.0020.0005.1D623] # MATHEMATICAL SANS-SERIF ITALIC SMALL B; QQK
+1D657 ; [.1225.0020.0005.1D657] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B; QQK
+1D68B ; [.1225.0020.0005.1D68B] # MATHEMATICAL MONOSPACE SMALL B; QQK
+24D1 ; [.1225.0020.0006.24D1] # CIRCLED LATIN SMALL LETTER B; QQK
+0042 ; [.1225.0020.0008.0042] # LATIN CAPITAL LETTER B
+FF22 ; [.1225.0020.0009.FF22] # FULLWIDTH LATIN CAPITAL LETTER B; QQK
+1F111 ; [*02FF.0020.0004.1F111][.1225.0020.000A.1F111][*0300.0020.001F.1F111] # PARENTHESIZED LATIN CAPITAL LETTER B; QQKN
+212C ; [.1225.0020.000B.212C] # SCRIPT CAPITAL B; QQK
+1D401 ; [.1225.0020.000B.1D401] # MATHEMATICAL BOLD CAPITAL B; QQK
+1D435 ; [.1225.0020.000B.1D435] # MATHEMATICAL ITALIC CAPITAL B; QQK
+1D469 ; [.1225.0020.000B.1D469] # MATHEMATICAL BOLD ITALIC CAPITAL B; QQK
+1D4D1 ; [.1225.0020.000B.1D4D1] # MATHEMATICAL BOLD SCRIPT CAPITAL B; QQK
+1D505 ; [.1225.0020.000B.1D505] # MATHEMATICAL FRAKTUR CAPITAL B; QQK
+1D539 ; [.1225.0020.000B.1D539] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B; QQK
+1D56D ; [.1225.0020.000B.1D56D] # MATHEMATICAL BOLD FRAKTUR CAPITAL B; QQK
+1D5A1 ; [.1225.0020.000B.1D5A1] # MATHEMATICAL SANS-SERIF CAPITAL B; QQK
+1D5D5 ; [.1225.0020.000B.1D5D5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B; QQK
+1D609 ; [.1225.0020.000B.1D609] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B; QQK
+1D63D ; [.1225.0020.000B.1D63D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B; QQK
+1D671 ; [.1225.0020.000B.1D671] # MATHEMATICAL MONOSPACE CAPITAL B; QQK
+24B7 ; [.1225.0020.000C.24B7] # CIRCLED LATIN CAPITAL LETTER B; QQK
+1D47 ; [.1225.0020.0014.1D47] # MODIFIER LETTER SMALL B; QQK
+1D2E ; [.1225.0020.001D.1D2E] # MODIFIER LETTER CAPITAL B; QQK
+1F131 ; [.1225.0020.001D.1F131] # SQUARED LATIN CAPITAL LETTER B; QQK
+1E03 ; [.1225.0020.0002.0062][.0000.0052.0002.0307] # LATIN SMALL LETTER B WITH DOT ABOVE; QQCM
+1E02 ; [.1225.0020.0008.0042][.0000.0052.0002.0307] # LATIN CAPITAL LETTER B WITH DOT ABOVE; QQCM
+1E05 ; [.1225.0020.0002.0062][.0000.0070.0002.0323] # LATIN SMALL LETTER B WITH DOT BELOW; QQCM
+1E04 ; [.1225.0020.0008.0042][.0000.0070.0002.0323] # LATIN CAPITAL LETTER B WITH DOT BELOW; QQCM
+1E07 ; [.1225.0020.0002.0062][.0000.007B.0002.0331] # LATIN SMALL LETTER B WITH LINE BELOW; QQCM
+1E06 ; [.1225.0020.0008.0042][.0000.007B.0002.0331] # LATIN CAPITAL LETTER B WITH LINE BELOW; QQCM
+3374 ; [.1225.0020.001C.3374][.120F.0020.001C.3374][.13DA.0020.001F.3374] # SQUARE BAR; QQKN
+33C3 ; [.1225.0020.001D.33C3][.13C8.0020.001C.33C3] # SQUARE BQ; QQKN
+0299 ; [.1229.0020.0002.0299] # LATIN LETTER SMALL CAPITAL B
+0180 ; [.122D.0020.0002.0180] # LATIN SMALL LETTER B WITH STROKE
+0243 ; [.122D.0020.0008.0243] # LATIN CAPITAL LETTER B WITH STROKE
+1D2F ; [.1231.0020.0002.1D2F] # MODIFIER LETTER CAPITAL BARRED B
+1D03 ; [.1232.0020.0002.1D03] # LATIN LETTER SMALL CAPITAL BARRED B
+1D6C ; [.1233.0020.0002.1D6C] # LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D80 ; [.1234.0020.0002.1D80] # LATIN SMALL LETTER B WITH PALATAL HOOK
+0253 ; [.1235.0020.0002.0253] # LATIN SMALL LETTER B WITH HOOK
+0181 ; [.1235.0020.0008.0181] # LATIN CAPITAL LETTER B WITH HOOK
+0183 ; [.1239.0020.0002.0183] # LATIN SMALL LETTER B WITH TOPBAR
+0182 ; [.1239.0020.0008.0182] # LATIN CAPITAL LETTER B WITH TOPBAR
+0063 ; [.123D.0020.0002.0063] # LATIN SMALL LETTER C
+FF43 ; [.123D.0020.0003.FF43] # FULLWIDTH LATIN SMALL LETTER C; QQK
+0368 ; [.123D.0020.0004.0368] # COMBINING LATIN SMALL LETTER C; QQK
+217D ; [.123D.0020.0004.217D] # SMALL ROMAN NUMERAL ONE HUNDRED; QQK
+249E ; [*02FF.0020.0004.249E][.123D.0020.0004.249E][*0300.0020.001F.249E] # PARENTHESIZED LATIN SMALL LETTER C; QQKN
+1D41C ; [.123D.0020.0005.1D41C] # MATHEMATICAL BOLD SMALL C; QQK
+1D450 ; [.123D.0020.0005.1D450] # MATHEMATICAL ITALIC SMALL C; QQK
+1D484 ; [.123D.0020.0005.1D484] # MATHEMATICAL BOLD ITALIC SMALL C; QQK
+1D4B8 ; [.123D.0020.0005.1D4B8] # MATHEMATICAL SCRIPT SMALL C; QQK
+1D4EC ; [.123D.0020.0005.1D4EC] # MATHEMATICAL BOLD SCRIPT SMALL C; QQK
+1D520 ; [.123D.0020.0005.1D520] # MATHEMATICAL FRAKTUR SMALL C; QQK
+1D554 ; [.123D.0020.0005.1D554] # MATHEMATICAL DOUBLE-STRUCK SMALL C; QQK
+1D588 ; [.123D.0020.0005.1D588] # MATHEMATICAL BOLD FRAKTUR SMALL C; QQK
+1D5BC ; [.123D.0020.0005.1D5BC] # MATHEMATICAL SANS-SERIF SMALL C; QQK
+1D5F0 ; [.123D.0020.0005.1D5F0] # MATHEMATICAL SANS-SERIF BOLD SMALL C; QQK
+1D624 ; [.123D.0020.0005.1D624] # MATHEMATICAL SANS-SERIF ITALIC SMALL C; QQK
+1D658 ; [.123D.0020.0005.1D658] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C; QQK
+1D68C ; [.123D.0020.0005.1D68C] # MATHEMATICAL MONOSPACE SMALL C; QQK
+24D2 ; [.123D.0020.0006.24D2] # CIRCLED LATIN SMALL LETTER C; QQK
+0043 ; [.123D.0020.0008.0043] # LATIN CAPITAL LETTER C
+FF23 ; [.123D.0020.0009.FF23] # FULLWIDTH LATIN CAPITAL LETTER C; QQK
+2103 ; [*044B.0020.0004.2103][.123D.0020.000A.2103] # DEGREE CELSIUS; QQKN
+216D ; [.123D.0020.000A.216D] # ROMAN NUMERAL ONE HUNDRED; QQK
+1F112 ; [*02FF.0020.0004.1F112][.123D.0020.000A.1F112][*0300.0020.001F.1F112] # PARENTHESIZED LATIN CAPITAL LETTER C; QQKN
+2102 ; [.123D.0020.000B.2102] # DOUBLE-STRUCK CAPITAL C; QQK
+212D ; [.123D.0020.000B.212D] # BLACK-LETTER CAPITAL C; QQK
+1D402 ; [.123D.0020.000B.1D402] # MATHEMATICAL BOLD CAPITAL C; QQK
+1D436 ; [.123D.0020.000B.1D436] # MATHEMATICAL ITALIC CAPITAL C; QQK
+1D46A ; [.123D.0020.000B.1D46A] # MATHEMATICAL BOLD ITALIC CAPITAL C; QQK
+1D49E ; [.123D.0020.000B.1D49E] # MATHEMATICAL SCRIPT CAPITAL C; QQK
+1D4D2 ; [.123D.0020.000B.1D4D2] # MATHEMATICAL BOLD SCRIPT CAPITAL C; QQK
+1D56E ; [.123D.0020.000B.1D56E] # MATHEMATICAL BOLD FRAKTUR CAPITAL C; QQK
+1D5A2 ; [.123D.0020.000B.1D5A2] # MATHEMATICAL SANS-SERIF CAPITAL C; QQK
+1D5D6 ; [.123D.0020.000B.1D5D6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C; QQK
+1D60A ; [.123D.0020.000B.1D60A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C; QQK
+1D63E ; [.123D.0020.000B.1D63E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C; QQK
+1D672 ; [.123D.0020.000B.1D672] # MATHEMATICAL MONOSPACE CAPITAL C; QQK
+24B8 ; [.123D.0020.000C.24B8] # CIRCLED LATIN CAPITAL LETTER C; QQK
+1F12B ; [.123D.0020.000C.1F12B] # CIRCLED ITALIC LATIN CAPITAL LETTER C; QQK
+1D9C ; [.123D.0020.0014.1D9C] # MODIFIER LETTER SMALL C; QQK
+0107 ; [.123D.0020.0002.0063][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH ACUTE; QQCM
+0106 ; [.123D.0020.0008.0043][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH ACUTE; QQCM
+0109 ; [.123D.0020.0002.0063][.0000.003C.0002.0302] # LATIN SMALL LETTER C WITH CIRCUMFLEX; QQCM
+0108 ; [.123D.0020.0008.0043][.0000.003C.0002.0302] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX; QQCM
+010D ; [.123D.0020.0002.0063][.0000.0041.0002.030C] # LATIN SMALL LETTER C WITH CARON; QQCM
+010C ; [.123D.0020.0008.0043][.0000.0041.0002.030C] # LATIN CAPITAL LETTER C WITH CARON; QQCM
+010B ; [.123D.0020.0002.0063][.0000.0052.0002.0307] # LATIN SMALL LETTER C WITH DOT ABOVE; QQCM
+010A ; [.123D.0020.0008.0043][.0000.0052.0002.0307] # LATIN CAPITAL LETTER C WITH DOT ABOVE; QQCM
+00E7 ; [.123D.0020.0002.0063][.0000.0056.0002.0327] # LATIN SMALL LETTER C WITH CEDILLA; QQCM
+1DD7 ; [.123D.0020.0004.1DD7][.0000.0056.0004.1DD7] # COMBINING LATIN SMALL LETTER C CEDILLA; QQKN
+00C7 ; [.123D.0020.0008.0043][.0000.0056.0002.0327] # LATIN CAPITAL LETTER C WITH CEDILLA; QQCM
+1E09 ; [.123D.0020.0002.0063][.0000.0056.0002.0327][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE; QQCM
+1E08 ; [.123D.0020.0008.0043][.0000.0056.0002.0327][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE; QQCM
+3388 ; [.123D.0020.001C.3388][.120F.0020.001C.3388][.1330.0020.001F.3388] # SQUARE CAL; QQKN
+33C4 ; [.123D.0020.001C.33C4][.123D.0020.001C.33C4] # SQUARE CC; QQKN
+1F12D ; [.123D.0020.000C.1F12D][.1250.0020.000C.1F12D] # CIRCLED CD; QQKN
+33C5 ; [.123D.0020.001C.33C5][.1250.0020.001C.33C5] # SQUARE CD; QQKN
+33C6 ; [.123D.0020.001D.33C6][*055F.0020.001C.33C6][.131E.0020.001F.33C6][.12B0.0020.001F.33C6] # SQUARE C OVER KG; QQKN
+339D ; [.123D.0020.001C.339D][.135F.0020.001C.339D] # SQUARE CM; QQKN
+33A0 ; [.123D.0020.001C.33A0][.135F.0020.001C.33A0][.1207.0020.001F.33A0] # SQUARE CM SQUARED; QQKN
+33A4 ; [.123D.0020.001C.33A4][.135F.0020.001C.33A4][.1208.0020.001F.33A4] # SQUARE CM CUBED; QQKN
+2105 ; [.123D.0020.0004.2105][*035C.0020.0004.2105][.138E.0020.001F.2105] # CARE OF; QQKN
+33C7 ; [.123D.0020.001D.33C7][.138E.0020.001C.33C7][*0281.0020.001F.33C7] # SQUARE CO; QQKN
+2106 ; [.123D.0020.0004.2106][*035C.0020.0004.2106][.1453.0020.001F.2106] # CADA UNA; QQKN
+1D04 ; [.1241.0020.0002.1D04] # LATIN LETTER SMALL CAPITAL C
+023C ; [.1242.0020.0002.023C] # LATIN SMALL LETTER C WITH STROKE
+023B ; [.1242.0020.0008.023B] # LATIN CAPITAL LETTER C WITH STROKE
+0188 ; [.1246.0020.0002.0188] # LATIN SMALL LETTER C WITH HOOK
+0187 ; [.1246.0020.0008.0187] # LATIN CAPITAL LETTER C WITH HOOK
+0255 ; [.124A.0020.0002.0255] # LATIN SMALL LETTER C WITH CURL
+1D9D ; [.124A.0020.0014.1D9D] # MODIFIER LETTER SMALL C WITH CURL; QQK
+2184 ; [.124E.0020.0002.2184] # LATIN SMALL LETTER REVERSED C
+2183 ; [.124E.0020.0008.2183] # ROMAN NUMERAL REVERSED ONE HUNDRED
+A73F ; [.124F.0020.0002.A73F] # LATIN SMALL LETTER REVERSED C WITH DOT
+A73E ; [.124F.0020.0008.A73E] # LATIN CAPITAL LETTER REVERSED C WITH DOT
+0064 ; [.1250.0020.0002.0064] # LATIN SMALL LETTER D
+FF44 ; [.1250.0020.0003.FF44] # FULLWIDTH LATIN SMALL LETTER D; QQK
+0369 ; [.1250.0020.0004.0369] # COMBINING LATIN SMALL LETTER D; QQK
+217E ; [.1250.0020.0004.217E] # SMALL ROMAN NUMERAL FIVE HUNDRED; QQK
+249F ; [*02FF.0020.0004.249F][.1250.0020.0004.249F][*0300.0020.001F.249F] # PARENTHESIZED LATIN SMALL LETTER D; QQKN
+2146 ; [.1250.0020.0005.2146] # DOUBLE-STRUCK ITALIC SMALL D; QQK
+1D41D ; [.1250.0020.0005.1D41D] # MATHEMATICAL BOLD SMALL D; QQK
+1D451 ; [.1250.0020.0005.1D451] # MATHEMATICAL ITALIC SMALL D; QQK
+1D485 ; [.1250.0020.0005.1D485] # MATHEMATICAL BOLD ITALIC SMALL D; QQK
+1D4B9 ; [.1250.0020.0005.1D4B9] # MATHEMATICAL SCRIPT SMALL D; QQK
+1D4ED ; [.1250.0020.0005.1D4ED] # MATHEMATICAL BOLD SCRIPT SMALL D; QQK
+1D521 ; [.1250.0020.0005.1D521] # MATHEMATICAL FRAKTUR SMALL D; QQK
+1D555 ; [.1250.0020.0005.1D555] # MATHEMATICAL DOUBLE-STRUCK SMALL D; QQK
+1D589 ; [.1250.0020.0005.1D589] # MATHEMATICAL BOLD FRAKTUR SMALL D; QQK
+1D5BD ; [.1250.0020.0005.1D5BD] # MATHEMATICAL SANS-SERIF SMALL D; QQK
+1D5F1 ; [.1250.0020.0005.1D5F1] # MATHEMATICAL SANS-SERIF BOLD SMALL D; QQK
+1D625 ; [.1250.0020.0005.1D625] # MATHEMATICAL SANS-SERIF ITALIC SMALL D; QQK
+1D659 ; [.1250.0020.0005.1D659] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D; QQK
+1D68D ; [.1250.0020.0005.1D68D] # MATHEMATICAL MONOSPACE SMALL D; QQK
+24D3 ; [.1250.0020.0006.24D3] # CIRCLED LATIN SMALL LETTER D; QQK
+0044 ; [.1250.0020.0008.0044] # LATIN CAPITAL LETTER D
+FF24 ; [.1250.0020.0009.FF24] # FULLWIDTH LATIN CAPITAL LETTER D; QQK
+216E ; [.1250.0020.000A.216E] # ROMAN NUMERAL FIVE HUNDRED; QQK
+1F113 ; [*02FF.0020.0004.1F113][.1250.0020.000A.1F113][*0300.0020.001F.1F113] # PARENTHESIZED LATIN CAPITAL LETTER D; QQKN
+2145 ; [.1250.0020.000B.2145] # DOUBLE-STRUCK ITALIC CAPITAL D; QQK
+1D403 ; [.1250.0020.000B.1D403] # MATHEMATICAL BOLD CAPITAL D; QQK
+1D437 ; [.1250.0020.000B.1D437] # MATHEMATICAL ITALIC CAPITAL D; QQK
+1D46B ; [.1250.0020.000B.1D46B] # MATHEMATICAL BOLD ITALIC CAPITAL D; QQK
+1D49F ; [.1250.0020.000B.1D49F] # MATHEMATICAL SCRIPT CAPITAL D; QQK
+1D4D3 ; [.1250.0020.000B.1D4D3] # MATHEMATICAL BOLD SCRIPT CAPITAL D; QQK
+1D507 ; [.1250.0020.000B.1D507] # MATHEMATICAL FRAKTUR CAPITAL D; QQK
+1D53B ; [.1250.0020.000B.1D53B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D; QQK
+1D56F ; [.1250.0020.000B.1D56F] # MATHEMATICAL BOLD FRAKTUR CAPITAL D; QQK
+1D5A3 ; [.1250.0020.000B.1D5A3] # MATHEMATICAL SANS-SERIF CAPITAL D; QQK
+1D5D7 ; [.1250.0020.000B.1D5D7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D; QQK
+1D60B ; [.1250.0020.000B.1D60B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D; QQK
+1D63F ; [.1250.0020.000B.1D63F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D; QQK
+1D673 ; [.1250.0020.000B.1D673] # MATHEMATICAL MONOSPACE CAPITAL D; QQK
+24B9 ; [.1250.0020.000C.24B9] # CIRCLED LATIN CAPITAL LETTER D; QQK
+1D48 ; [.1250.0020.0014.1D48] # MODIFIER LETTER SMALL D; QQK
+1D30 ; [.1250.0020.001D.1D30] # MODIFIER LETTER CAPITAL D; QQK
+010F ; [.1250.0020.0002.0064][.0000.0041.0002.030C] # LATIN SMALL LETTER D WITH CARON; QQCM
+010E ; [.1250.0020.0008.0044][.0000.0041.0002.030C] # LATIN CAPITAL LETTER D WITH CARON; QQCM
+1E0B ; [.1250.0020.0002.0064][.0000.0052.0002.0307] # LATIN SMALL LETTER D WITH DOT ABOVE; QQCM
+1E0A ; [.1250.0020.0008.0044][.0000.0052.0002.0307] # LATIN CAPITAL LETTER D WITH DOT ABOVE; QQCM
+1E11 ; [.1250.0020.0002.0064][.0000.0056.0002.0327] # LATIN SMALL LETTER D WITH CEDILLA; QQCM
+1E10 ; [.1250.0020.0008.0044][.0000.0056.0002.0327] # LATIN CAPITAL LETTER D WITH CEDILLA; QQCM
+1E0D ; [.1250.0020.0002.0064][.0000.0070.0002.0323] # LATIN SMALL LETTER D WITH DOT BELOW; QQCM
+1E0C ; [.1250.0020.0008.0044][.0000.0070.0002.0323] # LATIN CAPITAL LETTER D WITH DOT BELOW; QQCM
+1E13 ; [.1250.0020.0002.0064][.0000.0078.0002.032D] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW; QQCM
+1E12 ; [.1250.0020.0008.0044][.0000.0078.0002.032D] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW; QQCM
+1E0F ; [.1250.0020.0002.0064][.0000.007B.0002.0331] # LATIN SMALL LETTER D WITH LINE BELOW; QQCM
+1E0E ; [.1250.0020.0008.0044][.0000.007B.0002.0331] # LATIN CAPITAL LETTER D WITH LINE BELOW; QQCM
+0111 ; [.1250.0020.0002.0064][.0000.007D.0002.0335] # LATIN SMALL LETTER D WITH STROKE; QQCM
+0110 ; [.1250.0020.0008.0044][.0000.007D.0002.0335] # LATIN CAPITAL LETTER D WITH STROKE; QQCM
+00F0 ; [.1250.0020.0004.00F0][.0000.0159.0004.00F0] # LATIN SMALL LETTER ETH; QQKN
+1DD9 ; [.1250.0020.0004.1DD9][.0000.0159.0004.1DD9] # COMBINING LATIN SMALL LETTER ETH; QQKN
+00D0 ; [.1250.0020.000A.00D0][.0000.0159.0004.00D0] # LATIN CAPITAL LETTER ETH; QQKN
+1D9E ; [.1250.0020.0014.1D9E][.0000.0159.0014.1D9E] # MODIFIER LETTER SMALL ETH; QQKN
+1DD8 ; [.1250.0020.0004.1DD8][.0000.015A.0004.1DD8] # COMBINING LATIN SMALL LETTER INSULAR D; QQKN
+A77A ; [.1250.0020.0004.A77A][.0000.015A.0004.A77A] # LATIN SMALL LETTER INSULAR D; QQKN
+A779 ; [.1250.0020.000A.A779][.0000.015A.0004.A779] # LATIN CAPITAL LETTER INSULAR D; QQKN
+3372 ; [.1250.0020.001C.3372][.120F.0020.001C.3372] # SQUARE DA; QQKN
+0238 ; [.1250.0020.0004.0238][.1225.0020.0004.0238] # LATIN SMALL LETTER DB DIGRAPH; QQKN
+33C8 ; [.1250.0020.001C.33C8][.1225.0020.001D.33C8] # SQUARE DB; QQKN
+1F190 ; [.1250.0020.001D.1F190][.1305.0020.001D.1F190] # SQUARE DJ; QQKN
+3397 ; [.1250.0020.001C.3397][.1330.0020.001C.3397] # SQUARE DL; QQKN
+3377 ; [.1250.0020.001C.3377][.135F.0020.001C.3377] # SQUARE DM; QQKN
+3378 ; [.1250.0020.001C.3378][.135F.0020.001C.3378][.1207.0020.001F.3378] # SQUARE DM SQUARED; QQKN
+3379 ; [.1250.0020.001C.3379][.135F.0020.001C.3379][.1208.0020.001F.3379] # SQUARE DM CUBED; QQKN
+01F3 ; [.1250.0020.0004.01F3][.14AD.0020.0004.01F3] # LATIN SMALL LETTER DZ; QQKN
+02A3 ; [.1250.0020.0004.02A3][.14AD.0020.0004.02A3] # LATIN SMALL LETTER DZ DIGRAPH; QQKN
+01F2 ; [.1250.0020.000A.01F2][.14AD.0020.0004.01F2] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z; QQKN
+01F1 ; [.1250.0020.000A.01F1][.14AD.0020.000A.01F1] # LATIN CAPITAL LETTER DZ; QQKN
+01C6 ; [.1250.0020.0004.01C6][.14AD.0020.0004.01C6][.0000.0041.001F.01C6] # LATIN SMALL LETTER DZ WITH CARON; QQKN
+01C5 ; [.1250.0020.000A.01C5][.14AD.0020.0004.01C5][.0000.0041.001F.01C5] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON; QQKN
+01C4 ; [.1250.0020.000A.01C4][.14AD.0020.000A.01C4][.0000.0041.001F.01C4] # LATIN CAPITAL LETTER DZ WITH CARON; QQKN
+02A5 ; [.1250.0020.0004.02A5][.14C0.0020.0004.02A5] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL; QQKN
+02A4 ; [.1250.0020.0004.02A4][.14CA.0020.0004.02A4] # LATIN SMALL LETTER DEZH DIGRAPH; QQKN
+1D05 ; [.1254.0020.0002.1D05] # LATIN LETTER SMALL CAPITAL D
+1D06 ; [.1255.0020.0002.1D06] # LATIN LETTER SMALL CAPITAL ETH
+1D6D ; [.1256.0020.0002.1D6D] # LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D81 ; [.1257.0020.0002.1D81] # LATIN SMALL LETTER D WITH PALATAL HOOK
+0256 ; [.1258.0020.0002.0256] # LATIN SMALL LETTER D WITH TAIL
+0189 ; [.1258.0020.0008.0189] # LATIN CAPITAL LETTER AFRICAN D
+0257 ; [.125C.0020.0002.0257] # LATIN SMALL LETTER D WITH HOOK
+018A ; [.125C.0020.0008.018A] # LATIN CAPITAL LETTER D WITH HOOK
+1D91 ; [.1260.0020.0002.1D91] # LATIN SMALL LETTER D WITH HOOK AND TAIL
+018C ; [.1261.0020.0002.018C] # LATIN SMALL LETTER D WITH TOPBAR
+018B ; [.1261.0020.0008.018B] # LATIN CAPITAL LETTER D WITH TOPBAR
+0221 ; [.1265.0020.0002.0221] # LATIN SMALL LETTER D WITH CURL
+A771 ; [.1269.0020.0002.A771] # LATIN SMALL LETTER DUM
+1E9F ; [.126A.0020.0002.1E9F] # LATIN SMALL LETTER DELTA
+0065 ; [.126B.0020.0002.0065] # LATIN SMALL LETTER E
+FF45 ; [.126B.0020.0003.FF45] # FULLWIDTH LATIN SMALL LETTER E; QQK
+0364 ; [.126B.0020.0004.0364] # COMBINING LATIN SMALL LETTER E; QQK
+24A0 ; [*02FF.0020.0004.24A0][.126B.0020.0004.24A0][*0300.0020.001F.24A0] # PARENTHESIZED LATIN SMALL LETTER E; QQKN
+212F ; [.126B.0020.0005.212F] # SCRIPT SMALL E; QQK
+2147 ; [.126B.0020.0005.2147] # DOUBLE-STRUCK ITALIC SMALL E; QQK
+1D41E ; [.126B.0020.0005.1D41E] # MATHEMATICAL BOLD SMALL E; QQK
+1D452 ; [.126B.0020.0005.1D452] # MATHEMATICAL ITALIC SMALL E; QQK
+1D486 ; [.126B.0020.0005.1D486] # MATHEMATICAL BOLD ITALIC SMALL E; QQK
+1D4EE ; [.126B.0020.0005.1D4EE] # MATHEMATICAL BOLD SCRIPT SMALL E; QQK
+1D522 ; [.126B.0020.0005.1D522] # MATHEMATICAL FRAKTUR SMALL E; QQK
+1D556 ; [.126B.0020.0005.1D556] # MATHEMATICAL DOUBLE-STRUCK SMALL E; QQK
+1D58A ; [.126B.0020.0005.1D58A] # MATHEMATICAL BOLD FRAKTUR SMALL E; QQK
+1D5BE ; [.126B.0020.0005.1D5BE] # MATHEMATICAL SANS-SERIF SMALL E; QQK
+1D5F2 ; [.126B.0020.0005.1D5F2] # MATHEMATICAL SANS-SERIF BOLD SMALL E; QQK
+1D626 ; [.126B.0020.0005.1D626] # MATHEMATICAL SANS-SERIF ITALIC SMALL E; QQK
+1D65A ; [.126B.0020.0005.1D65A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E; QQK
+1D68E ; [.126B.0020.0005.1D68E] # MATHEMATICAL MONOSPACE SMALL E; QQK
+24D4 ; [.126B.0020.0006.24D4] # CIRCLED LATIN SMALL LETTER E; QQK
+0045 ; [.126B.0020.0008.0045] # LATIN CAPITAL LETTER E
+FF25 ; [.126B.0020.0009.FF25] # FULLWIDTH LATIN CAPITAL LETTER E; QQK
+1F114 ; [*02FF.0020.0004.1F114][.126B.0020.000A.1F114][*0300.0020.001F.1F114] # PARENTHESIZED LATIN CAPITAL LETTER E; QQKN
+2130 ; [.126B.0020.000B.2130] # SCRIPT CAPITAL E; QQK
+1D404 ; [.126B.0020.000B.1D404] # MATHEMATICAL BOLD CAPITAL E; QQK
+1D438 ; [.126B.0020.000B.1D438] # MATHEMATICAL ITALIC CAPITAL E; QQK
+1D46C ; [.126B.0020.000B.1D46C] # MATHEMATICAL BOLD ITALIC CAPITAL E; QQK
+1D4D4 ; [.126B.0020.000B.1D4D4] # MATHEMATICAL BOLD SCRIPT CAPITAL E; QQK
+1D508 ; [.126B.0020.000B.1D508] # MATHEMATICAL FRAKTUR CAPITAL E; QQK
+1D53C ; [.126B.0020.000B.1D53C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E; QQK
+1D570 ; [.126B.0020.000B.1D570] # MATHEMATICAL BOLD FRAKTUR CAPITAL E; QQK
+1D5A4 ; [.126B.0020.000B.1D5A4] # MATHEMATICAL SANS-SERIF CAPITAL E; QQK
+1D5D8 ; [.126B.0020.000B.1D5D8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E; QQK
+1D60C ; [.126B.0020.000B.1D60C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E; QQK
+1D640 ; [.126B.0020.000B.1D640] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E; QQK
+1D674 ; [.126B.0020.000B.1D674] # MATHEMATICAL MONOSPACE CAPITAL E; QQK
+24BA ; [.126B.0020.000C.24BA] # CIRCLED LATIN CAPITAL LETTER E; QQK
+1D49 ; [.126B.0020.0014.1D49] # MODIFIER LETTER SMALL E; QQK
+2091 ; [.126B.0020.0015.2091] # LATIN SUBSCRIPT SMALL LETTER E; QQK
+1D31 ; [.126B.0020.001D.1D31] # MODIFIER LETTER CAPITAL E; QQK
+00E9 ; [.126B.0020.0002.0065][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH ACUTE; QQCM
+00C9 ; [.126B.0020.0008.0045][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH ACUTE; QQCM
+00E8 ; [.126B.0020.0002.0065][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH GRAVE; QQCM
+00C8 ; [.126B.0020.0008.0045][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH GRAVE; QQCM
+0115 ; [.126B.0020.0002.0065][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH BREVE; QQCM
+0114 ; [.126B.0020.0008.0045][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH BREVE; QQCM
+00EA ; [.126B.0020.0002.0065][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX; QQCM
+00CA ; [.126B.0020.0008.0045][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX; QQCM
+1EBF ; [.126B.0020.0002.0065][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE; QQCM
+1EBE ; [.126B.0020.0008.0045][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE; QQCM
+1EC1 ; [.126B.0020.0002.0065][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE; QQCM
+1EC0 ; [.126B.0020.0008.0045][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE; QQCM
+1EC5 ; [.126B.0020.0002.0065][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE; QQCM
+1EC4 ; [.126B.0020.0008.0045][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE; QQCM
+1EC3 ; [.126B.0020.0002.0065][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1EC2 ; [.126B.0020.0008.0045][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+011B ; [.126B.0020.0002.0065][.0000.0041.0002.030C] # LATIN SMALL LETTER E WITH CARON; QQCM
+011A ; [.126B.0020.0008.0045][.0000.0041.0002.030C] # LATIN CAPITAL LETTER E WITH CARON; QQCM
+00EB ; [.126B.0020.0002.0065][.0000.0047.0002.0308] # LATIN SMALL LETTER E WITH DIAERESIS; QQCM
+00CB ; [.126B.0020.0008.0045][.0000.0047.0002.0308] # LATIN CAPITAL LETTER E WITH DIAERESIS; QQCM
+1EBD ; [.126B.0020.0002.0065][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH TILDE; QQCM
+1EBC ; [.126B.0020.0008.0045][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH TILDE; QQCM
+0117 ; [.126B.0020.0002.0065][.0000.0052.0002.0307] # LATIN SMALL LETTER E WITH DOT ABOVE; QQCM
+0116 ; [.126B.0020.0008.0045][.0000.0052.0002.0307] # LATIN CAPITAL LETTER E WITH DOT ABOVE; QQCM
+0229 ; [.126B.0020.0002.0065][.0000.0056.0002.0327] # LATIN SMALL LETTER E WITH CEDILLA; QQCM
+0228 ; [.126B.0020.0008.0045][.0000.0056.0002.0327] # LATIN CAPITAL LETTER E WITH CEDILLA; QQCM
+1E1D ; [.126B.0020.0002.0065][.0000.0056.0002.0327][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE; QQCM
+1E1C ; [.126B.0020.0008.0045][.0000.0056.0002.0327][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE; QQCM
+0119 ; [.126B.0020.0002.0065][.0000.0059.0002.0328] # LATIN SMALL LETTER E WITH OGONEK; QQCM
+0118 ; [.126B.0020.0008.0045][.0000.0059.0002.0328] # LATIN CAPITAL LETTER E WITH OGONEK; QQCM
+0113 ; [.126B.0020.0002.0065][.0000.005B.0002.0304] # LATIN SMALL LETTER E WITH MACRON; QQCM
+0112 ; [.126B.0020.0008.0045][.0000.005B.0002.0304] # LATIN CAPITAL LETTER E WITH MACRON; QQCM
+1E17 ; [.126B.0020.0002.0065][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH MACRON AND ACUTE; QQCM
+1E16 ; [.126B.0020.0008.0045][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE; QQCM
+1E15 ; [.126B.0020.0002.0065][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH MACRON AND GRAVE; QQCM
+1E14 ; [.126B.0020.0008.0045][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE; QQCM
+1EBB ; [.126B.0020.0002.0065][.0000.0064.0002.0309] # LATIN SMALL LETTER E WITH HOOK ABOVE; QQCM
+1EBA ; [.126B.0020.0008.0045][.0000.0064.0002.0309] # LATIN CAPITAL LETTER E WITH HOOK ABOVE; QQCM
+0205 ; [.126B.0020.0002.0065][.0000.0065.0002.030F] # LATIN SMALL LETTER E WITH DOUBLE GRAVE; QQCM
+0204 ; [.126B.0020.0008.0045][.0000.0065.0002.030F] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE; QQCM
+0207 ; [.126B.0020.0002.0065][.0000.0067.0002.0311] # LATIN SMALL LETTER E WITH INVERTED BREVE; QQCM
+0206 ; [.126B.0020.0008.0045][.0000.0067.0002.0311] # LATIN CAPITAL LETTER E WITH INVERTED BREVE; QQCM
+1EB9 ; [.126B.0020.0002.0065][.0000.0070.0002.0323] # LATIN SMALL LETTER E WITH DOT BELOW; QQCM
+1EB8 ; [.126B.0020.0008.0045][.0000.0070.0002.0323] # LATIN CAPITAL LETTER E WITH DOT BELOW; QQCM
+1EC7 ; [.126B.0020.0002.0065][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1EC6 ; [.126B.0020.0008.0045][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1E19 ; [.126B.0020.0002.0065][.0000.0078.0002.032D] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW; QQCM
+1E18 ; [.126B.0020.0008.0045][.0000.0078.0002.032D] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW; QQCM
+1E1B ; [.126B.0020.0002.0065][.0000.007A.0002.0330] # LATIN SMALL LETTER E WITH TILDE BELOW; QQCM
+1E1A ; [.126B.0020.0008.0045][.0000.007A.0002.0330] # LATIN CAPITAL LETTER E WITH TILDE BELOW; QQCM
+32CD ; [.126B.0020.001C.32CD][.13DA.0020.001C.32CD][.12B0.0020.001F.32CD] # SQUARE ERG; QQKN
+32CE ; [.126B.0020.001C.32CE][.147B.0020.001D.32CE] # SQUARE EV; QQKN
+1D07 ; [.126F.0020.0002.1D07] # LATIN LETTER SMALL CAPITAL E
+0247 ; [.1270.0020.0002.0247] # LATIN SMALL LETTER E WITH STROKE
+0246 ; [.1270.0020.0008.0246] # LATIN CAPITAL LETTER E WITH STROKE
+1D92 ; [.1274.0020.0002.1D92] # LATIN SMALL LETTER E WITH RETROFLEX HOOK
+2C78 ; [.1275.0020.0002.2C78] # LATIN SMALL LETTER E WITH NOTCH
+01DD ; [.1276.0020.0002.01DD] # LATIN SMALL LETTER TURNED E
+018E ; [.1276.0020.0008.018E] # LATIN CAPITAL LETTER REVERSED E
+1D32 ; [.1276.0020.001D.1D32] # MODIFIER LETTER CAPITAL REVERSED E; QQK
+2C7B ; [.127A.0020.0002.2C7B] # LATIN LETTER SMALL CAPITAL TURNED E
+0259 ; [.127B.0020.0002.0259] # LATIN SMALL LETTER SCHWA
+018F ; [.127B.0020.0008.018F] # LATIN CAPITAL LETTER SCHWA
+1D4A ; [.127B.0020.0014.1D4A] # MODIFIER LETTER SMALL SCHWA; QQK
+2094 ; [.127B.0020.0015.2094] # LATIN SUBSCRIPT SMALL LETTER SCHWA; QQK
+1D95 ; [.127F.0020.0002.1D95] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+025B ; [.1280.0020.0002.025B] # LATIN SMALL LETTER OPEN E
+0190 ; [.1280.0020.0008.0190] # LATIN CAPITAL LETTER OPEN E
+2107 ; [.1280.0020.000A.2107] # EULER CONSTANT; QQK
+1D4B ; [.1280.0020.0014.1D4B] # MODIFIER LETTER SMALL OPEN E; QQK
+1D93 ; [.1284.0020.0002.1D93] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+0258 ; [.1285.0020.0002.0258] # LATIN SMALL LETTER REVERSED E
+025A ; [.1289.0020.0002.025A] # LATIN SMALL LETTER SCHWA WITH HOOK
+025C ; [.128D.0020.0002.025C] # LATIN SMALL LETTER REVERSED OPEN E
+1D9F ; [.128D.0020.0014.1D9F] # MODIFIER LETTER SMALL REVERSED OPEN E; QQK
+1D94 ; [.1291.0020.0002.1D94] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+1D08 ; [.1292.0020.0002.1D08] # LATIN SMALL LETTER TURNED OPEN E
+1D4C ; [.1292.0020.0014.1D4C] # MODIFIER LETTER SMALL TURNED OPEN E; QQK
+025D ; [.1293.0020.0002.025D] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E ; [.1297.0020.0002.025E] # LATIN SMALL LETTER CLOSED REVERSED OPEN E
+029A ; [.129B.0020.0002.029A] # LATIN SMALL LETTER CLOSED OPEN E
+0264 ; [.129F.0020.0002.0264] # LATIN SMALL LETTER RAMS HORN
+0066 ; [.12A3.0020.0002.0066] # LATIN SMALL LETTER F
+FF46 ; [.12A3.0020.0003.FF46] # FULLWIDTH LATIN SMALL LETTER F; QQK
+24A1 ; [*02FF.0020.0004.24A1][.12A3.0020.0004.24A1][*0300.0020.001F.24A1] # PARENTHESIZED LATIN SMALL LETTER F; QQKN
+1D41F ; [.12A3.0020.0005.1D41F] # MATHEMATICAL BOLD SMALL F; QQK
+1D453 ; [.12A3.0020.0005.1D453] # MATHEMATICAL ITALIC SMALL F; QQK
+1D487 ; [.12A3.0020.0005.1D487] # MATHEMATICAL BOLD ITALIC SMALL F; QQK
+1D4BB ; [.12A3.0020.0005.1D4BB] # MATHEMATICAL SCRIPT SMALL F; QQK
+1D4EF ; [.12A3.0020.0005.1D4EF] # MATHEMATICAL BOLD SCRIPT SMALL F; QQK
+1D523 ; [.12A3.0020.0005.1D523] # MATHEMATICAL FRAKTUR SMALL F; QQK
+1D557 ; [.12A3.0020.0005.1D557] # MATHEMATICAL DOUBLE-STRUCK SMALL F; QQK
+1D58B ; [.12A3.0020.0005.1D58B] # MATHEMATICAL BOLD FRAKTUR SMALL F; QQK
+1D5BF ; [.12A3.0020.0005.1D5BF] # MATHEMATICAL SANS-SERIF SMALL F; QQK
+1D5F3 ; [.12A3.0020.0005.1D5F3] # MATHEMATICAL SANS-SERIF BOLD SMALL F; QQK
+1D627 ; [.12A3.0020.0005.1D627] # MATHEMATICAL SANS-SERIF ITALIC SMALL F; QQK
+1D65B ; [.12A3.0020.0005.1D65B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F; QQK
+1D68F ; [.12A3.0020.0005.1D68F] # MATHEMATICAL MONOSPACE SMALL F; QQK
+24D5 ; [.12A3.0020.0006.24D5] # CIRCLED LATIN SMALL LETTER F; QQK
+0046 ; [.12A3.0020.0008.0046] # LATIN CAPITAL LETTER F
+FF26 ; [.12A3.0020.0009.FF26] # FULLWIDTH LATIN CAPITAL LETTER F; QQK
+2109 ; [*044B.0020.0004.2109][.12A3.0020.000A.2109] # DEGREE FAHRENHEIT; QQKN
+1F115 ; [*02FF.0020.0004.1F115][.12A3.0020.000A.1F115][*0300.0020.001F.1F115] # PARENTHESIZED LATIN CAPITAL LETTER F; QQKN
+2131 ; [.12A3.0020.000B.2131] # SCRIPT CAPITAL F; QQK
+1D405 ; [.12A3.0020.000B.1D405] # MATHEMATICAL BOLD CAPITAL F; QQK
+1D439 ; [.12A3.0020.000B.1D439] # MATHEMATICAL ITALIC CAPITAL F; QQK
+1D46D ; [.12A3.0020.000B.1D46D] # MATHEMATICAL BOLD ITALIC CAPITAL F; QQK
+1D4D5 ; [.12A3.0020.000B.1D4D5] # MATHEMATICAL BOLD SCRIPT CAPITAL F; QQK
+1D509 ; [.12A3.0020.000B.1D509] # MATHEMATICAL FRAKTUR CAPITAL F; QQK
+1D53D ; [.12A3.0020.000B.1D53D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F; QQK
+1D571 ; [.12A3.0020.000B.1D571] # MATHEMATICAL BOLD FRAKTUR CAPITAL F; QQK
+1D5A5 ; [.12A3.0020.000B.1D5A5] # MATHEMATICAL SANS-SERIF CAPITAL F; QQK
+1D5D9 ; [.12A3.0020.000B.1D5D9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F; QQK
+1D60D ; [.12A3.0020.000B.1D60D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F; QQK
+1D641 ; [.12A3.0020.000B.1D641] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F; QQK
+1D675 ; [.12A3.0020.000B.1D675] # MATHEMATICAL MONOSPACE CAPITAL F; QQK
+24BB ; [.12A3.0020.000C.24BB] # CIRCLED LATIN CAPITAL LETTER F; QQK
+1DA0 ; [.12A3.0020.0014.1DA0] # MODIFIER LETTER SMALL F; QQK
+1E1F ; [.12A3.0020.0002.0066][.0000.0052.0002.0307] # LATIN SMALL LETTER F WITH DOT ABOVE; QQCM
+1E1E ; [.12A3.0020.0008.0046][.0000.0052.0002.0307] # LATIN CAPITAL LETTER F WITH DOT ABOVE; QQCM
+A77C ; [.12A3.0020.0004.A77C][.0000.015A.0004.A77C] # LATIN SMALL LETTER INSULAR F; QQKN
+A77B ; [.12A3.0020.000A.A77B][.0000.015A.0004.A77B] # LATIN CAPITAL LETTER INSULAR F; QQKN
+213B ; [.12A3.0020.000A.213B][.120F.0020.000A.213B][.1497.0020.001F.213B] # FACSIMILE SIGN; QQKN
+FB00 ; [.12A3.0020.0004.FB00][.12A3.0020.0004.FB00] # LATIN SMALL LIGATURE FF; QQKN
+FB03 ; [.12A3.0020.0004.FB03][.12A3.0020.0004.FB03][.12EC.0020.001F.FB03] # LATIN SMALL LIGATURE FFI; QQKN
+FB04 ; [.12A3.0020.0004.FB04][.12A3.0020.0004.FB04][.1330.0020.001F.FB04] # LATIN SMALL LIGATURE FFL; QQKN
+FB01 ; [.12A3.0020.0004.FB01][.12EC.0020.0004.FB01] # LATIN SMALL LIGATURE FI; QQKN
+FB02 ; [.12A3.0020.0004.FB02][.1330.0020.0004.FB02] # LATIN SMALL LIGATURE FL; QQKN
+3399 ; [.12A3.0020.001C.3399][.135F.0020.001C.3399] # SQUARE FM; QQKN
+02A9 ; [.12A3.0020.0004.02A9][.138A.0020.0004.02A9] # LATIN SMALL LETTER FENG DIGRAPH; QQKN
+A730 ; [.12A7.0020.0002.A730] # LATIN LETTER SMALL CAPITAL F
+1D6E ; [.12A8.0020.0002.1D6E] # LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D82 ; [.12A9.0020.0002.1D82] # LATIN SMALL LETTER F WITH PALATAL HOOK
+0192 ; [.12AA.0020.0002.0192] # LATIN SMALL LETTER F WITH HOOK
+0191 ; [.12AA.0020.0008.0191] # LATIN CAPITAL LETTER F WITH HOOK
+214E ; [.12AE.0020.0002.214E] # TURNED SMALL F
+2132 ; [.12AE.0020.0008.2132] # TURNED CAPITAL F
+A7FB ; [.12AF.0020.0002.A7FB] # LATIN EPIGRAPHIC LETTER REVERSED F
+0067 ; [.12B0.0020.0002.0067] # LATIN SMALL LETTER G
+FF47 ; [.12B0.0020.0003.FF47] # FULLWIDTH LATIN SMALL LETTER G; QQK
+1DDA ; [.12B0.0020.0004.1DDA] # COMBINING LATIN SMALL LETTER G; QQK
+24A2 ; [*02FF.0020.0004.24A2][.12B0.0020.0004.24A2][*0300.0020.001F.24A2] # PARENTHESIZED LATIN SMALL LETTER G; QQKN
+210A ; [.12B0.0020.0005.210A] # SCRIPT SMALL G; QQK
+1D420 ; [.12B0.0020.0005.1D420] # MATHEMATICAL BOLD SMALL G; QQK
+1D454 ; [.12B0.0020.0005.1D454] # MATHEMATICAL ITALIC SMALL G; QQK
+1D488 ; [.12B0.0020.0005.1D488] # MATHEMATICAL BOLD ITALIC SMALL G; QQK
+1D4F0 ; [.12B0.0020.0005.1D4F0] # MATHEMATICAL BOLD SCRIPT SMALL G; QQK
+1D524 ; [.12B0.0020.0005.1D524] # MATHEMATICAL FRAKTUR SMALL G; QQK
+1D558 ; [.12B0.0020.0005.1D558] # MATHEMATICAL DOUBLE-STRUCK SMALL G; QQK
+1D58C ; [.12B0.0020.0005.1D58C] # MATHEMATICAL BOLD FRAKTUR SMALL G; QQK
+1D5C0 ; [.12B0.0020.0005.1D5C0] # MATHEMATICAL SANS-SERIF SMALL G; QQK
+1D5F4 ; [.12B0.0020.0005.1D5F4] # MATHEMATICAL SANS-SERIF BOLD SMALL G; QQK
+1D628 ; [.12B0.0020.0005.1D628] # MATHEMATICAL SANS-SERIF ITALIC SMALL G; QQK
+1D65C ; [.12B0.0020.0005.1D65C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G; QQK
+1D690 ; [.12B0.0020.0005.1D690] # MATHEMATICAL MONOSPACE SMALL G; QQK
+24D6 ; [.12B0.0020.0006.24D6] # CIRCLED LATIN SMALL LETTER G; QQK
+0047 ; [.12B0.0020.0008.0047] # LATIN CAPITAL LETTER G
+FF27 ; [.12B0.0020.0009.FF27] # FULLWIDTH LATIN CAPITAL LETTER G; QQK
+1F116 ; [*02FF.0020.0004.1F116][.12B0.0020.000A.1F116][*0300.0020.001F.1F116] # PARENTHESIZED LATIN CAPITAL LETTER G; QQKN
+1D406 ; [.12B0.0020.000B.1D406] # MATHEMATICAL BOLD CAPITAL G; QQK
+1D43A ; [.12B0.0020.000B.1D43A] # MATHEMATICAL ITALIC CAPITAL G; QQK
+1D46E ; [.12B0.0020.000B.1D46E] # MATHEMATICAL BOLD ITALIC CAPITAL G; QQK
+1D4A2 ; [.12B0.0020.000B.1D4A2] # MATHEMATICAL SCRIPT CAPITAL G; QQK
+1D4D6 ; [.12B0.0020.000B.1D4D6] # MATHEMATICAL BOLD SCRIPT CAPITAL G; QQK
+1D50A ; [.12B0.0020.000B.1D50A] # MATHEMATICAL FRAKTUR CAPITAL G; QQK
+1D53E ; [.12B0.0020.000B.1D53E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G; QQK
+1D572 ; [.12B0.0020.000B.1D572] # MATHEMATICAL BOLD FRAKTUR CAPITAL G; QQK
+1D5A6 ; [.12B0.0020.000B.1D5A6] # MATHEMATICAL SANS-SERIF CAPITAL G; QQK
+1D5DA ; [.12B0.0020.000B.1D5DA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G; QQK
+1D60E ; [.12B0.0020.000B.1D60E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G; QQK
+1D642 ; [.12B0.0020.000B.1D642] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G; QQK
+1D676 ; [.12B0.0020.000B.1D676] # MATHEMATICAL MONOSPACE CAPITAL G; QQK
+24BC ; [.12B0.0020.000C.24BC] # CIRCLED LATIN CAPITAL LETTER G; QQK
+1D4D ; [.12B0.0020.0014.1D4D] # MODIFIER LETTER SMALL G; QQK
+1D33 ; [.12B0.0020.001D.1D33] # MODIFIER LETTER CAPITAL G; QQK
+01F5 ; [.12B0.0020.0002.0067][.0000.0032.0002.0301] # LATIN SMALL LETTER G WITH ACUTE; QQCM
+01F4 ; [.12B0.0020.0008.0047][.0000.0032.0002.0301] # LATIN CAPITAL LETTER G WITH ACUTE; QQCM
+011F ; [.12B0.0020.0002.0067][.0000.0037.0002.0306] # LATIN SMALL LETTER G WITH BREVE; QQCM
+011E ; [.12B0.0020.0008.0047][.0000.0037.0002.0306] # LATIN CAPITAL LETTER G WITH BREVE; QQCM
+011D ; [.12B0.0020.0002.0067][.0000.003C.0002.0302] # LATIN SMALL LETTER G WITH CIRCUMFLEX; QQCM
+011C ; [.12B0.0020.0008.0047][.0000.003C.0002.0302] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX; QQCM
+01E7 ; [.12B0.0020.0002.0067][.0000.0041.0002.030C] # LATIN SMALL LETTER G WITH CARON; QQCM
+01E6 ; [.12B0.0020.0008.0047][.0000.0041.0002.030C] # LATIN CAPITAL LETTER G WITH CARON; QQCM
+0121 ; [.12B0.0020.0002.0067][.0000.0052.0002.0307] # LATIN SMALL LETTER G WITH DOT ABOVE; QQCM
+0120 ; [.12B0.0020.0008.0047][.0000.0052.0002.0307] # LATIN CAPITAL LETTER G WITH DOT ABOVE; QQCM
+0123 ; [.12B0.0020.0002.0067][.0000.0056.0002.0327] # LATIN SMALL LETTER G WITH CEDILLA; QQCM
+0122 ; [.12B0.0020.0008.0047][.0000.0056.0002.0327] # LATIN CAPITAL LETTER G WITH CEDILLA; QQCM
+1E21 ; [.12B0.0020.0002.0067][.0000.005B.0002.0304] # LATIN SMALL LETTER G WITH MACRON; QQCM
+1E20 ; [.12B0.0020.0008.0047][.0000.005B.0002.0304] # LATIN CAPITAL LETTER G WITH MACRON; QQCM
+1D79 ; [.12B0.0020.0004.1D79][.0000.015A.0004.1D79] # LATIN SMALL LETTER INSULAR G; QQKN
+A77D ; [.12B0.0020.000A.A77D][.0000.015A.0004.A77D] # LATIN CAPITAL LETTER INSULAR G; QQKN
+33FF ; [.12B0.0020.001C.33FF][.120F.0020.001C.33FF][.1330.0020.001F.33FF] # SQUARE GAL; QQKN
+3387 ; [.12B0.0020.001D.3387][.1225.0020.001D.3387] # SQUARE GB; QQKN
+3393 ; [.12B0.0020.001D.3393][.12D3.0020.001D.3393][.14AD.0020.001F.3393] # SQUARE GHZ; QQKN
+33AC ; [.12B0.0020.001D.33AC][.13B3.0020.001D.33AC][.120F.0020.001F.33AC] # SQUARE GPA; QQKN
+33C9 ; [.12B0.0020.001D.33C9][.149C.0020.001C.33C9] # SQUARE GY; QQKN
+0261 ; [.12B4.0020.0002.0261] # LATIN SMALL LETTER SCRIPT G
+1DA2 ; [.12B4.0020.0014.1DA2] # MODIFIER LETTER SMALL SCRIPT G; QQK
+0262 ; [.12B8.0020.0002.0262] # LATIN LETTER SMALL CAPITAL G
+1DDB ; [.12B8.0020.0004.1DDB] # COMBINING LATIN LETTER SMALL CAPITAL G; QQK
+01E5 ; [.12BC.0020.0002.01E5] # LATIN SMALL LETTER G WITH STROKE
+01E4 ; [.12BC.0020.0008.01E4] # LATIN CAPITAL LETTER G WITH STROKE
+1D83 ; [.12C0.0020.0002.1D83] # LATIN SMALL LETTER G WITH PALATAL HOOK
+0260 ; [.12C1.0020.0002.0260] # LATIN SMALL LETTER G WITH HOOK
+0193 ; [.12C1.0020.0008.0193] # LATIN CAPITAL LETTER G WITH HOOK
+029B ; [.12C5.0020.0002.029B] # LATIN LETTER SMALL CAPITAL G WITH HOOK
+1D77 ; [.12C9.0020.0002.1D77] # LATIN SMALL LETTER TURNED G
+A77F ; [.12CA.0020.0002.A77F] # LATIN SMALL LETTER TURNED INSULAR G
+A77E ; [.12CA.0020.0008.A77E] # LATIN CAPITAL LETTER TURNED INSULAR G
+0263 ; [.12CB.0020.0002.0263] # LATIN SMALL LETTER GAMMA
+0194 ; [.12CB.0020.0008.0194] # LATIN CAPITAL LETTER GAMMA
+02E0 ; [.12CB.0020.0014.02E0] # MODIFIER LETTER SMALL GAMMA; QQK
+01A3 ; [.12CF.0020.0002.01A3] # LATIN SMALL LETTER OI
+01A2 ; [.12CF.0020.0008.01A2] # LATIN CAPITAL LETTER OI
+0068 ; [.12D3.0020.0002.0068] # LATIN SMALL LETTER H
+FF48 ; [.12D3.0020.0003.FF48] # FULLWIDTH LATIN SMALL LETTER H; QQK
+036A ; [.12D3.0020.0004.036A] # COMBINING LATIN SMALL LETTER H; QQK
+24A3 ; [*02FF.0020.0004.24A3][.12D3.0020.0004.24A3][*0300.0020.001F.24A3] # PARENTHESIZED LATIN SMALL LETTER H; QQKN
+210E ; [.12D3.0020.0005.210E] # PLANCK CONSTANT; QQK
+1D421 ; [.12D3.0020.0005.1D421] # MATHEMATICAL BOLD SMALL H; QQK
+1D489 ; [.12D3.0020.0005.1D489] # MATHEMATICAL BOLD ITALIC SMALL H; QQK
+1D4BD ; [.12D3.0020.0005.1D4BD] # MATHEMATICAL SCRIPT SMALL H; QQK
+1D4F1 ; [.12D3.0020.0005.1D4F1] # MATHEMATICAL BOLD SCRIPT SMALL H; QQK
+1D525 ; [.12D3.0020.0005.1D525] # MATHEMATICAL FRAKTUR SMALL H; QQK
+1D559 ; [.12D3.0020.0005.1D559] # MATHEMATICAL DOUBLE-STRUCK SMALL H; QQK
+1D58D ; [.12D3.0020.0005.1D58D] # MATHEMATICAL BOLD FRAKTUR SMALL H; QQK
+1D5C1 ; [.12D3.0020.0005.1D5C1] # MATHEMATICAL SANS-SERIF SMALL H; QQK
+1D5F5 ; [.12D3.0020.0005.1D5F5] # MATHEMATICAL SANS-SERIF BOLD SMALL H; QQK
+1D629 ; [.12D3.0020.0005.1D629] # MATHEMATICAL SANS-SERIF ITALIC SMALL H; QQK
+1D65D ; [.12D3.0020.0005.1D65D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H; QQK
+1D691 ; [.12D3.0020.0005.1D691] # MATHEMATICAL MONOSPACE SMALL H; QQK
+24D7 ; [.12D3.0020.0006.24D7] # CIRCLED LATIN SMALL LETTER H; QQK
+0048 ; [.12D3.0020.0008.0048] # LATIN CAPITAL LETTER H
+FF28 ; [.12D3.0020.0009.FF28] # FULLWIDTH LATIN CAPITAL LETTER H; QQK
+1F117 ; [*02FF.0020.0004.1F117][.12D3.0020.000A.1F117][*0300.0020.001F.1F117] # PARENTHESIZED LATIN CAPITAL LETTER H; QQKN
+210B ; [.12D3.0020.000B.210B] # SCRIPT CAPITAL H; QQK
+210C ; [.12D3.0020.000B.210C] # BLACK-LETTER CAPITAL H; QQK
+210D ; [.12D3.0020.000B.210D] # DOUBLE-STRUCK CAPITAL H; QQK
+1D407 ; [.12D3.0020.000B.1D407] # MATHEMATICAL BOLD CAPITAL H; QQK
+1D43B ; [.12D3.0020.000B.1D43B] # MATHEMATICAL ITALIC CAPITAL H; QQK
+1D46F ; [.12D3.0020.000B.1D46F] # MATHEMATICAL BOLD ITALIC CAPITAL H; QQK
+1D4D7 ; [.12D3.0020.000B.1D4D7] # MATHEMATICAL BOLD SCRIPT CAPITAL H; QQK
+1D573 ; [.12D3.0020.000B.1D573] # MATHEMATICAL BOLD FRAKTUR CAPITAL H; QQK
+1D5A7 ; [.12D3.0020.000B.1D5A7] # MATHEMATICAL SANS-SERIF CAPITAL H; QQK
+1D5DB ; [.12D3.0020.000B.1D5DB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H; QQK
+1D60F ; [.12D3.0020.000B.1D60F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H; QQK
+1D643 ; [.12D3.0020.000B.1D643] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H; QQK
+1D677 ; [.12D3.0020.000B.1D677] # MATHEMATICAL MONOSPACE CAPITAL H; QQK
+24BD ; [.12D3.0020.000C.24BD] # CIRCLED LATIN CAPITAL LETTER H; QQK
+1F157 ; [.12D3.0020.000C.1F157] # NEGATIVE CIRCLED LATIN CAPITAL LETTER H; QQK
+02B0 ; [.12D3.0020.0014.02B0] # MODIFIER LETTER SMALL H; QQK
+1D34 ; [.12D3.0020.001D.1D34] # MODIFIER LETTER CAPITAL H; QQK
+0125 ; [.12D3.0020.0002.0068][.0000.003C.0002.0302] # LATIN SMALL LETTER H WITH CIRCUMFLEX; QQCM
+0124 ; [.12D3.0020.0008.0048][.0000.003C.0002.0302] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX; QQCM
+021F ; [.12D3.0020.0002.0068][.0000.0041.0002.030C] # LATIN SMALL LETTER H WITH CARON; QQCM
+021E ; [.12D3.0020.0008.0048][.0000.0041.0002.030C] # LATIN CAPITAL LETTER H WITH CARON; QQCM
+1E27 ; [.12D3.0020.0002.0068][.0000.0047.0002.0308] # LATIN SMALL LETTER H WITH DIAERESIS; QQCM
+1E26 ; [.12D3.0020.0008.0048][.0000.0047.0002.0308] # LATIN CAPITAL LETTER H WITH DIAERESIS; QQCM
+1E23 ; [.12D3.0020.0002.0068][.0000.0052.0002.0307] # LATIN SMALL LETTER H WITH DOT ABOVE; QQCM
+1E22 ; [.12D3.0020.0008.0048][.0000.0052.0002.0307] # LATIN CAPITAL LETTER H WITH DOT ABOVE; QQCM
+1E29 ; [.12D3.0020.0002.0068][.0000.0056.0002.0327] # LATIN SMALL LETTER H WITH CEDILLA; QQCM
+1E28 ; [.12D3.0020.0008.0048][.0000.0056.0002.0327] # LATIN CAPITAL LETTER H WITH CEDILLA; QQCM
+1E25 ; [.12D3.0020.0002.0068][.0000.0070.0002.0323] # LATIN SMALL LETTER H WITH DOT BELOW; QQCM
+1E24 ; [.12D3.0020.0008.0048][.0000.0070.0002.0323] # LATIN CAPITAL LETTER H WITH DOT BELOW; QQCM
+1E2B ; [.12D3.0020.0002.0068][.0000.0079.0002.032E] # LATIN SMALL LETTER H WITH BREVE BELOW; QQCM
+1E2A ; [.12D3.0020.0008.0048][.0000.0079.0002.032E] # LATIN CAPITAL LETTER H WITH BREVE BELOW; QQCM
+1E96 ; [.12D3.0020.0002.0068][.0000.007B.0002.0331] # LATIN SMALL LETTER H WITH LINE BELOW; QQCM
+0127 ; [.12D3.0020.0002.0068][.0000.007D.0002.0335] # LATIN SMALL LETTER H WITH STROKE; QQCM
+210F ; [.12D3.0020.0002.210F][.0000.007D.0002.210F] # PLANCK CONSTANT OVER TWO PI; QQKN
+0126 ; [.12D3.0020.0008.0048][.0000.007D.0002.0335] # LATIN CAPITAL LETTER H WITH STROKE; QQCM
+33CA ; [.12D3.0020.001C.33CA][.120F.0020.001C.33CA] # SQUARE HA; QQKN
+32CC ; [.12D3.0020.001D.32CC][.12B0.0020.001C.32CC] # SQUARE HG; QQKN
+33CB ; [.12D3.0020.001D.33CB][.13B3.0020.001D.33CB] # SQUARE HP; QQKN
+3371 ; [.12D3.0020.001C.3371][.13B3.0020.001D.3371][.120F.0020.001F.3371] # SQUARE HPA; QQKN
+1F14A ; [.12D3.0020.001D.1F14A][.147B.0020.001D.1F14A] # SQUARED HV; QQKN
+3390 ; [.12D3.0020.001D.3390][.14AD.0020.001C.3390] # SQUARE HZ; QQKN
+029C ; [.12D7.0020.0002.029C] # LATIN LETTER SMALL CAPITAL H
+0195 ; [.12DB.0020.0002.0195] # LATIN SMALL LETTER HV
+01F6 ; [.12DB.0020.0008.01F6] # LATIN CAPITAL LETTER HWAIR
+0266 ; [.12DF.0020.0002.0266] # LATIN SMALL LETTER H WITH HOOK
+02B1 ; [.12DF.0020.0014.02B1] # MODIFIER LETTER SMALL H WITH HOOK; QQK
+2C68 ; [.12E3.0020.0002.2C68] # LATIN SMALL LETTER H WITH DESCENDER
+2C67 ; [.12E3.0020.0008.2C67] # LATIN CAPITAL LETTER H WITH DESCENDER
+2C76 ; [.12E4.0020.0002.2C76] # LATIN SMALL LETTER HALF H
+2C75 ; [.12E4.0020.0008.2C75] # LATIN CAPITAL LETTER HALF H
+A727 ; [.12E5.0020.0002.A727] # LATIN SMALL LETTER HENG
+A726 ; [.12E5.0020.0008.A726] # LATIN CAPITAL LETTER HENG
+0267 ; [.12E6.0020.0002.0267] # LATIN SMALL LETTER HENG WITH HOOK
+02BB ; [.12EA.0020.0002.02BB] # MODIFIER LETTER TURNED COMMA
+02BD ; [.12EB.0020.0002.02BD] # MODIFIER LETTER REVERSED COMMA
+0069 ; [.12EC.0020.0002.0069] # LATIN SMALL LETTER I
+FF49 ; [.12EC.0020.0003.FF49] # FULLWIDTH LATIN SMALL LETTER I; QQK
+0365 ; [.12EC.0020.0004.0365] # COMBINING LATIN SMALL LETTER I; QQK
+2170 ; [.12EC.0020.0004.2170] # SMALL ROMAN NUMERAL ONE; QQK
+24A4 ; [*02FF.0020.0004.24A4][.12EC.0020.0004.24A4][*0300.0020.001F.24A4] # PARENTHESIZED LATIN SMALL LETTER I; QQKN
+2139 ; [.12EC.0020.0005.2139] # INFORMATION SOURCE; QQK
+2148 ; [.12EC.0020.0005.2148] # DOUBLE-STRUCK ITALIC SMALL I; QQK
+1D422 ; [.12EC.0020.0005.1D422] # MATHEMATICAL BOLD SMALL I; QQK
+1D456 ; [.12EC.0020.0005.1D456] # MATHEMATICAL ITALIC SMALL I; QQK
+1D48A ; [.12EC.0020.0005.1D48A] # MATHEMATICAL BOLD ITALIC SMALL I; QQK
+1D4BE ; [.12EC.0020.0005.1D4BE] # MATHEMATICAL SCRIPT SMALL I; QQK
+1D4F2 ; [.12EC.0020.0005.1D4F2] # MATHEMATICAL BOLD SCRIPT SMALL I; QQK
+1D526 ; [.12EC.0020.0005.1D526] # MATHEMATICAL FRAKTUR SMALL I; QQK
+1D55A ; [.12EC.0020.0005.1D55A] # MATHEMATICAL DOUBLE-STRUCK SMALL I; QQK
+1D58E ; [.12EC.0020.0005.1D58E] # MATHEMATICAL BOLD FRAKTUR SMALL I; QQK
+1D5C2 ; [.12EC.0020.0005.1D5C2] # MATHEMATICAL SANS-SERIF SMALL I; QQK
+1D5F6 ; [.12EC.0020.0005.1D5F6] # MATHEMATICAL SANS-SERIF BOLD SMALL I; QQK
+1D62A ; [.12EC.0020.0005.1D62A] # MATHEMATICAL SANS-SERIF ITALIC SMALL I; QQK
+1D65E ; [.12EC.0020.0005.1D65E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I; QQK
+1D692 ; [.12EC.0020.0005.1D692] # MATHEMATICAL MONOSPACE SMALL I; QQK
+24D8 ; [.12EC.0020.0006.24D8] # CIRCLED LATIN SMALL LETTER I; QQK
+0049 ; [.12EC.0020.0008.0049] # LATIN CAPITAL LETTER I
+FF29 ; [.12EC.0020.0009.FF29] # FULLWIDTH LATIN CAPITAL LETTER I; QQK
+2160 ; [.12EC.0020.000A.2160] # ROMAN NUMERAL ONE; QQK
+1F118 ; [*02FF.0020.0004.1F118][.12EC.0020.000A.1F118][*0300.0020.001F.1F118] # PARENTHESIZED LATIN CAPITAL LETTER I; QQKN
+2110 ; [.12EC.0020.000B.2110] # SCRIPT CAPITAL I; QQK
+2111 ; [.12EC.0020.000B.2111] # BLACK-LETTER CAPITAL I; QQK
+1D408 ; [.12EC.0020.000B.1D408] # MATHEMATICAL BOLD CAPITAL I; QQK
+1D43C ; [.12EC.0020.000B.1D43C] # MATHEMATICAL ITALIC CAPITAL I; QQK
+1D470 ; [.12EC.0020.000B.1D470] # MATHEMATICAL BOLD ITALIC CAPITAL I; QQK
+1D4D8 ; [.12EC.0020.000B.1D4D8] # MATHEMATICAL BOLD SCRIPT CAPITAL I; QQK
+1D540 ; [.12EC.0020.000B.1D540] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I; QQK
+1D574 ; [.12EC.0020.000B.1D574] # MATHEMATICAL BOLD FRAKTUR CAPITAL I; QQK
+1D5A8 ; [.12EC.0020.000B.1D5A8] # MATHEMATICAL SANS-SERIF CAPITAL I; QQK
+1D5DC ; [.12EC.0020.000B.1D5DC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I; QQK
+1D610 ; [.12EC.0020.000B.1D610] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I; QQK
+1D644 ; [.12EC.0020.000B.1D644] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I; QQK
+1D678 ; [.12EC.0020.000B.1D678] # MATHEMATICAL MONOSPACE CAPITAL I; QQK
+24BE ; [.12EC.0020.000C.24BE] # CIRCLED LATIN CAPITAL LETTER I; QQK
+2071 ; [.12EC.0020.0014.2071] # SUPERSCRIPT LATIN SMALL LETTER I; QQK
+1D62 ; [.12EC.0020.0015.1D62] # LATIN SUBSCRIPT SMALL LETTER I; QQK
+1D35 ; [.12EC.0020.001D.1D35] # MODIFIER LETTER CAPITAL I; QQK
+00ED ; [.12EC.0020.0002.0069][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH ACUTE; QQCM
+00CD ; [.12EC.0020.0008.0049][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH ACUTE; QQCM
+00EC ; [.12EC.0020.0002.0069][.0000.0035.0002.0300] # LATIN SMALL LETTER I WITH GRAVE; QQCM
+00CC ; [.12EC.0020.0008.0049][.0000.0035.0002.0300] # LATIN CAPITAL LETTER I WITH GRAVE; QQCM
+012D ; [.12EC.0020.0002.0069][.0000.0037.0002.0306] # LATIN SMALL LETTER I WITH BREVE; QQCM
+012C ; [.12EC.0020.0008.0049][.0000.0037.0002.0306] # LATIN CAPITAL LETTER I WITH BREVE; QQCM
+00EE ; [.12EC.0020.0002.0069][.0000.003C.0002.0302] # LATIN SMALL LETTER I WITH CIRCUMFLEX; QQCM
+00CE ; [.12EC.0020.0008.0049][.0000.003C.0002.0302] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX; QQCM
+01D0 ; [.12EC.0020.0002.0069][.0000.0041.0002.030C] # LATIN SMALL LETTER I WITH CARON; QQCM
+01CF ; [.12EC.0020.0008.0049][.0000.0041.0002.030C] # LATIN CAPITAL LETTER I WITH CARON; QQCM
+00EF ; [.12EC.0020.0002.0069][.0000.0047.0002.0308] # LATIN SMALL LETTER I WITH DIAERESIS; QQCM
+00CF ; [.12EC.0020.0008.0049][.0000.0047.0002.0308] # LATIN CAPITAL LETTER I WITH DIAERESIS; QQCM
+1E2F ; [.12EC.0020.0002.0069][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE; QQCM
+1E2E ; [.12EC.0020.0008.0049][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE; QQCM
+0129 ; [.12EC.0020.0002.0069][.0000.004E.0002.0303] # LATIN SMALL LETTER I WITH TILDE; QQCM
+0128 ; [.12EC.0020.0008.0049][.0000.004E.0002.0303] # LATIN CAPITAL LETTER I WITH TILDE; QQCM
+0130 ; [.12EC.0020.0008.0049][.0000.0052.0002.0307] # LATIN CAPITAL LETTER I WITH DOT ABOVE; QQCM
+012F ; [.12EC.0020.0002.0069][.0000.0059.0002.0328] # LATIN SMALL LETTER I WITH OGONEK; QQCM
+012E ; [.12EC.0020.0008.0049][.0000.0059.0002.0328] # LATIN CAPITAL LETTER I WITH OGONEK; QQCM
+012B ; [.12EC.0020.0002.0069][.0000.005B.0002.0304] # LATIN SMALL LETTER I WITH MACRON; QQCM
+012A ; [.12EC.0020.0008.0049][.0000.005B.0002.0304] # LATIN CAPITAL LETTER I WITH MACRON; QQCM
+1EC9 ; [.12EC.0020.0002.0069][.0000.0064.0002.0309] # LATIN SMALL LETTER I WITH HOOK ABOVE; QQCM
+1EC8 ; [.12EC.0020.0008.0049][.0000.0064.0002.0309] # LATIN CAPITAL LETTER I WITH HOOK ABOVE; QQCM
+0209 ; [.12EC.0020.0002.0069][.0000.0065.0002.030F] # LATIN SMALL LETTER I WITH DOUBLE GRAVE; QQCM
+0208 ; [.12EC.0020.0008.0049][.0000.0065.0002.030F] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE; QQCM
+020B ; [.12EC.0020.0002.0069][.0000.0067.0002.0311] # LATIN SMALL LETTER I WITH INVERTED BREVE; QQCM
+020A ; [.12EC.0020.0008.0049][.0000.0067.0002.0311] # LATIN CAPITAL LETTER I WITH INVERTED BREVE; QQCM
+1ECB ; [.12EC.0020.0002.0069][.0000.0070.0002.0323] # LATIN SMALL LETTER I WITH DOT BELOW; QQCM
+1ECA ; [.12EC.0020.0008.0049][.0000.0070.0002.0323] # LATIN CAPITAL LETTER I WITH DOT BELOW; QQCM
+1E2D ; [.12EC.0020.0002.0069][.0000.007A.0002.0330] # LATIN SMALL LETTER I WITH TILDE BELOW; QQCM
+1E2C ; [.12EC.0020.0008.0049][.0000.007A.0002.0330] # LATIN CAPITAL LETTER I WITH TILDE BELOW; QQCM
+1F18B ; [.12EC.0020.001D.1F18B][.123D.0020.001D.1F18B] # NEGATIVE SQUARED IC; QQKN
+2171 ; [.12EC.0020.0004.2171][.12EC.0020.0004.2171] # SMALL ROMAN NUMERAL TWO; QQKN
+2161 ; [.12EC.0020.000A.2161][.12EC.0020.000A.2161] # ROMAN NUMERAL TWO; QQKN
+2172 ; [.12EC.0020.0004.2172][.12EC.0020.0004.2172][.12EC.0020.001F.2172] # SMALL ROMAN NUMERAL THREE; QQKN
+2162 ; [.12EC.0020.000A.2162][.12EC.0020.000A.2162][.12EC.0020.001F.2162] # ROMAN NUMERAL THREE; QQKN
+0133 ; [.12EC.0020.0004.0133][.1305.0020.0004.0133] # LATIN SMALL LIGATURE IJ; QQKN
+0132 ; [.12EC.0020.000A.0132][.1305.0020.000A.0132] # LATIN CAPITAL LIGATURE IJ; QQKN
+33CC ; [.12EC.0020.001C.33CC][.136D.0020.001C.33CC] # SQUARE IN; QQKN
+337A ; [.12EC.0020.001D.337A][.1453.0020.001D.337A] # SQUARE IU; QQKN
+2173 ; [.12EC.0020.0004.2173][.147B.0020.0004.2173] # SMALL ROMAN NUMERAL FOUR; QQKN
+2163 ; [.12EC.0020.000A.2163][.147B.0020.000A.2163] # ROMAN NUMERAL FOUR; QQKN
+2178 ; [.12EC.0020.0004.2178][.1497.0020.0004.2178] # SMALL ROMAN NUMERAL NINE; QQKN
+2168 ; [.12EC.0020.000A.2168][.1497.0020.000A.2168] # ROMAN NUMERAL NINE; QQKN
+0131 ; [.12F0.0020.0002.0131] # LATIN SMALL LETTER DOTLESS I
+1D6A4 ; [.12F0.0020.0005.1D6A4] # MATHEMATICAL ITALIC SMALL DOTLESS I; QQK
+026A ; [.12F4.0020.0002.026A] # LATIN LETTER SMALL CAPITAL I
+1DA6 ; [.12F4.0020.0014.1DA6] # MODIFIER LETTER SMALL CAPITAL I; QQK
+A7FE ; [.12F8.0020.0002.A7FE] # LATIN EPIGRAPHIC LETTER I LONGA
+1D09 ; [.12F9.0020.0002.1D09] # LATIN SMALL LETTER TURNED I
+1D4E ; [.12F9.0020.0014.1D4E] # MODIFIER LETTER SMALL TURNED I; QQK
+0268 ; [.12FA.0020.0002.0268] # LATIN SMALL LETTER I WITH STROKE
+0197 ; [.12FA.0020.0008.0197] # LATIN CAPITAL LETTER I WITH STROKE
+1DA4 ; [.12FA.0020.0014.1DA4] # MODIFIER LETTER SMALL I WITH STROKE; QQK
+1D7B ; [.12FE.0020.0002.1D7B] # LATIN SMALL CAPITAL LETTER I WITH STROKE
+1DA7 ; [.12FE.0020.0014.1DA7] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE; QQK
+1D96 ; [.12FF.0020.0002.1D96] # LATIN SMALL LETTER I WITH RETROFLEX HOOK
+0269 ; [.1300.0020.0002.0269] # LATIN SMALL LETTER IOTA
+0196 ; [.1300.0020.0008.0196] # LATIN CAPITAL LETTER IOTA
+1DA5 ; [.1300.0020.0014.1DA5] # MODIFIER LETTER SMALL IOTA; QQK
+1D7C ; [.1304.0020.0002.1D7C] # LATIN SMALL LETTER IOTA WITH STROKE
+006A ; [.1305.0020.0002.006A] # LATIN SMALL LETTER J
+FF4A ; [.1305.0020.0003.FF4A] # FULLWIDTH LATIN SMALL LETTER J; QQK
+24A5 ; [*02FF.0020.0004.24A5][.1305.0020.0004.24A5][*0300.0020.001F.24A5] # PARENTHESIZED LATIN SMALL LETTER J; QQKN
+2149 ; [.1305.0020.0005.2149] # DOUBLE-STRUCK ITALIC SMALL J; QQK
+1D423 ; [.1305.0020.0005.1D423] # MATHEMATICAL BOLD SMALL J; QQK
+1D457 ; [.1305.0020.0005.1D457] # MATHEMATICAL ITALIC SMALL J; QQK
+1D48B ; [.1305.0020.0005.1D48B] # MATHEMATICAL BOLD ITALIC SMALL J; QQK
+1D4BF ; [.1305.0020.0005.1D4BF] # MATHEMATICAL SCRIPT SMALL J; QQK
+1D4F3 ; [.1305.0020.0005.1D4F3] # MATHEMATICAL BOLD SCRIPT SMALL J; QQK
+1D527 ; [.1305.0020.0005.1D527] # MATHEMATICAL FRAKTUR SMALL J; QQK
+1D55B ; [.1305.0020.0005.1D55B] # MATHEMATICAL DOUBLE-STRUCK SMALL J; QQK
+1D58F ; [.1305.0020.0005.1D58F] # MATHEMATICAL BOLD FRAKTUR SMALL J; QQK
+1D5C3 ; [.1305.0020.0005.1D5C3] # MATHEMATICAL SANS-SERIF SMALL J; QQK
+1D5F7 ; [.1305.0020.0005.1D5F7] # MATHEMATICAL SANS-SERIF BOLD SMALL J; QQK
+1D62B ; [.1305.0020.0005.1D62B] # MATHEMATICAL SANS-SERIF ITALIC SMALL J; QQK
+1D65F ; [.1305.0020.0005.1D65F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J; QQK
+1D693 ; [.1305.0020.0005.1D693] # MATHEMATICAL MONOSPACE SMALL J; QQK
+24D9 ; [.1305.0020.0006.24D9] # CIRCLED LATIN SMALL LETTER J; QQK
+004A ; [.1305.0020.0008.004A] # LATIN CAPITAL LETTER J
+FF2A ; [.1305.0020.0009.FF2A] # FULLWIDTH LATIN CAPITAL LETTER J; QQK
+1F119 ; [*02FF.0020.0004.1F119][.1305.0020.000A.1F119][*0300.0020.001F.1F119] # PARENTHESIZED LATIN CAPITAL LETTER J; QQKN
+1D409 ; [.1305.0020.000B.1D409] # MATHEMATICAL BOLD CAPITAL J; QQK
+1D43D ; [.1305.0020.000B.1D43D] # MATHEMATICAL ITALIC CAPITAL J; QQK
+1D471 ; [.1305.0020.000B.1D471] # MATHEMATICAL BOLD ITALIC CAPITAL J; QQK
+1D4A5 ; [.1305.0020.000B.1D4A5] # MATHEMATICAL SCRIPT CAPITAL J; QQK
+1D4D9 ; [.1305.0020.000B.1D4D9] # MATHEMATICAL BOLD SCRIPT CAPITAL J; QQK
+1D50D ; [.1305.0020.000B.1D50D] # MATHEMATICAL FRAKTUR CAPITAL J; QQK
+1D541 ; [.1305.0020.000B.1D541] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J; QQK
+1D575 ; [.1305.0020.000B.1D575] # MATHEMATICAL BOLD FRAKTUR CAPITAL J; QQK
+1D5A9 ; [.1305.0020.000B.1D5A9] # MATHEMATICAL SANS-SERIF CAPITAL J; QQK
+1D5DD ; [.1305.0020.000B.1D5DD] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J; QQK
+1D611 ; [.1305.0020.000B.1D611] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J; QQK
+1D645 ; [.1305.0020.000B.1D645] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J; QQK
+1D679 ; [.1305.0020.000B.1D679] # MATHEMATICAL MONOSPACE CAPITAL J; QQK
+24BF ; [.1305.0020.000C.24BF] # CIRCLED LATIN CAPITAL LETTER J; QQK
+02B2 ; [.1305.0020.0014.02B2] # MODIFIER LETTER SMALL J; QQK
+2C7C ; [.1305.0020.0015.2C7C] # LATIN SUBSCRIPT SMALL LETTER J; QQK
+1D36 ; [.1305.0020.001D.1D36] # MODIFIER LETTER CAPITAL J; QQK
+1F179 ; [.1305.0020.001D.1F179] # NEGATIVE SQUARED LATIN CAPITAL LETTER J; QQK
+0135 ; [.1305.0020.0002.006A][.0000.003C.0002.0302] # LATIN SMALL LETTER J WITH CIRCUMFLEX; QQCM
+0134 ; [.1305.0020.0008.004A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX; QQCM
+01F0 ; [.1305.0020.0002.006A][.0000.0041.0002.030C] # LATIN SMALL LETTER J WITH CARON; QQCM
+0237 ; [.1309.0020.0002.0237] # LATIN SMALL LETTER DOTLESS J
+1D6A5 ; [.1309.0020.0005.1D6A5] # MATHEMATICAL ITALIC SMALL DOTLESS J; QQK
+1D0A ; [.130D.0020.0002.1D0A] # LATIN LETTER SMALL CAPITAL J
+0249 ; [.130E.0020.0002.0249] # LATIN SMALL LETTER J WITH STROKE
+0248 ; [.130E.0020.0008.0248] # LATIN CAPITAL LETTER J WITH STROKE
+029D ; [.1312.0020.0002.029D] # LATIN SMALL LETTER J WITH CROSSED-TAIL
+1DA8 ; [.1312.0020.0014.1DA8] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL; QQK
+025F ; [.1316.0020.0002.025F] # LATIN SMALL LETTER DOTLESS J WITH STROKE
+1DA1 ; [.1316.0020.0014.1DA1] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE; QQK
+0284 ; [.131A.0020.0002.0284] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+006B ; [.131E.0020.0002.006B] # LATIN SMALL LETTER K
+FF4B ; [.131E.0020.0003.FF4B] # FULLWIDTH LATIN SMALL LETTER K; QQK
+1DDC ; [.131E.0020.0004.1DDC] # COMBINING LATIN SMALL LETTER K; QQK
+24A6 ; [*02FF.0020.0004.24A6][.131E.0020.0004.24A6][*0300.0020.001F.24A6] # PARENTHESIZED LATIN SMALL LETTER K; QQKN
+1D424 ; [.131E.0020.0005.1D424] # MATHEMATICAL BOLD SMALL K; QQK
+1D458 ; [.131E.0020.0005.1D458] # MATHEMATICAL ITALIC SMALL K; QQK
+1D48C ; [.131E.0020.0005.1D48C] # MATHEMATICAL BOLD ITALIC SMALL K; QQK
+1D4C0 ; [.131E.0020.0005.1D4C0] # MATHEMATICAL SCRIPT SMALL K; QQK
+1D4F4 ; [.131E.0020.0005.1D4F4] # MATHEMATICAL BOLD SCRIPT SMALL K; QQK
+1D528 ; [.131E.0020.0005.1D528] # MATHEMATICAL FRAKTUR SMALL K; QQK
+1D55C ; [.131E.0020.0005.1D55C] # MATHEMATICAL DOUBLE-STRUCK SMALL K; QQK
+1D590 ; [.131E.0020.0005.1D590] # MATHEMATICAL BOLD FRAKTUR SMALL K; QQK
+1D5C4 ; [.131E.0020.0005.1D5C4] # MATHEMATICAL SANS-SERIF SMALL K; QQK
+1D5F8 ; [.131E.0020.0005.1D5F8] # MATHEMATICAL SANS-SERIF BOLD SMALL K; QQK
+1D62C ; [.131E.0020.0005.1D62C] # MATHEMATICAL SANS-SERIF ITALIC SMALL K; QQK
+1D660 ; [.131E.0020.0005.1D660] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K; QQK
+1D694 ; [.131E.0020.0005.1D694] # MATHEMATICAL MONOSPACE SMALL K; QQK
+24DA ; [.131E.0020.0006.24DA] # CIRCLED LATIN SMALL LETTER K; QQK
+004B ; [.131E.0020.0008.004B] # LATIN CAPITAL LETTER K
+212A ; [.131E.0020.0008.212A] # KELVIN SIGN; QQC
+FF2B ; [.131E.0020.0009.FF2B] # FULLWIDTH LATIN CAPITAL LETTER K; QQK
+1F11A ; [*02FF.0020.0004.1F11A][.131E.0020.000A.1F11A][*0300.0020.001F.1F11A] # PARENTHESIZED LATIN CAPITAL LETTER K; QQKN
+1D40A ; [.131E.0020.000B.1D40A] # MATHEMATICAL BOLD CAPITAL K; QQK
+1D43E ; [.131E.0020.000B.1D43E] # MATHEMATICAL ITALIC CAPITAL K; QQK
+1D472 ; [.131E.0020.000B.1D472] # MATHEMATICAL BOLD ITALIC CAPITAL K; QQK
+1D4A6 ; [.131E.0020.000B.1D4A6] # MATHEMATICAL SCRIPT CAPITAL K; QQK
+1D4DA ; [.131E.0020.000B.1D4DA] # MATHEMATICAL BOLD SCRIPT CAPITAL K; QQK
+1D50E ; [.131E.0020.000B.1D50E] # MATHEMATICAL FRAKTUR CAPITAL K; QQK
+1D542 ; [.131E.0020.000B.1D542] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K; QQK
+1D576 ; [.131E.0020.000B.1D576] # MATHEMATICAL BOLD FRAKTUR CAPITAL K; QQK
+1D5AA ; [.131E.0020.000B.1D5AA] # MATHEMATICAL SANS-SERIF CAPITAL K; QQK
+1D5DE ; [.131E.0020.000B.1D5DE] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K; QQK
+1D612 ; [.131E.0020.000B.1D612] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K; QQK
+1D646 ; [.131E.0020.000B.1D646] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K; QQK
+1D67A ; [.131E.0020.000B.1D67A] # MATHEMATICAL MONOSPACE CAPITAL K; QQK
+24C0 ; [.131E.0020.000C.24C0] # CIRCLED LATIN CAPITAL LETTER K; QQK
+1D4F ; [.131E.0020.0014.1D4F] # MODIFIER LETTER SMALL K; QQK
+1D37 ; [.131E.0020.001D.1D37] # MODIFIER LETTER CAPITAL K; QQK
+1E31 ; [.131E.0020.0002.006B][.0000.0032.0002.0301] # LATIN SMALL LETTER K WITH ACUTE; QQCM
+1E30 ; [.131E.0020.0008.004B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER K WITH ACUTE; QQCM
+01E9 ; [.131E.0020.0002.006B][.0000.0041.0002.030C] # LATIN SMALL LETTER K WITH CARON; QQCM
+01E8 ; [.131E.0020.0008.004B][.0000.0041.0002.030C] # LATIN CAPITAL LETTER K WITH CARON; QQCM
+0137 ; [.131E.0020.0002.006B][.0000.0056.0002.0327] # LATIN SMALL LETTER K WITH CEDILLA; QQCM
+0136 ; [.131E.0020.0008.004B][.0000.0056.0002.0327] # LATIN CAPITAL LETTER K WITH CEDILLA; QQCM
+1E33 ; [.131E.0020.0002.006B][.0000.0070.0002.0323] # LATIN SMALL LETTER K WITH DOT BELOW; QQCM
+1E32 ; [.131E.0020.0008.004B][.0000.0070.0002.0323] # LATIN CAPITAL LETTER K WITH DOT BELOW; QQCM
+1E35 ; [.131E.0020.0002.006B][.0000.007B.0002.0331] # LATIN SMALL LETTER K WITH LINE BELOW; QQCM
+1E34 ; [.131E.0020.0008.004B][.0000.007B.0002.0331] # LATIN CAPITAL LETTER K WITH LINE BELOW; QQCM
+3384 ; [.131E.0020.001C.3384][.120F.0020.001D.3384] # SQUARE KA; QQKN
+3385 ; [.131E.0020.001D.3385][.1225.0020.001D.3385] # SQUARE KB; QQKN
+3389 ; [.131E.0020.001C.3389][.123D.0020.001C.3389][.120F.0020.001F.3389][.1330.0020.001F.3389] # SQUARE KCAL; QQKN
+338F ; [.131E.0020.001C.338F][.12B0.0020.001C.338F] # SQUARE KG; QQKN
+3391 ; [.131E.0020.001C.3391][.12D3.0020.001D.3391][.14AD.0020.001F.3391] # SQUARE KHZ; QQKN
+33CD ; [.131E.0020.001D.33CD][.131E.0020.001D.33CD] # SQUARE KK; QQKN
+3398 ; [.131E.0020.001C.3398][.1330.0020.001C.3398] # SQUARE KL; QQKN
+339E ; [.131E.0020.001C.339E][.135F.0020.001C.339E] # SQUARE KM; QQKN
+33CE ; [.131E.0020.001D.33CE][.135F.0020.001D.33CE] # SQUARE KM CAPITAL; QQKN
+33A2 ; [.131E.0020.001C.33A2][.135F.0020.001C.33A2][.1207.0020.001F.33A2] # SQUARE KM SQUARED; QQKN
+33A6 ; [.131E.0020.001C.33A6][.135F.0020.001C.33A6][.1208.0020.001F.33A6] # SQUARE KM CUBED; QQKN
+33AA ; [.131E.0020.001C.33AA][.13B3.0020.001D.33AA][.120F.0020.001F.33AA] # SQUARE KPA; QQKN
+33CF ; [.131E.0020.001C.33CF][.1433.0020.001C.33CF] # SQUARE KT; QQKN
+33B8 ; [.131E.0020.001C.33B8][.147B.0020.001D.33B8] # SQUARE KV; QQKN
+33BE ; [.131E.0020.001C.33BE][.148D.0020.001D.33BE] # SQUARE KW; QQKN
+33C0 ; [.131E.0020.001C.33C0][.156D.0020.001D.33C0] # SQUARE K OHM; QQKN
+1D0B ; [.1322.0020.0002.1D0B] # LATIN LETTER SMALL CAPITAL K
+1D84 ; [.1323.0020.0002.1D84] # LATIN SMALL LETTER K WITH PALATAL HOOK
+0199 ; [.1324.0020.0002.0199] # LATIN SMALL LETTER K WITH HOOK
+0198 ; [.1324.0020.0008.0198] # LATIN CAPITAL LETTER K WITH HOOK
+2C6A ; [.1328.0020.0002.2C6A] # LATIN SMALL LETTER K WITH DESCENDER
+2C69 ; [.1328.0020.0008.2C69] # LATIN CAPITAL LETTER K WITH DESCENDER
+A741 ; [.1329.0020.0002.A741] # LATIN SMALL LETTER K WITH STROKE
+A740 ; [.1329.0020.0008.A740] # LATIN CAPITAL LETTER K WITH STROKE
+A743 ; [.132A.0020.0002.A743] # LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A742 ; [.132A.0020.0008.A742] # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A745 ; [.132B.0020.0002.A745] # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A744 ; [.132B.0020.0008.A744] # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+029E ; [.132C.0020.0002.029E] # LATIN SMALL LETTER TURNED K
+006C ; [.1330.0020.0002.006C] # LATIN SMALL LETTER L
+FF4C ; [.1330.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK
+1DDD ; [.1330.0020.0004.1DDD] # COMBINING LATIN SMALL LETTER L; QQK
+217C ; [.1330.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK
+24A7 ; [*02FF.0020.0004.24A7][.1330.0020.0004.24A7][*0300.0020.001F.24A7] # PARENTHESIZED LATIN SMALL LETTER L; QQKN
+2113 ; [.1330.0020.0005.2113] # SCRIPT SMALL L; QQK
+1D425 ; [.1330.0020.0005.1D425] # MATHEMATICAL BOLD SMALL L; QQK
+1D459 ; [.1330.0020.0005.1D459] # MATHEMATICAL ITALIC SMALL L; QQK
+1D48D ; [.1330.0020.0005.1D48D] # MATHEMATICAL BOLD ITALIC SMALL L; QQK
+1D4C1 ; [.1330.0020.0005.1D4C1] # MATHEMATICAL SCRIPT SMALL L; QQK
+1D4F5 ; [.1330.0020.0005.1D4F5] # MATHEMATICAL BOLD SCRIPT SMALL L; QQK
+1D529 ; [.1330.0020.0005.1D529] # MATHEMATICAL FRAKTUR SMALL L; QQK
+1D55D ; [.1330.0020.0005.1D55D] # MATHEMATICAL DOUBLE-STRUCK SMALL L; QQK
+1D591 ; [.1330.0020.0005.1D591] # MATHEMATICAL BOLD FRAKTUR SMALL L; QQK
+1D5C5 ; [.1330.0020.0005.1D5C5] # MATHEMATICAL SANS-SERIF SMALL L; QQK
+1D5F9 ; [.1330.0020.0005.1D5F9] # MATHEMATICAL SANS-SERIF BOLD SMALL L; QQK
+1D62D ; [.1330.0020.0005.1D62D] # MATHEMATICAL SANS-SERIF ITALIC SMALL L; QQK
+1D661 ; [.1330.0020.0005.1D661] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L; QQK
+1D695 ; [.1330.0020.0005.1D695] # MATHEMATICAL MONOSPACE SMALL L; QQK
+24DB ; [.1330.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK
+004C ; [.1330.0020.0008.004C] # LATIN CAPITAL LETTER L
+FF2C ; [.1330.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK
+216C ; [.1330.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK
+1F11B ; [*02FF.0020.0004.1F11B][.1330.0020.000A.1F11B][*0300.0020.001F.1F11B] # PARENTHESIZED LATIN CAPITAL LETTER L; QQKN
+2112 ; [.1330.0020.000B.2112] # SCRIPT CAPITAL L; QQK
+1D40B ; [.1330.0020.000B.1D40B] # MATHEMATICAL BOLD CAPITAL L; QQK
+1D43F ; [.1330.0020.000B.1D43F] # MATHEMATICAL ITALIC CAPITAL L; QQK
+1D473 ; [.1330.0020.000B.1D473] # MATHEMATICAL BOLD ITALIC CAPITAL L; QQK
+1D4DB ; [.1330.0020.000B.1D4DB] # MATHEMATICAL BOLD SCRIPT CAPITAL L; QQK
+1D50F ; [.1330.0020.000B.1D50F] # MATHEMATICAL FRAKTUR CAPITAL L; QQK
+1D543 ; [.1330.0020.000B.1D543] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L; QQK
+1D577 ; [.1330.0020.000B.1D577] # MATHEMATICAL BOLD FRAKTUR CAPITAL L; QQK
+1D5AB ; [.1330.0020.000B.1D5AB] # MATHEMATICAL SANS-SERIF CAPITAL L; QQK
+1D5DF ; [.1330.0020.000B.1D5DF] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L; QQK
+1D613 ; [.1330.0020.000B.1D613] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L; QQK
+1D647 ; [.1330.0020.000B.1D647] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L; QQK
+1D67B ; [.1330.0020.000B.1D67B] # MATHEMATICAL MONOSPACE CAPITAL L; QQK
+24C1 ; [.1330.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK
+02E1 ; [.1330.0020.0014.02E1] # MODIFIER LETTER SMALL L; QQK
+1D38 ; [.1330.0020.001D.1D38] # MODIFIER LETTER CAPITAL L; QQK
+1F17B ; [.1330.0020.001D.1F17B] # NEGATIVE SQUARED LATIN CAPITAL LETTER L; QQK
+013A ; [.1330.0020.0002.006C][.0000.0032.0002.0301] # LATIN SMALL LETTER L WITH ACUTE; QQCM
+0139 ; [.1330.0020.0008.004C][.0000.0032.0002.0301] # LATIN CAPITAL LETTER L WITH ACUTE; QQCM
+013E ; [.1330.0020.0002.006C][.0000.0041.0002.030C] # LATIN SMALL LETTER L WITH CARON; QQCM
+013D ; [.1330.0020.0008.004C][.0000.0041.0002.030C] # LATIN CAPITAL LETTER L WITH CARON; QQCM
+013C ; [.1330.0020.0002.006C][.0000.0056.0002.0327] # LATIN SMALL LETTER L WITH CEDILLA; QQCM
+013B ; [.1330.0020.0008.004C][.0000.0056.0002.0327] # LATIN CAPITAL LETTER L WITH CEDILLA; QQCM
+1E37 ; [.1330.0020.0002.006C][.0000.0070.0002.0323] # LATIN SMALL LETTER L WITH DOT BELOW; QQCM
+1E36 ; [.1330.0020.0008.004C][.0000.0070.0002.0323] # LATIN CAPITAL LETTER L WITH DOT BELOW; QQCM
+1E39 ; [.1330.0020.0002.006C][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON; QQCM
+1E38 ; [.1330.0020.0008.004C][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON; QQCM
+1E3D ; [.1330.0020.0002.006C][.0000.0078.0002.032D] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW; QQCM
+1E3C ; [.1330.0020.0008.004C][.0000.0078.0002.032D] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW; QQCM
+1E3B ; [.1330.0020.0002.006C][.0000.007B.0002.0331] # LATIN SMALL LETTER L WITH LINE BELOW; QQCM
+1E3A ; [.1330.0020.0008.004C][.0000.007B.0002.0331] # LATIN CAPITAL LETTER L WITH LINE BELOW; QQCM
+0142 ; [.1330.0020.0002.006C][.0000.007D.0002.0335] # LATIN SMALL LETTER L WITH STROKE; QQCM
+0141 ; [.1330.0020.0008.004C][.0000.007D.0002.0335] # LATIN CAPITAL LETTER L WITH STROKE; QQCM
+0140 ; [.1330.0020.0002.0140][.0000.0159.0002.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT; QQKL
+006C 00B7 ; [.1330.0020.0002.0140][.0000.0159.0002.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT
+006C 0387 ; [.1330.0020.0002.0140][.0000.0159.0002.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT
+013F ; [.1330.0020.0008.013F][.0000.0159.0002.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT; QQKL
+004C 00B7 ; [.1330.0020.0008.013F][.0000.0159.0002.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+004C 0387 ; [.1330.0020.0008.013F][.0000.0159.0002.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+01C9 ; [.1330.0020.0004.01C9][.1305.0020.0004.01C9] # LATIN SMALL LETTER LJ; QQKN
+01C8 ; [.1330.0020.000A.01C8][.1305.0020.0004.01C8] # LATIN CAPITAL LETTER L WITH SMALL LETTER J; QQKN
+01C7 ; [.1330.0020.000A.01C7][.1305.0020.000A.01C7] # LATIN CAPITAL LETTER LJ; QQKN
+1EFB ; [.1330.0020.0004.1EFB][.1330.0020.0004.1EFB] # LATIN SMALL LETTER MIDDLE-WELSH LL; QQKN
+1EFA ; [.1330.0020.000A.1EFA][.1330.0020.000A.1EFA] # LATIN CAPITAL LETTER MIDDLE-WELSH LL; QQKN
+33D0 ; [.1330.0020.001C.33D0][.135F.0020.001C.33D0] # SQUARE LM; QQKN
+33D1 ; [.1330.0020.001C.33D1][.136D.0020.001C.33D1] # SQUARE LN; QQKN
+33D2 ; [.1330.0020.001C.33D2][.138E.0020.001C.33D2][.12B0.0020.001F.33D2] # SQUARE LOG; QQKN
+02AA ; [.1330.0020.0004.02AA][.1410.0020.0004.02AA] # LATIN SMALL LETTER LS DIGRAPH; QQKN
+32CF ; [.1330.0020.001D.32CF][.1433.0020.001D.32CF][.1250.0020.001F.32CF] # LIMITED LIABILITY SIGN; QQKN
+33D3 ; [.1330.0020.001C.33D3][.1497.0020.001C.33D3] # SQUARE LX; QQKN
+02AB ; [.1330.0020.0004.02AB][.14AD.0020.0004.02AB] # LATIN SMALL LETTER LZ DIGRAPH; QQKN
+029F ; [.1334.0020.0002.029F] # LATIN LETTER SMALL CAPITAL L
+1DDE ; [.1334.0020.0004.1DDE] # COMBINING LATIN LETTER SMALL CAPITAL L; QQK
+1DAB ; [.1334.0020.0014.1DAB] # MODIFIER LETTER SMALL CAPITAL L; QQK
+A747 ; [.1338.0020.0002.A747] # LATIN SMALL LETTER BROKEN L
+A746 ; [.1338.0020.0008.A746] # LATIN CAPITAL LETTER BROKEN L
+1D0C ; [.1339.0020.0002.1D0C] # LATIN LETTER SMALL CAPITAL L WITH STROKE
+A749 ; [.133A.0020.0002.A749] # LATIN SMALL LETTER L WITH HIGH STROKE
+A748 ; [.133A.0020.0008.A748] # LATIN CAPITAL LETTER L WITH HIGH STROKE
+019A ; [.133B.0020.0002.019A] # LATIN SMALL LETTER L WITH BAR
+023D ; [.133B.0020.0008.023D] # LATIN CAPITAL LETTER L WITH BAR
+2C61 ; [.133F.0020.0002.2C61] # LATIN SMALL LETTER L WITH DOUBLE BAR
+2C60 ; [.133F.0020.0008.2C60] # LATIN CAPITAL LETTER L WITH DOUBLE BAR
+026B ; [.1340.0020.0002.026B] # LATIN SMALL LETTER L WITH MIDDLE TILDE
+2C62 ; [.1340.0020.0008.2C62] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+026C ; [.1344.0020.0002.026C] # LATIN SMALL LETTER L WITH BELT
+1D85 ; [.1348.0020.0002.1D85] # LATIN SMALL LETTER L WITH PALATAL HOOK
+1DAA ; [.1348.0020.0014.1DAA] # MODIFIER LETTER SMALL L WITH PALATAL HOOK; QQK
+026D ; [.1349.0020.0002.026D] # LATIN SMALL LETTER L WITH RETROFLEX HOOK
+1DA9 ; [.1349.0020.0014.1DA9] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK; QQK
+0234 ; [.134D.0020.0002.0234] # LATIN SMALL LETTER L WITH CURL
+A772 ; [.1351.0020.0002.A772] # LATIN SMALL LETTER LUM
+026E ; [.1352.0020.0002.026E] # LATIN SMALL LETTER LEZH
+A781 ; [.1356.0020.0002.A781] # LATIN SMALL LETTER TURNED L
+A780 ; [.1356.0020.0008.A780] # LATIN CAPITAL LETTER TURNED L
+019B ; [.1357.0020.0002.019B] # LATIN SMALL LETTER LAMBDA WITH STROKE
+028E ; [.135B.0020.0002.028E] # LATIN SMALL LETTER TURNED Y
+006D ; [.135F.0020.0002.006D] # LATIN SMALL LETTER M
+FF4D ; [.135F.0020.0003.FF4D] # FULLWIDTH LATIN SMALL LETTER M; QQK
+036B ; [.135F.0020.0004.036B] # COMBINING LATIN SMALL LETTER M; QQK
+217F ; [.135F.0020.0004.217F] # SMALL ROMAN NUMERAL ONE THOUSAND; QQK
+24A8 ; [*02FF.0020.0004.24A8][.135F.0020.0004.24A8][*0300.0020.001F.24A8] # PARENTHESIZED LATIN SMALL LETTER M; QQKN
+1D426 ; [.135F.0020.0005.1D426] # MATHEMATICAL BOLD SMALL M; QQK
+1D45A ; [.135F.0020.0005.1D45A] # MATHEMATICAL ITALIC SMALL M; QQK
+1D48E ; [.135F.0020.0005.1D48E] # MATHEMATICAL BOLD ITALIC SMALL M; QQK
+1D4C2 ; [.135F.0020.0005.1D4C2] # MATHEMATICAL SCRIPT SMALL M; QQK
+1D4F6 ; [.135F.0020.0005.1D4F6] # MATHEMATICAL BOLD SCRIPT SMALL M; QQK
+1D52A ; [.135F.0020.0005.1D52A] # MATHEMATICAL FRAKTUR SMALL M; QQK
+1D55E ; [.135F.0020.0005.1D55E] # MATHEMATICAL DOUBLE-STRUCK SMALL M; QQK
+1D592 ; [.135F.0020.0005.1D592] # MATHEMATICAL BOLD FRAKTUR SMALL M; QQK
+1D5C6 ; [.135F.0020.0005.1D5C6] # MATHEMATICAL SANS-SERIF SMALL M; QQK
+1D5FA ; [.135F.0020.0005.1D5FA] # MATHEMATICAL SANS-SERIF BOLD SMALL M; QQK
+1D62E ; [.135F.0020.0005.1D62E] # MATHEMATICAL SANS-SERIF ITALIC SMALL M; QQK
+1D662 ; [.135F.0020.0005.1D662] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M; QQK
+1D696 ; [.135F.0020.0005.1D696] # MATHEMATICAL MONOSPACE SMALL M; QQK
+24DC ; [.135F.0020.0006.24DC] # CIRCLED LATIN SMALL LETTER M; QQK
+004D ; [.135F.0020.0008.004D] # LATIN CAPITAL LETTER M
+FF2D ; [.135F.0020.0009.FF2D] # FULLWIDTH LATIN CAPITAL LETTER M; QQK
+216F ; [.135F.0020.000A.216F] # ROMAN NUMERAL ONE THOUSAND; QQK
+1F11C ; [*02FF.0020.0004.1F11C][.135F.0020.000A.1F11C][*0300.0020.001F.1F11C] # PARENTHESIZED LATIN CAPITAL LETTER M; QQKN
+2133 ; [.135F.0020.000B.2133] # SCRIPT CAPITAL M; QQK
+1D40C ; [.135F.0020.000B.1D40C] # MATHEMATICAL BOLD CAPITAL M; QQK
+1D440 ; [.135F.0020.000B.1D440] # MATHEMATICAL ITALIC CAPITAL M; QQK
+1D474 ; [.135F.0020.000B.1D474] # MATHEMATICAL BOLD ITALIC CAPITAL M; QQK
+1D4DC ; [.135F.0020.000B.1D4DC] # MATHEMATICAL BOLD SCRIPT CAPITAL M; QQK
+1D510 ; [.135F.0020.000B.1D510] # MATHEMATICAL FRAKTUR CAPITAL M; QQK
+1D544 ; [.135F.0020.000B.1D544] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M; QQK
+1D578 ; [.135F.0020.000B.1D578] # MATHEMATICAL BOLD FRAKTUR CAPITAL M; QQK
+1D5AC ; [.135F.0020.000B.1D5AC] # MATHEMATICAL SANS-SERIF CAPITAL M; QQK
+1D5E0 ; [.135F.0020.000B.1D5E0] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M; QQK
+1D614 ; [.135F.0020.000B.1D614] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M; QQK
+1D648 ; [.135F.0020.000B.1D648] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M; QQK
+1D67C ; [.135F.0020.000B.1D67C] # MATHEMATICAL MONOSPACE CAPITAL M; QQK
+24C2 ; [.135F.0020.000C.24C2] # CIRCLED LATIN CAPITAL LETTER M; QQK
+1D50 ; [.135F.0020.0014.1D50] # MODIFIER LETTER SMALL M; QQK
+1D39 ; [.135F.0020.001D.1D39] # MODIFIER LETTER CAPITAL M; QQK
+1F17C ; [.135F.0020.001D.1F17C] # NEGATIVE SQUARED LATIN CAPITAL LETTER M; QQK
+1E3F ; [.135F.0020.0002.006D][.0000.0032.0002.0301] # LATIN SMALL LETTER M WITH ACUTE; QQCM
+1E3E ; [.135F.0020.0008.004D][.0000.0032.0002.0301] # LATIN CAPITAL LETTER M WITH ACUTE; QQCM
+1E41 ; [.135F.0020.0002.006D][.0000.0052.0002.0307] # LATIN SMALL LETTER M WITH DOT ABOVE; QQCM
+1E40 ; [.135F.0020.0008.004D][.0000.0052.0002.0307] # LATIN CAPITAL LETTER M WITH DOT ABOVE; QQCM
+1E43 ; [.135F.0020.0002.006D][.0000.0070.0002.0323] # LATIN SMALL LETTER M WITH DOT BELOW; QQCM
+1E42 ; [.135F.0020.0008.004D][.0000.0070.0002.0323] # LATIN CAPITAL LETTER M WITH DOT BELOW; QQCM
+33A1 ; [.135F.0020.001C.33A1][.1207.0020.001C.33A1] # SQUARE M SQUARED; QQKN
+33A5 ; [.135F.0020.001C.33A5][.1208.0020.001C.33A5] # SQUARE M CUBED; QQKN
+3383 ; [.135F.0020.001C.3383][.120F.0020.001D.3383] # SQUARE MA; QQKN
+33D4 ; [.135F.0020.001C.33D4][.1225.0020.001C.33D4] # SQUARE MB SMALL; QQKN
+3386 ; [.135F.0020.001D.3386][.1225.0020.001D.3386] # SQUARE MB; QQKN
+338E ; [.135F.0020.001C.338E][.12B0.0020.001C.338E] # SQUARE MG; QQKN
+3392 ; [.135F.0020.001D.3392][.12D3.0020.001D.3392][.14AD.0020.001F.3392] # SQUARE MHZ; QQKN
+33D5 ; [.135F.0020.001C.33D5][.12EC.0020.001C.33D5][.1330.0020.001F.33D5] # SQUARE MIL; QQKN
+3396 ; [.135F.0020.001C.3396][.1330.0020.001C.3396] # SQUARE ML; QQKN
+339C ; [.135F.0020.001C.339C][.135F.0020.001C.339C] # SQUARE MM; QQKN
+339F ; [.135F.0020.001C.339F][.135F.0020.001C.339F][.1207.0020.001F.339F] # SQUARE MM SQUARED; QQKN
+33A3 ; [.135F.0020.001C.33A3][.135F.0020.001C.33A3][.1208.0020.001F.33A3] # SQUARE MM CUBED; QQKN
+33D6 ; [.135F.0020.001C.33D6][.138E.0020.001C.33D6][.1330.0020.001F.33D6] # SQUARE MOL; QQKN
+33AB ; [.135F.0020.001D.33AB][.13B3.0020.001D.33AB][.120F.0020.001F.33AB] # SQUARE MPA; QQKN
+33B3 ; [.135F.0020.001C.33B3][.1410.0020.001C.33B3] # SQUARE MS; QQKN
+33A7 ; [.135F.0020.001C.33A7][*055F.0020.001C.33A7][.1410.0020.001F.33A7] # SQUARE M OVER S; QQKN
+33A8 ; [.135F.0020.001C.33A8][*055F.0020.001C.33A8][.1410.0020.001F.33A8][.1207.0020.001F.33A8] # SQUARE M OVER S SQUARED; QQKN
+33B7 ; [.135F.0020.001C.33B7][.147B.0020.001D.33B7] # SQUARE MV; QQKN
+33B9 ; [.135F.0020.001D.33B9][.147B.0020.001D.33B9] # SQUARE MV MEGA; QQKN
+1F14B ; [.135F.0020.001D.1F14B][.147B.0020.001D.1F14B] # SQUARED MV; QQKN
+33BD ; [.135F.0020.001C.33BD][.148D.0020.001D.33BD] # SQUARE MW; QQKN
+33BF ; [.135F.0020.001D.33BF][.148D.0020.001D.33BF] # SQUARE MW MEGA; QQKN
+33C1 ; [.135F.0020.001D.33C1][.156D.0020.001D.33C1] # SQUARE M OHM; QQKN
+1D0D ; [.1363.0020.0002.1D0D] # LATIN LETTER SMALL CAPITAL M
+1DDF ; [.1363.0020.0004.1DDF] # COMBINING LATIN LETTER SMALL CAPITAL M; QQK
+1D6F ; [.1364.0020.0002.1D6F] # LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D86 ; [.1365.0020.0002.1D86] # LATIN SMALL LETTER M WITH PALATAL HOOK
+0271 ; [.1366.0020.0002.0271] # LATIN SMALL LETTER M WITH HOOK
+2C6E ; [.1366.0020.0008.2C6E] # LATIN CAPITAL LETTER M WITH HOOK
+1DAC ; [.1366.0020.0014.1DAC] # MODIFIER LETTER SMALL M WITH HOOK; QQK
+A7FD ; [.136A.0020.0002.A7FD] # LATIN EPIGRAPHIC LETTER INVERTED M
+A7FF ; [.136B.0020.0002.A7FF] # LATIN EPIGRAPHIC LETTER ARCHAIC M
+A773 ; [.136C.0020.0002.A773] # LATIN SMALL LETTER MUM
+006E ; [.136D.0020.0002.006E] # LATIN SMALL LETTER N
+FF4E ; [.136D.0020.0003.FF4E] # FULLWIDTH LATIN SMALL LETTER N; QQK
+1DE0 ; [.136D.0020.0004.1DE0] # COMBINING LATIN SMALL LETTER N; QQK
+24A9 ; [*02FF.0020.0004.24A9][.136D.0020.0004.24A9][*0300.0020.001F.24A9] # PARENTHESIZED LATIN SMALL LETTER N; QQKN
+1D427 ; [.136D.0020.0005.1D427] # MATHEMATICAL BOLD SMALL N; QQK
+1D45B ; [.136D.0020.0005.1D45B] # MATHEMATICAL ITALIC SMALL N; QQK
+1D48F ; [.136D.0020.0005.1D48F] # MATHEMATICAL BOLD ITALIC SMALL N; QQK
+1D4C3 ; [.136D.0020.0005.1D4C3] # MATHEMATICAL SCRIPT SMALL N; QQK
+1D4F7 ; [.136D.0020.0005.1D4F7] # MATHEMATICAL BOLD SCRIPT SMALL N; QQK
+1D52B ; [.136D.0020.0005.1D52B] # MATHEMATICAL FRAKTUR SMALL N; QQK
+1D55F ; [.136D.0020.0005.1D55F] # MATHEMATICAL DOUBLE-STRUCK SMALL N; QQK
+1D593 ; [.136D.0020.0005.1D593] # MATHEMATICAL BOLD FRAKTUR SMALL N; QQK
+1D5C7 ; [.136D.0020.0005.1D5C7] # MATHEMATICAL SANS-SERIF SMALL N; QQK
+1D5FB ; [.136D.0020.0005.1D5FB] # MATHEMATICAL SANS-SERIF BOLD SMALL N; QQK
+1D62F ; [.136D.0020.0005.1D62F] # MATHEMATICAL SANS-SERIF ITALIC SMALL N; QQK
+1D663 ; [.136D.0020.0005.1D663] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N; QQK
+1D697 ; [.136D.0020.0005.1D697] # MATHEMATICAL MONOSPACE SMALL N; QQK
+24DD ; [.136D.0020.0006.24DD] # CIRCLED LATIN SMALL LETTER N; QQK
+004E ; [.136D.0020.0008.004E] # LATIN CAPITAL LETTER N
+FF2E ; [.136D.0020.0009.FF2E] # FULLWIDTH LATIN CAPITAL LETTER N; QQK
+1F11D ; [*02FF.0020.0004.1F11D][.136D.0020.000A.1F11D][*0300.0020.001F.1F11D] # PARENTHESIZED LATIN CAPITAL LETTER N; QQKN
+2115 ; [.136D.0020.000B.2115] # DOUBLE-STRUCK CAPITAL N; QQK
+1D40D ; [.136D.0020.000B.1D40D] # MATHEMATICAL BOLD CAPITAL N; QQK
+1D441 ; [.136D.0020.000B.1D441] # MATHEMATICAL ITALIC CAPITAL N; QQK
+1D475 ; [.136D.0020.000B.1D475] # MATHEMATICAL BOLD ITALIC CAPITAL N; QQK
+1D4A9 ; [.136D.0020.000B.1D4A9] # MATHEMATICAL SCRIPT CAPITAL N; QQK
+1D4DD ; [.136D.0020.000B.1D4DD] # MATHEMATICAL BOLD SCRIPT CAPITAL N; QQK
+1D511 ; [.136D.0020.000B.1D511] # MATHEMATICAL FRAKTUR CAPITAL N; QQK
+1D579 ; [.136D.0020.000B.1D579] # MATHEMATICAL BOLD FRAKTUR CAPITAL N; QQK
+1D5AD ; [.136D.0020.000B.1D5AD] # MATHEMATICAL SANS-SERIF CAPITAL N; QQK
+1D5E1 ; [.136D.0020.000B.1D5E1] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N; QQK
+1D615 ; [.136D.0020.000B.1D615] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N; QQK
+1D649 ; [.136D.0020.000B.1D649] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N; QQK
+1D67D ; [.136D.0020.000B.1D67D] # MATHEMATICAL MONOSPACE CAPITAL N; QQK
+24C3 ; [.136D.0020.000C.24C3] # CIRCLED LATIN CAPITAL LETTER N; QQK
+207F ; [.136D.0020.0014.207F] # SUPERSCRIPT LATIN SMALL LETTER N; QQK
+1D3A ; [.136D.0020.001D.1D3A] # MODIFIER LETTER CAPITAL N; QQK
+1F13D ; [.136D.0020.001D.1F13D] # SQUARED LATIN CAPITAL LETTER N; QQK
+0144 ; [.136D.0020.0002.006E][.0000.0032.0002.0301] # LATIN SMALL LETTER N WITH ACUTE; QQCM
+0143 ; [.136D.0020.0008.004E][.0000.0032.0002.0301] # LATIN CAPITAL LETTER N WITH ACUTE; QQCM
+01F9 ; [.136D.0020.0002.006E][.0000.0035.0002.0300] # LATIN SMALL LETTER N WITH GRAVE; QQCM
+01F8 ; [.136D.0020.0008.004E][.0000.0035.0002.0300] # LATIN CAPITAL LETTER N WITH GRAVE; QQCM
+0148 ; [.136D.0020.0002.006E][.0000.0041.0002.030C] # LATIN SMALL LETTER N WITH CARON; QQCM
+0147 ; [.136D.0020.0008.004E][.0000.0041.0002.030C] # LATIN CAPITAL LETTER N WITH CARON; QQCM
+00F1 ; [.136D.0020.0002.006E][.0000.004E.0002.0303] # LATIN SMALL LETTER N WITH TILDE; QQCM
+00D1 ; [.136D.0020.0008.004E][.0000.004E.0002.0303] # LATIN CAPITAL LETTER N WITH TILDE; QQCM
+1E45 ; [.136D.0020.0002.006E][.0000.0052.0002.0307] # LATIN SMALL LETTER N WITH DOT ABOVE; QQCM
+1E44 ; [.136D.0020.0008.004E][.0000.0052.0002.0307] # LATIN CAPITAL LETTER N WITH DOT ABOVE; QQCM
+0146 ; [.136D.0020.0002.006E][.0000.0056.0002.0327] # LATIN SMALL LETTER N WITH CEDILLA; QQCM
+0145 ; [.136D.0020.0008.004E][.0000.0056.0002.0327] # LATIN CAPITAL LETTER N WITH CEDILLA; QQCM
+1E47 ; [.136D.0020.0002.006E][.0000.0070.0002.0323] # LATIN SMALL LETTER N WITH DOT BELOW; QQCM
+1E46 ; [.136D.0020.0008.004E][.0000.0070.0002.0323] # LATIN CAPITAL LETTER N WITH DOT BELOW; QQCM
+1E4B ; [.136D.0020.0002.006E][.0000.0078.0002.032D] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW; QQCM
+1E4A ; [.136D.0020.0008.004E][.0000.0078.0002.032D] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW; QQCM
+1E49 ; [.136D.0020.0002.006E][.0000.007B.0002.0331] # LATIN SMALL LETTER N WITH LINE BELOW; QQCM
+1E48 ; [.136D.0020.0008.004E][.0000.007B.0002.0331] # LATIN CAPITAL LETTER N WITH LINE BELOW; QQCM
+3381 ; [.136D.0020.001C.3381][.120F.0020.001D.3381] # SQUARE NA; QQKN
+338B ; [.136D.0020.001C.338B][.12A3.0020.001D.338B] # SQUARE NF; QQKN
+01CC ; [.136D.0020.0004.01CC][.1305.0020.0004.01CC] # LATIN SMALL LETTER NJ; QQKN
+01CB ; [.136D.0020.000A.01CB][.1305.0020.0004.01CB] # LATIN CAPITAL LETTER N WITH SMALL LETTER J; QQKN
+01CA ; [.136D.0020.000A.01CA][.1305.0020.000A.01CA] # LATIN CAPITAL LETTER NJ; QQKN
+339A ; [.136D.0020.001C.339A][.135F.0020.001C.339A] # SQUARE NM; QQKN
+2116 ; [.136D.0020.000A.2116][.138E.0020.0004.2116] # NUMERO SIGN; QQKN
+33B1 ; [.136D.0020.001C.33B1][.1410.0020.001C.33B1] # SQUARE NS; QQKN
+33B5 ; [.136D.0020.001C.33B5][.147B.0020.001D.33B5] # SQUARE NV; QQKN
+33BB ; [.136D.0020.001C.33BB][.148D.0020.001D.33BB] # SQUARE NW; QQKN
+0274 ; [.1371.0020.0002.0274] # LATIN LETTER SMALL CAPITAL N
+1DE1 ; [.1371.0020.0004.1DE1] # COMBINING LATIN LETTER SMALL CAPITAL N; QQK
+1DB0 ; [.1371.0020.0014.1DB0] # MODIFIER LETTER SMALL CAPITAL N; QQK
+1D3B ; [.1375.0020.0002.1D3B] # MODIFIER LETTER CAPITAL REVERSED N
+1D0E ; [.1376.0020.0002.1D0E] # LATIN LETTER SMALL CAPITAL REVERSED N
+1D70 ; [.1377.0020.0002.1D70] # LATIN SMALL LETTER N WITH MIDDLE TILDE
+0272 ; [.1378.0020.0002.0272] # LATIN SMALL LETTER N WITH LEFT HOOK
+019D ; [.1378.0020.0008.019D] # LATIN CAPITAL LETTER N WITH LEFT HOOK
+1DAE ; [.1378.0020.0014.1DAE] # MODIFIER LETTER SMALL N WITH LEFT HOOK; QQK
+019E ; [.137C.0020.0002.019E] # LATIN SMALL LETTER N WITH LONG RIGHT LEG
+0220 ; [.137C.0020.0008.0220] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+1D87 ; [.1380.0020.0002.1D87] # LATIN SMALL LETTER N WITH PALATAL HOOK
+0273 ; [.1381.0020.0002.0273] # LATIN SMALL LETTER N WITH RETROFLEX HOOK
+1DAF ; [.1381.0020.0014.1DAF] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK; QQK
+0235 ; [.1385.0020.0002.0235] # LATIN SMALL LETTER N WITH CURL
+A774 ; [.1389.0020.0002.A774] # LATIN SMALL LETTER NUM
+014B ; [.138A.0020.0002.014B] # LATIN SMALL LETTER ENG
+014A ; [.138A.0020.0008.014A] # LATIN CAPITAL LETTER ENG
+1D51 ; [.138A.0020.0014.1D51] # MODIFIER LETTER SMALL ENG; QQK
+006F ; [.138E.0020.0002.006F] # LATIN SMALL LETTER O
+FF4F ; [.138E.0020.0003.FF4F] # FULLWIDTH LATIN SMALL LETTER O; QQK
+0366 ; [.138E.0020.0004.0366] # COMBINING LATIN SMALL LETTER O; QQK
+24AA ; [*02FF.0020.0004.24AA][.138E.0020.0004.24AA][*0300.0020.001F.24AA] # PARENTHESIZED LATIN SMALL LETTER O; QQKN
+2134 ; [.138E.0020.0005.2134] # SCRIPT SMALL O; QQK
+1D428 ; [.138E.0020.0005.1D428] # MATHEMATICAL BOLD SMALL O; QQK
+1D45C ; [.138E.0020.0005.1D45C] # MATHEMATICAL ITALIC SMALL O; QQK
+1D490 ; [.138E.0020.0005.1D490] # MATHEMATICAL BOLD ITALIC SMALL O; QQK
+1D4F8 ; [.138E.0020.0005.1D4F8] # MATHEMATICAL BOLD SCRIPT SMALL O; QQK
+1D52C ; [.138E.0020.0005.1D52C] # MATHEMATICAL FRAKTUR SMALL O; QQK
+1D560 ; [.138E.0020.0005.1D560] # MATHEMATICAL DOUBLE-STRUCK SMALL O; QQK
+1D594 ; [.138E.0020.0005.1D594] # MATHEMATICAL BOLD FRAKTUR SMALL O; QQK
+1D5C8 ; [.138E.0020.0005.1D5C8] # MATHEMATICAL SANS-SERIF SMALL O; QQK
+1D5FC ; [.138E.0020.0005.1D5FC] # MATHEMATICAL SANS-SERIF BOLD SMALL O; QQK
+1D630 ; [.138E.0020.0005.1D630] # MATHEMATICAL SANS-SERIF ITALIC SMALL O; QQK
+1D664 ; [.138E.0020.0005.1D664] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O; QQK
+1D698 ; [.138E.0020.0005.1D698] # MATHEMATICAL MONOSPACE SMALL O; QQK
+24DE ; [.138E.0020.0006.24DE] # CIRCLED LATIN SMALL LETTER O; QQK
+004F ; [.138E.0020.0008.004F] # LATIN CAPITAL LETTER O
+FF2F ; [.138E.0020.0009.FF2F] # FULLWIDTH LATIN CAPITAL LETTER O; QQK
+1F11E ; [*02FF.0020.0004.1F11E][.138E.0020.000A.1F11E][*0300.0020.001F.1F11E] # PARENTHESIZED LATIN CAPITAL LETTER O; QQKN
+1D40E ; [.138E.0020.000B.1D40E] # MATHEMATICAL BOLD CAPITAL O; QQK
+1D442 ; [.138E.0020.000B.1D442] # MATHEMATICAL ITALIC CAPITAL O; QQK
+1D476 ; [.138E.0020.000B.1D476] # MATHEMATICAL BOLD ITALIC CAPITAL O; QQK
+1D4AA ; [.138E.0020.000B.1D4AA] # MATHEMATICAL SCRIPT CAPITAL O; QQK
+1D4DE ; [.138E.0020.000B.1D4DE] # MATHEMATICAL BOLD SCRIPT CAPITAL O; QQK
+1D512 ; [.138E.0020.000B.1D512] # MATHEMATICAL FRAKTUR CAPITAL O; QQK
+1D546 ; [.138E.0020.000B.1D546] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O; QQK
+1D57A ; [.138E.0020.000B.1D57A] # MATHEMATICAL BOLD FRAKTUR CAPITAL O; QQK
+1D5AE ; [.138E.0020.000B.1D5AE] # MATHEMATICAL SANS-SERIF CAPITAL O; QQK
+1D5E2 ; [.138E.0020.000B.1D5E2] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O; QQK
+1D616 ; [.138E.0020.000B.1D616] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O; QQK
+1D64A ; [.138E.0020.000B.1D64A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O; QQK
+1D67E ; [.138E.0020.000B.1D67E] # MATHEMATICAL MONOSPACE CAPITAL O; QQK
+24C4 ; [.138E.0020.000C.24C4] # CIRCLED LATIN CAPITAL LETTER O; QQK
+00BA ; [.138E.0020.0014.00BA] # MASCULINE ORDINAL INDICATOR; QQK
+1D52 ; [.138E.0020.0014.1D52] # MODIFIER LETTER SMALL O; QQK
+2092 ; [.138E.0020.0015.2092] # LATIN SUBSCRIPT SMALL LETTER O; QQK
+1D3C ; [.138E.0020.001D.1D3C] # MODIFIER LETTER CAPITAL O; QQK
+00F3 ; [.138E.0020.0002.006F][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH ACUTE; QQCM
+00D3 ; [.138E.0020.0008.004F][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH ACUTE; QQCM
+00F2 ; [.138E.0020.0002.006F][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH GRAVE; QQCM
+00D2 ; [.138E.0020.0008.004F][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH GRAVE; QQCM
+014F ; [.138E.0020.0002.006F][.0000.0037.0002.0306] # LATIN SMALL LETTER O WITH BREVE; QQCM
+014E ; [.138E.0020.0008.004F][.0000.0037.0002.0306] # LATIN CAPITAL LETTER O WITH BREVE; QQCM
+00F4 ; [.138E.0020.0002.006F][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX; QQCM
+00D4 ; [.138E.0020.0008.004F][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX; QQCM
+1ED1 ; [.138E.0020.0002.006F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE; QQCM
+1ED0 ; [.138E.0020.0008.004F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE; QQCM
+1ED3 ; [.138E.0020.0002.006F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE; QQCM
+1ED2 ; [.138E.0020.0008.004F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE; QQCM
+1ED7 ; [.138E.0020.0002.006F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE; QQCM
+1ED6 ; [.138E.0020.0008.004F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE; QQCM
+1ED5 ; [.138E.0020.0002.006F][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1ED4 ; [.138E.0020.0008.004F][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+01D2 ; [.138E.0020.0002.006F][.0000.0041.0002.030C] # LATIN SMALL LETTER O WITH CARON; QQCM
+01D1 ; [.138E.0020.0008.004F][.0000.0041.0002.030C] # LATIN CAPITAL LETTER O WITH CARON; QQCM
+00F6 ; [.138E.0020.0002.006F][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH DIAERESIS; QQCM
+00D6 ; [.138E.0020.0008.004F][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH DIAERESIS; QQCM
+022B ; [.138E.0020.0002.006F][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON; QQCM
+022A ; [.138E.0020.0008.004F][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON; QQCM
+0151 ; [.138E.0020.0002.006F][.0000.004D.0002.030B] # LATIN SMALL LETTER O WITH DOUBLE ACUTE; QQCM
+0150 ; [.138E.0020.0008.004F][.0000.004D.0002.030B] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE; QQCM
+00F5 ; [.138E.0020.0002.006F][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH TILDE; QQCM
+00D5 ; [.138E.0020.0008.004F][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH TILDE; QQCM
+1E4D ; [.138E.0020.0002.006F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH TILDE AND ACUTE; QQCM
+1E4C ; [.138E.0020.0008.004F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE; QQCM
+1E4F ; [.138E.0020.0002.006F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS; QQCM
+1E4E ; [.138E.0020.0008.004F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS; QQCM
+022D ; [.138E.0020.0002.006F][.0000.004E.0002.0303][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH TILDE AND MACRON; QQCM
+022C ; [.138E.0020.0008.004F][.0000.004E.0002.0303][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON; QQCM
+022F ; [.138E.0020.0002.006F][.0000.0052.0002.0307] # LATIN SMALL LETTER O WITH DOT ABOVE; QQCM
+022E ; [.138E.0020.0008.004F][.0000.0052.0002.0307] # LATIN CAPITAL LETTER O WITH DOT ABOVE; QQCM
+0231 ; [.138E.0020.0002.006F][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON; QQCM
+0230 ; [.138E.0020.0008.004F][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON; QQCM
+00F8 ; [.138E.0020.0002.006F][.0000.0054.0002.0338] # LATIN SMALL LETTER O WITH STROKE; QQCM
+00D8 ; [.138E.0020.0008.004F][.0000.0054.0002.0338] # LATIN CAPITAL LETTER O WITH STROKE; QQCM
+01FF ; [.138E.0020.0002.006F][.0000.0054.0002.0338][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH STROKE AND ACUTE; QQCM
+01FE ; [.138E.0020.0008.004F][.0000.0054.0002.0338][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE; QQCM
+01EB ; [.138E.0020.0002.006F][.0000.0059.0002.0328] # LATIN SMALL LETTER O WITH OGONEK; QQCM
+01EA ; [.138E.0020.0008.004F][.0000.0059.0002.0328] # LATIN CAPITAL LETTER O WITH OGONEK; QQCM
+01ED ; [.138E.0020.0002.006F][.0000.0059.0002.0328][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH OGONEK AND MACRON; QQCM
+01EC ; [.138E.0020.0008.004F][.0000.0059.0002.0328][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON; QQCM
+014D ; [.138E.0020.0002.006F][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH MACRON; QQCM
+014C ; [.138E.0020.0008.004F][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH MACRON; QQCM
+1E53 ; [.138E.0020.0002.006F][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH MACRON AND ACUTE; QQCM
+1E52 ; [.138E.0020.0008.004F][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE; QQCM
+1E51 ; [.138E.0020.0002.006F][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH MACRON AND GRAVE; QQCM
+1E50 ; [.138E.0020.0008.004F][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE; QQCM
+1ECF ; [.138E.0020.0002.006F][.0000.0064.0002.0309] # LATIN SMALL LETTER O WITH HOOK ABOVE; QQCM
+1ECE ; [.138E.0020.0008.004F][.0000.0064.0002.0309] # LATIN CAPITAL LETTER O WITH HOOK ABOVE; QQCM
+020D ; [.138E.0020.0002.006F][.0000.0065.0002.030F] # LATIN SMALL LETTER O WITH DOUBLE GRAVE; QQCM
+020C ; [.138E.0020.0008.004F][.0000.0065.0002.030F] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE; QQCM
+020F ; [.138E.0020.0002.006F][.0000.0067.0002.0311] # LATIN SMALL LETTER O WITH INVERTED BREVE; QQCM
+020E ; [.138E.0020.0008.004F][.0000.0067.0002.0311] # LATIN CAPITAL LETTER O WITH INVERTED BREVE; QQCM
+01A1 ; [.138E.0020.0002.006F][.0000.0068.0002.031B] # LATIN SMALL LETTER O WITH HORN; QQCM
+01A0 ; [.138E.0020.0008.004F][.0000.0068.0002.031B] # LATIN CAPITAL LETTER O WITH HORN; QQCM
+1EDB ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH HORN AND ACUTE; QQCM
+1EDA ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE; QQCM
+1EDD ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH HORN AND GRAVE; QQCM
+1EDC ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE; QQCM
+1EE1 ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH HORN AND TILDE; QQCM
+1EE0 ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH HORN AND TILDE; QQCM
+1EDF ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE; QQCM
+1EDE ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE; QQCM
+1EE3 ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW; QQCM
+1EE2 ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW; QQCM
+1ECD ; [.138E.0020.0002.006F][.0000.0070.0002.0323] # LATIN SMALL LETTER O WITH DOT BELOW; QQCM
+1ECC ; [.138E.0020.0008.004F][.0000.0070.0002.0323] # LATIN CAPITAL LETTER O WITH DOT BELOW; QQCM
+1ED9 ; [.138E.0020.0002.006F][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1ED8 ; [.138E.0020.0008.004F][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW; QQCM
+0153 ; [.138E.0020.0004.0153][.0000.0159.0004.0153][.126B.0020.001F.0153] # LATIN SMALL LIGATURE OE; QQKN
+0152 ; [.138E.0020.000A.0152][.0000.0159.0004.0152][.126B.0020.001F.0152] # LATIN CAPITAL LIGATURE OE; QQKN
+A74F ; [.138E.0020.0004.A74F][.138E.0020.0004.A74F] # LATIN SMALL LETTER OO; QQKN
+A74E ; [.138E.0020.000A.A74E][.138E.0020.000A.A74E] # LATIN CAPITAL LETTER OO; QQKN
+3375 ; [.138E.0020.001C.3375][.147B.0020.001D.3375] # SQUARE OV; QQKN
+1D0F ; [.1392.0020.0002.1D0F] # LATIN LETTER SMALL CAPITAL O
+1D11 ; [.1393.0020.0002.1D11] # LATIN SMALL LETTER SIDEWAYS O
+0276 ; [.1394.0020.0002.0276] # LATIN LETTER SMALL CAPITAL OE
+1D14 ; [.1398.0020.0002.1D14] # LATIN SMALL LETTER TURNED OE
+1D13 ; [.1399.0020.0002.1D13] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+0254 ; [.139A.0020.0002.0254] # LATIN SMALL LETTER OPEN O
+0186 ; [.139A.0020.0008.0186] # LATIN CAPITAL LETTER OPEN O
+1D53 ; [.139A.0020.0014.1D53] # MODIFIER LETTER SMALL OPEN O; QQK
+1D10 ; [.139E.0020.0002.1D10] # LATIN LETTER SMALL CAPITAL OPEN O
+1D12 ; [.139F.0020.0002.1D12] # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D97 ; [.13A0.0020.0002.1D97] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+A74D ; [.13A1.0020.0002.A74D] # LATIN SMALL LETTER O WITH LOOP
+A74C ; [.13A1.0020.0008.A74C] # LATIN CAPITAL LETTER O WITH LOOP
+1D16 ; [.13A2.0020.0002.1D16] # LATIN SMALL LETTER TOP HALF O
+1D54 ; [.13A2.0020.0014.1D54] # MODIFIER LETTER SMALL TOP HALF O; QQK
+1D17 ; [.13A3.0020.0002.1D17] # LATIN SMALL LETTER BOTTOM HALF O
+1D55 ; [.13A3.0020.0014.1D55] # MODIFIER LETTER SMALL BOTTOM HALF O; QQK
+2C7A ; [.13A4.0020.0002.2C7A] # LATIN SMALL LETTER O WITH LOW RING INSIDE
+0275 ; [.13A5.0020.0002.0275] # LATIN SMALL LETTER BARRED O
+019F ; [.13A5.0020.0008.019F] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+1DB1 ; [.13A5.0020.0014.1DB1] # MODIFIER LETTER SMALL BARRED O; QQK
+A74B ; [.13A9.0020.0002.A74B] # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74A ; [.13A9.0020.0008.A74A] # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+0277 ; [.13AA.0020.0002.0277] # LATIN SMALL LETTER CLOSED OMEGA
+0223 ; [.13AE.0020.0002.0223] # LATIN SMALL LETTER OU
+0222 ; [.13AE.0020.0008.0222] # LATIN CAPITAL LETTER OU
+1D3D ; [.13AE.0020.001D.1D3D] # MODIFIER LETTER CAPITAL OU; QQK
+1D15 ; [.13B2.0020.0002.1D15] # LATIN LETTER SMALL CAPITAL OU
+0070 ; [.13B3.0020.0002.0070] # LATIN SMALL LETTER P
+FF50 ; [.13B3.0020.0003.FF50] # FULLWIDTH LATIN SMALL LETTER P; QQK
+24AB ; [*02FF.0020.0004.24AB][.13B3.0020.0004.24AB][*0300.0020.001F.24AB] # PARENTHESIZED LATIN SMALL LETTER P; QQKN
+1D429 ; [.13B3.0020.0005.1D429] # MATHEMATICAL BOLD SMALL P; QQK
+1D45D ; [.13B3.0020.0005.1D45D] # MATHEMATICAL ITALIC SMALL P; QQK
+1D491 ; [.13B3.0020.0005.1D491] # MATHEMATICAL BOLD ITALIC SMALL P; QQK
+1D4C5 ; [.13B3.0020.0005.1D4C5] # MATHEMATICAL SCRIPT SMALL P; QQK
+1D4F9 ; [.13B3.0020.0005.1D4F9] # MATHEMATICAL BOLD SCRIPT SMALL P; QQK
+1D52D ; [.13B3.0020.0005.1D52D] # MATHEMATICAL FRAKTUR SMALL P; QQK
+1D561 ; [.13B3.0020.0005.1D561] # MATHEMATICAL DOUBLE-STRUCK SMALL P; QQK
+1D595 ; [.13B3.0020.0005.1D595] # MATHEMATICAL BOLD FRAKTUR SMALL P; QQK
+1D5C9 ; [.13B3.0020.0005.1D5C9] # MATHEMATICAL SANS-SERIF SMALL P; QQK
+1D5FD ; [.13B3.0020.0005.1D5FD] # MATHEMATICAL SANS-SERIF BOLD SMALL P; QQK
+1D631 ; [.13B3.0020.0005.1D631] # MATHEMATICAL SANS-SERIF ITALIC SMALL P; QQK
+1D665 ; [.13B3.0020.0005.1D665] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P; QQK
+1D699 ; [.13B3.0020.0005.1D699] # MATHEMATICAL MONOSPACE SMALL P; QQK
+24DF ; [.13B3.0020.0006.24DF] # CIRCLED LATIN SMALL LETTER P; QQK
+0050 ; [.13B3.0020.0008.0050] # LATIN CAPITAL LETTER P
+FF30 ; [.13B3.0020.0009.FF30] # FULLWIDTH LATIN CAPITAL LETTER P; QQK
+1F11F ; [*02FF.0020.0004.1F11F][.13B3.0020.000A.1F11F][*0300.0020.001F.1F11F] # PARENTHESIZED LATIN CAPITAL LETTER P; QQKN
+2119 ; [.13B3.0020.000B.2119] # DOUBLE-STRUCK CAPITAL P; QQK
+1D40F ; [.13B3.0020.000B.1D40F] # MATHEMATICAL BOLD CAPITAL P; QQK
+1D443 ; [.13B3.0020.000B.1D443] # MATHEMATICAL ITALIC CAPITAL P; QQK
+1D477 ; [.13B3.0020.000B.1D477] # MATHEMATICAL BOLD ITALIC CAPITAL P; QQK
+1D4AB ; [.13B3.0020.000B.1D4AB] # MATHEMATICAL SCRIPT CAPITAL P; QQK
+1D4DF ; [.13B3.0020.000B.1D4DF] # MATHEMATICAL BOLD SCRIPT CAPITAL P; QQK
+1D513 ; [.13B3.0020.000B.1D513] # MATHEMATICAL FRAKTUR CAPITAL P; QQK
+1D57B ; [.13B3.0020.000B.1D57B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P; QQK
+1D5AF ; [.13B3.0020.000B.1D5AF] # MATHEMATICAL SANS-SERIF CAPITAL P; QQK
+1D5E3 ; [.13B3.0020.000B.1D5E3] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P; QQK
+1D617 ; [.13B3.0020.000B.1D617] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P; QQK
+1D64B ; [.13B3.0020.000B.1D64B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P; QQK
+1D67F ; [.13B3.0020.000B.1D67F] # MATHEMATICAL MONOSPACE CAPITAL P; QQK
+24C5 ; [.13B3.0020.000C.24C5] # CIRCLED LATIN CAPITAL LETTER P; QQK
+1F15F ; [.13B3.0020.000C.1F15F] # NEGATIVE CIRCLED LATIN CAPITAL LETTER P; QQK
+1D56 ; [.13B3.0020.0014.1D56] # MODIFIER LETTER SMALL P; QQK
+1D3E ; [.13B3.0020.001D.1D3E] # MODIFIER LETTER CAPITAL P; QQK
+1F13F ; [.13B3.0020.001D.1F13F] # SQUARED LATIN CAPITAL LETTER P; QQK
+1F17F ; [.13B3.0020.001D.1F17F] # NEGATIVE SQUARED LATIN CAPITAL LETTER P; QQK
+1F18A ; [.13B3.0020.001D.1F18A] # CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P; QQK
+1E55 ; [.13B3.0020.0002.0070][.0000.0032.0002.0301] # LATIN SMALL LETTER P WITH ACUTE; QQCM
+1E54 ; [.13B3.0020.0008.0050][.0000.0032.0002.0301] # LATIN CAPITAL LETTER P WITH ACUTE; QQCM
+1E57 ; [.13B3.0020.0002.0070][.0000.0052.0002.0307] # LATIN SMALL LETTER P WITH DOT ABOVE; QQCM
+1E56 ; [.13B3.0020.0008.0050][.0000.0052.0002.0307] # LATIN CAPITAL LETTER P WITH DOT ABOVE; QQCM
+3380 ; [.13B3.0020.001C.3380][.120F.0020.001D.3380] # SQUARE PA AMPS; QQKN
+33A9 ; [.13B3.0020.001D.33A9][.120F.0020.001C.33A9] # SQUARE PA; QQKN
+1F18C ; [.13B3.0020.001D.1F18C][.120F.0020.001D.1F18C] # NEGATIVE SQUARED PA; QQKN
+3376 ; [.13B3.0020.001C.3376][.123D.0020.001C.3376] # SQUARE PC; QQKN
+338A ; [.13B3.0020.001C.338A][.12A3.0020.001D.338A] # SQUARE PF; QQKN
+33D7 ; [.13B3.0020.001D.33D7][.12D3.0020.001D.33D7] # SQUARE PH; QQKN
+33D8 ; [.13B3.0020.001C.33D8][*0281.0020.001C.33D8][.135F.0020.001F.33D8][*0281.0020.001F.33D8] # SQUARE PM; QQKN
+33D9 ; [.13B3.0020.001D.33D9][.13B3.0020.001D.33D9][.135F.0020.001F.33D9] # SQUARE PPM; QQKN
+1F14E ; [.13B3.0020.001D.1F14E][.13B3.0020.001D.1F14E][.147B.0020.001F.1F14E] # SQUARED PPV; QQKN
+33DA ; [.13B3.0020.001D.33DA][.13DA.0020.001D.33DA] # SQUARE PR; QQKN
+33B0 ; [.13B3.0020.001C.33B0][.1410.0020.001C.33B0] # SQUARE PS; QQKN
+3250 ; [.13B3.0020.001D.3250][.1433.0020.001D.3250][.126B.0020.001F.3250] # PARTNERSHIP SIGN; QQKN
+33B4 ; [.13B3.0020.001C.33B4][.147B.0020.001D.33B4] # SQUARE PV; QQKN
+33BA ; [.13B3.0020.001C.33BA][.148D.0020.001D.33BA] # SQUARE PW; QQKN
+1D18 ; [.13B7.0020.0002.1D18] # LATIN LETTER SMALL CAPITAL P
+1D7D ; [.13B8.0020.0002.1D7D] # LATIN SMALL LETTER P WITH STROKE
+2C63 ; [.13B8.0020.0008.2C63] # LATIN CAPITAL LETTER P WITH STROKE
+A751 ; [.13B9.0020.0002.A751] # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A750 ; [.13B9.0020.0008.A750] # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+1D71 ; [.13BA.0020.0002.1D71] # LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D88 ; [.13BB.0020.0002.1D88] # LATIN SMALL LETTER P WITH PALATAL HOOK
+01A5 ; [.13BC.0020.0002.01A5] # LATIN SMALL LETTER P WITH HOOK
+01A4 ; [.13BC.0020.0008.01A4] # LATIN CAPITAL LETTER P WITH HOOK
+A753 ; [.13C0.0020.0002.A753] # LATIN SMALL LETTER P WITH FLOURISH
+A752 ; [.13C0.0020.0008.A752] # LATIN CAPITAL LETTER P WITH FLOURISH
+A755 ; [.13C1.0020.0002.A755] # LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A754 ; [.13C1.0020.0008.A754] # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A7FC ; [.13C2.0020.0002.A7FC] # LATIN EPIGRAPHIC LETTER REVERSED P
+0278 ; [.13C3.0020.0002.0278] # LATIN SMALL LETTER PHI
+1DB2 ; [.13C3.0020.0014.1DB2] # MODIFIER LETTER SMALL PHI; QQK
+2C77 ; [.13C7.0020.0002.2C77] # LATIN SMALL LETTER TAILLESS PHI
+0071 ; [.13C8.0020.0002.0071] # LATIN SMALL LETTER Q
+FF51 ; [.13C8.0020.0003.FF51] # FULLWIDTH LATIN SMALL LETTER Q; QQK
+24AC ; [*02FF.0020.0004.24AC][.13C8.0020.0004.24AC][*0300.0020.001F.24AC] # PARENTHESIZED LATIN SMALL LETTER Q; QQKN
+1D42A ; [.13C8.0020.0005.1D42A] # MATHEMATICAL BOLD SMALL Q; QQK
+1D45E ; [.13C8.0020.0005.1D45E] # MATHEMATICAL ITALIC SMALL Q; QQK
+1D492 ; [.13C8.0020.0005.1D492] # MATHEMATICAL BOLD ITALIC SMALL Q; QQK
+1D4C6 ; [.13C8.0020.0005.1D4C6] # MATHEMATICAL SCRIPT SMALL Q; QQK
+1D4FA ; [.13C8.0020.0005.1D4FA] # MATHEMATICAL BOLD SCRIPT SMALL Q; QQK
+1D52E ; [.13C8.0020.0005.1D52E] # MATHEMATICAL FRAKTUR SMALL Q; QQK
+1D562 ; [.13C8.0020.0005.1D562] # MATHEMATICAL DOUBLE-STRUCK SMALL Q; QQK
+1D596 ; [.13C8.0020.0005.1D596] # MATHEMATICAL BOLD FRAKTUR SMALL Q; QQK
+1D5CA ; [.13C8.0020.0005.1D5CA] # MATHEMATICAL SANS-SERIF SMALL Q; QQK
+1D5FE ; [.13C8.0020.0005.1D5FE] # MATHEMATICAL SANS-SERIF BOLD SMALL Q; QQK
+1D632 ; [.13C8.0020.0005.1D632] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q; QQK
+1D666 ; [.13C8.0020.0005.1D666] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q; QQK
+1D69A ; [.13C8.0020.0005.1D69A] # MATHEMATICAL MONOSPACE SMALL Q; QQK
+24E0 ; [.13C8.0020.0006.24E0] # CIRCLED LATIN SMALL LETTER Q; QQK
+0051 ; [.13C8.0020.0008.0051] # LATIN CAPITAL LETTER Q
+FF31 ; [.13C8.0020.0009.FF31] # FULLWIDTH LATIN CAPITAL LETTER Q; QQK
+1F120 ; [*02FF.0020.0004.1F120][.13C8.0020.000A.1F120][*0300.0020.001F.1F120] # PARENTHESIZED LATIN CAPITAL LETTER Q; QQKN
+211A ; [.13C8.0020.000B.211A] # DOUBLE-STRUCK CAPITAL Q; QQK
+1D410 ; [.13C8.0020.000B.1D410] # MATHEMATICAL BOLD CAPITAL Q; QQK
+1D444 ; [.13C8.0020.000B.1D444] # MATHEMATICAL ITALIC CAPITAL Q; QQK
+1D478 ; [.13C8.0020.000B.1D478] # MATHEMATICAL BOLD ITALIC CAPITAL Q; QQK
+1D4AC ; [.13C8.0020.000B.1D4AC] # MATHEMATICAL SCRIPT CAPITAL Q; QQK
+1D4E0 ; [.13C8.0020.000B.1D4E0] # MATHEMATICAL BOLD SCRIPT CAPITAL Q; QQK
+1D514 ; [.13C8.0020.000B.1D514] # MATHEMATICAL FRAKTUR CAPITAL Q; QQK
+1D57C ; [.13C8.0020.000B.1D57C] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q; QQK
+1D5B0 ; [.13C8.0020.000B.1D5B0] # MATHEMATICAL SANS-SERIF CAPITAL Q; QQK
+1D5E4 ; [.13C8.0020.000B.1D5E4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q; QQK
+1D618 ; [.13C8.0020.000B.1D618] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q; QQK
+1D64C ; [.13C8.0020.000B.1D64C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q; QQK
+1D680 ; [.13C8.0020.000B.1D680] # MATHEMATICAL MONOSPACE CAPITAL Q; QQK
+24C6 ; [.13C8.0020.000C.24C6] # CIRCLED LATIN CAPITAL LETTER Q; QQK
+0239 ; [.13C8.0020.0004.0239][.13B3.0020.0004.0239] # LATIN SMALL LETTER QP DIGRAPH; QQKN
+A757 ; [.13CC.0020.0002.A757] # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A756 ; [.13CC.0020.0008.A756] # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A759 ; [.13CD.0020.0002.A759] # LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A758 ; [.13CD.0020.0008.A758] # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+02A0 ; [.13CE.0020.0002.02A0] # LATIN SMALL LETTER Q WITH HOOK
+024B ; [.13D2.0020.0002.024B] # LATIN SMALL LETTER Q WITH HOOK TAIL
+024A ; [.13D2.0020.0008.024A] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+0138 ; [.13D6.0020.0002.0138] # LATIN SMALL LETTER KRA
+0072 ; [.13DA.0020.0002.0072] # LATIN SMALL LETTER R
+FF52 ; [.13DA.0020.0003.FF52] # FULLWIDTH LATIN SMALL LETTER R; QQK
+036C ; [.13DA.0020.0004.036C] # COMBINING LATIN SMALL LETTER R; QQK
+1DCA ; [.13DA.0020.0004.1DCA] # COMBINING LATIN SMALL LETTER R BELOW; QQK
+24AD ; [*02FF.0020.0004.24AD][.13DA.0020.0004.24AD][*0300.0020.001F.24AD] # PARENTHESIZED LATIN SMALL LETTER R; QQKN
+1D42B ; [.13DA.0020.0005.1D42B] # MATHEMATICAL BOLD SMALL R; QQK
+1D45F ; [.13DA.0020.0005.1D45F] # MATHEMATICAL ITALIC SMALL R; QQK
+1D493 ; [.13DA.0020.0005.1D493] # MATHEMATICAL BOLD ITALIC SMALL R; QQK
+1D4C7 ; [.13DA.0020.0005.1D4C7] # MATHEMATICAL SCRIPT SMALL R; QQK
+1D4FB ; [.13DA.0020.0005.1D4FB] # MATHEMATICAL BOLD SCRIPT SMALL R; QQK
+1D52F ; [.13DA.0020.0005.1D52F] # MATHEMATICAL FRAKTUR SMALL R; QQK
+1D563 ; [.13DA.0020.0005.1D563] # MATHEMATICAL DOUBLE-STRUCK SMALL R; QQK
+1D597 ; [.13DA.0020.0005.1D597] # MATHEMATICAL BOLD FRAKTUR SMALL R; QQK
+1D5CB ; [.13DA.0020.0005.1D5CB] # MATHEMATICAL SANS-SERIF SMALL R; QQK
+1D5FF ; [.13DA.0020.0005.1D5FF] # MATHEMATICAL SANS-SERIF BOLD SMALL R; QQK
+1D633 ; [.13DA.0020.0005.1D633] # MATHEMATICAL SANS-SERIF ITALIC SMALL R; QQK
+1D667 ; [.13DA.0020.0005.1D667] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R; QQK
+1D69B ; [.13DA.0020.0005.1D69B] # MATHEMATICAL MONOSPACE SMALL R; QQK
+24E1 ; [.13DA.0020.0006.24E1] # CIRCLED LATIN SMALL LETTER R; QQK
+0052 ; [.13DA.0020.0008.0052] # LATIN CAPITAL LETTER R
+FF32 ; [.13DA.0020.0009.FF32] # FULLWIDTH LATIN CAPITAL LETTER R; QQK
+1F121 ; [*02FF.0020.0004.1F121][.13DA.0020.000A.1F121][*0300.0020.001F.1F121] # PARENTHESIZED LATIN CAPITAL LETTER R; QQKN
+211B ; [.13DA.0020.000B.211B] # SCRIPT CAPITAL R; QQK
+211C ; [.13DA.0020.000B.211C] # BLACK-LETTER CAPITAL R; QQK
+211D ; [.13DA.0020.000B.211D] # DOUBLE-STRUCK CAPITAL R; QQK
+1D411 ; [.13DA.0020.000B.1D411] # MATHEMATICAL BOLD CAPITAL R; QQK
+1D445 ; [.13DA.0020.000B.1D445] # MATHEMATICAL ITALIC CAPITAL R; QQK
+1D479 ; [.13DA.0020.000B.1D479] # MATHEMATICAL BOLD ITALIC CAPITAL R; QQK
+1D4E1 ; [.13DA.0020.000B.1D4E1] # MATHEMATICAL BOLD SCRIPT CAPITAL R; QQK
+1D57D ; [.13DA.0020.000B.1D57D] # MATHEMATICAL BOLD FRAKTUR CAPITAL R; QQK
+1D5B1 ; [.13DA.0020.000B.1D5B1] # MATHEMATICAL SANS-SERIF CAPITAL R; QQK
+1D5E5 ; [.13DA.0020.000B.1D5E5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R; QQK
+1D619 ; [.13DA.0020.000B.1D619] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R; QQK
+1D64D ; [.13DA.0020.000B.1D64D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R; QQK
+1D681 ; [.13DA.0020.000B.1D681] # MATHEMATICAL MONOSPACE CAPITAL R; QQK
+24C7 ; [.13DA.0020.000C.24C7] # CIRCLED LATIN CAPITAL LETTER R; QQK
+1F12C ; [.13DA.0020.000C.1F12C] # CIRCLED ITALIC LATIN CAPITAL LETTER R; QQK
+02B3 ; [.13DA.0020.0014.02B3] # MODIFIER LETTER SMALL R; QQK
+1D63 ; [.13DA.0020.0015.1D63] # LATIN SUBSCRIPT SMALL LETTER R; QQK
+1D3F ; [.13DA.0020.001D.1D3F] # MODIFIER LETTER CAPITAL R; QQK
+0155 ; [.13DA.0020.0002.0072][.0000.0032.0002.0301] # LATIN SMALL LETTER R WITH ACUTE; QQCM
+0154 ; [.13DA.0020.0008.0052][.0000.0032.0002.0301] # LATIN CAPITAL LETTER R WITH ACUTE; QQCM
+0159 ; [.13DA.0020.0002.0072][.0000.0041.0002.030C] # LATIN SMALL LETTER R WITH CARON; QQCM
+0158 ; [.13DA.0020.0008.0052][.0000.0041.0002.030C] # LATIN CAPITAL LETTER R WITH CARON; QQCM
+1E59 ; [.13DA.0020.0002.0072][.0000.0052.0002.0307] # LATIN SMALL LETTER R WITH DOT ABOVE; QQCM
+1E58 ; [.13DA.0020.0008.0052][.0000.0052.0002.0307] # LATIN CAPITAL LETTER R WITH DOT ABOVE; QQCM
+0157 ; [.13DA.0020.0002.0072][.0000.0056.0002.0327] # LATIN SMALL LETTER R WITH CEDILLA; QQCM
+0156 ; [.13DA.0020.0008.0052][.0000.0056.0002.0327] # LATIN CAPITAL LETTER R WITH CEDILLA; QQCM
+0211 ; [.13DA.0020.0002.0072][.0000.0065.0002.030F] # LATIN SMALL LETTER R WITH DOUBLE GRAVE; QQCM
+0210 ; [.13DA.0020.0008.0052][.0000.0065.0002.030F] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE; QQCM
+0213 ; [.13DA.0020.0002.0072][.0000.0067.0002.0311] # LATIN SMALL LETTER R WITH INVERTED BREVE; QQCM
+0212 ; [.13DA.0020.0008.0052][.0000.0067.0002.0311] # LATIN CAPITAL LETTER R WITH INVERTED BREVE; QQCM
+1E5B ; [.13DA.0020.0002.0072][.0000.0070.0002.0323] # LATIN SMALL LETTER R WITH DOT BELOW; QQCM
+1E5A ; [.13DA.0020.0008.0052][.0000.0070.0002.0323] # LATIN CAPITAL LETTER R WITH DOT BELOW; QQCM
+1E5D ; [.13DA.0020.0002.0072][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON; QQCM
+1E5C ; [.13DA.0020.0008.0052][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON; QQCM
+1E5F ; [.13DA.0020.0002.0072][.0000.007B.0002.0331] # LATIN SMALL LETTER R WITH LINE BELOW; QQCM
+1E5E ; [.13DA.0020.0008.0052][.0000.007B.0002.0331] # LATIN CAPITAL LETTER R WITH LINE BELOW; QQCM
+A783 ; [.13DA.0020.0004.A783][.0000.015A.0004.A783] # LATIN SMALL LETTER INSULAR R; QQKN
+A782 ; [.13DA.0020.000A.A782][.0000.015A.0004.A782] # LATIN CAPITAL LETTER INSULAR R; QQKN
+33AD ; [.13DA.0020.001C.33AD][.120F.0020.001C.33AD][.1250.0020.001F.33AD] # SQUARE RAD; QQKN
+33AE ; [.13DA.0020.001C.33AE][.120F.0020.001C.33AE][.1250.0020.001F.33AE][*055F.0020.001F.33AE][.1410.0020.001F.33AE] # SQUARE RAD OVER S; QQKN
+33AF ; [.13DA.0020.001C.33AF][.120F.0020.001C.33AF][.1250.0020.001F.33AF][*055F.0020.001F.33AF][.1410.0020.001F.33AF][.1207.0020.001F.33AF] # SQUARE RAD OVER S SQUARED; QQKN
+20A8 ; [.13DA.0020.000A.20A8][.1410.0020.0004.20A8] # RUPEE SIGN; QQKN
+0280 ; [.13DE.0020.0002.0280] # LATIN LETTER SMALL CAPITAL R
+1DE2 ; [.13DE.0020.0004.1DE2] # COMBINING LATIN LETTER SMALL CAPITAL R; QQK
+01A6 ; [.13DE.0020.0008.01A6] # LATIN LETTER YR
+A75B ; [.13E2.0020.0002.A75B] # LATIN SMALL LETTER R ROTUNDA
+1DE3 ; [.13E2.0020.0004.1DE3] # COMBINING LATIN SMALL LETTER R ROTUNDA; QQK
+A75A ; [.13E2.0020.0008.A75A] # LATIN CAPITAL LETTER R ROTUNDA
+1D19 ; [.13E3.0020.0002.1D19] # LATIN LETTER SMALL CAPITAL REVERSED R
+024D ; [.13E4.0020.0002.024D] # LATIN SMALL LETTER R WITH STROKE
+024C ; [.13E4.0020.0008.024C] # LATIN CAPITAL LETTER R WITH STROKE
+1D72 ; [.13E8.0020.0002.1D72] # LATIN SMALL LETTER R WITH MIDDLE TILDE
+0279 ; [.13E9.0020.0002.0279] # LATIN SMALL LETTER TURNED R
+02B4 ; [.13E9.0020.0014.02B4] # MODIFIER LETTER SMALL TURNED R; QQK
+1D1A ; [.13ED.0020.0002.1D1A] # LATIN LETTER SMALL CAPITAL TURNED R
+027A ; [.13EE.0020.0002.027A] # LATIN SMALL LETTER TURNED R WITH LONG LEG
+1D89 ; [.13F2.0020.0002.1D89] # LATIN SMALL LETTER R WITH PALATAL HOOK
+027B ; [.13F3.0020.0002.027B] # LATIN SMALL LETTER TURNED R WITH HOOK
+02B5 ; [.13F3.0020.0014.02B5] # MODIFIER LETTER SMALL TURNED R WITH HOOK; QQK
+2C79 ; [.13F7.0020.0002.2C79] # LATIN SMALL LETTER TURNED R WITH TAIL
+027C ; [.13F8.0020.0002.027C] # LATIN SMALL LETTER R WITH LONG LEG
+027D ; [.13FC.0020.0002.027D] # LATIN SMALL LETTER R WITH TAIL
+2C64 ; [.13FC.0020.0008.2C64] # LATIN CAPITAL LETTER R WITH TAIL
+027E ; [.1400.0020.0002.027E] # LATIN SMALL LETTER R WITH FISHHOOK
+1D73 ; [.1404.0020.0002.1D73] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+027F ; [.1405.0020.0002.027F] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0281 ; [.1409.0020.0002.0281] # LATIN LETTER SMALL CAPITAL INVERTED R
+02B6 ; [.1409.0020.0014.02B6] # MODIFIER LETTER SMALL CAPITAL INVERTED R; QQK
+A775 ; [.140D.0020.0002.A775] # LATIN SMALL LETTER RUM
+A776 ; [.140E.0020.0002.A776] # LATIN LETTER SMALL CAPITAL RUM
+A75D ; [.140F.0020.0002.A75D] # LATIN SMALL LETTER RUM ROTUNDA
+A75C ; [.140F.0020.0008.A75C] # LATIN CAPITAL LETTER RUM ROTUNDA
+0073 ; [.1410.0020.0002.0073] # LATIN SMALL LETTER S
+FF53 ; [.1410.0020.0003.FF53] # FULLWIDTH LATIN SMALL LETTER S; QQK
+1DE4 ; [.1410.0020.0004.1DE4] # COMBINING LATIN SMALL LETTER S; QQK
+24AE ; [*02FF.0020.0004.24AE][.1410.0020.0004.24AE][*0300.0020.001F.24AE] # PARENTHESIZED LATIN SMALL LETTER S; QQKN
+1D42C ; [.1410.0020.0005.1D42C] # MATHEMATICAL BOLD SMALL S; QQK
+1D460 ; [.1410.0020.0005.1D460] # MATHEMATICAL ITALIC SMALL S; QQK
+1D494 ; [.1410.0020.0005.1D494] # MATHEMATICAL BOLD ITALIC SMALL S; QQK
+1D4C8 ; [.1410.0020.0005.1D4C8] # MATHEMATICAL SCRIPT SMALL S; QQK
+1D4FC ; [.1410.0020.0005.1D4FC] # MATHEMATICAL BOLD SCRIPT SMALL S; QQK
+1D530 ; [.1410.0020.0005.1D530] # MATHEMATICAL FRAKTUR SMALL S; QQK
+1D564 ; [.1410.0020.0005.1D564] # MATHEMATICAL DOUBLE-STRUCK SMALL S; QQK
+1D598 ; [.1410.0020.0005.1D598] # MATHEMATICAL BOLD FRAKTUR SMALL S; QQK
+1D5CC ; [.1410.0020.0005.1D5CC] # MATHEMATICAL SANS-SERIF SMALL S; QQK
+1D600 ; [.1410.0020.0005.1D600] # MATHEMATICAL SANS-SERIF BOLD SMALL S; QQK
+1D634 ; [.1410.0020.0005.1D634] # MATHEMATICAL SANS-SERIF ITALIC SMALL S; QQK
+1D668 ; [.1410.0020.0005.1D668] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S; QQK
+1D69C ; [.1410.0020.0005.1D69C] # MATHEMATICAL MONOSPACE SMALL S; QQK
+24E2 ; [.1410.0020.0006.24E2] # CIRCLED LATIN SMALL LETTER S; QQK
+0053 ; [.1410.0020.0008.0053] # LATIN CAPITAL LETTER S
+FF33 ; [.1410.0020.0009.FF33] # FULLWIDTH LATIN CAPITAL LETTER S; QQK
+1F122 ; [*02FF.0020.0004.1F122][.1410.0020.000A.1F122][*0300.0020.001F.1F122] # PARENTHESIZED LATIN CAPITAL LETTER S; QQKN
+1F12A ; [*0347.0020.0004.1F12A][.1410.0020.000A.1F12A][*0348.0020.001F.1F12A] # TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S; QQKN
+1D412 ; [.1410.0020.000B.1D412] # MATHEMATICAL BOLD CAPITAL S; QQK
+1D446 ; [.1410.0020.000B.1D446] # MATHEMATICAL ITALIC CAPITAL S; QQK
+1D47A ; [.1410.0020.000B.1D47A] # MATHEMATICAL BOLD ITALIC CAPITAL S; QQK
+1D4AE ; [.1410.0020.000B.1D4AE] # MATHEMATICAL SCRIPT CAPITAL S; QQK
+1D4E2 ; [.1410.0020.000B.1D4E2] # MATHEMATICAL BOLD SCRIPT CAPITAL S; QQK
+1D516 ; [.1410.0020.000B.1D516] # MATHEMATICAL FRAKTUR CAPITAL S; QQK
+1D54A ; [.1410.0020.000B.1D54A] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S; QQK
+1D57E ; [.1410.0020.000B.1D57E] # MATHEMATICAL BOLD FRAKTUR CAPITAL S; QQK
+1D5B2 ; [.1410.0020.000B.1D5B2] # MATHEMATICAL SANS-SERIF CAPITAL S; QQK
+1D5E6 ; [.1410.0020.000B.1D5E6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S; QQK
+1D61A ; [.1410.0020.000B.1D61A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S; QQK
+1D64E ; [.1410.0020.000B.1D64E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S; QQK
+1D682 ; [.1410.0020.000B.1D682] # MATHEMATICAL MONOSPACE CAPITAL S; QQK
+24C8 ; [.1410.0020.000C.24C8] # CIRCLED LATIN CAPITAL LETTER S; QQK
+02E2 ; [.1410.0020.0014.02E2] # MODIFIER LETTER SMALL S; QQK
+1F142 ; [.1410.0020.001D.1F142] # SQUARED LATIN CAPITAL LETTER S; QQK
+015B ; [.1410.0020.0002.0073][.0000.0032.0002.0301] # LATIN SMALL LETTER S WITH ACUTE; QQCM
+015A ; [.1410.0020.0008.0053][.0000.0032.0002.0301] # LATIN CAPITAL LETTER S WITH ACUTE; QQCM
+1E65 ; [.1410.0020.0002.0073][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE; QQCM
+1E64 ; [.1410.0020.0008.0053][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE; QQCM
+015D ; [.1410.0020.0002.0073][.0000.003C.0002.0302] # LATIN SMALL LETTER S WITH CIRCUMFLEX; QQCM
+015C ; [.1410.0020.0008.0053][.0000.003C.0002.0302] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX; QQCM
+0161 ; [.1410.0020.0002.0073][.0000.0041.0002.030C] # LATIN SMALL LETTER S WITH CARON; QQCM
+0160 ; [.1410.0020.0008.0053][.0000.0041.0002.030C] # LATIN CAPITAL LETTER S WITH CARON; QQCM
+1E67 ; [.1410.0020.0002.0073][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE; QQCM
+1E66 ; [.1410.0020.0008.0053][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE; QQCM
+1E61 ; [.1410.0020.0002.0073][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT ABOVE; QQCM
+1E60 ; [.1410.0020.0008.0053][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT ABOVE; QQCM
+015F ; [.1410.0020.0002.0073][.0000.0056.0002.0327] # LATIN SMALL LETTER S WITH CEDILLA; QQCM
+015E ; [.1410.0020.0008.0053][.0000.0056.0002.0327] # LATIN CAPITAL LETTER S WITH CEDILLA; QQCM
+1E63 ; [.1410.0020.0002.0073][.0000.0070.0002.0323] # LATIN SMALL LETTER S WITH DOT BELOW; QQCM
+1E62 ; [.1410.0020.0008.0053][.0000.0070.0002.0323] # LATIN CAPITAL LETTER S WITH DOT BELOW; QQCM
+1E69 ; [.1410.0020.0002.0073][.0000.0070.0002.0323][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE; QQCM
+1E68 ; [.1410.0020.0008.0053][.0000.0070.0002.0323][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE; QQCM
+0219 ; [.1410.0020.0002.0073][.0000.0077.0002.0326] # LATIN SMALL LETTER S WITH COMMA BELOW; QQCM
+0218 ; [.1410.0020.0008.0053][.0000.0077.0002.0326] # LATIN CAPITAL LETTER S WITH COMMA BELOW; QQCM
+017F ; [.1410.0020.0004.017F][.0000.015A.0004.017F] # LATIN SMALL LETTER LONG S; QQKN
+1DE5 ; [.1410.0020.0004.1DE5][.0000.015A.0004.1DE5] # COMBINING LATIN SMALL LETTER LONG S; QQKN
+A785 ; [.1410.0020.0004.A785][.0000.015A.0004.A785] # LATIN SMALL LETTER INSULAR S; QQKN
+A784 ; [.1410.0020.000A.A784][.0000.015A.0004.A784] # LATIN CAPITAL LETTER INSULAR S; QQKN
+1E9B ; [.1410.0020.0004.1E9B][.0000.015A.0004.1E9B][.0000.0052.0002.1E9B] # LATIN SMALL LETTER LONG S WITH DOT ABOVE; QQKN
+1F18D ; [.1410.0020.001D.1F18D][.120F.0020.001D.1F18D] # NEGATIVE SQUARED SA; QQKN
+1F14C ; [.1410.0020.001D.1F14C][.1250.0020.001D.1F14C] # SQUARED SD; QQKN
+2120 ; [.1410.0020.0014.2120][.135F.0020.0014.2120] # SERVICE MARK; QQKN
+33DB ; [.1410.0020.001C.33DB][.13DA.0020.001C.33DB] # SQUARE SR; QQKN
+1F14D ; [.1410.0020.001D.1F14D][.1410.0020.001D.1F14D] # SQUARED SS; QQKN
+00DF ; [.1410.0020.0004.00DF][.0000.0159.0004.00DF][.1410.0020.001F.00DF] # LATIN SMALL LETTER SHARP S; QQKN
+1E9E ; [.1410.0020.000A.1E9E][.0000.0159.0004.1E9E][.1410.0020.001F.1E9E] # LATIN CAPITAL LETTER SHARP S; QQKN
+FB06 ; [.1410.0020.0004.FB06][.1433.0020.0004.FB06] # LATIN SMALL LIGATURE ST; QQKN
+FB05 ; [.1410.0020.0004.FB05][.0000.015A.0004.FB05][.1433.0020.001F.FB05] # LATIN SMALL LIGATURE LONG S T; QQKN
+33DC ; [.1410.0020.001D.33DC][.147B.0020.001C.33DC] # SQUARE SV; QQKN
+A731 ; [.1414.0020.0002.A731] # LATIN LETTER SMALL CAPITAL S
+1D74 ; [.1415.0020.0002.1D74] # LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D8A ; [.1416.0020.0002.1D8A] # LATIN SMALL LETTER S WITH PALATAL HOOK
+0282 ; [.1417.0020.0002.0282] # LATIN SMALL LETTER S WITH HOOK
+1DB3 ; [.1417.0020.0014.1DB3] # MODIFIER LETTER SMALL S WITH HOOK; QQK
+023F ; [.141B.0020.0002.023F] # LATIN SMALL LETTER S WITH SWASH TAIL
+2C7E ; [.141B.0020.0008.2C7E] # LATIN CAPITAL LETTER S WITH SWASH TAIL
+1E9C ; [.141F.0020.0002.1E9C] # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE
+1E9D ; [.1420.0020.0002.1E9D] # LATIN SMALL LETTER LONG S WITH HIGH STROKE
+0283 ; [.1421.0020.0002.0283] # LATIN SMALL LETTER ESH
+01A9 ; [.1421.0020.0008.01A9] # LATIN CAPITAL LETTER ESH
+1DB4 ; [.1421.0020.0014.1DB4] # MODIFIER LETTER SMALL ESH; QQK
+1D8B ; [.1425.0020.0002.1D8B] # LATIN SMALL LETTER ESH WITH PALATAL HOOK
+01AA ; [.1426.0020.0002.01AA] # LATIN LETTER REVERSED ESH LOOP
+0285 ; [.142A.0020.0002.0285] # LATIN SMALL LETTER SQUAT REVERSED ESH
+1D98 ; [.142E.0020.0002.1D98] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+0286 ; [.142F.0020.0002.0286] # LATIN SMALL LETTER ESH WITH CURL
+0074 ; [.1433.0020.0002.0074] # LATIN SMALL LETTER T
+FF54 ; [.1433.0020.0003.FF54] # FULLWIDTH LATIN SMALL LETTER T; QQK
+036D ; [.1433.0020.0004.036D] # COMBINING LATIN SMALL LETTER T; QQK
+24AF ; [*02FF.0020.0004.24AF][.1433.0020.0004.24AF][*0300.0020.001F.24AF] # PARENTHESIZED LATIN SMALL LETTER T; QQKN
+1D42D ; [.1433.0020.0005.1D42D] # MATHEMATICAL BOLD SMALL T; QQK
+1D461 ; [.1433.0020.0005.1D461] # MATHEMATICAL ITALIC SMALL T; QQK
+1D495 ; [.1433.0020.0005.1D495] # MATHEMATICAL BOLD ITALIC SMALL T; QQK
+1D4C9 ; [.1433.0020.0005.1D4C9] # MATHEMATICAL SCRIPT SMALL T; QQK
+1D4FD ; [.1433.0020.0005.1D4FD] # MATHEMATICAL BOLD SCRIPT SMALL T; QQK
+1D531 ; [.1433.0020.0005.1D531] # MATHEMATICAL FRAKTUR SMALL T; QQK
+1D565 ; [.1433.0020.0005.1D565] # MATHEMATICAL DOUBLE-STRUCK SMALL T; QQK
+1D599 ; [.1433.0020.0005.1D599] # MATHEMATICAL BOLD FRAKTUR SMALL T; QQK
+1D5CD ; [.1433.0020.0005.1D5CD] # MATHEMATICAL SANS-SERIF SMALL T; QQK
+1D601 ; [.1433.0020.0005.1D601] # MATHEMATICAL SANS-SERIF BOLD SMALL T; QQK
+1D635 ; [.1433.0020.0005.1D635] # MATHEMATICAL SANS-SERIF ITALIC SMALL T; QQK
+1D669 ; [.1433.0020.0005.1D669] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T; QQK
+1D69D ; [.1433.0020.0005.1D69D] # MATHEMATICAL MONOSPACE SMALL T; QQK
+24E3 ; [.1433.0020.0006.24E3] # CIRCLED LATIN SMALL LETTER T; QQK
+0054 ; [.1433.0020.0008.0054] # LATIN CAPITAL LETTER T
+FF34 ; [.1433.0020.0009.FF34] # FULLWIDTH LATIN CAPITAL LETTER T; QQK
+1F123 ; [*02FF.0020.0004.1F123][.1433.0020.000A.1F123][*0300.0020.001F.1F123] # PARENTHESIZED LATIN CAPITAL LETTER T; QQKN
+1D413 ; [.1433.0020.000B.1D413] # MATHEMATICAL BOLD CAPITAL T; QQK
+1D447 ; [.1433.0020.000B.1D447] # MATHEMATICAL ITALIC CAPITAL T; QQK
+1D47B ; [.1433.0020.000B.1D47B] # MATHEMATICAL BOLD ITALIC CAPITAL T; QQK
+1D4AF ; [.1433.0020.000B.1D4AF] # MATHEMATICAL SCRIPT CAPITAL T; QQK
+1D4E3 ; [.1433.0020.000B.1D4E3] # MATHEMATICAL BOLD SCRIPT CAPITAL T; QQK
+1D517 ; [.1433.0020.000B.1D517] # MATHEMATICAL FRAKTUR CAPITAL T; QQK
+1D54B ; [.1433.0020.000B.1D54B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T; QQK
+1D57F ; [.1433.0020.000B.1D57F] # MATHEMATICAL BOLD FRAKTUR CAPITAL T; QQK
+1D5B3 ; [.1433.0020.000B.1D5B3] # MATHEMATICAL SANS-SERIF CAPITAL T; QQK
+1D5E7 ; [.1433.0020.000B.1D5E7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T; QQK
+1D61B ; [.1433.0020.000B.1D61B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T; QQK
+1D64F ; [.1433.0020.000B.1D64F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T; QQK
+1D683 ; [.1433.0020.000B.1D683] # MATHEMATICAL MONOSPACE CAPITAL T; QQK
+24C9 ; [.1433.0020.000C.24C9] # CIRCLED LATIN CAPITAL LETTER T; QQK
+1D57 ; [.1433.0020.0014.1D57] # MODIFIER LETTER SMALL T; QQK
+1D40 ; [.1433.0020.001D.1D40] # MODIFIER LETTER CAPITAL T; QQK
+0165 ; [.1433.0020.0002.0074][.0000.0041.0002.030C] # LATIN SMALL LETTER T WITH CARON; QQCM
+0164 ; [.1433.0020.0008.0054][.0000.0041.0002.030C] # LATIN CAPITAL LETTER T WITH CARON; QQCM
+1E97 ; [.1433.0020.0002.0074][.0000.0047.0002.0308] # LATIN SMALL LETTER T WITH DIAERESIS; QQCM
+1E6B ; [.1433.0020.0002.0074][.0000.0052.0002.0307] # LATIN SMALL LETTER T WITH DOT ABOVE; QQCM
+1E6A ; [.1433.0020.0008.0054][.0000.0052.0002.0307] # LATIN CAPITAL LETTER T WITH DOT ABOVE; QQCM
+0163 ; [.1433.0020.0002.0074][.0000.0056.0002.0327] # LATIN SMALL LETTER T WITH CEDILLA; QQCM
+0162 ; [.1433.0020.0008.0054][.0000.0056.0002.0327] # LATIN CAPITAL LETTER T WITH CEDILLA; QQCM
+1E6D ; [.1433.0020.0002.0074][.0000.0070.0002.0323] # LATIN SMALL LETTER T WITH DOT BELOW; QQCM
+1E6C ; [.1433.0020.0008.0054][.0000.0070.0002.0323] # LATIN CAPITAL LETTER T WITH DOT BELOW; QQCM
+021B ; [.1433.0020.0002.0074][.0000.0077.0002.0326] # LATIN SMALL LETTER T WITH COMMA BELOW; QQCM
+021A ; [.1433.0020.0008.0054][.0000.0077.0002.0326] # LATIN CAPITAL LETTER T WITH COMMA BELOW; QQCM
+1E71 ; [.1433.0020.0002.0074][.0000.0078.0002.032D] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW; QQCM
+1E70 ; [.1433.0020.0008.0054][.0000.0078.0002.032D] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW; QQCM
+1E6F ; [.1433.0020.0002.0074][.0000.007B.0002.0331] # LATIN SMALL LETTER T WITH LINE BELOW; QQCM
+1E6E ; [.1433.0020.0008.0054][.0000.007B.0002.0331] # LATIN CAPITAL LETTER T WITH LINE BELOW; QQCM
+A787 ; [.1433.0020.0004.A787][.0000.015A.0004.A787] # LATIN SMALL LETTER INSULAR T; QQKN
+A786 ; [.1433.0020.000A.A786][.0000.015A.0004.A786] # LATIN CAPITAL LETTER INSULAR T; QQKN
+02A8 ; [.1433.0020.0004.02A8][.124A.0020.0004.02A8] # LATIN SMALL LETTER TC DIGRAPH WITH CURL; QQKN
+2121 ; [.1433.0020.000A.2121][.126B.0020.000A.2121][.1330.0020.001F.2121] # TELEPHONE SIGN; QQKN
+1D7A ; [.1433.0020.0004.1D7A][.0000.0159.0004.1D7A][.12D3.0020.001F.1D7A] # LATIN SMALL LETTER TH WITH STRIKETHROUGH; QQKN
+3394 ; [.1433.0020.001D.3394][.12D3.0020.001D.3394][.14AD.0020.001F.3394] # SQUARE THZ; QQKN
+2122 ; [.1433.0020.0014.2122][.135F.0020.0014.2122] # TRADE MARK SIGN; QQKN
+01BE ; [.1433.0020.0004.01BE][.1410.0020.0004.01BE] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE; QQKN
+02A6 ; [.1433.0020.0004.02A6][.1410.0020.0004.02A6] # LATIN SMALL LETTER TS DIGRAPH; QQKN
+02A7 ; [.1433.0020.0004.02A7][.1421.0020.0004.02A7] # LATIN SMALL LETTER TESH DIGRAPH; QQKN
+A729 ; [.1433.0020.0004.A729][.14AD.0020.0004.A729] # LATIN SMALL LETTER TZ; QQKN
+A728 ; [.1433.0020.000A.A728][.14AD.0020.0004.A728] # LATIN CAPITAL LETTER TZ; QQKN
+1D1B ; [.1437.0020.0002.1D1B] # LATIN LETTER SMALL CAPITAL T
+0167 ; [.1438.0020.0002.0167] # LATIN SMALL LETTER T WITH STROKE
+0166 ; [.1438.0020.0008.0166] # LATIN CAPITAL LETTER T WITH STROKE
+2C66 ; [.143C.0020.0002.2C66] # LATIN SMALL LETTER T WITH DIAGONAL STROKE
+023E ; [.143C.0020.0008.023E] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+1D75 ; [.143D.0020.0002.1D75] # LATIN SMALL LETTER T WITH MIDDLE TILDE
+01AB ; [.143E.0020.0002.01AB] # LATIN SMALL LETTER T WITH PALATAL HOOK
+1DB5 ; [.143E.0020.0014.1DB5] # MODIFIER LETTER SMALL T WITH PALATAL HOOK; QQK
+01AD ; [.1442.0020.0002.01AD] # LATIN SMALL LETTER T WITH HOOK
+01AC ; [.1442.0020.0008.01AC] # LATIN CAPITAL LETTER T WITH HOOK
+0288 ; [.1446.0020.0002.0288] # LATIN SMALL LETTER T WITH RETROFLEX HOOK
+01AE ; [.1446.0020.0008.01AE] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+0236 ; [.144A.0020.0002.0236] # LATIN SMALL LETTER T WITH CURL
+A777 ; [.144E.0020.0002.A777] # LATIN SMALL LETTER TUM
+0287 ; [.144F.0020.0002.0287] # LATIN SMALL LETTER TURNED T
+0075 ; [.1453.0020.0002.0075] # LATIN SMALL LETTER U
+FF55 ; [.1453.0020.0003.FF55] # FULLWIDTH LATIN SMALL LETTER U; QQK
+0367 ; [.1453.0020.0004.0367] # COMBINING LATIN SMALL LETTER U; QQK
+24B0 ; [*02FF.0020.0004.24B0][.1453.0020.0004.24B0][*0300.0020.001F.24B0] # PARENTHESIZED LATIN SMALL LETTER U; QQKN
+1D42E ; [.1453.0020.0005.1D42E] # MATHEMATICAL BOLD SMALL U; QQK
+1D462 ; [.1453.0020.0005.1D462] # MATHEMATICAL ITALIC SMALL U; QQK
+1D496 ; [.1453.0020.0005.1D496] # MATHEMATICAL BOLD ITALIC SMALL U; QQK
+1D4CA ; [.1453.0020.0005.1D4CA] # MATHEMATICAL SCRIPT SMALL U; QQK
+1D4FE ; [.1453.0020.0005.1D4FE] # MATHEMATICAL BOLD SCRIPT SMALL U; QQK
+1D532 ; [.1453.0020.0005.1D532] # MATHEMATICAL FRAKTUR SMALL U; QQK
+1D566 ; [.1453.0020.0005.1D566] # MATHEMATICAL DOUBLE-STRUCK SMALL U; QQK
+1D59A ; [.1453.0020.0005.1D59A] # MATHEMATICAL BOLD FRAKTUR SMALL U; QQK
+1D5CE ; [.1453.0020.0005.1D5CE] # MATHEMATICAL SANS-SERIF SMALL U; QQK
+1D602 ; [.1453.0020.0005.1D602] # MATHEMATICAL SANS-SERIF BOLD SMALL U; QQK
+1D636 ; [.1453.0020.0005.1D636] # MATHEMATICAL SANS-SERIF ITALIC SMALL U; QQK
+1D66A ; [.1453.0020.0005.1D66A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U; QQK
+1D69E ; [.1453.0020.0005.1D69E] # MATHEMATICAL MONOSPACE SMALL U; QQK
+24E4 ; [.1453.0020.0006.24E4] # CIRCLED LATIN SMALL LETTER U; QQK
+0055 ; [.1453.0020.0008.0055] # LATIN CAPITAL LETTER U
+FF35 ; [.1453.0020.0009.FF35] # FULLWIDTH LATIN CAPITAL LETTER U; QQK
+1F124 ; [*02FF.0020.0004.1F124][.1453.0020.000A.1F124][*0300.0020.001F.1F124] # PARENTHESIZED LATIN CAPITAL LETTER U; QQKN
+1D414 ; [.1453.0020.000B.1D414] # MATHEMATICAL BOLD CAPITAL U; QQK
+1D448 ; [.1453.0020.000B.1D448] # MATHEMATICAL ITALIC CAPITAL U; QQK
+1D47C ; [.1453.0020.000B.1D47C] # MATHEMATICAL BOLD ITALIC CAPITAL U; QQK
+1D4B0 ; [.1453.0020.000B.1D4B0] # MATHEMATICAL SCRIPT CAPITAL U; QQK
+1D4E4 ; [.1453.0020.000B.1D4E4] # MATHEMATICAL BOLD SCRIPT CAPITAL U; QQK
+1D518 ; [.1453.0020.000B.1D518] # MATHEMATICAL FRAKTUR CAPITAL U; QQK
+1D54C ; [.1453.0020.000B.1D54C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U; QQK
+1D580 ; [.1453.0020.000B.1D580] # MATHEMATICAL BOLD FRAKTUR CAPITAL U; QQK
+1D5B4 ; [.1453.0020.000B.1D5B4] # MATHEMATICAL SANS-SERIF CAPITAL U; QQK
+1D5E8 ; [.1453.0020.000B.1D5E8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U; QQK
+1D61C ; [.1453.0020.000B.1D61C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U; QQK
+1D650 ; [.1453.0020.000B.1D650] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U; QQK
+1D684 ; [.1453.0020.000B.1D684] # MATHEMATICAL MONOSPACE CAPITAL U; QQK
+24CA ; [.1453.0020.000C.24CA] # CIRCLED LATIN CAPITAL LETTER U; QQK
+1D58 ; [.1453.0020.0014.1D58] # MODIFIER LETTER SMALL U; QQK
+1D64 ; [.1453.0020.0015.1D64] # LATIN SUBSCRIPT SMALL LETTER U; QQK
+1D41 ; [.1453.0020.001D.1D41] # MODIFIER LETTER CAPITAL U; QQK
+00FA ; [.1453.0020.0002.0075][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH ACUTE; QQCM
+00DA ; [.1453.0020.0008.0055][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH ACUTE; QQCM
+00F9 ; [.1453.0020.0002.0075][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH GRAVE; QQCM
+00D9 ; [.1453.0020.0008.0055][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH GRAVE; QQCM
+016D ; [.1453.0020.0002.0075][.0000.0037.0002.0306] # LATIN SMALL LETTER U WITH BREVE; QQCM
+016C ; [.1453.0020.0008.0055][.0000.0037.0002.0306] # LATIN CAPITAL LETTER U WITH BREVE; QQCM
+00FB ; [.1453.0020.0002.0075][.0000.003C.0002.0302] # LATIN SMALL LETTER U WITH CIRCUMFLEX; QQCM
+00DB ; [.1453.0020.0008.0055][.0000.003C.0002.0302] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX; QQCM
+01D4 ; [.1453.0020.0002.0075][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH CARON; QQCM
+01D3 ; [.1453.0020.0008.0055][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH CARON; QQCM
+016F ; [.1453.0020.0002.0075][.0000.0043.0002.030A] # LATIN SMALL LETTER U WITH RING ABOVE; QQCM
+016E ; [.1453.0020.0008.0055][.0000.0043.0002.030A] # LATIN CAPITAL LETTER U WITH RING ABOVE; QQCM
+00FC ; [.1453.0020.0002.0075][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH DIAERESIS; QQCM
+00DC ; [.1453.0020.0008.0055][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH DIAERESIS; QQCM
+01D8 ; [.1453.0020.0002.0075][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE; QQCM
+01D7 ; [.1453.0020.0008.0055][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE; QQCM
+01DC ; [.1453.0020.0002.0075][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE; QQCM
+01DB ; [.1453.0020.0008.0055][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE; QQCM
+01DA ; [.1453.0020.0002.0075][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON; QQCM
+01D9 ; [.1453.0020.0008.0055][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON; QQCM
+01D6 ; [.1453.0020.0002.0075][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON; QQCM
+01D5 ; [.1453.0020.0008.0055][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON; QQCM
+0171 ; [.1453.0020.0002.0075][.0000.004D.0002.030B] # LATIN SMALL LETTER U WITH DOUBLE ACUTE; QQCM
+0170 ; [.1453.0020.0008.0055][.0000.004D.0002.030B] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE; QQCM
+0169 ; [.1453.0020.0002.0075][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH TILDE; QQCM
+0168 ; [.1453.0020.0008.0055][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH TILDE; QQCM
+1E79 ; [.1453.0020.0002.0075][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH TILDE AND ACUTE; QQCM
+1E78 ; [.1453.0020.0008.0055][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE; QQCM
+0173 ; [.1453.0020.0002.0075][.0000.0059.0002.0328] # LATIN SMALL LETTER U WITH OGONEK; QQCM
+0172 ; [.1453.0020.0008.0055][.0000.0059.0002.0328] # LATIN CAPITAL LETTER U WITH OGONEK; QQCM
+016B ; [.1453.0020.0002.0075][.0000.005B.0002.0304] # LATIN SMALL LETTER U WITH MACRON; QQCM
+016A ; [.1453.0020.0008.0055][.0000.005B.0002.0304] # LATIN CAPITAL LETTER U WITH MACRON; QQCM
+1E7B ; [.1453.0020.0002.0075][.0000.005B.0002.0304][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS; QQCM
+1E7A ; [.1453.0020.0008.0055][.0000.005B.0002.0304][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS; QQCM
+1EE7 ; [.1453.0020.0002.0075][.0000.0064.0002.0309] # LATIN SMALL LETTER U WITH HOOK ABOVE; QQCM
+1EE6 ; [.1453.0020.0008.0055][.0000.0064.0002.0309] # LATIN CAPITAL LETTER U WITH HOOK ABOVE; QQCM
+0215 ; [.1453.0020.0002.0075][.0000.0065.0002.030F] # LATIN SMALL LETTER U WITH DOUBLE GRAVE; QQCM
+0214 ; [.1453.0020.0008.0055][.0000.0065.0002.030F] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE; QQCM
+0217 ; [.1453.0020.0002.0075][.0000.0067.0002.0311] # LATIN SMALL LETTER U WITH INVERTED BREVE; QQCM
+0216 ; [.1453.0020.0008.0055][.0000.0067.0002.0311] # LATIN CAPITAL LETTER U WITH INVERTED BREVE; QQCM
+01B0 ; [.1453.0020.0002.0075][.0000.0068.0002.031B] # LATIN SMALL LETTER U WITH HORN; QQCM
+01AF ; [.1453.0020.0008.0055][.0000.0068.0002.031B] # LATIN CAPITAL LETTER U WITH HORN; QQCM
+1EE9 ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH HORN AND ACUTE; QQCM
+1EE8 ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE; QQCM
+1EEB ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH HORN AND GRAVE; QQCM
+1EEA ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE; QQCM
+1EEF ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH HORN AND TILDE; QQCM
+1EEE ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH HORN AND TILDE; QQCM
+1EED ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE; QQCM
+1EEC ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE; QQCM
+1EF1 ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW; QQCM
+1EF0 ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW; QQCM
+1EE5 ; [.1453.0020.0002.0075][.0000.0070.0002.0323] # LATIN SMALL LETTER U WITH DOT BELOW; QQCM
+1EE4 ; [.1453.0020.0008.0055][.0000.0070.0002.0323] # LATIN CAPITAL LETTER U WITH DOT BELOW; QQCM
+1E73 ; [.1453.0020.0002.0075][.0000.0075.0002.0324] # LATIN SMALL LETTER U WITH DIAERESIS BELOW; QQCM
+1E72 ; [.1453.0020.0008.0055][.0000.0075.0002.0324] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW; QQCM
+1E77 ; [.1453.0020.0002.0075][.0000.0078.0002.032D] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW; QQCM
+1E76 ; [.1453.0020.0008.0055][.0000.0078.0002.032D] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW; QQCM
+1E75 ; [.1453.0020.0002.0075][.0000.007A.0002.0330] # LATIN SMALL LETTER U WITH TILDE BELOW; QQCM
+1E74 ; [.1453.0020.0008.0055][.0000.007A.0002.0330] # LATIN CAPITAL LETTER U WITH TILDE BELOW; QQCM
+1D1C ; [.1457.0020.0002.1D1C] # LATIN LETTER SMALL CAPITAL U
+1DB8 ; [.1457.0020.0014.1DB8] # MODIFIER LETTER SMALL CAPITAL U; QQK
+1D1D ; [.1458.0020.0002.1D1D] # LATIN SMALL LETTER SIDEWAYS U
+1D59 ; [.1458.0020.0014.1D59] # MODIFIER LETTER SMALL SIDEWAYS U; QQK
+1D1E ; [.1459.0020.0002.1D1E] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D6B ; [.145A.0020.0002.1D6B] # LATIN SMALL LETTER UE
+0289 ; [.145B.0020.0002.0289] # LATIN SMALL LETTER U BAR
+0244 ; [.145B.0020.0008.0244] # LATIN CAPITAL LETTER U BAR
+1DB6 ; [.145B.0020.0014.1DB6] # MODIFIER LETTER SMALL U BAR; QQK
+1D7E ; [.145F.0020.0002.1D7E] # LATIN SMALL CAPITAL LETTER U WITH STROKE
+1D99 ; [.1460.0020.0002.1D99] # LATIN SMALL LETTER U WITH RETROFLEX HOOK
+0265 ; [.1461.0020.0002.0265] # LATIN SMALL LETTER TURNED H
+1DA3 ; [.1461.0020.0014.1DA3] # MODIFIER LETTER SMALL TURNED H; QQK
+02AE ; [.1465.0020.0002.02AE] # LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF ; [.1469.0020.0002.02AF] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+026F ; [.146D.0020.0002.026F] # LATIN SMALL LETTER TURNED M
+019C ; [.146D.0020.0008.019C] # LATIN CAPITAL LETTER TURNED M
+1D5A ; [.146D.0020.0014.1D5A] # MODIFIER LETTER SMALL TURNED M; QQK
+1D1F ; [.1471.0020.0002.1D1F] # LATIN SMALL LETTER SIDEWAYS TURNED M
+0270 ; [.1472.0020.0002.0270] # LATIN SMALL LETTER TURNED M WITH LONG LEG
+1DAD ; [.1472.0020.0014.1DAD] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG; QQK
+028A ; [.1476.0020.0002.028A] # LATIN SMALL LETTER UPSILON
+01B1 ; [.1476.0020.0008.01B1] # LATIN CAPITAL LETTER UPSILON
+1DB7 ; [.1476.0020.0014.1DB7] # MODIFIER LETTER SMALL UPSILON; QQK
+1D7F ; [.147A.0020.0002.1D7F] # LATIN SMALL LETTER UPSILON WITH STROKE
+0076 ; [.147B.0020.0002.0076] # LATIN SMALL LETTER V
+FF56 ; [.147B.0020.0003.FF56] # FULLWIDTH LATIN SMALL LETTER V; QQK
+036E ; [.147B.0020.0004.036E] # COMBINING LATIN SMALL LETTER V; QQK
+2174 ; [.147B.0020.0004.2174] # SMALL ROMAN NUMERAL FIVE; QQK
+24B1 ; [*02FF.0020.0004.24B1][.147B.0020.0004.24B1][*0300.0020.001F.24B1] # PARENTHESIZED LATIN SMALL LETTER V; QQKN
+1D42F ; [.147B.0020.0005.1D42F] # MATHEMATICAL BOLD SMALL V; QQK
+1D463 ; [.147B.0020.0005.1D463] # MATHEMATICAL ITALIC SMALL V; QQK
+1D497 ; [.147B.0020.0005.1D497] # MATHEMATICAL BOLD ITALIC SMALL V; QQK
+1D4CB ; [.147B.0020.0005.1D4CB] # MATHEMATICAL SCRIPT SMALL V; QQK
+1D4FF ; [.147B.0020.0005.1D4FF] # MATHEMATICAL BOLD SCRIPT SMALL V; QQK
+1D533 ; [.147B.0020.0005.1D533] # MATHEMATICAL FRAKTUR SMALL V; QQK
+1D567 ; [.147B.0020.0005.1D567] # MATHEMATICAL DOUBLE-STRUCK SMALL V; QQK
+1D59B ; [.147B.0020.0005.1D59B] # MATHEMATICAL BOLD FRAKTUR SMALL V; QQK
+1D5CF ; [.147B.0020.0005.1D5CF] # MATHEMATICAL SANS-SERIF SMALL V; QQK
+1D603 ; [.147B.0020.0005.1D603] # MATHEMATICAL SANS-SERIF BOLD SMALL V; QQK
+1D637 ; [.147B.0020.0005.1D637] # MATHEMATICAL SANS-SERIF ITALIC SMALL V; QQK
+1D66B ; [.147B.0020.0005.1D66B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V; QQK
+1D69F ; [.147B.0020.0005.1D69F] # MATHEMATICAL MONOSPACE SMALL V; QQK
+24E5 ; [.147B.0020.0006.24E5] # CIRCLED LATIN SMALL LETTER V; QQK
+0056 ; [.147B.0020.0008.0056] # LATIN CAPITAL LETTER V
+FF36 ; [.147B.0020.0009.FF36] # FULLWIDTH LATIN CAPITAL LETTER V; QQK
+2164 ; [.147B.0020.000A.2164] # ROMAN NUMERAL FIVE; QQK
+1F125 ; [*02FF.0020.0004.1F125][.147B.0020.000A.1F125][*0300.0020.001F.1F125] # PARENTHESIZED LATIN CAPITAL LETTER V; QQKN
+1D415 ; [.147B.0020.000B.1D415] # MATHEMATICAL BOLD CAPITAL V; QQK
+1D449 ; [.147B.0020.000B.1D449] # MATHEMATICAL ITALIC CAPITAL V; QQK
+1D47D ; [.147B.0020.000B.1D47D] # MATHEMATICAL BOLD ITALIC CAPITAL V; QQK
+1D4B1 ; [.147B.0020.000B.1D4B1] # MATHEMATICAL SCRIPT CAPITAL V; QQK
+1D4E5 ; [.147B.0020.000B.1D4E5] # MATHEMATICAL BOLD SCRIPT CAPITAL V; QQK
+1D519 ; [.147B.0020.000B.1D519] # MATHEMATICAL FRAKTUR CAPITAL V; QQK
+1D54D ; [.147B.0020.000B.1D54D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V; QQK
+1D581 ; [.147B.0020.000B.1D581] # MATHEMATICAL BOLD FRAKTUR CAPITAL V; QQK
+1D5B5 ; [.147B.0020.000B.1D5B5] # MATHEMATICAL SANS-SERIF CAPITAL V; QQK
+1D5E9 ; [.147B.0020.000B.1D5E9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V; QQK
+1D61D ; [.147B.0020.000B.1D61D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V; QQK
+1D651 ; [.147B.0020.000B.1D651] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V; QQK
+1D685 ; [.147B.0020.000B.1D685] # MATHEMATICAL MONOSPACE CAPITAL V; QQK
+24CB ; [.147B.0020.000C.24CB] # CIRCLED LATIN CAPITAL LETTER V; QQK
+1D5B ; [.147B.0020.0014.1D5B] # MODIFIER LETTER SMALL V; QQK
+1D65 ; [.147B.0020.0015.1D65] # LATIN SUBSCRIPT SMALL LETTER V; QQK
+2C7D ; [.147B.0020.001D.2C7D] # MODIFIER LETTER CAPITAL V; QQK
+1E7D ; [.147B.0020.0002.0076][.0000.004E.0002.0303] # LATIN SMALL LETTER V WITH TILDE; QQCM
+1E7C ; [.147B.0020.0008.0056][.0000.004E.0002.0303] # LATIN CAPITAL LETTER V WITH TILDE; QQCM
+1E7F ; [.147B.0020.0002.0076][.0000.0070.0002.0323] # LATIN SMALL LETTER V WITH DOT BELOW; QQCM
+1E7E ; [.147B.0020.0008.0056][.0000.0070.0002.0323] # LATIN CAPITAL LETTER V WITH DOT BELOW; QQCM
+2175 ; [.147B.0020.0004.2175][.12EC.0020.0004.2175] # SMALL ROMAN NUMERAL SIX; QQKN
+2165 ; [.147B.0020.000A.2165][.12EC.0020.000A.2165] # ROMAN NUMERAL SIX; QQKN
+2176 ; [.147B.0020.0004.2176][.12EC.0020.0004.2176][.12EC.0020.001F.2176] # SMALL ROMAN NUMERAL SEVEN; QQKN
+2166 ; [.147B.0020.000A.2166][.12EC.0020.000A.2166][.12EC.0020.001F.2166] # ROMAN NUMERAL SEVEN; QQKN
+2177 ; [.147B.0020.0004.2177][.12EC.0020.0004.2177][.12EC.0020.001F.2177][.12EC.0020.001F.2177] # SMALL ROMAN NUMERAL EIGHT; QQKN
+2167 ; [.147B.0020.000A.2167][.12EC.0020.000A.2167][.12EC.0020.001F.2167][.12EC.0020.001F.2167] # ROMAN NUMERAL EIGHT; QQKN
+33DE ; [.147B.0020.001D.33DE][*055F.0020.001C.33DE][.135F.0020.001F.33DE] # SQUARE V OVER M; QQKN
+A761 ; [.147B.0020.0004.A761][.149C.0020.0004.A761] # LATIN SMALL LETTER VY; QQKN
+A760 ; [.147B.0020.000A.A760][.149C.0020.000A.A760] # LATIN CAPITAL LETTER VY; QQKN
+1D20 ; [.147F.0020.0002.1D20] # LATIN LETTER SMALL CAPITAL V
+A75F ; [.1480.0020.0002.A75F] # LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A75E ; [.1480.0020.0008.A75E] # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+1D8C ; [.1481.0020.0002.1D8C] # LATIN SMALL LETTER V WITH PALATAL HOOK
+028B ; [.1482.0020.0002.028B] # LATIN SMALL LETTER V WITH HOOK
+01B2 ; [.1482.0020.0008.01B2] # LATIN CAPITAL LETTER V WITH HOOK
+1DB9 ; [.1482.0020.0014.1DB9] # MODIFIER LETTER SMALL V WITH HOOK; QQK
+2C71 ; [.1486.0020.0002.2C71] # LATIN SMALL LETTER V WITH RIGHT HOOK
+2C74 ; [.1487.0020.0002.2C74] # LATIN SMALL LETTER V WITH CURL
+1EFD ; [.1488.0020.0002.1EFD] # LATIN SMALL LETTER MIDDLE-WELSH V
+1EFC ; [.1488.0020.0008.1EFC] # LATIN CAPITAL LETTER MIDDLE-WELSH V
+028C ; [.1489.0020.0002.028C] # LATIN SMALL LETTER TURNED V
+0245 ; [.1489.0020.0008.0245] # LATIN CAPITAL LETTER TURNED V
+1DBA ; [.1489.0020.0014.1DBA] # MODIFIER LETTER SMALL TURNED V; QQK
+0077 ; [.148D.0020.0002.0077] # LATIN SMALL LETTER W
+FF57 ; [.148D.0020.0003.FF57] # FULLWIDTH LATIN SMALL LETTER W; QQK
+24B2 ; [*02FF.0020.0004.24B2][.148D.0020.0004.24B2][*0300.0020.001F.24B2] # PARENTHESIZED LATIN SMALL LETTER W; QQKN
+1D430 ; [.148D.0020.0005.1D430] # MATHEMATICAL BOLD SMALL W; QQK
+1D464 ; [.148D.0020.0005.1D464] # MATHEMATICAL ITALIC SMALL W; QQK
+1D498 ; [.148D.0020.0005.1D498] # MATHEMATICAL BOLD ITALIC SMALL W; QQK
+1D4CC ; [.148D.0020.0005.1D4CC] # MATHEMATICAL SCRIPT SMALL W; QQK
+1D500 ; [.148D.0020.0005.1D500] # MATHEMATICAL BOLD SCRIPT SMALL W; QQK
+1D534 ; [.148D.0020.0005.1D534] # MATHEMATICAL FRAKTUR SMALL W; QQK
+1D568 ; [.148D.0020.0005.1D568] # MATHEMATICAL DOUBLE-STRUCK SMALL W; QQK
+1D59C ; [.148D.0020.0005.1D59C] # MATHEMATICAL BOLD FRAKTUR SMALL W; QQK
+1D5D0 ; [.148D.0020.0005.1D5D0] # MATHEMATICAL SANS-SERIF SMALL W; QQK
+1D604 ; [.148D.0020.0005.1D604] # MATHEMATICAL SANS-SERIF BOLD SMALL W; QQK
+1D638 ; [.148D.0020.0005.1D638] # MATHEMATICAL SANS-SERIF ITALIC SMALL W; QQK
+1D66C ; [.148D.0020.0005.1D66C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W; QQK
+1D6A0 ; [.148D.0020.0005.1D6A0] # MATHEMATICAL MONOSPACE SMALL W; QQK
+24E6 ; [.148D.0020.0006.24E6] # CIRCLED LATIN SMALL LETTER W; QQK
+0057 ; [.148D.0020.0008.0057] # LATIN CAPITAL LETTER W
+FF37 ; [.148D.0020.0009.FF37] # FULLWIDTH LATIN CAPITAL LETTER W; QQK
+1F126 ; [*02FF.0020.0004.1F126][.148D.0020.000A.1F126][*0300.0020.001F.1F126] # PARENTHESIZED LATIN CAPITAL LETTER W; QQKN
+1D416 ; [.148D.0020.000B.1D416] # MATHEMATICAL BOLD CAPITAL W; QQK
+1D44A ; [.148D.0020.000B.1D44A] # MATHEMATICAL ITALIC CAPITAL W; QQK
+1D47E ; [.148D.0020.000B.1D47E] # MATHEMATICAL BOLD ITALIC CAPITAL W; QQK
+1D4B2 ; [.148D.0020.000B.1D4B2] # MATHEMATICAL SCRIPT CAPITAL W; QQK
+1D4E6 ; [.148D.0020.000B.1D4E6] # MATHEMATICAL BOLD SCRIPT CAPITAL W; QQK
+1D51A ; [.148D.0020.000B.1D51A] # MATHEMATICAL FRAKTUR CAPITAL W; QQK
+1D54E ; [.148D.0020.000B.1D54E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W; QQK
+1D582 ; [.148D.0020.000B.1D582] # MATHEMATICAL BOLD FRAKTUR CAPITAL W; QQK
+1D5B6 ; [.148D.0020.000B.1D5B6] # MATHEMATICAL SANS-SERIF CAPITAL W; QQK
+1D5EA ; [.148D.0020.000B.1D5EA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W; QQK
+1D61E ; [.148D.0020.000B.1D61E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W; QQK
+1D652 ; [.148D.0020.000B.1D652] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W; QQK
+1D686 ; [.148D.0020.000B.1D686] # MATHEMATICAL MONOSPACE CAPITAL W; QQK
+24CC ; [.148D.0020.000C.24CC] # CIRCLED LATIN CAPITAL LETTER W; QQK
+02B7 ; [.148D.0020.0014.02B7] # MODIFIER LETTER SMALL W; QQK
+1D42 ; [.148D.0020.001D.1D42] # MODIFIER LETTER CAPITAL W; QQK
+1F146 ; [.148D.0020.001D.1F146] # SQUARED LATIN CAPITAL LETTER W; QQK
+1E83 ; [.148D.0020.0002.0077][.0000.0032.0002.0301] # LATIN SMALL LETTER W WITH ACUTE; QQCM
+1E82 ; [.148D.0020.0008.0057][.0000.0032.0002.0301] # LATIN CAPITAL LETTER W WITH ACUTE; QQCM
+1E81 ; [.148D.0020.0002.0077][.0000.0035.0002.0300] # LATIN SMALL LETTER W WITH GRAVE; QQCM
+1E80 ; [.148D.0020.0008.0057][.0000.0035.0002.0300] # LATIN CAPITAL LETTER W WITH GRAVE; QQCM
+0175 ; [.148D.0020.0002.0077][.0000.003C.0002.0302] # LATIN SMALL LETTER W WITH CIRCUMFLEX; QQCM
+0174 ; [.148D.0020.0008.0057][.0000.003C.0002.0302] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX; QQCM
+1E98 ; [.148D.0020.0002.0077][.0000.0043.0002.030A] # LATIN SMALL LETTER W WITH RING ABOVE; QQCM
+1E85 ; [.148D.0020.0002.0077][.0000.0047.0002.0308] # LATIN SMALL LETTER W WITH DIAERESIS; QQCM
+1E84 ; [.148D.0020.0008.0057][.0000.0047.0002.0308] # LATIN CAPITAL LETTER W WITH DIAERESIS; QQCM
+1E87 ; [.148D.0020.0002.0077][.0000.0052.0002.0307] # LATIN SMALL LETTER W WITH DOT ABOVE; QQCM
+1E86 ; [.148D.0020.0008.0057][.0000.0052.0002.0307] # LATIN CAPITAL LETTER W WITH DOT ABOVE; QQCM
+1E89 ; [.148D.0020.0002.0077][.0000.0070.0002.0323] # LATIN SMALL LETTER W WITH DOT BELOW; QQCM
+1E88 ; [.148D.0020.0008.0057][.0000.0070.0002.0323] # LATIN CAPITAL LETTER W WITH DOT BELOW; QQCM
+33DD ; [.148D.0020.001D.33DD][.1225.0020.001C.33DD] # SQUARE WB; QQKN
+1F12E ; [.148D.0020.000C.1F12E][.14AD.0020.000C.1F12E] # CIRCLED WZ; QQKN
+1D21 ; [.1491.0020.0002.1D21] # LATIN LETTER SMALL CAPITAL W
+2C73 ; [.1492.0020.0002.2C73] # LATIN SMALL LETTER W WITH HOOK
+2C72 ; [.1492.0020.0008.2C72] # LATIN CAPITAL LETTER W WITH HOOK
+028D ; [.1493.0020.0002.028D] # LATIN SMALL LETTER TURNED W
+0078 ; [.1497.0020.0002.0078] # LATIN SMALL LETTER X
+FF58 ; [.1497.0020.0003.FF58] # FULLWIDTH LATIN SMALL LETTER X; QQK
+036F ; [.1497.0020.0004.036F] # COMBINING LATIN SMALL LETTER X; QQK
+2179 ; [.1497.0020.0004.2179] # SMALL ROMAN NUMERAL TEN; QQK
+24B3 ; [*02FF.0020.0004.24B3][.1497.0020.0004.24B3][*0300.0020.001F.24B3] # PARENTHESIZED LATIN SMALL LETTER X; QQKN
+1D431 ; [.1497.0020.0005.1D431] # MATHEMATICAL BOLD SMALL X; QQK
+1D465 ; [.1497.0020.0005.1D465] # MATHEMATICAL ITALIC SMALL X; QQK
+1D499 ; [.1497.0020.0005.1D499] # MATHEMATICAL BOLD ITALIC SMALL X; QQK
+1D4CD ; [.1497.0020.0005.1D4CD] # MATHEMATICAL SCRIPT SMALL X; QQK
+1D501 ; [.1497.0020.0005.1D501] # MATHEMATICAL BOLD SCRIPT SMALL X; QQK
+1D535 ; [.1497.0020.0005.1D535] # MATHEMATICAL FRAKTUR SMALL X; QQK
+1D569 ; [.1497.0020.0005.1D569] # MATHEMATICAL DOUBLE-STRUCK SMALL X; QQK
+1D59D ; [.1497.0020.0005.1D59D] # MATHEMATICAL BOLD FRAKTUR SMALL X; QQK
+1D5D1 ; [.1497.0020.0005.1D5D1] # MATHEMATICAL SANS-SERIF SMALL X; QQK
+1D605 ; [.1497.0020.0005.1D605] # MATHEMATICAL SANS-SERIF BOLD SMALL X; QQK
+1D639 ; [.1497.0020.0005.1D639] # MATHEMATICAL SANS-SERIF ITALIC SMALL X; QQK
+1D66D ; [.1497.0020.0005.1D66D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X; QQK
+1D6A1 ; [.1497.0020.0005.1D6A1] # MATHEMATICAL MONOSPACE SMALL X; QQK
+24E7 ; [.1497.0020.0006.24E7] # CIRCLED LATIN SMALL LETTER X; QQK
+0058 ; [.1497.0020.0008.0058] # LATIN CAPITAL LETTER X
+FF38 ; [.1497.0020.0009.FF38] # FULLWIDTH LATIN CAPITAL LETTER X; QQK
+2169 ; [.1497.0020.000A.2169] # ROMAN NUMERAL TEN; QQK
+1F127 ; [*02FF.0020.0004.1F127][.1497.0020.000A.1F127][*0300.0020.001F.1F127] # PARENTHESIZED LATIN CAPITAL LETTER X; QQKN
+1D417 ; [.1497.0020.000B.1D417] # MATHEMATICAL BOLD CAPITAL X; QQK
+1D44B ; [.1497.0020.000B.1D44B] # MATHEMATICAL ITALIC CAPITAL X; QQK
+1D47F ; [.1497.0020.000B.1D47F] # MATHEMATICAL BOLD ITALIC CAPITAL X; QQK
+1D4B3 ; [.1497.0020.000B.1D4B3] # MATHEMATICAL SCRIPT CAPITAL X; QQK
+1D4E7 ; [.1497.0020.000B.1D4E7] # MATHEMATICAL BOLD SCRIPT CAPITAL X; QQK
+1D51B ; [.1497.0020.000B.1D51B] # MATHEMATICAL FRAKTUR CAPITAL X; QQK
+1D54F ; [.1497.0020.000B.1D54F] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X; QQK
+1D583 ; [.1497.0020.000B.1D583] # MATHEMATICAL BOLD FRAKTUR CAPITAL X; QQK
+1D5B7 ; [.1497.0020.000B.1D5B7] # MATHEMATICAL SANS-SERIF CAPITAL X; QQK
+1D5EB ; [.1497.0020.000B.1D5EB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X; QQK
+1D61F ; [.1497.0020.000B.1D61F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X; QQK
+1D653 ; [.1497.0020.000B.1D653] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X; QQK
+1D687 ; [.1497.0020.000B.1D687] # MATHEMATICAL MONOSPACE CAPITAL X; QQK
+24CD ; [.1497.0020.000C.24CD] # CIRCLED LATIN CAPITAL LETTER X; QQK
+02E3 ; [.1497.0020.0014.02E3] # MODIFIER LETTER SMALL X; QQK
+2093 ; [.1497.0020.0015.2093] # LATIN SUBSCRIPT SMALL LETTER X; QQK
+1E8D ; [.1497.0020.0002.0078][.0000.0047.0002.0308] # LATIN SMALL LETTER X WITH DIAERESIS; QQCM
+1E8C ; [.1497.0020.0008.0058][.0000.0047.0002.0308] # LATIN CAPITAL LETTER X WITH DIAERESIS; QQCM
+1E8B ; [.1497.0020.0002.0078][.0000.0052.0002.0307] # LATIN SMALL LETTER X WITH DOT ABOVE; QQCM
+1E8A ; [.1497.0020.0008.0058][.0000.0052.0002.0307] # LATIN CAPITAL LETTER X WITH DOT ABOVE; QQCM
+217A ; [.1497.0020.0004.217A][.12EC.0020.0004.217A] # SMALL ROMAN NUMERAL ELEVEN; QQKN
+216A ; [.1497.0020.000A.216A][.12EC.0020.000A.216A] # ROMAN NUMERAL ELEVEN; QQKN
+217B ; [.1497.0020.0004.217B][.12EC.0020.0004.217B][.12EC.0020.001F.217B] # SMALL ROMAN NUMERAL TWELVE; QQKN
+216B ; [.1497.0020.000A.216B][.12EC.0020.000A.216B][.12EC.0020.001F.216B] # ROMAN NUMERAL TWELVE; QQKN
+1D8D ; [.149B.0020.0002.1D8D] # LATIN SMALL LETTER X WITH PALATAL HOOK
+0079 ; [.149C.0020.0002.0079] # LATIN SMALL LETTER Y
+FF59 ; [.149C.0020.0003.FF59] # FULLWIDTH LATIN SMALL LETTER Y; QQK
+24B4 ; [*02FF.0020.0004.24B4][.149C.0020.0004.24B4][*0300.0020.001F.24B4] # PARENTHESIZED LATIN SMALL LETTER Y; QQKN
+1D432 ; [.149C.0020.0005.1D432] # MATHEMATICAL BOLD SMALL Y; QQK
+1D466 ; [.149C.0020.0005.1D466] # MATHEMATICAL ITALIC SMALL Y; QQK
+1D49A ; [.149C.0020.0005.1D49A] # MATHEMATICAL BOLD ITALIC SMALL Y; QQK
+1D4CE ; [.149C.0020.0005.1D4CE] # MATHEMATICAL SCRIPT SMALL Y; QQK
+1D502 ; [.149C.0020.0005.1D502] # MATHEMATICAL BOLD SCRIPT SMALL Y; QQK
+1D536 ; [.149C.0020.0005.1D536] # MATHEMATICAL FRAKTUR SMALL Y; QQK
+1D56A ; [.149C.0020.0005.1D56A] # MATHEMATICAL DOUBLE-STRUCK SMALL Y; QQK
+1D59E ; [.149C.0020.0005.1D59E] # MATHEMATICAL BOLD FRAKTUR SMALL Y; QQK
+1D5D2 ; [.149C.0020.0005.1D5D2] # MATHEMATICAL SANS-SERIF SMALL Y; QQK
+1D606 ; [.149C.0020.0005.1D606] # MATHEMATICAL SANS-SERIF BOLD SMALL Y; QQK
+1D63A ; [.149C.0020.0005.1D63A] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y; QQK
+1D66E ; [.149C.0020.0005.1D66E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y; QQK
+1D6A2 ; [.149C.0020.0005.1D6A2] # MATHEMATICAL MONOSPACE SMALL Y; QQK
+24E8 ; [.149C.0020.0006.24E8] # CIRCLED LATIN SMALL LETTER Y; QQK
+0059 ; [.149C.0020.0008.0059] # LATIN CAPITAL LETTER Y
+FF39 ; [.149C.0020.0009.FF39] # FULLWIDTH LATIN CAPITAL LETTER Y; QQK
+1F128 ; [*02FF.0020.0004.1F128][.149C.0020.000A.1F128][*0300.0020.001F.1F128] # PARENTHESIZED LATIN CAPITAL LETTER Y; QQKN
+1D418 ; [.149C.0020.000B.1D418] # MATHEMATICAL BOLD CAPITAL Y; QQK
+1D44C ; [.149C.0020.000B.1D44C] # MATHEMATICAL ITALIC CAPITAL Y; QQK
+1D480 ; [.149C.0020.000B.1D480] # MATHEMATICAL BOLD ITALIC CAPITAL Y; QQK
+1D4B4 ; [.149C.0020.000B.1D4B4] # MATHEMATICAL SCRIPT CAPITAL Y; QQK
+1D4E8 ; [.149C.0020.000B.1D4E8] # MATHEMATICAL BOLD SCRIPT CAPITAL Y; QQK
+1D51C ; [.149C.0020.000B.1D51C] # MATHEMATICAL FRAKTUR CAPITAL Y; QQK
+1D550 ; [.149C.0020.000B.1D550] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y; QQK
+1D584 ; [.149C.0020.000B.1D584] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y; QQK
+1D5B8 ; [.149C.0020.000B.1D5B8] # MATHEMATICAL SANS-SERIF CAPITAL Y; QQK
+1D5EC ; [.149C.0020.000B.1D5EC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y; QQK
+1D620 ; [.149C.0020.000B.1D620] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y; QQK
+1D654 ; [.149C.0020.000B.1D654] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y; QQK
+1D688 ; [.149C.0020.000B.1D688] # MATHEMATICAL MONOSPACE CAPITAL Y; QQK
+24CE ; [.149C.0020.000C.24CE] # CIRCLED LATIN CAPITAL LETTER Y; QQK
+02B8 ; [.149C.0020.0014.02B8] # MODIFIER LETTER SMALL Y; QQK
+00FD ; [.149C.0020.0002.0079][.0000.0032.0002.0301] # LATIN SMALL LETTER Y WITH ACUTE; QQCM
+00DD ; [.149C.0020.0008.0059][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Y WITH ACUTE; QQCM
+1EF3 ; [.149C.0020.0002.0079][.0000.0035.0002.0300] # LATIN SMALL LETTER Y WITH GRAVE; QQCM
+1EF2 ; [.149C.0020.0008.0059][.0000.0035.0002.0300] # LATIN CAPITAL LETTER Y WITH GRAVE; QQCM
+0177 ; [.149C.0020.0002.0079][.0000.003C.0002.0302] # LATIN SMALL LETTER Y WITH CIRCUMFLEX; QQCM
+0176 ; [.149C.0020.0008.0059][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX; QQCM
+1E99 ; [.149C.0020.0002.0079][.0000.0043.0002.030A] # LATIN SMALL LETTER Y WITH RING ABOVE; QQCM
+00FF ; [.149C.0020.0002.0079][.0000.0047.0002.0308] # LATIN SMALL LETTER Y WITH DIAERESIS; QQCM
+0178 ; [.149C.0020.0008.0059][.0000.0047.0002.0308] # LATIN CAPITAL LETTER Y WITH DIAERESIS; QQCM
+1EF9 ; [.149C.0020.0002.0079][.0000.004E.0002.0303] # LATIN SMALL LETTER Y WITH TILDE; QQCM
+1EF8 ; [.149C.0020.0008.0059][.0000.004E.0002.0303] # LATIN CAPITAL LETTER Y WITH TILDE; QQCM
+1E8F ; [.149C.0020.0002.0079][.0000.0052.0002.0307] # LATIN SMALL LETTER Y WITH DOT ABOVE; QQCM
+1E8E ; [.149C.0020.0008.0059][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Y WITH DOT ABOVE; QQCM
+0233 ; [.149C.0020.0002.0079][.0000.005B.0002.0304] # LATIN SMALL LETTER Y WITH MACRON; QQCM
+0232 ; [.149C.0020.0008.0059][.0000.005B.0002.0304] # LATIN CAPITAL LETTER Y WITH MACRON; QQCM
+1EF7 ; [.149C.0020.0002.0079][.0000.0064.0002.0309] # LATIN SMALL LETTER Y WITH HOOK ABOVE; QQCM
+1EF6 ; [.149C.0020.0008.0059][.0000.0064.0002.0309] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE; QQCM
+1EF5 ; [.149C.0020.0002.0079][.0000.0070.0002.0323] # LATIN SMALL LETTER Y WITH DOT BELOW; QQCM
+1EF4 ; [.149C.0020.0008.0059][.0000.0070.0002.0323] # LATIN CAPITAL LETTER Y WITH DOT BELOW; QQCM
+028F ; [.14A0.0020.0002.028F] # LATIN LETTER SMALL CAPITAL Y
+024F ; [.14A4.0020.0002.024F] # LATIN SMALL LETTER Y WITH STROKE
+024E ; [.14A4.0020.0008.024E] # LATIN CAPITAL LETTER Y WITH STROKE
+01B4 ; [.14A8.0020.0002.01B4] # LATIN SMALL LETTER Y WITH HOOK
+01B3 ; [.14A8.0020.0008.01B3] # LATIN CAPITAL LETTER Y WITH HOOK
+1EFF ; [.14AC.0020.0002.1EFF] # LATIN SMALL LETTER Y WITH LOOP
+1EFE ; [.14AC.0020.0008.1EFE] # LATIN CAPITAL LETTER Y WITH LOOP
+007A ; [.14AD.0020.0002.007A] # LATIN SMALL LETTER Z
+FF5A ; [.14AD.0020.0003.FF5A] # FULLWIDTH LATIN SMALL LETTER Z; QQK
+1DE6 ; [.14AD.0020.0004.1DE6] # COMBINING LATIN SMALL LETTER Z; QQK
+24B5 ; [*02FF.0020.0004.24B5][.14AD.0020.0004.24B5][*0300.0020.001F.24B5] # PARENTHESIZED LATIN SMALL LETTER Z; QQKN
+1D433 ; [.14AD.0020.0005.1D433] # MATHEMATICAL BOLD SMALL Z; QQK
+1D467 ; [.14AD.0020.0005.1D467] # MATHEMATICAL ITALIC SMALL Z; QQK
+1D49B ; [.14AD.0020.0005.1D49B] # MATHEMATICAL BOLD ITALIC SMALL Z; QQK
+1D4CF ; [.14AD.0020.0005.1D4CF] # MATHEMATICAL SCRIPT SMALL Z; QQK
+1D503 ; [.14AD.0020.0005.1D503] # MATHEMATICAL BOLD SCRIPT SMALL Z; QQK
+1D537 ; [.14AD.0020.0005.1D537] # MATHEMATICAL FRAKTUR SMALL Z; QQK
+1D56B ; [.14AD.0020.0005.1D56B] # MATHEMATICAL DOUBLE-STRUCK SMALL Z; QQK
+1D59F ; [.14AD.0020.0005.1D59F] # MATHEMATICAL BOLD FRAKTUR SMALL Z; QQK
+1D5D3 ; [.14AD.0020.0005.1D5D3] # MATHEMATICAL SANS-SERIF SMALL Z; QQK
+1D607 ; [.14AD.0020.0005.1D607] # MATHEMATICAL SANS-SERIF BOLD SMALL Z; QQK
+1D63B ; [.14AD.0020.0005.1D63B] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z; QQK
+1D66F ; [.14AD.0020.0005.1D66F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z; QQK
+1D6A3 ; [.14AD.0020.0005.1D6A3] # MATHEMATICAL MONOSPACE SMALL Z; QQK
+24E9 ; [.14AD.0020.0006.24E9] # CIRCLED LATIN SMALL LETTER Z; QQK
+005A ; [.14AD.0020.0008.005A] # LATIN CAPITAL LETTER Z
+FF3A ; [.14AD.0020.0009.FF3A] # FULLWIDTH LATIN CAPITAL LETTER Z; QQK
+1F129 ; [*02FF.0020.0004.1F129][.14AD.0020.000A.1F129][*0300.0020.001F.1F129] # PARENTHESIZED LATIN CAPITAL LETTER Z; QQKN
+2124 ; [.14AD.0020.000B.2124] # DOUBLE-STRUCK CAPITAL Z; QQK
+2128 ; [.14AD.0020.000B.2128] # BLACK-LETTER CAPITAL Z; QQK
+1D419 ; [.14AD.0020.000B.1D419] # MATHEMATICAL BOLD CAPITAL Z; QQK
+1D44D ; [.14AD.0020.000B.1D44D] # MATHEMATICAL ITALIC CAPITAL Z; QQK
+1D481 ; [.14AD.0020.000B.1D481] # MATHEMATICAL BOLD ITALIC CAPITAL Z; QQK
+1D4B5 ; [.14AD.0020.000B.1D4B5] # MATHEMATICAL SCRIPT CAPITAL Z; QQK
+1D4E9 ; [.14AD.0020.000B.1D4E9] # MATHEMATICAL BOLD SCRIPT CAPITAL Z; QQK
+1D585 ; [.14AD.0020.000B.1D585] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z; QQK
+1D5B9 ; [.14AD.0020.000B.1D5B9] # MATHEMATICAL SANS-SERIF CAPITAL Z; QQK
+1D5ED ; [.14AD.0020.000B.1D5ED] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z; QQK
+1D621 ; [.14AD.0020.000B.1D621] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z; QQK
+1D655 ; [.14AD.0020.000B.1D655] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z; QQK
+1D689 ; [.14AD.0020.000B.1D689] # MATHEMATICAL MONOSPACE CAPITAL Z; QQK
+24CF ; [.14AD.0020.000C.24CF] # CIRCLED LATIN CAPITAL LETTER Z; QQK
+1DBB ; [.14AD.0020.0014.1DBB] # MODIFIER LETTER SMALL Z; QQK
+017A ; [.14AD.0020.0002.007A][.0000.0032.0002.0301] # LATIN SMALL LETTER Z WITH ACUTE; QQCM
+0179 ; [.14AD.0020.0008.005A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Z WITH ACUTE; QQCM
+1E91 ; [.14AD.0020.0002.007A][.0000.003C.0002.0302] # LATIN SMALL LETTER Z WITH CIRCUMFLEX; QQCM
+1E90 ; [.14AD.0020.0008.005A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX; QQCM
+017E ; [.14AD.0020.0002.007A][.0000.0041.0002.030C] # LATIN SMALL LETTER Z WITH CARON; QQCM
+017D ; [.14AD.0020.0008.005A][.0000.0041.0002.030C] # LATIN CAPITAL LETTER Z WITH CARON; QQCM
+017C ; [.14AD.0020.0002.007A][.0000.0052.0002.0307] # LATIN SMALL LETTER Z WITH DOT ABOVE; QQCM
+017B ; [.14AD.0020.0008.005A][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Z WITH DOT ABOVE; QQCM
+1E93 ; [.14AD.0020.0002.007A][.0000.0070.0002.0323] # LATIN SMALL LETTER Z WITH DOT BELOW; QQCM
+1E92 ; [.14AD.0020.0008.005A][.0000.0070.0002.0323] # LATIN CAPITAL LETTER Z WITH DOT BELOW; QQCM
+1E95 ; [.14AD.0020.0002.007A][.0000.007B.0002.0331] # LATIN SMALL LETTER Z WITH LINE BELOW; QQCM
+1E94 ; [.14AD.0020.0008.005A][.0000.007B.0002.0331] # LATIN CAPITAL LETTER Z WITH LINE BELOW; QQCM
+018D ; [.14AD.0020.0004.018D][.148D.0020.0004.018D] # LATIN SMALL LETTER TURNED DELTA; QQKN
+1D22 ; [.14B1.0020.0002.1D22] # LATIN LETTER SMALL CAPITAL Z
+01B6 ; [.14B2.0020.0002.01B6] # LATIN SMALL LETTER Z WITH STROKE
+01B5 ; [.14B2.0020.0008.01B5] # LATIN CAPITAL LETTER Z WITH STROKE
+1D76 ; [.14B6.0020.0002.1D76] # LATIN SMALL LETTER Z WITH MIDDLE TILDE
+1D8E ; [.14B7.0020.0002.1D8E] # LATIN SMALL LETTER Z WITH PALATAL HOOK
+0225 ; [.14B8.0020.0002.0225] # LATIN SMALL LETTER Z WITH HOOK
+0224 ; [.14B8.0020.0008.0224] # LATIN CAPITAL LETTER Z WITH HOOK
+0290 ; [.14BC.0020.0002.0290] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+1DBC ; [.14BC.0020.0014.1DBC] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK; QQK
+0291 ; [.14C0.0020.0002.0291] # LATIN SMALL LETTER Z WITH CURL
+1DBD ; [.14C0.0020.0014.1DBD] # MODIFIER LETTER SMALL Z WITH CURL; QQK
+0240 ; [.14C4.0020.0002.0240] # LATIN SMALL LETTER Z WITH SWASH TAIL
+2C7F ; [.14C4.0020.0008.2C7F] # LATIN CAPITAL LETTER Z WITH SWASH TAIL
+2C6C ; [.14C8.0020.0002.2C6C] # LATIN SMALL LETTER Z WITH DESCENDER
+2C6B ; [.14C8.0020.0008.2C6B] # LATIN CAPITAL LETTER Z WITH DESCENDER
+A763 ; [.14C9.0020.0002.A763] # LATIN SMALL LETTER VISIGOTHIC Z
+A762 ; [.14C9.0020.0008.A762] # LATIN CAPITAL LETTER VISIGOTHIC Z
+0292 ; [.14CA.0020.0002.0292] # LATIN SMALL LETTER EZH
+01B7 ; [.14CA.0020.0008.01B7] # LATIN CAPITAL LETTER EZH
+1DBE ; [.14CA.0020.0014.1DBE] # MODIFIER LETTER SMALL EZH; QQK
+01EF ; [.14CA.0020.0002.0292][.0000.0041.0002.030C] # LATIN SMALL LETTER EZH WITH CARON; QQCM
+01EE ; [.14CA.0020.0008.01B7][.0000.0041.0002.030C] # LATIN CAPITAL LETTER EZH WITH CARON; QQCM
+1D23 ; [.14CE.0020.0002.1D23] # LATIN LETTER SMALL CAPITAL EZH
+01B9 ; [.14CF.0020.0002.01B9] # LATIN SMALL LETTER EZH REVERSED
+01B8 ; [.14CF.0020.0008.01B8] # LATIN CAPITAL LETTER EZH REVERSED
+1D9A ; [.14D3.0020.0002.1D9A] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+01BA ; [.14D4.0020.0002.01BA] # LATIN SMALL LETTER EZH WITH TAIL
+0293 ; [.14D8.0020.0002.0293] # LATIN SMALL LETTER EZH WITH CURL
+021D ; [.14DC.0020.0002.021D] # LATIN SMALL LETTER YOGH
+021C ; [.14DC.0020.0008.021C] # LATIN CAPITAL LETTER YOGH
+00FE ; [.14E0.0020.0002.00FE] # LATIN SMALL LETTER THORN
+00DE ; [.14E0.0020.0008.00DE] # LATIN CAPITAL LETTER THORN
+A765 ; [.14E4.0020.0002.A765] # LATIN SMALL LETTER THORN WITH STROKE
+A764 ; [.14E4.0020.0008.A764] # LATIN CAPITAL LETTER THORN WITH STROKE
+A767 ; [.14E5.0020.0002.A767] # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A766 ; [.14E5.0020.0008.A766] # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+01BF ; [.14E6.0020.0002.01BF] # LATIN LETTER WYNN
+01F7 ; [.14E6.0020.0008.01F7] # LATIN CAPITAL LETTER WYNN
+A769 ; [.14EA.0020.0002.A769] # LATIN SMALL LETTER VEND
+A768 ; [.14EA.0020.0008.A768] # LATIN CAPITAL LETTER VEND
+A76B ; [.14EB.0020.0002.A76B] # LATIN SMALL LETTER ET
+A76A ; [.14EB.0020.0008.A76A] # LATIN CAPITAL LETTER ET
+A76D ; [.14EC.0020.0002.A76D] # LATIN SMALL LETTER IS
+A76C ; [.14EC.0020.0008.A76C] # LATIN CAPITAL LETTER IS
+A76F ; [.14ED.0020.0002.A76F] # LATIN SMALL LETTER CON
+1DD2 ; [.14ED.0020.0004.1DD2] # COMBINING US ABOVE; QQK
+A76E ; [.14ED.0020.0008.A76E] # LATIN CAPITAL LETTER CON
+A770 ; [.14ED.0020.0014.A770] # MODIFIER LETTER US; QQK
+A778 ; [.14EE.0020.0002.A778] # LATIN SMALL LETTER UM
+01BB ; [.14EF.0020.0002.01BB] # LATIN LETTER TWO WITH STROKE
+A72B ; [.14F3.0020.0002.A72B] # LATIN SMALL LETTER TRESILLO
+A72A ; [.14F3.0020.0008.A72A] # LATIN CAPITAL LETTER TRESILLO
+A72D ; [.14F4.0020.0002.A72D] # LATIN SMALL LETTER CUATRILLO
+A72C ; [.14F4.0020.0008.A72C] # LATIN CAPITAL LETTER CUATRILLO
+A72F ; [.14F5.0020.0002.A72F] # LATIN SMALL LETTER CUATRILLO WITH COMMA
+A72E ; [.14F5.0020.0008.A72E] # LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+01A8 ; [.14F6.0020.0002.01A8] # LATIN SMALL LETTER TONE TWO
+01A7 ; [.14F6.0020.0008.01A7] # LATIN CAPITAL LETTER TONE TWO
+01BD ; [.14FA.0020.0002.01BD] # LATIN SMALL LETTER TONE FIVE
+01BC ; [.14FA.0020.0008.01BC] # LATIN CAPITAL LETTER TONE FIVE
+0185 ; [.14FE.0020.0002.0185] # LATIN SMALL LETTER TONE SIX
+0184 ; [.14FE.0020.0008.0184] # LATIN CAPITAL LETTER TONE SIX
+0294 ; [.1502.0020.0002.0294] # LATIN LETTER GLOTTAL STOP
+0242 ; [.1506.0020.0002.0242] # LATIN SMALL LETTER GLOTTAL STOP
+0241 ; [.1506.0020.0008.0241] # LATIN CAPITAL LETTER GLOTTAL STOP
+02C0 ; [.150A.0020.0002.02C0] # MODIFIER LETTER GLOTTAL STOP
+02BC ; [.150B.0020.0002.02BC] # MODIFIER LETTER APOSTROPHE
+0149 ; [.150B.0020.0004.0149][.136D.0020.0004.0149] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE; QQKN
+02EE ; [.150C.0020.0002.02EE] # MODIFIER LETTER DOUBLE APOSTROPHE
+02BE ; [.150D.0020.0002.02BE] # MODIFIER LETTER RIGHT HALF RING
+A723 ; [.150E.0020.0002.A723] # LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A722 ; [.150E.0020.0008.A722] # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A78C ; [.150F.0020.0002.A78C] # LATIN SMALL LETTER SALTILLO
+A78B ; [.150F.0020.0008.A78B] # LATIN CAPITAL LETTER SALTILLO
+0295 ; [.1510.0020.0002.0295] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+02E4 ; [.1510.0020.0014.02E4] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP; QQK
+02BF ; [.1514.0020.0002.02BF] # MODIFIER LETTER LEFT HALF RING
+02C1 ; [.1515.0020.0002.02C1] # MODIFIER LETTER REVERSED GLOTTAL STOP
+1D24 ; [.1516.0020.0002.1D24] # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25 ; [.1517.0020.0002.1D25] # LATIN LETTER AIN
+1D5C ; [.1517.0020.0014.1D5C] # MODIFIER LETTER SMALL AIN; QQK
+A725 ; [.1518.0020.0002.A725] # LATIN SMALL LETTER EGYPTOLOGICAL AIN
+A724 ; [.1518.0020.0008.A724] # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+02A1 ; [.1519.0020.0002.02A1] # LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2 ; [.151D.0020.0002.02A2] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+0296 ; [.1521.0020.0002.0296] # LATIN LETTER INVERTED GLOTTAL STOP
+01C0 ; [.1525.0020.0002.01C0] # LATIN LETTER DENTAL CLICK
+01C1 ; [.1529.0020.0002.01C1] # LATIN LETTER LATERAL CLICK
+01C2 ; [.152D.0020.0002.01C2] # LATIN LETTER ALVEOLAR CLICK
+01C3 ; [.1531.0020.0002.01C3] # LATIN LETTER RETROFLEX CLICK
+0297 ; [.1535.0020.0002.0297] # LATIN LETTER STRETCHED C
+0298 ; [.1539.0020.0002.0298] # LATIN LETTER BILABIAL CLICK
+02AC ; [.153D.0020.0002.02AC] # LATIN LETTER BILABIAL PERCUSSIVE
+02AD ; [.1541.0020.0002.02AD] # LATIN LETTER BIDENTAL PERCUSSIVE
+03B1 ; [.1545.0020.0002.03B1] # GREEK SMALL LETTER ALPHA
+1D6C2 ; [.1545.0020.0005.1D6C2] # MATHEMATICAL BOLD SMALL ALPHA; QQK
+1D6FC ; [.1545.0020.0005.1D6FC] # MATHEMATICAL ITALIC SMALL ALPHA; QQK
+1D736 ; [.1545.0020.0005.1D736] # MATHEMATICAL BOLD ITALIC SMALL ALPHA; QQK
+1D770 ; [.1545.0020.0005.1D770] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA; QQK
+1D7AA ; [.1545.0020.0005.1D7AA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA; QQK
+0391 ; [.1545.0020.0008.0391] # GREEK CAPITAL LETTER ALPHA
+1D6A8 ; [.1545.0020.000B.1D6A8] # MATHEMATICAL BOLD CAPITAL ALPHA; QQK
+1D6E2 ; [.1545.0020.000B.1D6E2] # MATHEMATICAL ITALIC CAPITAL ALPHA; QQK
+1D71C ; [.1545.0020.000B.1D71C] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA; QQK
+1D756 ; [.1545.0020.000B.1D756] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA; QQK
+1D790 ; [.1545.0020.000B.1D790] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA; QQK
+1F00 ; [.1545.0020.0002.03B1][.0000.0022.0002.0313] # GREEK SMALL LETTER ALPHA WITH PSILI; QQCM
+1F08 ; [.1545.0020.0008.0391][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ALPHA WITH PSILI; QQCM
+1F04 ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA; QQCM
+1F0C ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA; QQCM
+1F84 ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1F8C ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F02 ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA; QQCM
+1F0A ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA; QQCM
+1F82 ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1F8A ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F06 ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI; QQCM
+1F0E ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI; QQCM
+1F86 ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F8E ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F80 ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1F88 ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F01 ; [.1545.0020.0002.03B1][.0000.002A.0002.0314] # GREEK SMALL LETTER ALPHA WITH DASIA; QQCM
+1F09 ; [.1545.0020.0008.0391][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ALPHA WITH DASIA; QQCM
+1F05 ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA; QQCM
+1F0D ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA; QQCM
+1F85 ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1F8D ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F03 ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA; QQCM
+1F0B ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA; QQCM
+1F83 ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1F8B ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F07 ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI; QQCM
+1F0F ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI; QQCM
+1F87 ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F8F ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F81 ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1F89 ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03AC ; [.1545.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH TONOS; QQCM
+1F71 ; [.1545.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH OXIA; QQCM
+0386 ; [.1545.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH TONOS; QQCM
+1FBB ; [.1545.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH OXIA; QQCM
+1FB4 ; [.1545.0020.0002.03B1][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F70 ; [.1545.0020.0002.03B1][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH VARIA; QQCM
+1FBA ; [.1545.0020.0008.0391][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH VARIA; QQCM
+1FB2 ; [.1545.0020.0002.03B1][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FB0 ; [.1545.0020.0002.03B1][.0000.0037.0002.0306] # GREEK SMALL LETTER ALPHA WITH VRACHY; QQCM
+1FB8 ; [.1545.0020.0008.0391][.0000.0037.0002.0306] # GREEK CAPITAL LETTER ALPHA WITH VRACHY; QQCM
+1FB6 ; [.1545.0020.0002.03B1][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI; QQCM
+1FB7 ; [.1545.0020.0002.03B1][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FB1 ; [.1545.0020.0002.03B1][.0000.005B.0002.0304] # GREEK SMALL LETTER ALPHA WITH MACRON; QQCM
+1FB9 ; [.1545.0020.0008.0391][.0000.005B.0002.0304] # GREEK CAPITAL LETTER ALPHA WITH MACRON; QQCM
+1FB3 ; [.1545.0020.0002.03B1][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI; QQCM
+1FBC ; [.1545.0020.0008.0391][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI; QQCM
+03B2 ; [.1546.0020.0002.03B2] # GREEK SMALL LETTER BETA
+03D0 ; [.1546.0020.0004.03D0] # GREEK BETA SYMBOL; QQK
+1D6C3 ; [.1546.0020.0005.1D6C3] # MATHEMATICAL BOLD SMALL BETA; QQK
+1D6FD ; [.1546.0020.0005.1D6FD] # MATHEMATICAL ITALIC SMALL BETA; QQK
+1D737 ; [.1546.0020.0005.1D737] # MATHEMATICAL BOLD ITALIC SMALL BETA; QQK
+1D771 ; [.1546.0020.0005.1D771] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA; QQK
+1D7AB ; [.1546.0020.0005.1D7AB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA; QQK
+0392 ; [.1546.0020.0008.0392] # GREEK CAPITAL LETTER BETA
+1D6A9 ; [.1546.0020.000B.1D6A9] # MATHEMATICAL BOLD CAPITAL BETA; QQK
+1D6E3 ; [.1546.0020.000B.1D6E3] # MATHEMATICAL ITALIC CAPITAL BETA; QQK
+1D71D ; [.1546.0020.000B.1D71D] # MATHEMATICAL BOLD ITALIC CAPITAL BETA; QQK
+1D757 ; [.1546.0020.000B.1D757] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA; QQK
+1D791 ; [.1546.0020.000B.1D791] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA; QQK
+1D5D ; [.1546.0020.0014.1D5D] # MODIFIER LETTER SMALL BETA; QQK
+1D66 ; [.1546.0020.0015.1D66] # GREEK SUBSCRIPT SMALL LETTER BETA; QQK
+03B3 ; [.1547.0020.0002.03B3] # GREEK SMALL LETTER GAMMA
+213D ; [.1547.0020.0005.213D] # DOUBLE-STRUCK SMALL GAMMA; QQK
+1D6C4 ; [.1547.0020.0005.1D6C4] # MATHEMATICAL BOLD SMALL GAMMA; QQK
+1D6FE ; [.1547.0020.0005.1D6FE] # MATHEMATICAL ITALIC SMALL GAMMA; QQK
+1D738 ; [.1547.0020.0005.1D738] # MATHEMATICAL BOLD ITALIC SMALL GAMMA; QQK
+1D772 ; [.1547.0020.0005.1D772] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA; QQK
+1D7AC ; [.1547.0020.0005.1D7AC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA; QQK
+0393 ; [.1547.0020.0008.0393] # GREEK CAPITAL LETTER GAMMA
+213E ; [.1547.0020.000B.213E] # DOUBLE-STRUCK CAPITAL GAMMA; QQK
+1D6AA ; [.1547.0020.000B.1D6AA] # MATHEMATICAL BOLD CAPITAL GAMMA; QQK
+1D6E4 ; [.1547.0020.000B.1D6E4] # MATHEMATICAL ITALIC CAPITAL GAMMA; QQK
+1D71E ; [.1547.0020.000B.1D71E] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA; QQK
+1D758 ; [.1547.0020.000B.1D758] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA; QQK
+1D792 ; [.1547.0020.000B.1D792] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA; QQK
+1D5E ; [.1547.0020.0014.1D5E] # MODIFIER LETTER SMALL GREEK GAMMA; QQK
+1D67 ; [.1547.0020.0015.1D67] # GREEK SUBSCRIPT SMALL LETTER GAMMA; QQK
+1D26 ; [.1548.0020.0002.1D26] # GREEK LETTER SMALL CAPITAL GAMMA
+03B4 ; [.1549.0020.0002.03B4] # GREEK SMALL LETTER DELTA
+1D6C5 ; [.1549.0020.0005.1D6C5] # MATHEMATICAL BOLD SMALL DELTA; QQK
+1D6FF ; [.1549.0020.0005.1D6FF] # MATHEMATICAL ITALIC SMALL DELTA; QQK
+1D739 ; [.1549.0020.0005.1D739] # MATHEMATICAL BOLD ITALIC SMALL DELTA; QQK
+1D773 ; [.1549.0020.0005.1D773] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA; QQK
+1D7AD ; [.1549.0020.0005.1D7AD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA; QQK
+0394 ; [.1549.0020.0008.0394] # GREEK CAPITAL LETTER DELTA
+1D6AB ; [.1549.0020.000B.1D6AB] # MATHEMATICAL BOLD CAPITAL DELTA; QQK
+1D6E5 ; [.1549.0020.000B.1D6E5] # MATHEMATICAL ITALIC CAPITAL DELTA; QQK
+1D71F ; [.1549.0020.000B.1D71F] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA; QQK
+1D759 ; [.1549.0020.000B.1D759] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA; QQK
+1D793 ; [.1549.0020.000B.1D793] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA; QQK
+1D5F ; [.1549.0020.0014.1D5F] # MODIFIER LETTER SMALL DELTA; QQK
+03B5 ; [.154A.0020.0002.03B5] # GREEK SMALL LETTER EPSILON
+03F5 ; [.154A.0020.0004.03F5] # GREEK LUNATE EPSILON SYMBOL; QQK
+1D6C6 ; [.154A.0020.0005.1D6C6] # MATHEMATICAL BOLD SMALL EPSILON; QQK
+1D6DC ; [.154A.0020.0005.1D6DC] # MATHEMATICAL BOLD EPSILON SYMBOL; QQK
+1D700 ; [.154A.0020.0005.1D700] # MATHEMATICAL ITALIC SMALL EPSILON; QQK
+1D716 ; [.154A.0020.0005.1D716] # MATHEMATICAL ITALIC EPSILON SYMBOL; QQK
+1D73A ; [.154A.0020.0005.1D73A] # MATHEMATICAL BOLD ITALIC SMALL EPSILON; QQK
+1D750 ; [.154A.0020.0005.1D750] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL; QQK
+1D774 ; [.154A.0020.0005.1D774] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON; QQK
+1D78A ; [.154A.0020.0005.1D78A] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL; QQK
+1D7AE ; [.154A.0020.0005.1D7AE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON; QQK
+1D7C4 ; [.154A.0020.0005.1D7C4] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL; QQK
+0395 ; [.154A.0020.0008.0395] # GREEK CAPITAL LETTER EPSILON
+1D6AC ; [.154A.0020.000B.1D6AC] # MATHEMATICAL BOLD CAPITAL EPSILON; QQK
+1D6E6 ; [.154A.0020.000B.1D6E6] # MATHEMATICAL ITALIC CAPITAL EPSILON; QQK
+1D720 ; [.154A.0020.000B.1D720] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON; QQK
+1D75A ; [.154A.0020.000B.1D75A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON; QQK
+1D794 ; [.154A.0020.000B.1D794] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON; QQK
+1F10 ; [.154A.0020.0002.03B5][.0000.0022.0002.0313] # GREEK SMALL LETTER EPSILON WITH PSILI; QQCM
+1F18 ; [.154A.0020.0008.0395][.0000.0022.0002.0313] # GREEK CAPITAL LETTER EPSILON WITH PSILI; QQCM
+1F14 ; [.154A.0020.0002.03B5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA; QQCM
+1F1C ; [.154A.0020.0008.0395][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA; QQCM
+1F12 ; [.154A.0020.0002.03B5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA; QQCM
+1F1A ; [.154A.0020.0008.0395][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA; QQCM
+1F11 ; [.154A.0020.0002.03B5][.0000.002A.0002.0314] # GREEK SMALL LETTER EPSILON WITH DASIA; QQCM
+1F19 ; [.154A.0020.0008.0395][.0000.002A.0002.0314] # GREEK CAPITAL LETTER EPSILON WITH DASIA; QQCM
+1F15 ; [.154A.0020.0002.03B5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA; QQCM
+1F1D ; [.154A.0020.0008.0395][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA; QQCM
+1F13 ; [.154A.0020.0002.03B5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA; QQCM
+1F1B ; [.154A.0020.0008.0395][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA; QQCM
+03AD ; [.154A.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH TONOS; QQCM
+1F73 ; [.154A.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH OXIA; QQCM
+0388 ; [.154A.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH TONOS; QQCM
+1FC9 ; [.154A.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH OXIA; QQCM
+1F72 ; [.154A.0020.0002.03B5][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH VARIA; QQCM
+1FC8 ; [.154A.0020.0008.0395][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH VARIA; QQCM
+03DD ; [.154B.0020.0002.03DD] # GREEK SMALL LETTER DIGAMMA
+1D7CB ; [.154B.0020.0005.1D7CB] # MATHEMATICAL BOLD SMALL DIGAMMA; QQK
+03DC ; [.154B.0020.0008.03DC] # GREEK LETTER DIGAMMA
+1D7CA ; [.154B.0020.000B.1D7CA] # MATHEMATICAL BOLD CAPITAL DIGAMMA; QQK
+0377 ; [.154C.0020.0002.0377] # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+0376 ; [.154C.0020.0008.0376] # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+03DB ; [.154D.0020.0002.03DB] # GREEK SMALL LETTER STIGMA
+03DA ; [.154D.0020.0008.03DA] # GREEK LETTER STIGMA
+03B6 ; [.154E.0020.0002.03B6] # GREEK SMALL LETTER ZETA
+1D6C7 ; [.154E.0020.0005.1D6C7] # MATHEMATICAL BOLD SMALL ZETA; QQK
+1D701 ; [.154E.0020.0005.1D701] # MATHEMATICAL ITALIC SMALL ZETA; QQK
+1D73B ; [.154E.0020.0005.1D73B] # MATHEMATICAL BOLD ITALIC SMALL ZETA; QQK
+1D775 ; [.154E.0020.0005.1D775] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA; QQK
+1D7AF ; [.154E.0020.0005.1D7AF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA; QQK
+0396 ; [.154E.0020.0008.0396] # GREEK CAPITAL LETTER ZETA
+1D6AD ; [.154E.0020.000B.1D6AD] # MATHEMATICAL BOLD CAPITAL ZETA; QQK
+1D6E7 ; [.154E.0020.000B.1D6E7] # MATHEMATICAL ITALIC CAPITAL ZETA; QQK
+1D721 ; [.154E.0020.000B.1D721] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA; QQK
+1D75B ; [.154E.0020.000B.1D75B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA; QQK
+1D795 ; [.154E.0020.000B.1D795] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA; QQK
+0371 ; [.154F.0020.0002.0371] # GREEK SMALL LETTER HETA
+0370 ; [.154F.0020.0008.0370] # GREEK CAPITAL LETTER HETA
+03B7 ; [.1550.0020.0002.03B7] # GREEK SMALL LETTER ETA
+1D6C8 ; [.1550.0020.0005.1D6C8] # MATHEMATICAL BOLD SMALL ETA; QQK
+1D702 ; [.1550.0020.0005.1D702] # MATHEMATICAL ITALIC SMALL ETA; QQK
+1D73C ; [.1550.0020.0005.1D73C] # MATHEMATICAL BOLD ITALIC SMALL ETA; QQK
+1D776 ; [.1550.0020.0005.1D776] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA; QQK
+1D7B0 ; [.1550.0020.0005.1D7B0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA; QQK
+0397 ; [.1550.0020.0008.0397] # GREEK CAPITAL LETTER ETA
+1D6AE ; [.1550.0020.000B.1D6AE] # MATHEMATICAL BOLD CAPITAL ETA; QQK
+1D6E8 ; [.1550.0020.000B.1D6E8] # MATHEMATICAL ITALIC CAPITAL ETA; QQK
+1D722 ; [.1550.0020.000B.1D722] # MATHEMATICAL BOLD ITALIC CAPITAL ETA; QQK
+1D75C ; [.1550.0020.000B.1D75C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA; QQK
+1D796 ; [.1550.0020.000B.1D796] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA; QQK
+1F20 ; [.1550.0020.0002.03B7][.0000.0022.0002.0313] # GREEK SMALL LETTER ETA WITH PSILI; QQCM
+1F28 ; [.1550.0020.0008.0397][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ETA WITH PSILI; QQCM
+1F24 ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA; QQCM
+1F2C ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA; QQCM
+1F94 ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1F9C ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F22 ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA; QQCM
+1F2A ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA; QQCM
+1F92 ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1F9A ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F26 ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI; QQCM
+1F2E ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI; QQCM
+1F96 ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F9E ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F90 ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1F98 ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F21 ; [.1550.0020.0002.03B7][.0000.002A.0002.0314] # GREEK SMALL LETTER ETA WITH DASIA; QQCM
+1F29 ; [.1550.0020.0008.0397][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ETA WITH DASIA; QQCM
+1F25 ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA; QQCM
+1F2D ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA; QQCM
+1F95 ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1F9D ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F23 ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA; QQCM
+1F2B ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA; QQCM
+1F93 ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1F9B ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F27 ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI; QQCM
+1F2F ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI; QQCM
+1F97 ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F9F ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F91 ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1F99 ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03AE ; [.1550.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH TONOS; QQCM
+1F75 ; [.1550.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH OXIA; QQCM
+0389 ; [.1550.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH TONOS; QQCM
+1FCB ; [.1550.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH OXIA; QQCM
+1FC4 ; [.1550.0020.0002.03B7][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F74 ; [.1550.0020.0002.03B7][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH VARIA; QQCM
+1FCA ; [.1550.0020.0008.0397][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH VARIA; QQCM
+1FC2 ; [.1550.0020.0002.03B7][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FC6 ; [.1550.0020.0002.03B7][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PERISPOMENI; QQCM
+1FC7 ; [.1550.0020.0002.03B7][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FC3 ; [.1550.0020.0002.03B7][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI; QQCM
+1FCC ; [.1550.0020.0008.0397][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI; QQCM
+03B8 ; [.1551.0020.0002.03B8] # GREEK SMALL LETTER THETA
+03D1 ; [.1551.0020.0004.03D1] # GREEK THETA SYMBOL; QQK
+1D6C9 ; [.1551.0020.0005.1D6C9] # MATHEMATICAL BOLD SMALL THETA; QQK
+1D6DD ; [.1551.0020.0005.1D6DD] # MATHEMATICAL BOLD THETA SYMBOL; QQK
+1D703 ; [.1551.0020.0005.1D703] # MATHEMATICAL ITALIC SMALL THETA; QQK
+1D717 ; [.1551.0020.0005.1D717] # MATHEMATICAL ITALIC THETA SYMBOL; QQK
+1D73D ; [.1551.0020.0005.1D73D] # MATHEMATICAL BOLD ITALIC SMALL THETA; QQK
+1D751 ; [.1551.0020.0005.1D751] # MATHEMATICAL BOLD ITALIC THETA SYMBOL; QQK
+1D777 ; [.1551.0020.0005.1D777] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA; QQK
+1D78B ; [.1551.0020.0005.1D78B] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL; QQK
+1D7B1 ; [.1551.0020.0005.1D7B1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA; QQK
+1D7C5 ; [.1551.0020.0005.1D7C5] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL; QQK
+0398 ; [.1551.0020.0008.0398] # GREEK CAPITAL LETTER THETA
+03F4 ; [.1551.0020.000A.03F4] # GREEK CAPITAL THETA SYMBOL; QQK
+1D6AF ; [.1551.0020.000B.1D6AF] # MATHEMATICAL BOLD CAPITAL THETA; QQK
+1D6B9 ; [.1551.0020.000B.1D6B9] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL; QQK
+1D6E9 ; [.1551.0020.000B.1D6E9] # MATHEMATICAL ITALIC CAPITAL THETA; QQK
+1D6F3 ; [.1551.0020.000B.1D6F3] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL; QQK
+1D723 ; [.1551.0020.000B.1D723] # MATHEMATICAL BOLD ITALIC CAPITAL THETA; QQK
+1D72D ; [.1551.0020.000B.1D72D] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL; QQK
+1D75D ; [.1551.0020.000B.1D75D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA; QQK
+1D767 ; [.1551.0020.000B.1D767] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL; QQK
+1D797 ; [.1551.0020.000B.1D797] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA; QQK
+1D7A1 ; [.1551.0020.000B.1D7A1] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL; QQK
+1DBF ; [.1551.0020.0014.1DBF] # MODIFIER LETTER SMALL THETA; QQK
+03B9 ; [.1552.0020.0002.03B9] # GREEK SMALL LETTER IOTA
+1FBE ; [.1552.0020.0002.1FBE] # GREEK PROSGEGRAMMENI; QQC
+037A ; [.1552.0020.0004.037A] # GREEK YPOGEGRAMMENI; QQK
+1D6CA ; [.1552.0020.0005.1D6CA] # MATHEMATICAL BOLD SMALL IOTA; QQK
+1D704 ; [.1552.0020.0005.1D704] # MATHEMATICAL ITALIC SMALL IOTA; QQK
+1D73E ; [.1552.0020.0005.1D73E] # MATHEMATICAL BOLD ITALIC SMALL IOTA; QQK
+1D778 ; [.1552.0020.0005.1D778] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA; QQK
+1D7B2 ; [.1552.0020.0005.1D7B2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA; QQK
+0399 ; [.1552.0020.0008.0399] # GREEK CAPITAL LETTER IOTA
+1D6B0 ; [.1552.0020.000B.1D6B0] # MATHEMATICAL BOLD CAPITAL IOTA; QQK
+1D6EA ; [.1552.0020.000B.1D6EA] # MATHEMATICAL ITALIC CAPITAL IOTA; QQK
+1D724 ; [.1552.0020.000B.1D724] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA; QQK
+1D75E ; [.1552.0020.000B.1D75E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA; QQK
+1D798 ; [.1552.0020.000B.1D798] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA; QQK
+1F30 ; [.1552.0020.0002.03B9][.0000.0022.0002.0313] # GREEK SMALL LETTER IOTA WITH PSILI; QQCM
+1F38 ; [.1552.0020.0008.0399][.0000.0022.0002.0313] # GREEK CAPITAL LETTER IOTA WITH PSILI; QQCM
+1F34 ; [.1552.0020.0002.03B9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA; QQCM
+1F3C ; [.1552.0020.0008.0399][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA; QQCM
+1F32 ; [.1552.0020.0002.03B9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA; QQCM
+1F3A ; [.1552.0020.0008.0399][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA; QQCM
+1F36 ; [.1552.0020.0002.03B9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI; QQCM
+1F3E ; [.1552.0020.0008.0399][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI; QQCM
+1F31 ; [.1552.0020.0002.03B9][.0000.002A.0002.0314] # GREEK SMALL LETTER IOTA WITH DASIA; QQCM
+1F39 ; [.1552.0020.0008.0399][.0000.002A.0002.0314] # GREEK CAPITAL LETTER IOTA WITH DASIA; QQCM
+1F35 ; [.1552.0020.0002.03B9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA; QQCM
+1F3D ; [.1552.0020.0008.0399][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA; QQCM
+1F33 ; [.1552.0020.0002.03B9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA; QQCM
+1F3B ; [.1552.0020.0008.0399][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA; QQCM
+1F37 ; [.1552.0020.0002.03B9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI; QQCM
+1F3F ; [.1552.0020.0008.0399][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI; QQCM
+03AF ; [.1552.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH TONOS; QQCM
+1F77 ; [.1552.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH OXIA; QQCM
+038A ; [.1552.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH TONOS; QQCM
+1FDB ; [.1552.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH OXIA; QQCM
+1F76 ; [.1552.0020.0002.03B9][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH VARIA; QQCM
+1FDA ; [.1552.0020.0008.0399][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH VARIA; QQCM
+1FD0 ; [.1552.0020.0002.03B9][.0000.0037.0002.0306] # GREEK SMALL LETTER IOTA WITH VRACHY; QQCM
+1FD8 ; [.1552.0020.0008.0399][.0000.0037.0002.0306] # GREEK CAPITAL LETTER IOTA WITH VRACHY; QQCM
+1FD6 ; [.1552.0020.0002.03B9][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PERISPOMENI; QQCM
+03CA ; [.1552.0020.0002.03B9][.0000.0047.0002.0308] # GREEK SMALL LETTER IOTA WITH DIALYTIKA; QQCM
+03AA ; [.1552.0020.0008.0399][.0000.0047.0002.0308] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA; QQCM
+0390 ; [.1552.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS; QQCM
+1FD3 ; [.1552.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA; QQCM
+1FD2 ; [.1552.0020.0002.03B9][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA; QQCM
+1FD7 ; [.1552.0020.0002.03B9][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI; QQCM
+1FD1 ; [.1552.0020.0002.03B9][.0000.005B.0002.0304] # GREEK SMALL LETTER IOTA WITH MACRON; QQCM
+1FD9 ; [.1552.0020.0008.0399][.0000.005B.0002.0304] # GREEK CAPITAL LETTER IOTA WITH MACRON; QQCM
+03F3 ; [.1553.0020.0002.03F3] # GREEK LETTER YOT
+03BA ; [.1554.0020.0002.03BA] # GREEK SMALL LETTER KAPPA
+03F0 ; [.1554.0020.0004.03F0] # GREEK KAPPA SYMBOL; QQK
+1D6CB ; [.1554.0020.0005.1D6CB] # MATHEMATICAL BOLD SMALL KAPPA; QQK
+1D6DE ; [.1554.0020.0005.1D6DE] # MATHEMATICAL BOLD KAPPA SYMBOL; QQK
+1D705 ; [.1554.0020.0005.1D705] # MATHEMATICAL ITALIC SMALL KAPPA; QQK
+1D718 ; [.1554.0020.0005.1D718] # MATHEMATICAL ITALIC KAPPA SYMBOL; QQK
+1D73F ; [.1554.0020.0005.1D73F] # MATHEMATICAL BOLD ITALIC SMALL KAPPA; QQK
+1D752 ; [.1554.0020.0005.1D752] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL; QQK
+1D779 ; [.1554.0020.0005.1D779] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA; QQK
+1D78C ; [.1554.0020.0005.1D78C] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL; QQK
+1D7B3 ; [.1554.0020.0005.1D7B3] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA; QQK
+1D7C6 ; [.1554.0020.0005.1D7C6] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL; QQK
+039A ; [.1554.0020.0008.039A] # GREEK CAPITAL LETTER KAPPA
+1D6B1 ; [.1554.0020.000B.1D6B1] # MATHEMATICAL BOLD CAPITAL KAPPA; QQK
+1D6EB ; [.1554.0020.000B.1D6EB] # MATHEMATICAL ITALIC CAPITAL KAPPA; QQK
+1D725 ; [.1554.0020.000B.1D725] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA; QQK
+1D75F ; [.1554.0020.000B.1D75F] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA; QQK
+1D799 ; [.1554.0020.000B.1D799] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA; QQK
+03D7 ; [.1554.0020.0004.03D7][.1545.0020.0004.03D7][.1552.0020.001F.03D7] # GREEK KAI SYMBOL; QQKN
+03CF ; [.1554.0020.000A.03CF][.1545.0020.0004.03CF][.1552.0020.001F.03CF] # GREEK CAPITAL KAI SYMBOL; QQKN
+03BB ; [.1555.0020.0002.03BB] # GREEK SMALL LETTER LAMDA
+1D6CC ; [.1555.0020.0005.1D6CC] # MATHEMATICAL BOLD SMALL LAMDA; QQK
+1D706 ; [.1555.0020.0005.1D706] # MATHEMATICAL ITALIC SMALL LAMDA; QQK
+1D740 ; [.1555.0020.0005.1D740] # MATHEMATICAL BOLD ITALIC SMALL LAMDA; QQK
+1D77A ; [.1555.0020.0005.1D77A] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA; QQK
+1D7B4 ; [.1555.0020.0005.1D7B4] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA; QQK
+039B ; [.1555.0020.0008.039B] # GREEK CAPITAL LETTER LAMDA
+1D6B2 ; [.1555.0020.000B.1D6B2] # MATHEMATICAL BOLD CAPITAL LAMDA; QQK
+1D6EC ; [.1555.0020.000B.1D6EC] # MATHEMATICAL ITALIC CAPITAL LAMDA; QQK
+1D726 ; [.1555.0020.000B.1D726] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA; QQK
+1D760 ; [.1555.0020.000B.1D760] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA; QQK
+1D79A ; [.1555.0020.000B.1D79A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA; QQK
+1D27 ; [.1556.0020.0002.1D27] # GREEK LETTER SMALL CAPITAL LAMDA
+03BC ; [.1557.0020.0002.03BC] # GREEK SMALL LETTER MU
+00B5 ; [.1557.0020.0004.00B5] # MICRO SIGN; QQK
+1D6CD ; [.1557.0020.0005.1D6CD] # MATHEMATICAL BOLD SMALL MU; QQK
+1D707 ; [.1557.0020.0005.1D707] # MATHEMATICAL ITALIC SMALL MU; QQK
+1D741 ; [.1557.0020.0005.1D741] # MATHEMATICAL BOLD ITALIC SMALL MU; QQK
+1D77B ; [.1557.0020.0005.1D77B] # MATHEMATICAL SANS-SERIF BOLD SMALL MU; QQK
+1D7B5 ; [.1557.0020.0005.1D7B5] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU; QQK
+039C ; [.1557.0020.0008.039C] # GREEK CAPITAL LETTER MU
+1D6B3 ; [.1557.0020.000B.1D6B3] # MATHEMATICAL BOLD CAPITAL MU; QQK
+1D6ED ; [.1557.0020.000B.1D6ED] # MATHEMATICAL ITALIC CAPITAL MU; QQK
+1D727 ; [.1557.0020.000B.1D727] # MATHEMATICAL BOLD ITALIC CAPITAL MU; QQK
+1D761 ; [.1557.0020.000B.1D761] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU; QQK
+1D79B ; [.1557.0020.000B.1D79B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU; QQK
+3382 ; [.1557.0020.001C.3382][.120F.0020.001D.3382] # SQUARE MU A; QQKN
+338C ; [.1557.0020.001C.338C][.12A3.0020.001D.338C] # SQUARE MU F; QQKN
+338D ; [.1557.0020.001C.338D][.12B0.0020.001C.338D] # SQUARE MU G; QQKN
+3395 ; [.1557.0020.001C.3395][.1330.0020.001C.3395] # SQUARE MU L; QQKN
+339B ; [.1557.0020.001C.339B][.135F.0020.001C.339B] # SQUARE MU M; QQKN
+33B2 ; [.1557.0020.001C.33B2][.1410.0020.001C.33B2] # SQUARE MU S; QQKN
+33B6 ; [.1557.0020.001C.33B6][.147B.0020.001D.33B6] # SQUARE MU V; QQKN
+33BC ; [.1557.0020.001C.33BC][.148D.0020.001D.33BC] # SQUARE MU W; QQKN
+03BD ; [.1558.0020.0002.03BD] # GREEK SMALL LETTER NU
+1D6CE ; [.1558.0020.0005.1D6CE] # MATHEMATICAL BOLD SMALL NU; QQK
+1D708 ; [.1558.0020.0005.1D708] # MATHEMATICAL ITALIC SMALL NU; QQK
+1D742 ; [.1558.0020.0005.1D742] # MATHEMATICAL BOLD ITALIC SMALL NU; QQK
+1D77C ; [.1558.0020.0005.1D77C] # MATHEMATICAL SANS-SERIF BOLD SMALL NU; QQK
+1D7B6 ; [.1558.0020.0005.1D7B6] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU; QQK
+039D ; [.1558.0020.0008.039D] # GREEK CAPITAL LETTER NU
+1D6B4 ; [.1558.0020.000B.1D6B4] # MATHEMATICAL BOLD CAPITAL NU; QQK
+1D6EE ; [.1558.0020.000B.1D6EE] # MATHEMATICAL ITALIC CAPITAL NU; QQK
+1D728 ; [.1558.0020.000B.1D728] # MATHEMATICAL BOLD ITALIC CAPITAL NU; QQK
+1D762 ; [.1558.0020.000B.1D762] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU; QQK
+1D79C ; [.1558.0020.000B.1D79C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU; QQK
+03BE ; [.1559.0020.0002.03BE] # GREEK SMALL LETTER XI
+1D6CF ; [.1559.0020.0005.1D6CF] # MATHEMATICAL BOLD SMALL XI; QQK
+1D709 ; [.1559.0020.0005.1D709] # MATHEMATICAL ITALIC SMALL XI; QQK
+1D743 ; [.1559.0020.0005.1D743] # MATHEMATICAL BOLD ITALIC SMALL XI; QQK
+1D77D ; [.1559.0020.0005.1D77D] # MATHEMATICAL SANS-SERIF BOLD SMALL XI; QQK
+1D7B7 ; [.1559.0020.0005.1D7B7] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI; QQK
+039E ; [.1559.0020.0008.039E] # GREEK CAPITAL LETTER XI
+1D6B5 ; [.1559.0020.000B.1D6B5] # MATHEMATICAL BOLD CAPITAL XI; QQK
+1D6EF ; [.1559.0020.000B.1D6EF] # MATHEMATICAL ITALIC CAPITAL XI; QQK
+1D729 ; [.1559.0020.000B.1D729] # MATHEMATICAL BOLD ITALIC CAPITAL XI; QQK
+1D763 ; [.1559.0020.000B.1D763] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI; QQK
+1D79D ; [.1559.0020.000B.1D79D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI; QQK
+03BF ; [.155A.0020.0002.03BF] # GREEK SMALL LETTER OMICRON
+1D6D0 ; [.155A.0020.0005.1D6D0] # MATHEMATICAL BOLD SMALL OMICRON; QQK
+1D70A ; [.155A.0020.0005.1D70A] # MATHEMATICAL ITALIC SMALL OMICRON; QQK
+1D744 ; [.155A.0020.0005.1D744] # MATHEMATICAL BOLD ITALIC SMALL OMICRON; QQK
+1D77E ; [.155A.0020.0005.1D77E] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON; QQK
+1D7B8 ; [.155A.0020.0005.1D7B8] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON; QQK
+039F ; [.155A.0020.0008.039F] # GREEK CAPITAL LETTER OMICRON
+1D6B6 ; [.155A.0020.000B.1D6B6] # MATHEMATICAL BOLD CAPITAL OMICRON; QQK
+1D6F0 ; [.155A.0020.000B.1D6F0] # MATHEMATICAL ITALIC CAPITAL OMICRON; QQK
+1D72A ; [.155A.0020.000B.1D72A] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON; QQK
+1D764 ; [.155A.0020.000B.1D764] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON; QQK
+1D79E ; [.155A.0020.000B.1D79E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON; QQK
+1F40 ; [.155A.0020.0002.03BF][.0000.0022.0002.0313] # GREEK SMALL LETTER OMICRON WITH PSILI; QQCM
+1F48 ; [.155A.0020.0008.039F][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMICRON WITH PSILI; QQCM
+1F44 ; [.155A.0020.0002.03BF][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA; QQCM
+1F4C ; [.155A.0020.0008.039F][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA; QQCM
+1F42 ; [.155A.0020.0002.03BF][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA; QQCM
+1F4A ; [.155A.0020.0008.039F][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA; QQCM
+1F41 ; [.155A.0020.0002.03BF][.0000.002A.0002.0314] # GREEK SMALL LETTER OMICRON WITH DASIA; QQCM
+1F49 ; [.155A.0020.0008.039F][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMICRON WITH DASIA; QQCM
+1F45 ; [.155A.0020.0002.03BF][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA; QQCM
+1F4D ; [.155A.0020.0008.039F][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA; QQCM
+1F43 ; [.155A.0020.0002.03BF][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA; QQCM
+1F4B ; [.155A.0020.0008.039F][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA; QQCM
+03CC ; [.155A.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH TONOS; QQCM
+1F79 ; [.155A.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH OXIA; QQCM
+038C ; [.155A.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH TONOS; QQCM
+1FF9 ; [.155A.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH OXIA; QQCM
+1F78 ; [.155A.0020.0002.03BF][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH VARIA; QQCM
+1FF8 ; [.155A.0020.0008.039F][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH VARIA; QQCM
+03C0 ; [.155B.0020.0002.03C0] # GREEK SMALL LETTER PI
+03D6 ; [.155B.0020.0004.03D6] # GREEK PI SYMBOL; QQK
+213C ; [.155B.0020.0005.213C] # DOUBLE-STRUCK SMALL PI; QQK
+1D6D1 ; [.155B.0020.0005.1D6D1] # MATHEMATICAL BOLD SMALL PI; QQK
+1D6E1 ; [.155B.0020.0005.1D6E1] # MATHEMATICAL BOLD PI SYMBOL; QQK
+1D70B ; [.155B.0020.0005.1D70B] # MATHEMATICAL ITALIC SMALL PI; QQK
+1D71B ; [.155B.0020.0005.1D71B] # MATHEMATICAL ITALIC PI SYMBOL; QQK
+1D745 ; [.155B.0020.0005.1D745] # MATHEMATICAL BOLD ITALIC SMALL PI; QQK
+1D755 ; [.155B.0020.0005.1D755] # MATHEMATICAL BOLD ITALIC PI SYMBOL; QQK
+1D77F ; [.155B.0020.0005.1D77F] # MATHEMATICAL SANS-SERIF BOLD SMALL PI; QQK
+1D78F ; [.155B.0020.0005.1D78F] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL; QQK
+1D7B9 ; [.155B.0020.0005.1D7B9] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI; QQK
+1D7C9 ; [.155B.0020.0005.1D7C9] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL; QQK
+03A0 ; [.155B.0020.0008.03A0] # GREEK CAPITAL LETTER PI
+213F ; [.155B.0020.000B.213F] # DOUBLE-STRUCK CAPITAL PI; QQK
+1D6B7 ; [.155B.0020.000B.1D6B7] # MATHEMATICAL BOLD CAPITAL PI; QQK
+1D6F1 ; [.155B.0020.000B.1D6F1] # MATHEMATICAL ITALIC CAPITAL PI; QQK
+1D72B ; [.155B.0020.000B.1D72B] # MATHEMATICAL BOLD ITALIC CAPITAL PI; QQK
+1D765 ; [.155B.0020.000B.1D765] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI; QQK
+1D79F ; [.155B.0020.000B.1D79F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI; QQK
+1D28 ; [.155C.0020.0002.1D28] # GREEK LETTER SMALL CAPITAL PI
+03FB ; [.155D.0020.0002.03FB] # GREEK SMALL LETTER SAN
+03FA ; [.155D.0020.0008.03FA] # GREEK CAPITAL LETTER SAN
+03DF ; [.155E.0020.0002.03DF] # GREEK SMALL LETTER KOPPA
+03DE ; [.155E.0020.0008.03DE] # GREEK LETTER KOPPA
+03D9 ; [.155F.0020.0002.03D9] # GREEK SMALL LETTER ARCHAIC KOPPA
+03D8 ; [.155F.0020.0008.03D8] # GREEK LETTER ARCHAIC KOPPA
+03C1 ; [.1560.0020.0002.03C1] # GREEK SMALL LETTER RHO
+03F1 ; [.1560.0020.0004.03F1] # GREEK RHO SYMBOL; QQK
+1D6D2 ; [.1560.0020.0005.1D6D2] # MATHEMATICAL BOLD SMALL RHO; QQK
+1D6E0 ; [.1560.0020.0005.1D6E0] # MATHEMATICAL BOLD RHO SYMBOL; QQK
+1D70C ; [.1560.0020.0005.1D70C] # MATHEMATICAL ITALIC SMALL RHO; QQK
+1D71A ; [.1560.0020.0005.1D71A] # MATHEMATICAL ITALIC RHO SYMBOL; QQK
+1D746 ; [.1560.0020.0005.1D746] # MATHEMATICAL BOLD ITALIC SMALL RHO; QQK
+1D754 ; [.1560.0020.0005.1D754] # MATHEMATICAL BOLD ITALIC RHO SYMBOL; QQK
+1D780 ; [.1560.0020.0005.1D780] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO; QQK
+1D78E ; [.1560.0020.0005.1D78E] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL; QQK
+1D7BA ; [.1560.0020.0005.1D7BA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO; QQK
+1D7C8 ; [.1560.0020.0005.1D7C8] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL; QQK
+03A1 ; [.1560.0020.0008.03A1] # GREEK CAPITAL LETTER RHO
+1D6B8 ; [.1560.0020.000B.1D6B8] # MATHEMATICAL BOLD CAPITAL RHO; QQK
+1D6F2 ; [.1560.0020.000B.1D6F2] # MATHEMATICAL ITALIC CAPITAL RHO; QQK
+1D72C ; [.1560.0020.000B.1D72C] # MATHEMATICAL BOLD ITALIC CAPITAL RHO; QQK
+1D766 ; [.1560.0020.000B.1D766] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO; QQK
+1D7A0 ; [.1560.0020.000B.1D7A0] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO; QQK
+1D68 ; [.1560.0020.0015.1D68] # GREEK SUBSCRIPT SMALL LETTER RHO; QQK
+1FE4 ; [.1560.0020.0002.03C1][.0000.0022.0002.0313] # GREEK SMALL LETTER RHO WITH PSILI; QQCM
+1FE5 ; [.1560.0020.0002.03C1][.0000.002A.0002.0314] # GREEK SMALL LETTER RHO WITH DASIA; QQCM
+1FEC ; [.1560.0020.0008.03A1][.0000.002A.0002.0314] # GREEK CAPITAL LETTER RHO WITH DASIA; QQCM
+1D29 ; [.1561.0020.0002.1D29] # GREEK LETTER SMALL CAPITAL RHO
+03FC ; [.1562.0020.0002.03FC] # GREEK RHO WITH STROKE SYMBOL
+03C3 ; [.1563.0020.0002.03C3] # GREEK SMALL LETTER SIGMA
+03F2 ; [.1563.0020.0004.03F2] # GREEK LUNATE SIGMA SYMBOL; QQK
+1D6D3 ; [.1563.0020.0005.1D6D3] # MATHEMATICAL BOLD SMALL FINAL SIGMA; QQK
+1D6D4 ; [.1563.0020.0005.1D6D4] # MATHEMATICAL BOLD SMALL SIGMA; QQK
+1D70D ; [.1563.0020.0005.1D70D] # MATHEMATICAL ITALIC SMALL FINAL SIGMA; QQK
+1D70E ; [.1563.0020.0005.1D70E] # MATHEMATICAL ITALIC SMALL SIGMA; QQK
+1D747 ; [.1563.0020.0005.1D747] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA; QQK
+1D748 ; [.1563.0020.0005.1D748] # MATHEMATICAL BOLD ITALIC SMALL SIGMA; QQK
+1D781 ; [.1563.0020.0005.1D781] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA; QQK
+1D782 ; [.1563.0020.0005.1D782] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA; QQK
+1D7BB ; [.1563.0020.0005.1D7BB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA; QQK
+1D7BC ; [.1563.0020.0005.1D7BC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA; QQK
+03A3 ; [.1563.0020.0008.03A3] # GREEK CAPITAL LETTER SIGMA
+03F9 ; [.1563.0020.000A.03F9] # GREEK CAPITAL LUNATE SIGMA SYMBOL; QQK
+1D6BA ; [.1563.0020.000B.1D6BA] # MATHEMATICAL BOLD CAPITAL SIGMA; QQK
+1D6F4 ; [.1563.0020.000B.1D6F4] # MATHEMATICAL ITALIC CAPITAL SIGMA; QQK
+1D72E ; [.1563.0020.000B.1D72E] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA; QQK
+1D768 ; [.1563.0020.000B.1D768] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA; QQK
+1D7A2 ; [.1563.0020.000B.1D7A2] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA; QQK
+03C2 ; [.1563.0020.0019.03C2] # GREEK SMALL LETTER FINAL SIGMA; QQK
+037C ; [.1564.0020.0002.037C] # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+03FE ; [.1564.0020.0008.03FE] # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+037B ; [.1565.0020.0002.037B] # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+03FD ; [.1565.0020.0008.03FD] # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+037D ; [.1566.0020.0002.037D] # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+03FF ; [.1566.0020.0008.03FF] # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+03C4 ; [.1567.0020.0002.03C4] # GREEK SMALL LETTER TAU
+1D6D5 ; [.1567.0020.0005.1D6D5] # MATHEMATICAL BOLD SMALL TAU; QQK
+1D70F ; [.1567.0020.0005.1D70F] # MATHEMATICAL ITALIC SMALL TAU; QQK
+1D749 ; [.1567.0020.0005.1D749] # MATHEMATICAL BOLD ITALIC SMALL TAU; QQK
+1D783 ; [.1567.0020.0005.1D783] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU; QQK
+1D7BD ; [.1567.0020.0005.1D7BD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU; QQK
+03A4 ; [.1567.0020.0008.03A4] # GREEK CAPITAL LETTER TAU
+1D6BB ; [.1567.0020.000B.1D6BB] # MATHEMATICAL BOLD CAPITAL TAU; QQK
+1D6F5 ; [.1567.0020.000B.1D6F5] # MATHEMATICAL ITALIC CAPITAL TAU; QQK
+1D72F ; [.1567.0020.000B.1D72F] # MATHEMATICAL BOLD ITALIC CAPITAL TAU; QQK
+1D769 ; [.1567.0020.000B.1D769] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU; QQK
+1D7A3 ; [.1567.0020.000B.1D7A3] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU; QQK
+03C5 ; [.1568.0020.0002.03C5] # GREEK SMALL LETTER UPSILON
+1D6D6 ; [.1568.0020.0005.1D6D6] # MATHEMATICAL BOLD SMALL UPSILON; QQK
+1D710 ; [.1568.0020.0005.1D710] # MATHEMATICAL ITALIC SMALL UPSILON; QQK
+1D74A ; [.1568.0020.0005.1D74A] # MATHEMATICAL BOLD ITALIC SMALL UPSILON; QQK
+1D784 ; [.1568.0020.0005.1D784] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON; QQK
+1D7BE ; [.1568.0020.0005.1D7BE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON; QQK
+03A5 ; [.1568.0020.0008.03A5] # GREEK CAPITAL LETTER UPSILON
+03D2 ; [.1568.0020.000A.03D2] # GREEK UPSILON WITH HOOK SYMBOL; QQK
+1D6BC ; [.1568.0020.000B.1D6BC] # MATHEMATICAL BOLD CAPITAL UPSILON; QQK
+1D6F6 ; [.1568.0020.000B.1D6F6] # MATHEMATICAL ITALIC CAPITAL UPSILON; QQK
+1D730 ; [.1568.0020.000B.1D730] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON; QQK
+1D76A ; [.1568.0020.000B.1D76A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON; QQK
+1D7A4 ; [.1568.0020.000B.1D7A4] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON; QQK
+1F50 ; [.1568.0020.0002.03C5][.0000.0022.0002.0313] # GREEK SMALL LETTER UPSILON WITH PSILI; QQCM
+1F54 ; [.1568.0020.0002.03C5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA; QQCM
+1F52 ; [.1568.0020.0002.03C5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA; QQCM
+1F56 ; [.1568.0020.0002.03C5][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI; QQCM
+1F51 ; [.1568.0020.0002.03C5][.0000.002A.0002.0314] # GREEK SMALL LETTER UPSILON WITH DASIA; QQCM
+1F59 ; [.1568.0020.0008.03A5][.0000.002A.0002.0314] # GREEK CAPITAL LETTER UPSILON WITH DASIA; QQCM
+1F55 ; [.1568.0020.0002.03C5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA; QQCM
+1F5D ; [.1568.0020.0008.03A5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA; QQCM
+1F53 ; [.1568.0020.0002.03C5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA; QQCM
+1F5B ; [.1568.0020.0008.03A5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA; QQCM
+1F57 ; [.1568.0020.0002.03C5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI; QQCM
+1F5F ; [.1568.0020.0008.03A5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI; QQCM
+03CD ; [.1568.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH TONOS; QQCM
+1F7B ; [.1568.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH OXIA; QQCM
+038E ; [.1568.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH TONOS; QQCM
+1FEB ; [.1568.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH OXIA; QQCM
+03D3 ; [.1568.0020.000A.03D3][.0000.0032.0002.03D3] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL; QQKN
+1F7A ; [.1568.0020.0002.03C5][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH VARIA; QQCM
+1FEA ; [.1568.0020.0008.03A5][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH VARIA; QQCM
+1FE0 ; [.1568.0020.0002.03C5][.0000.0037.0002.0306] # GREEK SMALL LETTER UPSILON WITH VRACHY; QQCM
+1FE8 ; [.1568.0020.0008.03A5][.0000.0037.0002.0306] # GREEK CAPITAL LETTER UPSILON WITH VRACHY; QQCM
+1FE6 ; [.1568.0020.0002.03C5][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI; QQCM
+03CB ; [.1568.0020.0002.03C5][.0000.0047.0002.0308] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA; QQCM
+03AB ; [.1568.0020.0008.03A5][.0000.0047.0002.0308] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA; QQCM
+03D4 ; [.1568.0020.000A.03D4][.0000.0047.0002.03D4] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL; QQKN
+03B0 ; [.1568.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS; QQCM
+1FE3 ; [.1568.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA; QQCM
+1FE2 ; [.1568.0020.0002.03C5][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA; QQCM
+1FE7 ; [.1568.0020.0002.03C5][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI; QQCM
+1FE1 ; [.1568.0020.0002.03C5][.0000.005B.0002.0304] # GREEK SMALL LETTER UPSILON WITH MACRON; QQCM
+1FE9 ; [.1568.0020.0008.03A5][.0000.005B.0002.0304] # GREEK CAPITAL LETTER UPSILON WITH MACRON; QQCM
+03C6 ; [.1569.0020.0002.03C6] # GREEK SMALL LETTER PHI
+03D5 ; [.1569.0020.0004.03D5] # GREEK PHI SYMBOL; QQK
+1D6D7 ; [.1569.0020.0005.1D6D7] # MATHEMATICAL BOLD SMALL PHI; QQK
+1D6DF ; [.1569.0020.0005.1D6DF] # MATHEMATICAL BOLD PHI SYMBOL; QQK
+1D711 ; [.1569.0020.0005.1D711] # MATHEMATICAL ITALIC SMALL PHI; QQK
+1D719 ; [.1569.0020.0005.1D719] # MATHEMATICAL ITALIC PHI SYMBOL; QQK
+1D74B ; [.1569.0020.0005.1D74B] # MATHEMATICAL BOLD ITALIC SMALL PHI; QQK
+1D753 ; [.1569.0020.0005.1D753] # MATHEMATICAL BOLD ITALIC PHI SYMBOL; QQK
+1D785 ; [.1569.0020.0005.1D785] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI; QQK
+1D78D ; [.1569.0020.0005.1D78D] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL; QQK
+1D7BF ; [.1569.0020.0005.1D7BF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI; QQK
+1D7C7 ; [.1569.0020.0005.1D7C7] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL; QQK
+03A6 ; [.1569.0020.0008.03A6] # GREEK CAPITAL LETTER PHI
+1D6BD ; [.1569.0020.000B.1D6BD] # MATHEMATICAL BOLD CAPITAL PHI; QQK
+1D6F7 ; [.1569.0020.000B.1D6F7] # MATHEMATICAL ITALIC CAPITAL PHI; QQK
+1D731 ; [.1569.0020.000B.1D731] # MATHEMATICAL BOLD ITALIC CAPITAL PHI; QQK
+1D76B ; [.1569.0020.000B.1D76B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI; QQK
+1D7A5 ; [.1569.0020.000B.1D7A5] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI; QQK
+1D60 ; [.1569.0020.0014.1D60] # MODIFIER LETTER SMALL GREEK PHI; QQK
+1D69 ; [.1569.0020.0015.1D69] # GREEK SUBSCRIPT SMALL LETTER PHI; QQK
+03C7 ; [.156A.0020.0002.03C7] # GREEK SMALL LETTER CHI
+1D6D8 ; [.156A.0020.0005.1D6D8] # MATHEMATICAL BOLD SMALL CHI; QQK
+1D712 ; [.156A.0020.0005.1D712] # MATHEMATICAL ITALIC SMALL CHI; QQK
+1D74C ; [.156A.0020.0005.1D74C] # MATHEMATICAL BOLD ITALIC SMALL CHI; QQK
+1D786 ; [.156A.0020.0005.1D786] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI; QQK
+1D7C0 ; [.156A.0020.0005.1D7C0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI; QQK
+03A7 ; [.156A.0020.0008.03A7] # GREEK CAPITAL LETTER CHI
+1D6BE ; [.156A.0020.000B.1D6BE] # MATHEMATICAL BOLD CAPITAL CHI; QQK
+1D6F8 ; [.156A.0020.000B.1D6F8] # MATHEMATICAL ITALIC CAPITAL CHI; QQK
+1D732 ; [.156A.0020.000B.1D732] # MATHEMATICAL BOLD ITALIC CAPITAL CHI; QQK
+1D76C ; [.156A.0020.000B.1D76C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI; QQK
+1D7A6 ; [.156A.0020.000B.1D7A6] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI; QQK
+1D61 ; [.156A.0020.0014.1D61] # MODIFIER LETTER SMALL CHI; QQK
+1D6A ; [.156A.0020.0015.1D6A] # GREEK SUBSCRIPT SMALL LETTER CHI; QQK
+03C8 ; [.156B.0020.0002.03C8] # GREEK SMALL LETTER PSI
+1D6D9 ; [.156B.0020.0005.1D6D9] # MATHEMATICAL BOLD SMALL PSI; QQK
+1D713 ; [.156B.0020.0005.1D713] # MATHEMATICAL ITALIC SMALL PSI; QQK
+1D74D ; [.156B.0020.0005.1D74D] # MATHEMATICAL BOLD ITALIC SMALL PSI; QQK
+1D787 ; [.156B.0020.0005.1D787] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI; QQK
+1D7C1 ; [.156B.0020.0005.1D7C1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI; QQK
+03A8 ; [.156B.0020.0008.03A8] # GREEK CAPITAL LETTER PSI
+1D6BF ; [.156B.0020.000B.1D6BF] # MATHEMATICAL BOLD CAPITAL PSI; QQK
+1D6F9 ; [.156B.0020.000B.1D6F9] # MATHEMATICAL ITALIC CAPITAL PSI; QQK
+1D733 ; [.156B.0020.000B.1D733] # MATHEMATICAL BOLD ITALIC CAPITAL PSI; QQK
+1D76D ; [.156B.0020.000B.1D76D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI; QQK
+1D7A7 ; [.156B.0020.000B.1D7A7] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI; QQK
+1D2A ; [.156C.0020.0002.1D2A] # GREEK LETTER SMALL CAPITAL PSI
+03C9 ; [.156D.0020.0002.03C9] # GREEK SMALL LETTER OMEGA
+1D6DA ; [.156D.0020.0005.1D6DA] # MATHEMATICAL BOLD SMALL OMEGA; QQK
+1D714 ; [.156D.0020.0005.1D714] # MATHEMATICAL ITALIC SMALL OMEGA; QQK
+1D74E ; [.156D.0020.0005.1D74E] # MATHEMATICAL BOLD ITALIC SMALL OMEGA; QQK
+1D788 ; [.156D.0020.0005.1D788] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA; QQK
+1D7C2 ; [.156D.0020.0005.1D7C2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA; QQK
+03A9 ; [.156D.0020.0008.03A9] # GREEK CAPITAL LETTER OMEGA
+2126 ; [.156D.0020.0008.2126] # OHM SIGN; QQC
+1D6C0 ; [.156D.0020.000B.1D6C0] # MATHEMATICAL BOLD CAPITAL OMEGA; QQK
+1D6FA ; [.156D.0020.000B.1D6FA] # MATHEMATICAL ITALIC CAPITAL OMEGA; QQK
+1D734 ; [.156D.0020.000B.1D734] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA; QQK
+1D76E ; [.156D.0020.000B.1D76E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA; QQK
+1D7A8 ; [.156D.0020.000B.1D7A8] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA; QQK
+1F60 ; [.156D.0020.0002.03C9][.0000.0022.0002.0313] # GREEK SMALL LETTER OMEGA WITH PSILI; QQCM
+1F68 ; [.156D.0020.0008.03A9][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMEGA WITH PSILI; QQCM
+1F64 ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA; QQCM
+1F6C ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA; QQCM
+1FA4 ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1FAC ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F62 ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA; QQCM
+1F6A ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA; QQCM
+1FA2 ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1FAA ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F66 ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI; QQCM
+1F6E ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI; QQCM
+1FA6 ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FAE ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1FA0 ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1FA8 ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F61 ; [.156D.0020.0002.03C9][.0000.002A.0002.0314] # GREEK SMALL LETTER OMEGA WITH DASIA; QQCM
+1F69 ; [.156D.0020.0008.03A9][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMEGA WITH DASIA; QQCM
+1F65 ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA; QQCM
+1F6D ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA; QQCM
+1FA5 ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1FAD ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F63 ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA; QQCM
+1F6B ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA; QQCM
+1FA3 ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1FAB ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F67 ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI; QQCM
+1F6F ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI; QQCM
+1FA7 ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FAF ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1FA1 ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1FA9 ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03CE ; [.156D.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH TONOS; QQCM
+1F7D ; [.156D.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH OXIA; QQCM
+038F ; [.156D.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH TONOS; QQCM
+1FFB ; [.156D.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH OXIA; QQCM
+1FF4 ; [.156D.0020.0002.03C9][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F7C ; [.156D.0020.0002.03C9][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH VARIA; QQCM
+1FFA ; [.156D.0020.0008.03A9][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH VARIA; QQCM
+1FF2 ; [.156D.0020.0002.03C9][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FF6 ; [.156D.0020.0002.03C9][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI; QQCM
+1FF7 ; [.156D.0020.0002.03C9][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FF3 ; [.156D.0020.0002.03C9][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI; QQCM
+1FFC ; [.156D.0020.0008.03A9][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI; QQCM
+03E1 ; [.156E.0020.0002.03E1] # GREEK SMALL LETTER SAMPI
+03E0 ; [.156E.0020.0008.03E0] # GREEK LETTER SAMPI
+0373 ; [.156F.0020.0002.0373] # GREEK SMALL LETTER ARCHAIC SAMPI
+0372 ; [.156F.0020.0008.0372] # GREEK CAPITAL LETTER ARCHAIC SAMPI
+03F8 ; [.1570.0020.0002.03F8] # GREEK SMALL LETTER SHO
+03F7 ; [.1570.0020.0008.03F7] # GREEK CAPITAL LETTER SHO
+2C81 ; [.1571.0020.0002.2C81] # COPTIC SMALL LETTER ALFA
+2C80 ; [.1571.0020.0008.2C80] # COPTIC CAPITAL LETTER ALFA
+2C83 ; [.1572.0020.0002.2C83] # COPTIC SMALL LETTER VIDA
+2C82 ; [.1572.0020.0008.2C82] # COPTIC CAPITAL LETTER VIDA
+2C85 ; [.1573.0020.0002.2C85] # COPTIC SMALL LETTER GAMMA
+2C84 ; [.1573.0020.0008.2C84] # COPTIC CAPITAL LETTER GAMMA
+2C87 ; [.1574.0020.0002.2C87] # COPTIC SMALL LETTER DALDA
+2C86 ; [.1574.0020.0008.2C86] # COPTIC CAPITAL LETTER DALDA
+2C89 ; [.1575.0020.0002.2C89] # COPTIC SMALL LETTER EIE
+2C88 ; [.1575.0020.0008.2C88] # COPTIC CAPITAL LETTER EIE
+2CB7 ; [.1576.0020.0002.2CB7] # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB6 ; [.1576.0020.0008.2CB6] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2C8B ; [.1577.0020.0002.2C8B] # COPTIC SMALL LETTER SOU
+2C8A ; [.1577.0020.0008.2C8A] # COPTIC CAPITAL LETTER SOU
+2C8D ; [.1578.0020.0002.2C8D] # COPTIC SMALL LETTER ZATA
+2C8C ; [.1578.0020.0008.2C8C] # COPTIC CAPITAL LETTER ZATA
+2C8F ; [.1579.0020.0002.2C8F] # COPTIC SMALL LETTER HATE
+2C8E ; [.1579.0020.0008.2C8E] # COPTIC CAPITAL LETTER HATE
+2C91 ; [.157A.0020.0002.2C91] # COPTIC SMALL LETTER THETHE
+2C90 ; [.157A.0020.0008.2C90] # COPTIC CAPITAL LETTER THETHE
+2C93 ; [.157B.0020.0002.2C93] # COPTIC SMALL LETTER IAUDA
+2C92 ; [.157B.0020.0008.2C92] # COPTIC CAPITAL LETTER IAUDA
+2C95 ; [.157C.0020.0002.2C95] # COPTIC SMALL LETTER KAPA
+2C94 ; [.157C.0020.0008.2C94] # COPTIC CAPITAL LETTER KAPA
+2CE4 ; [.157C.0020.0004.2CE4][.1571.0020.0004.2CE4][.157B.0020.001F.2CE4] # COPTIC SYMBOL KAI; QQKN
+2CB9 ; [.157D.0020.0002.2CB9] # COPTIC SMALL LETTER DIALECT-P KAPA
+2CB8 ; [.157D.0020.0008.2CB8] # COPTIC CAPITAL LETTER DIALECT-P KAPA
+2C97 ; [.157E.0020.0002.2C97] # COPTIC SMALL LETTER LAULA
+2C96 ; [.157E.0020.0008.2C96] # COPTIC CAPITAL LETTER LAULA
+2C99 ; [.157F.0020.0002.2C99] # COPTIC SMALL LETTER MI
+2C98 ; [.157F.0020.0008.2C98] # COPTIC CAPITAL LETTER MI
+2C9B ; [.1580.0020.0002.2C9B] # COPTIC SMALL LETTER NI
+2C9A ; [.1580.0020.0008.2C9A] # COPTIC CAPITAL LETTER NI
+2CBB ; [.1581.0020.0002.2CBB] # COPTIC SMALL LETTER DIALECT-P NI
+2CBA ; [.1581.0020.0008.2CBA] # COPTIC CAPITAL LETTER DIALECT-P NI
+2CBD ; [.1582.0020.0002.2CBD] # COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBC ; [.1582.0020.0008.2CBC] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2C9D ; [.1583.0020.0002.2C9D] # COPTIC SMALL LETTER KSI
+2C9C ; [.1583.0020.0008.2C9C] # COPTIC CAPITAL LETTER KSI
+2C9F ; [.1584.0020.0002.2C9F] # COPTIC SMALL LETTER O
+2C9E ; [.1584.0020.0008.2C9E] # COPTIC CAPITAL LETTER O
+2CA1 ; [.1585.0020.0002.2CA1] # COPTIC SMALL LETTER PI
+2CA0 ; [.1585.0020.0008.2CA0] # COPTIC CAPITAL LETTER PI
+2CA3 ; [.1586.0020.0002.2CA3] # COPTIC SMALL LETTER RO
+2CA2 ; [.1586.0020.0008.2CA2] # COPTIC CAPITAL LETTER RO
+2CA5 ; [.1587.0020.0002.2CA5] # COPTIC SMALL LETTER SIMA
+2CA4 ; [.1587.0020.0008.2CA4] # COPTIC CAPITAL LETTER SIMA
+2CA7 ; [.1588.0020.0002.2CA7] # COPTIC SMALL LETTER TAU
+2CA6 ; [.1588.0020.0008.2CA6] # COPTIC CAPITAL LETTER TAU
+2CA9 ; [.1589.0020.0002.2CA9] # COPTIC SMALL LETTER UA
+2CA8 ; [.1589.0020.0008.2CA8] # COPTIC CAPITAL LETTER UA
+2CAB ; [.158A.0020.0002.2CAB] # COPTIC SMALL LETTER FI
+2CAA ; [.158A.0020.0008.2CAA] # COPTIC CAPITAL LETTER FI
+2CAD ; [.158B.0020.0002.2CAD] # COPTIC SMALL LETTER KHI
+2CAC ; [.158B.0020.0008.2CAC] # COPTIC CAPITAL LETTER KHI
+2CAF ; [.158C.0020.0002.2CAF] # COPTIC SMALL LETTER PSI
+2CAE ; [.158C.0020.0008.2CAE] # COPTIC CAPITAL LETTER PSI
+2CB1 ; [.158D.0020.0002.2CB1] # COPTIC SMALL LETTER OOU
+2CB0 ; [.158D.0020.0008.2CB0] # COPTIC CAPITAL LETTER OOU
+2CBF ; [.158E.0020.0002.2CBF] # COPTIC SMALL LETTER OLD COPTIC OOU
+2CBE ; [.158E.0020.0008.2CBE] # COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CC1 ; [.158F.0020.0002.2CC1] # COPTIC SMALL LETTER SAMPI
+2CC0 ; [.158F.0020.0008.2CC0] # COPTIC CAPITAL LETTER SAMPI
+03E3 ; [.1590.0020.0002.03E3] # COPTIC SMALL LETTER SHEI
+03E2 ; [.1590.0020.0008.03E2] # COPTIC CAPITAL LETTER SHEI
+2CEC ; [.1591.0020.0002.2CEC] # COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI
+2CEB ; [.1591.0020.0008.2CEB] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+2CC3 ; [.1592.0020.0002.2CC3] # COPTIC SMALL LETTER CROSSED SHEI
+2CC2 ; [.1592.0020.0008.2CC2] # COPTIC CAPITAL LETTER CROSSED SHEI
+2CC5 ; [.1593.0020.0002.2CC5] # COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC4 ; [.1593.0020.0008.2CC4] # COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC7 ; [.1594.0020.0002.2CC7] # COPTIC SMALL LETTER OLD COPTIC ESH
+2CC6 ; [.1594.0020.0008.2CC6] # COPTIC CAPITAL LETTER OLD COPTIC ESH
+03E5 ; [.1595.0020.0002.03E5] # COPTIC SMALL LETTER FEI
+03E4 ; [.1595.0020.0008.03E4] # COPTIC CAPITAL LETTER FEI
+03E7 ; [.1596.0020.0002.03E7] # COPTIC SMALL LETTER KHEI
+03E6 ; [.1596.0020.0008.03E6] # COPTIC CAPITAL LETTER KHEI
+2CC9 ; [.1597.0020.0002.2CC9] # COPTIC SMALL LETTER AKHMIMIC KHEI
+2CC8 ; [.1597.0020.0008.2CC8] # COPTIC CAPITAL LETTER AKHMIMIC KHEI
+03E9 ; [.1598.0020.0002.03E9] # COPTIC SMALL LETTER HORI
+03E8 ; [.1598.0020.0008.03E8] # COPTIC CAPITAL LETTER HORI
+2CCB ; [.1599.0020.0002.2CCB] # COPTIC SMALL LETTER DIALECT-P HORI
+2CCA ; [.1599.0020.0008.2CCA] # COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCD ; [.159A.0020.0002.2CCD] # COPTIC SMALL LETTER OLD COPTIC HORI
+2CCC ; [.159A.0020.0008.2CCC] # COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCF ; [.159B.0020.0002.2CCF] # COPTIC SMALL LETTER OLD COPTIC HA
+2CCE ; [.159B.0020.0008.2CCE] # COPTIC CAPITAL LETTER OLD COPTIC HA
+2CD1 ; [.159C.0020.0002.2CD1] # COPTIC SMALL LETTER L-SHAPED HA
+2CD0 ; [.159C.0020.0008.2CD0] # COPTIC CAPITAL LETTER L-SHAPED HA
+2CD3 ; [.159D.0020.0002.2CD3] # COPTIC SMALL LETTER OLD COPTIC HEI
+2CD2 ; [.159D.0020.0008.2CD2] # COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD5 ; [.159E.0020.0002.2CD5] # COPTIC SMALL LETTER OLD COPTIC HAT
+2CD4 ; [.159E.0020.0008.2CD4] # COPTIC CAPITAL LETTER OLD COPTIC HAT
+03EB ; [.159F.0020.0002.03EB] # COPTIC SMALL LETTER GANGIA
+03EA ; [.159F.0020.0008.03EA] # COPTIC CAPITAL LETTER GANGIA
+2CEE ; [.15A0.0020.0002.2CEE] # COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2CED ; [.15A0.0020.0008.2CED] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+2CD7 ; [.15A1.0020.0002.2CD7] # COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD6 ; [.15A1.0020.0008.2CD6] # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+03ED ; [.15A2.0020.0002.03ED] # COPTIC SMALL LETTER SHIMA
+03EC ; [.15A2.0020.0008.03EC] # COPTIC CAPITAL LETTER SHIMA
+2CD9 ; [.15A3.0020.0002.2CD9] # COPTIC SMALL LETTER OLD COPTIC DJA
+2CD8 ; [.15A3.0020.0008.2CD8] # COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CDB ; [.15A4.0020.0002.2CDB] # COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDA ; [.15A4.0020.0008.2CDA] # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDD ; [.15A5.0020.0002.2CDD] # COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDC ; [.15A5.0020.0008.2CDC] # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+03EF ; [.15A6.0020.0002.03EF] # COPTIC SMALL LETTER DEI
+03EE ; [.15A6.0020.0008.03EE] # COPTIC CAPITAL LETTER DEI
+2CB3 ; [.15A7.0020.0002.2CB3] # COPTIC SMALL LETTER DIALECT-P ALEF
+2CB2 ; [.15A7.0020.0008.2CB2] # COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB5 ; [.15A8.0020.0002.2CB5] # COPTIC SMALL LETTER OLD COPTIC AIN
+2CB4 ; [.15A8.0020.0008.2CB4] # COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CDF ; [.15A9.0020.0002.2CDF] # COPTIC SMALL LETTER OLD NUBIAN NGI
+2CDE ; [.15A9.0020.0008.2CDE] # COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CE1 ; [.15AA.0020.0002.2CE1] # COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE0 ; [.15AA.0020.0008.2CE0] # COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE3 ; [.15AB.0020.0002.2CE3] # COPTIC SMALL LETTER OLD NUBIAN WAU
+2CE2 ; [.15AB.0020.0008.2CE2] # COPTIC CAPITAL LETTER OLD NUBIAN WAU
+0430 ; [.15AC.0020.0002.0430] # CYRILLIC SMALL LETTER A
+2DF6 ; [.15AC.0020.0004.2DF6] # COMBINING CYRILLIC LETTER A; QQK
+0410 ; [.15AC.0020.0008.0410] # CYRILLIC CAPITAL LETTER A
+04D1 ; [.15B0.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE
+0430 0306 ; [.15B0.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE
+04D0 ; [.15B0.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE
+0410 0306 ; [.15B0.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D3 ; [.15B4.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+0430 0308 ; [.15B4.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D2 ; [.15B4.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+0410 0308 ; [.15B4.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D9 ; [.15B8.0020.0002.04D9] # CYRILLIC SMALL LETTER SCHWA
+04D8 ; [.15B8.0020.0008.04D8] # CYRILLIC CAPITAL LETTER SCHWA
+04DB ; [.15BC.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04D9 0308 ; [.15BC.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DA ; [.15BC.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04D8 0308 ; [.15BC.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04D5 ; [.15C0.0020.0002.04D5] # CYRILLIC SMALL LIGATURE A IE
+04D4 ; [.15C0.0020.0008.04D4] # CYRILLIC CAPITAL LIGATURE A IE
+0431 ; [.15C4.0020.0002.0431] # CYRILLIC SMALL LETTER BE
+2DE0 ; [.15C4.0020.0004.2DE0] # COMBINING CYRILLIC LETTER BE; QQK
+0411 ; [.15C4.0020.0008.0411] # CYRILLIC CAPITAL LETTER BE
+0432 ; [.15C8.0020.0002.0432] # CYRILLIC SMALL LETTER VE
+2DE1 ; [.15C8.0020.0004.2DE1] # COMBINING CYRILLIC LETTER VE; QQK
+0412 ; [.15C8.0020.0008.0412] # CYRILLIC CAPITAL LETTER VE
+0433 ; [.15CC.0020.0002.0433] # CYRILLIC SMALL LETTER GHE
+2DE2 ; [.15CC.0020.0004.2DE2] # COMBINING CYRILLIC LETTER GHE; QQK
+0413 ; [.15CC.0020.0008.0413] # CYRILLIC CAPITAL LETTER GHE
+0491 ; [.15CC.0020.0004.0491][.0000.015A.0004.0491] # CYRILLIC SMALL LETTER GHE WITH UPTURN; QQKN
+0490 ; [.15CC.0020.000A.0490][.0000.015A.0004.0490] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN; QQKN
+0493 ; [.15D0.0020.0002.0493] # CYRILLIC SMALL LETTER GHE WITH STROKE
+0492 ; [.15D0.0020.0008.0492] # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+04FB ; [.15D4.0020.0002.04FB] # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FA ; [.15D4.0020.0008.04FA] # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+0495 ; [.15D8.0020.0002.0495] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0494 ; [.15D8.0020.0008.0494] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+04F7 ; [.15DC.0020.0002.04F7] # CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F6 ; [.15DC.0020.0008.04F6] # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+0434 ; [.15E0.0020.0002.0434] # CYRILLIC SMALL LETTER DE
+2DE3 ; [.15E0.0020.0004.2DE3] # COMBINING CYRILLIC LETTER DE; QQK
+0414 ; [.15E0.0020.0008.0414] # CYRILLIC CAPITAL LETTER DE
+0501 ; [.15E4.0020.0002.0501] # CYRILLIC SMALL LETTER KOMI DE
+0500 ; [.15E4.0020.0008.0500] # CYRILLIC CAPITAL LETTER KOMI DE
+A681 ; [.15E5.0020.0002.A681] # CYRILLIC SMALL LETTER DWE
+A680 ; [.15E5.0020.0008.A680] # CYRILLIC CAPITAL LETTER DWE
+0452 ; [.15E6.0020.0002.0452] # CYRILLIC SMALL LETTER DJE
+0402 ; [.15E6.0020.0008.0402] # CYRILLIC CAPITAL LETTER DJE
+A663 ; [.15EA.0020.0002.A663] # CYRILLIC SMALL LETTER SOFT DE
+A662 ; [.15EA.0020.0008.A662] # CYRILLIC CAPITAL LETTER SOFT DE
+0503 ; [.15EB.0020.0002.0503] # CYRILLIC SMALL LETTER KOMI DJE
+0502 ; [.15EB.0020.0008.0502] # CYRILLIC CAPITAL LETTER KOMI DJE
+0453 ; [.15EC.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0433 0301 ; [.15EC.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0433 0341 ; [.15EC.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0403 ; [.15EC.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0413 0301 ; [.15EC.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0413 0341 ; [.15EC.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0499 ; [.15F0.0020.0002.0499] # CYRILLIC SMALL LETTER ZE WITH DESCENDER
+0498 ; [.15F0.0020.0008.0498] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0435 ; [.15F4.0020.0002.0435] # CYRILLIC SMALL LETTER IE
+2DF7 ; [.15F4.0020.0004.2DF7] # COMBINING CYRILLIC LETTER IE; QQK
+0415 ; [.15F4.0020.0008.0415] # CYRILLIC CAPITAL LETTER IE
+0450 ; [.15F4.0020.0002.0435][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER IE WITH GRAVE; QQCM
+0400 ; [.15F4.0020.0008.0415][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER IE WITH GRAVE; QQCM
+0451 ; [.15F4.0020.0002.0435][.0000.0047.0002.0308] # CYRILLIC SMALL LETTER IO; QQCM
+0401 ; [.15F4.0020.0008.0415][.0000.0047.0002.0308] # CYRILLIC CAPITAL LETTER IO; QQCM
+04D7 ; [.15F8.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE
+0435 0306 ; [.15F8.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE
+04D6 ; [.15F8.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE
+0415 0306 ; [.15F8.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE
+0454 ; [.15FC.0020.0002.0454] # CYRILLIC SMALL LETTER UKRAINIAN IE
+0404 ; [.15FC.0020.0008.0404] # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0436 ; [.1600.0020.0002.0436] # CYRILLIC SMALL LETTER ZHE
+2DE4 ; [.1600.0020.0004.2DE4] # COMBINING CYRILLIC LETTER ZHE; QQK
+0416 ; [.1600.0020.0008.0416] # CYRILLIC CAPITAL LETTER ZHE
+04C2 ; [.1600.0020.0002.0436][.0000.0037.0002.0306] # CYRILLIC SMALL LETTER ZHE WITH BREVE; QQCM
+04C1 ; [.1600.0020.0008.0416][.0000.0037.0002.0306] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE; QQCM
+A685 ; [.1604.0020.0002.A685] # CYRILLIC SMALL LETTER ZHWE
+A684 ; [.1604.0020.0008.A684] # CYRILLIC CAPITAL LETTER ZHWE
+04DD ; [.1605.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+0436 0308 ; [.1605.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DC ; [.1605.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+0416 0308 ; [.1605.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+0497 ; [.1609.0020.0002.0497] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0496 ; [.1609.0020.0008.0496] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0437 ; [.160D.0020.0002.0437] # CYRILLIC SMALL LETTER ZE
+2DE5 ; [.160D.0020.0004.2DE5] # COMBINING CYRILLIC LETTER ZE; QQK
+0417 ; [.160D.0020.0008.0417] # CYRILLIC CAPITAL LETTER ZE
+A641 ; [.1611.0020.0002.A641] # CYRILLIC SMALL LETTER ZEMLYA
+A640 ; [.1611.0020.0008.A640] # CYRILLIC CAPITAL LETTER ZEMLYA
+0505 ; [.1612.0020.0002.0505] # CYRILLIC SMALL LETTER KOMI ZJE
+0504 ; [.1612.0020.0008.0504] # CYRILLIC CAPITAL LETTER KOMI ZJE
+0511 ; [.1613.0020.0002.0511] # CYRILLIC SMALL LETTER REVERSED ZE
+0510 ; [.1613.0020.0008.0510] # CYRILLIC CAPITAL LETTER REVERSED ZE
+04DF ; [.1614.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+0437 0308 ; [.1614.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04DE ; [.1614.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+0417 0308 ; [.1614.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+A643 ; [.1618.0020.0002.A643] # CYRILLIC SMALL LETTER DZELO
+A642 ; [.1618.0020.0008.A642] # CYRILLIC CAPITAL LETTER DZELO
+0455 ; [.1619.0020.0002.0455] # CYRILLIC SMALL LETTER DZE
+0405 ; [.1619.0020.0008.0405] # CYRILLIC CAPITAL LETTER DZE
+A645 ; [.161D.0020.0002.A645] # CYRILLIC SMALL LETTER REVERSED DZE
+A644 ; [.161D.0020.0008.A644] # CYRILLIC CAPITAL LETTER REVERSED DZE
+04E1 ; [.161E.0020.0002.04E1] # CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E0 ; [.161E.0020.0008.04E0] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+A689 ; [.1622.0020.0002.A689] # CYRILLIC SMALL LETTER DZZE
+A688 ; [.1622.0020.0008.A688] # CYRILLIC CAPITAL LETTER DZZE
+0507 ; [.1623.0020.0002.0507] # CYRILLIC SMALL LETTER KOMI DZJE
+0506 ; [.1623.0020.0008.0506] # CYRILLIC CAPITAL LETTER KOMI DZJE
+A683 ; [.1624.0020.0002.A683] # CYRILLIC SMALL LETTER DZWE
+A682 ; [.1624.0020.0008.A682] # CYRILLIC CAPITAL LETTER DZWE
+0438 ; [.1625.0020.0002.0438] # CYRILLIC SMALL LETTER I
+0418 ; [.1625.0020.0008.0418] # CYRILLIC CAPITAL LETTER I
+045D ; [.1625.0020.0002.0438][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER I WITH GRAVE; QQCM
+040D ; [.1625.0020.0008.0418][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER I WITH GRAVE; QQCM
+04E3 ; [.1625.0020.0002.0438][.0000.005B.0002.0304] # CYRILLIC SMALL LETTER I WITH MACRON; QQCM
+04E2 ; [.1625.0020.0008.0418][.0000.005B.0002.0304] # CYRILLIC CAPITAL LETTER I WITH MACRON; QQCM
+048B ; [.1629.0020.0002.048B] # CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048A ; [.1629.0020.0008.048A] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+04E5 ; [.162D.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS
+0438 0308 ; [.162D.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E4 ; [.162D.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+0418 0308 ; [.162D.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+0456 ; [.1631.0020.0002.0456] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0406 ; [.1631.0020.0008.0406] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+A647 ; [.1635.0020.0002.A647] # CYRILLIC SMALL LETTER IOTA
+A646 ; [.1635.0020.0008.A646] # CYRILLIC CAPITAL LETTER IOTA
+0457 ; [.1636.0020.0002.0457] # CYRILLIC SMALL LETTER YI
+0456 0308 ; [.1636.0020.0002.0457] # CYRILLIC SMALL LETTER YI
+0407 ; [.1636.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI
+0406 0308 ; [.1636.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI
+0439 ; [.163A.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I
+0438 0306 ; [.163A.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I
+0419 ; [.163A.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I
+0418 0306 ; [.163A.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I
+0458 ; [.163E.0020.0002.0458] # CYRILLIC SMALL LETTER JE
+0408 ; [.163E.0020.0008.0408] # CYRILLIC CAPITAL LETTER JE
+A649 ; [.1642.0020.0002.A649] # CYRILLIC SMALL LETTER DJERV
+2DF8 ; [.1642.0020.0004.2DF8] # COMBINING CYRILLIC LETTER DJERV; QQK
+A648 ; [.1642.0020.0008.A648] # CYRILLIC CAPITAL LETTER DJERV
+043A ; [.1643.0020.0002.043A] # CYRILLIC SMALL LETTER KA
+2DE6 ; [.1643.0020.0004.2DE6] # COMBINING CYRILLIC LETTER KA; QQK
+041A ; [.1643.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA
+049B ; [.1647.0020.0002.049B] # CYRILLIC SMALL LETTER KA WITH DESCENDER
+049A ; [.1647.0020.0008.049A] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+04C4 ; [.164B.0020.0002.04C4] # CYRILLIC SMALL LETTER KA WITH HOOK
+04C3 ; [.164B.0020.0008.04C3] # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04A1 ; [.164F.0020.0002.04A1] # CYRILLIC SMALL LETTER BASHKIR KA
+04A0 ; [.164F.0020.0008.04A0] # CYRILLIC CAPITAL LETTER BASHKIR KA
+049F ; [.1653.0020.0002.049F] # CYRILLIC SMALL LETTER KA WITH STROKE
+049E ; [.1653.0020.0008.049E] # CYRILLIC CAPITAL LETTER KA WITH STROKE
+049D ; [.1657.0020.0002.049D] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049C ; [.1657.0020.0008.049C] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+051F ; [.165B.0020.0002.051F] # CYRILLIC SMALL LETTER ALEUT KA
+051E ; [.165B.0020.0008.051E] # CYRILLIC CAPITAL LETTER ALEUT KA
+051B ; [.165C.0020.0002.051B] # CYRILLIC SMALL LETTER QA
+051A ; [.165C.0020.0008.051A] # CYRILLIC CAPITAL LETTER QA
+043B ; [.165D.0020.0002.043B] # CYRILLIC SMALL LETTER EL
+2DE7 ; [.165D.0020.0004.2DE7] # COMBINING CYRILLIC LETTER EL; QQK
+041B ; [.165D.0020.0008.041B] # CYRILLIC CAPITAL LETTER EL
+1D2B ; [.1661.0020.0002.1D2B] # CYRILLIC LETTER SMALL CAPITAL EL
+04C6 ; [.1662.0020.0002.04C6] # CYRILLIC SMALL LETTER EL WITH TAIL
+04C5 ; [.1662.0020.0008.04C5] # CYRILLIC CAPITAL LETTER EL WITH TAIL
+0513 ; [.1666.0020.0002.0513] # CYRILLIC SMALL LETTER EL WITH HOOK
+0512 ; [.1666.0020.0008.0512] # CYRILLIC CAPITAL LETTER EL WITH HOOK
+0521 ; [.1667.0020.0002.0521] # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+0520 ; [.1667.0020.0008.0520] # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0459 ; [.1668.0020.0002.0459] # CYRILLIC SMALL LETTER LJE
+0409 ; [.1668.0020.0008.0409] # CYRILLIC CAPITAL LETTER LJE
+A665 ; [.166C.0020.0002.A665] # CYRILLIC SMALL LETTER SOFT EL
+A664 ; [.166C.0020.0008.A664] # CYRILLIC CAPITAL LETTER SOFT EL
+0509 ; [.166D.0020.0002.0509] # CYRILLIC SMALL LETTER KOMI LJE
+0508 ; [.166D.0020.0008.0508] # CYRILLIC CAPITAL LETTER KOMI LJE
+0515 ; [.166E.0020.0002.0515] # CYRILLIC SMALL LETTER LHA
+0514 ; [.166E.0020.0008.0514] # CYRILLIC CAPITAL LETTER LHA
+043C ; [.166F.0020.0002.043C] # CYRILLIC SMALL LETTER EM
+2DE8 ; [.166F.0020.0004.2DE8] # COMBINING CYRILLIC LETTER EM; QQK
+041C ; [.166F.0020.0008.041C] # CYRILLIC CAPITAL LETTER EM
+04CE ; [.1673.0020.0002.04CE] # CYRILLIC SMALL LETTER EM WITH TAIL
+04CD ; [.1673.0020.0008.04CD] # CYRILLIC CAPITAL LETTER EM WITH TAIL
+A667 ; [.1677.0020.0002.A667] # CYRILLIC SMALL LETTER SOFT EM
+A666 ; [.1677.0020.0008.A666] # CYRILLIC CAPITAL LETTER SOFT EM
+043D ; [.1678.0020.0002.043D] # CYRILLIC SMALL LETTER EN
+2DE9 ; [.1678.0020.0004.2DE9] # COMBINING CYRILLIC LETTER EN; QQK
+041D ; [.1678.0020.0008.041D] # CYRILLIC CAPITAL LETTER EN
+1D78 ; [.1678.0020.0014.1D78] # MODIFIER LETTER CYRILLIC EN; QQK
+04CA ; [.167C.0020.0002.04CA] # CYRILLIC SMALL LETTER EN WITH TAIL
+04C9 ; [.167C.0020.0008.04C9] # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04A3 ; [.1680.0020.0002.04A3] # CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A2 ; [.1680.0020.0008.04A2] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04C8 ; [.1684.0020.0002.04C8] # CYRILLIC SMALL LETTER EN WITH HOOK
+04C7 ; [.1684.0020.0008.04C7] # CYRILLIC CAPITAL LETTER EN WITH HOOK
+0523 ; [.1688.0020.0002.0523] # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+0522 ; [.1688.0020.0008.0522] # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+04A5 ; [.1689.0020.0002.04A5] # CYRILLIC SMALL LIGATURE EN GHE
+04A4 ; [.1689.0020.0008.04A4] # CYRILLIC CAPITAL LIGATURE EN GHE
+045A ; [.168D.0020.0002.045A] # CYRILLIC SMALL LETTER NJE
+040A ; [.168D.0020.0008.040A] # CYRILLIC CAPITAL LETTER NJE
+050B ; [.1691.0020.0002.050B] # CYRILLIC SMALL LETTER KOMI NJE
+050A ; [.1691.0020.0008.050A] # CYRILLIC CAPITAL LETTER KOMI NJE
+043E ; [.1692.0020.0002.043E] # CYRILLIC SMALL LETTER O
+2DEA ; [.1692.0020.0004.2DEA] # COMBINING CYRILLIC LETTER O; QQK
+A669 ; [.1692.0020.0004.A669] # CYRILLIC SMALL LETTER MONOCULAR O; QQK
+A66B ; [.1692.0020.0004.A66B] # CYRILLIC SMALL LETTER BINOCULAR O; QQK
+A66D ; [.1692.0020.0004.A66D] # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O; QQK
+A66E ; [.1692.0020.0004.A66E] # CYRILLIC LETTER MULTIOCULAR O; QQK
+041E ; [.1692.0020.0008.041E] # CYRILLIC CAPITAL LETTER O
+A668 ; [.1692.0020.000A.A668] # CYRILLIC CAPITAL LETTER MONOCULAR O; QQK
+A66A ; [.1692.0020.000A.A66A] # CYRILLIC CAPITAL LETTER BINOCULAR O; QQK
+A66C ; [.1692.0020.000A.A66C] # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O; QQK
+04E7 ; [.1696.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS
+043E 0308 ; [.1696.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E6 ; [.1696.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+041E 0308 ; [.1696.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E9 ; [.169A.0020.0002.04E9] # CYRILLIC SMALL LETTER BARRED O
+04E8 ; [.169A.0020.0008.04E8] # CYRILLIC CAPITAL LETTER BARRED O
+04EB ; [.169E.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04E9 0308 ; [.169E.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EA ; [.169E.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04E8 0308 ; [.169E.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+043F ; [.16A2.0020.0002.043F] # CYRILLIC SMALL LETTER PE
+2DEB ; [.16A2.0020.0004.2DEB] # COMBINING CYRILLIC LETTER PE; QQK
+041F ; [.16A2.0020.0008.041F] # CYRILLIC CAPITAL LETTER PE
+0525 ; [.16A6.0020.0002.0525] # CYRILLIC SMALL LETTER PE WITH DESCENDER
+0524 ; [.16A6.0020.0008.0524] # CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+04A7 ; [.16A7.0020.0002.04A7] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A6 ; [.16A7.0020.0008.04A6] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+0481 ; [.16AB.0020.0002.0481] # CYRILLIC SMALL LETTER KOPPA
+0480 ; [.16AB.0020.0008.0480] # CYRILLIC CAPITAL LETTER KOPPA
+0440 ; [.16AF.0020.0002.0440] # CYRILLIC SMALL LETTER ER
+2DEC ; [.16AF.0020.0004.2DEC] # COMBINING CYRILLIC LETTER ER; QQK
+0420 ; [.16AF.0020.0008.0420] # CYRILLIC CAPITAL LETTER ER
+048F ; [.16B3.0020.0002.048F] # CYRILLIC SMALL LETTER ER WITH TICK
+048E ; [.16B3.0020.0008.048E] # CYRILLIC CAPITAL LETTER ER WITH TICK
+0517 ; [.16B7.0020.0002.0517] # CYRILLIC SMALL LETTER RHA
+0516 ; [.16B7.0020.0008.0516] # CYRILLIC CAPITAL LETTER RHA
+0441 ; [.16B8.0020.0002.0441] # CYRILLIC SMALL LETTER ES
+2DED ; [.16B8.0020.0004.2DED] # COMBINING CYRILLIC LETTER ES; QQK
+0421 ; [.16B8.0020.0008.0421] # CYRILLIC CAPITAL LETTER ES
+2DF5 ; [.16B8.0020.0004.2DF5][.16C1.0020.0004.2DF5] # COMBINING CYRILLIC LETTER ES-TE; QQKN
+050D ; [.16BC.0020.0002.050D] # CYRILLIC SMALL LETTER KOMI SJE
+050C ; [.16BC.0020.0008.050C] # CYRILLIC CAPITAL LETTER KOMI SJE
+04AB ; [.16BD.0020.0002.04AB] # CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AA ; [.16BD.0020.0008.04AA] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+0442 ; [.16C1.0020.0002.0442] # CYRILLIC SMALL LETTER TE
+2DEE ; [.16C1.0020.0004.2DEE] # COMBINING CYRILLIC LETTER TE; QQK
+0422 ; [.16C1.0020.0008.0422] # CYRILLIC CAPITAL LETTER TE
+A68D ; [.16C5.0020.0002.A68D] # CYRILLIC SMALL LETTER TWE
+A68C ; [.16C5.0020.0008.A68C] # CYRILLIC CAPITAL LETTER TWE
+050F ; [.16C6.0020.0002.050F] # CYRILLIC SMALL LETTER KOMI TJE
+050E ; [.16C6.0020.0008.050E] # CYRILLIC CAPITAL LETTER KOMI TJE
+04AD ; [.16C7.0020.0002.04AD] # CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AC ; [.16C7.0020.0008.04AC] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+A68B ; [.16CB.0020.0002.A68B] # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68A ; [.16CB.0020.0008.A68A] # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+045B ; [.16CC.0020.0002.045B] # CYRILLIC SMALL LETTER TSHE
+040B ; [.16CC.0020.0008.040B] # CYRILLIC CAPITAL LETTER TSHE
+045C ; [.16D0.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+043A 0301 ; [.16D0.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+043A 0341 ; [.16D0.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+040C ; [.16D0.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+041A 0301 ; [.16D0.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+041A 0341 ; [.16D0.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+0443 ; [.16D4.0020.0002.0443] # CYRILLIC SMALL LETTER U
+0423 ; [.16D4.0020.0008.0423] # CYRILLIC CAPITAL LETTER U
+04EF ; [.16D4.0020.0002.0443][.0000.005B.0002.0304] # CYRILLIC SMALL LETTER U WITH MACRON; QQCM
+04EE ; [.16D4.0020.0008.0423][.0000.005B.0002.0304] # CYRILLIC CAPITAL LETTER U WITH MACRON; QQCM
+045E ; [.16D8.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U
+0443 0306 ; [.16D8.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U
+040E ; [.16D8.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U
+0423 0306 ; [.16D8.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U
+04F1 ; [.16DC.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS
+0443 0308 ; [.16DC.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F0 ; [.16DC.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+0423 0308 ; [.16DC.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F3 ; [.16E0.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+0443 030B ; [.16E0.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F2 ; [.16E0.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+0423 030B ; [.16E0.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04AF ; [.16E4.0020.0002.04AF] # CYRILLIC SMALL LETTER STRAIGHT U
+04AE ; [.16E4.0020.0008.04AE] # CYRILLIC CAPITAL LETTER STRAIGHT U
+04B1 ; [.16E8.0020.0002.04B1] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B0 ; [.16E8.0020.0008.04B0] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+A64B ; [.16EC.0020.0002.A64B] # CYRILLIC SMALL LETTER MONOGRAPH UK
+2DF9 ; [.16EC.0020.0004.2DF9] # COMBINING CYRILLIC LETTER MONOGRAPH UK; QQK
+A64A ; [.16EC.0020.0008.A64A] # CYRILLIC CAPITAL LETTER MONOGRAPH UK
+0479 ; [.16ED.0020.0002.0479] # CYRILLIC SMALL LETTER UK
+0478 ; [.16ED.0020.0008.0478] # CYRILLIC CAPITAL LETTER UK
+0444 ; [.16F1.0020.0002.0444] # CYRILLIC SMALL LETTER EF
+0424 ; [.16F1.0020.0008.0424] # CYRILLIC CAPITAL LETTER EF
+0445 ; [.16F5.0020.0002.0445] # CYRILLIC SMALL LETTER HA
+2DEF ; [.16F5.0020.0004.2DEF] # COMBINING CYRILLIC LETTER HA; QQK
+0425 ; [.16F5.0020.0008.0425] # CYRILLIC CAPITAL LETTER HA
+04FD ; [.16F9.0020.0002.04FD] # CYRILLIC SMALL LETTER HA WITH HOOK
+04FC ; [.16F9.0020.0008.04FC] # CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FF ; [.16FD.0020.0002.04FF] # CYRILLIC SMALL LETTER HA WITH STROKE
+04FE ; [.16FD.0020.0008.04FE] # CYRILLIC CAPITAL LETTER HA WITH STROKE
+04B3 ; [.1701.0020.0002.04B3] # CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B2 ; [.1701.0020.0008.04B2] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04BB ; [.1705.0020.0002.04BB] # CYRILLIC SMALL LETTER SHHA
+04BA ; [.1705.0020.0008.04BA] # CYRILLIC CAPITAL LETTER SHHA
+A695 ; [.1709.0020.0002.A695] # CYRILLIC SMALL LETTER HWE
+A694 ; [.1709.0020.0008.A694] # CYRILLIC CAPITAL LETTER HWE
+0461 ; [.170A.0020.0002.0461] # CYRILLIC SMALL LETTER OMEGA
+0460 ; [.170A.0020.0008.0460] # CYRILLIC CAPITAL LETTER OMEGA
+047F ; [.170E.0020.0002.047F] # CYRILLIC SMALL LETTER OT
+047E ; [.170E.0020.0008.047E] # CYRILLIC CAPITAL LETTER OT
+A64D ; [.1712.0020.0002.A64D] # CYRILLIC SMALL LETTER BROAD OMEGA
+A64C ; [.1712.0020.0008.A64C] # CYRILLIC CAPITAL LETTER BROAD OMEGA
+047D ; [.1713.0020.0002.047D] # CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047C ; [.1713.0020.0008.047C] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047B ; [.1717.0020.0002.047B] # CYRILLIC SMALL LETTER ROUND OMEGA
+047A ; [.1717.0020.0008.047A] # CYRILLIC CAPITAL LETTER ROUND OMEGA
+0446 ; [.171B.0020.0002.0446] # CYRILLIC SMALL LETTER TSE
+2DF0 ; [.171B.0020.0004.2DF0] # COMBINING CYRILLIC LETTER TSE; QQK
+0426 ; [.171B.0020.0008.0426] # CYRILLIC CAPITAL LETTER TSE
+A68F ; [.171F.0020.0002.A68F] # CYRILLIC SMALL LETTER TSWE
+A68E ; [.171F.0020.0008.A68E] # CYRILLIC CAPITAL LETTER TSWE
+04B5 ; [.1720.0020.0002.04B5] # CYRILLIC SMALL LIGATURE TE TSE
+04B4 ; [.1720.0020.0008.04B4] # CYRILLIC CAPITAL LIGATURE TE TSE
+A691 ; [.1724.0020.0002.A691] # CYRILLIC SMALL LETTER TSSE
+A690 ; [.1724.0020.0008.A690] # CYRILLIC CAPITAL LETTER TSSE
+0447 ; [.1725.0020.0002.0447] # CYRILLIC SMALL LETTER CHE
+2DF1 ; [.1725.0020.0004.2DF1] # COMBINING CYRILLIC LETTER CHE; QQK
+0427 ; [.1725.0020.0008.0427] # CYRILLIC CAPITAL LETTER CHE
+A693 ; [.1729.0020.0002.A693] # CYRILLIC SMALL LETTER TCHE
+A692 ; [.1729.0020.0008.A692] # CYRILLIC CAPITAL LETTER TCHE
+04F5 ; [.172A.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+0447 0308 ; [.172A.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F4 ; [.172A.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+0427 0308 ; [.172A.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04B7 ; [.172E.0020.0002.04B7] # CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B6 ; [.172E.0020.0008.04B6] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04CC ; [.1732.0020.0002.04CC] # CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CB ; [.1732.0020.0008.04CB] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04B9 ; [.1736.0020.0002.04B9] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04B8 ; [.1736.0020.0008.04B8] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+A687 ; [.173A.0020.0002.A687] # CYRILLIC SMALL LETTER CCHE
+A686 ; [.173A.0020.0008.A686] # CYRILLIC CAPITAL LETTER CCHE
+04BD ; [.173B.0020.0002.04BD] # CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BC ; [.173B.0020.0008.04BC] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BF ; [.173F.0020.0002.04BF] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04BE ; [.173F.0020.0008.04BE] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+045F ; [.1743.0020.0002.045F] # CYRILLIC SMALL LETTER DZHE
+040F ; [.1743.0020.0008.040F] # CYRILLIC CAPITAL LETTER DZHE
+0448 ; [.1747.0020.0002.0448] # CYRILLIC SMALL LETTER SHA
+2DF2 ; [.1747.0020.0004.2DF2] # COMBINING CYRILLIC LETTER SHA; QQK
+0428 ; [.1747.0020.0008.0428] # CYRILLIC CAPITAL LETTER SHA
+A697 ; [.174B.0020.0002.A697] # CYRILLIC SMALL LETTER SHWE
+A696 ; [.174B.0020.0008.A696] # CYRILLIC CAPITAL LETTER SHWE
+0449 ; [.174C.0020.0002.0449] # CYRILLIC SMALL LETTER SHCHA
+2DF3 ; [.174C.0020.0004.2DF3] # COMBINING CYRILLIC LETTER SHCHA; QQK
+0429 ; [.174C.0020.0008.0429] # CYRILLIC CAPITAL LETTER SHCHA
+A64F ; [.1750.0020.0002.A64F] # CYRILLIC SMALL LETTER NEUTRAL YER
+A64E ; [.1750.0020.0008.A64E] # CYRILLIC CAPITAL LETTER NEUTRAL YER
+2E2F ; [.1751.0020.0002.2E2F] # VERTICAL TILDE
+A67F ; [.1752.0020.0002.A67F] # CYRILLIC PAYEROK
+044A ; [.1753.0020.0002.044A] # CYRILLIC SMALL LETTER HARD SIGN
+042A ; [.1753.0020.0008.042A] # CYRILLIC CAPITAL LETTER HARD SIGN
+A651 ; [.1757.0020.0002.A651] # CYRILLIC SMALL LETTER YERU WITH BACK YER
+A650 ; [.1757.0020.0008.A650] # CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+044B ; [.1758.0020.0002.044B] # CYRILLIC SMALL LETTER YERU
+042B ; [.1758.0020.0008.042B] # CYRILLIC CAPITAL LETTER YERU
+04F9 ; [.175C.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+044B 0308 ; [.175C.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04F8 ; [.175C.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+042B 0308 ; [.175C.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+044C ; [.1760.0020.0002.044C] # CYRILLIC SMALL LETTER SOFT SIGN
+042C ; [.1760.0020.0008.042C] # CYRILLIC CAPITAL LETTER SOFT SIGN
+048D ; [.1764.0020.0002.048D] # CYRILLIC SMALL LETTER SEMISOFT SIGN
+048C ; [.1764.0020.0008.048C] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+0463 ; [.1768.0020.0002.0463] # CYRILLIC SMALL LETTER YAT
+2DFA ; [.1768.0020.0004.2DFA] # COMBINING CYRILLIC LETTER YAT; QQK
+0462 ; [.1768.0020.0008.0462] # CYRILLIC CAPITAL LETTER YAT
+A653 ; [.176C.0020.0002.A653] # CYRILLIC SMALL LETTER IOTIFIED YAT
+A652 ; [.176C.0020.0008.A652] # CYRILLIC CAPITAL LETTER IOTIFIED YAT
+044D ; [.176D.0020.0002.044D] # CYRILLIC SMALL LETTER E
+042D ; [.176D.0020.0008.042D] # CYRILLIC CAPITAL LETTER E
+04ED ; [.1771.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS
+044D 0308 ; [.1771.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EC ; [.1771.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+042D 0308 ; [.1771.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+044E ; [.1775.0020.0002.044E] # CYRILLIC SMALL LETTER YU
+2DFB ; [.1775.0020.0004.2DFB] # COMBINING CYRILLIC LETTER YU; QQK
+042E ; [.1775.0020.0008.042E] # CYRILLIC CAPITAL LETTER YU
+A655 ; [.1779.0020.0002.A655] # CYRILLIC SMALL LETTER REVERSED YU
+A654 ; [.1779.0020.0008.A654] # CYRILLIC CAPITAL LETTER REVERSED YU
+A657 ; [.177A.0020.0002.A657] # CYRILLIC SMALL LETTER IOTIFIED A
+2DFC ; [.177A.0020.0004.2DFC] # COMBINING CYRILLIC LETTER IOTIFIED A; QQK
+A656 ; [.177A.0020.0008.A656] # CYRILLIC CAPITAL LETTER IOTIFIED A
+044F ; [.177B.0020.0002.044F] # CYRILLIC SMALL LETTER YA
+042F ; [.177B.0020.0008.042F] # CYRILLIC CAPITAL LETTER YA
+0519 ; [.177F.0020.0002.0519] # CYRILLIC SMALL LETTER YAE
+0518 ; [.177F.0020.0008.0518] # CYRILLIC CAPITAL LETTER YAE
+0465 ; [.1780.0020.0002.0465] # CYRILLIC SMALL LETTER IOTIFIED E
+0464 ; [.1780.0020.0008.0464] # CYRILLIC CAPITAL LETTER IOTIFIED E
+0467 ; [.1784.0020.0002.0467] # CYRILLIC SMALL LETTER LITTLE YUS
+2DFD ; [.1784.0020.0004.2DFD] # COMBINING CYRILLIC LETTER LITTLE YUS; QQK
+0466 ; [.1784.0020.0008.0466] # CYRILLIC CAPITAL LETTER LITTLE YUS
+A659 ; [.1788.0020.0002.A659] # CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+A658 ; [.1788.0020.0008.A658] # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+046B ; [.1789.0020.0002.046B] # CYRILLIC SMALL LETTER BIG YUS
+2DFE ; [.1789.0020.0004.2DFE] # COMBINING CYRILLIC LETTER BIG YUS; QQK
+046A ; [.1789.0020.0008.046A] # CYRILLIC CAPITAL LETTER BIG YUS
+A65B ; [.178D.0020.0002.A65B] # CYRILLIC SMALL LETTER BLENDED YUS
+A65A ; [.178D.0020.0008.A65A] # CYRILLIC CAPITAL LETTER BLENDED YUS
+0469 ; [.178E.0020.0002.0469] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+0468 ; [.178E.0020.0008.0468] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+A65D ; [.1792.0020.0002.A65D] # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+A65C ; [.1792.0020.0008.A65C] # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+046D ; [.1793.0020.0002.046D] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+2DFF ; [.1793.0020.0004.2DFF] # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS; QQK
+046C ; [.1793.0020.0008.046C] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046F ; [.1797.0020.0002.046F] # CYRILLIC SMALL LETTER KSI
+046E ; [.1797.0020.0008.046E] # CYRILLIC CAPITAL LETTER KSI
+0471 ; [.179B.0020.0002.0471] # CYRILLIC SMALL LETTER PSI
+0470 ; [.179B.0020.0008.0470] # CYRILLIC CAPITAL LETTER PSI
+0473 ; [.179F.0020.0002.0473] # CYRILLIC SMALL LETTER FITA
+2DF4 ; [.179F.0020.0004.2DF4] # COMBINING CYRILLIC LETTER FITA; QQK
+0472 ; [.179F.0020.0008.0472] # CYRILLIC CAPITAL LETTER FITA
+0475 ; [.17A3.0020.0002.0475] # CYRILLIC SMALL LETTER IZHITSA
+0474 ; [.17A3.0020.0008.0474] # CYRILLIC CAPITAL LETTER IZHITSA
+0477 ; [.17A7.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0475 030F ; [.17A7.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0476 ; [.17A7.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0474 030F ; [.17A7.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+A65F ; [.17AB.0020.0002.A65F] # CYRILLIC SMALL LETTER YN
+A65E ; [.17AB.0020.0008.A65E] # CYRILLIC CAPITAL LETTER YN
+04A9 ; [.17AC.0020.0002.04A9] # CYRILLIC SMALL LETTER ABKHASIAN HA
+04A8 ; [.17AC.0020.0008.04A8] # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+051D ; [.17B0.0020.0002.051D] # CYRILLIC SMALL LETTER WE
+051C ; [.17B0.0020.0008.051C] # CYRILLIC CAPITAL LETTER WE
+04CF ; [.17B1.0020.0002.04CF] # CYRILLIC SMALL LETTER PALOCHKA
+04C0 ; [.17B1.0020.0008.04C0] # CYRILLIC LETTER PALOCHKA
+2C30 ; [.17B5.0020.0002.2C30] # GLAGOLITIC SMALL LETTER AZU
+2C00 ; [.17B5.0020.0008.2C00] # GLAGOLITIC CAPITAL LETTER AZU
+2C31 ; [.17B6.0020.0002.2C31] # GLAGOLITIC SMALL LETTER BUKY
+2C01 ; [.17B6.0020.0008.2C01] # GLAGOLITIC CAPITAL LETTER BUKY
+2C32 ; [.17B7.0020.0002.2C32] # GLAGOLITIC SMALL LETTER VEDE
+2C02 ; [.17B7.0020.0008.2C02] # GLAGOLITIC CAPITAL LETTER VEDE
+2C33 ; [.17B8.0020.0002.2C33] # GLAGOLITIC SMALL LETTER GLAGOLI
+2C03 ; [.17B8.0020.0008.2C03] # GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C34 ; [.17B9.0020.0002.2C34] # GLAGOLITIC SMALL LETTER DOBRO
+2C04 ; [.17B9.0020.0008.2C04] # GLAGOLITIC CAPITAL LETTER DOBRO
+2C35 ; [.17BA.0020.0002.2C35] # GLAGOLITIC SMALL LETTER YESTU
+2C05 ; [.17BA.0020.0008.2C05] # GLAGOLITIC CAPITAL LETTER YESTU
+2C36 ; [.17BB.0020.0002.2C36] # GLAGOLITIC SMALL LETTER ZHIVETE
+2C06 ; [.17BB.0020.0008.2C06] # GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C37 ; [.17BC.0020.0002.2C37] # GLAGOLITIC SMALL LETTER DZELO
+2C07 ; [.17BC.0020.0008.2C07] # GLAGOLITIC CAPITAL LETTER DZELO
+2C38 ; [.17BD.0020.0002.2C38] # GLAGOLITIC SMALL LETTER ZEMLJA
+2C08 ; [.17BD.0020.0008.2C08] # GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C39 ; [.17BE.0020.0002.2C39] # GLAGOLITIC SMALL LETTER IZHE
+2C09 ; [.17BE.0020.0008.2C09] # GLAGOLITIC CAPITAL LETTER IZHE
+2C3A ; [.17BF.0020.0002.2C3A] # GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C0A ; [.17BF.0020.0008.2C0A] # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C3B ; [.17C0.0020.0002.2C3B] # GLAGOLITIC SMALL LETTER I
+2C0B ; [.17C0.0020.0008.2C0B] # GLAGOLITIC CAPITAL LETTER I
+2C3C ; [.17C1.0020.0002.2C3C] # GLAGOLITIC SMALL LETTER DJERVI
+2C0C ; [.17C1.0020.0008.2C0C] # GLAGOLITIC CAPITAL LETTER DJERVI
+2C3D ; [.17C2.0020.0002.2C3D] # GLAGOLITIC SMALL LETTER KAKO
+2C0D ; [.17C2.0020.0008.2C0D] # GLAGOLITIC CAPITAL LETTER KAKO
+2C3E ; [.17C3.0020.0002.2C3E] # GLAGOLITIC SMALL LETTER LJUDIJE
+2C0E ; [.17C3.0020.0008.2C0E] # GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C3F ; [.17C4.0020.0002.2C3F] # GLAGOLITIC SMALL LETTER MYSLITE
+2C0F ; [.17C4.0020.0008.2C0F] # GLAGOLITIC CAPITAL LETTER MYSLITE
+2C40 ; [.17C5.0020.0002.2C40] # GLAGOLITIC SMALL LETTER NASHI
+2C10 ; [.17C5.0020.0008.2C10] # GLAGOLITIC CAPITAL LETTER NASHI
+2C41 ; [.17C6.0020.0002.2C41] # GLAGOLITIC SMALL LETTER ONU
+2C11 ; [.17C6.0020.0008.2C11] # GLAGOLITIC CAPITAL LETTER ONU
+2C42 ; [.17C7.0020.0002.2C42] # GLAGOLITIC SMALL LETTER POKOJI
+2C12 ; [.17C7.0020.0008.2C12] # GLAGOLITIC CAPITAL LETTER POKOJI
+2C43 ; [.17C8.0020.0002.2C43] # GLAGOLITIC SMALL LETTER RITSI
+2C13 ; [.17C8.0020.0008.2C13] # GLAGOLITIC CAPITAL LETTER RITSI
+2C44 ; [.17C9.0020.0002.2C44] # GLAGOLITIC SMALL LETTER SLOVO
+2C14 ; [.17C9.0020.0008.2C14] # GLAGOLITIC CAPITAL LETTER SLOVO
+2C45 ; [.17CA.0020.0002.2C45] # GLAGOLITIC SMALL LETTER TVRIDO
+2C15 ; [.17CA.0020.0008.2C15] # GLAGOLITIC CAPITAL LETTER TVRIDO
+2C46 ; [.17CB.0020.0002.2C46] # GLAGOLITIC SMALL LETTER UKU
+2C16 ; [.17CB.0020.0008.2C16] # GLAGOLITIC CAPITAL LETTER UKU
+2C47 ; [.17CC.0020.0002.2C47] # GLAGOLITIC SMALL LETTER FRITU
+2C17 ; [.17CC.0020.0008.2C17] # GLAGOLITIC CAPITAL LETTER FRITU
+2C48 ; [.17CD.0020.0002.2C48] # GLAGOLITIC SMALL LETTER HERU
+2C18 ; [.17CD.0020.0008.2C18] # GLAGOLITIC CAPITAL LETTER HERU
+2C49 ; [.17CE.0020.0002.2C49] # GLAGOLITIC SMALL LETTER OTU
+2C19 ; [.17CE.0020.0008.2C19] # GLAGOLITIC CAPITAL LETTER OTU
+2C4A ; [.17CF.0020.0002.2C4A] # GLAGOLITIC SMALL LETTER PE
+2C1A ; [.17CF.0020.0008.2C1A] # GLAGOLITIC CAPITAL LETTER PE
+2C4B ; [.17D0.0020.0002.2C4B] # GLAGOLITIC SMALL LETTER SHTA
+2C1B ; [.17D0.0020.0008.2C1B] # GLAGOLITIC CAPITAL LETTER SHTA
+2C4C ; [.17D1.0020.0002.2C4C] # GLAGOLITIC SMALL LETTER TSI
+2C1C ; [.17D1.0020.0008.2C1C] # GLAGOLITIC CAPITAL LETTER TSI
+2C4D ; [.17D2.0020.0002.2C4D] # GLAGOLITIC SMALL LETTER CHRIVI
+2C1D ; [.17D2.0020.0008.2C1D] # GLAGOLITIC CAPITAL LETTER CHRIVI
+2C4E ; [.17D3.0020.0002.2C4E] # GLAGOLITIC SMALL LETTER SHA
+2C1E ; [.17D3.0020.0008.2C1E] # GLAGOLITIC CAPITAL LETTER SHA
+2C4F ; [.17D4.0020.0002.2C4F] # GLAGOLITIC SMALL LETTER YERU
+2C1F ; [.17D4.0020.0008.2C1F] # GLAGOLITIC CAPITAL LETTER YERU
+2C50 ; [.17D5.0020.0002.2C50] # GLAGOLITIC SMALL LETTER YERI
+2C20 ; [.17D5.0020.0008.2C20] # GLAGOLITIC CAPITAL LETTER YERI
+2C51 ; [.17D6.0020.0002.2C51] # GLAGOLITIC SMALL LETTER YATI
+2C21 ; [.17D6.0020.0008.2C21] # GLAGOLITIC CAPITAL LETTER YATI
+2C52 ; [.17D7.0020.0002.2C52] # GLAGOLITIC SMALL LETTER SPIDERY HA
+2C22 ; [.17D7.0020.0008.2C22] # GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C53 ; [.17D8.0020.0002.2C53] # GLAGOLITIC SMALL LETTER YU
+2C23 ; [.17D8.0020.0008.2C23] # GLAGOLITIC CAPITAL LETTER YU
+2C54 ; [.17D9.0020.0002.2C54] # GLAGOLITIC SMALL LETTER SMALL YUS
+2C24 ; [.17D9.0020.0008.2C24] # GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C55 ; [.17DA.0020.0002.2C55] # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C25 ; [.17DA.0020.0008.2C25] # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C56 ; [.17DB.0020.0002.2C56] # GLAGOLITIC SMALL LETTER YO
+2C26 ; [.17DB.0020.0008.2C26] # GLAGOLITIC CAPITAL LETTER YO
+2C57 ; [.17DC.0020.0002.2C57] # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C27 ; [.17DC.0020.0008.2C27] # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C58 ; [.17DD.0020.0002.2C58] # GLAGOLITIC SMALL LETTER BIG YUS
+2C28 ; [.17DD.0020.0008.2C28] # GLAGOLITIC CAPITAL LETTER BIG YUS
+2C59 ; [.17DE.0020.0002.2C59] # GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C29 ; [.17DE.0020.0008.2C29] # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C5A ; [.17DF.0020.0002.2C5A] # GLAGOLITIC SMALL LETTER FITA
+2C2A ; [.17DF.0020.0008.2C2A] # GLAGOLITIC CAPITAL LETTER FITA
+2C5B ; [.17E0.0020.0002.2C5B] # GLAGOLITIC SMALL LETTER IZHITSA
+2C2B ; [.17E0.0020.0008.2C2B] # GLAGOLITIC CAPITAL LETTER IZHITSA
+2C5C ; [.17E1.0020.0002.2C5C] # GLAGOLITIC SMALL LETTER SHTAPIC
+2C2C ; [.17E1.0020.0008.2C2C] # GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C5D ; [.17E2.0020.0002.2C5D] # GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C2D ; [.17E2.0020.0008.2C2D] # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C5E ; [.17E3.0020.0002.2C5E] # GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C2E ; [.17E3.0020.0008.2C2E] # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+10D0 ; [.17E4.0020.0002.10D0] # GEORGIAN LETTER AN
+2D00 ; [.17E5.0020.0002.2D00] # GEORGIAN SMALL LETTER AN
+10A0 ; [.17E5.0020.0008.10A0] # GEORGIAN CAPITAL LETTER AN
+10D1 ; [.17E6.0020.0002.10D1] # GEORGIAN LETTER BAN
+2D01 ; [.17E7.0020.0002.2D01] # GEORGIAN SMALL LETTER BAN
+10A1 ; [.17E7.0020.0008.10A1] # GEORGIAN CAPITAL LETTER BAN
+10D2 ; [.17E8.0020.0002.10D2] # GEORGIAN LETTER GAN
+2D02 ; [.17E9.0020.0002.2D02] # GEORGIAN SMALL LETTER GAN
+10A2 ; [.17E9.0020.0008.10A2] # GEORGIAN CAPITAL LETTER GAN
+10D3 ; [.17EA.0020.0002.10D3] # GEORGIAN LETTER DON
+2D03 ; [.17EB.0020.0002.2D03] # GEORGIAN SMALL LETTER DON
+10A3 ; [.17EB.0020.0008.10A3] # GEORGIAN CAPITAL LETTER DON
+10D4 ; [.17EC.0020.0002.10D4] # GEORGIAN LETTER EN
+2D04 ; [.17ED.0020.0002.2D04] # GEORGIAN SMALL LETTER EN
+10A4 ; [.17ED.0020.0008.10A4] # GEORGIAN CAPITAL LETTER EN
+10D5 ; [.17EE.0020.0002.10D5] # GEORGIAN LETTER VIN
+2D05 ; [.17EF.0020.0002.2D05] # GEORGIAN SMALL LETTER VIN
+10A5 ; [.17EF.0020.0008.10A5] # GEORGIAN CAPITAL LETTER VIN
+10D6 ; [.17F0.0020.0002.10D6] # GEORGIAN LETTER ZEN
+2D06 ; [.17F1.0020.0002.2D06] # GEORGIAN SMALL LETTER ZEN
+10A6 ; [.17F1.0020.0008.10A6] # GEORGIAN CAPITAL LETTER ZEN
+10F1 ; [.17F2.0020.0002.10F1] # GEORGIAN LETTER HE
+2D21 ; [.17F3.0020.0002.2D21] # GEORGIAN SMALL LETTER HE
+10C1 ; [.17F3.0020.0008.10C1] # GEORGIAN CAPITAL LETTER HE
+10D7 ; [.17F4.0020.0002.10D7] # GEORGIAN LETTER TAN
+2D07 ; [.17F5.0020.0002.2D07] # GEORGIAN SMALL LETTER TAN
+10A7 ; [.17F5.0020.0008.10A7] # GEORGIAN CAPITAL LETTER TAN
+10D8 ; [.17F6.0020.0002.10D8] # GEORGIAN LETTER IN
+2D08 ; [.17F7.0020.0002.2D08] # GEORGIAN SMALL LETTER IN
+10A8 ; [.17F7.0020.0008.10A8] # GEORGIAN CAPITAL LETTER IN
+10D9 ; [.17F8.0020.0002.10D9] # GEORGIAN LETTER KAN
+2D09 ; [.17F9.0020.0002.2D09] # GEORGIAN SMALL LETTER KAN
+10A9 ; [.17F9.0020.0008.10A9] # GEORGIAN CAPITAL LETTER KAN
+10DA ; [.17FA.0020.0002.10DA] # GEORGIAN LETTER LAS
+2D0A ; [.17FB.0020.0002.2D0A] # GEORGIAN SMALL LETTER LAS
+10AA ; [.17FB.0020.0008.10AA] # GEORGIAN CAPITAL LETTER LAS
+10DB ; [.17FC.0020.0002.10DB] # GEORGIAN LETTER MAN
+2D0B ; [.17FD.0020.0002.2D0B] # GEORGIAN SMALL LETTER MAN
+10AB ; [.17FD.0020.0008.10AB] # GEORGIAN CAPITAL LETTER MAN
+10DC ; [.17FE.0020.0002.10DC] # GEORGIAN LETTER NAR
+10FC ; [.17FE.0020.0014.10FC] # MODIFIER LETTER GEORGIAN NAR; QQK
+2D0C ; [.17FF.0020.0002.2D0C] # GEORGIAN SMALL LETTER NAR
+10AC ; [.17FF.0020.0008.10AC] # GEORGIAN CAPITAL LETTER NAR
+10F2 ; [.1800.0020.0002.10F2] # GEORGIAN LETTER HIE
+2D22 ; [.1801.0020.0002.2D22] # GEORGIAN SMALL LETTER HIE
+10C2 ; [.1801.0020.0008.10C2] # GEORGIAN CAPITAL LETTER HIE
+10DD ; [.1802.0020.0002.10DD] # GEORGIAN LETTER ON
+2D0D ; [.1803.0020.0002.2D0D] # GEORGIAN SMALL LETTER ON
+10AD ; [.1803.0020.0008.10AD] # GEORGIAN CAPITAL LETTER ON
+10DE ; [.1804.0020.0002.10DE] # GEORGIAN LETTER PAR
+2D0E ; [.1805.0020.0002.2D0E] # GEORGIAN SMALL LETTER PAR
+10AE ; [.1805.0020.0008.10AE] # GEORGIAN CAPITAL LETTER PAR
+10DF ; [.1806.0020.0002.10DF] # GEORGIAN LETTER ZHAR
+2D0F ; [.1807.0020.0002.2D0F] # GEORGIAN SMALL LETTER ZHAR
+10AF ; [.1807.0020.0008.10AF] # GEORGIAN CAPITAL LETTER ZHAR
+10E0 ; [.1808.0020.0002.10E0] # GEORGIAN LETTER RAE
+2D10 ; [.1809.0020.0002.2D10] # GEORGIAN SMALL LETTER RAE
+10B0 ; [.1809.0020.0008.10B0] # GEORGIAN CAPITAL LETTER RAE
+10E1 ; [.180A.0020.0002.10E1] # GEORGIAN LETTER SAN
+2D11 ; [.180B.0020.0002.2D11] # GEORGIAN SMALL LETTER SAN
+10B1 ; [.180B.0020.0008.10B1] # GEORGIAN CAPITAL LETTER SAN
+10E2 ; [.180C.0020.0002.10E2] # GEORGIAN LETTER TAR
+2D12 ; [.180D.0020.0002.2D12] # GEORGIAN SMALL LETTER TAR
+10B2 ; [.180D.0020.0008.10B2] # GEORGIAN CAPITAL LETTER TAR
+10F3 ; [.180E.0020.0002.10F3] # GEORGIAN LETTER WE
+2D23 ; [.180F.0020.0002.2D23] # GEORGIAN SMALL LETTER WE
+10C3 ; [.180F.0020.0008.10C3] # GEORGIAN CAPITAL LETTER WE
+10E3 ; [.1810.0020.0002.10E3] # GEORGIAN LETTER UN
+2D13 ; [.1811.0020.0002.2D13] # GEORGIAN SMALL LETTER UN
+10B3 ; [.1811.0020.0008.10B3] # GEORGIAN CAPITAL LETTER UN
+10E4 ; [.1812.0020.0002.10E4] # GEORGIAN LETTER PHAR
+2D14 ; [.1813.0020.0002.2D14] # GEORGIAN SMALL LETTER PHAR
+10B4 ; [.1813.0020.0008.10B4] # GEORGIAN CAPITAL LETTER PHAR
+10E5 ; [.1814.0020.0002.10E5] # GEORGIAN LETTER KHAR
+2D15 ; [.1815.0020.0002.2D15] # GEORGIAN SMALL LETTER KHAR
+10B5 ; [.1815.0020.0008.10B5] # GEORGIAN CAPITAL LETTER KHAR
+10E6 ; [.1816.0020.0002.10E6] # GEORGIAN LETTER GHAN
+2D16 ; [.1817.0020.0002.2D16] # GEORGIAN SMALL LETTER GHAN
+10B6 ; [.1817.0020.0008.10B6] # GEORGIAN CAPITAL LETTER GHAN
+10E7 ; [.1818.0020.0002.10E7] # GEORGIAN LETTER QAR
+2D17 ; [.1819.0020.0002.2D17] # GEORGIAN SMALL LETTER QAR
+10B7 ; [.1819.0020.0008.10B7] # GEORGIAN CAPITAL LETTER QAR
+10E8 ; [.181A.0020.0002.10E8] # GEORGIAN LETTER SHIN
+2D18 ; [.181B.0020.0002.2D18] # GEORGIAN SMALL LETTER SHIN
+10B8 ; [.181B.0020.0008.10B8] # GEORGIAN CAPITAL LETTER SHIN
+10E9 ; [.181C.0020.0002.10E9] # GEORGIAN LETTER CHIN
+2D19 ; [.181D.0020.0002.2D19] # GEORGIAN SMALL LETTER CHIN
+10B9 ; [.181D.0020.0008.10B9] # GEORGIAN CAPITAL LETTER CHIN
+10EA ; [.181E.0020.0002.10EA] # GEORGIAN LETTER CAN
+2D1A ; [.181F.0020.0002.2D1A] # GEORGIAN SMALL LETTER CAN
+10BA ; [.181F.0020.0008.10BA] # GEORGIAN CAPITAL LETTER CAN
+10EB ; [.1820.0020.0002.10EB] # GEORGIAN LETTER JIL
+2D1B ; [.1821.0020.0002.2D1B] # GEORGIAN SMALL LETTER JIL
+10BB ; [.1821.0020.0008.10BB] # GEORGIAN CAPITAL LETTER JIL
+10EC ; [.1822.0020.0002.10EC] # GEORGIAN LETTER CIL
+2D1C ; [.1823.0020.0002.2D1C] # GEORGIAN SMALL LETTER CIL
+10BC ; [.1823.0020.0008.10BC] # GEORGIAN CAPITAL LETTER CIL
+10ED ; [.1824.0020.0002.10ED] # GEORGIAN LETTER CHAR
+2D1D ; [.1825.0020.0002.2D1D] # GEORGIAN SMALL LETTER CHAR
+10BD ; [.1825.0020.0008.10BD] # GEORGIAN CAPITAL LETTER CHAR
+10EE ; [.1826.0020.0002.10EE] # GEORGIAN LETTER XAN
+2D1E ; [.1827.0020.0002.2D1E] # GEORGIAN SMALL LETTER XAN
+10BE ; [.1827.0020.0008.10BE] # GEORGIAN CAPITAL LETTER XAN
+10F4 ; [.1828.0020.0002.10F4] # GEORGIAN LETTER HAR
+2D24 ; [.1829.0020.0002.2D24] # GEORGIAN SMALL LETTER HAR
+10C4 ; [.1829.0020.0008.10C4] # GEORGIAN CAPITAL LETTER HAR
+10EF ; [.182A.0020.0002.10EF] # GEORGIAN LETTER JHAN
+2D1F ; [.182B.0020.0002.2D1F] # GEORGIAN SMALL LETTER JHAN
+10BF ; [.182B.0020.0008.10BF] # GEORGIAN CAPITAL LETTER JHAN
+10F0 ; [.182C.0020.0002.10F0] # GEORGIAN LETTER HAE
+2D20 ; [.182D.0020.0002.2D20] # GEORGIAN SMALL LETTER HAE
+10C0 ; [.182D.0020.0008.10C0] # GEORGIAN CAPITAL LETTER HAE
+10F5 ; [.182E.0020.0002.10F5] # GEORGIAN LETTER HOE
+2D25 ; [.182F.0020.0002.2D25] # GEORGIAN SMALL LETTER HOE
+10C5 ; [.182F.0020.0008.10C5] # GEORGIAN CAPITAL LETTER HOE
+10F6 ; [.1830.0020.0002.10F6] # GEORGIAN LETTER FI
+10F7 ; [.1831.0020.0002.10F7] # GEORGIAN LETTER YN
+10F8 ; [.1832.0020.0002.10F8] # GEORGIAN LETTER ELIFI
+10F9 ; [.1833.0020.0002.10F9] # GEORGIAN LETTER TURNED GAN
+10FA ; [.1834.0020.0002.10FA] # GEORGIAN LETTER AIN
+0561 ; [.1835.0020.0002.0561] # ARMENIAN SMALL LETTER AYB
+0531 ; [.1835.0020.0008.0531] # ARMENIAN CAPITAL LETTER AYB
+0562 ; [.1836.0020.0002.0562] # ARMENIAN SMALL LETTER BEN
+0532 ; [.1836.0020.0008.0532] # ARMENIAN CAPITAL LETTER BEN
+0563 ; [.1837.0020.0002.0563] # ARMENIAN SMALL LETTER GIM
+0533 ; [.1837.0020.0008.0533] # ARMENIAN CAPITAL LETTER GIM
+0564 ; [.1838.0020.0002.0564] # ARMENIAN SMALL LETTER DA
+0534 ; [.1838.0020.0008.0534] # ARMENIAN CAPITAL LETTER DA
+0565 ; [.1839.0020.0002.0565] # ARMENIAN SMALL LETTER ECH
+0535 ; [.1839.0020.0008.0535] # ARMENIAN CAPITAL LETTER ECH
+0587 ; [.1839.0020.0004.0587][.1856.0020.0004.0587] # ARMENIAN SMALL LIGATURE ECH YIWN; QQKN
+0566 ; [.183A.0020.0002.0566] # ARMENIAN SMALL LETTER ZA
+0536 ; [.183A.0020.0008.0536] # ARMENIAN CAPITAL LETTER ZA
+0567 ; [.183B.0020.0002.0567] # ARMENIAN SMALL LETTER EH
+0537 ; [.183B.0020.0008.0537] # ARMENIAN CAPITAL LETTER EH
+0568 ; [.183C.0020.0002.0568] # ARMENIAN SMALL LETTER ET
+0538 ; [.183C.0020.0008.0538] # ARMENIAN CAPITAL LETTER ET
+0569 ; [.183D.0020.0002.0569] # ARMENIAN SMALL LETTER TO
+0539 ; [.183D.0020.0008.0539] # ARMENIAN CAPITAL LETTER TO
+056A ; [.183E.0020.0002.056A] # ARMENIAN SMALL LETTER ZHE
+053A ; [.183E.0020.0008.053A] # ARMENIAN CAPITAL LETTER ZHE
+056B ; [.183F.0020.0002.056B] # ARMENIAN SMALL LETTER INI
+053B ; [.183F.0020.0008.053B] # ARMENIAN CAPITAL LETTER INI
+056C ; [.1840.0020.0002.056C] # ARMENIAN SMALL LETTER LIWN
+053C ; [.1840.0020.0008.053C] # ARMENIAN CAPITAL LETTER LIWN
+056D ; [.1841.0020.0002.056D] # ARMENIAN SMALL LETTER XEH
+053D ; [.1841.0020.0008.053D] # ARMENIAN CAPITAL LETTER XEH
+056E ; [.1842.0020.0002.056E] # ARMENIAN SMALL LETTER CA
+053E ; [.1842.0020.0008.053E] # ARMENIAN CAPITAL LETTER CA
+056F ; [.1843.0020.0002.056F] # ARMENIAN SMALL LETTER KEN
+053F ; [.1843.0020.0008.053F] # ARMENIAN CAPITAL LETTER KEN
+0570 ; [.1844.0020.0002.0570] # ARMENIAN SMALL LETTER HO
+0540 ; [.1844.0020.0008.0540] # ARMENIAN CAPITAL LETTER HO
+0571 ; [.1845.0020.0002.0571] # ARMENIAN SMALL LETTER JA
+0541 ; [.1845.0020.0008.0541] # ARMENIAN CAPITAL LETTER JA
+0572 ; [.1846.0020.0002.0572] # ARMENIAN SMALL LETTER GHAD
+0542 ; [.1846.0020.0008.0542] # ARMENIAN CAPITAL LETTER GHAD
+0573 ; [.1847.0020.0002.0573] # ARMENIAN SMALL LETTER CHEH
+0543 ; [.1847.0020.0008.0543] # ARMENIAN CAPITAL LETTER CHEH
+0574 ; [.1848.0020.0002.0574] # ARMENIAN SMALL LETTER MEN
+0544 ; [.1848.0020.0008.0544] # ARMENIAN CAPITAL LETTER MEN
+FB14 ; [.1848.0020.0004.FB14][.1839.0020.0004.FB14] # ARMENIAN SMALL LIGATURE MEN ECH; QQKN
+FB15 ; [.1848.0020.0004.FB15][.183F.0020.0004.FB15] # ARMENIAN SMALL LIGATURE MEN INI; QQKN
+FB17 ; [.1848.0020.0004.FB17][.1841.0020.0004.FB17] # ARMENIAN SMALL LIGATURE MEN XEH; QQKN
+FB13 ; [.1848.0020.0004.FB13][.184A.0020.0004.FB13] # ARMENIAN SMALL LIGATURE MEN NOW; QQKN
+0575 ; [.1849.0020.0002.0575] # ARMENIAN SMALL LETTER YI
+0545 ; [.1849.0020.0008.0545] # ARMENIAN CAPITAL LETTER YI
+0576 ; [.184A.0020.0002.0576] # ARMENIAN SMALL LETTER NOW
+0546 ; [.184A.0020.0008.0546] # ARMENIAN CAPITAL LETTER NOW
+0577 ; [.184B.0020.0002.0577] # ARMENIAN SMALL LETTER SHA
+0547 ; [.184B.0020.0008.0547] # ARMENIAN CAPITAL LETTER SHA
+0578 ; [.184C.0020.0002.0578] # ARMENIAN SMALL LETTER VO
+0548 ; [.184C.0020.0008.0548] # ARMENIAN CAPITAL LETTER VO
+0579 ; [.184D.0020.0002.0579] # ARMENIAN SMALL LETTER CHA
+0549 ; [.184D.0020.0008.0549] # ARMENIAN CAPITAL LETTER CHA
+057A ; [.184E.0020.0002.057A] # ARMENIAN SMALL LETTER PEH
+054A ; [.184E.0020.0008.054A] # ARMENIAN CAPITAL LETTER PEH
+057B ; [.184F.0020.0002.057B] # ARMENIAN SMALL LETTER JHEH
+054B ; [.184F.0020.0008.054B] # ARMENIAN CAPITAL LETTER JHEH
+057C ; [.1850.0020.0002.057C] # ARMENIAN SMALL LETTER RA
+054C ; [.1850.0020.0008.054C] # ARMENIAN CAPITAL LETTER RA
+057D ; [.1851.0020.0002.057D] # ARMENIAN SMALL LETTER SEH
+054D ; [.1851.0020.0008.054D] # ARMENIAN CAPITAL LETTER SEH
+057E ; [.1852.0020.0002.057E] # ARMENIAN SMALL LETTER VEW
+054E ; [.1852.0020.0008.054E] # ARMENIAN CAPITAL LETTER VEW
+FB16 ; [.1852.0020.0004.FB16][.184A.0020.0004.FB16] # ARMENIAN SMALL LIGATURE VEW NOW; QQKN
+057F ; [.1853.0020.0002.057F] # ARMENIAN SMALL LETTER TIWN
+054F ; [.1853.0020.0008.054F] # ARMENIAN CAPITAL LETTER TIWN
+0580 ; [.1854.0020.0002.0580] # ARMENIAN SMALL LETTER REH
+0550 ; [.1854.0020.0008.0550] # ARMENIAN CAPITAL LETTER REH
+0581 ; [.1855.0020.0002.0581] # ARMENIAN SMALL LETTER CO
+0551 ; [.1855.0020.0008.0551] # ARMENIAN CAPITAL LETTER CO
+0582 ; [.1856.0020.0002.0582] # ARMENIAN SMALL LETTER YIWN
+0552 ; [.1856.0020.0008.0552] # ARMENIAN CAPITAL LETTER YIWN
+0583 ; [.1857.0020.0002.0583] # ARMENIAN SMALL LETTER PIWR
+0553 ; [.1857.0020.0008.0553] # ARMENIAN CAPITAL LETTER PIWR
+0584 ; [.1858.0020.0002.0584] # ARMENIAN SMALL LETTER KEH
+0554 ; [.1858.0020.0008.0554] # ARMENIAN CAPITAL LETTER KEH
+0585 ; [.1859.0020.0002.0585] # ARMENIAN SMALL LETTER OH
+0555 ; [.1859.0020.0008.0555] # ARMENIAN CAPITAL LETTER OH
+0586 ; [.185A.0020.0002.0586] # ARMENIAN SMALL LETTER FEH
+0556 ; [.185A.0020.0008.0556] # ARMENIAN CAPITAL LETTER FEH
+0559 ; [.185B.0020.0002.0559] # ARMENIAN MODIFIER LETTER LEFT HALF RING
+05D0 ; [.185C.0020.0002.05D0] # HEBREW LETTER ALEF
+2135 ; [.185C.0020.0004.2135] # ALEF SYMBOL; QQK
+FB21 ; [.185C.0020.0005.FB21] # HEBREW LETTER WIDE ALEF; QQK
+FB2E ; [.185C.0020.0002.05D0][.0000.008C.0002.05B7] # HEBREW LETTER ALEF WITH PATAH; QQCM
+FB2F ; [.185C.0020.0002.05D0][.0000.008D.0002.05B8] # HEBREW LETTER ALEF WITH QAMATS; QQCM
+FB30 ; [.185C.0020.0002.05D0][.0000.0092.0002.05BC] # HEBREW LETTER ALEF WITH MAPIQ; QQCM
+FB4F ; [.185C.0020.0004.FB4F][.1867.0020.0004.FB4F] # HEBREW LIGATURE ALEF LAMED; QQKN
+05D1 ; [.185D.0020.0002.05D1] # HEBREW LETTER BET
+2136 ; [.185D.0020.0004.2136] # BET SYMBOL; QQK
+FB31 ; [.185D.0020.0002.05D1][.0000.0092.0002.05BC] # HEBREW LETTER BET WITH DAGESH; QQCM
+FB4C ; [.185D.0020.0002.05D1][.0000.0095.0002.05BF] # HEBREW LETTER BET WITH RAFE; QQCM
+05D2 ; [.185E.0020.0002.05D2] # HEBREW LETTER GIMEL
+2137 ; [.185E.0020.0004.2137] # GIMEL SYMBOL; QQK
+FB32 ; [.185E.0020.0002.05D2][.0000.0092.0002.05BC] # HEBREW LETTER GIMEL WITH DAGESH; QQCM
+05D3 ; [.185F.0020.0002.05D3] # HEBREW LETTER DALET
+2138 ; [.185F.0020.0004.2138] # DALET SYMBOL; QQK
+FB22 ; [.185F.0020.0005.FB22] # HEBREW LETTER WIDE DALET; QQK
+FB33 ; [.185F.0020.0002.05D3][.0000.0092.0002.05BC] # HEBREW LETTER DALET WITH DAGESH; QQCM
+05D4 ; [.1860.0020.0002.05D4] # HEBREW LETTER HE
+FB23 ; [.1860.0020.0005.FB23] # HEBREW LETTER WIDE HE; QQK
+FB34 ; [.1860.0020.0002.05D4][.0000.0092.0002.05BC] # HEBREW LETTER HE WITH MAPIQ; QQCM
+05D5 ; [.1861.0020.0002.05D5] # HEBREW LETTER VAV
+FB4B ; [.1861.0020.0002.05D5][.0000.008E.0002.05B9] # HEBREW LETTER VAV WITH HOLAM; QQCM
+FB35 ; [.1861.0020.0002.05D5][.0000.0092.0002.05BC] # HEBREW LETTER VAV WITH DAGESH; QQCM
+05F0 ; [.1861.0020.0004.05F0][.1861.0020.0004.05F0] # HEBREW LIGATURE YIDDISH DOUBLE VAV; QQKN
+05F1 ; [.1861.0020.0004.05F1][.1865.0020.0004.05F1] # HEBREW LIGATURE YIDDISH VAV YOD; QQKN
+05D6 ; [.1862.0020.0002.05D6] # HEBREW LETTER ZAYIN
+FB36 ; [.1862.0020.0002.05D6][.0000.0092.0002.05BC] # HEBREW LETTER ZAYIN WITH DAGESH; QQCM
+05D7 ; [.1863.0020.0002.05D7] # HEBREW LETTER HET
+05D8 ; [.1864.0020.0002.05D8] # HEBREW LETTER TET
+FB38 ; [.1864.0020.0002.05D8][.0000.0092.0002.05BC] # HEBREW LETTER TET WITH DAGESH; QQCM
+05D9 ; [.1865.0020.0002.05D9] # HEBREW LETTER YOD
+FB1D ; [.1865.0020.0002.05D9][.0000.0089.0002.05B4] # HEBREW LETTER YOD WITH HIRIQ; QQCM
+FB39 ; [.1865.0020.0002.05D9][.0000.0092.0002.05BC] # HEBREW LETTER YOD WITH DAGESH; QQCM
+05F2 ; [.1865.0020.0004.05F2][.1865.0020.0004.05F2] # HEBREW LIGATURE YIDDISH DOUBLE YOD; QQKN
+FB1F ; [.1865.0020.0004.FB1F][.1865.0020.0004.FB1F][.0000.008C.0002.FB1F] # HEBREW LIGATURE YIDDISH YOD YOD PATAH; QQKN
+05DB ; [.1866.0020.0002.05DB] # HEBREW LETTER KAF
+FB24 ; [.1866.0020.0005.FB24] # HEBREW LETTER WIDE KAF; QQK
+05DA ; [.1866.0020.0019.05DA] # HEBREW LETTER FINAL KAF; QQK
+FB3B ; [.1866.0020.0002.05DB][.0000.0092.0002.05BC] # HEBREW LETTER KAF WITH DAGESH; QQCM
+FB3A ; [.1866.0020.0019.FB3A][.0000.0092.0002.FB3A] # HEBREW LETTER FINAL KAF WITH DAGESH; QQKN
+FB4D ; [.1866.0020.0002.05DB][.0000.0095.0002.05BF] # HEBREW LETTER KAF WITH RAFE; QQCM
+05DC ; [.1867.0020.0002.05DC] # HEBREW LETTER LAMED
+FB25 ; [.1867.0020.0005.FB25] # HEBREW LETTER WIDE LAMED; QQK
+FB3C ; [.1867.0020.0002.05DC][.0000.0092.0002.05BC] # HEBREW LETTER LAMED WITH DAGESH; QQCM
+05DE ; [.1868.0020.0002.05DE] # HEBREW LETTER MEM
+FB26 ; [.1868.0020.0005.FB26] # HEBREW LETTER WIDE FINAL MEM; QQK
+05DD ; [.1868.0020.0019.05DD] # HEBREW LETTER FINAL MEM; QQK
+FB3E ; [.1868.0020.0002.05DE][.0000.0092.0002.05BC] # HEBREW LETTER MEM WITH DAGESH; QQCM
+05E0 ; [.1869.0020.0002.05E0] # HEBREW LETTER NUN
+05DF ; [.1869.0020.0019.05DF] # HEBREW LETTER FINAL NUN; QQK
+FB40 ; [.1869.0020.0002.05E0][.0000.0092.0002.05BC] # HEBREW LETTER NUN WITH DAGESH; QQCM
+05E1 ; [.186A.0020.0002.05E1] # HEBREW LETTER SAMEKH
+FB41 ; [.186A.0020.0002.05E1][.0000.0092.0002.05BC] # HEBREW LETTER SAMEKH WITH DAGESH; QQCM
+05E2 ; [.186B.0020.0002.05E2] # HEBREW LETTER AYIN
+FB20 ; [.186B.0020.0005.FB20] # HEBREW LETTER ALTERNATIVE AYIN; QQK
+05E4 ; [.186C.0020.0002.05E4] # HEBREW LETTER PE
+05E3 ; [.186C.0020.0019.05E3] # HEBREW LETTER FINAL PE; QQK
+FB44 ; [.186C.0020.0002.05E4][.0000.0092.0002.05BC] # HEBREW LETTER PE WITH DAGESH; QQCM
+FB43 ; [.186C.0020.0019.FB43][.0000.0092.0002.FB43] # HEBREW LETTER FINAL PE WITH DAGESH; QQKN
+FB4E ; [.186C.0020.0002.05E4][.0000.0095.0002.05BF] # HEBREW LETTER PE WITH RAFE; QQCM
+05E6 ; [.186D.0020.0002.05E6] # HEBREW LETTER TSADI
+05E5 ; [.186D.0020.0019.05E5] # HEBREW LETTER FINAL TSADI; QQK
+FB46 ; [.186D.0020.0002.05E6][.0000.0092.0002.05BC] # HEBREW LETTER TSADI WITH DAGESH; QQCM
+05E7 ; [.186E.0020.0002.05E7] # HEBREW LETTER QOF
+FB47 ; [.186E.0020.0002.05E7][.0000.0092.0002.05BC] # HEBREW LETTER QOF WITH DAGESH; QQCM
+05E8 ; [.186F.0020.0002.05E8] # HEBREW LETTER RESH
+FB27 ; [.186F.0020.0005.FB27] # HEBREW LETTER WIDE RESH; QQK
+FB48 ; [.186F.0020.0002.05E8][.0000.0092.0002.05BC] # HEBREW LETTER RESH WITH DAGESH; QQCM
+05E9 ; [.1870.0020.0002.05E9] # HEBREW LETTER SHIN
+FB2B ; [.1870.0020.0002.05E9][.0000.0090.0002.05C2] # HEBREW LETTER SHIN WITH SIN DOT; QQCM
+FB2A ; [.1870.0020.0002.05E9][.0000.0091.0002.05C1] # HEBREW LETTER SHIN WITH SHIN DOT; QQCM
+FB49 ; [.1870.0020.0002.05E9][.0000.0092.0002.05BC] # HEBREW LETTER SHIN WITH DAGESH; QQCM
+FB2D ; [.1870.0020.0002.05E9][.0000.0092.0002.05BC][.0000.0090.0002.05C2] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT; QQCM
+FB2C ; [.1870.0020.0002.05E9][.0000.0092.0002.05BC][.0000.0091.0002.05C1] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT; QQCM
+05EA ; [.1871.0020.0002.05EA] # HEBREW LETTER TAV
+FB28 ; [.1871.0020.0005.FB28] # HEBREW LETTER WIDE TAV; QQK
+FB4A ; [.1871.0020.0002.05EA][.0000.0092.0002.05BC] # HEBREW LETTER TAV WITH DAGESH; QQCM
+10900 ; [.1872.0020.0002.10900] # PHOENICIAN LETTER ALF
+10901 ; [.1873.0020.0002.10901] # PHOENICIAN LETTER BET
+10902 ; [.1874.0020.0002.10902] # PHOENICIAN LETTER GAML
+10903 ; [.1875.0020.0002.10903] # PHOENICIAN LETTER DELT
+10904 ; [.1876.0020.0002.10904] # PHOENICIAN LETTER HE
+10905 ; [.1877.0020.0002.10905] # PHOENICIAN LETTER WAU
+10906 ; [.1878.0020.0002.10906] # PHOENICIAN LETTER ZAI
+10907 ; [.1879.0020.0002.10907] # PHOENICIAN LETTER HET
+10908 ; [.187A.0020.0002.10908] # PHOENICIAN LETTER TET
+10909 ; [.187B.0020.0002.10909] # PHOENICIAN LETTER YOD
+1090A ; [.187C.0020.0002.1090A] # PHOENICIAN LETTER KAF
+1090B ; [.187D.0020.0002.1090B] # PHOENICIAN LETTER LAMD
+1090C ; [.187E.0020.0002.1090C] # PHOENICIAN LETTER MEM
+1090D ; [.187F.0020.0002.1090D] # PHOENICIAN LETTER NUN
+1090E ; [.1880.0020.0002.1090E] # PHOENICIAN LETTER SEMK
+1090F ; [.1881.0020.0002.1090F] # PHOENICIAN LETTER AIN
+10910 ; [.1882.0020.0002.10910] # PHOENICIAN LETTER PE
+10911 ; [.1883.0020.0002.10911] # PHOENICIAN LETTER SADE
+10912 ; [.1884.0020.0002.10912] # PHOENICIAN LETTER QOF
+10913 ; [.1885.0020.0002.10913] # PHOENICIAN LETTER ROSH
+10914 ; [.1886.0020.0002.10914] # PHOENICIAN LETTER SHIN
+10915 ; [.1887.0020.0002.10915] # PHOENICIAN LETTER TAU
+0800 ; [.1888.0020.0002.0800] # SAMARITAN LETTER ALAF
+0801 ; [.1889.0020.0002.0801] # SAMARITAN LETTER BIT
+0802 ; [.188A.0020.0002.0802] # SAMARITAN LETTER GAMAN
+0803 ; [.188B.0020.0002.0803] # SAMARITAN LETTER DALAT
+0804 ; [.188C.0020.0002.0804] # SAMARITAN LETTER IY
+0805 ; [.188D.0020.0002.0805] # SAMARITAN LETTER BAA
+0806 ; [.188E.0020.0002.0806] # SAMARITAN LETTER ZEN
+0807 ; [.188F.0020.0002.0807] # SAMARITAN LETTER IT
+0808 ; [.1890.0020.0002.0808] # SAMARITAN LETTER TIT
+0809 ; [.1891.0020.0002.0809] # SAMARITAN LETTER YUT
+080A ; [.1892.0020.0002.080A] # SAMARITAN LETTER KAAF
+080B ; [.1893.0020.0002.080B] # SAMARITAN LETTER LABAT
+080C ; [.1894.0020.0002.080C] # SAMARITAN LETTER MIM
+080D ; [.1895.0020.0002.080D] # SAMARITAN LETTER NUN
+080E ; [.1896.0020.0002.080E] # SAMARITAN LETTER SINGAAT
+080F ; [.1897.0020.0002.080F] # SAMARITAN LETTER IN
+0810 ; [.1898.0020.0002.0810] # SAMARITAN LETTER FI
+0811 ; [.1899.0020.0002.0811] # SAMARITAN LETTER TSAADIY
+0812 ; [.189A.0020.0002.0812] # SAMARITAN LETTER QUF
+0813 ; [.189B.0020.0002.0813] # SAMARITAN LETTER RISH
+0814 ; [.189C.0020.0002.0814] # SAMARITAN LETTER SHAN
+0815 ; [.189D.0020.0002.0815] # SAMARITAN LETTER TAAF
+0816 ; [.189E.0020.0002.0816] # SAMARITAN MARK IN
+0817 ; [.189F.0020.0002.0817] # SAMARITAN MARK IN-ALAF
+081A ; [.18A0.0020.0002.081A] # SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+081B ; [.18A1.0020.0002.081B] # SAMARITAN MARK EPENTHETIC YUT
+0621 ; [.18A2.0020.0002.0621] # ARABIC LETTER HAMZA
+0674 ; [.18A2.0020.0004.0674] # ARABIC LETTER HIGH HAMZA; QQK
+FE80 ; [.18A2.0020.001A.FE80] # ARABIC LETTER HAMZA ISOLATED FORM; QQK
+06FD ; [.18A2.0020.0004.06FD][.0000.015A.0004.06FD] # ARABIC SIGN SINDHI AMPERSAND; QQKN
+0622 ; [.18A3.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE
+0627 0653 ; [.18A3.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE
+FE82 ; [.18A3.0020.0019.FE82] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM; QQK
+FE81 ; [.18A3.0020.001A.FE81] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM; QQK
+0623 ; [.18A4.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0627 0654 ; [.18A4.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE
+FE84 ; [.18A4.0020.0019.FE84] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM; QQK
+FE83 ; [.18A4.0020.001A.FE83] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM; QQK
+0672 ; [.18A5.0020.0002.0672] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0671 ; [.18A6.0020.0002.0671] # ARABIC LETTER ALEF WASLA
+FB51 ; [.18A6.0020.0019.FB51] # ARABIC LETTER ALEF WASLA FINAL FORM; QQK
+FB50 ; [.18A6.0020.001A.FB50] # ARABIC LETTER ALEF WASLA ISOLATED FORM; QQK
+0624 ; [.18A7.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE
+0648 0654 ; [.18A7.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE
+FE86 ; [.18A7.0020.0019.FE86] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM; QQK
+FE85 ; [.18A7.0020.001A.FE85] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM; QQK
+0625 ; [.18A8.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW
+0627 0655 ; [.18A8.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW
+FE88 ; [.18A8.0020.0019.FE88] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM; QQK
+FE87 ; [.18A8.0020.001A.FE87] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM; QQK
+0673 ; [.18A9.0020.0002.0673] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0773 ; [.18AA.0020.0002.0773] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0774 ; [.18AB.0020.0002.0774] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0626 ; [.18AC.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE
+064A 0654 ; [.18AC.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE
+FE8B ; [.18AC.0020.0017.FE8B] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM; QQK
+FE8C ; [.18AC.0020.0018.FE8C] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM; QQK
+FE8A ; [.18AC.0020.0019.FE8A] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM; QQK
+FE89 ; [.18AC.0020.001A.FE89] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM; QQK
+FBEB ; [.18AC.0020.0019.FBEB][.18AD.0020.0019.FBEB] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM; QQKN
+FBEA ; [.18AC.0020.001A.FBEA][.18AD.0020.001A.FBEA] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM; QQKN
+FC97 ; [.18AC.0020.0017.FC97][.18C2.0020.0017.FC97] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM; QQKN
+FC00 ; [.18AC.0020.001A.FC00][.18C2.0020.001A.FC00] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM; QQKN
+FC98 ; [.18AC.0020.0017.FC98][.18C8.0020.0017.FC98] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM; QQKN
+FC01 ; [.18AC.0020.001A.FC01][.18C8.0020.001A.FC01] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM; QQKN
+FC99 ; [.18AC.0020.0017.FC99][.18C9.0020.0017.FC99] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM; QQKN
+FC64 ; [.18AC.0020.0019.FC64][.18E1.0020.0019.FC64] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM; QQKN
+FC65 ; [.18AC.0020.0019.FC65][.18E2.0020.0019.FC65] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM; QQKN
+FC9A ; [.18AC.0020.0017.FC9A][.1931.0020.0017.FC9A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM; QQKN
+FCDF ; [.18AC.0020.0018.FCDF][.1931.0020.0018.FCDF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM; QQKN
+FC66 ; [.18AC.0020.0019.FC66][.1931.0020.0019.FC66] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM; QQKN
+FC02 ; [.18AC.0020.001A.FC02][.1931.0020.001A.FC02] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM; QQKN
+FC67 ; [.18AC.0020.0019.FC67][.1934.0020.0019.FC67] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM; QQKN
+FC9B ; [.18AC.0020.0017.FC9B][.193D.0020.0017.FC9B] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM; QQKN
+FCE0 ; [.18AC.0020.0018.FCE0][.193D.0020.0018.FCE0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM; QQKN
+FBED ; [.18AC.0020.0019.FBED][.1942.0020.0019.FBED] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM; QQKN
+FBEC ; [.18AC.0020.001A.FBEC][.1942.0020.001A.FBEC] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM; QQKN
+FBEF ; [.18AC.0020.0019.FBEF][.1943.0020.0019.FBEF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM; QQKN
+FBEE ; [.18AC.0020.001A.FBEE][.1943.0020.001A.FBEE] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM; QQKN
+FBF3 ; [.18AC.0020.0019.FBF3][.1946.0020.0019.FBF3] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM; QQKN
+FBF2 ; [.18AC.0020.001A.FBF2][.1946.0020.001A.FBF2] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM; QQKN
+FBF1 ; [.18AC.0020.0019.FBF1][.1947.0020.0019.FBF1] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM; QQKN
+FBF0 ; [.18AC.0020.001A.FBF0][.1947.0020.001A.FBF0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM; QQKN
+FBF5 ; [.18AC.0020.0019.FBF5][.1948.0020.0019.FBF5] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM; QQKN
+FBF4 ; [.18AC.0020.001A.FBF4][.1948.0020.001A.FBF4] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM; QQKN
+FBFB ; [.18AC.0020.0017.FBFB][.194F.0020.0017.FBFB] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM; QQKN
+FBFA ; [.18AC.0020.0019.FBFA][.194F.0020.0019.FBFA] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM; QQKN
+FC68 ; [.18AC.0020.0019.FC68][.194F.0020.0019.FC68] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM; QQKN
+FBF9 ; [.18AC.0020.001A.FBF9][.194F.0020.001A.FBF9] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC03 ; [.18AC.0020.001A.FC03][.194F.0020.001A.FC03] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC69 ; [.18AC.0020.0019.FC69][.1950.0020.0019.FC69] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM; QQKN
+FC04 ; [.18AC.0020.001A.FC04][.1950.0020.001A.FC04] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM; QQKN
+FBF8 ; [.18AC.0020.0017.FBF8][.1954.0020.0017.FBF8] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM; QQKN
+FBF7 ; [.18AC.0020.0019.FBF7][.1954.0020.0019.FBF7] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM; QQKN
+FBF6 ; [.18AC.0020.001A.FBF6][.1954.0020.001A.FBF6] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM; QQKN
+0627 ; [.18AD.0020.0002.0627] # ARABIC LETTER ALEF
+FE8E ; [.18AD.0020.0019.FE8E] # ARABIC LETTER ALEF FINAL FORM; QQK
+FE8D ; [.18AD.0020.001A.FE8D] # ARABIC LETTER ALEF ISOLATED FORM; QQK
+FD3C ; [.18AD.0020.0019.FD3C][.0000.00A2.0019.FD3C] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM; QQKN
+FD3D ; [.18AD.0020.001A.FD3D][.0000.00A2.001A.FD3D] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM; QQKN
+0675 ; [.18AD.0020.0004.0675][.18A2.0020.0004.0675] # ARABIC LETTER HIGH HAMZA ALEF; QQKN
+FDF3 ; [.18AD.0020.001A.FDF3][.1918.0020.001A.FDF3][.18AF.0020.001F.FDF3][.18E1.0020.001F.FDF3] # ARABIC LIGATURE AKBAR ISOLATED FORM; QQKN
+FDF2 ; [.18AD.0020.001A.FDF2][.192B.0020.001A.FDF2][.192B.0020.001F.FDF2][.193D.0020.001F.FDF2] # ARABIC LIGATURE ALLAH ISOLATED FORM; QQKN
+066E ; [.18AE.0020.0002.066E] # ARABIC LETTER DOTLESS BEH
+0628 ; [.18AF.0020.0002.0628] # ARABIC LETTER BEH
+FE91 ; [.18AF.0020.0017.FE91] # ARABIC LETTER BEH INITIAL FORM; QQK
+FE92 ; [.18AF.0020.0018.FE92] # ARABIC LETTER BEH MEDIAL FORM; QQK
+FE90 ; [.18AF.0020.0019.FE90] # ARABIC LETTER BEH FINAL FORM; QQK
+FE8F ; [.18AF.0020.001A.FE8F] # ARABIC LETTER BEH ISOLATED FORM; QQK
+FC9C ; [.18AF.0020.0017.FC9C][.18C2.0020.0017.FC9C] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM; QQKN
+FC05 ; [.18AF.0020.001A.FC05][.18C2.0020.001A.FC05] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM; QQKN
+FC9D ; [.18AF.0020.0017.FC9D][.18C8.0020.0017.FC9D] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM; QQKN
+FC06 ; [.18AF.0020.001A.FC06][.18C8.0020.001A.FC06] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM; QQKN
+FDC2 ; [.18AF.0020.0019.FDC2][.18C8.0020.0019.FDC2][.1950.0020.001F.FDC2] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM; QQKN
+FC9E ; [.18AF.0020.0017.FC9E][.18C9.0020.0017.FC9E] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM; QQKN
+FC07 ; [.18AF.0020.001A.FC07][.18C9.0020.001A.FC07] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM; QQKN
+FD9E ; [.18AF.0020.0019.FD9E][.18C9.0020.0019.FD9E][.1950.0020.001F.FD9E] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM; QQKN
+FC6A ; [.18AF.0020.0019.FC6A][.18E1.0020.0019.FC6A] # ARABIC LIGATURE BEH WITH REH FINAL FORM; QQKN
+FC6B ; [.18AF.0020.0019.FC6B][.18E2.0020.0019.FC6B] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM; QQKN
+FC9F ; [.18AF.0020.0017.FC9F][.1931.0020.0017.FC9F] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM; QQKN
+FCE1 ; [.18AF.0020.0018.FCE1][.1931.0020.0018.FCE1] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM; QQKN
+FC6C ; [.18AF.0020.0019.FC6C][.1931.0020.0019.FC6C] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM; QQKN
+FC08 ; [.18AF.0020.001A.FC08][.1931.0020.001A.FC08] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM; QQKN
+FC6D ; [.18AF.0020.0019.FC6D][.1934.0020.0019.FC6D] # ARABIC LIGATURE BEH WITH NOON FINAL FORM; QQKN
+FCA0 ; [.18AF.0020.0017.FCA0][.193D.0020.0017.FCA0] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM; QQKN
+FCE2 ; [.18AF.0020.0018.FCE2][.193D.0020.0018.FCE2] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM; QQKN
+FC6E ; [.18AF.0020.0019.FC6E][.194F.0020.0019.FC6E] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC09 ; [.18AF.0020.001A.FC09][.194F.0020.001A.FC09] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC6F ; [.18AF.0020.0019.FC6F][.1950.0020.0019.FC6F] # ARABIC LIGATURE BEH WITH YEH FINAL FORM; QQKN
+FC0A ; [.18AF.0020.001A.FC0A][.1950.0020.001A.FC0A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM; QQKN
+067B ; [.18B0.0020.0002.067B] # ARABIC LETTER BEEH
+FB54 ; [.18B0.0020.0017.FB54] # ARABIC LETTER BEEH INITIAL FORM; QQK
+FB55 ; [.18B0.0020.0018.FB55] # ARABIC LETTER BEEH MEDIAL FORM; QQK
+FB53 ; [.18B0.0020.0019.FB53] # ARABIC LETTER BEEH FINAL FORM; QQK
+FB52 ; [.18B0.0020.001A.FB52] # ARABIC LETTER BEEH ISOLATED FORM; QQK
+067E ; [.18B1.0020.0002.067E] # ARABIC LETTER PEH
+FB58 ; [.18B1.0020.0017.FB58] # ARABIC LETTER PEH INITIAL FORM; QQK
+FB59 ; [.18B1.0020.0018.FB59] # ARABIC LETTER PEH MEDIAL FORM; QQK
+FB57 ; [.18B1.0020.0019.FB57] # ARABIC LETTER PEH FINAL FORM; QQK
+FB56 ; [.18B1.0020.001A.FB56] # ARABIC LETTER PEH ISOLATED FORM; QQK
+0680 ; [.18B2.0020.0002.0680] # ARABIC LETTER BEHEH
+FB5C ; [.18B2.0020.0017.FB5C] # ARABIC LETTER BEHEH INITIAL FORM; QQK
+FB5D ; [.18B2.0020.0018.FB5D] # ARABIC LETTER BEHEH MEDIAL FORM; QQK
+FB5B ; [.18B2.0020.0019.FB5B] # ARABIC LETTER BEHEH FINAL FORM; QQK
+FB5A ; [.18B2.0020.001A.FB5A] # ARABIC LETTER BEHEH ISOLATED FORM; QQK
+0750 ; [.18B3.0020.0002.0750] # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751 ; [.18B4.0020.0002.0751] # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752 ; [.18B5.0020.0002.0752] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753 ; [.18B6.0020.0002.0753] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754 ; [.18B7.0020.0002.0754] # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755 ; [.18B8.0020.0002.0755] # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756 ; [.18B9.0020.0002.0756] # ARABIC LETTER BEH WITH SMALL V
+0629 ; [.18BA.0020.0002.0629] # ARABIC LETTER TEH MARBUTA
+FE94 ; [.18BA.0020.0019.FE94] # ARABIC LETTER TEH MARBUTA FINAL FORM; QQK
+FE93 ; [.18BA.0020.001A.FE93] # ARABIC LETTER TEH MARBUTA ISOLATED FORM; QQK
+062A ; [.18BB.0020.0002.062A] # ARABIC LETTER TEH
+FE97 ; [.18BB.0020.0017.FE97] # ARABIC LETTER TEH INITIAL FORM; QQK
+FE98 ; [.18BB.0020.0018.FE98] # ARABIC LETTER TEH MEDIAL FORM; QQK
+FE96 ; [.18BB.0020.0019.FE96] # ARABIC LETTER TEH FINAL FORM; QQK
+FE95 ; [.18BB.0020.001A.FE95] # ARABIC LETTER TEH ISOLATED FORM; QQK
+FCA1 ; [.18BB.0020.0017.FCA1][.18C2.0020.0017.FCA1] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM; QQKN
+FC0B ; [.18BB.0020.001A.FC0B][.18C2.0020.001A.FC0B] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM; QQKN
+FD50 ; [.18BB.0020.0017.FD50][.18C2.0020.0017.FD50][.1931.0020.001F.FD50] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDA0 ; [.18BB.0020.0019.FDA0][.18C2.0020.0019.FDA0][.194F.0020.001F.FDA0] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD9F ; [.18BB.0020.0019.FD9F][.18C2.0020.0019.FD9F][.1950.0020.001F.FD9F] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCA2 ; [.18BB.0020.0017.FCA2][.18C8.0020.0017.FCA2] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM; QQKN
+FC0C ; [.18BB.0020.001A.FC0C][.18C8.0020.001A.FC0C] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM; QQKN
+FD52 ; [.18BB.0020.0017.FD52][.18C8.0020.0017.FD52][.18C2.0020.001F.FD52] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM; QQKN
+FD51 ; [.18BB.0020.0019.FD51][.18C8.0020.0019.FD51][.18C2.0020.001F.FD51] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM; QQKN
+FD53 ; [.18BB.0020.0017.FD53][.18C8.0020.0017.FD53][.1931.0020.001F.FD53] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM; QQKN
+FCA3 ; [.18BB.0020.0017.FCA3][.18C9.0020.0017.FCA3] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM; QQKN
+FC0D ; [.18BB.0020.001A.FC0D][.18C9.0020.001A.FC0D] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM; QQKN
+FD54 ; [.18BB.0020.0017.FD54][.18C9.0020.0017.FD54][.1931.0020.001F.FD54] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FDA2 ; [.18BB.0020.0019.FDA2][.18C9.0020.0019.FDA2][.194F.0020.001F.FDA2] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA1 ; [.18BB.0020.0019.FDA1][.18C9.0020.0019.FDA1][.1950.0020.001F.FDA1] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM; QQKN
+FC70 ; [.18BB.0020.0019.FC70][.18E1.0020.0019.FC70] # ARABIC LIGATURE TEH WITH REH FINAL FORM; QQKN
+FC71 ; [.18BB.0020.0019.FC71][.18E2.0020.0019.FC71] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM; QQKN
+FCA4 ; [.18BB.0020.0017.FCA4][.1931.0020.0017.FCA4] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM; QQKN
+FCE3 ; [.18BB.0020.0018.FCE3][.1931.0020.0018.FCE3] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM; QQKN
+FC72 ; [.18BB.0020.0019.FC72][.1931.0020.0019.FC72] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM; QQKN
+FC0E ; [.18BB.0020.001A.FC0E][.1931.0020.001A.FC0E] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM; QQKN
+FD55 ; [.18BB.0020.0017.FD55][.1931.0020.0017.FD55][.18C2.0020.001F.FD55] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD56 ; [.18BB.0020.0017.FD56][.1931.0020.0017.FD56][.18C8.0020.001F.FD56] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD57 ; [.18BB.0020.0017.FD57][.1931.0020.0017.FD57][.18C9.0020.001F.FD57] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM; QQKN
+FDA4 ; [.18BB.0020.0019.FDA4][.1931.0020.0019.FDA4][.194F.0020.001F.FDA4] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA3 ; [.18BB.0020.0019.FDA3][.1931.0020.0019.FDA3][.1950.0020.001F.FDA3] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC73 ; [.18BB.0020.0019.FC73][.1934.0020.0019.FC73] # ARABIC LIGATURE TEH WITH NOON FINAL FORM; QQKN
+FCA5 ; [.18BB.0020.0017.FCA5][.193D.0020.0017.FCA5] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM; QQKN
+FCE4 ; [.18BB.0020.0018.FCE4][.193D.0020.0018.FCE4] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM; QQKN
+FC74 ; [.18BB.0020.0019.FC74][.194F.0020.0019.FC74] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC0F ; [.18BB.0020.001A.FC0F][.194F.0020.001A.FC0F] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC75 ; [.18BB.0020.0019.FC75][.1950.0020.0019.FC75] # ARABIC LIGATURE TEH WITH YEH FINAL FORM; QQKN
+FC10 ; [.18BB.0020.001A.FC10][.1950.0020.001A.FC10] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM; QQKN
+062B ; [.18BC.0020.0002.062B] # ARABIC LETTER THEH
+FE9B ; [.18BC.0020.0017.FE9B] # ARABIC LETTER THEH INITIAL FORM; QQK
+FE9C ; [.18BC.0020.0018.FE9C] # ARABIC LETTER THEH MEDIAL FORM; QQK
+FE9A ; [.18BC.0020.0019.FE9A] # ARABIC LETTER THEH FINAL FORM; QQK
+FE99 ; [.18BC.0020.001A.FE99] # ARABIC LETTER THEH ISOLATED FORM; QQK
+FC11 ; [.18BC.0020.001A.FC11][.18C2.0020.001A.FC11] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM; QQKN
+FC76 ; [.18BC.0020.0019.FC76][.18E1.0020.0019.FC76] # ARABIC LIGATURE THEH WITH REH FINAL FORM; QQKN
+FC77 ; [.18BC.0020.0019.FC77][.18E2.0020.0019.FC77] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM; QQKN
+FCA6 ; [.18BC.0020.0017.FCA6][.1931.0020.0017.FCA6] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM; QQKN
+FCE5 ; [.18BC.0020.0018.FCE5][.1931.0020.0018.FCE5] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM; QQKN
+FC78 ; [.18BC.0020.0019.FC78][.1931.0020.0019.FC78] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM; QQKN
+FC12 ; [.18BC.0020.001A.FC12][.1931.0020.001A.FC12] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM; QQKN
+FC79 ; [.18BC.0020.0019.FC79][.1934.0020.0019.FC79] # ARABIC LIGATURE THEH WITH NOON FINAL FORM; QQKN
+FCE6 ; [.18BC.0020.0018.FCE6][.193D.0020.0018.FCE6] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM; QQKN
+FC7A ; [.18BC.0020.0019.FC7A][.194F.0020.0019.FC7A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC13 ; [.18BC.0020.001A.FC13][.194F.0020.001A.FC13] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7B ; [.18BC.0020.0019.FC7B][.1950.0020.0019.FC7B] # ARABIC LIGATURE THEH WITH YEH FINAL FORM; QQKN
+FC14 ; [.18BC.0020.001A.FC14][.1950.0020.001A.FC14] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM; QQKN
+0679 ; [.18BD.0020.0002.0679] # ARABIC LETTER TTEH
+FB68 ; [.18BD.0020.0017.FB68] # ARABIC LETTER TTEH INITIAL FORM; QQK
+FB69 ; [.18BD.0020.0018.FB69] # ARABIC LETTER TTEH MEDIAL FORM; QQK
+FB67 ; [.18BD.0020.0019.FB67] # ARABIC LETTER TTEH FINAL FORM; QQK
+FB66 ; [.18BD.0020.001A.FB66] # ARABIC LETTER TTEH ISOLATED FORM; QQK
+067A ; [.18BE.0020.0002.067A] # ARABIC LETTER TTEHEH
+FB60 ; [.18BE.0020.0017.FB60] # ARABIC LETTER TTEHEH INITIAL FORM; QQK
+FB61 ; [.18BE.0020.0018.FB61] # ARABIC LETTER TTEHEH MEDIAL FORM; QQK
+FB5F ; [.18BE.0020.0019.FB5F] # ARABIC LETTER TTEHEH FINAL FORM; QQK
+FB5E ; [.18BE.0020.001A.FB5E] # ARABIC LETTER TTEHEH ISOLATED FORM; QQK
+067C ; [.18BF.0020.0002.067C] # ARABIC LETTER TEH WITH RING
+067D ; [.18C0.0020.0002.067D] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067F ; [.18C1.0020.0002.067F] # ARABIC LETTER TEHEH
+FB64 ; [.18C1.0020.0017.FB64] # ARABIC LETTER TEHEH INITIAL FORM; QQK
+FB65 ; [.18C1.0020.0018.FB65] # ARABIC LETTER TEHEH MEDIAL FORM; QQK
+FB63 ; [.18C1.0020.0019.FB63] # ARABIC LETTER TEHEH FINAL FORM; QQK
+FB62 ; [.18C1.0020.001A.FB62] # ARABIC LETTER TEHEH ISOLATED FORM; QQK
+062C ; [.18C2.0020.0002.062C] # ARABIC LETTER JEEM
+FE9F ; [.18C2.0020.0017.FE9F] # ARABIC LETTER JEEM INITIAL FORM; QQK
+FEA0 ; [.18C2.0020.0018.FEA0] # ARABIC LETTER JEEM MEDIAL FORM; QQK
+FE9E ; [.18C2.0020.0019.FE9E] # ARABIC LETTER JEEM FINAL FORM; QQK
+FE9D ; [.18C2.0020.001A.FE9D] # ARABIC LETTER JEEM ISOLATED FORM; QQK
+FCA7 ; [.18C2.0020.0017.FCA7][.18C8.0020.0017.FCA7] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM; QQKN
+FC15 ; [.18C2.0020.001A.FC15][.18C8.0020.001A.FC15] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM; QQKN
+FDA6 ; [.18C2.0020.0019.FDA6][.18C8.0020.0019.FDA6][.194F.0020.001F.FDA6] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDBE ; [.18C2.0020.0019.FDBE][.18C8.0020.0019.FDBE][.1950.0020.001F.FDBE] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM; QQKN
+FDFB ; [.18C2.0020.001A.FDFB][.192B.0020.001A.FDFB][*020A.0020.001F.FDFB][.18C2.0020.001F.FDFB][.192B.0020.001F.FDFB][.18AD.0020.001F.FDFB][.192B.0020.001F.FDFB][.193D.0020.001F.FDFB] # ARABIC LIGATURE JALLAJALALOUHOU; QQKN
+FCA8 ; [.18C2.0020.0017.FCA8][.1931.0020.0017.FCA8] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM; QQKN
+FC16 ; [.18C2.0020.001A.FC16][.1931.0020.001A.FC16] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM; QQKN
+FD59 ; [.18C2.0020.0017.FD59][.1931.0020.0017.FD59][.18C8.0020.001F.FD59] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD58 ; [.18C2.0020.0019.FD58][.1931.0020.0019.FD58][.18C8.0020.001F.FD58] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM; QQKN
+FDA7 ; [.18C2.0020.0019.FDA7][.1931.0020.0019.FDA7][.194F.0020.001F.FDA7] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA5 ; [.18C2.0020.0019.FDA5][.1931.0020.0019.FDA5][.1950.0020.001F.FDA5] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM; QQKN
+FD1D ; [.18C2.0020.0019.FD1D][.194F.0020.0019.FD1D] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD01 ; [.18C2.0020.001A.FD01][.194F.0020.001A.FD01] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1E ; [.18C2.0020.0019.FD1E][.1950.0020.0019.FD1E] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM; QQKN
+FD02 ; [.18C2.0020.001A.FD02][.1950.0020.001A.FD02] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM; QQKN
+0683 ; [.18C3.0020.0002.0683] # ARABIC LETTER NYEH
+FB78 ; [.18C3.0020.0017.FB78] # ARABIC LETTER NYEH INITIAL FORM; QQK
+FB79 ; [.18C3.0020.0018.FB79] # ARABIC LETTER NYEH MEDIAL FORM; QQK
+FB77 ; [.18C3.0020.0019.FB77] # ARABIC LETTER NYEH FINAL FORM; QQK
+FB76 ; [.18C3.0020.001A.FB76] # ARABIC LETTER NYEH ISOLATED FORM; QQK
+0684 ; [.18C4.0020.0002.0684] # ARABIC LETTER DYEH
+FB74 ; [.18C4.0020.0017.FB74] # ARABIC LETTER DYEH INITIAL FORM; QQK
+FB75 ; [.18C4.0020.0018.FB75] # ARABIC LETTER DYEH MEDIAL FORM; QQK
+FB73 ; [.18C4.0020.0019.FB73] # ARABIC LETTER DYEH FINAL FORM; QQK
+FB72 ; [.18C4.0020.001A.FB72] # ARABIC LETTER DYEH ISOLATED FORM; QQK
+0686 ; [.18C5.0020.0002.0686] # ARABIC LETTER TCHEH
+FB7C ; [.18C5.0020.0017.FB7C] # ARABIC LETTER TCHEH INITIAL FORM; QQK
+FB7D ; [.18C5.0020.0018.FB7D] # ARABIC LETTER TCHEH MEDIAL FORM; QQK
+FB7B ; [.18C5.0020.0019.FB7B] # ARABIC LETTER TCHEH FINAL FORM; QQK
+FB7A ; [.18C5.0020.001A.FB7A] # ARABIC LETTER TCHEH ISOLATED FORM; QQK
+06BF ; [.18C6.0020.0002.06BF] # ARABIC LETTER TCHEH WITH DOT ABOVE
+0687 ; [.18C7.0020.0002.0687] # ARABIC LETTER TCHEHEH
+FB80 ; [.18C7.0020.0017.FB80] # ARABIC LETTER TCHEHEH INITIAL FORM; QQK
+FB81 ; [.18C7.0020.0018.FB81] # ARABIC LETTER TCHEHEH MEDIAL FORM; QQK
+FB7F ; [.18C7.0020.0019.FB7F] # ARABIC LETTER TCHEHEH FINAL FORM; QQK
+FB7E ; [.18C7.0020.001A.FB7E] # ARABIC LETTER TCHEHEH ISOLATED FORM; QQK
+062D ; [.18C8.0020.0002.062D] # ARABIC LETTER HAH
+FEA3 ; [.18C8.0020.0017.FEA3] # ARABIC LETTER HAH INITIAL FORM; QQK
+FEA4 ; [.18C8.0020.0018.FEA4] # ARABIC LETTER HAH MEDIAL FORM; QQK
+FEA2 ; [.18C8.0020.0019.FEA2] # ARABIC LETTER HAH FINAL FORM; QQK
+FEA1 ; [.18C8.0020.001A.FEA1] # ARABIC LETTER HAH ISOLATED FORM; QQK
+FCA9 ; [.18C8.0020.0017.FCA9][.18C2.0020.0017.FCA9] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM; QQKN
+FC17 ; [.18C8.0020.001A.FC17][.18C2.0020.001A.FC17] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM; QQKN
+FDBF ; [.18C8.0020.0019.FDBF][.18C2.0020.0019.FDBF][.1950.0020.001F.FDBF] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCAA ; [.18C8.0020.0017.FCAA][.1931.0020.0017.FCAA] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM; QQKN
+FC18 ; [.18C8.0020.001A.FC18][.1931.0020.001A.FC18] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM; QQKN
+FD5B ; [.18C8.0020.0019.FD5B][.1931.0020.0019.FD5B][.194F.0020.001F.FD5B] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD5A ; [.18C8.0020.0019.FD5A][.1931.0020.0019.FD5A][.1950.0020.001F.FD5A] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM; QQKN
+FD1B ; [.18C8.0020.0019.FD1B][.194F.0020.0019.FD1B] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFF ; [.18C8.0020.001A.FCFF][.194F.0020.001A.FCFF] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1C ; [.18C8.0020.0019.FD1C][.1950.0020.0019.FD1C] # ARABIC LIGATURE HAH WITH YEH FINAL FORM; QQKN
+FD00 ; [.18C8.0020.001A.FD00][.1950.0020.001A.FD00] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM; QQKN
+062E ; [.18C9.0020.0002.062E] # ARABIC LETTER KHAH
+FEA7 ; [.18C9.0020.0017.FEA7] # ARABIC LETTER KHAH INITIAL FORM; QQK
+FEA8 ; [.18C9.0020.0018.FEA8] # ARABIC LETTER KHAH MEDIAL FORM; QQK
+FEA6 ; [.18C9.0020.0019.FEA6] # ARABIC LETTER KHAH FINAL FORM; QQK
+FEA5 ; [.18C9.0020.001A.FEA5] # ARABIC LETTER KHAH ISOLATED FORM; QQK
+FCAB ; [.18C9.0020.0017.FCAB][.18C2.0020.0017.FCAB] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM; QQKN
+FC19 ; [.18C9.0020.001A.FC19][.18C2.0020.001A.FC19] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM; QQKN
+FC1A ; [.18C9.0020.001A.FC1A][.18C8.0020.001A.FC1A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM; QQKN
+FCAC ; [.18C9.0020.0017.FCAC][.1931.0020.0017.FCAC] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM; QQKN
+FC1B ; [.18C9.0020.001A.FC1B][.1931.0020.001A.FC1B] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM; QQKN
+FD1F ; [.18C9.0020.0019.FD1F][.194F.0020.0019.FD1F] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FD03 ; [.18C9.0020.001A.FD03][.194F.0020.001A.FD03] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD20 ; [.18C9.0020.0019.FD20][.1950.0020.0019.FD20] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM; QQKN
+FD04 ; [.18C9.0020.001A.FD04][.1950.0020.001A.FD04] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM; QQKN
+0681 ; [.18CA.0020.0002.0681] # ARABIC LETTER HAH WITH HAMZA ABOVE
+0682 ; [.18CB.0020.0002.0682] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0685 ; [.18CC.0020.0002.0685] # ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0757 ; [.18CD.0020.0002.0757] # ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758 ; [.18CE.0020.0002.0758] # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+076E ; [.18CF.0020.0002.076E] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW
+076F ; [.18D0.0020.0002.076F] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0772 ; [.18D1.0020.0002.0772] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE
+077C ; [.18D2.0020.0002.077C] # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+062F ; [.18D3.0020.0002.062F] # ARABIC LETTER DAL
+FEAA ; [.18D3.0020.0019.FEAA] # ARABIC LETTER DAL FINAL FORM; QQK
+FEA9 ; [.18D3.0020.001A.FEA9] # ARABIC LETTER DAL ISOLATED FORM; QQK
+0630 ; [.18D4.0020.0002.0630] # ARABIC LETTER THAL
+FEAC ; [.18D4.0020.0019.FEAC] # ARABIC LETTER THAL FINAL FORM; QQK
+FEAB ; [.18D4.0020.001A.FEAB] # ARABIC LETTER THAL ISOLATED FORM; QQK
+FC5B ; [.18D4.0020.001A.FC5B][.0000.00BC.001A.FC5B] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+0688 ; [.18D5.0020.0002.0688] # ARABIC LETTER DDAL
+FB89 ; [.18D5.0020.0019.FB89] # ARABIC LETTER DDAL FINAL FORM; QQK
+FB88 ; [.18D5.0020.001A.FB88] # ARABIC LETTER DDAL ISOLATED FORM; QQK
+0689 ; [.18D6.0020.0002.0689] # ARABIC LETTER DAL WITH RING
+068A ; [.18D7.0020.0002.068A] # ARABIC LETTER DAL WITH DOT BELOW
+068B ; [.18D8.0020.0002.068B] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C ; [.18D9.0020.0002.068C] # ARABIC LETTER DAHAL
+FB85 ; [.18D9.0020.0019.FB85] # ARABIC LETTER DAHAL FINAL FORM; QQK
+FB84 ; [.18D9.0020.001A.FB84] # ARABIC LETTER DAHAL ISOLATED FORM; QQK
+068D ; [.18DA.0020.0002.068D] # ARABIC LETTER DDAHAL
+FB83 ; [.18DA.0020.0019.FB83] # ARABIC LETTER DDAHAL FINAL FORM; QQK
+FB82 ; [.18DA.0020.001A.FB82] # ARABIC LETTER DDAHAL ISOLATED FORM; QQK
+068E ; [.18DB.0020.0002.068E] # ARABIC LETTER DUL
+FB87 ; [.18DB.0020.0019.FB87] # ARABIC LETTER DUL FINAL FORM; QQK
+FB86 ; [.18DB.0020.001A.FB86] # ARABIC LETTER DUL ISOLATED FORM; QQK
+068F ; [.18DC.0020.0002.068F] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690 ; [.18DD.0020.0002.0690] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+06EE ; [.18DE.0020.0002.06EE] # ARABIC LETTER DAL WITH INVERTED V
+0759 ; [.18DF.0020.0002.0759] # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+075A ; [.18E0.0020.0002.075A] # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+0631 ; [.18E1.0020.0002.0631] # ARABIC LETTER REH
+FEAE ; [.18E1.0020.0019.FEAE] # ARABIC LETTER REH FINAL FORM; QQK
+FEAD ; [.18E1.0020.001A.FEAD] # ARABIC LETTER REH ISOLATED FORM; QQK
+FC5C ; [.18E1.0020.001A.FC5C][.0000.00BC.001A.FC5C] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+FDF6 ; [.18E1.0020.001A.FDF6][.18F1.0020.001A.FDF6][.1943.0020.001F.FDF6][.192B.0020.001F.FDF6] # ARABIC LIGATURE RASOUL ISOLATED FORM; QQKN
+FDFC ; [.18E1.0020.001A.FDFC][.1951.0020.001A.FDFC][.18AD.0020.001F.FDFC][.192B.0020.001F.FDFC] # RIAL SIGN; QQKN
+0632 ; [.18E2.0020.0002.0632] # ARABIC LETTER ZAIN
+FEB0 ; [.18E2.0020.0019.FEB0] # ARABIC LETTER ZAIN FINAL FORM; QQK
+FEAF ; [.18E2.0020.001A.FEAF] # ARABIC LETTER ZAIN ISOLATED FORM; QQK
+0691 ; [.18E3.0020.0002.0691] # ARABIC LETTER RREH
+FB8D ; [.18E3.0020.0019.FB8D] # ARABIC LETTER RREH FINAL FORM; QQK
+FB8C ; [.18E3.0020.001A.FB8C] # ARABIC LETTER RREH ISOLATED FORM; QQK
+0692 ; [.18E4.0020.0002.0692] # ARABIC LETTER REH WITH SMALL V
+0693 ; [.18E5.0020.0002.0693] # ARABIC LETTER REH WITH RING
+0694 ; [.18E6.0020.0002.0694] # ARABIC LETTER REH WITH DOT BELOW
+0695 ; [.18E7.0020.0002.0695] # ARABIC LETTER REH WITH SMALL V BELOW
+0696 ; [.18E8.0020.0002.0696] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697 ; [.18E9.0020.0002.0697] # ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698 ; [.18EA.0020.0002.0698] # ARABIC LETTER JEH
+FB8B ; [.18EA.0020.0019.FB8B] # ARABIC LETTER JEH FINAL FORM; QQK
+FB8A ; [.18EA.0020.001A.FB8A] # ARABIC LETTER JEH ISOLATED FORM; QQK
+0699 ; [.18EB.0020.0002.0699] # ARABIC LETTER REH WITH FOUR DOTS ABOVE
+06EF ; [.18EC.0020.0002.06EF] # ARABIC LETTER REH WITH INVERTED V
+075B ; [.18ED.0020.0002.075B] # ARABIC LETTER REH WITH STROKE
+076B ; [.18EE.0020.0002.076B] # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+076C ; [.18EF.0020.0002.076C] # ARABIC LETTER REH WITH HAMZA ABOVE
+0771 ; [.18F0.0020.0002.0771] # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0633 ; [.18F1.0020.0002.0633] # ARABIC LETTER SEEN
+FEB3 ; [.18F1.0020.0017.FEB3] # ARABIC LETTER SEEN INITIAL FORM; QQK
+FEB4 ; [.18F1.0020.0018.FEB4] # ARABIC LETTER SEEN MEDIAL FORM; QQK
+FEB2 ; [.18F1.0020.0019.FEB2] # ARABIC LETTER SEEN FINAL FORM; QQK
+FEB1 ; [.18F1.0020.001A.FEB1] # ARABIC LETTER SEEN ISOLATED FORM; QQK
+FCAD ; [.18F1.0020.0017.FCAD][.18C2.0020.0017.FCAD] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM; QQKN
+FD34 ; [.18F1.0020.0018.FD34][.18C2.0020.0018.FD34] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM; QQKN
+FC1C ; [.18F1.0020.001A.FC1C][.18C2.0020.001A.FC1C] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM; QQKN
+FD5D ; [.18F1.0020.0017.FD5D][.18C2.0020.0017.FD5D][.18C8.0020.001F.FD5D] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM; QQKN
+FD5E ; [.18F1.0020.0019.FD5E][.18C2.0020.0019.FD5E][.194F.0020.001F.FD5E] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FCAE ; [.18F1.0020.0017.FCAE][.18C8.0020.0017.FCAE] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM; QQKN
+FD35 ; [.18F1.0020.0018.FD35][.18C8.0020.0018.FD35] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM; QQKN
+FC1D ; [.18F1.0020.001A.FC1D][.18C8.0020.001A.FC1D] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM; QQKN
+FD5C ; [.18F1.0020.0017.FD5C][.18C8.0020.0017.FD5C][.18C2.0020.001F.FD5C] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM; QQKN
+FCAF ; [.18F1.0020.0017.FCAF][.18C9.0020.0017.FCAF] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM; QQKN
+FD36 ; [.18F1.0020.0018.FD36][.18C9.0020.0018.FD36] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM; QQKN
+FC1E ; [.18F1.0020.001A.FC1E][.18C9.0020.001A.FC1E] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM; QQKN
+FDA8 ; [.18F1.0020.0019.FDA8][.18C9.0020.0019.FDA8][.194F.0020.001F.FDA8] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDC6 ; [.18F1.0020.0019.FDC6][.18C9.0020.0019.FDC6][.1950.0020.001F.FDC6] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM; QQKN
+FD2A ; [.18F1.0020.0019.FD2A][.18E1.0020.0019.FD2A] # ARABIC LIGATURE SEEN WITH REH FINAL FORM; QQKN
+FD0E ; [.18F1.0020.001A.FD0E][.18E1.0020.001A.FD0E] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM; QQKN
+FCB0 ; [.18F1.0020.0017.FCB0][.1931.0020.0017.FCB0] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM; QQKN
+FCE7 ; [.18F1.0020.0018.FCE7][.1931.0020.0018.FCE7] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM; QQKN
+FC1F ; [.18F1.0020.001A.FC1F][.1931.0020.001A.FC1F] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM; QQKN
+FD61 ; [.18F1.0020.0017.FD61][.1931.0020.0017.FD61][.18C2.0020.001F.FD61] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD60 ; [.18F1.0020.0017.FD60][.1931.0020.0017.FD60][.18C8.0020.001F.FD60] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD5F ; [.18F1.0020.0019.FD5F][.1931.0020.0019.FD5F][.18C8.0020.001F.FD5F] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM; QQKN
+FD63 ; [.18F1.0020.0017.FD63][.1931.0020.0017.FD63][.1931.0020.001F.FD63] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD62 ; [.18F1.0020.0019.FD62][.1931.0020.0019.FD62][.1931.0020.001F.FD62] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD31 ; [.18F1.0020.0017.FD31][.193D.0020.0017.FD31] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM; QQKN
+FCE8 ; [.18F1.0020.0018.FCE8][.193D.0020.0018.FCE8] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM; QQKN
+FD17 ; [.18F1.0020.0019.FD17][.194F.0020.0019.FD17] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFB ; [.18F1.0020.001A.FCFB][.194F.0020.001A.FCFB] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD18 ; [.18F1.0020.0019.FD18][.1950.0020.0019.FD18] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM; QQKN
+FCFC ; [.18F1.0020.001A.FCFC][.1950.0020.001A.FCFC] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM; QQKN
+0634 ; [.18F2.0020.0002.0634] # ARABIC LETTER SHEEN
+FEB7 ; [.18F2.0020.0017.FEB7] # ARABIC LETTER SHEEN INITIAL FORM; QQK
+FEB8 ; [.18F2.0020.0018.FEB8] # ARABIC LETTER SHEEN MEDIAL FORM; QQK
+FEB6 ; [.18F2.0020.0019.FEB6] # ARABIC LETTER SHEEN FINAL FORM; QQK
+FEB5 ; [.18F2.0020.001A.FEB5] # ARABIC LETTER SHEEN ISOLATED FORM; QQK
+FD2D ; [.18F2.0020.0017.FD2D][.18C2.0020.0017.FD2D] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM; QQKN
+FD37 ; [.18F2.0020.0018.FD37][.18C2.0020.0018.FD37] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM; QQKN
+FD25 ; [.18F2.0020.0019.FD25][.18C2.0020.0019.FD25] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM; QQKN
+FD09 ; [.18F2.0020.001A.FD09][.18C2.0020.001A.FD09] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM; QQKN
+FD69 ; [.18F2.0020.0019.FD69][.18C2.0020.0019.FD69][.1950.0020.001F.FD69] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM; QQKN
+FD2E ; [.18F2.0020.0017.FD2E][.18C8.0020.0017.FD2E] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM; QQKN
+FD38 ; [.18F2.0020.0018.FD38][.18C8.0020.0018.FD38] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM; QQKN
+FD26 ; [.18F2.0020.0019.FD26][.18C8.0020.0019.FD26] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM; QQKN
+FD0A ; [.18F2.0020.001A.FD0A][.18C8.0020.001A.FD0A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM; QQKN
+FD68 ; [.18F2.0020.0017.FD68][.18C8.0020.0017.FD68][.1931.0020.001F.FD68] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD67 ; [.18F2.0020.0019.FD67][.18C8.0020.0019.FD67][.1931.0020.001F.FD67] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM; QQKN
+FDAA ; [.18F2.0020.0019.FDAA][.18C8.0020.0019.FDAA][.1950.0020.001F.FDAA] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM; QQKN
+FD2F ; [.18F2.0020.0017.FD2F][.18C9.0020.0017.FD2F] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM; QQKN
+FD39 ; [.18F2.0020.0018.FD39][.18C9.0020.0018.FD39] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM; QQKN
+FD27 ; [.18F2.0020.0019.FD27][.18C9.0020.0019.FD27] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM; QQKN
+FD0B ; [.18F2.0020.001A.FD0B][.18C9.0020.001A.FD0B] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM; QQKN
+FD29 ; [.18F2.0020.0019.FD29][.18E1.0020.0019.FD29] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM; QQKN
+FD0D ; [.18F2.0020.001A.FD0D][.18E1.0020.001A.FD0D] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM; QQKN
+FD30 ; [.18F2.0020.0017.FD30][.1931.0020.0017.FD30] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM; QQKN
+FCE9 ; [.18F2.0020.0018.FCE9][.1931.0020.0018.FCE9] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM; QQKN
+FD28 ; [.18F2.0020.0019.FD28][.1931.0020.0019.FD28] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM; QQKN
+FD0C ; [.18F2.0020.001A.FD0C][.1931.0020.001A.FD0C] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM; QQKN
+FD6B ; [.18F2.0020.0017.FD6B][.1931.0020.0017.FD6B][.18C9.0020.001F.FD6B] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM; QQKN
+FD6A ; [.18F2.0020.0019.FD6A][.1931.0020.0019.FD6A][.18C9.0020.001F.FD6A] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM; QQKN
+FD6D ; [.18F2.0020.0017.FD6D][.1931.0020.0017.FD6D][.1931.0020.001F.FD6D] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD6C ; [.18F2.0020.0019.FD6C][.1931.0020.0019.FD6C][.1931.0020.001F.FD6C] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD32 ; [.18F2.0020.0017.FD32][.193D.0020.0017.FD32] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM; QQKN
+FCEA ; [.18F2.0020.0018.FCEA][.193D.0020.0018.FCEA] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM; QQKN
+FD19 ; [.18F2.0020.0019.FD19][.194F.0020.0019.FD19] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFD ; [.18F2.0020.001A.FCFD][.194F.0020.001A.FCFD] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1A ; [.18F2.0020.0019.FD1A][.1950.0020.0019.FD1A] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM; QQKN
+FCFE ; [.18F2.0020.001A.FCFE][.1950.0020.001A.FCFE] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM; QQKN
+069A ; [.18F3.0020.0002.069A] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B ; [.18F4.0020.0002.069B] # ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C ; [.18F5.0020.0002.069C] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+06FA ; [.18F6.0020.0002.06FA] # ARABIC LETTER SHEEN WITH DOT BELOW
+075C ; [.18F7.0020.0002.075C] # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+076D ; [.18F8.0020.0002.076D] # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+0770 ; [.18F9.0020.0002.0770] # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+077D ; [.18FA.0020.0002.077D] # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE
+077E ; [.18FB.0020.0002.077E] # ARABIC LETTER SEEN WITH INVERTED V
+0635 ; [.18FC.0020.0002.0635] # ARABIC LETTER SAD
+FEBB ; [.18FC.0020.0017.FEBB] # ARABIC LETTER SAD INITIAL FORM; QQK
+FEBC ; [.18FC.0020.0018.FEBC] # ARABIC LETTER SAD MEDIAL FORM; QQK
+FEBA ; [.18FC.0020.0019.FEBA] # ARABIC LETTER SAD FINAL FORM; QQK
+FEB9 ; [.18FC.0020.001A.FEB9] # ARABIC LETTER SAD ISOLATED FORM; QQK
+FCB1 ; [.18FC.0020.0017.FCB1][.18C8.0020.0017.FCB1] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM; QQKN
+FC20 ; [.18FC.0020.001A.FC20][.18C8.0020.001A.FC20] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM; QQKN
+FD65 ; [.18FC.0020.0017.FD65][.18C8.0020.0017.FD65][.18C8.0020.001F.FD65] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM; QQKN
+FD64 ; [.18FC.0020.0019.FD64][.18C8.0020.0019.FD64][.18C8.0020.001F.FD64] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM; QQKN
+FDA9 ; [.18FC.0020.0019.FDA9][.18C8.0020.0019.FDA9][.1950.0020.001F.FDA9] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM; QQKN
+FCB2 ; [.18FC.0020.0017.FCB2][.18C9.0020.0017.FCB2] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM; QQKN
+FD2B ; [.18FC.0020.0019.FD2B][.18E1.0020.0019.FD2B] # ARABIC LIGATURE SAD WITH REH FINAL FORM; QQKN
+FD0F ; [.18FC.0020.001A.FD0F][.18E1.0020.001A.FD0F] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM; QQKN
+FDF5 ; [.18FC.0020.001A.FDF5][.192B.0020.001A.FDF5][.1904.0020.001F.FDF5][.1931.0020.001F.FDF5] # ARABIC LIGATURE SALAM ISOLATED FORM; QQKN
+FDF9 ; [.18FC.0020.001A.FDF9][.192B.0020.001A.FDF9][.194F.0020.001F.FDF9] # ARABIC LIGATURE SALLA ISOLATED FORM; QQKN
+FDFA ; [.18FC.0020.001A.FDFA][.192B.0020.001A.FDFA][.194F.0020.001F.FDFA][*020A.0020.001F.FDFA][.18AD.0020.001F.FDFA][.192B.0020.001F.FDFA][.192B.0020.001F.FDFA][.193D.0020.001F.FDFA][*020A.0020.001F.FDFA][.1904.0020.001F.FDFA][.192B.0020.001F.FDFA][.1950.0020.001F.FDFA][.193D.0020.001F.FDFA][*020A.0020.001F.FDFA][.1943.0020.001F.FDFA][.18F1.0020.001F.FDFA][.192B.0020.001F.FDFA][.1931.0020.001F.FDFA] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM; QQKN
+FDF0 ; [.18FC.0020.001A.FDF0][.192B.0020.001A.FDF0][.195C.0020.001F.FDF0] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM; QQKN
+FCB3 ; [.18FC.0020.0017.FCB3][.1931.0020.0017.FCB3] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM; QQKN
+FC21 ; [.18FC.0020.001A.FC21][.1931.0020.001A.FC21] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM; QQKN
+FDC5 ; [.18FC.0020.0017.FDC5][.1931.0020.0017.FDC5][.1931.0020.001F.FDC5] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD66 ; [.18FC.0020.0019.FD66][.1931.0020.0019.FD66][.1931.0020.001F.FD66] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD21 ; [.18FC.0020.0019.FD21][.194F.0020.0019.FD21] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM; QQKN
+FD05 ; [.18FC.0020.001A.FD05][.194F.0020.001A.FD05] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD22 ; [.18FC.0020.0019.FD22][.1950.0020.0019.FD22] # ARABIC LIGATURE SAD WITH YEH FINAL FORM; QQKN
+FD06 ; [.18FC.0020.001A.FD06][.1950.0020.001A.FD06] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM; QQKN
+0636 ; [.18FD.0020.0002.0636] # ARABIC LETTER DAD
+FEBF ; [.18FD.0020.0017.FEBF] # ARABIC LETTER DAD INITIAL FORM; QQK
+FEC0 ; [.18FD.0020.0018.FEC0] # ARABIC LETTER DAD MEDIAL FORM; QQK
+FEBE ; [.18FD.0020.0019.FEBE] # ARABIC LETTER DAD FINAL FORM; QQK
+FEBD ; [.18FD.0020.001A.FEBD] # ARABIC LETTER DAD ISOLATED FORM; QQK
+FCB4 ; [.18FD.0020.0017.FCB4][.18C2.0020.0017.FCB4] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM; QQKN
+FC22 ; [.18FD.0020.001A.FC22][.18C2.0020.001A.FC22] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM; QQKN
+FCB5 ; [.18FD.0020.0017.FCB5][.18C8.0020.0017.FCB5] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM; QQKN
+FC23 ; [.18FD.0020.001A.FC23][.18C8.0020.001A.FC23] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM; QQKN
+FD6E ; [.18FD.0020.0019.FD6E][.18C8.0020.0019.FD6E][.194F.0020.001F.FD6E] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDAB ; [.18FD.0020.0019.FDAB][.18C8.0020.0019.FDAB][.1950.0020.001F.FDAB] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM; QQKN
+FCB6 ; [.18FD.0020.0017.FCB6][.18C9.0020.0017.FCB6] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM; QQKN
+FC24 ; [.18FD.0020.001A.FC24][.18C9.0020.001A.FC24] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM; QQKN
+FD70 ; [.18FD.0020.0017.FD70][.18C9.0020.0017.FD70][.1931.0020.001F.FD70] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD6F ; [.18FD.0020.0019.FD6F][.18C9.0020.0019.FD6F][.1931.0020.001F.FD6F] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM; QQKN
+FD2C ; [.18FD.0020.0019.FD2C][.18E1.0020.0019.FD2C] # ARABIC LIGATURE DAD WITH REH FINAL FORM; QQKN
+FD10 ; [.18FD.0020.001A.FD10][.18E1.0020.001A.FD10] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM; QQKN
+FCB7 ; [.18FD.0020.0017.FCB7][.1931.0020.0017.FCB7] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM; QQKN
+FC25 ; [.18FD.0020.001A.FC25][.1931.0020.001A.FC25] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM; QQKN
+FD23 ; [.18FD.0020.0019.FD23][.194F.0020.0019.FD23] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM; QQKN
+FD07 ; [.18FD.0020.001A.FD07][.194F.0020.001A.FD07] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD24 ; [.18FD.0020.0019.FD24][.1950.0020.0019.FD24] # ARABIC LIGATURE DAD WITH YEH FINAL FORM; QQKN
+FD08 ; [.18FD.0020.001A.FD08][.1950.0020.001A.FD08] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM; QQKN
+069D ; [.18FE.0020.0002.069D] # ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E ; [.18FF.0020.0002.069E] # ARABIC LETTER SAD WITH THREE DOTS ABOVE
+06FB ; [.1900.0020.0002.06FB] # ARABIC LETTER DAD WITH DOT BELOW
+0637 ; [.1901.0020.0002.0637] # ARABIC LETTER TAH
+FEC3 ; [.1901.0020.0017.FEC3] # ARABIC LETTER TAH INITIAL FORM; QQK
+FEC4 ; [.1901.0020.0018.FEC4] # ARABIC LETTER TAH MEDIAL FORM; QQK
+FEC2 ; [.1901.0020.0019.FEC2] # ARABIC LETTER TAH FINAL FORM; QQK
+FEC1 ; [.1901.0020.001A.FEC1] # ARABIC LETTER TAH ISOLATED FORM; QQK
+FCB8 ; [.1901.0020.0017.FCB8][.18C8.0020.0017.FCB8] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM; QQKN
+FC26 ; [.1901.0020.001A.FC26][.18C8.0020.001A.FC26] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM; QQKN
+FD33 ; [.1901.0020.0017.FD33][.1931.0020.0017.FD33] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM; QQKN
+FD3A ; [.1901.0020.0018.FD3A][.1931.0020.0018.FD3A] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM; QQKN
+FC27 ; [.1901.0020.001A.FC27][.1931.0020.001A.FC27] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM; QQKN
+FD72 ; [.1901.0020.0017.FD72][.1931.0020.0017.FD72][.18C8.0020.001F.FD72] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD71 ; [.1901.0020.0019.FD71][.1931.0020.0019.FD71][.18C8.0020.001F.FD71] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM; QQKN
+FD73 ; [.1901.0020.0017.FD73][.1931.0020.0017.FD73][.1931.0020.001F.FD73] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD74 ; [.1901.0020.0019.FD74][.1931.0020.0019.FD74][.1950.0020.001F.FD74] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM; QQKN
+FD11 ; [.1901.0020.0019.FD11][.194F.0020.0019.FD11] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF5 ; [.1901.0020.001A.FCF5][.194F.0020.001A.FCF5] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD12 ; [.1901.0020.0019.FD12][.1950.0020.0019.FD12] # ARABIC LIGATURE TAH WITH YEH FINAL FORM; QQKN
+FCF6 ; [.1901.0020.001A.FCF6][.1950.0020.001A.FCF6] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM; QQKN
+0638 ; [.1902.0020.0002.0638] # ARABIC LETTER ZAH
+FEC7 ; [.1902.0020.0017.FEC7] # ARABIC LETTER ZAH INITIAL FORM; QQK
+FEC8 ; [.1902.0020.0018.FEC8] # ARABIC LETTER ZAH MEDIAL FORM; QQK
+FEC6 ; [.1902.0020.0019.FEC6] # ARABIC LETTER ZAH FINAL FORM; QQK
+FEC5 ; [.1902.0020.001A.FEC5] # ARABIC LETTER ZAH ISOLATED FORM; QQK
+FCB9 ; [.1902.0020.0017.FCB9][.1931.0020.0017.FCB9] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM; QQKN
+FD3B ; [.1902.0020.0018.FD3B][.1931.0020.0018.FD3B] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM; QQKN
+FC28 ; [.1902.0020.001A.FC28][.1931.0020.001A.FC28] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM; QQKN
+069F ; [.1903.0020.0002.069F] # ARABIC LETTER TAH WITH THREE DOTS ABOVE
+0639 ; [.1904.0020.0002.0639] # ARABIC LETTER AIN
+FECB ; [.1904.0020.0017.FECB] # ARABIC LETTER AIN INITIAL FORM; QQK
+FECC ; [.1904.0020.0018.FECC] # ARABIC LETTER AIN MEDIAL FORM; QQK
+FECA ; [.1904.0020.0019.FECA] # ARABIC LETTER AIN FINAL FORM; QQK
+FEC9 ; [.1904.0020.001A.FEC9] # ARABIC LETTER AIN ISOLATED FORM; QQK
+FCBA ; [.1904.0020.0017.FCBA][.18C2.0020.0017.FCBA] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM; QQKN
+FC29 ; [.1904.0020.001A.FC29][.18C2.0020.001A.FC29] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM; QQKN
+FDC4 ; [.1904.0020.0017.FDC4][.18C2.0020.0017.FDC4][.1931.0020.001F.FDC4] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FD75 ; [.1904.0020.0019.FD75][.18C2.0020.0019.FD75][.1931.0020.001F.FD75] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM; QQKN
+FDF7 ; [.1904.0020.001A.FDF7][.192B.0020.001A.FDF7][.1950.0020.001F.FDF7][.193D.0020.001F.FDF7] # ARABIC LIGATURE ALAYHE ISOLATED FORM; QQKN
+FCBB ; [.1904.0020.0017.FCBB][.1931.0020.0017.FCBB] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM; QQKN
+FC2A ; [.1904.0020.001A.FC2A][.1931.0020.001A.FC2A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM; QQKN
+FD77 ; [.1904.0020.0017.FD77][.1931.0020.0017.FD77][.1931.0020.001F.FD77] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD76 ; [.1904.0020.0019.FD76][.1931.0020.0019.FD76][.1931.0020.001F.FD76] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD78 ; [.1904.0020.0019.FD78][.1931.0020.0019.FD78][.194F.0020.001F.FD78] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDB6 ; [.1904.0020.0019.FDB6][.1931.0020.0019.FDB6][.1950.0020.001F.FDB6] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM; QQKN
+FD13 ; [.1904.0020.0019.FD13][.194F.0020.0019.FD13] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF7 ; [.1904.0020.001A.FCF7][.194F.0020.001A.FCF7] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD14 ; [.1904.0020.0019.FD14][.1950.0020.0019.FD14] # ARABIC LIGATURE AIN WITH YEH FINAL FORM; QQKN
+FCF8 ; [.1904.0020.001A.FCF8][.1950.0020.001A.FCF8] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM; QQKN
+063A ; [.1905.0020.0002.063A] # ARABIC LETTER GHAIN
+FECF ; [.1905.0020.0017.FECF] # ARABIC LETTER GHAIN INITIAL FORM; QQK
+FED0 ; [.1905.0020.0018.FED0] # ARABIC LETTER GHAIN MEDIAL FORM; QQK
+FECE ; [.1905.0020.0019.FECE] # ARABIC LETTER GHAIN FINAL FORM; QQK
+FECD ; [.1905.0020.001A.FECD] # ARABIC LETTER GHAIN ISOLATED FORM; QQK
+FCBC ; [.1905.0020.0017.FCBC][.18C2.0020.0017.FCBC] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM; QQKN
+FC2B ; [.1905.0020.001A.FC2B][.18C2.0020.001A.FC2B] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM; QQKN
+FCBD ; [.1905.0020.0017.FCBD][.1931.0020.0017.FCBD] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM; QQKN
+FC2C ; [.1905.0020.001A.FC2C][.1931.0020.001A.FC2C] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM; QQKN
+FD79 ; [.1905.0020.0019.FD79][.1931.0020.0019.FD79][.1931.0020.001F.FD79] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD7B ; [.1905.0020.0019.FD7B][.1931.0020.0019.FD7B][.194F.0020.001F.FD7B] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD7A ; [.1905.0020.0019.FD7A][.1931.0020.0019.FD7A][.1950.0020.001F.FD7A] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM; QQKN
+FD15 ; [.1905.0020.0019.FD15][.194F.0020.0019.FD15] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF9 ; [.1905.0020.001A.FCF9][.194F.0020.001A.FCF9] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD16 ; [.1905.0020.0019.FD16][.1950.0020.0019.FD16] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM; QQKN
+FCFA ; [.1905.0020.001A.FCFA][.1950.0020.001A.FCFA] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM; QQKN
+06A0 ; [.1906.0020.0002.06A0] # ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06FC ; [.1907.0020.0002.06FC] # ARABIC LETTER GHAIN WITH DOT BELOW
+075D ; [.1908.0020.0002.075D] # ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E ; [.1909.0020.0002.075E] # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F ; [.190A.0020.0002.075F] # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0641 ; [.190B.0020.0002.0641] # ARABIC LETTER FEH
+FED3 ; [.190B.0020.0017.FED3] # ARABIC LETTER FEH INITIAL FORM; QQK
+FED4 ; [.190B.0020.0018.FED4] # ARABIC LETTER FEH MEDIAL FORM; QQK
+FED2 ; [.190B.0020.0019.FED2] # ARABIC LETTER FEH FINAL FORM; QQK
+FED1 ; [.190B.0020.001A.FED1] # ARABIC LETTER FEH ISOLATED FORM; QQK
+FCBE ; [.190B.0020.0017.FCBE][.18C2.0020.0017.FCBE] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM; QQKN
+FC2D ; [.190B.0020.001A.FC2D][.18C2.0020.001A.FC2D] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM; QQKN
+FCBF ; [.190B.0020.0017.FCBF][.18C8.0020.0017.FCBF] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM; QQKN
+FC2E ; [.190B.0020.001A.FC2E][.18C8.0020.001A.FC2E] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM; QQKN
+FCC0 ; [.190B.0020.0017.FCC0][.18C9.0020.0017.FCC0] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM; QQKN
+FC2F ; [.190B.0020.001A.FC2F][.18C9.0020.001A.FC2F] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM; QQKN
+FD7D ; [.190B.0020.0017.FD7D][.18C9.0020.0017.FD7D][.1931.0020.001F.FD7D] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD7C ; [.190B.0020.0019.FD7C][.18C9.0020.0019.FD7C][.1931.0020.001F.FD7C] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM; QQKN
+FCC1 ; [.190B.0020.0017.FCC1][.1931.0020.0017.FCC1] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM; QQKN
+FC30 ; [.190B.0020.001A.FC30][.1931.0020.001A.FC30] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM; QQKN
+FDC1 ; [.190B.0020.0019.FDC1][.1931.0020.0019.FDC1][.1950.0020.001F.FDC1] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC7C ; [.190B.0020.0019.FC7C][.194F.0020.0019.FC7C] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC31 ; [.190B.0020.001A.FC31][.194F.0020.001A.FC31] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7D ; [.190B.0020.0019.FC7D][.1950.0020.0019.FC7D] # ARABIC LIGATURE FEH WITH YEH FINAL FORM; QQKN
+FC32 ; [.190B.0020.001A.FC32][.1950.0020.001A.FC32] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM; QQKN
+06A1 ; [.190C.0020.0002.06A1] # ARABIC LETTER DOTLESS FEH
+06A2 ; [.190D.0020.0002.06A2] # ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3 ; [.190E.0020.0002.06A3] # ARABIC LETTER FEH WITH DOT BELOW
+06A4 ; [.190F.0020.0002.06A4] # ARABIC LETTER VEH
+FB6C ; [.190F.0020.0017.FB6C] # ARABIC LETTER VEH INITIAL FORM; QQK
+FB6D ; [.190F.0020.0018.FB6D] # ARABIC LETTER VEH MEDIAL FORM; QQK
+FB6B ; [.190F.0020.0019.FB6B] # ARABIC LETTER VEH FINAL FORM; QQK
+FB6A ; [.190F.0020.001A.FB6A] # ARABIC LETTER VEH ISOLATED FORM; QQK
+06A5 ; [.1910.0020.0002.06A5] # ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6 ; [.1911.0020.0002.06A6] # ARABIC LETTER PEHEH
+FB70 ; [.1911.0020.0017.FB70] # ARABIC LETTER PEHEH INITIAL FORM; QQK
+FB71 ; [.1911.0020.0018.FB71] # ARABIC LETTER PEHEH MEDIAL FORM; QQK
+FB6F ; [.1911.0020.0019.FB6F] # ARABIC LETTER PEHEH FINAL FORM; QQK
+FB6E ; [.1911.0020.001A.FB6E] # ARABIC LETTER PEHEH ISOLATED FORM; QQK
+0760 ; [.1912.0020.0002.0760] # ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761 ; [.1913.0020.0002.0761] # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+066F ; [.1914.0020.0002.066F] # ARABIC LETTER DOTLESS QAF
+0642 ; [.1915.0020.0002.0642] # ARABIC LETTER QAF
+FED7 ; [.1915.0020.0017.FED7] # ARABIC LETTER QAF INITIAL FORM; QQK
+FED8 ; [.1915.0020.0018.FED8] # ARABIC LETTER QAF MEDIAL FORM; QQK
+FED6 ; [.1915.0020.0019.FED6] # ARABIC LETTER QAF FINAL FORM; QQK
+FED5 ; [.1915.0020.001A.FED5] # ARABIC LETTER QAF ISOLATED FORM; QQK
+FCC2 ; [.1915.0020.0017.FCC2][.18C8.0020.0017.FCC2] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM; QQKN
+FC33 ; [.1915.0020.001A.FC33][.18C8.0020.001A.FC33] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM; QQKN
+FDF1 ; [.1915.0020.001A.FDF1][.192B.0020.001A.FDF1][.195C.0020.001F.FDF1] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM; QQKN
+FCC3 ; [.1915.0020.0017.FCC3][.1931.0020.0017.FCC3] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM; QQKN
+FC34 ; [.1915.0020.001A.FC34][.1931.0020.001A.FC34] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM; QQKN
+FDB4 ; [.1915.0020.0017.FDB4][.1931.0020.0017.FDB4][.18C8.0020.001F.FDB4] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD7E ; [.1915.0020.0019.FD7E][.1931.0020.0019.FD7E][.18C8.0020.001F.FD7E] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM; QQKN
+FD7F ; [.1915.0020.0019.FD7F][.1931.0020.0019.FD7F][.1931.0020.001F.FD7F] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB2 ; [.1915.0020.0019.FDB2][.1931.0020.0019.FDB2][.1950.0020.001F.FDB2] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM; QQKN
+FC7E ; [.1915.0020.0019.FC7E][.194F.0020.0019.FC7E] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM; QQKN
+FC35 ; [.1915.0020.001A.FC35][.194F.0020.001A.FC35] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7F ; [.1915.0020.0019.FC7F][.1950.0020.0019.FC7F] # ARABIC LIGATURE QAF WITH YEH FINAL FORM; QQKN
+FC36 ; [.1915.0020.001A.FC36][.1950.0020.001A.FC36] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM; QQKN
+06A7 ; [.1916.0020.0002.06A7] # ARABIC LETTER QAF WITH DOT ABOVE
+06A8 ; [.1917.0020.0002.06A8] # ARABIC LETTER QAF WITH THREE DOTS ABOVE
+0643 ; [.1918.0020.0002.0643] # ARABIC LETTER KAF
+FEDB ; [.1918.0020.0017.FEDB] # ARABIC LETTER KAF INITIAL FORM; QQK
+FEDC ; [.1918.0020.0018.FEDC] # ARABIC LETTER KAF MEDIAL FORM; QQK
+FEDA ; [.1918.0020.0019.FEDA] # ARABIC LETTER KAF FINAL FORM; QQK
+FED9 ; [.1918.0020.001A.FED9] # ARABIC LETTER KAF ISOLATED FORM; QQK
+FC80 ; [.1918.0020.0019.FC80][.18AD.0020.0019.FC80] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM; QQKN
+FC37 ; [.1918.0020.001A.FC37][.18AD.0020.001A.FC37] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM; QQKN
+FCC4 ; [.1918.0020.0017.FCC4][.18C2.0020.0017.FCC4] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM; QQKN
+FC38 ; [.1918.0020.001A.FC38][.18C2.0020.001A.FC38] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM; QQKN
+FCC5 ; [.1918.0020.0017.FCC5][.18C8.0020.0017.FCC5] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM; QQKN
+FC39 ; [.1918.0020.001A.FC39][.18C8.0020.001A.FC39] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM; QQKN
+FCC6 ; [.1918.0020.0017.FCC6][.18C9.0020.0017.FCC6] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM; QQKN
+FC3A ; [.1918.0020.001A.FC3A][.18C9.0020.001A.FC3A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM; QQKN
+FCC7 ; [.1918.0020.0017.FCC7][.192B.0020.0017.FCC7] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM; QQKN
+FCEB ; [.1918.0020.0018.FCEB][.192B.0020.0018.FCEB] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM; QQKN
+FC81 ; [.1918.0020.0019.FC81][.192B.0020.0019.FC81] # ARABIC LIGATURE KAF WITH LAM FINAL FORM; QQKN
+FC3B ; [.1918.0020.001A.FC3B][.192B.0020.001A.FC3B] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM; QQKN
+FCC8 ; [.1918.0020.0017.FCC8][.1931.0020.0017.FCC8] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM; QQKN
+FCEC ; [.1918.0020.0018.FCEC][.1931.0020.0018.FCEC] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM; QQKN
+FC82 ; [.1918.0020.0019.FC82][.1931.0020.0019.FC82] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM; QQKN
+FC3C ; [.1918.0020.001A.FC3C][.1931.0020.001A.FC3C] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM; QQKN
+FDC3 ; [.1918.0020.0017.FDC3][.1931.0020.0017.FDC3][.1931.0020.001F.FDC3] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FDBB ; [.1918.0020.0019.FDBB][.1931.0020.0019.FDBB][.1931.0020.001F.FDBB] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB7 ; [.1918.0020.0019.FDB7][.1931.0020.0019.FDB7][.1950.0020.001F.FDB7] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM; QQKN
+FC83 ; [.1918.0020.0019.FC83][.194F.0020.0019.FC83] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM; QQKN
+FC3D ; [.1918.0020.001A.FC3D][.194F.0020.001A.FC3D] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC84 ; [.1918.0020.0019.FC84][.1950.0020.0019.FC84] # ARABIC LIGATURE KAF WITH YEH FINAL FORM; QQKN
+FC3E ; [.1918.0020.001A.FC3E][.1950.0020.001A.FC3E] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM; QQKN
+06A9 ; [.1919.0020.0002.06A9] # ARABIC LETTER KEHEH
+FB90 ; [.1919.0020.0017.FB90] # ARABIC LETTER KEHEH INITIAL FORM; QQK
+FB91 ; [.1919.0020.0018.FB91] # ARABIC LETTER KEHEH MEDIAL FORM; QQK
+FB8F ; [.1919.0020.0019.FB8F] # ARABIC LETTER KEHEH FINAL FORM; QQK
+FB8E ; [.1919.0020.001A.FB8E] # ARABIC LETTER KEHEH ISOLATED FORM; QQK
+06AA ; [.191A.0020.0002.06AA] # ARABIC LETTER SWASH KAF
+06AB ; [.191B.0020.0002.06AB] # ARABIC LETTER KAF WITH RING
+06AC ; [.191C.0020.0002.06AC] # ARABIC LETTER KAF WITH DOT ABOVE
+077F ; [.191D.0020.0002.077F] # ARABIC LETTER KAF WITH TWO DOTS ABOVE
+06AD ; [.191E.0020.0002.06AD] # ARABIC LETTER NG
+FBD5 ; [.191E.0020.0017.FBD5] # ARABIC LETTER NG INITIAL FORM; QQK
+FBD6 ; [.191E.0020.0018.FBD6] # ARABIC LETTER NG MEDIAL FORM; QQK
+FBD4 ; [.191E.0020.0019.FBD4] # ARABIC LETTER NG FINAL FORM; QQK
+FBD3 ; [.191E.0020.001A.FBD3] # ARABIC LETTER NG ISOLATED FORM; QQK
+06AE ; [.191F.0020.0002.06AE] # ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF ; [.1920.0020.0002.06AF] # ARABIC LETTER GAF
+FB94 ; [.1920.0020.0017.FB94] # ARABIC LETTER GAF INITIAL FORM; QQK
+FB95 ; [.1920.0020.0018.FB95] # ARABIC LETTER GAF MEDIAL FORM; QQK
+FB93 ; [.1920.0020.0019.FB93] # ARABIC LETTER GAF FINAL FORM; QQK
+FB92 ; [.1920.0020.001A.FB92] # ARABIC LETTER GAF ISOLATED FORM; QQK
+06B0 ; [.1921.0020.0002.06B0] # ARABIC LETTER GAF WITH RING
+06B1 ; [.1922.0020.0002.06B1] # ARABIC LETTER NGOEH
+FB9C ; [.1922.0020.0017.FB9C] # ARABIC LETTER NGOEH INITIAL FORM; QQK
+FB9D ; [.1922.0020.0018.FB9D] # ARABIC LETTER NGOEH MEDIAL FORM; QQK
+FB9B ; [.1922.0020.0019.FB9B] # ARABIC LETTER NGOEH FINAL FORM; QQK
+FB9A ; [.1922.0020.001A.FB9A] # ARABIC LETTER NGOEH ISOLATED FORM; QQK
+06B2 ; [.1923.0020.0002.06B2] # ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3 ; [.1924.0020.0002.06B3] # ARABIC LETTER GUEH
+FB98 ; [.1924.0020.0017.FB98] # ARABIC LETTER GUEH INITIAL FORM; QQK
+FB99 ; [.1924.0020.0018.FB99] # ARABIC LETTER GUEH MEDIAL FORM; QQK
+FB97 ; [.1924.0020.0019.FB97] # ARABIC LETTER GUEH FINAL FORM; QQK
+FB96 ; [.1924.0020.001A.FB96] # ARABIC LETTER GUEH ISOLATED FORM; QQK
+06B4 ; [.1925.0020.0002.06B4] # ARABIC LETTER GAF WITH THREE DOTS ABOVE
+0762 ; [.1926.0020.0002.0762] # ARABIC LETTER KEHEH WITH DOT ABOVE
+063B ; [.1927.0020.0002.063B] # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE
+063C ; [.1928.0020.0002.063C] # ARABIC LETTER KEHEH WITH THREE DOTS BELOW
+0763 ; [.1929.0020.0002.0763] # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+0764 ; [.192A.0020.0002.0764] # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0644 ; [.192B.0020.0002.0644] # ARABIC LETTER LAM
+FEDF ; [.192B.0020.0017.FEDF] # ARABIC LETTER LAM INITIAL FORM; QQK
+FEE0 ; [.192B.0020.0018.FEE0] # ARABIC LETTER LAM MEDIAL FORM; QQK
+FEDE ; [.192B.0020.0019.FEDE] # ARABIC LETTER LAM FINAL FORM; QQK
+FEDD ; [.192B.0020.001A.FEDD] # ARABIC LETTER LAM ISOLATED FORM; QQK
+FEF6 ; [.192B.0020.0019.FEF6][.18A3.0020.0019.FEF6] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM; QQKN
+FEF5 ; [.192B.0020.001A.FEF5][.18A3.0020.001A.FEF5] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM; QQKN
+FEF8 ; [.192B.0020.0019.FEF8][.18A4.0020.0019.FEF8] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM; QQKN
+FEF7 ; [.192B.0020.001A.FEF7][.18A4.0020.001A.FEF7] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM; QQKN
+FEFA ; [.192B.0020.0019.FEFA][.18A8.0020.0019.FEFA] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM; QQKN
+FEF9 ; [.192B.0020.001A.FEF9][.18A8.0020.001A.FEF9] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM; QQKN
+FEFC ; [.192B.0020.0019.FEFC][.18AD.0020.0019.FEFC] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM; QQKN
+FEFB ; [.192B.0020.001A.FEFB][.18AD.0020.001A.FEFB] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM; QQKN
+FCC9 ; [.192B.0020.0017.FCC9][.18C2.0020.0017.FCC9] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM; QQKN
+FC3F ; [.192B.0020.001A.FC3F][.18C2.0020.001A.FC3F] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM; QQKN
+FD83 ; [.192B.0020.0017.FD83][.18C2.0020.0017.FD83][.18C2.0020.001F.FD83] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM; QQKN
+FD84 ; [.192B.0020.0019.FD84][.18C2.0020.0019.FD84][.18C2.0020.001F.FD84] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM; QQKN
+FDBA ; [.192B.0020.0017.FDBA][.18C2.0020.0017.FDBA][.1931.0020.001F.FDBA] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDBC ; [.192B.0020.0019.FDBC][.18C2.0020.0019.FDBC][.1931.0020.001F.FDBC] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM; QQKN
+FDAC ; [.192B.0020.0019.FDAC][.18C2.0020.0019.FDAC][.1950.0020.001F.FDAC] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM; QQKN
+FCCA ; [.192B.0020.0017.FCCA][.18C8.0020.0017.FCCA] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM; QQKN
+FC40 ; [.192B.0020.001A.FC40][.18C8.0020.001A.FC40] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM; QQKN
+FDB5 ; [.192B.0020.0017.FDB5][.18C8.0020.0017.FDB5][.1931.0020.001F.FDB5] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD80 ; [.192B.0020.0019.FD80][.18C8.0020.0019.FD80][.1931.0020.001F.FD80] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM; QQKN
+FD82 ; [.192B.0020.0019.FD82][.18C8.0020.0019.FD82][.194F.0020.001F.FD82] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FD81 ; [.192B.0020.0019.FD81][.18C8.0020.0019.FD81][.1950.0020.001F.FD81] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM; QQKN
+FCCB ; [.192B.0020.0017.FCCB][.18C9.0020.0017.FCCB] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM; QQKN
+FC41 ; [.192B.0020.001A.FC41][.18C9.0020.001A.FC41] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM; QQKN
+FD86 ; [.192B.0020.0017.FD86][.18C9.0020.0017.FD86][.1931.0020.001F.FD86] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD85 ; [.192B.0020.0019.FD85][.18C9.0020.0019.FD85][.1931.0020.001F.FD85] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM; QQKN
+FCCC ; [.192B.0020.0017.FCCC][.1931.0020.0017.FCCC] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM; QQKN
+FCED ; [.192B.0020.0018.FCED][.1931.0020.0018.FCED] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM; QQKN
+FC85 ; [.192B.0020.0019.FC85][.1931.0020.0019.FC85] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM; QQKN
+FC42 ; [.192B.0020.001A.FC42][.1931.0020.001A.FC42] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM; QQKN
+FD88 ; [.192B.0020.0017.FD88][.1931.0020.0017.FD88][.18C8.0020.001F.FD88] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD87 ; [.192B.0020.0019.FD87][.1931.0020.0019.FD87][.18C8.0020.001F.FD87] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM; QQKN
+FDAD ; [.192B.0020.0019.FDAD][.1931.0020.0019.FDAD][.1950.0020.001F.FDAD] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM; QQKN
+FCCD ; [.192B.0020.0017.FCCD][.193D.0020.0017.FCCD] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM; QQKN
+FC86 ; [.192B.0020.0019.FC86][.194F.0020.0019.FC86] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM; QQKN
+FC43 ; [.192B.0020.001A.FC43][.194F.0020.001A.FC43] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC87 ; [.192B.0020.0019.FC87][.1950.0020.0019.FC87] # ARABIC LIGATURE LAM WITH YEH FINAL FORM; QQKN
+FC44 ; [.192B.0020.001A.FC44][.1950.0020.001A.FC44] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM; QQKN
+06B5 ; [.192C.0020.0002.06B5] # ARABIC LETTER LAM WITH SMALL V
+06B6 ; [.192D.0020.0002.06B6] # ARABIC LETTER LAM WITH DOT ABOVE
+06B7 ; [.192E.0020.0002.06B7] # ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8 ; [.192F.0020.0002.06B8] # ARABIC LETTER LAM WITH THREE DOTS BELOW
+076A ; [.1930.0020.0002.076A] # ARABIC LETTER LAM WITH BAR
+0645 ; [.1931.0020.0002.0645] # ARABIC LETTER MEEM
+FEE3 ; [.1931.0020.0017.FEE3] # ARABIC LETTER MEEM INITIAL FORM; QQK
+FEE4 ; [.1931.0020.0018.FEE4] # ARABIC LETTER MEEM MEDIAL FORM; QQK
+FEE2 ; [.1931.0020.0019.FEE2] # ARABIC LETTER MEEM FINAL FORM; QQK
+FEE1 ; [.1931.0020.001A.FEE1] # ARABIC LETTER MEEM ISOLATED FORM; QQK
+06FE ; [.1931.0020.0004.06FE][.0000.015A.0004.06FE] # ARABIC SIGN SINDHI POSTPOSITION MEN; QQKN
+FC88 ; [.1931.0020.0019.FC88][.18AD.0020.0019.FC88] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM; QQKN
+FCCE ; [.1931.0020.0017.FCCE][.18C2.0020.0017.FCCE] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM; QQKN
+FC45 ; [.1931.0020.001A.FC45][.18C2.0020.001A.FC45] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM; QQKN
+FD8C ; [.1931.0020.0017.FD8C][.18C2.0020.0017.FD8C][.18C8.0020.001F.FD8C] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM; QQKN
+FD92 ; [.1931.0020.0017.FD92][.18C2.0020.0017.FD92][.18C9.0020.001F.FD92] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM; QQKN
+FD8D ; [.1931.0020.0017.FD8D][.18C2.0020.0017.FD8D][.1931.0020.001F.FD8D] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDC0 ; [.1931.0020.0019.FDC0][.18C2.0020.0019.FDC0][.1950.0020.001F.FDC0] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM; QQKN
+FCCF ; [.1931.0020.0017.FCCF][.18C8.0020.0017.FCCF] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM; QQKN
+FC46 ; [.1931.0020.001A.FC46][.18C8.0020.001A.FC46] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM; QQKN
+FD89 ; [.1931.0020.0017.FD89][.18C8.0020.0017.FD89][.18C2.0020.001F.FD89] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM; QQKN
+FD8A ; [.1931.0020.0017.FD8A][.18C8.0020.0017.FD8A][.1931.0020.001F.FD8A] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM; QQKN
+FDF4 ; [.1931.0020.001A.FDF4][.18C8.0020.001A.FDF4][.1931.0020.001F.FDF4][.18D3.0020.001F.FDF4] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM; QQKN
+FD8B ; [.1931.0020.0019.FD8B][.18C8.0020.0019.FD8B][.1950.0020.001F.FD8B] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM; QQKN
+FCD0 ; [.1931.0020.0017.FCD0][.18C9.0020.0017.FCD0] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM; QQKN
+FC47 ; [.1931.0020.001A.FC47][.18C9.0020.001A.FC47] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM; QQKN
+FD8E ; [.1931.0020.0017.FD8E][.18C9.0020.0017.FD8E][.18C2.0020.001F.FD8E] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM; QQKN
+FD8F ; [.1931.0020.0017.FD8F][.18C9.0020.0017.FD8F][.1931.0020.001F.FD8F] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FDB9 ; [.1931.0020.0019.FDB9][.18C9.0020.0019.FDB9][.1950.0020.001F.FDB9] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM; QQKN
+FCD1 ; [.1931.0020.0017.FCD1][.1931.0020.0017.FCD1] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM; QQKN
+FC89 ; [.1931.0020.0019.FC89][.1931.0020.0019.FC89] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM; QQKN
+FC48 ; [.1931.0020.001A.FC48][.1931.0020.001A.FC48] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM; QQKN
+FDB1 ; [.1931.0020.0019.FDB1][.1931.0020.0019.FDB1][.1950.0020.001F.FDB1] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM; QQKN
+FC49 ; [.1931.0020.001A.FC49][.194F.0020.001A.FC49] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC4A ; [.1931.0020.001A.FC4A][.1950.0020.001A.FC4A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM; QQKN
+0765 ; [.1932.0020.0002.0765] # ARABIC LETTER MEEM WITH DOT ABOVE
+0766 ; [.1933.0020.0002.0766] # ARABIC LETTER MEEM WITH DOT BELOW
+0646 ; [.1934.0020.0002.0646] # ARABIC LETTER NOON
+FEE7 ; [.1934.0020.0017.FEE7] # ARABIC LETTER NOON INITIAL FORM; QQK
+FEE8 ; [.1934.0020.0018.FEE8] # ARABIC LETTER NOON MEDIAL FORM; QQK
+FEE6 ; [.1934.0020.0019.FEE6] # ARABIC LETTER NOON FINAL FORM; QQK
+FEE5 ; [.1934.0020.001A.FEE5] # ARABIC LETTER NOON ISOLATED FORM; QQK
+FCD2 ; [.1934.0020.0017.FCD2][.18C2.0020.0017.FCD2] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM; QQKN
+FC4B ; [.1934.0020.001A.FC4B][.18C2.0020.001A.FC4B] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM; QQKN
+FDB8 ; [.1934.0020.0017.FDB8][.18C2.0020.0017.FDB8][.18C8.0020.001F.FDB8] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM; QQKN
+FDBD ; [.1934.0020.0019.FDBD][.18C2.0020.0019.FDBD][.18C8.0020.001F.FDBD] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM; QQKN
+FD98 ; [.1934.0020.0017.FD98][.18C2.0020.0017.FD98][.1931.0020.001F.FD98] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FD97 ; [.1934.0020.0019.FD97][.18C2.0020.0019.FD97][.1931.0020.001F.FD97] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM; QQKN
+FD99 ; [.1934.0020.0019.FD99][.18C2.0020.0019.FD99][.194F.0020.001F.FD99] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDC7 ; [.1934.0020.0019.FDC7][.18C2.0020.0019.FDC7][.1950.0020.001F.FDC7] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM; QQKN
+FCD3 ; [.1934.0020.0017.FCD3][.18C8.0020.0017.FCD3] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM; QQKN
+FC4C ; [.1934.0020.001A.FC4C][.18C8.0020.001A.FC4C] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM; QQKN
+FD95 ; [.1934.0020.0017.FD95][.18C8.0020.0017.FD95][.1931.0020.001F.FD95] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD96 ; [.1934.0020.0019.FD96][.18C8.0020.0019.FD96][.194F.0020.001F.FD96] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDB3 ; [.1934.0020.0019.FDB3][.18C8.0020.0019.FDB3][.1950.0020.001F.FDB3] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM; QQKN
+FCD4 ; [.1934.0020.0017.FCD4][.18C9.0020.0017.FCD4] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM; QQKN
+FC4D ; [.1934.0020.001A.FC4D][.18C9.0020.001A.FC4D] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM; QQKN
+FC8A ; [.1934.0020.0019.FC8A][.18E1.0020.0019.FC8A] # ARABIC LIGATURE NOON WITH REH FINAL FORM; QQKN
+FC8B ; [.1934.0020.0019.FC8B][.18E2.0020.0019.FC8B] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM; QQKN
+FCD5 ; [.1934.0020.0017.FCD5][.1931.0020.0017.FCD5] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM; QQKN
+FCEE ; [.1934.0020.0018.FCEE][.1931.0020.0018.FCEE] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM; QQKN
+FC8C ; [.1934.0020.0019.FC8C][.1931.0020.0019.FC8C] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM; QQKN
+FC4E ; [.1934.0020.001A.FC4E][.1931.0020.001A.FC4E] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM; QQKN
+FD9B ; [.1934.0020.0019.FD9B][.1931.0020.0019.FD9B][.194F.0020.001F.FD9B] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD9A ; [.1934.0020.0019.FD9A][.1931.0020.0019.FD9A][.1950.0020.001F.FD9A] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM; QQKN
+FC8D ; [.1934.0020.0019.FC8D][.1934.0020.0019.FC8D] # ARABIC LIGATURE NOON WITH NOON FINAL FORM; QQKN
+FCD6 ; [.1934.0020.0017.FCD6][.193D.0020.0017.FCD6] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM; QQKN
+FCEF ; [.1934.0020.0018.FCEF][.193D.0020.0018.FCEF] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM; QQKN
+FC8E ; [.1934.0020.0019.FC8E][.194F.0020.0019.FC8E] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM; QQKN
+FC4F ; [.1934.0020.001A.FC4F][.194F.0020.001A.FC4F] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC8F ; [.1934.0020.0019.FC8F][.1950.0020.0019.FC8F] # ARABIC LIGATURE NOON WITH YEH FINAL FORM; QQKN
+FC50 ; [.1934.0020.001A.FC50][.1950.0020.001A.FC50] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM; QQKN
+06BA ; [.1935.0020.0002.06BA] # ARABIC LETTER NOON GHUNNA
+FB9F ; [.1935.0020.0019.FB9F] # ARABIC LETTER NOON GHUNNA FINAL FORM; QQK
+FB9E ; [.1935.0020.001A.FB9E] # ARABIC LETTER NOON GHUNNA ISOLATED FORM; QQK
+06BB ; [.1936.0020.0002.06BB] # ARABIC LETTER RNOON
+FBA2 ; [.1936.0020.0017.FBA2] # ARABIC LETTER RNOON INITIAL FORM; QQK
+FBA3 ; [.1936.0020.0018.FBA3] # ARABIC LETTER RNOON MEDIAL FORM; QQK
+FBA1 ; [.1936.0020.0019.FBA1] # ARABIC LETTER RNOON FINAL FORM; QQK
+FBA0 ; [.1936.0020.001A.FBA0] # ARABIC LETTER RNOON ISOLATED FORM; QQK
+06BC ; [.1937.0020.0002.06BC] # ARABIC LETTER NOON WITH RING
+06BD ; [.1938.0020.0002.06BD] # ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06B9 ; [.1939.0020.0002.06B9] # ARABIC LETTER NOON WITH DOT BELOW
+0767 ; [.193A.0020.0002.0767] # ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768 ; [.193B.0020.0002.0768] # ARABIC LETTER NOON WITH SMALL TAH
+0769 ; [.193C.0020.0002.0769] # ARABIC LETTER NOON WITH SMALL V
+0647 ; [.193D.0020.0002.0647] # ARABIC LETTER HEH
+FEEB ; [.193D.0020.0017.FEEB] # ARABIC LETTER HEH INITIAL FORM; QQK
+FEEC ; [.193D.0020.0018.FEEC] # ARABIC LETTER HEH MEDIAL FORM; QQK
+FEEA ; [.193D.0020.0019.FEEA] # ARABIC LETTER HEH FINAL FORM; QQK
+FEE9 ; [.193D.0020.001A.FEE9] # ARABIC LETTER HEH ISOLATED FORM; QQK
+FCD9 ; [.193D.0020.0017.FCD9][.0000.00BC.0017.FCD9] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM; QQKN
+FCD7 ; [.193D.0020.0017.FCD7][.18C2.0020.0017.FCD7] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM; QQKN
+FC51 ; [.193D.0020.001A.FC51][.18C2.0020.001A.FC51] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM; QQKN
+FCD8 ; [.193D.0020.0017.FCD8][.1931.0020.0017.FCD8] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM; QQKN
+FC52 ; [.193D.0020.001A.FC52][.1931.0020.001A.FC52] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM; QQKN
+FD93 ; [.193D.0020.0017.FD93][.1931.0020.0017.FD93][.18C2.0020.001F.FD93] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD94 ; [.193D.0020.0017.FD94][.1931.0020.0017.FD94][.1931.0020.001F.FD94] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FC53 ; [.193D.0020.001A.FC53][.194F.0020.001A.FC53] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC54 ; [.193D.0020.001A.FC54][.1950.0020.001A.FC54] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM; QQKN
+06BE ; [.193E.0020.0002.06BE] # ARABIC LETTER HEH DOACHASHMEE
+FBAC ; [.193E.0020.0017.FBAC] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM; QQK
+FBAD ; [.193E.0020.0018.FBAD] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM; QQK
+FBAB ; [.193E.0020.0019.FBAB] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM; QQK
+FBAA ; [.193E.0020.001A.FBAA] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM; QQK
+06C1 ; [.193F.0020.0002.06C1] # ARABIC LETTER HEH GOAL
+FBA8 ; [.193F.0020.0017.FBA8] # ARABIC LETTER HEH GOAL INITIAL FORM; QQK
+FBA9 ; [.193F.0020.0018.FBA9] # ARABIC LETTER HEH GOAL MEDIAL FORM; QQK
+FBA7 ; [.193F.0020.0019.FBA7] # ARABIC LETTER HEH GOAL FINAL FORM; QQK
+FBA6 ; [.193F.0020.001A.FBA6] # ARABIC LETTER HEH GOAL ISOLATED FORM; QQK
+06C2 ; [.193F.0020.0002.06C1][.0000.00B1.0002.0654] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE; QQCM
+06C3 ; [.1940.0020.0002.06C3] # ARABIC LETTER TEH MARBUTA GOAL
+06FF ; [.1941.0020.0002.06FF] # ARABIC LETTER HEH WITH INVERTED V
+06D5 ; [.1942.0020.0002.06D5] # ARABIC LETTER AE
+06C0 ; [.1942.0020.0002.06D5][.0000.00B1.0002.0654] # ARABIC LETTER HEH WITH YEH ABOVE; QQCM
+FBA5 ; [.1942.0020.0019.FBA5][.0000.00B1.0019.FBA5] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM; QQKN
+FBA4 ; [.1942.0020.001A.FBA4][.0000.00B1.001A.FBA4] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM; QQKN
+0648 ; [.1943.0020.0002.0648] # ARABIC LETTER WAW
+06E5 ; [.1943.0020.0004.06E5] # ARABIC SMALL WAW; QQK
+FEEE ; [.1943.0020.0019.FEEE] # ARABIC LETTER WAW FINAL FORM; QQK
+FEED ; [.1943.0020.001A.FEED] # ARABIC LETTER WAW ISOLATED FORM; QQK
+0676 ; [.1943.0020.0004.0676][.18A2.0020.0004.0676] # ARABIC LETTER HIGH HAMZA WAW; QQKN
+FDF8 ; [.1943.0020.001A.FDF8][.18F1.0020.001A.FDF8][.192B.0020.001F.FDF8][.1931.0020.001F.FDF8] # ARABIC LIGATURE WASALLAM ISOLATED FORM; QQKN
+06C4 ; [.1944.0020.0002.06C4] # ARABIC LETTER WAW WITH RING
+06C5 ; [.1945.0020.0002.06C5] # ARABIC LETTER KIRGHIZ OE
+FBE1 ; [.1945.0020.0019.FBE1] # ARABIC LETTER KIRGHIZ OE FINAL FORM; QQK
+FBE0 ; [.1945.0020.001A.FBE0] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM; QQK
+06C6 ; [.1946.0020.0002.06C6] # ARABIC LETTER OE
+FBDA ; [.1946.0020.0019.FBDA] # ARABIC LETTER OE FINAL FORM; QQK
+FBD9 ; [.1946.0020.001A.FBD9] # ARABIC LETTER OE ISOLATED FORM; QQK
+06C7 ; [.1947.0020.0002.06C7] # ARABIC LETTER U
+FBD8 ; [.1947.0020.0019.FBD8] # ARABIC LETTER U FINAL FORM; QQK
+FBD7 ; [.1947.0020.001A.FBD7] # ARABIC LETTER U ISOLATED FORM; QQK
+0677 ; [.1947.0020.0004.0677][.18A2.0020.0004.0677] # ARABIC LETTER U WITH HAMZA ABOVE; QQKN
+FBDD ; [.1947.0020.001A.FBDD][.18A2.0020.001A.FBDD] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM; QQKN
+06C8 ; [.1948.0020.0002.06C8] # ARABIC LETTER YU
+FBDC ; [.1948.0020.0019.FBDC] # ARABIC LETTER YU FINAL FORM; QQK
+FBDB ; [.1948.0020.001A.FBDB] # ARABIC LETTER YU ISOLATED FORM; QQK
+06C9 ; [.1949.0020.0002.06C9] # ARABIC LETTER KIRGHIZ YU
+FBE3 ; [.1949.0020.0019.FBE3] # ARABIC LETTER KIRGHIZ YU FINAL FORM; QQK
+FBE2 ; [.1949.0020.001A.FBE2] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM; QQK
+06CA ; [.194A.0020.0002.06CA] # ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB ; [.194B.0020.0002.06CB] # ARABIC LETTER VE
+FBDF ; [.194B.0020.0019.FBDF] # ARABIC LETTER VE FINAL FORM; QQK
+FBDE ; [.194B.0020.001A.FBDE] # ARABIC LETTER VE ISOLATED FORM; QQK
+06CF ; [.194C.0020.0002.06CF] # ARABIC LETTER WAW WITH DOT ABOVE
+0778 ; [.194D.0020.0002.0778] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0779 ; [.194E.0020.0002.0779] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0649 ; [.194F.0020.0002.0649] # ARABIC LETTER ALEF MAKSURA
+FBE8 ; [.194F.0020.0017.FBE8] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM; QQK
+FBE9 ; [.194F.0020.0018.FBE9] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM; QQK
+FEF0 ; [.194F.0020.0019.FEF0] # ARABIC LETTER ALEF MAKSURA FINAL FORM; QQK
+FEEF ; [.194F.0020.001A.FEEF] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM; QQK
+FC90 ; [.194F.0020.0019.FC90][.0000.00BC.0019.FC90] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM; QQKN
+FC5D ; [.194F.0020.001A.FC5D][.0000.00BC.001A.FC5D] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+064A ; [.1950.0020.0002.064A] # ARABIC LETTER YEH
+06E6 ; [.1950.0020.0004.06E6] # ARABIC SMALL YEH; QQK
+FEF3 ; [.1950.0020.0017.FEF3] # ARABIC LETTER YEH INITIAL FORM; QQK
+FEF4 ; [.1950.0020.0018.FEF4] # ARABIC LETTER YEH MEDIAL FORM; QQK
+FEF2 ; [.1950.0020.0019.FEF2] # ARABIC LETTER YEH FINAL FORM; QQK
+FEF1 ; [.1950.0020.001A.FEF1] # ARABIC LETTER YEH ISOLATED FORM; QQK
+0678 ; [.1950.0020.0004.0678][.18A2.0020.0004.0678] # ARABIC LETTER HIGH HAMZA YEH; QQKN
+FCDA ; [.1950.0020.0017.FCDA][.18C2.0020.0017.FCDA] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM; QQKN
+FC55 ; [.1950.0020.001A.FC55][.18C2.0020.001A.FC55] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM; QQKN
+FDAF ; [.1950.0020.0019.FDAF][.18C2.0020.0019.FDAF][.1950.0020.001F.FDAF] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCDB ; [.1950.0020.0017.FCDB][.18C8.0020.0017.FCDB] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM; QQKN
+FC56 ; [.1950.0020.001A.FC56][.18C8.0020.001A.FC56] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM; QQKN
+FDAE ; [.1950.0020.0019.FDAE][.18C8.0020.0019.FDAE][.1950.0020.001F.FDAE] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM; QQKN
+FCDC ; [.1950.0020.0017.FCDC][.18C9.0020.0017.FCDC] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM; QQKN
+FC57 ; [.1950.0020.001A.FC57][.18C9.0020.001A.FC57] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM; QQKN
+FC91 ; [.1950.0020.0019.FC91][.18E1.0020.0019.FC91] # ARABIC LIGATURE YEH WITH REH FINAL FORM; QQKN
+FC92 ; [.1950.0020.0019.FC92][.18E2.0020.0019.FC92] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM; QQKN
+FCDD ; [.1950.0020.0017.FCDD][.1931.0020.0017.FCDD] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM; QQKN
+FCF0 ; [.1950.0020.0018.FCF0][.1931.0020.0018.FCF0] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM; QQKN
+FC93 ; [.1950.0020.0019.FC93][.1931.0020.0019.FC93] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM; QQKN
+FC58 ; [.1950.0020.001A.FC58][.1931.0020.001A.FC58] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM; QQKN
+FD9D ; [.1950.0020.0017.FD9D][.1931.0020.0017.FD9D][.1931.0020.001F.FD9D] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD9C ; [.1950.0020.0019.FD9C][.1931.0020.0019.FD9C][.1931.0020.001F.FD9C] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB0 ; [.1950.0020.0019.FDB0][.1931.0020.0019.FDB0][.1950.0020.001F.FDB0] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC94 ; [.1950.0020.0019.FC94][.1934.0020.0019.FC94] # ARABIC LIGATURE YEH WITH NOON FINAL FORM; QQKN
+FCDE ; [.1950.0020.0017.FCDE][.193D.0020.0017.FCDE] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM; QQKN
+FCF1 ; [.1950.0020.0018.FCF1][.193D.0020.0018.FCF1] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM; QQKN
+FC95 ; [.1950.0020.0019.FC95][.194F.0020.0019.FC95] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC59 ; [.1950.0020.001A.FC59][.194F.0020.001A.FC59] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC96 ; [.1950.0020.0019.FC96][.1950.0020.0019.FC96] # ARABIC LIGATURE YEH WITH YEH FINAL FORM; QQKN
+FC5A ; [.1950.0020.001A.FC5A][.1950.0020.001A.FC5A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM; QQKN
+06CC ; [.1951.0020.0002.06CC] # ARABIC LETTER FARSI YEH
+FBFE ; [.1951.0020.0017.FBFE] # ARABIC LETTER FARSI YEH INITIAL FORM; QQK
+FBFF ; [.1951.0020.0018.FBFF] # ARABIC LETTER FARSI YEH MEDIAL FORM; QQK
+FBFD ; [.1951.0020.0019.FBFD] # ARABIC LETTER FARSI YEH FINAL FORM; QQK
+FBFC ; [.1951.0020.001A.FBFC] # ARABIC LETTER FARSI YEH ISOLATED FORM; QQK
+06CD ; [.1952.0020.0002.06CD] # ARABIC LETTER YEH WITH TAIL
+06CE ; [.1953.0020.0002.06CE] # ARABIC LETTER YEH WITH SMALL V
+06D0 ; [.1954.0020.0002.06D0] # ARABIC LETTER E
+FBE6 ; [.1954.0020.0017.FBE6] # ARABIC LETTER E INITIAL FORM; QQK
+FBE7 ; [.1954.0020.0018.FBE7] # ARABIC LETTER E MEDIAL FORM; QQK
+FBE5 ; [.1954.0020.0019.FBE5] # ARABIC LETTER E FINAL FORM; QQK
+FBE4 ; [.1954.0020.001A.FBE4] # ARABIC LETTER E ISOLATED FORM; QQK
+06D1 ; [.1955.0020.0002.06D1] # ARABIC LETTER YEH WITH THREE DOTS BELOW
+063D ; [.1956.0020.0002.063D] # ARABIC LETTER FARSI YEH WITH INVERTED V
+063E ; [.1957.0020.0002.063E] # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE
+063F ; [.1958.0020.0002.063F] # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0775 ; [.1959.0020.0002.0775] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0776 ; [.195A.0020.0002.0776] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0777 ; [.195B.0020.0002.0777] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+06D2 ; [.195C.0020.0002.06D2] # ARABIC LETTER YEH BARREE
+FBAF ; [.195C.0020.0019.FBAF] # ARABIC LETTER YEH BARREE FINAL FORM; QQK
+FBAE ; [.195C.0020.001A.FBAE] # ARABIC LETTER YEH BARREE ISOLATED FORM; QQK
+06D3 ; [.195C.0020.0002.06D2][.0000.00B1.0002.0654] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE; QQCM
+FBB1 ; [.195C.0020.0019.FBB1][.0000.00B1.0019.FBB1] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM; QQKN
+FBB0 ; [.195C.0020.001A.FBB0][.0000.00B1.001A.FBB0] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM; QQKN
+077A ; [.195D.0020.0002.077A] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+077B ; [.195E.0020.0002.077B] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0710 ; [.195F.0020.0002.0710] # SYRIAC LETTER ALAPH
+0712 ; [.1960.0020.0002.0712] # SYRIAC LETTER BETH
+072D ; [.1960.0020.0004.072D][.0000.015C.0004.072D] # SYRIAC LETTER PERSIAN BHETH; QQKN
+0713 ; [.1961.0020.0002.0713] # SYRIAC LETTER GAMAL
+0714 ; [.1961.0020.0004.0714][.0000.015A.0004.0714] # SYRIAC LETTER GAMAL GARSHUNI; QQKN
+072E ; [.1961.0020.0004.072E][.0000.015C.0004.072E] # SYRIAC LETTER PERSIAN GHAMAL; QQKN
+0716 ; [.1962.0020.0002.0716] # SYRIAC LETTER DOTLESS DALATH RISH
+0715 ; [.1963.0020.0002.0715] # SYRIAC LETTER DALATH
+072F ; [.1963.0020.0004.072F][.0000.015C.0004.072F] # SYRIAC LETTER PERSIAN DHALATH; QQKN
+0717 ; [.1964.0020.0002.0717] # SYRIAC LETTER HE
+0718 ; [.1965.0020.0002.0718] # SYRIAC LETTER WAW
+0719 ; [.1966.0020.0002.0719] # SYRIAC LETTER ZAIN
+074D ; [.1967.0020.0002.074D] # SYRIAC LETTER SOGDIAN ZHAIN
+071A ; [.1968.0020.0002.071A] # SYRIAC LETTER HETH
+071B ; [.1969.0020.0002.071B] # SYRIAC LETTER TETH
+071C ; [.1969.0020.0004.071C][.0000.015A.0004.071C] # SYRIAC LETTER TETH GARSHUNI; QQKN
+071D ; [.196A.0020.0002.071D] # SYRIAC LETTER YUDH
+071E ; [.196B.0020.0002.071E] # SYRIAC LETTER YUDH HE
+071F ; [.196C.0020.0002.071F] # SYRIAC LETTER KAPH
+074E ; [.196D.0020.0002.074E] # SYRIAC LETTER SOGDIAN KHAPH
+0720 ; [.196E.0020.0002.0720] # SYRIAC LETTER LAMADH
+0721 ; [.196F.0020.0002.0721] # SYRIAC LETTER MIM
+0722 ; [.1970.0020.0002.0722] # SYRIAC LETTER NUN
+0723 ; [.1971.0020.0002.0723] # SYRIAC LETTER SEMKATH
+0724 ; [.1971.0020.0019.0724] # SYRIAC LETTER FINAL SEMKATH; QQK
+0725 ; [.1972.0020.0002.0725] # SYRIAC LETTER E
+0726 ; [.1973.0020.0002.0726] # SYRIAC LETTER PE
+0727 ; [.1973.0020.0004.0727][.0000.015A.0004.0727] # SYRIAC LETTER REVERSED PE; QQKN
+074F ; [.1974.0020.0002.074F] # SYRIAC LETTER SOGDIAN FE
+0728 ; [.1975.0020.0002.0728] # SYRIAC LETTER SADHE
+0729 ; [.1976.0020.0002.0729] # SYRIAC LETTER QAPH
+072A ; [.1977.0020.0002.072A] # SYRIAC LETTER RISH
+072B ; [.1978.0020.0002.072B] # SYRIAC LETTER SHIN
+072C ; [.1979.0020.0002.072C] # SYRIAC LETTER TAW
+0780 ; [.197A.0020.0002.0780] # THAANA LETTER HAA
+0799 ; [.197B.0020.0002.0799] # THAANA LETTER HHAA
+079A ; [.197C.0020.0002.079A] # THAANA LETTER KHAA
+0781 ; [.197D.0020.0002.0781] # THAANA LETTER SHAVIYANI
+0782 ; [.197E.0020.0002.0782] # THAANA LETTER NOONU
+0783 ; [.197F.0020.0002.0783] # THAANA LETTER RAA
+079C ; [.1980.0020.0002.079C] # THAANA LETTER ZAA
+0784 ; [.1981.0020.0002.0784] # THAANA LETTER BAA
+0785 ; [.1982.0020.0002.0785] # THAANA LETTER LHAVIYANI
+0786 ; [.1983.0020.0002.0786] # THAANA LETTER KAAFU
+0787 ; [.1984.0020.0002.0787] # THAANA LETTER ALIFU
+07A2 ; [.1985.0020.0002.07A2] # THAANA LETTER AINU
+07A3 ; [.1986.0020.0002.07A3] # THAANA LETTER GHAINU
+0788 ; [.1987.0020.0002.0788] # THAANA LETTER VAAVU
+07A5 ; [.1988.0020.0002.07A5] # THAANA LETTER WAAVU
+0789 ; [.1989.0020.0002.0789] # THAANA LETTER MEEMU
+078A ; [.198A.0020.0002.078A] # THAANA LETTER FAAFU
+078B ; [.198B.0020.0002.078B] # THAANA LETTER DHAALU
+079B ; [.198C.0020.0002.079B] # THAANA LETTER THAALU
+078C ; [.198D.0020.0002.078C] # THAANA LETTER THAA
+0798 ; [.198E.0020.0002.0798] # THAANA LETTER TTAA
+07A0 ; [.198F.0020.0002.07A0] # THAANA LETTER TO
+07A1 ; [.1990.0020.0002.07A1] # THAANA LETTER ZO
+078D ; [.1991.0020.0002.078D] # THAANA LETTER LAAMU
+078E ; [.1992.0020.0002.078E] # THAANA LETTER GAAFU
+07A4 ; [.1993.0020.0002.07A4] # THAANA LETTER QAAFU
+078F ; [.1994.0020.0002.078F] # THAANA LETTER GNAVIYANI
+0790 ; [.1995.0020.0002.0790] # THAANA LETTER SEENU
+079D ; [.1996.0020.0002.079D] # THAANA LETTER SHEENU
+079E ; [.1997.0020.0002.079E] # THAANA LETTER SAADHU
+079F ; [.1998.0020.0002.079F] # THAANA LETTER DAADHU
+0791 ; [.1999.0020.0002.0791] # THAANA LETTER DAVIYANI
+0792 ; [.199A.0020.0002.0792] # THAANA LETTER ZAVIYANI
+0793 ; [.199B.0020.0002.0793] # THAANA LETTER TAVIYANI
+0794 ; [.199C.0020.0002.0794] # THAANA LETTER YAA
+0795 ; [.199D.0020.0002.0795] # THAANA LETTER PAVIYANI
+0796 ; [.199E.0020.0002.0796] # THAANA LETTER JAVIYANI
+0797 ; [.199F.0020.0002.0797] # THAANA LETTER CHAVIYANI
+07B1 ; [.19A0.0020.0002.07B1] # THAANA LETTER NAA
+07A6 ; [.19A1.0020.0002.07A6] # THAANA ABAFILI
+07A7 ; [.19A2.0020.0002.07A7] # THAANA AABAAFILI
+07A8 ; [.19A3.0020.0002.07A8] # THAANA IBIFILI
+07A9 ; [.19A4.0020.0002.07A9] # THAANA EEBEEFILI
+07AA ; [.19A5.0020.0002.07AA] # THAANA UBUFILI
+07AB ; [.19A6.0020.0002.07AB] # THAANA OOBOOFILI
+07AC ; [.19A7.0020.0002.07AC] # THAANA EBEFILI
+07AD ; [.19A8.0020.0002.07AD] # THAANA EYBEYFILI
+07AE ; [.19A9.0020.0002.07AE] # THAANA OBOFILI
+07AF ; [.19AA.0020.0002.07AF] # THAANA OABOAFILI
+07B0 ; [.19AB.0020.0002.07B0] # THAANA SUKUN
+07CA ; [.19AC.0020.0002.07CA] # NKO LETTER A
+07CB ; [.19AD.0020.0002.07CB] # NKO LETTER EE
+07CC ; [.19AE.0020.0002.07CC] # NKO LETTER I
+07CD ; [.19AF.0020.0002.07CD] # NKO LETTER E
+07CE ; [.19B0.0020.0002.07CE] # NKO LETTER U
+07CF ; [.19B1.0020.0002.07CF] # NKO LETTER OO
+07D0 ; [.19B2.0020.0002.07D0] # NKO LETTER O
+07D1 ; [.19B3.0020.0002.07D1] # NKO LETTER DAGBASINNA
+07D2 ; [.19B4.0020.0002.07D2] # NKO LETTER N
+07D3 ; [.19B5.0020.0002.07D3] # NKO LETTER BA
+07D4 ; [.19B6.0020.0002.07D4] # NKO LETTER PA
+07D5 ; [.19B7.0020.0002.07D5] # NKO LETTER TA
+07D6 ; [.19B8.0020.0002.07D6] # NKO LETTER JA
+07E8 ; [.19B8.0020.0004.07E8][.0000.0159.0004.07E8] # NKO LETTER JONA JA; QQKN
+07D7 ; [.19B9.0020.0002.07D7] # NKO LETTER CHA
+07E9 ; [.19B9.0020.0004.07E9][.0000.0159.0004.07E9] # NKO LETTER JONA CHA; QQKN
+07D8 ; [.19BA.0020.0002.07D8] # NKO LETTER DA
+07D9 ; [.19BB.0020.0002.07D9] # NKO LETTER RA
+07EA ; [.19BB.0020.0004.07EA][.0000.0159.0004.07EA] # NKO LETTER JONA RA; QQKN
+07DA ; [.19BC.0020.0002.07DA] # NKO LETTER RRA
+07DB ; [.19BD.0020.0002.07DB] # NKO LETTER SA
+07DC ; [.19BE.0020.0002.07DC] # NKO LETTER GBA
+07DD ; [.19BF.0020.0002.07DD] # NKO LETTER FA
+07DE ; [.19C0.0020.0002.07DE] # NKO LETTER KA
+07DF ; [.19C1.0020.0002.07DF] # NKO LETTER LA
+07E0 ; [.19C2.0020.0002.07E0] # NKO LETTER NA WOLOSO
+07E1 ; [.19C3.0020.0002.07E1] # NKO LETTER MA
+07E2 ; [.19C4.0020.0002.07E2] # NKO LETTER NYA
+07E3 ; [.19C5.0020.0002.07E3] # NKO LETTER NA
+07E4 ; [.19C6.0020.0002.07E4] # NKO LETTER HA
+07E5 ; [.19C7.0020.0002.07E5] # NKO LETTER WA
+07E6 ; [.19C8.0020.0002.07E6] # NKO LETTER YA
+07E7 ; [.19C9.0020.0002.07E7] # NKO LETTER NYA WOLOSO
+07F4 ; [.19CA.0020.0002.07F4] # NKO HIGH TONE APOSTROPHE
+07F5 ; [.19CB.0020.0002.07F5] # NKO LOW TONE APOSTROPHE
+2D30 ; [.19CC.0020.0002.2D30] # TIFINAGH LETTER YA
+2D31 ; [.19CD.0020.0002.2D31] # TIFINAGH LETTER YAB
+2D32 ; [.19CE.0020.0002.2D32] # TIFINAGH LETTER YABH
+2D33 ; [.19CF.0020.0002.2D33] # TIFINAGH LETTER YAG
+2D34 ; [.19D0.0020.0002.2D34] # TIFINAGH LETTER YAGHH
+2D35 ; [.19D1.0020.0002.2D35] # TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36 ; [.19D2.0020.0002.2D36] # TIFINAGH LETTER YAJ
+2D37 ; [.19D3.0020.0002.2D37] # TIFINAGH LETTER YAD
+2D38 ; [.19D4.0020.0002.2D38] # TIFINAGH LETTER YADH
+2D39 ; [.19D5.0020.0002.2D39] # TIFINAGH LETTER YADD
+2D3A ; [.19D6.0020.0002.2D3A] # TIFINAGH LETTER YADDH
+2D3B ; [.19D7.0020.0002.2D3B] # TIFINAGH LETTER YEY
+2D3C ; [.19D8.0020.0002.2D3C] # TIFINAGH LETTER YAF
+2D3D ; [.19D9.0020.0002.2D3D] # TIFINAGH LETTER YAK
+2D3E ; [.19DA.0020.0002.2D3E] # TIFINAGH LETTER TUAREG YAK
+2D3F ; [.19DB.0020.0002.2D3F] # TIFINAGH LETTER YAKHH
+2D40 ; [.19DC.0020.0002.2D40] # TIFINAGH LETTER YAH
+2D41 ; [.19DD.0020.0002.2D41] # TIFINAGH LETTER BERBER ACADEMY YAH
+2D42 ; [.19DE.0020.0002.2D42] # TIFINAGH LETTER TUAREG YAH
+2D43 ; [.19DF.0020.0002.2D43] # TIFINAGH LETTER YAHH
+2D44 ; [.19E0.0020.0002.2D44] # TIFINAGH LETTER YAA
+2D45 ; [.19E1.0020.0002.2D45] # TIFINAGH LETTER YAKH
+2D46 ; [.19E2.0020.0002.2D46] # TIFINAGH LETTER TUAREG YAKH
+2D47 ; [.19E3.0020.0002.2D47] # TIFINAGH LETTER YAQ
+2D48 ; [.19E4.0020.0002.2D48] # TIFINAGH LETTER TUAREG YAQ
+2D49 ; [.19E5.0020.0002.2D49] # TIFINAGH LETTER YI
+2D4A ; [.19E6.0020.0002.2D4A] # TIFINAGH LETTER YAZH
+2D4B ; [.19E7.0020.0002.2D4B] # TIFINAGH LETTER AHAGGAR YAZH
+2D4C ; [.19E8.0020.0002.2D4C] # TIFINAGH LETTER TUAREG YAZH
+2D4D ; [.19E9.0020.0002.2D4D] # TIFINAGH LETTER YAL
+2D4E ; [.19EA.0020.0002.2D4E] # TIFINAGH LETTER YAM
+2D4F ; [.19EB.0020.0002.2D4F] # TIFINAGH LETTER YAN
+2D50 ; [.19EC.0020.0002.2D50] # TIFINAGH LETTER TUAREG YAGN
+2D51 ; [.19ED.0020.0002.2D51] # TIFINAGH LETTER TUAREG YANG
+2D52 ; [.19EE.0020.0002.2D52] # TIFINAGH LETTER YAP
+2D53 ; [.19EF.0020.0002.2D53] # TIFINAGH LETTER YU
+2D54 ; [.19F0.0020.0002.2D54] # TIFINAGH LETTER YAR
+2D55 ; [.19F1.0020.0002.2D55] # TIFINAGH LETTER YARR
+2D56 ; [.19F2.0020.0002.2D56] # TIFINAGH LETTER YAGH
+2D57 ; [.19F3.0020.0002.2D57] # TIFINAGH LETTER TUAREG YAGH
+2D58 ; [.19F4.0020.0002.2D58] # TIFINAGH LETTER AYER YAGH
+2D59 ; [.19F5.0020.0002.2D59] # TIFINAGH LETTER YAS
+2D5A ; [.19F6.0020.0002.2D5A] # TIFINAGH LETTER YASS
+2D5B ; [.19F7.0020.0002.2D5B] # TIFINAGH LETTER YASH
+2D5C ; [.19F8.0020.0002.2D5C] # TIFINAGH LETTER YAT
+2D5D ; [.19F9.0020.0002.2D5D] # TIFINAGH LETTER YATH
+2D5E ; [.19FA.0020.0002.2D5E] # TIFINAGH LETTER YACH
+2D5F ; [.19FB.0020.0002.2D5F] # TIFINAGH LETTER YATT
+2D60 ; [.19FC.0020.0002.2D60] # TIFINAGH LETTER YAV
+2D61 ; [.19FD.0020.0002.2D61] # TIFINAGH LETTER YAW
+2D62 ; [.19FE.0020.0002.2D62] # TIFINAGH LETTER YAY
+2D63 ; [.19FF.0020.0002.2D63] # TIFINAGH LETTER YAZ
+2D64 ; [.1A00.0020.0002.2D64] # TIFINAGH LETTER TAWELLEMET YAZ
+2D65 ; [.1A01.0020.0002.2D65] # TIFINAGH LETTER YAZZ
+2D6F ; [.1A02.0020.0002.2D6F] # TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+1200 ; [.1A03.0020.0002.1200] # ETHIOPIC SYLLABLE HA
+1201 ; [.1A04.0020.0002.1201] # ETHIOPIC SYLLABLE HU
+1202 ; [.1A05.0020.0002.1202] # ETHIOPIC SYLLABLE HI
+1203 ; [.1A06.0020.0002.1203] # ETHIOPIC SYLLABLE HAA
+1204 ; [.1A07.0020.0002.1204] # ETHIOPIC SYLLABLE HEE
+1205 ; [.1A08.0020.0002.1205] # ETHIOPIC SYLLABLE HE
+1206 ; [.1A09.0020.0002.1206] # ETHIOPIC SYLLABLE HO
+1207 ; [.1A0A.0020.0002.1207] # ETHIOPIC SYLLABLE HOA
+1208 ; [.1A0B.0020.0002.1208] # ETHIOPIC SYLLABLE LA
+1209 ; [.1A0C.0020.0002.1209] # ETHIOPIC SYLLABLE LU
+120A ; [.1A0D.0020.0002.120A] # ETHIOPIC SYLLABLE LI
+120B ; [.1A0E.0020.0002.120B] # ETHIOPIC SYLLABLE LAA
+120C ; [.1A0F.0020.0002.120C] # ETHIOPIC SYLLABLE LEE
+120D ; [.1A10.0020.0002.120D] # ETHIOPIC SYLLABLE LE
+120E ; [.1A11.0020.0002.120E] # ETHIOPIC SYLLABLE LO
+120F ; [.1A12.0020.0002.120F] # ETHIOPIC SYLLABLE LWA
+2D80 ; [.1A13.0020.0002.2D80] # ETHIOPIC SYLLABLE LOA
+1210 ; [.1A14.0020.0002.1210] # ETHIOPIC SYLLABLE HHA
+1211 ; [.1A15.0020.0002.1211] # ETHIOPIC SYLLABLE HHU
+1212 ; [.1A16.0020.0002.1212] # ETHIOPIC SYLLABLE HHI
+1213 ; [.1A17.0020.0002.1213] # ETHIOPIC SYLLABLE HHAA
+1214 ; [.1A18.0020.0002.1214] # ETHIOPIC SYLLABLE HHEE
+1215 ; [.1A19.0020.0002.1215] # ETHIOPIC SYLLABLE HHE
+1216 ; [.1A1A.0020.0002.1216] # ETHIOPIC SYLLABLE HHO
+1217 ; [.1A1B.0020.0002.1217] # ETHIOPIC SYLLABLE HHWA
+1218 ; [.1A1C.0020.0002.1218] # ETHIOPIC SYLLABLE MA
+1219 ; [.1A1D.0020.0002.1219] # ETHIOPIC SYLLABLE MU
+121A ; [.1A1E.0020.0002.121A] # ETHIOPIC SYLLABLE MI
+121B ; [.1A1F.0020.0002.121B] # ETHIOPIC SYLLABLE MAA
+121C ; [.1A20.0020.0002.121C] # ETHIOPIC SYLLABLE MEE
+121D ; [.1A21.0020.0002.121D] # ETHIOPIC SYLLABLE ME
+121E ; [.1A22.0020.0002.121E] # ETHIOPIC SYLLABLE MO
+121F ; [.1A23.0020.0002.121F] # ETHIOPIC SYLLABLE MWA
+1380 ; [.1A24.0020.0002.1380] # ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381 ; [.1A25.0020.0002.1381] # ETHIOPIC SYLLABLE MWI
+1382 ; [.1A26.0020.0002.1382] # ETHIOPIC SYLLABLE MWEE
+1383 ; [.1A27.0020.0002.1383] # ETHIOPIC SYLLABLE MWE
+2D81 ; [.1A28.0020.0002.2D81] # ETHIOPIC SYLLABLE MOA
+1220 ; [.1A29.0020.0002.1220] # ETHIOPIC SYLLABLE SZA
+1221 ; [.1A2A.0020.0002.1221] # ETHIOPIC SYLLABLE SZU
+1222 ; [.1A2B.0020.0002.1222] # ETHIOPIC SYLLABLE SZI
+1223 ; [.1A2C.0020.0002.1223] # ETHIOPIC SYLLABLE SZAA
+1224 ; [.1A2D.0020.0002.1224] # ETHIOPIC SYLLABLE SZEE
+1225 ; [.1A2E.0020.0002.1225] # ETHIOPIC SYLLABLE SZE
+1226 ; [.1A2F.0020.0002.1226] # ETHIOPIC SYLLABLE SZO
+1227 ; [.1A30.0020.0002.1227] # ETHIOPIC SYLLABLE SZWA
+1228 ; [.1A31.0020.0002.1228] # ETHIOPIC SYLLABLE RA
+1229 ; [.1A32.0020.0002.1229] # ETHIOPIC SYLLABLE RU
+122A ; [.1A33.0020.0002.122A] # ETHIOPIC SYLLABLE RI
+122B ; [.1A34.0020.0002.122B] # ETHIOPIC SYLLABLE RAA
+122C ; [.1A35.0020.0002.122C] # ETHIOPIC SYLLABLE REE
+122D ; [.1A36.0020.0002.122D] # ETHIOPIC SYLLABLE RE
+122E ; [.1A37.0020.0002.122E] # ETHIOPIC SYLLABLE RO
+122F ; [.1A38.0020.0002.122F] # ETHIOPIC SYLLABLE RWA
+2D82 ; [.1A39.0020.0002.2D82] # ETHIOPIC SYLLABLE ROA
+1230 ; [.1A3A.0020.0002.1230] # ETHIOPIC SYLLABLE SA
+1231 ; [.1A3B.0020.0002.1231] # ETHIOPIC SYLLABLE SU
+1232 ; [.1A3C.0020.0002.1232] # ETHIOPIC SYLLABLE SI
+1233 ; [.1A3D.0020.0002.1233] # ETHIOPIC SYLLABLE SAA
+1234 ; [.1A3E.0020.0002.1234] # ETHIOPIC SYLLABLE SEE
+1235 ; [.1A3F.0020.0002.1235] # ETHIOPIC SYLLABLE SE
+1236 ; [.1A40.0020.0002.1236] # ETHIOPIC SYLLABLE SO
+1237 ; [.1A41.0020.0002.1237] # ETHIOPIC SYLLABLE SWA
+2D83 ; [.1A42.0020.0002.2D83] # ETHIOPIC SYLLABLE SOA
+1238 ; [.1A43.0020.0002.1238] # ETHIOPIC SYLLABLE SHA
+1239 ; [.1A44.0020.0002.1239] # ETHIOPIC SYLLABLE SHU
+123A ; [.1A45.0020.0002.123A] # ETHIOPIC SYLLABLE SHI
+123B ; [.1A46.0020.0002.123B] # ETHIOPIC SYLLABLE SHAA
+123C ; [.1A47.0020.0002.123C] # ETHIOPIC SYLLABLE SHEE
+123D ; [.1A48.0020.0002.123D] # ETHIOPIC SYLLABLE SHE
+123E ; [.1A49.0020.0002.123E] # ETHIOPIC SYLLABLE SHO
+123F ; [.1A4A.0020.0002.123F] # ETHIOPIC SYLLABLE SHWA
+2D84 ; [.1A4B.0020.0002.2D84] # ETHIOPIC SYLLABLE SHOA
+1240 ; [.1A4C.0020.0002.1240] # ETHIOPIC SYLLABLE QA
+1241 ; [.1A4D.0020.0002.1241] # ETHIOPIC SYLLABLE QU
+1242 ; [.1A4E.0020.0002.1242] # ETHIOPIC SYLLABLE QI
+1243 ; [.1A4F.0020.0002.1243] # ETHIOPIC SYLLABLE QAA
+1244 ; [.1A50.0020.0002.1244] # ETHIOPIC SYLLABLE QEE
+1245 ; [.1A51.0020.0002.1245] # ETHIOPIC SYLLABLE QE
+1246 ; [.1A52.0020.0002.1246] # ETHIOPIC SYLLABLE QO
+1247 ; [.1A53.0020.0002.1247] # ETHIOPIC SYLLABLE QOA
+1248 ; [.1A54.0020.0002.1248] # ETHIOPIC SYLLABLE QWA
+124A ; [.1A55.0020.0002.124A] # ETHIOPIC SYLLABLE QWI
+124B ; [.1A56.0020.0002.124B] # ETHIOPIC SYLLABLE QWAA
+124C ; [.1A57.0020.0002.124C] # ETHIOPIC SYLLABLE QWEE
+124D ; [.1A58.0020.0002.124D] # ETHIOPIC SYLLABLE QWE
+1250 ; [.1A59.0020.0002.1250] # ETHIOPIC SYLLABLE QHA
+1251 ; [.1A5A.0020.0002.1251] # ETHIOPIC SYLLABLE QHU
+1252 ; [.1A5B.0020.0002.1252] # ETHIOPIC SYLLABLE QHI
+1253 ; [.1A5C.0020.0002.1253] # ETHIOPIC SYLLABLE QHAA
+1254 ; [.1A5D.0020.0002.1254] # ETHIOPIC SYLLABLE QHEE
+1255 ; [.1A5E.0020.0002.1255] # ETHIOPIC SYLLABLE QHE
+1256 ; [.1A5F.0020.0002.1256] # ETHIOPIC SYLLABLE QHO
+1258 ; [.1A60.0020.0002.1258] # ETHIOPIC SYLLABLE QHWA
+125A ; [.1A61.0020.0002.125A] # ETHIOPIC SYLLABLE QHWI
+125B ; [.1A62.0020.0002.125B] # ETHIOPIC SYLLABLE QHWAA
+125C ; [.1A63.0020.0002.125C] # ETHIOPIC SYLLABLE QHWEE
+125D ; [.1A64.0020.0002.125D] # ETHIOPIC SYLLABLE QHWE
+1260 ; [.1A65.0020.0002.1260] # ETHIOPIC SYLLABLE BA
+1261 ; [.1A66.0020.0002.1261] # ETHIOPIC SYLLABLE BU
+1262 ; [.1A67.0020.0002.1262] # ETHIOPIC SYLLABLE BI
+1263 ; [.1A68.0020.0002.1263] # ETHIOPIC SYLLABLE BAA
+1264 ; [.1A69.0020.0002.1264] # ETHIOPIC SYLLABLE BEE
+1265 ; [.1A6A.0020.0002.1265] # ETHIOPIC SYLLABLE BE
+1266 ; [.1A6B.0020.0002.1266] # ETHIOPIC SYLLABLE BO
+1267 ; [.1A6C.0020.0002.1267] # ETHIOPIC SYLLABLE BWA
+1384 ; [.1A6D.0020.0002.1384] # ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385 ; [.1A6E.0020.0002.1385] # ETHIOPIC SYLLABLE BWI
+1386 ; [.1A6F.0020.0002.1386] # ETHIOPIC SYLLABLE BWEE
+1387 ; [.1A70.0020.0002.1387] # ETHIOPIC SYLLABLE BWE
+2D85 ; [.1A71.0020.0002.2D85] # ETHIOPIC SYLLABLE BOA
+1268 ; [.1A72.0020.0002.1268] # ETHIOPIC SYLLABLE VA
+1269 ; [.1A73.0020.0002.1269] # ETHIOPIC SYLLABLE VU
+126A ; [.1A74.0020.0002.126A] # ETHIOPIC SYLLABLE VI
+126B ; [.1A75.0020.0002.126B] # ETHIOPIC SYLLABLE VAA
+126C ; [.1A76.0020.0002.126C] # ETHIOPIC SYLLABLE VEE
+126D ; [.1A77.0020.0002.126D] # ETHIOPIC SYLLABLE VE
+126E ; [.1A78.0020.0002.126E] # ETHIOPIC SYLLABLE VO
+126F ; [.1A79.0020.0002.126F] # ETHIOPIC SYLLABLE VWA
+1270 ; [.1A7A.0020.0002.1270] # ETHIOPIC SYLLABLE TA
+1271 ; [.1A7B.0020.0002.1271] # ETHIOPIC SYLLABLE TU
+1272 ; [.1A7C.0020.0002.1272] # ETHIOPIC SYLLABLE TI
+1273 ; [.1A7D.0020.0002.1273] # ETHIOPIC SYLLABLE TAA
+1274 ; [.1A7E.0020.0002.1274] # ETHIOPIC SYLLABLE TEE
+1275 ; [.1A7F.0020.0002.1275] # ETHIOPIC SYLLABLE TE
+1276 ; [.1A80.0020.0002.1276] # ETHIOPIC SYLLABLE TO
+1277 ; [.1A81.0020.0002.1277] # ETHIOPIC SYLLABLE TWA
+2D86 ; [.1A82.0020.0002.2D86] # ETHIOPIC SYLLABLE TOA
+1278 ; [.1A83.0020.0002.1278] # ETHIOPIC SYLLABLE CA
+1279 ; [.1A84.0020.0002.1279] # ETHIOPIC SYLLABLE CU
+127A ; [.1A85.0020.0002.127A] # ETHIOPIC SYLLABLE CI
+127B ; [.1A86.0020.0002.127B] # ETHIOPIC SYLLABLE CAA
+127C ; [.1A87.0020.0002.127C] # ETHIOPIC SYLLABLE CEE
+127D ; [.1A88.0020.0002.127D] # ETHIOPIC SYLLABLE CE
+127E ; [.1A89.0020.0002.127E] # ETHIOPIC SYLLABLE CO
+127F ; [.1A8A.0020.0002.127F] # ETHIOPIC SYLLABLE CWA
+2D87 ; [.1A8B.0020.0002.2D87] # ETHIOPIC SYLLABLE COA
+1280 ; [.1A8C.0020.0002.1280] # ETHIOPIC SYLLABLE XA
+1281 ; [.1A8D.0020.0002.1281] # ETHIOPIC SYLLABLE XU
+1282 ; [.1A8E.0020.0002.1282] # ETHIOPIC SYLLABLE XI
+1283 ; [.1A8F.0020.0002.1283] # ETHIOPIC SYLLABLE XAA
+1284 ; [.1A90.0020.0002.1284] # ETHIOPIC SYLLABLE XEE
+1285 ; [.1A91.0020.0002.1285] # ETHIOPIC SYLLABLE XE
+1286 ; [.1A92.0020.0002.1286] # ETHIOPIC SYLLABLE XO
+1287 ; [.1A93.0020.0002.1287] # ETHIOPIC SYLLABLE XOA
+1288 ; [.1A94.0020.0002.1288] # ETHIOPIC SYLLABLE XWA
+128A ; [.1A95.0020.0002.128A] # ETHIOPIC SYLLABLE XWI
+128B ; [.1A96.0020.0002.128B] # ETHIOPIC SYLLABLE XWAA
+128C ; [.1A97.0020.0002.128C] # ETHIOPIC SYLLABLE XWEE
+128D ; [.1A98.0020.0002.128D] # ETHIOPIC SYLLABLE XWE
+1290 ; [.1A99.0020.0002.1290] # ETHIOPIC SYLLABLE NA
+1291 ; [.1A9A.0020.0002.1291] # ETHIOPIC SYLLABLE NU
+1292 ; [.1A9B.0020.0002.1292] # ETHIOPIC SYLLABLE NI
+1293 ; [.1A9C.0020.0002.1293] # ETHIOPIC SYLLABLE NAA
+1294 ; [.1A9D.0020.0002.1294] # ETHIOPIC SYLLABLE NEE
+1295 ; [.1A9E.0020.0002.1295] # ETHIOPIC SYLLABLE NE
+1296 ; [.1A9F.0020.0002.1296] # ETHIOPIC SYLLABLE NO
+1297 ; [.1AA0.0020.0002.1297] # ETHIOPIC SYLLABLE NWA
+2D88 ; [.1AA1.0020.0002.2D88] # ETHIOPIC SYLLABLE NOA
+1298 ; [.1AA2.0020.0002.1298] # ETHIOPIC SYLLABLE NYA
+1299 ; [.1AA3.0020.0002.1299] # ETHIOPIC SYLLABLE NYU
+129A ; [.1AA4.0020.0002.129A] # ETHIOPIC SYLLABLE NYI
+129B ; [.1AA5.0020.0002.129B] # ETHIOPIC SYLLABLE NYAA
+129C ; [.1AA6.0020.0002.129C] # ETHIOPIC SYLLABLE NYEE
+129D ; [.1AA7.0020.0002.129D] # ETHIOPIC SYLLABLE NYE
+129E ; [.1AA8.0020.0002.129E] # ETHIOPIC SYLLABLE NYO
+129F ; [.1AA9.0020.0002.129F] # ETHIOPIC SYLLABLE NYWA
+2D89 ; [.1AAA.0020.0002.2D89] # ETHIOPIC SYLLABLE NYOA
+12A0 ; [.1AAB.0020.0002.12A0] # ETHIOPIC SYLLABLE GLOTTAL A
+12A1 ; [.1AAC.0020.0002.12A1] # ETHIOPIC SYLLABLE GLOTTAL U
+12A2 ; [.1AAD.0020.0002.12A2] # ETHIOPIC SYLLABLE GLOTTAL I
+12A3 ; [.1AAE.0020.0002.12A3] # ETHIOPIC SYLLABLE GLOTTAL AA
+12A4 ; [.1AAF.0020.0002.12A4] # ETHIOPIC SYLLABLE GLOTTAL EE
+12A5 ; [.1AB0.0020.0002.12A5] # ETHIOPIC SYLLABLE GLOTTAL E
+12A6 ; [.1AB1.0020.0002.12A6] # ETHIOPIC SYLLABLE GLOTTAL O
+12A7 ; [.1AB2.0020.0002.12A7] # ETHIOPIC SYLLABLE GLOTTAL WA
+2D8A ; [.1AB3.0020.0002.2D8A] # ETHIOPIC SYLLABLE GLOTTAL OA
+12A8 ; [.1AB4.0020.0002.12A8] # ETHIOPIC SYLLABLE KA
+12A9 ; [.1AB5.0020.0002.12A9] # ETHIOPIC SYLLABLE KU
+12AA ; [.1AB6.0020.0002.12AA] # ETHIOPIC SYLLABLE KI
+12AB ; [.1AB7.0020.0002.12AB] # ETHIOPIC SYLLABLE KAA
+12AC ; [.1AB8.0020.0002.12AC] # ETHIOPIC SYLLABLE KEE
+12AD ; [.1AB9.0020.0002.12AD] # ETHIOPIC SYLLABLE KE
+12AE ; [.1ABA.0020.0002.12AE] # ETHIOPIC SYLLABLE KO
+12AF ; [.1ABB.0020.0002.12AF] # ETHIOPIC SYLLABLE KOA
+12B0 ; [.1ABC.0020.0002.12B0] # ETHIOPIC SYLLABLE KWA
+12B2 ; [.1ABD.0020.0002.12B2] # ETHIOPIC SYLLABLE KWI
+12B3 ; [.1ABE.0020.0002.12B3] # ETHIOPIC SYLLABLE KWAA
+12B4 ; [.1ABF.0020.0002.12B4] # ETHIOPIC SYLLABLE KWEE
+12B5 ; [.1AC0.0020.0002.12B5] # ETHIOPIC SYLLABLE KWE
+12B8 ; [.1AC1.0020.0002.12B8] # ETHIOPIC SYLLABLE KXA
+12B9 ; [.1AC2.0020.0002.12B9] # ETHIOPIC SYLLABLE KXU
+12BA ; [.1AC3.0020.0002.12BA] # ETHIOPIC SYLLABLE KXI
+12BB ; [.1AC4.0020.0002.12BB] # ETHIOPIC SYLLABLE KXAA
+12BC ; [.1AC5.0020.0002.12BC] # ETHIOPIC SYLLABLE KXEE
+12BD ; [.1AC6.0020.0002.12BD] # ETHIOPIC SYLLABLE KXE
+12BE ; [.1AC7.0020.0002.12BE] # ETHIOPIC SYLLABLE KXO
+12C0 ; [.1AC8.0020.0002.12C0] # ETHIOPIC SYLLABLE KXWA
+12C2 ; [.1AC9.0020.0002.12C2] # ETHIOPIC SYLLABLE KXWI
+12C3 ; [.1ACA.0020.0002.12C3] # ETHIOPIC SYLLABLE KXWAA
+12C4 ; [.1ACB.0020.0002.12C4] # ETHIOPIC SYLLABLE KXWEE
+12C5 ; [.1ACC.0020.0002.12C5] # ETHIOPIC SYLLABLE KXWE
+12C8 ; [.1ACD.0020.0002.12C8] # ETHIOPIC SYLLABLE WA
+12C9 ; [.1ACE.0020.0002.12C9] # ETHIOPIC SYLLABLE WU
+12CA ; [.1ACF.0020.0002.12CA] # ETHIOPIC SYLLABLE WI
+12CB ; [.1AD0.0020.0002.12CB] # ETHIOPIC SYLLABLE WAA
+12CC ; [.1AD1.0020.0002.12CC] # ETHIOPIC SYLLABLE WEE
+12CD ; [.1AD2.0020.0002.12CD] # ETHIOPIC SYLLABLE WE
+12CE ; [.1AD3.0020.0002.12CE] # ETHIOPIC SYLLABLE WO
+12CF ; [.1AD4.0020.0002.12CF] # ETHIOPIC SYLLABLE WOA
+12D0 ; [.1AD5.0020.0002.12D0] # ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1 ; [.1AD6.0020.0002.12D1] # ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2 ; [.1AD7.0020.0002.12D2] # ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3 ; [.1AD8.0020.0002.12D3] # ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4 ; [.1AD9.0020.0002.12D4] # ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5 ; [.1ADA.0020.0002.12D5] # ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6 ; [.1ADB.0020.0002.12D6] # ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8 ; [.1ADC.0020.0002.12D8] # ETHIOPIC SYLLABLE ZA
+12D9 ; [.1ADD.0020.0002.12D9] # ETHIOPIC SYLLABLE ZU
+12DA ; [.1ADE.0020.0002.12DA] # ETHIOPIC SYLLABLE ZI
+12DB ; [.1ADF.0020.0002.12DB] # ETHIOPIC SYLLABLE ZAA
+12DC ; [.1AE0.0020.0002.12DC] # ETHIOPIC SYLLABLE ZEE
+12DD ; [.1AE1.0020.0002.12DD] # ETHIOPIC SYLLABLE ZE
+12DE ; [.1AE2.0020.0002.12DE] # ETHIOPIC SYLLABLE ZO
+12DF ; [.1AE3.0020.0002.12DF] # ETHIOPIC SYLLABLE ZWA
+2D8B ; [.1AE4.0020.0002.2D8B] # ETHIOPIC SYLLABLE ZOA
+12E0 ; [.1AE5.0020.0002.12E0] # ETHIOPIC SYLLABLE ZHA
+12E1 ; [.1AE6.0020.0002.12E1] # ETHIOPIC SYLLABLE ZHU
+12E2 ; [.1AE7.0020.0002.12E2] # ETHIOPIC SYLLABLE ZHI
+12E3 ; [.1AE8.0020.0002.12E3] # ETHIOPIC SYLLABLE ZHAA
+12E4 ; [.1AE9.0020.0002.12E4] # ETHIOPIC SYLLABLE ZHEE
+12E5 ; [.1AEA.0020.0002.12E5] # ETHIOPIC SYLLABLE ZHE
+12E6 ; [.1AEB.0020.0002.12E6] # ETHIOPIC SYLLABLE ZHO
+12E7 ; [.1AEC.0020.0002.12E7] # ETHIOPIC SYLLABLE ZHWA
+12E8 ; [.1AED.0020.0002.12E8] # ETHIOPIC SYLLABLE YA
+12E9 ; [.1AEE.0020.0002.12E9] # ETHIOPIC SYLLABLE YU
+12EA ; [.1AEF.0020.0002.12EA] # ETHIOPIC SYLLABLE YI
+12EB ; [.1AF0.0020.0002.12EB] # ETHIOPIC SYLLABLE YAA
+12EC ; [.1AF1.0020.0002.12EC] # ETHIOPIC SYLLABLE YEE
+12ED ; [.1AF2.0020.0002.12ED] # ETHIOPIC SYLLABLE YE
+12EE ; [.1AF3.0020.0002.12EE] # ETHIOPIC SYLLABLE YO
+12EF ; [.1AF4.0020.0002.12EF] # ETHIOPIC SYLLABLE YOA
+12F0 ; [.1AF5.0020.0002.12F0] # ETHIOPIC SYLLABLE DA
+12F1 ; [.1AF6.0020.0002.12F1] # ETHIOPIC SYLLABLE DU
+12F2 ; [.1AF7.0020.0002.12F2] # ETHIOPIC SYLLABLE DI
+12F3 ; [.1AF8.0020.0002.12F3] # ETHIOPIC SYLLABLE DAA
+12F4 ; [.1AF9.0020.0002.12F4] # ETHIOPIC SYLLABLE DEE
+12F5 ; [.1AFA.0020.0002.12F5] # ETHIOPIC SYLLABLE DE
+12F6 ; [.1AFB.0020.0002.12F6] # ETHIOPIC SYLLABLE DO
+12F7 ; [.1AFC.0020.0002.12F7] # ETHIOPIC SYLLABLE DWA
+2D8C ; [.1AFD.0020.0002.2D8C] # ETHIOPIC SYLLABLE DOA
+12F8 ; [.1AFE.0020.0002.12F8] # ETHIOPIC SYLLABLE DDA
+12F9 ; [.1AFF.0020.0002.12F9] # ETHIOPIC SYLLABLE DDU
+12FA ; [.1B00.0020.0002.12FA] # ETHIOPIC SYLLABLE DDI
+12FB ; [.1B01.0020.0002.12FB] # ETHIOPIC SYLLABLE DDAA
+12FC ; [.1B02.0020.0002.12FC] # ETHIOPIC SYLLABLE DDEE
+12FD ; [.1B03.0020.0002.12FD] # ETHIOPIC SYLLABLE DDE
+12FE ; [.1B04.0020.0002.12FE] # ETHIOPIC SYLLABLE DDO
+12FF ; [.1B05.0020.0002.12FF] # ETHIOPIC SYLLABLE DDWA
+2D8D ; [.1B06.0020.0002.2D8D] # ETHIOPIC SYLLABLE DDOA
+1300 ; [.1B07.0020.0002.1300] # ETHIOPIC SYLLABLE JA
+1301 ; [.1B08.0020.0002.1301] # ETHIOPIC SYLLABLE JU
+1302 ; [.1B09.0020.0002.1302] # ETHIOPIC SYLLABLE JI
+1303 ; [.1B0A.0020.0002.1303] # ETHIOPIC SYLLABLE JAA
+1304 ; [.1B0B.0020.0002.1304] # ETHIOPIC SYLLABLE JEE
+1305 ; [.1B0C.0020.0002.1305] # ETHIOPIC SYLLABLE JE
+1306 ; [.1B0D.0020.0002.1306] # ETHIOPIC SYLLABLE JO
+1307 ; [.1B0E.0020.0002.1307] # ETHIOPIC SYLLABLE JWA
+2D8E ; [.1B0F.0020.0002.2D8E] # ETHIOPIC SYLLABLE JOA
+1308 ; [.1B10.0020.0002.1308] # ETHIOPIC SYLLABLE GA
+1309 ; [.1B11.0020.0002.1309] # ETHIOPIC SYLLABLE GU
+130A ; [.1B12.0020.0002.130A] # ETHIOPIC SYLLABLE GI
+130B ; [.1B13.0020.0002.130B] # ETHIOPIC SYLLABLE GAA
+130C ; [.1B14.0020.0002.130C] # ETHIOPIC SYLLABLE GEE
+130D ; [.1B15.0020.0002.130D] # ETHIOPIC SYLLABLE GE
+130E ; [.1B16.0020.0002.130E] # ETHIOPIC SYLLABLE GO
+130F ; [.1B17.0020.0002.130F] # ETHIOPIC SYLLABLE GOA
+1310 ; [.1B18.0020.0002.1310] # ETHIOPIC SYLLABLE GWA
+1312 ; [.1B19.0020.0002.1312] # ETHIOPIC SYLLABLE GWI
+1313 ; [.1B1A.0020.0002.1313] # ETHIOPIC SYLLABLE GWAA
+1314 ; [.1B1B.0020.0002.1314] # ETHIOPIC SYLLABLE GWEE
+1315 ; [.1B1C.0020.0002.1315] # ETHIOPIC SYLLABLE GWE
+1318 ; [.1B1D.0020.0002.1318] # ETHIOPIC SYLLABLE GGA
+1319 ; [.1B1E.0020.0002.1319] # ETHIOPIC SYLLABLE GGU
+131A ; [.1B1F.0020.0002.131A] # ETHIOPIC SYLLABLE GGI
+131B ; [.1B20.0020.0002.131B] # ETHIOPIC SYLLABLE GGAA
+131C ; [.1B21.0020.0002.131C] # ETHIOPIC SYLLABLE GGEE
+131D ; [.1B22.0020.0002.131D] # ETHIOPIC SYLLABLE GGE
+131E ; [.1B23.0020.0002.131E] # ETHIOPIC SYLLABLE GGO
+131F ; [.1B24.0020.0002.131F] # ETHIOPIC SYLLABLE GGWAA
+2D93 ; [.1B25.0020.0002.2D93] # ETHIOPIC SYLLABLE GGWA
+2D94 ; [.1B26.0020.0002.2D94] # ETHIOPIC SYLLABLE GGWI
+2D95 ; [.1B27.0020.0002.2D95] # ETHIOPIC SYLLABLE GGWEE
+2D96 ; [.1B28.0020.0002.2D96] # ETHIOPIC SYLLABLE GGWE
+1320 ; [.1B29.0020.0002.1320] # ETHIOPIC SYLLABLE THA
+1321 ; [.1B2A.0020.0002.1321] # ETHIOPIC SYLLABLE THU
+1322 ; [.1B2B.0020.0002.1322] # ETHIOPIC SYLLABLE THI
+1323 ; [.1B2C.0020.0002.1323] # ETHIOPIC SYLLABLE THAA
+1324 ; [.1B2D.0020.0002.1324] # ETHIOPIC SYLLABLE THEE
+1325 ; [.1B2E.0020.0002.1325] # ETHIOPIC SYLLABLE THE
+1326 ; [.1B2F.0020.0002.1326] # ETHIOPIC SYLLABLE THO
+1327 ; [.1B30.0020.0002.1327] # ETHIOPIC SYLLABLE THWA
+2D8F ; [.1B31.0020.0002.2D8F] # ETHIOPIC SYLLABLE THOA
+1328 ; [.1B32.0020.0002.1328] # ETHIOPIC SYLLABLE CHA
+1329 ; [.1B33.0020.0002.1329] # ETHIOPIC SYLLABLE CHU
+132A ; [.1B34.0020.0002.132A] # ETHIOPIC SYLLABLE CHI
+132B ; [.1B35.0020.0002.132B] # ETHIOPIC SYLLABLE CHAA
+132C ; [.1B36.0020.0002.132C] # ETHIOPIC SYLLABLE CHEE
+132D ; [.1B37.0020.0002.132D] # ETHIOPIC SYLLABLE CHE
+132E ; [.1B38.0020.0002.132E] # ETHIOPIC SYLLABLE CHO
+132F ; [.1B39.0020.0002.132F] # ETHIOPIC SYLLABLE CHWA
+2D90 ; [.1B3A.0020.0002.2D90] # ETHIOPIC SYLLABLE CHOA
+1330 ; [.1B3B.0020.0002.1330] # ETHIOPIC SYLLABLE PHA
+1331 ; [.1B3C.0020.0002.1331] # ETHIOPIC SYLLABLE PHU
+1332 ; [.1B3D.0020.0002.1332] # ETHIOPIC SYLLABLE PHI
+1333 ; [.1B3E.0020.0002.1333] # ETHIOPIC SYLLABLE PHAA
+1334 ; [.1B3F.0020.0002.1334] # ETHIOPIC SYLLABLE PHEE
+1335 ; [.1B40.0020.0002.1335] # ETHIOPIC SYLLABLE PHE
+1336 ; [.1B41.0020.0002.1336] # ETHIOPIC SYLLABLE PHO
+1337 ; [.1B42.0020.0002.1337] # ETHIOPIC SYLLABLE PHWA
+2D91 ; [.1B43.0020.0002.2D91] # ETHIOPIC SYLLABLE PHOA
+1338 ; [.1B44.0020.0002.1338] # ETHIOPIC SYLLABLE TSA
+1339 ; [.1B45.0020.0002.1339] # ETHIOPIC SYLLABLE TSU
+133A ; [.1B46.0020.0002.133A] # ETHIOPIC SYLLABLE TSI
+133B ; [.1B47.0020.0002.133B] # ETHIOPIC SYLLABLE TSAA
+133C ; [.1B48.0020.0002.133C] # ETHIOPIC SYLLABLE TSEE
+133D ; [.1B49.0020.0002.133D] # ETHIOPIC SYLLABLE TSE
+133E ; [.1B4A.0020.0002.133E] # ETHIOPIC SYLLABLE TSO
+133F ; [.1B4B.0020.0002.133F] # ETHIOPIC SYLLABLE TSWA
+1340 ; [.1B4C.0020.0002.1340] # ETHIOPIC SYLLABLE TZA
+1341 ; [.1B4D.0020.0002.1341] # ETHIOPIC SYLLABLE TZU
+1342 ; [.1B4E.0020.0002.1342] # ETHIOPIC SYLLABLE TZI
+1343 ; [.1B4F.0020.0002.1343] # ETHIOPIC SYLLABLE TZAA
+1344 ; [.1B50.0020.0002.1344] # ETHIOPIC SYLLABLE TZEE
+1345 ; [.1B51.0020.0002.1345] # ETHIOPIC SYLLABLE TZE
+1346 ; [.1B52.0020.0002.1346] # ETHIOPIC SYLLABLE TZO
+1347 ; [.1B53.0020.0002.1347] # ETHIOPIC SYLLABLE TZOA
+1348 ; [.1B54.0020.0002.1348] # ETHIOPIC SYLLABLE FA
+1349 ; [.1B55.0020.0002.1349] # ETHIOPIC SYLLABLE FU
+134A ; [.1B56.0020.0002.134A] # ETHIOPIC SYLLABLE FI
+134B ; [.1B57.0020.0002.134B] # ETHIOPIC SYLLABLE FAA
+134C ; [.1B58.0020.0002.134C] # ETHIOPIC SYLLABLE FEE
+134D ; [.1B59.0020.0002.134D] # ETHIOPIC SYLLABLE FE
+134E ; [.1B5A.0020.0002.134E] # ETHIOPIC SYLLABLE FO
+134F ; [.1B5B.0020.0002.134F] # ETHIOPIC SYLLABLE FWA
+1388 ; [.1B5C.0020.0002.1388] # ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389 ; [.1B5D.0020.0002.1389] # ETHIOPIC SYLLABLE FWI
+138A ; [.1B5E.0020.0002.138A] # ETHIOPIC SYLLABLE FWEE
+138B ; [.1B5F.0020.0002.138B] # ETHIOPIC SYLLABLE FWE
+1350 ; [.1B60.0020.0002.1350] # ETHIOPIC SYLLABLE PA
+1351 ; [.1B61.0020.0002.1351] # ETHIOPIC SYLLABLE PU
+1352 ; [.1B62.0020.0002.1352] # ETHIOPIC SYLLABLE PI
+1353 ; [.1B63.0020.0002.1353] # ETHIOPIC SYLLABLE PAA
+1354 ; [.1B64.0020.0002.1354] # ETHIOPIC SYLLABLE PEE
+1355 ; [.1B65.0020.0002.1355] # ETHIOPIC SYLLABLE PE
+1356 ; [.1B66.0020.0002.1356] # ETHIOPIC SYLLABLE PO
+1357 ; [.1B67.0020.0002.1357] # ETHIOPIC SYLLABLE PWA
+138C ; [.1B68.0020.0002.138C] # ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D ; [.1B69.0020.0002.138D] # ETHIOPIC SYLLABLE PWI
+138E ; [.1B6A.0020.0002.138E] # ETHIOPIC SYLLABLE PWEE
+138F ; [.1B6B.0020.0002.138F] # ETHIOPIC SYLLABLE PWE
+2D92 ; [.1B6C.0020.0002.2D92] # ETHIOPIC SYLLABLE POA
+1358 ; [.1B6D.0020.0002.1358] # ETHIOPIC SYLLABLE RYA
+1359 ; [.1B6E.0020.0002.1359] # ETHIOPIC SYLLABLE MYA
+135A ; [.1B6F.0020.0002.135A] # ETHIOPIC SYLLABLE FYA
+2DA0 ; [.1B70.0020.0002.2DA0] # ETHIOPIC SYLLABLE SSA
+2DA1 ; [.1B71.0020.0002.2DA1] # ETHIOPIC SYLLABLE SSU
+2DA2 ; [.1B72.0020.0002.2DA2] # ETHIOPIC SYLLABLE SSI
+2DA3 ; [.1B73.0020.0002.2DA3] # ETHIOPIC SYLLABLE SSAA
+2DA4 ; [.1B74.0020.0002.2DA4] # ETHIOPIC SYLLABLE SSEE
+2DA5 ; [.1B75.0020.0002.2DA5] # ETHIOPIC SYLLABLE SSE
+2DA6 ; [.1B76.0020.0002.2DA6] # ETHIOPIC SYLLABLE SSO
+2DA8 ; [.1B77.0020.0002.2DA8] # ETHIOPIC SYLLABLE CCA
+2DA9 ; [.1B78.0020.0002.2DA9] # ETHIOPIC SYLLABLE CCU
+2DAA ; [.1B79.0020.0002.2DAA] # ETHIOPIC SYLLABLE CCI
+2DAB ; [.1B7A.0020.0002.2DAB] # ETHIOPIC SYLLABLE CCAA
+2DAC ; [.1B7B.0020.0002.2DAC] # ETHIOPIC SYLLABLE CCEE
+2DAD ; [.1B7C.0020.0002.2DAD] # ETHIOPIC SYLLABLE CCE
+2DAE ; [.1B7D.0020.0002.2DAE] # ETHIOPIC SYLLABLE CCO
+2DB0 ; [.1B7E.0020.0002.2DB0] # ETHIOPIC SYLLABLE ZZA
+2DB1 ; [.1B7F.0020.0002.2DB1] # ETHIOPIC SYLLABLE ZZU
+2DB2 ; [.1B80.0020.0002.2DB2] # ETHIOPIC SYLLABLE ZZI
+2DB3 ; [.1B81.0020.0002.2DB3] # ETHIOPIC SYLLABLE ZZAA
+2DB4 ; [.1B82.0020.0002.2DB4] # ETHIOPIC SYLLABLE ZZEE
+2DB5 ; [.1B83.0020.0002.2DB5] # ETHIOPIC SYLLABLE ZZE
+2DB6 ; [.1B84.0020.0002.2DB6] # ETHIOPIC SYLLABLE ZZO
+2DB8 ; [.1B85.0020.0002.2DB8] # ETHIOPIC SYLLABLE CCHA
+2DB9 ; [.1B86.0020.0002.2DB9] # ETHIOPIC SYLLABLE CCHU
+2DBA ; [.1B87.0020.0002.2DBA] # ETHIOPIC SYLLABLE CCHI
+2DBB ; [.1B88.0020.0002.2DBB] # ETHIOPIC SYLLABLE CCHAA
+2DBC ; [.1B89.0020.0002.2DBC] # ETHIOPIC SYLLABLE CCHEE
+2DBD ; [.1B8A.0020.0002.2DBD] # ETHIOPIC SYLLABLE CCHE
+2DBE ; [.1B8B.0020.0002.2DBE] # ETHIOPIC SYLLABLE CCHO
+2DC0 ; [.1B8C.0020.0002.2DC0] # ETHIOPIC SYLLABLE QYA
+2DC1 ; [.1B8D.0020.0002.2DC1] # ETHIOPIC SYLLABLE QYU
+2DC2 ; [.1B8E.0020.0002.2DC2] # ETHIOPIC SYLLABLE QYI
+2DC3 ; [.1B8F.0020.0002.2DC3] # ETHIOPIC SYLLABLE QYAA
+2DC4 ; [.1B90.0020.0002.2DC4] # ETHIOPIC SYLLABLE QYEE
+2DC5 ; [.1B91.0020.0002.2DC5] # ETHIOPIC SYLLABLE QYE
+2DC6 ; [.1B92.0020.0002.2DC6] # ETHIOPIC SYLLABLE QYO
+2DC8 ; [.1B93.0020.0002.2DC8] # ETHIOPIC SYLLABLE KYA
+2DC9 ; [.1B94.0020.0002.2DC9] # ETHIOPIC SYLLABLE KYU
+2DCA ; [.1B95.0020.0002.2DCA] # ETHIOPIC SYLLABLE KYI
+2DCB ; [.1B96.0020.0002.2DCB] # ETHIOPIC SYLLABLE KYAA
+2DCC ; [.1B97.0020.0002.2DCC] # ETHIOPIC SYLLABLE KYEE
+2DCD ; [.1B98.0020.0002.2DCD] # ETHIOPIC SYLLABLE KYE
+2DCE ; [.1B99.0020.0002.2DCE] # ETHIOPIC SYLLABLE KYO
+2DD0 ; [.1B9A.0020.0002.2DD0] # ETHIOPIC SYLLABLE XYA
+2DD1 ; [.1B9B.0020.0002.2DD1] # ETHIOPIC SYLLABLE XYU
+2DD2 ; [.1B9C.0020.0002.2DD2] # ETHIOPIC SYLLABLE XYI
+2DD3 ; [.1B9D.0020.0002.2DD3] # ETHIOPIC SYLLABLE XYAA
+2DD4 ; [.1B9E.0020.0002.2DD4] # ETHIOPIC SYLLABLE XYEE
+2DD5 ; [.1B9F.0020.0002.2DD5] # ETHIOPIC SYLLABLE XYE
+2DD6 ; [.1BA0.0020.0002.2DD6] # ETHIOPIC SYLLABLE XYO
+2DD8 ; [.1BA1.0020.0002.2DD8] # ETHIOPIC SYLLABLE GYA
+2DD9 ; [.1BA2.0020.0002.2DD9] # ETHIOPIC SYLLABLE GYU
+2DDA ; [.1BA3.0020.0002.2DDA] # ETHIOPIC SYLLABLE GYI
+2DDB ; [.1BA4.0020.0002.2DDB] # ETHIOPIC SYLLABLE GYAA
+2DDC ; [.1BA5.0020.0002.2DDC] # ETHIOPIC SYLLABLE GYEE
+2DDD ; [.1BA6.0020.0002.2DDD] # ETHIOPIC SYLLABLE GYE
+2DDE ; [.1BA7.0020.0002.2DDE] # ETHIOPIC SYLLABLE GYO
+0950 ; [.1BA8.0020.0002.0950] # DEVANAGARI OM
+0972 ; [.1BA9.0020.0002.0972] # DEVANAGARI LETTER CANDRA A
+0904 ; [.1BAA.0020.0002.0904] # DEVANAGARI LETTER SHORT A
+0905 ; [.1BAB.0020.0002.0905] # DEVANAGARI LETTER A
+0906 ; [.1BAC.0020.0002.0906] # DEVANAGARI LETTER AA
+0907 ; [.1BAD.0020.0002.0907] # DEVANAGARI LETTER I
+0908 ; [.1BAE.0020.0002.0908] # DEVANAGARI LETTER II
+0909 ; [.1BAF.0020.0002.0909] # DEVANAGARI LETTER U
+090A ; [.1BB0.0020.0002.090A] # DEVANAGARI LETTER UU
+090B ; [.1BB1.0020.0002.090B] # DEVANAGARI LETTER VOCALIC R
+0960 ; [.1BB2.0020.0002.0960] # DEVANAGARI LETTER VOCALIC RR
+090C ; [.1BB3.0020.0002.090C] # DEVANAGARI LETTER VOCALIC L
+0961 ; [.1BB4.0020.0002.0961] # DEVANAGARI LETTER VOCALIC LL
+090D ; [.1BB5.0020.0002.090D] # DEVANAGARI LETTER CANDRA E
+090E ; [.1BB6.0020.0002.090E] # DEVANAGARI LETTER SHORT E
+090F ; [.1BB7.0020.0002.090F] # DEVANAGARI LETTER E
+0910 ; [.1BB8.0020.0002.0910] # DEVANAGARI LETTER AI
+0911 ; [.1BB9.0020.0002.0911] # DEVANAGARI LETTER CANDRA O
+0912 ; [.1BBA.0020.0002.0912] # DEVANAGARI LETTER SHORT O
+0913 ; [.1BBB.0020.0002.0913] # DEVANAGARI LETTER O
+0914 ; [.1BBC.0020.0002.0914] # DEVANAGARI LETTER AU
+0915 ; [.1BBD.0020.0002.0915] # DEVANAGARI LETTER KA
+0958 ; [.1BBD.0020.0002.0915][.0000.00DA.0002.093C] # DEVANAGARI LETTER QA; QQCM
+0916 ; [.1BBE.0020.0002.0916] # DEVANAGARI LETTER KHA
+0959 ; [.1BBE.0020.0002.0916][.0000.00DA.0002.093C] # DEVANAGARI LETTER KHHA; QQCM
+0917 ; [.1BBF.0020.0002.0917] # DEVANAGARI LETTER GA
+095A ; [.1BBF.0020.0002.0917][.0000.00DA.0002.093C] # DEVANAGARI LETTER GHHA; QQCM
+097B ; [.1BC0.0020.0002.097B] # DEVANAGARI LETTER GGA
+0918 ; [.1BC1.0020.0002.0918] # DEVANAGARI LETTER GHA
+0919 ; [.1BC2.0020.0002.0919] # DEVANAGARI LETTER NGA
+091A ; [.1BC3.0020.0002.091A] # DEVANAGARI LETTER CA
+091B ; [.1BC4.0020.0002.091B] # DEVANAGARI LETTER CHA
+091C ; [.1BC5.0020.0002.091C] # DEVANAGARI LETTER JA
+095B ; [.1BC5.0020.0002.091C][.0000.00DA.0002.093C] # DEVANAGARI LETTER ZA; QQCM
+0979 ; [.1BC6.0020.0002.0979] # DEVANAGARI LETTER ZHA
+097C ; [.1BC7.0020.0002.097C] # DEVANAGARI LETTER JJA
+091D ; [.1BC8.0020.0002.091D] # DEVANAGARI LETTER JHA
+091E ; [.1BC9.0020.0002.091E] # DEVANAGARI LETTER NYA
+091F ; [.1BCA.0020.0002.091F] # DEVANAGARI LETTER TTA
+0920 ; [.1BCB.0020.0002.0920] # DEVANAGARI LETTER TTHA
+0921 ; [.1BCC.0020.0002.0921] # DEVANAGARI LETTER DDA
+095C ; [.1BCC.0020.0002.0921][.0000.00DA.0002.093C] # DEVANAGARI LETTER DDDHA; QQCM
+097E ; [.1BCD.0020.0002.097E] # DEVANAGARI LETTER DDDA
+0922 ; [.1BCE.0020.0002.0922] # DEVANAGARI LETTER DDHA
+095D ; [.1BCE.0020.0002.0922][.0000.00DA.0002.093C] # DEVANAGARI LETTER RHA; QQCM
+0923 ; [.1BCF.0020.0002.0923] # DEVANAGARI LETTER NNA
+0924 ; [.1BD0.0020.0002.0924] # DEVANAGARI LETTER TA
+0925 ; [.1BD1.0020.0002.0925] # DEVANAGARI LETTER THA
+0926 ; [.1BD2.0020.0002.0926] # DEVANAGARI LETTER DA
+0927 ; [.1BD3.0020.0002.0927] # DEVANAGARI LETTER DHA
+0928 ; [.1BD4.0020.0002.0928] # DEVANAGARI LETTER NA
+0929 ; [.1BD4.0020.0002.0928][.0000.00DA.0002.093C] # DEVANAGARI LETTER NNNA; QQCM
+092A ; [.1BD5.0020.0002.092A] # DEVANAGARI LETTER PA
+092B ; [.1BD6.0020.0002.092B] # DEVANAGARI LETTER PHA
+095E ; [.1BD6.0020.0002.092B][.0000.00DA.0002.093C] # DEVANAGARI LETTER FA; QQCM
+092C ; [.1BD7.0020.0002.092C] # DEVANAGARI LETTER BA
+097F ; [.1BD8.0020.0002.097F] # DEVANAGARI LETTER BBA
+092D ; [.1BD9.0020.0002.092D] # DEVANAGARI LETTER BHA
+092E ; [.1BDA.0020.0002.092E] # DEVANAGARI LETTER MA
+092F ; [.1BDB.0020.0002.092F] # DEVANAGARI LETTER YA
+095F ; [.1BDB.0020.0002.092F][.0000.00DA.0002.093C] # DEVANAGARI LETTER YYA; QQCM
+097A ; [.1BDC.0020.0002.097A] # DEVANAGARI LETTER HEAVY YA
+0930 ; [.1BDD.0020.0002.0930] # DEVANAGARI LETTER RA
+0931 ; [.1BDD.0020.0002.0930][.0000.00DA.0002.093C] # DEVANAGARI LETTER RRA; QQCM
+0932 ; [.1BDE.0020.0002.0932] # DEVANAGARI LETTER LA
+0933 ; [.1BDF.0020.0002.0933] # DEVANAGARI LETTER LLA
+0934 ; [.1BDF.0020.0002.0933][.0000.00DA.0002.093C] # DEVANAGARI LETTER LLLA; QQCM
+0935 ; [.1BE0.0020.0002.0935] # DEVANAGARI LETTER VA
+0936 ; [.1BE1.0020.0002.0936] # DEVANAGARI LETTER SHA
+0937 ; [.1BE2.0020.0002.0937] # DEVANAGARI LETTER SSA
+0938 ; [.1BE3.0020.0002.0938] # DEVANAGARI LETTER SA
+0939 ; [.1BE4.0020.0002.0939] # DEVANAGARI LETTER HA
+093D ; [.1BE5.0020.0002.093D] # DEVANAGARI SIGN AVAGRAHA
+097D ; [.1BE6.0020.0002.097D] # DEVANAGARI LETTER GLOTTAL STOP
+1CE9 ; [.1BE7.0020.0002.1CE9] # VEDIC SIGN ANUSVARA ANTARGOMUKHA
+1CEA ; [.1BE7.0020.0004.1CEA] # VEDIC SIGN ANUSVARA BAHIRGOMUKHA; QQK
+1CEB ; [.1BE7.0020.0004.1CEB] # VEDIC SIGN ANUSVARA VAMAGOMUKHA; QQK
+1CEC ; [.1BE7.0020.0004.1CEC] # VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL; QQK
+1CEE ; [.1BE7.0020.0004.1CEE] # VEDIC SIGN HEXIFORM LONG ANUSVARA; QQK
+1CEF ; [.1BE7.0020.0004.1CEF] # VEDIC SIGN LONG ANUSVARA; QQK
+1CF0 ; [.1BE7.0020.0004.1CF0] # VEDIC SIGN RTHANG LONG ANUSVARA; QQK
+1CF1 ; [.1BE7.0020.0004.1CF1] # VEDIC SIGN ANUSVARA UBHAYATO MUKHA; QQK
+A8F2 ; [.1BE8.0020.0002.A8F2] # DEVANAGARI SIGN SPACING CANDRABINDU
+A8F3 ; [.1BE8.0020.0004.A8F3] # DEVANAGARI SIGN CANDRABINDU VIRAMA; QQK
+A8F4 ; [.1BE8.0020.0004.A8F4] # DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA; QQK
+A8F5 ; [.1BE8.0020.0004.A8F5] # DEVANAGARI SIGN CANDRABINDU TWO; QQK
+A8F6 ; [.1BE8.0020.0004.A8F6] # DEVANAGARI SIGN CANDRABINDU THREE; QQK
+A8F7 ; [.1BE8.0020.0004.A8F7] # DEVANAGARI SIGN CANDRABINDU AVAGRAHA; QQK
+A8FB ; [.1BE9.0020.0002.A8FB] # DEVANAGARI HEADSTROKE
+093E ; [.1BEA.0020.0002.093E] # DEVANAGARI VOWEL SIGN AA
+093F ; [.1BEB.0020.0002.093F] # DEVANAGARI VOWEL SIGN I
+0940 ; [.1BEC.0020.0002.0940] # DEVANAGARI VOWEL SIGN II
+0941 ; [.1BED.0020.0002.0941] # DEVANAGARI VOWEL SIGN U
+0942 ; [.1BEE.0020.0002.0942] # DEVANAGARI VOWEL SIGN UU
+0943 ; [.1BEF.0020.0002.0943] # DEVANAGARI VOWEL SIGN VOCALIC R
+0944 ; [.1BF0.0020.0002.0944] # DEVANAGARI VOWEL SIGN VOCALIC RR
+0962 ; [.1BF1.0020.0002.0962] # DEVANAGARI VOWEL SIGN VOCALIC L
+0963 ; [.1BF2.0020.0002.0963] # DEVANAGARI VOWEL SIGN VOCALIC LL
+0945 ; [.1BF3.0020.0002.0945] # DEVANAGARI VOWEL SIGN CANDRA E
+0955 ; [.1BF4.0020.0002.0955] # DEVANAGARI VOWEL SIGN CANDRA LONG E
+0946 ; [.1BF5.0020.0002.0946] # DEVANAGARI VOWEL SIGN SHORT E
+0947 ; [.1BF6.0020.0002.0947] # DEVANAGARI VOWEL SIGN E
+094E ; [.1BF7.0020.0002.094E] # DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+0948 ; [.1BF8.0020.0002.0948] # DEVANAGARI VOWEL SIGN AI
+0949 ; [.1BF9.0020.0002.0949] # DEVANAGARI VOWEL SIGN CANDRA O
+094A ; [.1BFA.0020.0002.094A] # DEVANAGARI VOWEL SIGN SHORT O
+094B ; [.1BFB.0020.0002.094B] # DEVANAGARI VOWEL SIGN O
+094C ; [.1BFC.0020.0002.094C] # DEVANAGARI VOWEL SIGN AU
+094D ; [.1BFD.0020.0002.094D] # DEVANAGARI SIGN VIRAMA
+0985 ; [.1BFE.0020.0002.0985] # BENGALI LETTER A
+0986 ; [.1BFF.0020.0002.0986] # BENGALI LETTER AA
+0987 ; [.1C00.0020.0002.0987] # BENGALI LETTER I
+0988 ; [.1C01.0020.0002.0988] # BENGALI LETTER II
+0989 ; [.1C02.0020.0002.0989] # BENGALI LETTER U
+098A ; [.1C03.0020.0002.098A] # BENGALI LETTER UU
+098B ; [.1C04.0020.0002.098B] # BENGALI LETTER VOCALIC R
+09E0 ; [.1C05.0020.0002.09E0] # BENGALI LETTER VOCALIC RR
+098C ; [.1C06.0020.0002.098C] # BENGALI LETTER VOCALIC L
+09E1 ; [.1C07.0020.0002.09E1] # BENGALI LETTER VOCALIC LL
+098F ; [.1C08.0020.0002.098F] # BENGALI LETTER E
+0990 ; [.1C09.0020.0002.0990] # BENGALI LETTER AI
+0993 ; [.1C0A.0020.0002.0993] # BENGALI LETTER O
+0994 ; [.1C0B.0020.0002.0994] # BENGALI LETTER AU
+0995 ; [.1C0C.0020.0002.0995] # BENGALI LETTER KA
+0996 ; [.1C0D.0020.0002.0996] # BENGALI LETTER KHA
+0997 ; [.1C0E.0020.0002.0997] # BENGALI LETTER GA
+0998 ; [.1C0F.0020.0002.0998] # BENGALI LETTER GHA
+0999 ; [.1C10.0020.0002.0999] # BENGALI LETTER NGA
+099A ; [.1C11.0020.0002.099A] # BENGALI LETTER CA
+099B ; [.1C12.0020.0002.099B] # BENGALI LETTER CHA
+099C ; [.1C13.0020.0002.099C] # BENGALI LETTER JA
+099D ; [.1C14.0020.0002.099D] # BENGALI LETTER JHA
+099E ; [.1C15.0020.0002.099E] # BENGALI LETTER NYA
+099F ; [.1C16.0020.0002.099F] # BENGALI LETTER TTA
+09A0 ; [.1C17.0020.0002.09A0] # BENGALI LETTER TTHA
+09A1 ; [.1C18.0020.0002.09A1] # BENGALI LETTER DDA
+09DC ; [.1C18.0020.0002.09A1][.0000.00DE.0002.09BC] # BENGALI LETTER RRA; QQCM
+09A2 ; [.1C19.0020.0002.09A2] # BENGALI LETTER DDHA
+09DD ; [.1C19.0020.0002.09A2][.0000.00DE.0002.09BC] # BENGALI LETTER RHA; QQCM
+09A3 ; [.1C1A.0020.0002.09A3] # BENGALI LETTER NNA
+09A4 ; [.1C1B.0020.0002.09A4] # BENGALI LETTER TA
+09CE ; [.1C1B.0020.0004.09CE][.1C3C.0020.0004.09CE] # BENGALI LETTER KHANDA TA; QQKN
+09A5 ; [.1C1C.0020.0002.09A5] # BENGALI LETTER THA
+09A6 ; [.1C1D.0020.0002.09A6] # BENGALI LETTER DA
+09A7 ; [.1C1E.0020.0002.09A7] # BENGALI LETTER DHA
+09A8 ; [.1C1F.0020.0002.09A8] # BENGALI LETTER NA
+09AA ; [.1C20.0020.0002.09AA] # BENGALI LETTER PA
+09AB ; [.1C21.0020.0002.09AB] # BENGALI LETTER PHA
+09AC ; [.1C22.0020.0002.09AC] # BENGALI LETTER BA
+09AD ; [.1C23.0020.0002.09AD] # BENGALI LETTER BHA
+09AE ; [.1C24.0020.0002.09AE] # BENGALI LETTER MA
+09AF ; [.1C25.0020.0002.09AF] # BENGALI LETTER YA
+09DF ; [.1C25.0020.0002.09AF][.0000.00DE.0002.09BC] # BENGALI LETTER YYA; QQCM
+09B0 ; [.1C26.0020.0002.09B0] # BENGALI LETTER RA
+09F0 ; [.1C27.0020.0002.09F0] # BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09B2 ; [.1C28.0020.0002.09B2] # BENGALI LETTER LA
+09F1 ; [.1C29.0020.0002.09F1] # BENGALI LETTER RA WITH LOWER DIAGONAL
+09B6 ; [.1C2A.0020.0002.09B6] # BENGALI LETTER SHA
+09B7 ; [.1C2B.0020.0002.09B7] # BENGALI LETTER SSA
+09B8 ; [.1C2C.0020.0002.09B8] # BENGALI LETTER SA
+09B9 ; [.1C2D.0020.0002.09B9] # BENGALI LETTER HA
+09BD ; [.1C2E.0020.0002.09BD] # BENGALI SIGN AVAGRAHA
+09BE ; [.1C2F.0020.0002.09BE] # BENGALI VOWEL SIGN AA
+09BF ; [.1C30.0020.0002.09BF] # BENGALI VOWEL SIGN I
+09C0 ; [.1C31.0020.0002.09C0] # BENGALI VOWEL SIGN II
+09C1 ; [.1C32.0020.0002.09C1] # BENGALI VOWEL SIGN U
+09C2 ; [.1C33.0020.0002.09C2] # BENGALI VOWEL SIGN UU
+09C3 ; [.1C34.0020.0002.09C3] # BENGALI VOWEL SIGN VOCALIC R
+09C4 ; [.1C35.0020.0002.09C4] # BENGALI VOWEL SIGN VOCALIC RR
+09E2 ; [.1C36.0020.0002.09E2] # BENGALI VOWEL SIGN VOCALIC L
+09E3 ; [.1C37.0020.0002.09E3] # BENGALI VOWEL SIGN VOCALIC LL
+09C7 ; [.1C38.0020.0002.09C7] # BENGALI VOWEL SIGN E
+09C8 ; [.1C39.0020.0002.09C8] # BENGALI VOWEL SIGN AI
+09CB ; [.1C3A.0020.0002.09CB] # BENGALI VOWEL SIGN O
+09C7 09BE ; [.1C3A.0020.0002.09CB] # BENGALI VOWEL SIGN O
+09CC ; [.1C3B.0020.0002.09CC] # BENGALI VOWEL SIGN AU
+09C7 09D7 ; [.1C3B.0020.0002.09CC] # BENGALI VOWEL SIGN AU
+09CD ; [.1C3C.0020.0002.09CD] # BENGALI SIGN VIRAMA
+09D7 ; [.1C3D.0020.0002.09D7] # BENGALI AU LENGTH MARK
+0A74 ; [.1C3E.0020.0002.0A74] # GURMUKHI EK ONKAR
+0A73 ; [.1C3F.0020.0002.0A73] # GURMUKHI URA
+0A09 ; [.1C40.0020.0002.0A09] # GURMUKHI LETTER U
+0A0A ; [.1C41.0020.0002.0A0A] # GURMUKHI LETTER UU
+0A13 ; [.1C42.0020.0002.0A13] # GURMUKHI LETTER OO
+0A05 ; [.1C43.0020.0002.0A05] # GURMUKHI LETTER A
+0A06 ; [.1C44.0020.0002.0A06] # GURMUKHI LETTER AA
+0A10 ; [.1C45.0020.0002.0A10] # GURMUKHI LETTER AI
+0A14 ; [.1C46.0020.0002.0A14] # GURMUKHI LETTER AU
+0A72 ; [.1C47.0020.0002.0A72] # GURMUKHI IRI
+0A07 ; [.1C48.0020.0002.0A07] # GURMUKHI LETTER I
+0A08 ; [.1C49.0020.0002.0A08] # GURMUKHI LETTER II
+0A0F ; [.1C4A.0020.0002.0A0F] # GURMUKHI LETTER EE
+0A38 ; [.1C4B.0020.0002.0A38] # GURMUKHI LETTER SA
+0A36 ; [.1C4B.0020.0002.0A38][.0000.00E2.0002.0A3C] # GURMUKHI LETTER SHA; QQCM
+0A39 ; [.1C4C.0020.0002.0A39] # GURMUKHI LETTER HA
+0A51 ; [.1C4D.0020.0002.0A51] # GURMUKHI SIGN UDAAT
+0A15 ; [.1C4E.0020.0002.0A15] # GURMUKHI LETTER KA
+0A16 ; [.1C4F.0020.0002.0A16] # GURMUKHI LETTER KHA
+0A59 ; [.1C4F.0020.0002.0A16][.0000.00E2.0002.0A3C] # GURMUKHI LETTER KHHA; QQCM
+0A17 ; [.1C50.0020.0002.0A17] # GURMUKHI LETTER GA
+0A5A ; [.1C50.0020.0002.0A17][.0000.00E2.0002.0A3C] # GURMUKHI LETTER GHHA; QQCM
+0A18 ; [.1C51.0020.0002.0A18] # GURMUKHI LETTER GHA
+0A19 ; [.1C52.0020.0002.0A19] # GURMUKHI LETTER NGA
+0A1A ; [.1C53.0020.0002.0A1A] # GURMUKHI LETTER CA
+0A1B ; [.1C54.0020.0002.0A1B] # GURMUKHI LETTER CHA
+0A1C ; [.1C55.0020.0002.0A1C] # GURMUKHI LETTER JA
+0A5B ; [.1C55.0020.0002.0A1C][.0000.00E2.0002.0A3C] # GURMUKHI LETTER ZA; QQCM
+0A1D ; [.1C56.0020.0002.0A1D] # GURMUKHI LETTER JHA
+0A1E ; [.1C57.0020.0002.0A1E] # GURMUKHI LETTER NYA
+0A1F ; [.1C58.0020.0002.0A1F] # GURMUKHI LETTER TTA
+0A20 ; [.1C59.0020.0002.0A20] # GURMUKHI LETTER TTHA
+0A21 ; [.1C5A.0020.0002.0A21] # GURMUKHI LETTER DDA
+0A22 ; [.1C5B.0020.0002.0A22] # GURMUKHI LETTER DDHA
+0A23 ; [.1C5C.0020.0002.0A23] # GURMUKHI LETTER NNA
+0A24 ; [.1C5D.0020.0002.0A24] # GURMUKHI LETTER TA
+0A25 ; [.1C5E.0020.0002.0A25] # GURMUKHI LETTER THA
+0A26 ; [.1C5F.0020.0002.0A26] # GURMUKHI LETTER DA
+0A27 ; [.1C60.0020.0002.0A27] # GURMUKHI LETTER DHA
+0A28 ; [.1C61.0020.0002.0A28] # GURMUKHI LETTER NA
+0A2A ; [.1C62.0020.0002.0A2A] # GURMUKHI LETTER PA
+0A2B ; [.1C63.0020.0002.0A2B] # GURMUKHI LETTER PHA
+0A5E ; [.1C63.0020.0002.0A2B][.0000.00E2.0002.0A3C] # GURMUKHI LETTER FA; QQCM
+0A2C ; [.1C64.0020.0002.0A2C] # GURMUKHI LETTER BA
+0A2D ; [.1C65.0020.0002.0A2D] # GURMUKHI LETTER BHA
+0A2E ; [.1C66.0020.0002.0A2E] # GURMUKHI LETTER MA
+0A2F ; [.1C67.0020.0002.0A2F] # GURMUKHI LETTER YA
+0A75 ; [.1C68.0020.0002.0A75] # GURMUKHI SIGN YAKASH
+0A30 ; [.1C69.0020.0002.0A30] # GURMUKHI LETTER RA
+0A32 ; [.1C6A.0020.0002.0A32] # GURMUKHI LETTER LA
+0A33 ; [.1C6A.0020.0002.0A32][.0000.00E2.0002.0A3C] # GURMUKHI LETTER LLA; QQCM
+0A35 ; [.1C6B.0020.0002.0A35] # GURMUKHI LETTER VA
+0A5C ; [.1C6C.0020.0002.0A5C] # GURMUKHI LETTER RRA
+0A3E ; [.1C6D.0020.0002.0A3E] # GURMUKHI VOWEL SIGN AA
+0A3F ; [.1C6E.0020.0002.0A3F] # GURMUKHI VOWEL SIGN I
+0A40 ; [.1C6F.0020.0002.0A40] # GURMUKHI VOWEL SIGN II
+0A41 ; [.1C70.0020.0002.0A41] # GURMUKHI VOWEL SIGN U
+0A42 ; [.1C71.0020.0002.0A42] # GURMUKHI VOWEL SIGN UU
+0A47 ; [.1C72.0020.0002.0A47] # GURMUKHI VOWEL SIGN EE
+0A48 ; [.1C73.0020.0002.0A48] # GURMUKHI VOWEL SIGN AI
+0A4B ; [.1C74.0020.0002.0A4B] # GURMUKHI VOWEL SIGN OO
+0A4C ; [.1C75.0020.0002.0A4C] # GURMUKHI VOWEL SIGN AU
+0A4D ; [.1C76.0020.0002.0A4D] # GURMUKHI SIGN VIRAMA
+0AD0 ; [.1C77.0020.0002.0AD0] # GUJARATI OM
+0A85 ; [.1C78.0020.0002.0A85] # GUJARATI LETTER A
+0A86 ; [.1C79.0020.0002.0A86] # GUJARATI LETTER AA
+0A87 ; [.1C7A.0020.0002.0A87] # GUJARATI LETTER I
+0A88 ; [.1C7B.0020.0002.0A88] # GUJARATI LETTER II
+0A89 ; [.1C7C.0020.0002.0A89] # GUJARATI LETTER U
+0A8A ; [.1C7D.0020.0002.0A8A] # GUJARATI LETTER UU
+0A8B ; [.1C7E.0020.0002.0A8B] # GUJARATI LETTER VOCALIC R
+0AE0 ; [.1C7F.0020.0002.0AE0] # GUJARATI LETTER VOCALIC RR
+0A8C ; [.1C80.0020.0002.0A8C] # GUJARATI LETTER VOCALIC L
+0AE1 ; [.1C81.0020.0002.0AE1] # GUJARATI LETTER VOCALIC LL
+0A8D ; [.1C82.0020.0002.0A8D] # GUJARATI VOWEL CANDRA E
+0A8F ; [.1C83.0020.0002.0A8F] # GUJARATI LETTER E
+0A90 ; [.1C84.0020.0002.0A90] # GUJARATI LETTER AI
+0A91 ; [.1C85.0020.0002.0A91] # GUJARATI VOWEL CANDRA O
+0A93 ; [.1C86.0020.0002.0A93] # GUJARATI LETTER O
+0A94 ; [.1C87.0020.0002.0A94] # GUJARATI LETTER AU
+0A95 ; [.1C88.0020.0002.0A95] # GUJARATI LETTER KA
+0A96 ; [.1C89.0020.0002.0A96] # GUJARATI LETTER KHA
+0A97 ; [.1C8A.0020.0002.0A97] # GUJARATI LETTER GA
+0A98 ; [.1C8B.0020.0002.0A98] # GUJARATI LETTER GHA
+0A99 ; [.1C8C.0020.0002.0A99] # GUJARATI LETTER NGA
+0A9A ; [.1C8D.0020.0002.0A9A] # GUJARATI LETTER CA
+0A9B ; [.1C8E.0020.0002.0A9B] # GUJARATI LETTER CHA
+0A9C ; [.1C8F.0020.0002.0A9C] # GUJARATI LETTER JA
+0A9D ; [.1C90.0020.0002.0A9D] # GUJARATI LETTER JHA
+0A9E ; [.1C91.0020.0002.0A9E] # GUJARATI LETTER NYA
+0A9F ; [.1C92.0020.0002.0A9F] # GUJARATI LETTER TTA
+0AA0 ; [.1C93.0020.0002.0AA0] # GUJARATI LETTER TTHA
+0AA1 ; [.1C94.0020.0002.0AA1] # GUJARATI LETTER DDA
+0AA2 ; [.1C95.0020.0002.0AA2] # GUJARATI LETTER DDHA
+0AA3 ; [.1C96.0020.0002.0AA3] # GUJARATI LETTER NNA
+0AA4 ; [.1C97.0020.0002.0AA4] # GUJARATI LETTER TA
+0AA5 ; [.1C98.0020.0002.0AA5] # GUJARATI LETTER THA
+0AA6 ; [.1C99.0020.0002.0AA6] # GUJARATI LETTER DA
+0AA7 ; [.1C9A.0020.0002.0AA7] # GUJARATI LETTER DHA
+0AA8 ; [.1C9B.0020.0002.0AA8] # GUJARATI LETTER NA
+0AAA ; [.1C9C.0020.0002.0AAA] # GUJARATI LETTER PA
+0AAB ; [.1C9D.0020.0002.0AAB] # GUJARATI LETTER PHA
+0AAC ; [.1C9E.0020.0002.0AAC] # GUJARATI LETTER BA
+0AAD ; [.1C9F.0020.0002.0AAD] # GUJARATI LETTER BHA
+0AAE ; [.1CA0.0020.0002.0AAE] # GUJARATI LETTER MA
+0AAF ; [.1CA1.0020.0002.0AAF] # GUJARATI LETTER YA
+0AB0 ; [.1CA2.0020.0002.0AB0] # GUJARATI LETTER RA
+0AB2 ; [.1CA3.0020.0002.0AB2] # GUJARATI LETTER LA
+0AB5 ; [.1CA4.0020.0002.0AB5] # GUJARATI LETTER VA
+0AB6 ; [.1CA5.0020.0002.0AB6] # GUJARATI LETTER SHA
+0AB7 ; [.1CA6.0020.0002.0AB7] # GUJARATI LETTER SSA
+0AB8 ; [.1CA7.0020.0002.0AB8] # GUJARATI LETTER SA
+0AB9 ; [.1CA8.0020.0002.0AB9] # GUJARATI LETTER HA
+0AB3 ; [.1CA9.0020.0002.0AB3] # GUJARATI LETTER LLA
+0ABD ; [.1CAA.0020.0002.0ABD] # GUJARATI SIGN AVAGRAHA
+0ABE ; [.1CAB.0020.0002.0ABE] # GUJARATI VOWEL SIGN AA
+0ABF ; [.1CAC.0020.0002.0ABF] # GUJARATI VOWEL SIGN I
+0AC0 ; [.1CAD.0020.0002.0AC0] # GUJARATI VOWEL SIGN II
+0AC1 ; [.1CAE.0020.0002.0AC1] # GUJARATI VOWEL SIGN U
+0AC2 ; [.1CAF.0020.0002.0AC2] # GUJARATI VOWEL SIGN UU
+0AC3 ; [.1CB0.0020.0002.0AC3] # GUJARATI VOWEL SIGN VOCALIC R
+0AC4 ; [.1CB1.0020.0002.0AC4] # GUJARATI VOWEL SIGN VOCALIC RR
+0AE2 ; [.1CB2.0020.0002.0AE2] # GUJARATI VOWEL SIGN VOCALIC L
+0AE3 ; [.1CB3.0020.0002.0AE3] # GUJARATI VOWEL SIGN VOCALIC LL
+0AC5 ; [.1CB4.0020.0002.0AC5] # GUJARATI VOWEL SIGN CANDRA E
+0AC7 ; [.1CB5.0020.0002.0AC7] # GUJARATI VOWEL SIGN E
+0AC8 ; [.1CB6.0020.0002.0AC8] # GUJARATI VOWEL SIGN AI
+0AC9 ; [.1CB7.0020.0002.0AC9] # GUJARATI VOWEL SIGN CANDRA O
+0ACB ; [.1CB8.0020.0002.0ACB] # GUJARATI VOWEL SIGN O
+0ACC ; [.1CB9.0020.0002.0ACC] # GUJARATI VOWEL SIGN AU
+0ACD ; [.1CBA.0020.0002.0ACD] # GUJARATI SIGN VIRAMA
+0B05 ; [.1CBB.0020.0002.0B05] # ORIYA LETTER A
+0B06 ; [.1CBC.0020.0002.0B06] # ORIYA LETTER AA
+0B07 ; [.1CBD.0020.0002.0B07] # ORIYA LETTER I
+0B08 ; [.1CBE.0020.0002.0B08] # ORIYA LETTER II
+0B09 ; [.1CBF.0020.0002.0B09] # ORIYA LETTER U
+0B0A ; [.1CC0.0020.0002.0B0A] # ORIYA LETTER UU
+0B0B ; [.1CC1.0020.0002.0B0B] # ORIYA LETTER VOCALIC R
+0B60 ; [.1CC2.0020.0002.0B60] # ORIYA LETTER VOCALIC RR
+0B0C ; [.1CC3.0020.0002.0B0C] # ORIYA LETTER VOCALIC L
+0B61 ; [.1CC4.0020.0002.0B61] # ORIYA LETTER VOCALIC LL
+0B0F ; [.1CC5.0020.0002.0B0F] # ORIYA LETTER E
+0B10 ; [.1CC6.0020.0002.0B10] # ORIYA LETTER AI
+0B13 ; [.1CC7.0020.0002.0B13] # ORIYA LETTER O
+0B14 ; [.1CC8.0020.0002.0B14] # ORIYA LETTER AU
+0B15 ; [.1CC9.0020.0002.0B15] # ORIYA LETTER KA
+0B16 ; [.1CCA.0020.0002.0B16] # ORIYA LETTER KHA
+0B17 ; [.1CCB.0020.0002.0B17] # ORIYA LETTER GA
+0B18 ; [.1CCC.0020.0002.0B18] # ORIYA LETTER GHA
+0B19 ; [.1CCD.0020.0002.0B19] # ORIYA LETTER NGA
+0B1A ; [.1CCE.0020.0002.0B1A] # ORIYA LETTER CA
+0B1B ; [.1CCF.0020.0002.0B1B] # ORIYA LETTER CHA
+0B1C ; [.1CD0.0020.0002.0B1C] # ORIYA LETTER JA
+0B1D ; [.1CD1.0020.0002.0B1D] # ORIYA LETTER JHA
+0B1E ; [.1CD2.0020.0002.0B1E] # ORIYA LETTER NYA
+0B1F ; [.1CD3.0020.0002.0B1F] # ORIYA LETTER TTA
+0B20 ; [.1CD4.0020.0002.0B20] # ORIYA LETTER TTHA
+0B21 ; [.1CD5.0020.0002.0B21] # ORIYA LETTER DDA
+0B5C ; [.1CD5.0020.0002.0B21][.0000.00EC.0002.0B3C] # ORIYA LETTER RRA; QQCM
+0B22 ; [.1CD6.0020.0002.0B22] # ORIYA LETTER DDHA
+0B5D ; [.1CD6.0020.0002.0B22][.0000.00EC.0002.0B3C] # ORIYA LETTER RHA; QQCM
+0B23 ; [.1CD7.0020.0002.0B23] # ORIYA LETTER NNA
+0B24 ; [.1CD8.0020.0002.0B24] # ORIYA LETTER TA
+0B25 ; [.1CD9.0020.0002.0B25] # ORIYA LETTER THA
+0B26 ; [.1CDA.0020.0002.0B26] # ORIYA LETTER DA
+0B27 ; [.1CDB.0020.0002.0B27] # ORIYA LETTER DHA
+0B28 ; [.1CDC.0020.0002.0B28] # ORIYA LETTER NA
+0B2A ; [.1CDD.0020.0002.0B2A] # ORIYA LETTER PA
+0B2B ; [.1CDE.0020.0002.0B2B] # ORIYA LETTER PHA
+0B2C ; [.1CDF.0020.0002.0B2C] # ORIYA LETTER BA
+0B2D ; [.1CE0.0020.0002.0B2D] # ORIYA LETTER BHA
+0B2E ; [.1CE1.0020.0002.0B2E] # ORIYA LETTER MA
+0B2F ; [.1CE2.0020.0002.0B2F] # ORIYA LETTER YA
+0B5F ; [.1CE3.0020.0002.0B5F] # ORIYA LETTER YYA
+0B30 ; [.1CE4.0020.0002.0B30] # ORIYA LETTER RA
+0B32 ; [.1CE5.0020.0002.0B32] # ORIYA LETTER LA
+0B33 ; [.1CE6.0020.0002.0B33] # ORIYA LETTER LLA
+0B35 ; [.1CE7.0020.0002.0B35] # ORIYA LETTER VA
+0B71 ; [.1CE8.0020.0002.0B71] # ORIYA LETTER WA
+0B36 ; [.1CE9.0020.0002.0B36] # ORIYA LETTER SHA
+0B37 ; [.1CEA.0020.0002.0B37] # ORIYA LETTER SSA
+0B38 ; [.1CEB.0020.0002.0B38] # ORIYA LETTER SA
+0B39 ; [.1CEC.0020.0002.0B39] # ORIYA LETTER HA
+0B3D ; [.1CED.0020.0002.0B3D] # ORIYA SIGN AVAGRAHA
+0B3E ; [.1CEE.0020.0002.0B3E] # ORIYA VOWEL SIGN AA
+0B3F ; [.1CEF.0020.0002.0B3F] # ORIYA VOWEL SIGN I
+0B40 ; [.1CF0.0020.0002.0B40] # ORIYA VOWEL SIGN II
+0B41 ; [.1CF1.0020.0002.0B41] # ORIYA VOWEL SIGN U
+0B42 ; [.1CF2.0020.0002.0B42] # ORIYA VOWEL SIGN UU
+0B43 ; [.1CF3.0020.0002.0B43] # ORIYA VOWEL SIGN VOCALIC R
+0B44 ; [.1CF4.0020.0002.0B44] # ORIYA VOWEL SIGN VOCALIC RR
+0B62 ; [.1CF5.0020.0002.0B62] # ORIYA VOWEL SIGN VOCALIC L
+0B63 ; [.1CF6.0020.0002.0B63] # ORIYA VOWEL SIGN VOCALIC LL
+0B47 ; [.1CF7.0020.0002.0B47] # ORIYA VOWEL SIGN E
+0B48 ; [.1CF8.0020.0002.0B48] # ORIYA VOWEL SIGN AI
+0B47 0B56 ; [.1CF8.0020.0002.0B48] # ORIYA VOWEL SIGN AI
+0B4B ; [.1CF9.0020.0002.0B4B] # ORIYA VOWEL SIGN O
+0B47 0B3E ; [.1CF9.0020.0002.0B4B] # ORIYA VOWEL SIGN O
+0B4C ; [.1CFA.0020.0002.0B4C] # ORIYA VOWEL SIGN AU
+0B47 0B57 ; [.1CFA.0020.0002.0B4C] # ORIYA VOWEL SIGN AU
+0B4D ; [.1CFB.0020.0002.0B4D] # ORIYA SIGN VIRAMA
+0B56 ; [.1CFC.0020.0002.0B56] # ORIYA AI LENGTH MARK
+0B57 ; [.1CFD.0020.0002.0B57] # ORIYA AU LENGTH MARK
+0BD0 ; [.1CFE.0020.0002.0BD0] # TAMIL OM
+0B85 ; [.1CFF.0020.0002.0B85] # TAMIL LETTER A
+0B86 ; [.1D00.0020.0002.0B86] # TAMIL LETTER AA
+0B87 ; [.1D01.0020.0002.0B87] # TAMIL LETTER I
+0B88 ; [.1D02.0020.0002.0B88] # TAMIL LETTER II
+0B89 ; [.1D03.0020.0002.0B89] # TAMIL LETTER U
+0B8A ; [.1D04.0020.0002.0B8A] # TAMIL LETTER UU
+0B8E ; [.1D05.0020.0002.0B8E] # TAMIL LETTER E
+0B8F ; [.1D06.0020.0002.0B8F] # TAMIL LETTER EE
+0B90 ; [.1D07.0020.0002.0B90] # TAMIL LETTER AI
+0B92 ; [.1D08.0020.0002.0B92] # TAMIL LETTER O
+0B93 ; [.1D09.0020.0002.0B93] # TAMIL LETTER OO
+0B94 ; [.1D0A.0020.0002.0B94] # TAMIL LETTER AU
+0B92 0BD7 ; [.1D0A.0020.0002.0B94] # TAMIL LETTER AU
+0B83 ; [.1D0B.0020.0002.0B83] # TAMIL SIGN VISARGA
+0B95 ; [.1D0C.0020.0002.0B95] # TAMIL LETTER KA
+0B99 ; [.1D0D.0020.0002.0B99] # TAMIL LETTER NGA
+0B9A ; [.1D0E.0020.0002.0B9A] # TAMIL LETTER CA
+0B9E ; [.1D0F.0020.0002.0B9E] # TAMIL LETTER NYA
+0B9F ; [.1D10.0020.0002.0B9F] # TAMIL LETTER TTA
+0BA3 ; [.1D11.0020.0002.0BA3] # TAMIL LETTER NNA
+0BA4 ; [.1D12.0020.0002.0BA4] # TAMIL LETTER TA
+0BA8 ; [.1D13.0020.0002.0BA8] # TAMIL LETTER NA
+0BAA ; [.1D14.0020.0002.0BAA] # TAMIL LETTER PA
+0BAE ; [.1D15.0020.0002.0BAE] # TAMIL LETTER MA
+0BAF ; [.1D16.0020.0002.0BAF] # TAMIL LETTER YA
+0BB0 ; [.1D17.0020.0002.0BB0] # TAMIL LETTER RA
+0BB2 ; [.1D18.0020.0002.0BB2] # TAMIL LETTER LA
+0BB5 ; [.1D19.0020.0002.0BB5] # TAMIL LETTER VA
+0BB4 ; [.1D1A.0020.0002.0BB4] # TAMIL LETTER LLLA
+0BB3 ; [.1D1B.0020.0002.0BB3] # TAMIL LETTER LLA
+0BB1 ; [.1D1C.0020.0002.0BB1] # TAMIL LETTER RRA
+0BA9 ; [.1D1D.0020.0002.0BA9] # TAMIL LETTER NNNA
+0B9C ; [.1D1E.0020.0002.0B9C] # TAMIL LETTER JA
+0BB6 ; [.1D1F.0020.0002.0BB6] # TAMIL LETTER SHA
+0BB7 ; [.1D20.0020.0002.0BB7] # TAMIL LETTER SSA
+0BB8 ; [.1D21.0020.0002.0BB8] # TAMIL LETTER SA
+0BB9 ; [.1D22.0020.0002.0BB9] # TAMIL LETTER HA
+0BBE ; [.1D23.0020.0002.0BBE] # TAMIL VOWEL SIGN AA
+0BBF ; [.1D24.0020.0002.0BBF] # TAMIL VOWEL SIGN I
+0BC0 ; [.1D25.0020.0002.0BC0] # TAMIL VOWEL SIGN II
+0BC1 ; [.1D26.0020.0002.0BC1] # TAMIL VOWEL SIGN U
+0BC2 ; [.1D27.0020.0002.0BC2] # TAMIL VOWEL SIGN UU
+0BC6 ; [.1D28.0020.0002.0BC6] # TAMIL VOWEL SIGN E
+0BC7 ; [.1D29.0020.0002.0BC7] # TAMIL VOWEL SIGN EE
+0BC8 ; [.1D2A.0020.0002.0BC8] # TAMIL VOWEL SIGN AI
+0BCA ; [.1D2B.0020.0002.0BCA] # TAMIL VOWEL SIGN O
+0BC6 0BBE ; [.1D2B.0020.0002.0BCA] # TAMIL VOWEL SIGN O
+0BCB ; [.1D2C.0020.0002.0BCB] # TAMIL VOWEL SIGN OO
+0BC7 0BBE ; [.1D2C.0020.0002.0BCB] # TAMIL VOWEL SIGN OO
+0BCC ; [.1D2D.0020.0002.0BCC] # TAMIL VOWEL SIGN AU
+0BC6 0BD7 ; [.1D2D.0020.0002.0BCC] # TAMIL VOWEL SIGN AU
+0BCD ; [.1D2E.0020.0002.0BCD] # TAMIL SIGN VIRAMA
+0BD7 ; [.1D2F.0020.0002.0BD7] # TAMIL AU LENGTH MARK
+0C05 ; [.1D30.0020.0002.0C05] # TELUGU LETTER A
+0C06 ; [.1D31.0020.0002.0C06] # TELUGU LETTER AA
+0C07 ; [.1D32.0020.0002.0C07] # TELUGU LETTER I
+0C08 ; [.1D33.0020.0002.0C08] # TELUGU LETTER II
+0C09 ; [.1D34.0020.0002.0C09] # TELUGU LETTER U
+0C0A ; [.1D35.0020.0002.0C0A] # TELUGU LETTER UU
+0C0B ; [.1D36.0020.0002.0C0B] # TELUGU LETTER VOCALIC R
+0C60 ; [.1D37.0020.0002.0C60] # TELUGU LETTER VOCALIC RR
+0C0C ; [.1D38.0020.0002.0C0C] # TELUGU LETTER VOCALIC L
+0C61 ; [.1D39.0020.0002.0C61] # TELUGU LETTER VOCALIC LL
+0C0E ; [.1D3A.0020.0002.0C0E] # TELUGU LETTER E
+0C0F ; [.1D3B.0020.0002.0C0F] # TELUGU LETTER EE
+0C10 ; [.1D3C.0020.0002.0C10] # TELUGU LETTER AI
+0C12 ; [.1D3D.0020.0002.0C12] # TELUGU LETTER O
+0C13 ; [.1D3E.0020.0002.0C13] # TELUGU LETTER OO
+0C14 ; [.1D3F.0020.0002.0C14] # TELUGU LETTER AU
+0C15 ; [.1D40.0020.0002.0C15] # TELUGU LETTER KA
+0C16 ; [.1D41.0020.0002.0C16] # TELUGU LETTER KHA
+0C17 ; [.1D42.0020.0002.0C17] # TELUGU LETTER GA
+0C18 ; [.1D43.0020.0002.0C18] # TELUGU LETTER GHA
+0C19 ; [.1D44.0020.0002.0C19] # TELUGU LETTER NGA
+0C1A ; [.1D45.0020.0002.0C1A] # TELUGU LETTER CA
+0C58 ; [.1D46.0020.0002.0C58] # TELUGU LETTER TSA
+0C1B ; [.1D47.0020.0002.0C1B] # TELUGU LETTER CHA
+0C1C ; [.1D48.0020.0002.0C1C] # TELUGU LETTER JA
+0C59 ; [.1D49.0020.0002.0C59] # TELUGU LETTER DZA
+0C1D ; [.1D4A.0020.0002.0C1D] # TELUGU LETTER JHA
+0C1E ; [.1D4B.0020.0002.0C1E] # TELUGU LETTER NYA
+0C1F ; [.1D4C.0020.0002.0C1F] # TELUGU LETTER TTA
+0C20 ; [.1D4D.0020.0002.0C20] # TELUGU LETTER TTHA
+0C21 ; [.1D4E.0020.0002.0C21] # TELUGU LETTER DDA
+0C22 ; [.1D4F.0020.0002.0C22] # TELUGU LETTER DDHA
+0C23 ; [.1D50.0020.0002.0C23] # TELUGU LETTER NNA
+0C24 ; [.1D51.0020.0002.0C24] # TELUGU LETTER TA
+0C25 ; [.1D52.0020.0002.0C25] # TELUGU LETTER THA
+0C26 ; [.1D53.0020.0002.0C26] # TELUGU LETTER DA
+0C27 ; [.1D54.0020.0002.0C27] # TELUGU LETTER DHA
+0C28 ; [.1D55.0020.0002.0C28] # TELUGU LETTER NA
+0C2A ; [.1D56.0020.0002.0C2A] # TELUGU LETTER PA
+0C2B ; [.1D57.0020.0002.0C2B] # TELUGU LETTER PHA
+0C2C ; [.1D58.0020.0002.0C2C] # TELUGU LETTER BA
+0C2D ; [.1D59.0020.0002.0C2D] # TELUGU LETTER BHA
+0C2E ; [.1D5A.0020.0002.0C2E] # TELUGU LETTER MA
+0C2F ; [.1D5B.0020.0002.0C2F] # TELUGU LETTER YA
+0C30 ; [.1D5C.0020.0002.0C30] # TELUGU LETTER RA
+0C31 ; [.1D5D.0020.0002.0C31] # TELUGU LETTER RRA
+0C32 ; [.1D5E.0020.0002.0C32] # TELUGU LETTER LA
+0C35 ; [.1D5F.0020.0002.0C35] # TELUGU LETTER VA
+0C36 ; [.1D60.0020.0002.0C36] # TELUGU LETTER SHA
+0C37 ; [.1D61.0020.0002.0C37] # TELUGU LETTER SSA
+0C38 ; [.1D62.0020.0002.0C38] # TELUGU LETTER SA
+0C39 ; [.1D63.0020.0002.0C39] # TELUGU LETTER HA
+0C33 ; [.1D64.0020.0002.0C33] # TELUGU LETTER LLA
+0C3D ; [.1D65.0020.0002.0C3D] # TELUGU SIGN AVAGRAHA
+0C3E ; [.1D66.0020.0002.0C3E] # TELUGU VOWEL SIGN AA
+0C3F ; [.1D67.0020.0002.0C3F] # TELUGU VOWEL SIGN I
+0C40 ; [.1D68.0020.0002.0C40] # TELUGU VOWEL SIGN II
+0C41 ; [.1D69.0020.0002.0C41] # TELUGU VOWEL SIGN U
+0C42 ; [.1D6A.0020.0002.0C42] # TELUGU VOWEL SIGN UU
+0C43 ; [.1D6B.0020.0002.0C43] # TELUGU VOWEL SIGN VOCALIC R
+0C44 ; [.1D6C.0020.0002.0C44] # TELUGU VOWEL SIGN VOCALIC RR
+0C62 ; [.1D6D.0020.0002.0C62] # TELUGU VOWEL SIGN VOCALIC L
+0C63 ; [.1D6E.0020.0002.0C63] # TELUGU VOWEL SIGN VOCALIC LL
+0C46 ; [.1D6F.0020.0002.0C46] # TELUGU VOWEL SIGN E
+0C47 ; [.1D70.0020.0002.0C47] # TELUGU VOWEL SIGN EE
+0C48 ; [.1D71.0020.0002.0C48] # TELUGU VOWEL SIGN AI
+0C46 0C56 ; [.1D71.0020.0002.0C48] # TELUGU VOWEL SIGN AI
+0C4A ; [.1D72.0020.0002.0C4A] # TELUGU VOWEL SIGN O
+0C4B ; [.1D73.0020.0002.0C4B] # TELUGU VOWEL SIGN OO
+0C4C ; [.1D74.0020.0002.0C4C] # TELUGU VOWEL SIGN AU
+0C4D ; [.1D75.0020.0002.0C4D] # TELUGU SIGN VIRAMA
+0C55 ; [.1D76.0020.0002.0C55] # TELUGU LENGTH MARK
+0C56 ; [.1D77.0020.0002.0C56] # TELUGU AI LENGTH MARK
+0C85 ; [.1D78.0020.0002.0C85] # KANNADA LETTER A
+0C86 ; [.1D79.0020.0002.0C86] # KANNADA LETTER AA
+0C87 ; [.1D7A.0020.0002.0C87] # KANNADA LETTER I
+0C88 ; [.1D7B.0020.0002.0C88] # KANNADA LETTER II
+0C89 ; [.1D7C.0020.0002.0C89] # KANNADA LETTER U
+0C8A ; [.1D7D.0020.0002.0C8A] # KANNADA LETTER UU
+0C8B ; [.1D7E.0020.0002.0C8B] # KANNADA LETTER VOCALIC R
+0CE0 ; [.1D7F.0020.0002.0CE0] # KANNADA LETTER VOCALIC RR
+0C8C ; [.1D80.0020.0002.0C8C] # KANNADA LETTER VOCALIC L
+0CE1 ; [.1D81.0020.0002.0CE1] # KANNADA LETTER VOCALIC LL
+0C8E ; [.1D82.0020.0002.0C8E] # KANNADA LETTER E
+0C8F ; [.1D83.0020.0002.0C8F] # KANNADA LETTER EE
+0C90 ; [.1D84.0020.0002.0C90] # KANNADA LETTER AI
+0C92 ; [.1D85.0020.0002.0C92] # KANNADA LETTER O
+0C93 ; [.1D86.0020.0002.0C93] # KANNADA LETTER OO
+0C94 ; [.1D87.0020.0002.0C94] # KANNADA LETTER AU
+0C95 ; [.1D88.0020.0002.0C95] # KANNADA LETTER KA
+0C96 ; [.1D89.0020.0002.0C96] # KANNADA LETTER KHA
+0C97 ; [.1D8A.0020.0002.0C97] # KANNADA LETTER GA
+0C98 ; [.1D8B.0020.0002.0C98] # KANNADA LETTER GHA
+0C99 ; [.1D8C.0020.0002.0C99] # KANNADA LETTER NGA
+0C9A ; [.1D8D.0020.0002.0C9A] # KANNADA LETTER CA
+0C9B ; [.1D8E.0020.0002.0C9B] # KANNADA LETTER CHA
+0C9C ; [.1D8F.0020.0002.0C9C] # KANNADA LETTER JA
+0C9D ; [.1D90.0020.0002.0C9D] # KANNADA LETTER JHA
+0C9E ; [.1D91.0020.0002.0C9E] # KANNADA LETTER NYA
+0C9F ; [.1D92.0020.0002.0C9F] # KANNADA LETTER TTA
+0CA0 ; [.1D93.0020.0002.0CA0] # KANNADA LETTER TTHA
+0CA1 ; [.1D94.0020.0002.0CA1] # KANNADA LETTER DDA
+0CA2 ; [.1D95.0020.0002.0CA2] # KANNADA LETTER DDHA
+0CA3 ; [.1D96.0020.0002.0CA3] # KANNADA LETTER NNA
+0CA4 ; [.1D97.0020.0002.0CA4] # KANNADA LETTER TA
+0CA5 ; [.1D98.0020.0002.0CA5] # KANNADA LETTER THA
+0CA6 ; [.1D99.0020.0002.0CA6] # KANNADA LETTER DA
+0CA7 ; [.1D9A.0020.0002.0CA7] # KANNADA LETTER DHA
+0CA8 ; [.1D9B.0020.0002.0CA8] # KANNADA LETTER NA
+0CAA ; [.1D9C.0020.0002.0CAA] # KANNADA LETTER PA
+0CAB ; [.1D9D.0020.0002.0CAB] # KANNADA LETTER PHA
+0CAC ; [.1D9E.0020.0002.0CAC] # KANNADA LETTER BA
+0CAD ; [.1D9F.0020.0002.0CAD] # KANNADA LETTER BHA
+0CAE ; [.1DA0.0020.0002.0CAE] # KANNADA LETTER MA
+0CAF ; [.1DA1.0020.0002.0CAF] # KANNADA LETTER YA
+0CB0 ; [.1DA2.0020.0002.0CB0] # KANNADA LETTER RA
+0CB1 ; [.1DA3.0020.0002.0CB1] # KANNADA LETTER RRA
+0CB2 ; [.1DA4.0020.0002.0CB2] # KANNADA LETTER LA
+0CB5 ; [.1DA5.0020.0002.0CB5] # KANNADA LETTER VA
+0CB6 ; [.1DA6.0020.0002.0CB6] # KANNADA LETTER SHA
+0CB7 ; [.1DA7.0020.0002.0CB7] # KANNADA LETTER SSA
+0CB8 ; [.1DA8.0020.0002.0CB8] # KANNADA LETTER SA
+0CB9 ; [.1DA9.0020.0002.0CB9] # KANNADA LETTER HA
+0CB3 ; [.1DAA.0020.0002.0CB3] # KANNADA LETTER LLA
+0CDE ; [.1DAB.0020.0002.0CDE] # KANNADA LETTER FA
+0CBD ; [.1DAC.0020.0002.0CBD] # KANNADA SIGN AVAGRAHA
+0CBE ; [.1DAD.0020.0002.0CBE] # KANNADA VOWEL SIGN AA
+0CBF ; [.1DAE.0020.0002.0CBF] # KANNADA VOWEL SIGN I
+0CC0 ; [.1DAF.0020.0002.0CC0] # KANNADA VOWEL SIGN II
+0CBF 0CD5 ; [.1DAF.0020.0002.0CC0] # KANNADA VOWEL SIGN II
+0CC1 ; [.1DB0.0020.0002.0CC1] # KANNADA VOWEL SIGN U
+0CC2 ; [.1DB1.0020.0002.0CC2] # KANNADA VOWEL SIGN UU
+0CC3 ; [.1DB2.0020.0002.0CC3] # KANNADA VOWEL SIGN VOCALIC R
+0CC4 ; [.1DB3.0020.0002.0CC4] # KANNADA VOWEL SIGN VOCALIC RR
+0CE2 ; [.1DB4.0020.0002.0CE2] # KANNADA VOWEL SIGN VOCALIC L
+0CE3 ; [.1DB5.0020.0002.0CE3] # KANNADA VOWEL SIGN VOCALIC LL
+0CC6 ; [.1DB6.0020.0002.0CC6] # KANNADA VOWEL SIGN E
+0CC7 ; [.1DB7.0020.0002.0CC7] # KANNADA VOWEL SIGN EE
+0CC6 0CD5 ; [.1DB7.0020.0002.0CC7] # KANNADA VOWEL SIGN EE
+0CC8 ; [.1DB8.0020.0002.0CC8] # KANNADA VOWEL SIGN AI
+0CC6 0CD6 ; [.1DB8.0020.0002.0CC8] # KANNADA VOWEL SIGN AI
+0CCA ; [.1DB9.0020.0002.0CCA] # KANNADA VOWEL SIGN O
+0CC6 0CC2 ; [.1DB9.0020.0002.0CCA] # KANNADA VOWEL SIGN O
+0CCB ; [.1DBA.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CC6 0CC2 0CD5 ; [.1DBA.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CCA 0CD5 ; [.1DBA.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CCC ; [.1DBB.0020.0002.0CCC] # KANNADA VOWEL SIGN AU
+0CCD ; [.1DBC.0020.0002.0CCD] # KANNADA SIGN VIRAMA
+0CD5 ; [.1DBD.0020.0002.0CD5] # KANNADA LENGTH MARK
+0CD6 ; [.1DBE.0020.0002.0CD6] # KANNADA AI LENGTH MARK
+0D05 ; [.1DBF.0020.0002.0D05] # MALAYALAM LETTER A
+0D06 ; [.1DC0.0020.0002.0D06] # MALAYALAM LETTER AA
+0D07 ; [.1DC1.0020.0002.0D07] # MALAYALAM LETTER I
+0D08 ; [.1DC2.0020.0002.0D08] # MALAYALAM LETTER II
+0D09 ; [.1DC3.0020.0002.0D09] # MALAYALAM LETTER U
+0D0A ; [.1DC4.0020.0002.0D0A] # MALAYALAM LETTER UU
+0D0B ; [.1DC5.0020.0002.0D0B] # MALAYALAM LETTER VOCALIC R
+0D60 ; [.1DC6.0020.0002.0D60] # MALAYALAM LETTER VOCALIC RR
+0D0C ; [.1DC7.0020.0002.0D0C] # MALAYALAM LETTER VOCALIC L
+0D61 ; [.1DC8.0020.0002.0D61] # MALAYALAM LETTER VOCALIC LL
+0D0E ; [.1DC9.0020.0002.0D0E] # MALAYALAM LETTER E
+0D0F ; [.1DCA.0020.0002.0D0F] # MALAYALAM LETTER EE
+0D10 ; [.1DCB.0020.0002.0D10] # MALAYALAM LETTER AI
+0D12 ; [.1DCC.0020.0002.0D12] # MALAYALAM LETTER O
+0D13 ; [.1DCD.0020.0002.0D13] # MALAYALAM LETTER OO
+0D14 ; [.1DCE.0020.0002.0D14] # MALAYALAM LETTER AU
+0D15 ; [.1DCF.0020.0002.0D15] # MALAYALAM LETTER KA
+0D7F ; [.1DCF.0020.0004.0D7F][.1E04.0020.0004.0D7F] # MALAYALAM LETTER CHILLU K; QQKN
+0D16 ; [.1DD0.0020.0002.0D16] # MALAYALAM LETTER KHA
+0D17 ; [.1DD1.0020.0002.0D17] # MALAYALAM LETTER GA
+0D18 ; [.1DD2.0020.0002.0D18] # MALAYALAM LETTER GHA
+0D19 ; [.1DD3.0020.0002.0D19] # MALAYALAM LETTER NGA
+0D1A ; [.1DD4.0020.0002.0D1A] # MALAYALAM LETTER CA
+0D1B ; [.1DD5.0020.0002.0D1B] # MALAYALAM LETTER CHA
+0D1C ; [.1DD6.0020.0002.0D1C] # MALAYALAM LETTER JA
+0D1D ; [.1DD7.0020.0002.0D1D] # MALAYALAM LETTER JHA
+0D1E ; [.1DD8.0020.0002.0D1E] # MALAYALAM LETTER NYA
+0D1F ; [.1DD9.0020.0002.0D1F] # MALAYALAM LETTER TTA
+0D20 ; [.1DDA.0020.0002.0D20] # MALAYALAM LETTER TTHA
+0D21 ; [.1DDB.0020.0002.0D21] # MALAYALAM LETTER DDA
+0D22 ; [.1DDC.0020.0002.0D22] # MALAYALAM LETTER DDHA
+0D23 ; [.1DDD.0020.0002.0D23] # MALAYALAM LETTER NNA
+0D7A ; [.1DDD.0020.0004.0D7A][.1E04.0020.0004.0D7A] # MALAYALAM LETTER CHILLU NN; QQKN
+0D24 ; [.1DDE.0020.0002.0D24] # MALAYALAM LETTER TA
+0D25 ; [.1DDF.0020.0002.0D25] # MALAYALAM LETTER THA
+0D26 ; [.1DE0.0020.0002.0D26] # MALAYALAM LETTER DA
+0D27 ; [.1DE1.0020.0002.0D27] # MALAYALAM LETTER DHA
+0D28 ; [.1DE2.0020.0002.0D28] # MALAYALAM LETTER NA
+0D7B ; [.1DE2.0020.0004.0D7B][.1E04.0020.0004.0D7B] # MALAYALAM LETTER CHILLU N; QQKN
+0D2A ; [.1DE3.0020.0002.0D2A] # MALAYALAM LETTER PA
+0D2B ; [.1DE4.0020.0002.0D2B] # MALAYALAM LETTER PHA
+0D2C ; [.1DE5.0020.0002.0D2C] # MALAYALAM LETTER BA
+0D2D ; [.1DE6.0020.0002.0D2D] # MALAYALAM LETTER BHA
+0D2E ; [.1DE7.0020.0002.0D2E] # MALAYALAM LETTER MA
+0D2F ; [.1DE8.0020.0002.0D2F] # MALAYALAM LETTER YA
+0D30 ; [.1DE9.0020.0002.0D30] # MALAYALAM LETTER RA
+0D7C ; [.1DE9.0020.0004.0D7C][.1E04.0020.0004.0D7C] # MALAYALAM LETTER CHILLU RR; QQKN
+0D32 ; [.1DEA.0020.0002.0D32] # MALAYALAM LETTER LA
+0D7D ; [.1DEA.0020.0004.0D7D][.1E04.0020.0004.0D7D] # MALAYALAM LETTER CHILLU L; QQKN
+0D35 ; [.1DEB.0020.0002.0D35] # MALAYALAM LETTER VA
+0D36 ; [.1DEC.0020.0002.0D36] # MALAYALAM LETTER SHA
+0D37 ; [.1DED.0020.0002.0D37] # MALAYALAM LETTER SSA
+0D38 ; [.1DEE.0020.0002.0D38] # MALAYALAM LETTER SA
+0D39 ; [.1DEF.0020.0002.0D39] # MALAYALAM LETTER HA
+0D33 ; [.1DF0.0020.0002.0D33] # MALAYALAM LETTER LLA
+0D7E ; [.1DF0.0020.0004.0D7E][.1E04.0020.0004.0D7E] # MALAYALAM LETTER CHILLU LL; QQKN
+0D34 ; [.1DF1.0020.0002.0D34] # MALAYALAM LETTER LLLA
+0D31 ; [.1DF2.0020.0002.0D31] # MALAYALAM LETTER RRA
+0D3D ; [.1DF3.0020.0002.0D3D] # MALAYALAM SIGN AVAGRAHA
+0D3E ; [.1DF4.0020.0002.0D3E] # MALAYALAM VOWEL SIGN AA
+0D3F ; [.1DF5.0020.0002.0D3F] # MALAYALAM VOWEL SIGN I
+0D40 ; [.1DF6.0020.0002.0D40] # MALAYALAM VOWEL SIGN II
+0D41 ; [.1DF7.0020.0002.0D41] # MALAYALAM VOWEL SIGN U
+0D42 ; [.1DF8.0020.0002.0D42] # MALAYALAM VOWEL SIGN UU
+0D43 ; [.1DF9.0020.0002.0D43] # MALAYALAM VOWEL SIGN VOCALIC R
+0D44 ; [.1DFA.0020.0002.0D44] # MALAYALAM VOWEL SIGN VOCALIC RR
+0D62 ; [.1DFB.0020.0002.0D62] # MALAYALAM VOWEL SIGN VOCALIC L
+0D63 ; [.1DFC.0020.0002.0D63] # MALAYALAM VOWEL SIGN VOCALIC LL
+0D46 ; [.1DFD.0020.0002.0D46] # MALAYALAM VOWEL SIGN E
+0D47 ; [.1DFE.0020.0002.0D47] # MALAYALAM VOWEL SIGN EE
+0D48 ; [.1DFF.0020.0002.0D48] # MALAYALAM VOWEL SIGN AI
+0D4A ; [.1E00.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O
+0D46 0D3E ; [.1E00.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O
+0D4B ; [.1E01.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO
+0D47 0D3E ; [.1E01.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO
+0D4C ; [.1E02.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU
+0D46 0D57 ; [.1E02.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU
+0D57 ; [.1E03.0020.0002.0D57] # MALAYALAM AU LENGTH MARK
+0D4D ; [.1E04.0020.0002.0D4D] # MALAYALAM SIGN VIRAMA
+0D85 ; [.1E05.0020.0002.0D85] # SINHALA LETTER AYANNA
+0D86 ; [.1E06.0020.0002.0D86] # SINHALA LETTER AAYANNA
+0D87 ; [.1E07.0020.0002.0D87] # SINHALA LETTER AEYANNA
+0D88 ; [.1E08.0020.0002.0D88] # SINHALA LETTER AEEYANNA
+0D89 ; [.1E09.0020.0002.0D89] # SINHALA LETTER IYANNA
+0D8A ; [.1E0A.0020.0002.0D8A] # SINHALA LETTER IIYANNA
+0D8B ; [.1E0B.0020.0002.0D8B] # SINHALA LETTER UYANNA
+0D8C ; [.1E0C.0020.0002.0D8C] # SINHALA LETTER UUYANNA
+0D8D ; [.1E0D.0020.0002.0D8D] # SINHALA LETTER IRUYANNA
+0D8E ; [.1E0E.0020.0002.0D8E] # SINHALA LETTER IRUUYANNA
+0D8F ; [.1E0F.0020.0002.0D8F] # SINHALA LETTER ILUYANNA
+0D90 ; [.1E10.0020.0002.0D90] # SINHALA LETTER ILUUYANNA
+0D91 ; [.1E11.0020.0002.0D91] # SINHALA LETTER EYANNA
+0D92 ; [.1E12.0020.0002.0D92] # SINHALA LETTER EEYANNA
+0D93 ; [.1E13.0020.0002.0D93] # SINHALA LETTER AIYANNA
+0D94 ; [.1E14.0020.0002.0D94] # SINHALA LETTER OYANNA
+0D95 ; [.1E15.0020.0002.0D95] # SINHALA LETTER OOYANNA
+0D96 ; [.1E16.0020.0002.0D96] # SINHALA LETTER AUYANNA
+0D9A ; [.1E17.0020.0002.0D9A] # SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B ; [.1E18.0020.0002.0D9B] # SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C ; [.1E19.0020.0002.0D9C] # SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D ; [.1E1A.0020.0002.0D9D] # SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E ; [.1E1B.0020.0002.0D9E] # SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F ; [.1E1C.0020.0002.0D9F] # SINHALA LETTER SANYAKA GAYANNA
+0DA0 ; [.1E1D.0020.0002.0DA0] # SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1 ; [.1E1E.0020.0002.0DA1] # SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2 ; [.1E1F.0020.0002.0DA2] # SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3 ; [.1E20.0020.0002.0DA3] # SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4 ; [.1E21.0020.0002.0DA4] # SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5 ; [.1E22.0020.0002.0DA5] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6 ; [.1E23.0020.0002.0DA6] # SINHALA LETTER SANYAKA JAYANNA
+0DA7 ; [.1E24.0020.0002.0DA7] # SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8 ; [.1E25.0020.0002.0DA8] # SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9 ; [.1E26.0020.0002.0DA9] # SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA ; [.1E27.0020.0002.0DAA] # SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB ; [.1E28.0020.0002.0DAB] # SINHALA LETTER MUURDHAJA NAYANNA
+0DAC ; [.1E29.0020.0002.0DAC] # SINHALA LETTER SANYAKA DDAYANNA
+0DAD ; [.1E2A.0020.0002.0DAD] # SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE ; [.1E2B.0020.0002.0DAE] # SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF ; [.1E2C.0020.0002.0DAF] # SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0 ; [.1E2D.0020.0002.0DB0] # SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1 ; [.1E2E.0020.0002.0DB1] # SINHALA LETTER DANTAJA NAYANNA
+0DB3 ; [.1E2F.0020.0002.0DB3] # SINHALA LETTER SANYAKA DAYANNA
+0DB4 ; [.1E30.0020.0002.0DB4] # SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5 ; [.1E31.0020.0002.0DB5] # SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6 ; [.1E32.0020.0002.0DB6] # SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7 ; [.1E33.0020.0002.0DB7] # SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8 ; [.1E34.0020.0002.0DB8] # SINHALA LETTER MAYANNA
+0DB9 ; [.1E35.0020.0002.0DB9] # SINHALA LETTER AMBA BAYANNA
+0DBA ; [.1E36.0020.0002.0DBA] # SINHALA LETTER YAYANNA
+0DBB ; [.1E37.0020.0002.0DBB] # SINHALA LETTER RAYANNA
+0DBD ; [.1E38.0020.0002.0DBD] # SINHALA LETTER DANTAJA LAYANNA
+0DC0 ; [.1E39.0020.0002.0DC0] # SINHALA LETTER VAYANNA
+0DC1 ; [.1E3A.0020.0002.0DC1] # SINHALA LETTER TAALUJA SAYANNA
+0DC2 ; [.1E3B.0020.0002.0DC2] # SINHALA LETTER MUURDHAJA SAYANNA
+0DC3 ; [.1E3C.0020.0002.0DC3] # SINHALA LETTER DANTAJA SAYANNA
+0DC4 ; [.1E3D.0020.0002.0DC4] # SINHALA LETTER HAYANNA
+0DC5 ; [.1E3E.0020.0002.0DC5] # SINHALA LETTER MUURDHAJA LAYANNA
+0DC6 ; [.1E3F.0020.0002.0DC6] # SINHALA LETTER FAYANNA
+0DCF ; [.1E40.0020.0002.0DCF] # SINHALA VOWEL SIGN AELA-PILLA
+0DD0 ; [.1E41.0020.0002.0DD0] # SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1 ; [.1E42.0020.0002.0DD1] # SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2 ; [.1E43.0020.0002.0DD2] # SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3 ; [.1E44.0020.0002.0DD3] # SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4 ; [.1E45.0020.0002.0DD4] # SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; [.1E46.0020.0002.0DD6] # SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8 ; [.1E47.0020.0002.0DD8] # SINHALA VOWEL SIGN GAETTA-PILLA
+0DF2 ; [.1E48.0020.0002.0DF2] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DDF ; [.1E49.0020.0002.0DDF] # SINHALA VOWEL SIGN GAYANUKITTA
+0DF3 ; [.1E4A.0020.0002.0DF3] # SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DD9 ; [.1E4B.0020.0002.0DD9] # SINHALA VOWEL SIGN KOMBUVA
+0DDA ; [.1E4C.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DD9 0DCA ; [.1E4C.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB ; [.1E4D.0020.0002.0DDB] # SINHALA VOWEL SIGN KOMBU DEKA
+0DDC ; [.1E4E.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DD9 0DCF ; [.1E4E.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD ; [.1E4F.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DD9 0DCF 0DCA ; [.1E4F.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDC 0DCA ; [.1E4F.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE ; [.1E50.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DD9 0DDF ; [.1E50.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DCA ; [.1E51.0020.0002.0DCA] # SINHALA SIGN AL-LAKUNA
+ABC0 ; [.1E52.0020.0002.ABC0] # MEETEI MAYEK LETTER KOK
+ABC1 ; [.1E53.0020.0002.ABC1] # MEETEI MAYEK LETTER SAM
+ABC2 ; [.1E54.0020.0002.ABC2] # MEETEI MAYEK LETTER LAI
+ABC3 ; [.1E55.0020.0002.ABC3] # MEETEI MAYEK LETTER MIT
+ABC4 ; [.1E56.0020.0002.ABC4] # MEETEI MAYEK LETTER PA
+ABC5 ; [.1E57.0020.0002.ABC5] # MEETEI MAYEK LETTER NA
+ABC6 ; [.1E58.0020.0002.ABC6] # MEETEI MAYEK LETTER CHIL
+ABC7 ; [.1E59.0020.0002.ABC7] # MEETEI MAYEK LETTER TIL
+ABC8 ; [.1E5A.0020.0002.ABC8] # MEETEI MAYEK LETTER KHOU
+ABC9 ; [.1E5B.0020.0002.ABC9] # MEETEI MAYEK LETTER NGOU
+ABCA ; [.1E5C.0020.0002.ABCA] # MEETEI MAYEK LETTER THOU
+ABCB ; [.1E5D.0020.0002.ABCB] # MEETEI MAYEK LETTER WAI
+ABCC ; [.1E5E.0020.0002.ABCC] # MEETEI MAYEK LETTER YANG
+ABCD ; [.1E5F.0020.0002.ABCD] # MEETEI MAYEK LETTER HUK
+ABCE ; [.1E60.0020.0002.ABCE] # MEETEI MAYEK LETTER UN
+ABCF ; [.1E61.0020.0002.ABCF] # MEETEI MAYEK LETTER I
+ABD0 ; [.1E62.0020.0002.ABD0] # MEETEI MAYEK LETTER PHAM
+ABD1 ; [.1E63.0020.0002.ABD1] # MEETEI MAYEK LETTER ATIYA
+ABD2 ; [.1E64.0020.0002.ABD2] # MEETEI MAYEK LETTER GOK
+ABD3 ; [.1E65.0020.0002.ABD3] # MEETEI MAYEK LETTER JHAM
+ABD4 ; [.1E66.0020.0002.ABD4] # MEETEI MAYEK LETTER RAI
+ABD5 ; [.1E67.0020.0002.ABD5] # MEETEI MAYEK LETTER BA
+ABD6 ; [.1E68.0020.0002.ABD6] # MEETEI MAYEK LETTER JIL
+ABD7 ; [.1E69.0020.0002.ABD7] # MEETEI MAYEK LETTER DIL
+ABD8 ; [.1E6A.0020.0002.ABD8] # MEETEI MAYEK LETTER GHOU
+ABD9 ; [.1E6B.0020.0002.ABD9] # MEETEI MAYEK LETTER DHOU
+ABDA ; [.1E6C.0020.0002.ABDA] # MEETEI MAYEK LETTER BHAM
+ABE3 ; [.1E6D.0020.0002.ABE3] # MEETEI MAYEK VOWEL SIGN ONAP
+ABE4 ; [.1E6E.0020.0002.ABE4] # MEETEI MAYEK VOWEL SIGN INAP
+ABE5 ; [.1E6F.0020.0002.ABE5] # MEETEI MAYEK VOWEL SIGN ANAP
+ABE6 ; [.1E70.0020.0002.ABE6] # MEETEI MAYEK VOWEL SIGN YENAP
+ABE7 ; [.1E71.0020.0002.ABE7] # MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE8 ; [.1E72.0020.0002.ABE8] # MEETEI MAYEK VOWEL SIGN UNAP
+ABE9 ; [.1E73.0020.0002.ABE9] # MEETEI MAYEK VOWEL SIGN CHEINAP
+ABEA ; [.1E74.0020.0002.ABEA] # MEETEI MAYEK VOWEL SIGN NUNG
+ABDB ; [.1E75.0020.0002.ABDB] # MEETEI MAYEK LETTER KOK LONSUM
+ABDC ; [.1E76.0020.0002.ABDC] # MEETEI MAYEK LETTER LAI LONSUM
+ABDD ; [.1E77.0020.0002.ABDD] # MEETEI MAYEK LETTER MIT LONSUM
+ABDE ; [.1E78.0020.0002.ABDE] # MEETEI MAYEK LETTER PA LONSUM
+ABDF ; [.1E79.0020.0002.ABDF] # MEETEI MAYEK LETTER NA LONSUM
+ABE0 ; [.1E7A.0020.0002.ABE0] # MEETEI MAYEK LETTER TIL LONSUM
+ABE1 ; [.1E7B.0020.0002.ABE1] # MEETEI MAYEK LETTER NGOU LONSUM
+ABE2 ; [.1E7C.0020.0002.ABE2] # MEETEI MAYEK LETTER I LONSUM
+ABED ; [.1E7D.0020.0002.ABED] # MEETEI MAYEK APUN IYEK
+A800 ; [.1E7E.0020.0002.A800] # SYLOTI NAGRI LETTER A
+A801 ; [.1E7F.0020.0002.A801] # SYLOTI NAGRI LETTER I
+A802 ; [.1E80.0020.0002.A802] # SYLOTI NAGRI SIGN DVISVARA
+A803 ; [.1E81.0020.0002.A803] # SYLOTI NAGRI LETTER U
+A804 ; [.1E82.0020.0002.A804] # SYLOTI NAGRI LETTER E
+A805 ; [.1E83.0020.0002.A805] # SYLOTI NAGRI LETTER O
+A806 ; [.1E84.0020.0002.A806] # SYLOTI NAGRI SIGN HASANTA
+A807 ; [.1E85.0020.0002.A807] # SYLOTI NAGRI LETTER KO
+A808 ; [.1E86.0020.0002.A808] # SYLOTI NAGRI LETTER KHO
+A809 ; [.1E87.0020.0002.A809] # SYLOTI NAGRI LETTER GO
+A80A ; [.1E88.0020.0002.A80A] # SYLOTI NAGRI LETTER GHO
+A80C ; [.1E89.0020.0002.A80C] # SYLOTI NAGRI LETTER CO
+A80D ; [.1E8A.0020.0002.A80D] # SYLOTI NAGRI LETTER CHO
+A80E ; [.1E8B.0020.0002.A80E] # SYLOTI NAGRI LETTER JO
+A80F ; [.1E8C.0020.0002.A80F] # SYLOTI NAGRI LETTER JHO
+A810 ; [.1E8D.0020.0002.A810] # SYLOTI NAGRI LETTER TTO
+A811 ; [.1E8E.0020.0002.A811] # SYLOTI NAGRI LETTER TTHO
+A812 ; [.1E8F.0020.0002.A812] # SYLOTI NAGRI LETTER DDO
+A813 ; [.1E90.0020.0002.A813] # SYLOTI NAGRI LETTER DDHO
+A814 ; [.1E91.0020.0002.A814] # SYLOTI NAGRI LETTER TO
+A815 ; [.1E92.0020.0002.A815] # SYLOTI NAGRI LETTER THO
+A816 ; [.1E93.0020.0002.A816] # SYLOTI NAGRI LETTER DO
+A817 ; [.1E94.0020.0002.A817] # SYLOTI NAGRI LETTER DHO
+A818 ; [.1E95.0020.0002.A818] # SYLOTI NAGRI LETTER NO
+A819 ; [.1E96.0020.0002.A819] # SYLOTI NAGRI LETTER PO
+A81A ; [.1E97.0020.0002.A81A] # SYLOTI NAGRI LETTER PHO
+A81B ; [.1E98.0020.0002.A81B] # SYLOTI NAGRI LETTER BO
+A81C ; [.1E99.0020.0002.A81C] # SYLOTI NAGRI LETTER BHO
+A81D ; [.1E9A.0020.0002.A81D] # SYLOTI NAGRI LETTER MO
+A81E ; [.1E9B.0020.0002.A81E] # SYLOTI NAGRI LETTER RO
+A81F ; [.1E9C.0020.0002.A81F] # SYLOTI NAGRI LETTER LO
+A820 ; [.1E9D.0020.0002.A820] # SYLOTI NAGRI LETTER RRO
+A821 ; [.1E9E.0020.0002.A821] # SYLOTI NAGRI LETTER SO
+A822 ; [.1E9F.0020.0002.A822] # SYLOTI NAGRI LETTER HO
+A823 ; [.1EA0.0020.0002.A823] # SYLOTI NAGRI VOWEL SIGN A
+A824 ; [.1EA1.0020.0002.A824] # SYLOTI NAGRI VOWEL SIGN I
+A825 ; [.1EA2.0020.0002.A825] # SYLOTI NAGRI VOWEL SIGN U
+A826 ; [.1EA3.0020.0002.A826] # SYLOTI NAGRI VOWEL SIGN E
+A827 ; [.1EA4.0020.0002.A827] # SYLOTI NAGRI VOWEL SIGN OO
+A882 ; [.1EA5.0020.0002.A882] # SAURASHTRA LETTER A
+A883 ; [.1EA6.0020.0002.A883] # SAURASHTRA LETTER AA
+A884 ; [.1EA7.0020.0002.A884] # SAURASHTRA LETTER I
+A885 ; [.1EA8.0020.0002.A885] # SAURASHTRA LETTER II
+A886 ; [.1EA9.0020.0002.A886] # SAURASHTRA LETTER U
+A887 ; [.1EAA.0020.0002.A887] # SAURASHTRA LETTER UU
+A888 ; [.1EAB.0020.0002.A888] # SAURASHTRA LETTER VOCALIC R
+A889 ; [.1EAC.0020.0002.A889] # SAURASHTRA LETTER VOCALIC RR
+A88A ; [.1EAD.0020.0002.A88A] # SAURASHTRA LETTER VOCALIC L
+A88B ; [.1EAE.0020.0002.A88B] # SAURASHTRA LETTER VOCALIC LL
+A88C ; [.1EAF.0020.0002.A88C] # SAURASHTRA LETTER E
+A88D ; [.1EB0.0020.0002.A88D] # SAURASHTRA LETTER EE
+A88E ; [.1EB1.0020.0002.A88E] # SAURASHTRA LETTER AI
+A88F ; [.1EB2.0020.0002.A88F] # SAURASHTRA LETTER O
+A890 ; [.1EB3.0020.0002.A890] # SAURASHTRA LETTER OO
+A891 ; [.1EB4.0020.0002.A891] # SAURASHTRA LETTER AU
+A892 ; [.1EB5.0020.0002.A892] # SAURASHTRA LETTER KA
+A893 ; [.1EB6.0020.0002.A893] # SAURASHTRA LETTER KHA
+A894 ; [.1EB7.0020.0002.A894] # SAURASHTRA LETTER GA
+A895 ; [.1EB8.0020.0002.A895] # SAURASHTRA LETTER GHA
+A896 ; [.1EB9.0020.0002.A896] # SAURASHTRA LETTER NGA
+A897 ; [.1EBA.0020.0002.A897] # SAURASHTRA LETTER CA
+A898 ; [.1EBB.0020.0002.A898] # SAURASHTRA LETTER CHA
+A899 ; [.1EBC.0020.0002.A899] # SAURASHTRA LETTER JA
+A89A ; [.1EBD.0020.0002.A89A] # SAURASHTRA LETTER JHA
+A89B ; [.1EBE.0020.0002.A89B] # SAURASHTRA LETTER NYA
+A89C ; [.1EBF.0020.0002.A89C] # SAURASHTRA LETTER TTA
+A89D ; [.1EC0.0020.0002.A89D] # SAURASHTRA LETTER TTHA
+A89E ; [.1EC1.0020.0002.A89E] # SAURASHTRA LETTER DDA
+A89F ; [.1EC2.0020.0002.A89F] # SAURASHTRA LETTER DDHA
+A8A0 ; [.1EC3.0020.0002.A8A0] # SAURASHTRA LETTER NNA
+A8A1 ; [.1EC4.0020.0002.A8A1] # SAURASHTRA LETTER TA
+A8A2 ; [.1EC5.0020.0002.A8A2] # SAURASHTRA LETTER THA
+A8A3 ; [.1EC6.0020.0002.A8A3] # SAURASHTRA LETTER DA
+A8A4 ; [.1EC7.0020.0002.A8A4] # SAURASHTRA LETTER DHA
+A8A5 ; [.1EC8.0020.0002.A8A5] # SAURASHTRA LETTER NA
+A8A6 ; [.1EC9.0020.0002.A8A6] # SAURASHTRA LETTER PA
+A8A7 ; [.1ECA.0020.0002.A8A7] # SAURASHTRA LETTER PHA
+A8A8 ; [.1ECB.0020.0002.A8A8] # SAURASHTRA LETTER BA
+A8A9 ; [.1ECC.0020.0002.A8A9] # SAURASHTRA LETTER BHA
+A8AA ; [.1ECD.0020.0002.A8AA] # SAURASHTRA LETTER MA
+A8AB ; [.1ECE.0020.0002.A8AB] # SAURASHTRA LETTER YA
+A8AC ; [.1ECF.0020.0002.A8AC] # SAURASHTRA LETTER RA
+A8AD ; [.1ED0.0020.0002.A8AD] # SAURASHTRA LETTER LA
+A8AE ; [.1ED1.0020.0002.A8AE] # SAURASHTRA LETTER VA
+A8AF ; [.1ED2.0020.0002.A8AF] # SAURASHTRA LETTER SHA
+A8B0 ; [.1ED3.0020.0002.A8B0] # SAURASHTRA LETTER SSA
+A8B1 ; [.1ED4.0020.0002.A8B1] # SAURASHTRA LETTER SA
+A8B2 ; [.1ED5.0020.0002.A8B2] # SAURASHTRA LETTER HA
+A8B3 ; [.1ED6.0020.0002.A8B3] # SAURASHTRA LETTER LLA
+A8B4 ; [.1ED7.0020.0002.A8B4] # SAURASHTRA CONSONANT SIGN HAARU
+A8B5 ; [.1ED8.0020.0002.A8B5] # SAURASHTRA VOWEL SIGN AA
+A8B6 ; [.1ED9.0020.0002.A8B6] # SAURASHTRA VOWEL SIGN I
+A8B7 ; [.1EDA.0020.0002.A8B7] # SAURASHTRA VOWEL SIGN II
+A8B8 ; [.1EDB.0020.0002.A8B8] # SAURASHTRA VOWEL SIGN U
+A8B9 ; [.1EDC.0020.0002.A8B9] # SAURASHTRA VOWEL SIGN UU
+A8BA ; [.1EDD.0020.0002.A8BA] # SAURASHTRA VOWEL SIGN VOCALIC R
+A8BB ; [.1EDE.0020.0002.A8BB] # SAURASHTRA VOWEL SIGN VOCALIC RR
+A8BC ; [.1EDF.0020.0002.A8BC] # SAURASHTRA VOWEL SIGN VOCALIC L
+A8BD ; [.1EE0.0020.0002.A8BD] # SAURASHTRA VOWEL SIGN VOCALIC LL
+A8BE ; [.1EE1.0020.0002.A8BE] # SAURASHTRA VOWEL SIGN E
+A8BF ; [.1EE2.0020.0002.A8BF] # SAURASHTRA VOWEL SIGN EE
+A8C0 ; [.1EE3.0020.0002.A8C0] # SAURASHTRA VOWEL SIGN AI
+A8C1 ; [.1EE4.0020.0002.A8C1] # SAURASHTRA VOWEL SIGN O
+A8C2 ; [.1EE5.0020.0002.A8C2] # SAURASHTRA VOWEL SIGN OO
+A8C3 ; [.1EE6.0020.0002.A8C3] # SAURASHTRA VOWEL SIGN AU
+A8C4 ; [.1EE7.0020.0002.A8C4] # SAURASHTRA SIGN VIRAMA
+11083 ; [.1EE8.0020.0002.11083] # KAITHI LETTER A
+11084 ; [.1EE9.0020.0002.11084] # KAITHI LETTER AA
+11085 ; [.1EEA.0020.0002.11085] # KAITHI LETTER I
+11086 ; [.1EEB.0020.0002.11086] # KAITHI LETTER II
+11087 ; [.1EEC.0020.0002.11087] # KAITHI LETTER U
+11088 ; [.1EED.0020.0002.11088] # KAITHI LETTER UU
+11089 ; [.1EEE.0020.0002.11089] # KAITHI LETTER E
+1108A ; [.1EEF.0020.0002.1108A] # KAITHI LETTER AI
+1108B ; [.1EF0.0020.0002.1108B] # KAITHI LETTER O
+1108C ; [.1EF1.0020.0002.1108C] # KAITHI LETTER AU
+1108D ; [.1EF2.0020.0002.1108D] # KAITHI LETTER KA
+1108E ; [.1EF3.0020.0002.1108E] # KAITHI LETTER KHA
+1108F ; [.1EF4.0020.0002.1108F] # KAITHI LETTER GA
+11090 ; [.1EF5.0020.0002.11090] # KAITHI LETTER GHA
+11091 ; [.1EF6.0020.0002.11091] # KAITHI LETTER NGA
+11092 ; [.1EF7.0020.0002.11092] # KAITHI LETTER CA
+11093 ; [.1EF8.0020.0002.11093] # KAITHI LETTER CHA
+11094 ; [.1EF9.0020.0002.11094] # KAITHI LETTER JA
+11095 ; [.1EFA.0020.0002.11095] # KAITHI LETTER JHA
+11096 ; [.1EFB.0020.0002.11096] # KAITHI LETTER NYA
+11097 ; [.1EFC.0020.0002.11097] # KAITHI LETTER TTA
+11098 ; [.1EFD.0020.0002.11098] # KAITHI LETTER TTHA
+11099 ; [.1EFE.0020.0002.11099] # KAITHI LETTER DDA
+1109A ; [.1EFE.0020.0002.11099][.0000.0112.0002.110BA] # KAITHI LETTER DDDHA; QQCM
+1109B ; [.1EFF.0020.0002.1109B] # KAITHI LETTER DDHA
+1109C ; [.1EFF.0020.0002.1109B][.0000.0112.0002.110BA] # KAITHI LETTER RHA; QQCM
+1109D ; [.1F00.0020.0002.1109D] # KAITHI LETTER NNA
+1109E ; [.1F01.0020.0002.1109E] # KAITHI LETTER TA
+1109F ; [.1F02.0020.0002.1109F] # KAITHI LETTER THA
+110A0 ; [.1F03.0020.0002.110A0] # KAITHI LETTER DA
+110A1 ; [.1F04.0020.0002.110A1] # KAITHI LETTER DHA
+110A2 ; [.1F05.0020.0002.110A2] # KAITHI LETTER NA
+110A3 ; [.1F06.0020.0002.110A3] # KAITHI LETTER PA
+110A4 ; [.1F07.0020.0002.110A4] # KAITHI LETTER PHA
+110A5 ; [.1F08.0020.0002.110A5] # KAITHI LETTER BA
+110AB ; [.1F08.0020.0002.110A5][.0000.0112.0002.110BA] # KAITHI LETTER VA; QQCM
+110A6 ; [.1F09.0020.0002.110A6] # KAITHI LETTER BHA
+110A7 ; [.1F0A.0020.0002.110A7] # KAITHI LETTER MA
+110A8 ; [.1F0B.0020.0002.110A8] # KAITHI LETTER YA
+110A9 ; [.1F0C.0020.0002.110A9] # KAITHI LETTER RA
+110AA ; [.1F0D.0020.0002.110AA] # KAITHI LETTER LA
+110AC ; [.1F0E.0020.0002.110AC] # KAITHI LETTER SHA
+110AD ; [.1F0F.0020.0002.110AD] # KAITHI LETTER SSA
+110AE ; [.1F10.0020.0002.110AE] # KAITHI LETTER SA
+110AF ; [.1F11.0020.0002.110AF] # KAITHI LETTER HA
+110B0 ; [.1F12.0020.0002.110B0] # KAITHI VOWEL SIGN AA
+110B1 ; [.1F13.0020.0002.110B1] # KAITHI VOWEL SIGN I
+110B2 ; [.1F14.0020.0002.110B2] # KAITHI VOWEL SIGN II
+110B3 ; [.1F15.0020.0002.110B3] # KAITHI VOWEL SIGN U
+110B4 ; [.1F16.0020.0002.110B4] # KAITHI VOWEL SIGN UU
+110B5 ; [.1F17.0020.0002.110B5] # KAITHI VOWEL SIGN E
+110B6 ; [.1F18.0020.0002.110B6] # KAITHI VOWEL SIGN AI
+110B7 ; [.1F19.0020.0002.110B7] # KAITHI VOWEL SIGN O
+110B8 ; [.1F1A.0020.0002.110B8] # KAITHI VOWEL SIGN AU
+110B9 ; [.1F1B.0020.0002.110B9] # KAITHI SIGN VIRAMA
+1B83 ; [.1F1C.0020.0002.1B83] # SUNDANESE LETTER A
+1B84 ; [.1F1D.0020.0002.1B84] # SUNDANESE LETTER I
+1B85 ; [.1F1E.0020.0002.1B85] # SUNDANESE LETTER U
+1B86 ; [.1F1F.0020.0002.1B86] # SUNDANESE LETTER AE
+1B87 ; [.1F20.0020.0002.1B87] # SUNDANESE LETTER O
+1B88 ; [.1F21.0020.0002.1B88] # SUNDANESE LETTER E
+1B89 ; [.1F22.0020.0002.1B89] # SUNDANESE LETTER EU
+1B8A ; [.1F23.0020.0002.1B8A] # SUNDANESE LETTER KA
+1BAE ; [.1F24.0020.0002.1BAE] # SUNDANESE LETTER KHA
+1B8B ; [.1F25.0020.0002.1B8B] # SUNDANESE LETTER QA
+1B8C ; [.1F26.0020.0002.1B8C] # SUNDANESE LETTER GA
+1B8D ; [.1F27.0020.0002.1B8D] # SUNDANESE LETTER NGA
+1B8E ; [.1F28.0020.0002.1B8E] # SUNDANESE LETTER CA
+1B8F ; [.1F29.0020.0002.1B8F] # SUNDANESE LETTER JA
+1B90 ; [.1F2A.0020.0002.1B90] # SUNDANESE LETTER ZA
+1B91 ; [.1F2B.0020.0002.1B91] # SUNDANESE LETTER NYA
+1B92 ; [.1F2C.0020.0002.1B92] # SUNDANESE LETTER TA
+1B93 ; [.1F2D.0020.0002.1B93] # SUNDANESE LETTER DA
+1B94 ; [.1F2E.0020.0002.1B94] # SUNDANESE LETTER NA
+1B95 ; [.1F2F.0020.0002.1B95] # SUNDANESE LETTER PA
+1B96 ; [.1F30.0020.0002.1B96] # SUNDANESE LETTER FA
+1B97 ; [.1F31.0020.0002.1B97] # SUNDANESE LETTER VA
+1B98 ; [.1F32.0020.0002.1B98] # SUNDANESE LETTER BA
+1B99 ; [.1F33.0020.0002.1B99] # SUNDANESE LETTER MA
+1B9A ; [.1F34.0020.0002.1B9A] # SUNDANESE LETTER YA
+1BA1 ; [.1F35.0020.0002.1BA1] # SUNDANESE CONSONANT SIGN PAMINGKAL
+1B9B ; [.1F36.0020.0002.1B9B] # SUNDANESE LETTER RA
+1BA2 ; [.1F37.0020.0002.1BA2] # SUNDANESE CONSONANT SIGN PANYAKRA
+1B9C ; [.1F38.0020.0002.1B9C] # SUNDANESE LETTER LA
+1BA3 ; [.1F39.0020.0002.1BA3] # SUNDANESE CONSONANT SIGN PANYIKU
+1B9D ; [.1F3A.0020.0002.1B9D] # SUNDANESE LETTER WA
+1B9E ; [.1F3B.0020.0002.1B9E] # SUNDANESE LETTER SA
+1B9F ; [.1F3C.0020.0002.1B9F] # SUNDANESE LETTER XA
+1BAF ; [.1F3D.0020.0002.1BAF] # SUNDANESE LETTER SYA
+1BA0 ; [.1F3E.0020.0002.1BA0] # SUNDANESE LETTER HA
+1BA4 ; [.1F3F.0020.0002.1BA4] # SUNDANESE VOWEL SIGN PANGHULU
+1BA5 ; [.1F40.0020.0002.1BA5] # SUNDANESE VOWEL SIGN PANYUKU
+1BA6 ; [.1F41.0020.0002.1BA6] # SUNDANESE VOWEL SIGN PANAELAENG
+1BA7 ; [.1F42.0020.0002.1BA7] # SUNDANESE VOWEL SIGN PANOLONG
+1BA8 ; [.1F43.0020.0002.1BA8] # SUNDANESE VOWEL SIGN PAMEPET
+1BA9 ; [.1F44.0020.0002.1BA9] # SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA ; [.1F45.0020.0002.1BAA] # SUNDANESE SIGN PAMAAEH
+10A00 ; [.1F46.0020.0002.10A00] # KHAROSHTHI LETTER A
+10A01 ; [.1F47.0020.0002.10A01] # KHAROSHTHI VOWEL SIGN I
+10A02 ; [.1F48.0020.0002.10A02] # KHAROSHTHI VOWEL SIGN U
+10A03 ; [.1F49.0020.0002.10A03] # KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05 ; [.1F4A.0020.0002.10A05] # KHAROSHTHI VOWEL SIGN E
+10A06 ; [.1F4B.0020.0002.10A06] # KHAROSHTHI VOWEL SIGN O
+10A0C ; [.1F4C.0020.0002.10A0C] # KHAROSHTHI VOWEL LENGTH MARK
+10A10 ; [.1F4D.0020.0002.10A10] # KHAROSHTHI LETTER KA
+10A11 ; [.1F4E.0020.0002.10A11] # KHAROSHTHI LETTER KHA
+10A12 ; [.1F4F.0020.0002.10A12] # KHAROSHTHI LETTER GA
+10A13 ; [.1F50.0020.0002.10A13] # KHAROSHTHI LETTER GHA
+10A15 ; [.1F51.0020.0002.10A15] # KHAROSHTHI LETTER CA
+10A16 ; [.1F52.0020.0002.10A16] # KHAROSHTHI LETTER CHA
+10A17 ; [.1F53.0020.0002.10A17] # KHAROSHTHI LETTER JA
+10A19 ; [.1F54.0020.0002.10A19] # KHAROSHTHI LETTER NYA
+10A1A ; [.1F55.0020.0002.10A1A] # KHAROSHTHI LETTER TTA
+10A1B ; [.1F56.0020.0002.10A1B] # KHAROSHTHI LETTER TTHA
+10A1C ; [.1F57.0020.0002.10A1C] # KHAROSHTHI LETTER DDA
+10A1D ; [.1F58.0020.0002.10A1D] # KHAROSHTHI LETTER DDHA
+10A1E ; [.1F59.0020.0002.10A1E] # KHAROSHTHI LETTER NNA
+10A1F ; [.1F5A.0020.0002.10A1F] # KHAROSHTHI LETTER TA
+10A20 ; [.1F5B.0020.0002.10A20] # KHAROSHTHI LETTER THA
+10A21 ; [.1F5C.0020.0002.10A21] # KHAROSHTHI LETTER DA
+10A22 ; [.1F5D.0020.0002.10A22] # KHAROSHTHI LETTER DHA
+10A23 ; [.1F5E.0020.0002.10A23] # KHAROSHTHI LETTER NA
+10A24 ; [.1F5F.0020.0002.10A24] # KHAROSHTHI LETTER PA
+10A25 ; [.1F60.0020.0002.10A25] # KHAROSHTHI LETTER PHA
+10A26 ; [.1F61.0020.0002.10A26] # KHAROSHTHI LETTER BA
+10A27 ; [.1F62.0020.0002.10A27] # KHAROSHTHI LETTER BHA
+10A28 ; [.1F63.0020.0002.10A28] # KHAROSHTHI LETTER MA
+10A29 ; [.1F64.0020.0002.10A29] # KHAROSHTHI LETTER YA
+10A2A ; [.1F65.0020.0002.10A2A] # KHAROSHTHI LETTER RA
+10A2B ; [.1F66.0020.0002.10A2B] # KHAROSHTHI LETTER LA
+10A2C ; [.1F67.0020.0002.10A2C] # KHAROSHTHI LETTER VA
+10A2D ; [.1F68.0020.0002.10A2D] # KHAROSHTHI LETTER SHA
+10A2E ; [.1F69.0020.0002.10A2E] # KHAROSHTHI LETTER SSA
+10A2F ; [.1F6A.0020.0002.10A2F] # KHAROSHTHI LETTER SA
+10A30 ; [.1F6B.0020.0002.10A30] # KHAROSHTHI LETTER ZA
+10A31 ; [.1F6C.0020.0002.10A31] # KHAROSHTHI LETTER HA
+10A32 ; [.1F6D.0020.0002.10A32] # KHAROSHTHI LETTER KKA
+10A33 ; [.1F6E.0020.0002.10A33] # KHAROSHTHI LETTER TTTHA
+10A3F ; [.1F6F.0020.0002.10A3F] # KHAROSHTHI VIRAMA
+0E01 ; [.1F70.0020.0002.0E01] # THAI CHARACTER KO KAI
+0E40 0E01 ; [.1F70.0020.0002.0E01][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KO KAI>
+0E41 0E01 ; [.1F70.0020.0002.0E01][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KO KAI>
+0E42 0E01 ; [.1F70.0020.0002.0E01][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KO KAI>
+0E43 0E01 ; [.1F70.0020.0002.0E01][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KO KAI>
+0E44 0E01 ; [.1F70.0020.0002.0E01][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KO KAI>
+0E02 ; [.1F71.0020.0002.0E02] # THAI CHARACTER KHO KHAI
+0E40 0E02 ; [.1F71.0020.0002.0E02][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHAI>
+0E41 0E02 ; [.1F71.0020.0002.0E02][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHAI>
+0E42 0E02 ; [.1F71.0020.0002.0E02][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHAI>
+0E43 0E02 ; [.1F71.0020.0002.0E02][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHAI>
+0E44 0E02 ; [.1F71.0020.0002.0E02][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHAI>
+0E03 ; [.1F72.0020.0002.0E03] # THAI CHARACTER KHO KHUAT
+0E40 0E03 ; [.1F72.0020.0002.0E03][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHUAT>
+0E41 0E03 ; [.1F72.0020.0002.0E03][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHUAT>
+0E42 0E03 ; [.1F72.0020.0002.0E03][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHUAT>
+0E43 0E03 ; [.1F72.0020.0002.0E03][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHUAT>
+0E44 0E03 ; [.1F72.0020.0002.0E03][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHUAT>
+0E04 ; [.1F73.0020.0002.0E04] # THAI CHARACTER KHO KHWAI
+0E40 0E04 ; [.1F73.0020.0002.0E04][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHWAI>
+0E41 0E04 ; [.1F73.0020.0002.0E04][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHWAI>
+0E42 0E04 ; [.1F73.0020.0002.0E04][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHWAI>
+0E43 0E04 ; [.1F73.0020.0002.0E04][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHWAI>
+0E44 0E04 ; [.1F73.0020.0002.0E04][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHWAI>
+0E05 ; [.1F74.0020.0002.0E05] # THAI CHARACTER KHO KHON
+0E40 0E05 ; [.1F74.0020.0002.0E05][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHON>
+0E41 0E05 ; [.1F74.0020.0002.0E05][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHON>
+0E42 0E05 ; [.1F74.0020.0002.0E05][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHON>
+0E43 0E05 ; [.1F74.0020.0002.0E05][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHON>
+0E44 0E05 ; [.1F74.0020.0002.0E05][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHON>
+0E06 ; [.1F75.0020.0002.0E06] # THAI CHARACTER KHO RAKHANG
+0E40 0E06 ; [.1F75.0020.0002.0E06][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO RAKHANG>
+0E41 0E06 ; [.1F75.0020.0002.0E06][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO RAKHANG>
+0E42 0E06 ; [.1F75.0020.0002.0E06][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO RAKHANG>
+0E43 0E06 ; [.1F75.0020.0002.0E06][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO RAKHANG>
+0E44 0E06 ; [.1F75.0020.0002.0E06][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO RAKHANG>
+0E07 ; [.1F76.0020.0002.0E07] # THAI CHARACTER NGO NGU
+0E40 0E07 ; [.1F76.0020.0002.0E07][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NGO NGU>
+0E41 0E07 ; [.1F76.0020.0002.0E07][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NGO NGU>
+0E42 0E07 ; [.1F76.0020.0002.0E07][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NGO NGU>
+0E43 0E07 ; [.1F76.0020.0002.0E07][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NGO NGU>
+0E44 0E07 ; [.1F76.0020.0002.0E07][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NGO NGU>
+0E08 ; [.1F77.0020.0002.0E08] # THAI CHARACTER CHO CHAN
+0E40 0E08 ; [.1F77.0020.0002.0E08][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHAN>
+0E41 0E08 ; [.1F77.0020.0002.0E08][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHAN>
+0E42 0E08 ; [.1F77.0020.0002.0E08][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHAN>
+0E43 0E08 ; [.1F77.0020.0002.0E08][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHAN>
+0E44 0E08 ; [.1F77.0020.0002.0E08][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHAN>
+0E09 ; [.1F78.0020.0002.0E09] # THAI CHARACTER CHO CHING
+0E40 0E09 ; [.1F78.0020.0002.0E09][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHING>
+0E41 0E09 ; [.1F78.0020.0002.0E09][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHING>
+0E42 0E09 ; [.1F78.0020.0002.0E09][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHING>
+0E43 0E09 ; [.1F78.0020.0002.0E09][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHING>
+0E44 0E09 ; [.1F78.0020.0002.0E09][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHING>
+0E0A ; [.1F79.0020.0002.0E0A] # THAI CHARACTER CHO CHANG
+0E40 0E0A ; [.1F79.0020.0002.0E0A][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHANG>
+0E41 0E0A ; [.1F79.0020.0002.0E0A][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHANG>
+0E42 0E0A ; [.1F79.0020.0002.0E0A][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHANG>
+0E43 0E0A ; [.1F79.0020.0002.0E0A][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHANG>
+0E44 0E0A ; [.1F79.0020.0002.0E0A][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHANG>
+0E0B ; [.1F7A.0020.0002.0E0B] # THAI CHARACTER SO SO
+0E40 0E0B ; [.1F7A.0020.0002.0E0B][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SO>
+0E41 0E0B ; [.1F7A.0020.0002.0E0B][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SO>
+0E42 0E0B ; [.1F7A.0020.0002.0E0B][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SO>
+0E43 0E0B ; [.1F7A.0020.0002.0E0B][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SO>
+0E44 0E0B ; [.1F7A.0020.0002.0E0B][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SO>
+0E0C ; [.1F7B.0020.0002.0E0C] # THAI CHARACTER CHO CHOE
+0E40 0E0C ; [.1F7B.0020.0002.0E0C][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHOE>
+0E41 0E0C ; [.1F7B.0020.0002.0E0C][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHOE>
+0E42 0E0C ; [.1F7B.0020.0002.0E0C][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHOE>
+0E43 0E0C ; [.1F7B.0020.0002.0E0C][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHOE>
+0E44 0E0C ; [.1F7B.0020.0002.0E0C][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHOE>
+0E0D ; [.1F7C.0020.0002.0E0D] # THAI CHARACTER YO YING
+0E40 0E0D ; [.1F7C.0020.0002.0E0D][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER YO YING>
+0E41 0E0D ; [.1F7C.0020.0002.0E0D][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YING>
+0E42 0E0D ; [.1F7C.0020.0002.0E0D][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER YO YING>
+0E43 0E0D ; [.1F7C.0020.0002.0E0D][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YING>
+0E44 0E0D ; [.1F7C.0020.0002.0E0D][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YING>
+0E0E ; [.1F7D.0020.0002.0E0E] # THAI CHARACTER DO CHADA
+0E40 0E0E ; [.1F7D.0020.0002.0E0E][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER DO CHADA>
+0E41 0E0E ; [.1F7D.0020.0002.0E0E][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER DO CHADA>
+0E42 0E0E ; [.1F7D.0020.0002.0E0E][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER DO CHADA>
+0E43 0E0E ; [.1F7D.0020.0002.0E0E][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO CHADA>
+0E44 0E0E ; [.1F7D.0020.0002.0E0E][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO CHADA>
+0E0F ; [.1F7E.0020.0002.0E0F] # THAI CHARACTER TO PATAK
+0E40 0E0F ; [.1F7E.0020.0002.0E0F][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER TO PATAK>
+0E41 0E0F ; [.1F7E.0020.0002.0E0F][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER TO PATAK>
+0E42 0E0F ; [.1F7E.0020.0002.0E0F][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER TO PATAK>
+0E43 0E0F ; [.1F7E.0020.0002.0E0F][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO PATAK>
+0E44 0E0F ; [.1F7E.0020.0002.0E0F][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO PATAK>
+0E10 ; [.1F7F.0020.0002.0E10] # THAI CHARACTER THO THAN
+0E40 0E10 ; [.1F7F.0020.0002.0E10][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAN>
+0E41 0E10 ; [.1F7F.0020.0002.0E10][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAN>
+0E42 0E10 ; [.1F7F.0020.0002.0E10][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAN>
+0E43 0E10 ; [.1F7F.0020.0002.0E10][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAN>
+0E44 0E10 ; [.1F7F.0020.0002.0E10][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAN>
+0E11 ; [.1F80.0020.0002.0E11] # THAI CHARACTER THO NANGMONTHO
+0E40 0E11 ; [.1F80.0020.0002.0E11][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO NANGMONTHO>
+0E41 0E11 ; [.1F80.0020.0002.0E11][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO NANGMONTHO>
+0E42 0E11 ; [.1F80.0020.0002.0E11][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO NANGMONTHO>
+0E43 0E11 ; [.1F80.0020.0002.0E11][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO NANGMONTHO>
+0E44 0E11 ; [.1F80.0020.0002.0E11][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO NANGMONTHO>
+0E12 ; [.1F81.0020.0002.0E12] # THAI CHARACTER THO PHUTHAO
+0E40 0E12 ; [.1F81.0020.0002.0E12][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO PHUTHAO>
+0E41 0E12 ; [.1F81.0020.0002.0E12][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO PHUTHAO>
+0E42 0E12 ; [.1F81.0020.0002.0E12][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO PHUTHAO>
+0E43 0E12 ; [.1F81.0020.0002.0E12][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO PHUTHAO>
+0E44 0E12 ; [.1F81.0020.0002.0E12][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO PHUTHAO>
+0E13 ; [.1F82.0020.0002.0E13] # THAI CHARACTER NO NEN
+0E40 0E13 ; [.1F82.0020.0002.0E13][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NO NEN>
+0E41 0E13 ; [.1F82.0020.0002.0E13][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NEN>
+0E42 0E13 ; [.1F82.0020.0002.0E13][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NO NEN>
+0E43 0E13 ; [.1F82.0020.0002.0E13][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NEN>
+0E44 0E13 ; [.1F82.0020.0002.0E13][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NEN>
+0E14 ; [.1F83.0020.0002.0E14] # THAI CHARACTER DO DEK
+0E40 0E14 ; [.1F83.0020.0002.0E14][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER DO DEK>
+0E41 0E14 ; [.1F83.0020.0002.0E14][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER DO DEK>
+0E42 0E14 ; [.1F83.0020.0002.0E14][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER DO DEK>
+0E43 0E14 ; [.1F83.0020.0002.0E14][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO DEK>
+0E44 0E14 ; [.1F83.0020.0002.0E14][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO DEK>
+0E15 ; [.1F84.0020.0002.0E15] # THAI CHARACTER TO TAO
+0E40 0E15 ; [.1F84.0020.0002.0E15][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER TO TAO>
+0E41 0E15 ; [.1F84.0020.0002.0E15][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER TO TAO>
+0E42 0E15 ; [.1F84.0020.0002.0E15][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER TO TAO>
+0E43 0E15 ; [.1F84.0020.0002.0E15][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO TAO>
+0E44 0E15 ; [.1F84.0020.0002.0E15][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO TAO>
+0E16 ; [.1F85.0020.0002.0E16] # THAI CHARACTER THO THUNG
+0E40 0E16 ; [.1F85.0020.0002.0E16][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THUNG>
+0E41 0E16 ; [.1F85.0020.0002.0E16][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THUNG>
+0E42 0E16 ; [.1F85.0020.0002.0E16][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THUNG>
+0E43 0E16 ; [.1F85.0020.0002.0E16][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THUNG>
+0E44 0E16 ; [.1F85.0020.0002.0E16][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THUNG>
+0E17 ; [.1F86.0020.0002.0E17] # THAI CHARACTER THO THAHAN
+0E40 0E17 ; [.1F86.0020.0002.0E17][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAHAN>
+0E41 0E17 ; [.1F86.0020.0002.0E17][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAHAN>
+0E42 0E17 ; [.1F86.0020.0002.0E17][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAHAN>
+0E43 0E17 ; [.1F86.0020.0002.0E17][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAHAN>
+0E44 0E17 ; [.1F86.0020.0002.0E17][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAHAN>
+0E18 ; [.1F87.0020.0002.0E18] # THAI CHARACTER THO THONG
+0E40 0E18 ; [.1F87.0020.0002.0E18][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THONG>
+0E41 0E18 ; [.1F87.0020.0002.0E18][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THONG>
+0E42 0E18 ; [.1F87.0020.0002.0E18][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THONG>
+0E43 0E18 ; [.1F87.0020.0002.0E18][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THONG>
+0E44 0E18 ; [.1F87.0020.0002.0E18][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THONG>
+0E19 ; [.1F88.0020.0002.0E19] # THAI CHARACTER NO NU
+0E40 0E19 ; [.1F88.0020.0002.0E19][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NO NU>
+0E41 0E19 ; [.1F88.0020.0002.0E19][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NU>
+0E42 0E19 ; [.1F88.0020.0002.0E19][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NO NU>
+0E43 0E19 ; [.1F88.0020.0002.0E19][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NU>
+0E44 0E19 ; [.1F88.0020.0002.0E19][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NU>
+0E1A ; [.1F89.0020.0002.0E1A] # THAI CHARACTER BO BAIMAI
+0E40 0E1A ; [.1F89.0020.0002.0E1A][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER BO BAIMAI>
+0E41 0E1A ; [.1F89.0020.0002.0E1A][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER BO BAIMAI>
+0E42 0E1A ; [.1F89.0020.0002.0E1A][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER BO BAIMAI>
+0E43 0E1A ; [.1F89.0020.0002.0E1A][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER BO BAIMAI>
+0E44 0E1A ; [.1F89.0020.0002.0E1A][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER BO BAIMAI>
+0E1B ; [.1F8A.0020.0002.0E1B] # THAI CHARACTER PO PLA
+0E40 0E1B ; [.1F8A.0020.0002.0E1B][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PO PLA>
+0E41 0E1B ; [.1F8A.0020.0002.0E1B][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PO PLA>
+0E42 0E1B ; [.1F8A.0020.0002.0E1B][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PO PLA>
+0E43 0E1B ; [.1F8A.0020.0002.0E1B][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PO PLA>
+0E44 0E1B ; [.1F8A.0020.0002.0E1B][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PO PLA>
+0E1C ; [.1F8B.0020.0002.0E1C] # THAI CHARACTER PHO PHUNG
+0E40 0E1C ; [.1F8B.0020.0002.0E1C][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHUNG>
+0E41 0E1C ; [.1F8B.0020.0002.0E1C][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHUNG>
+0E42 0E1C ; [.1F8B.0020.0002.0E1C][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHUNG>
+0E43 0E1C ; [.1F8B.0020.0002.0E1C][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHUNG>
+0E44 0E1C ; [.1F8B.0020.0002.0E1C][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHUNG>
+0E1D ; [.1F8C.0020.0002.0E1D] # THAI CHARACTER FO FA
+0E40 0E1D ; [.1F8C.0020.0002.0E1D][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER FO FA>
+0E41 0E1D ; [.1F8C.0020.0002.0E1D][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FA>
+0E42 0E1D ; [.1F8C.0020.0002.0E1D][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER FO FA>
+0E43 0E1D ; [.1F8C.0020.0002.0E1D][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FA>
+0E44 0E1D ; [.1F8C.0020.0002.0E1D][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FA>
+0E1E ; [.1F8D.0020.0002.0E1E] # THAI CHARACTER PHO PHAN
+0E40 0E1E ; [.1F8D.0020.0002.0E1E][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHAN>
+0E41 0E1E ; [.1F8D.0020.0002.0E1E][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHAN>
+0E42 0E1E ; [.1F8D.0020.0002.0E1E][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHAN>
+0E43 0E1E ; [.1F8D.0020.0002.0E1E][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHAN>
+0E44 0E1E ; [.1F8D.0020.0002.0E1E][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHAN>
+0E1F ; [.1F8E.0020.0002.0E1F] # THAI CHARACTER FO FAN
+0E40 0E1F ; [.1F8E.0020.0002.0E1F][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER FO FAN>
+0E41 0E1F ; [.1F8E.0020.0002.0E1F][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FAN>
+0E42 0E1F ; [.1F8E.0020.0002.0E1F][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER FO FAN>
+0E43 0E1F ; [.1F8E.0020.0002.0E1F][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FAN>
+0E44 0E1F ; [.1F8E.0020.0002.0E1F][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FAN>
+0E20 ; [.1F8F.0020.0002.0E20] # THAI CHARACTER PHO SAMPHAO
+0E40 0E20 ; [.1F8F.0020.0002.0E20][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO SAMPHAO>
+0E41 0E20 ; [.1F8F.0020.0002.0E20][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO SAMPHAO>
+0E42 0E20 ; [.1F8F.0020.0002.0E20][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO SAMPHAO>
+0E43 0E20 ; [.1F8F.0020.0002.0E20][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO SAMPHAO>
+0E44 0E20 ; [.1F8F.0020.0002.0E20][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO SAMPHAO>
+0E21 ; [.1F90.0020.0002.0E21] # THAI CHARACTER MO MA
+0E40 0E21 ; [.1F90.0020.0002.0E21][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER MO MA>
+0E41 0E21 ; [.1F90.0020.0002.0E21][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER MO MA>
+0E42 0E21 ; [.1F90.0020.0002.0E21][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER MO MA>
+0E43 0E21 ; [.1F90.0020.0002.0E21][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER MO MA>
+0E44 0E21 ; [.1F90.0020.0002.0E21][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER MO MA>
+0E22 ; [.1F91.0020.0002.0E22] # THAI CHARACTER YO YAK
+0E40 0E22 ; [.1F91.0020.0002.0E22][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER YO YAK>
+0E41 0E22 ; [.1F91.0020.0002.0E22][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YAK>
+0E42 0E22 ; [.1F91.0020.0002.0E22][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER YO YAK>
+0E43 0E22 ; [.1F91.0020.0002.0E22][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YAK>
+0E44 0E22 ; [.1F91.0020.0002.0E22][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YAK>
+0E23 ; [.1F92.0020.0002.0E23] # THAI CHARACTER RO RUA
+0E40 0E23 ; [.1F92.0020.0002.0E23][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER RO RUA>
+0E41 0E23 ; [.1F92.0020.0002.0E23][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER RO RUA>
+0E42 0E23 ; [.1F92.0020.0002.0E23][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER RO RUA>
+0E43 0E23 ; [.1F92.0020.0002.0E23][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RO RUA>
+0E44 0E23 ; [.1F92.0020.0002.0E23][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RO RUA>
+0E24 ; [.1F93.0020.0002.0E24] # THAI CHARACTER RU
+0E40 0E24 ; [.1F93.0020.0002.0E24][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER RU>
+0E41 0E24 ; [.1F93.0020.0002.0E24][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER RU>
+0E42 0E24 ; [.1F93.0020.0002.0E24][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER RU>
+0E43 0E24 ; [.1F93.0020.0002.0E24][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RU>
+0E44 0E24 ; [.1F93.0020.0002.0E24][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RU>
+0E25 ; [.1F94.0020.0002.0E25] # THAI CHARACTER LO LING
+0E40 0E25 ; [.1F94.0020.0002.0E25][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LO LING>
+0E41 0E25 ; [.1F94.0020.0002.0E25][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LO LING>
+0E42 0E25 ; [.1F94.0020.0002.0E25][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LO LING>
+0E43 0E25 ; [.1F94.0020.0002.0E25][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO LING>
+0E44 0E25 ; [.1F94.0020.0002.0E25][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO LING>
+0E26 ; [.1F95.0020.0002.0E26] # THAI CHARACTER LU
+0E40 0E26 ; [.1F95.0020.0002.0E26][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LU>
+0E41 0E26 ; [.1F95.0020.0002.0E26][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LU>
+0E42 0E26 ; [.1F95.0020.0002.0E26][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LU>
+0E43 0E26 ; [.1F95.0020.0002.0E26][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LU>
+0E44 0E26 ; [.1F95.0020.0002.0E26][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LU>
+0E27 ; [.1F96.0020.0002.0E27] # THAI CHARACTER WO WAEN
+0E40 0E27 ; [.1F96.0020.0002.0E27][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER WO WAEN>
+0E41 0E27 ; [.1F96.0020.0002.0E27][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER WO WAEN>
+0E42 0E27 ; [.1F96.0020.0002.0E27][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER WO WAEN>
+0E43 0E27 ; [.1F96.0020.0002.0E27][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER WO WAEN>
+0E44 0E27 ; [.1F96.0020.0002.0E27][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER WO WAEN>
+0E28 ; [.1F97.0020.0002.0E28] # THAI CHARACTER SO SALA
+0E40 0E28 ; [.1F97.0020.0002.0E28][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SALA>
+0E41 0E28 ; [.1F97.0020.0002.0E28][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SALA>
+0E42 0E28 ; [.1F97.0020.0002.0E28][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SALA>
+0E43 0E28 ; [.1F97.0020.0002.0E28][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SALA>
+0E44 0E28 ; [.1F97.0020.0002.0E28][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SALA>
+0E29 ; [.1F98.0020.0002.0E29] # THAI CHARACTER SO RUSI
+0E40 0E29 ; [.1F98.0020.0002.0E29][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO RUSI>
+0E41 0E29 ; [.1F98.0020.0002.0E29][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO RUSI>
+0E42 0E29 ; [.1F98.0020.0002.0E29][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO RUSI>
+0E43 0E29 ; [.1F98.0020.0002.0E29][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO RUSI>
+0E44 0E29 ; [.1F98.0020.0002.0E29][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO RUSI>
+0E2A ; [.1F99.0020.0002.0E2A] # THAI CHARACTER SO SUA
+0E40 0E2A ; [.1F99.0020.0002.0E2A][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SUA>
+0E41 0E2A ; [.1F99.0020.0002.0E2A][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SUA>
+0E42 0E2A ; [.1F99.0020.0002.0E2A][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SUA>
+0E43 0E2A ; [.1F99.0020.0002.0E2A][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SUA>
+0E44 0E2A ; [.1F99.0020.0002.0E2A][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SUA>
+0E2B ; [.1F9A.0020.0002.0E2B] # THAI CHARACTER HO HIP
+0E40 0E2B ; [.1F9A.0020.0002.0E2B][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER HO HIP>
+0E41 0E2B ; [.1F9A.0020.0002.0E2B][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER HO HIP>
+0E42 0E2B ; [.1F9A.0020.0002.0E2B][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER HO HIP>
+0E43 0E2B ; [.1F9A.0020.0002.0E2B][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO HIP>
+0E44 0E2B ; [.1F9A.0020.0002.0E2B][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO HIP>
+0E2C ; [.1F9B.0020.0002.0E2C] # THAI CHARACTER LO CHULA
+0E40 0E2C ; [.1F9B.0020.0002.0E2C][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LO CHULA>
+0E41 0E2C ; [.1F9B.0020.0002.0E2C][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LO CHULA>
+0E42 0E2C ; [.1F9B.0020.0002.0E2C][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LO CHULA>
+0E43 0E2C ; [.1F9B.0020.0002.0E2C][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO CHULA>
+0E44 0E2C ; [.1F9B.0020.0002.0E2C][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO CHULA>
+0E2D ; [.1F9C.0020.0002.0E2D] # THAI CHARACTER O ANG
+0E40 0E2D ; [.1F9C.0020.0002.0E2D][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER O ANG>
+0E41 0E2D ; [.1F9C.0020.0002.0E2D][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER O ANG>
+0E42 0E2D ; [.1F9C.0020.0002.0E2D][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER O ANG>
+0E43 0E2D ; [.1F9C.0020.0002.0E2D][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER O ANG>
+0E44 0E2D ; [.1F9C.0020.0002.0E2D][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER O ANG>
+0E2E ; [.1F9D.0020.0002.0E2E] # THAI CHARACTER HO NOKHUK
+0E40 0E2E ; [.1F9D.0020.0002.0E2E][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER HO NOKHUK>
+0E41 0E2E ; [.1F9D.0020.0002.0E2E][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER HO NOKHUK>
+0E42 0E2E ; [.1F9D.0020.0002.0E2E][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER HO NOKHUK>
+0E43 0E2E ; [.1F9D.0020.0002.0E2E][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO NOKHUK>
+0E44 0E2E ; [.1F9D.0020.0002.0E2E][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO NOKHUK>
+0E2F ; [.1F9E.0020.0002.0E2F] # THAI CHARACTER PAIYANNOI
+0E30 ; [.1F9F.0020.0002.0E30] # THAI CHARACTER SARA A
+0E31 ; [.1FA0.0020.0002.0E31] # THAI CHARACTER MAI HAN-AKAT
+0E32 ; [.1FA1.0020.0002.0E32] # THAI CHARACTER SARA AA
+0E33 ; [.1FA2.0020.0002.0E33] # THAI CHARACTER SARA AM
+0E4D 0E32 ; [.1FA2.0020.0002.0E33] # THAI CHARACTER SARA AM
+0E34 ; [.1FA3.0020.0002.0E34] # THAI CHARACTER SARA I
+0E35 ; [.1FA4.0020.0002.0E35] # THAI CHARACTER SARA II
+0E36 ; [.1FA5.0020.0002.0E36] # THAI CHARACTER SARA UE
+0E37 ; [.1FA6.0020.0002.0E37] # THAI CHARACTER SARA UEE
+0E38 ; [.1FA7.0020.0002.0E38] # THAI CHARACTER SARA U
+0E39 ; [.1FA8.0020.0002.0E39] # THAI CHARACTER SARA UU
+0E3A ; [.1FA9.0020.0002.0E3A] # THAI CHARACTER PHINTHU
+0E40 ; [.1FAA.0020.0002.0E40] # THAI CHARACTER SARA E
+0E41 ; [.1FAB.0020.0002.0E41] # THAI CHARACTER SARA AE
+0E42 ; [.1FAC.0020.0002.0E42] # THAI CHARACTER SARA O
+0E43 ; [.1FAD.0020.0002.0E43] # THAI CHARACTER SARA AI MAIMUAN
+0E44 ; [.1FAE.0020.0002.0E44] # THAI CHARACTER SARA AI MAIMALAI
+0E45 ; [.1FAF.0020.0002.0E45] # THAI CHARACTER LAKKHANGYAO
+0E81 ; [.1FB0.0020.0002.0E81] # LAO LETTER KO
+0EC0 0E81 ; [.1FB0.0020.0002.0E81][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KO>
+0EC1 0E81 ; [.1FB0.0020.0002.0E81][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KO>
+0EC2 0E81 ; [.1FB0.0020.0002.0E81][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KO>
+0EC3 0E81 ; [.1FB0.0020.0002.0E81][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KO>
+0EC4 0E81 ; [.1FB0.0020.0002.0E81][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KO>
+0E82 ; [.1FB1.0020.0002.0E82] # LAO LETTER KHO SUNG
+0EC0 0E82 ; [.1FB1.0020.0002.0E82][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KHO SUNG>
+0EC1 0E82 ; [.1FB1.0020.0002.0E82][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KHO SUNG>
+0EC2 0E82 ; [.1FB1.0020.0002.0E82][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KHO SUNG>
+0EC3 0E82 ; [.1FB1.0020.0002.0E82][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KHO SUNG>
+0EC4 0E82 ; [.1FB1.0020.0002.0E82][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KHO SUNG>
+0E84 ; [.1FB2.0020.0002.0E84] # LAO LETTER KHO TAM
+0EC0 0E84 ; [.1FB2.0020.0002.0E84][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KHO TAM>
+0EC1 0E84 ; [.1FB2.0020.0002.0E84][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KHO TAM>
+0EC2 0E84 ; [.1FB2.0020.0002.0E84][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KHO TAM>
+0EC3 0E84 ; [.1FB2.0020.0002.0E84][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KHO TAM>
+0EC4 0E84 ; [.1FB2.0020.0002.0E84][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KHO TAM>
+0E87 ; [.1FB3.0020.0002.0E87] # LAO LETTER NGO
+0EC0 0E87 ; [.1FB3.0020.0002.0E87][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NGO>
+0EC1 0E87 ; [.1FB3.0020.0002.0E87][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NGO>
+0EC2 0E87 ; [.1FB3.0020.0002.0E87][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NGO>
+0EC3 0E87 ; [.1FB3.0020.0002.0E87][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NGO>
+0EC4 0E87 ; [.1FB3.0020.0002.0E87][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NGO>
+0E88 ; [.1FB4.0020.0002.0E88] # LAO LETTER CO
+0EC0 0E88 ; [.1FB4.0020.0002.0E88][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER CO>
+0EC1 0E88 ; [.1FB4.0020.0002.0E88][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER CO>
+0EC2 0E88 ; [.1FB4.0020.0002.0E88][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER CO>
+0EC3 0E88 ; [.1FB4.0020.0002.0E88][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER CO>
+0EC4 0E88 ; [.1FB4.0020.0002.0E88][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER CO>
+0EAA ; [.1FB5.0020.0002.0EAA] # LAO LETTER SO SUNG
+0EC0 0EAA ; [.1FB5.0020.0002.0EAA][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER SO SUNG>
+0EC1 0EAA ; [.1FB5.0020.0002.0EAA][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER SO SUNG>
+0EC2 0EAA ; [.1FB5.0020.0002.0EAA][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER SO SUNG>
+0EC3 0EAA ; [.1FB5.0020.0002.0EAA][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER SO SUNG>
+0EC4 0EAA ; [.1FB5.0020.0002.0EAA][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER SO SUNG>
+0E8A ; [.1FB6.0020.0002.0E8A] # LAO LETTER SO TAM
+0EC0 0E8A ; [.1FB6.0020.0002.0E8A][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER SO TAM>
+0EC1 0E8A ; [.1FB6.0020.0002.0E8A][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER SO TAM>
+0EC2 0E8A ; [.1FB6.0020.0002.0E8A][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER SO TAM>
+0EC3 0E8A ; [.1FB6.0020.0002.0E8A][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER SO TAM>
+0EC4 0E8A ; [.1FB6.0020.0002.0E8A][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER SO TAM>
+0E8D ; [.1FB7.0020.0002.0E8D] # LAO LETTER NYO
+0EC0 0E8D ; [.1FB7.0020.0002.0E8D][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NYO>
+0EC1 0E8D ; [.1FB7.0020.0002.0E8D][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NYO>
+0EC2 0E8D ; [.1FB7.0020.0002.0E8D][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NYO>
+0EC3 0E8D ; [.1FB7.0020.0002.0E8D][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NYO>
+0EC4 0E8D ; [.1FB7.0020.0002.0E8D][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NYO>
+0E94 ; [.1FB8.0020.0002.0E94] # LAO LETTER DO
+0EC0 0E94 ; [.1FB8.0020.0002.0E94][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER DO>
+0EC1 0E94 ; [.1FB8.0020.0002.0E94][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER DO>
+0EC2 0E94 ; [.1FB8.0020.0002.0E94][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER DO>
+0EC3 0E94 ; [.1FB8.0020.0002.0E94][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER DO>
+0EC4 0E94 ; [.1FB8.0020.0002.0E94][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER DO>
+0E95 ; [.1FB9.0020.0002.0E95] # LAO LETTER TO
+0EC0 0E95 ; [.1FB9.0020.0002.0E95][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER TO>
+0EC1 0E95 ; [.1FB9.0020.0002.0E95][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER TO>
+0EC2 0E95 ; [.1FB9.0020.0002.0E95][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER TO>
+0EC3 0E95 ; [.1FB9.0020.0002.0E95][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER TO>
+0EC4 0E95 ; [.1FB9.0020.0002.0E95][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER TO>
+0E96 ; [.1FBA.0020.0002.0E96] # LAO LETTER THO SUNG
+0EC0 0E96 ; [.1FBA.0020.0002.0E96][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER THO SUNG>
+0EC1 0E96 ; [.1FBA.0020.0002.0E96][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER THO SUNG>
+0EC2 0E96 ; [.1FBA.0020.0002.0E96][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER THO SUNG>
+0EC3 0E96 ; [.1FBA.0020.0002.0E96][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER THO SUNG>
+0EC4 0E96 ; [.1FBA.0020.0002.0E96][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER THO SUNG>
+0E97 ; [.1FBB.0020.0002.0E97] # LAO LETTER THO TAM
+0EC0 0E97 ; [.1FBB.0020.0002.0E97][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER THO TAM>
+0EC1 0E97 ; [.1FBB.0020.0002.0E97][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER THO TAM>
+0EC2 0E97 ; [.1FBB.0020.0002.0E97][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER THO TAM>
+0EC3 0E97 ; [.1FBB.0020.0002.0E97][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER THO TAM>
+0EC4 0E97 ; [.1FBB.0020.0002.0E97][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER THO TAM>
+0E99 ; [.1FBC.0020.0002.0E99] # LAO LETTER NO
+0EC0 0E99 ; [.1FBC.0020.0002.0E99][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NO>
+0EC1 0E99 ; [.1FBC.0020.0002.0E99][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NO>
+0EC2 0E99 ; [.1FBC.0020.0002.0E99][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NO>
+0EC3 0E99 ; [.1FBC.0020.0002.0E99][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NO>
+0EC4 0E99 ; [.1FBC.0020.0002.0E99][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NO>
+0E9A ; [.1FBD.0020.0002.0E9A] # LAO LETTER BO
+0EC0 0E9A ; [.1FBD.0020.0002.0E9A][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER BO>
+0EC1 0E9A ; [.1FBD.0020.0002.0E9A][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER BO>
+0EC2 0E9A ; [.1FBD.0020.0002.0E9A][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER BO>
+0EC3 0E9A ; [.1FBD.0020.0002.0E9A][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER BO>
+0EC4 0E9A ; [.1FBD.0020.0002.0E9A][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER BO>
+0E9B ; [.1FBE.0020.0002.0E9B] # LAO LETTER PO
+0EC0 0E9B ; [.1FBE.0020.0002.0E9B][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PO>
+0EC1 0E9B ; [.1FBE.0020.0002.0E9B][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PO>
+0EC2 0E9B ; [.1FBE.0020.0002.0E9B][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PO>
+0EC3 0E9B ; [.1FBE.0020.0002.0E9B][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PO>
+0EC4 0E9B ; [.1FBE.0020.0002.0E9B][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PO>
+0E9C ; [.1FBF.0020.0002.0E9C] # LAO LETTER PHO SUNG
+0EC0 0E9C ; [.1FBF.0020.0002.0E9C][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PHO SUNG>
+0EC1 0E9C ; [.1FBF.0020.0002.0E9C][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PHO SUNG>
+0EC2 0E9C ; [.1FBF.0020.0002.0E9C][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PHO SUNG>
+0EC3 0E9C ; [.1FBF.0020.0002.0E9C][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PHO SUNG>
+0EC4 0E9C ; [.1FBF.0020.0002.0E9C][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PHO SUNG>
+0E9D ; [.1FC0.0020.0002.0E9D] # LAO LETTER FO TAM
+0EC0 0E9D ; [.1FC0.0020.0002.0E9D][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER FO TAM>
+0EC1 0E9D ; [.1FC0.0020.0002.0E9D][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER FO TAM>
+0EC2 0E9D ; [.1FC0.0020.0002.0E9D][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER FO TAM>
+0EC3 0E9D ; [.1FC0.0020.0002.0E9D][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER FO TAM>
+0EC4 0E9D ; [.1FC0.0020.0002.0E9D][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER FO TAM>
+0E9E ; [.1FC1.0020.0002.0E9E] # LAO LETTER PHO TAM
+0EC0 0E9E ; [.1FC1.0020.0002.0E9E][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PHO TAM>
+0EC1 0E9E ; [.1FC1.0020.0002.0E9E][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PHO TAM>
+0EC2 0E9E ; [.1FC1.0020.0002.0E9E][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PHO TAM>
+0EC3 0E9E ; [.1FC1.0020.0002.0E9E][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PHO TAM>
+0EC4 0E9E ; [.1FC1.0020.0002.0E9E][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PHO TAM>
+0E9F ; [.1FC2.0020.0002.0E9F] # LAO LETTER FO SUNG
+0EC0 0E9F ; [.1FC2.0020.0002.0E9F][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER FO SUNG>
+0EC1 0E9F ; [.1FC2.0020.0002.0E9F][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER FO SUNG>
+0EC2 0E9F ; [.1FC2.0020.0002.0E9F][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER FO SUNG>
+0EC3 0E9F ; [.1FC2.0020.0002.0E9F][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER FO SUNG>
+0EC4 0E9F ; [.1FC2.0020.0002.0E9F][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER FO SUNG>
+0EA1 ; [.1FC3.0020.0002.0EA1] # LAO LETTER MO
+0EC0 0EA1 ; [.1FC3.0020.0002.0EA1][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER MO>
+0EC1 0EA1 ; [.1FC3.0020.0002.0EA1][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER MO>
+0EC2 0EA1 ; [.1FC3.0020.0002.0EA1][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER MO>
+0EC3 0EA1 ; [.1FC3.0020.0002.0EA1][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER MO>
+0EC4 0EA1 ; [.1FC3.0020.0002.0EA1][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER MO>
+0EA2 ; [.1FC4.0020.0002.0EA2] # LAO LETTER YO
+0EC0 0EA2 ; [.1FC4.0020.0002.0EA2][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER YO>
+0EC1 0EA2 ; [.1FC4.0020.0002.0EA2][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER YO>
+0EC2 0EA2 ; [.1FC4.0020.0002.0EA2][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER YO>
+0EC3 0EA2 ; [.1FC4.0020.0002.0EA2][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER YO>
+0EC4 0EA2 ; [.1FC4.0020.0002.0EA2][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER YO>
+0EA3 ; [.1FC5.0020.0002.0EA3] # LAO LETTER LO LING
+0EC0 0EA3 ; [.1FC5.0020.0002.0EA3][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER LO LING>
+0EC1 0EA3 ; [.1FC5.0020.0002.0EA3][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER LO LING>
+0EC2 0EA3 ; [.1FC5.0020.0002.0EA3][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER LO LING>
+0EC3 0EA3 ; [.1FC5.0020.0002.0EA3][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER LO LING>
+0EC4 0EA3 ; [.1FC5.0020.0002.0EA3][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER LO LING>
+0EA5 ; [.1FC6.0020.0002.0EA5] # LAO LETTER LO LOOT
+0EC0 0EA5 ; [.1FC6.0020.0002.0EA5][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER LO LOOT>
+0EC1 0EA5 ; [.1FC6.0020.0002.0EA5][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER LO LOOT>
+0EC2 0EA5 ; [.1FC6.0020.0002.0EA5][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER LO LOOT>
+0EC3 0EA5 ; [.1FC6.0020.0002.0EA5][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER LO LOOT>
+0EC4 0EA5 ; [.1FC6.0020.0002.0EA5][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER LO LOOT>
+0EA7 ; [.1FC7.0020.0002.0EA7] # LAO LETTER WO
+0EC0 0EA7 ; [.1FC7.0020.0002.0EA7][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER WO>
+0EC1 0EA7 ; [.1FC7.0020.0002.0EA7][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER WO>
+0EC2 0EA7 ; [.1FC7.0020.0002.0EA7][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER WO>
+0EC3 0EA7 ; [.1FC7.0020.0002.0EA7][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER WO>
+0EC4 0EA7 ; [.1FC7.0020.0002.0EA7][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER WO>
+0EAB ; [.1FC8.0020.0002.0EAB] # LAO LETTER HO SUNG
+0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC] # LAO HO NO; QQKN
+0EC0 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO HO NO>
+0EC1 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO HO NO>
+0EC2 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO HO NO>
+0EC3 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO HO NO>
+0EC4 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO HO NO>
+0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD] # LAO HO MO; QQKN
+0EC0 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO HO MO>
+0EC1 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO HO MO>
+0EC2 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO HO MO>
+0EC3 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO HO MO>
+0EC4 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO HO MO>
+0EC0 0EAB ; [.1FC8.0020.0002.0EAB][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER HO SUNG>
+0EC1 0EAB ; [.1FC8.0020.0002.0EAB][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER HO SUNG>
+0EC2 0EAB ; [.1FC8.0020.0002.0EAB][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER HO SUNG>
+0EC3 0EAB ; [.1FC8.0020.0002.0EAB][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER HO SUNG>
+0EC4 0EAB ; [.1FC8.0020.0002.0EAB][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER HO SUNG>
+0EAD ; [.1FC9.0020.0002.0EAD] # LAO LETTER O
+0EC0 0EAD ; [.1FC9.0020.0002.0EAD][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER O>
+0EC1 0EAD ; [.1FC9.0020.0002.0EAD][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER O>
+0EC2 0EAD ; [.1FC9.0020.0002.0EAD][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER O>
+0EC3 0EAD ; [.1FC9.0020.0002.0EAD][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER O>
+0EC4 0EAD ; [.1FC9.0020.0002.0EAD][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER O>
+0EAE ; [.1FCA.0020.0002.0EAE] # LAO LETTER HO TAM
+0EC0 0EAE ; [.1FCA.0020.0002.0EAE][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER HO TAM>
+0EC1 0EAE ; [.1FCA.0020.0002.0EAE][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER HO TAM>
+0EC2 0EAE ; [.1FCA.0020.0002.0EAE][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER HO TAM>
+0EC3 0EAE ; [.1FCA.0020.0002.0EAE][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER HO TAM>
+0EC4 0EAE ; [.1FCA.0020.0002.0EAE][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER HO TAM>
+0EAF ; [.1FCB.0020.0002.0EAF] # LAO ELLIPSIS
+0EB0 ; [.1FCC.0020.0002.0EB0] # LAO VOWEL SIGN A
+0EB1 ; [.1FCD.0020.0002.0EB1] # LAO VOWEL SIGN MAI KAN
+0EB2 ; [.1FCE.0020.0002.0EB2] # LAO VOWEL SIGN AA
+0EB3 ; [.1FCF.0020.0002.0EB3] # LAO VOWEL SIGN AM
+0ECD 0EB2 ; [.1FCF.0020.0002.0EB3] # LAO VOWEL SIGN AM
+0EB4 ; [.1FD0.0020.0002.0EB4] # LAO VOWEL SIGN I
+0EB5 ; [.1FD1.0020.0002.0EB5] # LAO VOWEL SIGN II
+0EB6 ; [.1FD2.0020.0002.0EB6] # LAO VOWEL SIGN Y
+0EB7 ; [.1FD3.0020.0002.0EB7] # LAO VOWEL SIGN YY
+0EB8 ; [.1FD4.0020.0002.0EB8] # LAO VOWEL SIGN U
+0EB9 ; [.1FD5.0020.0002.0EB9] # LAO VOWEL SIGN UU
+0EBB ; [.1FD6.0020.0002.0EBB] # LAO VOWEL SIGN MAI KON
+0EBC ; [.1FD7.0020.0002.0EBC] # LAO SEMIVOWEL SIGN LO
+0EBD ; [.1FD8.0020.0002.0EBD] # LAO SEMIVOWEL SIGN NYO
+0EC0 ; [.1FD9.0020.0002.0EC0] # LAO VOWEL SIGN E
+0EC1 ; [.1FDA.0020.0002.0EC1] # LAO VOWEL SIGN EI
+0EC2 ; [.1FDB.0020.0002.0EC2] # LAO VOWEL SIGN O
+0EC3 ; [.1FDC.0020.0002.0EC3] # LAO VOWEL SIGN AY
+0EC4 ; [.1FDD.0020.0002.0EC4] # LAO VOWEL SIGN AI
+AA80 ; [.1FDE.0020.0002.AA80] # TAI VIET LETTER LOW KO
+AAB5 AA80 ; [.1FDE.0020.0002.AA80][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KO>
+AAB6 AA80 ; [.1FDE.0020.0002.AA80][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KO>
+AAB9 AA80 ; [.1FDE.0020.0002.AA80][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KO>
+AABB AA80 ; [.1FDE.0020.0002.AA80][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KO>
+AABC AA80 ; [.1FDE.0020.0002.AA80][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KO>
+AA81 ; [.1FDF.0020.0002.AA81] # TAI VIET LETTER HIGH KO
+AAB5 AA81 ; [.1FDF.0020.0002.AA81][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KO>
+AAB6 AA81 ; [.1FDF.0020.0002.AA81][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KO>
+AAB9 AA81 ; [.1FDF.0020.0002.AA81][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KO>
+AABB AA81 ; [.1FDF.0020.0002.AA81][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KO>
+AABC AA81 ; [.1FDF.0020.0002.AA81][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KO>
+AA82 ; [.1FE0.0020.0002.AA82] # TAI VIET LETTER LOW KHO
+AAB5 AA82 ; [.1FE0.0020.0002.AA82][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHO>
+AAB6 AA82 ; [.1FE0.0020.0002.AA82][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHO>
+AAB9 AA82 ; [.1FE0.0020.0002.AA82][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHO>
+AABB AA82 ; [.1FE0.0020.0002.AA82][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHO>
+AABC AA82 ; [.1FE0.0020.0002.AA82][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHO>
+AA83 ; [.1FE1.0020.0002.AA83] # TAI VIET LETTER HIGH KHO
+AAB5 AA83 ; [.1FE1.0020.0002.AA83][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHO>
+AAB6 AA83 ; [.1FE1.0020.0002.AA83][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHO>
+AAB9 AA83 ; [.1FE1.0020.0002.AA83][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHO>
+AABB AA83 ; [.1FE1.0020.0002.AA83][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHO>
+AABC AA83 ; [.1FE1.0020.0002.AA83][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHO>
+AA84 ; [.1FE2.0020.0002.AA84] # TAI VIET LETTER LOW KHHO
+AAB5 AA84 ; [.1FE2.0020.0002.AA84][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHHO>
+AAB6 AA84 ; [.1FE2.0020.0002.AA84][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHHO>
+AAB9 AA84 ; [.1FE2.0020.0002.AA84][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHHO>
+AABB AA84 ; [.1FE2.0020.0002.AA84][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHHO>
+AABC AA84 ; [.1FE2.0020.0002.AA84][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHHO>
+AA85 ; [.1FE3.0020.0002.AA85] # TAI VIET LETTER HIGH KHHO
+AAB5 AA85 ; [.1FE3.0020.0002.AA85][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHHO>
+AAB6 AA85 ; [.1FE3.0020.0002.AA85][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHHO>
+AAB9 AA85 ; [.1FE3.0020.0002.AA85][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHHO>
+AABB AA85 ; [.1FE3.0020.0002.AA85][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHHO>
+AABC AA85 ; [.1FE3.0020.0002.AA85][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHHO>
+AA86 ; [.1FE4.0020.0002.AA86] # TAI VIET LETTER LOW GO
+AAB5 AA86 ; [.1FE4.0020.0002.AA86][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW GO>
+AAB6 AA86 ; [.1FE4.0020.0002.AA86][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW GO>
+AAB9 AA86 ; [.1FE4.0020.0002.AA86][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW GO>
+AABB AA86 ; [.1FE4.0020.0002.AA86][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW GO>
+AABC AA86 ; [.1FE4.0020.0002.AA86][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW GO>
+AA87 ; [.1FE5.0020.0002.AA87] # TAI VIET LETTER HIGH GO
+AAB5 AA87 ; [.1FE5.0020.0002.AA87][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH GO>
+AAB6 AA87 ; [.1FE5.0020.0002.AA87][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH GO>
+AAB9 AA87 ; [.1FE5.0020.0002.AA87][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH GO>
+AABB AA87 ; [.1FE5.0020.0002.AA87][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH GO>
+AABC AA87 ; [.1FE5.0020.0002.AA87][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH GO>
+AA88 ; [.1FE6.0020.0002.AA88] # TAI VIET LETTER LOW NGO
+AAB5 AA88 ; [.1FE6.0020.0002.AA88][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NGO>
+AAB6 AA88 ; [.1FE6.0020.0002.AA88][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NGO>
+AAB9 AA88 ; [.1FE6.0020.0002.AA88][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NGO>
+AABB AA88 ; [.1FE6.0020.0002.AA88][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NGO>
+AABC AA88 ; [.1FE6.0020.0002.AA88][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NGO>
+AA89 ; [.1FE7.0020.0002.AA89] # TAI VIET LETTER HIGH NGO
+AAB5 AA89 ; [.1FE7.0020.0002.AA89][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NGO>
+AAB6 AA89 ; [.1FE7.0020.0002.AA89][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NGO>
+AAB9 AA89 ; [.1FE7.0020.0002.AA89][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NGO>
+AABB AA89 ; [.1FE7.0020.0002.AA89][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NGO>
+AABC AA89 ; [.1FE7.0020.0002.AA89][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NGO>
+AA8A ; [.1FE8.0020.0002.AA8A] # TAI VIET LETTER LOW CO
+AAB5 AA8A ; [.1FE8.0020.0002.AA8A][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CO>
+AAB6 AA8A ; [.1FE8.0020.0002.AA8A][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CO>
+AAB9 AA8A ; [.1FE8.0020.0002.AA8A][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CO>
+AABB AA8A ; [.1FE8.0020.0002.AA8A][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CO>
+AABC AA8A ; [.1FE8.0020.0002.AA8A][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CO>
+AA8B ; [.1FE9.0020.0002.AA8B] # TAI VIET LETTER HIGH CO
+AAB5 AA8B ; [.1FE9.0020.0002.AA8B][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CO>
+AAB6 AA8B ; [.1FE9.0020.0002.AA8B][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CO>
+AAB9 AA8B ; [.1FE9.0020.0002.AA8B][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CO>
+AABB AA8B ; [.1FE9.0020.0002.AA8B][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CO>
+AABC AA8B ; [.1FE9.0020.0002.AA8B][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CO>
+AA8C ; [.1FEA.0020.0002.AA8C] # TAI VIET LETTER LOW CHO
+AAB5 AA8C ; [.1FEA.0020.0002.AA8C][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CHO>
+AAB6 AA8C ; [.1FEA.0020.0002.AA8C][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CHO>
+AAB9 AA8C ; [.1FEA.0020.0002.AA8C][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CHO>
+AABB AA8C ; [.1FEA.0020.0002.AA8C][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CHO>
+AABC AA8C ; [.1FEA.0020.0002.AA8C][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CHO>
+AA8D ; [.1FEB.0020.0002.AA8D] # TAI VIET LETTER HIGH CHO
+AAB5 AA8D ; [.1FEB.0020.0002.AA8D][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CHO>
+AAB6 AA8D ; [.1FEB.0020.0002.AA8D][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CHO>
+AAB9 AA8D ; [.1FEB.0020.0002.AA8D][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CHO>
+AABB AA8D ; [.1FEB.0020.0002.AA8D][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CHO>
+AABC AA8D ; [.1FEB.0020.0002.AA8D][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CHO>
+AA8E ; [.1FEC.0020.0002.AA8E] # TAI VIET LETTER LOW SO
+AAB5 AA8E ; [.1FEC.0020.0002.AA8E][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW SO>
+AAB6 AA8E ; [.1FEC.0020.0002.AA8E][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW SO>
+AAB9 AA8E ; [.1FEC.0020.0002.AA8E][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW SO>
+AABB AA8E ; [.1FEC.0020.0002.AA8E][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW SO>
+AABC AA8E ; [.1FEC.0020.0002.AA8E][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW SO>
+AA8F ; [.1FED.0020.0002.AA8F] # TAI VIET LETTER HIGH SO
+AAB5 AA8F ; [.1FED.0020.0002.AA8F][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH SO>
+AAB6 AA8F ; [.1FED.0020.0002.AA8F][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH SO>
+AAB9 AA8F ; [.1FED.0020.0002.AA8F][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH SO>
+AABB AA8F ; [.1FED.0020.0002.AA8F][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH SO>
+AABC AA8F ; [.1FED.0020.0002.AA8F][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH SO>
+AA90 ; [.1FEE.0020.0002.AA90] # TAI VIET LETTER LOW NYO
+AAB5 AA90 ; [.1FEE.0020.0002.AA90][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NYO>
+AAB6 AA90 ; [.1FEE.0020.0002.AA90][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NYO>
+AAB9 AA90 ; [.1FEE.0020.0002.AA90][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NYO>
+AABB AA90 ; [.1FEE.0020.0002.AA90][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NYO>
+AABC AA90 ; [.1FEE.0020.0002.AA90][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NYO>
+AA91 ; [.1FEF.0020.0002.AA91] # TAI VIET LETTER HIGH NYO
+AAB5 AA91 ; [.1FEF.0020.0002.AA91][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NYO>
+AAB6 AA91 ; [.1FEF.0020.0002.AA91][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NYO>
+AAB9 AA91 ; [.1FEF.0020.0002.AA91][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NYO>
+AABB AA91 ; [.1FEF.0020.0002.AA91][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NYO>
+AABC AA91 ; [.1FEF.0020.0002.AA91][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NYO>
+AA92 ; [.1FF0.0020.0002.AA92] # TAI VIET LETTER LOW DO
+AAB5 AA92 ; [.1FF0.0020.0002.AA92][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW DO>
+AAB6 AA92 ; [.1FF0.0020.0002.AA92][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW DO>
+AAB9 AA92 ; [.1FF0.0020.0002.AA92][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW DO>
+AABB AA92 ; [.1FF0.0020.0002.AA92][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW DO>
+AABC AA92 ; [.1FF0.0020.0002.AA92][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW DO>
+AA93 ; [.1FF1.0020.0002.AA93] # TAI VIET LETTER HIGH DO
+AAB5 AA93 ; [.1FF1.0020.0002.AA93][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH DO>
+AAB6 AA93 ; [.1FF1.0020.0002.AA93][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH DO>
+AAB9 AA93 ; [.1FF1.0020.0002.AA93][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH DO>
+AABB AA93 ; [.1FF1.0020.0002.AA93][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH DO>
+AABC AA93 ; [.1FF1.0020.0002.AA93][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH DO>
+AA94 ; [.1FF2.0020.0002.AA94] # TAI VIET LETTER LOW TO
+AAB5 AA94 ; [.1FF2.0020.0002.AA94][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW TO>
+AAB6 AA94 ; [.1FF2.0020.0002.AA94][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW TO>
+AAB9 AA94 ; [.1FF2.0020.0002.AA94][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW TO>
+AABB AA94 ; [.1FF2.0020.0002.AA94][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW TO>
+AABC AA94 ; [.1FF2.0020.0002.AA94][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW TO>
+AA95 ; [.1FF3.0020.0002.AA95] # TAI VIET LETTER HIGH TO
+AAB5 AA95 ; [.1FF3.0020.0002.AA95][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH TO>
+AAB6 AA95 ; [.1FF3.0020.0002.AA95][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH TO>
+AAB9 AA95 ; [.1FF3.0020.0002.AA95][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH TO>
+AABB AA95 ; [.1FF3.0020.0002.AA95][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH TO>
+AABC AA95 ; [.1FF3.0020.0002.AA95][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH TO>
+AA96 ; [.1FF4.0020.0002.AA96] # TAI VIET LETTER LOW THO
+AAB5 AA96 ; [.1FF4.0020.0002.AA96][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW THO>
+AAB6 AA96 ; [.1FF4.0020.0002.AA96][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW THO>
+AAB9 AA96 ; [.1FF4.0020.0002.AA96][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW THO>
+AABB AA96 ; [.1FF4.0020.0002.AA96][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW THO>
+AABC AA96 ; [.1FF4.0020.0002.AA96][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW THO>
+AA97 ; [.1FF5.0020.0002.AA97] # TAI VIET LETTER HIGH THO
+AAB5 AA97 ; [.1FF5.0020.0002.AA97][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH THO>
+AAB6 AA97 ; [.1FF5.0020.0002.AA97][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH THO>
+AAB9 AA97 ; [.1FF5.0020.0002.AA97][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH THO>
+AABB AA97 ; [.1FF5.0020.0002.AA97][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH THO>
+AABC AA97 ; [.1FF5.0020.0002.AA97][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH THO>
+AA98 ; [.1FF6.0020.0002.AA98] # TAI VIET LETTER LOW NO
+AAB5 AA98 ; [.1FF6.0020.0002.AA98][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NO>
+AAB6 AA98 ; [.1FF6.0020.0002.AA98][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NO>
+AAB9 AA98 ; [.1FF6.0020.0002.AA98][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NO>
+AABB AA98 ; [.1FF6.0020.0002.AA98][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NO>
+AABC AA98 ; [.1FF6.0020.0002.AA98][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NO>
+AA99 ; [.1FF7.0020.0002.AA99] # TAI VIET LETTER HIGH NO
+AAB5 AA99 ; [.1FF7.0020.0002.AA99][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NO>
+AAB6 AA99 ; [.1FF7.0020.0002.AA99][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NO>
+AAB9 AA99 ; [.1FF7.0020.0002.AA99][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NO>
+AABB AA99 ; [.1FF7.0020.0002.AA99][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NO>
+AABC AA99 ; [.1FF7.0020.0002.AA99][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NO>
+AA9A ; [.1FF8.0020.0002.AA9A] # TAI VIET LETTER LOW BO
+AAB5 AA9A ; [.1FF8.0020.0002.AA9A][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW BO>
+AAB6 AA9A ; [.1FF8.0020.0002.AA9A][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW BO>
+AAB9 AA9A ; [.1FF8.0020.0002.AA9A][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW BO>
+AABB AA9A ; [.1FF8.0020.0002.AA9A][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW BO>
+AABC AA9A ; [.1FF8.0020.0002.AA9A][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW BO>
+AA9B ; [.1FF9.0020.0002.AA9B] # TAI VIET LETTER HIGH BO
+AAB5 AA9B ; [.1FF9.0020.0002.AA9B][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH BO>
+AAB6 AA9B ; [.1FF9.0020.0002.AA9B][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH BO>
+AAB9 AA9B ; [.1FF9.0020.0002.AA9B][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH BO>
+AABB AA9B ; [.1FF9.0020.0002.AA9B][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH BO>
+AABC AA9B ; [.1FF9.0020.0002.AA9B][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH BO>
+AA9C ; [.1FFA.0020.0002.AA9C] # TAI VIET LETTER LOW PO
+AAB5 AA9C ; [.1FFA.0020.0002.AA9C][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PO>
+AAB6 AA9C ; [.1FFA.0020.0002.AA9C][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PO>
+AAB9 AA9C ; [.1FFA.0020.0002.AA9C][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PO>
+AABB AA9C ; [.1FFA.0020.0002.AA9C][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PO>
+AABC AA9C ; [.1FFA.0020.0002.AA9C][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PO>
+AA9D ; [.1FFB.0020.0002.AA9D] # TAI VIET LETTER HIGH PO
+AAB5 AA9D ; [.1FFB.0020.0002.AA9D][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PO>
+AAB6 AA9D ; [.1FFB.0020.0002.AA9D][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PO>
+AAB9 AA9D ; [.1FFB.0020.0002.AA9D][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PO>
+AABB AA9D ; [.1FFB.0020.0002.AA9D][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PO>
+AABC AA9D ; [.1FFB.0020.0002.AA9D][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PO>
+AA9E ; [.1FFC.0020.0002.AA9E] # TAI VIET LETTER LOW PHO
+AAB5 AA9E ; [.1FFC.0020.0002.AA9E][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PHO>
+AAB6 AA9E ; [.1FFC.0020.0002.AA9E][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PHO>
+AAB9 AA9E ; [.1FFC.0020.0002.AA9E][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PHO>
+AABB AA9E ; [.1FFC.0020.0002.AA9E][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PHO>
+AABC AA9E ; [.1FFC.0020.0002.AA9E][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PHO>
+AA9F ; [.1FFD.0020.0002.AA9F] # TAI VIET LETTER HIGH PHO
+AAB5 AA9F ; [.1FFD.0020.0002.AA9F][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PHO>
+AAB6 AA9F ; [.1FFD.0020.0002.AA9F][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PHO>
+AAB9 AA9F ; [.1FFD.0020.0002.AA9F][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PHO>
+AABB AA9F ; [.1FFD.0020.0002.AA9F][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PHO>
+AABC AA9F ; [.1FFD.0020.0002.AA9F][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PHO>
+AAA0 ; [.1FFE.0020.0002.AAA0] # TAI VIET LETTER LOW FO
+AAB5 AAA0 ; [.1FFE.0020.0002.AAA0][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW FO>
+AAB6 AAA0 ; [.1FFE.0020.0002.AAA0][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW FO>
+AAB9 AAA0 ; [.1FFE.0020.0002.AAA0][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW FO>
+AABB AAA0 ; [.1FFE.0020.0002.AAA0][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW FO>
+AABC AAA0 ; [.1FFE.0020.0002.AAA0][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW FO>
+AAA1 ; [.1FFF.0020.0002.AAA1] # TAI VIET LETTER HIGH FO
+AAB5 AAA1 ; [.1FFF.0020.0002.AAA1][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH FO>
+AAB6 AAA1 ; [.1FFF.0020.0002.AAA1][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH FO>
+AAB9 AAA1 ; [.1FFF.0020.0002.AAA1][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH FO>
+AABB AAA1 ; [.1FFF.0020.0002.AAA1][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH FO>
+AABC AAA1 ; [.1FFF.0020.0002.AAA1][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH FO>
+AAA2 ; [.2000.0020.0002.AAA2] # TAI VIET LETTER LOW MO
+AAB5 AAA2 ; [.2000.0020.0002.AAA2][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW MO>
+AAB6 AAA2 ; [.2000.0020.0002.AAA2][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW MO>
+AAB9 AAA2 ; [.2000.0020.0002.AAA2][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW MO>
+AABB AAA2 ; [.2000.0020.0002.AAA2][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW MO>
+AABC AAA2 ; [.2000.0020.0002.AAA2][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW MO>
+AAA3 ; [.2001.0020.0002.AAA3] # TAI VIET LETTER HIGH MO
+AAB5 AAA3 ; [.2001.0020.0002.AAA3][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH MO>
+AAB6 AAA3 ; [.2001.0020.0002.AAA3][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH MO>
+AAB9 AAA3 ; [.2001.0020.0002.AAA3][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH MO>
+AABB AAA3 ; [.2001.0020.0002.AAA3][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH MO>
+AABC AAA3 ; [.2001.0020.0002.AAA3][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH MO>
+AAA4 ; [.2002.0020.0002.AAA4] # TAI VIET LETTER LOW YO
+AAB5 AAA4 ; [.2002.0020.0002.AAA4][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW YO>
+AAB6 AAA4 ; [.2002.0020.0002.AAA4][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW YO>
+AAB9 AAA4 ; [.2002.0020.0002.AAA4][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW YO>
+AABB AAA4 ; [.2002.0020.0002.AAA4][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW YO>
+AABC AAA4 ; [.2002.0020.0002.AAA4][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW YO>
+AAA5 ; [.2003.0020.0002.AAA5] # TAI VIET LETTER HIGH YO
+AAB5 AAA5 ; [.2003.0020.0002.AAA5][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH YO>
+AAB6 AAA5 ; [.2003.0020.0002.AAA5][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH YO>
+AAB9 AAA5 ; [.2003.0020.0002.AAA5][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH YO>
+AABB AAA5 ; [.2003.0020.0002.AAA5][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH YO>
+AABC AAA5 ; [.2003.0020.0002.AAA5][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH YO>
+AAA6 ; [.2004.0020.0002.AAA6] # TAI VIET LETTER LOW RO
+AAB5 AAA6 ; [.2004.0020.0002.AAA6][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW RO>
+AAB6 AAA6 ; [.2004.0020.0002.AAA6][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW RO>
+AAB9 AAA6 ; [.2004.0020.0002.AAA6][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW RO>
+AABB AAA6 ; [.2004.0020.0002.AAA6][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW RO>
+AABC AAA6 ; [.2004.0020.0002.AAA6][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW RO>
+AAA7 ; [.2005.0020.0002.AAA7] # TAI VIET LETTER HIGH RO
+AAB5 AAA7 ; [.2005.0020.0002.AAA7][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH RO>
+AAB6 AAA7 ; [.2005.0020.0002.AAA7][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH RO>
+AAB9 AAA7 ; [.2005.0020.0002.AAA7][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH RO>
+AABB AAA7 ; [.2005.0020.0002.AAA7][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH RO>
+AABC AAA7 ; [.2005.0020.0002.AAA7][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH RO>
+AAA8 ; [.2006.0020.0002.AAA8] # TAI VIET LETTER LOW LO
+AAB5 AAA8 ; [.2006.0020.0002.AAA8][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW LO>
+AAB6 AAA8 ; [.2006.0020.0002.AAA8][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW LO>
+AAB9 AAA8 ; [.2006.0020.0002.AAA8][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW LO>
+AABB AAA8 ; [.2006.0020.0002.AAA8][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW LO>
+AABC AAA8 ; [.2006.0020.0002.AAA8][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW LO>
+AAA9 ; [.2007.0020.0002.AAA9] # TAI VIET LETTER HIGH LO
+AAB5 AAA9 ; [.2007.0020.0002.AAA9][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH LO>
+AAB6 AAA9 ; [.2007.0020.0002.AAA9][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH LO>
+AAB9 AAA9 ; [.2007.0020.0002.AAA9][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH LO>
+AABB AAA9 ; [.2007.0020.0002.AAA9][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH LO>
+AABC AAA9 ; [.2007.0020.0002.AAA9][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH LO>
+AAAA ; [.2008.0020.0002.AAAA] # TAI VIET LETTER LOW VO
+AAB5 AAAA ; [.2008.0020.0002.AAAA][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW VO>
+AAB6 AAAA ; [.2008.0020.0002.AAAA][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW VO>
+AAB9 AAAA ; [.2008.0020.0002.AAAA][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW VO>
+AABB AAAA ; [.2008.0020.0002.AAAA][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW VO>
+AABC AAAA ; [.2008.0020.0002.AAAA][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW VO>
+AAAB ; [.2009.0020.0002.AAAB] # TAI VIET LETTER HIGH VO
+AAB5 AAAB ; [.2009.0020.0002.AAAB][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH VO>
+AAB6 AAAB ; [.2009.0020.0002.AAAB][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH VO>
+AAB9 AAAB ; [.2009.0020.0002.AAAB][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH VO>
+AABB AAAB ; [.2009.0020.0002.AAAB][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH VO>
+AABC AAAB ; [.2009.0020.0002.AAAB][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH VO>
+AAAC ; [.200A.0020.0002.AAAC] # TAI VIET LETTER LOW HO
+AAB5 AAAC ; [.200A.0020.0002.AAAC][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW HO>
+AAB6 AAAC ; [.200A.0020.0002.AAAC][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW HO>
+AAB9 AAAC ; [.200A.0020.0002.AAAC][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW HO>
+AABB AAAC ; [.200A.0020.0002.AAAC][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW HO>
+AABC AAAC ; [.200A.0020.0002.AAAC][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW HO>
+AAAD ; [.200B.0020.0002.AAAD] # TAI VIET LETTER HIGH HO
+AAB5 AAAD ; [.200B.0020.0002.AAAD][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH HO>
+AAB6 AAAD ; [.200B.0020.0002.AAAD][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH HO>
+AAB9 AAAD ; [.200B.0020.0002.AAAD][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH HO>
+AABB AAAD ; [.200B.0020.0002.AAAD][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH HO>
+AABC AAAD ; [.200B.0020.0002.AAAD][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH HO>
+AAAE ; [.200C.0020.0002.AAAE] # TAI VIET LETTER LOW O
+AAB5 AAAE ; [.200C.0020.0002.AAAE][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW O>
+AAB6 AAAE ; [.200C.0020.0002.AAAE][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW O>
+AAB9 AAAE ; [.200C.0020.0002.AAAE][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW O>
+AABB AAAE ; [.200C.0020.0002.AAAE][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW O>
+AABC AAAE ; [.200C.0020.0002.AAAE][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW O>
+AAAF ; [.200D.0020.0002.AAAF] # TAI VIET LETTER HIGH O
+AAB5 AAAF ; [.200D.0020.0002.AAAF][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH O>
+AAB6 AAAF ; [.200D.0020.0002.AAAF][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH O>
+AAB9 AAAF ; [.200D.0020.0002.AAAF][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH O>
+AABB AAAF ; [.200D.0020.0002.AAAF][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH O>
+AABC AAAF ; [.200D.0020.0002.AAAF][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH O>
+AAB0 ; [.200E.0020.0002.AAB0] # TAI VIET MAI KANG
+AAB1 ; [.200F.0020.0002.AAB1] # TAI VIET VOWEL AA
+AAB2 ; [.2010.0020.0002.AAB2] # TAI VIET VOWEL I
+AAB3 ; [.2011.0020.0002.AAB3] # TAI VIET VOWEL UE
+AAB4 ; [.2012.0020.0002.AAB4] # TAI VIET VOWEL U
+AAB5 ; [.2013.0020.0002.AAB5] # TAI VIET VOWEL E
+AAB6 ; [.2014.0020.0002.AAB6] # TAI VIET VOWEL O
+AAB7 ; [.2015.0020.0002.AAB7] # TAI VIET MAY KHIT
+AAB8 ; [.2016.0020.0002.AAB8] # TAI VIET VOWEL IA
+AAB9 ; [.2017.0020.0002.AAB9] # TAI VIET VOWEL UEA
+AABA ; [.2018.0020.0002.AABA] # TAI VIET VOWEL UA
+AABB ; [.2019.0020.0002.AABB] # TAI VIET VOWEL AUE
+AABC ; [.201A.0020.0002.AABC] # TAI VIET VOWEL AY
+AABD ; [.201B.0020.0002.AABD] # TAI VIET VOWEL AN
+AABE ; [.201C.0020.0002.AABE] # TAI VIET VOWEL AM
+AAC0 ; [.201D.0020.0002.AAC0] # TAI VIET TONE MAI NUENG
+AAC2 ; [.201E.0020.0002.AAC2] # TAI VIET TONE MAI SONG
+AADB ; [.201F.0020.0002.AADB] # TAI VIET SYMBOL KON
+AADC ; [.2020.0020.0002.AADC] # TAI VIET SYMBOL NUENG
+0F40 ; [.2021.0020.0002.0F40] # TIBETAN LETTER KA
+0F69 ; [.2021.0020.0002.0F40][.2062.0020.0002.0FB5] # TIBETAN LETTER KSSA; QQCN
+0F90 ; [.2022.0020.0002.0F90] # TIBETAN SUBJOINED LETTER KA
+0FB9 ; [.2022.0020.0002.0F90][.2062.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER KSSA; QQCN
+0F6B ; [.2023.0020.0002.0F6B] # TIBETAN LETTER KKA
+0F41 ; [.2024.0020.0002.0F41] # TIBETAN LETTER KHA
+0F91 ; [.2025.0020.0002.0F91] # TIBETAN SUBJOINED LETTER KHA
+0F42 ; [.2026.0020.0002.0F42] # TIBETAN LETTER GA
+0F43 ; [.2026.0020.0002.0F42][.2066.0020.0002.0FB7] # TIBETAN LETTER GHA; QQCN
+0F92 ; [.2027.0020.0002.0F92] # TIBETAN SUBJOINED LETTER GA
+0F93 ; [.2027.0020.0002.0F92][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER GHA; QQCN
+0F44 ; [.2028.0020.0002.0F44] # TIBETAN LETTER NGA
+0F94 ; [.2029.0020.0002.0F94] # TIBETAN SUBJOINED LETTER NGA
+0F45 ; [.202A.0020.0002.0F45] # TIBETAN LETTER CA
+0F95 ; [.202B.0020.0002.0F95] # TIBETAN SUBJOINED LETTER CA
+0F46 ; [.202C.0020.0002.0F46] # TIBETAN LETTER CHA
+0F96 ; [.202D.0020.0002.0F96] # TIBETAN SUBJOINED LETTER CHA
+0F47 ; [.202E.0020.0002.0F47] # TIBETAN LETTER JA
+0F97 ; [.202F.0020.0002.0F97] # TIBETAN SUBJOINED LETTER JA
+0F49 ; [.2030.0020.0002.0F49] # TIBETAN LETTER NYA
+0F99 ; [.2031.0020.0002.0F99] # TIBETAN SUBJOINED LETTER NYA
+0F4A ; [.2032.0020.0002.0F4A] # TIBETAN LETTER TTA
+0F9A ; [.2033.0020.0002.0F9A] # TIBETAN SUBJOINED LETTER TTA
+0F4B ; [.2034.0020.0002.0F4B] # TIBETAN LETTER TTHA
+0F9B ; [.2035.0020.0002.0F9B] # TIBETAN SUBJOINED LETTER TTHA
+0F4C ; [.2036.0020.0002.0F4C] # TIBETAN LETTER DDA
+0F4D ; [.2036.0020.0002.0F4C][.2066.0020.0002.0FB7] # TIBETAN LETTER DDHA; QQCN
+0F9C ; [.2037.0020.0002.0F9C] # TIBETAN SUBJOINED LETTER DDA
+0F9D ; [.2037.0020.0002.0F9C][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DDHA; QQCN
+0F4E ; [.2038.0020.0002.0F4E] # TIBETAN LETTER NNA
+0F9E ; [.2039.0020.0002.0F9E] # TIBETAN SUBJOINED LETTER NNA
+0F4F ; [.203A.0020.0002.0F4F] # TIBETAN LETTER TA
+0F9F ; [.203B.0020.0002.0F9F] # TIBETAN SUBJOINED LETTER TA
+0F50 ; [.203C.0020.0002.0F50] # TIBETAN LETTER THA
+0FA0 ; [.203D.0020.0002.0FA0] # TIBETAN SUBJOINED LETTER THA
+0F51 ; [.203E.0020.0002.0F51] # TIBETAN LETTER DA
+0F52 ; [.203E.0020.0002.0F51][.2066.0020.0002.0FB7] # TIBETAN LETTER DHA; QQCN
+0FA1 ; [.203F.0020.0002.0FA1] # TIBETAN SUBJOINED LETTER DA
+0FA2 ; [.203F.0020.0002.0FA1][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DHA; QQCN
+0F53 ; [.2040.0020.0002.0F53] # TIBETAN LETTER NA
+0FA3 ; [.2041.0020.0002.0FA3] # TIBETAN SUBJOINED LETTER NA
+0F54 ; [.2042.0020.0002.0F54] # TIBETAN LETTER PA
+0FA4 ; [.2043.0020.0002.0FA4] # TIBETAN SUBJOINED LETTER PA
+0F55 ; [.2044.0020.0002.0F55] # TIBETAN LETTER PHA
+0FA5 ; [.2045.0020.0002.0FA5] # TIBETAN SUBJOINED LETTER PHA
+0F56 ; [.2046.0020.0002.0F56] # TIBETAN LETTER BA
+0F57 ; [.2046.0020.0002.0F56][.2066.0020.0002.0FB7] # TIBETAN LETTER BHA; QQCN
+0FA6 ; [.2047.0020.0002.0FA6] # TIBETAN SUBJOINED LETTER BA
+0FA7 ; [.2047.0020.0002.0FA6][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER BHA; QQCN
+0F58 ; [.2048.0020.0002.0F58] # TIBETAN LETTER MA
+0FA8 ; [.2049.0020.0002.0FA8] # TIBETAN SUBJOINED LETTER MA
+0F59 ; [.204A.0020.0002.0F59] # TIBETAN LETTER TSA
+0FA9 ; [.204B.0020.0002.0FA9] # TIBETAN SUBJOINED LETTER TSA
+0F5A ; [.204C.0020.0002.0F5A] # TIBETAN LETTER TSHA
+0FAA ; [.204D.0020.0002.0FAA] # TIBETAN SUBJOINED LETTER TSHA
+0F5B ; [.204E.0020.0002.0F5B] # TIBETAN LETTER DZA
+0F5C ; [.204E.0020.0002.0F5B][.2066.0020.0002.0FB7] # TIBETAN LETTER DZHA; QQCN
+0FAB ; [.204F.0020.0002.0FAB] # TIBETAN SUBJOINED LETTER DZA
+0FAC ; [.204F.0020.0002.0FAB][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DZHA; QQCN
+0F5D ; [.2050.0020.0002.0F5D] # TIBETAN LETTER WA
+0FAD ; [.2051.0020.0002.0FAD] # TIBETAN SUBJOINED LETTER WA
+0FBA ; [.2051.0020.0004.0FBA][.0000.015A.0004.0FBA] # TIBETAN SUBJOINED LETTER FIXED-FORM WA; QQKN
+0F5E ; [.2052.0020.0002.0F5E] # TIBETAN LETTER ZHA
+0FAE ; [.2053.0020.0002.0FAE] # TIBETAN SUBJOINED LETTER ZHA
+0F5F ; [.2054.0020.0002.0F5F] # TIBETAN LETTER ZA
+0FAF ; [.2055.0020.0002.0FAF] # TIBETAN SUBJOINED LETTER ZA
+0F60 ; [.2056.0020.0002.0F60] # TIBETAN LETTER -A
+0FB0 ; [.2057.0020.0002.0FB0] # TIBETAN SUBJOINED LETTER -A
+0F61 ; [.2058.0020.0002.0F61] # TIBETAN LETTER YA
+0FB1 ; [.2059.0020.0002.0FB1] # TIBETAN SUBJOINED LETTER YA
+0FBB ; [.2059.0020.0004.0FBB][.0000.015A.0004.0FBB] # TIBETAN SUBJOINED LETTER FIXED-FORM YA; QQKN
+0F62 ; [.205A.0020.0002.0F62] # TIBETAN LETTER RA
+0F6A ; [.205A.0020.0004.0F6A][.0000.015A.0004.0F6A] # TIBETAN LETTER FIXED-FORM RA; QQKN
+0FB2 ; [.205B.0020.0002.0FB2] # TIBETAN SUBJOINED LETTER RA
+0FBC ; [.205B.0020.0004.0FBC][.0000.015A.0004.0FBC] # TIBETAN SUBJOINED LETTER FIXED-FORM RA; QQKN
+0F6C ; [.205C.0020.0002.0F6C] # TIBETAN LETTER RRA
+0F63 ; [.205D.0020.0002.0F63] # TIBETAN LETTER LA
+0FB3 ; [.205E.0020.0002.0FB3] # TIBETAN SUBJOINED LETTER LA
+0F64 ; [.205F.0020.0002.0F64] # TIBETAN LETTER SHA
+0FB4 ; [.2060.0020.0002.0FB4] # TIBETAN SUBJOINED LETTER SHA
+0F65 ; [.2061.0020.0002.0F65] # TIBETAN LETTER SSA
+0FB5 ; [.2062.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER SSA
+0F66 ; [.2063.0020.0002.0F66] # TIBETAN LETTER SA
+0FB6 ; [.2064.0020.0002.0FB6] # TIBETAN SUBJOINED LETTER SA
+0F67 ; [.2065.0020.0002.0F67] # TIBETAN LETTER HA
+0FB7 ; [.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER HA
+0F68 ; [.2067.0020.0002.0F68] # TIBETAN LETTER A
+0F00 ; [.2067.0020.0004.0F00][.207A.0020.0004.0F00][.0000.0127.001F.0F00] # TIBETAN SYLLABLE OM; QQKN
+0FB8 ; [.2068.0020.0002.0FB8] # TIBETAN SUBJOINED LETTER A
+0F88 ; [.2069.0020.0002.0F88] # TIBETAN SIGN LCE TSA CAN
+0F89 ; [.206A.0020.0002.0F89] # TIBETAN SIGN MCHU CAN
+0F8A ; [.206B.0020.0002.0F8A] # TIBETAN SIGN GRU CAN RGYINGS
+0F8B ; [.206C.0020.0002.0F8B] # TIBETAN SIGN GRU MED RGYINGS
+0F71 ; [.206D.0020.0002.0F71] # TIBETAN VOWEL SIGN AA
+0F72 ; [.206E.0020.0002.0F72] # TIBETAN VOWEL SIGN I
+0F73 ; [.206F.0020.0002.0F73] # TIBETAN VOWEL SIGN II
+0F71 0F72 ; [.206F.0020.0002.0F73] # TIBETAN VOWEL SIGN II
+0F80 ; [.2070.0020.0002.0F80] # TIBETAN VOWEL SIGN REVERSED I
+0F81 ; [.2071.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
+0F71 0F80 ; [.2071.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
+0F74 ; [.2072.0020.0002.0F74] # TIBETAN VOWEL SIGN U
+0F75 ; [.2073.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
+0F71 0F74 ; [.2073.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
+0F76 ; [.2074.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
+0FB2 0F80 ; [.2074.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
+0F77 ; [.2075.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0FB2 0F71 0F80 ; [.2075.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0FB2 0F81 ; [.2075.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0F78 ; [.2076.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
+0FB3 0F80 ; [.2076.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
+0F79 ; [.2077.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0FB3 0F71 0F80 ; [.2077.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0FB3 0F81 ; [.2077.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0F7A ; [.2078.0020.0002.0F7A] # TIBETAN VOWEL SIGN E
+0F7B ; [.2079.0020.0002.0F7B] # TIBETAN VOWEL SIGN EE
+0F7C ; [.207A.0020.0002.0F7C] # TIBETAN VOWEL SIGN O
+0F7D ; [.207B.0020.0002.0F7D] # TIBETAN VOWEL SIGN OO
+0F84 ; [.207C.0020.0002.0F84] # TIBETAN MARK HALANTA
+1C00 ; [.207D.0020.0002.1C00] # LEPCHA LETTER KA
+1C01 ; [.207E.0020.0002.1C01] # LEPCHA LETTER KLA
+1C02 ; [.207F.0020.0002.1C02] # LEPCHA LETTER KHA
+1C03 ; [.2080.0020.0002.1C03] # LEPCHA LETTER GA
+1C04 ; [.2081.0020.0002.1C04] # LEPCHA LETTER GLA
+1C05 ; [.2082.0020.0002.1C05] # LEPCHA LETTER NGA
+1C06 ; [.2083.0020.0002.1C06] # LEPCHA LETTER CA
+1C07 ; [.2084.0020.0002.1C07] # LEPCHA LETTER CHA
+1C08 ; [.2085.0020.0002.1C08] # LEPCHA LETTER JA
+1C09 ; [.2086.0020.0002.1C09] # LEPCHA LETTER NYA
+1C4D ; [.2087.0020.0002.1C4D] # LEPCHA LETTER TTA
+1C4E ; [.2088.0020.0002.1C4E] # LEPCHA LETTER TTHA
+1C4F ; [.2089.0020.0002.1C4F] # LEPCHA LETTER DDA
+1C0A ; [.208A.0020.0002.1C0A] # LEPCHA LETTER TA
+1C0B ; [.208B.0020.0002.1C0B] # LEPCHA LETTER THA
+1C0C ; [.208C.0020.0002.1C0C] # LEPCHA LETTER DA
+1C0D ; [.208D.0020.0002.1C0D] # LEPCHA LETTER NA
+1C0E ; [.208E.0020.0002.1C0E] # LEPCHA LETTER PA
+1C0F ; [.208F.0020.0002.1C0F] # LEPCHA LETTER PLA
+1C10 ; [.2090.0020.0002.1C10] # LEPCHA LETTER PHA
+1C11 ; [.2091.0020.0002.1C11] # LEPCHA LETTER FA
+1C12 ; [.2092.0020.0002.1C12] # LEPCHA LETTER FLA
+1C13 ; [.2093.0020.0002.1C13] # LEPCHA LETTER BA
+1C14 ; [.2094.0020.0002.1C14] # LEPCHA LETTER BLA
+1C15 ; [.2095.0020.0002.1C15] # LEPCHA LETTER MA
+1C16 ; [.2096.0020.0002.1C16] # LEPCHA LETTER MLA
+1C17 ; [.2097.0020.0002.1C17] # LEPCHA LETTER TSA
+1C18 ; [.2098.0020.0002.1C18] # LEPCHA LETTER TSHA
+1C19 ; [.2099.0020.0002.1C19] # LEPCHA LETTER DZA
+1C1A ; [.209A.0020.0002.1C1A] # LEPCHA LETTER YA
+1C24 ; [.209B.0020.0002.1C24] # LEPCHA SUBJOINED LETTER YA
+1C1B ; [.209C.0020.0002.1C1B] # LEPCHA LETTER RA
+1C25 ; [.209D.0020.0002.1C25] # LEPCHA SUBJOINED LETTER RA
+1C1C ; [.209E.0020.0002.1C1C] # LEPCHA LETTER LA
+1C1D ; [.209F.0020.0002.1C1D] # LEPCHA LETTER HA
+1C1E ; [.20A0.0020.0002.1C1E] # LEPCHA LETTER HLA
+1C1F ; [.20A1.0020.0002.1C1F] # LEPCHA LETTER VA
+1C20 ; [.20A2.0020.0002.1C20] # LEPCHA LETTER SA
+1C21 ; [.20A3.0020.0002.1C21] # LEPCHA LETTER SHA
+1C22 ; [.20A4.0020.0002.1C22] # LEPCHA LETTER WA
+1C23 ; [.20A5.0020.0002.1C23] # LEPCHA LETTER A
+1C36 ; [.20A6.0020.0002.1C36] # LEPCHA SIGN RAN
+1C26 ; [.20A7.0020.0002.1C26] # LEPCHA VOWEL SIGN AA
+1C27 ; [.20A8.0020.0002.1C27] # LEPCHA VOWEL SIGN I
+1C28 ; [.20A9.0020.0002.1C28] # LEPCHA VOWEL SIGN O
+1C29 ; [.20AA.0020.0002.1C29] # LEPCHA VOWEL SIGN OO
+1C2A ; [.20AB.0020.0002.1C2A] # LEPCHA VOWEL SIGN U
+1C2B ; [.20AC.0020.0002.1C2B] # LEPCHA VOWEL SIGN UU
+1C2C ; [.20AD.0020.0002.1C2C] # LEPCHA VOWEL SIGN E
+1C2D ; [.20AE.0020.0002.1C2D] # LEPCHA CONSONANT SIGN K
+1C2E ; [.20AF.0020.0002.1C2E] # LEPCHA CONSONANT SIGN M
+1C2F ; [.20B0.0020.0002.1C2F] # LEPCHA CONSONANT SIGN L
+1C30 ; [.20B1.0020.0002.1C30] # LEPCHA CONSONANT SIGN N
+1C31 ; [.20B2.0020.0002.1C31] # LEPCHA CONSONANT SIGN P
+1C32 ; [.20B3.0020.0002.1C32] # LEPCHA CONSONANT SIGN R
+1C33 ; [.20B4.0020.0002.1C33] # LEPCHA CONSONANT SIGN T
+1C34 ; [.20B5.0020.0002.1C34] # LEPCHA CONSONANT SIGN NYIN-DO
+1C35 ; [.20B6.0020.0002.1C35] # LEPCHA CONSONANT SIGN KANG
+A840 ; [.20B7.0020.0002.A840] # PHAGS-PA LETTER KA
+A841 ; [.20B8.0020.0002.A841] # PHAGS-PA LETTER KHA
+A842 ; [.20B9.0020.0002.A842] # PHAGS-PA LETTER GA
+A843 ; [.20BA.0020.0002.A843] # PHAGS-PA LETTER NGA
+A844 ; [.20BB.0020.0002.A844] # PHAGS-PA LETTER CA
+A845 ; [.20BC.0020.0002.A845] # PHAGS-PA LETTER CHA
+A846 ; [.20BD.0020.0002.A846] # PHAGS-PA LETTER JA
+A847 ; [.20BE.0020.0002.A847] # PHAGS-PA LETTER NYA
+A869 ; [.20BF.0020.0002.A869] # PHAGS-PA LETTER TTA
+A86A ; [.20C0.0020.0002.A86A] # PHAGS-PA LETTER TTHA
+A86B ; [.20C1.0020.0002.A86B] # PHAGS-PA LETTER DDA
+A86C ; [.20C2.0020.0002.A86C] # PHAGS-PA LETTER NNA
+A848 ; [.20C3.0020.0002.A848] # PHAGS-PA LETTER TA
+A849 ; [.20C4.0020.0002.A849] # PHAGS-PA LETTER THA
+A84A ; [.20C5.0020.0002.A84A] # PHAGS-PA LETTER DA
+A84B ; [.20C6.0020.0002.A84B] # PHAGS-PA LETTER NA
+A84C ; [.20C7.0020.0002.A84C] # PHAGS-PA LETTER PA
+A84D ; [.20C8.0020.0002.A84D] # PHAGS-PA LETTER PHA
+A84E ; [.20C9.0020.0002.A84E] # PHAGS-PA LETTER BA
+A84F ; [.20CA.0020.0002.A84F] # PHAGS-PA LETTER MA
+A850 ; [.20CB.0020.0002.A850] # PHAGS-PA LETTER TSA
+A851 ; [.20CC.0020.0002.A851] # PHAGS-PA LETTER TSHA
+A852 ; [.20CD.0020.0002.A852] # PHAGS-PA LETTER DZA
+A853 ; [.20CE.0020.0002.A853] # PHAGS-PA LETTER WA
+A867 ; [.20CF.0020.0002.A867] # PHAGS-PA SUBJOINED LETTER WA
+A854 ; [.20D0.0020.0002.A854] # PHAGS-PA LETTER ZHA
+A855 ; [.20D1.0020.0002.A855] # PHAGS-PA LETTER ZA
+A856 ; [.20D2.0020.0002.A856] # PHAGS-PA LETTER SMALL A
+A857 ; [.20D3.0020.0002.A857] # PHAGS-PA LETTER YA
+A868 ; [.20D4.0020.0002.A868] # PHAGS-PA SUBJOINED LETTER YA
+A86D ; [.20D5.0020.0002.A86D] # PHAGS-PA LETTER ALTERNATE YA
+A858 ; [.20D6.0020.0002.A858] # PHAGS-PA LETTER RA
+A871 ; [.20D7.0020.0002.A871] # PHAGS-PA SUBJOINED LETTER RA
+A872 ; [.20D8.0020.0002.A872] # PHAGS-PA SUPERFIXED LETTER RA
+A859 ; [.20D9.0020.0002.A859] # PHAGS-PA LETTER LA
+A85A ; [.20DA.0020.0002.A85A] # PHAGS-PA LETTER SHA
+A86E ; [.20DB.0020.0002.A86E] # PHAGS-PA LETTER VOICELESS SHA
+A85B ; [.20DC.0020.0002.A85B] # PHAGS-PA LETTER SA
+A85C ; [.20DD.0020.0002.A85C] # PHAGS-PA LETTER HA
+A86F ; [.20DE.0020.0002.A86F] # PHAGS-PA LETTER VOICED HA
+A870 ; [.20DF.0020.0002.A870] # PHAGS-PA LETTER ASPIRATED FA
+A85D ; [.20E0.0020.0002.A85D] # PHAGS-PA LETTER A
+A862 ; [.20E1.0020.0002.A862] # PHAGS-PA LETTER QA
+A863 ; [.20E2.0020.0002.A863] # PHAGS-PA LETTER XA
+A864 ; [.20E3.0020.0002.A864] # PHAGS-PA LETTER FA
+A865 ; [.20E4.0020.0002.A865] # PHAGS-PA LETTER GGA
+A85E ; [.20E5.0020.0002.A85E] # PHAGS-PA LETTER I
+A85F ; [.20E6.0020.0002.A85F] # PHAGS-PA LETTER U
+A860 ; [.20E7.0020.0002.A860] # PHAGS-PA LETTER E
+A861 ; [.20E8.0020.0002.A861] # PHAGS-PA LETTER O
+A866 ; [.20E9.0020.0002.A866] # PHAGS-PA LETTER EE
+A873 ; [.20EA.0020.0002.A873] # PHAGS-PA LETTER CANDRABINDU
+1900 ; [.20EB.0020.0002.1900] # LIMBU VOWEL-CARRIER LETTER
+1901 ; [.20EC.0020.0002.1901] # LIMBU LETTER KA
+1902 ; [.20ED.0020.0002.1902] # LIMBU LETTER KHA
+1903 ; [.20EE.0020.0002.1903] # LIMBU LETTER GA
+1904 ; [.20EF.0020.0002.1904] # LIMBU LETTER GHA
+1905 ; [.20F0.0020.0002.1905] # LIMBU LETTER NGA
+1906 ; [.20F1.0020.0002.1906] # LIMBU LETTER CA
+1907 ; [.20F2.0020.0002.1907] # LIMBU LETTER CHA
+1908 ; [.20F3.0020.0002.1908] # LIMBU LETTER JA
+1909 ; [.20F4.0020.0002.1909] # LIMBU LETTER JHA
+190A ; [.20F5.0020.0002.190A] # LIMBU LETTER YAN
+190B ; [.20F6.0020.0002.190B] # LIMBU LETTER TA
+190C ; [.20F7.0020.0002.190C] # LIMBU LETTER THA
+190D ; [.20F8.0020.0002.190D] # LIMBU LETTER DA
+190E ; [.20F9.0020.0002.190E] # LIMBU LETTER DHA
+190F ; [.20FA.0020.0002.190F] # LIMBU LETTER NA
+1910 ; [.20FB.0020.0002.1910] # LIMBU LETTER PA
+1911 ; [.20FC.0020.0002.1911] # LIMBU LETTER PHA
+1912 ; [.20FD.0020.0002.1912] # LIMBU LETTER BA
+1913 ; [.20FE.0020.0002.1913] # LIMBU LETTER BHA
+1914 ; [.20FF.0020.0002.1914] # LIMBU LETTER MA
+1915 ; [.2100.0020.0002.1915] # LIMBU LETTER YA
+1916 ; [.2101.0020.0002.1916] # LIMBU LETTER RA
+1917 ; [.2102.0020.0002.1917] # LIMBU LETTER LA
+1918 ; [.2103.0020.0002.1918] # LIMBU LETTER WA
+1919 ; [.2104.0020.0002.1919] # LIMBU LETTER SHA
+191A ; [.2105.0020.0002.191A] # LIMBU LETTER SSA
+191B ; [.2106.0020.0002.191B] # LIMBU LETTER SA
+191C ; [.2107.0020.0002.191C] # LIMBU LETTER HA
+1920 ; [.2108.0020.0002.1920] # LIMBU VOWEL SIGN A
+1921 ; [.2109.0020.0002.1921] # LIMBU VOWEL SIGN I
+1922 ; [.210A.0020.0002.1922] # LIMBU VOWEL SIGN U
+1923 ; [.210B.0020.0002.1923] # LIMBU VOWEL SIGN EE
+1924 ; [.210C.0020.0002.1924] # LIMBU VOWEL SIGN AI
+1925 ; [.210D.0020.0002.1925] # LIMBU VOWEL SIGN OO
+1926 ; [.210E.0020.0002.1926] # LIMBU VOWEL SIGN AU
+1927 ; [.210F.0020.0002.1927] # LIMBU VOWEL SIGN E
+1928 ; [.2110.0020.0002.1928] # LIMBU VOWEL SIGN O
+1929 ; [.2111.0020.0002.1929] # LIMBU SUBJOINED LETTER YA
+192A ; [.2112.0020.0002.192A] # LIMBU SUBJOINED LETTER RA
+192B ; [.2113.0020.0002.192B] # LIMBU SUBJOINED LETTER WA
+1930 ; [.2114.0020.0002.1930] # LIMBU SMALL LETTER KA
+1931 ; [.2115.0020.0002.1931] # LIMBU SMALL LETTER NGA
+1932 ; [.2116.0020.0002.1932] # LIMBU SMALL LETTER ANUSVARA
+1933 ; [.2117.0020.0002.1933] # LIMBU SMALL LETTER TA
+1934 ; [.2118.0020.0002.1934] # LIMBU SMALL LETTER NA
+1935 ; [.2119.0020.0002.1935] # LIMBU SMALL LETTER PA
+1936 ; [.211A.0020.0002.1936] # LIMBU SMALL LETTER MA
+1937 ; [.211B.0020.0002.1937] # LIMBU SMALL LETTER RA
+1938 ; [.211C.0020.0002.1938] # LIMBU SMALL LETTER LA
+1700 ; [.211D.0020.0002.1700] # TAGALOG LETTER A
+1701 ; [.211E.0020.0002.1701] # TAGALOG LETTER I
+1702 ; [.211F.0020.0002.1702] # TAGALOG LETTER U
+1703 ; [.2120.0020.0002.1703] # TAGALOG LETTER KA
+1704 ; [.2121.0020.0002.1704] # TAGALOG LETTER GA
+1705 ; [.2122.0020.0002.1705] # TAGALOG LETTER NGA
+1706 ; [.2123.0020.0002.1706] # TAGALOG LETTER TA
+1707 ; [.2124.0020.0002.1707] # TAGALOG LETTER DA
+1708 ; [.2125.0020.0002.1708] # TAGALOG LETTER NA
+1709 ; [.2126.0020.0002.1709] # TAGALOG LETTER PA
+170A ; [.2127.0020.0002.170A] # TAGALOG LETTER BA
+170B ; [.2128.0020.0002.170B] # TAGALOG LETTER MA
+170C ; [.2129.0020.0002.170C] # TAGALOG LETTER YA
+170E ; [.212A.0020.0002.170E] # TAGALOG LETTER LA
+170F ; [.212B.0020.0002.170F] # TAGALOG LETTER WA
+1710 ; [.212C.0020.0002.1710] # TAGALOG LETTER SA
+1711 ; [.212D.0020.0002.1711] # TAGALOG LETTER HA
+1712 ; [.212E.0020.0002.1712] # TAGALOG VOWEL SIGN I
+1713 ; [.212F.0020.0002.1713] # TAGALOG VOWEL SIGN U
+1714 ; [.2130.0020.0002.1714] # TAGALOG SIGN VIRAMA
+1720 ; [.2131.0020.0002.1720] # HANUNOO LETTER A
+1721 ; [.2132.0020.0002.1721] # HANUNOO LETTER I
+1722 ; [.2133.0020.0002.1722] # HANUNOO LETTER U
+1723 ; [.2134.0020.0002.1723] # HANUNOO LETTER KA
+1724 ; [.2135.0020.0002.1724] # HANUNOO LETTER GA
+1725 ; [.2136.0020.0002.1725] # HANUNOO LETTER NGA
+1726 ; [.2137.0020.0002.1726] # HANUNOO LETTER TA
+1727 ; [.2138.0020.0002.1727] # HANUNOO LETTER DA
+1728 ; [.2139.0020.0002.1728] # HANUNOO LETTER NA
+1729 ; [.213A.0020.0002.1729] # HANUNOO LETTER PA
+172A ; [.213B.0020.0002.172A] # HANUNOO LETTER BA
+172B ; [.213C.0020.0002.172B] # HANUNOO LETTER MA
+172C ; [.213D.0020.0002.172C] # HANUNOO LETTER YA
+172D ; [.213E.0020.0002.172D] # HANUNOO LETTER RA
+172E ; [.213F.0020.0002.172E] # HANUNOO LETTER LA
+172F ; [.2140.0020.0002.172F] # HANUNOO LETTER WA
+1730 ; [.2141.0020.0002.1730] # HANUNOO LETTER SA
+1731 ; [.2142.0020.0002.1731] # HANUNOO LETTER HA
+1732 ; [.2143.0020.0002.1732] # HANUNOO VOWEL SIGN I
+1733 ; [.2144.0020.0002.1733] # HANUNOO VOWEL SIGN U
+1734 ; [.2145.0020.0002.1734] # HANUNOO SIGN PAMUDPOD
+1740 ; [.2146.0020.0002.1740] # BUHID LETTER A
+1741 ; [.2147.0020.0002.1741] # BUHID LETTER I
+1742 ; [.2148.0020.0002.1742] # BUHID LETTER U
+1743 ; [.2149.0020.0002.1743] # BUHID LETTER KA
+1744 ; [.214A.0020.0002.1744] # BUHID LETTER GA
+1745 ; [.214B.0020.0002.1745] # BUHID LETTER NGA
+1746 ; [.214C.0020.0002.1746] # BUHID LETTER TA
+1747 ; [.214D.0020.0002.1747] # BUHID LETTER DA
+1748 ; [.214E.0020.0002.1748] # BUHID LETTER NA
+1749 ; [.214F.0020.0002.1749] # BUHID LETTER PA
+174A ; [.2150.0020.0002.174A] # BUHID LETTER BA
+174B ; [.2151.0020.0002.174B] # BUHID LETTER MA
+174C ; [.2152.0020.0002.174C] # BUHID LETTER YA
+174D ; [.2153.0020.0002.174D] # BUHID LETTER RA
+174E ; [.2154.0020.0002.174E] # BUHID LETTER LA
+174F ; [.2155.0020.0002.174F] # BUHID LETTER WA
+1750 ; [.2156.0020.0002.1750] # BUHID LETTER SA
+1751 ; [.2157.0020.0002.1751] # BUHID LETTER HA
+1752 ; [.2158.0020.0002.1752] # BUHID VOWEL SIGN I
+1753 ; [.2159.0020.0002.1753] # BUHID VOWEL SIGN U
+1760 ; [.215A.0020.0002.1760] # TAGBANWA LETTER A
+1761 ; [.215B.0020.0002.1761] # TAGBANWA LETTER I
+1762 ; [.215C.0020.0002.1762] # TAGBANWA LETTER U
+1763 ; [.215D.0020.0002.1763] # TAGBANWA LETTER KA
+1764 ; [.215E.0020.0002.1764] # TAGBANWA LETTER GA
+1765 ; [.215F.0020.0002.1765] # TAGBANWA LETTER NGA
+1766 ; [.2160.0020.0002.1766] # TAGBANWA LETTER TA
+1767 ; [.2161.0020.0002.1767] # TAGBANWA LETTER DA
+1768 ; [.2162.0020.0002.1768] # TAGBANWA LETTER NA
+1769 ; [.2163.0020.0002.1769] # TAGBANWA LETTER PA
+176A ; [.2164.0020.0002.176A] # TAGBANWA LETTER BA
+176B ; [.2165.0020.0002.176B] # TAGBANWA LETTER MA
+176C ; [.2166.0020.0002.176C] # TAGBANWA LETTER YA
+176E ; [.2167.0020.0002.176E] # TAGBANWA LETTER LA
+176F ; [.2168.0020.0002.176F] # TAGBANWA LETTER WA
+1770 ; [.2169.0020.0002.1770] # TAGBANWA LETTER SA
+1772 ; [.216A.0020.0002.1772] # TAGBANWA VOWEL SIGN I
+1773 ; [.216B.0020.0002.1773] # TAGBANWA VOWEL SIGN U
+1A00 ; [.216C.0020.0002.1A00] # BUGINESE LETTER KA
+1A01 ; [.216D.0020.0002.1A01] # BUGINESE LETTER GA
+1A02 ; [.216E.0020.0002.1A02] # BUGINESE LETTER NGA
+1A03 ; [.216F.0020.0002.1A03] # BUGINESE LETTER NGKA
+1A04 ; [.2170.0020.0002.1A04] # BUGINESE LETTER PA
+1A05 ; [.2171.0020.0002.1A05] # BUGINESE LETTER BA
+1A06 ; [.2172.0020.0002.1A06] # BUGINESE LETTER MA
+1A07 ; [.2173.0020.0002.1A07] # BUGINESE LETTER MPA
+1A08 ; [.2174.0020.0002.1A08] # BUGINESE LETTER TA
+1A09 ; [.2175.0020.0002.1A09] # BUGINESE LETTER DA
+1A0A ; [.2176.0020.0002.1A0A] # BUGINESE LETTER NA
+1A0B ; [.2177.0020.0002.1A0B] # BUGINESE LETTER NRA
+1A0C ; [.2178.0020.0002.1A0C] # BUGINESE LETTER CA
+1A0D ; [.2179.0020.0002.1A0D] # BUGINESE LETTER JA
+1A0E ; [.217A.0020.0002.1A0E] # BUGINESE LETTER NYA
+1A0F ; [.217B.0020.0002.1A0F] # BUGINESE LETTER NYCA
+1A10 ; [.217C.0020.0002.1A10] # BUGINESE LETTER YA
+1A11 ; [.217D.0020.0002.1A11] # BUGINESE LETTER RA
+1A12 ; [.217E.0020.0002.1A12] # BUGINESE LETTER LA
+1A13 ; [.217F.0020.0002.1A13] # BUGINESE LETTER VA
+1A14 ; [.2180.0020.0002.1A14] # BUGINESE LETTER SA
+1A15 ; [.2181.0020.0002.1A15] # BUGINESE LETTER A
+1A16 ; [.2182.0020.0002.1A16] # BUGINESE LETTER HA
+1A17 ; [.2183.0020.0002.1A17] # BUGINESE VOWEL SIGN I
+1A18 ; [.2184.0020.0002.1A18] # BUGINESE VOWEL SIGN U
+1A19 ; [.2185.0020.0002.1A19] # BUGINESE VOWEL SIGN E
+1A1A ; [.2186.0020.0002.1A1A] # BUGINESE VOWEL SIGN O
+1A1B ; [.2187.0020.0002.1A1B] # BUGINESE VOWEL SIGN AE
+A930 ; [.2188.0020.0002.A930] # REJANG LETTER KA
+A931 ; [.2189.0020.0002.A931] # REJANG LETTER GA
+A932 ; [.218A.0020.0002.A932] # REJANG LETTER NGA
+A933 ; [.218B.0020.0002.A933] # REJANG LETTER TA
+A934 ; [.218C.0020.0002.A934] # REJANG LETTER DA
+A935 ; [.218D.0020.0002.A935] # REJANG LETTER NA
+A936 ; [.218E.0020.0002.A936] # REJANG LETTER PA
+A937 ; [.218F.0020.0002.A937] # REJANG LETTER BA
+A938 ; [.2190.0020.0002.A938] # REJANG LETTER MA
+A939 ; [.2191.0020.0002.A939] # REJANG LETTER CA
+A93A ; [.2192.0020.0002.A93A] # REJANG LETTER JA
+A93B ; [.2193.0020.0002.A93B] # REJANG LETTER NYA
+A93C ; [.2194.0020.0002.A93C] # REJANG LETTER SA
+A93D ; [.2195.0020.0002.A93D] # REJANG LETTER RA
+A93E ; [.2196.0020.0002.A93E] # REJANG LETTER LA
+A93F ; [.2197.0020.0002.A93F] # REJANG LETTER YA
+A940 ; [.2198.0020.0002.A940] # REJANG LETTER WA
+A941 ; [.2199.0020.0002.A941] # REJANG LETTER HA
+A942 ; [.219A.0020.0002.A942] # REJANG LETTER MBA
+A943 ; [.219B.0020.0002.A943] # REJANG LETTER NGGA
+A944 ; [.219C.0020.0002.A944] # REJANG LETTER NDA
+A945 ; [.219D.0020.0002.A945] # REJANG LETTER NYJA
+A946 ; [.219E.0020.0002.A946] # REJANG LETTER A
+A947 ; [.219F.0020.0002.A947] # REJANG VOWEL SIGN I
+A948 ; [.21A0.0020.0002.A948] # REJANG VOWEL SIGN U
+A949 ; [.21A1.0020.0002.A949] # REJANG VOWEL SIGN E
+A94A ; [.21A2.0020.0002.A94A] # REJANG VOWEL SIGN AI
+A94B ; [.21A3.0020.0002.A94B] # REJANG VOWEL SIGN O
+A94C ; [.21A4.0020.0002.A94C] # REJANG VOWEL SIGN AU
+A94D ; [.21A5.0020.0002.A94D] # REJANG VOWEL SIGN EU
+A94E ; [.21A6.0020.0002.A94E] # REJANG VOWEL SIGN EA
+A94F ; [.21A7.0020.0002.A94F] # REJANG CONSONANT SIGN NG
+A950 ; [.21A8.0020.0002.A950] # REJANG CONSONANT SIGN N
+A951 ; [.21A9.0020.0002.A951] # REJANG CONSONANT SIGN R
+A952 ; [.21AA.0020.0002.A952] # REJANG CONSONANT SIGN H
+A953 ; [.21AB.0020.0002.A953] # REJANG VIRAMA
+A90A ; [.21AC.0020.0002.A90A] # KAYAH LI LETTER KA
+A90B ; [.21AD.0020.0002.A90B] # KAYAH LI LETTER KHA
+A90C ; [.21AE.0020.0002.A90C] # KAYAH LI LETTER GA
+A90D ; [.21AF.0020.0002.A90D] # KAYAH LI LETTER NGA
+A90E ; [.21B0.0020.0002.A90E] # KAYAH LI LETTER SA
+A90F ; [.21B1.0020.0002.A90F] # KAYAH LI LETTER SHA
+A910 ; [.21B2.0020.0002.A910] # KAYAH LI LETTER ZA
+A911 ; [.21B3.0020.0002.A911] # KAYAH LI LETTER NYA
+A912 ; [.21B4.0020.0002.A912] # KAYAH LI LETTER TA
+A913 ; [.21B5.0020.0002.A913] # KAYAH LI LETTER HTA
+A914 ; [.21B6.0020.0002.A914] # KAYAH LI LETTER NA
+A915 ; [.21B7.0020.0002.A915] # KAYAH LI LETTER PA
+A916 ; [.21B8.0020.0002.A916] # KAYAH LI LETTER PHA
+A917 ; [.21B9.0020.0002.A917] # KAYAH LI LETTER MA
+A918 ; [.21BA.0020.0002.A918] # KAYAH LI LETTER DA
+A919 ; [.21BB.0020.0002.A919] # KAYAH LI LETTER BA
+A91A ; [.21BC.0020.0002.A91A] # KAYAH LI LETTER RA
+A91B ; [.21BD.0020.0002.A91B] # KAYAH LI LETTER YA
+A91C ; [.21BE.0020.0002.A91C] # KAYAH LI LETTER LA
+A91D ; [.21BF.0020.0002.A91D] # KAYAH LI LETTER WA
+A91E ; [.21C0.0020.0002.A91E] # KAYAH LI LETTER THA
+A91F ; [.21C1.0020.0002.A91F] # KAYAH LI LETTER HA
+A920 ; [.21C2.0020.0002.A920] # KAYAH LI LETTER VA
+A921 ; [.21C3.0020.0002.A921] # KAYAH LI LETTER CA
+A922 ; [.21C4.0020.0002.A922] # KAYAH LI LETTER A
+A923 ; [.21C5.0020.0002.A923] # KAYAH LI LETTER OE
+A924 ; [.21C6.0020.0002.A924] # KAYAH LI LETTER I
+A925 ; [.21C7.0020.0002.A925] # KAYAH LI LETTER OO
+A926 ; [.21C8.0020.0002.A926] # KAYAH LI VOWEL UE
+A927 ; [.21C9.0020.0002.A927] # KAYAH LI VOWEL E
+A928 ; [.21CA.0020.0002.A928] # KAYAH LI VOWEL U
+A929 ; [.21CB.0020.0002.A929] # KAYAH LI VOWEL EE
+A92A ; [.21CC.0020.0002.A92A] # KAYAH LI VOWEL O
+1000 ; [.21CD.0020.0002.1000] # MYANMAR LETTER KA
+1075 ; [.21CE.0020.0002.1075] # MYANMAR LETTER SHAN KA
+1001 ; [.21CF.0020.0002.1001] # MYANMAR LETTER KHA
+1076 ; [.21D0.0020.0002.1076] # MYANMAR LETTER SHAN KHA
+1002 ; [.21D1.0020.0002.1002] # MYANMAR LETTER GA
+1077 ; [.21D2.0020.0002.1077] # MYANMAR LETTER SHAN GA
+AA60 ; [.21D3.0020.0002.AA60] # MYANMAR LETTER KHAMTI GA
+1003 ; [.21D4.0020.0002.1003] # MYANMAR LETTER GHA
+1004 ; [.21D5.0020.0002.1004] # MYANMAR LETTER NGA
+105A ; [.21D6.0020.0002.105A] # MYANMAR LETTER MON NGA
+1005 ; [.21D7.0020.0002.1005] # MYANMAR LETTER CA
+1078 ; [.21D8.0020.0002.1078] # MYANMAR LETTER SHAN CA
+AA61 ; [.21D9.0020.0002.AA61] # MYANMAR LETTER KHAMTI CA
+1006 ; [.21DA.0020.0002.1006] # MYANMAR LETTER CHA
+AA62 ; [.21DB.0020.0002.AA62] # MYANMAR LETTER KHAMTI CHA
+1007 ; [.21DC.0020.0002.1007] # MYANMAR LETTER JA
+AA63 ; [.21DD.0020.0002.AA63] # MYANMAR LETTER KHAMTI JA
+1079 ; [.21DE.0020.0002.1079] # MYANMAR LETTER SHAN ZA
+AA72 ; [.21DF.0020.0002.AA72] # MYANMAR LETTER KHAMTI ZA
+1008 ; [.21E0.0020.0002.1008] # MYANMAR LETTER JHA
+105B ; [.21E1.0020.0002.105B] # MYANMAR LETTER MON JHA
+AA64 ; [.21E2.0020.0002.AA64] # MYANMAR LETTER KHAMTI JHA
+1061 ; [.21E3.0020.0002.1061] # MYANMAR LETTER SGAW KAREN SHA
+1009 ; [.21E4.0020.0002.1009] # MYANMAR LETTER NYA
+107A ; [.21E5.0020.0002.107A] # MYANMAR LETTER SHAN NYA
+AA65 ; [.21E6.0020.0002.AA65] # MYANMAR LETTER KHAMTI NYA
+100A ; [.21E7.0020.0002.100A] # MYANMAR LETTER NNYA
+100B ; [.21E8.0020.0002.100B] # MYANMAR LETTER TTA
+AA66 ; [.21E9.0020.0002.AA66] # MYANMAR LETTER KHAMTI TTA
+100C ; [.21EA.0020.0002.100C] # MYANMAR LETTER TTHA
+AA67 ; [.21EB.0020.0002.AA67] # MYANMAR LETTER KHAMTI TTHA
+100D ; [.21EC.0020.0002.100D] # MYANMAR LETTER DDA
+AA68 ; [.21ED.0020.0002.AA68] # MYANMAR LETTER KHAMTI DDA
+100E ; [.21EE.0020.0002.100E] # MYANMAR LETTER DDHA
+AA69 ; [.21EF.0020.0002.AA69] # MYANMAR LETTER KHAMTI DDHA
+100F ; [.21F0.0020.0002.100F] # MYANMAR LETTER NNA
+106E ; [.21F1.0020.0002.106E] # MYANMAR LETTER EASTERN PWO KAREN NNA
+1010 ; [.21F2.0020.0002.1010] # MYANMAR LETTER TA
+1011 ; [.21F3.0020.0002.1011] # MYANMAR LETTER THA
+1012 ; [.21F4.0020.0002.1012] # MYANMAR LETTER DA
+107B ; [.21F5.0020.0002.107B] # MYANMAR LETTER SHAN DA
+1013 ; [.21F6.0020.0002.1013] # MYANMAR LETTER DHA
+AA6A ; [.21F7.0020.0002.AA6A] # MYANMAR LETTER KHAMTI DHA
+1014 ; [.21F8.0020.0002.1014] # MYANMAR LETTER NA
+107C ; [.21F9.0020.0002.107C] # MYANMAR LETTER SHAN NA
+AA6B ; [.21FA.0020.0002.AA6B] # MYANMAR LETTER KHAMTI NA
+105E ; [.21FB.0020.0002.105E] # MYANMAR CONSONANT SIGN MON MEDIAL NA
+1015 ; [.21FC.0020.0002.1015] # MYANMAR LETTER PA
+1016 ; [.21FD.0020.0002.1016] # MYANMAR LETTER PHA
+107D ; [.21FE.0020.0002.107D] # MYANMAR LETTER SHAN PHA
+107E ; [.21FF.0020.0002.107E] # MYANMAR LETTER SHAN FA
+AA6F ; [.2200.0020.0002.AA6F] # MYANMAR LETTER KHAMTI FA
+108E ; [.2201.0020.0002.108E] # MYANMAR LETTER RUMAI PALAUNG FA
+1017 ; [.2202.0020.0002.1017] # MYANMAR LETTER BA
+107F ; [.2203.0020.0002.107F] # MYANMAR LETTER SHAN BA
+1018 ; [.2204.0020.0002.1018] # MYANMAR LETTER BHA
+1019 ; [.2205.0020.0002.1019] # MYANMAR LETTER MA
+105F ; [.2206.0020.0002.105F] # MYANMAR CONSONANT SIGN MON MEDIAL MA
+101A ; [.2207.0020.0002.101A] # MYANMAR LETTER YA
+103B ; [.2208.0020.0002.103B] # MYANMAR CONSONANT SIGN MEDIAL YA
+101B ; [.2209.0020.0002.101B] # MYANMAR LETTER RA
+AA73 ; [.220A.0020.0002.AA73] # MYANMAR LETTER KHAMTI RA
+AA7A ; [.220B.0020.0002.AA7A] # MYANMAR LETTER AITON RA
+103C ; [.220C.0020.0002.103C] # MYANMAR CONSONANT SIGN MEDIAL RA
+101C ; [.220D.0020.0002.101C] # MYANMAR LETTER LA
+1060 ; [.220E.0020.0002.1060] # MYANMAR CONSONANT SIGN MON MEDIAL LA
+101D ; [.220F.0020.0002.101D] # MYANMAR LETTER WA
+103D ; [.2210.0020.0002.103D] # MYANMAR CONSONANT SIGN MEDIAL WA
+1082 ; [.2211.0020.0002.1082] # MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1080 ; [.2212.0020.0002.1080] # MYANMAR LETTER SHAN THA
+1050 ; [.2213.0020.0002.1050] # MYANMAR LETTER SHA
+1051 ; [.2214.0020.0002.1051] # MYANMAR LETTER SSA
+1065 ; [.2215.0020.0002.1065] # MYANMAR LETTER WESTERN PWO KAREN THA
+101E ; [.2216.0020.0002.101E] # MYANMAR LETTER SA
+103F ; [.2216.0020.0004.103F][.224D.0020.0004.103F][.2216.0020.001F.103F] # MYANMAR LETTER GREAT SA; QQKN
+AA6C ; [.2217.0020.0002.AA6C] # MYANMAR LETTER KHAMTI SA
+101F ; [.2218.0020.0002.101F] # MYANMAR LETTER HA
+1081 ; [.2219.0020.0002.1081] # MYANMAR LETTER SHAN HA
+AA6D ; [.221A.0020.0002.AA6D] # MYANMAR LETTER KHAMTI HA
+103E ; [.221B.0020.0002.103E] # MYANMAR CONSONANT SIGN MEDIAL HA
+AA6E ; [.221C.0020.0002.AA6E] # MYANMAR LETTER KHAMTI HHA
+AA71 ; [.221D.0020.0002.AA71] # MYANMAR LETTER KHAMTI XA
+1020 ; [.221E.0020.0002.1020] # MYANMAR LETTER LLA
+105C ; [.221F.0020.0002.105C] # MYANMAR LETTER MON BBA
+105D ; [.2220.0020.0002.105D] # MYANMAR LETTER MON BBE
+106F ; [.2221.0020.0002.106F] # MYANMAR LETTER EASTERN PWO KAREN YWA
+1070 ; [.2222.0020.0002.1070] # MYANMAR LETTER EASTERN PWO KAREN GHWA
+1066 ; [.2223.0020.0002.1066] # MYANMAR LETTER WESTERN PWO KAREN PWA
+1021 ; [.2224.0020.0002.1021] # MYANMAR LETTER A
+1022 ; [.2225.0020.0002.1022] # MYANMAR LETTER SHAN A
+1023 ; [.2226.0020.0002.1023] # MYANMAR LETTER I
+1024 ; [.2227.0020.0002.1024] # MYANMAR LETTER II
+1025 ; [.2228.0020.0002.1025] # MYANMAR LETTER U
+1026 ; [.2229.0020.0002.1026] # MYANMAR LETTER UU
+1025 102E ; [.2229.0020.0002.1026] # MYANMAR LETTER UU
+1052 ; [.222A.0020.0002.1052] # MYANMAR LETTER VOCALIC R
+1053 ; [.222B.0020.0002.1053] # MYANMAR LETTER VOCALIC RR
+1054 ; [.222C.0020.0002.1054] # MYANMAR LETTER VOCALIC L
+1055 ; [.222D.0020.0002.1055] # MYANMAR LETTER VOCALIC LL
+1027 ; [.222E.0020.0002.1027] # MYANMAR LETTER E
+1028 ; [.222F.0020.0002.1028] # MYANMAR LETTER MON E
+1029 ; [.2230.0020.0002.1029] # MYANMAR LETTER O
+102A ; [.2231.0020.0002.102A] # MYANMAR LETTER AU
+102C ; [.2232.0020.0002.102C] # MYANMAR VOWEL SIGN AA
+102B ; [.2232.0020.0004.102B] # MYANMAR VOWEL SIGN TALL AA; QQK
+1083 ; [.2233.0020.0002.1083] # MYANMAR VOWEL SIGN SHAN AA
+1072 ; [.2234.0020.0002.1072] # MYANMAR VOWEL SIGN KAYAH OE
+109C ; [.2235.0020.0002.109C] # MYANMAR VOWEL SIGN AITON A
+102D ; [.2236.0020.0002.102D] # MYANMAR VOWEL SIGN I
+1071 ; [.2237.0020.0002.1071] # MYANMAR VOWEL SIGN GEBA KAREN I
+102E ; [.2238.0020.0002.102E] # MYANMAR VOWEL SIGN II
+1033 ; [.2239.0020.0002.1033] # MYANMAR VOWEL SIGN MON II
+102F ; [.223A.0020.0002.102F] # MYANMAR VOWEL SIGN U
+1073 ; [.223B.0020.0002.1073] # MYANMAR VOWEL SIGN KAYAH U
+1074 ; [.223C.0020.0002.1074] # MYANMAR VOWEL SIGN KAYAH EE
+1030 ; [.223D.0020.0002.1030] # MYANMAR VOWEL SIGN UU
+1056 ; [.223E.0020.0002.1056] # MYANMAR VOWEL SIGN VOCALIC R
+1057 ; [.223F.0020.0002.1057] # MYANMAR VOWEL SIGN VOCALIC RR
+1058 ; [.2240.0020.0002.1058] # MYANMAR VOWEL SIGN VOCALIC L
+1059 ; [.2241.0020.0002.1059] # MYANMAR VOWEL SIGN VOCALIC LL
+1031 ; [.2242.0020.0002.1031] # MYANMAR VOWEL SIGN E
+1084 ; [.2243.0020.0002.1084] # MYANMAR VOWEL SIGN SHAN E
+1035 ; [.2244.0020.0002.1035] # MYANMAR VOWEL SIGN E ABOVE
+1085 ; [.2245.0020.0002.1085] # MYANMAR VOWEL SIGN SHAN E ABOVE
+1032 ; [.2246.0020.0002.1032] # MYANMAR VOWEL SIGN AI
+109D ; [.2247.0020.0002.109D] # MYANMAR VOWEL SIGN AITON AI
+1034 ; [.2248.0020.0002.1034] # MYANMAR VOWEL SIGN MON O
+1062 ; [.2249.0020.0002.1062] # MYANMAR VOWEL SIGN SGAW KAREN EU
+1067 ; [.224A.0020.0002.1067] # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU
+1068 ; [.224B.0020.0002.1068] # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE
+1086 ; [.224C.0020.0002.1086] # MYANMAR VOWEL SIGN SHAN FINAL Y
+1039 ; [.224D.0020.0002.1039] # MYANMAR SIGN VIRAMA
+103A ; [.224E.0020.0002.103A] # MYANMAR SIGN ASAT
+1063 ; [.224F.0020.0002.1063] # MYANMAR TONE MARK SGAW KAREN HATHI
+1064 ; [.2250.0020.0002.1064] # MYANMAR TONE MARK SGAW KAREN KE PHO
+1069 ; [.2251.0020.0002.1069] # MYANMAR SIGN WESTERN PWO KAREN TONE-1
+106A ; [.2252.0020.0002.106A] # MYANMAR SIGN WESTERN PWO KAREN TONE-2
+106B ; [.2253.0020.0002.106B] # MYANMAR SIGN WESTERN PWO KAREN TONE-3
+106C ; [.2254.0020.0002.106C] # MYANMAR SIGN WESTERN PWO KAREN TONE-4
+106D ; [.2255.0020.0002.106D] # MYANMAR SIGN WESTERN PWO KAREN TONE-5
+1087 ; [.2256.0020.0002.1087] # MYANMAR SIGN SHAN TONE-2
+108B ; [.2257.0020.0002.108B] # MYANMAR SIGN SHAN COUNCIL TONE-2
+1088 ; [.2258.0020.0002.1088] # MYANMAR SIGN SHAN TONE-3
+108C ; [.2259.0020.0002.108C] # MYANMAR SIGN SHAN COUNCIL TONE-3
+1089 ; [.225A.0020.0002.1089] # MYANMAR SIGN SHAN TONE-5
+108A ; [.225B.0020.0002.108A] # MYANMAR SIGN SHAN TONE-6
+108F ; [.225C.0020.0002.108F] # MYANMAR SIGN RUMAI PALAUNG TONE-5
+109A ; [.225D.0020.0002.109A] # MYANMAR SIGN KHAMTI TONE-1
+109B ; [.225E.0020.0002.109B] # MYANMAR SIGN KHAMTI TONE-3
+AA7B ; [.225F.0020.0002.AA7B] # MYANMAR SIGN PAO KAREN TONE
+AA74 ; [.2260.0020.0002.AA74] # MYANMAR LOGOGRAM KHAMTI OAY
+AA75 ; [.2261.0020.0002.AA75] # MYANMAR LOGOGRAM KHAMTI QN
+AA76 ; [.2262.0020.0002.AA76] # MYANMAR LOGOGRAM KHAMTI HM
+1780 ; [.2263.0020.0002.1780] # KHMER LETTER KA
+1781 ; [.2264.0020.0002.1781] # KHMER LETTER KHA
+1782 ; [.2265.0020.0002.1782] # KHMER LETTER KO
+1783 ; [.2266.0020.0002.1783] # KHMER LETTER KHO
+1784 ; [.2267.0020.0002.1784] # KHMER LETTER NGO
+1785 ; [.2268.0020.0002.1785] # KHMER LETTER CA
+1786 ; [.2269.0020.0002.1786] # KHMER LETTER CHA
+1787 ; [.226A.0020.0002.1787] # KHMER LETTER CO
+1788 ; [.226B.0020.0002.1788] # KHMER LETTER CHO
+1789 ; [.226C.0020.0002.1789] # KHMER LETTER NYO
+178A ; [.226D.0020.0002.178A] # KHMER LETTER DA
+178B ; [.226E.0020.0002.178B] # KHMER LETTER TTHA
+178C ; [.226F.0020.0002.178C] # KHMER LETTER DO
+178D ; [.2270.0020.0002.178D] # KHMER LETTER TTHO
+178E ; [.2271.0020.0002.178E] # KHMER LETTER NNO
+178F ; [.2272.0020.0002.178F] # KHMER LETTER TA
+1790 ; [.2273.0020.0002.1790] # KHMER LETTER THA
+1791 ; [.2274.0020.0002.1791] # KHMER LETTER TO
+1792 ; [.2275.0020.0002.1792] # KHMER LETTER THO
+1793 ; [.2276.0020.0002.1793] # KHMER LETTER NO
+1794 ; [.2277.0020.0002.1794] # KHMER LETTER BA
+1795 ; [.2278.0020.0002.1795] # KHMER LETTER PHA
+1796 ; [.2279.0020.0002.1796] # KHMER LETTER PO
+1797 ; [.227A.0020.0002.1797] # KHMER LETTER PHO
+1798 ; [.227B.0020.0002.1798] # KHMER LETTER MO
+1799 ; [.227C.0020.0002.1799] # KHMER LETTER YO
+179A ; [.227D.0020.0002.179A] # KHMER LETTER RO
+179B ; [.227E.0020.0002.179B] # KHMER LETTER LO
+179C ; [.227F.0020.0002.179C] # KHMER LETTER VO
+179D ; [.2280.0020.0002.179D] # KHMER LETTER SHA
+179E ; [.2281.0020.0002.179E] # KHMER LETTER SSO
+179F ; [.2282.0020.0002.179F] # KHMER LETTER SA
+17A0 ; [.2283.0020.0002.17A0] # KHMER LETTER HA
+17A1 ; [.2284.0020.0002.17A1] # KHMER LETTER LA
+17A2 ; [.2285.0020.0002.17A2] # KHMER LETTER QA
+17DC ; [.2286.0020.0002.17DC] # KHMER SIGN AVAKRAHASANYA
+17A3 ; [.2287.0020.0002.17A3] # KHMER INDEPENDENT VOWEL QAQ
+17A4 ; [.2288.0020.0002.17A4] # KHMER INDEPENDENT VOWEL QAA
+17A5 ; [.2289.0020.0002.17A5] # KHMER INDEPENDENT VOWEL QI
+17A6 ; [.228A.0020.0002.17A6] # KHMER INDEPENDENT VOWEL QII
+17A7 ; [.228B.0020.0002.17A7] # KHMER INDEPENDENT VOWEL QU
+17A8 ; [.228C.0020.0002.17A8] # KHMER INDEPENDENT VOWEL QUK
+17A9 ; [.228D.0020.0002.17A9] # KHMER INDEPENDENT VOWEL QUU
+17AA ; [.228E.0020.0002.17AA] # KHMER INDEPENDENT VOWEL QUUV
+17AB ; [.228F.0020.0002.17AB] # KHMER INDEPENDENT VOWEL RY
+17AC ; [.2290.0020.0002.17AC] # KHMER INDEPENDENT VOWEL RYY
+17AD ; [.2291.0020.0002.17AD] # KHMER INDEPENDENT VOWEL LY
+17AE ; [.2292.0020.0002.17AE] # KHMER INDEPENDENT VOWEL LYY
+17AF ; [.2293.0020.0002.17AF] # KHMER INDEPENDENT VOWEL QE
+17B0 ; [.2294.0020.0002.17B0] # KHMER INDEPENDENT VOWEL QAI
+17B1 ; [.2295.0020.0002.17B1] # KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2 ; [.2296.0020.0002.17B2] # KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3 ; [.2297.0020.0002.17B3] # KHMER INDEPENDENT VOWEL QAU
+17B4 ; [.2298.0020.0002.17B4] # KHMER VOWEL INHERENT AQ
+17B5 ; [.2299.0020.0002.17B5] # KHMER VOWEL INHERENT AA
+17B6 ; [.229A.0020.0002.17B6] # KHMER VOWEL SIGN AA
+17B7 ; [.229B.0020.0002.17B7] # KHMER VOWEL SIGN I
+17B8 ; [.229C.0020.0002.17B8] # KHMER VOWEL SIGN II
+17B9 ; [.229D.0020.0002.17B9] # KHMER VOWEL SIGN Y
+17BA ; [.229E.0020.0002.17BA] # KHMER VOWEL SIGN YY
+17BB ; [.229F.0020.0002.17BB] # KHMER VOWEL SIGN U
+17BC ; [.22A0.0020.0002.17BC] # KHMER VOWEL SIGN UU
+17BD ; [.22A1.0020.0002.17BD] # KHMER VOWEL SIGN UA
+17BE ; [.22A2.0020.0002.17BE] # KHMER VOWEL SIGN OE
+17BF ; [.22A3.0020.0002.17BF] # KHMER VOWEL SIGN YA
+17C0 ; [.22A4.0020.0002.17C0] # KHMER VOWEL SIGN IE
+17C1 ; [.22A5.0020.0002.17C1] # KHMER VOWEL SIGN E
+17C2 ; [.22A6.0020.0002.17C2] # KHMER VOWEL SIGN AE
+17C3 ; [.22A7.0020.0002.17C3] # KHMER VOWEL SIGN AI
+17C4 ; [.22A8.0020.0002.17C4] # KHMER VOWEL SIGN OO
+17C5 ; [.22A9.0020.0002.17C5] # KHMER VOWEL SIGN AU
+17D2 ; [.22AA.0020.0002.17D2] # KHMER SIGN COENG
+1950 ; [.22AB.0020.0002.1950] # TAI LE LETTER KA
+1951 ; [.22AC.0020.0002.1951] # TAI LE LETTER XA
+1952 ; [.22AD.0020.0002.1952] # TAI LE LETTER NGA
+1953 ; [.22AE.0020.0002.1953] # TAI LE LETTER TSA
+1954 ; [.22AF.0020.0002.1954] # TAI LE LETTER SA
+1955 ; [.22B0.0020.0002.1955] # TAI LE LETTER YA
+1956 ; [.22B1.0020.0002.1956] # TAI LE LETTER TA
+1957 ; [.22B2.0020.0002.1957] # TAI LE LETTER THA
+1958 ; [.22B3.0020.0002.1958] # TAI LE LETTER LA
+1959 ; [.22B4.0020.0002.1959] # TAI LE LETTER PA
+195A ; [.22B5.0020.0002.195A] # TAI LE LETTER PHA
+195B ; [.22B6.0020.0002.195B] # TAI LE LETTER MA
+195C ; [.22B7.0020.0002.195C] # TAI LE LETTER FA
+195D ; [.22B8.0020.0002.195D] # TAI LE LETTER VA
+195E ; [.22B9.0020.0002.195E] # TAI LE LETTER HA
+195F ; [.22BA.0020.0002.195F] # TAI LE LETTER QA
+1960 ; [.22BB.0020.0002.1960] # TAI LE LETTER KHA
+1961 ; [.22BC.0020.0002.1961] # TAI LE LETTER TSHA
+1962 ; [.22BD.0020.0002.1962] # TAI LE LETTER NA
+1963 ; [.22BE.0020.0002.1963] # TAI LE LETTER A
+1964 ; [.22BF.0020.0002.1964] # TAI LE LETTER I
+1965 ; [.22C0.0020.0002.1965] # TAI LE LETTER EE
+1966 ; [.22C1.0020.0002.1966] # TAI LE LETTER EH
+1967 ; [.22C2.0020.0002.1967] # TAI LE LETTER U
+1968 ; [.22C3.0020.0002.1968] # TAI LE LETTER OO
+1969 ; [.22C4.0020.0002.1969] # TAI LE LETTER O
+196A ; [.22C5.0020.0002.196A] # TAI LE LETTER UE
+196B ; [.22C6.0020.0002.196B] # TAI LE LETTER E
+196C ; [.22C7.0020.0002.196C] # TAI LE LETTER AUE
+196D ; [.22C8.0020.0002.196D] # TAI LE LETTER AI
+1970 ; [.22C9.0020.0002.1970] # TAI LE LETTER TONE-2
+1971 ; [.22CA.0020.0002.1971] # TAI LE LETTER TONE-3
+1972 ; [.22CB.0020.0002.1972] # TAI LE LETTER TONE-4
+1973 ; [.22CC.0020.0002.1973] # TAI LE LETTER TONE-5
+1974 ; [.22CD.0020.0002.1974] # TAI LE LETTER TONE-6
+1980 ; [.22CE.0020.0002.1980] # NEW TAI LUE LETTER HIGH QA
+1981 ; [.22CF.0020.0002.1981] # NEW TAI LUE LETTER LOW QA
+1982 ; [.22D0.0020.0002.1982] # NEW TAI LUE LETTER HIGH KA
+1983 ; [.22D1.0020.0002.1983] # NEW TAI LUE LETTER HIGH XA
+1984 ; [.22D2.0020.0002.1984] # NEW TAI LUE LETTER HIGH NGA
+1985 ; [.22D3.0020.0002.1985] # NEW TAI LUE LETTER LOW KA
+1986 ; [.22D4.0020.0002.1986] # NEW TAI LUE LETTER LOW XA
+1987 ; [.22D5.0020.0002.1987] # NEW TAI LUE LETTER LOW NGA
+1988 ; [.22D6.0020.0002.1988] # NEW TAI LUE LETTER HIGH TSA
+1989 ; [.22D7.0020.0002.1989] # NEW TAI LUE LETTER HIGH SA
+198A ; [.22D8.0020.0002.198A] # NEW TAI LUE LETTER HIGH YA
+198B ; [.22D9.0020.0002.198B] # NEW TAI LUE LETTER LOW TSA
+198C ; [.22DA.0020.0002.198C] # NEW TAI LUE LETTER LOW SA
+198D ; [.22DB.0020.0002.198D] # NEW TAI LUE LETTER LOW YA
+198E ; [.22DC.0020.0002.198E] # NEW TAI LUE LETTER HIGH TA
+198F ; [.22DD.0020.0002.198F] # NEW TAI LUE LETTER HIGH THA
+1990 ; [.22DE.0020.0002.1990] # NEW TAI LUE LETTER HIGH NA
+1991 ; [.22DF.0020.0002.1991] # NEW TAI LUE LETTER LOW TA
+1992 ; [.22E0.0020.0002.1992] # NEW TAI LUE LETTER LOW THA
+1993 ; [.22E1.0020.0002.1993] # NEW TAI LUE LETTER LOW NA
+1994 ; [.22E2.0020.0002.1994] # NEW TAI LUE LETTER HIGH PA
+1995 ; [.22E3.0020.0002.1995] # NEW TAI LUE LETTER HIGH PHA
+1996 ; [.22E4.0020.0002.1996] # NEW TAI LUE LETTER HIGH MA
+1997 ; [.22E5.0020.0002.1997] # NEW TAI LUE LETTER LOW PA
+1998 ; [.22E6.0020.0002.1998] # NEW TAI LUE LETTER LOW PHA
+1999 ; [.22E7.0020.0002.1999] # NEW TAI LUE LETTER LOW MA
+199A ; [.22E8.0020.0002.199A] # NEW TAI LUE LETTER HIGH FA
+199B ; [.22E9.0020.0002.199B] # NEW TAI LUE LETTER HIGH VA
+199C ; [.22EA.0020.0002.199C] # NEW TAI LUE LETTER HIGH LA
+19DE ; [.22EA.0020.0004.19DE][.2300.0020.0004.19DE] # NEW TAI LUE SIGN LAE; QQKN
+19DF ; [.22EA.0020.0004.19DF][.2300.0020.0004.19DF][.230B.0020.001F.19DF] # NEW TAI LUE SIGN LAEV; QQKN
+199D ; [.22EB.0020.0002.199D] # NEW TAI LUE LETTER LOW FA
+199E ; [.22EC.0020.0002.199E] # NEW TAI LUE LETTER LOW VA
+199F ; [.22ED.0020.0002.199F] # NEW TAI LUE LETTER LOW LA
+19A0 ; [.22EE.0020.0002.19A0] # NEW TAI LUE LETTER HIGH HA
+19A1 ; [.22EF.0020.0002.19A1] # NEW TAI LUE LETTER HIGH DA
+19A2 ; [.22F0.0020.0002.19A2] # NEW TAI LUE LETTER HIGH BA
+19A3 ; [.22F1.0020.0002.19A3] # NEW TAI LUE LETTER LOW HA
+19A4 ; [.22F2.0020.0002.19A4] # NEW TAI LUE LETTER LOW DA
+19A5 ; [.22F3.0020.0002.19A5] # NEW TAI LUE LETTER LOW BA
+19A6 ; [.22F4.0020.0002.19A6] # NEW TAI LUE LETTER HIGH KVA
+19A7 ; [.22F5.0020.0002.19A7] # NEW TAI LUE LETTER HIGH XVA
+19A8 ; [.22F6.0020.0002.19A8] # NEW TAI LUE LETTER LOW KVA
+19A9 ; [.22F7.0020.0002.19A9] # NEW TAI LUE LETTER LOW XVA
+19AA ; [.22F8.0020.0002.19AA] # NEW TAI LUE LETTER HIGH SUA
+19AB ; [.22F9.0020.0002.19AB] # NEW TAI LUE LETTER LOW SUA
+19B0 ; [.22FA.0020.0002.19B0] # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1 ; [.22FB.0020.0002.19B1] # NEW TAI LUE VOWEL SIGN AA
+19B2 ; [.22FC.0020.0002.19B2] # NEW TAI LUE VOWEL SIGN II
+19B3 ; [.22FD.0020.0002.19B3] # NEW TAI LUE VOWEL SIGN U
+19B4 ; [.22FE.0020.0002.19B4] # NEW TAI LUE VOWEL SIGN UU
+19B5 ; [.22FF.0020.0002.19B5] # NEW TAI LUE VOWEL SIGN E
+19B6 ; [.2300.0020.0002.19B6] # NEW TAI LUE VOWEL SIGN AE
+19B7 ; [.2301.0020.0002.19B7] # NEW TAI LUE VOWEL SIGN O
+19B8 ; [.2302.0020.0002.19B8] # NEW TAI LUE VOWEL SIGN OA
+19B9 ; [.2303.0020.0002.19B9] # NEW TAI LUE VOWEL SIGN UE
+19BA ; [.2304.0020.0002.19BA] # NEW TAI LUE VOWEL SIGN AY
+19BB ; [.2305.0020.0002.19BB] # NEW TAI LUE VOWEL SIGN AAY
+19BC ; [.2306.0020.0002.19BC] # NEW TAI LUE VOWEL SIGN UY
+19BD ; [.2307.0020.0002.19BD] # NEW TAI LUE VOWEL SIGN OY
+19BE ; [.2308.0020.0002.19BE] # NEW TAI LUE VOWEL SIGN OAY
+19BF ; [.2309.0020.0002.19BF] # NEW TAI LUE VOWEL SIGN UEY
+19C0 ; [.230A.0020.0002.19C0] # NEW TAI LUE VOWEL SIGN IY
+19C1 ; [.230B.0020.0002.19C1] # NEW TAI LUE LETTER FINAL V
+19C2 ; [.230C.0020.0002.19C2] # NEW TAI LUE LETTER FINAL NG
+19C3 ; [.230D.0020.0002.19C3] # NEW TAI LUE LETTER FINAL N
+19C4 ; [.230E.0020.0002.19C4] # NEW TAI LUE LETTER FINAL M
+19C5 ; [.230F.0020.0002.19C5] # NEW TAI LUE LETTER FINAL K
+19C6 ; [.2310.0020.0002.19C6] # NEW TAI LUE LETTER FINAL D
+19C7 ; [.2311.0020.0002.19C7] # NEW TAI LUE LETTER FINAL B
+19C8 ; [.2312.0020.0002.19C8] # NEW TAI LUE TONE MARK-1
+19C9 ; [.2313.0020.0002.19C9] # NEW TAI LUE TONE MARK-2
+1A20 ; [.2314.0020.0002.1A20] # TAI THAM LETTER HIGH KA
+1A21 ; [.2315.0020.0002.1A21] # TAI THAM LETTER HIGH KHA
+1A22 ; [.2316.0020.0002.1A22] # TAI THAM LETTER HIGH KXA
+1A23 ; [.2317.0020.0002.1A23] # TAI THAM LETTER LOW KA
+1A24 ; [.2318.0020.0002.1A24] # TAI THAM LETTER LOW KXA
+1A25 ; [.2319.0020.0002.1A25] # TAI THAM LETTER LOW KHA
+1A26 ; [.231A.0020.0002.1A26] # TAI THAM LETTER NGA
+1A58 ; [.231A.0020.0004.1A58] # TAI THAM SIGN MAI KANG LAI; QQK
+1A59 ; [.231A.0020.0004.1A59] # TAI THAM CONSONANT SIGN FINAL NGA; QQK
+1A27 ; [.231B.0020.0002.1A27] # TAI THAM LETTER HIGH CA
+1A28 ; [.231C.0020.0002.1A28] # TAI THAM LETTER HIGH CHA
+1A29 ; [.231D.0020.0002.1A29] # TAI THAM LETTER LOW CA
+1A2A ; [.231E.0020.0002.1A2A] # TAI THAM LETTER LOW SA
+1A2B ; [.231F.0020.0002.1A2B] # TAI THAM LETTER LOW CHA
+1A2C ; [.2320.0020.0002.1A2C] # TAI THAM LETTER NYA
+1A2D ; [.2321.0020.0002.1A2D] # TAI THAM LETTER RATA
+1A2E ; [.2322.0020.0002.1A2E] # TAI THAM LETTER HIGH RATHA
+1A2F ; [.2323.0020.0002.1A2F] # TAI THAM LETTER DA
+1A30 ; [.2324.0020.0002.1A30] # TAI THAM LETTER LOW RATHA
+1A31 ; [.2325.0020.0002.1A31] # TAI THAM LETTER RANA
+1A32 ; [.2326.0020.0002.1A32] # TAI THAM LETTER HIGH TA
+1A33 ; [.2327.0020.0002.1A33] # TAI THAM LETTER HIGH THA
+1A34 ; [.2328.0020.0002.1A34] # TAI THAM LETTER LOW TA
+1A35 ; [.2329.0020.0002.1A35] # TAI THAM LETTER LOW THA
+1A36 ; [.232A.0020.0002.1A36] # TAI THAM LETTER NA
+1A37 ; [.232B.0020.0002.1A37] # TAI THAM LETTER BA
+1A38 ; [.232C.0020.0002.1A38] # TAI THAM LETTER HIGH PA
+1A39 ; [.232D.0020.0002.1A39] # TAI THAM LETTER HIGH PHA
+1A3A ; [.232E.0020.0002.1A3A] # TAI THAM LETTER HIGH FA
+1A3B ; [.232F.0020.0002.1A3B] # TAI THAM LETTER LOW PA
+1A5A ; [.232F.0020.0004.1A5A] # TAI THAM CONSONANT SIGN LOW PA; QQK
+1A5B ; [.232F.0020.0004.1A5B] # TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA; QQK
+1A3C ; [.2330.0020.0002.1A3C] # TAI THAM LETTER LOW FA
+1A3D ; [.2331.0020.0002.1A3D] # TAI THAM LETTER LOW PHA
+1A3E ; [.2332.0020.0002.1A3E] # TAI THAM LETTER MA
+1A3F ; [.2333.0020.0002.1A3F] # TAI THAM LETTER LOW YA
+1A40 ; [.2334.0020.0002.1A40] # TAI THAM LETTER HIGH YA
+1A41 ; [.2335.0020.0002.1A41] # TAI THAM LETTER RA
+1A42 ; [.2336.0020.0002.1A42] # TAI THAM LETTER RUE
+1A43 ; [.2337.0020.0002.1A43] # TAI THAM LETTER LA
+1A44 ; [.2338.0020.0002.1A44] # TAI THAM LETTER LUE
+1A45 ; [.2339.0020.0002.1A45] # TAI THAM LETTER WA
+1A46 ; [.233A.0020.0002.1A46] # TAI THAM LETTER HIGH SHA
+1A54 ; [.233A.0020.0004.1A54][.2360.0020.0004.1A54][.233A.0020.001F.1A54] # TAI THAM LETTER GREAT SA; QQKN
+1A47 ; [.233B.0020.0002.1A47] # TAI THAM LETTER HIGH SSA
+1A48 ; [.233C.0020.0002.1A48] # TAI THAM LETTER HIGH SA
+1A49 ; [.233D.0020.0002.1A49] # TAI THAM LETTER HIGH HA
+1A4A ; [.233E.0020.0002.1A4A] # TAI THAM LETTER LLA
+1A4B ; [.233F.0020.0002.1A4B] # TAI THAM LETTER A
+1A4C ; [.2340.0020.0002.1A4C] # TAI THAM LETTER LOW HA
+1A53 ; [.2341.0020.0002.1A53] # TAI THAM LETTER LAE
+1A6B ; [.2342.0020.0002.1A6B] # TAI THAM VOWEL SIGN O
+1A55 ; [.2343.0020.0002.1A55] # TAI THAM CONSONANT SIGN MEDIAL RA
+1A56 ; [.2344.0020.0002.1A56] # TAI THAM CONSONANT SIGN MEDIAL LA
+1A57 ; [.2345.0020.0002.1A57] # TAI THAM CONSONANT SIGN LA TANG LAI
+1A5C ; [.2346.0020.0002.1A5C] # TAI THAM CONSONANT SIGN MA
+1A5D ; [.2347.0020.0002.1A5D] # TAI THAM CONSONANT SIGN BA
+1A5E ; [.2348.0020.0002.1A5E] # TAI THAM CONSONANT SIGN SA
+1A4D ; [.2349.0020.0002.1A4D] # TAI THAM LETTER I
+1A4E ; [.234A.0020.0002.1A4E] # TAI THAM LETTER II
+1A4F ; [.234B.0020.0002.1A4F] # TAI THAM LETTER U
+1A50 ; [.234C.0020.0002.1A50] # TAI THAM LETTER UU
+1A51 ; [.234D.0020.0002.1A51] # TAI THAM LETTER EE
+1A52 ; [.234E.0020.0002.1A52] # TAI THAM LETTER OO
+1A61 ; [.234F.0020.0002.1A61] # TAI THAM VOWEL SIGN A
+1A6C ; [.2350.0020.0002.1A6C] # TAI THAM VOWEL SIGN OA BELOW
+1A62 ; [.2351.0020.0002.1A62] # TAI THAM VOWEL SIGN MAI SAT
+1A63 ; [.2352.0020.0002.1A63] # TAI THAM VOWEL SIGN AA
+1A64 ; [.2352.0020.0004.1A64] # TAI THAM VOWEL SIGN TALL AA; QQK
+1A65 ; [.2353.0020.0002.1A65] # TAI THAM VOWEL SIGN I
+1A66 ; [.2354.0020.0002.1A66] # TAI THAM VOWEL SIGN II
+1A67 ; [.2355.0020.0002.1A67] # TAI THAM VOWEL SIGN UE
+1A68 ; [.2356.0020.0002.1A68] # TAI THAM VOWEL SIGN UUE
+1A69 ; [.2357.0020.0002.1A69] # TAI THAM VOWEL SIGN U
+1A6A ; [.2358.0020.0002.1A6A] # TAI THAM VOWEL SIGN UU
+1A6E ; [.2359.0020.0002.1A6E] # TAI THAM VOWEL SIGN E
+1A6F ; [.235A.0020.0002.1A6F] # TAI THAM VOWEL SIGN AE
+1A73 ; [.235B.0020.0002.1A73] # TAI THAM VOWEL SIGN OA ABOVE
+1A70 ; [.235C.0020.0002.1A70] # TAI THAM VOWEL SIGN OO
+1A71 ; [.235D.0020.0002.1A71] # TAI THAM VOWEL SIGN AI
+1A72 ; [.235E.0020.0002.1A72] # TAI THAM VOWEL SIGN THAM AI
+1A6D ; [.235F.0020.0002.1A6D] # TAI THAM VOWEL SIGN OY
+1A60 ; [.2360.0020.0002.1A60] # TAI THAM SIGN SAKOT
+AA00 ; [.2361.0020.0002.AA00] # CHAM LETTER A
+AA01 ; [.2362.0020.0002.AA01] # CHAM LETTER I
+AA02 ; [.2363.0020.0002.AA02] # CHAM LETTER U
+AA03 ; [.2364.0020.0002.AA03] # CHAM LETTER E
+AA04 ; [.2365.0020.0002.AA04] # CHAM LETTER AI
+AA05 ; [.2366.0020.0002.AA05] # CHAM LETTER O
+AA06 ; [.2367.0020.0002.AA06] # CHAM LETTER KA
+AA07 ; [.2368.0020.0002.AA07] # CHAM LETTER KHA
+AA08 ; [.2369.0020.0002.AA08] # CHAM LETTER GA
+AA09 ; [.236A.0020.0002.AA09] # CHAM LETTER GHA
+AA0A ; [.236B.0020.0002.AA0A] # CHAM LETTER NGUE
+AA0B ; [.236C.0020.0002.AA0B] # CHAM LETTER NGA
+AA0C ; [.236D.0020.0002.AA0C] # CHAM LETTER CHA
+AA0D ; [.236E.0020.0002.AA0D] # CHAM LETTER CHHA
+AA0E ; [.236F.0020.0002.AA0E] # CHAM LETTER JA
+AA0F ; [.2370.0020.0002.AA0F] # CHAM LETTER JHA
+AA10 ; [.2371.0020.0002.AA10] # CHAM LETTER NHUE
+AA11 ; [.2372.0020.0002.AA11] # CHAM LETTER NHA
+AA12 ; [.2373.0020.0002.AA12] # CHAM LETTER NHJA
+AA13 ; [.2374.0020.0002.AA13] # CHAM LETTER TA
+AA14 ; [.2375.0020.0002.AA14] # CHAM LETTER THA
+AA15 ; [.2376.0020.0002.AA15] # CHAM LETTER DA
+AA16 ; [.2377.0020.0002.AA16] # CHAM LETTER DHA
+AA17 ; [.2378.0020.0002.AA17] # CHAM LETTER NUE
+AA18 ; [.2379.0020.0002.AA18] # CHAM LETTER NA
+AA19 ; [.237A.0020.0002.AA19] # CHAM LETTER DDA
+AA1A ; [.237B.0020.0002.AA1A] # CHAM LETTER PA
+AA1B ; [.237C.0020.0002.AA1B] # CHAM LETTER PPA
+AA1C ; [.237D.0020.0002.AA1C] # CHAM LETTER PHA
+AA1D ; [.237E.0020.0002.AA1D] # CHAM LETTER BA
+AA1E ; [.237F.0020.0002.AA1E] # CHAM LETTER BHA
+AA1F ; [.2380.0020.0002.AA1F] # CHAM LETTER MUE
+AA20 ; [.2381.0020.0002.AA20] # CHAM LETTER MA
+AA21 ; [.2382.0020.0002.AA21] # CHAM LETTER BBA
+AA22 ; [.2383.0020.0002.AA22] # CHAM LETTER YA
+AA23 ; [.2384.0020.0002.AA23] # CHAM LETTER RA
+AA24 ; [.2385.0020.0002.AA24] # CHAM LETTER LA
+AA25 ; [.2386.0020.0002.AA25] # CHAM LETTER VA
+AA26 ; [.2387.0020.0002.AA26] # CHAM LETTER SSA
+AA27 ; [.2388.0020.0002.AA27] # CHAM LETTER SA
+AA28 ; [.2389.0020.0002.AA28] # CHAM LETTER HA
+AA33 ; [.238A.0020.0002.AA33] # CHAM CONSONANT SIGN YA
+AA34 ; [.238B.0020.0002.AA34] # CHAM CONSONANT SIGN RA
+AA35 ; [.238C.0020.0002.AA35] # CHAM CONSONANT SIGN LA
+AA36 ; [.238D.0020.0002.AA36] # CHAM CONSONANT SIGN WA
+AA29 ; [.238E.0020.0002.AA29] # CHAM VOWEL SIGN AA
+AA2A ; [.238F.0020.0002.AA2A] # CHAM VOWEL SIGN I
+AA2B ; [.2390.0020.0002.AA2B] # CHAM VOWEL SIGN II
+AA2C ; [.2391.0020.0002.AA2C] # CHAM VOWEL SIGN EI
+AA2D ; [.2392.0020.0002.AA2D] # CHAM VOWEL SIGN U
+AA2E ; [.2393.0020.0002.AA2E] # CHAM VOWEL SIGN OE
+AA2F ; [.2394.0020.0002.AA2F] # CHAM VOWEL SIGN O
+AA30 ; [.2395.0020.0002.AA30] # CHAM VOWEL SIGN AI
+AA31 ; [.2396.0020.0002.AA31] # CHAM VOWEL SIGN AU
+AA32 ; [.2397.0020.0002.AA32] # CHAM VOWEL SIGN UE
+AA40 ; [.2398.0020.0002.AA40] # CHAM LETTER FINAL K
+AA41 ; [.2399.0020.0002.AA41] # CHAM LETTER FINAL G
+AA42 ; [.239A.0020.0002.AA42] # CHAM LETTER FINAL NG
+AA43 ; [.239B.0020.0002.AA43] # CHAM CONSONANT SIGN FINAL NG
+AA44 ; [.239C.0020.0002.AA44] # CHAM LETTER FINAL CH
+AA45 ; [.239D.0020.0002.AA45] # CHAM LETTER FINAL T
+AA46 ; [.239E.0020.0002.AA46] # CHAM LETTER FINAL N
+AA47 ; [.239F.0020.0002.AA47] # CHAM LETTER FINAL P
+AA48 ; [.23A0.0020.0002.AA48] # CHAM LETTER FINAL Y
+AA49 ; [.23A1.0020.0002.AA49] # CHAM LETTER FINAL R
+AA4A ; [.23A2.0020.0002.AA4A] # CHAM LETTER FINAL L
+AA4B ; [.23A3.0020.0002.AA4B] # CHAM LETTER FINAL SS
+AA4C ; [.23A4.0020.0002.AA4C] # CHAM CONSONANT SIGN FINAL M
+AA4D ; [.23A5.0020.0002.AA4D] # CHAM CONSONANT SIGN FINAL H
+1B05 ; [.23A6.0020.0002.1B05] # BALINESE LETTER AKARA
+1B06 ; [.23A7.0020.0002.1B06] # BALINESE LETTER AKARA TEDUNG
+1B05 1B35 ; [.23A7.0020.0002.1B06] # BALINESE LETTER AKARA TEDUNG
+1B07 ; [.23A8.0020.0002.1B07] # BALINESE LETTER IKARA
+1B08 ; [.23A9.0020.0002.1B08] # BALINESE LETTER IKARA TEDUNG
+1B07 1B35 ; [.23A9.0020.0002.1B08] # BALINESE LETTER IKARA TEDUNG
+1B09 ; [.23AA.0020.0002.1B09] # BALINESE LETTER UKARA
+1B0A ; [.23AB.0020.0002.1B0A] # BALINESE LETTER UKARA TEDUNG
+1B09 1B35 ; [.23AB.0020.0002.1B0A] # BALINESE LETTER UKARA TEDUNG
+1B0B ; [.23AC.0020.0002.1B0B] # BALINESE LETTER RA REPA
+1B0C ; [.23AD.0020.0002.1B0C] # BALINESE LETTER RA REPA TEDUNG
+1B0B 1B35 ; [.23AD.0020.0002.1B0C] # BALINESE LETTER RA REPA TEDUNG
+1B0D ; [.23AE.0020.0002.1B0D] # BALINESE LETTER LA LENGA
+1B0E ; [.23AF.0020.0002.1B0E] # BALINESE LETTER LA LENGA TEDUNG
+1B0D 1B35 ; [.23AF.0020.0002.1B0E] # BALINESE LETTER LA LENGA TEDUNG
+1B0F ; [.23B0.0020.0002.1B0F] # BALINESE LETTER EKARA
+1B10 ; [.23B1.0020.0002.1B10] # BALINESE LETTER AIKARA
+1B11 ; [.23B2.0020.0002.1B11] # BALINESE LETTER OKARA
+1B12 ; [.23B3.0020.0002.1B12] # BALINESE LETTER OKARA TEDUNG
+1B11 1B35 ; [.23B3.0020.0002.1B12] # BALINESE LETTER OKARA TEDUNG
+1B13 ; [.23B4.0020.0002.1B13] # BALINESE LETTER KA
+1B45 ; [.23B5.0020.0002.1B45] # BALINESE LETTER KAF SASAK
+1B46 ; [.23B6.0020.0002.1B46] # BALINESE LETTER KHOT SASAK
+1B14 ; [.23B7.0020.0002.1B14] # BALINESE LETTER KA MAHAPRANA
+1B15 ; [.23B8.0020.0002.1B15] # BALINESE LETTER GA
+1B16 ; [.23B9.0020.0002.1B16] # BALINESE LETTER GA GORA
+1B17 ; [.23BA.0020.0002.1B17] # BALINESE LETTER NGA
+1B18 ; [.23BB.0020.0002.1B18] # BALINESE LETTER CA
+1B19 ; [.23BC.0020.0002.1B19] # BALINESE LETTER CA LACA
+1B1A ; [.23BD.0020.0002.1B1A] # BALINESE LETTER JA
+1B1B ; [.23BE.0020.0002.1B1B] # BALINESE LETTER JA JERA
+1B1C ; [.23BF.0020.0002.1B1C] # BALINESE LETTER NYA
+1B1D ; [.23C0.0020.0002.1B1D] # BALINESE LETTER TA LATIK
+1B1E ; [.23C1.0020.0002.1B1E] # BALINESE LETTER TA MURDA MAHAPRANA
+1B1F ; [.23C2.0020.0002.1B1F] # BALINESE LETTER DA MURDA ALPAPRANA
+1B20 ; [.23C3.0020.0002.1B20] # BALINESE LETTER DA MURDA MAHAPRANA
+1B21 ; [.23C4.0020.0002.1B21] # BALINESE LETTER NA RAMBAT
+1B22 ; [.23C5.0020.0002.1B22] # BALINESE LETTER TA
+1B47 ; [.23C6.0020.0002.1B47] # BALINESE LETTER TZIR SASAK
+1B23 ; [.23C7.0020.0002.1B23] # BALINESE LETTER TA TAWA
+1B24 ; [.23C8.0020.0002.1B24] # BALINESE LETTER DA
+1B25 ; [.23C9.0020.0002.1B25] # BALINESE LETTER DA MADU
+1B26 ; [.23CA.0020.0002.1B26] # BALINESE LETTER NA
+1B27 ; [.23CB.0020.0002.1B27] # BALINESE LETTER PA
+1B48 ; [.23CC.0020.0002.1B48] # BALINESE LETTER EF SASAK
+1B28 ; [.23CD.0020.0002.1B28] # BALINESE LETTER PA KAPAL
+1B29 ; [.23CE.0020.0002.1B29] # BALINESE LETTER BA
+1B2A ; [.23CF.0020.0002.1B2A] # BALINESE LETTER BA KEMBANG
+1B2B ; [.23D0.0020.0002.1B2B] # BALINESE LETTER MA
+1B2C ; [.23D1.0020.0002.1B2C] # BALINESE LETTER YA
+1B2D ; [.23D2.0020.0002.1B2D] # BALINESE LETTER RA
+1B2E ; [.23D3.0020.0002.1B2E] # BALINESE LETTER LA
+1B2F ; [.23D4.0020.0002.1B2F] # BALINESE LETTER WA
+1B49 ; [.23D5.0020.0002.1B49] # BALINESE LETTER VE SASAK
+1B30 ; [.23D6.0020.0002.1B30] # BALINESE LETTER SA SAGA
+1B31 ; [.23D7.0020.0002.1B31] # BALINESE LETTER SA SAPA
+1B32 ; [.23D8.0020.0002.1B32] # BALINESE LETTER SA
+1B4A ; [.23D9.0020.0002.1B4A] # BALINESE LETTER ZAL SASAK
+1B4B ; [.23DA.0020.0002.1B4B] # BALINESE LETTER ASYURA SASAK
+1B33 ; [.23DB.0020.0002.1B33] # BALINESE LETTER HA
+1B35 ; [.23DC.0020.0002.1B35] # BALINESE VOWEL SIGN TEDUNG
+1B36 ; [.23DD.0020.0002.1B36] # BALINESE VOWEL SIGN ULU
+1B37 ; [.23DE.0020.0002.1B37] # BALINESE VOWEL SIGN ULU SARI
+1B38 ; [.23DF.0020.0002.1B38] # BALINESE VOWEL SIGN SUKU
+1B39 ; [.23E0.0020.0002.1B39] # BALINESE VOWEL SIGN SUKU ILUT
+1B3A ; [.23E1.0020.0002.1B3A] # BALINESE VOWEL SIGN RA REPA
+1B3B ; [.23E2.0020.0002.1B3B] # BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3A 1B35 ; [.23E2.0020.0002.1B3B] # BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C ; [.23E3.0020.0002.1B3C] # BALINESE VOWEL SIGN LA LENGA
+1B3D ; [.23E4.0020.0002.1B3D] # BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B3C 1B35 ; [.23E4.0020.0002.1B3D] # BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B3E ; [.23E5.0020.0002.1B3E] # BALINESE VOWEL SIGN TALING
+1B3F ; [.23E6.0020.0002.1B3F] # BALINESE VOWEL SIGN TALING REPA
+1B40 ; [.23E7.0020.0002.1B40] # BALINESE VOWEL SIGN TALING TEDUNG
+1B3E 1B35 ; [.23E7.0020.0002.1B40] # BALINESE VOWEL SIGN TALING TEDUNG
+1B41 ; [.23E8.0020.0002.1B41] # BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B3F 1B35 ; [.23E8.0020.0002.1B41] # BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42 ; [.23E9.0020.0002.1B42] # BALINESE VOWEL SIGN PEPET
+1B43 ; [.23EA.0020.0002.1B43] # BALINESE VOWEL SIGN PEPET TEDUNG
+1B42 1B35 ; [.23EA.0020.0002.1B43] # BALINESE VOWEL SIGN PEPET TEDUNG
+1B44 ; [.23EB.0020.0002.1B44] # BALINESE ADEG ADEG
+A984 ; [.23EC.0020.0002.A984] # JAVANESE LETTER A
+A985 ; [.23ED.0020.0002.A985] # JAVANESE LETTER I KAWI
+A986 ; [.23EE.0020.0002.A986] # JAVANESE LETTER I
+A987 ; [.23EF.0020.0002.A987] # JAVANESE LETTER II
+A988 ; [.23F0.0020.0002.A988] # JAVANESE LETTER U
+A989 ; [.23F1.0020.0002.A989] # JAVANESE LETTER PA CEREK
+A98A ; [.23F2.0020.0002.A98A] # JAVANESE LETTER NGA LELET
+A98B ; [.23F3.0020.0002.A98B] # JAVANESE LETTER NGA LELET RASWADI
+A98C ; [.23F4.0020.0002.A98C] # JAVANESE LETTER E
+A98D ; [.23F5.0020.0002.A98D] # JAVANESE LETTER AI
+A98E ; [.23F6.0020.0002.A98E] # JAVANESE LETTER O
+A98F ; [.23F7.0020.0002.A98F] # JAVANESE LETTER KA
+A990 ; [.23F8.0020.0002.A990] # JAVANESE LETTER KA SASAK
+A991 ; [.23F9.0020.0002.A991] # JAVANESE LETTER KA MURDA
+A992 ; [.23FA.0020.0002.A992] # JAVANESE LETTER GA
+A993 ; [.23FB.0020.0002.A993] # JAVANESE LETTER GA MURDA
+A994 ; [.23FC.0020.0002.A994] # JAVANESE LETTER NGA
+A995 ; [.23FD.0020.0002.A995] # JAVANESE LETTER CA
+A996 ; [.23FE.0020.0002.A996] # JAVANESE LETTER CA MURDA
+A997 ; [.23FF.0020.0002.A997] # JAVANESE LETTER JA
+A998 ; [.2400.0020.0002.A998] # JAVANESE LETTER NYA MURDA
+A999 ; [.2401.0020.0002.A999] # JAVANESE LETTER JA MAHAPRANA
+A99A ; [.2402.0020.0002.A99A] # JAVANESE LETTER NYA
+A99B ; [.2403.0020.0002.A99B] # JAVANESE LETTER TTA
+A99C ; [.2404.0020.0002.A99C] # JAVANESE LETTER TTA MAHAPRANA
+A99D ; [.2405.0020.0002.A99D] # JAVANESE LETTER DDA
+A99E ; [.2406.0020.0002.A99E] # JAVANESE LETTER DDA MAHAPRANA
+A99F ; [.2407.0020.0002.A99F] # JAVANESE LETTER NA MURDA
+A9A0 ; [.2408.0020.0002.A9A0] # JAVANESE LETTER TA
+A9A1 ; [.2409.0020.0002.A9A1] # JAVANESE LETTER TA MURDA
+A9A2 ; [.240A.0020.0002.A9A2] # JAVANESE LETTER DA
+A9A3 ; [.240B.0020.0002.A9A3] # JAVANESE LETTER DA MAHAPRANA
+A9A4 ; [.240C.0020.0002.A9A4] # JAVANESE LETTER NA
+A9A5 ; [.240D.0020.0002.A9A5] # JAVANESE LETTER PA
+A9A6 ; [.240E.0020.0002.A9A6] # JAVANESE LETTER PA MURDA
+A9A7 ; [.240F.0020.0002.A9A7] # JAVANESE LETTER BA
+A9A8 ; [.2410.0020.0002.A9A8] # JAVANESE LETTER BA MURDA
+A9A9 ; [.2411.0020.0002.A9A9] # JAVANESE LETTER MA
+A9AA ; [.2412.0020.0002.A9AA] # JAVANESE LETTER YA
+A9BE ; [.2413.0020.0002.A9BE] # JAVANESE CONSONANT SIGN PENGKAL
+A9AB ; [.2414.0020.0002.A9AB] # JAVANESE LETTER RA
+A9AC ; [.2414.0020.0004.A9AC] # JAVANESE LETTER RA AGUNG; QQK
+A9BF ; [.2415.0020.0002.A9BF] # JAVANESE CONSONANT SIGN CAKRA
+A9AD ; [.2416.0020.0002.A9AD] # JAVANESE LETTER LA
+A9AE ; [.2417.0020.0002.A9AE] # JAVANESE LETTER WA
+A9AF ; [.2418.0020.0002.A9AF] # JAVANESE LETTER SA MURDA
+A9B0 ; [.2419.0020.0002.A9B0] # JAVANESE LETTER SA MAHAPRANA
+A9B1 ; [.241A.0020.0002.A9B1] # JAVANESE LETTER SA
+A9B2 ; [.241B.0020.0002.A9B2] # JAVANESE LETTER HA
+A9B4 ; [.241C.0020.0002.A9B4] # JAVANESE VOWEL SIGN TARUNG
+A9BC ; [.241D.0020.0002.A9BC] # JAVANESE VOWEL SIGN PEPET
+A9B6 ; [.241E.0020.0002.A9B6] # JAVANESE VOWEL SIGN WULU
+A9B7 ; [.241F.0020.0002.A9B7] # JAVANESE VOWEL SIGN WULU MELIK
+A9B8 ; [.2420.0020.0002.A9B8] # JAVANESE VOWEL SIGN SUKU
+A9B9 ; [.2421.0020.0002.A9B9] # JAVANESE VOWEL SIGN SUKU MENDUT
+A9BD ; [.2422.0020.0002.A9BD] # JAVANESE CONSONANT SIGN KERET
+A9BA ; [.2423.0020.0002.A9BA] # JAVANESE VOWEL SIGN TALING
+A9BB ; [.2424.0020.0002.A9BB] # JAVANESE VOWEL SIGN DIRGA MURE
+A9B5 ; [.2425.0020.0002.A9B5] # JAVANESE VOWEL SIGN TOLONG
+A9C0 ; [.2426.0020.0002.A9C0] # JAVANESE PANGKON
+1880 ; [.2427.0020.0002.1880] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881 ; [.2428.0020.0002.1881] # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882 ; [.2429.0020.0002.1882] # MONGOLIAN LETTER ALI GALI DAMARU
+1883 ; [.242A.0020.0002.1883] # MONGOLIAN LETTER ALI GALI UBADAMA
+1884 ; [.242B.0020.0002.1884] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885 ; [.242C.0020.0002.1885] # MONGOLIAN LETTER ALI GALI BALUDA
+1886 ; [.242D.0020.0002.1886] # MONGOLIAN LETTER ALI GALI THREE BALUDA
+1843 ; [.242E.0020.0002.1843] # MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1820 ; [.242F.0020.0002.1820] # MONGOLIAN LETTER A
+1887 ; [.2430.0020.0002.1887] # MONGOLIAN LETTER ALI GALI A
+1821 ; [.2431.0020.0002.1821] # MONGOLIAN LETTER E
+1844 ; [.2432.0020.0002.1844] # MONGOLIAN LETTER TODO E
+185D ; [.2433.0020.0002.185D] # MONGOLIAN LETTER SIBE E
+1822 ; [.2434.0020.0002.1822] # MONGOLIAN LETTER I
+1845 ; [.2435.0020.0002.1845] # MONGOLIAN LETTER TODO I
+185E ; [.2436.0020.0002.185E] # MONGOLIAN LETTER SIBE I
+1873 ; [.2437.0020.0002.1873] # MONGOLIAN LETTER MANCHU I
+1888 ; [.2438.0020.0002.1888] # MONGOLIAN LETTER ALI GALI I
+185F ; [.2439.0020.0002.185F] # MONGOLIAN LETTER SIBE IY
+1823 ; [.243A.0020.0002.1823] # MONGOLIAN LETTER O
+1846 ; [.243B.0020.0002.1846] # MONGOLIAN LETTER TODO O
+1824 ; [.243C.0020.0002.1824] # MONGOLIAN LETTER U
+1847 ; [.243D.0020.0002.1847] # MONGOLIAN LETTER TODO U
+1861 ; [.243E.0020.0002.1861] # MONGOLIAN LETTER SIBE U
+1825 ; [.243F.0020.0002.1825] # MONGOLIAN LETTER OE
+1848 ; [.2440.0020.0002.1848] # MONGOLIAN LETTER TODO OE
+1826 ; [.2441.0020.0002.1826] # MONGOLIAN LETTER UE
+1849 ; [.2442.0020.0002.1849] # MONGOLIAN LETTER TODO UE
+1860 ; [.2443.0020.0002.1860] # MONGOLIAN LETTER SIBE UE
+1827 ; [.2444.0020.0002.1827] # MONGOLIAN LETTER EE
+1828 ; [.2445.0020.0002.1828] # MONGOLIAN LETTER NA
+1829 ; [.2446.0020.0002.1829] # MONGOLIAN LETTER ANG
+184A ; [.2447.0020.0002.184A] # MONGOLIAN LETTER TODO ANG
+1862 ; [.2448.0020.0002.1862] # MONGOLIAN LETTER SIBE ANG
+188A ; [.2449.0020.0002.188A] # MONGOLIAN LETTER ALI GALI NGA
+189B ; [.244A.0020.0002.189B] # MONGOLIAN LETTER MANCHU ALI GALI NGA
+182A ; [.244B.0020.0002.182A] # MONGOLIAN LETTER BA
+184B ; [.244C.0020.0002.184B] # MONGOLIAN LETTER TODO BA
+182B ; [.244D.0020.0002.182B] # MONGOLIAN LETTER PA
+184C ; [.244E.0020.0002.184C] # MONGOLIAN LETTER TODO PA
+1866 ; [.244F.0020.0002.1866] # MONGOLIAN LETTER SIBE PA
+182C ; [.2450.0020.0002.182C] # MONGOLIAN LETTER QA
+184D ; [.2451.0020.0002.184D] # MONGOLIAN LETTER TODO QA
+182D ; [.2452.0020.0002.182D] # MONGOLIAN LETTER GA
+184E ; [.2453.0020.0002.184E] # MONGOLIAN LETTER TODO GA
+1864 ; [.2454.0020.0002.1864] # MONGOLIAN LETTER SIBE GA
+189A ; [.2455.0020.0002.189A] # MONGOLIAN LETTER MANCHU ALI GALI GHA
+1865 ; [.2456.0020.0002.1865] # MONGOLIAN LETTER SIBE HA
+182E ; [.2457.0020.0002.182E] # MONGOLIAN LETTER MA
+184F ; [.2458.0020.0002.184F] # MONGOLIAN LETTER TODO MA
+182F ; [.2459.0020.0002.182F] # MONGOLIAN LETTER LA
+1830 ; [.245A.0020.0002.1830] # MONGOLIAN LETTER SA
+1831 ; [.245B.0020.0002.1831] # MONGOLIAN LETTER SHA
+1867 ; [.245C.0020.0002.1867] # MONGOLIAN LETTER SIBE SHA
+189C ; [.245D.0020.0002.189C] # MONGOLIAN LETTER MANCHU ALI GALI CA
+189D ; [.245E.0020.0002.189D] # MONGOLIAN LETTER MANCHU ALI GALI JHA
+18A2 ; [.245F.0020.0002.18A2] # MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A4 ; [.2460.0020.0002.18A4] # MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5 ; [.2461.0020.0002.18A5] # MONGOLIAN LETTER MANCHU ALI GALI ZA
+1832 ; [.2462.0020.0002.1832] # MONGOLIAN LETTER TA
+1850 ; [.2463.0020.0002.1850] # MONGOLIAN LETTER TODO TA
+1868 ; [.2464.0020.0002.1868] # MONGOLIAN LETTER SIBE TA
+1833 ; [.2465.0020.0002.1833] # MONGOLIAN LETTER DA
+1851 ; [.2466.0020.0002.1851] # MONGOLIAN LETTER TODO DA
+1869 ; [.2467.0020.0002.1869] # MONGOLIAN LETTER SIBE DA
+1834 ; [.2468.0020.0002.1834] # MONGOLIAN LETTER CHA
+1852 ; [.2469.0020.0002.1852] # MONGOLIAN LETTER TODO CHA
+1871 ; [.246A.0020.0002.1871] # MONGOLIAN LETTER SIBE CHA
+185C ; [.246B.0020.0002.185C] # MONGOLIAN LETTER TODO DZA
+188B ; [.246C.0020.0002.188B] # MONGOLIAN LETTER ALI GALI CA
+1835 ; [.246D.0020.0002.1835] # MONGOLIAN LETTER JA
+1853 ; [.246E.0020.0002.1853] # MONGOLIAN LETTER TODO JA
+186A ; [.246F.0020.0002.186A] # MONGOLIAN LETTER SIBE JA
+1877 ; [.2470.0020.0002.1877] # MONGOLIAN LETTER MANCHU ZHA
+1836 ; [.2471.0020.0002.1836] # MONGOLIAN LETTER YA
+1855 ; [.2472.0020.0002.1855] # MONGOLIAN LETTER TODO YA
+1872 ; [.2473.0020.0002.1872] # MONGOLIAN LETTER SIBE ZHA
+1837 ; [.2474.0020.0002.1837] # MONGOLIAN LETTER RA
+1875 ; [.2475.0020.0002.1875] # MONGOLIAN LETTER MANCHU RA
+1838 ; [.2476.0020.0002.1838] # MONGOLIAN LETTER WA
+1856 ; [.2477.0020.0002.1856] # MONGOLIAN LETTER TODO WA
+1839 ; [.2478.0020.0002.1839] # MONGOLIAN LETTER FA
+186B ; [.2479.0020.0002.186B] # MONGOLIAN LETTER SIBE FA
+1876 ; [.247A.0020.0002.1876] # MONGOLIAN LETTER MANCHU FA
+183A ; [.247B.0020.0002.183A] # MONGOLIAN LETTER KA
+1857 ; [.247C.0020.0002.1857] # MONGOLIAN LETTER TODO KA
+1863 ; [.247D.0020.0002.1863] # MONGOLIAN LETTER SIBE KA
+1874 ; [.247E.0020.0002.1874] # MONGOLIAN LETTER MANCHU KA
+1889 ; [.247F.0020.0002.1889] # MONGOLIAN LETTER ALI GALI KA
+183B ; [.2480.0020.0002.183B] # MONGOLIAN LETTER KHA
+183C ; [.2481.0020.0002.183C] # MONGOLIAN LETTER TSA
+1854 ; [.2482.0020.0002.1854] # MONGOLIAN LETTER TODO TSA
+186E ; [.2483.0020.0002.186E] # MONGOLIAN LETTER SIBE TSA
+183D ; [.2484.0020.0002.183D] # MONGOLIAN LETTER ZA
+186F ; [.2485.0020.0002.186F] # MONGOLIAN LETTER SIBE ZA
+1858 ; [.2486.0020.0002.1858] # MONGOLIAN LETTER TODO GAA
+186C ; [.2487.0020.0002.186C] # MONGOLIAN LETTER SIBE GAA
+183E ; [.2488.0020.0002.183E] # MONGOLIAN LETTER HAA
+1859 ; [.2489.0020.0002.1859] # MONGOLIAN LETTER TODO HAA
+186D ; [.248A.0020.0002.186D] # MONGOLIAN LETTER SIBE HAA
+183F ; [.248B.0020.0002.183F] # MONGOLIAN LETTER ZRA
+1840 ; [.248C.0020.0002.1840] # MONGOLIAN LETTER LHA
+1841 ; [.248D.0020.0002.1841] # MONGOLIAN LETTER ZHI
+1842 ; [.248E.0020.0002.1842] # MONGOLIAN LETTER CHI
+185A ; [.248F.0020.0002.185A] # MONGOLIAN LETTER TODO JIA
+185B ; [.2490.0020.0002.185B] # MONGOLIAN LETTER TODO NIA
+1870 ; [.2491.0020.0002.1870] # MONGOLIAN LETTER SIBE RAA
+188C ; [.2492.0020.0002.188C] # MONGOLIAN LETTER ALI GALI TTA
+189E ; [.2493.0020.0002.189E] # MONGOLIAN LETTER MANCHU ALI GALI TTA
+188D ; [.2494.0020.0002.188D] # MONGOLIAN LETTER ALI GALI TTHA
+188E ; [.2495.0020.0002.188E] # MONGOLIAN LETTER ALI GALI DDA
+189F ; [.2496.0020.0002.189F] # MONGOLIAN LETTER MANCHU ALI GALI DDHA
+188F ; [.2497.0020.0002.188F] # MONGOLIAN LETTER ALI GALI NNA
+1890 ; [.2498.0020.0002.1890] # MONGOLIAN LETTER ALI GALI TA
+1898 ; [.2499.0020.0002.1898] # MONGOLIAN LETTER TODO ALI GALI TA
+18A0 ; [.249A.0020.0002.18A0] # MONGOLIAN LETTER MANCHU ALI GALI TA
+1891 ; [.249B.0020.0002.1891] # MONGOLIAN LETTER ALI GALI DA
+18A1 ; [.249C.0020.0002.18A1] # MONGOLIAN LETTER MANCHU ALI GALI DHA
+1892 ; [.249D.0020.0002.1892] # MONGOLIAN LETTER ALI GALI PA
+1893 ; [.249E.0020.0002.1893] # MONGOLIAN LETTER ALI GALI PHA
+18A8 ; [.249F.0020.0002.18A8] # MONGOLIAN LETTER MANCHU ALI GALI BHA
+1894 ; [.24A0.0020.0002.1894] # MONGOLIAN LETTER ALI GALI SSA
+18A3 ; [.24A1.0020.0002.18A3] # MONGOLIAN LETTER MANCHU ALI GALI CYA
+1895 ; [.24A2.0020.0002.1895] # MONGOLIAN LETTER ALI GALI ZHA
+1899 ; [.24A3.0020.0002.1899] # MONGOLIAN LETTER TODO ALI GALI ZHA
+1896 ; [.24A4.0020.0002.1896] # MONGOLIAN LETTER ALI GALI ZA
+1897 ; [.24A5.0020.0002.1897] # MONGOLIAN LETTER ALI GALI AH
+18A6 ; [.24A6.0020.0002.18A6] # MONGOLIAN LETTER ALI GALI HALF U
+18A7 ; [.24A7.0020.0002.18A7] # MONGOLIAN LETTER ALI GALI HALF YA
+18AA ; [.24A8.0020.0002.18AA] # MONGOLIAN LETTER MANCHU ALI GALI LHA
+18A9 ; [.24A9.0020.0002.18A9] # MONGOLIAN LETTER ALI GALI DAGALGA
+1C5A ; [.24AA.0020.0002.1C5A] # OL CHIKI LETTER LA
+1C5B ; [.24AB.0020.0002.1C5B] # OL CHIKI LETTER AT
+1C5C ; [.24AC.0020.0002.1C5C] # OL CHIKI LETTER AG
+1C5D ; [.24AD.0020.0002.1C5D] # OL CHIKI LETTER ANG
+1C5E ; [.24AE.0020.0002.1C5E] # OL CHIKI LETTER AL
+1C5F ; [.24AF.0020.0002.1C5F] # OL CHIKI LETTER LAA
+1C60 ; [.24B0.0020.0002.1C60] # OL CHIKI LETTER AAK
+1C61 ; [.24B1.0020.0002.1C61] # OL CHIKI LETTER AAJ
+1C62 ; [.24B2.0020.0002.1C62] # OL CHIKI LETTER AAM
+1C63 ; [.24B3.0020.0002.1C63] # OL CHIKI LETTER AAW
+1C64 ; [.24B4.0020.0002.1C64] # OL CHIKI LETTER LI
+1C65 ; [.24B5.0020.0002.1C65] # OL CHIKI LETTER IS
+1C66 ; [.24B6.0020.0002.1C66] # OL CHIKI LETTER IH
+1C67 ; [.24B7.0020.0002.1C67] # OL CHIKI LETTER INY
+1C68 ; [.24B8.0020.0002.1C68] # OL CHIKI LETTER IR
+1C69 ; [.24B9.0020.0002.1C69] # OL CHIKI LETTER LU
+1C6A ; [.24BA.0020.0002.1C6A] # OL CHIKI LETTER UC
+1C6B ; [.24BB.0020.0002.1C6B] # OL CHIKI LETTER UD
+1C6C ; [.24BC.0020.0002.1C6C] # OL CHIKI LETTER UNN
+1C6D ; [.24BD.0020.0002.1C6D] # OL CHIKI LETTER UY
+1C6E ; [.24BE.0020.0002.1C6E] # OL CHIKI LETTER LE
+1C6F ; [.24BF.0020.0002.1C6F] # OL CHIKI LETTER EP
+1C70 ; [.24C0.0020.0002.1C70] # OL CHIKI LETTER EDD
+1C71 ; [.24C1.0020.0002.1C71] # OL CHIKI LETTER EN
+1C72 ; [.24C2.0020.0002.1C72] # OL CHIKI LETTER ERR
+1C73 ; [.24C3.0020.0002.1C73] # OL CHIKI LETTER LO
+1C74 ; [.24C4.0020.0002.1C74] # OL CHIKI LETTER OTT
+1C75 ; [.24C5.0020.0002.1C75] # OL CHIKI LETTER OB
+1C76 ; [.24C6.0020.0002.1C76] # OL CHIKI LETTER OV
+1C77 ; [.24C7.0020.0002.1C77] # OL CHIKI LETTER OH
+1C78 ; [.24C8.0020.0002.1C78] # OL CHIKI MU TTUDDAG
+1C79 ; [.24C9.0020.0002.1C79] # OL CHIKI GAAHLAA TTUDDAAG
+1C7A ; [.24CA.0020.0002.1C7A] # OL CHIKI MU-GAAHLAA TTUDDAAG
+1C7B ; [.24CB.0020.0002.1C7B] # OL CHIKI RELAA
+1C7C ; [.24CC.0020.0002.1C7C] # OL CHIKI PHAARKAA
+1C7D ; [.24CD.0020.0002.1C7D] # OL CHIKI AHAD
+13A0 ; [.24CE.0020.0002.13A0] # CHEROKEE LETTER A
+13A1 ; [.24CF.0020.0002.13A1] # CHEROKEE LETTER E
+13A2 ; [.24D0.0020.0002.13A2] # CHEROKEE LETTER I
+13A3 ; [.24D1.0020.0002.13A3] # CHEROKEE LETTER O
+13A4 ; [.24D2.0020.0002.13A4] # CHEROKEE LETTER U
+13A5 ; [.24D3.0020.0002.13A5] # CHEROKEE LETTER V
+13A6 ; [.24D4.0020.0002.13A6] # CHEROKEE LETTER GA
+13A7 ; [.24D5.0020.0002.13A7] # CHEROKEE LETTER KA
+13A8 ; [.24D6.0020.0002.13A8] # CHEROKEE LETTER GE
+13A9 ; [.24D7.0020.0002.13A9] # CHEROKEE LETTER GI
+13AA ; [.24D8.0020.0002.13AA] # CHEROKEE LETTER GO
+13AB ; [.24D9.0020.0002.13AB] # CHEROKEE LETTER GU
+13AC ; [.24DA.0020.0002.13AC] # CHEROKEE LETTER GV
+13AD ; [.24DB.0020.0002.13AD] # CHEROKEE LETTER HA
+13AE ; [.24DC.0020.0002.13AE] # CHEROKEE LETTER HE
+13AF ; [.24DD.0020.0002.13AF] # CHEROKEE LETTER HI
+13B0 ; [.24DE.0020.0002.13B0] # CHEROKEE LETTER HO
+13B1 ; [.24DF.0020.0002.13B1] # CHEROKEE LETTER HU
+13B2 ; [.24E0.0020.0002.13B2] # CHEROKEE LETTER HV
+13B3 ; [.24E1.0020.0002.13B3] # CHEROKEE LETTER LA
+13B4 ; [.24E2.0020.0002.13B4] # CHEROKEE LETTER LE
+13B5 ; [.24E3.0020.0002.13B5] # CHEROKEE LETTER LI
+13B6 ; [.24E4.0020.0002.13B6] # CHEROKEE LETTER LO
+13B7 ; [.24E5.0020.0002.13B7] # CHEROKEE LETTER LU
+13B8 ; [.24E6.0020.0002.13B8] # CHEROKEE LETTER LV
+13B9 ; [.24E7.0020.0002.13B9] # CHEROKEE LETTER MA
+13BA ; [.24E8.0020.0002.13BA] # CHEROKEE LETTER ME
+13BB ; [.24E9.0020.0002.13BB] # CHEROKEE LETTER MI
+13BC ; [.24EA.0020.0002.13BC] # CHEROKEE LETTER MO
+13BD ; [.24EB.0020.0002.13BD] # CHEROKEE LETTER MU
+13BE ; [.24EC.0020.0002.13BE] # CHEROKEE LETTER NA
+13BF ; [.24ED.0020.0002.13BF] # CHEROKEE LETTER HNA
+13C0 ; [.24EE.0020.0002.13C0] # CHEROKEE LETTER NAH
+13C1 ; [.24EF.0020.0002.13C1] # CHEROKEE LETTER NE
+13C2 ; [.24F0.0020.0002.13C2] # CHEROKEE LETTER NI
+13C3 ; [.24F1.0020.0002.13C3] # CHEROKEE LETTER NO
+13C4 ; [.24F2.0020.0002.13C4] # CHEROKEE LETTER NU
+13C5 ; [.24F3.0020.0002.13C5] # CHEROKEE LETTER NV
+13C6 ; [.24F4.0020.0002.13C6] # CHEROKEE LETTER QUA
+13C7 ; [.24F5.0020.0002.13C7] # CHEROKEE LETTER QUE
+13C8 ; [.24F6.0020.0002.13C8] # CHEROKEE LETTER QUI
+13C9 ; [.24F7.0020.0002.13C9] # CHEROKEE LETTER QUO
+13CA ; [.24F8.0020.0002.13CA] # CHEROKEE LETTER QUU
+13CB ; [.24F9.0020.0002.13CB] # CHEROKEE LETTER QUV
+13CC ; [.24FA.0020.0002.13CC] # CHEROKEE LETTER SA
+13CD ; [.24FB.0020.0002.13CD] # CHEROKEE LETTER S
+13CE ; [.24FC.0020.0002.13CE] # CHEROKEE LETTER SE
+13CF ; [.24FD.0020.0002.13CF] # CHEROKEE LETTER SI
+13D0 ; [.24FE.0020.0002.13D0] # CHEROKEE LETTER SO
+13D1 ; [.24FF.0020.0002.13D1] # CHEROKEE LETTER SU
+13D2 ; [.2500.0020.0002.13D2] # CHEROKEE LETTER SV
+13D3 ; [.2501.0020.0002.13D3] # CHEROKEE LETTER DA
+13D4 ; [.2502.0020.0002.13D4] # CHEROKEE LETTER TA
+13D5 ; [.2503.0020.0002.13D5] # CHEROKEE LETTER DE
+13D6 ; [.2504.0020.0002.13D6] # CHEROKEE LETTER TE
+13D7 ; [.2505.0020.0002.13D7] # CHEROKEE LETTER DI
+13D8 ; [.2506.0020.0002.13D8] # CHEROKEE LETTER TI
+13D9 ; [.2507.0020.0002.13D9] # CHEROKEE LETTER DO
+13DA ; [.2508.0020.0002.13DA] # CHEROKEE LETTER DU
+13DB ; [.2509.0020.0002.13DB] # CHEROKEE LETTER DV
+13DC ; [.250A.0020.0002.13DC] # CHEROKEE LETTER DLA
+13DD ; [.250B.0020.0002.13DD] # CHEROKEE LETTER TLA
+13DE ; [.250C.0020.0002.13DE] # CHEROKEE LETTER TLE
+13DF ; [.250D.0020.0002.13DF] # CHEROKEE LETTER TLI
+13E0 ; [.250E.0020.0002.13E0] # CHEROKEE LETTER TLO
+13E1 ; [.250F.0020.0002.13E1] # CHEROKEE LETTER TLU
+13E2 ; [.2510.0020.0002.13E2] # CHEROKEE LETTER TLV
+13E3 ; [.2511.0020.0002.13E3] # CHEROKEE LETTER TSA
+13E4 ; [.2512.0020.0002.13E4] # CHEROKEE LETTER TSE
+13E5 ; [.2513.0020.0002.13E5] # CHEROKEE LETTER TSI
+13E6 ; [.2514.0020.0002.13E6] # CHEROKEE LETTER TSO
+13E7 ; [.2515.0020.0002.13E7] # CHEROKEE LETTER TSU
+13E8 ; [.2516.0020.0002.13E8] # CHEROKEE LETTER TSV
+13E9 ; [.2517.0020.0002.13E9] # CHEROKEE LETTER WA
+13EA ; [.2518.0020.0002.13EA] # CHEROKEE LETTER WE
+13EB ; [.2519.0020.0002.13EB] # CHEROKEE LETTER WI
+13EC ; [.251A.0020.0002.13EC] # CHEROKEE LETTER WO
+13ED ; [.251B.0020.0002.13ED] # CHEROKEE LETTER WU
+13EE ; [.251C.0020.0002.13EE] # CHEROKEE LETTER WV
+13EF ; [.251D.0020.0002.13EF] # CHEROKEE LETTER YA
+13F0 ; [.251E.0020.0002.13F0] # CHEROKEE LETTER YE
+13F1 ; [.251F.0020.0002.13F1] # CHEROKEE LETTER YI
+13F2 ; [.2520.0020.0002.13F2] # CHEROKEE LETTER YO
+13F3 ; [.2521.0020.0002.13F3] # CHEROKEE LETTER YU
+13F4 ; [.2522.0020.0002.13F4] # CHEROKEE LETTER YV
+1401 ; [.2523.0020.0002.1401] # CANADIAN SYLLABICS E
+1402 ; [.2524.0020.0002.1402] # CANADIAN SYLLABICS AAI
+1403 ; [.2525.0020.0002.1403] # CANADIAN SYLLABICS I
+1404 ; [.2526.0020.0002.1404] # CANADIAN SYLLABICS II
+1405 ; [.2527.0020.0002.1405] # CANADIAN SYLLABICS O
+1406 ; [.2528.0020.0002.1406] # CANADIAN SYLLABICS OO
+1407 ; [.2529.0020.0002.1407] # CANADIAN SYLLABICS Y-CREE OO
+1408 ; [.252A.0020.0002.1408] # CANADIAN SYLLABICS CARRIER EE
+1409 ; [.252B.0020.0002.1409] # CANADIAN SYLLABICS CARRIER I
+140A ; [.252C.0020.0002.140A] # CANADIAN SYLLABICS A
+140B ; [.252D.0020.0002.140B] # CANADIAN SYLLABICS AA
+140C ; [.252E.0020.0002.140C] # CANADIAN SYLLABICS WE
+140D ; [.252F.0020.0002.140D] # CANADIAN SYLLABICS WEST-CREE WE
+140E ; [.2530.0020.0002.140E] # CANADIAN SYLLABICS WI
+140F ; [.2531.0020.0002.140F] # CANADIAN SYLLABICS WEST-CREE WI
+1410 ; [.2532.0020.0002.1410] # CANADIAN SYLLABICS WII
+1411 ; [.2533.0020.0002.1411] # CANADIAN SYLLABICS WEST-CREE WII
+1412 ; [.2534.0020.0002.1412] # CANADIAN SYLLABICS WO
+1413 ; [.2535.0020.0002.1413] # CANADIAN SYLLABICS WEST-CREE WO
+1414 ; [.2536.0020.0002.1414] # CANADIAN SYLLABICS WOO
+1415 ; [.2537.0020.0002.1415] # CANADIAN SYLLABICS WEST-CREE WOO
+1416 ; [.2538.0020.0002.1416] # CANADIAN SYLLABICS NASKAPI WOO
+1417 ; [.2539.0020.0002.1417] # CANADIAN SYLLABICS WA
+1418 ; [.253A.0020.0002.1418] # CANADIAN SYLLABICS WEST-CREE WA
+1419 ; [.253B.0020.0002.1419] # CANADIAN SYLLABICS WAA
+141A ; [.253C.0020.0002.141A] # CANADIAN SYLLABICS WEST-CREE WAA
+141B ; [.253D.0020.0002.141B] # CANADIAN SYLLABICS NASKAPI WAA
+141C ; [.253E.0020.0002.141C] # CANADIAN SYLLABICS AI
+141D ; [.253F.0020.0002.141D] # CANADIAN SYLLABICS Y-CREE W
+141E ; [.2540.0020.0002.141E] # CANADIAN SYLLABICS GLOTTAL STOP
+141F ; [.2541.0020.0002.141F] # CANADIAN SYLLABICS FINAL ACUTE
+1420 ; [.2542.0020.0002.1420] # CANADIAN SYLLABICS FINAL GRAVE
+1421 ; [.2543.0020.0002.1421] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422 ; [.2544.0020.0002.1422] # CANADIAN SYLLABICS FINAL TOP HALF RING
+1423 ; [.2545.0020.0002.1423] # CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424 ; [.2546.0020.0002.1424] # CANADIAN SYLLABICS FINAL RING
+1425 ; [.2547.0020.0002.1425] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426 ; [.2548.0020.0002.1426] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427 ; [.2549.0020.0002.1427] # CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428 ; [.254A.0020.0002.1428] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429 ; [.254B.0020.0002.1429] # CANADIAN SYLLABICS FINAL PLUS
+142A ; [.254C.0020.0002.142A] # CANADIAN SYLLABICS FINAL DOWN TACK
+142B ; [.254D.0020.0002.142B] # CANADIAN SYLLABICS EN
+142C ; [.254E.0020.0002.142C] # CANADIAN SYLLABICS IN
+142D ; [.254F.0020.0002.142D] # CANADIAN SYLLABICS ON
+142E ; [.2550.0020.0002.142E] # CANADIAN SYLLABICS AN
+142F ; [.2551.0020.0002.142F] # CANADIAN SYLLABICS PE
+1430 ; [.2552.0020.0002.1430] # CANADIAN SYLLABICS PAAI
+1431 ; [.2553.0020.0002.1431] # CANADIAN SYLLABICS PI
+1432 ; [.2554.0020.0002.1432] # CANADIAN SYLLABICS PII
+1433 ; [.2555.0020.0002.1433] # CANADIAN SYLLABICS PO
+1434 ; [.2556.0020.0002.1434] # CANADIAN SYLLABICS POO
+1435 ; [.2557.0020.0002.1435] # CANADIAN SYLLABICS Y-CREE POO
+1436 ; [.2558.0020.0002.1436] # CANADIAN SYLLABICS CARRIER HEE
+1437 ; [.2559.0020.0002.1437] # CANADIAN SYLLABICS CARRIER HI
+1438 ; [.255A.0020.0002.1438] # CANADIAN SYLLABICS PA
+1439 ; [.255B.0020.0002.1439] # CANADIAN SYLLABICS PAA
+143A ; [.255C.0020.0002.143A] # CANADIAN SYLLABICS PWE
+143B ; [.255D.0020.0002.143B] # CANADIAN SYLLABICS WEST-CREE PWE
+143C ; [.255E.0020.0002.143C] # CANADIAN SYLLABICS PWI
+143D ; [.255F.0020.0002.143D] # CANADIAN SYLLABICS WEST-CREE PWI
+143E ; [.2560.0020.0002.143E] # CANADIAN SYLLABICS PWII
+143F ; [.2561.0020.0002.143F] # CANADIAN SYLLABICS WEST-CREE PWII
+1440 ; [.2562.0020.0002.1440] # CANADIAN SYLLABICS PWO
+1441 ; [.2563.0020.0002.1441] # CANADIAN SYLLABICS WEST-CREE PWO
+1442 ; [.2564.0020.0002.1442] # CANADIAN SYLLABICS PWOO
+1443 ; [.2565.0020.0002.1443] # CANADIAN SYLLABICS WEST-CREE PWOO
+1444 ; [.2566.0020.0002.1444] # CANADIAN SYLLABICS PWA
+1445 ; [.2567.0020.0002.1445] # CANADIAN SYLLABICS WEST-CREE PWA
+1446 ; [.2568.0020.0002.1446] # CANADIAN SYLLABICS PWAA
+1447 ; [.2569.0020.0002.1447] # CANADIAN SYLLABICS WEST-CREE PWAA
+1448 ; [.256A.0020.0002.1448] # CANADIAN SYLLABICS Y-CREE PWAA
+1449 ; [.256B.0020.0002.1449] # CANADIAN SYLLABICS P
+144A ; [.256C.0020.0002.144A] # CANADIAN SYLLABICS WEST-CREE P
+144B ; [.256D.0020.0002.144B] # CANADIAN SYLLABICS CARRIER H
+144C ; [.256E.0020.0002.144C] # CANADIAN SYLLABICS TE
+144D ; [.256F.0020.0002.144D] # CANADIAN SYLLABICS TAAI
+144E ; [.2570.0020.0002.144E] # CANADIAN SYLLABICS TI
+144F ; [.2571.0020.0002.144F] # CANADIAN SYLLABICS TII
+1450 ; [.2572.0020.0002.1450] # CANADIAN SYLLABICS TO
+1451 ; [.2573.0020.0002.1451] # CANADIAN SYLLABICS TOO
+1452 ; [.2574.0020.0002.1452] # CANADIAN SYLLABICS Y-CREE TOO
+1453 ; [.2575.0020.0002.1453] # CANADIAN SYLLABICS CARRIER DEE
+1454 ; [.2576.0020.0002.1454] # CANADIAN SYLLABICS CARRIER DI
+1455 ; [.2577.0020.0002.1455] # CANADIAN SYLLABICS TA
+1456 ; [.2578.0020.0002.1456] # CANADIAN SYLLABICS TAA
+1457 ; [.2579.0020.0002.1457] # CANADIAN SYLLABICS TWE
+1458 ; [.257A.0020.0002.1458] # CANADIAN SYLLABICS WEST-CREE TWE
+1459 ; [.257B.0020.0002.1459] # CANADIAN SYLLABICS TWI
+145A ; [.257C.0020.0002.145A] # CANADIAN SYLLABICS WEST-CREE TWI
+145B ; [.257D.0020.0002.145B] # CANADIAN SYLLABICS TWII
+145C ; [.257E.0020.0002.145C] # CANADIAN SYLLABICS WEST-CREE TWII
+145D ; [.257F.0020.0002.145D] # CANADIAN SYLLABICS TWO
+145E ; [.2580.0020.0002.145E] # CANADIAN SYLLABICS WEST-CREE TWO
+145F ; [.2581.0020.0002.145F] # CANADIAN SYLLABICS TWOO
+1460 ; [.2582.0020.0002.1460] # CANADIAN SYLLABICS WEST-CREE TWOO
+1461 ; [.2583.0020.0002.1461] # CANADIAN SYLLABICS TWA
+1462 ; [.2584.0020.0002.1462] # CANADIAN SYLLABICS WEST-CREE TWA
+1463 ; [.2585.0020.0002.1463] # CANADIAN SYLLABICS TWAA
+1464 ; [.2586.0020.0002.1464] # CANADIAN SYLLABICS WEST-CREE TWAA
+1465 ; [.2587.0020.0002.1465] # CANADIAN SYLLABICS NASKAPI TWAA
+1466 ; [.2588.0020.0002.1466] # CANADIAN SYLLABICS T
+1467 ; [.2589.0020.0002.1467] # CANADIAN SYLLABICS TTE
+1468 ; [.258A.0020.0002.1468] # CANADIAN SYLLABICS TTI
+1469 ; [.258B.0020.0002.1469] # CANADIAN SYLLABICS TTO
+146A ; [.258C.0020.0002.146A] # CANADIAN SYLLABICS TTA
+146B ; [.258D.0020.0002.146B] # CANADIAN SYLLABICS KE
+146C ; [.258E.0020.0002.146C] # CANADIAN SYLLABICS KAAI
+146D ; [.258F.0020.0002.146D] # CANADIAN SYLLABICS KI
+146E ; [.2590.0020.0002.146E] # CANADIAN SYLLABICS KII
+146F ; [.2591.0020.0002.146F] # CANADIAN SYLLABICS KO
+1470 ; [.2592.0020.0002.1470] # CANADIAN SYLLABICS KOO
+1471 ; [.2593.0020.0002.1471] # CANADIAN SYLLABICS Y-CREE KOO
+1472 ; [.2594.0020.0002.1472] # CANADIAN SYLLABICS KA
+1473 ; [.2595.0020.0002.1473] # CANADIAN SYLLABICS KAA
+1474 ; [.2596.0020.0002.1474] # CANADIAN SYLLABICS KWE
+1475 ; [.2597.0020.0002.1475] # CANADIAN SYLLABICS WEST-CREE KWE
+1476 ; [.2598.0020.0002.1476] # CANADIAN SYLLABICS KWI
+1477 ; [.2599.0020.0002.1477] # CANADIAN SYLLABICS WEST-CREE KWI
+1478 ; [.259A.0020.0002.1478] # CANADIAN SYLLABICS KWII
+1479 ; [.259B.0020.0002.1479] # CANADIAN SYLLABICS WEST-CREE KWII
+147A ; [.259C.0020.0002.147A] # CANADIAN SYLLABICS KWO
+147B ; [.259D.0020.0002.147B] # CANADIAN SYLLABICS WEST-CREE KWO
+147C ; [.259E.0020.0002.147C] # CANADIAN SYLLABICS KWOO
+147D ; [.259F.0020.0002.147D] # CANADIAN SYLLABICS WEST-CREE KWOO
+147E ; [.25A0.0020.0002.147E] # CANADIAN SYLLABICS KWA
+147F ; [.25A1.0020.0002.147F] # CANADIAN SYLLABICS WEST-CREE KWA
+1480 ; [.25A2.0020.0002.1480] # CANADIAN SYLLABICS KWAA
+1481 ; [.25A3.0020.0002.1481] # CANADIAN SYLLABICS WEST-CREE KWAA
+1482 ; [.25A4.0020.0002.1482] # CANADIAN SYLLABICS NASKAPI KWAA
+1483 ; [.25A5.0020.0002.1483] # CANADIAN SYLLABICS K
+1484 ; [.25A6.0020.0002.1484] # CANADIAN SYLLABICS KW
+1485 ; [.25A7.0020.0002.1485] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486 ; [.25A8.0020.0002.1486] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487 ; [.25A9.0020.0002.1487] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488 ; [.25AA.0020.0002.1488] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489 ; [.25AB.0020.0002.1489] # CANADIAN SYLLABICS CE
+148A ; [.25AC.0020.0002.148A] # CANADIAN SYLLABICS CAAI
+148B ; [.25AD.0020.0002.148B] # CANADIAN SYLLABICS CI
+148C ; [.25AE.0020.0002.148C] # CANADIAN SYLLABICS CII
+148D ; [.25AF.0020.0002.148D] # CANADIAN SYLLABICS CO
+148E ; [.25B0.0020.0002.148E] # CANADIAN SYLLABICS COO
+148F ; [.25B1.0020.0002.148F] # CANADIAN SYLLABICS Y-CREE COO
+1490 ; [.25B2.0020.0002.1490] # CANADIAN SYLLABICS CA
+1491 ; [.25B3.0020.0002.1491] # CANADIAN SYLLABICS CAA
+1492 ; [.25B4.0020.0002.1492] # CANADIAN SYLLABICS CWE
+1493 ; [.25B5.0020.0002.1493] # CANADIAN SYLLABICS WEST-CREE CWE
+1494 ; [.25B6.0020.0002.1494] # CANADIAN SYLLABICS CWI
+1495 ; [.25B7.0020.0002.1495] # CANADIAN SYLLABICS WEST-CREE CWI
+1496 ; [.25B8.0020.0002.1496] # CANADIAN SYLLABICS CWII
+1497 ; [.25B9.0020.0002.1497] # CANADIAN SYLLABICS WEST-CREE CWII
+1498 ; [.25BA.0020.0002.1498] # CANADIAN SYLLABICS CWO
+1499 ; [.25BB.0020.0002.1499] # CANADIAN SYLLABICS WEST-CREE CWO
+149A ; [.25BC.0020.0002.149A] # CANADIAN SYLLABICS CWOO
+149B ; [.25BD.0020.0002.149B] # CANADIAN SYLLABICS WEST-CREE CWOO
+149C ; [.25BE.0020.0002.149C] # CANADIAN SYLLABICS CWA
+149D ; [.25BF.0020.0002.149D] # CANADIAN SYLLABICS WEST-CREE CWA
+149E ; [.25C0.0020.0002.149E] # CANADIAN SYLLABICS CWAA
+149F ; [.25C1.0020.0002.149F] # CANADIAN SYLLABICS WEST-CREE CWAA
+14A0 ; [.25C2.0020.0002.14A0] # CANADIAN SYLLABICS NASKAPI CWAA
+14A1 ; [.25C3.0020.0002.14A1] # CANADIAN SYLLABICS C
+14A2 ; [.25C4.0020.0002.14A2] # CANADIAN SYLLABICS SAYISI TH
+14A3 ; [.25C5.0020.0002.14A3] # CANADIAN SYLLABICS ME
+14A4 ; [.25C6.0020.0002.14A4] # CANADIAN SYLLABICS MAAI
+14A5 ; [.25C7.0020.0002.14A5] # CANADIAN SYLLABICS MI
+14A6 ; [.25C8.0020.0002.14A6] # CANADIAN SYLLABICS MII
+14A7 ; [.25C9.0020.0002.14A7] # CANADIAN SYLLABICS MO
+14A8 ; [.25CA.0020.0002.14A8] # CANADIAN SYLLABICS MOO
+14A9 ; [.25CB.0020.0002.14A9] # CANADIAN SYLLABICS Y-CREE MOO
+14AA ; [.25CC.0020.0002.14AA] # CANADIAN SYLLABICS MA
+14AB ; [.25CD.0020.0002.14AB] # CANADIAN SYLLABICS MAA
+14AC ; [.25CE.0020.0002.14AC] # CANADIAN SYLLABICS MWE
+14AD ; [.25CF.0020.0002.14AD] # CANADIAN SYLLABICS WEST-CREE MWE
+14AE ; [.25D0.0020.0002.14AE] # CANADIAN SYLLABICS MWI
+14AF ; [.25D1.0020.0002.14AF] # CANADIAN SYLLABICS WEST-CREE MWI
+14B0 ; [.25D2.0020.0002.14B0] # CANADIAN SYLLABICS MWII
+14B1 ; [.25D3.0020.0002.14B1] # CANADIAN SYLLABICS WEST-CREE MWII
+14B2 ; [.25D4.0020.0002.14B2] # CANADIAN SYLLABICS MWO
+14B3 ; [.25D5.0020.0002.14B3] # CANADIAN SYLLABICS WEST-CREE MWO
+14B4 ; [.25D6.0020.0002.14B4] # CANADIAN SYLLABICS MWOO
+14B5 ; [.25D7.0020.0002.14B5] # CANADIAN SYLLABICS WEST-CREE MWOO
+14B6 ; [.25D8.0020.0002.14B6] # CANADIAN SYLLABICS MWA
+14B7 ; [.25D9.0020.0002.14B7] # CANADIAN SYLLABICS WEST-CREE MWA
+14B8 ; [.25DA.0020.0002.14B8] # CANADIAN SYLLABICS MWAA
+14B9 ; [.25DB.0020.0002.14B9] # CANADIAN SYLLABICS WEST-CREE MWAA
+14BA ; [.25DC.0020.0002.14BA] # CANADIAN SYLLABICS NASKAPI MWAA
+14BB ; [.25DD.0020.0002.14BB] # CANADIAN SYLLABICS M
+14BC ; [.25DE.0020.0002.14BC] # CANADIAN SYLLABICS WEST-CREE M
+14BD ; [.25DF.0020.0002.14BD] # CANADIAN SYLLABICS MH
+14BE ; [.25E0.0020.0002.14BE] # CANADIAN SYLLABICS ATHAPASCAN M
+14BF ; [.25E1.0020.0002.14BF] # CANADIAN SYLLABICS SAYISI M
+14C0 ; [.25E2.0020.0002.14C0] # CANADIAN SYLLABICS NE
+14C1 ; [.25E3.0020.0002.14C1] # CANADIAN SYLLABICS NAAI
+14C2 ; [.25E4.0020.0002.14C2] # CANADIAN SYLLABICS NI
+14C3 ; [.25E5.0020.0002.14C3] # CANADIAN SYLLABICS NII
+14C4 ; [.25E6.0020.0002.14C4] # CANADIAN SYLLABICS NO
+14C5 ; [.25E7.0020.0002.14C5] # CANADIAN SYLLABICS NOO
+14C6 ; [.25E8.0020.0002.14C6] # CANADIAN SYLLABICS Y-CREE NOO
+14C7 ; [.25E9.0020.0002.14C7] # CANADIAN SYLLABICS NA
+14C8 ; [.25EA.0020.0002.14C8] # CANADIAN SYLLABICS NAA
+14C9 ; [.25EB.0020.0002.14C9] # CANADIAN SYLLABICS NWE
+14CA ; [.25EC.0020.0002.14CA] # CANADIAN SYLLABICS WEST-CREE NWE
+14CB ; [.25ED.0020.0002.14CB] # CANADIAN SYLLABICS NWA
+14CC ; [.25EE.0020.0002.14CC] # CANADIAN SYLLABICS WEST-CREE NWA
+14CD ; [.25EF.0020.0002.14CD] # CANADIAN SYLLABICS NWAA
+14CE ; [.25F0.0020.0002.14CE] # CANADIAN SYLLABICS WEST-CREE NWAA
+14CF ; [.25F1.0020.0002.14CF] # CANADIAN SYLLABICS NASKAPI NWAA
+14D0 ; [.25F2.0020.0002.14D0] # CANADIAN SYLLABICS N
+14D1 ; [.25F3.0020.0002.14D1] # CANADIAN SYLLABICS CARRIER NG
+14D2 ; [.25F4.0020.0002.14D2] # CANADIAN SYLLABICS NH
+14D3 ; [.25F5.0020.0002.14D3] # CANADIAN SYLLABICS LE
+14D4 ; [.25F6.0020.0002.14D4] # CANADIAN SYLLABICS LAAI
+14D5 ; [.25F7.0020.0002.14D5] # CANADIAN SYLLABICS LI
+14D6 ; [.25F8.0020.0002.14D6] # CANADIAN SYLLABICS LII
+14D7 ; [.25F9.0020.0002.14D7] # CANADIAN SYLLABICS LO
+14D8 ; [.25FA.0020.0002.14D8] # CANADIAN SYLLABICS LOO
+14D9 ; [.25FB.0020.0002.14D9] # CANADIAN SYLLABICS Y-CREE LOO
+14DA ; [.25FC.0020.0002.14DA] # CANADIAN SYLLABICS LA
+14DB ; [.25FD.0020.0002.14DB] # CANADIAN SYLLABICS LAA
+14DC ; [.25FE.0020.0002.14DC] # CANADIAN SYLLABICS LWE
+14DD ; [.25FF.0020.0002.14DD] # CANADIAN SYLLABICS WEST-CREE LWE
+14DE ; [.2600.0020.0002.14DE] # CANADIAN SYLLABICS LWI
+14DF ; [.2601.0020.0002.14DF] # CANADIAN SYLLABICS WEST-CREE LWI
+14E0 ; [.2602.0020.0002.14E0] # CANADIAN SYLLABICS LWII
+14E1 ; [.2603.0020.0002.14E1] # CANADIAN SYLLABICS WEST-CREE LWII
+14E2 ; [.2604.0020.0002.14E2] # CANADIAN SYLLABICS LWO
+14E3 ; [.2605.0020.0002.14E3] # CANADIAN SYLLABICS WEST-CREE LWO
+14E4 ; [.2606.0020.0002.14E4] # CANADIAN SYLLABICS LWOO
+14E5 ; [.2607.0020.0002.14E5] # CANADIAN SYLLABICS WEST-CREE LWOO
+14E6 ; [.2608.0020.0002.14E6] # CANADIAN SYLLABICS LWA
+14E7 ; [.2609.0020.0002.14E7] # CANADIAN SYLLABICS WEST-CREE LWA
+14E8 ; [.260A.0020.0002.14E8] # CANADIAN SYLLABICS LWAA
+14E9 ; [.260B.0020.0002.14E9] # CANADIAN SYLLABICS WEST-CREE LWAA
+14EA ; [.260C.0020.0002.14EA] # CANADIAN SYLLABICS L
+14EB ; [.260D.0020.0002.14EB] # CANADIAN SYLLABICS WEST-CREE L
+14EC ; [.260E.0020.0002.14EC] # CANADIAN SYLLABICS MEDIAL L
+14ED ; [.260F.0020.0002.14ED] # CANADIAN SYLLABICS SE
+14EE ; [.2610.0020.0002.14EE] # CANADIAN SYLLABICS SAAI
+14EF ; [.2611.0020.0002.14EF] # CANADIAN SYLLABICS SI
+14F0 ; [.2612.0020.0002.14F0] # CANADIAN SYLLABICS SII
+14F1 ; [.2613.0020.0002.14F1] # CANADIAN SYLLABICS SO
+14F2 ; [.2614.0020.0002.14F2] # CANADIAN SYLLABICS SOO
+14F3 ; [.2615.0020.0002.14F3] # CANADIAN SYLLABICS Y-CREE SOO
+14F4 ; [.2616.0020.0002.14F4] # CANADIAN SYLLABICS SA
+14F5 ; [.2617.0020.0002.14F5] # CANADIAN SYLLABICS SAA
+14F6 ; [.2618.0020.0002.14F6] # CANADIAN SYLLABICS SWE
+14F7 ; [.2619.0020.0002.14F7] # CANADIAN SYLLABICS WEST-CREE SWE
+14F8 ; [.261A.0020.0002.14F8] # CANADIAN SYLLABICS SWI
+14F9 ; [.261B.0020.0002.14F9] # CANADIAN SYLLABICS WEST-CREE SWI
+14FA ; [.261C.0020.0002.14FA] # CANADIAN SYLLABICS SWII
+14FB ; [.261D.0020.0002.14FB] # CANADIAN SYLLABICS WEST-CREE SWII
+14FC ; [.261E.0020.0002.14FC] # CANADIAN SYLLABICS SWO
+14FD ; [.261F.0020.0002.14FD] # CANADIAN SYLLABICS WEST-CREE SWO
+14FE ; [.2620.0020.0002.14FE] # CANADIAN SYLLABICS SWOO
+14FF ; [.2621.0020.0002.14FF] # CANADIAN SYLLABICS WEST-CREE SWOO
+1500 ; [.2622.0020.0002.1500] # CANADIAN SYLLABICS SWA
+1501 ; [.2623.0020.0002.1501] # CANADIAN SYLLABICS WEST-CREE SWA
+1502 ; [.2624.0020.0002.1502] # CANADIAN SYLLABICS SWAA
+1503 ; [.2625.0020.0002.1503] # CANADIAN SYLLABICS WEST-CREE SWAA
+1504 ; [.2626.0020.0002.1504] # CANADIAN SYLLABICS NASKAPI SWAA
+1505 ; [.2627.0020.0002.1505] # CANADIAN SYLLABICS S
+1506 ; [.2628.0020.0002.1506] # CANADIAN SYLLABICS ATHAPASCAN S
+1507 ; [.2629.0020.0002.1507] # CANADIAN SYLLABICS SW
+1508 ; [.262A.0020.0002.1508] # CANADIAN SYLLABICS BLACKFOOT S
+1509 ; [.262B.0020.0002.1509] # CANADIAN SYLLABICS MOOSE-CREE SK
+150A ; [.262C.0020.0002.150A] # CANADIAN SYLLABICS NASKAPI SKW
+150B ; [.262D.0020.0002.150B] # CANADIAN SYLLABICS NASKAPI S-W
+150C ; [.262E.0020.0002.150C] # CANADIAN SYLLABICS NASKAPI SPWA
+150D ; [.262F.0020.0002.150D] # CANADIAN SYLLABICS NASKAPI STWA
+150E ; [.2630.0020.0002.150E] # CANADIAN SYLLABICS NASKAPI SKWA
+150F ; [.2631.0020.0002.150F] # CANADIAN SYLLABICS NASKAPI SCWA
+1510 ; [.2632.0020.0002.1510] # CANADIAN SYLLABICS SHE
+1511 ; [.2633.0020.0002.1511] # CANADIAN SYLLABICS SHI
+1512 ; [.2634.0020.0002.1512] # CANADIAN SYLLABICS SHII
+1513 ; [.2635.0020.0002.1513] # CANADIAN SYLLABICS SHO
+1514 ; [.2636.0020.0002.1514] # CANADIAN SYLLABICS SHOO
+1515 ; [.2637.0020.0002.1515] # CANADIAN SYLLABICS SHA
+1516 ; [.2638.0020.0002.1516] # CANADIAN SYLLABICS SHAA
+1517 ; [.2639.0020.0002.1517] # CANADIAN SYLLABICS SHWE
+1518 ; [.263A.0020.0002.1518] # CANADIAN SYLLABICS WEST-CREE SHWE
+1519 ; [.263B.0020.0002.1519] # CANADIAN SYLLABICS SHWI
+151A ; [.263C.0020.0002.151A] # CANADIAN SYLLABICS WEST-CREE SHWI
+151B ; [.263D.0020.0002.151B] # CANADIAN SYLLABICS SHWII
+151C ; [.263E.0020.0002.151C] # CANADIAN SYLLABICS WEST-CREE SHWII
+151D ; [.263F.0020.0002.151D] # CANADIAN SYLLABICS SHWO
+151E ; [.2640.0020.0002.151E] # CANADIAN SYLLABICS WEST-CREE SHWO
+151F ; [.2641.0020.0002.151F] # CANADIAN SYLLABICS SHWOO
+1520 ; [.2642.0020.0002.1520] # CANADIAN SYLLABICS WEST-CREE SHWOO
+1521 ; [.2643.0020.0002.1521] # CANADIAN SYLLABICS SHWA
+1522 ; [.2644.0020.0002.1522] # CANADIAN SYLLABICS WEST-CREE SHWA
+1523 ; [.2645.0020.0002.1523] # CANADIAN SYLLABICS SHWAA
+1524 ; [.2646.0020.0002.1524] # CANADIAN SYLLABICS WEST-CREE SHWAA
+1525 ; [.2647.0020.0002.1525] # CANADIAN SYLLABICS SH
+1526 ; [.2648.0020.0002.1526] # CANADIAN SYLLABICS YE
+1527 ; [.2649.0020.0002.1527] # CANADIAN SYLLABICS YAAI
+1528 ; [.264A.0020.0002.1528] # CANADIAN SYLLABICS YI
+1529 ; [.264B.0020.0002.1529] # CANADIAN SYLLABICS YII
+152A ; [.264C.0020.0002.152A] # CANADIAN SYLLABICS YO
+152B ; [.264D.0020.0002.152B] # CANADIAN SYLLABICS YOO
+152C ; [.264E.0020.0002.152C] # CANADIAN SYLLABICS Y-CREE YOO
+152D ; [.264F.0020.0002.152D] # CANADIAN SYLLABICS YA
+152E ; [.2650.0020.0002.152E] # CANADIAN SYLLABICS YAA
+152F ; [.2651.0020.0002.152F] # CANADIAN SYLLABICS YWE
+1530 ; [.2652.0020.0002.1530] # CANADIAN SYLLABICS WEST-CREE YWE
+1531 ; [.2653.0020.0002.1531] # CANADIAN SYLLABICS YWI
+1532 ; [.2654.0020.0002.1532] # CANADIAN SYLLABICS WEST-CREE YWI
+1533 ; [.2655.0020.0002.1533] # CANADIAN SYLLABICS YWII
+1534 ; [.2656.0020.0002.1534] # CANADIAN SYLLABICS WEST-CREE YWII
+1535 ; [.2657.0020.0002.1535] # CANADIAN SYLLABICS YWO
+1536 ; [.2658.0020.0002.1536] # CANADIAN SYLLABICS WEST-CREE YWO
+1537 ; [.2659.0020.0002.1537] # CANADIAN SYLLABICS YWOO
+1538 ; [.265A.0020.0002.1538] # CANADIAN SYLLABICS WEST-CREE YWOO
+1539 ; [.265B.0020.0002.1539] # CANADIAN SYLLABICS YWA
+153A ; [.265C.0020.0002.153A] # CANADIAN SYLLABICS WEST-CREE YWA
+153B ; [.265D.0020.0002.153B] # CANADIAN SYLLABICS YWAA
+153C ; [.265E.0020.0002.153C] # CANADIAN SYLLABICS WEST-CREE YWAA
+153D ; [.265F.0020.0002.153D] # CANADIAN SYLLABICS NASKAPI YWAA
+153E ; [.2660.0020.0002.153E] # CANADIAN SYLLABICS Y
+153F ; [.2661.0020.0002.153F] # CANADIAN SYLLABICS BIBLE-CREE Y
+1540 ; [.2662.0020.0002.1540] # CANADIAN SYLLABICS WEST-CREE Y
+1541 ; [.2663.0020.0002.1541] # CANADIAN SYLLABICS SAYISI YI
+1542 ; [.2664.0020.0002.1542] # CANADIAN SYLLABICS RE
+1543 ; [.2665.0020.0002.1543] # CANADIAN SYLLABICS R-CREE RE
+1544 ; [.2666.0020.0002.1544] # CANADIAN SYLLABICS WEST-CREE LE
+1545 ; [.2667.0020.0002.1545] # CANADIAN SYLLABICS RAAI
+1546 ; [.2668.0020.0002.1546] # CANADIAN SYLLABICS RI
+1547 ; [.2669.0020.0002.1547] # CANADIAN SYLLABICS RII
+1548 ; [.266A.0020.0002.1548] # CANADIAN SYLLABICS RO
+1549 ; [.266B.0020.0002.1549] # CANADIAN SYLLABICS ROO
+154A ; [.266C.0020.0002.154A] # CANADIAN SYLLABICS WEST-CREE LO
+154B ; [.266D.0020.0002.154B] # CANADIAN SYLLABICS RA
+154C ; [.266E.0020.0002.154C] # CANADIAN SYLLABICS RAA
+154D ; [.266F.0020.0002.154D] # CANADIAN SYLLABICS WEST-CREE LA
+154E ; [.2670.0020.0002.154E] # CANADIAN SYLLABICS RWAA
+154F ; [.2671.0020.0002.154F] # CANADIAN SYLLABICS WEST-CREE RWAA
+1550 ; [.2672.0020.0002.1550] # CANADIAN SYLLABICS R
+1551 ; [.2673.0020.0002.1551] # CANADIAN SYLLABICS WEST-CREE R
+1552 ; [.2674.0020.0002.1552] # CANADIAN SYLLABICS MEDIAL R
+1553 ; [.2675.0020.0002.1553] # CANADIAN SYLLABICS FE
+1554 ; [.2676.0020.0002.1554] # CANADIAN SYLLABICS FAAI
+1555 ; [.2677.0020.0002.1555] # CANADIAN SYLLABICS FI
+1556 ; [.2678.0020.0002.1556] # CANADIAN SYLLABICS FII
+1557 ; [.2679.0020.0002.1557] # CANADIAN SYLLABICS FO
+1558 ; [.267A.0020.0002.1558] # CANADIAN SYLLABICS FOO
+1559 ; [.267B.0020.0002.1559] # CANADIAN SYLLABICS FA
+155A ; [.267C.0020.0002.155A] # CANADIAN SYLLABICS FAA
+155B ; [.267D.0020.0002.155B] # CANADIAN SYLLABICS FWAA
+155C ; [.267E.0020.0002.155C] # CANADIAN SYLLABICS WEST-CREE FWAA
+155D ; [.267F.0020.0002.155D] # CANADIAN SYLLABICS F
+155E ; [.2680.0020.0002.155E] # CANADIAN SYLLABICS THE
+155F ; [.2681.0020.0002.155F] # CANADIAN SYLLABICS N-CREE THE
+1560 ; [.2682.0020.0002.1560] # CANADIAN SYLLABICS THI
+1561 ; [.2683.0020.0002.1561] # CANADIAN SYLLABICS N-CREE THI
+1562 ; [.2684.0020.0002.1562] # CANADIAN SYLLABICS THII
+1563 ; [.2685.0020.0002.1563] # CANADIAN SYLLABICS N-CREE THII
+1564 ; [.2686.0020.0002.1564] # CANADIAN SYLLABICS THO
+1565 ; [.2687.0020.0002.1565] # CANADIAN SYLLABICS THOO
+1566 ; [.2688.0020.0002.1566] # CANADIAN SYLLABICS THA
+1567 ; [.2689.0020.0002.1567] # CANADIAN SYLLABICS THAA
+1568 ; [.268A.0020.0002.1568] # CANADIAN SYLLABICS THWAA
+1569 ; [.268B.0020.0002.1569] # CANADIAN SYLLABICS WEST-CREE THWAA
+156A ; [.268C.0020.0002.156A] # CANADIAN SYLLABICS TH
+156B ; [.268D.0020.0002.156B] # CANADIAN SYLLABICS TTHE
+156C ; [.268E.0020.0002.156C] # CANADIAN SYLLABICS TTHI
+156D ; [.268F.0020.0002.156D] # CANADIAN SYLLABICS TTHO
+156E ; [.2690.0020.0002.156E] # CANADIAN SYLLABICS TTHA
+156F ; [.2691.0020.0002.156F] # CANADIAN SYLLABICS TTH
+1570 ; [.2692.0020.0002.1570] # CANADIAN SYLLABICS TYE
+1571 ; [.2693.0020.0002.1571] # CANADIAN SYLLABICS TYI
+1572 ; [.2694.0020.0002.1572] # CANADIAN SYLLABICS TYO
+1573 ; [.2695.0020.0002.1573] # CANADIAN SYLLABICS TYA
+1574 ; [.2696.0020.0002.1574] # CANADIAN SYLLABICS NUNAVIK HE
+1575 ; [.2697.0020.0002.1575] # CANADIAN SYLLABICS NUNAVIK HI
+1576 ; [.2698.0020.0002.1576] # CANADIAN SYLLABICS NUNAVIK HII
+1577 ; [.2699.0020.0002.1577] # CANADIAN SYLLABICS NUNAVIK HO
+1578 ; [.269A.0020.0002.1578] # CANADIAN SYLLABICS NUNAVIK HOO
+1579 ; [.269B.0020.0002.1579] # CANADIAN SYLLABICS NUNAVIK HA
+157A ; [.269C.0020.0002.157A] # CANADIAN SYLLABICS NUNAVIK HAA
+157B ; [.269D.0020.0002.157B] # CANADIAN SYLLABICS NUNAVIK H
+157D ; [.269E.0020.0002.157D] # CANADIAN SYLLABICS HK
+166F ; [.269F.0020.0002.166F] # CANADIAN SYLLABICS QAI
+157E ; [.26A0.0020.0002.157E] # CANADIAN SYLLABICS QAAI
+157F ; [.26A1.0020.0002.157F] # CANADIAN SYLLABICS QI
+1580 ; [.26A2.0020.0002.1580] # CANADIAN SYLLABICS QII
+1581 ; [.26A3.0020.0002.1581] # CANADIAN SYLLABICS QO
+1582 ; [.26A4.0020.0002.1582] # CANADIAN SYLLABICS QOO
+1583 ; [.26A5.0020.0002.1583] # CANADIAN SYLLABICS QA
+1584 ; [.26A6.0020.0002.1584] # CANADIAN SYLLABICS QAA
+1585 ; [.26A7.0020.0002.1585] # CANADIAN SYLLABICS Q
+1586 ; [.26A8.0020.0002.1586] # CANADIAN SYLLABICS TLHE
+1587 ; [.26A9.0020.0002.1587] # CANADIAN SYLLABICS TLHI
+1588 ; [.26AA.0020.0002.1588] # CANADIAN SYLLABICS TLHO
+1589 ; [.26AB.0020.0002.1589] # CANADIAN SYLLABICS TLHA
+158A ; [.26AC.0020.0002.158A] # CANADIAN SYLLABICS WEST-CREE RE
+158B ; [.26AD.0020.0002.158B] # CANADIAN SYLLABICS WEST-CREE RI
+158C ; [.26AE.0020.0002.158C] # CANADIAN SYLLABICS WEST-CREE RO
+158D ; [.26AF.0020.0002.158D] # CANADIAN SYLLABICS WEST-CREE RA
+1670 ; [.26B0.0020.0002.1670] # CANADIAN SYLLABICS NGAI
+158E ; [.26B1.0020.0002.158E] # CANADIAN SYLLABICS NGAAI
+158F ; [.26B2.0020.0002.158F] # CANADIAN SYLLABICS NGI
+1590 ; [.26B3.0020.0002.1590] # CANADIAN SYLLABICS NGII
+1591 ; [.26B4.0020.0002.1591] # CANADIAN SYLLABICS NGO
+1592 ; [.26B5.0020.0002.1592] # CANADIAN SYLLABICS NGOO
+1593 ; [.26B6.0020.0002.1593] # CANADIAN SYLLABICS NGA
+1594 ; [.26B7.0020.0002.1594] # CANADIAN SYLLABICS NGAA
+1595 ; [.26B8.0020.0002.1595] # CANADIAN SYLLABICS NG
+1671 ; [.26B9.0020.0002.1671] # CANADIAN SYLLABICS NNGI
+1672 ; [.26BA.0020.0002.1672] # CANADIAN SYLLABICS NNGII
+1673 ; [.26BB.0020.0002.1673] # CANADIAN SYLLABICS NNGO
+1674 ; [.26BC.0020.0002.1674] # CANADIAN SYLLABICS NNGOO
+1675 ; [.26BD.0020.0002.1675] # CANADIAN SYLLABICS NNGA
+1676 ; [.26BE.0020.0002.1676] # CANADIAN SYLLABICS NNGAA
+1596 ; [.26BF.0020.0002.1596] # CANADIAN SYLLABICS NNG
+1597 ; [.26C0.0020.0002.1597] # CANADIAN SYLLABICS SAYISI SHE
+1598 ; [.26C1.0020.0002.1598] # CANADIAN SYLLABICS SAYISI SHI
+1599 ; [.26C2.0020.0002.1599] # CANADIAN SYLLABICS SAYISI SHO
+159A ; [.26C3.0020.0002.159A] # CANADIAN SYLLABICS SAYISI SHA
+159B ; [.26C4.0020.0002.159B] # CANADIAN SYLLABICS WOODS-CREE THE
+159C ; [.26C5.0020.0002.159C] # CANADIAN SYLLABICS WOODS-CREE THI
+159D ; [.26C6.0020.0002.159D] # CANADIAN SYLLABICS WOODS-CREE THO
+159E ; [.26C7.0020.0002.159E] # CANADIAN SYLLABICS WOODS-CREE THA
+159F ; [.26C8.0020.0002.159F] # CANADIAN SYLLABICS WOODS-CREE TH
+15A0 ; [.26C9.0020.0002.15A0] # CANADIAN SYLLABICS LHI
+15A1 ; [.26CA.0020.0002.15A1] # CANADIAN SYLLABICS LHII
+15A2 ; [.26CB.0020.0002.15A2] # CANADIAN SYLLABICS LHO
+15A3 ; [.26CC.0020.0002.15A3] # CANADIAN SYLLABICS LHOO
+15A4 ; [.26CD.0020.0002.15A4] # CANADIAN SYLLABICS LHA
+15A5 ; [.26CE.0020.0002.15A5] # CANADIAN SYLLABICS LHAA
+15A6 ; [.26CF.0020.0002.15A6] # CANADIAN SYLLABICS LH
+157C ; [.26D0.0020.0002.157C] # CANADIAN SYLLABICS NUNAVUT H
+15A7 ; [.26D1.0020.0002.15A7] # CANADIAN SYLLABICS TH-CREE THE
+15A8 ; [.26D2.0020.0002.15A8] # CANADIAN SYLLABICS TH-CREE THI
+15A9 ; [.26D3.0020.0002.15A9] # CANADIAN SYLLABICS TH-CREE THII
+15AA ; [.26D4.0020.0002.15AA] # CANADIAN SYLLABICS TH-CREE THO
+15AB ; [.26D5.0020.0002.15AB] # CANADIAN SYLLABICS TH-CREE THOO
+15AC ; [.26D6.0020.0002.15AC] # CANADIAN SYLLABICS TH-CREE THA
+15AD ; [.26D7.0020.0002.15AD] # CANADIAN SYLLABICS TH-CREE THAA
+15AE ; [.26D8.0020.0002.15AE] # CANADIAN SYLLABICS TH-CREE TH
+15AF ; [.26D9.0020.0002.15AF] # CANADIAN SYLLABICS AIVILIK B
+15B0 ; [.26DA.0020.0002.15B0] # CANADIAN SYLLABICS BLACKFOOT E
+15B1 ; [.26DB.0020.0002.15B1] # CANADIAN SYLLABICS BLACKFOOT I
+15B2 ; [.26DC.0020.0002.15B2] # CANADIAN SYLLABICS BLACKFOOT O
+15B3 ; [.26DD.0020.0002.15B3] # CANADIAN SYLLABICS BLACKFOOT A
+15B4 ; [.26DE.0020.0002.15B4] # CANADIAN SYLLABICS BLACKFOOT WE
+15B5 ; [.26DF.0020.0002.15B5] # CANADIAN SYLLABICS BLACKFOOT WI
+15B6 ; [.26E0.0020.0002.15B6] # CANADIAN SYLLABICS BLACKFOOT WO
+15B7 ; [.26E1.0020.0002.15B7] # CANADIAN SYLLABICS BLACKFOOT WA
+15B8 ; [.26E2.0020.0002.15B8] # CANADIAN SYLLABICS BLACKFOOT NE
+15B9 ; [.26E3.0020.0002.15B9] # CANADIAN SYLLABICS BLACKFOOT NI
+15BA ; [.26E4.0020.0002.15BA] # CANADIAN SYLLABICS BLACKFOOT NO
+15BB ; [.26E5.0020.0002.15BB] # CANADIAN SYLLABICS BLACKFOOT NA
+15BC ; [.26E6.0020.0002.15BC] # CANADIAN SYLLABICS BLACKFOOT KE
+15BD ; [.26E7.0020.0002.15BD] # CANADIAN SYLLABICS BLACKFOOT KI
+15BE ; [.26E8.0020.0002.15BE] # CANADIAN SYLLABICS BLACKFOOT KO
+15BF ; [.26E9.0020.0002.15BF] # CANADIAN SYLLABICS BLACKFOOT KA
+15C0 ; [.26EA.0020.0002.15C0] # CANADIAN SYLLABICS SAYISI HE
+15C1 ; [.26EB.0020.0002.15C1] # CANADIAN SYLLABICS SAYISI HI
+15C2 ; [.26EC.0020.0002.15C2] # CANADIAN SYLLABICS SAYISI HO
+15C3 ; [.26ED.0020.0002.15C3] # CANADIAN SYLLABICS SAYISI HA
+15C4 ; [.26EE.0020.0002.15C4] # CANADIAN SYLLABICS CARRIER GHU
+15C5 ; [.26EF.0020.0002.15C5] # CANADIAN SYLLABICS CARRIER GHO
+15C6 ; [.26F0.0020.0002.15C6] # CANADIAN SYLLABICS CARRIER GHE
+15C7 ; [.26F1.0020.0002.15C7] # CANADIAN SYLLABICS CARRIER GHEE
+15C8 ; [.26F2.0020.0002.15C8] # CANADIAN SYLLABICS CARRIER GHI
+15C9 ; [.26F3.0020.0002.15C9] # CANADIAN SYLLABICS CARRIER GHA
+15CA ; [.26F4.0020.0002.15CA] # CANADIAN SYLLABICS CARRIER RU
+15CB ; [.26F5.0020.0002.15CB] # CANADIAN SYLLABICS CARRIER RO
+15CC ; [.26F6.0020.0002.15CC] # CANADIAN SYLLABICS CARRIER RE
+15CD ; [.26F7.0020.0002.15CD] # CANADIAN SYLLABICS CARRIER REE
+15CE ; [.26F8.0020.0002.15CE] # CANADIAN SYLLABICS CARRIER RI
+15CF ; [.26F9.0020.0002.15CF] # CANADIAN SYLLABICS CARRIER RA
+15D0 ; [.26FA.0020.0002.15D0] # CANADIAN SYLLABICS CARRIER WU
+15D1 ; [.26FB.0020.0002.15D1] # CANADIAN SYLLABICS CARRIER WO
+15D2 ; [.26FC.0020.0002.15D2] # CANADIAN SYLLABICS CARRIER WE
+15D3 ; [.26FD.0020.0002.15D3] # CANADIAN SYLLABICS CARRIER WEE
+15D4 ; [.26FE.0020.0002.15D4] # CANADIAN SYLLABICS CARRIER WI
+15D5 ; [.26FF.0020.0002.15D5] # CANADIAN SYLLABICS CARRIER WA
+15D6 ; [.2700.0020.0002.15D6] # CANADIAN SYLLABICS CARRIER HWU
+15D7 ; [.2701.0020.0002.15D7] # CANADIAN SYLLABICS CARRIER HWO
+15D8 ; [.2702.0020.0002.15D8] # CANADIAN SYLLABICS CARRIER HWE
+15D9 ; [.2703.0020.0002.15D9] # CANADIAN SYLLABICS CARRIER HWEE
+15DA ; [.2704.0020.0002.15DA] # CANADIAN SYLLABICS CARRIER HWI
+15DB ; [.2705.0020.0002.15DB] # CANADIAN SYLLABICS CARRIER HWA
+15DC ; [.2706.0020.0002.15DC] # CANADIAN SYLLABICS CARRIER THU
+15DD ; [.2707.0020.0002.15DD] # CANADIAN SYLLABICS CARRIER THO
+15DE ; [.2708.0020.0002.15DE] # CANADIAN SYLLABICS CARRIER THE
+15DF ; [.2709.0020.0002.15DF] # CANADIAN SYLLABICS CARRIER THEE
+15E0 ; [.270A.0020.0002.15E0] # CANADIAN SYLLABICS CARRIER THI
+15E1 ; [.270B.0020.0002.15E1] # CANADIAN SYLLABICS CARRIER THA
+15E2 ; [.270C.0020.0002.15E2] # CANADIAN SYLLABICS CARRIER TTU
+15E3 ; [.270D.0020.0002.15E3] # CANADIAN SYLLABICS CARRIER TTO
+15E4 ; [.270E.0020.0002.15E4] # CANADIAN SYLLABICS CARRIER TTE
+15E5 ; [.270F.0020.0002.15E5] # CANADIAN SYLLABICS CARRIER TTEE
+15E6 ; [.2710.0020.0002.15E6] # CANADIAN SYLLABICS CARRIER TTI
+15E7 ; [.2711.0020.0002.15E7] # CANADIAN SYLLABICS CARRIER TTA
+15E8 ; [.2712.0020.0002.15E8] # CANADIAN SYLLABICS CARRIER PU
+15E9 ; [.2713.0020.0002.15E9] # CANADIAN SYLLABICS CARRIER PO
+15EA ; [.2714.0020.0002.15EA] # CANADIAN SYLLABICS CARRIER PE
+15EB ; [.2715.0020.0002.15EB] # CANADIAN SYLLABICS CARRIER PEE
+15EC ; [.2716.0020.0002.15EC] # CANADIAN SYLLABICS CARRIER PI
+15ED ; [.2717.0020.0002.15ED] # CANADIAN SYLLABICS CARRIER PA
+15EE ; [.2718.0020.0002.15EE] # CANADIAN SYLLABICS CARRIER P
+15EF ; [.2719.0020.0002.15EF] # CANADIAN SYLLABICS CARRIER GU
+15F0 ; [.271A.0020.0002.15F0] # CANADIAN SYLLABICS CARRIER GO
+15F1 ; [.271B.0020.0002.15F1] # CANADIAN SYLLABICS CARRIER GE
+15F2 ; [.271C.0020.0002.15F2] # CANADIAN SYLLABICS CARRIER GEE
+15F3 ; [.271D.0020.0002.15F3] # CANADIAN SYLLABICS CARRIER GI
+15F4 ; [.271E.0020.0002.15F4] # CANADIAN SYLLABICS CARRIER GA
+15F5 ; [.271F.0020.0002.15F5] # CANADIAN SYLLABICS CARRIER KHU
+15F6 ; [.2720.0020.0002.15F6] # CANADIAN SYLLABICS CARRIER KHO
+15F7 ; [.2721.0020.0002.15F7] # CANADIAN SYLLABICS CARRIER KHE
+15F8 ; [.2722.0020.0002.15F8] # CANADIAN SYLLABICS CARRIER KHEE
+15F9 ; [.2723.0020.0002.15F9] # CANADIAN SYLLABICS CARRIER KHI
+15FA ; [.2724.0020.0002.15FA] # CANADIAN SYLLABICS CARRIER KHA
+15FB ; [.2725.0020.0002.15FB] # CANADIAN SYLLABICS CARRIER KKU
+15FC ; [.2726.0020.0002.15FC] # CANADIAN SYLLABICS CARRIER KKO
+15FD ; [.2727.0020.0002.15FD] # CANADIAN SYLLABICS CARRIER KKE
+15FE ; [.2728.0020.0002.15FE] # CANADIAN SYLLABICS CARRIER KKEE
+15FF ; [.2729.0020.0002.15FF] # CANADIAN SYLLABICS CARRIER KKI
+1600 ; [.272A.0020.0002.1600] # CANADIAN SYLLABICS CARRIER KKA
+1601 ; [.272B.0020.0002.1601] # CANADIAN SYLLABICS CARRIER KK
+1602 ; [.272C.0020.0002.1602] # CANADIAN SYLLABICS CARRIER NU
+1603 ; [.272D.0020.0002.1603] # CANADIAN SYLLABICS CARRIER NO
+1604 ; [.272E.0020.0002.1604] # CANADIAN SYLLABICS CARRIER NE
+1605 ; [.272F.0020.0002.1605] # CANADIAN SYLLABICS CARRIER NEE
+1606 ; [.2730.0020.0002.1606] # CANADIAN SYLLABICS CARRIER NI
+1607 ; [.2731.0020.0002.1607] # CANADIAN SYLLABICS CARRIER NA
+1608 ; [.2732.0020.0002.1608] # CANADIAN SYLLABICS CARRIER MU
+1609 ; [.2733.0020.0002.1609] # CANADIAN SYLLABICS CARRIER MO
+160A ; [.2734.0020.0002.160A] # CANADIAN SYLLABICS CARRIER ME
+160B ; [.2735.0020.0002.160B] # CANADIAN SYLLABICS CARRIER MEE
+160C ; [.2736.0020.0002.160C] # CANADIAN SYLLABICS CARRIER MI
+160D ; [.2737.0020.0002.160D] # CANADIAN SYLLABICS CARRIER MA
+160E ; [.2738.0020.0002.160E] # CANADIAN SYLLABICS CARRIER YU
+160F ; [.2739.0020.0002.160F] # CANADIAN SYLLABICS CARRIER YO
+1610 ; [.273A.0020.0002.1610] # CANADIAN SYLLABICS CARRIER YE
+1611 ; [.273B.0020.0002.1611] # CANADIAN SYLLABICS CARRIER YEE
+1612 ; [.273C.0020.0002.1612] # CANADIAN SYLLABICS CARRIER YI
+1613 ; [.273D.0020.0002.1613] # CANADIAN SYLLABICS CARRIER YA
+1614 ; [.273E.0020.0002.1614] # CANADIAN SYLLABICS CARRIER JU
+1615 ; [.273F.0020.0002.1615] # CANADIAN SYLLABICS SAYISI JU
+1616 ; [.2740.0020.0002.1616] # CANADIAN SYLLABICS CARRIER JO
+1617 ; [.2741.0020.0002.1617] # CANADIAN SYLLABICS CARRIER JE
+1618 ; [.2742.0020.0002.1618] # CANADIAN SYLLABICS CARRIER JEE
+1619 ; [.2743.0020.0002.1619] # CANADIAN SYLLABICS CARRIER JI
+161A ; [.2744.0020.0002.161A] # CANADIAN SYLLABICS SAYISI JI
+161B ; [.2745.0020.0002.161B] # CANADIAN SYLLABICS CARRIER JA
+161C ; [.2746.0020.0002.161C] # CANADIAN SYLLABICS CARRIER JJU
+161D ; [.2747.0020.0002.161D] # CANADIAN SYLLABICS CARRIER JJO
+161E ; [.2748.0020.0002.161E] # CANADIAN SYLLABICS CARRIER JJE
+161F ; [.2749.0020.0002.161F] # CANADIAN SYLLABICS CARRIER JJEE
+1620 ; [.274A.0020.0002.1620] # CANADIAN SYLLABICS CARRIER JJI
+1621 ; [.274B.0020.0002.1621] # CANADIAN SYLLABICS CARRIER JJA
+1622 ; [.274C.0020.0002.1622] # CANADIAN SYLLABICS CARRIER LU
+1623 ; [.274D.0020.0002.1623] # CANADIAN SYLLABICS CARRIER LO
+1624 ; [.274E.0020.0002.1624] # CANADIAN SYLLABICS CARRIER LE
+1625 ; [.274F.0020.0002.1625] # CANADIAN SYLLABICS CARRIER LEE
+1626 ; [.2750.0020.0002.1626] # CANADIAN SYLLABICS CARRIER LI
+1627 ; [.2751.0020.0002.1627] # CANADIAN SYLLABICS CARRIER LA
+1628 ; [.2752.0020.0002.1628] # CANADIAN SYLLABICS CARRIER DLU
+1629 ; [.2753.0020.0002.1629] # CANADIAN SYLLABICS CARRIER DLO
+162A ; [.2754.0020.0002.162A] # CANADIAN SYLLABICS CARRIER DLE
+162B ; [.2755.0020.0002.162B] # CANADIAN SYLLABICS CARRIER DLEE
+162C ; [.2756.0020.0002.162C] # CANADIAN SYLLABICS CARRIER DLI
+162D ; [.2757.0020.0002.162D] # CANADIAN SYLLABICS CARRIER DLA
+162E ; [.2758.0020.0002.162E] # CANADIAN SYLLABICS CARRIER LHU
+162F ; [.2759.0020.0002.162F] # CANADIAN SYLLABICS CARRIER LHO
+1630 ; [.275A.0020.0002.1630] # CANADIAN SYLLABICS CARRIER LHE
+1631 ; [.275B.0020.0002.1631] # CANADIAN SYLLABICS CARRIER LHEE
+1632 ; [.275C.0020.0002.1632] # CANADIAN SYLLABICS CARRIER LHI
+1633 ; [.275D.0020.0002.1633] # CANADIAN SYLLABICS CARRIER LHA
+1634 ; [.275E.0020.0002.1634] # CANADIAN SYLLABICS CARRIER TLHU
+1635 ; [.275F.0020.0002.1635] # CANADIAN SYLLABICS CARRIER TLHO
+1636 ; [.2760.0020.0002.1636] # CANADIAN SYLLABICS CARRIER TLHE
+1637 ; [.2761.0020.0002.1637] # CANADIAN SYLLABICS CARRIER TLHEE
+1638 ; [.2762.0020.0002.1638] # CANADIAN SYLLABICS CARRIER TLHI
+1639 ; [.2763.0020.0002.1639] # CANADIAN SYLLABICS CARRIER TLHA
+163A ; [.2764.0020.0002.163A] # CANADIAN SYLLABICS CARRIER TLU
+163B ; [.2765.0020.0002.163B] # CANADIAN SYLLABICS CARRIER TLO
+163C ; [.2766.0020.0002.163C] # CANADIAN SYLLABICS CARRIER TLE
+163D ; [.2767.0020.0002.163D] # CANADIAN SYLLABICS CARRIER TLEE
+163E ; [.2768.0020.0002.163E] # CANADIAN SYLLABICS CARRIER TLI
+163F ; [.2769.0020.0002.163F] # CANADIAN SYLLABICS CARRIER TLA
+1640 ; [.276A.0020.0002.1640] # CANADIAN SYLLABICS CARRIER ZU
+1641 ; [.276B.0020.0002.1641] # CANADIAN SYLLABICS CARRIER ZO
+1642 ; [.276C.0020.0002.1642] # CANADIAN SYLLABICS CARRIER ZE
+1643 ; [.276D.0020.0002.1643] # CANADIAN SYLLABICS CARRIER ZEE
+1644 ; [.276E.0020.0002.1644] # CANADIAN SYLLABICS CARRIER ZI
+1645 ; [.276F.0020.0002.1645] # CANADIAN SYLLABICS CARRIER ZA
+1646 ; [.2770.0020.0002.1646] # CANADIAN SYLLABICS CARRIER Z
+1647 ; [.2771.0020.0002.1647] # CANADIAN SYLLABICS CARRIER INITIAL Z
+1648 ; [.2772.0020.0002.1648] # CANADIAN SYLLABICS CARRIER DZU
+1649 ; [.2773.0020.0002.1649] # CANADIAN SYLLABICS CARRIER DZO
+164A ; [.2774.0020.0002.164A] # CANADIAN SYLLABICS CARRIER DZE
+164B ; [.2775.0020.0002.164B] # CANADIAN SYLLABICS CARRIER DZEE
+164C ; [.2776.0020.0002.164C] # CANADIAN SYLLABICS CARRIER DZI
+164D ; [.2777.0020.0002.164D] # CANADIAN SYLLABICS CARRIER DZA
+164E ; [.2778.0020.0002.164E] # CANADIAN SYLLABICS CARRIER SU
+164F ; [.2779.0020.0002.164F] # CANADIAN SYLLABICS CARRIER SO
+1650 ; [.277A.0020.0002.1650] # CANADIAN SYLLABICS CARRIER SE
+1651 ; [.277B.0020.0002.1651] # CANADIAN SYLLABICS CARRIER SEE
+1652 ; [.277C.0020.0002.1652] # CANADIAN SYLLABICS CARRIER SI
+1653 ; [.277D.0020.0002.1653] # CANADIAN SYLLABICS CARRIER SA
+1654 ; [.277E.0020.0002.1654] # CANADIAN SYLLABICS CARRIER SHU
+1655 ; [.277F.0020.0002.1655] # CANADIAN SYLLABICS CARRIER SHO
+1656 ; [.2780.0020.0002.1656] # CANADIAN SYLLABICS CARRIER SHE
+1657 ; [.2781.0020.0002.1657] # CANADIAN SYLLABICS CARRIER SHEE
+1658 ; [.2782.0020.0002.1658] # CANADIAN SYLLABICS CARRIER SHI
+1659 ; [.2783.0020.0002.1659] # CANADIAN SYLLABICS CARRIER SHA
+165A ; [.2784.0020.0002.165A] # CANADIAN SYLLABICS CARRIER SH
+165B ; [.2785.0020.0002.165B] # CANADIAN SYLLABICS CARRIER TSU
+165C ; [.2786.0020.0002.165C] # CANADIAN SYLLABICS CARRIER TSO
+165D ; [.2787.0020.0002.165D] # CANADIAN SYLLABICS CARRIER TSE
+165E ; [.2788.0020.0002.165E] # CANADIAN SYLLABICS CARRIER TSEE
+165F ; [.2789.0020.0002.165F] # CANADIAN SYLLABICS CARRIER TSI
+1660 ; [.278A.0020.0002.1660] # CANADIAN SYLLABICS CARRIER TSA
+1661 ; [.278B.0020.0002.1661] # CANADIAN SYLLABICS CARRIER CHU
+1662 ; [.278C.0020.0002.1662] # CANADIAN SYLLABICS CARRIER CHO
+1663 ; [.278D.0020.0002.1663] # CANADIAN SYLLABICS CARRIER CHE
+1664 ; [.278E.0020.0002.1664] # CANADIAN SYLLABICS CARRIER CHEE
+1665 ; [.278F.0020.0002.1665] # CANADIAN SYLLABICS CARRIER CHI
+1666 ; [.2790.0020.0002.1666] # CANADIAN SYLLABICS CARRIER CHA
+1667 ; [.2791.0020.0002.1667] # CANADIAN SYLLABICS CARRIER TTSU
+1668 ; [.2792.0020.0002.1668] # CANADIAN SYLLABICS CARRIER TTSO
+1669 ; [.2793.0020.0002.1669] # CANADIAN SYLLABICS CARRIER TTSE
+166A ; [.2794.0020.0002.166A] # CANADIAN SYLLABICS CARRIER TTSEE
+166B ; [.2795.0020.0002.166B] # CANADIAN SYLLABICS CARRIER TTSI
+166C ; [.2796.0020.0002.166C] # CANADIAN SYLLABICS CARRIER TTSA
+1677 ; [.2797.0020.0002.1677] # CANADIAN SYLLABICS WOODS-CREE THWEE
+1678 ; [.2798.0020.0002.1678] # CANADIAN SYLLABICS WOODS-CREE THWI
+1679 ; [.2799.0020.0002.1679] # CANADIAN SYLLABICS WOODS-CREE THWII
+167A ; [.279A.0020.0002.167A] # CANADIAN SYLLABICS WOODS-CREE THWO
+167B ; [.279B.0020.0002.167B] # CANADIAN SYLLABICS WOODS-CREE THWOO
+167C ; [.279C.0020.0002.167C] # CANADIAN SYLLABICS WOODS-CREE THWA
+167D ; [.279D.0020.0002.167D] # CANADIAN SYLLABICS WOODS-CREE THWAA
+167E ; [.279E.0020.0002.167E] # CANADIAN SYLLABICS WOODS-CREE FINAL TH
+167F ; [.279F.0020.0002.167F] # CANADIAN SYLLABICS BLACKFOOT W
+18B0 ; [.27A0.0020.0002.18B0] # CANADIAN SYLLABICS OY
+18B1 ; [.27A1.0020.0002.18B1] # CANADIAN SYLLABICS AY
+18B2 ; [.27A2.0020.0002.18B2] # CANADIAN SYLLABICS AAY
+18B3 ; [.27A3.0020.0002.18B3] # CANADIAN SYLLABICS WAY
+18B4 ; [.27A4.0020.0002.18B4] # CANADIAN SYLLABICS POY
+18B5 ; [.27A5.0020.0002.18B5] # CANADIAN SYLLABICS PAY
+18B6 ; [.27A6.0020.0002.18B6] # CANADIAN SYLLABICS PWOY
+18B7 ; [.27A7.0020.0002.18B7] # CANADIAN SYLLABICS TAY
+18B8 ; [.27A8.0020.0002.18B8] # CANADIAN SYLLABICS KAY
+18B9 ; [.27A9.0020.0002.18B9] # CANADIAN SYLLABICS KWAY
+18BA ; [.27AA.0020.0002.18BA] # CANADIAN SYLLABICS MAY
+18BB ; [.27AB.0020.0002.18BB] # CANADIAN SYLLABICS NOY
+18BC ; [.27AC.0020.0002.18BC] # CANADIAN SYLLABICS NAY
+18BD ; [.27AD.0020.0002.18BD] # CANADIAN SYLLABICS LAY
+18BE ; [.27AE.0020.0002.18BE] # CANADIAN SYLLABICS SOY
+18BF ; [.27AF.0020.0002.18BF] # CANADIAN SYLLABICS SAY
+18C0 ; [.27B0.0020.0002.18C0] # CANADIAN SYLLABICS SHOY
+18C1 ; [.27B1.0020.0002.18C1] # CANADIAN SYLLABICS SHAY
+18C2 ; [.27B2.0020.0002.18C2] # CANADIAN SYLLABICS SHWOY
+18C3 ; [.27B3.0020.0002.18C3] # CANADIAN SYLLABICS YOY
+18C4 ; [.27B4.0020.0002.18C4] # CANADIAN SYLLABICS YAY
+18C5 ; [.27B5.0020.0002.18C5] # CANADIAN SYLLABICS RAY
+18C6 ; [.27B6.0020.0002.18C6] # CANADIAN SYLLABICS NWI
+18C7 ; [.27B7.0020.0002.18C7] # CANADIAN SYLLABICS OJIBWAY NWI
+18C8 ; [.27B8.0020.0002.18C8] # CANADIAN SYLLABICS NWII
+18C9 ; [.27B9.0020.0002.18C9] # CANADIAN SYLLABICS OJIBWAY NWII
+18CA ; [.27BA.0020.0002.18CA] # CANADIAN SYLLABICS NWO
+18CB ; [.27BB.0020.0002.18CB] # CANADIAN SYLLABICS OJIBWAY NWO
+18CC ; [.27BC.0020.0002.18CC] # CANADIAN SYLLABICS NWOO
+18CD ; [.27BD.0020.0002.18CD] # CANADIAN SYLLABICS OJIBWAY NWOO
+18CE ; [.27BE.0020.0002.18CE] # CANADIAN SYLLABICS RWEE
+18CF ; [.27BF.0020.0002.18CF] # CANADIAN SYLLABICS RWI
+18D0 ; [.27C0.0020.0002.18D0] # CANADIAN SYLLABICS RWII
+18D1 ; [.27C1.0020.0002.18D1] # CANADIAN SYLLABICS RWO
+18D2 ; [.27C2.0020.0002.18D2] # CANADIAN SYLLABICS RWOO
+18D3 ; [.27C3.0020.0002.18D3] # CANADIAN SYLLABICS RWA
+18D4 ; [.27C4.0020.0002.18D4] # CANADIAN SYLLABICS OJIBWAY P
+18D5 ; [.27C5.0020.0002.18D5] # CANADIAN SYLLABICS OJIBWAY T
+18D6 ; [.27C6.0020.0002.18D6] # CANADIAN SYLLABICS OJIBWAY K
+18D7 ; [.27C7.0020.0002.18D7] # CANADIAN SYLLABICS OJIBWAY C
+18D8 ; [.27C8.0020.0002.18D8] # CANADIAN SYLLABICS OJIBWAY M
+18D9 ; [.27C9.0020.0002.18D9] # CANADIAN SYLLABICS OJIBWAY N
+18DA ; [.27CA.0020.0002.18DA] # CANADIAN SYLLABICS OJIBWAY S
+18DB ; [.27CB.0020.0002.18DB] # CANADIAN SYLLABICS OJIBWAY SH
+18DC ; [.27CC.0020.0002.18DC] # CANADIAN SYLLABICS EASTERN W
+18DD ; [.27CD.0020.0002.18DD] # CANADIAN SYLLABICS WESTERN W
+18DE ; [.27CE.0020.0002.18DE] # CANADIAN SYLLABICS FINAL SMALL RING
+18DF ; [.27CF.0020.0002.18DF] # CANADIAN SYLLABICS FINAL RAISED DOT
+18E0 ; [.27D0.0020.0002.18E0] # CANADIAN SYLLABICS R-CREE RWE
+18E1 ; [.27D1.0020.0002.18E1] # CANADIAN SYLLABICS WEST-CREE LOO
+18E2 ; [.27D2.0020.0002.18E2] # CANADIAN SYLLABICS WEST-CREE LAA
+18E3 ; [.27D3.0020.0002.18E3] # CANADIAN SYLLABICS THWE
+18E4 ; [.27D4.0020.0002.18E4] # CANADIAN SYLLABICS THWA
+18E5 ; [.27D5.0020.0002.18E5] # CANADIAN SYLLABICS TTHWE
+18E6 ; [.27D6.0020.0002.18E6] # CANADIAN SYLLABICS TTHOO
+18E7 ; [.27D7.0020.0002.18E7] # CANADIAN SYLLABICS TTHAA
+18E8 ; [.27D8.0020.0002.18E8] # CANADIAN SYLLABICS TLHWE
+18E9 ; [.27D9.0020.0002.18E9] # CANADIAN SYLLABICS TLHOO
+18EA ; [.27DA.0020.0002.18EA] # CANADIAN SYLLABICS SAYISI SHWE
+18EB ; [.27DB.0020.0002.18EB] # CANADIAN SYLLABICS SAYISI SHOO
+18EC ; [.27DC.0020.0002.18EC] # CANADIAN SYLLABICS SAYISI HOO
+18ED ; [.27DD.0020.0002.18ED] # CANADIAN SYLLABICS CARRIER GWU
+18EE ; [.27DE.0020.0002.18EE] # CANADIAN SYLLABICS CARRIER DENE GEE
+18EF ; [.27DF.0020.0002.18EF] # CANADIAN SYLLABICS CARRIER GAA
+18F0 ; [.27E0.0020.0002.18F0] # CANADIAN SYLLABICS CARRIER GWA
+18F1 ; [.27E1.0020.0002.18F1] # CANADIAN SYLLABICS SAYISI JUU
+18F2 ; [.27E2.0020.0002.18F2] # CANADIAN SYLLABICS CARRIER JWA
+18F3 ; [.27E3.0020.0002.18F3] # CANADIAN SYLLABICS BEAVER DENE L
+18F4 ; [.27E4.0020.0002.18F4] # CANADIAN SYLLABICS BEAVER DENE R
+18F5 ; [.27E5.0020.0002.18F5] # CANADIAN SYLLABICS CARRIER DENTAL S
+1681 ; [.27E6.0020.0002.1681] # OGHAM LETTER BEITH
+1682 ; [.27E7.0020.0002.1682] # OGHAM LETTER LUIS
+1683 ; [.27E8.0020.0002.1683] # OGHAM LETTER FEARN
+1684 ; [.27E9.0020.0002.1684] # OGHAM LETTER SAIL
+1685 ; [.27EA.0020.0002.1685] # OGHAM LETTER NION
+1686 ; [.27EB.0020.0002.1686] # OGHAM LETTER UATH
+1687 ; [.27EC.0020.0002.1687] # OGHAM LETTER DAIR
+1688 ; [.27ED.0020.0002.1688] # OGHAM LETTER TINNE
+1689 ; [.27EE.0020.0002.1689] # OGHAM LETTER COLL
+168A ; [.27EF.0020.0002.168A] # OGHAM LETTER CEIRT
+168B ; [.27F0.0020.0002.168B] # OGHAM LETTER MUIN
+168C ; [.27F1.0020.0002.168C] # OGHAM LETTER GORT
+168D ; [.27F2.0020.0002.168D] # OGHAM LETTER NGEADAL
+168E ; [.27F3.0020.0002.168E] # OGHAM LETTER STRAIF
+168F ; [.27F4.0020.0002.168F] # OGHAM LETTER RUIS
+1690 ; [.27F5.0020.0002.1690] # OGHAM LETTER AILM
+1691 ; [.27F6.0020.0002.1691] # OGHAM LETTER ONN
+1692 ; [.27F7.0020.0002.1692] # OGHAM LETTER UR
+1693 ; [.27F8.0020.0002.1693] # OGHAM LETTER EADHADH
+1694 ; [.27F9.0020.0002.1694] # OGHAM LETTER IODHADH
+1695 ; [.27FA.0020.0002.1695] # OGHAM LETTER EABHADH
+1696 ; [.27FB.0020.0002.1696] # OGHAM LETTER OR
+1697 ; [.27FC.0020.0002.1697] # OGHAM LETTER UILLEANN
+1698 ; [.27FD.0020.0002.1698] # OGHAM LETTER IFIN
+1699 ; [.27FE.0020.0002.1699] # OGHAM LETTER EAMHANCHOLL
+169A ; [.27FF.0020.0002.169A] # OGHAM LETTER PEITH
+16A0 ; [.2800.0020.0002.16A0] # RUNIC LETTER FEHU FEOH FE F
+16A1 ; [.2800.0020.0004.16A1][.0000.0159.0004.16A1] # RUNIC LETTER V; QQKN
+16A2 ; [.2801.0020.0002.16A2] # RUNIC LETTER URUZ UR U
+16A4 ; [.2801.0020.0004.16A4][.0000.0159.0004.16A4] # RUNIC LETTER Y; QQKN
+16A5 ; [.2801.0020.0004.16A5][.0000.015A.0004.16A5] # RUNIC LETTER W; QQKN
+16A6 ; [.2802.0020.0002.16A6] # RUNIC LETTER THURISAZ THURS THORN
+16A7 ; [.2802.0020.0004.16A7][.0000.0159.0004.16A7] # RUNIC LETTER ETH; QQKN
+16F0 ; [.2802.0020.0004.16F0][.2802.0020.0004.16F0] # RUNIC BELGTHOR SYMBOL; QQKN
+16A8 ; [.2803.0020.0002.16A8] # RUNIC LETTER ANSUZ A
+16A9 ; [.2803.0020.0004.16A9][.0000.0159.0004.16A9] # RUNIC LETTER OS O; QQKN
+16AC ; [.2803.0020.0004.16AC][.0000.015A.0004.16AC] # RUNIC LETTER LONG-BRANCH-OSS O; QQKN
+16AD ; [.2803.0020.0004.16AD][.0000.015C.0004.16AD] # RUNIC LETTER SHORT-TWIG-OSS O; QQKN
+16AE ; [.2803.0020.0004.16AE][.0000.015D.0004.16AE] # RUNIC LETTER O; QQKN
+16AF ; [.2804.0020.0002.16AF] # RUNIC LETTER OE
+16B0 ; [.2805.0020.0002.16B0] # RUNIC LETTER ON
+16B1 ; [.2806.0020.0002.16B1] # RUNIC LETTER RAIDO RAD REID R
+16B2 ; [.2807.0020.0002.16B2] # RUNIC LETTER KAUNA
+16B3 ; [.2807.0020.0004.16B3][.0000.0159.0004.16B3] # RUNIC LETTER CEN; QQKN
+16B4 ; [.2807.0020.0004.16B4][.0000.015A.0004.16B4] # RUNIC LETTER KAUN K; QQKN
+16B5 ; [.2807.0020.0004.16B5][.0000.015C.0004.16B5] # RUNIC LETTER G; QQKN
+16B6 ; [.2807.0020.0004.16B6][.0000.015D.0004.16B6] # RUNIC LETTER ENG; QQKN
+16B7 ; [.2808.0020.0002.16B7] # RUNIC LETTER GEBO GYFU G
+16B9 ; [.2809.0020.0002.16B9] # RUNIC LETTER WUNJO WYNN W
+16E9 ; [.2809.0020.0004.16E9][.0000.0159.0004.16E9] # RUNIC LETTER Q; QQKN
+16BA ; [.280A.0020.0002.16BA] # RUNIC LETTER HAGLAZ H
+16BB ; [.280A.0020.0004.16BB][.0000.0159.0004.16BB] # RUNIC LETTER HAEGL H; QQKN
+16BC ; [.280A.0020.0004.16BC][.0000.015A.0004.16BC] # RUNIC LETTER LONG-BRANCH-HAGALL H; QQKN
+16BD ; [.280A.0020.0004.16BD][.0000.015C.0004.16BD] # RUNIC LETTER SHORT-TWIG-HAGALL H; QQKN
+16BE ; [.280B.0020.0002.16BE] # RUNIC LETTER NAUDIZ NYD NAUD N
+16BF ; [.280B.0020.0004.16BF][.0000.0159.0004.16BF] # RUNIC LETTER SHORT-TWIG-NAUD N; QQKN
+16C0 ; [.280B.0020.0004.16C0][.0000.015A.0004.16C0] # RUNIC LETTER DOTTED-N; QQKN
+16C1 ; [.280C.0020.0002.16C1] # RUNIC LETTER ISAZ IS ISS I
+16C2 ; [.280C.0020.0004.16C2][.0000.0159.0004.16C2] # RUNIC LETTER E; QQKN
+16C3 ; [.280D.0020.0002.16C3] # RUNIC LETTER JERAN J
+16C4 ; [.280D.0020.0004.16C4][.0000.0159.0004.16C4] # RUNIC LETTER GER; QQKN
+16C5 ; [.280E.0020.0002.16C5] # RUNIC LETTER LONG-BRANCH-AR AE
+16C6 ; [.280E.0020.0004.16C6][.0000.0159.0004.16C6] # RUNIC LETTER SHORT-TWIG-AR A; QQKN
+16EE ; [.280E.0020.0004.16EE][.2817.0020.0004.16EE] # RUNIC ARLAUG SYMBOL; QQKN
+16C7 ; [.280F.0020.0002.16C7] # RUNIC LETTER IWAZ EOH
+16C8 ; [.2810.0020.0002.16C8] # RUNIC LETTER PERTHO PEORTH P
+16D5 ; [.2810.0020.0004.16D5][.0000.0159.0004.16D5] # RUNIC LETTER OPEN-P; QQKN
+16C9 ; [.2811.0020.0002.16C9] # RUNIC LETTER ALGIZ EOLHX
+16CA ; [.2812.0020.0002.16CA] # RUNIC LETTER SOWILO S
+16CB ; [.2812.0020.0004.16CB][.0000.0159.0004.16CB] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S; QQKN
+16EA ; [.2812.0020.0004.16EA][.0000.015A.0004.16EA] # RUNIC LETTER X; QQKN
+16CC ; [.2812.0020.0004.16CC][.0000.015C.0004.16CC] # RUNIC LETTER SHORT-TWIG-SOL S; QQKN
+16CD ; [.2812.0020.0004.16CD][.0000.015D.0004.16CD] # RUNIC LETTER C; QQKN
+16CE ; [.2812.0020.0004.16CE][.0000.015E.0004.16CE] # RUNIC LETTER Z; QQKN
+16CF ; [.2813.0020.0002.16CF] # RUNIC LETTER TIWAZ TIR TYR T
+16D0 ; [.2813.0020.0004.16D0][.0000.0159.0004.16D0] # RUNIC LETTER SHORT-TWIG-TYR T; QQKN
+16D1 ; [.2813.0020.0004.16D1][.0000.015A.0004.16D1] # RUNIC LETTER D; QQKN
+16D2 ; [.2814.0020.0002.16D2] # RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3 ; [.2814.0020.0004.16D3][.0000.0159.0004.16D3] # RUNIC LETTER SHORT-TWIG-BJARKAN B; QQKN
+16D4 ; [.2814.0020.0004.16D4][.0000.015A.0004.16D4] # RUNIC LETTER DOTTED-P; QQKN
+16D6 ; [.2815.0020.0002.16D6] # RUNIC LETTER EHWAZ EH E
+16D7 ; [.2816.0020.0002.16D7] # RUNIC LETTER MANNAZ MAN M
+16D8 ; [.2816.0020.0004.16D8][.0000.0159.0004.16D8] # RUNIC LETTER LONG-BRANCH-MADR M; QQKN
+16D9 ; [.2816.0020.0004.16D9][.0000.015A.0004.16D9] # RUNIC LETTER SHORT-TWIG-MADR M; QQKN
+16EF ; [.2816.0020.0004.16EF][.0000.0159.0004.16EF][.2816.0020.001F.16EF][.0000.0159.001F.16EF] # RUNIC TVIMADUR SYMBOL; QQKN
+16DA ; [.2817.0020.0002.16DA] # RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB ; [.2817.0020.0004.16DB][.0000.0159.0004.16DB] # RUNIC LETTER DOTTED-L; QQKN
+16DC ; [.2818.0020.0002.16DC] # RUNIC LETTER INGWAZ
+16DD ; [.2818.0020.0004.16DD][.0000.0159.0004.16DD] # RUNIC LETTER ING; QQKN
+16DE ; [.2819.0020.0002.16DE] # RUNIC LETTER DAGAZ DAEG D
+16DF ; [.281A.0020.0002.16DF] # RUNIC LETTER OTHALAN ETHEL O
+16AA ; [.281B.0020.0002.16AA] # RUNIC LETTER AC A
+16AB ; [.281C.0020.0002.16AB] # RUNIC LETTER AESC
+16A3 ; [.281D.0020.0002.16A3] # RUNIC LETTER YR
+16E0 ; [.281E.0020.0002.16E0] # RUNIC LETTER EAR
+16E3 ; [.281F.0020.0002.16E3] # RUNIC LETTER CALC
+16B8 ; [.2820.0020.0002.16B8] # RUNIC LETTER GAR
+16E4 ; [.2821.0020.0002.16E4] # RUNIC LETTER CEALC
+16E1 ; [.2822.0020.0002.16E1] # RUNIC LETTER IOR
+16E2 ; [.2823.0020.0002.16E2] # RUNIC LETTER CWEORTH
+16E5 ; [.2824.0020.0002.16E5] # RUNIC LETTER STAN
+16E6 ; [.2825.0020.0002.16E6] # RUNIC LETTER LONG-BRANCH-YR
+16E7 ; [.2825.0020.0004.16E7][.0000.0159.0004.16E7] # RUNIC LETTER SHORT-TWIG-YR; QQKN
+16E8 ; [.2825.0020.0004.16E8][.0000.015A.0004.16E8] # RUNIC LETTER ICELANDIC-YR; QQKN
+10C00 ; [.2826.0020.0002.10C00] # OLD TURKIC LETTER ORKHON A
+10C01 ; [.2826.0020.0004.10C01][.0000.0159.0004.10C01] # OLD TURKIC LETTER YENISEI A; QQKN
+10C02 ; [.2827.0020.0002.10C02] # OLD TURKIC LETTER YENISEI AE
+10C03 ; [.2828.0020.0002.10C03] # OLD TURKIC LETTER ORKHON I
+10C04 ; [.2828.0020.0004.10C04][.0000.0159.0004.10C04] # OLD TURKIC LETTER YENISEI I; QQKN
+10C05 ; [.2829.0020.0002.10C05] # OLD TURKIC LETTER YENISEI E
+10C06 ; [.282A.0020.0002.10C06] # OLD TURKIC LETTER ORKHON O
+10C07 ; [.282B.0020.0002.10C07] # OLD TURKIC LETTER ORKHON OE
+10C08 ; [.282B.0020.0004.10C08][.0000.0159.0004.10C08] # OLD TURKIC LETTER YENISEI OE; QQKN
+10C09 ; [.282C.0020.0002.10C09] # OLD TURKIC LETTER ORKHON AB
+10C0A ; [.282C.0020.0004.10C0A][.0000.0159.0004.10C0A] # OLD TURKIC LETTER YENISEI AB; QQKN
+10C0B ; [.282D.0020.0002.10C0B] # OLD TURKIC LETTER ORKHON AEB
+10C0C ; [.282D.0020.0004.10C0C][.0000.0159.0004.10C0C] # OLD TURKIC LETTER YENISEI AEB; QQKN
+10C0D ; [.282E.0020.0002.10C0D] # OLD TURKIC LETTER ORKHON AG
+10C0E ; [.282E.0020.0004.10C0E][.0000.0159.0004.10C0E] # OLD TURKIC LETTER YENISEI AG; QQKN
+10C0F ; [.282F.0020.0002.10C0F] # OLD TURKIC LETTER ORKHON AEG
+10C10 ; [.282F.0020.0004.10C10][.0000.0159.0004.10C10] # OLD TURKIC LETTER YENISEI AEG; QQKN
+10C11 ; [.2830.0020.0002.10C11] # OLD TURKIC LETTER ORKHON AD
+10C12 ; [.2830.0020.0004.10C12][.0000.0159.0004.10C12] # OLD TURKIC LETTER YENISEI AD; QQKN
+10C13 ; [.2831.0020.0002.10C13] # OLD TURKIC LETTER ORKHON AED
+10C14 ; [.2832.0020.0002.10C14] # OLD TURKIC LETTER ORKHON EZ
+10C15 ; [.2832.0020.0004.10C15][.0000.0159.0004.10C15] # OLD TURKIC LETTER YENISEI EZ; QQKN
+10C16 ; [.2833.0020.0002.10C16] # OLD TURKIC LETTER ORKHON AY
+10C17 ; [.2833.0020.0004.10C17][.0000.0159.0004.10C17] # OLD TURKIC LETTER YENISEI AY; QQKN
+10C18 ; [.2834.0020.0002.10C18] # OLD TURKIC LETTER ORKHON AEY
+10C19 ; [.2834.0020.0004.10C19][.0000.0159.0004.10C19] # OLD TURKIC LETTER YENISEI AEY; QQKN
+10C1A ; [.2835.0020.0002.10C1A] # OLD TURKIC LETTER ORKHON AEK
+10C1B ; [.2835.0020.0004.10C1B][.0000.0159.0004.10C1B] # OLD TURKIC LETTER YENISEI AEK; QQKN
+10C1C ; [.2836.0020.0002.10C1C] # OLD TURKIC LETTER ORKHON OEK
+10C1D ; [.2836.0020.0004.10C1D][.0000.0159.0004.10C1D] # OLD TURKIC LETTER YENISEI OEK; QQKN
+10C1E ; [.2837.0020.0002.10C1E] # OLD TURKIC LETTER ORKHON AL
+10C1F ; [.2837.0020.0004.10C1F][.0000.0159.0004.10C1F] # OLD TURKIC LETTER YENISEI AL; QQKN
+10C20 ; [.2838.0020.0002.10C20] # OLD TURKIC LETTER ORKHON AEL
+10C21 ; [.2839.0020.0002.10C21] # OLD TURKIC LETTER ORKHON ELT
+10C22 ; [.283A.0020.0002.10C22] # OLD TURKIC LETTER ORKHON EM
+10C23 ; [.283B.0020.0002.10C23] # OLD TURKIC LETTER ORKHON AN
+10C24 ; [.283C.0020.0002.10C24] # OLD TURKIC LETTER ORKHON AEN
+10C25 ; [.283C.0020.0004.10C25][.0000.0159.0004.10C25] # OLD TURKIC LETTER YENISEI AEN; QQKN
+10C26 ; [.283D.0020.0002.10C26] # OLD TURKIC LETTER ORKHON ENT
+10C27 ; [.283D.0020.0004.10C27][.0000.0159.0004.10C27] # OLD TURKIC LETTER YENISEI ENT; QQKN
+10C28 ; [.283E.0020.0002.10C28] # OLD TURKIC LETTER ORKHON ENC
+10C29 ; [.283E.0020.0004.10C29][.0000.0159.0004.10C29] # OLD TURKIC LETTER YENISEI ENC; QQKN
+10C2A ; [.283F.0020.0002.10C2A] # OLD TURKIC LETTER ORKHON ENY
+10C2B ; [.283F.0020.0004.10C2B][.0000.0159.0004.10C2B] # OLD TURKIC LETTER YENISEI ENY; QQKN
+10C2C ; [.2840.0020.0002.10C2C] # OLD TURKIC LETTER YENISEI ANG
+10C2D ; [.2841.0020.0002.10C2D] # OLD TURKIC LETTER ORKHON ENG
+10C2E ; [.2841.0020.0004.10C2E][.0000.0159.0004.10C2E] # OLD TURKIC LETTER YENISEI AENG; QQKN
+10C2F ; [.2842.0020.0002.10C2F] # OLD TURKIC LETTER ORKHON EP
+10C30 ; [.2843.0020.0002.10C30] # OLD TURKIC LETTER ORKHON OP
+10C31 ; [.2844.0020.0002.10C31] # OLD TURKIC LETTER ORKHON IC
+10C32 ; [.2845.0020.0002.10C32] # OLD TURKIC LETTER ORKHON EC
+10C33 ; [.2845.0020.0004.10C33][.0000.0159.0004.10C33] # OLD TURKIC LETTER YENISEI EC; QQKN
+10C34 ; [.2846.0020.0002.10C34] # OLD TURKIC LETTER ORKHON AQ
+10C35 ; [.2846.0020.0004.10C35][.0000.0159.0004.10C35] # OLD TURKIC LETTER YENISEI AQ; QQKN
+10C36 ; [.2847.0020.0002.10C36] # OLD TURKIC LETTER ORKHON IQ
+10C37 ; [.2847.0020.0004.10C37][.0000.0159.0004.10C37] # OLD TURKIC LETTER YENISEI IQ; QQKN
+10C38 ; [.2848.0020.0002.10C38] # OLD TURKIC LETTER ORKHON OQ
+10C39 ; [.2848.0020.0004.10C39][.0000.0159.0004.10C39] # OLD TURKIC LETTER YENISEI OQ; QQKN
+10C3A ; [.2849.0020.0002.10C3A] # OLD TURKIC LETTER ORKHON AR
+10C3B ; [.2849.0020.0004.10C3B][.0000.0159.0004.10C3B] # OLD TURKIC LETTER YENISEI AR; QQKN
+10C3C ; [.284A.0020.0002.10C3C] # OLD TURKIC LETTER ORKHON AER
+10C3D ; [.284B.0020.0002.10C3D] # OLD TURKIC LETTER ORKHON AS
+10C3E ; [.284C.0020.0002.10C3E] # OLD TURKIC LETTER ORKHON AES
+10C3F ; [.284D.0020.0002.10C3F] # OLD TURKIC LETTER ORKHON ASH
+10C40 ; [.284D.0020.0004.10C40][.0000.0159.0004.10C40] # OLD TURKIC LETTER YENISEI ASH; QQKN
+10C41 ; [.284E.0020.0002.10C41] # OLD TURKIC LETTER ORKHON ESH
+10C42 ; [.284E.0020.0004.10C42][.0000.0159.0004.10C42] # OLD TURKIC LETTER YENISEI ESH; QQKN
+10C43 ; [.284F.0020.0002.10C43] # OLD TURKIC LETTER ORKHON AT
+10C44 ; [.284F.0020.0004.10C44][.0000.0159.0004.10C44] # OLD TURKIC LETTER YENISEI AT; QQKN
+10C45 ; [.2850.0020.0002.10C45] # OLD TURKIC LETTER ORKHON AET
+10C46 ; [.2850.0020.0004.10C46][.0000.0159.0004.10C46] # OLD TURKIC LETTER YENISEI AET; QQKN
+10C47 ; [.2851.0020.0002.10C47] # OLD TURKIC LETTER ORKHON OT
+10C48 ; [.2852.0020.0002.10C48] # OLD TURKIC LETTER ORKHON BASH
+A500 ; [.2853.0020.0002.A500] # VAI SYLLABLE EE
+A501 ; [.2854.0020.0002.A501] # VAI SYLLABLE EEN
+A502 ; [.2855.0020.0002.A502] # VAI SYLLABLE HEE
+A503 ; [.2856.0020.0002.A503] # VAI SYLLABLE WEE
+A504 ; [.2857.0020.0002.A504] # VAI SYLLABLE WEEN
+A505 ; [.2858.0020.0002.A505] # VAI SYLLABLE PEE
+A506 ; [.2859.0020.0002.A506] # VAI SYLLABLE BHEE
+A507 ; [.285A.0020.0002.A507] # VAI SYLLABLE BEE
+A508 ; [.285B.0020.0002.A508] # VAI SYLLABLE MBEE
+A509 ; [.285C.0020.0002.A509] # VAI SYLLABLE KPEE
+A50A ; [.285D.0020.0002.A50A] # VAI SYLLABLE MGBEE
+A50B ; [.285E.0020.0002.A50B] # VAI SYLLABLE GBEE
+A50C ; [.285F.0020.0002.A50C] # VAI SYLLABLE FEE
+A613 ; [.285F.0020.0004.A613][.295E.0020.0004.A613] # VAI SYMBOL FEENG; QQKN
+A50D ; [.2860.0020.0002.A50D] # VAI SYLLABLE VEE
+A50E ; [.2861.0020.0002.A50E] # VAI SYLLABLE TEE
+A50F ; [.2862.0020.0002.A50F] # VAI SYLLABLE THEE
+A510 ; [.2863.0020.0002.A510] # VAI SYLLABLE DHEE
+A511 ; [.2864.0020.0002.A511] # VAI SYLLABLE DHHEE
+A512 ; [.2865.0020.0002.A512] # VAI SYLLABLE LEE
+A513 ; [.2866.0020.0002.A513] # VAI SYLLABLE REE
+A514 ; [.2867.0020.0002.A514] # VAI SYLLABLE DEE
+A515 ; [.2868.0020.0002.A515] # VAI SYLLABLE NDEE
+A516 ; [.2869.0020.0002.A516] # VAI SYLLABLE SEE
+A517 ; [.286A.0020.0002.A517] # VAI SYLLABLE SHEE
+A518 ; [.286B.0020.0002.A518] # VAI SYLLABLE ZEE
+A519 ; [.286C.0020.0002.A519] # VAI SYLLABLE ZHEE
+A51A ; [.286D.0020.0002.A51A] # VAI SYLLABLE CEE
+A51B ; [.286E.0020.0002.A51B] # VAI SYLLABLE JEE
+A51C ; [.286F.0020.0002.A51C] # VAI SYLLABLE NJEE
+A51D ; [.2870.0020.0002.A51D] # VAI SYLLABLE YEE
+A51E ; [.2871.0020.0002.A51E] # VAI SYLLABLE KEE
+A614 ; [.2871.0020.0004.A614][.295E.0020.0004.A614] # VAI SYMBOL KEENG; QQKN
+A51F ; [.2872.0020.0002.A51F] # VAI SYLLABLE NGGEE
+A520 ; [.2873.0020.0002.A520] # VAI SYLLABLE GEE
+A521 ; [.2874.0020.0002.A521] # VAI SYLLABLE MEE
+A522 ; [.2875.0020.0002.A522] # VAI SYLLABLE NEE
+A523 ; [.2876.0020.0002.A523] # VAI SYLLABLE NYEE
+A524 ; [.2877.0020.0002.A524] # VAI SYLLABLE I
+A525 ; [.2878.0020.0002.A525] # VAI SYLLABLE IN
+A526 ; [.2879.0020.0002.A526] # VAI SYLLABLE HI
+A527 ; [.287A.0020.0002.A527] # VAI SYLLABLE HIN
+A528 ; [.287B.0020.0002.A528] # VAI SYLLABLE WI
+A529 ; [.287C.0020.0002.A529] # VAI SYLLABLE WIN
+A52A ; [.287D.0020.0002.A52A] # VAI SYLLABLE PI
+A52B ; [.287E.0020.0002.A52B] # VAI SYLLABLE BHI
+A52C ; [.287F.0020.0002.A52C] # VAI SYLLABLE BI
+A52D ; [.2880.0020.0002.A52D] # VAI SYLLABLE MBI
+A52E ; [.2881.0020.0002.A52E] # VAI SYLLABLE KPI
+A52F ; [.2882.0020.0002.A52F] # VAI SYLLABLE MGBI
+A530 ; [.2883.0020.0002.A530] # VAI SYLLABLE GBI
+A531 ; [.2884.0020.0002.A531] # VAI SYLLABLE FI
+A532 ; [.2885.0020.0002.A532] # VAI SYLLABLE VI
+A533 ; [.2886.0020.0002.A533] # VAI SYLLABLE TI
+A615 ; [.2886.0020.0004.A615][.295E.0020.0004.A615] # VAI SYMBOL TING; QQKN
+A534 ; [.2887.0020.0002.A534] # VAI SYLLABLE THI
+A535 ; [.2888.0020.0002.A535] # VAI SYLLABLE DHI
+A536 ; [.2889.0020.0002.A536] # VAI SYLLABLE DHHI
+A537 ; [.288A.0020.0002.A537] # VAI SYLLABLE LI
+A538 ; [.288B.0020.0002.A538] # VAI SYLLABLE RI
+A539 ; [.288C.0020.0002.A539] # VAI SYLLABLE DI
+A53A ; [.288D.0020.0002.A53A] # VAI SYLLABLE NDI
+A53B ; [.288E.0020.0002.A53B] # VAI SYLLABLE SI
+A53C ; [.288F.0020.0002.A53C] # VAI SYLLABLE SHI
+A53D ; [.2890.0020.0002.A53D] # VAI SYLLABLE ZI
+A53E ; [.2891.0020.0002.A53E] # VAI SYLLABLE ZHI
+A53F ; [.2892.0020.0002.A53F] # VAI SYLLABLE CI
+A540 ; [.2893.0020.0002.A540] # VAI SYLLABLE JI
+A541 ; [.2894.0020.0002.A541] # VAI SYLLABLE NJI
+A542 ; [.2895.0020.0002.A542] # VAI SYLLABLE YI
+A543 ; [.2896.0020.0002.A543] # VAI SYLLABLE KI
+A544 ; [.2897.0020.0002.A544] # VAI SYLLABLE NGGI
+A545 ; [.2898.0020.0002.A545] # VAI SYLLABLE GI
+A546 ; [.2899.0020.0002.A546] # VAI SYLLABLE MI
+A547 ; [.289A.0020.0002.A547] # VAI SYLLABLE NI
+A616 ; [.289A.0020.0004.A616][.295F.0020.0004.A616] # VAI SYMBOL NII; QQKN
+A548 ; [.289B.0020.0002.A548] # VAI SYLLABLE NYI
+A549 ; [.289C.0020.0002.A549] # VAI SYLLABLE A
+A54A ; [.289D.0020.0002.A54A] # VAI SYLLABLE AN
+A54B ; [.289E.0020.0002.A54B] # VAI SYLLABLE NGAN
+A54C ; [.289F.0020.0002.A54C] # VAI SYLLABLE HA
+A54D ; [.28A0.0020.0002.A54D] # VAI SYLLABLE HAN
+A54E ; [.28A1.0020.0002.A54E] # VAI SYLLABLE WA
+A54F ; [.28A2.0020.0002.A54F] # VAI SYLLABLE WAN
+A550 ; [.28A3.0020.0002.A550] # VAI SYLLABLE PA
+A551 ; [.28A4.0020.0002.A551] # VAI SYLLABLE BHA
+A552 ; [.28A5.0020.0002.A552] # VAI SYLLABLE BA
+A617 ; [.28A5.0020.0004.A617][.295E.0020.0004.A617] # VAI SYMBOL BANG; QQKN
+A553 ; [.28A6.0020.0002.A553] # VAI SYLLABLE MBA
+A554 ; [.28A7.0020.0002.A554] # VAI SYLLABLE KPA
+A555 ; [.28A8.0020.0002.A555] # VAI SYLLABLE KPAN
+A556 ; [.28A9.0020.0002.A556] # VAI SYLLABLE MGBA
+A557 ; [.28AA.0020.0002.A557] # VAI SYLLABLE GBA
+A558 ; [.28AB.0020.0002.A558] # VAI SYLLABLE FA
+A610 ; [.28AB.0020.0004.A610] # VAI SYLLABLE NDOLE FA; QQK
+A618 ; [.28AB.0020.0004.A618][.295F.0020.0004.A618] # VAI SYMBOL FAA; QQKN
+A559 ; [.28AC.0020.0002.A559] # VAI SYLLABLE VA
+A55A ; [.28AD.0020.0002.A55A] # VAI SYLLABLE TA
+A619 ; [.28AD.0020.0004.A619][.295F.0020.0004.A619] # VAI SYMBOL TAA; QQKN
+A55B ; [.28AE.0020.0002.A55B] # VAI SYLLABLE THA
+A55C ; [.28AF.0020.0002.A55C] # VAI SYLLABLE DHA
+A55D ; [.28B0.0020.0002.A55D] # VAI SYLLABLE DHHA
+A55E ; [.28B1.0020.0002.A55E] # VAI SYLLABLE LA
+A55F ; [.28B2.0020.0002.A55F] # VAI SYLLABLE RA
+A560 ; [.28B3.0020.0002.A560] # VAI SYLLABLE DA
+A61A ; [.28B3.0020.0004.A61A][.295E.0020.0004.A61A] # VAI SYMBOL DANG; QQKN
+A561 ; [.28B4.0020.0002.A561] # VAI SYLLABLE NDA
+A562 ; [.28B5.0020.0002.A562] # VAI SYLLABLE SA
+A563 ; [.28B6.0020.0002.A563] # VAI SYLLABLE SHA
+A564 ; [.28B7.0020.0002.A564] # VAI SYLLABLE ZA
+A565 ; [.28B8.0020.0002.A565] # VAI SYLLABLE ZHA
+A566 ; [.28B9.0020.0002.A566] # VAI SYLLABLE CA
+A567 ; [.28BA.0020.0002.A567] # VAI SYLLABLE JA
+A568 ; [.28BB.0020.0002.A568] # VAI SYLLABLE NJA
+A569 ; [.28BC.0020.0002.A569] # VAI SYLLABLE YA
+A56A ; [.28BD.0020.0002.A56A] # VAI SYLLABLE KA
+A611 ; [.28BD.0020.0004.A611] # VAI SYLLABLE NDOLE KA; QQK
+A56B ; [.28BE.0020.0002.A56B] # VAI SYLLABLE KAN
+A56C ; [.28BF.0020.0002.A56C] # VAI SYLLABLE NGGA
+A56D ; [.28C0.0020.0002.A56D] # VAI SYLLABLE GA
+A56E ; [.28C1.0020.0002.A56E] # VAI SYLLABLE MA
+A62A ; [.28C1.0020.0004.A62A] # VAI SYLLABLE NDOLE MA; QQK
+A56F ; [.28C2.0020.0002.A56F] # VAI SYLLABLE NA
+A570 ; [.28C3.0020.0002.A570] # VAI SYLLABLE NYA
+A571 ; [.28C4.0020.0002.A571] # VAI SYLLABLE OO
+A572 ; [.28C5.0020.0002.A572] # VAI SYLLABLE OON
+A573 ; [.28C6.0020.0002.A573] # VAI SYLLABLE HOO
+A574 ; [.28C7.0020.0002.A574] # VAI SYLLABLE WOO
+A575 ; [.28C8.0020.0002.A575] # VAI SYLLABLE WOON
+A576 ; [.28C9.0020.0002.A576] # VAI SYLLABLE POO
+A577 ; [.28CA.0020.0002.A577] # VAI SYLLABLE BHOO
+A578 ; [.28CB.0020.0002.A578] # VAI SYLLABLE BOO
+A579 ; [.28CC.0020.0002.A579] # VAI SYLLABLE MBOO
+A57A ; [.28CD.0020.0002.A57A] # VAI SYLLABLE KPOO
+A57B ; [.28CE.0020.0002.A57B] # VAI SYLLABLE MGBOO
+A57C ; [.28CF.0020.0002.A57C] # VAI SYLLABLE GBOO
+A57D ; [.28D0.0020.0002.A57D] # VAI SYLLABLE FOO
+A57E ; [.28D1.0020.0002.A57E] # VAI SYLLABLE VOO
+A57F ; [.28D2.0020.0002.A57F] # VAI SYLLABLE TOO
+A580 ; [.28D3.0020.0002.A580] # VAI SYLLABLE THOO
+A581 ; [.28D4.0020.0002.A581] # VAI SYLLABLE DHOO
+A582 ; [.28D5.0020.0002.A582] # VAI SYLLABLE DHHOO
+A583 ; [.28D6.0020.0002.A583] # VAI SYLLABLE LOO
+A584 ; [.28D7.0020.0002.A584] # VAI SYLLABLE ROO
+A585 ; [.28D8.0020.0002.A585] # VAI SYLLABLE DOO
+A61B ; [.28D8.0020.0004.A61B][.295E.0020.0004.A61B] # VAI SYMBOL DOONG; QQKN
+A586 ; [.28D9.0020.0002.A586] # VAI SYLLABLE NDOO
+A587 ; [.28DA.0020.0002.A587] # VAI SYLLABLE SOO
+A612 ; [.28DA.0020.0004.A612] # VAI SYLLABLE NDOLE SOO; QQK
+A588 ; [.28DB.0020.0002.A588] # VAI SYLLABLE SHOO
+A589 ; [.28DC.0020.0002.A589] # VAI SYLLABLE ZOO
+A58A ; [.28DD.0020.0002.A58A] # VAI SYLLABLE ZHOO
+A58B ; [.28DE.0020.0002.A58B] # VAI SYLLABLE COO
+A58C ; [.28DF.0020.0002.A58C] # VAI SYLLABLE JOO
+A58D ; [.28E0.0020.0002.A58D] # VAI SYLLABLE NJOO
+A58E ; [.28E1.0020.0002.A58E] # VAI SYLLABLE YOO
+A58F ; [.28E2.0020.0002.A58F] # VAI SYLLABLE KOO
+A590 ; [.28E3.0020.0002.A590] # VAI SYLLABLE NGGOO
+A591 ; [.28E4.0020.0002.A591] # VAI SYLLABLE GOO
+A592 ; [.28E5.0020.0002.A592] # VAI SYLLABLE MOO
+A593 ; [.28E6.0020.0002.A593] # VAI SYLLABLE NOO
+A594 ; [.28E7.0020.0002.A594] # VAI SYLLABLE NYOO
+A595 ; [.28E8.0020.0002.A595] # VAI SYLLABLE U
+A596 ; [.28E9.0020.0002.A596] # VAI SYLLABLE UN
+A597 ; [.28EA.0020.0002.A597] # VAI SYLLABLE HU
+A598 ; [.28EB.0020.0002.A598] # VAI SYLLABLE HUN
+A599 ; [.28EC.0020.0002.A599] # VAI SYLLABLE WU
+A59A ; [.28ED.0020.0002.A59A] # VAI SYLLABLE WUN
+A59B ; [.28EE.0020.0002.A59B] # VAI SYLLABLE PU
+A59C ; [.28EF.0020.0002.A59C] # VAI SYLLABLE BHU
+A59D ; [.28F0.0020.0002.A59D] # VAI SYLLABLE BU
+A59E ; [.28F1.0020.0002.A59E] # VAI SYLLABLE MBU
+A59F ; [.28F2.0020.0002.A59F] # VAI SYLLABLE KPU
+A5A0 ; [.28F3.0020.0002.A5A0] # VAI SYLLABLE MGBU
+A5A1 ; [.28F4.0020.0002.A5A1] # VAI SYLLABLE GBU
+A5A2 ; [.28F5.0020.0002.A5A2] # VAI SYLLABLE FU
+A5A3 ; [.28F6.0020.0002.A5A3] # VAI SYLLABLE VU
+A5A4 ; [.28F7.0020.0002.A5A4] # VAI SYLLABLE TU
+A5A5 ; [.28F8.0020.0002.A5A5] # VAI SYLLABLE THU
+A5A6 ; [.28F9.0020.0002.A5A6] # VAI SYLLABLE DHU
+A5A7 ; [.28FA.0020.0002.A5A7] # VAI SYLLABLE DHHU
+A5A8 ; [.28FB.0020.0002.A5A8] # VAI SYLLABLE LU
+A5A9 ; [.28FC.0020.0002.A5A9] # VAI SYLLABLE RU
+A5AA ; [.28FD.0020.0002.A5AA] # VAI SYLLABLE DU
+A5AB ; [.28FE.0020.0002.A5AB] # VAI SYLLABLE NDU
+A5AC ; [.28FF.0020.0002.A5AC] # VAI SYLLABLE SU
+A5AD ; [.2900.0020.0002.A5AD] # VAI SYLLABLE SHU
+A5AE ; [.2901.0020.0002.A5AE] # VAI SYLLABLE ZU
+A5AF ; [.2902.0020.0002.A5AF] # VAI SYLLABLE ZHU
+A5B0 ; [.2903.0020.0002.A5B0] # VAI SYLLABLE CU
+A5B1 ; [.2904.0020.0002.A5B1] # VAI SYLLABLE JU
+A5B2 ; [.2905.0020.0002.A5B2] # VAI SYLLABLE NJU
+A5B3 ; [.2906.0020.0002.A5B3] # VAI SYLLABLE YU
+A5B4 ; [.2907.0020.0002.A5B4] # VAI SYLLABLE KU
+A61C ; [.2907.0020.0004.A61C][.295E.0020.0004.A61C] # VAI SYMBOL KUNG; QQKN
+A5B5 ; [.2908.0020.0002.A5B5] # VAI SYLLABLE NGGU
+A5B6 ; [.2909.0020.0002.A5B6] # VAI SYLLABLE GU
+A5B7 ; [.290A.0020.0002.A5B7] # VAI SYLLABLE MU
+A5B8 ; [.290B.0020.0002.A5B8] # VAI SYLLABLE NU
+A5B9 ; [.290C.0020.0002.A5B9] # VAI SYLLABLE NYU
+A5BA ; [.290D.0020.0002.A5BA] # VAI SYLLABLE O
+A5BB ; [.290E.0020.0002.A5BB] # VAI SYLLABLE ON
+A5BC ; [.290F.0020.0002.A5BC] # VAI SYLLABLE NGON
+A5BD ; [.2910.0020.0002.A5BD] # VAI SYLLABLE HO
+A5BE ; [.2911.0020.0002.A5BE] # VAI SYLLABLE HON
+A5BF ; [.2912.0020.0002.A5BF] # VAI SYLLABLE WO
+A5C0 ; [.2913.0020.0002.A5C0] # VAI SYLLABLE WON
+A5C1 ; [.2914.0020.0002.A5C1] # VAI SYLLABLE PO
+A5C2 ; [.2915.0020.0002.A5C2] # VAI SYLLABLE BHO
+A5C3 ; [.2916.0020.0002.A5C3] # VAI SYLLABLE BO
+A5C4 ; [.2917.0020.0002.A5C4] # VAI SYLLABLE MBO
+A5C5 ; [.2918.0020.0002.A5C5] # VAI SYLLABLE KPO
+A5C6 ; [.2919.0020.0002.A5C6] # VAI SYLLABLE MGBO
+A5C7 ; [.291A.0020.0002.A5C7] # VAI SYLLABLE GBO
+A5C8 ; [.291B.0020.0002.A5C8] # VAI SYLLABLE GBON
+A5C9 ; [.291C.0020.0002.A5C9] # VAI SYLLABLE FO
+A5CA ; [.291D.0020.0002.A5CA] # VAI SYLLABLE VO
+A5CB ; [.291E.0020.0002.A5CB] # VAI SYLLABLE TO
+A61D ; [.291E.0020.0004.A61D][.295E.0020.0004.A61D] # VAI SYMBOL TONG; QQKN
+A5CC ; [.291F.0020.0002.A5CC] # VAI SYLLABLE THO
+A5CD ; [.2920.0020.0002.A5CD] # VAI SYLLABLE DHO
+A5CE ; [.2921.0020.0002.A5CE] # VAI SYLLABLE DHHO
+A5CF ; [.2922.0020.0002.A5CF] # VAI SYLLABLE LO
+A5D0 ; [.2923.0020.0002.A5D0] # VAI SYLLABLE RO
+A5D1 ; [.2924.0020.0002.A5D1] # VAI SYLLABLE DO
+A62B ; [.2924.0020.0004.A62B] # VAI SYLLABLE NDOLE DO; QQK
+A61E ; [.2924.0020.0004.A61E][.295F.0020.0004.A61E] # VAI SYMBOL DO-O; QQKN
+A5D2 ; [.2925.0020.0002.A5D2] # VAI SYLLABLE NDO
+A5D3 ; [.2926.0020.0002.A5D3] # VAI SYLLABLE SO
+A5D4 ; [.2927.0020.0002.A5D4] # VAI SYLLABLE SHO
+A5D5 ; [.2928.0020.0002.A5D5] # VAI SYLLABLE ZO
+A5D6 ; [.2929.0020.0002.A5D6] # VAI SYLLABLE ZHO
+A5D7 ; [.292A.0020.0002.A5D7] # VAI SYLLABLE CO
+A5D8 ; [.292B.0020.0002.A5D8] # VAI SYLLABLE JO
+A61F ; [.292B.0020.0004.A61F][.295E.0020.0004.A61F] # VAI SYMBOL JONG; QQKN
+A5D9 ; [.292C.0020.0002.A5D9] # VAI SYLLABLE NJO
+A5DA ; [.292D.0020.0002.A5DA] # VAI SYLLABLE YO
+A5DB ; [.292E.0020.0002.A5DB] # VAI SYLLABLE KO
+A5DC ; [.292F.0020.0002.A5DC] # VAI SYLLABLE NGGO
+A5DD ; [.2930.0020.0002.A5DD] # VAI SYLLABLE GO
+A5DE ; [.2931.0020.0002.A5DE] # VAI SYLLABLE MO
+A5DF ; [.2932.0020.0002.A5DF] # VAI SYLLABLE NO
+A5E0 ; [.2933.0020.0002.A5E0] # VAI SYLLABLE NYO
+A5E1 ; [.2934.0020.0002.A5E1] # VAI SYLLABLE E
+A5E2 ; [.2935.0020.0002.A5E2] # VAI SYLLABLE EN
+A5E3 ; [.2936.0020.0002.A5E3] # VAI SYLLABLE NGEN
+A5E4 ; [.2937.0020.0002.A5E4] # VAI SYLLABLE HE
+A5E5 ; [.2938.0020.0002.A5E5] # VAI SYLLABLE HEN
+A5E6 ; [.2939.0020.0002.A5E6] # VAI SYLLABLE WE
+A5E7 ; [.293A.0020.0002.A5E7] # VAI SYLLABLE WEN
+A5E8 ; [.293B.0020.0002.A5E8] # VAI SYLLABLE PE
+A5E9 ; [.293C.0020.0002.A5E9] # VAI SYLLABLE BHE
+A5EA ; [.293D.0020.0002.A5EA] # VAI SYLLABLE BE
+A5EB ; [.293E.0020.0002.A5EB] # VAI SYLLABLE MBE
+A5EC ; [.293F.0020.0002.A5EC] # VAI SYLLABLE KPE
+A5ED ; [.2940.0020.0002.A5ED] # VAI SYLLABLE KPEN
+A5EE ; [.2941.0020.0002.A5EE] # VAI SYLLABLE MGBE
+A5EF ; [.2942.0020.0002.A5EF] # VAI SYLLABLE GBE
+A5F0 ; [.2943.0020.0002.A5F0] # VAI SYLLABLE GBEN
+A5F1 ; [.2944.0020.0002.A5F1] # VAI SYLLABLE FE
+A5F2 ; [.2945.0020.0002.A5F2] # VAI SYLLABLE VE
+A5F3 ; [.2946.0020.0002.A5F3] # VAI SYLLABLE TE
+A5F4 ; [.2947.0020.0002.A5F4] # VAI SYLLABLE THE
+A5F5 ; [.2948.0020.0002.A5F5] # VAI SYLLABLE DHE
+A5F6 ; [.2949.0020.0002.A5F6] # VAI SYLLABLE DHHE
+A5F7 ; [.294A.0020.0002.A5F7] # VAI SYLLABLE LE
+A5F8 ; [.294B.0020.0002.A5F8] # VAI SYLLABLE RE
+A5F9 ; [.294C.0020.0002.A5F9] # VAI SYLLABLE DE
+A5FA ; [.294D.0020.0002.A5FA] # VAI SYLLABLE NDE
+A5FB ; [.294E.0020.0002.A5FB] # VAI SYLLABLE SE
+A5FC ; [.294F.0020.0002.A5FC] # VAI SYLLABLE SHE
+A5FD ; [.2950.0020.0002.A5FD] # VAI SYLLABLE ZE
+A5FE ; [.2951.0020.0002.A5FE] # VAI SYLLABLE ZHE
+A5FF ; [.2952.0020.0002.A5FF] # VAI SYLLABLE CE
+A600 ; [.2953.0020.0002.A600] # VAI SYLLABLE JE
+A601 ; [.2954.0020.0002.A601] # VAI SYLLABLE NJE
+A602 ; [.2955.0020.0002.A602] # VAI SYLLABLE YE
+A603 ; [.2956.0020.0002.A603] # VAI SYLLABLE KE
+A604 ; [.2957.0020.0002.A604] # VAI SYLLABLE NGGE
+A605 ; [.2958.0020.0002.A605] # VAI SYLLABLE NGGEN
+A606 ; [.2959.0020.0002.A606] # VAI SYLLABLE GE
+A607 ; [.295A.0020.0002.A607] # VAI SYLLABLE GEN
+A608 ; [.295B.0020.0002.A608] # VAI SYLLABLE ME
+A609 ; [.295C.0020.0002.A609] # VAI SYLLABLE NE
+A60A ; [.295D.0020.0002.A60A] # VAI SYLLABLE NYE
+A60B ; [.295E.0020.0002.A60B] # VAI SYLLABLE NG
+A60C ; [.295F.0020.0002.A60C] # VAI SYLLABLE LENGTHENER
+A6A0 ; [.2960.0020.0002.A6A0] # BAMUM LETTER A
+A6A1 ; [.2961.0020.0002.A6A1] # BAMUM LETTER KA
+A6A2 ; [.2962.0020.0002.A6A2] # BAMUM LETTER U
+A6A3 ; [.2963.0020.0002.A6A3] # BAMUM LETTER KU
+A6A4 ; [.2964.0020.0002.A6A4] # BAMUM LETTER EE
+A6A5 ; [.2965.0020.0002.A6A5] # BAMUM LETTER REE
+A6A6 ; [.2966.0020.0002.A6A6] # BAMUM LETTER TAE
+A6A7 ; [.2967.0020.0002.A6A7] # BAMUM LETTER O
+A6A8 ; [.2968.0020.0002.A6A8] # BAMUM LETTER NYI
+A6A9 ; [.2969.0020.0002.A6A9] # BAMUM LETTER I
+A6AA ; [.296A.0020.0002.A6AA] # BAMUM LETTER LA
+A6AB ; [.296B.0020.0002.A6AB] # BAMUM LETTER PA
+A6AC ; [.296C.0020.0002.A6AC] # BAMUM LETTER RII
+A6AD ; [.296D.0020.0002.A6AD] # BAMUM LETTER RIEE
+A6AE ; [.296E.0020.0002.A6AE] # BAMUM LETTER LEEEE
+A6AF ; [.296F.0020.0002.A6AF] # BAMUM LETTER MEEEE
+A6B0 ; [.2970.0020.0002.A6B0] # BAMUM LETTER TAA
+A6B1 ; [.2971.0020.0002.A6B1] # BAMUM LETTER NDAA
+A6B2 ; [.2972.0020.0002.A6B2] # BAMUM LETTER NJAEM
+A6B3 ; [.2973.0020.0002.A6B3] # BAMUM LETTER M
+A6B4 ; [.2974.0020.0002.A6B4] # BAMUM LETTER SUU
+A6B5 ; [.2975.0020.0002.A6B5] # BAMUM LETTER MU
+A6B6 ; [.2976.0020.0002.A6B6] # BAMUM LETTER SHII
+A6B7 ; [.2977.0020.0002.A6B7] # BAMUM LETTER SI
+A6B8 ; [.2978.0020.0002.A6B8] # BAMUM LETTER SHEUX
+A6B9 ; [.2979.0020.0002.A6B9] # BAMUM LETTER SEUX
+A6BA ; [.297A.0020.0002.A6BA] # BAMUM LETTER KYEE
+A6BB ; [.297B.0020.0002.A6BB] # BAMUM LETTER KET
+A6BC ; [.297C.0020.0002.A6BC] # BAMUM LETTER NUAE
+A6BD ; [.297D.0020.0002.A6BD] # BAMUM LETTER NU
+A6BE ; [.297E.0020.0002.A6BE] # BAMUM LETTER NJUAE
+A6BF ; [.297F.0020.0002.A6BF] # BAMUM LETTER YOQ
+A6C0 ; [.2980.0020.0002.A6C0] # BAMUM LETTER SHU
+A6C1 ; [.2981.0020.0002.A6C1] # BAMUM LETTER YUQ
+A6C2 ; [.2982.0020.0002.A6C2] # BAMUM LETTER YA
+A6C3 ; [.2983.0020.0002.A6C3] # BAMUM LETTER NSHA
+A6C4 ; [.2984.0020.0002.A6C4] # BAMUM LETTER KEUX
+A6C5 ; [.2985.0020.0002.A6C5] # BAMUM LETTER PEUX
+A6C6 ; [.2986.0020.0002.A6C6] # BAMUM LETTER NJEE
+A6C7 ; [.2987.0020.0002.A6C7] # BAMUM LETTER NTEE
+A6C8 ; [.2988.0020.0002.A6C8] # BAMUM LETTER PUE
+A6C9 ; [.2989.0020.0002.A6C9] # BAMUM LETTER WUE
+A6CA ; [.298A.0020.0002.A6CA] # BAMUM LETTER PEE
+A6CB ; [.298B.0020.0002.A6CB] # BAMUM LETTER FEE
+A6CC ; [.298C.0020.0002.A6CC] # BAMUM LETTER RU
+A6CD ; [.298D.0020.0002.A6CD] # BAMUM LETTER LU
+A6CE ; [.298E.0020.0002.A6CE] # BAMUM LETTER MI
+A6CF ; [.298F.0020.0002.A6CF] # BAMUM LETTER NI
+A6D0 ; [.2990.0020.0002.A6D0] # BAMUM LETTER REUX
+A6D1 ; [.2991.0020.0002.A6D1] # BAMUM LETTER RAE
+A6D2 ; [.2992.0020.0002.A6D2] # BAMUM LETTER KEN
+A6D3 ; [.2993.0020.0002.A6D3] # BAMUM LETTER NGKWAEN
+A6D4 ; [.2994.0020.0002.A6D4] # BAMUM LETTER NGGA
+A6D5 ; [.2995.0020.0002.A6D5] # BAMUM LETTER NGA
+A6D6 ; [.2996.0020.0002.A6D6] # BAMUM LETTER SHO
+A6D7 ; [.2997.0020.0002.A6D7] # BAMUM LETTER PUAE
+A6D8 ; [.2998.0020.0002.A6D8] # BAMUM LETTER FU
+A6D9 ; [.2999.0020.0002.A6D9] # BAMUM LETTER FOM
+A6DA ; [.299A.0020.0002.A6DA] # BAMUM LETTER WA
+A6DB ; [.299B.0020.0002.A6DB] # BAMUM LETTER NA
+A6DC ; [.299C.0020.0002.A6DC] # BAMUM LETTER LI
+A6DD ; [.299D.0020.0002.A6DD] # BAMUM LETTER PI
+A6DE ; [.299E.0020.0002.A6DE] # BAMUM LETTER LOQ
+A6DF ; [.299F.0020.0002.A6DF] # BAMUM LETTER KO
+A6E0 ; [.29A0.0020.0002.A6E0] # BAMUM LETTER MBEN
+A6E1 ; [.29A1.0020.0002.A6E1] # BAMUM LETTER REN
+A6E2 ; [.29A2.0020.0002.A6E2] # BAMUM LETTER MEN
+A6E3 ; [.29A3.0020.0002.A6E3] # BAMUM LETTER MA
+A6E4 ; [.29A4.0020.0002.A6E4] # BAMUM LETTER TI
+A6E5 ; [.29A5.0020.0002.A6E5] # BAMUM LETTER KI
+A6E6 ; [.29A6.0020.0002.A6E6] # BAMUM LETTER MO
+A6E7 ; [.29A7.0020.0002.A6E7] # BAMUM LETTER MBAA
+A6E8 ; [.29A8.0020.0002.A6E8] # BAMUM LETTER TET
+A6E9 ; [.29A9.0020.0002.A6E9] # BAMUM LETTER KPA
+A6EA ; [.29AA.0020.0002.A6EA] # BAMUM LETTER TEN
+A6EB ; [.29AB.0020.0002.A6EB] # BAMUM LETTER NTUU
+A6EC ; [.29AC.0020.0002.A6EC] # BAMUM LETTER SAMBA
+A6ED ; [.29AD.0020.0002.A6ED] # BAMUM LETTER FAAMAE
+A6EE ; [.29AE.0020.0002.A6EE] # BAMUM LETTER KOVUU
+A6EF ; [.29AF.0020.0002.A6EF] # BAMUM LETTER KOGHOM
+1100 ; [.29B0.0020.0002.1100] # HANGUL CHOSEONG KIYEOK
+3131 ; [.29B0.0020.0004.3131] # HANGUL LETTER KIYEOK; QQK
+3200 ; [*02FF.0020.0004.3200][.29B0.0020.0004.3200][*0300.0020.001F.3200] # PARENTHESIZED HANGUL KIYEOK; QQKN
+3260 ; [.29B0.0020.0006.3260] # CIRCLED HANGUL KIYEOK; QQK
+FFA1 ; [.29B0.0020.0012.FFA1] # HALFWIDTH HANGUL LETTER KIYEOK; QQK
+320E ; [*02FF.0020.0004.320E][.29B0.0020.0004.320E][.2A2E.0020.001F.320E][*0300.0020.001F.320E] # PARENTHESIZED HANGUL KIYEOK A; QQKN
+326E ; [.29B0.0020.0006.326E][.2A2E.0020.0006.326E] # CIRCLED HANGUL KIYEOK A; QQKN
+1101 ; [.29B1.0020.0002.1101] # HANGUL CHOSEONG SSANGKIYEOK
+3132 ; [.29B1.0020.0004.3132] # HANGUL LETTER SSANGKIYEOK; QQK
+FFA2 ; [.29B1.0020.0012.FFA2] # HALFWIDTH HANGUL LETTER SSANGKIYEOK; QQK
+1102 ; [.29B2.0020.0002.1102] # HANGUL CHOSEONG NIEUN
+3134 ; [.29B2.0020.0004.3134] # HANGUL LETTER NIEUN; QQK
+3201 ; [*02FF.0020.0004.3201][.29B2.0020.0004.3201][*0300.0020.001F.3201] # PARENTHESIZED HANGUL NIEUN; QQKN
+3261 ; [.29B2.0020.0006.3261] # CIRCLED HANGUL NIEUN; QQK
+FFA4 ; [.29B2.0020.0012.FFA4] # HALFWIDTH HANGUL LETTER NIEUN; QQK
+320F ; [*02FF.0020.0004.320F][.29B2.0020.0004.320F][.2A2E.0020.001F.320F][*0300.0020.001F.320F] # PARENTHESIZED HANGUL NIEUN A; QQKN
+326F ; [.29B2.0020.0006.326F][.2A2E.0020.0006.326F] # CIRCLED HANGUL NIEUN A; QQKN
+1103 ; [.29B3.0020.0002.1103] # HANGUL CHOSEONG TIKEUT
+3137 ; [.29B3.0020.0004.3137] # HANGUL LETTER TIKEUT; QQK
+3202 ; [*02FF.0020.0004.3202][.29B3.0020.0004.3202][*0300.0020.001F.3202] # PARENTHESIZED HANGUL TIKEUT; QQKN
+3262 ; [.29B3.0020.0006.3262] # CIRCLED HANGUL TIKEUT; QQK
+FFA7 ; [.29B3.0020.0012.FFA7] # HALFWIDTH HANGUL LETTER TIKEUT; QQK
+3210 ; [*02FF.0020.0004.3210][.29B3.0020.0004.3210][.2A2E.0020.001F.3210][*0300.0020.001F.3210] # PARENTHESIZED HANGUL TIKEUT A; QQKN
+3270 ; [.29B3.0020.0006.3270][.2A2E.0020.0006.3270] # CIRCLED HANGUL TIKEUT A; QQKN
+1104 ; [.29B4.0020.0002.1104] # HANGUL CHOSEONG SSANGTIKEUT
+3138 ; [.29B4.0020.0004.3138] # HANGUL LETTER SSANGTIKEUT; QQK
+FFA8 ; [.29B4.0020.0012.FFA8] # HALFWIDTH HANGUL LETTER SSANGTIKEUT; QQK
+1105 ; [.29B5.0020.0002.1105] # HANGUL CHOSEONG RIEUL
+3139 ; [.29B5.0020.0004.3139] # HANGUL LETTER RIEUL; QQK
+3203 ; [*02FF.0020.0004.3203][.29B5.0020.0004.3203][*0300.0020.001F.3203] # PARENTHESIZED HANGUL RIEUL; QQKN
+3263 ; [.29B5.0020.0006.3263] # CIRCLED HANGUL RIEUL; QQK
+FFA9 ; [.29B5.0020.0012.FFA9] # HALFWIDTH HANGUL LETTER RIEUL; QQK
+3211 ; [*02FF.0020.0004.3211][.29B5.0020.0004.3211][.2A2E.0020.001F.3211][*0300.0020.001F.3211] # PARENTHESIZED HANGUL RIEUL A; QQKN
+3271 ; [.29B5.0020.0006.3271][.2A2E.0020.0006.3271] # CIRCLED HANGUL RIEUL A; QQKN
+1106 ; [.29B6.0020.0002.1106] # HANGUL CHOSEONG MIEUM
+3141 ; [.29B6.0020.0004.3141] # HANGUL LETTER MIEUM; QQK
+3204 ; [*02FF.0020.0004.3204][.29B6.0020.0004.3204][*0300.0020.001F.3204] # PARENTHESIZED HANGUL MIEUM; QQKN
+3264 ; [.29B6.0020.0006.3264] # CIRCLED HANGUL MIEUM; QQK
+FFB1 ; [.29B6.0020.0012.FFB1] # HALFWIDTH HANGUL LETTER MIEUM; QQK
+3212 ; [*02FF.0020.0004.3212][.29B6.0020.0004.3212][.2A2E.0020.001F.3212][*0300.0020.001F.3212] # PARENTHESIZED HANGUL MIEUM A; QQKN
+3272 ; [.29B6.0020.0006.3272][.2A2E.0020.0006.3272] # CIRCLED HANGUL MIEUM A; QQKN
+1107 ; [.29B7.0020.0002.1107] # HANGUL CHOSEONG PIEUP
+3142 ; [.29B7.0020.0004.3142] # HANGUL LETTER PIEUP; QQK
+3205 ; [*02FF.0020.0004.3205][.29B7.0020.0004.3205][*0300.0020.001F.3205] # PARENTHESIZED HANGUL PIEUP; QQKN
+3265 ; [.29B7.0020.0006.3265] # CIRCLED HANGUL PIEUP; QQK
+FFB2 ; [.29B7.0020.0012.FFB2] # HALFWIDTH HANGUL LETTER PIEUP; QQK
+3213 ; [*02FF.0020.0004.3213][.29B7.0020.0004.3213][.2A2E.0020.001F.3213][*0300.0020.001F.3213] # PARENTHESIZED HANGUL PIEUP A; QQKN
+3273 ; [.29B7.0020.0006.3273][.2A2E.0020.0006.3273] # CIRCLED HANGUL PIEUP A; QQKN
+1108 ; [.29B8.0020.0002.1108] # HANGUL CHOSEONG SSANGPIEUP
+3143 ; [.29B8.0020.0004.3143] # HANGUL LETTER SSANGPIEUP; QQK
+FFB3 ; [.29B8.0020.0012.FFB3] # HALFWIDTH HANGUL LETTER SSANGPIEUP; QQK
+1109 ; [.29B9.0020.0002.1109] # HANGUL CHOSEONG SIOS
+3145 ; [.29B9.0020.0004.3145] # HANGUL LETTER SIOS; QQK
+3206 ; [*02FF.0020.0004.3206][.29B9.0020.0004.3206][*0300.0020.001F.3206] # PARENTHESIZED HANGUL SIOS; QQKN
+3266 ; [.29B9.0020.0006.3266] # CIRCLED HANGUL SIOS; QQK
+FFB5 ; [.29B9.0020.0012.FFB5] # HALFWIDTH HANGUL LETTER SIOS; QQK
+3214 ; [*02FF.0020.0004.3214][.29B9.0020.0004.3214][.2A2E.0020.001F.3214][*0300.0020.001F.3214] # PARENTHESIZED HANGUL SIOS A; QQKN
+3274 ; [.29B9.0020.0006.3274][.2A2E.0020.0006.3274] # CIRCLED HANGUL SIOS A; QQKN
+110A ; [.29BA.0020.0002.110A] # HANGUL CHOSEONG SSANGSIOS
+3146 ; [.29BA.0020.0004.3146] # HANGUL LETTER SSANGSIOS; QQK
+FFB6 ; [.29BA.0020.0012.FFB6] # HALFWIDTH HANGUL LETTER SSANGSIOS; QQK
+110B ; [.29BB.0020.0002.110B] # HANGUL CHOSEONG IEUNG
+3147 ; [.29BB.0020.0004.3147] # HANGUL LETTER IEUNG; QQK
+3207 ; [*02FF.0020.0004.3207][.29BB.0020.0004.3207][*0300.0020.001F.3207] # PARENTHESIZED HANGUL IEUNG; QQKN
+3267 ; [.29BB.0020.0006.3267] # CIRCLED HANGUL IEUNG; QQK
+FFB7 ; [.29BB.0020.0012.FFB7] # HALFWIDTH HANGUL LETTER IEUNG; QQK
+3215 ; [*02FF.0020.0004.3215][.29BB.0020.0004.3215][.2A2E.0020.001F.3215][*0300.0020.001F.3215] # PARENTHESIZED HANGUL IEUNG A; QQKN
+3275 ; [.29BB.0020.0006.3275][.2A2E.0020.0006.3275] # CIRCLED HANGUL IEUNG A; QQKN
+321D ; [*02FF.0020.0004.321D][.29BB.0020.0004.321D][.2A36.0020.001F.321D][.29BC.0020.001F.321D][.2A32.0020.001F.321D][.2A8F.0020.001F.321D][*0300.0020.001F.321D] # PARENTHESIZED KOREAN CHARACTER OJEON; QQKN
+321E ; [*02FF.0020.0004.321E][.29BB.0020.0004.321E][.2A36.0020.001F.321E][.29C2.0020.001F.321E][.2A3B.0020.001F.321E][*0300.0020.001F.321E] # PARENTHESIZED KOREAN CHARACTER O HU; QQKN
+327E ; [.29BB.0020.0006.327E][.2A3B.0020.0006.327E] # CIRCLED HANGUL IEUNG U; QQKN
+110C ; [.29BC.0020.0002.110C] # HANGUL CHOSEONG CIEUC
+3148 ; [.29BC.0020.0004.3148] # HANGUL LETTER CIEUC; QQK
+3208 ; [*02FF.0020.0004.3208][.29BC.0020.0004.3208][*0300.0020.001F.3208] # PARENTHESIZED HANGUL CIEUC; QQKN
+3268 ; [.29BC.0020.0006.3268] # CIRCLED HANGUL CIEUC; QQK
+FFB8 ; [.29BC.0020.0012.FFB8] # HALFWIDTH HANGUL LETTER CIEUC; QQK
+3216 ; [*02FF.0020.0004.3216][.29BC.0020.0004.3216][.2A2E.0020.001F.3216][*0300.0020.001F.3216] # PARENTHESIZED HANGUL CIEUC A; QQKN
+3276 ; [.29BC.0020.0006.3276][.2A2E.0020.0006.3276] # CIRCLED HANGUL CIEUC A; QQKN
+321C ; [*02FF.0020.0004.321C][.29BC.0020.0004.321C][.2A3B.0020.001F.321C][*0300.0020.001F.321C] # PARENTHESIZED HANGUL CIEUC U; QQKN
+327D ; [.29BC.0020.0006.327D][.2A3B.0020.0006.327D][.29BB.0020.001F.327D][.2A41.0020.001F.327D] # CIRCLED KOREAN CHARACTER JUEUI; QQKN
+110D ; [.29BD.0020.0002.110D] # HANGUL CHOSEONG SSANGCIEUC
+3149 ; [.29BD.0020.0004.3149] # HANGUL LETTER SSANGCIEUC; QQK
+FFB9 ; [.29BD.0020.0012.FFB9] # HALFWIDTH HANGUL LETTER SSANGCIEUC; QQK
+110E ; [.29BE.0020.0002.110E] # HANGUL CHOSEONG CHIEUCH
+314A ; [.29BE.0020.0004.314A] # HANGUL LETTER CHIEUCH; QQK
+3209 ; [*02FF.0020.0004.3209][.29BE.0020.0004.3209][*0300.0020.001F.3209] # PARENTHESIZED HANGUL CHIEUCH; QQKN
+3269 ; [.29BE.0020.0006.3269] # CIRCLED HANGUL CHIEUCH; QQK
+FFBA ; [.29BE.0020.0012.FFBA] # HALFWIDTH HANGUL LETTER CHIEUCH; QQK
+3217 ; [*02FF.0020.0004.3217][.29BE.0020.0004.3217][.2A2E.0020.001F.3217][*0300.0020.001F.3217] # PARENTHESIZED HANGUL CHIEUCH A; QQKN
+3277 ; [.29BE.0020.0006.3277][.2A2E.0020.0006.3277] # CIRCLED HANGUL CHIEUCH A; QQKN
+327C ; [.29BE.0020.0006.327C][.2A2E.0020.0006.327C][.2A9B.0020.001F.327C][.29B0.0020.001F.327C][.2A36.0020.001F.327C] # CIRCLED KOREAN CHARACTER CHAMKO; QQKN
+110F ; [.29BF.0020.0002.110F] # HANGUL CHOSEONG KHIEUKH
+314B ; [.29BF.0020.0004.314B] # HANGUL LETTER KHIEUKH; QQK
+320A ; [*02FF.0020.0004.320A][.29BF.0020.0004.320A][*0300.0020.001F.320A] # PARENTHESIZED HANGUL KHIEUKH; QQKN
+326A ; [.29BF.0020.0006.326A] # CIRCLED HANGUL KHIEUKH; QQK
+FFBB ; [.29BF.0020.0012.FFBB] # HALFWIDTH HANGUL LETTER KHIEUKH; QQK
+3218 ; [*02FF.0020.0004.3218][.29BF.0020.0004.3218][.2A2E.0020.001F.3218][*0300.0020.001F.3218] # PARENTHESIZED HANGUL KHIEUKH A; QQKN
+3278 ; [.29BF.0020.0006.3278][.2A2E.0020.0006.3278] # CIRCLED HANGUL KHIEUKH A; QQKN
+1110 ; [.29C0.0020.0002.1110] # HANGUL CHOSEONG THIEUTH
+314C ; [.29C0.0020.0004.314C] # HANGUL LETTER THIEUTH; QQK
+320B ; [*02FF.0020.0004.320B][.29C0.0020.0004.320B][*0300.0020.001F.320B] # PARENTHESIZED HANGUL THIEUTH; QQKN
+326B ; [.29C0.0020.0006.326B] # CIRCLED HANGUL THIEUTH; QQK
+FFBC ; [.29C0.0020.0012.FFBC] # HALFWIDTH HANGUL LETTER THIEUTH; QQK
+3219 ; [*02FF.0020.0004.3219][.29C0.0020.0004.3219][.2A2E.0020.001F.3219][*0300.0020.001F.3219] # PARENTHESIZED HANGUL THIEUTH A; QQKN
+3279 ; [.29C0.0020.0006.3279][.2A2E.0020.0006.3279] # CIRCLED HANGUL THIEUTH A; QQKN
+1111 ; [.29C1.0020.0002.1111] # HANGUL CHOSEONG PHIEUPH
+314D ; [.29C1.0020.0004.314D] # HANGUL LETTER PHIEUPH; QQK
+320C ; [*02FF.0020.0004.320C][.29C1.0020.0004.320C][*0300.0020.001F.320C] # PARENTHESIZED HANGUL PHIEUPH; QQKN
+326C ; [.29C1.0020.0006.326C] # CIRCLED HANGUL PHIEUPH; QQK
+FFBD ; [.29C1.0020.0012.FFBD] # HALFWIDTH HANGUL LETTER PHIEUPH; QQK
+321A ; [*02FF.0020.0004.321A][.29C1.0020.0004.321A][.2A2E.0020.001F.321A][*0300.0020.001F.321A] # PARENTHESIZED HANGUL PHIEUPH A; QQKN
+327A ; [.29C1.0020.0006.327A][.2A2E.0020.0006.327A] # CIRCLED HANGUL PHIEUPH A; QQKN
+1112 ; [.29C2.0020.0002.1112] # HANGUL CHOSEONG HIEUH
+314E ; [.29C2.0020.0004.314E] # HANGUL LETTER HIEUH; QQK
+320D ; [*02FF.0020.0004.320D][.29C2.0020.0004.320D][*0300.0020.001F.320D] # PARENTHESIZED HANGUL HIEUH; QQKN
+326D ; [.29C2.0020.0006.326D] # CIRCLED HANGUL HIEUH; QQK
+FFBE ; [.29C2.0020.0012.FFBE] # HALFWIDTH HANGUL LETTER HIEUH; QQK
+321B ; [*02FF.0020.0004.321B][.29C2.0020.0004.321B][.2A2E.0020.001F.321B][*0300.0020.001F.321B] # PARENTHESIZED HANGUL HIEUH A; QQKN
+327B ; [.29C2.0020.0006.327B][.2A2E.0020.0006.327B] # CIRCLED HANGUL HIEUH A; QQKN
+1113 ; [.29C3.0020.0002.1113] # HANGUL CHOSEONG NIEUN-KIYEOK
+1114 ; [.29C4.0020.0002.1114] # HANGUL CHOSEONG SSANGNIEUN
+3165 ; [.29C4.0020.0004.3165] # HANGUL LETTER SSANGNIEUN; QQK
+1115 ; [.29C5.0020.0002.1115] # HANGUL CHOSEONG NIEUN-TIKEUT
+3166 ; [.29C5.0020.0004.3166] # HANGUL LETTER NIEUN-TIKEUT; QQK
+1116 ; [.29C6.0020.0002.1116] # HANGUL CHOSEONG NIEUN-PIEUP
+1117 ; [.29C7.0020.0002.1117] # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118 ; [.29C8.0020.0002.1118] # HANGUL CHOSEONG RIEUL-NIEUN
+1119 ; [.29C9.0020.0002.1119] # HANGUL CHOSEONG SSANGRIEUL
+111A ; [.29CA.0020.0002.111A] # HANGUL CHOSEONG RIEUL-HIEUH
+3140 ; [.29CA.0020.0004.3140] # HANGUL LETTER RIEUL-HIEUH; QQK
+FFB0 ; [.29CA.0020.0012.FFB0] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH; QQK
+111B ; [.29CB.0020.0002.111B] # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C ; [.29CC.0020.0002.111C] # HANGUL CHOSEONG MIEUM-PIEUP
+316E ; [.29CC.0020.0004.316E] # HANGUL LETTER MIEUM-PIEUP; QQK
+111D ; [.29CD.0020.0002.111D] # HANGUL CHOSEONG KAPYEOUNMIEUM
+3171 ; [.29CD.0020.0004.3171] # HANGUL LETTER KAPYEOUNMIEUM; QQK
+111E ; [.29CE.0020.0002.111E] # HANGUL CHOSEONG PIEUP-KIYEOK
+3172 ; [.29CE.0020.0004.3172] # HANGUL LETTER PIEUP-KIYEOK; QQK
+111F ; [.29CF.0020.0002.111F] # HANGUL CHOSEONG PIEUP-NIEUN
+1120 ; [.29D0.0020.0002.1120] # HANGUL CHOSEONG PIEUP-TIKEUT
+3173 ; [.29D0.0020.0004.3173] # HANGUL LETTER PIEUP-TIKEUT; QQK
+1121 ; [.29D1.0020.0002.1121] # HANGUL CHOSEONG PIEUP-SIOS
+3144 ; [.29D1.0020.0004.3144] # HANGUL LETTER PIEUP-SIOS; QQK
+FFB4 ; [.29D1.0020.0012.FFB4] # HALFWIDTH HANGUL LETTER PIEUP-SIOS; QQK
+1122 ; [.29D2.0020.0002.1122] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+3174 ; [.29D2.0020.0004.3174] # HANGUL LETTER PIEUP-SIOS-KIYEOK; QQK
+1123 ; [.29D3.0020.0002.1123] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+3175 ; [.29D3.0020.0004.3175] # HANGUL LETTER PIEUP-SIOS-TIKEUT; QQK
+1124 ; [.29D4.0020.0002.1124] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125 ; [.29D5.0020.0002.1125] # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126 ; [.29D6.0020.0002.1126] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127 ; [.29D7.0020.0002.1127] # HANGUL CHOSEONG PIEUP-CIEUC
+3176 ; [.29D7.0020.0004.3176] # HANGUL LETTER PIEUP-CIEUC; QQK
+1128 ; [.29D8.0020.0002.1128] # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129 ; [.29D9.0020.0002.1129] # HANGUL CHOSEONG PIEUP-THIEUTH
+3177 ; [.29D9.0020.0004.3177] # HANGUL LETTER PIEUP-THIEUTH; QQK
+112A ; [.29DA.0020.0002.112A] # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B ; [.29DB.0020.0002.112B] # HANGUL CHOSEONG KAPYEOUNPIEUP
+3178 ; [.29DB.0020.0004.3178] # HANGUL LETTER KAPYEOUNPIEUP; QQK
+112C ; [.29DC.0020.0002.112C] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+3179 ; [.29DC.0020.0004.3179] # HANGUL LETTER KAPYEOUNSSANGPIEUP; QQK
+112D ; [.29DD.0020.0002.112D] # HANGUL CHOSEONG SIOS-KIYEOK
+317A ; [.29DD.0020.0004.317A] # HANGUL LETTER SIOS-KIYEOK; QQK
+112E ; [.29DE.0020.0002.112E] # HANGUL CHOSEONG SIOS-NIEUN
+317B ; [.29DE.0020.0004.317B] # HANGUL LETTER SIOS-NIEUN; QQK
+112F ; [.29DF.0020.0002.112F] # HANGUL CHOSEONG SIOS-TIKEUT
+317C ; [.29DF.0020.0004.317C] # HANGUL LETTER SIOS-TIKEUT; QQK
+1130 ; [.29E0.0020.0002.1130] # HANGUL CHOSEONG SIOS-RIEUL
+1131 ; [.29E1.0020.0002.1131] # HANGUL CHOSEONG SIOS-MIEUM
+1132 ; [.29E2.0020.0002.1132] # HANGUL CHOSEONG SIOS-PIEUP
+317D ; [.29E2.0020.0004.317D] # HANGUL LETTER SIOS-PIEUP; QQK
+1133 ; [.29E3.0020.0002.1133] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134 ; [.29E4.0020.0002.1134] # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135 ; [.29E5.0020.0002.1135] # HANGUL CHOSEONG SIOS-IEUNG
+1136 ; [.29E6.0020.0002.1136] # HANGUL CHOSEONG SIOS-CIEUC
+317E ; [.29E6.0020.0004.317E] # HANGUL LETTER SIOS-CIEUC; QQK
+1137 ; [.29E7.0020.0002.1137] # HANGUL CHOSEONG SIOS-CHIEUCH
+1138 ; [.29E8.0020.0002.1138] # HANGUL CHOSEONG SIOS-KHIEUKH
+1139 ; [.29E9.0020.0002.1139] # HANGUL CHOSEONG SIOS-THIEUTH
+113A ; [.29EA.0020.0002.113A] # HANGUL CHOSEONG SIOS-PHIEUPH
+113B ; [.29EB.0020.0002.113B] # HANGUL CHOSEONG SIOS-HIEUH
+113C ; [.29EC.0020.0002.113C] # HANGUL CHOSEONG CHITUEUMSIOS
+113D ; [.29ED.0020.0002.113D] # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E ; [.29EE.0020.0002.113E] # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F ; [.29EF.0020.0002.113F] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140 ; [.29F0.0020.0002.1140] # HANGUL CHOSEONG PANSIOS
+317F ; [.29F0.0020.0004.317F] # HANGUL LETTER PANSIOS; QQK
+1141 ; [.29F1.0020.0002.1141] # HANGUL CHOSEONG IEUNG-KIYEOK
+1142 ; [.29F2.0020.0002.1142] # HANGUL CHOSEONG IEUNG-TIKEUT
+1143 ; [.29F3.0020.0002.1143] # HANGUL CHOSEONG IEUNG-MIEUM
+1144 ; [.29F4.0020.0002.1144] # HANGUL CHOSEONG IEUNG-PIEUP
+1145 ; [.29F5.0020.0002.1145] # HANGUL CHOSEONG IEUNG-SIOS
+1146 ; [.29F6.0020.0002.1146] # HANGUL CHOSEONG IEUNG-PANSIOS
+1147 ; [.29F7.0020.0002.1147] # HANGUL CHOSEONG SSANGIEUNG
+3180 ; [.29F7.0020.0004.3180] # HANGUL LETTER SSANGIEUNG; QQK
+1148 ; [.29F8.0020.0002.1148] # HANGUL CHOSEONG IEUNG-CIEUC
+1149 ; [.29F9.0020.0002.1149] # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A ; [.29FA.0020.0002.114A] # HANGUL CHOSEONG IEUNG-THIEUTH
+114B ; [.29FB.0020.0002.114B] # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C ; [.29FC.0020.0002.114C] # HANGUL CHOSEONG YESIEUNG
+3181 ; [.29FC.0020.0004.3181] # HANGUL LETTER YESIEUNG; QQK
+114D ; [.29FD.0020.0002.114D] # HANGUL CHOSEONG CIEUC-IEUNG
+114E ; [.29FE.0020.0002.114E] # HANGUL CHOSEONG CHITUEUMCIEUC
+114F ; [.29FF.0020.0002.114F] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150 ; [.2A00.0020.0002.1150] # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151 ; [.2A01.0020.0002.1151] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152 ; [.2A02.0020.0002.1152] # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153 ; [.2A03.0020.0002.1153] # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154 ; [.2A04.0020.0002.1154] # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155 ; [.2A05.0020.0002.1155] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156 ; [.2A06.0020.0002.1156] # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157 ; [.2A07.0020.0002.1157] # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+3184 ; [.2A07.0020.0004.3184] # HANGUL LETTER KAPYEOUNPHIEUPH; QQK
+1158 ; [.2A08.0020.0002.1158] # HANGUL CHOSEONG SSANGHIEUH
+3185 ; [.2A08.0020.0004.3185] # HANGUL LETTER SSANGHIEUH; QQK
+1159 ; [.2A09.0020.0002.1159] # HANGUL CHOSEONG YEORINHIEUH
+3186 ; [.2A09.0020.0004.3186] # HANGUL LETTER YEORINHIEUH; QQK
+115A ; [.2A0A.0020.0002.115A] # HANGUL CHOSEONG KIYEOK-TIKEUT
+115B ; [.2A0B.0020.0002.115B] # HANGUL CHOSEONG NIEUN-SIOS
+115C ; [.2A0C.0020.0002.115C] # HANGUL CHOSEONG NIEUN-CIEUC
+115D ; [.2A0D.0020.0002.115D] # HANGUL CHOSEONG NIEUN-HIEUH
+115E ; [.2A0E.0020.0002.115E] # HANGUL CHOSEONG TIKEUT-RIEUL
+A960 ; [.2A0F.0020.0002.A960] # HANGUL CHOSEONG TIKEUT-MIEUM
+A961 ; [.2A10.0020.0002.A961] # HANGUL CHOSEONG TIKEUT-PIEUP
+A962 ; [.2A11.0020.0002.A962] # HANGUL CHOSEONG TIKEUT-SIOS
+A963 ; [.2A12.0020.0002.A963] # HANGUL CHOSEONG TIKEUT-CIEUC
+A964 ; [.2A13.0020.0002.A964] # HANGUL CHOSEONG RIEUL-KIYEOK
+A965 ; [.2A14.0020.0002.A965] # HANGUL CHOSEONG RIEUL-SSANGKIYEOK
+A966 ; [.2A15.0020.0002.A966] # HANGUL CHOSEONG RIEUL-TIKEUT
+A967 ; [.2A16.0020.0002.A967] # HANGUL CHOSEONG RIEUL-SSANGTIKEUT
+A968 ; [.2A17.0020.0002.A968] # HANGUL CHOSEONG RIEUL-MIEUM
+A969 ; [.2A18.0020.0002.A969] # HANGUL CHOSEONG RIEUL-PIEUP
+A96A ; [.2A19.0020.0002.A96A] # HANGUL CHOSEONG RIEUL-SSANGPIEUP
+A96B ; [.2A1A.0020.0002.A96B] # HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP
+A96C ; [.2A1B.0020.0002.A96C] # HANGUL CHOSEONG RIEUL-SIOS
+A96D ; [.2A1C.0020.0002.A96D] # HANGUL CHOSEONG RIEUL-CIEUC
+A96E ; [.2A1D.0020.0002.A96E] # HANGUL CHOSEONG RIEUL-KHIEUKH
+A96F ; [.2A1E.0020.0002.A96F] # HANGUL CHOSEONG MIEUM-KIYEOK
+A970 ; [.2A1F.0020.0002.A970] # HANGUL CHOSEONG MIEUM-TIKEUT
+A971 ; [.2A20.0020.0002.A971] # HANGUL CHOSEONG MIEUM-SIOS
+A972 ; [.2A21.0020.0002.A972] # HANGUL CHOSEONG PIEUP-SIOS-THIEUTH
+A973 ; [.2A22.0020.0002.A973] # HANGUL CHOSEONG PIEUP-KHIEUKH
+A974 ; [.2A23.0020.0002.A974] # HANGUL CHOSEONG PIEUP-HIEUH
+A975 ; [.2A24.0020.0002.A975] # HANGUL CHOSEONG SSANGSIOS-PIEUP
+A976 ; [.2A25.0020.0002.A976] # HANGUL CHOSEONG IEUNG-RIEUL
+A977 ; [.2A26.0020.0002.A977] # HANGUL CHOSEONG IEUNG-HIEUH
+A978 ; [.2A27.0020.0002.A978] # HANGUL CHOSEONG SSANGCIEUC-HIEUH
+A979 ; [.2A28.0020.0002.A979] # HANGUL CHOSEONG SSANGTHIEUTH
+A97A ; [.2A29.0020.0002.A97A] # HANGUL CHOSEONG PHIEUPH-HIEUH
+A97B ; [.2A2A.0020.0002.A97B] # HANGUL CHOSEONG HIEUH-SIOS
+A97C ; [.2A2B.0020.0002.A97C] # HANGUL CHOSEONG SSANGYEORINHIEUH
+115F ; [.2A2C.0020.0002.115F] # HANGUL CHOSEONG FILLER
+1160 ; [.2A2D.0020.0002.1160] # HANGUL JUNGSEONG FILLER
+3164 ; [.2A2D.0020.0004.3164] # HANGUL FILLER; QQK
+FFA0 ; [.2A2D.0020.0012.FFA0] # HALFWIDTH HANGUL FILLER; QQK
+1161 ; [.2A2E.0020.0002.1161] # HANGUL JUNGSEONG A
+314F ; [.2A2E.0020.0004.314F] # HANGUL LETTER A; QQK
+FFC2 ; [.2A2E.0020.0012.FFC2] # HALFWIDTH HANGUL LETTER A; QQK
+1162 ; [.2A2F.0020.0002.1162] # HANGUL JUNGSEONG AE
+3150 ; [.2A2F.0020.0004.3150] # HANGUL LETTER AE; QQK
+FFC3 ; [.2A2F.0020.0012.FFC3] # HALFWIDTH HANGUL LETTER AE; QQK
+1163 ; [.2A30.0020.0002.1163] # HANGUL JUNGSEONG YA
+3151 ; [.2A30.0020.0004.3151] # HANGUL LETTER YA; QQK
+FFC4 ; [.2A30.0020.0012.FFC4] # HALFWIDTH HANGUL LETTER YA; QQK
+1164 ; [.2A31.0020.0002.1164] # HANGUL JUNGSEONG YAE
+3152 ; [.2A31.0020.0004.3152] # HANGUL LETTER YAE; QQK
+FFC5 ; [.2A31.0020.0012.FFC5] # HALFWIDTH HANGUL LETTER YAE; QQK
+1165 ; [.2A32.0020.0002.1165] # HANGUL JUNGSEONG EO
+3153 ; [.2A32.0020.0004.3153] # HANGUL LETTER EO; QQK
+FFC6 ; [.2A32.0020.0012.FFC6] # HALFWIDTH HANGUL LETTER EO; QQK
+1166 ; [.2A33.0020.0002.1166] # HANGUL JUNGSEONG E
+3154 ; [.2A33.0020.0004.3154] # HANGUL LETTER E; QQK
+FFC7 ; [.2A33.0020.0012.FFC7] # HALFWIDTH HANGUL LETTER E; QQK
+1167 ; [.2A34.0020.0002.1167] # HANGUL JUNGSEONG YEO
+3155 ; [.2A34.0020.0004.3155] # HANGUL LETTER YEO; QQK
+FFCA ; [.2A34.0020.0012.FFCA] # HALFWIDTH HANGUL LETTER YEO; QQK
+1168 ; [.2A35.0020.0002.1168] # HANGUL JUNGSEONG YE
+3156 ; [.2A35.0020.0004.3156] # HANGUL LETTER YE; QQK
+FFCB ; [.2A35.0020.0012.FFCB] # HALFWIDTH HANGUL LETTER YE; QQK
+1169 ; [.2A36.0020.0002.1169] # HANGUL JUNGSEONG O
+3157 ; [.2A36.0020.0004.3157] # HANGUL LETTER O; QQK
+FFCC ; [.2A36.0020.0012.FFCC] # HALFWIDTH HANGUL LETTER O; QQK
+116A ; [.2A37.0020.0002.116A] # HANGUL JUNGSEONG WA
+3158 ; [.2A37.0020.0004.3158] # HANGUL LETTER WA; QQK
+FFCD ; [.2A37.0020.0012.FFCD] # HALFWIDTH HANGUL LETTER WA; QQK
+116B ; [.2A38.0020.0002.116B] # HANGUL JUNGSEONG WAE
+3159 ; [.2A38.0020.0004.3159] # HANGUL LETTER WAE; QQK
+FFCE ; [.2A38.0020.0012.FFCE] # HALFWIDTH HANGUL LETTER WAE; QQK
+116C ; [.2A39.0020.0002.116C] # HANGUL JUNGSEONG OE
+315A ; [.2A39.0020.0004.315A] # HANGUL LETTER OE; QQK
+FFCF ; [.2A39.0020.0012.FFCF] # HALFWIDTH HANGUL LETTER OE; QQK
+116D ; [.2A3A.0020.0002.116D] # HANGUL JUNGSEONG YO
+315B ; [.2A3A.0020.0004.315B] # HANGUL LETTER YO; QQK
+FFD2 ; [.2A3A.0020.0012.FFD2] # HALFWIDTH HANGUL LETTER YO; QQK
+116E ; [.2A3B.0020.0002.116E] # HANGUL JUNGSEONG U
+315C ; [.2A3B.0020.0004.315C] # HANGUL LETTER U; QQK
+FFD3 ; [.2A3B.0020.0012.FFD3] # HALFWIDTH HANGUL LETTER U; QQK
+116F ; [.2A3C.0020.0002.116F] # HANGUL JUNGSEONG WEO
+315D ; [.2A3C.0020.0004.315D] # HANGUL LETTER WEO; QQK
+FFD4 ; [.2A3C.0020.0012.FFD4] # HALFWIDTH HANGUL LETTER WEO; QQK
+1170 ; [.2A3D.0020.0002.1170] # HANGUL JUNGSEONG WE
+315E ; [.2A3D.0020.0004.315E] # HANGUL LETTER WE; QQK
+FFD5 ; [.2A3D.0020.0012.FFD5] # HALFWIDTH HANGUL LETTER WE; QQK
+1171 ; [.2A3E.0020.0002.1171] # HANGUL JUNGSEONG WI
+315F ; [.2A3E.0020.0004.315F] # HANGUL LETTER WI; QQK
+FFD6 ; [.2A3E.0020.0012.FFD6] # HALFWIDTH HANGUL LETTER WI; QQK
+1172 ; [.2A3F.0020.0002.1172] # HANGUL JUNGSEONG YU
+3160 ; [.2A3F.0020.0004.3160] # HANGUL LETTER YU; QQK
+FFD7 ; [.2A3F.0020.0012.FFD7] # HALFWIDTH HANGUL LETTER YU; QQK
+1173 ; [.2A40.0020.0002.1173] # HANGUL JUNGSEONG EU
+3161 ; [.2A40.0020.0004.3161] # HANGUL LETTER EU; QQK
+FFDA ; [.2A40.0020.0012.FFDA] # HALFWIDTH HANGUL LETTER EU; QQK
+1174 ; [.2A41.0020.0002.1174] # HANGUL JUNGSEONG YI
+3162 ; [.2A41.0020.0004.3162] # HANGUL LETTER YI; QQK
+FFDB ; [.2A41.0020.0012.FFDB] # HALFWIDTH HANGUL LETTER YI; QQK
+1175 ; [.2A42.0020.0002.1175] # HANGUL JUNGSEONG I
+3163 ; [.2A42.0020.0004.3163] # HANGUL LETTER I; QQK
+FFDC ; [.2A42.0020.0012.FFDC] # HALFWIDTH HANGUL LETTER I; QQK
+1176 ; [.2A43.0020.0002.1176] # HANGUL JUNGSEONG A-O
+1177 ; [.2A44.0020.0002.1177] # HANGUL JUNGSEONG A-U
+1178 ; [.2A45.0020.0002.1178] # HANGUL JUNGSEONG YA-O
+1179 ; [.2A46.0020.0002.1179] # HANGUL JUNGSEONG YA-YO
+117A ; [.2A47.0020.0002.117A] # HANGUL JUNGSEONG EO-O
+117B ; [.2A48.0020.0002.117B] # HANGUL JUNGSEONG EO-U
+117C ; [.2A49.0020.0002.117C] # HANGUL JUNGSEONG EO-EU
+117D ; [.2A4A.0020.0002.117D] # HANGUL JUNGSEONG YEO-O
+117E ; [.2A4B.0020.0002.117E] # HANGUL JUNGSEONG YEO-U
+117F ; [.2A4C.0020.0002.117F] # HANGUL JUNGSEONG O-EO
+1180 ; [.2A4D.0020.0002.1180] # HANGUL JUNGSEONG O-E
+1181 ; [.2A4E.0020.0002.1181] # HANGUL JUNGSEONG O-YE
+1182 ; [.2A4F.0020.0002.1182] # HANGUL JUNGSEONG O-O
+1183 ; [.2A50.0020.0002.1183] # HANGUL JUNGSEONG O-U
+1184 ; [.2A51.0020.0002.1184] # HANGUL JUNGSEONG YO-YA
+3187 ; [.2A51.0020.0004.3187] # HANGUL LETTER YO-YA; QQK
+1185 ; [.2A52.0020.0002.1185] # HANGUL JUNGSEONG YO-YAE
+3188 ; [.2A52.0020.0004.3188] # HANGUL LETTER YO-YAE; QQK
+1186 ; [.2A53.0020.0002.1186] # HANGUL JUNGSEONG YO-YEO
+1187 ; [.2A54.0020.0002.1187] # HANGUL JUNGSEONG YO-O
+1188 ; [.2A55.0020.0002.1188] # HANGUL JUNGSEONG YO-I
+3189 ; [.2A55.0020.0004.3189] # HANGUL LETTER YO-I; QQK
+1189 ; [.2A56.0020.0002.1189] # HANGUL JUNGSEONG U-A
+118A ; [.2A57.0020.0002.118A] # HANGUL JUNGSEONG U-AE
+118B ; [.2A58.0020.0002.118B] # HANGUL JUNGSEONG U-EO-EU
+118C ; [.2A59.0020.0002.118C] # HANGUL JUNGSEONG U-YE
+118D ; [.2A5A.0020.0002.118D] # HANGUL JUNGSEONG U-U
+118E ; [.2A5B.0020.0002.118E] # HANGUL JUNGSEONG YU-A
+118F ; [.2A5C.0020.0002.118F] # HANGUL JUNGSEONG YU-EO
+1190 ; [.2A5D.0020.0002.1190] # HANGUL JUNGSEONG YU-E
+1191 ; [.2A5E.0020.0002.1191] # HANGUL JUNGSEONG YU-YEO
+318A ; [.2A5E.0020.0004.318A] # HANGUL LETTER YU-YEO; QQK
+1192 ; [.2A5F.0020.0002.1192] # HANGUL JUNGSEONG YU-YE
+318B ; [.2A5F.0020.0004.318B] # HANGUL LETTER YU-YE; QQK
+1193 ; [.2A60.0020.0002.1193] # HANGUL JUNGSEONG YU-U
+1194 ; [.2A61.0020.0002.1194] # HANGUL JUNGSEONG YU-I
+318C ; [.2A61.0020.0004.318C] # HANGUL LETTER YU-I; QQK
+1195 ; [.2A62.0020.0002.1195] # HANGUL JUNGSEONG EU-U
+1196 ; [.2A63.0020.0002.1196] # HANGUL JUNGSEONG EU-EU
+1197 ; [.2A64.0020.0002.1197] # HANGUL JUNGSEONG YI-U
+1198 ; [.2A65.0020.0002.1198] # HANGUL JUNGSEONG I-A
+1199 ; [.2A66.0020.0002.1199] # HANGUL JUNGSEONG I-YA
+119A ; [.2A67.0020.0002.119A] # HANGUL JUNGSEONG I-O
+119B ; [.2A68.0020.0002.119B] # HANGUL JUNGSEONG I-U
+119C ; [.2A69.0020.0002.119C] # HANGUL JUNGSEONG I-EU
+119D ; [.2A6A.0020.0002.119D] # HANGUL JUNGSEONG I-ARAEA
+119E ; [.2A6B.0020.0002.119E] # HANGUL JUNGSEONG ARAEA
+318D ; [.2A6B.0020.0004.318D] # HANGUL LETTER ARAEA; QQK
+119F ; [.2A6C.0020.0002.119F] # HANGUL JUNGSEONG ARAEA-EO
+11A0 ; [.2A6D.0020.0002.11A0] # HANGUL JUNGSEONG ARAEA-U
+11A1 ; [.2A6E.0020.0002.11A1] # HANGUL JUNGSEONG ARAEA-I
+318E ; [.2A6E.0020.0004.318E] # HANGUL LETTER ARAEAE; QQK
+11A2 ; [.2A6F.0020.0002.11A2] # HANGUL JUNGSEONG SSANGARAEA
+11A3 ; [.2A70.0020.0002.11A3] # HANGUL JUNGSEONG A-EU
+11A4 ; [.2A71.0020.0002.11A4] # HANGUL JUNGSEONG YA-U
+11A5 ; [.2A72.0020.0002.11A5] # HANGUL JUNGSEONG YEO-YA
+11A6 ; [.2A73.0020.0002.11A6] # HANGUL JUNGSEONG O-YA
+11A7 ; [.2A74.0020.0002.11A7] # HANGUL JUNGSEONG O-YAE
+D7B0 ; [.2A75.0020.0002.D7B0] # HANGUL JUNGSEONG O-YEO
+D7B1 ; [.2A76.0020.0002.D7B1] # HANGUL JUNGSEONG O-O-I
+D7B2 ; [.2A77.0020.0002.D7B2] # HANGUL JUNGSEONG YO-A
+D7B3 ; [.2A78.0020.0002.D7B3] # HANGUL JUNGSEONG YO-AE
+D7B4 ; [.2A79.0020.0002.D7B4] # HANGUL JUNGSEONG YO-EO
+D7B5 ; [.2A7A.0020.0002.D7B5] # HANGUL JUNGSEONG U-YEO
+D7B6 ; [.2A7B.0020.0002.D7B6] # HANGUL JUNGSEONG U-I-I
+D7B7 ; [.2A7C.0020.0002.D7B7] # HANGUL JUNGSEONG YU-AE
+D7B8 ; [.2A7D.0020.0002.D7B8] # HANGUL JUNGSEONG YU-O
+D7B9 ; [.2A7E.0020.0002.D7B9] # HANGUL JUNGSEONG EU-A
+D7BA ; [.2A7F.0020.0002.D7BA] # HANGUL JUNGSEONG EU-EO
+D7BB ; [.2A80.0020.0002.D7BB] # HANGUL JUNGSEONG EU-E
+D7BC ; [.2A81.0020.0002.D7BC] # HANGUL JUNGSEONG EU-O
+D7BD ; [.2A82.0020.0002.D7BD] # HANGUL JUNGSEONG I-YA-O
+D7BE ; [.2A83.0020.0002.D7BE] # HANGUL JUNGSEONG I-YAE
+D7BF ; [.2A84.0020.0002.D7BF] # HANGUL JUNGSEONG I-YEO
+D7C0 ; [.2A85.0020.0002.D7C0] # HANGUL JUNGSEONG I-YE
+D7C1 ; [.2A86.0020.0002.D7C1] # HANGUL JUNGSEONG I-O-I
+D7C2 ; [.2A87.0020.0002.D7C2] # HANGUL JUNGSEONG I-YO
+D7C3 ; [.2A88.0020.0002.D7C3] # HANGUL JUNGSEONG I-YU
+D7C4 ; [.2A89.0020.0002.D7C4] # HANGUL JUNGSEONG I-I
+D7C5 ; [.2A8A.0020.0002.D7C5] # HANGUL JUNGSEONG ARAEA-A
+D7C6 ; [.2A8B.0020.0002.D7C6] # HANGUL JUNGSEONG ARAEA-E
+11A8 ; [.2A8C.0020.0002.11A8] # HANGUL JONGSEONG KIYEOK
+11A9 ; [.2A8D.0020.0002.11A9] # HANGUL JONGSEONG SSANGKIYEOK
+11AA ; [.2A8E.0020.0002.11AA] # HANGUL JONGSEONG KIYEOK-SIOS
+3133 ; [.2A8E.0020.0004.3133] # HANGUL LETTER KIYEOK-SIOS; QQK
+FFA3 ; [.2A8E.0020.0012.FFA3] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS; QQK
+11AB ; [.2A8F.0020.0002.11AB] # HANGUL JONGSEONG NIEUN
+11AC ; [.2A90.0020.0002.11AC] # HANGUL JONGSEONG NIEUN-CIEUC
+3135 ; [.2A90.0020.0004.3135] # HANGUL LETTER NIEUN-CIEUC; QQK
+FFA5 ; [.2A90.0020.0012.FFA5] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC; QQK
+11AD ; [.2A91.0020.0002.11AD] # HANGUL JONGSEONG NIEUN-HIEUH
+3136 ; [.2A91.0020.0004.3136] # HANGUL LETTER NIEUN-HIEUH; QQK
+FFA6 ; [.2A91.0020.0012.FFA6] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH; QQK
+11AE ; [.2A92.0020.0002.11AE] # HANGUL JONGSEONG TIKEUT
+11AF ; [.2A93.0020.0002.11AF] # HANGUL JONGSEONG RIEUL
+11B0 ; [.2A94.0020.0002.11B0] # HANGUL JONGSEONG RIEUL-KIYEOK
+313A ; [.2A94.0020.0004.313A] # HANGUL LETTER RIEUL-KIYEOK; QQK
+FFAA ; [.2A94.0020.0012.FFAA] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK; QQK
+11B1 ; [.2A95.0020.0002.11B1] # HANGUL JONGSEONG RIEUL-MIEUM
+313B ; [.2A95.0020.0004.313B] # HANGUL LETTER RIEUL-MIEUM; QQK
+FFAB ; [.2A95.0020.0012.FFAB] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM; QQK
+11B2 ; [.2A96.0020.0002.11B2] # HANGUL JONGSEONG RIEUL-PIEUP
+313C ; [.2A96.0020.0004.313C] # HANGUL LETTER RIEUL-PIEUP; QQK
+FFAC ; [.2A96.0020.0012.FFAC] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP; QQK
+11B3 ; [.2A97.0020.0002.11B3] # HANGUL JONGSEONG RIEUL-SIOS
+313D ; [.2A97.0020.0004.313D] # HANGUL LETTER RIEUL-SIOS; QQK
+FFAD ; [.2A97.0020.0012.FFAD] # HALFWIDTH HANGUL LETTER RIEUL-SIOS; QQK
+11B4 ; [.2A98.0020.0002.11B4] # HANGUL JONGSEONG RIEUL-THIEUTH
+313E ; [.2A98.0020.0004.313E] # HANGUL LETTER RIEUL-THIEUTH; QQK
+FFAE ; [.2A98.0020.0012.FFAE] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH; QQK
+11B5 ; [.2A99.0020.0002.11B5] # HANGUL JONGSEONG RIEUL-PHIEUPH
+313F ; [.2A99.0020.0004.313F] # HANGUL LETTER RIEUL-PHIEUPH; QQK
+FFAF ; [.2A99.0020.0012.FFAF] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH; QQK
+11B6 ; [.2A9A.0020.0002.11B6] # HANGUL JONGSEONG RIEUL-HIEUH
+11B7 ; [.2A9B.0020.0002.11B7] # HANGUL JONGSEONG MIEUM
+11B8 ; [.2A9C.0020.0002.11B8] # HANGUL JONGSEONG PIEUP
+11B9 ; [.2A9D.0020.0002.11B9] # HANGUL JONGSEONG PIEUP-SIOS
+11BA ; [.2A9E.0020.0002.11BA] # HANGUL JONGSEONG SIOS
+11BB ; [.2A9F.0020.0002.11BB] # HANGUL JONGSEONG SSANGSIOS
+11BC ; [.2AA0.0020.0002.11BC] # HANGUL JONGSEONG IEUNG
+11BD ; [.2AA1.0020.0002.11BD] # HANGUL JONGSEONG CIEUC
+11BE ; [.2AA2.0020.0002.11BE] # HANGUL JONGSEONG CHIEUCH
+11BF ; [.2AA3.0020.0002.11BF] # HANGUL JONGSEONG KHIEUKH
+11C0 ; [.2AA4.0020.0002.11C0] # HANGUL JONGSEONG THIEUTH
+11C1 ; [.2AA5.0020.0002.11C1] # HANGUL JONGSEONG PHIEUPH
+11C2 ; [.2AA6.0020.0002.11C2] # HANGUL JONGSEONG HIEUH
+11C3 ; [.2AA7.0020.0002.11C3] # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4 ; [.2AA8.0020.0002.11C4] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5 ; [.2AA9.0020.0002.11C5] # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6 ; [.2AAA.0020.0002.11C6] # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7 ; [.2AAB.0020.0002.11C7] # HANGUL JONGSEONG NIEUN-SIOS
+3167 ; [.2AAB.0020.0004.3167] # HANGUL LETTER NIEUN-SIOS; QQK
+11C8 ; [.2AAC.0020.0002.11C8] # HANGUL JONGSEONG NIEUN-PANSIOS
+3168 ; [.2AAC.0020.0004.3168] # HANGUL LETTER NIEUN-PANSIOS; QQK
+11C9 ; [.2AAD.0020.0002.11C9] # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA ; [.2AAE.0020.0002.11CA] # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB ; [.2AAF.0020.0002.11CB] # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC ; [.2AB0.0020.0002.11CC] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+3169 ; [.2AB0.0020.0004.3169] # HANGUL LETTER RIEUL-KIYEOK-SIOS; QQK
+11CD ; [.2AB1.0020.0002.11CD] # HANGUL JONGSEONG RIEUL-NIEUN
+11CE ; [.2AB2.0020.0002.11CE] # HANGUL JONGSEONG RIEUL-TIKEUT
+316A ; [.2AB2.0020.0004.316A] # HANGUL LETTER RIEUL-TIKEUT; QQK
+11CF ; [.2AB3.0020.0002.11CF] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0 ; [.2AB4.0020.0002.11D0] # HANGUL JONGSEONG SSANGRIEUL
+11D1 ; [.2AB5.0020.0002.11D1] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2 ; [.2AB6.0020.0002.11D2] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3 ; [.2AB7.0020.0002.11D3] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+316B ; [.2AB7.0020.0004.316B] # HANGUL LETTER RIEUL-PIEUP-SIOS; QQK
+11D4 ; [.2AB8.0020.0002.11D4] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5 ; [.2AB9.0020.0002.11D5] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6 ; [.2ABA.0020.0002.11D6] # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7 ; [.2ABB.0020.0002.11D7] # HANGUL JONGSEONG RIEUL-PANSIOS
+316C ; [.2ABB.0020.0004.316C] # HANGUL LETTER RIEUL-PANSIOS; QQK
+11D8 ; [.2ABC.0020.0002.11D8] # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9 ; [.2ABD.0020.0002.11D9] # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+316D ; [.2ABD.0020.0004.316D] # HANGUL LETTER RIEUL-YEORINHIEUH; QQK
+11DA ; [.2ABE.0020.0002.11DA] # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB ; [.2ABF.0020.0002.11DB] # HANGUL JONGSEONG MIEUM-RIEUL
+11DC ; [.2AC0.0020.0002.11DC] # HANGUL JONGSEONG MIEUM-PIEUP
+11DD ; [.2AC1.0020.0002.11DD] # HANGUL JONGSEONG MIEUM-SIOS
+316F ; [.2AC1.0020.0004.316F] # HANGUL LETTER MIEUM-SIOS; QQK
+11DE ; [.2AC2.0020.0002.11DE] # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF ; [.2AC3.0020.0002.11DF] # HANGUL JONGSEONG MIEUM-PANSIOS
+3170 ; [.2AC3.0020.0004.3170] # HANGUL LETTER MIEUM-PANSIOS; QQK
+11E0 ; [.2AC4.0020.0002.11E0] # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1 ; [.2AC5.0020.0002.11E1] # HANGUL JONGSEONG MIEUM-HIEUH
+11E2 ; [.2AC6.0020.0002.11E2] # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3 ; [.2AC7.0020.0002.11E3] # HANGUL JONGSEONG PIEUP-RIEUL
+11E4 ; [.2AC8.0020.0002.11E4] # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5 ; [.2AC9.0020.0002.11E5] # HANGUL JONGSEONG PIEUP-HIEUH
+11E6 ; [.2ACA.0020.0002.11E6] # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7 ; [.2ACB.0020.0002.11E7] # HANGUL JONGSEONG SIOS-KIYEOK
+11E8 ; [.2ACC.0020.0002.11E8] # HANGUL JONGSEONG SIOS-TIKEUT
+11E9 ; [.2ACD.0020.0002.11E9] # HANGUL JONGSEONG SIOS-RIEUL
+11EA ; [.2ACE.0020.0002.11EA] # HANGUL JONGSEONG SIOS-PIEUP
+11EB ; [.2ACF.0020.0002.11EB] # HANGUL JONGSEONG PANSIOS
+11EC ; [.2AD0.0020.0002.11EC] # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED ; [.2AD1.0020.0002.11ED] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE ; [.2AD2.0020.0002.11EE] # HANGUL JONGSEONG SSANGIEUNG
+11EF ; [.2AD3.0020.0002.11EF] # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0 ; [.2AD4.0020.0002.11F0] # HANGUL JONGSEONG YESIEUNG
+11F1 ; [.2AD5.0020.0002.11F1] # HANGUL JONGSEONG YESIEUNG-SIOS
+3182 ; [.2AD5.0020.0004.3182] # HANGUL LETTER YESIEUNG-SIOS; QQK
+11F2 ; [.2AD6.0020.0002.11F2] # HANGUL JONGSEONG YESIEUNG-PANSIOS
+3183 ; [.2AD6.0020.0004.3183] # HANGUL LETTER YESIEUNG-PANSIOS; QQK
+11F3 ; [.2AD7.0020.0002.11F3] # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4 ; [.2AD8.0020.0002.11F4] # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5 ; [.2AD9.0020.0002.11F5] # HANGUL JONGSEONG HIEUH-NIEUN
+11F6 ; [.2ADA.0020.0002.11F6] # HANGUL JONGSEONG HIEUH-RIEUL
+11F7 ; [.2ADB.0020.0002.11F7] # HANGUL JONGSEONG HIEUH-MIEUM
+11F8 ; [.2ADC.0020.0002.11F8] # HANGUL JONGSEONG HIEUH-PIEUP
+11F9 ; [.2ADD.0020.0002.11F9] # HANGUL JONGSEONG YEORINHIEUH
+11FA ; [.2ADE.0020.0002.11FA] # HANGUL JONGSEONG KIYEOK-NIEUN
+11FB ; [.2ADF.0020.0002.11FB] # HANGUL JONGSEONG KIYEOK-PIEUP
+11FC ; [.2AE0.0020.0002.11FC] # HANGUL JONGSEONG KIYEOK-CHIEUCH
+11FD ; [.2AE1.0020.0002.11FD] # HANGUL JONGSEONG KIYEOK-KHIEUKH
+11FE ; [.2AE2.0020.0002.11FE] # HANGUL JONGSEONG KIYEOK-HIEUH
+11FF ; [.2AE3.0020.0002.11FF] # HANGUL JONGSEONG SSANGNIEUN
+D7CB ; [.2AE4.0020.0002.D7CB] # HANGUL JONGSEONG NIEUN-RIEUL
+D7CC ; [.2AE5.0020.0002.D7CC] # HANGUL JONGSEONG NIEUN-CHIEUCH
+D7CD ; [.2AE6.0020.0002.D7CD] # HANGUL JONGSEONG SSANGTIKEUT
+D7CE ; [.2AE7.0020.0002.D7CE] # HANGUL JONGSEONG SSANGTIKEUT-PIEUP
+D7CF ; [.2AE8.0020.0002.D7CF] # HANGUL JONGSEONG TIKEUT-PIEUP
+D7D0 ; [.2AE9.0020.0002.D7D0] # HANGUL JONGSEONG TIKEUT-SIOS
+D7D1 ; [.2AEA.0020.0002.D7D1] # HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK
+D7D2 ; [.2AEB.0020.0002.D7D2] # HANGUL JONGSEONG TIKEUT-CIEUC
+D7D3 ; [.2AEC.0020.0002.D7D3] # HANGUL JONGSEONG TIKEUT-CHIEUCH
+D7D4 ; [.2AED.0020.0002.D7D4] # HANGUL JONGSEONG TIKEUT-THIEUTH
+D7D5 ; [.2AEE.0020.0002.D7D5] # HANGUL JONGSEONG RIEUL-SSANGKIYEOK
+D7D6 ; [.2AEF.0020.0002.D7D6] # HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH
+D7D7 ; [.2AF0.0020.0002.D7D7] # HANGUL JONGSEONG SSANGRIEUL-KHIEUKH
+D7D8 ; [.2AF1.0020.0002.D7D8] # HANGUL JONGSEONG RIEUL-MIEUM-HIEUH
+D7D9 ; [.2AF2.0020.0002.D7D9] # HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT
+D7DA ; [.2AF3.0020.0002.D7DA] # HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH
+D7DB ; [.2AF4.0020.0002.D7DB] # HANGUL JONGSEONG RIEUL-YESIEUNG
+D7DC ; [.2AF5.0020.0002.D7DC] # HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH
+D7DD ; [.2AF6.0020.0002.D7DD] # HANGUL JONGSEONG KAPYEOUNRIEUL
+D7DE ; [.2AF7.0020.0002.D7DE] # HANGUL JONGSEONG MIEUM-NIEUN
+D7DF ; [.2AF8.0020.0002.D7DF] # HANGUL JONGSEONG MIEUM-SSANGNIEUN
+D7E0 ; [.2AF9.0020.0002.D7E0] # HANGUL JONGSEONG SSANGMIEUM
+D7E1 ; [.2AFA.0020.0002.D7E1] # HANGUL JONGSEONG MIEUM-PIEUP-SIOS
+D7E2 ; [.2AFB.0020.0002.D7E2] # HANGUL JONGSEONG MIEUM-CIEUC
+D7E3 ; [.2AFC.0020.0002.D7E3] # HANGUL JONGSEONG PIEUP-TIKEUT
+D7E4 ; [.2AFD.0020.0002.D7E4] # HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH
+D7E5 ; [.2AFE.0020.0002.D7E5] # HANGUL JONGSEONG PIEUP-MIEUM
+D7E6 ; [.2AFF.0020.0002.D7E6] # HANGUL JONGSEONG SSANGPIEUP
+D7E7 ; [.2B00.0020.0002.D7E7] # HANGUL JONGSEONG PIEUP-SIOS-TIKEUT
+D7E8 ; [.2B01.0020.0002.D7E8] # HANGUL JONGSEONG PIEUP-CIEUC
+D7E9 ; [.2B02.0020.0002.D7E9] # HANGUL JONGSEONG PIEUP-CHIEUCH
+D7EA ; [.2B03.0020.0002.D7EA] # HANGUL JONGSEONG SIOS-MIEUM
+D7EB ; [.2B04.0020.0002.D7EB] # HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP
+D7EC ; [.2B05.0020.0002.D7EC] # HANGUL JONGSEONG SSANGSIOS-KIYEOK
+D7ED ; [.2B06.0020.0002.D7ED] # HANGUL JONGSEONG SSANGSIOS-TIKEUT
+D7EE ; [.2B07.0020.0002.D7EE] # HANGUL JONGSEONG SIOS-PANSIOS
+D7EF ; [.2B08.0020.0002.D7EF] # HANGUL JONGSEONG SIOS-CIEUC
+D7F0 ; [.2B09.0020.0002.D7F0] # HANGUL JONGSEONG SIOS-CHIEUCH
+D7F1 ; [.2B0A.0020.0002.D7F1] # HANGUL JONGSEONG SIOS-THIEUTH
+D7F2 ; [.2B0B.0020.0002.D7F2] # HANGUL JONGSEONG SIOS-HIEUH
+D7F3 ; [.2B0C.0020.0002.D7F3] # HANGUL JONGSEONG PANSIOS-PIEUP
+D7F4 ; [.2B0D.0020.0002.D7F4] # HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP
+D7F5 ; [.2B0E.0020.0002.D7F5] # HANGUL JONGSEONG YESIEUNG-MIEUM
+D7F6 ; [.2B0F.0020.0002.D7F6] # HANGUL JONGSEONG YESIEUNG-HIEUH
+D7F7 ; [.2B10.0020.0002.D7F7] # HANGUL JONGSEONG CIEUC-PIEUP
+D7F8 ; [.2B11.0020.0002.D7F8] # HANGUL JONGSEONG CIEUC-SSANGPIEUP
+D7F9 ; [.2B12.0020.0002.D7F9] # HANGUL JONGSEONG SSANGCIEUC
+D7FA ; [.2B13.0020.0002.D7FA] # HANGUL JONGSEONG PHIEUPH-SIOS
+D7FB ; [.2B14.0020.0002.D7FB] # HANGUL JONGSEONG PHIEUPH-THIEUTH
+3041 ; [.2B15.0020.000D.3041] # HIRAGANA LETTER SMALL A
+3042 ; [.2B15.0020.000E.3042] # HIRAGANA LETTER A
+30A1 ; [.2B15.0020.000F.30A1] # KATAKANA LETTER SMALL A
+FF67 ; [.2B15.0020.0010.FF67] # HALFWIDTH KATAKANA LETTER SMALL A; QQK
+30A2 ; [.2B15.0020.0011.30A2] # KATAKANA LETTER A
+FF71 ; [.2B15.0020.0012.FF71] # HALFWIDTH KATAKANA LETTER A; QQK
+32D0 ; [.2B15.0020.0013.32D0] # CIRCLED KATAKANA A; QQK
+3303 ; [.2B15.0020.001C.3303][.11DD.0020.001C.3303][.2B3D.0020.001F.3303] # SQUARE AARU; QQKN
+3300 ; [.2B15.0020.001C.3300][.2B2E.0020.001C.3300][.0000.0149.001F.3300][.11DD.0020.001F.3300][.2B28.0020.001F.3300] # SQUARE APAATO; QQKN
+3301 ; [.2B15.0020.001C.3301][.2B3D.0020.001C.3301][.2B30.0020.001F.3301][.2B15.0020.001F.3301] # SQUARE ARUHUA; QQKN
+3302 ; [.2B15.0020.001C.3302][.2B44.0020.001C.3302][.2B31.0020.001F.3302][.0000.0149.001F.3302][.2B15.0020.001F.3302] # SQUARE ANPEA; QQKN
+3043 ; [.2B16.0020.000D.3043] # HIRAGANA LETTER SMALL I
+3044 ; [.2B16.0020.000E.3044] # HIRAGANA LETTER I
+30A3 ; [.2B16.0020.000F.30A3] # KATAKANA LETTER SMALL I
+FF68 ; [.2B16.0020.0010.FF68] # HALFWIDTH KATAKANA LETTER SMALL I; QQK
+30A4 ; [.2B16.0020.0011.30A4] # KATAKANA LETTER I
+FF72 ; [.2B16.0020.0012.FF72] # HALFWIDTH KATAKANA LETTER I; QQK
+32D1 ; [.2B16.0020.0013.32D1] # CIRCLED KATAKANA I; QQK
+3304 ; [.2B16.0020.001C.3304][.2B2A.0020.001C.3304][.2B44.0020.001F.3304][.2B1C.0020.001F.3304][.0000.0148.001F.3304] # SQUARE ININGU; QQKN
+3305 ; [.2B16.0020.001C.3305][.2B44.0020.001C.3305][.2B25.0020.001F.3305] # SQUARE INTI; QQKN
+3045 ; [.2B17.0020.000D.3045] # HIRAGANA LETTER SMALL U
+3046 ; [.2B17.0020.000E.3046] # HIRAGANA LETTER U
+30A5 ; [.2B17.0020.000F.30A5] # KATAKANA LETTER SMALL U
+FF69 ; [.2B17.0020.0010.FF69] # HALFWIDTH KATAKANA LETTER SMALL U; QQK
+30A6 ; [.2B17.0020.0011.30A6] # KATAKANA LETTER U
+FF73 ; [.2B17.0020.0012.FF73] # HALFWIDTH KATAKANA LETTER U; QQK
+32D2 ; [.2B17.0020.0013.32D2] # CIRCLED KATAKANA U; QQK
+3094 ; [.2B17.0020.000E.3046][.0000.0148.0002.3099] # HIRAGANA LETTER VU; QQCM
+30F4 ; [.2B17.0020.0011.30A6][.0000.0148.0002.3099] # KATAKANA LETTER VU; QQCM
+3306 ; [.2B17.0020.001C.3306][.2B19.0020.001C.3306][.2B44.0020.001F.3306] # SQUARE UON; QQKN
+3047 ; [.2B18.0020.000D.3047] # HIRAGANA LETTER SMALL E
+3048 ; [.2B18.0020.000E.3048] # HIRAGANA LETTER E
+30A7 ; [.2B18.0020.000F.30A7] # KATAKANA LETTER SMALL E
+FF6A ; [.2B18.0020.0010.FF6A] # HALFWIDTH KATAKANA LETTER SMALL E; QQK
+30A8 ; [.2B18.0020.0011.30A8] # KATAKANA LETTER E
+FF74 ; [.2B18.0020.0012.FF74] # HALFWIDTH KATAKANA LETTER E; QQK
+32D3 ; [.2B18.0020.0013.32D3] # CIRCLED KATAKANA E; QQK
+3308 ; [.2B18.0020.001C.3308][.11DD.0020.001C.3308][.2B1A.0020.001F.3308][.11DD.0020.001F.3308] # SQUARE EEKAA; QQKN
+3307 ; [.2B18.0020.001C.3307][.2B21.0020.001C.3307][.2B1C.0020.001F.3307][.11DD.0020.001F.3307][.2B28.0020.001F.3307][.0000.0148.001F.3307] # SQUARE ESUKUUDO; QQKN
+3049 ; [.2B19.0020.000D.3049] # HIRAGANA LETTER SMALL O
+304A ; [.2B19.0020.000E.304A] # HIRAGANA LETTER O
+30A9 ; [.2B19.0020.000F.30A9] # KATAKANA LETTER SMALL O
+FF6B ; [.2B19.0020.0010.FF6B] # HALFWIDTH KATAKANA LETTER SMALL O; QQK
+30AA ; [.2B19.0020.0011.30AA] # KATAKANA LETTER O
+FF75 ; [.2B19.0020.0012.FF75] # HALFWIDTH KATAKANA LETTER O; QQK
+32D4 ; [.2B19.0020.0013.32D4] # CIRCLED KATAKANA O; QQK
+330A ; [.2B19.0020.001C.330A][.11DD.0020.001C.330A][.2B35.0020.001F.330A] # SQUARE OOMU; QQKN
+3309 ; [.2B19.0020.001C.3309][.2B44.0020.001C.3309][.2B21.0020.001F.3309] # SQUARE ONSU; QQKN
+3095 ; [.2B1A.0020.000D.3095] # HIRAGANA LETTER SMALL KA
+304B ; [.2B1A.0020.000E.304B] # HIRAGANA LETTER KA
+30F5 ; [.2B1A.0020.000F.30F5] # KATAKANA LETTER SMALL KA
+30AB ; [.2B1A.0020.0011.30AB] # KATAKANA LETTER KA
+FF76 ; [.2B1A.0020.0012.FF76] # HALFWIDTH KATAKANA LETTER KA; QQK
+32D5 ; [.2B1A.0020.0013.32D5] # CIRCLED KATAKANA KA; QQK
+304C ; [.2B1A.0020.000E.304B][.0000.0148.0002.3099] # HIRAGANA LETTER GA; QQCM
+30AC ; [.2B1A.0020.0011.30AB][.0000.0148.0002.3099] # KATAKANA LETTER GA; QQCM
+330B ; [.2B1A.0020.001C.330B][.2B16.0020.001C.330B][.2B3C.0020.001F.330B] # SQUARE KAIRI; QQKN
+330C ; [.2B1A.0020.001C.330C][.2B3B.0020.001C.330C][.2B26.0020.001F.330C][.2B28.0020.001F.330C] # SQUARE KARATTO; QQKN
+330D ; [.2B1A.0020.001C.330D][.2B3F.0020.001C.330D][.2B3C.0020.001F.330D][.11DD.0020.001F.330D] # SQUARE KARORII; QQKN
+330E ; [.2B1A.0020.001C.330E][.0000.0148.001C.330E][.2B3F.0020.001F.330E][.2B44.0020.001F.330E] # SQUARE GARON; QQKN
+330F ; [.2B1A.0020.001C.330F][.0000.0148.001C.330F][.2B44.0020.001F.330F][.2B33.0020.001F.330F] # SQUARE GANMA; QQKN
+304D ; [.2B1B.0020.000E.304D] # HIRAGANA LETTER KI
+30AD ; [.2B1B.0020.0011.30AD] # KATAKANA LETTER KI
+FF77 ; [.2B1B.0020.0012.FF77] # HALFWIDTH KATAKANA LETTER KI; QQK
+32D6 ; [.2B1B.0020.0013.32D6] # CIRCLED KATAKANA KI; QQK
+304E ; [.2B1B.0020.000E.304D][.0000.0148.0002.3099] # HIRAGANA LETTER GI; QQCM
+30AE ; [.2B1B.0020.0011.30AD][.0000.0148.0002.3099] # KATAKANA LETTER GI; QQCM
+3310 ; [.2B1B.0020.001C.3310][.0000.0148.001C.3310][.2B1A.0020.001F.3310][.0000.0148.001F.3310] # SQUARE GIGA; QQKN
+3311 ; [.2B1B.0020.001C.3311][.0000.0148.001C.3311][.2B2A.0020.001F.3311][.11DD.0020.001F.3311] # SQUARE GINII; QQKN
+3312 ; [.2B1B.0020.001C.3312][.2B39.0020.001C.3312][.2B3C.0020.001F.3312][.11DD.0020.001F.3312] # SQUARE KYURII; QQKN
+3313 ; [.2B1B.0020.001C.3313][.0000.0148.001C.3313][.2B3D.0020.001F.3313][.2B24.0020.001F.3313][.0000.0148.001F.3313][.11DD.0020.001F.3313] # SQUARE GIRUDAA; QQKN
+3314 ; [.2B1B.0020.001C.3314][.2B3F.0020.001C.3314] # SQUARE KIRO; QQKN
+3315 ; [.2B1B.0020.001C.3315][.2B3F.0020.001C.3315][.2B1C.0020.001F.3315][.0000.0148.001F.3315][.2B3B.0020.001F.3315][.2B35.0020.001F.3315] # SQUARE KIROGURAMU; QQKN
+3316 ; [.2B1B.0020.001C.3316][.2B3F.0020.001C.3316][.2B36.0020.001F.3316][.11DD.0020.001F.3316][.2B28.0020.001F.3316][.2B3D.0020.001F.3316] # SQUARE KIROMEETORU; QQKN
+3317 ; [.2B1B.0020.001C.3317][.2B3F.0020.001C.3317][.2B40.0020.001F.3317][.2B26.0020.001F.3317][.2B28.0020.001F.3317] # SQUARE KIROWATTO; QQKN
+304F ; [.2B1C.0020.000E.304F] # HIRAGANA LETTER KU
+31F0 ; [.2B1C.0020.000F.31F0] # KATAKANA LETTER SMALL KU
+30AF ; [.2B1C.0020.0011.30AF] # KATAKANA LETTER KU
+FF78 ; [.2B1C.0020.0012.FF78] # HALFWIDTH KATAKANA LETTER KU; QQK
+32D7 ; [.2B1C.0020.0013.32D7] # CIRCLED KATAKANA KU; QQK
+3050 ; [.2B1C.0020.000E.304F][.0000.0148.0002.3099] # HIRAGANA LETTER GU; QQCM
+30B0 ; [.2B1C.0020.0011.30AF][.0000.0148.0002.3099] # KATAKANA LETTER GU; QQCM
+3318 ; [.2B1C.0020.001C.3318][.0000.0148.001C.3318][.2B3B.0020.001F.3318][.2B35.0020.001F.3318] # SQUARE GURAMU; QQKN
+3319 ; [.2B1C.0020.001C.3319][.0000.0148.001C.3319][.2B3B.0020.001F.3319][.2B35.0020.001F.3319][.2B28.0020.001F.3319][.2B44.0020.001F.3319] # SQUARE GURAMUTON; QQKN
+331A ; [.2B1C.0020.001C.331A][.2B3D.0020.001C.331A][.2B22.0020.001F.331A][.0000.0148.001F.331A][.2B16.0020.001F.331A][.2B3F.0020.001F.331A] # SQUARE KURUZEIRO; QQKN
+331B ; [.2B1C.0020.001C.331B][.2B3F.0020.001C.331B][.11DD.0020.001F.331B][.2B2C.0020.001F.331B] # SQUARE KUROONE; QQKN
+3096 ; [.2B1D.0020.000D.3096] # HIRAGANA LETTER SMALL KE
+3051 ; [.2B1D.0020.000E.3051] # HIRAGANA LETTER KE
+30F6 ; [.2B1D.0020.000F.30F6] # KATAKANA LETTER SMALL KE
+30B1 ; [.2B1D.0020.0011.30B1] # KATAKANA LETTER KE
+FF79 ; [.2B1D.0020.0012.FF79] # HALFWIDTH KATAKANA LETTER KE; QQK
+32D8 ; [.2B1D.0020.0013.32D8] # CIRCLED KATAKANA KE; QQK
+3052 ; [.2B1D.0020.000E.3051][.0000.0148.0002.3099] # HIRAGANA LETTER GE; QQCM
+30B2 ; [.2B1D.0020.0011.30B1][.0000.0148.0002.3099] # KATAKANA LETTER GE; QQCM
+331C ; [.2B1D.0020.001C.331C][.11DD.0020.001C.331C][.2B21.0020.001F.331C] # SQUARE KEESU; QQKN
+3053 ; [.2B1E.0020.000E.3053] # HIRAGANA LETTER KO
+30B3 ; [.2B1E.0020.0011.30B3] # KATAKANA LETTER KO
+FF7A ; [.2B1E.0020.0012.FF7A] # HALFWIDTH KATAKANA LETTER KO; QQK
+32D9 ; [.2B1E.0020.0013.32D9] # CIRCLED KATAKANA KO; QQK
+3054 ; [.2B1E.0020.000E.3053][.0000.0148.0002.3099] # HIRAGANA LETTER GO; QQCM
+30B4 ; [.2B1E.0020.0011.30B3][.0000.0148.0002.3099] # KATAKANA LETTER GO; QQCM
+331E ; [.2B1E.0020.001C.331E][.11DD.0020.001C.331E][.2B32.0020.001F.331E][.0000.0149.001F.331E] # SQUARE KOOPO; QQKN
+30FF ; [.2B1E.0020.0016.30FF][.2B28.0020.0016.30FF] # KATAKANA DIGRAPH KOTO; QQKN
+331D ; [.2B1E.0020.001C.331D][.2B3D.0020.001C.331D][.2B29.0020.001F.331D] # SQUARE KORUNA; QQKN
+3055 ; [.2B1F.0020.000E.3055] # HIRAGANA LETTER SA
+30B5 ; [.2B1F.0020.0011.30B5] # KATAKANA LETTER SA
+FF7B ; [.2B1F.0020.0012.FF7B] # HALFWIDTH KATAKANA LETTER SA; QQK
+32DA ; [.2B1F.0020.0013.32DA] # CIRCLED KATAKANA SA; QQK
+3056 ; [.2B1F.0020.000E.3055][.0000.0148.0002.3099] # HIRAGANA LETTER ZA; QQCM
+30B6 ; [.2B1F.0020.0011.30B5][.0000.0148.0002.3099] # KATAKANA LETTER ZA; QQCM
+331F ; [.2B1F.0020.001C.331F][.2B16.0020.001C.331F][.2B1C.0020.001F.331F][.2B3D.0020.001F.331F] # SQUARE SAIKURU; QQKN
+3320 ; [.2B1F.0020.001C.3320][.2B44.0020.001C.3320][.2B25.0020.001F.3320][.11DD.0020.001F.3320][.2B35.0020.001F.3320] # SQUARE SANTIIMU; QQKN
+3057 ; [.2B20.0020.000E.3057] # HIRAGANA LETTER SI
+31F1 ; [.2B20.0020.000F.31F1] # KATAKANA LETTER SMALL SI
+30B7 ; [.2B20.0020.0011.30B7] # KATAKANA LETTER SI
+FF7C ; [.2B20.0020.0012.FF7C] # HALFWIDTH KATAKANA LETTER SI; QQK
+32DB ; [.2B20.0020.0013.32DB] # CIRCLED KATAKANA SI; QQK
+3058 ; [.2B20.0020.000E.3057][.0000.0148.0002.3099] # HIRAGANA LETTER ZI; QQCM
+30B8 ; [.2B20.0020.0011.30B7][.0000.0148.0002.3099] # KATAKANA LETTER ZI; QQCM
+3006 ; [.2B20.0020.0004.3006][.2B36.0020.0004.3006] # IDEOGRAPHIC CLOSING MARK; QQKN
+3321 ; [.2B20.0020.001C.3321][.2B3C.0020.001C.3321][.2B44.0020.001F.3321][.2B1C.0020.001F.3321][.0000.0148.001F.3321] # SQUARE SIRINGU; QQKN
+3059 ; [.2B21.0020.000E.3059] # HIRAGANA LETTER SU
+31F2 ; [.2B21.0020.000F.31F2] # KATAKANA LETTER SMALL SU
+30B9 ; [.2B21.0020.0011.30B9] # KATAKANA LETTER SU
+FF7D ; [.2B21.0020.0012.FF7D] # HALFWIDTH KATAKANA LETTER SU; QQK
+32DC ; [.2B21.0020.0013.32DC] # CIRCLED KATAKANA SU; QQK
+305A ; [.2B21.0020.000E.3059][.0000.0148.0002.3099] # HIRAGANA LETTER ZU; QQCM
+30BA ; [.2B21.0020.0011.30B9][.0000.0148.0002.3099] # KATAKANA LETTER ZU; QQCM
+305B ; [.2B22.0020.000E.305B] # HIRAGANA LETTER SE
+30BB ; [.2B22.0020.0011.30BB] # KATAKANA LETTER SE
+FF7E ; [.2B22.0020.0012.FF7E] # HALFWIDTH KATAKANA LETTER SE; QQK
+32DD ; [.2B22.0020.0013.32DD] # CIRCLED KATAKANA SE; QQK
+305C ; [.2B22.0020.000E.305B][.0000.0148.0002.3099] # HIRAGANA LETTER ZE; QQCM
+30BC ; [.2B22.0020.0011.30BB][.0000.0148.0002.3099] # KATAKANA LETTER ZE; QQCM
+3322 ; [.2B22.0020.001C.3322][.2B44.0020.001C.3322][.2B25.0020.001F.3322] # SQUARE SENTI; QQKN
+3323 ; [.2B22.0020.001C.3323][.2B44.0020.001C.3323][.2B28.0020.001F.3323] # SQUARE SENTO; QQKN
+305D ; [.2B23.0020.000E.305D] # HIRAGANA LETTER SO
+30BD ; [.2B23.0020.0011.30BD] # KATAKANA LETTER SO
+FF7F ; [.2B23.0020.0012.FF7F] # HALFWIDTH KATAKANA LETTER SO; QQK
+32DE ; [.2B23.0020.0013.32DE] # CIRCLED KATAKANA SO; QQK
+305E ; [.2B23.0020.000E.305D][.0000.0148.0002.3099] # HIRAGANA LETTER ZO; QQCM
+30BE ; [.2B23.0020.0011.30BD][.0000.0148.0002.3099] # KATAKANA LETTER ZO; QQCM
+305F ; [.2B24.0020.000E.305F] # HIRAGANA LETTER TA
+30BF ; [.2B24.0020.0011.30BF] # KATAKANA LETTER TA
+FF80 ; [.2B24.0020.0012.FF80] # HALFWIDTH KATAKANA LETTER TA; QQK
+32DF ; [.2B24.0020.0013.32DF] # CIRCLED KATAKANA TA; QQK
+3060 ; [.2B24.0020.000E.305F][.0000.0148.0002.3099] # HIRAGANA LETTER DA; QQCM
+30C0 ; [.2B24.0020.0011.30BF][.0000.0148.0002.3099] # KATAKANA LETTER DA; QQCM
+3324 ; [.2B24.0020.001C.3324][.0000.0148.001C.3324][.11DD.0020.001F.3324][.2B21.0020.001F.3324] # SQUARE DAASU; QQKN
+3061 ; [.2B25.0020.000E.3061] # HIRAGANA LETTER TI
+30C1 ; [.2B25.0020.0011.30C1] # KATAKANA LETTER TI
+FF81 ; [.2B25.0020.0012.FF81] # HALFWIDTH KATAKANA LETTER TI; QQK
+32E0 ; [.2B25.0020.0013.32E0] # CIRCLED KATAKANA TI; QQK
+3062 ; [.2B25.0020.000E.3061][.0000.0148.0002.3099] # HIRAGANA LETTER DI; QQCM
+30C2 ; [.2B25.0020.0011.30C1][.0000.0148.0002.3099] # KATAKANA LETTER DI; QQCM
+3063 ; [.2B26.0020.000D.3063] # HIRAGANA LETTER SMALL TU
+3064 ; [.2B26.0020.000E.3064] # HIRAGANA LETTER TU
+30C3 ; [.2B26.0020.000F.30C3] # KATAKANA LETTER SMALL TU
+FF6F ; [.2B26.0020.0010.FF6F] # HALFWIDTH KATAKANA LETTER SMALL TU; QQK
+30C4 ; [.2B26.0020.0011.30C4] # KATAKANA LETTER TU
+FF82 ; [.2B26.0020.0012.FF82] # HALFWIDTH KATAKANA LETTER TU; QQK
+32E1 ; [.2B26.0020.0013.32E1] # CIRCLED KATAKANA TU; QQK
+3065 ; [.2B26.0020.000E.3064][.0000.0148.0002.3099] # HIRAGANA LETTER DU; QQCM
+30C5 ; [.2B26.0020.0011.30C4][.0000.0148.0002.3099] # KATAKANA LETTER DU; QQCM
+3066 ; [.2B27.0020.000E.3066] # HIRAGANA LETTER TE
+30C6 ; [.2B27.0020.0011.30C6] # KATAKANA LETTER TE
+FF83 ; [.2B27.0020.0012.FF83] # HALFWIDTH KATAKANA LETTER TE; QQK
+32E2 ; [.2B27.0020.0013.32E2] # CIRCLED KATAKANA TE; QQK
+3067 ; [.2B27.0020.000E.3066][.0000.0148.0002.3099] # HIRAGANA LETTER DE; QQCM
+30C7 ; [.2B27.0020.0011.30C6][.0000.0148.0002.3099] # KATAKANA LETTER DE; QQCM
+1F213 ; [.2B27.0020.001C.1F213][.0000.0148.001C.1F213] # SQUARED KATAKANA DE; QQKN
+3325 ; [.2B27.0020.001C.3325][.0000.0148.001C.3325][.2B20.0020.001F.3325] # SQUARE DESI; QQKN
+3068 ; [.2B28.0020.000E.3068] # HIRAGANA LETTER TO
+31F3 ; [.2B28.0020.000F.31F3] # KATAKANA LETTER SMALL TO
+30C8 ; [.2B28.0020.0011.30C8] # KATAKANA LETTER TO
+FF84 ; [.2B28.0020.0012.FF84] # HALFWIDTH KATAKANA LETTER TO; QQK
+32E3 ; [.2B28.0020.0013.32E3] # CIRCLED KATAKANA TO; QQK
+3069 ; [.2B28.0020.000E.3068][.0000.0148.0002.3099] # HIRAGANA LETTER DO; QQCM
+30C9 ; [.2B28.0020.0011.30C8][.0000.0148.0002.3099] # KATAKANA LETTER DO; QQCM
+3326 ; [.2B28.0020.001C.3326][.0000.0148.001C.3326][.2B3D.0020.001F.3326] # SQUARE DORU; QQKN
+3327 ; [.2B28.0020.001C.3327][.2B44.0020.001C.3327] # SQUARE TON; QQKN
+306A ; [.2B29.0020.000E.306A] # HIRAGANA LETTER NA
+30CA ; [.2B29.0020.0011.30CA] # KATAKANA LETTER NA
+FF85 ; [.2B29.0020.0012.FF85] # HALFWIDTH KATAKANA LETTER NA; QQK
+32E4 ; [.2B29.0020.0013.32E4] # CIRCLED KATAKANA NA; QQK
+3328 ; [.2B29.0020.001C.3328][.2B2D.0020.001C.3328] # SQUARE NANO; QQKN
+306B ; [.2B2A.0020.000E.306B] # HIRAGANA LETTER NI
+30CB ; [.2B2A.0020.0011.30CB] # KATAKANA LETTER NI
+FF86 ; [.2B2A.0020.0012.FF86] # HALFWIDTH KATAKANA LETTER NI; QQK
+32E5 ; [.2B2A.0020.0013.32E5] # CIRCLED KATAKANA NI; QQK
+306C ; [.2B2B.0020.000E.306C] # HIRAGANA LETTER NU
+31F4 ; [.2B2B.0020.000F.31F4] # KATAKANA LETTER SMALL NU
+30CC ; [.2B2B.0020.0011.30CC] # KATAKANA LETTER NU
+FF87 ; [.2B2B.0020.0012.FF87] # HALFWIDTH KATAKANA LETTER NU; QQK
+32E6 ; [.2B2B.0020.0013.32E6] # CIRCLED KATAKANA NU; QQK
+306D ; [.2B2C.0020.000E.306D] # HIRAGANA LETTER NE
+30CD ; [.2B2C.0020.0011.30CD] # KATAKANA LETTER NE
+FF88 ; [.2B2C.0020.0012.FF88] # HALFWIDTH KATAKANA LETTER NE; QQK
+32E7 ; [.2B2C.0020.0013.32E7] # CIRCLED KATAKANA NE; QQK
+306E ; [.2B2D.0020.000E.306E] # HIRAGANA LETTER NO
+30CE ; [.2B2D.0020.0011.30CE] # KATAKANA LETTER NO
+FF89 ; [.2B2D.0020.0012.FF89] # HALFWIDTH KATAKANA LETTER NO; QQK
+32E8 ; [.2B2D.0020.0013.32E8] # CIRCLED KATAKANA NO; QQK
+3329 ; [.2B2D.0020.001C.3329][.2B26.0020.001C.3329][.2B28.0020.001F.3329] # SQUARE NOTTO; QQKN
+306F ; [.2B2E.0020.000E.306F] # HIRAGANA LETTER HA
+31F5 ; [.2B2E.0020.000F.31F5] # KATAKANA LETTER SMALL HA
+30CF ; [.2B2E.0020.0011.30CF] # KATAKANA LETTER HA
+FF8A ; [.2B2E.0020.0012.FF8A] # HALFWIDTH KATAKANA LETTER HA; QQK
+32E9 ; [.2B2E.0020.0013.32E9] # CIRCLED KATAKANA HA; QQK
+3070 ; [.2B2E.0020.000E.306F][.0000.0148.0002.3099] # HIRAGANA LETTER BA; QQCM
+30D0 ; [.2B2E.0020.0011.30CF][.0000.0148.0002.3099] # KATAKANA LETTER BA; QQCM
+3071 ; [.2B2E.0020.000E.306F][.0000.0149.0002.309A] # HIRAGANA LETTER PA; QQCM
+30D1 ; [.2B2E.0020.0011.30CF][.0000.0149.0002.309A] # KATAKANA LETTER PA; QQCM
+332B ; [.2B2E.0020.001C.332B][.0000.0149.001C.332B][.11DD.0020.001F.332B][.2B22.0020.001F.332B][.2B44.0020.001F.332B][.2B28.0020.001F.332B] # SQUARE PAASENTO; QQKN
+332C ; [.2B2E.0020.001C.332C][.0000.0149.001C.332C][.11DD.0020.001F.332C][.2B26.0020.001F.332C] # SQUARE PAATU; QQKN
+332D ; [.2B2E.0020.001C.332D][.0000.0148.001C.332D][.11DD.0020.001F.332D][.2B3E.0020.001F.332D][.2B3D.0020.001F.332D] # SQUARE BAARERU; QQKN
+332A ; [.2B2E.0020.001C.332A][.2B16.0020.001C.332A][.2B26.0020.001F.332A] # SQUARE HAITU; QQKN
+3072 ; [.2B2F.0020.000E.3072] # HIRAGANA LETTER HI
+31F6 ; [.2B2F.0020.000F.31F6] # KATAKANA LETTER SMALL HI
+30D2 ; [.2B2F.0020.0011.30D2] # KATAKANA LETTER HI
+FF8B ; [.2B2F.0020.0012.FF8B] # HALFWIDTH KATAKANA LETTER HI; QQK
+32EA ; [.2B2F.0020.0013.32EA] # CIRCLED KATAKANA HI; QQK
+3073 ; [.2B2F.0020.000E.3072][.0000.0148.0002.3099] # HIRAGANA LETTER BI; QQCM
+30D3 ; [.2B2F.0020.0011.30D2][.0000.0148.0002.3099] # KATAKANA LETTER BI; QQCM
+3074 ; [.2B2F.0020.000E.3072][.0000.0149.0002.309A] # HIRAGANA LETTER PI; QQCM
+30D4 ; [.2B2F.0020.0011.30D2][.0000.0149.0002.309A] # KATAKANA LETTER PI; QQCM
+332E ; [.2B2F.0020.001C.332E][.0000.0149.001C.332E][.2B15.0020.001F.332E][.2B21.0020.001F.332E][.2B28.0020.001F.332E][.2B3D.0020.001F.332E] # SQUARE PIASUTORU; QQKN
+332F ; [.2B2F.0020.001C.332F][.0000.0149.001C.332F][.2B1C.0020.001F.332F][.2B3D.0020.001F.332F] # SQUARE PIKURU; QQKN
+3330 ; [.2B2F.0020.001C.3330][.0000.0149.001C.3330][.2B1E.0020.001F.3330] # SQUARE PIKO; QQKN
+3331 ; [.2B2F.0020.001C.3331][.0000.0148.001C.3331][.2B3D.0020.001F.3331] # SQUARE BIRU; QQKN
+3075 ; [.2B30.0020.000E.3075] # HIRAGANA LETTER HU
+31F7 ; [.2B30.0020.000F.31F7] # KATAKANA LETTER SMALL HU
+30D5 ; [.2B30.0020.0011.30D5] # KATAKANA LETTER HU
+FF8C ; [.2B30.0020.0012.FF8C] # HALFWIDTH KATAKANA LETTER HU; QQK
+32EB ; [.2B30.0020.0013.32EB] # CIRCLED KATAKANA HU; QQK
+3076 ; [.2B30.0020.000E.3075][.0000.0148.0002.3099] # HIRAGANA LETTER BU; QQCM
+30D6 ; [.2B30.0020.0011.30D5][.0000.0148.0002.3099] # KATAKANA LETTER BU; QQCM
+3077 ; [.2B30.0020.000E.3075][.0000.0149.0002.309A] # HIRAGANA LETTER PU; QQCM
+30D7 ; [.2B30.0020.0011.30D5][.0000.0149.0002.309A] # KATAKANA LETTER PU; QQCM
+3332 ; [.2B30.0020.001C.3332][.2B15.0020.001C.3332][.2B3B.0020.001F.3332][.2B26.0020.001F.3332][.2B28.0020.001F.3332][.0000.0148.001F.3332] # SQUARE HUARADDO; QQKN
+3333 ; [.2B30.0020.001C.3333][.2B16.0020.001C.3333][.11DD.0020.001F.3333][.2B28.0020.001F.3333] # SQUARE HUIITO; QQKN
+3334 ; [.2B30.0020.001C.3334][.0000.0148.001C.3334][.2B26.0020.001F.3334][.2B20.0020.001F.3334][.2B18.0020.001F.3334][.2B3D.0020.001F.3334] # SQUARE BUSSYERU; QQKN
+3335 ; [.2B30.0020.001C.3335][.2B3B.0020.001C.3335][.2B44.0020.001F.3335] # SQUARE HURAN; QQKN
+3078 ; [.2B31.0020.000E.3078] # HIRAGANA LETTER HE
+31F8 ; [.2B31.0020.000F.31F8] # KATAKANA LETTER SMALL HE
+30D8 ; [.2B31.0020.0011.30D8] # KATAKANA LETTER HE
+FF8D ; [.2B31.0020.0012.FF8D] # HALFWIDTH KATAKANA LETTER HE; QQK
+32EC ; [.2B31.0020.0013.32EC] # CIRCLED KATAKANA HE; QQK
+3079 ; [.2B31.0020.000E.3078][.0000.0148.0002.3099] # HIRAGANA LETTER BE; QQCM
+30D9 ; [.2B31.0020.0011.30D8][.0000.0148.0002.3099] # KATAKANA LETTER BE; QQCM
+307A ; [.2B31.0020.000E.3078][.0000.0149.0002.309A] # HIRAGANA LETTER PE; QQCM
+30DA ; [.2B31.0020.0011.30D8][.0000.0149.0002.309A] # KATAKANA LETTER PE; QQCM
+333B ; [.2B31.0020.001C.333B][.0000.0149.001C.333B][.11DD.0020.001F.333B][.2B20.0020.001F.333B][.0000.0148.001F.333B] # SQUARE PEEZI; QQKN
+333C ; [.2B31.0020.001C.333C][.0000.0148.001C.333C][.11DD.0020.001F.333C][.2B24.0020.001F.333C] # SQUARE BEETA; QQKN
+3336 ; [.2B31.0020.001C.3336][.2B1C.0020.001C.3336][.2B24.0020.001F.3336][.11DD.0020.001F.3336][.2B3D.0020.001F.3336] # SQUARE HEKUTAARU; QQKN
+3337 ; [.2B31.0020.001C.3337][.0000.0149.001C.3337][.2B23.0020.001F.3337] # SQUARE PESO; QQKN
+3338 ; [.2B31.0020.001C.3338][.0000.0149.001C.3338][.2B2A.0020.001F.3338][.2B2F.0020.001F.3338] # SQUARE PENIHI; QQKN
+3339 ; [.2B31.0020.001C.3339][.2B3D.0020.001C.3339][.2B26.0020.001F.3339] # SQUARE HERUTU; QQKN
+333A ; [.2B31.0020.001C.333A][.0000.0149.001C.333A][.2B44.0020.001F.333A][.2B21.0020.001F.333A] # SQUARE PENSU; QQKN
+307B ; [.2B32.0020.000E.307B] # HIRAGANA LETTER HO
+31F9 ; [.2B32.0020.000F.31F9] # KATAKANA LETTER SMALL HO
+30DB ; [.2B32.0020.0011.30DB] # KATAKANA LETTER HO
+FF8E ; [.2B32.0020.0012.FF8E] # HALFWIDTH KATAKANA LETTER HO; QQK
+32ED ; [.2B32.0020.0013.32ED] # CIRCLED KATAKANA HO; QQK
+307C ; [.2B32.0020.000E.307B][.0000.0148.0002.3099] # HIRAGANA LETTER BO; QQCM
+30DC ; [.2B32.0020.0011.30DB][.0000.0148.0002.3099] # KATAKANA LETTER BO; QQCM
+307D ; [.2B32.0020.000E.307B][.0000.0149.0002.309A] # HIRAGANA LETTER PO; QQCM
+30DD ; [.2B32.0020.0011.30DB][.0000.0149.0002.309A] # KATAKANA LETTER PO; QQCM
+3341 ; [.2B32.0020.001C.3341][.11DD.0020.001C.3341][.2B3D.0020.001F.3341] # SQUARE HOORU; QQKN
+3342 ; [.2B32.0020.001C.3342][.11DD.0020.001C.3342][.2B44.0020.001F.3342] # SQUARE HOON; QQKN
+333D ; [.2B32.0020.001C.333D][.0000.0149.001C.333D][.2B16.0020.001F.333D][.2B44.0020.001F.333D][.2B28.0020.001F.333D] # SQUARE POINTO; QQKN
+1F200 ; [.2B32.0020.001C.1F200][.2B1A.0020.001C.1F200] # SQUARE HIRAGANA HOKA; QQKN
+333E ; [.2B32.0020.001C.333E][.0000.0148.001C.333E][.2B3D.0020.001F.333E][.2B28.0020.001F.333E] # SQUARE BORUTO; QQKN
+333F ; [.2B32.0020.001C.333F][.2B44.0020.001C.333F] # SQUARE HON; QQKN
+3340 ; [.2B32.0020.001C.3340][.0000.0149.001C.3340][.2B44.0020.001F.3340][.2B28.0020.001F.3340][.0000.0148.001F.3340] # SQUARE PONDO; QQKN
+307E ; [.2B33.0020.000E.307E] # HIRAGANA LETTER MA
+30DE ; [.2B33.0020.0011.30DE] # KATAKANA LETTER MA
+FF8F ; [.2B33.0020.0012.FF8F] # HALFWIDTH KATAKANA LETTER MA; QQK
+32EE ; [.2B33.0020.0013.32EE] # CIRCLED KATAKANA MA; QQK
+3343 ; [.2B33.0020.001C.3343][.2B16.0020.001C.3343][.2B1C.0020.001F.3343][.2B3F.0020.001F.3343] # SQUARE MAIKURO; QQKN
+3344 ; [.2B33.0020.001C.3344][.2B16.0020.001C.3344][.2B3D.0020.001F.3344] # SQUARE MAIRU; QQKN
+303C ; [.2B33.0020.0004.303C][.2B21.0020.0004.303C] # MASU MARK; QQKN
+3345 ; [.2B33.0020.001C.3345][.2B26.0020.001C.3345][.2B2E.0020.001F.3345] # SQUARE MAHHA; QQKN
+3346 ; [.2B33.0020.001C.3346][.2B3D.0020.001C.3346][.2B1C.0020.001F.3346] # SQUARE MARUKU; QQKN
+3347 ; [.2B33.0020.001C.3347][.2B44.0020.001C.3347][.2B20.0020.001F.3347][.2B3A.0020.001F.3347][.2B44.0020.001F.3347] # SQUARE MANSYON; QQKN
+307F ; [.2B34.0020.000E.307F] # HIRAGANA LETTER MI
+30DF ; [.2B34.0020.0011.30DF] # KATAKANA LETTER MI
+FF90 ; [.2B34.0020.0012.FF90] # HALFWIDTH KATAKANA LETTER MI; QQK
+32EF ; [.2B34.0020.0013.32EF] # CIRCLED KATAKANA MI; QQK
+3348 ; [.2B34.0020.001C.3348][.2B1C.0020.001C.3348][.2B3F.0020.001F.3348][.2B44.0020.001F.3348] # SQUARE MIKURON; QQKN
+3349 ; [.2B34.0020.001C.3349][.2B3C.0020.001C.3349] # SQUARE MIRI; QQKN
+334A ; [.2B34.0020.001C.334A][.2B3C.0020.001C.334A][.2B2E.0020.001F.334A][.0000.0148.001F.334A][.11DD.0020.001F.334A][.2B3D.0020.001F.334A] # SQUARE MIRIBAARU; QQKN
+3080 ; [.2B35.0020.000E.3080] # HIRAGANA LETTER MU
+31FA ; [.2B35.0020.000F.31FA] # KATAKANA LETTER SMALL MU
+30E0 ; [.2B35.0020.0011.30E0] # KATAKANA LETTER MU
+FF91 ; [.2B35.0020.0012.FF91] # HALFWIDTH KATAKANA LETTER MU; QQK
+32F0 ; [.2B35.0020.0013.32F0] # CIRCLED KATAKANA MU; QQK
+3081 ; [.2B36.0020.000E.3081] # HIRAGANA LETTER ME
+30E1 ; [.2B36.0020.0011.30E1] # KATAKANA LETTER ME
+FF92 ; [.2B36.0020.0012.FF92] # HALFWIDTH KATAKANA LETTER ME; QQK
+32F1 ; [.2B36.0020.0013.32F1] # CIRCLED KATAKANA ME; QQK
+334D ; [.2B36.0020.001C.334D][.11DD.0020.001C.334D][.2B28.0020.001F.334D][.2B3D.0020.001F.334D] # SQUARE MEETORU; QQKN
+334B ; [.2B36.0020.001C.334B][.2B1A.0020.001C.334B][.0000.0148.001F.334B] # SQUARE MEGA; QQKN
+334C ; [.2B36.0020.001C.334C][.2B1A.0020.001C.334C][.0000.0148.001F.334C][.2B28.0020.001F.334C][.2B44.0020.001F.334C] # SQUARE MEGATON; QQKN
+3082 ; [.2B37.0020.000E.3082] # HIRAGANA LETTER MO
+30E2 ; [.2B37.0020.0011.30E2] # KATAKANA LETTER MO
+FF93 ; [.2B37.0020.0012.FF93] # HALFWIDTH KATAKANA LETTER MO; QQK
+32F2 ; [.2B37.0020.0013.32F2] # CIRCLED KATAKANA MO; QQK
+3083 ; [.2B38.0020.000D.3083] # HIRAGANA LETTER SMALL YA
+3084 ; [.2B38.0020.000E.3084] # HIRAGANA LETTER YA
+30E3 ; [.2B38.0020.000F.30E3] # KATAKANA LETTER SMALL YA
+FF6C ; [.2B38.0020.0010.FF6C] # HALFWIDTH KATAKANA LETTER SMALL YA; QQK
+30E4 ; [.2B38.0020.0011.30E4] # KATAKANA LETTER YA
+FF94 ; [.2B38.0020.0012.FF94] # HALFWIDTH KATAKANA LETTER YA; QQK
+32F3 ; [.2B38.0020.0013.32F3] # CIRCLED KATAKANA YA; QQK
+334E ; [.2B38.0020.001C.334E][.11DD.0020.001C.334E][.2B28.0020.001F.334E][.0000.0148.001F.334E] # SQUARE YAADO; QQKN
+334F ; [.2B38.0020.001C.334F][.11DD.0020.001C.334F][.2B3D.0020.001F.334F] # SQUARE YAARU; QQKN
+3085 ; [.2B39.0020.000D.3085] # HIRAGANA LETTER SMALL YU
+3086 ; [.2B39.0020.000E.3086] # HIRAGANA LETTER YU
+30E5 ; [.2B39.0020.000F.30E5] # KATAKANA LETTER SMALL YU
+FF6D ; [.2B39.0020.0010.FF6D] # HALFWIDTH KATAKANA LETTER SMALL YU; QQK
+30E6 ; [.2B39.0020.0011.30E6] # KATAKANA LETTER YU
+FF95 ; [.2B39.0020.0012.FF95] # HALFWIDTH KATAKANA LETTER YU; QQK
+32F4 ; [.2B39.0020.0013.32F4] # CIRCLED KATAKANA YU; QQK
+3350 ; [.2B39.0020.001C.3350][.2B15.0020.001C.3350][.2B44.0020.001F.3350] # SQUARE YUAN; QQKN
+3087 ; [.2B3A.0020.000D.3087] # HIRAGANA LETTER SMALL YO
+3088 ; [.2B3A.0020.000E.3088] # HIRAGANA LETTER YO
+30E7 ; [.2B3A.0020.000F.30E7] # KATAKANA LETTER SMALL YO
+FF6E ; [.2B3A.0020.0010.FF6E] # HALFWIDTH KATAKANA LETTER SMALL YO; QQK
+30E8 ; [.2B3A.0020.0011.30E8] # KATAKANA LETTER YO
+FF96 ; [.2B3A.0020.0012.FF96] # HALFWIDTH KATAKANA LETTER YO; QQK
+32F5 ; [.2B3A.0020.0013.32F5] # CIRCLED KATAKANA YO; QQK
+309F ; [.2B3A.0020.0016.309F][.2B3C.0020.0016.309F] # HIRAGANA DIGRAPH YORI; QQKN
+3089 ; [.2B3B.0020.000E.3089] # HIRAGANA LETTER RA
+31FB ; [.2B3B.0020.000F.31FB] # KATAKANA LETTER SMALL RA
+30E9 ; [.2B3B.0020.0011.30E9] # KATAKANA LETTER RA
+FF97 ; [.2B3B.0020.0012.FF97] # HALFWIDTH KATAKANA LETTER RA; QQK
+32F6 ; [.2B3B.0020.0013.32F6] # CIRCLED KATAKANA RA; QQK
+308A ; [.2B3C.0020.000E.308A] # HIRAGANA LETTER RI
+31FC ; [.2B3C.0020.000F.31FC] # KATAKANA LETTER SMALL RI
+30EA ; [.2B3C.0020.0011.30EA] # KATAKANA LETTER RI
+FF98 ; [.2B3C.0020.0012.FF98] # HALFWIDTH KATAKANA LETTER RI; QQK
+32F7 ; [.2B3C.0020.0013.32F7] # CIRCLED KATAKANA RI; QQK
+3351 ; [.2B3C.0020.001C.3351][.2B26.0020.001C.3351][.2B28.0020.001F.3351][.2B3D.0020.001F.3351] # SQUARE RITTORU; QQKN
+3352 ; [.2B3C.0020.001C.3352][.2B3B.0020.001C.3352] # SQUARE RIRA; QQKN
+308B ; [.2B3D.0020.000E.308B] # HIRAGANA LETTER RU
+31FD ; [.2B3D.0020.000F.31FD] # KATAKANA LETTER SMALL RU
+30EB ; [.2B3D.0020.0011.30EB] # KATAKANA LETTER RU
+FF99 ; [.2B3D.0020.0012.FF99] # HALFWIDTH KATAKANA LETTER RU; QQK
+32F8 ; [.2B3D.0020.0013.32F8] # CIRCLED KATAKANA RU; QQK
+3354 ; [.2B3D.0020.001C.3354][.11DD.0020.001C.3354][.2B30.0020.001F.3354][.0000.0148.001F.3354][.2B3D.0020.001F.3354] # SQUARE RUUBURU; QQKN
+3353 ; [.2B3D.0020.001C.3353][.2B2F.0020.001C.3353][.0000.0149.001F.3353][.11DD.0020.001F.3353] # SQUARE RUPII; QQKN
+308C ; [.2B3E.0020.000E.308C] # HIRAGANA LETTER RE
+31FE ; [.2B3E.0020.000F.31FE] # KATAKANA LETTER SMALL RE
+30EC ; [.2B3E.0020.0011.30EC] # KATAKANA LETTER RE
+FF9A ; [.2B3E.0020.0012.FF9A] # HALFWIDTH KATAKANA LETTER RE; QQK
+32F9 ; [.2B3E.0020.0013.32F9] # CIRCLED KATAKANA RE; QQK
+3355 ; [.2B3E.0020.001C.3355][.2B35.0020.001C.3355] # SQUARE REMU; QQKN
+3356 ; [.2B3E.0020.001C.3356][.2B44.0020.001C.3356][.2B28.0020.001F.3356][.2B1D.0020.001F.3356][.0000.0148.001F.3356][.2B44.0020.001F.3356] # SQUARE RENTOGEN; QQKN
+308D ; [.2B3F.0020.000E.308D] # HIRAGANA LETTER RO
+31FF ; [.2B3F.0020.000F.31FF] # KATAKANA LETTER SMALL RO
+30ED ; [.2B3F.0020.0011.30ED] # KATAKANA LETTER RO
+FF9B ; [.2B3F.0020.0012.FF9B] # HALFWIDTH KATAKANA LETTER RO; QQK
+32FA ; [.2B3F.0020.0013.32FA] # CIRCLED KATAKANA RO; QQK
+308E ; [.2B40.0020.000D.308E] # HIRAGANA LETTER SMALL WA
+308F ; [.2B40.0020.000E.308F] # HIRAGANA LETTER WA
+30EE ; [.2B40.0020.000F.30EE] # KATAKANA LETTER SMALL WA
+30EF ; [.2B40.0020.0011.30EF] # KATAKANA LETTER WA
+FF9C ; [.2B40.0020.0012.FF9C] # HALFWIDTH KATAKANA LETTER WA; QQK
+32FB ; [.2B40.0020.0013.32FB] # CIRCLED KATAKANA WA; QQK
+30F7 ; [.2B40.0020.0011.30EF][.0000.0148.0002.3099] # KATAKANA LETTER VA; QQCM
+3357 ; [.2B40.0020.001C.3357][.2B26.0020.001C.3357][.2B28.0020.001F.3357] # SQUARE WATTO; QQKN
+3090 ; [.2B41.0020.000E.3090] # HIRAGANA LETTER WI
+30F0 ; [.2B41.0020.0011.30F0] # KATAKANA LETTER WI
+32FC ; [.2B41.0020.0013.32FC] # CIRCLED KATAKANA WI; QQK
+30F8 ; [.2B41.0020.0011.30F0][.0000.0148.0002.3099] # KATAKANA LETTER VI; QQCM
+3091 ; [.2B42.0020.000E.3091] # HIRAGANA LETTER WE
+30F1 ; [.2B42.0020.0011.30F1] # KATAKANA LETTER WE
+32FD ; [.2B42.0020.0013.32FD] # CIRCLED KATAKANA WE; QQK
+30F9 ; [.2B42.0020.0011.30F1][.0000.0148.0002.3099] # KATAKANA LETTER VE; QQCM
+3092 ; [.2B43.0020.000E.3092] # HIRAGANA LETTER WO
+30F2 ; [.2B43.0020.0011.30F2] # KATAKANA LETTER WO
+FF66 ; [.2B43.0020.0012.FF66] # HALFWIDTH KATAKANA LETTER WO; QQK
+32FE ; [.2B43.0020.0013.32FE] # CIRCLED KATAKANA WO; QQK
+30FA ; [.2B43.0020.0011.30F2][.0000.0148.0002.3099] # KATAKANA LETTER VO; QQCM
+3093 ; [.2B44.0020.000E.3093] # HIRAGANA LETTER N
+30F3 ; [.2B44.0020.0011.30F3] # KATAKANA LETTER N
+FF9D ; [.2B44.0020.0012.FF9D] # HALFWIDTH KATAKANA LETTER N; QQK
+3105 ; [.2B45.0020.0002.3105] # BOPOMOFO LETTER B
+31A0 ; [.2B45.0020.0004.31A0][.0000.015A.0004.31A0] # BOPOMOFO LETTER BU; QQKN
+3106 ; [.2B46.0020.0002.3106] # BOPOMOFO LETTER P
+31B4 ; [.2B46.0020.0019.31B4] # BOPOMOFO FINAL LETTER P; QQK
+3107 ; [.2B47.0020.0002.3107] # BOPOMOFO LETTER M
+3108 ; [.2B48.0020.0002.3108] # BOPOMOFO LETTER F
+312A ; [.2B49.0020.0002.312A] # BOPOMOFO LETTER V
+3109 ; [.2B4A.0020.0002.3109] # BOPOMOFO LETTER D
+310A ; [.2B4B.0020.0002.310A] # BOPOMOFO LETTER T
+31B5 ; [.2B4B.0020.0019.31B5] # BOPOMOFO FINAL LETTER T; QQK
+310B ; [.2B4C.0020.0002.310B] # BOPOMOFO LETTER N
+310C ; [.2B4D.0020.0002.310C] # BOPOMOFO LETTER L
+310D ; [.2B4E.0020.0002.310D] # BOPOMOFO LETTER G
+31A3 ; [.2B4E.0020.0004.31A3][.0000.015A.0004.31A3] # BOPOMOFO LETTER GU; QQKN
+310E ; [.2B4F.0020.0002.310E] # BOPOMOFO LETTER K
+31B6 ; [.2B4F.0020.0019.31B6] # BOPOMOFO FINAL LETTER K; QQK
+312B ; [.2B50.0020.0002.312B] # BOPOMOFO LETTER NG
+31AD ; [.2B51.0020.0002.31AD] # BOPOMOFO LETTER NGG
+310F ; [.2B52.0020.0002.310F] # BOPOMOFO LETTER H
+31B7 ; [.2B52.0020.0019.31B7] # BOPOMOFO FINAL LETTER H; QQK
+3110 ; [.2B53.0020.0002.3110] # BOPOMOFO LETTER J
+31A2 ; [.2B53.0020.0004.31A2][.0000.015A.0004.31A2] # BOPOMOFO LETTER JI; QQKN
+3111 ; [.2B54.0020.0002.3111] # BOPOMOFO LETTER Q
+3112 ; [.2B55.0020.0002.3112] # BOPOMOFO LETTER X
+312C ; [.2B56.0020.0002.312C] # BOPOMOFO LETTER GN
+3113 ; [.2B57.0020.0002.3113] # BOPOMOFO LETTER ZH
+3114 ; [.2B58.0020.0002.3114] # BOPOMOFO LETTER CH
+3115 ; [.2B59.0020.0002.3115] # BOPOMOFO LETTER SH
+3116 ; [.2B5A.0020.0002.3116] # BOPOMOFO LETTER R
+3117 ; [.2B5B.0020.0002.3117] # BOPOMOFO LETTER Z
+31A1 ; [.2B5B.0020.0004.31A1][.0000.015A.0004.31A1] # BOPOMOFO LETTER ZI; QQKN
+3118 ; [.2B5C.0020.0002.3118] # BOPOMOFO LETTER C
+3119 ; [.2B5D.0020.0002.3119] # BOPOMOFO LETTER S
+311A ; [.2B5E.0020.0002.311A] # BOPOMOFO LETTER A
+31A9 ; [.2B5E.0020.0004.31A9][.0000.015A.0004.31A9] # BOPOMOFO LETTER ANN; QQKN
+311B ; [.2B5F.0020.0002.311B] # BOPOMOFO LETTER O
+31A7 ; [.2B5F.0020.0004.31A7][.0000.015A.0004.31A7] # BOPOMOFO LETTER ONN; QQKN
+31A6 ; [.2B60.0020.0002.31A6] # BOPOMOFO LETTER OO
+311C ; [.2B61.0020.0002.311C] # BOPOMOFO LETTER E
+311D ; [.2B62.0020.0002.311D] # BOPOMOFO LETTER EH
+31A4 ; [.2B63.0020.0002.31A4] # BOPOMOFO LETTER EE
+31A5 ; [.2B63.0020.0004.31A5][.0000.015A.0004.31A5] # BOPOMOFO LETTER ENN; QQKN
+311E ; [.2B64.0020.0002.311E] # BOPOMOFO LETTER AI
+31AE ; [.2B64.0020.0004.31AE][.0000.015A.0004.31AE] # BOPOMOFO LETTER AINN; QQKN
+311F ; [.2B65.0020.0002.311F] # BOPOMOFO LETTER EI
+3120 ; [.2B66.0020.0002.3120] # BOPOMOFO LETTER AU
+31AF ; [.2B66.0020.0004.31AF][.0000.015A.0004.31AF] # BOPOMOFO LETTER AUNN; QQKN
+3121 ; [.2B67.0020.0002.3121] # BOPOMOFO LETTER OU
+3122 ; [.2B68.0020.0002.3122] # BOPOMOFO LETTER AN
+3123 ; [.2B69.0020.0002.3123] # BOPOMOFO LETTER EN
+3124 ; [.2B6A.0020.0002.3124] # BOPOMOFO LETTER ANG
+31B2 ; [.2B6B.0020.0002.31B2] # BOPOMOFO LETTER ONG
+3125 ; [.2B6C.0020.0002.3125] # BOPOMOFO LETTER ENG
+31B0 ; [.2B6D.0020.0002.31B0] # BOPOMOFO LETTER AM
+31B1 ; [.2B6E.0020.0002.31B1] # BOPOMOFO LETTER OM
+31AC ; [.2B6F.0020.0002.31AC] # BOPOMOFO LETTER IM
+3126 ; [.2B70.0020.0002.3126] # BOPOMOFO LETTER ER
+3127 ; [.2B71.0020.0002.3127] # BOPOMOFO LETTER I
+31AA ; [.2B71.0020.0004.31AA][.0000.015A.0004.31AA] # BOPOMOFO LETTER INN; QQKN
+31B3 ; [.2B71.0020.0016.31B3][.0000.015A.0016.31B3] # BOPOMOFO LETTER INNN; QQKN
+3128 ; [.2B72.0020.0002.3128] # BOPOMOFO LETTER U
+31AB ; [.2B72.0020.0004.31AB][.0000.015A.0004.31AB] # BOPOMOFO LETTER UNN; QQKN
+31A8 ; [.2B72.0020.0004.31A8][.0000.015C.0004.31A8] # BOPOMOFO LETTER IR; QQKN
+3129 ; [.2B73.0020.0002.3129] # BOPOMOFO LETTER IU
+312D ; [.2B74.0020.0002.312D] # BOPOMOFO LETTER IH
+A000 ; [.2B75.0020.0002.A000] # YI SYLLABLE IT
+A001 ; [.2B76.0020.0002.A001] # YI SYLLABLE IX
+A002 ; [.2B77.0020.0002.A002] # YI SYLLABLE I
+A003 ; [.2B78.0020.0002.A003] # YI SYLLABLE IP
+A004 ; [.2B79.0020.0002.A004] # YI SYLLABLE IET
+A005 ; [.2B7A.0020.0002.A005] # YI SYLLABLE IEX
+A006 ; [.2B7B.0020.0002.A006] # YI SYLLABLE IE
+A007 ; [.2B7C.0020.0002.A007] # YI SYLLABLE IEP
+A008 ; [.2B7D.0020.0002.A008] # YI SYLLABLE AT
+A009 ; [.2B7E.0020.0002.A009] # YI SYLLABLE AX
+A00A ; [.2B7F.0020.0002.A00A] # YI SYLLABLE A
+A00B ; [.2B80.0020.0002.A00B] # YI SYLLABLE AP
+A00C ; [.2B81.0020.0002.A00C] # YI SYLLABLE UOX
+A00D ; [.2B82.0020.0002.A00D] # YI SYLLABLE UO
+A00E ; [.2B83.0020.0002.A00E] # YI SYLLABLE UOP
+A00F ; [.2B84.0020.0002.A00F] # YI SYLLABLE OT
+A010 ; [.2B85.0020.0002.A010] # YI SYLLABLE OX
+A011 ; [.2B86.0020.0002.A011] # YI SYLLABLE O
+A012 ; [.2B87.0020.0002.A012] # YI SYLLABLE OP
+A013 ; [.2B88.0020.0002.A013] # YI SYLLABLE EX
+A014 ; [.2B89.0020.0002.A014] # YI SYLLABLE E
+A015 ; [.2B8A.0020.0002.A015] # YI SYLLABLE WU
+A016 ; [.2B8B.0020.0002.A016] # YI SYLLABLE BIT
+A017 ; [.2B8C.0020.0002.A017] # YI SYLLABLE BIX
+A018 ; [.2B8D.0020.0002.A018] # YI SYLLABLE BI
+A019 ; [.2B8E.0020.0002.A019] # YI SYLLABLE BIP
+A01A ; [.2B8F.0020.0002.A01A] # YI SYLLABLE BIET
+A01B ; [.2B90.0020.0002.A01B] # YI SYLLABLE BIEX
+A01C ; [.2B91.0020.0002.A01C] # YI SYLLABLE BIE
+A01D ; [.2B92.0020.0002.A01D] # YI SYLLABLE BIEP
+A01E ; [.2B93.0020.0002.A01E] # YI SYLLABLE BAT
+A01F ; [.2B94.0020.0002.A01F] # YI SYLLABLE BAX
+A020 ; [.2B95.0020.0002.A020] # YI SYLLABLE BA
+A021 ; [.2B96.0020.0002.A021] # YI SYLLABLE BAP
+A022 ; [.2B97.0020.0002.A022] # YI SYLLABLE BUOX
+A023 ; [.2B98.0020.0002.A023] # YI SYLLABLE BUO
+A024 ; [.2B99.0020.0002.A024] # YI SYLLABLE BUOP
+A025 ; [.2B9A.0020.0002.A025] # YI SYLLABLE BOT
+A026 ; [.2B9B.0020.0002.A026] # YI SYLLABLE BOX
+A027 ; [.2B9C.0020.0002.A027] # YI SYLLABLE BO
+A028 ; [.2B9D.0020.0002.A028] # YI SYLLABLE BOP
+A029 ; [.2B9E.0020.0002.A029] # YI SYLLABLE BEX
+A02A ; [.2B9F.0020.0002.A02A] # YI SYLLABLE BE
+A02B ; [.2BA0.0020.0002.A02B] # YI SYLLABLE BEP
+A02C ; [.2BA1.0020.0002.A02C] # YI SYLLABLE BUT
+A02D ; [.2BA2.0020.0002.A02D] # YI SYLLABLE BUX
+A02E ; [.2BA3.0020.0002.A02E] # YI SYLLABLE BU
+A02F ; [.2BA4.0020.0002.A02F] # YI SYLLABLE BUP
+A030 ; [.2BA5.0020.0002.A030] # YI SYLLABLE BURX
+A031 ; [.2BA6.0020.0002.A031] # YI SYLLABLE BUR
+A032 ; [.2BA7.0020.0002.A032] # YI SYLLABLE BYT
+A033 ; [.2BA8.0020.0002.A033] # YI SYLLABLE BYX
+A034 ; [.2BA9.0020.0002.A034] # YI SYLLABLE BY
+A035 ; [.2BAA.0020.0002.A035] # YI SYLLABLE BYP
+A036 ; [.2BAB.0020.0002.A036] # YI SYLLABLE BYRX
+A037 ; [.2BAC.0020.0002.A037] # YI SYLLABLE BYR
+A038 ; [.2BAD.0020.0002.A038] # YI SYLLABLE PIT
+A039 ; [.2BAE.0020.0002.A039] # YI SYLLABLE PIX
+A03A ; [.2BAF.0020.0002.A03A] # YI SYLLABLE PI
+A03B ; [.2BB0.0020.0002.A03B] # YI SYLLABLE PIP
+A03C ; [.2BB1.0020.0002.A03C] # YI SYLLABLE PIEX
+A03D ; [.2BB2.0020.0002.A03D] # YI SYLLABLE PIE
+A03E ; [.2BB3.0020.0002.A03E] # YI SYLLABLE PIEP
+A03F ; [.2BB4.0020.0002.A03F] # YI SYLLABLE PAT
+A040 ; [.2BB5.0020.0002.A040] # YI SYLLABLE PAX
+A041 ; [.2BB6.0020.0002.A041] # YI SYLLABLE PA
+A042 ; [.2BB7.0020.0002.A042] # YI SYLLABLE PAP
+A043 ; [.2BB8.0020.0002.A043] # YI SYLLABLE PUOX
+A044 ; [.2BB9.0020.0002.A044] # YI SYLLABLE PUO
+A045 ; [.2BBA.0020.0002.A045] # YI SYLLABLE PUOP
+A046 ; [.2BBB.0020.0002.A046] # YI SYLLABLE POT
+A047 ; [.2BBC.0020.0002.A047] # YI SYLLABLE POX
+A048 ; [.2BBD.0020.0002.A048] # YI SYLLABLE PO
+A049 ; [.2BBE.0020.0002.A049] # YI SYLLABLE POP
+A04A ; [.2BBF.0020.0002.A04A] # YI SYLLABLE PUT
+A04B ; [.2BC0.0020.0002.A04B] # YI SYLLABLE PUX
+A04C ; [.2BC1.0020.0002.A04C] # YI SYLLABLE PU
+A04D ; [.2BC2.0020.0002.A04D] # YI SYLLABLE PUP
+A04E ; [.2BC3.0020.0002.A04E] # YI SYLLABLE PURX
+A04F ; [.2BC4.0020.0002.A04F] # YI SYLLABLE PUR
+A050 ; [.2BC5.0020.0002.A050] # YI SYLLABLE PYT
+A051 ; [.2BC6.0020.0002.A051] # YI SYLLABLE PYX
+A052 ; [.2BC7.0020.0002.A052] # YI SYLLABLE PY
+A053 ; [.2BC8.0020.0002.A053] # YI SYLLABLE PYP
+A054 ; [.2BC9.0020.0002.A054] # YI SYLLABLE PYRX
+A055 ; [.2BCA.0020.0002.A055] # YI SYLLABLE PYR
+A056 ; [.2BCB.0020.0002.A056] # YI SYLLABLE BBIT
+A057 ; [.2BCC.0020.0002.A057] # YI SYLLABLE BBIX
+A058 ; [.2BCD.0020.0002.A058] # YI SYLLABLE BBI
+A059 ; [.2BCE.0020.0002.A059] # YI SYLLABLE BBIP
+A05A ; [.2BCF.0020.0002.A05A] # YI SYLLABLE BBIET
+A05B ; [.2BD0.0020.0002.A05B] # YI SYLLABLE BBIEX
+A05C ; [.2BD1.0020.0002.A05C] # YI SYLLABLE BBIE
+A05D ; [.2BD2.0020.0002.A05D] # YI SYLLABLE BBIEP
+A05E ; [.2BD3.0020.0002.A05E] # YI SYLLABLE BBAT
+A05F ; [.2BD4.0020.0002.A05F] # YI SYLLABLE BBAX
+A060 ; [.2BD5.0020.0002.A060] # YI SYLLABLE BBA
+A061 ; [.2BD6.0020.0002.A061] # YI SYLLABLE BBAP
+A062 ; [.2BD7.0020.0002.A062] # YI SYLLABLE BBUOX
+A063 ; [.2BD8.0020.0002.A063] # YI SYLLABLE BBUO
+A064 ; [.2BD9.0020.0002.A064] # YI SYLLABLE BBUOP
+A065 ; [.2BDA.0020.0002.A065] # YI SYLLABLE BBOT
+A066 ; [.2BDB.0020.0002.A066] # YI SYLLABLE BBOX
+A067 ; [.2BDC.0020.0002.A067] # YI SYLLABLE BBO
+A068 ; [.2BDD.0020.0002.A068] # YI SYLLABLE BBOP
+A069 ; [.2BDE.0020.0002.A069] # YI SYLLABLE BBEX
+A06A ; [.2BDF.0020.0002.A06A] # YI SYLLABLE BBE
+A06B ; [.2BE0.0020.0002.A06B] # YI SYLLABLE BBEP
+A06C ; [.2BE1.0020.0002.A06C] # YI SYLLABLE BBUT
+A06D ; [.2BE2.0020.0002.A06D] # YI SYLLABLE BBUX
+A06E ; [.2BE3.0020.0002.A06E] # YI SYLLABLE BBU
+A06F ; [.2BE4.0020.0002.A06F] # YI SYLLABLE BBUP
+A070 ; [.2BE5.0020.0002.A070] # YI SYLLABLE BBURX
+A071 ; [.2BE6.0020.0002.A071] # YI SYLLABLE BBUR
+A072 ; [.2BE7.0020.0002.A072] # YI SYLLABLE BBYT
+A073 ; [.2BE8.0020.0002.A073] # YI SYLLABLE BBYX
+A074 ; [.2BE9.0020.0002.A074] # YI SYLLABLE BBY
+A075 ; [.2BEA.0020.0002.A075] # YI SYLLABLE BBYP
+A076 ; [.2BEB.0020.0002.A076] # YI SYLLABLE NBIT
+A077 ; [.2BEC.0020.0002.A077] # YI SYLLABLE NBIX
+A078 ; [.2BED.0020.0002.A078] # YI SYLLABLE NBI
+A079 ; [.2BEE.0020.0002.A079] # YI SYLLABLE NBIP
+A07A ; [.2BEF.0020.0002.A07A] # YI SYLLABLE NBIEX
+A07B ; [.2BF0.0020.0002.A07B] # YI SYLLABLE NBIE
+A07C ; [.2BF1.0020.0002.A07C] # YI SYLLABLE NBIEP
+A07D ; [.2BF2.0020.0002.A07D] # YI SYLLABLE NBAT
+A07E ; [.2BF3.0020.0002.A07E] # YI SYLLABLE NBAX
+A07F ; [.2BF4.0020.0002.A07F] # YI SYLLABLE NBA
+A080 ; [.2BF5.0020.0002.A080] # YI SYLLABLE NBAP
+A081 ; [.2BF6.0020.0002.A081] # YI SYLLABLE NBOT
+A082 ; [.2BF7.0020.0002.A082] # YI SYLLABLE NBOX
+A083 ; [.2BF8.0020.0002.A083] # YI SYLLABLE NBO
+A084 ; [.2BF9.0020.0002.A084] # YI SYLLABLE NBOP
+A085 ; [.2BFA.0020.0002.A085] # YI SYLLABLE NBUT
+A086 ; [.2BFB.0020.0002.A086] # YI SYLLABLE NBUX
+A087 ; [.2BFC.0020.0002.A087] # YI SYLLABLE NBU
+A088 ; [.2BFD.0020.0002.A088] # YI SYLLABLE NBUP
+A089 ; [.2BFE.0020.0002.A089] # YI SYLLABLE NBURX
+A08A ; [.2BFF.0020.0002.A08A] # YI SYLLABLE NBUR
+A08B ; [.2C00.0020.0002.A08B] # YI SYLLABLE NBYT
+A08C ; [.2C01.0020.0002.A08C] # YI SYLLABLE NBYX
+A08D ; [.2C02.0020.0002.A08D] # YI SYLLABLE NBY
+A08E ; [.2C03.0020.0002.A08E] # YI SYLLABLE NBYP
+A08F ; [.2C04.0020.0002.A08F] # YI SYLLABLE NBYRX
+A090 ; [.2C05.0020.0002.A090] # YI SYLLABLE NBYR
+A091 ; [.2C06.0020.0002.A091] # YI SYLLABLE HMIT
+A092 ; [.2C07.0020.0002.A092] # YI SYLLABLE HMIX
+A093 ; [.2C08.0020.0002.A093] # YI SYLLABLE HMI
+A094 ; [.2C09.0020.0002.A094] # YI SYLLABLE HMIP
+A095 ; [.2C0A.0020.0002.A095] # YI SYLLABLE HMIEX
+A096 ; [.2C0B.0020.0002.A096] # YI SYLLABLE HMIE
+A097 ; [.2C0C.0020.0002.A097] # YI SYLLABLE HMIEP
+A098 ; [.2C0D.0020.0002.A098] # YI SYLLABLE HMAT
+A099 ; [.2C0E.0020.0002.A099] # YI SYLLABLE HMAX
+A09A ; [.2C0F.0020.0002.A09A] # YI SYLLABLE HMA
+A09B ; [.2C10.0020.0002.A09B] # YI SYLLABLE HMAP
+A09C ; [.2C11.0020.0002.A09C] # YI SYLLABLE HMUOX
+A09D ; [.2C12.0020.0002.A09D] # YI SYLLABLE HMUO
+A09E ; [.2C13.0020.0002.A09E] # YI SYLLABLE HMUOP
+A09F ; [.2C14.0020.0002.A09F] # YI SYLLABLE HMOT
+A0A0 ; [.2C15.0020.0002.A0A0] # YI SYLLABLE HMOX
+A0A1 ; [.2C16.0020.0002.A0A1] # YI SYLLABLE HMO
+A0A2 ; [.2C17.0020.0002.A0A2] # YI SYLLABLE HMOP
+A0A3 ; [.2C18.0020.0002.A0A3] # YI SYLLABLE HMUT
+A0A4 ; [.2C19.0020.0002.A0A4] # YI SYLLABLE HMUX
+A0A5 ; [.2C1A.0020.0002.A0A5] # YI SYLLABLE HMU
+A0A6 ; [.2C1B.0020.0002.A0A6] # YI SYLLABLE HMUP
+A0A7 ; [.2C1C.0020.0002.A0A7] # YI SYLLABLE HMURX
+A0A8 ; [.2C1D.0020.0002.A0A8] # YI SYLLABLE HMUR
+A0A9 ; [.2C1E.0020.0002.A0A9] # YI SYLLABLE HMYX
+A0AA ; [.2C1F.0020.0002.A0AA] # YI SYLLABLE HMY
+A0AB ; [.2C20.0020.0002.A0AB] # YI SYLLABLE HMYP
+A0AC ; [.2C21.0020.0002.A0AC] # YI SYLLABLE HMYRX
+A0AD ; [.2C22.0020.0002.A0AD] # YI SYLLABLE HMYR
+A0AE ; [.2C23.0020.0002.A0AE] # YI SYLLABLE MIT
+A0AF ; [.2C24.0020.0002.A0AF] # YI SYLLABLE MIX
+A0B0 ; [.2C25.0020.0002.A0B0] # YI SYLLABLE MI
+A0B1 ; [.2C26.0020.0002.A0B1] # YI SYLLABLE MIP
+A0B2 ; [.2C27.0020.0002.A0B2] # YI SYLLABLE MIEX
+A0B3 ; [.2C28.0020.0002.A0B3] # YI SYLLABLE MIE
+A0B4 ; [.2C29.0020.0002.A0B4] # YI SYLLABLE MIEP
+A0B5 ; [.2C2A.0020.0002.A0B5] # YI SYLLABLE MAT
+A0B6 ; [.2C2B.0020.0002.A0B6] # YI SYLLABLE MAX
+A0B7 ; [.2C2C.0020.0002.A0B7] # YI SYLLABLE MA
+A0B8 ; [.2C2D.0020.0002.A0B8] # YI SYLLABLE MAP
+A0B9 ; [.2C2E.0020.0002.A0B9] # YI SYLLABLE MUOT
+A0BA ; [.2C2F.0020.0002.A0BA] # YI SYLLABLE MUOX
+A0BB ; [.2C30.0020.0002.A0BB] # YI SYLLABLE MUO
+A0BC ; [.2C31.0020.0002.A0BC] # YI SYLLABLE MUOP
+A0BD ; [.2C32.0020.0002.A0BD] # YI SYLLABLE MOT
+A0BE ; [.2C33.0020.0002.A0BE] # YI SYLLABLE MOX
+A0BF ; [.2C34.0020.0002.A0BF] # YI SYLLABLE MO
+A0C0 ; [.2C35.0020.0002.A0C0] # YI SYLLABLE MOP
+A0C1 ; [.2C36.0020.0002.A0C1] # YI SYLLABLE MEX
+A0C2 ; [.2C37.0020.0002.A0C2] # YI SYLLABLE ME
+A0C3 ; [.2C38.0020.0002.A0C3] # YI SYLLABLE MUT
+A0C4 ; [.2C39.0020.0002.A0C4] # YI SYLLABLE MUX
+A0C5 ; [.2C3A.0020.0002.A0C5] # YI SYLLABLE MU
+A0C6 ; [.2C3B.0020.0002.A0C6] # YI SYLLABLE MUP
+A0C7 ; [.2C3C.0020.0002.A0C7] # YI SYLLABLE MURX
+A0C8 ; [.2C3D.0020.0002.A0C8] # YI SYLLABLE MUR
+A0C9 ; [.2C3E.0020.0002.A0C9] # YI SYLLABLE MYT
+A0CA ; [.2C3F.0020.0002.A0CA] # YI SYLLABLE MYX
+A0CB ; [.2C40.0020.0002.A0CB] # YI SYLLABLE MY
+A0CC ; [.2C41.0020.0002.A0CC] # YI SYLLABLE MYP
+A0CD ; [.2C42.0020.0002.A0CD] # YI SYLLABLE FIT
+A0CE ; [.2C43.0020.0002.A0CE] # YI SYLLABLE FIX
+A0CF ; [.2C44.0020.0002.A0CF] # YI SYLLABLE FI
+A0D0 ; [.2C45.0020.0002.A0D0] # YI SYLLABLE FIP
+A0D1 ; [.2C46.0020.0002.A0D1] # YI SYLLABLE FAT
+A0D2 ; [.2C47.0020.0002.A0D2] # YI SYLLABLE FAX
+A0D3 ; [.2C48.0020.0002.A0D3] # YI SYLLABLE FA
+A0D4 ; [.2C49.0020.0002.A0D4] # YI SYLLABLE FAP
+A0D5 ; [.2C4A.0020.0002.A0D5] # YI SYLLABLE FOX
+A0D6 ; [.2C4B.0020.0002.A0D6] # YI SYLLABLE FO
+A0D7 ; [.2C4C.0020.0002.A0D7] # YI SYLLABLE FOP
+A0D8 ; [.2C4D.0020.0002.A0D8] # YI SYLLABLE FUT
+A0D9 ; [.2C4E.0020.0002.A0D9] # YI SYLLABLE FUX
+A0DA ; [.2C4F.0020.0002.A0DA] # YI SYLLABLE FU
+A0DB ; [.2C50.0020.0002.A0DB] # YI SYLLABLE FUP
+A0DC ; [.2C51.0020.0002.A0DC] # YI SYLLABLE FURX
+A0DD ; [.2C52.0020.0002.A0DD] # YI SYLLABLE FUR
+A0DE ; [.2C53.0020.0002.A0DE] # YI SYLLABLE FYT
+A0DF ; [.2C54.0020.0002.A0DF] # YI SYLLABLE FYX
+A0E0 ; [.2C55.0020.0002.A0E0] # YI SYLLABLE FY
+A0E1 ; [.2C56.0020.0002.A0E1] # YI SYLLABLE FYP
+A0E2 ; [.2C57.0020.0002.A0E2] # YI SYLLABLE VIT
+A0E3 ; [.2C58.0020.0002.A0E3] # YI SYLLABLE VIX
+A0E4 ; [.2C59.0020.0002.A0E4] # YI SYLLABLE VI
+A0E5 ; [.2C5A.0020.0002.A0E5] # YI SYLLABLE VIP
+A0E6 ; [.2C5B.0020.0002.A0E6] # YI SYLLABLE VIET
+A0E7 ; [.2C5C.0020.0002.A0E7] # YI SYLLABLE VIEX
+A0E8 ; [.2C5D.0020.0002.A0E8] # YI SYLLABLE VIE
+A0E9 ; [.2C5E.0020.0002.A0E9] # YI SYLLABLE VIEP
+A0EA ; [.2C5F.0020.0002.A0EA] # YI SYLLABLE VAT
+A0EB ; [.2C60.0020.0002.A0EB] # YI SYLLABLE VAX
+A0EC ; [.2C61.0020.0002.A0EC] # YI SYLLABLE VA
+A0ED ; [.2C62.0020.0002.A0ED] # YI SYLLABLE VAP
+A0EE ; [.2C63.0020.0002.A0EE] # YI SYLLABLE VOT
+A0EF ; [.2C64.0020.0002.A0EF] # YI SYLLABLE VOX
+A0F0 ; [.2C65.0020.0002.A0F0] # YI SYLLABLE VO
+A0F1 ; [.2C66.0020.0002.A0F1] # YI SYLLABLE VOP
+A0F2 ; [.2C67.0020.0002.A0F2] # YI SYLLABLE VEX
+A0F3 ; [.2C68.0020.0002.A0F3] # YI SYLLABLE VEP
+A0F4 ; [.2C69.0020.0002.A0F4] # YI SYLLABLE VUT
+A0F5 ; [.2C6A.0020.0002.A0F5] # YI SYLLABLE VUX
+A0F6 ; [.2C6B.0020.0002.A0F6] # YI SYLLABLE VU
+A0F7 ; [.2C6C.0020.0002.A0F7] # YI SYLLABLE VUP
+A0F8 ; [.2C6D.0020.0002.A0F8] # YI SYLLABLE VURX
+A0F9 ; [.2C6E.0020.0002.A0F9] # YI SYLLABLE VUR
+A0FA ; [.2C6F.0020.0002.A0FA] # YI SYLLABLE VYT
+A0FB ; [.2C70.0020.0002.A0FB] # YI SYLLABLE VYX
+A0FC ; [.2C71.0020.0002.A0FC] # YI SYLLABLE VY
+A0FD ; [.2C72.0020.0002.A0FD] # YI SYLLABLE VYP
+A0FE ; [.2C73.0020.0002.A0FE] # YI SYLLABLE VYRX
+A0FF ; [.2C74.0020.0002.A0FF] # YI SYLLABLE VYR
+A100 ; [.2C75.0020.0002.A100] # YI SYLLABLE DIT
+A101 ; [.2C76.0020.0002.A101] # YI SYLLABLE DIX
+A102 ; [.2C77.0020.0002.A102] # YI SYLLABLE DI
+A103 ; [.2C78.0020.0002.A103] # YI SYLLABLE DIP
+A104 ; [.2C79.0020.0002.A104] # YI SYLLABLE DIEX
+A105 ; [.2C7A.0020.0002.A105] # YI SYLLABLE DIE
+A106 ; [.2C7B.0020.0002.A106] # YI SYLLABLE DIEP
+A107 ; [.2C7C.0020.0002.A107] # YI SYLLABLE DAT
+A108 ; [.2C7D.0020.0002.A108] # YI SYLLABLE DAX
+A109 ; [.2C7E.0020.0002.A109] # YI SYLLABLE DA
+A10A ; [.2C7F.0020.0002.A10A] # YI SYLLABLE DAP
+A10B ; [.2C80.0020.0002.A10B] # YI SYLLABLE DUOX
+A10C ; [.2C81.0020.0002.A10C] # YI SYLLABLE DUO
+A10D ; [.2C82.0020.0002.A10D] # YI SYLLABLE DOT
+A10E ; [.2C83.0020.0002.A10E] # YI SYLLABLE DOX
+A10F ; [.2C84.0020.0002.A10F] # YI SYLLABLE DO
+A110 ; [.2C85.0020.0002.A110] # YI SYLLABLE DOP
+A111 ; [.2C86.0020.0002.A111] # YI SYLLABLE DEX
+A112 ; [.2C87.0020.0002.A112] # YI SYLLABLE DE
+A113 ; [.2C88.0020.0002.A113] # YI SYLLABLE DEP
+A114 ; [.2C89.0020.0002.A114] # YI SYLLABLE DUT
+A115 ; [.2C8A.0020.0002.A115] # YI SYLLABLE DUX
+A116 ; [.2C8B.0020.0002.A116] # YI SYLLABLE DU
+A117 ; [.2C8C.0020.0002.A117] # YI SYLLABLE DUP
+A118 ; [.2C8D.0020.0002.A118] # YI SYLLABLE DURX
+A119 ; [.2C8E.0020.0002.A119] # YI SYLLABLE DUR
+A11A ; [.2C8F.0020.0002.A11A] # YI SYLLABLE TIT
+A11B ; [.2C90.0020.0002.A11B] # YI SYLLABLE TIX
+A11C ; [.2C91.0020.0002.A11C] # YI SYLLABLE TI
+A11D ; [.2C92.0020.0002.A11D] # YI SYLLABLE TIP
+A11E ; [.2C93.0020.0002.A11E] # YI SYLLABLE TIEX
+A11F ; [.2C94.0020.0002.A11F] # YI SYLLABLE TIE
+A120 ; [.2C95.0020.0002.A120] # YI SYLLABLE TIEP
+A121 ; [.2C96.0020.0002.A121] # YI SYLLABLE TAT
+A122 ; [.2C97.0020.0002.A122] # YI SYLLABLE TAX
+A123 ; [.2C98.0020.0002.A123] # YI SYLLABLE TA
+A124 ; [.2C99.0020.0002.A124] # YI SYLLABLE TAP
+A125 ; [.2C9A.0020.0002.A125] # YI SYLLABLE TUOT
+A126 ; [.2C9B.0020.0002.A126] # YI SYLLABLE TUOX
+A127 ; [.2C9C.0020.0002.A127] # YI SYLLABLE TUO
+A128 ; [.2C9D.0020.0002.A128] # YI SYLLABLE TUOP
+A129 ; [.2C9E.0020.0002.A129] # YI SYLLABLE TOT
+A12A ; [.2C9F.0020.0002.A12A] # YI SYLLABLE TOX
+A12B ; [.2CA0.0020.0002.A12B] # YI SYLLABLE TO
+A12C ; [.2CA1.0020.0002.A12C] # YI SYLLABLE TOP
+A12D ; [.2CA2.0020.0002.A12D] # YI SYLLABLE TEX
+A12E ; [.2CA3.0020.0002.A12E] # YI SYLLABLE TE
+A12F ; [.2CA4.0020.0002.A12F] # YI SYLLABLE TEP
+A130 ; [.2CA5.0020.0002.A130] # YI SYLLABLE TUT
+A131 ; [.2CA6.0020.0002.A131] # YI SYLLABLE TUX
+A132 ; [.2CA7.0020.0002.A132] # YI SYLLABLE TU
+A133 ; [.2CA8.0020.0002.A133] # YI SYLLABLE TUP
+A134 ; [.2CA9.0020.0002.A134] # YI SYLLABLE TURX
+A135 ; [.2CAA.0020.0002.A135] # YI SYLLABLE TUR
+A136 ; [.2CAB.0020.0002.A136] # YI SYLLABLE DDIT
+A137 ; [.2CAC.0020.0002.A137] # YI SYLLABLE DDIX
+A138 ; [.2CAD.0020.0002.A138] # YI SYLLABLE DDI
+A139 ; [.2CAE.0020.0002.A139] # YI SYLLABLE DDIP
+A13A ; [.2CAF.0020.0002.A13A] # YI SYLLABLE DDIEX
+A13B ; [.2CB0.0020.0002.A13B] # YI SYLLABLE DDIE
+A13C ; [.2CB1.0020.0002.A13C] # YI SYLLABLE DDIEP
+A13D ; [.2CB2.0020.0002.A13D] # YI SYLLABLE DDAT
+A13E ; [.2CB3.0020.0002.A13E] # YI SYLLABLE DDAX
+A13F ; [.2CB4.0020.0002.A13F] # YI SYLLABLE DDA
+A140 ; [.2CB5.0020.0002.A140] # YI SYLLABLE DDAP
+A141 ; [.2CB6.0020.0002.A141] # YI SYLLABLE DDUOX
+A142 ; [.2CB7.0020.0002.A142] # YI SYLLABLE DDUO
+A143 ; [.2CB8.0020.0002.A143] # YI SYLLABLE DDUOP
+A144 ; [.2CB9.0020.0002.A144] # YI SYLLABLE DDOT
+A145 ; [.2CBA.0020.0002.A145] # YI SYLLABLE DDOX
+A146 ; [.2CBB.0020.0002.A146] # YI SYLLABLE DDO
+A147 ; [.2CBC.0020.0002.A147] # YI SYLLABLE DDOP
+A148 ; [.2CBD.0020.0002.A148] # YI SYLLABLE DDEX
+A149 ; [.2CBE.0020.0002.A149] # YI SYLLABLE DDE
+A14A ; [.2CBF.0020.0002.A14A] # YI SYLLABLE DDEP
+A14B ; [.2CC0.0020.0002.A14B] # YI SYLLABLE DDUT
+A14C ; [.2CC1.0020.0002.A14C] # YI SYLLABLE DDUX
+A14D ; [.2CC2.0020.0002.A14D] # YI SYLLABLE DDU
+A14E ; [.2CC3.0020.0002.A14E] # YI SYLLABLE DDUP
+A14F ; [.2CC4.0020.0002.A14F] # YI SYLLABLE DDURX
+A150 ; [.2CC5.0020.0002.A150] # YI SYLLABLE DDUR
+A151 ; [.2CC6.0020.0002.A151] # YI SYLLABLE NDIT
+A152 ; [.2CC7.0020.0002.A152] # YI SYLLABLE NDIX
+A153 ; [.2CC8.0020.0002.A153] # YI SYLLABLE NDI
+A154 ; [.2CC9.0020.0002.A154] # YI SYLLABLE NDIP
+A155 ; [.2CCA.0020.0002.A155] # YI SYLLABLE NDIEX
+A156 ; [.2CCB.0020.0002.A156] # YI SYLLABLE NDIE
+A157 ; [.2CCC.0020.0002.A157] # YI SYLLABLE NDAT
+A158 ; [.2CCD.0020.0002.A158] # YI SYLLABLE NDAX
+A159 ; [.2CCE.0020.0002.A159] # YI SYLLABLE NDA
+A15A ; [.2CCF.0020.0002.A15A] # YI SYLLABLE NDAP
+A15B ; [.2CD0.0020.0002.A15B] # YI SYLLABLE NDOT
+A15C ; [.2CD1.0020.0002.A15C] # YI SYLLABLE NDOX
+A15D ; [.2CD2.0020.0002.A15D] # YI SYLLABLE NDO
+A15E ; [.2CD3.0020.0002.A15E] # YI SYLLABLE NDOP
+A15F ; [.2CD4.0020.0002.A15F] # YI SYLLABLE NDEX
+A160 ; [.2CD5.0020.0002.A160] # YI SYLLABLE NDE
+A161 ; [.2CD6.0020.0002.A161] # YI SYLLABLE NDEP
+A162 ; [.2CD7.0020.0002.A162] # YI SYLLABLE NDUT
+A163 ; [.2CD8.0020.0002.A163] # YI SYLLABLE NDUX
+A164 ; [.2CD9.0020.0002.A164] # YI SYLLABLE NDU
+A165 ; [.2CDA.0020.0002.A165] # YI SYLLABLE NDUP
+A166 ; [.2CDB.0020.0002.A166] # YI SYLLABLE NDURX
+A167 ; [.2CDC.0020.0002.A167] # YI SYLLABLE NDUR
+A168 ; [.2CDD.0020.0002.A168] # YI SYLLABLE HNIT
+A169 ; [.2CDE.0020.0002.A169] # YI SYLLABLE HNIX
+A16A ; [.2CDF.0020.0002.A16A] # YI SYLLABLE HNI
+A16B ; [.2CE0.0020.0002.A16B] # YI SYLLABLE HNIP
+A16C ; [.2CE1.0020.0002.A16C] # YI SYLLABLE HNIET
+A16D ; [.2CE2.0020.0002.A16D] # YI SYLLABLE HNIEX
+A16E ; [.2CE3.0020.0002.A16E] # YI SYLLABLE HNIE
+A16F ; [.2CE4.0020.0002.A16F] # YI SYLLABLE HNIEP
+A170 ; [.2CE5.0020.0002.A170] # YI SYLLABLE HNAT
+A171 ; [.2CE6.0020.0002.A171] # YI SYLLABLE HNAX
+A172 ; [.2CE7.0020.0002.A172] # YI SYLLABLE HNA
+A173 ; [.2CE8.0020.0002.A173] # YI SYLLABLE HNAP
+A174 ; [.2CE9.0020.0002.A174] # YI SYLLABLE HNUOX
+A175 ; [.2CEA.0020.0002.A175] # YI SYLLABLE HNUO
+A176 ; [.2CEB.0020.0002.A176] # YI SYLLABLE HNOT
+A177 ; [.2CEC.0020.0002.A177] # YI SYLLABLE HNOX
+A178 ; [.2CED.0020.0002.A178] # YI SYLLABLE HNOP
+A179 ; [.2CEE.0020.0002.A179] # YI SYLLABLE HNEX
+A17A ; [.2CEF.0020.0002.A17A] # YI SYLLABLE HNE
+A17B ; [.2CF0.0020.0002.A17B] # YI SYLLABLE HNEP
+A17C ; [.2CF1.0020.0002.A17C] # YI SYLLABLE HNUT
+A17D ; [.2CF2.0020.0002.A17D] # YI SYLLABLE NIT
+A17E ; [.2CF3.0020.0002.A17E] # YI SYLLABLE NIX
+A17F ; [.2CF4.0020.0002.A17F] # YI SYLLABLE NI
+A180 ; [.2CF5.0020.0002.A180] # YI SYLLABLE NIP
+A181 ; [.2CF6.0020.0002.A181] # YI SYLLABLE NIEX
+A182 ; [.2CF7.0020.0002.A182] # YI SYLLABLE NIE
+A183 ; [.2CF8.0020.0002.A183] # YI SYLLABLE NIEP
+A184 ; [.2CF9.0020.0002.A184] # YI SYLLABLE NAX
+A185 ; [.2CFA.0020.0002.A185] # YI SYLLABLE NA
+A186 ; [.2CFB.0020.0002.A186] # YI SYLLABLE NAP
+A187 ; [.2CFC.0020.0002.A187] # YI SYLLABLE NUOX
+A188 ; [.2CFD.0020.0002.A188] # YI SYLLABLE NUO
+A189 ; [.2CFE.0020.0002.A189] # YI SYLLABLE NUOP
+A18A ; [.2CFF.0020.0002.A18A] # YI SYLLABLE NOT
+A18B ; [.2D00.0020.0002.A18B] # YI SYLLABLE NOX
+A18C ; [.2D01.0020.0002.A18C] # YI SYLLABLE NO
+A18D ; [.2D02.0020.0002.A18D] # YI SYLLABLE NOP
+A18E ; [.2D03.0020.0002.A18E] # YI SYLLABLE NEX
+A18F ; [.2D04.0020.0002.A18F] # YI SYLLABLE NE
+A190 ; [.2D05.0020.0002.A190] # YI SYLLABLE NEP
+A191 ; [.2D06.0020.0002.A191] # YI SYLLABLE NUT
+A192 ; [.2D07.0020.0002.A192] # YI SYLLABLE NUX
+A193 ; [.2D08.0020.0002.A193] # YI SYLLABLE NU
+A194 ; [.2D09.0020.0002.A194] # YI SYLLABLE NUP
+A195 ; [.2D0A.0020.0002.A195] # YI SYLLABLE NURX
+A196 ; [.2D0B.0020.0002.A196] # YI SYLLABLE NUR
+A197 ; [.2D0C.0020.0002.A197] # YI SYLLABLE HLIT
+A198 ; [.2D0D.0020.0002.A198] # YI SYLLABLE HLIX
+A199 ; [.2D0E.0020.0002.A199] # YI SYLLABLE HLI
+A19A ; [.2D0F.0020.0002.A19A] # YI SYLLABLE HLIP
+A19B ; [.2D10.0020.0002.A19B] # YI SYLLABLE HLIEX
+A19C ; [.2D11.0020.0002.A19C] # YI SYLLABLE HLIE
+A19D ; [.2D12.0020.0002.A19D] # YI SYLLABLE HLIEP
+A19E ; [.2D13.0020.0002.A19E] # YI SYLLABLE HLAT
+A19F ; [.2D14.0020.0002.A19F] # YI SYLLABLE HLAX
+A1A0 ; [.2D15.0020.0002.A1A0] # YI SYLLABLE HLA
+A1A1 ; [.2D16.0020.0002.A1A1] # YI SYLLABLE HLAP
+A1A2 ; [.2D17.0020.0002.A1A2] # YI SYLLABLE HLUOX
+A1A3 ; [.2D18.0020.0002.A1A3] # YI SYLLABLE HLUO
+A1A4 ; [.2D19.0020.0002.A1A4] # YI SYLLABLE HLUOP
+A1A5 ; [.2D1A.0020.0002.A1A5] # YI SYLLABLE HLOX
+A1A6 ; [.2D1B.0020.0002.A1A6] # YI SYLLABLE HLO
+A1A7 ; [.2D1C.0020.0002.A1A7] # YI SYLLABLE HLOP
+A1A8 ; [.2D1D.0020.0002.A1A8] # YI SYLLABLE HLEX
+A1A9 ; [.2D1E.0020.0002.A1A9] # YI SYLLABLE HLE
+A1AA ; [.2D1F.0020.0002.A1AA] # YI SYLLABLE HLEP
+A1AB ; [.2D20.0020.0002.A1AB] # YI SYLLABLE HLUT
+A1AC ; [.2D21.0020.0002.A1AC] # YI SYLLABLE HLUX
+A1AD ; [.2D22.0020.0002.A1AD] # YI SYLLABLE HLU
+A1AE ; [.2D23.0020.0002.A1AE] # YI SYLLABLE HLUP
+A1AF ; [.2D24.0020.0002.A1AF] # YI SYLLABLE HLURX
+A1B0 ; [.2D25.0020.0002.A1B0] # YI SYLLABLE HLUR
+A1B1 ; [.2D26.0020.0002.A1B1] # YI SYLLABLE HLYT
+A1B2 ; [.2D27.0020.0002.A1B2] # YI SYLLABLE HLYX
+A1B3 ; [.2D28.0020.0002.A1B3] # YI SYLLABLE HLY
+A1B4 ; [.2D29.0020.0002.A1B4] # YI SYLLABLE HLYP
+A1B5 ; [.2D2A.0020.0002.A1B5] # YI SYLLABLE HLYRX
+A1B6 ; [.2D2B.0020.0002.A1B6] # YI SYLLABLE HLYR
+A1B7 ; [.2D2C.0020.0002.A1B7] # YI SYLLABLE LIT
+A1B8 ; [.2D2D.0020.0002.A1B8] # YI SYLLABLE LIX
+A1B9 ; [.2D2E.0020.0002.A1B9] # YI SYLLABLE LI
+A1BA ; [.2D2F.0020.0002.A1BA] # YI SYLLABLE LIP
+A1BB ; [.2D30.0020.0002.A1BB] # YI SYLLABLE LIET
+A1BC ; [.2D31.0020.0002.A1BC] # YI SYLLABLE LIEX
+A1BD ; [.2D32.0020.0002.A1BD] # YI SYLLABLE LIE
+A1BE ; [.2D33.0020.0002.A1BE] # YI SYLLABLE LIEP
+A1BF ; [.2D34.0020.0002.A1BF] # YI SYLLABLE LAT
+A1C0 ; [.2D35.0020.0002.A1C0] # YI SYLLABLE LAX
+A1C1 ; [.2D36.0020.0002.A1C1] # YI SYLLABLE LA
+A1C2 ; [.2D37.0020.0002.A1C2] # YI SYLLABLE LAP
+A1C3 ; [.2D38.0020.0002.A1C3] # YI SYLLABLE LUOT
+A1C4 ; [.2D39.0020.0002.A1C4] # YI SYLLABLE LUOX
+A1C5 ; [.2D3A.0020.0002.A1C5] # YI SYLLABLE LUO
+A1C6 ; [.2D3B.0020.0002.A1C6] # YI SYLLABLE LUOP
+A1C7 ; [.2D3C.0020.0002.A1C7] # YI SYLLABLE LOT
+A1C8 ; [.2D3D.0020.0002.A1C8] # YI SYLLABLE LOX
+A1C9 ; [.2D3E.0020.0002.A1C9] # YI SYLLABLE LO
+A1CA ; [.2D3F.0020.0002.A1CA] # YI SYLLABLE LOP
+A1CB ; [.2D40.0020.0002.A1CB] # YI SYLLABLE LEX
+A1CC ; [.2D41.0020.0002.A1CC] # YI SYLLABLE LE
+A1CD ; [.2D42.0020.0002.A1CD] # YI SYLLABLE LEP
+A1CE ; [.2D43.0020.0002.A1CE] # YI SYLLABLE LUT
+A1CF ; [.2D44.0020.0002.A1CF] # YI SYLLABLE LUX
+A1D0 ; [.2D45.0020.0002.A1D0] # YI SYLLABLE LU
+A1D1 ; [.2D46.0020.0002.A1D1] # YI SYLLABLE LUP
+A1D2 ; [.2D47.0020.0002.A1D2] # YI SYLLABLE LURX
+A1D3 ; [.2D48.0020.0002.A1D3] # YI SYLLABLE LUR
+A1D4 ; [.2D49.0020.0002.A1D4] # YI SYLLABLE LYT
+A1D5 ; [.2D4A.0020.0002.A1D5] # YI SYLLABLE LYX
+A1D6 ; [.2D4B.0020.0002.A1D6] # YI SYLLABLE LY
+A1D7 ; [.2D4C.0020.0002.A1D7] # YI SYLLABLE LYP
+A1D8 ; [.2D4D.0020.0002.A1D8] # YI SYLLABLE LYRX
+A1D9 ; [.2D4E.0020.0002.A1D9] # YI SYLLABLE LYR
+A1DA ; [.2D4F.0020.0002.A1DA] # YI SYLLABLE GIT
+A1DB ; [.2D50.0020.0002.A1DB] # YI SYLLABLE GIX
+A1DC ; [.2D51.0020.0002.A1DC] # YI SYLLABLE GI
+A1DD ; [.2D52.0020.0002.A1DD] # YI SYLLABLE GIP
+A1DE ; [.2D53.0020.0002.A1DE] # YI SYLLABLE GIET
+A1DF ; [.2D54.0020.0002.A1DF] # YI SYLLABLE GIEX
+A1E0 ; [.2D55.0020.0002.A1E0] # YI SYLLABLE GIE
+A1E1 ; [.2D56.0020.0002.A1E1] # YI SYLLABLE GIEP
+A1E2 ; [.2D57.0020.0002.A1E2] # YI SYLLABLE GAT
+A1E3 ; [.2D58.0020.0002.A1E3] # YI SYLLABLE GAX
+A1E4 ; [.2D59.0020.0002.A1E4] # YI SYLLABLE GA
+A1E5 ; [.2D5A.0020.0002.A1E5] # YI SYLLABLE GAP
+A1E6 ; [.2D5B.0020.0002.A1E6] # YI SYLLABLE GUOT
+A1E7 ; [.2D5C.0020.0002.A1E7] # YI SYLLABLE GUOX
+A1E8 ; [.2D5D.0020.0002.A1E8] # YI SYLLABLE GUO
+A1E9 ; [.2D5E.0020.0002.A1E9] # YI SYLLABLE GUOP
+A1EA ; [.2D5F.0020.0002.A1EA] # YI SYLLABLE GOT
+A1EB ; [.2D60.0020.0002.A1EB] # YI SYLLABLE GOX
+A1EC ; [.2D61.0020.0002.A1EC] # YI SYLLABLE GO
+A1ED ; [.2D62.0020.0002.A1ED] # YI SYLLABLE GOP
+A1EE ; [.2D63.0020.0002.A1EE] # YI SYLLABLE GET
+A1EF ; [.2D64.0020.0002.A1EF] # YI SYLLABLE GEX
+A1F0 ; [.2D65.0020.0002.A1F0] # YI SYLLABLE GE
+A1F1 ; [.2D66.0020.0002.A1F1] # YI SYLLABLE GEP
+A1F2 ; [.2D67.0020.0002.A1F2] # YI SYLLABLE GUT
+A1F3 ; [.2D68.0020.0002.A1F3] # YI SYLLABLE GUX
+A1F4 ; [.2D69.0020.0002.A1F4] # YI SYLLABLE GU
+A1F5 ; [.2D6A.0020.0002.A1F5] # YI SYLLABLE GUP
+A1F6 ; [.2D6B.0020.0002.A1F6] # YI SYLLABLE GURX
+A1F7 ; [.2D6C.0020.0002.A1F7] # YI SYLLABLE GUR
+A1F8 ; [.2D6D.0020.0002.A1F8] # YI SYLLABLE KIT
+A1F9 ; [.2D6E.0020.0002.A1F9] # YI SYLLABLE KIX
+A1FA ; [.2D6F.0020.0002.A1FA] # YI SYLLABLE KI
+A1FB ; [.2D70.0020.0002.A1FB] # YI SYLLABLE KIP
+A1FC ; [.2D71.0020.0002.A1FC] # YI SYLLABLE KIEX
+A1FD ; [.2D72.0020.0002.A1FD] # YI SYLLABLE KIE
+A1FE ; [.2D73.0020.0002.A1FE] # YI SYLLABLE KIEP
+A1FF ; [.2D74.0020.0002.A1FF] # YI SYLLABLE KAT
+A200 ; [.2D75.0020.0002.A200] # YI SYLLABLE KAX
+A201 ; [.2D76.0020.0002.A201] # YI SYLLABLE KA
+A202 ; [.2D77.0020.0002.A202] # YI SYLLABLE KAP
+A203 ; [.2D78.0020.0002.A203] # YI SYLLABLE KUOX
+A204 ; [.2D79.0020.0002.A204] # YI SYLLABLE KUO
+A205 ; [.2D7A.0020.0002.A205] # YI SYLLABLE KUOP
+A206 ; [.2D7B.0020.0002.A206] # YI SYLLABLE KOT
+A207 ; [.2D7C.0020.0002.A207] # YI SYLLABLE KOX
+A208 ; [.2D7D.0020.0002.A208] # YI SYLLABLE KO
+A209 ; [.2D7E.0020.0002.A209] # YI SYLLABLE KOP
+A20A ; [.2D7F.0020.0002.A20A] # YI SYLLABLE KET
+A20B ; [.2D80.0020.0002.A20B] # YI SYLLABLE KEX
+A20C ; [.2D81.0020.0002.A20C] # YI SYLLABLE KE
+A20D ; [.2D82.0020.0002.A20D] # YI SYLLABLE KEP
+A20E ; [.2D83.0020.0002.A20E] # YI SYLLABLE KUT
+A20F ; [.2D84.0020.0002.A20F] # YI SYLLABLE KUX
+A210 ; [.2D85.0020.0002.A210] # YI SYLLABLE KU
+A211 ; [.2D86.0020.0002.A211] # YI SYLLABLE KUP
+A212 ; [.2D87.0020.0002.A212] # YI SYLLABLE KURX
+A213 ; [.2D88.0020.0002.A213] # YI SYLLABLE KUR
+A214 ; [.2D89.0020.0002.A214] # YI SYLLABLE GGIT
+A215 ; [.2D8A.0020.0002.A215] # YI SYLLABLE GGIX
+A216 ; [.2D8B.0020.0002.A216] # YI SYLLABLE GGI
+A217 ; [.2D8C.0020.0002.A217] # YI SYLLABLE GGIEX
+A218 ; [.2D8D.0020.0002.A218] # YI SYLLABLE GGIE
+A219 ; [.2D8E.0020.0002.A219] # YI SYLLABLE GGIEP
+A21A ; [.2D8F.0020.0002.A21A] # YI SYLLABLE GGAT
+A21B ; [.2D90.0020.0002.A21B] # YI SYLLABLE GGAX
+A21C ; [.2D91.0020.0002.A21C] # YI SYLLABLE GGA
+A21D ; [.2D92.0020.0002.A21D] # YI SYLLABLE GGAP
+A21E ; [.2D93.0020.0002.A21E] # YI SYLLABLE GGUOT
+A21F ; [.2D94.0020.0002.A21F] # YI SYLLABLE GGUOX
+A220 ; [.2D95.0020.0002.A220] # YI SYLLABLE GGUO
+A221 ; [.2D96.0020.0002.A221] # YI SYLLABLE GGUOP
+A222 ; [.2D97.0020.0002.A222] # YI SYLLABLE GGOT
+A223 ; [.2D98.0020.0002.A223] # YI SYLLABLE GGOX
+A224 ; [.2D99.0020.0002.A224] # YI SYLLABLE GGO
+A225 ; [.2D9A.0020.0002.A225] # YI SYLLABLE GGOP
+A226 ; [.2D9B.0020.0002.A226] # YI SYLLABLE GGET
+A227 ; [.2D9C.0020.0002.A227] # YI SYLLABLE GGEX
+A228 ; [.2D9D.0020.0002.A228] # YI SYLLABLE GGE
+A229 ; [.2D9E.0020.0002.A229] # YI SYLLABLE GGEP
+A22A ; [.2D9F.0020.0002.A22A] # YI SYLLABLE GGUT
+A22B ; [.2DA0.0020.0002.A22B] # YI SYLLABLE GGUX
+A22C ; [.2DA1.0020.0002.A22C] # YI SYLLABLE GGU
+A22D ; [.2DA2.0020.0002.A22D] # YI SYLLABLE GGUP
+A22E ; [.2DA3.0020.0002.A22E] # YI SYLLABLE GGURX
+A22F ; [.2DA4.0020.0002.A22F] # YI SYLLABLE GGUR
+A230 ; [.2DA5.0020.0002.A230] # YI SYLLABLE MGIEX
+A231 ; [.2DA6.0020.0002.A231] # YI SYLLABLE MGIE
+A232 ; [.2DA7.0020.0002.A232] # YI SYLLABLE MGAT
+A233 ; [.2DA8.0020.0002.A233] # YI SYLLABLE MGAX
+A234 ; [.2DA9.0020.0002.A234] # YI SYLLABLE MGA
+A235 ; [.2DAA.0020.0002.A235] # YI SYLLABLE MGAP
+A236 ; [.2DAB.0020.0002.A236] # YI SYLLABLE MGUOX
+A237 ; [.2DAC.0020.0002.A237] # YI SYLLABLE MGUO
+A238 ; [.2DAD.0020.0002.A238] # YI SYLLABLE MGUOP
+A239 ; [.2DAE.0020.0002.A239] # YI SYLLABLE MGOT
+A23A ; [.2DAF.0020.0002.A23A] # YI SYLLABLE MGOX
+A23B ; [.2DB0.0020.0002.A23B] # YI SYLLABLE MGO
+A23C ; [.2DB1.0020.0002.A23C] # YI SYLLABLE MGOP
+A23D ; [.2DB2.0020.0002.A23D] # YI SYLLABLE MGEX
+A23E ; [.2DB3.0020.0002.A23E] # YI SYLLABLE MGE
+A23F ; [.2DB4.0020.0002.A23F] # YI SYLLABLE MGEP
+A240 ; [.2DB5.0020.0002.A240] # YI SYLLABLE MGUT
+A241 ; [.2DB6.0020.0002.A241] # YI SYLLABLE MGUX
+A242 ; [.2DB7.0020.0002.A242] # YI SYLLABLE MGU
+A243 ; [.2DB8.0020.0002.A243] # YI SYLLABLE MGUP
+A244 ; [.2DB9.0020.0002.A244] # YI SYLLABLE MGURX
+A245 ; [.2DBA.0020.0002.A245] # YI SYLLABLE MGUR
+A246 ; [.2DBB.0020.0002.A246] # YI SYLLABLE HXIT
+A247 ; [.2DBC.0020.0002.A247] # YI SYLLABLE HXIX
+A248 ; [.2DBD.0020.0002.A248] # YI SYLLABLE HXI
+A249 ; [.2DBE.0020.0002.A249] # YI SYLLABLE HXIP
+A24A ; [.2DBF.0020.0002.A24A] # YI SYLLABLE HXIET
+A24B ; [.2DC0.0020.0002.A24B] # YI SYLLABLE HXIEX
+A24C ; [.2DC1.0020.0002.A24C] # YI SYLLABLE HXIE
+A24D ; [.2DC2.0020.0002.A24D] # YI SYLLABLE HXIEP
+A24E ; [.2DC3.0020.0002.A24E] # YI SYLLABLE HXAT
+A24F ; [.2DC4.0020.0002.A24F] # YI SYLLABLE HXAX
+A250 ; [.2DC5.0020.0002.A250] # YI SYLLABLE HXA
+A251 ; [.2DC6.0020.0002.A251] # YI SYLLABLE HXAP
+A252 ; [.2DC7.0020.0002.A252] # YI SYLLABLE HXUOT
+A253 ; [.2DC8.0020.0002.A253] # YI SYLLABLE HXUOX
+A254 ; [.2DC9.0020.0002.A254] # YI SYLLABLE HXUO
+A255 ; [.2DCA.0020.0002.A255] # YI SYLLABLE HXUOP
+A256 ; [.2DCB.0020.0002.A256] # YI SYLLABLE HXOT
+A257 ; [.2DCC.0020.0002.A257] # YI SYLLABLE HXOX
+A258 ; [.2DCD.0020.0002.A258] # YI SYLLABLE HXO
+A259 ; [.2DCE.0020.0002.A259] # YI SYLLABLE HXOP
+A25A ; [.2DCF.0020.0002.A25A] # YI SYLLABLE HXEX
+A25B ; [.2DD0.0020.0002.A25B] # YI SYLLABLE HXE
+A25C ; [.2DD1.0020.0002.A25C] # YI SYLLABLE HXEP
+A25D ; [.2DD2.0020.0002.A25D] # YI SYLLABLE NGIEX
+A25E ; [.2DD3.0020.0002.A25E] # YI SYLLABLE NGIE
+A25F ; [.2DD4.0020.0002.A25F] # YI SYLLABLE NGIEP
+A260 ; [.2DD5.0020.0002.A260] # YI SYLLABLE NGAT
+A261 ; [.2DD6.0020.0002.A261] # YI SYLLABLE NGAX
+A262 ; [.2DD7.0020.0002.A262] # YI SYLLABLE NGA
+A263 ; [.2DD8.0020.0002.A263] # YI SYLLABLE NGAP
+A264 ; [.2DD9.0020.0002.A264] # YI SYLLABLE NGUOT
+A265 ; [.2DDA.0020.0002.A265] # YI SYLLABLE NGUOX
+A266 ; [.2DDB.0020.0002.A266] # YI SYLLABLE NGUO
+A267 ; [.2DDC.0020.0002.A267] # YI SYLLABLE NGOT
+A268 ; [.2DDD.0020.0002.A268] # YI SYLLABLE NGOX
+A269 ; [.2DDE.0020.0002.A269] # YI SYLLABLE NGO
+A26A ; [.2DDF.0020.0002.A26A] # YI SYLLABLE NGOP
+A26B ; [.2DE0.0020.0002.A26B] # YI SYLLABLE NGEX
+A26C ; [.2DE1.0020.0002.A26C] # YI SYLLABLE NGE
+A26D ; [.2DE2.0020.0002.A26D] # YI SYLLABLE NGEP
+A26E ; [.2DE3.0020.0002.A26E] # YI SYLLABLE HIT
+A26F ; [.2DE4.0020.0002.A26F] # YI SYLLABLE HIEX
+A270 ; [.2DE5.0020.0002.A270] # YI SYLLABLE HIE
+A271 ; [.2DE6.0020.0002.A271] # YI SYLLABLE HAT
+A272 ; [.2DE7.0020.0002.A272] # YI SYLLABLE HAX
+A273 ; [.2DE8.0020.0002.A273] # YI SYLLABLE HA
+A274 ; [.2DE9.0020.0002.A274] # YI SYLLABLE HAP
+A275 ; [.2DEA.0020.0002.A275] # YI SYLLABLE HUOT
+A276 ; [.2DEB.0020.0002.A276] # YI SYLLABLE HUOX
+A277 ; [.2DEC.0020.0002.A277] # YI SYLLABLE HUO
+A278 ; [.2DED.0020.0002.A278] # YI SYLLABLE HUOP
+A279 ; [.2DEE.0020.0002.A279] # YI SYLLABLE HOT
+A27A ; [.2DEF.0020.0002.A27A] # YI SYLLABLE HOX
+A27B ; [.2DF0.0020.0002.A27B] # YI SYLLABLE HO
+A27C ; [.2DF1.0020.0002.A27C] # YI SYLLABLE HOP
+A27D ; [.2DF2.0020.0002.A27D] # YI SYLLABLE HEX
+A27E ; [.2DF3.0020.0002.A27E] # YI SYLLABLE HE
+A27F ; [.2DF4.0020.0002.A27F] # YI SYLLABLE HEP
+A280 ; [.2DF5.0020.0002.A280] # YI SYLLABLE WAT
+A281 ; [.2DF6.0020.0002.A281] # YI SYLLABLE WAX
+A282 ; [.2DF7.0020.0002.A282] # YI SYLLABLE WA
+A283 ; [.2DF8.0020.0002.A283] # YI SYLLABLE WAP
+A284 ; [.2DF9.0020.0002.A284] # YI SYLLABLE WUOX
+A285 ; [.2DFA.0020.0002.A285] # YI SYLLABLE WUO
+A286 ; [.2DFB.0020.0002.A286] # YI SYLLABLE WUOP
+A287 ; [.2DFC.0020.0002.A287] # YI SYLLABLE WOX
+A288 ; [.2DFD.0020.0002.A288] # YI SYLLABLE WO
+A289 ; [.2DFE.0020.0002.A289] # YI SYLLABLE WOP
+A28A ; [.2DFF.0020.0002.A28A] # YI SYLLABLE WEX
+A28B ; [.2E00.0020.0002.A28B] # YI SYLLABLE WE
+A28C ; [.2E01.0020.0002.A28C] # YI SYLLABLE WEP
+A28D ; [.2E02.0020.0002.A28D] # YI SYLLABLE ZIT
+A28E ; [.2E03.0020.0002.A28E] # YI SYLLABLE ZIX
+A28F ; [.2E04.0020.0002.A28F] # YI SYLLABLE ZI
+A290 ; [.2E05.0020.0002.A290] # YI SYLLABLE ZIP
+A291 ; [.2E06.0020.0002.A291] # YI SYLLABLE ZIEX
+A292 ; [.2E07.0020.0002.A292] # YI SYLLABLE ZIE
+A293 ; [.2E08.0020.0002.A293] # YI SYLLABLE ZIEP
+A294 ; [.2E09.0020.0002.A294] # YI SYLLABLE ZAT
+A295 ; [.2E0A.0020.0002.A295] # YI SYLLABLE ZAX
+A296 ; [.2E0B.0020.0002.A296] # YI SYLLABLE ZA
+A297 ; [.2E0C.0020.0002.A297] # YI SYLLABLE ZAP
+A298 ; [.2E0D.0020.0002.A298] # YI SYLLABLE ZUOX
+A299 ; [.2E0E.0020.0002.A299] # YI SYLLABLE ZUO
+A29A ; [.2E0F.0020.0002.A29A] # YI SYLLABLE ZUOP
+A29B ; [.2E10.0020.0002.A29B] # YI SYLLABLE ZOT
+A29C ; [.2E11.0020.0002.A29C] # YI SYLLABLE ZOX
+A29D ; [.2E12.0020.0002.A29D] # YI SYLLABLE ZO
+A29E ; [.2E13.0020.0002.A29E] # YI SYLLABLE ZOP
+A29F ; [.2E14.0020.0002.A29F] # YI SYLLABLE ZEX
+A2A0 ; [.2E15.0020.0002.A2A0] # YI SYLLABLE ZE
+A2A1 ; [.2E16.0020.0002.A2A1] # YI SYLLABLE ZEP
+A2A2 ; [.2E17.0020.0002.A2A2] # YI SYLLABLE ZUT
+A2A3 ; [.2E18.0020.0002.A2A3] # YI SYLLABLE ZUX
+A2A4 ; [.2E19.0020.0002.A2A4] # YI SYLLABLE ZU
+A2A5 ; [.2E1A.0020.0002.A2A5] # YI SYLLABLE ZUP
+A2A6 ; [.2E1B.0020.0002.A2A6] # YI SYLLABLE ZURX
+A2A7 ; [.2E1C.0020.0002.A2A7] # YI SYLLABLE ZUR
+A2A8 ; [.2E1D.0020.0002.A2A8] # YI SYLLABLE ZYT
+A2A9 ; [.2E1E.0020.0002.A2A9] # YI SYLLABLE ZYX
+A2AA ; [.2E1F.0020.0002.A2AA] # YI SYLLABLE ZY
+A2AB ; [.2E20.0020.0002.A2AB] # YI SYLLABLE ZYP
+A2AC ; [.2E21.0020.0002.A2AC] # YI SYLLABLE ZYRX
+A2AD ; [.2E22.0020.0002.A2AD] # YI SYLLABLE ZYR
+A2AE ; [.2E23.0020.0002.A2AE] # YI SYLLABLE CIT
+A2AF ; [.2E24.0020.0002.A2AF] # YI SYLLABLE CIX
+A2B0 ; [.2E25.0020.0002.A2B0] # YI SYLLABLE CI
+A2B1 ; [.2E26.0020.0002.A2B1] # YI SYLLABLE CIP
+A2B2 ; [.2E27.0020.0002.A2B2] # YI SYLLABLE CIET
+A2B3 ; [.2E28.0020.0002.A2B3] # YI SYLLABLE CIEX
+A2B4 ; [.2E29.0020.0002.A2B4] # YI SYLLABLE CIE
+A2B5 ; [.2E2A.0020.0002.A2B5] # YI SYLLABLE CIEP
+A2B6 ; [.2E2B.0020.0002.A2B6] # YI SYLLABLE CAT
+A2B7 ; [.2E2C.0020.0002.A2B7] # YI SYLLABLE CAX
+A2B8 ; [.2E2D.0020.0002.A2B8] # YI SYLLABLE CA
+A2B9 ; [.2E2E.0020.0002.A2B9] # YI SYLLABLE CAP
+A2BA ; [.2E2F.0020.0002.A2BA] # YI SYLLABLE CUOX
+A2BB ; [.2E30.0020.0002.A2BB] # YI SYLLABLE CUO
+A2BC ; [.2E31.0020.0002.A2BC] # YI SYLLABLE CUOP
+A2BD ; [.2E32.0020.0002.A2BD] # YI SYLLABLE COT
+A2BE ; [.2E33.0020.0002.A2BE] # YI SYLLABLE COX
+A2BF ; [.2E34.0020.0002.A2BF] # YI SYLLABLE CO
+A2C0 ; [.2E35.0020.0002.A2C0] # YI SYLLABLE COP
+A2C1 ; [.2E36.0020.0002.A2C1] # YI SYLLABLE CEX
+A2C2 ; [.2E37.0020.0002.A2C2] # YI SYLLABLE CE
+A2C3 ; [.2E38.0020.0002.A2C3] # YI SYLLABLE CEP
+A2C4 ; [.2E39.0020.0002.A2C4] # YI SYLLABLE CUT
+A2C5 ; [.2E3A.0020.0002.A2C5] # YI SYLLABLE CUX
+A2C6 ; [.2E3B.0020.0002.A2C6] # YI SYLLABLE CU
+A2C7 ; [.2E3C.0020.0002.A2C7] # YI SYLLABLE CUP
+A2C8 ; [.2E3D.0020.0002.A2C8] # YI SYLLABLE CURX
+A2C9 ; [.2E3E.0020.0002.A2C9] # YI SYLLABLE CUR
+A2CA ; [.2E3F.0020.0002.A2CA] # YI SYLLABLE CYT
+A2CB ; [.2E40.0020.0002.A2CB] # YI SYLLABLE CYX
+A2CC ; [.2E41.0020.0002.A2CC] # YI SYLLABLE CY
+A2CD ; [.2E42.0020.0002.A2CD] # YI SYLLABLE CYP
+A2CE ; [.2E43.0020.0002.A2CE] # YI SYLLABLE CYRX
+A2CF ; [.2E44.0020.0002.A2CF] # YI SYLLABLE CYR
+A2D0 ; [.2E45.0020.0002.A2D0] # YI SYLLABLE ZZIT
+A2D1 ; [.2E46.0020.0002.A2D1] # YI SYLLABLE ZZIX
+A2D2 ; [.2E47.0020.0002.A2D2] # YI SYLLABLE ZZI
+A2D3 ; [.2E48.0020.0002.A2D3] # YI SYLLABLE ZZIP
+A2D4 ; [.2E49.0020.0002.A2D4] # YI SYLLABLE ZZIET
+A2D5 ; [.2E4A.0020.0002.A2D5] # YI SYLLABLE ZZIEX
+A2D6 ; [.2E4B.0020.0002.A2D6] # YI SYLLABLE ZZIE
+A2D7 ; [.2E4C.0020.0002.A2D7] # YI SYLLABLE ZZIEP
+A2D8 ; [.2E4D.0020.0002.A2D8] # YI SYLLABLE ZZAT
+A2D9 ; [.2E4E.0020.0002.A2D9] # YI SYLLABLE ZZAX
+A2DA ; [.2E4F.0020.0002.A2DA] # YI SYLLABLE ZZA
+A2DB ; [.2E50.0020.0002.A2DB] # YI SYLLABLE ZZAP
+A2DC ; [.2E51.0020.0002.A2DC] # YI SYLLABLE ZZOX
+A2DD ; [.2E52.0020.0002.A2DD] # YI SYLLABLE ZZO
+A2DE ; [.2E53.0020.0002.A2DE] # YI SYLLABLE ZZOP
+A2DF ; [.2E54.0020.0002.A2DF] # YI SYLLABLE ZZEX
+A2E0 ; [.2E55.0020.0002.A2E0] # YI SYLLABLE ZZE
+A2E1 ; [.2E56.0020.0002.A2E1] # YI SYLLABLE ZZEP
+A2E2 ; [.2E57.0020.0002.A2E2] # YI SYLLABLE ZZUX
+A2E3 ; [.2E58.0020.0002.A2E3] # YI SYLLABLE ZZU
+A2E4 ; [.2E59.0020.0002.A2E4] # YI SYLLABLE ZZUP
+A2E5 ; [.2E5A.0020.0002.A2E5] # YI SYLLABLE ZZURX
+A2E6 ; [.2E5B.0020.0002.A2E6] # YI SYLLABLE ZZUR
+A2E7 ; [.2E5C.0020.0002.A2E7] # YI SYLLABLE ZZYT
+A2E8 ; [.2E5D.0020.0002.A2E8] # YI SYLLABLE ZZYX
+A2E9 ; [.2E5E.0020.0002.A2E9] # YI SYLLABLE ZZY
+A2EA ; [.2E5F.0020.0002.A2EA] # YI SYLLABLE ZZYP
+A2EB ; [.2E60.0020.0002.A2EB] # YI SYLLABLE ZZYRX
+A2EC ; [.2E61.0020.0002.A2EC] # YI SYLLABLE ZZYR
+A2ED ; [.2E62.0020.0002.A2ED] # YI SYLLABLE NZIT
+A2EE ; [.2E63.0020.0002.A2EE] # YI SYLLABLE NZIX
+A2EF ; [.2E64.0020.0002.A2EF] # YI SYLLABLE NZI
+A2F0 ; [.2E65.0020.0002.A2F0] # YI SYLLABLE NZIP
+A2F1 ; [.2E66.0020.0002.A2F1] # YI SYLLABLE NZIEX
+A2F2 ; [.2E67.0020.0002.A2F2] # YI SYLLABLE NZIE
+A2F3 ; [.2E68.0020.0002.A2F3] # YI SYLLABLE NZIEP
+A2F4 ; [.2E69.0020.0002.A2F4] # YI SYLLABLE NZAT
+A2F5 ; [.2E6A.0020.0002.A2F5] # YI SYLLABLE NZAX
+A2F6 ; [.2E6B.0020.0002.A2F6] # YI SYLLABLE NZA
+A2F7 ; [.2E6C.0020.0002.A2F7] # YI SYLLABLE NZAP
+A2F8 ; [.2E6D.0020.0002.A2F8] # YI SYLLABLE NZUOX
+A2F9 ; [.2E6E.0020.0002.A2F9] # YI SYLLABLE NZUO
+A2FA ; [.2E6F.0020.0002.A2FA] # YI SYLLABLE NZOX
+A2FB ; [.2E70.0020.0002.A2FB] # YI SYLLABLE NZOP
+A2FC ; [.2E71.0020.0002.A2FC] # YI SYLLABLE NZEX
+A2FD ; [.2E72.0020.0002.A2FD] # YI SYLLABLE NZE
+A2FE ; [.2E73.0020.0002.A2FE] # YI SYLLABLE NZUX
+A2FF ; [.2E74.0020.0002.A2FF] # YI SYLLABLE NZU
+A300 ; [.2E75.0020.0002.A300] # YI SYLLABLE NZUP
+A301 ; [.2E76.0020.0002.A301] # YI SYLLABLE NZURX
+A302 ; [.2E77.0020.0002.A302] # YI SYLLABLE NZUR
+A303 ; [.2E78.0020.0002.A303] # YI SYLLABLE NZYT
+A304 ; [.2E79.0020.0002.A304] # YI SYLLABLE NZYX
+A305 ; [.2E7A.0020.0002.A305] # YI SYLLABLE NZY
+A306 ; [.2E7B.0020.0002.A306] # YI SYLLABLE NZYP
+A307 ; [.2E7C.0020.0002.A307] # YI SYLLABLE NZYRX
+A308 ; [.2E7D.0020.0002.A308] # YI SYLLABLE NZYR
+A309 ; [.2E7E.0020.0002.A309] # YI SYLLABLE SIT
+A30A ; [.2E7F.0020.0002.A30A] # YI SYLLABLE SIX
+A30B ; [.2E80.0020.0002.A30B] # YI SYLLABLE SI
+A30C ; [.2E81.0020.0002.A30C] # YI SYLLABLE SIP
+A30D ; [.2E82.0020.0002.A30D] # YI SYLLABLE SIEX
+A30E ; [.2E83.0020.0002.A30E] # YI SYLLABLE SIE
+A30F ; [.2E84.0020.0002.A30F] # YI SYLLABLE SIEP
+A310 ; [.2E85.0020.0002.A310] # YI SYLLABLE SAT
+A311 ; [.2E86.0020.0002.A311] # YI SYLLABLE SAX
+A312 ; [.2E87.0020.0002.A312] # YI SYLLABLE SA
+A313 ; [.2E88.0020.0002.A313] # YI SYLLABLE SAP
+A314 ; [.2E89.0020.0002.A314] # YI SYLLABLE SUOX
+A315 ; [.2E8A.0020.0002.A315] # YI SYLLABLE SUO
+A316 ; [.2E8B.0020.0002.A316] # YI SYLLABLE SUOP
+A317 ; [.2E8C.0020.0002.A317] # YI SYLLABLE SOT
+A318 ; [.2E8D.0020.0002.A318] # YI SYLLABLE SOX
+A319 ; [.2E8E.0020.0002.A319] # YI SYLLABLE SO
+A31A ; [.2E8F.0020.0002.A31A] # YI SYLLABLE SOP
+A31B ; [.2E90.0020.0002.A31B] # YI SYLLABLE SEX
+A31C ; [.2E91.0020.0002.A31C] # YI SYLLABLE SE
+A31D ; [.2E92.0020.0002.A31D] # YI SYLLABLE SEP
+A31E ; [.2E93.0020.0002.A31E] # YI SYLLABLE SUT
+A31F ; [.2E94.0020.0002.A31F] # YI SYLLABLE SUX
+A320 ; [.2E95.0020.0002.A320] # YI SYLLABLE SU
+A321 ; [.2E96.0020.0002.A321] # YI SYLLABLE SUP
+A322 ; [.2E97.0020.0002.A322] # YI SYLLABLE SURX
+A323 ; [.2E98.0020.0002.A323] # YI SYLLABLE SUR
+A324 ; [.2E99.0020.0002.A324] # YI SYLLABLE SYT
+A325 ; [.2E9A.0020.0002.A325] # YI SYLLABLE SYX
+A326 ; [.2E9B.0020.0002.A326] # YI SYLLABLE SY
+A327 ; [.2E9C.0020.0002.A327] # YI SYLLABLE SYP
+A328 ; [.2E9D.0020.0002.A328] # YI SYLLABLE SYRX
+A329 ; [.2E9E.0020.0002.A329] # YI SYLLABLE SYR
+A32A ; [.2E9F.0020.0002.A32A] # YI SYLLABLE SSIT
+A32B ; [.2EA0.0020.0002.A32B] # YI SYLLABLE SSIX
+A32C ; [.2EA1.0020.0002.A32C] # YI SYLLABLE SSI
+A32D ; [.2EA2.0020.0002.A32D] # YI SYLLABLE SSIP
+A32E ; [.2EA3.0020.0002.A32E] # YI SYLLABLE SSIEX
+A32F ; [.2EA4.0020.0002.A32F] # YI SYLLABLE SSIE
+A330 ; [.2EA5.0020.0002.A330] # YI SYLLABLE SSIEP
+A331 ; [.2EA6.0020.0002.A331] # YI SYLLABLE SSAT
+A332 ; [.2EA7.0020.0002.A332] # YI SYLLABLE SSAX
+A333 ; [.2EA8.0020.0002.A333] # YI SYLLABLE SSA
+A334 ; [.2EA9.0020.0002.A334] # YI SYLLABLE SSAP
+A335 ; [.2EAA.0020.0002.A335] # YI SYLLABLE SSOT
+A336 ; [.2EAB.0020.0002.A336] # YI SYLLABLE SSOX
+A337 ; [.2EAC.0020.0002.A337] # YI SYLLABLE SSO
+A338 ; [.2EAD.0020.0002.A338] # YI SYLLABLE SSOP
+A339 ; [.2EAE.0020.0002.A339] # YI SYLLABLE SSEX
+A33A ; [.2EAF.0020.0002.A33A] # YI SYLLABLE SSE
+A33B ; [.2EB0.0020.0002.A33B] # YI SYLLABLE SSEP
+A33C ; [.2EB1.0020.0002.A33C] # YI SYLLABLE SSUT
+A33D ; [.2EB2.0020.0002.A33D] # YI SYLLABLE SSUX
+A33E ; [.2EB3.0020.0002.A33E] # YI SYLLABLE SSU
+A33F ; [.2EB4.0020.0002.A33F] # YI SYLLABLE SSUP
+A340 ; [.2EB5.0020.0002.A340] # YI SYLLABLE SSYT
+A341 ; [.2EB6.0020.0002.A341] # YI SYLLABLE SSYX
+A342 ; [.2EB7.0020.0002.A342] # YI SYLLABLE SSY
+A343 ; [.2EB8.0020.0002.A343] # YI SYLLABLE SSYP
+A344 ; [.2EB9.0020.0002.A344] # YI SYLLABLE SSYRX
+A345 ; [.2EBA.0020.0002.A345] # YI SYLLABLE SSYR
+A346 ; [.2EBB.0020.0002.A346] # YI SYLLABLE ZHAT
+A347 ; [.2EBC.0020.0002.A347] # YI SYLLABLE ZHAX
+A348 ; [.2EBD.0020.0002.A348] # YI SYLLABLE ZHA
+A349 ; [.2EBE.0020.0002.A349] # YI SYLLABLE ZHAP
+A34A ; [.2EBF.0020.0002.A34A] # YI SYLLABLE ZHUOX
+A34B ; [.2EC0.0020.0002.A34B] # YI SYLLABLE ZHUO
+A34C ; [.2EC1.0020.0002.A34C] # YI SYLLABLE ZHUOP
+A34D ; [.2EC2.0020.0002.A34D] # YI SYLLABLE ZHOT
+A34E ; [.2EC3.0020.0002.A34E] # YI SYLLABLE ZHOX
+A34F ; [.2EC4.0020.0002.A34F] # YI SYLLABLE ZHO
+A350 ; [.2EC5.0020.0002.A350] # YI SYLLABLE ZHOP
+A351 ; [.2EC6.0020.0002.A351] # YI SYLLABLE ZHET
+A352 ; [.2EC7.0020.0002.A352] # YI SYLLABLE ZHEX
+A353 ; [.2EC8.0020.0002.A353] # YI SYLLABLE ZHE
+A354 ; [.2EC9.0020.0002.A354] # YI SYLLABLE ZHEP
+A355 ; [.2ECA.0020.0002.A355] # YI SYLLABLE ZHUT
+A356 ; [.2ECB.0020.0002.A356] # YI SYLLABLE ZHUX
+A357 ; [.2ECC.0020.0002.A357] # YI SYLLABLE ZHU
+A358 ; [.2ECD.0020.0002.A358] # YI SYLLABLE ZHUP
+A359 ; [.2ECE.0020.0002.A359] # YI SYLLABLE ZHURX
+A35A ; [.2ECF.0020.0002.A35A] # YI SYLLABLE ZHUR
+A35B ; [.2ED0.0020.0002.A35B] # YI SYLLABLE ZHYT
+A35C ; [.2ED1.0020.0002.A35C] # YI SYLLABLE ZHYX
+A35D ; [.2ED2.0020.0002.A35D] # YI SYLLABLE ZHY
+A35E ; [.2ED3.0020.0002.A35E] # YI SYLLABLE ZHYP
+A35F ; [.2ED4.0020.0002.A35F] # YI SYLLABLE ZHYRX
+A360 ; [.2ED5.0020.0002.A360] # YI SYLLABLE ZHYR
+A361 ; [.2ED6.0020.0002.A361] # YI SYLLABLE CHAT
+A362 ; [.2ED7.0020.0002.A362] # YI SYLLABLE CHAX
+A363 ; [.2ED8.0020.0002.A363] # YI SYLLABLE CHA
+A364 ; [.2ED9.0020.0002.A364] # YI SYLLABLE CHAP
+A365 ; [.2EDA.0020.0002.A365] # YI SYLLABLE CHUOT
+A366 ; [.2EDB.0020.0002.A366] # YI SYLLABLE CHUOX
+A367 ; [.2EDC.0020.0002.A367] # YI SYLLABLE CHUO
+A368 ; [.2EDD.0020.0002.A368] # YI SYLLABLE CHUOP
+A369 ; [.2EDE.0020.0002.A369] # YI SYLLABLE CHOT
+A36A ; [.2EDF.0020.0002.A36A] # YI SYLLABLE CHOX
+A36B ; [.2EE0.0020.0002.A36B] # YI SYLLABLE CHO
+A36C ; [.2EE1.0020.0002.A36C] # YI SYLLABLE CHOP
+A36D ; [.2EE2.0020.0002.A36D] # YI SYLLABLE CHET
+A36E ; [.2EE3.0020.0002.A36E] # YI SYLLABLE CHEX
+A36F ; [.2EE4.0020.0002.A36F] # YI SYLLABLE CHE
+A370 ; [.2EE5.0020.0002.A370] # YI SYLLABLE CHEP
+A371 ; [.2EE6.0020.0002.A371] # YI SYLLABLE CHUX
+A372 ; [.2EE7.0020.0002.A372] # YI SYLLABLE CHU
+A373 ; [.2EE8.0020.0002.A373] # YI SYLLABLE CHUP
+A374 ; [.2EE9.0020.0002.A374] # YI SYLLABLE CHURX
+A375 ; [.2EEA.0020.0002.A375] # YI SYLLABLE CHUR
+A376 ; [.2EEB.0020.0002.A376] # YI SYLLABLE CHYT
+A377 ; [.2EEC.0020.0002.A377] # YI SYLLABLE CHYX
+A378 ; [.2EED.0020.0002.A378] # YI SYLLABLE CHY
+A379 ; [.2EEE.0020.0002.A379] # YI SYLLABLE CHYP
+A37A ; [.2EEF.0020.0002.A37A] # YI SYLLABLE CHYRX
+A37B ; [.2EF0.0020.0002.A37B] # YI SYLLABLE CHYR
+A37C ; [.2EF1.0020.0002.A37C] # YI SYLLABLE RRAX
+A37D ; [.2EF2.0020.0002.A37D] # YI SYLLABLE RRA
+A37E ; [.2EF3.0020.0002.A37E] # YI SYLLABLE RRUOX
+A37F ; [.2EF4.0020.0002.A37F] # YI SYLLABLE RRUO
+A380 ; [.2EF5.0020.0002.A380] # YI SYLLABLE RROT
+A381 ; [.2EF6.0020.0002.A381] # YI SYLLABLE RROX
+A382 ; [.2EF7.0020.0002.A382] # YI SYLLABLE RRO
+A383 ; [.2EF8.0020.0002.A383] # YI SYLLABLE RROP
+A384 ; [.2EF9.0020.0002.A384] # YI SYLLABLE RRET
+A385 ; [.2EFA.0020.0002.A385] # YI SYLLABLE RREX
+A386 ; [.2EFB.0020.0002.A386] # YI SYLLABLE RRE
+A387 ; [.2EFC.0020.0002.A387] # YI SYLLABLE RREP
+A388 ; [.2EFD.0020.0002.A388] # YI SYLLABLE RRUT
+A389 ; [.2EFE.0020.0002.A389] # YI SYLLABLE RRUX
+A38A ; [.2EFF.0020.0002.A38A] # YI SYLLABLE RRU
+A38B ; [.2F00.0020.0002.A38B] # YI SYLLABLE RRUP
+A38C ; [.2F01.0020.0002.A38C] # YI SYLLABLE RRURX
+A38D ; [.2F02.0020.0002.A38D] # YI SYLLABLE RRUR
+A38E ; [.2F03.0020.0002.A38E] # YI SYLLABLE RRYT
+A38F ; [.2F04.0020.0002.A38F] # YI SYLLABLE RRYX
+A390 ; [.2F05.0020.0002.A390] # YI SYLLABLE RRY
+A391 ; [.2F06.0020.0002.A391] # YI SYLLABLE RRYP
+A392 ; [.2F07.0020.0002.A392] # YI SYLLABLE RRYRX
+A393 ; [.2F08.0020.0002.A393] # YI SYLLABLE RRYR
+A394 ; [.2F09.0020.0002.A394] # YI SYLLABLE NRAT
+A395 ; [.2F0A.0020.0002.A395] # YI SYLLABLE NRAX
+A396 ; [.2F0B.0020.0002.A396] # YI SYLLABLE NRA
+A397 ; [.2F0C.0020.0002.A397] # YI SYLLABLE NRAP
+A398 ; [.2F0D.0020.0002.A398] # YI SYLLABLE NROX
+A399 ; [.2F0E.0020.0002.A399] # YI SYLLABLE NRO
+A39A ; [.2F0F.0020.0002.A39A] # YI SYLLABLE NROP
+A39B ; [.2F10.0020.0002.A39B] # YI SYLLABLE NRET
+A39C ; [.2F11.0020.0002.A39C] # YI SYLLABLE NREX
+A39D ; [.2F12.0020.0002.A39D] # YI SYLLABLE NRE
+A39E ; [.2F13.0020.0002.A39E] # YI SYLLABLE NREP
+A39F ; [.2F14.0020.0002.A39F] # YI SYLLABLE NRUT
+A3A0 ; [.2F15.0020.0002.A3A0] # YI SYLLABLE NRUX
+A3A1 ; [.2F16.0020.0002.A3A1] # YI SYLLABLE NRU
+A3A2 ; [.2F17.0020.0002.A3A2] # YI SYLLABLE NRUP
+A3A3 ; [.2F18.0020.0002.A3A3] # YI SYLLABLE NRURX
+A3A4 ; [.2F19.0020.0002.A3A4] # YI SYLLABLE NRUR
+A3A5 ; [.2F1A.0020.0002.A3A5] # YI SYLLABLE NRYT
+A3A6 ; [.2F1B.0020.0002.A3A6] # YI SYLLABLE NRYX
+A3A7 ; [.2F1C.0020.0002.A3A7] # YI SYLLABLE NRY
+A3A8 ; [.2F1D.0020.0002.A3A8] # YI SYLLABLE NRYP
+A3A9 ; [.2F1E.0020.0002.A3A9] # YI SYLLABLE NRYRX
+A3AA ; [.2F1F.0020.0002.A3AA] # YI SYLLABLE NRYR
+A3AB ; [.2F20.0020.0002.A3AB] # YI SYLLABLE SHAT
+A3AC ; [.2F21.0020.0002.A3AC] # YI SYLLABLE SHAX
+A3AD ; [.2F22.0020.0002.A3AD] # YI SYLLABLE SHA
+A3AE ; [.2F23.0020.0002.A3AE] # YI SYLLABLE SHAP
+A3AF ; [.2F24.0020.0002.A3AF] # YI SYLLABLE SHUOX
+A3B0 ; [.2F25.0020.0002.A3B0] # YI SYLLABLE SHUO
+A3B1 ; [.2F26.0020.0002.A3B1] # YI SYLLABLE SHUOP
+A3B2 ; [.2F27.0020.0002.A3B2] # YI SYLLABLE SHOT
+A3B3 ; [.2F28.0020.0002.A3B3] # YI SYLLABLE SHOX
+A3B4 ; [.2F29.0020.0002.A3B4] # YI SYLLABLE SHO
+A3B5 ; [.2F2A.0020.0002.A3B5] # YI SYLLABLE SHOP
+A3B6 ; [.2F2B.0020.0002.A3B6] # YI SYLLABLE SHET
+A3B7 ; [.2F2C.0020.0002.A3B7] # YI SYLLABLE SHEX
+A3B8 ; [.2F2D.0020.0002.A3B8] # YI SYLLABLE SHE
+A3B9 ; [.2F2E.0020.0002.A3B9] # YI SYLLABLE SHEP
+A3BA ; [.2F2F.0020.0002.A3BA] # YI SYLLABLE SHUT
+A3BB ; [.2F30.0020.0002.A3BB] # YI SYLLABLE SHUX
+A3BC ; [.2F31.0020.0002.A3BC] # YI SYLLABLE SHU
+A3BD ; [.2F32.0020.0002.A3BD] # YI SYLLABLE SHUP
+A3BE ; [.2F33.0020.0002.A3BE] # YI SYLLABLE SHURX
+A3BF ; [.2F34.0020.0002.A3BF] # YI SYLLABLE SHUR
+A3C0 ; [.2F35.0020.0002.A3C0] # YI SYLLABLE SHYT
+A3C1 ; [.2F36.0020.0002.A3C1] # YI SYLLABLE SHYX
+A3C2 ; [.2F37.0020.0002.A3C2] # YI SYLLABLE SHY
+A3C3 ; [.2F38.0020.0002.A3C3] # YI SYLLABLE SHYP
+A3C4 ; [.2F39.0020.0002.A3C4] # YI SYLLABLE SHYRX
+A3C5 ; [.2F3A.0020.0002.A3C5] # YI SYLLABLE SHYR
+A3C6 ; [.2F3B.0020.0002.A3C6] # YI SYLLABLE RAT
+A3C7 ; [.2F3C.0020.0002.A3C7] # YI SYLLABLE RAX
+A3C8 ; [.2F3D.0020.0002.A3C8] # YI SYLLABLE RA
+A3C9 ; [.2F3E.0020.0002.A3C9] # YI SYLLABLE RAP
+A3CA ; [.2F3F.0020.0002.A3CA] # YI SYLLABLE RUOX
+A3CB ; [.2F40.0020.0002.A3CB] # YI SYLLABLE RUO
+A3CC ; [.2F41.0020.0002.A3CC] # YI SYLLABLE RUOP
+A3CD ; [.2F42.0020.0002.A3CD] # YI SYLLABLE ROT
+A3CE ; [.2F43.0020.0002.A3CE] # YI SYLLABLE ROX
+A3CF ; [.2F44.0020.0002.A3CF] # YI SYLLABLE RO
+A3D0 ; [.2F45.0020.0002.A3D0] # YI SYLLABLE ROP
+A3D1 ; [.2F46.0020.0002.A3D1] # YI SYLLABLE REX
+A3D2 ; [.2F47.0020.0002.A3D2] # YI SYLLABLE RE
+A3D3 ; [.2F48.0020.0002.A3D3] # YI SYLLABLE REP
+A3D4 ; [.2F49.0020.0002.A3D4] # YI SYLLABLE RUT
+A3D5 ; [.2F4A.0020.0002.A3D5] # YI SYLLABLE RUX
+A3D6 ; [.2F4B.0020.0002.A3D6] # YI SYLLABLE RU
+A3D7 ; [.2F4C.0020.0002.A3D7] # YI SYLLABLE RUP
+A3D8 ; [.2F4D.0020.0002.A3D8] # YI SYLLABLE RURX
+A3D9 ; [.2F4E.0020.0002.A3D9] # YI SYLLABLE RUR
+A3DA ; [.2F4F.0020.0002.A3DA] # YI SYLLABLE RYT
+A3DB ; [.2F50.0020.0002.A3DB] # YI SYLLABLE RYX
+A3DC ; [.2F51.0020.0002.A3DC] # YI SYLLABLE RY
+A3DD ; [.2F52.0020.0002.A3DD] # YI SYLLABLE RYP
+A3DE ; [.2F53.0020.0002.A3DE] # YI SYLLABLE RYRX
+A3DF ; [.2F54.0020.0002.A3DF] # YI SYLLABLE RYR
+A3E0 ; [.2F55.0020.0002.A3E0] # YI SYLLABLE JIT
+A3E1 ; [.2F56.0020.0002.A3E1] # YI SYLLABLE JIX
+A3E2 ; [.2F57.0020.0002.A3E2] # YI SYLLABLE JI
+A3E3 ; [.2F58.0020.0002.A3E3] # YI SYLLABLE JIP
+A3E4 ; [.2F59.0020.0002.A3E4] # YI SYLLABLE JIET
+A3E5 ; [.2F5A.0020.0002.A3E5] # YI SYLLABLE JIEX
+A3E6 ; [.2F5B.0020.0002.A3E6] # YI SYLLABLE JIE
+A3E7 ; [.2F5C.0020.0002.A3E7] # YI SYLLABLE JIEP
+A3E8 ; [.2F5D.0020.0002.A3E8] # YI SYLLABLE JUOT
+A3E9 ; [.2F5E.0020.0002.A3E9] # YI SYLLABLE JUOX
+A3EA ; [.2F5F.0020.0002.A3EA] # YI SYLLABLE JUO
+A3EB ; [.2F60.0020.0002.A3EB] # YI SYLLABLE JUOP
+A3EC ; [.2F61.0020.0002.A3EC] # YI SYLLABLE JOT
+A3ED ; [.2F62.0020.0002.A3ED] # YI SYLLABLE JOX
+A3EE ; [.2F63.0020.0002.A3EE] # YI SYLLABLE JO
+A3EF ; [.2F64.0020.0002.A3EF] # YI SYLLABLE JOP
+A3F0 ; [.2F65.0020.0002.A3F0] # YI SYLLABLE JUT
+A3F1 ; [.2F66.0020.0002.A3F1] # YI SYLLABLE JUX
+A3F2 ; [.2F67.0020.0002.A3F2] # YI SYLLABLE JU
+A3F3 ; [.2F68.0020.0002.A3F3] # YI SYLLABLE JUP
+A3F4 ; [.2F69.0020.0002.A3F4] # YI SYLLABLE JURX
+A3F5 ; [.2F6A.0020.0002.A3F5] # YI SYLLABLE JUR
+A3F6 ; [.2F6B.0020.0002.A3F6] # YI SYLLABLE JYT
+A3F7 ; [.2F6C.0020.0002.A3F7] # YI SYLLABLE JYX
+A3F8 ; [.2F6D.0020.0002.A3F8] # YI SYLLABLE JY
+A3F9 ; [.2F6E.0020.0002.A3F9] # YI SYLLABLE JYP
+A3FA ; [.2F6F.0020.0002.A3FA] # YI SYLLABLE JYRX
+A3FB ; [.2F70.0020.0002.A3FB] # YI SYLLABLE JYR
+A3FC ; [.2F71.0020.0002.A3FC] # YI SYLLABLE QIT
+A3FD ; [.2F72.0020.0002.A3FD] # YI SYLLABLE QIX
+A3FE ; [.2F73.0020.0002.A3FE] # YI SYLLABLE QI
+A3FF ; [.2F74.0020.0002.A3FF] # YI SYLLABLE QIP
+A400 ; [.2F75.0020.0002.A400] # YI SYLLABLE QIET
+A401 ; [.2F76.0020.0002.A401] # YI SYLLABLE QIEX
+A402 ; [.2F77.0020.0002.A402] # YI SYLLABLE QIE
+A403 ; [.2F78.0020.0002.A403] # YI SYLLABLE QIEP
+A404 ; [.2F79.0020.0002.A404] # YI SYLLABLE QUOT
+A405 ; [.2F7A.0020.0002.A405] # YI SYLLABLE QUOX
+A406 ; [.2F7B.0020.0002.A406] # YI SYLLABLE QUO
+A407 ; [.2F7C.0020.0002.A407] # YI SYLLABLE QUOP
+A408 ; [.2F7D.0020.0002.A408] # YI SYLLABLE QOT
+A409 ; [.2F7E.0020.0002.A409] # YI SYLLABLE QOX
+A40A ; [.2F7F.0020.0002.A40A] # YI SYLLABLE QO
+A40B ; [.2F80.0020.0002.A40B] # YI SYLLABLE QOP
+A40C ; [.2F81.0020.0002.A40C] # YI SYLLABLE QUT
+A40D ; [.2F82.0020.0002.A40D] # YI SYLLABLE QUX
+A40E ; [.2F83.0020.0002.A40E] # YI SYLLABLE QU
+A40F ; [.2F84.0020.0002.A40F] # YI SYLLABLE QUP
+A410 ; [.2F85.0020.0002.A410] # YI SYLLABLE QURX
+A411 ; [.2F86.0020.0002.A411] # YI SYLLABLE QUR
+A412 ; [.2F87.0020.0002.A412] # YI SYLLABLE QYT
+A413 ; [.2F88.0020.0002.A413] # YI SYLLABLE QYX
+A414 ; [.2F89.0020.0002.A414] # YI SYLLABLE QY
+A415 ; [.2F8A.0020.0002.A415] # YI SYLLABLE QYP
+A416 ; [.2F8B.0020.0002.A416] # YI SYLLABLE QYRX
+A417 ; [.2F8C.0020.0002.A417] # YI SYLLABLE QYR
+A418 ; [.2F8D.0020.0002.A418] # YI SYLLABLE JJIT
+A419 ; [.2F8E.0020.0002.A419] # YI SYLLABLE JJIX
+A41A ; [.2F8F.0020.0002.A41A] # YI SYLLABLE JJI
+A41B ; [.2F90.0020.0002.A41B] # YI SYLLABLE JJIP
+A41C ; [.2F91.0020.0002.A41C] # YI SYLLABLE JJIET
+A41D ; [.2F92.0020.0002.A41D] # YI SYLLABLE JJIEX
+A41E ; [.2F93.0020.0002.A41E] # YI SYLLABLE JJIE
+A41F ; [.2F94.0020.0002.A41F] # YI SYLLABLE JJIEP
+A420 ; [.2F95.0020.0002.A420] # YI SYLLABLE JJUOX
+A421 ; [.2F96.0020.0002.A421] # YI SYLLABLE JJUO
+A422 ; [.2F97.0020.0002.A422] # YI SYLLABLE JJUOP
+A423 ; [.2F98.0020.0002.A423] # YI SYLLABLE JJOT
+A424 ; [.2F99.0020.0002.A424] # YI SYLLABLE JJOX
+A425 ; [.2F9A.0020.0002.A425] # YI SYLLABLE JJO
+A426 ; [.2F9B.0020.0002.A426] # YI SYLLABLE JJOP
+A427 ; [.2F9C.0020.0002.A427] # YI SYLLABLE JJUT
+A428 ; [.2F9D.0020.0002.A428] # YI SYLLABLE JJUX
+A429 ; [.2F9E.0020.0002.A429] # YI SYLLABLE JJU
+A42A ; [.2F9F.0020.0002.A42A] # YI SYLLABLE JJUP
+A42B ; [.2FA0.0020.0002.A42B] # YI SYLLABLE JJURX
+A42C ; [.2FA1.0020.0002.A42C] # YI SYLLABLE JJUR
+A42D ; [.2FA2.0020.0002.A42D] # YI SYLLABLE JJYT
+A42E ; [.2FA3.0020.0002.A42E] # YI SYLLABLE JJYX
+A42F ; [.2FA4.0020.0002.A42F] # YI SYLLABLE JJY
+A430 ; [.2FA5.0020.0002.A430] # YI SYLLABLE JJYP
+A431 ; [.2FA6.0020.0002.A431] # YI SYLLABLE NJIT
+A432 ; [.2FA7.0020.0002.A432] # YI SYLLABLE NJIX
+A433 ; [.2FA8.0020.0002.A433] # YI SYLLABLE NJI
+A434 ; [.2FA9.0020.0002.A434] # YI SYLLABLE NJIP
+A435 ; [.2FAA.0020.0002.A435] # YI SYLLABLE NJIET
+A436 ; [.2FAB.0020.0002.A436] # YI SYLLABLE NJIEX
+A437 ; [.2FAC.0020.0002.A437] # YI SYLLABLE NJIE
+A438 ; [.2FAD.0020.0002.A438] # YI SYLLABLE NJIEP
+A439 ; [.2FAE.0020.0002.A439] # YI SYLLABLE NJUOX
+A43A ; [.2FAF.0020.0002.A43A] # YI SYLLABLE NJUO
+A43B ; [.2FB0.0020.0002.A43B] # YI SYLLABLE NJOT
+A43C ; [.2FB1.0020.0002.A43C] # YI SYLLABLE NJOX
+A43D ; [.2FB2.0020.0002.A43D] # YI SYLLABLE NJO
+A43E ; [.2FB3.0020.0002.A43E] # YI SYLLABLE NJOP
+A43F ; [.2FB4.0020.0002.A43F] # YI SYLLABLE NJUX
+A440 ; [.2FB5.0020.0002.A440] # YI SYLLABLE NJU
+A441 ; [.2FB6.0020.0002.A441] # YI SYLLABLE NJUP
+A442 ; [.2FB7.0020.0002.A442] # YI SYLLABLE NJURX
+A443 ; [.2FB8.0020.0002.A443] # YI SYLLABLE NJUR
+A444 ; [.2FB9.0020.0002.A444] # YI SYLLABLE NJYT
+A445 ; [.2FBA.0020.0002.A445] # YI SYLLABLE NJYX
+A446 ; [.2FBB.0020.0002.A446] # YI SYLLABLE NJY
+A447 ; [.2FBC.0020.0002.A447] # YI SYLLABLE NJYP
+A448 ; [.2FBD.0020.0002.A448] # YI SYLLABLE NJYRX
+A449 ; [.2FBE.0020.0002.A449] # YI SYLLABLE NJYR
+A44A ; [.2FBF.0020.0002.A44A] # YI SYLLABLE NYIT
+A44B ; [.2FC0.0020.0002.A44B] # YI SYLLABLE NYIX
+A44C ; [.2FC1.0020.0002.A44C] # YI SYLLABLE NYI
+A44D ; [.2FC2.0020.0002.A44D] # YI SYLLABLE NYIP
+A44E ; [.2FC3.0020.0002.A44E] # YI SYLLABLE NYIET
+A44F ; [.2FC4.0020.0002.A44F] # YI SYLLABLE NYIEX
+A450 ; [.2FC5.0020.0002.A450] # YI SYLLABLE NYIE
+A451 ; [.2FC6.0020.0002.A451] # YI SYLLABLE NYIEP
+A452 ; [.2FC7.0020.0002.A452] # YI SYLLABLE NYUOX
+A453 ; [.2FC8.0020.0002.A453] # YI SYLLABLE NYUO
+A454 ; [.2FC9.0020.0002.A454] # YI SYLLABLE NYUOP
+A455 ; [.2FCA.0020.0002.A455] # YI SYLLABLE NYOT
+A456 ; [.2FCB.0020.0002.A456] # YI SYLLABLE NYOX
+A457 ; [.2FCC.0020.0002.A457] # YI SYLLABLE NYO
+A458 ; [.2FCD.0020.0002.A458] # YI SYLLABLE NYOP
+A459 ; [.2FCE.0020.0002.A459] # YI SYLLABLE NYUT
+A45A ; [.2FCF.0020.0002.A45A] # YI SYLLABLE NYUX
+A45B ; [.2FD0.0020.0002.A45B] # YI SYLLABLE NYU
+A45C ; [.2FD1.0020.0002.A45C] # YI SYLLABLE NYUP
+A45D ; [.2FD2.0020.0002.A45D] # YI SYLLABLE XIT
+A45E ; [.2FD3.0020.0002.A45E] # YI SYLLABLE XIX
+A45F ; [.2FD4.0020.0002.A45F] # YI SYLLABLE XI
+A460 ; [.2FD5.0020.0002.A460] # YI SYLLABLE XIP
+A461 ; [.2FD6.0020.0002.A461] # YI SYLLABLE XIET
+A462 ; [.2FD7.0020.0002.A462] # YI SYLLABLE XIEX
+A463 ; [.2FD8.0020.0002.A463] # YI SYLLABLE XIE
+A464 ; [.2FD9.0020.0002.A464] # YI SYLLABLE XIEP
+A465 ; [.2FDA.0020.0002.A465] # YI SYLLABLE XUOX
+A466 ; [.2FDB.0020.0002.A466] # YI SYLLABLE XUO
+A467 ; [.2FDC.0020.0002.A467] # YI SYLLABLE XOT
+A468 ; [.2FDD.0020.0002.A468] # YI SYLLABLE XOX
+A469 ; [.2FDE.0020.0002.A469] # YI SYLLABLE XO
+A46A ; [.2FDF.0020.0002.A46A] # YI SYLLABLE XOP
+A46B ; [.2FE0.0020.0002.A46B] # YI SYLLABLE XYT
+A46C ; [.2FE1.0020.0002.A46C] # YI SYLLABLE XYX
+A46D ; [.2FE2.0020.0002.A46D] # YI SYLLABLE XY
+A46E ; [.2FE3.0020.0002.A46E] # YI SYLLABLE XYP
+A46F ; [.2FE4.0020.0002.A46F] # YI SYLLABLE XYRX
+A470 ; [.2FE5.0020.0002.A470] # YI SYLLABLE XYR
+A471 ; [.2FE6.0020.0002.A471] # YI SYLLABLE YIT
+A472 ; [.2FE7.0020.0002.A472] # YI SYLLABLE YIX
+A473 ; [.2FE8.0020.0002.A473] # YI SYLLABLE YI
+A474 ; [.2FE9.0020.0002.A474] # YI SYLLABLE YIP
+A475 ; [.2FEA.0020.0002.A475] # YI SYLLABLE YIET
+A476 ; [.2FEB.0020.0002.A476] # YI SYLLABLE YIEX
+A477 ; [.2FEC.0020.0002.A477] # YI SYLLABLE YIE
+A478 ; [.2FED.0020.0002.A478] # YI SYLLABLE YIEP
+A479 ; [.2FEE.0020.0002.A479] # YI SYLLABLE YUOT
+A47A ; [.2FEF.0020.0002.A47A] # YI SYLLABLE YUOX
+A47B ; [.2FF0.0020.0002.A47B] # YI SYLLABLE YUO
+A47C ; [.2FF1.0020.0002.A47C] # YI SYLLABLE YUOP
+A47D ; [.2FF2.0020.0002.A47D] # YI SYLLABLE YOT
+A47E ; [.2FF3.0020.0002.A47E] # YI SYLLABLE YOX
+A47F ; [.2FF4.0020.0002.A47F] # YI SYLLABLE YO
+A480 ; [.2FF5.0020.0002.A480] # YI SYLLABLE YOP
+A481 ; [.2FF6.0020.0002.A481] # YI SYLLABLE YUT
+A482 ; [.2FF7.0020.0002.A482] # YI SYLLABLE YUX
+A483 ; [.2FF8.0020.0002.A483] # YI SYLLABLE YU
+A484 ; [.2FF9.0020.0002.A484] # YI SYLLABLE YUP
+A485 ; [.2FFA.0020.0002.A485] # YI SYLLABLE YURX
+A486 ; [.2FFB.0020.0002.A486] # YI SYLLABLE YUR
+A487 ; [.2FFC.0020.0002.A487] # YI SYLLABLE YYT
+A488 ; [.2FFD.0020.0002.A488] # YI SYLLABLE YYX
+A489 ; [.2FFE.0020.0002.A489] # YI SYLLABLE YY
+A48A ; [.2FFF.0020.0002.A48A] # YI SYLLABLE YYP
+A48B ; [.3000.0020.0002.A48B] # YI SYLLABLE YYRX
+A48C ; [.3001.0020.0002.A48C] # YI SYLLABLE YYR
+A4F8 ; [.3002.0020.0002.A4F8] # LISU LETTER TONE MYA TI
+A4F9 ; [.3003.0020.0002.A4F9] # LISU LETTER TONE NA PO
+A4FA ; [.3004.0020.0002.A4FA] # LISU LETTER TONE MYA CYA
+A4FB ; [.3005.0020.0002.A4FB] # LISU LETTER TONE MYA BO
+A4FD ; [.3006.0020.0002.A4FD] # LISU LETTER TONE MYA JEU
+A4FC ; [.3007.0020.0002.A4FC] # LISU LETTER TONE MYA NA
+A4D0 ; [.3008.0020.0002.A4D0] # LISU LETTER BA
+A4D1 ; [.3009.0020.0002.A4D1] # LISU LETTER PA
+A4D2 ; [.300A.0020.0002.A4D2] # LISU LETTER PHA
+A4D3 ; [.300B.0020.0002.A4D3] # LISU LETTER DA
+A4D4 ; [.300C.0020.0002.A4D4] # LISU LETTER TA
+A4D5 ; [.300D.0020.0002.A4D5] # LISU LETTER THA
+A4D6 ; [.300E.0020.0002.A4D6] # LISU LETTER GA
+A4D7 ; [.300F.0020.0002.A4D7] # LISU LETTER KA
+A4D8 ; [.3010.0020.0002.A4D8] # LISU LETTER KHA
+A4D9 ; [.3011.0020.0002.A4D9] # LISU LETTER JA
+A4DA ; [.3012.0020.0002.A4DA] # LISU LETTER CA
+A4DB ; [.3013.0020.0002.A4DB] # LISU LETTER CHA
+A4DC ; [.3014.0020.0002.A4DC] # LISU LETTER DZA
+A4DD ; [.3015.0020.0002.A4DD] # LISU LETTER TSA
+A4DE ; [.3016.0020.0002.A4DE] # LISU LETTER TSHA
+A4DF ; [.3017.0020.0002.A4DF] # LISU LETTER MA
+A4E0 ; [.3018.0020.0002.A4E0] # LISU LETTER NA
+A4E1 ; [.3019.0020.0002.A4E1] # LISU LETTER LA
+A4E2 ; [.301A.0020.0002.A4E2] # LISU LETTER SA
+A4E3 ; [.301B.0020.0002.A4E3] # LISU LETTER ZHA
+A4E4 ; [.301C.0020.0002.A4E4] # LISU LETTER ZA
+A4E5 ; [.301D.0020.0002.A4E5] # LISU LETTER NGA
+A4E6 ; [.301E.0020.0002.A4E6] # LISU LETTER HA
+A4E7 ; [.301F.0020.0002.A4E7] # LISU LETTER XA
+A4E8 ; [.3020.0020.0002.A4E8] # LISU LETTER HHA
+A4E9 ; [.3021.0020.0002.A4E9] # LISU LETTER FA
+A4EB ; [.3022.0020.0002.A4EB] # LISU LETTER SHA
+A4ED ; [.3023.0020.0002.A4ED] # LISU LETTER GHA
+A4EA ; [.3024.0020.0002.A4EA] # LISU LETTER WA
+A4EC ; [.3025.0020.0002.A4EC] # LISU LETTER YA
+A4EE ; [.3026.0020.0002.A4EE] # LISU LETTER A
+A4EF ; [.3027.0020.0002.A4EF] # LISU LETTER AE
+A4F0 ; [.3028.0020.0002.A4F0] # LISU LETTER E
+A4F1 ; [.3029.0020.0002.A4F1] # LISU LETTER EU
+A4F2 ; [.302A.0020.0002.A4F2] # LISU LETTER I
+A4F3 ; [.302B.0020.0002.A4F3] # LISU LETTER O
+A4F4 ; [.302C.0020.0002.A4F4] # LISU LETTER U
+A4F5 ; [.302D.0020.0002.A4F5] # LISU LETTER UE
+A4F6 ; [.302E.0020.0002.A4F6] # LISU LETTER UH
+A4F7 ; [.302F.0020.0002.A4F7] # LISU LETTER OE
+10280 ; [.3030.0020.0002.10280] # LYCIAN LETTER A
+10281 ; [.3031.0020.0002.10281] # LYCIAN LETTER E
+10282 ; [.3032.0020.0002.10282] # LYCIAN LETTER B
+10283 ; [.3033.0020.0002.10283] # LYCIAN LETTER BH
+10284 ; [.3034.0020.0002.10284] # LYCIAN LETTER G
+10285 ; [.3035.0020.0002.10285] # LYCIAN LETTER D
+10286 ; [.3036.0020.0002.10286] # LYCIAN LETTER I
+10287 ; [.3037.0020.0002.10287] # LYCIAN LETTER W
+10288 ; [.3038.0020.0002.10288] # LYCIAN LETTER Z
+10289 ; [.3039.0020.0002.10289] # LYCIAN LETTER TH
+1028A ; [.303A.0020.0002.1028A] # LYCIAN LETTER J
+1028B ; [.303B.0020.0002.1028B] # LYCIAN LETTER K
+1028C ; [.303C.0020.0002.1028C] # LYCIAN LETTER Q
+1028D ; [.303D.0020.0002.1028D] # LYCIAN LETTER L
+1028E ; [.303E.0020.0002.1028E] # LYCIAN LETTER M
+1028F ; [.303F.0020.0002.1028F] # LYCIAN LETTER N
+10290 ; [.3040.0020.0002.10290] # LYCIAN LETTER MM
+10291 ; [.3041.0020.0002.10291] # LYCIAN LETTER NN
+10292 ; [.3042.0020.0002.10292] # LYCIAN LETTER U
+10293 ; [.3043.0020.0002.10293] # LYCIAN LETTER P
+10294 ; [.3044.0020.0002.10294] # LYCIAN LETTER KK
+10295 ; [.3045.0020.0002.10295] # LYCIAN LETTER R
+10296 ; [.3046.0020.0002.10296] # LYCIAN LETTER S
+10297 ; [.3047.0020.0002.10297] # LYCIAN LETTER T
+10298 ; [.3048.0020.0002.10298] # LYCIAN LETTER TT
+10299 ; [.3049.0020.0002.10299] # LYCIAN LETTER AN
+1029A ; [.304A.0020.0002.1029A] # LYCIAN LETTER EN
+1029B ; [.304B.0020.0002.1029B] # LYCIAN LETTER H
+1029C ; [.304C.0020.0002.1029C] # LYCIAN LETTER X
+102A0 ; [.304D.0020.0002.102A0] # CARIAN LETTER A
+102A1 ; [.304E.0020.0002.102A1] # CARIAN LETTER P2
+102A2 ; [.304F.0020.0002.102A2] # CARIAN LETTER D
+102A3 ; [.3050.0020.0002.102A3] # CARIAN LETTER L
+102A4 ; [.3051.0020.0002.102A4] # CARIAN LETTER UUU
+102A5 ; [.3052.0020.0002.102A5] # CARIAN LETTER R
+102A6 ; [.3053.0020.0002.102A6] # CARIAN LETTER LD
+102A7 ; [.3054.0020.0002.102A7] # CARIAN LETTER A2
+102A8 ; [.3055.0020.0002.102A8] # CARIAN LETTER Q
+102A9 ; [.3056.0020.0002.102A9] # CARIAN LETTER B
+102AA ; [.3057.0020.0002.102AA] # CARIAN LETTER M
+102AB ; [.3058.0020.0002.102AB] # CARIAN LETTER O
+102AC ; [.3059.0020.0002.102AC] # CARIAN LETTER D2
+102AD ; [.305A.0020.0002.102AD] # CARIAN LETTER T
+102AE ; [.305B.0020.0002.102AE] # CARIAN LETTER SH
+102AF ; [.305C.0020.0002.102AF] # CARIAN LETTER SH2
+102B0 ; [.305D.0020.0002.102B0] # CARIAN LETTER S
+102B1 ; [.305E.0020.0002.102B1] # CARIAN LETTER C-18
+102B2 ; [.305F.0020.0002.102B2] # CARIAN LETTER U
+102B3 ; [.3060.0020.0002.102B3] # CARIAN LETTER NN
+102B4 ; [.3061.0020.0002.102B4] # CARIAN LETTER X
+102B5 ; [.3062.0020.0002.102B5] # CARIAN LETTER N
+102B6 ; [.3063.0020.0002.102B6] # CARIAN LETTER TT2
+102B7 ; [.3064.0020.0002.102B7] # CARIAN LETTER P
+102B8 ; [.3065.0020.0002.102B8] # CARIAN LETTER SS
+102B9 ; [.3066.0020.0002.102B9] # CARIAN LETTER I
+102BA ; [.3067.0020.0002.102BA] # CARIAN LETTER E
+102BB ; [.3068.0020.0002.102BB] # CARIAN LETTER UUUU
+102BC ; [.3069.0020.0002.102BC] # CARIAN LETTER K
+102BD ; [.306A.0020.0002.102BD] # CARIAN LETTER K2
+102BE ; [.306B.0020.0002.102BE] # CARIAN LETTER ND
+102BF ; [.306C.0020.0002.102BF] # CARIAN LETTER UU
+102C0 ; [.306D.0020.0002.102C0] # CARIAN LETTER G
+102C1 ; [.306E.0020.0002.102C1] # CARIAN LETTER G2
+102C2 ; [.306F.0020.0002.102C2] # CARIAN LETTER ST
+102C3 ; [.3070.0020.0002.102C3] # CARIAN LETTER ST2
+102C4 ; [.3071.0020.0002.102C4] # CARIAN LETTER NG
+102C5 ; [.3072.0020.0002.102C5] # CARIAN LETTER II
+102C6 ; [.3073.0020.0002.102C6] # CARIAN LETTER C-39
+102C7 ; [.3074.0020.0002.102C7] # CARIAN LETTER TT
+102C8 ; [.3075.0020.0002.102C8] # CARIAN LETTER UUU2
+102C9 ; [.3076.0020.0002.102C9] # CARIAN LETTER RR
+102CA ; [.3077.0020.0002.102CA] # CARIAN LETTER MB
+102CB ; [.3078.0020.0002.102CB] # CARIAN LETTER MB2
+102CC ; [.3079.0020.0002.102CC] # CARIAN LETTER MB3
+102CD ; [.307A.0020.0002.102CD] # CARIAN LETTER MB4
+102CE ; [.307B.0020.0002.102CE] # CARIAN LETTER LD2
+102CF ; [.307C.0020.0002.102CF] # CARIAN LETTER E2
+102D0 ; [.307D.0020.0002.102D0] # CARIAN LETTER UUU3
+10920 ; [.307E.0020.0002.10920] # LYDIAN LETTER A
+10921 ; [.307F.0020.0002.10921] # LYDIAN LETTER B
+10922 ; [.3080.0020.0002.10922] # LYDIAN LETTER G
+10923 ; [.3081.0020.0002.10923] # LYDIAN LETTER D
+10924 ; [.3082.0020.0002.10924] # LYDIAN LETTER E
+10925 ; [.3083.0020.0002.10925] # LYDIAN LETTER V
+10926 ; [.3084.0020.0002.10926] # LYDIAN LETTER I
+10927 ; [.3085.0020.0002.10927] # LYDIAN LETTER Y
+10928 ; [.3086.0020.0002.10928] # LYDIAN LETTER K
+10929 ; [.3087.0020.0002.10929] # LYDIAN LETTER L
+1092A ; [.3088.0020.0002.1092A] # LYDIAN LETTER M
+1092B ; [.3089.0020.0002.1092B] # LYDIAN LETTER N
+1092C ; [.308A.0020.0002.1092C] # LYDIAN LETTER O
+1092D ; [.308B.0020.0002.1092D] # LYDIAN LETTER R
+1092E ; [.308C.0020.0002.1092E] # LYDIAN LETTER SS
+1092F ; [.308D.0020.0002.1092F] # LYDIAN LETTER T
+10930 ; [.308E.0020.0002.10930] # LYDIAN LETTER U
+10931 ; [.308F.0020.0002.10931] # LYDIAN LETTER F
+10932 ; [.3090.0020.0002.10932] # LYDIAN LETTER Q
+10933 ; [.3091.0020.0002.10933] # LYDIAN LETTER S
+10934 ; [.3092.0020.0002.10934] # LYDIAN LETTER TT
+10935 ; [.3093.0020.0002.10935] # LYDIAN LETTER AN
+10936 ; [.3094.0020.0002.10936] # LYDIAN LETTER EN
+10937 ; [.3095.0020.0002.10937] # LYDIAN LETTER LY
+10938 ; [.3096.0020.0002.10938] # LYDIAN LETTER NN
+10939 ; [.3097.0020.0002.10939] # LYDIAN LETTER C
+10300 ; [.3098.0020.0002.10300] # OLD ITALIC LETTER A
+10301 ; [.3099.0020.0002.10301] # OLD ITALIC LETTER BE
+10302 ; [.309A.0020.0002.10302] # OLD ITALIC LETTER KE
+10303 ; [.309B.0020.0002.10303] # OLD ITALIC LETTER DE
+10304 ; [.309C.0020.0002.10304] # OLD ITALIC LETTER E
+10305 ; [.309D.0020.0002.10305] # OLD ITALIC LETTER VE
+10306 ; [.309E.0020.0002.10306] # OLD ITALIC LETTER ZE
+10307 ; [.309F.0020.0002.10307] # OLD ITALIC LETTER HE
+10308 ; [.30A0.0020.0002.10308] # OLD ITALIC LETTER THE
+10309 ; [.30A1.0020.0002.10309] # OLD ITALIC LETTER I
+1030A ; [.30A2.0020.0002.1030A] # OLD ITALIC LETTER KA
+1030B ; [.30A3.0020.0002.1030B] # OLD ITALIC LETTER EL
+1030C ; [.30A4.0020.0002.1030C] # OLD ITALIC LETTER EM
+1030D ; [.30A5.0020.0002.1030D] # OLD ITALIC LETTER EN
+1030E ; [.30A6.0020.0002.1030E] # OLD ITALIC LETTER ESH
+1030F ; [.30A7.0020.0002.1030F] # OLD ITALIC LETTER O
+10310 ; [.30A8.0020.0002.10310] # OLD ITALIC LETTER PE
+10311 ; [.30A9.0020.0002.10311] # OLD ITALIC LETTER SHE
+10312 ; [.30AA.0020.0002.10312] # OLD ITALIC LETTER KU
+10313 ; [.30AB.0020.0002.10313] # OLD ITALIC LETTER ER
+10314 ; [.30AC.0020.0002.10314] # OLD ITALIC LETTER ES
+10315 ; [.30AD.0020.0002.10315] # OLD ITALIC LETTER TE
+10316 ; [.30AE.0020.0002.10316] # OLD ITALIC LETTER U
+10317 ; [.30AF.0020.0002.10317] # OLD ITALIC LETTER EKS
+10318 ; [.30B0.0020.0002.10318] # OLD ITALIC LETTER PHE
+10319 ; [.30B1.0020.0002.10319] # OLD ITALIC LETTER KHE
+1031A ; [.30B2.0020.0002.1031A] # OLD ITALIC LETTER EF
+1031B ; [.30B3.0020.0002.1031B] # OLD ITALIC LETTER ERS
+1031C ; [.30B4.0020.0002.1031C] # OLD ITALIC LETTER CHE
+1031D ; [.30B5.0020.0002.1031D] # OLD ITALIC LETTER II
+1031E ; [.30B6.0020.0002.1031E] # OLD ITALIC LETTER UU
+10330 ; [.30B7.0020.0002.10330] # GOTHIC LETTER AHSA
+10331 ; [.30B8.0020.0002.10331] # GOTHIC LETTER BAIRKAN
+10332 ; [.30B9.0020.0002.10332] # GOTHIC LETTER GIBA
+10333 ; [.30BA.0020.0002.10333] # GOTHIC LETTER DAGS
+10334 ; [.30BB.0020.0002.10334] # GOTHIC LETTER AIHVUS
+10335 ; [.30BC.0020.0002.10335] # GOTHIC LETTER QAIRTHRA
+10336 ; [.30BD.0020.0002.10336] # GOTHIC LETTER IUJA
+10337 ; [.30BE.0020.0002.10337] # GOTHIC LETTER HAGL
+10338 ; [.30BF.0020.0002.10338] # GOTHIC LETTER THIUTH
+10339 ; [.30C0.0020.0002.10339] # GOTHIC LETTER EIS
+1033A ; [.30C1.0020.0002.1033A] # GOTHIC LETTER KUSMA
+1033B ; [.30C2.0020.0002.1033B] # GOTHIC LETTER LAGUS
+1033C ; [.30C3.0020.0002.1033C] # GOTHIC LETTER MANNA
+1033D ; [.30C4.0020.0002.1033D] # GOTHIC LETTER NAUTHS
+1033E ; [.30C5.0020.0002.1033E] # GOTHIC LETTER JER
+1033F ; [.30C6.0020.0002.1033F] # GOTHIC LETTER URUS
+10340 ; [.30C7.0020.0002.10340] # GOTHIC LETTER PAIRTHRA
+10341 ; [.30C8.0020.0002.10341] # GOTHIC LETTER NINETY
+10342 ; [.30C9.0020.0002.10342] # GOTHIC LETTER RAIDA
+10343 ; [.30CA.0020.0002.10343] # GOTHIC LETTER SAUIL
+10344 ; [.30CB.0020.0002.10344] # GOTHIC LETTER TEIWS
+10345 ; [.30CC.0020.0002.10345] # GOTHIC LETTER WINJA
+10346 ; [.30CD.0020.0002.10346] # GOTHIC LETTER FAIHU
+10347 ; [.30CE.0020.0002.10347] # GOTHIC LETTER IGGWS
+10348 ; [.30CF.0020.0002.10348] # GOTHIC LETTER HWAIR
+10349 ; [.30D0.0020.0002.10349] # GOTHIC LETTER OTHAL
+1034A ; [.30D1.0020.0002.1034A] # GOTHIC LETTER NINE HUNDRED
+10428 ; [.30D2.0020.0002.10428] # DESERET SMALL LETTER LONG I
+10400 ; [.30D2.0020.0008.10400] # DESERET CAPITAL LETTER LONG I
+10429 ; [.30D3.0020.0002.10429] # DESERET SMALL LETTER LONG E
+10401 ; [.30D3.0020.0008.10401] # DESERET CAPITAL LETTER LONG E
+1042A ; [.30D4.0020.0002.1042A] # DESERET SMALL LETTER LONG A
+10402 ; [.30D4.0020.0008.10402] # DESERET CAPITAL LETTER LONG A
+1042B ; [.30D5.0020.0002.1042B] # DESERET SMALL LETTER LONG AH
+10403 ; [.30D5.0020.0008.10403] # DESERET CAPITAL LETTER LONG AH
+1042C ; [.30D6.0020.0002.1042C] # DESERET SMALL LETTER LONG O
+10404 ; [.30D6.0020.0008.10404] # DESERET CAPITAL LETTER LONG O
+1042D ; [.30D7.0020.0002.1042D] # DESERET SMALL LETTER LONG OO
+10405 ; [.30D7.0020.0008.10405] # DESERET CAPITAL LETTER LONG OO
+1042E ; [.30D8.0020.0002.1042E] # DESERET SMALL LETTER SHORT I
+10406 ; [.30D8.0020.0008.10406] # DESERET CAPITAL LETTER SHORT I
+1042F ; [.30D9.0020.0002.1042F] # DESERET SMALL LETTER SHORT E
+10407 ; [.30D9.0020.0008.10407] # DESERET CAPITAL LETTER SHORT E
+10430 ; [.30DA.0020.0002.10430] # DESERET SMALL LETTER SHORT A
+10408 ; [.30DA.0020.0008.10408] # DESERET CAPITAL LETTER SHORT A
+10431 ; [.30DB.0020.0002.10431] # DESERET SMALL LETTER SHORT AH
+10409 ; [.30DB.0020.0008.10409] # DESERET CAPITAL LETTER SHORT AH
+10432 ; [.30DC.0020.0002.10432] # DESERET SMALL LETTER SHORT O
+1040A ; [.30DC.0020.0008.1040A] # DESERET CAPITAL LETTER SHORT O
+10433 ; [.30DD.0020.0002.10433] # DESERET SMALL LETTER SHORT OO
+1040B ; [.30DD.0020.0008.1040B] # DESERET CAPITAL LETTER SHORT OO
+10434 ; [.30DE.0020.0002.10434] # DESERET SMALL LETTER AY
+1040C ; [.30DE.0020.0008.1040C] # DESERET CAPITAL LETTER AY
+10435 ; [.30DF.0020.0002.10435] # DESERET SMALL LETTER OW
+1040D ; [.30DF.0020.0008.1040D] # DESERET CAPITAL LETTER OW
+10436 ; [.30E0.0020.0002.10436] # DESERET SMALL LETTER WU
+1040E ; [.30E0.0020.0008.1040E] # DESERET CAPITAL LETTER WU
+10437 ; [.30E1.0020.0002.10437] # DESERET SMALL LETTER YEE
+1040F ; [.30E1.0020.0008.1040F] # DESERET CAPITAL LETTER YEE
+10438 ; [.30E2.0020.0002.10438] # DESERET SMALL LETTER H
+10410 ; [.30E2.0020.0008.10410] # DESERET CAPITAL LETTER H
+10439 ; [.30E3.0020.0002.10439] # DESERET SMALL LETTER PEE
+10411 ; [.30E3.0020.0008.10411] # DESERET CAPITAL LETTER PEE
+1043A ; [.30E4.0020.0002.1043A] # DESERET SMALL LETTER BEE
+10412 ; [.30E4.0020.0008.10412] # DESERET CAPITAL LETTER BEE
+1043B ; [.30E5.0020.0002.1043B] # DESERET SMALL LETTER TEE
+10413 ; [.30E5.0020.0008.10413] # DESERET CAPITAL LETTER TEE
+1043C ; [.30E6.0020.0002.1043C] # DESERET SMALL LETTER DEE
+10414 ; [.30E6.0020.0008.10414] # DESERET CAPITAL LETTER DEE
+1043D ; [.30E7.0020.0002.1043D] # DESERET SMALL LETTER CHEE
+10415 ; [.30E7.0020.0008.10415] # DESERET CAPITAL LETTER CHEE
+1043E ; [.30E8.0020.0002.1043E] # DESERET SMALL LETTER JEE
+10416 ; [.30E8.0020.0008.10416] # DESERET CAPITAL LETTER JEE
+1043F ; [.30E9.0020.0002.1043F] # DESERET SMALL LETTER KAY
+10417 ; [.30E9.0020.0008.10417] # DESERET CAPITAL LETTER KAY
+10440 ; [.30EA.0020.0002.10440] # DESERET SMALL LETTER GAY
+10418 ; [.30EA.0020.0008.10418] # DESERET CAPITAL LETTER GAY
+10441 ; [.30EB.0020.0002.10441] # DESERET SMALL LETTER EF
+10419 ; [.30EB.0020.0008.10419] # DESERET CAPITAL LETTER EF
+10442 ; [.30EC.0020.0002.10442] # DESERET SMALL LETTER VEE
+1041A ; [.30EC.0020.0008.1041A] # DESERET CAPITAL LETTER VEE
+10443 ; [.30ED.0020.0002.10443] # DESERET SMALL LETTER ETH
+1041B ; [.30ED.0020.0008.1041B] # DESERET CAPITAL LETTER ETH
+10444 ; [.30EE.0020.0002.10444] # DESERET SMALL LETTER THEE
+1041C ; [.30EE.0020.0008.1041C] # DESERET CAPITAL LETTER THEE
+10445 ; [.30EF.0020.0002.10445] # DESERET SMALL LETTER ES
+1041D ; [.30EF.0020.0008.1041D] # DESERET CAPITAL LETTER ES
+10446 ; [.30F0.0020.0002.10446] # DESERET SMALL LETTER ZEE
+1041E ; [.30F0.0020.0008.1041E] # DESERET CAPITAL LETTER ZEE
+10447 ; [.30F1.0020.0002.10447] # DESERET SMALL LETTER ESH
+1041F ; [.30F1.0020.0008.1041F] # DESERET CAPITAL LETTER ESH
+10448 ; [.30F2.0020.0002.10448] # DESERET SMALL LETTER ZHEE
+10420 ; [.30F2.0020.0008.10420] # DESERET CAPITAL LETTER ZHEE
+10449 ; [.30F3.0020.0002.10449] # DESERET SMALL LETTER ER
+10421 ; [.30F3.0020.0008.10421] # DESERET CAPITAL LETTER ER
+1044A ; [.30F4.0020.0002.1044A] # DESERET SMALL LETTER EL
+10422 ; [.30F4.0020.0008.10422] # DESERET CAPITAL LETTER EL
+1044B ; [.30F5.0020.0002.1044B] # DESERET SMALL LETTER EM
+10423 ; [.30F5.0020.0008.10423] # DESERET CAPITAL LETTER EM
+1044C ; [.30F6.0020.0002.1044C] # DESERET SMALL LETTER EN
+10424 ; [.30F6.0020.0008.10424] # DESERET CAPITAL LETTER EN
+1044D ; [.30F7.0020.0002.1044D] # DESERET SMALL LETTER ENG
+10425 ; [.30F7.0020.0008.10425] # DESERET CAPITAL LETTER ENG
+1044E ; [.30F8.0020.0002.1044E] # DESERET SMALL LETTER OI
+10426 ; [.30F8.0020.0008.10426] # DESERET CAPITAL LETTER OI
+1044F ; [.30F9.0020.0002.1044F] # DESERET SMALL LETTER EW
+10427 ; [.30F9.0020.0008.10427] # DESERET CAPITAL LETTER EW
+10450 ; [.30FA.0020.0002.10450] # SHAVIAN LETTER PEEP
+10451 ; [.30FB.0020.0002.10451] # SHAVIAN LETTER TOT
+10452 ; [.30FC.0020.0002.10452] # SHAVIAN LETTER KICK
+10453 ; [.30FD.0020.0002.10453] # SHAVIAN LETTER FEE
+10454 ; [.30FE.0020.0002.10454] # SHAVIAN LETTER THIGH
+10455 ; [.30FF.0020.0002.10455] # SHAVIAN LETTER SO
+10456 ; [.3100.0020.0002.10456] # SHAVIAN LETTER SURE
+10457 ; [.3101.0020.0002.10457] # SHAVIAN LETTER CHURCH
+10458 ; [.3102.0020.0002.10458] # SHAVIAN LETTER YEA
+10459 ; [.3103.0020.0002.10459] # SHAVIAN LETTER HUNG
+1045A ; [.3104.0020.0002.1045A] # SHAVIAN LETTER BIB
+1045B ; [.3105.0020.0002.1045B] # SHAVIAN LETTER DEAD
+1045C ; [.3106.0020.0002.1045C] # SHAVIAN LETTER GAG
+1045D ; [.3107.0020.0002.1045D] # SHAVIAN LETTER VOW
+1045E ; [.3108.0020.0002.1045E] # SHAVIAN LETTER THEY
+1045F ; [.3109.0020.0002.1045F] # SHAVIAN LETTER ZOO
+10460 ; [.310A.0020.0002.10460] # SHAVIAN LETTER MEASURE
+10461 ; [.310B.0020.0002.10461] # SHAVIAN LETTER JUDGE
+10462 ; [.310C.0020.0002.10462] # SHAVIAN LETTER WOE
+10463 ; [.310D.0020.0002.10463] # SHAVIAN LETTER HA-HA
+10464 ; [.310E.0020.0002.10464] # SHAVIAN LETTER LOLL
+10465 ; [.310F.0020.0002.10465] # SHAVIAN LETTER MIME
+10466 ; [.3110.0020.0002.10466] # SHAVIAN LETTER IF
+10467 ; [.3111.0020.0002.10467] # SHAVIAN LETTER EGG
+10468 ; [.3112.0020.0002.10468] # SHAVIAN LETTER ASH
+10469 ; [.3113.0020.0002.10469] # SHAVIAN LETTER ADO
+1046A ; [.3114.0020.0002.1046A] # SHAVIAN LETTER ON
+1046B ; [.3115.0020.0002.1046B] # SHAVIAN LETTER WOOL
+1046C ; [.3116.0020.0002.1046C] # SHAVIAN LETTER OUT
+1046D ; [.3117.0020.0002.1046D] # SHAVIAN LETTER AH
+1046E ; [.3118.0020.0002.1046E] # SHAVIAN LETTER ROAR
+1046F ; [.3119.0020.0002.1046F] # SHAVIAN LETTER NUN
+10470 ; [.311A.0020.0002.10470] # SHAVIAN LETTER EAT
+10471 ; [.311B.0020.0002.10471] # SHAVIAN LETTER AGE
+10472 ; [.311C.0020.0002.10472] # SHAVIAN LETTER ICE
+10473 ; [.311D.0020.0002.10473] # SHAVIAN LETTER UP
+10474 ; [.311E.0020.0002.10474] # SHAVIAN LETTER OAK
+10475 ; [.311F.0020.0002.10475] # SHAVIAN LETTER OOZE
+10476 ; [.3120.0020.0002.10476] # SHAVIAN LETTER OIL
+10477 ; [.3121.0020.0002.10477] # SHAVIAN LETTER AWE
+10478 ; [.3122.0020.0002.10478] # SHAVIAN LETTER ARE
+10479 ; [.3123.0020.0002.10479] # SHAVIAN LETTER OR
+1047A ; [.3124.0020.0002.1047A] # SHAVIAN LETTER AIR
+1047B ; [.3125.0020.0002.1047B] # SHAVIAN LETTER ERR
+1047C ; [.3126.0020.0002.1047C] # SHAVIAN LETTER ARRAY
+1047D ; [.3127.0020.0002.1047D] # SHAVIAN LETTER EAR
+1047E ; [.3128.0020.0002.1047E] # SHAVIAN LETTER IAN
+1047F ; [.3129.0020.0002.1047F] # SHAVIAN LETTER YEW
+10480 ; [.312A.0020.0002.10480] # OSMANYA LETTER ALEF
+10481 ; [.312B.0020.0002.10481] # OSMANYA LETTER BA
+10482 ; [.312C.0020.0002.10482] # OSMANYA LETTER TA
+10483 ; [.312D.0020.0002.10483] # OSMANYA LETTER JA
+10484 ; [.312E.0020.0002.10484] # OSMANYA LETTER XA
+10485 ; [.312F.0020.0002.10485] # OSMANYA LETTER KHA
+10486 ; [.3130.0020.0002.10486] # OSMANYA LETTER DEEL
+10487 ; [.3131.0020.0002.10487] # OSMANYA LETTER RA
+10488 ; [.3132.0020.0002.10488] # OSMANYA LETTER SA
+10489 ; [.3133.0020.0002.10489] # OSMANYA LETTER SHIIN
+1048A ; [.3134.0020.0002.1048A] # OSMANYA LETTER DHA
+1048B ; [.3135.0020.0002.1048B] # OSMANYA LETTER CAYN
+1048C ; [.3136.0020.0002.1048C] # OSMANYA LETTER GA
+1048D ; [.3137.0020.0002.1048D] # OSMANYA LETTER FA
+1048E ; [.3138.0020.0002.1048E] # OSMANYA LETTER QAAF
+1048F ; [.3139.0020.0002.1048F] # OSMANYA LETTER KAAF
+10490 ; [.313A.0020.0002.10490] # OSMANYA LETTER LAAN
+10491 ; [.313B.0020.0002.10491] # OSMANYA LETTER MIIN
+10492 ; [.313C.0020.0002.10492] # OSMANYA LETTER NUUN
+10493 ; [.313D.0020.0002.10493] # OSMANYA LETTER WAW
+10494 ; [.313E.0020.0002.10494] # OSMANYA LETTER HA
+10495 ; [.313F.0020.0002.10495] # OSMANYA LETTER YA
+10496 ; [.3140.0020.0002.10496] # OSMANYA LETTER A
+10497 ; [.3141.0020.0002.10497] # OSMANYA LETTER E
+10498 ; [.3142.0020.0002.10498] # OSMANYA LETTER I
+10499 ; [.3143.0020.0002.10499] # OSMANYA LETTER O
+1049A ; [.3144.0020.0002.1049A] # OSMANYA LETTER U
+1049B ; [.3145.0020.0002.1049B] # OSMANYA LETTER AA
+1049C ; [.3146.0020.0002.1049C] # OSMANYA LETTER EE
+1049D ; [.3147.0020.0002.1049D] # OSMANYA LETTER OO
+10000 ; [.3148.0020.0002.10000] # LINEAR B SYLLABLE B008 A
+10001 ; [.3149.0020.0002.10001] # LINEAR B SYLLABLE B038 E
+10002 ; [.314A.0020.0002.10002] # LINEAR B SYLLABLE B028 I
+10003 ; [.314B.0020.0002.10003] # LINEAR B SYLLABLE B061 O
+10004 ; [.314C.0020.0002.10004] # LINEAR B SYLLABLE B010 U
+10005 ; [.314D.0020.0002.10005] # LINEAR B SYLLABLE B001 DA
+10006 ; [.314E.0020.0002.10006] # LINEAR B SYLLABLE B045 DE
+10007 ; [.314F.0020.0002.10007] # LINEAR B SYLLABLE B007 DI
+10008 ; [.3150.0020.0002.10008] # LINEAR B SYLLABLE B014 DO
+10009 ; [.3151.0020.0002.10009] # LINEAR B SYLLABLE B051 DU
+1000A ; [.3152.0020.0002.1000A] # LINEAR B SYLLABLE B057 JA
+1000B ; [.3153.0020.0002.1000B] # LINEAR B SYLLABLE B046 JE
+1000D ; [.3154.0020.0002.1000D] # LINEAR B SYLLABLE B036 JO
+1000E ; [.3155.0020.0002.1000E] # LINEAR B SYLLABLE B065 JU
+1000F ; [.3156.0020.0002.1000F] # LINEAR B SYLLABLE B077 KA
+10010 ; [.3157.0020.0002.10010] # LINEAR B SYLLABLE B044 KE
+10011 ; [.3158.0020.0002.10011] # LINEAR B SYLLABLE B067 KI
+10012 ; [.3159.0020.0002.10012] # LINEAR B SYLLABLE B070 KO
+10013 ; [.315A.0020.0002.10013] # LINEAR B SYLLABLE B081 KU
+10014 ; [.315B.0020.0002.10014] # LINEAR B SYLLABLE B080 MA
+10015 ; [.315C.0020.0002.10015] # LINEAR B SYLLABLE B013 ME
+10016 ; [.315D.0020.0002.10016] # LINEAR B SYLLABLE B073 MI
+10017 ; [.315E.0020.0002.10017] # LINEAR B SYLLABLE B015 MO
+10018 ; [.315F.0020.0002.10018] # LINEAR B SYLLABLE B023 MU
+10019 ; [.3160.0020.0002.10019] # LINEAR B SYLLABLE B006 NA
+1001A ; [.3161.0020.0002.1001A] # LINEAR B SYLLABLE B024 NE
+1001B ; [.3162.0020.0002.1001B] # LINEAR B SYLLABLE B030 NI
+1001C ; [.3163.0020.0002.1001C] # LINEAR B SYLLABLE B052 NO
+1001D ; [.3164.0020.0002.1001D] # LINEAR B SYLLABLE B055 NU
+1001E ; [.3165.0020.0002.1001E] # LINEAR B SYLLABLE B003 PA
+1001F ; [.3166.0020.0002.1001F] # LINEAR B SYLLABLE B072 PE
+10020 ; [.3167.0020.0002.10020] # LINEAR B SYLLABLE B039 PI
+10021 ; [.3168.0020.0002.10021] # LINEAR B SYLLABLE B011 PO
+10022 ; [.3169.0020.0002.10022] # LINEAR B SYLLABLE B050 PU
+10023 ; [.316A.0020.0002.10023] # LINEAR B SYLLABLE B016 QA
+10024 ; [.316B.0020.0002.10024] # LINEAR B SYLLABLE B078 QE
+10025 ; [.316C.0020.0002.10025] # LINEAR B SYLLABLE B021 QI
+10026 ; [.316D.0020.0002.10026] # LINEAR B SYLLABLE B032 QO
+10028 ; [.316E.0020.0002.10028] # LINEAR B SYLLABLE B060 RA
+10029 ; [.316F.0020.0002.10029] # LINEAR B SYLLABLE B027 RE
+1002A ; [.3170.0020.0002.1002A] # LINEAR B SYLLABLE B053 RI
+1002B ; [.3171.0020.0002.1002B] # LINEAR B SYLLABLE B002 RO
+1002C ; [.3172.0020.0002.1002C] # LINEAR B SYLLABLE B026 RU
+1002D ; [.3173.0020.0002.1002D] # LINEAR B SYLLABLE B031 SA
+1002E ; [.3174.0020.0002.1002E] # LINEAR B SYLLABLE B009 SE
+1002F ; [.3175.0020.0002.1002F] # LINEAR B SYLLABLE B041 SI
+10030 ; [.3176.0020.0002.10030] # LINEAR B SYLLABLE B012 SO
+10031 ; [.3177.0020.0002.10031] # LINEAR B SYLLABLE B058 SU
+10032 ; [.3178.0020.0002.10032] # LINEAR B SYLLABLE B059 TA
+10033 ; [.3179.0020.0002.10033] # LINEAR B SYLLABLE B004 TE
+10034 ; [.317A.0020.0002.10034] # LINEAR B SYLLABLE B037 TI
+10035 ; [.317B.0020.0002.10035] # LINEAR B SYLLABLE B005 TO
+10036 ; [.317C.0020.0002.10036] # LINEAR B SYLLABLE B069 TU
+10037 ; [.317D.0020.0002.10037] # LINEAR B SYLLABLE B054 WA
+10038 ; [.317E.0020.0002.10038] # LINEAR B SYLLABLE B075 WE
+10039 ; [.317F.0020.0002.10039] # LINEAR B SYLLABLE B040 WI
+1003A ; [.3180.0020.0002.1003A] # LINEAR B SYLLABLE B042 WO
+1003C ; [.3181.0020.0002.1003C] # LINEAR B SYLLABLE B017 ZA
+1003D ; [.3182.0020.0002.1003D] # LINEAR B SYLLABLE B074 ZE
+1003F ; [.3183.0020.0002.1003F] # LINEAR B SYLLABLE B020 ZO
+10040 ; [.3184.0020.0002.10040] # LINEAR B SYLLABLE B025 A2
+10041 ; [.3185.0020.0002.10041] # LINEAR B SYLLABLE B043 A3
+10042 ; [.3186.0020.0002.10042] # LINEAR B SYLLABLE B085 AU
+10043 ; [.3187.0020.0002.10043] # LINEAR B SYLLABLE B071 DWE
+10044 ; [.3188.0020.0002.10044] # LINEAR B SYLLABLE B090 DWO
+10045 ; [.3189.0020.0002.10045] # LINEAR B SYLLABLE B048 NWA
+10046 ; [.318A.0020.0002.10046] # LINEAR B SYLLABLE B029 PU2
+10047 ; [.318B.0020.0002.10047] # LINEAR B SYLLABLE B062 PTE
+10048 ; [.318C.0020.0002.10048] # LINEAR B SYLLABLE B076 RA2
+10049 ; [.318D.0020.0002.10049] # LINEAR B SYLLABLE B033 RA3
+1004A ; [.318E.0020.0002.1004A] # LINEAR B SYLLABLE B068 RO2
+1004B ; [.318F.0020.0002.1004B] # LINEAR B SYLLABLE B066 TA2
+1004C ; [.3190.0020.0002.1004C] # LINEAR B SYLLABLE B087 TWE
+1004D ; [.3191.0020.0002.1004D] # LINEAR B SYLLABLE B091 TWO
+10050 ; [.3192.0020.0002.10050] # LINEAR B SYMBOL B018
+10051 ; [.3193.0020.0002.10051] # LINEAR B SYMBOL B019
+10052 ; [.3194.0020.0002.10052] # LINEAR B SYMBOL B022
+10053 ; [.3195.0020.0002.10053] # LINEAR B SYMBOL B034
+10054 ; [.3196.0020.0002.10054] # LINEAR B SYMBOL B047
+10055 ; [.3197.0020.0002.10055] # LINEAR B SYMBOL B049
+10056 ; [.3198.0020.0002.10056] # LINEAR B SYMBOL B056
+10057 ; [.3199.0020.0002.10057] # LINEAR B SYMBOL B063
+10058 ; [.319A.0020.0002.10058] # LINEAR B SYMBOL B064
+10059 ; [.319B.0020.0002.10059] # LINEAR B SYMBOL B079
+1005A ; [.319C.0020.0002.1005A] # LINEAR B SYMBOL B082
+1005B ; [.319D.0020.0002.1005B] # LINEAR B SYMBOL B083
+1005C ; [.319E.0020.0002.1005C] # LINEAR B SYMBOL B086
+1005D ; [.319F.0020.0002.1005D] # LINEAR B SYMBOL B089
+10080 ; [.31A0.0020.0002.10080] # LINEAR B IDEOGRAM B100 MAN
+10081 ; [.31A1.0020.0002.10081] # LINEAR B IDEOGRAM B102 WOMAN
+10082 ; [.31A2.0020.0002.10082] # LINEAR B IDEOGRAM B104 DEER
+10083 ; [.31A3.0020.0002.10083] # LINEAR B IDEOGRAM B105 EQUID
+10084 ; [.31A4.0020.0002.10084] # LINEAR B IDEOGRAM B105F MARE
+10085 ; [.31A5.0020.0002.10085] # LINEAR B IDEOGRAM B105M STALLION
+10086 ; [.31A6.0020.0002.10086] # LINEAR B IDEOGRAM B106F EWE
+10087 ; [.31A7.0020.0002.10087] # LINEAR B IDEOGRAM B106M RAM
+10088 ; [.31A8.0020.0002.10088] # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089 ; [.31A9.0020.0002.10089] # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A ; [.31AA.0020.0002.1008A] # LINEAR B IDEOGRAM B108F SOW
+1008B ; [.31AB.0020.0002.1008B] # LINEAR B IDEOGRAM B108M BOAR
+1008C ; [.31AC.0020.0002.1008C] # LINEAR B IDEOGRAM B109F COW
+1008D ; [.31AD.0020.0002.1008D] # LINEAR B IDEOGRAM B109M BULL
+1008E ; [.31AE.0020.0002.1008E] # LINEAR B IDEOGRAM B120 WHEAT
+1008F ; [.31AF.0020.0002.1008F] # LINEAR B IDEOGRAM B121 BARLEY
+10090 ; [.31B0.0020.0002.10090] # LINEAR B IDEOGRAM B122 OLIVE
+10091 ; [.31B1.0020.0002.10091] # LINEAR B IDEOGRAM B123 SPICE
+10092 ; [.31B2.0020.0002.10092] # LINEAR B IDEOGRAM B125 CYPERUS
+10093 ; [.31B3.0020.0002.10093] # LINEAR B MONOGRAM B127 KAPO
+10094 ; [.31B4.0020.0002.10094] # LINEAR B MONOGRAM B128 KANAKO
+10095 ; [.31B5.0020.0002.10095] # LINEAR B IDEOGRAM B130 OIL
+10096 ; [.31B6.0020.0002.10096] # LINEAR B IDEOGRAM B131 WINE
+10097 ; [.31B7.0020.0002.10097] # LINEAR B IDEOGRAM B132
+10098 ; [.31B8.0020.0002.10098] # LINEAR B MONOGRAM B133 AREPA
+10099 ; [.31B9.0020.0002.10099] # LINEAR B MONOGRAM B135 MERI
+1009A ; [.31BA.0020.0002.1009A] # LINEAR B IDEOGRAM B140 BRONZE
+1009B ; [.31BB.0020.0002.1009B] # LINEAR B IDEOGRAM B141 GOLD
+1009C ; [.31BC.0020.0002.1009C] # LINEAR B IDEOGRAM B142
+1009D ; [.31BD.0020.0002.1009D] # LINEAR B IDEOGRAM B145 WOOL
+1009E ; [.31BE.0020.0002.1009E] # LINEAR B IDEOGRAM B146
+1009F ; [.31BF.0020.0002.1009F] # LINEAR B IDEOGRAM B150
+100A0 ; [.31C0.0020.0002.100A0] # LINEAR B IDEOGRAM B151 HORN
+100A1 ; [.31C1.0020.0002.100A1] # LINEAR B IDEOGRAM B152
+100A2 ; [.31C2.0020.0002.100A2] # LINEAR B IDEOGRAM B153
+100A3 ; [.31C3.0020.0002.100A3] # LINEAR B IDEOGRAM B154
+100A4 ; [.31C4.0020.0002.100A4] # LINEAR B MONOGRAM B156 TURO2
+100A5 ; [.31C5.0020.0002.100A5] # LINEAR B IDEOGRAM B157
+100A6 ; [.31C6.0020.0002.100A6] # LINEAR B IDEOGRAM B158
+100A7 ; [.31C7.0020.0002.100A7] # LINEAR B IDEOGRAM B159 CLOTH
+100A8 ; [.31C8.0020.0002.100A8] # LINEAR B IDEOGRAM B160
+100A9 ; [.31C9.0020.0002.100A9] # LINEAR B IDEOGRAM B161
+100AA ; [.31CA.0020.0002.100AA] # LINEAR B IDEOGRAM B162 GARMENT
+100AB ; [.31CB.0020.0002.100AB] # LINEAR B IDEOGRAM B163 ARMOUR
+100AC ; [.31CC.0020.0002.100AC] # LINEAR B IDEOGRAM B164
+100AD ; [.31CD.0020.0002.100AD] # LINEAR B IDEOGRAM B165
+100AE ; [.31CE.0020.0002.100AE] # LINEAR B IDEOGRAM B166
+100AF ; [.31CF.0020.0002.100AF] # LINEAR B IDEOGRAM B167
+100B0 ; [.31D0.0020.0002.100B0] # LINEAR B IDEOGRAM B168
+100B1 ; [.31D1.0020.0002.100B1] # LINEAR B IDEOGRAM B169
+100B2 ; [.31D2.0020.0002.100B2] # LINEAR B IDEOGRAM B170
+100B3 ; [.31D3.0020.0002.100B3] # LINEAR B IDEOGRAM B171
+100B4 ; [.31D4.0020.0002.100B4] # LINEAR B IDEOGRAM B172
+100B5 ; [.31D5.0020.0002.100B5] # LINEAR B IDEOGRAM B173 MONTH
+100B6 ; [.31D6.0020.0002.100B6] # LINEAR B IDEOGRAM B174
+100B7 ; [.31D7.0020.0002.100B7] # LINEAR B IDEOGRAM B176 TREE
+100B8 ; [.31D8.0020.0002.100B8] # LINEAR B IDEOGRAM B177
+100B9 ; [.31D9.0020.0002.100B9] # LINEAR B IDEOGRAM B178
+100BA ; [.31DA.0020.0002.100BA] # LINEAR B IDEOGRAM B179
+100BB ; [.31DB.0020.0002.100BB] # LINEAR B IDEOGRAM B180
+100BC ; [.31DC.0020.0002.100BC] # LINEAR B IDEOGRAM B181
+100BD ; [.31DD.0020.0002.100BD] # LINEAR B IDEOGRAM B182
+100BE ; [.31DE.0020.0002.100BE] # LINEAR B IDEOGRAM B183
+100BF ; [.31DF.0020.0002.100BF] # LINEAR B IDEOGRAM B184
+100C0 ; [.31E0.0020.0002.100C0] # LINEAR B IDEOGRAM B185
+100C1 ; [.31E1.0020.0002.100C1] # LINEAR B IDEOGRAM B189
+100C2 ; [.31E2.0020.0002.100C2] # LINEAR B IDEOGRAM B190
+100C3 ; [.31E3.0020.0002.100C3] # LINEAR B IDEOGRAM B191 HELMET
+100C4 ; [.31E4.0020.0002.100C4] # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5 ; [.31E5.0020.0002.100C5] # LINEAR B IDEOGRAM B225 BATHTUB
+100C6 ; [.31E6.0020.0002.100C6] # LINEAR B IDEOGRAM B230 SPEAR
+100C7 ; [.31E7.0020.0002.100C7] # LINEAR B IDEOGRAM B231 ARROW
+100C8 ; [.31E8.0020.0002.100C8] # LINEAR B IDEOGRAM B232
+100C9 ; [.31E9.0020.0002.100C9] # LINEAR B IDEOGRAM B233 SWORD
+100CA ; [.31EA.0020.0002.100CA] # LINEAR B IDEOGRAM B234
+100CB ; [.31EB.0020.0002.100CB] # LINEAR B IDEOGRAM B236
+100CC ; [.31EC.0020.0002.100CC] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD ; [.31ED.0020.0002.100CD] # LINEAR B IDEOGRAM B241 CHARIOT
+100CE ; [.31EE.0020.0002.100CE] # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF ; [.31EF.0020.0002.100CF] # LINEAR B IDEOGRAM B243 WHEEL
+100D0 ; [.31F0.0020.0002.100D0] # LINEAR B IDEOGRAM B245
+100D1 ; [.31F1.0020.0002.100D1] # LINEAR B IDEOGRAM B246
+100D2 ; [.31F2.0020.0002.100D2] # LINEAR B MONOGRAM B247 DIPTE
+100D3 ; [.31F3.0020.0002.100D3] # LINEAR B IDEOGRAM B248
+100D4 ; [.31F4.0020.0002.100D4] # LINEAR B IDEOGRAM B249
+100D5 ; [.31F5.0020.0002.100D5] # LINEAR B IDEOGRAM B251
+100D6 ; [.31F6.0020.0002.100D6] # LINEAR B IDEOGRAM B252
+100D7 ; [.31F7.0020.0002.100D7] # LINEAR B IDEOGRAM B253
+100D8 ; [.31F8.0020.0002.100D8] # LINEAR B IDEOGRAM B254 DART
+100D9 ; [.31F9.0020.0002.100D9] # LINEAR B IDEOGRAM B255
+100DA ; [.31FA.0020.0002.100DA] # LINEAR B IDEOGRAM B256
+100DB ; [.31FB.0020.0002.100DB] # LINEAR B IDEOGRAM B257
+100DC ; [.31FC.0020.0002.100DC] # LINEAR B IDEOGRAM B258
+100DD ; [.31FD.0020.0002.100DD] # LINEAR B IDEOGRAM B259
+100DE ; [.31FE.0020.0002.100DE] # LINEAR B IDEOGRAM VESSEL B155
+100DF ; [.31FF.0020.0002.100DF] # LINEAR B IDEOGRAM VESSEL B200
+100E0 ; [.3200.0020.0002.100E0] # LINEAR B IDEOGRAM VESSEL B201
+100E1 ; [.3201.0020.0002.100E1] # LINEAR B IDEOGRAM VESSEL B202
+100E2 ; [.3202.0020.0002.100E2] # LINEAR B IDEOGRAM VESSEL B203
+100E3 ; [.3203.0020.0002.100E3] # LINEAR B IDEOGRAM VESSEL B204
+100E4 ; [.3204.0020.0002.100E4] # LINEAR B IDEOGRAM VESSEL B205
+100E5 ; [.3205.0020.0002.100E5] # LINEAR B IDEOGRAM VESSEL B206
+100E6 ; [.3206.0020.0002.100E6] # LINEAR B IDEOGRAM VESSEL B207
+100E7 ; [.3207.0020.0002.100E7] # LINEAR B IDEOGRAM VESSEL B208
+100E8 ; [.3208.0020.0002.100E8] # LINEAR B IDEOGRAM VESSEL B209
+100E9 ; [.3209.0020.0002.100E9] # LINEAR B IDEOGRAM VESSEL B210
+100EA ; [.320A.0020.0002.100EA] # LINEAR B IDEOGRAM VESSEL B211
+100EB ; [.320B.0020.0002.100EB] # LINEAR B IDEOGRAM VESSEL B212
+100EC ; [.320C.0020.0002.100EC] # LINEAR B IDEOGRAM VESSEL B213
+100ED ; [.320D.0020.0002.100ED] # LINEAR B IDEOGRAM VESSEL B214
+100EE ; [.320E.0020.0002.100EE] # LINEAR B IDEOGRAM VESSEL B215
+100EF ; [.320F.0020.0002.100EF] # LINEAR B IDEOGRAM VESSEL B216
+100F0 ; [.3210.0020.0002.100F0] # LINEAR B IDEOGRAM VESSEL B217
+100F1 ; [.3211.0020.0002.100F1] # LINEAR B IDEOGRAM VESSEL B218
+100F2 ; [.3212.0020.0002.100F2] # LINEAR B IDEOGRAM VESSEL B219
+100F3 ; [.3213.0020.0002.100F3] # LINEAR B IDEOGRAM VESSEL B221
+100F4 ; [.3214.0020.0002.100F4] # LINEAR B IDEOGRAM VESSEL B222
+100F5 ; [.3215.0020.0002.100F5] # LINEAR B IDEOGRAM VESSEL B226
+100F6 ; [.3216.0020.0002.100F6] # LINEAR B IDEOGRAM VESSEL B227
+100F7 ; [.3217.0020.0002.100F7] # LINEAR B IDEOGRAM VESSEL B228
+100F8 ; [.3218.0020.0002.100F8] # LINEAR B IDEOGRAM VESSEL B229
+100F9 ; [.3219.0020.0002.100F9] # LINEAR B IDEOGRAM VESSEL B250
+100FA ; [.321A.0020.0002.100FA] # LINEAR B IDEOGRAM VESSEL B305
+10800 ; [.321B.0020.0002.10800] # CYPRIOT SYLLABLE A
+10801 ; [.321C.0020.0002.10801] # CYPRIOT SYLLABLE E
+10802 ; [.321D.0020.0002.10802] # CYPRIOT SYLLABLE I
+10803 ; [.321E.0020.0002.10803] # CYPRIOT SYLLABLE O
+10804 ; [.321F.0020.0002.10804] # CYPRIOT SYLLABLE U
+10805 ; [.3220.0020.0002.10805] # CYPRIOT SYLLABLE JA
+10808 ; [.3221.0020.0002.10808] # CYPRIOT SYLLABLE JO
+1080A ; [.3222.0020.0002.1080A] # CYPRIOT SYLLABLE KA
+1080B ; [.3223.0020.0002.1080B] # CYPRIOT SYLLABLE KE
+1080C ; [.3224.0020.0002.1080C] # CYPRIOT SYLLABLE KI
+1080D ; [.3225.0020.0002.1080D] # CYPRIOT SYLLABLE KO
+1080E ; [.3226.0020.0002.1080E] # CYPRIOT SYLLABLE KU
+1080F ; [.3227.0020.0002.1080F] # CYPRIOT SYLLABLE LA
+10810 ; [.3228.0020.0002.10810] # CYPRIOT SYLLABLE LE
+10811 ; [.3229.0020.0002.10811] # CYPRIOT SYLLABLE LI
+10812 ; [.322A.0020.0002.10812] # CYPRIOT SYLLABLE LO
+10813 ; [.322B.0020.0002.10813] # CYPRIOT SYLLABLE LU
+10814 ; [.322C.0020.0002.10814] # CYPRIOT SYLLABLE MA
+10815 ; [.322D.0020.0002.10815] # CYPRIOT SYLLABLE ME
+10816 ; [.322E.0020.0002.10816] # CYPRIOT SYLLABLE MI
+10817 ; [.322F.0020.0002.10817] # CYPRIOT SYLLABLE MO
+10818 ; [.3230.0020.0002.10818] # CYPRIOT SYLLABLE MU
+10819 ; [.3231.0020.0002.10819] # CYPRIOT SYLLABLE NA
+1081A ; [.3232.0020.0002.1081A] # CYPRIOT SYLLABLE NE
+1081B ; [.3233.0020.0002.1081B] # CYPRIOT SYLLABLE NI
+1081C ; [.3234.0020.0002.1081C] # CYPRIOT SYLLABLE NO
+1081D ; [.3235.0020.0002.1081D] # CYPRIOT SYLLABLE NU
+1081E ; [.3236.0020.0002.1081E] # CYPRIOT SYLLABLE PA
+1081F ; [.3237.0020.0002.1081F] # CYPRIOT SYLLABLE PE
+10820 ; [.3238.0020.0002.10820] # CYPRIOT SYLLABLE PI
+10821 ; [.3239.0020.0002.10821] # CYPRIOT SYLLABLE PO
+10822 ; [.323A.0020.0002.10822] # CYPRIOT SYLLABLE PU
+10823 ; [.323B.0020.0002.10823] # CYPRIOT SYLLABLE RA
+10824 ; [.323C.0020.0002.10824] # CYPRIOT SYLLABLE RE
+10825 ; [.323D.0020.0002.10825] # CYPRIOT SYLLABLE RI
+10826 ; [.323E.0020.0002.10826] # CYPRIOT SYLLABLE RO
+10827 ; [.323F.0020.0002.10827] # CYPRIOT SYLLABLE RU
+10828 ; [.3240.0020.0002.10828] # CYPRIOT SYLLABLE SA
+10829 ; [.3241.0020.0002.10829] # CYPRIOT SYLLABLE SE
+1082A ; [.3242.0020.0002.1082A] # CYPRIOT SYLLABLE SI
+1082B ; [.3243.0020.0002.1082B] # CYPRIOT SYLLABLE SO
+1082C ; [.3244.0020.0002.1082C] # CYPRIOT SYLLABLE SU
+1082D ; [.3245.0020.0002.1082D] # CYPRIOT SYLLABLE TA
+1082E ; [.3246.0020.0002.1082E] # CYPRIOT SYLLABLE TE
+1082F ; [.3247.0020.0002.1082F] # CYPRIOT SYLLABLE TI
+10830 ; [.3248.0020.0002.10830] # CYPRIOT SYLLABLE TO
+10831 ; [.3249.0020.0002.10831] # CYPRIOT SYLLABLE TU
+10832 ; [.324A.0020.0002.10832] # CYPRIOT SYLLABLE WA
+10833 ; [.324B.0020.0002.10833] # CYPRIOT SYLLABLE WE
+10834 ; [.324C.0020.0002.10834] # CYPRIOT SYLLABLE WI
+10835 ; [.324D.0020.0002.10835] # CYPRIOT SYLLABLE WO
+10837 ; [.324E.0020.0002.10837] # CYPRIOT SYLLABLE XA
+10838 ; [.324F.0020.0002.10838] # CYPRIOT SYLLABLE XE
+1083C ; [.3250.0020.0002.1083C] # CYPRIOT SYLLABLE ZA
+1083F ; [.3251.0020.0002.1083F] # CYPRIOT SYLLABLE ZO
+10A60 ; [.3252.0020.0002.10A60] # OLD SOUTH ARABIAN LETTER HE
+10A61 ; [.3253.0020.0002.10A61] # OLD SOUTH ARABIAN LETTER LAMEDH
+10A62 ; [.3254.0020.0002.10A62] # OLD SOUTH ARABIAN LETTER HETH
+10A63 ; [.3255.0020.0002.10A63] # OLD SOUTH ARABIAN LETTER MEM
+10A64 ; [.3256.0020.0002.10A64] # OLD SOUTH ARABIAN LETTER QOPH
+10A65 ; [.3257.0020.0002.10A65] # OLD SOUTH ARABIAN LETTER WAW
+10A66 ; [.3258.0020.0002.10A66] # OLD SOUTH ARABIAN LETTER SHIN
+10A67 ; [.3259.0020.0002.10A67] # OLD SOUTH ARABIAN LETTER RESH
+10A68 ; [.325A.0020.0002.10A68] # OLD SOUTH ARABIAN LETTER BETH
+10A69 ; [.325B.0020.0002.10A69] # OLD SOUTH ARABIAN LETTER TAW
+10A6A ; [.325C.0020.0002.10A6A] # OLD SOUTH ARABIAN LETTER SAT
+10A6B ; [.325D.0020.0002.10A6B] # OLD SOUTH ARABIAN LETTER KAPH
+10A6C ; [.325E.0020.0002.10A6C] # OLD SOUTH ARABIAN LETTER NUN
+10A6D ; [.325F.0020.0002.10A6D] # OLD SOUTH ARABIAN LETTER KHETH
+10A6E ; [.3260.0020.0002.10A6E] # OLD SOUTH ARABIAN LETTER SADHE
+10A6F ; [.3261.0020.0002.10A6F] # OLD SOUTH ARABIAN LETTER SAMEKH
+10A70 ; [.3262.0020.0002.10A70] # OLD SOUTH ARABIAN LETTER FE
+10A71 ; [.3263.0020.0002.10A71] # OLD SOUTH ARABIAN LETTER ALEF
+10A72 ; [.3264.0020.0002.10A72] # OLD SOUTH ARABIAN LETTER AYN
+10A73 ; [.3265.0020.0002.10A73] # OLD SOUTH ARABIAN LETTER DHADHE
+10A74 ; [.3266.0020.0002.10A74] # OLD SOUTH ARABIAN LETTER GIMEL
+10A75 ; [.3267.0020.0002.10A75] # OLD SOUTH ARABIAN LETTER DALETH
+10A76 ; [.3268.0020.0002.10A76] # OLD SOUTH ARABIAN LETTER GHAYN
+10A77 ; [.3269.0020.0002.10A77] # OLD SOUTH ARABIAN LETTER TETH
+10A78 ; [.326A.0020.0002.10A78] # OLD SOUTH ARABIAN LETTER ZAYN
+10A79 ; [.326B.0020.0002.10A79] # OLD SOUTH ARABIAN LETTER DHALETH
+10A7A ; [.326C.0020.0002.10A7A] # OLD SOUTH ARABIAN LETTER YODH
+10A7B ; [.326D.0020.0002.10A7B] # OLD SOUTH ARABIAN LETTER THAW
+10A7C ; [.326E.0020.0002.10A7C] # OLD SOUTH ARABIAN LETTER THETH
+10B00 ; [.326F.0020.0002.10B00] # AVESTAN LETTER A
+10B01 ; [.3270.0020.0002.10B01] # AVESTAN LETTER AA
+10B02 ; [.3271.0020.0002.10B02] # AVESTAN LETTER AO
+10B03 ; [.3272.0020.0002.10B03] # AVESTAN LETTER AAO
+10B04 ; [.3273.0020.0002.10B04] # AVESTAN LETTER AN
+10B05 ; [.3274.0020.0002.10B05] # AVESTAN LETTER AAN
+10B06 ; [.3275.0020.0002.10B06] # AVESTAN LETTER AE
+10B07 ; [.3276.0020.0002.10B07] # AVESTAN LETTER AEE
+10B08 ; [.3277.0020.0002.10B08] # AVESTAN LETTER E
+10B09 ; [.3278.0020.0002.10B09] # AVESTAN LETTER EE
+10B0A ; [.3279.0020.0002.10B0A] # AVESTAN LETTER O
+10B0B ; [.327A.0020.0002.10B0B] # AVESTAN LETTER OO
+10B0C ; [.327B.0020.0002.10B0C] # AVESTAN LETTER I
+10B0D ; [.327C.0020.0002.10B0D] # AVESTAN LETTER II
+10B0E ; [.327D.0020.0002.10B0E] # AVESTAN LETTER U
+10B0F ; [.327E.0020.0002.10B0F] # AVESTAN LETTER UU
+10B10 ; [.327F.0020.0002.10B10] # AVESTAN LETTER KE
+10B11 ; [.3280.0020.0002.10B11] # AVESTAN LETTER XE
+10B12 ; [.3281.0020.0002.10B12] # AVESTAN LETTER XYE
+10B13 ; [.3282.0020.0002.10B13] # AVESTAN LETTER XVE
+10B14 ; [.3283.0020.0002.10B14] # AVESTAN LETTER GE
+10B15 ; [.3284.0020.0002.10B15] # AVESTAN LETTER GGE
+10B16 ; [.3285.0020.0002.10B16] # AVESTAN LETTER GHE
+10B17 ; [.3286.0020.0002.10B17] # AVESTAN LETTER CE
+10B18 ; [.3287.0020.0002.10B18] # AVESTAN LETTER JE
+10B19 ; [.3288.0020.0002.10B19] # AVESTAN LETTER TE
+10B1A ; [.3289.0020.0002.10B1A] # AVESTAN LETTER THE
+10B1B ; [.328A.0020.0002.10B1B] # AVESTAN LETTER DE
+10B1C ; [.328B.0020.0002.10B1C] # AVESTAN LETTER DHE
+10B1D ; [.328C.0020.0002.10B1D] # AVESTAN LETTER TTE
+10B1E ; [.328D.0020.0002.10B1E] # AVESTAN LETTER PE
+10B1F ; [.328E.0020.0002.10B1F] # AVESTAN LETTER FE
+10B20 ; [.328F.0020.0002.10B20] # AVESTAN LETTER BE
+10B21 ; [.3290.0020.0002.10B21] # AVESTAN LETTER BHE
+10B22 ; [.3291.0020.0002.10B22] # AVESTAN LETTER NGE
+10B23 ; [.3292.0020.0002.10B23] # AVESTAN LETTER NGYE
+10B24 ; [.3293.0020.0002.10B24] # AVESTAN LETTER NGVE
+10B25 ; [.3294.0020.0002.10B25] # AVESTAN LETTER NE
+10B26 ; [.3295.0020.0002.10B26] # AVESTAN LETTER NYE
+10B27 ; [.3296.0020.0002.10B27] # AVESTAN LETTER NNE
+10B28 ; [.3297.0020.0002.10B28] # AVESTAN LETTER ME
+10B29 ; [.3298.0020.0002.10B29] # AVESTAN LETTER HME
+10B2A ; [.3299.0020.0002.10B2A] # AVESTAN LETTER YYE
+10B2B ; [.329A.0020.0002.10B2B] # AVESTAN LETTER YE
+10B2C ; [.329B.0020.0002.10B2C] # AVESTAN LETTER VE
+10B2D ; [.329C.0020.0002.10B2D] # AVESTAN LETTER RE
+10B2E ; [.329C.0020.0004.10B2E][.0000.0159.0004.10B2E] # AVESTAN LETTER LE; QQKN
+10B2F ; [.329D.0020.0002.10B2F] # AVESTAN LETTER SE
+10B30 ; [.329E.0020.0002.10B30] # AVESTAN LETTER ZE
+10B31 ; [.329F.0020.0002.10B31] # AVESTAN LETTER SHE
+10B32 ; [.32A0.0020.0002.10B32] # AVESTAN LETTER ZHE
+10B33 ; [.32A1.0020.0002.10B33] # AVESTAN LETTER SHYE
+10B34 ; [.32A2.0020.0002.10B34] # AVESTAN LETTER SSHE
+10B35 ; [.32A3.0020.0002.10B35] # AVESTAN LETTER HE
+10840 ; [.32A4.0020.0002.10840] # IMPERIAL ARAMAIC LETTER ALEPH
+10841 ; [.32A5.0020.0002.10841] # IMPERIAL ARAMAIC LETTER BETH
+10842 ; [.32A6.0020.0002.10842] # IMPERIAL ARAMAIC LETTER GIMEL
+10843 ; [.32A7.0020.0002.10843] # IMPERIAL ARAMAIC LETTER DALETH
+10844 ; [.32A8.0020.0002.10844] # IMPERIAL ARAMAIC LETTER HE
+10845 ; [.32A9.0020.0002.10845] # IMPERIAL ARAMAIC LETTER WAW
+10846 ; [.32AA.0020.0002.10846] # IMPERIAL ARAMAIC LETTER ZAYIN
+10847 ; [.32AB.0020.0002.10847] # IMPERIAL ARAMAIC LETTER HETH
+10848 ; [.32AC.0020.0002.10848] # IMPERIAL ARAMAIC LETTER TETH
+10849 ; [.32AD.0020.0002.10849] # IMPERIAL ARAMAIC LETTER YODH
+1084A ; [.32AE.0020.0002.1084A] # IMPERIAL ARAMAIC LETTER KAPH
+1084B ; [.32AF.0020.0002.1084B] # IMPERIAL ARAMAIC LETTER LAMEDH
+1084C ; [.32B0.0020.0002.1084C] # IMPERIAL ARAMAIC LETTER MEM
+1084D ; [.32B1.0020.0002.1084D] # IMPERIAL ARAMAIC LETTER NUN
+1084E ; [.32B2.0020.0002.1084E] # IMPERIAL ARAMAIC LETTER SAMEKH
+1084F ; [.32B3.0020.0002.1084F] # IMPERIAL ARAMAIC LETTER AYIN
+10850 ; [.32B4.0020.0002.10850] # IMPERIAL ARAMAIC LETTER PE
+10851 ; [.32B5.0020.0002.10851] # IMPERIAL ARAMAIC LETTER SADHE
+10852 ; [.32B6.0020.0002.10852] # IMPERIAL ARAMAIC LETTER QOPH
+10853 ; [.32B7.0020.0002.10853] # IMPERIAL ARAMAIC LETTER RESH
+10854 ; [.32B8.0020.0002.10854] # IMPERIAL ARAMAIC LETTER SHIN
+10855 ; [.32B9.0020.0002.10855] # IMPERIAL ARAMAIC LETTER TAW
+10B40 ; [.32BA.0020.0002.10B40] # INSCRIPTIONAL PARTHIAN LETTER ALEPH
+10B41 ; [.32BB.0020.0002.10B41] # INSCRIPTIONAL PARTHIAN LETTER BETH
+10B42 ; [.32BC.0020.0002.10B42] # INSCRIPTIONAL PARTHIAN LETTER GIMEL
+10B43 ; [.32BD.0020.0002.10B43] # INSCRIPTIONAL PARTHIAN LETTER DALETH
+10B44 ; [.32BE.0020.0002.10B44] # INSCRIPTIONAL PARTHIAN LETTER HE
+10B45 ; [.32BF.0020.0002.10B45] # INSCRIPTIONAL PARTHIAN LETTER WAW
+10B46 ; [.32C0.0020.0002.10B46] # INSCRIPTIONAL PARTHIAN LETTER ZAYIN
+10B47 ; [.32C1.0020.0002.10B47] # INSCRIPTIONAL PARTHIAN LETTER HETH
+10B48 ; [.32C2.0020.0002.10B48] # INSCRIPTIONAL PARTHIAN LETTER TETH
+10B49 ; [.32C3.0020.0002.10B49] # INSCRIPTIONAL PARTHIAN LETTER YODH
+10B4A ; [.32C4.0020.0002.10B4A] # INSCRIPTIONAL PARTHIAN LETTER KAPH
+10B4B ; [.32C5.0020.0002.10B4B] # INSCRIPTIONAL PARTHIAN LETTER LAMEDH
+10B4C ; [.32C6.0020.0002.10B4C] # INSCRIPTIONAL PARTHIAN LETTER MEM
+10B4D ; [.32C7.0020.0002.10B4D] # INSCRIPTIONAL PARTHIAN LETTER NUN
+10B4E ; [.32C8.0020.0002.10B4E] # INSCRIPTIONAL PARTHIAN LETTER SAMEKH
+10B4F ; [.32C9.0020.0002.10B4F] # INSCRIPTIONAL PARTHIAN LETTER AYIN
+10B50 ; [.32CA.0020.0002.10B50] # INSCRIPTIONAL PARTHIAN LETTER PE
+10B51 ; [.32CB.0020.0002.10B51] # INSCRIPTIONAL PARTHIAN LETTER SADHE
+10B52 ; [.32CC.0020.0002.10B52] # INSCRIPTIONAL PARTHIAN LETTER QOPH
+10B53 ; [.32CD.0020.0002.10B53] # INSCRIPTIONAL PARTHIAN LETTER RESH
+10B54 ; [.32CE.0020.0002.10B54] # INSCRIPTIONAL PARTHIAN LETTER SHIN
+10B55 ; [.32CF.0020.0002.10B55] # INSCRIPTIONAL PARTHIAN LETTER TAW
+10B60 ; [.32D0.0020.0002.10B60] # INSCRIPTIONAL PAHLAVI LETTER ALEPH
+10B61 ; [.32D1.0020.0002.10B61] # INSCRIPTIONAL PAHLAVI LETTER BETH
+10B62 ; [.32D2.0020.0002.10B62] # INSCRIPTIONAL PAHLAVI LETTER GIMEL
+10B63 ; [.32D3.0020.0002.10B63] # INSCRIPTIONAL PAHLAVI LETTER DALETH
+10B64 ; [.32D4.0020.0002.10B64] # INSCRIPTIONAL PAHLAVI LETTER HE
+10B65 ; [.32D5.0020.0002.10B65] # INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH
+10B66 ; [.32D6.0020.0002.10B66] # INSCRIPTIONAL PAHLAVI LETTER ZAYIN
+10B67 ; [.32D7.0020.0002.10B67] # INSCRIPTIONAL PAHLAVI LETTER HETH
+10B68 ; [.32D8.0020.0002.10B68] # INSCRIPTIONAL PAHLAVI LETTER TETH
+10B69 ; [.32D9.0020.0002.10B69] # INSCRIPTIONAL PAHLAVI LETTER YODH
+10B6A ; [.32DA.0020.0002.10B6A] # INSCRIPTIONAL PAHLAVI LETTER KAPH
+10B6B ; [.32DB.0020.0002.10B6B] # INSCRIPTIONAL PAHLAVI LETTER LAMEDH
+10B6C ; [.32DC.0020.0002.10B6C] # INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH
+10B6D ; [.32DD.0020.0002.10B6D] # INSCRIPTIONAL PAHLAVI LETTER NUN
+10B6E ; [.32DE.0020.0002.10B6E] # INSCRIPTIONAL PAHLAVI LETTER SAMEKH
+10B6F ; [.32DF.0020.0002.10B6F] # INSCRIPTIONAL PAHLAVI LETTER PE
+10B70 ; [.32E0.0020.0002.10B70] # INSCRIPTIONAL PAHLAVI LETTER SADHE
+10B71 ; [.32E1.0020.0002.10B71] # INSCRIPTIONAL PAHLAVI LETTER SHIN
+10B72 ; [.32E2.0020.0002.10B72] # INSCRIPTIONAL PAHLAVI LETTER TAW
+10380 ; [.32E3.0020.0002.10380] # UGARITIC LETTER ALPA
+10381 ; [.32E4.0020.0002.10381] # UGARITIC LETTER BETA
+10382 ; [.32E5.0020.0002.10382] # UGARITIC LETTER GAMLA
+10383 ; [.32E6.0020.0002.10383] # UGARITIC LETTER KHA
+10384 ; [.32E7.0020.0002.10384] # UGARITIC LETTER DELTA
+10385 ; [.32E8.0020.0002.10385] # UGARITIC LETTER HO
+10386 ; [.32E9.0020.0002.10386] # UGARITIC LETTER WO
+10387 ; [.32EA.0020.0002.10387] # UGARITIC LETTER ZETA
+10388 ; [.32EB.0020.0002.10388] # UGARITIC LETTER HOTA
+10389 ; [.32EC.0020.0002.10389] # UGARITIC LETTER TET
+1038A ; [.32ED.0020.0002.1038A] # UGARITIC LETTER YOD
+1038B ; [.32EE.0020.0002.1038B] # UGARITIC LETTER KAF
+1038C ; [.32EF.0020.0002.1038C] # UGARITIC LETTER SHIN
+1038D ; [.32F0.0020.0002.1038D] # UGARITIC LETTER LAMDA
+1038E ; [.32F1.0020.0002.1038E] # UGARITIC LETTER MEM
+1038F ; [.32F2.0020.0002.1038F] # UGARITIC LETTER DHAL
+10390 ; [.32F3.0020.0002.10390] # UGARITIC LETTER NUN
+10391 ; [.32F4.0020.0002.10391] # UGARITIC LETTER ZU
+10392 ; [.32F5.0020.0002.10392] # UGARITIC LETTER SAMKA
+10393 ; [.32F6.0020.0002.10393] # UGARITIC LETTER AIN
+10394 ; [.32F7.0020.0002.10394] # UGARITIC LETTER PU
+10395 ; [.32F8.0020.0002.10395] # UGARITIC LETTER SADE
+10396 ; [.32F9.0020.0002.10396] # UGARITIC LETTER QOPA
+10397 ; [.32FA.0020.0002.10397] # UGARITIC LETTER RASHA
+10398 ; [.32FB.0020.0002.10398] # UGARITIC LETTER THANNA
+10399 ; [.32FC.0020.0002.10399] # UGARITIC LETTER GHAIN
+1039A ; [.32FD.0020.0002.1039A] # UGARITIC LETTER TO
+1039B ; [.32FE.0020.0002.1039B] # UGARITIC LETTER I
+1039C ; [.32FF.0020.0002.1039C] # UGARITIC LETTER U
+1039D ; [.3300.0020.0002.1039D] # UGARITIC LETTER SSU
+103A0 ; [.3301.0020.0002.103A0] # OLD PERSIAN SIGN A
+103A1 ; [.3302.0020.0002.103A1] # OLD PERSIAN SIGN I
+103A2 ; [.3303.0020.0002.103A2] # OLD PERSIAN SIGN U
+103A3 ; [.3304.0020.0002.103A3] # OLD PERSIAN SIGN KA
+103A4 ; [.3305.0020.0002.103A4] # OLD PERSIAN SIGN KU
+103A5 ; [.3306.0020.0002.103A5] # OLD PERSIAN SIGN GA
+103A6 ; [.3307.0020.0002.103A6] # OLD PERSIAN SIGN GU
+103A7 ; [.3308.0020.0002.103A7] # OLD PERSIAN SIGN XA
+103A8 ; [.3309.0020.0002.103A8] # OLD PERSIAN SIGN CA
+103A9 ; [.330A.0020.0002.103A9] # OLD PERSIAN SIGN JA
+103AA ; [.330B.0020.0002.103AA] # OLD PERSIAN SIGN JI
+103AB ; [.330C.0020.0002.103AB] # OLD PERSIAN SIGN TA
+103AC ; [.330D.0020.0002.103AC] # OLD PERSIAN SIGN TU
+103AD ; [.330E.0020.0002.103AD] # OLD PERSIAN SIGN DA
+103AE ; [.330F.0020.0002.103AE] # OLD PERSIAN SIGN DI
+103AF ; [.3310.0020.0002.103AF] # OLD PERSIAN SIGN DU
+103B0 ; [.3311.0020.0002.103B0] # OLD PERSIAN SIGN THA
+103B1 ; [.3312.0020.0002.103B1] # OLD PERSIAN SIGN PA
+103B2 ; [.3313.0020.0002.103B2] # OLD PERSIAN SIGN BA
+103B3 ; [.3314.0020.0002.103B3] # OLD PERSIAN SIGN FA
+103B4 ; [.3315.0020.0002.103B4] # OLD PERSIAN SIGN NA
+103B5 ; [.3316.0020.0002.103B5] # OLD PERSIAN SIGN NU
+103B6 ; [.3317.0020.0002.103B6] # OLD PERSIAN SIGN MA
+103B7 ; [.3318.0020.0002.103B7] # OLD PERSIAN SIGN MI
+103B8 ; [.3319.0020.0002.103B8] # OLD PERSIAN SIGN MU
+103B9 ; [.331A.0020.0002.103B9] # OLD PERSIAN SIGN YA
+103BA ; [.331B.0020.0002.103BA] # OLD PERSIAN SIGN VA
+103BB ; [.331C.0020.0002.103BB] # OLD PERSIAN SIGN VI
+103BC ; [.331D.0020.0002.103BC] # OLD PERSIAN SIGN RA
+103BD ; [.331E.0020.0002.103BD] # OLD PERSIAN SIGN RU
+103BE ; [.331F.0020.0002.103BE] # OLD PERSIAN SIGN LA
+103BF ; [.3320.0020.0002.103BF] # OLD PERSIAN SIGN SA
+103C0 ; [.3321.0020.0002.103C0] # OLD PERSIAN SIGN ZA
+103C1 ; [.3322.0020.0002.103C1] # OLD PERSIAN SIGN SHA
+103C2 ; [.3323.0020.0002.103C2] # OLD PERSIAN SIGN SSA
+103C3 ; [.3324.0020.0002.103C3] # OLD PERSIAN SIGN HA
+103C8 ; [.3325.0020.0002.103C8] # OLD PERSIAN SIGN AURAMAZDAA
+103C9 ; [.3326.0020.0002.103C9] # OLD PERSIAN SIGN AURAMAZDAA-2
+103CA ; [.3327.0020.0002.103CA] # OLD PERSIAN SIGN AURAMAZDAAHA
+103CB ; [.3328.0020.0002.103CB] # OLD PERSIAN SIGN XSHAAYATHIYA
+103CC ; [.3329.0020.0002.103CC] # OLD PERSIAN SIGN DAHYAAUSH
+103CD ; [.332A.0020.0002.103CD] # OLD PERSIAN SIGN DAHYAAUSH-2
+103CE ; [.332B.0020.0002.103CE] # OLD PERSIAN SIGN BAGA
+103CF ; [.332C.0020.0002.103CF] # OLD PERSIAN SIGN BUUMISH
+12000 ; [.332D.0020.0002.12000] # CUNEIFORM SIGN A
+12001 ; [.332E.0020.0002.12001] # CUNEIFORM SIGN A TIMES A
+12002 ; [.332F.0020.0002.12002] # CUNEIFORM SIGN A TIMES BAD
+12003 ; [.3330.0020.0002.12003] # CUNEIFORM SIGN A TIMES GAN2 TENU
+12004 ; [.3331.0020.0002.12004] # CUNEIFORM SIGN A TIMES HA
+12005 ; [.3332.0020.0002.12005] # CUNEIFORM SIGN A TIMES IGI
+12006 ; [.3333.0020.0002.12006] # CUNEIFORM SIGN A TIMES LAGAR GUNU
+12007 ; [.3334.0020.0002.12007] # CUNEIFORM SIGN A TIMES MUSH
+12008 ; [.3335.0020.0002.12008] # CUNEIFORM SIGN A TIMES SAG
+12009 ; [.3336.0020.0002.12009] # CUNEIFORM SIGN A2
+1200A ; [.3337.0020.0002.1200A] # CUNEIFORM SIGN AB
+1200B ; [.3338.0020.0002.1200B] # CUNEIFORM SIGN AB TIMES ASH2
+1200C ; [.3339.0020.0002.1200C] # CUNEIFORM SIGN AB TIMES DUN3 GUNU
+1200D ; [.333A.0020.0002.1200D] # CUNEIFORM SIGN AB TIMES GAL
+1200E ; [.333B.0020.0002.1200E] # CUNEIFORM SIGN AB TIMES GAN2 TENU
+1200F ; [.333C.0020.0002.1200F] # CUNEIFORM SIGN AB TIMES HA
+12010 ; [.333D.0020.0002.12010] # CUNEIFORM SIGN AB TIMES IGI GUNU
+12011 ; [.333E.0020.0002.12011] # CUNEIFORM SIGN AB TIMES IMIN
+12012 ; [.333F.0020.0002.12012] # CUNEIFORM SIGN AB TIMES LAGAB
+12013 ; [.3340.0020.0002.12013] # CUNEIFORM SIGN AB TIMES SHESH
+12014 ; [.3341.0020.0002.12014] # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U
+12015 ; [.3342.0020.0002.12015] # CUNEIFORM SIGN AB GUNU
+12016 ; [.3343.0020.0002.12016] # CUNEIFORM SIGN AB2
+12017 ; [.3344.0020.0002.12017] # CUNEIFORM SIGN AB2 TIMES BALAG
+12018 ; [.3345.0020.0002.12018] # CUNEIFORM SIGN AB2 TIMES GAN2 TENU
+12019 ; [.3346.0020.0002.12019] # CUNEIFORM SIGN AB2 TIMES ME PLUS EN
+1201A ; [.3347.0020.0002.1201A] # CUNEIFORM SIGN AB2 TIMES SHA3
+1201B ; [.3348.0020.0002.1201B] # CUNEIFORM SIGN AB2 TIMES TAK4
+1201C ; [.3349.0020.0002.1201C] # CUNEIFORM SIGN AD
+1201D ; [.334A.0020.0002.1201D] # CUNEIFORM SIGN AK
+1201E ; [.334B.0020.0002.1201E] # CUNEIFORM SIGN AK TIMES ERIN2
+1201F ; [.334C.0020.0002.1201F] # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH
+12020 ; [.334D.0020.0002.12020] # CUNEIFORM SIGN AL
+12021 ; [.334E.0020.0002.12021] # CUNEIFORM SIGN AL TIMES AL
+12022 ; [.334F.0020.0002.12022] # CUNEIFORM SIGN AL TIMES DIM2
+12023 ; [.3350.0020.0002.12023] # CUNEIFORM SIGN AL TIMES GISH
+12024 ; [.3351.0020.0002.12024] # CUNEIFORM SIGN AL TIMES HA
+12025 ; [.3352.0020.0002.12025] # CUNEIFORM SIGN AL TIMES KAD3
+12026 ; [.3353.0020.0002.12026] # CUNEIFORM SIGN AL TIMES KI
+12027 ; [.3354.0020.0002.12027] # CUNEIFORM SIGN AL TIMES SHE
+12028 ; [.3355.0020.0002.12028] # CUNEIFORM SIGN AL TIMES USH
+12029 ; [.3356.0020.0002.12029] # CUNEIFORM SIGN ALAN
+1202A ; [.3357.0020.0002.1202A] # CUNEIFORM SIGN ALEPH
+1202B ; [.3358.0020.0002.1202B] # CUNEIFORM SIGN AMAR
+1202C ; [.3359.0020.0002.1202C] # CUNEIFORM SIGN AMAR TIMES SHE
+1202D ; [.335A.0020.0002.1202D] # CUNEIFORM SIGN AN
+1202E ; [.335B.0020.0002.1202E] # CUNEIFORM SIGN AN OVER AN
+1202F ; [.335C.0020.0002.1202F] # CUNEIFORM SIGN AN THREE TIMES
+12030 ; [.335D.0020.0002.12030] # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA
+12031 ; [.335E.0020.0002.12031] # CUNEIFORM SIGN AN PLUS NAGA SQUARED
+12032 ; [.335F.0020.0002.12032] # CUNEIFORM SIGN ANSHE
+12033 ; [.3360.0020.0002.12033] # CUNEIFORM SIGN APIN
+12034 ; [.3361.0020.0002.12034] # CUNEIFORM SIGN ARAD
+12035 ; [.3362.0020.0002.12035] # CUNEIFORM SIGN ARAD TIMES KUR
+12036 ; [.3363.0020.0002.12036] # CUNEIFORM SIGN ARKAB
+12037 ; [.3364.0020.0002.12037] # CUNEIFORM SIGN ASAL2
+12038 ; [.3365.0020.0002.12038] # CUNEIFORM SIGN ASH
+12039 ; [.3366.0020.0002.12039] # CUNEIFORM SIGN ASH ZIDA TENU
+1203A ; [.3367.0020.0002.1203A] # CUNEIFORM SIGN ASH KABA TENU
+1203B ; [.3368.0020.0002.1203B] # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP
+1203C ; [.3369.0020.0002.1203C] # CUNEIFORM SIGN ASH OVER ASH OVER ASH
+1203D ; [.336A.0020.0002.1203D] # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH
+1203E ; [.336B.0020.0002.1203E] # CUNEIFORM SIGN ASH2
+1203F ; [.336C.0020.0002.1203F] # CUNEIFORM SIGN ASHGAB
+12040 ; [.336D.0020.0002.12040] # CUNEIFORM SIGN BA
+12041 ; [.336E.0020.0002.12041] # CUNEIFORM SIGN BAD
+12042 ; [.336F.0020.0002.12042] # CUNEIFORM SIGN BAG3
+12043 ; [.3370.0020.0002.12043] # CUNEIFORM SIGN BAHAR2
+12044 ; [.3371.0020.0002.12044] # CUNEIFORM SIGN BAL
+12045 ; [.3372.0020.0002.12045] # CUNEIFORM SIGN BAL OVER BAL
+12046 ; [.3373.0020.0002.12046] # CUNEIFORM SIGN BALAG
+12047 ; [.3374.0020.0002.12047] # CUNEIFORM SIGN BAR
+12048 ; [.3375.0020.0002.12048] # CUNEIFORM SIGN BARA2
+12049 ; [.3376.0020.0002.12049] # CUNEIFORM SIGN BI
+1204A ; [.3377.0020.0002.1204A] # CUNEIFORM SIGN BI TIMES A
+1204B ; [.3378.0020.0002.1204B] # CUNEIFORM SIGN BI TIMES GAR
+1204C ; [.3379.0020.0002.1204C] # CUNEIFORM SIGN BI TIMES IGI GUNU
+1204D ; [.337A.0020.0002.1204D] # CUNEIFORM SIGN BU
+1204E ; [.337B.0020.0002.1204E] # CUNEIFORM SIGN BU OVER BU AB
+1204F ; [.337C.0020.0002.1204F] # CUNEIFORM SIGN BU OVER BU UN
+12050 ; [.337D.0020.0002.12050] # CUNEIFORM SIGN BU CROSSING BU
+12051 ; [.337E.0020.0002.12051] # CUNEIFORM SIGN BULUG
+12052 ; [.337F.0020.0002.12052] # CUNEIFORM SIGN BULUG OVER BULUG
+12053 ; [.3380.0020.0002.12053] # CUNEIFORM SIGN BUR
+12054 ; [.3381.0020.0002.12054] # CUNEIFORM SIGN BUR2
+12055 ; [.3382.0020.0002.12055] # CUNEIFORM SIGN DA
+12056 ; [.3383.0020.0002.12056] # CUNEIFORM SIGN DAG
+12057 ; [.3384.0020.0002.12057] # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH
+12058 ; [.3385.0020.0002.12058] # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR
+12059 ; [.3386.0020.0002.12059] # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG
+1205A ; [.3387.0020.0002.1205A] # CUNEIFORM SIGN DAG KISIM5 TIMES BI
+1205B ; [.3388.0020.0002.1205B] # CUNEIFORM SIGN DAG KISIM5 TIMES GA
+1205C ; [.3389.0020.0002.1205C] # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH
+1205D ; [.338A.0020.0002.1205D] # CUNEIFORM SIGN DAG KISIM5 TIMES GI
+1205E ; [.338B.0020.0002.1205E] # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2
+1205F ; [.338C.0020.0002.1205F] # CUNEIFORM SIGN DAG KISIM5 TIMES GUD
+12060 ; [.338D.0020.0002.12060] # CUNEIFORM SIGN DAG KISIM5 TIMES HA
+12061 ; [.338E.0020.0002.12061] # CUNEIFORM SIGN DAG KISIM5 TIMES IR
+12062 ; [.338F.0020.0002.12062] # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU
+12063 ; [.3390.0020.0002.12063] # CUNEIFORM SIGN DAG KISIM5 TIMES KAK
+12064 ; [.3391.0020.0002.12064] # CUNEIFORM SIGN DAG KISIM5 TIMES LA
+12065 ; [.3392.0020.0002.12065] # CUNEIFORM SIGN DAG KISIM5 TIMES LU
+12066 ; [.3393.0020.0002.12066] # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2
+12067 ; [.3394.0020.0002.12067] # CUNEIFORM SIGN DAG KISIM5 TIMES LUM
+12068 ; [.3395.0020.0002.12068] # CUNEIFORM SIGN DAG KISIM5 TIMES NE
+12069 ; [.3396.0020.0002.12069] # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP
+1206A ; [.3397.0020.0002.1206A] # CUNEIFORM SIGN DAG KISIM5 TIMES SI
+1206B ; [.3398.0020.0002.1206B] # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4
+1206C ; [.3399.0020.0002.1206C] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2
+1206D ; [.339A.0020.0002.1206D] # CUNEIFORM SIGN DAG KISIM5 TIMES USH
+1206E ; [.339B.0020.0002.1206E] # CUNEIFORM SIGN DAM
+1206F ; [.339C.0020.0002.1206F] # CUNEIFORM SIGN DAR
+12070 ; [.339D.0020.0002.12070] # CUNEIFORM SIGN DARA3
+12071 ; [.339E.0020.0002.12071] # CUNEIFORM SIGN DARA4
+12072 ; [.339F.0020.0002.12072] # CUNEIFORM SIGN DI
+12073 ; [.33A0.0020.0002.12073] # CUNEIFORM SIGN DIB
+12074 ; [.33A1.0020.0002.12074] # CUNEIFORM SIGN DIM
+12075 ; [.33A2.0020.0002.12075] # CUNEIFORM SIGN DIM TIMES SHE
+12076 ; [.33A3.0020.0002.12076] # CUNEIFORM SIGN DIM2
+12077 ; [.33A4.0020.0002.12077] # CUNEIFORM SIGN DIN
+12078 ; [.33A5.0020.0002.12078] # CUNEIFORM SIGN DIN KASKAL U GUNU DISH
+12079 ; [.33A6.0020.0002.12079] # CUNEIFORM SIGN DISH
+1207A ; [.33A7.0020.0002.1207A] # CUNEIFORM SIGN DU
+1207B ; [.33A8.0020.0002.1207B] # CUNEIFORM SIGN DU OVER DU
+1207C ; [.33A9.0020.0002.1207C] # CUNEIFORM SIGN DU GUNU
+1207D ; [.33AA.0020.0002.1207D] # CUNEIFORM SIGN DU SHESHIG
+1207E ; [.33AB.0020.0002.1207E] # CUNEIFORM SIGN DUB
+1207F ; [.33AC.0020.0002.1207F] # CUNEIFORM SIGN DUB TIMES ESH2
+12080 ; [.33AD.0020.0002.12080] # CUNEIFORM SIGN DUB2
+12081 ; [.33AE.0020.0002.12081] # CUNEIFORM SIGN DUG
+12082 ; [.33AF.0020.0002.12082] # CUNEIFORM SIGN DUGUD
+12083 ; [.33B0.0020.0002.12083] # CUNEIFORM SIGN DUH
+12084 ; [.33B1.0020.0002.12084] # CUNEIFORM SIGN DUN
+12085 ; [.33B2.0020.0002.12085] # CUNEIFORM SIGN DUN3
+12086 ; [.33B3.0020.0002.12086] # CUNEIFORM SIGN DUN3 GUNU
+12087 ; [.33B4.0020.0002.12087] # CUNEIFORM SIGN DUN3 GUNU GUNU
+12088 ; [.33B5.0020.0002.12088] # CUNEIFORM SIGN DUN4
+12089 ; [.33B6.0020.0002.12089] # CUNEIFORM SIGN DUR2
+1208A ; [.33B7.0020.0002.1208A] # CUNEIFORM SIGN E
+1208B ; [.33B8.0020.0002.1208B] # CUNEIFORM SIGN E TIMES PAP
+1208C ; [.33B9.0020.0002.1208C] # CUNEIFORM SIGN E OVER E NUN OVER NUN
+1208D ; [.33BA.0020.0002.1208D] # CUNEIFORM SIGN E2
+1208E ; [.33BB.0020.0002.1208E] # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA
+1208F ; [.33BC.0020.0002.1208F] # CUNEIFORM SIGN E2 TIMES GAR
+12090 ; [.33BD.0020.0002.12090] # CUNEIFORM SIGN E2 TIMES MI
+12091 ; [.33BE.0020.0002.12091] # CUNEIFORM SIGN E2 TIMES SAL
+12092 ; [.33BF.0020.0002.12092] # CUNEIFORM SIGN E2 TIMES SHE
+12093 ; [.33C0.0020.0002.12093] # CUNEIFORM SIGN E2 TIMES U
+12094 ; [.33C1.0020.0002.12094] # CUNEIFORM SIGN EDIN
+12095 ; [.33C2.0020.0002.12095] # CUNEIFORM SIGN EGIR
+12096 ; [.33C3.0020.0002.12096] # CUNEIFORM SIGN EL
+12097 ; [.33C4.0020.0002.12097] # CUNEIFORM SIGN EN
+12098 ; [.33C5.0020.0002.12098] # CUNEIFORM SIGN EN TIMES GAN2
+12099 ; [.33C6.0020.0002.12099] # CUNEIFORM SIGN EN TIMES GAN2 TENU
+1209A ; [.33C7.0020.0002.1209A] # CUNEIFORM SIGN EN TIMES ME
+1209B ; [.33C8.0020.0002.1209B] # CUNEIFORM SIGN EN CROSSING EN
+1209C ; [.33C9.0020.0002.1209C] # CUNEIFORM SIGN EN OPPOSING EN
+1209D ; [.33CA.0020.0002.1209D] # CUNEIFORM SIGN EN SQUARED
+1209E ; [.33CB.0020.0002.1209E] # CUNEIFORM SIGN EREN
+1209F ; [.33CC.0020.0002.1209F] # CUNEIFORM SIGN ERIN2
+120A0 ; [.33CD.0020.0002.120A0] # CUNEIFORM SIGN ESH2
+120A1 ; [.33CE.0020.0002.120A1] # CUNEIFORM SIGN EZEN
+120A2 ; [.33CF.0020.0002.120A2] # CUNEIFORM SIGN EZEN TIMES A
+120A3 ; [.33D0.0020.0002.120A3] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL
+120A4 ; [.33D1.0020.0002.120A4] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL
+120A5 ; [.33D2.0020.0002.120A5] # CUNEIFORM SIGN EZEN TIMES AN
+120A6 ; [.33D3.0020.0002.120A6] # CUNEIFORM SIGN EZEN TIMES BAD
+120A7 ; [.33D4.0020.0002.120A7] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU
+120A8 ; [.33D5.0020.0002.120A8] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU
+120A9 ; [.33D6.0020.0002.120A9] # CUNEIFORM SIGN EZEN TIMES HA
+120AA ; [.33D7.0020.0002.120AA] # CUNEIFORM SIGN EZEN TIMES HA GUNU
+120AB ; [.33D8.0020.0002.120AB] # CUNEIFORM SIGN EZEN TIMES IGI GUNU
+120AC ; [.33D9.0020.0002.120AC] # CUNEIFORM SIGN EZEN TIMES KASKAL
+120AD ; [.33DA.0020.0002.120AD] # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED
+120AE ; [.33DB.0020.0002.120AE] # CUNEIFORM SIGN EZEN TIMES KU3
+120AF ; [.33DC.0020.0002.120AF] # CUNEIFORM SIGN EZEN TIMES LA
+120B0 ; [.33DD.0020.0002.120B0] # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL
+120B1 ; [.33DE.0020.0002.120B1] # CUNEIFORM SIGN EZEN TIMES LI
+120B2 ; [.33DF.0020.0002.120B2] # CUNEIFORM SIGN EZEN TIMES LU
+120B3 ; [.33E0.0020.0002.120B3] # CUNEIFORM SIGN EZEN TIMES U2
+120B4 ; [.33E1.0020.0002.120B4] # CUNEIFORM SIGN EZEN TIMES UD
+120B5 ; [.33E2.0020.0002.120B5] # CUNEIFORM SIGN GA
+120B6 ; [.33E3.0020.0002.120B6] # CUNEIFORM SIGN GA GUNU
+120B7 ; [.33E4.0020.0002.120B7] # CUNEIFORM SIGN GA2
+120B8 ; [.33E5.0020.0002.120B8] # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA
+120B9 ; [.33E6.0020.0002.120B9] # CUNEIFORM SIGN GA2 TIMES A PLUS HA
+120BA ; [.33E7.0020.0002.120BA] # CUNEIFORM SIGN GA2 TIMES A PLUS IGI
+120BB ; [.33E8.0020.0002.120BB] # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB
+120BC ; [.33E9.0020.0002.120BC] # CUNEIFORM SIGN GA2 TIMES AN
+120BD ; [.33EA.0020.0002.120BD] # CUNEIFORM SIGN GA2 TIMES ASH
+120BE ; [.33EB.0020.0002.120BE] # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL
+120BF ; [.33EC.0020.0002.120BF] # CUNEIFORM SIGN GA2 TIMES BAD
+120C0 ; [.33ED.0020.0002.120C0] # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA
+120C1 ; [.33EE.0020.0002.120C1] # CUNEIFORM SIGN GA2 TIMES BUR
+120C2 ; [.33EF.0020.0002.120C2] # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA
+120C3 ; [.33F0.0020.0002.120C3] # CUNEIFORM SIGN GA2 TIMES DA
+120C4 ; [.33F1.0020.0002.120C4] # CUNEIFORM SIGN GA2 TIMES DI
+120C5 ; [.33F2.0020.0002.120C5] # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE
+120C6 ; [.33F3.0020.0002.120C6] # CUNEIFORM SIGN GA2 TIMES DUB
+120C7 ; [.33F4.0020.0002.120C7] # CUNEIFORM SIGN GA2 TIMES EL
+120C8 ; [.33F5.0020.0002.120C8] # CUNEIFORM SIGN GA2 TIMES EL PLUS LA
+120C9 ; [.33F6.0020.0002.120C9] # CUNEIFORM SIGN GA2 TIMES EN
+120CA ; [.33F7.0020.0002.120CA] # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU
+120CB ; [.33F8.0020.0002.120CB] # CUNEIFORM SIGN GA2 TIMES GAN2 TENU
+120CC ; [.33F9.0020.0002.120CC] # CUNEIFORM SIGN GA2 TIMES GAR
+120CD ; [.33FA.0020.0002.120CD] # CUNEIFORM SIGN GA2 TIMES GI
+120CE ; [.33FB.0020.0002.120CE] # CUNEIFORM SIGN GA2 TIMES GI4
+120CF ; [.33FC.0020.0002.120CF] # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A
+120D0 ; [.33FD.0020.0002.120D0] # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU
+120D1 ; [.33FE.0020.0002.120D1] # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2
+120D2 ; [.33FF.0020.0002.120D2] # CUNEIFORM SIGN GA2 TIMES HAL
+120D3 ; [.3400.0020.0002.120D3] # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA
+120D4 ; [.3401.0020.0002.120D4] # CUNEIFORM SIGN GA2 TIMES HI PLUS LI
+120D5 ; [.3402.0020.0002.120D5] # CUNEIFORM SIGN GA2 TIMES HUB2
+120D6 ; [.3403.0020.0002.120D6] # CUNEIFORM SIGN GA2 TIMES IGI GUNU
+120D7 ; [.3404.0020.0002.120D7] # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH
+120D8 ; [.3405.0020.0002.120D8] # CUNEIFORM SIGN GA2 TIMES KAK
+120D9 ; [.3406.0020.0002.120D9] # CUNEIFORM SIGN GA2 TIMES KASKAL
+120DA ; [.3407.0020.0002.120DA] # CUNEIFORM SIGN GA2 TIMES KID
+120DB ; [.3408.0020.0002.120DB] # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL
+120DC ; [.3409.0020.0002.120DC] # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN
+120DD ; [.340A.0020.0002.120DD] # CUNEIFORM SIGN GA2 TIMES LA
+120DE ; [.340B.0020.0002.120DE] # CUNEIFORM SIGN GA2 TIMES ME PLUS EN
+120DF ; [.340C.0020.0002.120DF] # CUNEIFORM SIGN GA2 TIMES MI
+120E0 ; [.340D.0020.0002.120E0] # CUNEIFORM SIGN GA2 TIMES NUN
+120E1 ; [.340E.0020.0002.120E1] # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN
+120E2 ; [.340F.0020.0002.120E2] # CUNEIFORM SIGN GA2 TIMES PA
+120E3 ; [.3410.0020.0002.120E3] # CUNEIFORM SIGN GA2 TIMES SAL
+120E4 ; [.3411.0020.0002.120E4] # CUNEIFORM SIGN GA2 TIMES SAR
+120E5 ; [.3412.0020.0002.120E5] # CUNEIFORM SIGN GA2 TIMES SHE
+120E6 ; [.3413.0020.0002.120E6] # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR
+120E7 ; [.3414.0020.0002.120E7] # CUNEIFORM SIGN GA2 TIMES SHID
+120E8 ; [.3415.0020.0002.120E8] # CUNEIFORM SIGN GA2 TIMES SUM
+120E9 ; [.3416.0020.0002.120E9] # CUNEIFORM SIGN GA2 TIMES TAK4
+120EA ; [.3417.0020.0002.120EA] # CUNEIFORM SIGN GA2 TIMES U
+120EB ; [.3418.0020.0002.120EB] # CUNEIFORM SIGN GA2 TIMES UD
+120EC ; [.3419.0020.0002.120EC] # CUNEIFORM SIGN GA2 TIMES UD PLUS DU
+120ED ; [.341A.0020.0002.120ED] # CUNEIFORM SIGN GA2 OVER GA2
+120EE ; [.341B.0020.0002.120EE] # CUNEIFORM SIGN GABA
+120EF ; [.341C.0020.0002.120EF] # CUNEIFORM SIGN GABA CROSSING GABA
+120F0 ; [.341D.0020.0002.120F0] # CUNEIFORM SIGN GAD
+120F1 ; [.341E.0020.0002.120F1] # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR
+120F2 ; [.341F.0020.0002.120F2] # CUNEIFORM SIGN GAL
+120F3 ; [.3420.0020.0002.120F3] # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR
+120F4 ; [.3421.0020.0002.120F4] # CUNEIFORM SIGN GALAM
+120F5 ; [.3422.0020.0002.120F5] # CUNEIFORM SIGN GAM
+120F6 ; [.3423.0020.0002.120F6] # CUNEIFORM SIGN GAN
+120F7 ; [.3424.0020.0002.120F7] # CUNEIFORM SIGN GAN2
+120F8 ; [.3425.0020.0002.120F8] # CUNEIFORM SIGN GAN2 TENU
+120F9 ; [.3426.0020.0002.120F9] # CUNEIFORM SIGN GAN2 OVER GAN2
+120FA ; [.3427.0020.0002.120FA] # CUNEIFORM SIGN GAN2 CROSSING GAN2
+120FB ; [.3428.0020.0002.120FB] # CUNEIFORM SIGN GAR
+120FC ; [.3429.0020.0002.120FC] # CUNEIFORM SIGN GAR3
+120FD ; [.342A.0020.0002.120FD] # CUNEIFORM SIGN GASHAN
+120FE ; [.342B.0020.0002.120FE] # CUNEIFORM SIGN GESHTIN
+120FF ; [.342C.0020.0002.120FF] # CUNEIFORM SIGN GESHTIN TIMES KUR
+12100 ; [.342D.0020.0002.12100] # CUNEIFORM SIGN GI
+12101 ; [.342E.0020.0002.12101] # CUNEIFORM SIGN GI TIMES E
+12102 ; [.342F.0020.0002.12102] # CUNEIFORM SIGN GI TIMES U
+12103 ; [.3430.0020.0002.12103] # CUNEIFORM SIGN GI CROSSING GI
+12104 ; [.3431.0020.0002.12104] # CUNEIFORM SIGN GI4
+12105 ; [.3432.0020.0002.12105] # CUNEIFORM SIGN GI4 OVER GI4
+12106 ; [.3433.0020.0002.12106] # CUNEIFORM SIGN GI4 CROSSING GI4
+12107 ; [.3434.0020.0002.12107] # CUNEIFORM SIGN GIDIM
+12108 ; [.3435.0020.0002.12108] # CUNEIFORM SIGN GIR2
+12109 ; [.3436.0020.0002.12109] # CUNEIFORM SIGN GIR2 GUNU
+1210A ; [.3437.0020.0002.1210A] # CUNEIFORM SIGN GIR3
+1210B ; [.3438.0020.0002.1210B] # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI
+1210C ; [.3439.0020.0002.1210C] # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU
+1210D ; [.343A.0020.0002.1210D] # CUNEIFORM SIGN GIR3 TIMES IGI
+1210E ; [.343B.0020.0002.1210E] # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI
+1210F ; [.343C.0020.0002.1210F] # CUNEIFORM SIGN GIR3 TIMES PA
+12110 ; [.343D.0020.0002.12110] # CUNEIFORM SIGN GISAL
+12111 ; [.343E.0020.0002.12111] # CUNEIFORM SIGN GISH
+12112 ; [.343F.0020.0002.12112] # CUNEIFORM SIGN GISH CROSSING GISH
+12113 ; [.3440.0020.0002.12113] # CUNEIFORM SIGN GISH TIMES BAD
+12114 ; [.3441.0020.0002.12114] # CUNEIFORM SIGN GISH TIMES TAK4
+12115 ; [.3442.0020.0002.12115] # CUNEIFORM SIGN GISH TENU
+12116 ; [.3443.0020.0002.12116] # CUNEIFORM SIGN GU
+12117 ; [.3444.0020.0002.12117] # CUNEIFORM SIGN GU CROSSING GU
+12118 ; [.3445.0020.0002.12118] # CUNEIFORM SIGN GU2
+12119 ; [.3446.0020.0002.12119] # CUNEIFORM SIGN GU2 TIMES KAK
+1211A ; [.3447.0020.0002.1211A] # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU
+1211B ; [.3448.0020.0002.1211B] # CUNEIFORM SIGN GU2 TIMES NUN
+1211C ; [.3449.0020.0002.1211C] # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2
+1211D ; [.344A.0020.0002.1211D] # CUNEIFORM SIGN GU2 GUNU
+1211E ; [.344B.0020.0002.1211E] # CUNEIFORM SIGN GUD
+1211F ; [.344C.0020.0002.1211F] # CUNEIFORM SIGN GUD TIMES A PLUS KUR
+12120 ; [.344D.0020.0002.12120] # CUNEIFORM SIGN GUD TIMES KUR
+12121 ; [.344E.0020.0002.12121] # CUNEIFORM SIGN GUD OVER GUD LUGAL
+12122 ; [.344F.0020.0002.12122] # CUNEIFORM SIGN GUL
+12123 ; [.3450.0020.0002.12123] # CUNEIFORM SIGN GUM
+12124 ; [.3451.0020.0002.12124] # CUNEIFORM SIGN GUM TIMES SHE
+12125 ; [.3452.0020.0002.12125] # CUNEIFORM SIGN GUR
+12126 ; [.3453.0020.0002.12126] # CUNEIFORM SIGN GUR7
+12127 ; [.3454.0020.0002.12127] # CUNEIFORM SIGN GURUN
+12128 ; [.3455.0020.0002.12128] # CUNEIFORM SIGN GURUSH
+12129 ; [.3456.0020.0002.12129] # CUNEIFORM SIGN HA
+1212A ; [.3457.0020.0002.1212A] # CUNEIFORM SIGN HA TENU
+1212B ; [.3458.0020.0002.1212B] # CUNEIFORM SIGN HA GUNU
+1212C ; [.3459.0020.0002.1212C] # CUNEIFORM SIGN HAL
+1212D ; [.345A.0020.0002.1212D] # CUNEIFORM SIGN HI
+1212E ; [.345B.0020.0002.1212E] # CUNEIFORM SIGN HI TIMES ASH
+1212F ; [.345C.0020.0002.1212F] # CUNEIFORM SIGN HI TIMES ASH2
+12130 ; [.345D.0020.0002.12130] # CUNEIFORM SIGN HI TIMES BAD
+12131 ; [.345E.0020.0002.12131] # CUNEIFORM SIGN HI TIMES DISH
+12132 ; [.345F.0020.0002.12132] # CUNEIFORM SIGN HI TIMES GAD
+12133 ; [.3460.0020.0002.12133] # CUNEIFORM SIGN HI TIMES KIN
+12134 ; [.3461.0020.0002.12134] # CUNEIFORM SIGN HI TIMES NUN
+12135 ; [.3462.0020.0002.12135] # CUNEIFORM SIGN HI TIMES SHE
+12136 ; [.3463.0020.0002.12136] # CUNEIFORM SIGN HI TIMES U
+12137 ; [.3464.0020.0002.12137] # CUNEIFORM SIGN HU
+12138 ; [.3465.0020.0002.12138] # CUNEIFORM SIGN HUB2
+12139 ; [.3466.0020.0002.12139] # CUNEIFORM SIGN HUB2 TIMES AN
+1213A ; [.3467.0020.0002.1213A] # CUNEIFORM SIGN HUB2 TIMES HAL
+1213B ; [.3468.0020.0002.1213B] # CUNEIFORM SIGN HUB2 TIMES KASKAL
+1213C ; [.3469.0020.0002.1213C] # CUNEIFORM SIGN HUB2 TIMES LISH
+1213D ; [.346A.0020.0002.1213D] # CUNEIFORM SIGN HUB2 TIMES UD
+1213E ; [.346B.0020.0002.1213E] # CUNEIFORM SIGN HUL2
+1213F ; [.346C.0020.0002.1213F] # CUNEIFORM SIGN I
+12140 ; [.346D.0020.0002.12140] # CUNEIFORM SIGN I A
+12141 ; [.346E.0020.0002.12141] # CUNEIFORM SIGN IB
+12142 ; [.346F.0020.0002.12142] # CUNEIFORM SIGN IDIM
+12143 ; [.3470.0020.0002.12143] # CUNEIFORM SIGN IDIM OVER IDIM BUR
+12144 ; [.3471.0020.0002.12144] # CUNEIFORM SIGN IDIM OVER IDIM SQUARED
+12145 ; [.3472.0020.0002.12145] # CUNEIFORM SIGN IG
+12146 ; [.3473.0020.0002.12146] # CUNEIFORM SIGN IGI
+12147 ; [.3474.0020.0002.12147] # CUNEIFORM SIGN IGI DIB
+12148 ; [.3475.0020.0002.12148] # CUNEIFORM SIGN IGI RI
+12149 ; [.3476.0020.0002.12149] # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD
+1214A ; [.3477.0020.0002.1214A] # CUNEIFORM SIGN IGI GUNU
+1214B ; [.3478.0020.0002.1214B] # CUNEIFORM SIGN IL
+1214C ; [.3479.0020.0002.1214C] # CUNEIFORM SIGN IL TIMES GAN2 TENU
+1214D ; [.347A.0020.0002.1214D] # CUNEIFORM SIGN IL2
+1214E ; [.347B.0020.0002.1214E] # CUNEIFORM SIGN IM
+1214F ; [.347C.0020.0002.1214F] # CUNEIFORM SIGN IM TIMES TAK4
+12150 ; [.347D.0020.0002.12150] # CUNEIFORM SIGN IM CROSSING IM
+12151 ; [.347E.0020.0002.12151] # CUNEIFORM SIGN IM OPPOSING IM
+12152 ; [.347F.0020.0002.12152] # CUNEIFORM SIGN IM SQUARED
+12153 ; [.3480.0020.0002.12153] # CUNEIFORM SIGN IMIN
+12154 ; [.3481.0020.0002.12154] # CUNEIFORM SIGN IN
+12155 ; [.3482.0020.0002.12155] # CUNEIFORM SIGN IR
+12156 ; [.3483.0020.0002.12156] # CUNEIFORM SIGN ISH
+12157 ; [.3484.0020.0002.12157] # CUNEIFORM SIGN KA
+12158 ; [.3485.0020.0002.12158] # CUNEIFORM SIGN KA TIMES A
+12159 ; [.3486.0020.0002.12159] # CUNEIFORM SIGN KA TIMES AD
+1215A ; [.3487.0020.0002.1215A] # CUNEIFORM SIGN KA TIMES AD PLUS KU3
+1215B ; [.3488.0020.0002.1215B] # CUNEIFORM SIGN KA TIMES ASH2
+1215C ; [.3489.0020.0002.1215C] # CUNEIFORM SIGN KA TIMES BAD
+1215D ; [.348A.0020.0002.1215D] # CUNEIFORM SIGN KA TIMES BALAG
+1215E ; [.348B.0020.0002.1215E] # CUNEIFORM SIGN KA TIMES BAR
+1215F ; [.348C.0020.0002.1215F] # CUNEIFORM SIGN KA TIMES BI
+12160 ; [.348D.0020.0002.12160] # CUNEIFORM SIGN KA TIMES ERIN2
+12161 ; [.348E.0020.0002.12161] # CUNEIFORM SIGN KA TIMES ESH2
+12162 ; [.348F.0020.0002.12162] # CUNEIFORM SIGN KA TIMES GA
+12163 ; [.3490.0020.0002.12163] # CUNEIFORM SIGN KA TIMES GAL
+12164 ; [.3491.0020.0002.12164] # CUNEIFORM SIGN KA TIMES GAN2 TENU
+12165 ; [.3492.0020.0002.12165] # CUNEIFORM SIGN KA TIMES GAR
+12166 ; [.3493.0020.0002.12166] # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A
+12167 ; [.3494.0020.0002.12167] # CUNEIFORM SIGN KA TIMES GI
+12168 ; [.3495.0020.0002.12168] # CUNEIFORM SIGN KA TIMES GIR2
+12169 ; [.3496.0020.0002.12169] # CUNEIFORM SIGN KA TIMES GISH PLUS SAR
+1216A ; [.3497.0020.0002.1216A] # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH
+1216B ; [.3498.0020.0002.1216B] # CUNEIFORM SIGN KA TIMES GU
+1216C ; [.3499.0020.0002.1216C] # CUNEIFORM SIGN KA TIMES GUR7
+1216D ; [.349A.0020.0002.1216D] # CUNEIFORM SIGN KA TIMES IGI
+1216E ; [.349B.0020.0002.1216E] # CUNEIFORM SIGN KA TIMES IM
+1216F ; [.349C.0020.0002.1216F] # CUNEIFORM SIGN KA TIMES KAK
+12170 ; [.349D.0020.0002.12170] # CUNEIFORM SIGN KA TIMES KI
+12171 ; [.349E.0020.0002.12171] # CUNEIFORM SIGN KA TIMES KID
+12172 ; [.349F.0020.0002.12172] # CUNEIFORM SIGN KA TIMES LI
+12173 ; [.34A0.0020.0002.12173] # CUNEIFORM SIGN KA TIMES LU
+12174 ; [.34A1.0020.0002.12174] # CUNEIFORM SIGN KA TIMES ME
+12175 ; [.34A2.0020.0002.12175] # CUNEIFORM SIGN KA TIMES ME PLUS DU
+12176 ; [.34A3.0020.0002.12176] # CUNEIFORM SIGN KA TIMES ME PLUS GI
+12177 ; [.34A4.0020.0002.12177] # CUNEIFORM SIGN KA TIMES ME PLUS TE
+12178 ; [.34A5.0020.0002.12178] # CUNEIFORM SIGN KA TIMES MI
+12179 ; [.34A6.0020.0002.12179] # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ
+1217A ; [.34A7.0020.0002.1217A] # CUNEIFORM SIGN KA TIMES NE
+1217B ; [.34A8.0020.0002.1217B] # CUNEIFORM SIGN KA TIMES NUN
+1217C ; [.34A9.0020.0002.1217C] # CUNEIFORM SIGN KA TIMES PI
+1217D ; [.34AA.0020.0002.1217D] # CUNEIFORM SIGN KA TIMES RU
+1217E ; [.34AB.0020.0002.1217E] # CUNEIFORM SIGN KA TIMES SA
+1217F ; [.34AC.0020.0002.1217F] # CUNEIFORM SIGN KA TIMES SAR
+12180 ; [.34AD.0020.0002.12180] # CUNEIFORM SIGN KA TIMES SHA
+12181 ; [.34AE.0020.0002.12181] # CUNEIFORM SIGN KA TIMES SHE
+12182 ; [.34AF.0020.0002.12182] # CUNEIFORM SIGN KA TIMES SHID
+12183 ; [.34B0.0020.0002.12183] # CUNEIFORM SIGN KA TIMES SHU
+12184 ; [.34B1.0020.0002.12184] # CUNEIFORM SIGN KA TIMES SIG
+12185 ; [.34B2.0020.0002.12185] # CUNEIFORM SIGN KA TIMES SUHUR
+12186 ; [.34B3.0020.0002.12186] # CUNEIFORM SIGN KA TIMES TAR
+12187 ; [.34B4.0020.0002.12187] # CUNEIFORM SIGN KA TIMES U
+12188 ; [.34B5.0020.0002.12188] # CUNEIFORM SIGN KA TIMES U2
+12189 ; [.34B6.0020.0002.12189] # CUNEIFORM SIGN KA TIMES UD
+1218A ; [.34B7.0020.0002.1218A] # CUNEIFORM SIGN KA TIMES UMUM TIMES PA
+1218B ; [.34B8.0020.0002.1218B] # CUNEIFORM SIGN KA TIMES USH
+1218C ; [.34B9.0020.0002.1218C] # CUNEIFORM SIGN KA TIMES ZI
+1218D ; [.34BA.0020.0002.1218D] # CUNEIFORM SIGN KA2
+1218E ; [.34BB.0020.0002.1218E] # CUNEIFORM SIGN KA2 CROSSING KA2
+1218F ; [.34BC.0020.0002.1218F] # CUNEIFORM SIGN KAB
+12190 ; [.34BD.0020.0002.12190] # CUNEIFORM SIGN KAD2
+12191 ; [.34BE.0020.0002.12191] # CUNEIFORM SIGN KAD3
+12192 ; [.34BF.0020.0002.12192] # CUNEIFORM SIGN KAD4
+12193 ; [.34C0.0020.0002.12193] # CUNEIFORM SIGN KAD5
+12194 ; [.34C1.0020.0002.12194] # CUNEIFORM SIGN KAD5 OVER KAD5
+12195 ; [.34C2.0020.0002.12195] # CUNEIFORM SIGN KAK
+12196 ; [.34C3.0020.0002.12196] # CUNEIFORM SIGN KAK TIMES IGI GUNU
+12197 ; [.34C4.0020.0002.12197] # CUNEIFORM SIGN KAL
+12198 ; [.34C5.0020.0002.12198] # CUNEIFORM SIGN KAL TIMES BAD
+12199 ; [.34C6.0020.0002.12199] # CUNEIFORM SIGN KAL CROSSING KAL
+1219A ; [.34C7.0020.0002.1219A] # CUNEIFORM SIGN KAM2
+1219B ; [.34C8.0020.0002.1219B] # CUNEIFORM SIGN KAM4
+1219C ; [.34C9.0020.0002.1219C] # CUNEIFORM SIGN KASKAL
+1219D ; [.34CA.0020.0002.1219D] # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219E ; [.34CB.0020.0002.1219E] # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219F ; [.34CC.0020.0002.1219F] # CUNEIFORM SIGN KESH2
+121A0 ; [.34CD.0020.0002.121A0] # CUNEIFORM SIGN KI
+121A1 ; [.34CE.0020.0002.121A1] # CUNEIFORM SIGN KI TIMES BAD
+121A2 ; [.34CF.0020.0002.121A2] # CUNEIFORM SIGN KI TIMES U
+121A3 ; [.34D0.0020.0002.121A3] # CUNEIFORM SIGN KI TIMES UD
+121A4 ; [.34D1.0020.0002.121A4] # CUNEIFORM SIGN KID
+121A5 ; [.34D2.0020.0002.121A5] # CUNEIFORM SIGN KIN
+121A6 ; [.34D3.0020.0002.121A6] # CUNEIFORM SIGN KISAL
+121A7 ; [.34D4.0020.0002.121A7] # CUNEIFORM SIGN KISH
+121A8 ; [.34D5.0020.0002.121A8] # CUNEIFORM SIGN KISIM5
+121A9 ; [.34D6.0020.0002.121A9] # CUNEIFORM SIGN KISIM5 OVER KISIM5
+121AA ; [.34D7.0020.0002.121AA] # CUNEIFORM SIGN KU
+121AB ; [.34D8.0020.0002.121AB] # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2
+121AC ; [.34D9.0020.0002.121AC] # CUNEIFORM SIGN KU3
+121AD ; [.34DA.0020.0002.121AD] # CUNEIFORM SIGN KU4
+121AE ; [.34DB.0020.0002.121AE] # CUNEIFORM SIGN KU4 VARIANT FORM
+121AF ; [.34DC.0020.0002.121AF] # CUNEIFORM SIGN KU7
+121B0 ; [.34DD.0020.0002.121B0] # CUNEIFORM SIGN KUL
+121B1 ; [.34DE.0020.0002.121B1] # CUNEIFORM SIGN KUL GUNU
+121B2 ; [.34DF.0020.0002.121B2] # CUNEIFORM SIGN KUN
+121B3 ; [.34E0.0020.0002.121B3] # CUNEIFORM SIGN KUR
+121B4 ; [.34E1.0020.0002.121B4] # CUNEIFORM SIGN KUR OPPOSING KUR
+121B5 ; [.34E2.0020.0002.121B5] # CUNEIFORM SIGN KUSHU2
+121B6 ; [.34E3.0020.0002.121B6] # CUNEIFORM SIGN KWU318
+121B7 ; [.34E4.0020.0002.121B7] # CUNEIFORM SIGN LA
+121B8 ; [.34E5.0020.0002.121B8] # CUNEIFORM SIGN LAGAB
+121B9 ; [.34E6.0020.0002.121B9] # CUNEIFORM SIGN LAGAB TIMES A
+121BA ; [.34E7.0020.0002.121BA] # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA
+121BB ; [.34E8.0020.0002.121BB] # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR
+121BC ; [.34E9.0020.0002.121BC] # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL
+121BD ; [.34EA.0020.0002.121BD] # CUNEIFORM SIGN LAGAB TIMES AL
+121BE ; [.34EB.0020.0002.121BE] # CUNEIFORM SIGN LAGAB TIMES AN
+121BF ; [.34EC.0020.0002.121BF] # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU
+121C0 ; [.34ED.0020.0002.121C0] # CUNEIFORM SIGN LAGAB TIMES BAD
+121C1 ; [.34EE.0020.0002.121C1] # CUNEIFORM SIGN LAGAB TIMES BI
+121C2 ; [.34EF.0020.0002.121C2] # CUNEIFORM SIGN LAGAB TIMES DAR
+121C3 ; [.34F0.0020.0002.121C3] # CUNEIFORM SIGN LAGAB TIMES EN
+121C4 ; [.34F1.0020.0002.121C4] # CUNEIFORM SIGN LAGAB TIMES GA
+121C5 ; [.34F2.0020.0002.121C5] # CUNEIFORM SIGN LAGAB TIMES GAR
+121C6 ; [.34F3.0020.0002.121C6] # CUNEIFORM SIGN LAGAB TIMES GUD
+121C7 ; [.34F4.0020.0002.121C7] # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD
+121C8 ; [.34F5.0020.0002.121C8] # CUNEIFORM SIGN LAGAB TIMES HA
+121C9 ; [.34F6.0020.0002.121C9] # CUNEIFORM SIGN LAGAB TIMES HAL
+121CA ; [.34F7.0020.0002.121CA] # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN
+121CB ; [.34F8.0020.0002.121CB] # CUNEIFORM SIGN LAGAB TIMES IGI GUNU
+121CC ; [.34F9.0020.0002.121CC] # CUNEIFORM SIGN LAGAB TIMES IM
+121CD ; [.34FA.0020.0002.121CD] # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA
+121CE ; [.34FB.0020.0002.121CE] # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU
+121CF ; [.34FC.0020.0002.121CF] # CUNEIFORM SIGN LAGAB TIMES KI
+121D0 ; [.34FD.0020.0002.121D0] # CUNEIFORM SIGN LAGAB TIMES KIN
+121D1 ; [.34FE.0020.0002.121D1] # CUNEIFORM SIGN LAGAB TIMES KU3
+121D2 ; [.34FF.0020.0002.121D2] # CUNEIFORM SIGN LAGAB TIMES KUL
+121D3 ; [.3500.0020.0002.121D3] # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A
+121D4 ; [.3501.0020.0002.121D4] # CUNEIFORM SIGN LAGAB TIMES LAGAB
+121D5 ; [.3502.0020.0002.121D5] # CUNEIFORM SIGN LAGAB TIMES LISH
+121D6 ; [.3503.0020.0002.121D6] # CUNEIFORM SIGN LAGAB TIMES LU
+121D7 ; [.3504.0020.0002.121D7] # CUNEIFORM SIGN LAGAB TIMES LUL
+121D8 ; [.3505.0020.0002.121D8] # CUNEIFORM SIGN LAGAB TIMES ME
+121D9 ; [.3506.0020.0002.121D9] # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN
+121DA ; [.3507.0020.0002.121DA] # CUNEIFORM SIGN LAGAB TIMES MUSH
+121DB ; [.3508.0020.0002.121DB] # CUNEIFORM SIGN LAGAB TIMES NE
+121DC ; [.3509.0020.0002.121DC] # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM
+121DD ; [.350A.0020.0002.121DD] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2
+121DE ; [.350B.0020.0002.121DE] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU
+121DF ; [.350C.0020.0002.121DF] # CUNEIFORM SIGN LAGAB TIMES SHU2
+121E0 ; [.350D.0020.0002.121E0] # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2
+121E1 ; [.350E.0020.0002.121E1] # CUNEIFORM SIGN LAGAB TIMES SUM
+121E2 ; [.350F.0020.0002.121E2] # CUNEIFORM SIGN LAGAB TIMES TAG
+121E3 ; [.3510.0020.0002.121E3] # CUNEIFORM SIGN LAGAB TIMES TAK4
+121E4 ; [.3511.0020.0002.121E4] # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA
+121E5 ; [.3512.0020.0002.121E5] # CUNEIFORM SIGN LAGAB TIMES U
+121E6 ; [.3513.0020.0002.121E6] # CUNEIFORM SIGN LAGAB TIMES U PLUS A
+121E7 ; [.3514.0020.0002.121E7] # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U
+121E8 ; [.3515.0020.0002.121E8] # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH
+121E9 ; [.3516.0020.0002.121E9] # CUNEIFORM SIGN LAGAB TIMES UD
+121EA ; [.3517.0020.0002.121EA] # CUNEIFORM SIGN LAGAB TIMES USH
+121EB ; [.3518.0020.0002.121EB] # CUNEIFORM SIGN LAGAB SQUARED
+121EC ; [.3519.0020.0002.121EC] # CUNEIFORM SIGN LAGAR
+121ED ; [.351A.0020.0002.121ED] # CUNEIFORM SIGN LAGAR TIMES SHE
+121EE ; [.351B.0020.0002.121EE] # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM
+121EF ; [.351C.0020.0002.121EF] # CUNEIFORM SIGN LAGAR GUNU
+121F0 ; [.351D.0020.0002.121F0] # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE
+121F1 ; [.351E.0020.0002.121F1] # CUNEIFORM SIGN LAHSHU
+121F2 ; [.351F.0020.0002.121F2] # CUNEIFORM SIGN LAL
+121F3 ; [.3520.0020.0002.121F3] # CUNEIFORM SIGN LAL TIMES LAL
+121F4 ; [.3521.0020.0002.121F4] # CUNEIFORM SIGN LAM
+121F5 ; [.3522.0020.0002.121F5] # CUNEIFORM SIGN LAM TIMES KUR
+121F6 ; [.3523.0020.0002.121F6] # CUNEIFORM SIGN LAM TIMES KUR PLUS RU
+121F7 ; [.3524.0020.0002.121F7] # CUNEIFORM SIGN LI
+121F8 ; [.3525.0020.0002.121F8] # CUNEIFORM SIGN LIL
+121F9 ; [.3526.0020.0002.121F9] # CUNEIFORM SIGN LIMMU2
+121FA ; [.3527.0020.0002.121FA] # CUNEIFORM SIGN LISH
+121FB ; [.3528.0020.0002.121FB] # CUNEIFORM SIGN LU
+121FC ; [.3529.0020.0002.121FC] # CUNEIFORM SIGN LU TIMES BAD
+121FD ; [.352A.0020.0002.121FD] # CUNEIFORM SIGN LU2
+121FE ; [.352B.0020.0002.121FE] # CUNEIFORM SIGN LU2 TIMES AL
+121FF ; [.352C.0020.0002.121FF] # CUNEIFORM SIGN LU2 TIMES BAD
+12200 ; [.352D.0020.0002.12200] # CUNEIFORM SIGN LU2 TIMES ESH2
+12201 ; [.352E.0020.0002.12201] # CUNEIFORM SIGN LU2 TIMES ESH2 TENU
+12202 ; [.352F.0020.0002.12202] # CUNEIFORM SIGN LU2 TIMES GAN2 TENU
+12203 ; [.3530.0020.0002.12203] # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD
+12204 ; [.3531.0020.0002.12204] # CUNEIFORM SIGN LU2 TIMES IM
+12205 ; [.3532.0020.0002.12205] # CUNEIFORM SIGN LU2 TIMES KAD2
+12206 ; [.3533.0020.0002.12206] # CUNEIFORM SIGN LU2 TIMES KAD3
+12207 ; [.3534.0020.0002.12207] # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH
+12208 ; [.3535.0020.0002.12208] # CUNEIFORM SIGN LU2 TIMES KI
+12209 ; [.3536.0020.0002.12209] # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH
+1220A ; [.3537.0020.0002.1220A] # CUNEIFORM SIGN LU2 TIMES LAGAB
+1220B ; [.3538.0020.0002.1220B] # CUNEIFORM SIGN LU2 TIMES ME PLUS EN
+1220C ; [.3539.0020.0002.1220C] # CUNEIFORM SIGN LU2 TIMES NE
+1220D ; [.353A.0020.0002.1220D] # CUNEIFORM SIGN LU2 TIMES NU
+1220E ; [.353B.0020.0002.1220E] # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH
+1220F ; [.353C.0020.0002.1220F] # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU
+12210 ; [.353D.0020.0002.12210] # CUNEIFORM SIGN LU2 TIMES TUG2
+12211 ; [.353E.0020.0002.12211] # CUNEIFORM SIGN LU2 TENU
+12212 ; [.353F.0020.0002.12212] # CUNEIFORM SIGN LU2 CROSSING LU2
+12213 ; [.3540.0020.0002.12213] # CUNEIFORM SIGN LU2 OPPOSING LU2
+12214 ; [.3541.0020.0002.12214] # CUNEIFORM SIGN LU2 SQUARED
+12215 ; [.3542.0020.0002.12215] # CUNEIFORM SIGN LU2 SHESHIG
+12216 ; [.3543.0020.0002.12216] # CUNEIFORM SIGN LU3
+12217 ; [.3544.0020.0002.12217] # CUNEIFORM SIGN LUGAL
+12218 ; [.3545.0020.0002.12218] # CUNEIFORM SIGN LUGAL OVER LUGAL
+12219 ; [.3546.0020.0002.12219] # CUNEIFORM SIGN LUGAL OPPOSING LUGAL
+1221A ; [.3547.0020.0002.1221A] # CUNEIFORM SIGN LUGAL SHESHIG
+1221B ; [.3548.0020.0002.1221B] # CUNEIFORM SIGN LUH
+1221C ; [.3549.0020.0002.1221C] # CUNEIFORM SIGN LUL
+1221D ; [.354A.0020.0002.1221D] # CUNEIFORM SIGN LUM
+1221E ; [.354B.0020.0002.1221E] # CUNEIFORM SIGN LUM OVER LUM
+1221F ; [.354C.0020.0002.1221F] # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR
+12220 ; [.354D.0020.0002.12220] # CUNEIFORM SIGN MA
+12221 ; [.354E.0020.0002.12221] # CUNEIFORM SIGN MA TIMES TAK4
+12222 ; [.354F.0020.0002.12222] # CUNEIFORM SIGN MA GUNU
+12223 ; [.3550.0020.0002.12223] # CUNEIFORM SIGN MA2
+12224 ; [.3551.0020.0002.12224] # CUNEIFORM SIGN MAH
+12225 ; [.3552.0020.0002.12225] # CUNEIFORM SIGN MAR
+12226 ; [.3553.0020.0002.12226] # CUNEIFORM SIGN MASH
+12227 ; [.3554.0020.0002.12227] # CUNEIFORM SIGN MASH2
+12228 ; [.3555.0020.0002.12228] # CUNEIFORM SIGN ME
+12229 ; [.3556.0020.0002.12229] # CUNEIFORM SIGN MES
+1222A ; [.3557.0020.0002.1222A] # CUNEIFORM SIGN MI
+1222B ; [.3558.0020.0002.1222B] # CUNEIFORM SIGN MIN
+1222C ; [.3559.0020.0002.1222C] # CUNEIFORM SIGN MU
+1222D ; [.355A.0020.0002.1222D] # CUNEIFORM SIGN MU OVER MU
+1222E ; [.355B.0020.0002.1222E] # CUNEIFORM SIGN MUG
+1222F ; [.355C.0020.0002.1222F] # CUNEIFORM SIGN MUG GUNU
+12230 ; [.355D.0020.0002.12230] # CUNEIFORM SIGN MUNSUB
+12231 ; [.355E.0020.0002.12231] # CUNEIFORM SIGN MURGU2
+12232 ; [.355F.0020.0002.12232] # CUNEIFORM SIGN MUSH
+12233 ; [.3560.0020.0002.12233] # CUNEIFORM SIGN MUSH TIMES A
+12234 ; [.3561.0020.0002.12234] # CUNEIFORM SIGN MUSH TIMES KUR
+12235 ; [.3562.0020.0002.12235] # CUNEIFORM SIGN MUSH TIMES ZA
+12236 ; [.3563.0020.0002.12236] # CUNEIFORM SIGN MUSH OVER MUSH
+12237 ; [.3564.0020.0002.12237] # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA
+12238 ; [.3565.0020.0002.12238] # CUNEIFORM SIGN MUSH CROSSING MUSH
+12239 ; [.3566.0020.0002.12239] # CUNEIFORM SIGN MUSH3
+1223A ; [.3567.0020.0002.1223A] # CUNEIFORM SIGN MUSH3 TIMES A
+1223B ; [.3568.0020.0002.1223B] # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI
+1223C ; [.3569.0020.0002.1223C] # CUNEIFORM SIGN MUSH3 TIMES DI
+1223D ; [.356A.0020.0002.1223D] # CUNEIFORM SIGN MUSH3 GUNU
+1223E ; [.356B.0020.0002.1223E] # CUNEIFORM SIGN NA
+1223F ; [.356C.0020.0002.1223F] # CUNEIFORM SIGN NA2
+12240 ; [.356D.0020.0002.12240] # CUNEIFORM SIGN NAGA
+12241 ; [.356E.0020.0002.12241] # CUNEIFORM SIGN NAGA INVERTED
+12242 ; [.356F.0020.0002.12242] # CUNEIFORM SIGN NAGA TIMES SHU TENU
+12243 ; [.3570.0020.0002.12243] # CUNEIFORM SIGN NAGA OPPOSING NAGA
+12244 ; [.3571.0020.0002.12244] # CUNEIFORM SIGN NAGAR
+12245 ; [.3572.0020.0002.12245] # CUNEIFORM SIGN NAM NUTILLU
+12246 ; [.3573.0020.0002.12246] # CUNEIFORM SIGN NAM
+12247 ; [.3574.0020.0002.12247] # CUNEIFORM SIGN NAM2
+12248 ; [.3575.0020.0002.12248] # CUNEIFORM SIGN NE
+12249 ; [.3576.0020.0002.12249] # CUNEIFORM SIGN NE TIMES A
+1224A ; [.3577.0020.0002.1224A] # CUNEIFORM SIGN NE TIMES UD
+1224B ; [.3578.0020.0002.1224B] # CUNEIFORM SIGN NE SHESHIG
+1224C ; [.3579.0020.0002.1224C] # CUNEIFORM SIGN NI
+1224D ; [.357A.0020.0002.1224D] # CUNEIFORM SIGN NI TIMES E
+1224E ; [.357B.0020.0002.1224E] # CUNEIFORM SIGN NI2
+1224F ; [.357C.0020.0002.1224F] # CUNEIFORM SIGN NIM
+12250 ; [.357D.0020.0002.12250] # CUNEIFORM SIGN NIM TIMES GAN2 TENU
+12251 ; [.357E.0020.0002.12251] # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU
+12252 ; [.357F.0020.0002.12252] # CUNEIFORM SIGN NINDA2
+12253 ; [.3580.0020.0002.12253] # CUNEIFORM SIGN NINDA2 TIMES AN
+12254 ; [.3581.0020.0002.12254] # CUNEIFORM SIGN NINDA2 TIMES ASH
+12255 ; [.3582.0020.0002.12255] # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH
+12256 ; [.3583.0020.0002.12256] # CUNEIFORM SIGN NINDA2 TIMES GUD
+12257 ; [.3584.0020.0002.12257] # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU
+12258 ; [.3585.0020.0002.12258] # CUNEIFORM SIGN NINDA2 TIMES NE
+12259 ; [.3586.0020.0002.12259] # CUNEIFORM SIGN NINDA2 TIMES NUN
+1225A ; [.3587.0020.0002.1225A] # CUNEIFORM SIGN NINDA2 TIMES SHE
+1225B ; [.3588.0020.0002.1225B] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN
+1225C ; [.3589.0020.0002.1225C] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH
+1225D ; [.358A.0020.0002.1225D] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH
+1225E ; [.358B.0020.0002.1225E] # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH
+1225F ; [.358C.0020.0002.1225F] # CUNEIFORM SIGN NINDA2 TIMES USH
+12260 ; [.358D.0020.0002.12260] # CUNEIFORM SIGN NISAG
+12261 ; [.358E.0020.0002.12261] # CUNEIFORM SIGN NU
+12262 ; [.358F.0020.0002.12262] # CUNEIFORM SIGN NU11
+12263 ; [.3590.0020.0002.12263] # CUNEIFORM SIGN NUN
+12264 ; [.3591.0020.0002.12264] # CUNEIFORM SIGN NUN LAGAR TIMES GAR
+12265 ; [.3592.0020.0002.12265] # CUNEIFORM SIGN NUN LAGAR TIMES MASH
+12266 ; [.3593.0020.0002.12266] # CUNEIFORM SIGN NUN LAGAR TIMES SAL
+12267 ; [.3594.0020.0002.12267] # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL
+12268 ; [.3595.0020.0002.12268] # CUNEIFORM SIGN NUN LAGAR TIMES USH
+12269 ; [.3596.0020.0002.12269] # CUNEIFORM SIGN NUN TENU
+1226A ; [.3597.0020.0002.1226A] # CUNEIFORM SIGN NUN OVER NUN
+1226B ; [.3598.0020.0002.1226B] # CUNEIFORM SIGN NUN CROSSING NUN
+1226C ; [.3599.0020.0002.1226C] # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR
+1226D ; [.359A.0020.0002.1226D] # CUNEIFORM SIGN NUNUZ
+1226E ; [.359B.0020.0002.1226E] # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB
+1226F ; [.359C.0020.0002.1226F] # CUNEIFORM SIGN NUNUZ AB2 TIMES BI
+12270 ; [.359D.0020.0002.12270] # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG
+12271 ; [.359E.0020.0002.12271] # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD
+12272 ; [.359F.0020.0002.12272] # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU
+12273 ; [.35A0.0020.0002.12273] # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3
+12274 ; [.35A1.0020.0002.12274] # CUNEIFORM SIGN NUNUZ AB2 TIMES LA
+12275 ; [.35A2.0020.0002.12275] # CUNEIFORM SIGN NUNUZ AB2 TIMES NE
+12276 ; [.35A3.0020.0002.12276] # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3
+12277 ; [.35A4.0020.0002.12277] # CUNEIFORM SIGN NUNUZ AB2 TIMES U2
+12278 ; [.35A5.0020.0002.12278] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI
+12279 ; [.35A6.0020.0002.12279] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U
+1227A ; [.35A7.0020.0002.1227A] # CUNEIFORM SIGN PA
+1227B ; [.35A8.0020.0002.1227B] # CUNEIFORM SIGN PAD
+1227C ; [.35A9.0020.0002.1227C] # CUNEIFORM SIGN PAN
+1227D ; [.35AA.0020.0002.1227D] # CUNEIFORM SIGN PAP
+1227E ; [.35AB.0020.0002.1227E] # CUNEIFORM SIGN PESH2
+1227F ; [.35AC.0020.0002.1227F] # CUNEIFORM SIGN PI
+12280 ; [.35AD.0020.0002.12280] # CUNEIFORM SIGN PI TIMES A
+12281 ; [.35AE.0020.0002.12281] # CUNEIFORM SIGN PI TIMES AB
+12282 ; [.35AF.0020.0002.12282] # CUNEIFORM SIGN PI TIMES BI
+12283 ; [.35B0.0020.0002.12283] # CUNEIFORM SIGN PI TIMES BU
+12284 ; [.35B1.0020.0002.12284] # CUNEIFORM SIGN PI TIMES E
+12285 ; [.35B2.0020.0002.12285] # CUNEIFORM SIGN PI TIMES I
+12286 ; [.35B3.0020.0002.12286] # CUNEIFORM SIGN PI TIMES IB
+12287 ; [.35B4.0020.0002.12287] # CUNEIFORM SIGN PI TIMES U
+12288 ; [.35B5.0020.0002.12288] # CUNEIFORM SIGN PI TIMES U2
+12289 ; [.35B6.0020.0002.12289] # CUNEIFORM SIGN PI CROSSING PI
+1228A ; [.35B7.0020.0002.1228A] # CUNEIFORM SIGN PIRIG
+1228B ; [.35B8.0020.0002.1228B] # CUNEIFORM SIGN PIRIG TIMES KAL
+1228C ; [.35B9.0020.0002.1228C] # CUNEIFORM SIGN PIRIG TIMES UD
+1228D ; [.35BA.0020.0002.1228D] # CUNEIFORM SIGN PIRIG TIMES ZA
+1228E ; [.35BB.0020.0002.1228E] # CUNEIFORM SIGN PIRIG OPPOSING PIRIG
+1228F ; [.35BC.0020.0002.1228F] # CUNEIFORM SIGN RA
+12290 ; [.35BD.0020.0002.12290] # CUNEIFORM SIGN RAB
+12291 ; [.35BE.0020.0002.12291] # CUNEIFORM SIGN RI
+12292 ; [.35BF.0020.0002.12292] # CUNEIFORM SIGN RU
+12293 ; [.35C0.0020.0002.12293] # CUNEIFORM SIGN SA
+12294 ; [.35C1.0020.0002.12294] # CUNEIFORM SIGN SAG NUTILLU
+12295 ; [.35C2.0020.0002.12295] # CUNEIFORM SIGN SAG
+12296 ; [.35C3.0020.0002.12296] # CUNEIFORM SIGN SAG TIMES A
+12297 ; [.35C4.0020.0002.12297] # CUNEIFORM SIGN SAG TIMES DU
+12298 ; [.35C5.0020.0002.12298] # CUNEIFORM SIGN SAG TIMES DUB
+12299 ; [.35C6.0020.0002.12299] # CUNEIFORM SIGN SAG TIMES HA
+1229A ; [.35C7.0020.0002.1229A] # CUNEIFORM SIGN SAG TIMES KAK
+1229B ; [.35C8.0020.0002.1229B] # CUNEIFORM SIGN SAG TIMES KUR
+1229C ; [.35C9.0020.0002.1229C] # CUNEIFORM SIGN SAG TIMES LUM
+1229D ; [.35CA.0020.0002.1229D] # CUNEIFORM SIGN SAG TIMES MI
+1229E ; [.35CB.0020.0002.1229E] # CUNEIFORM SIGN SAG TIMES NUN
+1229F ; [.35CC.0020.0002.1229F] # CUNEIFORM SIGN SAG TIMES SAL
+122A0 ; [.35CD.0020.0002.122A0] # CUNEIFORM SIGN SAG TIMES SHID
+122A1 ; [.35CE.0020.0002.122A1] # CUNEIFORM SIGN SAG TIMES TAB
+122A2 ; [.35CF.0020.0002.122A2] # CUNEIFORM SIGN SAG TIMES U2
+122A3 ; [.35D0.0020.0002.122A3] # CUNEIFORM SIGN SAG TIMES UB
+122A4 ; [.35D1.0020.0002.122A4] # CUNEIFORM SIGN SAG TIMES UM
+122A5 ; [.35D2.0020.0002.122A5] # CUNEIFORM SIGN SAG TIMES UR
+122A6 ; [.35D3.0020.0002.122A6] # CUNEIFORM SIGN SAG TIMES USH
+122A7 ; [.35D4.0020.0002.122A7] # CUNEIFORM SIGN SAG OVER SAG
+122A8 ; [.35D5.0020.0002.122A8] # CUNEIFORM SIGN SAG GUNU
+122A9 ; [.35D6.0020.0002.122A9] # CUNEIFORM SIGN SAL
+122AA ; [.35D7.0020.0002.122AA] # CUNEIFORM SIGN SAL LAGAB TIMES ASH2
+122AB ; [.35D8.0020.0002.122AB] # CUNEIFORM SIGN SANGA2
+122AC ; [.35D9.0020.0002.122AC] # CUNEIFORM SIGN SAR
+122AD ; [.35DA.0020.0002.122AD] # CUNEIFORM SIGN SHA
+122AE ; [.35DB.0020.0002.122AE] # CUNEIFORM SIGN SHA3
+122AF ; [.35DC.0020.0002.122AF] # CUNEIFORM SIGN SHA3 TIMES A
+122B0 ; [.35DD.0020.0002.122B0] # CUNEIFORM SIGN SHA3 TIMES BAD
+122B1 ; [.35DE.0020.0002.122B1] # CUNEIFORM SIGN SHA3 TIMES GISH
+122B2 ; [.35DF.0020.0002.122B2] # CUNEIFORM SIGN SHA3 TIMES NE
+122B3 ; [.35E0.0020.0002.122B3] # CUNEIFORM SIGN SHA3 TIMES SHU2
+122B4 ; [.35E1.0020.0002.122B4] # CUNEIFORM SIGN SHA3 TIMES TUR
+122B5 ; [.35E2.0020.0002.122B5] # CUNEIFORM SIGN SHA3 TIMES U
+122B6 ; [.35E3.0020.0002.122B6] # CUNEIFORM SIGN SHA3 TIMES U PLUS A
+122B7 ; [.35E4.0020.0002.122B7] # CUNEIFORM SIGN SHA6
+122B8 ; [.35E5.0020.0002.122B8] # CUNEIFORM SIGN SHAB6
+122B9 ; [.35E6.0020.0002.122B9] # CUNEIFORM SIGN SHAR2
+122BA ; [.35E7.0020.0002.122BA] # CUNEIFORM SIGN SHE
+122BB ; [.35E8.0020.0002.122BB] # CUNEIFORM SIGN SHE HU
+122BC ; [.35E9.0020.0002.122BC] # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR
+122BD ; [.35EA.0020.0002.122BD] # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR
+122BE ; [.35EB.0020.0002.122BE] # CUNEIFORM SIGN SHEG9
+122BF ; [.35EC.0020.0002.122BF] # CUNEIFORM SIGN SHEN
+122C0 ; [.35ED.0020.0002.122C0] # CUNEIFORM SIGN SHESH
+122C1 ; [.35EE.0020.0002.122C1] # CUNEIFORM SIGN SHESH2
+122C2 ; [.35EF.0020.0002.122C2] # CUNEIFORM SIGN SHESHLAM
+122C3 ; [.35F0.0020.0002.122C3] # CUNEIFORM SIGN SHID
+122C4 ; [.35F1.0020.0002.122C4] # CUNEIFORM SIGN SHID TIMES A
+122C5 ; [.35F2.0020.0002.122C5] # CUNEIFORM SIGN SHID TIMES IM
+122C6 ; [.35F3.0020.0002.122C6] # CUNEIFORM SIGN SHIM
+122C7 ; [.35F4.0020.0002.122C7] # CUNEIFORM SIGN SHIM TIMES A
+122C8 ; [.35F5.0020.0002.122C8] # CUNEIFORM SIGN SHIM TIMES BAL
+122C9 ; [.35F6.0020.0002.122C9] # CUNEIFORM SIGN SHIM TIMES BULUG
+122CA ; [.35F7.0020.0002.122CA] # CUNEIFORM SIGN SHIM TIMES DIN
+122CB ; [.35F8.0020.0002.122CB] # CUNEIFORM SIGN SHIM TIMES GAR
+122CC ; [.35F9.0020.0002.122CC] # CUNEIFORM SIGN SHIM TIMES IGI
+122CD ; [.35FA.0020.0002.122CD] # CUNEIFORM SIGN SHIM TIMES IGI GUNU
+122CE ; [.35FB.0020.0002.122CE] # CUNEIFORM SIGN SHIM TIMES KUSHU2
+122CF ; [.35FC.0020.0002.122CF] # CUNEIFORM SIGN SHIM TIMES LUL
+122D0 ; [.35FD.0020.0002.122D0] # CUNEIFORM SIGN SHIM TIMES MUG
+122D1 ; [.35FE.0020.0002.122D1] # CUNEIFORM SIGN SHIM TIMES SAL
+122D2 ; [.35FF.0020.0002.122D2] # CUNEIFORM SIGN SHINIG
+122D3 ; [.3600.0020.0002.122D3] # CUNEIFORM SIGN SHIR
+122D4 ; [.3601.0020.0002.122D4] # CUNEIFORM SIGN SHIR TENU
+122D5 ; [.3602.0020.0002.122D5] # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR
+122D6 ; [.3603.0020.0002.122D6] # CUNEIFORM SIGN SHITA
+122D7 ; [.3604.0020.0002.122D7] # CUNEIFORM SIGN SHU
+122D8 ; [.3605.0020.0002.122D8] # CUNEIFORM SIGN SHU OVER INVERTED SHU
+122D9 ; [.3606.0020.0002.122D9] # CUNEIFORM SIGN SHU2
+122DA ; [.3607.0020.0002.122DA] # CUNEIFORM SIGN SHUBUR
+122DB ; [.3608.0020.0002.122DB] # CUNEIFORM SIGN SI
+122DC ; [.3609.0020.0002.122DC] # CUNEIFORM SIGN SI GUNU
+122DD ; [.360A.0020.0002.122DD] # CUNEIFORM SIGN SIG
+122DE ; [.360B.0020.0002.122DE] # CUNEIFORM SIGN SIG4
+122DF ; [.360C.0020.0002.122DF] # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2
+122E0 ; [.360D.0020.0002.122E0] # CUNEIFORM SIGN SIK2
+122E1 ; [.360E.0020.0002.122E1] # CUNEIFORM SIGN SILA3
+122E2 ; [.360F.0020.0002.122E2] # CUNEIFORM SIGN SU
+122E3 ; [.3610.0020.0002.122E3] # CUNEIFORM SIGN SU OVER SU
+122E4 ; [.3611.0020.0002.122E4] # CUNEIFORM SIGN SUD
+122E5 ; [.3612.0020.0002.122E5] # CUNEIFORM SIGN SUD2
+122E6 ; [.3613.0020.0002.122E6] # CUNEIFORM SIGN SUHUR
+122E7 ; [.3614.0020.0002.122E7] # CUNEIFORM SIGN SUM
+122E8 ; [.3615.0020.0002.122E8] # CUNEIFORM SIGN SUMASH
+122E9 ; [.3616.0020.0002.122E9] # CUNEIFORM SIGN SUR
+122EA ; [.3617.0020.0002.122EA] # CUNEIFORM SIGN SUR9
+122EB ; [.3618.0020.0002.122EB] # CUNEIFORM SIGN TA
+122EC ; [.3619.0020.0002.122EC] # CUNEIFORM SIGN TA ASTERISK
+122ED ; [.361A.0020.0002.122ED] # CUNEIFORM SIGN TA TIMES HI
+122EE ; [.361B.0020.0002.122EE] # CUNEIFORM SIGN TA TIMES MI
+122EF ; [.361C.0020.0002.122EF] # CUNEIFORM SIGN TA GUNU
+122F0 ; [.361D.0020.0002.122F0] # CUNEIFORM SIGN TAB
+122F1 ; [.361E.0020.0002.122F1] # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH
+122F2 ; [.361F.0020.0002.122F2] # CUNEIFORM SIGN TAB SQUARED
+122F3 ; [.3620.0020.0002.122F3] # CUNEIFORM SIGN TAG
+122F4 ; [.3621.0020.0002.122F4] # CUNEIFORM SIGN TAG TIMES BI
+122F5 ; [.3622.0020.0002.122F5] # CUNEIFORM SIGN TAG TIMES GUD
+122F6 ; [.3623.0020.0002.122F6] # CUNEIFORM SIGN TAG TIMES SHE
+122F7 ; [.3624.0020.0002.122F7] # CUNEIFORM SIGN TAG TIMES SHU
+122F8 ; [.3625.0020.0002.122F8] # CUNEIFORM SIGN TAG TIMES TUG2
+122F9 ; [.3626.0020.0002.122F9] # CUNEIFORM SIGN TAG TIMES UD
+122FA ; [.3627.0020.0002.122FA] # CUNEIFORM SIGN TAK4
+122FB ; [.3628.0020.0002.122FB] # CUNEIFORM SIGN TAR
+122FC ; [.3629.0020.0002.122FC] # CUNEIFORM SIGN TE
+122FD ; [.362A.0020.0002.122FD] # CUNEIFORM SIGN TE GUNU
+122FE ; [.362B.0020.0002.122FE] # CUNEIFORM SIGN TI
+122FF ; [.362C.0020.0002.122FF] # CUNEIFORM SIGN TI TENU
+12300 ; [.362D.0020.0002.12300] # CUNEIFORM SIGN TIL
+12301 ; [.362E.0020.0002.12301] # CUNEIFORM SIGN TIR
+12302 ; [.362F.0020.0002.12302] # CUNEIFORM SIGN TIR TIMES TAK4
+12303 ; [.3630.0020.0002.12303] # CUNEIFORM SIGN TIR OVER TIR
+12304 ; [.3631.0020.0002.12304] # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR
+12305 ; [.3632.0020.0002.12305] # CUNEIFORM SIGN TU
+12306 ; [.3633.0020.0002.12306] # CUNEIFORM SIGN TUG2
+12307 ; [.3634.0020.0002.12307] # CUNEIFORM SIGN TUK
+12308 ; [.3635.0020.0002.12308] # CUNEIFORM SIGN TUM
+12309 ; [.3636.0020.0002.12309] # CUNEIFORM SIGN TUR
+1230A ; [.3637.0020.0002.1230A] # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA
+1230B ; [.3638.0020.0002.1230B] # CUNEIFORM SIGN U
+1230C ; [.3639.0020.0002.1230C] # CUNEIFORM SIGN U GUD
+1230D ; [.363A.0020.0002.1230D] # CUNEIFORM SIGN U U U
+1230E ; [.363B.0020.0002.1230E] # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR
+1230F ; [.363C.0020.0002.1230F] # CUNEIFORM SIGN U OVER U SUR OVER SUR
+12310 ; [.363D.0020.0002.12310] # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED
+12311 ; [.363E.0020.0002.12311] # CUNEIFORM SIGN U2
+12312 ; [.363F.0020.0002.12312] # CUNEIFORM SIGN UB
+12313 ; [.3640.0020.0002.12313] # CUNEIFORM SIGN UD
+12314 ; [.3641.0020.0002.12314] # CUNEIFORM SIGN UD KUSHU2
+12315 ; [.3642.0020.0002.12315] # CUNEIFORM SIGN UD TIMES BAD
+12316 ; [.3643.0020.0002.12316] # CUNEIFORM SIGN UD TIMES MI
+12317 ; [.3644.0020.0002.12317] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U
+12318 ; [.3645.0020.0002.12318] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU
+12319 ; [.3646.0020.0002.12319] # CUNEIFORM SIGN UD GUNU
+1231A ; [.3647.0020.0002.1231A] # CUNEIFORM SIGN UD SHESHIG
+1231B ; [.3648.0020.0002.1231B] # CUNEIFORM SIGN UD SHESHIG TIMES BAD
+1231C ; [.3649.0020.0002.1231C] # CUNEIFORM SIGN UDUG
+1231D ; [.364A.0020.0002.1231D] # CUNEIFORM SIGN UM
+1231E ; [.364B.0020.0002.1231E] # CUNEIFORM SIGN UM TIMES LAGAB
+1231F ; [.364C.0020.0002.1231F] # CUNEIFORM SIGN UM TIMES ME PLUS DA
+12320 ; [.364D.0020.0002.12320] # CUNEIFORM SIGN UM TIMES SHA3
+12321 ; [.364E.0020.0002.12321] # CUNEIFORM SIGN UM TIMES U
+12322 ; [.364F.0020.0002.12322] # CUNEIFORM SIGN UMBIN
+12323 ; [.3650.0020.0002.12323] # CUNEIFORM SIGN UMUM
+12324 ; [.3651.0020.0002.12324] # CUNEIFORM SIGN UMUM TIMES KASKAL
+12325 ; [.3652.0020.0002.12325] # CUNEIFORM SIGN UMUM TIMES PA
+12326 ; [.3653.0020.0002.12326] # CUNEIFORM SIGN UN
+12327 ; [.3654.0020.0002.12327] # CUNEIFORM SIGN UN GUNU
+12328 ; [.3655.0020.0002.12328] # CUNEIFORM SIGN UR
+12329 ; [.3656.0020.0002.12329] # CUNEIFORM SIGN UR CROSSING UR
+1232A ; [.3657.0020.0002.1232A] # CUNEIFORM SIGN UR SHESHIG
+1232B ; [.3658.0020.0002.1232B] # CUNEIFORM SIGN UR2
+1232C ; [.3659.0020.0002.1232C] # CUNEIFORM SIGN UR2 TIMES A PLUS HA
+1232D ; [.365A.0020.0002.1232D] # CUNEIFORM SIGN UR2 TIMES A PLUS NA
+1232E ; [.365B.0020.0002.1232E] # CUNEIFORM SIGN UR2 TIMES AL
+1232F ; [.365C.0020.0002.1232F] # CUNEIFORM SIGN UR2 TIMES HA
+12330 ; [.365D.0020.0002.12330] # CUNEIFORM SIGN UR2 TIMES NUN
+12331 ; [.365E.0020.0002.12331] # CUNEIFORM SIGN UR2 TIMES U2
+12332 ; [.365F.0020.0002.12332] # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH
+12333 ; [.3660.0020.0002.12333] # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI
+12334 ; [.3661.0020.0002.12334] # CUNEIFORM SIGN UR4
+12335 ; [.3662.0020.0002.12335] # CUNEIFORM SIGN URI
+12336 ; [.3663.0020.0002.12336] # CUNEIFORM SIGN URI3
+12337 ; [.3664.0020.0002.12337] # CUNEIFORM SIGN URU
+12338 ; [.3665.0020.0002.12338] # CUNEIFORM SIGN URU TIMES A
+12339 ; [.3666.0020.0002.12339] # CUNEIFORM SIGN URU TIMES ASHGAB
+1233A ; [.3667.0020.0002.1233A] # CUNEIFORM SIGN URU TIMES BAR
+1233B ; [.3668.0020.0002.1233B] # CUNEIFORM SIGN URU TIMES DUN
+1233C ; [.3669.0020.0002.1233C] # CUNEIFORM SIGN URU TIMES GA
+1233D ; [.366A.0020.0002.1233D] # CUNEIFORM SIGN URU TIMES GAL
+1233E ; [.366B.0020.0002.1233E] # CUNEIFORM SIGN URU TIMES GAN2 TENU
+1233F ; [.366C.0020.0002.1233F] # CUNEIFORM SIGN URU TIMES GAR
+12340 ; [.366D.0020.0002.12340] # CUNEIFORM SIGN URU TIMES GU
+12341 ; [.366E.0020.0002.12341] # CUNEIFORM SIGN URU TIMES HA
+12342 ; [.366F.0020.0002.12342] # CUNEIFORM SIGN URU TIMES IGI
+12343 ; [.3670.0020.0002.12343] # CUNEIFORM SIGN URU TIMES IM
+12344 ; [.3671.0020.0002.12344] # CUNEIFORM SIGN URU TIMES ISH
+12345 ; [.3672.0020.0002.12345] # CUNEIFORM SIGN URU TIMES KI
+12346 ; [.3673.0020.0002.12346] # CUNEIFORM SIGN URU TIMES LUM
+12347 ; [.3674.0020.0002.12347] # CUNEIFORM SIGN URU TIMES MIN
+12348 ; [.3675.0020.0002.12348] # CUNEIFORM SIGN URU TIMES PA
+12349 ; [.3676.0020.0002.12349] # CUNEIFORM SIGN URU TIMES SHE
+1234A ; [.3677.0020.0002.1234A] # CUNEIFORM SIGN URU TIMES SIG4
+1234B ; [.3678.0020.0002.1234B] # CUNEIFORM SIGN URU TIMES TU
+1234C ; [.3679.0020.0002.1234C] # CUNEIFORM SIGN URU TIMES U PLUS GUD
+1234D ; [.367A.0020.0002.1234D] # CUNEIFORM SIGN URU TIMES UD
+1234E ; [.367B.0020.0002.1234E] # CUNEIFORM SIGN URU TIMES URUDA
+1234F ; [.367C.0020.0002.1234F] # CUNEIFORM SIGN URUDA
+12350 ; [.367D.0020.0002.12350] # CUNEIFORM SIGN URUDA TIMES U
+12351 ; [.367E.0020.0002.12351] # CUNEIFORM SIGN USH
+12352 ; [.367F.0020.0002.12352] # CUNEIFORM SIGN USH TIMES A
+12353 ; [.3680.0020.0002.12353] # CUNEIFORM SIGN USH TIMES KU
+12354 ; [.3681.0020.0002.12354] # CUNEIFORM SIGN USH TIMES KUR
+12355 ; [.3682.0020.0002.12355] # CUNEIFORM SIGN USH TIMES TAK4
+12356 ; [.3683.0020.0002.12356] # CUNEIFORM SIGN USHX
+12357 ; [.3684.0020.0002.12357] # CUNEIFORM SIGN USH2
+12358 ; [.3685.0020.0002.12358] # CUNEIFORM SIGN USHUMX
+12359 ; [.3686.0020.0002.12359] # CUNEIFORM SIGN UTUKI
+1235A ; [.3687.0020.0002.1235A] # CUNEIFORM SIGN UZ3
+1235B ; [.3688.0020.0002.1235B] # CUNEIFORM SIGN UZ3 TIMES KASKAL
+1235C ; [.3689.0020.0002.1235C] # CUNEIFORM SIGN UZU
+1235D ; [.368A.0020.0002.1235D] # CUNEIFORM SIGN ZA
+1235E ; [.368B.0020.0002.1235E] # CUNEIFORM SIGN ZA TENU
+1235F ; [.368C.0020.0002.1235F] # CUNEIFORM SIGN ZA SQUARED TIMES KUR
+12360 ; [.368D.0020.0002.12360] # CUNEIFORM SIGN ZAG
+12361 ; [.368E.0020.0002.12361] # CUNEIFORM SIGN ZAMX
+12362 ; [.368F.0020.0002.12362] # CUNEIFORM SIGN ZE2
+12363 ; [.3690.0020.0002.12363] # CUNEIFORM SIGN ZI
+12364 ; [.3691.0020.0002.12364] # CUNEIFORM SIGN ZI OVER ZI
+12365 ; [.3692.0020.0002.12365] # CUNEIFORM SIGN ZI3
+12366 ; [.3693.0020.0002.12366] # CUNEIFORM SIGN ZIB
+12367 ; [.3694.0020.0002.12367] # CUNEIFORM SIGN ZIB KABA TENU
+12368 ; [.3695.0020.0002.12368] # CUNEIFORM SIGN ZIG
+12369 ; [.3696.0020.0002.12369] # CUNEIFORM SIGN ZIZ2
+1236A ; [.3697.0020.0002.1236A] # CUNEIFORM SIGN ZU
+1236B ; [.3698.0020.0002.1236B] # CUNEIFORM SIGN ZU5
+1236C ; [.3699.0020.0002.1236C] # CUNEIFORM SIGN ZU5 TIMES A
+1236D ; [.369A.0020.0002.1236D] # CUNEIFORM SIGN ZUBUR
+1236E ; [.369B.0020.0002.1236E] # CUNEIFORM SIGN ZUM
+13000 ; [.369C.0020.0002.13000] # EGYPTIAN HIEROGLYPH A001
+13001 ; [.369D.0020.0002.13001] # EGYPTIAN HIEROGLYPH A002
+13002 ; [.369E.0020.0002.13002] # EGYPTIAN HIEROGLYPH A003
+13003 ; [.369F.0020.0002.13003] # EGYPTIAN HIEROGLYPH A004
+13004 ; [.36A0.0020.0002.13004] # EGYPTIAN HIEROGLYPH A005
+13005 ; [.36A1.0020.0002.13005] # EGYPTIAN HIEROGLYPH A005A
+13006 ; [.36A2.0020.0002.13006] # EGYPTIAN HIEROGLYPH A006
+13007 ; [.36A3.0020.0002.13007] # EGYPTIAN HIEROGLYPH A006A
+13008 ; [.36A4.0020.0002.13008] # EGYPTIAN HIEROGLYPH A006B
+13009 ; [.36A5.0020.0002.13009] # EGYPTIAN HIEROGLYPH A007
+1300A ; [.36A6.0020.0002.1300A] # EGYPTIAN HIEROGLYPH A008
+1300B ; [.36A7.0020.0002.1300B] # EGYPTIAN HIEROGLYPH A009
+1300C ; [.36A8.0020.0002.1300C] # EGYPTIAN HIEROGLYPH A010
+1300D ; [.36A9.0020.0002.1300D] # EGYPTIAN HIEROGLYPH A011
+1300E ; [.36AA.0020.0002.1300E] # EGYPTIAN HIEROGLYPH A012
+1300F ; [.36AB.0020.0002.1300F] # EGYPTIAN HIEROGLYPH A013
+13010 ; [.36AC.0020.0002.13010] # EGYPTIAN HIEROGLYPH A014
+13011 ; [.36AD.0020.0002.13011] # EGYPTIAN HIEROGLYPH A014A
+13012 ; [.36AE.0020.0002.13012] # EGYPTIAN HIEROGLYPH A015
+13013 ; [.36AF.0020.0002.13013] # EGYPTIAN HIEROGLYPH A016
+13014 ; [.36B0.0020.0002.13014] # EGYPTIAN HIEROGLYPH A017
+13015 ; [.36B1.0020.0002.13015] # EGYPTIAN HIEROGLYPH A017A
+13016 ; [.36B2.0020.0002.13016] # EGYPTIAN HIEROGLYPH A018
+13017 ; [.36B3.0020.0002.13017] # EGYPTIAN HIEROGLYPH A019
+13018 ; [.36B4.0020.0002.13018] # EGYPTIAN HIEROGLYPH A020
+13019 ; [.36B5.0020.0002.13019] # EGYPTIAN HIEROGLYPH A021
+1301A ; [.36B6.0020.0002.1301A] # EGYPTIAN HIEROGLYPH A022
+1301B ; [.36B7.0020.0002.1301B] # EGYPTIAN HIEROGLYPH A023
+1301C ; [.36B8.0020.0002.1301C] # EGYPTIAN HIEROGLYPH A024
+1301D ; [.36B9.0020.0002.1301D] # EGYPTIAN HIEROGLYPH A025
+1301E ; [.36BA.0020.0002.1301E] # EGYPTIAN HIEROGLYPH A026
+1301F ; [.36BB.0020.0002.1301F] # EGYPTIAN HIEROGLYPH A027
+13020 ; [.36BC.0020.0002.13020] # EGYPTIAN HIEROGLYPH A028
+13021 ; [.36BD.0020.0002.13021] # EGYPTIAN HIEROGLYPH A029
+13022 ; [.36BE.0020.0002.13022] # EGYPTIAN HIEROGLYPH A030
+13023 ; [.36BF.0020.0002.13023] # EGYPTIAN HIEROGLYPH A031
+13024 ; [.36C0.0020.0002.13024] # EGYPTIAN HIEROGLYPH A032
+13025 ; [.36C1.0020.0002.13025] # EGYPTIAN HIEROGLYPH A032A
+13026 ; [.36C2.0020.0002.13026] # EGYPTIAN HIEROGLYPH A033
+13027 ; [.36C3.0020.0002.13027] # EGYPTIAN HIEROGLYPH A034
+13028 ; [.36C4.0020.0002.13028] # EGYPTIAN HIEROGLYPH A035
+13029 ; [.36C5.0020.0002.13029] # EGYPTIAN HIEROGLYPH A036
+1302A ; [.36C6.0020.0002.1302A] # EGYPTIAN HIEROGLYPH A037
+1302B ; [.36C7.0020.0002.1302B] # EGYPTIAN HIEROGLYPH A038
+1302C ; [.36C8.0020.0002.1302C] # EGYPTIAN HIEROGLYPH A039
+1302D ; [.36C9.0020.0002.1302D] # EGYPTIAN HIEROGLYPH A040
+1302E ; [.36CA.0020.0002.1302E] # EGYPTIAN HIEROGLYPH A040A
+1302F ; [.36CB.0020.0002.1302F] # EGYPTIAN HIEROGLYPH A041
+13030 ; [.36CC.0020.0002.13030] # EGYPTIAN HIEROGLYPH A042
+13031 ; [.36CD.0020.0002.13031] # EGYPTIAN HIEROGLYPH A042A
+13032 ; [.36CE.0020.0002.13032] # EGYPTIAN HIEROGLYPH A043
+13033 ; [.36CF.0020.0002.13033] # EGYPTIAN HIEROGLYPH A043A
+13034 ; [.36D0.0020.0002.13034] # EGYPTIAN HIEROGLYPH A044
+13035 ; [.36D1.0020.0002.13035] # EGYPTIAN HIEROGLYPH A045
+13036 ; [.36D2.0020.0002.13036] # EGYPTIAN HIEROGLYPH A045A
+13037 ; [.36D3.0020.0002.13037] # EGYPTIAN HIEROGLYPH A046
+13038 ; [.36D4.0020.0002.13038] # EGYPTIAN HIEROGLYPH A047
+13039 ; [.36D5.0020.0002.13039] # EGYPTIAN HIEROGLYPH A048
+1303A ; [.36D6.0020.0002.1303A] # EGYPTIAN HIEROGLYPH A049
+1303B ; [.36D7.0020.0002.1303B] # EGYPTIAN HIEROGLYPH A050
+1303C ; [.36D8.0020.0002.1303C] # EGYPTIAN HIEROGLYPH A051
+1303D ; [.36D9.0020.0002.1303D] # EGYPTIAN HIEROGLYPH A052
+1303E ; [.36DA.0020.0002.1303E] # EGYPTIAN HIEROGLYPH A053
+1303F ; [.36DB.0020.0002.1303F] # EGYPTIAN HIEROGLYPH A054
+13040 ; [.36DC.0020.0002.13040] # EGYPTIAN HIEROGLYPH A055
+13041 ; [.36DD.0020.0002.13041] # EGYPTIAN HIEROGLYPH A056
+13042 ; [.36DE.0020.0002.13042] # EGYPTIAN HIEROGLYPH A057
+13043 ; [.36DF.0020.0002.13043] # EGYPTIAN HIEROGLYPH A058
+13044 ; [.36E0.0020.0002.13044] # EGYPTIAN HIEROGLYPH A059
+13045 ; [.36E1.0020.0002.13045] # EGYPTIAN HIEROGLYPH A060
+13046 ; [.36E2.0020.0002.13046] # EGYPTIAN HIEROGLYPH A061
+13047 ; [.36E3.0020.0002.13047] # EGYPTIAN HIEROGLYPH A062
+13048 ; [.36E4.0020.0002.13048] # EGYPTIAN HIEROGLYPH A063
+13049 ; [.36E5.0020.0002.13049] # EGYPTIAN HIEROGLYPH A064
+1304A ; [.36E6.0020.0002.1304A] # EGYPTIAN HIEROGLYPH A065
+1304B ; [.36E7.0020.0002.1304B] # EGYPTIAN HIEROGLYPH A066
+1304C ; [.36E8.0020.0002.1304C] # EGYPTIAN HIEROGLYPH A067
+1304D ; [.36E9.0020.0002.1304D] # EGYPTIAN HIEROGLYPH A068
+1304E ; [.36EA.0020.0002.1304E] # EGYPTIAN HIEROGLYPH A069
+1304F ; [.36EB.0020.0002.1304F] # EGYPTIAN HIEROGLYPH A070
+13050 ; [.36EC.0020.0002.13050] # EGYPTIAN HIEROGLYPH B001
+13051 ; [.36ED.0020.0002.13051] # EGYPTIAN HIEROGLYPH B002
+13052 ; [.36EE.0020.0002.13052] # EGYPTIAN HIEROGLYPH B003
+13053 ; [.36EF.0020.0002.13053] # EGYPTIAN HIEROGLYPH B004
+13054 ; [.36F0.0020.0002.13054] # EGYPTIAN HIEROGLYPH B005
+13055 ; [.36F1.0020.0002.13055] # EGYPTIAN HIEROGLYPH B005A
+13056 ; [.36F2.0020.0002.13056] # EGYPTIAN HIEROGLYPH B006
+13057 ; [.36F3.0020.0002.13057] # EGYPTIAN HIEROGLYPH B007
+13058 ; [.36F4.0020.0002.13058] # EGYPTIAN HIEROGLYPH B008
+13059 ; [.36F5.0020.0002.13059] # EGYPTIAN HIEROGLYPH B009
+1305A ; [.36F6.0020.0002.1305A] # EGYPTIAN HIEROGLYPH C001
+1305B ; [.36F7.0020.0002.1305B] # EGYPTIAN HIEROGLYPH C002
+1305C ; [.36F8.0020.0002.1305C] # EGYPTIAN HIEROGLYPH C002A
+1305D ; [.36F9.0020.0002.1305D] # EGYPTIAN HIEROGLYPH C002B
+1305E ; [.36FA.0020.0002.1305E] # EGYPTIAN HIEROGLYPH C002C
+1305F ; [.36FB.0020.0002.1305F] # EGYPTIAN HIEROGLYPH C003
+13060 ; [.36FC.0020.0002.13060] # EGYPTIAN HIEROGLYPH C004
+13061 ; [.36FD.0020.0002.13061] # EGYPTIAN HIEROGLYPH C005
+13062 ; [.36FE.0020.0002.13062] # EGYPTIAN HIEROGLYPH C006
+13063 ; [.36FF.0020.0002.13063] # EGYPTIAN HIEROGLYPH C007
+13064 ; [.3700.0020.0002.13064] # EGYPTIAN HIEROGLYPH C008
+13065 ; [.3701.0020.0002.13065] # EGYPTIAN HIEROGLYPH C009
+13066 ; [.3702.0020.0002.13066] # EGYPTIAN HIEROGLYPH C010
+13067 ; [.3703.0020.0002.13067] # EGYPTIAN HIEROGLYPH C010A
+13068 ; [.3704.0020.0002.13068] # EGYPTIAN HIEROGLYPH C011
+13069 ; [.3705.0020.0002.13069] # EGYPTIAN HIEROGLYPH C012
+1306A ; [.3706.0020.0002.1306A] # EGYPTIAN HIEROGLYPH C013
+1306B ; [.3707.0020.0002.1306B] # EGYPTIAN HIEROGLYPH C014
+1306C ; [.3708.0020.0002.1306C] # EGYPTIAN HIEROGLYPH C015
+1306D ; [.3709.0020.0002.1306D] # EGYPTIAN HIEROGLYPH C016
+1306E ; [.370A.0020.0002.1306E] # EGYPTIAN HIEROGLYPH C017
+1306F ; [.370B.0020.0002.1306F] # EGYPTIAN HIEROGLYPH C018
+13070 ; [.370C.0020.0002.13070] # EGYPTIAN HIEROGLYPH C019
+13071 ; [.370D.0020.0002.13071] # EGYPTIAN HIEROGLYPH C020
+13072 ; [.370E.0020.0002.13072] # EGYPTIAN HIEROGLYPH C021
+13073 ; [.370F.0020.0002.13073] # EGYPTIAN HIEROGLYPH C022
+13074 ; [.3710.0020.0002.13074] # EGYPTIAN HIEROGLYPH C023
+13075 ; [.3711.0020.0002.13075] # EGYPTIAN HIEROGLYPH C024
+13076 ; [.3712.0020.0002.13076] # EGYPTIAN HIEROGLYPH D001
+13077 ; [.3713.0020.0002.13077] # EGYPTIAN HIEROGLYPH D002
+13078 ; [.3714.0020.0002.13078] # EGYPTIAN HIEROGLYPH D003
+13079 ; [.3715.0020.0002.13079] # EGYPTIAN HIEROGLYPH D004
+1307A ; [.3716.0020.0002.1307A] # EGYPTIAN HIEROGLYPH D005
+1307B ; [.3717.0020.0002.1307B] # EGYPTIAN HIEROGLYPH D006
+1307C ; [.3718.0020.0002.1307C] # EGYPTIAN HIEROGLYPH D007
+1307D ; [.3719.0020.0002.1307D] # EGYPTIAN HIEROGLYPH D008
+1307E ; [.371A.0020.0002.1307E] # EGYPTIAN HIEROGLYPH D008A
+1307F ; [.371B.0020.0002.1307F] # EGYPTIAN HIEROGLYPH D009
+13080 ; [.371C.0020.0002.13080] # EGYPTIAN HIEROGLYPH D010
+13081 ; [.371D.0020.0002.13081] # EGYPTIAN HIEROGLYPH D011
+13082 ; [.371E.0020.0002.13082] # EGYPTIAN HIEROGLYPH D012
+13083 ; [.371F.0020.0002.13083] # EGYPTIAN HIEROGLYPH D013
+13084 ; [.3720.0020.0002.13084] # EGYPTIAN HIEROGLYPH D014
+13085 ; [.3721.0020.0002.13085] # EGYPTIAN HIEROGLYPH D015
+13086 ; [.3722.0020.0002.13086] # EGYPTIAN HIEROGLYPH D016
+13087 ; [.3723.0020.0002.13087] # EGYPTIAN HIEROGLYPH D017
+13088 ; [.3724.0020.0002.13088] # EGYPTIAN HIEROGLYPH D018
+13089 ; [.3725.0020.0002.13089] # EGYPTIAN HIEROGLYPH D019
+1308A ; [.3726.0020.0002.1308A] # EGYPTIAN HIEROGLYPH D020
+1308B ; [.3727.0020.0002.1308B] # EGYPTIAN HIEROGLYPH D021
+1308C ; [.3728.0020.0002.1308C] # EGYPTIAN HIEROGLYPH D022
+1308D ; [.3729.0020.0002.1308D] # EGYPTIAN HIEROGLYPH D023
+1308E ; [.372A.0020.0002.1308E] # EGYPTIAN HIEROGLYPH D024
+1308F ; [.372B.0020.0002.1308F] # EGYPTIAN HIEROGLYPH D025
+13090 ; [.372C.0020.0002.13090] # EGYPTIAN HIEROGLYPH D026
+13091 ; [.372D.0020.0002.13091] # EGYPTIAN HIEROGLYPH D027
+13092 ; [.372E.0020.0002.13092] # EGYPTIAN HIEROGLYPH D027A
+13093 ; [.372F.0020.0002.13093] # EGYPTIAN HIEROGLYPH D028
+13094 ; [.3730.0020.0002.13094] # EGYPTIAN HIEROGLYPH D029
+13095 ; [.3731.0020.0002.13095] # EGYPTIAN HIEROGLYPH D030
+13096 ; [.3732.0020.0002.13096] # EGYPTIAN HIEROGLYPH D031
+13097 ; [.3733.0020.0002.13097] # EGYPTIAN HIEROGLYPH D031A
+13098 ; [.3734.0020.0002.13098] # EGYPTIAN HIEROGLYPH D032
+13099 ; [.3735.0020.0002.13099] # EGYPTIAN HIEROGLYPH D033
+1309A ; [.3736.0020.0002.1309A] # EGYPTIAN HIEROGLYPH D034
+1309B ; [.3737.0020.0002.1309B] # EGYPTIAN HIEROGLYPH D034A
+1309C ; [.3738.0020.0002.1309C] # EGYPTIAN HIEROGLYPH D035
+1309D ; [.3739.0020.0002.1309D] # EGYPTIAN HIEROGLYPH D036
+1309E ; [.373A.0020.0002.1309E] # EGYPTIAN HIEROGLYPH D037
+1309F ; [.373B.0020.0002.1309F] # EGYPTIAN HIEROGLYPH D038
+130A0 ; [.373C.0020.0002.130A0] # EGYPTIAN HIEROGLYPH D039
+130A1 ; [.373D.0020.0002.130A1] # EGYPTIAN HIEROGLYPH D040
+130A2 ; [.373E.0020.0002.130A2] # EGYPTIAN HIEROGLYPH D041
+130A3 ; [.373F.0020.0002.130A3] # EGYPTIAN HIEROGLYPH D042
+130A4 ; [.3740.0020.0002.130A4] # EGYPTIAN HIEROGLYPH D043
+130A5 ; [.3741.0020.0002.130A5] # EGYPTIAN HIEROGLYPH D044
+130A6 ; [.3742.0020.0002.130A6] # EGYPTIAN HIEROGLYPH D045
+130A7 ; [.3743.0020.0002.130A7] # EGYPTIAN HIEROGLYPH D046
+130A8 ; [.3744.0020.0002.130A8] # EGYPTIAN HIEROGLYPH D046A
+130A9 ; [.3745.0020.0002.130A9] # EGYPTIAN HIEROGLYPH D047
+130AA ; [.3746.0020.0002.130AA] # EGYPTIAN HIEROGLYPH D048
+130AB ; [.3747.0020.0002.130AB] # EGYPTIAN HIEROGLYPH D048A
+130AC ; [.3748.0020.0002.130AC] # EGYPTIAN HIEROGLYPH D049
+130AD ; [.3749.0020.0002.130AD] # EGYPTIAN HIEROGLYPH D050
+130AE ; [.374A.0020.0002.130AE] # EGYPTIAN HIEROGLYPH D050A
+130AF ; [.374B.0020.0002.130AF] # EGYPTIAN HIEROGLYPH D050B
+130B0 ; [.374C.0020.0002.130B0] # EGYPTIAN HIEROGLYPH D050C
+130B1 ; [.374D.0020.0002.130B1] # EGYPTIAN HIEROGLYPH D050D
+130B2 ; [.374E.0020.0002.130B2] # EGYPTIAN HIEROGLYPH D050E
+130B3 ; [.374F.0020.0002.130B3] # EGYPTIAN HIEROGLYPH D050F
+130B4 ; [.3750.0020.0002.130B4] # EGYPTIAN HIEROGLYPH D050G
+130B5 ; [.3751.0020.0002.130B5] # EGYPTIAN HIEROGLYPH D050H
+130B6 ; [.3752.0020.0002.130B6] # EGYPTIAN HIEROGLYPH D050I
+130B7 ; [.3753.0020.0002.130B7] # EGYPTIAN HIEROGLYPH D051
+130B8 ; [.3754.0020.0002.130B8] # EGYPTIAN HIEROGLYPH D052
+130B9 ; [.3755.0020.0002.130B9] # EGYPTIAN HIEROGLYPH D052A
+130BA ; [.3756.0020.0002.130BA] # EGYPTIAN HIEROGLYPH D053
+130BB ; [.3757.0020.0002.130BB] # EGYPTIAN HIEROGLYPH D054
+130BC ; [.3758.0020.0002.130BC] # EGYPTIAN HIEROGLYPH D054A
+130BD ; [.3759.0020.0002.130BD] # EGYPTIAN HIEROGLYPH D055
+130BE ; [.375A.0020.0002.130BE] # EGYPTIAN HIEROGLYPH D056
+130BF ; [.375B.0020.0002.130BF] # EGYPTIAN HIEROGLYPH D057
+130C0 ; [.375C.0020.0002.130C0] # EGYPTIAN HIEROGLYPH D058
+130C1 ; [.375D.0020.0002.130C1] # EGYPTIAN HIEROGLYPH D059
+130C2 ; [.375E.0020.0002.130C2] # EGYPTIAN HIEROGLYPH D060
+130C3 ; [.375F.0020.0002.130C3] # EGYPTIAN HIEROGLYPH D061
+130C4 ; [.3760.0020.0002.130C4] # EGYPTIAN HIEROGLYPH D062
+130C5 ; [.3761.0020.0002.130C5] # EGYPTIAN HIEROGLYPH D063
+130C6 ; [.3762.0020.0002.130C6] # EGYPTIAN HIEROGLYPH D064
+130C7 ; [.3763.0020.0002.130C7] # EGYPTIAN HIEROGLYPH D065
+130C8 ; [.3764.0020.0002.130C8] # EGYPTIAN HIEROGLYPH D066
+130C9 ; [.3765.0020.0002.130C9] # EGYPTIAN HIEROGLYPH D067
+130CA ; [.3766.0020.0002.130CA] # EGYPTIAN HIEROGLYPH D067A
+130CB ; [.3767.0020.0002.130CB] # EGYPTIAN HIEROGLYPH D067B
+130CC ; [.3768.0020.0002.130CC] # EGYPTIAN HIEROGLYPH D067C
+130CD ; [.3769.0020.0002.130CD] # EGYPTIAN HIEROGLYPH D067D
+130CE ; [.376A.0020.0002.130CE] # EGYPTIAN HIEROGLYPH D067E
+130CF ; [.376B.0020.0002.130CF] # EGYPTIAN HIEROGLYPH D067F
+130D0 ; [.376C.0020.0002.130D0] # EGYPTIAN HIEROGLYPH D067G
+130D1 ; [.376D.0020.0002.130D1] # EGYPTIAN HIEROGLYPH D067H
+130D2 ; [.376E.0020.0002.130D2] # EGYPTIAN HIEROGLYPH E001
+130D3 ; [.376F.0020.0002.130D3] # EGYPTIAN HIEROGLYPH E002
+130D4 ; [.3770.0020.0002.130D4] # EGYPTIAN HIEROGLYPH E003
+130D5 ; [.3771.0020.0002.130D5] # EGYPTIAN HIEROGLYPH E004
+130D6 ; [.3772.0020.0002.130D6] # EGYPTIAN HIEROGLYPH E005
+130D7 ; [.3773.0020.0002.130D7] # EGYPTIAN HIEROGLYPH E006
+130D8 ; [.3774.0020.0002.130D8] # EGYPTIAN HIEROGLYPH E007
+130D9 ; [.3775.0020.0002.130D9] # EGYPTIAN HIEROGLYPH E008
+130DA ; [.3776.0020.0002.130DA] # EGYPTIAN HIEROGLYPH E008A
+130DB ; [.3777.0020.0002.130DB] # EGYPTIAN HIEROGLYPH E009
+130DC ; [.3778.0020.0002.130DC] # EGYPTIAN HIEROGLYPH E009A
+130DD ; [.3779.0020.0002.130DD] # EGYPTIAN HIEROGLYPH E010
+130DE ; [.377A.0020.0002.130DE] # EGYPTIAN HIEROGLYPH E011
+130DF ; [.377B.0020.0002.130DF] # EGYPTIAN HIEROGLYPH E012
+130E0 ; [.377C.0020.0002.130E0] # EGYPTIAN HIEROGLYPH E013
+130E1 ; [.377D.0020.0002.130E1] # EGYPTIAN HIEROGLYPH E014
+130E2 ; [.377E.0020.0002.130E2] # EGYPTIAN HIEROGLYPH E015
+130E3 ; [.377F.0020.0002.130E3] # EGYPTIAN HIEROGLYPH E016
+130E4 ; [.3780.0020.0002.130E4] # EGYPTIAN HIEROGLYPH E016A
+130E5 ; [.3781.0020.0002.130E5] # EGYPTIAN HIEROGLYPH E017
+130E6 ; [.3782.0020.0002.130E6] # EGYPTIAN HIEROGLYPH E017A
+130E7 ; [.3783.0020.0002.130E7] # EGYPTIAN HIEROGLYPH E018
+130E8 ; [.3784.0020.0002.130E8] # EGYPTIAN HIEROGLYPH E019
+130E9 ; [.3785.0020.0002.130E9] # EGYPTIAN HIEROGLYPH E020
+130EA ; [.3786.0020.0002.130EA] # EGYPTIAN HIEROGLYPH E020A
+130EB ; [.3787.0020.0002.130EB] # EGYPTIAN HIEROGLYPH E021
+130EC ; [.3788.0020.0002.130EC] # EGYPTIAN HIEROGLYPH E022
+130ED ; [.3789.0020.0002.130ED] # EGYPTIAN HIEROGLYPH E023
+130EE ; [.378A.0020.0002.130EE] # EGYPTIAN HIEROGLYPH E024
+130EF ; [.378B.0020.0002.130EF] # EGYPTIAN HIEROGLYPH E025
+130F0 ; [.378C.0020.0002.130F0] # EGYPTIAN HIEROGLYPH E026
+130F1 ; [.378D.0020.0002.130F1] # EGYPTIAN HIEROGLYPH E027
+130F2 ; [.378E.0020.0002.130F2] # EGYPTIAN HIEROGLYPH E028
+130F3 ; [.378F.0020.0002.130F3] # EGYPTIAN HIEROGLYPH E028A
+130F4 ; [.3790.0020.0002.130F4] # EGYPTIAN HIEROGLYPH E029
+130F5 ; [.3791.0020.0002.130F5] # EGYPTIAN HIEROGLYPH E030
+130F6 ; [.3792.0020.0002.130F6] # EGYPTIAN HIEROGLYPH E031
+130F7 ; [.3793.0020.0002.130F7] # EGYPTIAN HIEROGLYPH E032
+130F8 ; [.3794.0020.0002.130F8] # EGYPTIAN HIEROGLYPH E033
+130F9 ; [.3795.0020.0002.130F9] # EGYPTIAN HIEROGLYPH E034
+130FA ; [.3796.0020.0002.130FA] # EGYPTIAN HIEROGLYPH E034A
+130FB ; [.3797.0020.0002.130FB] # EGYPTIAN HIEROGLYPH E036
+130FC ; [.3798.0020.0002.130FC] # EGYPTIAN HIEROGLYPH E037
+130FD ; [.3799.0020.0002.130FD] # EGYPTIAN HIEROGLYPH E038
+130FE ; [.379A.0020.0002.130FE] # EGYPTIAN HIEROGLYPH F001
+130FF ; [.379B.0020.0002.130FF] # EGYPTIAN HIEROGLYPH F001A
+13100 ; [.379C.0020.0002.13100] # EGYPTIAN HIEROGLYPH F002
+13101 ; [.379D.0020.0002.13101] # EGYPTIAN HIEROGLYPH F003
+13102 ; [.379E.0020.0002.13102] # EGYPTIAN HIEROGLYPH F004
+13103 ; [.379F.0020.0002.13103] # EGYPTIAN HIEROGLYPH F005
+13104 ; [.37A0.0020.0002.13104] # EGYPTIAN HIEROGLYPH F006
+13105 ; [.37A1.0020.0002.13105] # EGYPTIAN HIEROGLYPH F007
+13106 ; [.37A2.0020.0002.13106] # EGYPTIAN HIEROGLYPH F008
+13107 ; [.37A3.0020.0002.13107] # EGYPTIAN HIEROGLYPH F009
+13108 ; [.37A4.0020.0002.13108] # EGYPTIAN HIEROGLYPH F010
+13109 ; [.37A5.0020.0002.13109] # EGYPTIAN HIEROGLYPH F011
+1310A ; [.37A6.0020.0002.1310A] # EGYPTIAN HIEROGLYPH F012
+1310B ; [.37A7.0020.0002.1310B] # EGYPTIAN HIEROGLYPH F013
+1310C ; [.37A8.0020.0002.1310C] # EGYPTIAN HIEROGLYPH F013A
+1310D ; [.37A9.0020.0002.1310D] # EGYPTIAN HIEROGLYPH F014
+1310E ; [.37AA.0020.0002.1310E] # EGYPTIAN HIEROGLYPH F015
+1310F ; [.37AB.0020.0002.1310F] # EGYPTIAN HIEROGLYPH F016
+13110 ; [.37AC.0020.0002.13110] # EGYPTIAN HIEROGLYPH F017
+13111 ; [.37AD.0020.0002.13111] # EGYPTIAN HIEROGLYPH F018
+13112 ; [.37AE.0020.0002.13112] # EGYPTIAN HIEROGLYPH F019
+13113 ; [.37AF.0020.0002.13113] # EGYPTIAN HIEROGLYPH F020
+13114 ; [.37B0.0020.0002.13114] # EGYPTIAN HIEROGLYPH F021
+13115 ; [.37B1.0020.0002.13115] # EGYPTIAN HIEROGLYPH F021A
+13116 ; [.37B2.0020.0002.13116] # EGYPTIAN HIEROGLYPH F022
+13117 ; [.37B3.0020.0002.13117] # EGYPTIAN HIEROGLYPH F023
+13118 ; [.37B4.0020.0002.13118] # EGYPTIAN HIEROGLYPH F024
+13119 ; [.37B5.0020.0002.13119] # EGYPTIAN HIEROGLYPH F025
+1311A ; [.37B6.0020.0002.1311A] # EGYPTIAN HIEROGLYPH F026
+1311B ; [.37B7.0020.0002.1311B] # EGYPTIAN HIEROGLYPH F027
+1311C ; [.37B8.0020.0002.1311C] # EGYPTIAN HIEROGLYPH F028
+1311D ; [.37B9.0020.0002.1311D] # EGYPTIAN HIEROGLYPH F029
+1311E ; [.37BA.0020.0002.1311E] # EGYPTIAN HIEROGLYPH F030
+1311F ; [.37BB.0020.0002.1311F] # EGYPTIAN HIEROGLYPH F031
+13120 ; [.37BC.0020.0002.13120] # EGYPTIAN HIEROGLYPH F031A
+13121 ; [.37BD.0020.0002.13121] # EGYPTIAN HIEROGLYPH F032
+13122 ; [.37BE.0020.0002.13122] # EGYPTIAN HIEROGLYPH F033
+13123 ; [.37BF.0020.0002.13123] # EGYPTIAN HIEROGLYPH F034
+13124 ; [.37C0.0020.0002.13124] # EGYPTIAN HIEROGLYPH F035
+13125 ; [.37C1.0020.0002.13125] # EGYPTIAN HIEROGLYPH F036
+13126 ; [.37C2.0020.0002.13126] # EGYPTIAN HIEROGLYPH F037
+13127 ; [.37C3.0020.0002.13127] # EGYPTIAN HIEROGLYPH F037A
+13128 ; [.37C4.0020.0002.13128] # EGYPTIAN HIEROGLYPH F038
+13129 ; [.37C5.0020.0002.13129] # EGYPTIAN HIEROGLYPH F038A
+1312A ; [.37C6.0020.0002.1312A] # EGYPTIAN HIEROGLYPH F039
+1312B ; [.37C7.0020.0002.1312B] # EGYPTIAN HIEROGLYPH F040
+1312C ; [.37C8.0020.0002.1312C] # EGYPTIAN HIEROGLYPH F041
+1312D ; [.37C9.0020.0002.1312D] # EGYPTIAN HIEROGLYPH F042
+1312E ; [.37CA.0020.0002.1312E] # EGYPTIAN HIEROGLYPH F043
+1312F ; [.37CB.0020.0002.1312F] # EGYPTIAN HIEROGLYPH F044
+13130 ; [.37CC.0020.0002.13130] # EGYPTIAN HIEROGLYPH F045
+13131 ; [.37CD.0020.0002.13131] # EGYPTIAN HIEROGLYPH F045A
+13132 ; [.37CE.0020.0002.13132] # EGYPTIAN HIEROGLYPH F046
+13133 ; [.37CF.0020.0002.13133] # EGYPTIAN HIEROGLYPH F046A
+13134 ; [.37D0.0020.0002.13134] # EGYPTIAN HIEROGLYPH F047
+13135 ; [.37D1.0020.0002.13135] # EGYPTIAN HIEROGLYPH F047A
+13136 ; [.37D2.0020.0002.13136] # EGYPTIAN HIEROGLYPH F048
+13137 ; [.37D3.0020.0002.13137] # EGYPTIAN HIEROGLYPH F049
+13138 ; [.37D4.0020.0002.13138] # EGYPTIAN HIEROGLYPH F050
+13139 ; [.37D5.0020.0002.13139] # EGYPTIAN HIEROGLYPH F051
+1313A ; [.37D6.0020.0002.1313A] # EGYPTIAN HIEROGLYPH F051A
+1313B ; [.37D7.0020.0002.1313B] # EGYPTIAN HIEROGLYPH F051B
+1313C ; [.37D8.0020.0002.1313C] # EGYPTIAN HIEROGLYPH F051C
+1313D ; [.37D9.0020.0002.1313D] # EGYPTIAN HIEROGLYPH F052
+1313E ; [.37DA.0020.0002.1313E] # EGYPTIAN HIEROGLYPH F053
+1313F ; [.37DB.0020.0002.1313F] # EGYPTIAN HIEROGLYPH G001
+13140 ; [.37DC.0020.0002.13140] # EGYPTIAN HIEROGLYPH G002
+13141 ; [.37DD.0020.0002.13141] # EGYPTIAN HIEROGLYPH G003
+13142 ; [.37DE.0020.0002.13142] # EGYPTIAN HIEROGLYPH G004
+13143 ; [.37DF.0020.0002.13143] # EGYPTIAN HIEROGLYPH G005
+13144 ; [.37E0.0020.0002.13144] # EGYPTIAN HIEROGLYPH G006
+13145 ; [.37E1.0020.0002.13145] # EGYPTIAN HIEROGLYPH G006A
+13146 ; [.37E2.0020.0002.13146] # EGYPTIAN HIEROGLYPH G007
+13147 ; [.37E3.0020.0002.13147] # EGYPTIAN HIEROGLYPH G007A
+13148 ; [.37E4.0020.0002.13148] # EGYPTIAN HIEROGLYPH G007B
+13149 ; [.37E5.0020.0002.13149] # EGYPTIAN HIEROGLYPH G008
+1314A ; [.37E6.0020.0002.1314A] # EGYPTIAN HIEROGLYPH G009
+1314B ; [.37E7.0020.0002.1314B] # EGYPTIAN HIEROGLYPH G010
+1314C ; [.37E8.0020.0002.1314C] # EGYPTIAN HIEROGLYPH G011
+1314D ; [.37E9.0020.0002.1314D] # EGYPTIAN HIEROGLYPH G011A
+1314E ; [.37EA.0020.0002.1314E] # EGYPTIAN HIEROGLYPH G012
+1314F ; [.37EB.0020.0002.1314F] # EGYPTIAN HIEROGLYPH G013
+13150 ; [.37EC.0020.0002.13150] # EGYPTIAN HIEROGLYPH G014
+13151 ; [.37ED.0020.0002.13151] # EGYPTIAN HIEROGLYPH G015
+13152 ; [.37EE.0020.0002.13152] # EGYPTIAN HIEROGLYPH G016
+13153 ; [.37EF.0020.0002.13153] # EGYPTIAN HIEROGLYPH G017
+13154 ; [.37F0.0020.0002.13154] # EGYPTIAN HIEROGLYPH G018
+13155 ; [.37F1.0020.0002.13155] # EGYPTIAN HIEROGLYPH G019
+13156 ; [.37F2.0020.0002.13156] # EGYPTIAN HIEROGLYPH G020
+13157 ; [.37F3.0020.0002.13157] # EGYPTIAN HIEROGLYPH G020A
+13158 ; [.37F4.0020.0002.13158] # EGYPTIAN HIEROGLYPH G021
+13159 ; [.37F5.0020.0002.13159] # EGYPTIAN HIEROGLYPH G022
+1315A ; [.37F6.0020.0002.1315A] # EGYPTIAN HIEROGLYPH G023
+1315B ; [.37F7.0020.0002.1315B] # EGYPTIAN HIEROGLYPH G024
+1315C ; [.37F8.0020.0002.1315C] # EGYPTIAN HIEROGLYPH G025
+1315D ; [.37F9.0020.0002.1315D] # EGYPTIAN HIEROGLYPH G026
+1315E ; [.37FA.0020.0002.1315E] # EGYPTIAN HIEROGLYPH G026A
+1315F ; [.37FB.0020.0002.1315F] # EGYPTIAN HIEROGLYPH G027
+13160 ; [.37FC.0020.0002.13160] # EGYPTIAN HIEROGLYPH G028
+13161 ; [.37FD.0020.0002.13161] # EGYPTIAN HIEROGLYPH G029
+13162 ; [.37FE.0020.0002.13162] # EGYPTIAN HIEROGLYPH G030
+13163 ; [.37FF.0020.0002.13163] # EGYPTIAN HIEROGLYPH G031
+13164 ; [.3800.0020.0002.13164] # EGYPTIAN HIEROGLYPH G032
+13165 ; [.3801.0020.0002.13165] # EGYPTIAN HIEROGLYPH G033
+13166 ; [.3802.0020.0002.13166] # EGYPTIAN HIEROGLYPH G034
+13167 ; [.3803.0020.0002.13167] # EGYPTIAN HIEROGLYPH G035
+13168 ; [.3804.0020.0002.13168] # EGYPTIAN HIEROGLYPH G036
+13169 ; [.3805.0020.0002.13169] # EGYPTIAN HIEROGLYPH G036A
+1316A ; [.3806.0020.0002.1316A] # EGYPTIAN HIEROGLYPH G037
+1316B ; [.3807.0020.0002.1316B] # EGYPTIAN HIEROGLYPH G037A
+1316C ; [.3808.0020.0002.1316C] # EGYPTIAN HIEROGLYPH G038
+1316D ; [.3809.0020.0002.1316D] # EGYPTIAN HIEROGLYPH G039
+1316E ; [.380A.0020.0002.1316E] # EGYPTIAN HIEROGLYPH G040
+1316F ; [.380B.0020.0002.1316F] # EGYPTIAN HIEROGLYPH G041
+13170 ; [.380C.0020.0002.13170] # EGYPTIAN HIEROGLYPH G042
+13171 ; [.380D.0020.0002.13171] # EGYPTIAN HIEROGLYPH G043
+13172 ; [.380E.0020.0002.13172] # EGYPTIAN HIEROGLYPH G043A
+13173 ; [.380F.0020.0002.13173] # EGYPTIAN HIEROGLYPH G044
+13174 ; [.3810.0020.0002.13174] # EGYPTIAN HIEROGLYPH G045
+13175 ; [.3811.0020.0002.13175] # EGYPTIAN HIEROGLYPH G045A
+13176 ; [.3812.0020.0002.13176] # EGYPTIAN HIEROGLYPH G046
+13177 ; [.3813.0020.0002.13177] # EGYPTIAN HIEROGLYPH G047
+13178 ; [.3814.0020.0002.13178] # EGYPTIAN HIEROGLYPH G048
+13179 ; [.3815.0020.0002.13179] # EGYPTIAN HIEROGLYPH G049
+1317A ; [.3816.0020.0002.1317A] # EGYPTIAN HIEROGLYPH G050
+1317B ; [.3817.0020.0002.1317B] # EGYPTIAN HIEROGLYPH G051
+1317C ; [.3818.0020.0002.1317C] # EGYPTIAN HIEROGLYPH G052
+1317D ; [.3819.0020.0002.1317D] # EGYPTIAN HIEROGLYPH G053
+1317E ; [.381A.0020.0002.1317E] # EGYPTIAN HIEROGLYPH G054
+1317F ; [.381B.0020.0002.1317F] # EGYPTIAN HIEROGLYPH H001
+13180 ; [.381C.0020.0002.13180] # EGYPTIAN HIEROGLYPH H002
+13181 ; [.381D.0020.0002.13181] # EGYPTIAN HIEROGLYPH H003
+13182 ; [.381E.0020.0002.13182] # EGYPTIAN HIEROGLYPH H004
+13183 ; [.381F.0020.0002.13183] # EGYPTIAN HIEROGLYPH H005
+13184 ; [.3820.0020.0002.13184] # EGYPTIAN HIEROGLYPH H006
+13185 ; [.3821.0020.0002.13185] # EGYPTIAN HIEROGLYPH H006A
+13186 ; [.3822.0020.0002.13186] # EGYPTIAN HIEROGLYPH H007
+13187 ; [.3823.0020.0002.13187] # EGYPTIAN HIEROGLYPH H008
+13188 ; [.3824.0020.0002.13188] # EGYPTIAN HIEROGLYPH I001
+13189 ; [.3825.0020.0002.13189] # EGYPTIAN HIEROGLYPH I002
+1318A ; [.3826.0020.0002.1318A] # EGYPTIAN HIEROGLYPH I003
+1318B ; [.3827.0020.0002.1318B] # EGYPTIAN HIEROGLYPH I004
+1318C ; [.3828.0020.0002.1318C] # EGYPTIAN HIEROGLYPH I005
+1318D ; [.3829.0020.0002.1318D] # EGYPTIAN HIEROGLYPH I005A
+1318E ; [.382A.0020.0002.1318E] # EGYPTIAN HIEROGLYPH I006
+1318F ; [.382B.0020.0002.1318F] # EGYPTIAN HIEROGLYPH I007
+13190 ; [.382C.0020.0002.13190] # EGYPTIAN HIEROGLYPH I008
+13191 ; [.382D.0020.0002.13191] # EGYPTIAN HIEROGLYPH I009
+13192 ; [.382E.0020.0002.13192] # EGYPTIAN HIEROGLYPH I009A
+13193 ; [.382F.0020.0002.13193] # EGYPTIAN HIEROGLYPH I010
+13194 ; [.3830.0020.0002.13194] # EGYPTIAN HIEROGLYPH I010A
+13195 ; [.3831.0020.0002.13195] # EGYPTIAN HIEROGLYPH I011
+13196 ; [.3832.0020.0002.13196] # EGYPTIAN HIEROGLYPH I011A
+13197 ; [.3833.0020.0002.13197] # EGYPTIAN HIEROGLYPH I012
+13198 ; [.3834.0020.0002.13198] # EGYPTIAN HIEROGLYPH I013
+13199 ; [.3835.0020.0002.13199] # EGYPTIAN HIEROGLYPH I014
+1319A ; [.3836.0020.0002.1319A] # EGYPTIAN HIEROGLYPH I015
+1319B ; [.3837.0020.0002.1319B] # EGYPTIAN HIEROGLYPH K001
+1319C ; [.3838.0020.0002.1319C] # EGYPTIAN HIEROGLYPH K002
+1319D ; [.3839.0020.0002.1319D] # EGYPTIAN HIEROGLYPH K003
+1319E ; [.383A.0020.0002.1319E] # EGYPTIAN HIEROGLYPH K004
+1319F ; [.383B.0020.0002.1319F] # EGYPTIAN HIEROGLYPH K005
+131A0 ; [.383C.0020.0002.131A0] # EGYPTIAN HIEROGLYPH K006
+131A1 ; [.383D.0020.0002.131A1] # EGYPTIAN HIEROGLYPH K007
+131A2 ; [.383E.0020.0002.131A2] # EGYPTIAN HIEROGLYPH K008
+131A3 ; [.383F.0020.0002.131A3] # EGYPTIAN HIEROGLYPH L001
+131A4 ; [.3840.0020.0002.131A4] # EGYPTIAN HIEROGLYPH L002
+131A5 ; [.3841.0020.0002.131A5] # EGYPTIAN HIEROGLYPH L002A
+131A6 ; [.3842.0020.0002.131A6] # EGYPTIAN HIEROGLYPH L003
+131A7 ; [.3843.0020.0002.131A7] # EGYPTIAN HIEROGLYPH L004
+131A8 ; [.3844.0020.0002.131A8] # EGYPTIAN HIEROGLYPH L005
+131A9 ; [.3845.0020.0002.131A9] # EGYPTIAN HIEROGLYPH L006
+131AA ; [.3846.0020.0002.131AA] # EGYPTIAN HIEROGLYPH L006A
+131AB ; [.3847.0020.0002.131AB] # EGYPTIAN HIEROGLYPH L007
+131AC ; [.3848.0020.0002.131AC] # EGYPTIAN HIEROGLYPH L008
+131AD ; [.3849.0020.0002.131AD] # EGYPTIAN HIEROGLYPH M001
+131AE ; [.384A.0020.0002.131AE] # EGYPTIAN HIEROGLYPH M001A
+131AF ; [.384B.0020.0002.131AF] # EGYPTIAN HIEROGLYPH M001B
+131B0 ; [.384C.0020.0002.131B0] # EGYPTIAN HIEROGLYPH M002
+131B1 ; [.384D.0020.0002.131B1] # EGYPTIAN HIEROGLYPH M003
+131B2 ; [.384E.0020.0002.131B2] # EGYPTIAN HIEROGLYPH M003A
+131B3 ; [.384F.0020.0002.131B3] # EGYPTIAN HIEROGLYPH M004
+131B4 ; [.3850.0020.0002.131B4] # EGYPTIAN HIEROGLYPH M005
+131B5 ; [.3851.0020.0002.131B5] # EGYPTIAN HIEROGLYPH M006
+131B6 ; [.3852.0020.0002.131B6] # EGYPTIAN HIEROGLYPH M007
+131B7 ; [.3853.0020.0002.131B7] # EGYPTIAN HIEROGLYPH M008
+131B8 ; [.3854.0020.0002.131B8] # EGYPTIAN HIEROGLYPH M009
+131B9 ; [.3855.0020.0002.131B9] # EGYPTIAN HIEROGLYPH M010
+131BA ; [.3856.0020.0002.131BA] # EGYPTIAN HIEROGLYPH M010A
+131BB ; [.3857.0020.0002.131BB] # EGYPTIAN HIEROGLYPH M011
+131BC ; [.3858.0020.0002.131BC] # EGYPTIAN HIEROGLYPH M012
+131BD ; [.3859.0020.0002.131BD] # EGYPTIAN HIEROGLYPH M012A
+131BE ; [.385A.0020.0002.131BE] # EGYPTIAN HIEROGLYPH M012B
+131BF ; [.385B.0020.0002.131BF] # EGYPTIAN HIEROGLYPH M012C
+131C0 ; [.385C.0020.0002.131C0] # EGYPTIAN HIEROGLYPH M012D
+131C1 ; [.385D.0020.0002.131C1] # EGYPTIAN HIEROGLYPH M012E
+131C2 ; [.385E.0020.0002.131C2] # EGYPTIAN HIEROGLYPH M012F
+131C3 ; [.385F.0020.0002.131C3] # EGYPTIAN HIEROGLYPH M012G
+131C4 ; [.3860.0020.0002.131C4] # EGYPTIAN HIEROGLYPH M012H
+131C5 ; [.3861.0020.0002.131C5] # EGYPTIAN HIEROGLYPH M013
+131C6 ; [.3862.0020.0002.131C6] # EGYPTIAN HIEROGLYPH M014
+131C7 ; [.3863.0020.0002.131C7] # EGYPTIAN HIEROGLYPH M015
+131C8 ; [.3864.0020.0002.131C8] # EGYPTIAN HIEROGLYPH M015A
+131C9 ; [.3865.0020.0002.131C9] # EGYPTIAN HIEROGLYPH M016
+131CA ; [.3866.0020.0002.131CA] # EGYPTIAN HIEROGLYPH M016A
+131CB ; [.3867.0020.0002.131CB] # EGYPTIAN HIEROGLYPH M017
+131CC ; [.3868.0020.0002.131CC] # EGYPTIAN HIEROGLYPH M017A
+131CD ; [.3869.0020.0002.131CD] # EGYPTIAN HIEROGLYPH M018
+131CE ; [.386A.0020.0002.131CE] # EGYPTIAN HIEROGLYPH M019
+131CF ; [.386B.0020.0002.131CF] # EGYPTIAN HIEROGLYPH M020
+131D0 ; [.386C.0020.0002.131D0] # EGYPTIAN HIEROGLYPH M021
+131D1 ; [.386D.0020.0002.131D1] # EGYPTIAN HIEROGLYPH M022
+131D2 ; [.386E.0020.0002.131D2] # EGYPTIAN HIEROGLYPH M022A
+131D3 ; [.386F.0020.0002.131D3] # EGYPTIAN HIEROGLYPH M023
+131D4 ; [.3870.0020.0002.131D4] # EGYPTIAN HIEROGLYPH M024
+131D5 ; [.3871.0020.0002.131D5] # EGYPTIAN HIEROGLYPH M024A
+131D6 ; [.3872.0020.0002.131D6] # EGYPTIAN HIEROGLYPH M025
+131D7 ; [.3873.0020.0002.131D7] # EGYPTIAN HIEROGLYPH M026
+131D8 ; [.3874.0020.0002.131D8] # EGYPTIAN HIEROGLYPH M027
+131D9 ; [.3875.0020.0002.131D9] # EGYPTIAN HIEROGLYPH M028
+131DA ; [.3876.0020.0002.131DA] # EGYPTIAN HIEROGLYPH M028A
+131DB ; [.3877.0020.0002.131DB] # EGYPTIAN HIEROGLYPH M029
+131DC ; [.3878.0020.0002.131DC] # EGYPTIAN HIEROGLYPH M030
+131DD ; [.3879.0020.0002.131DD] # EGYPTIAN HIEROGLYPH M031
+131DE ; [.387A.0020.0002.131DE] # EGYPTIAN HIEROGLYPH M031A
+131DF ; [.387B.0020.0002.131DF] # EGYPTIAN HIEROGLYPH M032
+131E0 ; [.387C.0020.0002.131E0] # EGYPTIAN HIEROGLYPH M033
+131E1 ; [.387D.0020.0002.131E1] # EGYPTIAN HIEROGLYPH M033A
+131E2 ; [.387E.0020.0002.131E2] # EGYPTIAN HIEROGLYPH M033B
+131E3 ; [.387F.0020.0002.131E3] # EGYPTIAN HIEROGLYPH M034
+131E4 ; [.3880.0020.0002.131E4] # EGYPTIAN HIEROGLYPH M035
+131E5 ; [.3881.0020.0002.131E5] # EGYPTIAN HIEROGLYPH M036
+131E6 ; [.3882.0020.0002.131E6] # EGYPTIAN HIEROGLYPH M037
+131E7 ; [.3883.0020.0002.131E7] # EGYPTIAN HIEROGLYPH M038
+131E8 ; [.3884.0020.0002.131E8] # EGYPTIAN HIEROGLYPH M039
+131E9 ; [.3885.0020.0002.131E9] # EGYPTIAN HIEROGLYPH M040
+131EA ; [.3886.0020.0002.131EA] # EGYPTIAN HIEROGLYPH M040A
+131EB ; [.3887.0020.0002.131EB] # EGYPTIAN HIEROGLYPH M041
+131EC ; [.3888.0020.0002.131EC] # EGYPTIAN HIEROGLYPH M042
+131ED ; [.3889.0020.0002.131ED] # EGYPTIAN HIEROGLYPH M043
+131EE ; [.388A.0020.0002.131EE] # EGYPTIAN HIEROGLYPH M044
+131EF ; [.388B.0020.0002.131EF] # EGYPTIAN HIEROGLYPH N001
+131F0 ; [.388C.0020.0002.131F0] # EGYPTIAN HIEROGLYPH N002
+131F1 ; [.388D.0020.0002.131F1] # EGYPTIAN HIEROGLYPH N003
+131F2 ; [.388E.0020.0002.131F2] # EGYPTIAN HIEROGLYPH N004
+131F3 ; [.388F.0020.0002.131F3] # EGYPTIAN HIEROGLYPH N005
+131F4 ; [.3890.0020.0002.131F4] # EGYPTIAN HIEROGLYPH N006
+131F5 ; [.3891.0020.0002.131F5] # EGYPTIAN HIEROGLYPH N007
+131F6 ; [.3892.0020.0002.131F6] # EGYPTIAN HIEROGLYPH N008
+131F7 ; [.3893.0020.0002.131F7] # EGYPTIAN HIEROGLYPH N009
+131F8 ; [.3894.0020.0002.131F8] # EGYPTIAN HIEROGLYPH N010
+131F9 ; [.3895.0020.0002.131F9] # EGYPTIAN HIEROGLYPH N011
+131FA ; [.3896.0020.0002.131FA] # EGYPTIAN HIEROGLYPH N012
+131FB ; [.3897.0020.0002.131FB] # EGYPTIAN HIEROGLYPH N013
+131FC ; [.3898.0020.0002.131FC] # EGYPTIAN HIEROGLYPH N014
+131FD ; [.3899.0020.0002.131FD] # EGYPTIAN HIEROGLYPH N015
+131FE ; [.389A.0020.0002.131FE] # EGYPTIAN HIEROGLYPH N016
+131FF ; [.389B.0020.0002.131FF] # EGYPTIAN HIEROGLYPH N017
+13200 ; [.389C.0020.0002.13200] # EGYPTIAN HIEROGLYPH N018
+13201 ; [.389D.0020.0002.13201] # EGYPTIAN HIEROGLYPH N018A
+13202 ; [.389E.0020.0002.13202] # EGYPTIAN HIEROGLYPH N018B
+13203 ; [.389F.0020.0002.13203] # EGYPTIAN HIEROGLYPH N019
+13204 ; [.38A0.0020.0002.13204] # EGYPTIAN HIEROGLYPH N020
+13205 ; [.38A1.0020.0002.13205] # EGYPTIAN HIEROGLYPH N021
+13206 ; [.38A2.0020.0002.13206] # EGYPTIAN HIEROGLYPH N022
+13207 ; [.38A3.0020.0002.13207] # EGYPTIAN HIEROGLYPH N023
+13208 ; [.38A4.0020.0002.13208] # EGYPTIAN HIEROGLYPH N024
+13209 ; [.38A5.0020.0002.13209] # EGYPTIAN HIEROGLYPH N025
+1320A ; [.38A6.0020.0002.1320A] # EGYPTIAN HIEROGLYPH N025A
+1320B ; [.38A7.0020.0002.1320B] # EGYPTIAN HIEROGLYPH N026
+1320C ; [.38A8.0020.0002.1320C] # EGYPTIAN HIEROGLYPH N027
+1320D ; [.38A9.0020.0002.1320D] # EGYPTIAN HIEROGLYPH N028
+1320E ; [.38AA.0020.0002.1320E] # EGYPTIAN HIEROGLYPH N029
+1320F ; [.38AB.0020.0002.1320F] # EGYPTIAN HIEROGLYPH N030
+13210 ; [.38AC.0020.0002.13210] # EGYPTIAN HIEROGLYPH N031
+13211 ; [.38AD.0020.0002.13211] # EGYPTIAN HIEROGLYPH N032
+13212 ; [.38AE.0020.0002.13212] # EGYPTIAN HIEROGLYPH N033
+13213 ; [.38AF.0020.0002.13213] # EGYPTIAN HIEROGLYPH N033A
+13214 ; [.38B0.0020.0002.13214] # EGYPTIAN HIEROGLYPH N034
+13215 ; [.38B1.0020.0002.13215] # EGYPTIAN HIEROGLYPH N034A
+13216 ; [.38B2.0020.0002.13216] # EGYPTIAN HIEROGLYPH N035
+13217 ; [.38B3.0020.0002.13217] # EGYPTIAN HIEROGLYPH N035A
+13218 ; [.38B4.0020.0002.13218] # EGYPTIAN HIEROGLYPH N036
+13219 ; [.38B5.0020.0002.13219] # EGYPTIAN HIEROGLYPH N037
+1321A ; [.38B6.0020.0002.1321A] # EGYPTIAN HIEROGLYPH N037A
+1321B ; [.38B7.0020.0002.1321B] # EGYPTIAN HIEROGLYPH N038
+1321C ; [.38B8.0020.0002.1321C] # EGYPTIAN HIEROGLYPH N039
+1321D ; [.38B9.0020.0002.1321D] # EGYPTIAN HIEROGLYPH N040
+1321E ; [.38BA.0020.0002.1321E] # EGYPTIAN HIEROGLYPH N041
+1321F ; [.38BB.0020.0002.1321F] # EGYPTIAN HIEROGLYPH N042
+13220 ; [.38BC.0020.0002.13220] # EGYPTIAN HIEROGLYPH NL001
+13221 ; [.38BD.0020.0002.13221] # EGYPTIAN HIEROGLYPH NL002
+13222 ; [.38BE.0020.0002.13222] # EGYPTIAN HIEROGLYPH NL003
+13223 ; [.38BF.0020.0002.13223] # EGYPTIAN HIEROGLYPH NL004
+13224 ; [.38C0.0020.0002.13224] # EGYPTIAN HIEROGLYPH NL005
+13225 ; [.38C1.0020.0002.13225] # EGYPTIAN HIEROGLYPH NL005A
+13226 ; [.38C2.0020.0002.13226] # EGYPTIAN HIEROGLYPH NL006
+13227 ; [.38C3.0020.0002.13227] # EGYPTIAN HIEROGLYPH NL007
+13228 ; [.38C4.0020.0002.13228] # EGYPTIAN HIEROGLYPH NL008
+13229 ; [.38C5.0020.0002.13229] # EGYPTIAN HIEROGLYPH NL009
+1322A ; [.38C6.0020.0002.1322A] # EGYPTIAN HIEROGLYPH NL010
+1322B ; [.38C7.0020.0002.1322B] # EGYPTIAN HIEROGLYPH NL011
+1322C ; [.38C8.0020.0002.1322C] # EGYPTIAN HIEROGLYPH NL012
+1322D ; [.38C9.0020.0002.1322D] # EGYPTIAN HIEROGLYPH NL013
+1322E ; [.38CA.0020.0002.1322E] # EGYPTIAN HIEROGLYPH NL014
+1322F ; [.38CB.0020.0002.1322F] # EGYPTIAN HIEROGLYPH NL015
+13230 ; [.38CC.0020.0002.13230] # EGYPTIAN HIEROGLYPH NL016
+13231 ; [.38CD.0020.0002.13231] # EGYPTIAN HIEROGLYPH NL017
+13232 ; [.38CE.0020.0002.13232] # EGYPTIAN HIEROGLYPH NL017A
+13233 ; [.38CF.0020.0002.13233] # EGYPTIAN HIEROGLYPH NL018
+13234 ; [.38D0.0020.0002.13234] # EGYPTIAN HIEROGLYPH NL019
+13235 ; [.38D1.0020.0002.13235] # EGYPTIAN HIEROGLYPH NL020
+13236 ; [.38D2.0020.0002.13236] # EGYPTIAN HIEROGLYPH NU001
+13237 ; [.38D3.0020.0002.13237] # EGYPTIAN HIEROGLYPH NU002
+13238 ; [.38D4.0020.0002.13238] # EGYPTIAN HIEROGLYPH NU003
+13239 ; [.38D5.0020.0002.13239] # EGYPTIAN HIEROGLYPH NU004
+1323A ; [.38D6.0020.0002.1323A] # EGYPTIAN HIEROGLYPH NU005
+1323B ; [.38D7.0020.0002.1323B] # EGYPTIAN HIEROGLYPH NU006
+1323C ; [.38D8.0020.0002.1323C] # EGYPTIAN HIEROGLYPH NU007
+1323D ; [.38D9.0020.0002.1323D] # EGYPTIAN HIEROGLYPH NU008
+1323E ; [.38DA.0020.0002.1323E] # EGYPTIAN HIEROGLYPH NU009
+1323F ; [.38DB.0020.0002.1323F] # EGYPTIAN HIEROGLYPH NU010
+13240 ; [.38DC.0020.0002.13240] # EGYPTIAN HIEROGLYPH NU010A
+13241 ; [.38DD.0020.0002.13241] # EGYPTIAN HIEROGLYPH NU011
+13242 ; [.38DE.0020.0002.13242] # EGYPTIAN HIEROGLYPH NU011A
+13243 ; [.38DF.0020.0002.13243] # EGYPTIAN HIEROGLYPH NU012
+13244 ; [.38E0.0020.0002.13244] # EGYPTIAN HIEROGLYPH NU013
+13245 ; [.38E1.0020.0002.13245] # EGYPTIAN HIEROGLYPH NU014
+13246 ; [.38E2.0020.0002.13246] # EGYPTIAN HIEROGLYPH NU015
+13247 ; [.38E3.0020.0002.13247] # EGYPTIAN HIEROGLYPH NU016
+13248 ; [.38E4.0020.0002.13248] # EGYPTIAN HIEROGLYPH NU017
+13249 ; [.38E5.0020.0002.13249] # EGYPTIAN HIEROGLYPH NU018
+1324A ; [.38E6.0020.0002.1324A] # EGYPTIAN HIEROGLYPH NU018A
+1324B ; [.38E7.0020.0002.1324B] # EGYPTIAN HIEROGLYPH NU019
+1324C ; [.38E8.0020.0002.1324C] # EGYPTIAN HIEROGLYPH NU020
+1324D ; [.38E9.0020.0002.1324D] # EGYPTIAN HIEROGLYPH NU021
+1324E ; [.38EA.0020.0002.1324E] # EGYPTIAN HIEROGLYPH NU022
+1324F ; [.38EB.0020.0002.1324F] # EGYPTIAN HIEROGLYPH NU022A
+13250 ; [.38EC.0020.0002.13250] # EGYPTIAN HIEROGLYPH O001
+13251 ; [.38ED.0020.0002.13251] # EGYPTIAN HIEROGLYPH O001A
+13252 ; [.38EE.0020.0002.13252] # EGYPTIAN HIEROGLYPH O002
+13253 ; [.38EF.0020.0002.13253] # EGYPTIAN HIEROGLYPH O003
+13254 ; [.38F0.0020.0002.13254] # EGYPTIAN HIEROGLYPH O004
+13255 ; [.38F1.0020.0002.13255] # EGYPTIAN HIEROGLYPH O005
+13256 ; [.38F2.0020.0002.13256] # EGYPTIAN HIEROGLYPH O005A
+13257 ; [.38F3.0020.0002.13257] # EGYPTIAN HIEROGLYPH O006
+13258 ; [.38F4.0020.0002.13258] # EGYPTIAN HIEROGLYPH O006A
+13259 ; [.38F5.0020.0002.13259] # EGYPTIAN HIEROGLYPH O006B
+1325A ; [.38F6.0020.0002.1325A] # EGYPTIAN HIEROGLYPH O006C
+1325B ; [.38F7.0020.0002.1325B] # EGYPTIAN HIEROGLYPH O006D
+1325C ; [.38F8.0020.0002.1325C] # EGYPTIAN HIEROGLYPH O006E
+1325D ; [.38F9.0020.0002.1325D] # EGYPTIAN HIEROGLYPH O006F
+1325E ; [.38FA.0020.0002.1325E] # EGYPTIAN HIEROGLYPH O007
+1325F ; [.38FB.0020.0002.1325F] # EGYPTIAN HIEROGLYPH O008
+13260 ; [.38FC.0020.0002.13260] # EGYPTIAN HIEROGLYPH O009
+13261 ; [.38FD.0020.0002.13261] # EGYPTIAN HIEROGLYPH O010
+13262 ; [.38FE.0020.0002.13262] # EGYPTIAN HIEROGLYPH O010A
+13263 ; [.38FF.0020.0002.13263] # EGYPTIAN HIEROGLYPH O010B
+13264 ; [.3900.0020.0002.13264] # EGYPTIAN HIEROGLYPH O010C
+13265 ; [.3901.0020.0002.13265] # EGYPTIAN HIEROGLYPH O011
+13266 ; [.3902.0020.0002.13266] # EGYPTIAN HIEROGLYPH O012
+13267 ; [.3903.0020.0002.13267] # EGYPTIAN HIEROGLYPH O013
+13268 ; [.3904.0020.0002.13268] # EGYPTIAN HIEROGLYPH O014
+13269 ; [.3905.0020.0002.13269] # EGYPTIAN HIEROGLYPH O015
+1326A ; [.3906.0020.0002.1326A] # EGYPTIAN HIEROGLYPH O016
+1326B ; [.3907.0020.0002.1326B] # EGYPTIAN HIEROGLYPH O017
+1326C ; [.3908.0020.0002.1326C] # EGYPTIAN HIEROGLYPH O018
+1326D ; [.3909.0020.0002.1326D] # EGYPTIAN HIEROGLYPH O019
+1326E ; [.390A.0020.0002.1326E] # EGYPTIAN HIEROGLYPH O019A
+1326F ; [.390B.0020.0002.1326F] # EGYPTIAN HIEROGLYPH O020
+13270 ; [.390C.0020.0002.13270] # EGYPTIAN HIEROGLYPH O020A
+13271 ; [.390D.0020.0002.13271] # EGYPTIAN HIEROGLYPH O021
+13272 ; [.390E.0020.0002.13272] # EGYPTIAN HIEROGLYPH O022
+13273 ; [.390F.0020.0002.13273] # EGYPTIAN HIEROGLYPH O023
+13274 ; [.3910.0020.0002.13274] # EGYPTIAN HIEROGLYPH O024
+13275 ; [.3911.0020.0002.13275] # EGYPTIAN HIEROGLYPH O024A
+13276 ; [.3912.0020.0002.13276] # EGYPTIAN HIEROGLYPH O025
+13277 ; [.3913.0020.0002.13277] # EGYPTIAN HIEROGLYPH O025A
+13278 ; [.3914.0020.0002.13278] # EGYPTIAN HIEROGLYPH O026
+13279 ; [.3915.0020.0002.13279] # EGYPTIAN HIEROGLYPH O027
+1327A ; [.3916.0020.0002.1327A] # EGYPTIAN HIEROGLYPH O028
+1327B ; [.3917.0020.0002.1327B] # EGYPTIAN HIEROGLYPH O029
+1327C ; [.3918.0020.0002.1327C] # EGYPTIAN HIEROGLYPH O029A
+1327D ; [.3919.0020.0002.1327D] # EGYPTIAN HIEROGLYPH O030
+1327E ; [.391A.0020.0002.1327E] # EGYPTIAN HIEROGLYPH O030A
+1327F ; [.391B.0020.0002.1327F] # EGYPTIAN HIEROGLYPH O031
+13280 ; [.391C.0020.0002.13280] # EGYPTIAN HIEROGLYPH O032
+13281 ; [.391D.0020.0002.13281] # EGYPTIAN HIEROGLYPH O033
+13282 ; [.391E.0020.0002.13282] # EGYPTIAN HIEROGLYPH O033A
+13283 ; [.391F.0020.0002.13283] # EGYPTIAN HIEROGLYPH O034
+13284 ; [.3920.0020.0002.13284] # EGYPTIAN HIEROGLYPH O035
+13285 ; [.3921.0020.0002.13285] # EGYPTIAN HIEROGLYPH O036
+13286 ; [.3922.0020.0002.13286] # EGYPTIAN HIEROGLYPH O036A
+13287 ; [.3923.0020.0002.13287] # EGYPTIAN HIEROGLYPH O036B
+13288 ; [.3924.0020.0002.13288] # EGYPTIAN HIEROGLYPH O036C
+13289 ; [.3925.0020.0002.13289] # EGYPTIAN HIEROGLYPH O036D
+1328A ; [.3926.0020.0002.1328A] # EGYPTIAN HIEROGLYPH O037
+1328B ; [.3927.0020.0002.1328B] # EGYPTIAN HIEROGLYPH O038
+1328C ; [.3928.0020.0002.1328C] # EGYPTIAN HIEROGLYPH O039
+1328D ; [.3929.0020.0002.1328D] # EGYPTIAN HIEROGLYPH O040
+1328E ; [.392A.0020.0002.1328E] # EGYPTIAN HIEROGLYPH O041
+1328F ; [.392B.0020.0002.1328F] # EGYPTIAN HIEROGLYPH O042
+13290 ; [.392C.0020.0002.13290] # EGYPTIAN HIEROGLYPH O043
+13291 ; [.392D.0020.0002.13291] # EGYPTIAN HIEROGLYPH O044
+13292 ; [.392E.0020.0002.13292] # EGYPTIAN HIEROGLYPH O045
+13293 ; [.392F.0020.0002.13293] # EGYPTIAN HIEROGLYPH O046
+13294 ; [.3930.0020.0002.13294] # EGYPTIAN HIEROGLYPH O047
+13295 ; [.3931.0020.0002.13295] # EGYPTIAN HIEROGLYPH O048
+13296 ; [.3932.0020.0002.13296] # EGYPTIAN HIEROGLYPH O049
+13297 ; [.3933.0020.0002.13297] # EGYPTIAN HIEROGLYPH O050
+13298 ; [.3934.0020.0002.13298] # EGYPTIAN HIEROGLYPH O050A
+13299 ; [.3935.0020.0002.13299] # EGYPTIAN HIEROGLYPH O050B
+1329A ; [.3936.0020.0002.1329A] # EGYPTIAN HIEROGLYPH O051
+1329B ; [.3937.0020.0002.1329B] # EGYPTIAN HIEROGLYPH P001
+1329C ; [.3938.0020.0002.1329C] # EGYPTIAN HIEROGLYPH P001A
+1329D ; [.3939.0020.0002.1329D] # EGYPTIAN HIEROGLYPH P002
+1329E ; [.393A.0020.0002.1329E] # EGYPTIAN HIEROGLYPH P003
+1329F ; [.393B.0020.0002.1329F] # EGYPTIAN HIEROGLYPH P003A
+132A0 ; [.393C.0020.0002.132A0] # EGYPTIAN HIEROGLYPH P004
+132A1 ; [.393D.0020.0002.132A1] # EGYPTIAN HIEROGLYPH P005
+132A2 ; [.393E.0020.0002.132A2] # EGYPTIAN HIEROGLYPH P006
+132A3 ; [.393F.0020.0002.132A3] # EGYPTIAN HIEROGLYPH P007
+132A4 ; [.3940.0020.0002.132A4] # EGYPTIAN HIEROGLYPH P008
+132A5 ; [.3941.0020.0002.132A5] # EGYPTIAN HIEROGLYPH P009
+132A6 ; [.3942.0020.0002.132A6] # EGYPTIAN HIEROGLYPH P010
+132A7 ; [.3943.0020.0002.132A7] # EGYPTIAN HIEROGLYPH P011
+132A8 ; [.3944.0020.0002.132A8] # EGYPTIAN HIEROGLYPH Q001
+132A9 ; [.3945.0020.0002.132A9] # EGYPTIAN HIEROGLYPH Q002
+132AA ; [.3946.0020.0002.132AA] # EGYPTIAN HIEROGLYPH Q003
+132AB ; [.3947.0020.0002.132AB] # EGYPTIAN HIEROGLYPH Q004
+132AC ; [.3948.0020.0002.132AC] # EGYPTIAN HIEROGLYPH Q005
+132AD ; [.3949.0020.0002.132AD] # EGYPTIAN HIEROGLYPH Q006
+132AE ; [.394A.0020.0002.132AE] # EGYPTIAN HIEROGLYPH Q007
+132AF ; [.394B.0020.0002.132AF] # EGYPTIAN HIEROGLYPH R001
+132B0 ; [.394C.0020.0002.132B0] # EGYPTIAN HIEROGLYPH R002
+132B1 ; [.394D.0020.0002.132B1] # EGYPTIAN HIEROGLYPH R002A
+132B2 ; [.394E.0020.0002.132B2] # EGYPTIAN HIEROGLYPH R003
+132B3 ; [.394F.0020.0002.132B3] # EGYPTIAN HIEROGLYPH R003A
+132B4 ; [.3950.0020.0002.132B4] # EGYPTIAN HIEROGLYPH R003B
+132B5 ; [.3951.0020.0002.132B5] # EGYPTIAN HIEROGLYPH R004
+132B6 ; [.3952.0020.0002.132B6] # EGYPTIAN HIEROGLYPH R005
+132B7 ; [.3953.0020.0002.132B7] # EGYPTIAN HIEROGLYPH R006
+132B8 ; [.3954.0020.0002.132B8] # EGYPTIAN HIEROGLYPH R007
+132B9 ; [.3955.0020.0002.132B9] # EGYPTIAN HIEROGLYPH R008
+132BA ; [.3956.0020.0002.132BA] # EGYPTIAN HIEROGLYPH R009
+132BB ; [.3957.0020.0002.132BB] # EGYPTIAN HIEROGLYPH R010
+132BC ; [.3958.0020.0002.132BC] # EGYPTIAN HIEROGLYPH R010A
+132BD ; [.3959.0020.0002.132BD] # EGYPTIAN HIEROGLYPH R011
+132BE ; [.395A.0020.0002.132BE] # EGYPTIAN HIEROGLYPH R012
+132BF ; [.395B.0020.0002.132BF] # EGYPTIAN HIEROGLYPH R013
+132C0 ; [.395C.0020.0002.132C0] # EGYPTIAN HIEROGLYPH R014
+132C1 ; [.395D.0020.0002.132C1] # EGYPTIAN HIEROGLYPH R015
+132C2 ; [.395E.0020.0002.132C2] # EGYPTIAN HIEROGLYPH R016
+132C3 ; [.395F.0020.0002.132C3] # EGYPTIAN HIEROGLYPH R016A
+132C4 ; [.3960.0020.0002.132C4] # EGYPTIAN HIEROGLYPH R017
+132C5 ; [.3961.0020.0002.132C5] # EGYPTIAN HIEROGLYPH R018
+132C6 ; [.3962.0020.0002.132C6] # EGYPTIAN HIEROGLYPH R019
+132C7 ; [.3963.0020.0002.132C7] # EGYPTIAN HIEROGLYPH R020
+132C8 ; [.3964.0020.0002.132C8] # EGYPTIAN HIEROGLYPH R021
+132C9 ; [.3965.0020.0002.132C9] # EGYPTIAN HIEROGLYPH R022
+132CA ; [.3966.0020.0002.132CA] # EGYPTIAN HIEROGLYPH R023
+132CB ; [.3967.0020.0002.132CB] # EGYPTIAN HIEROGLYPH R024
+132CC ; [.3968.0020.0002.132CC] # EGYPTIAN HIEROGLYPH R025
+132CD ; [.3969.0020.0002.132CD] # EGYPTIAN HIEROGLYPH R026
+132CE ; [.396A.0020.0002.132CE] # EGYPTIAN HIEROGLYPH R027
+132CF ; [.396B.0020.0002.132CF] # EGYPTIAN HIEROGLYPH R028
+132D0 ; [.396C.0020.0002.132D0] # EGYPTIAN HIEROGLYPH R029
+132D1 ; [.396D.0020.0002.132D1] # EGYPTIAN HIEROGLYPH S001
+132D2 ; [.396E.0020.0002.132D2] # EGYPTIAN HIEROGLYPH S002
+132D3 ; [.396F.0020.0002.132D3] # EGYPTIAN HIEROGLYPH S002A
+132D4 ; [.3970.0020.0002.132D4] # EGYPTIAN HIEROGLYPH S003
+132D5 ; [.3971.0020.0002.132D5] # EGYPTIAN HIEROGLYPH S004
+132D6 ; [.3972.0020.0002.132D6] # EGYPTIAN HIEROGLYPH S005
+132D7 ; [.3973.0020.0002.132D7] # EGYPTIAN HIEROGLYPH S006
+132D8 ; [.3974.0020.0002.132D8] # EGYPTIAN HIEROGLYPH S006A
+132D9 ; [.3975.0020.0002.132D9] # EGYPTIAN HIEROGLYPH S007
+132DA ; [.3976.0020.0002.132DA] # EGYPTIAN HIEROGLYPH S008
+132DB ; [.3977.0020.0002.132DB] # EGYPTIAN HIEROGLYPH S009
+132DC ; [.3978.0020.0002.132DC] # EGYPTIAN HIEROGLYPH S010
+132DD ; [.3979.0020.0002.132DD] # EGYPTIAN HIEROGLYPH S011
+132DE ; [.397A.0020.0002.132DE] # EGYPTIAN HIEROGLYPH S012
+132DF ; [.397B.0020.0002.132DF] # EGYPTIAN HIEROGLYPH S013
+132E0 ; [.397C.0020.0002.132E0] # EGYPTIAN HIEROGLYPH S014
+132E1 ; [.397D.0020.0002.132E1] # EGYPTIAN HIEROGLYPH S014A
+132E2 ; [.397E.0020.0002.132E2] # EGYPTIAN HIEROGLYPH S014B
+132E3 ; [.397F.0020.0002.132E3] # EGYPTIAN HIEROGLYPH S015
+132E4 ; [.3980.0020.0002.132E4] # EGYPTIAN HIEROGLYPH S016
+132E5 ; [.3981.0020.0002.132E5] # EGYPTIAN HIEROGLYPH S017
+132E6 ; [.3982.0020.0002.132E6] # EGYPTIAN HIEROGLYPH S017A
+132E7 ; [.3983.0020.0002.132E7] # EGYPTIAN HIEROGLYPH S018
+132E8 ; [.3984.0020.0002.132E8] # EGYPTIAN HIEROGLYPH S019
+132E9 ; [.3985.0020.0002.132E9] # EGYPTIAN HIEROGLYPH S020
+132EA ; [.3986.0020.0002.132EA] # EGYPTIAN HIEROGLYPH S021
+132EB ; [.3987.0020.0002.132EB] # EGYPTIAN HIEROGLYPH S022
+132EC ; [.3988.0020.0002.132EC] # EGYPTIAN HIEROGLYPH S023
+132ED ; [.3989.0020.0002.132ED] # EGYPTIAN HIEROGLYPH S024
+132EE ; [.398A.0020.0002.132EE] # EGYPTIAN HIEROGLYPH S025
+132EF ; [.398B.0020.0002.132EF] # EGYPTIAN HIEROGLYPH S026
+132F0 ; [.398C.0020.0002.132F0] # EGYPTIAN HIEROGLYPH S026A
+132F1 ; [.398D.0020.0002.132F1] # EGYPTIAN HIEROGLYPH S026B
+132F2 ; [.398E.0020.0002.132F2] # EGYPTIAN HIEROGLYPH S027
+132F3 ; [.398F.0020.0002.132F3] # EGYPTIAN HIEROGLYPH S028
+132F4 ; [.3990.0020.0002.132F4] # EGYPTIAN HIEROGLYPH S029
+132F5 ; [.3991.0020.0002.132F5] # EGYPTIAN HIEROGLYPH S030
+132F6 ; [.3992.0020.0002.132F6] # EGYPTIAN HIEROGLYPH S031
+132F7 ; [.3993.0020.0002.132F7] # EGYPTIAN HIEROGLYPH S032
+132F8 ; [.3994.0020.0002.132F8] # EGYPTIAN HIEROGLYPH S033
+132F9 ; [.3995.0020.0002.132F9] # EGYPTIAN HIEROGLYPH S034
+132FA ; [.3996.0020.0002.132FA] # EGYPTIAN HIEROGLYPH S035
+132FB ; [.3997.0020.0002.132FB] # EGYPTIAN HIEROGLYPH S035A
+132FC ; [.3998.0020.0002.132FC] # EGYPTIAN HIEROGLYPH S036
+132FD ; [.3999.0020.0002.132FD] # EGYPTIAN HIEROGLYPH S037
+132FE ; [.399A.0020.0002.132FE] # EGYPTIAN HIEROGLYPH S038
+132FF ; [.399B.0020.0002.132FF] # EGYPTIAN HIEROGLYPH S039
+13300 ; [.399C.0020.0002.13300] # EGYPTIAN HIEROGLYPH S040
+13301 ; [.399D.0020.0002.13301] # EGYPTIAN HIEROGLYPH S041
+13302 ; [.399E.0020.0002.13302] # EGYPTIAN HIEROGLYPH S042
+13303 ; [.399F.0020.0002.13303] # EGYPTIAN HIEROGLYPH S043
+13304 ; [.39A0.0020.0002.13304] # EGYPTIAN HIEROGLYPH S044
+13305 ; [.39A1.0020.0002.13305] # EGYPTIAN HIEROGLYPH S045
+13306 ; [.39A2.0020.0002.13306] # EGYPTIAN HIEROGLYPH S046
+13307 ; [.39A3.0020.0002.13307] # EGYPTIAN HIEROGLYPH T001
+13308 ; [.39A4.0020.0002.13308] # EGYPTIAN HIEROGLYPH T002
+13309 ; [.39A5.0020.0002.13309] # EGYPTIAN HIEROGLYPH T003
+1330A ; [.39A6.0020.0002.1330A] # EGYPTIAN HIEROGLYPH T003A
+1330B ; [.39A7.0020.0002.1330B] # EGYPTIAN HIEROGLYPH T004
+1330C ; [.39A8.0020.0002.1330C] # EGYPTIAN HIEROGLYPH T005
+1330D ; [.39A9.0020.0002.1330D] # EGYPTIAN HIEROGLYPH T006
+1330E ; [.39AA.0020.0002.1330E] # EGYPTIAN HIEROGLYPH T007
+1330F ; [.39AB.0020.0002.1330F] # EGYPTIAN HIEROGLYPH T007A
+13310 ; [.39AC.0020.0002.13310] # EGYPTIAN HIEROGLYPH T008
+13311 ; [.39AD.0020.0002.13311] # EGYPTIAN HIEROGLYPH T008A
+13312 ; [.39AE.0020.0002.13312] # EGYPTIAN HIEROGLYPH T009
+13313 ; [.39AF.0020.0002.13313] # EGYPTIAN HIEROGLYPH T009A
+13314 ; [.39B0.0020.0002.13314] # EGYPTIAN HIEROGLYPH T010
+13315 ; [.39B1.0020.0002.13315] # EGYPTIAN HIEROGLYPH T011
+13316 ; [.39B2.0020.0002.13316] # EGYPTIAN HIEROGLYPH T011A
+13317 ; [.39B3.0020.0002.13317] # EGYPTIAN HIEROGLYPH T012
+13318 ; [.39B4.0020.0002.13318] # EGYPTIAN HIEROGLYPH T013
+13319 ; [.39B5.0020.0002.13319] # EGYPTIAN HIEROGLYPH T014
+1331A ; [.39B6.0020.0002.1331A] # EGYPTIAN HIEROGLYPH T015
+1331B ; [.39B7.0020.0002.1331B] # EGYPTIAN HIEROGLYPH T016
+1331C ; [.39B8.0020.0002.1331C] # EGYPTIAN HIEROGLYPH T016A
+1331D ; [.39B9.0020.0002.1331D] # EGYPTIAN HIEROGLYPH T017
+1331E ; [.39BA.0020.0002.1331E] # EGYPTIAN HIEROGLYPH T018
+1331F ; [.39BB.0020.0002.1331F] # EGYPTIAN HIEROGLYPH T019
+13320 ; [.39BC.0020.0002.13320] # EGYPTIAN HIEROGLYPH T020
+13321 ; [.39BD.0020.0002.13321] # EGYPTIAN HIEROGLYPH T021
+13322 ; [.39BE.0020.0002.13322] # EGYPTIAN HIEROGLYPH T022
+13323 ; [.39BF.0020.0002.13323] # EGYPTIAN HIEROGLYPH T023
+13324 ; [.39C0.0020.0002.13324] # EGYPTIAN HIEROGLYPH T024
+13325 ; [.39C1.0020.0002.13325] # EGYPTIAN HIEROGLYPH T025
+13326 ; [.39C2.0020.0002.13326] # EGYPTIAN HIEROGLYPH T026
+13327 ; [.39C3.0020.0002.13327] # EGYPTIAN HIEROGLYPH T027
+13328 ; [.39C4.0020.0002.13328] # EGYPTIAN HIEROGLYPH T028
+13329 ; [.39C5.0020.0002.13329] # EGYPTIAN HIEROGLYPH T029
+1332A ; [.39C6.0020.0002.1332A] # EGYPTIAN HIEROGLYPH T030
+1332B ; [.39C7.0020.0002.1332B] # EGYPTIAN HIEROGLYPH T031
+1332C ; [.39C8.0020.0002.1332C] # EGYPTIAN HIEROGLYPH T032
+1332D ; [.39C9.0020.0002.1332D] # EGYPTIAN HIEROGLYPH T032A
+1332E ; [.39CA.0020.0002.1332E] # EGYPTIAN HIEROGLYPH T033
+1332F ; [.39CB.0020.0002.1332F] # EGYPTIAN HIEROGLYPH T033A
+13330 ; [.39CC.0020.0002.13330] # EGYPTIAN HIEROGLYPH T034
+13331 ; [.39CD.0020.0002.13331] # EGYPTIAN HIEROGLYPH T035
+13332 ; [.39CE.0020.0002.13332] # EGYPTIAN HIEROGLYPH T036
+13333 ; [.39CF.0020.0002.13333] # EGYPTIAN HIEROGLYPH U001
+13334 ; [.39D0.0020.0002.13334] # EGYPTIAN HIEROGLYPH U002
+13335 ; [.39D1.0020.0002.13335] # EGYPTIAN HIEROGLYPH U003
+13336 ; [.39D2.0020.0002.13336] # EGYPTIAN HIEROGLYPH U004
+13337 ; [.39D3.0020.0002.13337] # EGYPTIAN HIEROGLYPH U005
+13338 ; [.39D4.0020.0002.13338] # EGYPTIAN HIEROGLYPH U006
+13339 ; [.39D5.0020.0002.13339] # EGYPTIAN HIEROGLYPH U006A
+1333A ; [.39D6.0020.0002.1333A] # EGYPTIAN HIEROGLYPH U006B
+1333B ; [.39D7.0020.0002.1333B] # EGYPTIAN HIEROGLYPH U007
+1333C ; [.39D8.0020.0002.1333C] # EGYPTIAN HIEROGLYPH U008
+1333D ; [.39D9.0020.0002.1333D] # EGYPTIAN HIEROGLYPH U009
+1333E ; [.39DA.0020.0002.1333E] # EGYPTIAN HIEROGLYPH U010
+1333F ; [.39DB.0020.0002.1333F] # EGYPTIAN HIEROGLYPH U011
+13340 ; [.39DC.0020.0002.13340] # EGYPTIAN HIEROGLYPH U012
+13341 ; [.39DD.0020.0002.13341] # EGYPTIAN HIEROGLYPH U013
+13342 ; [.39DE.0020.0002.13342] # EGYPTIAN HIEROGLYPH U014
+13343 ; [.39DF.0020.0002.13343] # EGYPTIAN HIEROGLYPH U015
+13344 ; [.39E0.0020.0002.13344] # EGYPTIAN HIEROGLYPH U016
+13345 ; [.39E1.0020.0002.13345] # EGYPTIAN HIEROGLYPH U017
+13346 ; [.39E2.0020.0002.13346] # EGYPTIAN HIEROGLYPH U018
+13347 ; [.39E3.0020.0002.13347] # EGYPTIAN HIEROGLYPH U019
+13348 ; [.39E4.0020.0002.13348] # EGYPTIAN HIEROGLYPH U020
+13349 ; [.39E5.0020.0002.13349] # EGYPTIAN HIEROGLYPH U021
+1334A ; [.39E6.0020.0002.1334A] # EGYPTIAN HIEROGLYPH U022
+1334B ; [.39E7.0020.0002.1334B] # EGYPTIAN HIEROGLYPH U023
+1334C ; [.39E8.0020.0002.1334C] # EGYPTIAN HIEROGLYPH U023A
+1334D ; [.39E9.0020.0002.1334D] # EGYPTIAN HIEROGLYPH U024
+1334E ; [.39EA.0020.0002.1334E] # EGYPTIAN HIEROGLYPH U025
+1334F ; [.39EB.0020.0002.1334F] # EGYPTIAN HIEROGLYPH U026
+13350 ; [.39EC.0020.0002.13350] # EGYPTIAN HIEROGLYPH U027
+13351 ; [.39ED.0020.0002.13351] # EGYPTIAN HIEROGLYPH U028
+13352 ; [.39EE.0020.0002.13352] # EGYPTIAN HIEROGLYPH U029
+13353 ; [.39EF.0020.0002.13353] # EGYPTIAN HIEROGLYPH U029A
+13354 ; [.39F0.0020.0002.13354] # EGYPTIAN HIEROGLYPH U030
+13355 ; [.39F1.0020.0002.13355] # EGYPTIAN HIEROGLYPH U031
+13356 ; [.39F2.0020.0002.13356] # EGYPTIAN HIEROGLYPH U032
+13357 ; [.39F3.0020.0002.13357] # EGYPTIAN HIEROGLYPH U032A
+13358 ; [.39F4.0020.0002.13358] # EGYPTIAN HIEROGLYPH U033
+13359 ; [.39F5.0020.0002.13359] # EGYPTIAN HIEROGLYPH U034
+1335A ; [.39F6.0020.0002.1335A] # EGYPTIAN HIEROGLYPH U035
+1335B ; [.39F7.0020.0002.1335B] # EGYPTIAN HIEROGLYPH U036
+1335C ; [.39F8.0020.0002.1335C] # EGYPTIAN HIEROGLYPH U037
+1335D ; [.39F9.0020.0002.1335D] # EGYPTIAN HIEROGLYPH U038
+1335E ; [.39FA.0020.0002.1335E] # EGYPTIAN HIEROGLYPH U039
+1335F ; [.39FB.0020.0002.1335F] # EGYPTIAN HIEROGLYPH U040
+13360 ; [.39FC.0020.0002.13360] # EGYPTIAN HIEROGLYPH U041
+13361 ; [.39FD.0020.0002.13361] # EGYPTIAN HIEROGLYPH U042
+13362 ; [.39FE.0020.0002.13362] # EGYPTIAN HIEROGLYPH V001
+13363 ; [.39FF.0020.0002.13363] # EGYPTIAN HIEROGLYPH V001A
+13364 ; [.3A00.0020.0002.13364] # EGYPTIAN HIEROGLYPH V001B
+13365 ; [.3A01.0020.0002.13365] # EGYPTIAN HIEROGLYPH V001C
+13366 ; [.3A02.0020.0002.13366] # EGYPTIAN HIEROGLYPH V001D
+13367 ; [.3A03.0020.0002.13367] # EGYPTIAN HIEROGLYPH V001E
+13368 ; [.3A04.0020.0002.13368] # EGYPTIAN HIEROGLYPH V001F
+13369 ; [.3A05.0020.0002.13369] # EGYPTIAN HIEROGLYPH V001G
+1336A ; [.3A06.0020.0002.1336A] # EGYPTIAN HIEROGLYPH V001H
+1336B ; [.3A07.0020.0002.1336B] # EGYPTIAN HIEROGLYPH V001I
+1336C ; [.3A08.0020.0002.1336C] # EGYPTIAN HIEROGLYPH V002
+1336D ; [.3A09.0020.0002.1336D] # EGYPTIAN HIEROGLYPH V002A
+1336E ; [.3A0A.0020.0002.1336E] # EGYPTIAN HIEROGLYPH V003
+1336F ; [.3A0B.0020.0002.1336F] # EGYPTIAN HIEROGLYPH V004
+13370 ; [.3A0C.0020.0002.13370] # EGYPTIAN HIEROGLYPH V005
+13371 ; [.3A0D.0020.0002.13371] # EGYPTIAN HIEROGLYPH V006
+13372 ; [.3A0E.0020.0002.13372] # EGYPTIAN HIEROGLYPH V007
+13373 ; [.3A0F.0020.0002.13373] # EGYPTIAN HIEROGLYPH V007A
+13374 ; [.3A10.0020.0002.13374] # EGYPTIAN HIEROGLYPH V007B
+13375 ; [.3A11.0020.0002.13375] # EGYPTIAN HIEROGLYPH V008
+13376 ; [.3A12.0020.0002.13376] # EGYPTIAN HIEROGLYPH V009
+13377 ; [.3A13.0020.0002.13377] # EGYPTIAN HIEROGLYPH V010
+13378 ; [.3A14.0020.0002.13378] # EGYPTIAN HIEROGLYPH V011
+13379 ; [.3A15.0020.0002.13379] # EGYPTIAN HIEROGLYPH V011A
+1337A ; [.3A16.0020.0002.1337A] # EGYPTIAN HIEROGLYPH V011B
+1337B ; [.3A17.0020.0002.1337B] # EGYPTIAN HIEROGLYPH V011C
+1337C ; [.3A18.0020.0002.1337C] # EGYPTIAN HIEROGLYPH V012
+1337D ; [.3A19.0020.0002.1337D] # EGYPTIAN HIEROGLYPH V012A
+1337E ; [.3A1A.0020.0002.1337E] # EGYPTIAN HIEROGLYPH V012B
+1337F ; [.3A1B.0020.0002.1337F] # EGYPTIAN HIEROGLYPH V013
+13380 ; [.3A1C.0020.0002.13380] # EGYPTIAN HIEROGLYPH V014
+13381 ; [.3A1D.0020.0002.13381] # EGYPTIAN HIEROGLYPH V015
+13382 ; [.3A1E.0020.0002.13382] # EGYPTIAN HIEROGLYPH V016
+13383 ; [.3A1F.0020.0002.13383] # EGYPTIAN HIEROGLYPH V017
+13384 ; [.3A20.0020.0002.13384] # EGYPTIAN HIEROGLYPH V018
+13385 ; [.3A21.0020.0002.13385] # EGYPTIAN HIEROGLYPH V019
+13386 ; [.3A22.0020.0002.13386] # EGYPTIAN HIEROGLYPH V020
+13387 ; [.3A23.0020.0002.13387] # EGYPTIAN HIEROGLYPH V020A
+13388 ; [.3A24.0020.0002.13388] # EGYPTIAN HIEROGLYPH V020B
+13389 ; [.3A25.0020.0002.13389] # EGYPTIAN HIEROGLYPH V020C
+1338A ; [.3A26.0020.0002.1338A] # EGYPTIAN HIEROGLYPH V020D
+1338B ; [.3A27.0020.0002.1338B] # EGYPTIAN HIEROGLYPH V020E
+1338C ; [.3A28.0020.0002.1338C] # EGYPTIAN HIEROGLYPH V020F
+1338D ; [.3A29.0020.0002.1338D] # EGYPTIAN HIEROGLYPH V020G
+1338E ; [.3A2A.0020.0002.1338E] # EGYPTIAN HIEROGLYPH V020H
+1338F ; [.3A2B.0020.0002.1338F] # EGYPTIAN HIEROGLYPH V020I
+13390 ; [.3A2C.0020.0002.13390] # EGYPTIAN HIEROGLYPH V020J
+13391 ; [.3A2D.0020.0002.13391] # EGYPTIAN HIEROGLYPH V020K
+13392 ; [.3A2E.0020.0002.13392] # EGYPTIAN HIEROGLYPH V020L
+13393 ; [.3A2F.0020.0002.13393] # EGYPTIAN HIEROGLYPH V021
+13394 ; [.3A30.0020.0002.13394] # EGYPTIAN HIEROGLYPH V022
+13395 ; [.3A31.0020.0002.13395] # EGYPTIAN HIEROGLYPH V023
+13396 ; [.3A32.0020.0002.13396] # EGYPTIAN HIEROGLYPH V023A
+13397 ; [.3A33.0020.0002.13397] # EGYPTIAN HIEROGLYPH V024
+13398 ; [.3A34.0020.0002.13398] # EGYPTIAN HIEROGLYPH V025
+13399 ; [.3A35.0020.0002.13399] # EGYPTIAN HIEROGLYPH V026
+1339A ; [.3A36.0020.0002.1339A] # EGYPTIAN HIEROGLYPH V027
+1339B ; [.3A37.0020.0002.1339B] # EGYPTIAN HIEROGLYPH V028
+1339C ; [.3A38.0020.0002.1339C] # EGYPTIAN HIEROGLYPH V028A
+1339D ; [.3A39.0020.0002.1339D] # EGYPTIAN HIEROGLYPH V029
+1339E ; [.3A3A.0020.0002.1339E] # EGYPTIAN HIEROGLYPH V029A
+1339F ; [.3A3B.0020.0002.1339F] # EGYPTIAN HIEROGLYPH V030
+133A0 ; [.3A3C.0020.0002.133A0] # EGYPTIAN HIEROGLYPH V030A
+133A1 ; [.3A3D.0020.0002.133A1] # EGYPTIAN HIEROGLYPH V031
+133A2 ; [.3A3E.0020.0002.133A2] # EGYPTIAN HIEROGLYPH V031A
+133A3 ; [.3A3F.0020.0002.133A3] # EGYPTIAN HIEROGLYPH V032
+133A4 ; [.3A40.0020.0002.133A4] # EGYPTIAN HIEROGLYPH V033
+133A5 ; [.3A41.0020.0002.133A5] # EGYPTIAN HIEROGLYPH V033A
+133A6 ; [.3A42.0020.0002.133A6] # EGYPTIAN HIEROGLYPH V034
+133A7 ; [.3A43.0020.0002.133A7] # EGYPTIAN HIEROGLYPH V035
+133A8 ; [.3A44.0020.0002.133A8] # EGYPTIAN HIEROGLYPH V036
+133A9 ; [.3A45.0020.0002.133A9] # EGYPTIAN HIEROGLYPH V037
+133AA ; [.3A46.0020.0002.133AA] # EGYPTIAN HIEROGLYPH V037A
+133AB ; [.3A47.0020.0002.133AB] # EGYPTIAN HIEROGLYPH V038
+133AC ; [.3A48.0020.0002.133AC] # EGYPTIAN HIEROGLYPH V039
+133AD ; [.3A49.0020.0002.133AD] # EGYPTIAN HIEROGLYPH V040
+133AE ; [.3A4A.0020.0002.133AE] # EGYPTIAN HIEROGLYPH V040A
+133AF ; [.3A4B.0020.0002.133AF] # EGYPTIAN HIEROGLYPH W001
+133B0 ; [.3A4C.0020.0002.133B0] # EGYPTIAN HIEROGLYPH W002
+133B1 ; [.3A4D.0020.0002.133B1] # EGYPTIAN HIEROGLYPH W003
+133B2 ; [.3A4E.0020.0002.133B2] # EGYPTIAN HIEROGLYPH W003A
+133B3 ; [.3A4F.0020.0002.133B3] # EGYPTIAN HIEROGLYPH W004
+133B4 ; [.3A50.0020.0002.133B4] # EGYPTIAN HIEROGLYPH W005
+133B5 ; [.3A51.0020.0002.133B5] # EGYPTIAN HIEROGLYPH W006
+133B6 ; [.3A52.0020.0002.133B6] # EGYPTIAN HIEROGLYPH W007
+133B7 ; [.3A53.0020.0002.133B7] # EGYPTIAN HIEROGLYPH W008
+133B8 ; [.3A54.0020.0002.133B8] # EGYPTIAN HIEROGLYPH W009
+133B9 ; [.3A55.0020.0002.133B9] # EGYPTIAN HIEROGLYPH W009A
+133BA ; [.3A56.0020.0002.133BA] # EGYPTIAN HIEROGLYPH W010
+133BB ; [.3A57.0020.0002.133BB] # EGYPTIAN HIEROGLYPH W010A
+133BC ; [.3A58.0020.0002.133BC] # EGYPTIAN HIEROGLYPH W011
+133BD ; [.3A59.0020.0002.133BD] # EGYPTIAN HIEROGLYPH W012
+133BE ; [.3A5A.0020.0002.133BE] # EGYPTIAN HIEROGLYPH W013
+133BF ; [.3A5B.0020.0002.133BF] # EGYPTIAN HIEROGLYPH W014
+133C0 ; [.3A5C.0020.0002.133C0] # EGYPTIAN HIEROGLYPH W014A
+133C1 ; [.3A5D.0020.0002.133C1] # EGYPTIAN HIEROGLYPH W015
+133C2 ; [.3A5E.0020.0002.133C2] # EGYPTIAN HIEROGLYPH W016
+133C3 ; [.3A5F.0020.0002.133C3] # EGYPTIAN HIEROGLYPH W017
+133C4 ; [.3A60.0020.0002.133C4] # EGYPTIAN HIEROGLYPH W017A
+133C5 ; [.3A61.0020.0002.133C5] # EGYPTIAN HIEROGLYPH W018
+133C6 ; [.3A62.0020.0002.133C6] # EGYPTIAN HIEROGLYPH W018A
+133C7 ; [.3A63.0020.0002.133C7] # EGYPTIAN HIEROGLYPH W019
+133C8 ; [.3A64.0020.0002.133C8] # EGYPTIAN HIEROGLYPH W020
+133C9 ; [.3A65.0020.0002.133C9] # EGYPTIAN HIEROGLYPH W021
+133CA ; [.3A66.0020.0002.133CA] # EGYPTIAN HIEROGLYPH W022
+133CB ; [.3A67.0020.0002.133CB] # EGYPTIAN HIEROGLYPH W023
+133CC ; [.3A68.0020.0002.133CC] # EGYPTIAN HIEROGLYPH W024
+133CD ; [.3A69.0020.0002.133CD] # EGYPTIAN HIEROGLYPH W024A
+133CE ; [.3A6A.0020.0002.133CE] # EGYPTIAN HIEROGLYPH W025
+133CF ; [.3A6B.0020.0002.133CF] # EGYPTIAN HIEROGLYPH X001
+133D0 ; [.3A6C.0020.0002.133D0] # EGYPTIAN HIEROGLYPH X002
+133D1 ; [.3A6D.0020.0002.133D1] # EGYPTIAN HIEROGLYPH X003
+133D2 ; [.3A6E.0020.0002.133D2] # EGYPTIAN HIEROGLYPH X004
+133D3 ; [.3A6F.0020.0002.133D3] # EGYPTIAN HIEROGLYPH X004A
+133D4 ; [.3A70.0020.0002.133D4] # EGYPTIAN HIEROGLYPH X004B
+133D5 ; [.3A71.0020.0002.133D5] # EGYPTIAN HIEROGLYPH X005
+133D6 ; [.3A72.0020.0002.133D6] # EGYPTIAN HIEROGLYPH X006
+133D7 ; [.3A73.0020.0002.133D7] # EGYPTIAN HIEROGLYPH X006A
+133D8 ; [.3A74.0020.0002.133D8] # EGYPTIAN HIEROGLYPH X007
+133D9 ; [.3A75.0020.0002.133D9] # EGYPTIAN HIEROGLYPH X008
+133DA ; [.3A76.0020.0002.133DA] # EGYPTIAN HIEROGLYPH X008A
+133DB ; [.3A77.0020.0002.133DB] # EGYPTIAN HIEROGLYPH Y001
+133DC ; [.3A78.0020.0002.133DC] # EGYPTIAN HIEROGLYPH Y001A
+133DD ; [.3A79.0020.0002.133DD] # EGYPTIAN HIEROGLYPH Y002
+133DE ; [.3A7A.0020.0002.133DE] # EGYPTIAN HIEROGLYPH Y003
+133DF ; [.3A7B.0020.0002.133DF] # EGYPTIAN HIEROGLYPH Y004
+133E0 ; [.3A7C.0020.0002.133E0] # EGYPTIAN HIEROGLYPH Y005
+133E1 ; [.3A7D.0020.0002.133E1] # EGYPTIAN HIEROGLYPH Y006
+133E2 ; [.3A7E.0020.0002.133E2] # EGYPTIAN HIEROGLYPH Y007
+133E3 ; [.3A7F.0020.0002.133E3] # EGYPTIAN HIEROGLYPH Y008
+133E4 ; [.3A80.0020.0002.133E4] # EGYPTIAN HIEROGLYPH Z001
+133E5 ; [.3A81.0020.0002.133E5] # EGYPTIAN HIEROGLYPH Z002
+133E6 ; [.3A82.0020.0002.133E6] # EGYPTIAN HIEROGLYPH Z002A
+133E7 ; [.3A83.0020.0002.133E7] # EGYPTIAN HIEROGLYPH Z002B
+133E8 ; [.3A84.0020.0002.133E8] # EGYPTIAN HIEROGLYPH Z002C
+133E9 ; [.3A85.0020.0002.133E9] # EGYPTIAN HIEROGLYPH Z002D
+133EA ; [.3A86.0020.0002.133EA] # EGYPTIAN HIEROGLYPH Z003
+133EB ; [.3A87.0020.0002.133EB] # EGYPTIAN HIEROGLYPH Z003A
+133EC ; [.3A88.0020.0002.133EC] # EGYPTIAN HIEROGLYPH Z003B
+133ED ; [.3A89.0020.0002.133ED] # EGYPTIAN HIEROGLYPH Z004
+133EE ; [.3A8A.0020.0002.133EE] # EGYPTIAN HIEROGLYPH Z004A
+133EF ; [.3A8B.0020.0002.133EF] # EGYPTIAN HIEROGLYPH Z005
+133F0 ; [.3A8C.0020.0002.133F0] # EGYPTIAN HIEROGLYPH Z005A
+133F1 ; [.3A8D.0020.0002.133F1] # EGYPTIAN HIEROGLYPH Z006
+133F2 ; [.3A8E.0020.0002.133F2] # EGYPTIAN HIEROGLYPH Z007
+133F3 ; [.3A8F.0020.0002.133F3] # EGYPTIAN HIEROGLYPH Z008
+133F4 ; [.3A90.0020.0002.133F4] # EGYPTIAN HIEROGLYPH Z009
+133F5 ; [.3A91.0020.0002.133F5] # EGYPTIAN HIEROGLYPH Z010
+133F6 ; [.3A92.0020.0002.133F6] # EGYPTIAN HIEROGLYPH Z011
+133F7 ; [.3A93.0020.0002.133F7] # EGYPTIAN HIEROGLYPH Z012
+133F8 ; [.3A94.0020.0002.133F8] # EGYPTIAN HIEROGLYPH Z013
+133F9 ; [.3A95.0020.0002.133F9] # EGYPTIAN HIEROGLYPH Z014
+133FA ; [.3A96.0020.0002.133FA] # EGYPTIAN HIEROGLYPH Z015
+133FB ; [.3A97.0020.0002.133FB] # EGYPTIAN HIEROGLYPH Z015A
+133FC ; [.3A98.0020.0002.133FC] # EGYPTIAN HIEROGLYPH Z015B
+133FD ; [.3A99.0020.0002.133FD] # EGYPTIAN HIEROGLYPH Z015C
+133FE ; [.3A9A.0020.0002.133FE] # EGYPTIAN HIEROGLYPH Z015D
+133FF ; [.3A9B.0020.0002.133FF] # EGYPTIAN HIEROGLYPH Z015E
+13400 ; [.3A9C.0020.0002.13400] # EGYPTIAN HIEROGLYPH Z015F
+13401 ; [.3A9D.0020.0002.13401] # EGYPTIAN HIEROGLYPH Z015G
+13402 ; [.3A9E.0020.0002.13402] # EGYPTIAN HIEROGLYPH Z015H
+13403 ; [.3A9F.0020.0002.13403] # EGYPTIAN HIEROGLYPH Z015I
+13404 ; [.3AA0.0020.0002.13404] # EGYPTIAN HIEROGLYPH Z016
+13405 ; [.3AA1.0020.0002.13405] # EGYPTIAN HIEROGLYPH Z016A
+13406 ; [.3AA2.0020.0002.13406] # EGYPTIAN HIEROGLYPH Z016B
+13407 ; [.3AA3.0020.0002.13407] # EGYPTIAN HIEROGLYPH Z016C
+13408 ; [.3AA4.0020.0002.13408] # EGYPTIAN HIEROGLYPH Z016D
+13409 ; [.3AA5.0020.0002.13409] # EGYPTIAN HIEROGLYPH Z016E
+1340A ; [.3AA6.0020.0002.1340A] # EGYPTIAN HIEROGLYPH Z016F
+1340B ; [.3AA7.0020.0002.1340B] # EGYPTIAN HIEROGLYPH Z016G
+1340C ; [.3AA8.0020.0002.1340C] # EGYPTIAN HIEROGLYPH Z016H
+1340D ; [.3AA9.0020.0002.1340D] # EGYPTIAN HIEROGLYPH AA001
+1340E ; [.3AAA.0020.0002.1340E] # EGYPTIAN HIEROGLYPH AA002
+1340F ; [.3AAB.0020.0002.1340F] # EGYPTIAN HIEROGLYPH AA003
+13410 ; [.3AAC.0020.0002.13410] # EGYPTIAN HIEROGLYPH AA004
+13411 ; [.3AAD.0020.0002.13411] # EGYPTIAN HIEROGLYPH AA005
+13412 ; [.3AAE.0020.0002.13412] # EGYPTIAN HIEROGLYPH AA006
+13413 ; [.3AAF.0020.0002.13413] # EGYPTIAN HIEROGLYPH AA007
+13414 ; [.3AB0.0020.0002.13414] # EGYPTIAN HIEROGLYPH AA007A
+13415 ; [.3AB1.0020.0002.13415] # EGYPTIAN HIEROGLYPH AA007B
+13416 ; [.3AB2.0020.0002.13416] # EGYPTIAN HIEROGLYPH AA008
+13417 ; [.3AB3.0020.0002.13417] # EGYPTIAN HIEROGLYPH AA009
+13418 ; [.3AB4.0020.0002.13418] # EGYPTIAN HIEROGLYPH AA010
+13419 ; [.3AB5.0020.0002.13419] # EGYPTIAN HIEROGLYPH AA011
+1341A ; [.3AB6.0020.0002.1341A] # EGYPTIAN HIEROGLYPH AA012
+1341B ; [.3AB7.0020.0002.1341B] # EGYPTIAN HIEROGLYPH AA013
+1341C ; [.3AB8.0020.0002.1341C] # EGYPTIAN HIEROGLYPH AA014
+1341D ; [.3AB9.0020.0002.1341D] # EGYPTIAN HIEROGLYPH AA015
+1341E ; [.3ABA.0020.0002.1341E] # EGYPTIAN HIEROGLYPH AA016
+1341F ; [.3ABB.0020.0002.1341F] # EGYPTIAN HIEROGLYPH AA017
+13420 ; [.3ABC.0020.0002.13420] # EGYPTIAN HIEROGLYPH AA018
+13421 ; [.3ABD.0020.0002.13421] # EGYPTIAN HIEROGLYPH AA019
+13422 ; [.3ABE.0020.0002.13422] # EGYPTIAN HIEROGLYPH AA020
+13423 ; [.3ABF.0020.0002.13423] # EGYPTIAN HIEROGLYPH AA021
+13424 ; [.3AC0.0020.0002.13424] # EGYPTIAN HIEROGLYPH AA022
+13425 ; [.3AC1.0020.0002.13425] # EGYPTIAN HIEROGLYPH AA023
+13426 ; [.3AC2.0020.0002.13426] # EGYPTIAN HIEROGLYPH AA024
+13427 ; [.3AC3.0020.0002.13427] # EGYPTIAN HIEROGLYPH AA025
+13428 ; [.3AC4.0020.0002.13428] # EGYPTIAN HIEROGLYPH AA026
+13429 ; [.3AC5.0020.0002.13429] # EGYPTIAN HIEROGLYPH AA027
+1342A ; [.3AC6.0020.0002.1342A] # EGYPTIAN HIEROGLYPH AA028
+1342B ; [.3AC7.0020.0002.1342B] # EGYPTIAN HIEROGLYPH AA029
+1342C ; [.3AC8.0020.0002.1342C] # EGYPTIAN HIEROGLYPH AA030
+1342D ; [.3AC9.0020.0002.1342D] # EGYPTIAN HIEROGLYPH AA031
+1342E ; [.3ACA.0020.0002.1342E] # EGYPTIAN HIEROGLYPH AA032
+2F00 ; [.FB40.0020.0004.4E00][.CE00.0000.0000.4E00] # KANGXI RADICAL ONE; QQK
+3220 ; [*02FF.0020.0004.3220][.FB40.0020.0004.4E00][.CE00.0000.0000.4E00][*0300.0020.001F.3220] # PARENTHESIZED IDEOGRAPH ONE; QQKN
+3280 ; [.FB40.0020.0006.4E00][.CE00.0000.0000.4E00] # CIRCLED IDEOGRAPH ONE; QQK
+3192 ; [.FB40.0020.0014.4E00][.CE00.0000.0000.4E00] # IDEOGRAPHIC ANNOTATION ONE MARK; QQK
+1F229 ; [.FB40.0020.001C.4E00][.CE00.0000.0000.4E00] # SQUARED CJK UNIFIED IDEOGRAPH-4E00; QQK
+319C ; [.FB40.0020.0014.4E01][.CE01.0000.0000.4E01] # IDEOGRAPHIC ANNOTATION FOURTH MARK; QQK
+3226 ; [*02FF.0020.0004.3226][.FB40.0020.0004.4E03][.CE03.0000.0000.4E03][*0300.0020.001F.3226] # PARENTHESIZED IDEOGRAPH SEVEN; QQKN
+3286 ; [.FB40.0020.0006.4E03][.CE03.0000.0000.4E03] # CIRCLED IDEOGRAPH SEVEN; QQK
+3222 ; [*02FF.0020.0004.3222][.FB40.0020.0004.4E09][.CE09.0000.0000.4E09][*0300.0020.001F.3222] # PARENTHESIZED IDEOGRAPH THREE; QQKN
+1F241 ; [*0347.0020.0004.1F241][.FB40.0020.0004.4E09][.CE09.0000.0000.4E09][*0348.0020.001F.1F241] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09; QQKN
+3282 ; [.FB40.0020.0006.4E09][.CE09.0000.0000.4E09] # CIRCLED IDEOGRAPH THREE; QQK
+3194 ; [.FB40.0020.0014.4E09][.CE09.0000.0000.4E09] # IDEOGRAPHIC ANNOTATION THREE MARK; QQK
+1F22A ; [.FB40.0020.001C.4E09][.CE09.0000.0000.4E09] # SQUARED CJK UNIFIED IDEOGRAPH-4E09; QQK
+32A4 ; [.FB40.0020.0006.4E0A][.CE0A.0000.0000.4E0A] # CIRCLED IDEOGRAPH HIGH; QQK
+3196 ; [.FB40.0020.0014.4E0A][.CE0A.0000.0000.4E0A] # IDEOGRAPHIC ANNOTATION TOP MARK; QQK
+32A6 ; [.FB40.0020.0006.4E0B][.CE0B.0000.0000.4E0B] # CIRCLED IDEOGRAPH LOW; QQK
+3198 ; [.FB40.0020.0014.4E0B][.CE0B.0000.0000.4E0B] # IDEOGRAPHIC ANNOTATION BOTTOM MARK; QQK
+F967 ; [.FB40.0020.0002.4E0D][.CE0D.0000.0000.4E0D] # CJK COMPATIBILITY IDEOGRAPH-F967; QQC
+319B ; [.FB40.0020.0014.4E19][.CE19.0000.0000.4E19] # IDEOGRAPHIC ANNOTATION THIRD MARK; QQK
+FA70 ; [.FB40.0020.0002.4E26][.CE26.0000.0000.4E26] # CJK COMPATIBILITY IDEOGRAPH-FA70; QQC
+2F01 ; [.FB40.0020.0004.4E28][.CE28.0000.0000.4E28] # KANGXI RADICAL LINE; QQK
+2EA6 ; [.FB40.0020.0004.4E2C][.CE2C.0000.0000.4E2C] # CJK RADICAL SIMPLIFIED HALF TREE TRUNK; QQK
+32A5 ; [.FB40.0020.0006.4E2D][.CE2D.0000.0000.4E2D] # CIRCLED IDEOGRAPH CENTRE; QQK
+3197 ; [.FB40.0020.0014.4E2D][.CE2D.0000.0000.4E2D] # IDEOGRAPHIC ANNOTATION MIDDLE MARK; QQK
+1F22D ; [.FB40.0020.001C.4E2D][.CE2D.0000.0000.4E2D] # SQUARED CJK UNIFIED IDEOGRAPH-4E2D; QQK
+F905 ; [.FB40.0020.0002.4E32][.CE32.0000.0000.4E32] # CJK COMPATIBILITY IDEOGRAPH-F905; QQC
+2F02 ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36] # KANGXI RADICAL DOT; QQK
+2E80 ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36][.0000.0159.001F.2E80] # CJK RADICAL REPEAT; QQKN
+2F801 ; [.FB40.0020.0002.4E38][.CE38.0000.0000.4E38] # CJK COMPATIBILITY IDEOGRAPH-2F801; QQC
+F95E ; [.FB40.0020.0002.4E39][.CE39.0000.0000.4E39] # CJK COMPATIBILITY IDEOGRAPH-F95E; QQC
+2F800 ; [.FB40.0020.0002.4E3D][.CE3D.0000.0000.4E3D] # CJK COMPATIBILITY IDEOGRAPH-2F800; QQC
+2F03 ; [.FB40.0020.0004.4E3F][.CE3F.0000.0000.4E3F] # KANGXI RADICAL SLASH; QQK
+2F802 ; [.FB40.0020.0002.4E41][.CE41.0000.0000.4E41] # CJK COMPATIBILITY IDEOGRAPH-2F802; QQC
+2F04 ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59] # KANGXI RADICAL SECOND; QQK
+319A ; [.FB40.0020.0014.4E59][.CE59.0000.0000.4E59] # IDEOGRAPHIC ANNOTATION SECOND MARK; QQK
+2E84 ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59][.0000.0159.001F.2E84] # CJK RADICAL SECOND THREE; QQKN
+2E83 ; [.FB40.0020.0004.4E5A][.CE5A.0000.0000.4E5A] # CJK RADICAL SECOND TWO; QQK
+2E82 ; [.FB40.0020.0004.4E5B][.CE5B.0000.0000.4E5B] # CJK RADICAL SECOND ONE; QQK
+3228 ; [*02FF.0020.0004.3228][.FB40.0020.0004.4E5D][.CE5D.0000.0000.4E5D][*0300.0020.001F.3228] # PARENTHESIZED IDEOGRAPH NINE; QQKN
+3288 ; [.FB40.0020.0006.4E5D][.CE5D.0000.0000.4E5D] # CIRCLED IDEOGRAPH NINE; QQK
+F91B ; [.FB40.0020.0002.4E82][.CE82.0000.0000.4E82] # CJK COMPATIBILITY IDEOGRAPH-F91B; QQC
+2F05 ; [.FB40.0020.0004.4E85][.CE85.0000.0000.4E85] # KANGXI RADICAL HOOK; QQK
+F9BA ; [.FB40.0020.0002.4E86][.CE86.0000.0000.4E86] # CJK COMPATIBILITY IDEOGRAPH-F9BA; QQC
+2F06 ; [.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C] # KANGXI RADICAL TWO; QQK
+3221 ; [*02FF.0020.0004.3221][.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C][*0300.0020.001F.3221] # PARENTHESIZED IDEOGRAPH TWO; QQKN
+1F242 ; [*0347.0020.0004.1F242][.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C][*0348.0020.001F.1F242] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C; QQKN
+3281 ; [.FB40.0020.0006.4E8C][.CE8C.0000.0000.4E8C] # CIRCLED IDEOGRAPH TWO; QQK
+3193 ; [.FB40.0020.0014.4E8C][.CE8C.0000.0000.4E8C] # IDEOGRAPHIC ANNOTATION TWO MARK; QQK
+1F214 ; [.FB40.0020.001C.4E8C][.CE8C.0000.0000.4E8C] # SQUARED CJK UNIFIED IDEOGRAPH-4E8C; QQK
+3224 ; [*02FF.0020.0004.3224][.FB40.0020.0004.4E94][.CE94.0000.0000.4E94][*0300.0020.001F.3224] # PARENTHESIZED IDEOGRAPH FIVE; QQKN
+3284 ; [.FB40.0020.0006.4E94][.CE94.0000.0000.4E94] # CIRCLED IDEOGRAPH FIVE; QQK
+2F07 ; [.FB40.0020.0004.4EA0][.CEA0.0000.0000.4EA0] # KANGXI RADICAL LID; QQK
+1F218 ; [.FB40.0020.001C.4EA4][.CEA4.0000.0000.4EA4] # SQUARED CJK UNIFIED IDEOGRAPH-4EA4; QQK
+F977 ; [.FB40.0020.0002.4EAE][.CEAE.0000.0000.4EAE] # CJK COMPATIBILITY IDEOGRAPH-F977; QQC
+2F08 ; [.FB40.0020.0004.4EBA][.CEBA.0000.0000.4EBA] # KANGXI RADICAL MAN; QQK
+319F ; [.FB40.0020.0014.4EBA][.CEBA.0000.0000.4EBA] # IDEOGRAPHIC ANNOTATION MAN MARK; QQK
+2E85 ; [.FB40.0020.0004.4EBB][.CEBB.0000.0000.4EBB] # CJK RADICAL PERSON; QQK
+F9FD ; [.FB40.0020.0002.4EC0][.CEC0.0000.0000.4EC0] # CJK COMPATIBILITY IDEOGRAPH-F9FD; QQC
+2F819 ; [.FB40.0020.0002.4ECC][.CECC.0000.0000.4ECC] # CJK COMPATIBILITY IDEOGRAPH-2F819; QQC
+3239 ; [*02FF.0020.0004.3239][.FB40.0020.0004.4EE3][.CEE3.0000.0000.4EE3][*0300.0020.001F.3239] # PARENTHESIZED IDEOGRAPH REPRESENT; QQKN
+F9A8 ; [.FB40.0020.0002.4EE4][.CEE4.0000.0000.4EE4] # CJK COMPATIBILITY IDEOGRAPH-F9A8; QQC
+323D ; [*02FF.0020.0004.323D][.FB40.0020.0004.4F01][.CF01.0000.0000.4F01][*0300.0020.001F.323D] # PARENTHESIZED IDEOGRAPH ENTERPRISE; QQKN
+32AD ; [.FB40.0020.0006.4F01][.CF01.0000.0000.4F01] # CIRCLED IDEOGRAPH ENTERPRISE; QQK
+3241 ; [*02FF.0020.0004.3241][.FB40.0020.0004.4F11][.CF11.0000.0000.4F11][*0300.0020.001F.3241] # PARENTHESIZED IDEOGRAPH REST; QQKN
+32A1 ; [.FB40.0020.0006.4F11][.CF11.0000.0000.4F11] # CIRCLED IDEOGRAPH REST; QQK
+2F804 ; [.FB40.0020.0002.4F60][.CF60.0000.0000.4F60] # CJK COMPATIBILITY IDEOGRAPH-2F804; QQC
+FA73 ; [.FB40.0020.0002.4F80][.CF80.0000.0000.4F80] # CJK COMPATIBILITY IDEOGRAPH-FA73; QQC
+F92D ; [.FB40.0020.0002.4F86][.CF86.0000.0000.4F86] # CJK COMPATIBILITY IDEOGRAPH-F92D; QQC
+F9B5 ; [.FB40.0020.0002.4F8B][.CF8B.0000.0000.4F8B] # CJK COMPATIBILITY IDEOGRAPH-F9B5; QQC
+FA30 ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-FA30; QQC
+2F805 ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-2F805; QQC
+2F806 ; [.FB40.0020.0002.4FBB][.CFBB.0000.0000.4FBB] # CJK COMPATIBILITY IDEOGRAPH-2F806; QQC
+F965 ; [.FB40.0020.0002.4FBF][.CFBF.0000.0000.4FBF] # CJK COMPATIBILITY IDEOGRAPH-F965; QQC
+2F807 ; [.FB40.0020.0002.5002][.D002.0000.0000.5002] # CJK COMPATIBILITY IDEOGRAPH-2F807; QQC
+F9D4 ; [.FB40.0020.0002.502B][.D02B.0000.0000.502B] # CJK COMPATIBILITY IDEOGRAPH-F9D4; QQC
+2F808 ; [.FB40.0020.0002.507A][.D07A.0000.0000.507A] # CJK COMPATIBILITY IDEOGRAPH-2F808; QQC
+2F809 ; [.FB40.0020.0002.5099][.D099.0000.0000.5099] # CJK COMPATIBILITY IDEOGRAPH-2F809; QQC
+2F80B ; [.FB40.0020.0002.50CF][.D0CF.0000.0000.50CF] # CJK COMPATIBILITY IDEOGRAPH-2F80B; QQC
+F9BB ; [.FB40.0020.0002.50DA][.D0DA.0000.0000.50DA] # CJK COMPATIBILITY IDEOGRAPH-F9BB; QQC
+FA31 ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-FA31; QQC
+2F80A ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-2F80A; QQC
+329D ; [.FB40.0020.0006.512A][.D12A.0000.0000.512A] # CIRCLED IDEOGRAPH EXCELLENT; QQK
+2F09 ; [.FB40.0020.0004.513F][.D13F.0000.0000.513F] # KANGXI RADICAL LEGS; QQK
+FA0C ; [.FB40.0020.0002.5140][.D140.0000.0000.5140] # CJK COMPATIBILITY IDEOGRAPH-FA0C; QQC
+FA74 ; [.FB40.0020.0002.5145][.D145.0000.0000.5145] # CJK COMPATIBILITY IDEOGRAPH-FA74; QQC
+FA32 ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-FA32; QQC
+2F80E ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-2F80E; QQC
+2F80F ; [.FB40.0020.0002.5154][.D154.0000.0000.5154] # CJK COMPATIBILITY IDEOGRAPH-2F80F; QQC
+2F810 ; [.FB40.0020.0002.5164][.D164.0000.0000.5164] # CJK COMPATIBILITY IDEOGRAPH-2F810; QQC
+2F0A ; [.FB40.0020.0004.5165][.D165.0000.0000.5165] # KANGXI RADICAL ENTER; QQK
+2F814 ; [.FB40.0020.0002.5167][.D167.0000.0000.5167] # CJK COMPATIBILITY IDEOGRAPH-2F814; QQC
+FA72 ; [.FB40.0020.0002.5168][.D168.0000.0000.5168] # CJK COMPATIBILITY IDEOGRAPH-FA72; QQC
+F978 ; [.FB40.0020.0002.5169][.D169.0000.0000.5169] # CJK COMPATIBILITY IDEOGRAPH-F978; QQC
+2F0B ; [.FB40.0020.0004.516B][.D16B.0000.0000.516B] # KANGXI RADICAL EIGHT; QQK
+3227 ; [*02FF.0020.0004.3227][.FB40.0020.0004.516B][.D16B.0000.0000.516B][*0300.0020.001F.3227] # PARENTHESIZED IDEOGRAPH EIGHT; QQKN
+3287 ; [.FB40.0020.0006.516B][.D16B.0000.0000.516B] # CIRCLED IDEOGRAPH EIGHT; QQK
+F9D1 ; [.FB40.0020.0002.516D][.D16D.0000.0000.516D] # CJK COMPATIBILITY IDEOGRAPH-F9D1; QQC
+3225 ; [*02FF.0020.0004.3225][.FB40.0020.0004.516D][.D16D.0000.0000.516D][*0300.0020.001F.3225] # PARENTHESIZED IDEOGRAPH SIX; QQKN
+3285 ; [.FB40.0020.0006.516D][.D16D.0000.0000.516D] # CIRCLED IDEOGRAPH SIX; QQK
+2F811 ; [.FB40.0020.0002.5177][.D177.0000.0000.5177] # CJK COMPATIBILITY IDEOGRAPH-2F811; QQC
+FA75 ; [.FB40.0020.0002.5180][.D180.0000.0000.5180] # CJK COMPATIBILITY IDEOGRAPH-FA75; QQC
+2F0C ; [.FB40.0020.0004.5182][.D182.0000.0000.5182] # KANGXI RADICAL DOWN BOX; QQK
+2E86 ; [.FB40.0020.0004.5182][.D182.0000.0000.5182][.0000.0159.001F.2E86] # CJK RADICAL BOX; QQKN
+2F815 ; [.FB40.0020.0002.518D][.D18D.0000.0000.518D] # CJK COMPATIBILITY IDEOGRAPH-2F815; QQC
+1F21E ; [.FB40.0020.001C.518D][.D18D.0000.0000.518D] # SQUARED CJK UNIFIED IDEOGRAPH-518D; QQK
+2F8D2 ; [.FB40.0020.0002.5192][.D192.0000.0000.5192] # CJK COMPATIBILITY IDEOGRAPH-2F8D2; QQC
+2F8D3 ; [.FB40.0020.0002.5195][.D195.0000.0000.5195] # CJK COMPATIBILITY IDEOGRAPH-2F8D3; QQC
+2F0D ; [.FB40.0020.0004.5196][.D196.0000.0000.5196] # KANGXI RADICAL COVER; QQK
+2F817 ; [.FB40.0020.0002.5197][.D197.0000.0000.5197] # CJK COMPATIBILITY IDEOGRAPH-2F817; QQC
+32A2 ; [.FB40.0020.0006.5199][.D199.0000.0000.5199] # CIRCLED IDEOGRAPH COPY; QQK
+2F818 ; [.FB40.0020.0002.51A4][.D1A4.0000.0000.51A4] # CJK COMPATIBILITY IDEOGRAPH-2F818; QQC
+2F0E ; [.FB40.0020.0004.51AB][.D1AB.0000.0000.51AB] # KANGXI RADICAL ICE; QQK
+2F81A ; [.FB40.0020.0002.51AC][.D1AC.0000.0000.51AC] # CJK COMPATIBILITY IDEOGRAPH-2F81A; QQC
+FA71 ; [.FB40.0020.0002.51B5][.D1B5.0000.0000.51B5] # CJK COMPATIBILITY IDEOGRAPH-FA71; QQC
+2F81B ; [.FB40.0020.0002.51B5][.D1B5.0000.0000.51B5] # CJK COMPATIBILITY IDEOGRAPH-2F81B; QQC
+F92E ; [.FB40.0020.0002.51B7][.D1B7.0000.0000.51B7] # CJK COMPATIBILITY IDEOGRAPH-F92E; QQC
+F979 ; [.FB40.0020.0002.51C9][.D1C9.0000.0000.51C9] # CJK COMPATIBILITY IDEOGRAPH-F979; QQC
+F955 ; [.FB40.0020.0002.51CC][.D1CC.0000.0000.51CC] # CJK COMPATIBILITY IDEOGRAPH-F955; QQC
+F954 ; [.FB40.0020.0002.51DC][.D1DC.0000.0000.51DC] # CJK COMPATIBILITY IDEOGRAPH-F954; QQC
+FA15 ; [.FB40.0020.0002.51DE][.D1DE.0000.0000.51DE] # CJK COMPATIBILITY IDEOGRAPH-FA15; QQC
+2F0F ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0] # KANGXI RADICAL TABLE; QQK
+2E87 ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0][.0000.0159.001F.2E87] # CJK RADICAL TABLE; QQKN
+2F81D ; [.FB40.0020.0002.51F5][.D1F5.0000.0000.51F5] # CJK COMPATIBILITY IDEOGRAPH-2F81D; QQC
+2F10 ; [.FB40.0020.0004.51F5][.D1F5.0000.0000.51F5] # KANGXI RADICAL OPEN BOX; QQK
+2F11 ; [.FB40.0020.0004.5200][.D200.0000.0000.5200] # KANGXI RADICAL KNIFE; QQK
+2E88 ; [.FB40.0020.0004.5200][.D200.0000.0000.5200][.0000.0159.001F.2E88] # CJK RADICAL KNIFE ONE; QQKN
+2E89 ; [.FB40.0020.0004.5202][.D202.0000.0000.5202] # CJK RADICAL KNIFE TWO; QQK
+2F81E ; [.FB40.0020.0002.5203][.D203.0000.0000.5203] # CJK COMPATIBILITY IDEOGRAPH-2F81E; QQC
+FA00 ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-FA00; QQC
+2F850 ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-2F850; QQC
+F99C ; [.FB40.0020.0002.5217][.D217.0000.0000.5217] # CJK COMPATIBILITY IDEOGRAPH-F99C; QQC
+1F220 ; [.FB40.0020.001C.521D][.D21D.0000.0000.521D] # SQUARED CJK UNIFIED IDEOGRAPH-521D; QQK
+F9DD ; [.FB40.0020.0002.5229][.D229.0000.0000.5229] # CJK COMPATIBILITY IDEOGRAPH-F9DD; QQC
+F9FF ; [.FB40.0020.0002.523A][.D23A.0000.0000.523A] # CJK COMPATIBILITY IDEOGRAPH-F9FF; QQC
+2F820 ; [.FB40.0020.0002.523B][.D23B.0000.0000.523B] # CJK COMPATIBILITY IDEOGRAPH-2F820; QQC
+2F821 ; [.FB40.0020.0002.5246][.D246.0000.0000.5246] # CJK COMPATIBILITY IDEOGRAPH-2F821; QQC
+1F21C ; [.FB40.0020.001C.524D][.D24D.0000.0000.524D] # SQUARED CJK UNIFIED IDEOGRAPH-524D; QQK
+2F822 ; [.FB40.0020.0002.5272][.D272.0000.0000.5272] # CJK COMPATIBILITY IDEOGRAPH-2F822; QQC
+2F823 ; [.FB40.0020.0002.5277][.D277.0000.0000.5277] # CJK COMPATIBILITY IDEOGRAPH-2F823; QQC
+F9C7 ; [.FB40.0020.0002.5289][.D289.0000.0000.5289] # CJK COMPATIBILITY IDEOGRAPH-F9C7; QQC
+F98A ; [.FB40.0020.0002.529B][.D29B.0000.0000.529B] # CJK COMPATIBILITY IDEOGRAPH-F98A; QQC
+2F12 ; [.FB40.0020.0004.529B][.D29B.0000.0000.529B] # KANGXI RADICAL POWER; QQK
+F99D ; [.FB40.0020.0002.52A3][.D2A3.0000.0000.52A3] # CJK COMPATIBILITY IDEOGRAPH-F99D; QQC
+2F992 ; [.FB40.0020.0002.52B3][.D2B3.0000.0000.52B3] # CJK COMPATIBILITY IDEOGRAPH-2F992; QQC
+3238 ; [*02FF.0020.0004.3238][.FB40.0020.0004.52B4][.D2B4.0000.0000.52B4][*0300.0020.001F.3238] # PARENTHESIZED IDEOGRAPH LABOR; QQKN
+3298 ; [.FB40.0020.0006.52B4][.D2B4.0000.0000.52B4] # CIRCLED IDEOGRAPH LABOR; QQK
+FA76 ; [.FB40.0020.0002.52C7][.D2C7.0000.0000.52C7] # CJK COMPATIBILITY IDEOGRAPH-FA76; QQC
+2F825 ; [.FB40.0020.0002.52C7][.D2C7.0000.0000.52C7] # CJK COMPATIBILITY IDEOGRAPH-2F825; QQC
+FA33 ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-FA33; QQC
+2F826 ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-2F826; QQC
+F952 ; [.FB40.0020.0002.52D2][.D2D2.0000.0000.52D2] # CJK COMPATIBILITY IDEOGRAPH-F952; QQC
+1F247 ; [*0347.0020.0004.1F247][.FB40.0020.0004.52DD][.D2DD.0000.0000.52DD][*0348.0020.001F.1F247] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD; QQKN
+F92F ; [.FB40.0020.0002.52DE][.D2DE.0000.0000.52DE] # CJK COMPATIBILITY IDEOGRAPH-F92F; QQC
+FA34 ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-FA34; QQC
+2F827 ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-2F827; QQC
+F97F ; [.FB40.0020.0002.52F5][.D2F5.0000.0000.52F5] # CJK COMPATIBILITY IDEOGRAPH-F97F; QQC
+2F13 ; [.FB40.0020.0004.52F9][.D2F9.0000.0000.52F9] # KANGXI RADICAL WRAP; QQK
+FA77 ; [.FB40.0020.0002.52FA][.D2FA.0000.0000.52FA] # CJK COMPATIBILITY IDEOGRAPH-FA77; QQC
+2F828 ; [.FB40.0020.0002.52FA][.D2FA.0000.0000.52FA] # CJK COMPATIBILITY IDEOGRAPH-2F828; QQC
+2F829 ; [.FB40.0020.0002.5305][.D305.0000.0000.5305] # CJK COMPATIBILITY IDEOGRAPH-2F829; QQC
+2F82A ; [.FB40.0020.0002.5306][.D306.0000.0000.5306] # CJK COMPATIBILITY IDEOGRAPH-2F82A; QQC
+2F14 ; [.FB40.0020.0004.5315][.D315.0000.0000.5315] # KANGXI RADICAL SPOON; QQK
+F963 ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-F963; QQC
+2F82B ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-2F82B; QQC
+2F15 ; [.FB40.0020.0004.531A][.D31A.0000.0000.531A] # KANGXI RADICAL RIGHT OPEN BOX; QQK
+2F16 ; [.FB40.0020.0004.5338][.D338.0000.0000.5338] # KANGXI RADICAL HIDING ENCLOSURE; QQK
+32A9 ; [.FB40.0020.0006.533B][.D33B.0000.0000.533B] # CIRCLED IDEOGRAPH MEDICINE; QQK
+F9EB ; [.FB40.0020.0002.533F][.D33F.0000.0000.533F] # CJK COMPATIBILITY IDEOGRAPH-F9EB; QQC
+2F17 ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # KANGXI RADICAL TEN; QQK
+3038 ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # HANGZHOU NUMERAL TEN; QQK
+3229 ; [*02FF.0020.0004.3229][.FB40.0020.0004.5341][.D341.0000.0000.5341][*0300.0020.001F.3229] # PARENTHESIZED IDEOGRAPH TEN; QQKN
+3289 ; [.FB40.0020.0006.5341][.D341.0000.0000.5341] # CIRCLED IDEOGRAPH TEN; QQK
+3039 ; [.FB40.0020.0004.5344][.D344.0000.0000.5344] # HANGZHOU NUMERAL TWENTY; QQK
+303A ; [.FB40.0020.0004.5345][.D345.0000.0000.5345] # HANGZHOU NUMERAL THIRTY; QQK
+2F82C ; [.FB40.0020.0002.5349][.D349.0000.0000.5349] # CJK COMPATIBILITY IDEOGRAPH-2F82C; QQC
+FA35 ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-FA35; QQC
+2F82D ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-2F82D; QQC
+323F ; [*02FF.0020.0004.323F][.FB40.0020.0004.5354][.D354.0000.0000.5354][*0300.0020.001F.323F] # PARENTHESIZED IDEOGRAPH ALLIANCE; QQKN
+32AF ; [.FB40.0020.0006.5354][.D354.0000.0000.5354] # CIRCLED IDEOGRAPH ALLIANCE; QQK
+2F82E ; [.FB40.0020.0002.535A][.D35A.0000.0000.535A] # CJK COMPATIBILITY IDEOGRAPH-2F82E; QQC
+2F18 ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C] # KANGXI RADICAL DIVINATION; QQK
+2E8A ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C][.0000.0159.001F.2E8A] # CJK RADICAL DIVINATION; QQKN
+2F19 ; [.FB40.0020.0004.5369][.D369.0000.0000.5369] # KANGXI RADICAL SEAL; QQK
+2E8B ; [.FB40.0020.0004.5369][.D369.0000.0000.5369][.0000.0159.001F.2E8B] # CJK RADICAL SEAL; QQKN
+329E ; [.FB40.0020.0006.5370][.D370.0000.0000.5370] # CIRCLED IDEOGRAPH PRINT; QQK
+2F82F ; [.FB40.0020.0002.5373][.D373.0000.0000.5373] # CJK COMPATIBILITY IDEOGRAPH-2F82F; QQC
+F91C ; [.FB40.0020.0002.5375][.D375.0000.0000.5375] # CJK COMPATIBILITY IDEOGRAPH-F91C; QQC
+2F830 ; [.FB40.0020.0002.537D][.D37D.0000.0000.537D] # CJK COMPATIBILITY IDEOGRAPH-2F830; QQC
+2F831 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F831; QQC
+2F832 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F832; QQC
+2F833 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F833; QQC
+2F1A ; [.FB40.0020.0004.5382][.D382.0000.0000.5382] # KANGXI RADICAL CLIFF; QQK
+2E81 ; [.FB40.0020.0004.5382][.D382.0000.0000.5382][.0000.0159.001F.2E81] # CJK RADICAL CLIFF; QQKN
+2F1B ; [.FB40.0020.0004.53B6][.D3B6.0000.0000.53B6] # KANGXI RADICAL PRIVATE; QQK
+F96B ; [.FB40.0020.0002.53C3][.D3C3.0000.0000.53C3] # CJK COMPATIBILITY IDEOGRAPH-F96B; QQC
+2F1C ; [.FB40.0020.0004.53C8][.D3C8.0000.0000.53C8] # KANGXI RADICAL AGAIN; QQK
+2F836 ; [.FB40.0020.0002.53CA][.D3CA.0000.0000.53CA] # CJK COMPATIBILITY IDEOGRAPH-2F836; QQC
+1F212 ; [.FB40.0020.001C.53CC][.D3CC.0000.0000.53CC] # SQUARED CJK UNIFIED IDEOGRAPH-53CC; QQK
+2F837 ; [.FB40.0020.0002.53DF][.D3DF.0000.0000.53DF] # CJK COMPATIBILITY IDEOGRAPH-2F837; QQC
+2F1D ; [.FB40.0020.0004.53E3][.D3E3.0000.0000.53E3] # KANGXI RADICAL MOUTH; QQK
+F906 ; [.FB40.0020.0002.53E5][.D3E5.0000.0000.53E5] # CJK COMPATIBILITY IDEOGRAPH-F906; QQC
+2F839 ; [.FB40.0020.0002.53EB][.D3EB.0000.0000.53EB] # CJK COMPATIBILITY IDEOGRAPH-2F839; QQC
+2F83A ; [.FB40.0020.0002.53F1][.D3F1.0000.0000.53F1] # CJK COMPATIBILITY IDEOGRAPH-2F83A; QQC
+32A8 ; [.FB40.0020.0006.53F3][.D3F3.0000.0000.53F3] # CIRCLED IDEOGRAPH RIGHT; QQK
+1F22E ; [.FB40.0020.001C.53F3][.D3F3.0000.0000.53F3] # SQUARED CJK UNIFIED IDEOGRAPH-53F3; QQK
+2F83B ; [.FB40.0020.0002.5406][.D406.0000.0000.5406] # CJK COMPATIBILITY IDEOGRAPH-2F83B; QQC
+3234 ; [*02FF.0020.0004.3234][.FB40.0020.0004.540D][.D40D.0000.0000.540D][*0300.0020.001F.3234] # PARENTHESIZED IDEOGRAPH NAME; QQKN
+3294 ; [.FB40.0020.0006.540D][.D40D.0000.0000.540D] # CIRCLED IDEOGRAPH NAME; QQK
+F9DE ; [.FB40.0020.0002.540F][.D40F.0000.0000.540F] # CJK COMPATIBILITY IDEOGRAPH-F9DE; QQC
+F9ED ; [.FB40.0020.0002.541D][.D41D.0000.0000.541D] # CJK COMPATIBILITY IDEOGRAPH-F9ED; QQC
+2F83D ; [.FB40.0020.0002.5438][.D438.0000.0000.5438] # CJK COMPATIBILITY IDEOGRAPH-2F83D; QQC
+1F225 ; [.FB40.0020.001C.5439][.D439.0000.0000.5439] # SQUARED CJK UNIFIED IDEOGRAPH-5439; QQK
+F980 ; [.FB40.0020.0002.5442][.D442.0000.0000.5442] # CJK COMPATIBILITY IDEOGRAPH-F980; QQC
+2F83E ; [.FB40.0020.0002.5448][.D448.0000.0000.5448] # CJK COMPATIBILITY IDEOGRAPH-2F83E; QQC
+2F83F ; [.FB40.0020.0002.5468][.D468.0000.0000.5468] # CJK COMPATIBILITY IDEOGRAPH-2F83F; QQC
+323A ; [*02FF.0020.0004.323A][.FB40.0020.0004.547C][.D47C.0000.0000.547C][*0300.0020.001F.323A] # PARENTHESIZED IDEOGRAPH CALL; QQKN
+2F83C ; [.FB40.0020.0002.549E][.D49E.0000.0000.549E] # CJK COMPATIBILITY IDEOGRAPH-2F83C; QQC
+2F840 ; [.FB40.0020.0002.54A2][.D4A2.0000.0000.54A2] # CJK COMPATIBILITY IDEOGRAPH-2F840; QQC
+F99E ; [.FB40.0020.0002.54BD][.D4BD.0000.0000.54BD] # CJK COMPATIBILITY IDEOGRAPH-F99E; QQC
+2F841 ; [.FB40.0020.0002.54F6][.D4F6.0000.0000.54F6] # CJK COMPATIBILITY IDEOGRAPH-2F841; QQC
+2F842 ; [.FB40.0020.0002.5510][.D510.0000.0000.5510] # CJK COMPATIBILITY IDEOGRAPH-2F842; QQC
+3244 ; [.FB40.0020.0006.554F][.D54F.0000.0000.554F] # CIRCLED IDEOGRAPH QUESTION; QQK
+2F843 ; [.FB40.0020.0002.5553][.D553.0000.0000.5553] # CJK COMPATIBILITY IDEOGRAPH-2F843; QQC
+FA79 ; [.FB40.0020.0002.5555][.D555.0000.0000.5555] # CJK COMPATIBILITY IDEOGRAPH-FA79; QQC
+2F844 ; [.FB40.0020.0002.5563][.D563.0000.0000.5563] # CJK COMPATIBILITY IDEOGRAPH-2F844; QQC
+2F845 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F845; QQC
+2F846 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F846; QQC
+F90B ; [.FB40.0020.0002.5587][.D587.0000.0000.5587] # CJK COMPATIBILITY IDEOGRAPH-F90B; QQC
+FA7A ; [.FB40.0020.0002.5599][.D599.0000.0000.5599] # CJK COMPATIBILITY IDEOGRAPH-FA7A; QQC
+2F847 ; [.FB40.0020.0002.5599][.D599.0000.0000.5599] # CJK COMPATIBILITY IDEOGRAPH-2F847; QQC
+FA36 ; [.FB40.0020.0002.559D][.D59D.0000.0000.559D] # CJK COMPATIBILITY IDEOGRAPH-FA36; QQC
+FA78 ; [.FB40.0020.0002.559D][.D59D.0000.0000.559D] # CJK COMPATIBILITY IDEOGRAPH-FA78; QQC
+2F848 ; [.FB40.0020.0002.55AB][.D5AB.0000.0000.55AB] # CJK COMPATIBILITY IDEOGRAPH-2F848; QQC
+2F849 ; [.FB40.0020.0002.55B3][.D5B3.0000.0000.55B3] # CJK COMPATIBILITY IDEOGRAPH-2F849; QQC
+FA0D ; [.FB40.0020.0002.55C0][.D5C0.0000.0000.55C0] # CJK COMPATIBILITY IDEOGRAPH-FA0D; QQC
+2F84A ; [.FB40.0020.0002.55C2][.D5C2.0000.0000.55C2] # CJK COMPATIBILITY IDEOGRAPH-2F84A; QQC
+FA7B ; [.FB40.0020.0002.55E2][.D5E2.0000.0000.55E2] # CJK COMPATIBILITY IDEOGRAPH-FA7B; QQC
+FA37 ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-FA37; QQC
+2F84C ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-2F84C; QQC
+2F84E ; [.FB40.0020.0002.5651][.D651.0000.0000.5651] # CJK COMPATIBILITY IDEOGRAPH-2F84E; QQC
+FA38 ; [.FB40.0020.0002.5668][.D668.0000.0000.5668] # CJK COMPATIBILITY IDEOGRAPH-FA38; QQC
+2F84F ; [.FB40.0020.0002.5674][.D674.0000.0000.5674] # CJK COMPATIBILITY IDEOGRAPH-2F84F; QQC
+2F1E ; [.FB40.0020.0004.56D7][.D6D7.0000.0000.56D7] # KANGXI RADICAL ENCLOSURE; QQK
+3223 ; [*02FF.0020.0004.3223][.FB40.0020.0004.56DB][.D6DB.0000.0000.56DB][*0300.0020.001F.3223] # PARENTHESIZED IDEOGRAPH FOUR; QQKN
+3283 ; [.FB40.0020.0006.56DB][.D6DB.0000.0000.56DB] # CIRCLED IDEOGRAPH FOUR; QQK
+3195 ; [.FB40.0020.0014.56DB][.D6DB.0000.0000.56DB] # IDEOGRAPHIC ANNOTATION FOUR MARK; QQK
+F9A9 ; [.FB40.0020.0002.56F9][.D6F9.0000.0000.56F9] # CJK COMPATIBILITY IDEOGRAPH-F9A9; QQC
+2F84B ; [.FB40.0020.0002.5716][.D716.0000.0000.5716] # CJK COMPATIBILITY IDEOGRAPH-2F84B; QQC
+2F84D ; [.FB40.0020.0002.5717][.D717.0000.0000.5717] # CJK COMPATIBILITY IDEOGRAPH-2F84D; QQC
+2F1F ; [.FB40.0020.0004.571F][.D71F.0000.0000.571F] # KANGXI RADICAL EARTH; QQK
+322F ; [*02FF.0020.0004.322F][.FB40.0020.0004.571F][.D71F.0000.0000.571F][*0300.0020.001F.322F] # PARENTHESIZED IDEOGRAPH EARTH; QQKN
+328F ; [.FB40.0020.0006.571F][.D71F.0000.0000.571F] # CIRCLED IDEOGRAPH EARTH; QQK
+319E ; [.FB40.0020.0014.5730][.D730.0000.0000.5730] # IDEOGRAPHIC ANNOTATION EARTH MARK; QQK
+2F855 ; [.FB40.0020.0002.578B][.D78B.0000.0000.578B] # CJK COMPATIBILITY IDEOGRAPH-2F855; QQC
+2F852 ; [.FB40.0020.0002.57CE][.D7CE.0000.0000.57CE] # CJK COMPATIBILITY IDEOGRAPH-2F852; QQC
+2F853 ; [.FB40.0020.0002.57F4][.D7F4.0000.0000.57F4] # CJK COMPATIBILITY IDEOGRAPH-2F853; QQC
+2F854 ; [.FB40.0020.0002.580D][.D80D.0000.0000.580D] # CJK COMPATIBILITY IDEOGRAPH-2F854; QQC
+2F857 ; [.FB40.0020.0002.5831][.D831.0000.0000.5831] # CJK COMPATIBILITY IDEOGRAPH-2F857; QQC
+2F856 ; [.FB40.0020.0002.5832][.D832.0000.0000.5832] # CJK COMPATIBILITY IDEOGRAPH-2F856; QQC
+FA39 ; [.FB40.0020.0002.5840][.D840.0000.0000.5840] # CJK COMPATIBILITY IDEOGRAPH-FA39; QQC
+FA10 ; [.FB40.0020.0002.585A][.D85A.0000.0000.585A] # CJK COMPATIBILITY IDEOGRAPH-FA10; QQC
+FA7C ; [.FB40.0020.0002.585A][.D85A.0000.0000.585A] # CJK COMPATIBILITY IDEOGRAPH-FA7C; QQC
+F96C ; [.FB40.0020.0002.585E][.D85E.0000.0000.585E] # CJK COMPATIBILITY IDEOGRAPH-F96C; QQC
+FA3A ; [.FB40.0020.0002.58A8][.D8A8.0000.0000.58A8] # CJK COMPATIBILITY IDEOGRAPH-FA3A; QQC
+2F858 ; [.FB40.0020.0002.58AC][.D8AC.0000.0000.58AC] # CJK COMPATIBILITY IDEOGRAPH-2F858; QQC
+FA7D ; [.FB40.0020.0002.58B3][.D8B3.0000.0000.58B3] # CJK COMPATIBILITY IDEOGRAPH-FA7D; QQC
+F94A ; [.FB40.0020.0002.58D8][.D8D8.0000.0000.58D8] # CJK COMPATIBILITY IDEOGRAPH-F94A; QQC
+F942 ; [.FB40.0020.0002.58DF][.D8DF.0000.0000.58DF] # CJK COMPATIBILITY IDEOGRAPH-F942; QQC
+2F20 ; [.FB40.0020.0004.58EB][.D8EB.0000.0000.58EB] # KANGXI RADICAL SCHOLAR; QQK
+2F851 ; [.FB40.0020.0002.58EE][.D8EE.0000.0000.58EE] # CJK COMPATIBILITY IDEOGRAPH-2F851; QQC
+1F224 ; [.FB40.0020.001C.58F0][.D8F0.0000.0000.58F0] # SQUARED CJK UNIFIED IDEOGRAPH-58F0; QQK
+2F85A ; [.FB40.0020.0002.58F2][.D8F2.0000.0000.58F2] # CJK COMPATIBILITY IDEOGRAPH-2F85A; QQC
+2F85B ; [.FB40.0020.0002.58F7][.D8F7.0000.0000.58F7] # CJK COMPATIBILITY IDEOGRAPH-2F85B; QQC
+2F21 ; [.FB40.0020.0004.5902][.D902.0000.0000.5902] # KANGXI RADICAL GO; QQK
+2F85C ; [.FB40.0020.0002.5906][.D906.0000.0000.5906] # CJK COMPATIBILITY IDEOGRAPH-2F85C; QQC
+2F22 ; [.FB40.0020.0004.590A][.D90A.0000.0000.590A] # KANGXI RADICAL GO SLOWLY; QQK
+2F23 ; [.FB40.0020.0004.5915][.D915.0000.0000.5915] # KANGXI RADICAL EVENING; QQK
+2F85D ; [.FB40.0020.0002.591A][.D91A.0000.0000.591A] # CJK COMPATIBILITY IDEOGRAPH-2F85D; QQC
+1F215 ; [.FB40.0020.001C.591A][.D91A.0000.0000.591A] # SQUARED CJK UNIFIED IDEOGRAPH-591A; QQK
+32B0 ; [.FB40.0020.0006.591C][.D91C.0000.0000.591C] # CIRCLED IDEOGRAPH NIGHT; QQK
+2F85E ; [.FB40.0020.0002.5922][.D922.0000.0000.5922] # CJK COMPATIBILITY IDEOGRAPH-2F85E; QQC
+2F24 ; [.FB40.0020.0004.5927][.D927.0000.0000.5927] # KANGXI RADICAL BIG; QQK
+337D ; [.FB40.0020.001C.5927][.D927.0000.0000.5927][.FB40.0020.001F.6B63][.EB63.0000.0000.6B63] # SQUARE ERA NAME TAISYOU; QQKN
+319D ; [.FB40.0020.0014.5929][.D929.0000.0000.5929] # IDEOGRAPHIC ANNOTATION HEAVEN MARK; QQK
+1F217 ; [.FB40.0020.001C.5929][.D929.0000.0000.5929] # SQUARED CJK UNIFIED IDEOGRAPH-5929; QQK
+FA7E ; [.FB40.0020.0002.5944][.D944.0000.0000.5944] # CJK COMPATIBILITY IDEOGRAPH-FA7E; QQC
+F90C ; [.FB40.0020.0002.5948][.D948.0000.0000.5948] # CJK COMPATIBILITY IDEOGRAPH-F90C; QQC
+F909 ; [.FB40.0020.0002.5951][.D951.0000.0000.5951] # CJK COMPATIBILITY IDEOGRAPH-F909; QQC
+FA7F ; [.FB40.0020.0002.5954][.D954.0000.0000.5954] # CJK COMPATIBILITY IDEOGRAPH-FA7F; QQC
+2F85F ; [.FB40.0020.0002.5962][.D962.0000.0000.5962] # CJK COMPATIBILITY IDEOGRAPH-2F85F; QQC
+F981 ; [.FB40.0020.0002.5973][.D973.0000.0000.5973] # CJK COMPATIBILITY IDEOGRAPH-F981; QQC
+2F25 ; [.FB40.0020.0004.5973][.D973.0000.0000.5973] # KANGXI RADICAL WOMAN; QQK
+329B ; [.FB40.0020.0006.5973][.D973.0000.0000.5973] # CIRCLED IDEOGRAPH FEMALE; QQK
+2F865 ; [.FB40.0020.0002.59D8][.D9D8.0000.0000.59D8] # CJK COMPATIBILITY IDEOGRAPH-2F865; QQC
+2F862 ; [.FB40.0020.0002.59EC][.D9EC.0000.0000.59EC] # CJK COMPATIBILITY IDEOGRAPH-2F862; QQC
+2F863 ; [.FB40.0020.0002.5A1B][.DA1B.0000.0000.5A1B] # CJK COMPATIBILITY IDEOGRAPH-2F863; QQC
+2F864 ; [.FB40.0020.0002.5A27][.DA27.0000.0000.5A27] # CJK COMPATIBILITY IDEOGRAPH-2F864; QQC
+FA80 ; [.FB40.0020.0002.5A62][.DA62.0000.0000.5A62] # CJK COMPATIBILITY IDEOGRAPH-FA80; QQC
+2F866 ; [.FB40.0020.0002.5A66][.DA66.0000.0000.5A66] # CJK COMPATIBILITY IDEOGRAPH-2F866; QQC
+2F986 ; [.FB40.0020.0002.5AB5][.DAB5.0000.0000.5AB5] # CJK COMPATIBILITY IDEOGRAPH-2F986; QQC
+2F869 ; [.FB40.0020.0002.5B08][.DB08.0000.0000.5B08] # CJK COMPATIBILITY IDEOGRAPH-2F869; QQC
+FA81 ; [.FB40.0020.0002.5B28][.DB28.0000.0000.5B28] # CJK COMPATIBILITY IDEOGRAPH-FA81; QQC
+2F86A ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86A; QQC
+2F86B ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86B; QQC
+2F26 ; [.FB40.0020.0004.5B50][.DB50.0000.0000.5B50] # KANGXI RADICAL CHILD; QQK
+1F211 ; [.FB40.0020.001C.5B57][.DB57.0000.0000.5B57] # SQUARED CJK UNIFIED IDEOGRAPH-5B57; QQK
+323B ; [*02FF.0020.0004.323B][.FB40.0020.0004.5B66][.DB66.0000.0000.5B66][*0300.0020.001F.323B] # PARENTHESIZED IDEOGRAPH STUDY; QQKN
+32AB ; [.FB40.0020.0006.5B66][.DB66.0000.0000.5B66] # CIRCLED IDEOGRAPH STUDY; QQK
+2F27 ; [.FB40.0020.0004.5B80][.DB80.0000.0000.5B80] # KANGXI RADICAL ROOF; QQK
+FA04 ; [.FB40.0020.0002.5B85][.DB85.0000.0000.5B85] # CJK COMPATIBILITY IDEOGRAPH-FA04; QQC
+1F243 ; [*0347.0020.0004.1F243][.FB40.0020.0004.5B89][.DB89.0000.0000.5B89][*0348.0020.001F.1F243] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89; QQKN
+32AA ; [.FB40.0020.0006.5B97][.DB97.0000.0000.5B97] # CIRCLED IDEOGRAPH RELIGION; QQK
+2F86D ; [.FB40.0020.0002.5BC3][.DBC3.0000.0000.5BC3] # CJK COMPATIBILITY IDEOGRAPH-2F86D; QQC
+2F86E ; [.FB40.0020.0002.5BD8][.DBD8.0000.0000.5BD8] # CJK COMPATIBILITY IDEOGRAPH-2F86E; QQC
+F95F ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F95F; QQC
+F9AA ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F9AA; QQC
+2F86F ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-2F86F; QQC
+F9BC ; [.FB40.0020.0002.5BEE][.DBEE.0000.0000.5BEE] # CJK COMPATIBILITY IDEOGRAPH-F9BC; QQC
+2F870 ; [.FB40.0020.0002.5BF3][.DBF3.0000.0000.5BF3] # CJK COMPATIBILITY IDEOGRAPH-2F870; QQC
+2F28 ; [.FB40.0020.0004.5BF8][.DBF8.0000.0000.5BF8] # KANGXI RADICAL INCH; QQK
+2F872 ; [.FB40.0020.0002.5BFF][.DBFF.0000.0000.5BFF] # CJK COMPATIBILITY IDEOGRAPH-2F872; QQC
+2F873 ; [.FB40.0020.0002.5C06][.DC06.0000.0000.5C06] # CJK COMPATIBILITY IDEOGRAPH-2F873; QQC
+2F29 ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F] # KANGXI RADICAL SMALL; QQK
+2E8C ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.0159.001F.2E8C] # CJK RADICAL SMALL ONE; QQKN
+2E8D ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.015A.001F.2E8D] # CJK RADICAL SMALL TWO; QQKN
+2F875 ; [.FB40.0020.0002.5C22][.DC22.0000.0000.5C22] # CJK COMPATIBILITY IDEOGRAPH-2F875; QQC
+2E90 ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # CJK RADICAL LAME THREE; QQK
+2F2A ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # KANGXI RADICAL LAME; QQK
+2E8E ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22][.0000.0159.001F.2E8E] # CJK RADICAL LAME ONE; QQKN
+2E8F ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23] # CJK RADICAL LAME TWO; QQK
+2E91 ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23][.0000.0159.001F.2E91] # CJK RADICAL LAME FOUR; QQKN
+2F2B ; [.FB40.0020.0004.5C38][.DC38.0000.0000.5C38] # KANGXI RADICAL CORPSE; QQK
+F9BD ; [.FB40.0020.0002.5C3F][.DC3F.0000.0000.5C3F] # CJK COMPATIBILITY IDEOGRAPH-F9BD; QQC
+2F877 ; [.FB40.0020.0002.5C60][.DC60.0000.0000.5C60] # CJK COMPATIBILITY IDEOGRAPH-2F877; QQC
+F94B ; [.FB40.0020.0002.5C62][.DC62.0000.0000.5C62] # CJK COMPATIBILITY IDEOGRAPH-F94B; QQC
+FA3B ; [.FB40.0020.0002.5C64][.DC64.0000.0000.5C64] # CJK COMPATIBILITY IDEOGRAPH-FA3B; QQC
+F9DF ; [.FB40.0020.0002.5C65][.DC65.0000.0000.5C65] # CJK COMPATIBILITY IDEOGRAPH-F9DF; QQC
+FA3C ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-FA3C; QQC
+2F878 ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-2F878; QQC
+2F2C ; [.FB40.0020.0004.5C6E][.DC6E.0000.0000.5C6E] # KANGXI RADICAL SPROUT; QQK
+2F2D ; [.FB40.0020.0004.5C71][.DC71.0000.0000.5C71] # KANGXI RADICAL MOUNTAIN; QQK
+2F87A ; [.FB40.0020.0002.5C8D][.DC8D.0000.0000.5C8D] # CJK COMPATIBILITY IDEOGRAPH-2F87A; QQC
+2F879 ; [.FB40.0020.0002.5CC0][.DCC0.0000.0000.5CC0] # CJK COMPATIBILITY IDEOGRAPH-2F879; QQC
+F9D5 ; [.FB40.0020.0002.5D19][.DD19.0000.0000.5D19] # CJK COMPATIBILITY IDEOGRAPH-F9D5; QQC
+2F87C ; [.FB40.0020.0002.5D43][.DD43.0000.0000.5D43] # CJK COMPATIBILITY IDEOGRAPH-2F87C; QQC
+F921 ; [.FB40.0020.0002.5D50][.DD50.0000.0000.5D50] # CJK COMPATIBILITY IDEOGRAPH-F921; QQC
+2F87F ; [.FB40.0020.0002.5D6B][.DD6B.0000.0000.5D6B] # CJK COMPATIBILITY IDEOGRAPH-2F87F; QQC
+2F87E ; [.FB40.0020.0002.5D6E][.DD6E.0000.0000.5D6E] # CJK COMPATIBILITY IDEOGRAPH-2F87E; QQC
+2F880 ; [.FB40.0020.0002.5D7C][.DD7C.0000.0000.5D7C] # CJK COMPATIBILITY IDEOGRAPH-2F880; QQC
+2F9F4 ; [.FB40.0020.0002.5DB2][.DDB2.0000.0000.5DB2] # CJK COMPATIBILITY IDEOGRAPH-2F9F4; QQC
+F9AB ; [.FB40.0020.0002.5DBA][.DDBA.0000.0000.5DBA] # CJK COMPATIBILITY IDEOGRAPH-F9AB; QQC
+2F2E ; [.FB40.0020.0004.5DDB][.DDDB.0000.0000.5DDB] # KANGXI RADICAL RIVER; QQK
+2F881 ; [.FB40.0020.0002.5DE1][.DDE1.0000.0000.5DE1] # CJK COMPATIBILITY IDEOGRAPH-2F881; QQC
+2F882 ; [.FB40.0020.0002.5DE2][.DDE2.0000.0000.5DE2] # CJK COMPATIBILITY IDEOGRAPH-2F882; QQC
+2F2F ; [.FB40.0020.0004.5DE5][.DDE5.0000.0000.5DE5] # KANGXI RADICAL WORK; QQK
+32A7 ; [.FB40.0020.0006.5DE6][.DDE6.0000.0000.5DE6] # CIRCLED IDEOGRAPH LEFT; QQK
+1F22C ; [.FB40.0020.001C.5DE6][.DDE6.0000.0000.5DE6] # SQUARED CJK UNIFIED IDEOGRAPH-5DE6; QQK
+2F30 ; [.FB40.0020.0004.5DF1][.DDF1.0000.0000.5DF1] # KANGXI RADICAL ONESELF; QQK
+2E92 ; [.FB40.0020.0004.5DF3][.DDF3.0000.0000.5DF3] # CJK RADICAL SNAKE; QQK
+2F884 ; [.FB40.0020.0002.5DFD][.DDFD.0000.0000.5DFD] # CJK COMPATIBILITY IDEOGRAPH-2F884; QQC
+2F31 ; [.FB40.0020.0004.5DFE][.DDFE.0000.0000.5DFE] # KANGXI RADICAL TURBAN; QQK
+2F885 ; [.FB40.0020.0002.5E28][.DE28.0000.0000.5E28] # CJK COMPATIBILITY IDEOGRAPH-2F885; QQC
+2F886 ; [.FB40.0020.0002.5E3D][.DE3D.0000.0000.5E3D] # CJK COMPATIBILITY IDEOGRAPH-2F886; QQC
+2F887 ; [.FB40.0020.0002.5E69][.DE69.0000.0000.5E69] # CJK COMPATIBILITY IDEOGRAPH-2F887; QQC
+2F32 ; [.FB40.0020.0004.5E72][.DE72.0000.0000.5E72] # KANGXI RADICAL DRY; QQK
+337B ; [.FB40.0020.001C.5E73][.DE73.0000.0000.5E73][.FB40.0020.001F.6210][.E210.0000.0000.6210] # SQUARE ERA NAME HEISEI; QQKN
+F98E ; [.FB40.0020.0002.5E74][.DE74.0000.0000.5E74] # CJK COMPATIBILITY IDEOGRAPH-F98E; QQC
+2E93 ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # CJK RADICAL THREAD; QQK
+2F33 ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # KANGXI RADICAL SHORT THREAD; QQK
+3245 ; [.FB40.0020.0006.5E7C][.DE7C.0000.0000.5E7C] # CIRCLED IDEOGRAPH KINDERGARTEN; QQK
+2F34 ; [.FB40.0020.0004.5E7F][.DE7F.0000.0000.5E7F] # KANGXI RADICAL DOTTED CLIFF; QQK
+FA01 ; [.FB40.0020.0002.5EA6][.DEA6.0000.0000.5EA6] # CJK COMPATIBILITY IDEOGRAPH-FA01; QQC
+2F88B ; [.FB40.0020.0002.5EB0][.DEB0.0000.0000.5EB0] # CJK COMPATIBILITY IDEOGRAPH-2F88B; QQC
+2F88C ; [.FB40.0020.0002.5EB3][.DEB3.0000.0000.5EB3] # CJK COMPATIBILITY IDEOGRAPH-2F88C; QQC
+2F88D ; [.FB40.0020.0002.5EB6][.DEB6.0000.0000.5EB6] # CJK COMPATIBILITY IDEOGRAPH-2F88D; QQC
+F9A2 ; [.FB40.0020.0002.5EC9][.DEC9.0000.0000.5EC9] # CJK COMPATIBILITY IDEOGRAPH-F9A2; QQC
+F928 ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-F928; QQC
+2F88E ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-2F88E; QQC
+FA82 ; [.FB40.0020.0002.5ED2][.DED2.0000.0000.5ED2] # CJK COMPATIBILITY IDEOGRAPH-FA82; QQC
+FA0B ; [.FB40.0020.0002.5ED3][.DED3.0000.0000.5ED3] # CJK COMPATIBILITY IDEOGRAPH-FA0B; QQC
+FA83 ; [.FB40.0020.0002.5ED9][.DED9.0000.0000.5ED9] # CJK COMPATIBILITY IDEOGRAPH-FA83; QQC
+F982 ; [.FB40.0020.0002.5EEC][.DEEC.0000.0000.5EEC] # CJK COMPATIBILITY IDEOGRAPH-F982; QQC
+2F35 ; [.FB40.0020.0004.5EF4][.DEF4.0000.0000.5EF4] # KANGXI RADICAL LONG STRIDE; QQK
+2F890 ; [.FB40.0020.0002.5EFE][.DEFE.0000.0000.5EFE] # CJK COMPATIBILITY IDEOGRAPH-2F890; QQC
+2F36 ; [.FB40.0020.0004.5EFE][.DEFE.0000.0000.5EFE] # KANGXI RADICAL TWO HANDS; QQK
+F943 ; [.FB40.0020.0002.5F04][.DF04.0000.0000.5F04] # CJK COMPATIBILITY IDEOGRAPH-F943; QQC
+2F37 ; [.FB40.0020.0004.5F0B][.DF0B.0000.0000.5F0B] # KANGXI RADICAL SHOOT; QQK
+2F38 ; [.FB40.0020.0004.5F13][.DF13.0000.0000.5F13] # KANGXI RADICAL BOW; QQK
+2F894 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F894; QQC
+2F895 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F895; QQC
+2F39 ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50] # KANGXI RADICAL SNOUT; QQK
+2E95 ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50][.0000.0159.001F.2E95] # CJK RADICAL SNOUT TWO; QQKN
+2E94 ; [.FB40.0020.0004.5F51][.DF51.0000.0000.5F51] # CJK RADICAL SNOUT ONE; QQK
+2F874 ; [.FB40.0020.0002.5F53][.DF53.0000.0000.5F53] # CJK COMPATIBILITY IDEOGRAPH-2F874; QQC
+2F3A ; [.FB40.0020.0004.5F61][.DF61.0000.0000.5F61] # KANGXI RADICAL BRISTLE; QQK
+2F899 ; [.FB40.0020.0002.5F62][.DF62.0000.0000.5F62] # CJK COMPATIBILITY IDEOGRAPH-2F899; QQC
+FA84 ; [.FB40.0020.0002.5F69][.DF69.0000.0000.5F69] # CJK COMPATIBILITY IDEOGRAPH-FA84; QQC
+2F89A ; [.FB40.0020.0002.5F6B][.DF6B.0000.0000.5F6B] # CJK COMPATIBILITY IDEOGRAPH-2F89A; QQC
+2F3B ; [.FB40.0020.0004.5F73][.DF73.0000.0000.5F73] # KANGXI RADICAL STEP; QQK
+F9D8 ; [.FB40.0020.0002.5F8B][.DF8B.0000.0000.5F8B] # CJK COMPATIBILITY IDEOGRAPH-F9D8; QQC
+1F21D ; [.FB40.0020.001C.5F8C][.DF8C.0000.0000.5F8C] # SQUARED CJK UNIFIED IDEOGRAPH-5F8C; QQK
+2F89C ; [.FB40.0020.0002.5F9A][.DF9A.0000.0000.5F9A] # CJK COMPATIBILITY IDEOGRAPH-2F89C; QQC
+F966 ; [.FB40.0020.0002.5FA9][.DFA9.0000.0000.5FA9] # CJK COMPATIBILITY IDEOGRAPH-F966; QQC
+FA85 ; [.FB40.0020.0002.5FAD][.DFAD.0000.0000.5FAD] # CJK COMPATIBILITY IDEOGRAPH-FA85; QQC
+2F3C ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3] # KANGXI RADICAL HEART; QQK
+2E97 ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3][.0000.0159.001F.2E97] # CJK RADICAL HEART TWO; QQKN
+2E96 ; [.FB40.0020.0004.5FC4][.DFC4.0000.0000.5FC4] # CJK RADICAL HEART ONE; QQK
+2F89D ; [.FB40.0020.0002.5FCD][.DFCD.0000.0000.5FCD] # CJK COMPATIBILITY IDEOGRAPH-2F89D; QQC
+2F89E ; [.FB40.0020.0002.5FD7][.DFD7.0000.0000.5FD7] # CJK COMPATIBILITY IDEOGRAPH-2F89E; QQC
+F9A3 ; [.FB40.0020.0002.5FF5][.DFF5.0000.0000.5FF5] # CJK COMPATIBILITY IDEOGRAPH-F9A3; QQC
+2F89F ; [.FB40.0020.0002.5FF9][.DFF9.0000.0000.5FF9] # CJK COMPATIBILITY IDEOGRAPH-2F89F; QQC
+F960 ; [.FB40.0020.0002.6012][.E012.0000.0000.6012] # CJK COMPATIBILITY IDEOGRAPH-F960; QQC
+F9AC ; [.FB40.0020.0002.601C][.E01C.0000.0000.601C] # CJK COMPATIBILITY IDEOGRAPH-F9AC; QQC
+FA6B ; [.FB40.0020.0002.6075][.E075.0000.0000.6075] # CJK COMPATIBILITY IDEOGRAPH-FA6B; QQC
+2F8A0 ; [.FB40.0020.0002.6081][.E081.0000.0000.6081] # CJK COMPATIBILITY IDEOGRAPH-2F8A0; QQC
+FA3D ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-FA3D; QQC
+2F8A3 ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-2F8A3; QQC
+2F8A5 ; [.FB40.0020.0002.60C7][.E0C7.0000.0000.60C7] # CJK COMPATIBILITY IDEOGRAPH-2F8A5; QQC
+FA86 ; [.FB40.0020.0002.60D8][.E0D8.0000.0000.60D8] # CJK COMPATIBILITY IDEOGRAPH-FA86; QQC
+F9B9 ; [.FB40.0020.0002.60E1][.E0E1.0000.0000.60E1] # CJK COMPATIBILITY IDEOGRAPH-F9B9; QQC
+FA88 ; [.FB40.0020.0002.6108][.E108.0000.0000.6108] # CJK COMPATIBILITY IDEOGRAPH-FA88; QQC
+F9D9 ; [.FB40.0020.0002.6144][.E144.0000.0000.6144] # CJK COMPATIBILITY IDEOGRAPH-F9D9; QQC
+2F8A6 ; [.FB40.0020.0002.6148][.E148.0000.0000.6148] # CJK COMPATIBILITY IDEOGRAPH-2F8A6; QQC
+2F8A7 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A7; QQC
+2F8A9 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A9; QQC
+FA87 ; [.FB40.0020.0002.614E][.E14E.0000.0000.614E] # CJK COMPATIBILITY IDEOGRAPH-FA87; QQC
+2F8A8 ; [.FB40.0020.0002.614E][.E14E.0000.0000.614E] # CJK COMPATIBILITY IDEOGRAPH-2F8A8; QQC
+FA8A ; [.FB40.0020.0002.6160][.E160.0000.0000.6160] # CJK COMPATIBILITY IDEOGRAPH-FA8A; QQC
+FA3E ; [.FB40.0020.0002.6168][.E168.0000.0000.6168] # CJK COMPATIBILITY IDEOGRAPH-FA3E; QQC
+2F8AA ; [.FB40.0020.0002.617A][.E17A.0000.0000.617A] # CJK COMPATIBILITY IDEOGRAPH-2F8AA; QQC
+FA3F ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-FA3F; QQC
+FA89 ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-FA89; QQC
+2F8AB ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-2F8AB; QQC
+F98F ; [.FB40.0020.0002.6190][.E190.0000.0000.6190] # CJK COMPATIBILITY IDEOGRAPH-F98F; QQC
+2F8AD ; [.FB40.0020.0002.61A4][.E1A4.0000.0000.61A4] # CJK COMPATIBILITY IDEOGRAPH-2F8AD; QQC
+2F8AE ; [.FB40.0020.0002.61AF][.E1AF.0000.0000.61AF] # CJK COMPATIBILITY IDEOGRAPH-2F8AE; QQC
+2F8AC ; [.FB40.0020.0002.61B2][.E1B2.0000.0000.61B2] # CJK COMPATIBILITY IDEOGRAPH-2F8AC; QQC
+2F8AF ; [.FB40.0020.0002.61DE][.E1DE.0000.0000.61DE] # CJK COMPATIBILITY IDEOGRAPH-2F8AF; QQC
+FA40 ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-FA40; QQC
+FA8B ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-FA8B; QQC
+2F8B0 ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-2F8B0; QQC
+F90D ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-F90D; QQC
+2F8B1 ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-2F8B1; QQC
+F990 ; [.FB40.0020.0002.6200][.E200.0000.0000.6200] # CJK COMPATIBILITY IDEOGRAPH-F990; QQC
+2F3D ; [.FB40.0020.0004.6208][.E208.0000.0000.6208] # KANGXI RADICAL HALBERD; QQK
+2F8B2 ; [.FB40.0020.0002.6210][.E210.0000.0000.6210] # CJK COMPATIBILITY IDEOGRAPH-2F8B2; QQC
+2F8B3 ; [.FB40.0020.0002.621B][.E21B.0000.0000.621B] # CJK COMPATIBILITY IDEOGRAPH-2F8B3; QQC
+F9D2 ; [.FB40.0020.0002.622E][.E22E.0000.0000.622E] # CJK COMPATIBILITY IDEOGRAPH-F9D2; QQC
+FA8C ; [.FB40.0020.0002.6234][.E234.0000.0000.6234] # CJK COMPATIBILITY IDEOGRAPH-FA8C; QQC
+2F3E ; [.FB40.0020.0004.6236][.E236.0000.0000.6236] # KANGXI RADICAL DOOR; QQK
+2F3F ; [.FB40.0020.0004.624B][.E24B.0000.0000.624B] # KANGXI RADICAL HAND; QQK
+1F210 ; [.FB40.0020.001C.624B][.E24B.0000.0000.624B] # SQUARED CJK UNIFIED IDEOGRAPH-624B; QQK
+2E98 ; [.FB40.0020.0004.624C][.E24C.0000.0000.624C] # CJK RADICAL HAND; QQK
+1F245 ; [*0347.0020.0004.1F245][.FB40.0020.0004.6253][.E253.0000.0000.6253][*0348.0020.001F.1F245] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253; QQKN
+1F231 ; [.FB40.0020.001C.6253][.E253.0000.0000.6253] # SQUARED CJK UNIFIED IDEOGRAPH-6253; QQK
+2F8B4 ; [.FB40.0020.0002.625D][.E25D.0000.0000.625D] # CJK COMPATIBILITY IDEOGRAPH-2F8B4; QQC
+1F227 ; [.FB40.0020.001C.6295][.E295.0000.0000.6295] # SQUARED CJK UNIFIED IDEOGRAPH-6295; QQK
+2F8B5 ; [.FB40.0020.0002.62B1][.E2B1.0000.0000.62B1] # CJK COMPATIBILITY IDEOGRAPH-2F8B5; QQC
+F925 ; [.FB40.0020.0002.62C9][.E2C9.0000.0000.62C9] # CJK COMPATIBILITY IDEOGRAPH-F925; QQC
+F95B ; [.FB40.0020.0002.62CF][.E2CF.0000.0000.62CF] # CJK COMPATIBILITY IDEOGRAPH-F95B; QQC
+FA02 ; [.FB40.0020.0002.62D3][.E2D3.0000.0000.62D3] # CJK COMPATIBILITY IDEOGRAPH-FA02; QQC
+2F8B6 ; [.FB40.0020.0002.62D4][.E2D4.0000.0000.62D4] # CJK COMPATIBILITY IDEOGRAPH-2F8B6; QQC
+2F8BA ; [.FB40.0020.0002.62FC][.E2FC.0000.0000.62FC] # CJK COMPATIBILITY IDEOGRAPH-2F8BA; QQC
+F973 ; [.FB40.0020.0002.62FE][.E2FE.0000.0000.62FE] # CJK COMPATIBILITY IDEOGRAPH-F973; QQC
+1F22F ; [.FB40.0020.001C.6307][.E307.0000.0000.6307] # SQUARED CJK UNIFIED IDEOGRAPH-6307; QQK
+2F8B9 ; [.FB40.0020.0002.633D][.E33D.0000.0000.633D] # CJK COMPATIBILITY IDEOGRAPH-2F8B9; QQC
+2F8B7 ; [.FB40.0020.0002.6350][.E350.0000.0000.6350] # CJK COMPATIBILITY IDEOGRAPH-2F8B7; QQC
+1F228 ; [.FB40.0020.001C.6355][.E355.0000.0000.6355] # SQUARED CJK UNIFIED IDEOGRAPH-6355; QQK
+2F8BB ; [.FB40.0020.0002.6368][.E368.0000.0000.6368] # CJK COMPATIBILITY IDEOGRAPH-2F8BB; QQC
+F9A4 ; [.FB40.0020.0002.637B][.E37B.0000.0000.637B] # CJK COMPATIBILITY IDEOGRAPH-F9A4; QQC
+2F8BC ; [.FB40.0020.0002.6383][.E383.0000.0000.6383] # CJK COMPATIBILITY IDEOGRAPH-2F8BC; QQC
+F975 ; [.FB40.0020.0002.63A0][.E3A0.0000.0000.63A0] # CJK COMPATIBILITY IDEOGRAPH-F975; QQC
+2F8C1 ; [.FB40.0020.0002.63A9][.E3A9.0000.0000.63A9] # CJK COMPATIBILITY IDEOGRAPH-2F8C1; QQC
+FA8D ; [.FB40.0020.0002.63C4][.E3C4.0000.0000.63C4] # CJK COMPATIBILITY IDEOGRAPH-FA8D; QQC
+2F8C0 ; [.FB40.0020.0002.63C5][.E3C5.0000.0000.63C5] # CJK COMPATIBILITY IDEOGRAPH-2F8C0; QQC
+2F8BD ; [.FB40.0020.0002.63E4][.E3E4.0000.0000.63E4] # CJK COMPATIBILITY IDEOGRAPH-2F8BD; QQC
+FA8E ; [.FB40.0020.0002.641C][.E41C.0000.0000.641C] # CJK COMPATIBILITY IDEOGRAPH-FA8E; QQC
+2F8BF ; [.FB40.0020.0002.6422][.E422.0000.0000.6422] # CJK COMPATIBILITY IDEOGRAPH-2F8BF; QQC
+FA8F ; [.FB40.0020.0002.6452][.E452.0000.0000.6452] # CJK COMPATIBILITY IDEOGRAPH-FA8F; QQC
+2F8C3 ; [.FB40.0020.0002.6469][.E469.0000.0000.6469] # CJK COMPATIBILITY IDEOGRAPH-2F8C3; QQC
+2F8C6 ; [.FB40.0020.0002.6477][.E477.0000.0000.6477] # CJK COMPATIBILITY IDEOGRAPH-2F8C6; QQC
+2F8C4 ; [.FB40.0020.0002.647E][.E47E.0000.0000.647E] # CJK COMPATIBILITY IDEOGRAPH-2F8C4; QQC
+F991 ; [.FB40.0020.0002.649A][.E49A.0000.0000.649A] # CJK COMPATIBILITY IDEOGRAPH-F991; QQC
+2F8C5 ; [.FB40.0020.0002.649D][.E49D.0000.0000.649D] # CJK COMPATIBILITY IDEOGRAPH-2F8C5; QQC
+F930 ; [.FB40.0020.0002.64C4][.E4C4.0000.0000.64C4] # CJK COMPATIBILITY IDEOGRAPH-F930; QQC
+2F40 ; [.FB40.0020.0004.652F][.E52F.0000.0000.652F] # KANGXI RADICAL BRANCH; QQK
+2F41 ; [.FB40.0020.0004.6534][.E534.0000.0000.6534] # KANGXI RADICAL RAP; QQK
+2E99 ; [.FB40.0020.0004.6535][.E535.0000.0000.6535] # CJK RADICAL RAP; QQK
+FA41 ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-FA41; QQC
+2F8C8 ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-2F8C8; QQC
+FA90 ; [.FB40.0020.0002.6556][.E556.0000.0000.6556] # CJK COMPATIBILITY IDEOGRAPH-FA90; QQC
+1F248 ; [*0347.0020.0004.1F248][.FB40.0020.0004.6557][.E557.0000.0000.6557][*0348.0020.001F.1F248] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557; QQKN
+2F8C9 ; [.FB40.0020.0002.656C][.E56C.0000.0000.656C] # CJK COMPATIBILITY IDEOGRAPH-2F8C9; QQC
+F969 ; [.FB40.0020.0002.6578][.E578.0000.0000.6578] # CJK COMPATIBILITY IDEOGRAPH-F969; QQC
+2F42 ; [.FB40.0020.0004.6587][.E587.0000.0000.6587] # KANGXI RADICAL SCRIPT; QQK
+3246 ; [.FB40.0020.0006.6587][.E587.0000.0000.6587] # CIRCLED IDEOGRAPH SCHOOL; QQK
+2F43 ; [.FB40.0020.0004.6597][.E597.0000.0000.6597] # KANGXI RADICAL DIPPER; QQK
+F9BE ; [.FB40.0020.0002.6599][.E599.0000.0000.6599] # CJK COMPATIBILITY IDEOGRAPH-F9BE; QQC
+1F21B ; [.FB40.0020.001C.6599][.E599.0000.0000.6599] # SQUARED CJK UNIFIED IDEOGRAPH-6599; QQK
+2F44 ; [.FB40.0020.0004.65A4][.E5A4.0000.0000.65A4] # KANGXI RADICAL AXE; QQK
+1F21F ; [.FB40.0020.001C.65B0][.E5B0.0000.0000.65B0] # SQUARED CJK UNIFIED IDEOGRAPH-65B0; QQK
+2F45 ; [.FB40.0020.0004.65B9][.E5B9.0000.0000.65B9] # KANGXI RADICAL SQUARE; QQK
+F983 ; [.FB40.0020.0002.65C5][.E5C5.0000.0000.65C5] # CJK COMPATIBILITY IDEOGRAPH-F983; QQC
+2F46 ; [.FB40.0020.0004.65E0][.E5E0.0000.0000.65E0] # KANGXI RADICAL NOT; QQK
+2E9B ; [.FB40.0020.0004.65E1][.E5E1.0000.0000.65E1] # CJK RADICAL CHOKE; QQK
+FA42 ; [.FB40.0020.0002.65E2][.E5E2.0000.0000.65E2] # CJK COMPATIBILITY IDEOGRAPH-FA42; QQC
+2F8CB ; [.FB40.0020.0002.65E3][.E5E3.0000.0000.65E3] # CJK COMPATIBILITY IDEOGRAPH-2F8CB; QQC
+2F47 ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # KANGXI RADICAL SUN; QQK
+3230 ; [*02FF.0020.0004.3230][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][*0300.0020.001F.3230] # PARENTHESIZED IDEOGRAPH SUN; QQKN
+3290 ; [.FB40.0020.0006.65E5][.E5E5.0000.0000.65E5] # CIRCLED IDEOGRAPH SUN; QQK
+2E9C ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][.0000.0159.001F.2E9C] # CJK RADICAL SUN; QQKN
+337E ; [.FB40.0020.001C.660E][.E60E.0000.0000.660E][.FB40.0020.001F.6CBB][.ECBB.0000.0000.6CBB] # SQUARE ERA NAME MEIZI; QQKN
+F9E0 ; [.FB40.0020.0002.6613][.E613.0000.0000.6613] # CJK COMPATIBILITY IDEOGRAPH-F9E0; QQC
+1F219 ; [.FB40.0020.001C.6620][.E620.0000.0000.6620] # SQUARED CJK UNIFIED IDEOGRAPH-6620; QQK
+337C ; [.FB40.0020.001C.662D][.E62D.0000.0000.662D][.FB40.0020.001F.548C][.D48C.0000.0000.548C] # SQUARE ERA NAME SYOUWA; QQKN
+2F8CD ; [.FB40.0020.0002.6649][.E649.0000.0000.6649] # CJK COMPATIBILITY IDEOGRAPH-2F8CD; QQC
+FA12 ; [.FB40.0020.0002.6674][.E674.0000.0000.6674] # CJK COMPATIBILITY IDEOGRAPH-FA12; QQC
+FA91 ; [.FB40.0020.0002.6674][.E674.0000.0000.6674] # CJK COMPATIBILITY IDEOGRAPH-FA91; QQC
+F9C5 ; [.FB40.0020.0002.6688][.E688.0000.0000.6688] # CJK COMPATIBILITY IDEOGRAPH-F9C5; QQC
+FA43 ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-FA43; QQC
+2F8CF ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-2F8CF; QQC
+2F8D5 ; [.FB40.0020.0002.669C][.E69C.0000.0000.669C] # CJK COMPATIBILITY IDEOGRAPH-2F8D5; QQC
+FA06 ; [.FB40.0020.0002.66B4][.E6B4.0000.0000.66B4] # CJK COMPATIBILITY IDEOGRAPH-FA06; QQC
+F98B ; [.FB40.0020.0002.66C6][.E6C6.0000.0000.66C6] # CJK COMPATIBILITY IDEOGRAPH-F98B; QQC
+2F48 ; [.FB40.0020.0004.66F0][.E6F0.0000.0000.66F0] # KANGXI RADICAL SAY; QQK
+F901 ; [.FB40.0020.0002.66F4][.E6F4.0000.0000.66F4] # CJK COMPATIBILITY IDEOGRAPH-F901; QQC
+2F8CC ; [.FB40.0020.0002.66F8][.E6F8.0000.0000.66F8] # CJK COMPATIBILITY IDEOGRAPH-2F8CC; QQC
+2F8D4 ; [.FB40.0020.0002.6700][.E700.0000.0000.6700] # CJK COMPATIBILITY IDEOGRAPH-2F8D4; QQC
+2F49 ; [.FB40.0020.0004.6708][.E708.0000.0000.6708] # KANGXI RADICAL MOON; QQK
+322A ; [*02FF.0020.0004.322A][.FB40.0020.0004.6708][.E708.0000.0000.6708][*0300.0020.001F.322A] # PARENTHESIZED IDEOGRAPH MOON; QQKN
+328A ; [.FB40.0020.0006.6708][.E708.0000.0000.6708] # CIRCLED IDEOGRAPH MOON; QQK
+2E9D ; [.FB40.0020.0004.6708][.E708.0000.0000.6708][.0000.0159.001F.2E9D] # CJK RADICAL MOON; QQKN
+3232 ; [*02FF.0020.0004.3232][.FB40.0020.0004.6709][.E709.0000.0000.6709][*0300.0020.001F.3232] # PARENTHESIZED IDEOGRAPH HAVE; QQKN
+3292 ; [.FB40.0020.0006.6709][.E709.0000.0000.6709] # CIRCLED IDEOGRAPH HAVE; QQK
+F929 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-F929; QQC
+FA92 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-FA92; QQC
+2F8D8 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-2F8D8; QQC
+FA93 ; [.FB40.0020.0002.671B][.E71B.0000.0000.671B] # CJK COMPATIBILITY IDEOGRAPH-FA93; QQC
+2F8D9 ; [.FB40.0020.0002.671B][.E71B.0000.0000.671B] # CJK COMPATIBILITY IDEOGRAPH-2F8D9; QQC
+2F8DA ; [.FB40.0020.0002.6721][.E721.0000.0000.6721] # CJK COMPATIBILITY IDEOGRAPH-2F8DA; QQC
+2F4A ; [.FB40.0020.0004.6728][.E728.0000.0000.6728] # KANGXI RADICAL TREE; QQK
+322D ; [*02FF.0020.0004.322D][.FB40.0020.0004.6728][.E728.0000.0000.6728][*0300.0020.001F.322D] # PARENTHESIZED IDEOGRAPH WOOD; QQKN
+328D ; [.FB40.0020.0006.6728][.E728.0000.0000.6728] # CIRCLED IDEOGRAPH WOOD; QQK
+1F240 ; [*0347.0020.0004.1F240][.FB40.0020.0004.672C][.E72C.0000.0000.672C][*0348.0020.001F.1F240] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C; QQKN
+F9E1 ; [.FB40.0020.0002.674E][.E74E.0000.0000.674E] # CJK COMPATIBILITY IDEOGRAPH-F9E1; QQC
+2F8DC ; [.FB40.0020.0002.6753][.E753.0000.0000.6753] # CJK COMPATIBILITY IDEOGRAPH-2F8DC; QQC
+FA94 ; [.FB40.0020.0002.6756][.E756.0000.0000.6756] # CJK COMPATIBILITY IDEOGRAPH-FA94; QQC
+2F8DB ; [.FB40.0020.0002.675E][.E75E.0000.0000.675E] # CJK COMPATIBILITY IDEOGRAPH-2F8DB; QQC
+F9C8 ; [.FB40.0020.0002.677B][.E77B.0000.0000.677B] # CJK COMPATIBILITY IDEOGRAPH-F9C8; QQC
+2F8E0 ; [.FB40.0020.0002.6785][.E785.0000.0000.6785] # CJK COMPATIBILITY IDEOGRAPH-2F8E0; QQC
+F9F4 ; [.FB40.0020.0002.6797][.E797.0000.0000.6797] # CJK COMPATIBILITY IDEOGRAPH-F9F4; QQC
+F9C9 ; [.FB40.0020.0002.67F3][.E7F3.0000.0000.67F3] # CJK COMPATIBILITY IDEOGRAPH-F9C9; QQC
+2F8DF ; [.FB40.0020.0002.67FA][.E7FA.0000.0000.67FA] # CJK COMPATIBILITY IDEOGRAPH-2F8DF; QQC
+F9DA ; [.FB40.0020.0002.6817][.E817.0000.0000.6817] # CJK COMPATIBILITY IDEOGRAPH-F9DA; QQC
+2F8E5 ; [.FB40.0020.0002.681F][.E81F.0000.0000.681F] # CJK COMPATIBILITY IDEOGRAPH-2F8E5; QQC
+3231 ; [*02FF.0020.0004.3231][.FB40.0020.0004.682A][.E82A.0000.0000.682A][*0300.0020.001F.3231] # PARENTHESIZED IDEOGRAPH STOCK; QQKN
+3291 ; [.FB40.0020.0006.682A][.E82A.0000.0000.682A] # CIRCLED IDEOGRAPH STOCK; QQK
+337F ; [.FB40.0020.001C.682A][.E82A.0000.0000.682A][.FB40.0020.001F.5F0F][.DF0F.0000.0000.5F0F][.FB40.0020.001F.4F1A][.CF1A.0000.0000.4F1A][.FB40.0020.001F.793E][.F93E.0000.0000.793E] # SQUARE CORPORATION; QQKN
+2F8E1 ; [.FB40.0020.0002.6852][.E852.0000.0000.6852] # CJK COMPATIBILITY IDEOGRAPH-2F8E1; QQC
+F97A ; [.FB40.0020.0002.6881][.E881.0000.0000.6881] # CJK COMPATIBILITY IDEOGRAPH-F97A; QQC
+FA44 ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-FA44; QQC
+2F8E2 ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-2F8E2; QQC
+2F8E4 ; [.FB40.0020.0002.688E][.E88E.0000.0000.688E] # CJK COMPATIBILITY IDEOGRAPH-2F8E4; QQC
+F9E2 ; [.FB40.0020.0002.68A8][.E8A8.0000.0000.68A8] # CJK COMPATIBILITY IDEOGRAPH-F9E2; QQC
+2F8E6 ; [.FB40.0020.0002.6914][.E914.0000.0000.6914] # CJK COMPATIBILITY IDEOGRAPH-2F8E6; QQC
+2F8E8 ; [.FB40.0020.0002.6942][.E942.0000.0000.6942] # CJK COMPATIBILITY IDEOGRAPH-2F8E8; QQC
+2F8E9 ; [.FB40.0020.0002.69A3][.E9A3.0000.0000.69A3] # CJK COMPATIBILITY IDEOGRAPH-2F8E9; QQC
+2F8EA ; [.FB40.0020.0002.69EA][.E9EA.0000.0000.69EA] # CJK COMPATIBILITY IDEOGRAPH-2F8EA; QQC
+F914 ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F914; QQC
+F95C ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F95C; QQC
+F9BF ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F9BF; QQC
+F94C ; [.FB40.0020.0002.6A13][.EA13.0000.0000.6A13] # CJK COMPATIBILITY IDEOGRAPH-F94C; QQC
+2F8EB ; [.FB40.0020.0002.6AA8][.EAA8.0000.0000.6AA8] # CJK COMPATIBILITY IDEOGRAPH-2F8EB; QQC
+F931 ; [.FB40.0020.0002.6AD3][.EAD3.0000.0000.6AD3] # CJK COMPATIBILITY IDEOGRAPH-F931; QQC
+2F8ED ; [.FB40.0020.0002.6ADB][.EADB.0000.0000.6ADB] # CJK COMPATIBILITY IDEOGRAPH-2F8ED; QQC
+F91D ; [.FB40.0020.0002.6B04][.EB04.0000.0000.6B04] # CJK COMPATIBILITY IDEOGRAPH-F91D; QQC
+2F4B ; [.FB40.0020.0004.6B20][.EB20.0000.0000.6B20] # KANGXI RADICAL LACK; QQK
+2F8EF ; [.FB40.0020.0002.6B21][.EB21.0000.0000.6B21] # CJK COMPATIBILITY IDEOGRAPH-2F8EF; QQC
+2F8F1 ; [.FB40.0020.0002.6B54][.EB54.0000.0000.6B54] # CJK COMPATIBILITY IDEOGRAPH-2F8F1; QQC
+2F4C ; [.FB40.0020.0004.6B62][.EB62.0000.0000.6B62] # KANGXI RADICAL STOP; QQK
+32A3 ; [.FB40.0020.0006.6B63][.EB63.0000.0000.6B63] # CIRCLED IDEOGRAPH CORRECT; QQK
+2F8F3 ; [.FB40.0020.0002.6B72][.EB72.0000.0000.6B72] # CJK COMPATIBILITY IDEOGRAPH-2F8F3; QQC
+F98C ; [.FB40.0020.0002.6B77][.EB77.0000.0000.6B77] # CJK COMPATIBILITY IDEOGRAPH-F98C; QQC
+FA95 ; [.FB40.0020.0002.6B79][.EB79.0000.0000.6B79] # CJK COMPATIBILITY IDEOGRAPH-FA95; QQC
+2F4D ; [.FB40.0020.0004.6B79][.EB79.0000.0000.6B79] # KANGXI RADICAL DEATH; QQK
+2E9E ; [.FB40.0020.0004.6B7A][.EB7A.0000.0000.6B7A][.0000.0159.001F.2E9E] # CJK RADICAL DEATH; QQKN
+2F8F4 ; [.FB40.0020.0002.6B9F][.EB9F.0000.0000.6B9F] # CJK COMPATIBILITY IDEOGRAPH-2F8F4; QQC
+F9A5 ; [.FB40.0020.0002.6BAE][.EBAE.0000.0000.6BAE] # CJK COMPATIBILITY IDEOGRAPH-F9A5; QQC
+2F4E ; [.FB40.0020.0004.6BB3][.EBB3.0000.0000.6BB3] # KANGXI RADICAL WEAPON; QQK
+F970 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-F970; QQC
+FA96 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-FA96; QQC
+2F8F5 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-2F8F5; QQC
+2F8F6 ; [.FB40.0020.0002.6BBB][.EBBB.0000.0000.6BBB] # CJK COMPATIBILITY IDEOGRAPH-2F8F6; QQC
+2F4F ; [.FB40.0020.0004.6BCB][.EBCB.0000.0000.6BCB] # KANGXI RADICAL DO NOT; QQK
+2E9F ; [.FB40.0020.0004.6BCD][.EBCD.0000.0000.6BCD] # CJK RADICAL MOTHER; QQK
+2F50 ; [.FB40.0020.0004.6BD4][.EBD4.0000.0000.6BD4] # KANGXI RADICAL COMPARE; QQK
+2F51 ; [.FB40.0020.0004.6BDB][.EBDB.0000.0000.6BDB] # KANGXI RADICAL FUR; QQK
+2F52 ; [.FB40.0020.0004.6C0F][.EC0F.0000.0000.6C0F] # KANGXI RADICAL CLAN; QQK
+2EA0 ; [.FB40.0020.0004.6C11][.EC11.0000.0000.6C11] # CJK RADICAL CIVILIAN; QQK
+2F53 ; [.FB40.0020.0004.6C14][.EC14.0000.0000.6C14] # KANGXI RADICAL STEAM; QQK
+2F54 ; [.FB40.0020.0004.6C34][.EC34.0000.0000.6C34] # KANGXI RADICAL WATER; QQK
+322C ; [*02FF.0020.0004.322C][.FB40.0020.0004.6C34][.EC34.0000.0000.6C34][*0300.0020.001F.322C] # PARENTHESIZED IDEOGRAPH WATER; QQKN
+328C ; [.FB40.0020.0006.6C34][.EC34.0000.0000.6C34] # CIRCLED IDEOGRAPH WATER; QQK
+2EA1 ; [.FB40.0020.0004.6C35][.EC35.0000.0000.6C35] # CJK RADICAL WATER ONE; QQK
+2EA2 ; [.FB40.0020.0004.6C3A][.EC3A.0000.0000.6C3A] # CJK RADICAL WATER TWO; QQK
+2F8FA ; [.FB40.0020.0002.6C4E][.EC4E.0000.0000.6C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8FA; QQC
+2F8FE ; [.FB40.0020.0002.6C67][.EC67.0000.0000.6C67] # CJK COMPATIBILITY IDEOGRAPH-2F8FE; QQC
+F972 ; [.FB40.0020.0002.6C88][.EC88.0000.0000.6C88] # CJK COMPATIBILITY IDEOGRAPH-F972; QQC
+2F8FC ; [.FB40.0020.0002.6CBF][.ECBF.0000.0000.6CBF] # CJK COMPATIBILITY IDEOGRAPH-2F8FC; QQC
+F968 ; [.FB40.0020.0002.6CCC][.ECCC.0000.0000.6CCC] # CJK COMPATIBILITY IDEOGRAPH-F968; QQC
+2F8FD ; [.FB40.0020.0002.6CCD][.ECCD.0000.0000.6CCD] # CJK COMPATIBILITY IDEOGRAPH-2F8FD; QQC
+F9E3 ; [.FB40.0020.0002.6CE5][.ECE5.0000.0000.6CE5] # CJK COMPATIBILITY IDEOGRAPH-F9E3; QQC
+329F ; [.FB40.0020.0006.6CE8][.ECE8.0000.0000.6CE8] # CIRCLED IDEOGRAPH ATTENTION; QQK
+2F8FF ; [.FB40.0020.0002.6D16][.ED16.0000.0000.6D16] # CJK COMPATIBILITY IDEOGRAPH-2F8FF; QQC
+F915 ; [.FB40.0020.0002.6D1B][.ED1B.0000.0000.6D1B] # CJK COMPATIBILITY IDEOGRAPH-F915; QQC
+FA05 ; [.FB40.0020.0002.6D1E][.ED1E.0000.0000.6D1E] # CJK COMPATIBILITY IDEOGRAPH-FA05; QQC
+2F907 ; [.FB40.0020.0002.6D34][.ED34.0000.0000.6D34] # CJK COMPATIBILITY IDEOGRAPH-2F907; QQC
+2F900 ; [.FB40.0020.0002.6D3E][.ED3E.0000.0000.6D3E] # CJK COMPATIBILITY IDEOGRAPH-2F900; QQC
+F9CA ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-F9CA; QQC
+FA97 ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-FA97; QQC
+2F902 ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-2F902; QQC
+2F903 ; [.FB40.0020.0002.6D69][.ED69.0000.0000.6D69] # CJK COMPATIBILITY IDEOGRAPH-2F903; QQC
+F92A ; [.FB40.0020.0002.6D6A][.ED6A.0000.0000.6D6A] # CJK COMPATIBILITY IDEOGRAPH-F92A; QQC
+FA45 ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-FA45; QQC
+2F901 ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-2F901; QQC
+2F904 ; [.FB40.0020.0002.6D78][.ED78.0000.0000.6D78] # CJK COMPATIBILITY IDEOGRAPH-2F904; QQC
+2F905 ; [.FB40.0020.0002.6D85][.ED85.0000.0000.6D85] # CJK COMPATIBILITY IDEOGRAPH-2F905; QQC
+F9F5 ; [.FB40.0020.0002.6DCB][.EDCB.0000.0000.6DCB] # CJK COMPATIBILITY IDEOGRAPH-F9F5; QQC
+F94D ; [.FB40.0020.0002.6DDA][.EDDA.0000.0000.6DDA] # CJK COMPATIBILITY IDEOGRAPH-F94D; QQC
+F9D6 ; [.FB40.0020.0002.6DEA][.EDEA.0000.0000.6DEA] # CJK COMPATIBILITY IDEOGRAPH-F9D6; QQC
+2F90E ; [.FB40.0020.0002.6DF9][.EDF9.0000.0000.6DF9] # CJK COMPATIBILITY IDEOGRAPH-2F90E; QQC
+FA46 ; [.FB40.0020.0002.6E1A][.EE1A.0000.0000.6E1A] # CJK COMPATIBILITY IDEOGRAPH-FA46; QQC
+2F908 ; [.FB40.0020.0002.6E2F][.EE2F.0000.0000.6E2F] # CJK COMPATIBILITY IDEOGRAPH-2F908; QQC
+2F909 ; [.FB40.0020.0002.6E6E][.EE6E.0000.0000.6E6E] # CJK COMPATIBILITY IDEOGRAPH-2F909; QQC
+F9CB ; [.FB40.0020.0002.6E9C][.EE9C.0000.0000.6E9C] # CJK COMPATIBILITY IDEOGRAPH-F9CB; QQC
+F9EC ; [.FB40.0020.0002.6EBA][.EEBA.0000.0000.6EBA] # CJK COMPATIBILITY IDEOGRAPH-F9EC; QQC
+2F90C ; [.FB40.0020.0002.6EC7][.EEC7.0000.0000.6EC7] # CJK COMPATIBILITY IDEOGRAPH-2F90C; QQC
+FA99 ; [.FB40.0020.0002.6ECB][.EECB.0000.0000.6ECB] # CJK COMPATIBILITY IDEOGRAPH-FA99; QQC
+2F90B ; [.FB40.0020.0002.6ECB][.EECB.0000.0000.6ECB] # CJK COMPATIBILITY IDEOGRAPH-2F90B; QQC
+F904 ; [.FB40.0020.0002.6ED1][.EED1.0000.0000.6ED1] # CJK COMPATIBILITY IDEOGRAPH-F904; QQC
+FA98 ; [.FB40.0020.0002.6EDB][.EEDB.0000.0000.6EDB] # CJK COMPATIBILITY IDEOGRAPH-FA98; QQC
+F94E ; [.FB40.0020.0002.6F0F][.EF0F.0000.0000.6F0F] # CJK COMPATIBILITY IDEOGRAPH-F94E; QQC
+1F226 ; [.FB40.0020.001C.6F14][.EF14.0000.0000.6F14] # SQUARED CJK UNIFIED IDEOGRAPH-6F14; QQK
+FA47 ; [.FB40.0020.0002.6F22][.EF22.0000.0000.6F22] # CJK COMPATIBILITY IDEOGRAPH-FA47; QQC
+FA9A ; [.FB40.0020.0002.6F22][.EF22.0000.0000.6F22] # CJK COMPATIBILITY IDEOGRAPH-FA9A; QQC
+F992 ; [.FB40.0020.0002.6F23][.EF23.0000.0000.6F23] # CJK COMPATIBILITY IDEOGRAPH-F992; QQC
+2F90F ; [.FB40.0020.0002.6F6E][.EF6E.0000.0000.6F6E] # CJK COMPATIBILITY IDEOGRAPH-2F90F; QQC
+2F912 ; [.FB40.0020.0002.6FC6][.EFC6.0000.0000.6FC6] # CJK COMPATIBILITY IDEOGRAPH-2F912; QQC
+F922 ; [.FB40.0020.0002.6FEB][.EFEB.0000.0000.6FEB] # CJK COMPATIBILITY IDEOGRAPH-F922; QQC
+F984 ; [.FB40.0020.0002.6FFE][.EFFE.0000.0000.6FFE] # CJK COMPATIBILITY IDEOGRAPH-F984; QQC
+2F915 ; [.FB40.0020.0002.701B][.F01B.0000.0000.701B] # CJK COMPATIBILITY IDEOGRAPH-2F915; QQC
+FA9B ; [.FB40.0020.0002.701E][.F01E.0000.0000.701E] # CJK COMPATIBILITY IDEOGRAPH-FA9B; QQC
+2F914 ; [.FB40.0020.0002.701E][.F01E.0000.0000.701E] # CJK COMPATIBILITY IDEOGRAPH-2F914; QQC
+2F913 ; [.FB40.0020.0002.7039][.F039.0000.0000.7039] # CJK COMPATIBILITY IDEOGRAPH-2F913; QQC
+2F917 ; [.FB40.0020.0002.704A][.F04A.0000.0000.704A] # CJK COMPATIBILITY IDEOGRAPH-2F917; QQC
+2F55 ; [.FB40.0020.0004.706B][.F06B.0000.0000.706B] # KANGXI RADICAL FIRE; QQK
+322B ; [*02FF.0020.0004.322B][.FB40.0020.0004.706B][.F06B.0000.0000.706B][*0300.0020.001F.322B] # PARENTHESIZED IDEOGRAPH FIRE; QQKN
+328B ; [.FB40.0020.0006.706B][.F06B.0000.0000.706B] # CIRCLED IDEOGRAPH FIRE; QQK
+2EA3 ; [.FB40.0020.0004.706C][.F06C.0000.0000.706C] # CJK RADICAL FIRE; QQK
+2F835 ; [.FB40.0020.0002.7070][.F070.0000.0000.7070] # CJK COMPATIBILITY IDEOGRAPH-2F835; QQC
+2F919 ; [.FB40.0020.0002.7077][.F077.0000.0000.7077] # CJK COMPATIBILITY IDEOGRAPH-2F919; QQC
+2F918 ; [.FB40.0020.0002.707D][.F07D.0000.0000.707D] # CJK COMPATIBILITY IDEOGRAPH-2F918; QQC
+F9FB ; [.FB40.0020.0002.7099][.F099.0000.0000.7099] # CJK COMPATIBILITY IDEOGRAPH-F9FB; QQC
+2F91A ; [.FB40.0020.0002.70AD][.F0AD.0000.0000.70AD] # CJK COMPATIBILITY IDEOGRAPH-2F91A; QQC
+1F244 ; [*0347.0020.0004.1F244][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9][*0348.0020.001F.1F244] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9; QQKN
+F99F ; [.FB40.0020.0002.70C8][.F0C8.0000.0000.70C8] # CJK COMPATIBILITY IDEOGRAPH-F99F; QQC
+F916 ; [.FB40.0020.0002.70D9][.F0D9.0000.0000.70D9] # CJK COMPATIBILITY IDEOGRAPH-F916; QQC
+1F21A ; [.FB40.0020.001C.7121][.F121.0000.0000.7121] # SQUARED CJK UNIFIED IDEOGRAPH-7121; QQK
+2F91C ; [.FB40.0020.0002.7145][.F145.0000.0000.7145] # CJK COMPATIBILITY IDEOGRAPH-2F91C; QQC
+F993 ; [.FB40.0020.0002.7149][.F149.0000.0000.7149] # CJK COMPATIBILITY IDEOGRAPH-F993; QQC
+FA48 ; [.FB40.0020.0002.716E][.F16E.0000.0000.716E] # CJK COMPATIBILITY IDEOGRAPH-FA48; QQC
+FA9C ; [.FB40.0020.0002.716E][.F16E.0000.0000.716E] # CJK COMPATIBILITY IDEOGRAPH-FA9C; QQC
+2F91E ; [.FB40.0020.0002.719C][.F19C.0000.0000.719C] # CJK COMPATIBILITY IDEOGRAPH-2F91E; QQC
+F9C0 ; [.FB40.0020.0002.71CE][.F1CE.0000.0000.71CE] # CJK COMPATIBILITY IDEOGRAPH-F9C0; QQC
+F9EE ; [.FB40.0020.0002.71D0][.F1D0.0000.0000.71D0] # CJK COMPATIBILITY IDEOGRAPH-F9EE; QQC
+F932 ; [.FB40.0020.0002.7210][.F210.0000.0000.7210] # CJK COMPATIBILITY IDEOGRAPH-F932; QQC
+F91E ; [.FB40.0020.0002.721B][.F21B.0000.0000.721B] # CJK COMPATIBILITY IDEOGRAPH-F91E; QQC
+2F920 ; [.FB40.0020.0002.7228][.F228.0000.0000.7228] # CJK COMPATIBILITY IDEOGRAPH-2F920; QQC
+2F56 ; [.FB40.0020.0004.722A][.F22A.0000.0000.722A] # KANGXI RADICAL CLAW; QQK
+FA49 ; [.FB40.0020.0002.722B][.F22B.0000.0000.722B] # CJK COMPATIBILITY IDEOGRAPH-FA49; QQC
+2EA4 ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B] # CJK RADICAL PAW ONE; QQK
+2EA5 ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B][.0000.0159.001F.2EA5] # CJK RADICAL PAW TWO; QQKN
+FA9E ; [.FB40.0020.0002.7235][.F235.0000.0000.7235] # CJK COMPATIBILITY IDEOGRAPH-FA9E; QQC
+2F921 ; [.FB40.0020.0002.7235][.F235.0000.0000.7235] # CJK COMPATIBILITY IDEOGRAPH-2F921; QQC
+2F57 ; [.FB40.0020.0004.7236][.F236.0000.0000.7236] # KANGXI RADICAL FATHER; QQK
+2F58 ; [.FB40.0020.0004.723B][.F23B.0000.0000.723B] # KANGXI RADICAL DOUBLE X; QQK
+2F59 ; [.FB40.0020.0004.723F][.F23F.0000.0000.723F] # KANGXI RADICAL HALF TREE TRUNK; QQK
+2F5A ; [.FB40.0020.0004.7247][.F247.0000.0000.7247] # KANGXI RADICAL SLICE; QQK
+2F922 ; [.FB40.0020.0002.7250][.F250.0000.0000.7250] # CJK COMPATIBILITY IDEOGRAPH-2F922; QQC
+2F5B ; [.FB40.0020.0004.7259][.F259.0000.0000.7259] # KANGXI RADICAL FANG; QQK
+2F5C ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B] # KANGXI RADICAL COW; QQK
+2EA7 ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B][.0000.0159.001F.2EA7] # CJK RADICAL COW; QQKN
+F946 ; [.FB40.0020.0002.7262][.F262.0000.0000.7262] # CJK COMPATIBILITY IDEOGRAPH-F946; QQC
+3235 ; [*02FF.0020.0004.3235][.FB40.0020.0004.7279][.F279.0000.0000.7279][*0300.0020.001F.3235] # PARENTHESIZED IDEOGRAPH SPECIAL; QQKN
+3295 ; [.FB40.0020.0006.7279][.F279.0000.0000.7279] # CIRCLED IDEOGRAPH SPECIAL; QQK
+2F924 ; [.FB40.0020.0002.7280][.F280.0000.0000.7280] # CJK COMPATIBILITY IDEOGRAPH-2F924; QQC
+2F925 ; [.FB40.0020.0002.7295][.F295.0000.0000.7295] # CJK COMPATIBILITY IDEOGRAPH-2F925; QQC
+2F5D ; [.FB40.0020.0004.72AC][.F2AC.0000.0000.72AC] # KANGXI RADICAL DOG; QQK
+2EA8 ; [.FB40.0020.0004.72AD][.F2AD.0000.0000.72AD] # CJK RADICAL DOG; QQK
+FA9F ; [.FB40.0020.0002.72AF][.F2AF.0000.0000.72AF] # CJK COMPATIBILITY IDEOGRAPH-FA9F; QQC
+F9FA ; [.FB40.0020.0002.72C0][.F2C0.0000.0000.72C0] # CJK COMPATIBILITY IDEOGRAPH-F9FA; QQC
+F92B ; [.FB40.0020.0002.72FC][.F2FC.0000.0000.72FC] # CJK COMPATIBILITY IDEOGRAPH-F92B; QQC
+FA16 ; [.FB40.0020.0002.732A][.F32A.0000.0000.732A] # CJK COMPATIBILITY IDEOGRAPH-FA16; QQC
+FAA0 ; [.FB40.0020.0002.732A][.F32A.0000.0000.732A] # CJK COMPATIBILITY IDEOGRAPH-FAA0; QQC
+F9A7 ; [.FB40.0020.0002.7375][.F375.0000.0000.7375] # CJK COMPATIBILITY IDEOGRAPH-F9A7; QQC
+2F928 ; [.FB40.0020.0002.737A][.F37A.0000.0000.737A] # CJK COMPATIBILITY IDEOGRAPH-2F928; QQC
+2F5E ; [.FB40.0020.0004.7384][.F384.0000.0000.7384] # KANGXI RADICAL PROFOUND; QQK
+F961 ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F961; QQC
+F9DB ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F9DB; QQC
+2F5F ; [.FB40.0020.0004.7389][.F389.0000.0000.7389] # KANGXI RADICAL JADE; QQK
+2F929 ; [.FB40.0020.0002.738B][.F38B.0000.0000.738B] # CJK COMPATIBILITY IDEOGRAPH-2F929; QQC
+2EA9 ; [.FB40.0020.0004.738B][.F38B.0000.0000.738B][.0000.0159.001F.2EA9] # CJK RADICAL JADE; QQKN
+2F92B ; [.FB40.0020.0002.73A5][.F3A5.0000.0000.73A5] # CJK COMPATIBILITY IDEOGRAPH-2F92B; QQC
+F9AD ; [.FB40.0020.0002.73B2][.F3B2.0000.0000.73B2] # CJK COMPATIBILITY IDEOGRAPH-F9AD; QQC
+F917 ; [.FB40.0020.0002.73DE][.F3DE.0000.0000.73DE] # CJK COMPATIBILITY IDEOGRAPH-F917; QQC
+F9E4 ; [.FB40.0020.0002.7406][.F406.0000.0000.7406] # CJK COMPATIBILITY IDEOGRAPH-F9E4; QQC
+F9CC ; [.FB40.0020.0002.7409][.F409.0000.0000.7409] # CJK COMPATIBILITY IDEOGRAPH-F9CC; QQC
+FA4A ; [.FB40.0020.0002.7422][.F422.0000.0000.7422] # CJK COMPATIBILITY IDEOGRAPH-FA4A; QQC
+2F92E ; [.FB40.0020.0002.7447][.F447.0000.0000.7447] # CJK COMPATIBILITY IDEOGRAPH-2F92E; QQC
+2F92F ; [.FB40.0020.0002.745C][.F45C.0000.0000.745C] # CJK COMPATIBILITY IDEOGRAPH-2F92F; QQC
+F9AE ; [.FB40.0020.0002.7469][.F469.0000.0000.7469] # CJK COMPATIBILITY IDEOGRAPH-F9AE; QQC
+FAA1 ; [.FB40.0020.0002.7471][.F471.0000.0000.7471] # CJK COMPATIBILITY IDEOGRAPH-FAA1; QQC
+2F930 ; [.FB40.0020.0002.7471][.F471.0000.0000.7471] # CJK COMPATIBILITY IDEOGRAPH-2F930; QQC
+2F931 ; [.FB40.0020.0002.7485][.F485.0000.0000.7485] # CJK COMPATIBILITY IDEOGRAPH-2F931; QQC
+F994 ; [.FB40.0020.0002.7489][.F489.0000.0000.7489] # CJK COMPATIBILITY IDEOGRAPH-F994; QQC
+F9EF ; [.FB40.0020.0002.7498][.F498.0000.0000.7498] # CJK COMPATIBILITY IDEOGRAPH-F9EF; QQC
+2F932 ; [.FB40.0020.0002.74CA][.F4CA.0000.0000.74CA] # CJK COMPATIBILITY IDEOGRAPH-2F932; QQC
+2F60 ; [.FB40.0020.0004.74DC][.F4DC.0000.0000.74DC] # KANGXI RADICAL MELON; QQK
+2F61 ; [.FB40.0020.0004.74E6][.F4E6.0000.0000.74E6] # KANGXI RADICAL TILE; QQK
+FAA2 ; [.FB40.0020.0002.7506][.F506.0000.0000.7506] # CJK COMPATIBILITY IDEOGRAPH-FAA2; QQC
+2F62 ; [.FB40.0020.0004.7518][.F518.0000.0000.7518] # KANGXI RADICAL SWEET; QQK
+2F63 ; [.FB40.0020.0004.751F][.F51F.0000.0000.751F] # KANGXI RADICAL LIFE; QQK
+1F222 ; [.FB40.0020.001C.751F][.F51F.0000.0000.751F] # SQUARED CJK UNIFIED IDEOGRAPH-751F; QQK
+2F934 ; [.FB40.0020.0002.7524][.F524.0000.0000.7524] # CJK COMPATIBILITY IDEOGRAPH-2F934; QQC
+2F64 ; [.FB40.0020.0004.7528][.F528.0000.0000.7528] # KANGXI RADICAL USE; QQK
+2F65 ; [.FB40.0020.0004.7530][.F530.0000.0000.7530] # KANGXI RADICAL FIELD; QQK
+3199 ; [.FB40.0020.0014.7532][.F532.0000.0000.7532] # IDEOGRAPHIC ANNOTATION FIRST MARK; QQK
+329A ; [.FB40.0020.0006.7537][.F537.0000.0000.7537] # CIRCLED IDEOGRAPH MALE; QQK
+FAA3 ; [.FB40.0020.0002.753B][.F53B.0000.0000.753B] # CJK COMPATIBILITY IDEOGRAPH-FAA3; QQC
+2F936 ; [.FB40.0020.0002.753E][.F53E.0000.0000.753E] # CJK COMPATIBILITY IDEOGRAPH-2F936; QQC
+F9CD ; [.FB40.0020.0002.7559][.F559.0000.0000.7559] # CJK COMPATIBILITY IDEOGRAPH-F9CD; QQC
+F976 ; [.FB40.0020.0002.7565][.F565.0000.0000.7565] # CJK COMPATIBILITY IDEOGRAPH-F976; QQC
+F962 ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-F962; QQC
+2F938 ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-2F938; QQC
+2F66 ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B] # KANGXI RADICAL BOLT OF CLOTH; QQK
+2EAA ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B][.0000.0159.001F.2EAA] # CJK RADICAL BOLT OF CLOTH; QQKN
+2F67 ; [.FB40.0020.0004.7592][.F592.0000.0000.7592] # KANGXI RADICAL SICKNESS; QQK
+F9E5 ; [.FB40.0020.0002.75E2][.F5E2.0000.0000.75E2] # CJK COMPATIBILITY IDEOGRAPH-F9E5; QQC
+2F93A ; [.FB40.0020.0002.7610][.F610.0000.0000.7610] # CJK COMPATIBILITY IDEOGRAPH-2F93A; QQC
+FAA4 ; [.FB40.0020.0002.761D][.F61D.0000.0000.761D] # CJK COMPATIBILITY IDEOGRAPH-FAA4; QQC
+FAA5 ; [.FB40.0020.0002.761F][.F61F.0000.0000.761F] # CJK COMPATIBILITY IDEOGRAPH-FAA5; QQC
+F9C1 ; [.FB40.0020.0002.7642][.F642.0000.0000.7642] # CJK COMPATIBILITY IDEOGRAPH-F9C1; QQC
+F90E ; [.FB40.0020.0002.7669][.F669.0000.0000.7669] # CJK COMPATIBILITY IDEOGRAPH-F90E; QQC
+2F68 ; [.FB40.0020.0004.7676][.F676.0000.0000.7676] # KANGXI RADICAL DOTTED TENT; QQK
+2F69 ; [.FB40.0020.0004.767D][.F67D.0000.0000.767D] # KANGXI RADICAL WHITE; QQK
+2F6A ; [.FB40.0020.0004.76AE][.F6AE.0000.0000.76AE] # KANGXI RADICAL SKIN; QQK
+2F6B ; [.FB40.0020.0004.76BF][.F6BF.0000.0000.76BF] # KANGXI RADICAL DISH; QQK
+FA17 ; [.FB40.0020.0002.76CA][.F6CA.0000.0000.76CA] # CJK COMPATIBILITY IDEOGRAPH-FA17; QQC
+FAA6 ; [.FB40.0020.0002.76CA][.F6CA.0000.0000.76CA] # CJK COMPATIBILITY IDEOGRAPH-FAA6; QQC
+1F246 ; [*0347.0020.0004.1F246][.FB40.0020.0004.76D7][.F6D7.0000.0000.76D7][*0348.0020.001F.1F246] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7; QQKN
+FAA7 ; [.FB40.0020.0002.76DB][.F6DB.0000.0000.76DB] # CJK COMPATIBILITY IDEOGRAPH-FAA7; QQC
+323C ; [*02FF.0020.0004.323C][.FB40.0020.0004.76E3][.F6E3.0000.0000.76E3][*0300.0020.001F.323C] # PARENTHESIZED IDEOGRAPH SUPERVISE; QQKN
+32AC ; [.FB40.0020.0006.76E3][.F6E3.0000.0000.76E3] # CIRCLED IDEOGRAPH SUPERVISE; QQK
+F933 ; [.FB40.0020.0002.76E7][.F6E7.0000.0000.76E7] # CJK COMPATIBILITY IDEOGRAPH-F933; QQC
+2F6C ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE] # KANGXI RADICAL EYE; QQK
+2EAB ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE][.0000.0159.001F.2EAB] # CJK RADICAL EYE; QQKN
+FAA8 ; [.FB40.0020.0002.76F4][.F6F4.0000.0000.76F4] # CJK COMPATIBILITY IDEOGRAPH-FAA8; QQC
+2F940 ; [.FB40.0020.0002.76F4][.F6F4.0000.0000.76F4] # CJK COMPATIBILITY IDEOGRAPH-2F940; QQC
+F96D ; [.FB40.0020.0002.7701][.F701.0000.0000.7701] # CJK COMPATIBILITY IDEOGRAPH-F96D; QQC
+2F945 ; [.FB40.0020.0002.771E][.F71E.0000.0000.771E] # CJK COMPATIBILITY IDEOGRAPH-2F945; QQC
+2F946 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F946; QQC
+2F947 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F947; QQC
+FAAA ; [.FB40.0020.0002.7740][.F740.0000.0000.7740] # CJK COMPATIBILITY IDEOGRAPH-FAAA; QQC
+FAA9 ; [.FB40.0020.0002.774A][.F74A.0000.0000.774A] # CJK COMPATIBILITY IDEOGRAPH-FAA9; QQC
+2F948 ; [.FB40.0020.0002.774A][.F74A.0000.0000.774A] # CJK COMPATIBILITY IDEOGRAPH-2F948; QQC
+2F94A ; [.FB40.0020.0002.778B][.F78B.0000.0000.778B] # CJK COMPATIBILITY IDEOGRAPH-2F94A; QQC
+FA9D ; [.FB40.0020.0002.77A7][.F7A7.0000.0000.77A7] # CJK COMPATIBILITY IDEOGRAPH-FA9D; QQC
+2F6D ; [.FB40.0020.0004.77DB][.F7DB.0000.0000.77DB] # KANGXI RADICAL SPEAR; QQK
+2F6E ; [.FB40.0020.0004.77E2][.F7E2.0000.0000.77E2] # KANGXI RADICAL ARROW; QQK
+2F6F ; [.FB40.0020.0004.77F3][.F7F3.0000.0000.77F3] # KANGXI RADICAL STONE; QQK
+2F94E ; [.FB40.0020.0002.784E][.F84E.0000.0000.784E] # CJK COMPATIBILITY IDEOGRAPH-2F94E; QQC
+F9CE ; [.FB40.0020.0002.786B][.F86B.0000.0000.786B] # CJK COMPATIBILITY IDEOGRAPH-F9CE; QQC
+F93B ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-F93B; QQC
+2F94F ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-2F94F; QQC
+FA4B ; [.FB40.0020.0002.7891][.F891.0000.0000.7891] # CJK COMPATIBILITY IDEOGRAPH-FA4B; QQC
+F947 ; [.FB40.0020.0002.78CA][.F8CA.0000.0000.78CA] # CJK COMPATIBILITY IDEOGRAPH-F947; QQC
+FAAB ; [.FB40.0020.0002.78CC][.F8CC.0000.0000.78CC] # CJK COMPATIBILITY IDEOGRAPH-FAAB; QQC
+2F950 ; [.FB40.0020.0002.78CC][.F8CC.0000.0000.78CC] # CJK COMPATIBILITY IDEOGRAPH-2F950; QQC
+F964 ; [.FB40.0020.0002.78FB][.F8FB.0000.0000.78FB] # CJK COMPATIBILITY IDEOGRAPH-F964; QQC
+F985 ; [.FB40.0020.0002.792A][.F92A.0000.0000.792A] # CJK COMPATIBILITY IDEOGRAPH-F985; QQC
+2F70 ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A] # KANGXI RADICAL SPIRIT; QQK
+2EAC ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A][.0000.0159.001F.2EAC] # CJK RADICAL SPIRIT ONE; QQKN
+2EAD ; [.FB40.0020.0004.793B][.F93B.0000.0000.793B] # CJK RADICAL SPIRIT TWO; QQK
+FA18 ; [.FB40.0020.0002.793C][.F93C.0000.0000.793C] # CJK COMPATIBILITY IDEOGRAPH-FA18; QQC
+FA4C ; [.FB40.0020.0002.793E][.F93E.0000.0000.793E] # CJK COMPATIBILITY IDEOGRAPH-FA4C; QQC
+3233 ; [*02FF.0020.0004.3233][.FB40.0020.0004.793E][.F93E.0000.0000.793E][*0300.0020.001F.3233] # PARENTHESIZED IDEOGRAPH SOCIETY; QQKN
+3293 ; [.FB40.0020.0006.793E][.F93E.0000.0000.793E] # CIRCLED IDEOGRAPH SOCIETY; QQK
+FA4E ; [.FB40.0020.0002.7948][.F948.0000.0000.7948] # CJK COMPATIBILITY IDEOGRAPH-FA4E; QQC
+FA4D ; [.FB40.0020.0002.7949][.F949.0000.0000.7949] # CJK COMPATIBILITY IDEOGRAPH-FA4D; QQC
+FA4F ; [.FB40.0020.0002.7950][.F950.0000.0000.7950] # CJK COMPATIBILITY IDEOGRAPH-FA4F; QQC
+FA50 ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-FA50; QQC
+2F953 ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-2F953; QQC
+FA51 ; [.FB40.0020.0002.795D][.F95D.0000.0000.795D] # CJK COMPATIBILITY IDEOGRAPH-FA51; QQC
+3237 ; [*02FF.0020.0004.3237][.FB40.0020.0004.795D][.F95D.0000.0000.795D][*0300.0020.001F.3237] # PARENTHESIZED IDEOGRAPH CONGRATULATION; QQKN
+3297 ; [.FB40.0020.0006.795D][.F95D.0000.0000.795D] # CIRCLED IDEOGRAPH CONGRATULATION; QQK
+FA19 ; [.FB40.0020.0002.795E][.F95E.0000.0000.795E] # CJK COMPATIBILITY IDEOGRAPH-FA19; QQC
+FA1A ; [.FB40.0020.0002.7965][.F965.0000.0000.7965] # CJK COMPATIBILITY IDEOGRAPH-FA1A; QQC
+3240 ; [*02FF.0020.0004.3240][.FB40.0020.0004.796D][.F96D.0000.0000.796D][*0300.0020.001F.3240] # PARENTHESIZED IDEOGRAPH FESTIVAL; QQKN
+F93C ; [.FB40.0020.0002.797F][.F97F.0000.0000.797F] # CJK COMPATIBILITY IDEOGRAPH-F93C; QQC
+FA52 ; [.FB40.0020.0002.798D][.F98D.0000.0000.798D] # CJK COMPATIBILITY IDEOGRAPH-FA52; QQC
+FA53 ; [.FB40.0020.0002.798E][.F98E.0000.0000.798E] # CJK COMPATIBILITY IDEOGRAPH-FA53; QQC
+FA1B ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-FA1B; QQC
+2F956 ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-2F956; QQC
+F9B6 ; [.FB40.0020.0002.79AE][.F9AE.0000.0000.79AE] # CJK COMPATIBILITY IDEOGRAPH-F9B6; QQC
+2F71 ; [.FB40.0020.0004.79B8][.F9B8.0000.0000.79B8] # KANGXI RADICAL TRACK; QQK
+2F72 ; [.FB40.0020.0004.79BE][.F9BE.0000.0000.79BE] # KANGXI RADICAL GRAIN; QQK
+F995 ; [.FB40.0020.0002.79CA][.F9CA.0000.0000.79CA] # CJK COMPATIBILITY IDEOGRAPH-F995; QQC
+3299 ; [.FB40.0020.0006.79D8][.F9D8.0000.0000.79D8] # CIRCLED IDEOGRAPH SECRET; QQK
+2F957 ; [.FB40.0020.0002.79EB][.F9EB.0000.0000.79EB] # CJK COMPATIBILITY IDEOGRAPH-2F957; QQC
+F956 ; [.FB40.0020.0002.7A1C][.FA1C.0000.0000.7A1C] # CJK COMPATIBILITY IDEOGRAPH-F956; QQC
+FA54 ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-FA54; QQC
+2F959 ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-2F959; QQC
+2F95A ; [.FB40.0020.0002.7A4A][.FA4A.0000.0000.7A4A] # CJK COMPATIBILITY IDEOGRAPH-2F95A; QQC
+2F95B ; [.FB40.0020.0002.7A4F][.FA4F.0000.0000.7A4F] # CJK COMPATIBILITY IDEOGRAPH-2F95B; QQC
+2F73 ; [.FB40.0020.0004.7A74][.FA74.0000.0000.7A74] # KANGXI RADICAL CAVE; QQK
+FA55 ; [.FB40.0020.0002.7A81][.FA81.0000.0000.7A81] # CJK COMPATIBILITY IDEOGRAPH-FA55; QQC
+FAAC ; [.FB40.0020.0002.7AB1][.FAB1.0000.0000.7AB1] # CJK COMPATIBILITY IDEOGRAPH-FAAC; QQC
+F9F7 ; [.FB40.0020.0002.7ACB][.FACB.0000.0000.7ACB] # CJK COMPATIBILITY IDEOGRAPH-F9F7; QQC
+2F74 ; [.FB40.0020.0004.7ACB][.FACB.0000.0000.7ACB] # KANGXI RADICAL STAND; QQK
+2F95F ; [.FB40.0020.0002.7AEE][.FAEE.0000.0000.7AEE] # CJK COMPATIBILITY IDEOGRAPH-2F95F; QQC
+2F75 ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9] # KANGXI RADICAL BAMBOO; QQK
+2EAE ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9][.0000.0159.001F.2EAE] # CJK RADICAL BAMBOO; QQKN
+F9F8 ; [.FB40.0020.0002.7B20][.FB20.0000.0000.7B20] # CJK COMPATIBILITY IDEOGRAPH-F9F8; QQC
+3247 ; [.FB40.0020.0006.7B8F][.FB8F.0000.0000.7B8F] # CIRCLED IDEOGRAPH KOTO; QQK
+FA56 ; [.FB40.0020.0002.7BC0][.FBC0.0000.0000.7BC0] # CJK COMPATIBILITY IDEOGRAPH-FA56; QQC
+FAAD ; [.FB40.0020.0002.7BC0][.FBC0.0000.0000.7BC0] # CJK COMPATIBILITY IDEOGRAPH-FAAD; QQC
+2F962 ; [.FB40.0020.0002.7BC6][.FBC6.0000.0000.7BC6] # CJK COMPATIBILITY IDEOGRAPH-2F962; QQC
+2F963 ; [.FB40.0020.0002.7BC9][.FBC9.0000.0000.7BC9] # CJK COMPATIBILITY IDEOGRAPH-2F963; QQC
+F9A6 ; [.FB40.0020.0002.7C3E][.FC3E.0000.0000.7C3E] # CJK COMPATIBILITY IDEOGRAPH-F9A6; QQC
+F944 ; [.FB40.0020.0002.7C60][.FC60.0000.0000.7C60] # CJK COMPATIBILITY IDEOGRAPH-F944; QQC
+2F76 ; [.FB40.0020.0004.7C73][.FC73.0000.0000.7C73] # KANGXI RADICAL RICE; QQK
+FAAE ; [.FB40.0020.0002.7C7B][.FC7B.0000.0000.7C7B] # CJK COMPATIBILITY IDEOGRAPH-FAAE; QQC
+F9F9 ; [.FB40.0020.0002.7C92][.FC92.0000.0000.7C92] # CJK COMPATIBILITY IDEOGRAPH-F9F9; QQC
+FA1D ; [.FB40.0020.0002.7CBE][.FCBE.0000.0000.7CBE] # CJK COMPATIBILITY IDEOGRAPH-FA1D; QQC
+2F966 ; [.FB40.0020.0002.7CD2][.FCD2.0000.0000.7CD2] # CJK COMPATIBILITY IDEOGRAPH-2F966; QQC
+FA03 ; [.FB40.0020.0002.7CD6][.FCD6.0000.0000.7CD6] # CJK COMPATIBILITY IDEOGRAPH-FA03; QQC
+2F969 ; [.FB40.0020.0002.7CE3][.FCE3.0000.0000.7CE3] # CJK COMPATIBILITY IDEOGRAPH-2F969; QQC
+F97B ; [.FB40.0020.0002.7CE7][.FCE7.0000.0000.7CE7] # CJK COMPATIBILITY IDEOGRAPH-F97B; QQC
+2F968 ; [.FB40.0020.0002.7CE8][.FCE8.0000.0000.7CE8] # CJK COMPATIBILITY IDEOGRAPH-2F968; QQC
+2F77 ; [.FB40.0020.0004.7CF8][.FCF8.0000.0000.7CF8] # KANGXI RADICAL SILK; QQK
+2EAF ; [.FB40.0020.0004.7CF9][.FCF9.0000.0000.7CF9] # CJK RADICAL SILK; QQK
+2F96A ; [.FB40.0020.0002.7D00][.FD00.0000.0000.7D00] # CJK COMPATIBILITY IDEOGRAPH-2F96A; QQC
+F9CF ; [.FB40.0020.0002.7D10][.FD10.0000.0000.7D10] # CJK COMPATIBILITY IDEOGRAPH-F9CF; QQC
+F96A ; [.FB40.0020.0002.7D22][.FD22.0000.0000.7D22] # CJK COMPATIBILITY IDEOGRAPH-F96A; QQC
+F94F ; [.FB40.0020.0002.7D2F][.FD2F.0000.0000.7D2F] # CJK COMPATIBILITY IDEOGRAPH-F94F; QQC
+1F221 ; [.FB40.0020.001C.7D42][.FD42.0000.0000.7D42] # SQUARED CJK UNIFIED IDEOGRAPH-7D42; QQK
+FAAF ; [.FB40.0020.0002.7D5B][.FD5B.0000.0000.7D5B] # CJK COMPATIBILITY IDEOGRAPH-FAAF; QQC
+2F96C ; [.FB40.0020.0002.7D63][.FD63.0000.0000.7D63] # CJK COMPATIBILITY IDEOGRAPH-2F96C; QQC
+F93D ; [.FB40.0020.0002.7DA0][.FDA0.0000.0000.7DA0] # CJK COMPATIBILITY IDEOGRAPH-F93D; QQC
+F957 ; [.FB40.0020.0002.7DBE][.FDBE.0000.0000.7DBE] # CJK COMPATIBILITY IDEOGRAPH-F957; QQC
+2F96E ; [.FB40.0020.0002.7DC7][.FDC7.0000.0000.7DC7] # CJK COMPATIBILITY IDEOGRAPH-2F96E; QQC
+F996 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-F996; QQC
+FA57 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-FA57; QQC
+FAB0 ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-FAB0; QQC
+2F96F ; [.FB40.0020.0002.7E02][.FE02.0000.0000.7E02] # CJK COMPATIBILITY IDEOGRAPH-2F96F; QQC
+FA58 ; [.FB40.0020.0002.7E09][.FE09.0000.0000.7E09] # CJK COMPATIBILITY IDEOGRAPH-FA58; QQC
+F950 ; [.FB40.0020.0002.7E37][.FE37.0000.0000.7E37] # CJK COMPATIBILITY IDEOGRAPH-F950; QQC
+FA59 ; [.FB40.0020.0002.7E41][.FE41.0000.0000.7E41] # CJK COMPATIBILITY IDEOGRAPH-FA59; QQC
+2F970 ; [.FB40.0020.0002.7E45][.FE45.0000.0000.7E45] # CJK COMPATIBILITY IDEOGRAPH-2F970; QQC
+2EB0 ; [.FB40.0020.0004.7E9F][.FE9F.0000.0000.7E9F] # CJK RADICAL C-SIMPLIFIED SILK; QQK
+2F78 ; [.FB40.0020.0004.7F36][.FF36.0000.0000.7F36] # KANGXI RADICAL JAR; QQK
+FAB1 ; [.FB40.0020.0002.7F3E][.FF3E.0000.0000.7F3E] # CJK COMPATIBILITY IDEOGRAPH-FAB1; QQC
+2F79 ; [.FB40.0020.0004.7F51][.FF51.0000.0000.7F51] # KANGXI RADICAL NET; QQK
+2EB2 ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52] # CJK RADICAL NET TWO; QQK
+2EB5 ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52][.0000.0159.001F.2EB5] # CJK RADICAL MESH; QQKN
+2EB1 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53] # CJK RADICAL NET ONE; QQK
+2EB3 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.0159.001F.2EB3] # CJK RADICAL NET THREE; QQKN
+2EB4 ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.015A.001F.2EB4] # CJK RADICAL NET FOUR; QQKN
+FA5A ; [.FB40.0020.0002.7F72][.FF72.0000.0000.7F72] # CJK COMPATIBILITY IDEOGRAPH-FA5A; QQC
+F9E6 ; [.FB40.0020.0002.7F79][.FF79.0000.0000.7F79] # CJK COMPATIBILITY IDEOGRAPH-F9E6; QQC
+2F976 ; [.FB40.0020.0002.7F7A][.FF7A.0000.0000.7F7A] # CJK COMPATIBILITY IDEOGRAPH-2F976; QQC
+F90F ; [.FB40.0020.0002.7F85][.FF85.0000.0000.7F85] # CJK COMPATIBILITY IDEOGRAPH-F90F; QQC
+2F7A ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A] # KANGXI RADICAL SHEEP; QQK
+2EB6 ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.0159.001F.2EB6] # CJK RADICAL SHEEP; QQKN
+2EB7 ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.015A.001F.2EB7] # CJK RADICAL RAM; QQKN
+2EB8 ; [.FB40.0020.0004.7F8B][.FF8B.0000.0000.7F8B] # CJK RADICAL EWE; QQK
+2F978 ; [.FB40.0020.0002.7F95][.FF95.0000.0000.7F95] # CJK COMPATIBILITY IDEOGRAPH-2F978; QQC
+F9AF ; [.FB40.0020.0002.7F9A][.FF9A.0000.0000.7F9A] # CJK COMPATIBILITY IDEOGRAPH-F9AF; QQC
+FA1E ; [.FB40.0020.0002.7FBD][.FFBD.0000.0000.7FBD] # CJK COMPATIBILITY IDEOGRAPH-FA1E; QQC
+2F7B ; [.FB40.0020.0004.7FBD][.FFBD.0000.0000.7FBD] # KANGXI RADICAL FEATHER; QQK
+2F979 ; [.FB40.0020.0002.7FFA][.FFFA.0000.0000.7FFA] # CJK COMPATIBILITY IDEOGRAPH-2F979; QQC
+F934 ; [.FB41.0020.0002.8001][.8001.0000.0000.8001] # CJK COMPATIBILITY IDEOGRAPH-F934; QQC
+2F7C ; [.FB41.0020.0004.8001][.8001.0000.0000.8001] # KANGXI RADICAL OLD; QQK
+2EB9 ; [.FB41.0020.0004.8002][.8002.0000.0000.8002] # CJK RADICAL OLD; QQK
+FA5B ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-FA5B; QQC
+FAB2 ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-FAB2; QQC
+2F97A ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-2F97A; QQC
+2F7D ; [.FB41.0020.0004.800C][.800C.0000.0000.800C] # KANGXI RADICAL AND; QQK
+2F7E ; [.FB41.0020.0004.8012][.8012.0000.0000.8012] # KANGXI RADICAL PLOW; QQK
+2F7F ; [.FB41.0020.0004.8033][.8033.0000.0000.8033] # KANGXI RADICAL EAR; QQK
+F9B0 ; [.FB41.0020.0002.8046][.8046.0000.0000.8046] # CJK COMPATIBILITY IDEOGRAPH-F9B0; QQC
+2F97D ; [.FB41.0020.0002.8060][.8060.0000.0000.8060] # CJK COMPATIBILITY IDEOGRAPH-2F97D; QQC
+F997 ; [.FB41.0020.0002.806F][.806F.0000.0000.806F] # CJK COMPATIBILITY IDEOGRAPH-F997; QQC
+2F97F ; [.FB41.0020.0002.8070][.8070.0000.0000.8070] # CJK COMPATIBILITY IDEOGRAPH-2F97F; QQC
+F945 ; [.FB41.0020.0002.807E][.807E.0000.0000.807E] # CJK COMPATIBILITY IDEOGRAPH-F945; QQC
+2F80 ; [.FB41.0020.0004.807F][.807F.0000.0000.807F] # KANGXI RADICAL BRUSH; QQK
+2EBB ; [.FB41.0020.0004.807F][.807F.0000.0000.807F][.0000.0159.001F.2EBB] # CJK RADICAL BRUSH TWO; QQKN
+2EBA ; [.FB41.0020.0004.8080][.8080.0000.0000.8080] # CJK RADICAL BRUSH ONE; QQK
+2F81 ; [.FB41.0020.0004.8089][.8089.0000.0000.8089] # KANGXI RADICAL MEAT; QQK
+2EBC ; [.FB41.0020.0004.8089][.8089.0000.0000.8089][.0000.0159.001F.2EBC] # CJK RADICAL MEAT; QQKN
+F953 ; [.FB41.0020.0002.808B][.808B.0000.0000.808B] # CJK COMPATIBILITY IDEOGRAPH-F953; QQC
+2F8D6 ; [.FB41.0020.0002.80AD][.80AD.0000.0000.80AD] # CJK COMPATIBILITY IDEOGRAPH-2F8D6; QQC
+2F982 ; [.FB41.0020.0002.80B2][.80B2.0000.0000.80B2] # CJK COMPATIBILITY IDEOGRAPH-2F982; QQC
+2F983 ; [.FB41.0020.0002.8103][.8103.0000.0000.8103] # CJK COMPATIBILITY IDEOGRAPH-2F983; QQC
+2F985 ; [.FB41.0020.0002.813E][.813E.0000.0000.813E] # CJK COMPATIBILITY IDEOGRAPH-2F985; QQC
+F926 ; [.FB41.0020.0002.81D8][.81D8.0000.0000.81D8] # CJK COMPATIBILITY IDEOGRAPH-F926; QQC
+2F82 ; [.FB41.0020.0004.81E3][.81E3.0000.0000.81E3] # KANGXI RADICAL MINISTER; QQK
+F9F6 ; [.FB41.0020.0002.81E8][.81E8.0000.0000.81E8] # CJK COMPATIBILITY IDEOGRAPH-F9F6; QQC
+2F83 ; [.FB41.0020.0004.81EA][.81EA.0000.0000.81EA] # KANGXI RADICAL SELF; QQK
+3242 ; [*02FF.0020.0004.3242][.FB41.0020.0004.81EA][.81EA.0000.0000.81EA][*0300.0020.001F.3242] # PARENTHESIZED IDEOGRAPH SELF; QQKN
+FA5C ; [.FB41.0020.0002.81ED][.81ED.0000.0000.81ED] # CJK COMPATIBILITY IDEOGRAPH-FA5C; QQC
+2F84 ; [.FB41.0020.0004.81F3][.81F3.0000.0000.81F3] # KANGXI RADICAL ARRIVE; QQK
+3243 ; [*02FF.0020.0004.3243][.FB41.0020.0004.81F3][.81F3.0000.0000.81F3][*0300.0020.001F.3243] # PARENTHESIZED IDEOGRAPH REACH; QQKN
+2F85 ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC] # KANGXI RADICAL MORTAR; QQK
+2EBD ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC][.0000.0159.001F.2EBD] # CJK RADICAL MORTAR; QQKN
+2F893 ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F893; QQC
+2F98B ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F98B; QQC
+2F98C ; [.FB41.0020.0002.8204][.8204.0000.0000.8204] # CJK COMPATIBILITY IDEOGRAPH-2F98C; QQC
+2F86 ; [.FB41.0020.0004.820C][.820C.0000.0000.820C] # KANGXI RADICAL TONGUE; QQK
+FA6D ; [.FB41.0020.0002.8218][.8218.0000.0000.8218] # CJK COMPATIBILITY IDEOGRAPH-FA6D; QQC
+2F87 ; [.FB41.0020.0004.821B][.821B.0000.0000.821B] # KANGXI RADICAL OPPOSE; QQK
+2F88 ; [.FB41.0020.0004.821F][.821F.0000.0000.821F] # KANGXI RADICAL BOAT; QQK
+2F89 ; [.FB41.0020.0004.826E][.826E.0000.0000.826E] # KANGXI RADICAL STOPPING; QQK
+F97C ; [.FB41.0020.0002.826F][.826F.0000.0000.826F] # CJK COMPATIBILITY IDEOGRAPH-F97C; QQC
+2F8A ; [.FB41.0020.0004.8272][.8272.0000.0000.8272] # KANGXI RADICAL COLOR; QQK
+2F8B ; [.FB41.0020.0004.8278][.8278.0000.0000.8278] # KANGXI RADICAL GRASS; QQK
+FA5D ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5D; QQC
+FA5E ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5E; QQC
+2EBE ; [.FB41.0020.0004.8279][.8279.0000.0000.8279] # CJK RADICAL GRASS ONE; QQK
+2EBF ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.0159.001F.2EBF] # CJK RADICAL GRASS TWO; QQKN
+2EC0 ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.015A.001F.2EC0] # CJK RADICAL GRASS THREE; QQKN
+2F990 ; [.FB41.0020.0002.828B][.828B.0000.0000.828B] # CJK COMPATIBILITY IDEOGRAPH-2F990; QQC
+2F98F ; [.FB41.0020.0002.8291][.8291.0000.0000.8291] # CJK COMPATIBILITY IDEOGRAPH-2F98F; QQC
+2F991 ; [.FB41.0020.0002.829D][.829D.0000.0000.829D] # CJK COMPATIBILITY IDEOGRAPH-2F991; QQC
+2F993 ; [.FB41.0020.0002.82B1][.82B1.0000.0000.82B1] # CJK COMPATIBILITY IDEOGRAPH-2F993; QQC
+2F994 ; [.FB41.0020.0002.82B3][.82B3.0000.0000.82B3] # CJK COMPATIBILITY IDEOGRAPH-2F994; QQC
+2F995 ; [.FB41.0020.0002.82BD][.82BD.0000.0000.82BD] # CJK COMPATIBILITY IDEOGRAPH-2F995; QQC
+F974 ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-F974; QQC
+2F998 ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-2F998; QQC
+2F996 ; [.FB41.0020.0002.82E6][.82E6.0000.0000.82E6] # CJK COMPATIBILITY IDEOGRAPH-2F996; QQC
+2F999 ; [.FB41.0020.0002.831D][.831D.0000.0000.831D] # CJK COMPATIBILITY IDEOGRAPH-2F999; QQC
+2F99C ; [.FB41.0020.0002.8323][.8323.0000.0000.8323] # CJK COMPATIBILITY IDEOGRAPH-2F99C; QQC
+F9FE ; [.FB41.0020.0002.8336][.8336.0000.0000.8336] # CJK COMPATIBILITY IDEOGRAPH-F9FE; QQC
+FAB3 ; [.FB41.0020.0002.8352][.8352.0000.0000.8352] # CJK COMPATIBILITY IDEOGRAPH-FAB3; QQC
+2F9A0 ; [.FB41.0020.0002.8353][.8353.0000.0000.8353] # CJK COMPATIBILITY IDEOGRAPH-2F9A0; QQC
+2F99A ; [.FB41.0020.0002.8363][.8363.0000.0000.8363] # CJK COMPATIBILITY IDEOGRAPH-2F99A; QQC
+2F99B ; [.FB41.0020.0002.83AD][.83AD.0000.0000.83AD] # CJK COMPATIBILITY IDEOGRAPH-2F99B; QQC
+2F99D ; [.FB41.0020.0002.83BD][.83BD.0000.0000.83BD] # CJK COMPATIBILITY IDEOGRAPH-2F99D; QQC
+F93E ; [.FB41.0020.0002.83C9][.83C9.0000.0000.83C9] # CJK COMPATIBILITY IDEOGRAPH-F93E; QQC
+2F9A1 ; [.FB41.0020.0002.83CA][.83CA.0000.0000.83CA] # CJK COMPATIBILITY IDEOGRAPH-2F9A1; QQC
+2F9A2 ; [.FB41.0020.0002.83CC][.83CC.0000.0000.83CC] # CJK COMPATIBILITY IDEOGRAPH-2F9A2; QQC
+2F9A3 ; [.FB41.0020.0002.83DC][.83DC.0000.0000.83DC] # CJK COMPATIBILITY IDEOGRAPH-2F9A3; QQC
+2F99E ; [.FB41.0020.0002.83E7][.83E7.0000.0000.83E7] # CJK COMPATIBILITY IDEOGRAPH-2F99E; QQC
+FAB4 ; [.FB41.0020.0002.83EF][.83EF.0000.0000.83EF] # CJK COMPATIBILITY IDEOGRAPH-FAB4; QQC
+F958 ; [.FB41.0020.0002.83F1][.83F1.0000.0000.83F1] # CJK COMPATIBILITY IDEOGRAPH-F958; QQC
+F918 ; [.FB41.0020.0002.843D][.843D.0000.0000.843D] # CJK COMPATIBILITY IDEOGRAPH-F918; QQC
+F96E ; [.FB41.0020.0002.8449][.8449.0000.0000.8449] # CJK COMPATIBILITY IDEOGRAPH-F96E; QQC
+FA5F ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-FA5F; QQC
+2F99F ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-2F99F; QQC
+F999 ; [.FB41.0020.0002.84EE][.84EE.0000.0000.84EE] # CJK COMPATIBILITY IDEOGRAPH-F999; QQC
+2F9A8 ; [.FB41.0020.0002.84F1][.84F1.0000.0000.84F1] # CJK COMPATIBILITY IDEOGRAPH-2F9A8; QQC
+2F9A9 ; [.FB41.0020.0002.84F3][.84F3.0000.0000.84F3] # CJK COMPATIBILITY IDEOGRAPH-2F9A9; QQC
+F9C2 ; [.FB41.0020.0002.84FC][.84FC.0000.0000.84FC] # CJK COMPATIBILITY IDEOGRAPH-F9C2; QQC
+2F9AA ; [.FB41.0020.0002.8516][.8516.0000.0000.8516] # CJK COMPATIBILITY IDEOGRAPH-2F9AA; QQC
+2F9AC ; [.FB41.0020.0002.8564][.8564.0000.0000.8564] # CJK COMPATIBILITY IDEOGRAPH-2F9AC; QQC
+F923 ; [.FB41.0020.0002.85CD][.85CD.0000.0000.85CD] # CJK COMPATIBILITY IDEOGRAPH-F923; QQC
+F9F0 ; [.FB41.0020.0002.85FA][.85FA.0000.0000.85FA] # CJK COMPATIBILITY IDEOGRAPH-F9F0; QQC
+F935 ; [.FB41.0020.0002.8606][.8606.0000.0000.8606] # CJK COMPATIBILITY IDEOGRAPH-F935; QQC
+FA20 ; [.FB41.0020.0002.8612][.8612.0000.0000.8612] # CJK COMPATIBILITY IDEOGRAPH-FA20; QQC
+F91F ; [.FB41.0020.0002.862D][.862D.0000.0000.862D] # CJK COMPATIBILITY IDEOGRAPH-F91F; QQC
+F910 ; [.FB41.0020.0002.863F][.863F.0000.0000.863F] # CJK COMPATIBILITY IDEOGRAPH-F910; QQC
+2F8C ; [.FB41.0020.0004.864D][.864D.0000.0000.864D] # KANGXI RADICAL TIGER; QQK
+2EC1 ; [.FB41.0020.0004.864E][.864E.0000.0000.864E] # CJK RADICAL TIGER; QQK
+2F9B3 ; [.FB41.0020.0002.8650][.8650.0000.0000.8650] # CJK COMPATIBILITY IDEOGRAPH-2F9B3; QQC
+F936 ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-F936; QQC
+2F9B4 ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-2F9B4; QQC
+2F9B5 ; [.FB41.0020.0002.8667][.8667.0000.0000.8667] # CJK COMPATIBILITY IDEOGRAPH-2F9B5; QQC
+2F9B6 ; [.FB41.0020.0002.8669][.8669.0000.0000.8669] # CJK COMPATIBILITY IDEOGRAPH-2F9B6; QQC
+2F8D ; [.FB41.0020.0004.866B][.866B.0000.0000.866B] # KANGXI RADICAL INSECT; QQK
+2F9B8 ; [.FB41.0020.0002.8688][.8688.0000.0000.8688] # CJK COMPATIBILITY IDEOGRAPH-2F9B8; QQC
+2F9B7 ; [.FB41.0020.0002.86A9][.86A9.0000.0000.86A9] # CJK COMPATIBILITY IDEOGRAPH-2F9B7; QQC
+2F9BA ; [.FB41.0020.0002.86E2][.86E2.0000.0000.86E2] # CJK COMPATIBILITY IDEOGRAPH-2F9BA; QQC
+2F9B9 ; [.FB41.0020.0002.870E][.870E.0000.0000.870E] # CJK COMPATIBILITY IDEOGRAPH-2F9B9; QQC
+2F9BC ; [.FB41.0020.0002.8728][.8728.0000.0000.8728] # CJK COMPATIBILITY IDEOGRAPH-2F9BC; QQC
+2F9BD ; [.FB41.0020.0002.876B][.876B.0000.0000.876B] # CJK COMPATIBILITY IDEOGRAPH-2F9BD; QQC
+FAB5 ; [.FB41.0020.0002.8779][.8779.0000.0000.8779] # CJK COMPATIBILITY IDEOGRAPH-FAB5; QQC
+2F9BB ; [.FB41.0020.0002.8779][.8779.0000.0000.8779] # CJK COMPATIBILITY IDEOGRAPH-2F9BB; QQC
+2F9BE ; [.FB41.0020.0002.8786][.8786.0000.0000.8786] # CJK COMPATIBILITY IDEOGRAPH-2F9BE; QQC
+F911 ; [.FB41.0020.0002.87BA][.87BA.0000.0000.87BA] # CJK COMPATIBILITY IDEOGRAPH-F911; QQC
+2F9C0 ; [.FB41.0020.0002.87E1][.87E1.0000.0000.87E1] # CJK COMPATIBILITY IDEOGRAPH-2F9C0; QQC
+2F9C1 ; [.FB41.0020.0002.8801][.8801.0000.0000.8801] # CJK COMPATIBILITY IDEOGRAPH-2F9C1; QQC
+F927 ; [.FB41.0020.0002.881F][.881F.0000.0000.881F] # CJK COMPATIBILITY IDEOGRAPH-F927; QQC
+2F8E ; [.FB41.0020.0004.8840][.8840.0000.0000.8840] # KANGXI RADICAL BLOOD; QQK
+FA08 ; [.FB41.0020.0002.884C][.884C.0000.0000.884C] # CJK COMPATIBILITY IDEOGRAPH-FA08; QQC
+2F8F ; [.FB41.0020.0004.884C][.884C.0000.0000.884C] # KANGXI RADICAL WALK ENCLOSURE; QQK
+2F9C3 ; [.FB41.0020.0002.8860][.8860.0000.0000.8860] # CJK COMPATIBILITY IDEOGRAPH-2F9C3; QQC
+2F9C4 ; [.FB41.0020.0002.8863][.8863.0000.0000.8863] # CJK COMPATIBILITY IDEOGRAPH-2F9C4; QQC
+2F90 ; [.FB41.0020.0004.8863][.8863.0000.0000.8863] # KANGXI RADICAL CLOTHES; QQK
+2EC2 ; [.FB41.0020.0004.8864][.8864.0000.0000.8864] # CJK RADICAL CLOTHES; QQK
+F9A0 ; [.FB41.0020.0002.88C2][.88C2.0000.0000.88C2] # CJK COMPATIBILITY IDEOGRAPH-F9A0; QQC
+F9E7 ; [.FB41.0020.0002.88CF][.88CF.0000.0000.88CF] # CJK COMPATIBILITY IDEOGRAPH-F9E7; QQC
+2F9C6 ; [.FB41.0020.0002.88D7][.88D7.0000.0000.88D7] # CJK COMPATIBILITY IDEOGRAPH-2F9C6; QQC
+2F9C7 ; [.FB41.0020.0002.88DE][.88DE.0000.0000.88DE] # CJK COMPATIBILITY IDEOGRAPH-2F9C7; QQC
+F9E8 ; [.FB41.0020.0002.88E1][.88E1.0000.0000.88E1] # CJK COMPATIBILITY IDEOGRAPH-F9E8; QQC
+F912 ; [.FB41.0020.0002.88F8][.88F8.0000.0000.88F8] # CJK COMPATIBILITY IDEOGRAPH-F912; QQC
+2F9C9 ; [.FB41.0020.0002.88FA][.88FA.0000.0000.88FA] # CJK COMPATIBILITY IDEOGRAPH-2F9C9; QQC
+FA60 ; [.FB41.0020.0002.8910][.8910.0000.0000.8910] # CJK COMPATIBILITY IDEOGRAPH-FA60; QQC
+FAB6 ; [.FB41.0020.0002.8941][.8941.0000.0000.8941] # CJK COMPATIBILITY IDEOGRAPH-FAB6; QQC
+F924 ; [.FB41.0020.0002.8964][.8964.0000.0000.8964] # CJK COMPATIBILITY IDEOGRAPH-F924; QQC
+2F91 ; [.FB41.0020.0004.897E][.897E.0000.0000.897E] # KANGXI RADICAL WEST; QQK
+2EC4 ; [.FB41.0020.0004.897F][.897F.0000.0000.897F] # CJK RADICAL WEST TWO; QQK
+2EC3 ; [.FB41.0020.0004.8980][.8980.0000.0000.8980] # CJK RADICAL WEST ONE; QQK
+FAB7 ; [.FB41.0020.0002.8986][.8986.0000.0000.8986] # CJK COMPATIBILITY IDEOGRAPH-FAB7; QQC
+FA0A ; [.FB41.0020.0002.898B][.898B.0000.0000.898B] # CJK COMPATIBILITY IDEOGRAPH-FA0A; QQC
+2F92 ; [.FB41.0020.0004.898B][.898B.0000.0000.898B] # KANGXI RADICAL SEE; QQK
+FA61 ; [.FB41.0020.0002.8996][.8996.0000.0000.8996] # CJK COMPATIBILITY IDEOGRAPH-FA61; QQC
+FAB8 ; [.FB41.0020.0002.8996][.8996.0000.0000.8996] # CJK COMPATIBILITY IDEOGRAPH-FAB8; QQC
+2EC5 ; [.FB41.0020.0004.89C1][.89C1.0000.0000.89C1] # CJK RADICAL C-SIMPLIFIED SEE; QQK
+2EC6 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # CJK RADICAL SIMPLIFIED HORN; QQK
+2F93 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # KANGXI RADICAL HORN; QQK
+2EC7 ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2][.0000.0159.001F.2EC7] # CJK RADICAL HORN; QQKN
+1F216 ; [.FB41.0020.001C.89E3][.89E3.0000.0000.89E3] # SQUARED CJK UNIFIED IDEOGRAPH-89E3; QQK
+2F94 ; [.FB41.0020.0004.8A00][.8A00.0000.0000.8A00] # KANGXI RADICAL SPEECH; QQK
+2F9CF ; [.FB41.0020.0002.8AA0][.8AA0.0000.0000.8AA0] # CJK COMPATIBILITY IDEOGRAPH-2F9CF; QQC
+F96F ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F96F; QQC
+F9A1 ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F9A1; QQC
+FAB9 ; [.FB41.0020.0002.8ABF][.8ABF.0000.0000.8ABF] # CJK COMPATIBILITY IDEOGRAPH-FAB9; QQC
+FABB ; [.FB41.0020.0002.8ACB][.8ACB.0000.0000.8ACB] # CJK COMPATIBILITY IDEOGRAPH-FABB; QQC
+F97D ; [.FB41.0020.0002.8AD2][.8AD2.0000.0000.8AD2] # CJK COMPATIBILITY IDEOGRAPH-F97D; QQC
+F941 ; [.FB41.0020.0002.8AD6][.8AD6.0000.0000.8AD6] # CJK COMPATIBILITY IDEOGRAPH-F941; QQC
+FABE ; [.FB41.0020.0002.8AED][.8AED.0000.0000.8AED] # CJK COMPATIBILITY IDEOGRAPH-FABE; QQC
+2F9D0 ; [.FB41.0020.0002.8AED][.8AED.0000.0000.8AED] # CJK COMPATIBILITY IDEOGRAPH-2F9D0; QQC
+FA22 ; [.FB41.0020.0002.8AF8][.8AF8.0000.0000.8AF8] # CJK COMPATIBILITY IDEOGRAPH-FA22; QQC
+FABA ; [.FB41.0020.0002.8AF8][.8AF8.0000.0000.8AF8] # CJK COMPATIBILITY IDEOGRAPH-FABA; QQC
+F95D ; [.FB41.0020.0002.8AFE][.8AFE.0000.0000.8AFE] # CJK COMPATIBILITY IDEOGRAPH-F95D; QQC
+FABD ; [.FB41.0020.0002.8AFE][.8AFE.0000.0000.8AFE] # CJK COMPATIBILITY IDEOGRAPH-FABD; QQC
+FA62 ; [.FB41.0020.0002.8B01][.8B01.0000.0000.8B01] # CJK COMPATIBILITY IDEOGRAPH-FA62; QQC
+FABC ; [.FB41.0020.0002.8B01][.8B01.0000.0000.8B01] # CJK COMPATIBILITY IDEOGRAPH-FABC; QQC
+FA63 ; [.FB41.0020.0002.8B39][.8B39.0000.0000.8B39] # CJK COMPATIBILITY IDEOGRAPH-FA63; QQC
+FABF ; [.FB41.0020.0002.8B39][.8B39.0000.0000.8B39] # CJK COMPATIBILITY IDEOGRAPH-FABF; QQC
+F9FC ; [.FB41.0020.0002.8B58][.8B58.0000.0000.8B58] # CJK COMPATIBILITY IDEOGRAPH-F9FC; QQC
+F95A ; [.FB41.0020.0002.8B80][.8B80.0000.0000.8B80] # CJK COMPATIBILITY IDEOGRAPH-F95A; QQC
+FAC0 ; [.FB41.0020.0002.8B8A][.8B8A.0000.0000.8B8A] # CJK COMPATIBILITY IDEOGRAPH-FAC0; QQC
+2F9D1 ; [.FB41.0020.0002.8B8A][.8B8A.0000.0000.8B8A] # CJK COMPATIBILITY IDEOGRAPH-2F9D1; QQC
+2EC8 ; [.FB41.0020.0004.8BA0][.8BA0.0000.0000.8BA0] # CJK RADICAL C-SIMPLIFIED SPEECH; QQK
+2F95 ; [.FB41.0020.0004.8C37][.8C37.0000.0000.8C37] # KANGXI RADICAL VALLEY; QQK
+2F96 ; [.FB41.0020.0004.8C46][.8C46.0000.0000.8C46] # KANGXI RADICAL BEAN; QQK
+F900 ; [.FB41.0020.0002.8C48][.8C48.0000.0000.8C48] # CJK COMPATIBILITY IDEOGRAPH-F900; QQC
+2F9D2 ; [.FB41.0020.0002.8C55][.8C55.0000.0000.8C55] # CJK COMPATIBILITY IDEOGRAPH-2F9D2; QQC
+2F97 ; [.FB41.0020.0004.8C55][.8C55.0000.0000.8C55] # KANGXI RADICAL PIG; QQK
+2F98 ; [.FB41.0020.0004.8C78][.8C78.0000.0000.8C78] # KANGXI RADICAL BADGER; QQK
+2F99 ; [.FB41.0020.0004.8C9D][.8C9D.0000.0000.8C9D] # KANGXI RADICAL SHELL; QQK
+3236 ; [*02FF.0020.0004.3236][.FB41.0020.0004.8CA1][.8CA1.0000.0000.8CA1][*0300.0020.001F.3236] # PARENTHESIZED IDEOGRAPH FINANCIAL; QQKN
+3296 ; [.FB41.0020.0006.8CA1][.8CA1.0000.0000.8CA1] # CIRCLED IDEOGRAPH FINANCIAL; QQK
+1F223 ; [.FB41.0020.001C.8CA9][.8CA9.0000.0000.8CA9] # SQUARED CJK UNIFIED IDEOGRAPH-8CA9; QQK
+2F9D4 ; [.FB41.0020.0002.8CAB][.8CAB.0000.0000.8CAB] # CJK COMPATIBILITY IDEOGRAPH-2F9D4; QQC
+2F9D5 ; [.FB41.0020.0002.8CC1][.8CC1.0000.0000.8CC1] # CJK COMPATIBILITY IDEOGRAPH-2F9D5; QQC
+F948 ; [.FB41.0020.0002.8CC2][.8CC2.0000.0000.8CC2] # CJK COMPATIBILITY IDEOGRAPH-F948; QQC
+323E ; [*02FF.0020.0004.323E][.FB41.0020.0004.8CC7][.8CC7.0000.0000.8CC7][*0300.0020.001F.323E] # PARENTHESIZED IDEOGRAPH RESOURCE; QQKN
+32AE ; [.FB41.0020.0006.8CC7][.8CC7.0000.0000.8CC7] # CIRCLED IDEOGRAPH RESOURCE; QQK
+F903 ; [.FB41.0020.0002.8CC8][.8CC8.0000.0000.8CC8] # CJK COMPATIBILITY IDEOGRAPH-F903; QQC
+FA64 ; [.FB41.0020.0002.8CD3][.8CD3.0000.0000.8CD3] # CJK COMPATIBILITY IDEOGRAPH-FA64; QQC
+FA65 ; [.FB41.0020.0002.8D08][.8D08.0000.0000.8D08] # CJK COMPATIBILITY IDEOGRAPH-FA65; QQC
+FAC1 ; [.FB41.0020.0002.8D08][.8D08.0000.0000.8D08] # CJK COMPATIBILITY IDEOGRAPH-FAC1; QQC
+2F9D6 ; [.FB41.0020.0002.8D1B][.8D1B.0000.0000.8D1B] # CJK COMPATIBILITY IDEOGRAPH-2F9D6; QQC
+2EC9 ; [.FB41.0020.0004.8D1D][.8D1D.0000.0000.8D1D] # CJK RADICAL C-SIMPLIFIED SHELL; QQK
+2F9A ; [.FB41.0020.0004.8D64][.8D64.0000.0000.8D64] # KANGXI RADICAL RED; QQK
+2F9B ; [.FB41.0020.0004.8D70][.8D70.0000.0000.8D70] # KANGXI RADICAL RUN; QQK
+1F230 ; [.FB41.0020.001C.8D70][.8D70.0000.0000.8D70] # SQUARED CJK UNIFIED IDEOGRAPH-8D70; QQK
+2F9D7 ; [.FB41.0020.0002.8D77][.8D77.0000.0000.8D77] # CJK COMPATIBILITY IDEOGRAPH-2F9D7; QQC
+2F9C ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3] # KANGXI RADICAL FOOT; QQK
+2ECA ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3][.0000.0159.001F.2ECA] # CJK RADICAL FOOT; QQKN
+2F9DB ; [.FB41.0020.0002.8DBC][.8DBC.0000.0000.8DBC] # CJK COMPATIBILITY IDEOGRAPH-2F9DB; QQC
+2F9DA ; [.FB41.0020.0002.8DCB][.8DCB.0000.0000.8DCB] # CJK COMPATIBILITY IDEOGRAPH-2F9DA; QQC
+F937 ; [.FB41.0020.0002.8DEF][.8DEF.0000.0000.8DEF] # CJK COMPATIBILITY IDEOGRAPH-F937; QQC
+2F9DC ; [.FB41.0020.0002.8DF0][.8DF0.0000.0000.8DF0] # CJK COMPATIBILITY IDEOGRAPH-2F9DC; QQC
+2F9D ; [.FB41.0020.0004.8EAB][.8EAB.0000.0000.8EAB] # KANGXI RADICAL BODY; QQK
+F902 ; [.FB41.0020.0002.8ECA][.8ECA.0000.0000.8ECA] # CJK COMPATIBILITY IDEOGRAPH-F902; QQC
+2F9E ; [.FB41.0020.0004.8ECA][.8ECA.0000.0000.8ECA] # KANGXI RADICAL CART; QQK
+2F9DE ; [.FB41.0020.0002.8ED4][.8ED4.0000.0000.8ED4] # CJK COMPATIBILITY IDEOGRAPH-2F9DE; QQC
+F998 ; [.FB41.0020.0002.8F26][.8F26.0000.0000.8F26] # CJK COMPATIBILITY IDEOGRAPH-F998; QQC
+F9D7 ; [.FB41.0020.0002.8F2A][.8F2A.0000.0000.8F2A] # CJK COMPATIBILITY IDEOGRAPH-F9D7; QQC
+FAC2 ; [.FB41.0020.0002.8F38][.8F38.0000.0000.8F38] # CJK COMPATIBILITY IDEOGRAPH-FAC2; QQC
+2F9DF ; [.FB41.0020.0002.8F38][.8F38.0000.0000.8F38] # CJK COMPATIBILITY IDEOGRAPH-2F9DF; QQC
+FA07 ; [.FB41.0020.0002.8F3B][.8F3B.0000.0000.8F3B] # CJK COMPATIBILITY IDEOGRAPH-FA07; QQC
+F98D ; [.FB41.0020.0002.8F62][.8F62.0000.0000.8F62] # CJK COMPATIBILITY IDEOGRAPH-F98D; QQC
+2ECB ; [.FB41.0020.0004.8F66][.8F66.0000.0000.8F66] # CJK RADICAL C-SIMPLIFIED CART; QQK
+2F9F ; [.FB41.0020.0004.8F9B][.8F9B.0000.0000.8F9B] # KANGXI RADICAL BITTER; QQK
+2F98D ; [.FB41.0020.0002.8F9E][.8F9E.0000.0000.8F9E] # CJK COMPATIBILITY IDEOGRAPH-2F98D; QQC
+F971 ; [.FB41.0020.0002.8FB0][.8FB0.0000.0000.8FB0] # CJK COMPATIBILITY IDEOGRAPH-F971; QQC
+2FA0 ; [.FB41.0020.0004.8FB0][.8FB0.0000.0000.8FB0] # KANGXI RADICAL MORNING; QQK
+2FA1 ; [.FB41.0020.0004.8FB5][.8FB5.0000.0000.8FB5] # KANGXI RADICAL WALK; QQK
+FA66 ; [.FB41.0020.0002.8FB6][.8FB6.0000.0000.8FB6] # CJK COMPATIBILITY IDEOGRAPH-FA66; QQC
+2ECC ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6] # CJK RADICAL SIMPLIFIED WALK; QQK
+2ECD ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.0159.001F.2ECD] # CJK RADICAL WALK ONE; QQKN
+2ECE ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.015A.001F.2ECE] # CJK RADICAL WALK TWO; QQKN
+F99A ; [.FB41.0020.0002.9023][.9023.0000.0000.9023] # CJK COMPATIBILITY IDEOGRAPH-F99A; QQC
+FA25 ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA25; QQC
+FA67 ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA67; QQC
+1F22B ; [.FB41.0020.001C.904A][.904A.0000.0000.904A] # SQUARED CJK UNIFIED IDEOGRAPH-904A; QQK
+329C ; [.FB41.0020.0006.9069][.9069.0000.0000.9069] # CIRCLED IDEOGRAPH SUITABLE; QQK
+FAC3 ; [.FB41.0020.0002.9072][.9072.0000.0000.9072] # CJK COMPATIBILITY IDEOGRAPH-FAC3; QQC
+F9C3 ; [.FB41.0020.0002.907C][.907C.0000.0000.907C] # CJK COMPATIBILITY IDEOGRAPH-F9C3; QQC
+F913 ; [.FB41.0020.0002.908F][.908F.0000.0000.908F] # CJK COMPATIBILITY IDEOGRAPH-F913; QQC
+2FA2 ; [.FB41.0020.0004.9091][.9091.0000.0000.9091] # KANGXI RADICAL CITY; QQK
+2ECF ; [.FB41.0020.0004.9091][.9091.0000.0000.9091][.0000.0159.001F.2ECF] # CJK RADICAL CITY; QQKN
+2F9E2 ; [.FB41.0020.0002.9094][.9094.0000.0000.9094] # CJK COMPATIBILITY IDEOGRAPH-2F9E2; QQC
+F92C ; [.FB41.0020.0002.90CE][.90CE.0000.0000.90CE] # CJK COMPATIBILITY IDEOGRAPH-F92C; QQC
+2F9E3 ; [.FB41.0020.0002.90F1][.90F1.0000.0000.90F1] # CJK COMPATIBILITY IDEOGRAPH-2F9E3; QQC
+FA26 ; [.FB41.0020.0002.90FD][.90FD.0000.0000.90FD] # CJK COMPATIBILITY IDEOGRAPH-FA26; QQC
+2F9E4 ; [.FB41.0020.0002.9111][.9111.0000.0000.9111] # CJK COMPATIBILITY IDEOGRAPH-2F9E4; QQC
+2F9E6 ; [.FB41.0020.0002.911B][.911B.0000.0000.911B] # CJK COMPATIBILITY IDEOGRAPH-2F9E6; QQC
+2FA3 ; [.FB41.0020.0004.9149][.9149.0000.0000.9149] # KANGXI RADICAL WINE; QQK
+F919 ; [.FB41.0020.0002.916A][.916A.0000.0000.916A] # CJK COMPATIBILITY IDEOGRAPH-F919; QQC
+FAC4 ; [.FB41.0020.0002.9199][.9199.0000.0000.9199] # CJK COMPATIBILITY IDEOGRAPH-FAC4; QQC
+F9B7 ; [.FB41.0020.0002.91B4][.91B4.0000.0000.91B4] # CJK COMPATIBILITY IDEOGRAPH-F9B7; QQC
+2FA4 ; [.FB41.0020.0004.91C6][.91C6.0000.0000.91C6] # KANGXI RADICAL DISTINGUISH; QQK
+F9E9 ; [.FB41.0020.0002.91CC][.91CC.0000.0000.91CC] # CJK COMPATIBILITY IDEOGRAPH-F9E9; QQC
+2FA5 ; [.FB41.0020.0004.91CC][.91CC.0000.0000.91CC] # KANGXI RADICAL VILLAGE; QQK
+F97E ; [.FB41.0020.0002.91CF][.91CF.0000.0000.91CF] # CJK COMPATIBILITY IDEOGRAPH-F97E; QQC
+F90A ; [.FB41.0020.0002.91D1][.91D1.0000.0000.91D1] # CJK COMPATIBILITY IDEOGRAPH-F90A; QQC
+2FA6 ; [.FB41.0020.0004.91D1][.91D1.0000.0000.91D1] # KANGXI RADICAL GOLD; QQK
+322E ; [*02FF.0020.0004.322E][.FB41.0020.0004.91D1][.91D1.0000.0000.91D1][*0300.0020.001F.322E] # PARENTHESIZED IDEOGRAPH METAL; QQKN
+328E ; [.FB41.0020.0006.91D1][.91D1.0000.0000.91D1] # CIRCLED IDEOGRAPH METAL; QQK
+F9B1 ; [.FB41.0020.0002.9234][.9234.0000.0000.9234] # CJK COMPATIBILITY IDEOGRAPH-F9B1; QQC
+2F9E7 ; [.FB41.0020.0002.9238][.9238.0000.0000.9238] # CJK COMPATIBILITY IDEOGRAPH-2F9E7; QQC
+FAC5 ; [.FB41.0020.0002.9276][.9276.0000.0000.9276] # CJK COMPATIBILITY IDEOGRAPH-FAC5; QQC
+2F9EA ; [.FB41.0020.0002.927C][.927C.0000.0000.927C] # CJK COMPATIBILITY IDEOGRAPH-2F9EA; QQC
+2F9E8 ; [.FB41.0020.0002.92D7][.92D7.0000.0000.92D7] # CJK COMPATIBILITY IDEOGRAPH-2F9E8; QQC
+2F9E9 ; [.FB41.0020.0002.92D8][.92D8.0000.0000.92D8] # CJK COMPATIBILITY IDEOGRAPH-2F9E9; QQC
+F93F ; [.FB41.0020.0002.9304][.9304.0000.0000.9304] # CJK COMPATIBILITY IDEOGRAPH-F93F; QQC
+F99B ; [.FB41.0020.0002.934A][.934A.0000.0000.934A] # CJK COMPATIBILITY IDEOGRAPH-F99B; QQC
+2F9EB ; [.FB41.0020.0002.93F9][.93F9.0000.0000.93F9] # CJK COMPATIBILITY IDEOGRAPH-2F9EB; QQC
+2F9EC ; [.FB41.0020.0002.9415][.9415.0000.0000.9415] # CJK COMPATIBILITY IDEOGRAPH-2F9EC; QQC
+2ED0 ; [.FB41.0020.0004.9485][.9485.0000.0000.9485] # CJK RADICAL C-SIMPLIFIED GOLD; QQK
+2ED1 ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # CJK RADICAL LONG ONE; QQK
+2FA7 ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # KANGXI RADICAL LONG; QQK
+2ED2 ; [.FB41.0020.0004.9578][.9578.0000.0000.9578] # CJK RADICAL LONG TWO; QQK
+2ED3 ; [.FB41.0020.0004.957F][.957F.0000.0000.957F] # CJK RADICAL C-SIMPLIFIED LONG; QQK
+2FA8 ; [.FB41.0020.0004.9580][.9580.0000.0000.9580] # KANGXI RADICAL GATE; QQK
+2F9EE ; [.FB41.0020.0002.958B][.958B.0000.0000.958B] # CJK COMPATIBILITY IDEOGRAPH-2F9EE; QQC
+F986 ; [.FB41.0020.0002.95AD][.95AD.0000.0000.95AD] # CJK COMPATIBILITY IDEOGRAPH-F986; QQC
+2F9F0 ; [.FB41.0020.0002.95B7][.95B7.0000.0000.95B7] # CJK COMPATIBILITY IDEOGRAPH-2F9F0; QQC
+2ED4 ; [.FB41.0020.0004.95E8][.95E8.0000.0000.95E8] # CJK RADICAL C-SIMPLIFIED GATE; QQK
+2FA9 ; [.FB41.0020.0004.961C][.961C.0000.0000.961C] # KANGXI RADICAL MOUND; QQK
+2ED5 ; [.FB41.0020.0004.961C][.961C.0000.0000.961C][.0000.0159.001F.2ED5] # CJK RADICAL MOUND ONE; QQKN
+2ED6 ; [.FB41.0020.0004.961D][.961D.0000.0000.961D] # CJK RADICAL MOUND TWO; QQK
+F9C6 ; [.FB41.0020.0002.962E][.962E.0000.0000.962E] # CJK COMPATIBILITY IDEOGRAPH-F9C6; QQC
+F951 ; [.FB41.0020.0002.964B][.964B.0000.0000.964B] # CJK COMPATIBILITY IDEOGRAPH-F951; QQC
+FA09 ; [.FB41.0020.0002.964D][.964D.0000.0000.964D] # CJK COMPATIBILITY IDEOGRAPH-FA09; QQC
+F959 ; [.FB41.0020.0002.9675][.9675.0000.0000.9675] # CJK COMPATIBILITY IDEOGRAPH-F959; QQC
+F9D3 ; [.FB41.0020.0002.9678][.9678.0000.0000.9678] # CJK COMPATIBILITY IDEOGRAPH-F9D3; QQC
+FAC6 ; [.FB41.0020.0002.967C][.967C.0000.0000.967C] # CJK COMPATIBILITY IDEOGRAPH-FAC6; QQC
+F9DC ; [.FB41.0020.0002.9686][.9686.0000.0000.9686] # CJK COMPATIBILITY IDEOGRAPH-F9DC; QQC
+F9F1 ; [.FB41.0020.0002.96A3][.96A3.0000.0000.96A3] # CJK COMPATIBILITY IDEOGRAPH-F9F1; QQC
+2FAA ; [.FB41.0020.0004.96B6][.96B6.0000.0000.96B6] # KANGXI RADICAL SLAVE; QQK
+F9B8 ; [.FB41.0020.0002.96B8][.96B8.0000.0000.96B8] # CJK COMPATIBILITY IDEOGRAPH-F9B8; QQC
+2FAB ; [.FB41.0020.0004.96B9][.96B9.0000.0000.96B9] # KANGXI RADICAL SHORT TAILED BIRD; QQK
+2F9F3 ; [.FB41.0020.0002.96C3][.96C3.0000.0000.96C3] # CJK COMPATIBILITY IDEOGRAPH-2F9F3; QQC
+F9EA ; [.FB41.0020.0002.96E2][.96E2.0000.0000.96E2] # CJK COMPATIBILITY IDEOGRAPH-F9EA; QQC
+FA68 ; [.FB41.0020.0002.96E3][.96E3.0000.0000.96E3] # CJK COMPATIBILITY IDEOGRAPH-FA68; QQC
+FAC7 ; [.FB41.0020.0002.96E3][.96E3.0000.0000.96E3] # CJK COMPATIBILITY IDEOGRAPH-FAC7; QQC
+2FAC ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8] # KANGXI RADICAL RAIN; QQK
+2ED7 ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8][.0000.0159.001F.2ED7] # CJK RADICAL RAIN; QQKN
+F9B2 ; [.FB41.0020.0002.96F6][.96F6.0000.0000.96F6] # CJK COMPATIBILITY IDEOGRAPH-F9B2; QQC
+F949 ; [.FB41.0020.0002.96F7][.96F7.0000.0000.96F7] # CJK COMPATIBILITY IDEOGRAPH-F949; QQC
+2F9F5 ; [.FB41.0020.0002.9723][.9723.0000.0000.9723] # CJK COMPATIBILITY IDEOGRAPH-2F9F5; QQC
+F938 ; [.FB41.0020.0002.9732][.9732.0000.0000.9732] # CJK COMPATIBILITY IDEOGRAPH-F938; QQC
+F9B3 ; [.FB41.0020.0002.9748][.9748.0000.0000.9748] # CJK COMPATIBILITY IDEOGRAPH-F9B3; QQC
+2FAD ; [.FB41.0020.0004.9751][.9751.0000.0000.9751] # KANGXI RADICAL BLUE; QQK
+2ED8 ; [.FB41.0020.0004.9752][.9752.0000.0000.9752] # CJK RADICAL BLUE; QQK
+FA1C ; [.FB41.0020.0002.9756][.9756.0000.0000.9756] # CJK COMPATIBILITY IDEOGRAPH-FA1C; QQC
+FAC8 ; [.FB41.0020.0002.9756][.9756.0000.0000.9756] # CJK COMPATIBILITY IDEOGRAPH-FAC8; QQC
+2FAE ; [.FB41.0020.0004.975E][.975E.0000.0000.975E] # KANGXI RADICAL WRONG; QQK
+2FAF ; [.FB41.0020.0004.9762][.9762.0000.0000.9762] # KANGXI RADICAL FACE; QQK
+2FB0 ; [.FB41.0020.0004.9769][.9769.0000.0000.9769] # KANGXI RADICAL LEATHER; QQK
+2FB1 ; [.FB41.0020.0004.97CB][.97CB.0000.0000.97CB] # KANGXI RADICAL TANNED LEATHER; QQK
+FAC9 ; [.FB41.0020.0002.97DB][.97DB.0000.0000.97DB] # CJK COMPATIBILITY IDEOGRAPH-FAC9; QQC
+2F9FA ; [.FB41.0020.0002.97E0][.97E0.0000.0000.97E0] # CJK COMPATIBILITY IDEOGRAPH-2F9FA; QQC
+2ED9 ; [.FB41.0020.0004.97E6][.97E6.0000.0000.97E6] # CJK RADICAL C-SIMPLIFIED TANNED LEATHER; QQK
+2FB2 ; [.FB41.0020.0004.97ED][.97ED.0000.0000.97ED] # KANGXI RADICAL LEEK; QQK
+2FB3 ; [.FB41.0020.0004.97F3][.97F3.0000.0000.97F3] # KANGXI RADICAL SOUND; QQK
+FA69 ; [.FB41.0020.0002.97FF][.97FF.0000.0000.97FF] # CJK COMPATIBILITY IDEOGRAPH-FA69; QQC
+FACA ; [.FB41.0020.0002.97FF][.97FF.0000.0000.97FF] # CJK COMPATIBILITY IDEOGRAPH-FACA; QQC
+2FB4 ; [.FB41.0020.0004.9801][.9801.0000.0000.9801] # KANGXI RADICAL LEAF; QQK
+32A0 ; [.FB41.0020.0006.9805][.9805.0000.0000.9805] # CIRCLED IDEOGRAPH ITEM; QQK
+FACB ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-FACB; QQC
+2F9FE ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FE; QQC
+2F9FF ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FF; QQC
+F9B4 ; [.FB41.0020.0002.9818][.9818.0000.0000.9818] # CJK COMPATIBILITY IDEOGRAPH-F9B4; QQC
+2FA00 ; [.FB41.0020.0002.9829][.9829.0000.0000.9829] # CJK COMPATIBILITY IDEOGRAPH-2FA00; QQC
+FA6A ; [.FB41.0020.0002.983B][.983B.0000.0000.983B] # CJK COMPATIBILITY IDEOGRAPH-FA6A; QQC
+FACC ; [.FB41.0020.0002.983B][.983B.0000.0000.983B] # CJK COMPATIBILITY IDEOGRAPH-FACC; QQC
+F9D0 ; [.FB41.0020.0002.985E][.985E.0000.0000.985E] # CJK COMPATIBILITY IDEOGRAPH-F9D0; QQC
+2EDA ; [.FB41.0020.0004.9875][.9875.0000.0000.9875] # CJK RADICAL C-SIMPLIFIED LEAF; QQK
+2FB5 ; [.FB41.0020.0004.98A8][.98A8.0000.0000.98A8] # KANGXI RADICAL WIND; QQK
+2EDB ; [.FB41.0020.0004.98CE][.98CE.0000.0000.98CE] # CJK RADICAL C-SIMPLIFIED WIND; QQK
+2FB6 ; [.FB41.0020.0004.98DB][.98DB.0000.0000.98DB] # KANGXI RADICAL FLY; QQK
+2EDC ; [.FB41.0020.0004.98DE][.98DE.0000.0000.98DE] # CJK RADICAL C-SIMPLIFIED FLY; QQK
+2EDD ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # CJK RADICAL EAT ONE; QQK
+2FB7 ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # KANGXI RADICAL EAT; QQK
+2EDF ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0] # CJK RADICAL EAT THREE; QQK
+2EDE ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0][.0000.0159.001F.2EDE] # CJK RADICAL EAT TWO; QQKN
+2FA02 ; [.FB41.0020.0002.98E2][.98E2.0000.0000.98E2] # CJK COMPATIBILITY IDEOGRAPH-2FA02; QQC
+FA2A ; [.FB41.0020.0002.98EF][.98EF.0000.0000.98EF] # CJK COMPATIBILITY IDEOGRAPH-FA2A; QQC
+FA2B ; [.FB41.0020.0002.98FC][.98FC.0000.0000.98FC] # CJK COMPATIBILITY IDEOGRAPH-FA2B; QQC
+FA2C ; [.FB41.0020.0002.9928][.9928.0000.0000.9928] # CJK COMPATIBILITY IDEOGRAPH-FA2C; QQC
+2FA04 ; [.FB41.0020.0002.9929][.9929.0000.0000.9929] # CJK COMPATIBILITY IDEOGRAPH-2FA04; QQC
+2EE0 ; [.FB41.0020.0004.9963][.9963.0000.0000.9963] # CJK RADICAL C-SIMPLIFIED EAT; QQK
+2FB8 ; [.FB41.0020.0004.9996][.9996.0000.0000.9996] # KANGXI RADICAL HEAD; QQK
+2EE1 ; [.FB41.0020.0004.9996][.9996.0000.0000.9996][.0000.0159.001F.2EE1] # CJK RADICAL HEAD; QQKN
+2FB9 ; [.FB41.0020.0004.9999][.9999.0000.0000.9999] # KANGXI RADICAL FRAGRANT; QQK
+2FA05 ; [.FB41.0020.0002.99A7][.99A7.0000.0000.99A7] # CJK COMPATIBILITY IDEOGRAPH-2FA05; QQC
+2FBA ; [.FB41.0020.0004.99AC][.99AC.0000.0000.99AC] # KANGXI RADICAL HORSE; QQK
+2FA06 ; [.FB41.0020.0002.99C2][.99C2.0000.0000.99C2] # CJK COMPATIBILITY IDEOGRAPH-2FA06; QQC
+F91A ; [.FB41.0020.0002.99F1][.99F1.0000.0000.99F1] # CJK COMPATIBILITY IDEOGRAPH-F91A; QQC
+2FA07 ; [.FB41.0020.0002.99FE][.99FE.0000.0000.99FE] # CJK COMPATIBILITY IDEOGRAPH-2FA07; QQC
+F987 ; [.FB41.0020.0002.9A6A][.9A6A.0000.0000.9A6A] # CJK COMPATIBILITY IDEOGRAPH-F987; QQC
+2EE2 ; [.FB41.0020.0004.9A6C][.9A6C.0000.0000.9A6C] # CJK RADICAL C-SIMPLIFIED HORSE; QQK
+2FBB ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8] # KANGXI RADICAL BONE; QQK
+2EE3 ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8][.0000.0159.001F.2EE3] # CJK RADICAL BONE; QQKN
+2FBC ; [.FB41.0020.0004.9AD8][.9AD8.0000.0000.9AD8] # KANGXI RADICAL TALL; QQK
+2FBD ; [.FB41.0020.0004.9ADF][.9ADF.0000.0000.9ADF] # KANGXI RADICAL HAIR; QQK
+FACD ; [.FB41.0020.0002.9B12][.9B12.0000.0000.9B12] # CJK COMPATIBILITY IDEOGRAPH-FACD; QQC
+2FA0A ; [.FB41.0020.0002.9B12][.9B12.0000.0000.9B12] # CJK COMPATIBILITY IDEOGRAPH-2FA0A; QQC
+2FBE ; [.FB41.0020.0004.9B25][.9B25.0000.0000.9B25] # KANGXI RADICAL FIGHT; QQK
+2FBF ; [.FB41.0020.0004.9B2F][.9B2F.0000.0000.9B2F] # KANGXI RADICAL SACRIFICIAL WINE; QQK
+2FC0 ; [.FB41.0020.0004.9B32][.9B32.0000.0000.9B32] # KANGXI RADICAL CAULDRON; QQK
+2FC1 ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C] # KANGXI RADICAL GHOST; QQK
+2EE4 ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C][.0000.0159.001F.2EE4] # CJK RADICAL GHOST; QQKN
+2FC2 ; [.FB41.0020.0004.9B5A][.9B5A.0000.0000.9B5A] # KANGXI RADICAL FISH; QQK
+F939 ; [.FB41.0020.0002.9B6F][.9B6F.0000.0000.9B6F] # CJK COMPATIBILITY IDEOGRAPH-F939; QQC
+2FA0B ; [.FB41.0020.0002.9C40][.9C40.0000.0000.9C40] # CJK COMPATIBILITY IDEOGRAPH-2FA0B; QQC
+F9F2 ; [.FB41.0020.0002.9C57][.9C57.0000.0000.9C57] # CJK COMPATIBILITY IDEOGRAPH-F9F2; QQC
+2EE5 ; [.FB41.0020.0004.9C7C][.9C7C.0000.0000.9C7C] # CJK RADICAL C-SIMPLIFIED FISH; QQK
+2FC3 ; [.FB41.0020.0004.9CE5][.9CE5.0000.0000.9CE5] # KANGXI RADICAL BIRD; QQK
+2FA0C ; [.FB41.0020.0002.9CFD][.9CFD.0000.0000.9CFD] # CJK COMPATIBILITY IDEOGRAPH-2FA0C; QQC
+2FA0F ; [.FB41.0020.0002.9D67][.9D67.0000.0000.9D67] # CJK COMPATIBILITY IDEOGRAPH-2FA0F; QQC
+FA2D ; [.FB41.0020.0002.9DB4][.9DB4.0000.0000.9DB4] # CJK COMPATIBILITY IDEOGRAPH-FA2D; QQC
+F93A ; [.FB41.0020.0002.9DFA][.9DFA.0000.0000.9DFA] # CJK COMPATIBILITY IDEOGRAPH-F93A; QQC
+F920 ; [.FB41.0020.0002.9E1E][.9E1E.0000.0000.9E1E] # CJK COMPATIBILITY IDEOGRAPH-F920; QQC
+2EE6 ; [.FB41.0020.0004.9E1F][.9E1F.0000.0000.9E1F] # CJK RADICAL C-SIMPLIFIED BIRD; QQK
+2FC4 ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75] # KANGXI RADICAL SALT; QQK
+2EE7 ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75][.0000.0159.001F.2EE7] # CJK RADICAL C-SIMPLIFIED SALT; QQKN
+F940 ; [.FB41.0020.0002.9E7F][.9E7F.0000.0000.9E7F] # CJK COMPATIBILITY IDEOGRAPH-F940; QQC
+2FC5 ; [.FB41.0020.0004.9E7F][.9E7F.0000.0000.9E7F] # KANGXI RADICAL DEER; QQK
+F988 ; [.FB41.0020.0002.9E97][.9E97.0000.0000.9E97] # CJK COMPATIBILITY IDEOGRAPH-F988; QQC
+F9F3 ; [.FB41.0020.0002.9E9F][.9E9F.0000.0000.9E9F] # CJK COMPATIBILITY IDEOGRAPH-F9F3; QQC
+2FC6 ; [.FB41.0020.0004.9EA5][.9EA5.0000.0000.9EA5] # KANGXI RADICAL WHEAT; QQK
+2EE8 ; [.FB41.0020.0004.9EA6][.9EA6.0000.0000.9EA6] # CJK RADICAL SIMPLIFIED WHEAT; QQK
+2FA15 ; [.FB41.0020.0002.9EBB][.9EBB.0000.0000.9EBB] # CJK COMPATIBILITY IDEOGRAPH-2FA15; QQC
+2FC7 ; [.FB41.0020.0004.9EBB][.9EBB.0000.0000.9EBB] # KANGXI RADICAL HEMP; QQK
+2FC8 ; [.FB41.0020.0004.9EC3][.9EC3.0000.0000.9EC3] # KANGXI RADICAL YELLOW; QQK
+2EE9 ; [.FB41.0020.0004.9EC4][.9EC4.0000.0000.9EC4] # CJK RADICAL SIMPLIFIED YELLOW; QQK
+2FC9 ; [.FB41.0020.0004.9ECD][.9ECD.0000.0000.9ECD] # KANGXI RADICAL MILLET; QQK
+F989 ; [.FB41.0020.0002.9ECE][.9ECE.0000.0000.9ECE] # CJK COMPATIBILITY IDEOGRAPH-F989; QQC
+2FCA ; [.FB41.0020.0004.9ED1][.9ED1.0000.0000.9ED1] # KANGXI RADICAL BLACK; QQK
+2FA17 ; [.FB41.0020.0002.9EF9][.9EF9.0000.0000.9EF9] # CJK COMPATIBILITY IDEOGRAPH-2FA17; QQC
+2FCB ; [.FB41.0020.0004.9EF9][.9EF9.0000.0000.9EF9] # KANGXI RADICAL EMBROIDERY; QQK
+2FCC ; [.FB41.0020.0004.9EFD][.9EFD.0000.0000.9EFD] # KANGXI RADICAL FROG; QQK
+2FA18 ; [.FB41.0020.0002.9EFE][.9EFE.0000.0000.9EFE] # CJK COMPATIBILITY IDEOGRAPH-2FA18; QQC
+2EEA ; [.FB41.0020.0004.9EFE][.9EFE.0000.0000.9EFE] # CJK RADICAL C-SIMPLIFIED FROG; QQK
+2FA19 ; [.FB41.0020.0002.9F05][.9F05.0000.0000.9F05] # CJK COMPATIBILITY IDEOGRAPH-2FA19; QQC
+2FCD ; [.FB41.0020.0004.9F0E][.9F0E.0000.0000.9F0E] # KANGXI RADICAL TRIPOD; QQK
+2FA1A ; [.FB41.0020.0002.9F0F][.9F0F.0000.0000.9F0F] # CJK COMPATIBILITY IDEOGRAPH-2FA1A; QQC
+2FCE ; [.FB41.0020.0004.9F13][.9F13.0000.0000.9F13] # KANGXI RADICAL DRUM; QQK
+2FA1B ; [.FB41.0020.0002.9F16][.9F16.0000.0000.9F16] # CJK COMPATIBILITY IDEOGRAPH-2FA1B; QQC
+2FCF ; [.FB41.0020.0004.9F20][.9F20.0000.0000.9F20] # KANGXI RADICAL RAT; QQK
+2FA1C ; [.FB41.0020.0002.9F3B][.9F3B.0000.0000.9F3B] # CJK COMPATIBILITY IDEOGRAPH-2FA1C; QQC
+2FD0 ; [.FB41.0020.0004.9F3B][.9F3B.0000.0000.9F3B] # KANGXI RADICAL NOSE; QQK
+FAD8 ; [.FB41.0020.0002.9F43][.9F43.0000.0000.9F43] # CJK COMPATIBILITY IDEOGRAPH-FAD8; QQC
+2FD1 ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A] # KANGXI RADICAL EVEN; QQK
+2EEB ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A][.0000.0159.001F.2EEB] # CJK RADICAL J-SIMPLIFIED EVEN; QQKN
+2EEC ; [.FB41.0020.0004.9F50][.9F50.0000.0000.9F50] # CJK RADICAL C-SIMPLIFIED EVEN; QQK
+2FD2 ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52] # KANGXI RADICAL TOOTH; QQK
+2EED ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52][.0000.0159.001F.2EED] # CJK RADICAL J-SIMPLIFIED TOOTH; QQKN
+2EEE ; [.FB41.0020.0004.9F7F][.9F7F.0000.0000.9F7F] # CJK RADICAL C-SIMPLIFIED TOOTH; QQK
+F9C4 ; [.FB41.0020.0002.9F8D][.9F8D.0000.0000.9F8D] # CJK COMPATIBILITY IDEOGRAPH-F9C4; QQC
+2FD3 ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D] # KANGXI RADICAL DRAGON; QQK
+2EEF ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D][.0000.0159.001F.2EEF] # CJK RADICAL J-SIMPLIFIED DRAGON; QQKN
+FAD9 ; [.FB41.0020.0002.9F8E][.9F8E.0000.0000.9F8E] # CJK COMPATIBILITY IDEOGRAPH-FAD9; QQC
+2EF0 ; [.FB41.0020.0004.9F99][.9F99.0000.0000.9F99] # CJK RADICAL C-SIMPLIFIED DRAGON; QQK
+F907 ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F907; QQC
+F908 ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F908; QQC
+FACE ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-FACE; QQC
+2FD4 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C] # KANGXI RADICAL TURTLE; QQK
+2EF1 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.0159.001F.2EF1] # CJK RADICAL TURTLE; QQKN
+2EF2 ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.015A.001F.2EF2] # CJK RADICAL J-SIMPLIFIED TURTLE; QQKN
+2EF3 ; [.FB41.0020.0004.9F9F][.9F9F.0000.0000.9F9F] # CJK RADICAL C-SIMPLIFIED TURTLE; QQK
+2FD5 ; [.FB41.0020.0004.9FA0][.9FA0.0000.0000.9FA0] # KANGXI RADICAL FLUTE; QQK
+FA0E ; [.FB41.0020.0002.FA0E][.FA0E.0000.0000.FA0E] # CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F ; [.FB41.0020.0002.FA0F][.FA0F.0000.0000.FA0F] # CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA11 ; [.FB41.0020.0002.FA11][.FA11.0000.0000.FA11] # CJK COMPATIBILITY IDEOGRAPH-FA11
+FA13 ; [.FB41.0020.0002.FA13][.FA13.0000.0000.FA13] # CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14 ; [.FB41.0020.0002.FA14][.FA14.0000.0000.FA14] # CJK COMPATIBILITY IDEOGRAPH-FA14
+FA1F ; [.FB41.0020.0002.FA1F][.FA1F.0000.0000.FA1F] # CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA21 ; [.FB41.0020.0002.FA21][.FA21.0000.0000.FA21] # CJK COMPATIBILITY IDEOGRAPH-FA21
+FA23 ; [.FB41.0020.0002.FA23][.FA23.0000.0000.FA23] # CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24 ; [.FB41.0020.0002.FA24][.FA24.0000.0000.FA24] # CJK COMPATIBILITY IDEOGRAPH-FA24
+FA27 ; [.FB41.0020.0002.FA27][.FA27.0000.0000.FA27] # CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28 ; [.FB41.0020.0002.FA28][.FA28.0000.0000.FA28] # CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29 ; [.FB41.0020.0002.FA29][.FA29.0000.0000.FA29] # CJK COMPATIBILITY IDEOGRAPH-FA29
+2F80C ; [.FB80.0020.0002.349E][.B49E.0000.0000.349E] # CJK COMPATIBILITY IDEOGRAPH-2F80C; QQC
+2F813 ; [.FB80.0020.0002.34B9][.B4B9.0000.0000.34B9] # CJK COMPATIBILITY IDEOGRAPH-2F813; QQC
+2F9CA ; [.FB80.0020.0002.34BB][.B4BB.0000.0000.34BB] # CJK COMPATIBILITY IDEOGRAPH-2F9CA; QQC
+2F81F ; [.FB80.0020.0002.34DF][.B4DF.0000.0000.34DF] # CJK COMPATIBILITY IDEOGRAPH-2F81F; QQC
+2F824 ; [.FB80.0020.0002.3515][.B515.0000.0000.3515] # CJK COMPATIBILITY IDEOGRAPH-2F824; QQC
+2F867 ; [.FB80.0020.0002.36EE][.B6EE.0000.0000.36EE] # CJK COMPATIBILITY IDEOGRAPH-2F867; QQC
+2F868 ; [.FB80.0020.0002.36FC][.B6FC.0000.0000.36FC] # CJK COMPATIBILITY IDEOGRAPH-2F868; QQC
+2F876 ; [.FB80.0020.0002.3781][.B781.0000.0000.3781] # CJK COMPATIBILITY IDEOGRAPH-2F876; QQC
+2F883 ; [.FB80.0020.0002.382F][.B82F.0000.0000.382F] # CJK COMPATIBILITY IDEOGRAPH-2F883; QQC
+2F888 ; [.FB80.0020.0002.3862][.B862.0000.0000.3862] # CJK COMPATIBILITY IDEOGRAPH-2F888; QQC
+2F88A ; [.FB80.0020.0002.387C][.B87C.0000.0000.387C] # CJK COMPATIBILITY IDEOGRAPH-2F88A; QQC
+2F896 ; [.FB80.0020.0002.38C7][.B8C7.0000.0000.38C7] # CJK COMPATIBILITY IDEOGRAPH-2F896; QQC
+2F89B ; [.FB80.0020.0002.38E3][.B8E3.0000.0000.38E3] # CJK COMPATIBILITY IDEOGRAPH-2F89B; QQC
+2F8A2 ; [.FB80.0020.0002.391C][.B91C.0000.0000.391C] # CJK COMPATIBILITY IDEOGRAPH-2F8A2; QQC
+2F8A1 ; [.FB80.0020.0002.393A][.B93A.0000.0000.393A] # CJK COMPATIBILITY IDEOGRAPH-2F8A1; QQC
+2F8C2 ; [.FB80.0020.0002.3A2E][.BA2E.0000.0000.3A2E] # CJK COMPATIBILITY IDEOGRAPH-2F8C2; QQC
+2F8C7 ; [.FB80.0020.0002.3A6C][.BA6C.0000.0000.3A6C] # CJK COMPATIBILITY IDEOGRAPH-2F8C7; QQC
+2F8D1 ; [.FB80.0020.0002.3AE4][.BAE4.0000.0000.3AE4] # CJK COMPATIBILITY IDEOGRAPH-2F8D1; QQC
+2F8D0 ; [.FB80.0020.0002.3B08][.BB08.0000.0000.3B08] # CJK COMPATIBILITY IDEOGRAPH-2F8D0; QQC
+2F8CE ; [.FB80.0020.0002.3B19][.BB19.0000.0000.3B19] # CJK COMPATIBILITY IDEOGRAPH-2F8CE; QQC
+2F8DE ; [.FB80.0020.0002.3B49][.BB49.0000.0000.3B49] # CJK COMPATIBILITY IDEOGRAPH-2F8DE; QQC
+FAD2 ; [.FB80.0020.0002.3B9D][.BB9D.0000.0000.3B9D] # CJK COMPATIBILITY IDEOGRAPH-FAD2; QQC
+2F8E7 ; [.FB80.0020.0002.3B9D][.BB9D.0000.0000.3B9D] # CJK COMPATIBILITY IDEOGRAPH-2F8E7; QQC
+2F8EE ; [.FB80.0020.0002.3C18][.BC18.0000.0000.3C18] # CJK COMPATIBILITY IDEOGRAPH-2F8EE; QQC
+2F8F2 ; [.FB80.0020.0002.3C4E][.BC4E.0000.0000.3C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8F2; QQC
+2F90A ; [.FB80.0020.0002.3D33][.BD33.0000.0000.3D33] # CJK COMPATIBILITY IDEOGRAPH-2F90A; QQC
+2F916 ; [.FB80.0020.0002.3D96][.BD96.0000.0000.3D96] # CJK COMPATIBILITY IDEOGRAPH-2F916; QQC
+2F92A ; [.FB80.0020.0002.3EAC][.BEAC.0000.0000.3EAC] # CJK COMPATIBILITY IDEOGRAPH-2F92A; QQC
+2F92C ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92C; QQC
+2F92D ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92D; QQC
+2F933 ; [.FB80.0020.0002.3F1B][.BF1B.0000.0000.3F1B] # CJK COMPATIBILITY IDEOGRAPH-2F933; QQC
+2F93E ; [.FB80.0020.0002.3FFC][.BFFC.0000.0000.3FFC] # CJK COMPATIBILITY IDEOGRAPH-2F93E; QQC
+2F93F ; [.FB80.0020.0002.4008][.C008.0000.0000.4008] # CJK COMPATIBILITY IDEOGRAPH-2F93F; QQC
+FAD3 ; [.FB80.0020.0002.4018][.C018.0000.0000.4018] # CJK COMPATIBILITY IDEOGRAPH-FAD3; QQC
+FAD4 ; [.FB80.0020.0002.4039][.C039.0000.0000.4039] # CJK COMPATIBILITY IDEOGRAPH-FAD4; QQC
+2F949 ; [.FB80.0020.0002.4039][.C039.0000.0000.4039] # CJK COMPATIBILITY IDEOGRAPH-2F949; QQC
+2F94B ; [.FB80.0020.0002.4046][.C046.0000.0000.4046] # CJK COMPATIBILITY IDEOGRAPH-2F94B; QQC
+2F94C ; [.FB80.0020.0002.4096][.C096.0000.0000.4096] # CJK COMPATIBILITY IDEOGRAPH-2F94C; QQC
+2F951 ; [.FB80.0020.0002.40E3][.C0E3.0000.0000.40E3] # CJK COMPATIBILITY IDEOGRAPH-2F951; QQC
+2F958 ; [.FB80.0020.0002.412F][.C12F.0000.0000.412F] # CJK COMPATIBILITY IDEOGRAPH-2F958; QQC
+2F960 ; [.FB80.0020.0002.4202][.C202.0000.0000.4202] # CJK COMPATIBILITY IDEOGRAPH-2F960; QQC
+2F964 ; [.FB80.0020.0002.4227][.C227.0000.0000.4227] # CJK COMPATIBILITY IDEOGRAPH-2F964; QQC
+2F967 ; [.FB80.0020.0002.42A0][.C2A0.0000.0000.42A0] # CJK COMPATIBILITY IDEOGRAPH-2F967; QQC
+2F96D ; [.FB80.0020.0002.4301][.C301.0000.0000.4301] # CJK COMPATIBILITY IDEOGRAPH-2F96D; QQC
+2F971 ; [.FB80.0020.0002.4334][.C334.0000.0000.4334] # CJK COMPATIBILITY IDEOGRAPH-2F971; QQC
+2F974 ; [.FB80.0020.0002.4359][.C359.0000.0000.4359] # CJK COMPATIBILITY IDEOGRAPH-2F974; QQC
+2F981 ; [.FB80.0020.0002.43D5][.C3D5.0000.0000.43D5] # CJK COMPATIBILITY IDEOGRAPH-2F981; QQC
+2F8D7 ; [.FB80.0020.0002.43D9][.C3D9.0000.0000.43D9] # CJK COMPATIBILITY IDEOGRAPH-2F8D7; QQC
+2F984 ; [.FB80.0020.0002.440B][.C40B.0000.0000.440B] # CJK COMPATIBILITY IDEOGRAPH-2F984; QQC
+2F98E ; [.FB80.0020.0002.446B][.C46B.0000.0000.446B] # CJK COMPATIBILITY IDEOGRAPH-2F98E; QQC
+2F9A7 ; [.FB80.0020.0002.452B][.C52B.0000.0000.452B] # CJK COMPATIBILITY IDEOGRAPH-2F9A7; QQC
+2F9AE ; [.FB80.0020.0002.455D][.C55D.0000.0000.455D] # CJK COMPATIBILITY IDEOGRAPH-2F9AE; QQC
+2F9AF ; [.FB80.0020.0002.4561][.C561.0000.0000.4561] # CJK COMPATIBILITY IDEOGRAPH-2F9AF; QQC
+2F9B2 ; [.FB80.0020.0002.456B][.C56B.0000.0000.456B] # CJK COMPATIBILITY IDEOGRAPH-2F9B2; QQC
+2F9BF ; [.FB80.0020.0002.45D7][.C5D7.0000.0000.45D7] # CJK COMPATIBILITY IDEOGRAPH-2F9BF; QQC
+2F9C2 ; [.FB80.0020.0002.45F9][.C5F9.0000.0000.45F9] # CJK COMPATIBILITY IDEOGRAPH-2F9C2; QQC
+2F9C8 ; [.FB80.0020.0002.4635][.C635.0000.0000.4635] # CJK COMPATIBILITY IDEOGRAPH-2F9C8; QQC
+2F9CD ; [.FB80.0020.0002.46BE][.C6BE.0000.0000.46BE] # CJK COMPATIBILITY IDEOGRAPH-2F9CD; QQC
+2F9CE ; [.FB80.0020.0002.46C7][.C6C7.0000.0000.46C7] # CJK COMPATIBILITY IDEOGRAPH-2F9CE; QQC
+2F9EF ; [.FB80.0020.0002.4995][.C995.0000.0000.4995] # CJK COMPATIBILITY IDEOGRAPH-2F9EF; QQC
+2F9F2 ; [.FB80.0020.0002.49E6][.C9E6.0000.0000.49E6] # CJK COMPATIBILITY IDEOGRAPH-2F9F2; QQC
+2F9F8 ; [.FB80.0020.0002.4A6E][.CA6E.0000.0000.4A6E] # CJK COMPATIBILITY IDEOGRAPH-2F9F8; QQC
+2F9F9 ; [.FB80.0020.0002.4A76][.CA76.0000.0000.4A76] # CJK COMPATIBILITY IDEOGRAPH-2F9F9; QQC
+2F9FC ; [.FB80.0020.0002.4AB2][.CAB2.0000.0000.4AB2] # CJK COMPATIBILITY IDEOGRAPH-2F9FC; QQC
+2FA03 ; [.FB80.0020.0002.4B33][.CB33.0000.0000.4B33] # CJK COMPATIBILITY IDEOGRAPH-2FA03; QQC
+2FA08 ; [.FB80.0020.0002.4BCE][.CBCE.0000.0000.4BCE] # CJK COMPATIBILITY IDEOGRAPH-2FA08; QQC
+2FA0D ; [.FB80.0020.0002.4CCE][.CCCE.0000.0000.4CCE] # CJK COMPATIBILITY IDEOGRAPH-2FA0D; QQC
+2FA0E ; [.FB80.0020.0002.4CED][.CCED.0000.0000.4CED] # CJK COMPATIBILITY IDEOGRAPH-2FA0E; QQC
+2FA11 ; [.FB80.0020.0002.4CF8][.CCF8.0000.0000.4CF8] # CJK COMPATIBILITY IDEOGRAPH-2FA11; QQC
+2FA16 ; [.FB80.0020.0002.4D56][.CD56.0000.0000.4D56] # CJK COMPATIBILITY IDEOGRAPH-2FA16; QQC
+2F803 ; [.FB84.0020.0002.20122][.8122.0000.0000.20122] # CJK COMPATIBILITY IDEOGRAPH-2F803; QQC
+2F812 ; [.FB84.0020.0002.2051C][.851C.0000.0000.2051C] # CJK COMPATIBILITY IDEOGRAPH-2F812; QQC
+2F91B ; [.FB84.0020.0002.20525][.8525.0000.0000.20525] # CJK COMPATIBILITY IDEOGRAPH-2F91B; QQC
+2F816 ; [.FB84.0020.0002.2054B][.854B.0000.0000.2054B] # CJK COMPATIBILITY IDEOGRAPH-2F816; QQC
+2F80D ; [.FB84.0020.0002.2063A][.863A.0000.0000.2063A] # CJK COMPATIBILITY IDEOGRAPH-2F80D; QQC
+2F9D9 ; [.FB84.0020.0002.20804][.8804.0000.0000.20804] # CJK COMPATIBILITY IDEOGRAPH-2F9D9; QQC
+2F9DD ; [.FB84.0020.0002.208DE][.88DE.0000.0000.208DE] # CJK COMPATIBILITY IDEOGRAPH-2F9DD; QQC
+2F834 ; [.FB84.0020.0002.20A2C][.8A2C.0000.0000.20A2C] # CJK COMPATIBILITY IDEOGRAPH-2F834; QQC
+2F838 ; [.FB84.0020.0002.20B63][.8B63.0000.0000.20B63] # CJK COMPATIBILITY IDEOGRAPH-2F838; QQC
+2F859 ; [.FB84.0020.0002.214E4][.94E4.0000.0000.214E4] # CJK COMPATIBILITY IDEOGRAPH-2F859; QQC
+2F860 ; [.FB84.0020.0002.216A8][.96A8.0000.0000.216A8] # CJK COMPATIBILITY IDEOGRAPH-2F860; QQC
+2F861 ; [.FB84.0020.0002.216EA][.96EA.0000.0000.216EA] # CJK COMPATIBILITY IDEOGRAPH-2F861; QQC
+2F86C ; [.FB84.0020.0002.219C8][.99C8.0000.0000.219C8] # CJK COMPATIBILITY IDEOGRAPH-2F86C; QQC
+2F871 ; [.FB84.0020.0002.21B18][.9B18.0000.0000.21B18] # CJK COMPATIBILITY IDEOGRAPH-2F871; QQC
+2F8F8 ; [.FB84.0020.0002.21D0B][.9D0B.0000.0000.21D0B] # CJK COMPATIBILITY IDEOGRAPH-2F8F8; QQC
+2F87B ; [.FB84.0020.0002.21DE4][.9DE4.0000.0000.21DE4] # CJK COMPATIBILITY IDEOGRAPH-2F87B; QQC
+2F87D ; [.FB84.0020.0002.21DE6][.9DE6.0000.0000.21DE6] # CJK COMPATIBILITY IDEOGRAPH-2F87D; QQC
+2F889 ; [.FB84.0020.0002.22183][.A183.0000.0000.22183] # CJK COMPATIBILITY IDEOGRAPH-2F889; QQC
+2F939 ; [.FB84.0020.0002.2219F][.A19F.0000.0000.2219F] # CJK COMPATIBILITY IDEOGRAPH-2F939; QQC
+2F891 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F891; QQC
+2F892 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F892; QQC
+2F8A4 ; [.FB84.0020.0002.226D4][.A6D4.0000.0000.226D4] # CJK COMPATIBILITY IDEOGRAPH-2F8A4; QQC
+FAD0 ; [.FB84.0020.0002.22844][.A844.0000.0000.22844] # CJK COMPATIBILITY IDEOGRAPH-FAD0; QQC
+FACF ; [.FB84.0020.0002.2284A][.A84A.0000.0000.2284A] # CJK COMPATIBILITY IDEOGRAPH-FACF; QQC
+2F8B8 ; [.FB84.0020.0002.22B0C][.AB0C.0000.0000.22B0C] # CJK COMPATIBILITY IDEOGRAPH-2F8B8; QQC
+2F8BE ; [.FB84.0020.0002.22BF1][.ABF1.0000.0000.22BF1] # CJK COMPATIBILITY IDEOGRAPH-2F8BE; QQC
+2F8CA ; [.FB84.0020.0002.2300A][.B00A.0000.0000.2300A] # CJK COMPATIBILITY IDEOGRAPH-2F8CA; QQC
+2F897 ; [.FB84.0020.0002.232B8][.B2B8.0000.0000.232B8] # CJK COMPATIBILITY IDEOGRAPH-2F897; QQC
+2F980 ; [.FB84.0020.0002.2335F][.B35F.0000.0000.2335F] # CJK COMPATIBILITY IDEOGRAPH-2F980; QQC
+2F989 ; [.FB84.0020.0002.23393][.B393.0000.0000.23393] # CJK COMPATIBILITY IDEOGRAPH-2F989; QQC
+2F98A ; [.FB84.0020.0002.2339C][.B39C.0000.0000.2339C] # CJK COMPATIBILITY IDEOGRAPH-2F98A; QQC
+2F8DD ; [.FB84.0020.0002.233C3][.B3C3.0000.0000.233C3] # CJK COMPATIBILITY IDEOGRAPH-2F8DD; QQC
+FAD1 ; [.FB84.0020.0002.233D5][.B3D5.0000.0000.233D5] # CJK COMPATIBILITY IDEOGRAPH-FAD1; QQC
+2F8E3 ; [.FB84.0020.0002.2346D][.B46D.0000.0000.2346D] # CJK COMPATIBILITY IDEOGRAPH-2F8E3; QQC
+2F8EC ; [.FB84.0020.0002.236A3][.B6A3.0000.0000.236A3] # CJK COMPATIBILITY IDEOGRAPH-2F8EC; QQC
+2F8F0 ; [.FB84.0020.0002.238A7][.B8A7.0000.0000.238A7] # CJK COMPATIBILITY IDEOGRAPH-2F8F0; QQC
+2F8F7 ; [.FB84.0020.0002.23A8D][.BA8D.0000.0000.23A8D] # CJK COMPATIBILITY IDEOGRAPH-2F8F7; QQC
+2F8F9 ; [.FB84.0020.0002.23AFA][.BAFA.0000.0000.23AFA] # CJK COMPATIBILITY IDEOGRAPH-2F8F9; QQC
+2F8FB ; [.FB84.0020.0002.23CBC][.BCBC.0000.0000.23CBC] # CJK COMPATIBILITY IDEOGRAPH-2F8FB; QQC
+2F906 ; [.FB84.0020.0002.23D1E][.BD1E.0000.0000.23D1E] # CJK COMPATIBILITY IDEOGRAPH-2F906; QQC
+2F90D ; [.FB84.0020.0002.23ED1][.BED1.0000.0000.23ED1] # CJK COMPATIBILITY IDEOGRAPH-2F90D; QQC
+2F910 ; [.FB84.0020.0002.23F5E][.BF5E.0000.0000.23F5E] # CJK COMPATIBILITY IDEOGRAPH-2F910; QQC
+2F911 ; [.FB84.0020.0002.23F8E][.BF8E.0000.0000.23F8E] # CJK COMPATIBILITY IDEOGRAPH-2F911; QQC
+2F91D ; [.FB84.0020.0002.24263][.C263.0000.0000.24263] # CJK COMPATIBILITY IDEOGRAPH-2F91D; QQC
+FA6C ; [.FB84.0020.0002.242EE][.C2EE.0000.0000.242EE] # CJK COMPATIBILITY IDEOGRAPH-FA6C; QQC
+2F91F ; [.FB84.0020.0002.243AB][.C3AB.0000.0000.243AB] # CJK COMPATIBILITY IDEOGRAPH-2F91F; QQC
+2F923 ; [.FB84.0020.0002.24608][.C608.0000.0000.24608] # CJK COMPATIBILITY IDEOGRAPH-2F923; QQC
+2F926 ; [.FB84.0020.0002.24735][.C735.0000.0000.24735] # CJK COMPATIBILITY IDEOGRAPH-2F926; QQC
+2F927 ; [.FB84.0020.0002.24814][.C814.0000.0000.24814] # CJK COMPATIBILITY IDEOGRAPH-2F927; QQC
+2F935 ; [.FB84.0020.0002.24C36][.CC36.0000.0000.24C36] # CJK COMPATIBILITY IDEOGRAPH-2F935; QQC
+2F937 ; [.FB84.0020.0002.24C92][.CC92.0000.0000.24C92] # CJK COMPATIBILITY IDEOGRAPH-2F937; QQC
+2F93B ; [.FB84.0020.0002.24FA1][.CFA1.0000.0000.24FA1] # CJK COMPATIBILITY IDEOGRAPH-2F93B; QQC
+2F93C ; [.FB84.0020.0002.24FB8][.CFB8.0000.0000.24FB8] # CJK COMPATIBILITY IDEOGRAPH-2F93C; QQC
+2F93D ; [.FB84.0020.0002.25044][.D044.0000.0000.25044] # CJK COMPATIBILITY IDEOGRAPH-2F93D; QQC
+2F942 ; [.FB84.0020.0002.250F2][.D0F2.0000.0000.250F2] # CJK COMPATIBILITY IDEOGRAPH-2F942; QQC
+2F941 ; [.FB84.0020.0002.250F3][.D0F3.0000.0000.250F3] # CJK COMPATIBILITY IDEOGRAPH-2F941; QQC
+2F943 ; [.FB84.0020.0002.25119][.D119.0000.0000.25119] # CJK COMPATIBILITY IDEOGRAPH-2F943; QQC
+2F944 ; [.FB84.0020.0002.25133][.D133.0000.0000.25133] # CJK COMPATIBILITY IDEOGRAPH-2F944; QQC
+FAD5 ; [.FB84.0020.0002.25249][.D249.0000.0000.25249] # CJK COMPATIBILITY IDEOGRAPH-FAD5; QQC
+2F94D ; [.FB84.0020.0002.2541D][.D41D.0000.0000.2541D] # CJK COMPATIBILITY IDEOGRAPH-2F94D; QQC
+2F952 ; [.FB84.0020.0002.25626][.D626.0000.0000.25626] # CJK COMPATIBILITY IDEOGRAPH-2F952; QQC
+2F954 ; [.FB84.0020.0002.2569A][.D69A.0000.0000.2569A] # CJK COMPATIBILITY IDEOGRAPH-2F954; QQC
+2F955 ; [.FB84.0020.0002.256C5][.D6C5.0000.0000.256C5] # CJK COMPATIBILITY IDEOGRAPH-2F955; QQC
+2F95C ; [.FB84.0020.0002.2597C][.D97C.0000.0000.2597C] # CJK COMPATIBILITY IDEOGRAPH-2F95C; QQC
+2F95D ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95D; QQC
+2F95E ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95E; QQC
+2F961 ; [.FB84.0020.0002.25BAB][.DBAB.0000.0000.25BAB] # CJK COMPATIBILITY IDEOGRAPH-2F961; QQC
+2F965 ; [.FB84.0020.0002.25C80][.DC80.0000.0000.25C80] # CJK COMPATIBILITY IDEOGRAPH-2F965; QQC
+FAD6 ; [.FB84.0020.0002.25CD0][.DCD0.0000.0000.25CD0] # CJK COMPATIBILITY IDEOGRAPH-FAD6; QQC
+2F96B ; [.FB84.0020.0002.25F86][.DF86.0000.0000.25F86] # CJK COMPATIBILITY IDEOGRAPH-2F96B; QQC
+2F898 ; [.FB84.0020.0002.261DA][.E1DA.0000.0000.261DA] # CJK COMPATIBILITY IDEOGRAPH-2F898; QQC
+2F972 ; [.FB84.0020.0002.26228][.E228.0000.0000.26228] # CJK COMPATIBILITY IDEOGRAPH-2F972; QQC
+2F973 ; [.FB84.0020.0002.26247][.E247.0000.0000.26247] # CJK COMPATIBILITY IDEOGRAPH-2F973; QQC
+2F975 ; [.FB84.0020.0002.262D9][.E2D9.0000.0000.262D9] # CJK COMPATIBILITY IDEOGRAPH-2F975; QQC
+2F977 ; [.FB84.0020.0002.2633E][.E33E.0000.0000.2633E] # CJK COMPATIBILITY IDEOGRAPH-2F977; QQC
+2F97B ; [.FB84.0020.0002.264DA][.E4DA.0000.0000.264DA] # CJK COMPATIBILITY IDEOGRAPH-2F97B; QQC
+2F97C ; [.FB84.0020.0002.26523][.E523.0000.0000.26523] # CJK COMPATIBILITY IDEOGRAPH-2F97C; QQC
+2F97E ; [.FB84.0020.0002.265A8][.E5A8.0000.0000.265A8] # CJK COMPATIBILITY IDEOGRAPH-2F97E; QQC
+2F987 ; [.FB84.0020.0002.267A7][.E7A7.0000.0000.267A7] # CJK COMPATIBILITY IDEOGRAPH-2F987; QQC
+2F988 ; [.FB84.0020.0002.267B5][.E7B5.0000.0000.267B5] # CJK COMPATIBILITY IDEOGRAPH-2F988; QQC
+2F997 ; [.FB84.0020.0002.26B3C][.EB3C.0000.0000.26B3C] # CJK COMPATIBILITY IDEOGRAPH-2F997; QQC
+2F9A4 ; [.FB84.0020.0002.26C36][.EC36.0000.0000.26C36] # CJK COMPATIBILITY IDEOGRAPH-2F9A4; QQC
+2F9A6 ; [.FB84.0020.0002.26CD5][.ECD5.0000.0000.26CD5] # CJK COMPATIBILITY IDEOGRAPH-2F9A6; QQC
+2F9A5 ; [.FB84.0020.0002.26D6B][.ED6B.0000.0000.26D6B] # CJK COMPATIBILITY IDEOGRAPH-2F9A5; QQC
+2F9AD ; [.FB84.0020.0002.26F2C][.EF2C.0000.0000.26F2C] # CJK COMPATIBILITY IDEOGRAPH-2F9AD; QQC
+2F9B0 ; [.FB84.0020.0002.26FB1][.EFB1.0000.0000.26FB1] # CJK COMPATIBILITY IDEOGRAPH-2F9B0; QQC
+2F9B1 ; [.FB84.0020.0002.270D2][.F0D2.0000.0000.270D2] # CJK COMPATIBILITY IDEOGRAPH-2F9B1; QQC
+2F9AB ; [.FB84.0020.0002.273CA][.F3CA.0000.0000.273CA] # CJK COMPATIBILITY IDEOGRAPH-2F9AB; QQC
+2F9C5 ; [.FB84.0020.0002.27667][.F667.0000.0000.27667] # CJK COMPATIBILITY IDEOGRAPH-2F9C5; QQC
+2F9CB ; [.FB84.0020.0002.278AE][.F8AE.0000.0000.278AE] # CJK COMPATIBILITY IDEOGRAPH-2F9CB; QQC
+2F9CC ; [.FB84.0020.0002.27966][.F966.0000.0000.27966] # CJK COMPATIBILITY IDEOGRAPH-2F9CC; QQC
+2F9D3 ; [.FB84.0020.0002.27CA8][.FCA8.0000.0000.27CA8] # CJK COMPATIBILITY IDEOGRAPH-2F9D3; QQC
+FAD7 ; [.FB84.0020.0002.27ED3][.FED3.0000.0000.27ED3] # CJK COMPATIBILITY IDEOGRAPH-FAD7; QQC
+2F9D8 ; [.FB84.0020.0002.27F2F][.FF2F.0000.0000.27F2F] # CJK COMPATIBILITY IDEOGRAPH-2F9D8; QQC
+2F9E0 ; [.FB85.0020.0002.285D2][.85D2.0000.0000.285D2] # CJK COMPATIBILITY IDEOGRAPH-2F9E0; QQC
+2F9E1 ; [.FB85.0020.0002.285ED][.85ED.0000.0000.285ED] # CJK COMPATIBILITY IDEOGRAPH-2F9E1; QQC
+2F9E5 ; [.FB85.0020.0002.2872E][.872E.0000.0000.2872E] # CJK COMPATIBILITY IDEOGRAPH-2F9E5; QQC
+2F9ED ; [.FB85.0020.0002.28BFA][.8BFA.0000.0000.28BFA] # CJK COMPATIBILITY IDEOGRAPH-2F9ED; QQC
+2F9F1 ; [.FB85.0020.0002.28D77][.8D77.0000.0000.28D77] # CJK COMPATIBILITY IDEOGRAPH-2F9F1; QQC
+2F9F6 ; [.FB85.0020.0002.29145][.9145.0000.0000.29145] # CJK COMPATIBILITY IDEOGRAPH-2F9F6; QQC
+2F81C ; [.FB85.0020.0002.291DF][.91DF.0000.0000.291DF] # CJK COMPATIBILITY IDEOGRAPH-2F81C; QQC
+2F9F7 ; [.FB85.0020.0002.2921A][.921A.0000.0000.2921A] # CJK COMPATIBILITY IDEOGRAPH-2F9F7; QQC
+2F9FB ; [.FB85.0020.0002.2940A][.940A.0000.0000.2940A] # CJK COMPATIBILITY IDEOGRAPH-2F9FB; QQC
+2F9FD ; [.FB85.0020.0002.29496][.9496.0000.0000.29496] # CJK COMPATIBILITY IDEOGRAPH-2F9FD; QQC
+2FA01 ; [.FB85.0020.0002.295B6][.95B6.0000.0000.295B6] # CJK COMPATIBILITY IDEOGRAPH-2FA01; QQC
+2FA09 ; [.FB85.0020.0002.29B30][.9B30.0000.0000.29B30] # CJK COMPATIBILITY IDEOGRAPH-2FA09; QQC
+2FA10 ; [.FB85.0020.0002.2A0CE][.A0CE.0000.0000.2A0CE] # CJK COMPATIBILITY IDEOGRAPH-2FA10; QQC
+2FA12 ; [.FB85.0020.0002.2A105][.A105.0000.0000.2A105] # CJK COMPATIBILITY IDEOGRAPH-2FA12; QQC
+2FA13 ; [.FB85.0020.0002.2A20E][.A20E.0000.0000.2A20E] # CJK COMPATIBILITY IDEOGRAPH-2FA13; QQC
+2FA14 ; [.FB85.0020.0002.2A291][.A291.0000.0000.2A291] # CJK COMPATIBILITY IDEOGRAPH-2FA14; QQC
+2F88F ; [.FB85.0020.0002.2A392][.A392.0000.0000.2A392] # CJK COMPATIBILITY IDEOGRAPH-2F88F; QQC
+2FA1D ; [.FB85.0020.0002.2A600][.A600.0000.0000.2A600] # CJK COMPATIBILITY IDEOGRAPH-2FA1D; QQC
diff --git a/mysql-test/std_data/versioning/articles.frm.gz b/mysql-test/std_data/versioning/articles.frm.gz
deleted file mode 100644
index fd3a0a8c0d4..00000000000
--- a/mysql-test/std_data/versioning/articles.frm.gz
+++ /dev/null
Binary files differ
diff --git a/mysql-test/std_data/versioning/articles2.frm.gz b/mysql-test/std_data/versioning/articles2.frm.gz
deleted file mode 100644
index 70f20c2e081..00000000000
--- a/mysql-test/std_data/versioning/articles2.frm.gz
+++ /dev/null
Binary files differ
diff --git a/mysql-test/std_data/versioning/ibdata1.gz b/mysql-test/std_data/versioning/ibdata1.gz
deleted file mode 100644
index 345217ba593..00000000000
--- a/mysql-test/std_data/versioning/ibdata1.gz
+++ /dev/null
Binary files differ
diff --git a/mysql-test/std_data/versioning/user_stopword.frm.gz b/mysql-test/std_data/versioning/user_stopword.frm.gz
deleted file mode 100644
index 4a17265fabb..00000000000
--- a/mysql-test/std_data/versioning/user_stopword.frm.gz
+++ /dev/null
Binary files differ
diff --git a/mysql-test/suite.pm b/mysql-test/suite.pm
index 4cc6b410fa1..f30cc5ec431 100644
--- a/mysql-test/suite.pm
+++ b/mysql-test/suite.pm
@@ -87,6 +87,31 @@ sub skip_combinations {
$skip{'main/ssl_verify_ip.test'} = 'x509v3 support required'
unless $openssl_ver ge "1.0.2";
+ sub utf8_command_line_ok() {
+ if (IS_WINDOWS) {
+ # Can use UTF8 on command line since Windows 10 1903 (10.0.18362)
+ # or if OS codepage is set to UTF8
+ my($os_name, $os_major, $os_minor, $os_build, $os_id) = Win32::GetOSVersion();
+ if($os_major lt 10){
+ return 0;
+ } elsif($os_major gt 10 or $os_minor gt 0 or $os_build ge 18362){
+ return 1;
+ } elsif(Win32::GetACP() eq 65001) {
+ return 1;
+ }
+ return 0;
+ }
+ return 1;
+ }
+
+ $skip{'include/check_utf8_cli.inc'} = 'No utf8 command line support'
+ unless utf8_command_line_ok();
+
+ $skip{'include/no_utf8_cli.inc'} = 'Not tested with utf8 command line support'
+ unless !utf8_command_line_ok();
+
+ $skip{'include/check_windows_admin.inc'} = 'Requires admin privileges'
+ unless IS_WINDOWS and Win32::IsAdminUser();
%skip;
}
diff --git a/mysql-test/suite/archive/archive.result b/mysql-test/suite/archive/archive.result
index fa2b4f7ee00..022b400fd97 100644
--- a/mysql-test/suite/archive/archive.result
+++ b/mysql-test/suite/archive/archive.result
@@ -1,6 +1,5 @@
CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
call mtr.add_suppression("Table 't1' is marked as crashed and should be repaired");
-DROP TABLE if exists t1,t2,t3,t4,t5,t6;
SET default_storage_engine=ARCHIVE;
CREATE TABLE t1 (
Period smallint(4) unsigned zerofill DEFAULT '0000' NOT NULL,
@@ -12881,6 +12880,9 @@ show warnings;
Level Code Message
Error 1194 Table 't1' is marked as crashed and should be repaired
drop table t1;
+#
+# temporary archive
+#
create temporary table t1 (a int) engine=archive;
insert t1 values (1),(2),(3);
select * from t1;
@@ -12906,3 +12908,14 @@ t1 CREATE TEMPORARY TABLE `t1` (
`b` varchar(10) DEFAULT NULL
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
drop table t1;
+#
+# End of 10.0 tests
+#
+#
+# MDEV-27396 DESC index attribute remains in Archive table definition, despite being apparently ignored
+#
+create table t (t int auto_increment, key (t desc)) engine=archive;
+ERROR HY000: Can't create table `test`.`t` (errno: 140 "Wrong create options")
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/suite/archive/archive.test b/mysql-test/suite/archive/archive.test
index 2d184110a2d..b6920827005 100644
--- a/mysql-test/suite/archive/archive.test
+++ b/mysql-test/suite/archive/archive.test
@@ -7,10 +7,6 @@
CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
call mtr.add_suppression("Table 't1' is marked as crashed and should be repaired");
---disable_warnings
-DROP TABLE if exists t1,t2,t3,t4,t5,t6;
---enable_warnings
-
SET default_storage_engine=ARCHIVE;
let $MYSQLD_DATADIR= `SELECT @@datadir`;
@@ -1770,9 +1766,9 @@ select * from t1;
show warnings;
drop table t1;
-#
-# temporary archive
-#
+--echo #
+--echo # temporary archive
+--echo #
create temporary table t1 (a int) engine=archive;
insert t1 values (1),(2),(3);
select * from t1;
@@ -1782,3 +1778,16 @@ select * from t1;
show create table t1;
drop table t1;
+--echo #
+--echo # End of 10.0 tests
+--echo #
+
+--echo #
+--echo # MDEV-27396 DESC index attribute remains in Archive table definition, despite being apparently ignored
+--echo #
+--error ER_CANT_CREATE_TABLE
+create table t (t int auto_increment, key (t desc)) engine=archive;
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/suite/archive/archive_gis.result b/mysql-test/suite/archive/archive_gis.result
index b629f09f5f2..a137888662f 100644
--- a/mysql-test/suite/archive/archive_gis.result
+++ b/mysql-test/suite/archive/archive_gis.result
@@ -452,9 +452,9 @@ ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
drop table t1;
create table t1 (pk integer primary key auto_increment, fl geometry not null);
insert into t1 (fl) values (1);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 (fl) values (1.11);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'decimal' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 (fl) values ("qwerty");
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
insert into t1 (fl) values (pointfromtext('point(1,1)'));
diff --git a/mysql-test/suite/atomic/alter_partition,innodb.rdiff b/mysql-test/suite/atomic/alter_partition,innodb.rdiff
new file mode 100644
index 00000000000..571136eb626
--- /dev/null
+++ b/mysql-test/suite/atomic/alter_partition,innodb.rdiff
@@ -0,0 +1,525 @@
+--- alter_partition.result
++++ alter_partition,innodb.reject
+@@ -17,12 +17,9 @@
+ end $
+ # QUERY: ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1
+ # CRASH: crash_create_before_create_frm
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -38,12 +35,9 @@
+ 12
+ 22
+ # CRASH: crash_alter_partition_after_create_frm
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -59,12 +53,9 @@
+ 12
+ 22
+ # CRASH: crash_alter_partition_after_write_frm
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -80,12 +71,9 @@
+ 12
+ 22
+ # CRASH: crash_convert_partition_1
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -101,12 +89,9 @@
+ 12
+ 22
+ # CRASH: crash_convert_partition_2
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -122,12 +107,9 @@
+ 12
+ 22
+ # CRASH: crash_convert_partition_3
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -143,12 +125,9 @@
+ 12
+ 22
+ # CRASH: crash_convert_partition_4
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -164,12 +143,9 @@
+ 12
+ 22
+ # CRASH: crash_convert_partition_5
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -185,12 +161,9 @@
+ 12
+ 22
+ # CRASH: crash_convert_partition_6
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -206,12 +179,9 @@
+ 12
+ 22
+ # CRASH: crash_convert_partition_7
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -227,12 +197,9 @@
+ 12
+ 22
+ # CRASH: crash_convert_partition_8
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ Table Create Table
+@@ -248,15 +215,12 @@
+ 12
+ 22
+ # CRASH: crash_convert_partition_9
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp1.MYD
+-tp1.MYI
+ tp1.frm
++tp1.ibd
+ master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+@@ -275,15 +239,12 @@
+ x
+ 12
+ # CRASH: crash_convert_partition_10
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp1.MYD
+-tp1.MYI
+ tp1.frm
++tp1.ibd
+ master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+@@ -302,15 +263,12 @@
+ x
+ 12
+ # CRASH: crash_convert_partition_11
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp1.MYD
+-tp1.MYI
+ tp1.frm
++tp1.ibd
+ master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+@@ -330,14 +288,10 @@
+ 12
+ # QUERY: ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+ # NO CRASH: crash_create_before_create_frm
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#p2.MYD
+-t1#P#p2.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#p2.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+@@ -357,14 +311,10 @@
+ 32
+ 39
+ # NO CRASH: crash_alter_partition_after_create_frm
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#p2.MYD
+-t1#P#p2.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#p2.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+@@ -384,14 +334,10 @@
+ 32
+ 39
+ # NO CRASH: crash_alter_partition_after_write_frm
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#p2.MYD
+-t1#P#p2.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#p2.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+@@ -411,17 +357,13 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_1
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp2.MYD
+-tp2.MYI
+ tp2.frm
++tp2.ibd
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+@@ -442,17 +384,13 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_2
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp2.MYD
+-tp2.MYI
+ tp2.frm
++tp2.ibd
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+@@ -473,17 +411,13 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_3
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp2.MYD
+-tp2.MYI
+ tp2.frm
++tp2.ibd
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+@@ -504,17 +438,13 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_4
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp2.MYD
+-tp2.MYI
+ tp2.frm
++tp2.ibd
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+@@ -535,17 +465,13 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_5
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp2.MYD
+-tp2.MYI
+ tp2.frm
++tp2.ibd
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+@@ -566,17 +492,13 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_6
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp2.MYD
+-tp2.MYI
+ tp2.frm
++tp2.ibd
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+@@ -597,17 +519,13 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_7
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp2.MYD
+-tp2.MYI
+ tp2.frm
++tp2.ibd
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+@@ -628,17 +546,13 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_8
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+-tp2.MYD
+-tp2.MYI
+ tp2.frm
++tp2.ibd
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+@@ -659,14 +573,10 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_9
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#p2.MYD
+-t1#P#p2.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#p2.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+@@ -686,14 +596,10 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_10
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#p2.MYD
+-t1#P#p2.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#p2.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+@@ -713,14 +619,10 @@
+ 32
+ 39
+ # CRASH: crash_convert_partition_11
+-t1#P#p0.MYD
+-t1#P#p0.MYI
+-t1#P#p1.MYD
+-t1#P#p1.MYI
+-t1#P#p2.MYD
+-t1#P#p2.MYI
+-t1#P#pn.MYD
+-t1#P#pn.MYI
++t1#P#p0.ibd
++t1#P#p1.ibd
++t1#P#p2.ibd
++t1#P#pn.ibd
+ t1.frm
+ t1.par
+ master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
diff --git a/mysql-test/suite/atomic/alter_partition.combinations b/mysql-test/suite/atomic/alter_partition.combinations
new file mode 100644
index 00000000000..898d2f2f332
--- /dev/null
+++ b/mysql-test/suite/atomic/alter_partition.combinations
@@ -0,0 +1,6 @@
+[innodb]
+innodb
+
+[myisam]
+
+[aria]
diff --git a/mysql-test/suite/atomic/alter_partition.result b/mysql-test/suite/atomic/alter_partition.result
new file mode 100644
index 00000000000..c4af43ad1bd
--- /dev/null
+++ b/mysql-test/suite/atomic/alter_partition.result
@@ -0,0 +1,743 @@
+# Crash recovery
+create or replace procedure prepare_table(r int)
+begin
+create or replace table t1 (x int)
+with system versioning
+partition by range(x) (
+partition p0 values less than (10),
+partition p1 values less than (20),
+partition pn values less than (30));
+insert into t1 values (2), (12), (22);
+if r > 1 then
+create or replace table tp2 (x int)
+with system versioning;
+insert into tp2 values (32), (39);
+end if;
+flush tables;
+end $
+# QUERY: ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1
+# CRASH: crash_create_before_create_frm
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_alter_partition_after_create_frm
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_alter_partition_after_write_frm
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_convert_partition_1
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_convert_partition_2
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_convert_partition_3
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_convert_partition_4
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_convert_partition_5
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_convert_partition_6
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_convert_partition_7
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_convert_partition_8
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+# CRASH: crash_convert_partition_9
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp1.MYD
+tp1.MYI
+tp1.frm
+master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+22
+Table Create Table
+tp1 CREATE TABLE `tp1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+12
+# CRASH: crash_convert_partition_10
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp1.MYD
+tp1.MYI
+tp1.frm
+master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+22
+Table Create Table
+tp1 CREATE TABLE `tp1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+12
+# CRASH: crash_convert_partition_11
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp1.MYD
+tp1.MYI
+tp1.frm
+master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+22
+Table Create Table
+tp1 CREATE TABLE `tp1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+12
+# QUERY: ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+# NO CRASH: crash_create_before_create_frm
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p2` VALUES LESS THAN (40) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+32
+39
+# NO CRASH: crash_alter_partition_after_create_frm
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p2` VALUES LESS THAN (40) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+32
+39
+# NO CRASH: crash_alter_partition_after_write_frm
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p2` VALUES LESS THAN (40) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+32
+39
+# CRASH: crash_convert_partition_1
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+32
+39
+# CRASH: crash_convert_partition_2
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+32
+39
+# CRASH: crash_convert_partition_3
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+32
+39
+# CRASH: crash_convert_partition_4
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+32
+39
+# CRASH: crash_convert_partition_5
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+32
+39
+# CRASH: crash_convert_partition_6
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+32
+39
+# CRASH: crash_convert_partition_7
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+32
+39
+# CRASH: crash_convert_partition_8
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+x
+32
+39
+# CRASH: crash_convert_partition_9
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p2` VALUES LESS THAN (40) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+32
+39
+# CRASH: crash_convert_partition_10
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p2` VALUES LESS THAN (40) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+32
+39
+# CRASH: crash_convert_partition_11
+t1#P#p0.MYD
+t1#P#p0.MYI
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+master-bin.000001 # Query # # use `test`; ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p1` VALUES LESS THAN (20) ENGINE = DEFAULT_ENGINE,
+ PARTITION `pn` VALUES LESS THAN (30) ENGINE = DEFAULT_ENGINE,
+ PARTITION `p2` VALUES LESS THAN (40) ENGINE = DEFAULT_ENGINE)
+x
+2
+12
+22
+32
+39
+Warnings:
+Note 1051 Unknown table 'test.t1'
diff --git a/mysql-test/suite/atomic/alter_partition.test b/mysql-test/suite/atomic/alter_partition.test
new file mode 100644
index 00000000000..23b996cf5a1
--- /dev/null
+++ b/mysql-test/suite/atomic/alter_partition.test
@@ -0,0 +1,174 @@
+--source include/have_partition.inc
+--source include/have_debug.inc
+--source include/have_sequence.inc
+--source include/binlog_combinations.inc
+--source include/have_binlog_format_row_or_statement.inc
+--source include/not_valgrind.inc
+
+let $default_engine=InnoDB;
+let $extra_option=;
+let $save_debug=`select @@debug_dbug`;
+
+if ($MTR_COMBINATION_MYISAM)
+{
+ let $default_engine=MyISAM;
+}
+if ($MTR_COMBINATION_ARIA)
+{
+ let $default_engine=Aria;
+ let $extra_option=transactional=1;
+}
+
+if ($MTR_COMBINATION_STMT)
+{
+ let $binlog_format=include/set_binlog_format_statement.sql;
+}
+if ($MTR_COMBINATION_ROW)
+{
+ let $binlog_format=include/set_binlog_format_row.sql;
+}
+
+--disable_query_log
+--eval set @@default_storage_engine=$default_engine
+--enable_query_log
+
+--echo # Crash recovery
+
+let $MYSQLD_DATADIR= `SELECT @@datadir`;
+
+let $crash_count= 14;
+let $crash_points='crash_create_before_create_frm',
+ 'crash_alter_partition_after_create_frm',
+ 'crash_alter_partition_after_write_frm',
+ 'crash_convert_partition_1',
+ 'crash_convert_partition_2',
+ 'crash_convert_partition_3',
+ 'crash_convert_partition_4',
+ 'crash_convert_partition_5',
+ 'crash_convert_partition_6',
+ 'crash_convert_partition_7',
+ 'crash_convert_partition_8',
+ 'crash_convert_partition_9',
+ 'crash_convert_partition_10',
+ 'crash_convert_partition_11';
+
+#let $crash_count= 1;
+#let $crash_points= 'crash_convert_partition_10';
+
+let $statement_count= 2;
+let $statements= 'ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE tp1',
+ 'ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)';
+
+#let $statement_count= 1;
+#let $statements= 'ALTER TABLE t1 CONVERT TABLE tp2 TO PARTITION p2 values less than (40)';
+
+--delimiter $
+create or replace procedure prepare_table(r int)
+begin
+ create or replace table t1 (x int)
+ with system versioning
+ partition by range(x) (
+ partition p0 values less than (10),
+ partition p1 values less than (20),
+ partition pn values less than (30));
+ insert into t1 values (2), (12), (22);
+
+ if r > 1 then
+ create or replace table tp2 (x int)
+ with system versioning;
+ insert into tp2 values (32), (39);
+ end if;
+
+ flush tables;
+end $
+--delimiter ;
+
+let $old_debug=`select @@debug_dbug`;
+
+let $keep_include_silent=1;
+let $grep_script=ALTER;
+--disable_query_log
+
+let $r=0;
+while ($r < $statement_count)
+{
+ inc $r;
+ let $statement=`select ELT($r, $statements)`;
+ --echo # QUERY: $statement
+
+ let $c=0;
+ while ($c < $crash_count)
+ {
+ inc $c;
+ let $crash=`select ELT($c, $crash_points)`;
+
+ --eval set @@default_storage_engine=$default_engine
+ eval call prepare_table($r);
+ if (!$c)
+ {
+ lock tables t1 write;
+ }
+
+ --source $binlog_format
+
+ RESET MASTER;
+ --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
+ --disable_reconnect
+ --eval set @@debug_dbug="+d,$crash"
+ let $errno=0;
+ --error 0,2013
+ --eval $statement;
+ let $error=$errno;
+ --enable_reconnect
+ --source include/wait_until_connected_again.inc
+ --disable_query_log
+ --eval set @@debug_dbug="$old_debug"
+
+ if ($error == 0)
+ {
+ --echo # NO CRASH: $crash
+ }
+ if ($error)
+ {
+ --echo # CRASH: $crash
+ }
+ # Check which tables still exists
+ --replace_result MAI MYI MAD MYD
+ --list_files $MYSQLD_DATADIR/test t*
+ --replace_regex /backup-\d+/backup/
+ --list_files $MYSQLD_DATADIR/test *sql*
+ --remove_files_wildcard $MYSQLD_DATADIR/test *sql-backup-*
+
+ --let $binlog_file=master-bin.000001
+ --source include/show_binlog_events.inc
+ if ($error)
+ {
+ --let $binlog_file=master-bin.000002
+ --source include/show_binlog_events.inc
+ }
+
+ --replace_result $default_engine DEFAULT_ENGINE ' PAGE_CHECKSUM=1' ''
+ show create table t1;
+ select * from t1;
+ --replace_result $default_engine DEFAULT_ENGINE ' PAGE_CHECKSUM=1' ''
+ --error 0, ER_NO_SUCH_TABLE
+ show create table tp1;
+ --error 0, ER_NO_SUCH_TABLE
+ select * from tp1;
+ --replace_result $default_engine DEFAULT_ENGINE ' PAGE_CHECKSUM=1' ''
+ --error 0, ER_NO_SUCH_TABLE
+ show create table tp2;
+ --error 0, ER_NO_SUCH_TABLE
+ select * from tp2;
+ # Drop the tables. The warnings will show what was dropped
+ --disable_warnings
+ drop table t1;
+ drop table if exists tp1;
+ --enable_warnings
+ }
+}
+drop table if exists t1;
+drop procedure prepare_table;
+--eval set @@debug_dbug="$save_debug"
+
+--enable_query_log
diff --git a/mysql-test/suite/binlog/include/mysqlbinlog_gtid_strict_mode.inc b/mysql-test/suite/binlog/include/mysqlbinlog_gtid_strict_mode.inc
new file mode 100644
index 00000000000..5150e9060b5
--- /dev/null
+++ b/mysql-test/suite/binlog/include/mysqlbinlog_gtid_strict_mode.inc
@@ -0,0 +1,421 @@
+#
+# This file runs test cases for using --gtid-strict-mode with mariadb-binlog to
+# ensure warnings are properly displayed
+#
+# param $is_strict_mode boolean (0 for false, 1 for true) to enable or
+# disable strict mode for GTID processing
+#
+
+--let MYSQLD_DATADIR=`select @@datadir`
+--let OUT_FILE=$MYSQLTEST_VARDIR/tmp/binlog.out
+
+if ($is_strict_mode == 0)
+{
+ --let BINLOG_STRICT_MODE_PARAM=--skip-gtid-strict-mode
+}
+if ($is_strict_mode == 1)
+{
+ --let BINLOG_STRICT_MODE_PARAM=--gtid-strict-mode
+}
+if ($is_verbose == 1)
+{
+ --let BINLOG_STRICT_MODE_PARAM=$BINLOG_STRICT_MODE_PARAM -vvv
+}
+
+--let $log_error_ = $MYSQLTEST_VARDIR/tmp/out.err
+--let SEARCH_FILE=$log_error_
+
+--echo #
+--echo # Test Case 1:
+--echo # Sequential sequence numbers results in no errors or warnings
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 2:
+--echo # A skipped sequence number results in no errors or warnings if all
+--echo # numbers are monotonic (i.e. gaps in sequence number are allowed
+--echo # provided they never decrease)
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 5;
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 3:
+--echo # A sequence number lower than the last processed value results in a
+--echo # warning or error
+CREATE TABLE t1 (a int);
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 1;
+INSERT INTO t1 values (1);
+FLUSH LOGS;
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX: Found out of order GTID
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 4:
+--echo # Skipping a GTID and later receiving it results in a warning or error
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX: Found out of order GTID
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 5:
+--echo # Repeat sequence numbers produce a warning
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX: Found out of order GTID
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 6:
+--echo # Warnings from different domains are all displayed
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t2 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t2 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t2 values (4);
+FLUSH LOGS;
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX: Found out of order GTID
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+DROP TABLE t2;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 7:
+--echo # A decreasing seq_no before a start-position is ignored
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+--let $start_binlog_pos= query_get_value(SHOW MASTER STATUS,Position, 1)
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+
+--echo # GTID-based start-position
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-4 $BINLOG_STRICT_MODE_PARAM > log_error_ > OUT_FILE
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-4 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX
+--source include/search_pattern_in_file.inc
+
+--echo # Position-based start-position
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=start_binlog_pos $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=$start_binlog_pos $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX
+--source include/search_pattern_in_file.inc
+
+--remove_file $log_error_
+DROP TABLE t1;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 8:
+--echo # A decreasing seq_no inside of a --start/--stop position window is
+--echo # displayed
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+--let $start_binlog_pos= query_get_value(SHOW MASTER STATUS,Position, 1)
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 5;
+INSERT INTO t1 values (4);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 6;
+INSERT INTO t1 values (5);
+--let $stop_binlog_pos= query_get_value(SHOW MASTER STATUS,Position, 1)
+FLUSH LOGS;
+
+--echo # GTID-based window
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --stop-position=0-1-6 $BINLOG_STRICT_MODE_PARAM > log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --stop-position=0-1-6 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX: Found out of order GTID
+--source include/search_pattern_in_file.inc
+
+--echo # Position-based window
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=start_binlog_pos --stop-position=stop_binlog_pos $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=$start_binlog_pos --stop-position=$stop_binlog_pos $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX: Found out of order GTID
+--source include/search_pattern_in_file.inc
+
+--remove_file $log_error_
+DROP TABLE t1;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 9:
+--echo # Error if --stop-position is not greater than or equal to
+--echo # --start-position
+--echo #
+--echo # Note: Error is only displayed in strict mode, -vvv has no effect here
+FLUSH LOGS;
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2 --stop-position=0-1-1 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2 --stop-position=0-1-1 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=ERROR: Queried GTID range is invalid in strict mode
+--source include/search_pattern_in_file.inc
+
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2,1-2-1 --stop-position=0-1-1,1-2-2 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2,1-2-1 --stop-position=0-1-1,1-2-2 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=ERROR: Queried GTID range is invalid in strict mode
+--source include/search_pattern_in_file.inc
+RESET MASTER;
+
+--echo #
+--echo # Test Case 10:
+--echo # Strict mode warnings should be independent of --offset option
+--echo # specification
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --offset=8 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --offset=8 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX: Found out of order GTID
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 11:
+--echo # Strict mode warnings should be independent of --start-timestamp
+--echo # option specification
+set @a=UNIX_TIMESTAMP("1970-01-21 15:32:22");
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+SET timestamp=@a;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+SET timestamp=@a+1;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+SET timestamp=@a+2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+SET timestamp=@a+3;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --start-datetime="1970-01-21 15:32:24" $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--error $is_strict_mode
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --start-datetime="1970-01-21 15:32:24" $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=$DEFAULT_ERROR_PREFIX: Found out of order GTID
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 12:
+--echo # Specifying multiple binary logs with a log-position start should
+--echo # skip GTID state verification
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+--let $b2_start_pos= query_get_value(SHOW MASTER STATUS,Position, 1)
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+INSERT INTO t2 values (1);
+FLUSH LOGS;
+INSERT INTO t2 values (2);
+FLUSH LOGS;
+--let BINLOG_FILE1= query_get_value(SHOW BINARY LOGS, Log_name, 1)
+# Skip file 2 as input
+--let BINLOG_FILE2= query_get_value(SHOW BINARY LOGS, Log_name, 2)
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE1 MYSQLD_DATADIR/BINLOG_FILE2 --start-position=b2_start_pos $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/$BINLOG_FILE1 $MYSQLD_DATADIR/$BINLOG_FILE2 --start-position=$b2_start_pos $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+DROP TABLE t1;
+DROP TABLE t2;
+
+
+--echo #
+--echo # Test Case 13:
+--echo # If multiple binary logs should be specified but a middle log is
+--echo # missing, we should detect that and warn when using -vvv
+
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+FLUSH LOGS;
+INSERT INTO t1 values (1);
+--let $b2_start_pos= query_get_value(SHOW MASTER STATUS,Position, 1)
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+FLUSH LOGS;
+SET @@session.gtid_domain_id= 2;
+SET @@session.server_id= 3;
+CREATE TABLE t3 (a int);
+FLUSH LOGS;
+
+--echo #
+--echo # GLLE from each log for state reference
+--let $binlog_file= query_get_value(SHOW BINARY LOGS, Log_name, 1)
+--source include/show_gtid_list.inc
+--let $binlog_file=
+--let $binlog_file= query_get_value(SHOW BINARY LOGS, Log_name, 2)
+--source include/show_gtid_list.inc
+--let $binlog_file=
+--let $binlog_file= query_get_value(SHOW BINARY LOGS, Log_name, 3)
+--source include/show_gtid_list.inc
+--let $binlog_file=
+
+--let BINLOG_FILE1= query_get_value(SHOW BINARY LOGS, Log_name, 1)
+# Skip file 2 as input
+--let BINLOG_FILE3= query_get_value(SHOW BINARY LOGS, Log_name, 3)
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE1 MYSQLD_DATADIR/BINLOG_FILE3 $BINLOG_STRICT_MODE_PARAM 2> log_error_ > OUT_FILE
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/$BINLOG_FILE1 $MYSQLD_DATADIR/$BINLOG_FILE3 $BINLOG_STRICT_MODE_PARAM 2> $log_error_ > $OUT_FILE
+--echo # We should have two warnings about missing data from domains 0 and 1 if
+--echo # -vvv is specified
+--let SEARCH_FILE=$log_error_
+--let SEARCH_PATTERN=WARNING: Binary logs are missing data for domain 0[^\n]+the last seen event was
+--source include/search_pattern_in_file.inc
+--let SEARCH_PATTERN=WARNING: Binary logs are missing data for domain 1[^\n]+neither the starting GTID position list nor any processed events
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+RESET MASTER;
+
+--echo #
+--echo # Test Case 14:
+--echo # If a --stop-position GTID occurs before the first specified binlog's
+--echo # GLLE, error
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+FLUSH LOGS;
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+
+--echo #
+--echo # GLLE from each log for state reference
+--let $binlog_file= query_get_value(SHOW BINARY LOGS, Log_name, 1)
+--source include/show_gtid_list.inc
+--let $binlog_file=
+--let $binlog_file= query_get_value(SHOW BINARY LOGS, Log_name, 2)
+--source include/show_gtid_list.inc
+--let $binlog_file=
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE2 $BINLOG_STRICT_MODE_PARAM --stop-position=0-1-2 2> log_error_ > OUT_FILE
+--error 1
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/$BINLOG_FILE2 $BINLOG_STRICT_MODE_PARAM --stop-position=0-1-2 2> $log_error_ > $OUT_FILE
+--let SEARCH_PATTERN=ERROR: --stop-position GTID
+--source include/search_pattern_in_file.inc
+--remove_file $log_error_
+DROP TABLE t1;
+
+--remove_file $OUT_FILE
diff --git a/mysql-test/suite/binlog/include/mysqlbinlog_gtid_window_test_cases.inc b/mysql-test/suite/binlog/include/mysqlbinlog_gtid_window_test_cases.inc
new file mode 100644
index 00000000000..2830f3f665d
--- /dev/null
+++ b/mysql-test/suite/binlog/include/mysqlbinlog_gtid_window_test_cases.inc
@@ -0,0 +1,606 @@
+#
+# This file runs test cases for providing GTIDs to --start-position and
+# --stop-position arguments in mariadb-binlog
+#
+# param $is_remote boolean (0 for false, 1 for true) to perform a local file
+# or remote host analysis
+#
+
+--let MYSQLD_DATADIR=`select @@datadir`
+--let data_inconsistent_err= "table data is inconsistent after replaying binlog using GTID start/stop positions";
+--let $tmp_out_ = $MYSQLTEST_VARDIR/tmp/null.log
+
+## Initialize test data
+#
+set @a=UNIX_TIMESTAMP("1970-01-21 15:32:22");
+SET timestamp=@a;
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+--let $empty_binlog_pos= query_get_value(SHOW MASTER STATUS,Position, 1)
+CREATE TABLE t1 (a int);
+SET timestamp=@a+1;
+INSERT INTO t1 values (1), (2);
+--let test2_t1_mid_checksum= `CHECKSUM TABLE t1`
+
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+SET timestamp=@a+2;
+CREATE TABLE t2 (a int);
+SET timestamp=@a+3;
+INSERT INTO t2 values (1);
+--let t2_mid_checksum= `CHECKSUM TABLE t2`
+
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET timestamp=@a+4;
+INSERT INTO t1 values (3), (4);
+--let t1_final_checksum_pos= query_get_value(SHOW MASTER STATUS,Position, 1)
+--let t1_final_checksum= `CHECKSUM TABLE t1`
+
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+INSERT INTO t2 values (2);
+--let test4_t2_good_checksum= `CHECKSUM TABLE t2`
+
+SET @@session.server_id= 3;
+INSERT INTO t2 values (3);
+--let test3_t2_good_checksum= `CHECKSUM TABLE t2`
+
+SET @@session.server_id= 2;
+INSERT INTO t2 values (4);
+--let t2_final_checksum= `CHECKSUM TABLE t2`
+
+FLUSH LOGS;
+
+# Multiple binlog file case, used by test 18
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t3 (a int);
+INSERT INTO t3 VALUES (1);
+--let t3_final_checksum= `CHECKSUM TABLE t3`
+
+FLUSH LOGS;
+
+--echo # Gtid list event of the 2nd binlog file whose content is
+--echo # matched against --start-position in the following tests:
+--let $binlog_file= query_get_value(SHOW BINARY LOGS, Log_name, 2)
+--source include/show_gtid_list.inc
+--let $binlog_file=
+
+--let BINLOG_FILE= query_get_value(SHOW BINARY LOGS, Log_name, 1)
+--let BINLOG_FILE2= query_get_value(SHOW BINARY LOGS, Log_name, 2)
+
+if ($is_remote == 0)
+{
+ --let BINLOG_FILE_PARAM=$MYSQLD_DATADIR/$BINLOG_FILE.orig
+ --let BINLOG_FILE_PARAM2=$MYSQLD_DATADIR/$BINLOG_FILE2.orig
+}
+if ($is_remote == 1)
+{
+ --let BINLOG_FILE_PARAM= --read-from-remote-server $BINLOG_FILE
+ --let BINLOG_FILE_PARAM2= --read-from-remote-server $BINLOG_FILE2
+}
+
+--copy_file $MYSQLD_DATADIR/$BINLOG_FILE $MYSQLD_DATADIR/$BINLOG_FILE.orig
+--copy_file $MYSQLD_DATADIR/$BINLOG_FILE2 $MYSQLD_DATADIR/$BINLOG_FILE2.orig
+
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+
+
+--echo #
+--echo # Test Case 1:
+--echo # The end of the binlog file resets the server and domain id of the
+--echo # session
+
+# As gtid_domain_id and server_id should not change after reading binlog in GTID
+# mode, change variables to otherwise-unused values to ensure they remain
+--let $reset_gtid_domain_id = `select @@session.gtid_domain_id`
+--let $reset_server_id = `select @@session.server_id`
+SET @@session.gtid_domain_id= 10;
+SET @@session.server_id= 20;
+
+# Replay the binlog
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | $MYSQL
+--let $test_gtid_domain_id = `select @@session.gtid_domain_id`
+
+# Ensure variables haven't changed
+--let $assert_text = session gtid_domain_id should not change when reading binlog in GTID mode
+--let $assert_cond = @@session.gtid_domain_id = 10
+--source include/assert.inc
+--let $assert_text = session server_id should not change when reading binlog in GTID mode
+--let $assert_cond = @@session.server_id = 20
+--source include/assert.inc
+
+# Reset back to previous state
+--eval SET @@session.gtid_domain_id= $reset_gtid_domain_id
+--eval SET @@session.server_id= $reset_server_id
+DROP TABLE t1;
+
+
+--echo #
+--echo # Test Case 2:
+--echo # Single GTID range specified
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | $MYSQL
+
+if ($test2_t1_mid_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+DROP TABLE t1;
+
+
+--echo #
+--echo # Test Case 3:
+--echo # Single GTID range with different server_ids
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-0 --stop-position=1-3-4 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=1-2-0 --stop-position=1-3-4 | $MYSQL
+
+if ($test3_t2_good_checksum != `CHECKSUM TABLE t2`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't1'`)
+{
+ die "t1 should not exist as binlog replay should exclude domain 0 from stop position";
+}
+DROP TABLE t2;
+
+
+--echo #
+--echo # Test Case 4:
+--echo # Multiple GTID ranges specified
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 --stop-position=0-1-3,1-2-3 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 --stop-position=0-1-3,1-2-3 | $MYSQL
+
+# Reuse checksum spot from test 4
+if ($t1_final_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if ($test4_t2_good_checksum != `CHECKSUM TABLE t2`)
+{
+ die $data_inconsistent_err;
+}
+DROP TABLE t1;
+DROP TABLE t2;
+
+
+--echo #
+--echo # Test Case 5:
+--echo # Multiple GTID ranges specified where the domain ids are listed in
+--echo # different orders between start/stop position
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-3,1-2-3 --start-position=1-2-0,0-1-0 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --stop-position=0-1-3,1-2-3 --start-position=1-2-0,0-1-0 | $MYSQL
+
+# Reuse checksum spot from test 4
+if ($t1_final_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if ($test4_t2_good_checksum != `CHECKSUM TABLE t2`)
+{
+ die $data_inconsistent_err;
+}
+DROP TABLE t1;
+DROP TABLE t2;
+
+
+--echo #
+--echo # Test Case 6:
+--echo # Only start position specified
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (3), (4);
+--let test6_t1_mid_checksum= `CHECKSUM TABLE t1`
+DROP TABLE t1;
+CREATE TABLE t1 (a int);
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-2 | $MYSQL
+if ($test6_t1_mid_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if ($t2_final_checksum != `CHECKSUM TABLE t2`)
+{
+ die $data_inconsistent_err;
+}
+DROP TABLE t1;
+DROP TABLE t2;
+
+
+--echo #
+--echo # Test Case 7:
+--echo # Only stop position specified
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --stop-position=0-1-2 | $MYSQL
+
+# Reuse checksum spot from test 2
+if ($test2_t1_mid_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+DROP TABLE t1;
+
+
+--echo #
+--echo # Test Case 8:
+--echo # Seq_no=0 in --start-position includes all events for a domain
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 | $MYSQL
+if ($t1_final_checksum != `CHECKSUM TABLE t1`)
+{
+ die "t1 data should be complete as binlog replay should include domain 0 entirely in results";
+}
+if ($t2_final_checksum != `CHECKSUM TABLE t2`)
+{
+ die "t2 data should be complete as binlog replay should include domain 1 entirely in results";
+}
+DROP TABLE t1;
+DROP TABLE t2;
+
+--echo #
+--echo # Test Case 9:
+--echo # Seq_no=0 in --stop-position excludes all events for a domain
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-0,1-2-0 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --stop-position=0-1-0,1-2-0 | $MYSQL
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't1'`)
+{
+ die "t1 should not exist as binlog replay should exclude domain 0 from results";
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should exclude domain 1 from results";
+}
+
+--echo #
+--echo # Test Case 10:
+--echo # Output stops for all domain ids when all --stop-position GTID values
+--echo # have been hit.
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --stop-position=0-1-2 | $MYSQL
+if ($test2_t1_mid_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should exclude domain 1 from results";
+}
+DROP TABLE t1;
+
+--echo #
+--echo # Test Case 11:
+--echo # All GTID events from other domains are printed until the
+--echo # --stop-position values are hit
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --stop-position=1-3-4 | $MYSQL
+if ($test3_t2_good_checksum != `CHECKSUM TABLE t2`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't1'`)
+{
+ die "t1 should not exist as binlog replay should exclude domain 0 from stop position";
+}
+DROP TABLE t2;
+
+--echo #
+--echo # Test Case 12:
+--echo # Scalar and GTID values can be used together for stop or start
+--echo # position
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=empty_binlog_pos --stop-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=$empty_binlog_pos --stop-position=0-1-2 | $MYSQL
+if ($test2_t1_mid_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+DROP TABLE t1;
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=t1_final_checksum_pos | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=$t1_final_checksum_pos | $MYSQL
+if ($t1_final_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if ($t2_mid_checksum != `CHECKSUM TABLE t2`)
+{
+ die $data_inconsistent_err;
+}
+DROP TABLE t1;
+DROP TABLE t2;
+
+--echo #
+--echo # Test Case 13:
+--echo # If the start position is delayed within the binlog, events occurring
+--echo # before that position are ignored
+CREATE TABLE t1 (a int);
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-1 --stop-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-1 --stop-position=0-1-2 | $MYSQL
+if ($test2_t1_mid_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should exclude domain 1 from results";
+}
+DROP TABLE t1;
+
+--echo #
+--echo # Test Case 14:
+--echo # If start position is repeated, the last specification overrides all
+--echo # previous ones
+CREATE TABLE t1 (a int);
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --start-position=0-1-1 --stop-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-0 --start-position=0-1-1 --stop-position=0-1-2 | $MYSQL
+if ($test2_t1_mid_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should exclude domain 1 from results";
+}
+DROP TABLE t1;
+
+--echo #
+--echo # Test Case 15:
+--echo # If stop position is repeated, the last specification overrides all
+--echo # previous ones
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-1 --stop-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-1 --stop-position=0-1-2 | $MYSQL
+if ($test2_t1_mid_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should exclude domain 1 from results";
+}
+DROP TABLE t1;
+
+--echo #
+--echo # Test Case 16:
+--echo # Start position with --offset=<n> skips n events after the first
+--echo # GTID is found
+
+# t1 needs to be specified because its creation should be skipped from
+# --offset specification
+CREATE TABLE t1 (a int);
+
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 --offset=5 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 --offset=5 | $MYSQL
+if ($test2_t1_mid_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should exclude events after GTID 0-1-2";
+}
+DROP TABLE t1;
+
+--echo #
+--echo # Test Case 17:
+--echo # Start position with --start-datetime=<T> where T occurs after the
+--echo # specified GTID results in no events before T
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=1-2-2 --start-datetime="1970-01-21 15:32:24" | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=1-2-2 --start-datetime="1970-01-21 15:32:24" | $MYSQL
+if ($t2_mid_checksum != `CHECKSUM TABLE t2`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't1'`)
+{
+ die "t1 should not exist as binlog replay should exclude events before the given start-datetime";
+}
+DROP TABLE t2;
+
+--echo #
+--echo # Test Case 18:
+--echo # If --stop-position is specified, domains which are not present
+--echo # in its list should be excluded from output
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --stop-position=1-3-4 | $MYSQL
+
+if ($test3_t2_good_checksum != `CHECKSUM TABLE t2`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't1'`)
+{
+ die "t1 should not exist as binlog replay should exclude domain 0 from stop position";
+}
+DROP TABLE t2;
+
+--echo #
+--echo # Test Case 19:
+--echo # If the start and stop GTIDs in any domain are equal, the domain
+--echo # should not have any output
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 --stop-position=0-1-2 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-2 --stop-position=0-1-2 | $MYSQL
+
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't1'`)
+{
+ die "t1 should not exist as binlog replay should exclude domain 0 from stop position";
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should exclude domain 1 from stop position";
+}
+
+--echo #
+--echo # Test Case 20:
+--echo # If --start-position and --stop-position have different domain ids,
+--echo # only events from GTIDs in the --stop-position list are output
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-2 --stop-position=0-1-3 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=1-2-2 --stop-position=0-1-3 | $MYSQL
+if ($t1_final_checksum != `CHECKSUM TABLE t1`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should exclude domain 1 from stop position";
+}
+DROP TABLE t1;
+
+--echo #
+--echo # Test Case 21:
+--echo # Successive binary logs (e.g. logs with previous logs that have been
+--echo # purged) will write events when the --start-position matches their
+--echo # Gtid_list_log_event state
+if ($is_remote == 1)
+{
+ --echo #
+ --echo # Reset server state
+ RESET MASTER;
+ --exec $MYSQL_BINLOG $MYSQLD_DATADIR/$BINLOG_FILE.orig | $MYSQL
+ FLUSH LOGS;
+ --exec $MYSQL_BINLOG $MYSQLD_DATADIR/$BINLOG_FILE2.orig | $MYSQL
+ FLUSH LOGS;
+ --eval PURGE BINARY LOGS TO "$BINLOG_FILE2"
+ DROP TABLE t1;
+ DROP TABLE t2;
+ DROP TABLE t3;
+}
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | $MYSQL
+if ($t3_final_checksum != `CHECKSUM TABLE t3`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't1'`)
+{
+ die "t1 should not exist as binlog replay should not have any events from unspecified binlog file";
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should not have any events from unspecified binlog file";
+}
+DROP TABLE t3;
+
+--echo #
+--echo # Test Case 22:
+--echo # Successive binary logs can be called with --stop-position and
+--echo # without --start-position
+if ($is_remote == 1)
+{
+ --echo #
+ --echo # Reset server state
+ RESET MASTER;
+ --exec $MYSQL_BINLOG $MYSQLD_DATADIR/$BINLOG_FILE.orig | $MYSQL
+ FLUSH LOGS;
+ --exec $MYSQL_BINLOG $MYSQLD_DATADIR/$BINLOG_FILE2.orig | $MYSQL
+ FLUSH LOGS;
+ --eval PURGE BINARY LOGS TO "$BINLOG_FILE2"
+ DROP TABLE t1;
+ DROP TABLE t2;
+ DROP TABLE t3;
+}
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM2 --stop-position=0-1-4 | MYSQL
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM2 --stop-position=0-1-4 | $MYSQL
+if (`SELECT COUNT(*) FROM test.t3`)
+{
+ die $data_inconsistent_err;
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't1'`)
+{
+ die "t1 should not exist as binlog replay should not have any events from unspecified binlog file";
+}
+if (`SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 't2'`)
+{
+ die "t2 should not exist as binlog replay should not have any events from unspecified binlog file";
+}
+DROP TABLE t3;
+
+
+if ($is_remote == 1)
+{
+ --echo #
+ --echo # Remote-only setup for error cases
+ RESET MASTER;
+ --exec $MYSQL_BINLOG $MYSQLD_DATADIR/$BINLOG_FILE.orig | $MYSQL
+ FLUSH LOGS;
+ --exec $MYSQL_BINLOG $MYSQLD_DATADIR/$BINLOG_FILE2.orig | $MYSQL
+ FLUSH LOGS;
+ --eval PURGE BINARY LOGS TO "$BINLOG_FILE2"
+}
+
+--echo # At the following error cases analysis
+--echo # note incompatible --start-position with the value of
+--echo # Gtid list event of the 2nd binlog file printed above.
+
+--let err_out_= $MYSQLTEST_VARDIR/tmp/err.out
+--let SEARCH_FILE=$err_out_
+
+--echo #
+--echo # Error Case 1:
+--echo # A GTID --start-position that does not mention all domains that make
+--echo # up the binary log state should error
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3 > tmp_out_ 2> err_out_
+--error 1
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM2 --start-position=0-1-3 > $tmp_out_ 2> $err_out_
+if ($is_remote == 1)
+{
+ --let SEARCH_PATTERN=ERROR: Got error reading packet from server
+}
+if ($is_remote == 0)
+{
+ --let SEARCH_PATTERN=ERROR: Starting GTID position list does not specify an initial value
+}
+--source include/search_pattern_in_file.inc
+--remove_file $err_out_
+
+--echo #
+--echo # Error Case 2:
+--echo # A GTID --start-position with any sequence numbers which occur before
+--echo # the binary log state should result in error
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-2,1-2-5 > tmp_out_ 2> err_out_
+--error 1
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM2 --start-position=0-1-2,1-2-5 > $tmp_out_ 2> $err_out_
+if ($is_remote == 1)
+{
+ --let SEARCH_PATTERN=ERROR: Got error reading packet from server
+}
+if ($is_remote == 0)
+{
+ --let SEARCH_PATTERN=ERROR: Binary logs are missing data for domain 0
+}
+--source include/search_pattern_in_file.inc
+--remove_file $err_out_
+
+--echo #
+--echo # Error Case 3:
+--echo # A GTID --start-position with any sequence numbers that are not
+--echo # eventually processed results in error
+--echo # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > tmp_out_ 2> err_out_
+--error 1
+--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > $tmp_out_ 2> $err_out_
+if ($is_remote == 1)
+{
+ --let SEARCH_PATTERN=ERROR: Got error reading packet from server
+}
+if ($is_remote == 0)
+{
+ --let SEARCH_PATTERN=ERROR: Binary logs never reached expected GTID state
+}
+--source include/search_pattern_in_file.inc
+--remove_file $err_out_
+
+if ($is_remote == 1)
+{
+ --echo #
+ --echo # Remote-only cleanup from error cases
+ DROP TABLE t1;
+ DROP TABLE t2;
+ DROP TABLE t3;
+ RESET MASTER;
+}
+
+--remove_file $MYSQLD_DATADIR/$BINLOG_FILE.orig
+--remove_file $MYSQLD_DATADIR/$BINLOG_FILE2.orig
+--remove_file $tmp_out_
diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_glle_ordered.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_glle_ordered.result
new file mode 100644
index 00000000000..2826cba99ae
--- /dev/null
+++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_glle_ordered.result
@@ -0,0 +1,19 @@
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+SET @@session.server_id= 1;
+INSERT INTO t2 VALUES (1);
+SET @@session.gtid_domain_id= 2;
+SET @@session.server_id= 3;
+CREATE TABLE t3 (a int);
+FLUSH LOGS;
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/binlog_file > SEARCH_FILE
+FOUND 1 /Gtid list \[0-1-1,\n# 1-2-1,\n# 1-1-2,\n# 2-3-1\]/ in tmp_binlog.out
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_gtid_strict_mode.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_gtid_strict_mode.result
new file mode 100644
index 00000000000..c2f7bac387c
--- /dev/null
+++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_gtid_strict_mode.result
@@ -0,0 +1,925 @@
+###############################
+# Test Setup
+###############################
+RESET MASTER;
+####################################################
+# Test Case Group 1
+#
+# Tests with --gtid-strict-mode should error and
+# immediately quit with error on out of order GTIDs
+####################################################
+#
+# Test Case 1:
+# Sequential sequence numbers results in no errors or warnings
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /ERROR/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 2:
+# A skipped sequence number results in no errors or warnings if all
+# numbers are monotonic (i.e. gaps in sequence number are allowed
+# provided they never decrease)
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 5;
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /ERROR/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 3:
+# A sequence number lower than the last processed value results in a
+# warning or error
+CREATE TABLE t1 (a int);
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 1;
+INSERT INTO t1 values (1);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --gtid-strict-mode 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 4:
+# Skipping a GTID and later receiving it results in a warning or error
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --gtid-strict-mode 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 5:
+# Repeat sequence numbers produce a warning
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --gtid-strict-mode 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 6:
+# Warnings from different domains are all displayed
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t2 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t2 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t2 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --gtid-strict-mode 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: Found out of order GTID/ in out.err
+DROP TABLE t1;
+DROP TABLE t2;
+RESET MASTER;
+#
+# Test Case 7:
+# A decreasing seq_no before a start-position is ignored
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+# GTID-based start-position
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-4 --gtid-strict-mode > log_error_ > OUT_FILE
+NOT FOUND /ERROR/ in out.err
+# Position-based start-position
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=start_binlog_pos --gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /ERROR/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 8:
+# A decreasing seq_no inside of a --start/--stop position window is
+# displayed
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 5;
+INSERT INTO t1 values (4);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 6;
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+# GTID-based window
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --stop-position=0-1-6 --gtid-strict-mode > log_error_ > OUT_FILE
+FOUND 1 /ERROR: Found out of order GTID/ in out.err
+# Position-based window
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=start_binlog_pos --stop-position=stop_binlog_pos --gtid-strict-mode 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 9:
+# Error if --stop-position is not greater than or equal to
+# --start-position
+#
+# Note: Error is only displayed in strict mode, -vvv has no effect here
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2 --stop-position=0-1-1 --gtid-strict-mode 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: Queried GTID range is invalid in strict mode/ in out.err
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2,1-2-1 --stop-position=0-1-1,1-2-2 --gtid-strict-mode 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: Queried GTID range is invalid in strict mode/ in out.err
+RESET MASTER;
+#
+# Test Case 10:
+# Strict mode warnings should be independent of --offset option
+# specification
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --offset=8 --gtid-strict-mode 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 11:
+# Strict mode warnings should be independent of --start-timestamp
+# option specification
+set @a=UNIX_TIMESTAMP("1970-01-21 15:32:22");
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+SET timestamp=@a;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+SET timestamp=@a+1;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+SET timestamp=@a+2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+SET timestamp=@a+3;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --start-datetime="1970-01-21 15:32:24" --gtid-strict-mode 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 12:
+# Specifying multiple binary logs with a log-position start should
+# skip GTID state verification
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+INSERT INTO t2 values (1);
+FLUSH LOGS;
+INSERT INTO t2 values (2);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE1 MYSQLD_DATADIR/BINLOG_FILE2 --start-position=b2_start_pos --gtid-strict-mode 2> log_error_ > OUT_FILE
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 13:
+# If multiple binary logs should be specified but a middle log is
+# missing, we should detect that and warn when using -vvv
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+FLUSH LOGS;
+INSERT INTO t1 values (1);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+FLUSH LOGS;
+SET @@session.gtid_domain_id= 2;
+SET @@session.server_id= 3;
+CREATE TABLE t3 (a int);
+FLUSH LOGS;
+#
+# GLLE from each log for state reference
+show binlog events in 'master-bin.000001' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid_list 1 # []
+show binlog events in 'master-bin.000002' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000002 # Gtid_list 1 # [0-1-1]
+show binlog events in 'master-bin.000003' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000003 # Gtid_list 1 # [0-1-2,1-2-1]
+# MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE1 MYSQLD_DATADIR/BINLOG_FILE3 --gtid-strict-mode 2> log_error_ > OUT_FILE
+# We should have two warnings about missing data from domains 0 and 1 if
+# -vvv is specified
+NOT FOUND /WARNING: Binary logs are missing data for domain 0[^\n]+the last seen event was/ in out.err
+NOT FOUND /WARNING: Binary logs are missing data for domain 1[^\n]+neither the starting GTID position list nor any processed events/ in out.err
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+RESET MASTER;
+#
+# Test Case 14:
+# If a --stop-position GTID occurs before the first specified binlog's
+# GLLE, error
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+FLUSH LOGS;
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+#
+# GLLE from each log for state reference
+show binlog events in 'master-bin.000001' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid_list 1 # []
+show binlog events in 'master-bin.000002' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000002 # Gtid_list 1 # [0-1-3]
+# MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE2 --gtid-strict-mode --stop-position=0-1-2 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: --stop-position GTID/ in out.err
+DROP TABLE t1;
+####################################################
+# Test Case Group 2
+#
+# Test cases with --skip-gtid-strict-mode -vvv
+# should not quit early or with error when
+# encountering out of order GTIDs; however should
+# produce warnings after binlog processing
+####################################################
+#
+# Test Case 1:
+# Sequential sequence numbers results in no errors or warnings
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+NOT FOUND /WARNING/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 2:
+# A skipped sequence number results in no errors or warnings if all
+# numbers are monotonic (i.e. gaps in sequence number are allowed
+# provided they never decrease)
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 5;
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+NOT FOUND /WARNING/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 3:
+# A sequence number lower than the last processed value results in a
+# warning or error
+CREATE TABLE t1 (a int);
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 1;
+INSERT INTO t1 values (1);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+FOUND 1 /WARNING: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 4:
+# Skipping a GTID and later receiving it results in a warning or error
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+FOUND 1 /WARNING: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 5:
+# Repeat sequence numbers produce a warning
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+FOUND 1 /WARNING: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 6:
+# Warnings from different domains are all displayed
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t2 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t2 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t2 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+FOUND 2 /WARNING: Found out of order GTID/ in out.err
+DROP TABLE t1;
+DROP TABLE t2;
+RESET MASTER;
+#
+# Test Case 7:
+# A decreasing seq_no before a start-position is ignored
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+# GTID-based start-position
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-4 --skip-gtid-strict-mode -vvv > log_error_ > OUT_FILE
+NOT FOUND /WARNING/ in out.err
+# Position-based start-position
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=start_binlog_pos --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+NOT FOUND /WARNING/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 8:
+# A decreasing seq_no inside of a --start/--stop position window is
+# displayed
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 5;
+INSERT INTO t1 values (4);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 6;
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+# GTID-based window
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --stop-position=0-1-6 --skip-gtid-strict-mode -vvv > log_error_ > OUT_FILE
+FOUND 1 /WARNING: Found out of order GTID/ in out.err
+# Position-based window
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=start_binlog_pos --stop-position=stop_binlog_pos --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+FOUND 1 /WARNING: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 9:
+# Error if --stop-position is not greater than or equal to
+# --start-position
+#
+# Note: Error is only displayed in strict mode, -vvv has no effect here
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2 --stop-position=0-1-1 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+NOT FOUND /ERROR: Queried GTID range is invalid in strict mode/ in out.err
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2,1-2-1 --stop-position=0-1-1,1-2-2 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+NOT FOUND /ERROR: Queried GTID range is invalid in strict mode/ in out.err
+RESET MASTER;
+#
+# Test Case 10:
+# Strict mode warnings should be independent of --offset option
+# specification
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --offset=8 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+FOUND 1 /WARNING: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 11:
+# Strict mode warnings should be independent of --start-timestamp
+# option specification
+set @a=UNIX_TIMESTAMP("1970-01-21 15:32:22");
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+SET timestamp=@a;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+SET timestamp=@a+1;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+SET timestamp=@a+2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+SET timestamp=@a+3;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --start-datetime="1970-01-21 15:32:24" --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+FOUND 1 /WARNING: Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 12:
+# Specifying multiple binary logs with a log-position start should
+# skip GTID state verification
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+INSERT INTO t2 values (1);
+FLUSH LOGS;
+INSERT INTO t2 values (2);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE1 MYSQLD_DATADIR/BINLOG_FILE2 --start-position=b2_start_pos --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 13:
+# If multiple binary logs should be specified but a middle log is
+# missing, we should detect that and warn when using -vvv
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+FLUSH LOGS;
+INSERT INTO t1 values (1);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+FLUSH LOGS;
+SET @@session.gtid_domain_id= 2;
+SET @@session.server_id= 3;
+CREATE TABLE t3 (a int);
+FLUSH LOGS;
+#
+# GLLE from each log for state reference
+show binlog events in 'master-bin.000001' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid_list 1 # []
+show binlog events in 'master-bin.000002' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000002 # Gtid_list 1 # [0-1-1]
+show binlog events in 'master-bin.000003' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000003 # Gtid_list 1 # [0-1-2,1-2-1]
+# MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE1 MYSQLD_DATADIR/BINLOG_FILE3 --skip-gtid-strict-mode -vvv 2> log_error_ > OUT_FILE
+# We should have two warnings about missing data from domains 0 and 1 if
+# -vvv is specified
+FOUND 1 /WARNING: Binary logs are missing data for domain 0[^\n]+the last seen event was/ in out.err
+FOUND 1 /WARNING: Binary logs are missing data for domain 1[^\n]+neither the starting GTID position list nor any processed events/ in out.err
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+RESET MASTER;
+#
+# Test Case 14:
+# If a --stop-position GTID occurs before the first specified binlog's
+# GLLE, error
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+FLUSH LOGS;
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+#
+# GLLE from each log for state reference
+show binlog events in 'master-bin.000001' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid_list 1 # []
+show binlog events in 'master-bin.000002' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000002 # Gtid_list 1 # [0-1-3]
+# MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE2 --skip-gtid-strict-mode -vvv --stop-position=0-1-2 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: --stop-position GTID/ in out.err
+DROP TABLE t1;
+####################################################
+# Test Case Group 3
+#
+# Run test cases with --skip-gtid-strict-mode should
+# neither produce errors nor warnings when
+# encountering out of order GTIDs
+####################################################
+#
+# Test Case 1:
+# Sequential sequence numbers results in no errors or warnings
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING)/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 2:
+# A skipped sequence number results in no errors or warnings if all
+# numbers are monotonic (i.e. gaps in sequence number are allowed
+# provided they never decrease)
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 5;
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING)/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 3:
+# A sequence number lower than the last processed value results in a
+# warning or error
+CREATE TABLE t1 (a int);
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 1;
+INSERT INTO t1 values (1);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING): Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 4:
+# Skipping a GTID and later receiving it results in a warning or error
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING): Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 5:
+# Repeat sequence numbers produce a warning
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING): Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 6:
+# Warnings from different domains are all displayed
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t2 values (2);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t2 values (3);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t2 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING): Found out of order GTID/ in out.err
+DROP TABLE t1;
+DROP TABLE t2;
+RESET MASTER;
+#
+# Test Case 7:
+# A decreasing seq_no before a start-position is ignored
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (4);
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+# GTID-based start-position
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-4 --skip-gtid-strict-mode > log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING)/ in out.err
+# Position-based start-position
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=start_binlog_pos --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING)/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 8:
+# A decreasing seq_no inside of a --start/--stop position window is
+# displayed
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 5;
+INSERT INTO t1 values (4);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (3);
+SET @@session.gtid_seq_no= 6;
+INSERT INTO t1 values (5);
+FLUSH LOGS;
+# GTID-based window
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --stop-position=0-1-6 --skip-gtid-strict-mode > log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING): Found out of order GTID/ in out.err
+# Position-based window
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=start_binlog_pos --stop-position=stop_binlog_pos --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING): Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 9:
+# Error if --stop-position is not greater than or equal to
+# --start-position
+#
+# Note: Error is only displayed in strict mode, -vvv has no effect here
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2 --stop-position=0-1-1 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /ERROR: Queried GTID range is invalid in strict mode/ in out.err
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-2,1-2-1 --stop-position=0-1-1,1-2-2 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /ERROR: Queried GTID range is invalid in strict mode/ in out.err
+RESET MASTER;
+#
+# Test Case 10:
+# Strict mode warnings should be independent of --offset option
+# specification
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --offset=8 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING): Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 11:
+# Strict mode warnings should be independent of --start-timestamp
+# option specification
+set @a=UNIX_TIMESTAMP("1970-01-21 15:32:22");
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET @@session.gtid_seq_no= 1;
+SET timestamp=@a;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_seq_no= 3;
+SET timestamp=@a+1;
+INSERT INTO t1 values (1);
+SET @@session.gtid_seq_no= 2;
+SET timestamp=@a+2;
+INSERT INTO t1 values (2);
+SET @@session.gtid_seq_no= 4;
+SET timestamp=@a+3;
+INSERT INTO t1 values (3);
+INSERT INTO t1 values (4);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1 --start-datetime="1970-01-21 15:32:24" --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+NOT FOUND /(ERROR|WARNING): Found out of order GTID/ in out.err
+DROP TABLE t1;
+RESET MASTER;
+#
+# Test Case 12:
+# Specifying multiple binary logs with a log-position start should
+# skip GTID state verification
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+INSERT INTO t2 values (1);
+FLUSH LOGS;
+INSERT INTO t2 values (2);
+FLUSH LOGS;
+# MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE1 MYSQLD_DATADIR/BINLOG_FILE2 --start-position=b2_start_pos --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 13:
+# If multiple binary logs should be specified but a middle log is
+# missing, we should detect that and warn when using -vvv
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+FLUSH LOGS;
+INSERT INTO t1 values (1);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+FLUSH LOGS;
+SET @@session.gtid_domain_id= 2;
+SET @@session.server_id= 3;
+CREATE TABLE t3 (a int);
+FLUSH LOGS;
+#
+# GLLE from each log for state reference
+show binlog events in 'master-bin.000001' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid_list 1 # []
+show binlog events in 'master-bin.000002' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000002 # Gtid_list 1 # [0-1-1]
+show binlog events in 'master-bin.000003' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000003 # Gtid_list 1 # [0-1-2,1-2-1]
+# MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE1 MYSQLD_DATADIR/BINLOG_FILE3 --skip-gtid-strict-mode 2> log_error_ > OUT_FILE
+# We should have two warnings about missing data from domains 0 and 1 if
+# -vvv is specified
+NOT FOUND /WARNING: Binary logs are missing data for domain 0[^\n]+the last seen event was/ in out.err
+NOT FOUND /WARNING: Binary logs are missing data for domain 1[^\n]+neither the starting GTID position list nor any processed events/ in out.err
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+RESET MASTER;
+#
+# Test Case 14:
+# If a --stop-position GTID occurs before the first specified binlog's
+# GLLE, error
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (1);
+INSERT INTO t1 values (2);
+FLUSH LOGS;
+INSERT INTO t1 values (3);
+FLUSH LOGS;
+#
+# GLLE from each log for state reference
+show binlog events in 'master-bin.000001' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid_list 1 # []
+show binlog events in 'master-bin.000002' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000002 # Gtid_list 1 # [0-1-3]
+# MYSQL_BINLOG MYSQLD_DATADIR/BINLOG_FILE2 --skip-gtid-strict-mode --stop-position=0-1-2 2> log_error_ > OUT_FILE
+FOUND 1 /ERROR: --stop-position GTID/ in out.err
+DROP TABLE t1;
+##############################
+# Cleanup
+##############################
+SET @@global.gtid_domain_id= 0;
+SET @@global.server_id= 1;
+End of the tests
diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_gtid_window.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_gtid_window.result
new file mode 100644
index 00000000000..fce5f95ce82
--- /dev/null
+++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_gtid_window.result
@@ -0,0 +1,468 @@
+###############################
+# Test Setup
+###############################
+RESET MASTER;
+######################################
+# Test Group 1
+# Run test cases on local log file
+######################################
+set @a=UNIX_TIMESTAMP("1970-01-21 15:32:22");
+SET timestamp=@a;
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET timestamp=@a+1;
+INSERT INTO t1 values (1), (2);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+SET timestamp=@a+2;
+CREATE TABLE t2 (a int);
+SET timestamp=@a+3;
+INSERT INTO t2 values (1);
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET timestamp=@a+4;
+INSERT INTO t1 values (3), (4);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+INSERT INTO t2 values (2);
+SET @@session.server_id= 3;
+INSERT INTO t2 values (3);
+SET @@session.server_id= 2;
+INSERT INTO t2 values (4);
+FLUSH LOGS;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t3 (a int);
+INSERT INTO t3 VALUES (1);
+FLUSH LOGS;
+# Gtid list event of the 2nd binlog file whose content is
+# matched against --start-position in the following tests:
+show binlog events in 'master-bin.000002' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000002 # Gtid_list 1 # [0-1-3,1-3-4,1-2-5]
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+#
+# Test Case 1:
+# The end of the binlog file resets the server and domain id of the
+# session
+SET @@session.gtid_domain_id= 10;
+SET @@session.server_id= 20;
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL
+include/assert.inc [session gtid_domain_id should not change when reading binlog in GTID mode]
+include/assert.inc [session server_id should not change when reading binlog in GTID mode]
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+DROP TABLE t1;
+#
+# Test Case 2:
+# Single GTID range specified
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 3:
+# Single GTID range with different server_ids
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-0 --stop-position=1-3-4 | MYSQL
+DROP TABLE t2;
+#
+# Test Case 4:
+# Multiple GTID ranges specified
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 --stop-position=0-1-3,1-2-3 | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 5:
+# Multiple GTID ranges specified where the domain ids are listed in
+# different orders between start/stop position
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-3,1-2-3 --start-position=1-2-0,0-1-0 | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 6:
+# Only start position specified
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (3), (4);
+DROP TABLE t1;
+CREATE TABLE t1 (a int);
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 7:
+# Only stop position specified
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 8:
+# Seq_no=0 in --start-position includes all events for a domain
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 9:
+# Seq_no=0 in --stop-position excludes all events for a domain
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-0,1-2-0 | MYSQL
+#
+# Test Case 10:
+# Output stops for all domain ids when all --stop-position GTID values
+# have been hit.
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 11:
+# All GTID events from other domains are printed until the
+# --stop-position values are hit
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL
+DROP TABLE t2;
+#
+# Test Case 12:
+# Scalar and GTID values can be used together for stop or start
+# position
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=empty_binlog_pos --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=t1_final_checksum_pos | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 13:
+# If the start position is delayed within the binlog, events occurring
+# before that position are ignored
+CREATE TABLE t1 (a int);
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-1 --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 14:
+# If start position is repeated, the last specification overrides all
+# previous ones
+CREATE TABLE t1 (a int);
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --start-position=0-1-1 --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 15:
+# If stop position is repeated, the last specification overrides all
+# previous ones
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-1 --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 16:
+# Start position with --offset=<n> skips n events after the first
+# GTID is found
+CREATE TABLE t1 (a int);
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 --offset=5 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 17:
+# Start position with --start-datetime=<T> where T occurs after the
+# specified GTID results in no events before T
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=1-2-2 --start-datetime="1970-01-21 15:32:24" | MYSQL
+DROP TABLE t2;
+#
+# Test Case 18:
+# If --stop-position is specified, domains which are not present
+# in its list should be excluded from output
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL
+DROP TABLE t2;
+#
+# Test Case 19:
+# If the start and stop GTIDs in any domain are equal, the domain
+# should not have any output
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 --stop-position=0-1-2 | MYSQL
+#
+# Test Case 20:
+# If --start-position and --stop-position have different domain ids,
+# only events from GTIDs in the --stop-position list are output
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-2 --stop-position=0-1-3 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 21:
+# Successive binary logs (e.g. logs with previous logs that have been
+# purged) will write events when the --start-position matches their
+# Gtid_list_log_event state
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | MYSQL
+DROP TABLE t3;
+#
+# Test Case 22:
+# Successive binary logs can be called with --stop-position and
+# without --start-position
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --stop-position=0-1-4 | MYSQL
+DROP TABLE t3;
+# At the following error cases analysis
+# note incompatible --start-position with the value of
+# Gtid list event of the 2nd binlog file printed above.
+#
+# Error Case 1:
+# A GTID --start-position that does not mention all domains that make
+# up the binary log state should error
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3 > tmp_out_ 2> err_out_
+FOUND 2 /ERROR: Starting GTID position list does not specify an initial value/ in err.out
+#
+# Error Case 2:
+# A GTID --start-position with any sequence numbers which occur before
+# the binary log state should result in error
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-2,1-2-5 > tmp_out_ 2> err_out_
+FOUND 1 /ERROR: Binary logs are missing data for domain 0/ in err.out
+#
+# Error Case 3:
+# A GTID --start-position with any sequence numbers that are not
+# eventually processed results in error
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > tmp_out_ 2> err_out_
+FOUND 2 /ERROR: Binary logs never reached expected GTID state/ in err.out
+######################################
+# Test Group 2
+# Run test cases on remote host
+######################################
+set @a=UNIX_TIMESTAMP("1970-01-21 15:32:22");
+SET timestamp=@a;
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET timestamp=@a+1;
+INSERT INTO t1 values (1), (2);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+SET timestamp=@a+2;
+CREATE TABLE t2 (a int);
+SET timestamp=@a+3;
+INSERT INTO t2 values (1);
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+SET timestamp=@a+4;
+INSERT INTO t1 values (3), (4);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+INSERT INTO t2 values (2);
+SET @@session.server_id= 3;
+INSERT INTO t2 values (3);
+SET @@session.server_id= 2;
+INSERT INTO t2 values (4);
+FLUSH LOGS;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t3 (a int);
+INSERT INTO t3 VALUES (1);
+FLUSH LOGS;
+# Gtid list event of the 2nd binlog file whose content is
+# matched against --start-position in the following tests:
+show binlog events in 'master-bin.000002' limit 1,1;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000002 # Gtid_list 1 # [0-1-3,1-3-4,1-2-5]
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+#
+# Test Case 1:
+# The end of the binlog file resets the server and domain id of the
+# session
+SET @@session.gtid_domain_id= 10;
+SET @@session.server_id= 20;
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL
+include/assert.inc [session gtid_domain_id should not change when reading binlog in GTID mode]
+include/assert.inc [session server_id should not change when reading binlog in GTID mode]
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+DROP TABLE t1;
+#
+# Test Case 2:
+# Single GTID range specified
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 3:
+# Single GTID range with different server_ids
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-0 --stop-position=1-3-4 | MYSQL
+DROP TABLE t2;
+#
+# Test Case 4:
+# Multiple GTID ranges specified
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 --stop-position=0-1-3,1-2-3 | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 5:
+# Multiple GTID ranges specified where the domain ids are listed in
+# different orders between start/stop position
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-3,1-2-3 --start-position=1-2-0,0-1-0 | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 6:
+# Only start position specified
+CREATE TABLE t1 (a int);
+INSERT INTO t1 values (3), (4);
+DROP TABLE t1;
+CREATE TABLE t1 (a int);
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 7:
+# Only stop position specified
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 8:
+# Seq_no=0 in --start-position includes all events for a domain
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 9:
+# Seq_no=0 in --stop-position excludes all events for a domain
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-0,1-2-0 | MYSQL
+#
+# Test Case 10:
+# Output stops for all domain ids when all --stop-position GTID values
+# have been hit.
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 11:
+# All GTID events from other domains are printed until the
+# --stop-position values are hit
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL
+DROP TABLE t2;
+#
+# Test Case 12:
+# Scalar and GTID values can be used together for stop or start
+# position
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=empty_binlog_pos --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=t1_final_checksum_pos | MYSQL
+DROP TABLE t1;
+DROP TABLE t2;
+#
+# Test Case 13:
+# If the start position is delayed within the binlog, events occurring
+# before that position are ignored
+CREATE TABLE t1 (a int);
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-1 --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 14:
+# If start position is repeated, the last specification overrides all
+# previous ones
+CREATE TABLE t1 (a int);
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --start-position=0-1-1 --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 15:
+# If stop position is repeated, the last specification overrides all
+# previous ones
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-1 --stop-position=0-1-2 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 16:
+# Start position with --offset=<n> skips n events after the first
+# GTID is found
+CREATE TABLE t1 (a int);
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 --offset=5 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 17:
+# Start position with --start-datetime=<T> where T occurs after the
+# specified GTID results in no events before T
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=1-2-2 --start-datetime="1970-01-21 15:32:24" | MYSQL
+DROP TABLE t2;
+#
+# Test Case 18:
+# If --stop-position is specified, domains which are not present
+# in its list should be excluded from output
+# MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL
+DROP TABLE t2;
+#
+# Test Case 19:
+# If the start and stop GTIDs in any domain are equal, the domain
+# should not have any output
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 --stop-position=0-1-2 | MYSQL
+#
+# Test Case 20:
+# If --start-position and --stop-position have different domain ids,
+# only events from GTIDs in the --stop-position list are output
+# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-2 --stop-position=0-1-3 | MYSQL
+DROP TABLE t1;
+#
+# Test Case 21:
+# Successive binary logs (e.g. logs with previous logs that have been
+# purged) will write events when the --start-position matches their
+# Gtid_list_log_event state
+#
+# Reset server state
+RESET MASTER;
+FLUSH LOGS;
+FLUSH LOGS;
+PURGE BINARY LOGS TO "master-bin.000002";
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | MYSQL
+DROP TABLE t3;
+#
+# Test Case 22:
+# Successive binary logs can be called with --stop-position and
+# without --start-position
+#
+# Reset server state
+RESET MASTER;
+FLUSH LOGS;
+FLUSH LOGS;
+PURGE BINARY LOGS TO "master-bin.000002";
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --stop-position=0-1-4 | MYSQL
+DROP TABLE t3;
+#
+# Remote-only setup for error cases
+RESET MASTER;
+FLUSH LOGS;
+FLUSH LOGS;
+PURGE BINARY LOGS TO "master-bin.000002";
+# At the following error cases analysis
+# note incompatible --start-position with the value of
+# Gtid list event of the 2nd binlog file printed above.
+#
+# Error Case 1:
+# A GTID --start-position that does not mention all domains that make
+# up the binary log state should error
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3 > tmp_out_ 2> err_out_
+FOUND 1 /ERROR: Got error reading packet from server/ in err.out
+#
+# Error Case 2:
+# A GTID --start-position with any sequence numbers which occur before
+# the binary log state should result in error
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-2,1-2-5 > tmp_out_ 2> err_out_
+FOUND 1 /ERROR: Got error reading packet from server/ in err.out
+#
+# Error Case 3:
+# A GTID --start-position with any sequence numbers that are not
+# eventually processed results in error
+# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > tmp_out_ 2> err_out_
+FOUND 1 /ERROR: Got error reading packet from server/ in err.out
+#
+# Remote-only cleanup from error cases
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
+RESET MASTER;
+#
+# Error Case 4:
+# User provides invalid positions
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=z
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=1-
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=1-2
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=1-2-
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=-1
+#
+# Error Case 5:
+# User provides GTID ranges with repeated domain ids
+# MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1,0-1-8 --stop-position=0-1-4,0-1-12
+##############################
+# Cleanup
+##############################
+SET @@global.gtid_domain_id= 0;
+SET @@global.server_id= 1;
+# End of the tests
diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_start_alter_verbose.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_start_alter_verbose.result
new file mode 100644
index 00000000000..b6b67bc1380
--- /dev/null
+++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_start_alter_verbose.result
@@ -0,0 +1,15 @@
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+RESET MASTER;
+create table myt (a int) engine=InnoDB;
+alter table myt add column (b int);
+FLUSH LOGS;
+# Exec MYSQL_BINLOG --base64-output=decode-rows -v MYSQLD_DATADIR/BINLOG_FILENAME > MYSQLTEST_VARDIR/tmp/mysqlbinlog_verbose.sql
+Verbose statements from : master-bin.000001
+select replace(txt,'\r', '') as stmt from raw_binlog_rows where txt like '###%';
+stmt
+### alter table myt add column (b int)
+### alter table myt add column (b int)
+drop table raw_binlog_rows;
+drop table myt;
+set global binlog_alter_two_phase=0;
diff --git a/mysql-test/suite/binlog/r/start_alter_mysqlbinlog_replay.result b/mysql-test/suite/binlog/r/start_alter_mysqlbinlog_replay.result
new file mode 100644
index 00000000000..14bc2d3bf78
--- /dev/null
+++ b/mysql-test/suite/binlog/r/start_alter_mysqlbinlog_replay.result
@@ -0,0 +1,42 @@
+#
+# Test verifies replay of binary logs which contain
+# SA/RA/CA works fine.
+# Generate a binary log with alter events and use mysqlbinlog tool to
+# generate a sql file for replay. Source it on an clean master and
+# verify the correctness. Use the latest binlog and repeat the same
+# process mentioned above and observe replay works fine.
+#
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+create table t1 (f1 int primary key) engine=InnoDB;
+create table t2 (f1 int primary key, constraint c1 foreign key (f1) references t1(f1)) engine=innodb;
+alter table t2 add constraint c1 foreign key (f1) references t1(f1);
+ERROR HY000: Can't create table `test`.`t2` (errno: 121 "Duplicate key on write or update")
+drop table t2, t1;
+select @@gtid_binlog_state;
+@@gtid_binlog_state
+0-1-5
+FLUSH LOGS;
+# reset the binlog
+RESET MASTER;
+# execute the binlog
+SELECT @@gtid_binlog_state;
+@@gtid_binlog_state
+0-1-5
+FLUSH LOGS;
+# Replay 1: One more time to simulate S->S case
+RESET MASTER;
+# execute the binlog
+SELECT @@gtid_binlog_state;
+@@gtid_binlog_state
+0-1-5
+FLUSH LOGS;
+# Replay 2: One more time to simulate S->S case
+RESET MASTER;
+# execute the binlog
+SELECT @@gtid_binlog_state;
+@@gtid_binlog_state
+0-1-5
+# clean up
+RESET MASTER;
+set global binlog_alter_two_phase=0;
diff --git a/mysql-test/suite/binlog/t/binlog_innodb.test b/mysql-test/suite/binlog/t/binlog_innodb.test
index 153dcdd155a..5f372e6d5fd 100644
--- a/mysql-test/suite/binlog/t/binlog_innodb.test
+++ b/mysql-test/suite/binlog/t/binlog_innodb.test
@@ -180,7 +180,7 @@ CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
SET @old_flush = @@GLOBAL.innodb_flush_log_at_trx_commit;
SET GLOBAL innodb_flush_log_at_trx_commit=1;
---let $syncs1 = query_get_value(SHOW STATUS LIKE 'Innodb_os_log_fsyncs', Value, 1)
+--let $syncs1 = query_get_value(SHOW STATUS LIKE 'Innodb_data_fsyncs', Value, 1)
--let $ROWS = 100
--disable_query_log
let $count = $ROWS;
@@ -188,7 +188,7 @@ while ($count) {
eval INSERT INTO t1 VALUES ($count);
dec $count;
}
---let $syncs2 = query_get_value(SHOW STATUS LIKE 'Innodb_os_log_fsyncs', Value, 1)
+--let $syncs2 = query_get_value(SHOW STATUS LIKE 'Innodb_data_fsyncs', Value, 1)
eval SET @num_sync = $syncs2 - $syncs1;
--enable_query_log
diff --git a/mysql-test/suite/binlog/t/binlog_mysqlbinlog_glle_ordered.test b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_glle_ordered.test
new file mode 100644
index 00000000000..9c79925b4bd
--- /dev/null
+++ b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_glle_ordered.test
@@ -0,0 +1,43 @@
+#
+# Purpose:
+# This test validates that GTIDs are ordered when mysqlbinlog outputs
+# Gtid_list events.
+#
+# Methodology:
+# Write multiple events to the binlog with different domain ids and server
+# ids, and ensure that the Gtid_list event GTIDs are ordered first by domain id
+# (ascending), and then sequence number (ascending).
+#
+# References:
+# MDEV-4989: Support for GTID in mysqlbinlog
+#
+--source include/have_log_bin.inc
+
+RESET MASTER;
+SET @@session.gtid_domain_id= 0;
+SET @@session.server_id= 1;
+CREATE TABLE t1 (a int);
+SET @@session.gtid_domain_id= 1;
+SET @@session.server_id= 2;
+CREATE TABLE t2 (a int);
+SET @@session.server_id= 1;
+INSERT INTO t2 VALUES (1);
+SET @@session.gtid_domain_id= 2;
+SET @@session.server_id= 3;
+CREATE TABLE t3 (a int);
+FLUSH LOGS;
+FLUSH LOGS;
+
+--let $binlog_file= query_get_value(SHOW BINARY LOGS, Log_name, 2)
+--let $MYSQLD_DATADIR=`select @@datadir`
+--let SEARCH_FILE=$MYSQLTEST_VARDIR/tmp/tmp_binlog.out
+
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/binlog_file > SEARCH_FILE
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/$binlog_file > $SEARCH_FILE
+
+--let SEARCH_PATTERN= Gtid list \[0-1-1,\n# 1-2-1,\n# 1-1-2,\n# 2-3-1\]
+--source include/search_pattern_in_file.inc
+
+DROP TABLE t1;
+DROP TABLE t2;
+DROP TABLE t3;
diff --git a/mysql-test/suite/binlog/t/binlog_mysqlbinlog_gtid_strict_mode.test b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_gtid_strict_mode.test
new file mode 100644
index 00000000000..166826408d9
--- /dev/null
+++ b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_gtid_strict_mode.test
@@ -0,0 +1,105 @@
+#
+# Purpose:
+#
+# This test ensures that the mariadb-binlog CLI tool properly displays errors
+# and warnings for out of order GTIDs.
+#
+#
+# Methodology:
+#
+# We simulate invalid sequence numberings by manually changing gtid_seq_no to
+# differ from its expected linear sequence. Specifically, we test the following
+# cases:
+# Test Case 1) Sequential sequence numbers results in no warnings
+# Test Case 2) A skipped sequence number results in no warnings if all numbers
+# are monotonic (i.e. gaps in sequence number are allowed
+# provided they never decrease)
+# Test Case 3) A sequence number lower than the last processed value results
+# in a warning
+# Test Case 4) Skipping a GTID and later receiving it results in a warning
+# Test Case 5) Repeat sequence numbers result in a warning
+# Test Case 6) Warnings from different domains are all displayed
+# Test Case 7) A decreasing seq_no before a start-position is ignored
+# Test Case 8) A decreasing seq_no inside of a --start/--stop position window
+# is displayed
+# Test Case 9) Error if --stop-position is not greater than or equal to
+# --start-position
+# Test Case 10) Strict mode warnings should be independent of --offset option
+# specification
+# Test Case 11) Strict mode warnings should be independent of
+# --start-timestamp option specification
+# Test Case 12) Specifying multiple binary logs with a log-position start
+# should skip GTID state verification
+# Test Case 13) If multiple binary logs should be specified but a middle log
+# is missing, we should detect that and warn when using -vvv
+# Test Case 14) If a --stop-position GTID occurs before the first specified
+# binlog's GLLE, error
+#
+# Note that test cases are tested under three scenarios:
+# 1) --gtid-strict-mode should error and immediately quit with error on out of
+# order GTIDs
+# 2) --skip-gtid-strict-mode -vvv should not quit early or with error when
+# encountering out of order GTIDs; however should produce warnings after
+# binlog processing
+# 3) --skip-gtid-strict-mode should neither produce errors nor warnings when
+# encountering out of order GTIDs
+#
+# References:
+# MDEV-4989: Support for GTID in mysqlbinlog
+#
+
+--source include/have_log_bin.inc
+
+--echo ###############################
+--echo # Test Setup
+--echo ###############################
+
+## Save old state
+#
+let orig_gtid_domain_id = `select @@session.gtid_domain_id`;
+let orig_server_id = `select @@session.server_id`;
+RESET MASTER;
+
+--echo ####################################################
+--echo # Test Case Group 1
+--echo #
+--echo # Tests with --gtid-strict-mode should error and
+--echo # immediately quit with error on out of order GTIDs
+--echo ####################################################
+--let is_strict_mode= 1
+--let is_verbose= 0
+--let DEFAULT_ERROR_PREFIX=ERROR
+--source include/mysqlbinlog_gtid_strict_mode.inc
+
+--echo ####################################################
+--echo # Test Case Group 2
+--echo #
+--echo # Test cases with --skip-gtid-strict-mode -vvv
+--echo # should not quit early or with error when
+--echo # encountering out of order GTIDs; however should
+--echo # produce warnings after binlog processing
+--echo ####################################################
+--let is_strict_mode= 0
+--let is_verbose= 1
+--let DEFAULT_ERROR_PREFIX=WARNING
+--source include/mysqlbinlog_gtid_strict_mode.inc
+
+--echo ####################################################
+--echo # Test Case Group 3
+--echo #
+--echo # Run test cases with --skip-gtid-strict-mode should
+--echo # neither produce errors nor warnings when
+--echo # encountering out of order GTIDs
+--echo ####################################################
+--let is_strict_mode= 0
+--let is_verbose= 0
+--let DEFAULT_ERROR_PREFIX=(ERROR|WARNING)
+--source include/mysqlbinlog_gtid_strict_mode.inc
+
+--echo ##############################
+--echo # Cleanup
+--echo ##############################
+--eval SET @@global.gtid_domain_id= $orig_gtid_domain_id
+--eval SET @@global.server_id= $orig_server_id
+
+--echo End of the tests
diff --git a/mysql-test/suite/binlog/t/binlog_mysqlbinlog_gtid_window.test b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_gtid_window.test
new file mode 100644
index 00000000000..3efb8d025b9
--- /dev/null
+++ b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_gtid_window.test
@@ -0,0 +1,151 @@
+#
+# Purpose:
+#
+# This test ensures that the mariadb-binlog CLI tool can filter log events
+# using GTID ranges. More specifically, this test ensures the following
+# capabilities:
+# 1) GTIDs can be used to filter results on local binlog files
+# 2) GTIDs can be used to filter results from remote servers
+# 3) For a given GTID range, its start-position is exclusive and its
+# stop-position is inclusive. This allows users to receive events strictly
+# after what they already have.
+# 4) After the events have been written, the session server id and domain id
+# are reset to their former values
+#
+#
+# Methodology:
+#
+# This test validates the expected capabilities using the following test cases
+# on both a local binlog file and remote server for all binlog formats.
+# Test Case 1) The end of the binlog file resets the server and domain id of
+# the session
+# Test Case 2) Single GTID range specified
+# Test Case 3) Single GTID range with different server_ids
+# Test Case 4) Multiple GTID ranges specified
+# Test Case 5) Multiple GTID ranges specified where the domain ids are
+# listed in different orders between start/stop position
+# Test Case 6) Only start position specified
+# Test Case 7) Only stop position specified
+# Test Case 8) Seq_no=0 in --start-position includes all events for a domain
+# Test Case 9) Seq_no=0 in --stop-position excludes all events for a domain
+# Test Case 10) Output stops for all domain ids when all --stop-position GTID
+# values have been hit.
+# Test Case 11) All GTID events from other domains are printed until
+# the --stop-position values are hit
+# Test Case 12) Scalar and GTID values can be used together for stop or start
+# position
+# Test Case 13) If the start position is delayed within the binlog, events
+# occurring before that position are ignored
+# Test Case 14) If start position is repeated, the last specification
+# overrides all previous ones
+# Test Case 15) If stop position is repeated, the last specification
+# overrides all previous ones
+# Test Case 16) Start position with --offset=<n> skips n events after the
+# first GTID is found
+# Test Case 17) Start position with --start-datetime=<T> where T occurs
+# after the specified GTID results in no events before T
+# Test Case 18) If --stop-position is specified, domains which are not present
+# in its list should be excluded from output
+# Test Case 19) If the start and stop GTIDs in any domain are equal, the
+# domain should not have any output
+# Test Case 20) If --start-position and --stop-position have different domain
+# ids, only events from GTIDs in the --stop-position list are
+# output
+# Test Case 21) Successive binary logs (e.g. logs with previous logs that
+# have been purged) will write events when the --start-position
+# matches their Gtid_list_log_event state
+# Test Case 22) Successive binary logs can be called with --stop-position and
+# without --start-position
+#
+# To validate for data consistency, each test case compares a checksum of
+# correct data against a variant created after replaying the binlog using
+# --(start|stop)-position. If the checksums are identical, the test passes.
+# If the checksums differ, data has been changed and the test fails.
+#
+# Additionally, this test validates the following error scenarios:
+# Error Case 1) A GTID --start-position that does not mention all domains
+# that make up the binary log state should error
+# Error Case 2) A GTID --start-position with any sequence numbers which
+# occur before the binary log state should result in error
+# Error Case 3) A GTID --start-position with any sequence numbers that are not
+# eventually processed results in error
+# Error Case 4) User provides invalid positions
+# Error Case 5) User provides GTID ranges with repeated domain ids
+#
+# References:
+# MDEV-4989: Support for GTID in mysqlbinlog
+#
+
+--source include/have_log_bin.inc
+
+--echo ###############################
+--echo # Test Setup
+--echo ###############################
+
+## Save old state
+#
+let orig_gtid_domain_id = `select @@session.gtid_domain_id`;
+let orig_server_id = `select @@session.server_id`;
+RESET MASTER;
+
+
+--echo ######################################
+--echo # Test Group 1
+--echo # Run test cases on local log file
+--echo ######################################
+--let is_remote= 0
+--source include/mysqlbinlog_gtid_window_test_cases.inc
+
+--echo ######################################
+--echo # Test Group 2
+--echo # Run test cases on remote host
+--echo ######################################
+--let is_remote= 1
+--source include/mysqlbinlog_gtid_window_test_cases.inc
+
+# Note that error cases 1-3 are in mysqlbinlog_gtid_window_test_cases.inc
+# because we validate for error consistency of GTID state between
+# mariadb-binlog working on local files and receiving errors from a server
+
+--let err_out_= $MYSQLTEST_VARDIR/tmp/err.out
+--let tmp_out_= $MYSQLTEST_VARDIR/tmp/std.out
+
+--let $MYSQLD_DATADIR=`select @@datadir`
+--echo #
+--echo # Error Case 4:
+--echo # User provides invalid positions
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=z
+--error 1
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=z
+
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=1-
+--error 1
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=1-
+
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=1-2
+--error 1
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=1-2
+
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=1-2-
+--error 1
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=1-2-
+
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=-1
+--error 1
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=-1
+
+--echo #
+--echo # Error Case 5:
+--echo # User provides GTID ranges with repeated domain ids
+--echo # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1,0-1-8 --stop-position=0-1-4,0-1-12
+--error 1
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1,0-1-8 --stop-position=0-1-4,0-1-12
+
+
+--echo ##############################
+--echo # Cleanup
+--echo ##############################
+--eval SET @@global.gtid_domain_id= $orig_gtid_domain_id
+--eval SET @@global.server_id= $orig_server_id
+
+--echo # End of the tests
diff --git a/mysql-test/suite/binlog/t/binlog_mysqlbinlog_start_alter_verbose.test b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_start_alter_verbose.test
new file mode 100644
index 00000000000..338326d144f
--- /dev/null
+++ b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_start_alter_verbose.test
@@ -0,0 +1,58 @@
+#
+# Purpose:
+#
+# This test ensures that mysqlbinlog prints a comment when two-phase alter
+# is enabled which shows the original alter query issued.
+#
+#
+# References:
+# MENT-662: Finalize MDEV-11675 "Lag Free Alter On Slave"
+#
+
+# Just row format for faster testing
+--source include/have_binlog_format_row.inc
+--source include/have_innodb.inc
+
+#---
+# Setup
+#---
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+
+RESET MASTER;
+create table myt (a int) engine=InnoDB;
+
+
+#---
+# Issue ALTER
+#---
+alter table myt add column (b int);
+
+
+#---
+# Check binlog output
+#---
+FLUSH LOGS;
+
+--disable_query_log
+--let $MYSQLD_DATADIR= `select @@datadir`
+--let $BINLOG_FILENAME= query_get_value(SHOW BINARY LOGS, Log_name, 1)
+
+--echo # Exec MYSQL_BINLOG --base64-output=decode-rows -v MYSQLD_DATADIR/BINLOG_FILENAME > MYSQLTEST_VARDIR/tmp/mysqlbinlog_verbose.sql
+--exec $MYSQL_BINLOG --base64-output=decode-rows -v $MYSQLD_DATADIR/$BINLOG_FILENAME > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_verbose.sql
+
+create table raw_binlog_rows (txt varchar(1000));
+--eval load data local infile '$MYSQLTEST_VARDIR/tmp/mysqlbinlog_verbose.sql' into table raw_binlog_rows columns terminated by '\n'
+--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_verbose.sql
+--enable_query_log
+--echo Verbose statements from : $BINLOG_FILENAME
+# Output --verbose lines, with extra Windows CR's trimmed
+select replace(txt,'\r', '') as stmt from raw_binlog_rows where txt like '###%';
+
+#---
+# Cleanup
+#---
+drop table raw_binlog_rows;
+drop table myt;
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase
diff --git a/mysql-test/suite/binlog/t/start_alter_mysqlbinlog_replay.test b/mysql-test/suite/binlog/t/start_alter_mysqlbinlog_replay.test
new file mode 100644
index 00000000000..d59456d72f6
--- /dev/null
+++ b/mysql-test/suite/binlog/t/start_alter_mysqlbinlog_replay.test
@@ -0,0 +1,61 @@
+#
+# MENT-662: Lag Free Alter On Slave
+#
+
+--echo #
+--echo # Test verifies replay of binary logs which contain
+--echo # SA/RA/CA works fine.
+--echo # Generate a binary log with alter events and use mysqlbinlog tool to
+--echo # generate a sql file for replay. Source it on an clean master and
+--echo # verify the correctness. Use the latest binlog and repeat the same
+--echo # process mentioned above and observe replay works fine.
+--echo #
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/have_binlog_format_statement.inc
+
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+
+create table t1 (f1 int primary key) engine=InnoDB;
+create table t2 (f1 int primary key, constraint c1 foreign key (f1) references t1(f1)) engine=innodb;
+
+--error ER_CANT_CREATE_TABLE
+alter table t2 add constraint c1 foreign key (f1) references t1(f1);
+
+drop table t2, t1;
+select @@gtid_binlog_state;
+FLUSH LOGS;
+
+let MYSQLD_DATADIR= `select @@datadir;`;
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/slave_1.sql
+
+--echo # reset the binlog
+RESET MASTER;
+--echo # execute the binlog
+--exec $MYSQL --port=$MASTER_MYPORT --host=127.0.0.1 -e "source $MYSQLTEST_VARDIR/tmp/slave_1.sql"
+SELECT @@gtid_binlog_state;
+FLUSH LOGS;
+--echo # Replay 1: One more time to simulate S->S case
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/slave_2.sql
+
+RESET MASTER;
+--echo # execute the binlog
+--exec $MYSQL --port=$MASTER_MYPORT --host=127.0.0.1 -e "source $MYSQLTEST_VARDIR/tmp/slave_2.sql"
+SELECT @@gtid_binlog_state;
+FLUSH LOGS;
+--echo # Replay 2: One more time to simulate S->S case
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/slave_3.sql
+RESET MASTER;
+--echo # execute the binlog
+--exec $MYSQL --port=$MASTER_MYPORT --host=127.0.0.1 -e "source $MYSQLTEST_VARDIR/tmp/slave_3.sql"
+SELECT @@gtid_binlog_state;
+
+--echo # clean up
+remove_file $MYSQLTEST_VARDIR/tmp/slave_1.sql;
+remove_file $MYSQLTEST_VARDIR/tmp/slave_2.sql;
+remove_file $MYSQLTEST_VARDIR/tmp/slave_3.sql;
+RESET MASTER;
+
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase
diff --git a/mysql-test/suite/binlog_encryption/rpl_switch_stm_row_mixed.result b/mysql-test/suite/binlog_encryption/rpl_switch_stm_row_mixed.result
index 936f604be2e..71332034b15 100644
--- a/mysql-test/suite/binlog_encryption/rpl_switch_stm_row_mixed.result
+++ b/mysql-test/suite/binlog_encryption/rpl_switch_stm_row_mixed.result
@@ -41,16 +41,16 @@ select @@global.binlog_format, @@session.binlog_format;
@@global.binlog_format @@session.binlog_format
ROW ROW
CREATE TABLE t1 (a varchar(100));
-prepare stmt1 from 'insert into t1 select concat(UUID(),?)';
+prepare stmt1 from 'insert into t1 select concat(SYS_GUID(),?)';
set @string="emergency_1_";
insert into t1 values("work_2_");
execute stmt1 using @string;
deallocate prepare stmt1;
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_3_"));
+insert into t1 values(concat(SYS_GUID(),"work_3_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_4_",UUID()));
+insert into t1 values(concat("for_4_",SYS_GUID()));
insert into t1 select "yesterday_5_";
create temporary table tmp(a char(100));
insert into tmp values("see_6_");
@@ -116,43 +116,43 @@ set binlog_format=default;
select @@global.binlog_format, @@session.binlog_format;
@@global.binlog_format @@session.binlog_format
MIXED MIXED
-prepare stmt1 from 'insert into t1 select concat(UUID(),?)';
+prepare stmt1 from 'insert into t1 select concat(SYS_GUID(),?)';
set @string="emergency_17_";
insert into t1 values("work_18_");
execute stmt1 using @string;
deallocate prepare stmt1;
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_19_"));
+insert into t1 values(concat(SYS_GUID(),"work_19_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_20_",UUID()));
+insert into t1 values(concat("for_20_",SYS_GUID()));
insert into t1 select "yesterday_21_";
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_22_"));
+insert into t1 values(concat(SYS_GUID(),"work_22_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_23_",UUID()));
+insert into t1 values(concat("for_23_",SYS_GUID()));
insert into t1 select "yesterday_24_";
-create table t2 ENGINE=MyISAM select rpad(UUID(),100,' ');
-create table t3 select 1 union select UUID();
+create table t2 ENGINE=MyISAM select rpad(SYS_GUID(),100,' ');
+create table t3 select 1 union select SYS_GUID();
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
-create table t4 select * from t1 where 3 in (select 1 union select 2 union select UUID() union select 3);
+create table t4 select * from t1 where 3 in (select 1 union select 2 union select SYS_GUID() union select 3);
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
create table t5 select * from t1 where 3 in (select 1 union select 2 union select curdate() union select 3);
Warnings:
Warning 1292 Truncated incorrect datetime value: '3'
-insert ignore into t5 select UUID() from t1 where 3 in (select 1 union select 2 union select 3 union select * from t4);
+insert ignore into t5 select SYS_GUID() from t1 where 3 in (select 1 union select 2 union select 3 union select * from t4);
create procedure foo()
begin
insert into t1 values("work_25_");
-insert into t1 values(concat("for_26_",UUID()));
+insert into t1 values(concat("for_26_",SYS_GUID()));
insert into t1 select "yesterday_27_";
end|
create procedure foo2()
begin
-insert into t1 values(concat("emergency_28_",UUID()));
+insert into t1 values(concat("emergency_28_",SYS_GUID()));
insert into t1 values("work_29_");
-insert into t1 values(concat("for_30_",UUID()));
+insert into t1 values(concat("for_30_",SYS_GUID()));
set session binlog_format=row; # accepted for stored procs
insert into t1 values("more work_31_");
set session binlog_format=mixed;
@@ -171,7 +171,7 @@ end|
call foo();
call foo2();
call foo4("hello");
-call foo4(UUID());
+call foo4(SYS_GUID());
call foo4("world");
select foo3();
ERROR HY000: Cannot change the binary logging format inside a stored function or trigger
@@ -207,7 +207,7 @@ foo4()
deallocate prepare stmt1;
create function foo5() returns bigint unsigned
begin
-insert into t2 select UUID();
+insert into t2 select SYS_GUID();
return 100;
end|
select foo5();
@@ -229,18 +229,18 @@ end|
select foo6("foo6_1_");
foo6("foo6_1_")
100
-select foo6(concat("foo6_2_",UUID()));
-foo6(concat("foo6_2_",UUID()))
+select foo6(concat("foo6_2_",SYS_GUID()));
+foo6(concat("foo6_2_",SYS_GUID()))
100
-prepare stmt1 from 'select foo6(concat("foo6_3_",UUID()))';
+prepare stmt1 from 'select foo6(concat("foo6_3_",SYS_GUID()))';
execute stmt1;
-foo6(concat("foo6_3_",UUID()))
+foo6(concat("foo6_3_",SYS_GUID()))
100
execute stmt1;
-foo6(concat("foo6_3_",UUID()))
+foo6(concat("foo6_3_",SYS_GUID()))
100
deallocate prepare stmt1;
-create view v1 as select uuid();
+create view v1 as select SYS_GUID();
create table t11 (data varchar(255));
insert into t11 select * from v1;
insert into t11 select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysqltest1' and TABLE_NAME IN ('v1','t11');
@@ -250,11 +250,11 @@ execute stmt1;
deallocate prepare stmt1;
create trigger t11_bi before insert on t11 for each row
begin
-set NEW.data = concat(NEW.data,UUID());
+set NEW.data = concat(NEW.data,SYS_GUID());
end|
insert into t11 values("try_560_");
insert delayed into t2 values("delay_1_");
-insert delayed into t2 values(concat("delay_2_",UUID()));
+insert delayed into t2 values(concat("delay_2_",SYS_GUID()));
insert delayed into t2 values("delay_6_");
insert delayed into t2 values(rand());
set @a=2.345;
@@ -356,7 +356,7 @@ alter table t1 modify a int, drop primary key;
insert into t1 values(null,"try_57_");
connection slave;
connection master;
-CREATE TEMPORARY TABLE t15 SELECT UUID();
+CREATE TEMPORARY TABLE t15 SELECT SYS_GUID();
create table t16 like t15;
INSERT INTO t16 SELECT * FROM t15;
insert into t16 values("try_65_");
@@ -427,7 +427,7 @@ DROP TABLE IF EXISTS t12;
SET SESSION BINLOG_FORMAT=MIXED;
CREATE TABLE t12 (data LONG);
LOCK TABLES t12 WRITE;
-INSERT INTO t12 VALUES(UUID());
+INSERT INTO t12 VALUES(SYS_GUID());
UNLOCK TABLES;
connection slave;
connection master;
diff --git a/mysql-test/suite/compat/oracle/r/sp-anchor-row-type-table.result b/mysql-test/suite/compat/oracle/r/sp-anchor-row-type-table.result
index 9edec669908..b878042174b 100644
--- a/mysql-test/suite/compat/oracle/r/sp-anchor-row-type-table.result
+++ b/mysql-test/suite/compat/oracle/r/sp-anchor-row-type-table.result
@@ -21,7 +21,7 @@ Table Create Table
t2 CREATE TABLE "t2" (
"a" int(11) DEFAULT NULL,
"b" text DEFAULT NULL,
- "c" char(1) DEFAULT NULL
+ "c" varchar(1) DEFAULT NULL
)
DROP PROCEDURE p2;
DROP PROCEDURE p1;
diff --git a/mysql-test/suite/compat/oracle/r/sp-cursor.result b/mysql-test/suite/compat/oracle/r/sp-cursor.result
index 2e0c43c8b87..aa9c5de8bc9 100644
--- a/mysql-test/suite/compat/oracle/r/sp-cursor.result
+++ b/mysql-test/suite/compat/oracle/r/sp-cursor.result
@@ -454,12 +454,12 @@ CALL p1('1b');
msg
Fetched a record a=1
Warnings:
-Warning 1265 Data truncated for column 'p_a' at row 1
+Warning 1265 Data truncated for column 'p_a' at row 0
CALL p1('b1');
msg
Fetched a record a=0
Warnings:
-Warning 1366 Incorrect integer value: 'b1' for column ``.``.`p_a` at row 1
+Warning 1366 Incorrect integer value: 'b1' for column ``.``.`p_a` at row 0
DROP PROCEDURE p1;
#
# One parameter in SELECT list + subselect
@@ -977,3 +977,46 @@ $$
CALL p1();
DROP PROCEDURE p1;
DROP TABLE t1;
+#
+# Start of 10.8 tests
+#
+#
+# MDEV-10654 IN, OUT, INOUT parameters in CREATE FUNCTION
+#
+DECLARE
+va INT;
+CURSOR cur (a IN INT) IS SELECT a FROM dual;
+BEGIN
+OPEN cur(1);
+FETCH cur INTO va;
+CLOSE cur;
+SELECT va;
+END;
+$$
+va
+1
+DECLARE
+va INT;
+CURSOR cur (a OUT INT) IS SELECT a FROM dual;
+BEGIN
+OPEN cur(1);
+FETCH cur INTO va;
+CLOSE cur;
+SELECT va;
+END;
+$$
+ERROR 42000: This version of MariaDB doesn't yet support 'OUT/INOUT cursor parameter'
+DECLARE
+va INT;
+CURSOR cur (a INOUT INT) IS SELECT a FROM dual;
+BEGIN
+OPEN cur(1);
+FETCH cur INTO va;
+CLOSE cur;
+SELECT va;
+END;
+$$
+ERROR 42000: This version of MariaDB doesn't yet support 'OUT/INOUT cursor parameter'
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/suite/compat/oracle/r/sp-inout.result b/mysql-test/suite/compat/oracle/r/sp-inout.result
new file mode 100644
index 00000000000..fa6f5076d59
--- /dev/null
+++ b/mysql-test/suite/compat/oracle/r/sp-inout.result
@@ -0,0 +1,2571 @@
+#
+# MDEV-10654 IN, OUT, INOUT parameters in CREATE FUNCTION
+#
+SET sql_mode=ORACLE;
+#
+# CREATE PACKAGE with procedure and function with IN, OUT, INOUT qualifiers
+# And SHOW CREATE PACKAGE
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT);
+FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+AS
+res INT;
+BEGIN
+res := func_sub(d, a, b, c);
+d := d + c + res;
+END;
+FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT
+AS
+BEGIN
+c := c + 6;
+d := 10;
+RETURN a - b;
+END;
+END;
+$$
+SHOW CREATE PACKAGE pkg2;
+Package sql_mode Create Package character_set_client collation_connection Database Collation
+pkg2 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT CREATE DEFINER="root"@"localhost" PACKAGE "pkg2" AS
+PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT);
+FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT;
+END latin1 latin1_swedish_ci latin1_swedish_ci
+SHOW CREATE PACKAGE BODY pkg2;
+Package body sql_mode Create Package Body character_set_client collation_connection Database Collation
+pkg2 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT CREATE DEFINER="root"@"localhost" PACKAGE BODY "pkg2" AS
+PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+AS
+res INT;
+BEGIN
+res := func_sub(d, a, b, c);
+d := d + c + res;
+END;
+FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT
+AS
+BEGIN
+c := c + 6;
+d := 10;
+RETURN a - b;
+END;
+END latin1 latin1_swedish_ci latin1_swedish_ci
+DROP PACKAGE pkg2;
+#
+# CREATE FUNCTION with IN, OUT, INOUT qualifiers
+# SHOW CREATE FUNCTION
+#
+CREATE OR REPLACE FUNCTION add_func(a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT
+AS
+BEGIN
+c := 100;
+d := d + 1;
+RETURN a + b;
+END;
+$$
+SHOW CREATE FUNCTION add_func;
+Function sql_mode Create Function character_set_client collation_connection Database Collation
+add_func PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT CREATE DEFINER="root"@"localhost" FUNCTION "add_func"(a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN int(11)
+AS
+BEGIN
+c := 100;
+d := d + 1;
+RETURN a + b;
+END latin1 latin1_swedish_ci latin1_swedish_ci
+DROP FUNCTION add_func;
+#
+# CREATE PROCEDURE with IN, OUT, INOUT qualifiers
+# SHOW CREATE PROCEDURE
+#
+CREATE OR REPLACE PROCEDURE add_proc(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+AS
+BEGIN
+d := a + b + c + d;
+END;
+$$
+SHOW CREATE PROCEDURE add_proc;
+Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
+add_proc PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT CREATE DEFINER="root"@"localhost" PROCEDURE "add_proc"(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+AS
+BEGIN
+d := a + b + c + d;
+END latin1 latin1_swedish_ci latin1_swedish_ci
+DROP PROCEDURE add_proc;
+#
+# Call function from SELECT query
+# SELECT > FUNCTION(IN)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION add_func2 (a IN INT, b IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION add_func2(a IN INT, b IN INT) RETURN INT
+AS
+BEGIN
+RETURN a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+select pkg2.add_func2(@a, @b);
+pkg2.add_func2(@a, @b)
+5
+DROP PACKAGE pkg2;
+#
+# Call function from SELECT query
+# SELECT > FUNCTION(OUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION add_func3 (a IN INT, b IN INT, c OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION add_func3(a IN INT, b IN INT, c OUT INT) RETURN INT
+AS
+BEGIN
+c := 100;
+RETURN a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+set @c = 0;
+select pkg2.add_func3(@a, @b, @c);
+ERROR HY000: OUT or INOUT argument 3 for function pkg2.add_func3 is not allowed here
+DROP PACKAGE pkg2;
+#
+# Call function from SELECT query
+# SELECT > FUNCTION(INOUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION add_func4 (a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION add_func4(a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT
+AS
+BEGIN
+c := 100;
+d := d + 1;
+RETURN a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+set @c = 0;
+set @d = 9;
+select pkg2.add_func4(@a, @b, @c, @d);
+ERROR HY000: OUT or INOUT argument 3 for function pkg2.add_func4 is not allowed here
+DROP PACKAGE pkg2;
+#
+# Call from procedure
+# PROCEDURE(OUT) > FUNCTION(IN)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE add_proc2 (a IN INT, b IN INT, c OUT INT);
+FUNCTION add_func2 (a IN INT, b IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE add_proc2(a IN INT, b IN INT, c OUT INT)
+AS
+BEGIN
+c := add_func2(a, b);
+END;
+FUNCTION add_func2(a IN INT, b IN INT) RETURN INT
+AS
+BEGIN
+RETURN a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.add_proc2(@a, @b, @c);
+select @c;
+@c
+5
+DROP PACKAGE pkg2;
+#
+# Call from procedure
+# PROCEDURE(OUT) > FUNCTION(OUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE add_proc3 (a IN INT, b IN INT, c OUT INT);
+FUNCTION add_func3 (a IN INT, b IN INT, c OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE add_proc3(a IN INT, b IN INT, c OUT INT)
+AS
+res INT;
+BEGIN
+res := add_func3(a, b, c);
+END;
+FUNCTION add_func3(a IN INT, b IN INT, c OUT INT) RETURN INT
+AS
+BEGIN
+c := 100;
+RETURN a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.add_proc3(@a, @b, @c);
+select @c;
+@c
+100
+DROP PACKAGE pkg2;
+#
+# Call from procedure
+# PROCEDURE(OUT) > FUNCTION(INOUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE add_proc4 (a IN INT, b IN INT, c OUT INT);
+FUNCTION add_func4 (a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE add_proc4(a IN INT, b IN INT, res OUT INT)
+AS
+c INT;
+d INT;
+BEGIN
+d := 30;
+res := add_func4(a, b, c, d);
+res := c + d;
+END;
+FUNCTION add_func4(a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT
+AS
+BEGIN
+c := 100;
+d := d + 1;
+RETURN a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+set @res = 0;
+call pkg2.add_proc4(@a, @b, @res);
+select @res;
+@res
+131
+DROP PACKAGE pkg2;
+#
+# Call from procedure
+# PROCEDURE(OUT) > PROCEDURE(OUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE test_proc1 (a IN INT, b IN INT, c OUT INT);
+PROCEDURE add_proc (a IN INT, b IN INT, c OUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE test_proc1(a IN INT, b IN INT, c OUT INT)
+AS
+BEGIN
+call pkg2.add_proc(a, b, c);
+END;
+PROCEDURE add_proc(a IN INT, b IN INT, c OUT INT)
+AS
+BEGIN
+c := a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.test_proc1(@a, @b, @c);
+select @c;
+@c
+5
+DROP PACKAGE pkg2;
+#
+# Argument's order change
+# PROCEDURE(a IN, b IN, c OUT) > FUNCTION(b IN, a IN, c OUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c OUT INT);
+FUNCTION func_sub(b IN INT, a IN INT, c OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c OUT INT)
+AS
+res INT;
+BEGIN
+res := func_sub(b, a, c);
+END;
+FUNCTION func_sub(b IN INT, a IN INT, c OUT INT) RETURN INT
+AS
+res INT;
+BEGIN
+c := a - b;
+res := a;
+RETURN res;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.proc_main(@a, @b, @c);
+select @c;
+@c
+-1
+DROP PACKAGE pkg2;
+#
+# Argument's order change
+# PROCEDURE(a IN, b IN, c OUT) > FUNCTION(c OUT, b IN, a IN)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c OUT INT);
+FUNCTION func_sub(c OUT INT, b IN INT, a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c OUT INT)
+AS
+res INT;
+BEGIN
+res := func_sub(c, b, a);
+END;
+FUNCTION func_sub(c OUT INT, b IN INT, a IN INT) RETURN INT
+AS
+res INT;
+BEGIN
+c := a - b;
+res := a;
+RETURN res;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.proc_main(@a, @b, @c);
+select @c;
+@c
+-1
+DROP PACKAGE pkg2;
+#
+# Argument's order change
+# PROCEDURE(a IN, b IN, c INOUT, d OUT) > FUNCTION(d OUT, a IN, b IN, c INOUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT);
+FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+AS
+res INT;
+BEGIN
+res := func_sub(d, a, b, c);
+d := d + c + res;
+END;
+FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT
+AS
+BEGIN
+c := c + 6;
+d := 10;
+RETURN a - b;
+END;
+END;
+$$
+set @a = 15;
+set @b = 5;
+set @c = 4;
+set @d= 0;
+call pkg2.proc_main(@a, @b, @c, @d);
+select @d;
+@d
+30
+DROP PACKAGE pkg2;
+#
+# Argument's order change
+# PROCEDURE(a IN INT, b IN INT, c INOUT INT, d OUT INT) > FUNCTION1(c INOUT INT, b IN INT) > FUNCTION2(d OUT INT, a IN INT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT);
+FUNCTION func_sub1(c INOUT INT, b IN INT) RETURN INT;
+FUNCTION func_sub2(d OUT INT, a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+AS
+res1 INT;
+res2 INT;
+BEGIN
+res1 := func_sub1(c, b);
+res2 := func_sub2(d, a);
+d := d + c;
+END;
+FUNCTION func_sub1(c INOUT INT, b IN INT) RETURN INT
+AS
+BEGIN
+c := c + b;
+RETURN 0;
+END;
+FUNCTION func_sub2(d OUT INT, a IN INT) RETURN INT
+AS
+BEGIN
+d := 5 + a;
+RETURN 0;
+END;
+END;
+$$
+set @a = 15;
+set @b = 6;
+set @c = 4;
+set @d= 0;
+call pkg2.proc_main(@a, @b, @c, @d);
+select @d;
+@d
+30
+DROP PACKAGE pkg2;
+#
+# Argument's order change
+# FUNCTION1(a IN, b IN) > FUNCTION2(b IN, c OUT, a IN)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT, b IN INT) RETURN INT;
+FUNCTION func_sub(b IN INT, c OUT INT, a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT, b IN INT) RETURN INT
+AS
+c INT;
+res INT;
+BEGIN
+res := func_sub(b, c, a);
+RETURN res + c;
+END;
+FUNCTION func_sub(b IN INT, c OUT INT, a IN INT) RETURN INT
+AS
+BEGIN
+c := 100;
+RETURN a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+select pkg2.func_main(@a, @b);
+pkg2.func_main(@a, @b)
+105
+DROP PACKAGE pkg2;
+#
+# Call procedure inside function
+# FUNCTION1(a IN, b IN) > PROCEDURE(a IN, b IN, c OUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(b IN INT, a IN INT) RETURN INT;
+PROCEDURE proc_sub(a IN INT, b IN INT, c OUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(b IN INT, a IN INT) RETURN INT
+AS
+c INT;
+BEGIN
+call proc_sub(a, b, c);
+RETURN c;
+END;
+PROCEDURE proc_sub(a IN INT, b IN INT, c OUT INT)
+AS
+BEGIN
+c := a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+select pkg2.func_main(@a, @b);
+pkg2.func_main(@a, @b)
+5
+DROP PACKAGE pkg2;
+#
+# Call procedure inside function
+# FUNCTION1(a IN, b IN) > PROCEDURE(a IN, b INOUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(b IN INT, a IN INT) RETURN INT;
+PROCEDURE proc_sub(a IN INT, b INOUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(b IN INT, a IN INT) RETURN INT
+AS
+BEGIN
+call proc_sub(a, b);
+RETURN b;
+END;
+PROCEDURE proc_sub(a IN INT, b INOUT INT)
+AS
+BEGIN
+b := a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+select pkg2.func_main(@a, @b);
+pkg2.func_main(@a, @b)
+5
+DROP PACKAGE pkg2;
+#
+# Call procedure inside function
+# FUNCTION1(a IN, b IN, c OUT) > PROCEDURE(a IN, b IN, c OUT)
+#
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(b IN INT, a IN INT, c OUT INT) RETURN INT;
+PROCEDURE proc_sub(a IN INT, b IN INT, c OUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(b IN INT, a IN INT, c OUT INT) RETURN INT
+AS
+res INT;
+BEGIN
+call proc_sub(a, b, c);
+RETURN 0;
+END;
+PROCEDURE proc_sub(a IN INT, b IN INT, c OUT INT)
+AS
+BEGIN
+c := a + b;
+END;
+END;
+$$
+set @a = 2;
+set @b = 3;
+set @c = 0;
+select pkg2.func_main(@a, @b, @c);
+ERROR HY000: OUT or INOUT argument 3 for function pkg2.func_main is not allowed here
+DROP PACKAGE pkg2;
+#
+# Call function from UPDATE query
+# UPDATE <table> SET <column> = FUNCTION(a IN)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func(a IN INT) RETURN INT
+AS
+BEGIN
+RETURN a * 10;
+END;
+END;
+$$
+set @a = 5;
+UPDATE Persons SET Age = pkg2.func(@a) WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# Call function from UPDATE query
+# UPDATE <table> SET <column> = FUNCTION(a OUT)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func(a OUT INT) RETURN INT
+AS
+BEGIN
+a := 5;
+RETURN 80;
+END;
+END;
+$$
+set @a = 0;
+UPDATE Persons SET Age = pkg2.func(@a) WHERE ID = 1;
+ERROR HY000: OUT or INOUT argument 1 for function pkg2.func is not allowed here
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# Call function from INSERT query
+# INSERT INTO <table> SELECT <val1>, <val2>, FUNCTION(a IN)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func(a IN INT) RETURN INT
+AS
+BEGIN
+RETURN a * 10;
+END;
+END;
+$$
+set @a = 4;
+INSERT INTO Persons SELECT 4, 'DDD', PKG2.func(@a);
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# Call function from INSERT query
+# INSERT INTO <table> SELECT <val1>, <val2>, FUNCTION(a OUT)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func(a OUT INT) RETURN INT
+AS
+BEGIN
+a := 45;
+RETURN 40;
+END;
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+set @a = 0;
+INSERT INTO Persons SELECT 5, 'EEE', PKG2.func(@a);
+ERROR HY000: OUT or INOUT argument 1 for function PKG2.func is not allowed here
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# Call function from DELETE query
+# DELETE FROM <table> WHERE <column> = FUNCTION(a IN)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func(a IN INT) RETURN INT
+AS
+BEGIN
+RETURN a;
+END;
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+set @a = 4;
+DELETE FROM Persons WHERE ID = PKG2.func(@a);
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# Call function from DELETE query
+# DELETE FROM <table> WHERE <column> = FUNCTION(a OUT)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func(a OUT INT) RETURN INT
+AS
+BEGIN
+a := 40;
+RETURN 4;
+END;
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+set @a = 0;
+DELETE FROM Persons WHERE ID = PKG2.func(@a);
+ERROR HY000: OUT or INOUT argument 1 for function PKG2.func is not allowed here
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# SELECT query inside function
+# FUNCTION(a IN) > SELECT … FROM <table>
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT
+AS
+c INT;
+BEGIN
+SELECT AGE INTO c FROM Persons WHERE ID = a;
+RETURN c;
+END;
+END;
+$$
+set @a = 3;
+select pkg2.func_main(@a);
+pkg2.func_main(@a)
+30
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# SELECT query inside function
+# FUNCTION(a OUT) > SELECT … FROM <table>
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a OUT INT) RETURN INT
+AS
+BEGIN
+SELECT AGE INTO a FROM Persons WHERE ID = 3;
+RETURN 0;
+END;
+END;
+$$
+set @a = 0;
+select pkg2.func_main(@a);
+ERROR HY000: OUT or INOUT argument 1 for function pkg2.func_main is not allowed here
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# SELECT query inside function
+# FUNCTION(a INOUT) > SELECT … FROM <table>
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a INOUT INT) RETURN INT
+AS
+BEGIN
+SELECT AGE INTO a FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+set @a = 1;
+select pkg2.func_main(@a);
+ERROR HY000: OUT or INOUT argument 1 for function pkg2.func_main is not allowed here
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# SELECT query inside function
+# FUNCTION(a IN) > FUNCTION(a IN, b OUT) > SELECT … FROM <table>
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT;
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT
+AS
+b INT;
+res INT;
+BEGIN
+res := func_sub(a, b);
+RETURN b;
+END;
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+AS
+BEGIN
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+set @a = 2;
+select pkg2.func_main(@a);
+pkg2.func_main(@a)
+20
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# UPDATE query inside function
+# FUNCTION(a IN) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT
+AS
+c INT;
+BEGIN
+UPDATE Persons SET AGE = 50 WHERE ID = a;
+SELECT AGE INTO c FROM Persons WHERE ID = a;
+RETURN c;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+set @a = 5;
+select pkg2.func_main(@a);
+pkg2.func_main(@a)
+50
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 50
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# UPDATE query inside function
+# FUNCTION(a IN, b OUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT, b OUT INT) RETURN INT
+AS
+BEGIN
+UPDATE Persons SET AGE = 60 WHERE ID = a;
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+set @a = 5;
+set @b = 0;
+select pkg2.func_main(@a, @b);
+ERROR HY000: OUT or INOUT argument 2 for function pkg2.func_main is not allowed here
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# UPDATE query inside function
+# FUNCTION(a IN, b INOUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT, b INOUT INT) RETURN INT
+AS
+BEGIN
+UPDATE Persons SET AGE = 60 WHERE ID = a;
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+set @a = 5;
+set @b = 0;
+select pkg2.func_main(@a, @b);
+ERROR HY000: OUT or INOUT argument 2 for function pkg2.func_main is not allowed here
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# UPDATE query inside function
+# FUNCTION(a IN) > FUNCTION(a IN, b OUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 80);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT;
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT
+AS
+b INT;
+res INT;
+BEGIN
+res := func_sub(a, b);
+RETURN b;
+END;
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+AS
+BEGIN
+UPDATE Persons SET AGE = 10 WHERE ID = a;
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 80
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+set @a = 1;
+select pkg2.func_main(@a);
+pkg2.func_main(@a)
+10
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# INSERT query inside function
+# FUNCTION(a IN) > INSERT INTO <table> VALUES …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 50);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT
+AS
+b INT;
+BEGIN
+INSERT INTO Persons VALUE (a, 'FFF', 60);
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN b;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 50
+set @a = 6;
+select pkg2.func_main(@a);
+pkg2.func_main(@a)
+60
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 50
+6 FFF 60
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# INSERT query inside function
+# FUNCTION(a IN, b OUT) > INSERT INTO <table> VALUES …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 50);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT, b OUT INT) RETURN INT
+AS
+BEGIN
+INSERT INTO Persons VALUE (a, 'FFF', 60);
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 50
+set @a = 6;
+set @b = 0;
+select pkg2.func_main(@a, @b);
+ERROR HY000: OUT or INOUT argument 2 for function pkg2.func_main is not allowed here
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# INSERT query inside function
+# FUNCTION(a IN, b INOUT) > INSERT INTO <table> VALUES …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT, b INOUT INT) RETURN INT
+AS
+BEGIN
+INSERT INTO Persons VALUE (a, 'FFF', 60);
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+set @a = 6;
+set @b = 0;
+select pkg2.func_main(@a, @b);
+ERROR HY000: OUT or INOUT argument 2 for function pkg2.func_main is not allowed here
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# INSERT query inside function
+# FUNCTION(a IN) > FUNCTION(a IN, b OUT) > INSERT INTO <table> VALUES …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT;
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func_main(a IN INT) RETURN INT
+AS
+b INT;
+res INT;
+BEGIN
+res := func_sub(a, b);
+RETURN b;
+END;
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+AS
+BEGIN
+INSERT INTO Persons VALUE (a, 'FFF', 60);
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+set @a = 6;
+select pkg2.func_main(@a);
+pkg2.func_main(@a)
+60
+select * from Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 EEE 40
+6 FFF 60
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(IN) > SELECT FROM <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT);
+FUNCTION func_sub(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT)
+AS
+BEGIN
+b := func_sub(a);
+END;
+FUNCTION func_sub(a IN INT) RETURN INT
+AS
+b INT;
+BEGIN
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN b;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+set @a = 2;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select @b;
+@b
+20
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(OUT) > SELECT FROM <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT);
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT)
+AS
+res INT;
+BEGIN
+res := func_sub(a, b);
+END;
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+AS
+BEGIN
+SELECT AGE INTO b FROM Persons WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+set @a = 1;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select @b;
+@b
+50
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(INOUT) > SELECT FROM <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT);
+FUNCTION func_sub(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT)
+AS
+c INT;
+res INT;
+BEGIN
+c := 5;
+res := func_sub(a, c);
+b := c;
+END;
+FUNCTION func_sub(a IN INT, c INOUT INT) RETURN INT
+AS
+res INT;
+BEGIN
+SELECT AGE INTO res FROM Persons WHERE ID = a;
+c := c * 100;
+RETURN res;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+set @a = 2;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select @b;
+@b
+500
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(IN) > INSESRT INTO <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT);
+FUNCTION func_sub(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT)
+AS
+BEGIN
+b := func_sub(a);
+END;
+FUNCTION func_sub(a IN INT) RETURN INT
+AS
+BEGIN
+INSERT INTO Persons VALUE (a, 'FFF', 50);
+RETURN 0;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+set @a = 5;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(OUT) > INSESRT INTO <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT);
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT)
+AS
+res INT;
+BEGIN
+res := func_sub(a, b);
+END;
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+AS
+BEGIN
+INSERT INTO Persons VALUE (a, 'GGG', 60);
+RETURN 0;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+set @a = 6;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+6 GGG 60
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(INOUT) > INSESRT INTO <table> …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT);
+FUNCTION func_sub(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT)
+AS
+c INT;
+res INT;
+BEGIN
+c := 5;
+res := func_sub(a, c);
+b := c;
+END;
+FUNCTION func_sub(a IN INT, c INOUT INT) RETURN INT
+AS
+res INT;
+BEGIN
+INSERT INTO Persons VALUE (a, 'HHH', 70);
+c := c * 100;
+RETURN res;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+6 GGG 60
+set @a = 7;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+6 GGG 60
+7 HHH 70
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(IN) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT);
+FUNCTION func_sub(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT)
+AS
+BEGIN
+b := func_sub(a);
+END;
+FUNCTION func_sub(a IN INT) RETURN INT
+AS
+BEGIN
+UPDATE Persons SET AGE = 100 WHERE ID = a;
+RETURN 0;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 50
+6 GGG 60
+7 HHH 70
+set @a = 5;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 60
+7 HHH 70
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 100);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT);
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT)
+AS
+res INT;
+BEGIN
+res := func_sub(a, b);
+END;
+FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+AS
+BEGIN
+UPDATE Persons SET AGE = 100 WHERE ID = a;
+b := 1;
+RETURN 0;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 60
+7 HHH 70
+set @a = 6;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 100
+7 HHH 70
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# PROCEDURE > FUNCTION > SQL query
+# PROCEDURE(OUT) > FUNCTION(INOUT) > UPDATE <table> SET …
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 100);
+INSERT INTO Persons VALUES (6, 'GGG', 100);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT);
+FUNCTION func_sub(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc_main(a IN INT, b OUT INT)
+AS
+c INT;
+res INT;
+BEGIN
+c := 5;
+res := func_sub(a, c);
+b := c;
+END;
+FUNCTION func_sub(a IN INT, c INOUT INT) RETURN INT
+AS
+res INT;
+BEGIN
+UPDATE Persons SET AGE = 100 WHERE ID = a;
+c := c * 100;
+RETURN res;
+END;
+END;
+$$
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 100
+7 HHH 70
+set @a = 7;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+4 DDD 40
+5 FFF 100
+6 GGG 100
+7 HHH 100
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 20 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 20
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(IN) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func(a IN INT) RETURN INT
+AS
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+RETURN 0;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+DECLARE
+a INT;
+res INT;
+BEGIN
+a := 10;
+res := 0;
+res := pkg2.func(a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 30 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 30
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(OUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 40);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func(a OUT INT) RETURN INT
+AS
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+a := 100;
+RETURN 0;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+DECLARE
+a INT;
+res INT;
+BEGIN
+a := 10;
+res := 0;
+res := pkg2.func(a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 40
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(INOUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+FUNCTION func(a INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+FUNCTION func(a INOUT INT) RETURN INT
+AS
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+a := 100;
+RETURN 0;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+DECLARE
+a INT;
+res INT;
+BEGIN
+a := 10;
+res := 0;
+res := pkg2.func(a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 60 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 60
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(IN) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc(a IN INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc(a IN INT)
+AS
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+call pkg2.proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 30 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 30
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc(a OUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc(a OUT INT)
+AS
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+call pkg2.proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(INOUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc(a INOUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc(a INOUT INT)
+AS
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+a := 100;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+set @a = 2;
+call pkg2.proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 50
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(IN) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc(a OUT INT);
+FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc(a OUT INT)
+AS
+res INT;
+BEGIN
+a := 100;
+res := func(a);
+END;
+FUNCTION func(a IN INT) RETURN INT
+AS
+BEGIN
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+RETURN 0;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+call pkg2.proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 60 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 60
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc(a OUT INT);
+FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc(a OUT INT)
+AS
+res INT;
+BEGIN
+a := 100;
+res := func(a);
+END;
+FUNCTION func(a OUT INT) RETURN INT
+AS
+BEGIN
+a := 200;
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+RETURN 0;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+call pkg2.proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 80 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 80
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(INOUT) > UPDATE TABLE2
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc(a OUT INT);
+FUNCTION func(a INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc(a OUT INT)
+AS
+res INT;
+BEGIN
+a := 100;
+res := func(a);
+END;
+FUNCTION func(a INOUT INT) RETURN INT
+AS
+BEGIN
+a := 200;
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+RETURN 0;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+call pkg2.proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 90 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 90
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+1
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Trigger
+# TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE TABLE2 with OUT argument (to check if OUT is returning by reference)
+#
+CREATE TABLE Persons (
+ID int,
+Name varchar(255),
+Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+CREATE TABLE PersonsLog (
+UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+CREATE OR REPLACE PACKAGE pkg2
+AS
+PROCEDURE proc(a OUT INT);
+FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+PROCEDURE proc(a OUT INT)
+AS
+res INT;
+BEGIN
+res := func(a);
+UPDATE PersonsLog SET UpdateCount = a;
+END;
+FUNCTION func(a OUT INT) RETURN INT
+AS
+BEGIN
+a := 111;
+UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+RETURN 0;
+END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+call pkg2.proc(@a);
+END;
+$$
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 10
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+0
+UPDATE Persons SET Age = 80 WHERE ID = 1;
+SELECT * FROM Persons;
+ID Name Age
+1 AAA 80
+2 BBB 20
+3 CCC 30
+SELECT * FROM PersonsLog;
+UpdateCount
+111
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+#
+# Package BODY variables as OUT parameters
+#
+CREATE PACKAGE pkg1 AS
+FUNCTION f1(b IN OUT INT) RETURN INT;
+FUNCTION show_private_variables() RETURN TEXT;
+END;
+$$
+CREATE PACKAGE BODY pkg1 AS
+pa INT:= 0;
+pb INT:= 10;
+FUNCTION f1(b IN OUT INT) RETURN INT AS
+BEGIN
+b:= b + 100;
+RETURN 500+b-100;
+END;
+FUNCTION show_private_variables() RETURN TEXT AS
+BEGIN
+RETURN 'Private variables: pa=' || pa || ' pb=' || pb;
+END;
+BEGIN
+SET pa=f1(pb);
+END;
+$$
+SELECT pkg1.show_private_variables();
+pkg1.show_private_variables()
+Private variables: pa=510 pb=110
+DROP PACKAGE pkg1;
diff --git a/mysql-test/suite/compat/oracle/r/sp-param.result b/mysql-test/suite/compat/oracle/r/sp-param.result
index 3b9be4585d4..bb415bd74a7 100644
--- a/mysql-test/suite/compat/oracle/r/sp-param.result
+++ b/mysql-test/suite/compat/oracle/r/sp-param.result
@@ -152,7 +152,7 @@ begin
call p1(w,'0123456789');
end;
/
-ERROR 22001: Data too long for column 'pinout' at row 1
+ERROR 22001: Data too long for column 'pinout' at row 0
declare w varchar(20);
begin
w:='aaa';
@@ -165,7 +165,7 @@ w:='aaa';
call p1(w,'0123456789');
end;
/
-ERROR 22001: Data too long for column 'pinout' at row 1
+ERROR 22001: Data too long for column 'pinout' at row 0
declare str varchar(6000);
pout varchar(6000);
begin
@@ -184,7 +184,7 @@ call p1(pout,str);
select length(pout);
end;
/
-ERROR 22001: Data too long for column 'pinout' at row 1
+ERROR 22001: Data too long for column 'pinout' at row 0
declare str varchar(40000);
pout varchar(60000);
begin
@@ -203,7 +203,7 @@ call p1(pout,str);
select length(pout);
end;
/
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
declare str text(80000);
pout text(80000);
begin
@@ -240,7 +240,7 @@ CALL p2(11);
LENGTH(pinout)
10
Warnings:
-Warning 1265 Data truncated for column 'pinout' at row 1
+Warning 1265 Data truncated for column 'pinout' at row 0
DROP PROCEDURE p1;
DROP PROCEDURE p2;
SET sql_mode=ORACLE;
@@ -261,12 +261,12 @@ CALL p2(65535);
LENGTH(f1(str,padlen))
65532
Warnings:
-Warning 1265 Data truncated for column 'pin' at row 1
+Warning 1265 Data truncated for column 'pin' at row 0
CALL p2(65536);
LENGTH(f1(str,padlen))
65532
Warnings:
-Warning 1265 Data truncated for column 'pin' at row 1
+Warning 1265 Data truncated for column 'pin' at row 0
DROP PROCEDURE p2;
DROP FUNCTION f1;
SET sql_mode='ORACLE,STRICT_TRANS_TABLES';
@@ -290,9 +290,9 @@ CALL p2(21844);
length(pout)
21844
CALL p2(21845);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(21846);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
DROP PROCEDURE p2;
DROP PROCEDURE p1;
SET sql_mode='ORACLE,STRICT_TRANS_TABLES';
@@ -316,9 +316,9 @@ CALL p2(21844);
length(pout)
21844
CALL p2(21845);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(21846);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
DROP PROCEDURE p2;
DROP PROCEDURE p1;
SET sql_mode='ORACLE,STRICT_TRANS_TABLES';
@@ -339,13 +339,13 @@ CALL p2(65532);
LENGTH(f1(str,padlen))
65532
CALL p2(65533);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(65534);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(65535);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(65536);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
DROP PROCEDURE p2;
DROP FUNCTION f1;
SET sql_mode='ORACLE,STRICT_TRANS_TABLES';
@@ -366,9 +366,9 @@ CALL p2(21844);
LENGTH(f1(str,padlen))
21844
CALL p2(21845);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(21846);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
DROP PROCEDURE p2;
DROP FUNCTION f1;
SET sql_mode='ORACLE,STRICT_TRANS_TABLES';
@@ -389,9 +389,9 @@ CALL p2(21844);
LENGTH(f1(str,padlen))
21844
CALL p2(21845);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(21846);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
DROP PROCEDURE p2;
DROP FUNCTION f1;
SET sql_mode='ORACLE,STRICT_TRANS_TABLES';
@@ -412,12 +412,12 @@ CALL p2(65532);
LENGTH(f1(str,padlen))
65532
CALL p2(65533);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(65534);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(65535);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
CALL p2(65536);
-ERROR 22001: Data too long for column 'pin' at row 1
+ERROR 22001: Data too long for column 'pin' at row 0
DROP PROCEDURE p2;
DROP FUNCTION f1;
diff --git a/mysql-test/suite/compat/oracle/r/sp-row.result b/mysql-test/suite/compat/oracle/r/sp-row.result
index 3ed11d7f9de..0b23f303030 100644
--- a/mysql-test/suite/compat/oracle/r/sp-row.result
+++ b/mysql-test/suite/compat/oracle/r/sp-row.result
@@ -24,7 +24,7 @@ RETURN a;
END;
$$
SELECT f1(ROW(10,20));
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `f1(ROW(10,20))`
DROP FUNCTION f1;
#
# ROW as an SP parameter
@@ -261,7 +261,7 @@ SELECT f1(a);
END;
$$
CALL p1();
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `a`
DROP PROCEDURE p1;
DROP FUNCTION f1;
CREATE FUNCTION f1(a INT) RETURN INT
@@ -278,7 +278,7 @@ SELECT f1(a);
END;
$$
CALL p1();
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `a`
DROP PROCEDURE p1;
DROP FUNCTION f1;
#
@@ -332,7 +332,7 @@ RETURN rec;
END;
$$
SELECT f1(10);
-ERROR 21000: Operand should contain 1 column(s)
+ERROR HY000: Cannot cast 'row' as 'int' in assignment of `f1(10)`
DROP FUNCTION f1;
#
# Using the entire ROW in SELECT..CREATE
diff --git a/mysql-test/suite/compat/oracle/r/sp.result b/mysql-test/suite/compat/oracle/r/sp.result
index 2e7b21b2d75..2e212530ae5 100644
--- a/mysql-test/suite/compat/oracle/r/sp.result
+++ b/mysql-test/suite/compat/oracle/r/sp.result
@@ -1286,7 +1286,7 @@ CALL p1();
a b
127 200
Warnings:
-Warning 1264 Out of range value for column 'a' at row 1
+Warning 1264 Out of range value for column 'a' at row 0
DROP PROCEDURE p1;
DROP TABLE t1;
#
@@ -1703,8 +1703,8 @@ t2 CREATE TABLE "t2" (
"t2" text DEFAULT NULL,
"t3" mediumtext DEFAULT NULL,
"t4" longtext DEFAULT NULL,
- "enum1" char(1) DEFAULT NULL,
- "set1" char(5) DEFAULT NULL,
+ "enum1" varchar(1) DEFAULT NULL,
+ "set1" varchar(5) DEFAULT NULL,
"blob1" tinyblob DEFAULT NULL,
"blob2" longblob DEFAULT NULL,
"blob3" mediumblob DEFAULT NULL,
@@ -1865,8 +1865,8 @@ t2 CREATE TABLE "t2" (
"t2" text DEFAULT NULL,
"t3" mediumtext DEFAULT NULL,
"t4" longtext DEFAULT NULL,
- "enum1" char(1) DEFAULT NULL,
- "set1" char(5) DEFAULT NULL,
+ "enum1" varchar(1) DEFAULT NULL,
+ "set1" varchar(5) DEFAULT NULL,
"blob1" tinyblob DEFAULT NULL,
"blob2" longblob DEFAULT NULL,
"blob3" mediumblob DEFAULT NULL,
@@ -2370,7 +2370,7 @@ t1 CREATE TABLE "t1" (
"a_flt0" float DEFAULT NULL,
"a_dbl0" double DEFAULT NULL,
"a_bit3" bit(3) DEFAULT NULL,
- "a_enum0" char(1) DEFAULT NULL,
+ "a_enum0" varchar(1) DEFAULT NULL,
"a_varchar10" varchar(10) DEFAULT NULL,
"a_text1" text DEFAULT NULL,
"a_tinytext1" tinytext DEFAULT NULL,
@@ -2388,7 +2388,7 @@ t1 CREATE TABLE "t1" (
"aa_flt0" float DEFAULT NULL,
"aa_dbl0" double DEFAULT NULL,
"aa_bit3" bit(3) DEFAULT NULL,
- "aa_enum0" char(1) DEFAULT NULL,
+ "aa_enum0" varchar(1) DEFAULT NULL,
"aa_varchar10" varchar(10) DEFAULT NULL,
"aa_text1" text DEFAULT NULL,
"aa_tinytext1" tinytext DEFAULT NULL,
diff --git a/mysql-test/suite/compat/oracle/t/sp-cursor.test b/mysql-test/suite/compat/oracle/t/sp-cursor.test
index 03b8b016ee0..d7e2a5dee68 100644
--- a/mysql-test/suite/compat/oracle/t/sp-cursor.test
+++ b/mysql-test/suite/compat/oracle/t/sp-cursor.test
@@ -987,3 +987,58 @@ DELIMITER ;$$
CALL p1();
DROP PROCEDURE p1;
DROP TABLE t1;
+
+
+--echo #
+--echo # Start of 10.8 tests
+--echo #
+
+--echo #
+--echo # MDEV-10654 IN, OUT, INOUT parameters in CREATE FUNCTION
+--echo #
+
+DELIMITER $$;
+DECLARE
+ va INT;
+ CURSOR cur (a IN INT) IS SELECT a FROM dual;
+BEGIN
+ OPEN cur(1);
+ FETCH cur INTO va;
+ CLOSE cur;
+ SELECT va;
+END;
+$$
+DELIMITER ;$$
+
+DELIMITER $$;
+--error ER_NOT_SUPPORTED_YET
+DECLARE
+ va INT;
+ CURSOR cur (a OUT INT) IS SELECT a FROM dual;
+BEGIN
+ OPEN cur(1);
+ FETCH cur INTO va;
+ CLOSE cur;
+ SELECT va;
+END;
+$$
+DELIMITER ;$$
+
+DELIMITER $$;
+--error ER_NOT_SUPPORTED_YET
+DECLARE
+ va INT;
+ CURSOR cur (a INOUT INT) IS SELECT a FROM dual;
+BEGIN
+ OPEN cur(1);
+ FETCH cur INTO va;
+ CLOSE cur;
+ SELECT va;
+END;
+$$
+DELIMITER ;$$
+
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/suite/compat/oracle/t/sp-inout.test b/mysql-test/suite/compat/oracle/t/sp-inout.test
new file mode 100644
index 00000000000..9f9d3bdb26a
--- /dev/null
+++ b/mysql-test/suite/compat/oracle/t/sp-inout.test
@@ -0,0 +1,2497 @@
+--echo #
+--echo # MDEV-10654 IN, OUT, INOUT parameters in CREATE FUNCTION
+--echo #
+
+SET sql_mode=ORACLE;
+
+--echo #
+--echo # CREATE PACKAGE with procedure and function with IN, OUT, INOUT qualifiers
+--echo # And SHOW CREATE PACKAGE
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT);
+ FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+ AS
+ res INT;
+ BEGIN
+ res := func_sub(d, a, b, c);
+ d := d + c + res;
+ END;
+ FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT
+ AS
+ BEGIN
+ c := c + 6;
+ d := 10;
+ RETURN a - b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+SHOW CREATE PACKAGE pkg2;
+SHOW CREATE PACKAGE BODY pkg2;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # CREATE FUNCTION with IN, OUT, INOUT qualifiers
+--echo # SHOW CREATE FUNCTION
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE FUNCTION add_func(a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT
+AS
+ BEGIN
+ c := 100;
+ d := d + 1;
+ RETURN a + b;
+ END;
+$$
+DELIMITER ;$$
+
+SHOW CREATE FUNCTION add_func;
+DROP FUNCTION add_func;
+
+--echo #
+--echo # CREATE PROCEDURE with IN, OUT, INOUT qualifiers
+--echo # SHOW CREATE PROCEDURE
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PROCEDURE add_proc(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+AS
+ BEGIN
+ d := a + b + c + d;
+ END;
+$$
+DELIMITER ;$$
+
+SHOW CREATE PROCEDURE add_proc;
+DROP PROCEDURE add_proc;
+
+--echo #
+--echo # Call function from SELECT query
+--echo # SELECT > FUNCTION(IN)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION add_func2 (a IN INT, b IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION add_func2(a IN INT, b IN INT) RETURN INT
+ AS
+ BEGIN
+ RETURN a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+select pkg2.add_func2(@a, @b);
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call function from SELECT query
+--echo # SELECT > FUNCTION(OUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION add_func3 (a IN INT, b IN INT, c OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION add_func3(a IN INT, b IN INT, c OUT INT) RETURN INT
+ AS
+ BEGIN
+ c := 100;
+ RETURN a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+set @c = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+select pkg2.add_func3(@a, @b, @c);
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call function from SELECT query
+--echo # SELECT > FUNCTION(INOUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION add_func4 (a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION add_func4(a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT
+ AS
+ BEGIN
+ c := 100;
+ d := d + 1;
+ RETURN a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+set @c = 0;
+set @d = 9;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+select pkg2.add_func4(@a, @b, @c, @d);
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call from procedure
+--echo # PROCEDURE(OUT) > FUNCTION(IN)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE add_proc2 (a IN INT, b IN INT, c OUT INT);
+ FUNCTION add_func2 (a IN INT, b IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE add_proc2(a IN INT, b IN INT, c OUT INT)
+ AS
+ BEGIN
+ c := add_func2(a, b);
+ END;
+
+ FUNCTION add_func2(a IN INT, b IN INT) RETURN INT
+ AS
+ BEGIN
+ RETURN a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.add_proc2(@a, @b, @c);
+select @c;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call from procedure
+--echo # PROCEDURE(OUT) > FUNCTION(OUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE add_proc3 (a IN INT, b IN INT, c OUT INT);
+ FUNCTION add_func3 (a IN INT, b IN INT, c OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE add_proc3(a IN INT, b IN INT, c OUT INT)
+ AS
+ res INT;
+ BEGIN
+ res := add_func3(a, b, c);
+ END;
+ FUNCTION add_func3(a IN INT, b IN INT, c OUT INT) RETURN INT
+ AS
+ BEGIN
+ c := 100;
+ RETURN a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.add_proc3(@a, @b, @c);
+select @c;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call from procedure
+--echo # PROCEDURE(OUT) > FUNCTION(INOUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE add_proc4 (a IN INT, b IN INT, c OUT INT);
+ FUNCTION add_func4 (a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE add_proc4(a IN INT, b IN INT, res OUT INT)
+ AS
+ c INT;
+ d INT;
+ BEGIN
+ d := 30;
+ res := add_func4(a, b, c, d);
+ res := c + d;
+ END;
+ FUNCTION add_func4(a IN INT, b IN INT, c OUT INT, d INOUT INT) RETURN INT
+ AS
+ BEGIN
+ c := 100;
+ d := d + 1;
+ RETURN a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+set @res = 0;
+call pkg2.add_proc4(@a, @b, @res);
+select @res;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call from procedure
+--echo # PROCEDURE(OUT) > PROCEDURE(OUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE test_proc1 (a IN INT, b IN INT, c OUT INT);
+ PROCEDURE add_proc (a IN INT, b IN INT, c OUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE test_proc1(a IN INT, b IN INT, c OUT INT)
+ AS
+ BEGIN
+ call pkg2.add_proc(a, b, c);
+ END;
+ PROCEDURE add_proc(a IN INT, b IN INT, c OUT INT)
+ AS
+ BEGIN
+ c := a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.test_proc1(@a, @b, @c);
+select @c;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Argument's order change
+--echo # PROCEDURE(a IN, b IN, c OUT) > FUNCTION(b IN, a IN, c OUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c OUT INT);
+ FUNCTION func_sub(b IN INT, a IN INT, c OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c OUT INT)
+ AS
+ res INT;
+ BEGIN
+ res := func_sub(b, a, c);
+ END;
+ FUNCTION func_sub(b IN INT, a IN INT, c OUT INT) RETURN INT
+ AS
+ res INT;
+ BEGIN
+ c := a - b;
+ res := a;
+ RETURN res;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.proc_main(@a, @b, @c);
+select @c;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Argument's order change
+--echo # PROCEDURE(a IN, b IN, c OUT) > FUNCTION(c OUT, b IN, a IN)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c OUT INT);
+ FUNCTION func_sub(c OUT INT, b IN INT, a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c OUT INT)
+ AS
+ res INT;
+ BEGIN
+ res := func_sub(c, b, a);
+ END;
+ FUNCTION func_sub(c OUT INT, b IN INT, a IN INT) RETURN INT
+ AS
+ res INT;
+ BEGIN
+ c := a - b;
+ res := a;
+ RETURN res;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+set @c = 0;
+call pkg2.proc_main(@a, @b, @c);
+select @c;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Argument's order change
+--echo # PROCEDURE(a IN, b IN, c INOUT, d OUT) > FUNCTION(d OUT, a IN, b IN, c INOUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT);
+ FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+ AS
+ res INT;
+ BEGIN
+ res := func_sub(d, a, b, c);
+ d := d + c + res;
+ END;
+ FUNCTION func_sub(d OUT INT, a IN INT, b IN INT, c INOUT INT) RETURN INT
+ AS
+ BEGIN
+ c := c + 6;
+ d := 10;
+ RETURN a - b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 15;
+set @b = 5;
+set @c = 4;
+set @d= 0;
+call pkg2.proc_main(@a, @b, @c, @d);
+select @d;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Argument's order change
+--echo # PROCEDURE(a IN INT, b IN INT, c INOUT INT, d OUT INT) > FUNCTION1(c INOUT INT, b IN INT) > FUNCTION2(d OUT INT, a IN INT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT);
+ FUNCTION func_sub1(c INOUT INT, b IN INT) RETURN INT;
+ FUNCTION func_sub2(d OUT INT, a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b IN INT, c INOUT INT, d OUT INT)
+ AS
+ res1 INT;
+ res2 INT;
+ BEGIN
+ res1 := func_sub1(c, b);
+ res2 := func_sub2(d, a);
+ d := d + c;
+ END;
+ FUNCTION func_sub1(c INOUT INT, b IN INT) RETURN INT
+ AS
+ BEGIN
+ c := c + b;
+ RETURN 0;
+ END;
+ FUNCTION func_sub2(d OUT INT, a IN INT) RETURN INT
+ AS
+ BEGIN
+ d := 5 + a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 15;
+set @b = 6;
+set @c = 4;
+set @d= 0;
+call pkg2.proc_main(@a, @b, @c, @d);
+select @d;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Argument's order change
+--echo # FUNCTION1(a IN, b IN) > FUNCTION2(b IN, c OUT, a IN)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT, b IN INT) RETURN INT;
+ FUNCTION func_sub(b IN INT, c OUT INT, a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT, b IN INT) RETURN INT
+ AS
+ c INT;
+ res INT;
+ BEGIN
+ res := func_sub(b, c, a);
+ RETURN res + c;
+ END;
+ FUNCTION func_sub(b IN INT, c OUT INT, a IN INT) RETURN INT
+ AS
+ BEGIN
+ c := 100;
+ RETURN a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+select pkg2.func_main(@a, @b);
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call procedure inside function
+--echo # FUNCTION1(a IN, b IN) > PROCEDURE(a IN, b IN, c OUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(b IN INT, a IN INT) RETURN INT;
+ PROCEDURE proc_sub(a IN INT, b IN INT, c OUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(b IN INT, a IN INT) RETURN INT
+ AS
+ c INT;
+ BEGIN
+ call proc_sub(a, b, c);
+ RETURN c;
+ END;
+ PROCEDURE proc_sub(a IN INT, b IN INT, c OUT INT)
+ AS
+ BEGIN
+ c := a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+select pkg2.func_main(@a, @b);
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call procedure inside function
+--echo # FUNCTION1(a IN, b IN) > PROCEDURE(a IN, b INOUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(b IN INT, a IN INT) RETURN INT;
+ PROCEDURE proc_sub(a IN INT, b INOUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(b IN INT, a IN INT) RETURN INT
+ AS
+ BEGIN
+ call proc_sub(a, b);
+ RETURN b;
+ END;
+ PROCEDURE proc_sub(a IN INT, b INOUT INT)
+ AS
+ BEGIN
+ b := a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+select pkg2.func_main(@a, @b);
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call procedure inside function
+--echo # FUNCTION1(a IN, b IN, c OUT) > PROCEDURE(a IN, b IN, c OUT)
+--echo #
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(b IN INT, a IN INT, c OUT INT) RETURN INT;
+ PROCEDURE proc_sub(a IN INT, b IN INT, c OUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(b IN INT, a IN INT, c OUT INT) RETURN INT
+ AS
+ res INT;
+ BEGIN
+ call proc_sub(a, b, c);
+ RETURN 0;
+ END;
+ PROCEDURE proc_sub(a IN INT, b IN INT, c OUT INT)
+ AS
+ BEGIN
+ c := a + b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+set @b = 3;
+set @c = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+select pkg2.func_main(@a, @b, @c);
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call function from UPDATE query
+--echo # UPDATE <table> SET <column> = FUNCTION(a IN)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func(a IN INT) RETURN INT
+ AS
+ BEGIN
+ RETURN a * 10;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 5;
+UPDATE Persons SET Age = pkg2.func(@a) WHERE ID = 1;
+SELECT * FROM Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call function from UPDATE query
+--echo # UPDATE <table> SET <column> = FUNCTION(a OUT)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func(a OUT INT) RETURN INT
+ AS
+ BEGIN
+ a := 5;
+ RETURN 80;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+UPDATE Persons SET Age = pkg2.func(@a) WHERE ID = 1;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call function from INSERT query
+--echo # INSERT INTO <table> SELECT <val1>, <val2>, FUNCTION(a IN)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func(a IN INT) RETURN INT
+ AS
+ BEGIN
+ RETURN a * 10;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 4;
+INSERT INTO Persons SELECT 4, 'DDD', PKG2.func(@a);
+SELECT * FROM Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call function from INSERT query
+--echo # INSERT INTO <table> SELECT <val1>, <val2>, FUNCTION(a OUT)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func(a OUT INT) RETURN INT
+ AS
+ BEGIN
+ a := 45;
+ RETURN 40;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+set @a = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+INSERT INTO Persons SELECT 5, 'EEE', PKG2.func(@a);
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call function from DELETE query
+--echo # DELETE FROM <table> WHERE <column> = FUNCTION(a IN)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func(a IN INT) RETURN INT
+ AS
+ BEGIN
+ RETURN a;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+set @a = 4;
+DELETE FROM Persons WHERE ID = PKG2.func(@a);
+SELECT * FROM Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Call function from DELETE query
+--echo # DELETE FROM <table> WHERE <column> = FUNCTION(a OUT)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func(a OUT INT) RETURN INT
+ AS
+ BEGIN
+ a := 40;
+ RETURN 4;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+set @a = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+DELETE FROM Persons WHERE ID = PKG2.func(@a);
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # SELECT query inside function
+--echo # FUNCTION(a IN) > SELECT … FROM <table>
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT
+ AS
+ c INT;
+ BEGIN
+ SELECT AGE INTO c FROM Persons WHERE ID = a;
+ RETURN c;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 3;
+select pkg2.func_main(@a);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # SELECT query inside function
+--echo # FUNCTION(a OUT) > SELECT … FROM <table>
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a OUT INT) RETURN INT
+ AS
+ BEGIN
+ SELECT AGE INTO a FROM Persons WHERE ID = 3;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+select pkg2.func_main(@a);
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # SELECT query inside function
+--echo # FUNCTION(a INOUT) > SELECT … FROM <table>
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a INOUT INT) RETURN INT
+ AS
+ BEGIN
+ SELECT AGE INTO a FROM Persons WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 1;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+select pkg2.func_main(@a);
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # SELECT query inside function
+--echo # FUNCTION(a IN) > FUNCTION(a IN, b OUT) > SELECT … FROM <table>
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT;
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT
+ AS
+ b INT;
+ res INT;
+ BEGIN
+ res := func_sub(a, b);
+ RETURN b;
+ END;
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+ AS
+ BEGIN
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 2;
+select pkg2.func_main(@a);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # UPDATE query inside function
+--echo # FUNCTION(a IN) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT
+ AS
+ c INT;
+ BEGIN
+ UPDATE Persons SET AGE = 50 WHERE ID = a;
+
+ SELECT AGE INTO c FROM Persons WHERE ID = a;
+ RETURN c;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 5;
+select pkg2.func_main(@a);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # UPDATE query inside function
+--echo # FUNCTION(a IN, b OUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT, b OUT INT) RETURN INT
+ AS
+ BEGIN
+ UPDATE Persons SET AGE = 60 WHERE ID = a;
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 5;
+set @b = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+select pkg2.func_main(@a, @b);
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # UPDATE query inside function
+--echo # FUNCTION(a IN, b INOUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT, b INOUT INT) RETURN INT
+ AS
+ BEGIN
+ UPDATE Persons SET AGE = 60 WHERE ID = a;
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+set @a = 5;
+set @b = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+select pkg2.func_main(@a, @b);
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # UPDATE query inside function
+--echo # FUNCTION(a IN) > FUNCTION(a IN, b OUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 80);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT;
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT
+ AS
+ b INT;
+ res INT;
+ BEGIN
+ res := func_sub(a, b);
+ RETURN b;
+ END;
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+ AS
+ BEGIN
+ UPDATE Persons SET AGE = 10 WHERE ID = a;
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 1;
+select pkg2.func_main(@a);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # INSERT query inside function
+--echo # FUNCTION(a IN) > INSERT INTO <table> VALUES …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 50);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT
+ AS
+ b INT;
+ BEGIN
+ INSERT INTO Persons VALUE (a, 'FFF', 60);
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 6;
+select pkg2.func_main(@a);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # INSERT query inside function
+--echo # FUNCTION(a IN, b OUT) > INSERT INTO <table> VALUES …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 50);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT, b OUT INT) RETURN INT
+ AS
+ BEGIN
+ INSERT INTO Persons VALUE (a, 'FFF', 60);
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 6;
+set @b = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+select pkg2.func_main(@a, @b);
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # INSERT query inside function
+--echo # FUNCTION(a IN, b INOUT) > INSERT INTO <table> VALUES …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT, b INOUT INT) RETURN INT
+ AS
+ BEGIN
+ INSERT INTO Persons VALUE (a, 'FFF', 60);
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 6;
+set @b = 0;
+--error ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+select pkg2.func_main(@a, @b);
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # INSERT query inside function
+--echo # FUNCTION(a IN) > FUNCTION(a IN, b OUT) > INSERT INTO <table> VALUES …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'EEE', 40);
+
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT;
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func_main(a IN INT) RETURN INT
+ AS
+ b INT;
+ res INT;
+ BEGIN
+ res := func_sub(a, b);
+ RETURN b;
+ END;
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+ AS
+ BEGIN
+ INSERT INTO Persons VALUE (a, 'FFF', 60);
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 6;
+select pkg2.func_main(@a);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(IN) > SELECT FROM <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT);
+ FUNCTION func_sub(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT)
+ AS
+ BEGIN
+ b := func_sub(a);
+ END;
+ FUNCTION func_sub(a IN INT) RETURN INT
+ AS
+ b INT;
+ BEGIN
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN b;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 2;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select @b;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(OUT) > SELECT FROM <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT);
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT)
+ AS
+ res INT;
+ BEGIN
+ res := func_sub(a, b);
+ END;
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+ AS
+ BEGIN
+ SELECT AGE INTO b FROM Persons WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 1;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select @b;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(INOUT) > SELECT FROM <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT);
+ FUNCTION func_sub(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT)
+ AS
+ c INT;
+ res INT;
+ BEGIN
+ c := 5;
+ res := func_sub(a, c);
+ b := c;
+ END;
+ FUNCTION func_sub(a IN INT, c INOUT INT) RETURN INT
+ AS
+ res INT;
+ BEGIN
+ SELECT AGE INTO res FROM Persons WHERE ID = a;
+ c := c * 100;
+ RETURN res;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 2;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select @b;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(IN) > INSESRT INTO <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT);
+ FUNCTION func_sub(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT)
+ AS
+ BEGIN
+ b := func_sub(a);
+ END;
+ FUNCTION func_sub(a IN INT) RETURN INT
+ AS
+ BEGIN
+ INSERT INTO Persons VALUE (a, 'FFF', 50);
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 5;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(OUT) > INSESRT INTO <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT);
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT)
+ AS
+ res INT;
+ BEGIN
+ res := func_sub(a, b);
+ END;
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+ AS
+ BEGIN
+ INSERT INTO Persons VALUE (a, 'GGG', 60);
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 6;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(INOUT) > INSESRT INTO <table> …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT);
+ FUNCTION func_sub(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT)
+ AS
+ c INT;
+ res INT;
+ BEGIN
+ c := 5;
+ res := func_sub(a, c);
+ b := c;
+ END;
+ FUNCTION func_sub(a IN INT, c INOUT INT) RETURN INT
+ AS
+ res INT;
+ BEGIN
+ INSERT INTO Persons VALUE (a, 'HHH', 70);
+ c := c * 100;
+ RETURN res;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 7;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(IN) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 50);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT);
+ FUNCTION func_sub(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT)
+ AS
+ BEGIN
+ b := func_sub(a);
+ END;
+ FUNCTION func_sub(a IN INT) RETURN INT
+ AS
+ BEGIN
+ UPDATE Persons SET AGE = 100 WHERE ID = a;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 5;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 100);
+INSERT INTO Persons VALUES (6, 'GGG', 60);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT);
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT)
+ AS
+ res INT;
+ BEGIN
+ res := func_sub(a, b);
+ END;
+ FUNCTION func_sub(a IN INT, b OUT INT) RETURN INT
+ AS
+ BEGIN
+ UPDATE Persons SET AGE = 100 WHERE ID = a;
+ b := 1;
+ RETURN 0;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 6;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # PROCEDURE > FUNCTION > SQL query
+--echo # PROCEDURE(OUT) > FUNCTION(INOUT) > UPDATE <table> SET …
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+INSERT INTO Persons VALUES (4, 'DDD', 40);
+INSERT INTO Persons VALUES (5, 'FFF', 100);
+INSERT INTO Persons VALUES (6, 'GGG', 100);
+INSERT INTO Persons VALUES (7, 'HHH', 70);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT);
+ FUNCTION func_sub(a IN INT, b INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc_main(a IN INT, b OUT INT)
+ AS
+ c INT;
+ res INT;
+ BEGIN
+ c := 5;
+ res := func_sub(a, c);
+ b := c;
+ END;
+ FUNCTION func_sub(a IN INT, c INOUT INT) RETURN INT
+ AS
+ res INT;
+ BEGIN
+ UPDATE Persons SET AGE = 100 WHERE ID = a;
+ c := c * 100;
+ RETURN res;
+ END;
+END;
+$$
+DELIMITER ;$$
+
+select * from Persons;
+set @a = 7;
+set @b = 0;
+call pkg2.proc_main(@a, @b);
+select * from Persons;
+DROP TABLE Persons;
+DROP PACKAGE pkg2;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 20 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(IN) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func(a IN INT) RETURN INT
+ AS
+ BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ RETURN 0;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+DECLARE
+ a INT;
+ res INT;
+BEGIN
+ a := 10;
+ res := 0;
+ res := pkg2.func(a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 30 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(OUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 40);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func(a OUT INT) RETURN INT
+ AS
+ BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ a := 100;
+ RETURN 0;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+DECLARE
+ a INT;
+ res INT;
+BEGIN
+ a := 10;
+ res := 0;
+ res := pkg2.func(a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > FUNCTION(INOUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 50);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ FUNCTION func(a INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ FUNCTION func(a INOUT INT) RETURN INT
+ AS
+ BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ a := 100;
+ RETURN 0;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+DECLARE
+ a INT;
+ res INT;
+BEGIN
+ a := 10;
+ res := 0;
+ res := pkg2.func(a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 60 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(IN) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc(a IN INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc(a IN INT)
+ AS
+ BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ call pkg2.proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 30 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc(a OUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc(a OUT INT)
+ AS
+ BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ call pkg2.proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(INOUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc(a INOUT INT);
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc(a INOUT INT)
+ AS
+ BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ a := 100;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ set @a = 2;
+ call pkg2.proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 50 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(IN) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc(a OUT INT);
+ FUNCTION func(a IN INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc(a OUT INT)
+ AS
+ res INT;
+ BEGIN
+ a := 100;
+ res := func(a);
+ END;
+ FUNCTION func(a IN INT) RETURN INT
+ AS
+ BEGIN
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ RETURN 0;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ call pkg2.proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 60 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc(a OUT INT);
+ FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc(a OUT INT)
+ AS
+ res INT;
+ BEGIN
+ a := 100;
+ res := func(a);
+ END;
+ FUNCTION func(a OUT INT) RETURN INT
+ AS
+ BEGIN
+ a := 200;
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ RETURN 0;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ call pkg2.proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 80 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(INOUT) > UPDATE TABLE2
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc(a OUT INT);
+ FUNCTION func(a INOUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc(a OUT INT)
+ AS
+ res INT;
+ BEGIN
+ a := 100;
+ res := func(a);
+ END;
+ FUNCTION func(a INOUT INT) RETURN INT
+ AS
+ BEGIN
+ a := 200;
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ RETURN 0;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ call pkg2.proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 90 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+--echo #
+--echo # Trigger
+--echo # TRIGGER AFTER UPDATE ON TABLE1 > PROCEDURE(OUT) > FUNCTION(OUT) > UPDATE TABLE2 with OUT argument (to check if OUT is returning by reference)
+--echo #
+
+CREATE TABLE Persons (
+ ID int,
+ Name varchar(255),
+ Age int
+);
+INSERT INTO Persons VALUES (1, 'AAA', 10);
+INSERT INTO Persons VALUES (2, 'BBB', 20);
+INSERT INTO Persons VALUES (3, 'CCC', 30);
+
+CREATE TABLE PersonsLog (
+ UpdateCount int
+);
+INSERT INTO PersonsLog VALUES (0);
+
+DELIMITER $$;
+CREATE OR REPLACE PACKAGE pkg2
+AS
+ PROCEDURE proc(a OUT INT);
+ FUNCTION func(a OUT INT) RETURN INT;
+END;
+$$
+CREATE OR REPLACE PACKAGE BODY pkg2
+AS
+ PROCEDURE proc(a OUT INT)
+ AS
+ res INT;
+ BEGIN
+ res := func(a);
+ UPDATE PersonsLog SET UpdateCount = a;
+ END;
+ FUNCTION func(a OUT INT) RETURN INT
+ AS
+ BEGIN
+ a := 111;
+ UPDATE PersonsLog SET UpdateCount = UpdateCount+1;
+ RETURN 0;
+ END;
+END;
+$$
+CREATE OR REPLACE TRIGGER my_trigger
+AFTER UPDATE ON Persons
+FOR EACH ROW
+BEGIN
+ call pkg2.proc(@a);
+END;
+$$
+DELIMITER ;$$
+
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+UPDATE Persons SET Age = 80 WHERE ID = 1;
+SELECT * FROM Persons;
+SELECT * FROM PersonsLog;
+DROP TRIGGER my_trigger;
+DROP PACKAGE pkg2;
+DROP TABLE Persons;
+DROP TABLE PersonsLog;
+
+
+--echo #
+--echo # Package BODY variables as OUT parameters
+--echo #
+
+DELIMITER $$;
+CREATE PACKAGE pkg1 AS
+ FUNCTION f1(b IN OUT INT) RETURN INT;
+ FUNCTION show_private_variables() RETURN TEXT;
+END;
+$$
+CREATE PACKAGE BODY pkg1 AS
+ pa INT:= 0;
+ pb INT:= 10;
+ FUNCTION f1(b IN OUT INT) RETURN INT AS
+ BEGIN
+ b:= b + 100;
+ RETURN 500+b-100;
+ END;
+
+ FUNCTION show_private_variables() RETURN TEXT AS
+ BEGIN
+ RETURN 'Private variables: pa=' || pa || ' pb=' || pb;
+ END;
+BEGIN
+ SET pa=f1(pb);
+END;
+$$
+DELIMITER ;$$
+SELECT pkg1.show_private_variables();
+DROP PACKAGE pkg1;
diff --git a/mysql-test/suite/compat/oracle/t/sp-row.test b/mysql-test/suite/compat/oracle/t/sp-row.test
index ebd0a2a2137..c7658c76838 100644
--- a/mysql-test/suite/compat/oracle/t/sp-row.test
+++ b/mysql-test/suite/compat/oracle/t/sp-row.test
@@ -35,7 +35,7 @@ BEGIN
END;
$$
DELIMITER ;$$
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
SELECT f1(ROW(10,20));
DROP FUNCTION f1;
@@ -334,7 +334,7 @@ BEGIN
END;
$$
DELIMITER ;$$
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
CALL p1();
DROP PROCEDURE p1;
DROP FUNCTION f1;
@@ -355,7 +355,7 @@ BEGIN
END;
$$
DELIMITER ;$$
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
CALL p1();
DROP PROCEDURE p1;
DROP FUNCTION f1;
@@ -427,7 +427,7 @@ BEGIN
END;
$$
DELIMITER ;$$
---error ER_OPERAND_COLUMNS
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
SELECT f1(10);
DROP FUNCTION f1;
diff --git a/mysql-test/suite/encryption/r/bulk_insert.result b/mysql-test/suite/encryption/r/bulk_insert.result
new file mode 100644
index 00000000000..840cb0cd38b
--- /dev/null
+++ b/mysql-test/suite/encryption/r/bulk_insert.result
@@ -0,0 +1,7 @@
+SET UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0;
+CREATE TABLE t1 (
+`id` int(10) unsigned NOT NULL,
+UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB;
+INSERT INTO t1 SELECT seq FROM seq_1_to_65536;
+DROP TABLE t1;
diff --git a/mysql-test/suite/encryption/r/corrupted_during_recovery.result b/mysql-test/suite/encryption/r/corrupted_during_recovery.result
index 356dce64f8d..2b29bf260e1 100644
--- a/mysql-test/suite/encryption/r/corrupted_during_recovery.result
+++ b/mysql-test/suite/encryption/r/corrupted_during_recovery.result
@@ -9,7 +9,7 @@ INSERT INTO t2 VALUES(2);
SELECT * FROM t1;
ERROR 42000: Unknown storage engine 'InnoDB'
SELECT * FROM t1;
-ERROR 42S02: Table 'test.t1' doesn't exist in engine
+ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate.
SELECT * FROM t2;
a
2
diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change.result b/mysql-test/suite/encryption/r/innodb-bad-key-change.result
index 1ca9d784d57..e2034f14e31 100644
--- a/mysql-test/suite/encryption/r/innodb-bad-key-change.result
+++ b/mysql-test/suite/encryption/r/innodb-bad-key-change.result
@@ -1,10 +1,10 @@
call mtr.add_suppression("Plugin 'file_key_management' init function returned error");
call mtr.add_suppression("Plugin 'file_key_management' registration.*failed");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t[12]` (has an unreadable root page|is corrupted)");
+call mtr.add_suppression("InnoDB: Table `test`\\.`t[12]` has an unreadable root page");
+call mtr.add_suppression("Table .*t[12].* is corrupted");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[12]\\.ibd' cannot be decrypted; key_version=1");
call mtr.add_suppression("failed to read \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=3\\] in file .*test.t1.ibd looks corrupted; key_version=1");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t[12]` is corrupted");
call mtr.add_suppression("File '.*mysql-test.std_data.keysbad3\\.txt' not found");
call mtr.add_suppression("\\[ERROR\\] InnoDB: Cannot decrypt \\[page id: space=");
# Start server with keys2.txt
@@ -46,29 +46,29 @@ INSERT INTO t2 VALUES ('foobar',1,2);
SELECT * FROM t2;
ERROR 42S02: Table 'test.t2' doesn't exist in engine
SELECT * FROM t2 where id = 1;
-ERROR 42S02: Table 'test.t2' doesn't exist in engine
+ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate.
SELECT * FROM t2 where b = 1;
-ERROR 42S02: Table 'test.t2' doesn't exist in engine
+ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate.
INSERT INTO t2 VALUES ('tmp',3,3);
-ERROR 42S02: Table 'test.t2' doesn't exist in engine
+ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate.
DELETE FROM t2 where b = 3;
-ERROR 42S02: Table 'test.t2' doesn't exist in engine
+ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate.
DELETE FROM t2 where id = 3;
-ERROR 42S02: Table 'test.t2' doesn't exist in engine
+ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate.
UPDATE t2 set b = b +1;
-ERROR 42S02: Table 'test.t2' doesn't exist in engine
+ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate.
OPTIMIZE TABLE t2;
Table Op Msg_type Msg_text
-test.t2 optimize Error Table 'test.t2' doesn't exist in engine
-test.t2 optimize status Operation failed
+test.t2 optimize Error Table test/t2 is corrupted. Please drop the table and recreate.
+test.t2 optimize error Corrupt
ALTER TABLE t2 ADD COLUMN d INT;
-ERROR 42S02: Table 'test.t2' doesn't exist in engine
+ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate.
ANALYZE TABLE t2;
Table Op Msg_type Msg_text
-test.t2 analyze Error Table 'test.t2' doesn't exist in engine
-test.t2 analyze status Operation failed
+test.t2 analyze Error Table test/t2 is corrupted. Please drop the table and recreate.
+test.t2 analyze error Corrupt
TRUNCATE TABLE t2;
-ERROR 42S02: Table 'test.t2' doesn't exist in engine
+ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate.
DROP TABLE t2;
# Start server with keys2.txt
diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change2.result b/mysql-test/suite/encryption/r/innodb-bad-key-change2.result
index b4552651ae6..3cda2bd537b 100644
--- a/mysql-test/suite/encryption/r/innodb-bad-key-change2.result
+++ b/mysql-test/suite/encryption/r/innodb-bad-key-change2.result
@@ -1,9 +1,9 @@
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page|is corrupted|does not exist.*is trying to rename)");
+call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page|does not exist.*is trying to rename)");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t1(new)?\\.ibd' cannot be decrypted; key_version=1");
call mtr.add_suppression("InnoDB: Recovery failed to read page");
call mtr.add_suppression("Couldn't load plugins from 'file_key_management");
call mtr.add_suppression("InnoDB: Tablespace for table \`test\`.\`t1\` is set as discarded\\.");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` is corrupted");
+call mtr.add_suppression("Table .*t1.* is corrupted");
call mtr.add_suppression("InnoDB: Cannot delete tablespace .* because it is not found in the tablespace memory cache");
call mtr.add_suppression("InnoDB: ALTER TABLE `test`\\.`t1` DISCARD TABLESPACE failed to find tablespace");
call mtr.add_suppression("\\[ERROR\\] InnoDB: Cannot decrypt \\[page id: space=");
@@ -19,20 +19,20 @@ SHOW WARNINGS;
Level Code Message
Error 1932 Table 'test.t1' doesn't exist in engine
ALTER TABLE t1 ENGINE=InnoDB;
-ERROR 42S02: Table 'test.t1' doesn't exist in engine
+ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate.
SHOW WARNINGS;
Level Code Message
-Error 1932 Table 'test.t1' doesn't exist in engine
+Error 1877 Table test/t1 is corrupted. Please drop the table and recreate.
OPTIMIZE TABLE t1;
Table Op Msg_type Msg_text
-test.t1 optimize Error Table 'test.t1' doesn't exist in engine
-test.t1 optimize status Operation failed
+test.t1 optimize Error Table test/t1 is corrupted. Please drop the table and recreate.
+test.t1 optimize error Corrupt
SHOW WARNINGS;
Level Code Message
CHECK TABLE t1;
Table Op Msg_type Msg_text
-test.t1 check Error Table 'test.t1' doesn't exist in engine
-test.t1 check status Operation failed
+test.t1 check Error Table test/t1 is corrupted. Please drop the table and recreate.
+test.t1 check error Corrupt
SHOW WARNINGS;
Level Code Message
# restart: --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
@@ -64,5 +64,5 @@ t1 CREATE TABLE `t1` (
RENAME TABLE t1 TO t1new;
ERROR HY000: Error on rename of './test/t1' to './test/t1new' (errno: 155 "The table does not exist in the storage engine")
ALTER TABLE t1 RENAME TO t1new;
-ERROR 42S02: Table 'test.t1' doesn't exist in engine
+ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate.
DROP TABLE t1;
diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change4.result b/mysql-test/suite/encryption/r/innodb-bad-key-change4.result
index 5a3e275dda9..e808d50b544 100644
--- a/mysql-test/suite/encryption/r/innodb-bad-key-change4.result
+++ b/mysql-test/suite/encryption/r/innodb-bad-key-change4.result
@@ -1,8 +1,8 @@
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page|is corrupted)");
+call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page)");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t1\\.ibd' cannot be decrypted; key_version=1");
call mtr.add_suppression("InnoDB: Recovery failed to read page");
call mtr.add_suppression("Couldn't load plugins from 'file_key_management");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` is corrupted");
+call mtr.add_suppression("Table .*t1.* is corrupted");
call mtr.add_suppression("\\[ERROR\\] InnoDB: Cannot decrypt \\[page id: space=");
# restart: --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
SET GLOBAL innodb_file_per_table = ON;
@@ -18,8 +18,8 @@ SHOW WARNINGS;
Level Code Message
CHECK TABLE t1;
Table Op Msg_type Msg_text
-test.t1 check Error Table 'test.t1' doesn't exist in engine
-test.t1 check status Operation failed
+test.t1 check Error Table test/t1 is corrupted. Please drop the table and recreate.
+test.t1 check error Corrupt
SHOW WARNINGS;
Level Code Message
# restart: --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
diff --git a/mysql-test/suite/encryption/r/innodb-missing-key.result b/mysql-test/suite/encryption/r/innodb-missing-key.result
index 6bacbfe78b2..d5c1e079e96 100644
--- a/mysql-test/suite/encryption/r/innodb-missing-key.result
+++ b/mysql-test/suite/encryption/r/innodb-missing-key.result
@@ -1,8 +1,8 @@
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page|is corrupted)");
+call mtr.add_suppression("InnoDB: Table `test`\\.`t1` has an unreadable root page");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\.");
call mtr.add_suppression("InnoDB: Recovery failed to read page");
call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file .*test.t[12].ibd looks corrupted; key_version=1");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` is corrupted");
+call mtr.add_suppression("Table .*t1.* is corrupted");
# Start server with keys2.txt
# restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
CREATE TABLE t1(a int not null primary key auto_increment, b varchar(128)) engine=innodb ENCRYPTED=YES ENCRYPTION_KEY_ID=19;
@@ -40,9 +40,9 @@ COUNT(1)
SELECT COUNT(1) FROM t2,t1 where t2.a = t1.a;
ERROR 42S02: Table 'test.t1' doesn't exist in engine
SELECT COUNT(1) FROM t1 where b = 'ab';
-ERROR 42S02: Table 'test.t1' doesn't exist in engine
+ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate.
SELECT COUNT(1) FROM t1;
-ERROR 42S02: Table 'test.t1' doesn't exist in engine
+ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate.
# Start server with keys2.txt
# restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
diff --git a/mysql-test/suite/encryption/r/innodb-redo-nokeys.result b/mysql-test/suite/encryption/r/innodb-redo-nokeys.result
index ba8f5b2fe85..859a73db056 100644
--- a/mysql-test/suite/encryption/r/innodb-redo-nokeys.result
+++ b/mysql-test/suite/encryption/r/innodb-redo-nokeys.result
@@ -8,6 +8,8 @@ call mtr.add_suppression("InnoDB: (Unable to apply log to|Discarding log for) co
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9][0-9]*, page number=0\\] of corrupted file '.*test.t[1-5]\\.ibd'");
call mtr.add_suppression("InnoDB: Failed to read page .* from file '.*'");
call mtr.add_suppression("InnoDB: OPT_PAGE_CHECKSUM mismatch");
+call mtr.add_suppression("InnoDB: Missing FILE_CHECKPOINT");
+call mtr.add_suppression("InnoDB: Log scan aborted at LSN");
call mtr.add_suppression("InnoDB: Set innodb_force_recovery=1 to ignore corruption");
# restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
SET GLOBAL innodb_file_per_table = ON;
diff --git a/mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result b/mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result
index 8d1eb447b03..3c3e4831d8a 100644
--- a/mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result
+++ b/mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result
@@ -12,16 +12,15 @@ WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
FOUND 1 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and we did not find a valid checkpoint/ in mysqld.1.err
-FOUND 2 /Plugin 'InnoDB' registration as a STORAGE ENGINE failed/ in mysqld.1.err
# redo log from before MariaDB 10.2.2, with corrupted log block
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and it appears corrupted/ in mysqld.1.err
+FOUND 1 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and we did not find a valid checkpoint/ in mysqld.1.err
# empty redo log from before MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
@@ -29,53 +28,55 @@ COUNT(*)
1
FOUND 1 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Corrupted multi-file redo log from before MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
0
-FOUND 2 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and it appears corrupted/ in mysqld.1.err
-# Empty multi-file redo log from before MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+FOUND 1 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and it appears corrupted/ in mysqld.1.err
+# Empty multi-file redo log (wrong offset) from before MariaDB 10.2.2
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
-1
-FOUND 2 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+0
+FOUND 3 /Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and we did not find a valid checkpoint\./ in mysqld.1.err
# Multi-file redo log with size mismatch from after MariaDB 10.2.2
# Corrupted multi-file redo log from after MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
0
-FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!/ in mysqld.1.err
-FOUND 1 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+FOUND 3 /Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and we did not find a valid checkpoint\./ in mysqld.1.err
+FOUND 1 /InnoDB: No valid checkpoint was found; the log was created with BogoDB 1\.2\.3\.4\./ in mysqld.1.err
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
0
-FOUND 2 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
+FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 2097152 bytes than other log files 1048576 bytes!/ in mysqld.1.err
+FOUND 2 /InnoDB: No valid checkpoint was found; the log was created with BogoDB 1\.2\.3\.4\./ in mysqld.1.err
# Empty multi-file redo log from after MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
-1
-FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+0
+FOUND 3 /InnoDB: No valid checkpoint was found; the log was created with BogoDB 1\.2\.3\.4\./ in mysqld.1.err
# redo log from "after" MariaDB 10.2.2, but with invalid header checksum
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: Invalid redo log header checksum/ in mysqld.1.err
+FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 2097152 bytes than other log files 4194304 bytes!/ in mysqld.1.err
+FOUND 1 /InnoDB: Invalid log header checksum/ in mysqld.1.err
# distant future redo log format, with valid header checksum
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES
@@ -89,14 +90,14 @@ SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: No valid checkpoint found .corrupted redo log/ in mysqld.1.err
+FOUND 1 /InnoDB: No valid checkpoint was found; the log was created with malicious intentions, or perhaps\./ in mysqld.1.err
# valid header, valid checkpoint 1, all-zero (invalid) checkpoint 2, invalid block checksum
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: Invalid log block checksum. block: 2372 checkpoint no: 1 expected: 3362026715 found: 144444122/ in mysqld.1.err
+FOUND 2 /InnoDB: Invalid log header checksum/ in mysqld.1.err
FOUND 1 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with malicious intentions, or perhaps, and it appears corrupted\./ in mysqld.1.err
# same, but with current-version header
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
@@ -104,7 +105,7 @@ SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 2 /InnoDB: Invalid log block checksum. block: 2372 checkpoint no: 1 expected: 3362026715 found: 144444122/ in mysqld.1.err
+FOUND 3 /InnoDB: Invalid log header checksum/ in mysqld.1.err
# --innodb-force-recovery=6 (skip the entire redo log)
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=6
SELECT * FROM INFORMATION_SCHEMA.ENGINES
@@ -112,7 +113,7 @@ WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
InnoDB YES Supports transactions, row-level locking, foreign keys and encryption for tables YES YES YES
-FOUND 1 /\[Note\] InnoDB: .* started; log sequence number 0/ in mysqld.1.err
+FOUND 1 /\[Note\] InnoDB: log sequence number 0.*; transaction id 0/ in mysqld.1.err
# valid header, valid checkpoint 1, all-zero (invalid) checkpoint 2, invalid block number
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT * FROM INFORMATION_SCHEMA.ENGINES
@@ -141,8 +142,9 @@ SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: Invalid log block checksum. block: 2372 checkpoint no: 1 expected: 2454333373 found: 150151/ in mysqld.1.err
-FOUND 3 /\[ERROR\] InnoDB: Upgrade after a crash is not supported\. The redo log was created with MariaDB 10\.3\.1, and it appears corrupted\./ in mysqld.1.err
+NOT FOUND /InnoDB: Invalid log header checksum
+--source include/search_pattern_in_file.inc
+let SEARCH_PATTERN=\[ERROR\] InnoDB: Upgrade after a crash is not supported\. The redo log was created with MariaDB 10\.3\.1, and it appears corrupted\./ in mysqld.1.err
# valid header, invalid checkpoint 1, valid checkpoint 2, invalid log record
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES
@@ -165,21 +167,29 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
FOUND 3 /\[ERROR\] InnoDB: Upgrade after a crash is not supported\. The redo log was created with MariaDB 10\.3\.1\./ in mysqld.1.err
# Empty 10.3 redo log
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
1
-FOUND 1 /InnoDB: .* started; log sequence number 1213964; transaction id 0/ in mysqld.1.err
+FOUND 1 /InnoDB: log sequence number 1213964\b.*; transaction id 0/ in mysqld.1.err
# Empty 10.2 redo log
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
+SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
+WHERE engine = 'innodb'
+AND support IN ('YES', 'DEFAULT', 'ENABLED');
+COUNT(*)
+1
+FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+# Empty 10.5 redo log
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
1
-FOUND 5 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+FOUND 4 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Minimal MariaDB 10.1.21 encrypted redo log
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb'
diff --git a/mysql-test/suite/encryption/r/tempfiles_encrypted.result b/mysql-test/suite/encryption/r/tempfiles_encrypted.result
index 8582d5dc713..4643e846be5 100644
--- a/mysql-test/suite/encryption/r/tempfiles_encrypted.result
+++ b/mysql-test/suite/encryption/r/tempfiles_encrypted.result
@@ -1409,18 +1409,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t0.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t0.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t0",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t0",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1440,18 +1446,24 @@ EXPLAIN
"filesort": {
"sort_key": "t1.a",
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "sum(t1.b)"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "sum(t1.b)"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1469,18 +1481,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "sum(t1.b)"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "sum(t1.b)"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1503,18 +1521,24 @@ EXPLAIN
"filesort": {
"sort_key": "t1.b",
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.b"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.b"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 10,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 10,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1648,18 +1672,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.c, t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.c, t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1674,18 +1704,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1700,18 +1736,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.c, t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.c, t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1726,18 +1768,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.c, t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.c, t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 3,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 3,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1782,18 +1830,24 @@ EXPLAIN
"filesort": {
"sort_key": "row_number() over ( order by t1.s1,t1.s2) desc",
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.s1, t1.s2"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.s1, t1.s2"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 6,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 6,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -1935,18 +1989,24 @@ EXPLAIN
"select_id": 1,
"duplicate_removal": {
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.part_id, t1.a"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.part_id, t1.a"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 9,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 9,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -2108,18 +2168,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.a, t1.pk"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.a, t1.pk"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 11,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 11,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -2169,18 +2235,24 @@ EXPLAIN
"query_block": {
"select_id": 1,
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "t1.a, t1.b"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "t1.a, t1.b"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "rows": 6,
- "filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "rows": 6,
+ "filtered": 100
+ }
+ }
+ ]
}
}
}
@@ -3761,29 +3833,35 @@ ANALYZE
"r_loops": 1,
"r_total_time_ms": "REPLACED",
"window_functions_computation": {
- "sorts": {
- "filesort": {
- "sort_key": "`row_number() OVER()`",
- "r_loops": 1,
- "r_total_time_ms": "REPLACED",
- "r_used_priority_queue": false,
- "r_output_rows": 3,
- "r_buffer_size": "REPLACED",
- "r_sort_mode": "sort_key,rowid"
+ "sorts": [
+ {
+ "filesort": {
+ "sort_key": "`row_number() OVER()`",
+ "r_loops": 1,
+ "r_total_time_ms": "REPLACED",
+ "r_used_priority_queue": false,
+ "r_output_rows": 3,
+ "r_buffer_size": "REPLACED",
+ "r_sort_mode": "sort_key,rowid"
+ }
}
- },
+ ],
"temporary_table": {
- "table": {
- "table_name": "t1",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 3,
- "r_rows": 3,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 3,
+ "r_rows": 3,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
}
diff --git a/mysql-test/suite/encryption/t/bulk_insert.opt b/mysql-test/suite/encryption/t/bulk_insert.opt
new file mode 100644
index 00000000000..95455f5f75e
--- /dev/null
+++ b/mysql-test/suite/encryption/t/bulk_insert.opt
@@ -0,0 +1 @@
+--innodb_encrypt_log=1
diff --git a/mysql-test/suite/encryption/t/bulk_insert.test b/mysql-test/suite/encryption/t/bulk_insert.test
new file mode 100644
index 00000000000..ce7804cb4e0
--- /dev/null
+++ b/mysql-test/suite/encryption/t/bulk_insert.test
@@ -0,0 +1,11 @@
+--source include/have_innodb.inc
+--source include/have_sequence.inc
+--source include/have_file_key_management_plugin.inc
+
+SET UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0;
+CREATE TABLE t1 (
+ `id` int(10) unsigned NOT NULL,
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB;
+INSERT INTO t1 SELECT seq FROM seq_1_to_65536;
+DROP TABLE t1;
diff --git a/mysql-test/suite/encryption/t/corrupted_during_recovery.test b/mysql-test/suite/encryption/t/corrupted_during_recovery.test
index bccac2bb182..e4a31a0b478 100644
--- a/mysql-test/suite/encryption/t/corrupted_during_recovery.test
+++ b/mysql-test/suite/encryption/t/corrupted_during_recovery.test
@@ -6,7 +6,7 @@ call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed read of file '.*test.t1\\.ibd' page");
-call mtr.add_suppression("InnoDB: Failed to read page [123] from file '.*test.t1\\.ibd': Table is encrypted but decrypt failed");
+call mtr.add_suppression("InnoDB: Failed to read page [123] from file '.*test.t1\\.ibd': Table is compressed or encrypted but uncompress or decrypt failed");
call mtr.add_suppression("InnoDB: The page \\[page id: space=\\d+, page number=3\\] in file '.*test.t1\\.ibd' cannot be decrypted");
call mtr.add_suppression("InnoDB: Table in tablespace \\d+ encrypted. However key management plugin or used key_version \\d+ is not found or used encryption algorithm or method does not match. Can't continue opening the table.");
call mtr.add_suppression("InnoDB: (Unable to apply log to|Discarding log for) corrupted page ");
@@ -55,12 +55,12 @@ EOF
SELECT * FROM t1;
--disable_query_log
call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=3\\] in file .*test.t[1].ibd looks corrupted; key_version=");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` is corrupted. Please drop the table and recreate.");
+call mtr.add_suppression("Table .*t1.* is corrupted. Please drop the table and recreate.");
--enable_query_log
let $restart_parameters=--innodb_force_recovery=1 --skip-innodb-buffer-pool-load-at-startup;
--source include/restart_mysqld.inc
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
SELECT * FROM t1;
SELECT * FROM t2;
CHECK TABLE t2;
diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change.test b/mysql-test/suite/encryption/t/innodb-bad-key-change.test
index 30beff4bd85..05a3b5f4d06 100644
--- a/mysql-test/suite/encryption/t/innodb-bad-key-change.test
+++ b/mysql-test/suite/encryption/t/innodb-bad-key-change.test
@@ -10,11 +10,11 @@
call mtr.add_suppression("Plugin 'file_key_management' init function returned error");
call mtr.add_suppression("Plugin 'file_key_management' registration.*failed");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t[12]` (has an unreadable root page|is corrupted)");
+call mtr.add_suppression("InnoDB: Table `test`\\.`t[12]` has an unreadable root page");
+call mtr.add_suppression("Table .*t[12].* is corrupted");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[12]\\.ibd' cannot be decrypted; key_version=1");
call mtr.add_suppression("failed to read \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=3\\] in file .*test.t1.ibd looks corrupted; key_version=1");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t[12]` is corrupted");
call mtr.add_suppression("File '.*mysql-test.std_data.keysbad3\\.txt' not found");
# for innodb_checksum_algorithm=full_crc32 only
call mtr.add_suppression("\\[ERROR\\] InnoDB: Cannot decrypt \\[page id: space=");
@@ -75,32 +75,32 @@ INSERT INTO t2 VALUES ('foobar',1,2);
--error ER_NO_SUCH_TABLE_IN_ENGINE
SELECT * FROM t2;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
SELECT * FROM t2 where id = 1;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
SELECT * FROM t2 where b = 1;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
INSERT INTO t2 VALUES ('tmp',3,3);
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
DELETE FROM t2 where b = 3;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
DELETE FROM t2 where id = 3;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
UPDATE t2 set b = b +1;
OPTIMIZE TABLE t2;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
ALTER TABLE t2 ADD COLUMN d INT;
ANALYZE TABLE t2;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
TRUNCATE TABLE t2;
DROP TABLE t2;
diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change2.test b/mysql-test/suite/encryption/t/innodb-bad-key-change2.test
index ad252b6c92f..21a9ddb217d 100644
--- a/mysql-test/suite/encryption/t/innodb-bad-key-change2.test
+++ b/mysql-test/suite/encryption/t/innodb-bad-key-change2.test
@@ -8,13 +8,13 @@
# MDEV-8768: Server crash at file btr0btr.ic line 122 when checking encrypted table using incorrect keys
# MDEV-8727: Server/InnoDB hangs on shutdown after trying to read an encrypted table with a wrong key
#
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page|is corrupted|does not exist.*is trying to rename)");
+call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page|does not exist.*is trying to rename)");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t1(new)?\\.ibd' cannot be decrypted; key_version=1");
call mtr.add_suppression("InnoDB: Recovery failed to read page");
# Suppression for builds where file_key_management plugin is linked statically
call mtr.add_suppression("Couldn't load plugins from 'file_key_management");
call mtr.add_suppression("InnoDB: Tablespace for table \`test\`.\`t1\` is set as discarded\\.");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` is corrupted");
+call mtr.add_suppression("Table .*t1.* is corrupted");
call mtr.add_suppression("InnoDB: Cannot delete tablespace .* because it is not found in the tablespace memory cache");
call mtr.add_suppression("InnoDB: ALTER TABLE `test`\\.`t1` DISCARD TABLESPACE failed to find tablespace");
# for innodb_checksum_algorithm=full_crc32 only
@@ -36,7 +36,7 @@ INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
SELECT * FROM t1;
--replace_regex /key_id [1-9][0-9]*/\1 /
SHOW WARNINGS;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
ALTER TABLE t1 ENGINE=InnoDB;
--replace_regex /key_id [1-9][0-9]*/\1 /
SHOW WARNINGS;
@@ -97,7 +97,7 @@ SHOW CREATE TABLE t1;
--error ER_ERROR_ON_RENAME
RENAME TABLE t1 TO t1new;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
ALTER TABLE t1 RENAME TO t1new;
-# Drop should pass even with incorrect keys
+# Drop should succeed even with incorrect keys
DROP TABLE t1;
diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change4.test b/mysql-test/suite/encryption/t/innodb-bad-key-change4.test
index 759f4e58280..c37eb365e7c 100644
--- a/mysql-test/suite/encryption/t/innodb-bad-key-change4.test
+++ b/mysql-test/suite/encryption/t/innodb-bad-key-change4.test
@@ -7,12 +7,12 @@
# MDEV-8768: Server crash at file btr0btr.ic line 122 when checking encrypted table using incorrect keys
#
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page|is corrupted)");
+call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page)");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t1\\.ibd' cannot be decrypted; key_version=1");
call mtr.add_suppression("InnoDB: Recovery failed to read page");
# Suppression for builds where file_key_management plugin is linked statically
call mtr.add_suppression("Couldn't load plugins from 'file_key_management");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` is corrupted");
+call mtr.add_suppression("Table .*t1.* is corrupted");
# for innodb_checksum_algorithm=full_crc32 only
call mtr.add_suppression("\\[ERROR\\] InnoDB: Cannot decrypt \\[page id: space=");
diff --git a/mysql-test/suite/encryption/t/innodb-missing-key.test b/mysql-test/suite/encryption/t/innodb-missing-key.test
index e5bee99fee2..53fc820a1c9 100644
--- a/mysql-test/suite/encryption/t/innodb-missing-key.test
+++ b/mysql-test/suite/encryption/t/innodb-missing-key.test
@@ -7,11 +7,11 @@
# MDEV-11004: Unable to start (Segfault or os error 2) when encryption key missing
#
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` (has an unreadable root page|is corrupted)");
+call mtr.add_suppression("InnoDB: Table `test`\\.`t1` has an unreadable root page");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\.");
call mtr.add_suppression("InnoDB: Recovery failed to read page");
call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file .*test.t[12].ibd looks corrupted; key_version=1");
-call mtr.add_suppression("InnoDB: Table `test`\\.`t1` is corrupted");
+call mtr.add_suppression("Table .*t1.* is corrupted");
--echo # Start server with keys2.txt
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
@@ -48,9 +48,9 @@ SELECT COUNT(1) FROM t3;
SELECT COUNT(1) FROM t2;
--error ER_NO_SUCH_TABLE_IN_ENGINE
SELECT COUNT(1) FROM t2,t1 where t2.a = t1.a;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
SELECT COUNT(1) FROM t1 where b = 'ab';
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
SELECT COUNT(1) FROM t1;
--echo
diff --git a/mysql-test/suite/encryption/t/innodb-redo-nokeys.test b/mysql-test/suite/encryption/t/innodb-redo-nokeys.test
index ab77b3747b8..713b98130be 100644
--- a/mysql-test/suite/encryption/t/innodb-redo-nokeys.test
+++ b/mysql-test/suite/encryption/t/innodb-redo-nokeys.test
@@ -13,6 +13,8 @@ call mtr.add_suppression("InnoDB: (Unable to apply log to|Discarding log for) co
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9][0-9]*, page number=0\\] of corrupted file '.*test.t[1-5]\\.ibd'");
call mtr.add_suppression("InnoDB: Failed to read page .* from file '.*'");
call mtr.add_suppression("InnoDB: OPT_PAGE_CHECKSUM mismatch");
+call mtr.add_suppression("InnoDB: Missing FILE_CHECKPOINT");
+call mtr.add_suppression("InnoDB: Log scan aborted at LSN");
call mtr.add_suppression("InnoDB: Set innodb_force_recovery=1 to ignore corruption");
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
diff --git a/mysql-test/suite/engines/funcs/r/ix_using_order.result b/mysql-test/suite/engines/funcs/r/ix_using_order.result
index 8d270da1b96..02b34dd4f6c 100644
--- a/mysql-test/suite/engines/funcs/r/ix_using_order.result
+++ b/mysql-test/suite/engines/funcs/r/ix_using_order.result
@@ -17,7 +17,7 @@ SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
- KEY `i1` (`c1`) USING BTREE
+ KEY `i1` (`c1` DESC) USING BTREE
) ENGINE=ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
DROP TABLE t1;
SHOW TABLES;
@@ -40,7 +40,7 @@ SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
- UNIQUE KEY `i1` (`c1`) USING BTREE
+ UNIQUE KEY `i1` (`c1` DESC) USING BTREE
) ENGINE=ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
DROP INDEX i1 ON t1;
DROP TABLE t1;
diff --git a/mysql-test/suite/engines/funcs/r/rpl_switch_stm_row_mixed.result b/mysql-test/suite/engines/funcs/r/rpl_switch_stm_row_mixed.result
index 936f604be2e..71332034b15 100644
--- a/mysql-test/suite/engines/funcs/r/rpl_switch_stm_row_mixed.result
+++ b/mysql-test/suite/engines/funcs/r/rpl_switch_stm_row_mixed.result
@@ -41,16 +41,16 @@ select @@global.binlog_format, @@session.binlog_format;
@@global.binlog_format @@session.binlog_format
ROW ROW
CREATE TABLE t1 (a varchar(100));
-prepare stmt1 from 'insert into t1 select concat(UUID(),?)';
+prepare stmt1 from 'insert into t1 select concat(SYS_GUID(),?)';
set @string="emergency_1_";
insert into t1 values("work_2_");
execute stmt1 using @string;
deallocate prepare stmt1;
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_3_"));
+insert into t1 values(concat(SYS_GUID(),"work_3_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_4_",UUID()));
+insert into t1 values(concat("for_4_",SYS_GUID()));
insert into t1 select "yesterday_5_";
create temporary table tmp(a char(100));
insert into tmp values("see_6_");
@@ -116,43 +116,43 @@ set binlog_format=default;
select @@global.binlog_format, @@session.binlog_format;
@@global.binlog_format @@session.binlog_format
MIXED MIXED
-prepare stmt1 from 'insert into t1 select concat(UUID(),?)';
+prepare stmt1 from 'insert into t1 select concat(SYS_GUID(),?)';
set @string="emergency_17_";
insert into t1 values("work_18_");
execute stmt1 using @string;
deallocate prepare stmt1;
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_19_"));
+insert into t1 values(concat(SYS_GUID(),"work_19_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_20_",UUID()));
+insert into t1 values(concat("for_20_",SYS_GUID()));
insert into t1 select "yesterday_21_";
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_22_"));
+insert into t1 values(concat(SYS_GUID(),"work_22_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_23_",UUID()));
+insert into t1 values(concat("for_23_",SYS_GUID()));
insert into t1 select "yesterday_24_";
-create table t2 ENGINE=MyISAM select rpad(UUID(),100,' ');
-create table t3 select 1 union select UUID();
+create table t2 ENGINE=MyISAM select rpad(SYS_GUID(),100,' ');
+create table t3 select 1 union select SYS_GUID();
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
-create table t4 select * from t1 where 3 in (select 1 union select 2 union select UUID() union select 3);
+create table t4 select * from t1 where 3 in (select 1 union select 2 union select SYS_GUID() union select 3);
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
create table t5 select * from t1 where 3 in (select 1 union select 2 union select curdate() union select 3);
Warnings:
Warning 1292 Truncated incorrect datetime value: '3'
-insert ignore into t5 select UUID() from t1 where 3 in (select 1 union select 2 union select 3 union select * from t4);
+insert ignore into t5 select SYS_GUID() from t1 where 3 in (select 1 union select 2 union select 3 union select * from t4);
create procedure foo()
begin
insert into t1 values("work_25_");
-insert into t1 values(concat("for_26_",UUID()));
+insert into t1 values(concat("for_26_",SYS_GUID()));
insert into t1 select "yesterday_27_";
end|
create procedure foo2()
begin
-insert into t1 values(concat("emergency_28_",UUID()));
+insert into t1 values(concat("emergency_28_",SYS_GUID()));
insert into t1 values("work_29_");
-insert into t1 values(concat("for_30_",UUID()));
+insert into t1 values(concat("for_30_",SYS_GUID()));
set session binlog_format=row; # accepted for stored procs
insert into t1 values("more work_31_");
set session binlog_format=mixed;
@@ -171,7 +171,7 @@ end|
call foo();
call foo2();
call foo4("hello");
-call foo4(UUID());
+call foo4(SYS_GUID());
call foo4("world");
select foo3();
ERROR HY000: Cannot change the binary logging format inside a stored function or trigger
@@ -207,7 +207,7 @@ foo4()
deallocate prepare stmt1;
create function foo5() returns bigint unsigned
begin
-insert into t2 select UUID();
+insert into t2 select SYS_GUID();
return 100;
end|
select foo5();
@@ -229,18 +229,18 @@ end|
select foo6("foo6_1_");
foo6("foo6_1_")
100
-select foo6(concat("foo6_2_",UUID()));
-foo6(concat("foo6_2_",UUID()))
+select foo6(concat("foo6_2_",SYS_GUID()));
+foo6(concat("foo6_2_",SYS_GUID()))
100
-prepare stmt1 from 'select foo6(concat("foo6_3_",UUID()))';
+prepare stmt1 from 'select foo6(concat("foo6_3_",SYS_GUID()))';
execute stmt1;
-foo6(concat("foo6_3_",UUID()))
+foo6(concat("foo6_3_",SYS_GUID()))
100
execute stmt1;
-foo6(concat("foo6_3_",UUID()))
+foo6(concat("foo6_3_",SYS_GUID()))
100
deallocate prepare stmt1;
-create view v1 as select uuid();
+create view v1 as select SYS_GUID();
create table t11 (data varchar(255));
insert into t11 select * from v1;
insert into t11 select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysqltest1' and TABLE_NAME IN ('v1','t11');
@@ -250,11 +250,11 @@ execute stmt1;
deallocate prepare stmt1;
create trigger t11_bi before insert on t11 for each row
begin
-set NEW.data = concat(NEW.data,UUID());
+set NEW.data = concat(NEW.data,SYS_GUID());
end|
insert into t11 values("try_560_");
insert delayed into t2 values("delay_1_");
-insert delayed into t2 values(concat("delay_2_",UUID()));
+insert delayed into t2 values(concat("delay_2_",SYS_GUID()));
insert delayed into t2 values("delay_6_");
insert delayed into t2 values(rand());
set @a=2.345;
@@ -356,7 +356,7 @@ alter table t1 modify a int, drop primary key;
insert into t1 values(null,"try_57_");
connection slave;
connection master;
-CREATE TEMPORARY TABLE t15 SELECT UUID();
+CREATE TEMPORARY TABLE t15 SELECT SYS_GUID();
create table t16 like t15;
INSERT INTO t16 SELECT * FROM t15;
insert into t16 values("try_65_");
@@ -427,7 +427,7 @@ DROP TABLE IF EXISTS t12;
SET SESSION BINLOG_FORMAT=MIXED;
CREATE TABLE t12 (data LONG);
LOCK TABLES t12 WRITE;
-INSERT INTO t12 VALUES(UUID());
+INSERT INTO t12 VALUES(SYS_GUID());
UNLOCK TABLES;
connection slave;
connection master;
diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_divide.result b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_divide.result
index 8343df73110..b1d455e610a 100644
--- a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_divide.result
+++ b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_divide.result
@@ -51,7 +51,7 @@ t1 CREATE TABLE `t1` (
PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION s2;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -132,7 +132,7 @@ t1 CREATE TABLE `t1` (
PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION s2;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -213,7 +213,7 @@ t1 CREATE TABLE `t1` (
PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION s2;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -294,7 +294,7 @@ t1 CREATE TABLE `t1` (
PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION s2;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -375,7 +375,7 @@ t1 CREATE TABLE `t1` (
PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION s2;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -456,7 +456,7 @@ t1 CREATE TABLE `t1` (
PARTITION `p2` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION s2;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
c1 c2
diff --git a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_merge.result b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_merge.result
index 3804f883be0..494a9dfdcdb 100644
--- a/mysql-test/suite/engines/funcs/r/tc_partition_reorg_merge.result
+++ b/mysql-test/suite/engines/funcs/r/tc_partition_reorg_merge.result
@@ -46,7 +46,7 @@ t1 CREATE TABLE `t1` (
PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION m1;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -117,7 +117,7 @@ t1 CREATE TABLE `t1` (
PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION m1;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -188,7 +188,7 @@ t1 CREATE TABLE `t1` (
PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION m1;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -259,7 +259,7 @@ t1 CREATE TABLE `t1` (
PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION m1;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -330,7 +330,7 @@ t1 CREATE TABLE `t1` (
PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION m1;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
c1 c2
@@ -401,7 +401,7 @@ t1 CREATE TABLE `t1` (
PARTITION `m0` VALUES LESS THAN (30) ENGINE = ENGINE,
PARTITION `p3` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 DROP PARTITION m1;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
c1 c2
diff --git a/mysql-test/suite/engines/funcs/t/tc_partition_reorg_divide.test b/mysql-test/suite/engines/funcs/t/tc_partition_reorg_divide.test
index 89a75bb06af..03f4ccb23df 100644
--- a/mysql-test/suite/engines/funcs/t/tc_partition_reorg_divide.test
+++ b/mysql-test/suite/engines/funcs/t/tc_partition_reorg_divide.test
@@ -21,7 +21,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION s2;
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
@@ -52,7 +52,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION s2;
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
@@ -83,7 +83,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION s2;
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
@@ -114,7 +114,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION s2;
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
@@ -145,7 +145,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION s2;
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
@@ -176,7 +176,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION s2;
ALTER TABLE t1 DROP PARTITION s1;
SELECT * FROM t1 ORDER BY c1;
diff --git a/mysql-test/suite/engines/funcs/t/tc_partition_reorg_merge.test b/mysql-test/suite/engines/funcs/t/tc_partition_reorg_merge.test
index fe9b0ba108f..e2059ff6336 100644
--- a/mysql-test/suite/engines/funcs/t/tc_partition_reorg_merge.test
+++ b/mysql-test/suite/engines/funcs/t/tc_partition_reorg_merge.test
@@ -18,7 +18,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION m1;
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
@@ -46,7 +46,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION m1;
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
@@ -74,7 +74,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION m1;
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
@@ -102,7 +102,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION m1;
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
@@ -130,7 +130,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION m1;
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
@@ -158,7 +158,7 @@ SHOW TABLES;
let $ENGINE=`select variable_value from information_schema.global_variables where variable_name='STORAGE_ENGINE'`;
--replace_result $ENGINE ENGINE
SHOW CREATE TABLE t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
ALTER TABLE t1 DROP PARTITION m1;
ALTER TABLE t1 DROP PARTITION m0;
SELECT * FROM t1 ORDER BY c1;
diff --git a/mysql-test/suite/federated/error_row_number.result b/mysql-test/suite/federated/error_row_number.result
new file mode 100644
index 00000000000..a53f3a87a17
--- /dev/null
+++ b/mysql-test/suite/federated/error_row_number.result
@@ -0,0 +1,26 @@
+#
+# MDEV-26654 ROW_NUMBER is wrong upon INSERT into Federated table
+#
+connect master,127.0.0.1,root,,test,$MASTER_MYPORT,;
+connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,;
+connection master;
+CREATE DATABASE federated;
+connection slave;
+CREATE DATABASE federated;
+connection master;
+create table t (pk int primary key);
+create table tfed engine=FEDERATED connection='mysql://root@localhost:$MASTER_MYPORT/test/t';
+insert into tfed values (1),(2),(1);
+ERROR 23000: Can't write; duplicate key in table 'tfed'
+get diagnostics condition 1 @val = row_number;
+# federated is doing bulk insert here, the exact row number is unknown
+select @val;
+@val
+0
+drop table tfed, t;
+connection master;
+DROP TABLE IF EXISTS federated.t1;
+DROP DATABASE IF EXISTS federated;
+connection slave;
+DROP TABLE IF EXISTS federated.t1;
+DROP DATABASE IF EXISTS federated;
diff --git a/mysql-test/suite/federated/error_row_number.test b/mysql-test/suite/federated/error_row_number.test
new file mode 100644
index 00000000000..8d943589e07
--- /dev/null
+++ b/mysql-test/suite/federated/error_row_number.test
@@ -0,0 +1,18 @@
+--echo #
+--echo # MDEV-26654 ROW_NUMBER is wrong upon INSERT into Federated table
+--echo #
+
+--source suite/federated/have_federatedx.inc
+--source include/federated.inc
+--connection master
+
+create table t (pk int primary key);
+--evalp create table tfed engine=FEDERATED connection='mysql://root@localhost:$MASTER_MYPORT/test/t'
+--error ER_DUP_KEY
+insert into tfed values (1),(2),(1);
+get diagnostics condition 1 @val = row_number;
+--echo # federated is doing bulk insert here, the exact row number is unknown
+select @val;
+
+drop table tfed, t;
+--source include/federated_cleanup.inc
diff --git a/mysql-test/suite/federated/federatedx_create_handlers.result b/mysql-test/suite/federated/federatedx_create_handlers.result
index c0b91a68da7..55756329ff3 100644
--- a/mysql-test/suite/federated/federatedx_create_handlers.result
+++ b/mysql-test/suite/federated/federatedx_create_handlers.result
@@ -157,31 +157,37 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "rows": 7,
- "filtered": 100
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "18",
- "used_key_parts": ["name"],
- "ref": ["federated.t3.name"],
- "rows": 2,
- "filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "message": "Pushed derived"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "rows": 7,
+ "filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "18",
+ "used_key_parts": ["name"],
+ "ref": ["federated.t3.name"],
+ "rows": 2,
+ "filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "table": {
+ "message": "Pushed derived"
+ }
+ }
}
}
}
- }
+ ]
}
}
ANALYZE
@@ -221,41 +227,47 @@ ANALYZE
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
- "table": {
- "table_name": "t3",
- "access_type": "ALL",
- "r_loops": 1,
- "rows": 7,
- "r_rows": 7,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100
- },
- "table": {
- "table_name": "<derived2>",
- "access_type": "ref",
- "possible_keys": ["key0"],
- "key": "key0",
- "key_length": "18",
- "used_key_parts": ["name"],
- "ref": ["federated.t3.name"],
- "r_loops": 7,
- "rows": 2,
- "r_rows": 0,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 100,
- "r_filtered": 100,
- "materialized": {
- "query_block": {
- "select_id": 2,
- "table": {
- "message": "Pushed derived"
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "ALL",
+ "r_loops": 1,
+ "rows": 7,
+ "r_rows": 7,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100
+ }
+ },
+ {
+ "table": {
+ "table_name": "<derived2>",
+ "access_type": "ref",
+ "possible_keys": ["key0"],
+ "key": "key0",
+ "key_length": "18",
+ "used_key_parts": ["name"],
+ "ref": ["federated.t3.name"],
+ "r_loops": 7,
+ "rows": 2,
+ "r_rows": 0,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 100,
+ "r_filtered": 100,
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "table": {
+ "message": "Pushed derived"
+ }
+ }
}
}
}
- }
+ ]
}
}
SELECT t.id, federated.t3.name
@@ -346,31 +358,37 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t5",
- "access_type": "ALL",
- "rows": 2,
- "filtered": 100
- },
- "block-nl-join": {
- "table": {
- "table_name": "<derived2>",
- "access_type": "ALL",
- "rows": 5,
- "filtered": 100
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t5",
+ "access_type": "ALL",
+ "rows": 2,
+ "filtered": 100
+ }
},
- "buffer_type": "flat",
- "buffer_size": "65",
- "join_type": "BNL",
- "materialized": {
- "query_block": {
- "select_id": 2,
+ {
+ "block-nl-join": {
"table": {
- "message": "Pushed derived"
+ "table_name": "<derived2>",
+ "access_type": "ALL",
+ "rows": 5,
+ "filtered": 100
+ },
+ "buffer_type": "flat",
+ "buffer_size": "65",
+ "join_type": "BNL",
+ "materialized": {
+ "query_block": {
+ "select_id": 2,
+ "table": {
+ "message": "Pushed derived"
+ }
+ }
}
}
}
- }
+ ]
}
}
drop table t5;
diff --git a/mysql-test/suite/federated/indexes.result b/mysql-test/suite/federated/indexes.result
new file mode 100644
index 00000000000..d5ebbeeb6dc
--- /dev/null
+++ b/mysql-test/suite/federated/indexes.result
@@ -0,0 +1,33 @@
+#
+# MDEV-27398 DESC index causes wrong (empty) result on Federated tables
+#
+create table t (a int);
+insert into t values (1),(5),(2),(3),(4);
+create table tf (a int, key(a desc)) connection 'mysql://root@127.0.0.1:$MASTER_MYPORT/test/t' engine=Federated;
+select * from tf;
+a
+1
+2
+3
+4
+5
+select * from tf where a > 2;
+a
+3
+4
+5
+select * from tf where a < 3;
+a
+1
+2
+select * from tf where a >= 3;
+a
+3
+4
+5
+select * from tf where a <= 3;
+a
+1
+2
+3
+drop table tf, t;
diff --git a/mysql-test/suite/federated/indexes.test b/mysql-test/suite/federated/indexes.test
new file mode 100644
index 00000000000..2ad2f823acf
--- /dev/null
+++ b/mysql-test/suite/federated/indexes.test
@@ -0,0 +1,22 @@
+--source include/not_embedded.inc
+--source suite/federated/have_federatedx.inc
+
+--echo #
+--echo # MDEV-27398 DESC index causes wrong (empty) result on Federated tables
+--echo #
+
+create table t (a int);
+insert into t values (1),(5),(2),(3),(4);
+
+--evalp create table tf (a int, key(a desc)) connection 'mysql://root@127.0.0.1:$MASTER_MYPORT/test/t' engine=Federated
+--sorted_result
+select * from tf;
+--sorted_result
+select * from tf where a > 2;
+--sorted_result
+select * from tf where a < 3;
+--sorted_result
+select * from tf where a >= 3;
+--sorted_result
+select * from tf where a <= 3;
+drop table tf, t;
diff --git a/mysql-test/suite/funcs_1/r/innodb_func_view.result b/mysql-test/suite/funcs_1/r/innodb_func_view.result
index adf4c2bc10c..b603d36f5ec 100644
--- a/mysql-test/suite/funcs_1/r/innodb_func_view.result
+++ b/mysql-test/suite/funcs_1/r/innodb_func_view.result
@@ -3322,9 +3322,9 @@ NULL NULL 1
-3333.33 -3333.3333 30
Warnings:
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
-Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 1
+Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 2
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
-Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 1
+Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 3
SHOW CREATE VIEW v1;
View Create View character_set_client collation_connection
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select cast(`t1_values`.`my_double` as decimal(37,2)) AS `CAST(my_double AS DECIMAL(37,2))`,`t1_values`.`my_double` AS `my_double`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci
diff --git a/mysql-test/suite/funcs_1/r/innodb_trig_0102.result b/mysql-test/suite/funcs_1/r/innodb_trig_0102.result
index 36115ecad83..b44ef1fdee2 100644
--- a/mysql-test/suite/funcs_1/r/innodb_trig_0102.result
+++ b/mysql-test/suite/funcs_1/r/innodb_trig_0102.result
@@ -55,9 +55,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase: 3.5.1.1:
------------------
diff --git a/mysql-test/suite/funcs_1/r/innodb_trig_03.result b/mysql-test/suite/funcs_1/r/innodb_trig_03.result
index 33fdfe38f87..c2f0bb4a2f0 100644
--- a/mysql-test/suite/funcs_1/r/innodb_trig_03.result
+++ b/mysql-test/suite/funcs_1/r/innodb_trig_03.result
@@ -56,9 +56,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase 3.5.3:
---------------
diff --git a/mysql-test/suite/funcs_1/r/innodb_trig_0407.result b/mysql-test/suite/funcs_1/r/innodb_trig_0407.result
index fb5d105448f..d551575960e 100644
--- a/mysql-test/suite/funcs_1/r/innodb_trig_0407.result
+++ b/mysql-test/suite/funcs_1/r/innodb_trig_0407.result
@@ -57,9 +57,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase: 3.5:
--------------
diff --git a/mysql-test/suite/funcs_1/r/innodb_trig_08.result b/mysql-test/suite/funcs_1/r/innodb_trig_08.result
index 98613a20b49..2a57496800e 100644
--- a/mysql-test/suite/funcs_1/r/innodb_trig_08.result
+++ b/mysql-test/suite/funcs_1/r/innodb_trig_08.result
@@ -57,9 +57,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase: 3.5:
--------------
diff --git a/mysql-test/suite/funcs_1/r/innodb_trig_09.result b/mysql-test/suite/funcs_1/r/innodb_trig_09.result
index 6664994543b..89815594a7e 100644
--- a/mysql-test/suite/funcs_1/r/innodb_trig_09.result
+++ b/mysql-test/suite/funcs_1/r/innodb_trig_09.result
@@ -55,9 +55,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/memory_tb3.txt'
into table tb3;
diff --git a/mysql-test/suite/funcs_1/r/innodb_trig_1011ext.result b/mysql-test/suite/funcs_1/r/innodb_trig_1011ext.result
index de9b73c2bf5..9e09c50d968 100644
--- a/mysql-test/suite/funcs_1/r/innodb_trig_1011ext.result
+++ b/mysql-test/suite/funcs_1/r/innodb_trig_1011ext.result
@@ -55,9 +55,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/memory_tb3.txt'
into table tb3;
diff --git a/mysql-test/suite/funcs_1/r/is_columns_innodb.result b/mysql-test/suite/funcs_1/r/is_columns_innodb.result
index fbca906a9fb..beb8ad88de1 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_innodb.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_innodb.result
@@ -63,19 +63,19 @@ f57 numeric (0) not null DEFAULT 99,
f58 numeric (64) not null DEFAULT 99
) engine = innodb;
Warnings:
-Note 1265 Data truncated for column 'f36' at row 1
-Note 1265 Data truncated for column 'f37' at row 1
-Note 1265 Data truncated for column 'f38' at row 1
-Note 1265 Data truncated for column 'f39' at row 1
-Note 1265 Data truncated for column 'f40' at row 1
-Note 1265 Data truncated for column 'f41' at row 1
-Note 1265 Data truncated for column 'f42' at row 1
-Note 1265 Data truncated for column 'f43' at row 1
-Note 1265 Data truncated for column 'f44' at row 1
-Note 1265 Data truncated for column 'f45' at row 1
-Note 1265 Data truncated for column 'f47' at row 1
-Note 1265 Data truncated for column 'f49' at row 1
-Note 1265 Data truncated for column 'f51' at row 1
+Note 1265 Data truncated for column 'f36' at row 0
+Note 1265 Data truncated for column 'f37' at row 0
+Note 1265 Data truncated for column 'f38' at row 0
+Note 1265 Data truncated for column 'f39' at row 0
+Note 1265 Data truncated for column 'f40' at row 0
+Note 1265 Data truncated for column 'f41' at row 0
+Note 1265 Data truncated for column 'f42' at row 0
+Note 1265 Data truncated for column 'f43' at row 0
+Note 1265 Data truncated for column 'f44' at row 0
+Note 1265 Data truncated for column 'f45' at row 0
+Note 1265 Data truncated for column 'f47' at row 0
+Note 1265 Data truncated for column 'f49' at row 0
+Note 1265 Data truncated for column 'f51' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/innodb_tb1.txt'
into table tb1;
drop table if exists tb2 ;
@@ -198,9 +198,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = innodb;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/innodb_tb3.txt'
into table tb3;
drop table if exists tb4;
diff --git a/mysql-test/suite/funcs_1/r/is_columns_memory.result b/mysql-test/suite/funcs_1/r/is_columns_memory.result
index 5eaa5b08cc2..b33d6a28efb 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_memory.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_memory.result
@@ -56,22 +56,22 @@ f57 numeric (0) not null DEFAULT 99,
f58 numeric (64) not null DEFAULT 99
) engine = memory;
Warnings:
-Note 1265 Data truncated for column 'f33' at row 1
-Note 1265 Data truncated for column 'f34' at row 1
-Note 1265 Data truncated for column 'f35' at row 1
-Note 1265 Data truncated for column 'f36' at row 1
-Note 1265 Data truncated for column 'f37' at row 1
-Note 1265 Data truncated for column 'f38' at row 1
-Note 1265 Data truncated for column 'f39' at row 1
-Note 1265 Data truncated for column 'f40' at row 1
-Note 1265 Data truncated for column 'f41' at row 1
-Note 1265 Data truncated for column 'f42' at row 1
-Note 1265 Data truncated for column 'f43' at row 1
-Note 1265 Data truncated for column 'f44' at row 1
-Note 1265 Data truncated for column 'f45' at row 1
-Note 1265 Data truncated for column 'f47' at row 1
-Note 1265 Data truncated for column 'f49' at row 1
-Note 1265 Data truncated for column 'f51' at row 1
+Note 1265 Data truncated for column 'f33' at row 0
+Note 1265 Data truncated for column 'f34' at row 0
+Note 1265 Data truncated for column 'f35' at row 0
+Note 1265 Data truncated for column 'f36' at row 0
+Note 1265 Data truncated for column 'f37' at row 0
+Note 1265 Data truncated for column 'f38' at row 0
+Note 1265 Data truncated for column 'f39' at row 0
+Note 1265 Data truncated for column 'f40' at row 0
+Note 1265 Data truncated for column 'f41' at row 0
+Note 1265 Data truncated for column 'f42' at row 0
+Note 1265 Data truncated for column 'f43' at row 0
+Note 1265 Data truncated for column 'f44' at row 0
+Note 1265 Data truncated for column 'f45' at row 0
+Note 1265 Data truncated for column 'f47' at row 0
+Note 1265 Data truncated for column 'f49' at row 0
+Note 1265 Data truncated for column 'f51' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/memory_tb1.txt'
into table tb1;
drop table if exists tb2 ;
@@ -188,9 +188,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = memory;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/memory_tb3.txt'
into table tb3;
drop table if exists tb4 ;
diff --git a/mysql-test/suite/funcs_1/r/is_columns_myisam.result b/mysql-test/suite/funcs_1/r/is_columns_myisam.result
index 4426583ac4c..e7a8a176188 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_myisam.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_myisam.result
@@ -64,22 +64,22 @@ f57 numeric (0) not null DEFAULT 99,
f58 numeric (64) not null DEFAULT 99
) engine = myisam;
Warnings:
-Note 1265 Data truncated for column 'f33' at row 1
-Note 1265 Data truncated for column 'f34' at row 1
-Note 1265 Data truncated for column 'f35' at row 1
-Note 1265 Data truncated for column 'f36' at row 1
-Note 1265 Data truncated for column 'f37' at row 1
-Note 1265 Data truncated for column 'f38' at row 1
-Note 1265 Data truncated for column 'f39' at row 1
-Note 1265 Data truncated for column 'f40' at row 1
-Note 1265 Data truncated for column 'f41' at row 1
-Note 1265 Data truncated for column 'f42' at row 1
-Note 1265 Data truncated for column 'f43' at row 1
-Note 1265 Data truncated for column 'f44' at row 1
-Note 1265 Data truncated for column 'f45' at row 1
-Note 1265 Data truncated for column 'f47' at row 1
-Note 1265 Data truncated for column 'f49' at row 1
-Note 1265 Data truncated for column 'f51' at row 1
+Note 1265 Data truncated for column 'f33' at row 0
+Note 1265 Data truncated for column 'f34' at row 0
+Note 1265 Data truncated for column 'f35' at row 0
+Note 1265 Data truncated for column 'f36' at row 0
+Note 1265 Data truncated for column 'f37' at row 0
+Note 1265 Data truncated for column 'f38' at row 0
+Note 1265 Data truncated for column 'f39' at row 0
+Note 1265 Data truncated for column 'f40' at row 0
+Note 1265 Data truncated for column 'f41' at row 0
+Note 1265 Data truncated for column 'f42' at row 0
+Note 1265 Data truncated for column 'f43' at row 0
+Note 1265 Data truncated for column 'f44' at row 0
+Note 1265 Data truncated for column 'f45' at row 0
+Note 1265 Data truncated for column 'f47' at row 0
+Note 1265 Data truncated for column 'f49' at row 0
+Note 1265 Data truncated for column 'f51' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/myisam_tb1.txt'
into table tb1;
drop table if exists tb2 ;
@@ -210,9 +210,9 @@ f174 numeric (0),
f175 numeric (64)
) Engine = myisam;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/myisam_tb3.txt'
into table tb3;
drop table if exists tb4 ;
diff --git a/mysql-test/suite/funcs_1/r/is_columns_myisam_embedded.result b/mysql-test/suite/funcs_1/r/is_columns_myisam_embedded.result
index 6faa8d7b51a..d44732f5dd5 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_myisam_embedded.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_myisam_embedded.result
@@ -64,22 +64,22 @@ f57 numeric (0) not null DEFAULT 99,
f58 numeric (64) not null DEFAULT 99
) engine = myisam;
Warnings:
-Note 1265 Data truncated for column 'f33' at row 1
-Note 1265 Data truncated for column 'f34' at row 1
-Note 1265 Data truncated for column 'f35' at row 1
-Note 1265 Data truncated for column 'f36' at row 1
-Note 1265 Data truncated for column 'f37' at row 1
-Note 1265 Data truncated for column 'f38' at row 1
-Note 1265 Data truncated for column 'f39' at row 1
-Note 1265 Data truncated for column 'f40' at row 1
-Note 1265 Data truncated for column 'f41' at row 1
-Note 1265 Data truncated for column 'f42' at row 1
-Note 1265 Data truncated for column 'f43' at row 1
-Note 1265 Data truncated for column 'f44' at row 1
-Note 1265 Data truncated for column 'f45' at row 1
-Note 1265 Data truncated for column 'f47' at row 1
-Note 1265 Data truncated for column 'f49' at row 1
-Note 1265 Data truncated for column 'f51' at row 1
+Note 1265 Data truncated for column 'f33' at row 0
+Note 1265 Data truncated for column 'f34' at row 0
+Note 1265 Data truncated for column 'f35' at row 0
+Note 1265 Data truncated for column 'f36' at row 0
+Note 1265 Data truncated for column 'f37' at row 0
+Note 1265 Data truncated for column 'f38' at row 0
+Note 1265 Data truncated for column 'f39' at row 0
+Note 1265 Data truncated for column 'f40' at row 0
+Note 1265 Data truncated for column 'f41' at row 0
+Note 1265 Data truncated for column 'f42' at row 0
+Note 1265 Data truncated for column 'f43' at row 0
+Note 1265 Data truncated for column 'f44' at row 0
+Note 1265 Data truncated for column 'f45' at row 0
+Note 1265 Data truncated for column 'f47' at row 0
+Note 1265 Data truncated for column 'f49' at row 0
+Note 1265 Data truncated for column 'f51' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/myisam_tb1.txt'
into table tb1;
drop table if exists tb2 ;
@@ -210,9 +210,9 @@ f174 numeric (0),
f175 numeric (64)
) Engine = myisam;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/myisam_tb3.txt'
into table tb3;
drop table if exists tb4 ;
diff --git a/mysql-test/suite/funcs_1/r/is_columns_mysql.result b/mysql-test/suite/funcs_1/r/is_columns_mysql.result
index ef4832cdb8a..b50ae58df28 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_mysql.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_mysql.result
@@ -13,9 +13,9 @@ def mysql column_stats avg_frequency 8 NULL YES decimal NULL NULL 12 4 NULL NULL
def mysql column_stats avg_length 7 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) select,insert,update,references NEVER NULL
def mysql column_stats column_name 3 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_bin varchar(64) PRI select,insert,update,references NEVER NULL
def mysql column_stats db_name 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_bin varchar(64) PRI select,insert,update,references NEVER NULL
-def mysql column_stats histogram 11 NULL YES varbinary 255 255 NULL NULL NULL NULL NULL varbinary(255) select,insert,update,references NEVER NULL
+def mysql column_stats histogram 11 NULL YES longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob select,insert,update,references NEVER NULL
def mysql column_stats hist_size 9 NULL YES tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned select,insert,update,references NEVER NULL
-def mysql column_stats hist_type 10 NULL YES enum 14 42 NULL NULL NULL utf8mb3 utf8mb3_bin enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') select,insert,update,references NEVER NULL
+def mysql column_stats hist_type 10 NULL YES enum 14 42 NULL NULL NULL utf8mb3 utf8mb3_bin enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') select,insert,update,references NEVER NULL
def mysql column_stats max_value 5 NULL YES varbinary 255 255 NULL NULL NULL NULL NULL varbinary(255) select,insert,update,references NEVER NULL
def mysql column_stats min_value 4 NULL YES varbinary 255 255 NULL NULL NULL NULL NULL varbinary(255) select,insert,update,references NEVER NULL
def mysql column_stats nulls_ratio 6 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) select,insert,update,references NEVER NULL
@@ -345,8 +345,8 @@ NULL mysql column_stats nulls_ratio decimal NULL NULL NULL NULL decimal(12,4)
NULL mysql column_stats avg_length decimal NULL NULL NULL NULL decimal(12,4)
NULL mysql column_stats avg_frequency decimal NULL NULL NULL NULL decimal(12,4)
NULL mysql column_stats hist_size tinyint NULL NULL NULL NULL tinyint(3) unsigned
-3.0000 mysql column_stats hist_type enum 14 42 utf8mb3 utf8mb3_bin enum('SINGLE_PREC_HB','DOUBLE_PREC_HB')
-1.0000 mysql column_stats histogram varbinary 255 255 NULL NULL varbinary(255)
+3.0000 mysql column_stats hist_type enum 14 42 utf8mb3 utf8mb3_bin enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB')
+1.0000 mysql column_stats histogram longblob 4294967295 4294967295 NULL NULL longblob
3.0000 mysql db Host char 255 765 utf8mb3 utf8mb3_bin char(255)
3.0000 mysql db Db char 64 192 utf8mb3 utf8mb3_bin char(64)
3.0000 mysql db User char 128 384 utf8mb3 utf8mb3_bin char(128)
diff --git a/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result b/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result
index 1a794c2828d..96751dfd176 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result
@@ -13,9 +13,9 @@ def mysql column_stats avg_frequency 8 NULL YES decimal NULL NULL 12 4 NULL NULL
def mysql column_stats avg_length 7 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) NEVER NULL
def mysql column_stats column_name 3 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_bin varchar(64) PRI NEVER NULL
def mysql column_stats db_name 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_bin varchar(64) PRI NEVER NULL
-def mysql column_stats histogram 11 NULL YES varbinary 255 255 NULL NULL NULL NULL NULL varbinary(255) NEVER NULL
+def mysql column_stats histogram 11 NULL YES longblob 4294967295 4294967295 NULL NULL NULL NULL NULL longblob NEVER NULL
def mysql column_stats hist_size 9 NULL YES tinyint NULL NULL 3 0 NULL NULL NULL tinyint(3) unsigned NEVER NULL
-def mysql column_stats hist_type 10 NULL YES enum 14 42 NULL NULL NULL utf8mb3 utf8mb3_bin enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') NEVER NULL
+def mysql column_stats hist_type 10 NULL YES enum 14 42 NULL NULL NULL utf8mb3 utf8mb3_bin enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') NEVER NULL
def mysql column_stats max_value 5 NULL YES varbinary 255 255 NULL NULL NULL NULL NULL varbinary(255) NEVER NULL
def mysql column_stats min_value 4 NULL YES varbinary 255 255 NULL NULL NULL NULL NULL varbinary(255) NEVER NULL
def mysql column_stats nulls_ratio 6 NULL YES decimal NULL NULL 12 4 NULL NULL NULL decimal(12,4) NEVER NULL
@@ -342,8 +342,8 @@ NULL mysql column_stats nulls_ratio decimal NULL NULL NULL NULL decimal(12,4)
NULL mysql column_stats avg_length decimal NULL NULL NULL NULL decimal(12,4)
NULL mysql column_stats avg_frequency decimal NULL NULL NULL NULL decimal(12,4)
NULL mysql column_stats hist_size tinyint NULL NULL NULL NULL tinyint(3) unsigned
-3.0000 mysql column_stats hist_type enum 14 42 utf8mb3 utf8mb3_bin enum('SINGLE_PREC_HB','DOUBLE_PREC_HB')
-1.0000 mysql column_stats histogram varbinary 255 255 NULL NULL varbinary(255)
+3.0000 mysql column_stats hist_type enum 14 42 utf8mb3 utf8mb3_bin enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB')
+1.0000 mysql column_stats histogram longblob 4294967295 4294967295 NULL NULL longblob
3.0000 mysql db Host char 255 765 utf8mb3 utf8mb3_bin char(255)
3.0000 mysql db Db char 64 192 utf8mb3 utf8mb3_bin char(64)
3.0000 mysql db User char 128 384 utf8mb3 utf8mb3_bin char(128)
diff --git a/mysql-test/suite/funcs_1/r/is_routines_embedded.result b/mysql-test/suite/funcs_1/r/is_routines_embedded.result
index 056a1fa7559..dba5e7f330e 100644
--- a/mysql-test/suite/funcs_1/r/is_routines_embedded.result
+++ b/mysql-test/suite/funcs_1/r/is_routines_embedded.result
@@ -197,7 +197,7 @@ sp_6_408002_2 def db_datadict_2 sp_6_408002_2 PROCEDURE NULL NULL NULL NULL NUL
SELECT * FROM db_datadict_2.res_6_408002_2;
END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
-check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
+check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS != 'INACTIVE'; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0, SQL_SAFE_UPDATES=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
AddGeometryColumn def mysql AddGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss mariadb.sys@localhost latin1 latin1_swedish_ci latin1_swedish_ci
@@ -213,7 +213,7 @@ sp_6_408002_2 def db_datadict_2 sp_6_408002_2 PROCEDURE NULL NULL NULL NULL NUL
SELECT * FROM db_datadict_2.res_6_408002_2;
END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
-check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
+check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS != 'INACTIVE'; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0, SQL_SAFE_UPDATES=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
AddGeometryColumn def mysql AddGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss mariadb.sys@localhost latin1 latin1_swedish_ci latin1_swedish_ci
@@ -229,7 +229,7 @@ sp_6_408002_2 def db_datadict_2 sp_6_408002_2 PROCEDURE NULL NULL NULL NULL NUL
SELECT * FROM db_datadict_2.res_6_408002_2;
END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
-check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
+check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS != 'INACTIVE'; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0, SQL_SAFE_UPDATES=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci latin1_swedish_ci
AddGeometryColumn def mysql AddGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss mariadb.sys@localhost latin1 latin1_swedish_ci latin1_swedish_ci
diff --git a/mysql-test/suite/funcs_1/r/memory_func_view.result b/mysql-test/suite/funcs_1/r/memory_func_view.result
index a9b96d15d06..e9b88b9309a 100644
--- a/mysql-test/suite/funcs_1/r/memory_func_view.result
+++ b/mysql-test/suite/funcs_1/r/memory_func_view.result
@@ -3323,9 +3323,9 @@ NULL NULL 1
-3333.33 -3333.3333 30
Warnings:
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
-Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 1
+Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 2
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
-Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 1
+Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 3
SHOW CREATE VIEW v1;
View Create View character_set_client collation_connection
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select cast(`t1_values`.`my_double` as decimal(37,2)) AS `CAST(my_double AS DECIMAL(37,2))`,`t1_values`.`my_double` AS `my_double`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci
diff --git a/mysql-test/suite/funcs_1/r/memory_trig_0102.result b/mysql-test/suite/funcs_1/r/memory_trig_0102.result
index 4608fc8302a..975c014512f 100644
--- a/mysql-test/suite/funcs_1/r/memory_trig_0102.result
+++ b/mysql-test/suite/funcs_1/r/memory_trig_0102.result
@@ -56,9 +56,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase: 3.5.1.1:
------------------
diff --git a/mysql-test/suite/funcs_1/r/memory_trig_03.result b/mysql-test/suite/funcs_1/r/memory_trig_03.result
index 07a312e992d..18d55140d67 100644
--- a/mysql-test/suite/funcs_1/r/memory_trig_03.result
+++ b/mysql-test/suite/funcs_1/r/memory_trig_03.result
@@ -56,9 +56,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase 3.5.3:
---------------
diff --git a/mysql-test/suite/funcs_1/r/memory_trig_0407.result b/mysql-test/suite/funcs_1/r/memory_trig_0407.result
index 7228c4cffd9..ceae360946c 100644
--- a/mysql-test/suite/funcs_1/r/memory_trig_0407.result
+++ b/mysql-test/suite/funcs_1/r/memory_trig_0407.result
@@ -57,9 +57,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase: 3.5:
--------------
diff --git a/mysql-test/suite/funcs_1/r/memory_trig_08.result b/mysql-test/suite/funcs_1/r/memory_trig_08.result
index 32324600ad5..c9d6454dc5b 100644
--- a/mysql-test/suite/funcs_1/r/memory_trig_08.result
+++ b/mysql-test/suite/funcs_1/r/memory_trig_08.result
@@ -57,9 +57,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase: 3.5:
--------------
diff --git a/mysql-test/suite/funcs_1/r/memory_trig_09.result b/mysql-test/suite/funcs_1/r/memory_trig_09.result
index 7579418dc1f..b3e5e109b82 100644
--- a/mysql-test/suite/funcs_1/r/memory_trig_09.result
+++ b/mysql-test/suite/funcs_1/r/memory_trig_09.result
@@ -56,9 +56,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/memory_tb3.txt'
into table tb3;
diff --git a/mysql-test/suite/funcs_1/r/memory_trig_1011ext.result b/mysql-test/suite/funcs_1/r/memory_trig_1011ext.result
index 41904bf0afd..c1b697bd599 100644
--- a/mysql-test/suite/funcs_1/r/memory_trig_1011ext.result
+++ b/mysql-test/suite/funcs_1/r/memory_trig_1011ext.result
@@ -56,9 +56,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/memory_tb3.txt'
into table tb3;
diff --git a/mysql-test/suite/funcs_1/r/myisam_func_view.result b/mysql-test/suite/funcs_1/r/myisam_func_view.result
index a9b96d15d06..e9b88b9309a 100644
--- a/mysql-test/suite/funcs_1/r/myisam_func_view.result
+++ b/mysql-test/suite/funcs_1/r/myisam_func_view.result
@@ -3323,9 +3323,9 @@ NULL NULL 1
-3333.33 -3333.3333 30
Warnings:
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
-Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 1
+Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 2
Warning 1916 Got overflow when converting '' to DECIMAL. Value truncated
-Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 1
+Warning 1264 Out of range value for column 'CAST(my_double AS DECIMAL(37,2))' at row 3
SHOW CREATE VIEW v1;
View Create View character_set_client collation_connection
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select cast(`t1_values`.`my_double` as decimal(37,2)) AS `CAST(my_double AS DECIMAL(37,2))`,`t1_values`.`my_double` AS `my_double`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci
diff --git a/mysql-test/suite/funcs_1/r/myisam_trig_0102.result b/mysql-test/suite/funcs_1/r/myisam_trig_0102.result
index 4608fc8302a..975c014512f 100644
--- a/mysql-test/suite/funcs_1/r/myisam_trig_0102.result
+++ b/mysql-test/suite/funcs_1/r/myisam_trig_0102.result
@@ -56,9 +56,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase: 3.5.1.1:
------------------
diff --git a/mysql-test/suite/funcs_1/r/myisam_trig_03.result b/mysql-test/suite/funcs_1/r/myisam_trig_03.result
index 07a312e992d..18d55140d67 100644
--- a/mysql-test/suite/funcs_1/r/myisam_trig_03.result
+++ b/mysql-test/suite/funcs_1/r/myisam_trig_03.result
@@ -56,9 +56,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase 3.5.3:
---------------
diff --git a/mysql-test/suite/funcs_1/r/myisam_trig_0407.result b/mysql-test/suite/funcs_1/r/myisam_trig_0407.result
index 7228c4cffd9..ceae360946c 100644
--- a/mysql-test/suite/funcs_1/r/myisam_trig_0407.result
+++ b/mysql-test/suite/funcs_1/r/myisam_trig_0407.result
@@ -57,9 +57,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase: 3.5:
--------------
diff --git a/mysql-test/suite/funcs_1/r/myisam_trig_08.result b/mysql-test/suite/funcs_1/r/myisam_trig_08.result
index 32324600ad5..c9d6454dc5b 100644
--- a/mysql-test/suite/funcs_1/r/myisam_trig_08.result
+++ b/mysql-test/suite/funcs_1/r/myisam_trig_08.result
@@ -57,9 +57,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
Testcase: 3.5:
--------------
diff --git a/mysql-test/suite/funcs_1/r/myisam_trig_09.result b/mysql-test/suite/funcs_1/r/myisam_trig_09.result
index 7579418dc1f..b3e5e109b82 100644
--- a/mysql-test/suite/funcs_1/r/myisam_trig_09.result
+++ b/mysql-test/suite/funcs_1/r/myisam_trig_09.result
@@ -56,9 +56,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/memory_tb3.txt'
into table tb3;
diff --git a/mysql-test/suite/funcs_1/r/myisam_trig_1011ext.result b/mysql-test/suite/funcs_1/r/myisam_trig_1011ext.result
index 8302c2bd0f9..cacef967ca9 100644
--- a/mysql-test/suite/funcs_1/r/myisam_trig_1011ext.result
+++ b/mysql-test/suite/funcs_1/r/myisam_trig_1011ext.result
@@ -56,9 +56,9 @@ f174 numeric (0),
f175 numeric (64)
) engine = <engine_to_be_used>;
Warnings:
-Note 1265 Data truncated for column 'f150' at row 1
-Note 1265 Data truncated for column 'f151' at row 1
-Note 1265 Data truncated for column 'f152' at row 1
+Note 1265 Data truncated for column 'f150' at row 0
+Note 1265 Data truncated for column 'f151' at row 0
+Note 1265 Data truncated for column 'f152' at row 0
load data infile '<MYSQLTEST_VARDIR>/std_data/funcs_1/memory_tb3.txt'
into table tb3;
diff --git a/mysql-test/suite/funcs_1/r/storedproc.result b/mysql-test/suite/funcs_1/r/storedproc.result
index c9f92d51210..efeb63ae616 100644
--- a/mysql-test/suite/funcs_1/r/storedproc.result
+++ b/mysql-test/suite/funcs_1/r/storedproc.result
@@ -106,7 +106,7 @@ CALL sp1( 34 );
@v1
3
Warnings:
-Warning 1265 Data truncated for column 'f1' at row 1
+Warning 1265 Data truncated for column 'f1' at row 0
SHOW PROCEDURE STATUS WHERE db = 'db_storedproc';
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
db_storedproc sp1 PROCEDURE root@localhost <modified> <created> INVOKER this is simple latin1 latin1_swedish_ci latin1_swedish_ci
@@ -1430,7 +1430,7 @@ f1
value1
Warnings:
Note 1291 Column 'f1' has duplicated value 'value1' in SET
-Warning 1265 Data truncated for column 'f1' at row 1
+Warning 1265 Data truncated for column 'f1' at row 0
SHOW PROCEDURE STATUS WHERE db = 'db_storedproc';
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
db_storedproc sp1 PROCEDURE root@localhost <modified> <created> INVOKER this is simple latin1 latin1_swedish_ci latin1_swedish_ci
@@ -7110,7 +7110,7 @@ CALL sp1();
x y z
000 000 000
Warnings:
-Warning 1264 Out of range value for column 'x' at row 1
+Warning 1264 Out of range value for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7148,7 +7148,7 @@ CALL sp1();
x y z
00000 00000 00000
Warnings:
-Warning 1264 Out of range value for column 'x' at row 1
+Warning 1264 Out of range value for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7186,7 +7186,7 @@ CALL sp1();
x y z
00000000 00000000 00000000
Warnings:
-Warning 1264 Out of range value for column 'x' at row 1
+Warning 1264 Out of range value for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7224,7 +7224,7 @@ CALL sp1();
x y z
0000000000 0000000000 0000000000
Warnings:
-Warning 1264 Out of range value for column 'x' at row 1
+Warning 1264 Out of range value for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7262,7 +7262,7 @@ CALL sp1();
x y z
00000000000000000000 00000000000000000000 00000000000000000000
Warnings:
-Warning 1264 Out of range value for column 'x' at row 1
+Warning 1264 Out of range value for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7282,7 +7282,7 @@ CALL sp1();
x y z
-9999999999 -9999999999 -9999999999
Warnings:
-Warning 1264 Out of range value for column 'x' at row 1
+Warning 1264 Out of range value for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7293,7 +7293,7 @@ CALL sp1();
x y z
0 0 0
Warnings:
-Note 1265 Data truncated for column 'x' at row 1
+Note 1265 Data truncated for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7304,7 +7304,7 @@ CALL sp1();
x y z
0000000000 0000000000 0000000000
Warnings:
-Warning 1264 Out of range value for column 'x' at row 1
+Warning 1264 Out of range value for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7315,7 +7315,7 @@ CALL sp1();
x y z
0000000000 0000000000 0000000000
Warnings:
-Note 1265 Data truncated for column 'x' at row 1
+Note 1265 Data truncated for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7326,7 +7326,7 @@ CALL sp1();
x y z
0 0 0
Warnings:
-Note 1265 Data truncated for column 'x' at row 1
+Note 1265 Data truncated for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7337,7 +7337,7 @@ CALL sp1();
x y z
0 0 0
Warnings:
-Note 1265 Data truncated for column 'x' at row 1
+Note 1265 Data truncated for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7348,7 +7348,7 @@ CALL sp1();
x y z
0000000000 0000000000 0000000000
Warnings:
-Note 1265 Data truncated for column 'x' at row 1
+Note 1265 Data truncated for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -7359,7 +7359,7 @@ CALL sp1();
x y z
0000000000 0000000000 0000000000
Warnings:
-Note 1265 Data truncated for column 'x' at row 1
+Note 1265 Data truncated for column 'x' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1( )
BEGIN
@@ -13769,7 +13769,7 @@ CALL sp1();
@xx
0
Warnings:
-Warning 1366 Incorrect integer value: 'asd' for column ``.``.`xx` at row 1
+Warning 1366 Incorrect integer value: 'asd' for column ``.``.`xx` at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1()
BEGIN
@@ -13797,7 +13797,7 @@ set @xx = xx;
END//
CALL sp1();
Warnings:
-Warning 1265 Data truncated for column 'xx' at row 1
+Warning 1265 Data truncated for column 'xx' at row 0
SELECT @xx;
@xx
t
@@ -13818,7 +13818,7 @@ CALL sp1();
xx
0
Warnings:
-Warning 1366 Incorrect double value: 'asd' for column ``.``.`xx` at row 1
+Warning 1366 Incorrect double value: 'asd' for column ``.``.`xx` at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1()
BEGIN
@@ -13846,7 +13846,7 @@ CALL sp1();
xx
0000-00-00 00:00:00
Warnings:
-Warning 1265 Data truncated for column 'xx' at row 1
+Warning 1265 Data truncated for column 'xx' at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1()
BEGIN
@@ -13890,7 +13890,7 @@ CALL sp1();
xx
0
Warnings:
-Warning 1366 Incorrect integer value: 'asd' for column ``.``.`xx` at row 1
+Warning 1366 Incorrect integer value: 'asd' for column ``.``.`xx` at row 0
DROP PROCEDURE IF EXISTS sp1;
CREATE PROCEDURE sp1()
BEGIN
@@ -17290,8 +17290,8 @@ CALL sp7(99999999999);
f1
9999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp8;
CREATE PROCEDURE sp8( f1 decimal (0) unsigned zerofill)
BEGIN
@@ -17302,7 +17302,7 @@ CALL sp8(999999999);
f1
1000000000
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp9;
CREATE PROCEDURE sp9( f1 decimal (0) zerofill)
BEGIN
@@ -17313,8 +17313,8 @@ CALL sp9(-1.00e+09);
f1
0000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp10;
CREATE PROCEDURE sp10( f1 decimal (0, 0))
BEGIN
@@ -17334,8 +17334,8 @@ CALL sp11(99999999999);
f1
9999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp12;
CREATE PROCEDURE sp12( f1 decimal (0, 0) unsigned zerofill)
BEGIN
@@ -17346,7 +17346,7 @@ CALL sp12(999999999);
f1
1000000000
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp13;
CREATE PROCEDURE sp13( f1 decimal (0, 0) zerofill)
BEGIN
@@ -17357,8 +17357,8 @@ CALL sp13(-1.00e+09);
f1
0000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp14;
CREATE PROCEDURE sp14( f1 decimal (63, 30))
BEGIN
@@ -17396,8 +17396,8 @@ CALL sp17(-1.00e+21);
f1
000000000000000000000000000000010.000000000000000000000000000000
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp18_d;
CREATE PROCEDURE sp18_d( f1 decimal (64))
BEGIN
@@ -17456,7 +17456,7 @@ CALL sp21(1.00e+00);
f1
0000000000000000000000000000000000000000000000000000000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp22;
CREATE PROCEDURE sp22( f1 decimal unsigned)
BEGIN
@@ -17467,7 +17467,7 @@ CALL sp22(1.00e+00);
f1
10
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp23;
CREATE PROCEDURE sp23( f1 decimal unsigned zerofill)
BEGIN
@@ -17478,7 +17478,7 @@ CALL sp23(1.00e+00);
f1
0000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp24;
CREATE PROCEDURE sp24( f1 decimal zerofill)
BEGIN
@@ -17489,8 +17489,8 @@ CALL sp24(-1.00e+09);
f1
0000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp25;
CREATE PROCEDURE sp25( f1 double)
BEGIN
@@ -17510,7 +17510,7 @@ CALL sp26(1.00e+00);
f1
10
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp27;
CREATE PROCEDURE sp27( f1 double unsigned zerofill)
BEGIN
@@ -17521,7 +17521,7 @@ CALL sp27(1.00e+00);
f1
0000000000000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp28;
CREATE PROCEDURE sp28( f1 double zerofill)
BEGIN
@@ -17532,7 +17532,7 @@ CALL sp28(1.00e+00);
f1
0000000000000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp29;
CREATE PROCEDURE sp29( f1 float)
BEGIN
@@ -17552,7 +17552,7 @@ CALL sp30(1.00e+00);
f1
10
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp31;
CREATE PROCEDURE sp31( f1 float unsigned zerofill)
BEGIN
@@ -17563,7 +17563,7 @@ CALL sp31(1.00e+00);
f1
000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp32;
CREATE PROCEDURE sp32( f1 float zerofill)
BEGIN
@@ -17574,7 +17574,7 @@ CALL sp32(1.00e+00);
f1
000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp33;
CREATE PROCEDURE sp33( f1 float(0))
BEGIN
@@ -17594,7 +17594,7 @@ CALL sp34(1.00e+00);
f1
10
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp35;
CREATE PROCEDURE sp35( f1 float(0) unsigned zerofill)
BEGIN
@@ -17605,7 +17605,7 @@ CALL sp35(1.00e+00);
f1
000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp36;
CREATE PROCEDURE sp36( f1 float(0) zerofill)
BEGIN
@@ -17616,7 +17616,7 @@ CALL sp36(1.00e+00);
f1
000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp37;
CREATE PROCEDURE sp37( f1 float(23))
BEGIN
@@ -17636,7 +17636,7 @@ CALL sp38(1.00e+00);
f1
10
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp39;
CREATE PROCEDURE sp39( f1 float(23) unsigned zerofill)
BEGIN
@@ -17647,7 +17647,7 @@ CALL sp39(1.00e+00);
f1
000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp40;
CREATE PROCEDURE sp40( f1 float(23) zerofill)
BEGIN
@@ -17658,7 +17658,7 @@ CALL sp40(1.00e+00);
f1
000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp41;
CREATE PROCEDURE sp41( f1 float(24))
BEGIN
@@ -17678,7 +17678,7 @@ CALL sp42(1.00e+00);
f1
10
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp43;
CREATE PROCEDURE sp43( f1 float(24) unsigned zerofill)
BEGIN
@@ -17689,7 +17689,7 @@ CALL sp43(1.00e+00);
f1
000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp44;
CREATE PROCEDURE sp44( f1 float(24) zerofill)
BEGIN
@@ -17700,7 +17700,7 @@ CALL sp44(1.00e+00);
f1
000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp45;
CREATE PROCEDURE sp45( f1 float(53))
BEGIN
@@ -17720,7 +17720,7 @@ CALL sp46(1.00e+00);
f1
10
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp47;
CREATE PROCEDURE sp47( f1 float(53) unsigned zerofill)
BEGIN
@@ -17731,7 +17731,7 @@ CALL sp47(1.00e+00);
f1
0000000000000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp48;
CREATE PROCEDURE sp48( f1 float(53) zerofill)
BEGIN
@@ -17742,7 +17742,7 @@ CALL sp48(1.00e+00);
f1
0000000000000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp49;
CREATE PROCEDURE sp49( f1 int)
BEGIN
@@ -17753,8 +17753,8 @@ CALL sp49(-2.15e+09);
f1
-2147483638
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp50;
CREATE PROCEDURE sp50( f1 int unsigned)
BEGIN
@@ -17792,7 +17792,7 @@ CALL sp53(-8388600);
f1
-8388598
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp54;
CREATE PROCEDURE sp54( f1 mediumint unsigned)
BEGIN
@@ -17829,7 +17829,7 @@ CALL sp57(-999999999);
f1
-1000000000
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp58;
CREATE PROCEDURE sp58( f1 numeric (0))
BEGIN
@@ -17840,7 +17840,7 @@ CALL sp58(-999999999);
f1
-1000000000
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp59;
CREATE PROCEDURE sp59( f1 numeric (0) unsigned)
BEGIN
@@ -17851,7 +17851,7 @@ CALL sp59(9999999999);
f1
9999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp60;
CREATE PROCEDURE sp60( f1 numeric (0) unsigned zerofill)
BEGIN
@@ -17862,7 +17862,7 @@ CALL sp60(99999999);
f1
0100000000
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp61;
CREATE PROCEDURE sp61( f1 numeric (0) zerofill)
BEGIN
@@ -17873,8 +17873,8 @@ CALL sp61(-99999999);
f1
0000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp62;
CREATE PROCEDURE sp62( f1 numeric (0, 0))
BEGIN
@@ -17885,7 +17885,7 @@ CALL sp62(-999999999);
f1
-1000000000
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp63;
CREATE PROCEDURE sp63( f1 numeric (0, 0) unsigned)
BEGIN
@@ -17896,7 +17896,7 @@ CALL sp63(9999999999);
f1
9999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp64;
CREATE PROCEDURE sp64( f1 numeric (0, 0) unsigned zerofill)
BEGIN
@@ -17907,7 +17907,7 @@ CALL sp64(99999999);
f1
0100000000
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp65;
CREATE PROCEDURE sp65( f1 numeric (0, 0) zerofill)
BEGIN
@@ -17918,8 +17918,8 @@ CALL sp65(-99999999);
f1
0000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp66_n;
CREATE PROCEDURE sp66_n( f1 numeric (63, 30))
BEGIN
@@ -17930,14 +17930,14 @@ CALL sp66_n(-1e+36);
f1
-999999999999999999999999999999989.999999999999999999999999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
CALL sp66_n( -1000000000000000000000000000000000000 );
f1
-999999999999999999999999999999989.999999999999999999999999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp67_nu;
CREATE PROCEDURE sp67_nu( f1 numeric (63, 30) unsigned)
BEGIN
@@ -17948,14 +17948,14 @@ CALL sp67_nu(1e+36);
f1
999999999999999999999999999999999.999999999999999999999999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
CALL sp67_nu( 1000000000000000000000000000000000000 );
f1
999999999999999999999999999999999.999999999999999999999999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp68_nuz;
CREATE PROCEDURE sp68_nuz( f1 numeric (63, 30) unsigned zerofill)
BEGIN
@@ -17966,14 +17966,14 @@ CALL sp68_nuz(1e+36);
f1
999999999999999999999999999999999.999999999999999999999999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
CALL sp68_nuz( 1000000000000000000000000000000000000 );
f1
999999999999999999999999999999999.999999999999999999999999999999
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp69_n_z;
CREATE PROCEDURE sp69_n_z( f1 numeric (63, 30) zerofill)
BEGIN
@@ -17984,14 +17984,14 @@ CALL sp69_n_z(-1e+36);
f1
000000000000000000000000000000010.000000000000000000000000000000
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
CALL sp69_n_z( -1000000000000000000000000000000000000 );
f1
000000000000000000000000000000010.000000000000000000000000000000
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp70_n;
CREATE PROCEDURE sp70_n( f1 numeric (64))
BEGIN
@@ -18050,7 +18050,7 @@ CALL sp74(999999999);
f1
1000000000
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp75;
CREATE PROCEDURE sp75( f1 numeric unsigned zerofill)
BEGIN
@@ -18061,7 +18061,7 @@ CALL sp75(999999999);
f1
1000000000
Warnings:
-Note 1265 Data truncated for column 'f1' at row 1
+Note 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp76;
CREATE PROCEDURE sp76( f1 numeric zerofill)
BEGIN
@@ -18072,8 +18072,8 @@ CALL sp76(-999999999);
f1
0000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp77;
CREATE PROCEDURE sp77( f1 real)
BEGIN
@@ -18093,7 +18093,7 @@ CALL sp78(1.1);
f1
10
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp79;
CREATE PROCEDURE sp79( f1 real unsigned zerofill)
BEGIN
@@ -18104,7 +18104,7 @@ CALL sp79(1.1);
f1
0000000000000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp80;
CREATE PROCEDURE sp80( f1 real zerofill)
BEGIN
@@ -18115,7 +18115,7 @@ CALL sp80(1.1);
f1
0000000000000000000010
Warnings:
-Warning 1264 Out of range value for column 'f1' at row 1
+Warning 1264 Out of range value for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp81;
CREATE PROCEDURE sp81( f1 smallint)
BEGIN
@@ -18235,7 +18235,7 @@ CALL sp94( 'h');
f1
a
Warnings:
-Warning 1265 Data truncated for column 'f1' at row 1
+Warning 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp95;
CREATE PROCEDURE sp95( f1 char ascii)
BEGIN
@@ -18246,7 +18246,7 @@ CALL sp95( 'h');
f1
a
Warnings:
-Warning 1265 Data truncated for column 'f1' at row 1
+Warning 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp96;
CREATE PROCEDURE sp96( f1 char binary)
BEGIN
@@ -18257,7 +18257,7 @@ CALL sp96( 'h');
f1
a
Warnings:
-Warning 1265 Data truncated for column 'f1' at row 1
+Warning 1265 Data truncated for column 'f1' at row 0
DROP PROCEDURE IF EXISTS sp97;
CREATE PROCEDURE sp97( f1 longtext)
BEGIN
@@ -18358,7 +18358,7 @@ CALL sp107(2.00e+13);
f1
returned
Warnings:
-returned 1265 Data truncated for column 'f1' at row 1
+returned 1265 Data truncated for column 'f1' at row 0
USE db_storedproc;
DROP DATABASE db1;
DROP DATABASE IF EXISTS db1;
diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def
index 2d68598c03b..bcf6078f624 100644
--- a/mysql-test/suite/galera/disabled.def
+++ b/mysql-test/suite/galera/disabled.def
@@ -25,4 +25,5 @@ galera_wan : [ERROR] WSREP: /home/buildbot/buildbot/build/gcs/src/gcs_state_msg.
galera_var_ignore_apply_errors : 28: "Server did not transition to READY state"
galera_bf_kill_debug : timeout after 900 seconds
galera_ssl_upgrade : [Warning] Failed to load slave replication state from table mysql.gtid_slave_pos: 130: Incorrect file format 'gtid_slave_pos'
+galera_parallel_simple : timeout related to wsrep_sync_wait
galera_insert_bulk : MDEV-30536 no expected deadlock in galera_insert_bulk test
diff --git a/mysql-test/suite/galera/include/have_wsrep_replicate_myisam.inc b/mysql-test/suite/galera/include/have_wsrep_replicate_myisam.inc
deleted file mode 100644
index 726fc6e2b18..00000000000
--- a/mysql-test/suite/galera/include/have_wsrep_replicate_myisam.inc
+++ /dev/null
@@ -1,4 +0,0 @@
---require suite/galera/r/have_wsrep_replicate_myisam.require
-disable_query_log;
-SHOW VARIABLES LIKE 'wsrep_replicate_myisam';
-enable_query_log;
diff --git a/mysql-test/suite/galera/r/MDEV-27001.result b/mysql-test/suite/galera/r/MDEV-27001.result
new file mode 100644
index 00000000000..f2dc6a9a937
--- /dev/null
+++ b/mysql-test/suite/galera/r/MDEV-27001.result
@@ -0,0 +1,6 @@
+connection node_2;
+connection node_1;
+CREATE TABLE t3 (c INT) PARTITION BY RANGE (c) (PARTITION p1 VALUES LESS THAN (1000));
+CREATE TABLE tp2 (c INT);
+ALTER TABLE t3 CONVERT TABLE tp2 TO PARTITION p2 VALUES LESS THAN (2000);
+DROP TABLE t3;
diff --git a/mysql-test/suite/galera/r/MW-416.result b/mysql-test/suite/galera/r/MW-416.result
index ae95b832802..98a72c8d46b 100644
--- a/mysql-test/suite/galera/r/MW-416.result
+++ b/mysql-test/suite/galera/r/MW-416.result
@@ -10,16 +10,12 @@ ALTER EVENT ev1 RENAME TO ev2;
ERROR 42000: Access denied for user 'userMW416'@'localhost' to database 'test'
ALTER FUNCTION fun1 COMMENT 'foo';
ERROR 42000: alter routine command denied to user 'userMW416'@'localhost' for routine 'test.fun1'
-ALTER LOGFILE GROUP lfg ADD UNDOFILE 'file' ENGINE=InnoDB;
-Got one of the listed errors
ALTER PROCEDURE proc1 COMMENT 'foo';
Got one of the listed errors
ALTER SERVER srv OPTIONS (USER 'sally');
Got one of the listed errors
ALTER TABLE tbl DROP COLUMN col;
Got one of the listed errors
-ALTER TABLESPACE tblspc DROP DATAFILE 'file' ENGINE=innodb;
-Got one of the listed errors
ALTER VIEW vw AS SELECT 1;
Got one of the listed errors
CREATE DATABASE db;
@@ -34,14 +30,10 @@ CREATE PROCEDURE proc1() BEGIN END;
Got one of the listed errors
CREATE INDEX idx ON tbl(id);
Got one of the listed errors
-CREATE LOGFILE GROUP lfg ADD UNDOFILE 'undofile' ENGINE innodb;
-Got one of the listed errors
CREATE SERVER srv FOREIGN DATA WRAPPER 'fdw' OPTIONS (USER 'user');
Got one of the listed errors
CREATE TABLE t (i int);
Got one of the listed errors
-CREATE TABLESPACE tblspc ADD DATAFILE 'file' ENGINE=innodb;
-Got one of the listed errors
CREATE TRIGGER trg BEFORE UPDATE ON t FOR EACH ROW BEGIN END;
Got one of the listed errors
CREATE VIEW vw AS SELECT 1;
@@ -54,16 +46,12 @@ DROP FUNCTION fun1;
Got one of the listed errors
DROP INDEX idx ON t0;
Got one of the listed errors
-DROP LOGFILE GROUP lfg;
-Got one of the listed errors
DROP PROCEDURE proc1;
Got one of the listed errors
DROP SERVEr srv;
Got one of the listed errors
DROP TABLE t0;
Got one of the listed errors
-DROP TABLESPACE tblspc;
-Got one of the listed errors
DROP TRIGGER trg;
Got one of the listed errors
DROP VIEW vw;
diff --git a/mysql-test/suite/galera/r/galera_as_slave.result b/mysql-test/suite/galera/r/galera_as_slave.result
index 391ceecd509..1035fe1e9be 100644
--- a/mysql-test/suite/galera/r/galera_as_slave.result
+++ b/mysql-test/suite/galera/r/galera_as_slave.result
@@ -18,6 +18,12 @@ SELECT COUNT(*) = 3 FROM t1;
COUNT(*) = 3
1
connection node_3;
+SET @@session.binlog_alter_two_phase = 1;
+ALTER TABLE t1 ADD COLUMN f2 INT;
+INSERT INTO t1 VALUES (4,1);
+connection node_1;
+connection node_2;
+connection node_3;
DROP TABLE t1;
connection node_2;
STOP SLAVE;
diff --git a/mysql-test/suite/galera/r/galera_defaults.result b/mysql-test/suite/galera/r/galera_defaults.result
index bc9927b21d9..d6bbcbae680 100644
--- a/mysql-test/suite/galera/r/galera_defaults.result
+++ b/mysql-test/suite/galera/r/galera_defaults.result
@@ -1,9 +1,9 @@
connection node_2;
connection node_1;
# Correct Galera library found
-SELECT COUNT(*) `expect 51` FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%';
-expect 51
-51
+SELECT COUNT(*) `expect 50` FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%';
+expect 50
+49
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME LIKE 'wsrep_%'
@@ -47,7 +47,6 @@ WSREP_ON ON
WSREP_OSU_METHOD TOI
WSREP_RECOVER OFF
WSREP_REJECT_QUERIES NONE
-WSREP_REPLICATE_MYISAM OFF
WSREP_RESTART_SLAVE OFF
WSREP_RETRY_AUTOCOMMIT 1
WSREP_SLAVE_FK_CHECKS ON
@@ -58,7 +57,6 @@ WSREP_SST_AUTH
WSREP_SST_DONOR
WSREP_SST_DONOR_REJECTS_QUERIES OFF
WSREP_SST_METHOD rsync
-WSREP_STRICT_DDL OFF
WSREP_SYNC_WAIT 15
WSREP_TRX_FRAGMENT_SIZE 0
WSREP_TRX_FRAGMENT_UNIT bytes
diff --git a/mysql-test/suite/galera/r/galera_myisam_transactions.result b/mysql-test/suite/galera/r/galera_myisam_transactions.result
index 04f68c29305..6afcda47a23 100644
--- a/mysql-test/suite/galera/r/galera_myisam_transactions.result
+++ b/mysql-test/suite/galera/r/galera_myisam_transactions.result
@@ -38,9 +38,7 @@ COUNT(*) = 0
1
DROP TABLE t1, t2, t3;
SET SESSION lock_wait_timeout=2;
-SET GLOBAL wsrep_replicate_myisam= ON;
-Warnings:
-Warning 1287 '@@wsrep_replicate_myisam' is deprecated and will be removed in a future release. Please use '@@wsrep_mode=REPLICATE_MYISAM' instead
+SET GLOBAL wsrep_mode = REPLICATE_MYISAM;
CREATE TEMPORARY TABLE t1 (i INT, PRIMARY KEY pk (i)) ENGINE=MyISAM;
Warnings:
Warning 1280 Name 'pk' ignored for PRIMARY key.
@@ -49,6 +47,4 @@ INSERT INTO t1 VALUES(4);
DEALLOCATE PREPARE stmt;
COMMIT;
DROP TABLE t1;
-SET GLOBAL wsrep_replicate_myisam=OFF;
-Warnings:
-Warning 1287 '@@wsrep_replicate_myisam' is deprecated and will be removed in a future release. Please use '@@wsrep_mode=REPLICATE_MYISAM' instead
+SET GLOBAL wsrep_mode = DEFAULT;
diff --git a/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result b/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result
index 48625b3ba4a..a15b0c7df69 100644
--- a/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result
+++ b/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result
@@ -10,31 +10,31 @@ INSERT INTO t1 VALUES (1);
INSERT INTO t2 VALUES (1);
connection node_2a;
SET SESSION wsrep_sync_wait=0;
-SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committing%';
-COUNT(*) = 1
+SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committing%' or STATE = 'Waiting for certification');
+EXPECT_1
1
-SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%';
-COUNT(*) = 1
-1
-SELECT COUNT(*) = 0 FROM t1;
-COUNT(*) = 0
-1
-SELECT COUNT(*) = 0 FROM t2;
-COUNT(*) = 0
+SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%';
+EXPECT_1
1
+SELECT COUNT(*) AS EXPECT_0 FROM t1;
+EXPECT_0
+0
+SELECT COUNT(*) AS EXPECT_0 FROM t2;
+EXPECT_0
+0
connection node_2;
UNLOCK TABLES;
connection node_2a;
SET SESSION wsrep_sync_wait = 15;;
-SELECT COUNT(*) = 1 FROM t1;
-COUNT(*) = 1
-1
-SELECT COUNT(*) = 1 FROM t2;
-COUNT(*) = 1
+SELECT COUNT(*) AS EXPECT_1 FROM t1;
+EXPECT_1
1
-SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committed%';
-COUNT(*) = 2
+SELECT COUNT(*) AS EXPECT_1 FROM t2;
+EXPECT_1
1
+SELECT COUNT(*) AS EXPECT_2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committed%' or STATE = 'Waiting for certification');
+EXPECT_2
+2
SET GLOBAL wsrep_slave_threads = 1;;
DROP TABLE t1;
DROP TABLE t2;
diff --git a/mysql-test/suite/galera/r/galera_var_wsrep_strict_ddl.result b/mysql-test/suite/galera/r/galera_var_wsrep_strict_ddl.result
deleted file mode 100644
index d53708b3504..00000000000
--- a/mysql-test/suite/galera/r/galera_var_wsrep_strict_ddl.result
+++ /dev/null
@@ -1,26 +0,0 @@
-connection node_2;
-connection node_1;
-SELECT @@global.wsrep_mode;
-@@global.wsrep_mode
-
-SELECT @@global.wsrep_strict_ddl;
-@@global.wsrep_strict_ddl
-0
-SET @@global.wsrep_strict_ddl=ON;
-Warnings:
-Warning 1287 '@@wsrep_strict_ddl' is deprecated and will be removed in a future release. Please use '@@wsrep_mode=STRICT_REPLICATION' instead
-SELECT @@global.wsrep_mode;
-@@global.wsrep_mode
-STRICT_REPLICATION
-SELECT @@global.wsrep_strict_ddl;
-@@global.wsrep_strict_ddl
-1
-SET @@global.wsrep_strict_ddl=OFF;
-Warnings:
-Warning 1287 '@@wsrep_strict_ddl' is deprecated and will be removed in a future release. Please use '@@wsrep_mode=STRICT_REPLICATION' instead
-SELECT @@global.wsrep_mode;
-@@global.wsrep_mode
-
-SELECT @@global.wsrep_strict_ddl;
-@@global.wsrep_strict_ddl
-0
diff --git a/mysql-test/suite/galera/t/MDEV-27001.opt b/mysql-test/suite/galera/t/MDEV-27001.opt
new file mode 100644
index 00000000000..c62d74cb249
--- /dev/null
+++ b/mysql-test/suite/galera/t/MDEV-27001.opt
@@ -0,0 +1 @@
+--partition=ON \ No newline at end of file
diff --git a/mysql-test/suite/galera/t/MDEV-27001.test b/mysql-test/suite/galera/t/MDEV-27001.test
new file mode 100644
index 00000000000..fb5f57f53e5
--- /dev/null
+++ b/mysql-test/suite/galera/t/MDEV-27001.test
@@ -0,0 +1,7 @@
+--source include/galera_cluster.inc
+--source include/have_innodb.inc
+
+CREATE TABLE t3 (c INT) PARTITION BY RANGE (c) (PARTITION p1 VALUES LESS THAN (1000));
+CREATE TABLE tp2 (c INT);
+ALTER TABLE t3 CONVERT TABLE tp2 TO PARTITION p2 VALUES LESS THAN (2000);
+DROP TABLE t3; \ No newline at end of file
diff --git a/mysql-test/suite/galera/t/MW-416.test b/mysql-test/suite/galera/t/MW-416.test
index f9a1b47e2ff..f86ffcbf512 100644
--- a/mysql-test/suite/galera/t/MW-416.test
+++ b/mysql-test/suite/galera/t/MW-416.test
@@ -19,16 +19,12 @@ ALTER EVENT ev1 RENAME TO ev2;
ALTER FUNCTION fun1 COMMENT 'foo';
#--error 1044,1227
#ALTER INSTANCE ROTATE INNODB MASTER KEY;
---error 1044,1227
-ALTER LOGFILE GROUP lfg ADD UNDOFILE 'file' ENGINE=InnoDB;
--error 1044,1227,1370
ALTER PROCEDURE proc1 COMMENT 'foo';
--error 1044,1227,1370
ALTER SERVER srv OPTIONS (USER 'sally');
--error 1044,1142,1227,1370
ALTER TABLE tbl DROP COLUMN col;
---error 1044,1227,1370
-ALTER TABLESPACE tblspc DROP DATAFILE 'file' ENGINE=innodb;
--error 1044,1142,1227,1370
ALTER VIEW vw AS SELECT 1;
@@ -45,14 +41,10 @@ CREATE PROCEDURE proc1() BEGIN END;
--error 1044,1142,1227,1370
CREATE INDEX idx ON tbl(id);
--error 1044,1142,1227,1370
-CREATE LOGFILE GROUP lfg ADD UNDOFILE 'undofile' ENGINE innodb;
---error 1044,1142,1227,1370
CREATE SERVER srv FOREIGN DATA WRAPPER 'fdw' OPTIONS (USER 'user');
--error 1044,1142,1227,1370
CREATE TABLE t (i int);
--error 1044,1142,1227,1370
-CREATE TABLESPACE tblspc ADD DATAFILE 'file' ENGINE=innodb;
---error 1044,1142,1227,1370
CREATE TRIGGER trg BEFORE UPDATE ON t FOR EACH ROW BEGIN END;
--error 1044,1142,1227,1370
CREATE VIEW vw AS SELECT 1;
@@ -67,16 +59,12 @@ DROP EVENT ev;
DROP FUNCTION fun1;
--error 1044,1142,1227,1370
DROP INDEX idx ON t0;
---error 1044,1142,1227,1370,1064
-DROP LOGFILE GROUP lfg;
--error 1044,1142,1227,1370
DROP PROCEDURE proc1;
--error 1044,1142,1227,1370
DROP SERVEr srv;
--error 1044,1142,1227,1370
DROP TABLE t0;
---error 1044,1142,1227,1370,1064
-DROP TABLESPACE tblspc;
--error 1044,1142,1227,1360,1370
DROP TRIGGER trg;
--error 1044,1142,1227,1370
diff --git a/mysql-test/suite/galera/t/galera_as_slave.test b/mysql-test/suite/galera/t/galera_as_slave.test
index da92437b118..859fe19c9bb 100644
--- a/mysql-test/suite/galera/t/galera_as_slave.test
+++ b/mysql-test/suite/galera/t/galera_as_slave.test
@@ -38,8 +38,24 @@ INSERT INTO t1 VALUES (3);
SELECT COUNT(*) = 3 FROM t1;
--connection node_3
+SET @@session.binlog_alter_two_phase = 1;
+ALTER TABLE t1 ADD COLUMN f2 INT;
+INSERT INTO t1 VALUES (4,1);
+
+--connection node_1
+--let $count = 4
+--let $table = t1
+--source include/wait_until_rows_count.inc
+
+--connection node_2
+--let $count = 4
+--let $table = t1
+--source include/wait_until_rows_count.inc
+
+--connection node_3
DROP TABLE t1;
+
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
--source include/wait_condition.inc
diff --git a/mysql-test/suite/galera/t/galera_backup_stage.test b/mysql-test/suite/galera/t/galera_backup_stage.test
index 31d76816355..20ce6036d0d 100644
--- a/mysql-test/suite/galera/t/galera_backup_stage.test
+++ b/mysql-test/suite/galera/t/galera_backup_stage.test
@@ -56,7 +56,7 @@ ALTER TABLE t1 ADD COLUMN (f4 int(10));
# reach commit stage. In the unlikely case the interleaving is different, the
# result of the test should not change.
--connection node_1c
---let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE State='Commit' AND ID=$insert_id
+--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE (State='Commit' OR State='Waiting for certification') AND ID=$insert_id
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.metadata_lock_info WHERE TABLE_NAME='t1' AND THREAD_ID=$insert_id
--source include/wait_condition.inc
@@ -83,11 +83,11 @@ ALTER TABLE t1 ADD COLUMN (f4 int(10));
# wait for insert to get blocked
--connection node_1c
---let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE State='Commit' AND ID=$insert_id
+--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE (State='Commit' OR State='Waiting for certification') AND ID=$insert_id
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.metadata_lock_info WHERE TABLE_NAME='t1' AND THREAD_ID=$insert_id
--source include/wait_condition.inc
---let $wait_condition = SELECT COUNT(*)=2 FROM information_schema.processlist WHERE Info like 'INSERT INTO t1 (f1) values("node1%")' AND State = 'Commit'
+--let $wait_condition = SELECT COUNT(*)=2 FROM information_schema.processlist WHERE Info like 'INSERT INTO t1 (f1) values("node1%")' AND (State = 'Commit' OR State='Waiting for certification')
--source include/wait_condition.inc
# nothing after BLOCK_DDL is applied
diff --git a/mysql-test/suite/galera/t/galera_defaults.test b/mysql-test/suite/galera/t/galera_defaults.test
index 96389e44d3f..6b76473d6a6 100644
--- a/mysql-test/suite/galera/t/galera_defaults.test
+++ b/mysql-test/suite/galera/t/galera_defaults.test
@@ -18,7 +18,7 @@ source ../wsrep/include/check_galera_version.inc;
# Global Variables
-SELECT COUNT(*) `expect 51` FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%';
+SELECT COUNT(*) `expect 50` FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%';
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
diff --git a/mysql-test/suite/galera/t/galera_myisam_transactions.test b/mysql-test/suite/galera/t/galera_myisam_transactions.test
index 30677ddbe4d..808aebdcbe4 100644
--- a/mysql-test/suite/galera/t/galera_myisam_transactions.test
+++ b/mysql-test/suite/galera/t/galera_myisam_transactions.test
@@ -39,11 +39,11 @@ DROP TABLE t1, t2, t3;
# MDEV-25201 : Assertion `thd->wsrep_trx_meta.gtid.seqno == (-1)' failed in int wsrep_to_isolation_begin(THD*, const char*, const char*, const TABLE_LIST*, Alter_info*)
#
SET SESSION lock_wait_timeout=2;
-SET GLOBAL wsrep_replicate_myisam= ON;
+SET GLOBAL wsrep_mode = REPLICATE_MYISAM;
CREATE TEMPORARY TABLE t1 (i INT, PRIMARY KEY pk (i)) ENGINE=MyISAM;
PREPARE stmt FROM "INSERT INTO t1 (id) SELECT * FROM (SELECT 4 AS i) AS y";
INSERT INTO t1 VALUES(4);
DEALLOCATE PREPARE stmt;
COMMIT;
DROP TABLE t1;
-SET GLOBAL wsrep_replicate_myisam=OFF;
+SET GLOBAL wsrep_mode = DEFAULT;
diff --git a/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test b/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test
index 5a33c16c86e..2e9f05cb4af 100644
--- a/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test
+++ b/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test
@@ -32,19 +32,19 @@ INSERT INTO t2 VALUES (1);
--connection node_2a
--sleep 1
SET SESSION wsrep_sync_wait=0;
-SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committing%';
-SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%';
-SELECT COUNT(*) = 0 FROM t1;
-SELECT COUNT(*) = 0 FROM t2;
+SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committing%' or STATE = 'Waiting for certification');
+SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%';
+SELECT COUNT(*) AS EXPECT_0 FROM t1;
+SELECT COUNT(*) AS EXPECT_0 FROM t2;
--connection node_2
UNLOCK TABLES;
--connection node_2a
--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig;
-SELECT COUNT(*) = 1 FROM t1;
-SELECT COUNT(*) = 1 FROM t2;
-SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committed%';
+SELECT COUNT(*) AS EXPECT_1 FROM t1;
+SELECT COUNT(*) AS EXPECT_1 FROM t2;
+SELECT COUNT(*) AS EXPECT_2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committed%' or STATE = 'Waiting for certification');
--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig;
DROP TABLE t1;
diff --git a/mysql-test/suite/galera/t/galera_var_wsrep_strict_ddl.test b/mysql-test/suite/galera/t/galera_var_wsrep_strict_ddl.test
deleted file mode 100644
index 2aa76d46f82..00000000000
--- a/mysql-test/suite/galera/t/galera_var_wsrep_strict_ddl.test
+++ /dev/null
@@ -1,13 +0,0 @@
---source include/galera_cluster.inc
-
-SELECT @@global.wsrep_mode;
-SELECT @@global.wsrep_strict_ddl;
-
-SET @@global.wsrep_strict_ddl=ON;
-SELECT @@global.wsrep_mode;
-SELECT @@global.wsrep_strict_ddl;
-
-SET @@global.wsrep_strict_ddl=OFF;
-SELECT @@global.wsrep_mode;
-SELECT @@global.wsrep_strict_ddl;
-
diff --git a/mysql-test/suite/galera_3nodes/disabled.def b/mysql-test/suite/galera_3nodes/disabled.def
index ae99ffe98ec..b51d221e72f 100644
--- a/mysql-test/suite/galera_3nodes/disabled.def
+++ b/mysql-test/suite/galera_3nodes/disabled.def
@@ -12,6 +12,8 @@
galera_2_cluster : MDEV-29877 Galera test failure on galera_2_cluster
galera_gtid_2_cluster : MDEV-29877 Galera test failure on galera_2_cluster
+galera_ipv6_mariabackup : MDEV-24097
+galera_ipv6_mariabackup_section : MDEV-24097, MDEV-22195
galera_vote_rejoin_mysqldump : MDEV-24481: galera_3nodes.galera_vote_rejoin_mysqldump MTR failed: mysql_shutdown failed
galera_ssl_reload : MDEV-30172 At line 50: mysql_shutdown failed
GCF-354 : mysqltest: At line 39: query 'DROP TABLE test.t1' failed: 1047: WSREP has not yet prepared node for application use
diff --git a/mysql-test/suite/galera_3nodes/r/GCF-363.result b/mysql-test/suite/galera_3nodes/r/GCF-363.result
index d7078227ec3..fb235aceb77 100644
--- a/mysql-test/suite/galera_3nodes/r/GCF-363.result
+++ b/mysql-test/suite/galera_3nodes/r/GCF-363.result
@@ -1,8 +1,9 @@
connection node_2;
connection node_1;
-connection node_1;
+connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_1;
connection node_2;
+connection node_3;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB;
SET GLOBAL wsrep_on=OFF;
@@ -12,7 +13,6 @@ connection node_2;
SET GLOBAL wsrep_on=OFF;
INSERT INTO t1 VALUES (1, 'a');
SET GLOBAL wsrep_on=ON;
-connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_3;
INSERT INTO t1 VALUES (1, 'b');
SET SESSION wsrep_sync_wait = 0;
diff --git a/mysql-test/suite/galera_3nodes/t/GCF-363.test b/mysql-test/suite/galera_3nodes/t/GCF-363.test
index 5867247e6ee..17c510e7c9c 100644
--- a/mysql-test/suite/galera_3nodes/t/GCF-363.test
+++ b/mysql-test/suite/galera_3nodes/t/GCF-363.test
@@ -5,10 +5,12 @@
--source include/galera_cluster.inc
--source include/have_innodb.inc
---connection node_1
+--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
+
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
+--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc
--connection node_1
@@ -26,7 +28,6 @@ SET GLOBAL wsrep_on=OFF;
INSERT INTO t1 VALUES (1, 'a');
SET GLOBAL wsrep_on=ON;
---connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connection node_3
INSERT INTO t1 VALUES (1, 'b');
SET SESSION wsrep_sync_wait = 0;
@@ -72,4 +73,3 @@ CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
--connection node_1
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
-
diff --git a/mysql-test/suite/gcol/inc/gcol_column_def_options.inc b/mysql-test/suite/gcol/inc/gcol_column_def_options.inc
index f4f654c9f46..d4db5b5de76 100644
--- a/mysql-test/suite/gcol/inc/gcol_column_def_options.inc
+++ b/mysql-test/suite/gcol/inc/gcol_column_def_options.inc
@@ -150,7 +150,7 @@ drop table t2;
--echo FK options
create table t1(a int, b int as (a % 2), c int as (a) stored);
create table t2 (a int);
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 add constraint foreign key fk(d) references t2(a);
if ($support_virtual_foreign)
{
diff --git a/mysql-test/suite/gcol/inc/gcol_supported_sql_funcs_main.inc b/mysql-test/suite/gcol/inc/gcol_supported_sql_funcs_main.inc
index 3f48f86ce7c..3bb44523e64 100644
--- a/mysql-test/suite/gcol/inc/gcol_supported_sql_funcs_main.inc
+++ b/mysql-test/suite/gcol/inc/gcol_supported_sql_funcs_main.inc
@@ -1192,18 +1192,6 @@ let $values1 = 'any value',default;
let $rows = 1;
--source suite/gcol/inc/gcol_supported_sql_funcs.inc
---echo # DES_ENCRYPT(), DES_DECRYPT()
---source include/have_ssl_crypto_functs.inc
-let $cols = a varchar(1024), b varchar(1024) generated always as (des_encrypt(des_decrypt(a,'adf'),'adf')) virtual;
-let $values1 = 'MySQL',default;
---disable_warnings
-eval create table t1 ($cols);
-show create table t1;
---enable_warnings
-eval insert into t1 values ($values1);
-select * from t1;
-drop table t1;
-
--echo # INET_ATON(), INET_NTOA()
let $cols = a varchar(1024), b varchar(1024) generated always as (inet_ntoa(inet_aton(a))) virtual;
let $values1 = '127.0.0.1',default;
diff --git a/mysql-test/suite/gcol/r/gcol_keys_innodb.result b/mysql-test/suite/gcol/r/gcol_keys_innodb.result
index 06c2553a93c..0228f9be842 100644
--- a/mysql-test/suite/gcol/r/gcol_keys_innodb.result
+++ b/mysql-test/suite/gcol/r/gcol_keys_innodb.result
@@ -695,7 +695,7 @@ a b c
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
ALTER TABLE t ADD UNIQUE INDEX (c(1));
Warnings:
-Warning 1264 Out of range value for column 'b' at row 1
+Warning 1264 Out of range value for column 'b' at row 0
SELECT * FROM t WHERE c = '0';
a b c
1 127 0
diff --git a/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result b/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result
index 4fc4801482b..9929f4d1eaa 100644
--- a/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result
+++ b/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result
@@ -2889,20 +2889,6 @@ a b
any value any value
drop table t1;
set sql_warnings = 0;
-# DES_ENCRYPT(), DES_DECRYPT()
-create table t1 (a varchar(1024), b varchar(1024) generated always as (des_encrypt(des_decrypt(a,'adf'),'adf')) virtual);
-show create table t1;
-Table Create Table
-t1 CREATE TABLE `t1` (
- `a` varchar(1024) DEFAULT NULL,
- `b` varchar(1024) GENERATED ALWAYS AS (des_encrypt(des_decrypt(`a`,'adf'),'adf')) VIRTUAL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-insert into t1 values ('MySQL',default);
-select * from t1;
-a b
-MySQL ÿw2¥ð
-èõÁ
-drop table t1;
# INET_ATON(), INET_NTOA()
set sql_warnings = 1;
create table t1 (a varchar(1024), b varchar(1024) generated always as (inet_ntoa(inet_aton(a))) virtual);
diff --git a/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_myisam.result b/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_myisam.result
index 7ddcd4f36ff..802e830a587 100644
--- a/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_myisam.result
+++ b/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_myisam.result
@@ -2889,20 +2889,6 @@ a b
any value any value
drop table t1;
set sql_warnings = 0;
-# DES_ENCRYPT(), DES_DECRYPT()
-create table t1 (a varchar(1024), b varchar(1024) generated always as (des_encrypt(des_decrypt(a,'adf'),'adf')) virtual);
-show create table t1;
-Table Create Table
-t1 CREATE TABLE `t1` (
- `a` varchar(1024) DEFAULT NULL,
- `b` varchar(1024) GENERATED ALWAYS AS (des_encrypt(des_decrypt(`a`,'adf'),'adf')) VIRTUAL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-insert into t1 values ('MySQL',default);
-select * from t1;
-a b
-MySQL ÿw2¥ð
-èõÁ
-drop table t1;
# INET_ATON(), INET_NTOA()
set sql_warnings = 1;
create table t1 (a varchar(1024), b varchar(1024) generated always as (inet_ntoa(inet_aton(a))) virtual);
diff --git a/mysql-test/suite/gcol/r/innodb_virtual_index.result b/mysql-test/suite/gcol/r/innodb_virtual_index.result
index b0c29da2f22..52203c0610c 100644
--- a/mysql-test/suite/gcol/r/innodb_virtual_index.result
+++ b/mysql-test/suite/gcol/r/innodb_virtual_index.result
@@ -284,7 +284,7 @@ INSERT IGNORE INTO t1 (id, a) VALUES (NULL, -1);
Warnings:
Warning 1264 Out of range value for column 'va' at row 1
ALTER TABLE t1 FORCE;
-ERROR 22003: Out of range value for column 'va' at row 1
+ERROR 22003: Out of range value for column 'va' at row 0
DROP TABLE t1;
#
# MDEV-24713 Assertion `dict_table_is_comp(index->table)' failed
diff --git a/mysql-test/suite/heap/heap_hash.result b/mysql-test/suite/heap/heap_hash.result
index 6bc9ff0d527..e523920bcd0 100644
--- a/mysql-test/suite/heap/heap_hash.result
+++ b/mysql-test/suite/heap/heap_hash.result
@@ -1,4 +1,3 @@
-drop table if exists t1,t2;
create table t1 (a int not null,b int not null, primary key using HASH (a)) engine=heap comment="testing heaps" avg_row_length=100 min_rows=1 max_rows=100;
insert into t1 values(1,1),(2,2),(3,3),(4,4);
delete from t1 where a=1 or a=0;
@@ -467,4 +466,23 @@ SELECT * FROM t1 WHERE c1='bar2';
c1
bar2
DROP TABLE t1;
-End of 5.5 tests
+#
+# End of 5.5 tests
+#
+#
+# MDEV-27406 Index on a HEAP table retains DESC attribute despite being hash
+#
+create table t1 (a int, key(a desc)) engine=memory;
+show index from t1;
+Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored
+t1 1 a 1 a NULL 0 NULL NULL YES HASH NO
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+drop table t1;
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/suite/heap/heap_hash.test b/mysql-test/suite/heap/heap_hash.test
index 3a8979a2393..3d3855d8062 100644
--- a/mysql-test/suite/heap/heap_hash.test
+++ b/mysql-test/suite/heap/heap_hash.test
@@ -2,10 +2,6 @@
# Test of heap tables.
#
---disable_warnings
-drop table if exists t1,t2;
---enable_warnings
-
create table t1 (a int not null,b int not null, primary key using HASH (a)) engine=heap comment="testing heaps" avg_row_length=100 min_rows=1 max_rows=100;
insert into t1 values(1,1),(2,2),(3,3),(4,4);
delete from t1 where a=1 or a=0;
@@ -346,4 +342,18 @@ explain SELECT * FROM t1 WHERE c1='bar2';
SELECT * FROM t1 WHERE c1='bar2';
DROP TABLE t1;
---echo End of 5.5 tests
+--echo #
+--echo # End of 5.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-27406 Index on a HEAP table retains DESC attribute despite being hash
+--echo #
+create table t1 (a int, key(a desc)) engine=memory;
+show index from t1;
+show create table t1;
+drop table t1;
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/suite/innodb/include/have_innodb_bzip2.opt b/mysql-test/suite/innodb/include/have_innodb_bzip2.opt
new file mode 100644
index 00000000000..64680f7b988
--- /dev/null
+++ b/mysql-test/suite/innodb/include/have_innodb_bzip2.opt
@@ -0,0 +1 @@
+--plugin-load-add=$PROVIDER_BZIP2_SO
diff --git a/mysql-test/suite/innodb/include/have_innodb_lz4.opt b/mysql-test/suite/innodb/include/have_innodb_lz4.opt
new file mode 100644
index 00000000000..eac86deee3a
--- /dev/null
+++ b/mysql-test/suite/innodb/include/have_innodb_lz4.opt
@@ -0,0 +1,2 @@
+--plugin-load-add=$PROVIDER_LZ4_SO
+
diff --git a/mysql-test/suite/innodb/include/have_innodb_lzma.opt b/mysql-test/suite/innodb/include/have_innodb_lzma.opt
new file mode 100644
index 00000000000..ecb6bd7a614
--- /dev/null
+++ b/mysql-test/suite/innodb/include/have_innodb_lzma.opt
@@ -0,0 +1,2 @@
+--plugin-load-add=$PROVIDER_LZMA_SO
+
diff --git a/mysql-test/suite/innodb/include/have_innodb_lzo.opt b/mysql-test/suite/innodb/include/have_innodb_lzo.opt
new file mode 100644
index 00000000000..6033fc5d81c
--- /dev/null
+++ b/mysql-test/suite/innodb/include/have_innodb_lzo.opt
@@ -0,0 +1,2 @@
+--plugin-load-add=$PROVIDER_LZO_SO
+
diff --git a/mysql-test/suite/innodb/include/have_innodb_snappy.opt b/mysql-test/suite/innodb/include/have_innodb_snappy.opt
new file mode 100644
index 00000000000..80c3325a6aa
--- /dev/null
+++ b/mysql-test/suite/innodb/include/have_innodb_snappy.opt
@@ -0,0 +1,2 @@
+--plugin-load-add=$PROVIDER_SNAPPY_SO
+
diff --git a/mysql-test/suite/innodb/include/no_checkpoint_end.inc b/mysql-test/suite/innodb/include/no_checkpoint_end.inc
index 4a00dadfd6e..61721650f32 100644
--- a/mysql-test/suite/innodb/include/no_checkpoint_end.inc
+++ b/mysql-test/suite/innodb/include/no_checkpoint_end.inc
@@ -10,12 +10,12 @@ my $cp = $ENV{CHECKPOINT_LSN};
$cp =~ s/^InnoDB\t\t//;
my $log = "$ENV{MYSQLD_DATADIR}ib_logfile0";
open(LOG, "<$log") || die "Unable to open $log";
-seek(LOG, 512, 0) || die "Unable to seek $log";
-die unless read(LOG, $_, 16) == 16;
-my ($no1hi,$no1lo,$cp1hi,$cp1lo) = unpack("N*", $_);
-seek(LOG, 3 * 512, 0) || die "Unable to seek $log";
-die unless read(LOG, $_, 16) == 16;
-my ($no2hi,$no2lo,$cp2hi,$cp2lo) = unpack("N*", $_);
+seek(LOG, 4096, 0) || die "Unable to seek $log";
+die unless read(LOG, $_, 8) == 8;
+my ($cp1hi,$cp1lo) = unpack("NN", $_);
+seek(LOG, 8192, 0) || die "Unable to seek $log";
+die unless read(LOG, $_, 8) == 8;
+my ($cp2hi,$cp2lo) = unpack("NN", $_);
close(LOG);
my $cp1 = $cp1hi << 32 | $cp1lo;
@@ -27,8 +27,7 @@ if ($cp1 > $cp || $cp2 > $cp) {
print OUT "--source include/start_mysqld.inc\n"
unless $ENV{no_checkpoint_kill};
print OUT "$ENV{CLEANUP_IF_CHECKPOINT}\n";
- print OUT "--skip Extra checkpoint 1 after $cp";
- print OUT " ($no1hi:$no1lo=$cp1,$no2hi:$no2lo=$cp2)\n";
+ print OUT "--skip Extra checkpoint 1 after $cp ($cp1,$cp2)\n";
}
close(OUT);
diff --git a/mysql-test/suite/innodb/r/alter_kill.result b/mysql-test/suite/innodb/r/alter_kill.result
index 36b582c6d76..0283d1079e1 100644
--- a/mysql-test/suite/innodb/r/alter_kill.result
+++ b/mysql-test/suite/innodb/r/alter_kill.result
@@ -17,7 +17,7 @@ disconnect con1;
SELECT COUNT(*) FROM bug16720368;
ERROR 42S02: Table 'test.bug16720368' doesn't exist in engine
INSERT INTO bug16720368 VALUES(1);
-ERROR 42S02: Table 'test.bug16720368' doesn't exist in engine
+ERROR HY000: Table test/bug16720368 is corrupted. Please drop the table and recreate.
INSERT INTO bug16720368_1 VALUES(1);
# Shut down the server to uncorrupt the data.
# restart
diff --git a/mysql-test/suite/innodb/r/autoinc_persist,desc.rdiff b/mysql-test/suite/innodb/r/autoinc_persist,desc.rdiff
new file mode 100644
index 00000000000..639a60648e4
--- /dev/null
+++ b/mysql-test/suite/innodb/r/autoinc_persist,desc.rdiff
@@ -0,0 +1,769 @@
+@@ -13,212 +13,212 @@
+ #
+ # Pre-create several tables
+ SET SQL_MODE='STRICT_ALL_TABLES';
+-CREATE TABLE t1(a TINYINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
++CREATE TABLE t1(a TINYINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t1 VALUES(0), (0), (0), (0), (-1), (-10), (0),
+ (20), (30), (31);
+ SELECT * FROM t1;
+ a
+--10
+--1
+-1
+-2
+-3
+-4
+-5
+-20
+-30
+ 31
+-CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
++30
++20
++5
++4
++3
++2
++1
++-1
++-10
++CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t2 VALUES(-5);
+ ERROR 22003: Out of range value for column 'a' at row 1
+ INSERT INTO t2 VALUES(0), (0), (0), (0), (8), (10), (0),
+ (20), (30), (31);
+ SELECT * FROM t2;
+ a
+-1
+-2
+-3
+-4
+-8
+-10
+-11
+-20
+-30
+ 31
+-CREATE TABLE t3(a SMALLINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
++30
++20
++11
++10
++8
++4
++3
++2
++1
++CREATE TABLE t3(a SMALLINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t3 VALUES(0), (0), (0), (0), (-1), (-10), (0),
+ (20), (30), (31), (1024), (4096);
+ SELECT * FROM t3;
+ a
+--10
+--1
+-1
+-2
+-3
+-4
+-5
+-20
+-30
+-31
+-1024
+ 4096
+-CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
++1024
++31
++30
++20
++5
++4
++3
++2
++1
++-1
++-10
++CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t4 VALUES(-5);
+ ERROR 22003: Out of range value for column 'a' at row 1
+ INSERT INTO t4 VALUES(0), (0), (0), (0), (8), (10), (0),
+ (20), (30), (31), (1024), (4096);
+ SELECT * FROM t4;
+ a
+-1
+-2
+-3
+-4
+-8
+-10
+-11
+-20
+-30
+-31
+-1024
+ 4096
+-CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
++1024
++31
++30
++20
++11
++10
++8
++4
++3
++2
++1
++CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t5 VALUES(0), (0), (0), (0), (-1), (-10), (0),
+ (20), (30), (31), (1000000), (1000005);
+ SELECT * FROM t5;
+ a
+--10
+--1
+-1
+-2
+-3
+-4
+-5
+-20
+-30
+-31
+-1000000
+ 1000005
+-CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
++1000000
++31
++30
++20
++5
++4
++3
++2
++1
++-1
++-10
++CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t6 VALUES(-5);
+ ERROR 22003: Out of range value for column 'a' at row 1
+ INSERT INTO t6 VALUES(0), (0), (0), (0), (8), (10), (0),
+ (20), (30), (31), (1000000), (1000005);
+ SELECT * FROM t6;
+ a
+-1
+-2
+-3
+-4
+-8
+-10
+-11
+-20
+-30
+-31
+-1000000
+ 1000005
+-CREATE TABLE t7(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB;
++1000000
++31
++30
++20
++11
++10
++8
++4
++3
++2
++1
++CREATE TABLE t7(a INT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t7 VALUES(0), (0), (0), (0), (-1), (-10), (0),
+ (20), (30), (31), (100000000), (100000008);
+ SELECT * FROM t7;
+ a
+--10
+--1
+-1
+-2
+-3
+-4
+-5
+-20
+-30
+-31
+-100000000
+ 100000008
+-CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
++100000000
++31
++30
++20
++5
++4
++3
++2
++1
++-1
++-10
++CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t8 VALUES(-5);
+ ERROR 22003: Out of range value for column 'a' at row 1
+ INSERT INTO t8 VALUES(0), (0), (0), (0), (8), (10), (0),
+ (20), (30), (31), (100000000), (100000008);
+ SELECT * FROM t8;
+ a
+-1
+-2
+-3
+-4
+-8
+-10
+-11
+-20
+-30
+-31
+-100000000
+ 100000008
+-CREATE TABLE t9(a BIGINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
++100000000
++31
++30
++20
++11
++10
++8
++4
++3
++2
++1
++CREATE TABLE t9(a BIGINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t9 VALUES(0), (0), (0), (0), (-1), (-10), (0),
+ (20), (30), (31), (100000000000), (100000000006);
+ SELECT * FROM t9;
+ a
+--10
+--1
+-1
+-2
+-3
+-4
+-5
+-20
+-30
+-31
+-100000000000
+ 100000000006
+-CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
++100000000000
++31
++30
++20
++5
++4
++3
++2
++1
++-1
++-10
++CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t10 VALUES(-5);
+ ERROR 22003: Out of range value for column 'a' at row 1
+ INSERT INTO t10 VALUES(0), (0), (0), (0), (8), (10), (0),
+ (20), (30), (31), (100000000000), (100000000006);
+ SELECT * FROM t10;
+ a
+-1
+-2
+-3
+-4
+-8
+-10
+-11
+-20
+-30
+-31
+-100000000000
+ 100000000006
+-CREATE TABLE t11(a FLOAT AUTO_INCREMENT KEY) ENGINE = InnoDB;
++100000000000
++31
++30
++20
++11
++10
++8
++4
++3
++2
++1
++CREATE TABLE t11(a FLOAT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0),
+ (20), (30), (31);
+ SELECT * FROM t11;
+ a
+--10
+--1
+-1
+-2
+-3
+-4
+-5
+-20
+-30
+ 31
+-CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB;
++30
++20
++5
++4
++3
++2
++1
++-1
++-10
++CREATE TABLE t12(a DOUBLE AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
+ INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0),
+ (20), (30), (31);
+ SELECT * FROM t12;
+ a
+--10
+--1
+-1
+-2
+-3
+-4
+-5
+-20
+-30
+ 31
++30
++20
++5
++4
++3
++2
++1
++-1
++-10
+ # Scenario 1: Normal restart, to test if the counters are persisted
+ # Scenario 2: Delete some values, to test the counters should not be the
+ # one which is the largest in current table
+@@ -242,14 +242,14 @@
+ SELECT MAX(a) AS `Expect 100000000000` FROM t9;
+ Expect 100000000000
+ 100000000000
+-CREATE TABLE t13(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB,
++CREATE TABLE t13(a INT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB,
+ AUTO_INCREMENT = 1234;
+ # restart
+ SHOW CREATE TABLE t13;
+ Table Create Table
+ t13 CREATE TABLE `t13` (
+ `a` int(11) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=1234 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ INSERT INTO t13 VALUES(0);
+ SELECT a AS `Expect 1234` FROM t13;
+@@ -464,28 +464,28 @@
+ INSERT INTO t1 VALUES(0), (0);
+ SELECT * FROM t1;
+ a
+-1
+ 2
++1
+ INSERT INTO t3 VALUES(0), (0);
+ SELECT * FROM t3;
+ a
+-1
+ 2
++1
+ INSERT INTO t5 VALUES(0), (0);
+ SELECT * FROM t5;
+ a
+-1
+ 2
++1
+ INSERT INTO t7 VALUES(0), (0);
+ SELECT * FROM t7;
+ a
+-1
+ 2
++1
+ INSERT INTO t9 VALUES(0), (0);
+ SELECT * FROM t9;
+ a
+-1
+ 2
++1
+ # Ensure that all changes before the server is killed are persisted.
+ set global innodb_flush_log_at_trx_commit=1;
+ TRUNCATE TABLE t1;
+@@ -498,63 +498,63 @@
+ INSERT INTO t19 VALUES(0), (0);
+ SELECT * FROM t19;
+ a
+-1
+ 2
++1
+ # restart
+ INSERT INTO t1 VALUES(0), (0);
+ SELECT * FROM t1;
+ a
+-1
+ 2
++1
+ INSERT INTO t3 VALUES(0), (0);
+ SELECT * FROM t3;
+ a
+-1
+ 2
++1
+ INSERT INTO t5 VALUES(0), (0);
+ SELECT * FROM t5;
+ a
+-1
+ 2
++1
+ INSERT INTO t7 VALUES(0), (0);
+ SELECT * FROM t7;
+ a
+-1
+ 2
++1
+ INSERT INTO t19 VALUES(0), (0);
+ SELECT * FROM t19;
+ a
+-1
+-2
+-3
+ 4
++3
++2
++1
+ DELETE FROM t19 WHERE a = 4;
+ RENAME TABLE t19 to t9;
+ INSERT INTO t9 VALUES(0), (0);
+ SELECT * FROM t9;
+ a
+-1
+-2
+-3
+-5
+ 6
++5
++3
++2
++1
+ TRUNCATE TABLE t9;
+ INSERT INTO t9 VALUES(0), (0);
+ SELECT * FROM t9;
+ a
+-1
+ 2
++1
+ # Scenario 8: Test ALTER TABLE operations
+ INSERT INTO t3 VALUES(0), (0), (100), (200), (1000);
+ SELECT * FROM t3;
+ a
+-1
+-2
+-3
+-4
+-100
+-200
+ 1000
++200
++100
++4
++3
++2
++1
+ DELETE FROM t3 WHERE a > 300;
+ SELECT MAX(a) AS `Expect 200` FROM t3;
+ Expect 200
+@@ -566,7 +566,7 @@
+ Table Create Table
+ t3 CREATE TABLE `t3` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ INSERT INTO t3 VALUES(0);
+ SELECT MAX(a) AS `Expect 201` FROM t3;
+@@ -579,7 +579,7 @@
+ Table Create Table
+ t3 CREATE TABLE `t3` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=500 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ INSERT INTO t3 VALUES(0);
+ SELECT MAX(a) AS `Expect 500` FROM t3;
+@@ -591,13 +591,13 @@
+ Table Create Table
+ t3 CREATE TABLE `t3` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ INSERT INTO t3 VALUES(0), (0);
+ SELECT * FROM t3;
+ a
+-100
+ 101
++100
+ INSERT INTO t3 VALUES(150), (180);
+ UPDATE t3 SET a = 200 WHERE a = 150;
+ INSERT INTO t3 VALUES(220);
+@@ -607,7 +607,7 @@
+ Table Create Table
+ t3 CREATE TABLE `t3` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=221 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ INSERT INTO t3 VALUES(0);
+ SELECT MAX(a) AS `Expect 221` FROM t3;
+@@ -619,7 +619,7 @@
+ Table Create Table
+ t3 CREATE TABLE `t3` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ # MDEV-6076: Test adding an AUTO_INCREMENT COLUMN
+ CREATE TABLE mdev6076a (b INT) ENGINE=InnoDB;
+@@ -669,18 +669,18 @@
+ INSERT INTO t_inplace SELECT * FROM t3;
+ SELECT * FROM t_inplace;
+ a
+-100
+-101
+-120
+-121
+-122
+-200
+ 210
++200
++122
++121
++120
++101
++100
+ SHOW CREATE TABLE t_inplace;
+ Table Create Table
+ t_inplace CREATE TABLE `t_inplace` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ # This will keep the autoinc counter
+ ALTER TABLE t_inplace AUTO_INCREMENT = 250, ALGORITHM = INPLACE;
+@@ -689,7 +689,7 @@
+ Table Create Table
+ t_inplace CREATE TABLE `t_inplace` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ # This should keep the autoinc counter as well
+ ALTER TABLE t_inplace ADD COLUMN b INT, ALGORITHM = INPLACE;
+@@ -699,16 +699,16 @@
+ t_inplace CREATE TABLE `t_inplace` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+ `b` int(11) DEFAULT NULL,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ DELETE FROM t_inplace WHERE a > 150;
+ SELECT * FROM t_inplace;
+ a b
+-100 NULL
+-101 NULL
+-120 NULL
+-121 NULL
+ 122 NULL
++121 NULL
++120 NULL
++101 NULL
++100 NULL
+ # This should reset the autoinc counter to the one specified
+ # Since it's smaller than current one but bigger than existing
+ # biggest counter in the table
+@@ -719,7 +719,7 @@
+ t_inplace CREATE TABLE `t_inplace` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+ `b` int(11) DEFAULT NULL,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=180 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ # This should reset the autoinc counter to the next value of
+ # current max counter in the table, since the specified value
+@@ -730,7 +730,7 @@
+ Table Create Table
+ t_inplace CREATE TABLE `t_inplace` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ INSERT INTO t_inplace VALUES(0), (0);
+ SELECT MAX(a) AS `Expect 124` FROM t_inplace;
+@@ -757,18 +757,18 @@
+ INSERT INTO t_copy SELECT * FROM t3;
+ SELECT * FROM t_copy;
+ a
+-100
+-101
+-120
+-121
+-122
+-200
+ 210
++200
++122
++121
++120
++101
++100
+ SHOW CREATE TABLE t_copy;
+ Table Create Table
+ t_copy CREATE TABLE `t_copy` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ # This will keep the autoinc counter
+ ALTER TABLE t_copy AUTO_INCREMENT = 250, ALGORITHM = COPY;
+@@ -777,7 +777,7 @@
+ Table Create Table
+ t_copy CREATE TABLE `t_copy` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ # This should keep the autoinc counter as well
+ ALTER TABLE t_copy ADD COLUMN b INT, ALGORITHM = COPY;
+@@ -787,16 +787,16 @@
+ t_copy CREATE TABLE `t_copy` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+ `b` int(11) DEFAULT NULL,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ DELETE FROM t_copy WHERE a > 150;
+ SELECT * FROM t_copy;
+ a b
+-100 NULL
+-101 NULL
+-120 NULL
+-121 NULL
+ 122 NULL
++121 NULL
++120 NULL
++101 NULL
++100 NULL
+ # This should reset the autoinc counter to the one specified
+ # Since it's smaller than current one but bigger than existing
+ # biggest counter in the table
+@@ -807,7 +807,7 @@
+ t_copy CREATE TABLE `t_copy` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+ `b` int(11) DEFAULT NULL,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=180 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ # This should reset the autoinc counter to the next value of
+ # current max counter in the table, since the specified value
+@@ -818,7 +818,7 @@
+ Table Create Table
+ t_copy CREATE TABLE `t_copy` (
+ `a` smallint(6) NOT NULL AUTO_INCREMENT,
+- PRIMARY KEY (`a`)
++ PRIMARY KEY (`a` DESC)
+ ) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ INSERT INTO t_copy VALUES(0), (0);
+ SELECT MAX(a) AS `Expect 124` FROM t_copy;
+@@ -842,7 +842,7 @@
+ 126
+ DROP TABLE t_copy, it_copy;
+ # Scenario 9: Test the sql_mode = NO_AUTO_VALUE_ON_ZERO
+-CREATE TABLE t30 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, key(b)) ENGINE = InnoDB;
++CREATE TABLE t30 (a INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(a DESC), b INT, key(b)) ENGINE = InnoDB;
+ set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
+ INSERT INTO t30 VALUES(NULL, 1), (200, 2), (0, 3);
+ INSERT INTO t30(b) VALUES(4), (5), (6), (7);
+@@ -869,20 +869,20 @@
+ set global innodb_flush_log_at_trx_commit=1;
+ CREATE TABLE t31 (a INT) ENGINE = InnoDB;
+ INSERT INTO t31 VALUES(1), (2);
+-ALTER TABLE t31 ADD b INT AUTO_INCREMENT PRIMARY KEY;
++ALTER TABLE t31 ADD b INT AUTO_INCREMENT, ADD PRIMARY KEY(b DESC);
+ INSERT INTO t31 VALUES(3, 0), (4, NULL), (5, NULL);
+ INSERT INTO t31 VALUES(6, 0);
+ ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
+ SELECT * FROM t31;
+ a b
+-3 0
+-1 1
+-2 2
+-4 3
+ 5 4
++4 3
++2 2
++1 1
++3 0
+ SET SQL_MODE = 0;
+ # Scenario 10: Rollback would not rollback the counter
+-CREATE TABLE t32 (a BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
++CREATE TABLE t32 (a BIGINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE=InnoDB;
+ INSERT INTO t32 VALUES(0), (0);
+ # Ensure that all changes before the server is killed are persisted.
+ set global innodb_flush_log_at_trx_commit=1;
+@@ -897,7 +897,7 @@
+ # increasing the counter
+ CREATE TABLE t33 (
+ a BIGINT NOT NULL PRIMARY KEY,
+-b BIGINT NOT NULL AUTO_INCREMENT, KEY(b)) ENGINE = InnoDB;
++b BIGINT NOT NULL AUTO_INCREMENT, INDEX(b DESC)) ENGINE = InnoDB;
+ INSERT INTO t33 VALUES(1, NULL);
+ INSERT INTO t33 VALUES(2, NULL);
+ INSERT INTO t33 VALUES(2, NULL);
+@@ -920,13 +920,13 @@
+ INSERT INTO t31(a) VALUES(6), (0);
+ SELECT * FROM t31;
+ a b
+-3 0
+-1 1
+-2 2
+-4 3
+-5 4
+-6 5
+ 0 6
++6 5
++5 4
++4 3
++2 2
++1 1
++3 0
+ DROP TABLE t31;
+ set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
+ DELETE FROM t30 WHERE a = 0;
+@@ -965,7 +965,7 @@
+ DROP TABLE t33;
+ CREATE TABLE t33 (
+ a BIGINT NOT NULL PRIMARY KEY,
+-b BIGINT NOT NULL AUTO_INCREMENT, KEY(b)) ENGINE = InnoDB;
++b BIGINT NOT NULL AUTO_INCREMENT, INDEX(b DESC)) ENGINE = InnoDB;
+ ALTER TABLE t33 DISCARD TABLESPACE;
+ restore: t33 .ibd and .cfg files
+ ALTER TABLE t33 IMPORT TABLESPACE;
+@@ -975,7 +975,7 @@
+ 4
+ SELECT * FROM t33;
+ a b
+-10 1
+-2 2
+ 3 4
++2 2
++10 1
+ DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t30, t32, t33;
diff --git a/mysql-test/suite/innodb/r/autoinc_persist.result b/mysql-test/suite/innodb/r/autoinc_persist.result
index 93594db3f05..9e5cd4ad23e 100644
--- a/mysql-test/suite/innodb/r/autoinc_persist.result
+++ b/mysql-test/suite/innodb/r/autoinc_persist.result
@@ -242,7 +242,7 @@ DELETE FROM t9 WHERE a > 100000000000;
SELECT MAX(a) AS `Expect 100000000000` FROM t9;
Expect 100000000000
100000000000
-CREATE TABLE t13(a INT AUTO_INCREMENT PRIMARY KEY) ENGINE = InnoDB,
+CREATE TABLE t13(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB,
AUTO_INCREMENT = 1234;
# restart
SHOW CREATE TABLE t13;
@@ -882,8 +882,7 @@ a b
5 4
SET SQL_MODE = 0;
# Scenario 10: Rollback would not rollback the counter
-CREATE TABLE t32 (
-a BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
+CREATE TABLE t32 (a BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO t32 VALUES(0), (0);
# Ensure that all changes before the server is killed are persisted.
set global innodb_flush_log_at_trx_commit=1;
@@ -898,8 +897,7 @@ ROLLBACK;
# increasing the counter
CREATE TABLE t33 (
a BIGINT NOT NULL PRIMARY KEY,
-b BIGINT NOT NULL AUTO_INCREMENT,
-KEY(b)) ENGINE = InnoDB;
+b BIGINT NOT NULL AUTO_INCREMENT, KEY(b)) ENGINE = InnoDB;
INSERT INTO t33 VALUES(1, NULL);
INSERT INTO t33 VALUES(2, NULL);
INSERT INTO t33 VALUES(2, NULL);
@@ -967,8 +965,7 @@ UNLOCK TABLES;
DROP TABLE t33;
CREATE TABLE t33 (
a BIGINT NOT NULL PRIMARY KEY,
-b BIGINT NOT NULL AUTO_INCREMENT,
-KEY(b)) ENGINE = InnoDB;
+b BIGINT NOT NULL AUTO_INCREMENT, KEY(b)) ENGINE = InnoDB;
ALTER TABLE t33 DISCARD TABLESPACE;
restore: t33 .ibd and .cfg files
ALTER TABLE t33 IMPORT TABLESPACE;
diff --git a/mysql-test/suite/innodb/r/compression_providers_loaded,lz4.rdiff b/mysql-test/suite/innodb/r/compression_providers_loaded,lz4.rdiff
new file mode 100644
index 00000000000..b729890c354
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_loaded,lz4.rdiff
@@ -0,0 +1,19 @@
+--- suite/innodb/r/compression_providers_loaded.result
++++ suite/innodb/r/compression_providers_loaded.reject
+@@ -1,10 +1,10 @@
+ #
+-# Testing unloaded compression provider: bzip2
++# Testing unloaded compression provider: lz4
+ #
+-# Innodb_have_bzip2 reflects that the provider is loaded
+-SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
++# Innodb_have_lz4 reflects that the provider is loaded
++SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_lz4";
+ Variable_name Value
+-Innodb_have_bzip2 ON
+-# Innodb_compression_algorithm can be set to bzip2
+-SET GLOBAL Innodb_compression_algorithm = bzip2;
++Innodb_have_lz4 ON
++# Innodb_compression_algorithm can be set to lz4
++SET GLOBAL Innodb_compression_algorithm = lz4;
+ SET GLOBAL Innodb_compression_algorithm = zlib;
diff --git a/mysql-test/suite/innodb/r/compression_providers_loaded,lzma.rdiff b/mysql-test/suite/innodb/r/compression_providers_loaded,lzma.rdiff
new file mode 100644
index 00000000000..caba4283977
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_loaded,lzma.rdiff
@@ -0,0 +1,19 @@
+--- suite/innodb/r/compression_providers_loaded.result
++++ suite/innodb/r/compression_providers_loaded.reject
+@@ -1,10 +1,10 @@
+ #
+-# Testing unloaded compression provider: bzip2
++# Testing unloaded compression provider: lzma
+ #
+-# Innodb_have_bzip2 reflects that the provider is loaded
+-SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
++# Innodb_have_lzma reflects that the provider is loaded
++SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_lzma";
+ Variable_name Value
+-Innodb_have_bzip2 ON
+-# Innodb_compression_algorithm can be set to bzip2
+-SET GLOBAL Innodb_compression_algorithm = bzip2;
++Innodb_have_lzma ON
++# Innodb_compression_algorithm can be set to lzma
++SET GLOBAL Innodb_compression_algorithm = lzma;
+ SET GLOBAL Innodb_compression_algorithm = zlib;
diff --git a/mysql-test/suite/innodb/r/compression_providers_loaded,lzo.rdiff b/mysql-test/suite/innodb/r/compression_providers_loaded,lzo.rdiff
new file mode 100644
index 00000000000..8a1a5403fc2
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_loaded,lzo.rdiff
@@ -0,0 +1,19 @@
+--- suite/innodb/r/compression_providers_loaded.result
++++ suite/innodb/r/compression_providers_loaded.reject
+@@ -1,10 +1,10 @@
+ #
+-# Testing unloaded compression provider: bzip2
++# Testing unloaded compression provider: lzo
+ #
+-# Innodb_have_bzip2 reflects that the provider is loaded
+-SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
++# Innodb_have_lzo reflects that the provider is loaded
++SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_lzo";
+ Variable_name Value
+-Innodb_have_bzip2 ON
+-# Innodb_compression_algorithm can be set to bzip2
+-SET GLOBAL Innodb_compression_algorithm = bzip2;
++Innodb_have_lzo ON
++# Innodb_compression_algorithm can be set to lzo
++SET GLOBAL Innodb_compression_algorithm = lzo;
+ SET GLOBAL Innodb_compression_algorithm = zlib;
diff --git a/mysql-test/suite/innodb/r/compression_providers_loaded,snappy.rdiff b/mysql-test/suite/innodb/r/compression_providers_loaded,snappy.rdiff
new file mode 100644
index 00000000000..4a1261d45d2
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_loaded,snappy.rdiff
@@ -0,0 +1,19 @@
+--- suite/innodb/r/compression_providers_loaded.result
++++ suite/innodb/r/compression_providers_loaded.reject
+@@ -1,10 +1,10 @@
+ #
+-# Testing unloaded compression provider: bzip2
++# Testing unloaded compression provider: snappy
+ #
+-# Innodb_have_bzip2 reflects that the provider is loaded
+-SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
++# Innodb_have_snappy reflects that the provider is loaded
++SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_snappy";
+ Variable_name Value
+-Innodb_have_bzip2 ON
+-# Innodb_compression_algorithm can be set to bzip2
+-SET GLOBAL Innodb_compression_algorithm = bzip2;
++Innodb_have_snappy ON
++# Innodb_compression_algorithm can be set to snappy
++SET GLOBAL Innodb_compression_algorithm = snappy;
+ SET GLOBAL Innodb_compression_algorithm = zlib;
diff --git a/mysql-test/suite/innodb/r/compression_providers_loaded.result b/mysql-test/suite/innodb/r/compression_providers_loaded.result
new file mode 100644
index 00000000000..2d1700c2ae2
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_loaded.result
@@ -0,0 +1,10 @@
+#
+# Testing unloaded compression provider: bzip2
+#
+# Innodb_have_bzip2 reflects that the provider is loaded
+SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
+Variable_name Value
+Innodb_have_bzip2 ON
+# Innodb_compression_algorithm can be set to bzip2
+SET GLOBAL Innodb_compression_algorithm = bzip2;
+SET GLOBAL Innodb_compression_algorithm = zlib;
diff --git a/mysql-test/suite/innodb/r/compression_providers_unloaded,lz4.rdiff b/mysql-test/suite/innodb/r/compression_providers_unloaded,lz4.rdiff
new file mode 100644
index 00000000000..e849fb5c474
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_unloaded,lz4.rdiff
@@ -0,0 +1,26 @@
+--- suite/innodb/r/compression_providers_unloaded.result
++++ suite/innodb/r/compression_providers_unloaded.reject
+@@ -1,14 +1,14 @@
+ #
+-# Testing unloaded compression provider: bzip2
++# Testing unloaded compression provider: lz4
+ #
+-# Innodb_have_bzip2 reflects that the provider is not loaded
+-SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
++# Innodb_have_lz4 reflects that the provider is not loaded
++SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_lz4";
+ Variable_name Value
+-Innodb_have_bzip2 OFF
+-# Innodb_compression_algorithm cannot be set to bzip2
+-SET GLOBAL Innodb_compression_algorithm = bzip2;
+-ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
++Innodb_have_lz4 OFF
++# Innodb_compression_algorithm cannot be set to lz4
++SET GLOBAL Innodb_compression_algorithm = lz4;
++ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'lz4'
+ show warnings;
+ Level Code Message
+-Warning 138 InnoDB: compression algorithm bzip2 (5) is not available. Please, load the corresponding provider plugin.
+-Error 1231 Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
++Warning 138 InnoDB: compression algorithm lz4 (2) is not available. Please, load the corresponding provider plugin.
++Error 1231 Variable 'innodb_compression_algorithm' can't be set to the value of 'lz4'
diff --git a/mysql-test/suite/innodb/r/compression_providers_unloaded,lzma.rdiff b/mysql-test/suite/innodb/r/compression_providers_unloaded,lzma.rdiff
new file mode 100644
index 00000000000..466fb37c3fb
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_unloaded,lzma.rdiff
@@ -0,0 +1,26 @@
+--- suite/innodb/r/compression_providers_unloaded.result
++++ suite/innodb/r/compression_providers_unloaded.reject
+@@ -1,14 +1,14 @@
+ #
+-# Testing unloaded compression provider: bzip2
++# Testing unloaded compression provider: lzma
+ #
+-# Innodb_have_bzip2 reflects that the provider is not loaded
+-SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
++# Innodb_have_lzma reflects that the provider is not loaded
++SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_lzma";
+ Variable_name Value
+-Innodb_have_bzip2 OFF
+-# Innodb_compression_algorithm cannot be set to bzip2
+-SET GLOBAL Innodb_compression_algorithm = bzip2;
+-ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
++Innodb_have_lzma OFF
++# Innodb_compression_algorithm cannot be set to lzma
++SET GLOBAL Innodb_compression_algorithm = lzma;
++ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'lzma'
+ show warnings;
+ Level Code Message
+-Warning 138 InnoDB: compression algorithm bzip2 (5) is not available. Please, load the corresponding provider plugin.
+-Error 1231 Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
++Warning 138 InnoDB: compression algorithm lzma (4) is not available. Please, load the corresponding provider plugin.
++Error 1231 Variable 'innodb_compression_algorithm' can't be set to the value of 'lzma'
diff --git a/mysql-test/suite/innodb/r/compression_providers_unloaded,lzo.rdiff b/mysql-test/suite/innodb/r/compression_providers_unloaded,lzo.rdiff
new file mode 100644
index 00000000000..dec0becf71e
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_unloaded,lzo.rdiff
@@ -0,0 +1,26 @@
+--- suite/innodb/r/compression_providers_unloaded.result
++++ suite/innodb/r/compression_providers_unloaded.reject
+@@ -1,14 +1,14 @@
+ #
+-# Testing unloaded compression provider: bzip2
++# Testing unloaded compression provider: lzo
+ #
+-# Innodb_have_bzip2 reflects that the provider is not loaded
+-SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
++# Innodb_have_lzo reflects that the provider is not loaded
++SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_lzo";
+ Variable_name Value
+-Innodb_have_bzip2 OFF
+-# Innodb_compression_algorithm cannot be set to bzip2
+-SET GLOBAL Innodb_compression_algorithm = bzip2;
+-ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
++Innodb_have_lzo OFF
++# Innodb_compression_algorithm cannot be set to lzo
++SET GLOBAL Innodb_compression_algorithm = lzo;
++ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'lzo'
+ show warnings;
+ Level Code Message
+-Warning 138 InnoDB: compression algorithm bzip2 (5) is not available. Please, load the corresponding provider plugin.
+-Error 1231 Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
++Warning 138 InnoDB: compression algorithm lzo (3) is not available. Please, load the corresponding provider plugin.
++Error 1231 Variable 'innodb_compression_algorithm' can't be set to the value of 'lzo'
diff --git a/mysql-test/suite/innodb/r/compression_providers_unloaded,snappy.rdiff b/mysql-test/suite/innodb/r/compression_providers_unloaded,snappy.rdiff
new file mode 100644
index 00000000000..273ff4e2131
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_unloaded,snappy.rdiff
@@ -0,0 +1,26 @@
+--- suite/innodb/r/compression_providers_unloaded.result
++++ suite/innodb/r/compression_providers_unloaded.reject
+@@ -1,14 +1,14 @@
+ #
+-# Testing unloaded compression provider: bzip2
++# Testing unloaded compression provider: snappy
+ #
+-# Innodb_have_bzip2 reflects that the provider is not loaded
+-SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
++# Innodb_have_snappy reflects that the provider is not loaded
++SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_snappy";
+ Variable_name Value
+-Innodb_have_bzip2 OFF
+-# Innodb_compression_algorithm cannot be set to bzip2
+-SET GLOBAL Innodb_compression_algorithm = bzip2;
+-ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
++Innodb_have_snappy OFF
++# Innodb_compression_algorithm cannot be set to snappy
++SET GLOBAL Innodb_compression_algorithm = snappy;
++ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'snappy'
+ show warnings;
+ Level Code Message
+-Warning 138 InnoDB: compression algorithm bzip2 (5) is not available. Please, load the corresponding provider plugin.
+-Error 1231 Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
++Warning 138 InnoDB: compression algorithm snappy (6) is not available. Please, load the corresponding provider plugin.
++Error 1231 Variable 'innodb_compression_algorithm' can't be set to the value of 'snappy'
diff --git a/mysql-test/suite/innodb/r/compression_providers_unloaded.result b/mysql-test/suite/innodb/r/compression_providers_unloaded.result
new file mode 100644
index 00000000000..d4ac9cdb41c
--- /dev/null
+++ b/mysql-test/suite/innodb/r/compression_providers_unloaded.result
@@ -0,0 +1,14 @@
+#
+# Testing unloaded compression provider: bzip2
+#
+# Innodb_have_bzip2 reflects that the provider is not loaded
+SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_bzip2";
+Variable_name Value
+Innodb_have_bzip2 OFF
+# Innodb_compression_algorithm cannot be set to bzip2
+SET GLOBAL Innodb_compression_algorithm = bzip2;
+ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
+show warnings;
+Level Code Message
+Warning 138 InnoDB: compression algorithm bzip2 (5) is not available. Please, load the corresponding provider plugin.
+Error 1231 Variable 'innodb_compression_algorithm' can't be set to the value of 'bzip2'
diff --git a/mysql-test/suite/innodb/r/corrupted_during_recovery.result b/mysql-test/suite/innodb/r/corrupted_during_recovery.result
index 951233ced3c..d67dc8a63d8 100644
--- a/mysql-test/suite/innodb/r/corrupted_during_recovery.result
+++ b/mysql-test/suite/innodb/r/corrupted_during_recovery.result
@@ -9,7 +9,7 @@ INSERT INTO t2 VALUES(1);
SELECT * FROM t1;
ERROR 42000: Unknown storage engine 'InnoDB'
SELECT * FROM t1;
-ERROR 42S02: Table 'test.t1' doesn't exist in engine
+ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate.
SELECT * FROM t2;
a
1
diff --git a/mysql-test/suite/innodb/r/innodb-alter.result b/mysql-test/suite/innodb/r/innodb-alter.result
index 5bcb7cf963f..16c33ee02a2 100644
--- a/mysql-test/suite/innodb/r/innodb-alter.result
+++ b/mysql-test/suite/innodb/r/innodb-alter.result
@@ -1068,7 +1068,7 @@ ALTER TABLE t1 ADD b TIME NOT NULL DEFAULT if(unix_timestamp()>1,TIMESTAMP'2001-
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 1
Warnings:
-Note 1265 Data truncated for column 'b' at row 1
+Note 1265 Data truncated for column 'b' at row 0
SELECT * FROM t1;
a b
10 10:20:30
diff --git a/mysql-test/suite/innodb/r/innodb-index,debug.rdiff b/mysql-test/suite/innodb/r/innodb-index,debug.rdiff
deleted file mode 100644
index 2740e440cd5..00000000000
--- a/mysql-test/suite/innodb/r/innodb-index,debug.rdiff
+++ /dev/null
@@ -1,10 +0,0 @@
---- innodb-index.result
-+++ innodb-index.reject
-@@ -1851,6 +1851,7 @@
- #
- # MDEV-15325 Incomplete validation of missing tablespace during recovery
- #
-+SET GLOBAL DEBUG_DBUG='+d,fil_names_write_bogus';
- CREATE TABLE t1(f1 INT PRIMARY KEY)ENGINE=InnoDB;
- CREATE TABLE t2(f1 INT PRIMARY KEY)ENGINE=InnoDB;
- # Kill the server
diff --git a/mysql-test/suite/innodb/r/innodb-index.result b/mysql-test/suite/innodb/r/innodb-index.result
index 2292188c8ac..a76837b91a2 100644
--- a/mysql-test/suite/innodb/r/innodb-index.result
+++ b/mysql-test/suite/innodb/r/innodb-index.result
@@ -1947,3 +1947,51 @@ Warnings:
Warning 1082 InnoDB: Table test/t contains 0 indexes inside InnoDB, which is different from the number of indexes 1 defined in the MariaDB
Warning 1082 InnoDB: Table test/t contains 0 indexes inside InnoDB, which is different from the number of indexes 1 defined in the MariaDB
DROP TABLE t;
+#
+# MDEV-27374 InnoDB table becomes corrupt after renaming DESC-indexed column
+#
+CREATE TABLE t1 (a VARCHAR(8), PRIMARY KEY(a DESC)) ENGINE=InnoDB;
+ALTER TABLE t1 RENAME COLUMN a TO b, ALGORITHM=INPLACE;
+SELECT TABLE_ID INTO @table_id FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME="test/t1";
+SELECT INDEX_ID INTO @index_id FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE TABLE_ID = @table_id;
+SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS WHERE INDEX_ID=@index_id;
+NAME
+b
+DROP TABLE t1;
+#
+# MDEV-27432 ASC/DESC primary and unique keys cause index
+# inconsistency between InnoDB and server
+#
+CREATE TABLE t1 (id INT NOT NULL, UNIQUE(id DESC)) ENGINE=InnoDB;
+ALTER TABLE t1 ADD PRIMARY KEY (id), ALGORITHM=INPLACE;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `id` int(11) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id` DESC)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t1;
+#
+# MDEV-27445 Index inconsistency and assertion failure after
+# renaming virtual column with DESC key
+#
+CREATE TABLE t1(a INT, b INT AS (a), KEY(a, b DESC)) ENGINE=InnoDB;
+ALTER TABLE t1 RENAME COLUMN IF EXISTS b TO v;
+ALTER TABLE t1 FORCE;
+DROP TABLE t1;
+#
+# MDEV-27592 DESC primary index fails to set wide format
+# while renaming the column
+#
+CREATE TABLE t1 (id INT PRIMARY KEY, a CHAR(8), b INT, KEY(a DESC,b)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,'foo',10);
+ALTER TABLE t1 RENAME COLUMN b TO c, ALGORITHM=INPLACE;
+SELECT TABLE_ID INTO @table_id FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME="test/t1";
+SELECT INDEX_ID INTO @index_id FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE TABLE_ID = @table_id ORDER BY INDEX_ID DESC LIMIT 1;
+SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS WHERE INDEX_ID=@index_id;
+NAME
+a
+c
+DROP TABLE t1;
+# End of 10.8 tests
diff --git a/mysql-test/suite/innodb/r/innodb-online-alter-gis.result b/mysql-test/suite/innodb/r/innodb-online-alter-gis.result
index 9e0dbf49931..6a57be49ac5 100644
--- a/mysql-test/suite/innodb/r/innodb-online-alter-gis.result
+++ b/mysql-test/suite/innodb/r/innodb-online-alter-gis.result
@@ -42,7 +42,7 @@ drop table t1;
#
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
ALTER TABLE t1 ADD COLUMN b LINESTRING DEFAULT POINT(1,1);
-ERROR 22007: Incorrect LINESTRING value: 'POINT(1 1)' for column ``.``.`b` at row 1
+ERROR 22007: Incorrect LINESTRING value: 'POINT(1 1)' for column ``.``.`b` at row 0
DESCRIBE t1;
Field Type Null Key Default Extra
a int(11) YES NULL
diff --git a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result
index 5770ebb27db..e7af2d9469e 100644
--- a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result
+++ b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result
@@ -1,5 +1,5 @@
call mtr.add_suppression("InnoDB: Operating system error number .* in a file operation.");
-call mtr.add_suppression("InnoDB: The error means the system cannot find the path specified.");
+call mtr.add_suppression("InnoDB: Error number \\d+ means");
call mtr.add_suppression("InnoDB: Cannot open datafile for read-only: .*");
call mtr.add_suppression("InnoDB: Ignoring tablespace .* because it could not be opened.");
call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded.");
diff --git a/mysql-test/suite/innodb/r/innodb_buffer_pool_resize.result b/mysql-test/suite/innodb/r/innodb_buffer_pool_resize.result
index 667d31a0b69..cafa3f45eab 100644
--- a/mysql-test/suite/innodb/r/innodb_buffer_pool_resize.result
+++ b/mysql-test/suite/innodb/r/innodb_buffer_pool_resize.result
@@ -3,22 +3,20 @@ select @@innodb_buffer_pool_size;
@@innodb_buffer_pool_size
8388608
set global innodb_buffer_pool_size = 10485760;
-Warnings:
-Warning 1292 Truncated incorrect innodb_buffer_pool_size value: '10485760'
select @@innodb_buffer_pool_size;
@@innodb_buffer_pool_size
-16777216
+10485760
create table t1 (id int not null, val int not null default '0', primary key (id)) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
create or replace view view0 as select 1 union all select 1;
set @`v_id` := 0;
set @`v_val` := 0;
replace into t1 select (@`v_id` := (@`v_id` + 4) mod 4294967296) as id, (@`v_val` := (@`v_val` + 4) mod 4294967296) as val from view0 v0, view0 v1, view0 v2, view0 v3, view0 v4, view0 v5, view0 v6, view0 v7, view0 v8, view0 v9, view0 v10, view0 v11, view0 v12, view0 v13, view0 v14, view0 v15, view0 v16, view0 v17;
-set global innodb_buffer_pool_size = 7340032;
+set global innodb_buffer_pool_size = 64 * 1024 * 1024 + 512 * 1024;
Warnings:
-Warning 1292 Truncated incorrect innodb_buffer_pool_size value: '7340032'
+Warning 1292 Truncated incorrect innodb_buffer_pool_size value: '67633152'
select @@innodb_buffer_pool_size;
@@innodb_buffer_pool_size
-8388608
+68157440
select count(val) from t1;
count(val)
262144
diff --git a/mysql-test/suite/innodb/r/innodb_gis.result b/mysql-test/suite/innodb/r/innodb_gis.result
index b00c80643c0..4c89ad4b9fb 100644
--- a/mysql-test/suite/innodb/r/innodb_gis.result
+++ b/mysql-test/suite/innodb/r/innodb_gis.result
@@ -452,9 +452,9 @@ ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
drop table t1;
create table t1 (pk integer primary key auto_increment, fl geometry not null);
insert into t1 (fl) values (1);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 (fl) values (1.11);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'decimal' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 (fl) values ("qwerty");
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
insert into t1 (fl) values (pointfromtext('point(1,1)'));
diff --git a/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result b/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result
index 9bdb546482e..dd253311ddd 100644
--- a/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result
+++ b/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result
@@ -154,9 +154,6 @@ os_data_fsyncs os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status
os_pending_reads os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of reads pending
os_pending_writes os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of writes pending
os_log_bytes_written os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Bytes of log written (innodb_os_log_written)
-os_log_fsyncs os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of fsync log writes (innodb_os_log_fsyncs)
-os_log_pending_fsyncs os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of pending fsync write (innodb_os_log_pending_fsyncs)
-os_log_pending_writes os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of pending log file writes (innodb_os_log_pending_writes)
trx_rw_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of read-write transactions committed
trx_ro_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of read-only transactions committed
trx_nl_ro_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of non-locking auto-commit read-only transactions committed
@@ -174,20 +171,16 @@ purge_undo_log_pages purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL
purge_dml_delay_usec purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Microseconds DML to be delayed due to purge lagging
purge_stop_count purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of times purge was stopped
purge_resume_count purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of times purge was resumed
-log_checkpoints recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of checkpoints
+log_checkpoints recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of checkpoints
log_lsn_last_flush recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value LSN of Last flush
log_lsn_last_checkpoint recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value LSN at last checkpoint
log_lsn_current recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Current LSN value
log_lsn_checkpoint_age recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Current LSN value minus LSN at last checkpoint
log_lsn_buf_pool_oldest recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value The oldest modified block LSN in the buffer pool
log_max_modified_age_async recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Maximum LSN difference; when exceeded, start asynchronous preflush
-log_pending_log_flushes recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Pending log flushes
-log_pending_checkpoint_writes recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Pending checkpoints
-log_num_log_io recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of log I/Os
log_waits recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of log waits due to small log buffer (innodb_log_waits)
log_write_requests recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of log write requests (innodb_log_write_requests)
log_writes recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of log writes (innodb_log_writes)
-log_padded recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Bytes of log padded for log write ahead
compress_pages_compressed compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of pages compressed
compress_pages_decompressed compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of pages decompressed
compression_pad_increments compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of times padding is incremented to avoid compression failures
diff --git a/mysql-test/suite/innodb/r/innodb_status_variables.result b/mysql-test/suite/innodb/r/innodb_status_variables.result
index 5b8ca678795..dd3d3ca1dd2 100644
--- a/mysql-test/suite/innodb/r/innodb_status_variables.result
+++ b/mysql-test/suite/innodb/r/innodb_status_variables.result
@@ -65,9 +65,6 @@ INNODB_MASTER_THREAD_ACTIVE_LOOPS
INNODB_MASTER_THREAD_IDLE_LOOPS
INNODB_MAX_TRX_ID
INNODB_MEM_DICTIONARY
-INNODB_OS_LOG_FSYNCS
-INNODB_OS_LOG_PENDING_FSYNCS
-INNODB_OS_LOG_PENDING_WRITES
INNODB_OS_LOG_WRITTEN
INNODB_PAGE_SIZE
INNODB_PAGES_CREATED
diff --git a/mysql-test/suite/innodb/r/insert_into_empty,32k.rdiff b/mysql-test/suite/innodb/r/insert_into_empty,32k.rdiff
new file mode 100644
index 00000000000..9d40decbb30
--- /dev/null
+++ b/mysql-test/suite/innodb/r/insert_into_empty,32k.rdiff
@@ -0,0 +1,9 @@
+@@ -377,8 +377,6 @@
+ c09 text, c10 text, c11 text, c12 text) ENGINE=InnoDB;
+ SET GLOBAL INNODB_DEFAULT_ROW_FORMAT= COMPACT;
+ ALTER TABLE t1 FORCE;
+-Warnings:
+-Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
+ INSERT IGNORE INTO t1 VALUES
+ (1, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107)),
+ (2, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107));
diff --git a/mysql-test/suite/innodb/r/insert_into_empty,64k.rdiff b/mysql-test/suite/innodb/r/insert_into_empty,64k.rdiff
new file mode 100644
index 00000000000..9d40decbb30
--- /dev/null
+++ b/mysql-test/suite/innodb/r/insert_into_empty,64k.rdiff
@@ -0,0 +1,9 @@
+@@ -377,8 +377,6 @@
+ c09 text, c10 text, c11 text, c12 text) ENGINE=InnoDB;
+ SET GLOBAL INNODB_DEFAULT_ROW_FORMAT= COMPACT;
+ ALTER TABLE t1 FORCE;
+-Warnings:
+-Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
+ INSERT IGNORE INTO t1 VALUES
+ (1, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107)),
+ (2, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107));
diff --git a/mysql-test/suite/innodb/r/insert_into_empty.result b/mysql-test/suite/innodb/r/insert_into_empty.result
index ef7d015f7f3..45f3dd7654c 100644
--- a/mysql-test/suite/innodb/r/insert_into_empty.result
+++ b/mysql-test/suite/innodb/r/insert_into_empty.result
@@ -194,8 +194,8 @@ CREATE TABLE t1 (a INT PRIMARY KEY)ENGINE=InnoDB
STATS_PERSISTENT=1 STATS_AUTO_RECALC=1;
INSERT INTO t1 SELECT * FROM seq_1_to_4096;
# Wait till statistics update after bulk insert operation
-SELECT n_rows>=4096 FROM mysql.innodb_table_stats WHERE TABLE_NAME="t1";
-n_rows>=4096
+SELECT n_rows>=4000 FROM mysql.innodb_table_stats WHERE TABLE_NAME="t1";
+n_rows>=4000
1
DROP TABLE t1;
#
@@ -223,7 +223,7 @@ INSERT INTO t VALUES (0,0);
ERROR 21S01: Column count doesn't match value count at row 1
SAVEPOINT a;
INSERT INTO t VALUES (0),(0);
-ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
+ERROR HY000: Got error 1 "Operation not permitted" during COMMIT
SAVEPOINT a;
commit;
SELECT * FROM t;
@@ -252,3 +252,211 @@ c1
3331
DROP TABLE t1;
# End of 10.6 tests
+#
+# MDEV-26947 UNIQUE column checks fail in InnoDB resulting
+# in table corruption
+#
+CREATE TABLE t (c1 INT KEY,c2 INT UNIQUE) ENGINE=InnoDB;
+BEGIN;
+INSERT INTO t VALUES (1,0),(2,0);
+ERROR HY000: Got error 1 "Operation not permitted" during COMMIT
+CHECK TABLE t;
+Table Op Msg_type Msg_text
+test.t check status OK
+COMMIT;
+DROP TABLE t;
+CREATE TABLE t (i INT UNIQUE)ENGINE=InnoDB;
+INSERT INTO t VALUES (0),(0);
+ERROR HY000: Got error 1 "Operation not permitted" during COMMIT
+CHECK TABLE t;
+Table Op Msg_type Msg_text
+test.t check status OK
+DROP TABLE t;
+CREATE TABLE t (c INT PRIMARY KEY,c2 CHAR(1) UNIQUE)ENGINE=InnoDB;
+BEGIN;
+INSERT INTO t VALUES(1, ''),(2, '');
+ERROR HY000: Got error 1 "Operation not permitted" during COMMIT
+SELECT * FROM t;
+c c2
+DELETE FROM t;
+COMMIT;
+DROP TABLE t;
+#
+# MDEV-26956 LeakSanitizer/Valgrind errors in
+# trx_mod_table_time_t::start_bulk_insert
+# upon adding system versioning
+#
+CREATE TABLE t1(id INT, s DATE, e DATE, PERIOD FOR p(s,e),
+PRIMARY KEY(id, p WITHOUT OVERLAPS)) ENGINE=InnoDB;
+ALTER TABLE t1 ADD COLUMN row_start BIGINT UNSIGNED AS ROW START,
+ADD COLUMN row_end BIGINT UNSIGNED AS ROW END,
+ADD PERIOD FOR SYSTEM_TIME(row_start,row_end), WITH SYSTEM VERSIONING;
+DROP TABLE t1;
+#
+# MDEV-27316 Assertion `!(index)->is_spatial()' failed.
+#
+CREATE TABLE t (c POINT NOT NULL, SPATIAL INDEX(c)) ENGINE=InnoDB;
+INSERT INTO t VALUES (POINT(1, 1));
+SELECT COUNT(*) FROM t WHERE MBRWithin(t.c, POINT(1,1));
+COUNT(*)
+1
+DROP TABLE t;
+#
+# MDEV-27318 Assertion data_size < srv_sort_buf_size failed in row_merge_bulk_buf_add
+#
+CREATE TABLE t1(f1 MEDIUMTEXT)ENGINE=InnoDB;
+INSERT INTO t1 VALUES(REPEAT(1, 8459264));
+SELECT length(f1) FROM t1;
+length(f1)
+8459264
+DROP TABLE t1;
+#
+# MDEV-27858 Assertion `page_dir_get_n_heap(new_page) == 2U' failed in PageBulk::init
+#
+CREATE TABLE t1 (c INT) ENGINE=InnoDB;
+CREATE TABLE t2 (c INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1);
+LOCK TABLES t1 WRITE,t2 WRITE;
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (1);
+DROP TABLE t2, t1;
+#
+# MDEV-28138 MariaDB Assertion Failed in mtr_buf_t::has_space
+#
+CREATE TABLE t1(
+f1 SERIAL,
+f2 LINESTRING NOT NULL DEFAULT LineFromText('LINESTRING(1 1,2 2,3 3)'),
+SPATIAL INDEX(f2))ENGINE=InnoDB;
+INSERT INTO t1(f1) VALUES(0), (1), (2);
+ERROR 23000: Duplicate entry '1' for key 'f1'
+DROP TABLE t1;
+#
+# MDEV-28237 Assertion `0' failed in row_upd_sec_index_entry on DELETE
+#
+CREATE TABLE t1 (c0 YEAR UNIQUE) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (0),(0),(0),(0),(0),(0),(0);
+ERROR HY000: Got error 1 "Operation not permitted" during COMMIT
+DELETE FROM t1;
+DROP TABLE t1;
+#
+# MDEV-28037 Assertion `trx->bulk_insert' failed in innodb_prepare_commit_versioned
+#
+CREATE TABLE t1 (c INT) ENGINE=InnoDB;
+CREATE TABLE t2 (c INT) ENGINE=InnoDB;
+CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW UPDATE t2 SET c=1;
+INSERT INTO t1 VALUES (0);
+SELECT * FROM t1;
+c
+0
+SELECT * FROM t2;
+c
+DROP TABLE t2, t1;
+#
+# MDEV-28242 Assertion `!check_foreigns' failed in
+# trx_t::check_bulk_buffer
+#
+CREATE TABLE t1 (c INT)ENGINE=InnoDB;
+BEGIN;
+INSERT INTO t1 VALUES(1), (1);
+SET SESSION foreign_key_checks=TRUE;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t2(d INT)ENGINE=InnoDB;
+DROP TABLE t2, t1;
+#
+# MDEV-28400 Leak in trx_mod_time_t::start_bulk_insert
+#
+SET SESSION foreign_key_checks=0;
+CREATE TABLE t1 (a INT) ENGINE=InnoDB PARTITION BY HASH(a) PARTITIONS 2;
+INSERT INTO t1 VALUES (1),(2);
+ALTER TABLE t1 REBUILD PARTITION p0;
+DROP TABLE t1;
+#
+# MDEV-29570 InnoDB fails to clean bulk buffer when server
+# does rollback operation
+#
+CREATE TABLE t1 (pk INT PRIMARY KEY) ENGINE=InnoDB
+PARTITION BY RANGE (pk) (
+PARTITION pn VALUES LESS THAN (20));
+INSERT INTO t1 VALUES (1),(21);
+ERROR HY000: Table has no partition for value 21
+DROP TABLE t1;
+#
+# MDEV-29761 Bulk insert fails to rollback
+# during insert..select
+#
+CREATE TABLE t1 (f1 INT)ENGINE=InnoDB;
+CREATE TABLE t2 (f1 INT, UNIQUE INDEX(f1)) ENGINE=InnoDB;
+CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES(1);
+BEGIN;
+INSERT t1 SELECT 1 FROM seq_1_to_2;
+COMMIT;
+SELECT * FROM t1;
+f1
+SELECT * FROM t2;
+f1
+CHECK TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+CHECK TABLE t2;
+Table Op Msg_type Msg_text
+test.t2 check status OK
+DROP TABLE t1, t2;
+#
+# MDEV-29801 Inconsistent ER_TOO_BIG_ROWSIZE during bulk
+# insert operation
+#
+call mtr.add_suppression("InnoDB: Cannot add field `(c0[36]|c11)` in table");
+SET @format= @@innodb_default_row_format;
+CREATE TABLE t1 (pk int primary key, c01 text, c02 text, c03 text,
+c04 text, c05 text, c06 text, c07 text, c08 text,
+c09 text, c10 text, c11 text, c12 text) ENGINE=InnoDB;
+SET GLOBAL INNODB_DEFAULT_ROW_FORMAT= COMPACT;
+ALTER TABLE t1 FORCE;
+Warnings:
+Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
+INSERT IGNORE INTO t1 VALUES
+(1, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107)),
+(2, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107));
+CHECK TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+DROP TABLE t1;
+SET GLOBAL INNODB_DEFAULT_ROW_FORMAT= @format;
+#
+# MDEV-30321 blob data corrupted by row_merge_write_blob_to_tmp_file()
+#
+CREATE TABLE t1 (
+`id` int(11) NOT NULL,
+`data` LONGBLOB NOT NULL,
+PRIMARY KEY (`id`)
+) ENGINE=InnoDB;
+INSERT INTO t1 VALUES
+(1, REPEAT('X', @@innodb_sort_buffer_size)),
+(2, REPEAT('X', @@innodb_sort_buffer_size));
+SELECT COUNT(*) AS nb_corrupted_rows FROM t1 WHERE data != REPEAT('X', @@innodb_sort_buffer_size);
+nb_corrupted_rows
+0
+DROP TABLE t1;
+# End of 10.7 tests
+#
+# MDEV-30426 Assertion !rec_offs_nth_extern(offsets2, n)
+# during bulk insert
+#
+CREATE TABLE t1(f1 TEXT NOT NULL, f2 TEXT NOT NULL,
+f3 TEXT NOT NULL, f4 TEXT NOT NULL,
+f5 TEXT NOT NULL, f6 TEXT NOT NULL,
+PRIMARY KEY(f6(10)))ENGINE=InnoDB;
+BEGIN;
+INSERT INTO t1 VALUES
+(repeat('a', 200), repeat('b', 200), repeat('c', 200),
+repeat('d', 200), repeat('e', 200), repeat('f', 200)),
+(repeat('b', 20000), repeat('c', 16000), repeat('d', 12000),
+repeat('e', 12000), repeat('f', 12000), repeat('f', 12000));
+ERROR HY000: Got error 1 "Operation not permitted" during COMMIT
+COMMIT;
+DROP TABLE t1;
+# End of 10.8 tests
diff --git a/mysql-test/suite/innodb/r/instant_alter.result b/mysql-test/suite/innodb/r/instant_alter.result
index 4a67e04205b..18680432c77 100644
--- a/mysql-test/suite/innodb/r/instant_alter.result
+++ b/mysql-test/suite/innodb/r/instant_alter.result
@@ -314,12 +314,12 @@ ALTER TABLE t3 ADD COLUMN c7 TIME NOT NULL DEFAULT current_timestamp();
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 1
Warnings:
-Note 1265 Data truncated for column 'c7' at row 1
+Note 1265 Data truncated for column 'c7' at row 0
ALTER TABLE t3 ADD COLUMN c8 DATE NOT NULL DEFAULT current_timestamp();
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 1
Warnings:
-Note 1265 Data truncated for column 'c8' at row 1
+Note 1265 Data truncated for column 'c8' at row 0
SELECT id, c2, ST_AsText(c3) c3, c4, c5, c6, c7, c8 FROM t3;
id c2 c3 c4 c5 c6 c7 c8
1 1 POLYGON((1 1,2 2,3 3,1 1)) 1970-01-01 03:00:42 1970-01-01 03:00:42 NULL 03:00:42 1970-01-01
@@ -1248,12 +1248,12 @@ ALTER TABLE t3 ADD COLUMN c7 TIME NOT NULL DEFAULT current_timestamp();
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 1
Warnings:
-Note 1265 Data truncated for column 'c7' at row 1
+Note 1265 Data truncated for column 'c7' at row 0
ALTER TABLE t3 ADD COLUMN c8 DATE NOT NULL DEFAULT current_timestamp();
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 1
Warnings:
-Note 1265 Data truncated for column 'c8' at row 1
+Note 1265 Data truncated for column 'c8' at row 0
SELECT id, c2, ST_AsText(c3) c3, c4, c5, c6, c7, c8 FROM t3;
id c2 c3 c4 c5 c6 c7 c8
1 1 POLYGON((1 1,2 2,3 3,1 1)) 1970-01-01 03:00:42 1970-01-01 03:00:42 NULL 03:00:42 1970-01-01
@@ -2182,12 +2182,12 @@ ALTER TABLE t3 ADD COLUMN c7 TIME NOT NULL DEFAULT current_timestamp();
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 1
Warnings:
-Note 1265 Data truncated for column 'c7' at row 1
+Note 1265 Data truncated for column 'c7' at row 0
ALTER TABLE t3 ADD COLUMN c8 DATE NOT NULL DEFAULT current_timestamp();
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 1
Warnings:
-Note 1265 Data truncated for column 'c8' at row 1
+Note 1265 Data truncated for column 'c8' at row 0
SELECT id, c2, ST_AsText(c3) c3, c4, c5, c6, c7, c8 FROM t3;
id c2 c3 c4 c5 c6 c7 c8
1 1 POLYGON((1 1,2 2,3 3,1 1)) 1970-01-01 03:00:42 1970-01-01 03:00:42 NULL 03:00:42 1970-01-01
diff --git a/mysql-test/suite/innodb/r/instant_alter_import.result b/mysql-test/suite/innodb/r/instant_alter_import.result
index e1ef373af06..3e7ee35fdc1 100644
--- a/mysql-test/suite/innodb/r/instant_alter_import.result
+++ b/mysql-test/suite/innodb/r/instant_alter_import.result
@@ -1,6 +1,6 @@
call mtr.add_suppression("Operating system error number .* in a file operation.");
call mtr.add_suppression("The error means the system cannot find the path specified.");
-call mtr.add_suppression("File ./test/t1.ibd: 'delete' returned OS error");
+call mtr.add_suppression("File ./test/t1.ibd was not found");
set default_storage_engine=innodb;
#
# MDEV-18295 IMPORT TABLESPACE fails with instant-altered tables
diff --git a/mysql-test/suite/innodb/r/log_corruption.result b/mysql-test/suite/innodb/r/log_corruption.result
index bf92f77d30c..df58a90dcec 100644
--- a/mysql-test/suite/innodb/r/log_corruption.result
+++ b/mysql-test/suite/innodb/r/log_corruption.result
@@ -12,16 +12,15 @@ WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
FOUND 1 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and we did not find a valid checkpoint/ in mysqld.1.err
-FOUND 2 /Plugin 'InnoDB' registration as a STORAGE ENGINE failed/ in mysqld.1.err
# redo log from before MariaDB 10.2.2, with corrupted log block
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and it appears corrupted/ in mysqld.1.err
+FOUND 1 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and we did not find a valid checkpoint/ in mysqld.1.err
# empty redo log from before MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
@@ -29,53 +28,55 @@ COUNT(*)
1
FOUND 1 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Corrupted multi-file redo log from before MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
0
-FOUND 2 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and it appears corrupted/ in mysqld.1.err
-# Empty multi-file redo log from before MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+FOUND 1 /InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and it appears corrupted/ in mysqld.1.err
+# Empty multi-file redo log (wrong offset) from before MariaDB 10.2.2
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
-1
-FOUND 2 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+0
+FOUND 3 /Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and we did not find a valid checkpoint\./ in mysqld.1.err
# Multi-file redo log with size mismatch from after MariaDB 10.2.2
# Corrupted multi-file redo log from after MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
0
-FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!/ in mysqld.1.err
-FOUND 1 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+FOUND 3 /Upgrade after a crash is not supported. This redo log was created before MariaDB 10\.2\.2, and we did not find a valid checkpoint\./ in mysqld.1.err
+FOUND 1 /InnoDB: No valid checkpoint was found; the log was created with BogoDB 1\.2\.3\.4\./ in mysqld.1.err
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
0
-FOUND 2 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
+FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 2097152 bytes than other log files 1048576 bytes!/ in mysqld.1.err
+FOUND 2 /InnoDB: No valid checkpoint was found; the log was created with BogoDB 1\.2\.3\.4\./ in mysqld.1.err
# Empty multi-file redo log from after MariaDB 10.2.2
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
-1
-FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+0
+FOUND 3 /InnoDB: No valid checkpoint was found; the log was created with BogoDB 1\.2\.3\.4\./ in mysqld.1.err
# redo log from "after" MariaDB 10.2.2, but with invalid header checksum
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: Invalid redo log header checksum/ in mysqld.1.err
+FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 2097152 bytes than other log files 4194304 bytes!/ in mysqld.1.err
+FOUND 1 /InnoDB: Invalid log header checksum/ in mysqld.1.err
# distant future redo log format, with valid header checksum
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES
@@ -89,14 +90,14 @@ SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: No valid checkpoint found .corrupted redo log/ in mysqld.1.err
+FOUND 1 /InnoDB: No valid checkpoint was found; the log was created with malicious intentions, or perhaps\./ in mysqld.1.err
# valid header, valid checkpoint 1, all-zero (invalid) checkpoint 2, invalid block checksum
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: Invalid log block checksum. block: 2372 checkpoint no: 1 expected: 3362026715 found: 144444122/ in mysqld.1.err
+FOUND 2 /InnoDB: Invalid log header checksum/ in mysqld.1.err
FOUND 1 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with malicious intentions, or perhaps, and it appears corrupted\./ in mysqld.1.err
# same, but with current-version header
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
@@ -104,7 +105,7 @@ SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 2 /InnoDB: Invalid log block checksum. block: 2372 checkpoint no: 1 expected: 3362026715 found: 144444122/ in mysqld.1.err
+FOUND 3 /InnoDB: Invalid log header checksum/ in mysqld.1.err
# --innodb-force-recovery=6 (skip the entire redo log)
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=6
SELECT * FROM INFORMATION_SCHEMA.ENGINES
@@ -112,7 +113,7 @@ WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
InnoDB YES Supports transactions, row-level locking, foreign keys and encryption for tables YES YES YES
-FOUND 1 /\[Note\] InnoDB: .* started; log sequence number 0/ in mysqld.1.err
+FOUND 1 /\[Note\] InnoDB: log sequence number 0.*; transaction id 0/ in mysqld.1.err
# valid header, valid checkpoint 1, all-zero (invalid) checkpoint 2, invalid block number
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT * FROM INFORMATION_SCHEMA.ENGINES
@@ -141,8 +142,9 @@ SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /InnoDB: Invalid log block checksum. block: 2372 checkpoint no: 1 expected: 2454333373 found: 150151/ in mysqld.1.err
-FOUND 3 /\[ERROR\] InnoDB: Upgrade after a crash is not supported\. The redo log was created with MariaDB 10\.3\.1, and it appears corrupted\./ in mysqld.1.err
+NOT FOUND /InnoDB: Invalid log header checksum
+--source include/search_pattern_in_file.inc
+let SEARCH_PATTERN=\[ERROR\] InnoDB: Upgrade after a crash is not supported\. The redo log was created with MariaDB 10\.3\.1, and it appears corrupted\./ in mysqld.1.err
# valid header, invalid checkpoint 1, valid checkpoint 2, invalid log record
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
SELECT * FROM INFORMATION_SCHEMA.ENGINES
@@ -165,21 +167,29 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
FOUND 3 /\[ERROR\] InnoDB: Upgrade after a crash is not supported\. The redo log was created with MariaDB 10\.3\.1\./ in mysqld.1.err
# Empty 10.3 redo log
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
1
-FOUND 1 /InnoDB: .* started; log sequence number 1213964; transaction id 0/ in mysqld.1.err
+FOUND 1 /InnoDB: log sequence number 1213964\b.*; transaction id 0/ in mysqld.1.err
# Empty 10.2 redo log
-# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
+SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
+WHERE engine = 'innodb'
+AND support IN ('YES', 'DEFAULT', 'ENABLED');
+COUNT(*)
+1
+FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+# Empty 10.5 redo log
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
1
-FOUND 5 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+FOUND 4 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Minimal MariaDB 10.1.21 encrypted redo log
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT * FROM INFORMATION_SCHEMA.ENGINES
diff --git a/mysql-test/suite/innodb/r/log_file.result b/mysql-test/suite/innodb/r/log_file.result
index 642ba41d97f..734e9b07687 100644
--- a/mysql-test/suite/innodb/r/log_file.result
+++ b/mysql-test/suite/innodb/r/log_file.result
@@ -15,7 +15,7 @@ SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-FOUND 1 /File .path.to.non-existent.*ib_logfile101: 'create' returned OS error \d+/ in mysqld.1.err
+FOUND 1 /Cannot create /path/to/non-existent/ib_logfile101/ in mysqld.1.err
# Successfully let InnoDB create tablespaces
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES
@@ -255,7 +255,6 @@ SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
-InnoDB YES Supports transactions, row-level locking, foreign keys and encryption for tables YES YES YES
bak_ib_logfile0
bak_ibdata1
bak_ibdata2
@@ -263,7 +262,6 @@ bak_undo001
bak_undo002
bak_undo003
ib_buffer_pool
-ib_logfile0
ibdata1
ibdata2
undo001
@@ -289,7 +287,6 @@ WHERE engine='innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
1
1
-NOT FOUND /Resizing redo log from 1\*\d+ to 3\*\d+ bytes; LSN=\d+/ in mysqld.1.err
# restart
# Cleanup
bak_ib_logfile0
diff --git a/mysql-test/suite/innodb/r/log_file_name_debug.result b/mysql-test/suite/innodb/r/log_file_name_debug.result
deleted file mode 100644
index e5c1def8f8e..00000000000
--- a/mysql-test/suite/innodb/r/log_file_name_debug.result
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Bug#19685095 DO NOT CARE ABOUT UNRESOLVED MLOG_FILE_NAME
-# IF THERE ARE NO OPERATIONS TO APPLY
-#
-SET GLOBAL DEBUG_DBUG='+d,fil_names_write_bogus';
-CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
-# Kill the server
-# restart: --debug=d,innodb_log_abort_1 --innodb-log-file-size=4194304
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 1 /InnoDB: Tablespace 4294967280 was not found at .*, but there were no modifications either/ in mysqld.1.err
-# restart: --debug=d,innodb_log_abort_3 --innodb-log-file-size=4194304
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
-# restart
-# restart
-DROP TABLE t1;
diff --git a/mysql-test/suite/innodb/r/log_file_size.result b/mysql-test/suite/innodb/r/log_file_size.result
index a0ab35d5c43..7b4935e1ab1 100644
--- a/mysql-test/suite/innodb/r/log_file_size.result
+++ b/mysql-test/suite/innodb/r/log_file_size.result
@@ -1,5 +1,5 @@
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
-# restart: --innodb-log-file-size=2m
+# restart: --innodb-log-file-size=4m
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
@@ -35,61 +35,32 @@ FOUND 1 /syntax error in innodb_log_group_home_dir/ in mysqld.1.err
SELECT * FROM t1;
ERROR 42000: Unknown storage engine 'InnoDB'
FOUND 1 /InnoDB: Starting crash recovery from checkpoint LSN=.*/ in mysqld.1.err
-# restart: --debug=d,innodb_log_abort_3
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
# restart: --innodb-read-only
SELECT * FROM t1;
ERROR 42000: Unknown storage engine 'InnoDB'
FOUND 1 /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err
-# restart: --debug=d,innodb_log_abort_4
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 5 /redo log from [0-9]+ to [0-9]+ bytes/ in mysqld.1.err
# restart: --debug=d,innodb_log_abort_5
SELECT * FROM t1;
ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 6 /redo log from [0-9]+ to [0-9]+ bytes/ in mysqld.1.err
+FOUND 1 /redo log from 5\.000MiB to [0-9.]*[KMGT]iB/ in mysqld.1.err
# restart: --innodb-read-only
SELECT * FROM t1;
ERROR 42000: Unknown storage engine 'InnoDB'
FOUND 2 /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err
-# restart: --debug=d,innodb_log_abort_6
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 7 /redo log from [0-9]+ to [0-9]+ bytes/ in mysqld.1.err
-# restart: --debug=d,innodb_log_abort_7
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
-# restart: --innodb-read-only
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 1 /InnoDB: Cannot create log file in read-only mode/ in mysqld.1.err
-# restart: --debug=d,innodb_log_abort_8
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 1 /InnoDB: Setting log file .*ib_logfile[0-9]+ size to/ in mysqld.1.err
-# restart: --debug=d,innodb_log_abort_9
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 1 /InnoDB: Setting log file .*ib_logfile[0-9]+ size to/ in mysqld.1.err
-# restart: --debug=d,innodb_log_abort_9
+# restart
SELECT * FROM t1;
ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 1 /InnoDB: Log file .*ib_logfile0 size 7 is not a multiple of 512 bytes/ in mysqld.1.err
-# restart: --debug=d,innodb_log_abort_9
-SELECT * FROM t1;
-a
-42
-123
-# restart: --debug=d,innodb_log_abort_10
+FOUND 1 /InnoDB: File .*ib_logfile0 is too small/ in mysqld.1.err
+# restart
SELECT * FROM t1;
ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 1 /InnoDB: Setting log file .*ib_logfile[0-9]+ size to/ in mysqld.1.err
-FOUND 1 /InnoDB: Renaming log file .*ib_logfile101 to .*ib_logfile0/ in mysqld.1.err
+FOUND 1 /InnoDB: Expecting only ib_logfile0/ in mysqld.1.err
+# restart
+FOUND 1 /InnoDB: File .*ib_logfile0 was not found/ in mysqld.1.err
# restart
SELECT * FROM t1;
a
42
123
DROP TABLE t1;
+FOUND 2 /InnoDB: Resizing redo log from 5\.000MiB to [0-9.]*[KMGT]iB; LSN=\d+\b/ in mysqld.1.err
diff --git a/mysql-test/suite/innodb/r/monitor.result b/mysql-test/suite/innodb/r/monitor.result
index c874a84d26b..221c92faaea 100644
--- a/mysql-test/suite/innodb/r/monitor.result
+++ b/mysql-test/suite/innodb/r/monitor.result
@@ -120,9 +120,6 @@ os_data_fsyncs disabled
os_pending_reads disabled
os_pending_writes disabled
os_log_bytes_written disabled
-os_log_fsyncs disabled
-os_log_pending_fsyncs disabled
-os_log_pending_writes disabled
trx_rw_commits disabled
trx_ro_commits disabled
trx_nl_ro_commits disabled
@@ -147,13 +144,9 @@ log_lsn_current disabled
log_lsn_checkpoint_age disabled
log_lsn_buf_pool_oldest disabled
log_max_modified_age_async disabled
-log_pending_log_flushes disabled
-log_pending_checkpoint_writes disabled
-log_num_log_io disabled
log_waits disabled
log_write_requests disabled
log_writes disabled
-log_padded disabled
compress_pages_compressed disabled
compress_pages_decompressed disabled
compression_pad_increments disabled
@@ -282,9 +275,6 @@ os_data_fsyncs enabled
os_pending_reads enabled
os_pending_writes enabled
os_log_bytes_written disabled
-os_log_fsyncs disabled
-os_log_pending_fsyncs enabled
-os_log_pending_writes enabled
set global innodb_monitor_enable="";
ERROR 42000: Variable 'innodb_monitor_enable' can't be set to the value of ''
set global innodb_monitor_enable="_";
diff --git a/mysql-test/suite/innodb/r/online_table_rebuild.result b/mysql-test/suite/innodb/r/online_table_rebuild.result
index d4bddbc5305..46d9780decb 100644
--- a/mysql-test/suite/innodb/r/online_table_rebuild.result
+++ b/mysql-test/suite/innodb/r/online_table_rebuild.result
@@ -43,5 +43,25 @@ t1 CREATE TABLE `t1` (
PRIMARY KEY (`f1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
DROP TABLE t1;
+#
+# MDEV-30183 Assertion `!memcmp(rec_trx_id, old_pk_trx_id->data,
+# 6 + 7)' failed in row_log_table_apply_update
+#
+set @old_sql_mode = @@sql_mode;
+set @@sql_mode="";
+CREATE TABLE t1(col_int int, col_varchar varchar(500))ENGINE=InnoDB;
+INSERT INTO t1(col_int) values(2560);
+set debug_sync="row_log_table_apply1_before SIGNAL con1_begin WAIT_FOR con1_commit";
+ALTER TABLE t1 ADD PRIMARY KEY ( col_varchar);
+connection con1;
+SET DEBUG_SYNC="now WAIT_FOR con1_begin";
+UPDATE t1 SET col_int = 2178;
+INSERT INTO t1(col_int) VALUES(3016);
+UPDATE t1 set col_int=2802;
+SET DEBUG_SYNC="now SIGNAL con1_commit";
+connection default;
+ERROR 23000: Duplicate entry '' for key 'PRIMARY'
+DROP TABLE t1;
+SET @@sql_mode = @old_sql_mode;
disconnect con1;
SET DEBUG_SYNC=reset;
diff --git a/mysql-test/suite/innodb/r/rename_table.result b/mysql-test/suite/innodb/r/rename_table.result
index 8c3722c7940..0ed56005e21 100644
--- a/mysql-test/suite/innodb/r/rename_table.result
+++ b/mysql-test/suite/innodb/r/rename_table.result
@@ -21,7 +21,7 @@ path
DROP DATABASE abc_def;
# restart
DROP DATABASE abc_def2;
-call mtr.add_suppression("InnoDB: (Operating system error|The error means|Cannot rename file)");
+call mtr.add_suppression("InnoDB: (Operating system error|Error number \\d+ means|Cannot rename file)");
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
RENAME TABLE t1 TO non_existing_db.t1;
ERROR HY000: Error on rename of './test/t1' to './non_existing_db/t1' (errno: 168 "Unknown (generic) error from engine")
diff --git a/mysql-test/suite/innodb/r/truncate_missing.result b/mysql-test/suite/innodb/r/truncate_missing.result
index b5348f65c5c..9e28d0fe556 100644
--- a/mysql-test/suite/innodb/r/truncate_missing.result
+++ b/mysql-test/suite/innodb/r/truncate_missing.result
@@ -1,5 +1,5 @@
call mtr.add_suppression("InnoDB: Operating system error number ");
-call mtr.add_suppression("InnoDB: (The error means|If you are|Cannot open datafile) ");
+call mtr.add_suppression("InnoDB: (Error number \\d+ means|If you are|Cannot open datafile) ");
call mtr.add_suppression("InnoDB: Ignoring tablespace for test/t ");
call mtr.add_suppression("InnoDB: Table test/t .* does not exist");
CREATE TABLE t (a SERIAL) ENGINE=InnoDB;
diff --git a/mysql-test/suite/innodb/t/alter_kill.test b/mysql-test/suite/innodb/t/alter_kill.test
index a371a77971d..277d9b4e71b 100644
--- a/mysql-test/suite/innodb/t/alter_kill.test
+++ b/mysql-test/suite/innodb/t/alter_kill.test
@@ -15,11 +15,10 @@ call mtr.add_suppression("InnoDB: Operating system error.*in a file operation");
call mtr.add_suppression("InnoDB: \(The error means\|If you are\)");
call mtr.add_suppression("InnoDB: Ignoring tablespace `test/bug16720368` because it could not be opened");
call mtr.add_suppression("InnoDB: Tablespace .* was not found at.*bug16735660");
-call mtr.add_suppression("InnoDB: Set innodb_force_recovery=1 to ignore this and to permanently lose all changes to the tablespace.");
call mtr.add_suppression("InnoDB: Plugin initialization aborted*");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error.");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed.");
-call mtr.add_suppression("InnoDB: Table `test`\\.`bug16720368` is corrupted");
+call mtr.add_suppression("Table .*bug16720368.* is corrupted");
-- enable_query_log
-- echo #
@@ -79,7 +78,7 @@ EOF
--error ER_NO_SUCH_TABLE_IN_ENGINE
SELECT COUNT(*) FROM bug16720368;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
INSERT INTO bug16720368 VALUES(1);
INSERT INTO bug16720368_1 VALUES(1);
diff --git a/mysql-test/suite/innodb/t/alter_missing_tablespace.test b/mysql-test/suite/innodb/t/alter_missing_tablespace.test
index bac1b1dcdcf..9742adc30a6 100644
--- a/mysql-test/suite/innodb/t/alter_missing_tablespace.test
+++ b/mysql-test/suite/innodb/t/alter_missing_tablespace.test
@@ -10,7 +10,7 @@
--disable_query_log
call mtr.add_suppression("InnoDB: Cannot open datafile for read-only: ");
call mtr.add_suppression("InnoDB: Operating system error number .* in a file operation");
-call mtr.add_suppression("InnoDB: The error means the system cannot find the path specified");
+call mtr.add_suppression("InnoDB: Error number \\d+ means");
call mtr.add_suppression("InnoDB: Ignoring tablespace for test/\(t\|x@002e@002ed\) because it could not be opened");
call mtr.add_suppression("InnoDB: Cannot calculate statistics for table .* because the .ibd file is missing");
call mtr.add_suppression("Could not find a valid tablespace file for");
diff --git a/mysql-test/suite/innodb/t/autoinc_persist.combinations b/mysql-test/suite/innodb/t/autoinc_persist.combinations
new file mode 100644
index 00000000000..4ae2948e523
--- /dev/null
+++ b/mysql-test/suite/innodb/t/autoinc_persist.combinations
@@ -0,0 +1,2 @@
+[asc]
+[desc]
diff --git a/mysql-test/suite/innodb/t/autoinc_persist.test b/mysql-test/suite/innodb/t/autoinc_persist.test
index a2832bd5187..ac933cc7b13 100644
--- a/mysql-test/suite/innodb/t/autoinc_persist.test
+++ b/mysql-test/suite/innodb/t/autoinc_persist.test
@@ -3,6 +3,19 @@
--source include/not_embedded.inc
--source include/no_valgrind_without_big.inc
+if ($MTR_COMBINATION_DESC) {
+ let $AUTO_INCREMENT_KEY_a= AUTO_INCREMENT, PRIMARY KEY(a DESC);
+ let $AUTO_INCREMENT_KEY_b= AUTO_INCREMENT, INDEX(b DESC);
+ let $AUTO_INCREMENT_PRIMARY_KEY_a= AUTO_INCREMENT, PRIMARY KEY(a DESC);
+ let $AUTO_INCREMENT_PRIMARY_KEY_b= AUTO_INCREMENT, ADD PRIMARY KEY(b DESC);
+}
+if (!$MTR_COMBINATION_DESC) {
+ let $AUTO_INCREMENT_KEY_a= AUTO_INCREMENT KEY;
+ let $AUTO_INCREMENT_KEY_b= AUTO_INCREMENT, KEY(b);
+ let $AUTO_INCREMENT_PRIMARY_KEY_a= AUTO_INCREMENT PRIMARY KEY;
+ let $AUTO_INCREMENT_PRIMARY_KEY_b= AUTO_INCREMENT PRIMARY KEY;
+}
+
--echo #
--echo # MDEV-6076 Persistent AUTO_INCREMENT for InnoDB
--echo #
@@ -21,72 +34,72 @@
SET SQL_MODE='STRICT_ALL_TABLES';
-CREATE TABLE t1(a TINYINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t1(a TINYINT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
INSERT INTO t1 VALUES(0), (0), (0), (0), (-1), (-10), (0),
(20), (30), (31);
SELECT * FROM t1;
-CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t2(a TINYINT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
--error ER_WARN_DATA_OUT_OF_RANGE
INSERT INTO t2 VALUES(-5);
INSERT INTO t2 VALUES(0), (0), (0), (0), (8), (10), (0),
(20), (30), (31);
SELECT * FROM t2;
-CREATE TABLE t3(a SMALLINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t3(a SMALLINT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
INSERT INTO t3 VALUES(0), (0), (0), (0), (-1), (-10), (0),
(20), (30), (31), (1024), (4096);
SELECT * FROM t3;
-CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t4(a SMALLINT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
--error ER_WARN_DATA_OUT_OF_RANGE
INSERT INTO t4 VALUES(-5);
INSERT INTO t4 VALUES(0), (0), (0), (0), (8), (10), (0),
(20), (30), (31), (1024), (4096);
SELECT * FROM t4;
-CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t5(a MEDIUMINT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
INSERT INTO t5 VALUES(0), (0), (0), (0), (-1), (-10), (0),
(20), (30), (31), (1000000), (1000005);
SELECT * FROM t5;
-CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t6(a MEDIUMINT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
--error ER_WARN_DATA_OUT_OF_RANGE
INSERT INTO t6 VALUES(-5);
INSERT INTO t6 VALUES(0), (0), (0), (0), (8), (10), (0),
(20), (30), (31), (1000000), (1000005);
SELECT * FROM t6;
-CREATE TABLE t7(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t7(a INT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
INSERT INTO t7 VALUES(0), (0), (0), (0), (-1), (-10), (0),
(20), (30), (31), (100000000), (100000008);
SELECT * FROM t7;
-CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t8(a INT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
--error ER_WARN_DATA_OUT_OF_RANGE
INSERT INTO t8 VALUES(-5);
INSERT INTO t8 VALUES(0), (0), (0), (0), (8), (10), (0),
(20), (30), (31), (100000000), (100000008);
SELECT * FROM t8;
-CREATE TABLE t9(a BIGINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t9(a BIGINT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
INSERT INTO t9 VALUES(0), (0), (0), (0), (-1), (-10), (0),
(20), (30), (31), (100000000000), (100000000006);
SELECT * FROM t9;
-CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t10(a BIGINT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
--error ER_WARN_DATA_OUT_OF_RANGE
INSERT INTO t10 VALUES(-5);
INSERT INTO t10 VALUES(0), (0), (0), (0), (8), (10), (0),
(20), (30), (31), (100000000000), (100000000006);
SELECT * FROM t10;
-CREATE TABLE t11(a FLOAT AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t11(a FLOAT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0),
(20), (30), (31);
SELECT * FROM t11;
-CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB;
+eval CREATE TABLE t12(a DOUBLE $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0),
(20), (30), (31);
SELECT * FROM t12;
@@ -106,7 +119,7 @@ SELECT MAX(a) AS `Expect 100000000` FROM t7;
DELETE FROM t9 WHERE a > 100000000000;
SELECT MAX(a) AS `Expect 100000000000` FROM t9;
-CREATE TABLE t13(a INT AUTO_INCREMENT PRIMARY KEY) ENGINE = InnoDB,
+eval CREATE TABLE t13(a INT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB,
AUTO_INCREMENT = 1234;
--source include/restart_mysqld.inc
@@ -440,7 +453,7 @@ INSERT INTO t3 VALUES(0), (0), (200), (210);
--echo # Scenario 9: Test the sql_mode = NO_AUTO_VALUE_ON_ZERO
-CREATE TABLE t30 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, key(b)) ENGINE = InnoDB;
+eval CREATE TABLE t30 (a INT NOT NULL $AUTO_INCREMENT_PRIMARY_KEY_a, b INT, key(b)) ENGINE = InnoDB;
set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
@@ -455,7 +468,7 @@ set global innodb_flush_log_at_trx_commit=1;
CREATE TABLE t31 (a INT) ENGINE = InnoDB;
INSERT INTO t31 VALUES(1), (2);
-ALTER TABLE t31 ADD b INT AUTO_INCREMENT PRIMARY KEY;
+eval ALTER TABLE t31 ADD b INT $AUTO_INCREMENT_PRIMARY_KEY_b;
INSERT INTO t31 VALUES(3, 0), (4, NULL), (5, NULL);
--error ER_DUP_ENTRY
INSERT INTO t31 VALUES(6, 0);
@@ -464,8 +477,7 @@ SELECT * FROM t31;
SET SQL_MODE = 0;
--echo # Scenario 10: Rollback would not rollback the counter
-CREATE TABLE t32 (
-a BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
+eval CREATE TABLE t32 (a BIGINT $AUTO_INCREMENT_PRIMARY_KEY_a) ENGINE=InnoDB;
INSERT INTO t32 VALUES(0), (0);
@@ -481,10 +493,9 @@ ROLLBACK;
--echo # Scenario 11: Test duplicate primary key/secondary key will not stop
--echo # increasing the counter
-CREATE TABLE t33 (
+eval CREATE TABLE t33 (
a BIGINT NOT NULL PRIMARY KEY,
-b BIGINT NOT NULL AUTO_INCREMENT,
-KEY(b)) ENGINE = InnoDB;
+b BIGINT NOT NULL $AUTO_INCREMENT_KEY_b) ENGINE = InnoDB;
INSERT INTO t33 VALUES(1, NULL);
INSERT INTO t33 VALUES(2, NULL);
@@ -540,10 +551,9 @@ ib_backup_tablespaces("test", "t33");
EOF
UNLOCK TABLES;
DROP TABLE t33;
-CREATE TABLE t33 (
+eval CREATE TABLE t33 (
a BIGINT NOT NULL PRIMARY KEY,
-b BIGINT NOT NULL AUTO_INCREMENT,
-KEY(b)) ENGINE = InnoDB;
+b BIGINT NOT NULL $AUTO_INCREMENT_KEY_b) ENGINE = InnoDB;
ALTER TABLE t33 DISCARD TABLESPACE;
perl;
do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl";
diff --git a/mysql-test/suite/innodb/t/compression_providers_loaded.combinations b/mysql-test/suite/innodb/t/compression_providers_loaded.combinations
new file mode 100644
index 00000000000..d2a413f3902
--- /dev/null
+++ b/mysql-test/suite/innodb/t/compression_providers_loaded.combinations
@@ -0,0 +1,19 @@
+[bzip2]
+innodb
+plugin-load-add=$PROVIDER_BZIP2_SO
+
+[lz4]
+innodb
+plugin-load-add=$PROVIDER_LZ4_SO
+
+[lzma]
+innodb
+plugin-load-add=$PROVIDER_LZMA_SO
+
+[lzo]
+innodb
+plugin-load-add=$PROVIDER_LZO_SO
+
+[snappy]
+innodb
+plugin-load-add=$PROVIDER_SNAPPY_SO
diff --git a/mysql-test/suite/innodb/t/compression_providers_loaded.test b/mysql-test/suite/innodb/t/compression_providers_loaded.test
new file mode 100644
index 00000000000..1b6c348ccfa
--- /dev/null
+++ b/mysql-test/suite/innodb/t/compression_providers_loaded.test
@@ -0,0 +1,18 @@
+let $alg = $MTR_COMBINATIONS;
+
+if (`SELECT COUNT(*) = 0 FROM information_schema.plugins WHERE plugin_name = "provider_$alg" AND plugin_status = "active"`)
+{
+ skip Needs provider_$alg plugin;
+}
+
+--echo #
+--echo # Testing unloaded compression provider: $alg
+--echo #
+
+--echo # Innodb_have_$alg reflects that the provider is loaded
+eval SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_$alg";
+
+--echo # Innodb_compression_algorithm can be set to $alg
+let $innodb_compression_algorithm_orig = `SELECT @@Innodb_compression_algorithm`;
+eval SET GLOBAL Innodb_compression_algorithm = $alg;
+eval SET GLOBAL Innodb_compression_algorithm = $innodb_compression_algorithm_orig;
diff --git a/mysql-test/suite/innodb/t/compression_providers_unloaded.combinations b/mysql-test/suite/innodb/t/compression_providers_unloaded.combinations
new file mode 100644
index 00000000000..20c49960390
--- /dev/null
+++ b/mysql-test/suite/innodb/t/compression_providers_unloaded.combinations
@@ -0,0 +1,14 @@
+[bzip2]
+innodb
+
+[lz4]
+innodb
+
+[lzma]
+innodb
+
+[lzo]
+innodb
+
+[snappy]
+innodb
diff --git a/mysql-test/suite/innodb/t/compression_providers_unloaded.test b/mysql-test/suite/innodb/t/compression_providers_unloaded.test
new file mode 100644
index 00000000000..84bcce59729
--- /dev/null
+++ b/mysql-test/suite/innodb/t/compression_providers_unloaded.test
@@ -0,0 +1,13 @@
+let $alg = $MTR_COMBINATIONS;
+
+--echo #
+--echo # Testing unloaded compression provider: $alg
+--echo #
+
+--echo # Innodb_have_$alg reflects that the provider is not loaded
+eval SHOW GLOBAL STATUS WHERE Variable_name = "Innodb_have_$alg";
+
+--echo # Innodb_compression_algorithm cannot be set to $alg
+error ER_WRONG_VALUE_FOR_VAR;
+eval SET GLOBAL Innodb_compression_algorithm = $alg;
+show warnings;
diff --git a/mysql-test/suite/innodb/t/corrupted_during_recovery.test b/mysql-test/suite/innodb/t/corrupted_during_recovery.test
index 31d353efa38..f383d9ab9b8 100644
--- a/mysql-test/suite/innodb/t/corrupted_during_recovery.test
+++ b/mysql-test/suite/innodb/t/corrupted_during_recovery.test
@@ -7,7 +7,7 @@ call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE faile
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed read of file '.*test.t1\\.ibd' page");
call mtr.add_suppression("InnoDB: Failed to read page 3 from file '.*test.t1\\.ibd': Page read from tablespace is corrupted.");
call mtr.add_suppression("InnoDB: (Unable to apply log to|Discarding log for) corrupted page .*, page number=3\\]");
-call mtr.add_suppression("InnoDB: Table `test`.`t1` is corrupted. Please drop the table and recreate.");
+call mtr.add_suppression("Table test/t1 is corrupted. Please drop the table and recreate\\.");
call mtr.add_suppression("InnoDB: File '.*test/t1\\.ibd' is corrupted");
call mtr.add_suppression("InnoDB: A long wait .* was observed for dict_sys");
--enable_query_log
@@ -59,7 +59,7 @@ SELECT * FROM t1;
let $restart_parameters=--innodb_force_recovery=1;
--source include/restart_mysqld.inc
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_TABLE_CORRUPT
SELECT * FROM t1;
SELECT * FROM t2;
CHECK TABLE t2;
diff --git a/mysql-test/suite/innodb/t/innodb-alter.test b/mysql-test/suite/innodb/t/innodb-alter.test
index 60af7c9df80..78550763a9f 100644
--- a/mysql-test/suite/innodb/t/innodb-alter.test
+++ b/mysql-test/suite/innodb/t/innodb-alter.test
@@ -317,9 +317,9 @@ ALTER TABLE t1n CHANGE c2 c1 INT, CHANGE ct c2 INT, CHANGE c1 ct TEXT,
ALGORITHM=COPY;
SHOW CREATE TABLE t1n;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=INPLACE;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=COPY;
ALTER TABLE t1n ADD INDEX(c4), CHANGE c2 c4 INT, ALGORITHM=INPLACE;
SHOW CREATE TABLE t1n;
diff --git a/mysql-test/suite/innodb/t/innodb-index-online-fk.test b/mysql-test/suite/innodb/t/innodb-index-online-fk.test
index 5c8954064ce..5423516c4b5 100644
--- a/mysql-test/suite/innodb/t/innodb-index-online-fk.test
+++ b/mysql-test/suite/innodb/t/innodb-index-online-fk.test
@@ -245,7 +245,7 @@ CREATE INDEX tb ON child(a2);
SET foreign_key_checks = 0;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
ALTER TABLE child CHANGE a2 a3 INT,
ADD CONSTRAINT fk_1 FOREIGN KEY (a2) REFERENCES parent(b)
ON DELETE SET NULL ON UPDATE CASCADE,
diff --git a/mysql-test/suite/innodb/t/innodb-index-online.opt b/mysql-test/suite/innodb/t/innodb-index-online.opt
index ff20edbe2f7..1837463f07a 100644
--- a/mysql-test/suite/innodb/t/innodb-index-online.opt
+++ b/mysql-test/suite/innodb/t/innodb-index-online.opt
@@ -1,6 +1,5 @@
--loose-innodb-sort-buffer-size=64k
--loose-innodb-online-alter-log-max-size=128k
--loose-innodb-buffer-pool-size=5M
---loose-innodb-log-buffer-size=256k
--loose-innodb-sys-indexes
--loose-innodb-sys-fields
diff --git a/mysql-test/suite/innodb/t/innodb-index.test b/mysql-test/suite/innodb/t/innodb-index.test
index 9350672bee9..c80e3e6c066 100644
--- a/mysql-test/suite/innodb/t/innodb-index.test
+++ b/mysql-test/suite/innodb/t/innodb-index.test
@@ -1,7 +1,6 @@
-- source include/have_innodb.inc
# Embedded server tests do not support restarting.
-- source include/not_embedded.inc
--- source include/maybe_debug.inc
let $MYSQLD_DATADIR= `select @@datadir`;
@@ -666,7 +665,7 @@ SET GLOBAL innodb_monitor_reset = module_ddl;
--echo # Skip sort
--echo # Change PK from (f1,f2,f5,f6) to (f1,f2,f5)
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop column f6;
--enable_info
alter table t1 drop column f6, drop primary key, add primary key(f1,f2,f5);
@@ -692,7 +691,7 @@ SET GLOBAL innodb_monitor_reset = module_ddl;
--echo # Must sort
--echo # Change PK from (f1,f2,f5) to (f1,f5)
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop column f2;
--enable_info
alter table t1 drop column f2, drop primary key, add primary key(f1,f5);
@@ -908,9 +907,9 @@ drop table t1;
create table t1(f1 int not null, f2 int not null,
primary key (f1), unique key(f1, f2))engine=innodb;
insert into t1 values(1,3), (2,2);
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop column f1;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop column f1, drop primary key;
# DROP PRIMARY KEY is implied for a single-column PRIMARY KEY
alter table t1 drop column f1, drop key f1;
@@ -1012,7 +1011,7 @@ drop table t1;
# pk(o1,o2,o3) to pk(o2,o3) by drop o1
create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb;
insert into t1 values(1,2,2),(2,1,1);
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop o1, lock=none;
alter table t1 drop o1, drop primary key, add primary key(o2,o3), lock=none;
drop table t1;
@@ -1020,7 +1019,7 @@ drop table t1;
# pk(o1,o2,o3) to pk(o1,o3) by drop o2
create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb;
insert into t1 values(1,1,2),(1,2,1);
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop o2, lock=none;
alter table t1 drop o2, drop primary key, add primary key(o1,o3), lock=none;
drop table t1;
@@ -1028,7 +1027,7 @@ drop table t1;
# pk(o1,o2,o3) to pk(o3) by drop o1,o2
create table t1(o1 int, o2 int, o3 int, primary key(o1,o2,o3)) engine = innodb;
insert into t1 values(1,2,2),(2,1,1);
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop o1, drop o2, lock=none;
alter table t1 drop o1, drop o2,drop primary key,add primary key(o3),lock=none;
drop table t1;
@@ -1126,9 +1125,6 @@ drop table t1;
--echo #
--source include/no_checkpoint_start.inc
-if ($have_debug) {
-SET GLOBAL DEBUG_DBUG='+d,fil_names_write_bogus';
-}
CREATE TABLE t1(f1 INT PRIMARY KEY)ENGINE=InnoDB;
CREATE TABLE t2(f1 INT PRIMARY KEY)ENGINE=InnoDB;
@@ -1156,13 +1152,6 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
--move_file $MYSQLD_DATADIR/test/t0.ibd $MYSQLD_DATADIR/test/t1.ibd
--source include/start_mysqld.inc
-if ($have_debug) {
-# Initiate shutdown in order to issue a redo log checkpoint and to discard
-# the redo log record that was emitted due to '+d,fil_names_write_bogus'.
---let $restart_noprint=2
---source include/restart_mysqld.inc
---let $restart_noprint=0
-}
SELECT * FROM t1;
SELECT * FROM t2;
@@ -1193,10 +1182,51 @@ SHOW CREATE TABLE t;
--disable_prepare_warnings
DROP TABLE t;
+--echo #
+--echo # MDEV-27374 InnoDB table becomes corrupt after renaming DESC-indexed column
+--echo #
+CREATE TABLE t1 (a VARCHAR(8), PRIMARY KEY(a DESC)) ENGINE=InnoDB;
+ALTER TABLE t1 RENAME COLUMN a TO b, ALGORITHM=INPLACE;
+SELECT TABLE_ID INTO @table_id FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME="test/t1";
+SELECT INDEX_ID INTO @index_id FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE TABLE_ID = @table_id;
+SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS WHERE INDEX_ID=@index_id;
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-27432 ASC/DESC primary and unique keys cause index
+--echo # inconsistency between InnoDB and server
+--echo #
+CREATE TABLE t1 (id INT NOT NULL, UNIQUE(id DESC)) ENGINE=InnoDB;
+ALTER TABLE t1 ADD PRIMARY KEY (id), ALGORITHM=INPLACE;
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-27445 Index inconsistency and assertion failure after
+--echo # renaming virtual column with DESC key
+--echo #
+CREATE TABLE t1(a INT, b INT AS (a), KEY(a, b DESC)) ENGINE=InnoDB;
+ALTER TABLE t1 RENAME COLUMN IF EXISTS b TO v;
+ALTER TABLE t1 FORCE;
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-27592 DESC primary index fails to set wide format
+--echo # while renaming the column
+--echo #
+CREATE TABLE t1 (id INT PRIMARY KEY, a CHAR(8), b INT, KEY(a DESC,b)) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,'foo',10);
+ALTER TABLE t1 RENAME COLUMN b TO c, ALGORITHM=INPLACE;
+SELECT TABLE_ID INTO @table_id FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME="test/t1";
+SELECT INDEX_ID INTO @index_id FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE TABLE_ID = @table_id ORDER BY INDEX_ID DESC LIMIT 1;
+SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS WHERE INDEX_ID=@index_id;
+DROP TABLE t1;
+
+--echo # End of 10.8 tests
+
--disable_query_log
call mtr.add_suppression("InnoDB: Tablespace .* was not found at .*t[12].ibd.");
-call mtr.add_suppression("InnoDB: Set innodb_force_recovery=1 to ignore this and to permanently lose all changes to the tablespace");
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
diff --git a/mysql-test/suite/innodb/t/innodb-table-online-master.opt b/mysql-test/suite/innodb/t/innodb-table-online-master.opt
index 92eea2b0d2e..1eafb5ac188 100644
--- a/mysql-test/suite/innodb/t/innodb-table-online-master.opt
+++ b/mysql-test/suite/innodb/t/innodb-table-online-master.opt
@@ -1 +1 @@
---innodb-sort-buffer-size=64k --innodb-online-alter-log-max-size=512k --innodb-buffer-pool-size=5M --innodb-log-buffer-size=256k
+--innodb-sort-buffer-size=64k --innodb-online-alter-log-max-size=512k --innodb-buffer-pool-size=5M
diff --git a/mysql-test/suite/innodb/t/innodb-table-online.test b/mysql-test/suite/innodb/t/innodb-table-online.test
index bfaabf24bd2..45b1bc1ec8e 100644
--- a/mysql-test/suite/innodb/t/innodb-table-online.test
+++ b/mysql-test/suite/innodb/t/innodb-table-online.test
@@ -313,7 +313,7 @@ SELECT
ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5));
UPDATE t1 SET c3 = NULL WHERE c3 = '';
SET lock_wait_timeout = 1;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
ALTER TABLE t1 DROP COLUMN c22f, ADD PRIMARY KEY c3p5(c3(5));
# NULL -> NOT NULL is only allowed INPLACE without IGNORE.
# Adding a PRIMARY KEY will add NOT NULL implicitly!
diff --git a/mysql-test/suite/innodb/t/innodb-wl5522-debug.test b/mysql-test/suite/innodb/t/innodb-wl5522-debug.test
index 76c7346b521..efa2b1ea403 100644
--- a/mysql-test/suite/innodb/t/innodb-wl5522-debug.test
+++ b/mysql-test/suite/innodb/t/innodb-wl5522-debug.test
@@ -19,7 +19,7 @@
let $restart_noprint=2;
call mtr.add_suppression("InnoDB: Operating system error number .* in a file operation.");
-call mtr.add_suppression("InnoDB: The error means the system cannot find the path specified.");
+call mtr.add_suppression("InnoDB: Error number \\d+ means");
call mtr.add_suppression("InnoDB: Cannot open datafile for read-only: .*");
call mtr.add_suppression("InnoDB: Ignoring tablespace .* because it could not be opened.");
call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded.");
diff --git a/mysql-test/suite/innodb/t/innodb-wl5980-alter.test b/mysql-test/suite/innodb/t/innodb-wl5980-alter.test
index 8f58bc6ce48..09c54db644f 100644
--- a/mysql-test/suite/innodb/t/innodb-wl5980-alter.test
+++ b/mysql-test/suite/innodb/t/innodb-wl5980-alter.test
@@ -528,9 +528,9 @@ ALGORITHM=COPY;
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
SHOW CREATE TABLE t1n;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=INPLACE;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=COPY;
ALTER TABLE t1n ADD INDEX(c4), CHANGE c2 c4 INT, ALGORITHM=INPLACE;
diff --git a/mysql-test/suite/innodb/t/innodb_28867993.test b/mysql-test/suite/innodb/t/innodb_28867993.test
index 61e9578df7b..4777a9ac77f 100644
--- a/mysql-test/suite/innodb/t/innodb_28867993.test
+++ b/mysql-test/suite/innodb/t/innodb_28867993.test
@@ -6,6 +6,10 @@ source include/have_innodb.inc;
create table t1 (a int) engine=innodb;
insert t1 values (1),(2);
create database ib_logfile2;
+--disable_query_log
+call mtr.add_suppression("InnoDB: Operating system error number ");
+call mtr.add_suppression("InnoDB: Error number .* means ");
+--enable_query_log
source include/restart_mysqld.inc;
select * from t1;
drop table t1;
diff --git a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize.test b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize.test
index 932829470e3..051f38a572e 100644
--- a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize.test
+++ b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize.test
@@ -7,7 +7,7 @@
let $wait_timeout = 180;
let $wait_condition =
- SELECT SUBSTR(variable_value, 1, 34) = 'Completed resizing buffer pool at '
+ SELECT SUBSTR(variable_value, 1, 30) = 'Completed resizing buffer pool'
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_buffer_pool_resize_status';
@@ -45,7 +45,7 @@ SET GLOBAL innodb_read_only_compressed=@save_innodb_read_only_compressed;
--enable_query_log
# Shrink buffer pool
-set global innodb_buffer_pool_size = 7340032;
+set global innodb_buffer_pool_size = 64 * 1024 * 1024 + 512 * 1024;
--source include/wait_condition.inc
select @@innodb_buffer_pool_size;
diff --git a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_temporary.test b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_temporary.test
index 1cdf4a318d0..c49ae451638 100644
--- a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_temporary.test
+++ b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_temporary.test
@@ -15,7 +15,7 @@ SET GLOBAL innodb_buffer_pool_size=8388608;
let $wait_timeout = 60;
let $wait_condition =
- SELECT SUBSTR(variable_value, 1, 34) = 'Completed resizing buffer pool at '
+ SELECT SUBSTR(variable_value, 1, 30) = 'Completed resizing buffer pool'
FROM information_schema.global_status
WHERE variable_name = 'INNODB_BUFFER_POOL_RESIZE_STATUS';
--source include/wait_condition.inc
diff --git a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_with_chunks.test b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_with_chunks.test
index d11443ca1b2..78db6bf0d5a 100644
--- a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_with_chunks.test
+++ b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_with_chunks.test
@@ -8,7 +8,7 @@
let $wait_timeout = 180;
let $wait_condition =
- SELECT SUBSTR(variable_value, 1, 34) = 'Completed resizing buffer pool at '
+ SELECT SUBSTR(variable_value, 1, 30) = 'Completed resizing buffer pool'
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_buffer_pool_resize_status';
diff --git a/mysql-test/suite/innodb/t/innodb_bug44571.test b/mysql-test/suite/innodb/t/innodb_bug44571.test
index e27ed0b9bf8..08f41ed8fd8 100644
--- a/mysql-test/suite/innodb/t/innodb_bug44571.test
+++ b/mysql-test/suite/innodb/t/innodb_bug44571.test
@@ -12,7 +12,7 @@ ALTER TABLE bug44571 CHANGE foo bar INT;
# because the CHANGE foo bar is successful. And
# the column name change would communicate to
# InnoDB with the fix from bug #47621
--- error ER_KEY_COLUMN_DOES_NOT_EXITS
+-- error ER_KEY_COLUMN_DOES_NOT_EXIST
ALTER TABLE bug44571 ADD INDEX bug44571b (foo);
# The following create indexes should succeed,
# indirectly confirm the CHANGE foo bar is successful.
diff --git a/mysql-test/suite/innodb/t/innodb_page_compressed.combinations b/mysql-test/suite/innodb/t/innodb_page_compressed.combinations
index f3caab14af3..498c85ee65c 100644
--- a/mysql-test/suite/innodb/t/innodb_page_compressed.combinations
+++ b/mysql-test/suite/innodb/t/innodb_page_compressed.combinations
@@ -1,6 +1,11 @@
[bzip2]
+plugin-load-add=$PROVIDER_BZIP2_SO
[lz4]
+plugin-load-add=$PROVIDER_LZ4_SO
[lzma]
+plugin-load-add=$PROVIDER_LZMA_SO
[lzo]
+plugin-load-add=$PROVIDER_LZO_SO
[snappy]
+plugin-load-add=$PROVIDER_SNAPPY_SO
[zlib]
diff --git a/mysql-test/suite/innodb/t/insert_into_empty.opt b/mysql-test/suite/innodb/t/insert_into_empty.opt
new file mode 100644
index 00000000000..c856c2d215a
--- /dev/null
+++ b/mysql-test/suite/innodb/t/insert_into_empty.opt
@@ -0,0 +1 @@
+--innodb_sort_buffer_size=65536
diff --git a/mysql-test/suite/innodb/t/insert_into_empty.test b/mysql-test/suite/innodb/t/insert_into_empty.test
index 010b7ecb43a..8452cecf700 100644
--- a/mysql-test/suite/innodb/t/insert_into_empty.test
+++ b/mysql-test/suite/innodb/t/insert_into_empty.test
@@ -210,7 +210,9 @@ INSERT INTO t1 SELECT * FROM seq_1_to_4096;
let $wait_condition= select n_rows > 100 from mysql.innodb_table_stats
where table_name="t1";
source include/wait_condition.inc;
-SELECT n_rows>=4096 FROM mysql.innodb_table_stats WHERE TABLE_NAME="t1";
+# At innodb_page_size=4k this will be only 4075, not 4096. Add some slack.
+# This is related to MDEV-24621 and possibly MDEV-26740.
+SELECT n_rows>=4000 FROM mysql.innodb_table_stats WHERE TABLE_NAME="t1";
DROP TABLE t1;
@@ -241,7 +243,7 @@ begin;
--error ER_WRONG_VALUE_COUNT_ON_ROW
INSERT INTO t VALUES (0,0);
SAVEPOINT a;
---error ER_DUP_ENTRY
+--error ER_ERROR_DURING_COMMIT
INSERT INTO t VALUES (0),(0);
SAVEPOINT a;
commit;
@@ -270,3 +272,210 @@ disconnect con1;
SELECT * FROM t1;
DROP TABLE t1;
--echo # End of 10.6 tests
+
+--echo #
+--echo # MDEV-26947 UNIQUE column checks fail in InnoDB resulting
+--echo # in table corruption
+--echo #
+
+CREATE TABLE t (c1 INT KEY,c2 INT UNIQUE) ENGINE=InnoDB;
+BEGIN;
+--error ER_ERROR_DURING_COMMIT
+INSERT INTO t VALUES (1,0),(2,0);
+CHECK TABLE t;
+COMMIT;
+DROP TABLE t;
+
+CREATE TABLE t (i INT UNIQUE)ENGINE=InnoDB;
+--error ER_ERROR_DURING_COMMIT
+INSERT INTO t VALUES (0),(0);
+CHECK TABLE t;
+DROP TABLE t;
+
+CREATE TABLE t (c INT PRIMARY KEY,c2 CHAR(1) UNIQUE)ENGINE=InnoDB;
+BEGIN;
+--error ER_ERROR_DURING_COMMIT
+INSERT INTO t VALUES(1, ''),(2, '');
+SELECT * FROM t;
+DELETE FROM t;
+COMMIT;
+DROP TABLE t;
+
+--echo #
+--echo # MDEV-26956 LeakSanitizer/Valgrind errors in
+--echo # trx_mod_table_time_t::start_bulk_insert
+--echo # upon adding system versioning
+--echo #
+CREATE TABLE t1(id INT, s DATE, e DATE, PERIOD FOR p(s,e),
+ PRIMARY KEY(id, p WITHOUT OVERLAPS)) ENGINE=InnoDB;
+ALTER TABLE t1 ADD COLUMN row_start BIGINT UNSIGNED AS ROW START,
+ ADD COLUMN row_end BIGINT UNSIGNED AS ROW END,
+ ADD PERIOD FOR SYSTEM_TIME(row_start,row_end), WITH SYSTEM VERSIONING;
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-27316 Assertion `!(index)->is_spatial()' failed.
+--echo #
+CREATE TABLE t (c POINT NOT NULL, SPATIAL INDEX(c)) ENGINE=InnoDB;
+INSERT INTO t VALUES (POINT(1, 1));
+SELECT COUNT(*) FROM t WHERE MBRWithin(t.c, POINT(1,1));
+DROP TABLE t;
+
+--echo #
+--echo # MDEV-27318 Assertion data_size < srv_sort_buf_size failed in row_merge_bulk_buf_add
+--echo #
+CREATE TABLE t1(f1 MEDIUMTEXT)ENGINE=InnoDB;
+INSERT INTO t1 VALUES(REPEAT(1, 8459264));
+SELECT length(f1) FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-27858 Assertion `page_dir_get_n_heap(new_page) == 2U' failed in PageBulk::init
+--echo #
+CREATE TABLE t1 (c INT) ENGINE=InnoDB;
+CREATE TABLE t2 (c INT) ENGINE=InnoDB;
+INSERT INTO t2 VALUES (1);
+LOCK TABLES t1 WRITE,t2 WRITE;
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (1);
+DROP TABLE t2, t1;
+
+--echo #
+--echo # MDEV-28138 MariaDB Assertion Failed in mtr_buf_t::has_space
+--echo #
+CREATE TABLE t1(
+ f1 SERIAL,
+ f2 LINESTRING NOT NULL DEFAULT LineFromText('LINESTRING(1 1,2 2,3 3)'),
+SPATIAL INDEX(f2))ENGINE=InnoDB;
+--error ER_DUP_ENTRY
+INSERT INTO t1(f1) VALUES(0), (1), (2);
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-28237 Assertion `0' failed in row_upd_sec_index_entry on DELETE
+--echo #
+CREATE TABLE t1 (c0 YEAR UNIQUE) ENGINE=InnoDB;
+--error ER_ERROR_DURING_COMMIT
+INSERT INTO t1 VALUES (0),(0),(0),(0),(0),(0),(0);
+DELETE FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-28037 Assertion `trx->bulk_insert' failed in innodb_prepare_commit_versioned
+--echo #
+CREATE TABLE t1 (c INT) ENGINE=InnoDB;
+CREATE TABLE t2 (c INT) ENGINE=InnoDB;
+CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW UPDATE t2 SET c=1;
+INSERT INTO t1 VALUES (0);
+SELECT * FROM t1;
+SELECT * FROM t2;
+DROP TABLE t2, t1;
+
+--echo #
+--echo # MDEV-28242 Assertion `!check_foreigns' failed in
+--echo # trx_t::check_bulk_buffer
+--echo #
+CREATE TABLE t1 (c INT)ENGINE=InnoDB;
+BEGIN;
+INSERT INTO t1 VALUES(1), (1);
+SET SESSION foreign_key_checks=TRUE;
+SHOW CREATE TABLE t1;
+CREATE TABLE t2(d INT)ENGINE=InnoDB;
+DROP TABLE t2, t1;
+
+--echo #
+--echo # MDEV-28400 Leak in trx_mod_time_t::start_bulk_insert
+--echo #
+
+SET SESSION foreign_key_checks=0;
+CREATE TABLE t1 (a INT) ENGINE=InnoDB PARTITION BY HASH(a) PARTITIONS 2;
+INSERT INTO t1 VALUES (1),(2);
+ALTER TABLE t1 REBUILD PARTITION p0;
+# Cleanup
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-29570 InnoDB fails to clean bulk buffer when server
+--echo # does rollback operation
+--echo #
+CREATE TABLE t1 (pk INT PRIMARY KEY) ENGINE=InnoDB
+ PARTITION BY RANGE (pk) (
+ PARTITION pn VALUES LESS THAN (20));
+--error ER_NO_PARTITION_FOR_GIVEN_VALUE
+INSERT INTO t1 VALUES (1),(21);
+# Cleanup
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-29761 Bulk insert fails to rollback
+--echo # during insert..select
+--echo #
+CREATE TABLE t1 (f1 INT)ENGINE=InnoDB;
+CREATE TABLE t2 (f1 INT, UNIQUE INDEX(f1)) ENGINE=InnoDB;
+CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES(1);
+BEGIN;
+INSERT t1 SELECT 1 FROM seq_1_to_2;
+COMMIT;
+SELECT * FROM t1;
+SELECT * FROM t2;
+CHECK TABLE t1;
+CHECK TABLE t2;
+DROP TABLE t1, t2;
+
+--echo #
+--echo # MDEV-29801 Inconsistent ER_TOO_BIG_ROWSIZE during bulk
+--echo # insert operation
+--echo #
+call mtr.add_suppression("InnoDB: Cannot add field `(c0[36]|c11)` in table");
+
+SET @format= @@innodb_default_row_format;
+CREATE TABLE t1 (pk int primary key, c01 text, c02 text, c03 text,
+ c04 text, c05 text, c06 text, c07 text, c08 text,
+ c09 text, c10 text, c11 text, c12 text) ENGINE=InnoDB;
+SET GLOBAL INNODB_DEFAULT_ROW_FORMAT= COMPACT;
+--replace_result 1982 8126 4030 8126
+ALTER TABLE t1 FORCE;
+INSERT IGNORE INTO t1 VALUES
+(1, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107)),
+(2, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107));
+CHECK TABLE t1;
+DROP TABLE t1;
+SET GLOBAL INNODB_DEFAULT_ROW_FORMAT= @format;
+
+--echo #
+--echo # MDEV-30321 blob data corrupted by row_merge_write_blob_to_tmp_file()
+--echo #
+
+CREATE TABLE t1 (
+ `id` int(11) NOT NULL,
+ `data` LONGBLOB NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB;
+
+INSERT INTO t1 VALUES
+ (1, REPEAT('X', @@innodb_sort_buffer_size)),
+ (2, REPEAT('X', @@innodb_sort_buffer_size));
+
+SELECT COUNT(*) AS nb_corrupted_rows FROM t1 WHERE data != REPEAT('X', @@innodb_sort_buffer_size);
+DROP TABLE t1;
+
+--echo # End of 10.7 tests
+
+--echo #
+--echo # MDEV-30426 Assertion !rec_offs_nth_extern(offsets2, n)
+--echo # during bulk insert
+--echo #
+CREATE TABLE t1(f1 TEXT NOT NULL, f2 TEXT NOT NULL,
+ f3 TEXT NOT NULL, f4 TEXT NOT NULL,
+ f5 TEXT NOT NULL, f6 TEXT NOT NULL,
+ PRIMARY KEY(f6(10)))ENGINE=InnoDB;
+BEGIN;
+--error ER_ERROR_DURING_COMMIT
+INSERT INTO t1 VALUES
+ (repeat('a', 200), repeat('b', 200), repeat('c', 200),
+ repeat('d', 200), repeat('e', 200), repeat('f', 200)),
+ (repeat('b', 20000), repeat('c', 16000), repeat('d', 12000),
+ repeat('e', 12000), repeat('f', 12000), repeat('f', 12000));
+COMMIT;
+DROP TABLE t1;
+--echo # End of 10.8 tests
diff --git a/mysql-test/suite/innodb/t/instant_alter_import.test b/mysql-test/suite/innodb/t/instant_alter_import.test
index 87a36186150..3a811def170 100644
--- a/mysql-test/suite/innodb/t/instant_alter_import.test
+++ b/mysql-test/suite/innodb/t/instant_alter_import.test
@@ -4,7 +4,7 @@
call mtr.add_suppression("Operating system error number .* in a file operation.");
call mtr.add_suppression("The error means the system cannot find the path specified.");
-call mtr.add_suppression("File ./test/t1.ibd: 'delete' returned OS error");
+call mtr.add_suppression("File ./test/t1.ibd was not found");
--disable_query_log
call mtr.add_suppression("Table `test`.`t2` contains unrecognizable instant ALTER metadata");
diff --git a/mysql-test/suite/innodb/t/log_corruption.test b/mysql-test/suite/innodb/t/log_corruption.test
index 333fefee507..6f7080f5b50 100644
--- a/mysql-test/suite/innodb/t/log_corruption.test
+++ b/mysql-test/suite/innodb/t/log_corruption.test
@@ -8,8 +8,8 @@ call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
call mtr.add_suppression("InnoDB: Unsupported redo log format");
-call mtr.add_suppression("InnoDB: No valid checkpoint found");
-call mtr.add_suppression("InnoDB: Invalid (log block|redo log header) checksum");
+call mtr.add_suppression("InnoDB: No valid checkpoint was found");
+call mtr.add_suppression("InnoDB: Invalid log header checksum");
call mtr.add_suppression("InnoDB: Missing MLOG_CHECKPOINT");
call mtr.add_suppression("InnoDB: MLOG_FILE_NAME incorrect");
call mtr.add_suppression("InnoDB: ############### CORRUPT LOG RECORD FOUND");
@@ -17,8 +17,7 @@ call mtr.add_suppression("InnoDB: Log scan aborted at LSN");
call mtr.add_suppression("InnoDB: Missing MLOG_FILE_NAME or MLOG_FILE_DELETE before MLOG_CHECKPOINT for tablespace 42\\r?$");
call mtr.add_suppression("InnoDB: Obtaining redo log encryption key version 1 failed");
call mtr.add_suppression("InnoDB: Decrypting checkpoint failed");
-call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfile0 to start up the database\\? Log sequence number in the ib_logfile0 is 1213964,");
-call mtr.add_suppression("InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!");
+call mtr.add_suppression("InnoDB: Log file .*ib_logfile1 is of different size 2097152 bytes than other log files (1048576|4194304) bytes!");
call mtr.add_suppression("InnoDB: The change buffer is corrupted");
--enable_query_log
@@ -136,8 +135,6 @@ eval $check_no_innodb;
let SEARCH_PATTERN=InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\\.2\\.2, and we did not find a valid checkpoint;
--source include/search_pattern_in_file.inc
-let SEARCH_PATTERN=Plugin 'InnoDB' registration as a STORAGE ENGINE failed;
---source include/search_pattern_in_file.inc
--echo # redo log from before MariaDB 10.2.2, with corrupted log block
--remove_file $bugdir/ib_logfile0
@@ -156,7 +153,6 @@ EOF
--source include/start_mysqld.inc
eval $check_no_innodb;
--source include/shutdown_mysqld.inc
-let SEARCH_PATTERN=InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\\.2\\.2, and it appears corrupted;
--source include/search_pattern_in_file.inc
--echo # empty redo log from before MariaDB 10.2.2
@@ -167,7 +163,7 @@ die unless seek(OUT, 0x800, 0);
print OUT pack("NnnNx[496]N", 0x80000944, 12, 12, 0, 0xb2a);
close OUT or die;
EOF
---let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=2m
+--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=4m
--source include/start_mysqld.inc
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
@@ -197,7 +193,7 @@ print OUT chr(0) x 2048;
close OUT or die;
EOF
---let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=2m
+--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=4m
--source include/start_mysqld.inc
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
@@ -206,7 +202,7 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
let SEARCH_PATTERN=InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10\\.2\\.2, and it appears corrupted;
--source include/search_pattern_in_file.inc
---echo # Empty multi-file redo log from before MariaDB 10.2.2
+--echo # Empty multi-file redo log (wrong offset) from before MariaDB 10.2.2
perl;
die unless open OUT, "+<", "$ENV{bugdir}/ib_logfile1";
binmode OUT;
@@ -216,13 +212,13 @@ print OUT chr(0) x 1536;
close OUT or die;
EOF
---let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=2m
+--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=4m
--source include/start_mysqld.inc
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
--source include/shutdown_mysqld.inc
---let SEARCH_PATTERN= InnoDB: Upgrading redo log:
+--let SEARCH_PATTERN= Upgrade after a crash is not supported. This redo log was created before MariaDB 10\\.2\\.2, and we did not find a valid checkpoint\\.
--source include/search_pattern_in_file.inc
--echo # Multi-file redo log with size mismatch from after MariaDB 10.2.2
@@ -247,15 +243,14 @@ close OUT or die;
EOF
--echo # Corrupted multi-file redo log from after MariaDB 10.2.2
---let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=2m
+--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=4m
--source include/start_mysqld.inc
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
--source include/shutdown_mysqld.inc
---let SEARCH_PATTERN=InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!
--source include/search_pattern_in_file.inc
---let SEARCH_PATTERN=InnoDB: Upgrade after a crash is not supported\\. The redo log was created with BogoDB 1\\.2\\.3\\.4, and it appears corrupted\\.
+--let SEARCH_PATTERN=InnoDB: No valid checkpoint was found; the log was created with BogoDB 1\\.2\\.3\\.4\\.
--source include/search_pattern_in_file.inc
perl;
@@ -266,13 +261,15 @@ print OUT chr(0);
close OUT or die;
EOF
---let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=2m
+--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=4m
--source include/start_mysqld.inc
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
--source include/shutdown_mysqld.inc
---let SEARCH_PATTERN=InnoDB: Upgrade after a crash is not supported\\. The redo log was created with BogoDB 1\\.2\\.3\\.4, and it appears corrupted\\.
+--let SEARCH_PATTERN=InnoDB: Log file .*ib_logfile1 is of different size 2097152 bytes than other log files 1048576 bytes!
+--source include/search_pattern_in_file.inc
+--let SEARCH_PATTERN=InnoDB: No valid checkpoint was found; the log was created with BogoDB 1\\.2\\.3\\.4\\.
--source include/search_pattern_in_file.inc
--echo # Empty multi-file redo log from after MariaDB 10.2.2
@@ -288,13 +285,12 @@ print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
close OUT or die;
EOF
---let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=2m
+--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=4m
--source include/start_mysqld.inc
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
--source include/shutdown_mysqld.inc
---let SEARCH_PATTERN= InnoDB: Upgrading redo log:
--source include/search_pattern_in_file.inc
--let $restart_parameters= $dirs
@@ -311,7 +307,9 @@ EOF
--source include/start_mysqld.inc
eval $check_no_innodb;
--source include/shutdown_mysqld.inc
-let SEARCH_PATTERN=InnoDB: Invalid redo log header checksum;
+--let SEARCH_PATTERN=InnoDB: Log file .*ib_logfile1 is of different size 2097152 bytes than other log files 4194304 bytes!
+--source include/search_pattern_in_file.inc
+let SEARCH_PATTERN=InnoDB: Invalid log header checksum;
--source include/search_pattern_in_file.inc
--echo # distant future redo log format, with valid header checksum
@@ -347,7 +345,7 @@ EOF
--source include/start_mysqld.inc
eval $check_no_innodb;
--source include/shutdown_mysqld.inc
-let SEARCH_PATTERN=InnoDB: No valid checkpoint found .corrupted redo log;
+--let SEARCH_PATTERN=InnoDB: No valid checkpoint was found; the log was created with malicious intentions, or perhaps\\.
--source include/search_pattern_in_file.inc
--echo # valid header, valid checkpoint 1, all-zero (invalid) checkpoint 2, invalid block checksum
@@ -358,6 +356,9 @@ die unless seek(OUT, 0x210, 0);
print OUT pack("NNx[264]", 0, 0x80c);
print OUT pack("NNx[212]N", 0x590dbaac, 0xfe922582, 0xc72d49c4);
close OUT or die;
+die unless open OUT, ">", "$ENV{bugdir}/ib_logfile1";
+print OUT pack("x[4194304]");
+close OUT or die;
EOF
# Anything below innodb_force_recovery=6 must find a valid redo log.
# Missing tablespace files are tolerated already with innodb_force_recovery=1.
@@ -365,7 +366,7 @@ EOF
--source include/start_mysqld.inc
eval $check_no_innodb;
--source include/shutdown_mysqld.inc
-let SEARCH_PATTERN=InnoDB: Invalid log block checksum. block: 2372 checkpoint no: 1 expected: 3362026715 found: 144444122;
+let SEARCH_PATTERN=InnoDB: Invalid log header checksum;
--source include/search_pattern_in_file.inc
let SEARCH_PATTERN=InnoDB: Upgrade after a crash is not supported\. The redo log was created with malicious intentions, or perhaps, and it appears corrupted\.;
--source include/search_pattern_in_file.inc
@@ -382,14 +383,14 @@ EOF
eval $check_no_innodb;
--source include/shutdown_mysqld.inc
-let SEARCH_PATTERN=InnoDB: Invalid log block checksum. block: 2372 checkpoint no: 1 expected: 3362026715 found: 144444122;
+let SEARCH_PATTERN=InnoDB: Invalid log header checksum;
--source include/search_pattern_in_file.inc
--echo # --innodb-force-recovery=6 (skip the entire redo log)
--let $restart_parameters= $dirs --innodb-force-recovery=6
--source include/start_mysqld.inc
eval $check_no_innodb;
--source include/shutdown_mysqld.inc
---let SEARCH_PATTERN=\\[Note\\] InnoDB: .* started; log sequence number 0
+--let SEARCH_PATTERN=\\[Note\\] InnoDB: log sequence number 0.*; transaction id 0
--source include/search_pattern_in_file.inc
--echo # valid header, valid checkpoint 1, all-zero (invalid) checkpoint 2, invalid block number
@@ -466,7 +467,7 @@ EOF
--source include/start_mysqld.inc
eval $check_no_innodb;
--source include/shutdown_mysqld.inc
-let SEARCH_PATTERN=InnoDB: Invalid log block checksum. block: 2372 checkpoint no: 1 expected: 2454333373 found: 150151;
+let SEARCH_PATTERN=InnoDB: Invalid log header checksum
--source include/search_pattern_in_file.inc
let SEARCH_PATTERN=\\[ERROR\\] InnoDB: Upgrade after a crash is not supported\. The redo log was created with MariaDB 10\.3\.1, and it appears corrupted\.;
--source include/search_pattern_in_file.inc
@@ -540,13 +541,13 @@ print OUT pack("NnnNx[496]N", 0x80000944, 12, 12, 1, 0x46c8a2a2);
close OUT or die;
EOF
---let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=2m
+--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=4m
--source include/start_mysqld.inc
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
--source include/shutdown_mysqld.inc
---let SEARCH_PATTERN= InnoDB: .* started; log sequence number 1213964; transaction id 0
+--let SEARCH_PATTERN= InnoDB: log sequence number 1213964\\b.*; transaction id 0
--source include/search_pattern_in_file.inc
--echo # Empty 10.2 redo log
@@ -579,6 +580,33 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
--let SEARCH_PATTERN= InnoDB: Upgrading redo log:
--source include/search_pattern_in_file.inc
+--echo # Empty 10.5 redo log
+perl;
+die unless open OUT, "+<", "$ENV{bugdir}/ib_logfile0";
+binmode OUT;
+# header block
+print OUT pack("Nx[5]nx[5]", 0x50485953, 0x1286);
+print OUT "ibbackup was here!!!1!";
+print OUT pack("x[470]N", 0x677700cf);
+# invalid (all-zero) checkpoint page 1 and an empty log page
+print OUT chr(0) x 1024;
+# valid checkpoint block 2
+print OUT pack("x[12]NNNx[264]", 0x12860c, 0, 0x80c);
+# pointer to the FILE_CHECKPOINT record, and checkpoint page checksum
+print OUT pack("H*x[204]NNN", "590DBAACFE922582", 0x128612, 0, 0x101741b);
+# log page
+print OUT pack("NnnNx[496]N", 0x80000944, 12, 12, 1, 0x46c8a2a2);
+close OUT or die;
+EOF
+
+--source include/start_mysqld.inc
+SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
+WHERE engine = 'innodb'
+AND support IN ('YES', 'DEFAULT', 'ENABLED');
+--source include/shutdown_mysqld.inc
+--let SEARCH_PATTERN= InnoDB: Upgrading redo log:
+--source include/search_pattern_in_file.inc
+
--echo # Minimal MariaDB 10.1.21 encrypted redo log
perl;
die unless open OUT, "+<", "$ENV{bugdir}/ib_logfile0";
diff --git a/mysql-test/suite/innodb/t/log_file.test b/mysql-test/suite/innodb/t/log_file.test
index 2484e787973..438fbe1a6e1 100644
--- a/mysql-test/suite/innodb/t/log_file.test
+++ b/mysql-test/suite/innodb/t/log_file.test
@@ -12,7 +12,7 @@ call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
call mtr.add_suppression("InnoDB: Operating system error number \d+ in a file operation");
call mtr.add_suppression("InnoDB: The error means the system cannot find the path specified");
-call mtr.add_suppression("InnoDB: File .path.to.non-existent.ib_logfile101: 'create' returned OS error \d+");
+call mtr.add_suppression("InnoDB: File /path/to/non-existent/ib_logfile101 was not found");
call mtr.add_suppression("InnoDB: Cannot create .path.to.non-existent.ib_logfile101");
call mtr.add_suppression("InnoDB: The data file '.*ibdata1' was not found but one of the other data files '.*ibdata2' exists");
call mtr.add_suppression("InnoDB: Tablespace size stored in header is \d+ pages, but the sum of data file sizes is \d+ pages");
@@ -62,7 +62,7 @@ let SEARCH_PATTERN=\[ERROR\] InnoDB: Could not create undo tablespace '.*undo002
--source include/start_mysqld.inc
eval $check_no_innodb;
--source include/shutdown_mysqld.inc
-let SEARCH_PATTERN=File .path.to.non-existent.*ib_logfile101: 'create' returned OS error \d+;
+let SEARCH_PATTERN=Cannot create /path/to/non-existent/ib_logfile101;
--source include/search_pattern_in_file.inc
--list_files $bugdir
@@ -209,8 +209,6 @@ eval $check_no_innodb;
--source include/start_mysqld.inc
eval $check_yes_innodb;
--source include/shutdown_mysqld.inc
---let SEARCH_PATTERN=Resizing redo log from 1\*\d+ to 3\*\d+ bytes; LSN=\d+
---source include/search_pattern_in_file.inc
--let $restart_parameters=
--source include/start_mysqld.inc
diff --git a/mysql-test/suite/innodb/t/log_file_name.test b/mysql-test/suite/innodb/t/log_file_name.test
index 89fe04bcdfb..eb616d7f835 100644
--- a/mysql-test/suite/innodb/t/log_file_name.test
+++ b/mysql-test/suite/innodb/t/log_file_name.test
@@ -146,13 +146,12 @@ DROP TABLE t0;
--disable_query_log
# The following are for the orphan file t0.ibd or for the directory t2.ibd:
call mtr.add_suppression("InnoDB: Operating system error number [0-9]* in a file operation");
-call mtr.add_suppression("InnoDB: Error number [0-9]* means '(File exists|Is a directory)'");
+call mtr.add_suppression("InnoDB: Error number \\d+ means");
call mtr.add_suppression("InnoDB: Cannot create file '.*t0.ibd'");
call mtr.add_suppression("InnoDB: The file '.*t0\.ibd' already exists");
call mtr.add_suppression("InnoDB: Cannot open datafile for read-write: '.*t2\.ibd'");
# The following are for aborted startup without --innodb-force-recovery:
call mtr.add_suppression("InnoDB: Tablespace .* was not found at .*test");
-call mtr.add_suppression("InnoDB: Set innodb_force_recovery=1 to ignore this and to permanently lose all changes to the tablespace");
call mtr.add_suppression("InnoDB: Cannot read first page of '.*test.[tu]2.ibd': I/O error");
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9][0-9]*, page number=3\\] of corrupted file './test/t2\\.ibd'");
call mtr.add_suppression("InnoDB: Datafile '.*test.*ibd' is corrupted");
diff --git a/mysql-test/suite/innodb/t/log_file_name_debug.test b/mysql-test/suite/innodb/t/log_file_name_debug.test
deleted file mode 100644
index 9e3a7f8a83b..00000000000
--- a/mysql-test/suite/innodb/t/log_file_name_debug.test
+++ /dev/null
@@ -1,49 +0,0 @@
---source include/have_innodb.inc
-# Embedded server does not support restarting
---source include/not_embedded.inc
---source include/have_debug.inc
---source include/no_valgrind_without_big.inc
-
---echo #
---echo # Bug#19685095 DO NOT CARE ABOUT UNRESOLVED MLOG_FILE_NAME
---echo # IF THERE ARE NO OPERATIONS TO APPLY
---echo #
-
-SET GLOBAL DEBUG_DBUG='+d,fil_names_write_bogus';
---disable_query_log
-call mtr.add_suppression("InnoDB: Plugin initialization aborted");
-call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
-call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
-FLUSH TABLES;
---enable_query_log
-
---let $change=`SELECT if(@@innodb_log_file_size = 4194304, 8388608, 4194304)`
---let $resize= --innodb-log-file-size=$change
-
---source include/no_checkpoint_start.inc
-
-CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
-
---let CLEANUP_IF_CHECKPOINT=DROP TABLE t1;
---source include/no_checkpoint_end.inc
-
---let $restart_parameters= --debug=d,innodb_log_abort_1 $resize
---source include/start_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-
---let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err
---let SEARCH_PATTERN = InnoDB: Tablespace 4294967280 was not found at .*, but there were no modifications either
---source include/search_pattern_in_file.inc
-
---let $restart_parameters= --debug=d,innodb_log_abort_3 $resize
---source include/restart_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-
---let $restart_parameters=
---source include/restart_mysqld.inc
-# Initiate shutdown in order to issue a redo log checkpoint and to discard
-# the redo log record that was emitted due to '+d,fil_names_write_bogus'.
---source include/restart_mysqld.inc
-DROP TABLE t1;
diff --git a/mysql-test/suite/innodb/t/log_file_size.test b/mysql-test/suite/innodb/t/log_file_size.test
index fc6cb1ef83e..261b024fa41 100644
--- a/mysql-test/suite/innodb/t/log_file_size.test
+++ b/mysql-test/suite/innodb/t/log_file_size.test
@@ -7,36 +7,55 @@
# This test is slow on buildbot.
--source include/big_test.inc
-if (`SELECT @@innodb_log_file_size = 1048576`) {
- --skip Test requires innodb_log_file_size>1M.
-}
-
--disable_query_log
-call mtr.add_suppression("InnoDB: The log sequence numbers [0-9]+ and [0-9]+ in ibdata file do not match the log sequence number [0-9]+ in the ib_logfile");
call mtr.add_suppression("syntax error in innodb_log_group_home_dir");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("InnoDB: innodb_read_only prevents crash recovery");
-call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfile");
-call mtr.add_suppression("InnoDB: Cannot (create|resize) log file in read-only mode");
-call mtr.add_suppression("InnoDB: Can't initiate database recovery, running in read-only-mode");
-call mtr.add_suppression("InnoDB: Log file .*ib_logfile0.* size");
-call mtr.add_suppression("InnoDB: Unable to open .*ib_logfile0. to check native AIO read support");
+call mtr.add_suppression("InnoDB: Log file .*ib_logfile1.* size");
+call mtr.add_suppression("InnoDB: File .*ib_logfile0 (is too small|was not found)");
+call mtr.add_suppression("InnoDB: Expecting only ib_logfile0");
FLUSH TABLES;
--enable_query_log
let MYSQLD_DATADIR= `select @@datadir`;
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
--source include/shutdown_mysqld.inc
---move_file $MYSQLD_DATADIR/ib_logfile0 $MYSQLD_DATADIR/ib_logfile.old
-write_file $MYSQLD_DATADIR/ib_logfile0;
+perl;
+do "$ENV{MTR_SUITE_DIR}/include/crc32.pl";
+my $file = "$ENV{MYSQLD_DATADIR}ib_logfile0";
+open(FILE, "<$file") || die "Unable to open $file\n";
+seek(FILE, 4096, 0) || die "Unable to seek $file\n";
+die unless read(FILE, $_, 8) == 8;
+my ($lsn_hi,$lsn_lo) = unpack("NN", $_);
+seek(FILE, 8192, 0) || die "Unable to seek $file\n";
+die unless read(FILE, $_, 8) == 8;
+my ($cp2hi,$cp2lo) = unpack("NN", $_);
+if ($cp2hi < $lsn_hi) {}
+elsif ($cp2hi > $lsn_hi || $cp2lo > $lsn_lo)
+{ $lsn_hi=$cp2hi;$lsn_lo=$cp2lo; }
+close(FILE);
+open(FILE, ">", $file) or die "Unable to open $file\n";
+binmode FILE;
+my $polynomial = 0x82f63b78; # CRC-32C
+my ($header, $checkpoint, $log);
+$header = "Phys" . pack("x[4]NN", $lsn_hi, $lsn_lo) .
+ "some Perl code" . pack("x[478]");
+$header .= pack("Nx[3584]", mycrc32($header, 0, $polynomial));
+$checkpoint = pack("NNNNx[44]", $lsn_hi, $lsn_lo, $lsn_hi, $lsn_lo);
+$checkpoint .= pack("Nx[8128]", mycrc32($checkpoint, 0, $polynomial));
+$log = pack("CxxNN", 0xfa, $lsn_hi, $lsn_lo);
+$log .= pack("CN", 1, mycrc32($log, 0, $polynomial));
+print FILE $header, $checkpoint, $log;
+close(FILE) or die "Unable to close $file\n";
EOF
+
let $check_no_innodb=SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
---let $restart_parameters= --innodb-log-file-size=2m
+--let $restart_parameters= --innodb-log-file-size=4m
--source include/start_mysqld.inc
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
@@ -95,11 +114,6 @@ SELECT * FROM t1;
let SEARCH_PATTERN= InnoDB: Starting crash recovery from checkpoint LSN=.*;
--source include/search_pattern_in_file.inc
---let $restart_parameters= --debug=d,innodb_log_abort_3
---source include/restart_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-
--let $restart_parameters= --innodb-read-only
--source include/restart_mysqld.inc
@@ -108,18 +122,11 @@ SELECT * FROM t1;
let SEARCH_PATTERN= InnoDB: innodb_read_only prevents crash recovery;
--source include/search_pattern_in_file.inc
---let $restart_parameters= --debug=d,innodb_log_abort_4
---source include/restart_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-let SEARCH_PATTERN= redo log from [0-9]+ to [0-9]+ bytes;
---source include/search_pattern_in_file.inc
-
--let $restart_parameters= --debug=d,innodb_log_abort_5
--source include/restart_mysqld.inc
--error ER_UNKNOWN_STORAGE_ENGINE
SELECT * FROM t1;
-let SEARCH_PATTERN= redo log from [0-9]+ to [0-9]+ bytes;
+let SEARCH_PATTERN= redo log from 5\\.000MiB to [0-9.]*[KMGT]iB;
--source include/search_pattern_in_file.inc
--let $restart_parameters= --innodb-read-only
@@ -129,87 +136,40 @@ SELECT * FROM t1;
let SEARCH_PATTERN= InnoDB: innodb_read_only prevents crash recovery;
--source include/search_pattern_in_file.inc
---let $restart_parameters= --debug=d,innodb_log_abort_6
---source include/restart_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-
-let SEARCH_PATTERN= redo log from [0-9]+ to [0-9]+ bytes;
---source include/search_pattern_in_file.inc
-
---let $restart_parameters= --debug=d,innodb_log_abort_7
---source include/restart_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-
-# this aborts right after deleting all log files
-
---let $restart_parameters= --innodb-read-only
---source include/restart_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-
-let SEARCH_PATTERN= InnoDB: Cannot create log file in read-only mode;
---source include/search_pattern_in_file.inc
-
---let $restart_parameters= --debug=d,innodb_log_abort_8
---source include/restart_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-
-let SEARCH_PATTERN= InnoDB: Setting log file .*ib_logfile[0-9]+ size to;
---source include/search_pattern_in_file.inc
-
---let $restart_parameters= --debug=d,innodb_log_abort_9
---source include/restart_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-
-let SEARCH_PATTERN= InnoDB: Setting log file .*ib_logfile[0-9]+ size to;
---source include/search_pattern_in_file.inc
---source include/shutdown_mysqld.inc
-
-# We should have perfectly synced files here.
# Trigger an error in recovery.
-perl;
-die unless open(FILE, ">$ENV{MYSQLD_DATADIR}/ib_logfile0");
-print FILE "garbage";
-close(FILE);
+--move_file $MYSQLD_DATADIR/ib_logfile0 $MYSQLD_DATADIR/ib_logfile101
+--write_file $MYSQLD_DATADIR/ib_logfile0
+garbage
EOF
---source include/start_mysqld.inc
+--let $restart_parameters=
+--source include/restart_mysqld.inc
--error ER_UNKNOWN_STORAGE_ENGINE
SELECT * FROM t1;
-let SEARCH_PATTERN= InnoDB: Log file .*ib_logfile0 size 7 is not a multiple of 512 bytes;
+let SEARCH_PATTERN= InnoDB: File .*ib_logfile0 is too small;
--source include/search_pattern_in_file.inc
---remove_file $MYSQLD_DATADIR/ib_logfile0
+--move_file $MYSQLD_DATADIR/ib_logfile0 $MYSQLD_DATADIR/ib_logfile1
--move_file $MYSQLD_DATADIR/ib_logfile101 $MYSQLD_DATADIR/ib_logfile0
-perl;
-die unless open(FILE, ">$ENV{MYSQLD_DATADIR}/ib_logfile1");
-print FILE "junkfill" x 131072;
-close(FILE);
-EOF
-
--source include/restart_mysqld.inc
+--error ER_UNKNOWN_STORAGE_ENGINE
SELECT * FROM t1;
+let SEARCH_PATTERN= InnoDB: Expecting only ib_logfile0;
+--source include/search_pattern_in_file.inc
--remove_file $MYSQLD_DATADIR/ib_logfile1
--move_file $MYSQLD_DATADIR/ib_logfile0 $MYSQLD_DATADIR/ib_logfile101
---let $restart_parameters= --debug=d,innodb_log_abort_10
--source include/restart_mysqld.inc
--error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
-
-let SEARCH_PATTERN= InnoDB: Setting log file .*ib_logfile[0-9]+ size to;
---source include/search_pattern_in_file.inc
-let SEARCH_PATTERN= InnoDB: Renaming log file .*ib_logfile101 to .*ib_logfile0;
+let SEARCH_PATTERN= InnoDB: File .*ib_logfile0 was not found;
--source include/search_pattern_in_file.inc
+--move_file $MYSQLD_DATADIR/ib_logfile101 $MYSQLD_DATADIR/ib_logfile0
---let $restart_parameters=
--source include/restart_mysqld.inc
-
SELECT * FROM t1;
DROP TABLE t1;
+
+--let SEARCH_PATTERN= InnoDB: Resizing redo log from 5\\.000MiB to [0-9.]*[KMGT]iB; LSN=\\d+\\b
+--source include/search_pattern_in_file.inc
diff --git a/mysql-test/suite/innodb/t/missing_tablespaces.test b/mysql-test/suite/innodb/t/missing_tablespaces.test
index 92f963a262d..7aeb0a26f30 100644
--- a/mysql-test/suite/innodb/t/missing_tablespaces.test
+++ b/mysql-test/suite/innodb/t/missing_tablespaces.test
@@ -26,7 +26,7 @@ let $restart_noprint=2;
--disable_query_log
call mtr.add_suppression("\\[ERROR\\] InnoDB: Operating system error number 2 in a file operation.");
-call mtr.add_suppression("\\[ERROR\\] InnoDB: The error means the system cannot find the path specified.");
+call mtr.add_suppression("\\[ERROR\\] InnoDB: Error number \\d+ means");
call mtr.add_suppression("\\[ERROR\\] InnoDB: Cannot open datafile for read-only");
call mtr.add_suppression("\\[Warning\\] InnoDB: Ignoring tablespace .* because it could not be opened");
--enable_query_log
diff --git a/mysql-test/suite/innodb/t/online_table_rebuild.test b/mysql-test/suite/innodb/t/online_table_rebuild.test
index 1d34738703c..02e9639eae2 100644
--- a/mysql-test/suite/innodb/t/online_table_rebuild.test
+++ b/mysql-test/suite/innodb/t/online_table_rebuild.test
@@ -59,5 +59,29 @@ connection default;
reap;
SHOW CREATE TABLE t1;
DROP TABLE t1;
+
+--echo #
+--echo # MDEV-30183 Assertion `!memcmp(rec_trx_id, old_pk_trx_id->data,
+--echo # 6 + 7)' failed in row_log_table_apply_update
+--echo #
+set @old_sql_mode = @@sql_mode;
+set @@sql_mode="";
+CREATE TABLE t1(col_int int, col_varchar varchar(500))ENGINE=InnoDB;
+INSERT INTO t1(col_int) values(2560);
+set debug_sync="row_log_table_apply1_before SIGNAL con1_begin WAIT_FOR con1_commit";
+send ALTER TABLE t1 ADD PRIMARY KEY ( col_varchar);
+
+connection con1;
+SET DEBUG_SYNC="now WAIT_FOR con1_begin";
+UPDATE t1 SET col_int = 2178;
+INSERT INTO t1(col_int) VALUES(3016);
+UPDATE t1 set col_int=2802;
+SET DEBUG_SYNC="now SIGNAL con1_commit";
+
+connection default;
+--error ER_DUP_ENTRY
+reap;
+DROP TABLE t1;
+SET @@sql_mode = @old_sql_mode;
disconnect con1;
SET DEBUG_SYNC=reset;
diff --git a/mysql-test/suite/innodb/t/rename_table.test b/mysql-test/suite/innodb/t/rename_table.test
index 35421f0ce7a..654f8809b22 100644
--- a/mysql-test/suite/innodb/t/rename_table.test
+++ b/mysql-test/suite/innodb/t/rename_table.test
@@ -32,7 +32,7 @@ DROP DATABASE abc_def;
DROP DATABASE abc_def2;
-call mtr.add_suppression("InnoDB: (Operating system error|The error means|Cannot rename file)");
+call mtr.add_suppression("InnoDB: (Operating system error|Error number \\d+ means|Cannot rename file)");
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
--replace_result "\\" "/"
diff --git a/mysql-test/suite/innodb/t/restart.test b/mysql-test/suite/innodb/t/restart.test
index 4835cc997a8..5be076c6198 100644
--- a/mysql-test/suite/innodb/t/restart.test
+++ b/mysql-test/suite/innodb/t/restart.test
@@ -96,7 +96,7 @@ DROP TABLE tr,tc,td;
let $wait_timeout = 180;
let $wait_condition =
- SELECT SUBSTR(variable_value, 1, 34) = 'Completed resizing buffer pool at '
+ SELECT SUBSTR(variable_value, 1, 30) = 'Completed resizing buffer pool'
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_buffer_pool_resize_status';
diff --git a/mysql-test/suite/innodb/t/truncate_missing.test b/mysql-test/suite/innodb/t/truncate_missing.test
index fb6bd678237..d36a2de5cd9 100644
--- a/mysql-test/suite/innodb/t/truncate_missing.test
+++ b/mysql-test/suite/innodb/t/truncate_missing.test
@@ -2,7 +2,7 @@
--source include/not_embedded.inc
call mtr.add_suppression("InnoDB: Operating system error number ");
-call mtr.add_suppression("InnoDB: (The error means|If you are|Cannot open datafile) ");
+call mtr.add_suppression("InnoDB: (Error number \\d+ means|If you are|Cannot open datafile) ");
call mtr.add_suppression("InnoDB: Ignoring tablespace for test/t ");
call mtr.add_suppression("InnoDB: Table test/t .* does not exist");
diff --git a/mysql-test/suite/innodb_fts/r/create.result b/mysql-test/suite/innodb_fts/r/create.result
index 3ca24f5253d..4334344a981 100644
--- a/mysql-test/suite/innodb_fts/r/create.result
+++ b/mysql-test/suite/innodb_fts/r/create.result
@@ -187,4 +187,27 @@ FTS_DOC_ID bigint unsigned not null,
unique key FTS_DOC_ID_INDEX(FTS_DOC_ID, f1),
fulltext (f2))
engine=innodb;
-ERROR 42000: Incorrect index name 'FTS_DOC_ID_INDEX'
+ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index
+#
+# MDEV-26938 Support descending indexes internally in InnoDB
+#
+CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
+UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC), FULLTEXT(b))
+ENGINE=InnoDB;
+ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index
+CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
+UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC)) ENGINE=InnoDB;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) NOT NULL,
+ `b` text DEFAULT NULL,
+ `FTS_DOC_ID` bigint(20) unsigned NOT NULL,
+ PRIMARY KEY (`a`),
+ UNIQUE KEY `FTS_DOC_ID_INDEX` (`FTS_DOC_ID` DESC)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE;
+ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index
+ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY;
+ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb_fts/r/versioning.result b/mysql-test/suite/innodb_fts/r/versioning.result
index 27e23c9b2d5..baf25331d0d 100644
--- a/mysql-test/suite/innodb_fts/r/versioning.result
+++ b/mysql-test/suite/innodb_fts/r/versioning.result
@@ -1,4 +1,5 @@
# Upgrade test
+DROP TABLE mysql.innodb_table_stats, mysql.innodb_index_stats;
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('Database' IN NATURAL LANGUAGE MODE);
ERROR HY000: Index articles is corrupted
@@ -291,8 +292,6 @@ drop index idx on articles2;
Warnings:
Warning 1082 InnoDB: Table test/articles2 contains 3 indexes inside InnoDB, which is different from the number of indexes 1 defined in the MariaDB
create fulltext index idx on articles2(title, body);
-Warnings:
-Warning 1088 Error updating stats for table 'articles2' after table rebuild: Persistent statistics do not exist
SELECT * FROM articles2 WHERE MATCH (title,body)
AGAINST ('the' IN NATURAL LANGUAGE MODE);
id title body
diff --git a/mysql-test/suite/innodb_fts/t/create.test b/mysql-test/suite/innodb_fts/t/create.test
index 710fd9cb99b..e6a7e993f84 100644
--- a/mysql-test/suite/innodb_fts/t/create.test
+++ b/mysql-test/suite/innodb_fts/t/create.test
@@ -111,10 +111,28 @@ SET GLOBAL innodb_optimize_fulltext_only= @optimize_fulltext.save;
--echo #
--echo # MDEV-24403 Segfault on CREATE TABLE with explicit FTS_DOC_ID_INDEX by multiple fields
--echo #
---error ER_WRONG_NAME_FOR_INDEX
+--error ER_INNODB_FT_WRONG_DOCID_INDEX
create table t1 (
f1 int, f2 text,
FTS_DOC_ID bigint unsigned not null,
unique key FTS_DOC_ID_INDEX(FTS_DOC_ID, f1),
fulltext (f2))
engine=innodb;
+
+--echo #
+--echo # MDEV-26938 Support descending indexes internally in InnoDB
+--echo #
+
+--error ER_INNODB_FT_WRONG_DOCID_INDEX
+CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
+ UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC), FULLTEXT(b))
+ENGINE=InnoDB;
+
+CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
+ UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC)) ENGINE=InnoDB;
+SHOW CREATE TABLE t1;
+--error ER_INNODB_FT_WRONG_DOCID_INDEX
+ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE;
+--error ER_INNODB_FT_WRONG_DOCID_INDEX
+ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY;
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb_fts/t/versioning.combinations b/mysql-test/suite/innodb_fts/t/versioning.combinations
deleted file mode 100644
index 42842ba51a6..00000000000
--- a/mysql-test/suite/innodb_fts/t/versioning.combinations
+++ /dev/null
@@ -1,2 +0,0 @@
-[prepare]
-[upgrade]
diff --git a/mysql-test/suite/innodb_fts/t/versioning.opt b/mysql-test/suite/innodb_fts/t/versioning.opt
deleted file mode 100644
index df323743314..00000000000
--- a/mysql-test/suite/innodb_fts/t/versioning.opt
+++ /dev/null
@@ -1,2 +0,0 @@
---innodb-file-per-table=0
---innodb-doublewrite=0
diff --git a/mysql-test/suite/innodb_fts/t/versioning.test b/mysql-test/suite/innodb_fts/t/versioning.test
deleted file mode 100644
index 286597fba39..00000000000
--- a/mysql-test/suite/innodb_fts/t/versioning.test
+++ /dev/null
@@ -1,131 +0,0 @@
---source include/have_innodb.inc
---source include/have_gzip.inc
---source include/not_embedded.inc
-
-# Combinations
-#
-# upgrade: test upgrade on prepared databases from std_data.
-# prepare: requires $OLD_BINDIR, test upgrade and downgrade with old-version
-# server. Also prepare std_data files during the run in the source
-# directory (you just have to commit or reject them).
-#
-# Examples
-#
-# export OLD_BINDIR="/home/midenok/src/mariadb/10.3b/build"
-# ./mtr innodb_fts.versioning,prepare
-#
-
-if ($MTR_COMBINATION_PREPARE)
-{
- if (!$OLD_BINDIR)
- {
- --skip Requires OLD_BINDIR parameter (see test comment)
- }
-}
-
---let $server_id= `select @@server_id`
---let $datadir= `select @@datadir`
---let $std_dir= $MYSQL_TEST_DIR/std_data/versioning
---let $restart_noprint= 3
-
---echo # Upgrade test
-let $stopword_table= articles2;
-
-if ($MTR_COMBINATION_PREPARE)
-{
- let $restart_bindir= $OLD_BINDIR;
- --source include/restart_mysqld.inc
-
- let $create_options= with system versioning;
- let $basic_stage= create_table;
- --source basic.inc
- let $basic_stage= insert_1;
- --source basic.inc
- let $basic_stage= insert_2;
- --source basic.inc
- let $basic_stage= insert_3;
- --source basic.inc
- let $stopword_stage= create_table;
- --source stopword.inc
- eval insert into $stopword_table (title, body)
- values ('test for stopwords','this is it...');
- insert into user_stopword values("the");
- delete from user_stopword;
- insert into user_stopword values("this");
- --source include/shutdown_mysqld.inc
-
- --exec mkdir -p $std_dir
- --exec cp -af $datadir/ibdata1 $datadir/test/*.frm $std_dir
- # zero out the doublewrite buffer
- --exec dd if=/dev/zero of=$std_dir/ibdata1 bs=16k seek=64 count=128 conv=notrunc
- --exec gzip -9f $std_dir/ibdata1 $std_dir/*.frm
-}
-
-if ($MTR_COMBINATION_UPGRADE)
-{
---disable_query_log
-call mtr.add_suppression("InnoDB: Table `mysql`.\`innodb_(table|index)_stats`");
---enable_query_log
- --source include/shutdown_mysqld.inc
- --exec rm -f $datadir/test/*.ibd $datadir/ib*
- --exec cp -af $std_dir/ibdata1.gz $datadir
- --exec cp -af $std_dir/*.frm.gz $datadir/test
- --exec gzip -df $datadir/ibdata1.gz $datadir/test/*.frm.gz
-}
-let $restart_bindir=;
---source include/start_mysqld.inc
-
---error ER_INDEX_CORRUPT
-SELECT * FROM articles WHERE MATCH (title,body)
-AGAINST ('Database' IN NATURAL LANGUAGE MODE);
-
-call mtr.add_suppression("test/articles.? contains 3 indexes inside InnoDB");
-alter table articles force;
-flush tables;
-show create table articles;
-
-let $basic_stage= select_1;
-source basic.inc;
-let $basic_stage= select_2;
-source basic.inc;
-let $basic_stage= select_3;
-source basic.inc;
-
-set global innodb_ft_server_stopword_table= "test/user_stopword";
-let $stopword_stage= select_1;
---source stopword.inc
-eval drop index idx on $stopword_table;
-eval create fulltext index idx on $stopword_table(title, body);
---source stopword.inc
-
-if ($MTR_COMBINATION_PREPARE)
-{
- --echo # Downgrade test
- let $restart_bindir= $OLD_BINDIR;
- --source include/restart_mysqld.inc
-
- alter table articles force;
- flush tables;
- show create table articles;
- let $basic_stage= select_1;
- source basic.inc;
- let $basic_stage= select_2;
- source basic.inc;
- let $basic_stage= select_3;
- source basic.inc;
-
- set global innodb_ft_server_stopword_table= "test/user_stopword";
- let $stopword_stage= select_1;
- # Downgrade faults with assertion "dict_index_get_n_unique(index) == 1"
- # until we rebuilt the index:
- eval drop index idx on $stopword_table;
- eval create fulltext index idx on $stopword_table(title, body);
- source stopword.inc;
-
- let $restart_bindir=;
- --source include/restart_mysqld.inc
-}
-
---echo # Cleanup
-eval drop tables articles, $stopword_table, user_stopword;
-set global innodb_ft_server_stopword_table= default;
diff --git a/mysql-test/suite/innodb_gis/r/0.result b/mysql-test/suite/innodb_gis/r/0.result
index c9864fad830..f05c7db24bd 100644
--- a/mysql-test/suite/innodb_gis/r/0.result
+++ b/mysql-test/suite/innodb_gis/r/0.result
@@ -452,9 +452,9 @@ ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
drop table t1;
create table t1 (pk integer primary key auto_increment, fl geometry not null);
insert into t1 (fl) values (1);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 (fl) values (1.11);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'decimal' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 (fl) values ("qwerty");
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
insert into t1 (fl) values (pointfromtext('point(1,1)'));
diff --git a/mysql-test/suite/innodb_gis/r/1.result b/mysql-test/suite/innodb_gis/r/1.result
index b40c24b8fc6..35711a63a8a 100644
--- a/mysql-test/suite/innodb_gis/r/1.result
+++ b/mysql-test/suite/innodb_gis/r/1.result
@@ -660,9 +660,9 @@ object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo))
drop table t1;
create table t1 (fl geometry not null);
insert into t1 values (1);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 values (1.11);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'decimal' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 values ("qwerty");
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
insert into t1 values (ST_pointfromtext('point(1,1)'));
diff --git a/mysql-test/suite/innodb_gis/r/alter_spatial_index.result b/mysql-test/suite/innodb_gis/r/alter_spatial_index.result
index 08632b67514..5365e7d0f8c 100644
--- a/mysql-test/suite/innodb_gis/r/alter_spatial_index.result
+++ b/mysql-test/suite/innodb_gis/r/alter_spatial_index.result
@@ -779,7 +779,7 @@ SET timestamp=default;
create table t1 (p point not null default if(unix_timestamp()>10,POINT(1,1),LineString(Point(0,0),Point(1,1)))) ENGINE=innodb;
set timestamp=10;
alter table t1 add column i int;
-ERROR 22007: Incorrect POINT value: 'LINESTRING(0 0,1 1)' for column `test`.`t1`.`p` at row 1
+ERROR 22007: Incorrect POINT value: 'LINESTRING(0 0,1 1)' for column `test`.`t1`.`p` at row 0
drop table t1;
SET timestamp=default;
CREATE OR REPLACE TABLE t1 (a INT) ENGINE=InnoDB;
diff --git a/mysql-test/suite/innodb_gis/r/geometry.result b/mysql-test/suite/innodb_gis/r/geometry.result
index e5acdf5eb6f..c38e9e28d85 100644
--- a/mysql-test/suite/innodb_gis/r/geometry.result
+++ b/mysql-test/suite/innodb_gis/r/geometry.result
@@ -342,7 +342,7 @@ tab CREATE TABLE `tab` (
`c7` geometrycollection DEFAULT NULL,
`c8` geometry DEFAULT NULL,
UNIQUE KEY `idx2` (`c8`(5)),
- KEY `idx1` (`c2`(5)) USING BTREE,
+ KEY `idx1` (`c2`(5) DESC) USING BTREE,
KEY `idx3` (`c3`(5)) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
#check the data after modify
@@ -778,7 +778,7 @@ tab3 CREATE TABLE `tab3` (
`c7` geometrycollection DEFAULT NULL,
`c8` geometry DEFAULT NULL,
UNIQUE KEY `idx2` (`c8`(5)),
- KEY `idx1` (`c2`(5)) USING BTREE,
+ KEY `idx1` (`c2`(5) DESC) USING BTREE,
KEY `idx3` (`c3`(5)) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=16
#check index with WKB function
diff --git a/mysql-test/suite/innodb_gis/r/gis.result b/mysql-test/suite/innodb_gis/r/gis.result
index 36711c39050..ca37674b05f 100644
--- a/mysql-test/suite/innodb_gis/r/gis.result
+++ b/mysql-test/suite/innodb_gis/r/gis.result
@@ -661,9 +661,9 @@ object_id ST_geometrytype(geo) ST_ISSIMPLE(GEO) ST_ASTEXT(ST_centroid(geo))
drop table t1;
create table t1 (fl geometry not null);
insert into t1 values (1);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 values (1.11);
-ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
+ERROR HY000: Cannot cast 'decimal' as 'geometry' in assignment of `test`.`t1`.`fl`
insert into t1 values ("qwerty");
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
insert into t1 values (ST_pointfromtext('point(1,1)'));
diff --git a/mysql-test/suite/innodb_gis/t/1.test b/mysql-test/suite/innodb_gis/t/1.test
index 950db360794..99651842795 100644
--- a/mysql-test/suite/innodb_gis/t/1.test
+++ b/mysql-test/suite/innodb_gis/t/1.test
@@ -387,9 +387,9 @@ t1 where object_id=85984;
drop table t1;
create table t1 (fl geometry not null);
---error 1416
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
insert into t1 values (1);
---error 1416
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
insert into t1 values (1.11);
--error 1416
insert into t1 values ("qwerty");
diff --git a/mysql-test/suite/innodb_gis/t/gis.test b/mysql-test/suite/innodb_gis/t/gis.test
index 966aea7bc77..b27e1852d6e 100644
--- a/mysql-test/suite/innodb_gis/t/gis.test
+++ b/mysql-test/suite/innodb_gis/t/gis.test
@@ -380,9 +380,9 @@ t1 where object_id=85984;
drop table t1;
create table t1 (fl geometry not null);
---error 1416
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
insert into t1 values (1);
---error 1416
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
insert into t1 values (1.11);
--error 1416
insert into t1 values ("qwerty");
diff --git a/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result b/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result
index dadf1117f7e..62a28a981cd 100644
--- a/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result
+++ b/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result
@@ -5,7 +5,7 @@ call mtr.add_suppression("InnoDB: Page for tablespace ");
call mtr.add_suppression("InnoDB: Invalid FSP_SPACE_FLAGS=0x");
call mtr.add_suppression("InnoDB: Unknown index id .* on page");
call mtr.add_suppression("InnoDB: Operating system error number");
-call mtr.add_suppression("InnoDB: The error means");
+call mtr.add_suppression("InnoDB: Error number \\d+ means");
call mtr.add_suppression("InnoDB: Cannot open datafile .*t1\\.ibd");
call mtr.add_suppression("InnoDB: Ignoring tablespace for test/t1 ");
call mtr.add_suppression("InnoDB: Cannot save statistics for table `test`\\.`t1` because the \\.ibd file is missing");
diff --git a/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test b/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test
index c30a4f8f000..36dcd1e454b 100644
--- a/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test
+++ b/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test
@@ -21,7 +21,7 @@ call mtr.add_suppression("InnoDB: Page for tablespace ");
call mtr.add_suppression("InnoDB: Invalid FSP_SPACE_FLAGS=0x");
call mtr.add_suppression("InnoDB: Unknown index id .* on page");
call mtr.add_suppression("InnoDB: Operating system error number");
-call mtr.add_suppression("InnoDB: The error means");
+call mtr.add_suppression("InnoDB: Error number \\d+ means");
call mtr.add_suppression("InnoDB: Cannot open datafile .*t1\\.ibd");
call mtr.add_suppression("InnoDB: Ignoring tablespace for test/t1 ");
call mtr.add_suppression("InnoDB: Cannot save statistics for table `test`\\.`t1` because the \\.ibd file is missing");
diff --git a/mysql-test/suite/json/r/json_no_table.result b/mysql-test/suite/json/r/json_no_table.result
index 6784fe6da32..10dd5d4b4ca 100644
--- a/mysql-test/suite/json/r/json_no_table.result
+++ b/mysql-test/suite/json/r/json_no_table.result
@@ -3338,7 +3338,7 @@ OBJECT
CREATE VIEW v1 AS SELECT JSON_TYPE(JSON_OBJECT());
SELECT * FROM v1;
JSON_TYPE(JSON_OBJECT())
-OBJE
+OBJECT
drop view v1;
#
# Bug#21198333 SIG 6 IN ITEM_CACHE_JSON::CACHE_VALUE AT SQL/ITEM.CC:9470
diff --git a/mysql-test/suite/json/r/json_table.result b/mysql-test/suite/json/r/json_table.result
index b9cc09fdd97..b71cc95a4e3 100644
--- a/mysql-test/suite/json/r/json_table.result
+++ b/mysql-test/suite/json/r/json_table.result
@@ -211,13 +211,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "tt",
- "access_type": "ALL",
- "rows": 40,
- "filtered": 100,
- "table_function": "json_table"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tt",
+ "access_type": "ALL",
+ "rows": 40,
+ "filtered": 100,
+ "table_function": "json_table"
+ }
+ }
+ ]
}
}
explain select * from
diff --git a/mysql-test/suite/json/r/json_table_mysql.result b/mysql-test/suite/json/r/json_table_mysql.result
index 699d5a8b4f3..2357d9d3cf0 100644
--- a/mysql-test/suite/json/r/json_table_mysql.result
+++ b/mysql-test/suite/json/r/json_table_mysql.result
@@ -189,13 +189,17 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "tt",
- "access_type": "ALL",
- "rows": 40,
- "filtered": 100,
- "table_function": "json_table"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "tt",
+ "access_type": "ALL",
+ "rows": 40,
+ "filtered": 100,
+ "table_function": "json_table"
+ }
+ }
+ ]
}
}
select * from
diff --git a/mysql-test/suite/json/r/type_json.result b/mysql-test/suite/json/r/type_json.result
index b9b70f24190..333e933eda9 100644
--- a/mysql-test/suite/json/r/type_json.result
+++ b/mysql-test/suite/json/r/type_json.result
@@ -113,7 +113,7 @@ def COALESCE(c0, c6) 254 30 1 Y 0 39 8
COALESCE(c0, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c0, c7) 254 30 1 Y 0 39 8
+def COALESCE(c0, c7) 253 30 1 Y 0 39 8
COALESCE(c0, c7)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -305,11 +305,11 @@ def COALESCE(c6, c6) 3 11 1 Y 32896 0 63
COALESCE(c6, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c6, c7) 254 11 1 Y 0 39 8
+def COALESCE(c6, c7) 253 11 1 Y 0 39 8
COALESCE(c6, c7)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c7, c0) 254 30 1 Y 0 39 8
+def COALESCE(c7, c0) 253 30 1 Y 0 39 8
COALESCE(c7, c0)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -333,11 +333,11 @@ def COALESCE(c7, c5) 251 4294967295 1 Y 0 39 8
COALESCE(c7, c5)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c7, c6) 254 11 1 Y 0 39 8
+def COALESCE(c7, c6) 253 11 1 Y 0 39 8
COALESCE(c7, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c7, c7) 254 1 1 Y 0 39 8
+def COALESCE(c7, c7) 253 1 1 Y 0 39 8
COALESCE(c7, c7)
1
CALL p1('t1', 'LEAST(colt1, colt2)');
@@ -370,7 +370,7 @@ def LEAST(c0, c6) 5 23 1 Y 32896 31 63
LEAST(c0, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def LEAST(c0, c7) 254 30 1 Y 0 39 8
+def LEAST(c0, c7) 253 30 1 Y 0 39 8
LEAST(c0, c7)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -566,7 +566,7 @@ def LEAST(c6, c7) 5 17 1 Y 32896 0 63
LEAST(c6, c7)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def LEAST(c7, c0) 254 30 1 Y 0 39 8
+def LEAST(c7, c0) 253 30 1 Y 0 39 8
LEAST(c7, c0)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -594,7 +594,7 @@ def LEAST(c7, c6) 5 17 1 Y 32896 0 63
LEAST(c7, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def LEAST(c7, c7) 254 1 1 Y 0 39 8
+def LEAST(c7, c7) 253 1 1 Y 0 39 8
LEAST(c7, c7)
1
CALL p1('t1', 'colt1+colt2');
@@ -884,7 +884,7 @@ def COALESCE(c0, c6) 254 30 1 Y 0 39 8
COALESCE(c0, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c0, c7) 254 30 1 Y 0 39 8
+def COALESCE(c0, c7) 253 30 1 Y 0 39 8
COALESCE(c0, c7)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -1076,11 +1076,11 @@ def COALESCE(c6, c6) 3 11 1 Y 32896 0 63
COALESCE(c6, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c6, c7) 254 11 1 Y 0 39 8
+def COALESCE(c6, c7) 253 11 1 Y 0 39 8
COALESCE(c6, c7)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c7, c0) 254 30 1 Y 0 39 8
+def COALESCE(c7, c0) 253 30 1 Y 0 39 8
COALESCE(c7, c0)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -1104,11 +1104,11 @@ def COALESCE(c7, c5) 251 4294967295 1 Y 0 39 8
COALESCE(c7, c5)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c7, c6) 254 11 1 Y 0 39 8
+def COALESCE(c7, c6) 253 11 1 Y 0 39 8
COALESCE(c7, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(c7, c7) 254 1 1 Y 0 39 8
+def COALESCE(c7, c7) 253 1 1 Y 0 39 8
COALESCE(c7, c7)
1
CALL p1('t1c', 'LEAST(colt1, colt2)');
@@ -1141,7 +1141,7 @@ def LEAST(c0, c6) 5 23 1 Y 32896 31 63
LEAST(c0, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def LEAST(c0, c7) 254 30 1 Y 0 39 8
+def LEAST(c0, c7) 253 30 1 Y 0 39 8
LEAST(c0, c7)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -1337,7 +1337,7 @@ def LEAST(c6, c7) 5 17 1 Y 32896 0 63
LEAST(c6, c7)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def LEAST(c7, c0) 254 30 1 Y 0 39 8
+def LEAST(c7, c0) 253 30 1 Y 0 39 8
LEAST(c7, c0)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -1365,7 +1365,7 @@ def LEAST(c7, c6) 5 17 1 Y 32896 0 63
LEAST(c7, c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def LEAST(c7, c7) 254 1 1 Y 0 39 8
+def LEAST(c7, c7) 253 1 1 Y 0 39 8
LEAST(c7, c7)
1
CALL p1('t1c', 'colt1+colt2');
@@ -1675,7 +1675,7 @@ def COALESCE(t1.c0, t2.c11) 254 30 1 Y 0 39 8
COALESCE(t1.c0, t2.c11)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c0, t2.c12) 254 30 1 Y 0 39 8
+def COALESCE(t1.c0, t2.c12) 253 30 1 Y 0 39 8
COALESCE(t1.c0, t2.c12)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -1987,11 +1987,11 @@ def COALESCE(t1.c6, t2.c11) 253 19 1 Y 0 39 8
COALESCE(t1.c6, t2.c11)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c6, t2.c12) 254 11 1 Y 0 39 8
+def COALESCE(t1.c6, t2.c12) 253 11 1 Y 0 39 8
COALESCE(t1.c6, t2.c12)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c7, t2.c0) 254 30 1 Y 0 39 8
+def COALESCE(t1.c7, t2.c0) 253 30 1 Y 0 39 8
COALESCE(t1.c7, t2.c0)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -2015,31 +2015,31 @@ def COALESCE(t1.c7, t2.c5) 251 4294967295 1 Y 0 39 8
COALESCE(t1.c7, t2.c5)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c7, t2.c6) 254 11 1 Y 0 39 8
+def COALESCE(t1.c7, t2.c6) 253 11 1 Y 0 39 8
COALESCE(t1.c7, t2.c6)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c7, t2.c7) 254 22 1 Y 0 39 8
+def COALESCE(t1.c7, t2.c7) 253 22 1 Y 0 39 8
COALESCE(t1.c7, t2.c7)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c7, t2.c8) 254 12 1 Y 0 39 8
+def COALESCE(t1.c7, t2.c8) 253 12 1 Y 0 39 8
COALESCE(t1.c7, t2.c8)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c7, t2.c9) 254 10 1 Y 0 39 8
+def COALESCE(t1.c7, t2.c9) 253 10 1 Y 0 39 8
COALESCE(t1.c7, t2.c9)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c7, t2.c10) 254 10 1 Y 0 39 8
+def COALESCE(t1.c7, t2.c10) 253 10 1 Y 0 39 8
COALESCE(t1.c7, t2.c10)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c7, t2.c11) 254 19 1 Y 0 39 8
+def COALESCE(t1.c7, t2.c11) 253 19 1 Y 0 39 8
COALESCE(t1.c7, t2.c11)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def COALESCE(t1.c7, t2.c12) 254 1 1 Y 0 39 8
+def COALESCE(t1.c7, t2.c12) 253 1 1 Y 0 39 8
COALESCE(t1.c7, t2.c12)
1
CALL p2('LEAST(t1.colt1, t2.colt2)');
@@ -2092,7 +2092,7 @@ def LEAST(t1.c0, t2.c11) 12 26 26 Y 128 6 63
LEAST(t1.c0, t2.c11)
0000-00-00 00:00:00.000000
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def LEAST(t1.c0, t2.c12) 254 30 1 Y 0 39 8
+def LEAST(t1.c0, t2.c12) 253 30 1 Y 0 39 8
LEAST(t1.c0, t2.c12)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -2408,7 +2408,7 @@ def LEAST(t1.c6, t2.c12) 5 17 1 Y 32896 0 63
LEAST(t1.c6, t2.c12)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def LEAST(t1.c7, t2.c0) 254 30 1 Y 0 39 8
+def LEAST(t1.c7, t2.c0) 253 30 1 Y 0 39 8
LEAST(t1.c7, t2.c0)
1
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
@@ -2456,7 +2456,7 @@ def LEAST(t1.c7, t2.c11) 12 19 19 Y 128 0 63
LEAST(t1.c7, t2.c11)
0000-00-00 00:00:00
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
-def LEAST(t1.c7, t2.c12) 254 1 1 Y 0 39 8
+def LEAST(t1.c7, t2.c12) 253 1 1 Y 0 39 8
LEAST(t1.c7, t2.c12)
1
CALL p2('t1.colt1+t2.colt2');
diff --git a/mysql-test/suite/maria/maria2.result b/mysql-test/suite/maria/maria2.result
index b4b27512054..c25659ae1f8 100644
--- a/mysql-test/suite/maria/maria2.result
+++ b/mysql-test/suite/maria/maria2.result
@@ -1,4 +1,3 @@
-drop table if exists t1,t2;
CREATE TABLE t1 (
line BLOB,
kind ENUM('po', 'pp', 'rr', 'dr', 'rd', 'ts', 'cl') NOT NULL DEFAULT 'po',
@@ -68,3 +67,99 @@ pk apk data
3 4 NULL
5 6 NULL
drop table t1;
+#
+# End of 5.5 tests
+#
+#
+# MDEV-27303 Table corruption after insert into a non-InnoDB table with DESC index
+#
+create table t1 (
+a bigint default 0,
+b bigint default 0,
+c binary(128) not null,
+d datetime default '0000-00-00 00:00:00',
+key (c desc,b,d,a)
+) engine=aria;
+insert into t1 (c) values
+('xx'),('bb'),('tt'),('pp'),('mm'),('yy'),('rr'),('bb'),('yy'),('gg'),
+('dd'),('fx'),('wi'),('ix'),('ox'),('mu'),('ux'),('pm'),('mx'),('xu'),
+('ul'),('lp'),('px'),('lp'),('xx'),('pq'),('qs'),('se'),('ee'),('xx'),
+('rv'),('ff'),('vj'),('jy'),('yn'),('nc'),('nx'),('hj'),('ji'),('ik'),
+('kk'),('ww'),('xx'),('yd'),('dw'),('wk'),('kr'),('dd'),('rj'),('jf'),
+('bx'),('fc'),('cp'),('pm'),('mw'),('wy'),('yl'),('li'),('ic'),('he'),
+('ci'),('il'),('lz'),('zd'),('gz'),('xd'),('ze'),('dm'),('ms'),('xd'),
+('sw'),('we'),('nb'),('tx'),('vr'),('xw'),('aa'),('ah'),('hd'),('jl'),
+('lf'),('fw'),('wx'),('xh'),('hr'),('zx'),('vw'),('rm'),('mx'),('xt'),
+('tp'),('ps'),('sh'),('ga'),('df'),('as'),('gz'),('xd'),('yy'),('xr');
+check table t1 extended;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+drop table t1;
+#
+# MDEV-27309 Server crash or ASAN memcpy-param-overlap upon INSERT into Aria/MyISAM table with DESC key
+#
+CREATE TABLE t1 (id INT, c BINARY(80), PRIMARY KEY(id));
+ALTER TABLE t1 ADD KEY(c DESC, id);
+INSERT INTO t1 VALUES (1,NULL),(2,''),(3,'');
+DROP TABLE t1;
+#
+# MDEV-27330 Wrong sorting order with DESC index and empty strings in MyISAM/Aria table
+#
+create table t (id int, c char(128) not null, key (c desc)) engine=aria;
+insert into t values (1,''),(2,'foo'),(3,''),(4,'bar');
+select c from t order by c;
+c
+
+
+bar
+foo
+drop table t;
+#
+# MDEV-27340 NULL gets lost (becomes empty string), SELECT hangs with DESC index on MyISAM/Aria table
+#
+create table t (c char(8), key(c desc)) engine=aria character set utf8mb4;
+insert into t values (''),('foo'),(null),(''),('bar');
+check table t;
+Table Op Msg_type Msg_text
+test.t check status OK
+check table t extended;
+Table Op Msg_type Msg_text
+test.t check status OK
+select distinct c from t;
+c
+NULL
+
+bar
+foo
+select c from t;
+c
+foo
+bar
+
+
+NULL
+drop table t;
+#
+# MDEV-27434 DESC attribute does not work with auto-increment on secondary column of multi-part index
+#
+create table t (a int auto_increment, b int, unique(b,a desc)) engine=aria;
+insert ignore into t (b) values (10),(10),(10);
+select * from t;
+a b
+3 10
+2 10
+1 10
+drop table t;
+#
+# MDEV-27585 Auto-increment on secondary column increments unexpectedly with DESC key
+#
+create table t (c char(16), i int auto_increment, index (c,i desc)) engine=aria collate latin1_swedish_ci;
+insert into t (c) values ('ä'),('a');
+select hex(c),c,i from t order by c, i;
+hex(c) c i
+61 a 1
+C3A4 ä 1
+drop table t;
+#
+# End of 10.8 tests
+#
diff --git a/mysql-test/suite/maria/maria2.test b/mysql-test/suite/maria/maria2.test
index df691569e05..0f4a50ad99d 100644
--- a/mysql-test/suite/maria/maria2.test
+++ b/mysql-test/suite/maria/maria2.test
@@ -1,10 +1,5 @@
--source include/have_maria.inc
-# Initialise
---disable_warnings
-drop table if exists t1,t2;
---enable_warnings
-
# Test for BUG#36319
# "Aria: table is not empty but DELETE and SELECT find no rows"
@@ -109,3 +104,78 @@ select * from t1 order by pk;
load data infile '../../std_data/loaddata5.dat' replace into table t1 fields terminated by '' enclosed by '' ignore 1 lines (pk, apk);
select * from t1 order by pk;
drop table t1;
+
+--echo #
+--echo # End of 5.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-27303 Table corruption after insert into a non-InnoDB table with DESC index
+--echo #
+create table t1 (
+ a bigint default 0,
+ b bigint default 0,
+ c binary(128) not null,
+ d datetime default '0000-00-00 00:00:00',
+ key (c desc,b,d,a)
+) engine=aria;
+insert into t1 (c) values
+ ('xx'),('bb'),('tt'),('pp'),('mm'),('yy'),('rr'),('bb'),('yy'),('gg'),
+ ('dd'),('fx'),('wi'),('ix'),('ox'),('mu'),('ux'),('pm'),('mx'),('xu'),
+ ('ul'),('lp'),('px'),('lp'),('xx'),('pq'),('qs'),('se'),('ee'),('xx'),
+ ('rv'),('ff'),('vj'),('jy'),('yn'),('nc'),('nx'),('hj'),('ji'),('ik'),
+ ('kk'),('ww'),('xx'),('yd'),('dw'),('wk'),('kr'),('dd'),('rj'),('jf'),
+ ('bx'),('fc'),('cp'),('pm'),('mw'),('wy'),('yl'),('li'),('ic'),('he'),
+ ('ci'),('il'),('lz'),('zd'),('gz'),('xd'),('ze'),('dm'),('ms'),('xd'),
+ ('sw'),('we'),('nb'),('tx'),('vr'),('xw'),('aa'),('ah'),('hd'),('jl'),
+ ('lf'),('fw'),('wx'),('xh'),('hr'),('zx'),('vw'),('rm'),('mx'),('xt'),
+ ('tp'),('ps'),('sh'),('ga'),('df'),('as'),('gz'),('xd'),('yy'),('xr');
+check table t1 extended;
+drop table t1;
+
+--echo #
+--echo # MDEV-27309 Server crash or ASAN memcpy-param-overlap upon INSERT into Aria/MyISAM table with DESC key
+--echo #
+CREATE TABLE t1 (id INT, c BINARY(80), PRIMARY KEY(id));
+ALTER TABLE t1 ADD KEY(c DESC, id);
+INSERT INTO t1 VALUES (1,NULL),(2,''),(3,'');
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-27330 Wrong sorting order with DESC index and empty strings in MyISAM/Aria table
+--echo #
+create table t (id int, c char(128) not null, key (c desc)) engine=aria;
+insert into t values (1,''),(2,'foo'),(3,''),(4,'bar');
+select c from t order by c;
+drop table t;
+
+--echo #
+--echo # MDEV-27340 NULL gets lost (becomes empty string), SELECT hangs with DESC index on MyISAM/Aria table
+--echo #
+create table t (c char(8), key(c desc)) engine=aria character set utf8mb4;
+insert into t values (''),('foo'),(null),(''),('bar');
+check table t;
+check table t extended;
+select distinct c from t;
+select c from t;
+drop table t;
+
+--echo #
+--echo # MDEV-27434 DESC attribute does not work with auto-increment on secondary column of multi-part index
+--echo #
+create table t (a int auto_increment, b int, unique(b,a desc)) engine=aria;
+insert ignore into t (b) values (10),(10),(10);
+select * from t;
+drop table t;
+
+--echo #
+--echo # MDEV-27585 Auto-increment on secondary column increments unexpectedly with DESC key
+--echo #
+create table t (c char(16), i int auto_increment, index (c,i desc)) engine=aria collate latin1_swedish_ci;
+insert into t (c) values ('ä'),('a');
+select hex(c),c,i from t order by c, i;
+drop table t;
+
+--echo #
+--echo # End of 10.8 tests
+--echo #
diff --git a/mysql-test/suite/mariabackup/compression_providers_loaded,lz4.rdiff b/mysql-test/suite/mariabackup/compression_providers_loaded,lz4.rdiff
new file mode 100644
index 00000000000..2202a51119e
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_loaded,lz4.rdiff
@@ -0,0 +1,13 @@
+--- suite/mariabackup/compression_providers_loaded.result
++++ suite/mariabackup/compression_providers_loaded.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing mariabackup with bzip2 compression
++# Testing mariabackup with lz4 compression
+ #
+ # Creating table
+-set global innodb_compression_algorithm = bzip2;
++set global innodb_compression_algorithm = lz4;
+ create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+ insert t1 (a, b) values (0, repeat("abc", 100));
+ insert t1 (a, b) values (1, repeat("def", 1000));
diff --git a/mysql-test/suite/mariabackup/compression_providers_loaded,lzma.rdiff b/mysql-test/suite/mariabackup/compression_providers_loaded,lzma.rdiff
new file mode 100644
index 00000000000..e6b52d3ac07
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_loaded,lzma.rdiff
@@ -0,0 +1,13 @@
+--- suite/mariabackup/compression_providers_loaded.result
++++ suite/mariabackup/compression_providers_loaded.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing mariabackup with bzip2 compression
++# Testing mariabackup with lzma compression
+ #
+ # Creating table
+-set global innodb_compression_algorithm = bzip2;
++set global innodb_compression_algorithm = lzma;
+ create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+ insert t1 (a, b) values (0, repeat("abc", 100));
+ insert t1 (a, b) values (1, repeat("def", 1000));
diff --git a/mysql-test/suite/mariabackup/compression_providers_loaded,lzo.rdiff b/mysql-test/suite/mariabackup/compression_providers_loaded,lzo.rdiff
new file mode 100644
index 00000000000..75e9519d680
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_loaded,lzo.rdiff
@@ -0,0 +1,13 @@
+--- suite/mariabackup/compression_providers_loaded.result
++++ suite/mariabackup/compression_providers_loaded.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing mariabackup with bzip2 compression
++# Testing mariabackup with lzo compression
+ #
+ # Creating table
+-set global innodb_compression_algorithm = bzip2;
++set global innodb_compression_algorithm = lzo;
+ create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+ insert t1 (a, b) values (0, repeat("abc", 100));
+ insert t1 (a, b) values (1, repeat("def", 1000));
diff --git a/mysql-test/suite/mariabackup/compression_providers_loaded,snappy.rdiff b/mysql-test/suite/mariabackup/compression_providers_loaded,snappy.rdiff
new file mode 100644
index 00000000000..da281efffc4
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_loaded,snappy.rdiff
@@ -0,0 +1,13 @@
+--- suite/mariabackup/compression_providers_loaded.result
++++ suite/mariabackup/compression_providers_loaded.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing mariabackup with bzip2 compression
++# Testing mariabackup with snappy compression
+ #
+ # Creating table
+-set global innodb_compression_algorithm = bzip2;
++set global innodb_compression_algorithm = snappy;
+ create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+ insert t1 (a, b) values (0, repeat("abc", 100));
+ insert t1 (a, b) values (1, repeat("def", 1000));
diff --git a/mysql-test/suite/mariabackup/compression_providers_loaded.combinations b/mysql-test/suite/mariabackup/compression_providers_loaded.combinations
new file mode 100644
index 00000000000..3287917fd5e
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_loaded.combinations
@@ -0,0 +1,14 @@
+[bzip2]
+plugin-load-add=$PROVIDER_BZIP2_SO
+
+[lz4]
+plugin-load-add=$PROVIDER_LZ4_SO
+
+[lzma]
+plugin-load-add=$PROVIDER_LZMA_SO
+
+[lzo]
+plugin-load-add=$PROVIDER_LZO_SO
+
+[snappy]
+plugin-load-add=$PROVIDER_SNAPPY_SO
diff --git a/mysql-test/suite/mariabackup/compression_providers_loaded.result b/mysql-test/suite/mariabackup/compression_providers_loaded.result
new file mode 100644
index 00000000000..6cd928b02f7
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_loaded.result
@@ -0,0 +1,27 @@
+#
+# Testing mariabackup with bzip2 compression
+#
+# Creating table
+set global innodb_compression_algorithm = bzip2;
+create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+insert t1 (a, b) values (0, repeat("abc", 100));
+insert t1 (a, b) values (1, repeat("def", 1000));
+insert t1 (a, b) values (2, repeat("ghi", 10000));
+select a, left(b, 9), length(b) from t1;
+a left(b, 9) length(b)
+0 abcabcabc 300
+1 defdefdef 3000
+2 ghighighi 30000
+# restart
+# xtrabackup backup
+# xtrabackup prepare;
+# shutdown server
+# remove datadir
+# xtrabackup move back
+# restart
+select a, left(b, 9), length(b) from t1;
+a left(b, 9) length(b)
+0 abcabcabc 300
+1 defdefdef 3000
+2 ghighighi 30000
+drop table t1;
diff --git a/mysql-test/suite/mariabackup/compression_providers_loaded.test b/mysql-test/suite/mariabackup/compression_providers_loaded.test
new file mode 100644
index 00000000000..aad21ff01a4
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_loaded.test
@@ -0,0 +1,38 @@
+let $alg = $MTR_COMBINATIONS;
+
+if (`select count(*) = 0 from information_schema.plugins where plugin_name = 'provider_$alg' and plugin_status='active'`)
+{
+ skip "Needs provider_$alg plugin";
+}
+
+--echo #
+--echo # Testing mariabackup with $alg compression
+--echo #
+
+--echo # Creating table
+eval set global innodb_compression_algorithm = $alg;
+eval create table t1 (a int, b text $column_params) engine = innodb page_compressed = 1;
+insert t1 (a, b) values (0, repeat("abc", 100));
+insert t1 (a, b) values (1, repeat("def", 1000));
+insert t1 (a, b) values (2, repeat("ghi", 10000));
+select a, left(b, 9), length(b) from t1;
+
+--source include/restart_mysqld.inc
+
+--echo # xtrabackup backup
+let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
+
+disable_result_log;
+exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir;
+enable_result_log;
+
+--echo # xtrabackup prepare;
+disable_result_log;
+exec $XTRABACKUP --prepare --target-dir=$targetdir;
+source include/restart_and_restore.inc;
+enable_result_log;
+
+select a, left(b, 9), length(b) from t1;
+
+drop table t1;
+rmdir $targetdir;
diff --git a/mysql-test/suite/mariabackup/compression_providers_unloaded,lz4.rdiff b/mysql-test/suite/mariabackup/compression_providers_unloaded,lz4.rdiff
new file mode 100644
index 00000000000..4b874403830
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_unloaded,lz4.rdiff
@@ -0,0 +1,22 @@
+--- suite/mariabackup/compression_providers_unloaded.result
++++ suite/mariabackup/compression_providers_unloaded.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing mariabackup with bzip2 compression
++# Testing mariabackup with lz4 compression
+ #
+-# Create table with bzip2 compression
+-set global innodb_compression_algorithm = bzip2;
++# Create table with lz4 compression
++set global innodb_compression_algorithm = lz4;
+ create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+ insert t1 (a, b) values (0, repeat("abc", 100));
+ insert t1 (a, b) values (1, repeat("def", 1000));
+@@ -14,6 +14,6 @@
+ 2 ghighighi 30000
+ # Restart server without plugin
+ call mtr.add_suppression("mariadbd: MariaDB tried to use the \\w+ compression, but its provider plugin is not loaded");
+-# restart: --disable-provider-bzip2
++# restart: --disable-provider-lz4
+ # xtrabackup backup
+ drop table t1;
diff --git a/mysql-test/suite/mariabackup/compression_providers_unloaded,lzma.rdiff b/mysql-test/suite/mariabackup/compression_providers_unloaded,lzma.rdiff
new file mode 100644
index 00000000000..ff57834f624
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_unloaded,lzma.rdiff
@@ -0,0 +1,22 @@
+--- suite/mariabackup/compression_providers_unloaded.result
++++ suite/mariabackup/compression_providers_unloaded.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing mariabackup with bzip2 compression
++# Testing mariabackup with lzma compression
+ #
+-# Create table with bzip2 compression
+-set global innodb_compression_algorithm = bzip2;
++# Create table with lzma compression
++set global innodb_compression_algorithm = lzma;
+ create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+ insert t1 (a, b) values (0, repeat("abc", 100));
+ insert t1 (a, b) values (1, repeat("def", 1000));
+@@ -14,6 +14,6 @@
+ 2 ghighighi 30000
+ # Restart server without plugin
+ call mtr.add_suppression("mariadbd: MariaDB tried to use the \\w+ compression, but its provider plugin is not loaded");
+-# restart: --disable-provider-bzip2
++# restart: --disable-provider-lzma
+ # xtrabackup backup
+ drop table t1;
diff --git a/mysql-test/suite/mariabackup/compression_providers_unloaded,lzo.rdiff b/mysql-test/suite/mariabackup/compression_providers_unloaded,lzo.rdiff
new file mode 100644
index 00000000000..5308fc4333e
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_unloaded,lzo.rdiff
@@ -0,0 +1,22 @@
+--- suite/mariabackup/compression_providers_unloaded.result
++++ suite/mariabackup/compression_providers_unloaded.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing mariabackup with bzip2 compression
++# Testing mariabackup with lzo compression
+ #
+-# Create table with bzip2 compression
+-set global innodb_compression_algorithm = bzip2;
++# Create table with lzo compression
++set global innodb_compression_algorithm = lzo;
+ create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+ insert t1 (a, b) values (0, repeat("abc", 100));
+ insert t1 (a, b) values (1, repeat("def", 1000));
+@@ -14,6 +14,6 @@
+ 2 ghighighi 30000
+ # Restart server without plugin
+ call mtr.add_suppression("mariadbd: MariaDB tried to use the \\w+ compression, but its provider plugin is not loaded");
+-# restart: --disable-provider-bzip2
++# restart: --disable-provider-lzo
+ # xtrabackup backup
+ drop table t1;
diff --git a/mysql-test/suite/mariabackup/compression_providers_unloaded,snappy.rdiff b/mysql-test/suite/mariabackup/compression_providers_unloaded,snappy.rdiff
new file mode 100644
index 00000000000..b7b5e2b51c2
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_unloaded,snappy.rdiff
@@ -0,0 +1,22 @@
+--- suite/mariabackup/compression_providers_unloaded.result
++++ suite/mariabackup/compression_providers_unloaded.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing mariabackup with bzip2 compression
++# Testing mariabackup with snappy compression
+ #
+-# Create table with bzip2 compression
+-set global innodb_compression_algorithm = bzip2;
++# Create table with snappy compression
++set global innodb_compression_algorithm = snappy;
+ create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+ insert t1 (a, b) values (0, repeat("abc", 100));
+ insert t1 (a, b) values (1, repeat("def", 1000));
+@@ -14,6 +14,6 @@
+ 2 ghighighi 30000
+ # Restart server without plugin
+ call mtr.add_suppression("mariadbd: MariaDB tried to use the \\w+ compression, but its provider plugin is not loaded");
+-# restart: --disable-provider-bzip2
++# restart: --disable-provider-snappy
+ # xtrabackup backup
+ drop table t1;
diff --git a/mysql-test/suite/mariabackup/compression_providers_unloaded.combinations b/mysql-test/suite/mariabackup/compression_providers_unloaded.combinations
new file mode 100644
index 00000000000..3287917fd5e
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_unloaded.combinations
@@ -0,0 +1,14 @@
+[bzip2]
+plugin-load-add=$PROVIDER_BZIP2_SO
+
+[lz4]
+plugin-load-add=$PROVIDER_LZ4_SO
+
+[lzma]
+plugin-load-add=$PROVIDER_LZMA_SO
+
+[lzo]
+plugin-load-add=$PROVIDER_LZO_SO
+
+[snappy]
+plugin-load-add=$PROVIDER_SNAPPY_SO
diff --git a/mysql-test/suite/mariabackup/compression_providers_unloaded.result b/mysql-test/suite/mariabackup/compression_providers_unloaded.result
new file mode 100644
index 00000000000..ccf3e0355a4
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_unloaded.result
@@ -0,0 +1,22 @@
+call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt");
+call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed");
+call mtr.add_suppression("Refusing to load corrupted table");
+#
+# Testing mariabackup with bzip2 compression
+#
+# Create table with bzip2 compression
+set global innodb_compression_algorithm = bzip2;
+create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+insert t1 (a, b) values (0, repeat("abc", 100));
+insert t1 (a, b) values (1, repeat("def", 1000));
+insert t1 (a, b) values (2, repeat("ghi", 10000));
+select a, left(b, 9), length(b) from t1;
+a left(b, 9) length(b)
+0 abcabcabc 300
+1 defdefdef 3000
+2 ghighighi 30000
+# Restart server without plugin
+call mtr.add_suppression("mariadbd: MariaDB tried to use the \\w+ compression, but its provider plugin is not loaded");
+# restart: --disable-provider-bzip2
+# xtrabackup backup
+drop table t1;
diff --git a/mysql-test/suite/mariabackup/compression_providers_unloaded.test b/mysql-test/suite/mariabackup/compression_providers_unloaded.test
new file mode 100644
index 00000000000..673c16d03cf
--- /dev/null
+++ b/mysql-test/suite/mariabackup/compression_providers_unloaded.test
@@ -0,0 +1,35 @@
+let $alg = $MTR_COMBINATIONS;
+call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt");
+call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed");
+call mtr.add_suppression("Refusing to load corrupted table");
+
+if (`select count(*) = 0 from information_schema.plugins where plugin_name = 'provider_$alg' and plugin_status='active'`)
+{
+ skip "Needs provider_$alg plugin";
+}
+
+--echo #
+--echo # Testing mariabackup with $alg compression
+--echo #
+
+--echo # Create table with $alg compression
+eval set global innodb_compression_algorithm = $alg;
+eval create table t1 (a int, b text $column_params) engine = innodb page_compressed = 1;
+insert t1 (a, b) values (0, repeat("abc", 100));
+insert t1 (a, b) values (1, repeat("def", 1000));
+insert t1 (a, b) values (2, repeat("ghi", 10000));
+select a, left(b, 9), length(b) from t1;
+
+--echo # Restart server without plugin
+call mtr.add_suppression("mariadbd: MariaDB tried to use the \\w+ compression, but its provider plugin is not loaded");
+let $restart_parameters = --disable-provider-$alg;
+source include/restart_mysqld.inc;
+
+--echo # xtrabackup backup
+let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
+
+error 1;
+exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir;
+
+drop table t1;
+rmdir $targetdir;
diff --git a/mysql-test/suite/mariabackup/huge_lsn,strict_crc32.rdiff b/mysql-test/suite/mariabackup/huge_lsn,strict_crc32.rdiff
new file mode 100644
index 00000000000..29afd468751
--- /dev/null
+++ b/mysql-test/suite/mariabackup/huge_lsn,strict_crc32.rdiff
@@ -0,0 +1,11 @@
+@@ -1,8 +1,8 @@
+ #
+ # MDEV-13416 mariabackup fails with EFAULT "Bad Address"
+ #
+-# restart: --innodb-log-file-size=4M --innodb-encrypt-log=0
+-FOUND 1 /InnoDB: log sequence number 17596481011216/ in mysqld.1.err
++# restart
++FOUND 1 /redo log: [0-9.]*[KMGT]iB; LSN=17596481010687\b/ in mysqld.1.err
+ CREATE TABLE t(i INT) ENGINE=INNODB ENCRYPTED=YES;
+ INSERT INTO t VALUES(1);
+ # xtrabackup backup
diff --git a/mysql-test/suite/mariabackup/huge_lsn.result b/mysql-test/suite/mariabackup/huge_lsn.result
index 73b51ea438f..503d13fcac4 100644
--- a/mysql-test/suite/mariabackup/huge_lsn.result
+++ b/mysql-test/suite/mariabackup/huge_lsn.result
@@ -1,8 +1,8 @@
#
# MDEV-13416 mariabackup fails with EFAULT "Bad Address"
#
-# restart
-FOUND 1 /InnoDB: New log file created, LSN=175964\d{8}/ in mysqld.1.err
+# restart: --innodb-log-file-size=4M --innodb-encrypt-log=0
+FOUND 1 /InnoDB: log sequence number 17596481011216/ in mysqld.1.err
CREATE TABLE t(i INT) ENGINE=INNODB ENCRYPTED=YES;
INSERT INTO t VALUES(1);
# xtrabackup backup
diff --git a/mysql-test/suite/mariabackup/huge_lsn.test b/mysql-test/suite/mariabackup/huge_lsn.test
index 66fe00dd761..8850e9d8954 100644
--- a/mysql-test/suite/mariabackup/huge_lsn.test
+++ b/mysql-test/suite/mariabackup/huge_lsn.test
@@ -14,8 +14,8 @@ exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=
--enable_result_log
--source include/shutdown_mysqld.inc
+if ($MTR_COMBINATION_STRICT_CRC32) {
perl;
-do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
my $file= "$ENV{MYSQLD_DATADIR}/ibdata1";
open(FILE, "+<", $file) or die "Unable to open $file\n";
binmode FILE;
@@ -23,23 +23,54 @@ my $ps= $ENV{INNODB_PAGE_SIZE};
my $page;
die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps;
substr($page,26,8) = pack("NN", 4096, ~1024);
-my $polynomial = 0x82f63b78; # CRC-32C
-my $full_crc32 = unpack("N",substr($page,54,4)) & 0x10; # FIL_SPACE_FLAGS
-if ($full_crc32)
-{
- my $ck = mycrc32(substr($page, 0, $ps-4), 0, $polynomial);
- substr($page, $ps-4, 4) = pack("N", $ck);
-}
sysseek(FILE, 0, 0) || die "Unable to rewind $file\n";
syswrite(FILE, $page, $ps)==$ps || die "Unable to write $file\n";
close(FILE) || die "Unable to close $file\n";
+
+$file= "$ENV{MYSQLD_DATADIR}/ib_logfile0";
+open(FILE, ">", $file) || die "Unable to truncate $file\n";
+close(FILE) || "Unable to close $file\n";
EOF
+--let SEARCH_PATTERN= redo log: [0-9.]*[KMGT]iB; LSN=17596481010687\\b
+}
---remove_files_wildcard $MYSQLD_DATADIR ib_logfile*
+if (!$MTR_COMBINATION_STRICT_CRC32) {
+perl;
+do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
+my $file= "$ENV{MYSQLD_DATADIR}/ib_logfile0";
+open(FILE, ">", $file) or die "Unable to open $file\n";
+binmode FILE;
+my $extra_repeat = 139820;
+# The desired log sequence number is 17596481011216 (0x1000fffffe10).
+my $file_size=4<<20;
+my $lsn_hi=4096,$lsn_lo=0xfffffe00 - $extra_repeat * 15;
+my $polynomial = 0x82f63b78; # CRC-32C
+my ($header, $checkpoint, $log);
+$header = "Phys" . pack("x[4]NN", $lsn_hi, $lsn_lo - $file_size + 0x300f) .
+ "some Perl code" . pack("x[478]");
+$header .= pack("Nx[3584]", mycrc32($header, 0, $polynomial));
+$checkpoint = pack("NNNNx[44]", $lsn_hi, $lsn_lo, $lsn_hi, $lsn_lo);
+$checkpoint .= pack("Nx[8128]", mycrc32($checkpoint, 0, $polynomial));
+$log = pack("CxxNN", 0xfa, $lsn_hi, $lsn_lo);
+$log .= pack("CN", 0, mycrc32($log, 0, $polynomial));
+
+# Write more than 2MiB of FILE_MODIFY mini-transactions to exercise the parser.
+my $extra = pack("CCxa*", 0xb9, 127, "a/b.ibd");
+$extra .= pack("CN", 0, mycrc32($extra, 0, $polynomial));
+
+print FILE $header, $checkpoint, $extra x ($extra_repeat - 1), $log;
+seek(FILE, $file_size - 15, 0);
+$extra = pack("CCxa*", 0xb9, 127, "c/d.ibd");
+$extra .= pack("CN", 1, mycrc32($extra, 0, $polynomial));
+print FILE $extra;
+close(FILE) or die "Unable to close $file\n";
+EOF
+--let SEARCH_PATTERN= InnoDB: log sequence number 17596481011216
+--let $restart_parameters=--innodb-log-file-size=4M --innodb-encrypt-log=0
+}
--source include/start_mysqld.inc
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
---let SEARCH_PATTERN= InnoDB: New log file created, LSN=175964\d{8}
--source include/search_pattern_in_file.inc
CREATE TABLE t(i INT) ENGINE=INNODB ENCRYPTED=YES;
@@ -55,6 +86,7 @@ INSERT INTO t VALUES(2);
echo # xtrabackup prepare;
--disable_result_log
exec $XTRABACKUP --prepare --target-dir=$targetdir;
+--let $restart_parameters=
--source include/restart_and_restore.inc
--enable_result_log
SELECT * FROM t;
diff --git a/mysql-test/suite/mariabackup/incremental_page_compressed.result b/mysql-test/suite/mariabackup/incremental_page_compressed.result
new file mode 100644
index 00000000000..eb059cdc769
--- /dev/null
+++ b/mysql-test/suite/mariabackup/incremental_page_compressed.result
@@ -0,0 +1,13 @@
+#
+# MDEV-26794 MariaBackup does not recognize added providers upon prepare of incremental backup
+#
+CREATE TABLE t (a INT) ENGINE=InnoDB;
+INSERT INTO t VALUES (1),(2);
+INSTALL SONAME 'provider_snappy';
+SET GLOBAL innodb_compression_algorithm= snappy;
+CREATE TABLE t_snappy (a INT) ENGINE=InnoDB page_compressed=1;
+INSERT INTO t_snappy VALUES (3),(4);
+# restart: --innodb_buffer_pool_load_at_startup=0
+# Prepare initial backup
+# Prepare incremental backup
+DROP TABLE t;
diff --git a/mysql-test/suite/mariabackup/incremental_page_compressed.test b/mysql-test/suite/mariabackup/incremental_page_compressed.test
new file mode 100644
index 00000000000..f6ec26cfb46
--- /dev/null
+++ b/mysql-test/suite/mariabackup/incremental_page_compressed.test
@@ -0,0 +1,38 @@
+--echo #
+--echo # MDEV-26794 MariaBackup does not recognize added providers upon prepare of incremental backup
+--echo #
+
+if (!$PROVIDER_SNAPPY_SO) {
+ skip "Needs provider_snappy plugin";
+}
+
+--source include/have_innodb.inc
+
+--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup
+--let $incdir=$MYSQLTEST_VARDIR/tmp/inc
+
+CREATE TABLE t (a INT) ENGINE=InnoDB;
+INSERT INTO t VALUES (1),(2);
+
+--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir
+
+INSTALL SONAME 'provider_snappy';
+
+SET GLOBAL innodb_compression_algorithm= snappy;
+
+CREATE TABLE t_snappy (a INT) ENGINE=InnoDB page_compressed=1;
+INSERT INTO t_snappy VALUES (3),(4);
+
+# disable buffer pool load to avoid MDEV-26794 warnings
+--let $restart_parameters= --innodb_buffer_pool_load_at_startup=0
+--source include/restart_mysqld.inc
+
+--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --incremental-basedir=$targetdir --target-dir=$incdir
+
+--echo # Prepare initial backup
+--exec $XTRABACKUP --prepare --target-dir=$targetdir
+
+--echo # Prepare incremental backup
+--exec $XTRABACKUP --prepare --target-dir=$targetdir --incremental-dir=$incdir > $MYSQLTEST_VARDIR/prepare.log 2>&1
+
+DROP TABLE t;
diff --git a/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.opt b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.opt
index 95b88d038ee..a0b4b588279 100644
--- a/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.opt
+++ b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.opt
@@ -1 +1 @@
---loose-innodb-log-file-size=2097152
+--loose-innodb-log-file-size=4194304
diff --git a/mysql-test/suite/mariabackup/innodb_redo_overwrite.opt b/mysql-test/suite/mariabackup/innodb_redo_overwrite.opt
index 19c08c8c945..a0b4b588279 100644
--- a/mysql-test/suite/mariabackup/innodb_redo_overwrite.opt
+++ b/mysql-test/suite/mariabackup/innodb_redo_overwrite.opt
@@ -1 +1 @@
---loose-innodb-log-file-size=2m
+--loose-innodb-log-file-size=4194304
diff --git a/mysql-test/suite/mariabackup/innodb_redo_overwrite.result b/mysql-test/suite/mariabackup/innodb_redo_overwrite.result
index 9076dbaa57a..bab5d4331e0 100644
--- a/mysql-test/suite/mariabackup/innodb_redo_overwrite.result
+++ b/mysql-test/suite/mariabackup/innodb_redo_overwrite.result
@@ -1,27 +1,5 @@
-CREATE TABLE t(i INT) ENGINE=INNODB;
-INSERT INTO t VALUES
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
-(0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
-# Generate enough data to overwrite innodb redo log
-# on the next "INSERT INTO t SELECT * FROM t" execution.
-INSERT INTO t SELECT * FROM t;
-INSERT INTO t SELECT * FROM t;
-INSERT INTO t SELECT * FROM t;
-INSERT INTO t SELECT * FROM t;
-INSERT INTO t SELECT * FROM t;
-INSERT INTO t SELECT * FROM t;
-INSERT INTO t SELECT * FROM t;
-INSERT INTO t SELECT * FROM t;
-INSERT INTO t SELECT * FROM t;
+CREATE TABLE t ENGINE=INNODB SELECT seq%10 i FROM seq_0_to_204796;
# xtrabackup backup
-FOUND 1 /failed: redo log block is overwritten/ in backup.log
-FOUND 1 /failed: redo log block checksum does not match/ in backup.log
+FOUND 1 /Was only able to copy log from \d+ to \d+, not \d+; try increasing innodb_log_file_size\b/ in backup.log
+NOT FOUND /failed: redo log block checksum does not match/ in backup.log
DROP TABLE t;
diff --git a/mysql-test/suite/mariabackup/innodb_redo_overwrite.test b/mysql-test/suite/mariabackup/innodb_redo_overwrite.test
index 1ed75607be8..ab5993d232c 100644
--- a/mysql-test/suite/mariabackup/innodb_redo_overwrite.test
+++ b/mysql-test/suite/mariabackup/innodb_redo_overwrite.test
@@ -1,27 +1,10 @@
--source include/have_innodb.inc
--source include/have_debug_sync.inc
+--source include/have_debug.inc
+--source include/have_sequence.inc
--source include/no_valgrind_without_big.inc
-CREATE TABLE t(i INT) ENGINE=INNODB;
-
-INSERT INTO t VALUES
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
- (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
---echo # Generate enough data to overwrite innodb redo log
---echo # on the next "INSERT INTO t SELECT * FROM t" execution.
---let $i = 0
-while ($i < 9) {
-INSERT INTO t SELECT * FROM t;
---inc $i
-}
+CREATE TABLE t ENGINE=INNODB SELECT seq%10 i FROM seq_0_to_204796;
--echo # xtrabackup backup
--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup
@@ -34,13 +17,13 @@ INSERT INTO t SELECT * FROM t;
--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --dbug=+d,mariabackup_events > $backuplog
--enable_result_log
---let SEARCH_PATTERN=failed: redo log block is overwritten
+--let SEARCH_PATTERN=Was only able to copy log from \\d+ to \\d+, not \\d+; try increasing innodb_log_file_size\\b
--let SEARCH_FILE=$backuplog
--source include/search_pattern_in_file.inc
--remove_file $backuplog
--rmdir $targetdir
---let before_innodb_log_copy_thread_started=INSERT INTO test.t VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)
+--let before_innodb_log_copy_thread_started=INSERT INTO test.t SELECT seq FROM seq_0_to_9
--disable_result_log
--error 1
diff --git a/mysql-test/suite/mariabackup/missing_ibd.test b/mysql-test/suite/mariabackup/missing_ibd.test
index dc1406039e7..f406a555b4a 100644
--- a/mysql-test/suite/mariabackup/missing_ibd.test
+++ b/mysql-test/suite/mariabackup/missing_ibd.test
@@ -9,7 +9,7 @@ let MYSQLD_DATADIR=`select @@datadir`;
--disable_query_log
call mtr.add_suppression("InnoDB: Cannot open datafile for read-only: '.*test.t1\.ibd'");
-call mtr.add_suppression('InnoDB: Operating system error number');
+call mtr.add_suppression('InnoDB: (Operating system error number|Error number \\d+ means)');
call mtr.add_suppression('InnoDB: The error means the system cannot find the path specified\.');
call mtr.add_suppression('InnoDB: Table test/t1 in the InnoDB data dictionary has tablespace id .*, but tablespace with that id or name does not exist');
call mtr.add_suppression('InnoDB: Ignoring tablespace for test/t1 because it could not be opened\.');
diff --git a/mysql-test/suite/mariabackup/xb_file_key_management.result b/mysql-test/suite/mariabackup/xb_file_key_management.result
index 6cedfd2213b..cf8edb310b8 100644
--- a/mysql-test/suite/mariabackup/xb_file_key_management.result
+++ b/mysql-test/suite/mariabackup/xb_file_key_management.result
@@ -1,5 +1,7 @@
-CREATE TABLE t(c VARCHAR(10)) ENGINE INNODB encrypted=yes;
+CREATE TABLE t(c TEXT) ENGINE INNODB encrypted=yes;
+INSERT INTO t VALUES(REPEAT('fubar',100));
INSERT INTO t VALUES('foobar1');
+DELETE FROM t LIMIT 1;
# xtrabackup backup
NOT FOUND /foobar1/ in ib_logfile0
# expect NOT FOUND
diff --git a/mysql-test/suite/mariabackup/xb_file_key_management.test b/mysql-test/suite/mariabackup/xb_file_key_management.test
index 2a176952053..4d27b2dfa95 100644
--- a/mysql-test/suite/mariabackup/xb_file_key_management.test
+++ b/mysql-test/suite/mariabackup/xb_file_key_management.test
@@ -1,8 +1,10 @@
#--source include/innodb_page_size.inc
--source include/have_file_key_management.inc
-CREATE TABLE t(c VARCHAR(10)) ENGINE INNODB encrypted=yes;
+CREATE TABLE t(c TEXT) ENGINE INNODB encrypted=yes;
+INSERT INTO t VALUES(REPEAT('fubar',100));
INSERT INTO t VALUES('foobar1');
+DELETE FROM t LIMIT 1;
echo # xtrabackup backup;
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
--disable_result_log
@@ -24,7 +26,7 @@ exec $XTRABACKUP --prepare --target-dir=$targetdir;
--enable_result_log
--list_files $targetdir ib_logfile*
---cat_file $targetdir/ib_logfile0
+--remove_file $targetdir/ib_logfile0
SELECT * FROM t;
DROP TABLE t;
diff --git a/mysql-test/suite/multi_source/change_master.result b/mysql-test/suite/multi_source/change_master.result
new file mode 100644
index 00000000000..9fd84e51364
--- /dev/null
+++ b/mysql-test/suite/multi_source/change_master.result
@@ -0,0 +1,8 @@
+RESET MASTER;
+connect slave,127.0.0.1,root,,,$SERVER_MYPORT_3;
+change master 'abc1' to relay_log_file='';
+ERROR HY000: Failed initializing relay log position: Could not find target log during relay log initialization
+change master 'abc1' to relay_log_file='';
+ERROR HY000: Failed initializing relay log position: Could not find target log during relay log initialization
+disconnect slave;
+connection default;
diff --git a/mysql-test/suite/multi_source/change_master.test b/mysql-test/suite/multi_source/change_master.test
new file mode 100644
index 00000000000..08e6909694f
--- /dev/null
+++ b/mysql-test/suite/multi_source/change_master.test
@@ -0,0 +1,13 @@
+--source include/not_embedded.inc
+
+RESET MASTER;
+
+--connect (slave,127.0.0.1,root,,,$SERVER_MYPORT_3)
+
+--error ER_RELAY_LOG_INIT
+change master 'abc1' to relay_log_file='';
+--error ER_RELAY_LOG_INIT
+change master 'abc1' to relay_log_file='';
+--disconnect slave
+--connection default
+
diff --git a/mysql-test/suite/multi_source/multisource_for_channel.result b/mysql-test/suite/multi_source/multisource_for_channel.result
new file mode 100644
index 00000000000..cb1224b416f
--- /dev/null
+++ b/mysql-test/suite/multi_source/multisource_for_channel.result
@@ -0,0 +1,370 @@
+RESET MASTER;
+connect slave,127.0.0.1,root,,,$SERVER_MYPORT_3;
+change master to relay_log_file='' for channel 'abc1';
+ERROR HY000: Failed initializing relay log position: Could not find target log during relay log initialization
+change master to master_host='' for channel 'abc2';
+ERROR HY000: Incorrect arguments to MASTER_HOST
+change master to
+master_port=MYPORT_1,
+master_host='127.0.0.1',
+master_user='root'
+for channel 'master1';
+start slave for channel 'master1';
+set default_master_connection = 'master1';
+include/wait_for_slave_to_start.inc
+connect master1,127.0.0.1,root,,,$SERVER_MYPORT_1;
+connection slave;
+#
+# Checking SHOW SLAVE 'master1' STATUS
+#
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin-master1.000002'
+Slave_IO_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+#
+# Checking SHOW SLAVE STATUS
+#
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin-master1.000002'
+Slave_IO_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+#
+# Checking SHOW ALL SLAVES STATUS
+#
+Connection_name = 'master1'
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin-master1.000002'
+Slave_IO_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+Slave_heartbeat_period = '60.000'
+#
+connection master1;
+drop database if exists db1;
+create database db1;
+use db1;
+create table t1 (i int auto_increment, f1 varchar(16), primary key pk (i,f1)) engine=MyISAM;
+Warnings:
+Warning 1280 Name 'pk' ignored for PRIMARY key.
+insert into t1 (f1) values ('one'),('two');
+connection slave;
+select * from db1.t1;
+i f1
+1 one
+2 two
+# List of relay log files in the datadir
+mysqld-relay-bin-master1.000001
+mysqld-relay-bin-master1.000002
+mysqld-relay-bin-master1.index
+include/show_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+mysqld-relay-bin-master1.000001 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
+mysqld-relay-bin-master1.000001 # Rotate # # mysqld-relay-bin-master1.000002;pos=4
+include/show_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+mysqld-relay-bin-master1.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
+mysqld-relay-bin-master1.000002 # Rotate # # master-bin.000001;pos=POS
+mysqld-relay-bin-master1.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
+mysqld-relay-bin-master1.000002 # Gtid_list # # []
+mysqld-relay-bin-master1.000002 # Binlog_checkpoint # # master-bin.000001
+mysqld-relay-bin-master1.000002 # Gtid # # GTID #-#-#
+mysqld-relay-bin-master1.000002 # Query # # drop database if exists db1
+mysqld-relay-bin-master1.000002 # Gtid # # GTID #-#-#
+mysqld-relay-bin-master1.000002 # Query # # create database db1
+mysqld-relay-bin-master1.000002 # Gtid # # GTID #-#-#
+mysqld-relay-bin-master1.000002 # Query # # use `db1`; create table t1 (i int auto_increment, f1 varchar(16), primary key pk (i,f1)) engine=MyISAM
+mysqld-relay-bin-master1.000002 # Gtid # # BEGIN GTID #-#-#
+mysqld-relay-bin-master1.000002 # Intvar # # INSERT_ID=1
+mysqld-relay-bin-master1.000002 # Query # # use `db1`; insert into t1 (f1) values ('one'),('two')
+mysqld-relay-bin-master1.000002 # Query # # COMMIT
+change master to
+master_port=MYPORT_2,
+master_host='127.0.0.1',
+master_user='root'
+for channel 'master1';
+ERROR HY000: This operation cannot be performed as you have a running slave 'master1'; run STOP SLAVE 'master1' first
+change master to
+master_port=MYPORT_2,
+master_host='127.0.0.1',
+master_user='root';
+ERROR HY000: This operation cannot be performed as you have a running slave 'master1'; run STOP SLAVE 'master1' first
+change master to
+master_port=MYPORT_1,
+master_host='127.0.0.1',
+master_user='root' for channel 'master2';
+ERROR HY000: Connection 'master2' conflicts with existing connection 'master1'
+set default_master_connection = '';
+change master to
+master_port=MYPORT_2,
+master_host='127.0.0.1',
+master_user='root';
+start slave;
+include/wait_for_slave_to_start.inc
+#
+# Checking SHOW ALL SLAVES STATUS
+#
+Connection_name = ''
+Connection_name = 'master1'
+Master_Port = 'MYPORT_2'
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin.000002'
+Relay_Log_File = 'mysqld-relay-bin-master1.000002'
+Slave_IO_Running = 'Yes'
+Slave_IO_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Last_Errno = '0'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+Last_SQL_Errno = '0'
+Slave_heartbeat_period = '60.000'
+Slave_heartbeat_period = '60.000'
+#
+connection master1;
+insert into t1 (f1) values ('three');
+connect master2,127.0.0.1,root,,,$SERVER_MYPORT_2;
+drop database if exists db2;
+create database db2;
+use db2;
+create table t1 (pk int auto_increment primary key, f1 int) engine=InnoDB;
+begin;
+insert into t1 (f1) values (1),(2);
+connection slave;
+connection master2;
+connection slave;
+select * from db1.t1;
+i f1
+1 one
+2 two
+3 three
+select * from db2.t1;
+pk f1
+connection master2;
+commit;
+connection slave;
+select * from db2.t1;
+pk f1
+1 1
+2 2
+connection master1;
+flush logs;
+connection slave;
+connection master1;
+purge binary logs to 'master-bin.000002';
+show binary logs;
+Log_name File_size
+master-bin.000002 filesize
+insert into t1 (f1) values ('four');
+create table db1.t3 (f1 int) engine=InnoDB;
+connection slave;
+#
+# Checking SHOW ALL SLAVES STATUS
+#
+Connection_name = ''
+Connection_name = 'master1'
+Master_Port = 'MYPORT_2'
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin.000002'
+Relay_Log_File = 'mysqld-relay-bin-master1.000004'
+Slave_IO_Running = 'Yes'
+Slave_IO_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Last_Errno = '0'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+Last_SQL_Errno = '0'
+Slave_heartbeat_period = '60.000'
+Slave_heartbeat_period = '60.000'
+#
+#
+# MDEV:16437: merge 5.7 P_S replication instrumentation and tables
+#
+SELECT * FROM performance_schema.replication_applier_status_by_coordinator;
+CHANNEL_NAME master1
+THREAD_ID #
+SERVICE_STATE ON
+LAST_ERROR_NUMBER 0
+LAST_ERROR_MESSAGE
+LAST_ERROR_TIMESTAMP 0000-00-00 00:00:00
+LAST_SEEN_TRANSACTION 0-1-7
+LAST_TRANS_RETRY_COUNT 0
+CHANNEL_NAME
+THREAD_ID #
+SERVICE_STATE ON
+LAST_ERROR_NUMBER 0
+LAST_ERROR_MESSAGE
+LAST_ERROR_TIMESTAMP 0000-00-00 00:00:00
+LAST_SEEN_TRANSACTION 0-2-4
+LAST_TRANS_RETRY_COUNT 0
+select * from db1.t1;
+i f1
+1 one
+2 two
+3 three
+4 four
+include/show_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+mysqld-relay-bin.000001 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
+mysqld-relay-bin.000001 # Rotate # # mysqld-relay-bin.000002;pos=4
+include/show_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+mysqld-relay-bin.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
+mysqld-relay-bin.000002 # Rotate # # master-bin.000001;pos=POS
+mysqld-relay-bin.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
+mysqld-relay-bin.000002 # Gtid_list # # []
+mysqld-relay-bin.000002 # Binlog_checkpoint # # master-bin.000001
+mysqld-relay-bin.000002 # Gtid # # GTID #-#-#
+mysqld-relay-bin.000002 # Query # # drop database if exists db2
+mysqld-relay-bin.000002 # Gtid # # GTID #-#-#
+mysqld-relay-bin.000002 # Query # # create database db2
+mysqld-relay-bin.000002 # Gtid # # GTID #-#-#
+mysqld-relay-bin.000002 # Query # # use `db2`; create table t1 (pk int auto_increment primary key, f1 int) engine=InnoDB
+mysqld-relay-bin.000002 # Gtid # # BEGIN GTID #-#-#
+mysqld-relay-bin.000002 # Intvar # # INSERT_ID=1
+mysqld-relay-bin.000002 # Query # # use `db2`; insert into t1 (f1) values (1),(2)
+mysqld-relay-bin.000002 # Xid # # COMMIT /* XID */
+disconnect slave;
+connect slave,127.0.0.1,root,,,$SERVER_MYPORT_3;
+stop slave io_thread;
+show status like 'Slave_running';
+Variable_name Value
+Slave_running OFF
+set default_master_connection = 'master1';
+show status like 'Slave_running';
+Variable_name Value
+Slave_running ON
+
+#
+# syntax compatible test
+#
+
+#
+# show relaylog events
+#
+SHOW RELAYLOG EVENTS for channel 'master1';
+Log_name Pos Event_type Server_id End_log_pos Info
+mysqld-relay-bin-master1.000003 4 Format_desc 3 256 Server ver: Version
+mysqld-relay-bin-master1.000003 256 Rotate 1 1358 master-bin.000002;pos=4
+mysqld-relay-bin-master1.000003 304 Rotate 3 366 mysqld-relay-bin-master1.000004;pos=4
+
+show slave status for channel 'master1'
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin-master1.000004'
+Slave_IO_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+
+#
+# stop slave
+#
+STOP SLAVE for channel 'master1';
+
+show slave status for channel 'master1'
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin-master1.000004'
+Slave_IO_Running = 'No'
+Slave_SQL_Running = 'No'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+
+#
+# start slave
+#
+START SLAVE for channel 'master1';
+include/wait_for_slave_to_start.inc
+connection master1;
+create table foo (a int);
+drop table foo;
+connection slave;
+
+show slave status for channel 'master1'
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin-master1.000005'
+Slave_IO_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+
+#
+# flush relay logs
+#
+FLUSH RELAY LOGS for channel 'master1';
+
+show slave status for channel 'master1'
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin-master1.000006'
+Slave_IO_Running = 'Yes'
+Slave_SQL_Running = 'Yes'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+
+#
+# stop slave
+#
+STOP SLAVE for channel 'master1';
+
+show slave status for channel 'master1'
+Master_Port = 'MYPORT_1'
+Relay_Log_File = 'mysqld-relay-bin-master1.000006'
+Slave_IO_Running = 'No'
+Slave_SQL_Running = 'No'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+
+#
+# reset slave
+#
+RESET SLAVE for channel 'master1';
+
+show slave status for channel 'master1'
+Master_Port = 'MYPORT_1'
+Relay_Log_File = ''
+Slave_IO_Running = 'No'
+Slave_SQL_Running = 'No'
+Last_Errno = '0'
+Last_SQL_Errno = '0'
+
+#
+# show relaylog events after reset slave
+#
+SHOW RELAYLOG EVENTS for channel 'master1';
+Log_name Pos Event_type Server_id End_log_pos Info
+
+#
+# check error syntax
+#
+RESET SLAVE 'master1' for channel 'mmaster2';
+ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)
+STOP SLAVE 'master1' for channel 'master2';
+ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)
+FLUSH RELAY LOGS 'master1' for channel 'master2';
+ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)
+START SLAVE 'master1' for channel 'master2';
+ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)
+SHOW RELAYLOG 'master1' EVENTS for channel 'master2';
+ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)
+SHOW SLAVE 'master1' STATUS for channel 'master2';
+ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)
+
+drop database db1;
+drop database db2;
+include/reset_master_slave.inc
+disconnect slave;
+connection master1;
+drop database db1;
+include/reset_master_slave.inc
+disconnect master1;
+connection master2;
+drop database db2;
+include/reset_master_slave.inc
+disconnect master2;
+connection default;
+CREATE TABLE channel (channel int);
+DROP TABLE channel;
diff --git a/mysql-test/suite/multi_source/multisource_for_channel.test b/mysql-test/suite/multi_source/multisource_for_channel.test
new file mode 100644
index 00000000000..a95b272d5b1
--- /dev/null
+++ b/mysql-test/suite/multi_source/multisource_for_channel.test
@@ -0,0 +1,438 @@
+#
+# This is the basic test of support mysql syntax "for channel" used for
+# multi-source replication
+#
+# Test basic replication functionality in multi-source setup
+#
+
+--source include/not_embedded.inc
+--source include/have_innodb.inc
+--source include/have_perfschema.inc
+--source include/binlog_start_pos.inc
+--let $rpl_server_count= 0
+
+RESET MASTER;
+
+--connect (slave,127.0.0.1,root,,,$SERVER_MYPORT_3)
+
+# MDEV-3984: crash/read of freed memory when changing master with named connection
+# This fails after adding the new master 'abc1', check we do not free twice.
+--error ER_RELAY_LOG_INIT
+change master to relay_log_file='' for channel 'abc1';
+# This fails before adding the new master, check that we do free it.
+--error ER_WRONG_ARGUMENTS
+change master to master_host='' for channel 'abc2';
+
+# Start replication from the first master
+
+--replace_result $SERVER_MYPORT_1 MYPORT_1
+eval change master to
+master_port=$SERVER_MYPORT_1,
+master_host='127.0.0.1',
+master_user='root'
+for channel 'master1';
+
+start slave for channel 'master1';
+set default_master_connection = 'master1';
+--source include/wait_for_slave_to_start.inc
+
+--connect (master1,127.0.0.1,root,,,$SERVER_MYPORT_1)
+--save_master_pos
+
+--connection slave
+--sync_with_master 0,'master1'
+
+# Here and further: add an extra check on SQL thread status
+# as the normal sync is not always enough
+--source include/wait_for_sql_thread_read_all.inc
+
+# each of the 3 commands should produce
+# 'master1' status
+
+let $wait_for_all= 1;
+let $show_statement= SHOW ALL SLAVES STATUS;
+let $field= Slave_IO_State;
+let $condition= = 'Waiting for master to send event';
+--source include/wait_show_condition.inc
+
+--echo #
+--echo # Checking SHOW SLAVE 'master1' STATUS
+--echo #
+--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno
+--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/
+--let $slave_name= 'master1'
+--let for_channel= 1
+--source include/show_slave_status.inc
+--let $slave_name=
+--let for_channel=
+
+--echo #
+--echo # Checking SHOW SLAVE STATUS
+--echo #
+--source include/show_slave_status.inc
+
+--echo #
+--echo # Checking SHOW ALL SLAVES STATUS
+--echo #
+--let $all_slaves_status= 1
+--let $status_items= Connection_name, Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno, Slave_heartbeat_period
+--source include/show_slave_status.inc
+--let $all_slaves_status=
+--echo #
+
+
+# Check that replication actually works
+
+--connection master1
+
+--disable_warnings
+drop database if exists db1;
+--enable_warnings
+create database db1;
+use db1;
+create table t1 (i int auto_increment, f1 varchar(16), primary key pk (i,f1)) engine=MyISAM;
+insert into t1 (f1) values ('one'),('two');
+--save_master_pos
+
+--connection slave
+--sync_with_master 0,'master1'
+
+--sorted_result
+select * from db1.t1;
+
+--let $datadir = `SELECT @@datadir`
+
+--echo # List of relay log files in the datadir
+--list_files $datadir mysqld-relay-bin-master1.*
+
+# Check that relay logs are recognizable
+
+let binlog_start=4;
+let binlog_file=;
+source include/show_relaylog_events.inc;
+let binlog_file= mysqld-relay-bin-master1.000002;
+source include/show_relaylog_events.inc;
+
+# Try to configure connection with the same name again,
+# should get an error because the slave is running
+
+--replace_result $SERVER_MYPORT_2 MYPORT_2
+--error ER_SLAVE_MUST_STOP
+eval change master to
+master_port=$SERVER_MYPORT_2,
+master_host='127.0.0.1',
+master_user='root'
+for channel 'master1';
+
+# Try to configure using the default connection name
+# (which is 'master1' at the moment),
+# again, should get an error
+
+--replace_result $SERVER_MYPORT_2 MYPORT_2
+--error ER_SLAVE_MUST_STOP
+eval change master to
+master_port=$SERVER_MYPORT_2,
+master_host='127.0.0.1',
+master_user='root';
+
+# Try to configure a connection with the same master
+# using a different name, should get a conflict
+
+--replace_result $SERVER_MYPORT_1 MYPORT_1
+--error ER_CONNECTION_ALREADY_EXISTS
+eval change master to
+master_port=$SERVER_MYPORT_1,
+master_host='127.0.0.1',
+master_user='root' for channel 'master2';
+
+
+# Set up a proper 'default' connection to master2
+
+set default_master_connection = '';
+
+--replace_result $SERVER_MYPORT_2 MYPORT_2
+eval change master to
+master_port=$SERVER_MYPORT_2,
+master_host='127.0.0.1',
+master_user='root';
+
+start slave;
+--source include/wait_for_slave_to_start.inc
+
+--source include/wait_for_sql_thread_read_all.inc
+
+# See both connections in the same status output
+
+let $wait_for_all= 1;
+let $show_statement= SHOW ALL SLAVES STATUS;
+let $field= Slave_IO_State;
+let $condition= = 'Waiting for master to send event';
+--source include/wait_show_condition.inc
+
+--echo #
+--echo # Checking SHOW ALL SLAVES STATUS
+--echo #
+--let $all_slaves_status= 1
+--let $status_items= Connection_name, Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno, Slave_heartbeat_period
+--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ /$SERVER_MYPORT_2/MYPORT_2/
+--source include/show_slave_status.inc
+--let $all_slaves_status=
+--echo #
+
+# Check that replication from two servers actually works
+
+--connection master1
+
+insert into t1 (f1) values ('three');
+--save_master_pos
+
+--connect (master2,127.0.0.1,root,,,$SERVER_MYPORT_2)
+
+--disable_warnings
+drop database if exists db2;
+--enable_warnings
+create database db2;
+use db2;
+create table t1 (pk int auto_increment primary key, f1 int) engine=InnoDB;
+begin;
+insert into t1 (f1) values (1),(2);
+
+--connection slave
+--sync_with_master 0,'master1'
+
+--connection master2
+--save_master_pos
+
+--connection slave
+--sync_with_master 0
+--sorted_result
+select * from db1.t1;
+select * from db2.t1;
+
+--connection master2
+commit;
+--save_master_pos
+
+--connection slave
+--sync_with_master 0
+--sorted_result
+select * from db2.t1;
+
+# Flush and purge logs on one master,
+# make sure slaves don't get confused
+
+--connection master1
+flush logs;
+--source include/wait_for_binlog_checkpoint.inc
+--save_master_pos
+--connection slave
+--sync_with_master 0, 'master1'
+
+--connection master1
+purge binary logs to 'master-bin.000002';
+# Additional events: 43 (Gtid_list) + 2 x 44 (Binlog_checkpoint) = 131
+let filesize=`select $binlog_start_pos+131`;
+--replace_result $filesize filesize
+show binary logs;
+insert into t1 (f1) values ('four');
+create table db1.t3 (f1 int) engine=InnoDB;
+--save_master_pos
+
+--connection slave
+--sync_with_master 0,'master1'
+
+--source include/wait_for_sql_thread_read_all.inc
+
+let $wait_for_all= 1;
+let $show_statement= SHOW ALL SLAVES STATUS;
+let $field= Slave_IO_State;
+let $condition= = 'Waiting for master to send event';
+--source include/wait_show_condition.inc
+
+--echo #
+--echo # Checking SHOW ALL SLAVES STATUS
+--echo #
+--let $all_slaves_status= 1
+--let $status_items= Connection_name, Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno, Slave_heartbeat_period
+--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ /$SERVER_MYPORT_2/MYPORT_2/
+--source include/show_slave_status.inc
+--let $all_slaves_status=
+--echo #
+
+--echo #
+--echo # MDEV:16437: merge 5.7 P_S replication instrumentation and tables
+--echo #
+--replace_column 2 #
+query_vertical SELECT * FROM performance_schema.replication_applier_status_by_coordinator;
+
+--sorted_result
+select * from db1.t1;
+
+# This should show relay log events for the default master
+# (the one with the empty name)
+let binlog_file=;
+source include/show_relaylog_events.inc;
+let binlog_file= mysqld-relay-bin.000002;
+source include/show_relaylog_events.inc;
+
+# Make sure we don't lose control over replication connections
+# after reconnecting to the slave
+
+--disconnect slave
+--connect (slave,127.0.0.1,root,,,$SERVER_MYPORT_3)
+
+stop slave io_thread;
+show status like 'Slave_running';
+set default_master_connection = 'master1';
+show status like 'Slave_running';
+
+--echo
+--echo #
+--echo # syntax compatible test
+--echo #
+--echo
+--echo #
+--echo # show relaylog events
+--echo #
+--replace_regex /Server ver:.*/Server ver: Version/
+SHOW RELAYLOG EVENTS for channel 'master1';
+
+--echo
+--echo show slave status for channel 'master1'
+--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno
+--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/
+--let $slave_name= 'master1'
+--let $for_channel= 1
+--source include/show_slave_status.inc
+
+--echo
+--echo #
+--echo # stop slave
+--echo #
+STOP SLAVE for channel 'master1';
+
+--echo
+--echo show slave status for channel 'master1'
+--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno
+--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/
+--let $slave_name= 'master1'
+--let $for_channel= 1
+--source include/show_slave_status.inc
+
+--echo
+--echo #
+--echo # start slave
+--echo #
+START SLAVE for channel 'master1';
+--source include/wait_for_slave_to_start.inc
+
+# Force some data into the relay log to ensure that we get a new relay log
+--connection master1
+create table foo (a int);
+drop table foo;
+--save_master_pos
+--connection slave
+--sync_with_master 0,'master1'
+--source include/wait_for_sql_thread_read_all.inc
+
+--echo
+--echo show slave status for channel 'master1'
+--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno
+--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ /Preparing/Yes/
+--let $slave_name= 'master1'
+--let $for_channel= 1
+--source include/show_slave_status.inc
+
+--echo
+--echo #
+--echo # flush relay logs
+--echo #
+FLUSH RELAY LOGS for channel 'master1';
+--source include/wait_for_sql_thread_read_all.inc
+
+--echo
+--echo show slave status for channel 'master1'
+--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno
+--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/
+--let $slave_name= 'master1'
+--let $for_channel= 1
+--source include/show_slave_status.inc
+
+--echo
+--echo #
+--echo # stop slave
+--echo #
+STOP SLAVE for channel 'master1';
+
+--echo
+--echo show slave status for channel 'master1'
+--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno
+--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/
+--let $slave_name= 'master1'
+--let $for_channel= 1
+--source include/show_slave_status.inc
+
+--echo
+--echo #
+--echo # reset slave
+--echo #
+RESET SLAVE for channel 'master1';
+
+--echo
+--echo show slave status for channel 'master1'
+--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno
+--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/
+--let $slave_name= 'master1'
+--let $for_channel= 1
+--source include/show_slave_status.inc
+
+--echo
+--echo #
+--echo # show relaylog events after reset slave
+--echo #
+SHOW RELAYLOG EVENTS for channel 'master1';
+
+--let $slave_name=
+--let for_channel=
+
+--echo
+--echo #
+--echo # check error syntax
+--echo #
+--error ER_WRONG_ARGUMENTS
+RESET SLAVE 'master1' for channel 'mmaster2';
+--error ER_WRONG_ARGUMENTS
+STOP SLAVE 'master1' for channel 'master2';
+--error ER_WRONG_ARGUMENTS
+FLUSH RELAY LOGS 'master1' for channel 'master2';
+--error ER_WRONG_ARGUMENTS
+START SLAVE 'master1' for channel 'master2';
+--error ER_WRONG_ARGUMENTS
+SHOW RELAYLOG 'master1' EVENTS for channel 'master2';
+--error ER_WRONG_ARGUMENTS
+SHOW SLAVE 'master1' STATUS for channel 'master2';
+
+--echo
+# Cleanup
+drop database db1;
+drop database db2;
+
+--source include/reset_master_slave.inc
+--disconnect slave
+
+--connection master1
+drop database db1;
+--source include/reset_master_slave.inc
+--disconnect master1
+
+--connection master2
+drop database db2;
+--source include/reset_master_slave.inc
+--disconnect master2
+
+#
+# Check channel as a keyword
+#
+--connection default
+CREATE TABLE channel (channel int);
+DROP TABLE channel;
diff --git a/mysql-test/suite/parts/inc/engines.combinations b/mysql-test/suite/parts/inc/engines.combinations
new file mode 100644
index 00000000000..17e01265006
--- /dev/null
+++ b/mysql-test/suite/parts/inc/engines.combinations
@@ -0,0 +1,8 @@
+[innodb]
+default-storage-engine=innodb
+
+[myisam]
+default-storage-engine=myisam
+
+[aria]
+default-storage-engine=aria
diff --git a/mysql-test/suite/parts/inc/engines.inc b/mysql-test/suite/parts/inc/engines.inc
new file mode 100644
index 00000000000..b8995ef08ec
--- /dev/null
+++ b/mysql-test/suite/parts/inc/engines.inc
@@ -0,0 +1,4 @@
+--source include/have_innodb.inc
+
+let $engine= `select @@default_storage_engine`;
+
diff --git a/mysql-test/suite/parts/inc/partition.pre b/mysql-test/suite/parts/inc/partition.pre
index fba909687a0..3c9bbe9a6a6 100644
--- a/mysql-test/suite/parts/inc/partition.pre
+++ b/mysql-test/suite/parts/inc/partition.pre
@@ -51,7 +51,7 @@ let $ER_PARSE_ERROR= 1064;
let $ER_TOO_MANY_PARTITIONS_ERROR= 1499;
let $ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF= 1503;
let $ER_NO_PARTS_ERROR= 1504;
-let $ER_DROP_PARTITION_NON_EXISTENT= 1507;
+let $ER_PARTITION_DOES_NOT_EXIST= 1507;
let $ER_SAME_NAME_PARTITION= 1517;
let $ER_NO_PARTITION_FOR_GIVEN_VALUE= 1526;
diff --git a/mysql-test/suite/parts/inc/partition_alter_1.inc b/mysql-test/suite/parts/inc/partition_alter_1.inc
index b62efd24072..a348407ac60 100644
--- a/mysql-test/suite/parts/inc/partition_alter_1.inc
+++ b/mysql-test/suite/parts/inc/partition_alter_1.inc
@@ -40,7 +40,7 @@ eval $insert_first_half;
# 0
# 1030: ER_GET_ERRNO
# 1502: ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF
-# 1506: ER_DROP_PARTITION_NON_EXISTENT
+# 1506: ER_PARTITION_DOES_NOT_EXIST
--disable_abort_on_error
eval $alter;
--enable_abort_on_error
@@ -52,10 +52,10 @@ eval SET @my_errno = $mysql_errno;
let $run_test= `SELECT @my_errno = 0`;
if (`SELECT @my_errno NOT IN (0,$ER_GET_ERRNO,
$ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF,
- $ER_DROP_PARTITION_NON_EXISTENT)`);
+ $ER_PARTITION_DOES_NOT_EXIST)`);
{
--echo # The last command got an unexepected error response.
- --echo # Expected/handled SQL codes are 0,$ER_GET_ERRNO,$ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF,$ER_DROP_PARTITION_NON_EXISTENT
+ --echo # Expected/handled SQL codes are 0,$ER_GET_ERRNO,$ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF,$ER_PARTITION_DOES_NOT_EXIST
SELECT '# SQL code we got was: ' AS "", @my_errno AS "";
--echo # Sorry, have to abort.
--echo # Please check the error name to number mapping in inc/partition.pre.
diff --git a/mysql-test/suite/parts/inc/partition_fail.inc b/mysql-test/suite/parts/inc/partition_fail.inc
index dd79cdf1dc8..bbe5924e358 100644
--- a/mysql-test/suite/parts/inc/partition_fail.inc
+++ b/mysql-test/suite/parts/inc/partition_fail.inc
@@ -2,8 +2,10 @@
--eval $create_statement
--eval $insert_statement
---echo # State before failure
+--let $dbug_flag= `select @@session.debug_dbug`
+--echo # $dbug_flag: BEFORE failure
--replace_result #p# #P# #sp# #SP#
+--let $DATADIR= `select @@datadir`
--list_files $DATADIR/test
SHOW CREATE TABLE t1;
--sorted_result
@@ -11,7 +13,7 @@ SELECT * FROM t1;
--disable_abort_on_error
--eval $fail_statement
--enable_abort_on_error
---echo # State after failure
+--echo # $dbug_flag: AFTER failure
--replace_result #p# #P# #sp# #SP#
--list_files $DATADIR/test
SHOW CREATE TABLE t1;
@@ -19,10 +21,9 @@ SHOW CREATE TABLE t1;
SELECT * FROM t1;
DROP TABLE t1;
---echo # Same test under LOCK TABLE
--eval $create_statement
--eval $insert_statement
---echo # State before failure
+--echo # $dbug_flag: BEFORE failure (under LOCK TABLE)
--replace_result #p# #P# #sp# #SP#
--list_files $DATADIR/test
SHOW CREATE TABLE t1;
@@ -32,7 +33,7 @@ LOCK TABLE t1 WRITE;
--disable_abort_on_error
--eval $fail_statement
--enable_abort_on_error
---echo # State after failure
+--echo # $dbug_flag: AFTER failure (under LOCK TABLE)
--replace_result #p# #P# #sp# #SP#
--list_files $DATADIR/test
SHOW CREATE TABLE t1;
diff --git a/mysql-test/suite/parts/inc/partition_fail_t2.inc b/mysql-test/suite/parts/inc/partition_fail_t2.inc
index 492e6d5a71b..301fb005255 100644
--- a/mysql-test/suite/parts/inc/partition_fail_t2.inc
+++ b/mysql-test/suite/parts/inc/partition_fail_t2.inc
@@ -2,30 +2,40 @@
# To be used with WL#4445: EXCHANGE PARTITION WITH TABLE.
--eval $create_statement2
--eval $insert_statement2
-SHOW CREATE TABLE t2;
---sorted_result
-SELECT * FROM t2;
--eval $create_statement
--eval $insert_statement
---echo # State before failure
+--let $dbug_flag= `select @@session.debug_dbug`
+--echo # $dbug_flag: BEFORE failure
--replace_result #p# #P#
+if (!$DATADIR)
+{
+ --let $DATADIR= `SELECT @@datadir;`
+}
--list_files $DATADIR/test
SHOW CREATE TABLE t1;
--sorted_result
SELECT * FROM t1;
+SHOW CREATE TABLE t2;
+--sorted_result
+SELECT * FROM t2;
# accept all errors
--disable_abort_on_error
--replace_regex /#sql-exchange-[0-9a-f_\-]*/#sql-exchange/i
--eval $fail_statement
--enable_abort_on_error
---echo # State after failure
+--echo # $dbug_flag: AFTER failure
--replace_result #p# #P#
--list_files $DATADIR/test
SHOW CREATE TABLE t1;
--sorted_result
SELECT * FROM t1;
DROP TABLE t1;
+--error 0, ER_NO_SUCH_TABLE
SHOW CREATE TABLE t2;
--sorted_result
+--error 0, ER_NO_SUCH_TABLE
SELECT * FROM t2;
+# TODO: everything fails with ER_NO_SUCH_TABLE
+# but DROP TABLE fails with ER_BAD_TABLE_ERROR! Why?
+--error 0, ER_BAD_TABLE_ERROR
DROP TABLE t2;
diff --git a/mysql-test/suite/parts/r/alter_table,list.rdiff b/mysql-test/suite/parts/r/alter_table,list.rdiff
new file mode 100644
index 00000000000..391216bc47c
--- /dev/null
+++ b/mysql-test/suite/parts/r/alter_table,list.rdiff
@@ -0,0 +1,85 @@
+@@ -142,13 +142,13 @@
+ partition pn values less than maxvalue);
+ ERROR HY000: Partitioned tables do not support CREATE TEMPORARY TABLE
+ create or replace table t1 (x int)
+-partition by range(x) (
+-partition p1 values less than (10),
+-partition p2 values less than (20),
+-partition p3 values less than (30),
+-partition p4 values less than (40),
+-partition p5 values less than (50),
+-partition pn values less than maxvalue);
++partition by list(x) (
++partition p1 values in (2, 3, 4),
++partition p2 values in (12, 13, 14),
++partition p3 values in (22, 23, 24),
++partition p4 values in (32, 33, 34),
++partition p5 values in (42, 43, 44),
++partition pn values in (52, 53, 54));
+ insert into t1 values (2), (12), (22), (32), (42), (52);
+ create or replace table tp2 (y int);
+ insert tp2 values (88);
+@@ -188,12 +188,12 @@
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+ ) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+- PARTITION BY RANGE (`x`)
+-(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+- PARTITION `p3` VALUES LESS THAN (30) ENGINE = X,
+- PARTITION `p4` VALUES LESS THAN (40) ENGINE = X,
+- PARTITION `p5` VALUES LESS THAN (50) ENGINE = X,
+- PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
++ PARTITION BY LIST (`x`)
++(PARTITION `p1` VALUES IN (2,3,4) ENGINE = X,
++ PARTITION `p3` VALUES IN (22,23,24) ENGINE = X,
++ PARTITION `p4` VALUES IN (32,33,34) ENGINE = X,
++ PARTITION `p5` VALUES IN (42,43,44) ENGINE = X,
++ PARTITION `pn` VALUES IN (52,53,54) ENGINE = X)
+ select * from t1 order by x;
+ x
+ 2
+@@ -218,11 +218,11 @@
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+ ) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+- PARTITION BY RANGE (`x`)
+-(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+- PARTITION `p4` VALUES LESS THAN (40) ENGINE = X,
+- PARTITION `p5` VALUES LESS THAN (50) ENGINE = X,
+- PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
++ PARTITION BY LIST (`x`)
++(PARTITION `p1` VALUES IN (2,3,4) ENGINE = X,
++ PARTITION `p4` VALUES IN (32,33,34) ENGINE = X,
++ PARTITION `p5` VALUES IN (42,43,44) ENGINE = X,
++ PARTITION `pn` VALUES IN (52,53,54) ENGINE = X)
+ select * from t1 order by x;
+ x
+ 2
+@@ -248,10 +248,10 @@
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+ ) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+- PARTITION BY RANGE (`x`)
+-(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+- PARTITION `p5` VALUES LESS THAN (50) ENGINE = X,
+- PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
++ PARTITION BY LIST (`x`)
++(PARTITION `p1` VALUES IN (2,3,4) ENGINE = X,
++ PARTITION `p5` VALUES IN (42,43,44) ENGINE = X,
++ PARTITION `pn` VALUES IN (52,53,54) ENGINE = X)
+ select * from t1 order by x;
+ x
+ 2
+@@ -273,9 +273,9 @@
+ t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+ ) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+- PARTITION BY RANGE (`x`)
+-(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+- PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
++ PARTITION BY LIST (`x`)
++(PARTITION `p1` VALUES IN (2,3,4) ENGINE = X,
++ PARTITION `pn` VALUES IN (52,53,54) ENGINE = X)
+ select * from t1 order by x;
+ x
+ 2
diff --git a/mysql-test/suite/parts/r/alter_table.result b/mysql-test/suite/parts/r/alter_table.result
index 0901584c6f8..b887cea36f0 100644
--- a/mysql-test/suite/parts/r/alter_table.result
+++ b/mysql-test/suite/parts/r/alter_table.result
@@ -28,3 +28,319 @@ ALTER TABLE v1 EXCHANGE PARTITION p2 WITH TABLE t2 ;
ERROR 42000: Can't open table
DROP VIEW v1;
DROP TABLE t1, t2;
+#
+# MDEV-22165 CONVERT PARTITION: move in partition from existing table
+#
+create or replace table tp1 (a int);
+create or replace table t1 (a int)
+partition by hash (a) partitions 2;
+alter table t1 convert table tp1 to partition p2;
+ERROR HY000: CONVERT TABLE TO PARTITION can only be used on RANGE/LIST partitions
+create or replace table t1 (a int)
+partition by range (a)
+(partition p0 values less than (0));
+alter table t1 convert table non_existent to partition p1 values less than (10);
+ERROR 42S02: Table 'test.non_existent' doesn't exist
+alter table t1 convert table tp1 to partition p1 values less than (10);
+show create table tp1;
+ERROR 42S02: Table 'test.tp1' doesn't exist
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`a`)
+(PARTITION `p0` VALUES LESS THAN (0) ENGINE = X,
+ PARTITION `p1` VALUES LESS THAN (10) ENGINE = X)
+create table tp2 (x int);
+alter table t1 convert table tp2 to partition p2 values less than (20);
+ERROR HY000: Tables have different definitions
+show create table tp2;
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`a`)
+(PARTITION `p0` VALUES LESS THAN (0) ENGINE = X,
+ PARTITION `p1` VALUES LESS THAN (10) ENGINE = X)
+create or replace table tp2 (a int);
+insert tp2 values (1), (15), (17);
+alter table t1 convert table tp2 to partition p2 values less than (20);
+ERROR HY000: Found a row that does not match the partition
+delete from tp2;
+insert tp2 values (15), (1), (17);
+alter table t1 convert table tp2 to partition p2 values less than (20);
+ERROR HY000: Found a row that does not match the partition
+delete from tp2;
+insert tp2 values (15), (17), (1);
+alter table t1 convert table tp2 to partition p2 values less than (20);
+ERROR HY000: Found a row that does not match the partition
+delete from tp2;
+insert tp2 values (15), (17);
+alter table t1 convert table tp2 to partition p2 values less than (20);
+show create table tp2;
+ERROR 42S02: Table 'test.tp2' doesn't exist
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`a`)
+(PARTITION `p0` VALUES LESS THAN (0) ENGINE = X,
+ PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = X)
+select * from t1 partition (p2);
+a
+15
+17
+create or replace table t1 (a int)
+partition by range (a) (
+p0 values less than (0),
+pn values less than (30));
+insert into t1 values (1);
+create or replace table tp1 (a int);
+insert into tp1 values (2);
+alter table t1 convert table tp1 to partition p1 values less than (10);
+ERROR HY000: VALUES LESS THAN value must be strictly increasing for each partition
+drop tables t1, tp1;
+#
+# MDEV-22166 CONVERT PARTITION: move out partition into a table
+#
+create or replace table t1 (x int);
+alter table t1 convert partition p1 to table tp1;
+ERROR HY000: Partition management on a not partitioned table is not possible
+create or replace table t1 (x int)
+partition by hash(x) partitions 2;
+alter table t1 convert partition p1 to table tp1;
+ERROR HY000: CONVERT PARTITION can only be used on RANGE/LIST partitions
+create or replace table t1 (x int)
+partition by key(x) partitions 2;
+alter table t1 convert partition p1 to table tp1;
+ERROR HY000: CONVERT PARTITION can only be used on RANGE/LIST partitions
+create or replace table t1 (x int)
+partition by range(x)
+subpartition by hash(x) subpartitions 3 (
+partition p1 values less than (10),
+partition pn values less than maxvalue);
+alter table t1 convert partition p1 to table p1;
+ERROR HY000: Convert partition is not supported for subpartitioned table.
+alter table t1 convert partition p1sp0 to table p1;
+ERROR HY000: Wrong partition name or partition list
+create or replace table t1 (x int)
+partition by range(x) (
+partition p1 values less than (10));
+alter table t1 convert partition p1 to table tp1;
+ERROR HY000: Cannot remove all partitions, use DROP TABLE instead
+create or replace temporary table t1 (x int)
+partition by range(x) (
+partition p0 values less than (10),
+partition pn values less than maxvalue);
+ERROR HY000: Partitioned tables do not support CREATE TEMPORARY TABLE
+create or replace table t1 (x int)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+create or replace table tp2 (y int);
+insert tp2 values (88);
+alter table t1 convert partition p2 to table tp2, drop partition p3;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' drop partition p3' at line 1
+alter table t1 convert partition p00 to table tp00;
+ERROR HY000: Wrong partition name or partition list
+alter table t1 convert partition p00 to table tp2;
+ERROR 42S01: Table 'tp2' already exists
+alter table t1 convert partition p2 to table tp2;
+ERROR 42S01: Table 'tp2' already exists
+create trigger tr1 before update on t1 for each row
+begin
+alter table t1 convert partition p2 to table tp2;
+end$
+ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger
+create function f1() returns int
+begin
+alter table t1 convert partition p2 to table tp2;
+end$
+ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger
+select * from tp2;
+y
+88
+drop table tp2;
+alter table t1 convert partition p2 to table tp2;
+show create table tp2;
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+select * from tp2;
+x
+12
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = X,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = X,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = X,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
+select * from t1 order by x;
+x
+2
+22
+32
+42
+52
+alter table t1 convert partition p3 to table inexistent.tp3;
+ERROR 42000: Unknown database 'inexistent'
+create database EXISTENT;
+alter table t1 convert partition p3 to table EXISTENT.TP3;
+show create table EXISTENT.TP3;
+Table Create Table
+TP3 CREATE TABLE `TP3`-ok (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+select * from EXISTENT.TP3 order by x;
+x
+22
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = X,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = X,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
+select * from t1 order by x;
+x
+2
+32
+42
+52
+# LOCK TABLES
+lock tables t1 write;
+alter table t1 convert partition p4 to table tp4;
+show create table tp4;
+ERROR HY000: Table 'tp4' was not locked with LOCK TABLES
+unlock tables;
+show create table tp4;
+Table Create Table
+tp4 CREATE TABLE `tp4` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+select * from tp4;
+x
+32
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = X,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
+select * from t1 order by x;
+x
+2
+42
+52
+# PS
+prepare stmt from 'alter table t1 convert partition p5 to table tp5';
+execute stmt;
+show create table tp5;
+Table Create Table
+tp5 CREATE TABLE `tp5` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+select * from tp5;
+x
+42
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
+select * from t1 order by x;
+x
+2
+52
+drop table tp5;
+execute stmt;
+ERROR HY000: Wrong partition name or partition list
+execute stmt;
+ERROR HY000: Wrong partition name or partition list
+drop prepare stmt;
+# Privileges
+create user alan;
+grant usage on *.* to alan;
+grant create, insert, drop on test.* to alan;
+connect alan,localhost,alan,,test;
+show grants for current_user;
+Grants for alan@%
+GRANT USAGE ON *.* TO `alan`@`%`
+GRANT INSERT, CREATE, DROP ON `test`.* TO `alan`@`%`
+alter table t1 convert partition p1 to table tp1;
+ERROR 42000: ALTER command denied to user 'alan'@'localhost' for table `test`.`t1`
+connection default;
+revoke all on test.* from alan;
+grant create, insert, alter on test.* to alan;
+connection alan;
+use test;
+show grants for current_user;
+Grants for alan@%
+GRANT USAGE ON *.* TO `alan`@`%`
+GRANT INSERT, CREATE, ALTER ON `test`.* TO `alan`@`%`
+alter table t1 convert partition p1 to table tp1;
+ERROR 42000: DROP command denied to user 'alan'@'localhost' for table `test`.`t1`
+connection default;
+revoke all on test.* from alan;
+grant create, drop, alter on test.* to alan;
+connection alan;
+use test;
+show grants for current_user;
+Grants for alan@%
+GRANT USAGE ON *.* TO `alan`@`%`
+GRANT CREATE, DROP, ALTER ON `test`.* TO `alan`@`%`
+alter table t1 convert partition p1 to table tp1;
+ERROR 42000: INSERT command denied to user 'alan'@'localhost' for table `test`.`tp1`
+connection default;
+revoke all on test.* from alan;
+grant insert, drop, alter on test.* to alan;
+connection alan;
+use test;
+show grants for current_user;
+Grants for alan@%
+GRANT USAGE ON *.* TO `alan`@`%`
+GRANT INSERT, DROP, ALTER ON `test`.* TO `alan`@`%`
+alter table t1 convert partition p1 to table tp1;
+ERROR 42000: CREATE command denied to user 'alan'@'localhost' for table `test`.`tp1`
+connection default;
+grant create, insert, drop, alter on test.* to alan;
+connection alan;
+use test;
+show grants for current_user;
+Grants for alan@%
+GRANT USAGE ON *.* TO `alan`@`%`
+GRANT INSERT, CREATE, DROP, ALTER ON `test`.* TO `alan`@`%`
+alter table t1 convert partition p1 to table tp1;
+disconnect alan;
+connection default;
+drop database EXISTENT;
+drop user alan;
+drop tables t1, tp1, tp2, tp4;
diff --git a/mysql-test/suite/parts/r/debug_innodb_fail.result b/mysql-test/suite/parts/r/debug_innodb_fail.result
index 3d7b19a7f32..b57925eb073 100644
--- a/mysql-test/suite/parts/r/debug_innodb_fail.result
+++ b/mysql-test/suite/parts/r/debug_innodb_fail.result
@@ -19,7 +19,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_1: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -47,7 +47,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_1: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -73,14 +73,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_1: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -109,7 +108,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_1: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -144,7 +143,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_2: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -172,7 +171,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_2: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -198,14 +197,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_2: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -234,7 +232,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_2: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -269,7 +267,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_3: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -297,7 +295,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_3: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -323,14 +321,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_3: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -359,7 +356,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_3: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -394,7 +391,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_4: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -422,7 +419,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_4: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -448,14 +445,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_4: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -484,7 +480,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_4: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -519,7 +515,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_5: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -547,7 +543,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_5: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -573,14 +569,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_5: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -609,7 +604,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_5: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -644,7 +639,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_6: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -672,7 +667,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_6: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -698,14 +693,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_6: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -734,7 +728,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_6: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -769,7 +763,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_7: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -797,7 +791,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_7: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -823,14 +817,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_7: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -859,7 +852,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_7: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -894,7 +887,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_8: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -922,7 +915,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_8: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -950,14 +943,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_8: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -986,7 +978,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_8: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1023,7 +1015,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_9: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1051,7 +1043,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_9: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1079,14 +1071,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_9: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1115,7 +1106,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_9: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1152,7 +1143,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_10: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1180,7 +1171,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_10: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1208,14 +1199,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_10: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1244,7 +1234,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_10: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1283,7 +1273,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_1: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1310,7 +1300,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_1: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1336,14 +1326,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_1: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1371,7 +1360,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_1: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1406,7 +1395,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_2: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1433,7 +1422,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_2: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1459,14 +1448,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_2: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1494,7 +1482,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_2: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1529,7 +1517,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_3: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1556,7 +1544,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_3: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1582,14 +1570,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_3: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1617,7 +1604,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_3: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1652,7 +1639,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_4: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1679,7 +1666,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_4: AFTER failure
db.opt
t1#P#p0.ibd
t1.frm
@@ -1699,14 +1686,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_4: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1734,7 +1720,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_4: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1.frm
@@ -1763,7 +1749,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_5: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1790,7 +1776,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_5: AFTER failure
db.opt
t1#P#p0.ibd
t1.frm
@@ -1810,14 +1796,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_5: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1845,7 +1830,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_5: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1.frm
@@ -1874,7 +1859,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_6: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1901,7 +1886,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_6: AFTER failure
db.opt
t1#P#p0.ibd
t1.frm
@@ -1921,14 +1906,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_6: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -1956,7 +1940,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_6: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1.frm
@@ -1985,7 +1969,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_7: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2012,7 +1996,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_7: AFTER failure
db.opt
t1#P#p0.ibd
t1.frm
@@ -2032,14 +2016,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_7: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2067,7 +2050,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_7: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1.frm
@@ -2096,7 +2079,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_8: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2123,7 +2106,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_8: AFTER failure
db.opt
t1#P#p0.ibd
t1.frm
@@ -2143,14 +2126,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_8: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2178,7 +2160,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_8: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1.frm
@@ -2207,7 +2189,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_9: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2234,7 +2216,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_9: AFTER failure
db.opt
t1#P#p0.ibd
t1.frm
@@ -2254,14 +2236,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_9: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2289,7 +2270,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_9: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1.frm
@@ -2321,7 +2302,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_1: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2350,7 +2331,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_1: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2376,14 +2357,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_1: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2413,7 +2393,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_1: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2448,7 +2428,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_2: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2477,7 +2457,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_2: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2503,14 +2483,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_2: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2540,7 +2519,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_2: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2575,7 +2554,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_3: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2604,7 +2583,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_3: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2630,14 +2609,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_3: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2667,7 +2645,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_3: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2702,7 +2680,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_4: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2731,7 +2709,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_4: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2757,14 +2735,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_4: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2794,7 +2771,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_4: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2829,7 +2806,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_5: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2858,7 +2835,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_5: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2884,14 +2861,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_5: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2921,7 +2897,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_5: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2956,7 +2932,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_6: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -2985,7 +2961,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_6: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3011,14 +2987,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_6: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3048,7 +3023,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_6: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3083,7 +3058,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_7: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3112,7 +3087,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_7: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3140,14 +3115,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_7: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3177,7 +3151,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_7: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3214,7 +3188,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_8: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3243,7 +3217,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_8: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3271,14 +3245,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_8: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3308,7 +3281,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_8: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3345,7 +3318,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_9: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3374,7 +3347,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_9: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3402,14 +3375,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_9: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3439,7 +3411,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_9: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3476,7 +3448,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_10: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3505,7 +3477,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_10: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3533,14 +3505,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_10: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3570,7 +3541,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_10: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3607,7 +3578,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_11: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3636,7 +3607,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_11: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3664,14 +3635,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_11: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3701,7 +3671,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_11: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3738,7 +3708,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_12: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3767,7 +3737,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_12: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3795,14 +3765,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'InnoDB'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_12: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
@@ -3832,7 +3801,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_12: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.ibd
t1#P#p10.ibd
diff --git a/mysql-test/suite/parts/r/debug_myisam_fail.result b/mysql-test/suite/parts/r/debug_myisam_fail.result
index 117f6ffbdac..708ce222826 100644
--- a/mysql-test/suite/parts/r/debug_myisam_fail.result
+++ b/mysql-test/suite/parts/r/debug_myisam_fail.result
@@ -16,7 +16,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_1: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -46,7 +46,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_1: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -74,14 +74,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_1: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -112,7 +111,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_1: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -149,7 +148,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_2: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -179,7 +178,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_2: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -207,14 +206,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_2: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -245,7 +243,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_2: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -282,7 +280,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_3: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -312,7 +310,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_3: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -340,14 +338,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_3: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -378,7 +375,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_3: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -415,7 +412,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_4: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -445,7 +442,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_4: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -473,14 +470,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_4: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -511,7 +507,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_4: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -548,7 +544,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_5: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -578,7 +574,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_5: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -606,14 +602,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_5: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -644,7 +639,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_5: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -681,7 +676,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_6: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -711,7 +706,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_6: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -739,14 +734,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_6: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -777,7 +771,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_6: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -814,7 +808,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_7: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -844,7 +838,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_7: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -872,14 +866,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_7: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -910,7 +903,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_7: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -947,7 +940,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_8: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -977,7 +970,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_8: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1008,14 +1001,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_8: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1046,7 +1038,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_8: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1086,7 +1078,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_9: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1116,7 +1108,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_9: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1147,14 +1139,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_9: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1185,7 +1176,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_9: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1225,7 +1216,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_10: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1255,7 +1246,7 @@ a b
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_10: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1286,14 +1277,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_add_partition_10: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1324,7 +1314,7 @@ LOCK TABLE t1 WRITE;
ALTER TABLE t1 ADD PARTITION
(PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_add_partition_10: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1366,7 +1356,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_1: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1395,7 +1385,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_1: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1423,14 +1413,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_1: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1460,7 +1449,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_1: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1497,7 +1486,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_2: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1526,7 +1515,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_2: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1554,14 +1543,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_2: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1591,7 +1579,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_2: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1628,7 +1616,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_3: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1657,7 +1645,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_3: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1685,14 +1673,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_3: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1722,7 +1709,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_3: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1759,7 +1746,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_4: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1788,7 +1775,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_4: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1809,14 +1796,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_4: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1846,7 +1832,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_4: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1876,7 +1862,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_5: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1905,7 +1891,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_5: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1926,14 +1912,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_5: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1963,7 +1948,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_5: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1993,7 +1978,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_6: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2022,7 +2007,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_6: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2043,14 +2028,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_6: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2080,7 +2064,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_6: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2110,7 +2094,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_7: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2139,7 +2123,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_7: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2160,14 +2144,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_7: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2197,7 +2180,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_7: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2227,7 +2210,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_8: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2256,7 +2239,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_8: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2277,14 +2260,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_8: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2314,7 +2296,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_8: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2344,7 +2326,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_9: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2373,7 +2355,7 @@ a b
4 Original from partition p0
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_9: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2394,14 +2376,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_drop_partition_9: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2431,7 +2412,7 @@ a b
LOCK TABLE t1 WRITE;
ALTER TABLE t1 DROP PARTITION p10;
ERROR HY000: Unknown error
-# State after failure
+# d,fail_drop_partition_9: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2464,7 +2445,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_1: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2495,7 +2476,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_1: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2523,14 +2504,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_1: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2562,7 +2542,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_1: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2599,7 +2579,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_2: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2630,7 +2610,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_2: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2658,14 +2638,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_2: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2697,7 +2676,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_2: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2734,7 +2713,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_3: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2765,7 +2744,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_3: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2793,14 +2772,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_3: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2832,7 +2810,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_3: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2869,7 +2847,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_4: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2900,7 +2878,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_4: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2928,14 +2906,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_4: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -2967,7 +2944,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_4: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3004,7 +2981,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_5: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3035,7 +3012,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_5: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3063,14 +3040,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_5: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3102,7 +3078,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_5: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3139,7 +3115,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_6: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3170,7 +3146,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_6: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3198,14 +3174,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_6: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3237,7 +3212,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_6: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3274,7 +3249,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_7: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3305,7 +3280,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_7: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3336,14 +3311,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_7: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3375,7 +3349,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_7: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3415,7 +3389,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_8: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3446,7 +3420,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_8: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3477,14 +3451,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_8: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3516,7 +3489,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_8: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3556,7 +3529,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_9: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3587,7 +3560,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_9: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3618,14 +3591,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_9: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3657,7 +3629,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_9: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3697,7 +3669,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_10: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3728,7 +3700,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_10: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3759,14 +3731,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_10: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3798,7 +3769,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_10: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3838,7 +3809,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_11: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3869,7 +3840,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_11: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3900,14 +3871,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_11: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3939,7 +3909,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_11: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -3979,7 +3949,7 @@ PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_12: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -4010,7 +3980,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_12: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -4041,14 +4011,13 @@ a b
3 Original from partition p0
4 Original from partition p0
DROP TABLE t1;
-# Same test under LOCK TABLE
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = 'MyISAM'
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (0,1,2,3,4,5,6,7,8,9),
PARTITION p10 VALUES IN (11,12,13,14,15,16,17,18,19));
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1");
-# State before failure
+# d,fail_change_partition_12: BEFORE failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -4080,7 +4049,7 @@ ALTER TABLE t1 REORGANIZE PARTITION p10 INTO
(PARTITION p10 VALUES IN (10,11,12,13,14,15,16,17,18,19),
PARTITION p20 VALUES IN (20,21,22,23,24,25,26,27,28,29));
ERROR HY000: Unknown error
-# State after failure
+# d,fail_change_partition_12: AFTER failure (under LOCK TABLE)
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
diff --git a/mysql-test/suite/parts/r/engine_defined_part_attributes.result b/mysql-test/suite/parts/r/engine_defined_part_attributes.result
new file mode 100644
index 00000000000..fe7a89fdf52
--- /dev/null
+++ b/mysql-test/suite/parts/r/engine_defined_part_attributes.result
@@ -0,0 +1,288 @@
+#
+# MDEV-5271 Support engine-defined attributes per partition
+#
+# partitioned tables
+CREATE TABLE `t1` (
+`id` INT
+) ENGINE=InnoDB ENCRYPTED="YES" PARTITION BY RANGE(id) (
+PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="NO" ENCRYPTION_KEY_ID=1,
+PARTITION pt2 VALUES LESS THAN MAXVALUE ENCRYPTED="DEFAULT" ENCRYPTION_KEY_ID=1
+);
+SHOW CREATE TABLE `t1`;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `ENCRYPTED`='YES'
+ PARTITION BY RANGE (`id`)
+(PARTITION `pt1` VALUES LESS THAN (100) ENGINE = InnoDB ENCRYPTED = 'NO' ENCRYPTION_KEY_ID = 1,
+ PARTITION `pt2` VALUES LESS THAN MAXVALUE ENGINE = InnoDB ENCRYPTED = 'DEFAULT' ENCRYPTION_KEY_ID = 1)
+INSERT INTO t1 VALUES (1), (2), (3);
+DELETE FROM t1 WHERE id = 1;
+UPDATE t1 SET id = 4 WHERE id = 3;
+SELECT * FROM t1 WHERE id IN (2, 3);
+id
+2
+DROP TABLE `t1`;
+CREATE TABLE `t2` (
+`id` INT
+) ENGINE=InnoDB ENCRYPTED="YES" ENCRYPTION_KEY_ID=2 PARTITION BY RANGE(id) (
+PARTITION pt1 VALUES LESS THAN (100),
+PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+ERROR HY000: Can't create table `test`.`t2` (errno: 140 "Wrong create options")
+CREATE TABLE `t3` (
+`id` INT
+) ENGINE=InnoDB ENCRYPTED="NO" PARTITION BY RANGE(id) (
+PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="YES" ENCRYPTION_KEY_ID=2,
+PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+ERROR HY000: Can't create table `test`.`t3` (errno: 140 "Wrong create options")
+CREATE TABLE `t4` (
+`id` INT
+) ENGINE=InnoDB ENCRYPTED="NO";
+SHOW CREATE TABLE `t4`;
+Table Create Table
+t4 CREATE TABLE `t4` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `ENCRYPTED`='NO'
+ALTER TABLE `t4` PARTITION BY RANGE(id) (
+PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="NO",
+PARTITION pt2 VALUES LESS THAN MAXVALUE ENCRYPTED="DEFAULT"
+);
+SHOW CREATE TABLE `t4`;
+Table Create Table
+t4 CREATE TABLE `t4` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `ENCRYPTED`='NO'
+ PARTITION BY RANGE (`id`)
+(PARTITION `pt1` VALUES LESS THAN (100) ENGINE = InnoDB ENCRYPTED = 'NO',
+ PARTITION `pt2` VALUES LESS THAN MAXVALUE ENGINE = InnoDB ENCRYPTED = 'DEFAULT')
+ALTER TABLE `t4` PARTITION BY RANGE(id) (
+PARTITION pt1 VALUES LESS THAN (100),
+PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+SHOW CREATE TABLE `t4`;
+Table Create Table
+t4 CREATE TABLE `t4` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `ENCRYPTED`='NO'
+ PARTITION BY RANGE (`id`)
+(PARTITION `pt1` VALUES LESS THAN (100) ENGINE = InnoDB,
+ PARTITION `pt2` VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
+ALTER TABLE `t4` PARTITION BY RANGE(id) (
+PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="YES" ENCRYPTION_KEY_ID=2,
+PARTITION pt2 VALUES LESS THAN MAXVALUE ENCRYPTED="DEFAULT"
+);
+ERROR HY000: Can't create table `test`.`t4` (errno: 140 "Wrong create options")
+DROP TABLE `t4`;
+# subpartitioned tables
+CREATE TABLE `t5` (
+`id` INT
+) ENGINE=InnoDB ENCRYPTED="NO" PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id)
+SUBPARTITIONS 2 (
+PARTITION pt1 VALUES LESS THAN (100),
+PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+SHOW CREATE TABLE `t5`;
+Table Create Table
+t5 CREATE TABLE `t5` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `ENCRYPTED`='NO'
+ PARTITION BY RANGE (`id`)
+SUBPARTITION BY HASH (`id`)
+SUBPARTITIONS 2
+(PARTITION `pt1` VALUES LESS THAN (100) ENGINE = InnoDB,
+ PARTITION `pt2` VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
+DROP TABLE `t5`;
+CREATE TABLE `t6` (
+`id` INT
+) ENGINE=InnoDB PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id)
+SUBPARTITIONS 2 (
+PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="YES",
+PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+ERROR HY000: Can't create table `test`.`t6` (errno: 140 "Wrong create options")
+CREATE TABLE `t7` (
+id INT
+) ENGINE=InnoDB PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+PARTITION pt1 VALUES LESS THAN (100)(
+SUBPARTITION spt1 ENCRYPTED="NO",
+SUBPARTITION spt2
+),
+PARTITION pt2 VALUES LESS THAN MAXVALUE (
+SUBPARTITION spt3,
+SUBPARTITION spt4
+)
+);
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ENCRYPTED="NO",
+SUBPARTITION spt2
+),
+PARTITION pt2 VALUES LESS THAN MAXVALUE ...' at line 6
+CREATE TABLE `t8` (
+id INT
+) ENGINE=InnoDB ENCRYPTED="NO" PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+PARTITION pt1 VALUES LESS THAN (100) (
+SUBPARTITION spt1,
+SUBPARTITION spt2
+),
+PARTITION pt2 VALUES LESS THAN MAXVALUE (
+SUBPARTITION spt3,
+SUBPARTITION spt4
+)
+);
+SHOW CREATE TABLE `t8`;
+Table Create Table
+t8 CREATE TABLE `t8` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `ENCRYPTED`='NO'
+ PARTITION BY RANGE (`id`)
+SUBPARTITION BY HASH (`id`)
+(PARTITION `pt1` VALUES LESS THAN (100)
+ (SUBPARTITION `spt1` ENGINE = InnoDB,
+ SUBPARTITION `spt2` ENGINE = InnoDB),
+ PARTITION `pt2` VALUES LESS THAN MAXVALUE
+ (SUBPARTITION `spt3` ENGINE = InnoDB,
+ SUBPARTITION `spt4` ENGINE = InnoDB))
+DROP TABLE `t8`;
+CREATE TABLE `t9` (
+id INT
+) ENGINE=InnoDB PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="NO" (
+SUBPARTITION spt1,
+SUBPARTITION spt2
+),
+PARTITION pt2 VALUES LESS THAN MAXVALUE (
+SUBPARTITION spt3,
+SUBPARTITION spt4
+)
+);
+SHOW CREATE TABLE `t9`;
+Table Create Table
+t9 CREATE TABLE `t9` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`id`)
+SUBPARTITION BY HASH (`id`)
+(PARTITION `pt1` VALUES LESS THAN (100)
+ (SUBPARTITION `spt1` ENGINE = InnoDB,
+ SUBPARTITION `spt2` ENGINE = InnoDB),
+ PARTITION `pt2` VALUES LESS THAN MAXVALUE
+ (SUBPARTITION `spt3` ENGINE = InnoDB,
+ SUBPARTITION `spt4` ENGINE = InnoDB))
+DROP TABLE `t9`;
+CREATE TABLE `t10` (
+id INT
+) ENGINE=InnoDB PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="YES" (
+SUBPARTITION spt1,
+SUBPARTITION spt2
+),
+PARTITION pt2 VALUES LESS THAN MAXVALUE (
+SUBPARTITION spt3,
+SUBPARTITION spt4
+)
+);
+ERROR HY000: Can't create table `test`.`t10` (errno: 140 "Wrong create options")
+CREATE TABLE `t11` (
+id INT
+) ENGINE=InnoDB ENCRYPTED="YES" PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="NO" (
+SUBPARTITION spt1,
+SUBPARTITION spt2
+),
+PARTITION pt2 VALUES LESS THAN MAXVALUE ENCRYPTED="NO" (
+SUBPARTITION spt3,
+SUBPARTITION spt4
+)
+);
+SHOW CREATE TABLE `t11`;
+Table Create Table
+t11 CREATE TABLE `t11` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `ENCRYPTED`='YES'
+ PARTITION BY RANGE (`id`)
+SUBPARTITION BY HASH (`id`)
+(PARTITION `pt1` VALUES LESS THAN (100)
+ (SUBPARTITION `spt1` ENGINE = InnoDB,
+ SUBPARTITION `spt2` ENGINE = InnoDB),
+ PARTITION `pt2` VALUES LESS THAN MAXVALUE
+ (SUBPARTITION `spt3` ENGINE = InnoDB,
+ SUBPARTITION `spt4` ENGINE = InnoDB))
+DROP TABLE `t11`;
+#
+# MDEV-27605 ALTER .. ADD PARTITION uses wrong partition-level option values
+#
+# restart: --innodb-sys-tablespaces
+CREATE TABLE `t12` (
+id INT
+) ENGINE=InnoDB PARTITION BY HASH(id)
+(
+pt1 PAGE_COMPRESSED=0
+);
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t12%';
+name flag
+test/t12#P#pt1 21
+ALTER TABLE `t12` ADD PARTITION (
+PARTITION pt2 PAGE_COMPRESSED=1
+);
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t12%';
+name flag
+test/t12#P#pt1 21
+test/t12#P#pt2 1610612789
+ALTER TABLE `t12` ADD PARTITION (
+PARTITION pt3 PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=3
+);
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t12%';
+name flag
+test/t12#P#pt1 21
+test/t12#P#pt2 1610612789
+test/t12#P#pt3 805306421
+DROP TABLE `t12`;
+CREATE TABLE `t13` (
+`id` INT
+) ENGINE=InnoDB PAGE_COMPRESSED=1 PARTITION BY RANGE(id) (
+PARTITION pt1 VALUES LESS THAN (100) PAGE_COMPRESSED=0,
+PARTITION pt2 VALUES LESS THAN (200) PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=3,
+PARTITION pt3 VALUES LESS THAN MAXVALUE
+);
+SHOW CREATE TABLE `t13`;
+Table Create Table
+t13 CREATE TABLE `t13` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `PAGE_COMPRESSED`=1
+ PARTITION BY RANGE (`id`)
+(PARTITION `pt1` VALUES LESS THAN (100) ENGINE = InnoDB PAGE_COMPRESSED = 0,
+ PARTITION `pt2` VALUES LESS THAN (200) ENGINE = InnoDB PAGE_COMPRESSED = 1 PAGE_COMPRESSION_LEVEL = 3,
+ PARTITION `pt3` VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t13%';
+name flag
+test/t13#P#pt1 21
+test/t13#P#pt2 805306421
+test/t13#P#pt3 1610612789
+ALTER TABLE `t13` PARTITION BY RANGE(id) (
+PARTITION pt1 VALUES LESS THAN (100) PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=3,
+PARTITION pt2 VALUES LESS THAN (200),
+PARTITION pt3 VALUES LESS THAN MAXVALUE PAGE_COMPRESSED=0
+);
+SHOW CREATE TABLE `t13`;
+Table Create Table
+t13 CREATE TABLE `t13` (
+ `id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `PAGE_COMPRESSED`=1
+ PARTITION BY RANGE (`id`)
+(PARTITION `pt1` VALUES LESS THAN (100) ENGINE = InnoDB PAGE_COMPRESSED = 1 PAGE_COMPRESSION_LEVEL = 3,
+ PARTITION `pt2` VALUES LESS THAN (200) ENGINE = InnoDB,
+ PARTITION `pt3` VALUES LESS THAN MAXVALUE ENGINE = InnoDB PAGE_COMPRESSED = 0)
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t13%';
+name flag
+test/t13#P#pt1 805306421
+test/t13#P#pt2 1610612789
+test/t13#P#pt3 21
+DROP TABLE `t13`;
diff --git a/mysql-test/suite/parts/r/partition_alter4_innodb.result b/mysql-test/suite/parts/r/partition_alter4_innodb.result
index c9a80c6035b..aab121f2b23 100644
--- a/mysql-test/suite/parts/r/partition_alter4_innodb.result
+++ b/mysql-test/suite/parts/r/partition_alter4_innodb.result
@@ -7592,7 +7592,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -8052,7 +8052,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -8523,7 +8523,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -8995,7 +8995,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -9461,7 +9461,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -9933,7 +9933,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -10410,7 +10410,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -10885,7 +10885,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -11350,7 +11350,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -11810,7 +11810,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -12281,7 +12281,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -12753,7 +12753,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -13219,7 +13219,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -13691,7 +13691,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -14168,7 +14168,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -14643,7 +14643,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -26393,7 +26393,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -26853,7 +26853,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -27324,7 +27324,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -27796,7 +27796,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -28262,7 +28262,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -28734,7 +28734,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -29211,7 +29211,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -29686,7 +29686,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -30151,7 +30151,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -30611,7 +30611,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -31082,7 +31082,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -31554,7 +31554,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -32020,7 +32020,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -32492,7 +32492,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -32969,7 +32969,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -33444,7 +33444,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -45202,7 +45202,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -45662,7 +45662,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -46133,7 +46133,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -46605,7 +46605,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -47071,7 +47071,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -47543,7 +47543,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -48020,7 +48020,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -48495,7 +48495,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -48960,7 +48960,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -49420,7 +49420,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -49891,7 +49891,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -50363,7 +50363,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -50829,7 +50829,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -51301,7 +51301,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -51778,7 +51778,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -52253,7 +52253,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -63970,7 +63970,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -63985,7 +63985,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64008,7 +64008,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64029,7 +64029,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64048,7 +64048,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64071,7 +64071,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64094,7 +64094,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64113,7 +64113,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
# 4.4 ALTER ... REBUILD PARTITION part_1,part_1,part_1;
DROP TABLE IF EXISTS t1;
@@ -64130,7 +64130,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64145,7 +64145,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64168,7 +64168,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64189,7 +64189,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64208,7 +64208,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64231,7 +64231,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64254,7 +64254,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -64273,7 +64273,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
# 4.5 ALTER ... REBUILD PARTITION ALL;
DROP TABLE IF EXISTS t1;
@@ -75552,7 +75552,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -76012,7 +76012,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -76483,7 +76483,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -76955,7 +76955,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -77421,7 +77421,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -77893,7 +77893,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -78370,7 +78370,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -78845,7 +78845,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -79310,7 +79310,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -79770,7 +79770,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -80241,7 +80241,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -80713,7 +80713,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -81179,7 +81179,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -81651,7 +81651,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -82128,7 +82128,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -82603,7 +82603,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
diff --git a/mysql-test/suite/parts/r/partition_alter4_myisam.result b/mysql-test/suite/parts/r/partition_alter4_myisam.result
index 4e9e5c83248..c863d479fbb 100644
--- a/mysql-test/suite/parts/r/partition_alter4_myisam.result
+++ b/mysql-test/suite/parts/r/partition_alter4_myisam.result
@@ -7888,7 +7888,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -8357,7 +8357,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -8843,7 +8843,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -9336,7 +9336,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -9819,7 +9819,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -10312,7 +10312,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -10810,7 +10810,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -11306,7 +11306,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -11794,7 +11794,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -12263,7 +12263,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -12749,7 +12749,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -13242,7 +13242,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -13725,7 +13725,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -14218,7 +14218,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -14716,7 +14716,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -15212,7 +15212,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 analyze error Error in list of partitions to test.t1
+test.t1 analyze error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -27429,7 +27429,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -27898,7 +27898,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -28384,7 +28384,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -28877,7 +28877,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -29360,7 +29360,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -29853,7 +29853,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -30351,7 +30351,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -30847,7 +30847,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -31335,7 +31335,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -31804,7 +31804,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -32290,7 +32290,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -32783,7 +32783,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -33266,7 +33266,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -33759,7 +33759,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -34257,7 +34257,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -34753,7 +34753,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 CHECK PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 check error Error in list of partitions to test.t1
+test.t1 check error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -46962,7 +46962,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -47431,7 +47431,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -47917,7 +47917,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -48410,7 +48410,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -48893,7 +48893,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -49386,7 +49386,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -49884,7 +49884,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -50380,7 +50380,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -50868,7 +50868,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -51337,7 +51337,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -51823,7 +51823,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -52316,7 +52316,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -52799,7 +52799,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -53292,7 +53292,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -53790,7 +53790,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -54286,7 +54286,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 OPTIMIZE PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 optimize error Error in list of partitions to test.t1
+test.t1 optimize error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -66462,7 +66462,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66477,7 +66477,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66500,7 +66500,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66521,7 +66521,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66540,7 +66540,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66563,7 +66563,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66586,7 +66586,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66605,7 +66605,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_2,part_5,part_6,part_10;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
# 4.4 ALTER ... REBUILD PARTITION part_1,part_1,part_1;
DROP TABLE IF EXISTS t1;
@@ -66622,7 +66622,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66637,7 +66637,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66660,7 +66660,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66681,7 +66681,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66700,7 +66700,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66723,7 +66723,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66746,7 +66746,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
CREATE TABLE t1 (
f_int1 INTEGER DEFAULT 0,
@@ -66765,7 +66765,7 @@ INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REBUILD PARTITION part_1,part_1,part_1;
-ERROR HY000: Error in list of partitions to REBUILD
+ERROR HY000: Wrong partition name or partition list
DROP TABLE t1;
# 4.5 ALTER ... REBUILD PARTITION ALL;
DROP TABLE IF EXISTS t1;
@@ -78488,7 +78488,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -78957,7 +78957,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -79443,7 +79443,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -79936,7 +79936,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -80419,7 +80419,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -80912,7 +80912,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -81410,7 +81410,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -81906,7 +81906,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_2,part_5,part_6,part_10;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -82394,7 +82394,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -82863,7 +82863,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -83349,7 +83349,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -83842,7 +83842,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -84325,7 +84325,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -84818,7 +84818,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -85316,7 +85316,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
@@ -85812,7 +85812,7 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 REPAIR PARTITION part_1,part_1,part_1;
Table Op Msg_type Msg_text
-test.t1 repair error Error in list of partitions to test.t1
+test.t1 repair error Wrong partition name or partition list
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN @max_row_div2 AND @max_row;
diff --git a/mysql-test/suite/parts/r/partition_debug.result b/mysql-test/suite/parts/r/partition_debug.result
index b24ce29d028..5aae648dd1c 100644
--- a/mysql-test/suite/parts/r/partition_debug.result
+++ b/mysql-test/suite/parts/r/partition_debug.result
@@ -1025,23 +1025,11 @@ SET @save_dbug=@@debug_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_1";
CREATE TABLE t2 (a INT, b VARCHAR(64));
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64)) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_1: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1075,9 +1063,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_1: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1129,23 +1129,11 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_2";
CREATE TABLE t2 (a INT, b VARCHAR(64));
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64)) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_2: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1179,9 +1167,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_2: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1233,23 +1233,11 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_3";
CREATE TABLE t2 (a INT, b VARCHAR(64));
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64)) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_3: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1283,9 +1271,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error on rename of './test/t2' to './test/#sql-exchange' (errno: 0 "Internal error/check (Not system error)")
-# State after failure
+# d,exchange_partition_fail_3: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1337,23 +1337,11 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_4";
CREATE TABLE t2 (a INT, b VARCHAR(64));
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64)) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_4: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1387,9 +1375,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_4: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1441,23 +1441,11 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_5";
CREATE TABLE t2 (a INT, b VARCHAR(64));
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64)) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_5: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1491,9 +1479,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error on rename of './test/t1#P#p0' to './test/t2' (errno: 0 "Internal error/check (Not system error)")
-# State after failure
+# d,exchange_partition_fail_5: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1545,23 +1545,11 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_6";
CREATE TABLE t2 (a INT, b VARCHAR(64));
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64)) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_6: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1595,9 +1583,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_6: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1649,23 +1649,11 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_7";
CREATE TABLE t2 (a INT, b VARCHAR(64));
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64)) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_7: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1699,9 +1687,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error on rename of './test/#sql-exchange' to './test/t1#P#p0' (errno: 0 "Internal error/check (Not system error)")
-# State after failure
+# d,exchange_partition_fail_7: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1753,23 +1753,11 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_8";
CREATE TABLE t2 (a INT, b VARCHAR(64));
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64)) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_8: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1803,9 +1791,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_8: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1857,23 +1857,11 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_9";
CREATE TABLE t2 (a INT, b VARCHAR(64));
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64)) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_9: BEFORE failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1907,9 +1895,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_9: AFTER failure
db.opt
t1#P#p0.MYD
t1#P#p0.MYI
@@ -1958,3 +1958,3229 @@ a b
4 Original from partition p0
DROP TABLE t2;
SET SESSION debug_dbug=@save_dbug;
+#
+# MDEV-22165 CONVERT PARTITION: move in partition from existing table
+#
+set @save_dbug=@@debug_dbug;
+set session debug_dbug="+d,fail_convert_partition_1";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_1: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_1: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_2";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_2: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_2: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_3";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_3: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_3: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_4";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_4: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_4: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_5";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_5: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_5: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_6";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_6: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_6: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_7";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_7: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_7: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_8";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_8: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_8: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_9";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_9: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_9: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_11";
+create or replace table t2 (x int primary key);
+insert into t2 values (32), (42), (52);
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30));
+insert into t1 values (2), (12), (22);
+# d,fail_convert_partition_11: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1.frm
+t1.par
+t2.MYD
+t2.MYI
+t2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+x
+32
+42
+52
+alter table t1 convert table t2 to partition pn values less than maxvalue;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_11: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+SHOW CREATE TABLE t2;
+SELECT * FROM t2;
+DROP TABLE t2;
+set session debug_dbug=@save_dbug;
+#
+# MDEV-22166 CONVERT PARTITION: move out partition into a table
+#
+set @save_dbug=@@debug_dbug;
+set session debug_dbug="+d,fail_create_before_create_frm";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_create_before_create_frm: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_create_before_create_frm: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_create_before_create_frm: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_create_before_create_frm: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_alter_partition_after_write_frm";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_alter_partition_after_write_frm: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_alter_partition_after_write_frm: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_alter_partition_after_write_frm: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_alter_partition_after_write_frm: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,error_convert_partition_00";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,error_convert_partition_00: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Error on rename of './test/t1#P#p2' to './test/tp2' (errno: 137 "No more records (read after end of file)")
+# d,error_convert_partition_00: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,error_convert_partition_00: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Error on rename of './test/t1#P#p2' to './test/tp2' (errno: 137 "No more records (read after end of file)")
+# d,error_convert_partition_00: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_1";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_1: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_1: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_1: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_1: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_2";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_2: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_2: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_2: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_2: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_3";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_3: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_3: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_3: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_3: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_4";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_4: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_4: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_4: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_4: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_5";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_5: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_5: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_5: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_5: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_6";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_6: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_6: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_6: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_6: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_7";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_7: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_7: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_7: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_7: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_8";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_8: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_8: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_8: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_8: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_9";
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_9: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_9: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_9: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_9: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_11";
+# Already finished DDL logging, so tp2 now exists:
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_11: BEFORE failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Unknown error
+# d,fail_convert_partition_11: AFTER failure
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+2
+22
+32
+42
+52
+DROP TABLE t1;
+create or replace table t1 (x int primary key)
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+# d,fail_convert_partition_11: BEFORE failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+LOCK TABLE t1 WRITE;
+alter table t1 convert partition p2 to table tp2;
+ERROR 42S01: Table 'tp2' already exists
+# d,fail_convert_partition_11: AFTER failure (under LOCK TABLE)
+db.opt
+t1#P#p1.MYD
+t1#P#p1.MYI
+t1#P#p2.MYD
+t1#P#p2.MYI
+t1#P#p3.MYD
+t1#P#p3.MYI
+t1#P#p4.MYD
+t1#P#p4.MYI
+t1#P#p5.MYD
+t1#P#p5.MYI
+t1#P#pn.MYD
+t1#P#pn.MYI
+t1.frm
+t1.par
+tp2.MYD
+tp2.MYI
+tp2.frm
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = MyISAM,
+ PARTITION `p2` VALUES LESS THAN (20) ENGINE = MyISAM,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = MyISAM,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = MyISAM,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = MyISAM,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
+SELECT * FROM t1;
+x
+12
+2
+22
+32
+42
+52
+UNLOCK TABLES;
+DROP TABLE t1;
+set session debug_dbug=@save_dbug;
+show create table tp2;
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) NOT NULL,
+ PRIMARY KEY (`x`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+select * from tp2;
+x
+12
+drop table tp2;
diff --git a/mysql-test/suite/parts/r/partition_debug_innodb.result b/mysql-test/suite/parts/r/partition_debug_innodb.result
index d4ced5e6d6a..4d4538c168e 100644
--- a/mysql-test/suite/parts/r/partition_debug_innodb.result
+++ b/mysql-test/suite/parts/r/partition_debug_innodb.result
@@ -961,25 +961,13 @@ SET @save_dbug=@@debug_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_1";
CREATE TABLE t2 (a INT, b VARCHAR(64)) ENGINE = InnoDB;
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = InnoDB
PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_1: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1010,9 +998,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_1: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1061,25 +1061,13 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_2";
CREATE TABLE t2 (a INT, b VARCHAR(64)) ENGINE = InnoDB;
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = InnoDB
PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_2: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1110,9 +1098,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_2: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1161,25 +1161,13 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_3";
CREATE TABLE t2 (a INT, b VARCHAR(64)) ENGINE = InnoDB;
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = InnoDB
PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_3: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1210,9 +1198,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error on rename of './test/t2' to './test/#sql-exchange' (errno: 0 "Internal error/check (Not system error)")
-# State after failure
+# d,exchange_partition_fail_3: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1261,25 +1261,13 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_4";
CREATE TABLE t2 (a INT, b VARCHAR(64)) ENGINE = InnoDB;
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = InnoDB
PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_4: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1310,9 +1298,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_4: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1361,25 +1361,13 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_5";
CREATE TABLE t2 (a INT, b VARCHAR(64)) ENGINE = InnoDB;
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = InnoDB
PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_5: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1410,9 +1398,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error on rename of './test/t1#P#p0' to './test/t2' (errno: 0 "Internal error/check (Not system error)")
-# State after failure
+# d,exchange_partition_fail_5: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1461,25 +1461,13 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_6";
CREATE TABLE t2 (a INT, b VARCHAR(64)) ENGINE = InnoDB;
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = InnoDB
PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_6: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1510,9 +1498,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_6: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1561,25 +1561,13 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_7";
CREATE TABLE t2 (a INT, b VARCHAR(64)) ENGINE = InnoDB;
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = InnoDB
PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_7: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1610,9 +1598,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error on rename of './test/#sql-exchange' to './test/t1#P#p0' (errno: 0 "Internal error/check (Not system error)")
-# State after failure
+# d,exchange_partition_fail_7: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1661,25 +1661,13 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_8";
CREATE TABLE t2 (a INT, b VARCHAR(64)) ENGINE = InnoDB;
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = InnoDB
PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_8: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1710,9 +1698,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_8: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1761,25 +1761,13 @@ SET SESSION debug_dbug=@save_dbug;
SET SESSION debug_dbug="+d,exchange_partition_fail_9";
CREATE TABLE t2 (a INT, b VARCHAR(64)) ENGINE = InnoDB;
INSERT INTO t2 VALUES (5, "Original from table t2"), (6, "Original from table t2"), (7, "Original from table t2"), (8, "Original from table t2");
-SHOW CREATE TABLE t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` int(11) DEFAULT NULL,
- `b` varchar(64) DEFAULT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-SELECT * FROM t2;
-a b
-5 Original from table t2
-6 Original from table t2
-7 Original from table t2
-8 Original from table t2
CREATE TABLE t1 (a INT, b VARCHAR(64))
ENGINE = InnoDB
PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (1, "Original from partition p0"), (2, "Original from partition p0"), (3, "Original from partition p0"), (4, "Original from partition p0"), (11, "Original from partition p1"), (12, "Original from partition p1"), (13, "Original from partition p1"), (14, "Original from partition p1"), (21, "Original from partition p1"), (22, "Original from partition p1"), (23, "Original from partition p1"), (24, "Original from partition p1");
-# State before failure
+# d,exchange_partition_fail_9: BEFORE failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
@@ -1810,9 +1798,21 @@ a b
24 Original from partition p1
3 Original from partition p0
4 Original from partition p0
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `a` int(11) DEFAULT NULL,
+ `b` varchar(64) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+a b
+5 Original from table t2
+6 Original from table t2
+7 Original from table t2
+8 Original from table t2
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
ERROR HY000: Error in DDL log
-# State after failure
+# d,exchange_partition_fail_9: AFTER failure
db.opt
t1#P#p0.ibd
t1#P#p1.ibd
diff --git a/mysql-test/suite/parts/t/alter_table.combinations b/mysql-test/suite/parts/t/alter_table.combinations
new file mode 100644
index 00000000000..d4feae10f19
--- /dev/null
+++ b/mysql-test/suite/parts/t/alter_table.combinations
@@ -0,0 +1,2 @@
+[range]
+[list]
diff --git a/mysql-test/suite/parts/t/alter_table.test b/mysql-test/suite/parts/t/alter_table.test
index 53b61806acb..741a9450c8e 100644
--- a/mysql-test/suite/parts/t/alter_table.test
+++ b/mysql-test/suite/parts/t/alter_table.test
@@ -1,9 +1,8 @@
-#
-# General errors with ALTER TABLE and partitions that doesn't have to be run
-# on all engines
-#
-
+# Permissions don't work with embedded
+--source include/not_embedded.inc
--source include/have_partition.inc
+--source include/lcase_names.inc
+--source suite/parts/inc/engines.inc
#
# MDEV-22649 SIGSEGV in ha_partition::create_partitioning_metadata on ALTER
@@ -38,3 +37,267 @@ CREATE TABLE t2 (i INT);
ALTER TABLE v1 EXCHANGE PARTITION p2 WITH TABLE t2 ;
DROP VIEW v1;
DROP TABLE t1, t2;
+
+--echo #
+--echo # MDEV-22165 CONVERT PARTITION: move in partition from existing table
+--echo #
+create or replace table tp1 (a int);
+create or replace table t1 (a int)
+partition by hash (a) partitions 2;
+--error ER_ONLY_ON_RANGE_LIST_PARTITION
+alter table t1 convert table tp1 to partition p2;
+
+create or replace table t1 (a int)
+partition by range (a)
+(partition p0 values less than (0));
+
+--error ER_NO_SUCH_TABLE
+alter table t1 convert table non_existent to partition p1 values less than (10);
+alter table t1 convert table tp1 to partition p1 values less than (10);
+--error ER_NO_SUCH_TABLE
+show create table tp1;
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+
+create table tp2 (x int);
+--error ER_TABLES_DIFFERENT_METADATA
+alter table t1 convert table tp2 to partition p2 values less than (20);
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table tp2;
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+
+create or replace table tp2 (a int);
+insert tp2 values (1), (15), (17);
+--error ER_ROW_DOES_NOT_MATCH_PARTITION
+alter table t1 convert table tp2 to partition p2 values less than (20);
+delete from tp2;
+insert tp2 values (15), (1), (17);
+--error ER_ROW_DOES_NOT_MATCH_PARTITION
+alter table t1 convert table tp2 to partition p2 values less than (20);
+delete from tp2;
+insert tp2 values (15), (17), (1);
+--error ER_ROW_DOES_NOT_MATCH_PARTITION
+alter table t1 convert table tp2 to partition p2 values less than (20);
+delete from tp2;
+insert tp2 values (15), (17);
+alter table t1 convert table tp2 to partition p2 values less than (20);
+--error ER_NO_SUCH_TABLE
+show create table tp2;
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1 partition (p2);
+
+create or replace table t1 (a int)
+partition by range (a) (
+p0 values less than (0),
+pn values less than (30));
+insert into t1 values (1);
+create or replace table tp1 (a int);
+insert into tp1 values (2);
+# TODO: would be good to automatically detect order of partitions,
+# as well as move the data from succeeding partitions (ADD PARTITION FR).
+--error ER_RANGE_NOT_INCREASING_ERROR
+alter table t1 convert table tp1 to partition p1 values less than (10);
+
+drop tables t1, tp1;
+
+
+--echo #
+--echo # MDEV-22166 CONVERT PARTITION: move out partition into a table
+--echo #
+
+create or replace table t1 (x int);
+--error ER_PARTITION_MGMT_ON_NONPARTITIONED
+alter table t1 convert partition p1 to table tp1;
+
+create or replace table t1 (x int)
+partition by hash(x) partitions 2;
+--error ER_ONLY_ON_RANGE_LIST_PARTITION
+alter table t1 convert partition p1 to table tp1;
+
+create or replace table t1 (x int)
+partition by key(x) partitions 2;
+--error ER_ONLY_ON_RANGE_LIST_PARTITION
+alter table t1 convert partition p1 to table tp1;
+
+create or replace table t1 (x int)
+partition by range(x)
+subpartition by hash(x) subpartitions 3 (
+ partition p1 values less than (10),
+ partition pn values less than maxvalue);
+--error ER_PARTITION_CONVERT_SUBPARTITIONED
+alter table t1 convert partition p1 to table p1;
+--error ER_PARTITION_DOES_NOT_EXIST
+alter table t1 convert partition p1sp0 to table p1;
+
+create or replace table t1 (x int)
+partition by range(x) (
+ partition p1 values less than (10));
+--error ER_DROP_LAST_PARTITION
+alter table t1 convert partition p1 to table tp1;
+
+--error ER_FEATURE_NOT_SUPPORTED_WITH_PARTITIONING
+create or replace temporary table t1 (x int)
+partition by range(x) (
+ partition p0 values less than (10),
+ partition pn values less than maxvalue);
+
+if ($MTR_COMBINATION_RANGE)
+{
+ create or replace table t1 (x int)
+ partition by range(x) (
+ partition p1 values less than (10),
+ partition p2 values less than (20),
+ partition p3 values less than (30),
+ partition p4 values less than (40),
+ partition p5 values less than (50),
+ partition pn values less than maxvalue);
+}
+
+if ($MTR_COMBINATION_LIST)
+{
+ create or replace table t1 (x int)
+ partition by list(x) (
+ partition p1 values in (2, 3, 4),
+ partition p2 values in (12, 13, 14),
+ partition p3 values in (22, 23, 24),
+ partition p4 values in (32, 33, 34),
+ partition p5 values in (42, 43, 44),
+ partition pn values in (52, 53, 54));
+}
+
+insert into t1 values (2), (12), (22), (32), (42), (52);
+
+create or replace table tp2 (y int);
+insert tp2 values (88);
+# Multiple ALTER PARTITION statements are not possible
+--error ER_PARSE_ERROR
+alter table t1 convert partition p2 to table tp2, drop partition p3;
+# TODO: probably no need in such specific codes, should be ER_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
+alter table t1 convert partition p00 to table tp00;
+# Better error here is ER_PARTITION_DOES_NOT_EXIST,
+# but mysql_alter_table() works checks new table before anything else.
+# So, looks like no big reason to change anything here.
+--error ER_TABLE_EXISTS_ERROR
+alter table t1 convert partition p00 to table tp2;
+--error ER_TABLE_EXISTS_ERROR
+alter table t1 convert partition p2 to table tp2;
+--delimiter $
+--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
+create trigger tr1 before update on t1 for each row
+begin
+ alter table t1 convert partition p2 to table tp2;
+end$
+--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
+create function f1() returns int
+begin
+ alter table t1 convert partition p2 to table tp2;
+end$
+--delimiter ;
+select * from tp2;
+drop table tp2;
+alter table t1 convert partition p2 to table tp2;
+
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table tp2;
+select * from tp2;
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1 order by x;
+
+--error ER_BAD_DB_ERROR
+alter table t1 convert partition p3 to table inexistent.tp3;
+create database EXISTENT;
+alter table t1 convert partition p3 to table EXISTENT.TP3;
+
+# The only way to put `` into var...
+--let $tp3=`select '`TP3`'`
+if ($MTR_COMBINATION_LCASE1)
+{
+ --let $tp3= `select '`tp3`'`
+}
+--replace_result $engine X ' PAGE_CHECKSUM=1' '' $tp3 `TP3`-ok
+show create table EXISTENT.TP3;
+select * from EXISTENT.TP3 order by x;
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1 order by x;
+
+--echo # LOCK TABLES
+lock tables t1 write;
+alter table t1 convert partition p4 to table tp4;
+# TODO: lock table tp4 in ALTER TABLE, otherwise there is no
+# guarantee in data consistency between t1 and tp4
+--error ER_TABLE_NOT_LOCKED
+show create table tp4;
+
+unlock tables;
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table tp4;
+select * from tp4;
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1 order by x;
+
+--echo # PS
+prepare stmt from 'alter table t1 convert partition p5 to table tp5';
+execute stmt;
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table tp5;
+select * from tp5;
+--replace_result $engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1 order by x;
+drop table tp5;
+--error ER_PARTITION_DOES_NOT_EXIST
+execute stmt;
+--error ER_PARTITION_DOES_NOT_EXIST
+execute stmt;
+drop prepare stmt;
+
+--echo # Privileges
+create user alan;
+grant usage on *.* to alan;
+grant create, insert, drop on test.* to alan;
+--connect alan,localhost,alan,,test
+show grants for current_user;
+--error ER_TABLEACCESS_DENIED_ERROR
+alter table t1 convert partition p1 to table tp1;
+--connection default
+revoke all on test.* from alan;
+grant create, insert, alter on test.* to alan;
+--connection alan
+use test;
+show grants for current_user;
+--error ER_TABLEACCESS_DENIED_ERROR
+alter table t1 convert partition p1 to table tp1;
+--connection default
+revoke all on test.* from alan;
+grant create, drop, alter on test.* to alan;
+--connection alan
+use test;
+show grants for current_user;
+--error ER_TABLEACCESS_DENIED_ERROR
+alter table t1 convert partition p1 to table tp1;
+--connection default
+revoke all on test.* from alan;
+grant insert, drop, alter on test.* to alan;
+--connection alan
+use test;
+show grants for current_user;
+--error ER_TABLEACCESS_DENIED_ERROR
+alter table t1 convert partition p1 to table tp1;
+--connection default
+grant create, insert, drop, alter on test.* to alan;
+--connection alan
+use test;
+show grants for current_user;
+alter table t1 convert partition p1 to table tp1;
+--disconnect alan
+--connection default
+
+drop database EXISTENT;
+drop user alan;
+drop tables t1, tp1, tp2, tp4;
diff --git a/mysql-test/suite/parts/t/engine_defined_part_attributes.test b/mysql-test/suite/parts/t/engine_defined_part_attributes.test
new file mode 100644
index 00000000000..1245066300c
--- /dev/null
+++ b/mysql-test/suite/parts/t/engine_defined_part_attributes.test
@@ -0,0 +1,221 @@
+--echo #
+--echo # MDEV-5271 Support engine-defined attributes per partition
+--echo #
+
+--source include/have_partition.inc
+--source include/have_innodb.inc
+
+--echo # partitioned tables
+
+CREATE TABLE `t1` (
+ `id` INT
+) ENGINE=InnoDB ENCRYPTED="YES" PARTITION BY RANGE(id) (
+ PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="NO" ENCRYPTION_KEY_ID=1,
+ PARTITION pt2 VALUES LESS THAN MAXVALUE ENCRYPTED="DEFAULT" ENCRYPTION_KEY_ID=1
+);
+SHOW CREATE TABLE `t1`;
+
+INSERT INTO t1 VALUES (1), (2), (3);
+DELETE FROM t1 WHERE id = 1;
+UPDATE t1 SET id = 4 WHERE id = 3;
+SELECT * FROM t1 WHERE id IN (2, 3);
+
+DROP TABLE `t1`;
+
+--error ER_CANT_CREATE_TABLE
+CREATE TABLE `t2` (
+ `id` INT
+) ENGINE=InnoDB ENCRYPTED="YES" ENCRYPTION_KEY_ID=2 PARTITION BY RANGE(id) (
+ PARTITION pt1 VALUES LESS THAN (100),
+ PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+
+--error ER_CANT_CREATE_TABLE
+CREATE TABLE `t3` (
+ `id` INT
+) ENGINE=InnoDB ENCRYPTED="NO" PARTITION BY RANGE(id) (
+ PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="YES" ENCRYPTION_KEY_ID=2,
+ PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+
+CREATE TABLE `t4` (
+ `id` INT
+) ENGINE=InnoDB ENCRYPTED="NO";
+SHOW CREATE TABLE `t4`;
+
+ALTER TABLE `t4` PARTITION BY RANGE(id) (
+ PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="NO",
+ PARTITION pt2 VALUES LESS THAN MAXVALUE ENCRYPTED="DEFAULT"
+);
+SHOW CREATE TABLE `t4`;
+
+ALTER TABLE `t4` PARTITION BY RANGE(id) (
+ PARTITION pt1 VALUES LESS THAN (100),
+ PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+SHOW CREATE TABLE `t4`;
+
+--error ER_CANT_CREATE_TABLE
+ALTER TABLE `t4` PARTITION BY RANGE(id) (
+ PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="YES" ENCRYPTION_KEY_ID=2,
+ PARTITION pt2 VALUES LESS THAN MAXVALUE ENCRYPTED="DEFAULT"
+);
+
+DROP TABLE `t4`;
+
+--echo # subpartitioned tables
+
+CREATE TABLE `t5` (
+ `id` INT
+) ENGINE=InnoDB ENCRYPTED="NO" PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id)
+SUBPARTITIONS 2 (
+ PARTITION pt1 VALUES LESS THAN (100),
+ PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+SHOW CREATE TABLE `t5`;
+
+DROP TABLE `t5`;
+
+--error ER_CANT_CREATE_TABLE
+CREATE TABLE `t6` (
+ `id` INT
+) ENGINE=InnoDB PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id)
+SUBPARTITIONS 2 (
+ PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="YES",
+ PARTITION pt2 VALUES LESS THAN MAXVALUE
+);
+
+--error ER_PARSE_ERROR
+CREATE TABLE `t7` (
+ id INT
+) ENGINE=InnoDB PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+ PARTITION pt1 VALUES LESS THAN (100)(
+ SUBPARTITION spt1 ENCRYPTED="NO",
+ SUBPARTITION spt2
+ ),
+ PARTITION pt2 VALUES LESS THAN MAXVALUE (
+ SUBPARTITION spt3,
+ SUBPARTITION spt4
+ )
+);
+
+CREATE TABLE `t8` (
+ id INT
+) ENGINE=InnoDB ENCRYPTED="NO" PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+ PARTITION pt1 VALUES LESS THAN (100) (
+ SUBPARTITION spt1,
+ SUBPARTITION spt2
+ ),
+ PARTITION pt2 VALUES LESS THAN MAXVALUE (
+ SUBPARTITION spt3,
+ SUBPARTITION spt4
+ )
+);
+SHOW CREATE TABLE `t8`;
+
+DROP TABLE `t8`;
+
+CREATE TABLE `t9` (
+ id INT
+) ENGINE=InnoDB PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+ PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="NO" (
+ SUBPARTITION spt1,
+ SUBPARTITION spt2
+ ),
+ PARTITION pt2 VALUES LESS THAN MAXVALUE (
+ SUBPARTITION spt3,
+ SUBPARTITION spt4
+ )
+);
+SHOW CREATE TABLE `t9`;
+
+DROP TABLE `t9`;
+
+--error ER_CANT_CREATE_TABLE
+CREATE TABLE `t10` (
+ id INT
+) ENGINE=InnoDB PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+ PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="YES" (
+ SUBPARTITION spt1,
+ SUBPARTITION spt2
+ ),
+ PARTITION pt2 VALUES LESS THAN MAXVALUE (
+ SUBPARTITION spt3,
+ SUBPARTITION spt4
+ )
+);
+
+CREATE TABLE `t11` (
+ id INT
+) ENGINE=InnoDB ENCRYPTED="YES" PARTITION BY RANGE(id)
+SUBPARTITION BY HASH(id) (
+ PARTITION pt1 VALUES LESS THAN (100) ENCRYPTED="NO" (
+ SUBPARTITION spt1,
+ SUBPARTITION spt2
+ ),
+ PARTITION pt2 VALUES LESS THAN MAXVALUE ENCRYPTED="NO" (
+ SUBPARTITION spt3,
+ SUBPARTITION spt4
+ )
+);
+SHOW CREATE TABLE `t11`;
+
+DROP TABLE `t11`;
+
+--echo #
+--echo # MDEV-27605 ALTER .. ADD PARTITION uses wrong partition-level option values
+--echo #
+
+--let $restart_parameters= --innodb-sys-tablespaces
+--source include/restart_mysqld.inc
+
+CREATE TABLE `t12` (
+ id INT
+) ENGINE=InnoDB PARTITION BY HASH(id)
+(
+ pt1 PAGE_COMPRESSED=0
+);
+--sorted_result
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t12%';
+
+ALTER TABLE `t12` ADD PARTITION (
+ PARTITION pt2 PAGE_COMPRESSED=1
+);
+--sorted_result
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t12%';
+
+ALTER TABLE `t12` ADD PARTITION (
+ PARTITION pt3 PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=3
+);
+--sorted_result
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t12%';
+
+DROP TABLE `t12`;
+
+CREATE TABLE `t13` (
+ `id` INT
+) ENGINE=InnoDB PAGE_COMPRESSED=1 PARTITION BY RANGE(id) (
+ PARTITION pt1 VALUES LESS THAN (100) PAGE_COMPRESSED=0,
+ PARTITION pt2 VALUES LESS THAN (200) PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=3,
+ PARTITION pt3 VALUES LESS THAN MAXVALUE
+);
+SHOW CREATE TABLE `t13`;
+--sorted_result
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t13%';
+
+ALTER TABLE `t13` PARTITION BY RANGE(id) (
+ PARTITION pt1 VALUES LESS THAN (100) PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=3,
+ PARTITION pt2 VALUES LESS THAN (200),
+ PARTITION pt3 VALUES LESS THAN MAXVALUE PAGE_COMPRESSED=0
+);
+SHOW CREATE TABLE `t13`;
+--sorted_result
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t13%';
+
+DROP TABLE `t13`;
diff --git a/mysql-test/suite/parts/t/partition_debug.test b/mysql-test/suite/parts/t/partition_debug.test
index 6d7cf3ae8b3..2f8994705f3 100644
--- a/mysql-test/suite/parts/t/partition_debug.test
+++ b/mysql-test/suite/parts/t/partition_debug.test
@@ -50,3 +50,114 @@ let $crash_statement= ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
--source suite/parts/inc/partition_crash_exchange.inc
let $fail_statement= $crash_statement;
--source suite/parts/inc/partition_fail_exchange.inc
+
+--echo #
+--echo # MDEV-22165 CONVERT PARTITION: move in partition from existing table
+--echo #
+let $create_statement= create or replace table t1 (x int primary key)
+ partition by range(x) (
+ partition p1 values less than (10),
+ partition p2 values less than (20),
+ partition p3 values less than (30));
+
+let $create_statement2= create or replace table t2 (x int primary key);
+let $insert_statement= insert into t1 values (2), (12), (22);
+let $insert_statement2= insert into t2 values (32), (42), (52);
+
+let $fail_statement= alter table t1 convert table t2 to partition pn values less than maxvalue;
+
+set @save_dbug=@@debug_dbug;
+set session debug_dbug="+d,fail_convert_partition_1";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_2";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_3";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_4";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_5";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_6";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_7";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_8";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_9";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_11";
+--source suite/parts/inc/partition_fail_t2.inc
+set session debug_dbug=@save_dbug;
+
+
+--echo #
+--echo # MDEV-22166 CONVERT PARTITION: move out partition into a table
+--echo #
+let $create_statement= create or replace table t1 (x int primary key)
+ partition by range(x) (
+ partition p1 values less than (10),
+ partition p2 values less than (20),
+ partition p3 values less than (30),
+ partition p4 values less than (40),
+ partition p5 values less than (50),
+ partition pn values less than maxvalue);
+
+let $insert_statement= insert into t1 values (2), (12), (22), (32), (42), (52);
+let $fail_statement= alter table t1 convert partition p2 to table tp2;
+
+set @save_dbug=@@debug_dbug;
+set session debug_dbug="+d,fail_create_before_create_frm";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_alter_partition_after_write_frm";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,error_convert_partition_00";
+--source suite/parts/inc/partition_fail.inc
+#set session debug_dbug=@save_dbug;
+#set session debug_dbug="+d,fail_convert_partition_01";
+#--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_1";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_2";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_3";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_4";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_5";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_6";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_7";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_8";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_9";
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+set session debug_dbug="+d,fail_convert_partition_11";
+--echo # Already finished DDL logging, so tp2 now exists:
+--source suite/parts/inc/partition_fail.inc
+set session debug_dbug=@save_dbug;
+show create table tp2;
+select * from tp2;
+drop table tp2;
diff --git a/mysql-test/suite/perfschema/include/default_mysqld_autosize.cnf b/mysql-test/suite/perfschema/include/default_mysqld_autosize.cnf
index eee52ede869..6bcf7a09401 100644
--- a/mysql-test/suite/perfschema/include/default_mysqld_autosize.cnf
+++ b/mysql-test/suite/perfschema/include/default_mysqld_autosize.cnf
@@ -19,9 +19,8 @@ loose-innodb_buffer_pool_size= 8M
loose-innodb_lru_scan_depth= 100
loose-innodb_write_io_threads= 2
loose-innodb_read_io_threads= 2
-loose-innodb_log_buffer_size= 1M
-loose-innodb_log_file_size= 5M
-loose-innodb_log_files_in_group= 2
+loose-innodb_log_buffer_size= 2M
+loose-innodb_log_file_size= 10M
slave-net-timeout=120
diff --git a/mysql-test/suite/perfschema/r/digest_view.result b/mysql-test/suite/perfschema/r/digest_view.result
index d3988f99727..a5996cc0083 100644
--- a/mysql-test/suite/perfschema/r/digest_view.result
+++ b/mysql-test/suite/perfschema/r/digest_view.result
@@ -191,17 +191,17 @@ SELECT SCHEMA_NAME, DIGEST, DIGEST_TEXT, COUNT_STAR
FROM performance_schema.events_statements_summary_by_digest
ORDER BY DIGEST_TEXT;
SCHEMA_NAME DIGEST DIGEST_TEXT COUNT_STAR
-test 3bcc75e0f4658692e16837ead0c455ca EXPLAIN SELECT * FROM `test` . `v1` 1
-test cc55af8221ef0bc8873e75cc704489ba EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 1
-test bc0498551a492bd7c0ca92906bf86fb4 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 1
-test 76923336b6f4ffffd0d5854761ae1aec EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 1
-test a65d479062ffbfe374b4cd823016a260 EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 1
-test d44b1e50ebfd05accacef4167534ad65 SELECT * FROM `test` . `v1` 1
-test 0608cde507ef8fe35d1f68730e78f1e4 SELECT * FROM `test` . `v1` WHERE `a` = ? 1
-test 5e241fdb866faef138cc81b26203ddff SELECT * FROM `test` . `v1` WHERE `b` > ? 1
-test 74fa770ce44994b3fe7b534d504f2d6d SELECT `a` , `b` FROM `test` . `v1` 1
-test 45ca2a985d179d98395b238cf253bbe2 SELECT `b` , `a` FROM `test` . `v1` 1
-test 1cfa171590aa40ba23e14c92d6940ffc TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
+test 27a9ab161a63050c84a63c6f77ebeb33 EXPLAIN SELECT * FROM `test` . `v1` 1
+test ab0ab27c04f3a294feb86bede4331f86 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 1
+test 2e722346a5c2ef820946bcd04ccac208 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 1
+test 07baf2264db30b6b25302603436ebe82 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 1
+test 3a7dbc963635ab0de6e160e0a4212bce EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 1
+test 6b845c2e3a7421997e3b610d14b5c842 SELECT * FROM `test` . `v1` 1
+test cb2ee099edbf6e0e5ee6ae14f3b1498a SELECT * FROM `test` . `v1` WHERE `a` = ? 1
+test e2dc5a300d2ba54ebb987a2ca6b90d93 SELECT * FROM `test` . `v1` WHERE `b` > ? 1
+test c68e0f99323f7bb7732c7b5cf32c0ec2 SELECT `a` , `b` FROM `test` . `v1` 1
+test 43c5de955c9a72d2bb6f49db5c0ad3e7 SELECT `b` , `a` FROM `test` . `v1` 1
+test 1678258ba15f7ccc63fd7b833763914a TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
DROP TABLE test.v1;
CREATE VIEW test.v1 AS SELECT * FROM test.t1;
EXPLAIN SELECT * from test.v1;
@@ -248,19 +248,19 @@ SELECT SCHEMA_NAME, DIGEST, DIGEST_TEXT, COUNT_STAR
FROM performance_schema.events_statements_summary_by_digest
ORDER BY DIGEST_TEXT;
SCHEMA_NAME DIGEST DIGEST_TEXT COUNT_STAR
-test 630a0b16be33fcf549f4f467de557940 CREATE VIEW `test` . `v1` AS SELECT * FROM `test` . `t1` 1
-test efa438aa8b4ddbf4c19f9e4b345781b5 DROP TABLE `test` . `v1` 1
-test 3bcc75e0f4658692e16837ead0c455ca EXPLAIN SELECT * FROM `test` . `v1` 2
-test cc55af8221ef0bc8873e75cc704489ba EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 2
-test bc0498551a492bd7c0ca92906bf86fb4 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 2
-test 76923336b6f4ffffd0d5854761ae1aec EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 2
-test a65d479062ffbfe374b4cd823016a260 EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 2
-test d44b1e50ebfd05accacef4167534ad65 SELECT * FROM `test` . `v1` 2
-test 0608cde507ef8fe35d1f68730e78f1e4 SELECT * FROM `test` . `v1` WHERE `a` = ? 2
-test 5e241fdb866faef138cc81b26203ddff SELECT * FROM `test` . `v1` WHERE `b` > ? 2
-test a3788cc4bc96d260cfb5c3ebdfc65c6d SELECT SCHEMA_NAME , `DIGEST` , `DIGEST_TEXT` , `COUNT_STAR` FROM `performance_schema` . `events_statements_summary_by_digest` ORDER BY `DIGEST_TEXT` 1
-test 74fa770ce44994b3fe7b534d504f2d6d SELECT `a` , `b` FROM `test` . `v1` 2
-test 45ca2a985d179d98395b238cf253bbe2 SELECT `b` , `a` FROM `test` . `v1` 2
-test 1cfa171590aa40ba23e14c92d6940ffc TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
+test 342cd5e41944d5f857f92b1e374857de CREATE VIEW `test` . `v1` AS SELECT * FROM `test` . `t1` 1
+test 2653f30030efcb6125121daa8eadf418 DROP TABLE `test` . `v1` 1
+test 27a9ab161a63050c84a63c6f77ebeb33 EXPLAIN SELECT * FROM `test` . `v1` 2
+test ab0ab27c04f3a294feb86bede4331f86 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 2
+test 2e722346a5c2ef820946bcd04ccac208 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 2
+test 07baf2264db30b6b25302603436ebe82 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 2
+test 3a7dbc963635ab0de6e160e0a4212bce EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 2
+test 6b845c2e3a7421997e3b610d14b5c842 SELECT * FROM `test` . `v1` 2
+test cb2ee099edbf6e0e5ee6ae14f3b1498a SELECT * FROM `test` . `v1` WHERE `a` = ? 2
+test e2dc5a300d2ba54ebb987a2ca6b90d93 SELECT * FROM `test` . `v1` WHERE `b` > ? 2
+test a13cfeda6d474d29546719d76dcfa831 SELECT SCHEMA_NAME , `DIGEST` , `DIGEST_TEXT` , `COUNT_STAR` FROM `performance_schema` . `events_statements_summary_by_digest` ORDER BY `DIGEST_TEXT` 1
+test c68e0f99323f7bb7732c7b5cf32c0ec2 SELECT `a` , `b` FROM `test` . `v1` 2
+test 43c5de955c9a72d2bb6f49db5c0ad3e7 SELECT `b` , `a` FROM `test` . `v1` 2
+test 1678258ba15f7ccc63fd7b833763914a TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
DROP VIEW test.v1;
DROP TABLE test.t1;
diff --git a/mysql-test/suite/perfschema/r/max_program_zero.result b/mysql-test/suite/perfschema/r/max_program_zero.result
index 5435efb34ae..f236f149a77 100644
--- a/mysql-test/suite/perfschema/r/max_program_zero.result
+++ b/mysql-test/suite/perfschema/r/max_program_zero.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 1
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/misc.result b/mysql-test/suite/perfschema/r/misc.result
index df9942a170f..2258cbceea4 100644
--- a/mysql-test/suite/perfschema/r/misc.result
+++ b/mysql-test/suite/perfschema/r/misc.result
@@ -174,3 +174,16 @@ select object_type, object_schema, object_name
from performance_schema.objects_summary_global_by_type
where object_schema="test";
object_type object_schema object_name
+#
+# MDEV-28344: sys.ps_setup_save and dependent procedures fail
+# with ER_ILLEGAL_HA_CREATE_OPTION
+#
+CREATE TEMPORARY TABLE t1 (t int) ENGINE = PERFORMANCE_SCHEMA;
+ERROR HY000: Table storage engine 'PERFORMANCE_SCHEMA' does not support the create option 'TEMPORARY'
+CREATE TEMPORARY TABLE t1 LIKE performance_schema.setup_actors;
+ERROR HY000: Table storage engine 'PERFORMANCE_SCHEMA' does not support the create option 'TEMPORARY'
+SET @default_storage_engine_old = @@default_storage_engine;
+SET default_storage_engine = performance_schema;
+CREATE TEMPORARY TABLE t1 (t int);
+ERROR HY000: Table storage engine 'PERFORMANCE_SCHEMA' does not support the create option 'TEMPORARY'
+SET @@default_storage_engine = @default_storage_engine_old;
diff --git a/mysql-test/suite/perfschema/r/ortho_iter.result b/mysql-test/suite/perfschema/r/ortho_iter.result
index 9489c1049e5..4224c3e520d 100644
--- a/mysql-test/suite/perfschema/r/ortho_iter.result
+++ b/mysql-test/suite/perfschema/r/ortho_iter.result
@@ -255,7 +255,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/privilege_table_io.result b/mysql-test/suite/perfschema/r/privilege_table_io.result
index 94cc2b33b49..ab0d18e3227 100644
--- a/mysql-test/suite/perfschema/r/privilege_table_io.result
+++ b/mysql-test/suite/perfschema/r/privilege_table_io.result
@@ -57,7 +57,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_disable_idle.result b/mysql-test/suite/perfschema/r/start_server_disable_idle.result
index bfc49fd3480..fda05bf6df5 100644
--- a/mysql-test/suite/perfschema/r/start_server_disable_idle.result
+++ b/mysql-test/suite/perfschema/r/start_server_disable_idle.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_disable_stages.result b/mysql-test/suite/perfschema/r/start_server_disable_stages.result
index e9f20398467..7db242f237f 100644
--- a/mysql-test/suite/perfschema/r/start_server_disable_stages.result
+++ b/mysql-test/suite/perfschema/r/start_server_disable_stages.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_disable_statements.result b/mysql-test/suite/perfschema/r/start_server_disable_statements.result
index ffb45f4f55f..31ddb4eb3cd 100644
--- a/mysql-test/suite/perfschema/r/start_server_disable_statements.result
+++ b/mysql-test/suite/perfschema/r/start_server_disable_statements.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_disable_transactions.result b/mysql-test/suite/perfschema/r/start_server_disable_transactions.result
index e271d5a10e6..2a2d42f4d51 100644
--- a/mysql-test/suite/perfschema/r/start_server_disable_transactions.result
+++ b/mysql-test/suite/perfschema/r/start_server_disable_transactions.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_disable_waits.result b/mysql-test/suite/perfschema/r/start_server_disable_waits.result
index 833da22583e..2115c747755 100644
--- a/mysql-test/suite/perfschema/r/start_server_disable_waits.result
+++ b/mysql-test/suite/perfschema/r/start_server_disable_waits.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_innodb.result b/mysql-test/suite/perfschema/r/start_server_innodb.result
index e3ff0f514a7..25b8a7b9c1f 100644
--- a/mysql-test/suite/perfschema/r/start_server_innodb.result
+++ b/mysql-test/suite/perfschema/r/start_server_innodb.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result b/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result
index a2d84753331..13b51569b60 100644
--- a/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result
+++ b/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result
@@ -8,5 +8,5 @@ SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
####################################
SELECT event_name, digest, digest_text, sql_text FROM events_statements_history_long;
event_name digest digest_text sql_text
-statement/sql/select 70a97f8223477a66e716cfcc317193e2 SELECT ? + ? + SELECT ...
-statement/sql/truncate ac4c7fc23914b333e9f40ce317816b8e TRUNCATE TABLE truncat...
+statement/sql/select 1fd0cdb6b5aa22bd0809a39b2dc2ac70 SELECT ? + ? + SELECT ...
+statement/sql/truncate 0a9c405cebde6df4be315dae86ff398a TRUNCATE TABLE truncat...
diff --git a/mysql-test/suite/perfschema/r/start_server_low_index.result b/mysql-test/suite/perfschema/r/start_server_low_index.result
index ffdf9d65b87..b34f86da89f 100644
--- a/mysql-test/suite/perfschema/r/start_server_low_index.result
+++ b/mysql-test/suite/perfschema/r/start_server_low_index.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_low_table_lock.result b/mysql-test/suite/perfschema/r/start_server_low_table_lock.result
index dbb404f6129..e8bf9f48da8 100644
--- a/mysql-test/suite/perfschema/r/start_server_low_table_lock.result
+++ b/mysql-test/suite/perfschema/r/start_server_low_table_lock.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_account.result b/mysql-test/suite/perfschema/r/start_server_no_account.result
index f92b0e6bec6..021ff9f9e3d 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_account.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_account.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_cond_class.result b/mysql-test/suite/perfschema/r/start_server_no_cond_class.result
index fefad55c209..0a7f1c601ef 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_cond_class.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_cond_class.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result b/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result
index 0c2f65f6ac9..de4ff2f5a72 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_file_class.result b/mysql-test/suite/perfschema/r/start_server_no_file_class.result
index c3f06b53425..997220d3169 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_file_class.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_file_class.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_file_inst.result b/mysql-test/suite/perfschema/r/start_server_no_file_inst.result
index fd39807d567..de81943afe8 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_file_inst.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_file_inst.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_host.result b/mysql-test/suite/perfschema/r/start_server_no_host.result
index 43111c5ec40..ce156302b22 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_host.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_host.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_index.result b/mysql-test/suite/perfschema/r/start_server_no_index.result
index 15d1184bcbe..d46095841c2 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_index.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_index.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_mdl.result b/mysql-test/suite/perfschema/r/start_server_no_mdl.result
index b8de90453ce..c1f7e656dc6 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_mdl.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_mdl.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_memory_class.result b/mysql-test/suite/perfschema/r/start_server_no_memory_class.result
index 60066264c90..94c8a7da85a 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_memory_class.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_memory_class.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result b/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result
index 3353b46bbcb..e44307fdbe6 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result b/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result
index d41da361733..6647def50c1 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result b/mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result
index 4919de6bb6c..9b5ad931858 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result b/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result
index 02a119bdc68..fdd3fe48bf3 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result b/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result
index ead01ce2d0e..09faadaa4ce 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_setup_actors.result b/mysql-test/suite/perfschema/r/start_server_no_setup_actors.result
index a99f1c0f9be..2d93be52186 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_setup_actors.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_setup_actors.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_setup_objects.result b/mysql-test/suite/perfschema/r/start_server_no_setup_objects.result
index 7c148889412..e9eff67712f 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_setup_objects.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_setup_objects.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_socket_class.result b/mysql-test/suite/perfschema/r/start_server_no_socket_class.result
index dec0680c511..f5b00a114dd 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_socket_class.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_socket_class.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 0
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_socket_inst.result b/mysql-test/suite/perfschema/r/start_server_no_socket_inst.result
index 20adf1a9f64..d1b3e14d349 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_socket_inst.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_socket_inst.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 0
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_stage_class.result b/mysql-test/suite/perfschema/r/start_server_no_stage_class.result
index 044f9475041..136c54885bf 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_stage_class.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_stage_class.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 0
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_stages_history.result b/mysql-test/suite/perfschema/r/start_server_no_stages_history.result
index 350f2c6637d..3e2d7acf4ec 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_stages_history.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_stages_history.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result b/mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result
index d2d7063c32f..5db6987834b 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_statements_history.result b/mysql-test/suite/perfschema/r/start_server_no_statements_history.result
index 8bcb3c56a00..69a69986a72 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_statements_history.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_statements_history.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result b/mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result
index 2a2bf5d3f7c..2f68483cfae 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result b/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result
index ec6e40acc00..3d131f1a2e0 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 0
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_table_inst.result b/mysql-test/suite/perfschema/r/start_server_no_table_inst.result
index b3f1e4cbcf2..95f8f226c41 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_table_inst.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_table_inst.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 0
diff --git a/mysql-test/suite/perfschema/r/start_server_no_table_lock.result b/mysql-test/suite/perfschema/r/start_server_no_table_lock.result
index baf9f761358..b54d6c762e1 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_table_lock.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_table_lock.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_thread_class.result b/mysql-test/suite/perfschema/r/start_server_no_thread_class.result
index cd204f3d811..9182677d8b8 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_thread_class.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_thread_class.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result b/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result
index d083484cd7c..ff90c471599 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_transactions_history.result b/mysql-test/suite/perfschema/r/start_server_no_transactions_history.result
index f5a12e5473d..4535bcd02ed 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_transactions_history.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_transactions_history.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result b/mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result
index 76ae9d5fa4e..f3eefb98a43 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_user.result b/mysql-test/suite/perfschema/r/start_server_no_user.result
index 4bd472a22a9..9ca79837845 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_user.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_user.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_waits_history.result b/mysql-test/suite/perfschema/r/start_server_no_waits_history.result
index f59b156ce1e..ee22d5b5bed 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_waits_history.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_waits_history.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result b/mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result
index cc70572c7ef..adbad8d166f 100644
--- a/mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result
+++ b/mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_off.result b/mysql-test/suite/perfschema/r/start_server_off.result
index a53d591938c..022f7d1096e 100644
--- a/mysql-test/suite/perfschema/r/start_server_off.result
+++ b/mysql-test/suite/perfschema/r/start_server_off.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_on.result b/mysql-test/suite/perfschema/r/start_server_on.result
index e3ff0f514a7..25b8a7b9c1f 100644
--- a/mysql-test/suite/perfschema/r/start_server_on.result
+++ b/mysql-test/suite/perfschema/r/start_server_on.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/start_server_variables.result b/mysql-test/suite/perfschema/r/start_server_variables.result
index 7d1d1e05375..65d3a7b55b5 100644
--- a/mysql-test/suite/perfschema/r/start_server_variables.result
+++ b/mysql-test/suite/perfschema/r/start_server_variables.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 10
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/statement_program_lost_inst.result b/mysql-test/suite/perfschema/r/statement_program_lost_inst.result
index 05ec7b0b2b5..264778c06e4 100644
--- a/mysql-test/suite/perfschema/r/statement_program_lost_inst.result
+++ b/mysql-test/suite/perfschema/r/statement_program_lost_inst.result
@@ -135,7 +135,7 @@ performance_schema_max_socket_classes 10
performance_schema_max_socket_instances 1000
performance_schema_max_sql_text_length 1024
performance_schema_max_stage_classes 160
-performance_schema_max_statement_classes 222
+performance_schema_max_statement_classes 221
performance_schema_max_statement_stack 2
performance_schema_max_table_handles 1000
performance_schema_max_table_instances 500
diff --git a/mysql-test/suite/perfschema/r/sxlock_func.result b/mysql-test/suite/perfschema/r/sxlock_func.result
index ff556c1e011..d6bbce28ee1 100644
--- a/mysql-test/suite/perfschema/r/sxlock_func.result
+++ b/mysql-test/suite/perfschema/r/sxlock_func.result
@@ -10,6 +10,7 @@ name
wait/synch/rwlock/innodb/dict_operation_lock
wait/synch/rwlock/innodb/fil_space_latch
wait/synch/rwlock/innodb/lock_latch
+wait/synch/rwlock/innodb/log_latch
wait/synch/rwlock/innodb/trx_i_s_cache_lock
wait/synch/rwlock/innodb/trx_purge_latch
wait/synch/rwlock/innodb/trx_rseg_latch
@@ -43,6 +44,7 @@ ORDER BY event_name;
event_name
wait/synch/rwlock/innodb/fil_space_latch
wait/synch/rwlock/innodb/lock_latch
+wait/synch/rwlock/innodb/log_latch
SELECT event_name FROM performance_schema.events_waits_history_long
WHERE event_name = 'wait/synch/sxlock/innodb/index_tree_rw_lock'
AND operation IN ('try_shared_lock','shared_lock') LIMIT 1;
diff --git a/mysql-test/suite/perfschema/t/misc.test b/mysql-test/suite/perfschema/t/misc.test
index 848be3beea1..79c23c65616 100644
--- a/mysql-test/suite/perfschema/t/misc.test
+++ b/mysql-test/suite/perfschema/t/misc.test
@@ -298,3 +298,23 @@ drop tables t1;
select object_type, object_schema, object_name
from performance_schema.objects_summary_global_by_type
where object_schema="test";
+
+--echo #
+--echo # MDEV-28344: sys.ps_setup_save and dependent procedures fail
+--echo # with ER_ILLEGAL_HA_CREATE_OPTION
+--echo #
+
+# It is not allowed to create temporary tables with performance schema
+--error ER_ILLEGAL_HA_CREATE_OPTION
+CREATE TEMPORARY TABLE t1 (t int) ENGINE = PERFORMANCE_SCHEMA;
+
+--error ER_ILLEGAL_HA_CREATE_OPTION
+CREATE TEMPORARY TABLE t1 LIKE performance_schema.setup_actors;
+
+SET @default_storage_engine_old = @@default_storage_engine;
+SET default_storage_engine = performance_schema;
+
+--error ER_ILLEGAL_HA_CREATE_OPTION
+CREATE TEMPORARY TABLE t1 (t int);
+
+SET @@default_storage_engine = @default_storage_engine_old; \ No newline at end of file
diff --git a/mysql-test/suite/plugins/r/auth_ed25519.result b/mysql-test/suite/plugins/r/auth_ed25519.result
index 6769d867167..f5d1ce2497d 100644
--- a/mysql-test/suite/plugins/r/auth_ed25519.result
+++ b/mysql-test/suite/plugins/r/auth_ed25519.result
@@ -27,7 +27,7 @@ PLUGIN_STATUS ACTIVE
PLUGIN_TYPE AUTHENTICATION
PLUGIN_TYPE_VERSION 2.2
PLUGIN_LIBRARY auth_ed25519.so
-PLUGIN_LIBRARY_VERSION 1.14
+PLUGIN_LIBRARY_VERSION 1.15
PLUGIN_AUTHOR Sergei Golubchik
PLUGIN_DESCRIPTION Elliptic curve ED25519 based authentication
PLUGIN_LICENSE GPL
diff --git a/mysql-test/suite/plugins/r/compression,innodb-lz4.rdiff b/mysql-test/suite/plugins/r/compression,innodb-lz4.rdiff
new file mode 100644
index 00000000000..06fdb0bd4f0
--- /dev/null
+++ b/mysql-test/suite/plugins/r/compression,innodb-lz4.rdiff
@@ -0,0 +1,24 @@
+--- suite/plugins/r/compression.result
++++ suite/plugins/r/compression.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing bzip2 compression provider with innodb
++# Testing lz4 compression provider with innodb
+ #
+ call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
+-set global innodb_compression_algorithm = bzip2;
++set global innodb_compression_algorithm = lz4;
+ call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt");
+ call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed");
+ call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
+@@ -15,8 +15,8 @@
+ 0 abcabcabc 300
+ 1 defdefdef 3000
+ 2 ghighighi 30000
+-# restart: --disable-provider-bzip2
++# restart: --disable-provider-lz4
+ select a, left(b, 9), length(b) from t1;
+-ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table
++ERROR HY000: Table test/t1 is compressed with lz4, which is not currently loaded. Please load the lz4 provider plugin to open the table
+ drop table t1;
+ # restart
diff --git a/mysql-test/suite/plugins/r/compression,innodb-lzma.rdiff b/mysql-test/suite/plugins/r/compression,innodb-lzma.rdiff
new file mode 100644
index 00000000000..ee348934a54
--- /dev/null
+++ b/mysql-test/suite/plugins/r/compression,innodb-lzma.rdiff
@@ -0,0 +1,24 @@
+--- suite/plugins/r/compression.result
++++ suite/plugins/r/compression.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing bzip2 compression provider with innodb
++# Testing lzma compression provider with innodb
+ #
+ call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
+-set global innodb_compression_algorithm = bzip2;
++set global innodb_compression_algorithm = lzma;
+ call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt");
+ call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed");
+ call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
+@@ -15,8 +15,8 @@
+ 0 abcabcabc 300
+ 1 defdefdef 3000
+ 2 ghighighi 30000
+-# restart: --disable-provider-bzip2
++# restart: --disable-provider-lzma
+ select a, left(b, 9), length(b) from t1;
+-ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table
++ERROR HY000: Table test/t1 is compressed with lzma, which is not currently loaded. Please load the lzma provider plugin to open the table
+ drop table t1;
+ # restart
diff --git a/mysql-test/suite/plugins/r/compression,innodb-lzo.rdiff b/mysql-test/suite/plugins/r/compression,innodb-lzo.rdiff
new file mode 100644
index 00000000000..d7cdc41092a
--- /dev/null
+++ b/mysql-test/suite/plugins/r/compression,innodb-lzo.rdiff
@@ -0,0 +1,24 @@
+--- suite/plugins/r/compression.result
++++ suite/plugins/r/compression.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing bzip2 compression provider with innodb
++# Testing lzo compression provider with innodb
+ #
+ call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
+-set global innodb_compression_algorithm = bzip2;
++set global innodb_compression_algorithm = lzo;
+ call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt");
+ call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed");
+ call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
+@@ -15,8 +15,8 @@
+ 0 abcabcabc 300
+ 1 defdefdef 3000
+ 2 ghighighi 30000
+-# restart: --disable-provider-bzip2
++# restart: --disable-provider-lzo
+ select a, left(b, 9), length(b) from t1;
+-ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table
++ERROR HY000: Table test/t1 is compressed with lzo, which is not currently loaded. Please load the lzo provider plugin to open the table
+ drop table t1;
+ # restart
diff --git a/mysql-test/suite/plugins/r/compression,innodb-snappy.rdiff b/mysql-test/suite/plugins/r/compression,innodb-snappy.rdiff
new file mode 100644
index 00000000000..e9c7485d118
--- /dev/null
+++ b/mysql-test/suite/plugins/r/compression,innodb-snappy.rdiff
@@ -0,0 +1,24 @@
+--- suite/plugins/r/compression.result
++++ suite/plugins/r/compression.reject
+@@ -1,8 +1,8 @@
+ #
+-# Testing bzip2 compression provider with innodb
++# Testing snappy compression provider with innodb
+ #
+ call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
+-set global innodb_compression_algorithm = bzip2;
++set global innodb_compression_algorithm = snappy;
+ call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt");
+ call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed");
+ call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
+@@ -15,8 +15,8 @@
+ 0 abcabcabc 300
+ 1 defdefdef 3000
+ 2 ghighighi 30000
+-# restart: --disable-provider-bzip2
++# restart: --disable-provider-snappy
+ select a, left(b, 9), length(b) from t1;
+-ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table
++ERROR HY000: Table test/t1 is compressed with snappy, which is not currently loaded. Please load the snappy provider plugin to open the table
+ drop table t1;
+ # restart
diff --git a/mysql-test/suite/plugins/r/compression,mroonga-lz4.rdiff b/mysql-test/suite/plugins/r/compression,mroonga-lz4.rdiff
new file mode 100644
index 00000000000..9b155ff3a1d
--- /dev/null
+++ b/mysql-test/suite/plugins/r/compression,mroonga-lz4.rdiff
@@ -0,0 +1,40 @@
+--- suite/plugins/r/compression.result
++++ suite/plugins/r/compression.reject
+@@ -1,12 +1,8 @@
+ #
+-# Testing bzip2 compression provider with innodb
++# Testing lz4 compression provider with mroonga
+ #
+ call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
+-set global innodb_compression_algorithm = bzip2;
+-call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt");
+-call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed");
+-call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
+-create table t1 (a int, b text ) engine = innodb page_compressed = 1;
++create table t1 (a int, b text COMMENT 'FLAGS "COLUMN_SCALAR|COMPRESS_LZ4"') engine = mroonga charset = utf8;
+ insert t1 (a, b) values (0, repeat("abc", 100));
+ insert t1 (a, b) values (1, repeat("def", 1000));
+ insert t1 (a, b) values (2, repeat("ghi", 10000));
+@@ -14,8 +11,20 @@
+ 0 abcabcabc 300
+ 1 defdefdef 3000
+ 2 ghighighi 30000
+-# restart: --disable-provider-bzip2
++# restart: --disable-provider-lz4
+ select a, left(b, 9), length(b) from t1;
+-ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table
++a left(b, 9) length(b)
++0 0
++1 0
++2 0
++Warnings:
++Warning 4185 MariaDB tried to use the LZ4 compression, but its provider plugin is not loaded
++select a, left(b, 9), length(b) from t1;
++a left(b, 9) length(b)
++0 0
++1 0
++2 0
++Warnings:
++Warning 4185 MariaDB tried to use the LZ4 compression, but its provider plugin is not loaded
+ drop table t1;
+ # restart
diff --git a/mysql-test/suite/plugins/r/compression.result b/mysql-test/suite/plugins/r/compression.result
new file mode 100644
index 00000000000..dd267f282c5
--- /dev/null
+++ b/mysql-test/suite/plugins/r/compression.result
@@ -0,0 +1,22 @@
+#
+# Testing bzip2 compression provider with innodb
+#
+call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
+set global innodb_compression_algorithm = bzip2;
+call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt");
+call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed");
+call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
+create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+insert t1 (a, b) values (0, repeat("abc", 100));
+insert t1 (a, b) values (1, repeat("def", 1000));
+insert t1 (a, b) values (2, repeat("ghi", 10000));
+select a, left(b, 9), length(b) from t1;
+a left(b, 9) length(b)
+0 abcabcabc 300
+1 defdefdef 3000
+2 ghighighi 30000
+# restart: --disable-provider-bzip2
+select a, left(b, 9), length(b) from t1;
+ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table
+drop table t1;
+# restart
diff --git a/mysql-test/suite/plugins/r/compression_load.result b/mysql-test/suite/plugins/r/compression_load.result
new file mode 100644
index 00000000000..a23037edc17
--- /dev/null
+++ b/mysql-test/suite/plugins/r/compression_load.result
@@ -0,0 +1,33 @@
+select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
+plugin_name plugin_status
+set global innodb_compression_algorithm = lz4;
+ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'lz4'
+install plugin provider_lz4 soname 'provider_lz4';
+select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
+plugin_name plugin_status
+provider_lz4 ACTIVE
+set global innodb_compression_algorithm = lz4;
+create table t1 (a int, b text) engine=innodb page_compressed=1;
+insert t1 (a, b) values (0, repeat("abc", 100));
+insert t1 (a, b) values (1, repeat("def", 1000));
+insert t1 (a, b) values (2, repeat("ghi", 10000));
+select a, left(b, 9), length(b) from t1;
+a left(b, 9) length(b)
+0 abcabcabc 300
+1 defdefdef 3000
+2 ghighighi 30000
+uninstall plugin provider_lz4;
+Warnings:
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
+plugin_name plugin_status
+provider_lz4 INACTIVE
+set global innodb_compression_algorithm = default;
+set global innodb_compression_algorithm = lz4;
+set global innodb_compression_algorithm = default;
+select a, left(b, 9), length(b) from t1;
+a left(b, 9) length(b)
+0 abcabcabc 300
+1 defdefdef 3000
+2 ghighighi 30000
+drop table t1;
diff --git a/mysql-test/suite/plugins/r/cracklib_password_check.result b/mysql-test/suite/plugins/r/cracklib_password_check.result
index 218d12fb884..192d41d2ccf 100644
--- a/mysql-test/suite/plugins/r/cracklib_password_check.result
+++ b/mysql-test/suite/plugins/r/cracklib_password_check.result
@@ -4,9 +4,9 @@ PLUGIN_NAME cracklib_password_check
PLUGIN_VERSION 1.0
PLUGIN_STATUS ACTIVE
PLUGIN_TYPE PASSWORD VALIDATION
-PLUGIN_TYPE_VERSION 1.0
+PLUGIN_TYPE_VERSION 1.1
PLUGIN_LIBRARY cracklib_password_check.so
-PLUGIN_LIBRARY_VERSION 1.14
+PLUGIN_LIBRARY_VERSION 1.15
PLUGIN_AUTHOR Sergei Golubchik
PLUGIN_DESCRIPTION Password validation via CrackLib
PLUGIN_LICENSE GPL
@@ -37,6 +37,18 @@ show warnings;
Level Code Message
Warning 1819 cracklib: it is based on a dictionary word
Error 1819 Your password does not satisfy the current policy requirements (cracklib_password_check)
+grant select on *.* to foocar@localhost identified by 'localhost';
+ERROR HY000: Your password does not satisfy the current policy requirements (cracklib_password_check)
+show warnings;
+Level Code Message
+Warning 1819 cracklib: it is based upon your password entry
+Error 1819 Your password does not satisfy the current policy requirements (cracklib_password_check)
+grant select on *.* to foocar@localhost identified by 'foocar@localhost';
+ERROR HY000: Your password does not satisfy the current policy requirements (cracklib_password_check)
+show warnings;
+Level Code Message
+Warning 1819 cracklib: it is derived from your password entry
+Error 1819 Your password does not satisfy the current policy requirements (cracklib_password_check)
grant select on *.* to foobar identified by 'q$%^&*rty';
drop user foobar;
#
diff --git a/mysql-test/suite/plugins/r/password_reuse_check.result b/mysql-test/suite/plugins/r/password_reuse_check.result
new file mode 100644
index 00000000000..72f3dd5364b
--- /dev/null
+++ b/mysql-test/suite/plugins/r/password_reuse_check.result
@@ -0,0 +1,94 @@
+install soname "password_reuse_check";
+set global password_reuse_check_interval= 0;
+# Default value (sould be unlimited i.e. 0)
+SHOW GLOBAL VARIABLES like "password_reuse_check%";
+Variable_name Value
+password_reuse_check_interval 0
+# insert user
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+ERROR HY000: Your password does not satisfy the current policy requirements (password_reuse_check)
+show warnings;
+Level Code Message
+Warning 1819 password_reuse_check: The password was already used
+Error 1819 Your password does not satisfy the current policy requirements (password_reuse_check)
+alter user user_name@localhost identified by 'test_pwd';
+ERROR HY000: Operation ALTER USER failed for 'user_name'@'localhost'
+show warnings;
+Level Code Message
+Warning 1819 password_reuse_check: The password was already used
+Error 1819 Your password does not satisfy the current policy requirements (password_reuse_check)
+Error 1396 Operation ALTER USER failed for 'user_name'@'localhost'
+# check exparation
+set global password_reuse_check_interval= 10;
+alter user user_name@localhost identified by 'test_pwd';
+ERROR HY000: Operation ALTER USER failed for 'user_name'@'localhost'
+show warnings;
+Level Code Message
+Warning 1819 password_reuse_check: The password was already used
+Error 1819 Your password does not satisfy the current policy requirements (password_reuse_check)
+Error 1396 Operation ALTER USER failed for 'user_name'@'localhost'
+select hex(hash) from mysql.password_reuse_check_history;
+hex(hash)
+B9F970DE4DA0145F842526C1BC9DBBBDB3EF80FDD7BE98061DAE3D18F492AA37668C07322DD21650C66B48FC78F0EAF6CB08245CC895BFDC43BE6921B07E5240
+# emulate old password
+update mysql.password_reuse_check_history set time= date_sub(now(), interval
+11 day);
+alter user user_name@localhost identified by 'test_pwd';
+show warnings;
+Level Code Message
+drop user user_name@localhost;
+show create table mysql.password_reuse_check_history;
+Table Create Table
+password_reuse_check_history CREATE TABLE `password_reuse_check_history` (
+ `hash` binary(64) NOT NULL,
+ `time` timestamp NOT NULL DEFAULT current_timestamp(),
+ PRIMARY KEY (`hash`),
+ KEY `tm` (`time`)
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+select count(*) from mysql.password_reuse_check_history;
+count(*)
+1
+drop table mysql.password_reuse_check_history;
+# test error messages
+set global password_reuse_check_interval= 0;
+drop table if exists mysql.password_reuse_check_history;
+Warnings:
+Note 1051 Unknown table 'mysql.password_reuse_check_history'
+# test error messages
+create table mysql.password_reuse_check_history (wrong_structure int);
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+ERROR HY000: Your password does not satisfy the current policy requirements (password_reuse_check)
+show warnings;
+Level Code Message
+Warning 1105 password_reuse_check:[1054] Unknown column 'hash' in 'field list'
+Error 1819 Your password does not satisfy the current policy requirements (password_reuse_check)
+set global password_reuse_check_interval= 10;
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+ERROR HY000: Your password does not satisfy the current policy requirements (password_reuse_check)
+show warnings;
+Level Code Message
+Warning 1105 password_reuse_check:[1054] Unknown column 'time' in 'where clause'
+Error 1819 Your password does not satisfy the current policy requirements (password_reuse_check)
+drop table mysql.password_reuse_check_history;
+#
+# MDEV-28838: password_reuse_check plugin mixes username and password
+#
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+grant select on *.* to user_nam@localhost identified by 'etest_pwd';
+show warnings;
+Level Code Message
+drop user user_name@localhost;
+drop user user_nam@localhost;
+drop table mysql.password_reuse_check_history;
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+grant select on *.* to tuser_name@localhos identified by 'test_pwd';
+show warnings;
+Level Code Message
+drop user user_name@localhost;
+drop user tuser_name@localhos;
+#
+# End of 10.7 tests
+#
+drop table mysql.password_reuse_check_history;
+uninstall plugin password_reuse_check;
diff --git a/mysql-test/suite/plugins/r/show_all_plugins.result b/mysql-test/suite/plugins/r/show_all_plugins.result
index 3bdaf39d0d0..ebd5b6cc198 100644
--- a/mysql-test/suite/plugins/r/show_all_plugins.result
+++ b/mysql-test/suite/plugins/r/show_all_plugins.result
@@ -4,8 +4,8 @@ Variable_name Value
Opened_plugin_libraries 0
select * from information_schema.all_plugins where plugin_library='ha_example.so';
PLUGIN_NAME PLUGIN_VERSION PLUGIN_STATUS PLUGIN_TYPE PLUGIN_TYPE_VERSION PLUGIN_LIBRARY PLUGIN_LIBRARY_VERSION PLUGIN_AUTHOR PLUGIN_DESCRIPTION PLUGIN_LICENSE LOAD_OPTION PLUGIN_MATURITY PLUGIN_AUTH_VERSION
-EXAMPLE 0.1 NOT INSTALLED STORAGE ENGINE MYSQL_VERSION_ID ha_example.so 1.14 Brian Aker, MySQL AB Example storage engine GPL OFF Experimental 0.1
-UNUSABLE 3.14 NOT INSTALLED DAEMON MYSQL_VERSION_ID ha_example.so 1.14 Sergei Golubchik Unusable Daemon GPL OFF Experimental 3.14.15.926
+EXAMPLE 0.1 NOT INSTALLED STORAGE ENGINE MYSQL_VERSION_ID ha_example.so 1.15 Brian Aker, MySQL AB Example storage engine GPL OFF Experimental 0.1
+UNUSABLE 3.14 NOT INSTALLED DAEMON MYSQL_VERSION_ID ha_example.so 1.15 Sergei Golubchik Unusable Daemon GPL OFF Experimental 3.14.15.926
show status like '%libraries%';
Variable_name Value
Opened_plugin_libraries 1
diff --git a/mysql-test/suite/plugins/r/simple_password_check.result b/mysql-test/suite/plugins/r/simple_password_check.result
index ab6988ed002..30f68ba8193 100644
--- a/mysql-test/suite/plugins/r/simple_password_check.result
+++ b/mysql-test/suite/plugins/r/simple_password_check.result
@@ -4,9 +4,9 @@ PLUGIN_NAME simple_password_check
PLUGIN_VERSION 1.0
PLUGIN_STATUS ACTIVE
PLUGIN_TYPE PASSWORD VALIDATION
-PLUGIN_TYPE_VERSION 1.0
+PLUGIN_TYPE_VERSION 1.1
PLUGIN_LIBRARY simple_password_check.so
-PLUGIN_LIBRARY_VERSION 1.14
+PLUGIN_LIBRARY_VERSION 1.15
PLUGIN_AUTHOR Sergei Golubchik
PLUGIN_DESCRIPTION Simple password strength checks
PLUGIN_LICENSE GPL
diff --git a/mysql-test/suite/plugins/r/test_sql_service.result b/mysql-test/suite/plugins/r/test_sql_service.result
index af414d6c6e7..e5f09b67b6b 100644
--- a/mysql-test/suite/plugins/r/test_sql_service.result
+++ b/mysql-test/suite/plugins/r/test_sql_service.result
@@ -1,8 +1,100 @@
+reset master;
install plugin test_sql_service soname 'test_sql_service';
+show status like 'test_sql_service_passed';
+Variable_name Value
+Test_sql_service_passed 1
+set global test_sql_service_execute_sql_global= 'create table test.t1 select 1 as a, @@SQL_LOG_BIN';
+set global test_sql_service_execute_sql_local= 'insert into test.t1 select 2 as a, @@SQL_LOG_BIN';
+set global test_sql_service_execute_sql_global= 'SET SQL_LOG_BIN=1';
+set global test_sql_service_execute_sql_global= 'insert into test.t1 select 3 as a, @@SQL_LOG_BIN';
+set global test_sql_service_execute_sql_global= 'SET SQL_LOG_BIN=0';
+set global test_sql_service_execute_sql_global= 'insert into test.t1 select 4 as a, @@SQL_LOG_BIN';
+set global test_sql_service_execute_sql_global= 'SET sql_auto_is_null=1';
+set global test_sql_service_execute_sql_global= 'insert into test.t1 select 5 as a, @@sql_auto_is_null';
+set global test_sql_service_execute_sql_global= 'SET sql_auto_is_null=0';
+set global test_sql_service_execute_sql_global= 'insert into test.t1 select 6 as a, @@sql_auto_is_null';
+select * from t1 order by a;
+a @@SQL_LOG_BIN
+1 0
+2 0
+3 1
+4 0
+5 1
+6 0
+drop table t1;
+SET SQL_LOG_BIN=0;
set global test_sql_service_run_test= 1;
-show status like 'test_sql_service%';
+show status like 'test_sql_service_passed';
+Variable_name Value
+Test_sql_service_passed 1
+set global test_sql_service_execute_sql_local= 'create table test.t1(id int)';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query affected 0 rows.
+set global test_sql_service_execute_sql_local= 'insert into test.t1 values (1), (2)';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query affected 2 rows.
+set global test_sql_service_execute_sql_local= 'select * from test.t1';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query returned 2 rows.
+set global test_sql_service_execute_sql_local= 'drop table test.t1';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query affected 0 rows.
+set global test_sql_service_execute_sql_local= 'drop table test.t1';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Error 1051 returned. Unknown table 'test.t1'
+set global test_sql_service_execute_sql_global= 'create table test.t1(id int)';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query affected 0 rows.
+set global test_sql_service_execute_sql_global= 'insert into test.t1 values (1), (2)';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query affected 2 rows.
+set global test_sql_service_execute_sql_global= 'select * from test.t1';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query returned 2 rows.
+set global test_sql_service_execute_sql_global= 'drop table test.t1';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query affected 0 rows.
+set global test_sql_service_execute_sql_global= 'drop table test.t1';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Error 1051 returned. Unknown table 'test.t1'
+create table t1 (id int, time timestamp);
+insert into t1 values (1, NULL), (2, NULL), (3, NULL), (4, NULL), (5, NULL);
+set global test_sql_service_execute_sql_global= 'select * FROM test.t1 WHERE time < DATE_SUB(NOW(), interval 5 minute)';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query returned 0 rows.
+set global test_sql_service_execute_sql_global= 'select * FROM test.t1 WHERE time <= NOW()';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query returned 5 rows.
+set global test_sql_service_execute_sql_local= 'select * FROM test.t1 WHERE time < DATE_SUB(NOW(), interval 5 minute)';
+show status like 'test_sql_query_result';
+Variable_name Value
+Test_sql_query_result Query returned 0 rows.
+set global test_sql_service_execute_sql_local= 'select * FROM test.t1 WHERE time <= NOW()';
+show status like 'test_sql_query_result';
Variable_name Value
-Test_sql_service_passed 0
+Test_sql_query_result Query returned 5 rows.
+drop table t1;
uninstall plugin test_sql_service;
Warnings:
Warning 1620 Plugin is busy and will be uninstalled on shutdown
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid # # BEGIN GTID #-#-#
+master-bin.000001 # Annotate_rows # # insert into test.t1 select 3 as a, @@SQL_LOG_BIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Gtid # # GTID #-#-#
+master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
diff --git a/mysql-test/suite/plugins/t/compression.combinations b/mysql-test/suite/plugins/t/compression.combinations
new file mode 100644
index 00000000000..645ca60e5f0
--- /dev/null
+++ b/mysql-test/suite/plugins/t/compression.combinations
@@ -0,0 +1,29 @@
+[innodb-bzip2]
+innodb
+plugin-load-add=$PROVIDER_BZIP2_SO
+loose-provider-bzip2
+
+[innodb-lz4]
+innodb
+plugin-load-add=$PROVIDER_LZ4_SO
+loose-provider-lz4
+
+[innodb-lzma]
+innodb
+plugin-load-add=$PROVIDER_LZMA_SO
+loose-provider-lzma
+
+[innodb-lzo]
+innodb
+plugin-load-add=$PROVIDER_LZO_SO
+loose-provider-lzo
+
+[innodb-snappy]
+innodb
+plugin-load-add=$PROVIDER_SNAPPY_SO
+loose-provider-snappy
+
+[mroonga-lz4]
+plugin-load-add=$HA_MROONGA_SO
+plugin-load-add=$PROVIDER_LZ4_SO
+loose-provider-lz4
diff --git a/mysql-test/suite/plugins/t/compression.test b/mysql-test/suite/plugins/t/compression.test
new file mode 100644
index 00000000000..c97c5725e1d
--- /dev/null
+++ b/mysql-test/suite/plugins/t/compression.test
@@ -0,0 +1,52 @@
+let $engine=`select regexp_replace('$MTR_COMBINATIONS', '-.*', '')`;
+let $alg=`select regexp_replace('$MTR_COMBINATIONS', '.*-', '')`;
+
+if (`select count(*) = 0 from information_schema.plugins where plugin_name = '$engine' and plugin_status='active'`)
+{
+ skip Needs $engine engine;
+}
+
+if (`select count(*) = 0 from information_schema.plugins where plugin_name = 'provider_$alg' and plugin_status='active'`)
+{
+ skip Needs provider_$alg plugin;
+}
+
+--echo #
+--echo # Testing $alg compression provider with $engine
+--echo #
+
+call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
+if ($engine == "innodb") {
+ eval set global innodb_compression_algorithm = $alg;
+ let $table_params = page_compressed = 1;
+ call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt");
+ call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed");
+ call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
+}
+if ($engine == "mroonga") {
+ let $column_params = `select upper('COMMENT \'flags "COLUMN_SCALAR|COMPRESS_$alg"\'')`;
+ let $table_params = charset = utf8;
+}
+
+eval create table t1 (a int, b text $column_params) engine = $engine $table_params;
+
+insert t1 (a, b) values (0, repeat("abc", 100));
+insert t1 (a, b) values (1, repeat("def", 1000));
+insert t1 (a, b) values (2, repeat("ghi", 10000));
+select a, left(b, 9), length(b) from t1;
+
+let $restart_parameters = --disable-provider-$alg;
+source include/restart_mysqld.inc;
+
+if ($engine == "innodb") {
+ error ER_PROVIDER_NOT_LOADED;
+ select a, left(b, 9), length(b) from t1;
+}
+if ($engine == "mroonga"){
+ select a, left(b, 9), length(b) from t1;
+ select a, left(b, 9), length(b) from t1; # a warning once per statement
+}
+drop table t1;
+
+let $restart_parameters =;
+source include/restart_mysqld.inc;
diff --git a/mysql-test/suite/plugins/t/compression_load.test b/mysql-test/suite/plugins/t/compression_load.test
new file mode 100644
index 00000000000..d67c204e75f
--- /dev/null
+++ b/mysql-test/suite/plugins/t/compression_load.test
@@ -0,0 +1,24 @@
+source include/have_innodb.inc;
+
+if (!$PROVIDER_LZ4_SO) {
+ skip Requires provider_lz4 plugin;
+}
+
+select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
+--error ER_WRONG_VALUE_FOR_VAR
+set global innodb_compression_algorithm = lz4;
+install plugin provider_lz4 soname 'provider_lz4';
+select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
+set global innodb_compression_algorithm = lz4;
+create table t1 (a int, b text) engine=innodb page_compressed=1;
+insert t1 (a, b) values (0, repeat("abc", 100));
+insert t1 (a, b) values (1, repeat("def", 1000));
+insert t1 (a, b) values (2, repeat("ghi", 10000));
+select a, left(b, 9), length(b) from t1;
+uninstall plugin provider_lz4;
+select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
+set global innodb_compression_algorithm = default;
+set global innodb_compression_algorithm = lz4;
+set global innodb_compression_algorithm = default;
+select a, left(b, 9), length(b) from t1;
+drop table t1;
diff --git a/mysql-test/suite/plugins/t/cracklib_password_check.test b/mysql-test/suite/plugins/t/cracklib_password_check.test
index 89b53b656d6..0fbef757e30 100644
--- a/mysql-test/suite/plugins/t/cracklib_password_check.test
+++ b/mysql-test/suite/plugins/t/cracklib_password_check.test
@@ -27,6 +27,14 @@ show warnings;
grant select on *.* to foobar identified by 'qwerty';
show warnings;
+--error ER_NOT_VALID_PASSWORD
+grant select on *.* to foocar@localhost identified by 'localhost';
+show warnings;
+
+--error ER_NOT_VALID_PASSWORD
+grant select on *.* to foocar@localhost identified by 'foocar@localhost';
+show warnings;
+
grant select on *.* to foobar identified by 'q$%^&*rty';
drop user foobar;
diff --git a/mysql-test/suite/plugins/t/password_reuse_check.test b/mysql-test/suite/plugins/t/password_reuse_check.test
new file mode 100644
index 00000000000..16ff21dc454
--- /dev/null
+++ b/mysql-test/suite/plugins/t/password_reuse_check.test
@@ -0,0 +1,100 @@
+--source include/not_embedded.inc
+
+if (!$PASSWORD_REUSE_CHECK_SO) {
+ skip No PASSWORD_REUSE_CHECK plugin;
+}
+
+install soname "password_reuse_check";
+
+set global password_reuse_check_interval= 0;
+
+--echo # Default value (sould be unlimited i.e. 0)
+SHOW GLOBAL VARIABLES like "password_reuse_check%";
+
+--echo # insert user
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+
+--error ER_NOT_VALID_PASSWORD
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+show warnings;
+
+--error ER_CANNOT_USER
+alter user user_name@localhost identified by 'test_pwd';
+show warnings;
+
+# Plugin does not work for it
+#--error ER_NOT_VALID_PASSWORD
+#SET PASSWORD FOR user_name@localhost = PASSWORD('test_pwd');
+
+--echo # check exparation
+
+set global password_reuse_check_interval= 10;
+
+--error ER_CANNOT_USER
+alter user user_name@localhost identified by 'test_pwd';
+show warnings;
+select hex(hash) from mysql.password_reuse_check_history;
+
+--echo # emulate old password
+update mysql.password_reuse_check_history set time= date_sub(now(), interval
+11 day);
+
+alter user user_name@localhost identified by 'test_pwd';
+show warnings;
+
+drop user user_name@localhost;
+
+show create table mysql.password_reuse_check_history;
+select count(*) from mysql.password_reuse_check_history;
+
+drop table mysql.password_reuse_check_history;
+
+--echo # test error messages
+
+set global password_reuse_check_interval= 0;
+
+drop table if exists mysql.password_reuse_check_history;
+
+--echo # test error messages
+
+create table mysql.password_reuse_check_history (wrong_structure int);
+
+--error ER_NOT_VALID_PASSWORD
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+show warnings;
+
+set global password_reuse_check_interval= 10;
+
+--error ER_NOT_VALID_PASSWORD
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+show warnings;
+
+drop table mysql.password_reuse_check_history;
+
+--echo #
+--echo # MDEV-28838: password_reuse_check plugin mixes username and password
+--echo #
+
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+
+grant select on *.* to user_nam@localhost identified by 'etest_pwd';
+show warnings;
+
+drop user user_name@localhost;
+drop user user_nam@localhost;
+drop table mysql.password_reuse_check_history;
+
+grant select on *.* to user_name@localhost identified by 'test_pwd';
+
+grant select on *.* to tuser_name@localhos identified by 'test_pwd';
+show warnings;
+
+drop user user_name@localhost;
+drop user tuser_name@localhos;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
+
+drop table mysql.password_reuse_check_history;
+uninstall plugin password_reuse_check;
diff --git a/mysql-test/suite/plugins/t/test_sql_service.test b/mysql-test/suite/plugins/t/test_sql_service.test
index 9b9e29c6913..0a45cb663f4 100644
--- a/mysql-test/suite/plugins/t/test_sql_service.test
+++ b/mysql-test/suite/plugins/t/test_sql_service.test
@@ -1,4 +1,7 @@
--source include/not_embedded.inc
+--source include/have_log_bin.inc
+
+reset master; # clear binlogs
if (!$TEST_SQL_SERVICE_SO) {
skip No TEST_SQL_SERVICE plugin;
@@ -9,9 +12,72 @@ let count_sessions= 1;
source include/wait_until_count_sessions.inc;
install plugin test_sql_service soname 'test_sql_service';
+show status like 'test_sql_service_passed';
+
+set global test_sql_service_execute_sql_global= 'create table test.t1 select 1 as a, @@SQL_LOG_BIN';
+set global test_sql_service_execute_sql_local= 'insert into test.t1 select 2 as a, @@SQL_LOG_BIN';
+set global test_sql_service_execute_sql_global= 'SET SQL_LOG_BIN=1';
+set global test_sql_service_execute_sql_global= 'insert into test.t1 select 3 as a, @@SQL_LOG_BIN';
+set global test_sql_service_execute_sql_global= 'SET SQL_LOG_BIN=0';
+set global test_sql_service_execute_sql_global= 'insert into test.t1 select 4 as a, @@SQL_LOG_BIN';
+set global test_sql_service_execute_sql_global= 'SET sql_auto_is_null=1';
+set global test_sql_service_execute_sql_global= 'insert into test.t1 select 5 as a, @@sql_auto_is_null';
+set global test_sql_service_execute_sql_global= 'SET sql_auto_is_null=0';
+set global test_sql_service_execute_sql_global= 'insert into test.t1 select 6 as a, @@sql_auto_is_null';
+select * from t1 order by a;
+drop table t1;
+SET SQL_LOG_BIN=0;
set global test_sql_service_run_test= 1;
-show status like 'test_sql_service%';
+show status like 'test_sql_service_passed';
+
+set global test_sql_service_execute_sql_local= 'create table test.t1(id int)';
+show status like 'test_sql_query_result';
+
+set global test_sql_service_execute_sql_local= 'insert into test.t1 values (1), (2)';
+show status like 'test_sql_query_result';
+
+set global test_sql_service_execute_sql_local= 'select * from test.t1';
+show status like 'test_sql_query_result';
+
+set global test_sql_service_execute_sql_local= 'drop table test.t1';
+show status like 'test_sql_query_result';
+
+set global test_sql_service_execute_sql_local= 'drop table test.t1';
+show status like 'test_sql_query_result';
+
+set global test_sql_service_execute_sql_global= 'create table test.t1(id int)';
+show status like 'test_sql_query_result';
+
+set global test_sql_service_execute_sql_global= 'insert into test.t1 values (1), (2)';
+show status like 'test_sql_query_result';
+
+set global test_sql_service_execute_sql_global= 'select * from test.t1';
+show status like 'test_sql_query_result';
+
+set global test_sql_service_execute_sql_global= 'drop table test.t1';
+show status like 'test_sql_query_result';
+
+set global test_sql_service_execute_sql_global= 'drop table test.t1';
+show status like 'test_sql_query_result';
+
+create table t1 (id int, time timestamp);
+insert into t1 values (1, NULL), (2, NULL), (3, NULL), (4, NULL), (5, NULL);
+set global test_sql_service_execute_sql_global= 'select * FROM test.t1 WHERE time < DATE_SUB(NOW(), interval 5 minute)';
+show status like 'test_sql_query_result';
+set global test_sql_service_execute_sql_global= 'select * FROM test.t1 WHERE time <= NOW()';
+show status like 'test_sql_query_result';
+set global test_sql_service_execute_sql_local= 'select * FROM test.t1 WHERE time < DATE_SUB(NOW(), interval 5 minute)';
+show status like 'test_sql_query_result';
+set global test_sql_service_execute_sql_local= 'select * FROM test.t1 WHERE time <= NOW()';
+show status like 'test_sql_query_result';
+drop table t1;
uninstall plugin test_sql_service;
+# Check that statements were executed/binlogged in correct order.
+source include/show_binlog_events.inc;
+# --replace_column 2 # 5 #
+# --replace_regex /xid=[0-9]+/xid=XX/ /GTID [0-9]+-[0-9]+-[0-9]+/GTID #-#-#/
+# SHOW BINLOG EVENTS LIMIT 3,100;
+
diff --git a/mysql-test/suite/roles/definer.result b/mysql-test/suite/roles/definer.result
index 249fb8198a7..8b5e36d8b3c 100644
--- a/mysql-test/suite/roles/definer.result
+++ b/mysql-test/suite/roles/definer.result
@@ -321,7 +321,9 @@ CREATE TABLE `t1` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1,10,100),(2,20,200);
+INSERT INTO `t1` VALUES
+(1,10,100),
+(2,20,200);
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
@@ -330,7 +332,8 @@ CREATE TABLE `t2` (
`c` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t2` VALUES (2,20,200);
+INSERT INTO `t2` VALUES
+(2,20,200);
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
diff --git a/mysql-test/suite/rpl/include/rpl_extra_col_master.test b/mysql-test/suite/rpl/include/rpl_extra_col_master.test
index 02645a577f5..0d397b7e3ba 100644
--- a/mysql-test/suite/rpl/include/rpl_extra_col_master.test
+++ b/mysql-test/suite/rpl/include/rpl_extra_col_master.test
@@ -825,7 +825,7 @@ SELECT c1,hex(c4),c5,c6,c7 FROM t16 ORDER BY c1;
--echo *****************
--echo
connection slave;
-# 1072 = ER_KEY_COLUMN_DOES_NOT_EXITS
+# 1072 = ER_KEY_COLUMN_DOES_NOT_EXIST
--let $slave_sql_errno= 1072
--let $show_slave_sql_error= 1
--source include/wait_for_slave_sql_error.inc
diff --git a/mysql-test/suite/rpl/include/rpl_mixed_dml.inc b/mysql-test/suite/rpl/include/rpl_mixed_dml.inc
index bb1a2c173de..e9e1fd512b4 100644
--- a/mysql-test/suite/rpl/include/rpl_mixed_dml.inc
+++ b/mysql-test/suite/rpl/include/rpl_mixed_dml.inc
@@ -29,7 +29,7 @@ INSERT INTO t2 VALUES(1, 't2, text 1');
--echo
--echo ******************** DELETE ********************
DELETE FROM t1 WHERE a = 1;
-DELETE FROM t2 WHERE b <> UUID();
+DELETE FROM t2 WHERE b <> SYS_GUID();
--source suite/rpl/include/rpl_mixed_check_select.inc
--source suite/rpl/include/rpl_mixed_clear_tables.inc
@@ -37,7 +37,7 @@ DELETE FROM t2 WHERE b <> UUID();
--echo
--echo ******************** INSERT ********************
INSERT INTO t1 VALUES(1, 't1, text 1');
-INSERT INTO t1 VALUES(2, UUID());
+INSERT INTO t1 VALUES(2, SYS_GUID());
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t2 VALUES (1, 't1, text 1') ON DUPLICATE KEY UPDATE b = 't2, text 1';
DELETE FROM t1 WHERE a = 2;
@@ -60,7 +60,7 @@ INSERT INTO t1 VALUES(1, 't1, text 1');
INSERT INTO t1 VALUES(2, 't1, text 2');
INSERT INTO t1 VALUES(3, 't1, text 3');
REPLACE INTO t1 VALUES(1, 't1, text 11');
-REPLACE INTO t1 VALUES(2, UUID());
+REPLACE INTO t1 VALUES(2, SYS_GUID());
REPLACE INTO t1 SET a=3, b='t1, text 33';
DELETE FROM t1 WHERE a = 2;
--source suite/rpl/include/rpl_mixed_check_select.inc
@@ -70,7 +70,7 @@ DELETE FROM t1 WHERE a = 2;
--echo
--echo ******************** SELECT ********************
INSERT INTO t1 VALUES(1, 't1, text 1');
-SELECT * FROM t1 WHERE b <> UUID() ORDER BY a;
+SELECT * FROM t1 WHERE b <> SYS_GUID() ORDER BY a;
--source suite/rpl/include/rpl_mixed_clear_tables.inc
# JOIN
@@ -89,7 +89,7 @@ SELECT * FROM t1 INNER JOIN t2 ON t1.b = t2.b ORDER BY t1.a,t2.a;
--echo ******************** UNION ********************
INSERT INTO t1 VALUES(1, 't1, text 1');
INSERT INTO t2 VALUES(1, 't2, text 1');
-SELECT * FROM t1 UNION SELECT * FROM t2 WHERE t2.b <> UUID();
+SELECT * FROM t1 UNION SELECT * FROM t2 WHERE t2.b <> SYS_GUID();
--source suite/rpl/include/rpl_mixed_clear_tables.inc
# TRUNCATE
@@ -144,7 +144,7 @@ START TRANSACTION;
INSERT INTO t1 VALUES (5, 'before savepoint s2');
SAVEPOINT s2;
INSERT INTO t1 VALUES (6, 'after savepoint s2');
-INSERT INTO t1 VALUES (7, CONCAT('with UUID() ',UUID()));
+INSERT INTO t1 VALUES (7, CONCAT('with SYS_GUID() ',SYS_GUID()));
RELEASE SAVEPOINT s2;
COMMIT;
DELETE FROM t1 WHERE a = 7;
@@ -257,7 +257,7 @@ BEGIN
END|
CREATE PROCEDURE p2 ()
BEGIN
- UPDATE t1 SET b = UUID() WHERE a = 202;
+ UPDATE t1 SET b = SYS_GUID() WHERE a = 202;
END|
DELIMITER ;|
INSERT INTO t1 VALUES(201, 'test 201');
@@ -309,7 +309,7 @@ DROP EVENT e2;
INSERT INTO t1 VALUES(1, 'test1');
INSERT INTO t1 VALUES(2, 'test2');
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a = 1;
-CREATE VIEW v2 AS SELECT * FROM t1 WHERE b <> UUID();
+CREATE VIEW v2 AS SELECT * FROM t1 WHERE b <> SYS_GUID();
--source suite/rpl/include/rpl_mixed_check_view.inc
ALTER VIEW v1 AS SELECT * FROM t1 WHERE a = 2;
--source suite/rpl/include/rpl_mixed_check_view.inc
@@ -323,7 +323,7 @@ DROP VIEW v2;
--echo ******************** SHOW BINLOG EVENTS ********************
--source include/show_binlog_events.inc
sync_slave_with_master;
-# as we're using UUID we don't SELECT but use "diff" like in rpl_row_UUID
+# as we're using SYS_GUID we don't SELECT but use "diff" like in rpl_row_SYS_GUID
--exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info test_rpl > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_master.sql
--exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info test_rpl > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_slave.sql
diff --git a/mysql-test/suite/rpl/include/rpl_switch_stm_row_mixed.inc b/mysql-test/suite/rpl/include/rpl_switch_stm_row_mixed.inc
index 31b80732c60..d814a257711 100644
--- a/mysql-test/suite/rpl/include/rpl_switch_stm_row_mixed.inc
+++ b/mysql-test/suite/rpl/include/rpl_switch_stm_row_mixed.inc
@@ -10,7 +10,7 @@
# - Master is switching explicitly between STATEMENT, ROW, and MIXED
# binlog format showing when it is possible and when not.
# - Master switching from MIXED to RBR implicitly listing all use
-# cases, e.g a query invokes UUID(), thereafter to serve as the
+# cases, e.g a query invokes SYS_GUID(), thereafter to serve as the
# definition of MIXED binlog format
# - correctness of execution
@@ -56,18 +56,18 @@ select @@global.binlog_format, @@session.binlog_format;
CREATE TABLE t1 (a varchar(100));
-prepare stmt1 from 'insert into t1 select concat(UUID(),?)';
+prepare stmt1 from 'insert into t1 select concat(SYS_GUID(),?)';
set @string="emergency_1_";
insert into t1 values("work_2_");
execute stmt1 using @string;
deallocate prepare stmt1;
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_3_"));
+insert into t1 values(concat(SYS_GUID(),"work_3_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_4_",UUID()));
+insert into t1 values(concat("for_4_",SYS_GUID()));
insert into t1 select "yesterday_5_";
# verify that temp tables prevent a switch to SBR
@@ -129,41 +129,41 @@ select @@global.binlog_format, @@session.binlog_format;
set binlog_format=default;
select @@global.binlog_format, @@session.binlog_format;
-prepare stmt1 from 'insert into t1 select concat(UUID(),?)';
+prepare stmt1 from 'insert into t1 select concat(SYS_GUID(),?)';
set @string="emergency_17_";
insert into t1 values("work_18_");
execute stmt1 using @string;
deallocate prepare stmt1;
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_19_"));
+insert into t1 values(concat(SYS_GUID(),"work_19_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_20_",UUID()));
+insert into t1 values(concat("for_20_",SYS_GUID()));
insert into t1 select "yesterday_21_";
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_22_"));
+insert into t1 values(concat(SYS_GUID(),"work_22_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_23_",UUID()));
+insert into t1 values(concat("for_23_",SYS_GUID()));
insert into t1 select "yesterday_24_";
# Test of CREATE TABLE SELECT
-create table t2 ENGINE=MyISAM select rpad(UUID(),100,' ');
-create table t3 select 1 union select UUID();
+create table t2 ENGINE=MyISAM select rpad(SYS_GUID(),100,' ');
+create table t3 select 1 union select SYS_GUID();
--disable_warnings
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
-create table t4 select * from t1 where 3 in (select 1 union select 2 union select UUID() union select 3);
+create table t4 select * from t1 where 3 in (select 1 union select 2 union select SYS_GUID() union select 3);
--enable_warnings
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
create table t5 select * from t1 where 3 in (select 1 union select 2 union select curdate() union select 3);
-# what if UUID() is first:
+# what if SYS_GUID() is first:
--disable_warnings
-insert ignore into t5 select UUID() from t1 where 3 in (select 1 union select 2 union select 3 union select * from t4);
+insert ignore into t5 select SYS_GUID() from t1 where 3 in (select 1 union select 2 union select 3 union select * from t4);
--enable_warnings
# inside a stored procedure
@@ -172,14 +172,14 @@ delimiter |;
create procedure foo()
begin
insert into t1 values("work_25_");
-insert into t1 values(concat("for_26_",UUID()));
+insert into t1 values(concat("for_26_",SYS_GUID()));
insert into t1 select "yesterday_27_";
end|
create procedure foo2()
begin
-insert into t1 values(concat("emergency_28_",UUID()));
+insert into t1 values(concat("emergency_28_",SYS_GUID()));
insert into t1 values("work_29_");
-insert into t1 values(concat("for_30_",UUID()));
+insert into t1 values(concat("for_30_",SYS_GUID()));
set session binlog_format=row; # accepted for stored procs
insert into t1 values("more work_31_");
set session binlog_format=mixed;
@@ -199,7 +199,7 @@ delimiter ;|
call foo();
call foo2();
call foo4("hello");
-call foo4(UUID());
+call foo4(SYS_GUID());
call foo4("world");
# test that can't SET in a stored function
@@ -249,7 +249,7 @@ deallocate prepare stmt1;
delimiter |;
create function foo5() returns bigint unsigned
begin
- insert into t2 select UUID();
+ insert into t2 select SYS_GUID();
return 100;
end|
delimiter ;|
@@ -260,7 +260,7 @@ execute stmt1;
execute stmt1;
deallocate prepare stmt1;
-# A simple stored function where UUID() is in the argument
+# A simple stored function where SYS_GUID() is in the argument
delimiter |;
create function foo6(x varchar(100)) returns bigint unsigned
begin
@@ -269,17 +269,17 @@ begin
end|
delimiter ;|
select foo6("foo6_1_");
-select foo6(concat("foo6_2_",UUID()));
+select foo6(concat("foo6_2_",SYS_GUID()));
-prepare stmt1 from 'select foo6(concat("foo6_3_",UUID()))';
+prepare stmt1 from 'select foo6(concat("foo6_3_",SYS_GUID()))';
execute stmt1;
execute stmt1;
deallocate prepare stmt1;
-# Test of views using UUID()
+# Test of views using SYS_GUID()
-create view v1 as select uuid();
+create view v1 as select SYS_GUID();
create table t11 (data varchar(255));
insert into t11 select * from v1;
# Test of querying INFORMATION_SCHEMA which parses the view's body,
@@ -291,18 +291,18 @@ execute stmt1;
execute stmt1;
deallocate prepare stmt1;
-# Test of triggers with UUID()
+# Test of triggers with SYS_GUID()
delimiter |;
create trigger t11_bi before insert on t11 for each row
begin
- set NEW.data = concat(NEW.data,UUID());
+ set NEW.data = concat(NEW.data,SYS_GUID());
end|
delimiter ;|
insert into t11 values("try_560_");
# Test that INSERT DELAYED works in mixed mode (BUG#20649)
insert delayed into t2 values("delay_1_");
-insert delayed into t2 values(concat("delay_2_",UUID()));
+insert delayed into t2 values(concat("delay_2_",SYS_GUID()));
insert delayed into t2 values("delay_6_");
# Test for BUG#20633 (INSERT DELAYED RAND()/user_variable does not
@@ -482,7 +482,7 @@ sync_slave_with_master;
# Test for BUG#20499 "mixed mode with temporary table breaks binlog"
# Slave used to have only 2 rows instead of 3.
connection master;
-CREATE TEMPORARY TABLE t15 SELECT UUID();
+CREATE TEMPORARY TABLE t15 SELECT SYS_GUID();
create table t16 like t15;
INSERT INTO t16 SELECT * FROM t15;
# we'll verify that this one is done RBB
@@ -546,7 +546,7 @@ DROP TABLE IF EXISTS t12;
SET SESSION BINLOG_FORMAT=MIXED;
CREATE TABLE t12 (data LONG);
LOCK TABLES t12 WRITE;
-INSERT INTO t12 VALUES(UUID());
+INSERT INTO t12 VALUES(SYS_GUID());
UNLOCK TABLES;
sync_slave_with_master;
@@ -587,7 +587,7 @@ INSERT INTO t13 VALUES (my_current_user());
sync_slave_with_master;
-# as we're using UUID we don't SELECT but use "diff" like in rpl_row_UUID
+# as we're using SYS_GUID we don't SELECT but use "diff" like in rpl_row_UUID
--exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info mysqltest1 > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_master.sql
--exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info mysqltest1 > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_slave.sql
diff --git a/mysql-test/suite/rpl/include/start_alter_basic.inc b/mysql-test/suite/rpl/include/start_alter_basic.inc
new file mode 100644
index 00000000000..f6e4b6b3253
--- /dev/null
+++ b/mysql-test/suite/rpl/include/start_alter_basic.inc
@@ -0,0 +1,60 @@
+#
+# Run start alter basic tests (CA/RA with given engine)
+# Params:-
+# $engine
+# $sync_slave
+# master_node and slave_node connection should be defined
+
+--echo # $engine
+--connection master_node
+--eval create table t1(a int, b int) engine=$engine;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+--echo # Normal Alter
+alter table t1 add column c int;
+show create table t1;
+--echo # Failed Alter
+insert into t1 values(1,1, NULL);
+--error ER_DUP_ENTRY
+alter table t1 change a a int unique;
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+
+# The following restriction should be removed post MDEV-26005 fix.
+# TODO MDEV-26130 , should be removed after fixing
+#if ($engine != 'aria')
+#{
+#--eval create temporary table tmp_tbl(a int, b int) engine=$engine;
+#insert into tmp_tbl values(1,1);
+#insert into tmp_tbl values(2,2);
+#--echo # Normal Alter
+#alter table tmp_tbl add column c int;
+#--echo # Failed Alter
+#insert into tmp_tbl values(1,1, NULL);
+#--error ER_DUP_ENTRY
+#alter table tmp_tbl change a a int unique ;
+#show create table tmp_tbl;
+#}
+if ($sync_slave)
+{
+ --source include/save_master_gtid.inc
+ --connection slave_node
+ --source include/sync_with_master_gtid.inc
+ show create table t1;
+}
+
+--connection master_node
+drop table t1;
+#if ($engine != 'aria')
+#{
+#drop temporary table tmp_tbl;
+#}
+if ($sync_slave)
+{
+ --source include/save_master_gtid.inc
+ --connection slave_node
+ --source include/sync_with_master_gtid.inc
+}
diff --git a/mysql-test/suite/rpl/include/start_alter_concurrent.inc b/mysql-test/suite/rpl/include/start_alter_concurrent.inc
new file mode 100644
index 00000000000..e5472152807
--- /dev/null
+++ b/mysql-test/suite/rpl/include/start_alter_concurrent.inc
@@ -0,0 +1,230 @@
+#
+# ==== Purpose ====
+#
+# Run concurrent split alter on given storage engine
+# With concurrent 10 connections
+#
+# ==== Usage ====
+#
+# --let $alter_engine= Engine Name (myisam , innodb ...)
+# --let $alter_algorithm= ...
+# --let $alter_online = [][ONLINE]
+# --let $domain_1=
+# --let $domain_2=
+# --let $M_port= //Master port
+# --let $S_port= //Slave port
+# --let $sync_slave= // 0/1 whether to sync slave with master or not
+#
+
+
+--connection master_node
+set global debug_dbug="+d,start_alter_delay_master";
+
+--let $i= 1
+while($i < 11)
+{
+ if($i == 1 && $domain_1)
+ {
+ --eval set gtid_domain_id= $domain_1;
+ }
+ if($i == 6 && $domain_2)
+ {
+ --eval set gtid_domain_id= $domain_2;
+ }
+ --eval create table t$i( a int primary key, b int) engine=$alter_engine
+ --eval insert into t$i values(1,1),(2,2)
+ --inc $i
+}
+
+
+if ($sync_slave)
+{
+ --echo # Sync slave
+ --source include/save_master_gtid.inc
+ --connection slave_node
+ --source include/sync_with_master_gtid.inc
+ --connection master_node
+}
+
+--let $i= 1
+while($i < 21)
+{
+ if($i == 1 || $i == 11)
+ {
+ if($domain_1)
+ {
+ --eval set global gtid_domain_id= $domain_1;
+ }
+ }
+ if($i == 6 || $i == 16)
+ {
+ if($domain_2)
+ {
+ --eval set global gtid_domain_id= $domain_2;
+ }
+ }
+ connect(con$i,127.0.0.1,root,,$db_name, $M_port);
+ --inc $i
+}
+
+--let $i= 1
+while($i < 11)
+{
+ --connection con$i
+ --send_eval alter $alter_online table t$i add column c int, force, algorithm=$alter_algorithm
+ --inc $i
+}
+
+--connection master_node
+set DEBUG_SYNC= "now signal alter_cont";
+
+--let $i= 1
+while($i < 11)
+{
+ --connection con$i
+ --reap
+ --inc $i
+}
+--connection master_node
+set DEBUG_SYNC= 'RESET';
+
+if ($sync_slave)
+{
+ --echo # Sync slave
+ --source include/save_master_gtid.inc
+ --connection slave_node
+ --source include/sync_with_master_gtid.inc
+ --connection master_node
+}
+
+
+--echo # Concurrent DML
+--let $i= 1
+while($i < 11)
+{
+ --connection con$i
+ --send_eval alter table t$i add column d int, force, algorithm=$alter_algorithm
+ --inc $i
+}
+
+if ($alter_algorithm == "inplace")
+{
+ --sleep 1
+ --let $i= 11
+ --let $j= 1
+ while($i < 21)
+ {
+ --connection con$i
+ --send_eval insert into t$j values(5,5,5);
+ --inc $i
+ --inc $j
+ }
+
+ --let $i= 11
+ while($i < 21)
+ {
+ --connection con$i
+ --reap
+ --inc $i
+ }
+
+ if ($sync_slave)
+ {
+ --echo # Sync slave
+ --source include/save_master_gtid.inc
+ --connection slave_node
+ --source include/sync_with_master_gtid.inc
+ --connection master_node
+ }
+}
+--connection master_node
+set DEBUG_SYNC= "now signal alter_cont";
+--let $i= 1
+while($i < 11)
+{
+ --connection con$i
+ --reap
+ --inc $i
+}
+--connection master_node
+set DEBUG_SYNC= 'RESET';
+
+if ($sync_slave)
+{
+ --echo # Sync slave
+ --source include/save_master_gtid.inc
+ --connection slave_node
+ --source include/sync_with_master_gtid.inc
+ --connection master_node
+}
+
+
+--echo # Rollback tests
+--let $i= 1
+while($i < 11)
+{
+ --connection con$i
+ --eval insert into t$i values(3,2,1,1)
+ --send_eval alter table t$i change b b int unique, force, algorithm=$alter_algorithm
+ --inc $i
+}
+--connection master_node
+set DEBUG_SYNC= "now signal alter_cont";
+
+
+--let $i= 1
+while ($i < 11)
+{
+ --connection con$i
+ --error ER_DUP_ENTRY
+ --reap
+ --inc $i
+}
+--connection master_node
+set DEBUG_SYNC= 'RESET';
+
+
+if ($sync_slave)
+{
+ --echo # Sync slave
+ --source include/save_master_gtid.inc
+ --connection slave_node
+ --source include/sync_with_master_gtid.inc
+ --connection master_node
+}
+
+if ($sync_slave)
+{
+ --enable_query_log
+ --echo # diff_table of master and slave , we will do only in the case when
+ --echo # sync_slave is on
+ --let $i= 1
+ while($i < 11)
+ {
+ --let $diff_tables= master_node:t$i, slave_node:t$i
+ source include/diff_tables.inc;
+ --inc $i
+ }
+ --disable_query_log
+}
+
+--connection master_node
+drop table t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
+
+if ($sync_slave)
+{
+ --echo # Sync slave
+ --source include/save_master_gtid.inc
+ --connection slave_node
+ --source include/sync_with_master_gtid.inc
+ --connection master_node
+}
+
+--let $i= 1
+while ($i < 21)
+{
+ --disconnect con$i
+ --inc $i
+}
+--connection master_node
+SET GLOBAL debug_dbug= "";
diff --git a/mysql-test/suite/rpl/include/start_alter_include.inc b/mysql-test/suite/rpl/include/start_alter_include.inc
new file mode 100644
index 00000000000..c66075c0164
--- /dev/null
+++ b/mysql-test/suite/rpl/include/start_alter_include.inc
@@ -0,0 +1,64 @@
+#
+# ==== Purpose ====
+#
+# Run concurrent split alter on different storage engine and with sync to given
+# master
+#
+# ==== Usage ====
+# --let $domain_1=
+# --let $domain_2=
+# --let $M_port= //Master port
+# --let $S_port= //Slave port
+# --let $sync_slave=
+# --let $db_name=
+#
+
+connect(master_node,127.0.0.1,root,,$db_name, $M_port);
+if (!$sync_slave)
+{
+ --eval set gtid_domain_id= $domain_1;
+}
+connect(slave_node,127.0.0.1,root,,test, $S_port);
+if (!$sync_slave)
+{
+ --eval set gtid_domain_id= $domain_2;
+}
+
+--let $engine=myisam
+--source include/start_alter_basic.inc
+
+--let $engine=innodb
+--source include/start_alter_basic.inc
+
+--let $engine=aria
+--source include/start_alter_basic.inc
+
+--disable_query_log
+--disable_warnings
+--connection master_node
+--echo # concurrent alter Myisam
+--let $alter_engine=myisam
+--let $alter_algorithm=copy
+--source include/start_alter_concurrent.inc
+
+--connection master_node
+--echo # concurrent alter Aria
+--let $alter_engine=aria
+--let $alter_algorithm=copy
+--source include/start_alter_concurrent.inc
+
+--connection master_node
+--echo # concurrent alter Innodb copy
+--let $alter_engine=innodb
+--let $alter_algorithm=copy
+--source include/start_alter_concurrent.inc
+
+--connection master_node
+--echo # concurrent alter Innodb Inplace
+--let $alter_engine=innodb
+--let $alter_algorithm=inplace
+--source include/start_alter_concurrent.inc
+--disconnect master_node
+--disconnect slave_node
+--enable_warnings
+--enable_query_log
diff --git a/mysql-test/suite/rpl/include/start_alter_options.inc b/mysql-test/suite/rpl/include/start_alter_options.inc
new file mode 100644
index 00000000000..72c7104b114
--- /dev/null
+++ b/mysql-test/suite/rpl/include/start_alter_options.inc
@@ -0,0 +1,399 @@
+# This test will test all the option related to the Alter Table command
+# NOTE not all alter statements will follow alter_algorithm since for some statements
+# copy is only option
+# parameters
+# $alter_algorithm {DEFAULT|INPLACE|COPY|NOCOPY|INSTANT}
+# $show_binlog
+#
+--let $force_needed= force ,
+# Error that is caused by a particular ALTER's option combination
+--let $alter_error = 0
+
+--connection slave
+stop slave;
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+change master to master_use_gtid= current_pos;
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+start slave;
+--connection master
+set binlog_alter_two_phase=true;
+create table t1(a int , b int) engine=innodb;
+create table a1(a int , b int) engine=myisam;
+create temporary table tmp_tbl(a int, b int) engine=innodb;
+
+# These are grammer rules for ALTER TABLE we will got through all alter table
+# rules in this test.
+# | ADD [COLUMN] [IF NOT EXISTS] col_name column_definition
+# [FIRST | AFTER col_name ]
+# | ADD [COLUMN] [IF NOT EXISTS] (col_name column_definition,...)
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_ALTER_OPERATION_NOT_SUPPORTED
+}
+--error 0,$alter_error
+--eval alter table t1 add column if not exists c int , $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_ALTER_OPERATION_NOT_SUPPORTED
+}
+--error 0,$alter_error
+--eval alter table t1 add column d int first, $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_BAD_FIELD_ERROR
+}
+--error 0,$alter_error
+--eval alter table t1 add column e int after c, $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_BAD_FIELD_ERROR
+}
+--error 0,$alter_error
+--eval alter table t1 add column f int after c, $force_needed add column g int first ,add column h char, algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop column c, drop column d, drop column e, drop column f, drop column g , drop column h, $force_needed algorithm=$alter_algorithm
+if ($alter_algorithm == 'copy')
+{
+--eval alter table tmp_tbl add column if not exists c int , $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl add column d int first, $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl add column e int after c, $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl add column f int after c, $force_needed add column g int first ,add column h char, algorithm=$alter_algorithm
+--eval alter table tmp_tbl drop column c, drop column d, drop column e, drop column f, drop column g , drop column h, $force_needed algorithm=$alter_algorithm
+}
+--echo # show binlog and clear status
+--sync_slave_with_master
+if ($show_binlog)
+{
+ --source include/show_binlog_events.inc
+}
+reset master;
+--connection master
+
+
+#
+# | ADD {INDEX|KEY} [IF NOT EXISTS] [index_name]
+# [index_type] (index_col_name,...) [index_option] ...
+# | ADD [CONSTRAINT [symbol]]
+# UNIQUE [INDEX|KEY] [index_name]
+# [index_type] (index_col_name,...) [index_option] ...
+#
+# | ADD FULLTEXT [INDEX|KEY] [index_name]
+# (index_col_name,...) [index_option] ...
+# | DROP [COLUMN] [IF EXISTS] col_name [RESTRICT|CASCADE]
+# | DROP PRIMARY KEY
+# | DROP {INDEX|KEY} [IF EXISTS] index_name
+# | DROP FOREIGN KEY [IF EXISTS] fk_symbol
+# | DROP CONSTRAINT [IF EXISTS] constraint_name
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_ALTER_OPERATION_NOT_SUPPORTED
+}
+--error 0,$alter_error
+--eval alter table t1 add column f int after b, $force_needed add column g int first ,add column h varchar(100), algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_KEY_COLUMN_DOES_NOT_EXIST
+}
+--error 0,$alter_error
+--eval alter table t1 add index if not exists index_1(f), $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop index index_1, $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_KEY_COLUMN_DOES_NOT_EXIST
+}
+--error 0,$alter_error
+--eval alter table t1 add unique key unique_1(g), $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop index unique_1, $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_KEY_COLUMN_DOES_NOT_EXIST
+}
+--error 0,$alter_error
+--eval alter table t1 add fulltext key f_1(h), $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop column f, drop column g , $force_needed algorithm=$alter_algorithm
+if ($alter_algorithm == 'copy')
+{
+--eval alter table tmp_tbl add column f int after b, $force_needed add column g int first ,add column h varchar(100), algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_KEY_COLUMN_DOES_NOT_EXIST
+}
+--error 0,$alter_error
+--eval alter table tmp_tbl add index if not exists index_1(f), $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl drop index index_1, $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl add unique key unique_1(g), $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl drop index unique_1, $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl drop column f, drop column g , $force_needed algorithm=$alter_algorithm
+}
+# | ADD [CONSTRAINT [symbol]] PRIMARY KEY
+# [index_type] (index_col_name,...) [index_option] ...
+# primary key changes cant use inplace algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_KEY_COLUMN_DOES_NOT_EXIST
+}
+--error 0,$alter_error
+--eval alter table t1 add primary key(h), $force_needed algorithm=copy
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop primary key, $force_needed algorithm=copy
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop column h, $force_needed algorithm=copy
+if ($alter_algorithm == 'copy')
+{
+--eval alter table tmp_tbl add primary key(h), $force_needed algorithm=copy
+--eval alter table tmp_tbl drop primary key, $force_needed algorithm=copy
+--eval alter table tmp_tbl drop column h, $force_needed algorithm=copy
+}
+--echo # show binlog and clear status
+--sync_slave_with_master
+if ($show_binlog)
+{
+ --source include/show_binlog_events.inc
+}
+reset master;
+--connection master
+
+## NOTE force_needed and algorithm will not be used for system versioning
+# | ADD PERIOD FOR SYSTEM_TIME (start_column_name, end_column_name)
+# | ADD SYSTEM VERSIONING
+# | DROP SYSTEM VERSIONING
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_ALTER_OPERATION_NOT_SUPPORTED
+}
+--error 0,$alter_error
+--eval alter table t1 add column f varchar(100) after b, add column g varchar(100) first ,add column h char, $force_needed algorithm=$alter_algorithm
+--eval alter table t1 add period for system_time(f,h)
+--eval alter table t1 add system versioning
+--eval alter table t1 drop system versioning
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop column f, drop column g , drop column h, $force_needed algorithm=$alter_algorithm
+--echo # show binlog and clear status
+if ($alter_algorithm == 'copy')
+{
+--eval alter table tmp_tbl add column f varchar(100) after b, add column g varchar(100) first ,add column h char, $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl drop column f, drop column g , drop column h, $force_needed algorithm=$alter_algorithm
+}
+--sync_slave_with_master
+if ($show_binlog)
+{
+ --source include/show_binlog_events.inc
+}
+reset master;
+--connection master
+
+
+# | ALTER [COLUMN] col_name SET DEFAULT literal | (expression)
+# | ALTER [COLUMN] col_name DROP DEFAULT
+# | CHANGE [COLUMN] [IF EXISTS] old_col_name new_col_name column_definition
+# [FIRST|AFTER col_name]
+# | MODIFY [COLUMN] [IF EXISTS] col_name column_definition
+# [FIRST | AFTER col_name]
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_ALTER_OPERATION_NOT_SUPPORTED
+}
+--error 0,$alter_error
+--eval alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, $force_needed algorithm=$alter_algorithm ;
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_BAD_FIELD_ERROR
+}
+--error 0,$alter_error
+--eval alter table t1 alter column f set default "****", $force_needed algorithm=$alter_algorithm ;
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_BAD_FIELD_ERROR
+}
+--error 0,$alter_error
+--eval alter table t1 alter column f drop default, $force_needed algorithm=$alter_algorithm ;
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_BAD_FIELD_ERROR
+}
+--error 0,$alter_error
+--eval alter table t1 change column g new_g char, $force_needed algorithm=copy;
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_BAD_FIELD_ERROR
+}
+--error 0,$alter_error
+--eval alter table t1 modify column h varchar(100), $force_needed algorithm=copy;
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop column new_g ,drop column f, drop column h, $force_needed algorithm=$alter_algorithm ;
+if ($alter_algorithm == 'copy')
+{
+--eval alter table tmp_tbl add column f varchar(100) after b,add column g varchar(100) first ,add column h char, $force_needed algorithm=$alter_algorithm ;
+--eval alter table tmp_tbl alter column f set default "****", $force_needed algorithm=$alter_algorithm ;
+--eval alter table tmp_tbl alter column f drop default, $force_needed algorithm=$alter_algorithm ;
+--eval alter table tmp_tbl change column g new_g char, $force_needed algorithm=copy;
+--eval alter table tmp_tbl modify column h varchar(100), $force_needed algorithm=copy;
+--eval alter table tmp_tbl drop column new_g ,drop column f, drop column h, $force_needed algorithm=$alter_algorithm ;
+}
+--echo # show binlog and clear status
+--sync_slave_with_master
+if ($show_binlog)
+{
+ --source include/show_binlog_events.inc
+}
+reset master;
+--connection master
+
+# | DISABLE KEYS
+# | ENABLE KEYS
+# | RENAME [TO] new_tbl_name
+# | ORDER BY col_name [, col_name] ...
+# | RENAME COLUMN old_col_name TO new_col_name
+# | RENAME {INDEX|KEY} old_index_name TO new_index_name
+# | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
+# | [DEFAULT] CHARACTER SET [=] charset_name
+# | [DEFAULT] COLLATE [=] collation_name
+# | DISCARD TABLESPACE
+# | IMPORT TABLESPACE
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_ALTER_OPERATION_NOT_SUPPORTED
+}
+--error 0,$alter_error
+--eval alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_KEY_COLUMN_DOES_NOT_EXIST
+}
+--error 0,$alter_error
+--eval alter table t1 add index if not exists index_1(f), $force_needed algorithm=$alter_algorithm
+--eval alter table t1 disable keys, $force_needed algorithm=copy
+--eval alter table t1 enable keys, $force_needed algorithm=copy
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_ALTER_OPERATION_NOT_SUPPORTED
+}
+--error 0,$alter_error
+--eval alter table t1 rename t2, $force_needed algorithm=$alter_algorithm
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_NO_SUCH_TABLE
+}
+--error 0,$alter_error
+--eval alter table t2 rename t1, $force_needed algorithm=$alter_algorithm
+--eval alter table a1 order by a
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_BAD_FIELD_ERROR
+}
+--error 0,$alter_error
+--eval alter table t1 rename column f to new_f, $force_needed algorithm=copy
+--eval alter table t1 convert to character set 'utf8', $force_needed algorithm=copy
+--eval alter table t1 default character set 'utf8', $force_needed algorithm=copy
+--eval alter table t1 default collate 'utf8_icelandic_ci', $force_needed algorithm=copy
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop column new_f ,drop column g, drop column h, $force_needed algorithm=$alter_algorithm
+if ($alter_algorithm == 'copy')
+{
+--eval alter table tmp_tbl add column f varchar(100) after b,add column g varchar(100) first ,add column h char, $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl add index if not exists index_1(f), $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl disable keys, $force_needed algorithm=copy
+--eval alter table tmp_tbl enable keys, $force_needed algorithm=copy
+--eval alter table a1 order by a
+--eval alter table tmp_tbl rename column f to new_f, $force_needed algorithm=copy
+--eval alter table tmp_tbl convert to character set 'utf8', $force_needed algorithm=copy
+--eval alter table tmp_tbl default character set 'utf8', $force_needed algorithm=copy
+--eval alter table tmp_tbl default collate 'utf8_icelandic_ci', $force_needed algorithm=copy
+--eval alter table tmp_tbl drop column new_f ,drop column g, drop column h, $force_needed algorithm=$alter_algorithm
+}
+##--eval alter table t1 discard tablespace;
+######--eval alter table t1 import tablespace;
+
+--echo # show binlog and clear status
+--sync_slave_with_master
+if ($show_binlog)
+{
+ --source include/show_binlog_events.inc
+}
+reset master;
+--connection master
+
+# Only add partition and remove partition is tested
+# | ADD PARTITION (partition_definition)
+# | REMOVE PARTITIONING
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_ALTER_OPERATION_NOT_SUPPORTED
+}
+--error 0,$alter_error
+--eval alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, $force_needed algorithm=$alter_algorithm
+--eval alter table t1 partition by hash(b) partitions 8
+--eval alter table t1 remove partitioning
+if (`select '$alter_algorithm' = 'instant' or '$alter_algorithm' = 'nocopy'`)
+{
+ --let $alter_error=ER_CANT_DROP_FIELD_OR_KEY
+}
+--error 0,$alter_error
+--eval alter table t1 drop column f ,drop column g, drop column h, $force_needed algorithm=$alter_algorithm
+if ($alter_algorithm == 'copy')
+{
+--eval alter table tmp_tbl add column f varchar(100) after b,add column g varchar(100) first ,add column h char, $force_needed algorithm=$alter_algorithm
+--eval alter table tmp_tbl drop column f ,drop column g, drop column h, $force_needed algorithm=$alter_algorithm
+}
+--echo # show binlog and clear status
+--sync_slave_with_master
+if ($show_binlog)
+{
+ --source include/show_binlog_events.inc
+}
+reset master;
+--connection master
+
+# clean master/slave
+--connection master
+drop table t1, a1;
+drop temporary table tmp_tbl;
+--sync_slave_with_master
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+--source include/start_slave.inc
diff --git a/mysql-test/suite/rpl/r/rpl_alter_rollback.result b/mysql-test/suite/rpl/r/rpl_alter_rollback.result
new file mode 100644
index 00000000000..3bd91a516c4
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_alter_rollback.result
@@ -0,0 +1,54 @@
+#
+# Test verifies that "ROLLBACK ALTER" is written to binary log upon
+#ALTER command execution failure.
+#
+include/master-slave.inc
+[connection master]
+connection master;
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+create table t1 (f1 int primary key) engine=InnoDB;
+create table t2 (f1 int primary key,
+constraint c1 foreign key (f1) references t1(f1),
+constraint c1 foreign key (f1) references t1(f1)) engine=InnoDB;
+ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed")
+create table t2 (f1 int primary key,
+constraint c1 foreign key (f1) references t1(f1)) engine=innodb;
+alter table t2 add constraint c1 foreign key (f1) references t1(f1);
+ERROR HY000: Can't create table `test`.`t2` (errno: 121 "Duplicate key on write or update")
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid # # GTID #-#-#
+master-bin.000001 # Query # # use `test`; create table t1 (f1 int primary key) engine=InnoDB
+master-bin.000001 # Gtid # # GTID #-#-#
+master-bin.000001 # Query # # use `test`; create table t2 (f1 int primary key,
+constraint c1 foreign key (f1) references t1(f1)) engine=innodb
+master-bin.000001 # Gtid # # GTID #-#-# START ALTER
+master-bin.000001 # Query # # use `test`; alter table t2 add constraint c1 foreign key (f1) references t1(f1)
+master-bin.000001 # Gtid # # GTID #-#-# ROLLBACK ALTER id=#
+master-bin.000001 # Query # # use `test`; alter table t2 add constraint c1 foreign key (f1) references t1(f1)
+set foreign_key_checks = 0;
+alter table t2 add constraint c1 foreign key (f1) references t1(f1);
+ERROR HY000: Duplicate FOREIGN KEY constraint name 'test/c1'
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid # # GTID #-#-#
+master-bin.000001 # Query # # use `test`; create table t1 (f1 int primary key) engine=InnoDB
+master-bin.000001 # Gtid # # GTID #-#-#
+master-bin.000001 # Query # # use `test`; create table t2 (f1 int primary key,
+constraint c1 foreign key (f1) references t1(f1)) engine=innodb
+master-bin.000001 # Gtid # # GTID #-#-# START ALTER
+master-bin.000001 # Query # # use `test`; alter table t2 add constraint c1 foreign key (f1) references t1(f1)
+master-bin.000001 # Gtid # # GTID #-#-# ROLLBACK ALTER id=#
+master-bin.000001 # Query # # use `test`; alter table t2 add constraint c1 foreign key (f1) references t1(f1)
+master-bin.000001 # Gtid # # GTID #-#-# START ALTER
+master-bin.000001 # Query # # use `test`; set foreign_key_checks=1; alter table t2 add constraint c1 foreign key (f1) references t1(f1)
+master-bin.000001 # Gtid # # GTID #-#-# ROLLBACK ALTER id=#
+master-bin.000001 # Query # # use `test`; set foreign_key_checks=1; alter table t2 add constraint c1 foreign key (f1) references t1(f1)
+connection slave;
+connection master;
+drop table t2, t1;
+connection slave;
+connection master;
+set global binlog_alter_two_phase=0;;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result b/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result
index 54156685806..4c35d42d90a 100644
--- a/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result
+++ b/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result
@@ -3,6 +3,7 @@ include/master-slave.inc
*** Test that we check against incorrect table definition for mysql.gtid_slave_pos ***
connection master;
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
+call mtr.add_suppression("Incorrect definition of table mysql.gtid_slave_pos:.*");
connection slave;
connection slave;
include/stop_slave.inc
@@ -83,16 +84,16 @@ ERROR 25000: You are not allowed to execute this command in a transaction
ROLLBACK;
SET GLOBAL gtid_strict_mode= 1;
SET GLOBAL gtid_slave_pos = "0-1-1";
-ERROR HY000: Specified GTID 0-1-1 conflicts with the binary log which contains a more recent GTID 0-2-11. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos
+ERROR HY000: Specified GTID 0-1-1 conflicts with the binary log which contains a more recent GTID 0-2-12. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos
SET GLOBAL gtid_slave_pos = "";
-ERROR HY000: Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-11. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos
+ERROR HY000: Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-12. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos
SET GLOBAL gtid_strict_mode= 0;
SET GLOBAL gtid_slave_pos = "0-1-1";
Warnings:
-Warning 1947 Specified GTID 0-1-1 conflicts with the binary log which contains a more recent GTID 0-2-11. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos
+Warning 1947 Specified GTID 0-1-1 conflicts with the binary log which contains a more recent GTID 0-2-12. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos
SET GLOBAL gtid_slave_pos = "";
Warnings:
-Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-11. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos
+Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-12. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos
RESET MASTER;
SET GLOBAL gtid_slave_pos = "0-1-1";
START SLAVE;
diff --git a/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result b/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
index 7dd3907f102..513bc26a1cc 100644
--- a/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
+++ b/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
@@ -33,7 +33,7 @@ INSERT INTO t2 VALUES(1, 't2, text 1');
******************** DELETE ********************
DELETE FROM t1 WHERE a = 1;
-DELETE FROM t2 WHERE b <> UUID();
+DELETE FROM t2 WHERE b <> SYS_GUID();
SELECT COUNT(*) FROM t1;
COUNT(*)
1
@@ -64,7 +64,7 @@ DELETE FROM t2;
******************** INSERT ********************
INSERT INTO t1 VALUES(1, 't1, text 1');
-INSERT INTO t1 VALUES(2, UUID());
+INSERT INTO t1 VALUES(2, SYS_GUID());
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t2 VALUES (1, 't1, text 1') ON DUPLICATE KEY UPDATE b = 't2, text 1';
DELETE FROM t1 WHERE a = 2;
@@ -143,7 +143,7 @@ INSERT INTO t1 VALUES(1, 't1, text 1');
INSERT INTO t1 VALUES(2, 't1, text 2');
INSERT INTO t1 VALUES(3, 't1, text 3');
REPLACE INTO t1 VALUES(1, 't1, text 11');
-REPLACE INTO t1 VALUES(2, UUID());
+REPLACE INTO t1 VALUES(2, SYS_GUID());
REPLACE INTO t1 SET a=3, b='t1, text 33';
DELETE FROM t1 WHERE a = 2;
SELECT COUNT(*) FROM t1;
@@ -178,7 +178,7 @@ DELETE FROM t2;
******************** SELECT ********************
INSERT INTO t1 VALUES(1, 't1, text 1');
-SELECT * FROM t1 WHERE b <> UUID() ORDER BY a;
+SELECT * FROM t1 WHERE b <> SYS_GUID() ORDER BY a;
a b
1 t1, text 1
DELETE FROM t1;
@@ -203,7 +203,7 @@ DELETE FROM t2;
******************** UNION ********************
INSERT INTO t1 VALUES(1, 't1, text 1');
INSERT INTO t2 VALUES(1, 't2, text 1');
-SELECT * FROM t1 UNION SELECT * FROM t2 WHERE t2.b <> UUID();
+SELECT * FROM t1 UNION SELECT * FROM t2 WHERE t2.b <> SYS_GUID();
a b
1 t1, text 1
1 t2, text 1
@@ -430,7 +430,7 @@ START TRANSACTION;
INSERT INTO t1 VALUES (5, 'before savepoint s2');
SAVEPOINT s2;
INSERT INTO t1 VALUES (6, 'after savepoint s2');
-INSERT INTO t1 VALUES (7, CONCAT('with UUID() ',UUID()));
+INSERT INTO t1 VALUES (7, CONCAT('with SYS_GUID() ',SYS_GUID()));
RELEASE SAVEPOINT s2;
COMMIT;
DELETE FROM t1 WHERE a = 7;
@@ -598,7 +598,7 @@ UPDATE t1 SET b = 'test' WHERE a = 201;
END|
CREATE PROCEDURE p2 ()
BEGIN
-UPDATE t1 SET b = UUID() WHERE a = 202;
+UPDATE t1 SET b = SYS_GUID() WHERE a = 202;
END|
INSERT INTO t1 VALUES(201, 'test 201');
CALL p1();
@@ -790,7 +790,7 @@ DELETE FROM t2;
INSERT INTO t1 VALUES(1, 'test1');
INSERT INTO t1 VALUES(2, 'test2');
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a = 1;
-CREATE VIEW v2 AS SELECT * FROM t1 WHERE b <> UUID();
+CREATE VIEW v2 AS SELECT * FROM t1 WHERE b <> SYS_GUID();
SHOW CREATE VIEW v1;
View Create View character_set_client collation_connection
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a`,`t1`.`b` AS `b` from `t1` where `t1`.`a` = 1 latin1 latin1_swedish_ci
@@ -850,7 +850,7 @@ master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `test_rpl`; DELETE FROM t1 WHERE a = 1
master-bin.000001 # Xid # # COMMIT /* XID */
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
-master-bin.000001 # Annotate_rows # # DELETE FROM t2 WHERE b <> UUID()
+master-bin.000001 # Annotate_rows # # DELETE FROM t2 WHERE b <> SYS_GUID()
master-bin.000001 # Table_map # # table_id: # (test_rpl.t2)
master-bin.000001 # Delete_rows_v1 # # table_id: # flags: STMT_END_F
master-bin.000001 # Xid # # COMMIT /* XID */
@@ -864,7 +864,7 @@ master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `test_rpl`; INSERT INTO t1 VALUES(1, 't1, text 1')
master-bin.000001 # Xid # # COMMIT /* XID */
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
-master-bin.000001 # Annotate_rows # # INSERT INTO t1 VALUES(2, UUID())
+master-bin.000001 # Annotate_rows # # INSERT INTO t1 VALUES(2, SYS_GUID())
master-bin.000001 # Table_map # # table_id: # (test_rpl.t1)
master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
master-bin.000001 # Xid # # COMMIT /* XID */
@@ -912,7 +912,7 @@ master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `test_rpl`; REPLACE INTO t1 VALUES(1, 't1, text 11')
master-bin.000001 # Xid # # COMMIT /* XID */
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
-master-bin.000001 # Annotate_rows # # REPLACE INTO t1 VALUES(2, UUID())
+master-bin.000001 # Annotate_rows # # REPLACE INTO t1 VALUES(2, SYS_GUID())
master-bin.000001 # Table_map # # table_id: # (test_rpl.t1)
master-bin.000001 # Update_rows_v1 # # table_id: # flags: STMT_END_F
master-bin.000001 # Xid # # COMMIT /* XID */
@@ -1007,7 +1007,7 @@ master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `test_rpl`; INSERT INTO t1 VALUES (5, 'before savepoint s2')
master-bin.000001 # Query # # SAVEPOINT `s2`
master-bin.000001 # Query # # use `test_rpl`; INSERT INTO t1 VALUES (6, 'after savepoint s2')
-master-bin.000001 # Annotate_rows # # INSERT INTO t1 VALUES (7, CONCAT('with UUID() ',UUID()))
+master-bin.000001 # Annotate_rows # # INSERT INTO t1 VALUES (7, CONCAT('with SYS_GUID() ',SYS_GUID()))
master-bin.000001 # Table_map # # table_id: # (test_rpl.t1)
master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
master-bin.000001 # Xid # # COMMIT /* XID */
@@ -1049,7 +1049,7 @@ END
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test_rpl`; CREATE DEFINER=`root`@`localhost` PROCEDURE `p2`()
BEGIN
-UPDATE t1 SET b = UUID() WHERE a = 202;
+UPDATE t1 SET b = SYS_GUID() WHERE a = 202;
END
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `test_rpl`; INSERT INTO t1 VALUES(201, 'test 201')
@@ -1061,7 +1061,7 @@ master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `test_rpl`; INSERT INTO t1 VALUES(202, 'test 202')
master-bin.000001 # Xid # # COMMIT /* XID */
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
-master-bin.000001 # Annotate_rows # # UPDATE t1 SET b = UUID() WHERE a = 202
+master-bin.000001 # Annotate_rows # # UPDATE t1 SET b = SYS_GUID() WHERE a = 202
master-bin.000001 # Table_map # # table_id: # (test_rpl.t1)
master-bin.000001 # Update_rows_v1 # # table_id: # flags: STMT_END_F
master-bin.000001 # Xid # # COMMIT /* XID */
@@ -1124,7 +1124,7 @@ master-bin.000001 # Xid # # COMMIT /* XID */
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test_rpl`; CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS SELECT * FROM t1 WHERE a = 1
master-bin.000001 # Gtid # # GTID #-#-#
-master-bin.000001 # Query # # use `test_rpl`; CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS SELECT * FROM t1 WHERE b <> UUID()
+master-bin.000001 # Query # # use `test_rpl`; CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS SELECT * FROM t1 WHERE b <> SYS_GUID()
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test_rpl`; ALTER ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS SELECT * FROM t1 WHERE a = 2
master-bin.000001 # Gtid # # GTID #-#-#
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_1.result b/mysql-test/suite/rpl/r/rpl_start_alter_1.result
new file mode 100644
index 00000000000..9edb23216fe
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_1.result
@@ -0,0 +1,313 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+connection slave;
+set global gtid_strict_mode=1;
+# Legacy Master Slave
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# concurrent alter Myisam
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Aria
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb copy
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb Inplace
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+connection master;
+include/save_master_gtid.inc
+connection slave;
+include/sync_with_master_gtid.inc
+set global gtid_strict_mode = 0;;
+connection master;
+set global binlog_alter_two_phase=0;;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_2.result b/mysql-test/suite/rpl/r/rpl_start_alter_2.result
new file mode 100644
index 00000000000..a862fc5556a
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_2.result
@@ -0,0 +1,326 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+connection slave;
+set global gtid_strict_mode=1;
+connection slave;
+include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=10;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+include/start_slave.inc
+# Parallel Slave
+connection master;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# concurrent alter Myisam
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Aria
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb copy
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb Inplace
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+connection master;
+include/save_master_gtid.inc
+connection slave;
+include/sync_with_master_gtid.inc
+# cleanup
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+set global gtid_domain_id= 0;
+include/start_slave.inc
+connection master;
+set global binlog_alter_two_phase=0;;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_3.result b/mysql-test/suite/rpl/r/rpl_start_alter_3.result
new file mode 100644
index 00000000000..97754401471
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_3.result
@@ -0,0 +1,326 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+connection slave;
+set global gtid_strict_mode=1;
+connection slave;
+include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+include/start_slave.inc
+# Parallel Slave
+connection master;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# concurrent alter Myisam
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Aria
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb copy
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb Inplace
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+connection master;
+include/save_master_gtid.inc
+connection slave;
+include/sync_with_master_gtid.inc
+# cleanup
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+set global gtid_domain_id= 0;
+include/start_slave.inc
+connection master;
+set global binlog_alter_two_phase=0;;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_4.result b/mysql-test/suite/rpl/r/rpl_start_alter_4.result
new file mode 100644
index 00000000000..9d7d6376bba
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_4.result
@@ -0,0 +1,327 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+connection slave;
+set global gtid_strict_mode=1;
+connection slave;
+include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=10;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+include/start_slave.inc
+# Parallel Slave
+connection master;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# concurrent alter Myisam
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Aria
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb copy
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb Inplace
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+connection master;
+include/save_master_gtid.inc
+connection slave;
+include/sync_with_master_gtid.inc
+# cleanup
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+set global gtid_domain_id= 0;
+include/start_slave.inc
+connection master;
+set global binlog_alter_two_phase=0;;
+set global gtid_domain_id= 0;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_5.result b/mysql-test/suite/rpl/r/rpl_start_alter_5.result
new file mode 100644
index 00000000000..4e592c1931f
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_5.result
@@ -0,0 +1,327 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+connection slave;
+set global gtid_strict_mode=1;
+connection slave;
+include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+include/start_slave.inc
+# Parallel Slave
+connection master;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# concurrent alter Myisam
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Aria
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb copy
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb Inplace
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+connection master;
+include/save_master_gtid.inc
+connection slave;
+include/sync_with_master_gtid.inc
+# cleanup
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+set global gtid_domain_id= 0;
+include/start_slave.inc
+connection master;
+set global binlog_alter_two_phase=0;;
+set global gtid_domain_id= 0;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_6.result b/mysql-test/suite/rpl/r/rpl_start_alter_6.result
new file mode 100644
index 00000000000..6c26d511ee2
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_6.result
@@ -0,0 +1,329 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+connection slave;
+set global gtid_strict_mode=1;
+connection slave;
+include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=10;
+set global slave_parallel_mode=optimistic;
+set global slave_domain_parallel_threads=3;
+change master to master_use_gtid=slave_pos;
+include/start_slave.inc
+# Parallel Slave
+connection master;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+# concurrent alter Myisam
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Aria
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb copy
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# concurrent alter Innodb Inplace
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Concurrent DML
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+# diff_table of master and slave , we will do only in the case when
+# sync_slave is on
+include/diff_tables.inc [master_node:t1, slave_node:t1]
+include/diff_tables.inc [master_node:t2, slave_node:t2]
+include/diff_tables.inc [master_node:t3, slave_node:t3]
+include/diff_tables.inc [master_node:t4, slave_node:t4]
+include/diff_tables.inc [master_node:t5, slave_node:t5]
+include/diff_tables.inc [master_node:t6, slave_node:t6]
+include/diff_tables.inc [master_node:t7, slave_node:t7]
+include/diff_tables.inc [master_node:t8, slave_node:t8]
+include/diff_tables.inc [master_node:t9, slave_node:t9]
+include/diff_tables.inc [master_node:t10, slave_node:t10]
+# Sync slave
+include/save_master_gtid.inc
+include/sync_with_master_gtid.inc
+connection master;
+include/save_master_gtid.inc
+connection slave;
+include/sync_with_master_gtid.inc
+# cleanup
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+set global slave_domain_parallel_threads = 0;;
+set global gtid_domain_id= 0;
+include/start_slave.inc
+connection master;
+set global binlog_alter_two_phase=0;;
+set global gtid_domain_id= 0;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_7.result b/mysql-test/suite/rpl/r/rpl_start_alter_7.result
new file mode 100644
index 00000000000..cfe31497179
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_7.result
@@ -0,0 +1,368 @@
+connect server_1,127.0.0.1,root,,,$SERVER_MYPORT_1;
+connect server_2,127.0.0.1,root,,,$SERVER_MYPORT_2;
+connect server_3,127.0.0.1,root,,,$SERVER_MYPORT_3;
+connection server_1;
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+connection server_2;
+stop slave;
+Warnings:
+Note 1255 Slave already has been stopped
+set global binlog_alter_two_phase=true;
+connection server_3;
+SET GLOBAL slave_parallel_threads=8;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+connection server_1;
+set gtid_domain_id= 11;
+create database s1;
+use s1;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+set gtid_domain_id= 11;;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+set gtid_domain_id= 11;;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+# concurrent alter Myisam
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Aria
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb copy
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb Inplace
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+connection server_1;
+drop database s1;
+select @@gtid_binlog_pos;
+@@gtid_binlog_pos
+11-1-412
+connection server_2;
+set gtid_domain_id= 12;
+create database s2;
+use s2;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+set gtid_domain_id= 12;;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+set gtid_domain_id= 12;;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+# concurrent alter Myisam
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Aria
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb copy
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb Inplace
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+connection server_2;
+drop database s2;
+select @@gtid_binlog_pos;
+@@gtid_binlog_pos
+12-2-412
+connection server_3;
+start all slaves;
+Warnings:
+Note 1937 SLAVE 'm2' started
+Note 1937 SLAVE 'm1' started
+set default_master_connection = 'm1';
+include/wait_for_slave_to_start.inc
+set default_master_connection = 'm2';
+include/wait_for_slave_to_start.inc
+set default_master_connection = 'm1';
+include/sync_with_master_gtid.inc
+set default_master_connection = 'm2';
+include/sync_with_master_gtid.inc
+# cleanup
+connection server_3;
+set default_master_connection = 'm1';
+include/stop_slave.inc
+set default_master_connection = 'm2';
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+set global gtid_domain_id= 0;
+reset master;
+RESET SLAVE ALL;
+SET GLOBAL gtid_slave_pos= '';
+connection server_1;
+set global binlog_alter_two_phase=0;;
+set global gtid_domain_id= 0;
+reset master;
+connection server_2;
+set global gtid_domain_id= 0;
+set global binlog_alter_two_phase=0;
+reset master;
+disconnect server_1;
+disconnect server_2;
+disconnect server_3;
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_8.result b/mysql-test/suite/rpl/r/rpl_start_alter_8.result
new file mode 100644
index 00000000000..8002f295f5c
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_8.result
@@ -0,0 +1,362 @@
+connect server_1,127.0.0.1,root,,,$SERVER_MYPORT_1;
+connect server_2,127.0.0.1,root,,,$SERVER_MYPORT_2;
+connect server_3,127.0.0.1,root,,,$SERVER_MYPORT_3;
+connection server_1;
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+connection server_2;
+stop slave;
+Warnings:
+Note 1255 Slave already has been stopped
+set global binlog_alter_two_phase=true;
+connection server_3;
+SET GLOBAL slave_parallel_threads=20;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+connection server_1;
+set gtid_domain_id= 11;
+create database s1;
+use s1;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+set gtid_domain_id= 11;;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+set gtid_domain_id= 11;;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+# concurrent alter Myisam
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Aria
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb copy
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb Inplace
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+connection server_1;
+drop database s1;
+connection server_2;
+set gtid_domain_id= 12;
+create database s2;
+use s2;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+set gtid_domain_id= 12;;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+set gtid_domain_id= 12;;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+# concurrent alter Myisam
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Aria
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb copy
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb Inplace
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+connection server_2;
+drop database s2;
+connection server_3;
+start all slaves;
+Warnings:
+Note 1937 SLAVE 'm2' started
+Note 1937 SLAVE 'm1' started
+set default_master_connection = 'm1';
+include/wait_for_slave_to_start.inc
+set default_master_connection = 'm2';
+include/wait_for_slave_to_start.inc
+set default_master_connection = 'm1';
+include/sync_with_master_gtid.inc
+set default_master_connection = 'm2';
+include/sync_with_master_gtid.inc
+# cleanup
+connection server_3;
+set default_master_connection = 'm1';
+include/stop_slave.inc
+set default_master_connection = 'm2';
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+set global gtid_domain_id= 0;
+reset master;
+RESET SLAVE ALL;
+SET GLOBAL gtid_slave_pos= '';
+connection server_1;
+set global binlog_alter_two_phase=0;;
+set global gtid_domain_id= 0;
+reset master;
+connection server_2;
+set global gtid_domain_id= 0;
+set global binlog_alter_two_phase=0;;
+reset master;
+disconnect server_1;
+disconnect server_2;
+disconnect server_3;
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_bugs.result b/mysql-test/suite/rpl/r/rpl_start_alter_bugs.result
new file mode 100644
index 00000000000..3fb3df27afd
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_bugs.result
@@ -0,0 +1,33 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set global binlog_alter_two_phase=true;
+connection slave;
+stop slave;
+SET global slave_parallel_threads=2;
+set global slave_parallel_mode=optimistic;
+start slave;
+connection master;
+CREATE TABLE t1 (i int primary key) ENGINE = InnoDB;
+connection master1;
+ALTER TABLE t1 DROP PRIMARY KEY;
+ALTER TABLE t1 ADD UNIQUE KEY ui (i);
+ALTER TABLE t1 ADD PRIMARY KEY (i);
+connection slave;
+connection master;
+drop table t1;
+CREATE TABLE t1 (a int)engine=innodb;
+ALTER TABLE t1 add column b int, LOCK=EXCLUSIVE;
+drop table t1;
+CREATE TABLE t1 (pk int)engine=innodb;
+ALTER TABLE t1 DROP FOREIGN KEY y, LOCK=EXCLUSIVE;
+ERROR 42000: Can't DROP FOREIGN KEY `y`; check that it exists
+drop table t1;
+connection slave;
+connection master;
+set global binlog_alter_two_phase=false;
+connection slave;
+include/stop_slave.inc
+SET global slave_parallel_threads=0;
+include/start_slave.inc
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_chain_basic.result b/mysql-test/suite/rpl/r/rpl_start_alter_chain_basic.result
new file mode 100644
index 00000000000..b6c28458561
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_chain_basic.result
@@ -0,0 +1,83 @@
+include/rpl_init.inc [topology=1->2->3->4]
+connection server_3;
+set global gtid_strict_mode=1;
+include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=10;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+include/start_slave.inc
+connection server_1;
+set global binlog_alter_two_phase=ON;
+set binlog_alter_two_phase=ON;
+connect master_node,127.0.0.1,root,,$db_name, $SERVER_MYPORT_1;
+connect slave_node,127.0.0.1,root,,test, $SERVER_MYPORT_2;
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+include/save_master_gtid.inc
+connection slave_node;
+include/sync_with_master_gtid.inc
+disconnect master_node;
+disconnect slave_node;
+connection server_1;
+set global binlog_alter_two_phase=0;
+include/rpl_sync.inc
+connection server_2;
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+domain_id seq_no
+0 12
+connection server_3;
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+domain_id seq_no
+0 12
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+include/start_slave.inc
+select @@slave_parallel_threads;
+@@slave_parallel_threads
+0
+connection server_4;
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+domain_id seq_no
+0 12
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_ftwrl.result b/mysql-test/suite/rpl/r/rpl_start_alter_ftwrl.result
new file mode 100644
index 00000000000..4f22c2a1f5f
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_ftwrl.result
@@ -0,0 +1,60 @@
+include/master-slave.inc
+[connection master]
+connection slave;
+include/stop_slave.inc
+SET @@global.slave_parallel_threads=4;
+SET @@global.slave_parallel_mode=optimistic;
+CHANGE MASTER TO master_use_gtid=slave_pos;
+SET @@global.debug_dbug="+d,at_write_start_alter";
+include/start_slave.inc
+connection master;
+SET @@session.binlog_alter_two_phase=true;
+CREATE TABLE t1 (a INT) ENGINE=innodb;
+include/save_master_gtid.inc
+connection slave;
+include/sync_with_master_gtid.inc
+connection master;
+SET @@session.alter_algorithm='INSTANT';
+SET @@session.gtid_domain_id=11;
+ALTER TABLE t1 ADD COLUMN b int;
+# START Alter having exclusive lock is waiting for the signal
+connection slave;
+# FTWRL is sent first to wait for SA
+connection slave1;
+FLUSH TABLES WITH READ LOCK;
+# SA completes
+connection slave;
+set DEBUG_SYNC= "now signal alter_cont";
+connection slave1;
+connection slave;
+# Release CA
+connection slave1;
+UNLOCK TABLES;
+connection master;
+connection slave;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-bin.000001 # Gtid # # GTID #-#-#
+slave-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a INT) ENGINE=innodb
+slave-bin.000001 # Gtid # # GTID #-#-# START ALTER
+slave-bin.000001 # Query # # use `test`; ALTER TABLE t1 ADD COLUMN b int
+slave-bin.000001 # Gtid # # GTID #-#-# COMMIT ALTER id=#
+slave-bin.000001 # Query # # use `test`; ALTER TABLE t1 ADD COLUMN b int
+connection master;
+DROP TABLE t1;
+connection slave;
+# cleanup
+connection slave;
+set DEBUG_SYNC = RESET;
+include/stop_slave.inc
+set global slave_parallel_threads = 0;
+set global slave_parallel_mode = optimistic;
+set @@global.debug_dbug = "";
+include/start_slave.inc
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_instant.result b/mysql-test/suite/rpl/r/rpl_start_alter_instant.result
new file mode 100644
index 00000000000..17aaad81aa4
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_instant.result
@@ -0,0 +1,66 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set binlog_alter_two_phase=true;
+CREATE OR REPLACE TABLE tab (
+a int PRIMARY KEY,
+b varchar(50),
+c varchar(50)
+) CHARACTER SET=latin1 engine=innodb;
+SET SESSION alter_algorithm='INSTANT';
+ALTER TABLE tab MODIFY COLUMN b varchar(100);
+SET SESSION alter_algorithm='NOCOPY';
+ALTER TABLE tab MODIFY COLUMN c varchar(100);
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `a` int(11) NOT NULL,
+ `b` varchar(100) DEFAULT NULL,
+ `c` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid # # GTID #-#-#
+master-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE tab (
+a int PRIMARY KEY,
+b varchar(50),
+c varchar(50)
+) CHARACTER SET=latin1 engine=innodb
+master-bin.000001 # Gtid # # GTID #-#-# START ALTER
+master-bin.000001 # Query # # use `test`; ALTER TABLE tab MODIFY COLUMN b varchar(100)
+master-bin.000001 # Gtid # # GTID #-#-# COMMIT ALTER id=#
+master-bin.000001 # Query # # use `test`; ALTER TABLE tab MODIFY COLUMN b varchar(100)
+master-bin.000001 # Gtid # # GTID #-#-# START ALTER
+master-bin.000001 # Query # # use `test`; ALTER TABLE tab MODIFY COLUMN c varchar(100)
+master-bin.000001 # Gtid # # GTID #-#-# COMMIT ALTER id=#
+master-bin.000001 # Query # # use `test`; ALTER TABLE tab MODIFY COLUMN c varchar(100)
+connection slave;
+SHOW CREATE TABLE tab;
+Table Create Table
+tab CREATE TABLE `tab` (
+ `a` int(11) NOT NULL,
+ `b` varchar(100) DEFAULT NULL,
+ `c` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-bin.000001 # Gtid # # GTID #-#-#
+slave-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE tab (
+a int PRIMARY KEY,
+b varchar(50),
+c varchar(50)
+) CHARACTER SET=latin1 engine=innodb
+slave-bin.000001 # Gtid # # GTID #-#-# START ALTER
+slave-bin.000001 # Query # # use `test`; ALTER TABLE tab MODIFY COLUMN b varchar(100)
+slave-bin.000001 # Gtid # # GTID #-#-# COMMIT ALTER id=#
+slave-bin.000001 # Query # # use `test`; ALTER TABLE tab MODIFY COLUMN b varchar(100)
+slave-bin.000001 # Gtid # # GTID #-#-# START ALTER
+slave-bin.000001 # Query # # use `test`; ALTER TABLE tab MODIFY COLUMN c varchar(100)
+slave-bin.000001 # Gtid # # GTID #-#-# COMMIT ALTER id=#
+slave-bin.000001 # Query # # use `test`; ALTER TABLE tab MODIFY COLUMN c varchar(100)
+connection master;
+DROP TABLE tab;
+connection slave;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_1.result b/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_1.result
new file mode 100644
index 00000000000..e008bbc81a7
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_1.result
@@ -0,0 +1,172 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set global binlog_alter_two_phase=true;
+connection slave;
+include/stop_slave.inc
+change master to master_use_gtid= current_pos;
+set global gtid_strict_mode=1;
+# Legacy Master Slave
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+set gtid_domain_id= 0;;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+set gtid_domain_id= 0;;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+# concurrent alter Myisam
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Aria
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb copy
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb Inplace
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+connection master;
+select @@gtid_binlog_state;
+@@gtid_binlog_state
+0-1-410
+RESET master;
+connection slave;
+select @@gtid_binlog_state;
+@@gtid_binlog_state
+0-1-410
+set global gtid_strict_mode=0;
+include/start_slave.inc
+connection master;
+set global binlog_alter_two_phase=false;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_2.result b/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_2.result
new file mode 100644
index 00000000000..2c1ae667fd6
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_2.result
@@ -0,0 +1,419 @@
+connect server_1,127.0.0.1,root,,,$SERVER_MYPORT_1;
+connect server_2,127.0.0.1,root,,,$SERVER_MYPORT_2;
+connect server_3,127.0.0.1,root,,,$SERVER_MYPORT_3;
+connection server_1;
+SET @save_binlog_alter_two_phase= @@GLOBAL.binlog_alter_two_phase;
+SET GLOBAL binlog_alter_two_phase = ON;
+SET binlog_alter_two_phase = ON;
+# Create table and perform CA and RA
+CREATE TABLE t1( a INT, b INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(1,1);
+INSERT INTO t1 VALUES(2,2);
+# Normal Alter
+ALTER TABLE t1 ADD COLUMN c INT;
+# Failed Alter
+INSERT INTO t1 VALUES(1,1, NULL);
+ALTER TABLE t1 CHANGE a a INT UNIQUE;
+ERROR 23000: Duplicate entry '1' for key 'a'
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT @@gtid_binlog_state;
+@@gtid_binlog_state
+0-1-8
+# apply the binlog
+DROP TABLE t1;
+# reset the binlog
+RESET MASTER;
+# execute the binlog
+SELECT @@gtid_binlog_state;
+@@gtid_binlog_state
+0-1-8
+# Same as before
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t1;
+# reset the binlog
+RESET MASTER;
+RESET SLAVE;
+connection server_2;
+SET @save_binlog_alter_two_phase= @@GLOBAL.binlog_alter_two_phase;
+SET GLOBAL binlog_alter_two_phase = ON;
+connection server_3;
+SET @save_gtid_strict_mode= @@GLOBAL.gtid_strict_mode;
+SET @slave_parallel_threads= @@GLOBAL.slave_parallel_threads;
+SET @slave_parallel_mode= @@GLOBAL.slave_parallel_mode;
+SET GLOBAL slave_parallel_threads=20;
+SET GLOBAL slave_parallel_mode=optimistic;
+SET GLOBAL gtid_strict_mode=1;
+connection server_1;
+SET gtid_domain_id= 11;
+CREATE DATABASE s1;
+USE s1;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+set gtid_domain_id= 11;;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+set gtid_domain_id= 11;;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+# concurrent alter Myisam
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Aria
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb copy
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb Inplace
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+connection server_1;
+DROP DATABASE s1;
+connection server_2;
+SET gtid_domain_id= 12;
+CREATE DATABASE s2;
+USE s2;
+connect master_node,127.0.0.1,root,,$db_name, $M_port;
+set gtid_domain_id= 12;;
+connect slave_node,127.0.0.1,root,,test, $S_port;
+set gtid_domain_id= 12;;
+# myisam
+connection master_node;
+create table t1(a int, b int) engine=myisam;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# innodb
+connection master_node;
+create table t1(a int, b int) engine=innodb;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master_node;
+drop table t1;
+# aria
+connection master_node;
+create table t1(a int, b int) engine=aria;;
+insert into t1 values(1,1);
+insert into t1 values(2,2);
+# Normal Alter
+alter table t1 add column c int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+# Failed Alter
+insert into t1 values(1,1, NULL);
+alter table t1 change a a int unique;
+ERROR 23000: Duplicate entry '1' for key 'a'
+set @@session.binlog_alter_two_phase = 0;
+alter table t1 change a a int;
+set @@session.binlog_alter_two_phase = 1;
+alter table t1 change a a int;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1
+connection master_node;
+drop table t1;
+# concurrent alter Myisam
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Aria
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb copy
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+# concurrent alter Innodb Inplace
+# Concurrent DML
+# Rollback tests
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+ERROR 23000: Duplicate entry '2' for key 'b'
+connection server_2;
+DROP DATABASE s2;
+connection server_3;
+START ALL SLAVES;
+Warnings:
+Note 1937 SLAVE 'm2' started
+Note 1937 SLAVE 'm1' started
+SET default_master_connection = 'm1';
+include/wait_for_slave_to_start.inc
+SET default_master_connection = 'm2';
+include/wait_for_slave_to_start.inc
+SET default_master_connection = 'm1';
+include/sync_with_master_gtid.inc
+SET default_master_connection = 'm2';
+include/sync_with_master_gtid.inc
+# Stop slaves and apply binlog
+connection server_3;
+SET default_master_connection = 'm1';
+include/stop_slave.inc
+SET default_master_connection = 'm2';
+include/stop_slave.inc
+SET GLOBAL slave_parallel_threads = @slave_parallel_threads;
+SET GLOBAL slave_parallel_mode = @slave_parallel_mode;
+SET GLOBAL gtid_strict_mode = @save_gtid_strict_mode;
+SET GLOBAL gtid_domain_id= 0;
+SELECT @@gtid_binlog_state;
+@@gtid_binlog_state
+11-1-412,12-2-412
+# reset the binlog
+RESET MASTER;
+# execute the binlog
+SELECT @@gtid_binlog_state;
+@@gtid_binlog_state
+11-1-412,12-2-412
+# One more time to simulate S->S case
+RESET MASTER;
+# execute the binlog
+SELECT @@gtid_binlog_state;
+@@gtid_binlog_state
+11-1-412,12-2-412
+RESET MASTER;
+RESET SLAVE ALL;
+SET GLOBAL gtid_slave_pos= '';
+connection server_1;
+SET GLOBAL binlog_alter_two_phase=@save_binlog_alter_two_phase;
+SET GLOBAL gtid_domain_id= 0;
+RESET MASTER;
+connection server_2;
+SET GLOBAL gtid_domain_id= 0;
+SET GLOBAL binlog_alter_two_phase=@save_binlog_alter_two_phase;
+RESET MASTER;
+disconnect server_1;
+disconnect server_2;
+disconnect server_3;
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_optimize.result b/mysql-test/suite/rpl/r/rpl_start_alter_optimize.result
new file mode 100644
index 00000000000..24f016e93a0
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_optimize.result
@@ -0,0 +1,18 @@
+include/master-slave.inc
+[connection master]
+connection master;
+set binlog_alter_two_phase = ON;
+connection master;
+CREATE TABLE t1 (i int) engine=innodb;
+CREATE TABLE t2 (i int) engine=innodb;
+ALTER TABLE t1 DROP CONSTRAINT IF EXISTS y;
+Warnings:
+Note 1091 Can't DROP CONSTRAINT `y`; check that it exists
+OPTIMIZE TABLE t2;
+Table Op Msg_type Msg_text
+test.t2 optimize note Table does not support optimize, doing recreate + analyze instead
+test.t2 optimize status OK
+connection slave;
+connection master;
+drop table t1,t2;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_options.result b/mysql-test/suite/rpl/r/rpl_start_alter_options.result
new file mode 100644
index 00000000000..30854b12be1
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_options.result
@@ -0,0 +1,497 @@
+include/master-slave.inc
+[connection master]
+connection slave;
+stop slave;
+change master to master_use_gtid= current_pos;
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+start slave;
+connection master;
+set binlog_alter_two_phase=true;
+create table t1(a int , b int) engine=innodb;
+create table a1(a int , b int) engine=myisam;
+create temporary table tmp_tbl(a int, b int) engine=innodb;
+alter table t1 add column if not exists c int , force , algorithm=default;
+alter table t1 add column d int first, force , algorithm=default;
+alter table t1 add column e int after c, force , algorithm=default;
+alter table t1 add column f int after c, force , add column g int first ,add column h char, algorithm=default;
+alter table t1 drop column c, drop column d, drop column e, drop column f, drop column g , drop column h, force , algorithm=default;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f int after b, force , add column g int first ,add column h varchar(100), algorithm=default;
+alter table t1 add index if not exists index_1(f), force , algorithm=default;
+alter table t1 drop index index_1, force , algorithm=default;
+alter table t1 add unique key unique_1(g), force , algorithm=default;
+alter table t1 drop index unique_1, force , algorithm=default;
+alter table t1 add fulltext key f_1(h), force , algorithm=default;
+alter table t1 drop column f, drop column g , force , algorithm=default;
+alter table t1 add primary key(h), force , algorithm=copy;
+alter table t1 drop primary key, force , algorithm=copy;
+alter table t1 drop column h, force , algorithm=copy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b, add column g varchar(100) first ,add column h char, force , algorithm=default;
+alter table t1 add period for system_time(f,h);
+alter table t1 add system versioning;
+alter table t1 drop system versioning;
+alter table t1 drop column f, drop column g , drop column h, force , algorithm=default;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=default ;;
+alter table t1 alter column f set default "****", force , algorithm=default ;;
+alter table t1 alter column f drop default, force , algorithm=default ;;
+alter table t1 change column g new_g char, force , algorithm=copy;;
+alter table t1 modify column h varchar(100), force , algorithm=copy;;
+alter table t1 drop column new_g ,drop column f, drop column h, force , algorithm=default ;;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=default;
+alter table t1 add index if not exists index_1(f), force , algorithm=default;
+alter table t1 disable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 enable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 rename t2, force , algorithm=default;
+alter table t2 rename t1, force , algorithm=default;
+alter table a1 order by a;
+alter table t1 rename column f to new_f, force , algorithm=copy;
+alter table t1 convert to character set 'utf8', force , algorithm=copy;
+alter table t1 default character set 'utf8', force , algorithm=copy;
+alter table t1 default collate 'utf8_icelandic_ci', force , algorithm=copy;
+alter table t1 drop column new_f ,drop column g, drop column h, force , algorithm=default;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=default;
+alter table t1 partition by hash(b) partitions 8;
+alter table t1 remove partitioning;
+alter table t1 drop column f ,drop column g, drop column h, force , algorithm=default;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+connection master;
+drop table t1, a1;
+drop temporary table tmp_tbl;
+connection slave;
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+include/start_slave.inc
+connection slave;
+stop slave;
+change master to master_use_gtid= current_pos;
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+start slave;
+connection master;
+set binlog_alter_two_phase=true;
+create table t1(a int , b int) engine=innodb;
+create table a1(a int , b int) engine=myisam;
+create temporary table tmp_tbl(a int, b int) engine=innodb;
+alter table t1 add column if not exists c int , force , algorithm=inplace;
+alter table t1 add column d int first, force , algorithm=inplace;
+alter table t1 add column e int after c, force , algorithm=inplace;
+alter table t1 add column f int after c, force , add column g int first ,add column h char, algorithm=inplace;
+alter table t1 drop column c, drop column d, drop column e, drop column f, drop column g , drop column h, force , algorithm=inplace;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f int after b, force , add column g int first ,add column h varchar(100), algorithm=inplace;
+alter table t1 add index if not exists index_1(f), force , algorithm=inplace;
+alter table t1 drop index index_1, force , algorithm=inplace;
+alter table t1 add unique key unique_1(g), force , algorithm=inplace;
+alter table t1 drop index unique_1, force , algorithm=inplace;
+alter table t1 add fulltext key f_1(h), force , algorithm=inplace;
+alter table t1 drop column f, drop column g , force , algorithm=inplace;
+alter table t1 add primary key(h), force , algorithm=copy;
+alter table t1 drop primary key, force , algorithm=copy;
+alter table t1 drop column h, force , algorithm=copy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b, add column g varchar(100) first ,add column h char, force , algorithm=inplace;
+alter table t1 add period for system_time(f,h);
+alter table t1 add system versioning;
+alter table t1 drop system versioning;
+alter table t1 drop column f, drop column g , drop column h, force , algorithm=inplace;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=inplace ;;
+alter table t1 alter column f set default "****", force , algorithm=inplace ;;
+alter table t1 alter column f drop default, force , algorithm=inplace ;;
+alter table t1 change column g new_g char, force , algorithm=copy;;
+alter table t1 modify column h varchar(100), force , algorithm=copy;;
+alter table t1 drop column new_g ,drop column f, drop column h, force , algorithm=inplace ;;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=inplace;
+alter table t1 add index if not exists index_1(f), force , algorithm=inplace;
+alter table t1 disable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 enable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 rename t2, force , algorithm=inplace;
+alter table t2 rename t1, force , algorithm=inplace;
+alter table a1 order by a;
+alter table t1 rename column f to new_f, force , algorithm=copy;
+alter table t1 convert to character set 'utf8', force , algorithm=copy;
+alter table t1 default character set 'utf8', force , algorithm=copy;
+alter table t1 default collate 'utf8_icelandic_ci', force , algorithm=copy;
+alter table t1 drop column new_f ,drop column g, drop column h, force , algorithm=inplace;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=inplace;
+alter table t1 partition by hash(b) partitions 8;
+alter table t1 remove partitioning;
+alter table t1 drop column f ,drop column g, drop column h, force , algorithm=inplace;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+connection master;
+drop table t1, a1;
+drop temporary table tmp_tbl;
+connection slave;
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+include/start_slave.inc
+connection slave;
+stop slave;
+change master to master_use_gtid= current_pos;
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+start slave;
+connection master;
+set binlog_alter_two_phase=true;
+create table t1(a int , b int) engine=innodb;
+create table a1(a int , b int) engine=myisam;
+create temporary table tmp_tbl(a int, b int) engine=innodb;
+alter table t1 add column if not exists c int , force , algorithm=copy;
+alter table t1 add column d int first, force , algorithm=copy;
+alter table t1 add column e int after c, force , algorithm=copy;
+alter table t1 add column f int after c, force , add column g int first ,add column h char, algorithm=copy;
+alter table t1 drop column c, drop column d, drop column e, drop column f, drop column g , drop column h, force , algorithm=copy;
+alter table tmp_tbl add column if not exists c int , force , algorithm=copy;
+alter table tmp_tbl add column d int first, force , algorithm=copy;
+alter table tmp_tbl add column e int after c, force , algorithm=copy;
+alter table tmp_tbl add column f int after c, force , add column g int first ,add column h char, algorithm=copy;
+alter table tmp_tbl drop column c, drop column d, drop column e, drop column f, drop column g , drop column h, force , algorithm=copy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f int after b, force , add column g int first ,add column h varchar(100), algorithm=copy;
+alter table t1 add index if not exists index_1(f), force , algorithm=copy;
+alter table t1 drop index index_1, force , algorithm=copy;
+alter table t1 add unique key unique_1(g), force , algorithm=copy;
+alter table t1 drop index unique_1, force , algorithm=copy;
+alter table t1 add fulltext key f_1(h), force , algorithm=copy;
+alter table t1 drop column f, drop column g , force , algorithm=copy;
+alter table tmp_tbl add column f int after b, force , add column g int first ,add column h varchar(100), algorithm=copy;
+alter table tmp_tbl add index if not exists index_1(f), force , algorithm=copy;
+alter table tmp_tbl drop index index_1, force , algorithm=copy;
+alter table tmp_tbl add unique key unique_1(g), force , algorithm=copy;
+alter table tmp_tbl drop index unique_1, force , algorithm=copy;
+alter table tmp_tbl drop column f, drop column g , force , algorithm=copy;
+alter table t1 add primary key(h), force , algorithm=copy;
+alter table t1 drop primary key, force , algorithm=copy;
+alter table t1 drop column h, force , algorithm=copy;
+alter table tmp_tbl add primary key(h), force , algorithm=copy;
+alter table tmp_tbl drop primary key, force , algorithm=copy;
+alter table tmp_tbl drop column h, force , algorithm=copy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b, add column g varchar(100) first ,add column h char, force , algorithm=copy;
+alter table t1 add period for system_time(f,h);
+alter table t1 add system versioning;
+alter table t1 drop system versioning;
+alter table t1 drop column f, drop column g , drop column h, force , algorithm=copy;
+# show binlog and clear status
+alter table tmp_tbl add column f varchar(100) after b, add column g varchar(100) first ,add column h char, force , algorithm=copy;
+alter table tmp_tbl drop column f, drop column g , drop column h, force , algorithm=copy;
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=copy ;;
+alter table t1 alter column f set default "****", force , algorithm=copy ;;
+alter table t1 alter column f drop default, force , algorithm=copy ;;
+alter table t1 change column g new_g char, force , algorithm=copy;;
+alter table t1 modify column h varchar(100), force , algorithm=copy;;
+alter table t1 drop column new_g ,drop column f, drop column h, force , algorithm=copy ;;
+alter table tmp_tbl add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=copy ;;
+alter table tmp_tbl alter column f set default "****", force , algorithm=copy ;;
+alter table tmp_tbl alter column f drop default, force , algorithm=copy ;;
+alter table tmp_tbl change column g new_g char, force , algorithm=copy;;
+alter table tmp_tbl modify column h varchar(100), force , algorithm=copy;;
+alter table tmp_tbl drop column new_g ,drop column f, drop column h, force , algorithm=copy ;;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=copy;
+alter table t1 add index if not exists index_1(f), force , algorithm=copy;
+alter table t1 disable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 enable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 rename t2, force , algorithm=copy;
+alter table t2 rename t1, force , algorithm=copy;
+alter table a1 order by a;
+alter table t1 rename column f to new_f, force , algorithm=copy;
+alter table t1 convert to character set 'utf8', force , algorithm=copy;
+alter table t1 default character set 'utf8', force , algorithm=copy;
+alter table t1 default collate 'utf8_icelandic_ci', force , algorithm=copy;
+alter table t1 drop column new_f ,drop column g, drop column h, force , algorithm=copy;
+alter table tmp_tbl add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=copy;
+alter table tmp_tbl add index if not exists index_1(f), force , algorithm=copy;
+alter table tmp_tbl disable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`tmp_tbl` doesn't have this option
+alter table tmp_tbl enable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`tmp_tbl` doesn't have this option
+alter table a1 order by a;
+alter table tmp_tbl rename column f to new_f, force , algorithm=copy;
+alter table tmp_tbl convert to character set 'utf8', force , algorithm=copy;
+alter table tmp_tbl default character set 'utf8', force , algorithm=copy;
+alter table tmp_tbl default collate 'utf8_icelandic_ci', force , algorithm=copy;
+alter table tmp_tbl drop column new_f ,drop column g, drop column h, force , algorithm=copy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=copy;
+alter table t1 partition by hash(b) partitions 8;
+alter table t1 remove partitioning;
+alter table t1 drop column f ,drop column g, drop column h, force , algorithm=copy;
+alter table tmp_tbl add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=copy;
+alter table tmp_tbl drop column f ,drop column g, drop column h, force , algorithm=copy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+connection master;
+drop table t1, a1;
+drop temporary table tmp_tbl;
+connection slave;
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+include/start_slave.inc
+# Prove formal support for nocopy and instant
+connection slave;
+stop slave;
+change master to master_use_gtid= current_pos;
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+start slave;
+connection master;
+set binlog_alter_two_phase=true;
+create table t1(a int , b int) engine=innodb;
+create table a1(a int , b int) engine=myisam;
+create temporary table tmp_tbl(a int, b int) engine=innodb;
+alter table t1 add column if not exists c int , force , algorithm=instant;
+alter table t1 add column d int first, force , algorithm=instant;
+alter table t1 add column e int after c, force , algorithm=instant;
+alter table t1 add column f int after c, force , add column g int first ,add column h char, algorithm=instant;
+alter table t1 drop column c, drop column d, drop column e, drop column f, drop column g , drop column h, force , algorithm=instant;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f int after b, force , add column g int first ,add column h varchar(100), algorithm=instant;
+alter table t1 add index if not exists index_1(f), force , algorithm=instant;
+alter table t1 drop index index_1, force , algorithm=instant;
+alter table t1 add unique key unique_1(g), force , algorithm=instant;
+alter table t1 drop index unique_1, force , algorithm=instant;
+alter table t1 add fulltext key f_1(h), force , algorithm=instant;
+alter table t1 drop column f, drop column g , force , algorithm=instant;
+alter table t1 add primary key(h), force , algorithm=copy;
+alter table t1 drop primary key, force , algorithm=copy;
+alter table t1 drop column h, force , algorithm=copy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b, add column g varchar(100) first ,add column h char, force , algorithm=instant;
+alter table t1 add period for system_time(f,h);
+alter table t1 add system versioning;
+alter table t1 drop system versioning;
+alter table t1 drop column f, drop column g , drop column h, force , algorithm=instant;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=instant ;;
+alter table t1 alter column f set default "****", force , algorithm=instant ;;
+alter table t1 alter column f drop default, force , algorithm=instant ;;
+alter table t1 change column g new_g char, force , algorithm=copy;;
+alter table t1 modify column h varchar(100), force , algorithm=copy;;
+alter table t1 drop column new_g ,drop column f, drop column h, force , algorithm=instant ;;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=instant;
+alter table t1 add index if not exists index_1(f), force , algorithm=instant;
+alter table t1 disable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 enable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 rename t2, force , algorithm=instant;
+alter table t2 rename t1, force , algorithm=instant;
+alter table a1 order by a;
+alter table t1 rename column f to new_f, force , algorithm=copy;
+alter table t1 convert to character set 'utf8', force , algorithm=copy;
+alter table t1 default character set 'utf8', force , algorithm=copy;
+alter table t1 default collate 'utf8_icelandic_ci', force , algorithm=copy;
+alter table t1 drop column new_f ,drop column g, drop column h, force , algorithm=instant;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=instant;
+alter table t1 partition by hash(b) partitions 8;
+alter table t1 remove partitioning;
+alter table t1 drop column f ,drop column g, drop column h, force , algorithm=instant;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+connection master;
+drop table t1, a1;
+drop temporary table tmp_tbl;
+connection slave;
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+include/start_slave.inc
+connection slave;
+stop slave;
+change master to master_use_gtid= current_pos;
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+start slave;
+connection master;
+set binlog_alter_two_phase=true;
+create table t1(a int , b int) engine=innodb;
+create table a1(a int , b int) engine=myisam;
+create temporary table tmp_tbl(a int, b int) engine=innodb;
+alter table t1 add column if not exists c int , force , algorithm=nocopy;
+alter table t1 add column d int first, force , algorithm=nocopy;
+alter table t1 add column e int after c, force , algorithm=nocopy;
+alter table t1 add column f int after c, force , add column g int first ,add column h char, algorithm=nocopy;
+alter table t1 drop column c, drop column d, drop column e, drop column f, drop column g , drop column h, force , algorithm=nocopy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f int after b, force , add column g int first ,add column h varchar(100), algorithm=nocopy;
+alter table t1 add index if not exists index_1(f), force , algorithm=nocopy;
+alter table t1 drop index index_1, force , algorithm=nocopy;
+alter table t1 add unique key unique_1(g), force , algorithm=nocopy;
+alter table t1 drop index unique_1, force , algorithm=nocopy;
+alter table t1 add fulltext key f_1(h), force , algorithm=nocopy;
+alter table t1 drop column f, drop column g , force , algorithm=nocopy;
+alter table t1 add primary key(h), force , algorithm=copy;
+alter table t1 drop primary key, force , algorithm=copy;
+alter table t1 drop column h, force , algorithm=copy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b, add column g varchar(100) first ,add column h char, force , algorithm=nocopy;
+alter table t1 add period for system_time(f,h);
+alter table t1 add system versioning;
+alter table t1 drop system versioning;
+alter table t1 drop column f, drop column g , drop column h, force , algorithm=nocopy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=nocopy ;;
+alter table t1 alter column f set default "****", force , algorithm=nocopy ;;
+alter table t1 alter column f drop default, force , algorithm=nocopy ;;
+alter table t1 change column g new_g char, force , algorithm=copy;;
+alter table t1 modify column h varchar(100), force , algorithm=copy;;
+alter table t1 drop column new_g ,drop column f, drop column h, force , algorithm=nocopy ;;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=nocopy;
+alter table t1 add index if not exists index_1(f), force , algorithm=nocopy;
+alter table t1 disable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 enable keys, force , algorithm=copy;
+Warnings:
+Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option
+alter table t1 rename t2, force , algorithm=nocopy;
+alter table t2 rename t1, force , algorithm=nocopy;
+alter table a1 order by a;
+alter table t1 rename column f to new_f, force , algorithm=copy;
+alter table t1 convert to character set 'utf8', force , algorithm=copy;
+alter table t1 default character set 'utf8', force , algorithm=copy;
+alter table t1 default collate 'utf8_icelandic_ci', force , algorithm=copy;
+alter table t1 drop column new_f ,drop column g, drop column h, force , algorithm=nocopy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=nocopy;
+alter table t1 partition by hash(b) partitions 8;
+alter table t1 remove partitioning;
+alter table t1 drop column f ,drop column g, drop column h, force , algorithm=nocopy;
+# show binlog and clear status
+connection slave;
+reset master;
+connection master;
+connection master;
+drop table t1, a1;
+drop temporary table tmp_tbl;
+connection slave;
+include/stop_slave.inc
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+include/start_slave.inc
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_para_to_seq.result b/mysql-test/suite/rpl/r/rpl_start_alter_para_to_seq.result
new file mode 100644
index 00000000000..d93ec724372
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_para_to_seq.result
@@ -0,0 +1,14 @@
+include/master-slave.inc
+[connection master]
+connection master;
+CREATE TABLE t1 (a1 int, d1 int DEFAULT 0);
+INSERT INTO t1 VALUES (1,1) ;
+SET binlog_alter_two_phase = ON;
+ALTER TABLE t1 WAIT 9 RENAME COLUMN a1 TO a2;
+SET binlog_alter_two_phase = OFF;
+ALTER TABLE t1 ALTER COLUMN d1 DROP DEFAULT;
+connection slave;
+connection master;
+drop table t1;
+connection slave;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_restart_master.result b/mysql-test/suite/rpl/r/rpl_start_alter_restart_master.result
new file mode 100644
index 00000000000..a2aba33aee0
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_restart_master.result
@@ -0,0 +1,85 @@
+include/master-slave.inc
+[connection master]
+connection slave;
+SET @old_debug_slave= @@global.debug;
+stop slave;
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+start slave;
+connection master;
+call mtr.add_suppression("ALTER query started at .+ could not be completed");
+SET @old_debug_master= @@global.debug;
+set binlog_alter_two_phase=true;
+create table t3( a int primary key, b int) engine=innodb;
+connection master;
+connection slave;
+include/stop_slave.inc
+connection master;
+SET SESSION debug_dbug="d,start_alter_kill_after_binlog";
+alter table t3 add column d int;
+ERROR HY000: Lost connection to server during query
+include/rpl_reconnect.inc
+set binlog_alter_two_phase= true;
+alter table t3 add column d int;
+show create table t3;
+Table Create Table
+t3 CREATE TABLE `t3` (
+ `a` int(11) NOT NULL,
+ `b` int(11) DEFAULT NULL,
+ `d` int(11) DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid # # BEGIN GTID #-#-#
+master-bin.000001 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'ALTER query started at .+ could not be completed' COLLATE 'latin1_swedish_ci'))
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Gtid # # GTID #-#-#
+master-bin.000001 # Query # # use `test`; create table t3( a int primary key, b int) engine=innodb
+master-bin.000001 # Gtid # # GTID #-#-# START ALTER
+master-bin.000001 # Query # # use `test`; alter table t3 add column d int
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000002 # Gtid # # GTID #-#-# START ALTER
+master-bin.000002 # Query # # use `test`; alter table t3 add column d int
+master-bin.000002 # Gtid # # GTID #-#-# COMMIT ALTER id=#
+master-bin.000002 # Query # # use `test`; alter table t3 add column d int
+connection slave;
+include/start_slave.inc
+connection master;
+connection slave;
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-bin.000001 # Gtid # # BEGIN GTID #-#-#
+slave-bin.000001 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'ALTER query started at .+ could not be completed' COLLATE 'latin1_swedish_ci'))
+slave-bin.000001 # Query # # COMMIT
+slave-bin.000001 # Gtid # # GTID #-#-#
+slave-bin.000001 # Query # # use `test`; create table t3( a int primary key, b int) engine=innodb
+slave-bin.000001 # Gtid # # GTID #-#-# START ALTER
+slave-bin.000001 # Query # # use `test`; alter table t3 add column d int
+slave-bin.000001 # Gtid # # GTID #-#-# START ALTER
+slave-bin.000001 # Query # # use `test`; alter table t3 add column d int
+slave-bin.000001 # Gtid # # GTID #-#-# COMMIT ALTER id=#
+slave-bin.000001 # Query # # use `test`; alter table t3 add column d int
+show create table t3;
+Table Create Table
+t3 CREATE TABLE `t3` (
+ `a` int(11) NOT NULL,
+ `b` int(11) DEFAULT NULL,
+ `d` int(11) DEFAULT NULL,
+ PRIMARY KEY (`a`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+connection master;
+SET GLOBAL debug_dbug= @old_debug_master;
+drop table t3;
+set global binlog_alter_two_phase = 0;
+connection slave;
+SET GLOBAL debug_dbug= @old_debug_slave;
+stop slave;
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+start slave;
+connection master;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_start_alter_restart_slave.result b/mysql-test/suite/rpl/r/rpl_start_alter_restart_slave.result
new file mode 100644
index 00000000000..0a1c1f7971e
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_start_alter_restart_slave.result
@@ -0,0 +1,119 @@
+include/master-slave.inc
+[connection master]
+connection slave;
+SET @old_debug_slave= @@global.debug;
+include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+set global debug_dbug="+d,rpl_slave_stop_CA_before_binlog";
+include/start_slave.inc
+connection master;
+SET @old_debug_master= @@global.debug;
+set global debug_dbug="+d,start_alter_delay_master";
+set global binlog_alter_two_phase=true;
+create table t1( a int primary key, b int) engine=myisam;
+create table t2( a int primary key, b int) engine=myisam;
+connect con1,localhost,root,,;
+alter table t1 add column c int;;
+connection master;
+# Get into binlog first and wait
+# master gtid state is 0-1-3
+connect con2,localhost,root,,;
+alter table t2 add column c int;;
+connection master;
+# Get into binlog next and wait as well
+# master gtid state is 0-1-4
+set DEBUG_SYNC= "now signal alter_cont";
+connection con1;
+connection con2;
+create table t3( a int primary key, b int) engine=innodb;
+# master gtid state is 0-1-7
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid_list 1 # []
+master-bin.000001 # Binlog_checkpoint 1 # master-bin.000001
+master-bin.000001 # Gtid 1 # GTID #-#-#
+master-bin.000001 # Query 1 # use `test`; create table t1( a int primary key, b int) engine=myisam
+master-bin.000001 # Gtid 1 # GTID #-#-#
+master-bin.000001 # Query 1 # use `test`; create table t2( a int primary key, b int) engine=myisam
+master-bin.000001 # Gtid 1 # GTID #-#-# START ALTER
+master-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+master-bin.000001 # Gtid 1 # GTID #-#-# START ALTER
+master-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+master-bin.000001 # Gtid 1 # GTID #-#-# COMMIT ALTER id=<seq_no>
+master-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+master-bin.000001 # Gtid 1 # GTID #-#-# COMMIT ALTER id=<seq_no>
+master-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+master-bin.000001 # Gtid 1 # GTID #-#-#
+master-bin.000001 # Query 1 # use `test`; create table t3( a int primary key, b int) engine=innodb
+# Stop Slave
+# As master binlog is SA SA CA CA
+# let's stop at first CA processing (in process_commit_alter)
+connection slave;
+include/sync_with_master_gtid.inc
+connect extra_slave,127.0.0.1,root,,test,$SLAVE_MYPORT;
+stop slave;;
+connection slave;
+connection extra_slave;
+SET GLOBAL debug_dbug= @old_debug_slave;
+connection slave;
+include/wait_for_slave_sql_to_stop.inc
+# The list of events after the slave has stopped must have just one CA:
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-bin.000001 # Gtid_list 2 # []
+slave-bin.000001 # Binlog_checkpoint 2 # slave-bin.000001
+slave-bin.000001 # Gtid 1 # GTID #-#-#
+slave-bin.000001 # Query 1 # use `test`; create table t1( a int primary key, b int) engine=myisam
+slave-bin.000001 # Gtid 1 # GTID #-#-#
+slave-bin.000001 # Query 1 # use `test`; create table t2( a int primary key, b int) engine=myisam
+slave-bin.000001 # Gtid 1 # GTID #-#-# START ALTER
+slave-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+slave-bin.000001 # Gtid 1 # GTID #-#-# START ALTER
+slave-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+slave-bin.000001 # Gtid 1 # GTID #-#-# COMMIT ALTER id=<seq_no>
+slave-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+domain_id seq_no
+0 5
+include/start_slave.inc
+connection master;
+connection slave;
+# Everything from the master binlog must have been applied now:
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+domain_id seq_no
+0 7
+# slave gtid state is 0-1-7
+# The list of events after the slave has synchronized must have both CA:
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-bin.000001 # Gtid_list 2 # []
+slave-bin.000001 # Binlog_checkpoint 2 # slave-bin.000001
+slave-bin.000001 # Gtid 1 # GTID #-#-#
+slave-bin.000001 # Query 1 # use `test`; create table t1( a int primary key, b int) engine=myisam
+slave-bin.000001 # Gtid 1 # GTID #-#-#
+slave-bin.000001 # Query 1 # use `test`; create table t2( a int primary key, b int) engine=myisam
+slave-bin.000001 # Gtid 1 # GTID #-#-# START ALTER
+slave-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+slave-bin.000001 # Gtid 1 # GTID #-#-# START ALTER
+slave-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+slave-bin.000001 # Gtid 1 # GTID #-#-# COMMIT ALTER id=<seq_no>
+slave-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+slave-bin.000001 # Gtid 1 # GTID #-#-# COMMIT ALTER id=<seq_no>
+slave-bin.000001 # Query 1 # use `test`; alter table <t> add column c int
+slave-bin.000001 # Gtid 1 # GTID #-#-#
+slave-bin.000001 # Query 1 # use `test`; create table t3( a int primary key, b int) engine=innodb
+connection master;
+drop table t1,t2,t3;
+set global binlog_alter_two_phase = 0;
+SET GLOBAL debug_dbug= @old_debug_master;
+set DEBUG_SYNC= 'RESET';
+connection slave;
+stop slave;
+set global slave_parallel_threads = 0;;
+set global slave_parallel_mode = optimistic;;
+set global gtid_strict_mode = 0;;
+set DEBUG_SYNC= 'RESET';
+start slave;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_switch_stm_row_mixed.result b/mysql-test/suite/rpl/r/rpl_switch_stm_row_mixed.result
index 936f604be2e..71332034b15 100644
--- a/mysql-test/suite/rpl/r/rpl_switch_stm_row_mixed.result
+++ b/mysql-test/suite/rpl/r/rpl_switch_stm_row_mixed.result
@@ -41,16 +41,16 @@ select @@global.binlog_format, @@session.binlog_format;
@@global.binlog_format @@session.binlog_format
ROW ROW
CREATE TABLE t1 (a varchar(100));
-prepare stmt1 from 'insert into t1 select concat(UUID(),?)';
+prepare stmt1 from 'insert into t1 select concat(SYS_GUID(),?)';
set @string="emergency_1_";
insert into t1 values("work_2_");
execute stmt1 using @string;
deallocate prepare stmt1;
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_3_"));
+insert into t1 values(concat(SYS_GUID(),"work_3_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_4_",UUID()));
+insert into t1 values(concat("for_4_",SYS_GUID()));
insert into t1 select "yesterday_5_";
create temporary table tmp(a char(100));
insert into tmp values("see_6_");
@@ -116,43 +116,43 @@ set binlog_format=default;
select @@global.binlog_format, @@session.binlog_format;
@@global.binlog_format @@session.binlog_format
MIXED MIXED
-prepare stmt1 from 'insert into t1 select concat(UUID(),?)';
+prepare stmt1 from 'insert into t1 select concat(SYS_GUID(),?)';
set @string="emergency_17_";
insert into t1 values("work_18_");
execute stmt1 using @string;
deallocate prepare stmt1;
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_19_"));
+insert into t1 values(concat(SYS_GUID(),"work_19_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_20_",UUID()));
+insert into t1 values(concat("for_20_",SYS_GUID()));
insert into t1 select "yesterday_21_";
prepare stmt1 from 'insert into t1 select ?';
-insert into t1 values(concat(UUID(),"work_22_"));
+insert into t1 values(concat(SYS_GUID(),"work_22_"));
execute stmt1 using @string;
deallocate prepare stmt1;
-insert into t1 values(concat("for_23_",UUID()));
+insert into t1 values(concat("for_23_",SYS_GUID()));
insert into t1 select "yesterday_24_";
-create table t2 ENGINE=MyISAM select rpad(UUID(),100,' ');
-create table t3 select 1 union select UUID();
+create table t2 ENGINE=MyISAM select rpad(SYS_GUID(),100,' ');
+create table t3 select 1 union select SYS_GUID();
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
-create table t4 select * from t1 where 3 in (select 1 union select 2 union select UUID() union select 3);
+create table t4 select * from t1 where 3 in (select 1 union select 2 union select SYS_GUID() union select 3);
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
create table t5 select * from t1 where 3 in (select 1 union select 2 union select curdate() union select 3);
Warnings:
Warning 1292 Truncated incorrect datetime value: '3'
-insert ignore into t5 select UUID() from t1 where 3 in (select 1 union select 2 union select 3 union select * from t4);
+insert ignore into t5 select SYS_GUID() from t1 where 3 in (select 1 union select 2 union select 3 union select * from t4);
create procedure foo()
begin
insert into t1 values("work_25_");
-insert into t1 values(concat("for_26_",UUID()));
+insert into t1 values(concat("for_26_",SYS_GUID()));
insert into t1 select "yesterday_27_";
end|
create procedure foo2()
begin
-insert into t1 values(concat("emergency_28_",UUID()));
+insert into t1 values(concat("emergency_28_",SYS_GUID()));
insert into t1 values("work_29_");
-insert into t1 values(concat("for_30_",UUID()));
+insert into t1 values(concat("for_30_",SYS_GUID()));
set session binlog_format=row; # accepted for stored procs
insert into t1 values("more work_31_");
set session binlog_format=mixed;
@@ -171,7 +171,7 @@ end|
call foo();
call foo2();
call foo4("hello");
-call foo4(UUID());
+call foo4(SYS_GUID());
call foo4("world");
select foo3();
ERROR HY000: Cannot change the binary logging format inside a stored function or trigger
@@ -207,7 +207,7 @@ foo4()
deallocate prepare stmt1;
create function foo5() returns bigint unsigned
begin
-insert into t2 select UUID();
+insert into t2 select SYS_GUID();
return 100;
end|
select foo5();
@@ -229,18 +229,18 @@ end|
select foo6("foo6_1_");
foo6("foo6_1_")
100
-select foo6(concat("foo6_2_",UUID()));
-foo6(concat("foo6_2_",UUID()))
+select foo6(concat("foo6_2_",SYS_GUID()));
+foo6(concat("foo6_2_",SYS_GUID()))
100
-prepare stmt1 from 'select foo6(concat("foo6_3_",UUID()))';
+prepare stmt1 from 'select foo6(concat("foo6_3_",SYS_GUID()))';
execute stmt1;
-foo6(concat("foo6_3_",UUID()))
+foo6(concat("foo6_3_",SYS_GUID()))
100
execute stmt1;
-foo6(concat("foo6_3_",UUID()))
+foo6(concat("foo6_3_",SYS_GUID()))
100
deallocate prepare stmt1;
-create view v1 as select uuid();
+create view v1 as select SYS_GUID();
create table t11 (data varchar(255));
insert into t11 select * from v1;
insert into t11 select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysqltest1' and TABLE_NAME IN ('v1','t11');
@@ -250,11 +250,11 @@ execute stmt1;
deallocate prepare stmt1;
create trigger t11_bi before insert on t11 for each row
begin
-set NEW.data = concat(NEW.data,UUID());
+set NEW.data = concat(NEW.data,SYS_GUID());
end|
insert into t11 values("try_560_");
insert delayed into t2 values("delay_1_");
-insert delayed into t2 values(concat("delay_2_",UUID()));
+insert delayed into t2 values(concat("delay_2_",SYS_GUID()));
insert delayed into t2 values("delay_6_");
insert delayed into t2 values(rand());
set @a=2.345;
@@ -356,7 +356,7 @@ alter table t1 modify a int, drop primary key;
insert into t1 values(null,"try_57_");
connection slave;
connection master;
-CREATE TEMPORARY TABLE t15 SELECT UUID();
+CREATE TEMPORARY TABLE t15 SELECT SYS_GUID();
create table t16 like t15;
INSERT INTO t16 SELECT * FROM t15;
insert into t16 values("try_65_");
@@ -427,7 +427,7 @@ DROP TABLE IF EXISTS t12;
SET SESSION BINLOG_FORMAT=MIXED;
CREATE TABLE t12 (data LONG);
LOCK TABLES t12 WRITE;
-INSERT INTO t12 VALUES(UUID());
+INSERT INTO t12 VALUES(SYS_GUID());
UNLOCK TABLES;
connection slave;
connection master;
diff --git a/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result b/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result
index b9c636fa582..639b107abd6 100644
--- a/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result
+++ b/mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result
@@ -4,7 +4,7 @@ include/master-slave.inc
connection master;
CREATE TABLE t1 (a CHAR(48));
CREATE TEMPORARY TABLE t1_tmp1(a INT);
-INSERT INTO t1 VALUES (UUID());
+INSERT INTO t1 VALUES (SYS_GUID());
connection slave;
==== Verify results on slave ====
SHOW STATUS LIKE "Slave_open_temp_tables";
@@ -121,12 +121,12 @@ master-bin.000001 # Query # # COMMIT
BEGIN;
DROP TEMPORARY TABLE t1;
# The rows event will binlogged after 'INSERT INTO t1 VALUES(1)'
-INSERT IGNORE INTO t1 VALUES(uuid()+0);
+INSERT IGNORE INTO t1 VALUES(SYS_GUID()+0);
COMMIT;
include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
-master-bin.000001 # Annotate_rows # # INSERT IGNORE INTO t1 VALUES(uuid()+0)
+master-bin.000001 # Annotate_rows # # INSERT IGNORE INTO t1 VALUES(SYS_GUID()+0)
master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
master-bin.000001 # Query # # COMMIT
diff --git a/mysql-test/suite/rpl/t/rpl_alter_rollback.test b/mysql-test/suite/rpl/t/rpl_alter_rollback.test
new file mode 100644
index 00000000000..c24f01ff007
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_alter_rollback.test
@@ -0,0 +1,42 @@
+#
+# MENT-662: Lag Free Alter On Slave
+#
+
+--echo #
+--echo # Test verifies that "ROLLBACK ALTER" is written to binary log upon
+--echo #ALTER command execution failure.
+--echo #
+--source include/have_innodb.inc
+--source include/master-slave.inc
+
+--connection master
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+
+create table t1 (f1 int primary key) engine=InnoDB;
+--error ER_CANT_CREATE_TABLE
+create table t2 (f1 int primary key,
+constraint c1 foreign key (f1) references t1(f1),
+constraint c1 foreign key (f1) references t1(f1)) engine=InnoDB;
+create table t2 (f1 int primary key,
+ constraint c1 foreign key (f1) references t1(f1)) engine=innodb;
+
+--error ER_CANT_CREATE_TABLE
+alter table t2 add constraint c1 foreign key (f1) references t1(f1);
+--source include/show_binlog_events.inc
+
+set foreign_key_checks = 0;
+--error ER_DUP_CONSTRAINT_NAME
+alter table t2 add constraint c1 foreign key (f1) references t1(f1);
+--source include/show_binlog_events.inc
+--sync_slave_with_master
+
+--connection master
+drop table t2, t1;
+--sync_slave_with_master
+
+--connection master
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate.test b/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate.test
index 07fc1e558cb..f7aefd625a1 100644
--- a/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate.test
+++ b/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate.test
@@ -44,6 +44,6 @@ FLUSH LOGS;
let $MYSQLD_DATADIR= `select @@datadir`;
--replace_regex /server id [0-9]*/server id #/ /server v [^ ]*/server v #.##.##/ /exec_time=[0-9]*/exec_time=#/ /thread_id=[0-9]*/thread_id=#/ /table id [0-9]*/table id #/ /mapped to number [0-9]*/mapped to number #/ /end_log_pos [0-9]*/end_log_pos #/ /# at [0-9]*/# at #/ /CRC32 0x[0-9a-f]*/CRC32 XXX/ /xid=\d*/xid=<xid>/
---exec $MYSQL_BINLOG --base64-output=decode-rows $MYSQLD_DATADIR/slave-bin.000001
+--exec $MYSQL_BINLOG --base64-output=decode-rows --skip-gtid-strict-mode $MYSQLD_DATADIR/slave-bin.000001
source include/rpl_end.inc;
diff --git a/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test b/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test
index c02e2670c92..412489b3ee3 100644
--- a/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test
+++ b/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test
@@ -5,6 +5,7 @@
--echo *** Test that we check against incorrect table definition for mysql.gtid_slave_pos ***
--connection master
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
+call mtr.add_suppression("Incorrect definition of table mysql.gtid_slave_pos:.*");
--sync_slave_with_master
--connection slave
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_1.test b/mysql-test/suite/rpl/t/rpl_start_alter_1.test
new file mode 100644
index 00000000000..9ce061f1031
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_1.test
@@ -0,0 +1,33 @@
+#
+# Start Alter with Legacy Replication
+#
+--source include/have_innodb.inc
+--source include/have_debug.inc
+--source include/master-slave.inc
+
+--connection master
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+--connection slave
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+set global gtid_strict_mode=1;
+
+--echo # Legacy Master Slave
+--let $domain_1=0
+--let $domain_2=0
+--let $M_port= $MASTER_MYPORT
+--let $S_port= $SLAVE_MYPORT
+--let $sync_slave=1
+
+--source include/start_alter_include.inc
+--connection master
+--source include/save_master_gtid.inc
+
+--connection slave
+--source include/sync_with_master_gtid.inc
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+
+--connection master
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_2.test b/mysql-test/suite/rpl/t/rpl_start_alter_2.test
new file mode 100644
index 00000000000..457409c51a6
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_2.test
@@ -0,0 +1,53 @@
+#
+# Start Alter with Parallel Replication
+# 1 domain id
+# |Concurrent alters| < |Parallel workers on slave|
+# |x| denotes number of entities it encloses
+#
+--source include/have_innodb.inc
+--source include/have_debug.inc
+--source include/master-slave.inc
+--connection master
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+--connection slave
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+set global gtid_strict_mode=1;
+
+
+--connection slave
+--source include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=10;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+--source include/start_slave.inc
+
+--echo # Parallel Slave
+--connection master
+--let $master_server= "master"
+--let $domain_1=0
+--let $domain_2=0
+--let $M_port= $MASTER_MYPORT
+--let $S_port= $SLAVE_MYPORT
+--let $sync_slave=1
+--source include/start_alter_include.inc
+--connection master
+--source include/save_master_gtid.inc
+
+--connection slave
+--source include/sync_with_master_gtid.inc
+
+--echo # cleanup
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+set global gtid_domain_id= 0;
+--source include/start_slave.inc
+
+--connection master
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_3.test b/mysql-test/suite/rpl/t/rpl_start_alter_3.test
new file mode 100644
index 00000000000..b280aeb9e5e
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_3.test
@@ -0,0 +1,54 @@
+#
+# Start Alter with Parallel Replication
+# 1 domain id
+# |Concurrent alters| >= |Parallel workers on slave|
+# |x| denotes number of entities it encloses
+#
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+--source include/have_debug.inc
+--connection master
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+--connection slave
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+set global gtid_strict_mode=1;
+
+
+--connection slave
+--source include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+--source include/start_slave.inc
+
+--echo # Parallel Slave
+--connection master
+--let $master_server= "master"
+--let $domain_1=0
+--let $domain_2=0
+--let $M_port= $MASTER_MYPORT
+--let $S_port= $SLAVE_MYPORT
+--let $sync_slave=1
+--source include/start_alter_include.inc
+--connection master
+--source include/save_master_gtid.inc
+
+--connection slave
+--source include/sync_with_master_gtid.inc
+
+--echo # cleanup
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+set global gtid_domain_id= 0;
+--source include/start_slave.inc
+
+--connection master
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_4.test b/mysql-test/suite/rpl/t/rpl_start_alter_4.test
new file mode 100644
index 00000000000..8c67b50a7bf
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_4.test
@@ -0,0 +1,54 @@
+#
+# Start Alter with Parallel Replication
+# 2 domain id
+# |Concurrent alters| < |Parallel workers on slave|
+# |x| denotes number of entities it encloses
+#
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+--source include/have_debug.inc
+--connection master
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+--connection slave
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+set global gtid_strict_mode=1;
+
+--connection slave
+--source include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=10;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+--source include/start_slave.inc
+
+--echo # Parallel Slave
+--connection master
+--let $master_server= "master"
+--let $domain_1=11
+--let $domain_2=12
+--let $M_port= $MASTER_MYPORT
+--let $S_port= $SLAVE_MYPORT
+--let $sync_slave=1
+--source include/start_alter_include.inc
+--connection master
+--source include/save_master_gtid.inc
+
+--connection slave
+--source include/sync_with_master_gtid.inc
+
+--echo # cleanup
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+set global gtid_domain_id= 0;
+--source include/start_slave.inc
+
+--connection master
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+set global gtid_domain_id= 0;
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_5.test b/mysql-test/suite/rpl/t/rpl_start_alter_5.test
new file mode 100644
index 00000000000..10d0d523a68
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_5.test
@@ -0,0 +1,54 @@
+#
+# Start Alter with Parallel Replication
+# 2 domain id
+# |Concurrent alters| >= |Parallel workers on slave|
+# |x| denotes number of entities it encloses
+#
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+--source include/have_debug.inc
+--connection master
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+--connection slave
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+set global gtid_strict_mode=1;
+
+--connection slave
+--source include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+--source include/start_slave.inc
+
+--echo # Parallel Slave
+--connection master
+--let $master_server= "master"
+--let $domain_1=11
+--let $domain_2=12
+--let $M_port= $MASTER_MYPORT
+--let $S_port= $SLAVE_MYPORT
+--let $sync_slave=1
+--source include/start_alter_include.inc
+--connection master
+--source include/save_master_gtid.inc
+
+--connection slave
+--source include/sync_with_master_gtid.inc
+
+--echo # cleanup
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+set global gtid_domain_id= 0;
+--source include/start_slave.inc
+
+--connection master
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+set global gtid_domain_id= 0;
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_6.test b/mysql-test/suite/rpl/t/rpl_start_alter_6.test
new file mode 100644
index 00000000000..fc49ea4a406
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_6.test
@@ -0,0 +1,58 @@
+#
+# Start Alter with Parallel Replication
+# 2 domain id
+# |Concurrent alters| < |Parallel workers on slave|
+# |x| denotes number of entities it encloses
+# slave_domain_parallel_threads < |Concurrent Alters|
+#
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+--source include/have_debug.inc
+--connection master
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+--connection slave
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+--let $slave_domain_parallel_threads= `select @@slave_domain_parallel_threads`
+set global gtid_strict_mode=1;
+
+--connection slave
+--source include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=10;
+set global slave_parallel_mode=optimistic;
+set global slave_domain_parallel_threads=3;
+change master to master_use_gtid=slave_pos;
+--source include/start_slave.inc
+
+--echo # Parallel Slave
+--connection master
+--let $master_server= "master"
+--let $domain_1=11
+--let $domain_2=12
+--let $M_port= $MASTER_MYPORT
+--let $S_port= $SLAVE_MYPORT
+--let $sync_slave=1
+--source include/start_alter_include.inc
+--connection master
+--source include/save_master_gtid.inc
+
+--connection slave
+--source include/sync_with_master_gtid.inc
+
+--echo # cleanup
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+--eval set global slave_domain_parallel_threads = $slave_domain_parallel_threads;
+set global gtid_domain_id= 0;
+--source include/start_slave.inc
+
+--connection master
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+set global gtid_domain_id= 0;
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_7.cnf b/mysql-test/suite/rpl/t/rpl_start_alter_7.cnf
new file mode 100644
index 00000000000..a0f6dc5710c
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_7.cnf
@@ -0,0 +1,19 @@
+!include ../my.cnf
+
+[mysqld.1]
+log-bin
+log-slave-updates
+
+[mysqld.2]
+log-bin
+log-slave-updates
+
+[mysqld.3]
+log-bin
+log-slave-updates
+
+
+[ENV]
+SERVER_MYPORT_1= @mysqld.1.port
+SERVER_MYPORT_2= @mysqld.2.port
+SERVER_MYPORT_3= @mysqld.3.port
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_7.test b/mysql-test/suite/rpl/t/rpl_start_alter_7.test
new file mode 100644
index 00000000000..7225c075ea7
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_7.test
@@ -0,0 +1,112 @@
+#
+# Start Alter with Parallel Replication, With 2 sources
+# 2 domain id (From 2 sources)
+# |Concurrent alters| >= |Parallel workers on slave|
+# |x| denotes number of entities it encloses
+#
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/have_debug.inc
+--connect (server_1,127.0.0.1,root,,,$SERVER_MYPORT_1)
+--connect (server_2,127.0.0.1,root,,,$SERVER_MYPORT_2)
+--connect (server_3,127.0.0.1,root,,,$SERVER_MYPORT_3)
+
+--connection server_1
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+
+--connection server_2
+stop slave;
+set global binlog_alter_two_phase=true;
+
+--connection server_3
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+SET GLOBAL slave_parallel_threads=8;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+
+
+--disable_warnings
+--disable_query_log
+--replace_result $SERVER_MYPORT_1 MYPORT_1
+eval change master 'm1' to master_port=$SERVER_MYPORT_1 , master_host='127.0.0.1', master_user='root', master_use_gtid=slave_pos;
+--replace_result $SERVER_MYPORT_2 MYPORT_2
+eval change master 'm2' to master_port=$SERVER_MYPORT_2 , master_host='127.0.0.1', master_user='root', master_use_gtid=slave_pos;
+--enable_query_log
+--enable_warnings
+
+--connection server_1
+set gtid_domain_id= 11;
+create database s1;
+use s1;
+--let $domain_1=11
+--let $domain_2=11
+--let $M_port= $SERVER_MYPORT_1
+--let $S_port= $SERVER_MYPORT_3
+--let $sync_slave=0
+--let $db_name=s1
+--source include/start_alter_include.inc
+--connection server_1
+drop database s1;
+select @@gtid_binlog_pos;
+--let $master_pos_1= `SELECT @@gtid_binlog_pos`
+
+--connection server_2
+set gtid_domain_id= 12;
+create database s2;
+use s2;
+--let $domain_1=12
+--let $domain_2=12
+--let $M_port= $SERVER_MYPORT_2
+--let $S_port= $SERVER_MYPORT_3
+--let $sync_slave=0
+--let $db_name=s2
+--source include/start_alter_include.inc
+--connection server_2
+drop database s2;
+select @@gtid_binlog_pos;
+--let $master_pos_2= `SELECT @@gtid_binlog_pos`
+
+--connection server_3
+start all slaves;
+set default_master_connection = 'm1';
+--source include/wait_for_slave_to_start.inc
+set default_master_connection = 'm2';
+--source include/wait_for_slave_to_start.inc
+
+set default_master_connection = 'm1';
+--let $master_pos= $master_pos_1
+--source include/sync_with_master_gtid.inc
+set default_master_connection = 'm2';
+--let $master_pos= $master_pos_2
+--source include/sync_with_master_gtid.inc
+
+--echo # cleanup
+--connection server_3
+set default_master_connection = 'm1';
+--source include/stop_slave.inc
+set default_master_connection = 'm2';
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+set global gtid_domain_id= 0;
+reset master;
+RESET SLAVE ALL;
+SET GLOBAL gtid_slave_pos= '';
+
+--connection server_1
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+set global gtid_domain_id= 0;
+reset master;
+--connection server_2
+set global gtid_domain_id= 0;
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase
+reset master;
+
+--disconnect server_1
+--disconnect server_2
+--disconnect server_3
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_8.cnf b/mysql-test/suite/rpl/t/rpl_start_alter_8.cnf
new file mode 100644
index 00000000000..a0f6dc5710c
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_8.cnf
@@ -0,0 +1,19 @@
+!include ../my.cnf
+
+[mysqld.1]
+log-bin
+log-slave-updates
+
+[mysqld.2]
+log-bin
+log-slave-updates
+
+[mysqld.3]
+log-bin
+log-slave-updates
+
+
+[ENV]
+SERVER_MYPORT_1= @mysqld.1.port
+SERVER_MYPORT_2= @mysqld.2.port
+SERVER_MYPORT_3= @mysqld.3.port
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_8.test b/mysql-test/suite/rpl/t/rpl_start_alter_8.test
new file mode 100644
index 00000000000..4ab8e2b01e5
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_8.test
@@ -0,0 +1,109 @@
+#
+# Start Alter with Parallel Replication, With 2 sources
+# 2 domain id (From 2 sources)
+# |Concurrent alters| < |Parallel workers on slave|
+# |x| denotes number of entities it encloses
+#
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/have_debug.inc
+--connect (server_1,127.0.0.1,root,,,$SERVER_MYPORT_1)
+--connect (server_2,127.0.0.1,root,,,$SERVER_MYPORT_2)
+--connect (server_3,127.0.0.1,root,,,$SERVER_MYPORT_3)
+
+--connection server_1
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase = ON;
+set binlog_alter_two_phase = ON;
+
+--connection server_2
+stop slave;
+set global binlog_alter_two_phase=true;
+
+--connection server_3
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+SET GLOBAL slave_parallel_threads=20;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+
+--disable_warnings
+--disable_query_log
+--replace_result $SERVER_MYPORT_1 MYPORT_1
+eval change master 'm1' to master_port=$SERVER_MYPORT_1 , master_host='127.0.0.1', master_user='root', master_use_gtid=slave_pos;
+--replace_result $SERVER_MYPORT_2 MYPORT_2
+eval change master 'm2' to master_port=$SERVER_MYPORT_2 , master_host='127.0.0.1', master_user='root', master_use_gtid=slave_pos;
+--enable_query_log
+--enable_warnings
+
+--connection server_1
+set gtid_domain_id= 11;
+create database s1;
+use s1;
+--let $domain_1=11
+--let $domain_2=11
+--let $M_port= $SERVER_MYPORT_1
+--let $S_port= $SERVER_MYPORT_3
+--let $sync_slave=0
+--let $db_name=s1
+--source include/start_alter_include.inc
+--connection server_1
+drop database s1;
+--let $master_pos_1= `SELECT @@gtid_binlog_pos`
+
+--connection server_2
+set gtid_domain_id= 12;
+create database s2;
+use s2;
+--let $domain_1=12
+--let $domain_2=12
+--let $M_port= $SERVER_MYPORT_2
+--let $S_port= $SERVER_MYPORT_3
+--let $sync_slave=0
+--let $db_name=s2
+--source include/start_alter_include.inc
+--connection server_2
+drop database s2;
+--let $master_pos_2= `SELECT @@gtid_binlog_pos`
+
+--connection server_3
+start all slaves;
+set default_master_connection = 'm1';
+--source include/wait_for_slave_to_start.inc
+set default_master_connection = 'm2';
+--source include/wait_for_slave_to_start.inc
+
+set default_master_connection = 'm1';
+--let $master_pos= $master_pos_1
+--source include/sync_with_master_gtid.inc
+set default_master_connection = 'm2';
+--let $master_pos= $master_pos_2
+--source include/sync_with_master_gtid.inc
+
+--echo # cleanup
+--connection server_3
+set default_master_connection = 'm1';
+--source include/stop_slave.inc
+set default_master_connection = 'm2';
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+set global gtid_domain_id= 0;
+reset master;
+RESET SLAVE ALL;
+SET GLOBAL gtid_slave_pos= '';
+
+--connection server_1
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+set global gtid_domain_id= 0;
+reset master;
+--connection server_2
+set global gtid_domain_id= 0;
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase;
+reset master;
+
+--disconnect server_1
+--disconnect server_2
+--disconnect server_3
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_bugs.test b/mysql-test/suite/rpl/t/rpl_start_alter_bugs.test
new file mode 100644
index 00000000000..52eef9fbb16
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_bugs.test
@@ -0,0 +1,47 @@
+#
+# MDEV-22985 Assertion `!(thd->rgi_slave && thd->rgi_slave->did_mark_start_commit)' failed in ha_rollback_trans#
+#
+#
+
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+
+--connection master
+set global binlog_alter_two_phase=true;
+
+--connection slave
+stop slave;
+SET global slave_parallel_threads=2;
+set global slave_parallel_mode=optimistic;
+start slave;
+--connection master
+
+CREATE TABLE t1 (i int primary key) ENGINE = InnoDB;
+--connection master1
+ALTER TABLE t1 DROP PRIMARY KEY;
+ALTER TABLE t1 ADD UNIQUE KEY ui (i);
+ALTER TABLE t1 ADD PRIMARY KEY (i);
+
+--sync_slave_with_master
+
+ #MENT 1274
+--connection master
+drop table t1;
+CREATE TABLE t1 (a int)engine=innodb;
+ALTER TABLE t1 add column b int, LOCK=EXCLUSIVE;
+drop table t1;
+CREATE TABLE t1 (pk int)engine=innodb;
+--error ER_CANT_DROP_FIELD_OR_KEY
+ALTER TABLE t1 DROP FOREIGN KEY y, LOCK=EXCLUSIVE;
+drop table t1;
+--sync_slave_with_master
+--connection master
+set global binlog_alter_two_phase=false;
+
+--connection slave
+--source include/stop_slave.inc
+SET global slave_parallel_threads=0;
+--source include/start_slave.inc
+
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.cnf b/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.cnf
new file mode 100644
index 00000000000..498d8ed1096
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.cnf
@@ -0,0 +1,24 @@
+!include ../my.cnf
+
+[mysqld.1]
+log-slave-updates
+loose-innodb
+
+[mysqld.2]
+log-slave-updates
+loose-innodb
+
+[mysqld.3]
+log-slave-updates
+binlog_alter_two_phase=1
+loose-innodb
+
+[mysqld.4]
+loose-innodb
+
+[ENV]
+SERVER_MYPORT_3= @mysqld.3.port
+SERVER_MYSOCK_3= @mysqld.3.socket
+
+SERVER_MYPORT_4= @mysqld.4.port
+SERVER_MYSOCK_4= @mysqld.4.socket
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.test b/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.test
new file mode 100644
index 00000000000..2c6f9c0fd72
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.test
@@ -0,0 +1,54 @@
+#
+# MENT-662 Lag Free alter for slave
+# In this we will see if chain replication works as
+# M->S(Legacy)->S(Parallel)->S(Legacy, without log-slave-upadates)
+#
+--source include/have_innodb.inc
+--let $rpl_topology=1->2->3->4
+--source include/rpl_init.inc
+
+--connection server_3
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+set global gtid_strict_mode=1;
+
+--source include/stop_slave.inc
+SET GLOBAL slave_parallel_threads=10;
+set global slave_parallel_mode=optimistic;
+change master to master_use_gtid=slave_pos;
+--source include/start_slave.inc
+
+
+--connection server_1
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase=ON;
+set binlog_alter_two_phase=ON;
+--let $engine=innodb
+--let $sync_slave= 1
+connect(master_node,127.0.0.1,root,,$db_name, $SERVER_MYPORT_1);
+connect(slave_node,127.0.0.1,root,,test, $SERVER_MYPORT_2);
+--source include/start_alter_basic.inc
+--disconnect master_node
+--disconnect slave_node
+--connection server_1
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase
+--source include/rpl_sync.inc
+
+
+--connection server_2
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+
+--connection server_3
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+--source include/start_slave.inc
+select @@slave_parallel_threads;
+
+--connection server_4
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_ftwrl.test b/mysql-test/suite/rpl/t/rpl_start_alter_ftwrl.test
new file mode 100644
index 00000000000..a8528cc6197
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_ftwrl.test
@@ -0,0 +1,91 @@
+#
+# MDEV-11675 Two phase ALTER binlogging
+#
+# Prove that FTWRL in the middle of START and "COMPLETE" parts of ALTER
+# is safe.
+
+--source include/have_debug.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+
+--connection slave
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+--let $debug = `SELECT @@global.debug_dbug`
+
+--source include/stop_slave.inc
+
+SET @@global.slave_parallel_threads=4;
+SET @@global.slave_parallel_mode=optimistic;
+CHANGE MASTER TO master_use_gtid=slave_pos;
+
+SET @@global.debug_dbug="+d,at_write_start_alter";
+--source include/start_slave.inc
+
+--connection master
+SET @@session.binlog_alter_two_phase=true;
+
+CREATE TABLE t1 (a INT) ENGINE=innodb;
+--source include/save_master_gtid.inc
+
+# Make sure the table exists on slave now.
+--connection slave
+--source include/sync_with_master_gtid.inc
+
+--connection master
+SET @@session.alter_algorithm='INSTANT';
+SET @@session.gtid_domain_id=11;
+ALTER TABLE t1 ADD COLUMN b int;
+
+
+--echo # START Alter having exclusive lock is waiting for the signal
+--connection slave
+--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: now'
+--source include/wait_condition.inc
+
+--echo # FTWRL is sent first to wait for SA
+--connection slave1
+--send FLUSH TABLES WITH READ LOCK
+
+--echo # SA completes
+# First wait for the FTWRL arrival.
+--connection slave
+--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = 'FLUSH TABLES WITH READ LOCK' and STATE = 'Waiting for worker threads to pause for global read lock'
+--source include/wait_condition.inc
+
+set DEBUG_SYNC= "now signal alter_cont";
+
+--connection slave1
+--reap
+
+# Commit ALTER is hanging now
+--connection slave
+--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Slave_worker' AND STATE = 'Waiting for backup lock'
+--source include/wait_condition.inc
+
+--echo # Release CA
+--connection slave1
+UNLOCK TABLES;
+
+--connection master
+--sync_slave_with_master
+
+SHOW CREATE TABLE t1;
+--source include/show_binlog_events.inc
+
+--connection master
+DROP TABLE t1;
+
+--sync_slave_with_master
+
+--echo # cleanup
+--connection slave
+set DEBUG_SYNC = RESET;
+--source include/stop_slave.inc
+--eval set global slave_parallel_threads = $slave_parallel_threads
+--eval set global slave_parallel_mode = $slave_parallel_mode
+--eval set @@global.debug_dbug = "$debug"
+--source include/start_slave.inc
+
+
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_instant.test b/mysql-test/suite/rpl/t/rpl_start_alter_instant.test
new file mode 100644
index 00000000000..ecb62e04fad
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_instant.test
@@ -0,0 +1,30 @@
+# MDEV-11675
+# Prove that "fast" ALTER options also combine with @@binlog_alter_two_phase.
+--source include/have_innodb.inc
+--source include/master-slave.inc
+
+--connection master
+set binlog_alter_two_phase=true;
+CREATE OR REPLACE TABLE tab (
+ a int PRIMARY KEY,
+ b varchar(50),
+ c varchar(50)
+) CHARACTER SET=latin1 engine=innodb;
+
+SET SESSION alter_algorithm='INSTANT';
+ALTER TABLE tab MODIFY COLUMN b varchar(100);
+SET SESSION alter_algorithm='NOCOPY';
+ALTER TABLE tab MODIFY COLUMN c varchar(100);
+SHOW CREATE TABLE tab;
+--source include/show_binlog_events.inc
+
+--sync_slave_with_master
+SHOW CREATE TABLE tab;
+--source include/show_binlog_events.inc
+
+--connection master
+DROP TABLE tab;
+
+--sync_slave_with_master
+
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_1.test b/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_1.test
new file mode 100644
index 00000000000..5c78eb290c8
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_1.test
@@ -0,0 +1,39 @@
+#
+# Start Alter with binlog applied using mysqlbinlog
+# single maser with only one domain id
+#
+--source include/have_innodb.inc
+--source include/have_debug.inc
+--source include/master-slave.inc
+
+--connection master
+set global binlog_alter_two_phase=true;
+--connection slave
+--source include/stop_slave.inc
+change master to master_use_gtid= current_pos;
+set global gtid_strict_mode=1;
+
+--echo # Legacy Master Slave
+--let $domain_1=0
+--let $domain_2=0
+--let $M_port= $MASTER_MYPORT
+--let $S_port= $SLAVE_MYPORT
+--let $sync_slave=0
+
+--source include/start_alter_include.inc
+--connection master
+--let $MYSQLD_DATADIR= `select @@datadir;`
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/master.sql
+select @@gtid_binlog_state;
+RESET master;
+
+--connection slave
+--exec $MYSQL --host=127.0.0.1 --port=$SLAVE_MYPORT -e "source $MYSQLTEST_VARDIR/tmp/master.sql"
+select @@gtid_binlog_state;
+set global gtid_strict_mode=0;
+--source include/start_slave.inc
+
+--connection master
+set global binlog_alter_two_phase=false;
+remove_file $MYSQLTEST_VARDIR/tmp/master.sql;
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.cnf b/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.cnf
new file mode 100644
index 00000000000..a0f6dc5710c
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.cnf
@@ -0,0 +1,19 @@
+!include ../my.cnf
+
+[mysqld.1]
+log-bin
+log-slave-updates
+
+[mysqld.2]
+log-bin
+log-slave-updates
+
+[mysqld.3]
+log-bin
+log-slave-updates
+
+
+[ENV]
+SERVER_MYPORT_1= @mysqld.1.port
+SERVER_MYPORT_2= @mysqld.2.port
+SERVER_MYPORT_3= @mysqld.3.port
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.test b/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.test
new file mode 100644
index 00000000000..c7d5bd66e2b
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.test
@@ -0,0 +1,164 @@
+#
+# MENT-662 Lag Free Alter On Slave
+#
+
+# Start Alter with Parallel Replication, With 2 sources
+# 2 domain id (From 2 sources)
+# |Concurrent alters| < |Parallel workers on slave|
+# |x| denotes number of entities it encloses
+# And then binary log from slave is replayed to slave again to check if
+# binlog output is okay.
+#
+
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/have_debug.inc
+--connect (server_1,127.0.0.1,root,,,$SERVER_MYPORT_1)
+--connect (server_2,127.0.0.1,root,,,$SERVER_MYPORT_2)
+--connect (server_3,127.0.0.1,root,,,$SERVER_MYPORT_3)
+
+--connection server_1
+SET @save_binlog_alter_two_phase= @@GLOBAL.binlog_alter_two_phase;
+SET GLOBAL binlog_alter_two_phase = ON;
+SET binlog_alter_two_phase = ON;
+--echo # Create table and perform CA and RA
+CREATE TABLE t1( a INT, b INT) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(1,1);
+INSERT INTO t1 VALUES(2,2);
+--echo # Normal Alter
+ALTER TABLE t1 ADD COLUMN c INT;
+--echo # Failed Alter
+INSERT INTO t1 VALUES(1,1, NULL);
+--error ER_DUP_ENTRY
+ALTER TABLE t1 CHANGE a a INT UNIQUE;
+SHOW CREATE TABLE t1;
+SELECT @@gtid_binlog_state;
+
+--echo # apply the binlog
+let MYSQLD_DATADIR= `select @@datadir;`;
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/master_1.sql
+DROP TABLE t1;
+--echo # reset the binlog
+RESET MASTER;
+
+--echo # execute the binlog
+--exec $MYSQL --port=$SERVER_MYPORT_1 --host=127.0.0.1 -e "source $MYSQLTEST_VARDIR/tmp/master_1.sql"
+SELECT @@gtid_binlog_state;
+--echo # Same as before
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+--echo # reset the binlog
+RESET MASTER;
+RESET SLAVE;
+remove_file $MYSQLTEST_VARDIR/tmp/master_1.sql;
+
+--connection server_2
+SET @save_binlog_alter_two_phase= @@GLOBAL.binlog_alter_two_phase;
+SET GLOBAL binlog_alter_two_phase = ON;
+
+--connection server_3
+SET @save_gtid_strict_mode= @@GLOBAL.gtid_strict_mode;
+SET @slave_parallel_threads= @@GLOBAL.slave_parallel_threads;
+SET @slave_parallel_mode= @@GLOBAL.slave_parallel_mode;
+SET GLOBAL slave_parallel_threads=20;
+SET GLOBAL slave_parallel_mode=optimistic;
+SET GLOBAL gtid_strict_mode=1;
+
+--disable_warnings
+--disable_query_log
+--replace_result $SERVER_MYPORT_1 MYPORT_1
+eval CHANGE MASTER 'm1' TO MASTER_PORT=$SERVER_MYPORT_1, MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_USE_GTID=slave_pos;
+--replace_result $SERVER_MYPORT_2 MYPORT_2
+eval CHANGE MASTER 'm2' TO MASTER_PORT=$SERVER_MYPORT_2, MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_USE_GTID=slave_pos;
+--enable_query_log
+--enable_warnings
+
+--connection server_1
+SET gtid_domain_id= 11;
+CREATE DATABASE s1;
+USE s1;
+--let $domain_1=11
+--let $domain_2=11
+--let $M_port= $SERVER_MYPORT_1
+--let $S_port= $SERVER_MYPORT_3
+--let $sync_slave=0
+--let $db_name=s1
+--source include/start_alter_include.inc
+
+--connection server_1
+DROP DATABASE s1;
+--let $master_pos_1= `SELECT @@gtid_binlog_pos`
+
+--connection server_2
+SET gtid_domain_id= 12;
+CREATE DATABASE s2;
+USE s2;
+--let $domain_1=12
+--let $domain_2=12
+--let $M_port= $SERVER_MYPORT_2
+--let $S_port= $SERVER_MYPORT_3
+--let $sync_slave=0
+--let $db_name=s2
+--source include/start_alter_include.inc
+--connection server_2
+DROP DATABASE s2;
+--let $master_pos_2= `SELECT @@gtid_binlog_pos`
+
+--connection server_3
+START ALL SLAVES;
+SET default_master_connection = 'm1';
+--source include/wait_for_slave_to_start.inc
+SET default_master_connection = 'm2';
+--source include/wait_for_slave_to_start.inc
+
+SET default_master_connection = 'm1';
+--let $master_pos= $master_pos_1
+--source include/sync_with_master_gtid.inc
+SET default_master_connection = 'm2';
+--let $master_pos= $master_pos_2
+--source include/sync_with_master_gtid.inc
+
+--echo # Stop slaves and apply binlog
+--connection server_3
+SET default_master_connection = 'm1';
+--source include/stop_slave.inc
+SET default_master_connection = 'm2';
+--source include/stop_slave.inc
+SET GLOBAL slave_parallel_threads = @slave_parallel_threads;
+SET GLOBAL slave_parallel_mode = @slave_parallel_mode;
+SET GLOBAL gtid_strict_mode = @save_gtid_strict_mode;
+SET GLOBAL gtid_domain_id= 0;
+SELECT @@gtid_binlog_state;
+
+let MYSQLD_DATADIR= `select @@datadir;`;
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/slave_1.sql
+--echo # reset the binlog
+RESET MASTER;
+--echo # execute the binlog
+--exec $MYSQL --port=$SERVER_MYPORT_3 --host=127.0.0.1 -e "source $MYSQLTEST_VARDIR/tmp/slave_1.sql"
+SELECT @@gtid_binlog_state;
+
+--echo # One more time to simulate S->S case
+--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/slave_2.sql
+RESET MASTER;
+--echo # execute the binlog
+--exec $MYSQL --port=$SERVER_MYPORT_3 --host=127.0.0.1 -e "source $MYSQLTEST_VARDIR/tmp/slave_2.sql"
+SELECT @@gtid_binlog_state;
+remove_file $MYSQLTEST_VARDIR/tmp/slave_1.sql;
+remove_file $MYSQLTEST_VARDIR/tmp/slave_2.sql;
+RESET MASTER;
+RESET SLAVE ALL;
+SET GLOBAL gtid_slave_pos= '';
+
+--connection server_1
+SET GLOBAL binlog_alter_two_phase=@save_binlog_alter_two_phase;
+SET GLOBAL gtid_domain_id= 0;
+RESET MASTER;
+--connection server_2
+SET GLOBAL gtid_domain_id= 0;
+SET GLOBAL binlog_alter_two_phase=@save_binlog_alter_two_phase;
+RESET MASTER;
+
+--disconnect server_1
+--disconnect server_2
+--disconnect server_3
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_optimize.test b/mysql-test/suite/rpl/t/rpl_start_alter_optimize.test
new file mode 100644
index 00000000000..528f2b52af7
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_optimize.test
@@ -0,0 +1,25 @@
+# MDEV-11675 two phase logged ALTER
+#
+# The tests verifies execution of non-ALTER queries that are handled
+# through mysql_alter_table function.
+
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+
+--connection master
+set binlog_alter_two_phase = ON;
+
+--connection master
+CREATE TABLE t1 (i int) engine=innodb;
+CREATE TABLE t2 (i int) engine=innodb;
+
+ALTER TABLE t1 DROP CONSTRAINT IF EXISTS y;
+OPTIMIZE TABLE t2;
+
+--sync_slave_with_master
+
+--connection master
+drop table t1,t2;
+
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_options.test b/mysql-test/suite/rpl/t/rpl_start_alter_options.test
new file mode 100644
index 00000000000..12125b49122
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_options.test
@@ -0,0 +1,31 @@
+# This test will test all the option related to the Alter Table command
+# NOTE not all alter statements will follow alter_algorithm since for some statements
+# copy is only option
+# parameters
+# $alter_algorithm {DEFAULT|INPLACE|COPY|NOCOPY|INSTANT}
+# $show_binlog
+#
+
+--source include/have_partition.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+
+--let $alter_algorithm= default
+#--let $show_binlog= false
+--source include/start_alter_options.inc
+
+--let $alter_algorithm= inplace
+--source include/start_alter_options.inc
+
+--let $alter_algorithm= copy
+--source include/start_alter_options.inc
+
+--echo # Prove formal support for nocopy and instant
+--let $alter_algorithm= instant
+--source include/start_alter_options.inc
+
+--let $alter_algorithm= nocopy
+--source include/start_alter_options.inc
+
+
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_para_to_seq.test b/mysql-test/suite/rpl/t/rpl_start_alter_para_to_seq.test
new file mode 100644
index 00000000000..37e253139d2
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_para_to_seq.test
@@ -0,0 +1,24 @@
+# MDEV-11675 binlog_alter_two_phase
+# MDEV-27511 Assertion `rgi->gtid_ev_flags_extra & Gtid_log_event::FL_COMMIT_ALTER_E1' failed
+# in write_bin_log_start_alter
+#
+--source include/have_log_bin.inc
+--source include/master-slave.inc
+
+# The test proves the assert is not hit anymore.
+--connection master
+CREATE TABLE t1 (a1 int, d1 int DEFAULT 0);
+INSERT INTO t1 VALUES (1,1) ;
+SET binlog_alter_two_phase = ON;
+ALTER TABLE t1 WAIT 9 RENAME COLUMN a1 TO a2;
+SET binlog_alter_two_phase = OFF;
+ALTER TABLE t1 ALTER COLUMN d1 DROP DEFAULT;
+
+--sync_slave_with_master
+
+# Cleanup
+--connection master
+drop table t1;
+--sync_slave_with_master
+
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_restart_master.test b/mysql-test/suite/rpl/t/rpl_start_alter_restart_master.test
new file mode 100644
index 00000000000..eaddaa4db67
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_restart_master.test
@@ -0,0 +1,76 @@
+# Test crashing of master after writing start alter into binary log.
+# And the doing the same alter again, to test on slave if that is successful
+# ====> SA Crash SA CA Case
+#
+--source include/have_log_bin.inc
+--source include/have_binlog_format_mixed.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+--source include/have_debug.inc
+--source include/no_valgrind_without_big.inc
+
+--connection slave
+SET @old_debug_slave= @@global.debug;
+stop slave;
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+start slave;
+
+--connection master
+call mtr.add_suppression("ALTER query started at .+ could not be completed");
+
+SET @old_debug_master= @@global.debug;
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set binlog_alter_two_phase=true;
+create table t3( a int primary key, b int) engine=innodb;
+
+--connection master
+--sync_slave_with_master
+--source include/stop_slave.inc
+
+
+--connection master
+--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
+SET SESSION debug_dbug="d,start_alter_kill_after_binlog";
+--error 2013
+alter table t3 add column d int;
+
+--let $rpl_server_number= 1
+--source include/rpl_reconnect.inc
+set binlog_alter_two_phase= true;
+alter table t3 add column d int;
+show create table t3;
+--source include/show_binlog_events.inc
+--let $binlog_file=master-bin.000002
+--source include/show_binlog_events.inc
+--let $binlog_file=
+
+--connection slave
+--source include/start_slave.inc
+
+--connection master
+--sync_slave_with_master
+--source include/show_binlog_events.inc
+show create table t3;
+
+
+--connection master
+SET GLOBAL debug_dbug= @old_debug_master;
+drop table t3;
+--eval set global binlog_alter_two_phase = $binlog_alter_two_phase
+
+--sync_slave_with_master
+SET GLOBAL debug_dbug= @old_debug_slave;
+stop slave;
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+start slave;
+--connection master
+let MYSQLD_DATADIR= `select @@datadir;`;
+--remove_files_wildcard $MYSQLD_DATADIR/test #sql*.frm
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test b/mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test
new file mode 100644
index 00000000000..df028ff1820
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test
@@ -0,0 +1,121 @@
+# This test will restart the slave in middle of start alter commit alter processing
+# slave will be restarted after start alter and before binlogging of commit alter,
+# Then we will recieved commit alter from the master.
+# Commit alter will act like standalone alter
+# =====> SA SA CA(Stop Slave before binlogging) CA
+#
+--source include/have_log_bin.inc
+--source include/have_innodb.inc
+--source include/master-slave.inc
+--source include/have_debug.inc
+
+--connection slave
+SET @old_debug_slave= @@global.debug;
+--source include/stop_slave.inc
+--let $gtid_strict_mode= `select @@gtid_strict_mode`
+--let $slave_parallel_threads= `select @@slave_parallel_threads`
+--let $slave_parallel_mode= `select @@slave_parallel_mode`
+SET GLOBAL slave_parallel_threads=4;
+set global slave_parallel_mode=optimistic;
+set global gtid_strict_mode=1;
+
+set global debug_dbug="+d,rpl_slave_stop_CA_before_binlog";
+
+--source include/start_slave.inc
+#
+# SLAVE Shutdown
+--connection master
+SET @old_debug_master= @@global.debug;
+set global debug_dbug="+d,start_alter_delay_master";
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set global binlog_alter_two_phase=true;
+create table t1( a int primary key, b int) engine=myisam;
+create table t2( a int primary key, b int) engine=myisam;
+
+--connect (con1,localhost,root,,)
+--send alter table t1 add column c int;
+
+--connection master
+--echo # Get into binlog first and wait
+--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: now';
+--source include/wait_condition.inc
+--let $master_gtid_state = `select @@gtid_binlog_state`
+--echo # master gtid state is $master_gtid_state
+
+--connect (con2,localhost,root,,)
+--send alter table t2 add column c int;
+
+--connection master
+--echo # Get into binlog next and wait as well
+--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: now';
+--source include/wait_condition.inc
+--let $master_gtid_state = `select @@gtid_binlog_state`
+--echo # master gtid state is $master_gtid_state
+
+# Memorize for slave's next sync with master
+--let $master_pos=$master_gtid_state
+
+set DEBUG_SYNC= "now signal alter_cont";
+
+--connection con1
+--reap
+--connection con2
+--reap
+create table t3( a int primary key, b int) engine=innodb;
+--let $master_gtid_state = `select @@gtid_binlog_state`
+--echo # master gtid state is $master_gtid_state
+--let $replace_regexp=/alter table t[12]/alter table <t>/ /id=[0-9]+/id=<seq_no>/
+--source include/show_binlog_events2.inc
+
+--echo # Stop Slave
+--echo # As master binlog is SA SA CA CA
+--echo # let's stop at first CA processing (in process_commit_alter)
+
+--connection slave
+--source include/sync_with_master_gtid.inc
+# set debug_sync="now wait_for CA_1_processing";
+connect(extra_slave,127.0.0.1,root,,test,$SLAVE_MYPORT);
+--send stop slave;
+--connection slave
+# set debug_sync="now signal proceed_CA_1";
+--connection extra_slave
+--reap
+SET GLOBAL debug_dbug= @old_debug_slave;
+
+--connection slave
+--source include/wait_for_slave_sql_to_stop.inc
+--echo # The list of events after the slave has stopped must have just one CA:
+--let $replace_regexp=/alter table t[12]/alter table <t>/ /id=[0-9]+/id=<seq_no>/
+--source include/show_binlog_events2.inc
+
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+--source include/start_slave.inc
+--connection master
+--sync_slave_with_master
+--echo # Everything from the master binlog must have been applied now:
+select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1;
+--let $slave_gtid_state = `select @@gtid_binlog_state`
+--echo # slave gtid state is $slave_gtid_state
+if (`select $master_gtid_state <> $slave_gtid_state`)
+{
+ --echo Gtid state mismatch: $master_gtid_state <> $slave_gtid_state
+ --die
+}
+--echo # The list of events after the slave has synchronized must have both CA:
+--let $replace_regexp=/alter table t[12]/alter table <t>/ /id=[0-9]+/id=<seq_no>/
+--source include/show_binlog_events2.inc
+
+--connection master
+drop table t1,t2,t3;
+--eval set global binlog_alter_two_phase = $binlog_alter_two_phase
+SET GLOBAL debug_dbug= @old_debug_master;
+set DEBUG_SYNC= 'RESET';
+
+--sync_slave_with_master
+stop slave;
+--eval set global slave_parallel_threads = $slave_parallel_threads;
+--eval set global slave_parallel_mode = $slave_parallel_mode;
+--eval set global gtid_strict_mode = $gtid_strict_mode;
+set DEBUG_SYNC= 'RESET';
+start slave;
+--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test b/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test
index d864e615f7a..766acb14c3d 100644
--- a/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test
+++ b/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test
@@ -4,7 +4,7 @@
# This test case will test the condition of the bug#40013.
# The test step is:
# 1: create temp table on connection 'master';
-# 2: switch to ROW format using 'INSERT INTO t1 VALUES (UUID());'
+# 2: switch to ROW format using 'INSERT INTO t1 VALUES (SYS_GUID());'
# 3: disconnect 'master' and connect to a new connection 'master1';
# 4: sync to slave and check the number of temp tables on slave.
#
@@ -19,7 +19,7 @@ source include/master-slave.inc;
CREATE TABLE t1 (a CHAR(48));
CREATE TEMPORARY TABLE t1_tmp1(a INT);
-INSERT INTO t1 VALUES (UUID());
+INSERT INTO t1 VALUES (SYS_GUID());
sync_slave_with_master;
@@ -188,7 +188,7 @@ DROP TEMPORARY TABLE t1;
--echo # The rows event will binlogged after 'INSERT INTO t1 VALUES(1)'
--disable_warnings
-INSERT IGNORE INTO t1 VALUES(uuid()+0);
+INSERT IGNORE INTO t1 VALUES(SYS_GUID()+0);
--enable_warnings
COMMIT;
diff --git a/mysql-test/suite/s3/mysqldump.result b/mysql-test/suite/s3/mysqldump.result
index 5efde8415fb..3f4c2081388 100644
--- a/mysql-test/suite/s3/mysqldump.result
+++ b/mysql-test/suite/s3/mysqldump.result
@@ -23,7 +23,11 @@ CREATE TABLE `t1` (
PRIMARY KEY (`pk`)
) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1,1),(2,2),(3,3),(4,4);
+INSERT INTO `t1` VALUES
+(1,1),
+(2,2),
+(3,3),
+(4,4);
ALTER TABLE `t1` ENGINE=S3;
#####
# mysqldump with --copy-s3-tables=1 XML
diff --git a/mysql-test/suite/sql_sequence/mysqldump.result b/mysql-test/suite/sql_sequence/mysqldump.result
index 47b93eff7d1..0199bb7162f 100644
--- a/mysql-test/suite/sql_sequence/mysqldump.result
+++ b/mysql-test/suite/sql_sequence/mysqldump.result
@@ -14,7 +14,9 @@ CREATE TABLE `t1` (
KEY `a` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci KEY_BLOCK_SIZE=1024;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1),(2);
+INSERT INTO `t1` VALUES
+(1),
+(2);
# dump by tables order 1
CREATE SEQUENCE `a1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=Aria;
SELECT SETVAL(`a1`, 1, 0);
@@ -27,7 +29,9 @@ CREATE TABLE `t1` (
KEY `a` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci KEY_BLOCK_SIZE=1024;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1),(2);
+INSERT INTO `t1` VALUES
+(1),
+(2);
# dump by tables order 2
CREATE SEQUENCE `a1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=Aria;
SELECT SETVAL(`a1`, 1, 0);
@@ -40,7 +44,9 @@ CREATE TABLE `t1` (
KEY `a` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci KEY_BLOCK_SIZE=1024;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1),(2);
+INSERT INTO `t1` VALUES
+(1),
+(2);
# dump by tables only tables
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
@@ -49,7 +55,9 @@ CREATE TABLE `t1` (
KEY `a` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci KEY_BLOCK_SIZE=1024;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT INTO `t1` VALUES (1),(2);
+INSERT INTO `t1` VALUES
+(1),
+(2);
# dump by tables only sequences
CREATE SEQUENCE `a1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=Aria;
SELECT SETVAL(`a1`, 1, 0);
diff --git a/mysql-test/suite/sys_vars/r/binlog_alter_two_phase.result b/mysql-test/suite/sys_vars/r/binlog_alter_two_phase.result
new file mode 100644
index 00000000000..540d1b49458
--- /dev/null
+++ b/mysql-test/suite/sys_vars/r/binlog_alter_two_phase.result
@@ -0,0 +1,53 @@
+set binlog_alter_two_phase = OFF;
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+0
+set binlog_alter_two_phase = ON;
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+1
+# wrong value
+set binlog_alter_two_phase=BINLOG_OY;
+ERROR 42000: Variable 'binlog_alter_two_phase' can't be set to the value of 'BINLOG_OY'
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+1
+#true and false
+set binlog_alter_two_phase=false;
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+0
+set binlog_alter_two_phase=true;
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+1
+set binlog_alter_two_phase=0;
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+0
+set binlog_alter_two_phase=1;
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+1
+##wrong value
+set binlog_alter_two_phase=2;
+ERROR 42000: Variable 'binlog_alter_two_phase' can't be set to the value of '2'
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+1
+#Global value
+set global binlog_alter_two_phase = OFF;
+connect con1,localhost,root,,;
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+0
+disconnect con1;
+connection default;
+set global binlog_alter_two_phase = ON;
+connect con1,localhost,root,,;
+select @@binlog_alter_two_phase;
+@@binlog_alter_two_phase
+1
+disconnect con1;
+connection default;
+set global binlog_alter_two_phase=0;
diff --git a/mysql-test/suite/sys_vars/r/default_tmp_storage_engine_rocksdb.result b/mysql-test/suite/sys_vars/r/default_tmp_storage_engine_rocksdb.result
new file mode 100644
index 00000000000..19fae14579d
--- /dev/null
+++ b/mysql-test/suite/sys_vars/r/default_tmp_storage_engine_rocksdb.result
@@ -0,0 +1,102 @@
+#
+# MDEV-12914: Engine for temporary tables which are implicitly
+# created as RocksDB is substitued siliently with MyIsam
+SET default_tmp_storage_engine = engine_doesnt_exist;
+ERROR 42000: Unknown storage engine 'engine_doesnt_exist'
+SET default_tmp_storage_engine = rocksdb;
+ERROR HY000: Table storage engine 'ROCKSDB' does not support the create option 'TEMPORARY'
+SET default_tmp_storage_engine = CONCAT('rocks','db');
+ERROR HY000: Table storage engine 'ROCKSDB' does not support the create option 'TEMPORARY'
+CREATE TABLE t1 (i int) ENGINE = RocksDB;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `i` int(11) DEFAULT NULL
+) ENGINE=ROCKSDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TEMPORARY TABLE t2 LIKE t1;
+ERROR HY000: Table storage engine 'ROCKSDB' does not support the create option 'TEMPORARY'
+DROP TABLE t1;
+SET default_storage_engine = DEFAULT;
+SET default_tmp_storage_engine = DEFAULT;
+CREATE TABLE t1 (t int);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `t` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TEMPORARY TABLE t2 LIKE t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TEMPORARY TABLE `t2` (
+ `t` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t1, t2;
+SET default_storage_engine = rocksdb;
+SET default_tmp_storage_engine = default;
+CREATE TABLE t1 (t int);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `t` int(11) DEFAULT NULL
+) ENGINE=ROCKSDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TEMPORARY TABLE t2 LIKE t1;
+ERROR HY000: Table storage engine 'ROCKSDB' does not support the create option 'TEMPORARY'
+CREATE TEMPORARY TABLE t2 (t int);
+ERROR HY000: Table storage engine 'ROCKSDB' does not support the create option 'TEMPORARY'
+SET default_tmp_storage_engine = aria;
+CREATE TEMPORARY TABLE t2 (t int);
+DROP TABLE t2;
+CREATE TEMPORARY TABLE t2 LIKE t1;
+ERROR HY000: Table storage engine 'ROCKSDB' does not support the create option 'TEMPORARY'
+DROP TABLE t1;
+#
+# MDEV-26242: Assertion `i >= 0' failed on setting
+# default_tmp_storage_engine to 'DEFAULT' in 10.7
+#
+SHOW VARIABLES like '%storage_engine';
+Variable_name Value
+default_storage_engine ROCKSDB
+default_tmp_storage_engine Aria
+enforce_storage_engine
+storage_engine ROCKSDB
+SELECT @@GLOBAL.default_tmp_storage_engine, @@GLOBAL.default_storage_engine, @@GLOBAL.storage_engine, @@SESSION.default_tmp_storage_engine, @@SESSION.default_storage_engine, @@SESSION.storage_engine;
+@@GLOBAL.default_tmp_storage_engine @@GLOBAL.default_storage_engine @@GLOBAL.storage_engine @@SESSION.default_tmp_storage_engine @@SESSION.default_storage_engine @@SESSION.storage_engine
+NULL MyISAM MyISAM Aria ROCKSDB ROCKSDB
+SELECT @@GLOBAL.table_type;
+ERROR HY000: Unknown system variable 'table_type'
+SET default_storage_engine=DEFAULT;
+SET default_tmp_storage_engine=innodb;
+SELECT @@GLOBAL.default_tmp_storage_engine, @@GLOBAL.default_storage_engine, @@GLOBAL.storage_engine, @@SESSION.default_tmp_storage_engine, @@SESSION.default_storage_engine, @@SESSION.storage_engine;
+@@GLOBAL.default_tmp_storage_engine @@GLOBAL.default_storage_engine @@GLOBAL.storage_engine @@SESSION.default_tmp_storage_engine @@SESSION.default_storage_engine @@SESSION.storage_engine
+NULL MyISAM MyISAM InnoDB MyISAM MyISAM
+CREATE TABLE t (t int);
+CREATE TEMPORARY TABLE t1 (t int);
+SHOW CREATE TABLE t;
+Table Create Table
+t CREATE TABLE `t` (
+ `t` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TEMPORARY TABLE `t1` (
+ `t` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t1, t;
+SET GLOBAL default_tmp_storage_engine='default';
+SELECT @@GLOBAL.default_tmp_storage_engine, @@GLOBAL.default_storage_engine, @@GLOBAL.storage_engine, @@SESSION.default_tmp_storage_engine, @@SESSION.default_storage_engine, @@SESSION.storage_engine;
+@@GLOBAL.default_tmp_storage_engine @@GLOBAL.default_storage_engine @@GLOBAL.storage_engine @@SESSION.default_tmp_storage_engine @@SESSION.default_storage_engine @@SESSION.storage_engine
+MyISAM MyISAM MyISAM InnoDB MyISAM MyISAM
+CREATE TABLE t (t int);
+CREATE TEMPORARY TABLE t1 (t int);
+SHOW CREATE TABLE t;
+Table Create Table
+t CREATE TABLE `t` (
+ `t` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TEMPORARY TABLE `t1` (
+ `t` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t1, t;
+SET GLOBAL default_tmp_storage_engine=NULL;
diff --git a/mysql-test/suite/sys_vars/r/histogram_type_basic.result b/mysql-test/suite/sys_vars/r/histogram_type_basic.result
index db42204ac1f..c24192002aa 100644
--- a/mysql-test/suite/sys_vars/r/histogram_type_basic.result
+++ b/mysql-test/suite/sys_vars/r/histogram_type_basic.result
@@ -1,11 +1,11 @@
SET @start_global_value = @@global.histogram_type;
SELECT @start_global_value;
@start_global_value
-DOUBLE_PREC_HB
+JSON_HB
SET @start_session_value = @@session.histogram_type;
SELECT @start_session_value;
@start_session_value
-DOUBLE_PREC_HB
+JSON_HB
SET @@global.histogram_type = 1;
SET @@global.histogram_type = DEFAULT;
SELECT @@global.histogram_type;
@@ -71,9 +71,9 @@ HISTOGRAM_TYPE DOUBLE_PREC_HB
SET @@global.histogram_type = @start_global_value;
SELECT @@global.histogram_type;
@@global.histogram_type
-DOUBLE_PREC_HB
+JSON_HB
SET @@session.histogram_type = @start_session_value;
SELECT @@session.histogram_type;
@@session.histogram_type
-DOUBLE_PREC_HB
+JSON_HB
set sql_mode='';
diff --git a/mysql-test/suite/sys_vars/r/innodb_log_write_ahead_size_basic.result b/mysql-test/suite/sys_vars/r/innodb_log_write_ahead_size_basic.result
deleted file mode 100644
index 5c9eb69de50..00000000000
--- a/mysql-test/suite/sys_vars/r/innodb_log_write_ahead_size_basic.result
+++ /dev/null
@@ -1,88 +0,0 @@
-SET @start_global_value = @@global.innodb_log_write_ahead_size;
-SET global innodb_log_write_ahead_size=4096;
-Valid values are positive number
-SELECT @@global.innodb_log_write_ahead_size >= 512;
-@@global.innodb_log_write_ahead_size >= 512
-1
-SELECT @@global.innodb_log_write_ahead_size <= 16*1024;
-@@global.innodb_log_write_ahead_size <= 16*1024
-1
-SELECT @@session.innodb_log_write_ahead_size;
-ERROR HY000: Variable 'innodb_log_write_ahead_size' is a GLOBAL variable
-SHOW global variables LIKE 'innodb_log_write_ahead_size';
-Variable_name Value
-innodb_log_write_ahead_size 4096
-SHOW session variables LIKE 'innodb_log_write_ahead_size';
-Variable_name Value
-innodb_log_write_ahead_size 4096
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_log_write_ahead_size';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_LOG_WRITE_AHEAD_SIZE 4096
-SELECT * FROM information_schema.session_variables
-WHERE variable_name='innodb_log_write_ahead_size';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_LOG_WRITE_AHEAD_SIZE 4096
-SET global innodb_log_write_ahead_size=1024;
-SELECT @@global.innodb_log_write_ahead_size;
-@@global.innodb_log_write_ahead_size
-1024
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_log_write_ahead_size';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_LOG_WRITE_AHEAD_SIZE 1024
-SELECT * FROM information_schema.session_variables
-WHERE variable_name='innodb_log_write_ahead_size';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_LOG_WRITE_AHEAD_SIZE 1024
-SET session innodb_log_write_ahead_size=2048;
-ERROR HY000: Variable 'innodb_log_write_ahead_size' is a GLOBAL variable and should be set with SET GLOBAL
-SET global innodb_log_write_ahead_size=512;
-SELECT @@global.innodb_log_write_ahead_size;
-@@global.innodb_log_write_ahead_size
-512
-SET global innodb_log_write_ahead_size=2048;
-SELECT @@global.innodb_log_write_ahead_size;
-@@global.innodb_log_write_ahead_size
-2048
-SET global innodb_log_write_ahead_size=4096;
-SELECT @@global.innodb_log_write_ahead_size;
-@@global.innodb_log_write_ahead_size
-4096
-SET global innodb_log_write_ahead_size=0;
-Warnings:
-Warning 1292 Truncated incorrect innodb_log_write_ahead_size value: '0'
-SELECT @@global.innodb_log_write_ahead_size;
-@@global.innodb_log_write_ahead_size
-512
-SET global innodb_log_write_ahead_size=-1024;
-Warnings:
-Warning 1292 Truncated incorrect innodb_log_write_ahead_size value: '-1024'
-SELECT @@global.innodb_log_write_ahead_size;
-@@global.innodb_log_write_ahead_size
-512
-SET global innodb_log_write_ahead_size=3000;
-Warnings:
-Warning 1292 Truncated incorrect innodb_log_write_ahead_size value: '3000'
-Warning 1210 innodb_log_write_ahead_size should be set 2^n value and larger than 512.
-Warning 1210 Setting innodb_log_write_ahead_size to 4096
-SELECT @@global.innodb_log_write_ahead_size;
-@@global.innodb_log_write_ahead_size
-4096
-SET global innodb_log_write_ahead_size=1.1;
-ERROR 42000: Incorrect argument type to variable 'innodb_log_write_ahead_size'
-SET global innodb_log_write_ahead_size=1e1;
-ERROR 42000: Incorrect argument type to variable 'innodb_log_write_ahead_size'
-SET global innodb_log_write_ahead_size="foo";
-ERROR 42000: Incorrect argument type to variable 'innodb_log_write_ahead_size'
-SET global innodb_log_write_ahead_size=-7;
-Warnings:
-Warning 1292 Truncated incorrect innodb_log_write_ahead_size value: '-7'
-SELECT @@global.innodb_log_write_ahead_size;
-@@global.innodb_log_write_ahead_size
-512
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_log_write_ahead_size';
-VARIABLE_NAME VARIABLE_VALUE
-INNODB_LOG_WRITE_AHEAD_SIZE 512
-SET @@global.innodb_log_write_ahead_size = @start_global_value;
diff --git a/mysql-test/suite/sys_vars/r/innodb_purge_threads_basic.result b/mysql-test/suite/sys_vars/r/innodb_purge_threads_basic.result
index 2cb697acb6d..68d3d40091a 100644
--- a/mysql-test/suite/sys_vars/r/innodb_purge_threads_basic.result
+++ b/mysql-test/suite/sys_vars/r/innodb_purge_threads_basic.result
@@ -6,9 +6,27 @@ SELECT COUNT(@@innodb_purge_threads);
COUNT(@@innodb_purge_threads)
1
1 Expected
+SET @save_threads = @@GLOBAL.innodb_purge_threads;
+SET @@GLOBAL.innodb_purge_threads=-1;
+Warnings:
+Warning 1292 Truncated incorrect innodb_purge_threads value: '-1'
+SELECT @@GLOBAL.innodb_purge_threads;
+@@GLOBAL.innodb_purge_threads
+1
+SET @@GLOBAL.innodb_purge_threads=0;
+Warnings:
+Warning 1292 Truncated incorrect innodb_purge_threads value: '0'
+SELECT @@GLOBAL.innodb_purge_threads;
+@@GLOBAL.innodb_purge_threads
+1
+SET @@GLOBAL.innodb_purge_threads=33;
+Warnings:
+Warning 1292 Truncated incorrect innodb_purge_threads value: '33'
+SELECT @@GLOBAL.innodb_purge_threads;
+@@GLOBAL.innodb_purge_threads
+32
SET @@GLOBAL.innodb_purge_threads=1;
-ERROR HY000: Variable 'innodb_purge_threads' is a read only variable
-Expected error 'Read-only variable'
+SET @@GLOBAL.innodb_purge_threads=32;
SELECT innodb_purge_threads = @@SESSION.innodb_purge_threads;
ERROR 42S22: Unknown column 'innodb_purge_threads' in 'field list'
Expected error 'Read-only variable'
@@ -38,4 +56,5 @@ SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME = 'innodb_purge_threads';
VARIABLE_NAME VARIABLE_VALUE
-INNODB_PURGE_THREADS 4
+INNODB_PURGE_THREADS 32
+SET GLOBAL innodb_purge_threads = @save_threads;
diff --git a/mysql-test/suite/sys_vars/r/keep_files_on_create_basic.result b/mysql-test/suite/sys_vars/r/keep_files_on_create_basic.result
index 01ad4659b46..f7889f3f7dd 100644
--- a/mysql-test/suite/sys_vars/r/keep_files_on_create_basic.result
+++ b/mysql-test/suite/sys_vars/r/keep_files_on_create_basic.result
@@ -8,23 +8,35 @@ SELECT @start_session_value;
0
'#--------------------FN_DYNVARS_054_01-------------------------#'
SET @@global.keep_files_on_create = ON;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SET @@global.keep_files_on_create = DEFAULT;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@global.keep_files_on_create;
@@global.keep_files_on_create
0
SET @@session.keep_files_on_create = ON;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SET @@session.keep_files_on_create = DEFAULT;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@session.keep_files_on_create;
@@session.keep_files_on_create
0
'#--------------------FN_DYNVARS_054_02-------------------------#'
SET @@global.keep_files_on_create = DEFAULT;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@global.keep_files_on_create = 'OFF';
@@global.keep_files_on_create = 'OFF'
1
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: 'OFF'
SET @@session.keep_files_on_create = DEFAULT;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@session.keep_files_on_create = 'OFF';
@@session.keep_files_on_create = 'OFF'
1
@@ -32,51 +44,75 @@ Warnings:
Warning 1292 Truncated incorrect DECIMAL value: 'OFF'
'#--------------------FN_DYNVARS_054_03-------------------------#'
SET @@global.keep_files_on_create = ON;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@global.keep_files_on_create;
@@global.keep_files_on_create
1
SET @@global.keep_files_on_create = OFF;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@global.keep_files_on_create;
@@global.keep_files_on_create
0
SET @@global.keep_files_on_create = 0;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@global.keep_files_on_create;
@@global.keep_files_on_create
0
SET @@global.keep_files_on_create = 1;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@global.keep_files_on_create;
@@global.keep_files_on_create
1
SET @@global.keep_files_on_create = TRUE;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@global.keep_files_on_create;
@@global.keep_files_on_create
1
SET @@global.keep_files_on_create = FALSE;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@global.keep_files_on_create;
@@global.keep_files_on_create
0
'#--------------------FN_DYNVARS_054_04-------------------------#'
SET @@session.keep_files_on_create = ON;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@session.keep_files_on_create;
@@session.keep_files_on_create
1
SET @@session.keep_files_on_create = OFF;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@session.keep_files_on_create;
@@session.keep_files_on_create
0
SET @@session.keep_files_on_create = 0;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@session.keep_files_on_create;
@@session.keep_files_on_create
0
SET @@session.keep_files_on_create = 1;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@session.keep_files_on_create;
@@session.keep_files_on_create
1
SET @@session.keep_files_on_create = TRUE;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@session.keep_files_on_create;
@@session.keep_files_on_create
1
SET @@session.keep_files_on_create = FALSE;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@session.keep_files_on_create;
@@session.keep_files_on_create
0
@@ -130,12 +166,18 @@ IF(@@session.keep_files_on_create, "ON", "OFF") = VARIABLE_VALUE
1
'#---------------------FN_DYNVARS_001_08----------------------#'
SET @@keep_files_on_create = OFF;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SET @@global.keep_files_on_create = ON;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@keep_files_on_create = @@global.keep_files_on_create;
@@keep_files_on_create = @@global.keep_files_on_create
0
'#---------------------FN_DYNVARS_001_09----------------------#'
SET @@keep_files_on_create = ON;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@keep_files_on_create = @@local.keep_files_on_create;
@@keep_files_on_create = @@local.keep_files_on_create
1
@@ -144,6 +186,8 @@ SELECT @@local.keep_files_on_create = @@session.keep_files_on_create;
1
'#---------------------FN_DYNVARS_001_10----------------------#'
SET keep_files_on_create = 1;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@keep_files_on_create;
@@keep_files_on_create
1
@@ -154,10 +198,14 @@ ERROR 42S02: Unknown table 'session' in field list
SELECT keep_files_on_create = @@session.keep_files_on_create;
ERROR 42S22: Unknown column 'keep_files_on_create' in 'field list'
SET @@global.keep_files_on_create = @start_global_value;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@global.keep_files_on_create;
@@global.keep_files_on_create
0
SET @@session.keep_files_on_create = @start_session_value;
+Warnings:
+Warning 1287 '@@keep_files_on_create' is deprecated and will be removed in a future release
SELECT @@session.keep_files_on_create;
@@session.keep_files_on_create
0
diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff
index 7a524ba2c16..3c6f2c3b8d9 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff
@@ -18,14 +18,14 @@
NUMERIC_MAX_VALUE 2
@@ -85,10 +85,10 @@
SESSION_VALUE NULL
- DEFAULT_VALUE 134217728
+ DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT UNSIGNED
+VARIABLE_TYPE INT UNSIGNED
- VARIABLE_COMMENT Size of a single memory chunk for resizing buffer pool. Online buffer pool resizing happens at this granularity. 0 means disable resizing buffer pool.
- NUMERIC_MIN_VALUE 1048576
--NUMERIC_MAX_VALUE 9223372036854775807
-+NUMERIC_MAX_VALUE 2147483647
+ VARIABLE_COMMENT Size of a single memory chunk for resizing buffer pool. Online buffer pool resizing happens at this granularity. 0 means autosize this variable based on buffer pool size.
+ NUMERIC_MIN_VALUE 0
+-NUMERIC_MAX_VALUE 18446744073709551615
++NUMERIC_MAX_VALUE 4294967295
NUMERIC_BLOCK_SIZE 1048576
ENUM_VALUE_LIST NULL
READ_ONLY YES
@@ -65,7 +65,7 @@
VARIABLE_COMMENT Percentage of empty space on a data page that can be reserved to make the page compressible.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 75
-@@ -649,7 +649,7 @@
+@@ -625,7 +625,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 600
VARIABLE_SCOPE GLOBAL
@@ -74,7 +74,7 @@
VARIABLE_COMMENT Maximum number of seconds that semaphore times out in InnoDB.
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 4294967295
-@@ -697,7 +697,7 @@
+@@ -673,7 +673,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 30
VARIABLE_SCOPE GLOBAL
@@ -83,7 +83,7 @@
VARIABLE_COMMENT Number of iterations over which the background flushing is averaged.
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 1000
-@@ -721,7 +721,7 @@
+@@ -697,7 +697,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 1
VARIABLE_SCOPE GLOBAL
@@ -92,7 +92,7 @@
VARIABLE_COMMENT Controls the durability/speed trade-off for commits. Set to 0 (write and flush redo log to disk only once per second), 1 (flush to disk at each commit), 2 (write to log at commit but flush to disk only once per second) or 3 (flush to disk at prepare and at commit, slower and usually redundant). 1 and 3 guarantees that after a crash, committed transactions will not be lost and will be consistent with the binlog and other transactional engines. 2 can get inconsistent and lose transactions if there is a power failure or kernel crash but not if mysqld crashes. 0 has no guarantees in case of crash. 0 and 2 can be faster than 1 or 3.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 3
-@@ -745,7 +745,7 @@
+@@ -721,7 +721,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 1
VARIABLE_SCOPE GLOBAL
@@ -101,7 +101,7 @@
VARIABLE_COMMENT Set to 0 (don't flush neighbors from buffer pool), 1 (flush contiguous neighbors from buffer pool) or 2 (flush neighbors from buffer pool), when flushing a block
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 2
-@@ -781,7 +781,7 @@
+@@ -757,7 +757,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@@ -110,7 +110,7 @@
VARIABLE_COMMENT Helps to save your data in case the disk image of the database becomes corrupt. Value 5 can return bogus data, and 6 can permanently corrupt data.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 6
-@@ -805,10 +805,10 @@
+@@ -781,10 +781,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 8000000
VARIABLE_SCOPE GLOBAL
@@ -123,7 +123,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
-@@ -841,7 +841,7 @@
+@@ -817,7 +817,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 84
VARIABLE_SCOPE GLOBAL
@@ -132,7 +132,7 @@
VARIABLE_COMMENT InnoDB Fulltext search maximum token size in characters
NUMERIC_MIN_VALUE 10
NUMERIC_MAX_VALUE 84
-@@ -853,7 +853,7 @@
+@@ -829,7 +829,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 3
VARIABLE_SCOPE GLOBAL
@@ -141,7 +141,7 @@
VARIABLE_COMMENT InnoDB Fulltext search minimum token size in characters
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 16
-@@ -865,7 +865,7 @@
+@@ -841,7 +841,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 2000
VARIABLE_SCOPE GLOBAL
@@ -150,7 +150,7 @@
VARIABLE_COMMENT InnoDB Fulltext search number of words to optimize for each optimize table call
NUMERIC_MIN_VALUE 1000
NUMERIC_MAX_VALUE 10000
-@@ -877,10 +877,10 @@
+@@ -853,10 +853,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 2000000000
VARIABLE_SCOPE GLOBAL
@@ -163,7 +163,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
-@@ -901,7 +901,7 @@
+@@ -877,7 +877,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 2
VARIABLE_SCOPE GLOBAL
@@ -172,7 +172,7 @@
VARIABLE_COMMENT InnoDB Fulltext search parallel sort degree, will round up to nearest power of 2 number
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 16
-@@ -913,10 +913,10 @@
+@@ -889,10 +889,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 640000000
VARIABLE_SCOPE GLOBAL
@@ -185,7 +185,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
-@@ -961,22 +961,22 @@
+@@ -937,22 +937,22 @@
SESSION_VALUE NULL
DEFAULT_VALUE 200
VARIABLE_SCOPE GLOBAL
@@ -213,29 +213,20 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
-@@ -1009,10 +1009,10 @@
+@@ -985,10 +985,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 16777216
VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT UNSIGNED
+VARIABLE_TYPE INT UNSIGNED
- VARIABLE_COMMENT The size of the buffer which InnoDB uses to write log to the log files on disk.
- NUMERIC_MIN_VALUE 262144
--NUMERIC_MAX_VALUE 9223372036854775807
-+NUMERIC_MAX_VALUE 2147483647
- NUMERIC_BLOCK_SIZE 1024
+ VARIABLE_COMMENT Redo log buffer size in bytes.
+ NUMERIC_MIN_VALUE 2097152
+-NUMERIC_MAX_VALUE 18446744073709551615
++NUMERIC_MAX_VALUE 4294967295
+ NUMERIC_BLOCK_SIZE 4096
ENUM_VALUE_LIST NULL
READ_ONLY YES
-@@ -1057,7 +1057,7 @@
- SESSION_VALUE NULL
- DEFAULT_VALUE 8192
- VARIABLE_SCOPE GLOBAL
--VARIABLE_TYPE BIGINT UNSIGNED
-+VARIABLE_TYPE INT UNSIGNED
- VARIABLE_COMMENT Redo log write ahead unit size to avoid read-on-write, it should match the OS cache block IO size
- NUMERIC_MIN_VALUE 512
- NUMERIC_MAX_VALUE 16384
-@@ -1069,10 +1069,10 @@
+@@ -1033,10 +1033,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 32
VARIABLE_SCOPE GLOBAL
@@ -248,7 +239,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
-@@ -1081,10 +1081,10 @@
+@@ -1045,10 +1045,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 1536
VARIABLE_SCOPE GLOBAL
@@ -261,7 +252,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
-@@ -1129,10 +1129,10 @@
+@@ -1081,10 +1081,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@@ -274,7 +265,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
-@@ -1141,7 +1141,7 @@
+@@ -1093,7 +1093,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@@ -283,7 +274,7 @@
VARIABLE_COMMENT Maximum delay of user threads in micro-seconds
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 10000000
-@@ -1273,10 +1273,10 @@
+@@ -1225,10 +1225,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@@ -296,7 +287,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY YES
-@@ -1309,7 +1309,7 @@
+@@ -1249,7 +1249,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 16384
VARIABLE_SCOPE GLOBAL
@@ -305,7 +296,7 @@
VARIABLE_COMMENT Page size to use for all InnoDB tablespaces.
NUMERIC_MIN_VALUE 4096
NUMERIC_MAX_VALUE 65536
-@@ -1345,7 +1345,7 @@
+@@ -1285,7 +1285,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 300
VARIABLE_SCOPE GLOBAL
@@ -314,7 +305,7 @@
VARIABLE_COMMENT Number of UNDO log pages to purge in one batch from the history list.
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 5000
-@@ -1357,7 +1357,7 @@
+@@ -1297,7 +1297,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 128
VARIABLE_SCOPE GLOBAL
@@ -323,7 +314,7 @@
VARIABLE_COMMENT Dictates rate at which UNDO records are purged. Value N means purge rollback segment(s) on every Nth iteration of purge invocation
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 128
-@@ -1393,7 +1393,7 @@
+@@ -1333,7 +1333,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 56
VARIABLE_SCOPE GLOBAL
@@ -332,7 +323,7 @@
VARIABLE_COMMENT Number of pages that must be accessed sequentially for InnoDB to trigger a readahead.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 64
-@@ -1465,7 +1465,7 @@
+@@ -1405,7 +1405,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 1048576
VARIABLE_SCOPE GLOBAL
@@ -341,7 +332,7 @@
VARIABLE_COMMENT Memory buffer size for index creation
NUMERIC_MIN_VALUE 65536
NUMERIC_MAX_VALUE 67108864
-@@ -1633,10 +1633,10 @@
+@@ -1573,10 +1573,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 30
VARIABLE_SCOPE GLOBAL
@@ -354,12 +345,3 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
-@@ -1729,7 +1729,7 @@
- SESSION_VALUE NULL
- DEFAULT_VALUE 0
- VARIABLE_SCOPE GLOBAL
--VARIABLE_TYPE BIGINT UNSIGNED
-+VARIABLE_TYPE INT UNSIGNED
- VARIABLE_COMMENT Number of undo tablespaces to use.
- NUMERIC_MIN_VALUE 0
- NUMERIC_MAX_VALUE 127
diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
index 8727d66f59b..c3dd970f6e3 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
@@ -5,6 +5,7 @@ variable_name not in (
'innodb_numa_interleave', # only available WITH_NUMA
'innodb_evict_tables_on_commit_debug', # one may want to override this
'innodb_use_native_aio', # default value depends on OS
+'innodb_log_file_buffering', # only available on Linux and Windows
'innodb_buffer_pool_load_pages_abort') # debug build only, and is only for testing
order by variable_name;
VARIABLE_NAME INNODB_ADAPTIVE_FLUSHING
@@ -81,12 +82,12 @@ READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_BUFFER_POOL_CHUNK_SIZE
SESSION_VALUE NULL
-DEFAULT_VALUE 134217728
+DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
-VARIABLE_COMMENT Size of a single memory chunk for resizing buffer pool. Online buffer pool resizing happens at this granularity. 0 means disable resizing buffer pool.
-NUMERIC_MIN_VALUE 1048576
-NUMERIC_MAX_VALUE 9223372036854775807
+VARIABLE_COMMENT Size of a single memory chunk for resizing buffer pool. Online buffer pool resizing happens at this granularity. 0 means autosize this variable based on buffer pool size.
+NUMERIC_MIN_VALUE 0
+NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 1048576
ENUM_VALUE_LIST NULL
READ_ONLY YES
@@ -984,10 +985,10 @@ SESSION_VALUE NULL
DEFAULT_VALUE 16777216
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
-VARIABLE_COMMENT The size of the buffer which InnoDB uses to write log to the log files on disk.
-NUMERIC_MIN_VALUE 262144
-NUMERIC_MAX_VALUE 9223372036854775807
-NUMERIC_BLOCK_SIZE 1024
+VARIABLE_COMMENT Redo log buffer size in bytes.
+NUMERIC_MIN_VALUE 2097152
+NUMERIC_MAX_VALUE 18446744073709551615
+NUMERIC_BLOCK_SIZE 4096
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
@@ -1008,10 +1009,10 @@ SESSION_VALUE NULL
DEFAULT_VALUE 100663296
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
-VARIABLE_COMMENT Size of each log file in a log group.
-NUMERIC_MIN_VALUE 1048576
+VARIABLE_COMMENT Redo log size in bytes.
+NUMERIC_MIN_VALUE 4194304
NUMERIC_MAX_VALUE 18446744073709551615
-NUMERIC_BLOCK_SIZE 65536
+NUMERIC_BLOCK_SIZE 4096
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
@@ -1020,25 +1021,13 @@ SESSION_VALUE NULL
DEFAULT_VALUE
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE VARCHAR
-VARIABLE_COMMENT Path to InnoDB log files.
+VARIABLE_COMMENT Path to ib_logfile0
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
-VARIABLE_NAME INNODB_LOG_WRITE_AHEAD_SIZE
-SESSION_VALUE NULL
-DEFAULT_VALUE 8192
-VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT UNSIGNED
-VARIABLE_COMMENT Redo log write ahead unit size to avoid read-on-write, it should match the OS cache block IO size
-NUMERIC_MIN_VALUE 512
-NUMERIC_MAX_VALUE 16384
-NUMERIC_BLOCK_SIZE 512
-ENUM_VALUE_LIST NULL
-READ_ONLY NO
-COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_LRU_FLUSH_SIZE
SESSION_VALUE NULL
DEFAULT_VALUE 32
@@ -1325,7 +1314,7 @@ NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 32
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
-READ_ONLY YES
+READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME INNODB_RANDOM_READ_AHEAD
SESSION_VALUE NULL
@@ -1679,7 +1668,7 @@ VARIABLE_NAME INNODB_UNDO_TABLESPACES
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT UNSIGNED
+VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Number of undo tablespaces to use.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 127
diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
index 3eb3f52bd0f..29e5d03dd98 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
@@ -1205,11 +1205,11 @@ COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME HISTOGRAM_TYPE
VARIABLE_SCOPE SESSION
VARIABLE_TYPE ENUM
-VARIABLE_COMMENT Specifies type of the histograms created by ANALYZE. Possible values are: SINGLE_PREC_HB - single precision height-balanced, DOUBLE_PREC_HB - double precision height-balanced.
+VARIABLE_COMMENT Specifies type of the histograms created by ANALYZE. Possible values are: SINGLE_PREC_HB - single precision height-balanced, DOUBLE_PREC_HB - double precision height-balanced, JSON_HB - height-balanced, stored as JSON.
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST SINGLE_PREC_HB,DOUBLE_PREC_HB
+ENUM_VALUE_LIST SINGLE_PREC_HB,DOUBLE_PREC_HB,JSON_HB
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME HOSTNAME
diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
index ff87672bfa3..f0dda77da15 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
@@ -322,6 +322,16 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
+VARIABLE_NAME BINLOG_ALTER_TWO_PHASE
+VARIABLE_SCOPE SESSION
+VARIABLE_TYPE BOOLEAN
+VARIABLE_COMMENT When set, split ALTER at binary logging into 2 statements: START ALTER and COMMIT/ROLLBACK ALTER
+NUMERIC_MIN_VALUE NULL
+NUMERIC_MAX_VALUE NULL
+NUMERIC_BLOCK_SIZE NULL
+ENUM_VALUE_LIST OFF,ON
+READ_ONLY NO
+COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME BINLOG_ANNOTATE_ROW_EVENTS
VARIABLE_SCOPE SESSION
VARIABLE_TYPE BOOLEAN
@@ -1305,11 +1315,11 @@ COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME HISTOGRAM_TYPE
VARIABLE_SCOPE SESSION
VARIABLE_TYPE ENUM
-VARIABLE_COMMENT Specifies type of the histograms created by ANALYZE. Possible values are: SINGLE_PREC_HB - single precision height-balanced, DOUBLE_PREC_HB - double precision height-balanced.
+VARIABLE_COMMENT Specifies type of the histograms created by ANALYZE. Possible values are: SINGLE_PREC_HB - single precision height-balanced, DOUBLE_PREC_HB - double precision height-balanced, JSON_HB - height-balanced, stored as JSON.
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST SINGLE_PREC_HB,DOUBLE_PREC_HB
+ENUM_VALUE_LIST SINGLE_PREC_HB,DOUBLE_PREC_HB,JSON_HB
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME HOSTNAME
diff --git a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result
index 6c584e190f1..ae7cce823ef 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result
@@ -526,21 +526,6 @@ ENUM_VALUE_LIST NONE,ALL,ALL_KILL
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
GLOBAL_VALUE_PATH NULL
-VARIABLE_NAME WSREP_REPLICATE_MYISAM
-SESSION_VALUE NULL
-GLOBAL_VALUE OFF
-GLOBAL_VALUE_ORIGIN COMPILE-TIME
-DEFAULT_VALUE OFF
-VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BOOLEAN
-VARIABLE_COMMENT To enable myisam replication
-NUMERIC_MIN_VALUE NULL
-NUMERIC_MAX_VALUE NULL
-NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST OFF,ON
-READ_ONLY NO
-COMMAND_LINE_ARGUMENT OPTIONAL
-GLOBAL_VALUE_PATH NULL
VARIABLE_NAME WSREP_RESTART_SLAVE
SESSION_VALUE NULL
GLOBAL_VALUE OFF
@@ -721,21 +706,6 @@ ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
GLOBAL_VALUE_PATH NULL
-VARIABLE_NAME WSREP_STRICT_DDL
-SESSION_VALUE NULL
-GLOBAL_VALUE OFF
-GLOBAL_VALUE_ORIGIN COMPILE-TIME
-DEFAULT_VALUE OFF
-VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BOOLEAN
-VARIABLE_COMMENT If set, reject DDL on affected tables not supporting Galera replication
-NUMERIC_MIN_VALUE NULL
-NUMERIC_MAX_VALUE NULL
-NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST OFF,ON
-READ_ONLY NO
-COMMAND_LINE_ARGUMENT OPTIONAL
-GLOBAL_VALUE_PATH NULL
VARIABLE_NAME WSREP_SYNC_WAIT
SESSION_VALUE 0
GLOBAL_VALUE 0
diff --git a/mysql-test/suite/sys_vars/t/binlog_alter_two_phase.test b/mysql-test/suite/sys_vars/t/binlog_alter_two_phase.test
new file mode 100644
index 00000000000..bc3adf12c15
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/binlog_alter_two_phase.test
@@ -0,0 +1,52 @@
+#
+# binlog_alter_two_phase system variable
+# Session as well as global
+# Allowed values NO_SPLIT, SPLIT, BINLOG_ONLY (0,1,2)
+
+--source include/not_embedded.inc
+
+--let $binlog_alter_two_phase= `select @@binlog_alter_two_phase`
+set binlog_alter_two_phase = OFF;
+select @@binlog_alter_two_phase;
+
+set binlog_alter_two_phase = ON;
+select @@binlog_alter_two_phase;
+
+--echo # wrong value
+--error ER_WRONG_VALUE_FOR_VAR
+set binlog_alter_two_phase=BINLOG_OY;
+select @@binlog_alter_two_phase;
+
+--echo #true and false
+set binlog_alter_two_phase=false;
+select @@binlog_alter_two_phase;
+
+set binlog_alter_two_phase=true;
+select @@binlog_alter_two_phase;
+
+set binlog_alter_two_phase=0;
+select @@binlog_alter_two_phase;
+
+set binlog_alter_two_phase=1;
+select @@binlog_alter_two_phase;
+
+--echo ##wrong value
+--error ER_WRONG_VALUE_FOR_VAR
+set binlog_alter_two_phase=2;
+select @@binlog_alter_two_phase;
+
+
+--echo #Global value
+set global binlog_alter_two_phase = OFF;
+connect (con1,localhost,root,,);
+select @@binlog_alter_two_phase;
+disconnect con1;
+
+connection default;
+set global binlog_alter_two_phase = ON;
+connect (con1,localhost,root,,);
+select @@binlog_alter_two_phase;
+disconnect con1;
+
+connection default;
+--eval set global binlog_alter_two_phase=$binlog_alter_two_phase
diff --git a/mysql-test/suite/sys_vars/t/default_tmp_storage_engine_rocksdb.test b/mysql-test/suite/sys_vars/t/default_tmp_storage_engine_rocksdb.test
new file mode 100644
index 00000000000..3454e5d6fc4
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/default_tmp_storage_engine_rocksdb.test
@@ -0,0 +1,86 @@
+--echo #
+--echo # MDEV-12914: Engine for temporary tables which are implicitly
+--echo # created as RocksDB is substitued siliently with MyIsam
+
+--source include/have_rocksdb.inc
+--source include/not_embedded.inc
+--source include/have_innodb.inc
+
+--error ER_UNKNOWN_STORAGE_ENGINE
+SET default_tmp_storage_engine = engine_doesnt_exist;
+--error ER_ILLEGAL_HA_CREATE_OPTION
+SET default_tmp_storage_engine = rocksdb;
+--error ER_ILLEGAL_HA_CREATE_OPTION
+SET default_tmp_storage_engine = CONCAT('rocks','db');
+
+CREATE TABLE t1 (i int) ENGINE = RocksDB;
+SHOW CREATE TABLE t1;
+
+--error ER_ILLEGAL_HA_CREATE_OPTION
+CREATE TEMPORARY TABLE t2 LIKE t1;
+
+DROP TABLE t1;
+
+SET default_storage_engine = DEFAULT;
+SET default_tmp_storage_engine = DEFAULT;
+
+CREATE TABLE t1 (t int);
+SHOW CREATE TABLE t1;
+CREATE TEMPORARY TABLE t2 LIKE t1;
+SHOW CREATE TABLE t2;
+
+DROP TABLE t1, t2;
+
+SET default_storage_engine = rocksdb;
+# setting default or null for tmp SE should use default SE
+SET default_tmp_storage_engine = default;
+
+CREATE TABLE t1 (t int);
+SHOW CREATE TABLE t1;
+
+--error ER_ILLEGAL_HA_CREATE_OPTION
+CREATE TEMPORARY TABLE t2 LIKE t1;
+
+--error ER_ILLEGAL_HA_CREATE_OPTION
+CREATE TEMPORARY TABLE t2 (t int);
+
+SET default_tmp_storage_engine = aria;
+CREATE TEMPORARY TABLE t2 (t int);
+DROP TABLE t2;
+
+--error ER_ILLEGAL_HA_CREATE_OPTION
+CREATE TEMPORARY TABLE t2 LIKE t1;
+
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26242: Assertion `i >= 0' failed on setting
+--echo # default_tmp_storage_engine to 'DEFAULT' in 10.7
+--echo #
+
+
+SHOW VARIABLES like '%storage_engine';
+SELECT @@GLOBAL.default_tmp_storage_engine, @@GLOBAL.default_storage_engine, @@GLOBAL.storage_engine, @@SESSION.default_tmp_storage_engine, @@SESSION.default_storage_engine, @@SESSION.storage_engine;
+--error ER_UNKNOWN_SYSTEM_VARIABLE
+SELECT @@GLOBAL.table_type;
+
+SET default_storage_engine=DEFAULT;
+SET default_tmp_storage_engine=innodb;
+SELECT @@GLOBAL.default_tmp_storage_engine, @@GLOBAL.default_storage_engine, @@GLOBAL.storage_engine, @@SESSION.default_tmp_storage_engine, @@SESSION.default_storage_engine, @@SESSION.storage_engine;
+
+CREATE TABLE t (t int);
+CREATE TEMPORARY TABLE t1 (t int);
+SHOW CREATE TABLE t;
+SHOW CREATE TABLE t1;
+DROP TABLE t1, t;
+
+SET GLOBAL default_tmp_storage_engine='default';
+SELECT @@GLOBAL.default_tmp_storage_engine, @@GLOBAL.default_storage_engine, @@GLOBAL.storage_engine, @@SESSION.default_tmp_storage_engine, @@SESSION.default_storage_engine, @@SESSION.storage_engine;
+
+CREATE TABLE t (t int);
+CREATE TEMPORARY TABLE t1 (t int);
+SHOW CREATE TABLE t;
+SHOW CREATE TABLE t1;
+DROP TABLE t1, t;
+
+SET GLOBAL default_tmp_storage_engine=NULL; \ No newline at end of file
diff --git a/mysql-test/suite/sys_vars/t/innodb_buffer_pool_size_basic.test b/mysql-test/suite/sys_vars/t/innodb_buffer_pool_size_basic.test
index f37e3e2e0fd..dada2a9a455 100644
--- a/mysql-test/suite/sys_vars/t/innodb_buffer_pool_size_basic.test
+++ b/mysql-test/suite/sys_vars/t/innodb_buffer_pool_size_basic.test
@@ -25,7 +25,7 @@
--source include/have_innodb.inc
let $wait_condition =
- SELECT SUBSTR(variable_value, 1, 34) = 'Completed resizing buffer pool at '
+ SELECT SUBSTR(variable_value, 1, 30) = 'Completed resizing buffer pool'
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_buffer_pool_resize_status';
diff --git a/mysql-test/suite/sys_vars/t/innodb_log_write_ahead_size_basic.test b/mysql-test/suite/sys_vars/t/innodb_log_write_ahead_size_basic.test
deleted file mode 100644
index 8693c6a7b1b..00000000000
--- a/mysql-test/suite/sys_vars/t/innodb_log_write_ahead_size_basic.test
+++ /dev/null
@@ -1,93 +0,0 @@
---source include/have_innodb.inc
-
-SET @start_global_value = @@global.innodb_log_write_ahead_size;
-
-# default value is limited by innodb_page_size and varying along with the page size.
-#SELECT @start_global_value;
-
-#set common valid value
-SET global innodb_log_write_ahead_size=4096;
-
-#
-# exists as global only
-#
---echo Valid values are positive number
-SELECT @@global.innodb_log_write_ahead_size >= 512;
-SELECT @@global.innodb_log_write_ahead_size <= 16*1024;
-
---error ER_INCORRECT_GLOBAL_LOCAL_VAR
-SELECT @@session.innodb_log_write_ahead_size;
-SHOW global variables LIKE 'innodb_log_write_ahead_size';
-SHOW session variables LIKE 'innodb_log_write_ahead_size';
---disable_warnings
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_log_write_ahead_size';
-SELECT * FROM information_schema.session_variables
-WHERE variable_name='innodb_log_write_ahead_size';
---enable_warnings
-
-#
-# show that it's writable
-#
-SET global innodb_log_write_ahead_size=1024;
-SELECT @@global.innodb_log_write_ahead_size;
---disable_warnings
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_log_write_ahead_size';
-SELECT * FROM information_schema.session_variables
-WHERE variable_name='innodb_log_write_ahead_size';
---enable_warnings
---error ER_GLOBAL_VARIABLE
-SET session innodb_log_write_ahead_size=2048;
-
-#
-# Valid values
-#
-SET global innodb_log_write_ahead_size=512;
-SELECT @@global.innodb_log_write_ahead_size;
-SET global innodb_log_write_ahead_size=2048;
-SELECT @@global.innodb_log_write_ahead_size;
-SET global innodb_log_write_ahead_size=4096;
-SELECT @@global.innodb_log_write_ahead_size;
-
-# limited by innodb_page_size, and the followings are occationally invalid
-#SET global innodb_log_write_ahead_size=8192;
-#SELECT @@global.innodb_log_write_ahead_size;
-#SET global innodb_log_write_ahead_size=16384;
-#SELECT @@global.innodb_log_write_ahead_size;
-
-#
-# Invalid values
-#
-SET global innodb_log_write_ahead_size=0;
-SELECT @@global.innodb_log_write_ahead_size;
-SET global innodb_log_write_ahead_size=-1024;
-SELECT @@global.innodb_log_write_ahead_size;
-SET global innodb_log_write_ahead_size=3000;
-SELECT @@global.innodb_log_write_ahead_size;
-
-# limited by innodb_page_size, and the followings result occationally different
-#SET global innodb_log_write_ahead_size=32768;
-#SELECT @@global.innodb_log_write_ahead_size;
-
-#
-# incorrect types
-#
---error ER_WRONG_TYPE_FOR_VAR
-SET global innodb_log_write_ahead_size=1.1;
---error ER_WRONG_TYPE_FOR_VAR
-SET global innodb_log_write_ahead_size=1e1;
---error ER_WRONG_TYPE_FOR_VAR
-SET global innodb_log_write_ahead_size="foo";
-SET global innodb_log_write_ahead_size=-7;
-SELECT @@global.innodb_log_write_ahead_size;
---disable_warnings
-SELECT * FROM information_schema.global_variables
-WHERE variable_name='innodb_log_write_ahead_size';
---enable_warnings
-
-#
-# cleanup
-#
-
-SET @@global.innodb_log_write_ahead_size = @start_global_value;
diff --git a/mysql-test/suite/sys_vars/t/innodb_purge_threads_basic.test b/mysql-test/suite/sys_vars/t/innodb_purge_threads_basic.test
index 4d039601e40..1156fa40a4a 100644
--- a/mysql-test/suite/sys_vars/t/innodb_purge_threads_basic.test
+++ b/mysql-test/suite/sys_vars/t/innodb_purge_threads_basic.test
@@ -11,9 +11,17 @@ SELECT COUNT(@@GLOBAL.innodb_purge_threads);
SELECT COUNT(@@innodb_purge_threads);
--echo 1 Expected
---error ER_INCORRECT_GLOBAL_LOCAL_VAR
+SET @save_threads = @@GLOBAL.innodb_purge_threads;
+
+SET @@GLOBAL.innodb_purge_threads=-1;
+SELECT @@GLOBAL.innodb_purge_threads;
+SET @@GLOBAL.innodb_purge_threads=0;
+SELECT @@GLOBAL.innodb_purge_threads;
+SET @@GLOBAL.innodb_purge_threads=33;
+SELECT @@GLOBAL.innodb_purge_threads;
+
SET @@GLOBAL.innodb_purge_threads=1;
---echo Expected error 'Read-only variable'
+SET @@GLOBAL.innodb_purge_threads=32;
--Error ER_BAD_FIELD_ERROR
SELECT innodb_purge_threads = @@SESSION.innodb_purge_threads;
@@ -51,3 +59,5 @@ FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME = 'innodb_purge_threads';
--enable_warnings
+
+SET GLOBAL innodb_purge_threads = @save_threads;
diff --git a/mysql-test/suite/sys_vars/t/sysvars_innodb.test b/mysql-test/suite/sys_vars/t/sysvars_innodb.test
index 15fd99e9984..6d46c22683f 100644
--- a/mysql-test/suite/sys_vars/t/sysvars_innodb.test
+++ b/mysql-test/suite/sys_vars/t/sysvars_innodb.test
@@ -12,5 +12,6 @@ select VARIABLE_NAME, SESSION_VALUE, DEFAULT_VALUE, VARIABLE_SCOPE, VARIABLE_TYP
'innodb_numa_interleave', # only available WITH_NUMA
'innodb_evict_tables_on_commit_debug', # one may want to override this
'innodb_use_native_aio', # default value depends on OS
+ 'innodb_log_file_buffering', # only available on Linux and Windows
'innodb_buffer_pool_load_pages_abort') # debug build only, and is only for testing
order by variable_name;
diff --git a/mysql-test/suite/sysschema/r/pr_statement_performance_analyzer.result b/mysql-test/suite/sysschema/r/pr_statement_performance_analyzer.result
index df084f8c1a5..c7bb029da39 100644
--- a/mysql-test/suite/sysschema/r/pr_statement_performance_analyzer.result
+++ b/mysql-test/suite/sysschema/r/pr_statement_performance_analyzer.result
@@ -131,7 +131,7 @@ CALL sys.statement_performance_analyzer('do magic', NULL, NULL);
ERROR 45000: Unknown action. Supported actions are: cleanup, create_table, create_tmp, delta, overall, save, snapshot
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
CALL sys.statement_performance_analyzer('do magic', NULL, NULL);
-ERROR 01000: Data truncated for column 'in_action' at row 1
+ERROR 01000: Data truncated for column 'in_action' at row 0
CALL sys.statement_performance_analyzer('create_tmp', 'sys.tmp_digests', NULL);
ERROR 45000: Invalid value for in_table: `sys`.`tmp_digests` is reserved table name.
CALL sys.statement_performance_analyzer('create_tmp', 'sys.tmp_digests_delta', NULL);
@@ -187,7 +187,7 @@ DROP TEMPORARY TABLE sys.tmp_digests_delta;
ERROR 42S02: Unknown table 'sys.tmp_digests_delta'
SET @identifier := REPEAT('a', 65);
CALL sys.statement_performance_analyzer('snapshot', CONCAT(@identifier, '.', @identifier), NULL);
-ERROR 22001: Data too long for column 'in_table' at row 1
+ERROR 22001: Data too long for column 'in_table' at row 0
DROP TEMPORARY TABLE test.tmp_digests_ini;
DROP TEMPORARY TABLE test.tmp_digests;
DROP TABLE test.tmp_unsupported;
diff --git a/mysql-test/suite/sysschema/r/pr_table_exists.result b/mysql-test/suite/sysschema/r/pr_table_exists.result
index 88917418f67..76085bd72dd 100644
--- a/mysql-test/suite/sysschema/r/pr_table_exists.result
+++ b/mysql-test/suite/sysschema/r/pr_table_exists.result
@@ -40,7 +40,7 @@ SET @identifier := REPEAT('a', 65);
CALL sys.table_exists(@identifier, 't1', @exists);
ERROR 22001: Data too long for column 'in_db' at row 1
CALL sys.table_exists('test', @identifier, @exists);
-ERROR 22001: Data too long for column 'in_table' at row 1
+ERROR 22001: Data too long for column 'in_table' at row 0
SET @identifier := NULL;
#
# MDEV-28391: table_exists procedure fails with
diff --git a/mysql-test/suite/vcol/r/binlog.result b/mysql-test/suite/vcol/r/binlog.result
index 9fd1f9e5b9d..1f66a632697 100644
--- a/mysql-test/suite/vcol/r/binlog.result
+++ b/mysql-test/suite/vcol/r/binlog.result
@@ -88,7 +88,7 @@ CREATE TEMPORARY TABLE t1 SELECT UUID();
show create table t1;
Table Create Table
t1 CREATE TEMPORARY TABLE `t1` (
- `UUID()` varchar(36) DEFAULT NULL
+ `UUID()` uuid DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
CREATE TABLE t2 (a INT PRIMARY KEY, b TEXT, c INT GENERATED ALWAYS AS(b));
INSERT INTO t2 (a,b) VALUES (1,1);
diff --git a/mysql-test/suite/versioning/r/data.result b/mysql-test/suite/versioning/r/data.result
new file mode 100644
index 00000000000..7fea6c3d06e
--- /dev/null
+++ b/mysql-test/suite/versioning/r/data.result
@@ -0,0 +1,59 @@
+#
+# MDEV-16355 Add option for mysqldump to read data as of specific timestamp from system-versioned tables
+#
+create or replace table t1 (x int) with system versioning;
+set timestamp=unix_timestamp('1990-01-01 00:00');
+insert t1 (x) values (1),(2),(3);
+set timestamp=unix_timestamp('1990-08-03 00:00');
+delete from t1 where x=1;
+set timestamp=unix_timestamp('1991-01-02 00:00');
+delete from t1 where x=2;
+set timestamp=default;
+#MYSQL_DUMP --compact test
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING;
+/*!40101 SET character_set_client = @saved_cs_client */;
+INSERT INTO `t1` VALUES
+(3);
+#MYSQL_DUMP --compact --as-of="1990-01-02 00:00" test
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING;
+/*!40101 SET character_set_client = @saved_cs_client */;
+INSERT INTO `t1` VALUES
+(1),
+(2),
+(3);
+#MYSQL_DUMP --compact --as-of="1990-08-02 00:00" --databases test
+
+CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */;
+
+USE `test`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING;
+/*!40101 SET character_set_client = @saved_cs_client */;
+INSERT INTO `t1` VALUES
+(1),
+(2),
+(3);
+#MYSQL_DUMP --compact --as-of="1990-08-04 00:00" test t1
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING;
+/*!40101 SET character_set_client = @saved_cs_client */;
+INSERT INTO `t1` VALUES
+(2),
+(3);
+#MYSQL_DUMP --compact --as-of="1990-08-04 00:00' where 'abc" test 2>&1
+mariadb-dump: Incorrect DATETIME value: '1990-08-04 00:00' where 'abc'
+drop tables t1;
diff --git a/mysql-test/suite/versioning/r/partition,heap.rdiff b/mysql-test/suite/versioning/r/partition,heap.rdiff
new file mode 100644
index 00000000000..361a74a4271
--- /dev/null
+++ b/mysql-test/suite/versioning/r/partition,heap.rdiff
@@ -0,0 +1,86 @@
+@@ -1969,85 +1969,6 @@
+ (PARTITION `p0` HISTORY ENGINE = X,
+ PARTITION `pn` CURRENT ENGINE = X)
+ drop tables t1, tp1;
+-# Complex table
+-create or replace table t1 (
+-x int primary key auto_increment,
+-t timestamp(6) default '2001-11-11 11:11:11',
+-b blob(4096) compressed null,
+-c varchar(1033) character set utf8 not null,
+-u int,
+-unique key (x, u),
+-m enum('a', 'b', 'c') not null default 'a' comment 'absolute',
+-i1 tinyint, i2 smallint, i3 bigint,
+-index three(i1, i2, i3),
+-v1 timestamp(6) generated always as (t + interval 1 day),
+-v2 timestamp(6) generated always as (t + interval 1 month) stored,
+-s timestamp(6) as row start,
+-e timestamp(6) as row end,
+-period for system_time (s, e),
+-ps date, pe date,
+-period for app_time (ps, pe),
+-constraint check_constr check (u > -1))
+-with system versioning default charset=ucs2
+-partition by range(x) (
+-partition p0 values less than (10),
+-partition p1 values less than (20),
+-partition pn values less than maxvalue);
+-alter table t1 convert partition p1 to table tp1;
+-show create table tp1;
+-Table Create Table
+-tp1 CREATE TABLE `tp1` (
+- `x` int(11) NOT NULL AUTO_INCREMENT,
+- `t` timestamp(6) NOT NULL DEFAULT '2001-11-11 11:11:11.000000',
+- `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL,
+- `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
+- `u` int(11) DEFAULT NULL,
+- `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute',
+- `i1` tinyint(4) DEFAULT NULL,
+- `i2` smallint(6) DEFAULT NULL,
+- `i3` bigint(20) DEFAULT NULL,
+- `v1` timestamp(6) GENERATED ALWAYS AS (`t` + interval 1 day) VIRTUAL,
+- `v2` timestamp(6) GENERATED ALWAYS AS (`t` + interval 1 month) STORED,
+- `s` timestamp(6) GENERATED ALWAYS AS ROW START,
+- `e` timestamp(6) GENERATED ALWAYS AS ROW END,
+- `ps` date NOT NULL,
+- `pe` date NOT NULL,
+- PERIOD FOR `app_time` (`ps`, `pe`),
+- PRIMARY KEY (`x`,`e`),
+- UNIQUE KEY `x` (`x`,`u`,`e`),
+- KEY `three` (`i1`,`i2`,`i3`),
+- PERIOD FOR SYSTEM_TIME (`s`, `e`),
+- CONSTRAINT `check_constr` CHECK (`u` > -1)
+-) ENGINE=X DEFAULT CHARSET=ucs2 COLLATE=ucs2_general_ci WITH SYSTEM VERSIONING
+-show create table t1;
+-Table Create Table
+-t1 CREATE TABLE `t1` (
+- `x` int(11) NOT NULL AUTO_INCREMENT,
+- `t` timestamp(6) NOT NULL DEFAULT '2001-11-11 11:11:11.000000',
+- `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL,
+- `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
+- `u` int(11) DEFAULT NULL,
+- `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute',
+- `i1` tinyint(4) DEFAULT NULL,
+- `i2` smallint(6) DEFAULT NULL,
+- `i3` bigint(20) DEFAULT NULL,
+- `v1` timestamp(6) GENERATED ALWAYS AS (`t` + interval 1 day) VIRTUAL,
+- `v2` timestamp(6) GENERATED ALWAYS AS (`t` + interval 1 month) STORED,
+- `s` timestamp(6) GENERATED ALWAYS AS ROW START,
+- `e` timestamp(6) GENERATED ALWAYS AS ROW END,
+- `ps` date NOT NULL,
+- `pe` date NOT NULL,
+- PERIOD FOR `app_time` (`ps`, `pe`),
+- PRIMARY KEY (`x`,`e`),
+- UNIQUE KEY `x` (`x`,`u`,`e`),
+- KEY `three` (`i1`,`i2`,`i3`),
+- PERIOD FOR SYSTEM_TIME (`s`, `e`),
+- CONSTRAINT `check_constr` CHECK (`u` > -1)
+-) ENGINE=X DEFAULT CHARSET=ucs2 COLLATE=ucs2_general_ci WITH SYSTEM VERSIONING
+- PARTITION BY RANGE (`x`)
+-(PARTITION `p0` VALUES LESS THAN (10) ENGINE = X,
+- PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
+-drop tables t1, tp1;
+ #
+ # End of 10.7 tests
+ #
diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result
index b8ad7693f51..6feee27818b 100644
--- a/mysql-test/suite/versioning/r/partition.result
+++ b/mysql-test/suite/versioning/r/partition.result
@@ -96,6 +96,16 @@ with system versioning
partition by system_time (
partition p0 history,
partition pn current);
+create or replace table t1 (a int)
+partition by range (a) (
+partition p0 history,
+partition p1 current);
+ERROR HY000: Wrong partition type `SYSTEM_TIME` for partitioning by `RANGE`
+create or replace table t1 (b int)
+partition by range (a) (
+partition p0 current,
+partition p1 history);
+ERROR HY000: Wrong partition type `SYSTEM_TIME` for partitioning by `RANGE`
## ALTER TABLE
alter table t1 add partition (
partition p1 current);
@@ -150,7 +160,7 @@ partition by system_time limit 1;
alter table t1 change x big int;
create or replace table t1 (i int) engine myisam partition by hash(i) partitions 2;
alter table t1 add partition (partition px history);
-ERROR HY000: Wrong partitioning type, expected type: `SYSTEM_TIME`
+ERROR HY000: Wrong partition type `SYSTEM_TIME` for partitioning by `HASH`
## INSERT, UPDATE, DELETE
create or replace table t1 (x int)
with system versioning
@@ -253,7 +263,7 @@ t1 CREATE TABLE `t1` (
PARTITION BY SYSTEM_TIME LIMIT 2
PARTITIONS 3
alter table t1 drop partition non_existent;
-ERROR HY000: Error in list of partitions to DROP
+ERROR HY000: Wrong partition name or partition list
insert into t1 values (1), (2), (3), (4), (5), (6);
select * from t1 partition (pn);
x
@@ -1105,7 +1115,7 @@ drop table t1;
create table t1 (a int) with system versioning partition by system_time
(partition p1 history, partition pn current);
alter table t1 add partition (partition p2);
-ERROR HY000: Wrong partitioning type, expected type: `SYSTEM_TIME`
+ERROR HY000: Wrong partition type `HASH` for partitioning by `SYSTEM_TIME`
# MDEV-17891 Assertion failures in select_insert::abort_result_set and
# mysql_load upon attempt to replace into a full table
set @@max_heap_table_size= 1024*1024;
@@ -1741,6 +1751,7 @@ drop tables t1;
#
# MDEV-22155 ALTER add default history partitions name clash on non-default partitions
#
+set timestamp= default;
create or replace table t1 (x int) with system versioning
partition by system_time limit 1
(partition p2 history, partition p8 history, partition pn current);
@@ -1783,4 +1794,382 @@ drop tables t1;
#
# End of 10.5 tests
#
+#
+# MDEV-22166 MIGRATE PARTITION: move out partition into a table
+#
+create or replace table t1 (x int)
+with system versioning
+partition by range(x) (
+partition p1 values less than (10),
+partition p2 values less than (20),
+partition p3 values less than (30),
+partition p4 values less than (40),
+partition p5 values less than (50),
+partition pn values less than maxvalue);
+insert into t1 values (2), (12), (22), (32), (42), (52);
+update t1 set x= x + 1;
+alter table t1 convert partition p2 to table tp2;
+show create table tp2;
+Table Create Table
+tp2 CREATE TABLE `tp2` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+select * from tp2;
+x
+13
+select * from tp2 for system_time all order by x;
+x
+12
+13
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+ PARTITION `p3` VALUES LESS THAN (30) ENGINE = X,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = X,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = X,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
+select * from t1 order by x;
+x
+3
+23
+33
+43
+53
+select * from t1 for system_time all order by x;
+x
+2
+3
+22
+23
+32
+33
+42
+43
+52
+53
+# SP
+create or replace procedure sp()
+alter table t1 convert partition p3 to table tp3;
+call sp;
+show create table tp3;
+Table Create Table
+tp3 CREATE TABLE `tp3` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+select * from tp3;
+x
+23
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+ PARTITION `p4` VALUES LESS THAN (40) ENGINE = X,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = X,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
+select * from t1 order by x;
+x
+3
+33
+43
+53
+drop table tp3;
+call sp;
+ERROR HY000: Wrong partition name or partition list
+call sp;
+ERROR HY000: Wrong partition name or partition list
+drop procedure sp;
+# LOCK TABLES, PS, SP
+create or replace procedure sp()
+alter table t1 convert partition p4 to table tp4;
+lock tables t1 write;
+prepare stmt from 'call sp';
+execute stmt;
+unlock tables;
+show create table tp4;
+Table Create Table
+tp4 CREATE TABLE `tp4` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+select * from tp4;
+x
+33
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p1` VALUES LESS THAN (10) ENGINE = X,
+ PARTITION `p5` VALUES LESS THAN (50) ENGINE = X,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
+select * from t1 order by x;
+x
+3
+43
+53
+drop table tp4;
+lock tables t1 write;
+execute stmt;
+ERROR HY000: Wrong partition name or partition list
+call sp;
+ERROR HY000: Wrong partition name or partition list
+drop prepare stmt;
+unlock tables;
+drop procedure sp;
+unlock tables;
+drop tables t1, tp2;
+# System-versioned tables (SYSTEM_TIME LIMIT)
+create or replace table t1 (
+x int,
+row_start timestamp(6) as row start invisible,
+row_end timestamp(6) as row end invisible,
+period for system_time(row_start, row_end)
+) with system versioning
+partition by system_time limit 1 partitions 4;
+insert into t1 values (2), (12), (22);
+update t1 set x= x + 1 where x = 2;
+update t1 set x= x + 1 where x = 12;
+update t1 set x= x + 1 where x = 22;
+Warnings:
+Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p2`) is out of LIMIT, need more HISTORY partitions
+select * from t1 partition (p1);
+x
+12
+alter table t1 convert partition pn to table tp1;
+ERROR HY000: Wrong partitions for `t1`: must have at least one HISTORY and exactly one last CURRENT
+alter table t1 convert partition p1 to table tp1;
+show create table tp1;
+Table Create Table
+tp1 CREATE TABLE `tp1` (
+ `x` int(11) DEFAULT NULL,
+ `row_start` timestamp(6) GENERATED ALWAYS AS ROW START INVISIBLE,
+ `row_end` timestamp(6) GENERATED ALWAYS AS ROW END INVISIBLE,
+ PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`)
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+select * from tp1;
+x
+select * from tp1 for system_time all;
+x
+12
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL,
+ `row_start` timestamp(6) GENERATED ALWAYS AS ROW START INVISIBLE,
+ `row_end` timestamp(6) GENERATED ALWAYS AS ROW END INVISIBLE,
+ PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`)
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY SYSTEM_TIME LIMIT 1
+(PARTITION `p0` HISTORY ENGINE = X,
+ PARTITION `p2` HISTORY ENGINE = X,
+ PARTITION `pn` CURRENT ENGINE = X)
+select * from t1 order by x;
+x
+3
+13
+23
+select * from t1 for system_time all order by x;
+x
+2
+3
+13
+22
+23
+drop tables t1, tp1;
+# System-versioned tables (SYSTEM_TIME INTERVAL)
+set timestamp= unix_timestamp('2000-01-01 00:00:00');
+create or replace table t1 (
+x int,
+row_start timestamp(6) as row start invisible,
+row_end timestamp(6) as row end invisible,
+period for system_time(row_start, row_end)
+) with system versioning
+partition by system_time interval 1 hour partitions 4;
+insert into t1 values (2), (12), (22);
+set timestamp= unix_timestamp('2000-01-01 00:00:01');
+update t1 set x= x + 1 where x = 2;
+set timestamp= unix_timestamp('2000-01-01 01:00:00');
+update t1 set x= x + 1 where x = 12;
+set timestamp= unix_timestamp('2000-01-01 02:00:00');
+update t1 set x= x + 1 where x = 22;
+select * from t1 partition (p0);
+x
+2
+select * from t1 partition (p1);
+x
+12
+select * from t1 partition (p2);
+x
+22
+alter table t1 convert partition p1 to table tp1;
+ERROR HY000: Can only drop oldest partitions when rotating by INTERVAL
+alter table t1 convert partition p0 to table tp0;
+alter table t1 convert partition p1 to table tp1;
+alter table t1 convert partition p2 to table tp2;
+ERROR HY000: Wrong partitions for `t1`: must have at least one HISTORY and exactly one last CURRENT
+show create table tp0;
+Table Create Table
+tp0 CREATE TABLE `tp0` (
+ `x` int(11) DEFAULT NULL,
+ `row_start` timestamp(6) GENERATED ALWAYS AS ROW START INVISIBLE,
+ `row_end` timestamp(6) GENERATED ALWAYS AS ROW END INVISIBLE,
+ PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`)
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+show create table tp1;
+Table Create Table
+tp1 CREATE TABLE `tp1` (
+ `x` int(11) DEFAULT NULL,
+ `row_start` timestamp(6) GENERATED ALWAYS AS ROW START INVISIBLE,
+ `row_end` timestamp(6) GENERATED ALWAYS AS ROW END INVISIBLE,
+ PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`)
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+select * from tp0;
+x
+select * from tp1;
+x
+select * from tp0 for system_time all;
+x
+2
+select * from tp1 for system_time all;
+x
+12
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL,
+ `row_start` timestamp(6) GENERATED ALWAYS AS ROW START INVISIBLE,
+ `row_end` timestamp(6) GENERATED ALWAYS AS ROW END INVISIBLE,
+ PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`)
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR STARTS TIMESTAMP'2000-01-01 02:00:00'
+(PARTITION `p2` HISTORY ENGINE = X,
+ PARTITION `pn` CURRENT ENGINE = X)
+select * from t1;
+x
+3
+13
+23
+select * from t1 for system_time all order by x;
+x
+3
+13
+22
+23
+drop tables t1, tp0, tp1;
+# System-versioned tables (implicit)
+create or replace table t1(x int) with system versioning
+partition by system_time limit 1 partitions 3;
+alter table t1 convert partition p1 to table tp1;
+show create table tp1;
+Table Create Table
+tp1 CREATE TABLE `tp1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) DEFAULT NULL
+) ENGINE=X DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ PARTITION BY SYSTEM_TIME LIMIT 1
+(PARTITION `p0` HISTORY ENGINE = X,
+ PARTITION `pn` CURRENT ENGINE = X)
+drop tables t1, tp1;
+# Complex table
+create or replace table t1 (
+x int primary key auto_increment,
+t timestamp(6) default '2001-11-11 11:11:11',
+b blob(4096) compressed null,
+c varchar(1033) character set utf8 not null,
+u int,
+unique key (x, u),
+m enum('a', 'b', 'c') not null default 'a' comment 'absolute',
+i1 tinyint, i2 smallint, i3 bigint,
+index three(i1, i2, i3),
+v1 timestamp(6) generated always as (t + interval 1 day),
+v2 timestamp(6) generated always as (t + interval 1 month) stored,
+s timestamp(6) as row start,
+e timestamp(6) as row end,
+period for system_time (s, e),
+ps date, pe date,
+period for app_time (ps, pe),
+constraint check_constr check (u > -1))
+with system versioning default charset=ucs2
+partition by range(x) (
+partition p0 values less than (10),
+partition p1 values less than (20),
+partition pn values less than maxvalue);
+alter table t1 convert partition p1 to table tp1;
+show create table tp1;
+Table Create Table
+tp1 CREATE TABLE `tp1` (
+ `x` int(11) NOT NULL AUTO_INCREMENT,
+ `t` timestamp(6) NOT NULL DEFAULT '2001-11-11 11:11:11.000000',
+ `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL,
+ `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
+ `u` int(11) DEFAULT NULL,
+ `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute',
+ `i1` tinyint(4) DEFAULT NULL,
+ `i2` smallint(6) DEFAULT NULL,
+ `i3` bigint(20) DEFAULT NULL,
+ `v1` timestamp(6) GENERATED ALWAYS AS (`t` + interval 1 day) VIRTUAL,
+ `v2` timestamp(6) GENERATED ALWAYS AS (`t` + interval 1 month) STORED,
+ `s` timestamp(6) GENERATED ALWAYS AS ROW START,
+ `e` timestamp(6) GENERATED ALWAYS AS ROW END,
+ `ps` date NOT NULL,
+ `pe` date NOT NULL,
+ PERIOD FOR `app_time` (`ps`, `pe`),
+ PRIMARY KEY (`x`,`e`),
+ UNIQUE KEY `x` (`x`,`u`,`e`),
+ KEY `three` (`i1`,`i2`,`i3`),
+ PERIOD FOR SYSTEM_TIME (`s`, `e`),
+ CONSTRAINT `check_constr` CHECK (`u` > -1)
+) ENGINE=X DEFAULT CHARSET=ucs2 COLLATE=ucs2_general_ci WITH SYSTEM VERSIONING
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `x` int(11) NOT NULL AUTO_INCREMENT,
+ `t` timestamp(6) NOT NULL DEFAULT '2001-11-11 11:11:11.000000',
+ `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL,
+ `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
+ `u` int(11) DEFAULT NULL,
+ `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute',
+ `i1` tinyint(4) DEFAULT NULL,
+ `i2` smallint(6) DEFAULT NULL,
+ `i3` bigint(20) DEFAULT NULL,
+ `v1` timestamp(6) GENERATED ALWAYS AS (`t` + interval 1 day) VIRTUAL,
+ `v2` timestamp(6) GENERATED ALWAYS AS (`t` + interval 1 month) STORED,
+ `s` timestamp(6) GENERATED ALWAYS AS ROW START,
+ `e` timestamp(6) GENERATED ALWAYS AS ROW END,
+ `ps` date NOT NULL,
+ `pe` date NOT NULL,
+ PERIOD FOR `app_time` (`ps`, `pe`),
+ PRIMARY KEY (`x`,`e`),
+ UNIQUE KEY `x` (`x`,`u`,`e`),
+ KEY `three` (`i1`,`i2`,`i3`),
+ PERIOD FOR SYSTEM_TIME (`s`, `e`),
+ CONSTRAINT `check_constr` CHECK (`u` > -1)
+) ENGINE=X DEFAULT CHARSET=ucs2 COLLATE=ucs2_general_ci WITH SYSTEM VERSIONING
+ PARTITION BY RANGE (`x`)
+(PARTITION `p0` VALUES LESS THAN (10) ENGINE = X,
+ PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
+drop tables t1, tp1;
+#
+# MDEV-29841 Partition by system_time can be converted into table but not back
+#
+create or replace table t (a int) with system versioning
+partition by system_time limit 10 partitions 3;
+alter table t convert partition p0 to table tp;
+alter table t convert table tp to partition p0;
+ERROR HY000: CONVERT TABLE TO PARTITION can only be used on RANGE/LIST partitions
+drop tables t, tp;
+#
+# End of 10.7 tests
+#
set global innodb_stats_persistent= @save_persistent;
diff --git a/mysql-test/suite/versioning/t/alter.test b/mysql-test/suite/versioning/t/alter.test
index 607aa8d603a..61653550389 100644
--- a/mysql-test/suite/versioning/t/alter.test
+++ b/mysql-test/suite/versioning/t/alter.test
@@ -611,7 +611,7 @@ create or replace table t1 (
period for system_time(row_start, row_end)
) with system versioning;
show create table t1;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop column b;
create or replace table t1 (
@@ -621,7 +621,7 @@ a int, b int primary key,
period for system_time(row_start, row_end)
) with system versioning;
show create table t1;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
alter table t1 drop column b;
# cleanup
diff --git a/mysql-test/suite/versioning/t/create.test b/mysql-test/suite/versioning/t/create.test
index 87cafdc7d32..6f5153b4ec1 100644
--- a/mysql-test/suite/versioning/t/create.test
+++ b/mysql-test/suite/versioning/t/create.test
@@ -412,11 +412,11 @@ drop tables t0, t1, t2, t3;
--echo #
--echo # MDEV-23968 CREATE TEMPORARY TABLE .. LIKE (system versioned table) returns error if unique index is defined in the table
--echo #
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
create table t1 (id int primary key, index(row_start)) with system versioning;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
create table t1 (id int primary key, index(row_end)) with system versioning;
---error ER_KEY_COLUMN_DOES_NOT_EXITS
+--error ER_KEY_COLUMN_DOES_NOT_EXIST
create table t1 (id int, primary key(id, row_end, row_end)) with system versioning;
create table t1 (id int primary key) with system versioning;
create temporary table t2 like t1;
diff --git a/mysql-test/suite/versioning/t/data.test b/mysql-test/suite/versioning/t/data.test
new file mode 100644
index 00000000000..ddae6633337
--- /dev/null
+++ b/mysql-test/suite/versioning/t/data.test
@@ -0,0 +1,32 @@
+--source include/not_embedded.inc
+--source suite/versioning/common.inc
+
+--echo #
+--echo # MDEV-16355 Add option for mysqldump to read data as of specific timestamp from system-versioned tables
+--echo #
+create or replace table t1 (x int) with system versioning;
+set timestamp=unix_timestamp('1990-01-01 00:00');
+insert t1 (x) values (1),(2),(3);
+set timestamp=unix_timestamp('1990-08-03 00:00');
+delete from t1 where x=1;
+set timestamp=unix_timestamp('1991-01-02 00:00');
+delete from t1 where x=2;
+set timestamp=default;
+
+--echo #MYSQL_DUMP --compact test
+--exec $MYSQL_DUMP --compact test
+--echo #MYSQL_DUMP --compact --as-of="1990-01-02 00:00" test
+--exec $MYSQL_DUMP --compact --as-of="1990-01-02 00:00" test
+--echo #MYSQL_DUMP --compact --as-of="1990-08-02 00:00" --databases test
+--exec $MYSQL_DUMP --compact --as-of="1990-08-02 00:00" --databases test
+--echo #MYSQL_DUMP --compact --as-of="1990-08-04 00:00" test t1
+--exec $MYSQL_DUMP --compact --as-of="1990-08-04 00:00" test t1
+## Forged query protection
+--echo #MYSQL_DUMP --compact --as-of="1990-08-04 00:00' where 'abc" test 2>&1
+--replace_result mariadb-dump.exe mariadb-dump
+--error 1
+--exec $MYSQL_DUMP --compact --as-of="1990-08-04 00:00' where 'abc" test 2>&1
+
+drop tables t1;
+
+--source suite/versioning/common_finish.inc
diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test
index 535e791c8c8..29de10e4738 100644
--- a/mysql-test/suite/versioning/t/partition.test
+++ b/mysql-test/suite/versioning/t/partition.test
@@ -106,6 +106,18 @@ partition by system_time (
partition p0 history,
partition pn current);
+--error ER_PARTITION_WRONG_TYPE
+create or replace table t1 (a int)
+partition by range (a) (
+ partition p0 history,
+ partition p1 current);
+
+--error ER_PARTITION_WRONG_TYPE
+create or replace table t1 (b int)
+partition by range (a) (
+ partition p0 current,
+ partition p1 history);
+
--echo ## ALTER TABLE
@@ -232,7 +244,7 @@ partition by system_time limit 2 partitions 3;
--replace_result $default_engine DEFAULT_ENGINE
show create table t1;
---error ER_DROP_PARTITION_NON_EXISTENT
+--error ER_PARTITION_DOES_NOT_EXIST
alter table t1 drop partition non_existent;
insert into t1 values (1), (2), (3), (4), (5), (6);
@@ -1533,6 +1545,7 @@ drop tables t1;
--echo #
--echo # MDEV-22155 ALTER add default history partitions name clash on non-default partitions
--echo #
+set timestamp= default;
create or replace table t1 (x int) with system versioning
partition by system_time limit 1
(partition p2 history, partition p8 history, partition pn current);
@@ -1552,6 +1565,219 @@ drop tables t1;
--echo # End of 10.5 tests
--echo #
+--echo #
+--echo # MDEV-22166 MIGRATE PARTITION: move out partition into a table
+--echo #
+create or replace table t1 (x int)
+with system versioning
+partition by range(x) (
+ partition p1 values less than (10),
+ partition p2 values less than (20),
+ partition p3 values less than (30),
+ partition p4 values less than (40),
+ partition p5 values less than (50),
+ partition pn values less than maxvalue);
+
+insert into t1 values (2), (12), (22), (32), (42), (52);
+update t1 set x= x + 1;
+
+alter table t1 convert partition p2 to table tp2;
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table tp2;
+select * from tp2;
+select * from tp2 for system_time all order by x;
+
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1 order by x;
+select * from t1 for system_time all order by x;
+
+--echo # SP
+create or replace procedure sp()
+alter table t1 convert partition p3 to table tp3;
+call sp;
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table tp3;
+select * from tp3;
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1 order by x;
+drop table tp3;
+--error ER_PARTITION_DOES_NOT_EXIST
+call sp;
+--error ER_PARTITION_DOES_NOT_EXIST
+call sp;
+drop procedure sp;
+
+--echo # LOCK TABLES, PS, SP
+create or replace procedure sp()
+alter table t1 convert partition p4 to table tp4;
+lock tables t1 write;
+prepare stmt from 'call sp';
+execute stmt;
+
+# TODO: don't unlock here (see above TODO)
+unlock tables;
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table tp4;
+select * from tp4;
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1 order by x;
+drop table tp4;
+lock tables t1 write;
+--error ER_PARTITION_DOES_NOT_EXIST
+execute stmt;
+--error ER_PARTITION_DOES_NOT_EXIST
+call sp;
+drop prepare stmt;
+unlock tables;
+drop procedure sp;
+unlock tables;
+
+drop tables t1, tp2;
+
+--echo # System-versioned tables (SYSTEM_TIME LIMIT)
+
+create or replace table t1 (
+ x int,
+ row_start timestamp(6) as row start invisible,
+ row_end timestamp(6) as row end invisible,
+ period for system_time(row_start, row_end)
+) with system versioning
+partition by system_time limit 1 partitions 4;
+
+insert into t1 values (2), (12), (22);
+update t1 set x= x + 1 where x = 2;
+update t1 set x= x + 1 where x = 12;
+update t1 set x= x + 1 where x = 22;
+
+select * from t1 partition (p1);
+--error ER_VERS_WRONG_PARTS
+alter table t1 convert partition pn to table tp1;
+alter table t1 convert partition p1 to table tp1;
+
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table tp1;
+select * from tp1;
+select * from tp1 for system_time all;
+
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1 order by x;
+select * from t1 for system_time all order by x;
+
+drop tables t1, tp1;
+
+--echo # System-versioned tables (SYSTEM_TIME INTERVAL)
+
+set timestamp= unix_timestamp('2000-01-01 00:00:00');
+create or replace table t1 (
+ x int,
+ row_start timestamp(6) as row start invisible,
+ row_end timestamp(6) as row end invisible,
+ period for system_time(row_start, row_end)
+) with system versioning
+partition by system_time interval 1 hour partitions 4;
+
+insert into t1 values (2), (12), (22);
+set timestamp= unix_timestamp('2000-01-01 00:00:01');
+update t1 set x= x + 1 where x = 2;
+set timestamp= unix_timestamp('2000-01-01 01:00:00');
+update t1 set x= x + 1 where x = 12;
+set timestamp= unix_timestamp('2000-01-01 02:00:00');
+update t1 set x= x + 1 where x = 22;
+
+select * from t1 partition (p0);
+select * from t1 partition (p1);
+select * from t1 partition (p2);
+--error ER_VERS_DROP_PARTITION_INTERVAL
+alter table t1 convert partition p1 to table tp1;
+alter table t1 convert partition p0 to table tp0;
+alter table t1 convert partition p1 to table tp1;
+--error ER_VERS_WRONG_PARTS
+alter table t1 convert partition p2 to table tp2;
+
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table tp0;
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table tp1;
+select * from tp0;
+select * from tp1;
+select * from tp0 for system_time all;
+select * from tp1 for system_time all;
+
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+select * from t1;
+select * from t1 for system_time all order by x;
+
+drop tables t1, tp0, tp1;
+
+--echo # System-versioned tables (implicit)
+
+create or replace table t1(x int) with system versioning
+partition by system_time limit 1 partitions 3;
+
+alter table t1 convert partition p1 to table tp1;
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table tp1;
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+
+drop tables t1, tp1;
+
+if (!$MTR_COMBINATION_HEAP)
+{
+--echo # Complex table
+create or replace table t1 (
+ x int primary key auto_increment,
+ t timestamp(6) default '2001-11-11 11:11:11',
+ b blob(4096) compressed null,
+ c varchar(1033) character set utf8 not null,
+ u int,
+ unique key (x, u),
+ m enum('a', 'b', 'c') not null default 'a' comment 'absolute',
+ i1 tinyint, i2 smallint, i3 bigint,
+ index three(i1, i2, i3),
+ v1 timestamp(6) generated always as (t + interval 1 day),
+ v2 timestamp(6) generated always as (t + interval 1 month) stored,
+ s timestamp(6) as row start,
+ e timestamp(6) as row end,
+ period for system_time (s, e),
+ ps date, pe date,
+ period for app_time (ps, pe),
+ constraint check_constr check (u > -1))
+with system versioning default charset=ucs2
+partition by range(x) (
+ partition p0 values less than (10),
+ partition p1 values less than (20),
+ partition pn values less than maxvalue);
+
+alter table t1 convert partition p1 to table tp1;
+
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table tp1;
+--replace_result $default_engine X ' PAGE_CHECKSUM=1' ''
+show create table t1;
+
+drop tables t1, tp1;
+}
+
+--echo #
+--echo # MDEV-29841 Partition by system_time can be converted into table but not back
+--echo #
+create or replace table t (a int) with system versioning
+partition by system_time limit 10 partitions 3;
+alter table t convert partition p0 to table tp;
+--error ER_ONLY_ON_RANGE_LIST_PARTITION
+alter table t convert table tp to partition p0;
+drop tables t, tp;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
+
set global innodb_stats_persistent= @save_persistent;
--source suite/versioning/common_finish.inc
diff --git a/mysql-test/suite/wsrep/r/variables.result b/mysql-test/suite/wsrep/r/variables.result
index 82c480917f1..8e1af35fd62 100644
--- a/mysql-test/suite/wsrep/r/variables.result
+++ b/mysql-test/suite/wsrep/r/variables.result
@@ -105,8 +105,6 @@ WSREP_FORCED_BINLOG_FORMAT
WSREP_GTID_DOMAIN_ID
WSREP_GTID_MODE
WSREP_GTID_SEQ_NO
-WSREP_MODE
-WSREP_STRICT_DDL
WSREP_IGNORE_APPLY_ERRORS
WSREP_LOAD_DATA_SPLITTING
WSREP_LOG_CONFLICTS
@@ -125,7 +123,6 @@ WSREP_PROVIDER
WSREP_PROVIDER_OPTIONS
WSREP_RECOVER
WSREP_REJECT_QUERIES
-WSREP_REPLICATE_MYISAM
WSREP_RESTART_SLAVE
WSREP_RETRY_AUTOCOMMIT
WSREP_SLAVE_FK_CHECKS
@@ -138,7 +135,6 @@ WSREP_SST_DONOR_REJECTS_QUERIES
WSREP_SST_METHOD
WSREP_SST_RECEIVE_ADDRESS
WSREP_START_POSITION
-WSREP_STRICT_DDL
WSREP_SYNC_WAIT
WSREP_TRX_FRAGMENT_SIZE
WSREP_TRX_FRAGMENT_UNIT
diff --git a/mysql-test/suite/wsrep/r/variables_debug.result b/mysql-test/suite/wsrep/r/variables_debug.result
index fe2bffb3f08..0690f540a37 100644
--- a/mysql-test/suite/wsrep/r/variables_debug.result
+++ b/mysql-test/suite/wsrep/r/variables_debug.result
@@ -105,11 +105,13 @@ WSREP_DRUPAL_282555_WORKAROUND
WSREP_FORCED_BINLOG_FORMAT
WSREP_GTID_DOMAIN_ID
WSREP_GTID_MODE
+WSREP_GTID_SEQ_NO
WSREP_IGNORE_APPLY_ERRORS
WSREP_LOAD_DATA_SPLITTING
WSREP_LOG_CONFLICTS
WSREP_MAX_WS_ROWS
WSREP_MAX_WS_SIZE
+WSREP_MODE
WSREP_MYSQL_REPLICATION_BUNDLE
WSREP_NODE_ADDRESS
WSREP_NODE_INCOMING_ADDRESS
@@ -122,7 +124,6 @@ WSREP_PROVIDER
WSREP_PROVIDER_OPTIONS
WSREP_RECOVER
WSREP_REJECT_QUERIES
-WSREP_REPLICATE_MYISAM
WSREP_RESTART_SLAVE
WSREP_RETRY_AUTOCOMMIT
WSREP_SLAVE_FK_CHECKS
diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt
index 760c3c1475d..758243df10f 100644
--- a/mysys/CMakeLists.txt
+++ b/mysys/CMakeLists.txt
@@ -54,7 +54,6 @@ IF (WIN32)
my_wincond.c
my_winerr.c
my_winfile.c
- my_conio.c
my_minidump.cc
my_win_popen.cc)
ENDIF()
diff --git a/mysys/array.c b/mysys/array.c
index 8eda279a492..6e871ee6343 100644
--- a/mysys/array.c
+++ b/mysys/array.c
@@ -42,8 +42,9 @@
*/
my_bool init_dynamic_array2(PSI_memory_key psi_key, DYNAMIC_ARRAY *array,
- uint element_size, void *init_buffer,
- uint init_alloc, uint alloc_increment, myf my_flags)
+ size_t element_size, void *init_buffer,
+ size_t init_alloc, size_t alloc_increment,
+ myf my_flags)
{
DBUG_ENTER("init_dynamic_array2");
if (!alloc_increment)
@@ -199,7 +200,7 @@ void *pop_dynamic(DYNAMIC_ARRAY *array)
FALSE Ok
*/
-my_bool set_dynamic(DYNAMIC_ARRAY *array, const void *element, uint idx)
+my_bool set_dynamic(DYNAMIC_ARRAY *array, const void *element, size_t idx)
{
if (idx >= array->elements)
{
@@ -210,7 +211,7 @@ my_bool set_dynamic(DYNAMIC_ARRAY *array, const void *element, uint idx)
array->elements=idx+1;
}
memcpy(array->buffer+(idx * array->size_of_element),element,
- (size_t) array->size_of_element);
+ array->size_of_element);
return FALSE;
}
@@ -231,13 +232,13 @@ my_bool set_dynamic(DYNAMIC_ARRAY *array, const void *element, uint idx)
TRUE Allocation of new memory failed
*/
-my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements)
+my_bool allocate_dynamic(DYNAMIC_ARRAY *array, size_t max_elements)
{
DBUG_ENTER("allocate_dynamic");
if (max_elements >= array->max_element)
{
- uint size;
+ size_t size;
uchar *new_ptr;
size= (max_elements + array->alloc_increment)/array->alloc_increment;
size*= array->alloc_increment;
@@ -278,7 +279,7 @@ my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements)
idx Index of element wanted.
*/
-void get_dynamic(DYNAMIC_ARRAY *array, void *element, uint idx)
+void get_dynamic(DYNAMIC_ARRAY *array, void *element, size_t idx)
{
if (idx >= array->elements)
{
@@ -321,7 +322,7 @@ void delete_dynamic(DYNAMIC_ARRAY *array)
idx Index of element to be deleted
*/
-void delete_dynamic_element(DYNAMIC_ARRAY *array, uint idx)
+void delete_dynamic_element(DYNAMIC_ARRAY *array, size_t idx)
{
char *ptr= (char*) array->buffer+array->size_of_element*idx;
array->elements--;
@@ -340,7 +341,7 @@ void delete_dynamic_element(DYNAMIC_ARRAY *array, uint idx)
deleting the array;
*/
void delete_dynamic_with_callback(DYNAMIC_ARRAY *array, FREE_FUNC f) {
- uint i;
+ size_t i;
char *ptr= (char*) array->buffer;
for (i= 0; i < array->elements; i++, ptr+= array->size_of_element) {
f(ptr);
@@ -358,7 +359,7 @@ void delete_dynamic_with_callback(DYNAMIC_ARRAY *array, FREE_FUNC f) {
void freeze_size(DYNAMIC_ARRAY *array)
{
- uint elements;
+ size_t elements;
/*
Do nothing if we are using a static buffer
@@ -375,29 +376,3 @@ void freeze_size(DYNAMIC_ARRAY *array)
array->max_element= elements;
}
}
-
-#ifdef NOT_USED
-/*
- Get the index of a dynamic element
-
- SYNOPSIS
- get_index_dynamic()
- array Array
- element Whose element index
-
-*/
-
-int get_index_dynamic(DYNAMIC_ARRAY *array, void* element)
-{
- size_t ret;
- if (array->buffer > (uchar*) element)
- return -1;
-
- ret= ((uchar*) element - array->buffer) / array->size_of_element;
- if (ret > array->elements)
- return -1;
-
- return ret;
-
-}
-#endif
diff --git a/mysys/charset.c b/mysys/charset.c
index 4c02ae5f1fb..560c713a361 100644
--- a/mysys/charset.c
+++ b/mysys/charset.c
@@ -1211,30 +1211,17 @@ size_t escape_string_for_mysql(CHARSET_INFO *charset_info,
#ifdef BACKSLASH_MBTAIL
-static CHARSET_INFO *fs_cset_cache= NULL;
-
CHARSET_INFO *fs_character_set()
{
- if (!fs_cset_cache)
- {
- char buf[10]= "cp";
- GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE,
- buf+2, sizeof(buf)-3);
- /*
- We cannot call get_charset_by_name here
- because fs_character_set() is executed before
- LOCK_THD_charset mutex initialization, which
- is used inside get_charset_by_name.
- As we're now interested in cp932 only,
- let's just detect it using strcmp().
- */
- fs_cset_cache=
- #ifdef HAVE_CHARSET_cp932
- !strcmp(buf, "cp932") ? &my_charset_cp932_japanese_ci :
- #endif
- &my_charset_bin;
- }
- return fs_cset_cache;
+ static CHARSET_INFO *fs_cset_cache;
+ if (fs_cset_cache)
+ return fs_cset_cache;
+#ifdef HAVE_CHARSET_cp932
+ else if (GetACP() == 932)
+ return fs_cset_cache= &my_charset_cp932_japanese_ci;
+#endif
+ else
+ return fs_cset_cache= &my_charset_bin;
}
#endif
@@ -1395,8 +1382,8 @@ static const MY_CSET_OS_NAME charsets[] =
#ifdef UNCOMMENT_THIS_WHEN_WL_WL_4024_IS_DONE
{"cp54936", "gb18030", my_cs_exact},
#endif
- {"cp65001", "utf8", my_cs_exact},
-
+ {"cp65001", "utf8mb4", my_cs_exact},
+ {"cp65001", "utf8mb3", my_cs_approx},
#else /* not Windows */
{"646", "latin1", my_cs_approx}, /* Default on Solaris */
@@ -1519,9 +1506,15 @@ const char* my_default_csname()
const char* csname = NULL;
#ifdef _WIN32
char cpbuf[64];
- int cp = GetConsoleCP();
- if (cp == 0)
- cp = GetACP();
+ UINT cp;
+ if (GetACP() == CP_UTF8)
+ cp= CP_UTF8;
+ else
+ {
+ cp= GetConsoleCP();
+ if (cp == 0)
+ cp= GetACP();
+ }
snprintf(cpbuf, sizeof(cpbuf), "cp%d", (int)cp);
csname = my_os_charset_to_mysql_charset(cpbuf);
#elif defined(HAVE_SETLOCALE) && defined(HAVE_NL_LANGINFO)
@@ -1530,3 +1523,90 @@ const char* my_default_csname()
#endif
return csname ? csname : MYSQL_DEFAULT_CHARSET_NAME;
}
+
+
+#ifdef _WIN32
+/**
+ Extract codepage number from "cpNNNN" string,
+ and check that this codepage is supported.
+
+ @return 0 - invalid codepage(or unsupported)
+ > 0 - valid codepage number.
+*/
+static UINT get_codepage(const char *s)
+{
+ UINT cp;
+ if (s[0] != 'c' || s[1] != 'p')
+ {
+ DBUG_ASSERT(0);
+ return 0;
+ }
+ cp= strtoul(s + 2, NULL, 10);
+ if (!IsValidCodePage(cp))
+ {
+ /*
+ Can happen also with documented CP, i.e 51936
+ Perhaps differs from one machine to another.
+ */
+ return 0;
+ }
+ return cp;
+}
+
+static UINT mysql_charset_to_codepage(const char *my_cs_name)
+{
+ const MY_CSET_OS_NAME *csp;
+ UINT cp=0,tmp;
+ for (csp= charsets; csp->os_name; csp++)
+ {
+ if (!strcasecmp(csp->my_name, my_cs_name))
+ {
+ switch (csp->param)
+ {
+ case my_cs_exact:
+ tmp= get_codepage(csp->os_name);
+ if (tmp)
+ return tmp;
+ break;
+ case my_cs_approx:
+ /*
+ don't return just yet, perhaps there is a better
+ (exact) match later.
+ */
+ if (!cp)
+ cp= get_codepage(csp->os_name);
+ continue;
+
+ default:
+ return 0;
+ }
+ }
+ }
+ return cp;
+}
+
+/** Set console codepage for MariaDB's charset name */
+int my_set_console_cp(const char *csname)
+{
+ UINT cp;
+ if (fileno(stdout) < 0 || !isatty(fileno(stdout)))
+ return 0;
+ cp= mysql_charset_to_codepage(csname);
+ if (!cp)
+ {
+ /* No compatible os charset.*/
+ return -1;
+ }
+
+ if (GetConsoleOutputCP() != cp && !SetConsoleOutputCP(cp))
+ {
+ return -1;
+ }
+
+ if (GetConsoleCP() != cp && !SetConsoleCP(cp))
+ {
+ return -1;
+ }
+ return 0;
+}
+#endif
diff --git a/mysys/crc32ieee.cc b/mysys/crc32ieee.cc
index bbafa1230f8..14e8017de4b 100644
--- a/mysys/crc32ieee.cc
+++ b/mysys/crc32ieee.cc
@@ -1,4 +1,4 @@
-/* Copyright (c) 2020, 2021, MariaDB
+/* Copyright (c) 2020, 2022, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -55,7 +55,7 @@ static const my_crc32_t my_checksum_func= init_crc32();
# error "my_checksum() is defined in mysys/crc32/crc32_ppc64.c"
#endif
extern "C"
-unsigned int my_checksum(unsigned int crc, const void *data, size_t len)
+uint32 my_checksum(uint32 crc, const void *data, size_t len)
{
return my_checksum_func(crc, data, len);
}
diff --git a/mysys/get_password.c b/mysys/get_password.c
index 24befa6b5df..18286fd9e39 100644
--- a/mysys/get_password.c
+++ b/mysys/get_password.c
@@ -62,35 +62,58 @@
char *get_tty_password(const char *opt_message)
{
- char to[80];
- char *pos=to,*end=to+sizeof(to)-1;
+ wchar_t wbuf[80];
+ char *to;
+ int to_len;
+ UINT cp;
+ wchar_t *pos=wbuf,*end=wbuf + array_elements(wbuf)-1;
DBUG_ENTER("get_tty_password");
_cputs(opt_message ? opt_message : "Enter password: ");
for (;;)
{
- char tmp;
- tmp=_getch();
- if (tmp == '\b' || (int) tmp == 127)
+ int wc;
+ wc=_getwch();
+ if (wc == '\b' || wc == 127)
{
- if (pos != to)
+ if (pos != wbuf)
{
- _cputs("\b \b");
- pos--;
- continue;
+ _cputs("\b \b");
+ pos--;
+ continue;
}
}
- if (tmp == '\n' || tmp == '\r' || tmp == 3)
+ if (wc == '\n' || wc == '\r' || wc == 3 || pos == end)
break;
- if (iscntrl(tmp) || pos == end)
+ if (iswcntrl(wc))
continue;
- _cputs("*");
- *(pos++) = tmp;
+
+ /* Do not print '*' for half-unicode char(high surrogate)*/
+ if (wc < 0xD800 || wc > 0xDBFF)
+ {
+ _cputs("*");
+ }
+ *(pos++)= (wchar_t)wc;
}
- while (pos != to && isspace(pos[-1]) == ' ')
- pos--; /* Allow dummy space at end */
*pos=0;
_cputs("\n");
- DBUG_RETURN(my_strdup(PSI_INSTRUMENT_ME, to,MYF(MY_FAE)));
+
+ /*
+ Allocate output string, and convert UTF16 password to output codepage.
+ */
+ cp= GetACP() == CP_UTF8 ? CP_UTF8 : GetConsoleCP();
+
+ if (!(to_len= WideCharToMultiByte(cp, 0, wbuf, -1, NULL, 0, NULL, NULL)))
+ DBUG_RETURN(NULL);
+
+ if (!(to= my_malloc(PSI_INSTRUMENT_ME, to_len, MYF(MY_FAE))))
+ DBUG_RETURN(NULL);
+
+ if (!WideCharToMultiByte(cp, 0, wbuf, -1, to, to_len, NULL, NULL))
+ {
+ my_free(to);
+ DBUG_RETURN(NULL);
+ }
+ DBUG_RETURN(to);
}
#else
diff --git a/mysys/hash.c b/mysys/hash.c
index c86b0d92cb6..fccd4a24373 100644
--- a/mysys/hash.c
+++ b/mysys/hash.c
@@ -77,8 +77,8 @@ my_hash_value_type my_hash_sort(CHARSET_INFO *cs, const uchar *key,
@retval 1 failure
*/
my_bool
-my_hash_init2(PSI_memory_key psi_key, HASH *hash, uint growth_size,
- CHARSET_INFO *charset, ulong size, size_t key_offset,
+my_hash_init2(PSI_memory_key psi_key, HASH *hash, size_t growth_size,
+ CHARSET_INFO *charset, size_t size, size_t key_offset,
size_t key_length, my_hash_get_key get_key,
my_hash_function hash_function,
void (*free_element)(void*), uint flags)
@@ -283,6 +283,8 @@ uchar* my_hash_first_from_hash_value(const HASH *hash,
uint flag= 1;
uint idx= my_hash_mask(hash_value,
hash->blength, hash->records);
+ if (!length)
+ length= hash->key_length; // length for fixed length keys or 0
do
{
pos= dynamic_element(&hash->array,idx,HASH_LINK*);
@@ -317,6 +319,8 @@ uchar* my_hash_next(const HASH *hash, const uchar *key, size_t length,
if (*current_record != NO_RECORD)
{
HASH_LINK *data=dynamic_element(&hash->array,0,HASH_LINK*);
+ if (!length)
+ length= hash->key_length; // length for fixed length keys or 0
for (idx=data[*current_record].next; idx != NO_RECORD ; idx=pos->next)
{
pos=data+idx;
@@ -357,8 +361,11 @@ static void movelink(HASH_LINK *array,uint find,uint next_link,uint newlink)
length length of key
NOTES:
- If length is 0, comparison is done using the length of the
- record being compared against.
+ length equal 0 can mean 2 things:
+ 1) it is fixed key length hash (HASH::key_length != 0) and
+ default length should be taken in this case
+ 2) it is really 0 length key for variable key length hash
+ (HASH::key_length == 0)
RETURN
= 0 key of record == key
@@ -369,10 +376,11 @@ static int hashcmp(const HASH *hash, HASH_LINK *pos, const uchar *key,
size_t length)
{
size_t rec_keylength;
- uchar *rec_key= (uchar*) my_hash_key(hash, pos->data, &rec_keylength, 1);
- return ((length && length != rec_keylength) ||
+ uchar *rec_key;
+ rec_key= (uchar*) my_hash_key(hash, pos->data, &rec_keylength, 1);
+ return (length != rec_keylength) ||
my_strnncoll(hash->charset, (uchar*) rec_key, rec_keylength,
- (uchar*) key, rec_keylength));
+ (uchar*) key, rec_keylength);
}
diff --git a/mysys/my_alloc.c b/mysys/my_alloc.c
index aa0182c755e..43f26751f27 100644
--- a/mysys/my_alloc.c
+++ b/mysys/my_alloc.c
@@ -20,6 +20,11 @@
#include <my_global.h>
#include <my_sys.h>
#include <m_string.h>
+#include <my_bit.h>
+#ifdef HAVE_SYS_MMAN_H
+#include <sys/mman.h>
+#endif
+
#undef EXTRA_DEBUG
#define EXTRA_DEBUG
@@ -30,10 +35,91 @@
/* data packed in MEM_ROOT -> min_malloc */
-#define MALLOC_FLAG(A) ((A & 1) ? MY_THREAD_SPECIFIC : 0)
+/* Don't allocate too small blocks */
+#define ROOT_MIN_BLOCK_SIZE 256
+
+/* bits in MEM_ROOT->flags */
+#define ROOT_FLAG_THREAD_SPECIFIC 1
+#define ROOT_FLAG_MPROTECT 2
+
+#define MALLOC_FLAG(R) MYF((R)->flags & ROOT_FLAG_THREAD_SPECIFIC ? THREAD_SPECIFIC : 0)
#define TRASH_MEM(X) TRASH_FREE(((char*)(X) + ((X)->size-(X)->left)), (X)->left)
+
+/*
+ Alloc memory through either my_malloc or mmap()
+*/
+
+static void *root_alloc(MEM_ROOT *root, size_t size, size_t *alloced_size,
+ myf my_flags)
+{
+ *alloced_size= size;
+#if defined(HAVE_MMAP) && defined(HAVE_MPROTECT) && defined(MAP_ANONYMOUS)
+ if (root->flags & ROOT_FLAG_MPROTECT)
+ {
+ void *res;
+ *alloced_size= MY_ALIGN(size, my_system_page_size);
+ res= my_mmap(0, *alloced_size, PROT_READ | PROT_WRITE,
+ MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (res == MAP_FAILED)
+ res= 0;
+ return res;
+ }
+#endif /* HAVE_MMAP */
+
+ return my_malloc(root->psi_key, size,
+ my_flags | MYF(root->flags & ROOT_FLAG_THREAD_SPECIFIC ?
+ MY_THREAD_SPECIFIC : 0));
+}
+
+static void root_free(MEM_ROOT *root, void *ptr, size_t size)
+{
+#if defined(HAVE_MMAP) && defined(HAVE_MPROTECT) && defined(MAP_ANONYMOUS)
+ if (root->flags & ROOT_FLAG_MPROTECT)
+ my_munmap(ptr, size);
+ else
+#endif
+ my_free(ptr);
+}
+
+
+/*
+ Calculate block sizes to use
+
+ Sizes will be updated to next power of 2, minus operating system
+ memory management size.
+
+ The idea is to reduce memory fragmentation as most system memory
+ allocators are using power of 2 block size internally.
+*/
+
+static void calculate_block_sizes(MEM_ROOT *mem_root, size_t block_size,
+ size_t *pre_alloc_size)
+{
+ size_t pre_alloc= *pre_alloc_size;
+
+ if (mem_root->flags&= ROOT_FLAG_MPROTECT)
+ {
+ mem_root->block_size= MY_ALIGN(block_size, my_system_page_size);
+ if (pre_alloc)
+ pre_alloc= MY_ALIGN(pre_alloc, my_system_page_size);
+ }
+ else
+ {
+ DBUG_ASSERT(block_size <= UINT_MAX32);
+ mem_root->block_size= (my_round_up_to_next_power((uint32) block_size -
+ MALLOC_OVERHEAD)-
+ MALLOC_OVERHEAD);
+ if (pre_alloc)
+ pre_alloc= (my_round_up_to_next_power((uint32) pre_alloc -
+ MALLOC_OVERHEAD)-
+ MALLOC_OVERHEAD);
+ }
+ *pre_alloc_size= pre_alloc;
+}
+
+
/*
Initialize memory root
@@ -41,13 +127,18 @@
init_alloc_root()
key - key to register instrumented memory
mem_root - memory root to initialize
- block_size - size of chunks (blocks) used for memory allocation
+ block_size - size of chunks (blocks) used for memory allocation.
+ Will be updated to next power of 2, minus
+ internal and system memory management size. This is
+ will reduce memory fragmentation as most system memory
+ allocators are using power of 2 block size internally.
(It is external size of chunk i.e. it should include
memory required for internal structures, thus it
- should be no less than ALLOC_ROOT_MIN_BLOCK_SIZE)
+ should be no less than ROOT_MIN_BLOCK_SIZE).
pre_alloc_size - if non-0, then size of block that should be
pre-allocated during memory root initialization.
my_flags MY_THREAD_SPECIFIC flag for my_malloc
+ MY_RROOT_USE_MPROTECT for read only protected memory
DESCRIPTION
This function prepares memory root for further use, sets initial size of
@@ -55,9 +146,6 @@
Although error can happen during execution of this function if
pre_alloc_size is non-0 it won't be reported. Instead it will be
reported as error in first alloc_root() on this memory root.
-
- We don't want to change the structure size for MEM_ROOT.
- Because of this, we store in MY_THREAD_SPECIFIC as bit 1 in block_size
*/
void init_alloc_root(PSI_memory_key key, MEM_ROOT *mem_root, size_t block_size,
@@ -68,25 +156,31 @@ void init_alloc_root(PSI_memory_key key, MEM_ROOT *mem_root, size_t block_size,
DBUG_PRINT("enter",("root: %p prealloc: %zu", mem_root, pre_alloc_size));
mem_root->free= mem_root->used= mem_root->pre_alloc= 0;
- mem_root->min_malloc= 32;
- mem_root->block_size= (block_size - ALLOC_ROOT_MIN_BLOCK_SIZE) & ~1;
+ mem_root->min_malloc= 32 + REDZONE_SIZE;
+ mem_root->block_size= MY_MAX(block_size, ROOT_MIN_BLOCK_SIZE);
+ mem_root->flags= 0;
if (my_flags & MY_THREAD_SPECIFIC)
- mem_root->block_size|= 1;
+ mem_root->flags|= ROOT_FLAG_THREAD_SPECIFIC;
+ if (my_flags & MY_ROOT_USE_MPROTECT)
+ mem_root->flags|= ROOT_FLAG_MPROTECT;
+
+ calculate_block_sizes(mem_root, block_size, &pre_alloc_size);
mem_root->error_handler= 0;
mem_root->block_num= 4; /* We shift this with >>2 */
mem_root->first_block_usage= 0;
- mem_root->m_psi_key= key;
+ mem_root->psi_key= key;
#if !(defined(HAVE_valgrind) && defined(EXTRA_DEBUG))
if (pre_alloc_size)
{
- size_t size= pre_alloc_size + ALIGN_SIZE(sizeof(USED_MEM));
+ size_t alloced_size;
if ((mem_root->free= mem_root->pre_alloc=
- (USED_MEM*) my_malloc(key, size, MYF(my_flags))))
+ (USED_MEM*) root_alloc(mem_root, pre_alloc_size, &alloced_size,
+ MYF(0))))
{
- mem_root->free->size= size;
- mem_root->free->left= pre_alloc_size;
+ mem_root->free->size= alloced_size;
+ mem_root->free->left= alloced_size - ALIGN_SIZE(sizeof(USED_MEM));
mem_root->free->next= 0;
TRASH_MEM(mem_root->free);
}
@@ -118,13 +212,14 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
DBUG_ENTER("reset_root_defaults");
DBUG_ASSERT(alloc_root_inited(mem_root));
- mem_root->block_size= (((block_size - ALLOC_ROOT_MIN_BLOCK_SIZE) & ~1) |
- (mem_root->block_size & 1));
+ calculate_block_sizes(mem_root, block_size, &pre_alloc_size);
+
#if !(defined(HAVE_valgrind) && defined(EXTRA_DEBUG))
if (pre_alloc_size)
{
- size_t size= pre_alloc_size + ALIGN_SIZE(sizeof(USED_MEM));
- if (!mem_root->pre_alloc || mem_root->pre_alloc->size != size)
+ size_t size= mem_root->block_size, alloced_size;
+ if (!mem_root->pre_alloc ||
+ mem_root->pre_alloc->size != mem_root->block_size)
{
USED_MEM *mem, **prev= &mem_root->free;
/*
@@ -144,26 +239,23 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
{
/* remove block from the list and free it */
*prev= mem->next;
- my_free(mem);
+ root_free(mem_root, mem, mem->size);
}
else
prev= &mem->next;
}
/* Allocate new prealloc block and add it to the end of free list */
- if ((mem= (USED_MEM *) my_malloc(mem_root->m_psi_key, size,
- MYF(MALLOC_FLAG(mem_root->
- block_size)))))
+ if ((mem= (USED_MEM *) root_alloc(mem_root, size, &alloced_size,
+ MYF(MY_WME))))
{
- mem->size= size;
- mem->left= pre_alloc_size;
+ mem->size= alloced_size;
+ mem->left= alloced_size - ALIGN_SIZE(sizeof(USED_MEM));
mem->next= *prev;
*prev= mem_root->pre_alloc= mem;
TRASH_MEM(mem);
}
else
- {
mem_root->pre_alloc= 0;
- }
}
}
else
@@ -176,37 +268,6 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
void *alloc_root(MEM_ROOT *mem_root, size_t length)
{
-#if defined(HAVE_valgrind) && defined(EXTRA_DEBUG)
- reg1 USED_MEM *next;
- DBUG_ENTER("alloc_root");
- DBUG_PRINT("enter",("root: %p", mem_root));
-
- DBUG_ASSERT(alloc_root_inited(mem_root));
-
- DBUG_EXECUTE_IF("simulate_out_of_memory",
- {
- if (mem_root->error_handler)
- (*mem_root->error_handler)();
- DBUG_SET("-d,simulate_out_of_memory");
- DBUG_RETURN((void*) 0); /* purecov: inspected */
- });
-
- length+=ALIGN_SIZE(sizeof(USED_MEM));
- if (!(next = (USED_MEM*) my_malloc(mem_root->m_psi_key, length,
- MYF(MY_WME | ME_FATAL |
- MALLOC_FLAG(mem_root->block_size)))))
- {
- if (mem_root->error_handler)
- (*mem_root->error_handler)();
- DBUG_RETURN((uchar*) 0); /* purecov: inspected */
- }
- next->next= mem_root->used;
- next->left= 0;
- next->size= length;
- mem_root->used= next;
- DBUG_PRINT("exit",("ptr: %p", (((char*)next)+ALIGN_SIZE(sizeof(USED_MEM)))));
- DBUG_RETURN((((uchar*) next)+ALIGN_SIZE(sizeof(USED_MEM))));
-#else
size_t get_size, block_size;
uchar* point;
reg1 USED_MEM *next= 0;
@@ -217,13 +278,36 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length)
DBUG_ASSERT(alloc_root_inited(mem_root));
DBUG_EXECUTE_IF("simulate_out_of_memory",
- {
- /* Avoid reusing an already allocated block */
- if (mem_root->error_handler)
- (*mem_root->error_handler)();
- DBUG_SET("-d,simulate_out_of_memory");
- DBUG_RETURN((void*) 0); /* purecov: inspected */
- });
+ {
+ if (mem_root->error_handler)
+ (*mem_root->error_handler)();
+ DBUG_SET("-d,simulate_out_of_memory");
+ DBUG_RETURN((void*) 0); /* purecov: inspected */
+ });
+
+#if defined(HAVE_valgrind) && defined(EXTRA_DEBUG)
+ if (!(mem_root->flags & ROOT_FLAG_MPROTECT))
+ {
+ length+= ALIGN_SIZE(sizeof(USED_MEM));
+ if (!(next = (USED_MEM*) my_malloc(mem_root->psi_key, length,
+ MYF(MY_WME | ME_FATAL |
+ (mem_root->flags &
+ ROOT_FLAG_THREAD_SPECIFIC ?
+ MY_THREAD_SPECIFIC : 0)))))
+ {
+ if (mem_root->error_handler)
+ (*mem_root->error_handler)();
+ DBUG_RETURN((uchar*) 0); /* purecov: inspected */
+ }
+ next->next= mem_root->used;
+ next->left= 0;
+ next->size= length;
+ mem_root->used= next;
+ DBUG_PRINT("exit",("ptr: %p", (((char*)next)+ALIGN_SIZE(sizeof(USED_MEM)))));
+ DBUG_RETURN((((uchar*) next)+ALIGN_SIZE(sizeof(USED_MEM))));
+ }
+#endif /* defined(HAVE_valgrind) && defined(EXTRA_DEBUG) */
+
length= ALIGN_SIZE(length) + REDZONE_SIZE;
if ((*(prev= &mem_root->free)) != NULL)
{
@@ -242,14 +326,16 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length)
}
if (! next)
{ /* Time to alloc new block */
- block_size= (mem_root->block_size & ~1) * (mem_root->block_num >> 2);
- get_size= length+ALIGN_SIZE(sizeof(USED_MEM));
+ size_t alloced_length;
+
+ /* Increase block size over time if there is a lot of mallocs */
+ block_size= (MY_ALIGN(mem_root->block_size, ROOT_MIN_BLOCK_SIZE) *
+ (mem_root->block_num >> 2)- MALLOC_OVERHEAD);
+ get_size= length + ALIGN_SIZE(sizeof(USED_MEM));
get_size= MY_MAX(get_size, block_size);
- if (!(next = (USED_MEM*) my_malloc(mem_root->m_psi_key, get_size,
- MYF(MY_WME | ME_FATAL |
- MALLOC_FLAG(mem_root->
- block_size)))))
+ if (!(next= (USED_MEM*) root_alloc(mem_root, get_size, &alloced_length,
+ MYF(MY_WME | ME_FATAL))))
{
if (mem_root->error_handler)
(*mem_root->error_handler)();
@@ -257,8 +343,8 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length)
}
mem_root->block_num++;
next->next= *prev;
- next->size= get_size;
- next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM));
+ next->size= alloced_length;
+ next->left= alloced_length - ALIGN_SIZE(sizeof(USED_MEM));
*prev=next;
TRASH_MEM(next);
}
@@ -276,7 +362,6 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length)
TRASH_ALLOC(point, original_length);
DBUG_PRINT("exit",("ptr: %p", point));
DBUG_RETURN((void*) point);
-#endif
}
@@ -419,13 +504,13 @@ void free_root(MEM_ROOT *root, myf MyFlags)
{
old=next; next= next->next ;
if (old != root->pre_alloc)
- my_free(old);
+ root_free(root, old, old->size);
}
for (next=root->free ; next ;)
{
old=next; next= next->next;
if (old != root->pre_alloc)
- my_free(old);
+ root_free(root, old, old->size);
}
root->used=root->free=0;
if (root->pre_alloc)
@@ -440,6 +525,7 @@ void free_root(MEM_ROOT *root, myf MyFlags)
DBUG_VOID_RETURN;
}
+
/*
Find block that contains an object and set the pre_alloc to it
*/
@@ -466,6 +552,38 @@ void set_prealloc_root(MEM_ROOT *root, char *ptr)
}
+/**
+ Change protection for all blocks in the mem root
+*/
+
+#if defined(HAVE_MMAP) && defined(HAVE_MPROTECT) && defined(MAP_ANONYMOUS)
+void protect_root(MEM_ROOT *root, int prot)
+{
+ reg1 USED_MEM *next,*old;
+ DBUG_ENTER("protect_root");
+ DBUG_PRINT("enter",("root: %p prot: %d", root, prot));
+
+ DBUG_ASSERT(root->flags & ROOT_FLAG_MPROTECT);
+
+ for (next= root->used; next ;)
+ {
+ old= next; next= next->next ;
+ mprotect(old, old->size, prot);
+ }
+ for (next= root->free; next ;)
+ {
+ old= next; next= next->next ;
+ mprotect(old, old->size, prot);
+ }
+ DBUG_VOID_RETURN;
+}
+#else
+void protect_root(MEM_ROOT *root, int prot)
+{
+}
+#endif /* defined(HAVE_MMAP) && ... */
+
+
char *strdup_root(MEM_ROOT *root, const char *str)
{
return strmake_root(root, str, strlen(str));
diff --git a/mysys/my_bitmap.c b/mysys/my_bitmap.c
index bf2bacd213c..9893c7e4a58 100644
--- a/mysys/my_bitmap.c
+++ b/mysys/my_bitmap.c
@@ -123,19 +123,6 @@ static inline my_bitmap_map last_word_mask(uint bit)
}
-static inline void bitmap_lock(MY_BITMAP *map __attribute__((unused)))
-{
- if (map->mutex)
- mysql_mutex_lock(map->mutex);
-}
-
-static inline void bitmap_unlock(MY_BITMAP *map __attribute__((unused)))
-{
- if (map->mutex)
- mysql_mutex_unlock(map->mutex);
-}
-
-
static inline uint get_first_set(my_bitmap_map value, uint word_pos)
{
uchar *byte_ptr= (uchar*)&value;
@@ -159,32 +146,15 @@ static inline uint get_first_set(my_bitmap_map value, uint word_pos)
Initialize a bitmap object. All bits will be set to zero
*/
-my_bool my_bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits,
- my_bool thread_safe)
+my_bool my_bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits)
{
DBUG_ENTER("my_bitmap_init");
- map->mutex= 0;
if (!buf)
{
uint size_in_bytes= bitmap_buffer_size(n_bits);
- uint extra= 0;
- if (thread_safe)
- {
- size_in_bytes= ALIGN_SIZE(size_in_bytes);
- extra= sizeof(mysql_mutex_t);
- }
if (!(buf= (my_bitmap_map*) my_malloc(key_memory_MY_BITMAP_bitmap,
- size_in_bytes+extra, MYF(MY_WME))))
+ size_in_bytes, MYF(MY_WME))))
DBUG_RETURN(1);
- if (thread_safe)
- {
- map->mutex= (mysql_mutex_t *) ((char*) buf + size_in_bytes);
- mysql_mutex_init(key_BITMAP_mutex, map->mutex, MY_MUTEX_INIT_FAST);
- }
- }
- else
- {
- DBUG_ASSERT(thread_safe == 0);
}
map->bitmap= buf;
@@ -200,8 +170,6 @@ void my_bitmap_free(MY_BITMAP *map)
DBUG_ENTER("my_bitmap_free");
if (map->bitmap)
{
- if (map->mutex)
- mysql_mutex_destroy(map->mutex);
my_free(map->bitmap);
map->bitmap=0;
}
@@ -247,13 +215,9 @@ my_bool bitmap_fast_test_and_set(MY_BITMAP *map, uint bitmap_bit)
my_bool bitmap_test_and_set(MY_BITMAP *map, uint bitmap_bit)
{
- my_bool res;
DBUG_ASSERT(map->bitmap);
DBUG_ASSERT(bitmap_bit < map->n_bits);
- bitmap_lock(map);
- res= bitmap_fast_test_and_set(map, bitmap_bit);
- bitmap_unlock(map);
- return res;
+ return bitmap_fast_test_and_set(map, bitmap_bit);
}
/*
@@ -281,13 +245,9 @@ my_bool bitmap_fast_test_and_clear(MY_BITMAP *map, uint bitmap_bit)
my_bool bitmap_test_and_clear(MY_BITMAP *map, uint bitmap_bit)
{
- my_bool res;
DBUG_ASSERT(map->bitmap);
DBUG_ASSERT(bitmap_bit < map->n_bits);
- bitmap_lock(map);
- res= bitmap_fast_test_and_clear(map, bitmap_bit);
- bitmap_unlock(map);
- return res;
+ return bitmap_fast_test_and_clear(map, bitmap_bit);
}
@@ -733,24 +693,3 @@ found:
DBUG_ASSERT(0);
return MY_BIT_NONE; /* Impossible */
}
-
-
-uint bitmap_lock_set_next(MY_BITMAP *map)
-{
- uint bit_found;
- bitmap_lock(map);
- bit_found= bitmap_set_next(map);
- bitmap_unlock(map);
- return bit_found;
-}
-
-
-void bitmap_lock_clear_bit(MY_BITMAP *map, uint bitmap_bit)
-{
- bitmap_lock(map);
- DBUG_ASSERT(map->bitmap);
- DBUG_ASSERT(bitmap_bit < map->n_bits);
- bitmap_clear_bit(map, bitmap_bit);
- bitmap_unlock(map);
-}
-
diff --git a/mysys/my_conio.c b/mysys/my_conio.c
deleted file mode 100644
index abcfa9798ec..00000000000
--- a/mysys/my_conio.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* Copyright (c) 2000, 2005, 2007 MySQL AB
- Use is subject to license terms
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-
-
-#include "mysys_priv.h"
-
-#ifdef _WIN32
-
-static HANDLE my_coninpfh= 0; /* console input */
-
-/*
- functions my_pthread_auto_mutex_lock & my_pthread_auto_mutex_free
- are experimental at this moment, they are intended to bring
- ability of protecting code sections without necessity to explicitly
- initialize synchronization object in one of threads
-
- if found useful they are to be exported in mysys
-*/
-
-
-/*
- int my_pthread_auto_mutex_lock(HANDLE* ph, const char* name,
- int id, int time)
- NOTES
- creates a mutex with given name and tries to lock it time msec.
- mutex name is appended with id to allow system wide or process wide
- locks. Handle to created mutex returned in ph argument.
-
- RETURN
- 0 thread owns mutex
- <>0 error
-*/
-
-static
-int my_pthread_auto_mutex_lock(HANDLE* ph, const char* name, int id, int time)
-{
- DWORD res;
- char tname[FN_REFLEN];
-
- sprintf(tname, "%s-%08X", name, id);
-
- *ph= CreateMutex(NULL, FALSE, tname);
- if (*ph == NULL)
- return GetLastError();
-
- res= WaitForSingleObject(*ph, time);
-
- if (res == WAIT_TIMEOUT)
- return ERROR_SEM_TIMEOUT;
-
- if (res == WAIT_FAILED)
- return GetLastError();
-
- return 0;
-}
-
-/*
- int my_pthread_auto_mutex_free(HANDLE* ph)
-
- NOTES
- releases a mutex.
-
- RETURN
- 0 thread released mutex
- <>0 error
-
-*/
-static
-int my_pthread_auto_mutex_free(HANDLE* ph)
-{
- if (*ph)
- {
- ReleaseMutex(*ph);
- CloseHandle(*ph);
- *ph= NULL;
- }
-
- return 0;
-}
-
-
-#define pthread_auto_mutex_decl(name) \
- HANDLE __h##name= NULL;
-
-#define pthread_auto_mutex_lock(name, proc, time) \
- my_pthread_auto_mutex_lock(&__h##name, #name, (proc), (time))
-
-#define pthread_auto_mutex_free(name) \
- my_pthread_auto_mutex_free(&__h##name)
-
-
-/*
- char* my_cgets()
-
- NOTES
- Replaces _cgets from libc to support input of more than 255 chars.
- Reads from the console via ReadConsole into buffer which
- should be at least clen characters.
- Actual length of string returned in plen.
-
- WARNING
- my_cgets() does NOT check the pushback character buffer (i.e., _chbuf).
- Thus, my_cgets() will not return any character that is pushed back by
- the _ungetch() call.
-
- RETURN
- string pointer ok
- NULL Error
-
-*/
-
-char* my_cgets(char *buffer, size_t clen, size_t* plen)
-{
- ULONG state;
- char *result;
- DWORD plen_res;
- CONSOLE_SCREEN_BUFFER_INFO csbi;
-
- pthread_auto_mutex_decl(my_conio_cs);
-
- /* lock the console for the current process*/
- if (pthread_auto_mutex_lock(my_conio_cs, GetCurrentProcessId(), INFINITE))
- {
- /* can not lock console */
- pthread_auto_mutex_free(my_conio_cs);
- return NULL;
- }
-
- /* init console input */
- if (my_coninpfh == 0)
- {
- /* same handle will be used until process termination */
- my_coninpfh= CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_EXISTING, 0, NULL);
- }
-
- if (my_coninpfh == INVALID_HANDLE_VALUE)
- {
- /* unlock the console */
- pthread_auto_mutex_free(my_conio_cs);
- return(NULL);
- }
-
- GetConsoleMode((HANDLE)my_coninpfh, &state);
- SetConsoleMode((HANDLE)my_coninpfh, ENABLE_LINE_INPUT |
- ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT);
-
- GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
-
- /*
- there is no known way to determine allowed buffer size for input
- though it is known it should not be more than 64K
- so we cut 64K and try first size of screen buffer
- if it is still to large we cut half of it and try again
- later we may want to cycle from MY_MIN(clen, 65535) to allowed size
- with small decrement to determine exact allowed buffer
- */
- clen= MY_MIN(clen, 65535);
- do
- {
- clen= MY_MIN(clen, (size_t) csbi.dwSize.X*csbi.dwSize.Y);
- if (!ReadConsole((HANDLE)my_coninpfh, (LPVOID)buffer, (DWORD) clen - 1, &plen_res,
- NULL))
- {
- result= NULL;
- clen>>= 1;
- }
- else
- {
- result= buffer;
- break;
- }
- }
- while (GetLastError() == ERROR_NOT_ENOUGH_MEMORY);
- *plen= plen_res;
-
- /* We go here on error reading the string (Ctrl-C for example) */
- if (!*plen)
- result= NULL; /* purecov: inspected */
-
- if (result != NULL)
- {
- if (*plen > 1 && buffer[*plen - 2] == '\r')
- {
- *plen= *plen - 2;
- }
- else
- {
- if (*plen > 0 && buffer[*plen - 1] == '\r')
- {
- char tmp[3];
- DWORD tmplen= (DWORD)sizeof(tmp);
-
- *plen= *plen - 1;
- /* read /n left in the buffer */
- ReadConsole((HANDLE)my_coninpfh, (LPVOID)tmp, tmplen, &tmplen, NULL);
- }
- }
- buffer[*plen]= '\0';
- }
-
- SetConsoleMode((HANDLE)my_coninpfh, state);
- /* unlock the console */
- pthread_auto_mutex_free(my_conio_cs);
-
- return result;
-}
-
-#endif /* _WIN32 */
diff --git a/mysys/my_default.c b/mysys/my_default.c
index cc4462a240b..ae576f7a058 100644
--- a/mysys/my_default.c
+++ b/mysys/my_default.c
@@ -466,7 +466,7 @@ int my_load_defaults(const char *conf_file, const char **groups, int *argc,
if (*argc)
memcpy(res + args.elements, *argv, *argc * sizeof(char*));
- (*argc)+= args.elements;
+ (*argc)+= (int)args.elements;
*argv= res;
(*argv)[*argc]= 0;
*(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */
@@ -602,7 +602,7 @@ static int search_default_file_with_ext(struct handle_option_ctx *ctx,
MYSQL_FILE *fp;
uint line=0;
enum { NONE, PARSE, SKIP } found_group= NONE;
- uint i;
+ size_t i;
MY_DIR *search_dir;
FILEINFO *search_file;
@@ -690,7 +690,7 @@ static int search_default_file_with_ext(struct handle_option_ctx *ctx,
if (!(search_dir= my_dir(ptr, MYF(MY_WME | MY_WANT_SORT))))
goto err;
- for (i= 0; i < (uint) search_dir->number_of_files; i++)
+ for (i= 0; i < search_dir->number_of_files; i++)
{
search_file= search_dir->dir_entry + i;
ext= fn_ext2(search_file->name);
diff --git a/mysys/my_delete.c b/mysys/my_delete.c
index 45449dc8140..6854033f84b 100644
--- a/mysys/my_delete.c
+++ b/mysys/my_delete.c
@@ -208,7 +208,7 @@ int my_rmtree(const char *dir, myf MyFlags)
char path[FN_REFLEN];
char sep[] = { FN_LIBCHAR, 0 };
int err = 0;
- uint i;
+ size_t i;
MY_DIR *dir_info = my_dir(dir, MYF(MY_DONT_SORT | MY_WANT_STAT));
if (!dir_info)
diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c
index 2b3e774f01a..9f13ca7a424 100644
--- a/mysys/my_getopt.c
+++ b/mysys/my_getopt.c
@@ -38,7 +38,7 @@ static double getopt_double(char *arg, const struct my_option *optp, int *err);
static void init_variables(const struct my_option *, init_func_p);
static void init_one_value(const struct my_option *, void *, longlong);
static void fini_one_value(const struct my_option *, void *, longlong);
-static int setval(const struct my_option *, void *, char *, my_bool);
+static int setval(const struct my_option *, void *, char *, my_bool, const char *);
static char *check_struct_option(char *cur_arg, char *key_name);
/*
@@ -133,6 +133,45 @@ double getopt_ulonglong2double(ulonglong v)
return u.dbl;
}
+#ifdef _WIN32
+/**
+
+ On Windows, if program is running in UTF8 mode, but some arguments are not UTF8.
+
+ This will mostly likely be a sign of old "ANSI" my.ini, and it is likely that
+ something will go wrong, e.g file access error.
+*/
+static void validate_value(const char *key, const char *value,
+ const char *filename)
+{
+ MY_STRCOPY_STATUS status;
+ const struct charset_info_st *cs= &my_charset_utf8mb4_bin;
+ size_t len;
+ if (GetACP() != CP_UTF8)
+ return;
+ if (!(len= strlen(value)))
+ return;
+ cs->cset->well_formed_char_length(cs, value, value + len, len, &status);
+ if (!status.m_well_formed_error_pos)
+ return;
+ if (filename && *filename)
+ {
+ my_getopt_error_reporter(WARNING_LEVEL,
+ "%s: invalid (non-UTF8) characters found for option '%s'"
+ " in file '%s'",
+ my_progname, key, filename);
+ }
+ else
+ {
+ my_getopt_error_reporter(
+ WARNING_LEVEL, "%s: invalid (non-UTF8) characters for option %s",
+ my_progname, key);
+ }
+}
+#else
+#define validate_value(key, value, filename) (void)filename
+#endif
+
/**
Handle command line options.
Sort options.
@@ -564,7 +603,7 @@ int handle_options(int *argc, char ***argv, const struct my_option *longopts,
}
}
if ((error= setval(optp, optp->value, argument,
- set_maximum_value)))
+ set_maximum_value,filename)))
DBUG_RETURN(error);
if (get_one_option(optp, argument, filename))
DBUG_RETURN(EXIT_UNSPECIFIED_ERROR);
@@ -610,7 +649,7 @@ int handle_options(int *argc, char ***argv, const struct my_option *longopts,
continue;
}
if ((!option_is_autoset) &&
- ((error= setval(optp, value, argument, set_maximum_value))) &&
+ ((error= setval(optp, value, argument, set_maximum_value,filename))) &&
!option_is_loose)
DBUG_RETURN(error);
if (get_one_option(optp, argument, filename))
@@ -711,7 +750,7 @@ static my_bool get_bool_argument(const struct my_option *opts,
*/
static int setval(const struct my_option *opts, void *value, char *argument,
- my_bool set_maximum_value)
+ my_bool set_maximum_value, const char *option_file)
{
int err= 0, res= 0;
DBUG_ENTER("setval");
@@ -858,6 +897,7 @@ static int setval(const struct my_option *opts, void *value, char *argument,
goto ret;
};
}
+ validate_value(opts->name, argument, option_file);
DBUG_RETURN(0);
ret:
diff --git a/mysys/my_init.c b/mysys/my_init.c
index 2b420da03be..2f21bcb735f 100644
--- a/mysys/my_init.c
+++ b/mysys/my_init.c
@@ -22,6 +22,9 @@
#include <m_ctype.h>
#include <signal.h>
#include <mysql/psi/mysql_stage.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
#ifdef _WIN32
#ifdef _MSC_VER
#include <locale.h>
@@ -31,10 +34,15 @@
#endif
static void my_win_init(void);
static my_bool win32_init_tcp_ip();
+static void setup_codepages();
#else
#define my_win_init()
#endif
+#if defined(_SC_PAGE_SIZE) && !defined(_SC_PAGESIZE)
+#define _SC_PAGESIZE _SC_PAGE_SIZE
+#endif
+
extern pthread_key(struct st_my_thread_var*, THR_KEY_mysys);
#define SCALE_SEC 100
@@ -42,6 +50,7 @@ extern pthread_key(struct st_my_thread_var*, THR_KEY_mysys);
my_bool my_init_done= 0;
uint mysys_usage_id= 0; /* Incremented for each my_init() */
+size_t my_system_page_size= 8192; /* Default if no sysconf() */
ulonglong my_thread_stack_size= (sizeof(void*) <= 4)? 65536: ((256-16)*1024);
@@ -59,6 +68,69 @@ static ulong atoi_octal(const char *str)
MYSQL_FILE *mysql_stdin= NULL;
static MYSQL_FILE instrumented_stdin;
+#ifdef _WIN32
+static UINT orig_console_cp, orig_console_output_cp;
+
+static void reset_console_cp(void)
+{
+ /*
+ We try not to call SetConsoleCP unnecessarily, to workaround a bug on
+ older Windows 10 (1803), which could switch truetype console fonts to
+ raster, eventhough SetConsoleCP would be a no-op (switch from UTF8 to UTF8).
+ */
+ if (GetConsoleCP() != orig_console_cp)
+ SetConsoleCP(orig_console_cp);
+ if (GetConsoleOutputCP() != orig_console_output_cp)
+ SetConsoleOutputCP(orig_console_output_cp);
+}
+
+/*
+ The below fixes discrepancies in console output and
+ command line parameter encoding. command line is in
+ ANSI codepage, output to console by default is in OEM, but
+ we like them to be in the same encoding.
+
+ We do this only if current codepage is UTF8, i.e when we
+ know we're on Windows that can handle UTF8 well.
+*/
+static void setup_codepages()
+{
+ UINT acp;
+ BOOL is_a_tty= fileno(stdout) >= 0 && isatty(fileno(stdout));
+
+ if (is_a_tty)
+ {
+ /*
+ Save console codepages, in case we change them,
+ to restore them on exit.
+ */
+ orig_console_cp= GetConsoleCP();
+ orig_console_output_cp= GetConsoleOutputCP();
+ if (orig_console_cp && orig_console_output_cp)
+ atexit(reset_console_cp);
+ }
+
+ if ((acp= GetACP()) != CP_UTF8)
+ return;
+
+ /*
+ Use setlocale to make mbstowcs/mkdir/getcwd behave, see
+ https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale
+ */
+ setlocale(LC_ALL, "en_US.UTF8");
+
+ if (is_a_tty && (orig_console_cp != acp || orig_console_output_cp != acp))
+ {
+ /*
+ If ANSI codepage is UTF8, we actually want to switch console
+ to it as well.
+ */
+ SetConsoleCP(acp);
+ SetConsoleOutputCP(acp);
+ }
+}
+#endif
+
/**
Initialize my_sys functions, resources and variables
@@ -79,6 +151,9 @@ my_bool my_init(void)
my_umask= 0660; /* Default umask for new files */
my_umask_dir= 0700; /* Default umask for new directories */
my_global_flags= 0;
+#ifdef _SC_PAGESIZE
+ my_system_page_size= sysconf(_SC_PAGESIZE);
+#endif
/* Default creation of new files */
if ((str= getenv("UMASK")) != 0)
@@ -326,6 +401,17 @@ static void my_win_init(void)
_tzset();
+ /*
+ We do not want text translation (LF->CRLF)
+ when stdout is console/terminal, it is buggy
+ */
+ if (fileno(stdout) >= 0 && isatty(fileno(stdout)))
+ (void)setmode(fileno(stdout), O_BINARY);
+
+ if (fileno(stderr) >= 0 && isatty(fileno(stderr)))
+ (void) setmode(fileno(stderr), O_BINARY);
+
+ setup_codepages();
DBUG_VOID_RETURN;
}
diff --git a/mysys/my_largepage.c b/mysys/my_largepage.c
index c5fc2a1264e..b5193a9cd8e 100644
--- a/mysys/my_largepage.c
+++ b/mysys/my_largepage.c
@@ -251,6 +251,28 @@ int my_init_large_pages(my_bool super_large_pages)
}
+/**
+ Large page size helper.
+ This rounds down, if needed, the size parameter to the largest
+ multiple of an available large page size on the system.
+*/
+void my_large_page_truncate(size_t *size)
+{
+ if (my_use_large_pages)
+ {
+ size_t large_page_size= 0;
+#ifdef _WIN32
+ large_page_size= my_large_page_size;
+#elif defined(HAVE_MMAP)
+ int page_i= 0;
+ large_page_size= my_next_large_page_size(*size, &page_i);
+#endif
+ if (large_page_size > 0)
+ *size-= *size % large_page_size;
+ }
+}
+
+
#if defined(HAVE_MMAP) && !defined(_WIN32)
/* Solaris for example has only MAP_ANON, FreeBSD has MAP_ANONYMOUS and
MAP_ANON but MAP_ANONYMOUS is marked "for compatibility" */
diff --git a/mysys/my_lockmem.c b/mysys/my_lockmem.c
index 732aef1fdac..1b6b68816f8 100644
--- a/mysys/my_lockmem.c
+++ b/mysys/my_lockmem.c
@@ -14,7 +14,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
-/* Alloc a block of locked memory */
+/* Alloc a block of locked memory (memory protected against swap) */
#include "mysys_priv.h"
#include "mysys_err.h"
@@ -35,7 +35,7 @@ LIST *mem_list;
uchar *my_malloc_lock(uint size,myf MyFlags)
{
int success;
- uint pagesize=sysconf(_SC_PAGESIZE);
+ uint pagesize= my_system_page_size;
uchar *ptr;
struct st_mem_list *element;
DBUG_ENTER("my_malloc_lock");
diff --git a/mysys/my_malloc.c b/mysys/my_malloc.c
index c32831ed20d..b8f64de589e 100644
--- a/mysys/my_malloc.c
+++ b/mysys/my_malloc.c
@@ -85,7 +85,7 @@ void *my_malloc(PSI_memory_key key, size_t size, myf my_flags)
/* We have to align size as we store MY_THREAD_SPECIFIC flag in the LSB */
size= ALIGN_SIZE(size);
- if (DBUG_EVALUATE_IF("simulate_out_of_memory", 1, 0))
+ if (DBUG_IF("simulate_out_of_memory"))
mh= NULL;
else
mh= (my_memory_header*) sf_malloc(size + HEADER_SIZE, my_flags);
diff --git a/mysys/my_rdtsc.c b/mysys/my_rdtsc.c
index 1503a5db442..ffd816024e5 100644
--- a/mysys/my_rdtsc.c
+++ b/mysys/my_rdtsc.c
@@ -384,6 +384,8 @@ void my_timer_init(MY_TIMER_INFO *mti)
mti->cycles.routine= MY_TIMER_ROUTINE_ASM_S390;
#elif defined(__GNUC__) && defined (__aarch64__)
mti->cycles.routine= MY_TIMER_ROUTINE_AARCH64;
+#elif defined(__GNUC__) && defined (__riscv)
+ mti->cycles.routine= MY_TIMER_ROUTINE_RISCV;
#elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME)
mti->cycles.routine= MY_TIMER_ROUTINE_GETHRTIME;
#else
diff --git a/mysys/my_uuid.c b/mysys/my_uuid.c
index 72c8fa8507d..7925f80191b 100644
--- a/mysys/my_uuid.c
+++ b/mysys/my_uuid.c
@@ -216,37 +216,6 @@ void my_uuid(uchar *to)
}
-/**
- Convert uuid to string representation
-
- @func my_uuid2str()
- @param guid uuid
- @param s Output buffer.Must be at least MY_UUID_STRING_LENGTH+1 large.
-*/
-void my_uuid2str(const uchar *guid, char *s)
-{
- int i;
- for (i=0; i < MY_UUID_SIZE; i++)
- {
- *s++= _dig_vec_lower[guid[i] >>4];
- *s++= _dig_vec_lower[guid[i] & 15];
- /* Set '-' at intervals 3, 5, 7 and 9 */
- if ((1 << i) & ((1 << 3) | (1 << 5) | (1 << 7) | (1 << 9)))
- *s++= '-';
- }
-}
-
-void my_uuid2str_oracle(const uchar *guid, char *s)
-{
- int i;
- for (i=0; i < MY_UUID_SIZE; i++)
- {
- *s++= _dig_vec_upper[guid[i] >>4];
- *s++= _dig_vec_upper[guid[i] & 15];
- }
-}
-
-
void my_uuid_end()
{
if (my_uuid_inited)
diff --git a/mysys/thr_mutex.c b/mysys/thr_mutex.c
index dd3a5ce132f..aca1c1f7731 100644
--- a/mysys/thr_mutex.c
+++ b/mysys/thr_mutex.c
@@ -332,7 +332,8 @@ int safe_mutex_lock(safe_mutex_t *mp, myf my_flags, const char *file,
*/
pthread_mutex_lock(&THR_LOCK_mutex);
- if (!my_hash_search(mutex_root->locked_mutex, (uchar*) &mp->id, 0))
+ if (!my_hash_search(mutex_root->locked_mutex, (uchar*) &mp->id,
+ sizeof(mp->id)))
{
safe_mutex_deadlock_t *deadlock;
safe_mutex_t *mutex;
@@ -352,7 +353,8 @@ int safe_mutex_lock(safe_mutex_t *mp, myf my_flags, const char *file,
mutex= mutex_root;
do
{
- if (my_hash_search(mp->locked_mutex, (uchar*) &mutex->id, 0))
+ if (my_hash_search(mp->locked_mutex, (uchar*) &mutex->id,
+ sizeof(mutex->id)))
{
print_deadlock_warning(mp, mutex);
/* Mark wrong usage to avoid future warnings for same error */
@@ -772,7 +774,8 @@ static my_bool remove_from_locked_mutex(safe_mutex_t *mp,
delete_mutex->id, mp->id));
found= (safe_mutex_deadlock_t *) my_hash_search(mp->locked_mutex,
- (uchar*) &delete_mutex->id, 0);
+ (uchar*) &delete_mutex->id,
+ sizeof(delete_mutex->id));
DBUG_ASSERT(found);
if (found)
{
diff --git a/mysys/waiting_threads.c b/mysys/waiting_threads.c
index dd60088d534..a03f8da3009 100644
--- a/mysys/waiting_threads.c
+++ b/mysys/waiting_threads.c
@@ -598,7 +598,7 @@ static int deadlock_search(struct deadlock_arg *arg, WT_THD *blocker,
{
WT_RESOURCE *rc, *volatile *shared_ptr= &blocker->waiting_for;
WT_THD *cursor;
- uint i;
+ size_t i;
int ret= WT_OK;
DBUG_ENTER("deadlock_search");
DBUG_PRINT("wt", ("enter: thd=%s, blocker=%s, depth=%u",
diff --git a/plugin/auth_pam/auth_pam.c b/plugin/auth_pam/auth_pam.c
index d232b3b5c65..ffcfa019294 100644
--- a/plugin/auth_pam/auth_pam.c
+++ b/plugin/auth_pam/auth_pam.c
@@ -15,6 +15,7 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */
+#include <my_global.h>
#include <config_auth_pam.h>
#include <unistd.h>
#include <string.h>
@@ -23,7 +24,6 @@
#include <spawn.h>
#include <mysql/plugin_auth.h>
#include "auth_pam_tool.h"
-#include <my_global.h>
#ifndef DBUG_OFF
static char pam_debug = 0;
diff --git a/plugin/cracklib_password_check/cracklib_password_check.c b/plugin/cracklib_password_check/cracklib_password_check.c
index 5a7c7f3f234..1aaf6ba0693 100644
--- a/plugin/cracklib_password_check/cracklib_password_check.c
+++ b/plugin/cracklib_password_check/cracklib_password_check.c
@@ -22,18 +22,21 @@
static char *dictionary;
static int crackme(const MYSQL_CONST_LEX_STRING *username,
- const MYSQL_CONST_LEX_STRING *password)
+ const MYSQL_CONST_LEX_STRING *password,
+ const MYSQL_CONST_LEX_STRING *hostname)
{
char *user= alloca(username->length + 1);
- char *host;
+ char *full_name= alloca(hostname->length + username->length + 2);
const char *res;
memcpy(user, username->str, username->length);
user[username->length]= 0;
- if ((host= strchr(user, '@')))
- *host++= 0;
+ memcpy(full_name, username->str, username->length);
+ full_name[username->length]= '@';
+ memcpy(full_name + username->length + 1, hostname->str, hostname->length);
+ full_name[hostname->length+ username->length + 1]= 0;
- if ((res= FascistCheckUser(password->str, dictionary, user, host)))
+ if ((res= FascistCheckUser(password->str, dictionary, user, full_name)))
{
my_printf_error(ER_NOT_VALID_PASSWORD, "cracklib: %s",
ME_WARNING, res);
diff --git a/plugin/password_reuse_check/CMakeLists.txt b/plugin/password_reuse_check/CMakeLists.txt
new file mode 100644
index 00000000000..6c816071747
--- /dev/null
+++ b/plugin/password_reuse_check/CMakeLists.txt
@@ -0,0 +1,3 @@
+
+MYSQL_ADD_PLUGIN(password_reuse_check password_reuse_check.c
+ RECOMPILE_FOR_EMBEDDED)
diff --git a/plugin/password_reuse_check/password_reuse_check.c b/plugin/password_reuse_check/password_reuse_check.c
new file mode 100644
index 00000000000..8f5973721d8
--- /dev/null
+++ b/plugin/password_reuse_check/password_reuse_check.c
@@ -0,0 +1,262 @@
+/* Copyright (c) 2021, Oleksandr Byelkin and MariaDB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <my_global.h> // for int2store
+#include <stdio.h> // for snprintf
+#include <string.h> // for memset
+#include <mysql/plugin_password_validation.h>
+#include <mysqld_error.h>
+
+#define HISTORY_DB_NAME "password_reuse_check_history"
+
+#define SQL_BUFF_LEN 2048
+
+#define STRING_WITH_LEN(X) (X), ((size_t) (sizeof(X) - 1))
+
+// 0 - unlimited, otherwise number of days to check
+static unsigned interval= 0;
+
+// helping string for bin_to_hex512
+static char digits[]= "0123456789ABCDEF";
+
+/**
+ Store string with length
+
+ @param to buffer where to put the length and string
+ @param from the string to store
+
+ @return reference on the byte after copied string
+*/
+
+static char *store_str(char *to, const MYSQL_CONST_LEX_STRING *from)
+{
+ int2store(to, from->length);
+ memcpy(to + 2, from->str, from->length);
+ return to + 2 + from->length;
+}
+
+
+/**
+ Convert string of 512 bits (64 bytes) to hex representation
+
+ @param to pointer to the result puffer
+ (should be at least 64*2 bytes)
+ @param str pointer to 512 bits (64 bytes string)
+*/
+
+static void bin_to_hex512(char *to, const unsigned char *str)
+{
+ const unsigned char *str_end= str + (512/8);
+ for (; str != str_end; ++str)
+ {
+ *to++= digits[((unsigned char) *str) >> 4];
+ *to++= digits[((unsigned char) *str) & 0x0F];
+ }
+}
+
+
+/**
+ Send SQL error as ER_UNKNOWN_ERROR for information
+
+ @param mysql Connection handler
+*/
+
+static void report_sql_error(MYSQL *mysql)
+{
+ my_printf_error(ER_UNKNOWN_ERROR, "password_reuse_check:[%d] %s", ME_WARNING,
+ mysql_errno(mysql), mysql_error(mysql));
+}
+
+
+/**
+ Create the history of passwords table for this plugin.
+
+ @param mysql Connection handler
+
+ @retval 1 - Error
+ @retval 0 - OK
+*/
+
+static int create_table(MYSQL *mysql)
+{
+ if (mysql_real_query(mysql,
+ // 512/8 = 64
+ STRING_WITH_LEN("CREATE TABLE mysql." HISTORY_DB_NAME
+ " ( hash binary(64),"
+ " time timestamp default current_timestamp,"
+ " primary key (hash), index tm (time) )"
+ " ENGINE=Aria")))
+ {
+ report_sql_error(mysql);
+ return 1;
+ }
+ return 0;
+}
+
+
+/**
+ Run this query and create table if needed
+
+ @param mysql Connection handler
+ @param query The query to run
+ @param len length of the query text
+
+ @retval 1 - Error
+ @retval 0 - OK
+*/
+
+static int run_query_with_table_creation(MYSQL *mysql, const char *query,
+ size_t len)
+{
+ if (mysql_real_query(mysql, query, (unsigned long) len))
+ {
+ unsigned int rc= mysql_errno(mysql);
+ if (rc != ER_NO_SUCH_TABLE)
+ {
+ if (rc != ER_DUP_ENTRY)
+ {
+ report_sql_error(mysql);
+ }
+ else
+ {
+ // warning used to do not change error code
+ my_printf_error(ER_NOT_VALID_PASSWORD,
+ "password_reuse_check: The password was already used",
+ ME_WARNING);
+ }
+ return 1;
+ }
+ if (create_table(mysql))
+ return 1;
+ if (mysql_real_query(mysql, query, (unsigned long) len))
+ {
+ report_sql_error(mysql);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+/**
+ Password validator
+
+ @param username User name (part of whole login name)
+ @param password Password to validate
+ @param hostname Host name (part of whole login name)
+
+ @retval 1 - Password is not OK or an error happened
+ @retval 0 - Password is OK
+*/
+
+static int validate(const MYSQL_CONST_LEX_STRING *username,
+ const MYSQL_CONST_LEX_STRING *password,
+ const MYSQL_CONST_LEX_STRING *hostname)
+{
+ MYSQL *mysql= NULL;
+ size_t key_len= username->length + password->length + hostname->length +
+ (3 * 2 /* space for storing length of the strings */);
+ size_t buff_len= (key_len > SQL_BUFF_LEN ? key_len : SQL_BUFF_LEN);
+ size_t len;
+ char *buff= malloc(buff_len);
+ unsigned char hash[512/8];
+ char escaped_hash[512/8*2 + 1];
+ if (!buff)
+ return 1;
+
+ mysql= mysql_init(NULL);
+ if (!mysql)
+ {
+ free(buff);
+ return 1;
+ }
+
+ /*
+ Store: username, hostname, password
+ (password first to make its rewriting password in memory simplier)
+ */
+ store_str(store_str(store_str(buff, password), username), hostname);
+ buff[key_len]= 0; // safety
+ memset(hash, 0, sizeof(hash));
+ my_sha512(hash, buff, key_len);
+ // safety: rewrite password with zerows
+ memset(buff, 0, password->length);
+ if (mysql_real_connect_local(mysql) == NULL)
+ goto sql_error;
+
+ if (interval)
+ {
+ // trim the table
+ len= snprintf(buff, buff_len,
+ "DELETE FROM mysql." HISTORY_DB_NAME
+ " WHERE time < DATE_SUB(NOW(), interval %d day)",
+ interval);
+ if (run_query_with_table_creation(mysql, buff, len))
+ goto sql_error;
+ }
+
+ bin_to_hex512(escaped_hash, hash);
+ escaped_hash[512/8*2]= '\0';
+ len= snprintf(buff, buff_len,
+ "INSERT INTO mysql." HISTORY_DB_NAME "(hash) "
+ "values (x'%s')",
+ escaped_hash);
+ if (run_query_with_table_creation(mysql, buff, len))
+ goto sql_error;
+
+ free(buff);
+ mysql_close(mysql);
+ return 0; // OK
+
+sql_error:
+ free(buff);
+ if (mysql)
+ mysql_close(mysql);
+ return 1; // Error
+}
+
+static MYSQL_SYSVAR_UINT(interval, interval, PLUGIN_VAR_RQCMDARG,
+ "Password history retention period in days (0 means unlimited)", NULL, NULL,
+ 0, 0, 365*100, 1);
+
+
+static struct st_mysql_sys_var* sysvars[]= {
+ MYSQL_SYSVAR(interval),
+ NULL
+};
+
+static struct st_mariadb_password_validation info=
+{
+ MariaDB_PASSWORD_VALIDATION_INTERFACE_VERSION,
+ validate
+};
+
+maria_declare_plugin(password_reuse_check)
+{
+ MariaDB_PASSWORD_VALIDATION_PLUGIN,
+ &info,
+ "password_reuse_check",
+ "Oleksandr Byelkin",
+ "Prevent password reuse",
+ PLUGIN_LICENSE_GPL,
+ NULL,
+ NULL,
+ 0x0200,
+ NULL,
+ sysvars,
+ "2.0",
+ MariaDB_PLUGIN_MATURITY_STABLE
+}
+maria_declare_plugin_end;
diff --git a/plugin/provider_bzip2/CMakeLists.txt b/plugin/provider_bzip2/CMakeLists.txt
new file mode 100644
index 00000000000..e2ac4592b1b
--- /dev/null
+++ b/plugin/provider_bzip2/CMakeLists.txt
@@ -0,0 +1,15 @@
+FIND_PACKAGE(BZip2)
+
+SET(CPACK_RPM_provider-bzip2_PACKAGE_SUMMARY "BZip2 compression support in the server and storage engines" PARENT_SCOPE)
+SET(CPACK_RPM_provider-bzip2_PACKAGE_DESCRIPTION "BZip2 compression support in the server and storage engines" PARENT_SCOPE)
+
+IF (BZIP2_FOUND)
+ GET_PROPERTY(dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
+ LIST(REMOVE_ITEM dirs ${CMAKE_SOURCE_DIR}/include/providers)
+ SET_PROPERTY(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "${dirs}")
+
+ INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIRS})
+
+ MYSQL_ADD_PLUGIN(provider_bzip2 plugin.c COMPONENT provider-bzip2
+ LINK_LIBRARIES ${BZIP2_LIBRARIES} CONFIG provider_bzip2.cnf)
+ENDIF()
diff --git a/plugin/provider_bzip2/plugin.c b/plugin/provider_bzip2/plugin.c
new file mode 100644
index 00000000000..92978b7e888
--- /dev/null
+++ b/plugin/provider_bzip2/plugin.c
@@ -0,0 +1,61 @@
+/* Copyright (c) 2021, MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <stdbool.h>
+#include <mysql_version.h>
+#include <mysql/plugin.h>
+#include <bzlib.h>
+#include <providers/bzlib.h>
+
+static int init(void* h)
+{
+ provider_service_bzip2->BZ2_bzBuffToBuffCompress_ptr= BZ2_bzBuffToBuffCompress;
+ provider_service_bzip2->BZ2_bzBuffToBuffDecompress_ptr= BZ2_bzBuffToBuffDecompress;
+ provider_service_bzip2->BZ2_bzCompress_ptr= BZ2_bzCompress;
+ provider_service_bzip2->BZ2_bzCompressEnd_ptr= BZ2_bzCompressEnd;
+ provider_service_bzip2->BZ2_bzCompressInit_ptr= BZ2_bzCompressInit;
+ provider_service_bzip2->BZ2_bzDecompress_ptr= BZ2_bzDecompress;
+ provider_service_bzip2->BZ2_bzDecompressEnd_ptr= BZ2_bzDecompressEnd;
+ provider_service_bzip2->BZ2_bzDecompressInit_ptr= BZ2_bzDecompressInit;
+
+ provider_service_bzip2->is_loaded = true;
+
+ return 0;
+}
+
+static int deinit(void *h)
+{
+ return 1; /* don't unload me */
+}
+
+static struct st_mysql_daemon info= { MYSQL_DAEMON_INTERFACE_VERSION };
+
+maria_declare_plugin(provider_bzip2)
+{
+ MYSQL_DAEMON_PLUGIN,
+ &info,
+ "provider_bzip2",
+ "Kartik Soneji",
+ "BZip2 compression provider",
+ PLUGIN_LICENSE_GPL,
+ init,
+ deinit,
+ 0x0100,
+ NULL,
+ NULL,
+ "1.0",
+ MariaDB_PLUGIN_MATURITY_STABLE
+}
+maria_declare_plugin_end;
diff --git a/plugin/provider_bzip2/provider_bzip2.cnf b/plugin/provider_bzip2/provider_bzip2.cnf
new file mode 100644
index 00000000000..9b855e88769
--- /dev/null
+++ b/plugin/provider_bzip2/provider_bzip2.cnf
@@ -0,0 +1,3 @@
+[server]
+plugin_load_add=provider_bzip2
+provider_bzip2=force_plus_permanent
diff --git a/plugin/provider_lz4/CMakeLists.txt b/plugin/provider_lz4/CMakeLists.txt
new file mode 100644
index 00000000000..daad63ac6da
--- /dev/null
+++ b/plugin/provider_lz4/CMakeLists.txt
@@ -0,0 +1,15 @@
+FIND_PACKAGE(LZ4 1.6)
+
+SET(CPACK_RPM_provider-lz4_PACKAGE_SUMMARY "LZ4 compression support in the server and storage engines" PARENT_SCOPE)
+SET(CPACK_RPM_provider-lz4_PACKAGE_DESCRIPTION "LZ4 compression support in the server and storage engines" PARENT_SCOPE)
+
+IF (LZ4_FOUND)
+ GET_PROPERTY(dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
+ LIST(REMOVE_ITEM dirs ${CMAKE_SOURCE_DIR}/include/providers)
+ SET_PROPERTY(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "${dirs}")
+
+ INCLUDE_DIRECTORIES(${LZ4_INCLUDE_DIRS})
+
+ MYSQL_ADD_PLUGIN(provider_lz4 plugin.c COMPONENT provider-lz4
+ LINK_LIBRARIES ${LZ4_LIBRARIES} CONFIG provider_lz4.cnf)
+ENDIF()
diff --git a/plugin/provider_lz4/plugin.c b/plugin/provider_lz4/plugin.c
new file mode 100644
index 00000000000..f9eab163d5a
--- /dev/null
+++ b/plugin/provider_lz4/plugin.c
@@ -0,0 +1,56 @@
+/* Copyright (c) 2021, MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <stdbool.h>
+#include <mysql_version.h>
+#include <mysql/plugin.h>
+#include <lz4.h>
+#include <providers/lz4.h>
+
+static int init(void* h)
+{
+ provider_service_lz4->LZ4_compressBound_ptr= LZ4_compressBound;
+ provider_service_lz4->LZ4_compress_default_ptr= LZ4_compress_default;
+ provider_service_lz4->LZ4_decompress_safe_ptr= LZ4_decompress_safe;
+
+ provider_service_lz4->is_loaded = true;
+
+ return 0;
+}
+
+static int deinit(void *h)
+{
+ return 1; /* don't unload me */
+}
+
+static struct st_mysql_daemon info= { MYSQL_DAEMON_INTERFACE_VERSION };
+
+maria_declare_plugin(provider_lz4)
+{
+ MYSQL_DAEMON_PLUGIN,
+ &info,
+ "provider_lz4",
+ "Kartik Soneji",
+ "LZ4 compression provider",
+ PLUGIN_LICENSE_GPL,
+ init,
+ deinit,
+ 0x0100,
+ NULL,
+ NULL,
+ "1.0",
+ MariaDB_PLUGIN_MATURITY_STABLE
+}
+maria_declare_plugin_end;
diff --git a/plugin/provider_lz4/provider_lz4.cnf b/plugin/provider_lz4/provider_lz4.cnf
new file mode 100644
index 00000000000..0b8a3ec5222
--- /dev/null
+++ b/plugin/provider_lz4/provider_lz4.cnf
@@ -0,0 +1,3 @@
+[server]
+plugin_load_add=provider_lz4
+provider_lz4=force_plus_permanent
diff --git a/plugin/provider_lzma/CMakeLists.txt b/plugin/provider_lzma/CMakeLists.txt
new file mode 100644
index 00000000000..8b0781aaa33
--- /dev/null
+++ b/plugin/provider_lzma/CMakeLists.txt
@@ -0,0 +1,15 @@
+FIND_PACKAGE(LibLZMA)
+
+SET(CPACK_RPM_provider-lzma_PACKAGE_SUMMARY "LZMA compression support in the server and storage engines" PARENT_SCOPE)
+SET(CPACK_RPM_provider-lzma_PACKAGE_DESCRIPTION "LZMA compression support in the server and storage engines" PARENT_SCOPE)
+
+IF (LIBLZMA_FOUND)
+ GET_PROPERTY(dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
+ LIST(REMOVE_ITEM dirs ${CMAKE_SOURCE_DIR}/include/providers)
+ SET_PROPERTY(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "${dirs}")
+
+ INCLUDE_DIRECTORIES(${LIBLZMA_INCLUDE_DIRS})
+
+ MYSQL_ADD_PLUGIN(provider_lzma plugin.c COMPONENT provider-lzma
+ LINK_LIBRARIES ${LIBLZMA_LIBRARIES} CONFIG provider_lzma.cnf)
+ENDIF()
diff --git a/plugin/provider_lzma/plugin.c b/plugin/provider_lzma/plugin.c
new file mode 100644
index 00000000000..0c18471a068
--- /dev/null
+++ b/plugin/provider_lzma/plugin.c
@@ -0,0 +1,55 @@
+/* Copyright (c) 2021, MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <stdbool.h>
+#include <mysql_version.h>
+#include <mysql/plugin.h>
+#include <lzma.h>
+#include <providers/lzma.h>
+
+static int init(void* h)
+{
+ provider_service_lzma->lzma_stream_buffer_decode_ptr= lzma_stream_buffer_decode;
+ provider_service_lzma->lzma_easy_buffer_encode_ptr= lzma_easy_buffer_encode;
+
+ provider_service_lzma->is_loaded = true;
+
+ return 0;
+}
+
+static int deinit(void *h)
+{
+ return 1; /* don't unload me */
+}
+
+static struct st_mysql_daemon info= { MYSQL_DAEMON_INTERFACE_VERSION };
+
+maria_declare_plugin(provider_lzma)
+{
+ MYSQL_DAEMON_PLUGIN,
+ &info,
+ "provider_lzma",
+ "Kartik Soneji",
+ "LZMA compression provider",
+ PLUGIN_LICENSE_GPL,
+ init,
+ deinit,
+ 0x0100,
+ NULL,
+ NULL,
+ "1.0",
+ MariaDB_PLUGIN_MATURITY_STABLE
+}
+maria_declare_plugin_end;
diff --git a/plugin/provider_lzma/provider_lzma.cnf b/plugin/provider_lzma/provider_lzma.cnf
new file mode 100644
index 00000000000..3a05a356f7f
--- /dev/null
+++ b/plugin/provider_lzma/provider_lzma.cnf
@@ -0,0 +1,3 @@
+[server]
+plugin_load_add=provider_lzma
+provider_lzma=force_plus_permanent
diff --git a/plugin/provider_lzo/CMakeLists.txt b/plugin/provider_lzo/CMakeLists.txt
new file mode 100644
index 00000000000..8a8d31d238a
--- /dev/null
+++ b/plugin/provider_lzo/CMakeLists.txt
@@ -0,0 +1,15 @@
+FIND_PACKAGE(LZO)
+
+SET(CPACK_RPM_provider-lzo_PACKAGE_SUMMARY "LZO compression support in the server and storage engines" PARENT_SCOPE)
+SET(CPACK_RPM_provider-lzo_PACKAGE_DESCRIPTION "LZO compression support in the server and storage engines" PARENT_SCOPE)
+
+IF (LZO_FOUND)
+ GET_PROPERTY(dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
+ LIST(REMOVE_ITEM dirs ${CMAKE_SOURCE_DIR}/include/providers)
+ SET_PROPERTY(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "${dirs}")
+
+ INCLUDE_DIRECTORIES(${LZO_INCLUDE_DIRS})
+
+ MYSQL_ADD_PLUGIN(provider_lzo plugin.c COMPONENT provider-lzo
+ LINK_LIBRARIES ${LZO_LIBRARIES} CONFIG provider_lzo.cnf)
+ENDIF()
diff --git a/plugin/provider_lzo/plugin.c b/plugin/provider_lzo/plugin.c
new file mode 100644
index 00000000000..44c6b54111b
--- /dev/null
+++ b/plugin/provider_lzo/plugin.c
@@ -0,0 +1,55 @@
+/* Copyright (c) 2021, MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <stdbool.h>
+#include <mysql_version.h>
+#include <mysql/plugin.h>
+#include <lzo/lzo1x.h>
+#include <providers/lzo/lzo1x.h>
+
+static int init(void* h)
+{
+ provider_service_lzo->lzo1x_1_15_compress_ptr= lzo1x_1_15_compress;
+ provider_service_lzo->lzo1x_decompress_safe_ptr= lzo1x_decompress_safe;
+
+ provider_service_lzo->is_loaded = true;
+
+ return 0;
+}
+
+static int deinit(void *h)
+{
+ return 1; /* don't unload me */
+}
+
+static struct st_mysql_daemon info= { MYSQL_DAEMON_INTERFACE_VERSION };
+
+maria_declare_plugin(provider_lzo)
+{
+ MYSQL_DAEMON_PLUGIN,
+ &info,
+ "provider_lzo",
+ "Kartik Soneji",
+ "LZO compression provider",
+ PLUGIN_LICENSE_GPL,
+ init,
+ deinit,
+ 0x0100,
+ NULL,
+ NULL,
+ "1.0",
+ MariaDB_PLUGIN_MATURITY_STABLE
+}
+maria_declare_plugin_end;
diff --git a/plugin/provider_lzo/provider_lzo.cnf b/plugin/provider_lzo/provider_lzo.cnf
new file mode 100644
index 00000000000..65801983dd6
--- /dev/null
+++ b/plugin/provider_lzo/provider_lzo.cnf
@@ -0,0 +1,3 @@
+[server]
+plugin_load_add=provider_lzo
+provider_lzo=force_plus_permanent
diff --git a/plugin/provider_snappy/CMakeLists.txt b/plugin/provider_snappy/CMakeLists.txt
new file mode 100644
index 00000000000..d963029d75c
--- /dev/null
+++ b/plugin/provider_snappy/CMakeLists.txt
@@ -0,0 +1,15 @@
+FIND_PACKAGE(Snappy)
+
+SET(CPACK_RPM_provider-snappy_PACKAGE_SUMMARY "Snappy compression support in the server and storage engines" PARENT_SCOPE)
+SET(CPACK_RPM_provider-snappy_PACKAGE_DESCRIPTION "Snappy compression support in the server and storage engines" PARENT_SCOPE)
+
+IF (SNAPPY_FOUND)
+ GET_PROPERTY(dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
+ LIST(REMOVE_ITEM dirs ${CMAKE_SOURCE_DIR}/include/providers)
+ SET_PROPERTY(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "${dirs}")
+
+ INCLUDE_DIRECTORIES(${SNAPPY_INCLUDE_DIRS})
+
+ MYSQL_ADD_PLUGIN(provider_snappy plugin.c COMPONENT provider-snappy
+ LINK_LIBRARIES ${SNAPPY_LIBRARIES} CONFIG provider_snappy.cnf)
+ENDIF()
diff --git a/plugin/provider_snappy/plugin.c b/plugin/provider_snappy/plugin.c
new file mode 100644
index 00000000000..8af7eb1b0ea
--- /dev/null
+++ b/plugin/provider_snappy/plugin.c
@@ -0,0 +1,58 @@
+/* Copyright (c) 2021, MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <stdbool.h>
+#include <mysql_version.h>
+#include <mysql/plugin.h>
+#include <snappy-c.h>
+#define SNAPPY_C
+#include <providers/snappy-c.h>
+
+static int init(void* h)
+{
+ provider_service_snappy->snappy_max_compressed_length_ptr= snappy_max_compressed_length;
+ provider_service_snappy->snappy_compress_ptr= snappy_compress;
+ provider_service_snappy->snappy_uncompressed_length_ptr= snappy_uncompressed_length;
+ provider_service_snappy->snappy_uncompress_ptr= snappy_uncompress;
+
+ provider_service_snappy->is_loaded = true;
+
+ return 0;
+}
+
+static int deinit(void *h)
+{
+ return 1; /* don't unload me */
+}
+
+static struct st_mysql_daemon info= { MYSQL_DAEMON_INTERFACE_VERSION };
+
+maria_declare_plugin(provider_snappy)
+{
+ MYSQL_DAEMON_PLUGIN,
+ &info,
+ "provider_snappy",
+ "Kartik Soneji",
+ "SNAPPY compression provider",
+ PLUGIN_LICENSE_GPL,
+ init,
+ deinit,
+ 0x0100,
+ NULL,
+ NULL,
+ "1.0",
+ MariaDB_PLUGIN_MATURITY_STABLE
+}
+maria_declare_plugin_end;
diff --git a/plugin/provider_snappy/provider_snappy.cnf b/plugin/provider_snappy/provider_snappy.cnf
new file mode 100644
index 00000000000..da78207c3e6
--- /dev/null
+++ b/plugin/provider_snappy/provider_snappy.cnf
@@ -0,0 +1,3 @@
+[server]
+plugin_load_add=provider_snappy
+provider_snappy=force_plus_permanent
diff --git a/plugin/server_audit/server_audit.c b/plugin/server_audit/server_audit.c
index 52af6206cb2..3c94df243d0 100644
--- a/plugin/server_audit/server_audit.c
+++ b/plugin/server_audit/server_audit.c
@@ -1153,7 +1153,6 @@ static void setup_connection_simple(struct connection_info *ci)
#define MAX_HOSTNAME (HOSTNAME_LENGTH + 1) /* len+1 in mysql.user */
-#define USERNAME_LENGTH 384
static void setup_connection_connect(MYSQL_THD thd,struct connection_info *cn,
const struct mysql_event_connection *event)
diff --git a/plugin/simple_password_check/simple_password_check.c b/plugin/simple_password_check/simple_password_check.c
index 1762690f2c5..929906c6afe 100644
--- a/plugin/simple_password_check/simple_password_check.c
+++ b/plugin/simple_password_check/simple_password_check.c
@@ -23,7 +23,9 @@
static unsigned min_length, min_digits, min_letters, min_others;
static int validate(const MYSQL_CONST_LEX_STRING *username,
- const MYSQL_CONST_LEX_STRING *password)
+ const MYSQL_CONST_LEX_STRING *password,
+ const MYSQL_CONST_LEX_STRING *hostname
+ __attribute__((unused)))
{
unsigned digits=0 , uppers=0 , lowers=0, others=0, length= (unsigned)password->length;
const char *ptr= password->str, *end= ptr + length;
diff --git a/plugin/test_sql_service/CMakeLists.txt b/plugin/test_sql_service/CMakeLists.txt
index aa9ecfe685e..615508bdc4e 100644
--- a/plugin/test_sql_service/CMakeLists.txt
+++ b/plugin/test_sql_service/CMakeLists.txt
@@ -15,4 +15,4 @@
SET(SOURCES test_sql_service.c)
-MYSQL_ADD_PLUGIN(test_sql_service ${SOURCES} MODULE_ONLY RECOMPILE_FOR_EMBEDDED)
+MYSQL_ADD_PLUGIN(test_sql_service ${SOURCES} MODULE_ONLY)
diff --git a/plugin/test_sql_service/test_sql_service.c b/plugin/test_sql_service/test_sql_service.c
index 062f10fce58..8b326c6fa46 100644
--- a/plugin/test_sql_service/test_sql_service.c
+++ b/plugin/test_sql_service/test_sql_service.c
@@ -14,71 +14,108 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-#define PLUGIN_VERSION 0x100
-#define PLUGIN_STR_VERSION "1.0.0"
-
-#define _my_thread_var loc_thread_var
-
-#include <my_config.h>
-#include <assert.h>
-#include <my_global.h>
-#include <my_base.h>
-#include <typelib.h>
-//#include <mysql_com.h> /* for enum enum_server_command */
-#include <mysql/plugin.h>
-#include <mysql/plugin_audit.h>
-//#include <string.h>
-
+#define PLUGIN_VERSION 0x200
-LEX_STRING * thd_query_string (MYSQL_THD thd);
-unsigned long long thd_query_id(const MYSQL_THD thd);
-size_t thd_query_safe(MYSQL_THD thd, char *buf, size_t buflen);
-const char *thd_user_name(MYSQL_THD thd);
-const char *thd_client_host(MYSQL_THD thd);
-const char *thd_client_ip(MYSQL_THD thd);
-LEX_CSTRING *thd_current_db(MYSQL_THD thd);
-int thd_current_status(MYSQL_THD thd);
-enum enum_server_command thd_current_command(MYSQL_THD thd);
-
-int maria_compare_hostname(const char *wild_host, long wild_ip, long ip_mask,
- const char *host, const char *ip);
-void maria_update_hostname(const char **wild_host, long *wild_ip, long *ip_mask,
- const char *host);
+#include <mysql/plugin_audit.h>
+#define STRING_WITH_LEN(X) (X), ((size_t) (sizeof(X) - 1))
/* Status variables for SHOW STATUS */
static long test_passed= 0;
+static char *sql_text_local, *sql_text_global;
+static char qwe_res[1024]= "";
+
static struct st_mysql_show_var test_sql_status[]=
{
{"test_sql_service_passed", (char *)&test_passed, SHOW_LONG},
+ {"test_sql_query_result", qwe_res, SHOW_CHAR},
{0,0,0}
};
-static my_bool do_test= TRUE;
-static void run_test(MYSQL_THD thd, struct st_mysql_sys_var *var,
- void *var_ptr, const void *save);
-static MYSQL_SYSVAR_BOOL(run_test, do_test, PLUGIN_VAR_OPCMDARG,
- "Perform the test now.", NULL, run_test, FALSE);
+static my_bool do_test= 1;
+static int run_test(MYSQL_THD thd, struct st_mysql_sys_var *var, void *save,
+ struct st_mysql_value *value);
+static int run_sql_local(MYSQL_THD thd, struct st_mysql_sys_var *var, void *save,
+ struct st_mysql_value *value);
+static int run_sql_global(MYSQL_THD thd, struct st_mysql_sys_var *var, void *save,
+ struct st_mysql_value *value);
+
+static void noop_update(MYSQL_THD thd, struct st_mysql_sys_var *var,
+ void *var_ptr, const void *save);
+
+static MYSQL_SYSVAR_BOOL(run_test, do_test,
+ PLUGIN_VAR_OPCMDARG,
+ "Perform the test now.",
+ run_test, NULL, 0);
+
+static MYSQL_SYSVAR_STR(execute_sql_local, sql_text_local,
+ PLUGIN_VAR_OPCMDARG,
+ "Create the new local connection, execute SQL statement with it.",
+ run_sql_local, noop_update, 0);
+
+static MYSQL_SYSVAR_STR(execute_sql_global, sql_text_global,
+ PLUGIN_VAR_OPCMDARG,
+ "Execute SQL statement using the global connection.",
+ run_sql_global, noop_update, 0);
+
static struct st_mysql_sys_var* test_sql_vars[]=
{
MYSQL_SYSVAR(run_test),
+ MYSQL_SYSVAR(execute_sql_local),
+ MYSQL_SYSVAR(execute_sql_global),
NULL
};
+static MYSQL *global_mysql;
+
+
+static int run_queries(MYSQL *mysql)
+{
+ MYSQL_RES *res;
+
+ if (mysql_real_query(mysql,
+ STRING_WITH_LEN("CREATE TABLE test.ts_table"
+ " ( hash varbinary(512),"
+ " time timestamp default current_time,"
+ " primary key (hash), index tm (time) )")))
+ return 1;
-extern int execute_sql_command(const char *command,
- char *hosts, char *names, char *filters);
+ if (mysql_real_query(mysql,
+ STRING_WITH_LEN("INSERT INTO test.ts_table VALUES('1234567890', NULL)")))
+ return 1;
+ if (mysql_real_query(mysql, STRING_WITH_LEN("select * from test.ts_table")))
+ return 1;
+
+ if (!(res= mysql_store_result(mysql)))
+ return 1;
+
+ mysql_free_result(res);
+
+ if (mysql_real_query(mysql, STRING_WITH_LEN("DROP TABLE test.ts_table")))
+ return 1;
+
+ return 0;
+}
static int do_tests()
{
- char plugins[1024];
- char names[1024];
- char dl[2048];
- int result;
+ MYSQL *mysql;
+ int result= 1;
+
+ mysql= mysql_init(NULL);
+ if (mysql_real_connect_local(mysql) == NULL)
+ return 1;
- result= execute_sql_command("select 'plugin', name, dl from mysql.plugin",
- plugins, names, dl);
+ if (run_queries(mysql))
+ goto exit;
+
+ if (run_queries(global_mysql))
+ goto exit;
+
+ result= 0;
+exit:
+ mysql_close(mysql);
return result;
}
@@ -89,29 +126,118 @@ void auditing(MYSQL_THD thd, unsigned int event_class, const void *ev)
}
-static void run_test(MYSQL_THD thd __attribute__((unused)),
- struct st_mysql_sys_var *var __attribute__((unused)),
- void *var_ptr __attribute__((unused)),
- const void *save __attribute__((unused)))
+static int run_test(MYSQL_THD thd, struct st_mysql_sys_var *var, void *save,
+ struct st_mysql_value *value)
+{
+ *(my_bool*) save= 0; /* Set value for sql_service_run_test */
+ return (test_passed= (do_tests() == 0)) == 0;
+}
+
+
+static int run_sql(MYSQL *mysql, void *save, struct st_mysql_value *value)
+{
+ const char *str;
+ int len= 0;
+ MYSQL_RES *res;
+
+ str= value->val_str(value, NULL, &len);
+
+ if (mysql_real_query(mysql, str, len))
+ {
+ if (mysql_error(mysql)[0])
+ {
+ my_snprintf(qwe_res, sizeof(qwe_res), "Error %d returned. %s",
+ mysql_errno(mysql), mysql_error(mysql));
+ return 0;
+ }
+
+ return 1;
+ }
+
+ if ((res= mysql_store_result(mysql)))
+ {
+ my_snprintf(qwe_res, sizeof(qwe_res), "Query returned %lld rows.",
+ mysql_num_rows(res));
+ mysql_free_result(res);
+ }
+ else
+ {
+ if (mysql_error(mysql)[0])
+ {
+ my_snprintf(qwe_res, sizeof(qwe_res), "Error %d returned. %s",
+ mysql_errno(mysql), mysql_error(mysql));
+ }
+ else
+ my_snprintf(qwe_res, sizeof(qwe_res), "Query affected %lld rows.",
+ mysql_affected_rows(mysql));
+ }
+
+ return 0;
+}
+
+
+static void noop_update(MYSQL_THD thd, struct st_mysql_sys_var *var,
+ void *var_ptr, const void *save)
+{
+ sql_text_local= sql_text_global= qwe_res;
+}
+
+static int run_sql_local(MYSQL_THD thd, struct st_mysql_sys_var *var, void *save,
+ struct st_mysql_value *value)
+{
+ MYSQL *mysql;
+ int result= 1;
+
+ mysql= mysql_init(NULL);
+ if (mysql_real_connect_local(mysql) == NULL)
+ return 1;
+
+ if (run_sql(mysql, save, value))
+ goto exit;
+
+ result= 0;
+
+exit:
+ mysql_close(mysql);
+
+ return result;
+}
+
+
+static int run_sql_global(MYSQL_THD thd, struct st_mysql_sys_var *var, void *save,
+ struct st_mysql_value *value)
{
- test_passed= do_tests();
+ return run_sql(global_mysql, save, value);
}
static int init_done= 0;
-static int test_sql_service_plugin_init(void *p __attribute__((unused)))
+static int test_sql_service_plugin_init(void *p)
{
+ (void) p;
+ global_mysql= mysql_init(NULL);
+
+ if (!global_mysql ||
+ mysql_real_connect_local(global_mysql) == NULL)
+ return 1;
+
init_done= 1;
+
+ test_passed= (do_tests() == 0);
+
return 0;
}
-static int test_sql_service_plugin_deinit(void *p __attribute__((unused)))
+static int test_sql_service_plugin_deinit(void *p)
{
+ (void) p;
if (!init_done)
return 0;
+ mysql_close(global_mysql);
+
return 0;
}
@@ -138,8 +264,8 @@ maria_declare_plugin(test_sql_service)
PLUGIN_VERSION,
test_sql_status,
test_sql_vars,
- PLUGIN_STR_VERSION,
- MariaDB_PLUGIN_MATURITY_STABLE
+ NULL,
+ MariaDB_PLUGIN_MATURITY_EXPERIMENTAL
}
maria_declare_plugin_end;
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.result b/plugin/type_inet/mysql-test/type_inet/type_inet6.result
index 79958ee77f4..838a7ee49d3 100644
--- a/plugin/type_inet/mysql-test/type_inet/type_inet6.result
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.result
@@ -192,9 +192,9 @@ CREATE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('x');
ERROR 22007: Incorrect inet6 value: 'x' for column `test`.`t1`.`a` at row 1
INSERT INTO t1 VALUES (1);
-ERROR 22007: Incorrect inet6 value: '1' for column `test`.`t1`.`a` at row 1
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t1`.`a`
INSERT INTO t1 VALUES (TIME'10:20:30');
-ERROR 22007: Incorrect inet6 value: '10:20:30' for column `test`.`t1`.`a` at row 1
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t1`.`a`
INSERT INTO t1 VALUES (0x00);
ERROR 22007: Incorrect inet6 value: '\x00' for column `test`.`t1`.`a` at row 1
DROP TABLE t1;
@@ -820,15 +820,15 @@ DROP TABLE t1;
#
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (CAST('::' AS INET6));
-ERROR 22007: Incorrect integer value: '::' for column `test`.`t1`.`a` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t1`.`a`
DROP TABLE t1;
CREATE TABLE t1 (a DOUBLE);
INSERT INTO t1 VALUES (CAST('::' AS INET6));
-ERROR 22007: Incorrect double value: '::' for column `test`.`t1`.`a` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t1`.`a`
DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(32,0));
INSERT INTO t1 VALUES (CAST('::' AS INET6));
-ERROR 22007: Incorrect decimal value: '::' for column `test`.`t1`.`a` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t1`.`a`
DROP TABLE t1;
CREATE TABLE t1 (a VARCHAR(64));
INSERT INTO t1 VALUES (CAST('::' AS INET6));
@@ -1606,7 +1606,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b INT);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect integer value: 'ffff::ffff' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1614,7 +1614,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b DOUBLE);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect double value: 'ffff::ffff' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1622,7 +1622,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b DECIMAL(32,0));
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect decimal value: 'ffff::ffff' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1630,7 +1630,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b YEAR);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect integer value: 'ffff::ffff' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'year' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1641,7 +1641,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INT, b INET6);
INSERT INTO t1 VALUES (1, NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect inet6 value: '1' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1649,7 +1649,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a DOUBLE, b INET6);
INSERT INTO t1 VALUES (1, NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect inet6 value: '1' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1657,7 +1657,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(32,0), b INET6);
INSERT INTO t1 VALUES (1, NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect inet6 value: '1' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1665,7 +1665,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a YEAR, b INET6);
INSERT INTO t1 VALUES (1, NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect inet6 value: '2001' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'year' as 'inet6' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1676,7 +1676,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b TIME);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect time value: 'ffff::ffff' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1684,7 +1684,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b DATE);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect date value: 'ffff::ffff' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'date' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1692,7 +1692,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b DATETIME);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect datetime value: 'ffff::ffff' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'datetime' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1700,7 +1700,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b TIMESTAMP NULL DEFAULT NULL);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect datetime value: 'ffff::ffff' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'timestamp' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1711,7 +1711,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a TIME, b INET6);
INSERT INTO t1 VALUES ('00:00:00', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect inet6 value: '00:00:00' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1719,7 +1719,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a DATE, b INET6);
INSERT INTO t1 VALUES ('2001-01:01', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect inet6 value: '2001-01-01' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'date' as 'inet6' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1727,7 +1727,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a DATETIME, b INET6);
INSERT INTO t1 VALUES ('2001-01-01 10:20:30', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect inet6 value: '2001-01-01 10:20:30' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'datetime' as 'inet6' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1735,7 +1735,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a TIMESTAMP, b INET6);
INSERT INTO t1 VALUES ('2001-01-01 10:20:30', NULL);
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect inet6 value: '2001-01-01 10:20:30' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'timestamp' as 'inet6' in assignment of `test`.`t1`.`b`
SELECT b FROM t1;
b
NULL
@@ -1922,7 +1922,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b INT);
INSERT INTO t1 (a) VALUES ('::');
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect integer value: '::' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t1`.`b`
SELECT * FROM t1;
a b
:: NULL
@@ -1931,7 +1931,7 @@ SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30');
CREATE TABLE t1 (a INET6, b TIMESTAMP);
INSERT INTO t1 (a) VALUES ('::');
UPDATE t1 SET b=a;
-ERROR 22007: Incorrect datetime value: '::' for column `test`.`t1`.`b` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'timestamp' in assignment of `test`.`t1`.`b`
SELECT * FROM t1;
a b
:: 2001-01-01 10:20:30
@@ -1940,7 +1940,7 @@ SET timestamp=DEFAULT;
CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 (a) VALUES ('::');
ALTER TABLE t1 MODIFY a DATE;
-ERROR 22007: Incorrect date value: '::' for column `test`.`t1`.`a` at row 1
+ERROR HY000: Cannot cast 'inet6' as 'date' in assignment of `test`.`t1`.`a`
DROP TABLE t1;
#
# MDEV-20818 ER_CRASHED_ON_USAGE or Assertion `length <= column->length' failed in write_block_record on temporary table
@@ -2257,3 +2257,40 @@ a m
::10 1
DROP VIEW v1;
DROP TABLE t1, t2;
+#
+# MDEV-22256 Assertion `length == pack_length()' failed in Field_timestamp_with_dec::sort_string
+#
+SET sql_mode='';
+SET @@SESSION.max_sort_length=4;
+Warnings:
+Warning 1292 Truncated incorrect max_sort_length value: '4'
+CREATE TEMPORARY TABLE t1(c INET6,d DATE);
+INSERT INTO t1 VALUES(0,0);
+Warnings:
+Warning 4078 Cannot cast 'int' as 'inet6' in assignment of `test`.`t1`.`c`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t1`.`c` at row 1
+INSERT INTO t1 VALUES('::',0);
+SELECT c FROM t1 ORDER BY c;
+c
+::
+::
+DROP TABLE t1;
+SET max_sort_length=DEFAULT;
+SET sql_mode=DEFAULT;
+CREATE TABLE t1 (a INET6);
+INSERT INTO t1 VALUES ('::'),('f::f');
+SET SESSION max_sort_length= 8;
+Warnings:
+Warning 1292 Truncated incorrect max_sort_length value: '8'
+SELECT CASE 1 WHEN 0 THEN 'foo' ELSE a END AS f FROM t1 GROUP BY f WITH ROLLUP;
+f
+::
+f::f
+NULL
+SELECT CASE 1 WHEN 0 THEN 'foo' ELSE a END AS f FROM t1 GROUP BY f;
+f
+::
+f::f
+DROP TABLE t1;
+SET max_sort_length=DEFAULT;
+# End of 10.8 tests
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.test b/plugin/type_inet/mysql-test/type_inet/type_inet6.test
index 2cdbc0eb2b9..857a08e7cd1 100644
--- a/plugin/type_inet/mysql-test/type_inet/type_inet6.test
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.test
@@ -1,4 +1,3 @@
-
--echo #
--echo # Basic CREATE functionality, defaults, metadata
--echo #
@@ -48,9 +47,9 @@ CREATE TABLE t1 (c1 INET6 DEFAULT '');
CREATE TABLE t1 (a INET6);
--error ER_TRUNCATED_WRONG_VALUE
INSERT INTO t1 VALUES ('x');
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
INSERT INTO t1 VALUES (1);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
INSERT INTO t1 VALUES (TIME'10:20:30');
--error ER_TRUNCATED_WRONG_VALUE
INSERT INTO t1 VALUES (0x00);
@@ -447,17 +446,17 @@ DROP TABLE t1;
--echo #
CREATE TABLE t1 (a INT);
---error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
INSERT INTO t1 VALUES (CAST('::' AS INET6));
DROP TABLE t1;
CREATE TABLE t1 (a DOUBLE);
---error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
INSERT INTO t1 VALUES (CAST('::' AS INET6));
DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(32,0));
---error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
INSERT INTO t1 VALUES (CAST('::' AS INET6));
DROP TABLE t1;
@@ -1095,28 +1094,28 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b INT);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
---error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a INET6, b DOUBLE);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
---error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a INET6, b DECIMAL(32,0));
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
---error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a INET6, b YEAR);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
---error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
@@ -1128,28 +1127,28 @@ DROP TABLE t1;
CREATE TABLE t1 (a INT, b INET6);
INSERT INTO t1 VALUES (1, NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a DOUBLE, b INET6);
INSERT INTO t1 VALUES (1, NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a DECIMAL(32,0), b INET6);
INSERT INTO t1 VALUES (1, NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a YEAR, b INET6);
INSERT INTO t1 VALUES (1, NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
@@ -1161,28 +1160,28 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b TIME);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a INET6, b DATE);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a INET6, b DATETIME);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a INET6, b TIMESTAMP NULL DEFAULT NULL);
INSERT INTO t1 VALUES ('ffff::ffff', NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
@@ -1194,28 +1193,28 @@ DROP TABLE t1;
CREATE TABLE t1 (a TIME, b INET6);
INSERT INTO t1 VALUES ('00:00:00', NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a DATE, b INET6);
INSERT INTO t1 VALUES ('2001-01:01', NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a DATETIME, b INET6);
INSERT INTO t1 VALUES ('2001-01-01 10:20:30', NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (a TIMESTAMP, b INET6);
INSERT INTO t1 VALUES ('2001-01-01 10:20:30', NULL);
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT b FROM t1;
DROP TABLE t1;
@@ -1406,7 +1405,7 @@ DROP TABLE t1;
CREATE TABLE t1 (a INET6, b INT);
INSERT INTO t1 (a) VALUES ('::');
---error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT * FROM t1;
DROP TABLE t1;
@@ -1414,7 +1413,7 @@ DROP TABLE t1;
SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30');
CREATE TABLE t1 (a INET6, b TIMESTAMP);
INSERT INTO t1 (a) VALUES ('::');
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
UPDATE t1 SET b=a;
SELECT * FROM t1;
DROP TABLE t1;
@@ -1422,7 +1421,7 @@ SET timestamp=DEFAULT;
CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 (a) VALUES ('::');
---error ER_TRUNCATED_WRONG_VALUE
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
ALTER TABLE t1 MODIFY a DATE;
DROP TABLE t1;
@@ -1656,3 +1655,27 @@ SELECT * FROM v1 ORDER BY a;
SELECT * FROM t2 ORDER BY a;
DROP VIEW v1;
DROP TABLE t1, t2;
+
+--echo #
+--echo # MDEV-22256 Assertion `length == pack_length()' failed in Field_timestamp_with_dec::sort_string
+--echo #
+
+SET sql_mode='';
+SET @@SESSION.max_sort_length=4;
+CREATE TEMPORARY TABLE t1(c INET6,d DATE);
+INSERT INTO t1 VALUES(0,0);
+INSERT INTO t1 VALUES('::',0);
+SELECT c FROM t1 ORDER BY c;
+DROP TABLE t1;
+SET max_sort_length=DEFAULT;
+SET sql_mode=DEFAULT;
+
+CREATE TABLE t1 (a INET6);
+INSERT INTO t1 VALUES ('::'),('f::f');
+SET SESSION max_sort_length= 8;
+SELECT CASE 1 WHEN 0 THEN 'foo' ELSE a END AS f FROM t1 GROUP BY f WITH ROLLUP;
+SELECT CASE 1 WHEN 0 THEN 'foo' ELSE a END AS f FROM t1 GROUP BY f;
+DROP TABLE t1;
+SET max_sort_length=DEFAULT;
+
+--echo # End of 10.8 tests
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_decimal.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_decimal.result
new file mode 100644
index 00000000000..2f715767686
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_decimal.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source DECIMAL(38,0) DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` inet6 DEFAULT '::',
+ `source` decimal(38,0) DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+2 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target decimal(38,0)
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src decimal(38,0) DEFAULT NULL;
+DECLARE dst inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a inet6) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a inet6) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst inet6)
+BEGIN
+DECLARE src decimal(38,0) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'decimal' as 'inet6' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS inet6
+BEGIN
+DECLARE rc decimal(38,0) DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src decimal(38,0) DEFAULT NULL;
+DECLARE cur1 CURSOR(t inet6) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target DECIMAL(38,0) DEFAULT 0, source INET6 DEFAULT '::0');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` decimal(38,0) DEFAULT 0,
+ `source` inet6 DEFAULT '::',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1366 Incorrect decimal value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+2 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect decimal value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target inet6
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'decimal' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE dst decimal(38,0) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a decimal(38,0)) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a decimal(38,0)) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst decimal(38,0))
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst decimal(38,0) DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'inet6' as 'decimal' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS decimal(38,0)
+BEGIN
+DECLARE rc inet6 DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE cur1 CURSOR(t decimal(38,0)) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst decimal(38,0) DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'decimal' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_decimal.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_decimal.test
new file mode 100644
index 00000000000..9696d313790
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_decimal.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source DECIMAL(38,0) DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target DECIMAL(38,0) DEFAULT 0, source INET6 DEFAULT '::0');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double.result
new file mode 100644
index 00000000000..5a4d9021dff
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source DOUBLE DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` inet6 DEFAULT '::',
+ `source` double DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+2 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target double
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src double DEFAULT NULL;
+DECLARE dst inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a inet6) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a inet6) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst inet6)
+BEGIN
+DECLARE src double DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'double' as 'inet6' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS inet6
+BEGIN
+DECLARE rc double DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src double DEFAULT NULL;
+DECLARE cur1 CURSOR(t inet6) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target DOUBLE DEFAULT 0, source INET6 DEFAULT '::0');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` double DEFAULT 0,
+ `source` inet6 DEFAULT '::',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+2 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect double value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target inet6
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE dst double DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a double) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a double) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst double)
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst double DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'inet6' as 'double' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS double
+BEGIN
+DECLARE rc inet6 DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE cur1 CURSOR(t double) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst double DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double.test
new file mode 100644
index 00000000000..8fc0e24d177
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source DOUBLE DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target DOUBLE DEFAULT 0, source INET6 DEFAULT '::0');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_loose.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_loose.result
new file mode 100644
index 00000000000..261afd7ba32
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_loose.result
@@ -0,0 +1,406 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+SET sql_mode='';
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source DOUBLE DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` inet6 DEFAULT '::',
+ `source` double DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+2 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+UPDATE t3 SET target=source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column ``.`(temporary)`.`target` at row 1
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target double
+EXECUTE IMMEDIATE @alter;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src double DEFAULT NULL;
+DECLARE dst inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a inet6) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+f1((SELECT source FROM t1 ORDER BY source LIMIT 1))
+NULL
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a inet6) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst inet6)
+BEGIN
+DECLARE src double DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS inet6
+BEGIN
+DECLARE rc double DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+f1()
+NULL
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src double DEFAULT NULL;
+DECLARE cur1 CURSOR(t inet6) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `dst`
+Warning 1292 Incorrect inet6 value: '0' for column ``.``.`dst` at row 1
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target DOUBLE DEFAULT 0, source INET6 DEFAULT '::0');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` double DEFAULT 0,
+ `source` inet6 DEFAULT '::',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+2 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect double value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+UPDATE t3 SET target=source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column ``.`(temporary)`.`target` at row 1
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target inet6
+EXECUTE IMMEDIATE @alter;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE dst double DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a double) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+f1((SELECT source FROM t1 ORDER BY source LIMIT 1))
+NULL
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a double) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst double)
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst double DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `dst`
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS double
+BEGIN
+DECLARE rc inet6 DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+f1()
+NULL
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE cur1 CURSOR(t double) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst double DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `dst`
+Warning 1366 Incorrect double value: '::' for column ``.``.`dst` at row 1
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_loose.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_loose.test
new file mode 100644
index 00000000000..2721d9c5643
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_loose.test
@@ -0,0 +1,21 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+SET sql_mode='';
+
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source DOUBLE DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target DOUBLE DEFAULT 0, source INET6 DEFAULT '::0');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_strict_ignore.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_strict_ignore.result
new file mode 100644
index 00000000000..bd870d14505
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_strict_ignore.result
@@ -0,0 +1,400 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+SET @ignore='IGNORE';
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source DOUBLE DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` inet6 DEFAULT '::',
+ `source` double DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT IGNORE INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT IGNORE INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+2 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT IGNORE INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+2 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT IGNORE INTO t3 SELECT id,source,source FROM t2;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+INSERT IGNORE INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+Warning 1062 Duplicate entry '1' for key 'PRIMARY'
+INSERT IGNORE INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+INSERT IGNORE INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+INSERT IGNORE INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+INSERT IGNORE INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+UPDATE IGNORE t3 SET target=source;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+UPDATE IGNORE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column ``.`(temporary)`.`target` at row 1
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER IGNORE TABLE t3 MODIFY target double
+EXECUTE IMMEDIATE @alter;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src double DEFAULT NULL;
+DECLARE dst inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a inet6) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a inet6) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst inet6)
+BEGIN
+DECLARE src double DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'double' as 'inet6' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS inet6
+BEGIN
+DECLARE rc double DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src double DEFAULT NULL;
+DECLARE cur1 CURSOR(t inet6) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'double' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target DOUBLE DEFAULT 0, source INET6 DEFAULT '::0');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` double DEFAULT 0,
+ `source` inet6 DEFAULT '::',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT IGNORE INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT IGNORE INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+2 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT IGNORE INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+2 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT IGNORE INTO t3 SELECT id,source,source FROM t2;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+INSERT IGNORE INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+Warning 1062 Duplicate entry '1' for key 'PRIMARY'
+INSERT IGNORE INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+INSERT IGNORE INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+INSERT IGNORE INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+INSERT IGNORE INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+UPDATE IGNORE t3 SET target=source;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column `test`.`t3`.`target` at row 1
+UPDATE IGNORE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+Warnings:
+Warning 4078 Cannot cast 'inet6' as 'double' in assignment of `test`.`t3`.`target`
+Warning 1366 Incorrect double value: '::' for column ``.`(temporary)`.`target` at row 1
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER IGNORE TABLE t3 MODIFY target inet6
+EXECUTE IMMEDIATE @alter;
+Warnings:
+Warning 4078 Cannot cast 'double' as 'inet6' in assignment of `test`.`t3`.`target`
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 1
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE dst double DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a double) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a double) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst double)
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst double DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'inet6' as 'double' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS double
+BEGIN
+DECLARE rc inet6 DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE cur1 CURSOR(t double) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst double DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'double' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_strict_ignore.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_strict_ignore.test
new file mode 100644
index 00000000000..ebb41854df2
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_double_strict_ignore.test
@@ -0,0 +1,21 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+SET @ignore='IGNORE';
+
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source DOUBLE DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target DOUBLE DEFAULT 0, source INET6 DEFAULT '::0');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_int.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_int.result
new file mode 100644
index 00000000000..f8f818f3ce3
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_int.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source INT DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` inet6 DEFAULT '::',
+ `source` int(11) DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+2 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target int(11)
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(11) DEFAULT NULL;
+DECLARE dst inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a inet6) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a inet6) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst inet6)
+BEGIN
+DECLARE src int(11) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'int' as 'inet6' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS inet6
+BEGIN
+DECLARE rc int(11) DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(11) DEFAULT NULL;
+DECLARE cur1 CURSOR(t inet6) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target INT DEFAULT 0, source INET6 DEFAULT '::0');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` int(11) DEFAULT 0,
+ `source` inet6 DEFAULT '::',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1366 Incorrect integer value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+2 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect integer value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target inet6
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'int' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE dst int(11) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a int(11)) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a int(11)) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst int(11))
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst int(11) DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'inet6' as 'int' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS int(11)
+BEGIN
+DECLARE rc inet6 DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE cur1 CURSOR(t int(11)) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst int(11) DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'int' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_int.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_int.test
new file mode 100644
index 00000000000..21a47e39f90
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_int.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source INT DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target INT DEFAULT 0, source INET6 DEFAULT '::0');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_time.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_time.result
new file mode 100644
index 00000000000..d3280ffe3d2
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_time.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source TIME DEFAULT '00:00:00');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` inet6 DEFAULT '::',
+ `source` time DEFAULT '00:00:00',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect inet6 value: '00:00:00' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 00:00:00
+2 :: 00:00:00
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect inet6 value: '00:00:00' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 00:00:00
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target time
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src time DEFAULT NULL;
+DECLARE dst inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a inet6) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a inet6) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst inet6)
+BEGIN
+DECLARE src time DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'time' as 'inet6' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS inet6
+BEGIN
+DECLARE rc time DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src time DEFAULT NULL;
+DECLARE cur1 CURSOR(t inet6) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target TIME DEFAULT '00:00:00', source INET6 DEFAULT '::0');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` time DEFAULT '00:00:00',
+ `source` inet6 DEFAULT '::',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1265 Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 00:00:00 ::
+2 00:00:00 ::
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect time value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00:00:00 ::
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target inet6
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'time' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE dst time DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a time) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a time) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst time)
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst time DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'inet6' as 'time' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS time
+BEGIN
+DECLARE rc inet6 DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE cur1 CURSOR(t time) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst time DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'time' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_time.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_time.test
new file mode 100644
index 00000000000..7ffb3133d0c
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_time.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source TIME DEFAULT '00:00:00');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target TIME DEFAULT '00:00:00', source INET6 DEFAULT '::0');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_uint.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_uint.result
new file mode 100644
index 00000000000..f040b54ee34
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_uint.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source INT UNSIGNED DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` inet6 DEFAULT '::',
+ `source` int(10) unsigned DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+2 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect inet6 value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 :: 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target int(10) unsigned
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(10) unsigned DEFAULT NULL;
+DECLARE dst inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a inet6) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a inet6) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst inet6)
+BEGIN
+DECLARE src int(10) unsigned DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'int unsigned' as 'inet6' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS inet6
+BEGIN
+DECLARE rc int(10) unsigned DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(10) unsigned DEFAULT NULL;
+DECLARE cur1 CURSOR(t inet6) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst inet6 DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target INT UNSIGNED DEFAULT 0, source INET6 DEFAULT '::0');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` int(10) unsigned DEFAULT 0,
+ `source` inet6 DEFAULT '::',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1366 Incorrect integer value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+2 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect integer value: '::' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 0 ::
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target inet6
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'int unsigned' as 'inet6' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE dst int(10) unsigned DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a int(10) unsigned) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a int(10) unsigned) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst int(10) unsigned)
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst int(10) unsigned DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'inet6' as 'int unsigned' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS int(10) unsigned
+BEGIN
+DECLARE rc inet6 DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src inet6 DEFAULT NULL;
+DECLARE cur1 CURSOR(t int(10) unsigned) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst int(10) unsigned DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'inet6' as 'int unsigned' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_uint.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_uint.test
new file mode 100644
index 00000000000..7506b56742f
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_mix_uint.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target INET6 DEFAULT '::0', source INT UNSIGNED DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target INT UNSIGNED DEFAULT 0, source INET6 DEFAULT '::0');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_sum.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_sum.result
new file mode 100644
index 00000000000..df268156981
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_sum.result
@@ -0,0 +1,51 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-27015 Assertion `!is_null()' failed in FixedBinTypeBundle<FbtImpl>::Fbt FixedBinTypeBundle<FbtImpl>::Field_fbt::to_fbt()
+#
+CREATE TABLE t1 (i6 INET6, a1 TIME, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('::','09:43:12','uw'), ('70:ef59::46:c7b:f:678:bd9f','00:00:00','a');
+SELECT GROUP_CONCAT(IF(a1, i6, a2) ORDER BY 1) FROM t1;
+GROUP_CONCAT(IF(a1, i6, a2) ORDER BY 1)
+::
+Warnings:
+Warning 1292 Incorrect inet6 value: 'a'
+DROP TABLE t1;
+CREATE TABLE t1 (i6 inet6, a2 varchar(10));
+INSERT INTO t1 VALUES ('::','uw'), (null,'a');
+SELECT group_concat(coalesce(i6, a2) ORDER BY 1) FROM t1;
+group_concat(coalesce(i6, a2) ORDER BY 1)
+::
+Warnings:
+Warning 1292 Incorrect inet6 value: 'a'
+DROP TABLE t1;
+CREATE TABLE t1 (a INET6);
+INSERT INTO t1 VALUES();
+SELECT JSON_ARRAYAGG(a ORDER BY a DESC) FROM t1;
+JSON_ARRAYAGG(a ORDER BY a DESC)
+[null]
+DROP TABLE t1;
+CREATE TABLE t1 (i6 INET6, a1 INT, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('::',1,'uw'), ('70:ef59::46:c7b:f:678:bd9f',0,'a');
+SELECT GROUP_CONCAT(IF(a1, i6, a2) ORDER BY 1) FROM t1;
+GROUP_CONCAT(IF(a1, i6, a2) ORDER BY 1)
+::
+Warnings:
+Warning 1292 Incorrect inet6 value: 'a'
+DROP TABLE t1;
+CREATE TABLE t1 (i6 INET6, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('::',''), (NULL,NULL);
+SELECT GROUP_CONCAT(COALESCE(i6, a2) ORDER BY 1) FROM t1;
+GROUP_CONCAT(COALESCE(i6, a2) ORDER BY 1)
+::
+DROP TABLE t1;
+CREATE TABLE t1 (i6 INET6, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('::',''), (NULL,NULL);
+SELECT GROUP_CONCAT(DISTINCT COALESCE(i6, a2)) FROM t1;
+GROUP_CONCAT(DISTINCT COALESCE(i6, a2))
+::
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_sum.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_sum.test
new file mode 100644
index 00000000000..71dfcebf71a
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_sum.test
@@ -0,0 +1,41 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-27015 Assertion `!is_null()' failed in FixedBinTypeBundle<FbtImpl>::Fbt FixedBinTypeBundle<FbtImpl>::Field_fbt::to_fbt()
+--echo #
+
+CREATE TABLE t1 (i6 INET6, a1 TIME, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('::','09:43:12','uw'), ('70:ef59::46:c7b:f:678:bd9f','00:00:00','a');
+SELECT GROUP_CONCAT(IF(a1, i6, a2) ORDER BY 1) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (i6 inet6, a2 varchar(10));
+INSERT INTO t1 VALUES ('::','uw'), (null,'a');
+SELECT group_concat(coalesce(i6, a2) ORDER BY 1) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a INET6);
+INSERT INTO t1 VALUES();
+SELECT JSON_ARRAYAGG(a ORDER BY a DESC) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (i6 INET6, a1 INT, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('::',1,'uw'), ('70:ef59::46:c7b:f:678:bd9f',0,'a');
+SELECT GROUP_CONCAT(IF(a1, i6, a2) ORDER BY 1) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (i6 INET6, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('::',''), (NULL,NULL);
+SELECT GROUP_CONCAT(COALESCE(i6, a2) ORDER BY 1) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (i6 INET6, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('::',''), (NULL,NULL);
+SELECT GROUP_CONCAT(DISTINCT COALESCE(i6, a2)) FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_mysql_json/type.cc b/plugin/type_mysql_json/type.cc
index 2b3c415f346..b897f64a3b2 100644
--- a/plugin/type_mysql_json/type.cc
+++ b/plugin/type_mysql_json/type.cc
@@ -14,8 +14,8 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
-#include <mysql/plugin_data_type.h>
#include <my_global.h>
+#include <mysql/plugin_data_type.h>
#include <sql_type.h>
#include <field.h>
#include <mysqld_error.h>
@@ -40,6 +40,18 @@ public:
void Column_definition_reuse_fix_attributes(THD *thd,
Column_definition *def,
const Field *field) const override;
+ const Type_handler *type_handler_base() const override
+ {
+ /*
+ Override this method in the same way with what Type_handler_blob_json
+ does, to tell the server that MySQL JSON inherits aggregation behaviour
+ from the LONGBLOB data type.
+ This makes MariaDB JSON column and a MySQL JSON column compatible for
+ assignment, so "ALTER TABLE table_with_mysql_json FORCE" can run without
+ raising ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION.
+ */
+ return &type_handler_long_blob;
+ }
};
Type_handler_mysql_json type_handler_mysql_json;
diff --git a/plugin/type_uuid/CMakeLists.txt b/plugin/type_uuid/CMakeLists.txt
new file mode 100644
index 00000000000..9a379abef04
--- /dev/null
+++ b/plugin/type_uuid/CMakeLists.txt
@@ -0,0 +1,18 @@
+# Copyright (c) 2019,2021, MariaDB Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
+
+MYSQL_ADD_PLUGIN(type_uuid
+ plugin.cc sql_type_uuid.cc item_uuidfunc.cc
+ MANDATORY RECOMPILE_FOR_EMBEDDED)
diff --git a/plugin/type_uuid/item_uuidfunc.cc b/plugin/type_uuid/item_uuidfunc.cc
new file mode 100644
index 00000000000..725b696f905
--- /dev/null
+++ b/plugin/type_uuid/item_uuidfunc.cc
@@ -0,0 +1,46 @@
+/* Copyright (c) 2019,2021, MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#define MYSQL_SERVER
+#include "mariadb.h"
+#include "item_uuidfunc.h"
+#include "sql_type_uuid.h"
+
+String *Item_func_sys_guid::val_str(String *str)
+{
+ DBUG_ASSERT(fixed());
+ str->alloc(uuid_len()+1);
+ str->length(uuid_len());
+ str->set_charset(collation.collation);
+
+ uchar buf[MY_UUID_SIZE];
+ my_uuid(buf);
+ my_uuid2str(buf, const_cast<char*>(str->ptr()), with_dashes);
+ return str;
+}
+
+const Type_handler *Item_func_uuid::type_handler() const
+{
+ return UUIDBundle::type_handler_fbt();
+}
+
+bool Item_func_uuid::val_native(THD *, Native *to)
+{
+ DBUG_ASSERT(fixed());
+ to->alloc(MY_UUID_SIZE);
+ to->length(MY_UUID_SIZE);
+ my_uuid((uchar*)to->ptr());
+ return 0;
+}
diff --git a/plugin/type_uuid/item_uuidfunc.h b/plugin/type_uuid/item_uuidfunc.h
new file mode 100644
index 00000000000..296b6592f10
--- /dev/null
+++ b/plugin/type_uuid/item_uuidfunc.h
@@ -0,0 +1,67 @@
+#ifndef ITEM_UUIDFUNC_INCLUDED
+#define ITEM_UUIDFUNC_INCLUDED
+
+/* Copyright (c) 2019,2021, MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+
+#include "item.h"
+
+class Item_func_sys_guid: public Item_str_func
+{
+protected:
+ bool with_dashes;
+ size_t uuid_len() const
+ { return MY_UUID_BARE_STRING_LENGTH + with_dashes*MY_UUID_SEPARATORS; }
+public:
+ Item_func_sys_guid(THD *thd): Item_str_func(thd), with_dashes(false) {}
+ bool fix_length_and_dec() override
+ {
+ collation.set(DTCollation_numeric());
+ fix_char_length(uuid_len());
+ return FALSE;
+ }
+ bool const_item() const override { return false; }
+ table_map used_tables() const override { return RAND_TABLE_BIT; }
+ LEX_CSTRING func_name_cstring() const override
+ {
+ static LEX_CSTRING name= {STRING_WITH_LEN("sys_guid") };
+ return name;
+ }
+ String *val_str(String *) override;
+ bool check_vcol_func_processor(void *arg) override
+ {
+ return mark_unsupported_function(func_name(), "()", arg, VCOL_NON_DETERMINISTIC);
+ }
+ Item *get_copy(THD *thd) override
+ { return get_item_copy<Item_func_sys_guid>(thd, this); }
+};
+
+class Item_func_uuid: public Item_func_sys_guid
+{
+public:
+ Item_func_uuid(THD *thd): Item_func_sys_guid(thd) { with_dashes= true; }
+ const Type_handler *type_handler() const override;
+ LEX_CSTRING func_name_cstring() const override
+ {
+ static LEX_CSTRING name= {STRING_WITH_LEN("uuid") };
+ return name;
+ }
+ bool val_native(THD *thd, Native *to) override;
+ Item *get_copy(THD *thd) override
+ { return get_item_copy<Item_func_uuid>(thd, this); }
+};
+
+#endif // ITEM_UUIDFUNC_INCLUDED
diff --git a/plugin/type_uuid/mysql-test/type_uuid/binlog_stm_type_uuid.result b/plugin/type_uuid/mysql-test/type_uuid/binlog_stm_type_uuid.result
new file mode 100644
index 00000000000..a0e5a3af11c
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/binlog_stm_type_uuid.result
@@ -0,0 +1,37 @@
+#
+# MDEV-4958 Adding datatype UUID
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000');
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff');
+PREPARE stmt FROM 'INSERT INTO t1 VALUES (?)';
+EXECUTE stmt USING CAST('00000000-0000-0000-0000-000000000001' AS UUID);
+EXECUTE stmt USING CAST(CONCAT(REPEAT(0x00,15), 0x02) AS UUID);
+DEALLOCATE PREPARE stmt;
+BEGIN NOT ATOMIC
+DECLARE a UUID DEFAULT '00000000-0000-0000-0000-000000000003';
+INSERT INTO t1 VALUES (a);
+END;
+$$
+DROP TABLE t1;
+include/show_binlog_events.inc
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Gtid # # GTID #-#-#
+master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a UUID)
+master-bin.000001 # Gtid # # BEGIN GTID #-#-#
+master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000')
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Gtid # # BEGIN GTID #-#-#
+master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff')
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Gtid # # BEGIN GTID #-#-#
+master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001')
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Gtid # # BEGIN GTID #-#-#
+master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000002')
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Gtid # # BEGIN GTID #-#-#
+master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ( NAME_CONST('a','00000000-0000-0000-0000-000000000003'))
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Gtid # # GTID #-#-#
+master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
diff --git a/plugin/type_uuid/mysql-test/type_uuid/binlog_stm_type_uuid.test b/plugin/type_uuid/mysql-test/type_uuid/binlog_stm_type_uuid.test
new file mode 100644
index 00000000000..2c2dd95858d
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/binlog_stm_type_uuid.test
@@ -0,0 +1,32 @@
+--source include/not_embedded.inc
+--source include/have_binlog_format_statement.inc
+
+--disable_query_log
+reset master; # get rid of previous tests binlog
+--enable_query_log
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000');
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff');
+
+PREPARE stmt FROM 'INSERT INTO t1 VALUES (?)';
+EXECUTE stmt USING CAST('00000000-0000-0000-0000-000000000001' AS UUID);
+EXECUTE stmt USING CAST(CONCAT(REPEAT(0x00,15), 0x02) AS UUID);
+DEALLOCATE PREPARE stmt;
+
+DELIMITER $$;
+BEGIN NOT ATOMIC
+ DECLARE a UUID DEFAULT '00000000-0000-0000-0000-000000000003';
+ INSERT INTO t1 VALUES (a);
+END;
+$$
+DELIMITER ;$$
+
+DROP TABLE t1;
+
+--let $binlog_file = LAST
+source include/show_binlog_events.inc;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/binlog_table_map_optional_metadata_type_uuid.result b/plugin/type_uuid/mysql-test/type_uuid/binlog_table_map_optional_metadata_type_uuid.result
new file mode 100644
index 00000000000..3932470cf64
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/binlog_table_map_optional_metadata_type_uuid.result
@@ -0,0 +1,60 @@
+#
+# Start of 10.5 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+# Using DEFAULT_CHARSET format
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = NO_LOG;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES('123e4567-e89b-12d3-a456-426655440000');
+# Columns(BINARY(16))
+DROP TABLE t1;
+RESET MASTER;
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = MINIMAL;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000');
+# Columns(BINARY(16))
+DROP TABLE t1;
+RESET MASTER;
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = FULL;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000');
+# Columns(`a` BINARY(16))
+DROP TABLE t1;
+RESET MASTER;
+# Using COLUMN_CHARSET format
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = NO_LOG;
+CREATE TABLE t1 (a UUID, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000','','');
+# Columns(BINARY(16),
+# BINARY(16),
+# BINARY(48))
+DROP TABLE t1;
+RESET MASTER;
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = MINIMAL;
+CREATE TABLE t1 (a UUID, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000','','');
+# Columns(BINARY(16),
+# CHAR(16) CHARSET latin1 COLLATE latin1_swedish_ci,
+# CHAR(16) CHARSET utf8mb3 COLLATE utf8mb3_general_ci)
+DROP TABLE t1;
+RESET MASTER;
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = FULL;
+CREATE TABLE t1 (a UUID, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000','','');
+# Columns(`a` BINARY(16),
+# `b` CHAR(16) CHARSET latin1 COLLATE latin1_swedish_ci,
+# `c` CHAR(16) CHARSET utf8mb3 COLLATE utf8mb3_general_ci)
+DROP TABLE t1;
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = DEFAULT;
+#
+# End of 10.5 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/binlog_table_map_optional_metadata_type_uuid.test b/plugin/type_uuid/mysql-test/type_uuid/binlog_table_map_optional_metadata_type_uuid.test
new file mode 100644
index 00000000000..aa525123855
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/binlog_table_map_optional_metadata_type_uuid.test
@@ -0,0 +1,72 @@
+--source include/have_debug.inc
+--source include/have_binlog_format_row.inc
+
+--let $MYSQLD_DATADIR= `select @@datadir`
+--let $binlog_file= $MYSQLD_DATADIR/master-bin.000001
+
+
+--echo #
+--echo # Start of 10.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+--echo # Using DEFAULT_CHARSET format
+
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = NO_LOG;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES('123e4567-e89b-12d3-a456-426655440000');
+--source suite/binlog/include/print_optional_metadata.inc
+DROP TABLE t1;
+RESET MASTER;
+
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = MINIMAL;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000');
+--source suite/binlog/include/print_optional_metadata.inc
+DROP TABLE t1;
+RESET MASTER;
+
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = FULL;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000');
+--source suite/binlog/include/print_optional_metadata.inc
+DROP TABLE t1;
+RESET MASTER;
+
+--echo # Using COLUMN_CHARSET format
+
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = NO_LOG;
+CREATE TABLE t1 (a UUID, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000','','');
+--source suite/binlog/include/print_optional_metadata.inc
+DROP TABLE t1;
+RESET MASTER;
+
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = MINIMAL;
+CREATE TABLE t1 (a UUID, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000','','');
+--source suite/binlog/include/print_optional_metadata.inc
+DROP TABLE t1;
+RESET MASTER;
+
+RESET MASTER;
+SET GLOBAL binlog_row_metadata = FULL;
+CREATE TABLE t1 (a UUID, b CHAR(16) CHARACTER SET latin1, c CHAR(16) CHARACTER SET utf8);
+INSERT INTO t1 VALUES('12334567-8888-9999-aaaa-000000000000','','');
+--source suite/binlog/include/print_optional_metadata.inc
+DROP TABLE t1;
+RESET MASTER;
+
+SET GLOBAL binlog_row_metadata = DEFAULT;
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/func_uuid_plugin.result b/plugin/type_uuid/mysql-test/type_uuid/func_uuid_plugin.result
new file mode 100644
index 00000000000..716f33134ca
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/func_uuid_plugin.result
@@ -0,0 +1,35 @@
+#
+# Start of 10.5 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+SELECT
+'----' AS `----`,
+PLUGIN_NAME,
+PLUGIN_VERSION,
+PLUGIN_STATUS,
+PLUGIN_TYPE,
+PLUGIN_AUTHOR,
+PLUGIN_DESCRIPTION,
+PLUGIN_LICENSE,
+PLUGIN_MATURITY,
+PLUGIN_AUTH_VERSION
+FROM INFORMATION_SCHEMA.PLUGINS
+WHERE PLUGIN_TYPE='FUNCTION'
+ AND PLUGIN_NAME IN
+('uuid')
+ORDER BY PLUGIN_NAME;
+---- ----
+PLUGIN_NAME uuid
+PLUGIN_VERSION 1.0
+PLUGIN_STATUS ACTIVE
+PLUGIN_TYPE FUNCTION
+PLUGIN_AUTHOR MariaDB Corporation
+PLUGIN_DESCRIPTION Function UUID()
+PLUGIN_LICENSE GPL
+PLUGIN_MATURITY Stable
+PLUGIN_AUTH_VERSION 1.0
+#
+# End of 10.5 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/func_uuid_plugin.test b/plugin/type_uuid/mysql-test/type_uuid/func_uuid_plugin.test
new file mode 100644
index 00000000000..ce8aba68979
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/func_uuid_plugin.test
@@ -0,0 +1,30 @@
+--echo #
+--echo # Start of 10.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+--vertical_results
+SELECT
+ '----' AS `----`,
+ PLUGIN_NAME,
+ PLUGIN_VERSION,
+ PLUGIN_STATUS,
+ PLUGIN_TYPE,
+ PLUGIN_AUTHOR,
+ PLUGIN_DESCRIPTION,
+ PLUGIN_LICENSE,
+ PLUGIN_MATURITY,
+ PLUGIN_AUTH_VERSION
+FROM INFORMATION_SCHEMA.PLUGINS
+WHERE PLUGIN_TYPE='FUNCTION'
+ AND PLUGIN_NAME IN
+ ('uuid')
+ORDER BY PLUGIN_NAME;
+--horizontal_results
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/rpl_row_binary_to_uuid.result b/plugin/type_uuid/mysql-test/type_uuid/rpl_row_binary_to_uuid.result
new file mode 100644
index 00000000000..553c8c6eacd
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/rpl_row_binary_to_uuid.result
@@ -0,0 +1,35 @@
+include/master-slave.inc
+[connection master]
+#
+# Start of 10.5 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+CREATE TABLE t1 (a BINARY(16));
+connection slave;
+ALTER TABLE t1 MODIFY a UUID;
+connection master;
+INSERT INTO t1 VALUES (X'00000000000000000000000000000000');
+INSERT INTO t1 VALUES (X'00000000000000000000000000000001');
+INSERT INTO t1 VALUES (X'fffffffffffffffffffffffffffffffe');
+INSERT INTO t1 VALUES (X'ffffffffffffffffffffffffffffffff');
+SELECT HEX(a) FROM t1 ORDER BY a;
+HEX(a)
+00000000000000000000000000000000
+00000000000000000000000000000001
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+connection slave;
+SELECT * FROM t1 ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+ffffffff-ffff-ffff-ffff-fffffffffffe
+ffffffff-ffff-ffff-ffff-ffffffffffff
+connection master;
+DROP TABLE t1;
+#
+# End of 10.5 tests
+#
+include/rpl_end.inc
diff --git a/plugin/type_uuid/mysql-test/type_uuid/rpl_row_binary_to_uuid.test b/plugin/type_uuid/mysql-test/type_uuid/rpl_row_binary_to_uuid.test
new file mode 100644
index 00000000000..6f3f5caebc4
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/rpl_row_binary_to_uuid.test
@@ -0,0 +1,33 @@
+--source include/have_binlog_format_row.inc
+--source include/master-slave.inc
+
+--echo #
+--echo # Start of 10.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+CREATE TABLE t1 (a BINARY(16));
+
+--sync_slave_with_master
+ALTER TABLE t1 MODIFY a UUID;
+
+--connection master
+INSERT INTO t1 VALUES (X'00000000000000000000000000000000');
+INSERT INTO t1 VALUES (X'00000000000000000000000000000001');
+INSERT INTO t1 VALUES (X'fffffffffffffffffffffffffffffffe');
+INSERT INTO t1 VALUES (X'ffffffffffffffffffffffffffffffff');
+SELECT HEX(a) FROM t1 ORDER BY a;
+--sync_slave_with_master
+SELECT * FROM t1 ORDER BY a;
+
+--connection master
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
+
+--source include/rpl_end.inc
diff --git a/plugin/type_uuid/mysql-test/type_uuid/rpl_row_uuid_to_binary.result b/plugin/type_uuid/mysql-test/type_uuid/rpl_row_uuid_to_binary.result
new file mode 100644
index 00000000000..a917a6830b0
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/rpl_row_uuid_to_binary.result
@@ -0,0 +1,35 @@
+include/master-slave.inc
+[connection master]
+#
+# Start of 10.5 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+CREATE TABLE t1 (a UUID);
+connection slave;
+ALTER TABLE t1 MODIFY a BINARY(16);
+connection master;
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000');
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-fffffffffffe');
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff');
+SELECT a FROM t1 ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+ffffffff-ffff-ffff-ffff-fffffffffffe
+ffffffff-ffff-ffff-ffff-ffffffffffff
+connection slave;
+SELECT HEX(a) FROM t1 ORDER BY a;
+HEX(a)
+00000000000000000000000000000000
+00000000000000000000000000000001
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+connection master;
+DROP TABLE t1;
+#
+# End of 10.5 tests
+#
+include/rpl_end.inc
diff --git a/plugin/type_uuid/mysql-test/type_uuid/rpl_row_uuid_to_binary.test b/plugin/type_uuid/mysql-test/type_uuid/rpl_row_uuid_to_binary.test
new file mode 100644
index 00000000000..df927fafa02
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/rpl_row_uuid_to_binary.test
@@ -0,0 +1,33 @@
+--source include/have_binlog_format_row.inc
+--source include/master-slave.inc
+
+--echo #
+--echo # Start of 10.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+CREATE TABLE t1 (a UUID);
+
+--sync_slave_with_master
+ALTER TABLE t1 MODIFY a BINARY(16);
+
+--connection master
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000');
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-fffffffffffe');
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff');
+SELECT a FROM t1 ORDER BY a;
+--sync_slave_with_master
+SELECT HEX(a) FROM t1 ORDER BY a;
+
+--connection master
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
+
+--source include/rpl_end.inc
diff --git a/plugin/type_uuid/mysql-test/type_uuid/rpl_type_uuid.result b/plugin/type_uuid/mysql-test/type_uuid/rpl_type_uuid.result
new file mode 100644
index 00000000000..c3825570a5c
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/rpl_type_uuid.result
@@ -0,0 +1,19 @@
+include/master-slave.inc
+[connection master]
+#
+# MDEV-4958 Adding datatype UUID
+#
+connection master;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('ffffffff-ffff-ffff-ffff-ffffffffffff');
+connection slave;
+SELECT HEX(a), a FROM t1;
+HEX(a) a
+00000000000000000000000000000000 00000000-0000-0000-0000-000000000000
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ffffffff-ffff-ffff-ffff-ffffffffffff
+connection master;
+DROP TABLE t1;
+connection slave;
+include/rpl_end.inc
diff --git a/plugin/type_uuid/mysql-test/type_uuid/rpl_type_uuid.test b/plugin/type_uuid/mysql-test/type_uuid/rpl_type_uuid.test
new file mode 100644
index 00000000000..7651a0d5e02
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/rpl_type_uuid.test
@@ -0,0 +1,18 @@
+--source include/master-slave.inc
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+connection master;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('ffffffff-ffff-ffff-ffff-ffffffffffff');
+sync_slave_with_master;
+SELECT HEX(a), a FROM t1;
+connection master;
+DROP TABLE t1;
+sync_slave_with_master;
+
+--source include/rpl_end.inc
diff --git a/plugin/type_uuid/mysql-test/type_uuid/std_data/t1nopackkey.frm b/plugin/type_uuid/mysql-test/type_uuid/std_data/t1nopackkey.frm
new file mode 100644
index 00000000000..ca934198cf7
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/std_data/t1nopackkey.frm
Binary files differ
diff --git a/plugin/type_uuid/mysql-test/type_uuid/std_data/t1packkey.frm b/plugin/type_uuid/mysql-test/type_uuid/std_data/t1packkey.frm
new file mode 100644
index 00000000000..b3d8e433e9d
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/std_data/t1packkey.frm
Binary files differ
diff --git a/plugin/type_uuid/mysql-test/type_uuid/suite.pm b/plugin/type_uuid/mysql-test/type_uuid/suite.pm
new file mode 100644
index 00000000000..ad21c8688de
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/suite.pm
@@ -0,0 +1,7 @@
+package My::Suite::Type_uuid;
+
+@ISA = qw(My::Suite);
+
+sub is_default { 1 }
+
+bless { };
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid-debug.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid-debug.result
new file mode 100644
index 00000000000..fc0eaae2627
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid-debug.result
@@ -0,0 +1,18 @@
+#
+# MDEV-4958 Adding datatype UUID
+#
+SET @old_debug_dbug=@@debug_dbug;
+SET debug_dbug="+d,frm_data_type_info";
+CREATE TABLE t1 (c01 UUID, c02 UUID);
+Warnings:
+Note 1105 build_frm_image: Field data type info length: 12
+Note 1105 DBUG: [0] name='c01' type_info='uuid'
+Note 1105 DBUG: [1] name='c02' type_info='uuid'
+SET debug_dbug=@old_debug_dbug;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `c01` uuid DEFAULT NULL,
+ `c02` uuid DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t1;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid-debug.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid-debug.test
new file mode 100644
index 00000000000..59300d167c9
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid-debug.test
@@ -0,0 +1,14 @@
+--source include/have_debug.inc
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+SET @old_debug_dbug=@@debug_dbug;
+
+SET debug_dbug="+d,frm_data_type_info";
+CREATE TABLE t1 (c01 UUID, c02 UUID);
+SET debug_dbug=@old_debug_dbug;
+
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid.result
new file mode 100644
index 00000000000..ab30c262148
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid.result
@@ -0,0 +1,3189 @@
+#
+# MDEV-4958 Adding datatype UUID
+#
+#
+# Basic CREATE functionality, defaults, metadata
+#
+CREATE TABLE t1 (a UUID AUTO_INCREMENT);
+ERROR 42000: Incorrect column specifier for column 'a'
+CREATE TABLE t1 (a UUID);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DESCRIBE t1;
+Field Type Null Key Default Extra
+a uuid YES NULL
+SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='test' AND table_name='t1';
+TABLE_CATALOG def
+TABLE_SCHEMA test
+TABLE_NAME t1
+COLUMN_NAME a
+ORDINAL_POSITION 1
+COLUMN_DEFAULT NULL
+IS_NULLABLE YES
+DATA_TYPE uuid
+CHARACTER_MAXIMUM_LENGTH NULL
+CHARACTER_OCTET_LENGTH NULL
+NUMERIC_PRECISION NULL
+NUMERIC_SCALE NULL
+DATETIME_PRECISION NULL
+CHARACTER_SET_NAME NULL
+COLLATION_NAME NULL
+COLUMN_TYPE uuid
+COLUMN_KEY
+EXTRA
+PRIVILEGES #
+COLUMN_COMMENT
+IS_GENERATED NEVER
+GENERATION_EXPRESSION NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT * FROM t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def test t1 t1 a a 254 (type=uuid) 36 36 Y 160 0 8
+a
+00000000-0000-0000-0000-000000000001
+SELECT CAST('00000000-0000-0000-0000-000000000001' AS UUID) AS a;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def a 254 (type=uuid) 36 36 N 33 0 8
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE TABLE t1 (
+c1 UUID DEFAULT 0x00000000000000000000000000000000,
+c2 UUID DEFAULT 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
+c3 UUID DEFAULT '00000000-0000-0000-0000-000000000000',
+c4 UUID DEFAULT 'ffffffff-ffff-ffff-ffff-ffffffffffff',
+c5 UUID DEFAULT CAST(X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' AS UUID)
+);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `c1` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ `c2` uuid DEFAULT 'ffffffff-ffff-ffff-ffff-ffffffffffff',
+ `c3` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ `c4` uuid DEFAULT 'ffffffff-ffff-ffff-ffff-ffffffffffff',
+ `c5` uuid DEFAULT cast(X'ffffffffffffffffffffffffffffffff' as uuid)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DESCRIBE t1;
+Field Type Null Key Default Extra
+c1 uuid YES 00000000-0000-0000-0000-000000000000
+c2 uuid YES ffffffff-ffff-ffff-ffff-ffffffffffff
+c3 uuid YES 00000000-0000-0000-0000-000000000000
+c4 uuid YES ffffffff-ffff-ffff-ffff-ffffffffffff
+c5 uuid YES cast(X'ffffffffffffffffffffffffffffffff' as uuid)
+SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='test' AND table_name='t1';
+TABLE_CATALOG def
+TABLE_SCHEMA test
+TABLE_NAME t1
+COLUMN_NAME c1
+ORDINAL_POSITION 1
+COLUMN_DEFAULT '00000000-0000-0000-0000-000000000000'
+IS_NULLABLE YES
+DATA_TYPE uuid
+CHARACTER_MAXIMUM_LENGTH NULL
+CHARACTER_OCTET_LENGTH NULL
+NUMERIC_PRECISION NULL
+NUMERIC_SCALE NULL
+DATETIME_PRECISION NULL
+CHARACTER_SET_NAME NULL
+COLLATION_NAME NULL
+COLUMN_TYPE uuid
+COLUMN_KEY
+EXTRA
+PRIVILEGES #
+COLUMN_COMMENT
+IS_GENERATED NEVER
+GENERATION_EXPRESSION NULL
+TABLE_CATALOG def
+TABLE_SCHEMA test
+TABLE_NAME t1
+COLUMN_NAME c2
+ORDINAL_POSITION 2
+COLUMN_DEFAULT 'ffffffff-ffff-ffff-ffff-ffffffffffff'
+IS_NULLABLE YES
+DATA_TYPE uuid
+CHARACTER_MAXIMUM_LENGTH NULL
+CHARACTER_OCTET_LENGTH NULL
+NUMERIC_PRECISION NULL
+NUMERIC_SCALE NULL
+DATETIME_PRECISION NULL
+CHARACTER_SET_NAME NULL
+COLLATION_NAME NULL
+COLUMN_TYPE uuid
+COLUMN_KEY
+EXTRA
+PRIVILEGES #
+COLUMN_COMMENT
+IS_GENERATED NEVER
+GENERATION_EXPRESSION NULL
+TABLE_CATALOG def
+TABLE_SCHEMA test
+TABLE_NAME t1
+COLUMN_NAME c3
+ORDINAL_POSITION 3
+COLUMN_DEFAULT '00000000-0000-0000-0000-000000000000'
+IS_NULLABLE YES
+DATA_TYPE uuid
+CHARACTER_MAXIMUM_LENGTH NULL
+CHARACTER_OCTET_LENGTH NULL
+NUMERIC_PRECISION NULL
+NUMERIC_SCALE NULL
+DATETIME_PRECISION NULL
+CHARACTER_SET_NAME NULL
+COLLATION_NAME NULL
+COLUMN_TYPE uuid
+COLUMN_KEY
+EXTRA
+PRIVILEGES #
+COLUMN_COMMENT
+IS_GENERATED NEVER
+GENERATION_EXPRESSION NULL
+TABLE_CATALOG def
+TABLE_SCHEMA test
+TABLE_NAME t1
+COLUMN_NAME c4
+ORDINAL_POSITION 4
+COLUMN_DEFAULT 'ffffffff-ffff-ffff-ffff-ffffffffffff'
+IS_NULLABLE YES
+DATA_TYPE uuid
+CHARACTER_MAXIMUM_LENGTH NULL
+CHARACTER_OCTET_LENGTH NULL
+NUMERIC_PRECISION NULL
+NUMERIC_SCALE NULL
+DATETIME_PRECISION NULL
+CHARACTER_SET_NAME NULL
+COLLATION_NAME NULL
+COLUMN_TYPE uuid
+COLUMN_KEY
+EXTRA
+PRIVILEGES #
+COLUMN_COMMENT
+IS_GENERATED NEVER
+GENERATION_EXPRESSION NULL
+TABLE_CATALOG def
+TABLE_SCHEMA test
+TABLE_NAME t1
+COLUMN_NAME c5
+ORDINAL_POSITION 5
+COLUMN_DEFAULT cast(X'ffffffffffffffffffffffffffffffff' as uuid)
+IS_NULLABLE YES
+DATA_TYPE uuid
+CHARACTER_MAXIMUM_LENGTH NULL
+CHARACTER_OCTET_LENGTH NULL
+NUMERIC_PRECISION NULL
+NUMERIC_SCALE NULL
+DATETIME_PRECISION NULL
+CHARACTER_SET_NAME NULL
+COLLATION_NAME NULL
+COLUMN_TYPE uuid
+COLUMN_KEY
+EXTRA
+PRIVILEGES #
+COLUMN_COMMENT
+IS_GENERATED NEVER
+GENERATION_EXPRESSION NULL
+DROP TABLE t1;
+CREATE TABLE t1 (c1 UUID DEFAULT 0x00);
+ERROR 42000: Invalid default value for 'c1'
+CREATE TABLE t1 (c1 UUID DEFAULT '');
+ERROR 42000: Invalid default value for 'c1'
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('x');
+ERROR 22007: Incorrect uuid value: 'x' for column `test`.`t1`.`a` at row 1
+INSERT INTO t1 VALUES (1);
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t1`.`a`
+INSERT INTO t1 VALUES (TIME'10:20:30');
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t1`.`a`
+INSERT INTO t1 VALUES (0x00);
+ERROR 22007: Incorrect uuid value: '\x00' for column `test`.`t1`.`a` at row 1
+DROP TABLE t1;
+#
+# CAST
+#
+SELECT CAST('garbage' AS UUID);
+CAST('garbage' AS UUID)
+NULL
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT CAST(0x01 AS UUID);
+CAST(0x01 AS UUID)
+NULL
+Warnings:
+Warning 1292 Incorrect uuid value: '\x01'
+SELECT CAST(REPEAT(0x00,16) AS UUID);
+CAST(REPEAT(0x00,16) AS UUID)
+00000000-0000-0000-0000-000000000000
+SELECT CAST(REPEAT(0x11,16) AS UUID);
+CAST(REPEAT(0x11,16) AS UUID)
+11111111-1111-1111-1111-111111111111
+CREATE TABLE t1 AS SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `CAST('00000000-0000-0000-0000-000000000000' AS UUID)` uuid NOT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t1;
+#
+# Text and binary formats, comparison operators
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES (0x00000000000000000000000000000000);
+INSERT INTO t1 VALUES (0x00000000000000000000000000000001);
+INSERT INTO t1 VALUES (0xFFFF0000000000000000000000000001);
+INSERT INTO t1 VALUES (0xFFFF0000000000000000000000000002);
+SELECT * FROM t1 ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000002
+SELECT * FROM t1 ORDER BY a DESC;
+a
+ffff0000-0000-0000-0000-000000000002
+ffff0000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000000
+SELECT HEX(a),a FROM t1 ORDER BY a;
+HEX(a) a
+00000000000000000000000000000000 00000000-0000-0000-0000-000000000000
+00000000000000000000000000000001 00000000-0000-0000-0000-000000000001
+FFFF0000000000000000000000000001 ffff0000-0000-0000-0000-000000000001
+FFFF0000000000000000000000000002 ffff0000-0000-0000-0000-000000000002
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-000000000000';
+a
+00000000-0000-0000-0000-000000000000
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-000000000001';
+a
+00000000-0000-0000-0000-000000000001
+SELECT * FROM t1 WHERE a='ffff0000-0000-0000-0000-000000000001';
+a
+ffff0000-0000-0000-0000-000000000001
+SELECT * FROM t1 WHERE a='ffff0000-0000-0000-0000-000000000002';
+a
+ffff0000-0000-0000-0000-000000000002
+SELECT * FROM t1 WHERE a=0x00000000000000000000000000000000;
+a
+00000000-0000-0000-0000-000000000000
+SELECT * FROM t1 WHERE a=0x00000000000000000000000000000001;
+a
+00000000-0000-0000-0000-000000000001
+SELECT * FROM t1 WHERE a=0xffff0000000000000000000000000001;
+a
+ffff0000-0000-0000-0000-000000000001
+SELECT * FROM t1 WHERE a=0xffff0000000000000000000000000002;
+a
+ffff0000-0000-0000-0000-000000000002
+SELECT * FROM t1 WHERE a< '00000000-0000-0000-0000-000000000000';
+a
+SELECT * FROM t1 WHERE a<='00000000-0000-0000-0000-000000000000';
+a
+00000000-0000-0000-0000-000000000000
+SELECT * FROM t1 WHERE a>='ffff0000-0000-0000-0000-000000000002';
+a
+ffff0000-0000-0000-0000-000000000002
+SELECT * FROM t1 WHERE a> 'ffff0000-0000-0000-0000-000000000002';
+a
+SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000000',
+'ffff0000-0000-0000-0000-000000000001'
+) ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+ffff0000-0000-0000-0000-000000000001
+SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000000',
+0xffff0000000000000000000000000002
+) ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+ffff0000-0000-0000-0000-000000000002
+SELECT * FROM t1 WHERE a<'garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a<='garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a='garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a>='garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a>'garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a<0x01;
+a
+Warnings:
+Warning 1292 Incorrect uuid value: '\x01'
+SELECT * FROM t1 WHERE a<=0x01;
+a
+Warnings:
+Warning 1292 Incorrect uuid value: '\x01'
+SELECT * FROM t1 WHERE a=0x01;
+a
+Warnings:
+Warning 1292 Incorrect uuid value: '\x01'
+Warning 1292 Incorrect uuid value: '\x01'
+SELECT * FROM t1 WHERE a>=0x01;
+a
+Warnings:
+Warning 1292 Incorrect uuid value: '\x01'
+SELECT * FROM t1 WHERE a>0x01;
+a
+Warnings:
+Warning 1292 Incorrect uuid value: '\x01'
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-000000000000';
+a
+00000000-0000-0000-0000-000000000000
+SELECT * FROM t1 WHERE a='00-000000-0000-0000-0000-000000000000';
+a
+00000000-0000-0000-0000-000000000000
+SELECT * FROM t1 WHERE a='00-00-0000-0000-0000-0000-000000000000';
+a
+00000000-0000-0000-0000-000000000000
+SELECT * FROM t1 WHERE a='00-00-00-00-0000-0000-0000-000000000000';
+a
+00000000-0000-0000-0000-000000000000
+SELECT * FROM t1 WHERE a=0;
+ERROR HY000: Illegal parameter data types uuid and int for operation '='
+SELECT * FROM t1 WHERE a=0.0;
+ERROR HY000: Illegal parameter data types uuid and decimal for operation '='
+SELECT * FROM t1 WHERE a=0e0;
+ERROR HY000: Illegal parameter data types uuid and double for operation '='
+SELECT * FROM t1 WHERE a=TIME'10:20:30';
+ERROR HY000: Illegal parameter data types uuid and time for operation '='
+SELECT * FROM t1 WHERE a IN ('::', 10);
+ERROR HY000: Illegal parameter data types uuid and int for operation 'in'
+DROP TABLE t1;
+#
+# ORDER BY
+#
+CREATE TABLE t1 (a UUID);
+FOR i IN 0..15
+DO
+INSERT INTO t1 VALUES (REPLACE('XX000000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00XX0000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('0000XX00-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('000000XX-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-XX00-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-00XX-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-XX00-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-00XX-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-XX00-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-00XX-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-XX0000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00XX00000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000XX000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-000000XX0000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00000000XX00','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000000000XX','XX',LPAD(HEX(i),2,'0')));
+END FOR;
+$$
+#
+# Logical ORDER BY
+#
+SELECT * FROM t1 ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000001-0000-0000-0000-000000000000
+00000002-0000-0000-0000-000000000000
+00000003-0000-0000-0000-000000000000
+00000004-0000-0000-0000-000000000000
+00000005-0000-0000-0000-000000000000
+00000006-0000-0000-0000-000000000000
+00000007-0000-0000-0000-000000000000
+00000008-0000-0000-0000-000000000000
+00000009-0000-0000-0000-000000000000
+0000000a-0000-0000-0000-000000000000
+0000000b-0000-0000-0000-000000000000
+0000000c-0000-0000-0000-000000000000
+0000000d-0000-0000-0000-000000000000
+0000000e-0000-0000-0000-000000000000
+0000000f-0000-0000-0000-000000000000
+00000100-0000-0000-0000-000000000000
+00000200-0000-0000-0000-000000000000
+00000300-0000-0000-0000-000000000000
+00000400-0000-0000-0000-000000000000
+00000500-0000-0000-0000-000000000000
+00000600-0000-0000-0000-000000000000
+00000700-0000-0000-0000-000000000000
+00000800-0000-0000-0000-000000000000
+00000900-0000-0000-0000-000000000000
+00000a00-0000-0000-0000-000000000000
+00000b00-0000-0000-0000-000000000000
+00000c00-0000-0000-0000-000000000000
+00000d00-0000-0000-0000-000000000000
+00000e00-0000-0000-0000-000000000000
+00000f00-0000-0000-0000-000000000000
+00010000-0000-0000-0000-000000000000
+00020000-0000-0000-0000-000000000000
+00030000-0000-0000-0000-000000000000
+00040000-0000-0000-0000-000000000000
+00050000-0000-0000-0000-000000000000
+00060000-0000-0000-0000-000000000000
+00070000-0000-0000-0000-000000000000
+00080000-0000-0000-0000-000000000000
+00090000-0000-0000-0000-000000000000
+000a0000-0000-0000-0000-000000000000
+000b0000-0000-0000-0000-000000000000
+000c0000-0000-0000-0000-000000000000
+000d0000-0000-0000-0000-000000000000
+000e0000-0000-0000-0000-000000000000
+000f0000-0000-0000-0000-000000000000
+01000000-0000-0000-0000-000000000000
+02000000-0000-0000-0000-000000000000
+03000000-0000-0000-0000-000000000000
+04000000-0000-0000-0000-000000000000
+05000000-0000-0000-0000-000000000000
+06000000-0000-0000-0000-000000000000
+07000000-0000-0000-0000-000000000000
+08000000-0000-0000-0000-000000000000
+09000000-0000-0000-0000-000000000000
+0a000000-0000-0000-0000-000000000000
+0b000000-0000-0000-0000-000000000000
+0c000000-0000-0000-0000-000000000000
+0d000000-0000-0000-0000-000000000000
+0e000000-0000-0000-0000-000000000000
+0f000000-0000-0000-0000-000000000000
+00000000-0001-0000-0000-000000000000
+00000000-0002-0000-0000-000000000000
+00000000-0003-0000-0000-000000000000
+00000000-0004-0000-0000-000000000000
+00000000-0005-0000-0000-000000000000
+00000000-0006-0000-0000-000000000000
+00000000-0007-0000-0000-000000000000
+00000000-0008-0000-0000-000000000000
+00000000-0009-0000-0000-000000000000
+00000000-000a-0000-0000-000000000000
+00000000-000b-0000-0000-000000000000
+00000000-000c-0000-0000-000000000000
+00000000-000d-0000-0000-000000000000
+00000000-000e-0000-0000-000000000000
+00000000-000f-0000-0000-000000000000
+00000000-0100-0000-0000-000000000000
+00000000-0200-0000-0000-000000000000
+00000000-0300-0000-0000-000000000000
+00000000-0400-0000-0000-000000000000
+00000000-0500-0000-0000-000000000000
+00000000-0600-0000-0000-000000000000
+00000000-0700-0000-0000-000000000000
+00000000-0800-0000-0000-000000000000
+00000000-0900-0000-0000-000000000000
+00000000-0a00-0000-0000-000000000000
+00000000-0b00-0000-0000-000000000000
+00000000-0c00-0000-0000-000000000000
+00000000-0d00-0000-0000-000000000000
+00000000-0e00-0000-0000-000000000000
+00000000-0f00-0000-0000-000000000000
+00000000-0000-0001-0000-000000000000
+00000000-0000-0002-0000-000000000000
+00000000-0000-0003-0000-000000000000
+00000000-0000-0004-0000-000000000000
+00000000-0000-0005-0000-000000000000
+00000000-0000-0006-0000-000000000000
+00000000-0000-0007-0000-000000000000
+00000000-0000-0008-0000-000000000000
+00000000-0000-0009-0000-000000000000
+00000000-0000-000a-0000-000000000000
+00000000-0000-000b-0000-000000000000
+00000000-0000-000c-0000-000000000000
+00000000-0000-000d-0000-000000000000
+00000000-0000-000e-0000-000000000000
+00000000-0000-000f-0000-000000000000
+00000000-0000-0100-0000-000000000000
+00000000-0000-0200-0000-000000000000
+00000000-0000-0300-0000-000000000000
+00000000-0000-0400-0000-000000000000
+00000000-0000-0500-0000-000000000000
+00000000-0000-0600-0000-000000000000
+00000000-0000-0700-0000-000000000000
+00000000-0000-0800-0000-000000000000
+00000000-0000-0900-0000-000000000000
+00000000-0000-0a00-0000-000000000000
+00000000-0000-0b00-0000-000000000000
+00000000-0000-0c00-0000-000000000000
+00000000-0000-0d00-0000-000000000000
+00000000-0000-0e00-0000-000000000000
+00000000-0000-0f00-0000-000000000000
+00000000-0000-0000-0001-000000000000
+00000000-0000-0000-0002-000000000000
+00000000-0000-0000-0003-000000000000
+00000000-0000-0000-0004-000000000000
+00000000-0000-0000-0005-000000000000
+00000000-0000-0000-0006-000000000000
+00000000-0000-0000-0007-000000000000
+00000000-0000-0000-0008-000000000000
+00000000-0000-0000-0009-000000000000
+00000000-0000-0000-000a-000000000000
+00000000-0000-0000-000b-000000000000
+00000000-0000-0000-000c-000000000000
+00000000-0000-0000-000d-000000000000
+00000000-0000-0000-000e-000000000000
+00000000-0000-0000-000f-000000000000
+00000000-0000-0000-0100-000000000000
+00000000-0000-0000-0200-000000000000
+00000000-0000-0000-0300-000000000000
+00000000-0000-0000-0400-000000000000
+00000000-0000-0000-0500-000000000000
+00000000-0000-0000-0600-000000000000
+00000000-0000-0000-0700-000000000000
+00000000-0000-0000-0800-000000000000
+00000000-0000-0000-0900-000000000000
+00000000-0000-0000-0a00-000000000000
+00000000-0000-0000-0b00-000000000000
+00000000-0000-0000-0c00-000000000000
+00000000-0000-0000-0d00-000000000000
+00000000-0000-0000-0e00-000000000000
+00000000-0000-0000-0f00-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+00000000-0000-0000-0000-000000000003
+00000000-0000-0000-0000-000000000004
+00000000-0000-0000-0000-000000000005
+00000000-0000-0000-0000-000000000006
+00000000-0000-0000-0000-000000000007
+00000000-0000-0000-0000-000000000008
+00000000-0000-0000-0000-000000000009
+00000000-0000-0000-0000-00000000000a
+00000000-0000-0000-0000-00000000000b
+00000000-0000-0000-0000-00000000000c
+00000000-0000-0000-0000-00000000000d
+00000000-0000-0000-0000-00000000000e
+00000000-0000-0000-0000-00000000000f
+00000000-0000-0000-0000-000000000100
+00000000-0000-0000-0000-000000000200
+00000000-0000-0000-0000-000000000300
+00000000-0000-0000-0000-000000000400
+00000000-0000-0000-0000-000000000500
+00000000-0000-0000-0000-000000000600
+00000000-0000-0000-0000-000000000700
+00000000-0000-0000-0000-000000000800
+00000000-0000-0000-0000-000000000900
+00000000-0000-0000-0000-000000000a00
+00000000-0000-0000-0000-000000000b00
+00000000-0000-0000-0000-000000000c00
+00000000-0000-0000-0000-000000000d00
+00000000-0000-0000-0000-000000000e00
+00000000-0000-0000-0000-000000000f00
+00000000-0000-0000-0000-000000010000
+00000000-0000-0000-0000-000000020000
+00000000-0000-0000-0000-000000030000
+00000000-0000-0000-0000-000000040000
+00000000-0000-0000-0000-000000050000
+00000000-0000-0000-0000-000000060000
+00000000-0000-0000-0000-000000070000
+00000000-0000-0000-0000-000000080000
+00000000-0000-0000-0000-000000090000
+00000000-0000-0000-0000-0000000a0000
+00000000-0000-0000-0000-0000000b0000
+00000000-0000-0000-0000-0000000c0000
+00000000-0000-0000-0000-0000000d0000
+00000000-0000-0000-0000-0000000e0000
+00000000-0000-0000-0000-0000000f0000
+00000000-0000-0000-0000-000001000000
+00000000-0000-0000-0000-000002000000
+00000000-0000-0000-0000-000003000000
+00000000-0000-0000-0000-000004000000
+00000000-0000-0000-0000-000005000000
+00000000-0000-0000-0000-000006000000
+00000000-0000-0000-0000-000007000000
+00000000-0000-0000-0000-000008000000
+00000000-0000-0000-0000-000009000000
+00000000-0000-0000-0000-00000a000000
+00000000-0000-0000-0000-00000b000000
+00000000-0000-0000-0000-00000c000000
+00000000-0000-0000-0000-00000d000000
+00000000-0000-0000-0000-00000e000000
+00000000-0000-0000-0000-00000f000000
+00000000-0000-0000-0000-000100000000
+00000000-0000-0000-0000-000200000000
+00000000-0000-0000-0000-000300000000
+00000000-0000-0000-0000-000400000000
+00000000-0000-0000-0000-000500000000
+00000000-0000-0000-0000-000600000000
+00000000-0000-0000-0000-000700000000
+00000000-0000-0000-0000-000800000000
+00000000-0000-0000-0000-000900000000
+00000000-0000-0000-0000-000a00000000
+00000000-0000-0000-0000-000b00000000
+00000000-0000-0000-0000-000c00000000
+00000000-0000-0000-0000-000d00000000
+00000000-0000-0000-0000-000e00000000
+00000000-0000-0000-0000-000f00000000
+00000000-0000-0000-0000-010000000000
+00000000-0000-0000-0000-020000000000
+00000000-0000-0000-0000-030000000000
+00000000-0000-0000-0000-040000000000
+00000000-0000-0000-0000-050000000000
+00000000-0000-0000-0000-060000000000
+00000000-0000-0000-0000-070000000000
+00000000-0000-0000-0000-080000000000
+00000000-0000-0000-0000-090000000000
+00000000-0000-0000-0000-0a0000000000
+00000000-0000-0000-0000-0b0000000000
+00000000-0000-0000-0000-0c0000000000
+00000000-0000-0000-0000-0d0000000000
+00000000-0000-0000-0000-0e0000000000
+00000000-0000-0000-0000-0f0000000000
+SELECT COALESCE(NULL, a) FROM t1 ORDER BY a;
+COALESCE(NULL, a)
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000001-0000-0000-0000-000000000000
+00000002-0000-0000-0000-000000000000
+00000003-0000-0000-0000-000000000000
+00000004-0000-0000-0000-000000000000
+00000005-0000-0000-0000-000000000000
+00000006-0000-0000-0000-000000000000
+00000007-0000-0000-0000-000000000000
+00000008-0000-0000-0000-000000000000
+00000009-0000-0000-0000-000000000000
+0000000a-0000-0000-0000-000000000000
+0000000b-0000-0000-0000-000000000000
+0000000c-0000-0000-0000-000000000000
+0000000d-0000-0000-0000-000000000000
+0000000e-0000-0000-0000-000000000000
+0000000f-0000-0000-0000-000000000000
+00000100-0000-0000-0000-000000000000
+00000200-0000-0000-0000-000000000000
+00000300-0000-0000-0000-000000000000
+00000400-0000-0000-0000-000000000000
+00000500-0000-0000-0000-000000000000
+00000600-0000-0000-0000-000000000000
+00000700-0000-0000-0000-000000000000
+00000800-0000-0000-0000-000000000000
+00000900-0000-0000-0000-000000000000
+00000a00-0000-0000-0000-000000000000
+00000b00-0000-0000-0000-000000000000
+00000c00-0000-0000-0000-000000000000
+00000d00-0000-0000-0000-000000000000
+00000e00-0000-0000-0000-000000000000
+00000f00-0000-0000-0000-000000000000
+00010000-0000-0000-0000-000000000000
+00020000-0000-0000-0000-000000000000
+00030000-0000-0000-0000-000000000000
+00040000-0000-0000-0000-000000000000
+00050000-0000-0000-0000-000000000000
+00060000-0000-0000-0000-000000000000
+00070000-0000-0000-0000-000000000000
+00080000-0000-0000-0000-000000000000
+00090000-0000-0000-0000-000000000000
+000a0000-0000-0000-0000-000000000000
+000b0000-0000-0000-0000-000000000000
+000c0000-0000-0000-0000-000000000000
+000d0000-0000-0000-0000-000000000000
+000e0000-0000-0000-0000-000000000000
+000f0000-0000-0000-0000-000000000000
+01000000-0000-0000-0000-000000000000
+02000000-0000-0000-0000-000000000000
+03000000-0000-0000-0000-000000000000
+04000000-0000-0000-0000-000000000000
+05000000-0000-0000-0000-000000000000
+06000000-0000-0000-0000-000000000000
+07000000-0000-0000-0000-000000000000
+08000000-0000-0000-0000-000000000000
+09000000-0000-0000-0000-000000000000
+0a000000-0000-0000-0000-000000000000
+0b000000-0000-0000-0000-000000000000
+0c000000-0000-0000-0000-000000000000
+0d000000-0000-0000-0000-000000000000
+0e000000-0000-0000-0000-000000000000
+0f000000-0000-0000-0000-000000000000
+00000000-0001-0000-0000-000000000000
+00000000-0002-0000-0000-000000000000
+00000000-0003-0000-0000-000000000000
+00000000-0004-0000-0000-000000000000
+00000000-0005-0000-0000-000000000000
+00000000-0006-0000-0000-000000000000
+00000000-0007-0000-0000-000000000000
+00000000-0008-0000-0000-000000000000
+00000000-0009-0000-0000-000000000000
+00000000-000a-0000-0000-000000000000
+00000000-000b-0000-0000-000000000000
+00000000-000c-0000-0000-000000000000
+00000000-000d-0000-0000-000000000000
+00000000-000e-0000-0000-000000000000
+00000000-000f-0000-0000-000000000000
+00000000-0100-0000-0000-000000000000
+00000000-0200-0000-0000-000000000000
+00000000-0300-0000-0000-000000000000
+00000000-0400-0000-0000-000000000000
+00000000-0500-0000-0000-000000000000
+00000000-0600-0000-0000-000000000000
+00000000-0700-0000-0000-000000000000
+00000000-0800-0000-0000-000000000000
+00000000-0900-0000-0000-000000000000
+00000000-0a00-0000-0000-000000000000
+00000000-0b00-0000-0000-000000000000
+00000000-0c00-0000-0000-000000000000
+00000000-0d00-0000-0000-000000000000
+00000000-0e00-0000-0000-000000000000
+00000000-0f00-0000-0000-000000000000
+00000000-0000-0001-0000-000000000000
+00000000-0000-0002-0000-000000000000
+00000000-0000-0003-0000-000000000000
+00000000-0000-0004-0000-000000000000
+00000000-0000-0005-0000-000000000000
+00000000-0000-0006-0000-000000000000
+00000000-0000-0007-0000-000000000000
+00000000-0000-0008-0000-000000000000
+00000000-0000-0009-0000-000000000000
+00000000-0000-000a-0000-000000000000
+00000000-0000-000b-0000-000000000000
+00000000-0000-000c-0000-000000000000
+00000000-0000-000d-0000-000000000000
+00000000-0000-000e-0000-000000000000
+00000000-0000-000f-0000-000000000000
+00000000-0000-0100-0000-000000000000
+00000000-0000-0200-0000-000000000000
+00000000-0000-0300-0000-000000000000
+00000000-0000-0400-0000-000000000000
+00000000-0000-0500-0000-000000000000
+00000000-0000-0600-0000-000000000000
+00000000-0000-0700-0000-000000000000
+00000000-0000-0800-0000-000000000000
+00000000-0000-0900-0000-000000000000
+00000000-0000-0a00-0000-000000000000
+00000000-0000-0b00-0000-000000000000
+00000000-0000-0c00-0000-000000000000
+00000000-0000-0d00-0000-000000000000
+00000000-0000-0e00-0000-000000000000
+00000000-0000-0f00-0000-000000000000
+00000000-0000-0000-0001-000000000000
+00000000-0000-0000-0002-000000000000
+00000000-0000-0000-0003-000000000000
+00000000-0000-0000-0004-000000000000
+00000000-0000-0000-0005-000000000000
+00000000-0000-0000-0006-000000000000
+00000000-0000-0000-0007-000000000000
+00000000-0000-0000-0008-000000000000
+00000000-0000-0000-0009-000000000000
+00000000-0000-0000-000a-000000000000
+00000000-0000-0000-000b-000000000000
+00000000-0000-0000-000c-000000000000
+00000000-0000-0000-000d-000000000000
+00000000-0000-0000-000e-000000000000
+00000000-0000-0000-000f-000000000000
+00000000-0000-0000-0100-000000000000
+00000000-0000-0000-0200-000000000000
+00000000-0000-0000-0300-000000000000
+00000000-0000-0000-0400-000000000000
+00000000-0000-0000-0500-000000000000
+00000000-0000-0000-0600-000000000000
+00000000-0000-0000-0700-000000000000
+00000000-0000-0000-0800-000000000000
+00000000-0000-0000-0900-000000000000
+00000000-0000-0000-0a00-000000000000
+00000000-0000-0000-0b00-000000000000
+00000000-0000-0000-0c00-000000000000
+00000000-0000-0000-0d00-000000000000
+00000000-0000-0000-0e00-000000000000
+00000000-0000-0000-0f00-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+00000000-0000-0000-0000-000000000003
+00000000-0000-0000-0000-000000000004
+00000000-0000-0000-0000-000000000005
+00000000-0000-0000-0000-000000000006
+00000000-0000-0000-0000-000000000007
+00000000-0000-0000-0000-000000000008
+00000000-0000-0000-0000-000000000009
+00000000-0000-0000-0000-00000000000a
+00000000-0000-0000-0000-00000000000b
+00000000-0000-0000-0000-00000000000c
+00000000-0000-0000-0000-00000000000d
+00000000-0000-0000-0000-00000000000e
+00000000-0000-0000-0000-00000000000f
+00000000-0000-0000-0000-000000000100
+00000000-0000-0000-0000-000000000200
+00000000-0000-0000-0000-000000000300
+00000000-0000-0000-0000-000000000400
+00000000-0000-0000-0000-000000000500
+00000000-0000-0000-0000-000000000600
+00000000-0000-0000-0000-000000000700
+00000000-0000-0000-0000-000000000800
+00000000-0000-0000-0000-000000000900
+00000000-0000-0000-0000-000000000a00
+00000000-0000-0000-0000-000000000b00
+00000000-0000-0000-0000-000000000c00
+00000000-0000-0000-0000-000000000d00
+00000000-0000-0000-0000-000000000e00
+00000000-0000-0000-0000-000000000f00
+00000000-0000-0000-0000-000000010000
+00000000-0000-0000-0000-000000020000
+00000000-0000-0000-0000-000000030000
+00000000-0000-0000-0000-000000040000
+00000000-0000-0000-0000-000000050000
+00000000-0000-0000-0000-000000060000
+00000000-0000-0000-0000-000000070000
+00000000-0000-0000-0000-000000080000
+00000000-0000-0000-0000-000000090000
+00000000-0000-0000-0000-0000000a0000
+00000000-0000-0000-0000-0000000b0000
+00000000-0000-0000-0000-0000000c0000
+00000000-0000-0000-0000-0000000d0000
+00000000-0000-0000-0000-0000000e0000
+00000000-0000-0000-0000-0000000f0000
+00000000-0000-0000-0000-000001000000
+00000000-0000-0000-0000-000002000000
+00000000-0000-0000-0000-000003000000
+00000000-0000-0000-0000-000004000000
+00000000-0000-0000-0000-000005000000
+00000000-0000-0000-0000-000006000000
+00000000-0000-0000-0000-000007000000
+00000000-0000-0000-0000-000008000000
+00000000-0000-0000-0000-000009000000
+00000000-0000-0000-0000-00000a000000
+00000000-0000-0000-0000-00000b000000
+00000000-0000-0000-0000-00000c000000
+00000000-0000-0000-0000-00000d000000
+00000000-0000-0000-0000-00000e000000
+00000000-0000-0000-0000-00000f000000
+00000000-0000-0000-0000-000100000000
+00000000-0000-0000-0000-000200000000
+00000000-0000-0000-0000-000300000000
+00000000-0000-0000-0000-000400000000
+00000000-0000-0000-0000-000500000000
+00000000-0000-0000-0000-000600000000
+00000000-0000-0000-0000-000700000000
+00000000-0000-0000-0000-000800000000
+00000000-0000-0000-0000-000900000000
+00000000-0000-0000-0000-000a00000000
+00000000-0000-0000-0000-000b00000000
+00000000-0000-0000-0000-000c00000000
+00000000-0000-0000-0000-000d00000000
+00000000-0000-0000-0000-000e00000000
+00000000-0000-0000-0000-000f00000000
+00000000-0000-0000-0000-010000000000
+00000000-0000-0000-0000-020000000000
+00000000-0000-0000-0000-030000000000
+00000000-0000-0000-0000-040000000000
+00000000-0000-0000-0000-050000000000
+00000000-0000-0000-0000-060000000000
+00000000-0000-0000-0000-070000000000
+00000000-0000-0000-0000-080000000000
+00000000-0000-0000-0000-090000000000
+00000000-0000-0000-0000-0a0000000000
+00000000-0000-0000-0000-0b0000000000
+00000000-0000-0000-0000-0c0000000000
+00000000-0000-0000-0000-0d0000000000
+00000000-0000-0000-0000-0e0000000000
+00000000-0000-0000-0000-0f0000000000
+#
+# Lexicographical ORDER BY
+#
+SELECT * FROM t1 ORDER BY CAST(a AS BINARY(16));
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+00000000-0000-0000-0000-000000000003
+00000000-0000-0000-0000-000000000004
+00000000-0000-0000-0000-000000000005
+00000000-0000-0000-0000-000000000006
+00000000-0000-0000-0000-000000000007
+00000000-0000-0000-0000-000000000008
+00000000-0000-0000-0000-000000000009
+00000000-0000-0000-0000-00000000000a
+00000000-0000-0000-0000-00000000000b
+00000000-0000-0000-0000-00000000000c
+00000000-0000-0000-0000-00000000000d
+00000000-0000-0000-0000-00000000000e
+00000000-0000-0000-0000-00000000000f
+00000000-0000-0000-0000-000000000100
+00000000-0000-0000-0000-000000000200
+00000000-0000-0000-0000-000000000300
+00000000-0000-0000-0000-000000000400
+00000000-0000-0000-0000-000000000500
+00000000-0000-0000-0000-000000000600
+00000000-0000-0000-0000-000000000700
+00000000-0000-0000-0000-000000000800
+00000000-0000-0000-0000-000000000900
+00000000-0000-0000-0000-000000000a00
+00000000-0000-0000-0000-000000000b00
+00000000-0000-0000-0000-000000000c00
+00000000-0000-0000-0000-000000000d00
+00000000-0000-0000-0000-000000000e00
+00000000-0000-0000-0000-000000000f00
+00000000-0000-0000-0000-000000010000
+00000000-0000-0000-0000-000000020000
+00000000-0000-0000-0000-000000030000
+00000000-0000-0000-0000-000000040000
+00000000-0000-0000-0000-000000050000
+00000000-0000-0000-0000-000000060000
+00000000-0000-0000-0000-000000070000
+00000000-0000-0000-0000-000000080000
+00000000-0000-0000-0000-000000090000
+00000000-0000-0000-0000-0000000a0000
+00000000-0000-0000-0000-0000000b0000
+00000000-0000-0000-0000-0000000c0000
+00000000-0000-0000-0000-0000000d0000
+00000000-0000-0000-0000-0000000e0000
+00000000-0000-0000-0000-0000000f0000
+00000000-0000-0000-0000-000001000000
+00000000-0000-0000-0000-000002000000
+00000000-0000-0000-0000-000003000000
+00000000-0000-0000-0000-000004000000
+00000000-0000-0000-0000-000005000000
+00000000-0000-0000-0000-000006000000
+00000000-0000-0000-0000-000007000000
+00000000-0000-0000-0000-000008000000
+00000000-0000-0000-0000-000009000000
+00000000-0000-0000-0000-00000a000000
+00000000-0000-0000-0000-00000b000000
+00000000-0000-0000-0000-00000c000000
+00000000-0000-0000-0000-00000d000000
+00000000-0000-0000-0000-00000e000000
+00000000-0000-0000-0000-00000f000000
+00000000-0000-0000-0000-000100000000
+00000000-0000-0000-0000-000200000000
+00000000-0000-0000-0000-000300000000
+00000000-0000-0000-0000-000400000000
+00000000-0000-0000-0000-000500000000
+00000000-0000-0000-0000-000600000000
+00000000-0000-0000-0000-000700000000
+00000000-0000-0000-0000-000800000000
+00000000-0000-0000-0000-000900000000
+00000000-0000-0000-0000-000a00000000
+00000000-0000-0000-0000-000b00000000
+00000000-0000-0000-0000-000c00000000
+00000000-0000-0000-0000-000d00000000
+00000000-0000-0000-0000-000e00000000
+00000000-0000-0000-0000-000f00000000
+00000000-0000-0000-0000-010000000000
+00000000-0000-0000-0000-020000000000
+00000000-0000-0000-0000-030000000000
+00000000-0000-0000-0000-040000000000
+00000000-0000-0000-0000-050000000000
+00000000-0000-0000-0000-060000000000
+00000000-0000-0000-0000-070000000000
+00000000-0000-0000-0000-080000000000
+00000000-0000-0000-0000-090000000000
+00000000-0000-0000-0000-0a0000000000
+00000000-0000-0000-0000-0b0000000000
+00000000-0000-0000-0000-0c0000000000
+00000000-0000-0000-0000-0d0000000000
+00000000-0000-0000-0000-0e0000000000
+00000000-0000-0000-0000-0f0000000000
+00000000-0000-0000-0001-000000000000
+00000000-0000-0000-0002-000000000000
+00000000-0000-0000-0003-000000000000
+00000000-0000-0000-0004-000000000000
+00000000-0000-0000-0005-000000000000
+00000000-0000-0000-0006-000000000000
+00000000-0000-0000-0007-000000000000
+00000000-0000-0000-0008-000000000000
+00000000-0000-0000-0009-000000000000
+00000000-0000-0000-000a-000000000000
+00000000-0000-0000-000b-000000000000
+00000000-0000-0000-000c-000000000000
+00000000-0000-0000-000d-000000000000
+00000000-0000-0000-000e-000000000000
+00000000-0000-0000-000f-000000000000
+00000000-0000-0000-0100-000000000000
+00000000-0000-0000-0200-000000000000
+00000000-0000-0000-0300-000000000000
+00000000-0000-0000-0400-000000000000
+00000000-0000-0000-0500-000000000000
+00000000-0000-0000-0600-000000000000
+00000000-0000-0000-0700-000000000000
+00000000-0000-0000-0800-000000000000
+00000000-0000-0000-0900-000000000000
+00000000-0000-0000-0a00-000000000000
+00000000-0000-0000-0b00-000000000000
+00000000-0000-0000-0c00-000000000000
+00000000-0000-0000-0d00-000000000000
+00000000-0000-0000-0e00-000000000000
+00000000-0000-0000-0f00-000000000000
+00000000-0000-0001-0000-000000000000
+00000000-0000-0002-0000-000000000000
+00000000-0000-0003-0000-000000000000
+00000000-0000-0004-0000-000000000000
+00000000-0000-0005-0000-000000000000
+00000000-0000-0006-0000-000000000000
+00000000-0000-0007-0000-000000000000
+00000000-0000-0008-0000-000000000000
+00000000-0000-0009-0000-000000000000
+00000000-0000-000a-0000-000000000000
+00000000-0000-000b-0000-000000000000
+00000000-0000-000c-0000-000000000000
+00000000-0000-000d-0000-000000000000
+00000000-0000-000e-0000-000000000000
+00000000-0000-000f-0000-000000000000
+00000000-0000-0100-0000-000000000000
+00000000-0000-0200-0000-000000000000
+00000000-0000-0300-0000-000000000000
+00000000-0000-0400-0000-000000000000
+00000000-0000-0500-0000-000000000000
+00000000-0000-0600-0000-000000000000
+00000000-0000-0700-0000-000000000000
+00000000-0000-0800-0000-000000000000
+00000000-0000-0900-0000-000000000000
+00000000-0000-0a00-0000-000000000000
+00000000-0000-0b00-0000-000000000000
+00000000-0000-0c00-0000-000000000000
+00000000-0000-0d00-0000-000000000000
+00000000-0000-0e00-0000-000000000000
+00000000-0000-0f00-0000-000000000000
+00000000-0001-0000-0000-000000000000
+00000000-0002-0000-0000-000000000000
+00000000-0003-0000-0000-000000000000
+00000000-0004-0000-0000-000000000000
+00000000-0005-0000-0000-000000000000
+00000000-0006-0000-0000-000000000000
+00000000-0007-0000-0000-000000000000
+00000000-0008-0000-0000-000000000000
+00000000-0009-0000-0000-000000000000
+00000000-000a-0000-0000-000000000000
+00000000-000b-0000-0000-000000000000
+00000000-000c-0000-0000-000000000000
+00000000-000d-0000-0000-000000000000
+00000000-000e-0000-0000-000000000000
+00000000-000f-0000-0000-000000000000
+00000000-0100-0000-0000-000000000000
+00000000-0200-0000-0000-000000000000
+00000000-0300-0000-0000-000000000000
+00000000-0400-0000-0000-000000000000
+00000000-0500-0000-0000-000000000000
+00000000-0600-0000-0000-000000000000
+00000000-0700-0000-0000-000000000000
+00000000-0800-0000-0000-000000000000
+00000000-0900-0000-0000-000000000000
+00000000-0a00-0000-0000-000000000000
+00000000-0b00-0000-0000-000000000000
+00000000-0c00-0000-0000-000000000000
+00000000-0d00-0000-0000-000000000000
+00000000-0e00-0000-0000-000000000000
+00000000-0f00-0000-0000-000000000000
+00000001-0000-0000-0000-000000000000
+00000002-0000-0000-0000-000000000000
+00000003-0000-0000-0000-000000000000
+00000004-0000-0000-0000-000000000000
+00000005-0000-0000-0000-000000000000
+00000006-0000-0000-0000-000000000000
+00000007-0000-0000-0000-000000000000
+00000008-0000-0000-0000-000000000000
+00000009-0000-0000-0000-000000000000
+0000000a-0000-0000-0000-000000000000
+0000000b-0000-0000-0000-000000000000
+0000000c-0000-0000-0000-000000000000
+0000000d-0000-0000-0000-000000000000
+0000000e-0000-0000-0000-000000000000
+0000000f-0000-0000-0000-000000000000
+00000100-0000-0000-0000-000000000000
+00000200-0000-0000-0000-000000000000
+00000300-0000-0000-0000-000000000000
+00000400-0000-0000-0000-000000000000
+00000500-0000-0000-0000-000000000000
+00000600-0000-0000-0000-000000000000
+00000700-0000-0000-0000-000000000000
+00000800-0000-0000-0000-000000000000
+00000900-0000-0000-0000-000000000000
+00000a00-0000-0000-0000-000000000000
+00000b00-0000-0000-0000-000000000000
+00000c00-0000-0000-0000-000000000000
+00000d00-0000-0000-0000-000000000000
+00000e00-0000-0000-0000-000000000000
+00000f00-0000-0000-0000-000000000000
+00010000-0000-0000-0000-000000000000
+00020000-0000-0000-0000-000000000000
+00030000-0000-0000-0000-000000000000
+00040000-0000-0000-0000-000000000000
+00050000-0000-0000-0000-000000000000
+00060000-0000-0000-0000-000000000000
+00070000-0000-0000-0000-000000000000
+00080000-0000-0000-0000-000000000000
+00090000-0000-0000-0000-000000000000
+000a0000-0000-0000-0000-000000000000
+000b0000-0000-0000-0000-000000000000
+000c0000-0000-0000-0000-000000000000
+000d0000-0000-0000-0000-000000000000
+000e0000-0000-0000-0000-000000000000
+000f0000-0000-0000-0000-000000000000
+01000000-0000-0000-0000-000000000000
+02000000-0000-0000-0000-000000000000
+03000000-0000-0000-0000-000000000000
+04000000-0000-0000-0000-000000000000
+05000000-0000-0000-0000-000000000000
+06000000-0000-0000-0000-000000000000
+07000000-0000-0000-0000-000000000000
+08000000-0000-0000-0000-000000000000
+09000000-0000-0000-0000-000000000000
+0a000000-0000-0000-0000-000000000000
+0b000000-0000-0000-0000-000000000000
+0c000000-0000-0000-0000-000000000000
+0d000000-0000-0000-0000-000000000000
+0e000000-0000-0000-0000-000000000000
+0f000000-0000-0000-0000-000000000000
+SELECT * FROM t1 ORDER BY CAST(COALESCE(NULL,a) AS BINARY(16));
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+00000000-0000-0000-0000-000000000003
+00000000-0000-0000-0000-000000000004
+00000000-0000-0000-0000-000000000005
+00000000-0000-0000-0000-000000000006
+00000000-0000-0000-0000-000000000007
+00000000-0000-0000-0000-000000000008
+00000000-0000-0000-0000-000000000009
+00000000-0000-0000-0000-00000000000a
+00000000-0000-0000-0000-00000000000b
+00000000-0000-0000-0000-00000000000c
+00000000-0000-0000-0000-00000000000d
+00000000-0000-0000-0000-00000000000e
+00000000-0000-0000-0000-00000000000f
+00000000-0000-0000-0000-000000000100
+00000000-0000-0000-0000-000000000200
+00000000-0000-0000-0000-000000000300
+00000000-0000-0000-0000-000000000400
+00000000-0000-0000-0000-000000000500
+00000000-0000-0000-0000-000000000600
+00000000-0000-0000-0000-000000000700
+00000000-0000-0000-0000-000000000800
+00000000-0000-0000-0000-000000000900
+00000000-0000-0000-0000-000000000a00
+00000000-0000-0000-0000-000000000b00
+00000000-0000-0000-0000-000000000c00
+00000000-0000-0000-0000-000000000d00
+00000000-0000-0000-0000-000000000e00
+00000000-0000-0000-0000-000000000f00
+00000000-0000-0000-0000-000000010000
+00000000-0000-0000-0000-000000020000
+00000000-0000-0000-0000-000000030000
+00000000-0000-0000-0000-000000040000
+00000000-0000-0000-0000-000000050000
+00000000-0000-0000-0000-000000060000
+00000000-0000-0000-0000-000000070000
+00000000-0000-0000-0000-000000080000
+00000000-0000-0000-0000-000000090000
+00000000-0000-0000-0000-0000000a0000
+00000000-0000-0000-0000-0000000b0000
+00000000-0000-0000-0000-0000000c0000
+00000000-0000-0000-0000-0000000d0000
+00000000-0000-0000-0000-0000000e0000
+00000000-0000-0000-0000-0000000f0000
+00000000-0000-0000-0000-000001000000
+00000000-0000-0000-0000-000002000000
+00000000-0000-0000-0000-000003000000
+00000000-0000-0000-0000-000004000000
+00000000-0000-0000-0000-000005000000
+00000000-0000-0000-0000-000006000000
+00000000-0000-0000-0000-000007000000
+00000000-0000-0000-0000-000008000000
+00000000-0000-0000-0000-000009000000
+00000000-0000-0000-0000-00000a000000
+00000000-0000-0000-0000-00000b000000
+00000000-0000-0000-0000-00000c000000
+00000000-0000-0000-0000-00000d000000
+00000000-0000-0000-0000-00000e000000
+00000000-0000-0000-0000-00000f000000
+00000000-0000-0000-0000-000100000000
+00000000-0000-0000-0000-000200000000
+00000000-0000-0000-0000-000300000000
+00000000-0000-0000-0000-000400000000
+00000000-0000-0000-0000-000500000000
+00000000-0000-0000-0000-000600000000
+00000000-0000-0000-0000-000700000000
+00000000-0000-0000-0000-000800000000
+00000000-0000-0000-0000-000900000000
+00000000-0000-0000-0000-000a00000000
+00000000-0000-0000-0000-000b00000000
+00000000-0000-0000-0000-000c00000000
+00000000-0000-0000-0000-000d00000000
+00000000-0000-0000-0000-000e00000000
+00000000-0000-0000-0000-000f00000000
+00000000-0000-0000-0000-010000000000
+00000000-0000-0000-0000-020000000000
+00000000-0000-0000-0000-030000000000
+00000000-0000-0000-0000-040000000000
+00000000-0000-0000-0000-050000000000
+00000000-0000-0000-0000-060000000000
+00000000-0000-0000-0000-070000000000
+00000000-0000-0000-0000-080000000000
+00000000-0000-0000-0000-090000000000
+00000000-0000-0000-0000-0a0000000000
+00000000-0000-0000-0000-0b0000000000
+00000000-0000-0000-0000-0c0000000000
+00000000-0000-0000-0000-0d0000000000
+00000000-0000-0000-0000-0e0000000000
+00000000-0000-0000-0000-0f0000000000
+00000000-0000-0000-0001-000000000000
+00000000-0000-0000-0002-000000000000
+00000000-0000-0000-0003-000000000000
+00000000-0000-0000-0004-000000000000
+00000000-0000-0000-0005-000000000000
+00000000-0000-0000-0006-000000000000
+00000000-0000-0000-0007-000000000000
+00000000-0000-0000-0008-000000000000
+00000000-0000-0000-0009-000000000000
+00000000-0000-0000-000a-000000000000
+00000000-0000-0000-000b-000000000000
+00000000-0000-0000-000c-000000000000
+00000000-0000-0000-000d-000000000000
+00000000-0000-0000-000e-000000000000
+00000000-0000-0000-000f-000000000000
+00000000-0000-0000-0100-000000000000
+00000000-0000-0000-0200-000000000000
+00000000-0000-0000-0300-000000000000
+00000000-0000-0000-0400-000000000000
+00000000-0000-0000-0500-000000000000
+00000000-0000-0000-0600-000000000000
+00000000-0000-0000-0700-000000000000
+00000000-0000-0000-0800-000000000000
+00000000-0000-0000-0900-000000000000
+00000000-0000-0000-0a00-000000000000
+00000000-0000-0000-0b00-000000000000
+00000000-0000-0000-0c00-000000000000
+00000000-0000-0000-0d00-000000000000
+00000000-0000-0000-0e00-000000000000
+00000000-0000-0000-0f00-000000000000
+00000000-0000-0001-0000-000000000000
+00000000-0000-0002-0000-000000000000
+00000000-0000-0003-0000-000000000000
+00000000-0000-0004-0000-000000000000
+00000000-0000-0005-0000-000000000000
+00000000-0000-0006-0000-000000000000
+00000000-0000-0007-0000-000000000000
+00000000-0000-0008-0000-000000000000
+00000000-0000-0009-0000-000000000000
+00000000-0000-000a-0000-000000000000
+00000000-0000-000b-0000-000000000000
+00000000-0000-000c-0000-000000000000
+00000000-0000-000d-0000-000000000000
+00000000-0000-000e-0000-000000000000
+00000000-0000-000f-0000-000000000000
+00000000-0000-0100-0000-000000000000
+00000000-0000-0200-0000-000000000000
+00000000-0000-0300-0000-000000000000
+00000000-0000-0400-0000-000000000000
+00000000-0000-0500-0000-000000000000
+00000000-0000-0600-0000-000000000000
+00000000-0000-0700-0000-000000000000
+00000000-0000-0800-0000-000000000000
+00000000-0000-0900-0000-000000000000
+00000000-0000-0a00-0000-000000000000
+00000000-0000-0b00-0000-000000000000
+00000000-0000-0c00-0000-000000000000
+00000000-0000-0d00-0000-000000000000
+00000000-0000-0e00-0000-000000000000
+00000000-0000-0f00-0000-000000000000
+00000000-0001-0000-0000-000000000000
+00000000-0002-0000-0000-000000000000
+00000000-0003-0000-0000-000000000000
+00000000-0004-0000-0000-000000000000
+00000000-0005-0000-0000-000000000000
+00000000-0006-0000-0000-000000000000
+00000000-0007-0000-0000-000000000000
+00000000-0008-0000-0000-000000000000
+00000000-0009-0000-0000-000000000000
+00000000-000a-0000-0000-000000000000
+00000000-000b-0000-0000-000000000000
+00000000-000c-0000-0000-000000000000
+00000000-000d-0000-0000-000000000000
+00000000-000e-0000-0000-000000000000
+00000000-000f-0000-0000-000000000000
+00000000-0100-0000-0000-000000000000
+00000000-0200-0000-0000-000000000000
+00000000-0300-0000-0000-000000000000
+00000000-0400-0000-0000-000000000000
+00000000-0500-0000-0000-000000000000
+00000000-0600-0000-0000-000000000000
+00000000-0700-0000-0000-000000000000
+00000000-0800-0000-0000-000000000000
+00000000-0900-0000-0000-000000000000
+00000000-0a00-0000-0000-000000000000
+00000000-0b00-0000-0000-000000000000
+00000000-0c00-0000-0000-000000000000
+00000000-0d00-0000-0000-000000000000
+00000000-0e00-0000-0000-000000000000
+00000000-0f00-0000-0000-000000000000
+00000001-0000-0000-0000-000000000000
+00000002-0000-0000-0000-000000000000
+00000003-0000-0000-0000-000000000000
+00000004-0000-0000-0000-000000000000
+00000005-0000-0000-0000-000000000000
+00000006-0000-0000-0000-000000000000
+00000007-0000-0000-0000-000000000000
+00000008-0000-0000-0000-000000000000
+00000009-0000-0000-0000-000000000000
+0000000a-0000-0000-0000-000000000000
+0000000b-0000-0000-0000-000000000000
+0000000c-0000-0000-0000-000000000000
+0000000d-0000-0000-0000-000000000000
+0000000e-0000-0000-0000-000000000000
+0000000f-0000-0000-0000-000000000000
+00000100-0000-0000-0000-000000000000
+00000200-0000-0000-0000-000000000000
+00000300-0000-0000-0000-000000000000
+00000400-0000-0000-0000-000000000000
+00000500-0000-0000-0000-000000000000
+00000600-0000-0000-0000-000000000000
+00000700-0000-0000-0000-000000000000
+00000800-0000-0000-0000-000000000000
+00000900-0000-0000-0000-000000000000
+00000a00-0000-0000-0000-000000000000
+00000b00-0000-0000-0000-000000000000
+00000c00-0000-0000-0000-000000000000
+00000d00-0000-0000-0000-000000000000
+00000e00-0000-0000-0000-000000000000
+00000f00-0000-0000-0000-000000000000
+00010000-0000-0000-0000-000000000000
+00020000-0000-0000-0000-000000000000
+00030000-0000-0000-0000-000000000000
+00040000-0000-0000-0000-000000000000
+00050000-0000-0000-0000-000000000000
+00060000-0000-0000-0000-000000000000
+00070000-0000-0000-0000-000000000000
+00080000-0000-0000-0000-000000000000
+00090000-0000-0000-0000-000000000000
+000a0000-0000-0000-0000-000000000000
+000b0000-0000-0000-0000-000000000000
+000c0000-0000-0000-0000-000000000000
+000d0000-0000-0000-0000-000000000000
+000e0000-0000-0000-0000-000000000000
+000f0000-0000-0000-0000-000000000000
+01000000-0000-0000-0000-000000000000
+02000000-0000-0000-0000-000000000000
+03000000-0000-0000-0000-000000000000
+04000000-0000-0000-0000-000000000000
+05000000-0000-0000-0000-000000000000
+06000000-0000-0000-0000-000000000000
+07000000-0000-0000-0000-000000000000
+08000000-0000-0000-0000-000000000000
+09000000-0000-0000-0000-000000000000
+0a000000-0000-0000-0000-000000000000
+0b000000-0000-0000-0000-000000000000
+0c000000-0000-0000-0000-000000000000
+0d000000-0000-0000-0000-000000000000
+0e000000-0000-0000-0000-000000000000
+0f000000-0000-0000-0000-000000000000
+DROP TABLE t1;
+#
+# cmp_item_uuid: IN for non-constants
+#
+CREATE TABLE t1 (a UUID, b UUID);
+INSERT INTO t1 VALUES
+(
+'00000000-0000-0000-0000-000000000001',
+'00000000-0000-0000-0000-000000000002'
+);
+SELECT * FROM t1 WHERE '00000000-0000-0000-0000-000000000000' IN (a, b);
+a b
+SELECT * FROM t1 WHERE '00000000-0000-0000-0000-000000000001' IN (a, b);
+a b
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000002
+SELECT * FROM t1 WHERE '00-000000-0000-0000-0000-000000000001' IN (a, b);
+a b
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000002
+SELECT * FROM t1 WHERE '00-00-0000-0000-0000-0000-000000000001' IN (a, b);
+a b
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000002
+DROP TABLE t1;
+#
+# cmp_item_uuid: DECODE_ORACLE
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+(NULL),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT a, DECODE_ORACLE(a, '00000000-0000-0000-0000-000000000002', '01') AS d FROM t1;
+a d
+NULL NULL
+00000000-0000-0000-0000-000000000001 NULL
+00000000-0000-0000-0000-000000000002 01
+SELECT
+a,
+DECODE_ORACLE(a, '00000000-0000-0000-0000-000000000001', '01') AS d0,
+DECODE_ORACLE(a, NULL, '<NULL>', '00000000-0000-0000-0000-000000000001', '01') AS d1,
+DECODE_ORACLE(a, 'garbage', '<NULL>', '00000000-0000-0000-0000-000000000001', '01') AS d2
+FROM t1;
+a d0 d1 d2
+NULL NULL <NULL> <NULL>
+00000000-0000-0000-0000-000000000001 01 01 01
+00000000-0000-0000-0000-000000000002 NULL NULL NULL
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+DROP TABLE t1;
+#
+# CASE abbreviations
+#
+CREATE TABLE t1 (
+c UUID,
+c_char CHAR(32),
+c_varchar VARCHAR(32),
+c_tinytext TINYTEXT,
+c_text TEXT,
+c_mediumtext TEXT,
+c_longtext LONGTEXT
+);
+CREATE TABLE t2 AS SELECT
+COALESCE(c, c_char),
+COALESCE(c, c_varchar),
+COALESCE(c, c_tinytext),
+COALESCE(c, c_text),
+COALESCE(c, c_mediumtext),
+COALESCE(c, c_longtext)
+FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `COALESCE(c, c_char)` uuid DEFAULT NULL,
+ `COALESCE(c, c_varchar)` uuid DEFAULT NULL,
+ `COALESCE(c, c_tinytext)` uuid DEFAULT NULL,
+ `COALESCE(c, c_text)` uuid DEFAULT NULL,
+ `COALESCE(c, c_mediumtext)` uuid DEFAULT NULL,
+ `COALESCE(c, c_longtext)` uuid DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+CREATE TABLE t2 AS SELECT
+LEAST(c, c_char),
+LEAST(c, c_varchar),
+LEAST(c, c_tinytext),
+LEAST(c, c_text),
+LEAST(c, c_mediumtext),
+LEAST(c, c_longtext)
+FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `LEAST(c, c_char)` uuid DEFAULT NULL,
+ `LEAST(c, c_varchar)` uuid DEFAULT NULL,
+ `LEAST(c, c_tinytext)` uuid DEFAULT NULL,
+ `LEAST(c, c_text)` uuid DEFAULT NULL,
+ `LEAST(c, c_mediumtext)` uuid DEFAULT NULL,
+ `LEAST(c, c_longtext)` uuid DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+(NULL),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT COALESCE(a, '00000000-0000-0000-0000-000000000000') FROM t1 ORDER BY a;
+COALESCE(a, '00000000-0000-0000-0000-000000000000')
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+SELECT
+a,
+LEAST(a,'00000000-0000-0000-0000-000000000000'),
+LEAST(a,'00000000-0000-0000-0000-00000000000f')
+FROM t1 ORDER BY a;
+a LEAST(a,'00000000-0000-0000-0000-000000000000') LEAST(a,'00000000-0000-0000-0000-00000000000f')
+NULL NULL NULL
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000002
+SELECT
+a,
+GREATEST(a,'00000000-0000-0000-0000-000000000000'),
+GREATEST(a,'00000000-0000-0000-0000-00000000000f')
+FROM t1 ORDER BY a;
+a GREATEST(a,'00000000-0000-0000-0000-000000000000') GREATEST(a,'00000000-0000-0000-0000-00000000000f')
+NULL NULL NULL
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-00000000000f
+00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-00000000000f
+CREATE TABLE t2 AS SELECT
+COALESCE(a, '00000000-0000-0000-0000-000000000000'),
+LEAST(a,'00000000-0000-0000-0000-000000000000'),
+GREATEST(a,'00000000-0000-0000-0000-000000000000')
+FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `COALESCE(a, '00000000-0000-0000-0000-000000000000')` uuid DEFAULT NULL,
+ `LEAST(a,'00000000-0000-0000-0000-000000000000')` uuid DEFAULT NULL,
+ `GREATEST(a,'00000000-0000-0000-0000-000000000000')` uuid DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+SELECT COALESCE(a, 0x00000000000000000000000000000000) FROM t1 ORDER BY a;
+COALESCE(a, 0x00000000000000000000000000000000)
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+SELECT
+a,
+LEAST(a, 0x00000000000000000000000000000000),
+LEAST(a, 0x0000000000000000000000000000000f)
+FROM t1 ORDER BY a;
+a LEAST(a, 0x00000000000000000000000000000000) LEAST(a, 0x0000000000000000000000000000000f)
+NULL NULL NULL
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000002
+SELECT
+a,
+GREATEST(a, 0x00000000000000000000000000000000),
+GREATEST(a, 0x0000000000000000000000000000000f)
+FROM t1 ORDER BY a;
+a GREATEST(a, 0x00000000000000000000000000000000) GREATEST(a, 0x0000000000000000000000000000000f)
+NULL NULL NULL
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-00000000000f
+00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-00000000000f
+CREATE TABLE t2 AS SELECT
+COALESCE(a, 0x00000000000000000000000000000000),
+LEAST(a,0x00000000000000000000000000000000),
+GREATEST(a,0x00000000000000000000000000000000)
+FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `COALESCE(a, 0x00000000000000000000000000000000)` uuid DEFAULT NULL,
+ `LEAST(a,0x00000000000000000000000000000000)` uuid DEFAULT NULL,
+ `GREATEST(a,0x00000000000000000000000000000000)` uuid DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+SELECT COALESCE(a, 10) FROM t1;
+ERROR HY000: Illegal parameter data types uuid and int for operation 'coalesce'
+SELECT LEAST(a, 10) FROM t1;
+ERROR HY000: Illegal parameter data types uuid and int for operation 'least'
+SELECT GREATEST(a, 10) FROM t1;
+ERROR HY000: Illegal parameter data types uuid and int for operation 'greatest'
+DROP TABLE t1;
+SELECT COALESCE('garbage', CAST('::1' AS UUID));
+COALESCE('garbage', CAST('::1' AS UUID))
+NULL
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: '::1'
+SELECT COALESCE(0x01, CAST('::1' AS UUID));
+COALESCE(0x01, CAST('::1' AS UUID))
+NULL
+Warnings:
+Warning 1292 Incorrect uuid value: '\x01'
+Warning 1292 Incorrect uuid value: '::1'
+#
+# Uniqueness
+#
+CREATE TABLE t1 (a UUID NOT NULL PRIMARY KEY);
+INSERT INTO t1 VALUES
+('41000000-0000-0000-0000-000000000001'),
+('61000000-0000-0000-0000-000000000001');
+INSERT INTO t1 VALUES ('41000000-0000-0000-0000-000000000001');
+ERROR 23000: Duplicate entry '41000000-0000-0000-0000-000000000001' for key 'PRIMARY'
+SELECT * FROM t1;
+a
+41000000-0000-0000-0000-000000000001
+61000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+#
+# Indexes
+#
+CREATE TABLE t1 (a UUID, KEY(a(1)));
+ERROR HY000: Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys
+#
+# Explicit CAST on INSERT
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES (CAST('10000000-0000-0000-0000-000000000001' AS UUID));
+INSERT INTO t1 VALUES (CAST('10000000-0000-0000-0000-000000000002' AS UUID));
+INSERT INTO t1 VALUES (CAST('10000000-0000-0000-0000-000000000003' AS UUID));
+INSERT INTO t1 VALUES (CAST(CONCAT('2','0000000-0000-0000-0000-000000000001') AS UUID));
+INSERT INTO t1 VALUES (CAST(CONCAT('2','0000000-0000-0000-0000-000000000002') AS UUID));
+INSERT INTO t1 VALUES (CAST(CONCAT('2','0000000-0000-0000-0000-000000000003') AS UUID));
+SELECT * FROM t1 ORDER BY a;
+a
+10000000-0000-0000-0000-000000000001
+20000000-0000-0000-0000-000000000001
+10000000-0000-0000-0000-000000000002
+20000000-0000-0000-0000-000000000002
+10000000-0000-0000-0000-000000000003
+20000000-0000-0000-0000-000000000003
+DROP TABLE t1;
+#
+# Explicit CAST and implicit CAST on ALTER
+#
+CREATE TABLE t1 (a VARCHAR(64));
+INSERT INTO t1 VALUES
+('garbage'),
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('ffff0000-0000-0000-0000-000000000001'),
+('ffff0000-0000-0000-0000-000000000002');
+SELECT a, CAST(a AS UUID) FROM t1 ORDER BY a;
+a CAST(a AS UUID)
+00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000001 ffff0000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000002 ffff0000-0000-0000-0000-000000000002
+garbage NULL
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT a, CAST(a AS UUID) FROM t1 ORDER BY CAST(a AS UUID);
+a CAST(a AS UUID)
+garbage NULL
+00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000001 ffff0000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000002 ffff0000-0000-0000-0000-000000000002
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+ALTER TABLE t1 MODIFY a UUID;
+ERROR 22007: Incorrect uuid value: 'garbage' for column `test`.`t1`.`a` at row 1
+SET sql_mode='';
+ALTER TABLE t1 MODIFY a UUID;
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage' for column `test`.`t1`.`a` at row 1
+SET sql_mode=DEFAULT;
+SELECT * FROM t1 ORDER BY a;
+a
+NULL
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000002
+DROP TABLE t1;
+CREATE TABLE t1 (a BINARY(16));
+INSERT INTO t1 VALUES (0x00000000000000000000000000000000);
+INSERT INTO t1 VALUES (0x00000000000000000000000000000001);
+INSERT INTO t1 VALUES (0xffff0000000000000000000000000001);
+INSERT INTO t1 VALUES (0xffff0000000000000000000000000002);
+SELECT HEX(a), CAST(a AS UUID) FROM t1 ORDER BY a;
+HEX(a) CAST(a AS UUID)
+00000000000000000000000000000000 00000000-0000-0000-0000-000000000000
+00000000000000000000000000000001 00000000-0000-0000-0000-000000000001
+FFFF0000000000000000000000000001 ffff0000-0000-0000-0000-000000000001
+FFFF0000000000000000000000000002 ffff0000-0000-0000-0000-000000000002
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1 ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000002
+DROP TABLE t1;
+#
+# INSERT..SELECT, same data types
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+CREATE TABLE t2 (a UUID);
+INSERT INTO t2 SELECT a FROM t1;
+SELECT * FROM t2;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+DROP TABLE t1,t2;
+#
+# Implicit CAST on INSERT..SELECT, text format
+#
+CREATE TABLE t1 (a VARCHAR(64));
+INSERT INTO t1 VALUES
+('garbage'),
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('ffff0000-0000-0000-0000-000000000001'),
+('ffff0000-0000-0000-0000-000000000002');
+CREATE TABLE t2 (a UUID);
+INSERT INTO t2 SELECT a FROM t1;
+ERROR 22007: Incorrect uuid value: 'garbage' for column `test`.`t2`.`a` at row 1
+SET sql_mode='';
+INSERT INTO t2 SELECT a FROM t1;
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage' for column `test`.`t2`.`a` at row 1
+SELECT * FROM t2 ORDER BY a;
+a
+NULL
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000002
+SET sql_mode=DEFAULT;
+DROP TABLE t2;
+CREATE TABLE t2 (a UUID NOT NULL);
+INSERT INTO t2 SELECT a FROM t1;
+ERROR 22007: Incorrect uuid value: 'garbage' for column `test`.`t2`.`a` at row 1
+SET sql_mode='';
+INSERT INTO t2 SELECT a FROM t1;
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage' for column `test`.`t2`.`a` at row 1
+SELECT * FROM t2 ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000002
+SET sql_mode=DEFAULT;
+DROP TABLE t2;
+DROP TABLE t1;
+#
+# Implicit CAST on INSERT..SELECT, binary format
+#
+CREATE TABLE t1 (a BINARY(16));
+INSERT INTO t1 VALUES (0x00000000000000000000000000000000);
+INSERT INTO t1 VALUES (0x00000000000000000000000000000001);
+INSERT INTO t1 VALUES (0xffff0000000000000000000000000001);
+INSERT INTO t1 VALUES (0xffff0000000000000000000000000002);
+CREATE TABLE t2 (a UUID);
+INSERT INTO t2 SELECT a FROM t1;
+SELECT a FROM t2 ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000001
+ffff0000-0000-0000-0000-000000000002
+DROP TABLE t1,t2;
+#
+# CAST to other data types
+#
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS DOUBLE);
+ERROR HY000: Illegal parameter data type uuid for operation 'double_typecast'
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS FLOAT);
+ERROR HY000: Illegal parameter data type uuid for operation 'float_typecast'
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS DECIMAL);
+ERROR HY000: Illegal parameter data type uuid for operation 'decimal_typecast'
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS SIGNED);
+ERROR HY000: Illegal parameter data type uuid for operation 'cast_as_signed'
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS UNSIGNED);
+ERROR HY000: Illegal parameter data type uuid for operation 'cast_as_unsigned'
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS TIME);
+ERROR HY000: Illegal parameter data type uuid for operation 'cast_as_time'
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS DATE);
+ERROR HY000: Illegal parameter data type uuid for operation 'cast_as_date'
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS DATETIME);
+ERROR HY000: Illegal parameter data type uuid for operation 'cast_as_datetime'
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS CHAR);
+CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS CHAR)
+00000000-0000-0000-0000-000000000000
+CREATE TABLE t1 AS SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS CHAR) AS a;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` varchar(36) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff');
+CREATE TABLE t2 AS SELECT
+CAST(a AS CHAR),
+CAST(a AS CHAR(36)),
+CAST(a AS CHAR(530)),
+CAST(a AS CHAR(65535)),
+CAST(a AS CHAR(66000)),
+CAST(a AS CHAR(16777215)),
+CAST(a AS CHAR(16777216))
+FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `CAST(a AS CHAR)` varchar(36) DEFAULT NULL,
+ `CAST(a AS CHAR(36))` varchar(36) DEFAULT NULL,
+ `CAST(a AS CHAR(530))` text DEFAULT NULL,
+ `CAST(a AS CHAR(65535))` text DEFAULT NULL,
+ `CAST(a AS CHAR(66000))` mediumtext DEFAULT NULL,
+ `CAST(a AS CHAR(16777215))` mediumtext DEFAULT NULL,
+ `CAST(a AS CHAR(16777216))` longtext DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+CAST(a AS CHAR) ffffffff-ffff-ffff-ffff-ffffffffffff
+CAST(a AS CHAR(36)) ffffffff-ffff-ffff-ffff-ffffffffffff
+CAST(a AS CHAR(530)) ffffffff-ffff-ffff-ffff-ffffffffffff
+CAST(a AS CHAR(65535)) ffffffff-ffff-ffff-ffff-ffffffffffff
+CAST(a AS CHAR(66000)) ffffffff-ffff-ffff-ffff-ffffffffffff
+CAST(a AS CHAR(16777215)) ffffffff-ffff-ffff-ffff-ffffffffffff
+CAST(a AS CHAR(16777216)) ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t2;
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff');
+CREATE TABLE t2 AS SELECT
+CAST(a AS BINARY(4)) AS cb4,
+CAST(a AS BINARY) AS cb,
+CAST(a AS BINARY(16)) AS cb16,
+CAST(a AS BINARY(32)) AS cb32,
+CAST(a AS BINARY(530)) AS cb530,
+CAST(a AS BINARY(65535)) AS cb65535,
+CAST(a AS BINARY(66000)) AS cb66000,
+CAST(a AS BINARY(16777215)) AS cb16777215,
+CAST(a AS BINARY(16777216)) AS cb16777216
+FROM t1 LIMIT 0;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `cb4` binary(4) DEFAULT NULL,
+ `cb` binary(16) DEFAULT NULL,
+ `cb16` binary(16) DEFAULT NULL,
+ `cb32` binary(32) DEFAULT NULL,
+ `cb530` varbinary(530) DEFAULT NULL,
+ `cb65535` blob DEFAULT NULL,
+ `cb66000` mediumblob DEFAULT NULL,
+ `cb16777215` mediumblob DEFAULT NULL,
+ `cb16777216` longblob DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+CREATE TABLE t2 AS SELECT
+CAST(a AS BINARY(4)) AS cb4,
+CAST(a AS BINARY) AS cb,
+CAST(a AS BINARY(16)) AS cb16,
+CAST(a AS BINARY(32)) AS cb32,
+CAST(a AS BINARY(530)) AS cb530,
+CAST(a AS BINARY(65535)) AS cb65535
+FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `cb4` binary(4) DEFAULT NULL,
+ `cb` binary(16) DEFAULT NULL,
+ `cb16` binary(16) DEFAULT NULL,
+ `cb32` binary(32) DEFAULT NULL,
+ `cb530` varbinary(530) DEFAULT NULL,
+ `cb65535` blob DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT
+HEX(cb4),
+HEX(cb),
+HEX(cb16),
+HEX(cb32),
+LENGTH(cb530),
+LENGTH(cb65535)
+FROM t2;
+HEX(cb4) FFFFFFFF
+HEX(cb) FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+HEX(cb16) FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+HEX(cb32) FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000
+LENGTH(cb530) 530
+LENGTH(cb65535) 65535
+DROP TABLE t2;
+DROP TABLE t1;
+#
+# Implicit conversion to other types in INSERT
+#
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t1`.`a`
+DROP TABLE t1;
+CREATE TABLE t1 (a DOUBLE);
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t1`.`a`
+DROP TABLE t1;
+CREATE TABLE t1 (a DECIMAL(32,0));
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t1`.`a`
+DROP TABLE t1;
+CREATE TABLE t1 (a VARCHAR(64));
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+DROP TABLE t1;
+CREATE TABLE t1 (a TEXT);
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+DROP TABLE t1;
+#
+# Boolean context
+#
+SELECT
+CAST('00000000-0000-0000-0000-000000000000' AS UUID) IS TRUE,
+CAST('00000000-0000-0000-0000-000000000000' AS UUID) IS FALSE,
+CAST('00000000-0000-0000-0000-000000000001' AS UUID) IS TRUE,
+CAST('00000000-0000-0000-0000-000000000001' AS UUID) IS FALSE;
+CAST('00000000-0000-0000-0000-000000000000' AS UUID) IS TRUE CAST('00000000-0000-0000-0000-000000000000' AS UUID) IS FALSE CAST('00000000-0000-0000-0000-000000000001' AS UUID) IS TRUE CAST('00000000-0000-0000-0000-000000000001' AS UUID) IS FALSE
+0 1 1 0
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001');
+SELECT a, a IS TRUE, a IS FALSE FROM t1 ORDER BY a;
+a a IS TRUE a IS FALSE
+00000000-0000-0000-0000-000000000000 0 1
+00000000-0000-0000-0000-000000000001 1 0
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT * FROM t1 WHERE a;
+ERROR HY000: Illegal parameter data types uuid and bigint for operation '<>'
+DROP TABLE t1;
+#
+# GROUP BY
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-0000-00000000');
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-0000-00000001'),
+('00000000-0000-0000-0000-0000-0000-0001');
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-0000-00000002'),
+('00000000-0000-0000-0000-0000-0000-0002');
+SELECT a, COUNT(*) FROM t1 GROUP BY a;
+a COUNT(*)
+00000000-0000-0000-0000-000000000000 2
+00000000-0000-0000-0000-000000000001 3
+00000000-0000-0000-0000-000000000002 4
+DROP TABLE t1;
+#
+# Aggregate functions
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000000');
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-0000-00000001'),
+('00000000-0000-0000-0000-0000-0000-0001');
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000002');
+SELECT MIN(a),MAX(a) FROM t1;
+MIN(a) MAX(a)
+00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000002
+CREATE TABLE t2 AS SELECT MIN(a), MAX(a) FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `MIN(a)` uuid DEFAULT NULL,
+ `MAX(a)` uuid DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t2;
+MIN(a) MAX(a)
+00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000002
+DROP TABLE t2;
+SELECT AVG(a) FROM t1;
+ERROR HY000: Illegal parameter data type uuid for operation 'avg('
+SELECT AVG(DISTINCT a) FROM t1;
+ERROR HY000: Illegal parameter data type uuid for operation 'avg(distinct '
+SELECT SUM(a) FROM t1;
+ERROR HY000: Illegal parameter data type uuid for operation 'sum('
+SELECT SUM(DISTINCT a) FROM t1;
+ERROR HY000: Illegal parameter data type uuid for operation 'sum(distinct '
+SELECT STDDEV(a) FROM t1;
+ERROR HY000: Illegal parameter data type uuid for operation 'std('
+SELECT GROUP_CONCAT(a ORDER BY a) FROM t1;
+GROUP_CONCAT(a ORDER BY a)
+00000000-0000-0000-0000-000000000000,00000000-0000-0000-0000-000000000000,00000000-0000-0000-0000-000000000001,00000000-0000-0000-0000-000000000001,00000000-0000-0000-0000-000000000001,00000000-0000-0000-0000-000000000002,00000000-0000-0000-0000-000000000002,00000000-0000-0000-0000-000000000002,00000000-0000-0000-0000-000000000002
+SELECT a, GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a;
+a GROUP_CONCAT(a ORDER BY a)
+00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000,00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000001,00000000-0000-0000-0000-000000000001,00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-000000000002,00000000-0000-0000-0000-000000000002,00000000-0000-0000-0000-000000000002,00000000-0000-0000-0000-000000000002
+DROP TABLE t1;
+#
+# Window functions
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000003'),
+('00000000-0000-0000-0000-000000000004');
+SELECT
+a,
+LAG(a) OVER (ORDER BY a),
+LEAD(a) OVER (ORDER BY a)
+FROM t1 ORDER BY a;
+a LAG(a) OVER (ORDER BY a) LEAD(a) OVER (ORDER BY a)
+00000000-0000-0000-0000-000000000001 NULL 00000000-0000-0000-0000-000000000002
+00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000003
+00000000-0000-0000-0000-000000000003 00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-000000000004
+00000000-0000-0000-0000-000000000004 00000000-0000-0000-0000-000000000003 NULL
+SELECT
+a,
+FIRST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING),
+LAST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
+FROM t1 ORDER BY a;
+a FIRST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) LAST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
+00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000002
+00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-000000000001 00000000-0000-0000-0000-000000000003
+00000000-0000-0000-0000-000000000003 00000000-0000-0000-0000-000000000002 00000000-0000-0000-0000-000000000004
+00000000-0000-0000-0000-000000000004 00000000-0000-0000-0000-000000000003 00000000-0000-0000-0000-000000000004
+DROP TABLE t1;
+#
+# Prepared statements
+#
+EXECUTE IMMEDIATE 'CREATE TABLE t1 AS SELECT ? AS a'
+ USING CAST('00000000-0000-0000-0000-000000000000' AS UUID);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid NOT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)'
+ USING '00000000-0000-0000-0000-000000000001';
+EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)'
+ USING CAST('00000000-0000-0000-0000-000000000002' AS UUID);
+EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)'
+ USING 0x00000000000000000000000000000003;
+SELECT a FROM t1 ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+00000000-0000-0000-0000-000000000003
+EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?'
+ USING '00000000-0000-0000-0000-000000000001';
+a
+00000000-0000-0000-0000-000000000001
+EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?'
+ USING CAST('00000000-0000-0000-0000-000000000002' AS UUID);
+a
+00000000-0000-0000-0000-000000000002
+EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?'
+ USING 0x00000000000000000000000000000003;
+a
+00000000-0000-0000-0000-000000000003
+DROP TABLE t1;
+#
+# Character set and collation aggregation
+#
+CREATE TABLE t1 (a UUID);
+CREATE TABLE t2 AS SELECT
+CONCAT(a) AS c1,
+CONCAT(CAST('00000000-0000-0000-0000-000000000000' AS UUID)) AS c2
+FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `c1` varchar(36) DEFAULT NULL,
+ `c2` varchar(36) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+CREATE TABLE t2 AS SELECT
+CONCAT(_utf8'1', LEFT(a,35)) AS c1,
+CONCAT(_utf8'1', LEFT(CAST('00000000-0000-0000-0000-000000000000' AS UUID),35)) AS c2,
+CONCAT(_utf8'1', LEFT(COALESCE(a),35)) AS c3
+FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `c1` varchar(36) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
+ `c2` varchar(36) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
+ `c3` varchar(36) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+CREATE TABLE t2 AS SELECT
+CONCAT(_latin1'1', LEFT(a,35)) AS c1,
+CONCAT(_latin1'1', LEFT(CAST('00000000-0000-0000-0000-000000000000' AS UUID),35)) AS c2,
+CONCAT(_latin1'1', LEFT(COALESCE(a),35)) AS c3
+FROM t1;
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `c1` varchar(36) DEFAULT NULL,
+ `c2` varchar(36) DEFAULT NULL,
+ `c3` varchar(36) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+DROP TABLE t2;
+DROP TABLE t1;
+#
+# UNION
+#
+CREATE TABLE t1 AS
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS c
+UNION
+SELECT CAST('00000000-0000-0000-0000-000000000001' AS UUID);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `c` uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t1 ORDER BY c;
+c
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE TABLE t1 AS
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS c
+UNION
+SELECT '00000000-0000-0000-0000-000000000001';
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `c` uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t1 ORDER BY c;
+c
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE TABLE t1 AS
+SELECT '00000000-0000-0000-0000-000000000000' AS c
+UNION
+SELECT CAST('00000000-0000-0000-0000-000000000001' AS UUID);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `c` uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t1 ORDER BY c;
+c
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE TABLE t1 AS
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS c
+UNION
+SELECT 0x00000000000000000000000000000001;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `c` uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+SELECT * FROM t1 ORDER BY c;
+c
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE TABLE t1 AS
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS c
+UNION
+SELECT 1;
+ERROR HY000: Illegal parameter data types uuid and int for operation 'UNION'
+#
+# Unary operators
+#
+SELECT -CAST('00000000-0000-0000-0000-000000000000' AS UUID);
+ERROR HY000: Illegal parameter data type uuid for operation '-'
+SELECT ABS(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Illegal parameter data type uuid for operation 'abs'
+SELECT ROUND(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Illegal parameter data type uuid for operation 'round'
+SELECT CEILING(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Illegal parameter data type uuid for operation 'ceiling'
+SELECT FLOOR(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Illegal parameter data type uuid for operation 'floor'
+#
+# Arithmetic operators
+#
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) + 1;
+ERROR HY000: Illegal parameter data types uuid and int for operation '+'
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) - 1;
+ERROR HY000: Illegal parameter data types uuid and int for operation '-'
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) * 1;
+ERROR HY000: Illegal parameter data types uuid and int for operation '*'
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) / 1;
+ERROR HY000: Illegal parameter data types uuid and int for operation '/'
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) MOD 1;
+ERROR HY000: Illegal parameter data types uuid and int for operation 'MOD'
+#
+# Misc
+#
+SELECT RAND(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Illegal parameter data type uuid for operation 'rand'
+SELECT FROM_UNIXTIME(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Illegal parameter data type uuid for operation 'from_unixtime'
+SELECT HOUR(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Illegal parameter data type uuid for operation 'hour'
+SELECT YEAR(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Illegal parameter data type uuid for operation 'year'
+SELECT RELEASE_LOCK(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+ERROR HY000: Illegal parameter data type uuid for operation 'release_lock'
+SELECT JSON_LENGTH(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+JSON_LENGTH(CAST('00000000-0000-0000-0000-000000000000' AS UUID))
+1
+#
+# Virtual columns
+#
+CREATE TABLE t1 (
+a INT,
+b UUID GENERATED ALWAYS AS (CAST(CONCAT(RAND(),a) AS UUID)), INDEX(b)
+);
+ERROR HY000: Function or expression 'rand()' cannot be used in the GENERATED ALWAYS AS clause of `b`
+CREATE TABLE t1 (
+a INT,
+b UUID GENERATED ALWAYS AS (CAST(CONCAT('00000000-0000-0000-0000-00000000001',HEX(a)) AS UUID)), INDEX(b)
+);
+INSERT INTO t1 (a) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15);
+SELECT * FROM t1;
+a b
+0 00000000-0000-0000-0000-000000000010
+1 00000000-0000-0000-0000-000000000011
+2 00000000-0000-0000-0000-000000000012
+3 00000000-0000-0000-0000-000000000013
+4 00000000-0000-0000-0000-000000000014
+5 00000000-0000-0000-0000-000000000015
+6 00000000-0000-0000-0000-000000000016
+7 00000000-0000-0000-0000-000000000017
+8 00000000-0000-0000-0000-000000000018
+9 00000000-0000-0000-0000-000000000019
+10 00000000-0000-0000-0000-00000000001a
+11 00000000-0000-0000-0000-00000000001b
+12 00000000-0000-0000-0000-00000000001c
+13 00000000-0000-0000-0000-00000000001d
+14 00000000-0000-0000-0000-00000000001e
+15 00000000-0000-0000-0000-00000000001f
+DROP TABLE t1;
+#
+# VIEW
+#
+CREATE TABLE t1 (a INT DEFAULT 0);
+INSERT INTO t1 (a) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15);
+SELECT * FROM t1 ORDER BY a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+CREATE VIEW v1 AS SELECT (CAST(CONCAT('00000000-0000-0000-0000-00000000001',HEX(a)) AS UUID)) AS c FROM t1;
+SELECT * FROM v1 ORDER BY c;
+c
+00000000-0000-0000-0000-000000000010
+00000000-0000-0000-0000-000000000011
+00000000-0000-0000-0000-000000000012
+00000000-0000-0000-0000-000000000013
+00000000-0000-0000-0000-000000000014
+00000000-0000-0000-0000-000000000015
+00000000-0000-0000-0000-000000000016
+00000000-0000-0000-0000-000000000017
+00000000-0000-0000-0000-000000000018
+00000000-0000-0000-0000-000000000019
+00000000-0000-0000-0000-00000000001a
+00000000-0000-0000-0000-00000000001b
+00000000-0000-0000-0000-00000000001c
+00000000-0000-0000-0000-00000000001d
+00000000-0000-0000-0000-00000000001e
+00000000-0000-0000-0000-00000000001f
+DROP VIEW v1;
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+CREATE VIEW v1 AS SELECT * FROM t1;
+SHOW CREATE VIEW v1;
+View Create View character_set_client collation_connection
+v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` latin1 latin1_swedish_ci
+DESCRIBE v1;
+Field Type Null Key Default Extra
+a uuid YES 00000000-0000-0000-0000-000000000000
+INSERT INTO v1 VALUES
+(DEFAULT),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+DROP VIEW v1;
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID DEFAULT CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+CREATE VIEW v1 AS SELECT * FROM t1;
+SHOW CREATE VIEW v1;
+View Create View character_set_client collation_connection
+v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` latin1 latin1_swedish_ci
+DESCRIBE v1;
+Field Type Null Key Default Extra
+a uuid YES cast('00000000-0000-0000-0000-000000000000' as uuid)
+INSERT INTO v1 VALUES
+(DEFAULT),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000000
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+DROP VIEW v1;
+DROP TABLE t1;
+#
+# Subqueries
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT * FROM t1 WHERE a=(SELECT MIN(a) FROM t1) ORDER BY a;
+a
+00000000-0000-0000-0000-000000000000
+SELECT * FROM t1 WHERE a=(SELECT MAX(a) FROM t1) ORDER BY a;
+a
+00000000-0000-0000-0000-000000000002
+SELECT * FROM t1 WHERE a IN (SELECT a FROM t1 WHERE a>'00000000-0000-0000-0000-000000000000') ORDER BY a;
+a
+00000000-0000-0000-0000-000000000001
+00000000-0000-0000-0000-000000000002
+DROP TABLE t1;
+#
+# Stored routines
+#
+CREATE PROCEDURE p1(a UUID)
+BEGIN
+DECLARE b UUID DEFAULT CONCAT('1',SUBSTRING(a,2,36));
+SELECT a, b;
+END;
+$$
+CALL p1('00000000-0000-0000-0000-000000000001');
+a b
+00000000-0000-0000-0000-000000000001 10000000-0000-0000-0000-000000000001
+CALL p1(CAST('00000000-0000-0000-0000-000000000002' AS UUID));
+a b
+00000000-0000-0000-0000-000000000002 10000000-0000-0000-0000-000000000002
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a UUID) RETURNS UUID
+BEGIN
+RETURN CONCAT('1',SUBSTRING(a,2,36));
+END;
+$$
+SELECT f1('00000000-0000-0000-0000-000000000001');
+f1('00000000-0000-0000-0000-000000000001')
+10000000-0000-0000-0000-000000000001
+SELECT f1(CAST('00000000-0000-0000-0000-000000000002' AS UUID));
+f1(CAST('00000000-0000-0000-0000-000000000002' AS UUID))
+10000000-0000-0000-0000-000000000002
+DROP FUNCTION f1;
+#
+# Anchored data types in SP variables
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE va TYPE OF t1.a;
+SELECT MAX(a) INTO va FROM t1;
+SELECT va;
+END;
+$$
+CALL p1;
+va
+00000000-0000-0000-0000-000000000001
+DROP PROCEDURE p1;
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b UUID);
+INSERT INTO t1 VALUES
+(
+'00000000-0000-0000-0000-00000000000a',
+'00000000-0000-0000-0000-00000000000b'
+);
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE va ROW TYPE OF t1;
+SELECT MAX(a), MAX(b) INTO va FROM t1;
+SELECT va.a, va.b;
+END;
+$$
+CALL p1;
+va.a va.b
+00000000-0000-0000-0000-00000000000a 00000000-0000-0000-0000-00000000000b
+DROP PROCEDURE p1;
+DROP TABLE t1;
+#
+# Optimizer: make_const_item_for_comparison
+#
+CREATE TABLE t1 (id INT, a UUID);
+INSERT INTO t1 VALUES
+(1,'00000000-0000-0000-0000-000000000001'),
+(2,'00000000-0000-0000-0000-000000000002');
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=COALESCE(CAST('00000000-0000-0000-0000-000000000001' AS UUID)) AND id>0;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = UUID'00000000-0000-0000-0000-000000000001' and `test`.`t1`.`id` > 0
+DROP TABLE t1;
+#
+# Optimizer: equal field propagation
+#
+CREATE TABLE t1 (id INT, a UUID);
+INSERT INTO t1 VALUES
+(1,'00000000-0000-0000-0000-000000000001'),
+(2,'00000000-0000-0000-0000-000000000002');
+EXPLAIN EXTENDED SELECT * FROM t1
+WHERE a=COALESCE(CAST('00000000-0000-0000-0000-000000000001' AS UUID))
+AND LENGTH(CONCAT(a,RAND()))>1;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = UUID'00000000-0000-0000-0000-000000000001' and octet_length(concat(UUID'00000000-0000-0000-0000-000000000001',rand())) > 1
+EXPLAIN EXTENDED SELECT * FROM t1
+WHERE a=COALESCE(CAST('00000000-0000-0000-0000-000000000001' AS UUID))
+AND LENGTH(a)>1;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = UUID'00000000-0000-0000-0000-000000000001'
+DROP TABLE t1;
+#
+# Optimizer: equal expression propagation
+#
+CREATE TABLE t1 (id INT, a UUID);
+INSERT INTO t1 VALUES
+(1,'00000000-0000-0000-0000-000000000001'),
+(2,'00000000-0000-0000-0000-000000000002');
+EXPLAIN EXTENDED SELECT * FROM t1
+WHERE COALESCE(a)='00000000-0000-0000-0000-000000000001' AND COALESCE(a)=CONCAT(a);
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` where coalesce(`test`.`t1`.`a`) = '00000000-0000-0000-0000-000000000001' and concat(`test`.`t1`.`a`) = '00000000-0000-0000-0000-000000000001'
+DROP TABLE t1;
+#
+# Subquery materialization
+#
+CREATE TABLE t1 (a UUID, b VARCHAR(36), KEY (a), KEY(b)) ;
+INSERT INTO t1 VALUES
+(
+'00000000-0000-0000-0000-00000000000a',
+'00000000-0000-0000-0000-00000000000a'
+),
+(
+'00000000-0000-0000-0000-00000000000a',
+'00000000-0000-0000-0000-00000000000b'
+);
+SET @@optimizer_switch='semijoin=off,materialization=on,in_to_exists=off,subquery_cache=off';
+EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT a AS a_inner FROM t1 GROUP BY a_inner);
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where
+2 MATERIALIZED t1 index NULL a 17 NULL 2 Using index
+EXPLAIN SELECT * FROM t1 WHERE b IN (SELECT a AS a_inner FROM t1 GROUP BY a_inner);
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where
+2 DEPENDENT SUBQUERY t1 index_subquery a a 17 func 2 Using index; Using where
+SET @@optimizer_switch=DEFAULT;
+DROP TABLE t1;
+#
+# ALTER from UUID to UUID
+#
+CREATE TABLE t1 (a UUID, b INT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001', 1);
+ALTER TABLE t1 MODIFY b DECIMAL(10,2);
+SELECT * FROM t1;
+a b
+00000000-0000-0000-0000-000000000001 1.00
+DROP TABLE t1;
+#
+# ALTER to character string data types
+#
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS CHAR(36)) FROM t1;
+CAST(a AS CHAR(36))
+00000000-0000-0000-0000-000000000001
+ALTER TABLE t1 MODIFY a CHAR(39);
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a VARCHAR(36);
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a TINYTEXT;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a TEXT;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a MEDIUMTEXT;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a LONGTEXT;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+#
+# ALTER from character string data types
+#
+CREATE OR REPLACE TABLE t1 (a CHAR(64));
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+CAST(a AS UUID)
+00000000-0000-0000-0000-000000000001
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a VARCHAR(64));
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+CAST(a AS UUID)
+00000000-0000-0000-0000-000000000001
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a TINYTEXT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+CAST(a AS UUID)
+00000000-0000-0000-0000-000000000001
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a TEXT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+CAST(a AS UUID)
+00000000-0000-0000-0000-000000000001
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a MEDIUMTEXT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+CAST(a AS UUID)
+00000000-0000-0000-0000-000000000001
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a LONGTEXT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+CAST(a AS UUID)
+00000000-0000-0000-0000-000000000001
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+#
+# ALTER to binary string data types
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a BINARY(16);
+SELECT HEX(a) FROM t1;
+HEX(a)
+00000000000000000000000000000001
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a BINARY(17);
+SELECT HEX(a) FROM t1;
+HEX(a)
+0000000000000000000000000000000100
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a BINARY(15);
+ERROR 22001: Data too long for column 'a' at row 1
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a TINYBLOB;
+SELECT HEX(a) FROM t1;
+HEX(a)
+00000000000000000000000000000001
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a BLOB;
+SELECT HEX(a) FROM t1;
+HEX(a)
+00000000000000000000000000000001
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a MEDIUMBLOB;
+SELECT HEX(a) FROM t1;
+HEX(a)
+00000000000000000000000000000001
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a LONGBLOB;
+SELECT HEX(a) FROM t1;
+HEX(a)
+00000000000000000000000000000001
+DROP TABLE t1;
+#
+# ALTER from binary string data types
+#
+CREATE TABLE t1 (a BINARY(16));
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+a
+20010db8-0000-0000-0000-ff0000428329
+DROP TABLE t1;
+CREATE TABLE t1 (a BINARY(17));
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF000042832900');
+ALTER TABLE t1 MODIFY a UUID;
+ERROR 22007: Incorrect uuid value: ' \x01\x0D\xB8\x00\x00\x00\x00\x00\x00\xFF\x00\x00B\x83)\x00' for column `test`.`t1`.`a` at row 1
+DROP TABLE t1;
+CREATE TABLE t1 (a BINARY(15));
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF00004283');
+ALTER TABLE t1 MODIFY a UUID;
+ERROR 22007: Incorrect uuid value: ' \x01\x0D\xB8\x00\x00\x00\x00\x00\x00\xFF\x00\x00B\x83' for column `test`.`t1`.`a` at row 1
+DROP TABLE t1;
+CREATE TABLE t1 (a TINYBLOB);
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+a
+20010db8-0000-0000-0000-ff0000428329
+DROP TABLE t1;
+CREATE TABLE t1 (a BLOB);
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+a
+20010db8-0000-0000-0000-ff0000428329
+DROP TABLE t1;
+CREATE TABLE t1 (a MEDIUMBLOB);
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+a
+20010db8-0000-0000-0000-ff0000428329
+DROP TABLE t1;
+CREATE TABLE t1 (a BLOB);
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+a
+20010db8-0000-0000-0000-ff0000428329
+DROP TABLE t1;
+#
+# SET from UUID to UUID
+#
+CREATE TABLE t1 (a UUID, b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+#
+# SET from UUID to numeric
+#
+CREATE TABLE t1 (a UUID, b INT);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b DOUBLE);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b DECIMAL(32,0));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b YEAR);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'uuid' as 'year' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+#
+# SET from numeric to UUID
+#
+CREATE TABLE t1 (a INT, b UUID);
+INSERT INTO t1 VALUES (1, NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a DOUBLE, b UUID);
+INSERT INTO t1 VALUES (1, NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a DECIMAL(32,0), b UUID);
+INSERT INTO t1 VALUES (1, NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a YEAR, b UUID);
+INSERT INTO t1 VALUES (1, NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'year' as 'uuid' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+#
+# SET from UUID to temporal
+#
+CREATE TABLE t1 (a UUID, b TIME);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b DATE);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'uuid' as 'date' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b DATETIME);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'uuid' as 'datetime' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b TIMESTAMP NULL DEFAULT NULL);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'uuid' as 'timestamp' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+#
+# SET from temporal to UUID
+#
+CREATE TABLE t1 (a TIME, b UUID);
+INSERT INTO t1 VALUES ('00:00:00', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a DATE, b UUID);
+INSERT INTO t1 VALUES ('2001-01:01', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'date' as 'uuid' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a DATETIME, b UUID);
+INSERT INTO t1 VALUES ('2001-01-01 10:20:30', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'datetime' as 'uuid' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+CREATE TABLE t1 (a TIMESTAMP, b UUID);
+INSERT INTO t1 VALUES ('2001-01-01 10:20:30', NULL);
+UPDATE t1 SET b=a;
+ERROR HY000: Cannot cast 'timestamp' as 'uuid' in assignment of `test`.`t1`.`b`
+SELECT b FROM t1;
+b
+NULL
+DROP TABLE t1;
+#
+# SET from UUID to character string
+#
+CREATE TABLE t1 (a UUID, b CHAR(39));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b VARCHAR(39));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b TEXT);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b ENUM('ffffffff-ffff-ffff-ffff-ffffffffffff'));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b SET('ffffffff-ffff-ffff-ffff-ffffffffffff'));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+#
+# SET from character string to UUID
+#
+CREATE TABLE t1 (a CHAR(36), b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+CREATE TABLE t1 (a VARCHAR(36), b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+CREATE TABLE t1 (a TEXT, b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+CREATE TABLE t1 (a ENUM('ffffffff-ffff-ffff-ffff-ffffffffffff'), b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+CREATE TABLE t1 (a SET('ffffffff-ffff-ffff-ffff-ffffffffffff'), b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffffffff-ffff-ffff-ffff-ffffffffffff
+DROP TABLE t1;
+#
+# SET from UUID to binary
+#
+CREATE TABLE t1 (a UUID, b BINARY(16));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT HEX(b) FROM t1;
+HEX(b)
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b VARBINARY(39));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT HEX(b) FROM t1;
+HEX(b)
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID, b BLOB);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT HEX(b) FROM t1;
+HEX(b)
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+DROP TABLE t1;
+#
+# SET from binary to UUID
+#
+CREATE TABLE t1 (a BINARY(16), b UUID);
+INSERT INTO t1 VALUES (CONCAT(0xFFFF,REPEAT(0x0000,6),0xFFFF), NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffff0000-0000-0000-0000-00000000ffff
+DROP TABLE t1;
+CREATE TABLE t1 (a VARBINARY(16), b UUID);
+INSERT INTO t1 VALUES (CONCAT(0xFFFF,REPEAT(0x0000,6),0xFFFF), NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffff0000-0000-0000-0000-00000000ffff
+DROP TABLE t1;
+CREATE TABLE t1 (a BLOB, b UUID);
+INSERT INTO t1 VALUES (CONCAT(0xFFFF,REPEAT(0x0000,6),0xFFFF), NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+b
+ffff0000-0000-0000-0000-00000000ffff
+DROP TABLE t1;
+#
+# Limit clause parameter
+# TODO: this should fail.
+# The test for a valid data type should be moved
+# from parse time to fix_fields() time, and performed
+# for both Item_splocal and Item_param.
+#
+EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL LIMIT ?' USING CAST('00000000-0000-0000-0000-000000000000' AS UUID);
+1
+#
+# ALTER from UUID to CHAR
+#
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS CHAR(36)) FROM t1;
+CAST(a AS CHAR(36))
+00000000-0000-0000-0000-000000000001
+ALTER TABLE t1 MODIFY a CHAR(36);
+SELECT * FROM t1;
+a
+00000000-0000-0000-0000-000000000001
+DROP TABLE t1;
+#
+# ALTER from UUID to BINARY(16)
+#
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a BINARY(16);
+SELECT HEX(a) FROM t1;
+HEX(a)
+00000000000000000000000000000001
+DROP TABLE t1;
+#
+# CAST(uuid AS BINARY)
+#
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT HEX(CAST(a AS BINARY)) FROM t1;
+HEX(CAST(a AS BINARY))
+00000000000000000000000000000001
+SELECT HEX(CAST(a AS BINARY(16))) FROM t1;
+HEX(CAST(a AS BINARY(16)))
+00000000000000000000000000000001
+DROP TABLE t1;
+#
+# CAST from UUID to FLOAT
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000');
+SELECT CAST(a AS FLOAT) FROM t1;
+ERROR HY000: Illegal parameter data type uuid for operation 'float_typecast'
+DROP TABLE t1;
+#
+# CAST(UUID AS BINARY) - metadata
+#
+CREATE TABLE t1 (a UUID);
+SELECT
+CAST(a AS BINARY(0)),
+CAST(a AS BINARY(1)),
+CAST(a AS BINARY(16)),
+CAST(a AS BINARY(255)),
+CAST(a AS BINARY(256)),
+CAST(a AS BINARY(512)),
+CAST(a AS BINARY(513)),
+CAST(a AS BINARY(65532)),
+CAST(a AS BINARY(65533)),
+CAST(a AS BINARY(65534)),
+CAST(a AS BINARY(65535)),
+CAST(a AS BINARY(65536)),
+CAST(a AS BINARY(16777215)),
+CAST(a AS BINARY(16777216))
+FROM t1;
+Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
+def CAST(a AS BINARY(0)) 254 0 0 Y 128 0 63
+def CAST(a AS BINARY(1)) 254 1 0 Y 128 0 63
+def CAST(a AS BINARY(16)) 254 16 0 Y 128 0 63
+def CAST(a AS BINARY(255)) 254 255 0 Y 128 0 63
+def CAST(a AS BINARY(256)) 253 256 0 Y 128 0 63
+def CAST(a AS BINARY(512)) 253 512 0 Y 128 0 63
+def CAST(a AS BINARY(513)) 253 513 0 Y 128 0 63
+def CAST(a AS BINARY(65532)) 253 65532 0 Y 128 0 63
+def CAST(a AS BINARY(65533)) 252 65533 0 Y 128 0 63
+def CAST(a AS BINARY(65534)) 252 65534 0 Y 128 0 63
+def CAST(a AS BINARY(65535)) 252 65535 0 Y 128 0 63
+def CAST(a AS BINARY(65536)) 250 65536 0 Y 128 0 63
+def CAST(a AS BINARY(16777215)) 250 16777215 0 Y 128 0 63
+def CAST(a AS BINARY(16777216)) 251 16777216 0 Y 128 0 63
+CAST(a AS BINARY(0)) CAST(a AS BINARY(1)) CAST(a AS BINARY(16)) CAST(a AS BINARY(255)) CAST(a AS BINARY(256)) CAST(a AS BINARY(512)) CAST(a AS BINARY(513)) CAST(a AS BINARY(65532)) CAST(a AS BINARY(65533)) CAST(a AS BINARY(65534)) CAST(a AS BINARY(65535)) CAST(a AS BINARY(65536)) CAST(a AS BINARY(16777215)) CAST(a AS BINARY(16777216))
+DROP TABLE t1;
+#
+# MIN(uuid) with GROUP BY
+#
+CREATE TABLE t1 (id INT, a UUID) ENGINE=MyISAM;
+INSERT INTO t1 VALUES
+(1, '00000000-0000-0000-0000-000000000fff'),
+(1, '00000000-0000-0000-0000-000000008888');
+SELECT MIN(a), MAX(a) FROM t1 GROUP BY id;
+MIN(a) MAX(a)
+00000000-0000-0000-0000-000000000fff 00000000-0000-0000-0000-000000008888
+DROP TABLE t1;
+#
+# MDEV-26785 Hyphens inside the value of uuid datatype
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('0000000000000000000000000000000'/*31 digits*/);
+ERROR 22007: Incorrect uuid value: '0000000000000000000000000000000' for column `test`.`t1`.`a` at row 1
+INSERT INTO t1 VALUES ('000000000000000000000000000000000'/*33 digits*/);
+ERROR 22007: Incorrect uuid value: '000000000000000000000000000000000' for column `test`.`t1`.`a` at row 1
+INSERT INTO t1 VALUES ('-00000000000000000000000000000000'/*leading hyphen*/);
+ERROR 22007: Incorrect uuid value: '-00000000000000000000000000000000' for column `test`.`t1`.`a` at row 1
+INSERT INTO t1 VALUES ('-00000000000000000000000000000000-'/*trailing hyphen*/);
+ERROR 22007: Incorrect uuid value: '-00000000000000000000000000000000-' for column `test`.`t1`.`a` at row 1
+INSERT INTO t1 VALUES ('00000000000000000000000000000000');
+INSERT INTO t1 VALUES ('0-0000000000000000000000000000011');
+INSERT INTO t1 VALUES ('0--0000000000000000000000000000012');
+INSERT INTO t1 VALUES ('0---0000000000000000000000000000013');
+INSERT INTO t1 VALUES ('0----0000000000000000000000000000014');
+INSERT INTO t1 VALUES ('00-000000000000000000000000000021');
+INSERT INTO t1 VALUES ('00--000000000000000000000000000022');
+INSERT INTO t1 VALUES ('00---000000000000000000000000000023');
+INSERT INTO t1 VALUES ('00----000000000000000000000000000024');
+INSERT INTO t1 VALUES ('5796dac11a1c11--------------ecab4ef859-713e4be4');
+INSERT INTO t1 VALUES ('5796dac11a1c11---------------ecab4ef859-713e4be4');
+DROP TABLE t1;
+#
+# MDEV-26732 Assertion `0' failed in Item::val_native
+#
+SELECT uuid() AS f, var_pop('x') FROM dual HAVING f > '';
+f var_pop('x')
+Warnings:
+Warning 1292 Truncated incorrect DOUBLE value: 'x'
+Warning 1292 Incorrect uuid value: ''
+#
+# MDEV-28491 Uuid. "UPDATE/DELETE" not working "WHERE id IN (SELECT id FROM ..)"
+#
+CREATE TABLE companies (id uuid, name varchar(10));
+INSERT INTO companies (id) values ('7bc95b06-cc6c-11ec-96c5-0242ac130002');
+CREATE TABLE divisions (company_id uuid);
+INSERT INTO divisions (company_id) values ('7bc95b06-cc6c-11ec-96c5-0242ac130002');
+SELECT * FROM companies WHERE id IN (SELECT company_id FROM divisions);
+id name
+7bc95b06-cc6c-11ec-96c5-0242ac130002 NULL
+UPDATE companies SET name = 'value' WHERE id IN (SELECT company_id FROM divisions);
+SELECT * FROM companies;
+id name
+7bc95b06-cc6c-11ec-96c5-0242ac130002 value
+DELETE FROM companies WHERE id IN (SELECT company_id FROM divisions);
+SELECT * FROM companies;
+id name
+DROP TABLE divisions;
+DROP TABLE companies;
+#
+# MDEV-27100 Subquery using the ALL keyword on UUID columns produces a wrong result
+#
+CREATE TABLE t1 (d UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-111111111111'), ('11111111-0000-0000-0000-000000000000');
+SELECT * FROM t1 ORDER BY d;
+d
+11111111-0000-0000-0000-000000000000
+00000000-0000-0000-0000-111111111111
+SELECT * FROM t1 WHERE d <= ALL (SELECT * FROM t1);
+d
+11111111-0000-0000-0000-000000000000
+SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1);
+d
+00000000-0000-0000-0000-111111111111
+DROP TABLE t1;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid.test
new file mode 100644
index 00000000000..d4e34c5a74b
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid.test
@@ -0,0 +1,1684 @@
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+--echo #
+--echo # Basic CREATE functionality, defaults, metadata
+--echo #
+
+--error ER_WRONG_FIELD_SPEC
+CREATE TABLE t1 (a UUID AUTO_INCREMENT);
+
+CREATE TABLE t1 (a UUID);
+SHOW CREATE TABLE t1;
+DESCRIBE t1;
+--vertical_results
+--replace_column 19 #
+SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='test' AND table_name='t1';
+--horizontal_results
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+--enable_metadata
+SELECT * FROM t1;
+SELECT CAST('00000000-0000-0000-0000-000000000001' AS UUID) AS a;
+--disable_metadata
+DROP TABLE t1;
+
+
+CREATE TABLE t1 (
+ c1 UUID DEFAULT 0x00000000000000000000000000000000,
+ c2 UUID DEFAULT 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
+ c3 UUID DEFAULT '00000000-0000-0000-0000-000000000000',
+ c4 UUID DEFAULT 'ffffffff-ffff-ffff-ffff-ffffffffffff',
+ c5 UUID DEFAULT CAST(X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' AS UUID)
+);
+SHOW CREATE TABLE t1;
+DESCRIBE t1;
+--vertical_results
+--replace_column 19 #
+SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='test' AND table_name='t1';
+--horizontal_results
+DROP TABLE t1;
+
+--error ER_INVALID_DEFAULT
+CREATE TABLE t1 (c1 UUID DEFAULT 0x00);
+--error ER_INVALID_DEFAULT
+CREATE TABLE t1 (c1 UUID DEFAULT '');
+
+
+CREATE TABLE t1 (a UUID);
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES ('x');
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+INSERT INTO t1 VALUES (1);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+INSERT INTO t1 VALUES (TIME'10:20:30');
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES (0x00);
+DROP TABLE t1;
+
+--echo #
+--echo # CAST
+--echo #
+
+SELECT CAST('garbage' AS UUID);
+SELECT CAST(0x01 AS UUID);
+SELECT CAST(REPEAT(0x00,16) AS UUID);
+SELECT CAST(REPEAT(0x11,16) AS UUID);
+
+CREATE TABLE t1 AS SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID);
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # Text and binary formats, comparison operators
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES (0x00000000000000000000000000000000);
+INSERT INTO t1 VALUES (0x00000000000000000000000000000001);
+INSERT INTO t1 VALUES (0xFFFF0000000000000000000000000001);
+INSERT INTO t1 VALUES (0xFFFF0000000000000000000000000002);
+SELECT * FROM t1 ORDER BY a;
+SELECT * FROM t1 ORDER BY a DESC;
+SELECT HEX(a),a FROM t1 ORDER BY a;
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-000000000000';
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-000000000001';
+SELECT * FROM t1 WHERE a='ffff0000-0000-0000-0000-000000000001';
+SELECT * FROM t1 WHERE a='ffff0000-0000-0000-0000-000000000002';
+SELECT * FROM t1 WHERE a=0x00000000000000000000000000000000;
+SELECT * FROM t1 WHERE a=0x00000000000000000000000000000001;
+SELECT * FROM t1 WHERE a=0xffff0000000000000000000000000001;
+SELECT * FROM t1 WHERE a=0xffff0000000000000000000000000002;
+SELECT * FROM t1 WHERE a< '00000000-0000-0000-0000-000000000000';
+SELECT * FROM t1 WHERE a<='00000000-0000-0000-0000-000000000000';
+SELECT * FROM t1 WHERE a>='ffff0000-0000-0000-0000-000000000002';
+SELECT * FROM t1 WHERE a> 'ffff0000-0000-0000-0000-000000000002';
+SELECT * FROM t1 WHERE a IN
+(
+ '00000000-0000-0000-0000-000000000000',
+ 'ffff0000-0000-0000-0000-000000000001'
+) ORDER BY a;
+SELECT * FROM t1 WHERE a IN
+(
+ '00000000-0000-0000-0000-000000000000',
+ 0xffff0000000000000000000000000002
+) ORDER BY a;
+
+SELECT * FROM t1 WHERE a<'garbage';
+SELECT * FROM t1 WHERE a<='garbage';
+SELECT * FROM t1 WHERE a='garbage';
+SELECT * FROM t1 WHERE a>='garbage';
+SELECT * FROM t1 WHERE a>'garbage';
+
+SELECT * FROM t1 WHERE a<0x01;
+SELECT * FROM t1 WHERE a<=0x01;
+SELECT * FROM t1 WHERE a=0x01;
+SELECT * FROM t1 WHERE a>=0x01;
+SELECT * FROM t1 WHERE a>0x01;
+
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-000000000000';
+SELECT * FROM t1 WHERE a='00-000000-0000-0000-0000-000000000000';
+SELECT * FROM t1 WHERE a='00-00-0000-0000-0000-0000-000000000000';
+SELECT * FROM t1 WHERE a='00-00-00-00-0000-0000-0000-000000000000';
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT * FROM t1 WHERE a=0;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT * FROM t1 WHERE a=0.0;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT * FROM t1 WHERE a=0e0;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT * FROM t1 WHERE a=TIME'10:20:30';
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT * FROM t1 WHERE a IN ('::', 10);
+
+DROP TABLE t1;
+
+--echo #
+--echo # ORDER BY
+--echo #
+
+CREATE TABLE t1 (a UUID);
+DELIMITER $$;
+FOR i IN 0..15
+DO
+ INSERT INTO t1 VALUES (REPLACE('XX000000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00XX0000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('0000XX00-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('000000XX-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-XX00-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-00XX-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-XX00-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-00XX-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-XX00-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-00XX-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-XX0000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00XX00000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000XX000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-000000XX0000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00000000XX00','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000000000XX','XX',LPAD(HEX(i),2,'0')));
+END FOR;
+$$
+DELIMITER ;$$
+
+--echo #
+--echo # Logical ORDER BY
+--echo #
+SELECT * FROM t1 ORDER BY a;
+SELECT COALESCE(NULL, a) FROM t1 ORDER BY a;
+
+--echo #
+--echo # Lexicographical ORDER BY
+--echo #
+
+SELECT * FROM t1 ORDER BY CAST(a AS BINARY(16));
+SELECT * FROM t1 ORDER BY CAST(COALESCE(NULL,a) AS BINARY(16));
+
+DROP TABLE t1;
+
+
+--echo #
+--echo # cmp_item_uuid: IN for non-constants
+--echo #
+
+CREATE TABLE t1 (a UUID, b UUID);
+INSERT INTO t1 VALUES
+(
+ '00000000-0000-0000-0000-000000000001',
+ '00000000-0000-0000-0000-000000000002'
+);
+SELECT * FROM t1 WHERE '00000000-0000-0000-0000-000000000000' IN (a, b);
+SELECT * FROM t1 WHERE '00000000-0000-0000-0000-000000000001' IN (a, b);
+SELECT * FROM t1 WHERE '00-000000-0000-0000-0000-000000000001' IN (a, b);
+SELECT * FROM t1 WHERE '00-00-0000-0000-0000-0000-000000000001' IN (a, b);
+DROP TABLE t1;
+
+
+--echo #
+--echo # cmp_item_uuid: DECODE_ORACLE
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+(NULL),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT a, DECODE_ORACLE(a, '00000000-0000-0000-0000-000000000002', '01') AS d FROM t1;
+SELECT
+ a,
+ DECODE_ORACLE(a, '00000000-0000-0000-0000-000000000001', '01') AS d0,
+ DECODE_ORACLE(a, NULL, '<NULL>', '00000000-0000-0000-0000-000000000001', '01') AS d1,
+ DECODE_ORACLE(a, 'garbage', '<NULL>', '00000000-0000-0000-0000-000000000001', '01') AS d2
+FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # CASE abbreviations
+--echo #
+
+CREATE TABLE t1 (
+ c UUID,
+ c_char CHAR(32),
+ c_varchar VARCHAR(32),
+ c_tinytext TINYTEXT,
+ c_text TEXT,
+ c_mediumtext TEXT,
+ c_longtext LONGTEXT
+);
+CREATE TABLE t2 AS SELECT
+ COALESCE(c, c_char),
+ COALESCE(c, c_varchar),
+ COALESCE(c, c_tinytext),
+ COALESCE(c, c_text),
+ COALESCE(c, c_mediumtext),
+ COALESCE(c, c_longtext)
+FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+CREATE TABLE t2 AS SELECT
+ LEAST(c, c_char),
+ LEAST(c, c_varchar),
+ LEAST(c, c_tinytext),
+ LEAST(c, c_text),
+ LEAST(c, c_mediumtext),
+ LEAST(c, c_longtext)
+FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+(NULL),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+
+SELECT COALESCE(a, '00000000-0000-0000-0000-000000000000') FROM t1 ORDER BY a;
+
+SELECT
+ a,
+ LEAST(a,'00000000-0000-0000-0000-000000000000'),
+ LEAST(a,'00000000-0000-0000-0000-00000000000f')
+FROM t1 ORDER BY a;
+
+SELECT
+ a,
+ GREATEST(a,'00000000-0000-0000-0000-000000000000'),
+ GREATEST(a,'00000000-0000-0000-0000-00000000000f')
+FROM t1 ORDER BY a;
+
+CREATE TABLE t2 AS SELECT
+ COALESCE(a, '00000000-0000-0000-0000-000000000000'),
+ LEAST(a,'00000000-0000-0000-0000-000000000000'),
+ GREATEST(a,'00000000-0000-0000-0000-000000000000')
+FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+SELECT COALESCE(a, 0x00000000000000000000000000000000) FROM t1 ORDER BY a;
+SELECT
+ a,
+ LEAST(a, 0x00000000000000000000000000000000),
+ LEAST(a, 0x0000000000000000000000000000000f)
+FROM t1 ORDER BY a;
+
+SELECT
+ a,
+ GREATEST(a, 0x00000000000000000000000000000000),
+ GREATEST(a, 0x0000000000000000000000000000000f)
+FROM t1 ORDER BY a;
+
+CREATE TABLE t2 AS SELECT
+ COALESCE(a, 0x00000000000000000000000000000000),
+ LEAST(a,0x00000000000000000000000000000000),
+ GREATEST(a,0x00000000000000000000000000000000)
+FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT COALESCE(a, 10) FROM t1;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT LEAST(a, 10) FROM t1;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT GREATEST(a, 10) FROM t1;
+
+DROP TABLE t1;
+
+SELECT COALESCE('garbage', CAST('::1' AS UUID));
+SELECT COALESCE(0x01, CAST('::1' AS UUID));
+
+
+--echo #
+--echo # Uniqueness
+--echo #
+
+CREATE TABLE t1 (a UUID NOT NULL PRIMARY KEY);
+INSERT INTO t1 VALUES
+('41000000-0000-0000-0000-000000000001'),
+('61000000-0000-0000-0000-000000000001');
+--error ER_DUP_ENTRY
+INSERT INTO t1 VALUES ('41000000-0000-0000-0000-000000000001');
+SELECT * FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # Indexes
+--echo #
+
+--error ER_WRONG_SUB_KEY
+CREATE TABLE t1 (a UUID, KEY(a(1)));
+
+
+--echo #
+--echo # Explicit CAST on INSERT
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES (CAST('10000000-0000-0000-0000-000000000001' AS UUID));
+INSERT INTO t1 VALUES (CAST('10000000-0000-0000-0000-000000000002' AS UUID));
+INSERT INTO t1 VALUES (CAST('10000000-0000-0000-0000-000000000003' AS UUID));
+INSERT INTO t1 VALUES (CAST(CONCAT('2','0000000-0000-0000-0000-000000000001') AS UUID));
+INSERT INTO t1 VALUES (CAST(CONCAT('2','0000000-0000-0000-0000-000000000002') AS UUID));
+INSERT INTO t1 VALUES (CAST(CONCAT('2','0000000-0000-0000-0000-000000000003') AS UUID));
+SELECT * FROM t1 ORDER BY a;
+DROP TABLE t1;
+
+
+--echo #
+--echo # Explicit CAST and implicit CAST on ALTER
+--echo #
+
+CREATE TABLE t1 (a VARCHAR(64));
+INSERT INTO t1 VALUES
+('garbage'),
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('ffff0000-0000-0000-0000-000000000001'),
+('ffff0000-0000-0000-0000-000000000002');
+SELECT a, CAST(a AS UUID) FROM t1 ORDER BY a;
+SELECT a, CAST(a AS UUID) FROM t1 ORDER BY CAST(a AS UUID);
+--error ER_TRUNCATED_WRONG_VALUE
+ALTER TABLE t1 MODIFY a UUID;
+SET sql_mode='';
+ALTER TABLE t1 MODIFY a UUID;
+SET sql_mode=DEFAULT;
+SELECT * FROM t1 ORDER BY a;
+DROP TABLE t1;
+
+
+CREATE TABLE t1 (a BINARY(16));
+INSERT INTO t1 VALUES (0x00000000000000000000000000000000);
+INSERT INTO t1 VALUES (0x00000000000000000000000000000001);
+INSERT INTO t1 VALUES (0xffff0000000000000000000000000001);
+INSERT INTO t1 VALUES (0xffff0000000000000000000000000002);
+SELECT HEX(a), CAST(a AS UUID) FROM t1 ORDER BY a;
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1 ORDER BY a;
+DROP TABLE t1;
+
+
+--echo #
+--echo # INSERT..SELECT, same data types
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+CREATE TABLE t2 (a UUID);
+INSERT INTO t2 SELECT a FROM t1;
+SELECT * FROM t2;
+DROP TABLE t1,t2;
+
+
+--echo #
+--echo # Implicit CAST on INSERT..SELECT, text format
+--echo #
+
+CREATE TABLE t1 (a VARCHAR(64));
+INSERT INTO t1 VALUES
+('garbage'),
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('ffff0000-0000-0000-0000-000000000001'),
+('ffff0000-0000-0000-0000-000000000002');
+
+CREATE TABLE t2 (a UUID);
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t2 SELECT a FROM t1;
+SET sql_mode='';
+INSERT INTO t2 SELECT a FROM t1;
+SELECT * FROM t2 ORDER BY a;
+SET sql_mode=DEFAULT;
+DROP TABLE t2;
+
+CREATE TABLE t2 (a UUID NOT NULL);
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t2 SELECT a FROM t1;
+SET sql_mode='';
+INSERT INTO t2 SELECT a FROM t1;
+SELECT * FROM t2 ORDER BY a;
+SET sql_mode=DEFAULT;
+DROP TABLE t2;
+
+DROP TABLE t1;
+
+
+--echo #
+--echo # Implicit CAST on INSERT..SELECT, binary format
+--echo #
+
+CREATE TABLE t1 (a BINARY(16));
+INSERT INTO t1 VALUES (0x00000000000000000000000000000000);
+INSERT INTO t1 VALUES (0x00000000000000000000000000000001);
+INSERT INTO t1 VALUES (0xffff0000000000000000000000000001);
+INSERT INTO t1 VALUES (0xffff0000000000000000000000000002);
+CREATE TABLE t2 (a UUID);
+INSERT INTO t2 SELECT a FROM t1;
+SELECT a FROM t2 ORDER BY a;
+DROP TABLE t1,t2;
+
+
+--echo #
+--echo # CAST to other data types
+--echo #
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS DOUBLE);
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS FLOAT);
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS DECIMAL);
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS SIGNED);
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS UNSIGNED);
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS TIME);
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS DATE);
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS DATETIME);
+
+SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS CHAR);
+CREATE TABLE t1 AS SELECT CAST(CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS CHAR) AS a;
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff');
+CREATE TABLE t2 AS SELECT
+ CAST(a AS CHAR),
+ CAST(a AS CHAR(36)),
+ CAST(a AS CHAR(530)),
+ CAST(a AS CHAR(65535)),
+ CAST(a AS CHAR(66000)),
+ CAST(a AS CHAR(16777215)),
+ CAST(a AS CHAR(16777216))
+FROM t1;
+SHOW CREATE TABLE t2;
+--vertical_results
+SELECT * FROM t2;
+--horizontal_results
+DROP TABLE t2;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff');
+CREATE TABLE t2 AS SELECT
+ CAST(a AS BINARY(4)) AS cb4,
+ CAST(a AS BINARY) AS cb,
+ CAST(a AS BINARY(16)) AS cb16,
+ CAST(a AS BINARY(32)) AS cb32,
+ CAST(a AS BINARY(530)) AS cb530,
+ CAST(a AS BINARY(65535)) AS cb65535,
+ CAST(a AS BINARY(66000)) AS cb66000,
+ CAST(a AS BINARY(16777215)) AS cb16777215,
+ CAST(a AS BINARY(16777216)) AS cb16777216
+FROM t1 LIMIT 0;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+CREATE TABLE t2 AS SELECT
+ CAST(a AS BINARY(4)) AS cb4,
+ CAST(a AS BINARY) AS cb,
+ CAST(a AS BINARY(16)) AS cb16,
+ CAST(a AS BINARY(32)) AS cb32,
+ CAST(a AS BINARY(530)) AS cb530,
+ CAST(a AS BINARY(65535)) AS cb65535
+FROM t1;
+SHOW CREATE TABLE t2;
+--vertical_results
+SELECT
+ HEX(cb4),
+ HEX(cb),
+ HEX(cb16),
+ HEX(cb32),
+ LENGTH(cb530),
+ LENGTH(cb65535)
+FROM t2;
+--horizontal_results
+DROP TABLE t2;
+DROP TABLE t1;
+
+--echo #
+--echo # Implicit conversion to other types in INSERT
+--echo #
+
+CREATE TABLE t1 (a INT);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+DROP TABLE t1;
+
+CREATE TABLE t1 (a DOUBLE);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+DROP TABLE t1;
+
+CREATE TABLE t1 (a DECIMAL(32,0));
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+DROP TABLE t1;
+
+CREATE TABLE t1 (a VARCHAR(64));
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+DROP TABLE t1;
+
+CREATE TABLE t1 (a TEXT);
+INSERT INTO t1 VALUES (CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+DROP TABLE t1;
+
+
+
+--echo #
+--echo # Boolean context
+--echo #
+
+SELECT
+ CAST('00000000-0000-0000-0000-000000000000' AS UUID) IS TRUE,
+ CAST('00000000-0000-0000-0000-000000000000' AS UUID) IS FALSE,
+ CAST('00000000-0000-0000-0000-000000000001' AS UUID) IS TRUE,
+ CAST('00000000-0000-0000-0000-000000000001' AS UUID) IS FALSE;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001');
+SELECT a, a IS TRUE, a IS FALSE FROM t1 ORDER BY a;
+DROP TABLE t1;
+
+#
+# TODO: Error looks like a bug. This should return rows where a<>'00000000-0000-0000-0000-000000000000'.
+# The same problem is repeatable with GEOMETRY.
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT * FROM t1 WHERE a;
+DROP TABLE t1;
+
+
+--echo #
+--echo # GROUP BY
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-0000-00000000');
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-0000-00000001'),
+('00000000-0000-0000-0000-0000-0000-0001');
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-0000-00000002'),
+('00000000-0000-0000-0000-0000-0000-0002');
+SELECT a, COUNT(*) FROM t1 GROUP BY a;
+DROP TABLE t1;
+
+--echo #
+--echo # Aggregate functions
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000000');
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-0000-00000001'),
+('00000000-0000-0000-0000-0000-0000-0001');
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000002');
+SELECT MIN(a),MAX(a) FROM t1;
+
+CREATE TABLE t2 AS SELECT MIN(a), MAX(a) FROM t1;
+SHOW CREATE TABLE t2;
+SELECT * FROM t2;
+DROP TABLE t2;
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT AVG(a) FROM t1;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT AVG(DISTINCT a) FROM t1;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT SUM(a) FROM t1;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT SUM(DISTINCT a) FROM t1;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT STDDEV(a) FROM t1;
+SELECT GROUP_CONCAT(a ORDER BY a) FROM t1;
+SELECT a, GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a;
+DROP TABLE t1;
+
+--echo #
+--echo # Window functions
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002'),
+('00000000-0000-0000-0000-000000000003'),
+('00000000-0000-0000-0000-000000000004');
+SELECT
+ a,
+ LAG(a) OVER (ORDER BY a),
+ LEAD(a) OVER (ORDER BY a)
+FROM t1 ORDER BY a;
+
+SELECT
+ a,
+ FIRST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING),
+ LAST_VALUE(a) OVER (ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
+FROM t1 ORDER BY a;
+DROP TABLE t1;
+
+
+--echo #
+--echo # Prepared statements
+--echo #
+
+EXECUTE IMMEDIATE 'CREATE TABLE t1 AS SELECT ? AS a'
+ USING CAST('00000000-0000-0000-0000-000000000000' AS UUID);
+SHOW CREATE TABLE t1;
+
+EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)'
+ USING '00000000-0000-0000-0000-000000000001';
+
+EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)'
+ USING CAST('00000000-0000-0000-0000-000000000002' AS UUID);
+
+EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)'
+ USING 0x00000000000000000000000000000003;
+
+SELECT a FROM t1 ORDER BY a;
+EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?'
+ USING '00000000-0000-0000-0000-000000000001';
+
+EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?'
+ USING CAST('00000000-0000-0000-0000-000000000002' AS UUID);
+
+EXECUTE IMMEDIATE 'SELECT * FROM t1 WHERE a=?'
+ USING 0x00000000000000000000000000000003;
+DROP TABLE t1;
+
+
+--echo #
+--echo # Character set and collation aggregation
+--echo #
+
+CREATE TABLE t1 (a UUID);
+
+CREATE TABLE t2 AS SELECT
+ CONCAT(a) AS c1,
+ CONCAT(CAST('00000000-0000-0000-0000-000000000000' AS UUID)) AS c2
+FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+CREATE TABLE t2 AS SELECT
+ CONCAT(_utf8'1', LEFT(a,35)) AS c1,
+ CONCAT(_utf8'1', LEFT(CAST('00000000-0000-0000-0000-000000000000' AS UUID),35)) AS c2,
+ CONCAT(_utf8'1', LEFT(COALESCE(a),35)) AS c3
+FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+CREATE TABLE t2 AS SELECT
+ CONCAT(_latin1'1', LEFT(a,35)) AS c1,
+ CONCAT(_latin1'1', LEFT(CAST('00000000-0000-0000-0000-000000000000' AS UUID),35)) AS c2,
+ CONCAT(_latin1'1', LEFT(COALESCE(a),35)) AS c3
+FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+
+DROP TABLE t1;
+
+
+--echo #
+--echo # UNION
+--echo #
+
+CREATE TABLE t1 AS
+ SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS c
+ UNION
+ SELECT CAST('00000000-0000-0000-0000-000000000001' AS UUID);
+SHOW CREATE TABLE t1;
+SELECT * FROM t1 ORDER BY c;
+DROP TABLE t1;
+
+CREATE TABLE t1 AS
+ SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS c
+ UNION
+ SELECT '00000000-0000-0000-0000-000000000001';
+SHOW CREATE TABLE t1;
+SELECT * FROM t1 ORDER BY c;
+DROP TABLE t1;
+
+CREATE TABLE t1 AS
+ SELECT '00000000-0000-0000-0000-000000000000' AS c
+ UNION
+ SELECT CAST('00000000-0000-0000-0000-000000000001' AS UUID);
+SHOW CREATE TABLE t1;
+SELECT * FROM t1 ORDER BY c;
+DROP TABLE t1;
+
+CREATE TABLE t1 AS
+ SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS c
+ UNION
+ SELECT 0x00000000000000000000000000000001;
+SHOW CREATE TABLE t1;
+SELECT * FROM t1 ORDER BY c;
+DROP TABLE t1;
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+CREATE TABLE t1 AS
+ SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) AS c
+ UNION
+ SELECT 1;
+
+
+--echo #
+--echo # Unary operators
+--echo #
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT -CAST('00000000-0000-0000-0000-000000000000' AS UUID);
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT ABS(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT ROUND(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CEILING(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT FLOOR(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+
+--echo #
+--echo # Arithmetic operators
+--echo #
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) + 1;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) - 1;
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) * 1;
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) / 1;
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) MOD 1;
+
+
+--echo #
+--echo # Misc
+--echo #
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT RAND(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT FROM_UNIXTIME(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT HOUR(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT YEAR(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT RELEASE_LOCK(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+SELECT JSON_LENGTH(CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+
+--echo #
+--echo # Virtual columns
+--echo #
+
+--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED
+CREATE TABLE t1 (
+ a INT,
+ b UUID GENERATED ALWAYS AS (CAST(CONCAT(RAND(),a) AS UUID)), INDEX(b)
+);
+
+CREATE TABLE t1 (
+ a INT,
+ b UUID GENERATED ALWAYS AS (CAST(CONCAT('00000000-0000-0000-0000-00000000001',HEX(a)) AS UUID)), INDEX(b)
+);
+INSERT INTO t1 (a) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # VIEW
+--echo #
+
+CREATE TABLE t1 (a INT DEFAULT 0);
+INSERT INTO t1 (a) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15);
+SELECT * FROM t1 ORDER BY a;
+CREATE VIEW v1 AS SELECT (CAST(CONCAT('00000000-0000-0000-0000-00000000001',HEX(a)) AS UUID)) AS c FROM t1;
+SELECT * FROM v1 ORDER BY c;
+DROP VIEW v1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+CREATE VIEW v1 AS SELECT * FROM t1;
+SHOW CREATE VIEW v1;
+DESCRIBE v1;
+INSERT INTO v1 VALUES
+(DEFAULT),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT * FROM t1;
+DROP VIEW v1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID DEFAULT CAST('00000000-0000-0000-0000-000000000000' AS UUID));
+CREATE VIEW v1 AS SELECT * FROM t1;
+SHOW CREATE VIEW v1;
+DESCRIBE v1;
+INSERT INTO v1 VALUES
+(DEFAULT),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT * FROM t1;
+DROP VIEW v1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # Subqueries
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('00000000-0000-0000-0000-000000000000'),
+('00000000-0000-0000-0000-000000000001'),
+('00000000-0000-0000-0000-000000000002');
+SELECT * FROM t1 WHERE a=(SELECT MIN(a) FROM t1) ORDER BY a;
+SELECT * FROM t1 WHERE a=(SELECT MAX(a) FROM t1) ORDER BY a;
+SELECT * FROM t1 WHERE a IN (SELECT a FROM t1 WHERE a>'00000000-0000-0000-0000-000000000000') ORDER BY a;
+DROP TABLE t1;
+
+--echo #
+--echo # Stored routines
+--echo #
+
+DELIMITER $$;
+CREATE PROCEDURE p1(a UUID)
+BEGIN
+ DECLARE b UUID DEFAULT CONCAT('1',SUBSTRING(a,2,36));
+ SELECT a, b;
+END;
+$$
+DELIMITER ;$$
+CALL p1('00000000-0000-0000-0000-000000000001');
+CALL p1(CAST('00000000-0000-0000-0000-000000000002' AS UUID));
+DROP PROCEDURE p1;
+
+DELIMITER $$;
+CREATE FUNCTION f1(a UUID) RETURNS UUID
+BEGIN
+ RETURN CONCAT('1',SUBSTRING(a,2,36));
+END;
+$$
+DELIMITER ;$$
+SELECT f1('00000000-0000-0000-0000-000000000001');
+SELECT f1(CAST('00000000-0000-0000-0000-000000000002' AS UUID));
+DROP FUNCTION f1;
+
+--echo #
+--echo # Anchored data types in SP variables
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+DELIMITER $$;
+CREATE PROCEDURE p1()
+BEGIN
+ DECLARE va TYPE OF t1.a;
+ SELECT MAX(a) INTO va FROM t1;
+ SELECT va;
+END;
+$$
+DELIMITER ;$$
+CALL p1;
+DROP PROCEDURE p1;
+DROP TABLE t1;
+
+
+CREATE TABLE t1 (a UUID, b UUID);
+INSERT INTO t1 VALUES
+(
+ '00000000-0000-0000-0000-00000000000a',
+ '00000000-0000-0000-0000-00000000000b'
+);
+DELIMITER $$;
+CREATE PROCEDURE p1()
+BEGIN
+ DECLARE va ROW TYPE OF t1;
+ SELECT MAX(a), MAX(b) INTO va FROM t1;
+ SELECT va.a, va.b;
+END;
+$$
+DELIMITER ;$$
+CALL p1;
+DROP PROCEDURE p1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # Optimizer: make_const_item_for_comparison
+--echo #
+
+CREATE TABLE t1 (id INT, a UUID);
+INSERT INTO t1 VALUES
+(1,'00000000-0000-0000-0000-000000000001'),
+(2,'00000000-0000-0000-0000-000000000002');
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=COALESCE(CAST('00000000-0000-0000-0000-000000000001' AS UUID)) AND id>0;
+DROP TABLE t1;
+
+--echo #
+--echo # Optimizer: equal field propagation
+--echo #
+
+CREATE TABLE t1 (id INT, a UUID);
+INSERT INTO t1 VALUES
+(1,'00000000-0000-0000-0000-000000000001'),
+(2,'00000000-0000-0000-0000-000000000002');
+EXPLAIN EXTENDED SELECT * FROM t1
+WHERE a=COALESCE(CAST('00000000-0000-0000-0000-000000000001' AS UUID))
+ AND LENGTH(CONCAT(a,RAND()))>1;
+EXPLAIN EXTENDED SELECT * FROM t1
+WHERE a=COALESCE(CAST('00000000-0000-0000-0000-000000000001' AS UUID))
+ AND LENGTH(a)>1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # Optimizer: equal expression propagation
+--echo #
+
+
+CREATE TABLE t1 (id INT, a UUID);
+INSERT INTO t1 VALUES
+(1,'00000000-0000-0000-0000-000000000001'),
+(2,'00000000-0000-0000-0000-000000000002');
+EXPLAIN EXTENDED SELECT * FROM t1
+WHERE COALESCE(a)='00000000-0000-0000-0000-000000000001' AND COALESCE(a)=CONCAT(a);
+DROP TABLE t1;
+
+--echo #
+--echo # Subquery materialization
+--echo #
+
+CREATE TABLE t1 (a UUID, b VARCHAR(36), KEY (a), KEY(b)) ;
+INSERT INTO t1 VALUES
+(
+ '00000000-0000-0000-0000-00000000000a',
+ '00000000-0000-0000-0000-00000000000a'
+),
+(
+ '00000000-0000-0000-0000-00000000000a',
+ '00000000-0000-0000-0000-00000000000b'
+);
+SET @@optimizer_switch='semijoin=off,materialization=on,in_to_exists=off,subquery_cache=off';
+EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT a AS a_inner FROM t1 GROUP BY a_inner);
+EXPLAIN SELECT * FROM t1 WHERE b IN (SELECT a AS a_inner FROM t1 GROUP BY a_inner);
+SET @@optimizer_switch=DEFAULT;
+DROP TABLE t1;
+
+
+--echo #
+--echo # ALTER from UUID to UUID
+--echo #
+
+CREATE TABLE t1 (a UUID, b INT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001', 1);
+ALTER TABLE t1 MODIFY b DECIMAL(10,2);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # ALTER to character string data types
+--echo #
+
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS CHAR(36)) FROM t1;
+ALTER TABLE t1 MODIFY a CHAR(39);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a VARCHAR(36);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a TINYTEXT;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a TEXT;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a MEDIUMTEXT;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a LONGTEXT;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # ALTER from character string data types
+--echo #
+
+CREATE OR REPLACE TABLE t1 (a CHAR(64));
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a VARCHAR(64));
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a TINYTEXT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a TEXT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a MEDIUMTEXT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+CREATE OR REPLACE TABLE t1 (a LONGTEXT);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS UUID) FROM t1;
+ALTER TABLE t1 MODIFY a UUID;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # ALTER to binary string data types
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a BINARY(16);
+SELECT HEX(a) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a BINARY(17);
+SELECT HEX(a) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+--error ER_DATA_TOO_LONG
+ALTER TABLE t1 MODIFY a BINARY(15);
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a TINYBLOB;
+SELECT HEX(a) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a BLOB;
+SELECT HEX(a) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a MEDIUMBLOB;
+SELECT HEX(a) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a LONGBLOB;
+SELECT HEX(a) FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # ALTER from binary string data types
+--echo #
+
+CREATE TABLE t1 (a BINARY(16));
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a BINARY(17));
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF000042832900');
+--error ER_TRUNCATED_WRONG_VALUE
+ALTER TABLE t1 MODIFY a UUID;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a BINARY(15));
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF00004283');
+--error ER_TRUNCATED_WRONG_VALUE
+ALTER TABLE t1 MODIFY a UUID;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a TINYBLOB);
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a BLOB);
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a MEDIUMBLOB);
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a BLOB);
+INSERT INTO t1 VALUES (X'20010DB8000000000000FF0000428329');
+ALTER TABLE t1 MODIFY a UUID;
+SELECT a FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # SET from UUID to UUID
+--echo #
+
+CREATE TABLE t1 (a UUID, b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # SET from UUID to numeric
+--echo #
+
+CREATE TABLE t1 (a UUID, b INT);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b DOUBLE);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b DECIMAL(32,0));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b YEAR);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # SET from numeric to UUID
+--echo #
+
+CREATE TABLE t1 (a INT, b UUID);
+INSERT INTO t1 VALUES (1, NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a DOUBLE, b UUID);
+INSERT INTO t1 VALUES (1, NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a DECIMAL(32,0), b UUID);
+INSERT INTO t1 VALUES (1, NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a YEAR, b UUID);
+INSERT INTO t1 VALUES (1, NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # SET from UUID to temporal
+--echo #
+
+CREATE TABLE t1 (a UUID, b TIME);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b DATE);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b DATETIME);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b TIMESTAMP NULL DEFAULT NULL);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # SET from temporal to UUID
+--echo #
+
+CREATE TABLE t1 (a TIME, b UUID);
+INSERT INTO t1 VALUES ('00:00:00', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a DATE, b UUID);
+INSERT INTO t1 VALUES ('2001-01:01', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a DATETIME, b UUID);
+INSERT INTO t1 VALUES ('2001-01-01 10:20:30', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a TIMESTAMP, b UUID);
+INSERT INTO t1 VALUES ('2001-01-01 10:20:30', NULL);
+--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # SET from UUID to character string
+--echo #
+
+CREATE TABLE t1 (a UUID, b CHAR(39));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b VARCHAR(39));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b TEXT);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b ENUM('ffffffff-ffff-ffff-ffff-ffffffffffff'));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b SET('ffffffff-ffff-ffff-ffff-ffffffffffff'));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # SET from character string to UUID
+--echo #
+
+CREATE TABLE t1 (a CHAR(36), b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a VARCHAR(36), b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a TEXT, b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a ENUM('ffffffff-ffff-ffff-ffff-ffffffffffff'), b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a SET('ffffffff-ffff-ffff-ffff-ffffffffffff'), b UUID);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # SET from UUID to binary
+--echo #
+
+CREATE TABLE t1 (a UUID, b BINARY(16));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT HEX(b) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b VARBINARY(39));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT HEX(b) FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID, b BLOB);
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-ffffffffffff', NULL);
+UPDATE t1 SET b=a;
+SELECT HEX(b) FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # SET from binary to UUID
+--echo #
+
+CREATE TABLE t1 (a BINARY(16), b UUID);
+INSERT INTO t1 VALUES (CONCAT(0xFFFF,REPEAT(0x0000,6),0xFFFF), NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a VARBINARY(16), b UUID);
+INSERT INTO t1 VALUES (CONCAT(0xFFFF,REPEAT(0x0000,6),0xFFFF), NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a BLOB, b UUID);
+INSERT INTO t1 VALUES (CONCAT(0xFFFF,REPEAT(0x0000,6),0xFFFF), NULL);
+UPDATE t1 SET b=a;
+SELECT b FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # Limit clause parameter
+--echo # TODO: this should fail.
+--echo # The test for a valid data type should be moved
+--echo # from parse time to fix_fields() time, and performed
+--echo # for both Item_splocal and Item_param.
+--echo #
+
+EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL LIMIT ?' USING CAST('00000000-0000-0000-0000-000000000000' AS UUID);
+
+
+# TODO:
+# - Add hooks to run mysql_client_test with pluggable data types
+#
+# - This should fail with the "illegal data type" error:
+#SELECT CAST('00000000-0000-0000-0000-000000000000' AS UUID) DIV 1;
+#
+# - This should fail with the "illegal data type" error:
+# EXTRACT(MINUTE...)
+#
+
+
+--echo #
+--echo # ALTER from UUID to CHAR
+--echo #
+
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT CAST(a AS CHAR(36)) FROM t1;
+ALTER TABLE t1 MODIFY a CHAR(36);
+SELECT * FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # ALTER from UUID to BINARY(16)
+--echo #
+
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+ALTER TABLE t1 MODIFY a BINARY(16);
+SELECT HEX(a) FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # CAST(uuid AS BINARY)
+--echo #
+
+CREATE OR REPLACE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000001');
+SELECT HEX(CAST(a AS BINARY)) FROM t1;
+SELECT HEX(CAST(a AS BINARY(16))) FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # CAST from UUID to FLOAT
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000');
+--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
+SELECT CAST(a AS FLOAT) FROM t1;
+DROP TABLE t1;
+
+# TODO: below does not work well
+#--echo #
+#--echo # Conversion from UUID to other types
+#--echo #
+#
+#CREATE TABLE t1 (a UUID, b INT);
+#INSERT INTO t1 (a) VALUES ('00000000-0000-0000-0000-000000000000');
+#--error WARN_DATA_TRUNCATED
+#UPDATE t1 SET b=a;
+#SELECT * FROM t1;
+#DROP TABLE t1;
+#
+#SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30');
+#CREATE TABLE t1 (a UUID, b TIMESTAMP);
+#INSERT INTO t1 (a) VALUES ('00000000-0000-0000-0000-000000000000');
+#--error WARN_DATA_TRUNCATED
+#UPDATE t1 SET b=a;
+#SELECT * FROM t1;
+#DROP TABLE t1;
+#SET timestamp=DEFAULT;
+#
+#CREATE OR REPLACE TABLE t1 (a UUID);
+#INSERT INTO t1 (a) VALUES ('00000000-0000-0000-0000-000000000000');
+#--error WARN_DATA_TRUNCATED
+#ALTER TABLE t1 MODIFY a DATE;
+#DROP TABLE t1;
+
+--echo #
+--echo # CAST(UUID AS BINARY) - metadata
+--echo #
+
+CREATE TABLE t1 (a UUID);
+--enable_metadata
+SELECT
+ CAST(a AS BINARY(0)),
+ CAST(a AS BINARY(1)),
+ CAST(a AS BINARY(16)),
+ CAST(a AS BINARY(255)),
+ CAST(a AS BINARY(256)),
+ CAST(a AS BINARY(512)),
+ CAST(a AS BINARY(513)),
+ CAST(a AS BINARY(65532)),
+ CAST(a AS BINARY(65533)),
+ CAST(a AS BINARY(65534)),
+ CAST(a AS BINARY(65535)),
+ CAST(a AS BINARY(65536)),
+ CAST(a AS BINARY(16777215)),
+ CAST(a AS BINARY(16777216))
+FROM t1;
+--disable_metadata
+DROP TABLE t1;
+
+--echo #
+--echo # MIN(uuid) with GROUP BY
+--echo #
+
+CREATE TABLE t1 (id INT, a UUID) ENGINE=MyISAM;
+INSERT INTO t1 VALUES
+(1, '00000000-0000-0000-0000-000000000fff'),
+(1, '00000000-0000-0000-0000-000000008888');
+SELECT MIN(a), MAX(a) FROM t1 GROUP BY id;
+DROP TABLE t1;
+
+
+--echo #
+--echo # MDEV-26785 Hyphens inside the value of uuid datatype
+--echo #
+
+CREATE TABLE t1 (a UUID);
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES ('0000000000000000000000000000000'/*31 digits*/);
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES ('000000000000000000000000000000000'/*33 digits*/);
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES ('-00000000000000000000000000000000'/*leading hyphen*/);
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES ('-00000000000000000000000000000000-'/*trailing hyphen*/);
+
+INSERT INTO t1 VALUES ('00000000000000000000000000000000');
+INSERT INTO t1 VALUES ('0-0000000000000000000000000000011');
+INSERT INTO t1 VALUES ('0--0000000000000000000000000000012');
+INSERT INTO t1 VALUES ('0---0000000000000000000000000000013');
+INSERT INTO t1 VALUES ('0----0000000000000000000000000000014');
+INSERT INTO t1 VALUES ('00-000000000000000000000000000021');
+INSERT INTO t1 VALUES ('00--000000000000000000000000000022');
+INSERT INTO t1 VALUES ('00---000000000000000000000000000023');
+INSERT INTO t1 VALUES ('00----000000000000000000000000000024');
+
+INSERT INTO t1 VALUES ('5796dac11a1c11--------------ecab4ef859-713e4be4');
+INSERT INTO t1 VALUES ('5796dac11a1c11---------------ecab4ef859-713e4be4');
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26732 Assertion `0' failed in Item::val_native
+--echo #
+
+SELECT uuid() AS f, var_pop('x') FROM dual HAVING f > '';
+
+
+--echo #
+--echo # MDEV-28491 Uuid. "UPDATE/DELETE" not working "WHERE id IN (SELECT id FROM ..)"
+--echo #
+
+CREATE TABLE companies (id uuid, name varchar(10));
+INSERT INTO companies (id) values ('7bc95b06-cc6c-11ec-96c5-0242ac130002');
+
+CREATE TABLE divisions (company_id uuid);
+INSERT INTO divisions (company_id) values ('7bc95b06-cc6c-11ec-96c5-0242ac130002');
+SELECT * FROM companies WHERE id IN (SELECT company_id FROM divisions);
+UPDATE companies SET name = 'value' WHERE id IN (SELECT company_id FROM divisions);
+SELECT * FROM companies;
+DELETE FROM companies WHERE id IN (SELECT company_id FROM divisions);
+SELECT * FROM companies;
+DROP TABLE divisions;
+DROP TABLE companies;
+
+
+--echo #
+--echo # MDEV-27100 Subquery using the ALL keyword on UUID columns produces a wrong result
+--echo #
+
+CREATE TABLE t1 (d UUID);
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-111111111111'), ('11111111-0000-0000-0000-000000000000');
+SELECT * FROM t1 ORDER BY d;
+SELECT * FROM t1 WHERE d <= ALL (SELECT * FROM t1);
+SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1);
+DROP TABLE t1;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_csv.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_csv.result
new file mode 100644
index 00000000000..d912244e691
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_csv.result
@@ -0,0 +1,92 @@
+#
+# Start of 10.5 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+SET default_storage_engine=CSV;
+CREATE TABLE t1 (a UUID NOT NULL);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid NOT NULL
+) ENGINE=CSV DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+FOR i IN 0..255
+DO
+INSERT INTO t1 VALUES (CONCAT(REPEAT(0x00,15), UNHEX(HEX(i))));
+END FOR
+$$
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+a
+00000000-0000-0000-0000-0000000000ff
+SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe' ORDER BY a;
+a
+00000000-0000-0000-0000-0000000000fe
+00000000-0000-0000-0000-0000000000ff
+SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'00000000-0000-0000-0000-0000000000ff'
+)
+ORDER BY a;
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-0000000000a0
+00000000-0000-0000-0000-0000000000ff
+SELECT * FROM t1
+WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080'
+ AND
+'00000000-0000-0000-0000-000000000081'
+ORDER BY a;
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-000000000081
+SELECT CONCAT('ffff',SUBSTRING(a, 5,256)) FROM t1 WHERE a LIKE '%a_';
+CONCAT('ffff',SUBSTRING(a, 5,256))
+ffff0000-0000-0000-0000-0000000000a0
+ffff0000-0000-0000-0000-0000000000a1
+ffff0000-0000-0000-0000-0000000000a2
+ffff0000-0000-0000-0000-0000000000a3
+ffff0000-0000-0000-0000-0000000000a4
+ffff0000-0000-0000-0000-0000000000a5
+ffff0000-0000-0000-0000-0000000000a6
+ffff0000-0000-0000-0000-0000000000a7
+ffff0000-0000-0000-0000-0000000000a8
+ffff0000-0000-0000-0000-0000000000a9
+ffff0000-0000-0000-0000-0000000000aa
+ffff0000-0000-0000-0000-0000000000ab
+ffff0000-0000-0000-0000-0000000000ac
+ffff0000-0000-0000-0000-0000000000ad
+ffff0000-0000-0000-0000-0000000000ae
+ffff0000-0000-0000-0000-0000000000af
+UPDATE t1 SET a=CONCAT('ffff',SUBSTRING(a, 5,256)) WHERE a LIKE '%a_';
+SELECT * FROM t1 WHERE a LIKE 'ffff%' ORDER BY a;
+a
+ffff0000-0000-0000-0000-0000000000a0
+ffff0000-0000-0000-0000-0000000000a1
+ffff0000-0000-0000-0000-0000000000a2
+ffff0000-0000-0000-0000-0000000000a3
+ffff0000-0000-0000-0000-0000000000a4
+ffff0000-0000-0000-0000-0000000000a5
+ffff0000-0000-0000-0000-0000000000a6
+ffff0000-0000-0000-0000-0000000000a7
+ffff0000-0000-0000-0000-0000000000a8
+ffff0000-0000-0000-0000-0000000000a9
+ffff0000-0000-0000-0000-0000000000aa
+ffff0000-0000-0000-0000-0000000000ab
+ffff0000-0000-0000-0000-0000000000ac
+ffff0000-0000-0000-0000-0000000000ad
+ffff0000-0000-0000-0000-0000000000ae
+ffff0000-0000-0000-0000-0000000000af
+DROP TABLE t1;
+CREATE TABLE t1 (a UUID NOT NULL) ENGINE=CSV;
+INSERT INTO t1 VALUES ('123e4567-e89b-12d3-a456-426655440000');
+SELECT * FROM t1;
+a
+123e4567-e89b-12d3-a456-426655440000
+DROP TABLE t1;
+#
+# End of 10.5 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_csv.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_csv.test
new file mode 100644
index 00000000000..482fb6a0e43
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_csv.test
@@ -0,0 +1,58 @@
+--source include/have_csv.inc
+
+--echo #
+--echo # Start of 10.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+SET default_storage_engine=CSV;
+
+CREATE TABLE t1 (a UUID NOT NULL);
+SHOW CREATE TABLE t1;
+
+DELIMITER $$;
+FOR i IN 0..255
+DO
+ INSERT INTO t1 VALUES (CONCAT(REPEAT(0x00,15), UNHEX(HEX(i))));
+END FOR
+$$
+DELIMITER ;$$
+
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+
+SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe' ORDER BY a;
+
+SELECT * FROM t1 WHERE a IN
+(
+ '00000000-0000-0000-0000-000000000080',
+ '00000000-0000-0000-0000-0000000000a0',
+ '00000000-0000-0000-0000-0000000000ff'
+)
+ORDER BY a;
+
+SELECT * FROM t1
+WHERE a BETWEEN
+ '00000000-0000-0000-0000-000000000080'
+ AND
+ '00000000-0000-0000-0000-000000000081'
+ORDER BY a;
+
+SELECT CONCAT('ffff',SUBSTRING(a, 5,256)) FROM t1 WHERE a LIKE '%a_';
+UPDATE t1 SET a=CONCAT('ffff',SUBSTRING(a, 5,256)) WHERE a LIKE '%a_';
+
+SELECT * FROM t1 WHERE a LIKE 'ffff%' ORDER BY a;
+
+DROP TABLE t1;
+
+CREATE TABLE t1 (a UUID NOT NULL) ENGINE=CSV;
+INSERT INTO t1 VALUES ('123e4567-e89b-12d3-a456-426655440000');
+SELECT * FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_engines.inc b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_engines.inc
new file mode 100644
index 00000000000..41494c86ff6
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_engines.inc
@@ -0,0 +1,108 @@
+--echo #
+--echo # Range optimizer
+--echo #
+
+CREATE TABLE t1 (a UUID, INDEX(a));
+SHOW CREATE TABLE t1;
+
+DELIMITER $$;
+FOR i IN 0..255
+DO
+ INSERT INTO t1 VALUES (CONCAT(REPEAT(0x00, 15),CHAR(i USING BINARY)));
+END FOR
+$$
+DELIMITER ;$$
+
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+SELECT * FROM t1 WHERE a='garbage';
+EXPLAIN SELECT * FROM t1 WHERE a='garbage';
+
+SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe';
+EXPLAIN SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe';
+SELECT * FROM t1 WHERE a>='garbage';
+EXPLAIN SELECT * FROM t1 WHERE a>='garbage';
+
+SELECT * FROM t1 WHERE a IN
+(
+ '00000000-0000-0000-0000-000000000080',
+ '00000000-0000-0000-0000-0000000000a0',
+ '00000000-0000-0000-0000-0000000000f0'
+);
+EXPLAIN SELECT * FROM t1 WHERE a IN
+(
+ '00000000-0000-0000-0000-000000000080',
+ '00000000-0000-0000-0000-0000000000a0',
+ '00000000-0000-0000-0000-0000000000f0'
+);
+SELECT * FROM t1 WHERE a IN
+(
+ '00000000-0000-0000-0000-000000000080',
+ '00000000-0000-0000-0000-0000000000a0',
+ 'garbage'
+);
+EXPLAIN SELECT * FROM t1 WHERE a IN
+(
+ '00000000-0000-0000-0000-000000000080',
+ '00000000-0000-0000-0000-0000000000a0',
+ 'garbage'
+);
+
+SELECT * FROM t1 WHERE a BETWEEN
+ '00000000-0000-0000-0000-000000000080' AND
+ '00000000-0000-0000-0000-000000000081';
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN
+ '00000000-0000-0000-0000-000000000080' AND
+ '00000000-0000-0000-0000-000000000081';
+
+SELECT * FROM t1 WHERE a BETWEEN
+ '00000000-0000-0000-0000-000000000080' AND
+ 'garbage';
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN
+ '00000000-0000-0000-0000-000000000080' AND
+ 'garbage';
+
+SELECT * FROM t1 WHERE a=CAST('00000000-0000-0000-0000-0000000000ff' AS UUID);
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=CAST('00000000-0000-0000-0000-0000000000ff' AS UUID);
+
+DROP TABLE t1;
+
+
+CREATE OR REPLACE TABLE t1 (a UUID,KEY(a));
+SHOW CREATE TABLE t1;
+BEGIN;
+DELIMITER $$;
+FOR i IN 0..255
+DO
+ INSERT INTO t1 VALUES (REPLACE('XX000000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00XX0000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('0000XX00-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('000000XX-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-XX00-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-00XX-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-XX00-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-00XX-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-XX00-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-00XX-000000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-XX0000000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00XX00000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000XX000000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-000000XX0000','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00000000XX00','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000000000XX','XX',LPAD(HEX(i),2,'0')));
+END FOR;
+$$
+DELIMITER ;$$
+COMMIT;
+EXPLAIN SELECT * FROM t1 WHERE a='ff000000-0000-0000-0000-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='00ff0000-0000-0000-0000-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='0000ff00-0000-0000-0000-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='000000ff-0000-0000-0000-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-ff00-0000-0000-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-00ff-0000-0000-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-ff00-0000-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-00ff-0000-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-ff00-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-00ff-000000000000';
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-ff0000000000';
+DROP TABLE t1;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.result
new file mode 100644
index 00000000000..d769f1a1374
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.result
@@ -0,0 +1,203 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+SET default_storage_engine=InnoDB;
+#
+# Range optimizer
+#
+CREATE TABLE t1 (a UUID, INDEX(a));
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+FOR i IN 0..255
+DO
+INSERT INTO t1 VALUES (CONCAT(REPEAT(0x00, 15),CHAR(i USING BINARY)));
+END FOR
+$$
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+a
+00000000-0000-0000-0000-0000000000ff
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+SELECT * FROM t1 WHERE a='garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+EXPLAIN SELECT * FROM t1 WHERE a='garbage';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe';
+a
+00000000-0000-0000-0000-0000000000fe
+00000000-0000-0000-0000-0000000000ff
+EXPLAIN SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 2 Using where; Using index
+SELECT * FROM t1 WHERE a>='garbage';
+a
+EXPLAIN SELECT * FROM t1 WHERE a>='garbage';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
+SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'00000000-0000-0000-0000-0000000000f0'
+);
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-0000000000a0
+00000000-0000-0000-0000-0000000000f0
+EXPLAIN SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'00000000-0000-0000-0000-0000000000f0'
+);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 3 Using where; Using index
+SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'garbage'
+);
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-0000000000a0
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+EXPLAIN SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'garbage'
+);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 2 Using where; Using index
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'00000000-0000-0000-0000-000000000081';
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-000000000081
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'00000000-0000-0000-0000-000000000081';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 2 Using where; Using index
+SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'garbage';
+a
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'garbage';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
+SELECT * FROM t1 WHERE a=CAST('00000000-0000-0000-0000-0000000000ff' AS UUID);
+a
+00000000-0000-0000-0000-0000000000ff
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=CAST('00000000-0000-0000-0000-0000000000ff' AS UUID);
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ref a a 17 const 1 100.00 Using where; Using index
+Warnings:
+Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = UUID'00000000-0000-0000-0000-0000000000ff'
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a UUID,KEY(a));
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+BEGIN;
+FOR i IN 0..255
+DO
+INSERT INTO t1 VALUES (REPLACE('XX000000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00XX0000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('0000XX00-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('000000XX-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-XX00-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-00XX-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-XX00-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-00XX-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-XX00-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-00XX-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-XX0000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00XX00000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000XX000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-000000XX0000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00000000XX00','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000000000XX','XX',LPAD(HEX(i),2,'0')));
+END FOR;
+$$
+COMMIT;
+EXPLAIN SELECT * FROM t1 WHERE a='ff000000-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00ff0000-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='0000ff00-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='000000ff-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-ff00-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-00ff-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-ff00-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-00ff-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-ff00-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-00ff-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-ff0000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+DROP TABLE t1;
+#
+# MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item
+#
+CREATE TABLE t1 ( pk uuid, c text) engine=myisam;
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000',1);
+CREATE TABLE t2 ( d text, KEY (d)) engine=innodb ;
+Warnings:
+Note 1071 Specified key was too long; max key length is 3072 bytes
+INSERT INTO t2 VALUES (2);
+SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d);
+d pk c
+Warnings:
+Warning 1292 Incorrect uuid value: '2'
+EXPLAIN SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 system NULL NULL NULL NULL 1
+1 SIMPLE t2 ALL d NULL NULL NULL 1 Using where
+UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1;
+ERROR 22007: Incorrect uuid value: '2'
+DROP TABLE t1, t2;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.test
new file mode 100644
index 00000000000..941a7a73d9a
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.test
@@ -0,0 +1,31 @@
+--source include/have_innodb.inc
+
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+SET default_storage_engine=InnoDB;
+--source type_uuid_engines.inc
+
+--echo #
+--echo # MDEV-26742 Assertion `field->type_handler() == this' failed in FixedBinTypeBundle<NATIVE_LEN, MAX_CHAR_LEN>::Type_handler_fbt::stored_field_cmp_to_item
+--echo #
+
+CREATE TABLE t1 ( pk uuid, c text) engine=myisam;
+INSERT INTO t1 VALUES ('00000000-0000-0000-0000-000000000000',1);
+CREATE TABLE t2 ( d text, KEY (d)) engine=innodb ;
+INSERT INTO t2 VALUES (2);
+SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d);
+EXPLAIN SELECT * FROM t2 JOIN t1 ON ( t1.pk > t2.d);
+--error ER_TRUNCATED_WRONG_VALUE
+UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1;
+DROP TABLE t1, t2;
+
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_memory.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_memory.result
new file mode 100644
index 00000000000..f2a1e27d0d0
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_memory.result
@@ -0,0 +1,250 @@
+#
+# Start of 10.5 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+SET default_storage_engine=MEMORY;
+#
+# Range optimizer
+#
+CREATE TABLE t1 (a UUID, INDEX(a));
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+FOR i IN 0..255
+DO
+INSERT INTO t1 VALUES (CONCAT(REPEAT(0x00, 15),CHAR(i USING BINARY)));
+END FOR
+$$
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+a
+00000000-0000-0000-0000-0000000000ff
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 4 Using where
+SELECT * FROM t1 WHERE a='garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+EXPLAIN SELECT * FROM t1 WHERE a='garbage';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe';
+a
+00000000-0000-0000-0000-0000000000fe
+00000000-0000-0000-0000-0000000000ff
+EXPLAIN SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL a NULL NULL NULL 256 Using where
+SELECT * FROM t1 WHERE a>='garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+EXPLAIN SELECT * FROM t1 WHERE a>='garbage';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL a NULL NULL NULL 256 Using where
+SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'00000000-0000-0000-0000-0000000000f0'
+);
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-0000000000a0
+00000000-0000-0000-0000-0000000000f0
+EXPLAIN SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'00000000-0000-0000-0000-0000000000f0'
+);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 12 Using where
+SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'garbage'
+);
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-0000000000a0
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+EXPLAIN SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'garbage'
+);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 8 Using where
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'00000000-0000-0000-0000-000000000081';
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-000000000081
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'00000000-0000-0000-0000-000000000081';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL a NULL NULL NULL 256 Using where
+SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+Warning 1292 Incorrect uuid value: 'garbage'
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'garbage';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL a NULL NULL NULL 256 Using where
+SELECT * FROM t1 WHERE a=CAST('00000000-0000-0000-0000-0000000000ff' AS UUID);
+a
+00000000-0000-0000-0000-0000000000ff
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=CAST('00000000-0000-0000-0000-0000000000ff' AS UUID);
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ref a a 17 const 4 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = UUID'00000000-0000-0000-0000-0000000000ff'
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a UUID,KEY(a));
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+BEGIN;
+FOR i IN 0..255
+DO
+INSERT INTO t1 VALUES (REPLACE('XX000000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00XX0000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('0000XX00-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('000000XX-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-XX00-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-00XX-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-XX00-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-00XX-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-XX00-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-00XX-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-XX0000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00XX00000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000XX000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-000000XX0000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00000000XX00','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000000000XX','XX',LPAD(HEX(i),2,'0')));
+END FOR;
+$$
+COMMIT;
+EXPLAIN SELECT * FROM t1 WHERE a='ff000000-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='00ff0000-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='0000ff00-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='000000ff-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-ff00-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-00ff-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-ff00-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-00ff-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-ff00-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-00ff-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-ff0000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 2 Using where
+DROP TABLE t1;
+#
+# End of 10.5 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_memory.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_memory.test
new file mode 100644
index 00000000000..cdae2bc39c2
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_memory.test
@@ -0,0 +1,15 @@
+--echo #
+--echo # Start of 10.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+SET default_storage_engine=MEMORY;
+--source type_uuid_engines.inc
+
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_decimal.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_decimal.result
new file mode 100644
index 00000000000..65dcabda42d
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_decimal.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from UUID UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source DECIMAL(38,0) DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ `source` decimal(38,0) DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect uuid value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 0
+2 00000000-0000-0000-0000-000000000000 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect uuid value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target decimal(38,0)
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src decimal(38,0) DEFAULT NULL;
+DECLARE dst uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a uuid) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a uuid) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst uuid)
+BEGIN
+DECLARE src decimal(38,0) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'decimal' as 'uuid' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS uuid
+BEGIN
+DECLARE rc decimal(38,0) DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src decimal(38,0) DEFAULT NULL;
+DECLARE cur1 CURSOR(t uuid) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target DECIMAL(38,0) DEFAULT 0, source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` decimal(38,0) DEFAULT 0,
+ `source` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1265 Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 0 00000000-0000-0000-0000-000000000000
+2 0 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 01000: Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 0 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target uuid
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'decimal' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE dst decimal(38,0) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a decimal(38,0)) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a decimal(38,0)) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst decimal(38,0))
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst decimal(38,0) DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'uuid' as 'decimal' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS decimal(38,0)
+BEGIN
+DECLARE rc uuid DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE cur1 CURSOR(t decimal(38,0)) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst decimal(38,0) DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'decimal' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_decimal.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_decimal.test
new file mode 100644
index 00000000000..234e31b6565
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_decimal.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from UUID UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source DECIMAL(38,0) DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target DECIMAL(38,0) DEFAULT 0, source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_double.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_double.result
new file mode 100644
index 00000000000..ae19f916544
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_double.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source DOUBLE DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ `source` double DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect uuid value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 0
+2 00000000-0000-0000-0000-000000000000 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect uuid value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target double
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src double DEFAULT NULL;
+DECLARE dst uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a uuid) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a uuid) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst uuid)
+BEGIN
+DECLARE src double DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'double' as 'uuid' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS uuid
+BEGIN
+DECLARE rc double DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src double DEFAULT NULL;
+DECLARE cur1 CURSOR(t uuid) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target DOUBLE DEFAULT 0, source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` double DEFAULT 0,
+ `source` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1265 Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 0 00000000-0000-0000-0000-000000000000
+2 0 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 01000: Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 0 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target uuid
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'double' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE dst double DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a double) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a double) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst double)
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst double DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'uuid' as 'double' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS double
+BEGIN
+DECLARE rc uuid DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE cur1 CURSOR(t double) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst double DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'double' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_double.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_double.test
new file mode 100644
index 00000000000..8e8529aeed3
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_double.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source DOUBLE DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target DOUBLE DEFAULT 0, source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_int.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_int.result
new file mode 100644
index 00000000000..c92584a8b1e
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_int.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source INT DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ `source` int(11) DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect uuid value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 0
+2 00000000-0000-0000-0000-000000000000 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect uuid value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target int(11)
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(11) DEFAULT NULL;
+DECLARE dst uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a uuid) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a uuid) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst uuid)
+BEGIN
+DECLARE src int(11) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'int' as 'uuid' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS uuid
+BEGIN
+DECLARE rc int(11) DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(11) DEFAULT NULL;
+DECLARE cur1 CURSOR(t uuid) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target INT DEFAULT 0, source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` int(11) DEFAULT 0,
+ `source` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1265 Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 0 00000000-0000-0000-0000-000000000000
+2 0 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 01000: Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 0 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target uuid
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'int' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE dst int(11) DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a int(11)) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a int(11)) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst int(11))
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst int(11) DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'uuid' as 'int' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS int(11)
+BEGIN
+DECLARE rc uuid DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE cur1 CURSOR(t int(11)) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst int(11) DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'int' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_int.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_int.test
new file mode 100644
index 00000000000..79a55566258
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_int.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source INT DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target INT DEFAULT 0, source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_time.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_time.result
new file mode 100644
index 00000000000..a4feb55b577
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_time.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source TIME DEFAULT '00:00:00');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ `source` time DEFAULT '00:00:00',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect uuid value: '00:00:00' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 00:00:00
+2 00000000-0000-0000-0000-000000000000 00:00:00
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect uuid value: '00:00:00' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 00:00:00
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target time
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src time DEFAULT NULL;
+DECLARE dst uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a uuid) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a uuid) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst uuid)
+BEGIN
+DECLARE src time DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'time' as 'uuid' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS uuid
+BEGIN
+DECLARE rc time DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src time DEFAULT NULL;
+DECLARE cur1 CURSOR(t uuid) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target TIME DEFAULT '00:00:00', source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` time DEFAULT '00:00:00',
+ `source` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1265 Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 00:00:00 00000000-0000-0000-0000-000000000000
+2 00:00:00 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect time value: '00000000-0000-0000-0000-000000000000' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00:00:00 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target uuid
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'time' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE dst time DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a time) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a time) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst time)
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst time DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'uuid' as 'time' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS time
+BEGIN
+DECLARE rc uuid DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE cur1 CURSOR(t time) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst time DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'time' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_time.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_time.test
new file mode 100644
index 00000000000..5182d0ceebd
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_time.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source TIME DEFAULT '00:00:00');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target TIME DEFAULT '00:00:00', source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_uint.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_uint.result
new file mode 100644
index 00000000000..252704d57ef
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_uint.result
@@ -0,0 +1,353 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+#
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source INT UNSIGNED DEFAULT 0);
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ `source` int(10) unsigned DEFAULT 0,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1292 Incorrect uuid value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 0
+2 00000000-0000-0000-0000-000000000000 0
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 22007: Incorrect uuid value: '0' for column `test`.`t3`.`target` at row 2
+SELECT * FROM v3;
+id target source
+1 00000000-0000-0000-0000-000000000000 0
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target int(10) unsigned
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(10) unsigned DEFAULT NULL;
+DECLARE dst uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a uuid) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a uuid) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst uuid)
+BEGIN
+DECLARE src int(10) unsigned DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'int unsigned' as 'uuid' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS uuid
+BEGIN
+DECLARE rc int(10) unsigned DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src int(10) unsigned DEFAULT NULL;
+DECLARE cur1 CURSOR(t uuid) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst uuid DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+CREATE TABLE t1 (target INT UNSIGNED DEFAULT 0, source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+# Start of type_store_assignment_incompatible.inc
+SET @sql_mode_save= @@sql_mode;
+SET @source_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='source'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @target_type= (SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
+WHERE COLUMN_NAME='target'
+ AND TABLE_NAME='t1'
+ AND TABLE_SCHEMA='test');
+SET @ignore= CASE WHEN @ignore IS NULL OR @ignore = '' THEN ''
+ WHEN @ignore NOT LIKE ' %' THEN CONCAT(' ',@ignore)
+ELSE @ignore
+END;
+CREATE TABLE t2 LIKE t1;
+ALTER TABLE t2 ADD id INT NOT NULL PRIMARY KEY FIRST;
+INSERT INTO t2 VALUES (1,DEFAULT,DEFAULT);
+SHOW CREATE TABLE t2;
+Table Create Table
+t2 CREATE TABLE `t2` (
+ `id` int(11) NOT NULL,
+ `target` int(10) unsigned DEFAULT 0,
+ `source` uuid DEFAULT '00000000-0000-0000-0000-000000000000',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 VALUES
+(1,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+SET sql_mode='';
+CREATE TABLE t3 LIKE t2;
+ALTER TABLE t3 ENGINE=MyISAM;
+EXECUTE IMMEDIATE
+CONCAT('CREATE VIEW v3 AS SELECT id,',
+IF(@target_type='geometry','AsText(target)','target'), ' AS target,',
+IF(@source_type='geometry','AsText(source)','source'), ' AS source ',
+' FROM t3');
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+Warnings:
+Warning 1265 Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 0 00000000-0000-0000-0000-000000000000
+2 0 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=STRICT_ALL_TABLES;
+INSERT INTO t3 VALUES
+(1,
+(SELECT target FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1)),
+(2,
+(SELECT source FROM t2 ORDER BY id LIMIT 1),
+(SELECT source FROM t2 ORDER BY id LIMIT 1));
+ERROR 01000: Data truncated for column 'target' at row 2
+SELECT * FROM v3;
+id target source
+1 0 00000000-0000-0000-0000-000000000000
+TRUNCATE TABLE t3;
+SET sql_mode=@sql_mode_save;
+DROP TABLE t3;
+DROP VIEW v3;
+CREATE TABLE t3 LIKE t2;
+INSERT INTO t3 SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT id,source,source FROM t2;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) VALUES (1,DEFAULT,DEFAULT) ON DUPLICATE KEY UPDATE target=source;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+INSERT INTO t3 (id,target,source) SELECT 1,DEFAULT(t2.target),DEFAULT(t2.source) FROM t2 ON DUPLICATE KEY UPDATE t3.target=t2.source;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+UPDATE t3 SET target=source;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+UPDATE t2, t3 SET t3.target=t2.source WHERE t2.id=t3.id;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `test`.`t3`.`target`
+SET @alter=CONCAT('ALTER', @ignore, ' TABLE t3 MODIFY target ', @source_type);
+SELECT @alter;
+@alter
+ALTER TABLE t3 MODIFY target uuid
+EXECUTE IMMEDIATE @alter;
+ERROR HY000: Cannot cast 'int unsigned' as 'uuid' in assignment of `test`.`t3`.`target`
+DROP TABLE t3;
+DROP TABLE t2;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE dst int(10) unsigned DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CALL p1;
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `dst`
+DROP PROCEDURE p1;
+CREATE FUNCTION f1(a int(10) unsigned) RETURNS INT RETURN NULL;;
+SELECT f1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `a`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1(a int(10) unsigned) BEGIN END;;
+CALL p1((SELECT source FROM t1 ORDER BY source LIMIT 1));
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `a`
+DROP PROCEDURE p1;
+CREATE PROCEDURE p1(OUT dst int(10) unsigned)
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+SET dst=src;
+END;
+$$
+CREATE PROCEDURE p2()
+BEGIN
+DECLARE dst int(10) unsigned DEFAULT NULL;
+CALL p1(dst);
+END;
+$$
+CALL p2();
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `dst`
+SHOW WARNINGS;
+Level Code Message
+Error 4078 Cannot cast 'uuid' as 'int unsigned' in assignment of `dst`
+Note 4094 At line 4 in test.p1
+Note 4094 At line 4 in test.p2
+DROP PROCEDURE p2;
+DROP PROCEDURE p1;
+CREATE FUNCTION f1() RETURNS int(10) unsigned
+BEGIN
+DECLARE rc uuid DEFAULT NULL;
+RETURN rc;
+END;
+$$
+SELECT f1();
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `f1()`
+DROP FUNCTION f1;
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE src uuid DEFAULT NULL;
+DECLARE cur1 CURSOR(t int(10) unsigned) FOR SELECT * FROM t1 WHERE target=t;
+OPEN cur1(src);
+CLOSE cur1;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `t`
+DROP PROCEDURE p1;
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES ();
+CREATE PROCEDURE p1()
+BEGIN
+DECLARE dst int(10) unsigned DEFAULT NULL;
+DECLARE cur2 CURSOR FOR SELECT source FROM t2 ORDER BY source LIMIT 1;
+OPEN cur2;
+FETCH cur2 INTO dst;
+CLOSE cur2;
+END;
+$$
+CALL p1();
+ERROR HY000: Cannot cast 'uuid' as 'int unsigned' in assignment of `dst`
+DROP PROCEDURE p1;
+DROP TABLE t2;
+# End of type_store_assignment_incompatible.inc
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_uint.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_uint.test
new file mode 100644
index 00000000000..94de2dce2d8
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mix_uint.test
@@ -0,0 +1,19 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-28918 Implicit cast from INET6 UNSIGNED works differently on UPDATE vs ALTER
+--echo #
+
+CREATE TABLE t1 (target UUID DEFAULT '00000000-0000-0000-0000-000000000000', source INT UNSIGNED DEFAULT 0);
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+CREATE TABLE t1 (target INT UNSIGNED DEFAULT 0, source UUID DEFAULT '00000000-0000-0000-0000-000000000000');
+--source include/type_mix_incompatible.inc
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_myisam.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_myisam.result
new file mode 100644
index 00000000000..8df2c85ae48
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_myisam.result
@@ -0,0 +1,237 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+SET default_storage_engine=MyISAM;
+#
+# Range optimizer
+#
+CREATE TABLE t1 (a UUID, INDEX(a));
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+FOR i IN 0..255
+DO
+INSERT INTO t1 VALUES (CONCAT(REPEAT(0x00, 15),CHAR(i USING BINARY)));
+END FOR
+$$
+SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+a
+00000000-0000-0000-0000-0000000000ff
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-0000000000ff';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+SELECT * FROM t1 WHERE a='garbage';
+a
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+EXPLAIN SELECT * FROM t1 WHERE a='garbage';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe';
+a
+00000000-0000-0000-0000-0000000000fe
+00000000-0000-0000-0000-0000000000ff
+EXPLAIN SELECT * FROM t1 WHERE a>='00000000-0000-0000-0000-0000000000fe';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 3 Using where; Using index
+SELECT * FROM t1 WHERE a>='garbage';
+a
+EXPLAIN SELECT * FROM t1 WHERE a>='garbage';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
+SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'00000000-0000-0000-0000-0000000000f0'
+);
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-0000000000a0
+00000000-0000-0000-0000-0000000000f0
+EXPLAIN SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'00000000-0000-0000-0000-0000000000f0'
+);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 4 Using where; Using index
+SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'garbage'
+);
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-0000000000a0
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+EXPLAIN SELECT * FROM t1 WHERE a IN
+(
+'00000000-0000-0000-0000-000000000080',
+'00000000-0000-0000-0000-0000000000a0',
+'garbage'
+);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 2 Using where; Using index
+Warnings:
+Warning 1292 Incorrect uuid value: 'garbage'
+SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'00000000-0000-0000-0000-000000000081';
+a
+00000000-0000-0000-0000-000000000080
+00000000-0000-0000-0000-000000000081
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'00000000-0000-0000-0000-000000000081';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 range a a 17 NULL 2 Using where; Using index
+SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'garbage';
+a
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN
+'00000000-0000-0000-0000-000000000080' AND
+'garbage';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
+SELECT * FROM t1 WHERE a=CAST('00000000-0000-0000-0000-0000000000ff' AS UUID);
+a
+00000000-0000-0000-0000-0000000000ff
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=CAST('00000000-0000-0000-0000-0000000000ff' AS UUID);
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ref a a 17 const 1 100.00 Using where; Using index
+Warnings:
+Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = UUID'00000000-0000-0000-0000-0000000000ff'
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 (a UUID,KEY(a));
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+BEGIN;
+FOR i IN 0..255
+DO
+INSERT INTO t1 VALUES (REPLACE('XX000000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00XX0000-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('0000XX00-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('000000XX-0000-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-XX00-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-00XX-0000-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-XX00-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-00XX-0000-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-XX00-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-00XX-000000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-XX0000000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00XX00000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000XX000000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-000000XX0000','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-00000000XX00','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t1 VALUES (REPLACE('00000000-0000-0000-0000-0000000000XX','XX',LPAD(HEX(i),2,'0')));
+END FOR;
+$$
+COMMIT;
+EXPLAIN SELECT * FROM t1 WHERE a='ff000000-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00ff0000-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='0000ff00-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='000000ff-0000-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-ff00-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-00ff-0000-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-ff00-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-00ff-0000-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-ff00-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-00ff-000000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+EXPLAIN SELECT * FROM t1 WHERE a='00000000-0000-0000-0000-ff0000000000';
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ref a a 17 const 1 Using where; Using index
+DROP TABLE t1;
+#
+# Testing index prefix compression
+#
+CREATE PROCEDURE test_pack_key()
+BEGIN
+SHOW CREATE TABLE t1;
+FOR i IN 0..0x1FFF
+DO
+INSERT INTO t1 VALUES (UUID());
+END FOR;
+SELECT
+CASE
+WHEN INDEX_LENGTH/DATA_LENGTH < 0.7 THEN 'PACKED'
+ WHEN INDEX_LENGTH/DATA_LENGTH > 1.2 THEN 'NOT PACKED'
+ ELSE CONCAT('UNKNOWN ', INDEX_LENGTH/DATA_LENGTH)
+END AS PackKey
+FROM INFORMATION_SCHEMA.TABLES
+WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1';
+END;
+$$
+"------------------ CREATE TABLE"
+CREATE TABLE t1 (a UUID, KEY(a));
+CALL test_pack_key();
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+PackKey
+PACKED
+DROP TABLE t1;
+"------------------ t1packkey.frm"
+TRUNCATE TABLE t1;
+CALL test_pack_key();
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+PackKey
+PACKED
+DROP TABLE t1;
+"------------------ t1nopackkey.frm"
+TRUNCATE TABLE t1;
+CALL test_pack_key();
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` uuid DEFAULT NULL,
+ KEY `a` (`a`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+PackKey
+NOT PACKED
+DROP TABLE t1;
+DROP PROCEDURE test_pack_key;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_myisam.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_myisam.test
new file mode 100644
index 00000000000..7526d344fc3
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_myisam.test
@@ -0,0 +1,61 @@
+let $MYSQLD_DATADIR= `select @@datadir`;
+
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+
+SET default_storage_engine=MyISAM;
+--source type_uuid_engines.inc
+
+--echo #
+--echo # Testing index prefix compression
+--echo #
+
+DELIMITER $$;
+CREATE PROCEDURE test_pack_key()
+BEGIN
+ SHOW CREATE TABLE t1;
+ FOR i IN 0..0x1FFF
+ DO
+ INSERT INTO t1 VALUES (UUID());
+ END FOR;
+ SELECT
+ CASE
+ WHEN INDEX_LENGTH/DATA_LENGTH < 0.7 THEN 'PACKED'
+ WHEN INDEX_LENGTH/DATA_LENGTH > 1.2 THEN 'NOT PACKED'
+ ELSE CONCAT('UNKNOWN ', INDEX_LENGTH/DATA_LENGTH)
+ END AS PackKey
+ FROM INFORMATION_SCHEMA.TABLES
+ WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1';
+END;
+$$
+DELIMITER ;$$
+
+--echo "------------------ CREATE TABLE"
+CREATE TABLE t1 (a UUID, KEY(a));
+CALL test_pack_key();
+DROP TABLE t1;
+
+--echo "------------------ t1packkey.frm"
+--copy_file $MTR_SUITE_DIR/std_data/t1packkey.frm $MYSQLD_DATADIR/test/t1.frm
+TRUNCATE TABLE t1;
+CALL test_pack_key();
+DROP TABLE t1;
+
+--echo "------------------ t1nopackkey.frm"
+--copy_file $MTR_SUITE_DIR/std_data/t1nopackkey.frm $MYSQLD_DATADIR/test/t1.frm
+TRUNCATE TABLE t1;
+CALL test_pack_key();
+DROP TABLE t1;
+
+
+DROP PROCEDURE test_pack_key;
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mysql.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mysql.result
new file mode 100644
index 00000000000..51531e5c0d7
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mysql.result
@@ -0,0 +1,16 @@
+CREATE TABLE t1 (a UUID);
+Field 1: `a`
+Org_field: `a`
+Catalog: `def`
+Database: `test`
+Table: `t1`
+Org_table: `t1`
+Type: STRING (type=uuid)
+Collation: latin1_swedish_ci (8)
+Length: 36
+Max_length: 0
+Decimals: 0
+Flags: UNSIGNED BINARY
+
+
+DROP TABLE t1;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mysql.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mysql.test
new file mode 100644
index 00000000000..c9bfadca01b
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mysql.test
@@ -0,0 +1,6 @@
+-- source include/have_working_dns.inc
+-- source include/not_embedded.inc
+
+CREATE TABLE t1 (a UUID);
+--exec $MYSQL -t test --column-type-info -e "SELECT * FROM t1" 2>&1
+DROP TABLE t1;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_partition.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_partition.result
new file mode 100644
index 00000000000..82b96002d2e
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_partition.result
@@ -0,0 +1,1797 @@
+#
+# MDEV-4958 Adding datatype UUID
+#
+SET NAMES utf8;
+CREATE TABLE t1 (a UUID)
+PARTITION BY LIST COLUMNS(a)
+(PARTITION p00 VALUES IN (10));
+ERROR HY000: Partition column values of incorrect type
+CREATE TABLE t1 (a UUID)
+PARTITION BY LIST COLUMNS(a)
+(PARTITION p00 VALUES IN (TIME'10:20:30'));
+ERROR HY000: Partition column values of incorrect type
+CREATE TABLE t1 (a UUID)
+PARTITION BY LIST COLUMNS(a)
+(PARTITION p00 VALUES IN ('€'));
+ERROR 22007: Incorrect uuid value: '€'
+CREATE TABLE t1 (a UUID)
+PARTITION BY LIST COLUMNS(a)
+(PARTITION p00 VALUES IN ('123e4567-e89b-12d3-a456-426655440000'),
+PARTITION pFF VALUES IN (0xffff000000000000000000000000ffff));
+INSERT INTO t1 VALUES ('123e4567-e89b-12d3-a456-426655440000');
+INSERT INTO t1 VALUES ('ffff0000-0000-0000-0000-00000000ffff');
+SELECT * FROM t1 PARTITION (p00);
+a
+123e4567-e89b-12d3-a456-426655440000
+SELECT * FROM t1 PARTITION (pFF);
+a
+ffff0000-0000-0000-0000-00000000ffff
+DROP TABLE t1;
+CREATE TABLE t0 (a UUID);
+FOR i IN 0..255
+DO
+INSERT INTO t0 VALUES (REPLACE('XXfd306d-307f-11ec-8d10-d20bbc909b57','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t0 VALUES (REPLACE('9cfd306d-XX7f-12ec-8d10-d20bbc909b57','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t0 VALUES (REPLACE('9cfd306d-307f-13XX-8d10-d20bbc909b57','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t0 VALUES (REPLACE('9cfd306d-307f-14ec-8dXX-d20bbc909b57','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t0 VALUES (REPLACE('9cfd306d-307f-15ec-8d10-XX0bbc909b57','XX',LPAD(HEX(i),2,'0')));
+INSERT INTO t0 VALUES (REPLACE('9cfd306d-307f-16ec-8d10-d20bbc909bXX','XX',LPAD(HEX(i),2,'0')));
+END FOR;
+$$
+# Test that UUID and BINARY(16) implement the same distribution by key
+CREATE PROCEDURE test_partition_by_key_uuid_vs_binary(parts INT)
+BEGIN
+EXECUTE IMMEDIATE REPLACE('CREATE TABLE t1 (a UUID) PARTITION BY KEY (a) PARTITIONS 7','7',parts);
+EXECUTE IMMEDIATE REPLACE('CREATE TABLE t2 (a BINARY(16)) PARTITION BY KEY (a) PARTITIONS 7','7',parts);
+INSERT INTO t1 SELECT * FROM t0;
+INSERT INTO t2 SELECT * FROM t0;
+FOR i IN 0..(parts-1)
+DO
+BEGIN
+DECLARE query_template TEXT DEFAULT 'SELECT a_p0, COUNT(*) FROM ('
+ 'SELECT a AS a_p0 FROM t1 PARTITION(p0) '
+ 'UNION ALL '
+ 'SELECT CAST(a AS UUID) AS a_p0 FROM t2 PARTITION(p0)) td '
+ 'GROUP BY a_p0';
+DECLARE query TEXT DEFAULT REPLACE(query_template,'p0',CONCAT('p',i));
+SELECT query;
+EXECUTE IMMEDIATE query;
+END;
+END FOR;
+DROP TABLE t1,t2;
+END;
+$$
+# Display statistics how records are distributed between partitions
+CREATE PROCEDURE test_partition_by_key_pstat(parts INT)
+BEGIN
+EXECUTE IMMEDIATE REPLACE('CREATE TABLE t1 (a UUID) PARTITION BY KEY (a) PARTITIONS 7','7',parts);
+CREATE TABLE t1_pstat (pname VARCHAR(32), pcount int);
+INSERT INTO t1 SELECT * FROM t0;
+FOR i IN 0..(parts-1)
+DO
+BEGIN
+DECLARE query_template TEXT DEFAULT 'INSERT INTO t1_pstat VALUES (''p0'',(SELECT COUNT(*) FROM t1 PARTITION (p0)))';
+EXECUTE IMMEDIATE REPLACE(query_template,'p0',CONCAT('p',i));
+END;
+END FOR;
+SELECT * FROM t1_pstat ORDER BY CAST(SUBSTR(pname,2,100) AS UNSIGNED);
+DROP TABLE t1,t1_pstat;
+END;
+$$
+CALL test_partition_by_key_uuid_vs_binary(7);
+query
+SELECT a_p0, COUNT(*) FROM (SELECT a AS a_p0 FROM t1 PARTITION(p0) UNION ALL SELECT CAST(a AS UUID) AS a_p0 FROM t2 PARTITION(p0)) td GROUP BY a_p0
+a_p0 COUNT(*)
+9cfd306d-307f-15ec-8d10-010bbc909b57 2
+9cfd306d-307f-15ec-8d10-080bbc909b57 2
+9cfd306d-307f-15ec-8d10-0d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-250bbc909b57 2
+9cfd306d-307f-15ec-8d10-2b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-300bbc909b57 2
+9cfd306d-307f-15ec-8d10-3c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-480bbc909b57 2
+9cfd306d-307f-15ec-8d10-500bbc909b57 2
+9cfd306d-307f-15ec-8d10-530bbc909b57 2
+9cfd306d-307f-15ec-8d10-560bbc909b57 2
+9cfd306d-307f-15ec-8d10-570bbc909b57 2
+9cfd306d-307f-15ec-8d10-580bbc909b57 2
+9cfd306d-307f-15ec-8d10-630bbc909b57 2
+9cfd306d-307f-15ec-8d10-680bbc909b57 2
+9cfd306d-307f-15ec-8d10-6a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-700bbc909b57 2
+9cfd306d-307f-15ec-8d10-7e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-820bbc909b57 2
+9cfd306d-307f-15ec-8d10-8e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-930bbc909b57 2
+9cfd306d-307f-15ec-8d10-970bbc909b57 2
+9cfd306d-307f-15ec-8d10-980bbc909b57 2
+9cfd306d-307f-15ec-8d10-9b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-9f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-a00bbc909b57 2
+9cfd306d-307f-15ec-8d10-a70bbc909b57 2
+9cfd306d-307f-15ec-8d10-a80bbc909b57 2
+9cfd306d-307f-15ec-8d10-b80bbc909b57 2
+9cfd306d-307f-15ec-8d10-c10bbc909b57 2
+9cfd306d-307f-15ec-8d10-c30bbc909b57 2
+9cfd306d-307f-15ec-8d10-c60bbc909b57 2
+9cfd306d-307f-15ec-8d10-cb0bbc909b57 2
+9cfd306d-307f-15ec-8d10-cf0bbc909b57 2
+9cfd306d-307f-15ec-8d10-d00bbc909b57 2
+9cfd306d-307f-15ec-8d10-d10bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b04 2
+9cfd306d-307f-16ec-8d10-d20bbc909b13 2
+9cfd306d-307f-16ec-8d10-d20bbc909b29 2
+9cfd306d-307f-16ec-8d10-d20bbc909b31 2
+9cfd306d-307f-16ec-8d10-d20bbc909b37 2
+9cfd306d-307f-16ec-8d10-d20bbc909b3c 2
+9cfd306d-307f-16ec-8d10-d20bbc909b45 2
+9cfd306d-307f-16ec-8d10-d20bbc909b51 2
+9cfd306d-307f-16ec-8d10-d20bbc909b56 2
+9cfd306d-307f-14ec-8d05-d20bbc909b57 2
+9cfd306d-307f-14ec-8d07-d20bbc909b57 2
+0bfd306d-307f-11ec-8d10-d20bbc909b57 2
+0dfd306d-307f-11ec-8d10-d20bbc909b57 2
+16fd306d-307f-11ec-8d10-d20bbc909b57 2
+17fd306d-307f-11ec-8d10-d20bbc909b57 2
+19fd306d-307f-11ec-8d10-d20bbc909b57 2
+34fd306d-307f-11ec-8d10-d20bbc909b57 2
+36fd306d-307f-11ec-8d10-d20bbc909b57 2
+48fd306d-307f-11ec-8d10-d20bbc909b57 2
+58fd306d-307f-11ec-8d10-d20bbc909b57 2
+61fd306d-307f-11ec-8d10-d20bbc909b57 2
+76fd306d-307f-11ec-8d10-d20bbc909b57 2
+78fd306d-307f-11ec-8d10-d20bbc909b57 2
+7efd306d-307f-11ec-8d10-d20bbc909b57 2
+7ffd306d-307f-11ec-8d10-d20bbc909b57 2
+85fd306d-307f-11ec-8d10-d20bbc909b57 2
+8ffd306d-307f-11ec-8d10-d20bbc909b57 2
+91fd306d-307f-11ec-8d10-d20bbc909b57 2
+9bfd306d-307f-11ec-8d10-d20bbc909b57 2
+affd306d-307f-11ec-8d10-d20bbc909b57 2
+b2fd306d-307f-11ec-8d10-d20bbc909b57 2
+b3fd306d-307f-11ec-8d10-d20bbc909b57 2
+b4fd306d-307f-11ec-8d10-d20bbc909b57 2
+c3fd306d-307f-11ec-8d10-d20bbc909b57 2
+cdfd306d-307f-11ec-8d10-d20bbc909b57 2
+d0fd306d-307f-11ec-8d10-d20bbc909b57 2
+d3fd306d-307f-11ec-8d10-d20bbc909b57 2
+d4fd306d-307f-11ec-8d10-d20bbc909b57 2
+e4fd306d-307f-11ec-8d10-d20bbc909b57 2
+f3fd306d-307f-11ec-8d10-d20bbc909b57 2
+f6fd306d-307f-11ec-8d10-d20bbc909b57 2
+f7fd306d-307f-11ec-8d10-d20bbc909b57 2
+9cfd306d-0e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-177f-12ec-8d10-d20bbc909b57 2
+9cfd306d-2a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-2b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-347f-12ec-8d10-d20bbc909b57 2
+9cfd306d-377f-12ec-8d10-d20bbc909b57 2
+9cfd306d-3a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-447f-12ec-8d10-d20bbc909b57 2
+9cfd306d-4b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-527f-12ec-8d10-d20bbc909b57 2
+9cfd306d-537f-12ec-8d10-d20bbc909b57 2
+9cfd306d-547f-12ec-8d10-d20bbc909b57 2
+9cfd306d-5b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-6d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-727f-12ec-8d10-d20bbc909b57 2
+9cfd306d-787f-12ec-8d10-d20bbc909b57 2
+9cfd306d-7d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-7e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-807f-12ec-8d10-d20bbc909b57 2
+9cfd306d-8c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-8d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-977f-12ec-8d10-d20bbc909b57 2
+9cfd306d-987f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ac7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b07f-12ec-8d10-d20bbc909b57 2
+9cfd306d-bb7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c07f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c77f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f07f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f77f-12ec-8d10-d20bbc909b57 2
+9cfd306d-fd7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-307f-1300-8d10-d20bbc909b57 2
+9cfd306d-307f-1309-8d10-d20bbc909b57 2
+9cfd306d-307f-130b-8d10-d20bbc909b57 2
+9cfd306d-307f-130e-8d10-d20bbc909b57 2
+9cfd306d-307f-1313-8d10-d20bbc909b57 2
+9cfd306d-307f-1329-8d10-d20bbc909b57 2
+9cfd306d-307f-132a-8d10-d20bbc909b57 2
+9cfd306d-307f-1332-8d10-d20bbc909b57 2
+9cfd306d-307f-1336-8d10-d20bbc909b57 2
+9cfd306d-307f-1337-8d10-d20bbc909b57 2
+9cfd306d-307f-133d-8d10-d20bbc909b57 2
+9cfd306d-307f-1340-8d10-d20bbc909b57 2
+9cfd306d-307f-134d-8d10-d20bbc909b57 2
+9cfd306d-307f-1351-8d10-d20bbc909b57 2
+9cfd306d-307f-1363-8d10-d20bbc909b57 2
+9cfd306d-307f-1375-8d10-d20bbc909b57 2
+9cfd306d-307f-137d-8d10-d20bbc909b57 2
+9cfd306d-307f-137e-8d10-d20bbc909b57 2
+9cfd306d-307f-138e-8d10-d20bbc909b57 2
+9cfd306d-307f-139f-8d10-d20bbc909b57 2
+9cfd306d-307f-13a1-8d10-d20bbc909b57 2
+9cfd306d-307f-13a2-8d10-d20bbc909b57 2
+9cfd306d-307f-13b1-8d10-d20bbc909b57 2
+9cfd306d-307f-13b3-8d10-d20bbc909b57 2
+9cfd306d-307f-13b5-8d10-d20bbc909b57 2
+9cfd306d-307f-13bf-8d10-d20bbc909b57 2
+9cfd306d-307f-13d0-8d10-d20bbc909b57 2
+9cfd306d-307f-13db-8d10-d20bbc909b57 2
+9cfd306d-307f-13fe-8d10-d20bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b57 2
+9cfd306d-307f-14ec-8d27-d20bbc909b57 2
+9cfd306d-307f-14ec-8d2a-d20bbc909b57 2
+9cfd306d-307f-14ec-8d2d-d20bbc909b57 2
+9cfd306d-307f-14ec-8d30-d20bbc909b57 2
+9cfd306d-307f-14ec-8d33-d20bbc909b57 2
+9cfd306d-307f-14ec-8d36-d20bbc909b57 2
+9cfd306d-307f-14ec-8d38-d20bbc909b57 2
+9cfd306d-307f-14ec-8d40-d20bbc909b57 2
+9cfd306d-307f-14ec-8d42-d20bbc909b57 2
+9cfd306d-307f-14ec-8d4c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d50-d20bbc909b57 2
+9cfd306d-307f-14ec-8d51-d20bbc909b57 2
+9cfd306d-307f-14ec-8d59-d20bbc909b57 2
+9cfd306d-307f-14ec-8d5a-d20bbc909b57 2
+9cfd306d-307f-14ec-8d63-d20bbc909b57 2
+9cfd306d-307f-14ec-8d67-d20bbc909b57 2
+9cfd306d-307f-14ec-8d68-d20bbc909b57 2
+9cfd306d-307f-14ec-8d6c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d6d-d20bbc909b57 2
+9cfd306d-307f-14ec-8d75-d20bbc909b57 2
+9cfd306d-307f-14ec-8d7e-d20bbc909b57 2
+9cfd306d-307f-14ec-8d81-d20bbc909b57 2
+9cfd306d-307f-14ec-8d82-d20bbc909b57 2
+9cfd306d-307f-14ec-8d86-d20bbc909b57 2
+9cfd306d-307f-14ec-8d87-d20bbc909b57 2
+9cfd306d-307f-14ec-8d94-d20bbc909b57 2
+9cfd306d-307f-14ec-8d95-d20bbc909b57 2
+9cfd306d-307f-14ec-8d9c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d9e-d20bbc909b57 2
+9cfd306d-307f-14ec-8d9f-d20bbc909b57 2
+9cfd306d-307f-14ec-8db4-d20bbc909b57 2
+9cfd306d-307f-14ec-8db9-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc6-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd3-d20bbc909b57 2
+9cfd306d-307f-14ec-8de1-d20bbc909b57 2
+9cfd306d-307f-14ec-8de6-d20bbc909b57 2
+9cfd306d-307f-14ec-8dee-d20bbc909b57 2
+9cfd306d-307f-14ec-8df1-d20bbc909b57 2
+9cfd306d-307f-14ec-8df6-d20bbc909b57 2
+9cfd306d-307f-14ec-8df7-d20bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b5a 2
+9cfd306d-307f-16ec-8d10-d20bbc909b69 2
+9cfd306d-307f-16ec-8d10-d20bbc909b6f 2
+9cfd306d-307f-16ec-8d10-d20bbc909b72 2
+9cfd306d-307f-16ec-8d10-d20bbc909b78 2
+9cfd306d-307f-16ec-8d10-d20bbc909b7b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b82 2
+9cfd306d-307f-16ec-8d10-d20bbc909b83 2
+9cfd306d-307f-16ec-8d10-d20bbc909b8d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b9b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b9c 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba2 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba3 2
+9cfd306d-307f-16ec-8d10-d20bbc909bab 2
+9cfd306d-307f-16ec-8d10-d20bbc909bac 2
+9cfd306d-307f-16ec-8d10-d20bbc909bad 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb6 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd4 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd8 2
+9cfd306d-307f-16ec-8d10-d20bbc909bdf 2
+9cfd306d-307f-16ec-8d10-d20bbc909be8 2
+9cfd306d-307f-16ec-8d10-d20bbc909bee 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf0 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf1 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf2 2
+9cfd306d-307f-16ec-8d10-d20bbc909bfb 2
+9cfd306d-307f-16ec-8d10-d20bbc909bff 2
+9cfd306d-307f-15ec-8d10-d40bbc909b57 2
+9cfd306d-307f-15ec-8d10-df0bbc909b57 2
+9cfd306d-307f-15ec-8d10-e40bbc909b57 2
+9cfd306d-307f-15ec-8d10-eb0bbc909b57 2
+9cfd306d-307f-15ec-8d10-ef0bbc909b57 2
+9cfd306d-307f-15ec-8d10-f10bbc909b57 2
+9cfd306d-307f-15ec-8d10-f90bbc909b57 2
+query
+SELECT a_p1, COUNT(*) FROM (SELECT a AS a_p1 FROM t1 PARTITION(p1) UNION ALL SELECT CAST(a AS UUID) AS a_p1 FROM t2 PARTITION(p1)) td GROUP BY a_p1
+a_p1 COUNT(*)
+9cfd306d-307f-15ec-8d10-060bbc909b57 2
+9cfd306d-307f-15ec-8d10-0c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-120bbc909b57 2
+9cfd306d-307f-15ec-8d10-150bbc909b57 2
+9cfd306d-307f-15ec-8d10-1a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-1c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-1d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-1f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-230bbc909b57 2
+9cfd306d-307f-15ec-8d10-2d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-310bbc909b57 2
+9cfd306d-307f-15ec-8d10-3a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-3e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-400bbc909b57 2
+9cfd306d-307f-15ec-8d10-4c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-5e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-5f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-7b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-7d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-8c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-910bbc909b57 2
+9cfd306d-307f-15ec-8d10-920bbc909b57 2
+9cfd306d-307f-15ec-8d10-940bbc909b57 2
+9cfd306d-307f-15ec-8d10-950bbc909b57 2
+9cfd306d-307f-15ec-8d10-9d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-a20bbc909b57 2
+9cfd306d-307f-15ec-8d10-aa0bbc909b57 2
+9cfd306d-307f-15ec-8d10-ac0bbc909b57 2
+9cfd306d-307f-15ec-8d10-af0bbc909b57 2
+9cfd306d-307f-15ec-8d10-ba0bbc909b57 2
+9cfd306d-307f-15ec-8d10-bc0bbc909b57 2
+9cfd306d-307f-15ec-8d10-c50bbc909b57 2
+9cfd306d-307f-15ec-8d10-cc0bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b05 2
+9cfd306d-307f-16ec-8d10-d20bbc909b0f 2
+9cfd306d-307f-16ec-8d10-d20bbc909b1b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b2a 2
+9cfd306d-307f-16ec-8d10-d20bbc909b34 2
+9cfd306d-307f-16ec-8d10-d20bbc909b35 2
+9cfd306d-307f-16ec-8d10-d20bbc909b42 2
+00fd306d-307f-11ec-8d10-d20bbc909b57 2
+09fd306d-307f-11ec-8d10-d20bbc909b57 2
+10fd306d-307f-11ec-8d10-d20bbc909b57 2
+13fd306d-307f-11ec-8d10-d20bbc909b57 2
+1cfd306d-307f-11ec-8d10-d20bbc909b57 2
+3ffd306d-307f-11ec-8d10-d20bbc909b57 2
+45fd306d-307f-11ec-8d10-d20bbc909b57 2
+4efd306d-307f-11ec-8d10-d20bbc909b57 2
+4ffd306d-307f-11ec-8d10-d20bbc909b57 2
+50fd306d-307f-11ec-8d10-d20bbc909b57 2
+54fd306d-307f-11ec-8d10-d20bbc909b57 2
+55fd306d-307f-11ec-8d10-d20bbc909b57 2
+5bfd306d-307f-11ec-8d10-d20bbc909b57 2
+5ffd306d-307f-11ec-8d10-d20bbc909b57 2
+6ffd306d-307f-11ec-8d10-d20bbc909b57 2
+73fd306d-307f-11ec-8d10-d20bbc909b57 2
+89fd306d-307f-11ec-8d10-d20bbc909b57 2
+8cfd306d-307f-11ec-8d10-d20bbc909b57 2
+8dfd306d-307f-11ec-8d10-d20bbc909b57 2
+93fd306d-307f-11ec-8d10-d20bbc909b57 2
+94fd306d-307f-11ec-8d10-d20bbc909b57 2
+9efd306d-307f-11ec-8d10-d20bbc909b57 2
+aefd306d-307f-11ec-8d10-d20bbc909b57 2
+b0fd306d-307f-11ec-8d10-d20bbc909b57 2
+c2fd306d-307f-11ec-8d10-d20bbc909b57 2
+cbfd306d-307f-11ec-8d10-d20bbc909b57 2
+ddfd306d-307f-11ec-8d10-d20bbc909b57 2
+defd306d-307f-11ec-8d10-d20bbc909b57 2
+e5fd306d-307f-11ec-8d10-d20bbc909b57 2
+e6fd306d-307f-11ec-8d10-d20bbc909b57 2
+edfd306d-307f-11ec-8d10-d20bbc909b57 2
+f9fd306d-307f-11ec-8d10-d20bbc909b57 2
+fafd306d-307f-11ec-8d10-d20bbc909b57 2
+9cfd306d-007f-12ec-8d10-d20bbc909b57 2
+9cfd306d-037f-12ec-8d10-d20bbc909b57 2
+9cfd306d-047f-12ec-8d10-d20bbc909b57 2
+9cfd306d-057f-12ec-8d10-d20bbc909b57 2
+9cfd306d-0a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-0b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-117f-12ec-8d10-d20bbc909b57 2
+9cfd306d-127f-12ec-8d10-d20bbc909b57 2
+9cfd306d-1a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-207f-12ec-8d10-d20bbc909b57 2
+9cfd306d-227f-12ec-8d10-d20bbc909b57 2
+9cfd306d-247f-12ec-8d10-d20bbc909b57 2
+9cfd306d-277f-12ec-8d10-d20bbc909b57 2
+9cfd306d-2c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-307f-12ec-8d10-d20bbc909b57 2
+9cfd306d-317f-12ec-8d10-d20bbc909b57 2
+9cfd306d-357f-12ec-8d10-d20bbc909b57 2
+9cfd306d-3e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-407f-12ec-8d10-d20bbc909b57 2
+9cfd306d-437f-12ec-8d10-d20bbc909b57 2
+9cfd306d-4f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-5a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-5d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-657f-12ec-8d10-d20bbc909b57 2
+9cfd306d-747f-12ec-8d10-d20bbc909b57 2
+9cfd306d-817f-12ec-8d10-d20bbc909b57 2
+9cfd306d-927f-12ec-8d10-d20bbc909b57 2
+9cfd306d-967f-12ec-8d10-d20bbc909b57 2
+9cfd306d-9e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b97f-12ec-8d10-d20bbc909b57 2
+9cfd306d-bd7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c67f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c87f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c97f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d67f-12ec-8d10-d20bbc909b57 2
+9cfd306d-dd7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e17f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ea7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f57f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f87f-12ec-8d10-d20bbc909b57 2
+9cfd306d-307f-1314-8d10-d20bbc909b57 2
+9cfd306d-307f-1319-8d10-d20bbc909b57 2
+9cfd306d-307f-131e-8d10-d20bbc909b57 2
+9cfd306d-307f-1325-8d10-d20bbc909b57 2
+9cfd306d-307f-132d-8d10-d20bbc909b57 2
+9cfd306d-307f-132e-8d10-d20bbc909b57 2
+9cfd306d-307f-1330-8d10-d20bbc909b57 2
+9cfd306d-307f-1335-8d10-d20bbc909b57 2
+9cfd306d-307f-1339-8d10-d20bbc909b57 2
+9cfd306d-307f-1341-8d10-d20bbc909b57 2
+9cfd306d-307f-1345-8d10-d20bbc909b57 2
+9cfd306d-307f-1355-8d10-d20bbc909b57 2
+9cfd306d-307f-135a-8d10-d20bbc909b57 2
+9cfd306d-307f-135b-8d10-d20bbc909b57 2
+9cfd306d-307f-135c-8d10-d20bbc909b57 2
+9cfd306d-307f-1379-8d10-d20bbc909b57 2
+9cfd306d-307f-137f-8d10-d20bbc909b57 2
+9cfd306d-307f-1383-8d10-d20bbc909b57 2
+9cfd306d-307f-1388-8d10-d20bbc909b57 2
+9cfd306d-307f-1389-8d10-d20bbc909b57 2
+9cfd306d-307f-138c-8d10-d20bbc909b57 2
+9cfd306d-307f-138d-8d10-d20bbc909b57 2
+9cfd306d-307f-138f-8d10-d20bbc909b57 2
+9cfd306d-307f-1390-8d10-d20bbc909b57 2
+9cfd306d-307f-1391-8d10-d20bbc909b57 2
+9cfd306d-307f-139c-8d10-d20bbc909b57 2
+9cfd306d-307f-13a3-8d10-d20bbc909b57 2
+9cfd306d-307f-13aa-8d10-d20bbc909b57 2
+9cfd306d-307f-13ab-8d10-d20bbc909b57 2
+9cfd306d-307f-13af-8d10-d20bbc909b57 2
+9cfd306d-307f-13b4-8d10-d20bbc909b57 2
+9cfd306d-307f-13bc-8d10-d20bbc909b57 2
+9cfd306d-307f-13be-8d10-d20bbc909b57 2
+9cfd306d-307f-13c2-8d10-d20bbc909b57 2
+9cfd306d-307f-13c8-8d10-d20bbc909b57 2
+9cfd306d-307f-13cf-8d10-d20bbc909b57 2
+9cfd306d-307f-13e0-8d10-d20bbc909b57 2
+9cfd306d-307f-13e7-8d10-d20bbc909b57 2
+9cfd306d-307f-13fa-8d10-d20bbc909b57 2
+9cfd306d-307f-15ec-8d10-d20bbc909b57 2
+9cfd306d-307f-14ec-8d11-d20bbc909b57 2
+9cfd306d-307f-14ec-8d17-d20bbc909b57 2
+9cfd306d-307f-14ec-8d2c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d37-d20bbc909b57 2
+9cfd306d-307f-14ec-8d3c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d3e-d20bbc909b57 2
+9cfd306d-307f-14ec-8d3f-d20bbc909b57 2
+9cfd306d-307f-14ec-8d45-d20bbc909b57 2
+9cfd306d-307f-14ec-8d47-d20bbc909b57 2
+9cfd306d-307f-14ec-8d49-d20bbc909b57 2
+9cfd306d-307f-14ec-8d4e-d20bbc909b57 2
+9cfd306d-307f-14ec-8d4f-d20bbc909b57 2
+9cfd306d-307f-14ec-8d57-d20bbc909b57 2
+9cfd306d-307f-14ec-8d5e-d20bbc909b57 2
+9cfd306d-307f-14ec-8d6a-d20bbc909b57 2
+9cfd306d-307f-14ec-8d78-d20bbc909b57 2
+9cfd306d-307f-14ec-8d7b-d20bbc909b57 2
+9cfd306d-307f-14ec-8d88-d20bbc909b57 2
+9cfd306d-307f-14ec-8d89-d20bbc909b57 2
+9cfd306d-307f-14ec-8d8f-d20bbc909b57 2
+9cfd306d-307f-14ec-8d92-d20bbc909b57 2
+9cfd306d-307f-14ec-8d97-d20bbc909b57 2
+9cfd306d-307f-14ec-8da0-d20bbc909b57 2
+9cfd306d-307f-14ec-8da3-d20bbc909b57 2
+9cfd306d-307f-14ec-8da5-d20bbc909b57 2
+9cfd306d-307f-14ec-8daa-d20bbc909b57 2
+9cfd306d-307f-14ec-8db5-d20bbc909b57 2
+9cfd306d-307f-14ec-8dcc-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd1-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd6-d20bbc909b57 2
+9cfd306d-307f-14ec-8dda-d20bbc909b57 2
+9cfd306d-307f-14ec-8ddd-d20bbc909b57 2
+9cfd306d-307f-14ec-8df9-d20bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b65 2
+9cfd306d-307f-16ec-8d10-d20bbc909b6a 2
+9cfd306d-307f-16ec-8d10-d20bbc909b73 2
+9cfd306d-307f-16ec-8d10-d20bbc909b80 2
+9cfd306d-307f-16ec-8d10-d20bbc909b86 2
+9cfd306d-307f-16ec-8d10-d20bbc909b87 2
+9cfd306d-307f-16ec-8d10-d20bbc909b89 2
+9cfd306d-307f-16ec-8d10-d20bbc909b8e 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba9 2
+9cfd306d-307f-16ec-8d10-d20bbc909bae 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb0 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb1 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb7 2
+9cfd306d-307f-16ec-8d10-d20bbc909bbb 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc6 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc9 2
+9cfd306d-307f-16ec-8d10-d20bbc909bca 2
+9cfd306d-307f-16ec-8d10-d20bbc909bcf 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf3 2
+9cfd306d-307f-16ec-8d10-d20bbc909bfc 2
+9cfd306d-307f-15ec-8d10-d30bbc909b57 2
+9cfd306d-307f-15ec-8d10-dc0bbc909b57 2
+9cfd306d-307f-15ec-8d10-e30bbc909b57 2
+9cfd306d-307f-15ec-8d10-e80bbc909b57 2
+9cfd306d-307f-15ec-8d10-ed0bbc909b57 2
+9cfd306d-307f-15ec-8d10-ee0bbc909b57 2
+query
+SELECT a_p2, COUNT(*) FROM (SELECT a AS a_p2 FROM t1 PARTITION(p2) UNION ALL SELECT CAST(a AS UUID) AS a_p2 FROM t2 PARTITION(p2)) td GROUP BY a_p2
+a_p2 COUNT(*)
+9cfd306d-307f-15ec-8d10-040bbc909b57 2
+9cfd306d-307f-15ec-8d10-0f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-100bbc909b57 2
+9cfd306d-307f-15ec-8d10-110bbc909b57 2
+9cfd306d-307f-15ec-8d10-130bbc909b57 2
+9cfd306d-307f-15ec-8d10-180bbc909b57 2
+9cfd306d-307f-15ec-8d10-1e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-320bbc909b57 2
+9cfd306d-307f-15ec-8d10-330bbc909b57 2
+9cfd306d-307f-15ec-8d10-430bbc909b57 2
+9cfd306d-307f-15ec-8d10-460bbc909b57 2
+9cfd306d-307f-15ec-8d10-520bbc909b57 2
+9cfd306d-307f-15ec-8d10-650bbc909b57 2
+9cfd306d-307f-15ec-8d10-660bbc909b57 2
+9cfd306d-307f-15ec-8d10-6e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-750bbc909b57 2
+9cfd306d-307f-15ec-8d10-780bbc909b57 2
+9cfd306d-307f-15ec-8d10-790bbc909b57 2
+9cfd306d-307f-15ec-8d10-830bbc909b57 2
+9cfd306d-307f-15ec-8d10-8f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-900bbc909b57 2
+9cfd306d-307f-15ec-8d10-9a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-9c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-a40bbc909b57 2
+9cfd306d-307f-15ec-8d10-c00bbc909b57 2
+9cfd306d-307f-15ec-8d10-c20bbc909b57 2
+9cfd306d-307f-15ec-8d10-c40bbc909b57 2
+9cfd306d-307f-15ec-8d10-cd0bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b02 2
+9cfd306d-307f-16ec-8d10-d20bbc909b0b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b0d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b16 2
+9cfd306d-307f-16ec-8d10-d20bbc909b1c 2
+9cfd306d-307f-16ec-8d10-d20bbc909b1f 2
+9cfd306d-307f-16ec-8d10-d20bbc909b26 2
+9cfd306d-307f-16ec-8d10-d20bbc909b27 2
+9cfd306d-307f-16ec-8d10-d20bbc909b38 2
+9cfd306d-307f-16ec-8d10-d20bbc909b3a 2
+9cfd306d-307f-16ec-8d10-d20bbc909b3f 2
+9cfd306d-307f-16ec-8d10-d20bbc909b43 2
+9cfd306d-307f-16ec-8d10-d20bbc909b46 2
+9cfd306d-307f-16ec-8d10-d20bbc909b47 2
+9cfd306d-307f-16ec-8d10-d20bbc909b49 2
+9cfd306d-307f-16ec-8d10-d20bbc909b4f 2
+9cfd306d-307f-14ec-8d01-d20bbc909b57 2
+9cfd306d-307f-14ec-8d06-d20bbc909b57 2
+9cfd306d-307f-14ec-8d0a-d20bbc909b57 2
+02fd306d-307f-11ec-8d10-d20bbc909b57 2
+07fd306d-307f-11ec-8d10-d20bbc909b57 2
+08fd306d-307f-11ec-8d10-d20bbc909b57 2
+0efd306d-307f-11ec-8d10-d20bbc909b57 2
+1afd306d-307f-11ec-8d10-d20bbc909b57 2
+20fd306d-307f-11ec-8d10-d20bbc909b57 2
+25fd306d-307f-11ec-8d10-d20bbc909b57 2
+26fd306d-307f-11ec-8d10-d20bbc909b57 2
+2afd306d-307f-11ec-8d10-d20bbc909b57 2
+2dfd306d-307f-11ec-8d10-d20bbc909b57 2
+32fd306d-307f-11ec-8d10-d20bbc909b57 2
+33fd306d-307f-11ec-8d10-d20bbc909b57 2
+3dfd306d-307f-11ec-8d10-d20bbc909b57 2
+42fd306d-307f-11ec-8d10-d20bbc909b57 2
+46fd306d-307f-11ec-8d10-d20bbc909b57 2
+4bfd306d-307f-11ec-8d10-d20bbc909b57 2
+53fd306d-307f-11ec-8d10-d20bbc909b57 2
+5afd306d-307f-11ec-8d10-d20bbc909b57 2
+65fd306d-307f-11ec-8d10-d20bbc909b57 2
+69fd306d-307f-11ec-8d10-d20bbc909b57 2
+6bfd306d-307f-11ec-8d10-d20bbc909b57 2
+7cfd306d-307f-11ec-8d10-d20bbc909b57 2
+82fd306d-307f-11ec-8d10-d20bbc909b57 2
+86fd306d-307f-11ec-8d10-d20bbc909b57 2
+99fd306d-307f-11ec-8d10-d20bbc909b57 2
+9afd306d-307f-11ec-8d10-d20bbc909b57 2
+a3fd306d-307f-11ec-8d10-d20bbc909b57 2
+aafd306d-307f-11ec-8d10-d20bbc909b57 2
+ccfd306d-307f-11ec-8d10-d20bbc909b57 2
+d5fd306d-307f-11ec-8d10-d20bbc909b57 2
+dcfd306d-307f-11ec-8d10-d20bbc909b57 2
+e0fd306d-307f-11ec-8d10-d20bbc909b57 2
+f0fd306d-307f-11ec-8d10-d20bbc909b57 2
+f1fd306d-307f-11ec-8d10-d20bbc909b57 2
+f4fd306d-307f-11ec-8d10-d20bbc909b57 2
+f8fd306d-307f-11ec-8d10-d20bbc909b57 2
+9cfd306d-097f-12ec-8d10-d20bbc909b57 2
+9cfd306d-137f-12ec-8d10-d20bbc909b57 2
+9cfd306d-267f-12ec-8d10-d20bbc909b57 2
+9cfd306d-297f-12ec-8d10-d20bbc909b57 2
+9cfd306d-4d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-5e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-6f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-757f-12ec-8d10-d20bbc909b57 2
+9cfd306d-7f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-867f-12ec-8d10-d20bbc909b57 2
+9cfd306d-897f-12ec-8d10-d20bbc909b57 2
+9cfd306d-907f-12ec-8d10-d20bbc909b57 2
+9cfd306d-937f-12ec-8d10-d20bbc909b57 2
+9cfd306d-9d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a77f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a87f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a97f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ab7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b67f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b87f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c47f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d47f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d77f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d87f-12ec-8d10-d20bbc909b57 2
+9cfd306d-da7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e37f-12ec-8d10-d20bbc909b57 2
+9cfd306d-eb7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ec7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ff7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-307f-131c-8d10-d20bbc909b57 2
+9cfd306d-307f-1320-8d10-d20bbc909b57 2
+9cfd306d-307f-1321-8d10-d20bbc909b57 2
+9cfd306d-307f-1327-8d10-d20bbc909b57 2
+9cfd306d-307f-1331-8d10-d20bbc909b57 2
+9cfd306d-307f-1338-8d10-d20bbc909b57 2
+9cfd306d-307f-133a-8d10-d20bbc909b57 2
+9cfd306d-307f-133b-8d10-d20bbc909b57 2
+9cfd306d-307f-133e-8d10-d20bbc909b57 2
+9cfd306d-307f-1356-8d10-d20bbc909b57 2
+9cfd306d-307f-135e-8d10-d20bbc909b57 2
+9cfd306d-307f-1361-8d10-d20bbc909b57 2
+9cfd306d-307f-1368-8d10-d20bbc909b57 2
+9cfd306d-307f-136a-8d10-d20bbc909b57 2
+9cfd306d-307f-136c-8d10-d20bbc909b57 2
+9cfd306d-307f-136e-8d10-d20bbc909b57 2
+9cfd306d-307f-136f-8d10-d20bbc909b57 2
+9cfd306d-307f-1372-8d10-d20bbc909b57 2
+9cfd306d-307f-1376-8d10-d20bbc909b57 2
+9cfd306d-307f-1381-8d10-d20bbc909b57 2
+9cfd306d-307f-1382-8d10-d20bbc909b57 2
+9cfd306d-307f-1385-8d10-d20bbc909b57 2
+9cfd306d-307f-1386-8d10-d20bbc909b57 2
+9cfd306d-307f-1387-8d10-d20bbc909b57 2
+9cfd306d-307f-138a-8d10-d20bbc909b57 2
+9cfd306d-307f-1394-8d10-d20bbc909b57 2
+9cfd306d-307f-1398-8d10-d20bbc909b57 2
+9cfd306d-307f-13a6-8d10-d20bbc909b57 2
+9cfd306d-307f-13a7-8d10-d20bbc909b57 2
+9cfd306d-307f-13b0-8d10-d20bbc909b57 2
+9cfd306d-307f-13b8-8d10-d20bbc909b57 2
+9cfd306d-307f-13ba-8d10-d20bbc909b57 2
+9cfd306d-307f-13bb-8d10-d20bbc909b57 2
+9cfd306d-307f-13c0-8d10-d20bbc909b57 2
+9cfd306d-307f-13ca-8d10-d20bbc909b57 2
+9cfd306d-307f-13ce-8d10-d20bbc909b57 2
+9cfd306d-307f-13d1-8d10-d20bbc909b57 2
+9cfd306d-307f-13d3-8d10-d20bbc909b57 2
+9cfd306d-307f-13d6-8d10-d20bbc909b57 2
+9cfd306d-307f-13d8-8d10-d20bbc909b57 2
+9cfd306d-307f-13df-8d10-d20bbc909b57 2
+9cfd306d-307f-13e9-8d10-d20bbc909b57 2
+9cfd306d-307f-13eb-8d10-d20bbc909b57 2
+9cfd306d-307f-13f5-8d10-d20bbc909b57 2
+9cfd306d-307f-13f7-8d10-d20bbc909b57 2
+9cfd306d-307f-13f9-8d10-d20bbc909b57 2
+9cfd306d-307f-13fb-8d10-d20bbc909b57 2
+9cfd306d-307f-14ec-8d2b-d20bbc909b57 2
+9cfd306d-307f-14ec-8d31-d20bbc909b57 2
+9cfd306d-307f-14ec-8d3d-d20bbc909b57 2
+9cfd306d-307f-14ec-8d44-d20bbc909b57 2
+9cfd306d-307f-14ec-8d4a-d20bbc909b57 2
+9cfd306d-307f-14ec-8d4d-d20bbc909b57 2
+9cfd306d-307f-14ec-8d61-d20bbc909b57 2
+9cfd306d-307f-14ec-8d76-d20bbc909b57 2
+9cfd306d-307f-14ec-8d7d-d20bbc909b57 2
+9cfd306d-307f-14ec-8d8d-d20bbc909b57 2
+9cfd306d-307f-14ec-8d8e-d20bbc909b57 2
+9cfd306d-307f-14ec-8d96-d20bbc909b57 2
+9cfd306d-307f-14ec-8d9b-d20bbc909b57 2
+9cfd306d-307f-14ec-8da6-d20bbc909b57 2
+9cfd306d-307f-14ec-8dab-d20bbc909b57 2
+9cfd306d-307f-14ec-8dad-d20bbc909b57 2
+9cfd306d-307f-14ec-8dba-d20bbc909b57 2
+9cfd306d-307f-14ec-8dbd-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc5-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc7-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd4-d20bbc909b57 2
+9cfd306d-307f-14ec-8de5-d20bbc909b57 2
+9cfd306d-307f-14ec-8de8-d20bbc909b57 2
+9cfd306d-307f-14ec-8de9-d20bbc909b57 2
+9cfd306d-307f-14ec-8def-d20bbc909b57 2
+9cfd306d-307f-14ec-8df8-d20bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b58 2
+9cfd306d-307f-16ec-8d10-d20bbc909b62 2
+9cfd306d-307f-16ec-8d10-d20bbc909b63 2
+9cfd306d-307f-16ec-8d10-d20bbc909b70 2
+9cfd306d-307f-16ec-8d10-d20bbc909b7c 2
+9cfd306d-307f-16ec-8d10-d20bbc909b81 2
+9cfd306d-307f-16ec-8d10-d20bbc909b8a 2
+9cfd306d-307f-16ec-8d10-d20bbc909b8b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b8c 2
+9cfd306d-307f-16ec-8d10-d20bbc909b94 2
+9cfd306d-307f-16ec-8d10-d20bbc909b95 2
+9cfd306d-307f-16ec-8d10-d20bbc909b96 2
+9cfd306d-307f-16ec-8d10-d20bbc909b9f 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba7 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb4 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb5 2
+9cfd306d-307f-16ec-8d10-d20bbc909bbc 2
+9cfd306d-307f-16ec-8d10-d20bbc909bbf 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc7 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd2 2
+9cfd306d-307f-16ec-8d10-d20bbc909bdd 2
+9cfd306d-307f-16ec-8d10-d20bbc909be0 2
+9cfd306d-307f-16ec-8d10-d20bbc909be1 2
+9cfd306d-307f-16ec-8d10-d20bbc909be6 2
+9cfd306d-307f-16ec-8d10-d20bbc909bec 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf9 2
+9cfd306d-307f-16ec-8d10-d20bbc909bfa 2
+9cfd306d-307f-15ec-8d10-e20bbc909b57 2
+9cfd306d-307f-15ec-8d10-ec0bbc909b57 2
+9cfd306d-307f-15ec-8d10-f70bbc909b57 2
+9cfd306d-307f-15ec-8d10-fb0bbc909b57 2
+query
+SELECT a_p3, COUNT(*) FROM (SELECT a AS a_p3 FROM t1 PARTITION(p3) UNION ALL SELECT CAST(a AS UUID) AS a_p3 FROM t2 PARTITION(p3)) td GROUP BY a_p3
+a_p3 COUNT(*)
+9cfd306d-307f-15ec-8d10-090bbc909b57 2
+9cfd306d-307f-15ec-8d10-190bbc909b57 2
+9cfd306d-307f-15ec-8d10-240bbc909b57 2
+9cfd306d-307f-15ec-8d10-260bbc909b57 2
+9cfd306d-307f-15ec-8d10-270bbc909b57 2
+9cfd306d-307f-15ec-8d10-470bbc909b57 2
+9cfd306d-307f-15ec-8d10-490bbc909b57 2
+9cfd306d-307f-15ec-8d10-510bbc909b57 2
+9cfd306d-307f-15ec-8d10-5a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-5d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-640bbc909b57 2
+9cfd306d-307f-15ec-8d10-740bbc909b57 2
+9cfd306d-307f-15ec-8d10-770bbc909b57 2
+9cfd306d-307f-15ec-8d10-840bbc909b57 2
+9cfd306d-307f-15ec-8d10-860bbc909b57 2
+9cfd306d-307f-15ec-8d10-880bbc909b57 2
+9cfd306d-307f-15ec-8d10-8b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-990bbc909b57 2
+9cfd306d-307f-15ec-8d10-ad0bbc909b57 2
+9cfd306d-307f-15ec-8d10-b00bbc909b57 2
+9cfd306d-307f-15ec-8d10-b60bbc909b57 2
+9cfd306d-307f-15ec-8d10-b70bbc909b57 2
+9cfd306d-307f-15ec-8d10-c70bbc909b57 2
+9cfd306d-307f-15ec-8d10-ca0bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b03 2
+9cfd306d-307f-16ec-8d10-d20bbc909b0e 2
+9cfd306d-307f-16ec-8d10-d20bbc909b10 2
+9cfd306d-307f-16ec-8d10-d20bbc909b11 2
+9cfd306d-307f-16ec-8d10-d20bbc909b17 2
+9cfd306d-307f-16ec-8d10-d20bbc909b19 2
+9cfd306d-307f-16ec-8d10-d20bbc909b22 2
+9cfd306d-307f-16ec-8d10-d20bbc909b24 2
+9cfd306d-307f-16ec-8d10-d20bbc909b2d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b40 2
+9cfd306d-307f-16ec-8d10-d20bbc909b4a 2
+9cfd306d-307f-16ec-8d10-d20bbc909b4d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b54 2
+9cfd306d-307f-16ec-8d10-d20bbc909b55 2
+9cfd306d-307f-14ec-8d02-d20bbc909b57 2
+03fd306d-307f-11ec-8d10-d20bbc909b57 2
+04fd306d-307f-11ec-8d10-d20bbc909b57 2
+11fd306d-307f-11ec-8d10-d20bbc909b57 2
+14fd306d-307f-11ec-8d10-d20bbc909b57 2
+1bfd306d-307f-11ec-8d10-d20bbc909b57 2
+21fd306d-307f-11ec-8d10-d20bbc909b57 2
+29fd306d-307f-11ec-8d10-d20bbc909b57 2
+2bfd306d-307f-11ec-8d10-d20bbc909b57 2
+38fd306d-307f-11ec-8d10-d20bbc909b57 2
+3bfd306d-307f-11ec-8d10-d20bbc909b57 2
+3efd306d-307f-11ec-8d10-d20bbc909b57 2
+51fd306d-307f-11ec-8d10-d20bbc909b57 2
+52fd306d-307f-11ec-8d10-d20bbc909b57 2
+5cfd306d-307f-11ec-8d10-d20bbc909b57 2
+60fd306d-307f-11ec-8d10-d20bbc909b57 2
+62fd306d-307f-11ec-8d10-d20bbc909b57 2
+66fd306d-307f-11ec-8d10-d20bbc909b57 2
+6efd306d-307f-11ec-8d10-d20bbc909b57 2
+75fd306d-307f-11ec-8d10-d20bbc909b57 2
+83fd306d-307f-11ec-8d10-d20bbc909b57 2
+97fd306d-307f-11ec-8d10-d20bbc909b57 2
+a1fd306d-307f-11ec-8d10-d20bbc909b57 2
+adfd306d-307f-11ec-8d10-d20bbc909b57 2
+b7fd306d-307f-11ec-8d10-d20bbc909b57 2
+b8fd306d-307f-11ec-8d10-d20bbc909b57 2
+b9fd306d-307f-11ec-8d10-d20bbc909b57 2
+bcfd306d-307f-11ec-8d10-d20bbc909b57 2
+c7fd306d-307f-11ec-8d10-d20bbc909b57 2
+d8fd306d-307f-11ec-8d10-d20bbc909b57 2
+dbfd306d-307f-11ec-8d10-d20bbc909b57 2
+ebfd306d-307f-11ec-8d10-d20bbc909b57 2
+eefd306d-307f-11ec-8d10-d20bbc909b57 2
+fdfd306d-307f-11ec-8d10-d20bbc909b57 2
+9cfd306d-077f-12ec-8d10-d20bbc909b57 2
+9cfd306d-087f-12ec-8d10-d20bbc909b57 2
+9cfd306d-0d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-147f-12ec-8d10-d20bbc909b57 2
+9cfd306d-187f-12ec-8d10-d20bbc909b57 2
+9cfd306d-197f-12ec-8d10-d20bbc909b57 2
+9cfd306d-1b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-367f-12ec-8d10-d20bbc909b57 2
+9cfd306d-387f-12ec-8d10-d20bbc909b57 2
+9cfd306d-3f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-467f-12ec-8d10-d20bbc909b57 2
+9cfd306d-517f-12ec-8d10-d20bbc909b57 2
+9cfd306d-587f-12ec-8d10-d20bbc909b57 2
+9cfd306d-617f-12ec-8d10-d20bbc909b57 2
+9cfd306d-667f-12ec-8d10-d20bbc909b57 2
+9cfd306d-6b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-777f-12ec-8d10-d20bbc909b57 2
+9cfd306d-797f-12ec-8d10-d20bbc909b57 2
+9cfd306d-7a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-7b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-837f-12ec-8d10-d20bbc909b57 2
+9cfd306d-917f-12ec-8d10-d20bbc909b57 2
+9cfd306d-9a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a17f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a47f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a67f-12ec-8d10-d20bbc909b57 2
+9cfd306d-aa7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ad7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b17f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b27f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b57f-12ec-8d10-d20bbc909b57 2
+9cfd306d-bc7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-cb7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-cf7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d17f-12ec-8d10-d20bbc909b57 2
+9cfd306d-df7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e57f-12ec-8d10-d20bbc909b57 2
+9cfd306d-fb7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-fc7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-307f-1304-8d10-d20bbc909b57 2
+9cfd306d-307f-1310-8d10-d20bbc909b57 2
+9cfd306d-307f-1316-8d10-d20bbc909b57 2
+9cfd306d-307f-1317-8d10-d20bbc909b57 2
+9cfd306d-307f-131a-8d10-d20bbc909b57 2
+9cfd306d-307f-131b-8d10-d20bbc909b57 2
+9cfd306d-307f-131f-8d10-d20bbc909b57 2
+9cfd306d-307f-132c-8d10-d20bbc909b57 2
+9cfd306d-307f-134a-8d10-d20bbc909b57 2
+9cfd306d-307f-134c-8d10-d20bbc909b57 2
+9cfd306d-307f-134f-8d10-d20bbc909b57 2
+9cfd306d-307f-1358-8d10-d20bbc909b57 2
+9cfd306d-307f-1360-8d10-d20bbc909b57 2
+9cfd306d-307f-1365-8d10-d20bbc909b57 2
+9cfd306d-307f-1371-8d10-d20bbc909b57 2
+9cfd306d-307f-137a-8d10-d20bbc909b57 2
+9cfd306d-307f-1380-8d10-d20bbc909b57 2
+9cfd306d-307f-1384-8d10-d20bbc909b57 2
+9cfd306d-307f-1393-8d10-d20bbc909b57 2
+9cfd306d-307f-1395-8d10-d20bbc909b57 2
+9cfd306d-307f-139e-8d10-d20bbc909b57 2
+9cfd306d-307f-13a0-8d10-d20bbc909b57 2
+9cfd306d-307f-13a5-8d10-d20bbc909b57 2
+9cfd306d-307f-13a9-8d10-d20bbc909b57 2
+9cfd306d-307f-13ac-8d10-d20bbc909b57 2
+9cfd306d-307f-13ad-8d10-d20bbc909b57 2
+9cfd306d-307f-13c3-8d10-d20bbc909b57 2
+9cfd306d-307f-13cb-8d10-d20bbc909b57 2
+9cfd306d-307f-13d9-8d10-d20bbc909b57 2
+9cfd306d-307f-13dc-8d10-d20bbc909b57 2
+9cfd306d-307f-13e2-8d10-d20bbc909b57 2
+9cfd306d-307f-13e5-8d10-d20bbc909b57 2
+9cfd306d-307f-13ef-8d10-d20bbc909b57 2
+9cfd306d-307f-13f1-8d10-d20bbc909b57 2
+9cfd306d-307f-13f6-8d10-d20bbc909b57 2
+9cfd306d-307f-13fc-8d10-d20bbc909b57 2
+9cfd306d-307f-13fd-8d10-d20bbc909b57 2
+9cfd306d-307f-14ec-8d14-d20bbc909b57 2
+9cfd306d-307f-14ec-8d19-d20bbc909b57 2
+9cfd306d-307f-14ec-8d1f-d20bbc909b57 2
+9cfd306d-307f-14ec-8d23-d20bbc909b57 2
+9cfd306d-307f-14ec-8d26-d20bbc909b57 2
+9cfd306d-307f-14ec-8d28-d20bbc909b57 2
+9cfd306d-307f-14ec-8d35-d20bbc909b57 2
+9cfd306d-307f-14ec-8d39-d20bbc909b57 2
+9cfd306d-307f-14ec-8d3b-d20bbc909b57 2
+9cfd306d-307f-14ec-8d4b-d20bbc909b57 2
+9cfd306d-307f-14ec-8d56-d20bbc909b57 2
+9cfd306d-307f-14ec-8d5f-d20bbc909b57 2
+9cfd306d-307f-14ec-8d66-d20bbc909b57 2
+9cfd306d-307f-14ec-8d6b-d20bbc909b57 2
+9cfd306d-307f-14ec-8d6e-d20bbc909b57 2
+9cfd306d-307f-14ec-8d6f-d20bbc909b57 2
+9cfd306d-307f-14ec-8d8c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d93-d20bbc909b57 2
+9cfd306d-307f-14ec-8dac-d20bbc909b57 2
+9cfd306d-307f-14ec-8daf-d20bbc909b57 2
+9cfd306d-307f-14ec-8db7-d20bbc909b57 2
+9cfd306d-307f-14ec-8dbb-d20bbc909b57 2
+9cfd306d-307f-14ec-8dbe-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc2-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd7-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd9-d20bbc909b57 2
+9cfd306d-307f-14ec-8de7-d20bbc909b57 2
+9cfd306d-307f-14ec-8dea-d20bbc909b57 2
+9cfd306d-307f-14ec-8deb-d20bbc909b57 2
+9cfd306d-307f-14ec-8df5-d20bbc909b57 2
+9cfd306d-307f-14ec-8dfc-d20bbc909b57 2
+9cfd306d-307f-14ec-8dff-d20bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b5f 2
+9cfd306d-307f-16ec-8d10-d20bbc909b68 2
+9cfd306d-307f-16ec-8d10-d20bbc909b6d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b6e 2
+9cfd306d-307f-16ec-8d10-d20bbc909b71 2
+9cfd306d-307f-16ec-8d10-d20bbc909b79 2
+9cfd306d-307f-16ec-8d10-d20bbc909b7a 2
+9cfd306d-307f-16ec-8d10-d20bbc909b92 2
+9cfd306d-307f-16ec-8d10-d20bbc909b97 2
+9cfd306d-307f-16ec-8d10-d20bbc909b99 2
+9cfd306d-307f-16ec-8d10-d20bbc909b9a 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba6 2
+9cfd306d-307f-16ec-8d10-d20bbc909baa 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb8 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb9 2
+9cfd306d-307f-16ec-8d10-d20bbc909bba 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc2 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc3 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc4 2
+9cfd306d-307f-16ec-8d10-d20bbc909bcd 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd3 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd6 2
+9cfd306d-307f-16ec-8d10-d20bbc909bde 2
+9cfd306d-307f-16ec-8d10-d20bbc909beb 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf6 2
+9cfd306d-307f-16ec-8d10-d20bbc909bfe 2
+9cfd306d-307f-15ec-8d10-d70bbc909b57 2
+9cfd306d-307f-15ec-8d10-d80bbc909b57 2
+9cfd306d-307f-15ec-8d10-dd0bbc909b57 2
+9cfd306d-307f-15ec-8d10-de0bbc909b57 2
+9cfd306d-307f-15ec-8d10-e00bbc909b57 2
+9cfd306d-307f-15ec-8d10-ea0bbc909b57 2
+9cfd306d-307f-15ec-8d10-f60bbc909b57 2
+9cfd306d-307f-15ec-8d10-fa0bbc909b57 2
+9cfd306d-307f-15ec-8d10-fd0bbc909b57 2
+9cfd306d-307f-15ec-8d10-ff0bbc909b57 2
+query
+SELECT a_p4, COUNT(*) FROM (SELECT a AS a_p4 FROM t1 PARTITION(p4) UNION ALL SELECT CAST(a AS UUID) AS a_p4 FROM t2 PARTITION(p4)) td GROUP BY a_p4
+a_p4 COUNT(*)
+9cfd306d-307f-15ec-8d10-000bbc909b57 2
+9cfd306d-307f-15ec-8d10-020bbc909b57 2
+9cfd306d-307f-15ec-8d10-030bbc909b57 2
+9cfd306d-307f-15ec-8d10-050bbc909b57 2
+9cfd306d-307f-15ec-8d10-220bbc909b57 2
+9cfd306d-307f-15ec-8d10-2c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-340bbc909b57 2
+9cfd306d-307f-15ec-8d10-370bbc909b57 2
+9cfd306d-307f-15ec-8d10-380bbc909b57 2
+9cfd306d-307f-15ec-8d10-3d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-440bbc909b57 2
+9cfd306d-307f-15ec-8d10-4a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-4d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-4f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-5c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-610bbc909b57 2
+9cfd306d-307f-15ec-8d10-6c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-6d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-6f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-710bbc909b57 2
+9cfd306d-307f-15ec-8d10-7c0bbc909b57 2
+9cfd306d-307f-15ec-8d10-800bbc909b57 2
+9cfd306d-307f-15ec-8d10-850bbc909b57 2
+9cfd306d-307f-15ec-8d10-890bbc909b57 2
+9cfd306d-307f-15ec-8d10-a50bbc909b57 2
+9cfd306d-307f-15ec-8d10-a90bbc909b57 2
+9cfd306d-307f-15ec-8d10-c90bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b00 2
+9cfd306d-307f-16ec-8d10-d20bbc909b06 2
+9cfd306d-307f-16ec-8d10-d20bbc909b07 2
+9cfd306d-307f-16ec-8d10-d20bbc909b09 2
+9cfd306d-307f-16ec-8d10-d20bbc909b14 2
+9cfd306d-307f-16ec-8d10-d20bbc909b1a 2
+9cfd306d-307f-16ec-8d10-d20bbc909b25 2
+9cfd306d-307f-16ec-8d10-d20bbc909b28 2
+9cfd306d-307f-16ec-8d10-d20bbc909b2e 2
+9cfd306d-307f-16ec-8d10-d20bbc909b2f 2
+9cfd306d-307f-16ec-8d10-d20bbc909b32 2
+9cfd306d-307f-16ec-8d10-d20bbc909b41 2
+9cfd306d-307f-16ec-8d10-d20bbc909b50 2
+9cfd306d-307f-16ec-8d10-d20bbc909b52 2
+9cfd306d-307f-14ec-8d0f-d20bbc909b57 2
+0ffd306d-307f-11ec-8d10-d20bbc909b57 2
+15fd306d-307f-11ec-8d10-d20bbc909b57 2
+1dfd306d-307f-11ec-8d10-d20bbc909b57 2
+23fd306d-307f-11ec-8d10-d20bbc909b57 2
+24fd306d-307f-11ec-8d10-d20bbc909b57 2
+28fd306d-307f-11ec-8d10-d20bbc909b57 2
+2cfd306d-307f-11ec-8d10-d20bbc909b57 2
+2ffd306d-307f-11ec-8d10-d20bbc909b57 2
+35fd306d-307f-11ec-8d10-d20bbc909b57 2
+37fd306d-307f-11ec-8d10-d20bbc909b57 2
+43fd306d-307f-11ec-8d10-d20bbc909b57 2
+44fd306d-307f-11ec-8d10-d20bbc909b57 2
+49fd306d-307f-11ec-8d10-d20bbc909b57 2
+4dfd306d-307f-11ec-8d10-d20bbc909b57 2
+59fd306d-307f-11ec-8d10-d20bbc909b57 2
+63fd306d-307f-11ec-8d10-d20bbc909b57 2
+64fd306d-307f-11ec-8d10-d20bbc909b57 2
+67fd306d-307f-11ec-8d10-d20bbc909b57 2
+6afd306d-307f-11ec-8d10-d20bbc909b57 2
+70fd306d-307f-11ec-8d10-d20bbc909b57 2
+72fd306d-307f-11ec-8d10-d20bbc909b57 2
+79fd306d-307f-11ec-8d10-d20bbc909b57 2
+7afd306d-307f-11ec-8d10-d20bbc909b57 2
+81fd306d-307f-11ec-8d10-d20bbc909b57 2
+8afd306d-307f-11ec-8d10-d20bbc909b57 2
+8bfd306d-307f-11ec-8d10-d20bbc909b57 2
+96fd306d-307f-11ec-8d10-d20bbc909b57 2
+98fd306d-307f-11ec-8d10-d20bbc909b57 2
+a6fd306d-307f-11ec-8d10-d20bbc909b57 2
+abfd306d-307f-11ec-8d10-d20bbc909b57 2
+acfd306d-307f-11ec-8d10-d20bbc909b57 2
+b1fd306d-307f-11ec-8d10-d20bbc909b57 2
+b5fd306d-307f-11ec-8d10-d20bbc909b57 2
+bbfd306d-307f-11ec-8d10-d20bbc909b57 2
+bdfd306d-307f-11ec-8d10-d20bbc909b57 2
+bffd306d-307f-11ec-8d10-d20bbc909b57 2
+c0fd306d-307f-11ec-8d10-d20bbc909b57 2
+c4fd306d-307f-11ec-8d10-d20bbc909b57 2
+c6fd306d-307f-11ec-8d10-d20bbc909b57 2
+c9fd306d-307f-11ec-8d10-d20bbc909b57 2
+d1fd306d-307f-11ec-8d10-d20bbc909b57 2
+d6fd306d-307f-11ec-8d10-d20bbc909b57 2
+d9fd306d-307f-11ec-8d10-d20bbc909b57 2
+dafd306d-307f-11ec-8d10-d20bbc909b57 2
+e8fd306d-307f-11ec-8d10-d20bbc909b57 2
+eafd306d-307f-11ec-8d10-d20bbc909b57 2
+effd306d-307f-11ec-8d10-d20bbc909b57 2
+f5fd306d-307f-11ec-8d10-d20bbc909b57 2
+fbfd306d-307f-11ec-8d10-d20bbc909b57 2
+fcfd306d-307f-11ec-8d10-d20bbc909b57 2
+fefd306d-307f-11ec-8d10-d20bbc909b57 2
+9cfd306d-017f-12ec-8d10-d20bbc909b57 2
+9cfd306d-067f-12ec-8d10-d20bbc909b57 2
+9cfd306d-0f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-107f-12ec-8d10-d20bbc909b57 2
+9cfd306d-167f-12ec-8d10-d20bbc909b57 2
+9cfd306d-1c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-217f-12ec-8d10-d20bbc909b57 2
+9cfd306d-237f-12ec-8d10-d20bbc909b57 2
+9cfd306d-2e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-327f-12ec-8d10-d20bbc909b57 2
+9cfd306d-3c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-3d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-417f-12ec-8d10-d20bbc909b57 2
+9cfd306d-4a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-4c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-4e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-507f-12ec-8d10-d20bbc909b57 2
+9cfd306d-597f-12ec-8d10-d20bbc909b57 2
+9cfd306d-607f-12ec-8d10-d20bbc909b57 2
+9cfd306d-627f-12ec-8d10-d20bbc909b57 2
+9cfd306d-637f-12ec-8d10-d20bbc909b57 2
+9cfd306d-677f-12ec-8d10-d20bbc909b57 2
+9cfd306d-697f-12ec-8d10-d20bbc909b57 2
+9cfd306d-6c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-737f-12ec-8d10-d20bbc909b57 2
+9cfd306d-767f-12ec-8d10-d20bbc909b57 2
+9cfd306d-7c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-827f-12ec-8d10-d20bbc909b57 2
+9cfd306d-847f-12ec-8d10-d20bbc909b57 2
+9cfd306d-8b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-8e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-997f-12ec-8d10-d20bbc909b57 2
+9cfd306d-9f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a27f-12ec-8d10-d20bbc909b57 2
+9cfd306d-af7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ba7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-be7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c37f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ce7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d97f-12ec-8d10-d20bbc909b57 2
+9cfd306d-db7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e47f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ee7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-fa7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-fe7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-307f-1302-8d10-d20bbc909b57 2
+9cfd306d-307f-1303-8d10-d20bbc909b57 2
+9cfd306d-307f-1308-8d10-d20bbc909b57 2
+9cfd306d-307f-130d-8d10-d20bbc909b57 2
+9cfd306d-307f-130f-8d10-d20bbc909b57 2
+9cfd306d-307f-1311-8d10-d20bbc909b57 2
+9cfd306d-307f-1315-8d10-d20bbc909b57 2
+9cfd306d-307f-1318-8d10-d20bbc909b57 2
+9cfd306d-307f-1326-8d10-d20bbc909b57 2
+9cfd306d-307f-132f-8d10-d20bbc909b57 2
+9cfd306d-307f-1333-8d10-d20bbc909b57 2
+9cfd306d-307f-1342-8d10-d20bbc909b57 2
+9cfd306d-307f-1344-8d10-d20bbc909b57 2
+9cfd306d-307f-134b-8d10-d20bbc909b57 2
+9cfd306d-307f-134e-8d10-d20bbc909b57 2
+9cfd306d-307f-1350-8d10-d20bbc909b57 2
+9cfd306d-307f-1354-8d10-d20bbc909b57 2
+9cfd306d-307f-1357-8d10-d20bbc909b57 2
+9cfd306d-307f-1369-8d10-d20bbc909b57 2
+9cfd306d-307f-1370-8d10-d20bbc909b57 2
+9cfd306d-307f-1373-8d10-d20bbc909b57 2
+9cfd306d-307f-1378-8d10-d20bbc909b57 2
+9cfd306d-307f-1392-8d10-d20bbc909b57 2
+9cfd306d-307f-1397-8d10-d20bbc909b57 2
+9cfd306d-307f-139a-8d10-d20bbc909b57 2
+9cfd306d-307f-139d-8d10-d20bbc909b57 2
+9cfd306d-307f-13b2-8d10-d20bbc909b57 2
+9cfd306d-307f-13b7-8d10-d20bbc909b57 2
+9cfd306d-307f-13b9-8d10-d20bbc909b57 2
+9cfd306d-307f-13c1-8d10-d20bbc909b57 2
+9cfd306d-307f-13d2-8d10-d20bbc909b57 2
+9cfd306d-307f-13e3-8d10-d20bbc909b57 2
+9cfd306d-307f-13e8-8d10-d20bbc909b57 2
+9cfd306d-307f-13f0-8d10-d20bbc909b57 2
+9cfd306d-307f-13f2-8d10-d20bbc909b57 2
+9cfd306d-307f-13ff-8d10-d20bbc909b57 2
+9cfd306d-307f-14ec-8d13-d20bbc909b57 2
+9cfd306d-307f-14ec-8d1e-d20bbc909b57 2
+9cfd306d-307f-14ec-8d24-d20bbc909b57 2
+9cfd306d-307f-14ec-8d29-d20bbc909b57 2
+9cfd306d-307f-14ec-8d2e-d20bbc909b57 2
+9cfd306d-307f-14ec-8d2f-d20bbc909b57 2
+9cfd306d-307f-14ec-8d34-d20bbc909b57 2
+9cfd306d-307f-14ec-8d3a-d20bbc909b57 2
+9cfd306d-307f-14ec-8d41-d20bbc909b57 2
+9cfd306d-307f-14ec-8d46-d20bbc909b57 2
+9cfd306d-307f-14ec-8d55-d20bbc909b57 2
+9cfd306d-307f-14ec-8d5b-d20bbc909b57 2
+9cfd306d-307f-14ec-8d60-d20bbc909b57 2
+9cfd306d-307f-14ec-8d69-d20bbc909b57 2
+9cfd306d-307f-14ec-8d70-d20bbc909b57 2
+9cfd306d-307f-14ec-8d73-d20bbc909b57 2
+9cfd306d-307f-14ec-8d77-d20bbc909b57 2
+9cfd306d-307f-14ec-8d7a-d20bbc909b57 2
+9cfd306d-307f-14ec-8d80-d20bbc909b57 2
+9cfd306d-307f-14ec-8d85-d20bbc909b57 2
+9cfd306d-307f-14ec-8d8b-d20bbc909b57 2
+9cfd306d-307f-14ec-8d90-d20bbc909b57 2
+9cfd306d-307f-14ec-8d91-d20bbc909b57 2
+9cfd306d-307f-14ec-8d98-d20bbc909b57 2
+9cfd306d-307f-14ec-8d99-d20bbc909b57 2
+9cfd306d-307f-14ec-8d9d-d20bbc909b57 2
+9cfd306d-307f-14ec-8da2-d20bbc909b57 2
+9cfd306d-307f-14ec-8da4-d20bbc909b57 2
+9cfd306d-307f-14ec-8da8-d20bbc909b57 2
+9cfd306d-307f-14ec-8da9-d20bbc909b57 2
+9cfd306d-307f-14ec-8db1-d20bbc909b57 2
+9cfd306d-307f-14ec-8db6-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc0-d20bbc909b57 2
+9cfd306d-307f-14ec-8dca-d20bbc909b57 2
+9cfd306d-307f-14ec-8dcb-d20bbc909b57 2
+9cfd306d-307f-14ec-8ddf-d20bbc909b57 2
+9cfd306d-307f-14ec-8de0-d20bbc909b57 2
+9cfd306d-307f-14ec-8de4-d20bbc909b57 2
+9cfd306d-307f-14ec-8ded-d20bbc909b57 2
+9cfd306d-307f-14ec-8df3-d20bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b5b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b76 2
+9cfd306d-307f-16ec-8d10-d20bbc909b84 2
+9cfd306d-307f-16ec-8d10-d20bbc909b85 2
+9cfd306d-307f-16ec-8d10-d20bbc909b88 2
+9cfd306d-307f-16ec-8d10-d20bbc909b9d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b9e 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba0 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba8 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc0 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc5 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc8 2
+9cfd306d-307f-16ec-8d10-d20bbc909bce 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd0 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd1 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd7 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd9 2
+9cfd306d-307f-16ec-8d10-d20bbc909bda 2
+9cfd306d-307f-16ec-8d10-d20bbc909bdb 2
+9cfd306d-307f-16ec-8d10-d20bbc909be4 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf7 2
+9cfd306d-307f-15ec-8d10-d60bbc909b57 2
+9cfd306d-307f-15ec-8d10-d90bbc909b57 2
+9cfd306d-307f-15ec-8d10-e10bbc909b57 2
+9cfd306d-307f-15ec-8d10-e90bbc909b57 2
+9cfd306d-307f-15ec-8d10-f80bbc909b57 2
+query
+SELECT a_p5, COUNT(*) FROM (SELECT a AS a_p5 FROM t1 PARTITION(p5) UNION ALL SELECT CAST(a AS UUID) AS a_p5 FROM t2 PARTITION(p5)) td GROUP BY a_p5
+a_p5 COUNT(*)
+9cfd306d-307f-15ec-8d10-070bbc909b57 2
+9cfd306d-307f-15ec-8d10-0a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-0b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-140bbc909b57 2
+9cfd306d-307f-15ec-8d10-1b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-200bbc909b57 2
+9cfd306d-307f-15ec-8d10-210bbc909b57 2
+9cfd306d-307f-15ec-8d10-280bbc909b57 2
+9cfd306d-307f-15ec-8d10-2a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-2f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-360bbc909b57 2
+9cfd306d-307f-15ec-8d10-390bbc909b57 2
+9cfd306d-307f-15ec-8d10-3b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-3f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-410bbc909b57 2
+9cfd306d-307f-15ec-8d10-420bbc909b57 2
+9cfd306d-307f-15ec-8d10-4b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-4e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-590bbc909b57 2
+9cfd306d-307f-15ec-8d10-720bbc909b57 2
+9cfd306d-307f-15ec-8d10-760bbc909b57 2
+9cfd306d-307f-15ec-8d10-7f0bbc909b57 2
+9cfd306d-307f-15ec-8d10-810bbc909b57 2
+9cfd306d-307f-15ec-8d10-8d0bbc909b57 2
+9cfd306d-307f-15ec-8d10-960bbc909b57 2
+9cfd306d-307f-15ec-8d10-a10bbc909b57 2
+9cfd306d-307f-15ec-8d10-a30bbc909b57 2
+9cfd306d-307f-15ec-8d10-ab0bbc909b57 2
+9cfd306d-307f-15ec-8d10-ae0bbc909b57 2
+9cfd306d-307f-15ec-8d10-b10bbc909b57 2
+9cfd306d-307f-15ec-8d10-b20bbc909b57 2
+9cfd306d-307f-15ec-8d10-b30bbc909b57 2
+9cfd306d-307f-15ec-8d10-bb0bbc909b57 2
+9cfd306d-307f-15ec-8d10-be0bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b01 2
+9cfd306d-307f-16ec-8d10-d20bbc909b0a 2
+9cfd306d-307f-16ec-8d10-d20bbc909b0c 2
+9cfd306d-307f-16ec-8d10-d20bbc909b15 2
+9cfd306d-307f-16ec-8d10-d20bbc909b1d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b1e 2
+9cfd306d-307f-16ec-8d10-d20bbc909b20 2
+9cfd306d-307f-16ec-8d10-d20bbc909b2b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b33 2
+9cfd306d-307f-16ec-8d10-d20bbc909b36 2
+9cfd306d-307f-16ec-8d10-d20bbc909b3d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b3e 2
+9cfd306d-307f-16ec-8d10-d20bbc909b48 2
+9cfd306d-307f-16ec-8d10-d20bbc909b4e 2
+9cfd306d-307f-16ec-8d10-d20bbc909b53 2
+9cfd306d-307f-14ec-8d00-d20bbc909b57 2
+9cfd306d-307f-14ec-8d04-d20bbc909b57 2
+9cfd306d-307f-14ec-8d08-d20bbc909b57 2
+9cfd306d-307f-14ec-8d0b-d20bbc909b57 2
+06fd306d-307f-11ec-8d10-d20bbc909b57 2
+0afd306d-307f-11ec-8d10-d20bbc909b57 2
+12fd306d-307f-11ec-8d10-d20bbc909b57 2
+18fd306d-307f-11ec-8d10-d20bbc909b57 2
+22fd306d-307f-11ec-8d10-d20bbc909b57 2
+27fd306d-307f-11ec-8d10-d20bbc909b57 2
+39fd306d-307f-11ec-8d10-d20bbc909b57 2
+41fd306d-307f-11ec-8d10-d20bbc909b57 2
+47fd306d-307f-11ec-8d10-d20bbc909b57 2
+4cfd306d-307f-11ec-8d10-d20bbc909b57 2
+56fd306d-307f-11ec-8d10-d20bbc909b57 2
+5dfd306d-307f-11ec-8d10-d20bbc909b57 2
+68fd306d-307f-11ec-8d10-d20bbc909b57 2
+6dfd306d-307f-11ec-8d10-d20bbc909b57 2
+77fd306d-307f-11ec-8d10-d20bbc909b57 2
+7dfd306d-307f-11ec-8d10-d20bbc909b57 2
+80fd306d-307f-11ec-8d10-d20bbc909b57 2
+84fd306d-307f-11ec-8d10-d20bbc909b57 2
+87fd306d-307f-11ec-8d10-d20bbc909b57 2
+90fd306d-307f-11ec-8d10-d20bbc909b57 2
+92fd306d-307f-11ec-8d10-d20bbc909b57 2
+95fd306d-307f-11ec-8d10-d20bbc909b57 2
+9cfd306d-307f-11ec-8d10-d20bbc909b57 2
+9dfd306d-307f-11ec-8d10-d20bbc909b57 2
+a4fd306d-307f-11ec-8d10-d20bbc909b57 2
+a5fd306d-307f-11ec-8d10-d20bbc909b57 2
+a7fd306d-307f-11ec-8d10-d20bbc909b57 2
+a8fd306d-307f-11ec-8d10-d20bbc909b57 2
+a9fd306d-307f-11ec-8d10-d20bbc909b57 2
+b6fd306d-307f-11ec-8d10-d20bbc909b57 2
+cafd306d-307f-11ec-8d10-d20bbc909b57 2
+cefd306d-307f-11ec-8d10-d20bbc909b57 2
+d2fd306d-307f-11ec-8d10-d20bbc909b57 2
+e1fd306d-307f-11ec-8d10-d20bbc909b57 2
+e2fd306d-307f-11ec-8d10-d20bbc909b57 2
+ecfd306d-307f-11ec-8d10-d20bbc909b57 2
+9cfd306d-1d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-1e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-257f-12ec-8d10-d20bbc909b57 2
+9cfd306d-337f-12ec-8d10-d20bbc909b57 2
+9cfd306d-457f-12ec-8d10-d20bbc909b57 2
+9cfd306d-477f-12ec-8d10-d20bbc909b57 2
+9cfd306d-487f-12ec-8d10-d20bbc909b57 2
+9cfd306d-497f-12ec-8d10-d20bbc909b57 2
+9cfd306d-557f-12ec-8d10-d20bbc909b57 2
+9cfd306d-577f-12ec-8d10-d20bbc909b57 2
+9cfd306d-647f-12ec-8d10-d20bbc909b57 2
+9cfd306d-687f-12ec-8d10-d20bbc909b57 2
+9cfd306d-6a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-6e7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-707f-12ec-8d10-d20bbc909b57 2
+9cfd306d-717f-12ec-8d10-d20bbc909b57 2
+9cfd306d-857f-12ec-8d10-d20bbc909b57 2
+9cfd306d-8a7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ae7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b37f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c17f-12ec-8d10-d20bbc909b57 2
+9cfd306d-cd7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d27f-12ec-8d10-d20bbc909b57 2
+9cfd306d-dc7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-de7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e87f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ef7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f17f-12ec-8d10-d20bbc909b57 2
+9cfd306d-307f-130a-8d10-d20bbc909b57 2
+9cfd306d-307f-1322-8d10-d20bbc909b57 2
+9cfd306d-307f-1323-8d10-d20bbc909b57 2
+9cfd306d-307f-1324-8d10-d20bbc909b57 2
+9cfd306d-307f-1328-8d10-d20bbc909b57 2
+9cfd306d-307f-132b-8d10-d20bbc909b57 2
+9cfd306d-307f-1346-8d10-d20bbc909b57 2
+9cfd306d-307f-1348-8d10-d20bbc909b57 2
+9cfd306d-307f-1352-8d10-d20bbc909b57 2
+9cfd306d-307f-1353-8d10-d20bbc909b57 2
+9cfd306d-307f-1359-8d10-d20bbc909b57 2
+9cfd306d-307f-135f-8d10-d20bbc909b57 2
+9cfd306d-307f-1366-8d10-d20bbc909b57 2
+9cfd306d-307f-1367-8d10-d20bbc909b57 2
+9cfd306d-307f-136b-8d10-d20bbc909b57 2
+9cfd306d-307f-1374-8d10-d20bbc909b57 2
+9cfd306d-307f-139b-8d10-d20bbc909b57 2
+9cfd306d-307f-13a4-8d10-d20bbc909b57 2
+9cfd306d-307f-13a8-8d10-d20bbc909b57 2
+9cfd306d-307f-13b6-8d10-d20bbc909b57 2
+9cfd306d-307f-13c5-8d10-d20bbc909b57 2
+9cfd306d-307f-13c6-8d10-d20bbc909b57 2
+9cfd306d-307f-13c7-8d10-d20bbc909b57 2
+9cfd306d-307f-13d4-8d10-d20bbc909b57 2
+9cfd306d-307f-13d5-8d10-d20bbc909b57 2
+9cfd306d-307f-13de-8d10-d20bbc909b57 2
+9cfd306d-307f-13e4-8d10-d20bbc909b57 2
+9cfd306d-307f-13ea-8d10-d20bbc909b57 2
+9cfd306d-307f-13f3-8d10-d20bbc909b57 2
+9cfd306d-307f-13f4-8d10-d20bbc909b57 2
+9cfd306d-307f-14ec-8d12-d20bbc909b57 2
+9cfd306d-307f-14ec-8d15-d20bbc909b57 2
+9cfd306d-307f-14ec-8d16-d20bbc909b57 2
+9cfd306d-307f-14ec-8d18-d20bbc909b57 2
+9cfd306d-307f-14ec-8d1a-d20bbc909b57 2
+9cfd306d-307f-14ec-8d1c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d20-d20bbc909b57 2
+9cfd306d-307f-14ec-8d43-d20bbc909b57 2
+9cfd306d-307f-14ec-8d52-d20bbc909b57 2
+9cfd306d-307f-14ec-8d53-d20bbc909b57 2
+9cfd306d-307f-14ec-8d54-d20bbc909b57 2
+9cfd306d-307f-14ec-8d58-d20bbc909b57 2
+9cfd306d-307f-14ec-8d5c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d65-d20bbc909b57 2
+9cfd306d-307f-14ec-8d72-d20bbc909b57 2
+9cfd306d-307f-14ec-8d74-d20bbc909b57 2
+9cfd306d-307f-14ec-8d79-d20bbc909b57 2
+9cfd306d-307f-14ec-8d7c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d7f-d20bbc909b57 2
+9cfd306d-307f-14ec-8d83-d20bbc909b57 2
+9cfd306d-307f-14ec-8db3-d20bbc909b57 2
+9cfd306d-307f-14ec-8dbc-d20bbc909b57 2
+9cfd306d-307f-14ec-8dbf-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc4-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc9-d20bbc909b57 2
+9cfd306d-307f-14ec-8dcd-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd2-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd5-d20bbc909b57 2
+9cfd306d-307f-14ec-8dde-d20bbc909b57 2
+9cfd306d-307f-14ec-8dec-d20bbc909b57 2
+9cfd306d-307f-14ec-8df0-d20bbc909b57 2
+9cfd306d-307f-14ec-8df2-d20bbc909b57 2
+9cfd306d-307f-14ec-8df4-d20bbc909b57 2
+9cfd306d-307f-14ec-8dfa-d20bbc909b57 2
+9cfd306d-307f-14ec-8dfe-d20bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b5c 2
+9cfd306d-307f-16ec-8d10-d20bbc909b5d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b5e 2
+9cfd306d-307f-16ec-8d10-d20bbc909b60 2
+9cfd306d-307f-16ec-8d10-d20bbc909b66 2
+9cfd306d-307f-16ec-8d10-d20bbc909b67 2
+9cfd306d-307f-16ec-8d10-d20bbc909b77 2
+9cfd306d-307f-16ec-8d10-d20bbc909b8f 2
+9cfd306d-307f-16ec-8d10-d20bbc909b93 2
+9cfd306d-307f-16ec-8d10-d20bbc909b98 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba1 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba4 2
+9cfd306d-307f-16ec-8d10-d20bbc909baf 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb2 2
+9cfd306d-307f-16ec-8d10-d20bbc909bb3 2
+9cfd306d-307f-16ec-8d10-d20bbc909bbe 2
+9cfd306d-307f-16ec-8d10-d20bbc909bcb 2
+9cfd306d-307f-16ec-8d10-d20bbc909bcc 2
+9cfd306d-307f-16ec-8d10-d20bbc909bdc 2
+9cfd306d-307f-16ec-8d10-d20bbc909be5 2
+9cfd306d-307f-16ec-8d10-d20bbc909be7 2
+9cfd306d-307f-16ec-8d10-d20bbc909be9 2
+9cfd306d-307f-16ec-8d10-d20bbc909bef 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf4 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf8 2
+9cfd306d-307f-16ec-8d10-d20bbc909bfd 2
+9cfd306d-307f-15ec-8d10-e50bbc909b57 2
+9cfd306d-307f-15ec-8d10-f20bbc909b57 2
+9cfd306d-307f-15ec-8d10-f40bbc909b57 2
+9cfd306d-307f-15ec-8d10-f50bbc909b57 2
+9cfd306d-307f-15ec-8d10-fc0bbc909b57 2
+query
+SELECT a_p6, COUNT(*) FROM (SELECT a AS a_p6 FROM t1 PARTITION(p6) UNION ALL SELECT CAST(a AS UUID) AS a_p6 FROM t2 PARTITION(p6)) td GROUP BY a_p6
+a_p6 COUNT(*)
+9cfd306d-307f-15ec-8d10-0e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-160bbc909b57 2
+9cfd306d-307f-15ec-8d10-170bbc909b57 2
+9cfd306d-307f-15ec-8d10-290bbc909b57 2
+9cfd306d-307f-15ec-8d10-2e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-350bbc909b57 2
+9cfd306d-307f-15ec-8d10-450bbc909b57 2
+9cfd306d-307f-15ec-8d10-540bbc909b57 2
+9cfd306d-307f-15ec-8d10-550bbc909b57 2
+9cfd306d-307f-15ec-8d10-5b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-600bbc909b57 2
+9cfd306d-307f-15ec-8d10-620bbc909b57 2
+9cfd306d-307f-15ec-8d10-670bbc909b57 2
+9cfd306d-307f-15ec-8d10-690bbc909b57 2
+9cfd306d-307f-15ec-8d10-6b0bbc909b57 2
+9cfd306d-307f-15ec-8d10-730bbc909b57 2
+9cfd306d-307f-15ec-8d10-7a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-870bbc909b57 2
+9cfd306d-307f-15ec-8d10-8a0bbc909b57 2
+9cfd306d-307f-15ec-8d10-9e0bbc909b57 2
+9cfd306d-307f-15ec-8d10-a60bbc909b57 2
+9cfd306d-307f-15ec-8d10-b40bbc909b57 2
+9cfd306d-307f-15ec-8d10-b50bbc909b57 2
+9cfd306d-307f-15ec-8d10-b90bbc909b57 2
+9cfd306d-307f-15ec-8d10-bd0bbc909b57 2
+9cfd306d-307f-15ec-8d10-bf0bbc909b57 2
+9cfd306d-307f-15ec-8d10-c80bbc909b57 2
+9cfd306d-307f-15ec-8d10-ce0bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b08 2
+9cfd306d-307f-16ec-8d10-d20bbc909b12 2
+9cfd306d-307f-16ec-8d10-d20bbc909b18 2
+9cfd306d-307f-16ec-8d10-d20bbc909b21 2
+9cfd306d-307f-16ec-8d10-d20bbc909b23 2
+9cfd306d-307f-16ec-8d10-d20bbc909b2c 2
+9cfd306d-307f-16ec-8d10-d20bbc909b30 2
+9cfd306d-307f-16ec-8d10-d20bbc909b39 2
+9cfd306d-307f-16ec-8d10-d20bbc909b3b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b44 2
+9cfd306d-307f-16ec-8d10-d20bbc909b4b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b4c 2
+9cfd306d-307f-14ec-8d03-d20bbc909b57 2
+9cfd306d-307f-14ec-8d09-d20bbc909b57 2
+9cfd306d-307f-14ec-8d0c-d20bbc909b57 2
+9cfd306d-307f-14ec-8d0d-d20bbc909b57 2
+9cfd306d-307f-14ec-8d0e-d20bbc909b57 2
+01fd306d-307f-11ec-8d10-d20bbc909b57 2
+05fd306d-307f-11ec-8d10-d20bbc909b57 2
+0cfd306d-307f-11ec-8d10-d20bbc909b57 2
+1efd306d-307f-11ec-8d10-d20bbc909b57 2
+1ffd306d-307f-11ec-8d10-d20bbc909b57 2
+2efd306d-307f-11ec-8d10-d20bbc909b57 2
+30fd306d-307f-11ec-8d10-d20bbc909b57 2
+31fd306d-307f-11ec-8d10-d20bbc909b57 2
+3afd306d-307f-11ec-8d10-d20bbc909b57 2
+3cfd306d-307f-11ec-8d10-d20bbc909b57 2
+40fd306d-307f-11ec-8d10-d20bbc909b57 2
+4afd306d-307f-11ec-8d10-d20bbc909b57 2
+57fd306d-307f-11ec-8d10-d20bbc909b57 2
+5efd306d-307f-11ec-8d10-d20bbc909b57 2
+6cfd306d-307f-11ec-8d10-d20bbc909b57 2
+71fd306d-307f-11ec-8d10-d20bbc909b57 2
+74fd306d-307f-11ec-8d10-d20bbc909b57 2
+7bfd306d-307f-11ec-8d10-d20bbc909b57 2
+88fd306d-307f-11ec-8d10-d20bbc909b57 2
+8efd306d-307f-11ec-8d10-d20bbc909b57 2
+9ffd306d-307f-11ec-8d10-d20bbc909b57 2
+a0fd306d-307f-11ec-8d10-d20bbc909b57 2
+a2fd306d-307f-11ec-8d10-d20bbc909b57 2
+bafd306d-307f-11ec-8d10-d20bbc909b57 2
+befd306d-307f-11ec-8d10-d20bbc909b57 2
+c1fd306d-307f-11ec-8d10-d20bbc909b57 2
+c5fd306d-307f-11ec-8d10-d20bbc909b57 2
+c8fd306d-307f-11ec-8d10-d20bbc909b57 2
+cffd306d-307f-11ec-8d10-d20bbc909b57 2
+d7fd306d-307f-11ec-8d10-d20bbc909b57 2
+dffd306d-307f-11ec-8d10-d20bbc909b57 2
+e3fd306d-307f-11ec-8d10-d20bbc909b57 2
+e7fd306d-307f-11ec-8d10-d20bbc909b57 2
+e9fd306d-307f-11ec-8d10-d20bbc909b57 2
+f2fd306d-307f-11ec-8d10-d20bbc909b57 2
+fffd306d-307f-11ec-8d10-d20bbc909b57 2
+9cfd306d-027f-12ec-8d10-d20bbc909b57 2
+9cfd306d-0c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-157f-12ec-8d10-d20bbc909b57 2
+9cfd306d-1f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-287f-12ec-8d10-d20bbc909b57 2
+9cfd306d-2d7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-2f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-397f-12ec-8d10-d20bbc909b57 2
+9cfd306d-3b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-427f-12ec-8d10-d20bbc909b57 2
+9cfd306d-567f-12ec-8d10-d20bbc909b57 2
+9cfd306d-5c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-5f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-877f-12ec-8d10-d20bbc909b57 2
+9cfd306d-887f-12ec-8d10-d20bbc909b57 2
+9cfd306d-8f7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-947f-12ec-8d10-d20bbc909b57 2
+9cfd306d-957f-12ec-8d10-d20bbc909b57 2
+9cfd306d-9b7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-9c7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a07f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a37f-12ec-8d10-d20bbc909b57 2
+9cfd306d-a57f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b47f-12ec-8d10-d20bbc909b57 2
+9cfd306d-b77f-12ec-8d10-d20bbc909b57 2
+9cfd306d-bf7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c27f-12ec-8d10-d20bbc909b57 2
+9cfd306d-c57f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ca7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-cc7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d07f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d37f-12ec-8d10-d20bbc909b57 2
+9cfd306d-d57f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e07f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e27f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e67f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e77f-12ec-8d10-d20bbc909b57 2
+9cfd306d-e97f-12ec-8d10-d20bbc909b57 2
+9cfd306d-ed7f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f27f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f37f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f47f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f67f-12ec-8d10-d20bbc909b57 2
+9cfd306d-f97f-12ec-8d10-d20bbc909b57 2
+9cfd306d-307f-1301-8d10-d20bbc909b57 2
+9cfd306d-307f-1305-8d10-d20bbc909b57 2
+9cfd306d-307f-1306-8d10-d20bbc909b57 2
+9cfd306d-307f-1307-8d10-d20bbc909b57 2
+9cfd306d-307f-130c-8d10-d20bbc909b57 2
+9cfd306d-307f-1312-8d10-d20bbc909b57 2
+9cfd306d-307f-131d-8d10-d20bbc909b57 2
+9cfd306d-307f-1334-8d10-d20bbc909b57 2
+9cfd306d-307f-133c-8d10-d20bbc909b57 2
+9cfd306d-307f-133f-8d10-d20bbc909b57 2
+9cfd306d-307f-1343-8d10-d20bbc909b57 2
+9cfd306d-307f-1347-8d10-d20bbc909b57 2
+9cfd306d-307f-1349-8d10-d20bbc909b57 2
+9cfd306d-307f-135d-8d10-d20bbc909b57 2
+9cfd306d-307f-1362-8d10-d20bbc909b57 2
+9cfd306d-307f-1364-8d10-d20bbc909b57 2
+9cfd306d-307f-136d-8d10-d20bbc909b57 2
+9cfd306d-307f-1377-8d10-d20bbc909b57 2
+9cfd306d-307f-137b-8d10-d20bbc909b57 2
+9cfd306d-307f-137c-8d10-d20bbc909b57 2
+9cfd306d-307f-138b-8d10-d20bbc909b57 2
+9cfd306d-307f-1396-8d10-d20bbc909b57 2
+9cfd306d-307f-1399-8d10-d20bbc909b57 2
+9cfd306d-307f-13ae-8d10-d20bbc909b57 2
+9cfd306d-307f-13bd-8d10-d20bbc909b57 2
+9cfd306d-307f-13c4-8d10-d20bbc909b57 2
+9cfd306d-307f-13c9-8d10-d20bbc909b57 2
+9cfd306d-307f-13cc-8d10-d20bbc909b57 2
+9cfd306d-307f-13cd-8d10-d20bbc909b57 2
+9cfd306d-307f-13d7-8d10-d20bbc909b57 2
+9cfd306d-307f-13da-8d10-d20bbc909b57 2
+9cfd306d-307f-13dd-8d10-d20bbc909b57 2
+9cfd306d-307f-13e1-8d10-d20bbc909b57 2
+9cfd306d-307f-13e6-8d10-d20bbc909b57 2
+9cfd306d-307f-13ec-8d10-d20bbc909b57 2
+9cfd306d-307f-13ed-8d10-d20bbc909b57 2
+9cfd306d-307f-13ee-8d10-d20bbc909b57 2
+9cfd306d-307f-13f8-8d10-d20bbc909b57 2
+9cfd306d-307f-14ec-8d10-d20bbc909b57 2
+9cfd306d-307f-14ec-8d1b-d20bbc909b57 2
+9cfd306d-307f-14ec-8d1d-d20bbc909b57 2
+9cfd306d-307f-14ec-8d21-d20bbc909b57 2
+9cfd306d-307f-14ec-8d22-d20bbc909b57 2
+9cfd306d-307f-14ec-8d25-d20bbc909b57 2
+9cfd306d-307f-14ec-8d32-d20bbc909b57 2
+9cfd306d-307f-14ec-8d48-d20bbc909b57 2
+9cfd306d-307f-14ec-8d5d-d20bbc909b57 2
+9cfd306d-307f-14ec-8d62-d20bbc909b57 2
+9cfd306d-307f-14ec-8d64-d20bbc909b57 2
+9cfd306d-307f-14ec-8d71-d20bbc909b57 2
+9cfd306d-307f-14ec-8d84-d20bbc909b57 2
+9cfd306d-307f-14ec-8d8a-d20bbc909b57 2
+9cfd306d-307f-14ec-8d9a-d20bbc909b57 2
+9cfd306d-307f-14ec-8da1-d20bbc909b57 2
+9cfd306d-307f-14ec-8da7-d20bbc909b57 2
+9cfd306d-307f-14ec-8dae-d20bbc909b57 2
+9cfd306d-307f-14ec-8db0-d20bbc909b57 2
+9cfd306d-307f-14ec-8db2-d20bbc909b57 2
+9cfd306d-307f-14ec-8db8-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc1-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc3-d20bbc909b57 2
+9cfd306d-307f-14ec-8dc8-d20bbc909b57 2
+9cfd306d-307f-14ec-8dce-d20bbc909b57 2
+9cfd306d-307f-14ec-8dcf-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd0-d20bbc909b57 2
+9cfd306d-307f-14ec-8dd8-d20bbc909b57 2
+9cfd306d-307f-14ec-8ddb-d20bbc909b57 2
+9cfd306d-307f-14ec-8ddc-d20bbc909b57 2
+9cfd306d-307f-14ec-8de2-d20bbc909b57 2
+9cfd306d-307f-14ec-8de3-d20bbc909b57 2
+9cfd306d-307f-14ec-8dfb-d20bbc909b57 2
+9cfd306d-307f-14ec-8dfd-d20bbc909b57 2
+9cfd306d-307f-16ec-8d10-d20bbc909b59 2
+9cfd306d-307f-16ec-8d10-d20bbc909b61 2
+9cfd306d-307f-16ec-8d10-d20bbc909b64 2
+9cfd306d-307f-16ec-8d10-d20bbc909b6b 2
+9cfd306d-307f-16ec-8d10-d20bbc909b6c 2
+9cfd306d-307f-16ec-8d10-d20bbc909b74 2
+9cfd306d-307f-16ec-8d10-d20bbc909b75 2
+9cfd306d-307f-16ec-8d10-d20bbc909b7d 2
+9cfd306d-307f-16ec-8d10-d20bbc909b7e 2
+9cfd306d-307f-16ec-8d10-d20bbc909b7f 2
+9cfd306d-307f-16ec-8d10-d20bbc909b90 2
+9cfd306d-307f-16ec-8d10-d20bbc909b91 2
+9cfd306d-307f-16ec-8d10-d20bbc909ba5 2
+9cfd306d-307f-16ec-8d10-d20bbc909bbd 2
+9cfd306d-307f-16ec-8d10-d20bbc909bc1 2
+9cfd306d-307f-16ec-8d10-d20bbc909bd5 2
+9cfd306d-307f-16ec-8d10-d20bbc909be2 2
+9cfd306d-307f-16ec-8d10-d20bbc909be3 2
+9cfd306d-307f-16ec-8d10-d20bbc909bea 2
+9cfd306d-307f-16ec-8d10-d20bbc909bed 2
+9cfd306d-307f-16ec-8d10-d20bbc909bf5 2
+9cfd306d-307f-15ec-8d10-d50bbc909b57 2
+9cfd306d-307f-15ec-8d10-da0bbc909b57 2
+9cfd306d-307f-15ec-8d10-db0bbc909b57 2
+9cfd306d-307f-15ec-8d10-e60bbc909b57 2
+9cfd306d-307f-15ec-8d10-e70bbc909b57 2
+9cfd306d-307f-15ec-8d10-f00bbc909b57 2
+9cfd306d-307f-15ec-8d10-f30bbc909b57 2
+9cfd306d-307f-15ec-8d10-fe0bbc909b57 2
+CALL test_partition_by_key_pstat(7);
+pname pcount
+p0 213
+p1 212
+p2 216
+p3 216
+p4 240
+p5 213
+p6 226
+CALL test_partition_by_key_pstat(4);
+pname pcount
+p0 64
+p1 64
+p2 64
+p3 1344
+CALL test_partition_by_key_pstat(5);
+pname pcount
+p0 343
+p1 305
+p2 288
+p3 307
+p4 293
+CALL test_partition_by_key_pstat(6);
+pname pcount
+p0 47
+p1 469
+p2 38
+p3 451
+p4 43
+p5 488
+CALL test_partition_by_key_pstat(8);
+pname pcount
+p0 32
+p1 32
+p2 32
+p3 32
+p4 32
+p5 32
+p6 32
+p7 1312
+CALL test_partition_by_key_pstat(9);
+pname pcount
+p0 174
+p1 171
+p2 175
+p3 155
+p4 157
+p5 180
+p6 169
+p7 184
+p8 171
+CALL test_partition_by_key_pstat(10);
+pname pcount
+p0 23
+p1 283
+p2 31
+p3 282
+p4 27
+p5 320
+p6 22
+p7 257
+p8 25
+p9 266
+CALL test_partition_by_key_pstat(11);
+pname pcount
+p0 119
+p1 149
+p2 166
+p3 147
+p4 150
+p5 138
+p6 150
+p7 142
+p8 131
+p9 126
+p10 118
+CALL test_partition_by_key_pstat(12);
+pname pcount
+p0 23
+p1 21
+p2 19
+p3 435
+p4 22
+p5 27
+p6 24
+p7 448
+p8 19
+p9 16
+p10 21
+p11 461
+CALL test_partition_by_key_pstat(13);
+pname pcount
+p0 123
+p1 108
+p2 115
+p3 104
+p4 124
+p5 118
+p6 134
+p7 107
+p8 119
+p9 126
+p10 114
+p11 117
+p12 127
+CALL test_partition_by_key_pstat(14);
+pname pcount
+p0 17
+p1 200
+p2 22
+p3 194
+p4 21
+p5 193
+p6 14
+p7 196
+p8 12
+p9 194
+p10 22
+p11 219
+p12 20
+p13 212
+CALL test_partition_by_key_pstat(15);
+pname pcount
+p0 121
+p1 110
+p2 99
+p3 90
+p4 82
+p5 112
+p6 105
+p7 110
+p8 117
+p9 103
+p10 110
+p11 90
+p12 79
+p13 100
+p14 108
+CALL test_partition_by_key_pstat(16);
+pname pcount
+p0 16
+p1 16
+p2 16
+p3 16
+p4 16
+p5 16
+p6 16
+p7 1296
+p8 16
+p9 16
+p10 16
+p11 16
+p12 16
+p13 16
+p14 16
+p15 16
+DROP PROCEDURE test_partition_by_key_uuid_vs_binary;
+DROP PROCEDURE test_partition_by_key_pstat;
+DROP TABLE t0;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_partition.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_partition.test
new file mode 100644
index 00000000000..5bd198c4e8b
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_partition.test
@@ -0,0 +1,104 @@
+--source include/have_partition.inc
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+SET NAMES utf8;
+
+--error ER_WRONG_TYPE_COLUMN_VALUE_ERROR
+CREATE TABLE t1 (a UUID)
+ PARTITION BY LIST COLUMNS(a)
+ (PARTITION p00 VALUES IN (10));
+
+--error ER_WRONG_TYPE_COLUMN_VALUE_ERROR
+CREATE TABLE t1 (a UUID)
+ PARTITION BY LIST COLUMNS(a)
+ (PARTITION p00 VALUES IN (TIME'10:20:30'));
+
+--error ER_TRUNCATED_WRONG_VALUE
+CREATE TABLE t1 (a UUID)
+ PARTITION BY LIST COLUMNS(a)
+ (PARTITION p00 VALUES IN ('€'));
+
+CREATE TABLE t1 (a UUID)
+ PARTITION BY LIST COLUMNS(a)
+ (PARTITION p00 VALUES IN ('123e4567-e89b-12d3-a456-426655440000'),
+ PARTITION pFF VALUES IN (0xffff000000000000000000000000ffff));
+INSERT INTO t1 VALUES ('123e4567-e89b-12d3-a456-426655440000');
+INSERT INTO t1 VALUES ('ffff0000-0000-0000-0000-00000000ffff');
+SELECT * FROM t1 PARTITION (p00);
+SELECT * FROM t1 PARTITION (pFF);
+DROP TABLE t1;
+
+
+CREATE TABLE t0 (a UUID);
+DELIMITER $$;
+FOR i IN 0..255
+DO
+ INSERT INTO t0 VALUES (REPLACE('XXfd306d-307f-11ec-8d10-d20bbc909b57','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t0 VALUES (REPLACE('9cfd306d-XX7f-12ec-8d10-d20bbc909b57','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t0 VALUES (REPLACE('9cfd306d-307f-13XX-8d10-d20bbc909b57','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t0 VALUES (REPLACE('9cfd306d-307f-14ec-8dXX-d20bbc909b57','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t0 VALUES (REPLACE('9cfd306d-307f-15ec-8d10-XX0bbc909b57','XX',LPAD(HEX(i),2,'0')));
+ INSERT INTO t0 VALUES (REPLACE('9cfd306d-307f-16ec-8d10-d20bbc909bXX','XX',LPAD(HEX(i),2,'0')));
+END FOR;
+$$
+--echo # Test that UUID and BINARY(16) implement the same distribution by key
+CREATE PROCEDURE test_partition_by_key_uuid_vs_binary(parts INT)
+BEGIN
+ EXECUTE IMMEDIATE REPLACE('CREATE TABLE t1 (a UUID) PARTITION BY KEY (a) PARTITIONS 7','7',parts);
+ EXECUTE IMMEDIATE REPLACE('CREATE TABLE t2 (a BINARY(16)) PARTITION BY KEY (a) PARTITIONS 7','7',parts);
+ INSERT INTO t1 SELECT * FROM t0;
+ INSERT INTO t2 SELECT * FROM t0;
+ FOR i IN 0..(parts-1)
+ DO
+ BEGIN
+ DECLARE query_template TEXT DEFAULT 'SELECT a_p0, COUNT(*) FROM ('
+ 'SELECT a AS a_p0 FROM t1 PARTITION(p0) '
+ 'UNION ALL '
+ 'SELECT CAST(a AS UUID) AS a_p0 FROM t2 PARTITION(p0)) td '
+ 'GROUP BY a_p0';
+ DECLARE query TEXT DEFAULT REPLACE(query_template,'p0',CONCAT('p',i));
+ SELECT query;
+ EXECUTE IMMEDIATE query;
+ END;
+ END FOR;
+ DROP TABLE t1,t2;
+END;
+$$
+--echo # Display statistics how records are distributed between partitions
+CREATE PROCEDURE test_partition_by_key_pstat(parts INT)
+BEGIN
+ EXECUTE IMMEDIATE REPLACE('CREATE TABLE t1 (a UUID) PARTITION BY KEY (a) PARTITIONS 7','7',parts);
+ CREATE TABLE t1_pstat (pname VARCHAR(32), pcount int);
+ INSERT INTO t1 SELECT * FROM t0;
+ FOR i IN 0..(parts-1)
+ DO
+ BEGIN
+ DECLARE query_template TEXT DEFAULT 'INSERT INTO t1_pstat VALUES (''p0'',(SELECT COUNT(*) FROM t1 PARTITION (p0)))';
+ EXECUTE IMMEDIATE REPLACE(query_template,'p0',CONCAT('p',i));
+ END;
+ END FOR;
+ SELECT * FROM t1_pstat ORDER BY CAST(SUBSTR(pname,2,100) AS UNSIGNED);
+ DROP TABLE t1,t1_pstat;
+END;
+$$
+DELIMITER ;$$
+CALL test_partition_by_key_uuid_vs_binary(7);
+CALL test_partition_by_key_pstat(7);
+CALL test_partition_by_key_pstat(4);
+CALL test_partition_by_key_pstat(5);
+CALL test_partition_by_key_pstat(6);
+CALL test_partition_by_key_pstat(8);
+CALL test_partition_by_key_pstat(9);
+CALL test_partition_by_key_pstat(10);
+CALL test_partition_by_key_pstat(11);
+CALL test_partition_by_key_pstat(12);
+CALL test_partition_by_key_pstat(13);
+CALL test_partition_by_key_pstat(14);
+CALL test_partition_by_key_pstat(15);
+CALL test_partition_by_key_pstat(16);
+DROP PROCEDURE test_partition_by_key_uuid_vs_binary;
+DROP PROCEDURE test_partition_by_key_pstat;
+DROP TABLE t0;
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_plugin.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_plugin.result
new file mode 100644
index 00000000000..a8fc3ca22a6
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_plugin.result
@@ -0,0 +1,31 @@
+#
+# Start of 10.5 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+SELECT
+PLUGIN_NAME,
+PLUGIN_VERSION,
+PLUGIN_STATUS,
+PLUGIN_TYPE,
+PLUGIN_AUTHOR,
+PLUGIN_DESCRIPTION,
+PLUGIN_LICENSE,
+PLUGIN_MATURITY,
+PLUGIN_AUTH_VERSION
+FROM INFORMATION_SCHEMA.PLUGINS
+WHERE PLUGIN_TYPE='DATA TYPE'
+ AND PLUGIN_NAME='uuid';
+PLUGIN_NAME uuid
+PLUGIN_VERSION 1.0
+PLUGIN_STATUS ACTIVE
+PLUGIN_TYPE DATA TYPE
+PLUGIN_AUTHOR MariaDB Corporation
+PLUGIN_DESCRIPTION Data type UUID
+PLUGIN_LICENSE GPL
+PLUGIN_MATURITY Stable
+PLUGIN_AUTH_VERSION 1.0
+#
+# End of 10.5 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_plugin.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_plugin.test
new file mode 100644
index 00000000000..112105a176b
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_plugin.test
@@ -0,0 +1,27 @@
+--echo #
+--echo # Start of 10.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+--vertical_results
+SELECT
+ PLUGIN_NAME,
+ PLUGIN_VERSION,
+ PLUGIN_STATUS,
+ PLUGIN_TYPE,
+ PLUGIN_AUTHOR,
+ PLUGIN_DESCRIPTION,
+ PLUGIN_LICENSE,
+ PLUGIN_MATURITY,
+ PLUGIN_AUTH_VERSION
+FROM INFORMATION_SCHEMA.PLUGINS
+ WHERE PLUGIN_TYPE='DATA TYPE'
+ AND PLUGIN_NAME='uuid';
+--horizontal_results
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_stat_tables.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_stat_tables.result
new file mode 100644
index 00000000000..09784df61ff
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_stat_tables.result
@@ -0,0 +1,24 @@
+#
+# Start of 10.5 tests
+#
+#
+# MDEV-4958 Adding datatype UUID
+#
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+('123e4567-e89b-12d3-a456-426655440000'),
+('123e4567-e89b-12d3-a456-426655440001');
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+INSERT INTO t1 VALUES ('123e4567-e89b-12d3-a456-426655440002');
+SELECT * FROM t1 ORDER BY a;
+a
+123e4567-e89b-12d3-a456-426655440000
+123e4567-e89b-12d3-a456-426655440001
+123e4567-e89b-12d3-a456-426655440002
+DROP TABLE t1;
+#
+# End of 10.5 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_stat_tables.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_stat_tables.test
new file mode 100644
index 00000000000..1a39f813cba
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_stat_tables.test
@@ -0,0 +1,22 @@
+--source include/have_stat_tables.inc
+
+--echo #
+--echo # Start of 10.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-4958 Adding datatype UUID
+--echo #
+
+CREATE TABLE t1 (a UUID);
+INSERT INTO t1 VALUES
+ ('123e4567-e89b-12d3-a456-426655440000'),
+ ('123e4567-e89b-12d3-a456-426655440001');
+ANALYZE TABLE t1 PERSISTENT FOR ALL;
+INSERT INTO t1 VALUES ('123e4567-e89b-12d3-a456-426655440002');
+SELECT * FROM t1 ORDER BY a;
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_sum.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_sum.result
new file mode 100644
index 00000000000..e5d88c3df2a
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_sum.result
@@ -0,0 +1,17 @@
+#
+# Start of 10.7 tests
+#
+#
+# MDEV-27015 Assertion `!is_null()' failed in FixedBinTypeBundle<FbtImpl>::Fbt FixedBinTypeBundle<FbtImpl>::Field_fbt::to_fbt()
+#
+CREATE TABLE t1 (i6 UUID, a1 TIME, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-fffffffffffe','09:43:12','uw'), (uuid(),'00:00:00','a');
+SELECT GROUP_CONCAT(IF(a1, i6, a2) ORDER BY 1) FROM t1;
+GROUP_CONCAT(IF(a1, i6, a2) ORDER BY 1)
+ffffffff-ffff-ffff-ffff-fffffffffffe
+Warnings:
+Warning 1292 Incorrect uuid value: 'a'
+DROP TABLE t1;
+#
+# End of 10.7 tests
+#
diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_sum.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_sum.test
new file mode 100644
index 00000000000..45cdf927210
--- /dev/null
+++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_sum.test
@@ -0,0 +1,17 @@
+--echo #
+--echo # Start of 10.7 tests
+--echo #
+
+--echo #
+--echo # MDEV-27015 Assertion `!is_null()' failed in FixedBinTypeBundle<FbtImpl>::Fbt FixedBinTypeBundle<FbtImpl>::Field_fbt::to_fbt()
+--echo #
+
+CREATE TABLE t1 (i6 UUID, a1 TIME, a2 VARCHAR(10));
+INSERT INTO t1 VALUES ('ffffffff-ffff-ffff-ffff-fffffffffffe','09:43:12','uw'), (uuid(),'00:00:00','a');
+SELECT GROUP_CONCAT(IF(a1, i6, a2) ORDER BY 1) FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # End of 10.7 tests
+--echo #
diff --git a/plugin/type_uuid/plugin.cc b/plugin/type_uuid/plugin.cc
new file mode 100644
index 00000000000..bd320a9a897
--- /dev/null
+++ b/plugin/type_uuid/plugin.cc
@@ -0,0 +1,122 @@
+/* Copyright (c) 2019,2021, MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#define MYSQL_SERVER
+#include "mariadb.h"
+#include "sql_class.h"
+#include "sql_type_uuid.h"
+#include "item_uuidfunc.h"
+#include <mysql/plugin_data_type.h>
+#include <mysql/plugin_function.h>
+
+static struct st_mariadb_data_type plugin_descriptor_type_uuid=
+{
+ MariaDB_DATA_TYPE_INTERFACE_VERSION,
+ UUIDBundle::type_handler_fbt()
+};
+
+/*************************************************************************/
+
+class Create_func_uuid : public Create_func_arg0
+{
+public:
+ Item *create_builder(THD *thd) override
+ {
+ DBUG_ENTER("Create_func_uuid::create");
+ thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
+ thd->lex->safe_to_cache_query= 0;
+ DBUG_RETURN(new (thd->mem_root) Item_func_uuid(thd));
+ }
+ static Create_func_uuid s_singleton;
+
+protected:
+ Create_func_uuid() {}
+ virtual ~Create_func_uuid() {}
+};
+
+
+class Create_func_sys_guid : public Create_func_arg0
+{
+public:
+ Item *create_builder(THD *thd) override
+ {
+ DBUG_ENTER("Create_func_sys_guid::create");
+ thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
+ thd->lex->safe_to_cache_query= 0;
+ DBUG_RETURN(new (thd->mem_root) Item_func_sys_guid(thd));
+ }
+ static Create_func_sys_guid s_singleton;
+
+protected:
+ Create_func_sys_guid() {}
+ virtual ~Create_func_sys_guid() {}
+};
+
+Create_func_uuid Create_func_uuid::s_singleton;
+Create_func_sys_guid Create_func_sys_guid::s_singleton;
+
+static Plugin_function
+ plugin_descriptor_function_uuid(&Create_func_uuid::s_singleton),
+ plugin_descriptor_function_sys_guid(&Create_func_sys_guid::s_singleton);
+
+/*************************************************************************/
+
+maria_declare_plugin(type_uuid)
+{
+ MariaDB_DATA_TYPE_PLUGIN, // the plugin type (see include/mysql/plugin.h)
+ &plugin_descriptor_type_uuid, // pointer to type-specific plugin descriptor
+ "uuid", // plugin name
+ "MariaDB Corporation", // plugin author
+ "Data type UUID", // the plugin description
+ PLUGIN_LICENSE_GPL, // the plugin license (see include/mysql/plugin.h)
+ 0, // Pointer to plugin initialization function
+ 0, // Pointer to plugin deinitialization function
+ 0x0100, // Numeric version 0xAABB means AA.BB version
+ NULL, // Status variables
+ NULL, // System variables
+ "1.0", // String version representation
+ MariaDB_PLUGIN_MATURITY_STABLE// Maturity(see include/mysql/plugin.h)*/
+},
+{
+ MariaDB_FUNCTION_PLUGIN, // the plugin type (see include/mysql/plugin.h)
+ &plugin_descriptor_function_uuid,// pointer to type-specific plugin descriptor
+ "uuid", // plugin name
+ "MariaDB Corporation", // plugin author
+ "Function UUID()", // the plugin description
+ PLUGIN_LICENSE_GPL, // the plugin license (see include/mysql/plugin.h)
+ 0, // Pointer to plugin initialization function
+ 0, // Pointer to plugin deinitialization function
+ 0x0100, // Numeric version 0xAABB means AA.BB version
+ NULL, // Status variables
+ NULL, // System variables
+ "1.0", // String version representation
+ MariaDB_PLUGIN_MATURITY_STABLE// Maturity(see include/mysql/plugin.h)*/
+},
+{
+ MariaDB_FUNCTION_PLUGIN, // the plugin type (see include/mysql/plugin.h)
+ &plugin_descriptor_function_sys_guid,// pointer to type-specific plugin descriptor
+ "sys_guid", // plugin name
+ "MariaDB Corporation", // plugin author
+ "Function SYS_GUID()", // the plugin description
+ PLUGIN_LICENSE_GPL, // the plugin license (see include/mysql/plugin.h)
+ 0, // Pointer to plugin initialization function
+ 0, // Pointer to plugin deinitialization function
+ 0x0100, // Numeric version 0xAABB means AA.BB version
+ NULL, // Status variables
+ NULL, // System variables
+ "1.0", // String version representation
+ MariaDB_PLUGIN_MATURITY_STABLE// Maturity(see include/mysql/plugin.h)*/
+}
+maria_declare_plugin_end;
diff --git a/plugin/type_uuid/sql_type_uuid.cc b/plugin/type_uuid/sql_type_uuid.cc
new file mode 100644
index 00000000000..9b4a731dbb2
--- /dev/null
+++ b/plugin/type_uuid/sql_type_uuid.cc
@@ -0,0 +1,117 @@
+/* Copyright (c) 2019,2021 MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#define MYSQL_SERVER
+#include "mariadb.h"
+#include "my_net.h"
+#include "sql_class.h" // THD, SORT_FIELD_ATTR
+#include "opt_range.h" // SEL_ARG
+#include "sql_type_uuid.h"
+
+
+static bool get_digit(char ch, uint *val)
+{
+ if (ch >= '0' && ch <= '9')
+ {
+ *val= (uint) ch - '0';
+ return false;
+ }
+ if (ch >= 'a' && ch <= 'f')
+ {
+ *val= (uint) ch - 'a' + 0x0a;
+ return false;
+ }
+ if (ch >= 'A' && ch <= 'F')
+ {
+ *val= (uint) ch - 'A' + 0x0a;
+ return false;
+ }
+ return true;
+}
+
+
+static bool get_digit(uint *val, const char *str, const char *end)
+{
+ if (str >= end)
+ return true;
+ return get_digit(*str, val);
+}
+
+
+static size_t skip_hyphens(const char *str, const char *end)
+{
+ const char *str0= str;
+ for ( ; str < end; str++)
+ {
+ if (str[0] != '-')
+ break;
+ }
+ return str - str0;
+}
+
+
+static const char *get_two_digits(char *val, const char *str, const char *end)
+{
+ uint hi, lo;
+ if (get_digit(&hi, str++, end))
+ return NULL;
+ str+= skip_hyphens(str, end);
+ if (get_digit(&lo, str++, end))
+ return NULL;
+ *val= (char) ((hi << 4) + lo);
+ return str;
+}
+
+
+bool UUID::ascii_to_fbt(const char *str, size_t str_length)
+{
+ const char *end= str + str_length;
+ /*
+ The format understood:
+ - Hyphen is not allowed on the first and the last position.
+ - Otherwise, hyphens are allowed on any (odd and even) position,
+ with any amount.
+ */
+ if (str_length < 32)
+ goto err;
+
+ for (uint oidx= 0; oidx < binary_length(); oidx++)
+ {
+ if (!(str= get_two_digits(&m_buffer[oidx], str, end)))
+ goto err;
+ // Allow hypheps after two digits, but not after the last digit
+ if (oidx + 1 < binary_length())
+ str+= skip_hyphens(str, end);
+ }
+ if (str < end)
+ goto err; // Some input left
+ return false;
+err:
+ bzero(m_buffer, sizeof(m_buffer));
+ return true;
+}
+
+size_t UUID::to_string(char *dst, size_t dstsize) const
+{
+ my_uuid2str((const uchar *) m_buffer, dst, 1);
+ return MY_UUID_STRING_LENGTH;
+}
+
+
+const Name &UUID::default_value()
+{
+ static Name def(STRING_WITH_LEN("00000000-0000-0000-0000-000000000000"));
+ return def;
+}
diff --git a/plugin/type_uuid/sql_type_uuid.h b/plugin/type_uuid/sql_type_uuid.h
new file mode 100644
index 00000000000..ee39f542f05
--- /dev/null
+++ b/plugin/type_uuid/sql_type_uuid.h
@@ -0,0 +1,186 @@
+#ifndef SQL_TYPE_UUID_INCLUDED
+#define SQL_TYPE_UUID_INCLUDED
+
+/* Copyright (c) 2019,2021 MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include "sql_type_fixedbin_storage.h"
+class UUID: public FixedBinTypeStorage<MY_UUID_SIZE, MY_UUID_STRING_LENGTH>
+{
+public:
+ using FixedBinTypeStorage::FixedBinTypeStorage;
+ bool ascii_to_fbt(const char *str, size_t str_length);
+ size_t to_string(char *dst, size_t dstsize) const;
+ static const Name &default_value();
+
+ /*
+ Binary (in-memory) UUIDv1 representation:
+
+ llllllll-mmmm-Vhhh-vsss-nnnnnnnnnnnn
+
+ Binary sortable (in-record) representation:
+
+ nnnnnnnnnnnn-vsss-Vhhh-mmmm-llllllll
+
+ Sign Section Bits Bytes Pos PosBinSortable
+ ------------- ------- ---- ----- --- --------------
+ llllllll time low 32 4 0 12
+ mmmm time mid 16 2 4 10
+ Vhhh version and time hi 16 2 6 8
+ vsss variant and clock seq 16 2 8 6
+ nnnnnnnnnnnn node ID 48 6 10 0
+ */
+
+ class Segment
+ {
+ size_t m_memory_pos;
+ size_t m_record_pos;
+ size_t m_length;
+ public:
+ constexpr Segment(size_t memory_pos, size_t record_pos, size_t length)
+ :m_memory_pos(memory_pos), m_record_pos(record_pos), m_length(length)
+ { }
+ void memory_to_record(char *to, const char *from) const
+ {
+ memcpy(to + m_record_pos, from + m_memory_pos, m_length);
+ }
+ void record_to_memory(char *to, const char * from) const
+ {
+ memcpy(to + m_memory_pos, from + m_record_pos, m_length);
+ }
+ int cmp_memory(const char *a, const char *b) const
+ {
+ return memcmp(a + m_memory_pos, b + m_memory_pos, m_length);
+ }
+ void hash_record(const uchar *ptr, Hasher *hasher) const
+ {
+ hasher->add(&my_charset_bin, ptr + m_record_pos, m_length);
+ }
+ };
+
+ static const Segment & segment(uint i)
+ {
+ static Segment segments[]=
+ {
+ {0, 12, 4}, // llllllll
+ {4, 10, 2}, // mmmm
+ {6, 8, 2}, // Vhhh
+ {8, 6, 2}, // vsss
+ {10, 0, 6} // nnnnnnnnnnnn
+ };
+ return segments[i];
+ }
+
+ // Convert the in-memory representation to the in-record representation
+ static void memory_to_record(char *to, const char *from)
+ {
+ segment(0).memory_to_record(to, from);
+ segment(1).memory_to_record(to, from);
+ segment(2).memory_to_record(to, from);
+ segment(3).memory_to_record(to, from);
+ segment(4).memory_to_record(to, from);
+ }
+
+ // Convert the in-record representation to the in-memory representation
+ static void record_to_memory(char *to, const char *from)
+ {
+ segment(0).record_to_memory(to, from);
+ segment(1).record_to_memory(to, from);
+ segment(2).record_to_memory(to, from);
+ segment(3).record_to_memory(to, from);
+ segment(4).record_to_memory(to, from);
+ }
+
+ /*
+ Calculate a hash of the in-record representation.
+ Used in Field_uuid::hash(), e.g. for KEY partitioning. This
+ makes partition distribution for UUID and BINARY(16) equal,
+ so for example:
+
+ CREATE OR REPLACE TABLE t1 (c1 UUID) PARTITION BY KEY(c1) PARTITIONS 5;
+ INSERT INTO t1 (c1) VALUES (UUID());
+
+ and
+
+ CREATE OR REPLACE TABLE t1 (c1 BINARY(16)) PARTITION BY KEY(c1) PARTITIONS 5;
+ INSERT INTO t1 (c1) VALUES (UUID());
+
+ put values into the same partition.
+ */
+ static void hash_record(const uchar *ptr, Hasher *hasher)
+ {
+ segment(0).hash_record(ptr, hasher);
+ segment(1).hash_record(ptr, hasher);
+ segment(2).hash_record(ptr, hasher);
+ segment(3).hash_record(ptr, hasher);
+ segment(4).hash_record(ptr, hasher);
+ }
+
+ // Compare two in-memory values
+ static int cmp(const LEX_CSTRING &a, const LEX_CSTRING &b)
+ {
+ DBUG_ASSERT(a.length == binary_length());
+ DBUG_ASSERT(b.length == binary_length());
+ int res;
+ if ((res= segment(4).cmp_memory(a.str, b.str)) ||
+ (res= segment(3).cmp_memory(a.str, b.str)) ||
+ (res= segment(2).cmp_memory(a.str, b.str)) ||
+ (res= segment(1).cmp_memory(a.str, b.str)) ||
+ (res= segment(0).cmp_memory(a.str, b.str)))
+ return res;
+ return 0;
+ }
+
+ static ulong KEY_pack_flags(uint column_nr)
+ {
+ return HA_PACK_KEY;
+ }
+
+ /*
+ Convert in-record representation to binlog representation.
+ We tranfer UUID values in binlog by compressing in-memory representation.
+ This makes replication between UUID and BINARY(16) simpler:
+
+ Transferring by compressing the in-record representation would require
+ extending the binary log format to put the extact data type name into
+ the column metadata.
+ */
+ static uchar *pack(uchar *to, const uchar *from, uint max_length)
+ {
+ uchar buf[binary_length()];
+ record_to_memory((char *) buf, (const char *) from);
+ return StringPack(&my_charset_bin, binary_length()).
+ pack(to, buf, max_length);
+ }
+
+ // Convert binlog representation to in-record representation
+ static const uchar *unpack(uchar *to,
+ const uchar *from, const uchar *from_end,
+ uint param_data)
+ {
+ uchar buf[binary_length()];
+ const uchar *rc= StringPack(&my_charset_bin, binary_length()).
+ unpack(buf, from, from_end, param_data);
+ memory_to_record((char *) to, (const char *) buf);
+ return rc;
+ }
+
+};
+
+
+#include "sql_type_fixedbin.h"
+typedef FixedBinTypeBundle<UUID> UUIDBundle;
+
+#endif // SQL_TYPE_UUID_INCLUDED
diff --git a/plugin/user_variables/mysql-test/user_variables/basic.result b/plugin/user_variables/mysql-test/user_variables/basic.result
index 3e6f1a3bb7e..07f51ee5607 100644
--- a/plugin/user_variables/mysql-test/user_variables/basic.result
+++ b/plugin/user_variables/mysql-test/user_variables/basic.result
@@ -29,13 +29,13 @@ SET @dec_var=CAST(1 AS DECIMAL(20, 10));
SET @time_var=CAST('2016-02-25' AS DATE);
SET @' @#^%'='Value of variable with odd name';
SET @''='Value of variable with empty name';
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '='Value of variable with empty name'' at line 1
SET @null_var=NULL;
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
COUNT(*)
-10
+9
SELECT * FROM INFORMATION_SCHEMA.USER_VARIABLES ORDER BY VARIABLE_NAME;
VARIABLE_NAME VARIABLE_VALUE VARIABLE_TYPE CHARACTER_SET_NAME
- Value of variable with empty name VARCHAR latin1
@#^% Value of variable with odd name VARCHAR latin1
dec_var 1.0000000000 DECIMAL latin1
double_var 1 DOUBLE latin1
@@ -47,7 +47,6 @@ uint_var 2 INT UNSIGNED latin1
utf8str_var UTF8 string value VARCHAR utf8mb3
SHOW USER_VARIABLES;
Variable_name Value
- Value of variable with empty name
@#^% Value of variable with odd name
dec_var 1.0000000000
double_var 1
diff --git a/plugin/user_variables/mysql-test/user_variables/basic.test b/plugin/user_variables/mysql-test/user_variables/basic.test
index 7e67e4fa5af..7432f6537a9 100644
--- a/plugin/user_variables/mysql-test/user_variables/basic.test
+++ b/plugin/user_variables/mysql-test/user_variables/basic.test
@@ -12,6 +12,7 @@ SET @double_var=CAST(1 AS DOUBLE);
SET @dec_var=CAST(1 AS DECIMAL(20, 10));
SET @time_var=CAST('2016-02-25' AS DATE);
SET @' @#^%'='Value of variable with odd name';
+--error ER_PARSE_ERROR
SET @''='Value of variable with empty name';
SET @null_var=NULL;
diff --git a/plugin/win_auth_client/handshake_client.cc b/plugin/win_auth_client/handshake_client.cc
index 28a228cc210..feeaae88d19 100644
--- a/plugin/win_auth_client/handshake_client.cc
+++ b/plugin/win_auth_client/handshake_client.cc
@@ -252,7 +252,7 @@ Blob Handshake_client::process_data(const Blob &data)
static byte test_buf[2048];
if (m_round == 1
- && DBUG_EVALUATE_IF("winauth_first_packet_test", true, false))
+ && DBUG_IF("winauth_first_packet_test"))
{
const char *env= getenv("TEST_PACKET_LENGTH");
size_t len= env ? atoi(env) : 0;
diff --git a/scripts/fill_help_tables.sql b/scripts/fill_help_tables.sql
index 1077848eb1c..0454f4d2f05 100644
--- a/scripts/fill_help_tables.sql
+++ b/scripts/fill_help_tables.sql
@@ -85,7 +85,7 @@ insert into help_category (help_category_id,name,parent_category_id,url) values
insert into help_category (help_category_id,name,parent_category_id,url) values (50,'Prepared Statements',1,'');
insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (1,9,'HELP_DATE','Help Contents generated from the MariaDB Knowledge Base on 23 January 2023.','','');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (2,9,'HELP_VERSION','Help Contents generated for MariaDB 10.6 from the MariaDB Knowledge Base on 23 January 2023.','','');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (2,9,'HELP_VERSION','Help Contents generated for MariaDB 10.8 from the MariaDB Knowledge Base on 23 January 2023.','','');
insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (3,2,'AREA','A synonym for ST_AREA.\n\nURL: https://mariadb.com/kb/en/polygon-properties-area/','','https://mariadb.com/kb/en/polygon-properties-area/');
insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (4,2,'CENTROID','A synonym for ST_CENTROID.\n\nURL: https://mariadb.com/kb/en/centroid/','','https://mariadb.com/kb/en/centroid/');
insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (5,2,'ExteriorRing','A synonym for ST_ExteriorRing.\n\nURL: https://mariadb.com/kb/en/polygon-properties-exteriorring/','','https://mariadb.com/kb/en/polygon-properties-exteriorring/');
@@ -137,805 +137,811 @@ insert into help_topic (help_topic_id,help_category_id,name,description,example,
insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (51,4,'COS','Syntax\n------\n\nCOS(X)\n\nDescription\n-----------\n\nReturns the cosine of X, where X is given in radians.\n\nExamples\n--------\n\nSELECT COS(PI());\n+-----------+\n| COS(PI()) |\n+-----------+\n| -1 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/cos/','','https://mariadb.com/kb/en/cos/');
insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (52,4,'COT','Syntax\n------\n\nCOT(X)\n\nDescription\n-----------\n\nReturns the cotangent of X.\n\nExamples\n--------\n\nSELECT COT(42);\n+--------------------+\n| COT(42) |\n+--------------------+\n| 0.4364167060752729 |\n+--------------------+\n\nSELECT COT(12);\n+---------------------+\n| COT(12) |\n+---------------------+\n| -1.5726734063976893 |\n+---------------------+\n\nSELECT COT(0);\nERROR 1690 (22003): DOUBLE value is out of range in \'cot(0)\'\n\nURL: https://mariadb.com/kb/en/cot/','','https://mariadb.com/kb/en/cot/');
insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (53,4,'CRC32','Syntax\n------\n\n<= MariaDB 10.7\n\nCRC32(expr)\n\nFrom MariaDB 10.8\n\nCRC32([par,]expr)\n\nDescription\n-----------\n\nComputes a cyclic redundancy check (CRC) value and returns a 32-bit unsigned\nvalue. The result is NULL if the argument is NULL. The argument is expected to\nbe a string and (if possible) is treated as one if it is not.\n\nUses the ISO 3309 polynomial that used by zlib and many others. MariaDB 10.8\nintroduced the CRC32C() function, which uses the alternate Castagnoli\npolynomia.\n\nMariaDB starting with 10.8\n--------------------------\nOften, CRC is computed in pieces. To facilitate this, MariaDB 10.8.0\nintroduced an optional parameter: CRC32(\'MariaDB\')=CRC32(CRC32(\'Maria\'),\'DB\').\n\nExamples\n--------\n\nSELECT CRC32(\'MariaDB\');\n+------------------+\n| CRC32(\'MariaDB\') |\n+------------------+\n| 4227209140 |\n+------------------+\n\nSELECT CRC32(\'mariadb\');\n+------------------+\n| CRC32(\'mariadb\') |\n+------------------+\n| 2594253378 |\n+------------------+\n\nFrom MariaDB 10.8.0\n\nSELECT CRC32(CRC32(\'Maria\'),\'DB\');\n+----------------------------+\n| CRC32(CRC32(\'Maria\'),\'DB\') |\n+----------------------------+\n| 4227209140 |\n+----------------------------+\n\nURL: https://mariadb.com/kb/en/crc32/','','https://mariadb.com/kb/en/crc32/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (54,4,'DEGREES','Syntax\n------\n\nDEGREES(X)\n\nDescription\n-----------\n\nReturns the argument X, converted from radians to degrees.\n\nThis is the converse of the RADIANS() function.\n\nExamples\n--------\n\nSELECT DEGREES(PI());\n+---------------+\n| DEGREES(PI()) |\n+---------------+\n| 180 |\n+---------------+\n\nSELECT DEGREES(PI() / 2);\n+-------------------+\n| DEGREES(PI() / 2) |\n+-------------------+\n| 90 |\n+-------------------+\n\nSELECT DEGREES(45);\n+-----------------+\n| DEGREES(45) |\n+-----------------+\n| 2578.3100780887 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/degrees/','','https://mariadb.com/kb/en/degrees/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (55,4,'EXP','Syntax\n------\n\nEXP(X)\n\nDescription\n-----------\n\nReturns the value of e (the base of natural logarithms) raised to the power of\nX. The inverse of this function is LOG() (using a single argument only) or\nLN().\n\nIf X is NULL, this function returns NULL.\n\nExamples\n--------\n\nSELECT EXP(2);\n+------------------+\n| EXP(2) |\n+------------------+\n| 7.38905609893065 |\n+------------------+\n\nSELECT EXP(-2);\n+--------------------+\n| EXP(-2) |\n+--------------------+\n| 0.1353352832366127 |\n+--------------------+\n\nSELECT EXP(0);\n+--------+\n| EXP(0) |\n+--------+\n| 1 |\n+--------+\n\nSELECT EXP(NULL);\n+-----------+\n| EXP(NULL) |\n+-----------+\n| NULL |\n+-----------+\n\nURL: https://mariadb.com/kb/en/exp/','','https://mariadb.com/kb/en/exp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (56,4,'FLOOR','Syntax\n------\n\nFLOOR(X)\n\nDescription\n-----------\n\nReturns the largest integer value not greater than X.\n\nExamples\n--------\n\nSELECT FLOOR(1.23);\n+-------------+\n| FLOOR(1.23) |\n+-------------+\n| 1 |\n+-------------+\n\nSELECT FLOOR(-1.23);\n+--------------+\n| FLOOR(-1.23) |\n+--------------+\n| -2 |\n+--------------+\n\nURL: https://mariadb.com/kb/en/floor/','','https://mariadb.com/kb/en/floor/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (57,4,'LN','Syntax\n------\n\nLN(X)\n\nDescription\n-----------\n\nReturns the natural logarithm of X; that is, the base-e logarithm of X. If X\nis less than or equal to 0, or NULL, then NULL is returned.\n\nThe inverse of this function is EXP().\n\nExamples\n--------\n\nSELECT LN(2);\n+-------------------+\n| LN(2) |\n+-------------------+\n| 0.693147180559945 |\n+-------------------+\n\nSELECT LN(-2);\n+--------+\n| LN(-2) |\n+--------+\n| NULL |\n+--------+\n\nURL: https://mariadb.com/kb/en/ln/','','https://mariadb.com/kb/en/ln/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (58,4,'LOG','Syntax\n------\n\nLOG(X), LOG(B,X)\n\nDescription\n-----------\n\nIf called with one parameter, this function returns the natural logarithm of\nX. If X is less than or equal to 0, then NULL is returned.\n\nIf called with two parameters, it returns the logarithm of X to the base B. If\nB is <= 1 or X <= 0, the function returns NULL.\n\nIf any argument is NULL, the function returns NULL.\n\nThe inverse of this function (when called with a single argument) is the EXP()\nfunction.\n\nExamples\n--------\n\nLOG(X):\n\nSELECT LOG(2);\n+-------------------+\n| LOG(2) |\n+-------------------+\n| 0.693147180559945 |\n+-------------------+\n\nSELECT LOG(-2);\n+---------+\n| LOG(-2) |\n+---------+\n| NULL |\n+---------+\n\nLOG(B,X)\n\nSELECT LOG(2,16);\n+-----------+\n| LOG(2,16) |\n+-----------+\n| 4 |\n+-----------+\n\nSELECT LOG(3,27);\n+-----------+\n| LOG(3,27) |\n+-----------+\n| 3 |\n+-----------+\n\nSELECT LOG(3,1);\n+----------+\n| LOG(3,1) |\n+----------+\n| 0 |\n+----------+\n\nSELECT LOG(3,0);\n+----------+\n| LOG(3,0) |\n+----------+\n| NULL |\n+----------+\n\nURL: https://mariadb.com/kb/en/log/','','https://mariadb.com/kb/en/log/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (59,4,'LOG10','Syntax\n------\n\nLOG10(X)\n\nDescription\n-----------\n\nReturns the base-10 logarithm of X.\n\nExamples\n--------\n\nSELECT LOG10(2);\n+-------------------+\n| LOG10(2) |\n+-------------------+\n| 0.301029995663981 |\n+-------------------+\n\nSELECT LOG10(100);\n+------------+\n| LOG10(100) |\n+------------+\n| 2 |\n+------------+\n\nSELECT LOG10(-100);\n+-------------+\n| LOG10(-100) |\n+-------------+\n| NULL |\n+-------------+\n\nURL: https://mariadb.com/kb/en/log10/','','https://mariadb.com/kb/en/log10/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (60,4,'LOG2','Syntax\n------\n\nLOG2(X)\n\nDescription\n-----------\n\nReturns the base-2 logarithm of X.\n\nExamples\n--------\n\nSELECT LOG2(4398046511104);\n+---------------------+\n| LOG2(4398046511104) |\n+---------------------+\n| 42 |\n+---------------------+\n\nSELECT LOG2(65536);\n+-------------+\n| LOG2(65536) |\n+-------------+\n| 16 |\n+-------------+\n\nSELECT LOG2(-100);\n+------------+\n| LOG2(-100) |\n+------------+\n| NULL |\n+------------+\n\nURL: https://mariadb.com/kb/en/log2/','','https://mariadb.com/kb/en/log2/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (61,4,'MOD','Syntax\n------\n\nMOD(N,M), N % M, N MOD M\n\nDescription\n-----------\n\nModulo operation. Returns the remainder of N divided by M. See also Modulo\nOperator.\n\nIf the ERROR_ON_DIVISION_BY_ZERO SQL_MODE is used, any number modulus zero\nproduces an error. Otherwise, it returns NULL.\n\nThe integer part of a division can be obtained using DIV.\n\nExamples\n--------\n\nSELECT 1042 % 50;\n+-----------+\n| 1042 % 50 |\n+-----------+\n| 42 |\n+-----------+\n\nSELECT MOD(234, 10);\n+--------------+\n| MOD(234, 10) |\n+--------------+\n| 4 |\n+--------------+\n\nSELECT 253 % 7;\n+---------+\n| 253 % 7 |\n+---------+\n| 1 |\n+---------+\n\nSELECT MOD(29,9);\n+-----------+\n| MOD(29,9) |\n+-----------+\n| 2 |\n+-----------+\n\nSELECT 29 MOD 9;\n+----------+\n| 29 MOD 9 |\n+----------+\n| 2 |\n+----------+\n\nURL: https://mariadb.com/kb/en/mod/','','https://mariadb.com/kb/en/mod/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (62,4,'OCT','Syntax\n------\n\nOCT(N)\n\nDescription\n-----------\n\nReturns a string representation of the octal value of N, where N is a longlong\n(BIGINT) number. This is equivalent to CONV(N,10,8). Returns NULL if N is NULL.\n\nExamples\n--------\n\nSELECT OCT(34);\n+---------+\n| OCT(34) |\n+---------+\n| 42 |\n+---------+\n\nSELECT OCT(12);\n+---------+\n| OCT(12) |\n+---------+\n| 14 |\n+---------+\n\nURL: https://mariadb.com/kb/en/oct/','','https://mariadb.com/kb/en/oct/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (63,4,'PI','Syntax\n------\n\nPI()\n\nDescription\n-----------\n\nReturns the value of π (pi). The default number of decimal places displayed is\nsix, but MariaDB uses the full double-precision value internally.\n\nExamples\n--------\n\nSELECT PI();\n+----------+\n| PI() |\n+----------+\n| 3.141593 |\n+----------+\n\nSELECT PI()+0.0000000000000000000000;\n+-------------------------------+\n| PI()+0.0000000000000000000000 |\n+-------------------------------+\n| 3.1415926535897931159980 |\n+-------------------------------+\n\nURL: https://mariadb.com/kb/en/pi/','','https://mariadb.com/kb/en/pi/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (64,4,'POW','Syntax\n------\n\nPOW(X,Y)\n\nDescription\n-----------\n\nReturns the value of X raised to the power of Y.\n\nPOWER() is a synonym.\n\nExamples\n--------\n\nSELECT POW(2,3);\n+----------+\n| POW(2,3) |\n+----------+\n| 8 |\n+----------+\n\nSELECT POW(2,-2);\n+-----------+\n| POW(2,-2) |\n+-----------+\n| 0.25 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/pow/','','https://mariadb.com/kb/en/pow/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (65,4,'POWER','Syntax\n------\n\nPOWER(X,Y)\n\nDescription\n-----------\n\nThis is a synonym for POW(), which returns the value of X raised to the power\nof Y.\n\nURL: https://mariadb.com/kb/en/power/','','https://mariadb.com/kb/en/power/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (66,4,'RADIANS','Syntax\n------\n\nRADIANS(X)\n\nDescription\n-----------\n\nReturns the argument X, converted from degrees to radians. Note that π radians\nequals 180 degrees.\n\nThis is the converse of the DEGREES() function.\n\nExamples\n--------\n\nSELECT RADIANS(45);\n+-------------------+\n| RADIANS(45) |\n+-------------------+\n| 0.785398163397448 |\n+-------------------+\n\nSELECT RADIANS(90);\n+-----------------+\n| RADIANS(90) |\n+-----------------+\n| 1.5707963267949 |\n+-----------------+\n\nSELECT RADIANS(PI());\n+--------------------+\n| RADIANS(PI()) |\n+--------------------+\n| 0.0548311355616075 |\n+--------------------+\n\nSELECT RADIANS(180);\n+------------------+\n| RADIANS(180) |\n+------------------+\n| 3.14159265358979 |\n+------------------+\n\nURL: https://mariadb.com/kb/en/radians/','','https://mariadb.com/kb/en/radians/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (67,4,'RAND','Syntax\n------\n\nRAND(), RAND(N)\n\nDescription\n-----------\n\nReturns a random DOUBLE precision floating point value v in the range 0 <= v <\n1.0. If a constant integer argument N is specified, it is used as the seed\nvalue, which produces a repeatable sequence of column values. In the example\nbelow, note that the sequences of values produced by RAND(3) is the same both\nplaces where it occurs.\n\nIn a WHERE clause, RAND() is evaluated each time the WHERE is executed.\n\nStatements using the RAND() function are not safe for statement-based\nreplication.\n\nPractical uses\n--------------\n\nThe expression to get a random integer from a given range is the following:\n\nFLOOR(min_value + RAND() * (max_value - min_value +1))\n\nRAND() is often used to read random rows from a table, as follows:\n\nSELECT * FROM my_table ORDER BY RAND() LIMIT 10;\n\nNote, however, that this technique should never be used on a large table as it\nwill be extremely slow. MariaDB will read all rows in the table, generate a\nrandom value for each of them, order them, and finally will apply the LIMIT\nclause.\n\nExamples\n--------\n\nCREATE TABLE t (i INT);\n\nINSERT INTO t VALUES(1),(2),(3);\n\nSELECT i, RAND() FROM t;\n+------+-------------------+\n| i | RAND() |\n+------+-------------------+\n| 1 | 0.255651095188829 |\n| 2 | 0.833920199269355 |\n| 3 | 0.40264774151393 |\n+------+-------------------+\n\nSELECT i, RAND(3) FROM t;\n+------+-------------------+\n| i | RAND(3) |\n+------+-------------------+\n| 1 | 0.90576975597606 |\n| 2 | 0.373079058130345 |\n| 3 | 0.148086053457191 |\n+------+-------------------+\n\nSELECT i, RAND() FROM t;\n+------+-------------------+\n| i | RAND() |\n+------+-------------------+\n| 1 | 0.511478140495232 |\n| 2 | 0.349447508668012 |\n| 3 | 0.212803152588013 |\n+------+-------------------+\n\nUsing the same seed, the same sequence will be returned:\n\nSELECT i, RAND(3) FROM t;\n+------+-------------------+\n| i | RAND(3) |\n+------+-------------------+\n| 1 | 0.90576975597606 |\n| 2 | 0.373079058130345 |\n| 3 | 0.148086053457191 |\n+------+-------------------+\n\nGenerating a random number from 5 to 15:\n\nSELECT FLOOR(5 + (RAND() * 11));\n\nURL: https://mariadb.com/kb/en/rand/','','https://mariadb.com/kb/en/rand/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (68,4,'ROUND','Syntax\n------\n\nROUND(X), ROUND(X,D)\n\nDescription\n-----------\n\nRounds the argument X to D decimal places. D defaults to 0 if not specified. D\ncan be negative to cause D digits left of the decimal point of the value X to\nbecome zero.\n\nThe rounding algorithm depends on the data type of X:\n\n* for floating point types (FLOAT, DOUBLE) the C libraries rounding function\nis used, so the behavior *may* differ between operating systems\n* for fixed point types (DECIMAL, DEC/NUMBER/FIXED) the \"round half up\" rule\nis used, meaning that e.g. a value ending in exactly .5 is always rounded up.\n\nExamples\n--------\n\nSELECT ROUND(-1.23);\n+--------------+\n| ROUND(-1.23) |\n+--------------+\n| -1 |\n+--------------+\n\nSELECT ROUND(-1.58);\n+--------------+\n| ROUND(-1.58) |\n+--------------+\n| -2 |\n+--------------+\n\nSELECT ROUND(1.58); \n+-------------+\n| ROUND(1.58) |\n+-------------+\n| 2 |\n+-------------+\n\nSELECT ROUND(1.298, 1);\n+-----------------+\n| ROUND(1.298, 1) |\n+-----------------+\n| 1.3 |\n+-----------------+\n\nSELECT ROUND(1.298, 0);\n+-----------------+\n| ROUND(1.298, 0) |\n+-----------------+\n| 1 |\n+-----------------+\n\nSELECT ROUND(23.298, -1);\n+-------------------+\n| ROUND(23.298, -1) |\n+-------------------+\n| 20 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/round/','','https://mariadb.com/kb/en/round/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (69,4,'SIGN','Syntax\n------\n\nSIGN(X)\n\nDescription\n-----------\n\nReturns the sign of the argument as -1, 0, or 1, depending on whether X is\nnegative, zero, or positive.\n\nExamples\n--------\n\nSELECT SIGN(-32);\n+-----------+\n| SIGN(-32) |\n+-----------+\n| -1 |\n+-----------+\n\nSELECT SIGN(0);\n+---------+\n| SIGN(0) |\n+---------+\n| 0 |\n+---------+\n\nSELECT SIGN(234);\n+-----------+\n| SIGN(234) |\n+-----------+\n| 1 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/sign/','','https://mariadb.com/kb/en/sign/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (70,4,'SIN','Syntax\n------\n\nSIN(X)\n\nDescription\n-----------\n\nReturns the sine of X, where X is given in radians.\n\nExamples\n--------\n\nSELECT SIN(1.5707963267948966);\n+-------------------------+\n| SIN(1.5707963267948966) |\n+-------------------------+\n| 1 |\n+-------------------------+\n\nSELECT SIN(PI());\n+----------------------+\n| SIN(PI()) |\n+----------------------+\n| 1.22460635382238e-16 |\n+----------------------+\n\nSELECT ROUND(SIN(PI()));\n+------------------+\n| ROUND(SIN(PI())) |\n+------------------+\n| 0 |\n+------------------+\n\nURL: https://mariadb.com/kb/en/sin/','','https://mariadb.com/kb/en/sin/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (71,4,'SQRT','Syntax\n------\n\nSQRT(X)\n\nDescription\n-----------\n\nReturns the square root of X. If X is negative, NULL is returned.\n\nExamples\n--------\n\nSELECT SQRT(4);\n+---------+\n| SQRT(4) |\n+---------+\n| 2 |\n+---------+\n\nSELECT SQRT(20);\n+------------------+\n| SQRT(20) |\n+------------------+\n| 4.47213595499958 |\n+------------------+\n\nSELECT SQRT(-16);\n+-----------+\n| SQRT(-16) |\n+-----------+\n| NULL |\n+-----------+\n\nSELECT SQRT(1764);\n+------------+\n| SQRT(1764) |\n+------------+\n| 42 |\n+------------+\n\nURL: https://mariadb.com/kb/en/sqrt/','','https://mariadb.com/kb/en/sqrt/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (72,4,'TAN','Syntax\n------\n\nTAN(X)\n\nDescription\n-----------\n\nReturns the tangent of X, where X is given in radians.\n\nExamples\n--------\n\nSELECT TAN(0.7853981633974483);\n+-------------------------+\n| TAN(0.7853981633974483) |\n+-------------------------+\n| 0.9999999999999999 |\n+-------------------------+\n\nSELECT TAN(PI());\n+-----------------------+\n| TAN(PI()) |\n+-----------------------+\n| -1.22460635382238e-16 |\n+-----------------------+\n\nSELECT TAN(PI()+1);\n+-----------------+\n| TAN(PI()+1) |\n+-----------------+\n| 1.5574077246549 |\n+-----------------+\n\nSELECT TAN(RADIANS(PI()));\n+--------------------+\n| TAN(RADIANS(PI())) |\n+--------------------+\n| 0.0548861508080033 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/tan/','','https://mariadb.com/kb/en/tan/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (73,4,'TRUNCATE','This page documents the TRUNCATE function. See TRUNCATE TABLE for the DDL\nstatement.\n\nSyntax\n------\n\nTRUNCATE(X,D)\n\nDescription\n-----------\n\nReturns the number X, truncated to D decimal places. If D is 0, the result has\nno decimal point or fractional part. D can be negative to cause D digits left\nof the decimal point of the value X to become zero.\n\nExamples\n--------\n\nSELECT TRUNCATE(1.223,1);\n+-------------------+\n| TRUNCATE(1.223,1) |\n+-------------------+\n| 1.2 |\n+-------------------+\n\nSELECT TRUNCATE(1.999,1);\n+-------------------+\n| TRUNCATE(1.999,1) |\n+-------------------+\n| 1.9 |\n+-------------------+\n\nSELECT TRUNCATE(1.999,0); \n+-------------------+\n| TRUNCATE(1.999,0) |\n+-------------------+\n| 1 |\n+-------------------+\n\nSELECT TRUNCATE(-1.999,1);\n+--------------------+\n| TRUNCATE(-1.999,1) |\n+--------------------+\n| -1.9 |\n+--------------------+\n\nSELECT TRUNCATE(122,-2);\n+------------------+\n| TRUNCATE(122,-2) |\n+------------------+\n| 100 |\n+------------------+\n\nSELECT TRUNCATE(10.28*100,0);\n+-----------------------+\n| TRUNCATE(10.28*100,0) |\n+-----------------------+\n| 1028 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/truncate/','','https://mariadb.com/kb/en/truncate/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (74,5,'INSTALL PLUGIN','Syntax\n------\n\nINSTALL PLUGIN [IF NOT EXISTS] plugin_name SONAME \'plugin_library\'\n\nDescription\n-----------\n\nThis statement installs an individual plugin from the specified library. To\ninstall the whole library (which could be required), use INSTALL SONAME. See\nalso Installing a Plugin.\n\nplugin_name is the name of the plugin as defined in the plugin declaration\nstructure contained in the library file. Plugin names are not case sensitive.\nFor maximal compatibility, plugin names should be limited to ASCII letters,\ndigits, and underscore, because they are used in C source files, shell command\nlines, M4 and Bourne shell scripts, and SQL environments.\n\nplugin_library is the name of the shared library that contains the plugin\ncode. The file name extension can be omitted (which makes the statement look\nthe same on all architectures).\n\nThe shared library must be located in the plugin directory (that is, the\ndirectory named by the plugin_dir system variable). The library must be in the\nplugin directory itself, not in a subdirectory. By default, plugin_dir is\nplugin directory under the directory named by the pkglibdir configuration\nvariable, but it can be changed by setting the value of plugin_dir at server\nstartup. For example, set its value in a my.cnf file:\n\n[mysqld]\nplugin_dir=/path/to/plugin/directory\nIf the value of plugin_dir is a relative path name, it is taken to be relative\nto the MySQL base directory (the value of the basedir system variable).\n\nINSTALL PLUGIN adds a line to the mysql.plugin table that describes the\nplugin. This table contains the plugin name and library file name.\n\nINSTALL PLUGIN causes the server to read option (my.cnf) files just as during\nserver startup. This enables the plugin to pick up any relevant options from\nthose files. It is possible to add plugin options to an option file even\nbefore loading a plugin (if the loose prefix is used). It is also possible to\nuninstall a plugin, edit my.cnf, and install the plugin again. Restarting the\nplugin this way enables it to the new option values without a server restart.\n\nINSTALL PLUGIN also loads and initializes the plugin code to make the plugin\navailable for use. A plugin is initialized by executing its initialization\nfunction, which handles any setup that the plugin must perform before it can\nbe used.\n\nTo use INSTALL PLUGIN, you must have the INSERT privilege for the mysql.plugin\ntable.\n\nAt server startup, the server loads and initializes any plugin that is listed\nin the mysql.plugin table. This means that a plugin is installed with INSTALL\nPLUGIN only once, not every time the server starts. Plugin loading at startup\ndoes not occur if the server is started with the --skip-grant-tables option.\n\nWhen the server shuts down, it executes the de-initialization function for\neach plugin that is loaded so that the plugin has a chance to perform any\nfinal cleanup.\n\nIf you need to load plugins for a single server startup when the\n--skip-grant-tables option is given (which tells the server not to read system\ntables), use the --plugin-load mysqld option.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nIF NOT EXISTS\n-------------\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a note instead of\nan error if the specified plugin already exists. See SHOW WARNINGS.\n\nExamples\n--------\n\nINSTALL PLUGIN sphinx SONAME \'ha_sphinx.so\';\n\nThe extension can also be omitted:\n\nINSTALL PLUGIN innodb SONAME \'ha_xtradb\';\n\nFrom MariaDB 10.4.0:\n\nINSTALL PLUGIN IF NOT EXISTS example SONAME \'ha_example\';\nQuery OK, 0 rows affected (0.104 sec)\n\nINSTALL PLUGIN IF NOT EXISTS example SONAME \'ha_example\';\nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------+\n| Note | 1968 | Plugin \'example\' already installed |\n+-------+------+------------------------------------+\n\nURL: https://mariadb.com/kb/en/install-plugin/','','https://mariadb.com/kb/en/install-plugin/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (75,5,'UNINSTALL PLUGIN','Syntax\n------\n\nUNINSTALL PLUGIN [IF EXISTS] plugin_name\n\nDescription\n-----------\n\nThis statement removes a single installed plugin. To uninstall the whole\nlibrary which contains the plugin, use UNINSTALL SONAME. You cannot uninstall\na plugin if any table that uses it is open.\n\nplugin_name must be the name of some plugin that is listed in the mysql.plugin\ntable. The server executes the plugin\'s deinitialization function and removes\nthe row for the plugin from the mysql.plugin table, so that subsequent server\nrestarts will not load and initialize the plugin. UNINSTALL PLUGIN does not\nremove the plugin\'s shared library file.\n\nTo use UNINSTALL PLUGIN, you must have the DELETE privilege for the\nmysql.plugin table.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will return a note instead of an\nerror if the plugin does not exist. See SHOW WARNINGS.\n\nExamples\n--------\n\nUNINSTALL PLUGIN example;\n\nFrom MariaDB 10.4.0:\n\nUNINSTALL PLUGIN IF EXISTS example;\nQuery OK, 0 rows affected (0.099 sec)\n\nUNINSTALL PLUGIN IF EXISTS example;\nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------------+\n| Note | 1305 | PLUGIN example does not exist |\n+-------+------+-------------------------------+\n\nURL: https://mariadb.com/kb/en/uninstall-plugin/','','https://mariadb.com/kb/en/uninstall-plugin/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (76,5,'INSTALL SONAME','Syntax\n------\n\nINSTALL SONAME \'plugin_library\'\n\nDescription\n-----------\n\nThis statement is a variant of INSTALL PLUGIN. It installs all plugins from a\ngiven plugin_library. See INSTALL PLUGIN for details.\n\nplugin_library is the name of the shared library that contains the plugin\ncode. The file name extension (for example, libmyplugin.so or libmyplugin.dll)\ncan be omitted (which makes the statement look the same on all architectures).\n\nThe shared library must be located in the plugin directory (that is, the\ndirectory named by the plugin_dir system variable). The library must be in the\nplugin directory itself, not in a subdirectory. By default, plugin_dir is\nplugin directory under the directory named by the pkglibdir configuration\nvariable, but it can be changed by setting the value of plugin_dir at server\nstartup. For example, set its value in a my.cnf file:\n\n[mysqld]\nplugin_dir=/path/to/plugin/directory\nIf the value of plugin_dir is a relative path name, it is taken to be relative\nto the MySQL base directory (the value of the basedir system variable).\n\nINSTALL SONAME adds one or more lines to the mysql.plugin table that describes\nthe plugin. This table contains the plugin name and library file name.\n\nINSTALL SONAME causes the server to read option (my.cnf) files just as during\nserver startup. This enables the plugin to pick up any relevant options from\nthose files. It is possible to add plugin options to an option file even\nbefore loading a plugin (if the loose prefix is used). It is also possible to\nuninstall a plugin, edit my.cnf, and install the plugin again. Restarting the\nplugin this way enables it to the new option values without a server restart.\n\nINSTALL SONAME also loads and initializes the plugin code to make the plugin\navailable for use. A plugin is initialized by executing its initialization\nfunction, which handles any setup that the plugin must perform before it can\nbe used.\n\nTo use INSTALL SONAME, you must have the INSERT privilege for the mysql.plugin\ntable.\n\nAt server startup, the server loads and initializes any plugin that is listed\nin the mysql.plugin table. This means that a plugin is installed with INSTALL\nSONAME only once, not every time the server starts. Plugin loading at startup\ndoes not occur if the server is started with the --skip-grant-tables option.\n\nWhen the server shuts down, it executes the de-initialization function for\neach plugin that is loaded so that the plugin has a chance to perform any\nfinal cleanup.\n\nIf you need to load plugins for a single server startup when the\n--skip-grant-tables option is given (which tells the server not to read system\ntables), use the --plugin-load mysqld option.\n\nIf you need to install only one plugin from a library, use the INSTALL PLUGIN\nstatement.\n\nExamples\n--------\n\nTo load the XtraDB storage engine and all of its information_schema tables\nwith one statement, use\n\nINSTALL SONAME \'ha_xtradb\';\n\nThis statement can be used instead of INSTALL PLUGIN even when the library\ncontains only one plugin:\n\nINSTALL SONAME \'ha_sequence\';\n\nURL: https://mariadb.com/kb/en/install-soname/','','https://mariadb.com/kb/en/install-soname/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (77,5,'UNINSTALL SONAME','Syntax\n------\n\nUNINSTALL SONAME [IF EXISTS] \'plugin_library\'\n\nDescription\n-----------\n\nThis statement is a variant of UNINSTALL PLUGIN statement, that removes all\nplugins belonging to a specified plugin_library. See UNINSTALL PLUGIN for\ndetails.\n\nplugin_library is the name of the shared library that contains the plugin\ncode. The file name extension (for example, libmyplugin.so or libmyplugin.dll)\ncan be omitted (which makes the statement look the same on all architectures).\n\nTo use UNINSTALL SONAME, you must have the DELETE privilege for the\nmysql.plugin table.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will return a note instead of an\nerror if the plugin library does not exist. See SHOW WARNINGS.\n\nExamples\n--------\n\nTo uninstall the XtraDB plugin and all of its information_schema tables with\none statement, use\n\nUNINSTALL SONAME \'ha_xtradb\';\n\nFrom MariaDB 10.4.0:\n\nUNINSTALL SONAME IF EXISTS \'ha_example\';\nQuery OK, 0 rows affected (0.099 sec)\n\nUNINSTALL SONAME IF EXISTS \'ha_example\';\nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------------------+\n| Note | 1305 | SONAME ha_example.so does not exist |\n+-------+------+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/uninstall-soname/','','https://mariadb.com/kb/en/uninstall-soname/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (78,5,'Plugin Overview','Plugins are server components that enhance MariaDB in some way. These can be\nanything from new storage engines, plugins for enhancing full-text parsing, or\neven small enhancements, such as a plugin to get a timestamp as an integer.\n\nQuerying Plugin Information\n---------------------------\n\nThere are a number of ways to see which plugins are currently active.\n\nA server almost always has a large number of active plugins, because the\nserver contains a large number of built-in plugins, which are active by\ndefault and cannot be uninstalled.\n\nQuerying Plugin Information with SHOW PLUGINS\n---------------------------------------------\n\nThe SHOW PLUGINS statement can be used to query information about all active\nplugins.\n\nFor example:\n\nSHOW PLUGINS\\G;\n********************** 1. row **********************\n Name: binlog\n Status: ACTIVE\n Type: STORAGE ENGINE\nLibrary: NULL\nLicense: GPL\n********************** 2. row **********************\n Name: mysql_native_password\n Status: ACTIVE\n Type: AUTHENTICATION\nLibrary: NULL\nLicense: GPL\n********************** 3. row **********************\n Name: mysql_old_password\n Status: ACTIVE\n Type: AUTHENTICATION\nLibrary: NULL\nLicense: GPL\n...\n\nIf a plugin\'s Library column has a NULL value, then the plugin is built-in,\nand it cannot be uninstalled.\n\nQuerying Plugin Information with information_schema.PLUGINS\n-----------------------------------------------------------\n\nThe information_schema.PLUGINS table can be queried to get more detailed\ninformation about plugins.\n\nFor example:\n\nSELECT * FROM information_schema.PLUGINS\\G\n...\n*************************** 6. row ***************************\n PLUGIN_NAME: CSV\n PLUGIN_VERSION: 1.0\n PLUGIN_STATUS: ACTIVE\n PLUGIN_TYPE: STORAGE ENGINE\n PLUGIN_TYPE_VERSION: 100003.0\n PLUGIN_LIBRARY: NULL\nPLUGIN_LIBRARY_VERSION: NULL\n PLUGIN_AUTHOR: Brian Aker, MySQL AB\n PLUGIN_DESCRIPTION: CSV storage engine\n PLUGIN_LICENSE: GPL\n LOAD_OPTION: FORCE\n PLUGIN_MATURITY: Stable\n PLUGIN_AUTH_VERSION: 1.0\n*************************** 7. row ***************************\n PLUGIN_NAME: MEMORY\n PLUGIN_VERSION: 1.0\n PLUGIN_STATUS: ACTIVE\n PLUGIN_TYPE: STORAGE ENGINE\n PLUGIN_TYPE_VERSION: 100003.0\n PLUGIN_LIBRARY: NULL\nPLUGIN_LIBRARY_VERSION: NULL\n PLUGIN_AUTHOR: MySQL AB\n PLUGIN_DESCRIPTION: Hash based, stored in memory, useful for temporary\ntables\n PLUGIN_LICENSE: GPL\n LOAD_OPTION: FORCE\n PLUGIN_MATURITY: Stable\n PLUGIN_AUTH_VERSION: 1.0\n...\n\nIf a plugin\'s PLUGIN_LIBRARY column has the NULL value, then the plugin is\nbuilt-in, and it cannot be uninstalled.\n\nQuerying Plugin Information with mysql.plugin\n---------------------------------------------\n\nThe mysql.plugin table can be queried to get information about installed\nplugins.\n\nThis table only contains information about plugins that have been installed\nvia the following methods:\n\n* The INSTALL SONAME statement.\n* The INSTALL PLUGIN statement.\n* The mysql_plugin utility.\n\nThis table does not contain information about:\n\n* Built-in plugins.\n* Plugins loaded with the --plugin-load-add option.\n* Plugins loaded with the --plugin-load option.\n\nThis table only contains enough information to reload the plugin when the\nserver is restarted, which means it only contains the plugin name and the\nplugin library.\n\nFor example:\n\nSELECT * FROM mysql.plugin;\n\n+------+------------+\n| name | dl |\n+------+------------+\n| PBXT | libpbxt.so |\n+------+------------+\n\nInstalling a Plugin\n-------------------\n\nThere are three primary ways to install a plugin:\n\n* A plugin can be installed dynamically with an SQL statement.\n* A plugin can be installed with a mysqld option, but it requires a server\nrestart.\n* A plugin can be installed with the mysql_plugin utility, while the server is\ncompletely offline.\n\nWhen you are installing a plugin, you also have to ensure that:\n\n* The server\'s plugin directory is properly configured, and the plugin\'s\nlibrary is in the plugin directory.\n* The server\'s minimum plugin maturity is properly configured, and the plugin\nis mature enough to be installed.\n\nInstalling a Plugin Dynamically\n-------------------------------\n\nA plugin can be installed dynamically by executing either the INSTALL SONAME\nor the INSTALL PLUGIN statement.\n\nIf a plugin is installed with one of these statements, then a record will be\nadded to the mysql.plugins table for the plugin. This means that the plugin\nwill automatically be loaded every time the server restarts, unless\nspecifically uninstalled or deactivated.\n\nInstalling a Plugin with INSTALL SONAME\n---------------------------------------\n\nYou can install a plugin dynamically by executing the INSTALL SONAME\nstatement. INSTALL SONAME installs all plugins from the given plugin library.\nThis could be required for some plugin libraries.\n\nFor example, to install all plugins in the server_audit plugin library (which\nis currently only the server_audit audit plugin), you could execute the\nfollowing:\n\nINSTALL SONAME \'server_audit\';\n\nInstalling a Plugin with INSTALL PLUGIN\n---------------------------------------\n\nYou can install a plugin dynamically by executing the INSTALL PLUGIN\nstatement. INSTALL PLUGIN installs a single plugin from the given plugin\nlibrary.\n\nFor example, to install the server_audit audit plugin from the server_audit\nplugin library, you could execute the following:\n\nINSTALL PLUGIN server_audit SONAME \'server_audit\';\n\nInstalling a Plugin with Plugin Load Options\n--------------------------------------------\n\nA plugin can be installed with a mysqld option by providing either the\n--plugin-load-add or the --plugin-load option.\n\nIf a plugin is installed with one of these options, then a record will not be\nadded to the mysql.plugins table for the plugin. This means that if the server\nis restarted without the same option set, then the plugin will not\nautomatically be loaded.\n\nInstalling a Plugin with --plugin-load-add\n------------------------------------------\n\nYou can install a plugin with the --plugin-load-add option by specifying the\noption as a command-line argument to mysqld or by specifying the option in a\nrelevant server option group in an option file.\n\nThe --plugin-load-add option uses the following format:\n\n* Plugins can be specified in the format name=library, where name is the\nplugin name and library is the plugin library. This format installs a single\nplugin from the given plugin library.\n* Plugins can also be specified in the format library, where library is the\nplugin library. This format installs all plugins from the given plugin library.\n* Multiple plugins can be specified by separating them with semicolons.\n\nFor example, to install all plugins in the server_audit plugin library (which\nis currently only the server_audit audit plugin) and also the ed25519\nauthentication plugin from the auth_ed25519 plugin library, you could set the\noption to the following values on the command-line:\n\n$ mysqld --user=mysql --plugin-load-add=\'server_audit\'\n--plugin-load-add=\'ed25519=auth_ed25519\'\n\nYou could also set the option to the same values in an option file:\n\n[mariadb]\n...\nplugin_load_add = server_audit\nplugin_load_add = ed25519=auth_ed25519\n\nSpecial care must be taken when specifying both the --plugin-load option and\nthe --plugin-load-add option together. The --plugin-load option resets the\nplugin load list, and this can cause unexpected problems if you are not aware.\nThe --plugin-load-add option does not reset the plugin load list, so it is\nmuch safer to use. See Specifying Multiple Plugin Load Options for more\ninformation.\n\nInstalling a Plugin with --plugin-load\n--------------------------------------\n\nYou can install a plugin with the --plugin-load option by specifying the\noption as a command-line argument to mysqld or by specifying the option in a\nrelevant server option group in an option file.\n\nThe --plugin-load option uses the following format:\n\n* Plugins can be specified in the format name=library, where name is the\nplugin name and library is the plugin library. This format installs a single\nplugin from the given plugin library.\n* Plugins can also be specified in the format library, where library is the\nplugin library. This format installs all plugins from the given plugin library.\n* Multiple plugins can be specified by separating them with semicolons.\n\nFor example, to install all plugins in the server_audit plugin library (which\nis currently only the server_audit audit plugin) and also the ed25519\nauthentication plugin from the auth_ed25519 plugin library, you could set the\noption to the following values on the command-line:\n\n$ mysqld --user=mysql --plugin-load=\'server_audit;ed25519=auth_ed25519\'\n\nYou could also set the option to the same values in an option file:\n\n[mariadb]\n...\nplugin_load = server_audit;ed25519=auth_ed25519\n\nSpecial care must be taken when specifying the --plugin-load option multiple\ntimes, or when specifying both the --plugin-load option and the\n--plugin-load-add option together. The --plugin-load option resets the plugin\nload list, and this can cause unexpected problems if you are not aware. The\n--plugin-load-add option does not reset the plugin load list, so it is much\nsafer to use. See Specifying Multiple Plugin Load Options for more information.\n\nSpecifying Multiple Plugin Load Options\n---------------------------------------\n\nSpecial care must be taken when specifying the --plugin-load option multiple\ntimes, or when specifying both the --plugin-load option and the\n--plugin-load-add option. The --plugin-load option resets the plugin load\nlist, and this can cause unexpected problems if you are not aware. The\n--plugin-load-add option does not reset the plugin load list, so it is much\nsafer to use.\n\nThis can have the following consequences:\n\n* If the --plugin-load option is specified multiple times, then only the last\ninstance will have any effect. For example, in the following case, the first\ninstance of the option is reset:\n\n[mariadb]\n...\nplugin_load = server_audit\nplugin_load = ed25519=auth_ed25519\n\n* If the --plugin-load option is specified after the --plugin-load-add option,\nthen it will also reset the changes made by that option. For example, in the\nfollowing case, the --plugin-load-add option does not do anything, because the\nsubsequent --plugin-load option resets the plugin load list:\n\n[mariadb]\n...\nplugin_load_add = server_audit\nplugin_load = ed25519=auth_ed25519\n\n* In contrast, if the --plugin-load option is specified before the\n--plugin-load-add option, then it will work fine, because the\n--plugin-load-add option does not reset the plugin load list. For example, in\nthe following case, both plugins are properly loaded:\n\n[mariadb]\n...\nplugin_load = server_audit\nplugin_load_add = ed25519=auth_ed25519\n\nInstalling a Plugin with mysql_plugin\n-------------------------------------\n\nA plugin can be installed with the mysql_plugin utility if the server is\ncompletely offline.\n\nThe syntax is:\n\nmysql_plugin [options] <plugin> ENABLE|DISABLE\n\nFor example, to install the server_audit audit plugin, you could execute the\nfollowing:\n\nmysql_plugin server_audit ENABLE\n\nIf a plugin is installed with this utility, then a record will be added to the\nmysql.plugins table for the plugin. This means that the plugin will\nautomatically be loaded every time the server restarts, unless specifically\nuninstalled or deactivated.\n\nConfiguring the Plugin Directory\n--------------------------------\n\nWhen a plugin is being installed, the server looks for the plugin\'s library in\nthe server\'s plugin directory. This directory is configured by the plugin_dir\nsystem variable. This can be specified as a command-line argument to mysqld or\nit can be specified in a relevant server option group in an option file. For\nexample:\n\n[mariadb]\n...\nplugin_dir = /usr/lib64/mysql/plugin\n\nConfiguring the Minimum Plugin Maturity\n---------------------------------------\n\nWhen a plugin is being installed, the server compares the plugin\'s maturity\nlevel against the server\'s minimum allowed plugin maturity. This can help\nprevent users from using unstable plugins on production servers. This minimum\nplugin maturity is configured by the plugin_maturity system variable. This can\nbe specified as a command-line argument to mysqld or it can be specified in a\nrelevant server option group in an option file. For example:\n\n[mariadb]\n...\nplugin_maturity = stable\n\nConfiguring Plugin Activation at Server Startup\n-----------------------------------------------\n\nA plugin will be loaded by default when the server starts if:\n\n* The plugin was installed with the INSTALL SONAME statement.\n* The plugin was installed with the INSTALL PLUGIN statement.\n* The plugin was installed with the mysql_plugin utility.\n* The server is configured to load the plugin with the --plugin-load-add\noption.\n* The server is configured to load the plugin with the --plugin-load option.\n\nThis behavior can be changed with special options that take the form\n--plugin-name. For example, for the server_audit audit plugin, the special\noption is called --server-audit.\n\nThe possible values for these special options are:\n\n+---------------------------------------+------------------------------------+\n| Option Value | Description |\n+---------------------------------------+------------------------------------+\n| OFF | Disables the plugin without |\n| | removing it from the |\n| | mysql.plugins table. |\n+---------------------------------------+------------------------------------+\n| ON | Enables the plugin. If the plugin |\n| | cannot be initialized, then the |\n| | server will still continue |\n| | starting up, but the plugin will |\n| | be disabled. |\n+---------------------------------------+------------------------------------+\n| FORCE | Enables the plugin. If the plugin |','','https://mariadb.com/kb/en/plugin-overview/');
-update help_topic set description = CONCAT(description, '\n| | cannot be initialized, then the |\n| | server will fail to start with an |\n| | error. |\n+---------------------------------------+------------------------------------+\n| FORCE_PLUS_PERMANENT | Enables the plugin. If the plugin |\n| | cannot be initialized, then the |\n| | server will fail to start with an |\n| | error. In addition, the plugin |\n| | cannot be uninstalled with |\n| | UNINSTALL SONAME or UNINSTALL |\n| | PLUGIN while the server is |\n| | running. |\n+---------------------------------------+------------------------------------+\n\nA plugin\'s status can be found by looking at the PLUGIN_STATUS column of the\ninformation_schema.PLUGINS table.\n\nUninstalling Plugins\n--------------------\n\nPlugins that are found in the mysql.plugin table, that is those that were\ninstalled with INSTALL SONAME, INSTALL PLUGIN or mysql_plugin can be\nuninstalled in one of two ways:\n\n* The UNINSTALL SONAME or the UNINSTALL PLUGIN statement while the server is\nrunning\n* With mysql_plugin while the server is offline.\n\nPlugins that were enabled as a --plugin-load option do not need to be\nuninstalled. If --plugin-load is omitted the next time the server starts, or\nthe plugin is not listed as one of the --plugin-load entries, the plugin will\nnot be loaded.\n\nUNINSTALL PLUGIN uninstalls a single installed plugin, while UNINSTALL SONAME\nuninstalls all plugins belonging to a given library.\n\nURL: https://mariadb.com/kb/en/plugin-overview/') WHERE help_topic_id = 78;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (79,6,'MBR Definition','Description\n-----------\n\nThe MBR (Minimum Bounding Rectangle), or Envelope is the bounding geometry,\nformed by the minimum and maximum (X,Y) coordinates:\n\nExamples\n--------\n\n((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))\n\nURL: https://mariadb.com/kb/en/mbr-definition/','','https://mariadb.com/kb/en/mbr-definition/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (80,6,'MBRContains','Syntax\n------\n\nMBRContains(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangle of g1\ncontains the Minimum Bounding Rectangle of g2. This tests the opposite\nrelationship as MBRWithin().\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\n\nSET @g2 = GeomFromText(\'Point(1 1)\');\n\nSELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);\n+----------------------+----------------------+\n| MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |\n+----------------------+----------------------+\n| 1 | 0 |\n+----------------------+----------------------+\n\nURL: https://mariadb.com/kb/en/mbrcontains/','','https://mariadb.com/kb/en/mbrcontains/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (81,6,'MBRDisjoint','Syntax\n------\n\nMBRDisjoint(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 are disjoint. Two geometries are disjoint if they do not\nintersect, that is touch or overlap.\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECTmbrdisjoint(@g1,@g2);\n+----------------------+\n| mbrdisjoint(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrdisjoint(@g1,@g2);\n+----------------------+\n| mbrdisjoint(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/mbrdisjoint/','','https://mariadb.com/kb/en/mbrdisjoint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (82,6,'MBREqual','Syntax\n------\n\nMBREqual(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 are the same.\n\nExamples\n--------\n\nSET @g1=GEOMFROMTEXT(\'LINESTRING(0 0, 1 2)\');\nSET @g2=GEOMFROMTEXT(\'POLYGON((0 0, 0 2, 1 2, 1 0, 0 0))\');\nSELECT MbrEqual(@g1,@g2);\n+-------------------+\n| MbrEqual(@g1,@g2) |\n+-------------------+\n| 1 |\n+-------------------+\n\nSET @g1=GEOMFROMTEXT(\'LINESTRING(0 0, 1 3)\');\nSET @g2=GEOMFROMTEXT(\'POLYGON((0 0, 0 2, 1 4, 1 0, 0 0))\');\nSELECT MbrEqual(@g1,@g2);\n+-------------------+\n| MbrEqual(@g1,@g2) |\n+-------------------+\n| 0 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/mbrequal/','','https://mariadb.com/kb/en/mbrequal/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (83,6,'MBRIntersects','Syntax\n------\n\nMBRIntersects(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 intersect.\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrintersects(@g1,@g2);\n+------------------------+\n| mbrintersects(@g1,@g2) |\n+------------------------+\n| 1 |\n+------------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECT mbrintersects(@g1,@g2);\n+------------------------+\n| mbrintersects(@g1,@g2) |\n+------------------------+\n| 0 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/mbrintersects/','','https://mariadb.com/kb/en/mbrintersects/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (84,6,'MBROverlaps','Syntax\n------\n\nMBROverlaps(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 overlap. The term spatially overlaps is used if two\ngeometries intersect and their intersection results in a geometry of the same\ndimension but not equal to either of the given geometries.\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECT mbroverlaps(@g1,@g2);\n+----------------------+\n| mbroverlaps(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbroverlaps(@g1,@g2);\n+----------------------+\n| mbroverlaps(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 4,4 4,4 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbroverlaps(@g1,@g2);\n+----------------------+\n| mbroverlaps(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/mbroverlaps/','','https://mariadb.com/kb/en/mbroverlaps/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (85,6,'MBRTouches','Syntax\n------\n\nMBRTouches(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 touch. Two geometries spatially touch if the interiors of\nthe geometries do not intersect, but the boundary of one of the geometries\nintersects either the boundary or the interior of the other.\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECT mbrtouches(@g1,@g2);\n+---------------------+\n| mbrtouches(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrtouches(@g1,@g2);\n+---------------------+\n| mbrtouches(@g1,@g2) |\n+---------------------+\n| 1 |\n+---------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 4,4 4,4 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrtouches(@g1,@g2);\n+---------------------+\n| mbrtouches(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/mbrtouches/','','https://mariadb.com/kb/en/mbrtouches/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (86,6,'MBRWithin','Syntax\n------\n\nMBRWithin(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangle of g1 is\nwithin the Minimum Bounding Rectangle of g2. This tests the opposite\nrelationship as MBRContains().\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((0 0,0 5,5 5,5 0,0 0))\');\nSELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);\n+--------------------+--------------------+\n| MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |\n+--------------------+--------------------+\n| 1 | 0 |\n+--------------------+--------------------+\n\nURL: https://mariadb.com/kb/en/mbrwithin/','','https://mariadb.com/kb/en/mbrwithin/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (87,7,'CASE OPERATOR','Syntax\n------\n\nCASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN\nresult ...] [ELSE result] END\n\nCASE WHEN [condition] THEN result [WHEN [condition] THEN result ...]\n[ELSE result] END\n\nDescription\n-----------\n\nThe first version returns the result where value=compare_value. The second\nversion returns the result for the first condition that is true. If there was\nno matching result value, the result after ELSE is returned, or NULL if there\nis no ELSE part.\n\nThere is also a CASE statement, which differs from the CASE operator described\nhere.\n\nExamples\n--------\n\nSELECT CASE 1 WHEN 1 THEN \'one\' WHEN 2 THEN \'two\' ELSE \'more\' END;\n+------------------------------------------------------------+\n| CASE 1 WHEN 1 THEN \'one\' WHEN 2 THEN \'two\' ELSE \'more\' END |\n+------------------------------------------------------------+\n| one |\n+------------------------------------------------------------+\n\nSELECT CASE WHEN 1>0 THEN \'true\' ELSE \'false\' END;\n+--------------------------------------------+\n| CASE WHEN 1>0 THEN \'true\' ELSE \'false\' END |\n+--------------------------------------------+\n| true |\n+--------------------------------------------+\n\nSELECT CASE BINARY \'B\' WHEN \'a\' THEN 1 WHEN \'b\' THEN 2 END;\n+-----------------------------------------------------+\n| CASE BINARY \'B\' WHEN \'a\' THEN 1 WHEN \'b\' THEN 2 END |\n+-----------------------------------------------------+\n| NULL |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/case-operator/','','https://mariadb.com/kb/en/case-operator/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (88,7,'IF Function','Syntax\n------\n\nIF(expr1,expr2,expr3)\n\nDescription\n-----------\n\nIf expr1 is TRUE (expr1 <> 0 and expr1 <> NULL) then IF() returns expr2;\notherwise it returns expr3. IF() returns a numeric or string value, depending\non the context in which it is used.\n\nNote: There is also an IF statement which differs from the IF() function\ndescribed here.\n\nExamples\n--------\n\nSELECT IF(1>2,2,3);\n+-------------+\n| IF(1>2,2,3) |\n+-------------+\n| 3 |\n+-------------+\n\nSELECT IF(1<2,\'yes\',\'no\');\n+--------------------+\n| IF(1<2,\'yes\',\'no\') |\n+--------------------+\n| yes |\n+--------------------+\n\nSELECT IF(STRCMP(\'test\',\'test1\'),\'no\',\'yes\');\n+---------------------------------------+\n| IF(STRCMP(\'test\',\'test1\'),\'no\',\'yes\') |\n+---------------------------------------+\n| no |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/if-function/','','https://mariadb.com/kb/en/if-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (89,7,'IFNULL','Syntax\n------\n\nIFNULL(expr1,expr2)\nNVL(expr1,expr2)\n\nDescription\n-----------\n\nIf expr1 is not NULL, IFNULL() returns expr1; otherwise it returns expr2.\nIFNULL() returns a numeric or string value, depending on the context in which\nit is used.\n\nFrom MariaDB 10.3, NVL() is an alias for IFNULL().\n\nExamples\n--------\n\nSELECT IFNULL(1,0); \n+-------------+\n| IFNULL(1,0) |\n+-------------+\n| 1 |\n+-------------+\n\nSELECT IFNULL(NULL,10);\n+-----------------+\n| IFNULL(NULL,10) |\n+-----------------+\n| 10 |\n+-----------------+\n\nSELECT IFNULL(1/0,10);\n+----------------+\n| IFNULL(1/0,10) |\n+----------------+\n| 10.0000 |\n+----------------+\n\nSELECT IFNULL(1/0,\'yes\');\n+-------------------+\n| IFNULL(1/0,\'yes\') |\n+-------------------+\n| yes |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/ifnull/','','https://mariadb.com/kb/en/ifnull/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (90,7,'NULLIF','Syntax\n------\n\nNULLIF(expr1,expr2)\n\nDescription\n-----------\n\nReturns NULL if expr1 = expr2 is true, otherwise returns expr1. This is the\nsame as CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.\n\nExamples\n--------\n\nSELECT NULLIF(1,1);\n+-------------+\n| NULLIF(1,1) |\n+-------------+\n| NULL |\n+-------------+\n\nSELECT NULLIF(1,2);\n+-------------+\n| NULLIF(1,2) |\n+-------------+\n| 1 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/nullif/','','https://mariadb.com/kb/en/nullif/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (91,7,'NVL','MariaDB starting with 10.3\n--------------------------\nFrom MariaDB 10.3, NVL is a synonym for IFNULL.\n\nURL: https://mariadb.com/kb/en/nvl/','','https://mariadb.com/kb/en/nvl/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (92,7,'NVL2','MariaDB starting with 10.3\n--------------------------\nThe NLV2 function was introduced in MariaDB 10.3.0.\n\nSyntax\n------\n\nNVL2(expr1,expr2,expr3)\n\nDescription\n-----------\n\nThe NVL2 function returns a value based on whether a specified expression is\nNULL or not. If expr1 is not NULL, then NVL2 returns expr2. If expr1 is NULL,\nthen NVL2 returns expr3.\n\nExamples\n--------\n\nSELECT NVL2(NULL,1,2);\n+----------------+\n| NVL2(NULL,1,2) |\n+----------------+\n| 2 |\n+----------------+\n\nSELECT NVL2(\'x\',1,2);\n+---------------+\n| NVL2(\'x\',1,2) |\n+---------------+\n| 1 |\n+---------------+\n\nURL: https://mariadb.com/kb/en/nvl2/','','https://mariadb.com/kb/en/nvl2/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (93,8,'SET TRANSACTION','Syntax\n------\n\nSET [GLOBAL | SESSION] TRANSACTION\n transaction_property [, transaction_property] ...\n\ntransaction_property:\n ISOLATION LEVEL level\n | READ WRITE\n | READ ONLY\n\nlevel:\n REPEATABLE READ\n | READ COMMITTED\n | READ UNCOMMITTED\n | SERIALIZABLE\n\nDescription\n-----------\n\nThis statement sets the transaction isolation level or the transaction access\nmode globally, for the current session, or for the next transaction:\n\n* With the GLOBAL keyword, the statement sets the default\n transaction level globally for all subsequent sessions. Existing sessions are\n unaffected.\n* With the SESSION keyword, the statement sets the default\n transaction level for all subsequent transactions performed within the\n current session.\n* Without any SESSION or GLOBAL keyword,\n the statement sets the isolation level for the next (not started) transaction\n performed within the current session.\n\nA change to the global default isolation level requires the SUPER privilege.\nAny session is free to change its session isolation level (even in the middle\nof a transaction), or the isolation level for its next transaction.\n\nIsolation Level\n---------------\n\nTo set the global default isolation level at server startup, use the\n--transaction-isolation=level option on the command line or in an option file.\nValues of level for this option use dashes rather than spaces, so the\nallowable values are READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, or\nSERIALIZABLE. For example, to set the default isolation level to REPEATABLE\nREAD, use these lines in the [mysqld] section of an option file:\n\n[mysqld]\ntransaction-isolation = REPEATABLE-READ\nTo determine the global and session transaction isolation levels at runtime,\ncheck the value of the tx_isolation system variable:\n\nSELECT @@GLOBAL.tx_isolation, @@tx_isolation;\n\nInnoDB supports each of the translation isolation levels described here using\ndifferent locking strategies. The default level is REPEATABLE READ. For\nadditional information about InnoDB record-level locks and how it uses them to\nexecute various types of statements, see InnoDB Lock Modes, and\nhttp://dev.mysql.com/doc/refman/en/innodb-locks-set.html.\n\nIsolation Levels\n----------------\n\nThe following sections describe how MariaDB supports the different transaction\nlevels.\n\nREAD UNCOMMITTED\n----------------\n\nSELECT statements are performed in a non-locking fashion, but a possible\nearlier version of a row might be used. Thus, using this isolation level, such\nreads are not consistent. This is also called a \"dirty read.\" Otherwise, this\nisolation level works like READ COMMITTED.\n\nREAD COMMITTED\n--------------\n\nA somewhat Oracle-like isolation level with respect to consistent\n(non-locking) reads: Each consistent read, even within the same transaction,\nsets and reads its own fresh snapshot. See\nhttp://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.\n\nFor locking reads (SELECT with FOR UPDATE or LOCK IN SHARE MODE), InnoDB locks\nonly index records, not the gaps before them, and thus allows the free\ninsertion of new records next to locked records. For UPDATE and DELETE\nstatements, locking depends on whether the statement uses a unique index with\na unique search condition (such as WHERE id = 100), or a range-type search\ncondition (such as WHERE id > 100). For a unique index with a unique search\ncondition, InnoDB locks only the index record found, not the gap before it.\nFor range-type searches, InnoDB locks the index range scanned, using gap locks\nor next-key (gap plus index-record) locks to block insertions by other\nsessions into the gaps covered by the range. This is necessary because\n\"phantom rows\" must be blocked for MySQL replication and recovery to work.\n\nNote: If the READ COMMITTED isolation level is used or the\ninnodb_locks_unsafe_for_binlog system variable is enabled, there is no InnoDB\ngap locking except for foreign-key constraint checking and duplicate-key\nchecking. Also, record locks for non-matching rows are released after MariaDB\nhas evaluated the WHERE condition.If you use READ COMMITTED or enable\ninnodb_locks_unsafe_for_binlog, you must use row-based binary logging.\n\nREPEATABLE READ\n---------------\n\nThis is the default isolation level for InnoDB. For consistent reads, there is\nan important difference from the READ COMMITTED isolation level: All\nconsistent reads within the same transaction read the snapshot established by\nthe first read. This convention means that if you issue several plain\n(non-locking) SELECT statements within the same transaction, these SELECT\nstatements are consistent also with respect to each other. See\nhttp://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.\n\nFor locking reads (SELECT with FOR UPDATE or LOCK IN SHARE MODE), UPDATE, and\nDELETE statements, locking depends on whether the statement uses a unique\nindex with a unique search condition, or a range-type search condition. For a\nunique index with a unique search condition, InnoDB locks only the index\nrecord found, not the gap before it. For other search conditions, InnoDB locks\nthe index range scanned, using gap locks or next-key (gap plus index-record)\nlocks to block insertions by other sessions into the gaps covered by the range.\n\nThis is the minimum isolation level for non-distributed XA transactions.\n\nSERIALIZABLE\n------------\n\nThis level is like REPEATABLE READ, but InnoDB implicitly converts all plain\nSELECT statements to SELECT ... LOCK IN SHARE MODE if autocommit is disabled.\nIf autocommit is enabled, the SELECT is its own transaction. It therefore is\nknown to be read only and can be serialized if performed as a consistent\n(non-locking) read and need not block for other transactions. (This means that\nto force a plain SELECT to block if other transactions have modified the\nselected rows, you should disable autocommit.)\n\nDistributed XA transactions should always use this isolation level.\n\nAccess Mode\n-----------\n\nThe access mode specifies whether the transaction is allowed to write data or\nnot. By default, transactions are in READ WRITE mode (see the tx_read_only\nsystem variable). READ ONLY mode allows the storage engine to apply\noptimizations that cannot be used for transactions which write data. The only\nexception to this rule is that read only transactions can perform DDL\nstatements on temporary tables.\n\nIt is not permitted to specify both READ WRITE and READ ONLY in the same\nstatement.\n\nREAD WRITE and READ ONLY can also be specified in the START TRANSACTION\nstatement, in which case the specified mode is only valid for one transaction.\n\nExamples\n--------\n\nSET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;\n\nAttempting to set the isolation level within an existing transaction without\nspecifying GLOBAL or SESSION.\n\nSTART TRANSACTION;\n\nSET TRANSACTION ISOLATION LEVEL SERIALIZABLE;\nERROR 1568 (25001): Transaction characteristics can\'t be changed while a\ntransaction is in progress\n\nURL: https://mariadb.com/kb/en/set-transaction/','','https://mariadb.com/kb/en/set-transaction/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (94,8,'START TRANSACTION','Syntax\n------\n\nSTART TRANSACTION [transaction_property [, transaction_property] ...] | BEGIN\n[WORK]\nCOMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]\nROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]\nSET autocommit = {0 | 1}\n\ntransaction_property:\n WITH CONSISTENT SNAPSHOT\n | READ WRITE\n | READ ONLY\n\nDescription\n-----------\n\nThe START TRANSACTION or BEGIN statement begins a new transaction. COMMIT\ncommits the current transaction, making its changes permanent. ROLLBACK rolls\nback the current transaction, canceling its changes. The SET autocommit\nstatement disables or enables the default autocommit mode for the current\nsession.\n\nSTART TRANSACTION and SET autocommit = 1 implicitly commit the current\ntransaction, if any.\n\nThe optional WORK keyword is supported for COMMIT and ROLLBACK, as are the\nCHAIN and RELEASE clauses. CHAIN and RELEASE can be used for additional\ncontrol over transaction completion. The value of the completion_type system\nvariable determines the default completion behavior.\n\nThe AND CHAIN clause causes a new transaction to begin as soon as the current\none ends, and the new transaction has the same isolation level as the\njust-terminated transaction. The RELEASE clause causes the server to\ndisconnect the current client session after terminating the current\ntransaction. Including the NO keyword suppresses CHAIN or RELEASE completion,\nwhich can be useful if the completion_type system variable is set to cause\nchaining or release completion by default.\n\nAccess Mode\n-----------\n\nThe access mode specifies whether the transaction is allowed to write data or\nnot. By default, transactions are in READ WRITE mode (see the tx_read_only\nsystem variable). READ ONLY mode allows the storage engine to apply\noptimizations that cannot be used for transactions which write data. The only\nexception to this rule is that read only transactions can perform DDL\nstatements on temporary tables.\n\nIt is not permitted to specify both READ WRITE and READ ONLY in the same\nstatement.\n\nREAD WRITE and READ ONLY can also be specified in the SET TRANSACTION\nstatement, in which case the specified mode is valid for all sessions, or for\nall subsequent transaction used by the current session.\n\nautocommit\n----------\n\nBy default, MariaDB runs with autocommit mode enabled. This means that as soon\nas you execute a statement that updates (modifies) a table, MariaDB stores the\nupdate on disk to make it permanent. To disable autocommit mode, use the\nfollowing statement:\n\nSET autocommit=0;\n\nAfter disabling autocommit mode by setting the autocommit variable to zero,\nchanges to transaction-safe tables (such as those for InnoDB or NDBCLUSTER)\nare not made permanent immediately. You must use COMMIT to store your changes\nto disk or ROLLBACK to ignore the changes.\n\nTo disable autocommit mode for a single series of statements, use the START\nTRANSACTION statement.\n\nDDL Statements\n--------------\n\nDDL statements (CREATE, ALTER, DROP) and administrative statements (FLUSH,\nRESET, OPTIMIZE, ANALYZE, CHECK, REPAIR, CACHE INDEX), transaction management\nstatements (BEGIN, START TRANSACTION) and LOAD DATA INFILE, cause an implicit\nCOMMIT and start a new transaction. An exception to this rule are the DDL that\noperate on temporary tables: you can CREATE, ALTER and DROP them without\ncausing any COMMIT, but those actions cannot be rolled back. This means that\nif you call ROLLBACK, the temporary tables you created in the transaction will\nremain, while the rest of the transaction will be rolled back.\n\nTransactions cannot be used in Stored Functions or Triggers. In Stored\nProcedures and Events BEGIN is not allowed, so you should use START\nTRANSACTION instead.\n\nA transaction acquires a metadata lock on every table it accesses to prevent\nother connections from altering their structure. The lock is released at the\nend of the transaction. This happens even with non-transactional storage\nengines (like MEMORY or CONNECT), so it makes sense to use transactions with\nnon-transactional tables.\n\nin_transaction\n--------------\n\nThe in_transaction system variable is a session-only, read-only variable that\nreturns 1 inside a transaction, and 0 if not in a transaction.\n\nWITH CONSISTENT SNAPSHOT\n------------------------\n\nThe WITH CONSISTENT SNAPSHOT option starts a consistent read for storage\nengines such as InnoDB that can do so, the same as if a START TRANSACTION\nfollowed by a SELECT from any InnoDB table was issued.\n\nSee Enhancements for START TRANSACTION WITH CONSISTENT SNAPSHOT.\n\nExamples\n--------\n\nSTART TRANSACTION;\nSELECT @A:=SUM(salary) FROM table1 WHERE type=1;\nUPDATE table2 SET summary=@A WHERE type=1;\nCOMMIT;\n\nURL: https://mariadb.com/kb/en/start-transaction/','','https://mariadb.com/kb/en/start-transaction/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (95,8,'COMMIT','The COMMIT statement ends a transaction, saving any changes to the data so\nthat they become visible to subsequent transactions. Also, unlocks metadata\nchanged by current transaction. If autocommit is set to 1, an implicit commit\nis performed after each statement. Otherwise, all transactions which don\'t end\nwith an explicit COMMIT are implicitly rollbacked and the changes are lost.\nThe ROLLBACK statement can be used to do this explicitly.\n\nThe required syntax for the COMMIT statement is as follows:\n\nCOMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]\n\nCOMMIT is the more important transaction terminator, as well as the more\ninteresting one. The basic form of the COMMIT statement is simply the keyword\nCOMMIT (the keyword WORK is simply noise and can be omitted without changing\nthe effect).\n\nThe optional AND CHAIN clause is a convenience for initiating a new\ntransaction as soon as the old transaction terminates. If AND CHAIN is\nspecified, then there is effectively nothing between the old and new\ntransactions, although they remain separate. The characteristics of the new\ntransaction will be the same as the characteristics of the old one — that is,\nthe new transaction will have the same access mode, isolation level and\ndiagnostics area size (we\'ll discuss all of these shortly) as the transaction\njust terminated.\n\nRELEASE tells the server to disconnect the client immediately after the\ncurrent transaction.\n\nThere are NO RELEASE and AND NO CHAIN options. By default, commits do not\nRELEASE or CHAIN, but it\'s possible to change this default behavior with the\ncompletion_type server system variable. In this case, the AND NO CHAIN and NO\nRELEASE options override the server default.\n\nURL: https://mariadb.com/kb/en/commit/','','https://mariadb.com/kb/en/commit/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (96,8,'ROLLBACK','The ROLLBACK statement rolls back (ends) a transaction, destroying any changes\nto SQL-data so that they never become visible to subsequent transactions. The\nrequired syntax for the ROLLBACK statement is as follows.\n\nROLLBACK [ WORK ] [ AND [ NO ] CHAIN ] \n[ TO [ SAVEPOINT ] {<savepoint name> | <simple target specification>} ]\n\nThe ROLLBACK statement will either end a transaction, destroying all data\nchanges that happened during any of the transaction, or it will just destroy\nany data changes that happened since you established a savepoint. The basic\nform of the ROLLBACK statement is just the keyword ROLLBACK (the keyword WORK\nis simply noise and can be omitted without changing the effect).\n\nThe optional AND CHAIN clause is a convenience for initiating a new\ntransaction as soon as the old transaction terminates. If AND CHAIN is\nspecified, then there is effectively nothing between the old and new\ntransactions, although they remain separate. The characteristics of the new\ntransaction will be the same as the characteristics of the old one — that is,\nthe new transaction will have the same access mode, isolation level and\ndiagnostics area size (we\'ll discuss all of these shortly) as the transaction\njust terminated. The AND NO CHAIN option just tells your DBMS to end the\ntransaction — that is, these four SQL statements are equivalent:\n\nROLLBACK; \nROLLBACK WORK; \nROLLBACK AND NO CHAIN; \nROLLBACK WORK AND NO CHAIN;\n\nAll of them end a transaction without saving any transaction characteristics.\nThe only other options, the equivalent statements:\n\nROLLBACK AND CHAIN;\nROLLBACK WORK AND CHAIN;\n\nboth tell your DBMS to end a transaction, but to save that transaction\'s\ncharacteristics for the next transaction.\n\nROLLBACK is much simpler than COMMIT: it may involve no more than a few\ndeletions (of Cursors, locks, prepared SQL statements and log-file entries).\nIt\'s usually assumed that ROLLBACK can\'t fail, although such a thing is\nconceivable (for example, an encompassing transaction might reject an attempt\nto ROLLBACK because it\'s lining up for a COMMIT).\n\nROLLBACK cancels all effects of a transaction. It does not cancel effects on\nobjects outside the DBMS\'s control (for example the values in host program\nvariables or the settings made by some SQL/CLI function calls). But in\ngeneral, it is a convenient statement for those situations when you say \"oops,\nthis isn\'t working\" or when you simply don\'t care whether your temporary work\nbecomes permanent or not.\n\nHere is a moot question. If all you\'ve been doing is SELECTs, so that there\nhave been no data changes, should you end the transaction with ROLLBACK or\nCOMMIT? It shouldn\'t really matter because both ROLLBACK and COMMIT do the\nsame transaction-terminating job. However, the popular conception is that\nROLLBACK implies failure, so after a successful series of SELECT statements\nthe convention is to end the transaction with COMMIT rather than ROLLBACK.\n\nMariaDB (and most other DBMSs) supports rollback of SQL-data change\nstatements, but not of SQL-Schema statements. This means that if you use any\nof CREATE, ALTER, DROP, GRANT, REVOKE, you are implicitly committing at\nexecution time.\n\nINSERT INTO Table_2 VALUES(5); \nDROP TABLE Table_3 CASCADE; \nROLLBACK;\n\nThe result will be that both the INSERT and the DROP will go through as\nseparate transactions so the ROLLBACK will have no effect.\n\nURL: https://mariadb.com/kb/en/rollback/','','https://mariadb.com/kb/en/rollback/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (97,8,'LOCK TABLES','Syntax\n------\n\nLOCK TABLE[S]\n tbl_name [[AS] alias] lock_type\n [, tbl_name [[AS] alias] lock_type] ...\n [WAIT n|NOWAIT]\n\nlock_type:\n READ [LOCAL]\n | [LOW_PRIORITY] WRITE\n | WRITE CONCURRENT\n\nUNLOCK TABLES\n\nDescription\n-----------\n\nThe lock_type can be one of:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| READ | Read lock, no writes allowed |\n+---------------------------+------------------------------------------------+\n| READ LOCAL | Read lock, but allow concurrent inserts |\n+---------------------------+------------------------------------------------+\n| WRITE | Exclusive write lock. No other connections |\n| | can read or write to this table |\n+---------------------------+------------------------------------------------+\n| LOW_PRIORITY WRITE | Exclusive write lock, but allow new read |\n| | locks on the table until we get the write |\n| | lock. |\n+---------------------------+------------------------------------------------+\n| WRITE CONCURRENT | Exclusive write lock, but allow READ LOCAL |\n| | locks to the table. |\n+---------------------------+------------------------------------------------+\n\nMariaDB enables client sessions to acquire table locks explicitly for the\npurpose of cooperating with other sessions for access to tables, or to prevent\nother sessions from modifying tables during periods when a session requires\nexclusive access to them. A session can acquire or release locks only for\nitself. One session cannot acquire locks for another session or release locks\nheld by another session.\n\nLocks may be used to emulate transactions or to get more speed when updating\ntables.\n\nLOCK TABLES explicitly acquires table locks for the current client session.\nTable locks can be acquired for base tables or views. To use LOCK TABLES, you\nmust have the LOCK TABLES privilege, and the SELECT privilege for each object\nto be locked. See GRANT\n\nFor view locking, LOCK TABLES adds all base tables used in the view to the set\nof tables to be locked and locks them automatically. If you lock a table\nexplicitly with LOCK TABLES, any tables used in triggers are also locked\nimplicitly, as described in Triggers and Implicit Locks.\n\nUNLOCK TABLES explicitly releases any table locks held by the current session.\n\nMariaDB starting with 10.3.0\n----------------------------\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nLimitations\n-----------\n\n* LOCK TABLES doesn\'t work when using Galera cluster. You may experience\ncrashes or locks when used with Galera.\n* LOCK TABLES works on XtraDB/InnoDB tables only if the innodb_table_locks\nsystem variable is set to 1 (the default) and autocommit is set to 0 (1 is\ndefault). Please note that no error message will be returned on LOCK TABLES\nwith innodb_table_locks = 0.\n* LOCK TABLES implicitly commits the active transaction, if any. Also,\nstarting a transaction always releases all table locks acquired with LOCK\nTABLES. This means that there is no way to have table locks and an active\ntransaction at the same time. The only exceptions are the transactions in\nautocommit mode. To preserve the data integrity between transactional and\nnon-transactional tables, the GET_LOCK() function can be used.\n* When using LOCK TABLES on a TEMPORARY table, it will always be locked with a\nWRITE lock.\n* While a connection holds an explicit read lock on a table, it cannot modify\nit. If you try, the following error will be produced:\n\nERROR 1099 (HY000): Table \'tab_name\' was locked with a READ lock and can\'t be\nupdated\n\n* While a connection holds an explicit lock on a table, it cannot access a\nnon-locked table. If you try, the following error will be produced:\n\nERROR 1100 (HY000): Table \'tab_name\' was not locked with LOCK TABLES\n\n* While a connection holds an explicit lock on a table, it cannot issue the\nfollowing: INSERT DELAYED, CREATE TABLE, CREATE TABLE ... LIKE, and DDL\nstatements involving stored programs and views (except for triggers). If you\ntry, the following error will be produced:\n\nERROR 1192 (HY000): Can\'t execute the given command because you have active\nlocked tables or an active transaction\n\n* LOCK TABLES can not be used in stored routines - if you try, the following\nerror will be produced on creation. This restriction was removed in MariaDB\n10.6.2:\n\nERROR 1314 (0A000): LOCK is not allowed in stored procedures\n\nURL: https://mariadb.com/kb/en/lock-tables/','','https://mariadb.com/kb/en/lock-tables/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (98,8,'SAVEPOINT','Syntax\n------\n\nSAVEPOINT identifier\nROLLBACK [WORK] TO [SAVEPOINT] identifier\nRELEASE SAVEPOINT identifier\n\nDescription\n-----------\n\nInnoDB supports the SQL statements SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE\nSAVEPOINT and the optional WORK keyword for ROLLBACK.\n\nEach savepoint must have a legal MariaDB identifier. A savepoint is a named\nsub-transaction.\n\nNormally ROLLBACK undoes the changes performed by the whole transaction. When\nused with the TO clause, it undoes the changes performed after the specified\nsavepoint, and erases all subsequent savepoints. However, all locks that have\nbeen acquired after the save point will survive. RELEASE SAVEPOINT does not\nrollback or commit any changes, but removes the specified savepoint.\n\nWhen the execution of a trigger or a stored function begins, it is not\npossible to use statements which reference a savepoint which was defined from\nout of that stored program.\n\nWhen a COMMIT (including implicit commits) or a ROLLBACK statement (with no TO\nclause) is performed, they act on the whole transaction, and all savepoints\nare removed.\n\nErrors\n------\n\nIf COMMIT or ROLLBACK is issued and no transaction was started, no error is\nreported.\n\nIf SAVEPOINT is issued and no transaction was started, no error is reported\nbut no savepoint is created. When ROLLBACK TO SAVEPOINT or RELEASE SAVEPOINT\nis called for a savepoint that does not exist, an error like this is issued:\n\nERROR 1305 (42000): SAVEPOINT svp_name does not exist\n\nURL: https://mariadb.com/kb/en/savepoint/','','https://mariadb.com/kb/en/savepoint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (99,8,'Metadata Locking','MariaDB supports metadata locking. This means that when a transaction\n(including XA transactions) uses a table, it locks its metadata until the end\nof transaction. Non-transactional tables are also locked, as well as views and\nobjects which are related to locked tables/views (stored functions, triggers,\netc). When a connection tries to use a DDL statement (like an ALTER TABLE)\nwhich modifies a table that is locked, that connection is queued, and has to\nwait until it\'s unlocked. Using savepoints and performing a partial rollback\ndoes not release metadata locks.\n\nLOCK TABLES ... WRITE are also queued. Some wrong statements which produce an\nerror may not need to wait for the lock to be freed.\n\nThe metadata lock\'s timeout is determined by the value of the\nlock_wait_timeout server system variable (in seconds). However, note that its\ndefault value is 31536000 (1 year, MariaDB <= 10.2.3), or 86400 (1 day,\nMariaDB >= 10.2.4). If this timeout is exceeded, the following error is\nreturned:\n\nERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction\n\nIf the metadata_lock_info plugin is installed, the Information Schema\nmetadata_lock_info table stores information about existing metadata locks.\n\nMariaDB starting with 10.5.2\n----------------------------\nFrom MariaDB 10.5, the Performance Schema metadata_locks table contains\nmetadata lock information.\n\nExample\n-------\n\nLet\'s use the following MEMORY (non-transactional) table:\n\nCREATE TABLE t (a INT) ENGINE = MEMORY;\n\nConnection 1 starts a transaction, and INSERTs a row into t:\n\nSTART TRANSACTION;\n\nINSERT INTO t SET a=1;\n\nt\'s metadata is now locked by connection 1. Connection 2 tries to alter t, but\nhas to wait:\n\nALTER TABLE t ADD COLUMN b INT;\n\nConnection 2\'s prompt is blocked now.\n\nNow connection 1 ends the transaction:\n\nCOMMIT;\n\n...and connection 2 finally gets the output of its command:\n\nQuery OK, 1 row affected (35.23 sec)\nRecords: 1 Duplicates: 0 Warnings: 0\n\nURL: https://mariadb.com/kb/en/metadata-locking/','','https://mariadb.com/kb/en/metadata-locking/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (100,8,'Transaction Timeouts','MariaDB has always had the wait_timeout and interactive_timeout settings,\nwhich close connections after a certain period of inactivity.\n\nHowever, these are by default set to a long wait period. In situations where\ntransactions may be started, but not committed or rolled back, more granular\ncontrol and a shorter timeout may be desirable so as to avoid locks being held\nfor too long.\n\nMariaDB 10.3 introduced three new variables to handle this situation.\n\n* idle_transaction_timeout (all transactions)\n* idle_write_transaction_timeout (write transactions - called\nidle_readwrite_transaction_timeout until MariaDB 10.3.2)\n* idle_readonly_transaction_timeout (read transactions)\n\nThese accept a time in seconds to time out, by closing the connection,\ntransactions that are idle for longer than this period. By default all are set\nto zero, or no timeout.\n\nidle_transaction_timeout affects all transactions,\nidle_write_transaction_timeout affects write transactions only and\nidle_readonly_transaction_timeout affects read transactions only. The latter\ntwo variables work independently. However, if either is set along with\nidle_transaction_timeout, the settings for idle_write_transaction_timeout or\nidle_readonly_transaction_timeout will take precedence.\n\nExamples\n--------\n\nSET SESSION idle_transaction_timeout=2;\nBEGIN;\nSELECT * FROM t;\nEmpty set (0.000 sec)\n## wait 3 seconds\nSELECT * FROM t;\nERROR 2006 (HY000): MySQL server has gone away\n\nSET SESSION idle_write_transaction_timeout=2;\nBEGIN;\nSELECT * FROM t;\nEmpty set (0.000 sec)\n## wait 3 seconds\nSELECT * FROM t;\nEmpty set (0.000 sec)\nINSERT INTO t VALUES(1);\n## wait 3 seconds\nSELECT * FROM t;\nERROR 2006 (HY000): MySQL server has gone away\n\nSET SESSION idle_transaction_timeout=2, SESSION\nidle_readonly_transaction_timeout=10;\nBEGIN;\nSELECT * FROM t;\nEmpty set (0.000 sec)\n ## wait 3 seconds\nSELECT * FROM t;\nEmpty set (0.000 sec)\n## wait 11 seconds\nSELECT * FROM t;\nERROR 2006 (HY000): MySQL server has gone away\n\nURL: https://mariadb.com/kb/en/transaction-timeouts/','','https://mariadb.com/kb/en/transaction-timeouts/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (101,8,'UNLOCK TABLES','Syntax\n------\n\nUNLOCK TABLES\n\nDescription\n-----------\n\nUNLOCK TABLES explicitly releases any table locks held by the current session.\nSee LOCK TABLES for more information.\n\nIn addition to releasing table locks acquired by the LOCK TABLES statement,\nthe UNLOCK TABLES statement also releases the global read lock acquired by the\nFLUSH TABLES WITH READ LOCK statement. The FLUSH TABLES WITH READ LOCK\nstatement is very useful for performing backups. See FLUSH for more\ninformation about FLUSH TABLES WITH READ LOCK.\n\nURL: https://mariadb.com/kb/en/transactions-unlock-tables/','','https://mariadb.com/kb/en/transactions-unlock-tables/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (102,8,'WAIT and NOWAIT','MariaDB starting with 10.3.0\n----------------------------\nMariaDB 10.3.0 introduced extended syntax so that it is possible to set\ninnodb_lock_wait_timeout and lock_wait_timeout for the following statements:\n\nSyntax\n------\n\nALTER TABLE tbl_name [WAIT n|NOWAIT] ...\nCREATE ... INDEX ON tbl_name (index_col_name, ...) [WAIT n|NOWAIT] ...\nDROP INDEX ... [WAIT n|NOWAIT]\nDROP TABLE tbl_name [WAIT n|NOWAIT] ...\nLOCK TABLE ... [WAIT n|NOWAIT]\nOPTIMIZE TABLE tbl_name [WAIT n|NOWAIT]\nRENAME TABLE tbl_name [WAIT n|NOWAIT] ...\nSELECT ... FOR UPDATE [WAIT n|NOWAIT]\nSELECT ... LOCK IN SHARE MODE [WAIT n|NOWAIT]\nTRUNCATE TABLE tbl_name [WAIT n|NOWAIT]\n\nDescription\n-----------\n\nThe lock wait timeout can be explicitly set in the statement by using either\nWAIT n (to set the wait in seconds) or NOWAIT, in which case the statement\nwill immediately fail if the lock cannot be obtained. WAIT 0 is equivalent to\nNOWAIT.\n\nURL: https://mariadb.com/kb/en/wait-and-nowait/','','https://mariadb.com/kb/en/wait-and-nowait/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (103,8,'XA Transactions','Overview\n--------\n\nThe MariaDB XA implementation is based on the X/Open CAE document Distributed\nTransaction Processing: The XA Specification. This document is published by\nThe Open Group and available at\nhttp://www.opengroup.org/public/pubs/catalog/c193.htm.\n\nXA transactions are designed to allow distributed transactions, where a\ntransaction manager (the application) controls a transaction which involves\nmultiple resources. Such resources are usually DBMSs, but could be resources\nof any type. The whole set of required transactional operations is called a\nglobal transaction. Each subset of operations which involve a single resource\nis called a local transaction. XA used a 2-phases commit (2PC). With the first\ncommit, the transaction manager tells each resource to prepare an effective\ncommit, and waits for a confirm message. The changes are not still made\neffective at this point. If any of the resources encountered an error, the\ntransaction manager will rollback the global transaction. If all resources\ncommunicate that the first commit is successful, the transaction manager can\nrequire a second commit, which makes the changes effective.\n\nIn MariaDB, XA transactions can only be used with storage engines that support\nthem. At least InnoDB, TokuDB, SPIDER and MyRocks support them. For InnoDB,\nuntil MariaDB 10.2, XA transactions can be disabled by setting the\ninnodb_support_xa server system variable to 0. From MariaDB 10.3, XA\ntransactions are always supported.\n\nLike regular transactions, XA transactions create metadata locks on accessed\ntables.\n\nXA transactions require REPEATABLE READ as a minimum isolation level. However,\ndistributed transactions should always use SERIALIZABLE.\n\nTrying to start more than one XA transaction at the same time produces a 1400\nerror (SQLSTATE \'XAE09\'). The same error is produced when attempting to start\nan XA transaction while a regular transaction is in effect. Trying to start a\nregular transaction while an XA transaction is in effect produces a 1399 error\n(SQLSTATE \'XAE07\').\n\nThe statements that cause an implicit COMMIT for regular transactions produce\na 1400 error (SQLSTATE \'XAE09\') if a XA transaction is in effect.\n\nInternal XA vs External XA\n--------------------------\n\nXA transactions are an overloaded term in MariaDB. If a storage engine is\nXA-capable, it can mean one or both of these:\n\n* It supports MariaDB\'s internal two-phase commit API. This is transparent to\nthe user. Sometimes this is called \"internal XA\", since MariaDB\'s internal\ntransaction coordinator log can handle coordinating these transactions.\n\n* It supports XA transactions, with the XA START, XA PREPARE, XA COMMIT, etc.\nstatements. Sometimes this is called \"external XA\", since it requires the use\nof an external transaction coordinator to use this feature properly.\n\nTransaction Coordinator Log\n---------------------------\n\nIf you have two or more XA-capable storage engines enabled, then a transaction\ncoordinator log must be available.\n\nThere are currently two implementations of the transaction coordinator log:\n\n* Binary log-based transaction coordinator log\n* Memory-mapped file-based transaction coordinator log\n\nIf the binary log is enabled on a server, then the server will use the binary\nlog-based transaction coordinator log. Otherwise, it will use the\nmemory-mapped file-based transaction coordinator log.\n\nSee Transaction Coordinator Log for more information.\n\nSyntax\n------\n\nXA {START|BEGIN} xid [JOIN|RESUME]\n\nXA END xid [SUSPEND [FOR MIGRATE]]\n\nXA PREPARE xid\n\nXA COMMIT xid [ONE PHASE]\n\nXA ROLLBACK xid\n\nXA RECOVER [FORMAT=[\'RAW\'|\'SQL\']]\n\nxid: gtrid [, bqual [, formatID ]]\n\nThe interface to XA transactions is a set of SQL statements starting with XA.\nEach statement changes a transaction\'s state, determining which actions it can\nperform. A transaction which does not exist is in the NON-EXISTING state.\n\nXA START (or BEGIN) starts a transaction and defines its xid (a transaction\nidentifier). The JOIN or RESUME keywords have no effect. The new transaction\nwill be in ACTIVE state.\n\nThe xid can have 3 components, though only the first one is mandatory. gtrid\nis a quoted string representing a global transaction identifier. bqual is a\nquoted string representing a local transaction identifier. formatID is an\nunsigned integer indicating the format used for the first two components; if\nnot specified, defaults to 1. MariaDB does not interpret in any way these\ncomponents, and only uses them to identify a transaction. xids of transactions\nin effect must be unique.\n\nXA END declares that the specified ACTIVE transaction is finished and it\nchanges its state to IDLE. SUSPEND [FOR MIGRATE] has no effect.\n\nXA PREPARE prepares an IDLE transaction for commit, changing its state to\nPREPARED. This is the first commit.\n\nXA COMMIT definitely commits and terminates a transaction which has already\nbeen PREPARED. If the ONE PHASE clause is specified, this statements performs\na 1-phase commit on an IDLE transaction.\n\nXA ROLLBACK rolls back and terminates an IDLE or PREPARED transaction.\n\nXA RECOVER shows information about all PREPARED transactions.\n\nWhen trying to execute an operation which is not allowed for the transaction\'s\ncurrent state, an error is produced:\n\nXA COMMIT \'test\' ONE PHASE;\nERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global\ntransaction is in the ACTIVE state\n\nXA COMMIT \'test2\';\nERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global\ntransaction is in the NON-EXISTING state\n\nXA RECOVER\n----------\n\nThe XA RECOVER statement shows information about all transactions which are in\nthe PREPARED state. It does not matter which connection created the\ntransaction: if it has been PREPARED, it appears. But this does not mean that\na connection can commit or rollback a transaction which was started by another\nconnection. Note that transactions using a 1-phase commit are never in the\nPREPARED state, so they cannot be shown by XA RECOVER.\n\nXA RECOVER produces four columns:\n\nXA RECOVER;\n+----------+--------------+--------------+------+\n| formatID | gtrid_length | bqual_length | data |\n+----------+--------------+--------------+------+\n| 1 | 4 | 0 | test |\n+----------+--------------+--------------+------+\n\nMariaDB starting with 10.3.3\n----------------------------\nYou can use XA RECOVER FORMAT=\'SQL\' to get the data in a human readable form\nthat can be directly copy-pasted into XA COMMIT or XA ROLLBACK. This is\nparticularly useful for binary xid generated by some transaction coordinators.\n\nformatID is the formatID part of xid.\n\ndata are the gtrid and bqual parts of xid, concatenated.\n\ngtrid_length and bqual_length are the lengths of gtrid and bqual, respectevely.\n\nExamples\n--------\n\n2-phases commit:\n\nXA START \'test\';\n\nINSERT INTO t VALUES (1,2);\n\nXA END \'test\';\n\nXA PREPARE \'test\';\n\nXA COMMIT \'test\';\n\n1-phase commit:\n\nXA START \'test\';\n\nINSERT INTO t VALUES (1,2);\n\nXA END \'test\';\n\nXA COMMIT \'test\' ONE PHASE;\n\nHuman-readable:\n\nxa start \'12\\r34\\t67\\v78\', \'abc\\ndef\', 3;\n\ninsert t1 values (40);\n\nxa end \'12\\r34\\t67\\v78\', \'abc\\ndef\', 3;\n\nxa prepare \'12\\r34\\t67\\v78\', \'abc\\ndef\', 3;\n\nxa recover format=\'RAW\';\n+----------+--------------+--------------+--------------------+\n| formatID | gtrid_length | bqual_length | data |\n+----------+--------------+--------------+--------------------+\n34 67v78abc 11 | 7 | 12\ndef |\n+----------+--------------+--------------+--------------------+\n\nxa recover format=\'SQL\';\n+----------+--------------+--------------+-------------------------------------\n---------+\n| formatID | gtrid_length | bqual_length | data \n |\n+----------+--------------+--------------+-------------------------------------\n---------+\n| 3 | 11 | 7 |\nX\'31320d3334093637763738\',X\'6162630a646566\',3 |\n+----------+--------------+--------------+-------------------------------------\n---------+\n\nxa rollback X\'31320d3334093637763738\',X\'6162630a646566\',3;\n\nKnown Issues\n------------\n\nMariaDB Galera Cluster\n----------------------\n\nMariaDB Galera Cluster does not support XA transactions.\n\nHowever, MariaDB Galera Cluster builds include a built-in plugin called wsrep.\nPrior to MariaDB 10.4.3, this plugin was internally considered an XA-capable\nstorage engine. Consequently, these MariaDB Galera Cluster builds have\nmultiple XA-capable storage engines by default, even if the only \"real\"\nstorage engine that supports external XA transactions enabled on these builds\nby default is InnoDB. Therefore, when using one these builds MariaDB would be\nforced to use a transaction coordinator log by default, which could have\nperformance implications.\n\nSee Transaction Coordinator Log Overview: MariaDB Galera Cluster for more\ninformation.\n\nURL: https://mariadb.com/kb/en/xa-transactions/','','https://mariadb.com/kb/en/xa-transactions/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (104,10,'CREATE USER','Syntax\n------\n\nCREATE [OR REPLACE] USER [IF NOT EXISTS] \n user_specification [,user_specification ...] \n [REQUIRE {NONE | tls_option [[AND] tls_option ...] }]\n [WITH resource_option [resource_option ...] ]\n [lock_option] [password_option]\n\nuser_specification:\n username [authentication_option]\n\nauthentication_option:\n IDENTIFIED BY \'password\'\n | IDENTIFIED BY PASSWORD \'password_hash\'\n | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule ...]\n\nauthentication_rule:\n authentication_plugin\n | authentication_plugin {USING|AS} \'authentication_string\'\n | authentication_plugin {USING|AS} PASSWORD(\'password\')\n\ntls_option:\n SSL\n | X509\n | CIPHER \'cipher\'\n | ISSUER \'issuer\'\n | SUBJECT \'subject\'\n\nresource_option:\n MAX_QUERIES_PER_HOUR count\n | MAX_UPDATES_PER_HOUR count\n | MAX_CONNECTIONS_PER_HOUR count\n | MAX_USER_CONNECTIONS count\n | MAX_STATEMENT_TIME time\n\npassword_option:\n PASSWORD EXPIRE\n | PASSWORD EXPIRE DEFAULT\n | PASSWORD EXPIRE NEVER\n | PASSWORD EXPIRE INTERVAL N DAY\n\nlock_option:\n ACCOUNT LOCK\n | ACCOUNT UNLOCK\n}\n\nDescription\n-----------\n\nThe CREATE USER statement creates new MariaDB accounts. To use it, you must\nhave the global CREATE USER privilege or the INSERT privilege for the mysql\ndatabase. For each account, CREATE USER creates a new row in mysql.user (until\nMariaDB 10.3 this is a table, from MariaDB 10.4 it\'s a view) or\nmysql.global_priv_table (from MariaDB 10.4) that has no privileges.\n\nIf any of the specified accounts, or any permissions for the specified\naccounts, already exist, then the server returns ERROR 1396 (HY000). If an\nerror occurs, CREATE USER will still create the accounts that do not result in\nan error. Only one error is produced for all users which have not been created:\n\nERROR 1396 (HY000): \n Operation CREATE USER failed for \'u1\'@\'%\',\'u2\'@\'%\'\n\nCREATE USER, DROP USER, CREATE ROLE, and DROP ROLE all produce the same error\ncode when they fail.\n\nSee Account Names below for details on how account names are specified.\n\nOR REPLACE\n----------\n\nIf the optional OR REPLACE clause is used, it is basically a shortcut for:\n\nDROP USER IF EXISTS name;\nCREATE USER name ...;\n\nFor example:\n\nCREATE USER foo2@test IDENTIFIED BY \'password\';\nERROR 1396 (HY000): Operation CREATE USER failed for \'foo2\'@\'test\'\n\nCREATE OR REPLACE USER foo2@test IDENTIFIED BY \'password\';\nQuery OK, 0 rows affected (0.00 sec)\n\nIF NOT EXISTS\n-------------\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified user already exists.\n\nFor example:\n\nCREATE USER foo2@test IDENTIFIED BY \'password\';\nERROR 1396 (HY000): Operation CREATE USER failed for \'foo2\'@\'test\'\n\nCREATE USER IF NOT EXISTS foo2@test IDENTIFIED BY \'password\';\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+----------------------------------------------------+\n| Level | Code | Message |\n+-------+------+----------------------------------------------------+\n| Note | 1973 | Can\'t create user \'foo2\'@\'test\'; it already exists |\n+-------+------+----------------------------------------------------+\n\nAuthentication Options\n----------------------\n\nIDENTIFIED BY \'password\'\n------------------------\n\nThe optional IDENTIFIED BY clause can be used to provide an account with a\npassword. The password should be specified in plain text. It will be hashed by\nthe PASSWORD function prior to being stored in the\nmysql.user/mysql.global_priv_table table.\n\nFor example, if our password is mariadb, then we can create the user with:\n\nCREATE USER foo2@test IDENTIFIED BY \'mariadb\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED BY PASSWORD \'password_hash\'\n--------------------------------------\n\nThe optional IDENTIFIED BY PASSWORD clause can be used to provide an account\nwith a password that has already been hashed. The password should be specified\nas a hash that was provided by the PASSWORD function. It will be stored in the\nmysql.user/mysql.global_priv_table table as-is.\n\nFor example, if our password is mariadb, then we can find the hash with:\n\nSELECT PASSWORD(\'mariadb\');\n+-------------------------------------------+\n| PASSWORD(\'mariadb\') |\n+-------------------------------------------+\n| *54958E764CE10E50764C2EECBB71D01F08549980 |\n+-------------------------------------------+\n1 row in set (0.00 sec)\n\nAnd then we can create a user with the hash:\n\nCREATE USER foo2@test IDENTIFIED BY PASSWORD\n\'*54958E764CE10E50764C2EECBB71D01F08549980\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED {VIA|WITH} authentication_plugin\n-------------------------------------------\n\nThe optional IDENTIFIED VIA authentication_plugin allows you to specify that\nthe account should be authenticated by a specific authentication plugin. The\nplugin name must be an active authentication plugin as per SHOW PLUGINS. If it\ndoesn\'t show up in that output, then you will need to install it with INSTALL\nPLUGIN or INSTALL SONAME.\n\nFor example, this could be used with the PAM authentication plugin:\n\nCREATE USER foo2@test IDENTIFIED VIA pam;\n\nSome authentication plugins allow additional arguments to be specified after a\nUSING or AS keyword. For example, the PAM authentication plugin accepts a\nservice name:\n\nCREATE USER foo2@test IDENTIFIED VIA pam USING \'mariadb\';\n\nThe exact meaning of the additional argument would depend on the specific\nauthentication plugin.\n\nMariaDB starting with 10.4.0\n----------------------------\nThe USING or AS keyword can also be used to provide a plain-text password to a\nplugin if it\'s provided as an argument to the PASSWORD() function. This is\nonly valid for authentication plugins that have implemented a hook for the\nPASSWORD() function. For example, the ed25519 authentication plugin supports\nthis:\n\nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 USING PASSWORD(\'secret\');\n\nMariaDB starting with 10.4.3\n----------------------------\nOne can specify many authentication plugins, they all work as alternatives\nways of authenticating a user:\n\nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 USING PASSWORD(\'secret\') OR\nunix_socket;\n\nBy default, when you create a user without specifying an authentication\nplugin, MariaDB uses the mysql_native_password plugin.\n\nTLS Options\n-----------\n\nBy default, MariaDB transmits data between the server and clients without\nencrypting it. This is generally acceptable when the server and client run on\nthe same host or in networks where security is guaranteed through other means.\nHowever, in cases where the server and client exist on separate networks or\nthey are in a high-risk network, the lack of encryption does introduce\nsecurity concerns as a malicious actor could potentially eavesdrop on the\ntraffic as it is sent over the network between them.\n\nTo mitigate this concern, MariaDB allows you to encrypt data in transit\nbetween the server and clients using the Transport Layer Security (TLS)\nprotocol. TLS was formerly known as Secure Socket Layer (SSL), but strictly\nspeaking the SSL protocol is a predecessor to TLS and, that version of the\nprotocol is now considered insecure. The documentation still uses the term SSL\noften and for compatibility reasons TLS-related server system and status\nvariables still use the prefix ssl_, but internally, MariaDB only supports its\nsecure successors.\n\nSee Secure Connections Overview for more information about how to determine\nwhether your MariaDB server has TLS support.\n\nYou can set certain TLS-related restrictions for specific user accounts. For\ninstance, you might use this with user accounts that require access to\nsensitive data while sending it across networks that you do not control. These\nrestrictions can be enabled for a user account with the CREATE USER, ALTER\nUSER, or GRANT statements. The following options are available:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| REQUIRE NONE | TLS is not required for this account, but can |\n| | still be used. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SSL | The account must use TLS, but no valid X509 |\n| | certificate is required. This option cannot |\n| | be combined with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE X509 | The account must use TLS and must have a |\n| | valid X509 certificate. This option implies |\n| | REQUIRE SSL. This option cannot be combined |\n| | with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE ISSUER \'issuer\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the Certificate |\n| | Authority must be the one specified via the |\n| | string issuer. This option implies REQUIRE |\n| | X509. This option can be combined with the |\n| | SUBJECT, and CIPHER options in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SUBJECT \'subject\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the |\n| | certificate\'s Subject must be the one |\n| | specified via the string subject. This option |\n| | implies REQUIRE X509. This option can be |\n| | combined with the ISSUER, and CIPHER options |\n| | in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE CIPHER \'cipher\' | The account must use TLS, but no valid X509 |\n| | certificate is required. Also, the encryption |\n| | used for the connection must use a specific |\n| | cipher method specified in the string cipher. |\n| | This option implies REQUIRE SSL. This option |\n| | can be combined with the ISSUER, and SUBJECT |\n| | options in any order. |\n+---------------------------+------------------------------------------------+\n\nThe REQUIRE keyword must be used only once for all specified options, and the\nAND keyword can be used to separate individual options, but it is not required.\n\nFor example, you can create a user account that requires these TLS options\nwith the following:\n\nCREATE USER \'alice\'@\'%\'\n REQUIRE SUBJECT \'/CN=alice/O=My Dom, Inc./C=US/ST=Oregon/L=Portland\'\n AND ISSUER \'/C=FI/ST=Somewhere/L=City/ O=Some Company/CN=Peter\nParker/emailAddress=p.parker@marvel.com\'\n AND CIPHER \'SHA-DES-CBC3-EDH-RSA\';\n\nIf any of these options are set for a specific user account, then any client\nwho tries to connect with that user account will have to be configured to\nconnect with TLS.\n\nSee Securing Connections for Client and Server for information on how to\nenable TLS on the client and server.\n\nResource Limit Options\n----------------------\n\nIt is possible to set per-account limits for certain server resources. The\nfollowing table shows the values that can be set per account:\n\n+--------------------------------------+--------------------------------------+\n| Limit Type | Decription |\n+--------------------------------------+--------------------------------------+\n| MAX_QUERIES_PER_HOUR | Number of statements that the |\n| | account can issue per hour |\n| | (including updates) |\n+--------------------------------------+--------------------------------------+\n| MAX_UPDATES_PER_HOUR | Number of updates (not queries) |\n| | that the account can issue per hour |\n+--------------------------------------+--------------------------------------+\n| MAX_CONNECTIONS_PER_HOUR | Number of connections that the |\n| | account can start per hour |\n+--------------------------------------+--------------------------------------+\n| MAX_USER_CONNECTIONS | Number of simultaneous connections |\n| | that can be accepted from the same |\n| | account; if it is 0, |\n| | max_connections will be used |\n| | instead; if max_connections is 0, |\n| | there is no limit for this |\n| | account\'s simultaneous connections. |\n+--------------------------------------+--------------------------------------+\n| MAX_STATEMENT_TIME | Timeout, in seconds, for statements |','','https://mariadb.com/kb/en/create-user/');
-update help_topic set description = CONCAT(description, '\n| | executed by the user. See also |\n| | Aborting Statements that Exceed a |\n| | Certain Time to Execute. |\n+--------------------------------------+--------------------------------------+\n\nIf any of these limits are set to 0, then there is no limit for that resource\nfor that user.\n\nHere is an example showing how to create a user with resource limits:\n\nCREATE USER \'someone\'@\'localhost\' WITH\n MAX_USER_CONNECTIONS 10\n MAX_QUERIES_PER_HOUR 200;\n\nThe resources are tracked per account, which means \'user\'@\'server\'; not per\nuser name or per connection.\n\nThe count can be reset for all users using FLUSH USER_RESOURCES, FLUSH\nPRIVILEGES or mysqladmin reload.\n\nPer account resource limits are stored in the user table, in the mysql\ndatabase. Columns used for resources limits are named max_questions,\nmax_updates, max_connections (for MAX_CONNECTIONS_PER_HOUR), and\nmax_user_connections (for MAX_USER_CONNECTIONS).\n\nAccount Names\n-------------\n\nAccount names have both a user name component and a host name component, and\nare specified as \'user_name\'@\'host_name\'.\n\nThe user name and host name may be unquoted, quoted as strings using double\nquotes (\") or single quotes (\'), or quoted as identifiers using backticks (`).\nYou must use quotes when using special characters (such as a hyphen) or\nwildcard characters. If you quote, you must quote the user name and host name\nseparately (for example \'user_name\'@\'host_name\').\n\nHost Name Component\n-------------------\n\nIf the host name is not provided, it is assumed to be \'%\'.\n\nHost names may contain the wildcard characters % and _. They are matched as if\nby the LIKE clause. If you need to use a wildcard character literally (for\nexample, to match a domain name with an underscore), prefix the character with\na backslash. See LIKE for more information on escaping wildcard characters.\n\nHost name matches are case-insensitive. Host names can match either domain\nnames or IP addresses. Use \'localhost\' as the host name to allow only local\nclient connections.\n\nYou can use a netmask to match a range of IP addresses using \'base_ip/netmask\'\nas the host name. A user with an IP address ip_addr will be allowed to connect\nif the following condition is true:\n\nip_addr & netmask = base_ip\n\nFor example, given a user:\n\nCREATE USER \'maria\'@\'247.150.130.0/255.255.255.0\';\n\nthe IP addresses satisfying this condition range from 247.150.130.0 to\n247.150.130.255.\n\nUsing 255.255.255.255 is equivalent to not using a netmask at all. Netmasks\ncannot be used for IPv6 addresses.\n\nNote that the credentials added when creating a user with the \'%\' wildcard\nhost will not grant access in all cases. For example, some systems come with\nan anonymous localhost user, and when connecting from localhost this will take\nprecedence.\n\nBefore MariaDB 10.6, the host name component could be up to 60 characters in\nlength. Starting from MariaDB 10.6, it can be up to 255 characters.\n\nUser Name Component\n-------------------\n\nUser names must match exactly, including case. A user name that is empty is\nknown as an anonymous account and is allowed to match a login attempt with any\nuser name component. These are described more in the next section.\n\nFor valid identifiers to use as user names, see Identifier Names.\n\nIt is possible for more than one account to match when a user connects.\nMariaDB selects the first matching account after sorting according to the\nfollowing criteria:\n\n* Accounts with an exact host name are sorted before accounts using a wildcard\nin the\nhost name. Host names using a netmask are considered to be exact for sorting.\n* Accounts with a wildcard in the host name are sorted according to the\nposition of\nthe first wildcard character. Those with a wildcard character later in the\nhost name\nsort before those with a wildcard character earlier in the host name.\n* Accounts with a non-empty user name sort before accounts with an empty user\nname.\n* Accounts with an empty user name are sorted last. As mentioned previously,\nthese are known as anonymous accounts. These are described more in the next\nsection.\n\nThe following table shows a list of example account as sorted by these\ncriteria:\n\n+---------+-------------+\n| User | Host |\n+---------+-------------+\n| joffrey | 192.168.0.3 |\n| | 192.168.0.% |\n| joffrey | 192.168.% |\n| | 192.168.% |\n+---------+-------------+\n\nOnce connected, you only have the privileges granted to the account that\nmatched, not all accounts that could have matched. For example, consider the\nfollowing commands:\n\nCREATE USER \'joffrey\'@\'192.168.0.3\';\nCREATE USER \'joffrey\'@\'%\';\nGRANT SELECT ON test.t1 to \'joffrey\'@\'192.168.0.3\';\nGRANT SELECT ON test.t2 to \'joffrey\'@\'%\';\n\nIf you connect as joffrey from 192.168.0.3, you will have the SELECT privilege\non the table test.t1, but not on the table test.t2. If you connect as joffrey\nfrom any other IP address, you will have the SELECT privilege on the table\ntest.t2, but not on the table test.t1.\n\nUsernames can be up to 80 characters long before 10.6 and starting from 10.6\nit can be 128 characters long.\n\nAnonymous Accounts\n------------------\n\nAnonymous accounts are accounts where the user name portion of the account\nname is empty. These accounts act as special catch-all accounts. If a user\nattempts to log into the system from a host, and an anonymous account exists\nwith a host name portion that matches the user\'s host, then the user will log\nin as the anonymous account if there is no more specific account match for the\nuser name that the user entered.\n\nFor example, here are some anonymous accounts:\n\nCREATE USER \'\'@\'localhost\';\nCREATE USER \'\'@\'192.168.0.3\';\n\nFixing a Legacy Default Anonymous Account\n-----------------------------------------\n\nOn some systems, the mysql.db table has some entries for the \'\'@\'%\' anonymous\naccount by default. Unfortunately, there is no matching entry in the\nmysql.user/mysql.global_priv_table table, which means that this anonymous\naccount doesn\'t exactly exist, but it does have privileges--usually on the\ndefault test database created by mysql_install_db. These account-less\nprivileges are a legacy that is leftover from a time when MySQL\'s privilege\nsystem was less advanced.\n\nThis situation means that you will run into errors if you try to create a\n\'\'@\'%\' account. For example:\n\nCREATE USER \'\'@\'%\';\nERROR 1396 (HY000): Operation CREATE USER failed for \'\'@\'%\'\n\nThe fix is to DELETE the row in the mysql.db table and then execute FLUSH\nPRIVILEGES:\n\nDELETE FROM mysql.db WHERE User=\'\' AND Host=\'%\';\nFLUSH PRIVILEGES;\n\nAnd then the account can be created:\n\nCREATE USER \'\'@\'%\';\nQuery OK, 0 rows affected (0.01 sec)\n\nSee MDEV-13486 for more information.\n\nPassword Expiry\n---------------\n\nMariaDB starting with 10.4.3\n----------------------------\nBesides automatic password expiry, as determined by default_password_lifetime,\npassword expiry times can be set on an individual user basis, overriding the\nglobal setting, for example:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\n\nSee User Password Expiry for more details.\n\nAccount Locking\n---------------\n\nMariaDB starting with 10.4.2\n----------------------------\nAccount locking permits privileged administrators to lock/unlock user\naccounts. No new client connections will be permitted if an account is locked\n(existing connections are not affected). For example:\n\nCREATE USER \'marijn\'@\'localhost\' ACCOUNT LOCK;\n\nSee Account Locking for more details.\n\nFrom MariaDB 10.4.7 and MariaDB 10.5.8, the lock_option and password_option\nclauses can occur in either order.\n\nURL: https://mariadb.com/kb/en/create-user/') WHERE help_topic_id = 104;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (105,10,'ALTER USER','Syntax\n------\n\nALTER USER [IF EXISTS] \n user_specification [,user_specification] ...\n [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]\n [WITH resource_option [resource_option] ...]\n [lock_option] [password_option]\n\nuser_specification:\n username [authentication_option]\n\nauthentication_option:\n IDENTIFIED BY \'password\'\n | IDENTIFIED BY PASSWORD \'password_hash\'\n | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule] ...\n\nauthentication_rule:\n authentication_plugin\n | authentication_plugin {USING|AS} \'authentication_string\'\n | authentication_plugin {USING|AS} PASSWORD(\'password\')\n\ntls_option\n SSL\n | X509\n | CIPHER \'cipher\'\n | ISSUER \'issuer\'\n | SUBJECT \'subject\'\n\nresource_option\n MAX_QUERIES_PER_HOUR count\n | MAX_UPDATES_PER_HOUR count\n | MAX_CONNECTIONS_PER_HOUR count\n | MAX_USER_CONNECTIONS count\n | MAX_STATEMENT_TIME time\n\npassword_option:\n PASSWORD EXPIRE\n | PASSWORD EXPIRE DEFAULT\n | PASSWORD EXPIRE NEVER\n | PASSWORD EXPIRE INTERVAL N DAY\n\nlock_option:\n ACCOUNT LOCK\n | ACCOUNT UNLOCK\n}\n\nDescription\n-----------\n\nThe ALTER USER statement modifies existing MariaDB accounts. To use it, you\nmust have the global CREATE USER privilege or the UPDATE privilege for the\nmysql database. The global SUPER privilege is also required if the read_only\nsystem variable is enabled.\n\nIf any of the specified user accounts do not yet exist, an error results. If\nan error occurs, ALTER USER will still modify the accounts that do not result\nin an error. Only one error is produced for all users which have not been\nmodified.\n\nIF EXISTS\n---------\n\nWhen the IF EXISTS clause is used, MariaDB will return a warning instead of an\nerror for each specified user that does not exist.\n\nAccount Names\n-------------\n\nFor ALTER USER statements, account names are specified as the username\nargument in the same way as they are for CREATE USER statements. See account\nnames from the CREATE USER page for details on how account names are specified.\n\nCURRENT_USER or CURRENT_USER() can also be used to alter the account logged\ninto the current session. For example, to change the current user\'s password\nto mariadb:\n\nALTER USER CURRENT_USER() IDENTIFIED BY \'mariadb\';\n\nAuthentication Options\n----------------------\n\nMariaDB starting with 10.4\n--------------------------\nFrom MariaDB 10.4, it is possible to use more than one authentication plugin\nfor each user account. For example, this can be useful to slowly migrate users\nto the more secure ed25519 authentication plugin over time, while allowing the\nold mysql_native_password authentication plugin as an alternative for the\ntransitional period. See Authentication from MariaDB 10.4 for more.\n\nWhen running ALTER USER, not specifying an authentication option in the\nIDENTIFIED VIA clause will remove that authentication method. (However this\nwas not the case before MariaDB 10.4.13, see MDEV-21928)\n\nFor example, a user is created with the ability to authenticate via both a\npassword and unix_socket:\n\nCREATE USER \'bob\'@\'localhost\' \n IDENTIFIED VIA mysql_native_password USING PASSWORD(\'pwd\')\n OR unix_socket;\n\nSHOW CREATE USER \'bob\'@\'localhost\'\\G\n*************************** 1. row ***************************\nCREATE USER for bob@localhost: CREATE USER `bob`@`localhost` \n IDENTIFIED VIA mysql_native_password\n USING \'*975B2CD4FF9AE554FE8AD33168FBFC326D2021DD\'\n OR unix_socket\n\nIf the user\'s password is updated, but unix_socket authentication is not\nspecified in the IDENTIFIED VIA clause, unix_socket authentication will no\nlonger be permitted.\n\nALTER USER \'bob\'@\'localhost\' IDENTIFIED VIA mysql_native_password \n USING PASSWORD(\'pwd2\');\n\nSHOW CREATE USER \'bob\'@\'localhost\'\\G\n*************************** 1. row ***************************\nCREATE USER for bob@localhost: CREATE USER `bob`@`localhost` \n IDENTIFIED BY PASSWORD \'*38366FDA01695B6A5A9DD4E428D9FB8F7EB75512\'\n\nIDENTIFIED BY \'password\'\n------------------------\n\nThe optional IDENTIFIED BY clause can be used to provide an account with a\npassword. The password should be specified in plain text. It will be hashed by\nthe PASSWORD function prior to being stored to the mysql.user table.\n\nFor example, if our password is mariadb, then we can set the account\'s\npassword with:\n\nALTER USER foo2@test IDENTIFIED BY \'mariadb\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED BY PASSWORD \'password_hash\'\n--------------------------------------\n\nThe optional IDENTIFIED BY PASSWORD clause can be used to provide an account\nwith a password that has already been hashed. The password should be specified\nas a hash that was provided by the PASSWORD#function. It will be stored to the\nmysql.user table as-is.\n\nFor example, if our password is mariadb, then we can find the hash with:\n\nSELECT PASSWORD(\'mariadb\');\n+-------------------------------------------+\n| PASSWORD(\'mariadb\') |\n+-------------------------------------------+\n| *54958E764CE10E50764C2EECBB71D01F08549980 |\n+-------------------------------------------+\n\nAnd then we can set an account\'s password with the hash:\n\nALTER USER foo2@test \n IDENTIFIED BY PASSWORD \'*54958E764CE10E50764C2EECBB71D01F08549980\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED {VIA|WITH} authentication_plugin\n-------------------------------------------\n\nThe optional IDENTIFIED VIA authentication_plugin allows you to specify that\nthe account should be authenticated by a specific authentication plugin. The\nplugin name must be an active authentication plugin as per SHOW PLUGINS. If it\ndoesn\'t show up in that output, then you will need to install it with INSTALL\nPLUGIN or INSTALL SONAME.\n\nFor example, this could be used with the PAM authentication plugin:\n\nALTER USER foo2@test IDENTIFIED VIA pam;\n\nSome authentication plugins allow additional arguments to be specified after a\nUSING or AS keyword. For example, the PAM authentication plugin accepts a\nservice name:\n\nALTER USER foo2@test IDENTIFIED VIA pam USING \'mariadb\';\n\nThe exact meaning of the additional argument would depend on the specific\nauthentication plugin.\n\nIn MariaDB 10.4 and later, the USING or AS keyword can also be used to provide\na plain-text password to a plugin if it\'s provided as an argument to the\nPASSWORD() function. This is only valid for authentication plugins that have\nimplemented a hook for the PASSWORD() function. For example, the ed25519\nauthentication plugin supports this:\n\nALTER USER safe@\'%\' IDENTIFIED VIA ed25519 USING PASSWORD(\'secret\');\n\nTLS Options\n-----------\n\nBy default, MariaDB transmits data between the server and clients without\nencrypting it. This is generally acceptable when the server and client run on\nthe same host or in networks where security is guaranteed through other means.\nHowever, in cases where the server and client exist on separate networks or\nthey are in a high-risk network, the lack of encryption does introduce\nsecurity concerns as a malicious actor could potentially eavesdrop on the\ntraffic as it is sent over the network between them.\n\nTo mitigate this concern, MariaDB allows you to encrypt data in transit\nbetween the server and clients using the Transport Layer Security (TLS)\nprotocol. TLS was formerly known as Secure Socket Layer (SSL), but strictly\nspeaking the SSL protocol is a predecessor to TLS and, that version of the\nprotocol is now considered insecure. The documentation still uses the term SSL\noften and for compatibility reasons TLS-related server system and status\nvariables still use the prefix ssl_, but internally, MariaDB only supports its\nsecure successors.\n\nSee Secure Connections Overview for more information about how to determine\nwhether your MariaDB server has TLS support.\n\nYou can set certain TLS-related restrictions for specific user accounts. For\ninstance, you might use this with user accounts that require access to\nsensitive data while sending it across networks that you do not control. These\nrestrictions can be enabled for a user account with the CREATE USER, ALTER\nUSER, or GRANT statements. The following options are available:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| REQUIRE NONE | TLS is not required for this account, but can |\n| | still be used. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SSL | The account must use TLS, but no valid X509 |\n| | certificate is required. This option cannot |\n| | be combined with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE X509 | The account must use TLS and must have a |\n| | valid X509 certificate. This option implies |\n| | REQUIRE SSL. This option cannot be combined |\n| | with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE ISSUER \'issuer\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the Certificate |\n| | Authority must be the one specified via the |\n| | string issuer. This option implies REQUIRE |\n| | X509. This option can be combined with the |\n| | SUBJECT, and CIPHER options in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SUBJECT \'subject\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the |\n| | certificate\'s Subject must be the one |\n| | specified via the string subject. This option |\n| | implies REQUIRE X509. This option can be |\n| | combined with the ISSUER, and CIPHER options |\n| | in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE CIPHER \'cipher\' | The account must use TLS, but no valid X509 |\n| | certificate is required. Also, the encryption |\n| | used for the connection must use a specific |\n| | cipher method specified in the string cipher. |\n| | This option implies REQUIRE SSL. This option |\n| | can be combined with the ISSUER, and SUBJECT |\n| | options in any order. |\n+---------------------------+------------------------------------------------+\n\nThe REQUIRE keyword must be used only once for all specified options, and the\nAND keyword can be used to separate individual options, but it is not required.\n\nFor example, you can alter a user account to require these TLS options with\nthe following:\n\nALTER USER \'alice\'@\'%\'\n REQUIRE SUBJECT \'/CN=alice/O=My Dom, Inc./C=US/ST=Oregon/L=Portland\' AND\n ISSUER \'/C=FI/ST=Somewhere/L=City/ O=Some Company/CN=Peter\nParker/emailAddress=p.parker@marvel.com\'\n AND CIPHER \'SHA-DES-CBC3-EDH-RSA\';\n\nIf any of these options are set for a specific user account, then any client\nwho tries to connect with that user account will have to be configured to\nconnect with TLS.\n\nSee Securing Connections for Client and Server for information on how to\nenable TLS on the client and server.\n\nResource Limit Options\n----------------------\n\nIt is possible to set per-account limits for certain server resources. The\nfollowing table shows the values that can be set per account:\n\n+------------------------------------+---------------------------------------+\n| Limit Type | Description |\n+------------------------------------+---------------------------------------+\n| MAX_QUERIES_PER_HOUR | Number of statements that the |\n| | account can issue per hour |\n| | (including updates) |\n+------------------------------------+---------------------------------------+\n| MAX_UPDATES_PER_HOUR | Number of updates (not queries) that |\n| | the account can issue per hour |\n+------------------------------------+---------------------------------------+\n| MAX_CONNECTIONS_PER_HOUR | Number of connections that the |\n| | account can start per hour |\n+------------------------------------+---------------------------------------+\n| MAX_USER_CONNECTIONS | Number of simultaneous connections |\n| | that can be accepted from the same |\n| | account; if it is 0, max_connections |\n| | will be used instead; if |\n| | max_connections is 0, there is no |\n| | limit for this account\'s |\n| | simultaneous connections. |','','https://mariadb.com/kb/en/alter-user/');
-update help_topic set description = CONCAT(description, '\n+------------------------------------+---------------------------------------+\n| MAX_STATEMENT_TIME | Timeout, in seconds, for statements |\n| | executed by the user. See also |\n| | Aborting Statements that Exceed a |\n| | Certain Time to Execute. |\n+------------------------------------+---------------------------------------+\n\nIf any of these limits are set to 0, then there is no limit for that resource\nfor that user.\n\nHere is an example showing how to set an account\'s resource limits:\n\nALTER USER \'someone\'@\'localhost\' WITH\n MAX_USER_CONNECTIONS 10\n MAX_QUERIES_PER_HOUR 200;\n\nThe resources are tracked per account, which means \'user\'@\'server\'; not per\nuser name or per connection.\n\nThe count can be reset for all users using FLUSH USER_RESOURCES, FLUSH\nPRIVILEGES or mysqladmin reload.\n\nPer account resource limits are stored in the user table, in the mysql\ndatabase. Columns used for resources limits are named max_questions,\nmax_updates, max_connections (for MAX_CONNECTIONS_PER_HOUR), and\nmax_user_connections (for MAX_USER_CONNECTIONS).\n\nPassword Expiry\n---------------\n\nMariaDB starting with 10.4.3\n----------------------------\nBesides automatic password expiry, as determined by default_password_lifetime,\npassword expiry times can be set on an individual user basis, overriding the\nglobal setting, for example:\n\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE NEVER;\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n\nSee User Password Expiry for more details.\n\nAccount Locking\n---------------\n\nMariaDB starting with 10.4.2\n----------------------------\nAccount locking permits privileged administrators to lock/unlock user\naccounts. No new client connections will be permitted if an account is locked\n(existing connections are not affected). For example:\n\nALTER USER \'marijn\'@\'localhost\' ACCOUNT LOCK;\n\nSee Account Locking for more details.\n\nFrom MariaDB 10.4.7 and MariaDB 10.5.8, the lock_option and password_option\nclauses can occur in either order.\n\nURL: https://mariadb.com/kb/en/alter-user/') WHERE help_topic_id = 105;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (106,10,'DROP USER','Syntax\n------\n\nDROP USER [IF EXISTS] user_name [, user_name] ...\n\nDescription\n-----------\n\nThe DROP USER statement removes one or more MariaDB accounts. It removes\nprivilege rows for the account from all grant tables. To use this statement,\nyou must have the global CREATE USER privilege or the DELETE privilege for the\nmysql database. Each account is named using the same format as for the CREATE\nUSER statement; for example, \'jeffrey\'@\'localhost\'. If you specify only the\nuser name part of the account name, a host name part of \'%\' is used. For\nadditional information about specifying account names, see CREATE USER.\n\nNote that, if you specify an account that is currently connected, it will not\nbe deleted until the connection is closed. The connection will not be\nautomatically closed.\n\nIf any of the specified user accounts do not exist, ERROR 1396 (HY000)\nresults. If an error occurs, DROP USER will still drop the accounts that do\nnot result in an error. Only one error is produced for all users which have\nnot been dropped:\n\nERROR 1396 (HY000): Operation DROP USER failed for \'u1\'@\'%\',\'u2\'@\'%\'\n\nFailed CREATE or DROP operations, for both users and roles, produce the same\nerror code.\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will return a note instead of an\nerror if the user does not exist.\n\nExamples\n--------\n\nDROP USER bob;\n\nDROP USER foo2@localhost,foo2@\'127.%\';\n\nIF EXISTS:\n\nDROP USER bob;\nERROR 1396 (HY000): Operation DROP USER failed for \'bob\'@\'%\'\n\nDROP USER IF EXISTS bob;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+---------------------------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------------------------+\n| Note | 1974 | Can\'t drop user \'bob\'@\'%\'; it doesn\'t exist |\n+-------+------+---------------------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-user/','','https://mariadb.com/kb/en/drop-user/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (107,10,'GRANT','Syntax\n------\n\nGRANT\n priv_type [(column_list)]\n [, priv_type [(column_list)]] ...\n ON [object_type] priv_level\n TO user_specification [ user_options ...]\n\nuser_specification:\n username [authentication_option]\n | PUBLIC\nauthentication_option:\n IDENTIFIED BY \'password\'\n | IDENTIFIED BY PASSWORD \'password_hash\'\n | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule ...]\n\nauthentication_rule:\n authentication_plugin\n | authentication_plugin {USING|AS} \'authentication_string\'\n | authentication_plugin {USING|AS} PASSWORD(\'password\')\n\nGRANT PROXY ON username\n TO user_specification [, user_specification ...]\n [WITH GRANT OPTION]\n\nGRANT rolename TO grantee [, grantee ...]\n [WITH ADMIN OPTION]\n\ngrantee:\n rolename\n username [authentication_option]\n\nuser_options:\n [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]\n [WITH with_option [with_option] ...]\n\nobject_type:\n TABLE\n | FUNCTION\n | PROCEDURE\n | PACKAGE\n\npriv_level:\n *\n | *.*\n | db_name.*\n | db_name.tbl_name\n | tbl_name\n | db_name.routine_name\n\nwith_option:\n GRANT OPTION\n | resource_option\n\nresource_option:\n MAX_QUERIES_PER_HOUR count\n | MAX_UPDATES_PER_HOUR count\n | MAX_CONNECTIONS_PER_HOUR count\n | MAX_USER_CONNECTIONS count\n | MAX_STATEMENT_TIME time\n\ntls_option:\n SSL\n | X509\n | CIPHER \'cipher\'\n | ISSUER \'issuer\'\n | SUBJECT \'subject\'\n\nDescription\n-----------\n\nThe GRANT statement allows you to grant privileges or roles to accounts. To\nuse GRANT, you must have the GRANT OPTION privilege, and you must have the\nprivileges that you are granting.\n\nUse the REVOKE statement to revoke privileges granted with the GRANT statement.\n\nUse the SHOW GRANTS statement to determine what privileges an account has.\n\nAccount Names\n-------------\n\nFor GRANT statements, account names are specified as the username argument in\nthe same way as they are for CREATE USER statements. See account names from\nthe CREATE USER page for details on how account names are specified.\n\nImplicit Account Creation\n-------------------------\n\nThe GRANT statement also allows you to implicitly create accounts in some\ncases.\n\nIf the account does not yet exist, then GRANT can implicitly create it. To\nimplicitly create an account with GRANT, a user is required to have the same\nprivileges that would be required to explicitly create the account with the\nCREATE USER statement.\n\nIf the NO_AUTO_CREATE_USER SQL_MODE is set, then accounts can only be created\nif authentication information is specified, or with a CREATE USER statement.\nIf no authentication information is provided, GRANT will produce an error when\nthe specified account does not exist, for example:\n\nshow variables like \'%sql_mode%\' ;\n+---------------+--------------------------------------------+\n| Variable_name | Value |\n+---------------+--------------------------------------------+\n| sql_mode | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |\n+---------------+--------------------------------------------+\n\nGRANT USAGE ON *.* TO \'user123\'@\'%\' IDENTIFIED BY \'\';\nERROR 1133 (28000): Can\'t find any matching row in the user table\n\nGRANT USAGE ON *.* TO \'user123\'@\'%\' \n IDENTIFIED VIA PAM using \'mariadb\' require ssl ;\nQuery OK, 0 rows affected (0.00 sec)\n\nselect host, user from mysql.user where user=\'user123\' ;\n\n+------+----------+\n| host | user |\n+------+----------+\n| % | user123 |\n+------+----------+\n\nPrivilege Levels\n----------------\n\nPrivileges can be set globally, for an entire database, for a table or\nroutine, or for individual columns in a table. Certain privileges can only be\nset at certain levels.\n\n* Global privileges priv_type are granted using *.* for\npriv_level. Global privileges include privileges to administer the database\nand manage user accounts, as well as privileges for all tables, functions, and\nprocedures. Global privileges are stored in the mysql.user table prior to\nMariaDB 10.4, and in mysql.global_priv table afterwards.\n* Database privileges priv_type are granted using db_name.*\nfor priv_level, or using just * to use default database. Database\nprivileges include privileges to create tables and functions, as well as\nprivileges for all tables, functions, and procedures in the database. Database\nprivileges are stored in the mysql.db table.\n* Table privileges priv_type are granted using db_name.tbl_name\nfor priv_level, or using just tbl_name to specify a table in the default\ndatabase. The TABLE keyword is optional. Table privileges include the\nability to select and change data in the table. Certain table privileges can\nbe granted for individual columns.\n* Column privileges priv_type are granted by specifying a table for\npriv_level and providing a column list after the privilege type. They allow\nyou to control exactly which columns in a table users can select and change.\n* Function privileges priv_type are granted using FUNCTION db_name.routine_name\nfor priv_level, or using just FUNCTION routine_name to specify a function\nin the default database.\n* Procedure privileges priv_type are granted using PROCEDURE\ndb_name.routine_name\nfor priv_level, or using just PROCEDURE routine_name to specify a procedure\nin the default database.\n\nThe USAGE Privilege\n-------------------\n\nThe USAGE privilege grants no real privileges. The SHOW GRANTS statement will\nshow a global USAGE privilege for a newly-created user. You can use USAGE with\nthe GRANT statement to change options like GRANT OPTION and\nMAX_USER_CONNECTIONS without changing any account privileges.\n\nThe ALL PRIVILEGES Privilege\n----------------------------\n\nThe ALL PRIVILEGES privilege grants all available privileges. Granting all\nprivileges only affects the given privilege level. For example, granting all\nprivileges on a table does not grant any privileges on the database or\nglobally.\n\nUsing ALL PRIVILEGES does not grant the special GRANT OPTION privilege.\n\nYou can use ALL instead of ALL PRIVILEGES.\n\nThe GRANT OPTION Privilege\n--------------------------\n\nUse the WITH GRANT OPTION clause to give users the ability to grant privileges\nto other users at the given privilege level. Users with the GRANT OPTION\nprivilege can only grant privileges they have. They cannot grant privileges at\na higher privilege level than they have the GRANT OPTION privilege.\n\nThe GRANT OPTION privilege cannot be set for individual columns. If you use\nWITH GRANT OPTION when specifying column privileges, the GRANT OPTION\nprivilege will be granted for the entire table.\n\nUsing the WITH GRANT OPTION clause is equivalent to listing GRANT OPTION as a\nprivilege.\n\nGlobal Privileges\n-----------------\n\nThe following table lists the privileges that can be granted globally. You can\nalso grant all database, table, and function privileges globally. When granted\nglobally, these privileges apply to all databases, tables, or functions,\nincluding those created later.\n\nTo set a global privilege, use *.* for priv_level.\n\nBINLOG ADMIN\n------------\n\nEnables administration of the binary log, including the PURGE BINARY LOGS\nstatement and setting the system variables:\n\n* binlog_annotate_row_events\n* binlog_cache_size\n* binlog_commit_wait_count\n* binlog_commit_wait_usec\n* binlog_direct_non_transactional_updates\n* binlog_expire_logs_seconds\n* binlog_file_cache_size\n* binlog_format\n* binlog_row_image\n* binlog_row_metadata\n* binlog_stmt_cache_size\n* expire_logs_days\n* log_bin_compress\n* log_bin_compress_min_len\n* log_bin_trust_function_creators\n* max_binlog_cache_size\n* max_binlog_size\n* max_binlog_stmt_cache_size\n* sql_log_bin and\n* sync_binlog.\n\nAdded in MariaDB 10.5.2.\n\nBINLOG MONITOR\n--------------\n\nNew name for REPLICATION CLIENT from MariaDB 10.5.2, (REPLICATION CLIENT still\nsupported as an alias for compatibility purposes). Permits running SHOW\ncommands related to the binary log, in particular the SHOW BINLOG STATUS and\nSHOW BINARY LOGS statements. Unlike REPLICATION CLIENT prior to MariaDB 10.5,\nSHOW REPLICA STATUS isn\'t included in this privilege, and REPLICA MONITOR is\nrequired.\n\nBINLOG REPLAY\n-------------\n\nEnables replaying the binary log with the BINLOG statement (generated by\nmariadb-binlog), executing SET timestamp when secure_timestamp is set to\nreplication, and setting the session values of system variables usually\nincluded in BINLOG output, in particular:\n\n* gtid_domain_id\n* gtid_seq_no\n* pseudo_thread_id\n* server_id.\n\nAdded in MariaDB 10.5.2\n\nCONNECTION ADMIN\n----------------\n\nEnables administering connection resource limit options. This includes\nignoring the limits specified by:\n\n* max_connections\n* max_user_connections and\n* max_password_errors.\n\nThe statements specified in init_connect are not executed, killing connections\nand queries owned by other users is permitted. The following\nconnection-related system variables can be changed:\n\n* connect_timeout\n* disconnect_on_expired_password\n* extra_max_connections\n* init_connect\n* max_connections\n* max_connect_errors\n* max_password_errors\n* proxy_protocol_networks\n* secure_auth\n* slow_launch_time\n* thread_pool_exact_stats\n* thread_pool_dedicated_listener\n* thread_pool_idle_timeout\n* thread_pool_max_threads\n* thread_pool_min_threads\n* thread_pool_oversubscribe\n* thread_pool_prio_kickup_timer\n* thread_pool_priority\n* thread_pool_size, and\n* thread_pool_stall_limit.\n\nAdded in MariaDB 10.5.2.\n\nCREATE USER\n-----------\n\nCreate a user using the CREATE USER statement, or implicitly create a user\nwith the GRANT statement.\n\nFEDERATED ADMIN\n---------------\n\nExecute CREATE SERVER, ALTER SERVER, and DROP SERVER statements. Added in\nMariaDB 10.5.2.\n\nFILE\n----\n\nRead and write files on the server, using statements like LOAD DATA INFILE or\nfunctions like LOAD_FILE(). Also needed to create CONNECT outward tables.\nMariaDB server must have the permissions to access those files.\n\nGRANT OPTION\n------------\n\nGrant global privileges. You can only grant privileges that you have.\n\nPROCESS\n-------\n\nShow information about the active processes, for example via SHOW PROCESSLIST\nor mysqladmin processlist. If you have the PROCESS privilege, you can see all\nthreads. Otherwise, you can see only your own threads (that is, threads\nassociated with the MariaDB account that you are using).\n\nREAD_ONLY ADMIN\n---------------\n\nUser can set the read_only system variable and allows the user to perform\nwrite operations, even when the read_only option is active. Added in MariaDB\n10.5.2.\n\nFrom MariaDB 10.11.0, the READ_ONLY ADMIN privilege has been removed from\nSUPER. The benefit of this is that one can remove the READ_ONLY ADMIN\nprivilege from all users and ensure that no one can make any changes on any\nnon-temporary tables. This is useful on replicas when one wants to ensure that\nthe replica is kept identical to the primary.\n\nRELOAD\n------\n\nExecute FLUSH statements or equivalent mariadb-admin/mysqladmin commands.\n\nREPLICATION CLIENT\n------------------\n\nExecute SHOW MASTER STATUS and SHOW BINARY LOGS informative statements.\nRenamed to BINLOG MONITOR in MariaDB 10.5.2 (but still supported as an alias\nfor compatibility reasons). SHOW SLAVE STATUS was part of REPLICATION CLIENT\nprior to MariaDB 10.5.\n\nREPLICATION MASTER ADMIN\n------------------------\n\nPermits administration of primary servers, including the SHOW REPLICA HOSTS\nstatement, and setting the gtid_binlog_state, gtid_domain_id,\nmaster_verify_checksum and server_id system variables. Added in MariaDB 10.5.2.\n\nREPLICA MONITOR\n---------------\n\nPermit SHOW REPLICA STATUS and SHOW RELAYLOG EVENTS. From MariaDB 10.5.9.\n\nWhen a user would upgrade from an older major release to a MariaDB 10.5 minor\nrelease prior to MariaDB 10.5.9, certain user accounts would lose\ncapabilities. For example, a user account that had the REPLICATION CLIENT\nprivilege in older major releases could run SHOW REPLICA STATUS, but after\nupgrading to a MariaDB 10.5 minor release prior to MariaDB 10.5.9, they could\nno longer run SHOW REPLICA STATUS, because that statement was changed to\nrequire the REPLICATION REPLICA ADMIN privilege.\n\nThis issue is fixed in MariaDB 10.5.9 with this new privilege, which now\ngrants the user the ability to execute SHOW [ALL] (SLAVE | REPLICA) STATUS.\n\nWhen a database is upgraded from an older major release to MariaDB Server\n10.5.9 or later, any user accounts with the REPLICATION CLIENT or REPLICATION\nSLAVE privileges will automatically be granted the new REPLICA MONITOR\nprivilege. The privilege fix occurs when the server is started up, not when\nmariadb-upgrade is performed.\n\nHowever, when a database is upgraded from an early 10.5 minor release to\n10.5.9 and later, the user will have to fix any user account privileges\nmanually.\n\nREPLICATION REPLICA\n-------------------\n\nSynonym for REPLICATION SLAVE. From MariaDB 10.5.1.\n\nREPLICATION SLAVE\n-----------------\n\nAccounts used by replica servers on the primary need this privilege. This is\nneeded to get the updates made on the master. From MariaDB 10.5.1, REPLICATION\nREPLICA is an alias for REPLICATION SLAVE.\n\nREPLICATION SLAVE ADMIN\n-----------------------\n\nPermits administering replica servers, including START REPLICA/SLAVE, STOP\nREPLICA/SLAVE, CHANGE MASTER, SHOW REPLICA/SLAVE STATUS, SHOW RELAYLOG EVENTS\nstatements, replaying the binary log with the BINLOG statement (generated by\nmariadb-binlog), and setting the system variables:\n\n* gtid_cleanup_batch_size\n* gtid_ignore_duplicates\n* gtid_pos_auto_engines\n* gtid_slave_pos\n* gtid_strict_mode\n* init_slave\n* read_binlog_speed_limit\n* relay_log_purge\n* relay_log_recovery\n* replicate_do_db\n* replicate_do_table\n* replicate_events_marked_for_skip\n* replicate_ignore_db\n* replicate_ignore_table\n* replicate_wild_do_table\n* replicate_wild_ignore_table\n* slave_compressed_protocol\n* slave_ddl_exec_mode\n* slave_domain_parallel_threads\n* slave_exec_mode\n* slave_max_allowed_packet\n* slave_net_timeout\n* slave_parallel_max_queued\n* slave_parallel_mode\n* slave_parallel_threads\n* slave_parallel_workers\n* slave_run_triggers_for_rbr\n* slave_sql_verify_checksum\n* slave_transaction_retry_interval\n* slave_type_conversions\n* sync_master_info\n* sync_relay_log, and\n* sync_relay_log_info.\n\nAdded in MariaDB 10.5.2.\n\nSET USER\n--------\n','','https://mariadb.com/kb/en/grant/');
-update help_topic set description = CONCAT(description, '\nEnables setting the DEFINER when creating triggers, views, stored functions\nand stored procedures. Added in MariaDB 10.5.2.\n\nSHOW DATABASES\n--------------\n\nList all databases using the SHOW DATABASES statement. Without the SHOW\nDATABASES privilege, you can still issue the SHOW DATABASES statement, but it\nwill only list databases containing tables on which you have privileges.\n\nSHUTDOWN\n--------\n\nShut down the server using SHUTDOWN or the mysqladmin shutdown command.\n\nSUPER\n-----\n\nExecute superuser statements: CHANGE MASTER TO, KILL (users who do not have\nthis privilege can only KILL their own threads), PURGE LOGS, SET global system\nvariables, or the mysqladmin debug command. Also, this permission allows the\nuser to write data even if the read_only startup option is set, enable or\ndisable logging, enable or disable replication on replica, specify a DEFINER\nfor statements that support that clause, connect once reaching the\nMAX_CONNECTIONS. If a statement has been specified for the init-connect mysqld\noption, that command will not be executed when a user with SUPER privileges\nconnects to the server.\n\nThe SUPER privilege has been split into multiple smaller privileges from\nMariaDB 10.5.2 to allow for more fine-grained privileges, although it remains\nan alias for these smaller privileges.\n\nFrom MariaDB 10.11.0, the READ_ONLY ADMIN privilege has been removed from\nSUPER. The benefit of this is that one can remove the READ_ONLY ADMIN\nprivilege from all users and ensure that no one can make any changes on any\nnon-temporary tables. This is useful on replicas when one wants to ensure that\nthe replica is kept identical to the primary.\n\nDatabase Privileges\n-------------------\n\nThe following table lists the privileges that can be granted at the database\nlevel. You can also grant all table and function privileges at the database\nlevel. Table and function privileges on a database apply to all tables or\nfunctions in that database, including those created later.\n\nTo set a privilege for a database, specify the database using db_name.* for\npriv_level, or just use * to specify the default database.\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| CREATE | Create a database using the CREATE |\n| | DATABASE statement, when the privilege |\n| | is granted for a database. You can |\n| | grant the CREATE privilege on |\n| | databases that do not yet exist. This |\n| | also grants the CREATE privilege on |\n| | all tables in the database. |\n+----------------------------------+-----------------------------------------+\n| CREATE ROUTINE | Create Stored Programs using the |\n| | CREATE PROCEDURE and CREATE FUNCTION |\n| | statements. |\n+----------------------------------+-----------------------------------------+\n| CREATE TEMPORARY TABLES | Create temporary tables with the |\n| | CREATE TEMPORARY TABLE statement. This |\n| | privilege enable writing and dropping |\n| | those temporary tables |\n+----------------------------------+-----------------------------------------+\n| DROP | Drop a database using the DROP |\n| | DATABASE statement, when the privilege |\n| | is granted for a database. This also |\n| | grants the DROP privilege on all |\n| | tables in the database. |\n+----------------------------------+-----------------------------------------+\n| EVENT | Create, drop and alter EVENTs. |\n+----------------------------------+-----------------------------------------+\n| GRANT OPTION | Grant database privileges. You can |\n| | only grant privileges that you have. |\n+----------------------------------+-----------------------------------------+\n| LOCK TABLES | Acquire explicit locks using the LOCK |\n| | TABLES statement; you also need to |\n| | have the SELECT privilege on a table, |\n| | in order to lock it. |\n+----------------------------------+-----------------------------------------+\n\nTable Privileges\n----------------\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| ALTER | Change the structure of an existing |\n| | table using the ALTER TABLE statement. |\n+----------------------------------+-----------------------------------------+\n| CREATE | Create a table using the CREATE TABLE |\n| | statement. You can grant the CREATE |\n| | privilege on tables that do not yet |\n| | exist. |\n+----------------------------------+-----------------------------------------+\n| CREATE VIEW | Create a view using the CREATE_VIEW |\n| | statement. |\n+----------------------------------+-----------------------------------------+\n| DELETE | Remove rows from a table using the |\n| | DELETE statement. |\n+----------------------------------+-----------------------------------------+\n| DELETE HISTORY | Remove historical rows from a table |\n| | using the DELETE HISTORY statement. |\n| | Displays as DELETE VERSIONING ROWS |\n| | when running SHOW GRANTS until MariaDB |\n| | 10.3.15 and until MariaDB 10.4.5 |\n| | (MDEV-17655), or when running SHOW |\n| | PRIVILEGES until MariaDB 10.5.2, |\n| | MariaDB 10.4.13 and MariaDB 10.3.23 |\n| | (MDEV-20382). From MariaDB 10.3.4. |\n| | From MariaDB 10.3.5, if a user has the |\n| | SUPER privilege but not this |\n| | privilege, running mysql_upgrade will |\n| | grant this privilege as well. |\n+----------------------------------+-----------------------------------------+\n| DROP | Drop a table using the DROP TABLE |\n| | statement or a view using the DROP |\n| | VIEW statement. Also required to |\n| | execute the TRUNCATE TABLE statement. |\n+----------------------------------+-----------------------------------------+\n| GRANT OPTION | Grant table privileges. You can only |\n| | grant privileges that you have. |\n+----------------------------------+-----------------------------------------+\n| INDEX | Create an index on a table using the |\n| | CREATE INDEX statement. Without the |\n| | INDEX privilege, you can still create |\n| | indexes when creating a table using |\n| | the CREATE TABLE statement if the you |\n| | have the CREATE privilege, and you can |\n| | create indexes using the ALTER TABLE |\n| | statement if you have the ALTER |\n| | privilege. |\n+----------------------------------+-----------------------------------------+\n| INSERT | Add rows to a table using the INSERT |\n| | statement. The INSERT privilege can |\n| | also be set on individual columns; see |\n| | Column Privileges below for details. |\n+----------------------------------+-----------------------------------------+\n| REFERENCES | Unused. |\n+----------------------------------+-----------------------------------------+\n| SELECT | Read data from a table using the |\n| | SELECT statement. The SELECT privilege |\n| | can also be set on individual columns; |\n| | see Column Privileges below for |\n| | details. |\n+----------------------------------+-----------------------------------------+\n| SHOW VIEW | Show the CREATE VIEW statement to |\n| | create a view using the SHOW CREATE |\n| | VIEW statement. |\n+----------------------------------+-----------------------------------------+\n| TRIGGER | Execute triggers associated to tables |\n| | you update, execute the CREATE TRIGGER |\n| | and DROP TRIGGER statements. You will |\n| | still be able to see triggers. |\n+----------------------------------+-----------------------------------------+\n| UPDATE | Update existing rows in a table using |\n| | the UPDATE statement. UPDATE |\n| | statements usually include a WHERE |\n| | clause to update only certain rows. |\n| | You must have SELECT privileges on the |\n| | table or the appropriate columns for |\n| | the WHERE clause. The UPDATE privilege |\n| | can also be set on individual columns; |\n| | see Column Privileges below for |\n| | details. |\n+----------------------------------+-----------------------------------------+\n\nColumn Privileges\n-----------------\n\nSome table privileges can be set for individual columns of a table. To use\ncolumn privileges, specify the table explicitly and provide a list of column\nnames after the privilege type. For example, the following statement would\nallow the user to read the names and positions of employees, but not other\ninformation from the same table, such as salaries.\n\nGRANT SELECT (name, position) on Employee to \'jeffrey\'@\'localhost\';\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| INSERT (column_list) | Add rows specifying values in columns |\n| | using the INSERT statement. If you |\n| | only have column-level INSERT |\n| | privileges, you must specify the |\n| | columns you are setting in the INSERT |\n| | statement. All other columns will be |\n| | set to their default values, or NULL. |\n+----------------------------------+-----------------------------------------+\n| REFERENCES (column_list) | Unused. |\n+----------------------------------+-----------------------------------------+\n| SELECT (column_list) | Read values in columns using the |\n| | SELECT statement. You cannot access or |\n| | query any columns for which you do not |\n| | have SELECT privileges, including in |\n| | WHERE, ON, GROUP BY, and ORDER BY |\n| | clauses. |\n+----------------------------------+-----------------------------------------+\n| UPDATE (column_list) | Update values in columns of existing |\n| | rows using the UPDATE statement. |\n| | UPDATE statements usually include a |\n| | WHERE clause to update only certain |\n| | rows. You must have SELECT privileges |\n| | on the table or the appropriate |\n| | columns for the WHERE clause. |\n+----------------------------------+-----------------------------------------+\n\nFunction Privileges\n-------------------\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |') WHERE help_topic_id = 107;
-update help_topic set description = CONCAT(description, '\n+----------------------------------+-----------------------------------------+\n| ALTER ROUTINE | Change the characteristics of a stored |\n| | function using the ALTER FUNCTION |\n| | statement. |\n+----------------------------------+-----------------------------------------+\n| EXECUTE | Use a stored function. You need SELECT |\n| | privileges for any tables or columns |\n| | accessed by the function. |\n+----------------------------------+-----------------------------------------+\n| GRANT OPTION | Grant function privileges. You can |\n| | only grant privileges that you have. |\n+----------------------------------+-----------------------------------------+\n\nProcedure Privileges\n--------------------\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| ALTER ROUTINE | Change the characteristics of a stored |\n| | procedure using the ALTER PROCEDURE |\n| | statement. |\n+----------------------------------+-----------------------------------------+\n| EXECUTE | Execute a stored procedure using the |\n| | CALL statement. The privilege to call |\n| | a procedure may allow you to perform |\n| | actions you wouldn\'t otherwise be able |\n| | to do, such as insert rows into a |\n| | table. |\n+----------------------------------+-----------------------------------------+\n| GRANT OPTION | Grant procedure privileges. You can |\n| | only grant privileges that you have. |\n+----------------------------------+-----------------------------------------+\n\nGRANT EXECUTE ON PROCEDURE mysql.create_db TO maintainer;\n\nProxy Privileges\n----------------\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| PROXY | Permits one user to be a proxy for |\n| | another. |\n+----------------------------------+-----------------------------------------+\n\nThe PROXY privilege allows one user to proxy as another user, which means\ntheir privileges change to that of the proxy user, and the CURRENT_USER()\nfunction returns the user name of the proxy user.\n\nThe PROXY privilege only works with authentication plugins that support it.\nThe default mysql_native_password authentication plugin does not support proxy\nusers.\n\nThe pam authentication plugin is the only plugin included with MariaDB that\ncurrently supports proxy users. The PROXY privilege is commonly used with the\npam authentication plugin to enable user and group mapping with PAM.\n\nFor example, to grant the PROXY privilege to an anonymous account that\nauthenticates with the pam authentication plugin, you could execute the\nfollowing:\n\nCREATE USER \'dba\'@\'%\' IDENTIFIED BY \'strongpassword\';\nGRANT ALL PRIVILEGES ON *.* TO \'dba\'@\'%\' ;\n\nCREATE USER \'\'@\'%\' IDENTIFIED VIA pam USING \'mariadb\';\nGRANT PROXY ON \'dba\'@\'%\' TO \'\'@\'%\';\n\nA user account can only grant the PROXY privilege for a specific user account\nif the granter also has the PROXY privilege for that specific user account,\nand if that privilege is defined WITH GRANT OPTION. For example, the following\nexample fails because the granter does not have the PROXY privilege for that\nspecific user account at all:\n\nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n\nSHOW GRANTS;\n+------------------------------------------------------------------------------\n----------------------------------------+\n| Grants for alice@localhost \n |\n+------------------------------------------------------------------------------\n----------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\' IDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' |\n+------------------------------------------------------------------------------\n----------------------------------------+\n\nGRANT PROXY ON \'dba\'@\'localhost\' TO \'bob\'@\'localhost\';\nERROR 1698 (28000): Access denied for user \'alice\'@\'localhost\'\n\nAnd the following example fails because the granter does have the PROXY\nprivilege for that specific user account, but it is not defined WITH GRANT\nOPTION:\n\nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n\nSHOW GRANTS;\n+------------------------------------------------------------------------------\n----------------------------------------+\n| Grants for alice@localhost \n |\n+------------------------------------------------------------------------------\n----------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\' IDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' |\n| GRANT PROXY ON \'dba\'@\'localhost\' TO \'alice\'@\'localhost\' \n |\n+------------------------------------------------------------------------------\n----------------------------------------+\n\nGRANT PROXY ON \'dba\'@\'localhost\' TO \'bob\'@\'localhost\';\nERROR 1698 (28000): Access denied for user \'alice\'@\'localhost\'\n\nBut the following example succeeds because the granter does have the PROXY\nprivilege for that specific user account, and it is defined WITH GRANT OPTION:\n\nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n\nSHOW GRANTS;\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n| Grants for alice@localhost \n |\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\' IDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' WITH GRANT OPTION |\n| GRANT PROXY ON \'dba\'@\'localhost\' TO \'alice\'@\'localhost\' WITH GRANT OPTION \n |\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n\nGRANT PROXY ON \'dba\'@\'localhost\' TO \'bob\'@\'localhost\';\n\nA user account can grant the PROXY privilege for any other user account if the\ngranter has the PROXY privilege for the \'\'@\'%\' anonymous user account, like\nthis:\n\nGRANT PROXY ON \'\'@\'%\' TO \'dba\'@\'localhost\' WITH GRANT OPTION;\n\nFor example, the following example succeeds because the user can grant the\nPROXY privilege for any other user account:\n\nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n\nSHOW GRANTS;\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n| Grants for alice@localhost \n |\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\' IDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' WITH GRANT OPTION |\n| GRANT PROXY ON \'\'@\'%\' TO \'alice\'@\'localhost\' WITH GRANT OPTION \n |\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n\nGRANT PROXY ON \'app1_dba\'@\'localhost\' TO \'bob\'@\'localhost\';\nQuery OK, 0 rows affected (0.004 sec)\n\nGRANT PROXY ON \'app2_dba\'@\'localhost\' TO \'carol\'@\'localhost\';\nQuery OK, 0 rows affected (0.004 sec)\n\nThe default root user accounts created by mysql_install_db have this\nprivilege. For example:\n\nGRANT ALL PRIVILEGES ON *.* TO \'root\'@\'localhost\' WITH GRANT OPTION;\nGRANT PROXY ON \'\'@\'%\' TO \'root\'@\'localhost\' WITH GRANT OPTION;\n\nThis allows the default root user accounts to grant the PROXY privilege for\nany other user account, and it also allows the default root user accounts to\ngrant others the privilege to do the same.\n\nAuthentication Options\n----------------------\n\nThe authentication options for the GRANT statement are the same as those for\nthe CREATE USER statement.\n\nIDENTIFIED BY \'password\'\n------------------------\n\nThe optional IDENTIFIED BY clause can be used to provide an account with a\npassword. The password should be specified in plain text. It will be hashed by\nthe PASSWORD function prior to being stored.\n\nFor example, if our password is mariadb, then we can create the user with:\n\nGRANT USAGE ON *.* TO foo2@test IDENTIFIED BY \'mariadb\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nIf the user account already exists and if you provide the IDENTIFIED BY\nclause, then the user\'s password will be changed. You must have the privileges\nneeded for the SET PASSWORD statement to change a user\'s password with GRANT.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED BY PASSWORD \'password_hash\'\n--------------------------------------\n\nThe optional IDENTIFIED BY PASSWORD clause can be used to provide an account\nwith a password that has already been hashed. The password should be specified\nas a hash that was provided by the PASSWORD function. It will be stored as-is.\n\nFor example, if our password is mariadb, then we can find the hash with:\n\nSELECT PASSWORD(\'mariadb\');\n+-------------------------------------------+\n| PASSWORD(\'mariadb\') |\n+-------------------------------------------+\n| *54958E764CE10E50764C2EECBB71D01F08549980 |\n+-------------------------------------------+\n1 row in set (0.00 sec)\n\nAnd then we can create a user with the hash:\n\nGRANT USAGE ON *.* TO foo2@test IDENTIFIED BY \n PASSWORD \'*54958E764CE10E50764C2EECBB71D01F08549980\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nIf the user account already exists and if you provide the IDENTIFIED BY\nclause, then the user\'s password will be changed. You must have the privileges\nneeded for the SET PASSWORD statement to change a user\'s password with GRANT.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED {VIA|WITH} authentication_plugin\n-------------------------------------------\n\nThe optional IDENTIFIED VIA authentication_plugin allows you to specify that\nthe account should be authenticated by a specific authentication plugin. The\nplugin name must be an active authentication plugin as per SHOW PLUGINS. If it\ndoesn\'t show up in that output, then you will need to install it with INSTALL\nPLUGIN or INSTALL SONAME.\n\nFor example, this could be used with the PAM authentication plugin:\n\nGRANT USAGE ON *.* TO foo2@test IDENTIFIED VIA pam;\n\nSome authentication plugins allow additional arguments to be specified after a\nUSING or AS keyword. For example, the PAM authentication plugin accepts a\nservice name:\n\nGRANT USAGE ON *.* TO foo2@test IDENTIFIED VIA pam USING \'mariadb\';\n\nThe exact meaning of the additional argument would depend on the specific\nauthentication plugin.\n\nMariaDB starting with 10.4.0\n----------------------------\nThe USING or AS keyword can also be used to provide a plain-text password to a\nplugin if it\'s provided as an argument to the PASSWORD() function. This is\nonly valid for authentication plugins that have implemented a hook for the\nPASSWORD() function. For example, the ed25519 authentication plugin supports\nthis:\n\nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 \n USING PASSWORD(\'secret\');\n\nMariaDB starting with 10.4.3\n----------------------------\nOne can specify many authentication plugins, they all work as alternatives\nways of authenticating a user:\n\nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 \n USING PASSWORD(\'secret\') OR unix_socket;\n\nBy default, when you create a user without specifying an authentication\nplugin, MariaDB uses the mysql_native_password plugin.\n\nResource Limit Options\n----------------------\n\nIt is possible to set per-account limits for certain server resources. The\nfollowing table shows the values that can be set per account:\n\n+--------------------------------------+--------------------------------------+') WHERE help_topic_id = 107;
-update help_topic set description = CONCAT(description, '\n| Limit Type | Decription |\n+--------------------------------------+--------------------------------------+\n| MAX_QUERIES_PER_HOUR | Number of statements that the |\n| | account can issue per hour |\n| | (including updates) |\n+--------------------------------------+--------------------------------------+\n| MAX_UPDATES_PER_HOUR | Number of updates (not queries) |\n| | that the account can issue per hour |\n+--------------------------------------+--------------------------------------+\n| MAX_CONNECTIONS_PER_HOUR | Number of connections that the |\n| | account can start per hour |\n+--------------------------------------+--------------------------------------+\n| MAX_USER_CONNECTIONS | Number of simultaneous connections |\n| | that can be accepted from the same |\n| | account; if it is 0, |\n| | max_connections will be used |\n| | instead; if max_connections is 0, |\n| | there is no limit for this |\n| | account\'s simultaneous connections. |\n+--------------------------------------+--------------------------------------+\n| MAX_STATEMENT_TIME | Timeout, in seconds, for statements |\n| | executed by the user. See also |\n| | Aborting Statements that Exceed a |\n| | Certain Time to Execute. |\n+--------------------------------------+--------------------------------------+\n\nIf any of these limits are set to 0, then there is no limit for that resource\nfor that user.\n\nTo set resource limits for an account, if you do not want to change that\naccount\'s privileges, you can issue a GRANT statement with the USAGE\nprivilege, which has no meaning. The statement can name some or all limit\ntypes, in any order.\n\nHere is an example showing how to set resource limits:\n\nGRANT USAGE ON *.* TO \'someone\'@\'localhost\' WITH\n MAX_USER_CONNECTIONS 0\n MAX_QUERIES_PER_HOUR 200;\n\nThe resources are tracked per account, which means \'user\'@\'server\'; not per\nuser name or per connection.\n\nThe count can be reset for all users using FLUSH USER_RESOURCES, FLUSH\nPRIVILEGES or mysqladmin reload.\n\nUsers with the CONNECTION ADMIN privilege (in MariaDB 10.5.2 and later) or the\nSUPER privilege are not restricted by max_user_connections, max_connections,\nor max_password_errors.\n\nPer account resource limits are stored in the user table, in the mysql\ndatabase. Columns used for resources limits are named max_questions,\nmax_updates, max_connections (for MAX_CONNECTIONS_PER_HOUR), and\nmax_user_connections (for MAX_USER_CONNECTIONS).\n\nTLS Options\n-----------\n\nBy default, MariaDB transmits data between the server and clients without\nencrypting it. This is generally acceptable when the server and client run on\nthe same host or in networks where security is guaranteed through other means.\nHowever, in cases where the server and client exist on separate networks or\nthey are in a high-risk network, the lack of encryption does introduce\nsecurity concerns as a malicious actor could potentially eavesdrop on the\ntraffic as it is sent over the network between them.\n\nTo mitigate this concern, MariaDB allows you to encrypt data in transit\nbetween the server and clients using the Transport Layer Security (TLS)\nprotocol. TLS was formerly known as Secure Socket Layer (SSL), but strictly\nspeaking the SSL protocol is a predecessor to TLS and, that version of the\nprotocol is now considered insecure. The documentation still uses the term SSL\noften and for compatibility reasons TLS-related server system and status\nvariables still use the prefix ssl_, but internally, MariaDB only supports its\nsecure successors.\n\nSee Secure Connections Overview for more information about how to determine\nwhether your MariaDB server has TLS support.\n\nYou can set certain TLS-related restrictions for specific user accounts. For\ninstance, you might use this with user accounts that require access to\nsensitive data while sending it across networks that you do not control. These\nrestrictions can be enabled for a user account with the CREATE USER, ALTER\nUSER, or GRANT statements. The following options are available:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| REQUIRE NONE | TLS is not required for this account, but can |\n| | still be used. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SSL | The account must use TLS, but no valid X509 |\n| | certificate is required. This option cannot |\n| | be combined with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE X509 | The account must use TLS and must have a |\n| | valid X509 certificate. This option implies |\n| | REQUIRE SSL. This option cannot be combined |\n| | with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE ISSUER \'issuer\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the Certificate |\n| | Authority must be the one specified via the |\n| | string issuer. This option implies REQUIRE |\n| | X509. This option can be combined with the |\n| | SUBJECT, and CIPHER options in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SUBJECT \'subject\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the |\n| | certificate\'s Subject must be the one |\n| | specified via the string subject. This option |\n| | implies REQUIRE X509. This option can be |\n| | combined with the ISSUER, and CIPHER options |\n| | in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE CIPHER \'cipher\' | The account must use TLS, but no valid X509 |\n| | certificate is required. Also, the encryption |\n| | used for the connection must use a specific |\n| | cipher method specified in the string cipher. |\n| | This option implies REQUIRE SSL. This option |\n| | can be combined with the ISSUER, and SUBJECT |\n| | options in any order. |\n+---------------------------+------------------------------------------------+\n\nThe REQUIRE keyword must be used only once for all specified options, and the\nAND keyword can be used to separate individual options, but it is not required.\n\nFor example, you can create a user account that requires these TLS options\nwith the following:\n\nGRANT USAGE ON *.* TO \'alice\'@\'%\'\n REQUIRE SUBJECT \'/CN=alice/O=My Dom, Inc./C=US/ST=Oregon/L=Portland\'\n AND ISSUER \'/C=FI/ST=Somewhere/L=City/ O=Some Company/CN=Peter\nParker/emailAddress=p.parker@marvel.com\'\n AND CIPHER \'SHA-DES-CBC3-EDH-RSA\';\n\nIf any of these options are set for a specific user account, then any client\nwho tries to connect with that user account will have to be configured to\nconnect with TLS.\n\nSee Securing Connections for Client and Server for information on how to\nenable TLS on the client and server.\n\nRoles\n-----\n\nSyntax\n------\n\nGRANT role TO grantee [, grantee ... ]\n[ WITH ADMIN OPTION ]\n\ngrantee:\n rolename\n username [authentication_option]\n\nThe GRANT statement is also used to grant the use of a role to one or more\nusers or other roles. In order to be able to grant a role, the grantor doing\nso must have permission to do so (see WITH ADMIN in the CREATE ROLE article).\n\nSpecifying the WITH ADMIN OPTION permits the grantee to in turn grant the role\nto another.\n\nFor example, the following commands show how to grant the same role to a\ncouple different users.\n\nGRANT journalist TO hulda;\n\nGRANT journalist TO berengar WITH ADMIN OPTION;\n\nIf a user has been granted a role, they do not automatically obtain all\npermissions associated with that role. These permissions are only in use when\nthe user activates the role with the SET ROLE statement.\n\nTO PUBLIC\n---------\n\nMariaDB starting with 10.11\n---------------------------\n\nSyntax\n------\n\nGRANT <privilege> ON <database>.<object> TO PUBLIC;\nREVOKE <privilege> ON <database>.<object> FROM PUBLIC;\n\nGRANT ... TO PUBLIC grants privileges to all users with access to the server.\nThe privileges also apply to users created after the privileges are granted.\nThis can be useful when one only wants to state once that all users need to\nhave a certain set of privileges.\n\nWhen running SHOW GRANTS, a user will also see all privileges inherited from\nPUBLIC. SHOW GRANTS FOR PUBLIC will only show TO PUBLIC grants.\n\nGrant Examples\n--------------\n\nGranting Root-like Privileges\n-----------------------------\n\nYou can create a user that has privileges similar to the default root accounts\nby executing the following:\n\nCREATE USER \'alexander\'@\'localhost\';\nGRANT ALL PRIVILEGES ON *.* to \'alexander\'@\'localhost\' WITH GRANT OPTION;\n\nURL: https://mariadb.com/kb/en/grant/') WHERE help_topic_id = 107;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (108,10,'RENAME USER','Syntax\n------\n\nRENAME USER old_user TO new_user\n [, old_user TO new_user] ...\n\nDescription\n-----------\n\nThe RENAME USER statement renames existing MariaDB accounts. To use it, you\nmust have the global CREATE USER privilege or the UPDATE privilege for the\nmysql database. Each account is named using the same format as for the CREATE\nUSER statement; for example, \'jeffrey\'@\'localhost\'. If you specify only the\nuser name part of the account name, a host name part of \'%\' is used.\n\nIf any of the old user accounts do not exist or any of the new user accounts\nalready exist, ERROR 1396 (HY000) results. If an error occurs, RENAME USER\nwill still rename the accounts that do not result in an error.\n\nExamples\n--------\n\nCREATE USER \'donald\', \'mickey\';\nRENAME USER \'donald\' TO \'duck\'@\'localhost\', \'mickey\' TO \'mouse\'@\'localhost\';\n\nURL: https://mariadb.com/kb/en/rename-user/','','https://mariadb.com/kb/en/rename-user/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (109,10,'REVOKE','Privileges\n----------\n\nSyntax\n------\n\nREVOKE \n priv_type [(column_list)]\n [, priv_type [(column_list)]] ...\n ON [object_type] priv_level\n FROM user [, user] ...\n\nREVOKE ALL PRIVILEGES, GRANT OPTION\n FROM user [, user] ...\n\nDescription\n-----------\n\nThe REVOKE statement enables system administrators to revoke privileges (or\nroles - see section below) from MariaDB accounts. Each account is named using\nthe same format as for the GRANT statement; for example,\n\'jeffrey\'@\'localhost\'. If you specify only the user name part of the account\nname, a host name part of \'%\' is used. For details on the levels at which\nprivileges exist, the allowable priv_type and priv_level values, and the\nsyntax for specifying users and passwords, see GRANT.\n\nTo use the first REVOKE syntax, you must have the GRANT OPTION privilege, and\nyou must have the privileges that you are revoking.\n\nTo revoke all privileges, use the second syntax, which drops all global,\ndatabase, table, column, and routine privileges for the named user or users:\n\nREVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...\n\nTo use this REVOKE syntax, you must have the global CREATE USER privilege or\nthe UPDATE privilege for the mysql database. See GRANT.\n\nExamples\n--------\n\nREVOKE SUPER ON *.* FROM \'alexander\'@\'localhost\';\n\nRoles\n-----\n\nSyntax\n------\n\nREVOKE role [, role ...]\n FROM grantee [, grantee2 ... ]\n\nREVOKE ADMIN OPTION FOR role FROM grantee [, grantee2]\n\nDescription\n-----------\n\nREVOKE is also used to remove a role from a user or another role that it\'s\npreviously been assigned to. If a role has previously been set as a default\nrole, REVOKE does not remove the record of the default role from the\nmysql.user table. If the role is subsequently granted again, it will again be\nthe user\'s default. Use SET DEFAULT ROLE NONE to explicitly remove this.\n\nBefore MariaDB 10.1.13, the REVOKE role statement was not permitted in\nprepared statements.\n\nExample\n-------\n\nREVOKE journalist FROM hulda\n\nURL: https://mariadb.com/kb/en/revoke/','','https://mariadb.com/kb/en/revoke/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (110,10,'SET PASSWORD','Syntax\n------\n\nSET PASSWORD [FOR user] =\n {\n PASSWORD(\'some password\')\n | OLD_PASSWORD(\'some password\')\n | \'encrypted password\'\n }\n\nDescription\n-----------\n\nThe SET PASSWORD statement assigns a password to an existing MariaDB user\naccount.\n\nIf the password is specified using the PASSWORD() or OLD_PASSWORD() function,\nthe literal text of the password should be given. If the password is specified\nwithout using either function, the password should be the already-encrypted\npassword value as returned by PASSWORD().\n\nOLD_PASSWORD() should only be used if your MariaDB/MySQL clients are very old\n(< 4.0.0).\n\nWith no FOR clause, this statement sets the password for the current user. Any\nclient that has connected to the server using a non-anonymous account can\nchange the password for that account.\n\nWith a FOR clause, this statement sets the password for a specific account on\nthe current server host. Only clients that have the UPDATE privilege for the\nmysql database can do this. The user value should be given in\nuser_name@host_name format, where user_name and host_name are exactly as they\nare listed in the User and Host columns of the mysql.user table (or view in\nMariaDB-10.4 onwards) entry.\n\nThe argument to PASSWORD() and the password given to MariaDB clients can be of\narbitrary length.\n\nAuthentication Plugin Support\n-----------------------------\n\nMariaDB starting with 10.4\n--------------------------\nIn MariaDB 10.4 and later, SET PASSWORD (with or without PASSWORD()) works for\naccounts authenticated via any authentication plugin that supports passwords\nstored in the mysql.global_priv table.\n\nThe ed25519, mysql_native_password, and mysql_old_password authentication\nplugins store passwords in the mysql.global_priv table.\n\nIf you run SET PASSWORD on an account that authenticates with one of these\nauthentication plugins that stores passwords in the mysql.global_priv table,\nthen the PASSWORD() function is evaluated by the specific authentication\nplugin used by the account. The authentication plugin hashes the password with\na method that is compatible with that specific authentication plugin.\n\nThe unix_socket, named_pipe, gssapi, and pam authentication plugins do not\nstore passwords in the mysql.global_priv table. These authentication plugins\nrely on other methods to authenticate the user.\n\nIf you attempt to run SET PASSWORD on an account that authenticates with one\nof these authentication plugins that doesn\'t store a password in the\nmysql.global_priv table, then MariaDB Server will raise a warning like the\nfollowing:\n\nSET PASSWORD is ignored for users authenticating via unix_socket plugin\n\nSee Authentication from MariaDB 10.4 for an overview of authentication changes\nin MariaDB 10.4.\n\nMariaDB until 10.3\n------------------\nIn MariaDB 10.3 and before, SET PASSWORD (with or without PASSWORD()) only\nworks for accounts authenticated via mysql_native_password or\nmysql_old_password authentication plugins\n\nPasswordless User Accounts\n--------------------------\n\nUser accounts do not always require passwords to login.\n\nThe unix_socket , named_pipe and gssapi authentication plugins do not require\na password to authenticate the user.\n\nThe pam authentication plugin may or may not require a password to\nauthenticate the user, depending on the specific configuration.\n\nThe mysql_native_password and mysql_old_password authentication plugins\nrequire passwords for authentication, but the password can be blank. In that\ncase, no password is required.\n\nIf you provide a password while attempting to log into the server as an\naccount that doesn\'t require a password, then MariaDB server will simply\nignore the password.\n\nMariaDB starting with 10.4\n--------------------------\nIn MariaDB 10.4 and later, a user account can be defined to use multiple\nauthentication plugins in a specific order of preference. This specific\nscenario may be more noticeable in these versions, since an account could be\nassociated with some authentication plugins that require a password, and some\nthat do not.\n\nExample\n-------\n\nFor example, if you had an entry with User and Host column values of \'bob\' and\n\'%.loc.gov\', you would write the statement like this:\n\nSET PASSWORD FOR \'bob\'@\'%.loc.gov\' = PASSWORD(\'newpass\');\n\nIf you want to delete a password for a user, you would do:\n\nSET PASSWORD FOR \'bob\'@localhost = PASSWORD(\"\");\n\nURL: https://mariadb.com/kb/en/set-password/','','https://mariadb.com/kb/en/set-password/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (111,10,'CREATE ROLE','Syntax\n------\n\nCREATE [OR REPLACE] ROLE [IF NOT EXISTS] role \n [WITH ADMIN\n {CURRENT_USER | CURRENT_ROLE | user | role}]\n\nDescription\n-----------\n\nThe CREATE ROLE statement creates one or more MariaDB roles. To use it, you\nmust have the global CREATE USER privilege or the INSERT privilege for the\nmysql database. For each account, CREATE ROLE creates a new row in the\nmysql.user table that has no privileges, and with the corresponding is_role\nfield set to Y. It also creates a record in the mysql.roles_mapping table.\n\nIf any of the specified roles already exist, ERROR 1396 (HY000) results. If an\nerror occurs, CREATE ROLE will still create the roles that do not result in an\nerror. The maximum length for a role is 128 characters. Role names can be\nquoted, as explained in the Identifier names page. Only one error is produced\nfor all roles which have not been created:\n\nERROR 1396 (HY000): Operation CREATE ROLE failed for \'a\',\'b\',\'c\'\n\nFailed CREATE or DROP operations, for both users and roles, produce the same\nerror code.\n\nPUBLIC and NONE are reserved, and cannot be used as role names. NONE is used\nto unset a role and PUBLIC has a special use in other systems, such as Oracle,\nso is reserved for compatibility purposes.\n\nFor valid identifiers to use as role names, see Identifier Names.\n\nWITH ADMIN\n----------\n\nThe optional WITH ADMIN clause determines whether the current user, the\ncurrent role or another user or role has use of the newly created role. If the\nclause is omitted, WITH ADMIN CURRENT_USER is treated as the default, which\nmeans that the current user will be able to GRANT this role to users.\n\nOR REPLACE\n----------\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP ROLE IF EXISTS name;\nCREATE ROLE name ...;\n\nIF NOT EXISTS\n-------------\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified role already exists. Cannot be used together with\nthe OR REPLACE clause.\n\nExamples\n--------\n\nCREATE ROLE journalist;\n\nCREATE ROLE developer WITH ADMIN lorinda@localhost;\n\nGranting the role to another user. Only user lorinda@localhost has permission\nto grant the developer role:\n\nSELECT USER();\n+-------------------+\n| USER() |\n+-------------------+\n| henning@localhost |\n+-------------------+\n...\nGRANT developer TO ian@localhost;\nAccess denied for user \'henning\'@\'localhost\'\n\nSELECT USER();\n+-------------------+\n| USER() |\n+-------------------+\n| lorinda@localhost |\n+-------------------+\n\nGRANT m_role TO ian@localhost;\n\nThe OR REPLACE and IF NOT EXISTS clauses. The journalist role already exists:\n\nCREATE ROLE journalist;\nERROR 1396 (HY000): Operation CREATE ROLE failed for \'journalist\'\n\nCREATE OR REPLACE ROLE journalist;\nQuery OK, 0 rows affected (0.00 sec)\n\nCREATE ROLE IF NOT EXISTS journalist;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+---------------------------------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------------------------------+\n| Note | 1975 | Can\'t create role \'journalist\'; it already exists |\n+-------+------+---------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/create-role/','','https://mariadb.com/kb/en/create-role/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (112,10,'DROP ROLE','Syntax\n------\n\nDROP ROLE [IF EXISTS] role_name [,role_name ...]\n\nDescription\n-----------\n\nThe DROP ROLE statement removes one or more MariaDB roles. To use this\nstatement, you must have the global CREATE USER privilege or the DELETE\nprivilege for the mysql database.\n\nDROP ROLE does not disable roles for connections which selected them with SET\nROLE. If a role has previously been set as a default role, DROP ROLE does not\nremove the record of the default role from the mysql.user table. If the role\nis subsequently recreated and granted, it will again be the user\'s default.\nUse SET DEFAULT ROLE NONE to explicitly remove this.\n\nIf any of the specified user accounts do not exist, ERROR 1396 (HY000)\nresults. If an error occurs, DROP ROLE will still drop the roles that do not\nresult in an error. Only one error is produced for all roles which have not\nbeen dropped:\n\nERROR 1396 (HY000): Operation DROP ROLE failed for \'a\',\'b\',\'c\'\n\nFailed CREATE or DROP operations, for both users and roles, produce the same\nerror code.\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will return a warning instead of an\nerror if the role does not exist.\n\nExamples\n--------\n\nDROP ROLE journalist;\n\nThe same thing using the optional IF EXISTS clause:\n\nDROP ROLE journalist;\nERROR 1396 (HY000): Operation DROP ROLE failed for \'journalist\'\n\nDROP ROLE IF EXISTS journalist;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nNote (Code 1975): Can\'t drop role \'journalist\'; it doesn\'t exist\n\nURL: https://mariadb.com/kb/en/drop-role/','','https://mariadb.com/kb/en/drop-role/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (113,10,'SET ROLE','Syntax\n------\n\nSET ROLE { role | NONE }\n\nDescription\n-----------\n\nThe SET ROLE statement enables a role, along with all of its associated\npermissions, for the current session. To unset a role, use NONE .\n\nIf a role that doesn\'t exist, or to which the user has not been assigned, is\nspecified, an ERROR 1959 (OP000): Invalid role specification error occurs.\n\nAn automatic SET ROLE is implicitly performed when a user connects if that\nuser has been assigned a default role. See SET DEFAULT ROLE.\n\nExample\n-------\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n\nSET ROLE staff;\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| staff |\n+--------------+\n\nSET ROLE NONE;\n\nSELECT CURRENT_ROLE();\n+----------------+\n| CURRENT_ROLE() |\n+----------------+\n| NULL |\n+----------------+\n\nURL: https://mariadb.com/kb/en/set-role/','','https://mariadb.com/kb/en/set-role/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (114,10,'SET DEFAULT ROLE','Syntax\n------\n\nSET DEFAULT ROLE { role | NONE } [ FOR user@host ]\n\nDescription\n-----------\n\nThe SET DEFAULT ROLE statement sets a default role for a specified (or\ncurrent) user. A default role is automatically enabled when a user connects\n(an implicit SET ROLE statement is executed immediately after a connection is\nestablished).\n\nTo be able to set a role as a default, the role must already have been granted\nto that user, and one needs the privileges to enable this role (if you cannot\ndo SET ROLE X, you won\'t be able to do SET DEFAULT ROLE X). To set a default\nrole for another user one needs to have write access to the mysql database.\n\nTo remove a user\'s default role, use SET DEFAULT ROLE NONE [ FOR user@host ].\nThe record of the default role is not removed if the role is dropped or\nrevoked, so if the role is subsequently re-created or granted, it will again\nbe the user\'s default role.\n\nThe default role is stored in the default_role column in the mysql.user\ntable/view, as well as in the Information Schema APPLICABLE_ROLES table, so\nthese can be viewed to see which role has been assigned to a user as the\ndefault.\n\nExamples\n--------\n\nSetting a default role for the current user:\n\nSET DEFAULT ROLE journalist;\n\nRemoving a default role from the current user:\n\nSET DEFAULT ROLE NONE;\n\nSetting a default role for another user. The role has to have been granted to\nthe user before it can be set as default:\n\nCREATE ROLE journalist;\nCREATE USER taniel;\n\nSET DEFAULT ROLE journalist FOR taniel;\nERROR 1959 (OP000): Invalid role specification `journalist`\n\nGRANT journalist TO taniel;\nSET DEFAULT ROLE journalist FOR taniel;\n\nViewing mysql.user:\n\nselect * from mysql.user where user=\'taniel\'\\G\n*************************** 1. row ***************************\n Host: %\n User: taniel\n...\n is_role: N\n default_role: journalist\n...\n\nRemoving a default role for another user\n\nSET DEFAULT ROLE NONE FOR taniel;\n\nURL: https://mariadb.com/kb/en/set-default-role/','','https://mariadb.com/kb/en/set-default-role/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (115,10,'Roles Overview','Description\n-----------\n\nA role bundles a number of privileges together. It assists larger\norganizations where, typically, a number of users would have the same\nprivileges, and, previously, the only way to change the privileges for a group\nof users was by changing each user\'s privileges individually.\n\nAlternatively, multiple external users could have been assigned the same user,\nand there would have been no way to see which actual user was responsible for\nwhich action.\n\nWith roles, managing this is easy. For example, there could be a number of\nusers assigned to a journalist role, with identical privileges. Changing the\nprivileges for all the journalists is a matter of simply changing the role\'s\nprivileges, while the individual user is still linked with any changes that\ntake place.\n\nRoles are created with the CREATE ROLE statement, and dropped with the DROP\nROLE statement. Roles are then assigned to a user with an extension to the\nGRANT statement, while privileges are assigned to a role in the regular way\nwith GRANT. Similarly, the REVOKE statement can be used to both revoke a role\nfrom a user, or revoke a privilege from a role.\n\nOnce a user has connected, he can obtain all privileges associated with a role\nby setting a role with the SET ROLE statement. The CURRENT_ROLE function\nreturns the currently set role for the session, if any.\n\nOnly roles granted directly to a user can be set, roles granted to other roles\ncannot. Instead the privileges granted to a role, which is, in turn, granted\nto another role (grantee), will be immediately available to any user who sets\nthis second grantee role.\n\nThe SET DEFAULT ROLE statement allows one to set a default role for a user. A\ndefault role is automatically enabled when a user connects (an implicit SET\nROLE statement is executed immediately after a connection is established).\n\nRoles were implemented as a GSoC 2013 project by Vicentiu Ciorbaru.\n\nSystem Tables\n-------------\n\nInformation about roles and who they\'ve been granted to can be found in the\nInformation Schema APPLICABLE_ROLES table as well as the mysql.ROLES_MAPPING\ntable.\n\nThe Information Schema ENABLED_ROLES table shows the enabled roles for the\ncurrent session.\n\nExamples\n--------\n\nCreating a role and granting a privilege:\n\nCREATE ROLE journalist;\n\nGRANT SHOW DATABASES ON *.* TO journalist;\n\nGRANT journalist to hulda;\n\nNote, that hulda has no SHOW DATABASES privilege, even though she was granted\nthe journalist role. She needs to set the role first:\n\nSHOW DATABASES;\n+--------------------+\n| Database |\n+--------------------+\n| information_schema |\n+--------------------+\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n\nSET ROLE journalist;\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| journalist |\n+--------------+\n\nSHOW DATABASES;\n+--------------------+\n| Database |\n+--------------------+\n| ... |\n| information_schema |\n| mysql |\n| performance_schema |\n| test |\n| ... |\n+--------------------+\n\nSET ROLE NONE;\n\nRoles can be granted to roles:\n\nCREATE ROLE writer;\n\nGRANT SELECT ON data.* TO writer;\n\nGRANT writer TO journalist;\n\nBut one does not need to set a role granted to a role. For example, hulda will\nautomatically get all writer privileges when she sets the journalist role:\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n\nSHOW TABLES FROM data;\nEmpty set (0.01 sec)\n\nSET ROLE journalist;\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| journalist |\n+--------------+\n\nSHOW TABLES FROM data;\n+------------------------------+\n| Tables_in_data |\n+------------------------------+\n| set1 |\n| ... |\n+------------------------------+\n\nRoles and Views (and Stored Routines)\n-------------------------------------\n\nWhen a user sets a role, he, in a sense, has two identities with two\nassociated sets of privileges. But a view (or a stored routine) can have only\none definer. So, when a view (or a stored routine) is created with the SQL\nSECURITY DEFINER, one can specify whether the definer should be CURRENT_USER\n(and the view will have none of the privileges of the user\'s role) or\nCURRENT_ROLE (in this case, the view will use role\'s privileges, but none of\nthe user\'s privileges). As a result, sometimes one can create a view that is\nimpossible to use.\n\nCREATE ROLE r1;\n\nGRANT ALL ON db1.* TO r1;\n\nGRANT r1 TO foo@localhost;\n\nGRANT ALL ON db.* TO foo@localhost;\n\nSELECT CURRENT_USER\n+---------------+\n| current_user |\n+---------------+\n| foo@localhost |\n+---------------+\n\nSET ROLE r1;\n\nCREATE TABLE db1.t1 (i int);\n\nCREATE VIEW db.v1 AS SELECT * FROM db1.t1;\n\nSHOW CREATE VIEW db.v1;\n+------+-----------------------------------------------------------------------\n------------------------------------------------------------------+------------\n---------+----------------------+\n| View | Create View \n |\ncharacter_set_client | collation_connection |\n+------+-----------------------------------------------------------------------\n------------------------------------------------------------------+------------\n---------+----------------------+\n| v1 | CREATE ALGORITHM=UNDEFINED DEFINER=`foo`@`localhost` SQL SECURITY\nDEFINER VIEW `db`.`v1` AS SELECT `db1`.`t1`.`i` AS `i` from `db1`.`t1` | utf8 \n | utf8_general_ci |\n+------+-----------------------------------------------------------------------\n------------------------------------------------------------------+------------\n---------+----------------------+\n\nCREATE DEFINER=CURRENT_ROLE VIEW db.v2 AS SELECT * FROM db1.t1;\n\nSHOW CREATE VIEW db.b2;\n+------+-----------------------------------------------------------------------\n-----------------------------------------------------+----------------------+--\n-------------------+\n| View | Create View \n | character_set_client |\ncollation_connection |\n+------+-----------------------------------------------------------------------\n-----------------------------------------------------+----------------------+--\n-------------------+\n| v2 | CREATE ALGORITHM=UNDEFINED DEFINER=`r1` SQL SECURITY DEFINER VIEW\n`db`.`v2` AS select `db1`.`t1`.`a` AS `a` from `db1`.`t1` | utf8 \n | utf8_general_ci |\n+------+-----------------------------------------------------------------------\n-----------------------------------------------------+----------------------+--\n-------------------+\n\nOther Resources\n---------------\n\n* Roles Review by Peter Gulutzan\n\nURL: https://mariadb.com/kb/en/roles_overview/','','https://mariadb.com/kb/en/roles_overview/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (116,10,'Account Locking','MariaDB starting with 10.4.2\n----------------------------\nAccount locking was introduced in MariaDB 10.4.2.\n\nDescription\n-----------\n\nAccount locking permits privileged administrators to lock/unlock user\naccounts. No new client connections will be permitted if an account is locked\n(existing connections are not affected).\n\nUser accounts can be locked at creation, with the CREATE USER statement, or\nmodified after creation with the ALTER USER statement. For example:\n\nCREATE USER \'lorin\'@\'localhost\' ACCOUNT LOCK;\n\nor\n\nALTER USER \'marijn\'@\'localhost\' ACCOUNT LOCK;\n\nThe server will return an ER_ACCOUNT_HAS_BEEN_LOCKED error when locked users\nattempt to connect:\n\nmysql -ulorin\n ERROR 4151 (HY000): Access denied, this account is locked\n\nThe ALTER USER statement is also used to unlock a user:\n\nALTER USER \'lorin\'@\'localhost\' ACCOUNT UNLOCK;\n\nThe SHOW CREATE USER statement will show whether the account is locked:\n\nSHOW CREATE USER \'marijn\'@\'localhost\';\n+-----------------------------------------------+\n| CREATE USER for marijn@localhost |\n+-----------------------------------------------+\n| CREATE USER \'marijn\'@\'localhost\' ACCOUNT LOCK |\n+-----------------------------------------------+\n\nas well as querying the mysql.global_priv table:\n\nSELECT CONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)) FROM\nmysql.global_priv \n WHERE user=\'marijn\';\n+------------------------------------------------------------------------------\n-------+\n| CONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)) \n |\n+------------------------------------------------------------------------------\n-------+\n| marijn@localhost => {\n \"access\": 0,\n \"plugin\": \"mysql_native_password\",\n \"authentication_string\": \"\",\n \"account_locked\": true,\n \"password_last_changed\": 1558017158\n} |\n+------------------------------------------------------------------------------\n-------+\n\nURL: https://mariadb.com/kb/en/account-locking/','','https://mariadb.com/kb/en/account-locking/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (117,10,'Authentication from MariaDB 10.4','MariaDB starting with 10.4\n--------------------------\nMariaDB 10.4 introduced a number of changes to the authentication process,\nintended to make things easier and more intuitive.\n\nOverview\n--------\n\nThere are four new main features in 10.4 relating to authentication:\n\n* It is possible to use more than one authentication plugin for each user\naccount. For example, this can be useful to slowly migrate users to the more\nsecure ed25519 authentication plugin over time, while allowing the old\nmysql_native_password authentication plugin as an alternative for the\ntransitional period.\n* The root@localhost user account created by mysql_install_db is created with\nthe ability to use two authentication plugins.\nFirst, it is configured to try to use the unix_socket authentication plugin.\nThis allows the root@localhost user to login without a password via the local\nUnix socket file defined by the socket system variable, as long as the login\nis attempted from a process owned by the operating system root user account.\nSecond, if authentication fails with the unix_socket authentication plugin,\nthen it is configured to try to use the mysql_native_password authentication\nplugin. However, an invalid password is initially set, so in order to\nauthenticate this way, a password must be set with SET PASSWORD.\nHowever, just using the unix_socket authentication plugin may be fine for many\nusers, and it is very secure. You may want to try going without password\nauthentication to see how well it works for you. Remember, the best way to\nkeep your password safe is not to have one!\n\n* All user accounts, passwords, and global privileges are now stored in the\nmysql.global_priv table. The mysql.user table still exists and has exactly the\nsame set of columns as before, but it’s now a view that references the\nmysql.global_priv table. Tools that analyze the mysql.user table should\ncontinue to work as before. From MariaDB 10.4.13, the dedicated mariadb.sys\nuser is created as the definer of this view. Previously root was the definer,\nwhich resulted in privilege problems when this username was changed.\n* MariaDB 10.4 adds supports for User Password Expiry, which is not active by\ndefault.\n\nDescription\n-----------\n\nAs a result of the above changes, the open-for-everyone all-powerful root\naccount is finally gone. And installation scripts will no longer demand that\nyou \"PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !\", because\nthe root account is securely created automatically.\n\nTwo all-powerful accounts are created by default — root and the OS user that\nowns the data directory, typically mysql. They are created as:\n\nCREATE USER root@localhost IDENTIFIED VIA unix_socket OR mysql_native_password\nUSING \'invalid\'\nCREATE USER mysql@localhost IDENTIFIED VIA unix_socket OR\nmysql_native_password USING \'invalid\'\n\nUsing unix_socket means that if you are the system root user, you can login as\nroot@locahost without a password. This technique was pioneered by Otto\nKekäläinen in Debian MariaDB packages and has been successfully used in Debian\nsince as early as MariaDB 10.0.\n\nIt is based on a simple fact that asking the system root for a password adds\nno extra security — root has full access to all the data files and all process\nmemory anyway. But not asking for a password means, there is no root password\nto forget (no need for the numerous tutorials on \"how to reset MariaDB root\npassword\"). And if you want to script some tedious database work, there is no\nneed to store the root password in plain text for the script to use (no need\nfor debian-sys-maint user).\n\nStill, some users may wish to log in as MariaDB root without using sudo. Hence\nthe old authentication method — conventional MariaDB password — is still\navailable. By default it is disabled (\"invalid\" is not a valid password hash),\nbut one can set the password with a usual SET PASSWORD statement. And still\nretain the password-less access via sudo.\n\nIf you install MariaDB locally (say from a tarball), you would not want to use\nsudo to be able to login. This is why MariaDB creates a second all-powerful\nuser with the same name as a system user that owns the data directory. In\nlocal (not system-wide) installations, this will be the user who installed\nMariaDB — they automatically get convenient password-less root-like access,\nbecause they can access all the data files anyway.\n\nEven if MariaDB is installed system-wide, you may not want to run your\ndatabase maintenance scripts as system root — now you can run them as system\nmysql user. And you will know that they will never destroy your entire system,\neven if you make a typo in a shell script.\n\nHowever, seasoned MariaDB DBAs who are used to the old ways do need to make\nsome changes. See the examples below for common tasks.\n\nCookbook\n--------\n\nAfter installing MariaDB system-wide the first thing you’ve got used to doing\nis logging in into the unprotected root account and protecting it, that is,\nsetting the root password:\n\n$ sudo dnf install MariaDB-server\n$ mysql -uroot\n...\nMariaDB> set password = password(\"XH4VmT3_jt\");\n\nThis is not only unnecessary now, it will simply not work — there is no\nunprotected root account. To login as root use\n\n$ sudo dnf install MariaDB-server\n$ sudo mysql\n\nNote that it implies you are connecting via the unix socket, not tcp. If you\nhappen to have protocol=tcp in a system-wide /etc/my.cnf file, use sudo mysql\n--protocol=socket.\n\nAfter installing MariaDB locally you’ve also used to connect to the\nunprotected root account using mysql -uroot. This will not work either, simply\nuse mysql without specifying a username.\n\nIf you\'ve forgotten your root password, no problem — you can still connect\nusing sudo and change the password. And if you\'ve also removed unix_socket\nauthentication, to restore access do as follows:\n\n* restart MariaDB with --skip-grant-tables\n* login into the unprotected server\n* run FLUSH PRIVILEGES (note, before 10.4 this would’ve been the last step,\nnot anymore). This disables --skip-grant-tables and allows you to change the\nstored authentication method\n* run SET PASSWORD FOR root@localhost to change the root password.\n\nTo view inside privilege tables, the old mysql.user table still exists. You\ncan select from it as before, although you cannot update it anymore. It\ndoesn’t show alternative authentication plugins and this was one of the\nreasons for switching to the mysql.global_priv table — complex authentication\nrules did not fit into rigid structure of a relational table. You can select\nfrom the new table, for example:\n\nselect concat(user, \'@\', host, \' => \', json_detailed(priv)) from\nmysql.global_priv;\n\nReverting to the Previous Authentication Method for root@localhost\n------------------------------------------------------------------\n\nIf you don\'t want the root@localhost user account created by mysql_install_db\nto use unix_socket authentication by default, then there are a few ways to\nrevert to the previous mysql_native_password authentication method for this\nuser account.\n\nConfiguring mysql_install_db to Revert to the Previous Authentication Method\n----------------------------------------------------------------------------\n\nOne way to revert to the previous mysql_native_password authentication method\nfor the root@localhost user account is to execute mysql_install_db with a\nspecial option. If mysql_install_db is executed while\n--auth-root-authentication-method=normal is specified, then it will create the\ndefault user accounts using the default behavior of MariaDB 10.3 and before.\n\nThis means that the root@localhost user account will use mysql_native_password\nauthentication by default. There are some other differences as well. See\nmysql_install_db: User Accounts Created by Default for more information.\n\nFor example, the option can be set on the command-line while running\nmysql_install_db:\n\nmysql_install_db --user=mysql --datadir=/var/lib/mysql\n--auth-root-authentication-method=normal\n\nThe option can also be set in an option file in an option group supported by\nmysql_install_db. For example:\n\n[mysql_install_db]\nauth_root_authentication_method=normal\n\nIf the option is set in an option file and if mysql_install_db is executed,\nthen mysql_install_db will read this option from the option file, and it will\nautomatically set this option.\n\nAltering the User Account to Revert to the Previous Authentication Method\n-------------------------------------------------------------------------\n\nIf you have already installed MariaDB, and if the root@localhost user account\nis already using unix_socket authentication, then you can revert to the old\nmysql_native_password authentication method for the user account by executing\nthe following:\n\nALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING\nPASSWORD(\"verysecret\")\n\nURL: https://mariadb.com/kb/en/authentication-from-mariadb-104/','','https://mariadb.com/kb/en/authentication-from-mariadb-104/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (118,10,'User Password Expiry','MariaDB starting with 10.4.3\n----------------------------\nUser password expiry was introduced in MariaDB 10.4.3.\n\nPassword expiry permits administrators to expire user passwords, either\nmanually or automatically.\n\nSystem Variables\n----------------\n\nThere are two system variables which affect password expiry:\ndefault_password_lifetime, which determines the amount of time between\nrequiring the user to change their password. 0, the default, means automatic\npassword expiry is not active.\n\nThe second variable, disconnect_on_expired_password determines whether a\nclient is permitted to connect if their password has expired, or whether they\nare permitted to connect in sandbox mode, able to perform a limited subset of\nqueries related to resetting the password, in particular SET PASSWORD and SET.\n\nSetting a Password Expiry Limit for a User\n------------------------------------------\n\nBesides automatic password expiry, as determined by default_password_lifetime,\npassword expiry times can be set on an individual user basis, overriding the\nglobal using the CREATE USER or ALTER USER statements, for example:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\n\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\n\nLimits can be disabled by use of the NEVER keyword, for example:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE NEVER;\n\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE NEVER;\n\nA manually set limit can be restored the system default by use of DEFAULT, for\nexample:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n\nSHOW CREATE USER\n----------------\n\nThe SHOW CREATE USER statement will display information about the password\nexpiry status of the user. Unlike MySQL, it will not display if the user is\nunlocked, or if the password expiry is set to default.\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\nCREATE USER \'konstantin\'@\'localhost\' PASSWORD EXPIRE NEVER;\nCREATE USER \'amse\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n\nSHOW CREATE USER \'monty\'@\'localhost\';\n+------------------------------------------------------------------+\n| CREATE USER for monty@localhost |\n+------------------------------------------------------------------+\n| CREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY |\n+------------------------------------------------------------------+\n\nSHOW CREATE USER \'konstantin\'@\'localhost\';\n+------------------------------------------------------------+\n| CREATE USER for konstantin@localhost |\n+------------------------------------------------------------+\n| CREATE USER \'konstantin\'@\'localhost\' PASSWORD EXPIRE NEVER |\n+------------------------------------------------------------+\n\nSHOW CREATE USER \'amse\'@\'localhost\';\n+--------------------------------+\n| CREATE USER for amse@localhost |\n+--------------------------------+\n| CREATE USER \'amse\'@\'localhost\' |\n+--------------------------------+\n\nChecking When Passwords Expire\n------------------------------\n\nThe following query can be used to check when the current passwords expire for\nall users:\n\nWITH password_expiration_info AS (\n SELECT User, Host,\n IF(\n IFNULL(JSON_EXTRACT(Priv, \'$.password_lifetime\'), -1) = -1,\n @@global.default_password_lifetime,\n JSON_EXTRACT(Priv, \'$.password_lifetime\')\n ) AS password_lifetime,\n JSON_EXTRACT(Priv, \'$.password_last_changed\') AS password_last_changed\n FROM mysql.global_priv\n)\nSELECT pei.User, pei.Host,\n pei.password_lifetime,\n FROM_UNIXTIME(pei.password_last_changed) AS password_last_changed_datetime,\n FROM_UNIXTIME(\n pei.password_last_changed +\n (pei.password_lifetime * 60 * 60 * 24)\n ) AS password_expiration_datetime\n FROM password_expiration_info pei\n WHERE pei.password_lifetime != 0\n AND pei.password_last_changed IS NOT NULL\nUNION\nSELECT pei.User, pei.Host,\n pei.password_lifetime,\n FROM_UNIXTIME(pei.password_last_changed) AS password_last_changed_datetime,\n 0 AS password_expiration_datetime\n FROM password_expiration_info pei\n WHERE pei.password_lifetime = 0\n OR pei.password_last_changed IS NULL;\n\n--connect-expired-password Client Option\n----------------------------------------\n\nThe mysql client --connect-expired-password option notifies the server that\nthe client is prepared to handle expired password sandbox mode (even if the\n--batch option was specified).\n\nURL: https://mariadb.com/kb/en/user-password-expiry/','','https://mariadb.com/kb/en/user-password-expiry/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (119,11,'ST_X','Syntax\n------\n\nST_X(p)\nX(p)\n\nDescription\n-----------\n\nReturns the X-coordinate value for the point p as a double-precision number.\n\nST_X() and X() are synonyms.\n\nExamples\n--------\n\nSET @pt = \'Point(56.7 53.34)\';\n\nSELECT X(GeomFromText(@pt));\n+----------------------+\n| X(GeomFromText(@pt)) |\n+----------------------+\n| 56.7 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/st_x/','','https://mariadb.com/kb/en/st_x/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (120,11,'ST_Y','Syntax\n------\n\nST_Y(p)\nY(p)\n\nDescription\n-----------\n\nReturns the Y-coordinate value for the point p as a double-precision number.\n\nST_Y() and Y() are synonyms.\n\nExamples\n--------\n\nSET @pt = \'Point(56.7 53.34)\';\n\nSELECT Y(GeomFromText(@pt));\n+----------------------+\n| Y(GeomFromText(@pt)) |\n+----------------------+\n| 53.34 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/st_y/','','https://mariadb.com/kb/en/st_y/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (121,11,'X','A synonym for ST_X.\n\nURL: https://mariadb.com/kb/en/point-properties-x/','','https://mariadb.com/kb/en/point-properties-x/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (122,11,'Y','A synonym for ST_Y.\n\nURL: https://mariadb.com/kb/en/point-properties-y/','','https://mariadb.com/kb/en/point-properties-y/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (123,12,'UNCOMPRESS','Syntax\n------\n\nUNCOMPRESS(string_to_uncompress)\n\nDescription\n-----------\n\nUncompresses a string compressed by the COMPRESS() function. If the argument\nis not a compressed value, the result is NULL. This function requires MariaDB\nto have been compiled with a compression library such as zlib. Otherwise, the\nreturn value is always NULL. The have_compress server system variable\nindicates whether a compression library is present.\n\nExamples\n--------\n\nSELECT UNCOMPRESS(COMPRESS(\'a string\'));\n+----------------------------------+\n| UNCOMPRESS(COMPRESS(\'a string\')) |\n+----------------------------------+\n| a string |\n+----------------------------------+\n\nSELECT UNCOMPRESS(\'a string\');\n+------------------------+\n| UNCOMPRESS(\'a string\') |\n+------------------------+\n| NULL |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/uncompress/','','https://mariadb.com/kb/en/uncompress/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (124,12,'DECODE','Syntax\n------\n\nDECODE(crypt_str,pass_str)\n\nIn Oracle mode from MariaDB 10.3.2:\n\nDECODE(expr, search_expr, result_expr [, search_expr2, result_expr2 ...]\n[default_expr])\n\nIn all modes from MariaDB 10.3.2:\n\nDECODE_ORACLE(expr, search_expr, result_expr [, search_expr2, result_expr2\n...] [default_expr])\n\nDescription\n-----------\n\nIn the default mode, DECODE decrypts the encrypted string crypt_str using\npass_str as the password. crypt_str should be a string returned from ENCODE().\nThe resulting string will be the original string only if pass_str is the same.\n\nIn Oracle mode from MariaDB 10.3.2, DECODE compares expr to the search\nexpressions, in order. If it finds a match, the corresponding result\nexpression is returned. If no matches are found, the default expression is\nreturned, or NULL if no default is provided.\n\nNULLs are treated as equivalent.\n\nDECODE_ORACLE is a synonym for the Oracle-mode version of the function, and is\navailable in all modes.\n\nExamples\n--------\n\nFrom MariaDB 10.3.2:\n\nSELECT DECODE_ORACLE(2+1,3*1,\'found1\',3*2,\'found2\',\'default\');\n+--------------------------------------------------------+\n| DECODE_ORACLE(2+1,3*1,\'found1\',3*2,\'found2\',\'default\') |\n+--------------------------------------------------------+\n| found1 |\n+--------------------------------------------------------+\n\nSELECT DECODE_ORACLE(2+4,3*1,\'found1\',3*2,\'found2\',\'default\');\n+--------------------------------------------------------+\n| DECODE_ORACLE(2+4,3*1,\'found1\',3*2,\'found2\',\'default\') |\n+--------------------------------------------------------+\n| found2 |\n+--------------------------------------------------------+\n\nSELECT DECODE_ORACLE(2+2,3*1,\'found1\',3*2,\'found2\',\'default\');\n+--------------------------------------------------------+\n| DECODE_ORACLE(2+2,3*1,\'found1\',3*2,\'found2\',\'default\') |\n+--------------------------------------------------------+\n| default |\n+--------------------------------------------------------+\n\nNulls are treated as equivalent:\n\nSELECT DECODE_ORACLE(NULL,NULL,\'Nulls are equivalent\',\'Nulls are not\nequivalent\');\n+----------------------------------------------------------------------------+\n| DECODE_ORACLE(NULL,NULL,\'Nulls are equivalent\',\'Nulls are not equivalent\') |\n+----------------------------------------------------------------------------+\n| Nulls are equivalent |\n+----------------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/decode/','','https://mariadb.com/kb/en/decode/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (125,12,'DECODE_ORACLE','MariaDB starting with 10.3.2\n----------------------------\nDECODE_ORACLE is a synonym for the Oracle mode version of the DECODE function,\nand is available in all modes.\n\nURL: https://mariadb.com/kb/en/decode_oracle/','','https://mariadb.com/kb/en/decode_oracle/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (126,12,'AES_DECRYPT','Syntax\n------\n\nAES_DECRYPT(crypt_str,key_str)\n\nDescription\n-----------\n\nThis function allows decryption of data using the official AES (Advanced\nEncryption Standard) algorithm. For more information, see the description of\nAES_ENCRYPT().\n\nURL: https://mariadb.com/kb/en/aes_decrypt/','','https://mariadb.com/kb/en/aes_decrypt/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (127,12,'AES_ENCRYPT','Syntax\n------\n\nAES_ENCRYPT(str,key_str)\n\nDescription\n-----------\n\nAES_ENCRYPT() and AES_DECRYPT() allow encryption and decryption of data using\nthe official AES (Advanced Encryption Standard) algorithm, previously known as\n\"Rijndael.\" Encoding with a 128-bit key length is used, but you can extend it\nup to 256 bits by modifying the source. We chose 128 bits because it is much\nfaster and it is secure enough for most purposes.\n\nAES_ENCRYPT() encrypts a string str using the key key_str, and returns a\nbinary string.\n\nAES_DECRYPT() decrypts the encrypted string and returns the original string.\n\nThe input arguments may be any length. If either argument is NULL, the result\nof this function is also NULL.\n\nBecause AES is a block-level algorithm, padding is used to encode uneven\nlength strings and so the result string length may be calculated using this\nformula:\n\n16 x (trunc(string_length / 16) + 1)\n\nIf AES_DECRYPT() detects invalid data or incorrect padding, it returns NULL.\nHowever, it is possible for AES_DECRYPT() to return a non-NULL value (possibly\ngarbage) if the input data or the key is invalid.\n\nExamples\n--------\n\nINSERT INTO t VALUES (AES_ENCRYPT(\'text\',SHA2(\'password\',512)));\n\nURL: https://mariadb.com/kb/en/aes_encrypt/','','https://mariadb.com/kb/en/aes_encrypt/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (128,12,'COMPRESS','Syntax\n------\n\nCOMPRESS(string_to_compress)\n\nDescription\n-----------\n\nCompresses a string and returns the result as a binary string. This function\nrequires MariaDB to have been compiled with a compression library such as\nzlib. Otherwise, the return value is always NULL. The compressed string can be\nuncompressed with UNCOMPRESS().\n\nThe have_compress server system variable indicates whether a compression\nlibrary is present.\n\nExamples\n--------\n\nSELECT LENGTH(COMPRESS(REPEAT(\'a\',1000)));\n+------------------------------------+\n| LENGTH(COMPRESS(REPEAT(\'a\',1000))) |\n+------------------------------------+\n| 21 |\n+------------------------------------+\n\nSELECT LENGTH(COMPRESS(\'\'));\n+----------------------+\n| LENGTH(COMPRESS(\'\')) |\n+----------------------+\n| 0 |\n+----------------------+\n\nSELECT LENGTH(COMPRESS(\'a\'));\n+-----------------------+\n| LENGTH(COMPRESS(\'a\')) |\n+-----------------------+\n| 13 |\n+-----------------------+\n\nSELECT LENGTH(COMPRESS(REPEAT(\'a\',16)));\n+----------------------------------+\n| LENGTH(COMPRESS(REPEAT(\'a\',16))) |\n+----------------------------------+\n| 15 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/compress/','','https://mariadb.com/kb/en/compress/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (129,12,'DES_DECRYPT','DES_DECRYPT has been deprecated from MariaDB 10.10.0, and will be removed in a\nfuture release.\n\nSyntax\n------\n\nDES_DECRYPT(crypt_str[,key_str])\n\nDescription\n-----------\n\nDecrypts a string encrypted with DES_ENCRYPT(). If an error occurs, this\nfunction returns NULL.\n\nThis function works only if MariaDB has been configured with TLS support.\n\nIf no key_str argument is given, DES_DECRYPT() examines the first byte of the\nencrypted string to determine the DES key number that was used to encrypt the\noriginal string, and then reads the key from the DES key file to decrypt the\nmessage. For this to work, the user must have the SUPER privilege. The key\nfile can be specified with the --des-key-file server option.\n\nIf you pass this function a key_str argument, that string is used as the key\nfor decrypting the message.\n\nIf the crypt_str argument does not appear to be an encrypted string, MariaDB\nreturns the given crypt_str.\n\nURL: https://mariadb.com/kb/en/des_decrypt/','','https://mariadb.com/kb/en/des_decrypt/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (130,12,'DES_ENCRYPT','DES_ENCRYPT has been deprecated from MariaDB 10.10.0, and will be removed in a\nfuture release.\n\nSyntax\n------\n\nDES_ENCRYPT(str[,{key_num|key_str}])\n\nDescription\n-----------\n\nEncrypts the string with the given key using the Triple-DES algorithm.\n\nThis function works only if MariaDB has been configured with TLS support.\n\nThe encryption key to use is chosen based on the second argument to\nDES_ENCRYPT(), if one was given. With no argument, the first key from the DES\nkey file is used. With a key_num argument, the given key number (0-9) from the\nDES key file is used. With a key_str argument, the given key string is used to\nencrypt str.\n\nThe key file can be specified with the --des-key-file server option.\n\nThe return string is a binary string where the first character is CHAR(128 |\nkey_num). If an error occurs, DES_ENCRYPT() returns NULL.\n\nThe 128 is added to make it easier to recognize an encrypted key. If you use a\nstring key, key_num is 127.\n\nThe string length for the result is given by this formula:\n\nnew_len = orig_len + (8 - (orig_len % 8)) + 1\n\nEach line in the DES key file has the following format:\n\nkey_num des_key_str\n\nEach key_num value must be a number in the range from 0 to 9. Lines in the\nfile may be in any order. des_key_str is the string that is used to encrypt\nthe message. There should be at least one space between the number and the\nkey. The first key is the default key that is used if you do not specify any\nkey argument to DES_ENCRYPT().\n\nYou can tell MariaDB to read new key values from the key file with the FLUSH\nDES_KEY_FILE statement. This requires the RELOAD privilege.\n\nOne benefit of having a set of default keys is that it gives applications a\nway to check for the existence of encrypted column values, without giving the\nend user the right to decrypt those values.\n\nExamples\n--------\n\nSELECT customer_address FROM customer_table \n WHERE crypted_credit_card = DES_ENCRYPT(\'credit_card_number\');\n\nURL: https://mariadb.com/kb/en/des_encrypt/','','https://mariadb.com/kb/en/des_encrypt/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (131,12,'ENCODE','Syntax\n------\n\nENCODE(str,pass_str)\n\nDescription\n-----------\n\nENCODE is not considered cryptographically secure, and should not be used for\npassword encryption.\n\nEncrypt str using pass_str as the password. To decrypt the result, use\nDECODE().\n\nThe result is a binary string of the same length as str.\n\nThe strength of the encryption is based on how good the random generator is.\n\nIt is not recommended to rely on the encryption performed by the ENCODE\nfunction. Using a salt value (changed when a password is updated) will improve\nmatters somewhat, but for storing passwords, consider a more cryptographically\nsecure function, such as SHA2().\n\nExamples\n--------\n\nENCODE(\'not so secret text\', CONCAT(\'random_salt\',\'password\'))\n\nURL: https://mariadb.com/kb/en/encode/','','https://mariadb.com/kb/en/encode/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (132,12,'ENCRYPT','Syntax\n------\n\nENCRYPT(str[,salt])\n\nDescription\n-----------\n\nEncrypts a string using the Unix crypt() system call, returning an encrypted\nbinary string. The salt argument should be a string with at least two\ncharacters or the returned result will be NULL. If no salt argument is given,\na random value of sufficient length is used.\n\nIt is not recommended to use ENCRYPT() with utf16, utf32 or ucs2 multi-byte\ncharacter sets because the crypt() system call expects a string terminated\nwith a zero byte.\n\nNote that the underlying crypt() system call may have some limitations, such\nas ignoring all but the first eight characters.\n\nIf the have_crypt system variable is set to NO (because the crypt() system\ncall is not available), the ENCRYPT function will always return NULL.\n\nExamples\n--------\n\nSELECT ENCRYPT(\'encrypt me\');\n+-----------------------+\n| ENCRYPT(\'encrypt me\') |\n+-----------------------+\n| 4I5BsEx0lqTDk |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/encrypt/','','https://mariadb.com/kb/en/encrypt/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (133,12,'MD5','Syntax\n------\n\nMD5(str)\n\nDescription\n-----------\n\nCalculates an MD5 128-bit checksum for the string.\n\nThe return value is a 32-hex digit string, and as of MariaDB 5.5, is a\nnonbinary string in the connection character set and collation, determined by\nthe values of the character_set_connection and collation_connection system\nvariables. Before 5.5, the return value was a binary string.\n\nNULL is returned if the argument was NULL.\n\nExamples\n--------\n\nSELECT MD5(\'testing\');\n+----------------------------------+\n| MD5(\'testing\') |\n+----------------------------------+\n| ae2b1fca515949e5d54fb22b8ed95575 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/md5/','','https://mariadb.com/kb/en/md5/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (134,12,'OLD_PASSWORD','Syntax\n------\n\nOLD_PASSWORD(str)\n\nDescription\n-----------\n\nOLD_PASSWORD() was added to MySQL when the implementation of PASSWORD() was\nchanged to improve security. OLD_PASSWORD() returns the value of the old\n(pre-MySQL 4.1) implementation of PASSWORD() as a string, and is intended to\npermit you to reset passwords for any pre-4.1 clients that need to connect to\na more recent MySQL server version, or any version of MariaDB, without locking\nthem out.\n\nAs of MariaDB 5.5, the return value is a nonbinary string in the connection\ncharacter set and collation, determined by the values of the\ncharacter_set_connection and collation_connection system variables. Before\n5.5, the return value was a binary string.\n\nThe return value is 16 bytes in length, or NULL if the argument was NULL.\n\nURL: https://mariadb.com/kb/en/old_password/','','https://mariadb.com/kb/en/old_password/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (135,12,'PASSWORD','Syntax\n------\n\nPASSWORD(str)\n\nDescription\n-----------\n\nThe PASSWORD() function is used for hashing passwords for use in\nauthentication by the MariaDB server. It is not intended for use in other\napplications.\n\nCalculates and returns a hashed password string from the plaintext password\nstr. Returns an empty string (>= MariaDB 10.0.4) if the argument was NULL.\n\nThe return value is a nonbinary string in the connection character set and\ncollation, determined by the values of the character_set_connection and\ncollation_connection system variables.\n\nThis is the function that is used for hashing MariaDB passwords for storage in\nthe Password column of the user table (see privileges), usually used with the\nSET PASSWORD statement. It is not intended for use in other applications.\n\nUntil MariaDB 10.3, the return value is 41-bytes in length, and the first\ncharacter is always \'*\'. From MariaDB 10.4, the function takes into account\nthe authentication plugin where applicable (A CREATE USER or SET PASSWORD\nstatement). For example, when used in conjunction with a user authenticated by\nthe ed25519 plugin, the statement will create a longer hash:\n\nCREATE USER edtest@localhost IDENTIFIED VIA ed25519 USING PASSWORD(\'secret\');\n\nCREATE USER edtest2@localhost IDENTIFIED BY \'secret\';\n\nSELECT CONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)) FROM\nmysql.global_priv\n WHERE user LIKE \'edtest%\'\\G\n*************************** 1. row ***************************\nCONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)): edtest@localhost => {\n...\n \"plugin\": \"ed25519\",\n \"authentication_string\": \"ZIgUREUg5PVgQ6LskhXmO+eZLS0nC8be6HPjYWR4YJY\",\n...\n}\n*************************** 2. row ***************************\nCONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)): edtest2@localhost => {\n...\n \"plugin\": \"mysql_native_password\",\n \"authentication_string\": \"*14E65567ABDB5135D0CFD9A70B3032C179A49EE7\",\n...\n}\n\nThe behavior of this function is affected by the value of the old_passwords\nsystem variable. If this is set to 1 (0 is default), MariaDB reverts to using\nthe mysql_old_password authentication plugin by default for newly created\nusers and passwords.\n\nExamples\n--------\n\nSELECT PASSWORD(\'notagoodpwd\');\n+-------------------------------------------+\n| PASSWORD(\'notagoodpwd\') |\n+-------------------------------------------+\n| *3A70EE9FC6594F88CE9E959CD51C5A1C002DC937 |\n+-------------------------------------------+\n\nSET PASSWORD FOR \'bob\'@\'%.loc.gov\' = PASSWORD(\'newpass\');\n\nURL: https://mariadb.com/kb/en/password/','','https://mariadb.com/kb/en/password/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (136,12,'SHA1','Syntax\n------\n\nSHA1(str), SHA(str)\n\nDescription\n-----------\n\nCalculates an SHA-1 160-bit checksum for the string str, as described in RFC\n3174 (Secure Hash Algorithm).\n\nThe value is returned as a string of 40 hex digits, or NULL if the argument\nwas NULL. As of MariaDB 5.5, the return value is a nonbinary string in the\nconnection character set and collation, determined by the values of the\ncharacter_set_connection and collation_connection system variables. Before\n5.5, the return value was a binary string.\n\nExamples\n--------\n\nSELECT SHA1(\'some boring text\');\n+------------------------------------------+\n| SHA1(\'some boring text\') |\n+------------------------------------------+\n| af969fc2085b1bb6d31e517d5c456def5cdd7093 |\n+------------------------------------------+\n\nURL: https://mariadb.com/kb/en/sha1/','','https://mariadb.com/kb/en/sha1/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (137,12,'SHA2','Syntax\n------\n\nSHA2(str,hash_len)\n\nDescription\n-----------\n\nGiven a string str, calculates an SHA-2 checksum, which is considered more\ncryptographically secure than its SHA-1 equivalent. The SHA-2 family includes\nSHA-224, SHA-256, SHA-384, and SHA-512, and the hash_len must correspond to\none of these, i.e. 224, 256, 384 or 512. 0 is equivalent to 256.\n\nThe return value is a nonbinary string in the connection character set and\ncollation, determined by the values of the character_set_connection and\ncollation_connection system variables.\n\nNULL is returned if the hash length is not valid, or the string str is NULL.\n\nSHA2 will only work if MariaDB was has been configured with TLS support.\n\nExamples\n--------\n\nSELECT SHA2(\'Maria\',224);\n+----------------------------------------------------------+\n| SHA2(\'Maria\',224) |\n+----------------------------------------------------------+\n| 6cc67add32286412efcab9d0e1675a43a5c2ef3cec8879f81516ff83 |\n+----------------------------------------------------------+\n\nSELECT SHA2(\'Maria\',256);\n+------------------------------------------------------------------+\n| SHA2(\'Maria\',256) |\n+------------------------------------------------------------------+\n| 9ff18ebe7449349f358e3af0b57cf7a032c1c6b2272cb2656ff85eb112232f16 |\n+------------------------------------------------------------------+\n\nSELECT SHA2(\'Maria\',0);\n+------------------------------------------------------------------+\n| SHA2(\'Maria\',0) |\n+------------------------------------------------------------------+\n| 9ff18ebe7449349f358e3af0b57cf7a032c1c6b2272cb2656ff85eb112232f16 |\n+------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/sha2/','','https://mariadb.com/kb/en/sha2/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (138,13,'ENDPOINT','A synonym for ST_ENDPOINT.\n\nURL: https://mariadb.com/kb/en/linestring-properties-endpoint/','','https://mariadb.com/kb/en/linestring-properties-endpoint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (139,13,'GLENGTH','Syntax\n------\n\nGLength(ls)\n\nDescription\n-----------\n\nReturns as a double-precision number the length of the LineString value ls in\nits associated spatial reference.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT GLength(GeomFromText(@ls));\n+----------------------------+\n| GLength(GeomFromText(@ls)) |\n+----------------------------+\n| 2.82842712474619 |\n+----------------------------+\n\nURL: https://mariadb.com/kb/en/glength/','','https://mariadb.com/kb/en/glength/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (140,13,'NumPoints','A synonym for ST_NumPoints.\n\nURL: https://mariadb.com/kb/en/linestring-properties-numpoints/','','https://mariadb.com/kb/en/linestring-properties-numpoints/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (141,13,'PointN','A synonym for ST_PointN.\n\nURL: https://mariadb.com/kb/en/linestring-properties-pointn/','','https://mariadb.com/kb/en/linestring-properties-pointn/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (142,13,'STARTPOINT','A synonym for ST_STARTPOINT.\n\nURL: https://mariadb.com/kb/en/linestring-properties-startpoint/','','https://mariadb.com/kb/en/linestring-properties-startpoint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (143,13,'ST_ENDPOINT','Syntax\n------\n\nST_EndPoint(ls)\nEndPoint(ls)\n\nDescription\n-----------\n\nReturns the Point that is the endpoint of the LineString value ls.\n\nST_EndPoint() and EndPoint() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT AsText(EndPoint(GeomFromText(@ls)));\n+-------------------------------------+\n| AsText(EndPoint(GeomFromText(@ls))) |\n+-------------------------------------+\n| POINT(3 3) |\n+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_endpoint/','','https://mariadb.com/kb/en/st_endpoint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (144,13,'ST_NUMPOINTS','Syntax\n------\n\nST_NumPoints(ls)\nNumPoints(ls)\n\nDescription\n-----------\n\nReturns the number of Point objects in the LineString value ls.\n\nST_NumPoints() and NumPoints() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT NumPoints(GeomFromText(@ls));\n+------------------------------+\n| NumPoints(GeomFromText(@ls)) |\n+------------------------------+\n| 3 |\n+------------------------------+\n\nURL: https://mariadb.com/kb/en/st_numpoints/','','https://mariadb.com/kb/en/st_numpoints/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (145,13,'ST_POINTN','Syntax\n------\n\nST_PointN(ls,N)\nPointN(ls,N)\n\nDescription\n-----------\n\nReturns the N-th Point in the LineString value ls. Points are numbered\nbeginning with 1.\n\nST_PointN() and PointN() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT AsText(PointN(GeomFromText(@ls),2));\n+-------------------------------------+\n| AsText(PointN(GeomFromText(@ls),2)) |\n+-------------------------------------+\n| POINT(2 2) |\n+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_pointn/','','https://mariadb.com/kb/en/st_pointn/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (146,13,'ST_STARTPOINT','Syntax\n------\n\nST_StartPoint(ls)\nStartPoint(ls)\n\nDescription\n-----------\n\nReturns the Point that is the start point of the LineString value ls.\n\nST_StartPoint() and StartPoint() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT AsText(StartPoint(GeomFromText(@ls)));\n+---------------------------------------+\n| AsText(StartPoint(GeomFromText(@ls))) |\n+---------------------------------------+\n| POINT(1 1) |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_startpoint/','','https://mariadb.com/kb/en/st_startpoint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (147,14,'GET_LOCK','Syntax\n------\n\nGET_LOCK(str,timeout)\n\nDescription\n-----------\n\nTries to obtain a lock with a name given by the string str, using a timeout of\ntimeout seconds. Returns 1 if the lock was obtained successfully, 0 if the\nattempt timed out (for example, because another client has previously locked\nthe name), or NULL if an error occurred (such as running out of memory or the\nthread was killed with mysqladmin kill).\n\nA lock is released with RELEASE_LOCK(), when the connection terminates (either\nnormally or abnormally). A connection can hold multiple locks at the same\ntime, so a lock that is no longer needed needs to be explicitly released.\n\nThe IS_FREE_LOCK function returns whether a specified lock a free or not, and\nthe IS_USED_LOCK whether the function is in use or not.\n\nLocks obtained with GET_LOCK() do not interact with transactions. That is,\ncommitting a transaction does not release any such locks obtained during the\ntransaction.\n\nIt is also possible to recursively set the same lock. If a lock with the same\nname is set n times, it needs to be released n times as well.\n\nstr is case insensitive for GET_LOCK() and related functions. If str is an\nempty string or NULL, GET_LOCK() returns NULL and does nothing. From MariaDB\n10.2.2, timeout supports microseconds. Before then, it was rounded to the\nclosest integer.\n\nIf the metadata_lock_info plugin is installed, locks acquired with this\nfunction are visible in the Information Schema METADATA_LOCK_INFO table.\n\nThis function can be used to implement application locks or to simulate record\nlocks. Names are locked on a server-wide basis. If a name has been locked by\none client, GET_LOCK() blocks any request by another client for a lock with\nthe same name. This allows clients that agree on a given lock name to use the\nname to perform cooperative advisory locking. But be aware that it also allows\na client that is not among the set of cooperating clients to lock a name,\neither inadvertently or deliberately, and thus prevent any of the cooperating\nclients from locking that name. One way to reduce the likelihood of this is to\nuse lock names that are database-specific or application-specific. For\nexample, use lock names of the form db_name.str or app_name.str.\n\nStatements using the GET_LOCK function are not safe for statement-based\nreplication.\n\nThe patch to permit multiple locks was contributed by Konstantin \"Kostja\"\nOsipov (MDEV-3917).\n\nExamples\n--------\n\nSELECT GET_LOCK(\'lock1\',10);\n+----------------------+\n| GET_LOCK(\'lock1\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT IS_FREE_LOCK(\'lock1\'), IS_USED_LOCK(\'lock1\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock1\') | IS_USED_LOCK(\'lock1\') |\n+-----------------------+-----------------------+\n| 0 | 46 |\n+-----------------------+-----------------------+\n\nSELECT IS_FREE_LOCK(\'lock2\'), IS_USED_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock2\') | IS_USED_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 1 | NULL |\n+-----------------------+-----------------------+\n\nMultiple locks can be held:\n\nSELECT GET_LOCK(\'lock2\',10);\n+----------------------+\n| GET_LOCK(\'lock2\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT IS_FREE_LOCK(\'lock1\'), IS_FREE_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock1\') | IS_FREE_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 0 | 0 |\n+-----------------------+-----------------------+\n\nSELECT RELEASE_LOCK(\'lock1\'), RELEASE_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| RELEASE_LOCK(\'lock1\') | RELEASE_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 1 | 1 |\n+-----------------------+-----------------------+\n\nIt is possible to hold the same lock recursively. This example is viewed using\nthe metadata_lock_info plugin:\n\nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA |\nTABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 |\n |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n\nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA |\nTABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 |\n |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n\nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\nEmpty set (0.000 sec)\n\nTimeout example: Connection 1:\n\nSELECT GET_LOCK(\'lock4\',10);\n+----------------------+\n| GET_LOCK(\'lock4\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 2:\n\nSELECT GET_LOCK(\'lock4\',10);\n\nAfter 10 seconds...\n\n+----------------------+\n| GET_LOCK(\'lock4\',10) |\n+----------------------+\n| 0 |\n+----------------------+\n\nDeadlocks are automatically detected and resolved. Connection 1:\n\nSELECT GET_LOCK(\'lock5\',10); \n+----------------------+\n| GET_LOCK(\'lock5\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 2:\n\nSELECT GET_LOCK(\'lock6\',10);\n+----------------------+\n| GET_LOCK(\'lock6\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 1:\n\nSELECT GET_LOCK(\'lock6\',10); \n+----------------------+\n| GET_LOCK(\'lock6\',10) |\n+----------------------+\n| 0 |\n+----------------------+\n\nConnection 2:\n\nSELECT GET_LOCK(\'lock5\',10);\nERROR 1213 (40001): Deadlock found when trying to get lock; try restarting\ntransaction\n\nURL: https://mariadb.com/kb/en/get_lock/','','https://mariadb.com/kb/en/get_lock/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (148,14,'INET6_ATON','Syntax\n------\n\nINET6_ATON(expr)\n\nDescription\n-----------\n\nGiven an IPv6 or IPv4 network address as a string, returns a binary string\nthat represents the numeric value of the address.\n\nNo trailing zone ID\'s or traling network masks are permitted. For IPv4\naddresses, or IPv6 addresses with IPv4 address parts, no classful addresses or\ntrailing port numbers are permitted and octal numbers are not supported.\n\nThe returned binary string will be VARBINARY(16) or VARBINARY(4) for IPv6 and\nIPv4 addresses respectively.\n\nReturns NULL if the argument is not understood.\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, INET6_ATON can take INET6 as an argument.\n\nExamples\n--------\n\nSELECT HEX(INET6_ATON(\'10.0.1.1\'));\n+-----------------------------+\n| HEX(INET6_ATON(\'10.0.1.1\')) |\n+-----------------------------+\n| 0A000101 |\n+-----------------------------+\n\nSELECT HEX(INET6_ATON(\'48f3::d432:1431:ba23:846f\'));\n+----------------------------------------------+\n| HEX(INET6_ATON(\'48f3::d432:1431:ba23:846f\')) |\n+----------------------------------------------+\n| 48F3000000000000D4321431BA23846F |\n+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/inet6_aton/','','https://mariadb.com/kb/en/inet6_aton/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (149,14,'INET6_NTOA','Syntax\n------\n\nINET6_NTOA(expr)\n\nDescription\n-----------\n\nGiven an IPv6 or IPv4 network address as a numeric binary string, returns the\naddress as a nonbinary string in the connection character set.\n\nThe return string is lowercase, and is platform independent, since it does not\nuse functions specific to the operating system. It has a maximum length of 39\ncharacters.\n\nReturns NULL if the argument is not understood.\n\nExamples\n--------\n\nSELECT INET6_NTOA(UNHEX(\'0A000101\'));\n+-------------------------------+\n| INET6_NTOA(UNHEX(\'0A000101\')) |\n+-------------------------------+\n| 10.0.1.1 |\n+-------------------------------+\n\nSELECT INET6_NTOA(UNHEX(\'48F3000000000000D4321431BA23846F\'));\n+-------------------------------------------------------+\n| INET6_NTOA(UNHEX(\'48F3000000000000D4321431BA23846F\')) |\n+-------------------------------------------------------+\n| 48f3::d432:1431:ba23:846f |\n+-------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/inet6_ntoa/','','https://mariadb.com/kb/en/inet6_ntoa/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (150,14,'INET_ATON','Syntax\n------\n\nINET_ATON(expr)\n\nDescription\n-----------\n\nGiven the dotted-quad representation of an IPv4 network address as a string,\nreturns an integer that represents the numeric value of the address. Addresses\nmay be 4- or 8-byte addresses.\n\nReturns NULL if the argument is not understood.\n\nExamples\n--------\n\nSELECT INET_ATON(\'192.168.1.1\');\n+--------------------------+\n| INET_ATON(\'192.168.1.1\') |\n+--------------------------+\n| 3232235777 |\n+--------------------------+\n\nThis is calculated as follows: 192 x 2563 + 168 x 256 2 + 1 x 256 + 1\n\nURL: https://mariadb.com/kb/en/inet_aton/','','https://mariadb.com/kb/en/inet_aton/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (151,14,'INET_NTOA','Syntax\n------\n\nINET_NTOA(expr)\n\nDescription\n-----------\n\nGiven a numeric IPv4 network address in network byte order (4 or 8 byte),\nreturns the dotted-quad representation of the address as a string.\n\nExamples\n--------\n\nSELECT INET_NTOA(3232235777);\n+-----------------------+\n| INET_NTOA(3232235777) |\n+-----------------------+\n| 192.168.1.1 |\n+-----------------------+\n\n192.168.1.1 corresponds to 3232235777 since 192 x 2563 + 168 x 256 2 + 1 x 256\n+ 1 = 3232235777\n\nURL: https://mariadb.com/kb/en/inet_ntoa/','','https://mariadb.com/kb/en/inet_ntoa/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (152,14,'IS_FREE_LOCK','Syntax\n------\n\nIS_FREE_LOCK(str)\n\nDescription\n-----------\n\nChecks whether the lock named str is free to use (that is, not locked).\nReturns 1 if the lock is free (no one is using the lock), 0 if the lock is in\nuse, and NULL if an error occurs (such as an incorrect argument, like an empty\nstring or NULL). str is case insensitive.\n\nIf the metadata_lock_info plugin is installed, the Information Schema\nmetadata_lock_info table contains information about locks of this kind (as\nwell as metadata locks).\n\nStatements using the IS_FREE_LOCK function are not safe for statement-based\nreplication.\n\nURL: https://mariadb.com/kb/en/is_free_lock/','','https://mariadb.com/kb/en/is_free_lock/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (153,14,'IS_IPV4','Syntax\n------\n\nIS_IPV4(expr)\n\nDescription\n-----------\n\nIf the expression is a valid IPv4 address, returns 1, otherwise returns 0.\n\nIS_IPV4() is stricter than INET_ATON(), but as strict as INET6_ATON(), in\ndetermining the validity of an IPv4 address. This implies that if IS_IPV4\nreturns 1, the same expression will always return a non-NULL result when\npassed to INET_ATON(), but that the reverse may not apply.\n\nExamples\n--------\n\nSELECT IS_IPV4(\'1110.0.1.1\');\n+-----------------------+\n| IS_IPV4(\'1110.0.1.1\') |\n+-----------------------+\n| 0 |\n+-----------------------+\n\nSELECT IS_IPV4(\'48f3::d432:1431:ba23:846f\');\n+--------------------------------------+\n| IS_IPV4(\'48f3::d432:1431:ba23:846f\') |\n+--------------------------------------+\n| 0 |\n+--------------------------------------+\n\nURL: https://mariadb.com/kb/en/is_ipv4/','','https://mariadb.com/kb/en/is_ipv4/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (154,14,'IS_IPV4_COMPAT','Syntax\n------\n\nIS_IPV4_COMPAT(expr)\n\nDescription\n-----------\n\nReturns 1 if a given numeric binary string IPv6 address, such as returned by\nINET6_ATON(), is IPv4-compatible, otherwise returns 0.\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, when the argument is not INET6, automatic implicit CAST\nto INET6 is applied. As a consequence, IS_IPV4_COMPAT now understands\narguments in both text representation and binary(16) representation. Before\nMariaDB 10.5.0, the function understood only binary(16) representation.\n\nExamples\n--------\n\nSELECT IS_IPV4_COMPAT(INET6_ATON(\'::10.0.1.1\'));\n+------------------------------------------+\n| IS_IPV4_COMPAT(INET6_ATON(\'::10.0.1.1\')) |\n+------------------------------------------+\n| 1 |\n+------------------------------------------+\n\nSELECT IS_IPV4_COMPAT(INET6_ATON(\'::48f3::d432:1431:ba23:846f\'));\n+-----------------------------------------------------------+\n| IS_IPV4_COMPAT(INET6_ATON(\'::48f3::d432:1431:ba23:846f\')) |\n+-----------------------------------------------------------+\n| 0 |\n+-----------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/is_ipv4_compat/','','https://mariadb.com/kb/en/is_ipv4_compat/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (155,14,'IS_IPV4_MAPPED','Syntax\n------\n\nIS_IPV4_MAPPED(expr)\n\nDescription\n-----------\n\nReturns 1 if a given a numeric binary string IPv6 address, such as returned by\nINET6_ATON(), is a valid IPv4-mapped address, otherwise returns 0.\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, when the argument is not INET6, automatic implicit CAST\nto INET6 is applied. As a consequence, IS_IPV4_MAPPED now understands\narguments in both text representation and binary(16) representation. Before\nMariaDB 10.5.0, the function understood only binary(16) representation.\n\nExamples\n--------\n\nSELECT IS_IPV4_MAPPED(INET6_ATON(\'::10.0.1.1\'));\n+------------------------------------------+\n| IS_IPV4_MAPPED(INET6_ATON(\'::10.0.1.1\')) |\n+------------------------------------------+\n| 0 |\n+------------------------------------------+\n\nSELECT IS_IPV4_MAPPED(INET6_ATON(\'::ffff:10.0.1.1\'));\n+-----------------------------------------------+\n| IS_IPV4_MAPPED(INET6_ATON(\'::ffff:10.0.1.1\')) |\n+-----------------------------------------------+\n| 1 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/is_ipv4_mapped/','','https://mariadb.com/kb/en/is_ipv4_mapped/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (156,14,'IS_IPV6','Syntax\n------\n\nIS_IPV6(expr)\n\nDescription\n-----------\n\nReturns 1 if the expression is a valid IPv6 address specified as a string,\notherwise returns 0. Does not consider IPv4 addresses to be valid IPv6\naddresses.\n\nExamples\n--------\n\nSELECT IS_IPV6(\'48f3::d432:1431:ba23:846f\');\n+--------------------------------------+\n| IS_IPV6(\'48f3::d432:1431:ba23:846f\') |\n+--------------------------------------+\n| 1 |\n+--------------------------------------+\n1 row in set (0.02 sec)\n\nSELECT IS_IPV6(\'10.0.1.1\');\n+---------------------+\n| IS_IPV6(\'10.0.1.1\') |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/is_ipv6/','','https://mariadb.com/kb/en/is_ipv6/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (157,14,'IS_USED_LOCK','Syntax\n------\n\nIS_USED_LOCK(str)\n\nDescription\n-----------\n\nChecks whether the lock named str is in use (that is, locked). If so, it\nreturns the connection identifier of the client that holds the lock.\nOtherwise, it returns NULL. str is case insensitive.\n\nIf the metadata_lock_info plugin is installed, the Information Schema\nmetadata_lock_info table contains information about locks of this kind (as\nwell as metadata locks).\n\nStatements using the IS_USED_LOCK function are not safe for statement-based\nreplication.\n\nURL: https://mariadb.com/kb/en/is_used_lock/','','https://mariadb.com/kb/en/is_used_lock/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (158,14,'MASTER_GTID_WAIT','Syntax\n------\n\nMASTER_GTID_WAIT(gtid-list[, timeout)\n\nDescription\n-----------\n\nThis function takes a string containing a comma-separated list of global\ntransaction id\'s (similar to the value of, for example, gtid_binlog_pos). It\nwaits until the value of gtid_slave_pos has the same or higher seq_no within\nall replication domains specified in the gtid-list; in other words, it waits\nuntil the slave has reached the specified GTID position.\n\nAn optional second argument gives a timeout in seconds. If the timeout expires\nbefore the specified GTID position is reached, then the function returns -1.\nPassing NULL or a negative number for the timeout means no timeout, and the\nfunction will wait indefinitely.\n\nIf the wait completes without a timeout, 0 is returned. Passing NULL for the\ngtid-list makes the function return NULL immediately, without waiting.\n\nThe gtid-list may be the empty string, in which case MASTER_GTID_WAIT()\nreturns immediately. If the gtid-list contains fewer domains than\ngtid_slave_pos, then only those domains are waited upon. If gtid-list contains\na domain that is not present in @@gtid_slave_pos, then MASTER_GTID_WAIT() will\nwait until an event containing such domain_id arrives on the slave (or until\ntimed out or killed).\n\nMASTER_GTID_WAIT() can be useful to ensure that a slave has caught up to a\nmaster. Simply take the value of gtid_binlog_pos on the master, and use it in\na MASTER_GTID_WAIT() call on the slave; when the call completes, the slave\nwill have caught up with that master position.\n\nMASTER_GTID_WAIT() can also be used in client applications together with the\nlast_gtid session variable. This is useful in a read-scaleout replication\nsetup, where the application writes to a single master but divides the reads\nout to a number of slaves to distribute the load. In such a setup, there is a\nrisk that an application could first do an update on the master, and then a\nbit later do a read on a slave, and if the slave is not fast enough, the data\nread from the slave might not include the update just made, possibly confusing\nthe application and/or the end-user. One way to avoid this is to request the\nvalue of last_gtid on the master just after the update. Then before doing the\nread on the slave, do a MASTER_GTID_WAIT() on the value obtained from the\nmaster; this will ensure that the read is not performed until the slave has\nreplicated sufficiently far for the update to have become visible.\n\nNote that MASTER_GTID_WAIT() can be used even if the slave is configured not\nto use GTID for connections (CHANGE MASTER TO master_use_gtid=no). This is\nbecause from MariaDB 10, GTIDs are always logged on the master server, and\nalways recorded on the slave servers.\n\nDifferences to MASTER_POS_WAIT()\n--------------------------------\n\n* MASTER_GTID_WAIT() is global; it waits for any master connection to reach\n the specified GTID position. MASTER_POS_WAIT() works only against a\n specific connection. This also means that while MASTER_POS_WAIT() aborts if\n its master connection is terminated with STOP SLAVE or due to an error,\n MASTER_GTID_WAIT() continues to wait while slaves are stopped.\n\n* MASTER_GTID_WAIT() can take its timeout as a floating-point value, so a\n timeout in fractional seconds is supported, eg. MASTER_GTID_WAIT(\"0-1-100\",\n 0.5). (The minimum wait is one microsecond, 0.000001 seconds).\n\n* MASTER_GTID_WAIT() allows one to specify a timeout of zero in order to do a\n non-blocking check to see if the slaves have progressed to a specific GTID\nposition\n (MASTER_POS_WAIT() takes a zero timeout as meaning an infinite wait). To do\n an infinite MASTER_GTID_WAIT(), specify a negative timeout, or omit the\n timeout argument.\n\n* MASTER_GTID_WAIT() does not return the number of events executed since the\n wait started, nor does it return NULL if a slave thread is stopped. It\n always returns either 0 for successful wait completed, or -1 for timeout\n reached (or NULL if the specified gtid-pos is NULL).\n\nSince MASTER_GTID_WAIT() looks only at the seq_no part of the GTIDs, not the\nserver_id, care is needed if a slave becomes diverged from another server so\nthat two different GTIDs with the same seq_no (in the same domain) arrive at\nthe same server. This situation is in any case best avoided; setting\ngtid_strict_mode is recommended, as this will prevent any such out-of-order\nsequence numbers from ever being replicated on a slave.\n\nURL: https://mariadb.com/kb/en/master_gtid_wait/','','https://mariadb.com/kb/en/master_gtid_wait/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (159,14,'MASTER_POS_WAIT','Syntax\n------\n\nMASTER_POS_WAIT(log_name,log_pos[,timeout,[\"connection_name\"]])\n\nDescription\n-----------\n\nThis function is useful in replication for controlling primary/replica\nsynchronization. It blocks until the replica has read and applied all updates\nup to the specified position (log_name,log_pos) in the primary log. The return\nvalue is the number of log events the replica had to wait for to advance to\nthe specified position. The function returns NULL if the replica SQL thread is\nnot started, the replica\'s primary information is not initialized, the\narguments are incorrect, or an error occurs. It returns -1 if the timeout has\nbeen exceeded. If the replica SQL thread stops while MASTER_POS_WAIT() is\nwaiting, the function returns NULL. If the replica is past the specified\nposition, the function returns immediately.\n\nIf a timeout value is specified, MASTER_POS_WAIT() stops waiting when timeout\nseconds have elapsed. timeout must be greater than 0; a zero or negative\ntimeout means no timeout.\n\nThe connection_name is used when you are using multi-source-replication. If\nyou don\'t specify it, it\'s set to the value of the default_master_connection\nsystem variable.\n\nStatements using the MASTER_POS_WAIT() function are not safe for replication.\n\nURL: https://mariadb.com/kb/en/master_pos_wait/','','https://mariadb.com/kb/en/master_pos_wait/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (160,14,'NAME_CONST','Syntax\n------\n\nNAME_CONST(name,value)\n\nDescription\n-----------\n\nReturns the given value. When used to produce a result set column,\nNAME_CONST() causes the column to have the given name. The arguments should be\nconstants.\n\nThis function is used internally when replicating stored procedures. It makes\nlittle sense to use it explicitly in SQL statements, and it was not supposed\nto be used like that.\n\nSELECT NAME_CONST(\'myname\', 14);\n+--------+\n| myname |\n+--------+\n| 14 |\n+--------+\n\nURL: https://mariadb.com/kb/en/name_const/','','https://mariadb.com/kb/en/name_const/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (161,14,'RELEASE_ALL_LOCKS','MariaDB until 10.5.2\n--------------------\nRELEASE_ALL_LOCKS was added in MariaDB 10.5.2.\n\nSyntax\n------\n\nRELEASE_ALL_LOCKS()\n\nDescription\n-----------\n\nReleases all named locks held by the current session. Returns the number of\nlocks released, or 0 if none were held.\n\nStatements using the RELEASE_ALL_LOCKS function are not safe for\nstatement-based replication.\n\nExamples\n--------\n\nSELECT RELEASE_ALL_LOCKS();\n+---------------------+\n| RELEASE_ALL_LOCKS() | \n+---------------------+\n| 0 |\n+---------------------+\n\nSELECT GET_LOCK(\'lock1\',10);\n+----------------------+\n| GET_LOCK(\'lock1\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT RELEASE_ALL_LOCKS();\n+---------------------+\n| RELEASE_ALL_LOCKS() | \n+---------------------+\n| 1 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/release_all_locks/','','https://mariadb.com/kb/en/release_all_locks/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (162,14,'RELEASE_LOCK','Syntax\n------\n\nRELEASE_LOCK(str)\n\nDescription\n-----------\n\nReleases the lock named by the string str that was obtained with GET_LOCK().\nReturns 1 if the lock was released, 0 if the lock was not established by this\nthread (in which case the lock is not released), and NULL if the named lock\ndid not exist. The lock does not exist if it was never obtained by a call to\nGET_LOCK() or if it has previously been released.\n\nstr is case insensitive. If str is an empty string or NULL, RELEASE_LOCK()\nreturns NULL and does nothing.\n\nStatements using the RELEASE_LOCK() function are not safe for replication.\n\nThe DO statement is convenient to use with RELEASE_LOCK().\n\nExamples\n--------\n\nConnection1:\n\nSELECT GET_LOCK(\'lock1\',10);\n+----------------------+\n| GET_LOCK(\'lock1\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 2:\n\nSELECT GET_LOCK(\'lock2\',10);\n+----------------------+\n| GET_LOCK(\'lock2\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 1:\n\nSELECT RELEASE_LOCK(\'lock1\'), RELEASE_LOCK(\'lock2\'), RELEASE_LOCK(\'lock3\');\n+-----------------------+-----------------------+-----------------------+\n| RELEASE_LOCK(\'lock1\') | RELEASE_LOCK(\'lock2\') | RELEASE_LOCK(\'lock3\') |\n+-----------------------+-----------------------+-----------------------+\n| 1 | 0 | NULL |\n+-----------------------+-----------------------+-----------------------+\n\nFrom MariaDB 10.0.2, it is possible to hold the same lock recursively. This\nexample is viewed using the metadata_lock_info plugin:\n\nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA |\nTABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 |\n |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n\nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA |\nTABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 |\n |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n\nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\nEmpty set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/release_lock/','','https://mariadb.com/kb/en/release_lock/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (163,14,'SLEEP','Syntax\n------\n\nSLEEP(duration)\n\nDescription\n-----------\n\nSleeps (pauses) for the number of seconds given by the duration argument, then\nreturns 0. If SLEEP() is interrupted, it returns 1. The duration may have a\nfractional part given in microseconds.\n\nStatements using the SLEEP() function are not safe for replication.\n\nExample\n-------\n\nSELECT SLEEP(5.5);\n+------------+\n| SLEEP(5.5) |\n+------------+\n| 0 |\n+------------+\n1 row in set (5.50 sec)\n\nURL: https://mariadb.com/kb/en/sleep/','','https://mariadb.com/kb/en/sleep/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (164,14,'SYS_GUID','MariaDB starting with 10.6.1\n----------------------------\nThe SYS_GUID function was introduced in MariaDB 10.6.1 to enhance Oracle\ncompatibility. Similar functionality can be achieved with the UUID function.\n\nSyntax\n------\n\nSYS_GUID()\n\nDescription\n-----------\n\nReturns a 16-byte globally unique identifier (GUID), similar to the UUID\nfunction, but without the - character.\n\nExample\n-------\n\nSELECT SYS_GUID();\n+----------------------------------+\n| SYS_GUID() |\n+----------------------------------+\n| 2C574E45BA2811EBB265F859713E4BE4 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/sys_guid/','','https://mariadb.com/kb/en/sys_guid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (165,14,'UUID','Syntax\n------\n\nUUID()\n\nDescription\n-----------\n\nReturns a Universally Unique Identifier (UUID).\n\nA UUID is designed as a number that is globally unique in space and time. Two\ncalls to UUID() are expected to generate two different values, even if these\ncalls are performed on two separate computers that are not connected to each\nother.\n\nUUID() results are intended to be unique, but cannot always be relied upon to\nunpredictable and unguessable, so should not be relied upon for these purposes.\n\nA UUID is a 128-bit number represented by a utf8 string of five hexadecimal\nnumbers in aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee format:\n\n* The first three numbers are generated from a timestamp.\n* The fourth number preserves temporal uniqueness in case the timestamp value\n loses monotonicity (for example, due to daylight saving time).\n* The fifth number is an IEEE 802 node number that provides spatial uniqueness.\n A random number is substituted if the latter is not available (for example,\n because the host computer has no Ethernet card, or we do not know how to find\n the hardware address of an interface on your operating system). In this case,\n spatial uniqueness cannot be guaranteed. Nevertheless, a collision should\n have very low probability.\n\nCurrently, the MAC address of an interface is taken into account only on\nFreeBSD and Linux. On other operating systems, MariaDB uses a randomly\ngenerated 48-bit number.\n\nStatements using the UUID() function are not safe for replication.\n\nThe results are generated according to the \"DCE 1.1:Remote Procedure Call\"\n(Appendix A) CAE (Common Applications Environment) Specifications published by\nThe Open Group in October 1997 (Document Number C706).\n\nExamples\n--------\n\nSELECT UUID();\n+--------------------------------------+\n| UUID() |\n+--------------------------------------+\n| cd41294a-afb0-11df-bc9b-00241dd75637 |\n+--------------------------------------+\n\nURL: https://mariadb.com/kb/en/uuid/','','https://mariadb.com/kb/en/uuid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (166,14,'UUID_SHORT','Syntax\n------\n\nUUID_SHORT()\n\nDescription\n-----------\n\nReturns a \"short\" universally unique identifier as a 64-bit unsigned integer\n(rather than a string-form 128-bit identifier as returned by the UUID()\nfunction).\n\nThe value of UUID_SHORT() is guaranteed to be unique if the following\nconditions hold:\n\n* The server_id of the current host is unique among your set of master and\n slave servers\n* server_id is between 0 and 255\n* You don\'t set back your system time for your server between mysqld restarts\n* You do not invoke UUID_SHORT() on average more than 16\n million times per second between mysqld restarts\n\nThe UUID_SHORT() return value is constructed this way:\n\n(server_id & 255) << 56\n+ (server_startup_time_in_seconds << 24)\n+ incremented_variable++;\n\nStatements using the UUID_SHORT() function are not safe for statement-based\nreplication.\n\nExamples\n--------\n\nSELECT UUID_SHORT();\n+-------------------+\n| UUID_SHORT() |\n+-------------------+\n| 21517162376069120 |\n+-------------------+\n\ncreate table t1 (a bigint unsigned default(uuid_short()) primary key);\ninsert into t1 values(),();\nselect * from t1;\n+-------------------+\n| a |\n+-------------------+\n| 98113699159474176 |\n| 98113699159474177 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/uuid_short/','','https://mariadb.com/kb/en/uuid_short/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (167,14,'VALUES / VALUE','Syntax\n------\n\nMariaDB starting with 10.3.3\n----------------------------\n\nVALUE(col_name)\n\nMariaDB until 10.3.2\n--------------------\n\nVALUES(col_name)\n\nDescription\n-----------\n\nIn an INSERT ... ON DUPLICATE KEY UPDATE statement, you can use the\nVALUES(col_name) function in the UPDATE clause to refer to column values from\nthe INSERT portion of the statement. In other words, VALUES(col_name) in the\nUPDATE clause refers to the value of col_name that would be inserted, had no\nduplicate-key conflict occurred. This function is especially useful in\nmultiple-row inserts.\n\nThe VALUES() function is meaningful only in INSERT ... ON DUPLICATE KEY UPDATE\nstatements and returns NULL otherwise.\n\nIn MariaDB 10.3.3 this function was renamed to VALUE(), because it\'s\nincompatible with the standard Table Value Constructors syntax, implemented in\nMariaDB 10.3.3.\n\nThe VALUES() function can still be used even from MariaDB 10.3.3, but only in\nINSERT ... ON DUPLICATE KEY UPDATE statements; it\'s a syntax error otherwise.\n\nExamples\n--------\n\nMariaDB starting with 10.3.3\n----------------------------\n\nINSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6)\n ON DUPLICATE KEY UPDATE c=VALUE(a)+VALUE(b);\n\nMariaDB until 10.3.2\n--------------------\n\nINSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6)\n ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);\n\nURL: https://mariadb.com/kb/en/values-value/','','https://mariadb.com/kb/en/values-value/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (168,15,'!','Syntax\n------\n\nNOT, !\n\nDescription\n-----------\n\nLogical NOT. Evaluates to 1 if the operand is 0, to 0 if the operand is\nnon-zero, and NOT NULL returns NULL.\n\nBy default, the ! operator has a higher precedence. If the HIGH_NOT_PRECEDENCE\nSQL_MODE flag is set, NOT and ! have the same precedence.\n\nExamples\n--------\n\nSELECT NOT 10;\n+--------+\n| NOT 10 |\n+--------+\n| 0 |\n+--------+\n\nSELECT NOT 0;\n+-------+\n| NOT 0 |\n+-------+\n| 1 |\n+-------+\n\nSELECT NOT NULL;\n+----------+\n| NOT NULL |\n+----------+\n| NULL |\n+----------+\n\nSELECT ! (1+1);\n+---------+\n| ! (1+1) |\n+---------+\n| 0 |\n+---------+\n\nSELECT ! 1+1;\n+-------+\n| ! 1+1 |\n+-------+\n| 1 |\n+-------+\n\nURL: https://mariadb.com/kb/en/not/','','https://mariadb.com/kb/en/not/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (169,15,'&&','Syntax\n------\n\nAND, &&\n\nDescription\n-----------\n\nLogical AND. Evaluates to 1 if all operands are non-zero and not NULL, to 0 if\none or more operands are 0, otherwise NULL is returned.\n\nFor this operator, short-circuit evaluation can be used.\n\nExamples\n--------\n\nSELECT 1 && 1;\n+--------+\n| 1 && 1 |\n+--------+\n| 1 |\n+--------+\n\nSELECT 1 && 0;\n+--------+\n| 1 && 0 |\n+--------+\n| 0 |\n+--------+\n\nSELECT 1 && NULL;\n+-----------+\n| 1 && NULL |\n+-----------+\n| NULL |\n+-----------+\n\nSELECT 0 && NULL;\n+-----------+\n| 0 && NULL |\n+-----------+\n| 0 |\n+-----------+\n\nSELECT NULL && 0;\n+-----------+\n| NULL && 0 |\n+-----------+\n| 0 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/and/','','https://mariadb.com/kb/en/and/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (170,15,'XOR','Syntax\n------\n\nXOR\n\nDescription\n-----------\n\nXOR stands for eXclusive OR. Returns NULL if either operand is NULL. For\nnon-NULL operands, evaluates to 1 if an odd number of operands is non-zero,\notherwise 0 is returned.\n\nExamples\n--------\n\nSELECT 1 XOR 1;\n+---------+\n| 1 XOR 1 |\n+---------+\n| 0 |\n+---------+\n\nSELECT 1 XOR 0;\n+---------+\n| 1 XOR 0 |\n+---------+\n| 1 |\n+---------+\n\nSELECT 1 XOR NULL;\n+------------+\n| 1 XOR NULL |\n+------------+\n| NULL |\n+------------+\n\nIn the following example, the right 1 XOR 1 is evaluated first, and returns 0.\nThen, 1 XOR 0 is evaluated, and 1 is returned.\n\nSELECT 1 XOR 1 XOR 1;\n+---------------+\n| 1 XOR 1 XOR 1 |\n+---------------+\n| 1 |\n+---------------+\n\nURL: https://mariadb.com/kb/en/xor/','','https://mariadb.com/kb/en/xor/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (171,15,'||','Syntax\n------\n\nOR, ||\n\nDescription\n-----------\n\nLogical OR. When both operands are non-NULL, the result is 1 if any operand is\nnon-zero, and 0 otherwise. With a NULL operand, the result is 1 if the other\noperand is non-zero, and NULL otherwise. If both operands are NULL, the result\nis NULL.\n\nFor this operator, short-circuit evaluation can be used.\n\nNote that, if the PIPES_AS_CONCAT SQL_MODE is set, || is used as a string\nconcatenation operator. This means that a || b is the same as CONCAT(a,b). See\nCONCAT() for details.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, || ignores NULL.\n\nExamples\n--------\n\nSELECT 1 || 1;\n+--------+\n| 1 || 1 |\n+--------+\n| 1 |\n+--------+\n\nSELECT 1 || 0;\n+--------+\n| 1 || 0 |\n+--------+\n| 1 |\n+--------+\n\nSELECT 0 || 0;\n+--------+\n| 0 || 0 |\n+--------+\n| 0 |\n+--------+\n\nSELECT 0 || NULL;\n+-----------+\n| 0 || NULL |\n+-----------+\n| NULL |\n+-----------+\n\nSELECT 1 || NULL;\n+-----------+\n| 1 || NULL |\n+-----------+\n| 1 |\n+-----------+\n\nIn Oracle mode, from MariaDB 10.3:\n\nSELECT 0 || NULL;\n+-----------+\n| 0 || NULL |\n+-----------+\n| 0 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/or/','','https://mariadb.com/kb/en/or/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (172,16,'Stored Aggregate Functions','MariaDB starting with 10.3.3\n----------------------------\nThe ability to create stored aggregate functions was added in MariaDB 10.3.3.\n\nAggregate functions are functions that are computed over a sequence of rows\nand return one result for the sequence of rows.\n\nCreating a custom aggregate function is done using the CREATE FUNCTION\nstatement with two main differences:\n\n* The addition of the AGGREGATE keyword, so CREATE AGGREGATE FUNCTION\n* The FETCH GROUP NEXT ROW instruction inside the loop\n* Oracle PL/SQL compatibility using SQL/PL is provided\n\nStandard Syntax\n---------------\n\nCREATE AGGREGATE FUNCTION function_name (parameters) RETURNS return_type\nBEGIN\n All types of declarations\n DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN return_val;\n LOOP\n FETCH GROUP NEXT ROW; // fetches next row from table\n other instructions\n END LOOP;\nEND\n\nStored aggregate functions were a 2016 Google Summer of Code project by Varun\nGupta.\n\nUsing SQL/PL\n------------\n\nSET sql_mode=Oracle;\nDELIMITER //\n\nCREATE AGGREGATE FUNCTION function_name (parameters) RETURN return_type\n declarations\nBEGIN\n LOOP\n FETCH GROUP NEXT ROW; -- fetches next row from table\n -- other instructions\n\nEND LOOP;\nEXCEPTION\n WHEN NO_DATA_FOUND THEN\n RETURN return_val;\nEND //\n\nDELIMITER ;\n\nExamples\n--------\n\nFirst a simplified example:\n\nCREATE TABLE marks(stud_id INT, grade_count INT);\n\nINSERT INTO marks VALUES (1,6), (2,4), (3,7), (4,5), (5,8);\n\nSELECT * FROM marks;\n+---------+-------------+\n| stud_id | grade_count |\n+---------+-------------+\n| 1 | 6 |\n| 2 | 4 |\n| 3 | 7 |\n| 4 | 5 |\n| 5 | 8 |\n+---------+-------------+\n\nDELIMITER //\nCREATE AGGREGATE FUNCTION IF NOT EXISTS aggregate_count(x INT) RETURNS INT\nBEGIN\n DECLARE count_students INT DEFAULT 0;\n DECLARE CONTINUE HANDLER FOR NOT FOUND\n RETURN count_students;\n LOOP\n FETCH GROUP NEXT ROW;\n IF x THEN\n SET count_students = count_students+1;\n END IF;\n END LOOP;\nEND //\nDELIMITER ;\n\nA non-trivial example that cannot easily be rewritten using existing functions:\n\nDELIMITER //\nCREATE AGGREGATE FUNCTION medi_int(x INT) RETURNS DOUBLE\nBEGIN\n DECLARE CONTINUE HANDLER FOR NOT FOUND\n BEGIN\n DECLARE res DOUBLE;\n DECLARE cnt INT DEFAULT (SELECT COUNT(*) FROM tt);\n DECLARE lim INT DEFAULT (cnt-1) DIV 2;\n IF cnt % 2 = 0 THEN\n SET res = (SELECT AVG(a) FROM (SELECT a FROM tt ORDER BY a LIMIT\nlim,2) ttt);\n ELSE\n SET res = (SELECT a FROM tt ORDER BY a LIMIT lim,1);\n END IF;\n DROP TEMPORARY TABLE tt;\n RETURN res;\n END;\n CREATE TEMPORARY TABLE tt (a INT);\n LOOP\n FETCH GROUP NEXT ROW;\n INSERT INTO tt VALUES (x);\n END LOOP;\nEND //\nDELIMITER ;\n\nSQL/PL Example\n--------------\n\nThis uses the same marks table as created above.\n\nSET sql_mode=Oracle;\nDELIMITER //\n\nCREATE AGGREGATE FUNCTION aggregate_count(x INT) RETURN INT AS count_students\nINT DEFAULT 0;\nBEGIN\n LOOP\n FETCH GROUP NEXT ROW;\n IF x THEN\n SET count_students := count_students+1;\n END IF;\n END LOOP;\nEXCEPTION\n WHEN NO_DATA_FOUND THEN\n RETURN count_students;\nEND aggregate_count //\nDELIMITER ;\n\nSELECT aggregate_count(stud_id) FROM marks;\n\nURL: https://mariadb.com/kb/en/stored-aggregate-functions/','','https://mariadb.com/kb/en/stored-aggregate-functions/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (173,16,'AVG','Syntax\n------\n\nAVG([DISTINCT] expr)\n\nDescription\n-----------\n\nReturns the average value of expr. The DISTINCT option can be used to return\nthe average of the distinct values of expr. NULL values are ignored. It is an\naggregate function, and so can be used with the GROUP BY clause.\n\nAVG() returns NULL if there were no matching rows.\n\nAVG() can be used as a window function.\n\nExamples\n--------\n\nCREATE TABLE sales (sales_value INT);\n\nINSERT INTO sales VALUES(10),(20),(20),(40);\n\nSELECT AVG(sales_value) FROM sales;\n+------------------+\n| AVG(sales_value) |\n+------------------+\n| 22.5000 |\n+------------------+\n\nSELECT AVG(DISTINCT(sales_value)) FROM sales;\n+----------------------------+\n| AVG(DISTINCT(sales_value)) |\n+----------------------------+\n| 23.3333 |\n+----------------------------+\n\nCommonly, AVG() is used with a GROUP BY clause:\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT name, AVG(score) FROM student GROUP BY name;\n+---------+------------+\n| name | AVG(score) |\n+---------+------------+\n| Chun | 74.0000 |\n| Esben | 37.0000 |\n| Kaolin | 72.0000 |\n| Tatiana | 85.0000 |\n+---------+------------+\n\nBe careful to avoid this common mistake, not grouping correctly and returning\nmismatched data:\n\nSELECT name,test,AVG(score) FROM student;\n+------+------+------------+\n| name | test | MIN(score) |\n+------+------+------------+\n| Chun | SQL | 31 |\n+------+------+------------+\n\nAs a window function:\n\nCREATE TABLE student_test (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT name, test, score, AVG(score) OVER (PARTITION BY test) \n AS average_by_test FROM student_test;\n+---------+--------+-------+-----------------+\n| name | test | score | average_by_test |\n+---------+--------+-------+-----------------+\n| Chun | SQL | 75 | 65.2500 |\n| Chun | Tuning | 73 | 68.7500 |\n| Esben | SQL | 43 | 65.2500 |\n| Esben | Tuning | 31 | 68.7500 |\n| Kaolin | SQL | 56 | 65.2500 |\n| Kaolin | Tuning | 88 | 68.7500 |\n| Tatiana | SQL | 87 | 65.2500 |\n| Tatiana | Tuning | 83 | 68.7500 |\n+---------+--------+-------+-----------------+\n\nURL: https://mariadb.com/kb/en/avg/','','https://mariadb.com/kb/en/avg/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (174,16,'BIT_AND','Syntax\n------\n\nBIT_AND(expr) [over_clause]\n\nDescription\n-----------\n\nReturns the bitwise AND of all bits in expr. The calculation is performed with\n64-bit (BIGINT) precision. It is an aggregate function, and so can be used\nwith the GROUP BY clause.\n\nIf no rows match, BIT_AND will return a value with all bits set to 1. NULL\nvalues have no effect on the result unless all results are NULL, which is\ntreated as no match.\n\nBIT_AND can be used as a window function with the addition of the over_clause.\n\nExamples\n--------\n\nCREATE TABLE vals (x INT);\n\nINSERT INTO vals VALUES(111),(110),(100);\n\nSELECT BIT_AND(x), BIT_OR(x), BIT_XOR(x) FROM vals;\n+------------+-----------+------------+\n| BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+------------+-----------+------------+\n| 100 | 111 | 101 |\n+------------+-----------+------------+\n\nAs an aggregate function:\n\nCREATE TABLE vals2 (category VARCHAR(1), x INT);\n\nINSERT INTO vals2 VALUES\n (\'a\',111),(\'a\',110),(\'a\',100),\n (\'b\',\'000\'),(\'b\',001),(\'b\',011);\n\nSELECT category, BIT_AND(x), BIT_OR(x), BIT_XOR(x) \n FROM vals GROUP BY category;\n+----------+------------+-----------+------------+\n| category | BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+----------+------------+-----------+------------+\n| a | 100 | 111 | 101 |\n| b | 0 | 11 | 10 |\n+----------+------------+-----------+------------+\n\nNo match:\n\nSELECT BIT_AND(NULL);\n+----------------------+\n| BIT_AND(NULL) |\n+----------------------+\n| 18446744073709551615 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/bit_and/','','https://mariadb.com/kb/en/bit_and/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (175,16,'BIT_OR','Syntax\n------\n\nBIT_OR(expr) [over_clause]\n\nDescription\n-----------\n\nReturns the bitwise OR of all bits in expr. The calculation is performed with\n64-bit (BIGINT) precision. It is an aggregate function, and so can be used\nwith the GROUP BY clause.\n\nIf no rows match, BIT_OR will return a value with all bits set to 0. NULL\nvalues have no effect on the result unless all results are NULL, which is\ntreated as no match.\n\nBIT_OR can be used as a window function with the addition of the over_clause.\n\nExamples\n--------\n\nCREATE TABLE vals (x INT);\n\nINSERT INTO vals VALUES(111),(110),(100);\n\nSELECT BIT_AND(x), BIT_OR(x), BIT_XOR(x) FROM vals;\n+------------+-----------+------------+\n| BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+------------+-----------+------------+\n| 100 | 111 | 101 |\n+------------+-----------+------------+\n\nAs an aggregate function:\n\nCREATE TABLE vals2 (category VARCHAR(1), x INT);\n\nINSERT INTO vals2 VALUES\n (\'a\',111),(\'a\',110),(\'a\',100),\n (\'b\',\'000\'),(\'b\',001),(\'b\',011);\n\nSELECT category, BIT_AND(x), BIT_OR(x), BIT_XOR(x) \n FROM vals GROUP BY category;\n+----------+------------+-----------+------------+\n| category | BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+----------+------------+-----------+------------+\n| a | 100 | 111 | 101 |\n| b | 0 | 11 | 10 |\n+----------+------------+-----------+------------+\n\nNo match:\n\nSELECT BIT_OR(NULL);\n+--------------+\n| BIT_OR(NULL) |\n+--------------+\n| 0 |\n+--------------+\n\nURL: https://mariadb.com/kb/en/bit_or/','','https://mariadb.com/kb/en/bit_or/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (176,16,'BIT_XOR','Syntax\n------\n\nBIT_XOR(expr) [over_clause]\n\nDescription\n-----------\n\nReturns the bitwise XOR of all bits in expr. The calculation is performed with\n64-bit (BIGINT) precision. It is an aggregate function, and so can be used\nwith the GROUP BY clause.\n\nIf no rows match, BIT_XOR will return a value with all bits set to 0. NULL\nvalues have no effect on the result unless all results are NULL, which is\ntreated as no match.\n\nBIT_XOR can be used as a window function with the addition of the over_clause.\n\nExamples\n--------\n\nCREATE TABLE vals (x INT);\n\nINSERT INTO vals VALUES(111),(110),(100);\n\nSELECT BIT_AND(x), BIT_OR(x), BIT_XOR(x) FROM vals;\n+------------+-----------+------------+\n| BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+------------+-----------+------------+\n| 100 | 111 | 101 |\n+------------+-----------+------------+\n\nAs an aggregate function:\n\nCREATE TABLE vals2 (category VARCHAR(1), x INT);\n\nINSERT INTO vals2 VALUES\n (\'a\',111),(\'a\',110),(\'a\',100),\n (\'b\',\'000\'),(\'b\',001),(\'b\',011);\n\nSELECT category, BIT_AND(x), BIT_OR(x), BIT_XOR(x) \n FROM vals GROUP BY category;\n+----------+------------+-----------+------------+\n| category | BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+----------+------------+-----------+------------+\n| a | 100 | 111 | 101 |\n| b | 0 | 11 | 10 |\n+----------+------------+-----------+------------+\n\nNo match:\n\nSELECT BIT_XOR(NULL);\n+---------------+\n| BIT_XOR(NULL) |\n+---------------+\n| 0 |\n+---------------+\n\nURL: https://mariadb.com/kb/en/bit_xor/','','https://mariadb.com/kb/en/bit_xor/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (177,16,'COUNT','Syntax\n------\n\nCOUNT(expr)\n\nDescription\n-----------\n\nReturns a count of the number of non-NULL values of expr in the rows retrieved\nby a SELECT statement. The result is a BIGINT value. It is an aggregate\nfunction, and so can be used with the GROUP BY clause.\n\nCOUNT(*) counts the total number of rows in a table.\n\nCOUNT() returns 0 if there were no matching rows.\n\nCOUNT() can be used as a window function.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT COUNT(*) FROM student;\n+----------+\n| COUNT(*) |\n+----------+\n| 8 |\n+----------+\n\nCOUNT(DISTINCT) example:\n\nSELECT COUNT(DISTINCT (name)) FROM student;\n+------------------------+\n| COUNT(DISTINCT (name)) |\n+------------------------+\n| 4 |\n+------------------------+\n\nAs a window function\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, COUNT(score) OVER (PARTITION BY name) \n AS tests_written FROM student_test;\n+---------+--------+-------+---------------+\n| name | test | score | tests_written |\n+---------+--------+-------+---------------+\n| Chun | SQL | 75 | 2 |\n| Chun | Tuning | 73 | 2 |\n| Esben | SQL | 43 | 2 |\n| Esben | Tuning | 31 | 2 |\n| Kaolin | SQL | 56 | 2 |\n| Kaolin | Tuning | 88 | 2 |\n| Tatiana | SQL | 87 | 1 |\n+---------+--------+-------+---------------+\n\nURL: https://mariadb.com/kb/en/count/','','https://mariadb.com/kb/en/count/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (178,16,'COUNT DISTINCT','Syntax\n------\n\nCOUNT(DISTINCT expr,[expr...])\n\nDescription\n-----------\n\nReturns a count of the number of different non-NULL values.\n\nCOUNT(DISTINCT) returns 0 if there were no matching rows.\n\nAlthough, from MariaDB 10.2.0, COUNT can be used as a window function, COUNT\nDISTINCT cannot be.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT COUNT(*) FROM student;\n+----------+\n| COUNT(*) |\n+----------+\n| 8 |\n+----------+\n\nSELECT COUNT(DISTINCT (name)) FROM student;\n+------------------------+\n| COUNT(DISTINCT (name)) |\n+------------------------+\n| 4 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/count-distinct/','','https://mariadb.com/kb/en/count-distinct/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (179,16,'GROUP_CONCAT','Syntax\n------\n\nGROUP_CONCAT(expr)\n\nDescription\n-----------\n\nThis function returns a string result with the concatenated non-NULL values\nfrom a group. It returns NULL if there are no non-NULL values.\n\nThe maximum returned length in bytes is determined by the group_concat_max_len\nserver system variable, which defaults to 1M (>= MariaDB 10.2.4) or 1K (<=\nMariaDB 10.2.3).\n\nIf group_concat_max_len <= 512, the return type is VARBINARY or VARCHAR;\notherwise, the return type is BLOB or TEXT. The choice between binary or\nnon-binary types depends from the input.\n\nThe full syntax is as follows:\n\nGROUP_CONCAT([DISTINCT] expr [,expr ...]\n [ORDER BY {unsigned_integer | col_name | expr}\n [ASC | DESC] [,col_name ...]]\n [SEPARATOR str_val]\n [LIMIT {[offset,] row_count | row_count OFFSET offset}])\n\nDISTINCT eliminates duplicate values from the output string.\n\nORDER BY determines the order of returned values.\n\nSEPARATOR specifies a separator between the values. The default separator is a\ncomma (,). It is possible to avoid using a separator by specifying an empty\nstring.\n\nLIMIT\n-----\n\nMariaDB starting with 10.3.3\n----------------------------\nUntil MariaDB 10.3.2, it was not possible to use the LIMIT clause with\nGROUP_CONCAT. This restriction was lifted in MariaDB 10.3.3.\n\nExamples\n--------\n\nSELECT student_name,\n GROUP_CONCAT(test_score)\n FROM student\n GROUP BY student_name;\n\nGet a readable list of MariaDB users from the mysql.user table:\n\nSELECT GROUP_CONCAT(DISTINCT User ORDER BY User SEPARATOR \'\\n\')\n FROM mysql.user;\n\nIn the former example, DISTINCT is used because the same user may occur more\nthan once. The new line (\\n) used as a SEPARATOR makes the results easier to\nread.\n\nGet a readable list of hosts from which each user can connect:\n\nSELECT User, GROUP_CONCAT(Host ORDER BY Host SEPARATOR \', \') \n FROM mysql.user GROUP BY User ORDER BY User;\n\nThe former example shows the difference between the GROUP_CONCAT\'s ORDER BY\n(which sorts the concatenated hosts), and the SELECT\'s ORDER BY (which sorts\nthe rows).\n\nFrom MariaDB 10.3.3, LIMIT can be used with GROUP_CONCAT, so, for example,\ngiven the following table:\n\nCREATE TABLE d (dd DATE, cc INT);\n\nINSERT INTO d VALUES (\'2017-01-01\',1);\nINSERT INTO d VALUES (\'2017-01-02\',2);\nINSERT INTO d VALUES (\'2017-01-04\',3);\n\nthe following query:\n\nSELECT SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc\nDESC),\",\",1) FROM d;\n+----------------------------------------------------------------------------+\n| SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC),\",\",1) |\n+----------------------------------------------------------------------------+\n| 2017-01-04:3 |\n+----------------------------------------------------------------------------+\n\ncan be more simply rewritten as:\n\nSELECT GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC LIMIT 1) FROM d;\n+-------------------------------------------------------------+\n| GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC LIMIT 1) |\n+-------------------------------------------------------------+\n| 2017-01-04:3 |\n+-------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/group_concat/','','https://mariadb.com/kb/en/group_concat/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (180,16,'MAX','Syntax\n------\n\nMAX([DISTINCT] expr)\n\nDescription\n-----------\n\nReturns the largest, or maximum, value of expr. MAX() can also take a string\nargument in which case it returns the maximum string value. The DISTINCT\nkeyword can be used to find the maximum of the distinct values of expr,\nhowever, this produces the same result as omitting DISTINCT.\n\nNote that SET and ENUM fields are currently compared by their string value\nrather than their relative position in the set, so MAX() may produce a\ndifferent highest result than ORDER BY DESC.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nMAX() can be used as a window function.\n\nMAX() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT name, MAX(score) FROM student GROUP BY name;\n+---------+------------+\n| name | MAX(score) |\n+---------+------------+\n| Chun | 75 |\n| Esben | 43 |\n| Kaolin | 88 |\n| Tatiana | 87 |\n+---------+------------+\n\nMAX string:\n\nSELECT MAX(name) FROM student;\n+-----------+\n| MAX(name) |\n+-----------+\n| Tatiana |\n+-----------+\n\nBe careful to avoid this common mistake, not grouping correctly and returning\nmismatched data:\n\nSELECT name,test,MAX(SCORE) FROM student;\n+------+------+------------+\n| name | test | MAX(SCORE) |\n+------+------+------------+\n| Chun | SQL | 88 |\n+------+------+------------+\n\nDifference between ORDER BY DESC and MAX():\n\nCREATE TABLE student2(name CHAR(10),grade ENUM(\'b\',\'c\',\'a\'));\n\nINSERT INTO student2 VALUES(\'Chun\',\'b\'),(\'Esben\',\'c\'),(\'Kaolin\',\'a\');\n\nSELECT MAX(grade) FROM student2;\n+------------+\n| MAX(grade) |\n+------------+\n| c |\n+------------+\n\nSELECT grade FROM student2 ORDER BY grade DESC LIMIT 1;\n+-------+\n| grade |\n+-------+\n| a |\n+-------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, MAX(score) \n OVER (PARTITION BY name) AS highest_score FROM student_test;\n+---------+--------+-------+---------------+\n| name | test | score | highest_score |\n+---------+--------+-------+---------------+\n| Chun | SQL | 75 | 75 |\n| Chun | Tuning | 73 | 75 |\n| Esben | SQL | 43 | 43 |\n| Esben | Tuning | 31 | 43 |\n| Kaolin | SQL | 56 | 88 |\n| Kaolin | Tuning | 88 | 88 |\n| Tatiana | SQL | 87 | 87 |\n+---------+--------+-------+---------------+\n\nURL: https://mariadb.com/kb/en/max/','','https://mariadb.com/kb/en/max/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (181,16,'MIN','Syntax\n------\n\nMIN([DISTINCT] expr)\n\nDescription\n-----------\n\nReturns the minimum value of expr. MIN() may take a string argument, in which\ncase it returns the minimum string value. The DISTINCT keyword can be used to\nfind the minimum of the distinct values of expr, however, this produces the\nsame result as omitting DISTINCT.\n\nNote that SET and ENUM fields are currently compared by their string value\nrather than their relative position in the set, so MIN() may produce a\ndifferent lowest result than ORDER BY ASC.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nMIN() can be used as a window function.\n\nMIN() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT name, MIN(score) FROM student GROUP BY name;\n+---------+------------+\n| name | MIN(score) |\n+---------+------------+\n| Chun | 73 |\n| Esben | 31 |\n| Kaolin | 56 |\n| Tatiana | 83 |\n+---------+------------+\n\nMIN() with a string:\n\nSELECT MIN(name) FROM student;\n+-----------+\n| MIN(name) |\n+-----------+\n| Chun |\n+-----------+\n\nBe careful to avoid this common mistake, not grouping correctly and returning\nmismatched data:\n\nSELECT name,test,MIN(score) FROM student;\n+------+------+------------+\n| name | test | MIN(score) |\n+------+------+------------+\n| Chun | SQL | 31 |\n+------+------+------------+\n\nDifference between ORDER BY ASC and MIN():\n\nCREATE TABLE student2(name CHAR(10),grade ENUM(\'b\',\'c\',\'a\'));\n\nINSERT INTO student2 VALUES(\'Chun\',\'b\'),(\'Esben\',\'c\'),(\'Kaolin\',\'a\');\n\nSELECT MIN(grade) FROM student2;\n+------------+\n| MIN(grade) |\n+------------+\n| a |\n+------------+\n\nSELECT grade FROM student2 ORDER BY grade ASC LIMIT 1;\n+-------+\n| grade |\n+-------+\n| b |\n+-------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, MIN(score) \n OVER (PARTITION BY name) AS lowest_score FROM student_test;\n+---------+--------+-------+--------------+\n| name | test | score | lowest_score |\n+---------+--------+-------+--------------+\n| Chun | SQL | 75 | 73 |\n| Chun | Tuning | 73 | 73 |\n| Esben | SQL | 43 | 31 |\n| Esben | Tuning | 31 | 31 |\n| Kaolin | SQL | 56 | 56 |\n| Kaolin | Tuning | 88 | 56 |\n| Tatiana | SQL | 87 | 87 |\n+---------+--------+-------+--------------+\n\nURL: https://mariadb.com/kb/en/min/','','https://mariadb.com/kb/en/min/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (182,16,'STD','Syntax\n------\n\nSTD(expr)\n\nDescription\n-----------\n\nReturns the population standard deviation of expr. This is an extension to\nstandard SQL. The standard SQL function STDDEV_POP() can be used instead.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nSTD() can be used as a window function.\n\nThis function returns NULL if there were no matching rows.\n\nExamples\n--------\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, STDDEV_POP(score) \n OVER (PARTITION BY test) AS stddev_results FROM student_test;\n+---------+--------+-------+----------------+\n| name | test | score | stddev_results |\n+---------+--------+-------+----------------+\n| Chun | SQL | 75 | 16.9466 |\n| Chun | Tuning | 73 | 24.1247 |\n| Esben | SQL | 43 | 16.9466 |\n| Esben | Tuning | 31 | 24.1247 |\n| Kaolin | SQL | 56 | 16.9466 |\n| Kaolin | Tuning | 88 | 24.1247 |\n| Tatiana | SQL | 87 | 16.9466 |\n+---------+--------+-------+----------------+\n\nURL: https://mariadb.com/kb/en/std/','','https://mariadb.com/kb/en/std/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (183,16,'STDDEV','Syntax\n------\n\nSTDDEV(expr)\n\nDescription\n-----------\n\nReturns the population standard deviation of expr. This function is provided\nfor compatibility with Oracle. The standard SQL function STDDEV_POP() can be\nused instead.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nSTDDEV() can be used as a window function.\n\nThis function returns NULL if there were no matching rows.\n\nExamples\n--------\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, STDDEV_POP(score) \n OVER (PARTITION BY test) AS stddev_results FROM student_test;\n+---------+--------+-------+----------------+\n| name | test | score | stddev_results |\n+---------+--------+-------+----------------+\n| Chun | SQL | 75 | 16.9466 |\n| Chun | Tuning | 73 | 24.1247 |\n| Esben | SQL | 43 | 16.9466 |\n| Esben | Tuning | 31 | 24.1247 |\n| Kaolin | SQL | 56 | 16.9466 |\n| Kaolin | Tuning | 88 | 24.1247 |\n| Tatiana | SQL | 87 | 16.9466 |\n+---------+--------+-------+----------------+\n\nURL: https://mariadb.com/kb/en/stddev/','','https://mariadb.com/kb/en/stddev/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (184,16,'STDDEV_POP','Syntax\n------\n\nSTDDEV_POP(expr)\n\nDescription\n-----------\n\nReturns the population standard deviation of expr (the square root of\nVAR_POP()). You can also use STD() or STDDEV(), which are equivalent but not\nstandard SQL.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nSTDDEV_POP() can be used as a window function.\n\nSTDDEV_POP() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, STDDEV_POP(score) \n OVER (PARTITION BY test) AS stddev_results FROM student_test;\n+---------+--------+-------+----------------+\n| name | test | score | stddev_results |\n+---------+--------+-------+----------------+\n| Chun | SQL | 75 | 16.9466 |\n| Chun | Tuning | 73 | 24.1247 |\n| Esben | SQL | 43 | 16.9466 |\n| Esben | Tuning | 31 | 24.1247 |\n| Kaolin | SQL | 56 | 16.9466 |\n| Kaolin | Tuning | 88 | 24.1247 |\n| Tatiana | SQL | 87 | 16.9466 |\n+---------+--------+-------+----------------+\n\nURL: https://mariadb.com/kb/en/stddev_pop/','','https://mariadb.com/kb/en/stddev_pop/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (185,16,'STDDEV_SAMP','Syntax\n------\n\nSTDDEV_SAMP(expr)\n\nDescription\n-----------\n\nReturns the sample standard deviation of expr (the square root of VAR_SAMP()).\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nSTDDEV_SAMP() can be used as a window function.\n\nSTDDEV_SAMP() returns NULL if there were no matching rows.\n\nURL: https://mariadb.com/kb/en/stddev_samp/','','https://mariadb.com/kb/en/stddev_samp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (186,16,'SUM','Syntax\n------\n\nSUM([DISTINCT] expr)\n\nDescription\n-----------\n\nReturns the sum of expr. If the return set has no rows, SUM() returns NULL.\nThe DISTINCT keyword can be used to sum only the distinct values of expr.\n\nSUM() can be used as a window function, although not with the DISTINCT\nspecifier.\n\nExamples\n--------\n\nCREATE TABLE sales (sales_value INT);\nINSERT INTO sales VALUES(10),(20),(20),(40);\n\nSELECT SUM(sales_value) FROM sales;\n+------------------+\n| SUM(sales_value) |\n+------------------+\n| 90 |\n+------------------+\n\nSELECT SUM(DISTINCT(sales_value)) FROM sales;\n+----------------------------+\n| SUM(DISTINCT(sales_value)) |\n+----------------------------+\n| 70 |\n+----------------------------+\n\nCommonly, SUM is used with a GROUP BY clause:\n\nCREATE TABLE sales (name CHAR(10), month CHAR(10), units INT);\n\nINSERT INTO sales VALUES \n (\'Chun\', \'Jan\', 75), (\'Chun\', \'Feb\', 73),\n (\'Esben\', \'Jan\', 43), (\'Esben\', \'Feb\', 31),\n (\'Kaolin\', \'Jan\', 56), (\'Kaolin\', \'Feb\', 88),\n (\'Tatiana\', \'Jan\', 87), (\'Tatiana\', \'Feb\', 83);\n\nSELECT name, SUM(units) FROM sales GROUP BY name;\n+---------+------------+\n| name | SUM(units) |\n+---------+------------+\n| Chun | 148 |\n| Esben | 74 |\n| Kaolin | 144 |\n| Tatiana | 170 |\n+---------+------------+\n\nThe GROUP BY clause is required when using an aggregate function along with\nregular column data, otherwise the result will be a mismatch, as in the\nfollowing common type of mistake:\n\nSELECT name,SUM(units) FROM sales\n;+------+------------+\n| name | SUM(units) |\n+------+------------+\n| Chun | 536 |\n+------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, SUM(score) OVER (PARTITION BY name) AS total_score\nFROM student_test;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Chun | SQL | 75 | 148 |\n| Chun | Tuning | 73 | 148 |\n| Esben | SQL | 43 | 74 |\n| Esben | Tuning | 31 | 74 |\n| Kaolin | SQL | 56 | 144 |\n| Kaolin | Tuning | 88 | 144 |\n| Tatiana | SQL | 87 | 87 |\n+---------+--------+-------+-------------+\n\nURL: https://mariadb.com/kb/en/sum/','','https://mariadb.com/kb/en/sum/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (187,16,'VARIANCE','Syntax\n------\n\nVARIANCE(expr)\n\nDescription\n-----------\n\nReturns the population standard variance of expr. This is an extension to\nstandard SQL. The standard SQL function VAR_POP() can be used instead.\n\nVariance is calculated by\n\n* working out the mean for the set\n* for each number, subtracting the mean and squaring the result\n* calculate the average of the resulting differences\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nVARIANCE() can be used as a window function.\n\nVARIANCE() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nCREATE TABLE v(i tinyint);\n\nINSERT INTO v VALUES(101),(99);\n\nSELECT VARIANCE(i) FROM v;\n+-------------+\n| VARIANCE(i) |\n+-------------+\n| 1.0000 |\n+-------------+\n\nINSERT INTO v VALUES(120),(80);\n\nSELECT VARIANCE(i) FROM v;\n+-------------+\n| VARIANCE(i) |\n+-------------+\n| 200.5000 |\n+-------------+\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, VAR_POP(score) \n OVER (PARTITION BY test) AS variance_results FROM student_test;\n+---------+--------+-------+------------------+\n| name | test | score | variance_results |\n+---------+--------+-------+------------------+\n| Chun | SQL | 75 | 287.1875 |\n| Chun | Tuning | 73 | 582.0000 |\n| Esben | SQL | 43 | 287.1875 |\n| Esben | Tuning | 31 | 582.0000 |\n| Kaolin | SQL | 56 | 287.1875 |\n| Kaolin | Tuning | 88 | 582.0000 |\n| Tatiana | SQL | 87 | 287.1875 |\n+---------+--------+-------+------------------+\n\nURL: https://mariadb.com/kb/en/variance/','','https://mariadb.com/kb/en/variance/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (188,16,'VAR_POP','Syntax\n------\n\nVAR_POP(expr)\n\nDescription\n-----------\n\nReturns the population standard variance of expr. It considers rows as the\nwhole population, not as a sample, so it has the number of rows as the\ndenominator. You can also use VARIANCE(), which is equivalent but is not\nstandard SQL.\n\nVariance is calculated by\n\n* working out the mean for the set\n* for each number, subtracting the mean and squaring the result\n* calculate the average of the resulting differences\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nVAR_POP() can be used as a window function.\n\nVAR_POP() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nCREATE TABLE v(i tinyint);\n\nINSERT INTO v VALUES(101),(99);\n\nSELECT VAR_POP(i) FROM v;\n+------------+\n| VAR_POP(i) |\n+------------+\n| 1.0000 |\n+------------+\n\nINSERT INTO v VALUES(120),(80);\n\nSELECT VAR_POP(i) FROM v;\n+------------+\n| VAR_POP(i) |\n+------------+\n| 200.5000 |\n+------------+\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, VAR_POP(score) \n OVER (PARTITION BY test) AS variance_results FROM student_test;\n+---------+--------+-------+------------------+\n| name | test | score | variance_results |\n+---------+--------+-------+------------------+\n| Chun | SQL | 75 | 287.1875 |\n| Esben | SQL | 43 | 287.1875 |\n| Kaolin | SQL | 56 | 287.1875 |\n| Tatiana | SQL | 87 | 287.1875 |\n| Chun | Tuning | 73 | 582.0000 |\n| Esben | Tuning | 31 | 582.0000 |\n| Kaolin | Tuning | 88 | 582.0000 |\n+---------+--------+-------+------------------+\n\nURL: https://mariadb.com/kb/en/var_pop/','','https://mariadb.com/kb/en/var_pop/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (189,16,'VAR_SAMP','Syntax\n------\n\nVAR_SAMP(expr)\n\nDescription\n-----------\n\nReturns the sample variance of expr. That is, the denominator is the number of\nrows minus one.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nVAR_SAMP() can be used as a window function.\n\nVAR_SAMP() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, VAR_SAMP(score) \n OVER (PARTITION BY test) AS variance_results FROM student_test;\n+---------+--------+-------+------------------+\n| name | test | score | variance_results |\n+---------+--------+-------+------------------+\n| Chun | SQL | 75 | 382.9167 |\n| Chun | Tuning | 73 | 873.0000 |\n| Esben | SQL | 43 | 382.9167 |\n| Esben | Tuning | 31 | 873.0000 |\n| Kaolin | SQL | 56 | 382.9167 |\n| Kaolin | Tuning | 88 | 873.0000 |\n| Tatiana | SQL | 87 | 382.9167 |\n+---------+--------+-------+------------------+\n\nURL: https://mariadb.com/kb/en/var_samp/','','https://mariadb.com/kb/en/var_samp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (190,17,'BENCHMARK','Syntax\n------\n\nBENCHMARK(count,expr)\n\nDescription\n-----------\n\nThe BENCHMARK() function executes the expression expr repeatedly count times.\nIt may be used to time how quickly MariaDB processes the expression. The\nresult value is always 0. The intended use is from within the mysql client,\nwhich reports query execution times.\n\nExamples\n--------\n\nSELECT BENCHMARK(1000000,ENCODE(\'hello\',\'goodbye\'));\n+----------------------------------------------+\n| BENCHMARK(1000000,ENCODE(\'hello\',\'goodbye\')) |\n+----------------------------------------------+\n| 0 |\n+----------------------------------------------+\n1 row in set (0.21 sec)\n\nURL: https://mariadb.com/kb/en/benchmark/','','https://mariadb.com/kb/en/benchmark/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (191,17,'BINLOG_GTID_POS','Syntax\n------\n\nBINLOG_GTID_POS(binlog_filename,binlog_offset)\n\nDescription\n-----------\n\nThe BINLOG_GTID_POS() function takes as input an old-style binary log position\nin the form of a file name and a file offset. It looks up the position in the\ncurrent binlog, and returns a string representation of the corresponding GTID\nposition. If the position is not found in the current binlog, NULL is returned.\n\nExamples\n--------\n\nSELECT BINLOG_GTID_POS(\"master-bin.000001\", 600);\n\nURL: https://mariadb.com/kb/en/binlog_gtid_pos/','','https://mariadb.com/kb/en/binlog_gtid_pos/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (192,17,'CHARSET','Syntax\n------\n\nCHARSET(str)\n\nDescription\n-----------\n\nReturns the character set of the string argument. If str is not a string, it\nis considered as a binary string (so the function returns \'binary\'). This\napplies to NULL, too. The return value is a string in the utf8 character set.\n\nExamples\n--------\n\nSELECT CHARSET(\'abc\');\n+----------------+\n| CHARSET(\'abc\') |\n+----------------+\n| latin1 |\n+----------------+\n\nSELECT CHARSET(CONVERT(\'abc\' USING utf8));\n+------------------------------------+\n| CHARSET(CONVERT(\'abc\' USING utf8)) |\n+------------------------------------+\n| utf8 |\n+------------------------------------+\n\nSELECT CHARSET(USER());\n+-----------------+\n| CHARSET(USER()) |\n+-----------------+\n| utf8 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/charset/','','https://mariadb.com/kb/en/charset/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (193,17,'COERCIBILITY','Syntax\n------\n\nCOERCIBILITY(str)\n\nDescription\n-----------\n\nReturns the collation coercibility value of the string argument. Coercibility\ndefines what will be converted to what in case of collation conflict, with an\nexpression with higher coercibility being converted to the collation of an\nexpression with lower coercibility.\n\n+-----------------------------+---------------------------+------------------+\n| Coercibility | Description | Example |\n+-----------------------------+---------------------------+------------------+\n| 0 | Explicit | Value using a |\n| | | COLLATE clause |\n+-----------------------------+---------------------------+------------------+\n| 1 | No collation | Concatenated |\n| | | strings using |\n| | | different |\n| | | collations |\n+-----------------------------+---------------------------+------------------+\n| 2 | Implicit | Column value |\n+-----------------------------+---------------------------+------------------+\n| 3 | Constant | USER() return |\n| | | value |\n+-----------------------------+---------------------------+------------------+\n| 4 | Coercible | Literal string |\n+-----------------------------+---------------------------+------------------+\n| 5 | Ignorable | NULL or derived |\n| | | from NULL |\n+-----------------------------+---------------------------+------------------+\n\nExamples\n--------\n\nSELECT COERCIBILITY(\'abc\' COLLATE latin1_swedish_ci);\n+-----------------------------------------------+\n| COERCIBILITY(\'abc\' COLLATE latin1_swedish_ci) |\n+-----------------------------------------------+\n| 0 |\n+-----------------------------------------------+\n\nSELECT COERCIBILITY(USER());\n+----------------------+\n| COERCIBILITY(USER()) |\n+----------------------+\n| 3 |\n+----------------------+\n\nSELECT COERCIBILITY(\'abc\');\n+---------------------+\n| COERCIBILITY(\'abc\') |\n+---------------------+\n| 4 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/coercibility/','','https://mariadb.com/kb/en/coercibility/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (194,17,'COLLATION','Syntax\n------\n\nCOLLATION(str)\n\nDescription\n-----------\n\nReturns the collation of the string argument. If str is not a string, it is\nconsidered as a binary string (so the function returns \'binary\'). This applies\nto NULL, too. The return value is a string in the utf8 character set.\n\nSee Character Sets and Collations.\n\nExamples\n--------\n\nSELECT COLLATION(\'abc\');\n+-------------------+\n| COLLATION(\'abc\') |\n+-------------------+\n| latin1_swedish_ci |\n+-------------------+\n\nSELECT COLLATION(_utf8\'abc\');\n+-----------------------+\n| COLLATION(_utf8\'abc\') |\n+-----------------------+\n| utf8_general_ci |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/collation/','','https://mariadb.com/kb/en/collation/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (195,17,'CONNECTION_ID','Syntax\n------\n\nCONNECTION_ID()\n\nDescription\n-----------\n\nReturns the connection ID for the connection. Every connection (including\nevents) has an ID that is unique among the set of currently connected clients.\n\nUntil MariaDB 10.3.1, returns MYSQL_TYPE_LONGLONG, or bigint(10), in all\ncases. From MariaDB 10.3.1, returns MYSQL_TYPE_LONG, or int(10), when the\nresult would fit within 32-bits.\n\nExamples\n--------\n\nSELECT CONNECTION_ID();\n+-----------------+\n| CONNECTION_ID() |\n+-----------------+\n| 3 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/connection_id/','','https://mariadb.com/kb/en/connection_id/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (196,17,'CURRENT_ROLE','Syntax\n------\n\nCURRENT_ROLE, CURRENT_ROLE()\n\nDescription\n-----------\n\nReturns the current role name. This determines your access privileges. The\nreturn value is a string in the utf8 character set.\n\nIf there is no current role, NULL is returned.\n\nThe output of SELECT CURRENT_ROLE is equivalent to the contents of the\nENABLED_ROLES Information Schema table.\n\nUSER() returns the combination of user and host used to login. CURRENT_USER()\nreturns the account used to determine current connection\'s privileges.\n\nExamples\n--------\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n\nSET ROLE staff;\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| staff |\n+--------------+\n\nURL: https://mariadb.com/kb/en/current_role/','','https://mariadb.com/kb/en/current_role/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (197,17,'CURRENT_USER','Syntax\n------\n\nCURRENT_USER, CURRENT_USER()\n\nDescription\n-----------\n\nReturns the user name and host name combination for the MariaDB account that\nthe server used to authenticate the current client. This account determines\nyour access privileges. The return value is a string in the utf8 character set.\n\nThe value of CURRENT_USER() can differ from the value of USER().\nCURRENT_ROLE() returns the current active role.\n\nExamples\n--------\n\nshell> mysql --user=\"anonymous\"\n\nselect user(),current_user();\n+---------------------+----------------+\n| user() | current_user() |\n+---------------------+----------------+\n| anonymous@localhost | @localhost |\n+---------------------+----------------+\n\nWhen calling CURRENT_USER() in a stored procedure, it returns the owner of the\nstored procedure, as defined with DEFINER.\n\nURL: https://mariadb.com/kb/en/current_user/','','https://mariadb.com/kb/en/current_user/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (198,17,'DATABASE','Syntax\n------\n\nDATABASE()\n\nDescription\n-----------\n\nReturns the default (current) database name as a string in the utf8 character\nset. If there is no default database, DATABASE() returns NULL. Within a stored\nroutine, the default database is the database that the routine is associated\nwith, which is not necessarily the same as the database that is the default in\nthe calling context.\n\nSCHEMA() is a synonym for DATABASE().\n\nTo select a default database, the USE statement can be run. Another way to set\nthe default database is specifying its name at mysql command line client\nstartup.\n\nExamples\n--------\n\nSELECT DATABASE();\n+------------+\n| DATABASE() |\n+------------+\n| NULL |\n+------------+\n\nUSE test;\nDatabase changed\n\nSELECT DATABASE();\n+------------+\n| DATABASE() |\n+------------+\n| test |\n+------------+\n\nURL: https://mariadb.com/kb/en/database/','','https://mariadb.com/kb/en/database/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (199,17,'DECODE_HISTOGRAM','Syntax\n------\n\nDECODE_HISTOGRAM(hist_type,histogram)\n\nDescription\n-----------\n\nReturns a string of comma separated numeric values corresponding to a\nprobability distribution represented by the histogram of type hist_type\n(SINGLE_PREC_HB or DOUBLE_PREC_HB). The hist_type and histogram would be\ncommonly used from the mysql.column_stats table.\n\nSee Histogram Based Statistics for details.\n\nExamples\n--------\n\nCREATE TABLE origin (\n i INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n v INT UNSIGNED NOT NULL\n);\n\nINSERT INTO origin(v) VALUES \n (1),(2),(3),(4),(5),(10),(20),\n (30),(40),(50),(60),(70),(80),\n (90),(100),(200),(400),(800);\n\nSET histogram_size=10,histogram_type=SINGLE_PREC_HB;\n\nANALYZE TABLE origin PERSISTENT FOR ALL;\n+-------------+---------+----------+-----------------------------------------+\n| Table | Op | Msg_type | Msg_text |\n+-------------+---------+----------+-----------------------------------------+\n| test.origin | analyze | status | Engine-independent statistics collected |\n| test.origin | analyze | status | OK |\n+-------------+---------+----------+-----------------------------------------+\n\nSELECT db_name,table_name,column_name,hist_type,\n hex(histogram),decode_histogram(hist_type,histogram)\n FROM mysql.column_stats WHERE db_name=\'test\' and table_name=\'origin\';\n+---------+------------+-------------+----------------+----------------------+-\n-----------------------------------------------------------------+\n| db_name | table_name | column_name | hist_type | hex(histogram) |\ndecode_histogram(hist_type,histogram) |\n+---------+------------+-------------+----------------+----------------------+-\n-----------------------------------------------------------------+\n| test | origin | i | SINGLE_PREC_HB | 0F2D3C5A7887A5C3D2F0 |\n0.059,0.118,0.059,0.118,0.118,0.059,0.118,0.118,0.059,0.118,0.059 |\n| test | origin | v | SINGLE_PREC_HB | 000001060C0F161C1F7F |\n0.000,0.000,0.004,0.020,0.024,0.012,0.027,0.024,0.012,0.376,0.502 |\n+---------+------------+-------------+----------------+----------------------+-\n-----------------------------------------------------------------+\n\nSET histogram_size=20,histogram_type=DOUBLE_PREC_HB;\n\nANALYZE TABLE origin PERSISTENT FOR ALL;\n+-------------+---------+----------+-----------------------------------------+\n| Table | Op | Msg_type | Msg_text |\n+-------------+---------+----------+-----------------------------------------+\n| test.origin | analyze | status | Engine-independent statistics collected |\n| test.origin | analyze | status | OK |\n+-------------+---------+----------+-----------------------------------------+\n\nSELECT db_name,table_name,column_name,\n hist_type,hex(histogram),decode_histogram(hist_type,histogram)\n FROM mysql.column_stats WHERE db_name=\'test\' and table_name=\'origin\';\n+---------+------------+-------------+----------------+------------------------\n-----------------+-------------------------------------------------------------\n---------------------------+\n| db_name | table_name | column_name | hist_type | hex(histogram) \n | decode_histogram(hist_type,histogram)\n |\n+---------+------------+-------------+----------------+------------------------\n-----------------+-------------------------------------------------------------\n---------------------------+\n| test | origin | i | DOUBLE_PREC_HB |\n0F0F2D2D3C3C5A5A78788787A5A5C3C3D2D2F0F0 |\n0.05882,0.11765,0.05882,0.11765,0.11765,0.05882,0.11765,0.11765,0.05882,0.11765\n0.05882 |\n| test | origin | v | DOUBLE_PREC_HB |\n5200F600480116067E0CB30F1B16831CB81FD67F |\n0.00125,0.00250,0.00125,0.01877,0.02502,0.01253,0.02502,0.02502,0.01253,0.37546\n0.50063 |\n\nURL: https://mariadb.com/kb/en/decode_histogram/','','https://mariadb.com/kb/en/decode_histogram/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (200,17,'DEFAULT','Syntax\n------\n\nDEFAULT(col_name)\n\nDescription\n-----------\n\nReturns the default value for a table column. If the column has no default\nvalue (and is not NULLABLE - NULLABLE fields have a NULL default), an error is\nreturned.\n\nFor integer columns using AUTO_INCREMENT, 0 is returned.\n\nWhen using DEFAULT as a value to set in an INSERT or UPDATE statement, you can\nuse the bare keyword DEFAULT without the parentheses and argument to refer to\nthe column in context. You can only use DEFAULT as a bare keyword if you are\nusing it alone without a surrounding expression or function.\n\nExamples\n--------\n\nSelect only non-default values for a column:\n\nSELECT i FROM t WHERE i != DEFAULT(i);\n\nUpdate values to be one greater than the default value:\n\nUPDATE t SET i = DEFAULT(i)+1 WHERE i < 100;\n\nWhen referring to the default value exactly in UPDATE or INSERT, you can omit\nthe argument:\n\nINSERT INTO t (i) VALUES (DEFAULT);\nUPDATE t SET i = DEFAULT WHERE i < 100;\n\nCREATE OR REPLACE TABLE t (\n i INT NOT NULL AUTO_INCREMENT,\n j INT NOT NULL,\n k INT DEFAULT 3,\n l INT NOT NULL DEFAULT 4,\n m INT,\n PRIMARY KEY (i)\n);\n\nDESC t;\n+-------+---------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+----------------+\n| i | int(11) | NO | PRI | NULL | auto_increment |\n| j | int(11) | NO | | NULL | |\n| k | int(11) | YES | | 3 | |\n| l | int(11) | NO | | 4 | |\n| m | int(11) | YES | | NULL | |\n+-------+---------+------+-----+---------+----------------+\n\nINSERT INTO t (j) VALUES (1);\nINSERT INTO t (j,m) VALUES (2,2);\nINSERT INTO t (j,l,m) VALUES (3,3,3);\n\nSELECT * FROM t;\n+---+---+------+---+------+\n| i | j | k | l | m |\n+---+---+------+---+------+\n| 1 | 1 | 3 | 4 | NULL |\n| 2 | 2 | 3 | 4 | 2 |\n| 3 | 3 | 3 | 3 | 3 |\n+---+---+------+---+------+\n\nSELECT DEFAULT(i), DEFAULT(k), DEFAULT (l), DEFAULT(m) FROM t;\n+------------+------------+-------------+------------+\n| DEFAULT(i) | DEFAULT(k) | DEFAULT (l) | DEFAULT(m) |\n+------------+------------+-------------+------------+\n| 0 | 3 | 4 | NULL |\n| 0 | 3 | 4 | NULL |\n| 0 | 3 | 4 | NULL |\n+------------+------------+-------------+------------+\n\nSELECT DEFAULT(i), DEFAULT(k), DEFAULT (l), DEFAULT(m), DEFAULT(j) FROM t;\nERROR 1364 (HY000): Field \'j\' doesn\'t have a default value\n\nSELECT * FROM t WHERE i = DEFAULT(i);\nEmpty set (0.001 sec)\n\nSELECT * FROM t WHERE j = DEFAULT(j);\nERROR 1364 (HY000): Field \'j\' doesn\'t have a default value\n\nSELECT * FROM t WHERE k = DEFAULT(k);\n+---+---+------+---+------+\n| i | j | k | l | m |\n+---+---+------+---+------+\n| 1 | 1 | 3 | 4 | NULL |\n| 2 | 2 | 3 | 4 | 2 |\n| 3 | 3 | 3 | 3 | 3 |\n+---+---+------+---+------+\n\nSELECT * FROM t WHERE l = DEFAULT(l);\n+---+---+------+---+------+\n| i | j | k | l | m |\n+---+---+------+---+------+\n| 1 | 1 | 3 | 4 | NULL |\n| 2 | 2 | 3 | 4 | 2 |\n+---+---+------+---+------+\n\nSELECT * FROM t WHERE m = DEFAULT(m);\nEmpty set (0.001 sec)\n\nSELECT * FROM t WHERE m <=> DEFAULT(m);\n+---+---+------+---+------+\n| i | j | k | l | m |\n+---+---+------+---+------+\n| 1 | 1 | 3 | 4 | NULL |\n+---+---+------+---+------+\n\nURL: https://mariadb.com/kb/en/default/','','https://mariadb.com/kb/en/default/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (201,17,'FOUND_ROWS','Syntax\n------\n\nFOUND_ROWS()\n\nDescription\n-----------\n\nA SELECT statement may include a LIMIT clause to restrict the number of rows\nthe server returns to the client. In some cases, it is desirable to know how\nmany rows the statement would have returned without the LIMIT, but without\nrunning the statement again. To obtain this row count, include a\nSQL_CALC_FOUND_ROWS option in the SELECT statement, and then invoke\nFOUND_ROWS() afterwards.\n\nYou can also use FOUND_ROWS() to obtain the number of rows returned by a\nSELECT which does not contain a LIMIT clause. In this case you don\'t need to\nuse the SQL_CALC_FOUND_ROWS option. This can be useful for example in a stored\nprocedure.\n\nAlso, this function works with some other statements which return a resultset,\nincluding SHOW, DESC and HELP. For DELETE ... RETURNING you should use\nROW_COUNT(). It also works as a prepared statement, or after executing a\nprepared statement.\n\nStatements which don\'t return any results don\'t affect FOUND_ROWS() - the\nprevious value will still be returned.\n\nWarning: When used after a CALL statement, this function returns the number of\nrows selected by the last query in the procedure, not by the whole procedure.\n\nStatements using the FOUND_ROWS() function are not safe for replication.\n\nExamples\n--------\n\nSHOW ENGINES\\G\n*************************** 1. row ***************************\n Engine: CSV\n Support: YES\n Comment: Stores tables as CSV files\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 2. row ***************************\n Engine: MRG_MyISAM\n Support: YES\n Comment: Collection of identical MyISAM tables\nTransactions: NO\n XA: NO\n Savepoints: NO\n\n...\n\n*************************** 8. row ***************************\n Engine: PERFORMANCE_SCHEMA\n Support: YES\n Comment: Performance Schema\nTransactions: NO\n XA: NO\n Savepoints: NO\n8 rows in set (0.000 sec)\n\nSELECT FOUND_ROWS();\n+--------------+\n| FOUND_ROWS() |\n+--------------+\n| 8 |\n+--------------+\n\nSELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;\n\nSELECT FOUND_ROWS();\n+--------------+\n| FOUND_ROWS() |\n+--------------+\n| 23 |\n+--------------+\n\nURL: https://mariadb.com/kb/en/found_rows/','','https://mariadb.com/kb/en/found_rows/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (202,17,'LAST_INSERT_ID','Syntax\n------\n\nLAST_INSERT_ID(), LAST_INSERT_ID(expr)\n\nDescription\n-----------\n\nLAST_INSERT_ID() (no arguments) returns the first automatically generated\nvalue successfully inserted for an AUTO_INCREMENT column as a result of the\nmost recently executed INSERT statement. The value of LAST_INSERT_ID() remains\nunchanged if no rows are successfully inserted.\n\nIf one gives an argument to LAST_INSERT_ID(), then it will return the value of\nthe expression and the next call to LAST_INSERT_ID() will return the same\nvalue. The value will also be sent to the client and can be accessed by the\nmysql_insert_id function.\n\nFor example, after inserting a row that generates an AUTO_INCREMENT value, you\ncan get the value like this:\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 9 |\n+------------------+\n\nYou can also use LAST_INSERT_ID() to delete the last inserted row:\n\nDELETE FROM product WHERE id = LAST_INSERT_ID();\n\nIf no rows were successfully inserted, LAST_INSERT_ID() returns 0.\n\nThe value of LAST_INSERT_ID() will be consistent across all versions if all\nrows in the INSERT or UPDATE statement were successful.\n\nThe currently executing statement does not affect the value of\nLAST_INSERT_ID(). Suppose that you generate an AUTO_INCREMENT value with one\nstatement, and then refer to LAST_INSERT_ID() in a multiple-row INSERT\nstatement that inserts rows into a table with its own AUTO_INCREMENT column.\nThe value of LAST_INSERT_ID() will remain stable in the second statement; its\nvalue for the second and later rows is not affected by the earlier row\ninsertions. (However, if you mix references to LAST_INSERT_ID() and\nLAST_INSERT_ID(expr), the effect is undefined.)\n\nIf the previous statement returned an error, the value of LAST_INSERT_ID() is\nundefined. For transactional tables, if the statement is rolled back due to an\nerror, the value of LAST_INSERT_ID() is left undefined. For manual ROLLBACK,\nthe value of LAST_INSERT_ID() is not restored to that before the transaction;\nit remains as it was at the point of the ROLLBACK.\n\nWithin the body of a stored routine (procedure or function) or a trigger, the\nvalue of LAST_INSERT_ID() changes the same way as for statements executed\noutside the body of these kinds of objects. The effect of a stored routine or\ntrigger upon the value of LAST_INSERT_ID() that is seen by following\nstatements depends on the kind of routine:\n\n* If a stored procedure executes statements that change the value of\nLAST_INSERT_ID(), the new value will be seen by statements that follow the\nprocedure call.\n\n* For stored functions and triggers that change the value, the value is\nrestored when the function or trigger ends, so following statements will not\nsee a changed value.\n\nExamples\n--------\n\nCREATE TABLE t (\n id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n f VARCHAR(1))\nENGINE = InnoDB;\n\nINSERT INTO t(f) VALUES(\'a\');\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 1 |\n+------------------+\n\nINSERT INTO t(f) VALUES(\'b\');\n\nINSERT INTO t(f) VALUES(\'c\');\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 3 |\n+------------------+\n\nINSERT INTO t(f) VALUES(\'d\'),(\'e\');\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 4 |\n+------------------+\n\nSELECT * FROM t;\n+----+------+\n| id | f |\n+----+------+\n| 1 | a |\n| 2 | b |\n| 3 | c |\n| 4 | d |\n| 5 | e |\n+----+------+\n\nSELECT LAST_INSERT_ID(12);\n+--------------------+\n| LAST_INSERT_ID(12) |\n+--------------------+\n| 12 |\n+--------------------+\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 12 |\n+------------------+\n\nINSERT INTO t(f) VALUES(\'f\');\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 6 |\n+------------------+\n\nSELECT * FROM t;\n+----+------+\n| id | f |\n+----+------+\n| 1 | a |\n| 2 | b |\n| 3 | c |\n| 4 | d |\n| 5 | e |\n| 6 | f |\n+----+------+\n\nSELECT LAST_INSERT_ID(12);\n+--------------------+\n| LAST_INSERT_ID(12) |\n+--------------------+\n| 12 |\n+--------------------+\n\nINSERT INTO t(f) VALUES(\'g\');\n\nSELECT * FROM t;\n+----+------+\n| id | f |\n+----+------+\n| 1 | a |\n| 2 | b |\n| 3 | c |\n| 4 | d |\n| 5 | e |\n| 6 | f |\n| 7 | g |\n+----+------+\n\nURL: https://mariadb.com/kb/en/last_insert_id/','','https://mariadb.com/kb/en/last_insert_id/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (203,17,'LAST_VALUE','Syntax\n------\n\nLAST_VALUE(expr,[expr,...])\n\nLAST_VALUE(expr) OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nLAST_VALUE() evaluates all expressions and returns the last.\n\nThis is useful together with setting user variables to a value with\n@var:=expr, for example when you want to get data of rows updated/deleted\nwithout having to do two queries against the table.\n\nLAST_VALUE can be used as a window function.\n\nReturns NULL if no last value exists.\n\nExamples\n--------\n\nCREATE TABLE t1 (a int, b int);\nINSERT INTO t1 VALUES(1,10),(2,20);\nDELETE FROM t1 WHERE a=1 AND last_value(@a:=a,@b:=b,1);\nSELECT @a,@b;\n+------+------+\n| @a | @b |\n+------+------+\n| 1 | 10 |\n+------+------+\n\nAs a window function:\n\nCREATE TABLE t1 (\n pk int primary key,\n a int,\n b int,\n c char(10),\n d decimal(10, 3),\n e real\n);\n\nINSERT INTO t1 VALUES\n( 1, 0, 1, \'one\', 0.1, 0.001),\n( 2, 0, 2, \'two\', 0.2, 0.002),\n( 3, 0, 3, \'three\', 0.3, 0.003),\n( 4, 1, 2, \'three\', 0.4, 0.004),\n( 5, 1, 1, \'two\', 0.5, 0.005),\n( 6, 1, 1, \'one\', 0.6, 0.006),\n( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n( 8, 2, 1, \'n_two\', NULL, 0.008),\n( 9, 2, 2, NULL, 0.7, 0.009),\n(10, 2, 0, \'n_four\', 0.8, 0.010),\n(11, 2, 10, NULL, 0.9, NULL);\n\nSELECT pk, FIRST_VALUE(pk) OVER (ORDER BY pk) AS first_asc,\n LAST_VALUE(pk) OVER (ORDER BY pk) AS last_asc,\n FIRST_VALUE(pk) OVER (ORDER BY pk DESC) AS first_desc,\n LAST_VALUE(pk) OVER (ORDER BY pk DESC) AS last_desc\nFROM t1\nORDER BY pk DESC;\n\n+----+-----------+----------+------------+-----------+\n| pk | first_asc | last_asc | first_desc | last_desc |\n+----+-----------+----------+------------+-----------+\n| 11 | 1 | 11 | 11 | 11 |\n| 10 | 1 | 10 | 11 | 10 |\n| 9 | 1 | 9 | 11 | 9 |\n| 8 | 1 | 8 | 11 | 8 |\n| 7 | 1 | 7 | 11 | 7 |\n| 6 | 1 | 6 | 11 | 6 |\n| 5 | 1 | 5 | 11 | 5 |\n| 4 | 1 | 4 | 11 | 4 |\n| 3 | 1 | 3 | 11 | 3 |\n| 2 | 1 | 2 | 11 | 2 |\n| 1 | 1 | 1 | 11 | 1 |\n+----+-----------+----------+------------+-----------+\n\nCREATE OR REPLACE TABLE t1 (i int);\nINSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);\n\nSELECT i,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and 1 FOLLOWING) AS\nf_1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and 1 FOLLOWING) AS\nl_1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\nf_1p1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\nf_1p1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) AS\nf_2p1p,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) AS\nf_2p1p,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING) AS\nf_1f2f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING) AS\nf_1f2f\nFROM t1;\n\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| i | f_1f | l_1f | f_1p1f | f_1p1f | f_2p1p | f_2p1p | f_1f2f | f_1f2f |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| 1 | 1 | 2 | 1 | 2 | NULL | NULL | 2 | 3 |\n| 2 | 2 | 3 | 1 | 3 | 1 | 1 | 3 | 4 |\n| 3 | 3 | 4 | 2 | 4 | 1 | 2 | 4 | 5 |\n| 4 | 4 | 5 | 3 | 5 | 2 | 3 | 5 | 6 |\n| 5 | 5 | 6 | 4 | 6 | 3 | 4 | 6 | 7 |\n| 6 | 6 | 7 | 5 | 7 | 4 | 5 | 7 | 8 |\n| 7 | 7 | 8 | 6 | 8 | 5 | 6 | 8 | 9 |\n| 8 | 8 | 9 | 7 | 9 | 6 | 7 | 9 | 10 |\n| 9 | 9 | 10 | 8 | 10 | 7 | 8 | 10 | 10 |\n| 10 | 10 | 10 | 9 | 10 | 8 | 9 | NULL | NULL |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n\nURL: https://mariadb.com/kb/en/last_value/','','https://mariadb.com/kb/en/last_value/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (204,17,'PROCEDURE ANALYSE','Syntax\n------\n\nanalyse([max_elements[,max_memory]])\n\nDescription\n-----------\n\nThis procedure is defined in the sql/sql_analyse.cc file. It examines the\nresult from a query and returns an analysis of the results that suggests\noptimal data types for each column. To obtain this analysis, append PROCEDURE\nANALYSE to the end of a SELECT statement:\n\nSELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max_elements,[max_memory]])\n\nFor example:\n\nSELECT col1, col2 FROM table1 PROCEDURE ANALYSE(10, 2000);\n\nThe results show some statistics for the values returned by the query, and\npropose an optimal data type for the columns. This can be helpful for checking\nyour existing tables, or after importing new data. You may need to try\ndifferent settings for the arguments so that PROCEDURE ANALYSE() does not\nsuggest the ENUM data type when it is not appropriate.\n\nThe arguments are optional and are used as follows:\n\n* max_elements (default 256) is the maximum number of distinct values that\nanalyse notices per column. This is used by analyse to check whether the\noptimal data type should be of type ENUM; if there are more than max_elements\ndistinct values, then ENUM is not a suggested type.\n* max_memory (default 8192) is the maximum amount of memory that analyse\nshould allocate per column while trying to find all distinct values.\n\nURL: https://mariadb.com/kb/en/procedure-analyse/','','https://mariadb.com/kb/en/procedure-analyse/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (205,17,'ROWNUM','MariaDB starting with 10.6.1\n----------------------------\nFrom MariaDB 10.6.1, the ROWNUM() function is supported.\n\nSyntax\n------\n\nROWNUM()\n\nIn Oracle mode one can just use ROWNUM, without the parentheses.\n\nDescription\n-----------\n\nROWNUM() returns the current number of accepted rows in the current context.\nIt main purpose is to emulate the ROWNUM pseudo column in Oracle. For MariaDB\nnative applications, we recommend the usage of LIMIT, as it is easier to use\nand gives more predictable results than the usage of ROWNUM().\n\nThe main difference between using LIMIT and ROWNUM() to limit the rows in the\nresult is that LIMIT works on the result set while ROWNUM works on the number\nof accepted rows (before any ORDER or GROUP BY clauses).\n\nThe following queries will return the same results:\n\nSELECT * from t1 LIMIT 10;\nSELECT * from t1 WHERE ROWNUM() <= 10;\n\nWhile the following may return different results based on in which orders the\nrows are found:\n\nSELECT * from t1 ORDER BY a LIMIT 10;\nSELECT * from t1 ORDER BY a WHERE ROWNUM() <= 10;\n\nThe recommended way to use ROWNUM to limit the number of returned rows and get\npredictable results is to have the query in a subquery and test for ROWNUM()\nin the outer query:\n\nSELECT * FROM (select * from t1 ORDER BY a) WHERE ROWNUM() <= 10;\n\nROWNUM() can be used in the following contexts:\n\n* SELECT\n* INSERT\n* UPDATE\n* DELETE\n* LOAD DATA INFILE\n\nUsed in other contexts, ROWNUM() will return 0.\n\nExamples\n--------\n\nINSERT INTO t1 VALUES (1,ROWNUM()),(2,ROWNUM()),(3,ROWNUM());\n\nINSERT INTO t1 VALUES (1),(2) returning a, ROWNUM();\n\nUPDATE t1 SET row_num_column=ROWNUM();\n\nDELETE FROM t1 WHERE a < 10 AND ROWNUM() < 2;\n\nLOAD DATA INFILE \'filename\' into table t1 fields terminated by \',\' \n lines terminated by \"\\r\\n\" (a,b) set c=ROWNUM();\n\nOptimizations\n-------------\n\nIn many cases where ROWNUM() is used, MariaDB will use the same optimizations\nit uses with LIMIT.\n\nLIMIT optimization is possible when using ROWNUM in the following manner:\n\n* When one is in a top level WHERE clause comparing ROWNUM() with a numerical\nconstant using any of the following expressions:\nROWNUM() < number\nROWNUM() <= number\nROWNUM() = 1\nROWNUM() can be also be the right argument to the comparison function.\n\nIn the above cases, LIMIT optimization can be done in the following cases:\n\n* For the current sub query when the ROWNUM comparison is done on the top\nlevel:\n\nSELECT * from t1 WHERE ROWNUM() <= 2 AND t1.a > 0\n\n* For an inner sub query, when the upper level has only a ROWNUM() comparison\nin the WHERE clause:\n\nSELECT * from (select * from t1) as t WHERE ROWNUM() <= 2\n\nOther Changes Related to ROWNUM\n-------------------------------\n\nWhen ROWNUM() is used anywhere in a query, the optimization to ignore ORDER BY\nin subqueries are disabled.\n\nThis was done to get the following common Oracle query to work as expected:\n\nselect * from (select * from t1 order by a desc) as t where rownum() <= 2;\n\nBy default MariaDB ignores any ORDER BY in subqueries both because the SQL\nstandard defines results sets in subqueries to be un-ordered and because of\nperformance reasons (especially when using views in subqueries). See MDEV-3926\n\"Wrong result with GROUP BY ... WITH ROLLUP\" for a discussion of this topic.\n\nOther Considerations\n--------------------\n\nWhile MariaDB tries to emulate Oracle\'s usage of ROWNUM() as closely as\npossible, there are cases where the result is different:\n\n* When the optimizer finds rows in a different order (because of different\nstorage methods or optimization). This may also happen in Oracle if one adds\nor deletes an index, in which case the rows may be found in a different order.\n\nNote that usage of ROWNUM() in functions or stored procedures will use their\nown context, not the caller\'s context.\n\nURL: https://mariadb.com/kb/en/rownum/','','https://mariadb.com/kb/en/rownum/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (206,17,'ROW_COUNT','Syntax\n------\n\nROW_COUNT()\n\nDescription\n-----------\n\nROW_COUNT() returns the number of rows updated, inserted or deleted by the\npreceding statement. This is the same as the row count that the mysql client\ndisplays and the value from the mysql_affected_rows() C API function.\n\nGenerally:\n\n* For statements which return a result set (such as SELECT, SHOW, DESC or\nHELP), returns -1, even when the result set is empty. This is also true for\nadministrative statements, such as OPTIMIZE.\n* For DML statements other than SELECT and for ALTER TABLE, returns the number\nof affected rows.\n* For DDL statements (including TRUNCATE) and for other statements which don\'t\nreturn any result set (such as USE, DO, SIGNAL or DEALLOCATE PREPARE), returns\n0.\n\nFor UPDATE, affected rows is by default the number of rows that were actually\nchanged. If the CLIENT_FOUND_ROWS flag to mysql_real_connect() is specified\nwhen connecting to mysqld, affected rows is instead the number of rows matched\nby the WHERE clause.\n\nFor REPLACE, deleted rows are also counted. So, if REPLACE deletes a row and\nadds a new row, ROW_COUNT() returns 2.\n\nFor INSERT ... ON DUPLICATE KEY, updated rows are counted twice. So, if INSERT\nadds a new rows and modifies another row, ROW_COUNT() returns 3.\n\nROW_COUNT() does not take into account rows that are not directly\ndeleted/updated by the last statement. This means that rows deleted by foreign\nkeys or triggers are not counted.\n\nWarning: You can use ROW_COUNT() with prepared statements, but you need to\ncall it after EXECUTE, not after DEALLOCATE PREPARE, because the row count for\nallocate prepare is always 0.\n\nWarning: When used after a CALL statement, this function returns the number of\nrows affected by the last statement in the procedure, not by the whole\nprocedure.\n\nWarning: After INSERT DELAYED, ROW_COUNT() returns the number of the rows you\ntried to insert, not the number of the successful writes.\n\nThis information can also be found in the diagnostics area.\n\nStatements using the ROW_COUNT() function are not safe for replication.\n\nExamples\n--------\n\nCREATE TABLE t (A INT);\n\nINSERT INTO t VALUES(1),(2),(3);\n\nSELECT ROW_COUNT();\n+-------------+\n| ROW_COUNT() |\n+-------------+\n| 3 |\n+-------------+\n\nDELETE FROM t WHERE A IN(1,2);\n\nSELECT ROW_COUNT(); \n+-------------+\n| ROW_COUNT() |\n+-------------+\n| 2 |\n+-------------+\n\nExample with prepared statements:\n\nSET @q = \'INSERT INTO t VALUES(1),(2),(3);\';\n\nPREPARE stmt FROM @q;\n\nEXECUTE stmt;\nQuery OK, 3 rows affected (0.39 sec)\nRecords: 3 Duplicates: 0 Warnings: 0\n\nSELECT ROW_COUNT();\n+-------------+\n| ROW_COUNT() |\n+-------------+\n| 3 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/row_count/','','https://mariadb.com/kb/en/row_count/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (207,17,'SCHEMA','Syntax\n------\n\nSCHEMA()\n\nDescription\n-----------\n\nThis function is a synonym for DATABASE().\n\nURL: https://mariadb.com/kb/en/schema/','','https://mariadb.com/kb/en/schema/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (208,17,'SESSION_USER','Syntax\n------\n\nSESSION_USER()\n\nDescription\n-----------\n\nSESSION_USER() is a synonym for USER().\n\nURL: https://mariadb.com/kb/en/session_user/','','https://mariadb.com/kb/en/session_user/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (209,17,'SYSTEM_USER','Syntax\n------\n\nSYSTEM_USER()\n\nDescription\n-----------\n\nSYSTEM_USER() is a synonym for USER().\n\nURL: https://mariadb.com/kb/en/system_user/','','https://mariadb.com/kb/en/system_user/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (210,17,'USER','Syntax\n------\n\nUSER()\n\nDescription\n-----------\n\nReturns the current MariaDB user name and host name, given when authenticating\nto MariaDB, as a string in the utf8 character set.\n\nNote that the value of USER() may differ from the value of CURRENT_USER(),\nwhich is the user used to authenticate the current client. CURRENT_ROLE()\nreturns the current active role.\n\nSYSTEM_USER() and SESSION_USER are synonyms for USER().\n\nStatements using the USER() function or one of its synonyms are not safe for\nstatement level replication.\n\nExamples\n--------\n\nshell> mysql --user=\"anonymous\"\n\nSELECT USER(),CURRENT_USER();\n+---------------------+----------------+\n| USER() | CURRENT_USER() |\n+---------------------+----------------+\n| anonymous@localhost | @localhost |\n+---------------------+----------------+\n\nTo select only the IP address, use SUBSTRING_INDEX(),\n\nSELECT SUBSTRING_INDEX(USER(), \'@\', -1);\n+----------------------------------+\n| SUBSTRING_INDEX(USER(), \'@\', -1) |\n+----------------------------------+\n| 192.168.0.101 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/user/','','https://mariadb.com/kb/en/user/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (211,17,'VERSION','Syntax\n------\n\nVERSION()\n\nDescription\n-----------\n\nReturns a string that indicates the MariaDB server version. The string uses\nthe utf8 character set.\n\nExamples\n--------\n\nSELECT VERSION();\n+----------------+\n| VERSION() |\n+----------------+\n| 10.4.7-MariaDB |\n+----------------+\n\nThe VERSION() string may have one or more of the following suffixes:\n\n+---------------------------+------------------------------------------------+\n| Suffix | Description |\n+---------------------------+------------------------------------------------+\n| -embedded | The server is an embedded server (libmysqld). |\n+---------------------------+------------------------------------------------+\n| -log | General logging, slow logging or binary |\n| | (replication) logging is enabled. |\n+---------------------------+------------------------------------------------+\n| -debug | The server is compiled for debugging. |\n+---------------------------+------------------------------------------------+\n| -valgrind | The server is compiled to be instrumented |\n| | with valgrind. |\n+---------------------------+------------------------------------------------+\n\nChanging the Version String\n---------------------------\n\nSome old legacy code may break because they are parsing the VERSION string and\nexpecting a MySQL string or a simple version string like Joomla til API17, see\nMDEV-7780.\n\nFrom MariaDB 10.2, one can fool these applications by setting the version\nstring from the command line or the my.cnf files with --version=....\n\nURL: https://mariadb.com/kb/en/version/','','https://mariadb.com/kb/en/version/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (212,18,'Assignment Operator (:=)','Syntax\n------\n\nvar_name := expr\n\nDescription\n-----------\n\nAssignment operator for assigning a value. The value on the right is assigned\nto the variable on left.\n\nUnlike the = operator, := can always be used to assign a value to a variable.\n\nThis operator works with both user-defined variables and local variables.\n\nWhen assigning the same value to several variables, LAST_VALUE() can be useful.\n\nExamples\n--------\n\nSELECT @x := 10;\n+----------+\n| @x := 10 |\n+----------+\n| 10 |\n+----------+\n\nSELECT @x, @y := @x;\n+------+----------+\n| @x | @y := @x |\n+------+----------+\n| 10 | 10 |\n+------+----------+\n\nURL: https://mariadb.com/kb/en/assignment-operator/','','https://mariadb.com/kb/en/assignment-operator/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (213,18,'Assignment Operator (=)','Syntax\n------\n\nidentifier = expr\n\nDescription\n-----------\n\nThe equal sign is used as both an assignment operator in certain contexts, and\nas a comparison operator. When used as assignment operator, the value on the\nright is assigned to the variable (or column, in some contexts) on the left.\n\nSince its use can be ambiguous, unlike the := assignment operator, the =\nassignment operator cannot be used in all contexts, and is only valid as part\nof a SET statement, or the SET clause of an UPDATE statement\n\nThis operator works with both user-defined variables and local variables.\n\nExamples\n--------\n\nUPDATE table_name SET x = 2 WHERE x > 100;\n\nSET @x = 1, @y := 2;\n\nURL: https://mariadb.com/kb/en/assignment-operators-assignment-operator/','','https://mariadb.com/kb/en/assignment-operators-assignment-operator/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (214,19,'Not Equal Operator','Syntax\n------\n\n<>, !=\n\nDescription\n-----------\n\nNot equal operator. Evaluates both SQL expressions and returns 1 if they are\nnot equal and 0 if they are equal, or NULL if either expression is NULL. If\nthe expressions return different data types, (for instance, a number and a\nstring), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) != (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a != t2.x) OR (t1.b != t2.y)\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT \'.01\' <> \'0.01\';\n+-----------------+\n| \'.01\' <> \'0.01\' |\n+-----------------+\n| 1 |\n+-----------------+\n\nSELECT .01 <> \'0.01\';\n+---------------+\n| .01 <> \'0.01\' |\n+---------------+\n| 0 |\n+---------------+\n\nSELECT \'zapp\' <> \'zappp\';\n+-------------------+\n| \'zapp\' <> \'zappp\' |\n+-------------------+\n| 1 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/not-equal/','','https://mariadb.com/kb/en/not-equal/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (215,19,'<','Syntax\n------\n\n<\n\nDescription\n-----------\n\nLess than operator. Evaluates both SQL expressions and returns 1 if the left\nvalue is less than the right value and 0 if it is not, or NULL if either\nexpression is NULL. If the expressions return different data types, (for\ninstance, a number and a string), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) < (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a < t2.x) OR ((t1.a = t2.x) AND (t1.b < t2.y))\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT 2 < 2;\n+-------+\n| 2 < 2 |\n+-------+\n| 0 |\n+-------+\n\nType conversion:\n\nSELECT 3<\'4\';\n+-------+\n| 3<\'4\' |\n+-------+\n| 1 |\n+-------+\n\nCase insensitivity - see Character Sets and Collations:\n\nSELECT \'a\'<\'A\';\n+---------+\n| \'a\'<\'A\' |\n+---------+\n| 0 |\n+---------+\n\nURL: https://mariadb.com/kb/en/less-than/','','https://mariadb.com/kb/en/less-than/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (216,19,'<=','Syntax\n------\n\n<=\n\nDescription\n-----------\n\nLess than or equal operator. Evaluates both SQL expressions and returns 1 if\nthe left value is less than or equal to the right value and 0 if it is not, or\nNULL if either expression is NULL. If the expressions return different data\ntypes, (for instance, a number and a string), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) <= (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a < t2.x) OR ((t1.a = t2.x) AND (t1.b <= t2.y))\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT 0.1 <= 2;\n+----------+\n| 0.1 <= 2 |\n+----------+\n| 1 |\n+----------+\n\nSELECT \'a\'<=\'A\';\n+----------+\n| \'a\'<=\'A\' |\n+----------+\n| 1 |\n+----------+\n\nURL: https://mariadb.com/kb/en/less-than-or-equal/','','https://mariadb.com/kb/en/less-than-or-equal/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (217,19,'<=>','Syntax\n------\n\n<=>\n\nDescription\n-----------\n\nNULL-safe equal operator. It performs an equality comparison like the =\noperator, but returns 1 rather than NULL if both operands are NULL, and 0\nrather than NULL if one operand is NULL.\n\na <=> b is equivalent to a = b OR (a IS NULL AND b IS NULL).\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) <=> (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a <=> t2.x) AND (t1.b <=> t2.y)\nFROM t1 INNER JOIN t2;\n\nSee also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;\n+---------+---------------+------------+\n| 1 <=> 1 | NULL <=> NULL | 1 <=> NULL |\n+---------+---------------+------------+\n| 1 | 1 | 0 |\n+---------+---------------+------------+\n\nSELECT 1 = 1, NULL = NULL, 1 = NULL;\n+-------+-------------+----------+\n| 1 = 1 | NULL = NULL | 1 = NULL |\n+-------+-------------+----------+\n| 1 | NULL | NULL |\n+-------+-------------+----------+\n\nURL: https://mariadb.com/kb/en/null-safe-equal/','','https://mariadb.com/kb/en/null-safe-equal/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (218,19,'=','Syntax\n------\n\nleft_expr = right_expr\n\nDescription\n-----------\n\nEqual operator. Evaluates both SQL expressions and returns 1 if they are\nequal, 0 if they are not equal, or NULL if either expression is NULL. If the\nexpressions return different data types (for example, a number and a string),\na type conversion is performed.\n\nWhen used in row comparisons these two queries are synonymous and return the\nsame results:\n\nSELECT (t1.a, t1.b) = (t2.x, t2.y) FROM t1 INNER JOIN t2;\n\nSELECT (t1.a = t2.x) AND (t1.b = t2.y) FROM t1 INNER JOIN t2;\n\nTo perform a NULL-safe comparison, use the <=> operator.\n\n= can also be used as an assignment operator.\n\nExamples\n--------\n\nSELECT 1 = 0;\n+-------+\n| 1 = 0 |\n+-------+\n| 0 |\n+-------+\n\nSELECT \'0\' = 0;\n+---------+\n| \'0\' = 0 |\n+---------+\n| 1 |\n+---------+\n\nSELECT \'0.0\' = 0;\n+-----------+\n| \'0.0\' = 0 |\n+-----------+\n| 1 |\n+-----------+\n\nSELECT \'0.01\' = 0;\n+------------+\n| \'0.01\' = 0 |\n+------------+\n| 0 |\n+------------+\n\nSELECT \'.01\' = 0.01;\n+--------------+\n| \'.01\' = 0.01 |\n+--------------+\n| 1 |\n+--------------+\n\nSELECT (5 * 2) = CONCAT(\'1\', \'0\');\n+----------------------------+\n| (5 * 2) = CONCAT(\'1\', \'0\') |\n+----------------------------+\n| 1 |\n+----------------------------+\n\nSELECT 1 = NULL;\n+----------+\n| 1 = NULL |\n+----------+\n| NULL |\n+----------+\n\nSELECT NULL = NULL;\n+-------------+\n| NULL = NULL |\n+-------------+\n| NULL |\n+-------------+\n\nURL: https://mariadb.com/kb/en/equal/','','https://mariadb.com/kb/en/equal/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (219,19,'>','Syntax\n------\n\n>\n\nDescription\n-----------\n\nGreater than operator. Evaluates both SQL expressions and returns 1 if the\nleft value is greater than the right value and 0 if it is not, or NULL if\neither expression is NULL. If the expressions return different data types,\n(for instance, a number and a string), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) > (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a > t2.x) OR ((t1.a = t2.x) AND (t1.b > t2.y))\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT 2 > 2;\n+-------+\n| 2 > 2 |\n+-------+\n| 0 |\n+-------+\n\nSELECT \'b\' > \'a\';\n+-----------+\n| \'b\' > \'a\' |\n+-----------+\n| 1 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/greater-than/','','https://mariadb.com/kb/en/greater-than/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (220,19,'>=','Syntax\n------\n\n>=\n\nDescription\n-----------\n\nGreater than or equal operator. Evaluates both SQL expressions and returns 1\nif the left value is greater than or equal to the right value and 0 if it is\nnot, or NULL if either expression is NULL. If the expressions return different\ndata types, (for instance, a number and a string), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) >= (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a > t2.x) OR ((t1.a = t2.x) AND (t1.b >= t2.y))\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT 2 >= 2;\n+--------+\n| 2 >= 2 |\n+--------+\n| 1 |\n+--------+\n\nSELECT \'A\' >= \'a\';\n+------------+\n| \'A\' >= \'a\' |\n+------------+\n| 1 |\n+------------+\n\nURL: https://mariadb.com/kb/en/greater-than-or-equal/','','https://mariadb.com/kb/en/greater-than-or-equal/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (221,19,'BETWEEN AND','Syntax\n------\n\nexpr BETWEEN min AND max\n\nDescription\n-----------\n\nIf expr is greater than or equal to min and expr is less than or equal to max,\nBETWEEN returns 1, otherwise it returns 0. This is equivalent to the\nexpression (min <= expr AND expr <= max) if all the arguments are of the same\ntype. Otherwise type conversion takes place according to the rules described\nat Type Conversion, but applied to all the three arguments.\n\nExamples\n--------\n\nSELECT 1 BETWEEN 2 AND 3;\n+-------------------+\n| 1 BETWEEN 2 AND 3 |\n+-------------------+\n| 0 |\n+-------------------+\n\nSELECT \'b\' BETWEEN \'a\' AND \'c\';\n+-------------------------+\n| \'b\' BETWEEN \'a\' AND \'c\' |\n+-------------------------+\n| 1 |\n+-------------------------+\n\nSELECT 2 BETWEEN 2 AND \'3\';\n+---------------------+\n| 2 BETWEEN 2 AND \'3\' |\n+---------------------+\n| 1 |\n+---------------------+\n\nSELECT 2 BETWEEN 2 AND \'x-3\';\n+-----------------------+\n| 2 BETWEEN 2 AND \'x-3\' |\n+-----------------------+\n| 0 |\n+-----------------------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect DOUBLE value: \'x-3\'\n\nNULL:\n\nSELECT 1 BETWEEN 1 AND NULL;\n+----------------------+\n| 1 BETWEEN 1 AND NULL |\n+----------------------+\n| NULL |\n+----------------------+\n\nDATE, DATETIME and TIMESTAMP examples. Omitting the time component compares\nagainst 00:00, so later times on the same date are not returned:\n\nCREATE TABLE `x` (\n a date ,\n b datetime,\n c timestamp\n)\n\nINSERT INTO x VALUES \n (\'2018-11-11\', \'2018-11-11 05:15\', \'2018-11-11 05:15\'), \n (\'2018-11-12\', \'2018-11-12 05:15\', \'2018-11-12 05:15\');\n\nSELECT * FROM x WHERE a BETWEEN \'2018-11-11\' AND \'2018-11-12\';\n+------------+---------------------+---------------------+\n| a | b | c |\n+------------+---------------------+---------------------+\n| 2018-11-11 | 2018-11-11 05:15:00 | 2018-11-11 05:15:00 |\n| 2018-11-12 | 2018-11-12 05:15:00 | 2018-11-12 05:15:00 |\n+------------+---------------------+---------------------+\n\nSELECT * FROM x WHERE b BETWEEN \'2018-11-11\' AND \'2018-11-12\';\n+------------+---------------------+---------------------+\n| a | b | c |\n+------------+---------------------+---------------------+\n| 2018-11-11 | 2018-11-11 05:15:00 | 2018-11-11 05:15:00 |\n+------------+---------------------+---------------------+\n\nSELECT * FROM x WHERE c BETWEEN \'2018-11-11\' AND \'2018-11-12\';\n+------------+---------------------+---------------------+\n| a | b | c |\n+------------+---------------------+---------------------+\n| 2018-11-11 | 2018-11-11 05:15:00 | 2018-11-11 05:15:00 |\n+------------+---------------------+---------------------+\n\nURL: https://mariadb.com/kb/en/between-and/','','https://mariadb.com/kb/en/between-and/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (222,19,'COALESCE','Syntax\n------\n\nCOALESCE(value,...)\n\nDescription\n-----------\n\nReturns the first non-NULL value in the list, or NULL if there are no non-NULL\nvalues. At least one parameter must be passed.\n\nThe function is useful when substituting a default value for null values when\ndisplaying data.\n\nSee also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT COALESCE(NULL,1);\n+------------------+\n| COALESCE(NULL,1) |\n+------------------+\n| 1 |\n+------------------+\n\nSELECT COALESCE(NULL,NULL,NULL);\n+--------------------------+\n| COALESCE(NULL,NULL,NULL) |\n+--------------------------+\n| NULL |\n+--------------------------+\n\nWhen two arguments are given, COALESCE() is the same as IFNULL():\n\nSET @a=NULL, @b=1;\n\nSELECT COALESCE(@a, @b), IFNULL(@a, @b);\n+------------------+----------------+\n| COALESCE(@a, @b) | IFNULL(@a, @b) |\n+------------------+----------------+\n| 1 | 1 |\n+------------------+----------------+\n\nHex type confusion:\n\nCREATE TABLE t1 (a INT, b VARCHAR(10));\nINSERT INTO t1 VALUES (0x31, 0x61),(COALESCE(0x31), COALESCE(0x61));\n\nSELECT * FROM t1;\n+------+------+\n| a | b |\n+------+------+\n| 49 | a |\n| 1 | a |\n+------+------+\n\nThe reason for the differing results above is that when 0x31 is inserted\ndirectly to the column, it\'s treated as a number (see Hexadecimal Literals),\nwhile when 0x31 is passed to COALESCE(), it\'s treated as a string, because:\n\n* HEX values have a string data type by default.\n* COALESCE() has the same data type as the argument.\n\nSubstituting zero for NULL (in this case when the aggregate function returns\nNULL after finding no rows):\n\nSELECT SUM(score) FROM student;\n+------------+\n| SUM(score) |\n+------------+\n| NULL |\n+------------+\n\nSELECT COALESCE(SUM(score),0) FROM student;\n+------------------------+\n| COALESCE(SUM(score),0) |\n+------------------------+\n| 0 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/coalesce/','','https://mariadb.com/kb/en/coalesce/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (223,19,'GREATEST','Syntax\n------\n\nGREATEST(value1,value2,...)\n\nDescription\n-----------\n\nWith two or more arguments, returns the largest (maximum-valued) argument. The\narguments are compared using the same rules as for LEAST().\n\nExamples\n--------\n\nSELECT GREATEST(2,0);\n+---------------+\n| GREATEST(2,0) |\n+---------------+\n| 2 |\n+---------------+\n\nSELECT GREATEST(34.0,3.0,5.0,767.0);\n+------------------------------+\n| GREATEST(34.0,3.0,5.0,767.0) |\n+------------------------------+\n| 767.0 |\n+------------------------------+\n\nSELECT GREATEST(\'B\',\'A\',\'C\');\n+-----------------------+\n| GREATEST(\'B\',\'A\',\'C\') |\n+-----------------------+\n| C |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/greatest/','','https://mariadb.com/kb/en/greatest/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (224,19,'IN','Syntax\n------\n\nexpr IN (value,...)\n\nDescription\n-----------\n\nReturns 1 if expr is equal to any of the values in the IN list, else returns\n0. If all values are constants, they are evaluated according to the type of\nexpr and sorted. The search for the item then is done using a binary search.\nThis means IN is very quick if the IN value list consists entirely of\nconstants. Otherwise, type conversion takes place according to the rules\ndescribed at Type Conversion, but applied to all the arguments.\n\nIf expr is NULL, IN always returns NULL. If at least one of the values in the\nlist is NULL, and one of the comparisons is true, the result is 1. If at least\none of the values in the list is NULL and none of the comparisons is true, the\nresult is NULL.\n\nExamples\n--------\n\nSELECT 2 IN (0,3,5,7);\n+----------------+\n| 2 IN (0,3,5,7) |\n+----------------+\n| 0 |\n+----------------+\n\nSELECT \'wefwf\' IN (\'wee\',\'wefwf\',\'weg\');\n+----------------------------------+\n| \'wefwf\' IN (\'wee\',\'wefwf\',\'weg\') |\n+----------------------------------+\n| 1 |\n+----------------------------------+\n\nType conversion:\n\nSELECT 1 IN (\'1\', \'2\', \'3\');\n+----------------------+\n| 1 IN (\'1\', \'2\', \'3\') |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT NULL IN (1, 2, 3);\n+-------------------+\n| NULL IN (1, 2, 3) |\n+-------------------+\n| NULL |\n+-------------------+\n\nSELECT 1 IN (1, 2, NULL);\n+-------------------+\n| 1 IN (1, 2, NULL) |\n+-------------------+\n| 1 |\n+-------------------+\n\nSELECT 5 IN (1, 2, NULL);\n+-------------------+\n| 5 IN (1, 2, NULL) |\n+-------------------+\n| NULL |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/in/','','https://mariadb.com/kb/en/in/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (225,19,'INTERVAL','Syntax\n------\n\nINTERVAL(N,N1,N2,N3,...)\n\nDescription\n-----------\n\nReturns the index of the last argument that is less than the first argument or\nis NULL.\n\nReturns 0 if N < N1, 1 if N < N2, 2 if N < N3 and so on or -1 if N is NULL.\nAll arguments are treated as integers. It is required that N1 < N2 < N3 < ...\n< Nn for this function to work correctly. This is because a fast binary search\nis used.\n\nExamples\n--------\n\nSELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);\n+--------------------------------------+\n| INTERVAL(23, 1, 15, 17, 30, 44, 200) |\n+--------------------------------------+\n| 3 |\n+--------------------------------------+\n\nSELECT INTERVAL(10, 1, 10, 100, 1000);\n+--------------------------------+\n| INTERVAL(10, 1, 10, 100, 1000) |\n+--------------------------------+\n| 2 |\n+--------------------------------+\n\nSELECT INTERVAL(22, 23, 30, 44, 200);\n+-------------------------------+\n| INTERVAL(22, 23, 30, 44, 200) |\n+-------------------------------+\n| 0 |\n+-------------------------------+\n\nSELECT INTERVAL(10, 2, NULL);\n+-----------------------+\n| INTERVAL(10, 2, NULL) |\n+-----------------------+\n| 2 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/interval/','','https://mariadb.com/kb/en/interval/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (226,19,'IS','Syntax\n------\n\nIS boolean_value\n\nDescription\n-----------\n\nTests a value against a boolean value, where boolean_value can be TRUE, FALSE,\nor UNKNOWN.\n\nThere is an important difference between using IS TRUE or comparing a value\nwith TRUE using =. When using =, only 1 equals to TRUE. But when using IS\nTRUE, all values which are logically true (like a number > 1) return TRUE.\n\nExamples\n--------\n\nSELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;\n+-----------+------------+-----------------+\n| 1 IS TRUE | 0 IS FALSE | NULL IS UNKNOWN |\n+-----------+------------+-----------------+\n| 1 | 1 | 1 |\n+-----------+------------+-----------------+\n\nDifference between = and IS TRUE:\n\nSELECT 2 = TRUE, 2 IS TRUE;\n+----------+-----------+\n| 2 = TRUE | 2 IS TRUE |\n+----------+-----------+\n| 0 | 1 |\n+----------+-----------+\n\nURL: https://mariadb.com/kb/en/is/','','https://mariadb.com/kb/en/is/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (227,19,'IS NOT','Syntax\n------\n\nIS NOT boolean_value\n\nDescription\n-----------\n\nTests a value against a boolean value, where boolean_value can be TRUE, FALSE,\nor UNKNOWN.\n\nExamples\n--------\n\nSELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;\n+------------------+------------------+---------------------+\n| 1 IS NOT UNKNOWN | 0 IS NOT UNKNOWN | NULL IS NOT UNKNOWN |\n+------------------+------------------+---------------------+\n| 1 | 1 | 0 |\n+------------------+------------------+---------------------+\n\nSELECT NULL IS NOT TRUE, NULL IS NOT FALSE;\n+------------------+-------------------+\n| NULL IS NOT TRUE | NULL IS NOT FALSE |\n+------------------+-------------------+\n| 1 | 1 |\n+------------------+-------------------+\n\nURL: https://mariadb.com/kb/en/is-not/','','https://mariadb.com/kb/en/is-not/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (228,19,'IS NOT NULL','Syntax\n------\n\nIS NOT NULL\n\nDescription\n-----------\n\nTests whether a value is not NULL. See also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;\n+---------------+---------------+------------------+\n| 1 IS NOT NULL | 0 IS NOT NULL | NULL IS NOT NULL |\n+---------------+---------------+------------------+\n| 1 | 1 | 0 |\n+---------------+---------------+------------------+\n\nURL: https://mariadb.com/kb/en/is-not-null/','','https://mariadb.com/kb/en/is-not-null/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (229,19,'IS NULL','Syntax\n------\n\nIS NULL\n\nDescription\n-----------\n\nTests whether a value is NULL. See also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;\n+-----------+-----------+--------------+\n| 1 IS NULL | 0 IS NULL | NULL IS NULL |\n+-----------+-----------+--------------+\n| 0 | 0 | 1 |\n+-----------+-----------+--------------+\n\nCompatibility\n-------------\n\nSome ODBC applications use the syntax auto_increment_field IS NOT NULL to find\nthe latest row that was inserted with an autogenerated key value. If your\napplications need this, you can set the sql_auto_is_null variable to 1.\n\nSET @@sql_auto_is_null=1;\nCREATE TABLE t1 (auto_increment_column INT NOT NULL AUTO_INCREMENT PRIMARY\nKEY);\nINSERT INTO t1 VALUES (NULL);\nSELECT * FROM t1 WHERE auto_increment_column IS NULL;\n\n+-----------------------+\n| auto_increment_column |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/is-null/','','https://mariadb.com/kb/en/is-null/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (230,19,'ISNULL','Syntax\n------\n\nISNULL(expr)\n\nDescription\n-----------\n\nIf expr is NULL, ISNULL() returns 1, otherwise it returns 0.\n\nSee also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT ISNULL(1+1);\n+-------------+\n| ISNULL(1+1) |\n+-------------+\n| 0 |\n+-------------+\n\nSELECT ISNULL(1/0);\n+-------------+\n| ISNULL(1/0) |\n+-------------+\n| 1 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/isnull/','','https://mariadb.com/kb/en/isnull/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (231,19,'LEAST','Syntax\n------\n\nLEAST(value1,value2,...)\n\nDescription\n-----------\n\nWith two or more arguments, returns the smallest (minimum-valued) argument.\nThe arguments are compared using the following rules:\n\n* If the return value is used in an INTEGER context or all arguments are\ninteger-valued, they are compared as integers.\n* If the return value is used in a REAL context or all arguments are\nreal-valued, they are compared as reals.\n* If any argument is a case-sensitive string, the arguments are compared as\ncase-sensitive strings.\n* In all other cases, the arguments are compared as case-insensitive strings.\n\nLEAST() returns NULL if any argument is NULL.\n\nExamples\n--------\n\nSELECT LEAST(2,0);\n+------------+\n| LEAST(2,0) |\n+------------+\n| 0 |\n+------------+\n\nSELECT LEAST(34.0,3.0,5.0,767.0);\n+---------------------------+\n| LEAST(34.0,3.0,5.0,767.0) |\n+---------------------------+\n| 3.0 |\n+---------------------------+\n\nSELECT LEAST(\'B\',\'A\',\'C\');\n+--------------------+\n| LEAST(\'B\',\'A\',\'C\') |\n+--------------------+\n| A |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/least/','','https://mariadb.com/kb/en/least/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (232,19,'NOT BETWEEN','Syntax\n------\n\nexpr NOT BETWEEN min AND max\n\nDescription\n-----------\n\nThis is the same as NOT (expr BETWEEN min AND max).\n\nNote that the meaning of the alternative form NOT expr BETWEEN min AND max is\naffected by the HIGH_NOT_PRECEDENCE SQL_MODE flag.\n\nExamples\n--------\n\nSELECT 1 NOT BETWEEN 2 AND 3;\n+-----------------------+\n| 1 NOT BETWEEN 2 AND 3 |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT \'b\' NOT BETWEEN \'a\' AND \'c\';\n+-----------------------------+\n| \'b\' NOT BETWEEN \'a\' AND \'c\' |\n+-----------------------------+\n| 0 |\n+-----------------------------+\n\nNULL:\n\nSELECT 1 NOT BETWEEN 1 AND NULL;\n+--------------------------+\n| 1 NOT BETWEEN 1 AND NULL |\n+--------------------------+\n| NULL |\n+--------------------------+\n\nURL: https://mariadb.com/kb/en/not-between/','','https://mariadb.com/kb/en/not-between/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (233,19,'NOT IN','Syntax\n------\n\nexpr NOT IN (value,...)\n\nDescription\n-----------\n\nThis is the same as NOT (expr IN (value,...)).\n\nExamples\n--------\n\nSELECT 2 NOT IN (0,3,5,7);\n+--------------------+\n| 2 NOT IN (0,3,5,7) |\n+--------------------+\n| 1 |\n+--------------------+\n\nSELECT \'wefwf\' NOT IN (\'wee\',\'wefwf\',\'weg\');\n+--------------------------------------+\n| \'wefwf\' NOT IN (\'wee\',\'wefwf\',\'weg\') |\n+--------------------------------------+\n| 0 |\n+--------------------------------------+\n\nSELECT 1 NOT IN (\'1\', \'2\', \'3\');\n+--------------------------+\n| 1 NOT IN (\'1\', \'2\', \'3\') |\n+--------------------------+\n| 0 |\n+--------------------------+\n\nNULL:\n\nSELECT NULL NOT IN (1, 2, 3);\n+-----------------------+\n| NULL NOT IN (1, 2, 3) |\n+-----------------------+\n| NULL |\n+-----------------------+\n\nSELECT 1 NOT IN (1, 2, NULL);\n+-----------------------+\n| 1 NOT IN (1, 2, NULL) |\n+-----------------------+\n| 0 |\n+-----------------------+\n\nSELECT 5 NOT IN (1, 2, NULL);\n+-----------------------+\n| 5 NOT IN (1, 2, NULL) |\n+-----------------------+\n| NULL |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/not-in/','','https://mariadb.com/kb/en/not-in/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (234,20,'&','Syntax\n------\n\n&\n\nDescription\n-----------\n\nBitwise AND. Converts the values to binary and compares bits. Only if both the\ncorresponding bits are 1 is the resulting bit also 1.\n\nSee also bitwise OR.\n\nExamples\n--------\n\nSELECT 2&1;\n+-----+\n| 2&1 |\n+-----+\n| 0 |\n+-----+\n\nSELECT 3&1;\n+-----+\n| 3&1 |\n+-----+\n| 1 |\n+-----+\n\nSELECT 29 & 15;\n+---------+\n| 29 & 15 |\n+---------+\n| 13 |\n+---------+\n\nURL: https://mariadb.com/kb/en/bitwise_and/','','https://mariadb.com/kb/en/bitwise_and/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (235,20,'<<','Syntax\n------\n\nvalue1 << value2\n\nDescription\n-----------\n\nConverts a longlong (BIGINT) number (value1) to binary and shifts value2 units\nto the left.\n\nExamples\n--------\n\nSELECT 1 << 2;\n+--------+\n| 1 << 2 |\n+--------+\n| 4 |\n+--------+\n\nURL: https://mariadb.com/kb/en/shift-left/','','https://mariadb.com/kb/en/shift-left/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (236,20,'>>','Syntax\n------\n\nvalue1 >> value2\n\nDescription\n-----------\n\nConverts a longlong (BIGINT) number (value1) to binary and shifts value2 units\nto the right.\n\nExamples\n--------\n\nSELECT 4 >> 2;\n+--------+\n| 4 >> 2 |\n+--------+\n| 1 |\n+--------+\n\nURL: https://mariadb.com/kb/en/shift-right/','','https://mariadb.com/kb/en/shift-right/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (237,20,'BIT_COUNT','Syntax\n------\n\nBIT_COUNT(N)\n\nDescription\n-----------\n\nReturns the number of bits that are set in the argument N.\n\nExamples\n--------\n\nSELECT BIT_COUNT(29), BIT_COUNT(b\'101010\');\n+---------------+----------------------+\n| BIT_COUNT(29) | BIT_COUNT(b\'101010\') |\n+---------------+----------------------+\n| 4 | 3 |\n+---------------+----------------------+\n\nURL: https://mariadb.com/kb/en/bit_count/','','https://mariadb.com/kb/en/bit_count/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (238,20,'^','Syntax\n------\n\n^\n\nDescription\n-----------\n\nBitwise XOR. Converts the values to binary and compares bits. If one (and only\none) of the corresponding bits is 1 is the resulting bit also 1.\n\nExamples\n--------\n\nSELECT 1 ^ 1;\n+-------+\n| 1 ^ 1 |\n+-------+\n| 0 |\n+-------+\n\nSELECT 1 ^ 0;\n+-------+\n| 1 ^ 0 |\n+-------+\n| 1 |\n+-------+\n\nSELECT 11 ^ 3;\n+--------+\n| 11 ^ 3 |\n+--------+\n| 8 |\n+--------+\n\nURL: https://mariadb.com/kb/en/bitwise-xor/','','https://mariadb.com/kb/en/bitwise-xor/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (239,20,'|','Syntax\n------\n\n|\n\nDescription\n-----------\n\nBitwise OR. Converts the values to binary and compares bits. If either of the\ncorresponding bits has a value of 1, the resulting bit is also 1.\n\nSee also bitwise AND.\n\nExamples\n--------\n\nSELECT 2|1;\n+-----+\n| 2|1 |\n+-----+\n| 3 |\n+-----+\n\nSELECT 29 | 15;\n+---------+\n| 29 | 15 |\n+---------+\n| 31 |\n+---------+\n\nURL: https://mariadb.com/kb/en/bitwise-or/','','https://mariadb.com/kb/en/bitwise-or/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (240,20,'~','Syntax\n------\n\n~\n\nDescription\n-----------\n\nBitwise NOT. Converts the value to 4 bytes binary and inverts all bits.\n\nExamples\n--------\n\nSELECT 3 & ~1;\n+--------+\n| 3 & ~1 |\n+--------+\n| 2 |\n+--------+\n\nSELECT 5 & ~1;\n+--------+\n| 5 & ~1 |\n+--------+\n| 4 |\n+--------+\n\nURL: https://mariadb.com/kb/en/bitwise-not/','','https://mariadb.com/kb/en/bitwise-not/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (241,20,'Parentheses','Parentheses are sometimes called precedence operators - this means that they\ncan be used to change the other operator\'s precedence in an expression. The\nexpressions that are written between parentheses are computed before the\nexpressions that are written outside. Parentheses must always contain an\nexpression (that is, they cannot be empty), and can be nested.\n\nFor example, the following expressions could return different results:\n\n* NOT a OR b\n* NOT (a OR b)\n\nIn the first case, NOT applies to a, so if a is FALSE or b is TRUE, the\nexpression returns TRUE. In the second case, NOT applies to the result of a OR\nb, so if at least one of a or b is TRUE, the expression is TRUE.\n\nWhen the precedence of operators is not intuitive, you can use parentheses to\nmake it immediately clear for whoever reads the statement.\n\nThe precedence of the NOT operator can also be affected by the\nHIGH_NOT_PRECEDENCE SQL_MODE flag.\n\nOther uses\n----------\n\nParentheses must always be used to enclose subqueries.\n\nParentheses can also be used in a JOIN statement between multiple tables to\ndetermine which tables must be joined first.\n\nAlso, parentheses are used to enclose the list of parameters to be passed to\nbuilt-in functions, user-defined functions and stored routines. However, when\nno parameter is passed to a stored procedure, parentheses are optional. For\nbuiltin functions and user-defined functions, spaces are not allowed between\nthe function name and the open parenthesis, unless the IGNORE_SPACE SQL_MODE\nis set. For stored routines (and for functions if IGNORE_SPACE is set) spaces\nare allowed before the open parenthesis, including tab characters and new line\ncharacters.\n\nSyntax errors\n-------------\n\nIf there are more open parentheses than closed parentheses, the error usually\nlooks like this:\n\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual that\ncorresponds to your MariaDB server version for the right syntax to use near \'\'\na\nt line 1\n\nNote the empty string.\n\nIf there are more closed parentheses than open parentheses, the error usually\nlooks like this:\n\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual that\ncorresponds to your MariaDB server version for the right syntax to use near \')\'\nat line 1\n\nNote the quoted closed parenthesis.\n\nURL: https://mariadb.com/kb/en/parentheses/','','https://mariadb.com/kb/en/parentheses/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (242,20,'TRUE FALSE','Description\n-----------\n\nThe constants TRUE and FALSE evaluate to 1 and 0, respectively. The constant\nnames can be written in any lettercase.\n\nExamples\n--------\n\nSELECT TRUE, true, FALSE, false;\n+------+------+-------+-------+\n| TRUE | TRUE | FALSE | FALSE |\n+------+------+-------+-------+\n| 1 | 1 | 0 | 0 |\n+------+------+-------+-------+\n\nURL: https://mariadb.com/kb/en/true-false/','','https://mariadb.com/kb/en/true-false/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (243,21,'ANALYZE TABLE','Syntax\n------\n\nANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [,tbl_name ...] \n [PERSISTENT FOR [ALL|COLUMNS ([col_name [,col_name ...]])]\n [INDEXES ([index_name [,index_name ...]])]]\n\nDescription\n-----------\n\nANALYZE TABLE analyzes and stores the key distribution for a table (index\nstatistics). This statement works with MyISAM, Aria and InnoDB tables. During\nthe analysis, InnoDB will allow reads/writes, and MyISAM/Aria reads/inserts.\nFor MyISAM tables, this statement is equivalent to using myisamchk --analyze.\n\nFor more information on how the analysis works within InnoDB, see InnoDB\nLimitations.\n\nMariaDB uses the stored key distribution to decide the order in which tables\nshould be joined when you perform a join on something other than a constant.\nIn addition, key distributions can be used when deciding which indexes to use\nfor a specific table within a query.\n\nThis statement requires SELECT and INSERT privileges for the table.\n\nBy default, ANALYZE TABLE statements are written to the binary log and will be\nreplicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure the\nstatement is not written to the binary log.\n\nFrom MariaDB 10.3.19, ANALYZE TABLE statements are not logged to the binary\nlog if read_only is set. See also Read-Only Replicas.\n\nANALYZE TABLE is also supported for partitioned tables. You can use ALTER\nTABLE ... ANALYZE PARTITION to analyze one or more partitions.\n\nThe Aria storage engine supports progress reporting for the ANALYZE TABLE\nstatement.\n\nEngine-Independent Statistics\n-----------------------------\n\nANALYZE TABLE supports engine-independent statistics. See Engine-Independent\nTable Statistics: Collecting Statistics with the ANALYZE TABLE Statement for\nmore information.\n\nUseful Variables\n----------------\n\nFor calculating the number of duplicates, ANALYZE TABLE uses a buffer of\nsort_buffer_size bytes per column. You can slightly increase the speed of\nANALYZE TABLE by increasing this variable.\n\nURL: https://mariadb.com/kb/en/analyze-table/','','https://mariadb.com/kb/en/analyze-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (244,21,'CHECK TABLE','Syntax\n------\n\nCHECK TABLE tbl_name [, tbl_name] ... [option] ...\n\noption = {FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED | CHANGED}\n\nDescription\n-----------\n\nCHECK TABLE checks a table or tables for errors. CHECK TABLE works for\nArchive, Aria, CSV, InnoDB and MyISAM tables. For Aria and MyISAM tables, the\nkey statistics are updated as well. For CSV, see also Checking and Repairing\nCSV Tables.\n\nAs an alternative, myisamchk is a commandline tool for checking MyISAM tables\nwhen the tables are not being accessed. For Aria tables, there is a similar\ntool: aria_chk.\n\nFor checking dynamic columns integrity, COLUMN_CHECK() can be used.\n\nCHECK TABLE can also check views for problems, such as tables that are\nreferenced in the view definition that no longer exist.\n\nCHECK TABLE is also supported for partitioned tables. You can use ALTER TABLE\n... CHECK PARTITION to check one or more partitions.\n\nThe meaning of the different options are as follows - note that this can vary\na bit between storage engines:\n\n+-----+----------------------------------------------------------------------+\n| FOR | Do a very quick check if the storage format for the table has |\n| UPG | changed so that one needs to do a REPAIR. This is only needed when |\n| ADE | one upgrades between major versions of MariaDB or MySQL. This is |\n| | usually done by running mysql_upgrade. |\n+-----+----------------------------------------------------------------------+\n| FAS | Only check tables that has not been closed properly or are marked |\n| | as corrupt. Only supported by the MyISAM and Aria engines. For |\n| | other engines the table is checked normally |\n+-----+----------------------------------------------------------------------+\n| CHA | Check only tables that has changed since last REPAIR / CHECK. Only |\n| GED | supported by the MyISAM and Aria engines. For other engines the |\n| | table is checked normally. |\n+-----+----------------------------------------------------------------------+\n| QUI | Do a fast check. For MyISAM and Aria, this means skipping the check |\n| K | of the delete link chain, which may take some time. |\n+-----+----------------------------------------------------------------------+\n| MED | Scan also the data files. Checks integrity between data and index |\n| UM | files with checksums. In most cases this should find all possible |\n| | errors. |\n+-----+----------------------------------------------------------------------+\n| EXT | Does a full check to verify every possible error. For MyISAM and |\n| NDE | Aria, verify for each row that all it keys exists and points to the |\n| | row. This may take a long time on large tables. Ignored by InnoDB |\n| | before MariaDB 10.6.11, MariaDB 10.7.7, MariaDB 10.8.6 and MariaDB |\n| | 10.9.4. |\n+-----+----------------------------------------------------------------------+\n\nFor most cases running CHECK TABLE without options or MEDIUM should be good\nenough.\n\nThe Aria storage engine supports progress reporting for this statement.\n\nIf you want to know if two tables are identical, take a look at CHECKSUM TABLE.\n\nInnoDB\n------\n\nIf CHECK TABLE finds an error in an InnoDB table, MariaDB might shutdown to\nprevent the error propagation. In this case, the problem will be reported in\nthe error log. Otherwise the table or an index might be marked as corrupted,\nto prevent use. This does not happen with some minor problems, like a wrong\nnumber of entries in a secondary index. Those problems are reported in the\noutput of CHECK TABLE.\n\nEach tablespace contains a header with metadata. This header is not checked by\nthis statement.\n\nDuring the execution of CHECK TABLE, other threads may be blocked.\n\nURL: https://mariadb.com/kb/en/check-table/','','https://mariadb.com/kb/en/check-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (245,21,'CHECK VIEW','Syntax\n------\n\nCHECK VIEW view_name\n\nDescription\n-----------\n\nThe CHECK VIEW statement was introduced in MariaDB 10.0.18 to assist with\nfixing MDEV-6916, an issue introduced in MariaDB 5.2 where the view algorithms\nwere swapped. It checks whether the view algorithm is correct. It is run as\npart of mysql_upgrade, and should not normally be required in regular use.\n\nURL: https://mariadb.com/kb/en/check-view/','','https://mariadb.com/kb/en/check-view/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (246,21,'CHECKSUM TABLE','Syntax\n------\n\nCHECKSUM TABLE tbl_name [, tbl_name] ... [ QUICK | EXTENDED ]\n\nDescription\n-----------\n\nCHECKSUM TABLE reports a table checksum. This is very useful if you want to\nknow if two tables are the same (for example on a master and slave).\n\nWith QUICK, the live table checksum is reported if it is available, or NULL\notherwise. This is very fast. A live checksum is enabled by specifying the\nCHECKSUM=1 table option when you create the table; currently, this is\nsupported only for Aria and MyISAM tables.\n\nWith EXTENDED, the entire table is read row by row and the checksum is\ncalculated. This can be very slow for large tables.\n\nIf neither QUICK nor EXTENDED is specified, MariaDB returns a live checksum if\nthe table storage engine supports it and scans the table otherwise.\n\nCHECKSUM TABLE requires the SELECT privilege for the table.\n\nFor a nonexistent table, CHECKSUM TABLE returns NULL and generates a warning.\n\nThe table row format affects the checksum value. If the row format changes,\nthe checksum will change. This means that when a table created with a\nMariaDB/MySQL version is upgraded to another version, the checksum value will\nprobably change.\n\nTwo identical tables should always match to the same checksum value; however,\nalso for non-identical tables there is a very slight chance that they will\nreturn the same value as the hashing algorithm is not completely\ncollision-free.\n\nIdentical Tables\n----------------\n\nIdentical tables mean that the CREATE statement is identical and that the\nfollowing variable, which affects the storage formats, was the same when the\ntables were created:\n\n* mysql56-temporal-format\n\nDifferences Between MariaDB and MySQL\n-------------------------------------\n\nCHECKSUM TABLE may give a different result as MariaDB doesn\'t ignore NULLs in\nthe columns as MySQL 5.1 does (Later MySQL versions should calculate checksums\nthe same way as MariaDB). You can get the \'old style\' checksum in MariaDB by\nstarting mysqld with the --old option. Note however that that the MyISAM and\nAria storage engines in MariaDB are using the new checksum internally, so if\nyou are using --old, the CHECKSUM command will be slower as it needs to\ncalculate the checksum row by row. Starting from MariaDB Server 10.9, --old is\ndeprecated and will be removed in a future release. Set --old-mode or OLD_MODE\nto COMPAT_5_1_CHECKSUM to get \'old style\' checksum.\n\nURL: https://mariadb.com/kb/en/checksum-table/','','https://mariadb.com/kb/en/checksum-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (247,21,'OPTIMIZE TABLE','Syntax\n------\n\nOPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE\n tbl_name [, tbl_name] ...\n [WAIT n | NOWAIT]\n\nDescription\n-----------\n\nOPTIMIZE TABLE has two main functions. It can either be used to defragment\ntables, or to update the InnoDB fulltext index.\n\nMariaDB starting with 10.3.0\n----------------------------\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nDefragmenting\n-------------\n\nOPTIMIZE TABLE works for InnoDB (before MariaDB 10.1.1, only if the\ninnodb_file_per_table server system variable is set), Aria, MyISAM and ARCHIVE\ntables, and should be used if you have deleted a large part of a table or if\nyou have made many changes to a table with variable-length rows (tables that\nhave VARCHAR, VARBINARY, BLOB, or TEXT columns). Deleted rows are maintained\nin a linked list and subsequent INSERT operations reuse old row positions.\n\nThis statement requires SELECT and INSERT privileges for the table.\n\nBy default, OPTIMIZE TABLE statements are written to the binary log and will\nbe replicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure\nthe statement is not written to the binary log.\n\nFrom MariaDB 10.3.19, OPTIMIZE TABLE statements are not logged to the binary\nlog if read_only is set. See also Read-Only Replicas.\n\nOPTIMIZE TABLE is also supported for partitioned tables. You can use ALTER\nTABLE ... OPTIMIZE PARTITION to optimize one or more partitions.\n\nYou can use OPTIMIZE TABLE to reclaim the unused space and to defragment the\ndata file. With other storage engines, OPTIMIZE TABLE does nothing by default,\nand returns this message: \" The storage engine for the table doesn\'t support\noptimize\". However, if the server has been started with the --skip-new option,\nOPTIMIZE TABLE is linked to ALTER TABLE, and recreates the table. This\noperation frees the unused space and updates index statistics.\n\nThe Aria storage engine supports progress reporting for this statement.\n\nIf a MyISAM table is fragmented, concurrent inserts will not be performed\nuntil an OPTIMIZE TABLE statement is executed on that table, unless the\nconcurrent_insert server system variable is set to ALWAYS.\n\nUpdating an InnoDB fulltext index\n---------------------------------\n\nWhen rows are added or deleted to an InnoDB fulltext index, the index is not\nimmediately re-organized, as this can be an expensive operation. Change\nstatistics are stored in a separate location . The fulltext index is only\nfully re-organized when an OPTIMIZE TABLE statement is run.\n\nBy default, an OPTIMIZE TABLE will defragment a table. In order to use it to\nupdate fulltext index statistics, the innodb_optimize_fulltext_only system\nvariable must be set to 1. This is intended to be a temporary setting, and\nshould be reset to 0 once the fulltext index has been re-organized.\n\nSince fulltext re-organization can take a long time, the\ninnodb_ft_num_word_optimize variable limits the re-organization to a number of\nwords (2000 by default). You can run multiple OPTIMIZE statements to fully\nre-organize the index.\n\nDefragmenting InnoDB tablespaces\n--------------------------------\n\nMariaDB 10.1.1 merged the Facebook/Kakao defragmentation patch, allowing one\nto use OPTIMIZE TABLE to defragment InnoDB tablespaces. For this functionality\nto be enabled, the innodb_defragment system variable must be enabled. No new\ntables are created and there is no need to copy data from old tables to new\ntables. Instead, this feature loads n pages (determined by\ninnodb-defragment-n-pages) and tries to move records so that pages would be\nfull of records and then frees pages that are fully empty after the operation.\nNote that tablespace files (including ibdata1) will not shrink as the result\nof defragmentation, but one will get better memory utilization in the InnoDB\nbuffer pool as there are fewer data pages in use.\n\nSee Defragmenting InnoDB Tablespaces for more details.\n\nURL: https://mariadb.com/kb/en/optimize-table/','','https://mariadb.com/kb/en/optimize-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (248,21,'REPAIR TABLE','Syntax\n------\n\nREPAIR [NO_WRITE_TO_BINLOG | LOCAL] TABLE\n tbl_name [, tbl_name] ...\n [QUICK] [EXTENDED] [USE_FRM]\n\nDescription\n-----------\n\nREPAIR TABLE repairs a possibly corrupted table. By default, it has the same\neffect as\n\nmyisamchk --recover tbl_name\n\nor\n\naria_chk --recover tbl_name\n\nSee aria_chk and myisamchk for more.\n\nREPAIR TABLE works for Archive, Aria, CSV and MyISAM tables. For InnoDB, see\nrecovery modes. For CSV, see also Checking and Repairing CSV Tables. For\nArchive, this statement also improves compression. If the storage engine does\nnot support this statement, a warning is issued.\n\nThis statement requires SELECT and INSERT privileges for the table.\n\nBy default, REPAIR TABLE statements are written to the binary log and will be\nreplicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure the\nstatement is not written to the binary log.\n\nFrom MariaDB 10.3.19, REPAIR TABLE statements are not logged to the binary log\nif read_only is set. See also Read-Only Replicas.\n\nWhen an index is recreated, the storage engine may use a configurable buffer\nin the process. Incrementing the buffer speeds up the index creation. Aria and\nMyISAM allocate a buffer whose size is defined by aria_sort_buffer_size or\nmyisam_sort_buffer_size, also used for ALTER TABLE.\n\nREPAIR TABLE is also supported for partitioned tables. However, the USE_FRM\noption cannot be used with this statement on a partitioned table.\n\nALTER TABLE ... REPAIR PARTITION can be used to repair one or more partitions.\n\nThe Aria storage engine supports progress reporting for this statement.\n\nURL: https://mariadb.com/kb/en/repair-table/','','https://mariadb.com/kb/en/repair-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (249,21,'REPAIR VIEW','Syntax\n------\n\nREPAIR [NO_WRITE_TO_BINLOG | LOCAL] VIEW view_name[, view_name] ... [FROM\nMYSQL]\n\nDescription\n-----------\n\nThe REPAIR VIEW statement was introduced to assist with fixing MDEV-6916, an\nissue introduced in MariaDB 5.2 where the view algorithms were swapped\ncompared to their MySQL on disk representation. It checks whether the view\nalgorithm is correct. It is run as part of mysql_upgrade, and should not\nnormally be required in regular use.\n\nBy default it corrects the checksum and if necessary adds the mariadb-version\nfield. If the optional FROM MYSQL clause is used, and no mariadb-version field\nis present, the MERGE and TEMPTABLE algorithms are toggled.\n\nBy default, REPAIR VIEW statements are written to the binary log and will be\nreplicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure the\nstatement is not written to the binary log.\n\nURL: https://mariadb.com/kb/en/repair-view/','','https://mariadb.com/kb/en/repair-view/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (250,22,'mysql.func Table','The mysql.func table stores information about user-defined functions (UDFs)\ncreated with the CREATE FUNCTION UDF statement.\n\nMariaDB starting with 10.4\n--------------------------\nIn MariaDB 10.4 and later, this table uses the Aria storage engine.\n\nMariaDB until 10.3\n------------------\nIn MariaDB 10.3 and before, this table uses the MyISAM storage engine.\n\nThe mysql.func table contains the following fields:\n\n+----------+---------+---------+-------+--------------+---------------------+\n| Field | Type | Null | Key | Default | Description |\n+----------+---------+---------+-------+--------------+---------------------+\n| name | char(64 | NO | PRI | | UDF name |\n| | | | | | |\n+----------+---------+---------+-------+--------------+---------------------+\n| ret | tinyint | NO | | 0 | |\n| | 1) | | | | |\n+----------+---------+---------+-------+--------------+---------------------+\n| dl | char(12 | NO | | | Shared library name |\n| | ) | | | | |\n+----------+---------+---------+-------+--------------+---------------------+\n| type | enum(\'f | NO | | NULL | Type, either |\n| | nction\' | | | | function or |\n| | \'aggreg | | | | aggregate. |\n| | te\') | | | | Aggregate |\n| | | | | | functions are |\n| | | | | | summary functions |\n| | | | | | such as SUM() and |\n| | | | | | AVG(). |\n+----------+---------+---------+-------+--------------+---------------------+\n\nExample\n-------\n\nSELECT * FROM mysql.func;\n+------------------------------+-----+--------------+-----------+\n| name | ret | dl | type |\n+------------------------------+-----+--------------+-----------+\n| spider_direct_sql | 2 | ha_spider.so | function |\n| spider_bg_direct_sql | 2 | ha_spider.so | aggregate |\n| spider_ping_table | 2 | ha_spider.so | function |\n| spider_copy_tables | 2 | ha_spider.so | function |\n| spider_flush_table_mon_cache | 2 | ha_spider.so | function |\n+------------------------------+-----+--------------+-----------+\n\nURL: https://mariadb.com/kb/en/mysqlfunc-table/','','https://mariadb.com/kb/en/mysqlfunc-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (251,22,'CREATE FUNCTION UDF','Syntax\n------\n\nCREATE [OR REPLACE] [AGGREGATE] FUNCTION [IF NOT EXISTS] function_name\n RETURNS {STRING|INTEGER|REAL|DECIMAL}\n SONAME shared_library_name\n\nDescription\n-----------\n\nA user-defined function (UDF) is a way to extend MariaDB with a new function\nthat works like a native (built-in) MariaDB function such as ABS() or CONCAT().\n\nfunction_name is the name that should be used in SQL statements to invoke the\nfunction.\n\nTo create a function, you must have the INSERT privilege for the mysql\ndatabase. This is necessary becauseCREATE FUNCTION adds a row to the\nmysql.func system table that records the function\'s name, type, and shared\nlibrary name. If you do not have this table, you should run the mysql_upgrade\ncommand to create it.\n\nUDFs need to be written in C, C++ or another language that uses C calling\nconventions, MariaDB needs to have been dynamically compiled, and your\noperating system must support dynamic loading.\n\nFor an example, see sql/udf_example.cc in the source tree. For a collection of\nexisting UDFs see http://www.mysqludf.org/.\n\nStatements making use of user-defined functions are not safe for replication.\n\nFor creating a stored function as opposed to a user-defined function, see\nCREATE FUNCTION.\n\nFor valid identifiers to use as function names, see Identifier Names.\n\nRETURNS\n-------\n\nThe RETURNS clause indicates the type of the function\'s return value, and can\nbe one of STRING, INTEGER, REAL or DECIMAL. DECIMAL functions currently return\nstring values and should be written like STRING functions.\n\nshared_library_name\n-------------------\n\nshared_library_name is the basename of the shared object file that contains\nthe code that implements the function. The file must be located in the plugin\ndirectory. This directory is given by the value of the plugin_dir system\nvariable. Note that before MariaDB/MySQL 5.1, the shared object could be\nlocated in any directory that was searched by your system\'s dynamic linker.\n\nAGGREGATE\n---------\n\nAggregate functions are summary functions such as SUM() and AVG().\n\nMariaDB starting with 10.4\n--------------------------\nAggregate UDF functions can be used as window functions.\n\nOR REPLACE\n----------\n\nMariaDB starting with 10.1.3\n----------------------------\nThe OR REPLACE clause was added in MariaDB 10.1.3\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP FUNCTION IF EXISTS function_name;\nCREATE FUNCTION name ...;\n\nIF NOT EXISTS\n-------------\n\nMariaDB starting with 10.1.3\n----------------------------\nThe IF NOT EXISTS clause was added in MariaDB 10.1.3\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified function already exists. Cannot be used together\nwith OR REPLACE.\n\nUpgrading a UDF\n---------------\n\nTo upgrade the UDF\'s shared library, first run a DROP FUNCTION statement, then\nupgrade the shared library and finally run the CREATE FUNCTION statement. If\nyou upgrade without following this process, you may crash the server.\n\nExamples\n--------\n\nCREATE FUNCTION jsoncontains_path RETURNS integer SONAME \'ha_connect.so\';\nQuery OK, 0 rows affected (0.00 sec)\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE FUNCTION jsoncontains_path RETURNS integer SONAME \'ha_connect.so\';\nERROR 1125 (HY000): Function \'jsoncontains_path\' already exists\n\nCREATE OR REPLACE FUNCTION jsoncontains_path RETURNS integer SONAME\n\'ha_connect.so\';\nQuery OK, 0 rows affected (0.00 sec)\n\nCREATE FUNCTION IF NOT EXISTS jsoncontains_path RETURNS integer SONAME\n\'ha_connect.so\';\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+---------------------------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------------------------+\n| Note | 1125 | Function \'jsoncontains_path\' already exists |\n+-------+------+---------------------------------------------+\n\nURL: https://mariadb.com/kb/en/create-function-udf/','','https://mariadb.com/kb/en/create-function-udf/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (252,22,'DROP FUNCTION UDF','Syntax\n------\n\nDROP FUNCTION [IF EXISTS] function_name\n\nDescription\n-----------\n\nThis statement drops the user-defined function (UDF) named function_name.\n\nTo drop a function, you must have the DELETE privilege for the mysql database.\nThis is because DROP FUNCTION removes the row from the mysql.func system table\nthat records the function\'s name, type and shared library name.\n\nFor dropping a stored function, see DROP FUNCTION.\n\nUpgrading a UDF\n---------------\n\nTo upgrade the UDF\'s shared library, first run a DROP FUNCTION statement, then\nupgrade the shared library and finally run the CREATE FUNCTION statement. If\nyou upgrade without following this process, you may crash the server.\n\nExamples\n--------\n\nDROP FUNCTION jsoncontains_path;\n\nIF EXISTS:\n\nDROP FUNCTION jsoncontains_path;\nERROR 1305 (42000): FUNCTION test.jsoncontains_path does not exist\n\nDROP FUNCTION IF EXISTS jsoncontains_path;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------------------+\n| Note | 1305 | FUNCTION test.jsoncontains_path does not exist |\n+-------+------+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-function-udf/','','https://mariadb.com/kb/en/drop-function-udf/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (253,22,'Creating User-Defined Functions','User-defined functions allow MariaDB to be extended with a new function that\nworks like a native (built-in) MariaDB function such as ABS() or CONCAT().\nThere are alternative ways to add a new function: writing a native function\n(which requires modifying and compiling the server source code), or writing a\nstored function.\n\nStatements making use of user-defined functions are not safe for replication.\n\nFunctions are written in C or C++, and to make use of them, the operating\nsystem must support dynamic loading.\n\nEach new SQL function requires corresponding functions written in C/C++. In\nthe list below, at least the main function - x() - and one other, are\nrequired. x should be replaced by the name of the function you are creating.\n\nAll functions need to be thread-safe, so not global or static variables that\nchange can be allocated. Memory is allocated in x_init()/ and freed in\nx_deinit().\n\nSimple Functions\n----------------\n\nx()\n---\n\nRequired for all UDFs; this is where the results are calculated.\n\n+------------------------------------------+----------------------------------+\n| C/C++ type | SQL type |\n+------------------------------------------+----------------------------------+\n| char * | STRING |\n+------------------------------------------+----------------------------------+\n| long long | INTEGER |\n+------------------------------------------+----------------------------------+\n| double | REAL |\n+------------------------------------------+----------------------------------+\n\nDECIMAL functions return string values, and so should be written accordingly.\nIt is not possible to create ROW functions.\n\nx_init()\n--------\n\nInitialization function for x(). Can be used for the following:\n\n* Check the number of arguments to X() (the SQL equivalent).\n* Verify the argument types, or to force arguments to be of a particular type\nafter the function is called.\n* Specify whether the result can be NULL.\n* Specify the maximum result length.\n* For REAL functions, specify the maximum number of decimals for the result.\n* Allocate any required memory.\n\nx_deinit()\n----------\n\nDe-initialization function for x(). Used to de-allocate memory that was\nallocated in x_init().\n\nDescription\n-----------\n\nEach time the SQL function X() is called:\n\n* MariaDB will first call the C/C++ initialization function, x_init(),\nassuming it exists. All setup will be performed, and if it returns an error,\nthe SQL statement is aborted and no further functions are called.\n* If there is no x_init() function, or it has been called and did not return\nan error, x() is then called once per row.\n* After all rows have finished processing, x_deinit() is called, if present,\nto clean up by de-allocating any memory that was allocated in x_init().\n* See User-defined Functions Calling Sequences for more details on the\nfunctions.\n\nAggregate Functions\n-------------------\n\nThe following functions are required for aggregate functions, such as AVG()\nand SUM(). When using CREATE FUNCTION, the AGGREGATE keyword is required.\n\nx_clear()\n---------\n\nUsed to reset the current aggregate, but without inserting the argument as the\ninitial aggregate value for the new group.\n\nx_add()\n-------\n\nUsed to add the argument to the current aggregate.\n\nx_remove()\n----------\n\nStarting from MariaDB 10.4, improves the support of window functions (so it is\nnot obligatory to add it) and should remove the argument from the current\naggregate.\n\nDescription\n-----------\n\nEach time the aggregate SQL function X() is called:\n\n* MariaDB will first call the C/C++ initialization function, x_init(),\nassuming it exists. All setup will be performed, and if it returns an error,\nthe SQL statement is aborted and no further functions are called.\n* If there is no x_init() function, or it has been called and did not return\nan error, x() is then called once per row.\n* After all rows have finished processing, x_deinit() is called, if present,\nto clean up by de-allocating any memory that was allocated in x_init().\n\n* MariaDB will first call the C/C++ initialization function, x_init(),\nassuming it exists. All setup will be performed, and if it returns an error,\nthe SQL statement is aborted and no further functions are called.\n* The table is sorted according to the GROUP BY expression.\n* x_clear() is called for the first row of each new group.\n* x_add() is called once per row for each row in the same group.\n* x() is called when the group changes, or after the last row, to get the\naggregate result. \n* The latter three steps are repeated until all rows have been processed.\n* After all rows have finished processing, x_deinit() is called, if present,\nto clean up by de-allocating any memory that was allocated in x_init().\n\nExamples\n--------\n\nFor an example, see sql/udf_example.cc in the source tree. For a collection of\nexisting UDFs see https://github.com/mysqludf.\n\nURL: https://mariadb.com/kb/en/creating-user-defined-functions/','','https://mariadb.com/kb/en/creating-user-defined-functions/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (254,22,'User-Defined Functions Calling Sequences','The functions described in Creating User-defined Functions are expanded on\nthis page. They are declared as follows:\n\nSimple Functions\n----------------\n\nx()\n---\n\nIf x() returns an integer, it is declared as follows:\n\nlong long x(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n\nIf x() returns a string (DECIMAL functions also return string values), it is\ndeclared as follows:\n\nchar *x(UDF_INIT *initid, UDF_ARGS *args,\n char *result, unsigned long *length,\n char *is_null, char *error);\n\nIf x() returns a real, it is declared as follows:\n\ndouble x(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n\nx_init()\n--------\n\nmy_bool x_init(UDF_INIT *initid, UDF_ARGS *args, char *message);\n\nx_deinit()\n----------\n\nvoid x_deinit(UDF_INIT *initid);\n\nDescription\n-----------\n\ninitid is a parameter passed to all three functions that points to a UDF_INIT\nstructure, used for communicating information between the functions. Its\nstructure members are:\n\n* my_bool maybe_null\nmaybe_null should be set to 1 if x_init can return a NULL value, Defaults to 1\nif any arguments are declared maybe_null.\n\n* unsigned int decimals\nNumber of decimals after the decimal point. The default, if an explicit number\nof decimals is passed in the arguments to the main function, is the maximum\nnumber of decimals, so if 9.5, 9.55 and 9.555 are passed to the function, the\ndefault would be three (based on 9.555, the maximum). If there are no\nexplicit number of decimals, the default is set to 31, or one more than the\nmaximum for the DOUBLE, FLOAT and DECIMAL types. This default can be changed\nin the function to suit the actual calculation.\n\n* unsigned int max_length\nMaximum length of the result. For integers, the default is 21. For strings,\nthe length of the longest argument. For reals, the default is 13 plus the\nnumber of decimals indicated by initid->decimals. The length includes any\nsigns or decimal points. Can also be set to 65KB or 16MB in order to return a\nBLOB. The memory remains unallocated, but this is used to decide on the data\ntype to use if the data needs to be temporarily stored.\n\n* char *ptr\nA pointer for use as required by the function. Commonly, initid->ptr is used\nto communicate allocated memory, with x_init() allocating the memory and\nassigning it to this pointer, x() using it, and x_deinit() de-allocating it.\n\n* my_bool const_item\nShould be set to 1 in x_init() if x() always returns the same value, otherwise\n0.\n\nAggregate Functions\n-------------------\n\nx_clear()\n---------\n\nx_clear() is a required function for aggregate functions, and is declared as\nfollows:\n\nvoid x_clear(UDF_INIT *initid, char *is_null, char *error);\n\nIt is called when the summary results need to be reset, that is at the\nbeginning of each new group. but also to reset the values when there were no\nmatching rows.\n\nis_null is set to point to CHAR(0) before calling x_clear().\n\nIn the case of an error, you can store the value to which the error argument\npoints (a single-byte variable, not a string string buffer) in the variable.\n\nx_reset()\n---------\n\nx_reset() is declared as follows:\n\nvoid x_reset(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n\nIt is called on finding the first row in a new group. Should reset the summary\nvariables, and then use UDF_ARGS as the first value in the group\'s internal\nsummary value. The function is not required if the UDF interface uses\nx_clear().\n\nx_add()\n-------\n\nx_add() is declared as follows:\n\nvoid x_add(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n\nIt is called for all rows belonging to the same group, and should be used to\nadd the value in UDF_ARGS to the internal summary variable.\n\nx_remove()\n----------\n\nx_remove() was added in MariaDB 10.4 and is declared as follows (same as\nx_add()):\n\nvoid x_remove(UDF_INIT* initid, UDF_ARGS* args,\n char* is_null, char *error );\n\nIt adds more efficient support of aggregate UDFs as window functions.\nx_remove() should \"subtract\" the row (reverse x_add()). In MariaDB 10.4\naggregate UDFs will work as WINDOW functions without x_remove() but it will\nnot be so efficient.\n\nIf x_remove() supported (defined) detected automatically.\n\nURL: https://mariadb.com/kb/en/user-defined-functions-calling-sequences/','','https://mariadb.com/kb/en/user-defined-functions-calling-sequences/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (255,22,'User-Defined Functions Security','The MariaDB server imposes a number of limitations on user-defined functions\nfor security purposes.\n\n* The INSERT privilege for the mysql database is required to run CREATE\nFUNCTION, as a record will be added to the mysql.func-table.\n* The DELETE privilege for the mysql database is required to run DROP FUNCTION\nas the corresponding record will be removed from the mysql.func-table.\n* UDF object files can only be placed in the plugin directory, as specified by\nthe value of the plugin_dir system variable.\n* At least one symbol, beyond the required x() - corresponding to an SQL\nfunction X()) - is required. These can be x_init(), x_deinit(), xxx_reset(),\nx_clear() and x_add() functions (see Creating User-defined Functions). The\nallow-suspicious-udfs mysqld option (by default unset) provides a workaround,\npermitting only one symbol to be used. This is not recommended, as it opens\nthe possibility of loading shared objects that are not legitimate user-defined\nfunctions.\n\nURL: https://mariadb.com/kb/en/user-defined-functions-security/','','https://mariadb.com/kb/en/user-defined-functions-security/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (256,23,'Numeric Data Type Overview','There are a number of numeric data types:\n\n* TINYINT\n* BOOLEAN - Synonym for TINYINT(1)\n* INT1 - Synonym for TINYINT\n* SMALLINT\n* INT2 - Synonym for SMALLINT\n* MEDIUMINT\n* INT3 - Synonym for MEDIUMINT\n* INT, INTEGER\n* INT4 - Synonym for INT\n* BIGINT\n* INT8 - Synonym for BIGINT\n* DECIMAL, DEC, NUMERIC, FIXED\n* FLOAT\n* DOUBLE, DOUBLE PRECISION, REAL\n* BIT\n\nSee the specific articles for detailed information on each.\n\nSIGNED, UNSIGNED and ZEROFILL\n-----------------------------\n\nMost numeric types can be defined as SIGNED, UNSIGNED or ZEROFILL, for example:\n\nTINYINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nIf SIGNED, or no attribute, is specified, a portion of the numeric type will\nbe reserved for the sign (plus or minus). For example, a TINYINT SIGNED can\nrange from -128 to 127.\n\nIf UNSIGNED is specified, no portion of the numeric type is reserved for the\nsign, so for integer types range can be larger. For example, a TINYINT\nUNSIGNED can range from 0 to 255. Floating point and fixed-point types also\ncan be UNSIGNED, but this only prevents negative values from being stored and\ndoesn\'t alter the range.\n\nIf ZEROFILL is specified, the column will be set to UNSIGNED and the spaces\nused by default to pad the field are replaced with zeros. ZEROFILL is ignored\nin expressions or as part of a UNION. ZEROFILL is a non-standard MySQL and\nMariaDB enhancement.\n\nNote that although the preferred syntax indicates that the attributes are\nexclusive, more than one attribute can be specified.\n\nUntil MariaDB 10.2.7 (MDEV-8659), any combination of the attributes could be\nused in any order, with duplicates. In this case:\n\n* the presence of ZEROFILL makes the column UNSIGNED ZEROFILL.\n* the presence of UNSIGNED makes the column UNSIGNED.\n\nFrom MariaDB 10.2.8, only the following combinations are supported:\n\n* SIGNED\n* UNSIGNED\n* ZEROFILL\n* UNSIGNED ZEROFILL\n* ZEROFILL UNSIGNED\n\nThe latter two should be replaced with simply ZEROFILL, but are still accepted\nby the parser.\n\nExamples\n--------\n\nCREATE TABLE zf (\n i1 TINYINT SIGNED,\n i2 TINYINT UNSIGNED,\n i3 TINYINT ZEROFILL\n);\n\nINSERT INTO zf VALUES (2,2,2);\n\nSELECT * FROM zf;\n+------+------+------+\n| i1 | i2 | i3 |\n+------+------+------+\n| 2 | 2 | 002 |\n+------+------+------+\n\nRange\n-----\n\nWhen attempting to add a value that is out of the valid range for the numeric\ntype, MariaDB will react depending on the strict SQL_MODE setting.\n\nIf strict_mode has been set (the default from MariaDB 10.2.4), MariaDB will\nreturn an error.\n\nIf strict_mode has not been set (the default until MariaDB 10.2.3), MariaDB\nwill adjust the number to fit in the field, returning a warning.\n\nExamples\n--------\n\nWith strict_mode set:\n\nSHOW VARIABLES LIKE \'sql_mode\';\n+---------------+--------------------------------------------------------------\n----------------------------+\n| Variable_name | Value \n |\n+---------------+--------------------------------------------------------------\n----------------------------+\n| sql_mode |\nSTRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SU\nSTITUTION |\n+---------------+--------------------------------------------------------------\n----------------------------+\n\nCREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT UNSIGNED);\n\nINSERT INTO ranges VALUES (257,257,257);\nERROR 1264 (22003): Out of range value for column \'i1\' at row 1\n\nSELECT * FROM ranges;\nEmpty set (0.10 sec)\n\nWith strict_mode unset:\n\nSHOW VARIABLES LIKE \'sql_mode%\';\n+---------------+-------+\n| Variable_name | Value |\n+---------------+-------+\n| sql_mode | |\n+---------------+-------+\n\nCREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT UNSIGNED);\n\nINSERT INTO ranges VALUES (257,257,257);\nQuery OK, 1 row affected, 2 warnings (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+---------------------------------------------+\n| Level | Code | Message |\n+---------+------+---------------------------------------------+\n| Warning | 1264 | Out of range value for column \'i1\' at row 1 |\n| Warning | 1264 | Out of range value for column \'i3\' at row 1 |\n+---------+------+---------------------------------------------+\n2 rows in set (0.00 sec)\n\nSELECT * FROM ranges;\n+------+------+------+\n| i1 | i2 | i3 |\n+------+------+------+\n| 127 | 257 | 255 |\n+------+------+------+\n\nAuto_increment\n--------------\n\nThe AUTO_INCREMENT attribute can be used to generate a unique identity for new\nrows. For more details, see auto_increment.\n\nURL: https://mariadb.com/kb/en/numeric-data-type-overview/','','https://mariadb.com/kb/en/numeric-data-type-overview/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (257,23,'TINYINT','Syntax\n------\n\nTINYINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA very small integer. The signed range is -128 to 127. The unsigned range is 0\nto 255. For details on the attributes, see Numeric Data Type Overview.\n\nINT1 is a synonym for TINYINT. BOOL and BOOLEAN are synonyms for TINYINT(1).\n\nExamples\n--------\n\nCREATE TABLE tinyints (a TINYINT,b TINYINT UNSIGNED,c TINYINT ZEROFILL);\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO tinyints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO tinyints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO tinyints VALUES (-10,10,10);\n\nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 10 | 010 |\n+------+------+------+\n\nINSERT INTO tinyints VALUES (128,128,128);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO tinyints VALUES (127,128,128);\n\nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 10 | 010 |\n| 127 | 128 | 128 |\n+------+------+------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO tinyints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.08 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO tinyints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.11 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO tinyints VALUES (-10,10,10);\n\nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 0 | 000 |\n| -10 | 10 | 000 |\n| -10 | 10 | 010 |\n+------+------+------+\n\nINSERT INTO tinyints VALUES (128,128,128);\nQuery OK, 1 row affected, 1 warning (0.19 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO tinyints VALUES (127,128,128);\n\nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 0 | 000 |\n| -10 | 10 | 000 |\n| -10 | 10 | 010 |\n| 127 | 128 | 128 |\n| 127 | 128 | 128 |\n+------+------+------+\n\nURL: https://mariadb.com/kb/en/tinyint/','','https://mariadb.com/kb/en/tinyint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (258,23,'BOOLEAN','Syntax\n------\n\nBOOL, BOOLEAN\n\nDescription\n-----------\n\nThese types are synonyms for TINYINT(1). A value of zero is considered false.\nNon-zero values are considered true.\n\nHowever, the values TRUE and FALSE are merely aliases for 1 and 0. See Boolean\nLiterals, as well as the IS operator for testing values against a boolean.\n\nExamples\n--------\n\nCREATE TABLE boo (i BOOLEAN);\n\nDESC boo;\n+-------+------------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+------------+------+-----+---------+-------+\n| i | tinyint(1) | YES | | NULL | |\n+-------+------------+------+-----+---------+-------+\n\nSELECT IF(0, \'true\', \'false\');\n+------------------------+\n| IF(0, \'true\', \'false\') |\n+------------------------+\n| false |\n+------------------------+\n\nSELECT IF(1, \'true\', \'false\');\n+------------------------+\n| IF(1, \'true\', \'false\') |\n+------------------------+\n| true |\n+------------------------+\n\nSELECT IF(2, \'true\', \'false\');\n+------------------------+\n| IF(2, \'true\', \'false\') |\n+------------------------+\n| true |\n+------------------------+\n\nTRUE and FALSE as aliases for 1 and 0:\n\nSELECT IF(0 = FALSE, \'true\', \'false\');\n\n+--------------------------------+\n| IF(0 = FALSE, \'true\', \'false\') |\n+--------------------------------+\n| true |\n+--------------------------------+\n\nSELECT IF(1 = TRUE, \'true\', \'false\');\n+-------------------------------+\n| IF(1 = TRUE, \'true\', \'false\') |\n+-------------------------------+\n| true |\n+-------------------------------+\n\nSELECT IF(2 = TRUE, \'true\', \'false\');\n+-------------------------------+\n| IF(2 = TRUE, \'true\', \'false\') |\n+-------------------------------+\n| false |\n+-------------------------------+\n\nSELECT IF(2 = FALSE, \'true\', \'false\');\n+--------------------------------+\n| IF(2 = FALSE, \'true\', \'false\') |\n+--------------------------------+\n| false |\n+--------------------------------+\n\nThe last two statements display the results shown because 2 is equal to\nneither 1 nor 0.\n\nURL: https://mariadb.com/kb/en/boolean/','','https://mariadb.com/kb/en/boolean/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (259,23,'SMALLINT','Syntax\n------\n\nSMALLINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA small integer. The signed range is -32768 to 32767. The unsigned range is 0\nto 65535.\n\nIf a column has been set to ZEROFILL, all values will be prepended by zeros so\nthat the SMALLINT value contains a number of M digits.\n\nNote: If the ZEROFILL attribute has been specified, the column will\nautomatically become UNSIGNED.\n\nINT2 is a synonym for SMALLINT.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nExamples\n--------\n\nCREATE TABLE smallints (a SMALLINT,b SMALLINT UNSIGNED,c SMALLINT ZEROFILL);\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO smallints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO smallints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO smallints VALUES (-10,10,10);\n\nINSERT INTO smallints VALUES (32768,32768,32768);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO smallints VALUES (32767,32768,32768);\n\nSELECT * FROM smallints;\n+-------+-------+-------+\n| a | b | c |\n+-------+-------+-------+\n| -10 | 10 | 00010 |\n| 32767 | 32768 | 32768 |\n+-------+-------+-------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO smallints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.09 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO smallints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO smallints VALUES (-10,10,10);\n\nINSERT INTO smallints VALUES (32768,32768,32768);\nQuery OK, 1 row affected, 1 warning (0.04 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO smallints VALUES (32767,32768,32768);\n\nSELECT * FROM smallints;\n+-------+-------+-------+\n| a | b | c |\n+-------+-------+-------+\n| -10 | 0 | 00000 |\n| -10 | 10 | 00000 |\n| -10 | 10 | 00010 |\n| 32767 | 32768 | 32768 |\n| 32767 | 32768 | 32768 |\n+-------+-------+-------+\n\nURL: https://mariadb.com/kb/en/smallint/','','https://mariadb.com/kb/en/smallint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (260,23,'MEDIUMINT','Syntax\n------\n\nMEDIUMINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA medium-sized integer. The signed range is -8388608 to 8388607. The unsigned\nrange is 0 to 16777215.\n\nZEROFILL pads the integer with zeroes and assumes UNSIGNED (even if UNSIGNED\nis not specified).\n\nINT3 is a synonym for MEDIUMINT.\n\nFor details on the attributes, see Numeric Data Type Overview.\n\nExamples\n--------\n\nCREATE TABLE mediumints (a MEDIUMINT,b MEDIUMINT UNSIGNED,c MEDIUMINT\nZEROFILL);\n\nDESCRIBE mediumints;\n+-------+--------------------------------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+--------------------------------+------+-----+---------+-------+\n| a | mediumint(9) | YES | | NULL | |\n| b | mediumint(8) unsigned | YES | | NULL | |\n| c | mediumint(8) unsigned zerofill | YES | | NULL | |\n+-------+--------------------------------+------+-----+---------+-------+\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO mediumints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO mediumints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO mediumints VALUES (-10,10,10);\n\nINSERT INTO mediumints VALUES (8388608,8388608,8388608);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO mediumints VALUES (8388607,8388608,8388608);\n\nSELECT * FROM mediumints;\n+---------+---------+----------+\n| a | b | c |\n+---------+---------+----------+\n| -10 | 10 | 00000010 |\n| 8388607 | 8388608 | 08388608 |\n+---------+---------+----------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO mediumints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.05 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO mediumints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO mediumints VALUES (-10,10,10);\n\nINSERT INTO mediumints VALUES (8388608,8388608,8388608);\nQuery OK, 1 row affected, 1 warning (0.05 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO mediumints VALUES (8388607,8388608,8388608);\n\nSELECT * FROM mediumints;\n+---------+---------+----------+\n| a | b | c |\n+---------+---------+----------+\n| -10 | 0 | 00000000 |\n| -10 | 0 | 00000000 |\n| -10 | 10 | 00000000 |\n| -10 | 10 | 00000010 |\n| 8388607 | 8388608 | 08388608 |\n| 8388607 | 8388608 | 08388608 |\n+---------+---------+----------+\n\nURL: https://mariadb.com/kb/en/mediumint/','','https://mariadb.com/kb/en/mediumint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (261,23,'INT','Syntax\n------\n\nINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\nINTEGER[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA normal-size integer. When marked UNSIGNED, it ranges from 0 to 4294967295,\notherwise its range is -2147483648 to 2147483647 (SIGNED is the default). If a\ncolumn has been set to ZEROFILL, all values will be prepended by zeros so that\nthe INT value contains a number of M digits. INTEGER is a synonym for INT.\n\nNote: If the ZEROFILL attribute has been specified, the column will\nautomatically become UNSIGNED.\n\nINT4 is a synonym for INT.\n\nFor details on the attributes, see Numeric Data Type Overview.\n\nExamples\n--------\n\nCREATE TABLE ints (a INT,b INT UNSIGNED,c INT ZEROFILL);\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO ints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO ints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO ints VALUES (-10,10,10);\n\nINSERT INTO ints VALUES (2147483648,2147483648,2147483648);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO ints VALUES (2147483647,2147483648,2147483648);\n\nSELECT * FROM ints;\n+------------+------------+------------+\n| a | b | c |\n+------------+------------+------------+\n| -10 | 10 | 0000000010 |\n| 2147483647 | 2147483648 | 2147483648 |\n+------------+------------+------------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO ints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.10 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO ints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO ints VALUES (-10,10,10);\n\nINSERT INTO ints VALUES (2147483648,2147483648,2147483648);\nQuery OK, 1 row affected, 1 warning (0.07 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO ints VALUES (2147483647,2147483648,2147483648);\n\nSELECT * FROM ints;\n+------------+------------+------------+\n| a | b | c |\n+------------+------------+------------+\n| -10 | 0 | 0000000000 |\n| -10 | 10 | 0000000000 |\n| -10 | 10 | 0000000010 |\n| 2147483647 | 2147483648 | 2147483648 |\n| 2147483647 | 2147483648 | 2147483648 |\n+------------+------------+------------+\n\nURL: https://mariadb.com/kb/en/int/','','https://mariadb.com/kb/en/int/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (262,23,'BIGINT','Syntax\n------\n\nBIGINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA large integer. The signed range is -9223372036854775808 to\n9223372036854775807. The unsigned range is 0 to 18446744073709551615.\n\nIf a column has been set to ZEROFILL, all values will be prepended by zeros so\nthat the BIGINT value contains a number of M digits.\n\nNote: If the ZEROFILL attribute has been specified, the column will\nautomatically become UNSIGNED.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nSERIAL is an alias for:\n\nBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE\n\nINT8 is a synonym for BIGINT.\n\nExamples\n--------\n\nCREATE TABLE bigints (a BIGINT,b BIGINT UNSIGNED,c BIGINT ZEROFILL);\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO bigints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO bigints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO bigints VALUES (-10,10,10);\n\nINSERT INTO bigints VALUES\n(9223372036854775808,9223372036854775808,9223372036854775808);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO bigints VALUES\n(9223372036854775807,9223372036854775808,9223372036854775808);\n\nSELECT * FROM bigints;\n+---------------------+---------------------+----------------------+\n| a | b | c |\n+---------------------+---------------------+----------------------+\n| -10 | 10 | 00000000000000000010 |\n| 9223372036854775807 | 9223372036854775808 | 09223372036854775808 |\n+---------------------+---------------------+----------------------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO bigints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.08 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO bigints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO bigints VALUES (-10,10,10);\n\nINSERT INTO bigints VALUES\n(9223372036854775808,9223372036854775808,9223372036854775808);\nQuery OK, 1 row affected, 1 warning (0.07 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO bigints VALUES\n(9223372036854775807,9223372036854775808,9223372036854775808);\n\nSELECT * FROM bigints;\n+---------------------+---------------------+----------------------+\n| a | b | c |\n+---------------------+---------------------+----------------------+\n| -10 | 0 | 00000000000000000000 |\n| -10 | 10 | 00000000000000000000 |\n| -10 | 10 | 00000000000000000010 |\n| 9223372036854775807 | 9223372036854775808 | 09223372036854775808 |\n| 9223372036854775807 | 9223372036854775808 | 09223372036854775808 |\n+---------------------+---------------------+----------------------+\n\nURL: https://mariadb.com/kb/en/bigint/','','https://mariadb.com/kb/en/bigint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (263,23,'DECIMAL','Syntax\n------\n\nDECIMAL[(M[,D])] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA packed \"exact\" fixed-point number. M is the total number of digits (the\nprecision) and D is the number of digits after the decimal point (the scale).\n\n* The decimal point and (for negative numbers) the \"-\" sign are not\ncounted in M. \n* If D is 0, values have no decimal point or fractional\npart and on INSERT the value will be rounded to the nearest DECIMAL. \n* The maximum number of digits (M) for DECIMAL is 65. \n* The maximum number of supported decimals (D) is 30 before MariadB 10.2.1 and\n38 afterwards. \n* If D is omitted, the default is 0. If M is omitted, the default is 10.\n\nUNSIGNED, if specified, disallows negative values.\n\nZEROFILL, if specified, pads the number with zeros, up to the total number of\ndigits specified by M.\n\nAll basic calculations (+, -, *, /) with DECIMAL columns are done with a\nprecision of 65 digits.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nDEC, NUMERIC and FIXED are synonyms, as well as NUMBER in Oracle mode from\nMariaDB 10.3.\n\nExamples\n--------\n\nCREATE TABLE t1 (d DECIMAL UNSIGNED ZEROFILL);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4.0),(5.2),(5.7);\nQuery OK, 6 rows affected, 2 warnings (0.16 sec)\nRecords: 6 Duplicates: 0 Warnings: 2\n\nNote (Code 1265): Data truncated for column \'d\' at row 5\nNote (Code 1265): Data truncated for column \'d\' at row 6\n\nSELECT * FROM t1;\n+------------+\n| d |\n+------------+\n| 0000000001 |\n| 0000000002 |\n| 0000000003 |\n| 0000000004 |\n| 0000000005 |\n| 0000000006 |\n+------------+\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO t1 VALUES (-7);\nERROR 1264 (22003): Out of range value for column \'d\' at row 1\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO t1 VALUES (-7);\nQuery OK, 1 row affected, 1 warning (0.02 sec)\nWarning (Code 1264): Out of range value for column \'d\' at row 1\n\nSELECT * FROM t1;\n+------------+\n| d |\n+------------+\n| 0000000001 |\n| 0000000002 |\n| 0000000003 |\n| 0000000004 |\n| 0000000005 |\n| 0000000006 |\n| 0000000000 |\n+------------+\n\nURL: https://mariadb.com/kb/en/decimal/','','https://mariadb.com/kb/en/decimal/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (264,23,'FLOAT','Syntax\n------\n\nFLOAT[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA small (single-precision) floating-point number (see DOUBLE for a\nregular-size floating point number). Allowable values are:\n\n* -3.402823466E+38 to -1.175494351E-38\n* 0\n* 1.175494351E-38 to 3.402823466E+38.\n\nThese are the theoretical limits, based on the IEEE standard. The actual range\nmight be slightly smaller depending on your hardware or operating system.\n\nM is the total number of digits and D is the number of digits following the\ndecimal point. If M and D are omitted, values are stored to the limits allowed\nby the hardware. A single-precision floating-point number is accurate to\napproximately 7 decimal places.\n\nUNSIGNED, if specified, disallows negative values.\n\nUsing FLOAT might give you some unexpected problems because all calculations\nin MariaDB are done with double precision. See Floating Point Accuracy.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nURL: https://mariadb.com/kb/en/float/','','https://mariadb.com/kb/en/float/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (265,23,'DOUBLE','Syntax\n------\n\nDOUBLE[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\nDOUBLE PRECISION[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\nREAL[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA normal-size (double-precision) floating-point number (see FLOAT for a\nsingle-precision floating-point number).\n\nAllowable values are:\n\n* -1.7976931348623157E+308 to -2.2250738585072014E-308\n* 0\n* 2.2250738585072014E-308 to 1.7976931348623157E+308\n\nThese are the theoretical limits, based on the IEEE standard. The actual range\nmight be slightly smaller depending on your hardware or operating system.\n\nM is the total number of digits and D is the number of digits following the\ndecimal point. If M and D are omitted, values are stored to the limits allowed\nby the hardware. A double-precision floating-point number is accurate to\napproximately 15 decimal places.\n\nUNSIGNED, if specified, disallows negative values.\n\nZEROFILL, if specified, pads the number with zeros, up to the total number of\ndigits specified by M.\n\nREAL and DOUBLE PRECISION are synonyms, unless the REAL_AS_FLOAT SQL mode is\nenabled, in which case REAL is a synonym for FLOAT rather than DOUBLE.\n\nSee Floating Point Accuracy for issues when using floating-point numbers.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nExamples\n--------\n\nCREATE TABLE t1 (d DOUBLE(5,0) zerofill);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4);\n\nSELECT * FROM t1;\n+-------+\n| d |\n+-------+\n| 00001 |\n| 00002 |\n| 00003 |\n| 00004 |\n+-------+\n\nURL: https://mariadb.com/kb/en/double/','','https://mariadb.com/kb/en/double/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (266,23,'BIT','Syntax\n------\n\nBIT[(M)]\n\nDescription\n-----------\n\nA bit-field type. M indicates the number of bits per value, from 1 to 64. The\ndefault is 1 if M is omitted.\n\nBit values can be inserted with b\'value\' notation, where value is the bit\nvalue in 0\'s and 1\'s.\n\nBit fields are automatically zero-padded from the left to the full length of\nthe bit, so for example in a BIT(4) field, \'10\' is equivalent to \'0010\'.\n\nBits are returned as binary, so to display them, either add 0, or use a\nfunction such as HEX, OCT or BIN to convert them.\n\nExamples\n--------\n\nCREATE TABLE b ( b1 BIT(8) );\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO b VALUES (b\'11111111\');\n\nINSERT INTO b VALUES (b\'01010101\');\n\nINSERT INTO b VALUES (b\'1111111111111\');\nERROR 1406 (22001): Data too long for column \'b1\' at row 1\n\nSELECT b1+0, HEX(b1), OCT(b1), BIN(b1) FROM b;\n+------+---------+---------+----------+\n| b1+0 | HEX(b1) | OCT(b1) | BIN(b1) |\n+------+---------+---------+----------+\n| 255 | FF | 377 | 11111111 |\n| 85 | 55 | 125 | 1010101 |\n+------+---------+---------+----------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO b VALUES (b\'11111111\'),(b\'01010101\'),(b\'1111111111111\');\nQuery OK, 3 rows affected, 1 warning (0.10 sec)\nRecords: 3 Duplicates: 0 Warnings: 1\n\nSHOW WARNINGS;\n+---------+------+---------------------------------------------+\n| Level | Code | Message |\n+---------+------+---------------------------------------------+\n| Warning | 1264 | Out of range value for column \'b1\' at row 3 |\n+---------+------+---------------------------------------------+\n\nSELECT b1+0, HEX(b1), OCT(b1), BIN(b1) FROM b;\n+------+---------+---------+----------+\n| b1+0 | HEX(b1) | OCT(b1) | BIN(b1) |\n+------+---------+---------+----------+\n| 255 | FF | 377 | 11111111 |\n| 85 | 55 | 125 | 1010101 |\n| 255 | FF | 377 | 11111111 |\n+------+---------+---------+----------+\n\nURL: https://mariadb.com/kb/en/bit/','','https://mariadb.com/kb/en/bit/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (267,23,'Floating-point Accuracy','Due to their nature, not all floating-point numbers can be stored with exact\nprecision. Hardware architecture, the CPU or even the compiler version and\noptimization level may affect the precision.\n\nIf you are comparing DOUBLEs or FLOATs with numeric decimals, it is not safe\nto use the equality operator.\n\nSometimes, changing a floating-point number from single-precision (FLOAT) to\ndouble-precision (DOUBLE) will fix the problem.\n\nExample\n-------\n\nf1, f2 and f3 have seemingly identical values across each row, but due to\nfloating point accuracy, the results may be unexpected.\n\nCREATE TABLE fpn (id INT, f1 FLOAT, f2 DOUBLE, f3 DECIMAL (10,3));\nINSERT INTO fpn VALUES (1,2,2,2),(2,0.1,0.1,0.1);\n\nSELECT * FROM fpn WHERE f1*f1 = f2*f2;\n+------+------+------+-------+\n| id | f1 | f2 | f3 |\n+------+------+------+-------+\n| 1 | 2 | 2 | 2.000 |\n+------+------+------+-------+\n\nThe reason why only one instead of two rows was returned becomes clear when we\nsee how the floating point squares were evaluated.\n\nSELECT f1*f1, f2*f2, f3*f3 FROM fpn;\n+----------------------+----------------------+----------+\n| f1*f1 | f2*f2 | f3*f3 |\n+----------------------+----------------------+----------+\n| 4 | 4 | 4.000000 |\n| 0.010000000298023226 | 0.010000000000000002 | 0.010000 |\n+----------------------+----------------------+----------+\n\nURL: https://mariadb.com/kb/en/floating-point-accuracy/','','https://mariadb.com/kb/en/floating-point-accuracy/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (268,23,'BINARY','This page describes the BINARY data type. For details about the operator, see\nBinary Operator.\n\nSyntax\n------\n\nBINARY(M)\n\nDescription\n-----------\n\nThe BINARY type is similar to the CHAR type, but stores binary byte strings\nrather than non-binary character strings. M represents the column length in\nbytes.\n\nIt contains no character set, and comparison and sorting are based on the\nnumeric value of the bytes.\n\nIf the maximum length is exceeded, and SQL strict mode is not enabled , the\nextra characters will be dropped with a warning. If strict mode is enabled, an\nerror will occur.\n\nBINARY values are right-padded with 0x00 (the zero byte) to the specified\nlength when inserted. The padding is not removed on select, so this needs to\nbe taken into account when sorting and comparing, where all bytes are\nsignificant. The zero byte, 0x00 is less than a space for comparison purposes.\n\nExamples\n--------\n\nInserting too many characters, first with strict mode off, then with it on:\n\nCREATE TABLE bins (a BINARY(10));\n\nINSERT INTO bins VALUES(\'12345678901\');\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n\nSELECT * FROM bins;\n+------------+\n| a |\n+------------+\n| 1234567890 |\n+------------+\n\nSET sql_mode=\'STRICT_ALL_TABLES\';\n\nINSERT INTO bins VALUES(\'12345678901\');\nERROR 1406 (22001): Data too long for column \'a\' at row 1\n\nSorting is performed with the byte value:\n\nTRUNCATE bins;\n\nINSERT INTO bins VALUES(\'A\'),(\'B\'),(\'a\'),(\'b\');\n\nSELECT * FROM bins ORDER BY a;\n+------+\n| a |\n+------+\n| A |\n| B |\n| a |\n| b |\n+------+\n\nUsing CAST to sort as a CHAR instead:\n\nSELECT * FROM bins ORDER BY CAST(a AS CHAR);\n+------+\n| a |\n+------+\n| a |\n| A |\n| b |\n| B |\n+------+\n\nThe field is a BINARY(10), so padding of two \'\\0\'s are inserted, causing\ncomparisons that don\'t take this into account to fail:\n\nTRUNCATE bins;\n\nINSERT INTO bins VALUES(\'12345678\');\n\nSELECT a = \'12345678\', a = \'12345678\\0\\0\' from bins;\n+----------------+--------------------+\n| a = \'12345678\' | a = \'12345678\\0\\0\' |\n+----------------+--------------------+\n| 0 | 1 |\n+----------------+--------------------+\n\nURL: https://mariadb.com/kb/en/binary/','','https://mariadb.com/kb/en/binary/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (269,23,'BLOB','Syntax\n------\n\nBLOB[(M)]\n\nDescription\n-----------\n\nA BLOB column with a maximum length of 65,535 (216 - 1) bytes. Each BLOB value\nis stored using a two-byte length prefix that indicates the number of bytes in\nthe value.\n\nAn optional length M can be given for this type. If this is done, MariaDB\ncreates the column as the smallest BLOB type large enough to hold values M\nbytes long.\n\nBLOBS can also be used to store dynamic columns.\n\nBefore MariaDB 10.2.1, BLOB and TEXT columns could not be assigned a DEFAULT\nvalue. This restriction was lifted in MariaDB 10.2.1.\n\nIndexing\n--------\n\nMariaDB starting with 10.4\n--------------------------\nFrom MariaDB 10.4, it is possible to set a unique index on a column that uses\nthe BLOB data type. In previous releases this was not possible, as the index\nwould only guarantee the uniqueness of a fixed number of characters.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, BLOB is a synonym for LONGBLOB.\n\nURL: https://mariadb.com/kb/en/blob/','','https://mariadb.com/kb/en/blob/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (270,23,'BLOB and TEXT Data Types','Description\n-----------\n\nA BLOB is a binary large object that can hold a variable amount of data. The\nfour BLOB types are\n\n* TINYBLOB,\n* BLOB, \n* MEDIUMBLOB, and\n* LONGBLOB.\n\nThese differ only in the maximum length of the values they can hold.\n\nThe TEXT types are\n\n* TINYTEXT,\n* TEXT,\n* MEDIUMTEXT, and\n* LONGTEXT.\n* JSON (alias for LONGTEXT)\n\nThese correspond to the four BLOB types and have the same maximum lengths and\nstorage requirements.\n\nMariaDB starting with 10.2.1\n----------------------------\nStarting from MariaDB 10.2.1, BLOB and TEXT columns can have a DEFAULT value.\n\nMariaDB starting with 10.4.3\n----------------------------\nFrom MariaDB 10.4, it is possible to set a unique index on columns that use\nthe BLOB or TEXT data types.\n\nURL: https://mariadb.com/kb/en/blob-and-text-data-types/','','https://mariadb.com/kb/en/blob-and-text-data-types/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (271,23,'CHAR','This article covers the CHAR data type. See CHAR Function for the function.\n\nSyntax\n------\n\n[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA fixed-length string that is always right-padded with spaces to the specified\nlength when stored. M represents the column length in characters. The range of\nM is 0 to 255. If M is omitted, the length is 1.\n\nCHAR(0) columns can contain 2 values: an empty string or NULL. Such columns\ncannot be part of an index. The CONNECT storage engine does not support\nCHAR(0).\n\nNote: Trailing spaces are removed when CHAR values are retrieved unless the\nPAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.\n\nBefore MariaDB 10.2, all collations were of type PADSPACE, meaning that CHAR\n(as well as VARCHAR and TEXT) values are compared without regard for trailing\nspaces. This does not apply to the LIKE pattern-matching operator, which takes\ninto account trailing spaces.\n\nIf a unique index consists of a column where trailing pad characters are\nstripped or ignored, inserts into that column where values differ only by the\nnumber of trailing pad characters will result in a duplicate-key error.\n\nExamples\n--------\n\nTrailing spaces:\n\nCREATE TABLE strtest (c CHAR(10));\nINSERT INTO strtest VALUES(\'Maria \');\n\nSELECT c=\'Maria\',c=\'Maria \' FROM strtest;\n+-----------+--------------+\n| c=\'Maria\' | c=\'Maria \' |\n+-----------+--------------+\n| 1 | 1 |\n+-----------+--------------+\n\nSELECT c LIKE \'Maria\',c LIKE \'Maria \' FROM strtest;\n+----------------+-------------------+\n| c LIKE \'Maria\' | c LIKE \'Maria \' |\n+----------------+-------------------+\n| 1 | 0 |\n+----------------+-------------------+\n\nNO PAD Collations\n-----------------\n\nNO PAD collations regard trailing spaces as normal characters. You can get a\nlist of all NO PAD collations by querying the Information Schema Collations\ntable, for example:\n\nSELECT collation_name FROM information_schema.collations \n WHERE collation_name LIKE \"%nopad%\";\n+------------------------------+\n| collation_name |\n+------------------------------+\n| big5_chinese_nopad_ci |\n| big5_nopad_bin |\n...\n\nURL: https://mariadb.com/kb/en/char/','','https://mariadb.com/kb/en/char/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (272,23,'CHAR BYTE','Description\n-----------\n\nThe CHAR BYTE data type is an alias for the BINARY data type. This is a\ncompatibility feature.\n\nURL: https://mariadb.com/kb/en/char-byte/','','https://mariadb.com/kb/en/char-byte/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (273,23,'ENUM','Syntax\n------\n\nENUM(\'value1\',\'value2\',...) [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n\nDescription\n-----------\n\nAn enumeration. A string object that can have only one value, chosen from the\nlist of values \'value1\', \'value2\', ..., NULL or the special \'\' error value. In\ntheory, an ENUM column can have a maximum of 65,535 distinct values; in\npractice, the real maximum depends on many factors. ENUM values are\nrepresented internally as integers.\n\nTrailing spaces are automatically stripped from ENUM values on table creation.\n\nENUMs require relatively little storage space compared to strings, either one\nor two bytes depending on the number of enumeration values.\n\nNULL and empty values\n---------------------\n\nAn ENUM can also contain NULL and empty values. If the ENUM column is declared\nto permit NULL values, NULL becomes a valid value, as well as the default\nvalue (see below). If strict SQL Mode is not enabled, and an invalid value is\ninserted into an ENUM, a special empty string, with an index value of zero\n(see Numeric index, below), is inserted, with a warning. This may be\nconfusing, because the empty string is also a possible value, and the only\ndifference if that is this case its index is not 0. Inserting will fail with\nan error if strict mode is active.\n\nIf a DEFAULT clause is missing, the default value will be:\n\n* NULL if the column is nullable;\n* otherwise, the first value in the enumeration.\n\nNumeric index\n-------------\n\nENUM values are indexed numerically in the order they are defined, and sorting\nwill be performed in this numeric order. We suggest not using ENUM to store\nnumerals, as there is little to no storage space benefit, and it is easy to\nconfuse the enum integer with the enum numeral value by leaving out the quotes.\n\nAn ENUM defined as ENUM(\'apple\',\'orange\',\'pear\') would have the following\nindex values:\n\n+--------------------------------------+--------------------------------------+\n| Index | Value |\n+--------------------------------------+--------------------------------------+\n| NULL | NULL |\n+--------------------------------------+--------------------------------------+\n| 0 | \'\' |\n+--------------------------------------+--------------------------------------+\n| 1 | \'apple\' |\n+--------------------------------------+--------------------------------------+\n| 2 | \'orange\' |\n+--------------------------------------+--------------------------------------+\n| 3 | \'pear\' |\n+--------------------------------------+--------------------------------------+\n\nExamples\n--------\n\nCREATE TABLE fruits (\n id INT NOT NULL auto_increment PRIMARY KEY,\n fruit ENUM(\'apple\',\'orange\',\'pear\'),\n bushels INT);\n\nDESCRIBE fruits;\n+---------+-------------------------------+------+-----+---------+-------------\n--+\n| Field | Type | Null | Key | Default | Extra \n |\n+---------+-------------------------------+------+-----+---------+-------------\n--+\n| id | int(11) | NO | PRI | NULL |\nauto_increment |\n| fruit | enum(\'apple\',\'orange\',\'pear\') | YES | | NULL | \n |\n| bushels | int(11) | YES | | NULL | \n |\n+---------+-------------------------------+------+-----+---------+-------------\n--+\n\nINSERT INTO fruits\n (fruit,bushels) VALUES\n (\'pear\',20),\n (\'apple\',100),\n (\'orange\',25);\n\nINSERT INTO fruits\n (fruit,bushels) VALUES\n (\'avocado\',10);\nERROR 1265 (01000): Data truncated for column \'fruit\' at row 1\n\nSELECT * FROM fruits;\n+----+--------+---------+\n| id | fruit | bushels |\n+----+--------+---------+\n| 1 | pear | 20 |\n| 2 | apple | 100 |\n| 3 | orange | 25 |\n+----+--------+---------+\n\nSelecting by numeric index:\n\nSELECT * FROM fruits WHERE fruit=2;\n+----+--------+---------+\n| id | fruit | bushels |\n+----+--------+---------+\n| 3 | orange | 25 |\n+----+--------+---------+\n\nSorting is according to the index value:\n\nCREATE TABLE enums (a ENUM(\'2\',\'1\'));\n\nINSERT INTO enums VALUES (\'1\'),(\'2\');\n\nSELECT * FROM enums ORDER BY a ASC;\n+------+\n| a |\n+------+\n| 2 |\n| 1 |\n+------+\n\nIt\'s easy to get confused between returning the enum integer with the stored\nvalue, so we don\'t suggest using ENUM to store numerals. The first example\nreturns the 1st indexed field (\'2\' has an index value of 1, as it\'s defined\nfirst), while the second example returns the string value \'1\'.\n\nSELECT * FROM enums WHERE a=1;\n+------+\n| a |\n+------+\n| 2 |\n+------+\n\nSELECT * FROM enums WHERE a=\'1\';\n+------+\n| a |\n+------+\n| 1 |\n+------+\n\nURL: https://mariadb.com/kb/en/enum/','','https://mariadb.com/kb/en/enum/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (274,23,'INET6','MariaDB starting with 10.5.0\n----------------------------\nThe INET6 data type was added in MariaDB 10.5.0\n\nSyntax\n------\n\nINET6\n\nDescription\n-----------\n\nThe INET6 data type is intended for storage of IPv6 addresses, as well as IPv4\naddresses assuming conventional mapping of IPv4 addresses into IPv6 addresses.\n\nBoth short and long IPv6 notation are permitted, according to RFC-5952.\n\n* Values are stored as a 16-byte fixed length binary string, with most\nsignificant byte first.\n* Storage engines see INET6 as BINARY(16).\n* Clients see INET6 as CHAR(39) and get text representation on retrieval.\n\nThe IPv4-compatible notation is considered as deprecated. It is supported for\ncompatibility with the INET6_ATON function, which also understands this\nformat. It\'s recommended to use the mapped format to store IPv4 addresses in\nINET6.\n\nWhen an IPv4 mapped (or compatible) value is stored in INET6, it still\noccupies 16 bytes:\n\nRetrieval\n---------\n\nOn retrieval, in the client-server text protocol, INET6 values are converted\nto the short text representation, according to RFC-5952, that is with all\nleading zeroes in each group removed and with consequent zero groups\ncompressed.\n\nBesides creating one\'s own stored function, there is no a way to retrieve an\nINET6 value using long text representation.\n\nCasting\n-------\n\n* CAST from a character string to INET6 understands addresses in short or long\ntext notation (including IPv4 mapped and compatible addresses). NULL is\nreturned if the format is not understood.\n* CAST from a binary string to INET6 requires a 16-byte string as an argument.\nNULL is returned if the argument length is not equal to 16.\n* CAST from other data types to INET6 first converts data to a character\nstring, then CAST from character string to INET6 is applied.\n* CAST from INET6 to CHAR returns short text address notation.\n* CAST from INET6 to BINARY returns its 16-byte binary string representation.\n* CAST from INET6 to data types other than CHAR (e.g. SIGNED, UNSIGNED, TIME,\netc) returns an error.\n\nComparisons\n-----------\n\nAn INET6 expression can be compared to:\n\n* another INET6 expression\n* a character string expression with a text (short or long) address\nrepresentation:\n* a 16-byte binary string expression:\n\nAttempting to compare INET6 to an expression of any other data type returns an\nerror.\n\nMixing INET6 Values for Result\n------------------------------\n\nAn INET6 expression can be mixed for result (i.e. UNION, CASE..THEN, COALESCE\netc) with:\n\n* another INET6 expression. The resulting data type is INET6.\n* a character string in text (short or long) address representation. The\nresult data type is INET6. The character string counterpart is automatically\nconverted to INET6. If the string format is not understood, it\'s converted\nwith a warning to either NULL or to \'::\', depending on the NULL-ability of the\nresult.\n* a 16-byte binary string. The resulting data type is INET6. The binary string\ncounterpart is automatically converted to INET6. If the length of the binary\nstring is not equal to 16, it\'s converted with a warning to NULL or to \'::\'\ndepending on the NULL-ability of the result.\n\nAttempts to mix INET6 for result with other data types will return an error.\n\nMixing INET6 with other data types for LEAST and GREATEST, when mixing for\ncomparison and mixing for result are involved at the same time, uses the same\nrules with mixing for result, described in the previous paragraphs.\n\nFunctions and Operators\n-----------------------\n\n* HEX() with an INET6 argument returns a hexadecimal representation of the\nunderlying 16-byte binary string\n* Arithmetic operators (+,-,*,/,MOD,DIV) are not supported for INET6. This may\nchange in the future.\n* The INET6_ATON function now understands INET6 values as an argument\n* The prototypes of the IS_IPV4_COMPAT and IS_IPV4_MAPPED functions have\nchanged from a BINARY(16) to a INET6,\n* When the argument for these two functions is not INET6, automatic implicit\nCAST to INET6 is applied. As a consequence, both functions now understand\narguments in both text representation and binary(16) representation. Before\nMariaDB 10.5.0, these functions understood only binary(16) representation.\n\nPrepared Statement Parameters\n-----------------------------\n\nINET6 understands both text and binary(16) address representation in prepared\nstatement parameters (PREPARE..EXECUTE and EXECUTE IMMEDIATE statements).\n\nMigration between BINARY(16) and INET6\n---------------------------------------\n\nBefore MariaDB 10.5.0, you may have used BINARY(16) as a storage for IPv6\ninternet addresses, in combination with INET6_ATON and INET6_NTOA to\nrespectively insert and retrieve data.\n\nFrom 10.5, you can ALTER BINARY(16) columns storing IPv6 addresses to INET6.\nAfter such an alter, there is no a need to use INET6_ATON() and INET6_NTOA().\nAddresses can be inserted and retrieved directly.\n\nIt is also possible to convert INET6 columns to BINARY(16) and continue using\nthe data in combination with INET6_NTOA() and INET6_ATON().\n\nExamples\n--------\n\nCREATE TABLE t1 (a INET6);\n\nInserting using short text address notation:\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n\nLong text address notation:\n\nINSERT INTO t1 VALUES (\'2001:0db8:0000:0000:0000:ff00:0042:8329\');\n\n16-byte binary string notation:\n\nINSERT INTO t1 VALUES (0x20010DB8000000000000FF0000428329);\nINSERT INTO t1 VALUES (UNHEX(\'20010DB8000000000000FF0000428329\'));\n\nIPv4 addresses, using IPv4-mapped and IPv4-compatible notations:\n\nINSERT INTO t1 VALUES (\'::ffff:192.0.2.128\'); -- mapped\nINSERT INTO t1 VALUES (\'::192.0.2.128\'); -- compatible\n\nSELECT * FROM t1;\n+------------------------+\n| a |\n+------------------------+\n| 2001:db8::ff00:42:8329 |\n| 2001:db8::ff00:42:8329 |\n| 2001:db8::ff00:42:8329 |\n| 2001:db8::ff00:42:8329 |\n| ::ffff:192.0.2.128 |\n| ::192.0.2.128 |\n+------------------------+\n\nIPv4 mapped (or compatible) values still occupy 16 bytes:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'::ffff:192.0.2.128\');\n\nSELECT * FROM t1;\n+--------------------+\n| a |\n+--------------------+\n| ::ffff:192.0.2.128 |\n+--------------------+\n\nSELECT HEX(a) FROM t1;\n+----------------------------------+\n| HEX(a) |\n+----------------------------------+\n| 00000000000000000000FFFFC0000280 |\n+----------------------------------+\n\nCasting from INET6 to anything other than CHAR returns an error:\n\nSELECT CAST(a AS DECIMAL) FROM t1;\n\nERROR 4079 (HY000): Illegal parameter data type inet6 for operation\n\'decimal_typecast\'\n\nComparison Examples\n-------------------\n\nComparison with another INET6 expression:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n CREATE OR REPLACE TABLE t2 (a INET6);\n\nINSERT INTO t1 VALUES\n(\'2001:db8::ff00:42:8328\'),(\'2001:db8::ff00:42:8329\');\n INSERT INTO t2 VALUES\n(\'2001:db8::ff00:42:832a\'),(\'2001:db8::ff00:42:8329\');\n\nSELECT t1.* FROM t1,t2 WHERE t1.a=t2.a;\n +------------------------+\n | a |\n +------------------------+\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nWith a character string expression with a text (short or long) address\nrepresentation:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n\nSELECT * FROM t1 WHERE a=\'2001:db8::ff00:42:8329\';\n +------------------------+\n | a |\n +------------------------+\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nWith a 16-byte binary string expression:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n\nSELECT * FROM t1 WHERE a=X\'20010DB8000000000000FF0000428329\';\n +------------------------+\n | a |\n +------------------------+\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nWith an expression of another data type:\n\nSELECT * FROM t1 WHERE a=1;\nERROR 4078 (HY000): Illegal parameter data types inet6 and int for operation\n\'=\'\n\nMixing for Result Examples\n--------------------------\n\nMixed with another INET6 expression, returning an INET6 data type:\n\nCREATE OR REPLACE TABLE t1 (a INET6, b INET6);\n\nINSERT INTO t1 VALUES (NULL,\'2001:db8::ff00:42:8329\');\n\nSELECT a FROM t1 UNION SELECT b FROM t1;\n +------------------------+\n | a |\n +------------------------+\n | NULL |\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nSELECT COALESCE(a, b) FROM t1;\n +------------------------+\n | COALESCE(a, b) |\n +------------------------+\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nMixed with a character string in text (short or long) address representation:\n\nCREATE OR REPLACE TABLE t1 (a INET6, b VARCHAR(64));\n\nINSERT INTO t1 VALUES (NULL,\'2001:db8::ff00:42:8328\');\n\nINSERT INTO t1 VALUES (NULL,\'2001:db8::ff00:42:832a garbage\');\n\nSELECT COALESCE(a,b) FROM t1;\n +------------------------+\n | COALESCE(a,b) |\n +------------------------+\n | 2001:db8::ff00:42:8328 |\n | NULL |\n +------------------------+\n 2 rows in set, 1 warning (0.001 sec)\n\nSHOW WARNINGS;\n\n+---------+------+---------------------------------------------------------+\n | Level | Code | Message\n|\n\n+---------+------+---------------------------------------------------------+\n | Warning | 1292 | Incorrect inet6 value: \'2001:db8::ff00:42:832a garbage\'\n|\n\n+---------+------+---------------------------------------------------------+\n\nMixed with a 16-byte binary string:\n\nCREATE OR REPLACE TABLE t1 (a INET6, b VARBINARY(16));\n\nINSERT INTO t1 VALUES (NULL,CONCAT(0xFFFF,REPEAT(0x0000,6),0xFFFF));\n\nINSERT INTO t1 VALUES (NULL,0x00/*garbage*/);\n\nSELECT COALESCE(a,b) FROM t1;\n +---------------+\n | COALESCE(a,b) |\n +---------------+\n | ffff::ffff |\n | NULL |\n +---------------+\n 2 rows in set, 1 warning (0.001 sec)\n\nSHOW WARNINGS;\n +---------+------+-------------------------------+\n | Level | Code | Message |\n +---------+------+-------------------------------+\n | Warning | 1292 | Incorrect inet6 value: \'\\x00\' |\n +---------+------+-------------------------------+\n\nMixing with other data types:\n\nSELECT CAST(\'ffff::ffff\' AS INET6) UNION SELECT 1;\nERROR 4078 (HY000): Illegal parameter data types inet6 and int for operation\n\'UNION\'\n\nFunctions and Operators Examples\n--------------------------------\n\nHEX with an INET6 argument returning a hexadecimal representation:\n\nSELECT HEX(CAST(\'2001:db8::ff00:42:8329\' AS INET6));\n +----------------------------------------------+\n | HEX(CAST(\'2001:db8::ff00:42:8329\' AS INET6)) |\n +----------------------------------------------+\n | 20010DB8000000000000FF0000428329 |\n +----------------------------------------------+\n\nINET6_ATON now understands INET6 values as an argument:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n\nSELECT a, HEX(INET6_ATON(a)) FROM t1;\n +------------------------+----------------------------------+\n | a | HEX(INET6_ATON(a)) |\n +------------------------+----------------------------------+\n | 2001:db8::ff00:42:8329 | 20010DB8000000000000FF0000428329 |\n +------------------------+----------------------------------+\n\nIS_IPV4_COMPAT and IS_IPV4_MAPPED prototype now a BINARY(16)):\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n INSERT INTO t1 VALUES (\'::ffff:192.168.0.1\');\n INSERT INTO t1 VALUES (\'::192.168.0.1\');\n\nSELECT a, IS_IPV4_MAPPED(a), IS_IPV4_COMPAT(a) FROM t1;\n +------------------------+-------------------+-------------------+\n | a | IS_IPV4_MAPPED(a) | IS_IPV4_COMPAT(a) |\n +------------------------+-------------------+-------------------+\n | 2001:db8::ff00:42:8329 | 0 | 0 |\n | ::ffff:192.168.0.1 | 1 | 0 |\n | ::192.168.0.1 | 0 | 1 |\n +------------------------+-------------------+-------------------+\n\nAutomatic implicit CAST to INET6:\n\nCREATE OR REPLACE TABLE t1 (\n a INET6,\n b VARCHAR(39) DEFAULT a\n );\n\nINSERT INTO t1 (a) VALUES (\'ffff::ffff\'),(\'::ffff:192.168.0.1\');\n\nSELECT a, IS_IPV4_MAPPED(a), b, IS_IPV4_MAPPED(b) FROM t1;\n\n+--------------------+-------------------+--------------------+----------------\n--+\n | a | IS_IPV4_MAPPED(a) | b |\nIS_IPV4_MAPPED(b) |\n\n+--------------------+-------------------+--------------------+----------------\n--+\n | ffff::ffff | 0 | ffff::ffff |\n 0 |\n | ::ffff:192.168.0.1 | 1 | ::ffff:192.168.0.1 |\n 1 |\n\n+--------------------+-------------------+--------------------+----------------\n--+\n\nCREATE OR REPLACE TABLE t1 (\n a INET6,\n b BINARY(16) DEFAULT UNHEX(HEX(a))\n );\n\nINSERT INTO t1 (a) VALUES (\'ffff::ffff\'),(\'::ffff:192.168.0.1\');\n\nSELECT a, IS_IPV4_MAPPED(a), HEX(b), IS_IPV4_MAPPED(b) FROM t1;\n\n+--------------------+-------------------+----------------------------------+--\n----------------+\n | a | IS_IPV4_MAPPED(a) | HEX(b)\n | IS_IPV4_MAPPED(b) |\n\n+--------------------+-------------------+----------------------------------+--\n----------------+\n | ffff::ffff | 0 |\nFFFF000000000000000000000000FFFF | 0 |\n | ::ffff:192.168.0.1 | 1 |\n00000000000000000000FFFFC0A80001 | 1 |\n\n+--------------------+-------------------+----------------------------------+--\n----------------+\n\nPrepared Statement Parameters Examples\n--------------------------------------\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nEXECUTE IMMEDIATE \'INSERT INTO t1 VALUES (?)\' USING \'ffff::fffe\';\nEXECUTE IMMEDIATE \'INSERT INTO t1 VALUES (?)\' USING\nX\'FFFF000000000000000000000000FFFF\';\n\nSELECT * FROM t1;\n+------------+\n| a |\n+------------+\n| ffff::fffe |\n| ffff::ffff |\n+------------+\n\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING \'ffff::fffe\';\n+------------+\n| a |\n+------------+\n| ffff::fffe |\n+------------+\n\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING','','https://mariadb.com/kb/en/inet6/');
-update help_topic set description = CONCAT(description, '\nX\'FFFF000000000000000000000000FFFF\';\n+------------+\n| a |\n+------------+\n| ffff::ffff |\n+------------+\n\nMigration between BINARY(16) and INET6 Examples\n-----------------------------------------------\n\nBefore MariaDB 10.5:\n\nCREATE OR REPLACE TABLE t1 (a BINARY(16));\n\nINSERT INTO t1 VALUES (INET6_ATON(\'ffff::ffff\'));\n\nSELECT INET6_NTOA(a) FROM t1;\n+---------------+\n| INET6_NTOA(a) |\n+---------------+\n| ffff::ffff |\n+---------------+\n\nMigrating to INET6, from MariaDB 10.5:\n\nALTER TABLE t1 MODIFY a INET6;\n\nINSERT INTO t1 VALUES (\'ffff::fffe\');\n\nSELECT * FROM t1;\n+------------+\n| a |\n+------------+\n| ffff::ffff |\n| ffff::fffe |\n+------------+\n\nMigration from INET6 to BINARY(16):\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\nINSERT INTO t1 VALUES (\'::ffff:192.168.0.1\');\nINSERT INTO t1 VALUES (\'::192.168.0.1\');\n\nALTER TABLE t1 MODIFY a BINARY(16);\n\nSELECT INET6_NTOA(a) FROM t1;\n+------------------------+\n| INET6_NTOA(a) |\n+------------------------+\n| 2001:db8::ff00:42:8329 |\n| ::ffff:192.168.0.1 |\n| ::192.168.0.1 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/inet6/') WHERE help_topic_id = 274;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (275,23,'JSON Data Type','MariaDB starting with 10.2.7\n----------------------------\nThe JSON alias was added in MariaDB 10.2.7. This was done to make it possible\nto use JSON columns in statement based replication from MySQL to MariaDB and\nto make it possible for MariaDB to read mysqldumps from MySQL.\n\nJSON is an alias for LONGTEXT introduced for compatibility reasons with\nMySQL\'s JSON data type. MariaDB implements this as a LONGTEXT rather, as the\nJSON data type contradicts the SQL standard, and MariaDB\'s benchmarks indicate\nthat performance is at least equivalent.\n\nIn order to ensure that a a valid json document is inserted, the JSON_VALID\nfunction can be used as a CHECK constraint. This constraint is automatically\nincluded for types using the JSON alias from MariaDB 10.4.3.\n\nExamples\n--------\n\nCREATE TABLE t (j JSON);\n\nDESC t;\n+-------+----------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+----------+------+-----+---------+-------+\n| j | longtext | YES | | NULL | |\n+-------+----------+------+-----+---------+-------+\n\nWith validation:\n\nCREATE TABLE t2 (\n j JSON\n CHECK (JSON_VALID(j))\n);\n\nINSERT INTO t2 VALUES (\'invalid\');\nERROR 4025 (23000): CONSTRAINT `j` failed for `test`.`t2`\n\nINSERT INTO t2 VALUES (\'{\"id\": 1, \"name\": \"Monty\"}\');\nQuery OK, 1 row affected (0.13 sec)\n\nReplicating JSON Data Between MySQL and MariaDB\n-----------------------------------------------\n\nThe JSON type in MySQL stores the JSON object in a compact form, not as\nLONGTEXT as in MariaDB. This means that row based replication will not work\nfor JSON types from MySQL to MariaDB.\n\nThere are a a few different ways to solve this:\n\n* Use statement based replication.\n* Change the JSON column to type TEXT in MySQL\n* If you must use row-based replication and cannot change the MySQL master\nfrom JSON to TEXT, you can try to introduce an intermediate MySQL slave and\nchange the column type from JSON to TEXT on it. Then you replicate from this\nintermediate slave to MariaDB.\n\nConverting a MySQL TABLE with JSON Fields to MariaDB\n----------------------------------------------------\n\nMariaDB can\'t directly access MySQL\'s JSON format.\n\nThere are a a few different ways to move the table to MariaDB:\n\n* From MariaDB 10.5.7, see the you can use the mysql_json plugin. See Making\nMariaDB understand MySQL JSON.\n* Change the JSON column to type TEXT in MySQL. After this, MariaDB can\ndirectly use the table without any need for a dump and restore.\n* Use mariadb-dump/mysqldump to copy the table.\n\nDifferences Between MySQL JSON Strings and MariaDB JSON Strings\n---------------------------------------------------------------\n\n* In MySQL, JSON is an object and is compared according to json values. In\nMariaDB JSON strings are normal strings and compared as strings. One exception\nis when using JSON_EXTRACT() in which case strings are unescaped before\ncomparison.\n\nURL: https://mariadb.com/kb/en/json-data-type/','','https://mariadb.com/kb/en/json-data-type/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (276,23,'MEDIUMBLOB','Syntax\n------\n\nMEDIUMBLOB\n\nDescription\n-----------\n\nA BLOB column with a maximum length of 16,777,215 (224 - 1) bytes. Each\nMEDIUMBLOB value is stored using a three-byte length prefix that indicates the\nnumber of bytes in the value.\n\nURL: https://mariadb.com/kb/en/mediumblob/','','https://mariadb.com/kb/en/mediumblob/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (277,23,'MEDIUMTEXT','Syntax\n------\n\nMEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA TEXT column with a maximum length of 16,777,215 (224 - 1) characters. The\neffective maximum length is less if the value contains multi-byte characters.\nEach MEDIUMTEXT value is stored using a three-byte length prefix that\nindicates the number of bytes in the value.\n\nURL: https://mariadb.com/kb/en/mediumtext/','','https://mariadb.com/kb/en/mediumtext/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (278,23,'LONGBLOB','Syntax\n------\n\nLONGBLOB\n\nDescription\n-----------\n\nA BLOB column with a maximum length of 4,294,967,295 bytes or 4GB (232 - 1).\nThe effective maximum length of LONGBLOB columns depends on the configured\nmaximum packet size in the client/server protocol and available memory. Each\nLONGBLOB value is stored using a four-byte length prefix that indicates the\nnumber of bytes in the value.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, BLOB is a synonym for LONGBLOB.\n\nURL: https://mariadb.com/kb/en/longblob/','','https://mariadb.com/kb/en/longblob/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (279,23,'LONGTEXT','Syntax\n------\n\nLONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA TEXT column with a maximum length of 4,294,967,295 or 4GB (232 - 1)\ncharacters. The effective maximum length is less if the value contains\nmulti-byte characters. The effective maximum length of LONGTEXT columns also\ndepends on the configured maximum packet size in the client/server protocol\nand available memory. Each LONGTEXT value is stored using a four-byte length\nprefix that indicates the number of bytes in the value.\n\nFrom MariaDB 10.2.7, JSON is an alias for LONGTEXT. See JSON Data Type for\ndetails.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, CLOB is a synonym for LONGTEXT.\n\nURL: https://mariadb.com/kb/en/longtext/','','https://mariadb.com/kb/en/longtext/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (280,23,'ROW','MariaDB starting with 10.3.0\n----------------------------\nThe ROW data type was introduced in MariaDB 10.3.0.\n\nSyntax\n------\n\nROW (<field name> <data type> [{, <field name> <data type>}... ])\n\nDescription\n-----------\n\nROW is a data type for stored procedure variables.\n\nFeatures\n--------\n\nROW fields as normal variables\n------------------------------\n\nROW fields (members) act as normal variables, and are able to appear in all\nquery parts where a stored procedure variable is allowed:\n\n* Assignment is using the := operator and the SET command:\n\na.x:= 10;\na.x:= b.x;\nSET a.x= 10, a.y=20, a.z= b.z;\n\n* Passing to functions and operators:\n\nSELECT f1(rec.a), rec.a<10;\n\n* Clauses (select list, WHERE, HAVING, LIMIT, etc...,):\n\nSELECT var.a, t1.b FROM t1 WHERE t1.b=var.b LIMIT var.c;\n\n* INSERT values:\n\nINSERT INTO t1 VALUES (rec.a, rec.b, rec.c);\n\n* SELECT .. INTO targets\n\nSELECT a,b INTO rec.a, rec.b FROM t1 WHERE t1.id=10;\n\n* Dynamic SQL out parameters (EXECUTE and EXECUTE IMMEDIATE)\n\nEXECUTE IMMEDIATE \'CALL proc_with_out_param(?)\' USING rec.a;\n\nROW type variables as FETCH targets\n-----------------------------------\n\nROW type variables are allowed as FETCH targets:\n\nFETCH cur INTO rec;\n\nwhere cur is a CURSOR and rec is a ROW type stored procedure variable.\n\nNote, currently an attempt to use FETCH for a ROW type variable returns this\nerror:\n\nERROR 1328 (HY000): Incorrect number of FETCH variables\n\nFETCH from a cursor cur into a ROW variable rec works as follows:\n\n* The number of fields in cur must match the number of fields in rec.\n Otherwise, an error is reported.\n\n* Assignment is done from left to right. The first cursor field is assigned to\n the first variable field, the second cursor field is assigned to the second\n variable field, etc.\n\n* Field names in rec are not important and can differ from field names\n in cur.\n\nSee FETCH Examples (below) for examples of using this with sql_mode=ORACLE and\nsql_mode=DEFAULT.\n\nROW type variables as SELECT...INTO targets\n-------------------------------------------\n\nROW type variables are allowed as SELECT..INTO targets with some differences\ndepending on which sql_mode is in use.\n\n* When using sql_mode=ORACLE, table%ROWTYPE and cursor%ROWTYPE\n variables can be used as SELECT...INTO targets.\n\n* Using multiple ROW variables in the SELECT..INTO list will report an\n error.\n\n* Using ROW variables with a different column count than in\n the SELECT..INTO list will report an error.\n\nSee SELECT...INTO Examples (below) for examples of using this with\nsql_mode=ORACLE and sql_mode=DEFAULT.\n\nFeatures not implemented\n------------------------\n\nThe following features are planned, but not implemented yet:\n\n* Returning a ROW type expression from a stored function (see MDEV-12252).\nThis will need some grammar change to support field names after parentheses:\n\nSELECT f1().x FROM DUAL;\n\n* Returning a ROW type expression from a built-in hybrid type function, such\nas CASE, IF, etc. \n* ROW of ROWs\n\nExamples\n--------\n\nDeclaring a ROW in a stored procedure\n-------------------------------------\n\nDELIMITER $$\nCREATE PROCEDURE p1()\nBEGIN\n DECLARE r ROW (c1 INT, c2 VARCHAR(10));\n SET r.c1= 10;\n SET r.c2= \'test\';\n INSERT INTO t1 VALUES (r.c1, r.c2);\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nFETCH Examples\n--------------\n\nA complete FETCH example for sql_mode=ORACLE:\n\nDROP TABLE IF EXISTS t1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nINSERT INTO t1 VALUES (20,\'b20\');\nINSERT INTO t1 VALUES (30,\'b30\');\n\nSET sql_mode=oracle;\nDROP PROCEDURE IF EXISTS p1;\nDELIMITER $$\nCREATE PROCEDURE p1 AS\n rec ROW(a INT, b VARCHAR(32));\n CURSOR c IS SELECT a,b FROM t1;\nBEGIN\n OPEN c;\n LOOP\n FETCH c INTO rec;\n EXIT WHEN c%NOTFOUND;\n SELECT (\'rec=(\' || rec.a ||\',\'|| rec.b||\')\');\n END LOOP;\n CLOSE c;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nA complete FETCH example for sql_mode=DEFAULT:\n\nDROP TABLE IF EXISTS t1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nINSERT INTO t1 VALUES (20,\'b20\');\nINSERT INTO t1 VALUES (30,\'b30\');\n\nSET sql_mode=DEFAULT;\nDROP PROCEDURE IF EXISTS p1;\nDELIMITER $$\nCREATE PROCEDURE p1()\nBEGIN\n DECLARE done INT DEFAULT FALSE;\n DECLARE rec ROW(a INT, b VARCHAR(32));\n DECLARE c CURSOR FOR SELECT a,b FROM t1;\n DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;\n OPEN c;\nread_loop:\n LOOP\n FETCH c INTO rec;\n IF done THEN\n LEAVE read_loop;\n END IF;\n SELECT CONCAT(\'rec=(\',rec.a,\',\',rec.b,\')\');\n END LOOP;\n CLOSE c;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nSELECT...INTO Examples\n----------------------\n\nA SELECT...INTO example for sql_mode=DEFAULT:\n\nSET sql_mode=DEFAULT;\nDROP TABLE IF EXISTS t1;\nDROP PROCEDURE IF EXISTS p1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nDELIMITER $$\nCREATE PROCEDURE p1()\nBEGIN\n DECLARE rec1 ROW(a INT, b VARCHAR(32));\n SELECT * FROM t1 INTO rec1;\n SELECT rec1.a, rec1.b;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nThe above example returns:\n\n+--------+--------+\n| rec1.a | rec1.b |\n+--------+--------+\n| 10 | b10 |\n+--------+--------+\n\nA SELECT...INTO example for sql_mode=ORACLE:\n\nSET sql_mode=ORACLE;\nDROP TABLE IF EXISTS t1;\nDROP PROCEDURE IF EXISTS p1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nDELIMITER $$\nCREATE PROCEDURE p1 AS\n rec1 ROW(a INT, b VARCHAR(32));\nBEGIN\n SELECT * FROM t1 INTO rec1;\n SELECT rec1.a, rec1.b;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nThe above example returns:\n\n+--------+--------+\n| rec1.a | rec1.b |\n+--------+--------+\n| 10 | b10 |\n+--------+--------+\n\nAn example for sql_mode=ORACLE using table%ROWTYPE variables as SELECT..INTO\ntargets:\n\nSET sql_mode=ORACLE;\nDROP TABLE IF EXISTS t1;\nDROP PROCEDURE IF EXISTS p1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nDELIMITER $$\nCREATE PROCEDURE p1 AS\n rec1 t1%ROWTYPE;\nBEGIN\n SELECT * FROM t1 INTO rec1;\n SELECT rec1.a, rec1.b;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nThe above example returns:\n\n+--------+--------+\n| rec1.a | rec1.b |\n+--------+--------+\n| 10 | b10 |\n+--------+--------+\n\nAn example for sql_mode=ORACLE using cursor%ROWTYPE variables as SELECT..INTO\ntargets:\n\nSET sql_mode=ORACLE;\nDROP TABLE IF EXISTS t1;\nDROP PROCEDURE IF EXISTS p1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nDELIMITER $$\nCREATE PROCEDURE p1 AS\n CURSOR cur1 IS SELECT * FROM t1;\n rec1 cur1%ROWTYPE;\nBEGIN\n SELECT * FROM t1 INTO rec1;\n SELECT rec1.a, rec1.b;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nThe above example returns:\n\n+--------+--------+\n| rec1.a | rec1.b |\n+--------+--------+\n| 10 | b10 |\n+--------+--------+\n\nURL: https://mariadb.com/kb/en/row/','','https://mariadb.com/kb/en/row/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (281,23,'TEXT','Syntax\n------\n\nTEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA TEXT column with a maximum length of 65,535 (216 - 1) characters. The\neffective maximum length is less if the value contains multi-byte characters.\nEach TEXT value is stored using a two-byte length prefix that indicates the\nnumber of bytes in the value. If you need a bigger storage, consider using\nMEDIUMTEXT instead.\n\nAn optional length M can be given for this type. If this is done, MariaDB\ncreates the column as the smallest TEXT type large enough to hold values M\ncharacters long.\n\nBefore MariaDB 10.2, all MariaDB collations were of type PADSPACE, meaning\nthat TEXT (as well as VARCHAR and CHAR values) are compared without regard for\ntrailing spaces. This does not apply to the LIKE pattern-matching operator,\nwhich takes into account trailing spaces.\n\nBefore MariaDB 10.2.1, BLOB and TEXT columns could not be assigned a DEFAULT\nvalue. This restriction was lifted in MariaDB 10.2.1.\n\nExamples\n--------\n\nTrailing spaces:\n\nCREATE TABLE strtest (d TEXT(10));\nINSERT INTO strtest VALUES(\'Maria \');\n\nSELECT d=\'Maria\',d=\'Maria \' FROM strtest;\n+-----------+--------------+\n| d=\'Maria\' | d=\'Maria \' |\n+-----------+--------------+\n| 1 | 1 |\n+-----------+--------------+\n\nSELECT d LIKE \'Maria\',d LIKE \'Maria \' FROM strtest;\n+----------------+-------------------+\n| d LIKE \'Maria\' | d LIKE \'Maria \' |\n+----------------+-------------------+\n| 0 | 1 |\n+----------------+-------------------+\n\nIndexing\n--------\n\nTEXT columns can only be indexed over a specified length. This means that they\ncannot be used as the primary key of a table norm until MariaDB 10.4, can a\nunique index be created on them.\n\nMariaDB starting with 10.4\n--------------------------\nStarting with MariaDB 10.4, a unique index can be created on a TEXT column.\n\nInternally, this uses hash indexing to quickly check the values and if a hash\ncollision is found, the actual stored values are compared in order to retain\nthe uniqueness.\n\nDifference between VARCHAR and TEXT\n-----------------------------------\n\n* VARCHAR columns can be fully indexed. TEXT columns can only be indexed over\na specified length.\n* Using TEXT or BLOB in a SELECT query that uses temporary tables for storing\nintermediate results will force the temporary table to be disk based (using\nthe Aria storage engine instead of the memory storage engine, which is a bit\nslower. This is not that bad as the Aria storage engine caches the rows in\nmemory. To get the benefit of this, one should ensure that the\naria_pagecache_buffer_size variable is big enough to hold most of the row and\nindex data for temporary tables.\n\nFor Storage Engine Developers\n-----------------------------\n\n* Internally the full length of the VARCHAR column is allocated inside each\nTABLE objects record[] structure. As there are three such buffers, each open\ntable will allocate 3 times max-length-to-store-varchar bytes of memory.\n* TEXT and BLOB columns are stored with a pointer (4 or 8 bytes) + a 1-4 bytes\nlength. The TEXT data is only stored once. This means that internally TEXT\nuses less memory for each open table but instead has the additional overhead\nthat each TEXT object needs to be allocated and freed for each row access\n(with some caching in between).\n\nURL: https://mariadb.com/kb/en/text/','','https://mariadb.com/kb/en/text/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (282,23,'TINYBLOB','Syntax\n------\n\nTINYBLOB\n\nDescription\n-----------\n\nA BLOB column with a maximum length of 255 (28 - 1) bytes. Each TINYBLOB value\nis stored using a one-byte length prefix that indicates the number of bytes in\nthe value.\n\nURL: https://mariadb.com/kb/en/tinyblob/','','https://mariadb.com/kb/en/tinyblob/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (283,23,'TINYTEXT','Syntax\n------\n\nTINYTEXT [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA TEXT column with a maximum length of 255 (28 - 1) characters. The effective\nmaximum length is less if the value contains multi-byte characters. Each\nTINYTEXT value is stored using a one-byte length prefix that indicates the\nnumber of bytes in the value.\n\nURL: https://mariadb.com/kb/en/tinytext/','','https://mariadb.com/kb/en/tinytext/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (284,23,'VARBINARY','Syntax\n------\n\nVARBINARY(M)\n\nDescription\n-----------\n\nThe VARBINARY type is similar to the VARCHAR type, but stores binary byte\nstrings rather than non-binary character strings. M represents the maximum\ncolumn length in bytes.\n\nIt contains no character set, and comparison and sorting are based on the\nnumeric value of the bytes.\n\nIf the maximum length is exceeded, and SQL strict mode is not enabled , the\nextra characters will be dropped with a warning. If strict mode is enabled, an\nerror will occur.\n\nUnlike BINARY values, VARBINARYs are not right-padded when inserting.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, RAW is a synonym for VARBINARY.\n\nExamples\n--------\n\nInserting too many characters, first with strict mode off, then with it on:\n\nCREATE TABLE varbins (a VARBINARY(10));\n\nINSERT INTO varbins VALUES(\'12345678901\');\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n\nSELECT * FROM varbins;\n+------------+\n| a |\n+------------+\n| 1234567890 |\n+------------+\n\nSET sql_mode=\'STRICT_ALL_TABLES\';\n\nINSERT INTO varbins VALUES(\'12345678901\');\nERROR 1406 (22001): Data too long for column \'a\' at row 1\n\nSorting is performed with the byte value:\n\nTRUNCATE varbins;\n\nINSERT INTO varbins VALUES(\'A\'),(\'B\'),(\'a\'),(\'b\');\n\nSELECT * FROM varbins ORDER BY a;\n+------+\n| a |\n+------+\n| A |\n| B |\n| a |\n| b |\n+------+\n\nUsing CAST to sort as a CHAR instead:\n\nSELECT * FROM varbins ORDER BY CAST(a AS CHAR);\n+------+\n| a |\n+------+\n| a |\n| A |\n| b |\n| B |\n+------+\n\nURL: https://mariadb.com/kb/en/varbinary/','','https://mariadb.com/kb/en/varbinary/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (285,23,'VARCHAR','Syntax\n------\n\n[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA variable-length string. M represents the maximum column length in\ncharacters. The range of M is 0 to 65,532. The effective maximum length of a\nVARCHAR is subject to the maximum row size and the character set used. For\nexample, utf8 characters can require up to three bytes per character, so a\nVARCHAR column that uses the utf8 character set can be declared to be a\nmaximum of 21,844 characters.\n\nNote: For the ColumnStore engine, M represents the maximum column length in\nbytes.\n\nMariaDB stores VARCHAR values as a one-byte or two-byte length prefix plus\ndata. The length prefix indicates the number of bytes in the value. A VARCHAR\ncolumn uses one length byte if values require no more than 255 bytes, two\nlength bytes if values may require more than 255 bytes.\n\nMariaDB follows the standard SQL specification, and does not remove trailing\nspaces from VARCHAR values.\n\nVARCHAR(0) columns can contain 2 values: an empty string or NULL. Such columns\ncannot be part of an index. The CONNECT storage engine does not support\nVARCHAR(0).\n\nVARCHAR is shorthand for CHARACTER VARYING. NATIONAL VARCHAR is the standard\nSQL way to define that a VARCHAR column should use some predefined character\nset. MariaDB uses utf8 as this predefined character set, as does MySQL 4.1 and\nup. NVARCHAR is shorthand for NATIONAL VARCHAR.\n\nBefore MariaDB 10.2, all MariaDB collations were of type PADSPACE, meaning\nthat VARCHAR (as well as CHAR and TEXT values) are compared without regard for\ntrailing spaces. This does not apply to the LIKE pattern-matching operator,\nwhich takes into account trailing spaces. From MariaDB 10.2, a number of NO\nPAD collations are available.\n\nIf a unique index consists of a column where trailing pad characters are\nstripped or ignored, inserts into that column where values differ only by the\nnumber of trailing pad characters will result in a duplicate-key error.\n\nExamples\n--------\n\nThe following are equivalent:\n\nVARCHAR(30) CHARACTER SET utf8\nNATIONAL VARCHAR(30)\nNVARCHAR(30)\nNCHAR VARCHAR(30)\nNATIONAL CHARACTER VARYING(30)\nNATIONAL CHAR VARYING(30)\n\nTrailing spaces:\n\nCREATE TABLE strtest (v VARCHAR(10));\nINSERT INTO strtest VALUES(\'Maria \');\n\nSELECT v=\'Maria\',v=\'Maria \' FROM strtest;\n+-----------+--------------+\n| v=\'Maria\' | v=\'Maria \' |\n+-----------+--------------+\n| 1 | 1 |\n+-----------+--------------+\n\nSELECT v LIKE \'Maria\',v LIKE \'Maria \' FROM strtest;\n+----------------+-------------------+\n| v LIKE \'Maria\' | v LIKE \'Maria \' |\n+----------------+-------------------+\n| 0 | 1 |\n+----------------+-------------------+\n\nTruncation\n----------\n\n* Depending on whether or not strict sql mode is set, you will either get a\nwarning or an error if you try to insert a string that is too long into a\nVARCHAR column. If the extra characters are spaces, the spaces that can\'t fit\nwill be removed and you will always get a warning, regardless of the sql mode\nsetting.\n\nDifference Between VARCHAR and TEXT\n-----------------------------------\n\n* VARCHAR columns can be fully indexed. TEXT columns can only be indexed over\na specified length.\n* Using TEXT or BLOB in a SELECT query that uses temporary tables for storing\nintermediate results will force the temporary table to be disk based (using\nthe Aria storage engine instead of the memory storage engine, which is a bit\nslower. This is not that bad as the Aria storage engine caches the rows in\nmemory. To get the benefit of this, one should ensure that the\naria_pagecache_buffer_size variable is big enough to hold most of the row and\nindex data for temporary tables.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, VARCHAR2 is a synonym.\n\nFor Storage Engine Developers\n-----------------------------\n\n* Internally the full length of the VARCHAR column is allocated inside each\nTABLE objects record[] structure. As there are three such buffers, each open\ntable will allocate 3 times max-length-to-store-varchar bytes of memory.\n* TEXT and BLOB columns are stored with a pointer (4 or 8 bytes) + a 1-4 bytes\nlength. The TEXT data is only stored once. This means that internally TEXT\nuses less memory for each open table but instead has the additional overhead\nthat each TEXT object needs to be allocated and freed for each row access\n(with some caching in between).\n\nURL: https://mariadb.com/kb/en/varchar/','','https://mariadb.com/kb/en/varchar/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (286,23,'SET Data Type','Syntax\n------\n\nSET(\'value1\',\'value2\',...) [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n\nDescription\n-----------\n\nA set. A string object that can have zero or more values, each of which must\nbe chosen from the list of values \'value1\', \'value2\', ... A SET column can\nhave a maximum of 64 members. SET values are represented internally as\nintegers.\n\nSET values cannot contain commas.\n\nIf a SET contains duplicate values, an error will be returned if strict mode\nis enabled, or a warning if strict mode is not enabled.\n\nURL: https://mariadb.com/kb/en/set-data-type/','','https://mariadb.com/kb/en/set-data-type/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (287,23,'DATE','Syntax\n------\n\nDATE\n\nDescription\n-----------\n\nA date. The supported range is \'1000-01-01\' to \'9999-12-31\'. MariaDB displays\nDATE values in \'YYYY-MM-DD\' format, but can be assigned dates in looser\nformats, including strings or numbers, as long as they make sense. These\ninclude a short year, YY-MM-DD, no delimiters, YYMMDD, or any other acceptable\ndelimiter, for example YYYY/MM/DD. For details, see date and time literals.\n\n\'0000-00-00\' is a permitted special value (zero-date), unless the NO_ZERO_DATE\nSQL_MODE is used. Also, individual components of a date can be set to 0 (for\nexample: \'2015-00-12\'), unless the NO_ZERO_IN_DATE SQL_MODE is used. In many\ncases, the result of en expression involving a zero-date, or a date with\nzero-parts, is NULL. If the ALLOW_INVALID_DATES SQL_MODE is enabled, if the\nday part is in the range between 1 and 31, the date does not produce any\nerror, even for months that have less than 31 days.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, DATE with a time portion is a synonym for\nDATETIME. See also mariadb_schema.\n\nExamples\n--------\n\nCREATE TABLE t1 (d DATE);\n\nINSERT INTO t1 VALUES (\"2010-01-12\"), (\"2011-2-28\"), (\'120314\'),(\'13*04*21\');\n\nSELECT * FROM t1;\n+------------+\n| d |\n+------------+\n| 2010-01-12 |\n| 2011-02-28 |\n| 2012-03-14 |\n| 2013-04-21 |\n+------------+\n\nURL: https://mariadb.com/kb/en/date/','','https://mariadb.com/kb/en/date/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (288,23,'TIME','Syntax\n------\n\nTIME [(<microsecond precision>)]\n\nDescription\n-----------\n\nA time. The range is \'-838:59:59.999999\' to \'838:59:59.999999\'. Microsecond\nprecision can be from 0-6; if not specified 0 is used. Microseconds have been\navailable since MariaDB 5.3.\n\nMariaDB displays TIME values in \'HH:MM:SS.ssssss\' format, but allows\nassignment of times in looser formats, including \'D HH:MM:SS\', \'HH:MM:SS\',\n\'HH:MM\', \'D HH:MM\', \'D HH\', \'SS\', or \'HHMMSS\', as well as permitting dropping\nof any leading zeros when a delimiter is provided, for example \'3:9:10\'. For\ndetails, see date and time literals.\n\nMariaDB starting with 10.1.2\n----------------------------\nMariaDB 10.1.2 introduced the --mysql56-temporal-format option, on by default,\nwhich allows MariaDB to store TIMEs using the same low-level format MySQL 5.6\nuses.\n\nInternal Format\n---------------\n\nIn MariaDB 10.1.2 a new temporal format was introduced from MySQL 5.6 that\nalters how the TIME, DATETIME and TIMESTAMP columns operate at lower levels.\nThese changes allow these temporal data types to have fractional parts and\nnegative values. You can disable this feature using the\nmysql56_temporal_format system variable.\n\nTables that include TIMESTAMP values that were created on an older version of\nMariaDB or that were created while the mysql56_temporal_format system variable\nwas disabled continue to store data using the older data type format.\n\nIn order to update table columns from the older format to the newer format,\nexecute an ALTER TABLE... MODIFY COLUMN statement that changes the column to\nthe *same* data type. This change may be needed if you want to export the\ntable\'s tablespace and import it onto a server that has\nmysql56_temporal_format=ON set (see MDEV-15225).\n\nFor instance, if you have a TIME column in your table:\n\nSHOW VARIABLES LIKE \'mysql56_temporal_format\';\n\n+-------------------------+-------+\n| Variable_name | Value |\n+-------------------------+-------+\n| mysql56_temporal_format | ON |\n+-------------------------+-------+\n\nALTER TABLE example_table MODIFY ts_col TIME;\n\nWhen MariaDB executes the ALTER TABLE statement, it converts the data from the\nolder temporal format to the newer one.\n\nIn the event that you have several tables and columns using temporal data\ntypes that you want to switch over to the new format, make sure the system\nvariable is enabled, then perform a dump and restore using mysqldump. The\ncolumns using relevant temporal data types are restored using the new temporal\nformat.\n\nStarting from MariaDB 10.5.1 columns with old temporal formats are marked with\na /* mariadb-5.3 */ comment in the output of SHOW CREATE TABLE, SHOW COLUMNS,\nDESCRIBE statements, as well as in the COLUMN_TYPE column of the\nINFORMATION_SCHEMA.COLUMNS Table.\n\nSHOW CREATE TABLE mariadb5312_time\\G\n*************************** 1. row ***************************\n Table: mariadb5312_time\nCreate Table: CREATE TABLE `mariadb5312_time` (\n `t0` time /* mariadb-5.3 */ DEFAULT NULL,\n `t6` time(6) /* mariadb-5.3 */ DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=latin1\n\nNote, columns with the current format are not marked with a comment.\n\nExamples\n--------\n\nINSERT INTO time VALUES (\'90:00:00\'), (\'800:00:00\'), (800), (22), (151413),\n(\'9:6:3\'), (\'12 09\');\n\nSELECT * FROM time;\n+-----------+\n| t |\n+-----------+\n| 90:00:00 |\n| 800:00:00 |\n| 00:08:00 |\n| 00:00:22 |\n| 15:14:13 |\n| 09:06:03 |\n| 297:00:00 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/time/','','https://mariadb.com/kb/en/time/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (289,23,'DATETIME','Syntax\n------\n\nDATETIME [(microsecond precision)]\n\nDescription\n-----------\n\nA date and time combination.\n\nMariaDB displays DATETIME values in \'YYYY-MM-DD HH:MM:SS.ffffff\' format, but\nallows assignment of values to DATETIME columns using either strings or\nnumbers. For details, see date and time literals.\n\nDATETIME columns also accept CURRENT_TIMESTAMP as the default value.\n\nMariaDB 10.1.2 introduced the --mysql56-temporal-format option, on by default,\nwhich allows MariaDB to store DATETMEs using the same low-level format MySQL\n5.6 uses. For more information, see Internal Format, below.\n\nFor storage requirements, see Data Type Storage Requirements.\n\nSupported Values\n----------------\n\nMariaDB stores values that use the DATETIME data type in a format that\nsupports values between 1000-01-01 00:00:00.000000 and 9999-12-31\n23:59:59.999999.\n\nMariaDB can also store microseconds with a precision between 0 and 6. If no\nmicrosecond precision is specified, then 0 is used by default.\n\nMariaDB also supports \'0000-00-00\' as a special zero-date value, unless\nNO_ZERO_DATE is specified in the SQL_MODE. Similarly, individual components of\na date can be set to 0 (for example: \'2015-00-12\'), unless NO_ZERO_IN_DATE is\nspecified in the SQL_MODE. In many cases, the result of en expression\ninvolving a zero-date, or a date with zero-parts, is NULL. If the\nALLOW_INVALID_DATES SQL_MODE is enabled, if the day part is in the range\nbetween 1 and 31, the date does not produce any error, even for months that\nhave less than 31 days.\n\nTime Zones\n----------\n\nIf a column uses the DATETIME data type, then any inserted values are stored\nas-is, so no automatic time zone conversions are performed.\n\nMariaDB also does not currently support time zone literals that contain time\nzone identifiers. See MDEV-11829 for more information.\n\nMariaDB validates DATETIME literals against the session\'s time zone. For\nexample, if a specific time range never occurred in a specific time zone due\nto daylight savings time, then DATETIME values within that range would be\ninvalid for that time zone.\n\nFor example, daylight savings time started on March 10, 2019 in the US, so the\ntime range between 02:00:00 and 02:59:59 is invalid for that day in US time\nzones:\n\nSET time_zone = \'America/New_York\';\nQuery OK, 0 rows affected (0.000 sec)\n\nINSERT INTO timestamp_test VALUES (\'2019-03-10 02:55:05\');\nERROR 1292 (22007): Incorrect datetime value: \'2019-03-10 02:55:05\' for column\n`db1`.`timestamp_test`.`timestamp_test` at row 1\n\nBut that same time range is fine in other time zones, such as Coordinated\nUniversal Time (UTC). For example:\n\nSET time_zone = \'UTC\';\nQuery OK, 0 rows affected (0.000 sec)\n\nINSERT INTO timestamp_test VALUES (\'2019-03-10 02:55:05\');\nQuery OK, 1 row affected (0.002 sec)\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, DATE with a time portion is a synonym for\nDATETIME. See also mariadb_schema.\n\nInternal Format\n---------------\n\nIn MariaDB 10.1.2 a new temporal format was introduced from MySQL 5.6 that\nalters how the TIME, DATETIME and TIMESTAMP columns operate at lower levels.\nThese changes allow these temporal data types to have fractional parts and\nnegative values. You can disable this feature using the\nmysql56_temporal_format system variable.\n\nTables that include TIMESTAMP values that were created on an older version of\nMariaDB or that were created while the mysql56_temporal_format system variable\nwas disabled continue to store data using the older data type format.\n\nIn order to update table columns from the older format to the newer format,\nexecute an ALTER TABLE... MODIFY COLUMN statement that changes the column to\nthe *same* data type. This change may be needed if you want to export the\ntable\'s tablespace and import it onto a server that has\nmysql56_temporal_format=ON set (see MDEV-15225).\n\nFor instance, if you have a DATETIME column in your table:\n\nSHOW VARIABLES LIKE \'mysql56_temporal_format\';\n\n+-------------------------+-------+\n| Variable_name | Value |\n+-------------------------+-------+\n| mysql56_temporal_format | ON |\n+-------------------------+-------+\n\nALTER TABLE example_table MODIFY ts_col DATETIME;\n\nWhen MariaDB executes the ALTER TABLE statement, it converts the data from the\nolder temporal format to the newer one.\n\nIn the event that you have several tables and columns using temporal data\ntypes that you want to switch over to the new format, make sure the system\nvariable is enabled, then perform a dump and restore using mysqldump. The\ncolumns using relevant temporal data types are restored using the new temporal\nformat.\n\nStarting from MariaDB 10.5.1 columns with old temporal formats are marked with\na /* mariadb-5.3 */ comment in the output of SHOW CREATE TABLE, SHOW COLUMNS,\nDESCRIBE statements, as well as in the COLUMN_TYPE column of the\nINFORMATION_SCHEMA.COLUMNS Table.\n\nSHOW CREATE TABLE mariadb5312_datetime\\G\n*************************** 1. row ***************************\n Table: mariadb5312_datetime\nCreate Table: CREATE TABLE `mariadb5312_datetime` (\n `dt0` datetime /* mariadb-5.3 */ DEFAULT NULL,\n `dt6` datetime(6) /* mariadb-5.3 */ DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=latin1\n\nExamples\n--------\n\nCREATE TABLE t1 (d DATETIME);\n\nINSERT INTO t1 VALUES (\"2011-03-11\"), (\"2012-04-19 13:08:22\"),\n (\"2013-07-18 13:44:22.123456\");\n\nSELECT * FROM t1;\n+---------------------+\n| d |\n+---------------------+\n| 2011-03-11 00:00:00 |\n| 2012-04-19 13:08:22 |\n| 2013-07-18 13:44:22 |\n+---------------------+\n\nCREATE TABLE t2 (d DATETIME(6));\n\nINSERT INTO t2 VALUES (\"2011-03-11\"), (\"2012-04-19 13:08:22\"),\n (\"2013-07-18 13:44:22.123456\");\n\nSELECT * FROM t2;\n+----------------------------+\n| d |\n+----------------------------+\n| 2011-03-11 00:00:00.000000 |\n| 2012-04-19 13:08:22.000000 |\n| 2013-07-18 13:44:22.123456 |\n+----------------------------++\n\nStrings used in datetime context are automatically converted to datetime(6).\nIf you want to have a datetime without seconds, you should use\nCONVERT(..,datetime).\n\nSELECT CONVERT(\'2007-11-30 10:30:19\',datetime);\n+-----------------------------------------+\n| CONVERT(\'2007-11-30 10:30:19\',datetime) |\n+-----------------------------------------+\n| 2007-11-30 10:30:19 |\n+-----------------------------------------+\n\nSELECT CONVERT(\'2007-11-30 10:30:19\',datetime(6));\n+--------------------------------------------+\n| CONVERT(\'2007-11-30 10:30:19\',datetime(6)) |\n+--------------------------------------------+\n| 2007-11-30 10:30:19.000000 |\n+--------------------------------------------+\n\nURL: https://mariadb.com/kb/en/datetime/','','https://mariadb.com/kb/en/datetime/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (290,23,'TIMESTAMP','Syntax\n------\n\nTIMESTAMP [(<microsecond precision)]\n\nDescription\n-----------\n\nA timestamp in the format YYYY-MM-DD HH:MM:SS.ffffff.\n\nThe timestamp field is generally used to define at which moment in time a row\nwas added or updated and by default will automatically be assigned the current\ndatetime when a record is inserted or updated. The automatic properties only\napply to the first TIMESTAMP in the record; subsequent TIMESTAMP columns will\nnot be changed.\n\nMariaDB includes the --mysql56-temporal-format option, on by default, which\nallows MariaDB to store TIMESTAMPs using the same low-level format MySQL 5.6\nuses.\n\nFor more information, see Internal Format.\n\nSupported Values\n----------------\n\nMariaDB stores values that use the TIMESTAMP data type as the number of\nseconds since \'1970-01-01 00:00:00\' (UTC). This means that the TIMESTAMP data\ntype can hold values between \'1970-01-01 00:00:01\' (UTC) and \'2038-01-19\n03:14:07\' (UTC).\n\nMariaDB can also store microseconds with a precision between 0 and 6. If no\nmicrosecond precision is specified, then 0 is used by default.\n\nAutomatic Values\n----------------\n\nMariaDB has special behavior for the first column that uses the TIMESTAMP data\ntype in a specific table. For the first column that uses the TIMESTAMP data\ntype in a specific table, MariaDB automatically assigns the following\nproperties to the column:\n\n* DEFAULT CURRENT_TIMESTAMP\n* ON UPDATE CURRENT_TIMESTAMP\n\nThis means that if the column is not explicitly assigned a value in an INSERT\nor UPDATE query, then MariaDB will automatically initialize the column\'s value\nwith the current date and time.\n\nThis automatic initialization for INSERT and UPDATE queries can also be\nexplicitly enabled for a column that uses the TIMESTAMP data type by\nspecifying the DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP\nclauses for the column. In these clauses, any synonym of CURRENT_TIMESTAMP is\naccepted, including CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(),\nLOCALTIMESTAMP, and LOCALTIMESTAMP().\n\nThis automatic initialization for INSERT queries can also be explicitly\ndisabled for a column that uses the TIMESTAMP data type by specifying a\nconstant DEFAULT value. For example, DEFAULT 0.\n\nThis automatic initialization for UPDATE queries can also be explicitly\ndisabled for a column that uses the TIMESTAMP data type by specifying a\nDEFAULT clause for the column, but no ON UPDATE clause. If a DEFAULT clause is\nexplicitly specified for a column that uses the TIMESTAMP data type, but an ON\nUPDATE clause is not specified for the column, then the timestamp value will\nnot automatically change when an UPDATE statement is executed.\n\nMariaDB also has special behavior if NULL is assigned to column that uses the\nTIMESTAMP data type. If the column is assigned the NULL value in an INSERT or\nUPDATE query, then MariaDB will automatically initialize the column\'s value\nwith the current date and time. For details, see NULL values in MariaDB.\n\nThis automatic initialization for NULL values can also be explicitly disabled\nfor a column that uses the TIMESTAMP data type by specifying the NULL\nattribute for the column. In this case, if the column\'s value is set to NULL,\nthen the column\'s value will actually be set to NULL.\n\nTime Zones\n----------\n\nIf a column uses the TIMESTAMP data type, then any inserted values are\nconverted from the session\'s time zone to Coordinated Universal Time (UTC)\nwhen stored, and converted back to the session\'s time zone when retrieved.\n\nMariaDB does not currently store any time zone identifier with the value of\nthe TIMESTAMP data type. See MDEV-10018 for more information.\n\nMariaDB does not currently support time zone literals that contain time zone\nidentifiers. See MDEV-11829 for more information.\n\nLimitations\n-----------\n\n* Because the TIMESTAMP value is stored as Epoch Seconds, the timestamp value\n\'1970-01-01 00:00:00\' (UTC) is reserved since the second #0 is used to\nrepresent \'0000-00-00 00:00:00\'.\n* In MariaDB 5.5 and before there could only be one TIMESTAMP column per table\nthat had CURRENT_TIMESTAMP defined as its default value. This limit has no\nlonger applied since MariaDB 10.0.\n\nSQL_MODE=MAXDB\n--------------\n\nIf the SQL_MODE is set to MAXDB, TIMESTAMP fields will be silently converted\nto DATETIME.\n\nInternal Format\n---------------\n\nIn MariaDB 10.1.2 a new temporal format was introduced from MySQL 5.6 that\nalters how the TIME, DATETIME and TIMESTAMP columns operate at lower levels.\nThese changes allow these temporal data types to have fractional parts and\nnegative values. You can disable this feature using the\nmysql56_temporal_format system variable.\n\nTables that include TIMESTAMP values that were created on an older version of\nMariaDB or that were created while the mysql56_temporal_format system variable\nwas disabled continue to store data using the older data type format.\n\nIn order to update table columns from the older format to the newer format,\nexecute an ALTER TABLE... MODIFY COLUMN statement that changes the column to\nthe *same* data type. This change may be needed if you want to export the\ntable\'s tablespace and import it onto a server that has\nmysql56_temporal_format=ON set (see MDEV-15225).\n\nFor instance, if you have a TIMESTAMP column in your table:\n\nSHOW VARIABLES LIKE \'mysql56_temporal_format\';\n\n+-------------------------+-------+\n| Variable_name | Value |\n+-------------------------+-------+\n| mysql56_temporal_format | ON |\n+-------------------------+-------+\n\nALTER TABLE example_table MODIFY ts_col TIMESTAMP;\n\nWhen MariaDB executes the ALTER TABLE statement, it converts the data from the\nolder temporal format to the newer one.\n\nIn the event that you have several tables and columns using temporal data\ntypes that you want to switch over to the new format, make sure the system\nvariable is enabled, then perform a dump and restore using mysqldump. The\ncolumns using relevant temporal data types are restored using the new temporal\nformat.\n\nStarting from MariaDB 10.5.1 columns with old temporal formats are marked with\na /* mariadb-5.3 */ comment in the output of SHOW CREATE TABLE, SHOW COLUMNS,\nDESCRIBE statements, as well as in the COLUMN_TYPE column of the\nINFORMATION_SCHEMA.COLUMNS Table.\n\nSHOW CREATE TABLE mariadb5312_timestamp\\G\n*************************** 1. row ***************************\n Table: mariadb5312_timestamp\nCreate Table: CREATE TABLE `mariadb5312_timestamp` (\n `ts0` timestamp /* mariadb-5.3 */ NOT NULL DEFAULT current_timestamp() ON\nUPDATE current_timestamp(),\n `ts6` timestamp(6) /* mariadb-5.3 */ NOT NULL DEFAULT \'0000-00-00\n00:00:00.000000\'\n) ENGINE=MyISAM DEFAULT CHARSET=latin1\n\nNote: Prior to MySQL 4.1 a different format for the TIMESTAMP datatype was\nused. This format is unsupported in MariaDB 5.1 and upwards.\n\nExamples\n--------\n\nCREATE TABLE t (id INT, ts TIMESTAMP);\n\nDESC t;\n+-------+-----------+------+-----+-------------------+-------------------------\n---+\n| Field | Type | Null | Key | Default | Extra \n |\n+-------+-----------+------+-----+-------------------+-------------------------\n---+\n| id | int(11) | YES | | NULL | \n |\n| ts | timestamp | NO | | CURRENT_TIMESTAMP | on update\nCURRENT_TIMESTAMP |\n+-------+-----------+------+-----+-------------------+-------------------------\n---+\n\nINSERT INTO t(id) VALUES (1),(2);\n\nSELECT * FROM t;\n+------+---------------------+\n| id | ts |\n+------+---------------------+\n| 1 | 2013-07-22 12:50:05 |\n| 2 | 2013-07-22 12:50:05 |\n+------+---------------------+\n\nINSERT INTO t VALUES (3,NULL),(4,\'2001-07-22 12:12:12\');\n\nSELECT * FROM t;\n+------+---------------------+\n| id | ts |\n+------+---------------------+\n| 1 | 2013-07-22 12:50:05 |\n| 2 | 2013-07-22 12:50:05 |\n| 3 | 2013-07-22 12:51:56 |\n| 4 | 2001-07-22 12:12:12 |\n+------+---------------------+\n\nConverting to Unix epoch:\n\nSELECT ts, UNIX_TIMESTAMP(ts) FROM t;\n+---------------------+--------------------+\n| ts | UNIX_TIMESTAMP(ts) |\n+---------------------+--------------------+\n| 2013-07-22 12:50:05 | 1374490205 |\n| 2013-07-22 12:50:05 | 1374490205 |\n| 2013-07-22 12:51:56 | 1374490316 |\n| 2001-07-22 12:12:12 | 995796732 |\n+---------------------+--------------------+\n\nUpdate also changes the timestamp:\n\nUPDATE t set id=5 WHERE id=1;\n\nSELECT * FROM t;\n+------+---------------------+\n| id | ts |\n+------+---------------------+\n| 5 | 2013-07-22 14:52:33 |\n| 2 | 2013-07-22 12:50:05 |\n| 3 | 2013-07-22 12:51:56 |\n| 4 | 2001-07-22 12:12:12 |\n+------+---------------------+\n\nDefault NULL:\n\nCREATE TABLE t2 (id INT, ts TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP);\n\nINSERT INTO t(id) VALUES (1),(2);\n\nSELECT * FROM t2;\n\nINSERT INTO t2(id) VALUES (1),(2);\n\nSELECT * FROM t2;\n+------+------+\n| id | ts |\n+------+------+\n| 1 | NULL |\n| 2 | NULL |\n+------+------+\n\nUPDATE t2 SET id=3 WHERE id=1;\n\nSELECT * FROM t2;\n+------+---------------------+\n| id | ts |\n+------+---------------------+\n| 3 | 2013-07-22 15:32:22 |\n| 2 | NULL |\n+------+---------------------+\n\nOnly the first timestamp is automatically inserted and updated:\n\nCREATE TABLE t3 (id INT, ts1 TIMESTAMP, ts2 TIMESTAMP);\n\nINSERT INTO t3(id) VALUES (1),(2);\n\nSELECT * FROM t3;\n+------+---------------------+---------------------+\n| id | ts1 | ts2 |\n+------+---------------------+---------------------+\n| 1 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |\n| 2 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |\n+------+---------------------+---------------------+\n\nDESC t3;\n+-------+-----------+------+-----+---------------------+-----------------------\n-----+\n| Field | Type | Null | Key | Default | Extra \n |\n+-------+-----------+------+-----+---------------------+-----------------------\n-----+\n| id | int(11) | YES | | NULL | \n |\n| ts1 | timestamp | NO | | CURRENT_TIMESTAMP | on update\nCURRENT_TIMESTAMP |\n| ts2 | timestamp | NO | | 0000-00-00 00:00:00 | \n |\n+-------+-----------+------+-----+---------------------+-----------------------\n-----+\n\nExplicitly setting a timestamp with the CURRENT_TIMESTAMP function:\n\nINSERT INTO t3(id,ts2) VALUES (3,CURRENT_TIMESTAMP());\n\nSELECT * FROM t3;\n+------+---------------------+---------------------+\n| id | ts1 | ts2 |\n+------+---------------------+---------------------+\n| 1 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |\n| 2 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |\n| 3 | 2013-07-22 15:38:52 | 2013-07-22 15:38:52 |\n+------+---------------------+---------------------+\n\nSpecifying the timestamp as NOT NULL:\n\nCREATE TABLE t4 (id INT, ts TIMESTAMP NOT NULL);\n\nINSERT INTO t4(id) VALUES (1);\nSELECT SLEEP(1);\nINSERT INTO t4(id,ts) VALUES (2,NULL);\n\nSELECT * FROM t4;\n\nURL: https://mariadb.com/kb/en/timestamp/','','https://mariadb.com/kb/en/timestamp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (291,23,'YEAR Data Type','Syntax\n------\n\nYEAR[(4)]\n\nDescription\n-----------\n\nA year in two-digit or four-digit format. The default is four-digit format.\nNote that the two-digit format has been deprecated since MariaDB 5.5.27.\n\nIn four-digit format, the allowable values are 1901 to 2155, and 0000. In\ntwo-digit format, the allowable values are 70 to 69, representing years from\n1970 to 2069. MariaDB displays YEAR values in YYYY format, but allows you to\nassign values to YEAR columns using either strings or numbers.\n\nInserting numeric zero has a different result for YEAR(4) and YEAR(2). For\nYEAR(2), the value 00 reflects the year 2000. For YEAR(4), the value 0000\nreflects the year zero. This only applies to numeric zero. String zero always\nreflects the year 2000.\n\nExamples\n--------\n\nAccepting a string or a number:\n\nCREATE TABLE y(y YEAR);\n\nINSERT INTO y VALUES (1990),(\'2012\');\n\nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n+------+\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nOut of range:\n\nINSERT INTO y VALUES (1005),(\'3080\');\nERROR 1264 (22003): Out of range value for column \'y\' at row 1\n\nINSERT INTO y VALUES (\'2013-12-12\');\nERROR 1265 (01000): Data truncated for column \'y\' at row 1\n\nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n+------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nOut of range:\n\nINSERT INTO y VALUES (1005),(\'3080\');\nQuery OK, 2 rows affected, 2 warnings (0.05 sec)\nRecords: 2 Duplicates: 0 Warnings: 2\n\nSHOW WARNINGS;\n+---------+------+--------------------------------------------+\n| Level | Code | Message |\n+---------+------+--------------------------------------------+\n| Warning | 1264 | Out of range value for column \'y\' at row 1 |\n| Warning | 1264 | Out of range value for column \'y\' at row 2 |\n+---------+------+--------------------------------------------+\n\nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n| 0000 |\n| 0000 |\n+------+\n\nTruncating:\n\nINSERT INTO y VALUES (\'2013-12-12\');\nQuery OK, 1 row affected, 1 warning (0.05 sec)\n\nSHOW WARNINGS;\n+---------+------+----------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------+\n| Warning | 1265 | Data truncated for column \'y\' at row 1 |\n+---------+------+----------------------------------------+\n\nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n| 0000 |\n| 0000 |\n| 2013 |\n+------+\n\nDifference between YEAR(2) and YEAR(4), and string and numeric zero:\n\nCREATE TABLE y2(y YEAR(4), y2 YEAR(2));\nQuery OK, 0 rows affected, 1 warning (0.40 sec)\n\nNote (Code 1287): \'YEAR(2)\' is deprecated and will be removed in a future\nrelease. \n Please use YEAR(4) instead\n\nINSERT INTO y2 VALUES(0,0),(\'0\',\'0\');\n\nSELECT YEAR(y),YEAR(y2) FROM y2;\n+---------+----------+\n| YEAR(y) | YEAR(y2) |\n+---------+----------+\n| 0 | 2000 |\n| 2000 | 2000 |\n+---------+----------+\n\nURL: https://mariadb.com/kb/en/year-data-type/','','https://mariadb.com/kb/en/year-data-type/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (292,23,'AUTO_INCREMENT','Description\n-----------\n\nThe AUTO_INCREMENT attribute can be used to generate a unique identity for new\nrows. When you insert a new record to the table (or upon adding an\nAUTO_INCREMENT attribute with the ALTER TABLE statement), and the\nauto_increment field is NULL or DEFAULT (in the case of an INSERT), the value\nwill automatically be incremented. This also applies to 0, unless the\nNO_AUTO_VALUE_ON_ZERO SQL_MODE is enabled.\n\nAUTO_INCREMENT columns start from 1 by default. The automatically generated\nvalue can never be lower than 0.\n\nEach table can have only one AUTO_INCREMENT column. It must defined as a key\n(not necessarily the PRIMARY KEY or UNIQUE key). In some storage engines\n(including the default InnoDB), if the key consists of multiple columns, the\nAUTO_INCREMENT column must be the first column. Storage engines that permit\nthe column to be placed elsewhere are Aria, MyISAM, MERGE, Spider, TokuDB,\nBLACKHOLE, FederatedX and Federated.\n\nCREATE TABLE animals (\n id MEDIUMINT NOT NULL AUTO_INCREMENT,\n name CHAR(30) NOT NULL,\n PRIMARY KEY (id)\n );\n\nINSERT INTO animals (name) VALUES\n (\'dog\'),(\'cat\'),(\'penguin\'),\n (\'fox\'),(\'whale\'),(\'ostrich\');\n\nSELECT * FROM animals;\n+----+---------+\n| id | name |\n+----+---------+\n| 1 | dog |\n| 2 | cat |\n| 3 | penguin |\n| 4 | fox |\n| 5 | whale |\n| 6 | ostrich |\n+----+---------+\n\nSERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.\n\nCREATE TABLE t (id SERIAL, c CHAR(1)) ENGINE=InnoDB;\n\nSHOW CREATE TABLE t \\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\n `c` char(1) DEFAULT NULL,\n UNIQUE KEY `id` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nSetting or Changing the Auto_Increment Value\n--------------------------------------------\n\nYou can use an ALTER TABLE statement to assign a new value to the\nauto_increment table option, or set the insert_id server system variable to\nchange the next AUTO_INCREMENT value inserted by the current session.\n\nLAST_INSERT_ID() can be used to see the last AUTO_INCREMENT value inserted by\nthe current session.\n\nALTER TABLE animals AUTO_INCREMENT=8;\n\nINSERT INTO animals (name) VALUES (\'aardvark\');\n\nSELECT * FROM animals;\n+----+-----------+\n| id | name |\n+----+-----------+\n| 1 | dog |\n| 2 | cat |\n| 3 | penguin |\n| 4 | fox |\n| 5 | whale |\n| 6 | ostrich |\n| 8 | aardvark |\n+----+-----------+\n\nSET insert_id=12;\n\nINSERT INTO animals (name) VALUES (\'gorilla\');\n\nSELECT * FROM animals;\n+----+-----------+\n| id | name |\n+----+-----------+\n| 1 | dog |\n| 2 | cat |\n| 3 | penguin |\n| 4 | fox |\n| 5 | whale |\n| 6 | ostrich |\n| 8 | aardvark |\n| 12 | gorilla |\n+----+-----------+\n\nInnoDB\n------\n\nUntil MariaDB 10.2.3, InnoDB used an auto-increment counter that is stored in\nmemory. When the server restarts, the counter is re-initialized to the highest\nvalue used in the table, which cancels the effects of any AUTO_INCREMENT = N\noption in the table statements.\n\nFrom MariaDB 10.2.4, this restriction has been lifted and AUTO_INCREMENT is\npersistent.\n\nSee also AUTO_INCREMENT Handling in InnoDB.\n\nSetting Explicit Values\n-----------------------\n\nIt is possible to specify a value for an AUTO_INCREMENT column. If the key is\nprimary or unique, the value must not already exist in the key.\n\nIf the new value is higher than the current maximum value, the AUTO_INCREMENT\nvalue is updated, so the next value will be higher. If the new value is lower\nthan the current maximum value, the AUTO_INCREMENT value remains unchanged.\n\nThe following example demonstrates these behaviors:\n\nCREATE TABLE t (id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE =\nInnoDB;\n\nINSERT INTO t VALUES (NULL);\nSELECT id FROM t;\n+----+\n| id |\n+----+\n| 1 |\n+----+\n\nINSERT INTO t VALUES (10); -- higher value\nSELECT id FROM t;\n+----+\n| id |\n+----+\n| 1 |\n| 10 |\n+----+\n\nINSERT INTO t VALUES (2); -- lower value\nINSERT INTO t VALUES (NULL); -- auto value\nSELECT id FROM t;\n+----+\n| id |\n+----+\n| 1 |\n| 2 |\n| 10 |\n| 11 |\n+----+\n\nThe ARCHIVE storage engine does not allow to insert a value that is lower than\nthe current maximum.\n\nMissing Values\n--------------\n\nAn AUTO_INCREMENT column normally has missing values. This happens because if\na row is deleted, or an AUTO_INCREMENT value is explicitly updated, old values\nare never re-used. The REPLACE statement also deletes a row, and its value is\nwasted. With InnoDB, values can be reserved by a transaction; but if the\ntransaction fails (for example, because of a ROLLBACK) the reserved value will\nbe lost.\n\nThus AUTO_INCREMENT values can be used to sort results in a chronological\norder, but not to create a numeric sequence.\n\nReplication\n-----------\n\nTo make master-master or Galera safe to use AUTO_INCREMENT one should use the\nsystem variables auto_increment_increment and auto_increment_offset to\ngenerate unique values for each server.\n\nCHECK Constraints, DEFAULT Values and Virtual Columns\n-----------------------------------------------------\n\nMariaDB starting with 10.2.6\n----------------------------\nFrom MariaDB 10.2.6 auto_increment columns are no longer permitted in CHECK\nconstraints, DEFAULT value expressions and virtual columns. They were\npermitted in earlier versions, but did not work correctly. See MDEV-11117.\n\nGenerating Auto_Increment Values When Adding the Attribute\n----------------------------------------------------------\n\nCREATE OR REPLACE TABLE t1 (a INT);\nINSERT t1 VALUES (0),(0),(0);\nALTER TABLE t1 MODIFY a INT NOT NULL AUTO_INCREMENT PRIMARY KEY;\nSELECT * FROM t1;\n+---+\n| a |\n+---+\n| 1 |\n| 2 |\n| 3 |\n+---+\n\nCREATE OR REPLACE TABLE t1 (a INT);\nINSERT t1 VALUES (5),(0),(8),(0);\nALTER TABLE t1 MODIFY a INT NOT NULL AUTO_INCREMENT PRIMARY KEY;\nSELECT * FROM t1;\n+---+\n| a |\n+---+\n| 5 |\n| 6 |\n| 8 |\n| 9 |\n+---+\n\nIf the NO_AUTO_VALUE_ON_ZERO SQL_MODE is set, zero values will not be\nautomatically incremented:\n\nSET SQL_MODE=\'no_auto_value_on_zero\';\nCREATE OR REPLACE TABLE t1 (a INT);\nINSERT t1 VALUES (3), (0);\nALTER TABLE t1 MODIFY a INT NOT NULL AUTO_INCREMENT PRIMARY KEY;\nSELECT * FROM t1;\n+---+\n| a |\n+---+\n| 0 |\n| 3 |\n+---+\n\nURL: https://mariadb.com/kb/en/auto_increment/','','https://mariadb.com/kb/en/auto_increment/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (293,24,'Using Compound Statements Outside of Stored Programs','Compound statements can also be used outside of stored programs.\n\ndelimiter |\nIF @have_innodb THEN\n CREATE TABLE IF NOT EXISTS innodb_index_stats (\n database_name VARCHAR(64) NOT NULL,\n table_name VARCHAR(64) NOT NULL,\n index_name VARCHAR(64) NOT NULL,\n last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE\nCURRENT_TIMESTAMP,\n stat_name VARCHAR(64) NOT NULL,\n stat_value BIGINT UNSIGNED NOT NULL,\n sample_size BIGINT UNSIGNED,\n stat_description VARCHAR(1024) NOT NULL,\n PRIMARY KEY (database_name, table_name, index_name, stat_name)\n ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;\nEND IF|\nQuery OK, 0 rows affected, 2 warnings (0.00 sec)\n\nNote, that using compound statements this way is subject to following\nlimitations:\n\n* Only BEGIN, IF, CASE, LOOP, WHILE, REPEAT statements may start a compound\nstatement outside of stored programs.\n* BEGIN must use the BEGIN NOT ATOMIC syntax (otherwise it\'ll be confused with\nBEGIN that starts a transaction).\n* A compound statement might not start with a label.\n* A compound statement is parsed completely—note \"2 warnings\" in the above\nexample, even if the condition was false (InnoDB was, indeed, disabled), and\nthe CREATE TABLE statement was not executed, it was still parsed and the\nparser produced \"Unknown storage engine\" warning.\n\nInside a compound block first three limitations do not apply, one can use\nanything that can be used inside a stored program — including labels,\ncondition handlers, variables, and so on:\n\nBEGIN NOT ATOMIC\n DECLARE foo CONDITION FOR 1146;\n DECLARE x INT DEFAULT 0;\n DECLARE CONTINUE HANDLER FOR SET x=1;\n INSERT INTO test.t1 VALUES (\"hndlr1\", val, 2);\n END|\n\nExample how to use IF:\n\nIF (1>0) THEN BEGIN NOT ATOMIC SELECT 1; END ; END IF;;\n\nExample of how to use WHILE loop:\n\nDELIMITER |\nBEGIN NOT ATOMIC\n DECLARE x INT DEFAULT 0;\n WHILE x <= 10 DO\n SET x = x + 1;\n SELECT x;\n END WHILE;\nEND|\nDELIMITER ;\n\nURL:\nhttps://mariadb.com/kb/en/using-compound-statements-outside-of-stored-programs/','','https://mariadb.com/kb/en/using-compound-statements-outside-of-stored-programs/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (294,24,'BEGIN END','Syntax\n------\n\n[begin_label:] BEGIN [NOT ATOMIC]\n [statement_list]\nEND [end_label]\n\nNOT ATOMIC is required when used outside of a stored procedure. Inside stored\nprocedures or within an anonymous block, BEGIN alone starts a new anonymous\nblock.\n\nDescription\n-----------\n\nBEGIN ... END syntax is used for writing compound statements. A compound\nstatement can contain multiple statements, enclosed by the BEGIN and END\nkeywords. statement_list represents a list of one or more statements, each\nterminated by a semicolon (i.e., ;) statement delimiter. statement_list is\noptional, which means that the empty compound statement (BEGIN END) is legal.\n\nNote that END will perform a commit. If you are running in autocommit mode,\nevery statement will be committed separately. If you are not running in\nautocommit mode, you must execute a COMMIT or ROLLBACK after END to get the\ndatabase up to date.\n\nUse of multiple statements requires that a client is able to send statement\nstrings containing the ; statement delimiter. This is handled in the mysql\ncommand-line client with the DELIMITER command. Changing the ;\nend-of-statement delimiter (for example, to //) allows ; to be used in a\nprogram body.\n\nA compound statement within a stored program can be labeled. end_label cannot\nbe given unless begin_label also is present. If both are present, they must be\nthe same.\n\nBEGIN ... END constructs can be nested. Each block can define its own\nvariables, a CONDITION, a HANDLER and a CURSOR, which don\'t exist in the outer\nblocks. The most local declarations override the outer objects which use the\nsame name (see example below).\n\nThe declarations order is the following:\n\n* DECLARE local variables;\n* DECLARE CONDITIONs;\n* DECLARE CURSORs;\n* DECLARE HANDLERs;\n\nNote that DECLARE HANDLER contains another BEGIN ... END construct.\n\nHere is an example of a very simple, anonymous block:\n\nBEGIN NOT ATOMIC\nSET @a=1;\nCREATE TABLE test.t1(a INT);\nEND|\n\nBelow is an example of nested blocks in a stored procedure:\n\nCREATE PROCEDURE t( )\nBEGIN\n DECLARE x TINYINT UNSIGNED DEFAULT 1;\n BEGIN\n DECLARE x CHAR(2) DEFAULT \'02\';\n DECLARE y TINYINT UNSIGNED DEFAULT 10;\n SELECT x, y;\n END;\n SELECT x;\nEND;\n\nIn this example, a TINYINT variable, x is declared in the outter block. But in\nthe inner block x is re-declared as a CHAR and an y variable is declared. The\ninner SELECT shows the \"new\" value of x, and the value of y. But when x is\nselected in the outer block, the \"old\" value is returned. The final SELECT\ndoesn\'t try to read y, because it doesn\'t exist in that context.\n\nURL: https://mariadb.com/kb/en/begin-end/','','https://mariadb.com/kb/en/begin-end/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (295,24,'CASE Statement','Syntax\n------\n\nCASE case_value\n WHEN when_value THEN statement_list\n [WHEN when_value THEN statement_list] ...\n [ELSE statement_list]\nEND CASE\n\nOr:\n\nCASE\n WHEN search_condition THEN statement_list\n [WHEN search_condition THEN statement_list] ...\n [ELSE statement_list]\nEND CASE\n\nDescription\n-----------\n\nThe text on this page describes the CASE statement for stored programs. See\nthe CASE OPERATOR for details on the CASE operator outside of stored programs.\n\nThe CASE statement for stored programs implements a complex conditional\nconstruct. If a search_condition evaluates to true, the corresponding SQL\nstatement list is executed. If no search condition matches, the statement list\nin the ELSE clause is executed. Each statement_list consists of one or more\nstatements.\n\nThe CASE statement cannot have an ELSE NULL clause, and it is terminated with\nEND CASE instead of END. implements a complex conditional construct. If a\nsearch_condition evaluates to true, the corresponding SQL statement list is\nexecuted. If no search condition matches, the statement list in the ELSE\nclause is executed. Each statement_list consists of one or more statements.\n\nIf no when_value or search_condition matches the value tested and the CASE\nstatement contains no ELSE clause, a Case not found for CASE statement error\nresults.\n\nEach statement_list consists of one or more statements; an empty\nstatement_list is not allowed. To handle situations where no value is matched\nby any WHEN clause, use an ELSE containing an empty BEGIN ... END block, as\nshown in this example:\n\nDELIMITER |\nCREATE PROCEDURE p()\nBEGIN\n DECLARE v INT DEFAULT 1;\n CASE v\n WHEN 2 THEN SELECT v;\n WHEN 3 THEN SELECT 0;\n ELSE BEGIN END;\n END CASE;\nEND;\n|\n\nThe indentation used here in the ELSE clause is for purposes of clarity only,\nand is not otherwise significant. See Delimiters in the mysql client for more\non the use of the delimiter command.\n\nNote: The syntax of the CASE statement used inside stored programs differs\nslightly from that of the SQL CASE expression described in CASE OPERATOR. The\nCASE statement cannot have an ELSE NULL clause, and it is terminated with END\nCASE instead of END.\n\nURL: https://mariadb.com/kb/en/case-statement/','','https://mariadb.com/kb/en/case-statement/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (296,24,'DECLARE CONDITION','Syntax\n------\n\nDECLARE condition_name CONDITION FOR condition_value\n\ncondition_value:\n SQLSTATE [VALUE] sqlstate_value\n | mysql_error_code\n\nDescription\n-----------\n\nThe DECLARE ... CONDITION statement defines a named error condition. It\nspecifies a condition that needs specific handling and associates a name with\nthat condition. Later, the name can be used in a DECLARE ... HANDLER, SIGNAL\nor RESIGNAL statement (as long as the statement is located in the same BEGIN\n... END block).\n\nConditions must be declared after local variables, but before CURSORs and\nHANDLERs.\n\nA condition_value for DECLARE ... CONDITION can be an SQLSTATE value (a\n5-character string literal) or a MySQL error code (a number). You should not\nuse SQLSTATE value \'00000\' or MySQL error code 0, because those indicate\nsucess rather than an error condition. If you try, or if you specify an\ninvalid SQLSTATE value, an error like this is produced:\n\nERROR 1407 (42000): Bad SQLSTATE: \'00000\'\n\nFor a list of SQLSTATE values and MariaDB error codes, see MariaDB Error Codes.\n\nURL: https://mariadb.com/kb/en/declare-condition/','','https://mariadb.com/kb/en/declare-condition/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (297,24,'DECLARE HANDLER','Syntax\n------\n\nDECLARE handler_type HANDLER\n FOR condition_value [, condition_value] ...\n statement\n\nhandler_type:\n CONTINUE\n | EXIT\n | UNDO\n\ncondition_value:\n SQLSTATE [VALUE] sqlstate_value\n | condition_name\n | SQLWARNING\n | NOT FOUND\n | SQLEXCEPTION\n | mariadb_error_code\n\nDescription\n-----------\n\nThe DECLARE ... HANDLER statement specifies handlers that each may deal with\none or more conditions. If one of these conditions occurs, the specified\nstatement is executed. statement can be a simple statement (for example, SET\nvar_name = value), or it can be a compound statement written using BEGIN and\nEND.\n\nHandlers must be declared after local variables, a CONDITION and a CURSOR.\n\nFor a CONTINUE handler, execution of the current program continues after\nexecution of the handler statement. For an EXIT handler, execution terminates\nfor the BEGIN ... END compound statement in which the handler is declared.\n(This is true even if the condition occurs in an inner block.) The UNDO\nhandler type statement is not supported.\n\nIf a condition occurs for which no handler has been declared, the default\naction is EXIT.\n\nA condition_value for DECLARE ... HANDLER can be any of the following values:\n\n* An SQLSTATE value (a 5-character string literal) or a MariaDB error\ncode (a number). You should not use SQLSTATE value \'00000\' or MariaDB\nerror code 0, because those indicate sucess rather than an error\ncondition. For a list of SQLSTATE values and MariaDB error codes, see\nMariaDB Error Codes.\n* A condition name previously specified with DECLARE ... CONDITION. It must be\nin the same stored program. See DECLARE CONDITION.\n* SQLWARNING is shorthand for the class of SQLSTATE values that begin\nwith \'01\'.\n* NOT FOUND is shorthand for the class of SQLSTATE values that begin\nwith \'02\'. This is relevant only the context of cursors and is used to\ncontrol what happens when a cursor reaches the end of a data set. If\nno more rows are available, a No Data condition occurs with SQLSTATE\nvalue 02000. To detect this condition, you can set up a handler for it\n(or for a NOT FOUND condition). An example is shown in Cursor Overview. This\ncondition also occurs for SELECT ... INTO var_list statements that retrieve no\nrows.\n* SQLEXCEPTION is shorthand for the class of SQLSTATE values that do\nnot begin with \'00\', \'01\', or \'02\'.\n\nWhen an error raises, in some cases it could be handled by multiple HANDLERs.\nFor example, there may be an handler for 1050 error, a separate handler for\nthe 42S01 SQLSTATE, and another separate handler for the SQLEXCEPTION class:\nin theory all occurrences of HANDLER may catch the 1050 error, but MariaDB\nchooses the HANDLER with the highest precedence. Here are the precedence rules:\n\n* Handlers which refer to an error code have the highest precedence.\n* Handlers which refer to a SQLSTATE come next.\n* Handlers which refer to an error class have the lowest precedence.\n\nIn some cases, a statement could produce multiple errors. If this happens, in\nsome cases multiple handlers could have the highest precedence. In such cases,\nthe choice of the handler is indeterminate.\n\nNote that if an error occurs within a CONTINUE HANDLER block, it can be\nhandled by another HANDLER. However, a HANDLER which is already in the stack\n(that is, it has been called to handle an error and its execution didn\'t\nfinish yet) cannot handle new errors—this prevents endless loops. For example,\nsuppose that a stored procedure contains a CONTINUE HANDLER for SQLWARNING and\nanother CONTINUE HANDLER for NOT FOUND. At some point, a NOT FOUND error\noccurs, and the execution enters the NOT FOUND HANDLER. But within that\nhandler, a warning occurs, and the execution enters the SQLWARNING HANDLER. If\nanother NOT FOUND error occurs, it cannot be handled again by the NOT FOUND\nHANDLER, because its execution is not finished.\n\nWhen a DECLARE HANDLER block can handle more than one error condition, it may\nbe useful to know which errors occurred. To do so, you can use the GET\nDIAGNOSTICS statement.\n\nAn error that is handled by a DECLARE HANDLER construct can be issued again\nusing the RESIGNAL statement.\n\nBelow is an example using DECLARE HANDLER:\n\nCREATE TABLE test.t (s1 INT, PRIMARY KEY (s1));\n\nDELIMITER //\n\nCREATE PROCEDURE handlerdemo ( )\n BEGIN\n DECLARE CONTINUE HANDLER FOR SQLSTATE \'23000\' SET @x2 = 1;\n SET @x = 1;\n INSERT INTO test.t VALUES (1);\n SET @x = 2;\n INSERT INTO test.t VALUES (1);\n SET @x = 3;\n END;\n //\n\nDELIMITER ;\n\nCALL handlerdemo( );\n\nSELECT @x;\n+------+\n| @x |\n+------+\n| 3 |\n+------+\n\nURL: https://mariadb.com/kb/en/declare-handler/','','https://mariadb.com/kb/en/declare-handler/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (298,24,'DECLARE Variable','Syntax\n------\n\nDECLARE var_name [, var_name] ... [[ROW] TYPE OF]] type [DEFAULT value]\n\nDescription\n-----------\n\nThis statement is used to declare local variables within stored programs. To\nprovide a default value for the variable, include a DEFAULT clause. The value\ncan be specified as an expression (even subqueries are permitted); it need not\nbe a constant. If the DEFAULT clause is missing, the initial value is NULL.\n\nLocal variables are treated like stored routine parameters with respect to\ndata type and overflow checking. See CREATE PROCEDURE.\n\nLocal variables must be declared before CONDITIONs, CURSORs and HANDLERs.\n\nLocal variable names are not case sensitive.\n\nThe scope of a local variable is within the BEGIN ... END block where it is\ndeclared. The variable can be referred to in blocks nested within the\ndeclaring block, except those blocks that declare a variable with the same\nname.\n\nTYPE OF / ROW TYPE OF\n---------------------\n\nMariaDB starting with 10.3\n--------------------------\nTYPE OF and ROW TYPE OF anchored data types for stored routines were\nintroduced in MariaDB 10.3.\n\nAnchored data types allow a data type to be defined based on another object,\nsuch as a table row, rather than specifically set in the declaration. If the\nanchor object changes, so will the anchored data type. This can lead to\nroutines being easier to maintain, so that if the data type in the table is\nchanged, it will automatically be changed in the routine as well.\n\nVariables declared with ROW TYPE OF will have the same features as implicit\nROW variables. It is not possible to use ROW TYPE OF variables in a LIMIT\nclause.\n\nThe real data type of TYPE OF and ROW TYPE OF table_name will become known at\nthe very beginning of the stored routine call. ALTER TABLE or DROP TABLE\nstatements performed inside the current routine on the tables that appear in\nanchors won\'t affect the data type of the anchored variables, even if the\nvariable is declared after an ALTER TABLE or DROP TABLE statement.\n\nThe real data type of a ROW TYPE OF cursor_name variable will become known\nwhen execution enters into the block where the variable is declared. Data type\ninstantiation will happen only once. In a cursor ROW TYPE OF variable that is\ndeclared inside a loop, its data type will become known on the very first\niteration and won\'t change on further loop iterations.\n\nThe tables referenced in TYPE OF and ROW TYPE OF declarations will be checked\nfor existence at the beginning of the stored routine call. CREATE PROCEDURE or\nCREATE FUNCTION will not check the referenced tables for existence.\n\nExamples\n--------\n\nTYPE OF and ROW TYPE OF from MariaDB 10.3:\n\nDECLARE tmp TYPE OF t1.a; -- Get the data type from the column {{a}} in the\ntable {{t1}}\n\nDECLARE rec1 ROW TYPE OF t1; -- Get the row data type from the table {{t1}}\n\nDECLARE rec2 ROW TYPE OF cur1; -- Get the row data type from the cursor\n{{cur1}}\n\nURL: https://mariadb.com/kb/en/declare-variable/','','https://mariadb.com/kb/en/declare-variable/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (299,24,'FOR','MariaDB starting with 10.3\n--------------------------\nFOR loops were introduced in MariaDB 10.3.\n\nSyntax\n------\n\nInteger range FOR loop:\n\n[begin_label:]\nFOR var_name IN [ REVERSE ] lower_bound .. upper_bound\nDO statement_list\nEND FOR [ end_label ]\n\nExplicit cursor FOR loop\n\n[begin_label:]\nFOR record_name IN cursor_name [ ( cursor_actual_parameter_list)]\nDO statement_list\nEND FOR [ end_label ]\n\nExplicit cursor FOR loop (Oracle mode)\n\n[begin_label:]\nFOR record_name IN cursor_name [ ( cursor_actual_parameter_list)]\nLOOP\n statement_list\nEND LOOP [ end_label ]\n\nImplicit cursor FOR loop\n\n[begin_label:]\nFOR record_name IN ( select_statement )\nDO statement_list\nEND FOR [ end_label ]\n\nDescription\n-----------\n\nFOR loops allow code to be executed a fixed number of times.\n\nIn an integer range FOR loop, MariaDB will compare the lower bound and upper\nbound values, and assign the lower bound value to a counter. If REVERSE is not\nspecified, and the upper bound value is greater than or equal to the counter,\nthe counter will be incremented and the statement will continue, after which\nthe loop is entered again. If the upper bound value is greater than the\ncounter, the loop will be exited.\n\nIf REVERSE is specified, the counter is decremented, and the upper bound value\nneeds to be less than or equal for the loop to continue.\n\nExamples\n--------\n\nIntger range FOR loop:\n\nCREATE TABLE t1 (a INT);\n\nDELIMITER //\n\nFOR i IN 1..3\nDO\n INSERT INTO t1 VALUES (i);\nEND FOR;\n//\n\nDELIMITER ;\n\nSELECT * FROM t1;\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n+------+\n\nREVERSE integer range FOR loop:\n\nCREATE OR REPLACE TABLE t1 (a INT);\n\nDELIMITER //\nFOR i IN REVERSE 4..12\n DO\n INSERT INTO t1 VALUES (i);\nEND FOR;\n//\nQuery OK, 9 rows affected (0.422 sec)\n\nDELIMITER ;\n\nSELECT * FROM t1;\n+------+\n| a |\n+------+\n| 12 |\n| 11 |\n| 10 |\n| 9 |\n| 8 |\n| 7 |\n| 6 |\n| 5 |\n| 4 |\n+------+\n\nExplicit cursor in Oracle mode:\n\nSET sql_mode=ORACLE;\n\nCREATE OR REPLACE TABLE t1 (a INT, b VARCHAR(32));\n\nINSERT INTO t1 VALUES (10,\'b0\');\nINSERT INTO t1 VALUES (11,\'b1\');\nINSERT INTO t1 VALUES (12,\'b2\');\n\nDELIMITER //\n\nCREATE OR REPLACE PROCEDURE p1(pa INT) AS \n CURSOR cur(va INT) IS\n SELECT a, b FROM t1 WHERE a=va;\nBEGIN\n FOR rec IN cur(pa)\n LOOP\n SELECT rec.a, rec.b;\n END LOOP;\nEND;\n//\n\nDELIMITER ;\n\nCALL p1(10);\n+-------+-------+\n| rec.a | rec.b |\n+-------+-------+\n| 10 | b0 |\n+-------+-------+\n\nCALL p1(11);\n+-------+-------+\n| rec.a | rec.b |\n+-------+-------+\n| 11 | b1 |\n+-------+-------+\n\nCALL p1(12);\n+-------+-------+\n| rec.a | rec.b |\n+-------+-------+\n| 12 | b2 |\n+-------+-------+\n\nCALL p1(13);\nQuery OK, 0 rows affected (0.000 sec)\n\nURL: https://mariadb.com/kb/en/for/','','https://mariadb.com/kb/en/for/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (300,24,'GOTO','MariaDB starting with 10.3\n--------------------------\nThe GOTO statement was introduced in MariaDB 10.3 for Oracle compatibility.\n\nSyntax\n------\n\nGOTO label\n\nDescription\n-----------\n\nThe GOTO statement causes the code to jump to the specified label, and\ncontinue operating from there. It is only accepted when in Oracle mode.\n\nExample\n-------\n\nSET sql_mode=ORACLE;\n\nDELIMITER //\n\nCREATE OR REPLACE PROCEDURE p1 AS\n\nBEGIN\n\nSELECT 1;\n GOTO label;\n SELECT 2;\n <<label>>\n SELECT 3;\n\nEND;\n\n//\n\nDELIMITER\n\ncall p1();\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n1 row in set (0.000 sec)\n\n+---+\n| 3 |\n+---+\n| 3 |\n+---+\n1 row in set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/goto/','','https://mariadb.com/kb/en/goto/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (301,24,'IF','Syntax\n------\n\nIF search_condition THEN statement_list\n [ELSEIF search_condition THEN statement_list] ...\n [ELSE statement_list]\nEND IF;\n\nDescription\n-----------\n\nIF implements a basic conditional construct. If the search_condition evaluates\nto true, the corresponding SQL statement list is executed. If no\nsearch_condition matches, the statement list in the ELSE clause is executed.\nEach statement_list consists of one or more statements.\n\nURL: https://mariadb.com/kb/en/if/','','https://mariadb.com/kb/en/if/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (302,24,'ITERATE','Syntax\n------\n\nITERATE label\n\nITERATE can appear only within LOOP, REPEAT, and WHILE statements. ITERATE\nmeans \"do the loop again\", and uses the statement\'s label to determine which\nstatements to repeat. The label must be in the same stored program, not in a\ncaller procedure.\n\nIf you try to use ITERATE with a non-existing label, or if the label is\nassociated to a construct which is not a loop, the following error will be\nproduced:\n\nERROR 1308 (42000): ITERATE with no matching label: <label_name>\n\nBelow is an example of how ITERATE might be used:\n\nCREATE PROCEDURE doiterate(p1 INT)\nBEGIN\n label1: LOOP\n SET p1 = p1 + 1;\n IF p1 < 10 THEN ITERATE label1; END IF;\n LEAVE label1;\n END LOOP label1;\n SET @x = p1;\nEND\n\nURL: https://mariadb.com/kb/en/iterate/','','https://mariadb.com/kb/en/iterate/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (303,24,'Labels','Syntax\n------\n\nlabel: <construct>\n[label]\n\nLabels are MariaDB identifiers which can be used to identify a BEGIN ... END\nconstruct or a loop. They have a maximum length of 16 characters and can be\nquoted with backticks (i.e.., `).\n\nLabels have a start part and an end part. The start part must precede the\nportion of code it refers to, must be followed by a colon (:) and can be on\nthe same or different line. The end part is optional and adds nothing, but can\nmake the code more readable. If used, the end part must precede the\nconstruct\'s delimiter (;). Constructs identified by a label can be nested.\nEach construct can be identified by only one label.\n\nLabels need not be unique in the stored program they belong to. However, a\nlabel for an inner loop cannot be identical to a label for an outer loop. In\nthis case, the following error would be produced:\n\nERROR 1309 (42000): Redefining label <label_name>\n\nLEAVE and ITERATE statements can be used to exit or repeat a portion of code\nidentified by a label. They must be in the same Stored Routine, Trigger or\nEvent which contains the target label.\n\nBelow is an example using a simple label that is used to exit a LOOP:\n\nCREATE PROCEDURE `test_sp`()\nBEGIN\n `my_label`:\n LOOP\n SELECT \'looping\';\n LEAVE `my_label`;\n END LOOP;\n SELECT \'out of loop\';\nEND;\n\nThe following label is used to exit a procedure, and has an end part:\n\nCREATE PROCEDURE `test_sp`()\n`my_label`:\nBEGIN\n IF @var = 1 THEN\n LEAVE `my_label`;\n END IF;\n DO something();\nEND `my_label`;\n\nURL: https://mariadb.com/kb/en/labels/','','https://mariadb.com/kb/en/labels/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (304,24,'LEAVE','Syntax\n------\n\nLEAVE label\n\nThis statement is used to exit the flow control construct that has the given\nlabel. The label must be in the same stored program, not in a caller\nprocedure. LEAVE can be used within BEGIN ... END or loop constructs (LOOP,\nREPEAT, WHILE). In Stored Procedures, Triggers and Events, LEAVE can refer to\nthe outmost BEGIN ... END construct; in that case, the program exits the\nprocedure. In Stored Functions, RETURN can be used instead.\n\nNote that LEAVE cannot be used to exit a DECLARE HANDLER block.\n\nIf you try to LEAVE a non-existing label, or if you try to LEAVE a HANDLER\nblock, the following error will be produced:\n\nERROR 1308 (42000): LEAVE with no matching label: <label_name>\n\nThe following example uses LEAVE to exit the procedure if a condition is true:\n\nCREATE PROCEDURE proc(IN p TINYINT)\nCONTAINS SQL\n`whole_proc`:\nBEGIN\n SELECT 1;\n IF p < 1 THEN\n LEAVE `whole_proc`;\n END IF;\n SELECT 2;\nEND;\n\nCALL proc(0);\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n\nURL: https://mariadb.com/kb/en/leave/','','https://mariadb.com/kb/en/leave/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (305,24,'LOOP','Syntax\n------\n\n[begin_label:] LOOP\n statement_list\nEND LOOP [end_label]\n\nDescription\n-----------\n\nLOOP implements a simple loop construct, enabling repeated execution of the\nstatement list, which consists of one or more statements, each terminated by a\nsemicolon (i.e., ;) statement delimiter. The statements within the loop are\nrepeated until the loop is exited; usually this is accomplished with a LEAVE\nstatement.\n\nA LOOP statement can be labeled. end_label cannot be given unless begin_label\nalso is present. If both are present, they must be the same.\n\nSee Delimiters in the mysql client for more on delimiter usage in the client.\n\nURL: https://mariadb.com/kb/en/loop/','','https://mariadb.com/kb/en/loop/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (306,24,'REPEAT LOOP','Syntax\n------\n\n[begin_label:] REPEAT\n statement_list\nUNTIL search_condition\nEND REPEAT [end_label]\n\nThe statement list within a REPEAT statement is repeated until the\nsearch_condition is true. Thus, a REPEAT always enters the loop at least once.\nstatement_list consists of one or more statements, each terminated by a\nsemicolon (i.e., ;) statement delimiter.\n\nA REPEAT statement can be labeled. end_label cannot be given unless\nbegin_label also is present. If both are present, they must be the same.\n\nSee Delimiters in the mysql client for more on client delimiter usage.\n\nDELIMITER //\n\nCREATE PROCEDURE dorepeat(p1 INT)\n BEGIN\n SET @x = 0;\n REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;\n END\n//\n\nCALL dorepeat(1000)//\n\nSELECT @x//\n+------+\n| @x |\n+------+\n| 1001 |\n+------+\n\nURL: https://mariadb.com/kb/en/repeat-loop/','','https://mariadb.com/kb/en/repeat-loop/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (307,24,'RESIGNAL','Syntax\n------\n\nRESIGNAL [error_condition]\n [SET error_property\n [, error_property] ...]\n\nerror_condition:\n SQLSTATE [VALUE] \'sqlstate_value\'\n | condition_name\n\nerror_property:\n error_property_name = <error_property_value>\n\nerror_property_name:\n CLASS_ORIGIN\n | SUBCLASS_ORIGIN\n | MESSAGE_TEXT\n | MYSQL_ERRNO\n | CONSTRAINT_CATALOG\n | CONSTRAINT_SCHEMA\n | CONSTRAINT_NAME\n | CATALOG_NAME\n | SCHEMA_NAME\n | TABLE_NAME\n | COLUMN_NAME\n | CURSOR_NAME\n\nDescription\n-----------\n\nThe syntax of RESIGNAL and its semantics are very similar to SIGNAL. This\nstatement can only be used within an error HANDLER. It produces an error, like\nSIGNAL. RESIGNAL clauses are the same as SIGNAL, except that they all are\noptional, even SQLSTATE. All the properties which are not specified in\nRESIGNAL, will be identical to the properties of the error that was received\nby the error HANDLER. For a description of the clauses, see diagnostics area.\n\nNote that RESIGNAL does not empty the diagnostics area: it just appends\nanother error condition.\n\nRESIGNAL, without any clauses, produces an error which is identical to the\nerror that was received by HANDLER.\n\nIf used out of a HANDLER construct, RESIGNAL produces the following error:\n\nERROR 1645 (0K000): RESIGNAL when handler not active\n\nIn MariaDB 5.5, if a HANDLER contained a CALL to another procedure, that\nprocedure could use RESIGNAL. Since MariaDB 10.0, trying to do this raises the\nabove error.\n\nFor a list of SQLSTATE values and MariaDB error codes, see MariaDB Error Codes.\n\nThe following procedure tries to query two tables which don\'t exist, producing\na 1146 error in both cases. Those errors will trigger the HANDLER. The first\ntime the error will be ignored and the client will not receive it, but the\nsecond time, the error is re-signaled, so the client will receive it.\n\nCREATE PROCEDURE test_error( )\nBEGIN\n DECLARE CONTINUE HANDLER\n FOR 1146\n BEGIN\n IF @hide_errors IS FALSE THEN\n RESIGNAL;\n END IF;\n END;\n SET @hide_errors = TRUE;\n SELECT \'Next error will be ignored\' AS msg;\n SELECT `c` FROM `temptab_one`;\n SELECT \'Next error won\'\'t be ignored\' AS msg;\n SET @hide_errors = FALSE;\n SELECT `c` FROM `temptab_two`;\nEND;\n\nCALL test_error( );\n\n+----------------------------+\n| msg |\n+----------------------------+\n| Next error will be ignored |\n+----------------------------+\n\n+-----------------------------+\n| msg |\n+-----------------------------+\n| Next error won\'t be ignored |\n+-----------------------------+\n\nERROR 1146 (42S02): Table \'test.temptab_two\' doesn\'t exist\n\nThe following procedure re-signals an error, modifying only the error message\nto clarify the cause of the problem.\n\nCREATE PROCEDURE test_error()\nBEGIN\n DECLARE CONTINUE HANDLER\n FOR 1146\n BEGIN\n RESIGNAL SET\n MESSAGE_TEXT = \'`temptab` does not exist\';\n END;\n SELECT `c` FROM `temptab`;\nEND;\n\nCALL test_error( );\nERROR 1146 (42S02): `temptab` does not exist\n\nAs explained above, this works on MariaDB 5.5, but produces a 1645 error since\n10.0.\n\nCREATE PROCEDURE handle_error()\nBEGIN\n RESIGNAL;\nEND;\nCREATE PROCEDURE p()\nBEGIN\n DECLARE EXIT HANDLER FOR SQLEXCEPTION CALL p();\n SIGNAL SQLSTATE \'45000\';\nEND;\n\nURL: https://mariadb.com/kb/en/resignal/','','https://mariadb.com/kb/en/resignal/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (308,24,'RETURN','Syntax\n------\n\nRETURN expr\n\nThe RETURN statement terminates execution of a stored function and returns the\nvalue expr to the function caller. There must be at least one RETURN statement\nin a stored function. If the function has multiple exit points, all exit\npoints must have a RETURN.\n\nThis statement is not used in stored procedures, triggers, or events. LEAVE\ncan be used instead.\n\nThe following example shows that RETURN can return the result of a scalar\nsubquery:\n\nCREATE FUNCTION users_count() RETURNS BOOL\n READS SQL DATA\nBEGIN\n RETURN (SELECT COUNT(DISTINCT User) FROM mysql.user);\nEND;\n\nURL: https://mariadb.com/kb/en/return/','','https://mariadb.com/kb/en/return/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (309,24,'SELECT INTO','Syntax\n------\n\nSELECT col_name [, col_name] ...\n INTO var_name [, var_name] ...\n table_expr\n\nDescription\n-----------\n\nSELECT ... INTO enables selected columns to be stored directly into variables.\nNo resultset is produced. The query should return a single row. If the query\nreturns no rows, a warning with error code 1329 occurs (No data), and the\nvariable values remain unchanged. If the query returns multiple rows, error\n1172 occurs (Result consisted of more than one row). If it is possible that\nthe statement may retrieve multiple rows, you can use LIMIT 1 to limit the\nresult set to a single row.\n\nThe INTO clause can also be specified at the end of the statement.\n\nIn the context of such statements that occur as part of events executed by the\nEvent Scheduler, diagnostics messages (not only errors, but also warnings) are\nwritten to the error log, and, on Windows, to the application event log.\n\nThis statement can be used with both local variables and user-defined\nvariables.\n\nFor the complete syntax, see SELECT.\n\nAnother way to set a variable\'s value is the SET statement.\n\nSELECT ... INTO results are not stored in the query cache even if SQL_CACHE is\nspecified.\n\nExamples\n--------\n\nSELECT id, data INTO @x,@y \nFROM test.t1 LIMIT 1;\nSELECT * from t1 where t1.a=@x and t1.b=@y\n\nIf you want to use this construct with UNION you have to use the syntax:\n\nSELECT * INTO @x FROM (SELECT t1.a FROM t1 UNION SELECT t2.a FROM t2);\n\nURL: https://mariadb.com/kb/en/selectinto/','','https://mariadb.com/kb/en/selectinto/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (310,24,'SIGNAL','Syntax\n------\n\nSIGNAL error_condition\n [SET error_property\n [, error_property] ...]\n\nerror_condition:\n SQLSTATE [VALUE] \'sqlstate_value\'\n | condition_name\n\nerror_property:\n error_property_name = <error_property_value>\n\nerror_property_name:\n CLASS_ORIGIN\n | SUBCLASS_ORIGIN\n | MESSAGE_TEXT\n | MYSQL_ERRNO\n | CONSTRAINT_CATALOG\n | CONSTRAINT_SCHEMA\n | CONSTRAINT_NAME\n | CATALOG_NAME\n | SCHEMA_NAME\n | TABLE_NAME\n | COLUMN_NAME\n | CURSOR_NAME\n\nSIGNAL empties the diagnostics area and produces a custom error. This\nstatement can be used anywhere, but is generally useful when used inside a\nstored program. When the error is produced, it can be caught by a HANDLER. If\nnot, the current stored program, or the current statement, will terminate with\nthe specified error.\n\nSometimes an error HANDLER just needs to SIGNAL the same error it received,\noptionally with some changes. Usually the RESIGNAL statement is the most\nconvenient way to do this.\n\nerror_condition can be an SQLSTATE value or a named error condition defined\nvia DECLARE CONDITION. SQLSTATE must be a constant string consisting of five\ncharacters. These codes are standard to ODBC and ANSI SQL. For customized\nerrors, the recommended SQLSTATE is \'45000\'. For a list of SQLSTATE values\nused by MariaDB, see the MariaDB Error Codes page. The SQLSTATE can be read\nvia the API method mysql_sqlstate( ).\n\nTo specify error properties user-defined variables and local variables can be\nused, as well as character set conversions (but you can\'t set a collation).\n\nThe error properties, their type and their default values are explained in the\ndiagnostics area page.\n\nErrors\n------\n\nIf the SQLSTATE is not valid, the following error like this will be produced:\n\nERROR 1407 (42000): Bad SQLSTATE: \'123456\'\n\nIf a property is specified more than once, an error like this will be produced:\n\nERROR 1641 (42000): Duplicate condition information item \'MESSAGE_TEXT\'\n\nIf you specify a condition name which is not declared, an error like this will\nbe produced:\n\nERROR 1319 (42000): Undefined CONDITION: cond_name\n\nIf MYSQL_ERRNO is out of range, you will get an error like this:\n\nERROR 1231 (42000): Variable \'MYSQL_ERRNO\' can\'t be set to the value of \'0\'\n\nExamples\n--------\n\nHere\'s what happens if SIGNAL is used in the client to generate errors:\n\nSIGNAL SQLSTATE \'01000\';\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n\n+---------+------+------------------------------------------+\n| Level | Code | Message |\n+---------+------+------------------------------------------+\n| Warning | 1642 | Unhandled user-defined warning condition |\n+---------+------+------------------------------------------+\n1 row in set (0.06 sec)\n\nSIGNAL SQLSTATE \'02000\';\nERROR 1643 (02000): Unhandled user-defined not found condition\n\nHow to specify MYSQL_ERRNO and MESSAGE_TEXT properties:\n\nSIGNAL SQLSTATE \'45000\' SET MYSQL_ERRNO=30001, MESSAGE_TEXT=\'H\nello, world!\';\n\nERROR 30001 (45000): Hello, world!\n\nThe following code shows how to use user variables, local variables and\ncharacter set conversion with SIGNAL:\n\nCREATE PROCEDURE test_error(x INT)\nBEGIN\n DECLARE errno SMALLINT UNSIGNED DEFAULT 31001;\n SET @errmsg = \'Hello, world!\';\n IF x = 1 THEN\n SIGNAL SQLSTATE \'45000\' SET\n MYSQL_ERRNO = errno,\n MESSAGE_TEXT = @errmsg;\n ELSE\n SIGNAL SQLSTATE \'45000\' SET\n MYSQL_ERRNO = errno,\n MESSAGE_TEXT = _utf8\'Hello, world!\';\n END IF;\nEND;\n\nHow to use named error conditions:\n\nCREATE PROCEDURE test_error(n INT)\nBEGIN\n DECLARE `too_big` CONDITION FOR SQLSTATE \'45000\';\n IF n > 10 THEN\n SIGNAL `too_big`;\n END IF;\nEND;\n\nIn this example, we\'ll define a HANDLER for an error code. When the error\noccurs, we SIGNAL a more informative error which makes sense for our procedure:\n\nCREATE PROCEDURE test_error()\nBEGIN\n DECLARE EXIT HANDLER\n FOR 1146\n BEGIN\n SIGNAL SQLSTATE \'45000\' SET\n MESSAGE_TEXT = \'Temporary tables not found; did you call init()\nprocedure?\';\n END;\n -- this will produce a 1146 error\n SELECT `c` FROM `temptab`;\nEND;\n\nURL: https://mariadb.com/kb/en/signal/','','https://mariadb.com/kb/en/signal/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (311,24,'WHILE','Syntax\n------\n\n[begin_label:] WHILE search_condition DO\n statement_list\nEND WHILE [end_label]\n\nDescription\n-----------\n\nThe statement list within a WHILE statement is repeated as long as the\nsearch_condition is true. statement_list consists of one or more statements.\nIf the loop must be executed at least once, REPEAT ... LOOP can be used\ninstead.\n\nA WHILE statement can be labeled. end_label cannot be given unless begin_label\nalso is present. If both are present, they must be the same.\n\nExamples\n--------\n\nCREATE PROCEDURE dowhile()\nBEGIN\n DECLARE v1 INT DEFAULT 5;\n\nWHILE v1 > 0 DO\n ...\n SET v1 = v1 - 1;\n END WHILE;\nEND\n\nURL: https://mariadb.com/kb/en/while/','','https://mariadb.com/kb/en/while/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (312,24,'Cursor Overview','Description\n-----------\n\nA cursor is a structure that allows you to go over records sequentially, and\nperform processing based on the result.\n\nMariaDB permits cursors inside stored programs, and MariaDB cursors are\nnon-scrollable, read-only and asensitive.\n\n* Non-scrollable means that the rows can only be fetched in the order\nspecified by the SELECT statement. Rows cannot be skipped, you cannot jump to\na specific row, and you cannot fetch rows in reverse order.\n* Read-only means that data cannot be updated through the cursor.\n* Asensitive means that the cursor points to the actual underlying data. This\nkind of cursor is quicker than the alternative, an insensitive cursor, as no\ndata is copied to a temporary table. However, changes to the data being used\nby the cursor will affect the cursor data.\n\nCursors are created with a DECLARE CURSOR statement and opened with an OPEN\nstatement. Rows are read with a FETCH statement before the cursor is finally\nclosed with a CLOSE statement.\n\nWhen FETCH is issued and there are no more rows to extract, the following\nerror is produced:\n\nERROR 1329 (02000): No data - zero rows fetched, selected, or processed\n\nTo avoid problems, a DECLARE HANDLER statement is generally used. The HANDLER\nshould handler the 1329 error, or the \'02000\' SQLSTATE, or the NOT FOUND error\nclass.\n\nOnly SELECT statements are allowed for cursors, and they cannot be contained\nin a variable - so, they cannot be composed dynamically. However, it is\npossible to SELECT from a view. Since the CREATE VIEW statement can be\nexecuted as a prepared statement, it is possible to dynamically create the\nview that is queried by the cursor.\n\nFrom MariaDB 10.3.0, cursors can have parameters. Cursor parameters can appear\nin any part of the DECLARE CURSOR select_statement where a stored procedure\nvariable is allowed (select list, WHERE, HAVING, LIMIT etc). See DECLARE\nCURSOR and OPEN for syntax, and below for an example:\n\nExamples\n--------\n\nCREATE TABLE c1(i INT);\n\nCREATE TABLE c2(i INT);\n\nCREATE TABLE c3(i INT);\n\nDELIMITER //\n\nCREATE PROCEDURE p1()\nBEGIN\n DECLARE done INT DEFAULT FALSE;\n DECLARE x, y INT;\n DECLARE cur1 CURSOR FOR SELECT i FROM test.c1;\n DECLARE cur2 CURSOR FOR SELECT i FROM test.c2;\n DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;\n\nOPEN cur1;\n OPEN cur2;\n\nread_loop: LOOP\n FETCH cur1 INTO x;\n FETCH cur2 INTO y;\n IF done THEN\n LEAVE read_loop;\n END IF;\n IF x < y THEN\n INSERT INTO test.c3 VALUES (x);\n ELSE\n INSERT INTO test.c3 VALUES (y);\n END IF;\n END LOOP;\n\nCLOSE cur1;\n CLOSE cur2;\nEND; //\n\nDELIMITER ;\n\nINSERT INTO c1 VALUES(5),(50),(500);\n\nINSERT INTO c2 VALUES(10),(20),(30);\n\nCALL p1;\n\nSELECT * FROM c3;\n+------+\n| i |\n+------+\n| 5 |\n| 20 |\n| 30 |\n+------+\n\nFrom MariaDB 10.3.0\n\nDROP PROCEDURE IF EXISTS p1;\nDROP TABLE IF EXISTS t1;\nCREATE TABLE t1 (a INT, b VARCHAR(10));\n\nINSERT INTO t1 VALUES (1,\'old\'),(2,\'old\'),(3,\'old\'),(4,\'old\'),(5,\'old\');\n\nDELIMITER //\n\nCREATE PROCEDURE p1(min INT,max INT)\nBEGIN\n DECLARE done INT DEFAULT FALSE;\n DECLARE va INT;\n DECLARE cur CURSOR(pmin INT, pmax INT) FOR SELECT a FROM t1 WHERE a BETWEEN\npmin AND pmax;\n DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;\n OPEN cur(min,max);\n read_loop: LOOP\n FETCH cur INTO va;\n IF done THEN\n LEAVE read_loop;\n END IF;\n INSERT INTO t1 VALUES (va,\'new\');\n END LOOP;\n CLOSE cur;\nEND;\n//\n\nDELIMITER ;\n\nCALL p1(2,4);\n\nSELECT * FROM t1;\n+------+------+\n| a | b |\n+------+------+\n| 1 | old |\n| 2 | old |\n| 3 | old |\n| 4 | old |\n| 5 | old |\n| 2 | new |\n| 3 | new |\n| 4 | new |\n+------+------+\n\nURL: https://mariadb.com/kb/en/cursor-overview/','','https://mariadb.com/kb/en/cursor-overview/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (313,24,'DECLARE CURSOR','Syntax\n------\n\n<= MariaDB 10.2\n\nDECLARE cursor_name CURSOR FOR select_statement\n\nFrom MariaDB 10.3\n\nDECLARE cursor_name CURSOR [(cursor_formal_parameter[,...])] FOR\nselect_statement\n\ncursor_formal_parameter:\n name type [collate clause]\n\nFrom MariaDB 10.8\n\nDECLARE cursor_name CURSOR [(cursor_formal_parameter[,...])] FOR\nselect_statement\n\ncursor_formal_parameter:\n [IN] name type [collate clause]\n\nDescription\n-----------\n\nThis statement declares a cursor. Multiple cursors may be declared in a stored\nprogram, but each cursor in a given block must have a unique name.\n\nselect_statement is not executed until the OPEN statement is executed. It is\nimportant to remember this if the query produces an error, or calls functions\nwhich have side effects.\n\nA SELECT associated to a cursor can use variables, but the query itself cannot\nbe a variable, and cannot be dynamically composed. The SELECT statement cannot\nhave an INTO clause.\n\nCursors must be declared before HANDLERs, but after local variables and\nCONDITIONs.\n\nParameters\n----------\n\nMariaDB starting with 10.3.0\n----------------------------\nFrom MariaDB 10.3.0, cursors can have parameters. This is a non-standard SQL\nextension. Cursor parameters can appear in any part of the DECLARE CURSOR\nselect_statement where a stored procedure variable is allowed (select list,\nWHERE, HAVING, LIMIT etc).\n\nIN\n--\n\nMariaDB starting with 10.8.0\n----------------------------\nFrom MariaDB 10.8.0 preview release, the IN qualifier is supported in the\ncursor_format_parameter part of the syntax.\n\nSee Cursor Overview for an example.\n\nURL: https://mariadb.com/kb/en/declare-cursor/','','https://mariadb.com/kb/en/declare-cursor/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (314,24,'OPEN','Syntax\n------\n\n<= MariaDB 10.2\n\nOPEN cursor_name\n\nFrom MariaDB 10.3\n\nOPEN cursor_name [expression[,...]];\n\nDescription\n-----------\n\nThis statement opens a cursor which was previously declared with DECLARE\nCURSOR.\n\nThe query associated to the DECLARE CURSOR is executed when OPEN is executed.\nIt is important to remember this if the query produces an error, or calls\nfunctions which have side effects.\n\nThis is necessary in order to FETCH rows from a cursor.\n\nSee Cursor Overview for an example.\n\nURL: https://mariadb.com/kb/en/open/','','https://mariadb.com/kb/en/open/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (315,24,'FETCH','Syntax\n------\n\nFETCH cursor_name INTO var_name [, var_name] ...\n\nDescription\n-----------\n\nThis statement fetches the next row (if a row exists) using the specified open\ncursor, and advances the cursor pointer.\n\nvar_name can be a local variable, but not a user-defined variable.\n\nIf no more rows are available, a No Data condition occurs with SQLSTATE value\n02000. To detect this condition, you can set up a handler for it (or for a NOT\nFOUND condition).\n\nSee Cursor Overview for an example.\n\nURL: https://mariadb.com/kb/en/fetch/','','https://mariadb.com/kb/en/fetch/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (316,24,'CLOSE','Syntax\n------\n\nCLOSE cursor_name\n\nDescription\n-----------\n\nThis statement closes a previously opened cursor. The cursor must have been\npreviously opened or else an error occurs.\n\nIf not closed explicitly, a cursor is closed at the end of the compound\nstatement in which it was declared.\n\nSee Cursor Overview for an example.\n\nURL: https://mariadb.com/kb/en/close/','','https://mariadb.com/kb/en/close/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (317,25,'BUFFER','A synonym for ST_BUFFER.\n\nURL: https://mariadb.com/kb/en/buffer/','','https://mariadb.com/kb/en/buffer/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (318,25,'CONVEXHULL','A synonym for ST_CONVEXHULL.\n\nURL: https://mariadb.com/kb/en/convexhull/','','https://mariadb.com/kb/en/convexhull/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (319,25,'GEOMETRYCOLLECTION','Syntax\n------\n\nGeometryCollection(g1,g2,...)\n\nDescription\n-----------\n\nConstructs a WKB GeometryCollection. If any argument is not a well-formed WKB\nrepresentation of a geometry, the return value is NULL.\n\nExamples\n--------\n\nCREATE TABLE gis_geometrycollection (g GEOMETRYCOLLECTION);\nSHOW FIELDS FROM gis_geometrycollection;\nINSERT INTO gis_geometrycollection VALUES\n (GeomCollFromText(\'GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10\n10))\')),\n (GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6),\nLineString(Point(3, 6), Point(7, 9)))))),\n (GeomFromText(\'GeometryCollection()\')),\n (GeomFromText(\'GeometryCollection EMPTY\'));\n\nURL: https://mariadb.com/kb/en/geometrycollection/','','https://mariadb.com/kb/en/geometrycollection/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (320,25,'LINESTRING','Syntax\n------\n\nLineString(pt1,pt2,...)\n\nDescription\n-----------\n\nConstructs a WKB LineString value from a number of WKB Point arguments. If any\nargument is not a WKB Point, the return value is NULL. If the number of Point\narguments is less than two, the return value is NULL.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT AsText(EndPoint(GeomFromText(@ls)));\n+-------------------------------------+\n| AsText(EndPoint(GeomFromText(@ls))) |\n+-------------------------------------+\n| POINT(3 3) |\n+-------------------------------------+\n\nCREATE TABLE gis_line (g LINESTRING);\nINSERT INTO gis_line VALUES\n (LineFromText(\'LINESTRING(0 0,0 10,10 0)\')),\n (LineStringFromText(\'LINESTRING(10 10,20 10,20 20,10 20,10 10)\')),\n (LineStringFromWKB(AsWKB(LineString(Point(10, 10), Point(40, 10)))));\n\nURL: https://mariadb.com/kb/en/linestring/','','https://mariadb.com/kb/en/linestring/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (321,25,'MULTILINESTRING','Syntax\n------\n\nMultiLineString(ls1,ls2,...)\n\nDescription\n-----------\n\nConstructs a WKB MultiLineString value using WKB LineString arguments. If any\nargument is not a WKB LineString, the return value is NULL.\n\nExample\n-------\n\nCREATE TABLE gis_multi_line (g MULTILINESTRING);\nINSERT INTO gis_multi_line VALUES\n (MultiLineStringFromText(\'MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16\n48))\')),\n (MLineFromText(\'MULTILINESTRING((10 48,10 21,10 0))\')),\n (MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2), \n Point(3, 5)), LineString(Point(2, 5),Point(5, 8),Point(21, 7))))));\n\nURL: https://mariadb.com/kb/en/multilinestring/','','https://mariadb.com/kb/en/multilinestring/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (322,25,'MULTIPOINT','Syntax\n------\n\nMultiPoint(pt1,pt2,...)\n\nDescription\n-----------\n\nConstructs a WKB MultiPoint value using WKB Point arguments. If any argument\nis not a WKB Point, the return value is NULL.\n\nExamples\n--------\n\nSET @g = ST_GEOMFROMTEXT(\'MultiPoint( 1 1, 2 2, 5 3, 7 2, 9 3, 8 4, 6 6, 6 9,\n4 9, 1 5 )\');\n\nCREATE TABLE gis_multi_point (g MULTIPOINT);\nINSERT INTO gis_multi_point VALUES\n (MultiPointFromText(\'MULTIPOINT(0 0,10 10,10 20,20 20)\')),\n (MPointFromText(\'MULTIPOINT(1 1,11 11,11 21,21 21)\')),\n (MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));\n\nURL: https://mariadb.com/kb/en/multipoint/','','https://mariadb.com/kb/en/multipoint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (323,25,'MULTIPOLYGON','Syntax\n------\n\nMultiPolygon(poly1,poly2,...)\n\nDescription\n-----------\n\nConstructs a WKB MultiPolygon value from a set of WKB Polygon arguments. If\nany argument is not a WKB Polygon, the return value is NULL.\n\nExample\n-------\n\nCREATE TABLE gis_multi_polygon (g MULTIPOLYGON);\nINSERT INTO gis_multi_polygon VALUES\n (MultiPolygonFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52\n18,66 23,73 9,48 6,52 18)),\n ((59 18,67 18,67 13,59 13,59 18)))\')),\n (MPolyFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66\n23,73 9,48 6,52 18)),\n ((59 18,67 18,67 13,59 13,59 18)))\')),\n (MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(\n Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));\n\nURL: https://mariadb.com/kb/en/multipolygon/','','https://mariadb.com/kb/en/multipolygon/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (324,25,'POINT','Syntax\n------\n\nPoint(x,y)\n\nDescription\n-----------\n\nConstructs a WKB Point using the given coordinates.\n\nExamples\n--------\n\nSET @g = ST_GEOMFROMTEXT(\'Point(1 1)\');\n\nCREATE TABLE gis_point (g POINT);\nINSERT INTO gis_point VALUES\n (PointFromText(\'POINT(10 10)\')),\n (PointFromText(\'POINT(20 10)\')),\n (PointFromText(\'POINT(20 20)\')),\n (PointFromWKB(AsWKB(PointFromText(\'POINT(10 20)\'))));\n\nURL: https://mariadb.com/kb/en/point/','','https://mariadb.com/kb/en/point/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (325,25,'PointOnSurface','A synonym for ST_PointOnSurface.\n\nURL: https://mariadb.com/kb/en/pointonsurface/','','https://mariadb.com/kb/en/pointonsurface/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (326,25,'POLYGON','Syntax\n------\n\nPolygon(ls1,ls2,...)\n\nDescription\n-----------\n\nConstructs a WKB Polygon value from a number of WKB LineString arguments. If\nany argument does not represent the WKB of a LinearRing (that is, not a closed\nand simple LineString) the return value is NULL.\n\nNote that according to the OpenGIS standard, a POLYGON should have exactly one\nExteriorRing and all other rings should lie within that ExteriorRing and thus\nbe the InteriorRings. Practically, however, some systems, including MariaDB\'s,\npermit polygons to have several \'ExteriorRings\'. In the case of there being\nmultiple, non-overlapping exterior rings ST_NUMINTERIORRINGS() will return 1.\n\nExamples\n--------\n\nSET @g = ST_GEOMFROMTEXT(\'POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1 1))\');\n\nCREATE TABLE gis_polygon (g POLYGON);\nINSERT INTO gis_polygon VALUES\n (PolygonFromText(\'POLYGON((10 10,20 10,20 20,10 20,10 10))\')),\n (PolyFromText(\'POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10\n20,10 10))\')),\n (PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30,\n30), Point(0, 0))))));\n\nNon-overlapping \'polygon\':\n\nSELECT ST_NumInteriorRings(ST_PolyFromText(\'POLYGON((0 0,10 0,10 10,0 10,0 0),\n (-1 -1,-5 -1,-5 -5,-1 -5,-1 -1))\')) AS NumInteriorRings;\n+------------------+\n| NumInteriorRings |\n+------------------+\n| 1 |\n+------------------+\n\nURL: https://mariadb.com/kb/en/polygon/','','https://mariadb.com/kb/en/polygon/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (327,25,'ST_BUFFER','Syntax\n------\n\nST_BUFFER(g1,r)\nBUFFER(g1,r)\n\nDescription\n-----------\n\nReturns a geometry that represents all points whose distance from geometry g1\nis less than or equal to distance, or radius, r.\n\nUses for this function could include creating for example a new geometry\nrepresenting a buffer zone around an island.\n\nBUFFER() is a synonym.\n\nExamples\n--------\n\nDetermining whether a point is within a buffer zone:\n\nSET @g1 = ST_GEOMFROMTEXT(\'POLYGON((10 10, 10 20, 20 20, 20 10, 10 10))\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'POINT(8 8)\');\n\nSELECT ST_WITHIN(@g2,ST_BUFFER(@g1,5));\n+---------------------------------+\n| ST_WITHIN(@g2,ST_BUFFER(@g1,5)) |\n+---------------------------------+\n| 1 |\n+---------------------------------+\n\nSELECT ST_WITHIN(@g2,ST_BUFFER(@g1,1));\n+---------------------------------+\n| ST_WITHIN(@g2,ST_BUFFER(@g1,1)) |\n+---------------------------------+\n| 0 |\n+---------------------------------+\n\nURL: https://mariadb.com/kb/en/st_buffer/','','https://mariadb.com/kb/en/st_buffer/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (328,25,'ST_CONVEXHULL','MariaDB starting with 10.1.2\n----------------------------\nST_ConvexHull() was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_ConvexHull(g)\nConvexHull(g)\n\nDescription\n-----------\n\nGiven a geometry, returns a geometry that is the minimum convex geometry\nenclosing all geometries within the set. Returns NULL if the geometry value is\nNULL or an empty value.\n\nST_ConvexHull() and ConvexHull() are synonyms.\n\nExamples\n--------\n\nThe ConvexHull of a single point is simply the single point:\n\nSET @g = ST_GEOMFROMTEXT(\'Point(0 0)\');\n\nSELECT ST_ASTEXT(ST_CONVEXHULL(@g));\n+------------------------------+\n| ST_ASTEXT(ST_CONVEXHULL(@g)) |\n+------------------------------+\n| POINT(0 0) |\n+------------------------------+\n\nSET @g = ST_GEOMFROMTEXT(\'MultiPoint(0 0, 1 2, 2 3)\');\n\nSELECT ST_ASTEXT(ST_CONVEXHULL(@g));\n+------------------------------+\n| ST_ASTEXT(ST_CONVEXHULL(@g)) |\n+------------------------------+\n| POLYGON((0 0,1 2,2 3,0 0)) |\n+------------------------------+\n\nSET @g = ST_GEOMFROMTEXT(\'MultiPoint( 1 1, 2 2, 5 3, 7 2, 9 3, 8 4, 6 6, 6 9,\n4 9, 1 5 )\');\n\nSELECT ST_ASTEXT(ST_CONVEXHULL(@g));\n+----------------------------------------+\n| ST_ASTEXT(ST_CONVEXHULL(@g)) |\n+----------------------------------------+\n| POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1 1)) |\n+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_convexhull/','','https://mariadb.com/kb/en/st_convexhull/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (329,25,'ST_INTERSECTION','Syntax\n------\n\nST_INTERSECTION(g1,g2)\n\nDescription\n-----------\n\nReturns a geometry that is the intersection, or shared portion, of geometry g1\nand geometry g2.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 1)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 1, 0 2)\');\n\nSELECT ASTEXT(ST_INTERSECTION(@g1,@g2));\n+----------------------------------+\n| ASTEXT(ST_INTERSECTION(@g1,@g2)) |\n+----------------------------------+\n| POINT(2 1) |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/st_intersection/','','https://mariadb.com/kb/en/st_intersection/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (330,25,'ST_POINTONSURFACE','MariaDB starting with 10.1.2\n----------------------------\nST_POINTONSURFACE() was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_PointOnSurface(g)\nPointOnSurface(g)\n\nDescription\n-----------\n\nGiven a geometry, returns a POINT guaranteed to intersect a surface. However,\nsee MDEV-7514.\n\nST_PointOnSurface() and PointOnSurface() are synonyms.\n\nURL: https://mariadb.com/kb/en/st_pointonsurface/','','https://mariadb.com/kb/en/st_pointonsurface/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (331,25,'ST_SYMDIFFERENCE','Syntax\n------\n\nST_SYMDIFFERENCE(g1,g2)\n\nDescription\n-----------\n\nReturns a geometry that represents the portions of geometry g1 and geometry g2\nthat don\'t intersect.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(10 20, 10 40)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(10 15, 10 25)\');\n\nSELECT ASTEXT(ST_SYMDIFFERENCE(@g1,@g2));\n+----------------------------------------------+\n| ASTEXT(ST_SYMDIFFERENCE(@g1,@g2)) |\n+----------------------------------------------+\n| MULTILINESTRING((10 15,10 20),(10 25,10 40)) |\n+----------------------------------------------+\n\nSET @g2 = ST_GeomFromText(\'LINESTRING(10 20, 10 41)\');\n\nSELECT ASTEXT(ST_SYMDIFFERENCE(@g1,@g2));\n+-----------------------------------+\n| ASTEXT(ST_SYMDIFFERENCE(@g1,@g2)) |\n+-----------------------------------+\n| LINESTRING(10 40,10 41) |\n+-----------------------------------+\n\nURL: https://mariadb.com/kb/en/st_symdifference/','','https://mariadb.com/kb/en/st_symdifference/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (332,25,'ST_UNION','Syntax\n------\n\nST_UNION(g1,g2)\n\nDescription\n-----------\n\nReturns a geometry that is the union of the geometry g1 and geometry g2.\n\nExamples\n--------\n\nSET @g1 = GEOMFROMTEXT(\'POINT (0 2)\');\n\nSET @g2 = GEOMFROMTEXT(\'POINT (2 0)\');\n\nSELECT ASTEXT(ST_UNION(@g1,@g2));\n+---------------------------+\n| ASTEXT(ST_UNION(@g1,@g2)) |\n+---------------------------+\n| MULTIPOINT(2 0,0 2) |\n+---------------------------+\n\nSET @g1 = GEOMFROMTEXT(\'POLYGON((0 0,0 3,3 3,3 0,0 0))\');\n\nSET @g2 = GEOMFROMTEXT(\'POLYGON((2 2,4 2,4 4,2 4,2 2))\');\n\nSELECT ASTEXT(ST_UNION(@g1,@g2));\n+------------------------------------------------+\n| ASTEXT(ST_UNION(@g1,@g2)) |\n+------------------------------------------------+\n| POLYGON((0 0,0 3,2 3,2 4,4 4,4 2,3 2,3 0,0 0)) |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_union/','','https://mariadb.com/kb/en/st_union/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (333,26,'SHOW GRANTS','Syntax\n------\n\nSHOW GRANTS [FOR user|role]\n\nDescription\n-----------\n\nThe SHOW GRANTS statement lists privileges granted to a particular user or\nrole.\n\nUsers\n-----\n\nThe statement lists the GRANT statement or statements that must be issued to\nduplicate the privileges that are granted to a MariaDB user account. The\naccount is named using the same format as for the GRANT statement; for\nexample, \'jeffrey\'@\'localhost\'. If you specify only the user name part of the\naccount name, a host name part of \'%\' is used. For additional information\nabout specifying account names, see GRANT.\n\nSHOW GRANTS FOR \'root\'@\'localhost\';\n+---------------------------------------------------------------------+\n| Grants for root@localhost |\n+---------------------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'root\'@\'localhost\' WITH GRANT OPTION |\n+---------------------------------------------------------------------+\n\nTo list the privileges granted to the account that you are using to connect to\nthe server, you can use any of the following statements:\n\nSHOW GRANTS;\nSHOW GRANTS FOR CURRENT_USER;\nSHOW GRANTS FOR CURRENT_USER();\n\nIf SHOW GRANTS FOR CURRENT_USER (or any of the equivalent syntaxes) is used in\nDEFINER context (such as within a stored procedure that is defined with SQL\nSECURITY DEFINER), the grants displayed are those of the definer and not the\ninvoker.\n\nNote that the DELETE HISTORY privilege, introduced in MariaDB 10.3.4, was\ndisplayed as DELETE VERSIONING ROWS when running SHOW GRANTS until MariaDB\n10.3.15 (MDEV-17655).\n\nRoles\n-----\n\nSHOW GRANTS can also be used to view the privileges granted to a role.\n\nExample\n-------\n\nSHOW GRANTS FOR journalist;\n+------------------------------------------+\n| Grants for journalist |\n+------------------------------------------+\n| GRANT USAGE ON *.* TO \'journalist\' |\n| GRANT DELETE ON `test`.* TO \'journalist\' |\n+------------------------------------------+\n\nFOR PUBLIC\n----------\n\nMariaDB starting with 10.11\n---------------------------\nGRANT ... TO PUBLIC was introduced in MariaDB 10.11 to grant privileges to all\nusers. SHOW GRANTS FOR PUBLIC shows all these grants.\n\nSHOW GRANTS FOR public;\n+------------------------------------------------+\n| Grants for PUBLIC |\n+------------------------------------------------+\n| GRANT ALL PRIVILEGES ON `dev_db`.* TO `PUBLIC` |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-grants/','','https://mariadb.com/kb/en/show-grants/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (334,26,'SHOW CREATE USER','Syntax\n------\n\nSHOW CREATE USER user_name\n\nDescription\n-----------\n\nShows the CREATE USER statement that created the given user. The statement\nrequires the SELECT privilege for the mysql database, except for the current\nuser.\n\nExamples\n--------\n\nCREATE USER foo4@test require cipher \'text\' \n issuer \'foo_issuer\' subject \'foo_subject\';\n\nSHOW CREATE USER foo4@test\\G\n*************************** 1. row ***************************\nCREATE USER \'foo4\'@\'test\' \n REQUIRE ISSUER \'foo_issuer\'\n SUBJECT \'foo_subject\'\n CIPHER \'text\'\n\nUser Password Expiry:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\n\nSHOW CREATE USER \'monty\'@\'localhost\';\n+------------------------------------------------------------------+\n| CREATE USER for monty@localhost |\n+------------------------------------------------------------------+\n| CREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY |\n+------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-create-user/','','https://mariadb.com/kb/en/show-create-user/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (335,26,'SHOW COLUMNS','Syntax\n------\n\nSHOW [FULL] {COLUMNS | FIELDS} FROM tbl_name [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW COLUMNS displays information about the columns in a given table. It also\nworks for views. The LIKE clause, if present on its own, indicates which\ncolumn names to match. The WHERE and LIKE clauses can be given to select rows\nusing more general conditions, as discussed in Extended SHOW.\n\nIf the data types differ from what you expect them to be based on a CREATE\nTABLE statement, note that MariaDB sometimes changes data types when you\ncreate or alter a table. The conditions under which this occurs are described\nin the Silent Column Changes article.\n\nThe FULL keyword causes the output to include the column collation and\ncomments, as well as the privileges you have for each column.\n\nYou can use db_name.tbl_name as an alternative to the tbl_name FROM db_name\nsyntax. In other words, these two statements are equivalent:\n\nSHOW COLUMNS FROM mytable FROM mydb;\nSHOW COLUMNS FROM mydb.mytable;\n\nSHOW COLUMNS displays the following values for each table column:\n\nField indicates the column name.\n\nType indicates the column data type.\n\nCollation indicates the collation for non-binary string columns, or NULL for\nother columns. This value is displayed only if you use the FULL keyword.\n\nThe Null field contains YES if NULL values can be stored in the column, NO if\nnot.\n\nThe Key field indicates whether the column is indexed:\n\n* If Key is empty, the column either is not indexed or is indexed only as a\n secondary column in a multiple-column, non-unique index.\n* If Key is PRI, the column is a PRIMARY KEY or\n is one of the columns in a multiple-column PRIMARY KEY.\n* If Key is UNI, the column is the first column of a unique-valued\n index that cannot contain NULL values.\n* If Key is MUL, multiple occurrences of a given value are allowed\n within the column. The column is the first column of a non-unique index or a\n unique-valued index that can contain NULL values.\n\nIf more than one of the Key values applies to a given column of a table, Key\ndisplays the one with the highest priority, in the order PRI, UNI, MUL.\n\nA UNIQUE index may be displayed as PRI if it cannot contain NULL values and\nthere is no PRIMARY KEY in the table. A UNIQUE index may display as MUL if\nseveral columns form a composite UNIQUE index; although the combination of the\ncolumns is unique, each column can still hold multiple occurrences of a given\nvalue.\n\nThe Default field indicates the default value that is assigned to the column.\n\nThe Extra field contains any additional information that is available about a\ngiven column.\n\n+------------------------+---------------------------------------------------+\n| Value | Description |\n+------------------------+---------------------------------------------------+\n| AUTO_INCREMENT | The column was created with the AUTO_INCREMENT |\n| | keyword. |\n+------------------------+---------------------------------------------------+\n| PERSISTENT | The column was created with the PERSISTENT |\n| | keyword. (New in 5.3) |\n+------------------------+---------------------------------------------------+\n| VIRTUAL | The column was created with the VIRTUAL keyword. |\n| | (New in 5.3) |\n+------------------------+---------------------------------------------------+\n| on update | The column is a TIMESTAMP column that is |\n| CURRENT_TIMESTAMP | automatically updated on INSERT and UPDATE. |\n+------------------------+---------------------------------------------------+\n\nPrivileges indicates the privileges you have for the column. This value is\ndisplayed only if you use the FULL keyword.\n\nComment indicates any comment the column has. This value is displayed only if\nyou use the FULL keyword.\n\nSHOW FIELDS is a synonym for SHOW COLUMNS. Also DESCRIBE and EXPLAIN can be\nused as shortcuts.\n\nYou can also list a table\'s columns with:\n\nmysqlshow db_name tbl_name\n\nSee the mysqlshow command for more details.\n\nThe DESCRIBE statement provides information similar to SHOW COLUMNS. The\ninformation_schema.COLUMNS table provides similar, but more complete,\ninformation.\n\nThe SHOW CREATE TABLE, SHOW TABLE STATUS, and SHOW INDEX statements also\nprovide information about tables.\n\nExamples\n--------\n\nSHOW COLUMNS FROM city;\n+------------+----------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+------------+----------+------+-----+---------+----------------+\n| Id | int(11) | NO | PRI | NULL | auto_increment |\n| Name | char(35) | NO | | | |\n| Country | char(3) | NO | UNI | | |\n| District | char(20) | YES | MUL | | |\n| Population | int(11) | NO | | 0 | |\n+------------+----------+------+-----+---------+----------------+\n\nSHOW COLUMNS FROM employees WHERE Type LIKE \'Varchar%\';\n+---------------+-------------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+---------------+-------------+------+-----+---------+-------+\n| first_name | varchar(30) | NO | MUL | NULL | |\n| last_name | varchar(40) | NO | | NULL | |\n| position | varchar(25) | NO | | NULL | |\n| home_address | varchar(50) | NO | | NULL | |\n| home_phone | varchar(12) | NO | | NULL | |\n| employee_code | varchar(25) | NO | UNI | NULL | |\n+---------------+-------------+------+-----+---------+-------+\n\nURL: https://mariadb.com/kb/en/show-columns/','','https://mariadb.com/kb/en/show-columns/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (336,26,'SHOW CREATE TABLE','Syntax\n------\n\nSHOW CREATE TABLE tbl_name\n\nDescription\n-----------\n\nShows the CREATE TABLE statement that created the given table. The statement\nrequires the SELECT privilege for the table. This statement also works with\nviews and SEQUENCE.\n\nSHOW CREATE TABLE quotes table and column names according to the value of the\nsql_quote_show_create server system variable.\n\nCertain SQL_MODE values can result in parts of the original CREATE statement\nnot being included in the output. MariaDB-specific table options, column\noptions, and index options are not included in the output of this statement if\nthe NO_TABLE_OPTIONS, NO_FIELD_OPTIONS and NO_KEY_OPTIONS SQL_MODE flags are\nused. All MariaDB-specific table attributes are also not shown when a\nnon-MariaDB/MySQL emulation mode is used, which includes ANSI, DB2,\nPOSTGRESQL, MSSQL, MAXDB or ORACLE.\n\nInvalid table options, column options and index options are normally commented\nout (note, that it is possible to create a table with invalid options, by\naltering a table of a different engine, where these options were valid). To\nhave them uncommented, enable the IGNORE_BAD_TABLE_OPTIONS SQL_MODE. Remember\nthat replaying a CREATE TABLE statement with uncommented invalid options will\nfail with an error, unless the IGNORE_BAD_TABLE_OPTIONS SQL_MODE is in effect.\n\nNote that SHOW CREATE TABLE is not meant to provide metadata about a table. It\nprovides information about how the table was declared, but the real table\nstructure could differ a bit. For example, if an index has been declared as\nHASH, the CREATE TABLE statement returned by SHOW CREATE TABLE will declare\nthat index as HASH; however, it is possible that the index is in fact a BTREE,\nbecause the storage engine does not support HASH.\n\nMariaDB starting with 10.2.1\n----------------------------\nMariaDB 10.2.1 permits TEXT and BLOB data types to be assigned a DEFAULT\nvalue. As a result, from MariaDB 10.2.1, SHOW CREATE TABLE will append a\nDEFAULT NULL to nullable TEXT or BLOB fields if no specific default is\nprovided.\n\nMariaDB starting with 10.2.2\n----------------------------\nFrom MariaDB 10.2.2, numbers are no longer quoted in the DEFAULT clause in\nSHOW CREATE statement. Previously, MariaDB quoted numbers.\n\nIndex Order\n-----------\n\nIndexes are sorted and displayed in the following order, which may differ from\nthe order of the CREATE TABLE statement.\n\n* PRIMARY KEY\n* UNIQUE keys where all column are NOT NULL\n* UNIQUE keys that don\'t contain partial segments\n* Other UNIQUE keys\n* LONG UNIQUE keys\n* Normal keys\n* Fulltext keys\n\nSee sql/sql_table.cc for details.\n\nExamples\n--------\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `s` char(60) DEFAULT NULL,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nWith sql_quote_show_create off:\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE t (\n id int(11) NOT NULL AUTO_INCREMENT,\n s char(60) DEFAULT NULL,\n PRIMARY KEY (id)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nUnquoted numeric DEFAULTs, from MariaDB 10.2.2:\n\nCREATE TABLE td (link TINYINT DEFAULT 1);\n\nSHOW CREATE TABLE td\\G\n*************************** 1. row ***************************\n Table: td\nCreate Table: CREATE TABLE `td` (\n `link` tinyint(4) DEFAULT 1\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nQuoted numeric DEFAULTs, until MariaDB 10.2.1:\n\nCREATE TABLE td (link TINYINT DEFAULT 1);\n\nSHOW CREATE TABLE td\\G\n*************************** 1. row ***************************\n Table: td\nCreate Table: CREATE TABLE `td` (\n `link` tinyint(4) DEFAULT \'1\'\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nSQL_MODE impacting the output:\n\nSELECT @@sql_mode;\n+------------------------------------------------------------------------------\n------------+\n| @@sql_mode \n |\n+------------------------------------------------------------------------------\n------------+\n|\nSTRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SU\nSTITUTION |\n+------------------------------------------------------------------------------\n------------+\n\nCREATE TABLE `t1` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `msg` varchar(100) DEFAULT NULL,\n PRIMARY KEY (`id`)\n ) ENGINE=InnoDB DEFAULT CHARSET=latin1\n;\n\nSHOW CREATE TABLE t1\\G\n*************************** 1. row ***************************\n Table: t1\nCreate Table: CREATE TABLE `t1` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `msg` varchar(100) DEFAULT NULL,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nSET SQL_MODE=ORACLE;\n\nSHOW CREATE TABLE t1\\G\n*************************** 1. row ***************************\n Table: t1\nCreate Table: CREATE TABLE \"t1\" (\n \"id\" int(11) NOT NULL,\n \"msg\" varchar(100) DEFAULT NULL,\n PRIMARY KEY (\"id\")\n\nURL: https://mariadb.com/kb/en/show-create-table/','','https://mariadb.com/kb/en/show-create-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (337,26,'SHOW INDEX','Syntax\n------\n\nSHOW {INDEX | INDEXES | KEYS} \n FROM tbl_name [FROM db_name]\n [WHERE expr]\n\nDescription\n-----------\n\nSHOW INDEX returns table index information. The format resembles that of the\nSQLStatistics call in ODBC.\n\nYou can use db_name.tbl_name as an alternative to the tbl_name FROM db_name\nsyntax. These two statements are equivalent:\n\nSHOW INDEX FROM mytable FROM mydb;\nSHOW INDEX FROM mydb.mytable;\n\nSHOW KEYS and SHOW INDEXES are synonyms for SHOW INDEX.\n\nYou can also list a table\'s indexes with the mariadb-show/mysqlshow command:\n\nmysqlshow -k db_name tbl_name\n\nThe information_schema.STATISTICS table stores similar information.\n\nThe following fields are returned by SHOW INDEX.\n\n+------------------------+---------------------------------------------------+\n| Field | Description |\n+------------------------+---------------------------------------------------+\n| Table | Table name |\n+------------------------+---------------------------------------------------+\n| Non_unique | 1 if the index permits duplicate values, 0 if |\n| | values must be unique. |\n+------------------------+---------------------------------------------------+\n| Key_name | Index name. The primary key is always named |\n| | PRIMARY. |\n+------------------------+---------------------------------------------------+\n| Seq_in_index | The column\'s sequence in the index, beginning |\n| | with 1. |\n+------------------------+---------------------------------------------------+\n| Column_name | Column name. |\n+------------------------+---------------------------------------------------+\n| Collation | Either A, if the column is sorted in ascending |\n| | order in the index, or NULL if it\'s not sorted. |\n+------------------------+---------------------------------------------------+\n| Cardinality | Estimated number of unique values in the index. |\n| | The cardinality statistics are calculated at |\n| | various times, and can help the optimizer make |\n| | improved decisions. |\n+------------------------+---------------------------------------------------+\n| Sub_part | NULL if the entire column is included in the |\n| | index, or the number of included characters if |\n| | not. |\n+------------------------+---------------------------------------------------+\n| Packed | NULL if the index is not packed, otherwise how |\n| | the index is packed. |\n+------------------------+---------------------------------------------------+\n| Null | NULL if NULL values are permitted in the column, |\n| | an empty string if NULLs are not permitted. |\n+------------------------+---------------------------------------------------+\n| Index_type | The index type, which can be BTREE, FULLTEXT, |\n| | HASH or RTREE. See Storage Engine Index Types. |\n+------------------------+---------------------------------------------------+\n| Comment | Other information, such as whether the index is |\n| | disabled. |\n+------------------------+---------------------------------------------------+\n| Index_comment | Contents of the COMMENT attribute when the index |\n| | was created. |\n+------------------------+---------------------------------------------------+\n| Ignored | Whether or not an index will be ignored by the |\n| | optimizer. See Ignored Indexes. From MariaDB |\n| | 10.6.0. |\n+------------------------+---------------------------------------------------+\n\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nExamples\n--------\n\nCREATE TABLE IF NOT EXISTS `employees_example` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `first_name` varchar(30) NOT NULL,\n `last_name` varchar(40) NOT NULL,\n `position` varchar(25) NOT NULL,\n `home_address` varchar(50) NOT NULL,\n `home_phone` varchar(12) NOT NULL,\n `employee_code` varchar(25) NOT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `employee_code` (`employee_code`),\n KEY `first_name` (`first_name`,`last_name`)\n) ENGINE=Aria;\n\nINSERT INTO `employees_example` (`first_name`, `last_name`, `position`,\n`home_address`, `home_phone`, `employee_code`)\n VALUES\n (\'Mustapha\', \'Mond\', \'Chief Executive Officer\', \'692 Promiscuous Plaza\',\n\'326-555-3492\', \'MM1\'),\n (\'Henry\', \'Foster\', \'Store Manager\', \'314 Savage Circle\', \'326-555-3847\',\n\'HF1\'),\n (\'Bernard\', \'Marx\', \'Cashier\', \'1240 Ambient Avenue\', \'326-555-8456\', \'BM1\'),\n (\'Lenina\', \'Crowne\', \'Cashier\', \'281 Bumblepuppy Boulevard\', \'328-555-2349\',\n\'LC1\'),\n (\'Fanny\', \'Crowne\', \'Restocker\', \'1023 Bokanovsky Lane\', \'326-555-6329\',\n\'FC1\'),\n (\'Helmholtz\', \'Watson\', \'Janitor\', \'944 Soma Court\', \'329-555-2478\', \'HW1\');\n\nSHOW INDEXES FROM employees_example\\G\n*************************** 1. row ***************************\n Table: employees_example\n Non_unique: 0\n Key_name: PRIMARY\n Seq_in_index: 1\n Column_name: id\n Collation: A\n Cardinality: 6\n Sub_part: NULL\n Packed: NULL\n Null:\n Index_type: BTREE\n Comment:\nIndex_comment: \n Ignored: NO\n*************************** 2. row ***************************\n Table: employees_example\n Non_unique: 0\n Key_name: employee_code\n Seq_in_index: 1\n Column_name: employee_code\n Collation: A\n Cardinality: 6\n Sub_part: NULL\n Packed: NULL\n Null:\n Index_type: BTREE\n Comment:\nIndex_comment: \n Ignored: NO\n*************************** 3. row ***************************\n Table: employees_example\n Non_unique: 1\n Key_name: first_name\n Seq_in_index: 1\n Column_name: first_name\n Collation: A\n Cardinality: NULL\n Sub_part: NULL\n Packed: NULL\n Null:\n Index_type: BTREE\n Comment:\nIndex_comment: \n Ignored: NO\n*************************** 4. row ***************************\n Table: employees_example\n Non_unique: 1\n Key_name: first_name\n Seq_in_index: 2\n Column_name: last_name\n Collation: A\n Cardinality: NULL\n Sub_part: NULL\n Packed: NULL\n Null:\n Index_type: BTREE\n Comment:\nIndex_comment: \n Ignored: NO\n\nURL: https://mariadb.com/kb/en/show-index/','','https://mariadb.com/kb/en/show-index/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (338,26,'SHOW EXPLAIN','Syntax\n------\n\nSHOW EXPLAIN [FORMAT=JSON] FOR <connection_id>;\nEXPLAIN [FORMAT=JSON] FOR CONNECTION <connection_id>;\n\nDescription\n-----------\n\nThe SHOW EXPLAIN command allows one to get an EXPLAIN (that is, a description\nof a query plan) of a query running in a certain connection.\n\nSHOW EXPLAIN FOR <connection_id>;\n\nwill produce an EXPLAIN output for the query that connection number\nconnection_id is running. The connection id can be obtained with SHOW\nPROCESSLIST.\n\nSHOW EXPLAIN FOR 1;\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n| id | select_type | table | type | possible_keys | key | key_len | ref |\nrows | Extra |\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n| 1 | SIMPLE | tbl | index | NULL | a | 5 | NULL |\n1000107 | Using index |\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n1 row in set, 1 warning (0.00 sec)\n\nThe output is always accompanied with a warning which shows the query the\ntarget connection is running (this shows what the EXPLAIN is for):\n\nSHOW WARNINGS;\n+-------+------+------------------------+\n| Level | Code | Message |\n+-------+------+------------------------+\n| Note | 1003 | select sum(a) from tbl |\n+-------+------+------------------------+\n1 row in set (0.00 sec)\n\nEXPLAIN FOR CONNECTION\n----------------------\n\nMariaDB starting with 10.9\n--------------------------\nThe EXPLAIN FOR CONNECTION syntax was added for MySQL compatibility.\n\nFORMAT=JSON\n-----------\n\nMariaDB starting with 10.9\n--------------------------\nSHOW EXPLAIN [FORMAT=JSON] FOR <connection_id> extends SHOW EXPLAIN to return\nmore detailed JSON output.\n\nPossible Errors\n---------------\n\nThe output can be only produced if the target connection is currently running\na query, which has a ready query plan. If this is not the case, the output\nwill be:\n\nSHOW EXPLAIN FOR 2;\nERROR 1932 (HY000): Target is not running an EXPLAINable command\n\nYou will get this error when:\n\n* the target connection is not running a command for which one can run EXPLAIN\n* the target connection is running a command for which one can run EXPLAIN, but\nthere is no query plan yet (for example, tables are open and locks are\n acquired before the query plan is produced)\n\nDifferences Between SHOW EXPLAIN and EXPLAIN Outputs\n----------------------------------------------------\n\nBackground\n----------\n\nIn MySQL, EXPLAIN execution takes a slightly different route from the way the\nreal query (typically the SELECT) is optimized. This is unfortunate, and has\ncaused a number of bugs in EXPLAIN. (For example, see MDEV-326, MDEV-410, and\nlp:1013343. lp:992942 is not directly about EXPLAIN, but it also would not\nhave existed if MySQL didn\'t try to delete parts of a query plan in the middle\nof the query)\n\nSHOW EXPLAIN examines a running SELECT, and hence its output may be slightly\ndifferent from what EXPLAIN SELECT would produce. We did our best to make sure\nthat either the difference is negligible, or SHOW EXPLAIN\'s output is closer\nto reality than EXPLAIN\'s output.\n\nList of Recorded Differences\n----------------------------\n\n* SHOW EXPLAIN may have Extra=\'no matching row in const table\', where EXPLAIN\nwould produce Extra=\'Impossible WHERE ...\'\n* For queries with subqueries, SHOW EXPLAIN may print select_type==PRIMARY\nwhere regular EXPLAIN used to print select_type==SIMPLE, or vice versa.\n\nRequired Permissions\n--------------------\n\nRunning SHOW EXPLAIN requires the same permissions as running SHOW PROCESSLIST\nwould.\n\nURL: https://mariadb.com/kb/en/show-explain/','','https://mariadb.com/kb/en/show-explain/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (339,26,'BACKUP STAGE','MariaDB starting with 10.4.1\n----------------------------\nThe BACKUP STAGE commands were introduced in MariaDB 10.4.1.\n\nThe BACKUP STAGE commands are a set of commands to make it possible to make an\nefficient external backup tool.\n\nSyntax\n------\n\nBACKUP STAGE [START | FLUSH | BLOCK_DDL | BLOCK_COMMIT | END ]\n\nIn the following text, a transactional table means InnoDB or \"InnoDB-like\nengine with redo log that can lock redo purges and can be copied without locks\nby an outside process\".\n\nGoals with BACKUP STAGE Commands\n--------------------------------\n\n* To be able to do a majority of the backup with the minimum possible server\nlocks. Especially for transactional tables (InnoDB, MyRocks etc) there is only\nneed for a very short block of new commits while copying statistics and log\ntables.\n* DDL are only needed to be blocked for a very short duration of the backup\nwhile mariabackup is copying the tables affected by DDL during the initial\npart of the backup.\n* Most non transactional tables (those that are not in use) will be copied\nduring BACKUP STAGE START. The exceptions are system statistic and log tables\nthat are not blocked during the backup until BLOCK_COMMIT.\n* Should work efficiently with backup tools that use disk snapshots.\n* Should work as efficiently as possible for all table types that store data\non the local disks.\n* As little copying as possible under higher level stages/locks. For example,\n.frm (dictionary) and .trn (trigger) files should be copying while copying the\ntable data.\n\nBACKUP STAGE Commands\n---------------------\n\nBACKUP STAGE START\n------------------\n\nThe START stage is designed for the following tasks:\n\n* Blocks purge of redo files for storage engines that needs this (Aria)\n* Start logging of DDL commands into \'datadir\'/ddl.log. This may take a short\ntime as the command has to wait until there are no active DDL commands.\n\nBACKUP STAGE FLUSH\n------------------\n\nThe FLUSH stage is designed for the following tasks:\n\n* FLUSH all changes for inactive non-transactional tables, except for\nstatistics and log tables.\n* Close all tables that are not in use, to ensure they are marked as closed\nfor the backup.\n* BLOCK all new write locks for all non transactional tables (except\nstatistics and log tables). The command will not wait for tables that are in\nuse by read-only transactions.\n\nDDLs don\'t have to be blocked at this stage as they can\'t cause the table to\nbe in an inconsistent state. This is true also for non-transactional tables.\n\nBACKUP STAGE BLOCK_DDL\n----------------------\n\nThe BLOCK_DDL stage is designed for the following tasks:\n\n* Wait for all statements using write locked non-transactional tables to end.\n* Blocks CREATE TABLE, DROP TABLE, TRUNCATE TABLE, and RENAME TABLE.\n* Blocks also start off a new ALTER TABLE and the final rename phase of ALTER\nTABLE. Running ALTER TABLES are not blocked.\n\nBACKUP STAGE BLOCK_COMMIT\n-------------------------\n\nThe BLOCK_COMMIT stage is designed for the following tasks:\n\n* Lock the binary log and commit/rollback to ensure that no changes are\ncommitted to any tables. If there are active commits or data to be copied to\nthe binary log this will be allowed to finish. Active transactions will not\naffect BLOCK_COMMIT.\n* This doesn\'t lock temporary tables that are not used by replication. However\nthese will be blocked when it\'s time to write to the binary log.\n* Lock system log tables and statistics tables, flush them and mark them\nclosed.\n\nWhen the BLOCK_COMMIT\'s stages return, this is the \'backup time\'. Everything\ncommitted will be in the backup and everything not committed will roll back.\n\nTransactional engines will continue to do changes to the redo log during the\nBLOCK COMMIT stage, but this is not important as all of these will roll back\nlater as the changes will not be committed.\n\nBACKUP STAGE END\n----------------\n\nThe END stage is designed for the following tasks:\n\n* End DDL logging\n* Free resources\n\nUsing BACKUP STAGE Commands with Backup Tools\n---------------------------------------------\n\nUsing BACKUP STAGE Commands with Mariabackup\n--------------------------------------------\n\nThe BACKUP STAGE commands are a set of commands to make it possible to make an\nefficient external backup tool. How Mariabackup uses these commands depends on\nwhether you are using the version that is bundled with MariaDB Community\nServer or the version that is bundled with MariaDB Enterprise Server. See\nMariabackup and BACKUP STAGE Commands for some examples on how Mariabackup\nuses these commands.\n\nIf you would like to use a version of Mariabackup that uses the BACKUP STAGE\ncommands in an efficient way, then one option is to use MariaDB Enterprise\nBackup that is bundled with MariaDB Enterprise Server.\n\nUsing BACKUP STAGE Commands with Storage Snapshots\n--------------------------------------------------\n\nThe BACKUP STAGE commands are a set of commands to make it possible to make an\nefficient external backup tool. These commands could even be used by tools\nthat perform backups by taking a snapshot of a file system, SAN, or some other\nkind of storage device. See Storage Snapshots and BACKUP STAGE Commands for\nsome examples on how to use each BACKUP STAGE command in an efficient way.\n\nPrivileges\n----------\n\nBACKUP STAGE requires the RELOAD privilege.\n\nNotes\n-----\n\n* Only one connection can run BACKUP STAGE START. If a second connection\ntries, it will wait until the first one has executed BACKUP STAGE END.\n* If the user skips a BACKUP STAGE, then all intermediate backup stages will\nautomatically be run. This will allow us to add new stages within the BACKUP\nSTAGE hierarchy in the future with even more precise locks without causing\nproblems for tools using an earlier version of the BACKUP STAGE implementation.\n* One can use the max_statement_time or lock_wait_timeout system variables to\nensure that a BACKUP STAGE command doesn\'t block the server too long.\n* DDL logging will only be available in MariaDB Enterprise Server 10.2 and\nlater.\n* A disconnect will automatically release backup stages.\n* There is no easy way to see which is the current stage.\n\nURL: https://mariadb.com/kb/en/backup-stage/','','https://mariadb.com/kb/en/backup-stage/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (340,26,'BACKUP LOCK','MariaDB starting with 10.4.2\n----------------------------\nThe BACKUP LOCK command was introduced in MariaDB 10.4.2.\n\nBACKUP LOCK blocks a table from DDL statements. This is mainly intended to be\nused by tools like mariabackup that need to ensure there are no DDLs on a\ntable while the table files are opened. For example, for an Aria table that\nstores data in 3 files with extensions .frm, .MAI and .MAD. Normal read/write\noperations can continue as normal.\n\nSyntax\n------\n\nTo lock a table:\n\nBACKUP LOCK table_name\n\nTo unlock a table:\n\nBACKUP UNLOCK\n\nUsage in a Backup Tool\n----------------------\n\nBACKUP LOCK [database.]table_name;\n - Open all files related to a table (for example, t.frm, t.MAI and t.MYD)\nBACKUP UNLOCK;\n- Copy data\n- Close files\n\nThis ensures that all files are from the same generation, that is created at\nthe same time by the MariaDB server. This works, because the open files will\npoint to the original table files which will not be affected if there is any\nALTER TABLE while copying the files.\n\nPrivileges\n----------\n\nBACKUP LOCK requires the RELOAD privilege.\n\nNotes\n-----\n\n* The idea is that the BACKUP LOCK should be held for as short a time as\npossible by the backup tool. The time to take an uncontested lock is very\nshort! One can easily do 50,000 locks/unlocks per second on low end hardware.\n* One should use different connections for BACKUP STAGE commands and BACKUP\nLOCK.\n\nImplementation\n--------------\n\n* Internally, BACKUP LOCK is implemented by taking an MDLSHARED_HIGH_PRIO MDL\nlock on the table object, which protects the table from any DDL operations.\n\nURL: https://mariadb.com/kb/en/backup-lock/','','https://mariadb.com/kb/en/backup-lock/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (341,26,'FLUSH','Syntax\n------\n\nFLUSH [NO_WRITE_TO_BINLOG | LOCAL]\n flush_option [, flush_option] ...\n\nor when flushing tables:\n\nFLUSH [NO_WRITE_TO_BINLOG | LOCAL] TABLES [table_list] [table_flush_option]\n\nwhere table_list is a list of tables separated by , (comma).\n\nDescription\n-----------\n\nThe FLUSH statement clears or reloads various internal caches used by MariaDB.\nTo execute FLUSH, you must have the RELOAD privilege. See GRANT.\n\nThe RESET statement is similar to FLUSH. See RESET.\n\nYou cannot issue a FLUSH statement from within a stored function or a trigger.\nDoing so within a stored procedure is permitted, as long as it is not called\nby a stored function or trigger. See Stored Routine Limitations, Stored\nFunction Limitations and Trigger Limitations.\n\nIf a listed table is a view, an error like the following will be produced:\n\nERROR 1347 (HY000): \'test.v\' is not BASE TABLE\n\nBy default, FLUSH statements are written to the binary log and will be\nreplicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure the\nstatement is not written to the binary log.\n\nThe different flush options are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| CHANGED_PAGE_BITMAPS | XtraDB only. Internal command used for backup |\n| | purposes. See the Information Schema |\n| | CHANGED_PAGE_BITMAPS Table. |\n+---------------------------+------------------------------------------------+\n| CLIENT_STATISTICS | Reset client statistics (see SHOW |\n| | CLIENT_STATISTICS). |\n+---------------------------+------------------------------------------------+\n| DES_KEY_FILE | Reloads the DES key file (Specified with the |\n| | --des-key-file startup option). |\n+---------------------------+------------------------------------------------+\n| HOSTS | Flush the hostname cache (used for converting |\n| | ip to host names and for unblocking blocked |\n| | hosts. See max_connect_errors and |\n| | performance_schema.host_cache |\n+---------------------------+------------------------------------------------+\n| INDEX_STATISTICS | Reset index statistics (see SHOW |\n| | INDEX_STATISTICS). |\n+---------------------------+------------------------------------------------+\n| [ERROR | ENGINE | | Close and reopen the specified log type, or |\n| GENERAL | SLOW | BINARY | all log types if none are specified. FLUSH |\n| | RELAY] LOGS | RELAY LOGS [connection-name] can be used to |\n| | flush the relay logs for a specific |\n| | connection. Only one connection can be |\n| | specified per FLUSH command. See Multi-source |\n| | replication. FLUSH ENGINE LOGS will delete |\n| | all unneeded Aria redo logs. Since MariaDB |\n| | 10.1.30 and MariaDB 10.2.11, FLUSH BINARY |\n| | LOGS DELETE_DOMAIN_ID=(list-of-domains) can |\n| | be used to discard obsolete GTID domains from |\n| | the server\'s binary log state. In order for |\n| | this to be successful, no event group from |\n| | the listed GTID domains can be present in |\n| | existing binary log files. If some still |\n| | exist, then they must be purged prior to |\n| | executing this command. If the command |\n| | completes successfully, then it also rotates |\n| | the binary log. |\n+---------------------------+------------------------------------------------+\n| MASTER | Deprecated option, use RESET MASTER instead. |\n+---------------------------+------------------------------------------------+\n| PRIVILEGES | Reload all privileges from the privilege |\n| | tables in the mysql database. If the server |\n| | is started with --skip-grant-table option, |\n| | this will activate the privilege tables again. |\n+---------------------------+------------------------------------------------+\n| QUERY CACHE | Defragment the query cache to better utilize |\n| | its memory. If you want to reset the query |\n| | cache, you can do it with RESET QUERY CACHE. |\n+---------------------------+------------------------------------------------+\n| QUERY_RESPONSE_TIME | See the QUERY_RESPONSE_TIME plugin. |\n+---------------------------+------------------------------------------------+\n| SLAVE | Deprecated option, use RESET REPLICA or RESET |\n| | SLAVE instead. |\n+---------------------------+------------------------------------------------+\n| SSL | Used to dynamically reinitialize the server\'s |\n| | TLS context by reloading the files defined by |\n| | several TLS system variables. See FLUSH SSL |\n| | for more information. This command was first |\n| | added in MariaDB 10.4.1. |\n+---------------------------+------------------------------------------------+\n| STATUS | Resets all server status variables that can |\n| | be reset to 0. Not all global status |\n| | variables support this, so not all global |\n| | values are reset. See FLUSH STATUS for more |\n| | information. |\n+---------------------------+------------------------------------------------+\n| TABLE | Close tables given as options or all open |\n| | tables if no table list was used. From |\n| | MariaDB 10.4.1, using without any table list |\n| | will only close tables not in use, and tables |\n| | not locked by the FLUSH TABLES connection. If |\n| | there are no locked tables, FLUSH TABLES will |\n| | be instant and will not cause any waits, as |\n| | it no longer waits for tables in use. When a |\n| | table list is provided, from MariaDB 10.4.1, |\n| | the server will wait for the end of any |\n| | transactions that are using the tables. |\n| | Previously, FLUSH TABLES only waited for the |\n| | statements to complete. |\n+---------------------------+------------------------------------------------+\n| TABLES | Same as FLUSH TABLE. |\n+---------------------------+------------------------------------------------+\n| TABLES ... FOR EXPORT | For InnoDB tables, flushes table changes to |\n| | disk to permit binary table copies while the |\n| | server is running. See FLUSH TABLES ... FOR |\n| | EXPORT for more. |\n+---------------------------+------------------------------------------------+\n| TABLES WITH READ LOCK | Closes all open tables. New tables are only |\n| | allowed to be opened with read locks until an |\n| | UNLOCK TABLES is given. |\n+---------------------------+------------------------------------------------+\n| TABLES WITH READ LOCK | As TABLES WITH READ LOCK but also disable all |\n| AND DISABLE CHECKPOINT | checkpoint writes by transactional table |\n| | engines. This is useful when doing a disk |\n| | snapshot of all tables. |\n+---------------------------+------------------------------------------------+\n| TABLE_STATISTICS | Reset table statistics (see SHOW |\n| | TABLE_STATISTICS). |\n+---------------------------+------------------------------------------------+\n| USER_RESOURCES | Resets all per hour user resources. This |\n| | enables clients that have exhausted their |\n| | resources to connect again. |\n+---------------------------+------------------------------------------------+\n| USER_STATISTICS | Reset user statistics (see SHOW |\n| | USER_STATISTICS). |\n+---------------------------+------------------------------------------------+\n| USER_VARIABLES | Reset user variables (see User-defined |\n| | variables). |\n+---------------------------+------------------------------------------------+\n\nYou can also use the mysqladmin client to flush things. Use mysqladmin --help\nto examine what flush commands it supports.\n\nFLUSH RELAY LOGS\n----------------\n\nFLUSH RELAY LOGS \'connection_name\';\n\nCompatibility with MySQL\n------------------------\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after the FLUSH command.\n\nFor example, one can now use:\n\nFLUSH RELAY LOGS FOR CHANNEL \'connection_name\';\n\nFLUSH STATUS\n------------\n\nServer status variables can be reset by executing the following:\n\nFLUSH STATUS;\n\nGlobal Status Variables that Support FLUSH STATUS\n-------------------------------------------------\n\nNot all global status variables support being reset by FLUSH STATUS.\nCurrently, the following status variables are reset by FLUSH STATUS:\n\n* Aborted_clients\n* Aborted_connects\n* Binlog_cache_disk_use\n* Binlog_cache_use\n* Binlog_stmt_cache_disk_use\n* Binlog_stmt_cache_use\n* Connection_errors_accept\n* Connection_errors_internal\n* Connection_errors_max_connections\n* Connection_errors_peer_address\n* Connection_errors_select\n* Connection_errors_tcpwrap\n* Created_tmp_files\n* Delayed_errors\n* Delayed_writes\n* Feature_check_constraint\n* Feature_delay_key_write\n* Max_used_connections\n* Opened_plugin_libraries\n* Performance_schema_accounts_lost\n* Performance_schema_cond_instances_lost\n* Performance_schema_digest_lost\n* Performance_schema_file_handles_lost\n* Performance_schema_file_instances_lost\n* Performance_schema_hosts_lost\n* Performance_schema_locker_lost\n* Performance_schema_mutex_instances_lost\n* Performance_schema_rwlock_instances_lost\n* Performance_schema_session_connect_attrs_lost\n* Performance_schema_socket_instances_lost\n* Performance_schema_stage_classes_lost\n* Performance_schema_statement_classes_lost\n* Performance_schema_table_handles_lost\n* Performance_schema_table_instances_lost\n* Performance_schema_thread_instances_lost\n* Performance_schema_users_lost\n* Qcache_hits\n* Qcache_inserts\n* Qcache_lowmem_prunes\n* Qcache_not_cached\n* Rpl_semi_sync_master_no_times\n* Rpl_semi_sync_master_no_tx\n* Rpl_semi_sync_master_timefunc_failures\n* Rpl_semi_sync_master_wait_pos_backtraverse\n* Rpl_semi_sync_master_yes_tx\n* Rpl_transactions_multi_engine\n* Server_audit_writes_failed\n* Slave_retried_transactions\n* Slow_launch_threads\n* Ssl_accept_renegotiates\n* Ssl_accepts\n* Ssl_callback_cache_hits\n* Ssl_client_connects\n* Ssl_connect_renegotiates\n* Ssl_ctx_verify_depth\n* Ssl_ctx_verify_mode\n* Ssl_finished_accepts\n* Ssl_finished_connects\n* Ssl_session_cache_hits\n* Ssl_session_cache_misses\n* Ssl_session_cache_overflows\n* Ssl_session_cache_size\n* Ssl_session_cache_timeouts\n* Ssl_sessions_reused\n* Ssl_used_session_cache_entries\n* Subquery_cache_hit\n* Subquery_cache_miss\n* Table_locks_immediate\n* Table_locks_waited\n* Tc_log_max_pages_used\n* Tc_log_page_waits\n* Transactions_gtid_foreign_engine\n* Transactions_multi_engine\n\nThe different usage of FLUSH TABLES\n-----------------------------------\n\nThe purpose of FLUSH TABLES\n---------------------------\n\nThe purpose of FLUSH TABLES is to clean up the open table cache and table\ndefinition cache from not in use tables. This frees up memory and file\ndescriptors. Normally this is not needed as the caches works on a FIFO bases,\nbut can be useful if the server seams to use up to much memory for some reason.\n\nThe purpose of FLUSH TABLES WITH READ LOCK \n-------------------------------------------\n\nFLUSH TABLES WITH READ LOCK is useful if you want to take a backup of some\ntables. When FLUSH TABLES WITH READ LOCK returns, all write access to tables\nare blocked and all tables are marked as \'properly closed\' on disk. The tables\ncan still be used for read operations.\n\nThe purpose of FLUSH TABLES table_list\n--------------------------------------\n\nFLUSH TABLES table_list is useful if you want to copy a table object/files to\nor from the server. This command puts a lock that stops new users of the table\nand will wait until everyone has stopped using the table. The table is then\nremoved from the table definition and table cache.\n\nNote that it\'s up to the user to ensure that no one is accessing the table\nbetween FLUSH TABLES and the table is copied to or from the server. This can\nbe secured by using LOCK TABLES.\n','','https://mariadb.com/kb/en/flush/');
-update help_topic set description = CONCAT(description, '\nIf there are any tables locked by the connection that is using FLUSH TABLES\nall the locked tables will be closed as part of the flush and reopened and\nrelocked before FLUSH TABLES returns. This allows one to copy the table after\nFLUSH TABLES returns without having any writes on the table. For now this\nworks works with most tables, except InnoDB as InnoDB may do background purges\non the table even while it\'s write locked.\n\nThe purpose of FLUSH TABLES table_list WITH READ LOCK\n-----------------------------------------------------\n\nFLUSH TABLES table_list WITH READ LOCK should work as FLUSH TABLES WITH READ\nLOCK, but only those tables that are listed will be properly closed. However\nin practice this works exactly like FLUSH TABLES WITH READ LOCK as the FLUSH\ncommand has anyway to wait for all WRITE operations to end because we are\ndepending on a global read lock for this code. In the future we should\nconsider fixing this to instead use meta data locks.\n\nImplementation of FLUSH TABLES commands in MariaDB 10.4.8 and above\n-------------------------------------------------------------------\n\nImplementation of FLUSH TABLES\n------------------------------\n\n* Free memory and file descriptors not in use\n\nImplementation of FLUSH TABLES WITH READ LOCK\n---------------------------------------------\n\n* Lock all tables read only for simple old style backup.\n* All background writes are suspended and tables are marked as closed.\n* No statement requiring table changes are allowed for any user until UNLOCK\nTABLES.\n\nInstead of using FLUSH TABLE WITH READ LOCK one should in most cases instead\nuse BACKUP STAGE BLOCK_COMMIT.\n\nImplementation of FLUSH TABLES table_list\n-----------------------------------------\n\n* Free memory and file descriptors for tables not in use from table list.\n* Lock given tables as read only.\n* Wait until all translations has ended that uses any of the given tables.\n* Wait until all background writes are suspended and tables are marked as\nclosed.\n\nImplementation of FLUSH TABLES table_list FOR EXPORT\n----------------------------------------------------\n\n* Free memory and file descriptors for tables not in use from table list\n* Lock given tables as read.\n* Wait until all background writes are suspended and tables are marked as\nclosed.\n* Check that all tables supports FOR EXPORT\n* No changes to these tables allowed until UNLOCK TABLES\n\nThis is basically the same behavior as in old MariaDB version if one first\nlock the tables, then do FLUSH TABLES. The tables will be copyable until\nUNLOCK TABLES.\n\nFLUSH SSL\n---------\n\nMariaDB starting with 10.4\n--------------------------\nThe FLUSH SSL command was first added in MariaDB 10.4.\n\nIn MariaDB 10.4 and later, the FLUSH SSL command can be used to dynamically\nreinitialize the server\'s TLS context. This is most useful if you need to\nreplace a certificate that is about to expire without restarting the server.\n\nThis operation is performed by reloading the files defined by the following\nTLS system variables:\n\n* ssl_cert\n* ssl_key\n* ssl_ca\n* ssl_capath\n* ssl_crl\n* ssl_crlpath\n\nThese TLS system variables are not dynamic, so their values can not be changed\nwithout restarting the server.\n\nIf you want to dynamically reinitialize the server\'s TLS context, then you\nneed to change the certificate and key files at the relevant paths defined by\nthese TLS system variables, without actually changing the values of the\nvariables. See MDEV-19341 for more information.\n\nReducing Memory Usage\n---------------------\n\nTo flush some of the global caches that take up memory, you could execute the\nfollowing command:\n\nFLUSH LOCAL HOSTS,\n QUERY CACHE,\n TABLE_STATISTICS,\n INDEX_STATISTICS,\n USER_STATISTICS;\n\nURL: https://mariadb.com/kb/en/flush/') WHERE help_topic_id = 341;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (342,26,'FLUSH QUERY CACHE','Description\n-----------\n\nYou can defragment the query cache to better utilize its memory with the FLUSH\nQUERY CACHE statement. The statement does not remove any queries from the\ncache.\n\nThe RESET QUERY CACHE statement removes all query results from the query\ncache. The FLUSH TABLES statement also does this.\n\nURL: https://mariadb.com/kb/en/flush-query-cache/','','https://mariadb.com/kb/en/flush-query-cache/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (343,26,'FLUSH TABLES FOR EXPORT','Syntax\n------\n\nFLUSH TABLES table_name [, table_name] FOR EXPORT\n\nDescription\n-----------\n\nFLUSH TABLES ... FOR EXPORT flushes changes to the specified tables to disk so\nthat binary copies can be made while the server is still running. This works\nfor Archive, Aria, CSV, InnoDB, MyISAM, MERGE, and XtraDB tables.\n\nThe table is read locked until one has issued UNLOCK TABLES.\n\nIf a storage engine does not support FLUSH TABLES FOR EXPORT, a 1031 error\n(SQLSTATE \'HY000\') is produced.\n\nIf FLUSH TABLES ... FOR EXPORT is in effect in the session, the following\nstatements will produce an error if attempted:\n\n* FLUSH TABLES WITH READ LOCK\n* FLUSH TABLES ... WITH READ LOCK\n* FLUSH TABLES ... FOR EXPORT\n* Any statement trying to update any table\n\nIf any of the following statements is in effect in the session, attempting\nFLUSH TABLES ... FOR EXPORT will produce an error.\n\n* FLUSH TABLES ... WITH READ LOCK\n* FLUSH TABLES ... FOR EXPORT\n* LOCK TABLES ... READ\n* LOCK TABLES ... WRITE\n\nFLUSH FOR EXPORT is not written to the binary log.\n\nThis statement requires the RELOAD and the LOCK TABLES privileges.\n\nIf one of the specified tables cannot be locked, none of the tables will be\nlocked.\n\nIf a table does not exist, an error like the following will be produced:\n\nERROR 1146 (42S02): Table \'test.xxx\' doesn\'t exist\n\nIf a table is a view, an error like the following will be produced:\n\nERROR 1347 (HY000): \'test.v\' is not BASE TABLE\n\nExample\n-------\n\nFLUSH TABLES test.t1 FOR EXPORT;\n# Copy files related to the table (see below)\nUNLOCK TABLES;\n\nFor a full description, please see copying MariaDB tables.\n\nURL: https://mariadb.com/kb/en/flush-tables-for-export/','','https://mariadb.com/kb/en/flush-tables-for-export/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (344,26,'SHOW RELAYLOG EVENTS','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nSHOW RELAYLOG [\'connection_name\'] EVENTS\n [IN \'log_name\'] [FROM pos] [LIMIT [offset,] row_count]\n [ FOR CHANNEL \'channel_name\']\n\nDescription\n-----------\n\nOn replicas, this command shows the events in the relay log. If \'log_name\' is\nnot specified, the first relay log is shown.\n\nSyntax for the LIMIT clause is the same as for SELECT ... LIMIT.\n\nUsing the LIMIT clause is highly recommended because the SHOW RELAYLOG EVENTS\ncommand returns the complete contents of the relay log, which can be quite\nlarge.\n\nThis command does not return events related to setting user and system\nvariables. If you need those, use mariadb-binlog/mysqlbinlog.\n\nOn the primary, this command does nothing.\n\nRequires the REPLICA MONITOR privilege (>= MariaDB 10.5.9), the REPLICATION\nSLAVE ADMIN privilege (>= MariaDB 10.5.2) or the REPLICATION SLAVE privilege\n(<= MariaDB 10.5.1).\n\nconnection_name\n---------------\n\nIf there is only one nameless primary, or the default primary (as specified by\nthe default_master_connection system variable) is intended, connection_name\ncan be omitted. If provided, the SHOW RELAYLOG statement will apply to the\nspecified primary. connection_name is case-insensitive.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after SHOW RELAYLOG.\n\nURL: https://mariadb.com/kb/en/show-relaylog-events/','','https://mariadb.com/kb/en/show-relaylog-events/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (345,26,'SHOW SLAVE STATUS','Syntax\n------\n\nSHOW SLAVE [\"connection_name\"] STATUS [FOR CHANNEL \"connection_name\"]\nSHOW REPLICA [\"connection_name\"] STATUS -- From MariaDB 10.5.1\n\nor\n\nSHOW ALL SLAVES STATUS\nSHOW ALL REPLICAS STATUS -- From MariaDB 10.5.1\n\nDescription\n-----------\n\nThis statement is to be run on a replica and provides status information on\nessential parameters of the replica threads.\n\nThis statement requires the SUPER privilege, the REPLICATION_CLIENT privilege,\nor, from MariaDB 10.5.2, the REPLICATION SLAVE ADMIN privilege, or, from\nMariaDB 10.5.9, the REPLICA MONITOR privilege.\n\nMulti-Source\n------------\n\nThe ALL and \"connection_name\" options allow you to connect to many primaries\nat the same time.\n\nALL SLAVES (or ALL REPLICAS from MariaDB 10.5.1) gives you a list of all\nconnections to the primary nodes.\n\nThe rows will be sorted according to Connection_name.\n\nIf you specify a connection_name, you only get the information about that\nconnection. If connection_name is not used, then the name set by\ndefault_master_connection is used. If the connection name doesn\'t exist you\nwill get an error: There is no master connection for \'xxx\'.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after SHOW SLAVE.\n\nColumn Descriptions\n-------------------\n\n+---------------+---------------------------------------+-------------------+\n| Name | Description | Added |\n+---------------+---------------------------------------+-------------------+\n| Connection_na | Name of the primary connection. | |\n| e | Returned with SHOW ALL SLAVES STATUS | |\n| | (or SHOW ALL REPLICAS STATUS from | |\n| | MariaDB 10.5.1) only. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_SQL_Sta | State of SQL thread. Returned with | |\n| e | SHOW ALL SLAVES STATUS (or SHOW ALL | |\n| | REPLICAS STATUS from MariaDB 10.5.1) | |\n| | only. See Slave SQL Thread States. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_IO_Stat | State of I/O thread. See Slave I/O | |\n| | Thread States. | |\n+---------------+---------------------------------------+-------------------+\n| Master_host | Master host that the replica is | |\n| | connected to. | |\n+---------------+---------------------------------------+-------------------+\n| Master_user | Account user name being used to | |\n| | connect to the primary. | |\n+---------------+---------------------------------------+-------------------+\n| Master_port | The port being used to connect to | |\n| | the primary. | |\n+---------------+---------------------------------------+-------------------+\n| Connect_Retry | Time in seconds between retries to | |\n| | connect. The default is 60. The | |\n| | CHANGE MASTER TO statement can set | |\n| | this. The master-retry-count option | |\n| | determines the maximum number of | |\n| | reconnection attempts. | |\n+---------------+---------------------------------------+-------------------+\n| Master_Log_Fi | Name of the primary binary log file | |\n| e | that the I/O thread is currently | |\n| | reading from. | |\n+---------------+---------------------------------------+-------------------+\n| Read_Master_L | Position up to which the I/O thread | |\n| g_Pos | has read in the current primary | |\n| | binary log file. | |\n+---------------+---------------------------------------+-------------------+\n| Relay_Log_Fil | Name of the relay log file that the | |\n| | SQL thread is currently processing. | |\n+---------------+---------------------------------------+-------------------+\n| Relay_Log_Pos | Position up to which the SQL thread | |\n| | has finished processing in the | |\n| | current relay log file. | |\n+---------------+---------------------------------------+-------------------+\n| Relay_Master_ | Name of the primary binary log file | |\n| og_File | that contains the most recent event | |\n| | executed by the SQL thread. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_IO_Runn | Whether the replica I/O thread is | |\n| ng | running and connected (Yes), running | |\n| | but not connected to a primary | |\n| | (Connecting) or not running (No). | |\n+---------------+---------------------------------------+-------------------+\n| Slave_SQL_Run | Whether or not the SQL thread is | |\n| ing | running. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Do_ | Databases specified for replicating | |\n| B | with the replicate_do_db option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Ign | Databases specified for ignoring | |\n| re_DB | with the replicate_ignore_db option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Do_ | Tables specified for replicating | |\n| able | with the replicate_do_table option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Ign | Tables specified for ignoring with | |\n| re_Table | the replicate_ignore_table option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Wil | Tables specified for replicating | |\n| _Do_Table | with the replicate_wild_do_table | |\n| | option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Wil | Tables specified for ignoring with | |\n| _Ignore_Table | the replicate_wild_ignore_table | |\n| | option. | |\n+---------------+---------------------------------------+-------------------+\n| Last_Errno | Alias for Last_SQL_Errno (see below) | |\n+---------------+---------------------------------------+-------------------+\n| Last Error | Alias for Last_SQL_Error (see below) | |\n+---------------+---------------------------------------+-------------------+\n| Skip_Counter | Number of events that a replica | |\n| | skips from the master, as recorded | |\n| | in the sql_slave_skip_counter system | |\n| | variable. | |\n+---------------+---------------------------------------+-------------------+\n| Exec_Master_L | Position up to which the SQL thread | |\n| g_Pos | has processed in the current master | |\n| | binary log file. Can be used to | |\n| | start a new replica from a current | |\n| | replica with the CHANGE MASTER TO | |\n| | ... MASTER_LOG_POS option. | |\n+---------------+---------------------------------------+-------------------+\n| Relay_Log_Spa | Total size of all relay log files | |\n| e | combined. | |\n+---------------+---------------------------------------+-------------------+\n| Until_Conditi | | |\n| n | | |\n+---------------+---------------------------------------+-------------------+\n| Until_Log_Fil | The MASTER_LOG_FILE value of the | |\n| | START SLAVE UNTIL condition. | |\n+---------------+---------------------------------------+-------------------+\n| Until_Log_Pos | The MASTER_LOG_POS value of the | |\n| | START SLAVE UNTIL condition. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Al | Whether an SSL connection is | |\n| owed | permitted (Yes), not permitted (No) | |\n| | or permitted but without the replica | |\n| | having SSL support enabled (Ignored) | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_CA | The MASTER_SSL_CA option of the | |\n| File | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_CA | The MASTER_SSL_CAPATH option of the | |\n| Path | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Ce | The MASTER_SSL_CERT option of the | |\n| t | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Ci | The MASTER_SSL_CIPHER option of the | |\n| her | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Ke | The MASTER_SSL_KEY option of the | |\n| | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Seconds_Behin | Difference between the timestamp | |\n| _Master | logged on the master for the event | |\n| | that the replica is currently | |\n| | processing, and the current | |\n| | timestamp on the replica. Zero if | |\n| | the replica is not currently | |\n| | processing an event. With parallel | |\n| | replication, seconds_behind_master | |\n| | is updated only after transactions | |\n| | commit. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Ve | The MASTER_SSL_VERIFY_SERVER_CERT | |\n| ify_Server_Ce | option of the CHANGE MASTER TO | |\n| t | statement. | |\n+---------------+---------------------------------------+-------------------+\n| Last_IO_Errno | Error code of the most recent error | |\n| | that caused the I/O thread to stop | |\n| | (also recorded in the replica\'s | |\n| | error log). 0 means no error. RESET | |\n| | SLAVE or RESET MASTER will reset | |\n| | this value. | |\n+---------------+---------------------------------------+-------------------+\n| Last_IO_Error | Error message of the most recent | |\n| | error that caused the I/O thread to | |\n| | stop (also recorded in the replica\'s | |\n| | error log). An empty string means no | |\n| | error. RESET SLAVE or RESET MASTER | |\n| | will reset this value. | |\n+---------------+---------------------------------------+-------------------+\n| Last_SQL_Errn | Error code of the most recent error | |\n| | that caused the SQL thread to stop | |\n| | (also recorded in the replica\'s | |\n| | error log). 0 means no error. RESET | |\n| | SLAVE or RESET MASTER will reset | |\n| | this value. | |\n+---------------+---------------------------------------+-------------------+\n| Last_SQL_Erro | Error message of the most recent | |\n| | error that caused the SQL thread to | |\n| | stop (also recorded in the replica\'s | |','','https://mariadb.com/kb/en/show-replica-status/');
-update help_topic set description = CONCAT(description, '\n| | error log). An empty string means no | |\n| | error. RESET SLAVE or RESET MASTER | |\n| | will reset this value. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Ign | List of server_ids that are | |\n| re_Server_Ids | currently being ignored for | |\n| | replication purposes, or an empty | |\n| | string for none, as specified in the | |\n| | IGNORE_SERVER_IDS option of the | |\n| | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_Server | The master\'s server_id value. | |\n| Id | | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Cr | The MASTER_SSL_CRL option of the | |\n| | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Cr | The MASTER_SSL_CRLPATH option of the | |\n| path | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Using_Gtid | Whether or not global transaction | |\n| | ID\'s are being used for replication | |\n| | (can be No, Slave_Pos, or | |\n| | Current_Pos). | |\n+---------------+---------------------------------------+-------------------+\n| Gtid_IO_Pos | Current global transaction ID value. | |\n+---------------+---------------------------------------+-------------------+\n| Retried_trans | Number of retried transactions for | |\n| ctions | this connection. Returned with SHOW | |\n| | ALL SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| Max_relay_log | Max relay log size for this | |\n| size | connection. Returned with SHOW ALL | |\n| | SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| Executed_log_ | How many log entries the replica has | |\n| ntries | executed. Returned with SHOW ALL | |\n| | SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_receive | How many heartbeats we have got from | |\n| _heartbeats | the master. Returned with SHOW ALL | |\n| | SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_heartbe | How often to request a heartbeat | |\n| t_period | packet from the master (in seconds). | |\n| | Returned with SHOW ALL SLAVES STATUS | |\n| | only. | |\n+---------------+---------------------------------------+-------------------+\n| Gtid_Slave_Po | GTID of the last event group | |\n| | replicated on a replica server, for | |\n| | each replication domain, as stored | |\n| | in the gtid_slave_pos system | |\n| | variable. Returned with SHOW ALL | |\n| | SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| SQL_Delay | Value specified by MASTER_DELAY in | MariaDB 10.2.3 |\n| | CHANGE MASTER (or 0 if none). | |\n+---------------+---------------------------------------+-------------------+\n| SQL_Remaining | When the replica is delaying the | MariaDB 10.2.3 |\n| Delay | execution of an event due to | |\n| | MASTER_DELAY, this is the number of | |\n| | seconds of delay remaining before | |\n| | the event will be applied. | |\n| | Otherwise, the value is NULL. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_SQL_Run | The state of the SQL driver threads, | MariaDB 10.2.3 |\n| ing_State | same as in SHOW PROCESSLIST. When | |\n| | the replica is delaying the | |\n| | execution of an event due to | |\n| | MASTER_DELAY, this field displays: | |\n| | \"Waiting until MASTER_DELAY seconds | |\n| | after master executed event\". | |\n+---------------+---------------------------------------+-------------------+\n| Slave_DDL_Gro | This status variable counts the | MariaDB 10.3.7 |\n| ps | occurrence of DDL statements. This | |\n| | is a replica-side counter for | |\n| | optimistic parallel replication. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_Non_Tra | This status variable counts the | MariaDB 10.3.7 |\n| sactional_Gro | occurrence of non-transactional | |\n| ps | event groups. This is a | |\n| | replica-side counter for optimistic | |\n| | parallel replication. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_Transac | This status variable counts the | MariaDB 10.3.7 |\n| ional_Groups | occurrence of transactional event | |\n| | groups. This is a replica-side | |\n| | counter for optimistic parallel | |\n| | replication. | |\n+---------------+---------------------------------------+-------------------+\n\nSHOW REPLICA STATUS\n-------------------\n\nMariaDB starting with 10.5.1\n----------------------------\nSHOW REPLICA STATUS is an alias for SHOW SLAVE STATUS from MariaDB 10.5.1.\n\nExamples\n--------\n\nIf you issue this statement using the mysql client, you can use a \\G statement\nterminator rather than a semicolon to obtain a more readable vertical layout.\n\nSHOW SLAVE STATUS\\G\n*************************** 1. row ***************************\n Slave_IO_State: Waiting for master to send event\n Master_Host: db01.example.com\n Master_User: replicant\n Master_Port: 3306\n Connect_Retry: 60\n Master_Log_File: mariadb-bin.000010\n Read_Master_Log_Pos: 548\n Relay_Log_File: relay-bin.000004\n Relay_Log_Pos: 837\n Relay_Master_Log_File: mariadb-bin.000010\n Slave_IO_Running: Yes\n Slave_SQL_Running: Yes\n Replicate_Do_DB:\n Replicate_Ignore_DB:\n Replicate_Do_Table:\n Replicate_Ignore_Table:\n Replicate_Wild_Do_Table:\n Replicate_Wild_Ignore_Table:\n Last_Errno: 0\n Last_Error:\n Skip_Counter: 0\n Exec_Master_Log_Pos: 548\n Relay_Log_Space: 1497\n Until_Condition: None\n Until_Log_File:\n Until_Log_Pos: 0\n Master_SSL_Allowed: No\n Master_SSL_CA_File:\n Master_SSL_CA_Path:\n Master_SSL_Cert:\n Master_SSL_Cipher:\n Master_SSL_Key:\n Seconds_Behind_Master: 0\nMaster_SSL_Verify_Server_Cert: No\n Last_IO_Errno: 0\n Last_IO_Error:\n Last_SQL_Errno: 0\n Last_SQL_Error:\n Replicate_Ignore_Server_Ids:\n Master_Server_Id: 101\n Master_SSL_Crl:\n Master_SSL_Crlpath:\n Using_Gtid: No\n Gtid_IO_Pos:\n\nSHOW ALL SLAVES STATUS\\G\n*************************** 1. row ***************************\n Connection_name:\n Slave_SQL_State: Slave has read all relay log; waiting for the\nslave I/O thread to update it\n Slave_IO_State: Waiting for master to send event\n Master_Host: db01.example.com\n Master_User: replicant\n Master_Port: 3306\n Connect_Retry: 60\n Master_Log_File: mariadb-bin.000010\n Read_Master_Log_Pos: 3608\n Relay_Log_File: relay-bin.000004\n Relay_Log_Pos: 3897\n Relay_Master_Log_File: mariadb-bin.000010\n Slave_IO_Running: Yes\n Slave_SQL_Running: Yes\n Replicate_Do_DB:\n Replicate_Ignore_DB:\n Replicate_Do_Table:\n Replicate_Ignore_Table:\n Replicate_Wild_Do_Table:\n Replicate_Wild_Ignore_Table:\n Last_Errno: 0\n Last_Error:\n Skip_Counter: 0\n Exec_Master_Log_Pos: 3608\n Relay_Log_Space: 4557\n Until_Condition: None\n Until_Log_File:\n Until_Log_Pos: 0\n Master_SSL_Allowed: No\n Master_SSL_CA_File:\n Master_SSL_CA_Path:\n Master_SSL_Cert:\n Master_SSL_Cipher:\n Master_SSL_Key:\n Seconds_Behind_Master: 0\nMaster_SSL_Verify_Server_Cert: No\n Last_IO_Errno: 0\n Last_IO_Error:\n Last_SQL_Errno: 0\n Last_SQL_Error:\n Replicate_Ignore_Server_Ids:\n Master_Server_Id: 101\n Master_SSL_Crl:\n Master_SSL_Crlpath:\n Using_Gtid: No\n Gtid_IO_Pos:\n Retried_transactions: 0\n Max_relay_log_size: 104857600\n Executed_log_entries: 40\n Slave_received_heartbeats: 11\n Slave_heartbeat_period: 1800.000\n Gtid_Slave_Pos: 0-101-2320\n\nYou can also access some of the variables directly from status variables:\n\nSET @@default_master_connection=\"test\" ;\nshow status like \"%slave%\"\n\nVariable_name Value\nCom_show_slave_hosts 0\nCom_show_slave_status 0\nCom_start_all_slaves 0\nCom_start_slave 0\nCom_stop_all_slaves 0\nCom_stop_slave 0\nRpl_semi_sync_slave_status OFF\nSlave_connections 0\nSlave_heartbeat_period 1800.000\nSlave_open_temp_tables 0\nSlave_received_heartbeats 0\nSlave_retried_transactions 0\nSlave_running OFF\nSlaves_connected 0\nSlaves_running 1\n\nURL: https://mariadb.com/kb/en/show-replica-status/') WHERE help_topic_id = 345;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (346,26,'SHOW MASTER STATUS','Syntax\n------\n\nSHOW MASTER STATUS\nSHOW BINLOG STATUS -- From MariaDB 10.5.2\n\nDescription\n-----------\n\nProvides status information about the binary log files of the primary.\n\nThis statement requires the SUPER privilege, the REPLICATION_CLIENT privilege,\nor, from MariaDB 10.5.2, the BINLOG MONITOR privilege.\n\nTo see information about the current GTIDs in the binary log, use the\ngtid_binlog_pos variable.\n\nSHOW MASTER STATUS was renamed to SHOW BINLOG STATUS in MariaDB 10.5.2, but\nthe old name remains an alias for compatibility purposes.\n\nExample\n-------\n\nSHOW MASTER STATUS;\n+--------------------+----------+--------------+------------------+\n| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |\n+--------------------+----------+--------------+------------------+\n| mariadb-bin.000016 | 475 | | |\n+--------------------+----------+--------------+------------------+\nSELECT @@global.gtid_binlog_pos;\n+--------------------------+\n| @@global.gtid_binlog_pos |\n+--------------------------+\n| 0-1-2 |\n+--------------------------+\n\nURL: https://mariadb.com/kb/en/show-binlog-status/','','https://mariadb.com/kb/en/show-binlog-status/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (347,26,'SHOW SLAVE HOSTS','Syntax\n------\n\nSHOW SLAVE HOSTS\nSHOW REPLICA HOSTS -- from MariaDB 10.5.1\n\nDescription\n-----------\n\nThis command is run on the primary and displays a list of replicas that are\ncurrently registered with it. Only replicas started with the\n--report-host=host_name option are visible in this list.\n\nThe output looks like this:\n\nSHOW SLAVE HOSTS;\n+------------+-----------+------+-----------+\n| Server_id | Host | Port | Master_id |\n+------------+-----------+------+-----------+\n| 192168010 | iconnect2 | 3306 | 192168011 |\n| 1921680101 | athena | 3306 | 192168011 |\n+------------+-----------+------+-----------+\n\n* Server_id: The unique server ID of the replica server, as configured in the\nserver\'s option file, or on the command line with --server-id=value.\n* Host: The host name of the replica server, as configured in the server\'s\noption file, or on the command line with --report-host=host_name. Note that\nthis can differ from the machine name as configured in the operating system.\n* Port: The port the replica server is listening on.\n* Master_id: The unique server ID of the primary server that the replica\nserver is replicating from.\n\nSome MariaDB and MySQL versions report another variable, rpl_recovery_rank.\nThis variable was never used, and was eventually removed in MariaDB 10.1.2 .\n\nRequires the REPLICATION MASTER ADMIN privilege (>= MariaDB 10.5.2) or the\nREPLICATION SLAVE privilege (<= MariaDB 10.5.1).\n\nSHOW REPLICA HOSTS\n------------------\n\nMariaDB starting with 10.5.1\n----------------------------\nSHOW REPLICA HOSTS is an alias for SHOW SLAVE HOSTS from MariaDB 10.5.1.\n\nURL: https://mariadb.com/kb/en/show-replica-hosts/','','https://mariadb.com/kb/en/show-replica-hosts/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (348,26,'SHOW PLUGINS','Syntax\n------\n\nSHOW PLUGINS;\n\nDescription\n-----------\n\nSHOW PLUGINS displays information about installed plugins. The Library column\nindicates the plugin library - if it is NULL, the plugin is built-in and\ncannot be uninstalled.\n\nThe PLUGINS table in the information_schema database contains more detailed\ninformation.\n\nFor specific information about storage engines (a particular type of plugin),\nsee the information_schema.ENGINES table and the SHOW ENGINES statement.\n\nExamples\n--------\n\nSHOW PLUGINS;\n+----------------------------+----------+--------------------+-------------+---\n-----+\n| Name | Status | Type | Library |\nLicense |\n+----------------------------+----------+--------------------+-------------+---\n-----+\n| binlog | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| mysql_native_password | ACTIVE | AUTHENTICATION | NULL |\nGPL |\n| mysql_old_password | ACTIVE | AUTHENTICATION | NULL |\nGPL |\n| MRG_MyISAM | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| MyISAM | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| CSV | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| MEMORY | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| FEDERATED | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| Aria | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| InnoDB | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL |\nGPL |\n...\n| INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL |\nGPL |\n| INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL |\nGPL |\n| SPHINX | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| FEEDBACK | DISABLED | INFORMATION SCHEMA | NULL |\nGPL |\n| partition | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| pam | ACTIVE | AUTHENTICATION | auth_pam.so |\nGPL |\n+----------------------------+----------+--------------------+-------------+---\n-----+\n\nURL: https://mariadb.com/kb/en/show-plugins/','','https://mariadb.com/kb/en/show-plugins/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (349,26,'SHOW PLUGINS SONAME','Syntax\n------\n\nSHOW PLUGINS SONAME { library | LIKE \'pattern\' | WHERE expr };\n\nDescription\n-----------\n\nSHOW PLUGINS SONAME displays information about compiled-in and all server\nplugins in the plugin_dir directory, including plugins that haven\'t been\ninstalled.\n\nExamples\n--------\n\nSHOW PLUGINS SONAME \'ha_example.so\';\n+----------+---------------+----------------+---------------+---------+\n| Name | Status | Type | Library | License |\n+----------+---------------+----------------+---------------+---------+\n| EXAMPLE | NOT INSTALLED | STORAGE ENGINE | ha_example.so | GPL |\n| UNUSABLE | NOT INSTALLED | DAEMON | ha_example.so | GPL |\n+----------+---------------+----------------+---------------+---------+\n\nThere is also a corresponding information_schema table, called ALL_PLUGINS,\nwhich contains more complete information.\n\nURL: https://mariadb.com/kb/en/show-plugins-soname/','','https://mariadb.com/kb/en/show-plugins-soname/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (350,26,'SET','Syntax\n------\n\nSET variable_assignment [, variable_assignment] ...\n\nvariable_assignment:\n user_var_name = expr\n | [GLOBAL | SESSION] system_var_name = expr\n | [@@global. | @@session. | @@]system_var_name = expr\n\nOne can also set a user variable in any expression with this syntax:\n\nuser_var_name:= expr\n\nDescription\n-----------\n\nThe SET statement assigns values to different types of variables that affect\nthe operation of the server or your client. Older versions of MySQL employed\nSET OPTION, but this syntax was deprecated in favor of SET without OPTION, and\nwas removed in MariaDB 10.0.\n\nChanging a system variable by using the SET statement does not make the change\npermanently. To do so, the change must be made in a configuration file.\n\nFor setting variables on a per-query basis, see SET STATEMENT.\n\nSee SHOW VARIABLES for documentation on viewing server system variables.\n\nSee Server System Variables for a list of all the system variables.\n\nGLOBAL / SESSION\n----------------\n\nWhen setting a system variable, the scope can be specified as either GLOBAL or\nSESSION.\n\nA global variable change affects all new sessions. It does not affect any\ncurrently open sessions, including the one that made the change.\n\nA session variable change affects the current session only.\n\nIf the variable has a session value, not specifying either GLOBAL or SESSION\nwill be the same as specifying SESSION. If the variable only has a global\nvalue, not specifying GLOBAL or SESSION will apply to the change to the global\nvalue.\n\nDEFAULT\n-------\n\nSetting a global variable to DEFAULT will restore it to the server default,\nand setting a session variable to DEFAULT will restore it to the current\nglobal value.\n\nExamples\n--------\n\n* innodb_sync_spin_loops is a global variable.\n* skip_parallel_replication is a session variable.\n* max_error_count is both global and session.\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE \n VARIABLE_NAME IN (\'max_error_count\', \'skip_parallel_replication\',\n\'innodb_sync_spin_loops\');\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 64 | 64 |\n| SKIP_PARALLEL_REPLICATION | OFF | NULL |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n\nSetting the session values:\n\nSET max_error_count=128;Query OK, 0 rows affected (0.000 sec)\n\nSET skip_parallel_replication=ON;Query OK, 0 rows affected (0.000 sec)\n\nSET innodb_sync_spin_loops=60;\nERROR 1229 (HY000): Variable \'innodb_sync_spin_loops\' is a GLOBAL variable \n and should be set with SET GLOBAL\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE \n VARIABLE_NAME IN (\'max_error_count\', \'skip_parallel_replication\',\n\'innodb_sync_spin_loops\');\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 128 | 64 |\n| SKIP_PARALLEL_REPLICATION | ON | NULL |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n\nSetting the global values:\n\nSET GLOBAL max_error_count=256;\n\nSET GLOBAL skip_parallel_replication=ON;\nERROR 1228 (HY000): Variable \'skip_parallel_replication\' is a SESSION variable \n and can\'t be used with SET GLOBAL\n\nSET GLOBAL innodb_sync_spin_loops=120;\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE \n VARIABLE_NAME IN (\'max_error_count\', \'skip_parallel_replication\',\n\'innodb_sync_spin_loops\');\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 128 | 256 |\n| SKIP_PARALLEL_REPLICATION | ON | NULL |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 120 |\n+---------------------------+---------------+--------------+\n\nSHOW VARIABLES will by default return the session value unless the variable is\nglobal only.\n\nSHOW VARIABLES LIKE \'max_error_count\';\n+-----------------+-------+\n| Variable_name | Value |\n+-----------------+-------+\n| max_error_count | 128 |\n+-----------------+-------+\n\nSHOW VARIABLES LIKE \'skip_parallel_replication\';\n+---------------------------+-------+\n| Variable_name | Value |\n+---------------------------+-------+\n| skip_parallel_replication | ON |\n+---------------------------+-------+\n\nSHOW VARIABLES LIKE \'innodb_sync_spin_loops\';\n+------------------------+-------+\n| Variable_name | Value |\n+------------------------+-------+\n| innodb_sync_spin_loops | 120 |\n+------------------------+-------+\n\nUsing the inplace syntax:\n\nSELECT (@a:=1);\n+---------+\n| (@a:=1) |\n+---------+\n| 1 |\n+---------+\n\nSELECT @a;\n+------+\n| @a |\n+------+\n| 1 |\n+------+\n\nURL: https://mariadb.com/kb/en/set/','','https://mariadb.com/kb/en/set/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (351,26,'SET CHARACTER SET','Syntax\n------\n\nSET {CHARACTER SET | CHARSET}\n {charset_name | DEFAULT}\n\nDescription\n-----------\n\nSets the character_set_client and character_set_results session system\nvariables to the specified character set and collation_connection to the value\nof collation_database, which implicitly sets character_set_connection to the\nvalue of character_set_database.\n\nThis maps all strings sent between the current client and the server with the\ngiven mapping.\n\nExample\n-------\n\nSHOW VARIABLES LIKE \'character_set\\_%\';\n+--------------------------+--------+\n| Variable_name | Value |\n+--------------------------+--------+\n| character_set_client | utf8 |\n| character_set_connection | utf8 |\n| character_set_database | latin1 |\n| character_set_filesystem | binary |\n| character_set_results | utf8 |\n| character_set_server | latin1 |\n| character_set_system | utf8 |\n+--------------------------+--------+\n\nSHOW VARIABLES LIKE \'collation%\';\n+----------------------+-------------------+\n| Variable_name | Value |\n+----------------------+-------------------+\n| collation_connection | utf8_general_ci |\n| collation_database | latin1_swedish_ci |\n| collation_server | latin1_swedish_ci |\n+----------------------+-------------------+\n\nSET CHARACTER SET utf8mb4;\n\nSHOW VARIABLES LIKE \'character_set\\_%\';\n+--------------------------+---------+\n| Variable_name | Value |\n+--------------------------+---------+\n| character_set_client | utf8mb4 |\n| character_set_connection | latin1 |\n| character_set_database | latin1 |\n| character_set_filesystem | binary |\n| character_set_results | utf8mb4 |\n| character_set_server | latin1 |\n| character_set_system | utf8 |\n+--------------------------+---------+\n\nSHOW VARIABLES LIKE \'collation%\';\n+----------------------+-------------------+\n| Variable_name | Value |\n+----------------------+-------------------+\n| collation_connection | latin1_swedish_ci |\n| collation_database | latin1_swedish_ci |\n| collation_server | latin1_swedish_ci |\n+----------------------+-------------------+\n\nURL: https://mariadb.com/kb/en/set-character-set/','','https://mariadb.com/kb/en/set-character-set/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (352,26,'SET NAMES','Syntax\n------\n\nSET NAMES {\'charset_name\'\n [COLLATE \'collation_name\'] | DEFAULT}\n\nDescription\n-----------\n\nSets the character_set_client, character_set_connection, character_set_results\nand, implicitly, the collation_connection session system variables to the\nspecified character set and collation.\n\nThis determines which character set the client will use to send statements to\nthe server, and the server will use for sending results back to the client.\n\nucs2, utf16, utf16le and utf32 are not valid character sets for SET NAMES, as\nthey cannot be used as client character sets.\n\nThe collation clause is optional. If not defined (or if DEFAULT is specified),\nthe default collation for the character set will be used.\n\nQuotes are optional for the character set or collation clauses.\n\nExamples\n--------\n\nSELECT VARIABLE_NAME, SESSION_VALUE \n FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'character_set_c%\' OR\n VARIABLE_NAME LIKE \'character_set_re%\' OR\n VARIABLE_NAME LIKE \'collation_c%\';\n+--------------------------+-----------------+\n| VARIABLE_NAME | SESSION_VALUE |\n+--------------------------+-----------------+\n| CHARACTER_SET_RESULTS | utf8 |\n| CHARACTER_SET_CONNECTION | utf8 |\n| CHARACTER_SET_CLIENT | utf8 |\n| COLLATION_CONNECTION | utf8_general_ci |\n+--------------------------+-----------------+\n\nSET NAMES big5;\n\nSELECT VARIABLE_NAME, SESSION_VALUE \n FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'character_set_c%\' OR\n VARIABLE_NAME LIKE \'character_set_re%\' OR\n VARIABLE_NAME LIKE \'collation_c%\';\n+--------------------------+-----------------+\n| VARIABLE_NAME | SESSION_VALUE |\n+--------------------------+-----------------+\n| CHARACTER_SET_RESULTS | big5 |\n| CHARACTER_SET_CONNECTION | big5 |\n| CHARACTER_SET_CLIENT | big5 |\n| COLLATION_CONNECTION | big5_chinese_ci |\n+--------------------------+-----------------+\n\nSET NAMES \'latin1\' COLLATE \'latin1_bin\';\n\nSELECT VARIABLE_NAME, SESSION_VALUE \n FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'character_set_c%\' OR\n VARIABLE_NAME LIKE \'character_set_re%\' OR\n VARIABLE_NAME LIKE \'collation_c%\';\n+--------------------------+---------------+\n| VARIABLE_NAME | SESSION_VALUE |\n+--------------------------+---------------+\n| CHARACTER_SET_RESULTS | latin1 |\n| CHARACTER_SET_CONNECTION | latin1 |\n| CHARACTER_SET_CLIENT | latin1 |\n| COLLATION_CONNECTION | latin1_bin |\n+--------------------------+---------------+\n\nSET NAMES DEFAULT;\n\nSELECT VARIABLE_NAME, SESSION_VALUE \n FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'character_set_c%\' OR\n VARIABLE_NAME LIKE \'character_set_re%\' OR\n VARIABLE_NAME LIKE \'collation_c%\';\n+--------------------------+-------------------+\n| VARIABLE_NAME | SESSION_VALUE |\n+--------------------------+-------------------+\n| CHARACTER_SET_RESULTS | latin1 |\n| CHARACTER_SET_CONNECTION | latin1 |\n| CHARACTER_SET_CLIENT | latin1 |\n| COLLATION_CONNECTION | latin1_swedish_ci |\n+--------------------------+-------------------+\n\nURL: https://mariadb.com/kb/en/set-names/','','https://mariadb.com/kb/en/set-names/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (353,26,'SET SQL_LOG_BIN','Syntax\n------\n\nSET [SESSION] sql_log_bin = {0|1}\n\nDescription\n-----------\n\nSets the sql_log_bin system variable, which disables or enables binary logging\nfor the current connection, if the client has the SUPER privilege. The\nstatement is refused with an error if the client does not have that privilege.\n\nBefore MariaDB 5.5 and before MySQL 5.6 one could also set sql_log_bin as a\nglobal variable. This was disabled as this was too dangerous as it could\ndamage replication.\n\nURL: https://mariadb.com/kb/en/set-sql_log_bin/','','https://mariadb.com/kb/en/set-sql_log_bin/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (354,26,'SET STATEMENT','MariaDB starting with 10.1.2\n----------------------------\nPer-query variables were introduced in MariaDB 10.1.2\n\nSET STATEMENT can be used to set the value of a system variable for the\nduration of the statement. It is also possible to set multiple variables.\n\nSyntax\n------\n\nSET STATEMENT var1=value1 [, var2=value2, ...] \n FOR <statement>\n\nwhere varN is a system variable (list of allowed variables is provided below),\nand valueN is a constant literal.\n\nDescription\n-----------\n\nSET STATEMENT var1=value1 FOR stmt\n\nis roughly equivalent to\n\nSET @save_value=@@var1;\nSET SESSION var1=value1;\nstmt;\nSET SESSION var1=@save_value;\n\nThe server parses the whole statement before executing it, so any variables\nset in this fashion that affect the parser may not have the expected effect.\nExamples include the charset variables, sql_mode=ansi_quotes, etc.\n\nExamples\n--------\n\nOne can limit statement execution time max_statement_time:\n\nSET STATEMENT max_statement_time=1000 FOR SELECT ... ;\n\nOne can switch on/off individual optimizations:\n\nSET STATEMENT optimizer_switch=\'materialization=off\' FOR SELECT ....;\n\nIt is possible to enable MRR/BKA for a query:\n\nSET STATEMENT join_cache_level=6, optimizer_switch=\'mrr=on\' FOR SELECT ...\n\nNote that it makes no sense to try to set a session variable inside a SET\nSTATEMENT:\n\n#USELESS STATEMENT\nSET STATEMENT sort_buffer_size = 100000 for SET SESSION sort_buffer_size =\n200000;\n\nFor the above, after setting sort_buffer_size to 200000 it will be reset to\nits original state (the state before the SET STATEMENT started) after the\nstatement execution.\n\nLimitations\n-----------\n\nThere are a number of variables that cannot be set on per-query basis. These\ninclude:\n\n* autocommit\n* character_set_client\n* character_set_connection\n* character_set_filesystem\n* collation_connection\n* default_master_connection\n* debug_sync\n* interactive_timeout\n* gtid_domain_id\n* last_insert_id\n* log_slow_filter\n* log_slow_rate_limit\n* log_slow_verbosity\n* long_query_time\n* min_examined_row_limit\n* profiling\n* profiling_history_size\n* query_cache_type\n* rand_seed1\n* rand_seed2\n* skip_replication\n* slow_query_log\n* sql_log_off\n* tx_isolation\n* wait_timeout\n\nSource\n------\n\n* The feature was originally implemented as a Google Summer of Code 2009\nproject by Joseph Lukas. \n* Percona Server 5.6 included it as Per-query variable statement\n* MariaDB ported the patch and fixed many bugs. The task in MariaDB Jira is\nMDEV-5231.\n\nURL: https://mariadb.com/kb/en/set-statement/','','https://mariadb.com/kb/en/set-statement/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (355,26,'SET Variable','Syntax\n------\n\nSET var_name = expr [, var_name = expr] ...\n\nDescription\n-----------\n\nThe SET statement in stored programs is an extended version of the general SET\nstatement. Referenced variables may be ones declared inside a stored program,\nglobal system variables, or user-defined variables.\n\nThe SET statement in stored programs is implemented as part of the\npre-existing SET syntax. This allows an extended syntax of SET a=x, b=y, ...\nwhere different variable types (locally declared variables, global and session\nserver variables, user-defined variables) can be mixed. This also allows\ncombinations of local variables and some options that make sense only for\nsystem variables; in that case, the options are recognized but ignored.\n\nSET can be used with both local variables and user-defined variables.\n\nWhen setting several variables using the columns returned by a query, SELECT\nINTO should be preferred.\n\nTo set many variables to the same value, the LAST_VALUE( ) function can be\nused.\n\nBelow is an example of how a user-defined variable may be set:\n\nSET @x = 1;\n\nURL: https://mariadb.com/kb/en/set-variable/','','https://mariadb.com/kb/en/set-variable/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (356,26,'About SHOW','SHOW has many forms that provide information about databases, tables, columns,\nor status information about the server. These include:\n\n* SHOW AUTHORS\n* SHOW CHARACTER SET [like_or_where]\n* SHOW COLLATION [like_or_where]\n* SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where]\n* SHOW CONTRIBUTORS\n* SHOW CREATE DATABASE db_name\n* SHOW CREATE EVENT event_name\n* SHOW CREATE PACKAGE package_name\n* SHOW CREATE PACKAGE BODY package_name\n* SHOW CREATE PROCEDURE proc_name\n* SHOW CREATE TABLE tbl_name\n* SHOW CREATE TRIGGER trigger_name\n* SHOW CREATE VIEW view_name\n* SHOW DATABASES [like_or_where]\n* SHOW ENGINE engine_name {STATUS | MUTEX}\n* SHOW [STORAGE] ENGINES\n* SHOW ERRORS [LIMIT [offset,] row_count]\n* SHOW [FULL] EVENTS\n* SHOW FUNCTION CODE func_name\n* SHOW FUNCTION STATUS [like_or_where]\n* SHOW GRANTS FOR user\n* SHOW INDEX FROM tbl_name [FROM db_name]\n* SHOW INNODB STATUS\n* SHOW OPEN TABLES [FROM db_name] [like_or_where]\n* SHOW PLUGINS\n* SHOW PROCEDURE CODE proc_name\n* SHOW PROCEDURE STATUS [like_or_where]\n* SHOW PRIVILEGES\n* SHOW [FULL] PROCESSLIST\n* SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n]\n* SHOW PROFILES\n* SHOW [GLOBAL | SESSION] STATUS [like_or_where]\n* SHOW TABLE STATUS [FROM db_name] [like_or_where]\n* SHOW TABLES [FROM db_name] [like_or_where]\n* SHOW TRIGGERS [FROM db_name] [like_or_where]\n* SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]\n* SHOW WARNINGS [LIMIT [offset,] row_count]\n\nlike_or_where:\n LIKE \'pattern\'\n | WHERE expr\n\nIf the syntax for a given SHOW statement includes a LIKE \'pattern\' part,\n\'pattern\' is a string that can contain the SQL \"%\" and \"_\" wildcard\ncharacters. The pattern is useful for restricting statement output to matching\nvalues.\n\nSeveral SHOW statements also accept a WHERE clause that provides more\nflexibility in specifying which rows to display. See Extended Show.\n\nURL: https://mariadb.com/kb/en/about-show/','','https://mariadb.com/kb/en/about-show/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (357,26,'Extended Show','The following SHOW statements can be extended by using a WHERE clause and a\nLIKE clause to refine the results:\n\n* SHOW CHARACTER SET\n* SHOW COLLATION\n* SHOW COLUMNS\n* SHOW DATABASES\n* SHOW FUNCTION STATUS\n* SHOW INDEX\n* SHOW OPEN TABLES\n* SHOW PACKAGE STATUS\n* SHOW PACKAGE BODY STATUS\n* SHOW INDEX\n* SHOW PROCEDURE STATUS\n* SHOW STATUS\n* SHOW TABLE STATUS\n* SHOW TABLES\n* SHOW TRIGGERS\n* SHOW VARIABLES\n\nAs with a regular SELECT, the WHERE clause can be used for the specific\ncolumns returned, and the LIKE clause with the regular wildcards.\n\nExamples\n--------\n\nSHOW TABLES;\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n| t1 |\n| view1 |\n+----------------------+\n\nShowing the tables beginning with a only.\n\nSHOW TABLES WHERE Tables_in_test LIKE \'a%\';\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n+----------------------+\n\nVariables whose name starts with aria and with a valued of greater than 8192:\n\nSHOW VARIABLES WHERE Variable_name LIKE \'aria%\' AND Value >8192;\n+------------------------------+---------------------+\n| Variable_name | Value |\n+------------------------------+---------------------+\n| aria_checkpoint_log_activity | 1048576 |\n| aria_log_file_size | 1073741824 |\n| aria_max_sort_file_size | 9223372036853727232 |\n| aria_pagecache_buffer_size | 134217728 |\n| aria_sort_buffer_size | 134217728 |\n+------------------------------+---------------------+\n\nShortcut, just returning variables whose name begins with aria.\n\nSHOW VARIABLES LIKE \'aria%\';\n+------------------------------------------+---------------------+\n| Variable_name | Value |\n+------------------------------------------+---------------------+\n| aria_block_size | 8192 |\n| aria_checkpoint_interval | 30 |\n| aria_checkpoint_log_activity | 1048576 |\n| aria_force_start_after_recovery_failures | 0 |\n| aria_group_commit | none |\n| aria_group_commit_interval | 0 |\n| aria_log_file_size | 1073741824 |\n| aria_log_purge_type | immediate |\n| aria_max_sort_file_size | 9223372036853727232 |\n| aria_page_checksum | ON |\n| aria_pagecache_age_threshold | 300 |\n| aria_pagecache_buffer_size | 134217728 |\n| aria_pagecache_division_limit | 100 |\n| aria_recover | NORMAL |\n| aria_repair_threads | 1 |\n| aria_sort_buffer_size | 134217728 |\n| aria_stats_method | nulls_unequal |\n| aria_sync_log_dir | NEWFILE |\n| aria_used_for_temp_tables | ON |\n+------------------------------------------+---------------------+\n\nURL: https://mariadb.com/kb/en/extended-show/','','https://mariadb.com/kb/en/extended-show/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (358,26,'SHOW AUTHORS','Syntax\n------\n\nSHOW AUTHORS\n\nDescription\n-----------\n\nThe SHOW AUTHORS statement displays information about the people who work on\nMariaDB. For each author, it displays Name, Location, and Comment values. All\ncolumns are encoded as latin1.\n\nThese include:\n\n* First the active people in MariaDB are listed.\n* Then the active people in MySQL.\n* Last the people that have contributed to MariaDB/MySQL in the past.\n\nThe order is somewhat related to importance of the contribution given to the\nMariaDB project, but this is not 100% accurate. There is still room for\nimprovement and debate...\n\nExample\n-------\n\nSHOW AUTHORS\\G\n*************************** 1. row ***************************\n Name: Michael (Monty) Widenius\nLocation: Tusby, Finland\n Comment: Lead developer and main author\n*************************** 2. row ***************************\n Name: Sergei Golubchik\nLocation: Kerpen, Germany\n Comment: Architect, Full-text search, precision math, plugin framework,\nmerges etc\n*************************** 3. row ***************************\n Name: Igor Babaev\nLocation: Bellevue, USA\n Comment: Optimizer, keycache, core work\n*************************** 4. row ***************************\n Name: Sergey Petrunia\nLocation: St. Petersburg, Russia\n Comment: Optimizer\n*************************** 5. row ***************************\n Name: Oleksandr Byelkin\nLocation: Lugansk, Ukraine\n Comment: Query Cache (4.0), Subqueries (4.1), Views (5.0)\n*************************** 6. row ***************************\n Name: Timour Katchaounov\nLocation: Sofia , Bulgaria\n Comment: Optimizer\n*************************** 7. row ***************************\n Name: Kristian Nielsen\nLocation: Copenhagen, Denmark\n Comment: Replication, Async client prototocol, General buildbot stuff\n*************************** 8. row ***************************\n Name: Alexander (Bar) Barkov\nLocation: Izhevsk, Russia\n Comment: Unicode and character sets\n*************************** 9. row ***************************\n Name: Alexey Botchkov (Holyfoot)\nLocation: Izhevsk, Russia\n Comment: GIS extensions, embedded server, precision math\n*************************** 10. row ***************************\n Name: Daniel Bartholomew\nLocation: Raleigh, USA\n Comment: MariaDB documentation, Buildbot, releases\n*************************** 11. row ***************************\n Name: Colin Charles\nLocation: Selangor, Malesia\n Comment: MariaDB documentation, talks at a LOT of conferences\n*************************** 12. row ***************************\n Name: Sergey Vojtovich\nLocation: Izhevsk, Russia\n Comment: initial implementation of plugin architecture, maintained native\nstorage engines (MyISAM, MEMORY, ARCHIVE, etc), rewrite of table cache\n*************************** 13. row ***************************\n Name: Vladislav Vaintroub\nLocation: Mannheim, Germany\n Comment: MariaDB Java connector, new thread pool, Windows optimizations\n*************************** 14. row ***************************\n Name: Elena Stepanova\nLocation: Sankt Petersburg, Russia\n Comment: QA, test cases\n*************************** 15. row ***************************\n Name: Georg Richter\nLocation: Heidelberg, Germany\n Comment: New LGPL C connector, PHP connector\n*************************** 16. row ***************************\n Name: Jan Lindström\nLocation: Ylämylly, Finland\n Comment: Working on InnoDB\n*************************** 17. row ***************************\n Name: Lixun Peng\nLocation: Hangzhou, China\n Comment: Multi Source replication\n*************************** 18. row ***************************\n Name: Olivier Bertrand\nLocation: Paris, France\n Comment: CONNECT storage engine\n*************************** 19. row ***************************\n Name: Kentoku Shiba\nLocation: Tokyo, Japan\n Comment: Spider storage engine, metadata_lock_info Information schema\n*************************** 20. row ***************************\n Name: Percona\nLocation: CA, USA\n Comment: XtraDB, microslow patches, extensions to slow log\n*************************** 21. row ***************************\n Name: Vicentiu Ciorbaru\nLocation: Bucharest, Romania\n Comment: Roles\n*************************** 22. row ***************************\n Name: Sudheera Palihakkara\nLocation: \n Comment: PCRE Regular Expressions\n*************************** 23. row ***************************\n Name: Pavel Ivanov\nLocation: USA\n Comment: Some patches and bug fixes\n*************************** 24. row ***************************\n Name: Konstantin Osipov\nLocation: Moscow, Russia\n Comment: Prepared statements (4.1), Cursors (5.0), GET_LOCK (10.0)\n*************************** 25. row ***************************\n Name: Ian Gilfillan\nLocation: South Africa\n Comment: MariaDB documentation\n*************************** 26. row ***************************\n Name: Federico Razolli\nLocation: Italy\n Comment: MariaDB documentation Italian translation\n*************************** 27. row ***************************\n Name: Guilhem Bichot\nLocation: Bordeaux, France\n Comment: Replication (since 4.0)\n*************************** 28. row ***************************\n Name: Andrei Elkin\nLocation: Espoo, Finland\n Comment: Replication\n*************************** 29. row ***************************\n Name: Dmitri Lenev\nLocation: Moscow, Russia\n Comment: Time zones support (4.1), Triggers (5.0)\n*************************** 30. row ***************************\n Name: Marc Alff\nLocation: Denver, CO, USA\n Comment: Signal, Resignal, Performance schema\n*************************** 31. row ***************************\n Name: Mikael Ronström\nLocation: Stockholm, Sweden\n Comment: NDB Cluster, Partitioning, online alter table\n*************************** 32. row ***************************\n Name: Ingo Strüwing\nLocation: Berlin, Germany\n Comment: Bug fixing in MyISAM, Merge tables etc\n*************************** 33. row ***************************\n Name: Marko Mäkelä\nLocation: Helsinki, Finland\n Comment: InnoDB core developer\n...\n\nURL: https://mariadb.com/kb/en/show-authors/','','https://mariadb.com/kb/en/show-authors/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (359,26,'SHOW BINARY LOGS','Syntax\n------\n\nSHOW BINARY LOGS\nSHOW MASTER LOGS\n\nDescription\n-----------\n\nLists the binary log files on the server. This statement is used as part of\nthe procedure described in PURGE BINARY LOGS, that shows how to determine\nwhich logs can be purged.\n\nThis statement requires the SUPER privilege, the REPLICATION_CLIENT privilege,\nor, from MariaDB 10.5.2, the BINLOG MONITOR privilege.\n\nExamples\n--------\n\nSHOW BINARY LOGS;\n+--------------------+-----------+\n| Log_name | File_size |\n+--------------------+-----------+\n| mariadb-bin.000001 | 19039 |\n| mariadb-bin.000002 | 717389 |\n| mariadb-bin.000003 | 300 |\n| mariadb-bin.000004 | 333 |\n| mariadb-bin.000005 | 899 |\n| mariadb-bin.000006 | 125 |\n| mariadb-bin.000007 | 18907 |\n| mariadb-bin.000008 | 19530 |\n| mariadb-bin.000009 | 151 |\n| mariadb-bin.000010 | 151 |\n| mariadb-bin.000011 | 125 |\n| mariadb-bin.000012 | 151 |\n| mariadb-bin.000013 | 151 |\n| mariadb-bin.000014 | 125 |\n| mariadb-bin.000015 | 151 |\n| mariadb-bin.000016 | 314 |\n+--------------------+-----------+\n\nURL: https://mariadb.com/kb/en/show-binary-logs/','','https://mariadb.com/kb/en/show-binary-logs/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (360,26,'SHOW BINLOG EVENTS','Syntax\n------\n\nSHOW BINLOG EVENTS\n [IN \'log_name\'] [FROM pos] [LIMIT [offset,] row_count]\n\nDescription\n-----------\n\nShows the events in the binary log. If you do not specify \'log_name\', the\nfirst binary log is displayed.\n\nRequires the BINLOG MONITOR privilege (>= MariaDB 10.5.2) or the REPLICATION\nSLAVE privilege (<= MariaDB 10.5.1).\n\nExample\n-------\n\nSHOW BINLOG EVENTS IN \'mysql_sandbox10019-bin.000002\';\n+-------------------------------+-----+-------------------+-----------+--------\n----+------------------------------------------------+\n| Log_name | Pos | Event_type | Server_id |\nEnd_log_pos | Info |\n+-------------------------------+-----+-------------------+-----------+--------\n----+------------------------------------------------+\n| mysql_sandbox10019-bin.000002 | 4 | Format_desc | 1 | \n 248 | Server ver: 10.0.19-MariaDB-log, Binlog ver: 4 |\n| mysql_sandbox10019-bin.000002 | 248 | Gtid_list | 1 | \n 273 | [] |\n| mysql_sandbox10019-bin.000002 | 273 | Binlog_checkpoint | 1 | \n 325 | mysql_sandbox10019-bin.000002 |\n| mysql_sandbox10019-bin.000002 | 325 | Gtid | 1 | \n 363 | GTID 0-1-1 |\n| mysql_sandbox10019-bin.000002 | 363 | Query | 1 | \n 446 | CREATE DATABASE blog |\n| mysql_sandbox10019-bin.000002 | 446 | Gtid | 1 | \n 484 | GTID 0-1-2 |\n| mysql_sandbox10019-bin.000002 | 484 | Query | 1 | \n 571 | use `blog`; CREATE TABLE bb (id INT) |\n+-------------------------------+-----+-------------------+-----------+--------\n----+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-binlog-events/','','https://mariadb.com/kb/en/show-binlog-events/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (361,26,'SHOW CHARACTER SET','Syntax\n------\n\nSHOW CHARACTER SET\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThe SHOW CHARACTER SET statement shows all available character sets. The LIKE\nclause, if present on its own, indicates which character set names to match.\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe same information can be queried from the Information Schema CHARACTER_SETS\ntable.\n\nSee Setting Character Sets and Collations for details on specifying the\ncharacter set at the server, database, table and column levels.\n\nExamples\n--------\n\nSHOW CHARACTER SET LIKE \'latin%\';\n+---------+-----------------------------+-------------------+--------+\n| Charset | Description | Default collation | Maxlen |\n+---------+-----------------------------+-------------------+--------+\n| latin1 | cp1252 West European | latin1_swedish_ci | 1 |\n| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |\n| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |\n| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |\n+---------+-----------------------------+-------------------+--------+\n\nSHOW CHARACTER SET WHERE Maxlen LIKE \'2\';\n+---------+---------------------------+-------------------+--------+\n| Charset | Description | Default collation | Maxlen |\n+---------+---------------------------+-------------------+--------+\n| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |\n| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |\n| euckr | EUC-KR Korean | euckr_korean_ci | 2 |\n| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |\n| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |\n| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |\n| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |\n+---------+---------------------------+-------------------+--------+\n\nURL: https://mariadb.com/kb/en/show-character-set/','','https://mariadb.com/kb/en/show-character-set/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (362,26,'SHOW CLIENT_STATISTICS','Syntax\n------\n\nSHOW CLIENT_STATISTICS\n\nDescription\n-----------\n\nThe SHOW CLIENT_STATISTICS statement is part of the User Statistics feature.\nIt was removed as a separate statement in MariaDB 10.1.1, but effectively\nreplaced by the generic SHOW information_schema_table statement. The\ninformation_schema.CLIENT_STATISTICS table holds statistics about client\nconnections.\n\nThe userstat system variable must be set to 1 to activate this feature. See\nthe User Statistics and information_schema.CLIENT_STATISTICS articles for more\ninformation.\n\nExample\n-------\n\nSHOW CLIENT_STATISTICS\\G\n*************************** 1. row ***************************\n Client: localhost\n Total_connections: 35\nConcurrent_connections: 0\n Connected_time: 708\n Busy_time: 2.5557979999999985\n Cpu_time: 0.04123740000000002\n Bytes_received: 3883\n Bytes_sent: 21595\n Binlog_bytes_written: 0\n Rows_read: 18\n Rows_sent: 115\n Rows_deleted: 0\n Rows_inserted: 0\n Rows_updated: 0\n Select_commands: 70\n Update_commands: 0\n Other_commands: 0\n Commit_transactions: 1\n Rollback_transactions: 0\n Denied_connections: 0\n Lost_connections: 0\n Access_denied: 0\n Empty_queries: 35\n\nURL: https://mariadb.com/kb/en/show-client-statistics/','','https://mariadb.com/kb/en/show-client-statistics/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (363,26,'SHOW CONTRIBUTORS','Syntax\n------\n\nSHOW CONTRIBUTORS\n\nDescription\n-----------\n\nThe SHOW CONTRIBUTORS statement displays information about the companies and\npeople who financially contribute to MariaDB. For each contributor, it\ndisplays Name, Location, and Comment values. All columns are encoded as latin1.\n\nIt displays all members and sponsors of the MariaDB Foundation as well as\nother financial contributors.\n\nExample\n-------\n\nSHOW CONTRIBUTORS;\n+---------------------+-------------------------------+------------------------\n------------------------------------+\n| Name | Location | Comment \n |\n+---------------------+-------------------------------+------------------------\n------------------------------------+\n| Alibaba Cloud | https://www.alibabacloud.com/ | Platinum Sponsor of\nthe MariaDB Foundation |\n| Tencent Cloud | https://cloud.tencent.com | Platinum Sponsor of\nthe MariaDB Foundation |\n| Microsoft | https://microsoft.com/ | Platinum Sponsor of\nthe MariaDB Foundation |\n| MariaDB Corporation | https://mariadb.com | Founding member,\nPlatinum Sponsor of the MariaDB Foundation |\n| ServiceNow | https://servicenow.com | Platinum Sponsor of\nthe MariaDB Foundation |\n| Intel | https://www.intel.com | Platinum Sponsor of\nthe MariaDB Foundation |\n| SIT | https://sit.org | Platinum Sponsor of\nthe MariaDB Foundation |\n| Visma | https://visma.com | Gold Sponsor of the\nMariaDB Foundation |\n| DBS | https://dbs.com | Gold Sponsor of the\nMariaDB Foundation |\n| IBM | https://www.ibm.com | Gold Sponsor of the\nMariaDB Foundation |\n| Automattic | https://automattic.com | Silver Sponsor of the\nMariaDB Foundation |\n| Percona | https://www.percona.com/ | Sponsor of the MariaDB\nFoundation |\n| Galera Cluster | https://galeracluster.com | Sponsor of the MariaDB\nFoundation |\n| Google | USA | Sponsoring encryption,\nparallel replication and GTID |\n| Facebook | USA | Sponsoring\nnon-blocking API, LIMIT ROWS EXAMINED etc |\n| Ronald Bradford | Brisbane, Australia | EFF contribution for\nUC2006 Auction |\n| Sheeri Kritzer | Boston, Mass. USA | EFF contribution for\nUC2006 Auction |\n| Mark Shuttleworth | London, UK. | EFF contribution for\nUC2006 Auction |\n+---------------------+-------------------------------+------------------------\n------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-contributors/','','https://mariadb.com/kb/en/show-contributors/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (364,26,'SHOW CREATE DATABASE','Syntax\n------\n\nSHOW CREATE {DATABASE | SCHEMA} db_name\n\nDescription\n-----------\n\nShows the CREATE DATABASE statement that creates the given database. SHOW\nCREATE SCHEMA is a synonym for SHOW CREATE DATABASE. SHOW CREATE DATABASE\nquotes database names according to the value of the sql_quote_show_create\nserver system variable.\n\nExamples\n--------\n\nSHOW CREATE DATABASE test;\n+----------+-----------------------------------------------------------------+\n| Database | Create Database |\n+----------+-----------------------------------------------------------------+\n| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ |\n+----------+-----------------------------------------------------------------+\n\nSHOW CREATE SCHEMA test;\n+----------+-----------------------------------------------------------------+\n| Database | Create Database |\n+----------+-----------------------------------------------------------------+\n| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ |\n+----------+-----------------------------------------------------------------+\n\nWith sql_quote_show_create off:\n\nSHOW CREATE DATABASE test;\n+----------+---------------------------------------------------------------+\n| Database | Create Database |\n+----------+---------------------------------------------------------------+\n| test | CREATE DATABASE test /*!40100 DEFAULT CHARACTER SET latin1 */ |\n+----------+---------------------------------------------------------------+\n\nWith a comment, from MariaDB 10.5:\n\nSHOW CREATE DATABASE p;\n+----------+-------------------------------------------------------------------\n------------------+\n| Database | Create Database \n |\n+----------+-------------------------------------------------------------------\n------------------+\n| p | CREATE DATABASE `p` /*!40100 DEFAULT CHARACTER SET latin1 */\nCOMMENT \'presentations\' |\n+----------+-------------------------------------------------------------------\n------------------+\n\nURL: https://mariadb.com/kb/en/show-create-database/','','https://mariadb.com/kb/en/show-create-database/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (365,26,'SHOW CREATE EVENT','Syntax\n------\n\nSHOW CREATE EVENT event_name\n\nDescription\n-----------\n\nThis statement displays the CREATE EVENT statement needed to re-create a given\nevent, as well as the SQL_MODE that was used when the trigger has been created\nand the character set used by the connection. To find out which events are\npresent, use SHOW EVENTS.\n\nThe output of this statement is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n\nThe information_schema.EVENTS table provides similar, but more complete,\ninformation.\n\nExamples\n--------\n\nSHOW CREATE EVENT test.e_daily\\G\n*************************** 1. row ***************************\n Event: e_daily\n sql_mode:\n time_zone: SYSTEM\n Create Event: CREATE EVENT `e_daily`\n ON SCHEDULE EVERY 1 DAY\n STARTS CURRENT_TIMESTAMP + INTERVAL 6 HOUR\n ON COMPLETION NOT PRESERVE\n ENABLE\n COMMENT \'Saves total number of sessions then\n clears the table each day\'\n DO BEGIN\n INSERT INTO site_activity.totals (time, total)\n SELECT CURRENT_TIMESTAMP, COUNT(*)\n FROM site_activity.sessions;\n DELETE FROM site_activity.sessions;\n END\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-create-event/','','https://mariadb.com/kb/en/show-create-event/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (366,26,'SHOW CREATE FUNCTION','Syntax\n------\n\nSHOW CREATE FUNCTION func_name\n\nDescription\n-----------\n\nThis statement is similar to SHOW CREATE PROCEDURE but for stored functions.\n\nThe output of this statement is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n\nExample\n-------\n\nSHOW CREATE FUNCTION VatCents\\G\n*************************** 1. row ***************************\n Function: VatCents\n sql_mode:\n Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION\n`VatCents`(price DECIMAL(10,2)) RETURNS int(11)\n DETERMINISTIC\nBEGIN\n DECLARE x INT;\n SET x = price * 114;\n RETURN x;\nEND\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-create-function/','','https://mariadb.com/kb/en/show-create-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (367,26,'SHOW CREATE PACKAGE','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nSHOW CREATE PACKAGE [ db_name . ] package_name\n\nDescription\n-----------\n\nThe SHOW CREATE PACKAGE statement can be used when Oracle SQL_MODE is set.\n\nShows the CREATE statement that creates the given package specification.\n\nExamples\n--------\n\nSHOW CREATE PACKAGE employee_tools\\G\n*************************** 1. row ***************************\n Package: employee_tools\n sql_mode:\nPIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS\nNO_FIELD_OPTIONS,NO_AUTO_CREATE_USER\n Create Package: CREATE DEFINER=\"root\"@\"localhost\" PACKAGE\n\"employee_tools\" AS\n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);\n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));\n PROCEDURE raiseSalaryStd(eid INT);\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));\nEND\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-create-package/','','https://mariadb.com/kb/en/show-create-package/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (368,26,'SHOW CREATE PACKAGE BODY','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nSHOW CREATE PACKAGE BODY [ db_name . ] package_name\n\nDescription\n-----------\n\nThe SHOW CREATE PACKAGE BODY statement can be used when Oracle SQL_MODE is set.\n\nShows the CREATE statement that creates the given package body (i.e. the\nimplementation).\n\nExamples\n--------\n\nSHOW CREATE PACKAGE BODY employee_tools\\G\n*************************** 1. row ***************************\n Package body: employee_tools\n sql_mode:\nPIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS\nNO_FIELD_OPTIONS,NO_AUTO_CREATE_USER\n Create Package Body: CREATE DEFINER=\"root\"@\"localhost\" PACKAGE BODY\n\"employee_tools\" AS\n\nstdRaiseAmount DECIMAL(10,2):=500;\n\nPROCEDURE log (eid INT, ecmnt TEXT) AS\n BEGIN\n INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt);\n END;\n\nPROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS\n eid INT;\n BEGIN\n INSERT INTO employee (name, salary) VALUES (ename, esalary);\n eid:= last_insert_id();\n log(eid, \'hire \' || ename);\n END;\n\nFUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS\n nSalary DECIMAL(10,2);\n BEGIN\n SELECT salary INTO nSalary FROM employee WHERE id=eid;\n log(eid, \'getSalary id=\' || eid || \' salary=\' || nSalary);\n RETURN nSalary;\n END;\n\nPROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS\n BEGIN\n UPDATE employee SET salary=salary+amount WHERE id=eid;\n log(eid, \'raiseSalary id=\' || eid || \' amount=\' || amount);\n END;\n\nPROCEDURE raiseSalaryStd(eid INT) AS\n BEGIN\n raiseSalary(eid, stdRaiseAmount);\n log(eid, \'raiseSalaryStd id=\' || eid);\n END;\n\nBEGIN \n log(0, \'Session \' || connection_id() || \' \' || current_user || \' started\');\nEND\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-create-package-body/','','https://mariadb.com/kb/en/show-create-package-body/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (369,26,'SHOW CREATE PROCEDURE','Syntax\n------\n\nSHOW CREATE PROCEDURE proc_name\n\nDescription\n-----------\n\nThis statement is a MariaDB extension. It returns the exact string that can be\nused to re-create the named stored procedure, as well as the SQL_MODE that was\nused when the trigger has been created and the character set used by the\nconnection.. A similar statement, SHOW CREATE FUNCTION, displays information\nabout stored functions.\n\nBoth statements require that you are the owner of the routine or have the\nSELECT privilege on the mysql.proc table. When neither is true, the statements\ndisplay NULL for the Create Procedure or Create Function field.\n\nWarning Users with SELECT privileges on mysql.proc or USAGE privileges on *.*\ncan view the text of routines, even when they do not have privileges for the\nfunction or procedure itself.\n\nThe output of these statements is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n\nExamples\n--------\n\nHere\'s a comparison of the SHOW CREATE PROCEDURE and SHOW CREATE FUNCTION\nstatements.\n\nSHOW CREATE PROCEDURE test.simpleproc\\G\n*************************** 1. row ***************************\n Procedure: simpleproc\n sql_mode:\n Create Procedure: CREATE PROCEDURE `simpleproc`(OUT param1 INT)\n BEGIN\n SELECT COUNT(*) INTO param1 FROM t;\n END\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nSHOW CREATE FUNCTION test.hello\\G\n*************************** 1. row ***************************\n Function: hello\n sql_mode:\n Create Function: CREATE FUNCTION `hello`(s CHAR(20))\n RETURNS CHAR(50)\n RETURN CONCAT(\'Hello, \',s,\'!\')\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nWhen the user issuing the statement does not have privileges on the routine,\nattempting to CALL the procedure raises Error 1370.\n\nCALL test.prc1();\nError 1370 (42000): execute command denieed to user \'test_user\'@\'localhost\'\nfor routine \'test\'.\'prc1\'\n\nIf the user neither has privilege to the routine nor the SELECT privilege on\nmysql.proc table, it raises Error 1305, informing them that the procedure does\nnot exist.\n\nSHOW CREATE TABLES test.prc1\\G\nError 1305 (42000): PROCEDURE prc1 does not exist\n\nURL: https://mariadb.com/kb/en/show-create-procedure/','','https://mariadb.com/kb/en/show-create-procedure/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (370,26,'SHOW CREATE SEQUENCE','MariaDB starting with 10.3.1\n----------------------------\nSequences were introduced in MariaDB 10.3.\n\nSyntax\n------\n\nSHOW CREATE SEQUENCE sequence_name;\n\nDescription\n-----------\n\nShows the CREATE SEQUENCE statement that created the given sequence. The\nstatement requires the SELECT privilege for the table.\n\nExample\n-------\n\nCREATE SEQUENCE s1 START WITH 50;\nSHOW CREATE SEQUENCE s1\\G;\n*************************** 1. row ***************************\n Table: s1\nCreate Table: CREATE SEQUENCE `s1` start with 50 minvalue 1 maxvalue\n9223372036854775806 \n increment by 1 cache 1000 nocycle ENGINE=InnoDB\n\nNotes\n-----\n\nIf you want to see the underlying table structure used for the SEQUENCE you\ncan use SHOW CREATE TABLE on the SEQUENCE. You can also use SELECT to read the\ncurrent recorded state of the SEQUENCE:\n\nSHOW CREATE TABLE s1\\G\n*************************** 1. row ***************************\n Table: s1\nCreate Table: CREATE TABLE `s1` (\n `next_not_cached_value` bigint(21) NOT NULL,\n `minimum_value` bigint(21) NOT NULL,\n `maximum_value` bigint(21) NOT NULL,\n `start_value` bigint(21) NOT NULL COMMENT \'start value when sequences is\ncreated \n or value if RESTART is used\',\n `increment` bigint(21) NOT NULL COMMENT \'increment value\',\n `cache_size` bigint(21) unsigned NOT NULL,\n `cycle_option` tinyint(1) unsigned NOT NULL COMMENT \'0 if no cycles are\nallowed, \n 1 if the sequence should begin a new cycle when maximum_value is passed\',\n `cycle_count` bigint(21) NOT NULL COMMENT \'How many cycles have been done\'\n) ENGINE=InnoDB SEQUENCE=1\n\nSELECT * FROM s1\\G\n*************************** 1. row ***************************\nnext_not_cached_value: 50\n minimum_value: 1\n maximum_value: 9223372036854775806\n start_value: 50\n increment: 1\n cache_size: 1000\n cycle_option: 0\n cycle_count: 0\n\nURL: https://mariadb.com/kb/en/show-create-sequence/','','https://mariadb.com/kb/en/show-create-sequence/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (371,26,'SHOW CREATE TRIGGER','Syntax\n------\n\nSHOW CREATE TRIGGER trigger_name\n\nDescription\n-----------\n\nThis statement shows a CREATE TRIGGER statement that creates the given\ntrigger, as well as the SQL_MODE that was used when the trigger has been\ncreated and the character set used by the connection.\n\nThe output of this statement is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n\nExamples\n--------\n\nSHOW CREATE TRIGGER example\\G\n*************************** 1. row ***************************\n Trigger: example\n sql_mode:\nONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,STRICT_ALL_TABLES\n,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO\n\nENGINE_SUBSTITUTION\nSQL Original Statement: CREATE DEFINER=`root`@`localhost` TRIGGER example\nBEFORE\n INSERT ON t FOR EACH ROW\nBEGIN\n SET NEW.c = NEW.c * 2;\nEND\n character_set_client: cp850\n collation_connection: cp850_general_ci\n Database Collation: utf8_general_ci\n Created: 2016-09-29 13:53:34.35\n\nMariaDB starting with 10.2.3\n----------------------------\nThe Created column was added in MySQL 5.7 and MariaDB 10.2.3 as part of\nintroducing multiple trigger events per action.\n\nURL: https://mariadb.com/kb/en/show-create-trigger/','','https://mariadb.com/kb/en/show-create-trigger/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (372,26,'SHOW CREATE VIEW','Syntax\n------\n\nSHOW CREATE VIEW view_name\n\nDescription\n-----------\n\nThis statement shows a CREATE VIEW statement that creates the given view, as\nwell as the character set used by the connection when the view was created.\nThis statement also works with views.\n\nSHOW CREATE VIEW quotes table, column and stored function names according to\nthe value of the sql_quote_show_create server system variable.\n\nExamples\n--------\n\nSHOW CREATE VIEW example\\G\n*************************** 1. row ***************************\n View: example\n Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL\nSECURITY DEFINER VIEW `example` AS (select `t`.`id` AS `id`,`t`.`s` AS `s` from\n`t`)\ncharacter_set_client: cp850\ncollation_connection: cp850_general_ci\n\nWith sql_quote_show_create off:\n\nSHOW CREATE VIEW example\\G\n*************************** 1. row ***************************\n View: example\n Create View: CREATE ALGORITHM=UNDEFINED DEFINER=root@localhost SQL\nSECU\nRITY DEFINER VIEW example AS (select t.id AS id,t.s AS s from t)\ncharacter_set_client: cp850\ncollation_connection: cp850_general_ci\n\nGrants\n------\n\nTo be able to see a view, you need to have the SHOW VIEW and the SELECT\nprivilege on the view:\n\nGRANT SHOW VIEW,SELECT ON test_database.test_view TO \'test\'@\'localhost\';\n\nURL: https://mariadb.com/kb/en/show-create-view/','','https://mariadb.com/kb/en/show-create-view/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (373,26,'SHOW DATABASES','Syntax\n------\n\nSHOW {DATABASES | SCHEMAS}\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW DATABASES lists the databases on the MariaDB server host. SHOW SCHEMAS is\na synonym for SHOW DATABASES. The LIKE clause, if present on its own,\nindicates which database names to match. The WHERE and LIKE clauses can be\ngiven to select rows using more general conditions, as discussed in Extended\nSHOW.\n\nYou see only those databases for which you have some kind of privilege, unless\nyou have the global SHOW DATABASES privilege. You can also get this list using\nthe mysqlshow command.\n\nIf the server was started with the --skip-show-database option, you cannot use\nthis statement at all unless you have the SHOW DATABASES privilege.\n\nThe list of results returned by SHOW DATABASES is based on directories in the\ndata directory, which is how MariaDB implements databases. It\'s possible that\noutput includes directories that do not correspond to actual databases.\n\nThe Information Schema SCHEMATA table also contains database information.\n\nExamples\n--------\n\nSHOW DATABASES;\n+--------------------+\n| Database |\n+--------------------+\n| information_schema |\n| mysql |\n| performance_schema |\n| test |\n+--------------------+\n\nSHOW DATABASES LIKE \'m%\';\n+---------------+\n| Database (m%) |\n+---------------+\n| mysql |\n+---------------+\n\nURL: https://mariadb.com/kb/en/show-databases/','','https://mariadb.com/kb/en/show-databases/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (374,26,'SHOW ENGINE','Syntax\n------\n\nSHOW ENGINE engine_name {STATUS | MUTEX}\n\nDescription\n-----------\n\nSHOW ENGINE displays operational information about a storage engine. The\nfollowing statements currently are supported:\n\nSHOW ENGINE INNODB STATUS\nSHOW ENGINE INNODB MUTEX\nSHOW ENGINE PERFORMANCE_SCHEMA STATUS\nSHOW ENGINE ROCKSDB STATUS\n\nIf the Sphinx Storage Engine is installed, the following is also supported:\n\nSHOW ENGINE SPHINX STATUS\n\nSee SHOW ENGINE SPHINX STATUS.\n\nOlder (and now removed) synonyms were SHOW INNODB STATUS for SHOW ENGINE\nINNODB STATUS and SHOW MUTEX STATUS for SHOW ENGINE INNODB MUTEX.\n\nSHOW ENGINE INNODB STATUS\n-------------------------\n\nSHOW ENGINE INNODB STATUS displays extensive information from the standard\nInnoDB Monitor about the state of the InnoDB storage engine. See SHOW ENGINE\nINNODB STATUS for more.\n\nSHOW ENGINE INNODB MUTEX\n------------------------\n\nSHOW ENGINE INNODB MUTEX displays InnoDB mutex statistics.\n\nThe statement displays the following output fields:\n\n* Type: Always InnoDB.\n* Name: The source file where the mutex is implemented, and the line number\n in the file where the mutex is created. The line number is dependent on the\nMariaDB version.\n* Status: This field displays the following values if UNIV_DEBUG was defined\nat compilation time (for example, in include/univ.h in the InnoDB part of the\nsource tree). Only the os_waits value is displayed if UNIV_DEBUG was not\ndefined. Without UNIV_DEBUG, the information on which the output is based is\ninsufficient to distinguish regular mutexes and mutexes that protect\n rw-locks (which allow multiple readers or a single writer). Consequently, the\n output may appear to contain multiple rows for the same mutex.\ncount indicates how many times the mutex was requested.\nspin_waits indicates how many times the spinlock had to run.\nspin_rounds indicates the number of spinlock rounds. (spin_rounds divided by\n spin_waits provides the average round count.)\nos_waits indicates the number of operating system waits. This occurs when\n the spinlock did not work (the mutex was not locked during the spinlock and\n it was necessary to yield to the operating system and wait).\nos_yields indicates the number of times a the thread trying to lock a mutex\n gave up its timeslice and yielded to the operating system (on the\n presumption that allowing other threads to run will free the mutex so that\n it can be locked).\nos_wait_times indicates the amount of time (in ms) spent in operating system\n waits, if the timed_mutexes system variable is 1 (ON). If timed_mutexes is 0\n (OFF), timing is disabled, so os_wait_times is 0. timed_mutexes is off by\n default.\n\nInformation from this statement can be used to diagnose system problems. For\nexample, large values of spin_waits and spin_rounds may indicate scalability\nproblems.\n\nThe information_schema.INNODB_MUTEXES table provides similar information.\n\nSHOW ENGINE PERFORMANCE_SCHEMA STATUS\n-------------------------------------\n\nThis statement shows how much memory is used for performance_schema tables and\ninternal buffers.\n\nThe output contains the following fields:\n\n* Type: Always performance_schema.\n* Name: The name of a table, the name of an internal buffer, or the\nperformance_schema word, followed by a dot and an attribute. Internal buffers\nnames are enclosed by parenthesis. performance_schema means that the attribute\nrefers to the whole database (it is a total). \n* Status: The value for the attribute.\n\nThe following attributes are shown, in this order, for all tables:\n\n* row_size: The memory used for an individual record. This value will never\nchange.\n* row_count: The number of rows in the table or buffer. For some tables, this\nvalue depends on a server system variable.\n* memory: For tables and performance_schema, this is the result of row_size *\nrow_count.\n\nFor internal buffers, the attributes are:\n\n* count\n* size\n\nSHOW ENGINE ROCKSDB STATUS\n--------------------------\n\nSee also MyRocks Performance Troubleshooting\n\nURL: https://mariadb.com/kb/en/show-engine/','','https://mariadb.com/kb/en/show-engine/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (375,26,'SHOW ENGINE INNODB STATUS','SHOW ENGINE INNODB STATUS is a specific form of the SHOW ENGINE statement that\ndisplays the InnoDB Monitor output, which is extensive InnoDB information\nwhich can be useful in diagnosing problems.\n\nThe following sections are displayed\n\n* Status: Shows the timestamp, monitor name and the number of seconds, or the\nelapsed time between the current time and the time the InnoDB Monitor output\nwas last displayed. The per-second averages are based upon this time.\n* BACKGROUND THREAD: srv_master_thread lines show work performed by the main\nbackground thread.\n* SEMAPHORES: Threads waiting for a semaphore and stats on how the number of\ntimes threads have needed a spin or a wait on a mutex or rw-lock semaphore. If\nthis number of threads is large, there may be I/O or contention issues.\nReducing the size of the innodb_thread_concurrency system variable may help if\ncontention is related to thread scheduling. Spin rounds per wait shows the\nnumber of spinlock rounds per OS wait for a mutex. \n* LATEST FOREIGN KEY ERROR: Only shown if there has been a foreign key\nconstraint error, it displays the failed statement and information about the\nconstraint and the related tables.\n* LATEST DETECTED DEADLOCK: Only shown if there has been a deadlock, it\ndisplays the transactions involved in the deadlock and the statements being\nexecuted, held and required locked and the transaction rolled back to.\n* TRANSACTIONS: The output of this section can help identify lock contention,\nas well as reasons for the deadlocks.\n* FILE I/O: InnoDB thread information as well as pending I/O operations and\nI/O performance statistics.\n* INSERT BUFFER AND ADAPTIVE HASH INDEX: InnoDB insert buffer (old name for\nthe change buffer) and adaptive hash index status information, including the\nnumber of each type of operation performed, and adaptive hash index\nperformance.\n* LOG: InnoDB log information, including current log sequence number, how far\nthe log has been flushed to disk, the position at which InnoDB last took a\ncheckpoint, pending writes and write performance statistics.\n* BUFFER POOL AND MEMORY: Information on buffer pool pages read and written,\nwhich allows you to see the number of data file I/O operations performed by\nyour queries. See InnoDB Buffer Pool for more. Similar information is also\navailable from the INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS table.\n* ROW OPERATIONS:Information about the main thread, including the number and\nperformance rate for each type of row operation.\n\nIf the innodb_status_output_locks system variable is set to 1, extended lock\ninformation will be displayed.\n\nExample output:\n\n=====================================\n2019-09-06 12:44:13 0x7f93cc236700 INNODB MONITOR OUTPUT\n=====================================\nPer second averages calculated from the last 4 seconds\n-----------------\nBACKGROUND THREAD\n-----------------\nsrv_master_thread loops: 2 srv_active, 0 srv_shutdown, 83698 srv_idle\nsrv_master_thread log flush and writes: 83682\n----------\nSEMAPHORES\n----------\nOS WAIT ARRAY INFO: reservation count 15\nOS WAIT ARRAY INFO: signal count 8\nRW-shared spins 0, rounds 20, OS waits 7\nRW-excl spins 0, rounds 0, OS waits 0\nRW-sx spins 0, rounds 0, OS waits 0\nSpin rounds per wait: 20.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx\n------------\nTRANSACTIONS\n------------\nTrx id counter 236\nPurge done for trx\'s n:o < 236 undo n:o < 0 state: running\nHistory list length 22\nLIST OF TRANSACTIONS FOR EACH SESSION:\n---TRANSACTION 421747401994584, not started\n0 lock struct(s), heap size 1136, 0 row lock(s)\n---TRANSACTION 421747401990328, not started\n0 lock struct(s), heap size 1136, 0 row lock(s)\n--------\nFILE I/O\n--------\nI/O thread 0 state: waiting for completed aio requests (insert buffer thread)\nI/O thread 1 state: waiting for completed aio requests (log thread)\nI/O thread 2 state: waiting for completed aio requests (read thread)\nI/O thread 3 state: waiting for completed aio requests (read thread)\nI/O thread 4 state: waiting for completed aio requests (read thread)\nI/O thread 5 state: waiting for completed aio requests (read thread)\nI/O thread 6 state: waiting for completed aio requests (write thread)\nI/O thread 7 state: waiting for completed aio requests (write thread)\nI/O thread 8 state: waiting for completed aio requests (write thread)\nI/O thread 9 state: waiting for completed aio requests (write thread)\nPending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,\n ibuf aio reads:, log i/o\'s:, sync i/o\'s:\nPending flushes (fsync) log: 0; buffer pool: 0\n286 OS file reads, 171 OS file writes, 22 OS fsyncs\n0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s\n-------------------------------------\nINSERT BUFFER AND ADAPTIVE HASH INDEX\n-------------------------------------\nIbuf: size 1, free list len 0, seg size 2, 0 merges\nmerged operations:\n insert 0, delete mark 0, delete 0\ndiscarded operations:\n insert 0, delete mark 0, delete 0\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\n0.00 hash searches/s, 0.00 non-hash searches/s\n---\nLOG\n---\nLog sequence number 445926\nLog flushed up to 445926\nPages flushed up to 445926\nLast checkpoint at 445917\n0 pending log flushes, 0 pending chkp writes\n18 log i/o\'s done, 0.00 log i/o\'s/second\n----------------------\nBUFFER POOL AND MEMORY\n----------------------\nTotal large memory allocated 167772160\nDictionary memory allocated 50768\nBuffer pool size 8012\nFree buffers 7611\nDatabase pages 401\nOld database pages 0\nModified db pages 0\nPercent of dirty pages(LRU & free pages): 0.000\nMax dirty pages percent: 75.000\nPending reads 0\nPending writes: LRU 0, flush list 0, single page 0\nPages made young 0, not young 0\n0.00 youngs/s, 0.00 non-youngs/s\nPages read 264, created 137, written 156\n0.00 reads/s, 0.00 creates/s, 0.00 writes/s\nNo buffer pool page gets since the last printout\nPages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead\n0.00/s\nLRU len: 401, unzip_LRU len: 0\nI/O sum[0]:cur[0], unzip sum[0]:cur[0]\n--------------\nROW OPERATIONS\n--------------\n0 queries inside InnoDB, 0 queries in queue\n0 read views open inside InnoDB\nProcess ID=4267, Main thread ID=140272021272320, state: sleeping\nNumber of rows inserted 1, updated 0, deleted 0, read 1\n0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s\nNumber of system rows inserted 0, updated 0, deleted 0, read 0\n0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s\n----------------------------\nEND OF INNODB MONITOR OUTPUT\n============================\n\nURL: https://mariadb.com/kb/en/show-engine-innodb-status/','','https://mariadb.com/kb/en/show-engine-innodb-status/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (376,26,'SHOW ENGINES','Syntax\n------\n\nSHOW [STORAGE] ENGINES\n\nDescription\n-----------\n\nSHOW ENGINES displays status information about the server\'s storage engines.\nThis is particularly useful for checking whether a storage engine is\nsupported, or to see what the default engine is. SHOW TABLE TYPES is a\ndeprecated synonym.\n\nThe information_schema.ENGINES table provides the same information.\n\nSince storage engines are plugins, different information about them is also\nshown in the information_schema.PLUGINS table and by the SHOW PLUGINS\nstatement.\n\nNote that both MySQL\'s InnoDB and Percona\'s XtraDB replacement are labeled as\nInnoDB. However, if XtraDB is in use, it will be specified in the COMMENT\nfield. See XtraDB and InnoDB. The same applies to FederatedX.\n\nThe output consists of the following columns:\n\n* Engine indicates the engine\'s name.\n* Support indicates whether the engine is installed, and whether it is the\ndefault engine for the current session.\n* Comment is a brief description.\n* Transactions, XA and Savepoints indicate whether transactions, XA\ntransactions and transaction savepoints are supported by the engine.\n\nExamples\n--------\n\nSHOW ENGINES\\G\n*************************** 1. row ***************************\n Engine: InnoDB\n Support: DEFAULT\n Comment: Supports transactions, row-level locking, and foreign keys\nTransactions: YES\n XA: YES\n Savepoints: YES\n*************************** 2. row ***************************\n Engine: CSV\n Support: YES\n Comment: CSV storage engine\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 3. row ***************************\n Engine: MyISAM\n Support: YES\n Comment: MyISAM storage engine\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 4. row ***************************\n Engine: BLACKHOLE\n Support: YES\n Comment: /dev/null storage engine (anything you write to it disappears)\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 5. row ***************************\n Engine: FEDERATED\n Support: YES\n Comment: FederatedX pluggable storage engine\nTransactions: YES\n XA: NO\n Savepoints: YES\n*************************** 6. row ***************************\n Engine: MRG_MyISAM\n Support: YES\n Comment: Collection of identical MyISAM tables\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 7. row ***************************\n Engine: ARCHIVE\n Support: YES\n Comment: Archive storage engine\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 8. row ***************************\n Engine: MEMORY\n Support: YES\n Comment: Hash based, stored in memory, useful for temporary tables\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 9. row ***************************\n Engine: PERFORMANCE_SCHEMA\n Support: YES\n Comment: Performance Schema\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 10. row ***************************\n Engine: Aria\n Support: YES\n Comment: Crash-safe tables with MyISAM heritage\nTransactions: NO\n XA: NO\n Savepoints: NO\n10 rows in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/show-engines/','','https://mariadb.com/kb/en/show-engines/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (377,26,'SHOW ERRORS','Syntax\n------\n\nSHOW ERRORS [LIMIT [offset,] row_count]\nSHOW ERRORS [LIMIT row_count OFFSET offset]\nSHOW COUNT(*) ERRORS\n\nDescription\n-----------\n\nThis statement is similar to SHOW WARNINGS, except that instead of displaying\nerrors, warnings, and notes, it displays only errors.\n\nThe LIMIT clause has the same syntax as for the SELECT statement.\n\nThe SHOW COUNT(*) ERRORS statement displays the number of errors. You can also\nretrieve this number from the error_count variable.\n\nSHOW COUNT(*) ERRORS;\nSELECT @@error_count;\n\nThe value of error_count might be greater than the number of messages\ndisplayed by SHOW WARNINGS if the max_error_count system variable is set so\nlow that not all messages are stored.\n\nFor a list of MariaDB error codes, see MariaDB Error Codes.\n\nExamples\n--------\n\nSELECT f();\nERROR 1305 (42000): FUNCTION f does not exist\n\nSHOW COUNT(*) ERRORS;\n+-----------------------+\n| @@session.error_count |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSHOW ERRORS;\n+-------+------+---------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------+\n| Error | 1305 | FUNCTION f does not exist |\n+-------+------+---------------------------+\n\nURL: https://mariadb.com/kb/en/show-errors/','','https://mariadb.com/kb/en/show-errors/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (378,26,'SHOW EVENTS','Syntax\n------\n\nSHOW EVENTS [{FROM | IN} schema_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nShows information about Event Manager events (created with CREATE EVENT).\nRequires the EVENT privilege. Without any arguments, SHOW EVENTS lists all of\nthe events in the current schema:\n\nSELECT CURRENT_USER(), SCHEMA();\n+----------------+----------+\n| CURRENT_USER() | SCHEMA() |\n+----------------+----------+\n| jon@ghidora | myschema |\n+----------------+----------+\n\nSHOW EVENTS\\G\n*************************** 1. row ***************************\n Db: myschema\n Name: e_daily\n Definer: jon@ghidora\n Time zone: SYSTEM\n Type: RECURRING\n Execute at: NULL\n Interval value: 10\n Interval field: SECOND\n Starts: 2006-02-09 10:41:23\n Ends: NULL\n Status: ENABLED\n Originator: 0\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nTo see the event action, use SHOW CREATE EVENT instead, or look at the\ninformation_schema.EVENTS table.\n\nTo see events for a specific schema, use the FROM clause. For example, to see\nevents for the test schema, use the following statement:\n\nSHOW EVENTS FROM test;\n\nThe LIKE clause, if present, indicates which event names to match. The WHERE\nclause can be given to select rows using more general conditions, as discussed\nin Extended Show.\n\nURL: https://mariadb.com/kb/en/show-events/','','https://mariadb.com/kb/en/show-events/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (379,26,'SHOW FUNCTION STATUS','Syntax\n------\n\nSHOW FUNCTION STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThis statement is similar to SHOW PROCEDURE STATUS but for stored functions.\n\nThe LIKE clause, if present on its own, indicates which function names to\nmatch.\n\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe information_schema.ROUTINES table contains more detailed information.\n\nExamples\n--------\n\nShowing all stored functions:\n\nSHOW FUNCTION STATUS\\G\n*************************** 1. row ***************************\n Db: test\n Name: VatCents\n Type: FUNCTION\n Definer: root@localhost\n Modified: 2013-06-01 12:40:31\n Created: 2013-06-01 12:40:31\n Security_type: DEFINER\n Comment:\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nStored functions whose name starts with \'V\':\n\nSHOW FUNCTION STATUS LIKE \'V%\' \\G\n*************************** 1. row ***************************\n Db: test\n Name: VatCents\n Type: FUNCTION\n Definer: root@localhost\n Modified: 2013-06-01 12:40:31\n Created: 2013-06-01 12:40:31\n Security_type: DEFINER\n Comment:\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nStored functions with a security type of \'DEFINER\':\n\nSHOW FUNCTION STATUS WHERE Security_type LIKE \'DEFINER\' \\G\n*************************** 1. row ***************************\n Db: test\n Name: VatCents\n Type: FUNCTION\n Definer: root@localhost\n Modified: 2013-06-01 12:40:31\n Created: 2013-06-01 12:40:31\n Security_type: DEFINER\n Comment:\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-function-status/','','https://mariadb.com/kb/en/show-function-status/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (380,26,'SHOW LOCALES','SHOW LOCALES was introduced as part of the Information Schema plugin extension.\n\nSHOW LOCALES is used to return locales information as part of the Locales\nplugin. While the information_schema.LOCALES table has 8 columns, the SHOW\nLOCALES statement will only display 4 of them:\n\nExample\n-------\n\nSHOW LOCALES;\n+-----+-------+-------------------------------------+------------------------+\n| Id | Name | Description | Error_Message_Language |\n+-----+-------+-------------------------------------+------------------------+\n| 0 | en_US | English - United States | english |\n| 1 | en_GB | English - United Kingdom | english |\n| 2 | ja_JP | Japanese - Japan | japanese |\n| 3 | sv_SE | Swedish - Sweden | swedish |\n...\n\nURL: https://mariadb.com/kb/en/show-locales/','','https://mariadb.com/kb/en/show-locales/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (381,26,'SHOW OPEN TABLES','Syntax\n------\n\nSHOW OPEN TABLES [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW OPEN TABLES lists the non-TEMPORARY tables that are currently open in the\ntable cache. See http://dev.mysql.com/doc/refman/5.1/en/table-cache.html.\n\nThe FROM and LIKE clauses may be used.\n\nThe FROM clause, if present, restricts the tables shown to those present in\nthe db_name database.\n\nThe LIKE clause, if present on its own, indicates which table names to match.\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe following information is returned:\n\n+---------------------------+------------------------------------------------+\n| Column | Description |\n+---------------------------+------------------------------------------------+\n| Database | Database name. |\n+---------------------------+------------------------------------------------+\n| Name | Table name. |\n+---------------------------+------------------------------------------------+\n| In_use | Number of table instances being used. |\n+---------------------------+------------------------------------------------+\n| Name_locked | 1 if the table is name-locked, e.g. if it is |\n| | being dropped or renamed, otherwise 0. |\n+---------------------------+------------------------------------------------+\n\nBefore MariaDB 5.5, each use of, for example, LOCK TABLE ... WRITE would\nincrement In_use for that table. With the implementation of the metadata\nlocking improvements in MariaDB 5.5, LOCK TABLE... WRITE acquires a strong MDL\nlock, and concurrent connections will wait on this MDL lock, so any subsequent\nLOCK TABLE... WRITE will not increment In_use.\n\nExample\n-------\n\nSHOW OPEN TABLES;\n+----------+---------------------------+--------+-------------+\n| Database | Table | In_use | Name_locked |\n+----------+---------------------------+--------+-------------+\n...\n| test | xjson | 0 | 0 |\n| test | jauthor | 0 | 0 |\n| test | locks | 1 | 0 |\n...\n+----------+---------------------------+--------+-------------+\n\nURL: https://mariadb.com/kb/en/show-open-tables/','','https://mariadb.com/kb/en/show-open-tables/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (382,26,'SHOW PACKAGE BODY STATUS','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nSHOW PACKAGE BODY STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThe SHOW PACKAGE BODY STATUS statement returns characteristics of stored\npackage bodies (implementations), such as the database, name, type, creator,\ncreation and modification dates, and character set information. A similar\nstatement, SHOW PACKAGE STATUS, displays information about stored package\nspecifications.\n\nThe LIKE clause, if present, indicates which package names to match. The WHERE\nand LIKE clauses can be given to select rows using more general conditions, as\ndiscussed in Extended SHOW.\n\nThe ROUTINES table in the INFORMATION_SCHEMA database contains more detailed\ninformation.\n\nExamples\n--------\n\nSHOW PACKAGE BODY STATUS LIKE \'pkg1\'\\G\n*************************** 1. row ***************************\n Db: test\n Name: pkg1\n Type: PACKAGE BODY\n Definer: root@localhost\n Modified: 2018-02-27 14:44:14\n Created: 2018-02-27 14:44:14\n Security_type: DEFINER\n Comment: This is my first package body\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-package-body-status/','','https://mariadb.com/kb/en/show-package-body-status/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (383,26,'SHOW PACKAGE STATUS','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nSHOW PACKAGE STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThe SHOW PACKAGE STATUS statement returns characteristics of stored package\nspecifications, such as the database, name, type, creator, creation and\nmodification dates, and character set information. A similar statement, SHOW\nPACKAGE BODY STATUS, displays information about stored package bodies (i.e.\nimplementations).\n\nThe LIKE clause, if present, indicates which package names to match. The WHERE\nand LIKE clauses can be given to select rows using more general conditions, as\ndiscussed in Extended SHOW.\n\nThe ROUTINES table in the INFORMATION_SCHEMA database contains more detailed\ninformation.\n\nExamples\n--------\n\nSHOW PACKAGE STATUS LIKE \'pkg1\'\\G\n*************************** 1. row ***************************\n Db: test\n Name: pkg1\n Type: PACKAGE\n Definer: root@localhost\n Modified: 2018-02-27 14:38:15\n Created: 2018-02-27 14:38:15\n Security_type: DEFINER\n Comment: This is my first package\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-package-status/','','https://mariadb.com/kb/en/show-package-status/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (384,26,'SHOW PRIVILEGES','Syntax\n------\n\nSHOW PRIVILEGES\n\nDescription\n-----------\n\nSHOW PRIVILEGES shows the list of system privileges that the MariaDB server\nsupports. The exact list of privileges depends on the version of your server.\n\nNote that before MariaDB 10.3.23, MariaDB 10.4.13 and MariaDB 10.5.2 , the\nDelete history privilege displays as Delete versioning rows (MDEV-20382).\n\nExample\n-------\n\nFrom MariaDB 10.5.9\n\nSHOW PRIVILEGES;\n+--------------------------+---------------------------------------+-----------\n--------------------------------------------------------+\n| Privilege | Context | Comment \n |\n+--------------------------+---------------------------------------+-----------\n--------------------------------------------------------+\n| Alter | Tables | To alter\nthe table |\n| Alter routine | Functions,Procedures | To alter\nor drop stored functions/procedures |\n| Create | Databases,Tables,Indexes | To create\nnew databases and tables |\n| Create routine | Databases | To use\nCREATE FUNCTION/PROCEDURE |\n| Create temporary tables | Databases | To use\nCREATE TEMPORARY TABLE |\n| Create view | Tables | To create\nnew views |\n| Create user | Server Admin | To create\nnew users |\n| Delete | Tables | To delete\nexisting rows |\n| Delete history | Tables | To delete\nversioning table historical rows |\n| Drop | Databases,Tables | To drop\ndatabases, tables, and views |\n| Event | Server Admin | To\ncreate, alter, drop and execute events |\n| Execute | Functions,Procedures | To\nexecute stored routines |\n| File | File access on server | To read\nand write files on the server |\n| Grant option | Databases,Tables,Functions,Procedures | To give\nto other users those privileges you possess |\n| Index | Tables | To create\nor drop indexes |\n| Insert | Tables | To insert\ndata into tables |\n| Lock tables | Databases | To use\nLOCK TABLES (together with SELECT privilege) |\n| Process | Server Admin | To view\nthe plain text of currently executing queries |\n| Proxy | Server Admin | To make\nproxy user possible |\n| References | Databases,Tables | To have\nreferences on tables |\n| Reload | Server Admin | To reload\nor refresh tables, logs and privileges |\n| Binlog admin | Server | To purge\nbinary logs |\n| Binlog monitor | Server | To use\nSHOW BINLOG STATUS and SHOW BINARY LOG |\n| Binlog replay | Server | To use\nBINLOG (generated by mariadb-binlog) |\n| Replication master admin | Server | To\nmonitor connected slaves |\n| Replication slave admin | Server | To\nstart/stop slave and apply binlog events |\n| Slave monitor | Server | To use\nSHOW SLAVE STATUS and SHOW RELAYLOG EVENTS |\n| Replication slave | Server Admin | To read\nbinary log events from the master |\n| Select | Tables | To\nretrieve rows from table |\n| Show databases | Server Admin | To see\nall databases with SHOW DATABASES |\n| Show view | Tables | To see\nviews with SHOW CREATE VIEW |\n| Shutdown | Server Admin | To shut\ndown the server |\n| Super | Server Admin | To use\nKILL thread, SET GLOBAL, CHANGE MASTER, etc. |\n| Trigger | Tables | To use\ntriggers |\n| Create tablespace | Server Admin | To\ncreate/alter/drop tablespaces |\n| Update | Tables | To update\nexisting rows |\n| Set user | Server | To create\nviews and stored routines with a different definer |\n| Federated admin | Server | To\nexecute the CREATE SERVER, ALTER SERVER, DROP SERVER statements |\n| Connection admin | Server | To bypass\nconnection limits and kill other users\' connections |\n| Read_only admin | Server | To\nperform write operations even if @@read_only=ON |\n| Usage | Server Admin | No\nprivileges - allow connect only |\n+--------------------------+---------------------------------------+-----------\n--------------------------------------------------------+\n41 rows in set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/show-privileges/','','https://mariadb.com/kb/en/show-privileges/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (385,26,'SHOW PROCEDURE CODE','Syntax\n------\n\nSHOW PROCEDURE CODE proc_name\n\nDescription\n-----------\n\nThis statement is a MariaDB extension that is available only for servers that\nhave been built with debugging support. It displays a representation of the\ninternal implementation of the named stored procedure. A similar statement,\nSHOW FUNCTION CODE, displays information about stored functions.\n\nBoth statements require that you be the owner of the routine or have SELECT\naccess to the mysql.proc table.\n\nIf the named routine is available, each statement produces a result set. Each\nrow in the result set corresponds to one \"instruction\" in the routine. The\nfirst column is Pos, which is an ordinal number beginning with 0. The second\ncolumn is Instruction, which contains an SQL statement (usually changed from\nthe original source), or a directive which has meaning only to the\nstored-routine handler.\n\nExamples\n--------\n\nDELIMITER //\n\nCREATE PROCEDURE p1 ()\n BEGIN\n DECLARE fanta INT DEFAULT 55;\n DROP TABLE t2;\n LOOP\n INSERT INTO t3 VALUES (fanta);\n END LOOP;\n END//\nQuery OK, 0 rows affected (0.00 sec)\n\nSHOW PROCEDURE CODE p1//\n+-----+----------------------------------------+\n| Pos | Instruction |\n+-----+----------------------------------------+\n| 0 | set fanta@0 55 |\n| 1 | stmt 9 \"DROP TABLE t2\" |\n| 2 | stmt 5 \"INSERT INTO t3 VALUES (fanta)\" |\n| 3 | jump 2 |\n+-----+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-procedure-code/','','https://mariadb.com/kb/en/show-procedure-code/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (386,26,'SHOW PROCEDURE STATUS','Syntax\n------\n\nSHOW PROCEDURE STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThis statement is a MariaDB extension. It returns characteristics of a stored\nprocedure, such as the database, name, type, creator, creation and\nmodification dates, and character set information. A similar statement, SHOW\nFUNCTION STATUS, displays information about stored functions.\n\nThe LIKE clause, if present, indicates which procedure or function names to\nmatch. The WHERE and LIKE clauses can be given to select rows using more\ngeneral conditions, as discussed in Extended SHOW.\n\nThe ROUTINES table in the INFORMATION_SCHEMA database contains more detailed\ninformation.\n\nExamples\n--------\n\nSHOW PROCEDURE STATUS LIKE \'p1\'\\G\n*************************** 1. row ***************************\n Db: test\n Name: p1\n Type: PROCEDURE\n Definer: root@localhost\n Modified: 2010-08-23 13:23:03\n Created: 2010-08-23 13:23:03\n Security_type: DEFINER\n Comment:\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-procedure-status/','','https://mariadb.com/kb/en/show-procedure-status/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (387,26,'SHOW PROCESSLIST','Syntax\n------\n\nSHOW [FULL] PROCESSLIST\n\nDescription\n-----------\n\nSHOW PROCESSLIST shows you which threads are running. You can also get this\ninformation from the information_schema.PROCESSLIST table or the mysqladmin\nprocesslist command. If you have the PROCESS privilege, you can see all\nthreads. Otherwise, you can see only your own threads (that is, threads\nassociated with the MariaDB account that you are using). If you do not use the\nFULL keyword, only the first 100 characters of each statement are shown in the\nInfo field.\n\nThe columns shown in SHOW PROCESSLIST are:\n\n+---------------------+------------------------------------------------------+\n| Name | Description |\n+---------------------+------------------------------------------------------+\n| ID | The client\'s process ID. |\n+---------------------+------------------------------------------------------+\n| USER | The username associated with the process. |\n+---------------------+------------------------------------------------------+\n| HOST | The host the client is connected to. |\n+---------------------+------------------------------------------------------+\n| DB | The default database of the process (NULL if no |\n| | default). |\n+---------------------+------------------------------------------------------+\n| COMMAND | The command type. See Thread Command Values. |\n+---------------------+------------------------------------------------------+\n| TIME | The amount of time, in seconds, the process has |\n| | been in its current state. For a replica SQL thread |\n| | before MariaDB 10.1, this is the time in seconds |\n| | between the last replicated event\'s timestamp and |\n| | the replica machine\'s real time. |\n+---------------------+------------------------------------------------------+\n| STATE | See Thread States. |\n+---------------------+------------------------------------------------------+\n| INFO | The statement being executed. |\n+---------------------+------------------------------------------------------+\n| PROGRESS | The total progress of the process (0-100%) (see |\n| | Progress Reporting). |\n+---------------------+------------------------------------------------------+\n\nSee TIME_MS column in information_schema.PROCESSLIST for differences in the\nTIME column between MariaDB and MySQL.\n\nThe information_schema.PROCESSLIST table contains the following additional\ncolumns:\n\n+---------------------+------------------------------------------------------+\n| Name | Description |\n+---------------------+------------------------------------------------------+\n| TIME_MS | The amount of time, in milliseconds, the process |\n| | has been in its current state. |\n+---------------------+------------------------------------------------------+\n| STAGE | The stage the process is currently in. |\n+---------------------+------------------------------------------------------+\n| MAX_STAGE | The maximum number of stages. |\n+---------------------+------------------------------------------------------+\n| PROGRESS | The progress of the process within the current |\n| | stage (0-100%). |\n+---------------------+------------------------------------------------------+\n| MEMORY_USED | The amount of memory used by the process. |\n+---------------------+------------------------------------------------------+\n| EXAMINED_ROWS | The number of rows the process has examined. |\n+---------------------+------------------------------------------------------+\n| QUERY_ID | Query ID. |\n+---------------------+------------------------------------------------------+\n\nNote that the PROGRESS field from the information schema, and the PROGRESS\nfield from SHOW PROCESSLIST display different results. SHOW PROCESSLIST shows\nthe total progress, while the information schema shows the progress for the\ncurrent stage only.\n\nThreads can be killed using their thread_id or their query_id, with the KILL\nstatement.\n\nSince queries on this table are locking, if the performance_schema is enabled,\nyou may want to query the THREADS table instead.\n\nExamples\n--------\n\nSHOW PROCESSLIST;\n+----+-----------------+-----------+------+---------+------+-------------------\n----+------------------+----------+\n| Id | User | Host | db | Command | Time | State \n | Info | Progress |\n+----+-----------------+-----------+------+---------+------+-------------------\n----+------------------+----------+\n| 2 | event_scheduler | localhost | NULL | Daemon | 2693 | Waiting on empty\nqueue | NULL | 0.000 |\n| 4 | root | localhost | NULL | Query | 0 | Table lock \n | SHOW PROCESSLIST | 0.000 |\n+----+-----------------+-----------+------+---------+------+-------------------\n----+------------------+----------+\n\nURL: https://mariadb.com/kb/en/show-processlist/','','https://mariadb.com/kb/en/show-processlist/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (388,26,'SHOW PROFILE','Syntax\n------\n\nSHOW PROFILE [type [, type] ... ]\n [FOR QUERY n]\n [LIMIT row_count [OFFSET offset]]\n\ntype:\n ALL\n | BLOCK IO\n | CONTEXT SWITCHES\n | CPU\n | IPC\n | MEMORY\n | PAGE FAULTS\n | SOURCE\n | SWAPS\n\nDescription\n-----------\n\nThe SHOW PROFILE and SHOW PROFILES statements display profiling information\nthat indicates resource usage for statements executed during the course of the\ncurrent session.\n\nProfiling is controlled by the profiling session variable, which has a default\nvalue of 0 (OFF). Profiling is enabled by setting profiling to 1 or ON:\n\nSET profiling = 1;\n\nSHOW PROFILES displays a list of the most recent statements sent to the\nmaster. The size of the list is controlled by the profiling_history_size\nsession variable, which has a default value of 15. The maximum value is 100.\nSetting the value to 0 has the practical effect of disabling profiling.\n\nAll statements are profiled except SHOW PROFILES and SHOW PROFILE, so you will\nfind neither of those statements in the profile list. Malformed statements are\nprofiled. For example, SHOW PROFILING is an illegal statement, and a syntax\nerror occurs if you try to execute it, but it will show up in the profiling\nlist.\n\nSHOW PROFILE displays detailed information about a single statement. Without\nthe FOR QUERY n clause, the output pertains to the most recently executed\nstatement. If FOR QUERY n is included, SHOW PROFILE displays information for\nstatement n. The values of n correspond to the Query_ID values displayed by\nSHOW PROFILES.\n\nThe LIMIT row_count clause may be given to limit the output to row_count rows.\nIf LIMIT is given, OFFSET offset may be added to begin the output offset rows\ninto the full set of rows.\n\nBy default, SHOW PROFILE displays Status and Duration columns. The Status\nvalues are like the State values displayed by SHOW PROCESSLIST, although there\nmight be some minor differences in interpretation for the two statements for\nsome status values (see\nhttp://dev.mysql.com/doc/refman/5.6/en/thread-information.html).\n\nOptional type values may be specified to display specific additional types of\ninformation:\n\n* ALL displays all information\n* BLOCK IO displays counts for block input and output operations\n* CONTEXT SWITCHES displays counts for voluntary and involuntary context\nswitches\n* CPU displays user and system CPU usage times\n* IPC displays counts for messages sent and received\n* MEMORY is not currently implemented\n* PAGE FAULTS displays counts for major and minor page faults\n* SOURCE displays the names of functions from the source code, together with\nthe name and line number of the file in which the function occurs\n* SWAPS displays swap counts\n\nProfiling is enabled per session. When a session ends, its profiling\ninformation is lost.\n\nThe information_schema.PROFILING table contains similar information.\n\nExamples\n--------\n\nSELECT @@profiling;\n+-------------+\n| @@profiling |\n+-------------+\n| 0 |\n+-------------+\n\nSET profiling = 1;\n\nUSE test;\n\nDROP TABLE IF EXISTS t1;\n\nCREATE TABLE T1 (id INT);\n\nSHOW PROFILES;\n+----------+------------+--------------------------+\n| Query_ID | Duration | Query |\n+----------+------------+--------------------------+\n| 1 | 0.00009200 | SELECT DATABASE() |\n| 2 | 0.00023800 | show databases |\n| 3 | 0.00018900 | show tables |\n| 4 | 0.00014700 | DROP TABLE IF EXISTS t1 |\n| 5 | 0.24476900 | CREATE TABLE T1 (id INT) |\n+----------+------------+--------------------------+\n\nSHOW PROFILE;\n+----------------------+----------+\n| Status | Duration |\n+----------------------+----------+\n| starting | 0.000042 |\n| checking permissions | 0.000044 |\n| creating table | 0.244645 |\n| After create | 0.000013 |\n| query end | 0.000003 |\n| freeing items | 0.000016 |\n| logging slow query | 0.000003 |\n| cleaning up | 0.000003 |\n+----------------------+----------+\n\nSHOW PROFILE FOR QUERY 4;\n+--------------------+----------+\n| Status | Duration |\n+--------------------+----------+\n| starting | 0.000126 |\n| query end | 0.000004 |\n| freeing items | 0.000012 |\n| logging slow query | 0.000003 |\n| cleaning up | 0.000002 |\n+--------------------+----------+\n\nSHOW PROFILE CPU FOR QUERY 5;\n+----------------------+----------+----------+------------+\n| Status | Duration | CPU_user | CPU_system |\n+----------------------+----------+----------+------------+\n| starting | 0.000042 | 0.000000 | 0.000000 |\n| checking permissions | 0.000044 | 0.000000 | 0.000000 |\n| creating table | 0.244645 | 0.000000 | 0.000000 |\n| After create | 0.000013 | 0.000000 | 0.000000 |\n| query end | 0.000003 | 0.000000 | 0.000000 |\n| freeing items | 0.000016 | 0.000000 | 0.000000 |\n| logging slow query | 0.000003 | 0.000000 | 0.000000 |\n| cleaning up | 0.000003 | 0.000000 | 0.000000 |\n+----------------------+----------+----------+------------+\n\nURL: https://mariadb.com/kb/en/show-profile/','','https://mariadb.com/kb/en/show-profile/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (389,26,'SHOW PROFILES','Syntax\n------\n\nSHOW PROFILES\n\nDescription\n-----------\n\nThe SHOW PROFILES statement displays profiling information that indicates\nresource usage for statements executed during the course of the current\nsession. It is used together with SHOW PROFILE.\n\nURL: https://mariadb.com/kb/en/show-profiles/','','https://mariadb.com/kb/en/show-profiles/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (390,26,'SHOW QUERY_RESPONSE_TIME','It is possible to use SHOW QUERY_RESPONSE_TIME as an alternative for\nretrieving information from the QUERY_RESPONSE_TIME plugin.\n\nThis was introduced as part of the Information Schema plugin extension.\n\nURL: https://mariadb.com/kb/en/show-query_response_time/','','https://mariadb.com/kb/en/show-query_response_time/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (391,26,'SHOW STATUS','Syntax\n------\n\nSHOW [GLOBAL | SESSION] STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW STATUS provides server status information. This information also can be\nobtained using the mysqladmin extended-status command, or by querying the\nInformation Schema GLOBAL_STATUS and SESSION_STATUS tables. The LIKE clause,\nif present, indicates which variable names to match. The WHERE clause can be\ngiven to select rows using more general conditions.\n\nWith the GLOBAL modifier, SHOW STATUS displays the status values for all\nconnections to MariaDB. With SESSION, it displays the status values for the\ncurrent connection. If no modifier is present, the default is SESSION. LOCAL\nis a synonym for SESSION. If you see a lot of 0 values, the reason is probably\nthat you have used SHOW STATUS with a new connection instead of SHOW GLOBAL\nSTATUS.\n\nSome status variables have only a global value. For these, you get the same\nvalue for both GLOBAL and SESSION.\n\nSee Server Status Variables for a full list, scope and description of the\nvariables that can be viewed with SHOW STATUS.\n\nThe LIKE clause, if present on its own, indicates which variable name to match.\n\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nExamples\n--------\n\nFull output from MariaDB 10.1.17:\n\nSHOW GLOBAL STATUS;\n+--------------------------------------------------------------+---------------\n------------------------+\n| Variable_name | Value \n |\n+--------------------------------------------------------------+---------------\n------------------------+\n| Aborted_clients | 0 \n |\n| Aborted_connects | 0 \n |\n| Access_denied_errors | 0 \n |\n| Acl_column_grants | 0 \n |\n| Acl_database_grants | 2 \n |\n| Acl_function_grants | 0 \n |\n| Acl_procedure_grants | 0 \n |\n| Acl_proxy_users | 2 \n |\n| Acl_role_grants | 0 \n |\n| Acl_roles | 0 \n |\n| Acl_table_grants | 0 \n |\n| Acl_users | 6 \n |\n| Aria_pagecache_blocks_not_flushed | 0 \n |\n| Aria_pagecache_blocks_unused | 15706 \n |\n| Aria_pagecache_blocks_used | 0 \n |\n| Aria_pagecache_read_requests | 0 \n |\n| Aria_pagecache_reads | 0 \n |\n| Aria_pagecache_write_requests | 0 \n |\n| Aria_pagecache_writes | 0 \n |\n| Aria_transaction_log_syncs | 0 \n |\n| Binlog_commits | 0 \n |\n| Binlog_group_commits | 0 \n |\n| Binlog_group_commit_trigger_count | 0 \n |\n| Binlog_group_commit_trigger_lock_wait | 0 \n |\n| Binlog_group_commit_trigger_timeout | 0 \n |\n| Binlog_snapshot_file | \n |\n| Binlog_snapshot_position | 0 \n |\n| Binlog_bytes_written | 0 \n |\n| Binlog_cache_disk_use | 0 \n |\n| Binlog_cache_use | 0 \n |\n| Binlog_stmt_cache_disk_use | 0 \n |\n| Binlog_stmt_cache_use | 0 \n |\n| Busy_time | 0.000000 \n |\n| Bytes_received | 432 \n |\n| Bytes_sent | 15183 \n |\n| Com_admin_commands | 1 \n |\n| Com_alter_db | 0 \n |\n| Com_alter_db_upgrade | 0 \n |\n| Com_alter_event | 0 \n |\n| Com_alter_function | 0 \n |\n| Com_alter_procedure | 0 \n |\n| Com_alter_server | 0 \n |\n| Com_alter_table | 0 \n |\n| Com_alter_tablespace | 0 \n |\n| Com_analyze | 0 \n |\n| Com_assign_to_keycache | 0 \n |\n| Com_begin | 0 \n |\n| Com_binlog | 0 \n |\n| Com_call_procedure | 0 \n |\n| Com_change_db | 0 \n |\n| Com_change_master | 0 \n |\n| Com_check | 0 \n |\n| Com_checksum | 0 \n |\n| Com_commit | 0 \n |\n| Com_compound_sql | 0 \n |\n| Com_create_db | 0 \n |\n| Com_create_event | 0 \n |\n| Com_create_function | 0 \n |\n| Com_create_index | 0 \n |\n| Com_create_procedure | 0 \n |\n| Com_create_role | 0 \n |\n| Com_create_server | 0 \n |\n| Com_create_table | 0 \n |\n| Com_create_temporary_table | 0 \n |\n| Com_create_trigger | 0 \n |\n| Com_create_udf | 0 \n |\n| Com_create_user | 0 \n |\n| Com_create_view | 0 \n |\n| Com_dealloc_sql | 0 \n |\n| Com_delete | 0 \n |\n| Com_delete_multi | 0 \n |\n| Com_do | 0 \n |\n| Com_drop_db | 0 \n |\n| Com_drop_event | 0 \n |\n| Com_drop_function | 0 \n |\n| Com_drop_index | 0 \n |\n| Com_drop_procedure | 0 \n |\n| Com_drop_role | 0 \n |\n| Com_drop_server | 0 \n |\n| Com_drop_table | 0 \n |\n| Com_drop_temporary_table | 0 \n |\n| Com_drop_trigger | 0 \n |\n| Com_drop_user | 0 \n |\n| Com_drop_view | 0 \n |\n| Com_empty_query | 0 \n |\n| Com_execute_sql | 0 \n |\n| Com_flush | 0 \n |\n| Com_get_diagnostics | 0 \n |\n| Com_grant | 0 \n |\n| Com_grant_role | 0 \n |\n| Com_ha_close | 0 \n |\n| Com_ha_open | 0 \n |\n| Com_ha_read | 0 \n |\n| Com_help | 0 \n |\n| Com_insert | 0 \n |\n| Com_insert_select | 0 \n |\n| Com_install_plugin | 0 \n |\n| Com_kill | 0 \n |\n| Com_load | 0 \n |\n| Com_lock_tables | 0 \n |\n| Com_optimize | 0 \n |\n| Com_preload_keys | 0 \n |\n| Com_prepare_sql | 0 \n |\n| Com_purge | 0 \n |\n| Com_purge_before_date | 0 \n |\n| Com_release_savepoint | 0 \n |\n| Com_rename_table | 0 \n |\n| Com_rename_user | 0 \n |\n| Com_repair | 0 \n |\n| Com_replace | 0 \n |\n| Com_replace_select | 0 \n |\n| Com_reset | 0 \n |\n| Com_resignal | 0 \n |\n| Com_revoke | 0 \n |\n| Com_revoke_all | 0 \n |\n| Com_revoke_role | 0 \n |\n| Com_rollback | 0 \n |\n| Com_rollback_to_savepoint | 0 \n |\n| Com_savepoint | 0 \n |\n| Com_select | 1 \n |\n| Com_set_option | 0 \n |\n| Com_show_authors | 0 \n |\n| Com_show_binlog_events | 0 \n |\n| Com_show_binlogs | 0 \n |\n| Com_show_charsets | 0 \n |\n| Com_show_collations | 0 \n |\n| Com_show_contributors | 0 \n |\n| Com_show_create_db | 0 \n |\n| Com_show_create_event | 0 \n |\n| Com_show_create_func | 0 \n |\n| Com_show_create_proc | 0 \n |\n| Com_show_create_table | 0 \n |\n| Com_show_create_trigger | 0 \n |\n| Com_show_databases | 0 \n |\n| Com_show_engine_logs | 0 \n |','','https://mariadb.com/kb/en/show-status/');
-update help_topic set description = CONCAT(description, '\n| Com_show_engine_mutex | 0 \n |\n| Com_show_engine_status | 0 \n |\n| Com_show_errors | 0 \n |\n| Com_show_events | 0 \n |\n| Com_show_explain | 0 \n |\n| Com_show_fields | 0 \n |\n| Com_show_function_status | 0 \n |\n| Com_show_generic | 0 \n |\n| Com_show_grants | 0 \n |\n| Com_show_keys | 0 \n |\n| Com_show_master_status | 0 \n |\n| Com_show_open_tables | 0 \n |\n| Com_show_plugins | 0 \n |\n| Com_show_privileges | 0 \n |\n| Com_show_procedure_status | 0 \n |\n| Com_show_processlist | 0 \n |\n| Com_show_profile | 0 \n |\n| Com_show_profiles | 0 \n |\n| Com_show_relaylog_events | 0 \n |\n| Com_show_slave_hosts | 0 \n |\n| Com_show_slave_status | 0 \n |\n| Com_show_status | 2 \n |\n| Com_show_storage_engines | 0 \n |\n| Com_show_table_status | 0 \n |\n| Com_show_tables | 0 \n |\n| Com_show_triggers | 0 \n |\n| Com_show_variables | 0 \n |\n| Com_show_warnings | 0 \n |\n| Com_shutdown | 0 \n |\n| Com_signal | 0 \n |\n| Com_start_all_slaves | 0 \n |\n| Com_start_slave | 0 \n |\n| Com_stmt_close | 0 \n |\n| Com_stmt_execute | 0 \n |\n| Com_stmt_fetch | 0 \n |\n| Com_stmt_prepare | 0 \n |\n| Com_stmt_reprepare | 0 \n |\n| Com_stmt_reset | 0 \n |\n| Com_stmt_send_long_data | 0 \n |\n| Com_stop_all_slaves | 0 \n |\n| Com_stop_slave | 0 \n |\n| Com_truncate | 0 \n |\n| Com_uninstall_plugin | 0 \n |\n| Com_unlock_tables | 0 \n |\n| Com_update | 0 \n |\n| Com_update_multi | 0 \n |\n| Com_xa_commit | 0 \n |\n| Com_xa_end | 0 \n |\n| Com_xa_prepare | 0 \n |\n| Com_xa_recover | 0 \n |\n| Com_xa_rollback | 0 \n |\n| Com_xa_start | 0 \n |\n| Compression | OFF \n |\n| Connection_errors_accept | 0 \n |\n| Connection_errors_internal | 0 \n |\n| Connection_errors_max_connections | 0 \n |\n| Connection_errors_peer_address | 0 \n |\n| Connection_errors_select | 0 \n |\n| Connection_errors_tcpwrap | 0 \n |\n| Connections | 4 \n |\n| Cpu_time | 0.000000 \n |\n| Created_tmp_disk_tables | 0 \n |\n| Created_tmp_files | 6 \n |\n| Created_tmp_tables | 2 \n |\n| Delayed_errors | 0 \n |\n| Delayed_insert_threads | 0 \n |\n| Delayed_writes | 0 \n |\n| Delete_scan | 0 \n |\n| Empty_queries | 0 \n |\n| Executed_events | 0 \n |\n| Executed_triggers | 0 \n |\n| Feature_delay_key_write | 0 \n |\n| Feature_dynamic_columns | 0 \n |\n| Feature_fulltext | 0 \n |\n| Feature_gis | 0 \n |\n| Feature_locale | 0 \n |\n| Feature_subquery | 0 \n |\n| Feature_timezone | 0 \n |\n| Feature_trigger | 0 \n |\n| Feature_xml | 0 \n |\n| Flush_commands | 1 \n |\n| Handler_commit | 1 \n |\n| Handler_delete | 0 \n |\n| Handler_discover | 0 \n |\n| Handler_external_lock | 0 \n |\n| Handler_icp_attempts | 0 \n |\n| Handler_icp_match | 0 \n |\n| Handler_mrr_init | 0 \n |\n| Handler_mrr_key_refills | 0 \n |\n| Handler_mrr_rowid_refills | 0 \n |\n| Handler_prepare | 0 \n |\n| Handler_read_first | 3 \n |\n| Handler_read_key | 0 \n |\n| Handler_read_last | 0 \n |\n| Handler_read_next | 0 \n |\n| Handler_read_prev | 0 \n |\n| Handler_read_retry | 0 \n |\n| Handler_read_rnd | 0 \n |\n| Handler_read_rnd_deleted | 0 \n |\n| Handler_read_rnd_next | 537 \n |\n| Handler_rollback | 0 \n |\n| Handler_savepoint | 0 \n |\n| Handler_savepoint_rollback | 0 \n |\n| Handler_tmp_update | 0 \n |\n| Handler_tmp_write | 516 \n |\n| Handler_update | 0 \n |\n| Handler_write | 0 \n |\n| Innodb_available_undo_logs | 128 \n |\n| Innodb_background_log_sync | 222 \n |\n| Innodb_buffer_pool_bytes_data | 2523136 \n |\n| Innodb_buffer_pool_bytes_dirty | 0 \n |\n| Innodb_buffer_pool_dump_status | Dumping\nbuffer pool(s) not yet started |\n| Innodb_buffer_pool_load_status | Loading\nbuffer pool(s) not yet started |\n| Innodb_buffer_pool_pages_data | 154 \n |\n| Innodb_buffer_pool_pages_dirty | 0 \n |\n| Innodb_buffer_pool_pages_flushed | 1 \n |\n| Innodb_buffer_pool_pages_free | 8037 \n |\n| Innodb_buffer_pool_pages_lru_flushed | 0 \n |\n| Innodb_buffer_pool_pages_made_not_young | 0 \n |\n| Innodb_buffer_pool_pages_made_young | 0 \n |\n| Innodb_buffer_pool_pages_misc | 0 \n |\n| Innodb_buffer_pool_pages_old | 0 \n |\n| Innodb_buffer_pool_pages_total | 8191 \n |\n| Innodb_buffer_pool_read_ahead | 0 \n |\n| Innodb_buffer_pool_read_ahead_evicted | 0 \n |\n| Innodb_buffer_pool_read_ahead_rnd | 0 \n |\n| Innodb_buffer_pool_read_requests | 558 \n |\n| Innodb_buffer_pool_reads | 155 \n |\n| Innodb_buffer_pool_wait_free | 0 \n |\n| Innodb_buffer_pool_write_requests | 1 \n |\n| Innodb_checkpoint_age | 0 \n |\n| Innodb_checkpoint_max_age | 80826164 \n |\n| Innodb_data_fsyncs | 5 \n |\n| Innodb_data_pending_fsyncs | 0 \n |\n| Innodb_data_pending_reads | 0 \n |\n| Innodb_data_pending_writes | 0 \n |\n| Innodb_data_read | 2609664 \n |\n| Innodb_data_reads | 172 \n |\n| Innodb_data_writes | 5 \n |\n| Innodb_data_written | 34304 \n |\n| Innodb_dblwr_pages_written | 1 \n |\n| Innodb_dblwr_writes | 1 \n |\n| Innodb_deadlocks | 0 \n |\n| Innodb_have_atomic_builtins | ON \n |\n| Innodb_history_list_length | 0 \n |\n| Innodb_ibuf_discarded_delete_marks | 0 \n |\n| Innodb_ibuf_discarded_deletes | 0 \n |\n| Innodb_ibuf_discarded_inserts | 0 \n |\n| Innodb_ibuf_free_list | 0 \n |\n| Innodb_ibuf_merged_delete_marks | 0 \n |\n| Innodb_ibuf_merged_deletes | 0 \n |\n| Innodb_ibuf_merged_inserts | 0 \n |\n| Innodb_ibuf_merges | 0 \n |') WHERE help_topic_id = 391;
-update help_topic set description = CONCAT(description, '\n| Innodb_ibuf_segment_size | 2 \n |\n| Innodb_ibuf_size | 1 \n |\n| Innodb_log_waits | 0 \n |\n| Innodb_log_write_requests | 0 \n |\n| Innodb_log_writes | 1 \n |\n| Innodb_lsn_current | 1616829 \n |\n| Innodb_lsn_flushed | 1616829 \n |\n| Innodb_lsn_last_checkpoint | 1616829 \n |\n| Innodb_master_thread_active_loops | 0 \n |\n| Innodb_master_thread_idle_loops | 222 \n |\n| Innodb_max_trx_id | 2308 \n |\n| Innodb_mem_adaptive_hash | 2217568 \n |\n| Innodb_mem_dictionary | 630703 \n |\n| Innodb_mem_total | 140771328 \n |\n| Innodb_mutex_os_waits | 1 \n |\n| Innodb_mutex_spin_rounds | 30 \n |\n| Innodb_mutex_spin_waits | 1 \n |\n| Innodb_oldest_view_low_limit_trx_id | 0 \n |\n| Innodb_os_log_fsyncs | 3 \n |\n| Innodb_os_log_pending_fsyncs | 0 \n |\n| Innodb_os_log_pending_writes | 0 \n |\n| Innodb_os_log_written | 512 \n |\n| Innodb_page_size | 16384 \n |\n| Innodb_pages_created | 0 \n |\n| Innodb_pages_read | 154 \n |\n| Innodb_pages_written | 1 \n |\n| Innodb_purge_trx_id | 0 \n |\n| Innodb_purge_undo_no | 0 \n |\n| Innodb_read_views_memory | 88 \n |\n| Innodb_row_lock_current_waits | 0 \n |\n| Innodb_row_lock_time | 0 \n |\n| Innodb_row_lock_time_avg | 0 \n |\n| Innodb_row_lock_time_max | 0 \n |\n| Innodb_row_lock_waits | 0 \n |\n| Innodb_rows_deleted | 0 \n |\n| Innodb_rows_inserted | 0 \n |\n| Innodb_rows_read | 0 \n |\n| Innodb_rows_updated | 0 \n |\n| Innodb_system_rows_deleted | 0 \n |\n| Innodb_system_rows_inserted | 0 \n |\n| Innodb_system_rows_read | 0 \n |\n| Innodb_system_rows_updated | 0 \n |\n| Innodb_s_lock_os_waits | 2 \n |\n| Innodb_s_lock_spin_rounds | 60 \n |\n| Innodb_s_lock_spin_waits | 2 \n |\n| Innodb_truncated_status_writes | 0 \n |\n| Innodb_x_lock_os_waits | 0 \n |\n| Innodb_x_lock_spin_rounds | 0 \n |\n| Innodb_x_lock_spin_waits | 0 \n |\n| Innodb_page_compression_saved | 0 \n |\n| Innodb_page_compression_trim_sect512 | 0 \n |\n| Innodb_page_compression_trim_sect1024 | 0 \n |\n| Innodb_page_compression_trim_sect2048 | 0 \n |\n| Innodb_page_compression_trim_sect4096 | 0 \n |\n| Innodb_page_compression_trim_sect8192 | 0 \n |\n| Innodb_page_compression_trim_sect16384 | 0 \n |\n| Innodb_page_compression_trim_sect32768 | 0 \n |\n| Innodb_num_index_pages_written | 0 \n |\n| Innodb_num_non_index_pages_written | 5 \n |\n| Innodb_num_pages_page_compressed | 0 \n |\n| Innodb_num_page_compressed_trim_op | 0 \n |\n| Innodb_num_page_compressed_trim_op_saved | 0 \n |\n| Innodb_num_pages_page_decompressed | 0 \n |\n| Innodb_num_pages_page_compression_error | 0 \n |\n| Innodb_num_pages_encrypted | 0 \n |\n| Innodb_num_pages_decrypted | 0 \n |\n| Innodb_have_lz4 | OFF \n |\n| Innodb_have_lzo | OFF \n |\n| Innodb_have_lzma | OFF \n |\n| Innodb_have_bzip2 | OFF \n |\n| Innodb_have_snappy | OFF \n |\n| Innodb_defragment_compression_failures | 0 \n |\n| Innodb_defragment_failures | 0 \n |\n| Innodb_defragment_count | 0 \n |\n| Innodb_onlineddl_rowlog_rows | 0 \n |\n| Innodb_onlineddl_rowlog_pct_used | 0 \n |\n| Innodb_onlineddl_pct_progress | 0 \n |\n| Innodb_secondary_index_triggered_cluster_reads | 0 \n |\n| Innodb_secondary_index_triggered_cluster_reads_avoided | 0 \n |\n| Innodb_encryption_rotation_pages_read_from_cache | 0 \n |\n| Innodb_encryption_rotation_pages_read_from_disk | 0 \n |\n| Innodb_encryption_rotation_pages_modified | 0 \n |\n| Innodb_encryption_rotation_pages_flushed | 0 \n |\n| Innodb_encryption_rotation_estimated_iops | 0 \n |\n| Innodb_scrub_background_page_reorganizations | 0 \n |\n| Innodb_scrub_background_page_splits | 0 \n |\n| Innodb_scrub_background_page_split_failures_underflow | 0 \n |\n| Innodb_scrub_background_page_split_failures_out_of_filespace | 0 \n |\n| Innodb_scrub_background_page_split_failures_missing_index | 0 \n |\n| Innodb_scrub_background_page_split_failures_unknown | 0 \n |\n| Key_blocks_not_flushed | 0 \n |\n| Key_blocks_unused | 107163 \n |\n| Key_blocks_used | 0 \n |\n| Key_blocks_warm | 0 \n |\n| Key_read_requests | 0 \n |\n| Key_reads | 0 \n |\n| Key_write_requests | 0 \n |\n| Key_writes | 0 \n |\n| Last_query_cost | 0.000000 \n |\n| Master_gtid_wait_count | 0 \n |\n| Master_gtid_wait_time | 0 \n |\n| Master_gtid_wait_timeouts | 0 \n |\n| Max_statement_time_exceeded | 0 \n |\n| Max_used_connections | 1 \n |\n| Memory_used | 273614696 \n |\n| Not_flushed_delayed_rows | 0 \n |\n| Open_files | 25 \n |\n| Open_streams | 0 \n |\n| Open_table_definitions | 18 \n |\n| Open_tables | 11 \n |\n| Opened_files | 77 \n |\n| Opened_plugin_libraries | 0 \n |\n| Opened_table_definitions | 18 \n |\n| Opened_tables | 18 \n |\n| Opened_views | 0 \n |\n| Performance_schema_accounts_lost | 0 \n |\n| Performance_schema_cond_classes_lost | 0 \n |\n| Performance_schema_cond_instances_lost | 0 \n |\n| Performance_schema_digest_lost | 0 \n |\n| Performance_schema_file_classes_lost | 0 \n |\n| Performance_schema_file_handles_lost | 0 \n |\n| Performance_schema_file_instances_lost | 0 \n |\n| Performance_schema_hosts_lost | 0 \n |\n| Performance_schema_locker_lost | 0 \n |\n| Performance_schema_mutex_classes_lost | 0 \n |\n| Performance_schema_mutex_instances_lost | 0 \n |\n| Performance_schema_rwlock_classes_lost | 0 \n |\n| Performance_schema_rwlock_instances_lost | 0 \n |\n| Performance_schema_session_connect_attrs_lost | 0 \n |\n| Performance_schema_socket_classes_lost | 0 \n |\n| Performance_schema_socket_instances_lost | 0 \n |\n| Performance_schema_stage_classes_lost | 0 \n |\n| Performance_schema_statement_classes_lost | 0 \n |\n| Performance_schema_table_handles_lost | 0 \n |\n| Performance_schema_table_instances_lost | 0 \n |\n| Performance_schema_thread_classes_lost | 0 \n |\n| Performance_schema_thread_instances_lost | 0 \n |\n| Performance_schema_users_lost | 0 \n |\n| Prepared_stmt_count | 0 \n |\n| Qcache_free_blocks | 1 \n |\n| Qcache_free_memory | 1031336 \n |\n| Qcache_hits | 0 \n |\n| Qcache_inserts | 0 \n |\n| Qcache_lowmem_prunes | 0 \n |\n| Qcache_not_cached | 0 \n |\n| Qcache_queries_in_cache | 0 \n |\n| Qcache_total_blocks | 1 \n |\n| Queries | 4 \n |\n| Questions | 4 \n |\n| Rows_read | 10 \n |\n| Rows_sent | 517 \n |\n| Rows_tmp_read | 516 \n |\n| Rpl_status | AUTH_MASTER \n |') WHERE help_topic_id = 391;
-update help_topic set description = CONCAT(description, '\n| Select_full_join | 0 \n |\n| Select_full_range_join | 0 \n |\n| Select_range | 0 \n |\n| Select_range_check | 0 \n |\n| Select_scan | 2 \n |\n| Slave_connections | 0 \n |\n| Slave_heartbeat_period | 0.000 \n |\n| Slave_open_temp_tables | 0 \n |\n| Slave_received_heartbeats | 0 \n |\n| Slave_retried_transactions | 0 \n |\n| Slave_running | OFF \n |\n| Slave_skipped_errors | 0 \n |\n| Slaves_connected | 0 \n |\n| Slaves_running | 0 \n |\n| Slow_launch_threads | 0 \n |\n| Slow_queries | 0 \n |\n| Sort_merge_passes | 0 \n |\n| Sort_priority_queue_sorts | 0 \n |\n| Sort_range | 0 \n |\n| Sort_rows | 0 \n |\n| Sort_scan | 0 \n |\n| Ssl_accept_renegotiates | 0 \n |\n| Ssl_accepts | 0 \n |\n| Ssl_callback_cache_hits | 0 \n |\n| Ssl_cipher | \n |\n| Ssl_cipher_list | \n |\n| Ssl_client_connects | 0 \n |\n| Ssl_connect_renegotiates | 0 \n |\n| Ssl_ctx_verify_depth | 0 \n |\n| Ssl_ctx_verify_mode | 0 \n |\n| Ssl_default_timeout | 0 \n |\n| Ssl_finished_accepts | 0 \n |\n| Ssl_finished_connects | 0 \n |\n| Ssl_server_not_after | \n |\n| Ssl_server_not_before | \n |\n| Ssl_session_cache_hits | 0 \n |\n| Ssl_session_cache_misses | 0 \n |\n| Ssl_session_cache_mode | NONE \n |\n| Ssl_session_cache_overflows | 0 \n |\n| Ssl_session_cache_size | 0 \n |\n| Ssl_session_cache_timeouts | 0 \n |\n| Ssl_sessions_reused | 0 \n |\n| Ssl_used_session_cache_entries | 0 \n |\n| Ssl_verify_depth | 0 \n |\n| Ssl_verify_mode | 0 \n |\n| Ssl_version | \n |\n| Subquery_cache_hit | 0 \n |\n| Subquery_cache_miss | 0 \n |\n| Syncs | 2 \n |\n| Table_locks_immediate | 21 \n |\n| Table_locks_waited | 0 \n |\n| Tc_log_max_pages_used | 0 \n |\n| Tc_log_page_size | 4096 \n |\n| Tc_log_page_waits | 0 \n |\n| Threadpool_idle_threads | 0 \n |\n| Threadpool_threads | 0 \n |\n| Threads_cached | 0 \n |\n| Threads_connected | 1 \n |\n| Threads_created | 2 \n |\n| Threads_running | 1 \n |\n| Update_scan | 0 \n |\n| Uptime | 223 \n |\n| Uptime_since_flush_status | 223 \n |\n| wsrep_cluster_conf_id |\n18446744073709551615 |\n| wsrep_cluster_size | 0 \n |\n| wsrep_cluster_state_uuid | \n |\n| wsrep_cluster_status | Disconnected \n |\n| wsrep_connected | OFF \n |\n| wsrep_local_bf_aborts | 0 \n |\n| wsrep_local_index |\n18446744073709551615 |\n| wsrep_provider_name | \n |\n| wsrep_provider_vendor | \n |\n| wsrep_provider_version | \n |\n| wsrep_ready | OFF \n |\n| wsrep_thread_count | 0 \n |\n+--------------------------------------------------------------+---------------\n------------------------+\n516 rows in set (0.00 sec)\n\nExample of filtered output:\n\nSHOW STATUS LIKE \'Key%\';\n+------------------------+--------+\n| Variable_name | Value |\n+------------------------+--------+\n| Key_blocks_not_flushed | 0 |\n| Key_blocks_unused | 107163 |\n| Key_blocks_used | 0 |\n| Key_blocks_warm | 0 |\n| Key_read_requests | 0 |\n| Key_reads | 0 |\n| Key_write_requests | 0 |\n| Key_writes | 0 |\n+------------------------+--------+\n8 rows in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/show-status/') WHERE help_topic_id = 391;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (392,26,'SHOW TABLE STATUS','Syntax\n------\n\nSHOW TABLE STATUS [{FROM | IN} db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW TABLE STATUS works like SHOW TABLES, but provides more extensive\ninformation about each non-TEMPORARY table.\n\nThe LIKE clause, if present on its own, indicates which table names to match.\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe following information is returned:\n\n+---------------------------+------------------------------------------------+\n| Column | Description |\n+---------------------------+------------------------------------------------+\n| Name | Table name. |\n+---------------------------+------------------------------------------------+\n| Engine | Table storage engine. |\n+---------------------------+------------------------------------------------+\n| Version | Version number from the table\'s .frm file. |\n+---------------------------+------------------------------------------------+\n| Row_format | Row format (see InnoDB, Aria and MyISAM row |\n| | formats). |\n+---------------------------+------------------------------------------------+\n| Rows | Number of rows in the table. Some engines, |\n| | such as XtraDB and InnoDB may store an |\n| | estimate. |\n+---------------------------+------------------------------------------------+\n| Avg_row_length | Average row length in the table. |\n+---------------------------+------------------------------------------------+\n| Data_length | For InnoDB/XtraDB, the index size, in pages, |\n| | multiplied by the page size. For Aria and |\n| | MyISAM, length of the data file, in bytes. |\n| | For MEMORY, the approximate allocated memory. |\n+---------------------------+------------------------------------------------+\n| Max_data_length | Maximum length of the data file, ie the total |\n| | number of bytes that could be stored in the |\n| | table. Not used in XtraDB and InnoDB. |\n+---------------------------+------------------------------------------------+\n| Index_length | Length of the index file. |\n+---------------------------+------------------------------------------------+\n| Data_free | Bytes allocated but unused. For InnoDB tables |\n| | in a shared tablespace, the free space of the |\n| | shared tablespace with small safety margin. |\n| | An estimate in the case of partitioned tables |\n| | - see the PARTITIONS table. |\n+---------------------------+------------------------------------------------+\n| Auto_increment | Next AUTO_INCREMENT value. |\n+---------------------------+------------------------------------------------+\n| Create_time | Time the table was created. Some engines just |\n| | return the ctime information from the file |\n| | system layer here, in that case the value is |\n| | not necessarily the table creation time but |\n| | rather the time the file system metadata for |\n| | it had last changed. |\n+---------------------------+------------------------------------------------+\n| Update_time | Time the table was last updated. On Windows, |\n| | the timestamp is not updated on update, so |\n| | MyISAM values will be inaccurate. In InnoDB, |\n| | if shared tablespaces are used, will be NULL, |\n| | while buffering can also delay the update, so |\n| | the value will differ from the actual time of |\n| | the last UPDATE, INSERT or DELETE. |\n+---------------------------+------------------------------------------------+\n| Check_time | Time the table was last checked. Not kept by |\n| | all storage engines, in which case will be |\n| | NULL. |\n+---------------------------+------------------------------------------------+\n| Collation | Character set and collation. |\n+---------------------------+------------------------------------------------+\n| Checksum | Live checksum value, if any. |\n+---------------------------+------------------------------------------------+\n| Create_options | Extra CREATE TABLE options. |\n+---------------------------+------------------------------------------------+\n| Comment | Table comment provided when MariaDB created |\n| | the table. |\n+---------------------------+------------------------------------------------+\n| Max_index_length | Maximum index length (supported by MyISAM and |\n| | Aria tables). Added in MariaDB 10.3.5. |\n+---------------------------+------------------------------------------------+\n| Temporary | Placeholder to signal that a table is a |\n| | temporary table. Currently always \"N\", except |\n| | \"Y\" for generated information_schema tables |\n| | and NULL for views. Added in MariaDB 10.3.5. |\n+---------------------------+------------------------------------------------+\n\nSimilar information can be found in the information_schema.TABLES table as\nwell as by using mysqlshow:\n\nmysqlshow --status db_name\n\nViews\n-----\n\nFor views, all columns in SHOW TABLE STATUS are NULL except \'Name\' and\n\'Comment\'\n\nExample\n-------\n\nshow table status\\G\n*************************** 1. row ***************************\n Name: bus_routes\n Engine: InnoDB\n Version: 10\n Row_format: Dynamic\n Rows: 5\n Avg_row_length: 3276\n Data_length: 16384\nMax_data_length: 0\n Index_length: 0\n Data_free: 0\n Auto_increment: NULL\n Create_time: 2017-05-24 11:17:46\n Update_time: NULL\n Check_time: NULL\n Collation: latin1_swedish_ci\n Checksum: NULL\n Create_options: \n Comment:\n\nURL: https://mariadb.com/kb/en/show-table-status/','','https://mariadb.com/kb/en/show-table-status/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (393,26,'SHOW TABLES','Syntax\n------\n\nSHOW [FULL] TABLES [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW TABLES lists the non-TEMPORARY tables, sequences and views in a given\ndatabase.\n\nThe LIKE clause, if present on its own, indicates which table names to match.\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW. For example, when searching for\ntables in the test database, the column name for use in the WHERE and LIKE\nclauses will be Tables_in_test\n\nThe FULL modifier is supported such that SHOW FULL TABLES displays a second\noutput column. Values for the second column, Table_type, are BASE TABLE for a\ntable, VIEW for a view and SEQUENCE for a sequence.\n\nYou can also get this information using:\n\nmysqlshow db_name\n\nSee mysqlshow for more details.\n\nIf you have no privileges for a base table or view, it does not show up in the\noutput from SHOW TABLES or mysqlshow db_name.\n\nThe information_schema.TABLES table, as well as the SHOW TABLE STATUS\nstatement, provide extended information about tables.\n\nExamples\n--------\n\nSHOW TABLES;\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n| t1 |\n| view1 |\n+----------------------+\n\nShowing the tables beginning with a only.\n\nSHOW TABLES WHERE Tables_in_test LIKE \'a%\';\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n+----------------------+\n\nShowing tables and table types:\n\nSHOW FULL TABLES;\n+----------------+------------+\n| Tables_in_test | Table_type |\n+----------------+------------+\n| s1 | SEQUENCE |\n| student | BASE TABLE |\n| v1 | VIEW |\n+----------------+------------+\n\nURL: https://mariadb.com/kb/en/show-tables/','','https://mariadb.com/kb/en/show-tables/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (394,26,'SHOW TABLE_STATISTICS','Syntax\n------\n\nSHOW TABLE_STATISTICS\n\nDescription\n-----------\n\nThe SHOW TABLE_STATISTICS statementis part of the User Statistics feature. It\nwas removed as a separate statement in MariaDB 10.1.1, but effectively\nreplaced by the generic SHOW information_schema_table statement. The\ninformation_schema.TABLE_STATISTICS table shows statistics on table usage\n\nThe userstat system variable must be set to 1 to activate this feature. See\nthe User Statistics and information_schema.TABLE_STATISTICS articles for more\ninformation.\n\nExample\n-------\n\nSHOW TABLE_STATISTICS\\G\n*************************** 1. row ***************************\n Table_schema: mysql\n Table_name: proxies_priv\n Rows_read: 2\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n*************************** 2. row ***************************\n Table_schema: test\n Table_name: employees_example\n Rows_read: 7\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n*************************** 3. row ***************************\n Table_schema: mysql\n Table_name: user\n Rows_read: 16\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n*************************** 4. row ***************************\n Table_schema: mysql\n Table_name: db\n Rows_read: 2\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n\nURL: https://mariadb.com/kb/en/show-table-statistics/','','https://mariadb.com/kb/en/show-table-statistics/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (395,26,'SHOW TRIGGERS','Syntax\n------\n\nSHOW TRIGGERS [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW TRIGGERS lists the triggers currently defined for tables in a database\n(the default database unless a FROM clause is given). This statement requires\nthe TRIGGER privilege (prior to MySQL 5.1.22, it required the SUPER privilege).\n\nThe LIKE clause, if present on its own, indicates which table names to match\nand causes the statement to display triggers for those tables. The WHERE and\nLIKE clauses can be given to select rows using more general conditions, as\ndiscussed in Extended SHOW.\n\nSimilar information is stored in the information_schema.TRIGGERS table.\n\nMariaDB starting with 10.2.3\n----------------------------\nIf there are multiple triggers for the same action, then the triggers are\nshown in action order.\n\nExamples\n--------\n\nFor the trigger defined at Trigger Overview:\n\nSHOW triggers Like \'animals\' \\G\n*************************** 1. row ***************************\n Trigger: the_mooses_are_loose\n Event: INSERT\n Table: animals\n Statement: BEGIN\n IF NEW.name = \'Moose\' THEN\n UPDATE animal_count SET animal_count.animals = animal_count.animals+100;\n ELSE \n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\n END IF;\nEND\n Timing: AFTER\n Created: 2016-09-29 13:53:34.35\n sql_mode:\n Definer: root@localhost\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nListing all triggers associated with a certain table:\n\nSHOW TRIGGERS FROM test WHERE `Table` = \'user\' \\G\n*************************** 1. row ***************************\n Trigger: user_ai\n Event: INSERT\n Table: user\n Statement: BEGIN END\n Timing: AFTER\n Created: 2016-09-29 13:53:34.35\n sql_mode:\n Definer: root@%\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nSHOW triggers WHERE Event Like \'Insert\' \\G\n*************************** 1. row ***************************\n Trigger: the_mooses_are_loose\n Event: INSERT\n Table: animals\n Statement: BEGIN\n IF NEW.name = \'Moose\' THEN\n UPDATE animal_count SET animal_count.animals = animal_count.animals+100;\n ELSE \n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\n END IF;\nEND\n Timing: AFTER\n Created: 2016-09-29 13:53:34.35\n sql_mode:\n Definer: root@localhost\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\n* character_set_client is the session value of the character_set_client system\nvariable when the trigger was created. \n* collation_connection is the session value of the collation_connection system\nvariable when the trigger was\n created. \n* Database Collation is the collation of the database \n with which the trigger is associated.\n\nThese columns were added in MariaDB/MySQL 5.1.21.\n\nOld triggers created before MySQL 5.7 and MariaDB 10.2.3 has NULL in the\nCreated column.\n\nURL: https://mariadb.com/kb/en/show-triggers/','','https://mariadb.com/kb/en/show-triggers/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (396,26,'SHOW USER_STATISTICS','Syntax\n------\n\nSHOW USER_STATISTICS\n\nDescription\n-----------\n\nThe SHOW USER_STATISTICS statement is part of the User Statistics feature. It\nwas removed as a separate statement in MariaDB 10.1.1, but effectively\nreplaced by the generic SHOW information_schema_table statement. The\ninformation_schema.USER_STATISTICS table holds statistics about user activity.\nYou can use this table to find out such things as which user is causing the\nmost load and which users are being abusive. You can also use this table to\nmeasure how close to capacity the server may be.\n\nThe userstat system variable must be set to 1 to activate this feature. See\nthe User Statistics and information_schema.USER_STATISTICS table for more\ninformation.\n\nExample\n-------\n\nSHOW USER_STATISTICS\\G\n*************************** 1. row ***************************\n User: root\n Total_connections: 1\nConcurrent_connections: 0\n Connected_time: 3297\n Busy_time: 0.14113400000000006\n Cpu_time: 0.017637000000000003\n Bytes_received: 969\n Bytes_sent: 22355\n Binlog_bytes_written: 0\n Rows_read: 10\n Rows_sent: 67\n Rows_deleted: 0\n Rows_inserted: 0\n Rows_updated: 0\n Select_commands: 7\n Update_commands: 0\n Other_commands: 0\n Commit_transactions: 1\n Rollback_transactions: 0\n Denied_connections: 0\n Lost_connections: 0\n Access_denied: 0\n Empty_queries: 7\n\nURL: https://mariadb.com/kb/en/show-user-statistics/','','https://mariadb.com/kb/en/show-user-statistics/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (397,26,'SHOW VARIABLES','Syntax\n------\n\nSHOW [GLOBAL | SESSION] VARIABLES\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW VARIABLES shows the values of MariaDB system variables. This information\nalso can be obtained using the mysqladmin variables command. The LIKE clause,\nif present, indicates which variable names to match. The WHERE clause can be\ngiven to select rows using more general conditions.\n\nWith the GLOBAL modifier, SHOW VARIABLES displays the values that are used for\nnew connections to MariaDB. With SESSION, it displays the values that are in\neffect for the current connection. If no modifier is present, the default is\nSESSION. LOCAL is a synonym for SESSION. With a LIKE clause, the statement\ndisplays only rows for those variables with names that match the pattern. To\nobtain the row for a specific variable, use a LIKE clause as shown:\n\nSHOW VARIABLES LIKE \'maria_group_commit\';\nSHOW SESSION VARIABLES LIKE \'maria_group_commit\';\n\nTo get a list of variables whose name match a pattern, use the \"%\" wildcard\ncharacter in a LIKE clause:\n\nSHOW VARIABLES LIKE \'%maria%\';\nSHOW GLOBAL VARIABLES LIKE \'%maria%\';\n\nWildcard characters can be used in any position within the pattern to be\nmatched. Strictly speaking, because \"_\" is a wildcard that matches any single\ncharacter, you should escape it as \"\\_\" to match it literally. In practice,\nthis is rarely necessary.\n\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nSee SET for information on setting server system variables.\n\nSee Server System Variables for a list of all the variables that can be set.\n\nYou can also see the server variables by querying the Information Schema\nGLOBAL_VARIABLES and SESSION_VARIABLES tables.\n\nExamples\n--------\n\nSHOW VARIABLES LIKE \'aria%\';\n+------------------------------------------+---------------------+\n| Variable_name | Value |\n+------------------------------------------+---------------------+\n| aria_block_size | 8192 |\n| aria_checkpoint_interval | 30 |\n| aria_checkpoint_log_activity | 1048576 |\n| aria_force_start_after_recovery_failures | 0 |\n| aria_group_commit | none |\n| aria_group_commit_interval | 0 |\n| aria_log_file_size | 1073741824 |\n| aria_log_purge_type | immediate |\n| aria_max_sort_file_size | 9223372036853727232 |\n| aria_page_checksum | ON |\n| aria_pagecache_age_threshold | 300 |\n| aria_pagecache_buffer_size | 134217728 |\n| aria_pagecache_division_limit | 100 |\n| aria_recover | NORMAL |\n| aria_repair_threads | 1 |\n| aria_sort_buffer_size | 134217728 |\n| aria_stats_method | nulls_unequal |\n| aria_sync_log_dir | NEWFILE |\n| aria_used_for_temp_tables | ON |\n+------------------------------------------+---------------------+\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'max_error_count\' OR\n VARIABLE_NAME LIKE \'innodb_sync_spin_loops\';\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 64 | 64 |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n\nSET GLOBAL max_error_count=128;\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'max_error_count\' OR\n VARIABLE_NAME LIKE \'innodb_sync_spin_loops\';\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 64 | 128 |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n\nSET GLOBAL max_error_count=128;\n\nSHOW VARIABLES LIKE \'max_error_count\';\n+-----------------+-------+\n| Variable_name | Value |\n+-----------------+-------+\n| max_error_count | 64 |\n+-----------------+-------+\n\nSHOW GLOBAL VARIABLES LIKE \'max_error_count\';\n+-----------------+-------+\n| Variable_name | Value |\n+-----------------+-------+\n| max_error_count | 128 |\n+-----------------+-------+\n\nBecause the following variable only has a global scope, the global value is\nreturned even when specifying SESSION (in this case by default):\n\nSHOW VARIABLES LIKE \'innodb_sync_spin_loops\';\n+------------------------+-------+\n| Variable_name | Value |\n+------------------------+-------+\n| innodb_sync_spin_loops | 30 |\n+------------------------+-------+\n\nURL: https://mariadb.com/kb/en/show-variables/','','https://mariadb.com/kb/en/show-variables/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (398,26,'SHOW WARNINGS','Syntax\n------\n\nSHOW WARNINGS [LIMIT [offset,] row_count]\nSHOW ERRORS [LIMIT row_count OFFSET offset]\nSHOW COUNT(*) WARNINGS\n\nDescription\n-----------\n\nSHOW WARNINGS shows the error, warning, and note messages that resulted from\nthe last statement that generated messages in the current session. It shows\nnothing if the last statement used a table and generated no messages. (That\nis, a statement that uses a table but generates no messages clears the message\nlist.) Statements that do not use tables and do not generate messages have no\neffect on the message list.\n\nA note is different to a warning in that it only appears if the sql_notes\nvariable is set to 1 (the default), and is not converted to an error if strict\nmode is enabled.\n\nA related statement, SHOW ERRORS, shows only the errors.\n\nThe SHOW COUNT(*) WARNINGS statement displays the total number of errors,\nwarnings, and notes. You can also retrieve this number from the warning_count\nvariable:\n\nSHOW COUNT(*) WARNINGS;\nSELECT @@warning_count;\n\nThe value of warning_count might be greater than the number of messages\ndisplayed by SHOW WARNINGS if the max_error_count system variable is set so\nlow that not all messages are stored.\n\nThe LIMIT clause has the same syntax as for the SELECT statement.\n\nSHOW WARNINGS can be used after EXPLAIN EXTENDED to see how a query is\ninternally rewritten by MariaDB.\n\nIf the sql_notes server variable is set to 1, Notes are included in the output\nof SHOW WARNINGS; if it is set to 0, this statement will not show (or count)\nNotes.\n\nThe results of SHOW WARNINGS and SHOW COUNT(*) WARNINGS are directly sent to\nthe client. If you need to access those information in a stored program, you\ncan use the GET DIAGNOSTICS statement instead.\n\nFor a list of MariaDB error codes, see MariaDB Error Codes.\n\nThe mysql client also has a number of options related to warnings. The \\W\ncommand will show warnings after every statement, while \\w will disable this.\nStarting the client with the --show-warnings option will show warnings after\nevery statement.\n\nMariaDB 10.3.1 implements a stored routine error stack trace. SHOW WARNINGS\ncan also be used to show more information. See the example below.\n\nExamples\n--------\n\nSELECT 1/0;\n+------+\n| 1/0 |\n+------+\n| NULL |\n+------+\n\nSHOW COUNT(*) WARNINGS;\n+-------------------------+\n| @@session.warning_count |\n+-------------------------+\n| 1 |\n+-------------------------+\n\nSHOW WARNINGS;\n+---------+------+---------------+\n| Level | Code | Message |\n+---------+------+---------------+\n| Warning | 1365 | Division by 0 |\n+---------+------+---------------+\n\nStack Trace\n-----------\n\nFrom MariaDB 10.3.1, displaying a stack trace:\n\nDELIMITER $$\nCREATE OR REPLACE PROCEDURE p1()\n BEGIN\n DECLARE c CURSOR FOR SELECT * FROM not_existing;\n OPEN c;\n CLOSE c;\n END;\n$$\nCREATE OR REPLACE PROCEDURE p2()\n BEGIN\n CALL p1;\n END;\n$$\nDELIMITER ;\nCALL p2;\nERROR 1146 (42S02): Table \'test.not_existing\' doesn\'t exist\n\nSHOW WARNINGS;\n+-------+------+-----------------------------------------+\n| Level | Code | Message |\n+-------+------+-----------------------------------------+\n| Error | 1146 | Table \'test.not_existing\' doesn\'t exist |\n| Note | 4091 | At line 6 in test.p1 |\n| Note | 4091 | At line 4 in test.p2 |\n+-------+------+-----------------------------------------+\n\nSHOW WARNINGS displays a stack trace, showing where the error actually\nhappened:\n\n* Line 4 in test.p1 is the OPEN command which actually raised the error\n* Line 3 in test.p2 is the CALL statement, calling p1 from p2.\n\nURL: https://mariadb.com/kb/en/show-warnings/','','https://mariadb.com/kb/en/show-warnings/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (399,26,'SHOW WSREP_MEMBERSHIP','SHOW WSREP_MEMBERSHIP is part of the WSREP_INFO plugin.\n\nSyntax\n------\n\nSHOW WSREP_MEMBERSHIP\n\nDescription\n-----------\n\nThe SHOW WSREP_MEMBERSHIP statement returns Galera node cluster membership\ninformation. It returns the same information as found in the\ninformation_schema.WSREP_MEMBERSHIP table. Only users with the SUPER privilege\ncan access this information.\n\nExamples\n--------\n\nSHOW WSREP_MEMBERSHIP;\n+-------+--------------------------------------+----------+-----------------+\n| Index | Uuid | Name | Address |\n+-------+--------------------------------------+----------+-----------------+\n| 0 | 19058073-8940-11e4-8570-16af7bf8fced | my_node1 | 10.0.2.15:16001 |\n| 1 | 19f2b0e0-8942-11e4-9cb8-b39e8ee0b5dd | my_node3 | 10.0.2.15:16003 |\n| 2 | d85e62db-8941-11e4-b1ef-4bc9980e476d | my_node2 | 10.0.2.15:16002 |\n+-------+--------------------------------------+----------+-----------------+\n\nURL: https://mariadb.com/kb/en/show-wsrep_membership/','','https://mariadb.com/kb/en/show-wsrep_membership/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (400,26,'SHOW WSREP_STATUS','SHOW WSREP_STATUS is part of the WSREP_INFO plugin.\n\nSyntax\n------\n\nSHOW WSREP_STATUS\n\nDescription\n-----------\n\nThe SHOW WSREP_STATUS statement returns Galera node and cluster status\ninformation. It returns the same information as found in the\ninformation_schema.WSREP_STATUS table. Only users with the SUPER privilege can\naccess this information.\n\nExamples\n--------\n\nSHOW WSREP_STATUS;\n+------------+-------------+----------------+--------------+\n| Node_Index | Node_Status | Cluster_Status | Cluster_Size |\n+------------+-------------+----------------+--------------+\n| 0 | Synced | Primary | 3 |\n+------------+-------------+----------------+--------------+\n\nURL: https://mariadb.com/kb/en/show-wsrep_status/','','https://mariadb.com/kb/en/show-wsrep_status/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (401,26,'BINLOG','Syntax\n------\n\nBINLOG \'str\'\n\nDescription\n-----------\n\nBINLOG is an internal-use statement. It is generated by the\nmariadb-binlog/mysqlbinlog program as the printable representation of certain\nevents in binary log files. The \'str\' value is a base 64-encoded string the\nthat server decodes to determine the data change indicated by the\ncorresponding event. This statement requires the SUPER privilege (<= MariaDB\n10.5.1) or theBINLOG REPLAY privilege (>= MariaDB 10.5.2).\n\nURL: https://mariadb.com/kb/en/binlog/','','https://mariadb.com/kb/en/binlog/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (402,26,'PURGE BINARY LOGS','Syntax\n------\n\nPURGE { BINARY | MASTER } LOGS\n { TO \'log_name\' | BEFORE datetime_expr }\n\nDescription\n-----------\n\nThe PURGE BINARY LOGS statement deletes all the binary log files listed in the\nlog index file prior to the specified log file name or date. BINARY and MASTER\nare synonyms. Deleted log files also are removed from the list recorded in the\nindex file, so that the given log file becomes the first in the list.\n\nThe datetime expression is in the format \'YYYY-MM-DD hh:mm:ss\'.\n\nIf a replica is active but has yet to read from a binary log file you attempt\nto delete, the statement will fail with an error. However, if the replica is\nnot connected and has yet to read from a log file you delete, the file will be\ndeleted, but the replica will be unable to continue replicating once it\nconnects again.\n\nThis statement has no effect if the server was not started with the --log-bin\noption to enable binary logging.\n\nTo list the binary log files on the server, use SHOW BINARY LOGS. To see which\nfiles they are reading, use SHOW SLAVE STATUS (or SHOW REPLICA STATUS from\nMariaDB 10.5.1). You can only delete the files that are older than the oldest\nfile that is used by the slaves.\n\nTo delete all binary log files, use RESET MASTER. To move to a new log file\n(for example if you want to remove the current log file), use FLUSH LOGS\nbefore you execute PURGE LOGS.\n\nIf the expire_logs_days server system variable is not set to 0, the server\nautomatically deletes binary log files after the given number of days. From\nMariaDB 10.6, the binlog_expire_logs_seconds variable allows more precise\ncontrol over binlog deletion, and takes precedence if both are non-zero.\n\nRequires the SUPER privilege or, from MariaDB 10.5.2, the BINLOG ADMIN\nprivilege, to run.\n\nExamples\n--------\n\nPURGE BINARY LOGS TO \'mariadb-bin.000063\';\n\nPURGE BINARY LOGS BEFORE \'2013-04-21\';\n\nPURGE BINARY LOGS BEFORE \'2013-04-22 09:55:22\';\n\nURL: https://mariadb.com/kb/en/purge-binary-logs/','','https://mariadb.com/kb/en/purge-binary-logs/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (403,26,'CACHE INDEX','Syntax\n------\n\nCACHE INDEX \n tbl_index_list [, tbl_index_list] ...\n IN key_cache_name\n\ntbl_index_list:\n tbl_name [[INDEX|KEY] (index_name[, index_name] ...)]\n\nDescription\n-----------\n\nThe CACHE INDEX statement assigns table indexes to a specific key cache. It is\nused only for MyISAM tables.\n\nA default key cache exists and cannot be destroyed. To create more key caches,\nthe key_buffer_size server system variable.\n\nThe associations between tables indexes and key caches are lost on server\nrestart. To recreate them automatically, it is necessary to configure caches\nin a configuration file and include some CACHE INDEX (and optionally LOAD\nINDEX) statements in the init file.\n\nExamples\n--------\n\nThe following statement assigns indexes from the tables t1, t2, and t3 to the\nkey cache named hot_cache:\n\nCACHE INDEX t1, t2, t3 IN hot_cache;\n+---------+--------------------+----------+----------+\n| Table | Op | Msg_type | Msg_text |\n+---------+--------------------+----------+----------+\n| test.t1 | assign_to_keycache | status | OK |\n| test.t2 | assign_to_keycache | status | OK |\n| test.t3 | assign_to_keycache | status | OK |\n+---------+--------------------+----------+----------+\n\nImplementation (for MyISAM)\n---------------------------\n\nNormally CACHE INDEX should not take a long time to execute. Internally it\'s\nimplemented the following way:\n\n* Find the right key cache (under LOCK_global_system_variables)\n* Open the table with a TL_READ_NO_INSERT lock.\n* Flush the original key cache for the given file (under key cache lock)\n* Flush the new key cache for the given file (safety)\n* Move the file to the new key cache (under file share lock)\n\nThe only possible long operations are getting the locks for the table and\nflushing the original key cache, if there were many key blocks for the file in\nit.\n\nWe plan to also add CACHE INDEX for Aria tables if there is a need for this.\n\nURL: https://mariadb.com/kb/en/cache-index/','','https://mariadb.com/kb/en/cache-index/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (404,26,'HELP Command','Syntax\n------\n\nHELP search_string\n\nDescription\n-----------\n\nThe HELP command can be used in any MariaDB client, such as the mysql\ncommand-line client, to get basic syntax help and a short description for most\ncommands and functions.\n\nIf you provide an argument to the HELP command, the mysql client uses it as a\nsearch string to access server-side help. The proper operation of this command\nrequires that the help tables in the mysql database be initialized with help\ntopic information.\n\nIf there is no match for the search string, the search fails. Use HELP\ncontents to see a list of the help categories:\n\nHELP contents\nYou asked for help about help category: \"Contents\"\nFor more information, type \'help <item>\', where <item> is one of the following\ncategories:\n Account Management\n Administration\n Compound Statements\n Data Definition\n Data Manipulation\n Data Types\n Functions\n Functions and Modifiers for Use with GROUP BY\n Geographic Features\n Help Metadata\n Language Structure\n Plugins\n Procedures\n Sequences\n Table Maintenance\n Transactions\n User-Defined Functions\n Utility\n\nIf a search string matches multiple items, MariaDB shows a list of matching\ntopics:\n\nHELP drop\nMany help items for your request exist.\nTo make a more specific request, please type \'help <item>\',\nwhere <item> is one of the following\ntopics:\n ALTER TABLE\n DROP DATABASE\n DROP EVENT\n DROP FUNCTION\n DROP FUNCTION UDF\n DROP INDEX\n DROP PACKAGE\n DROP PACKAGE BODY\n DROP PROCEDURE\n DROP ROLE\n DROP SEQUENCE\n DROP SERVER\n DROP TABLE\n DROP TRIGGER\n DROP USER\n DROP VIEW\n\nThen you can enter a topic as the search string to see the help entry for that\ntopic.\n\nThe help is provided with the MariaDB server and makes use of four help tables\nfound in the mysql database: help_relation, help_topic, help_category and\nhelp_keyword. These tables are populated by the mysql_install_db or\nfill_help_table.sql scripts which, until MariaDB 10.4.7, contain data\ngenerated from an old version of MySQL.\n\nURL: https://mariadb.com/kb/en/help-command/','','https://mariadb.com/kb/en/help-command/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (405,26,'KILL [CONNECTION | QUERY]','Syntax\n------\n\nKILL [HARD | SOFT] { {CONNECTION|QUERY} thread_id | QUERY ID query_id | USER\nuser_name }\n\nDescription\n-----------\n\nEach connection to mysqld runs in a separate thread. You can see which threads\nare running with the SHOW PROCESSLIST statement and kill a thread with the\nKILL thread_id statement. KILL allows the optional CONNECTION or QUERY\nmodifier:\n\n* KILL CONNECTION is the same as KILL with no\n modifier: It terminates the connection associated with the given thread or\nquery id.\n* KILL QUERY terminates the statement that the connection thread_id is\n currently executing, but leaves the connection itself intact.\n* KILL QUERY ID terminates the query by query_id, leaving the connection\nintact.\n\nIf a connection is terminated that has an active transaction, the transaction\nwill be rolled back. If only a query is killed, the current transaction will\nstay active. See also idle_transaction_timeout.\n\nIf you have the PROCESS privilege, you can see all threads. If you have the\nSUPER privilege, or, from MariaDB 10.5.2, the CONNECTION ADMIN privilege, you\ncan kill all threads and statements. Otherwise, you can see and kill only your\nown threads and statements.\n\nKilling queries that repair or create indexes on MyISAM and Aria tables may\nresult in corrupted tables. Use the SOFT option to avoid this!\n\nThe HARD option (default) kills a command as soon as possible. If you use\nSOFT, then critical operations that may leave a table in an inconsistent state\nwill not be interrupted. Such operations include REPAIR and INDEX creation for\nMyISAM and Aria tables (REPAIR TABLE, OPTIMIZE TABLE).\n\nKILL ... USER username will kill all connections/queries for a given user.\nUSER can be specified one of the following ways:\n\n* username (Kill without regard to hostname)\n* username@hostname\n* CURRENT_USER or CURRENT_USER()\n\nIf you specify a thread id and that thread does not exist, you get the\nfollowing error:\n\nERROR 1094 (HY000): Unknown thread id: <thread_id>\n\nIf you specify a query id that doesn\'t exist, you get the following error:\n\nERROR 1957 (HY000): Unknown query id: <query_id>\n\nHowever, if you specify a user name, no error is issued for non-connected (or\neven non-existing) users. To check if the connection/query has been killed,\nyou can use the ROW_COUNT() function.\n\nA client whose connection is killed receives the following error:\n\nERROR 1317 (70100): Query execution was interrupted\n\nTo obtain a list of existing sessions, use the SHOW PROCESSLIST statement or\nquery the Information Schema PROCESSLIST table.\n\nNote: You cannot use KILL with the Embedded MySQL Server library because the\nembedded server merely runs inside the threads of the host application. It\ndoes not create any connection threads of its own.\n\nNote: You can also use mysqladmin kill thread_id [,thread_id...] to kill\nconnections. To get a list of running queries, use mysqladmin processlist. See\nmysqladmin.\n\nPercona Toolkit contains a program, pt-kill that can be used to automatically\nkill connections that match certain criteria. For example, it can be used to\nterminate idle connections, or connections that have been busy for more than\n60 seconds.\n\nURL: https://mariadb.com/kb/en/kill/','','https://mariadb.com/kb/en/kill/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (406,26,'LOAD INDEX','Syntax\n------\n\nLOAD INDEX INTO CACHE\n tbl_index_list [, tbl_index_list] ...\n\ntbl_index_list:\n tbl_name\n [[INDEX|KEY] (index_name[, index_name] ...)]\n [IGNORE LEAVES]\n\nDescription\n-----------\n\nThe LOAD INDEX INTO CACHE statement preloads a table index into the key cache\nto which it has been assigned by an explicit CACHE INDEX statement, or into\nthe default key cache otherwise. LOAD INDEX INTO CACHE is used only for MyISAM\nor Aria tables.\n\nThe IGNORE LEAVES modifier causes only blocks for the nonleaf nodes of the\nindex to be preloaded.\n\nURL: https://mariadb.com/kb/en/load-index/','','https://mariadb.com/kb/en/load-index/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (407,26,'RESET','Syntax\n------\n\nRESET reset_option [, reset_option] ...\n\nDescription\n-----------\n\nThe RESET statement is used to clear the state of various server operations.\nYou must have the RELOAD privilege to execute RESET.\n\nRESET acts as a stronger version of the FLUSH statement.\n\nThe different RESET options are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| SLAVE | Deletes all relay logs from the slave and |\n| [\"connection_name\"] [ALL] | reset the replication position in the master |\n| | binary log. |\n+---------------------------+------------------------------------------------+\n| MASTER | Deletes all old binary logs, makes the binary |\n| | index file (--log-bin-index) empty and |\n| | creates a new binary log file. This is |\n| | useful when you want to reset the master to |\n| | an initial state. If you want to just delete |\n| | old, not used binary logs, you should use the |\n| | PURGE BINARY LOGS command. |\n+---------------------------+------------------------------------------------+\n| QUERY CACHE | Removes all queries from the query cache. See |\n| | also FLUSH QUERY CACHE. |\n+---------------------------+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/reset/','','https://mariadb.com/kb/en/reset/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (408,26,'SHUTDOWN','Syntax\n------\n\nSHUTDOWN [WAIT FOR ALL { SLAVES | REPLICAS } ]\n\nDescription\n-----------\n\nThe SHUTDOWN command shuts the server down.\n\nWAIT FOR ALL SLAVES\n-------------------\n\nMariaDB starting with 10.4.4\n----------------------------\nThe WAIT FOR ALL SLAVES option was first added in MariaDB 10.4.4. WAIT FOR ALL\nREPLICAS has been a synonym since MariaDB 10.5.1.\n\nWhen a master server is shutdown and it goes through the normal shutdown\nprocess, the master kills client threads in random order. By default, the\nmaster also considers its binary log dump threads to be regular client\nthreads. As a consequence, the binary log dump threads can be killed while\nclient threads still exist, and this means that data can be written on the\nmaster during a normal shutdown that won\'t be replicated. This is true even if\nsemi-synchronous replication is being used.\n\nIn MariaDB 10.4 and later, this problem can be solved by shutting down the\nserver with the SHUTDOWN command and by providing the WAIT FOR ALL SLAVES\noption to the command. For example:\n\nSHUTDOWN WAIT FOR ALL SLAVES;\n\nWhen the WAIT FOR ALL SLAVES option is provided, the server only kills its\nbinary log dump threads after all client threads have been killed, and it only\ncompletes the shutdown after the last binary log has been sent to all\nconnected replicas.\n\nSee Replication Threads: Binary Log Dump Threads and the Shutdown Process for\nmore information.\n\nRequired Permissions\n--------------------\n\nOne must have a SHUTDOWN privilege (see GRANT) to use this command. It is the\nsame privilege one needs to use the mariadb-admin/mysqladmin shutdown command.\n\nShutdown for Upgrades\n---------------------\n\nIf you are doing a shutdown to migrate to another major version of MariaDB,\nplease ensure that the innodb_fast_shutdown variable is not 2 (fast crash\nshutdown). The default of this variable is 1.\n\nExample\n-------\n\nThe following example shows how to create an event which turns off the server\nat a certain time:\n\nCREATE EVENT `test`.`shutd`\n ON SCHEDULE\n EVERY 1 DAY\n STARTS \'2014-01-01 20:00:00\'\n COMMENT \'Shutdown Maria when the office is closed\'\nDO BEGIN\n SHUTDOWN;\nEND;\n\nOther Ways to Stop mysqld\n-------------------------\n\nYou can use the mariadb-admin/mysqladmin shutdown command to take down mysqld\ncleanly.\n\nYou can also use the system kill command on Unix with signal SIGTERM (15)\n\nkill -SIGTERM pid-of-mysqld-process\n\nYou can find the process number of the server process in the file that ends\nwith .pid in your data directory.\n\nThe above is identical to mysqladmin shutdown.\n\nOn windows you should use:\n\nNET STOP MySQL\n\nURL: https://mariadb.com/kb/en/shutdown/','','https://mariadb.com/kb/en/shutdown/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (409,26,'USE','Syntax\n------\n\nUSE db_name\n\nDescription\n-----------\n\nThe \'USE db_name\' statement tells MariaDB to use the db_name database as the\ndefault (current) database for subsequent statements. The database remains the\ndefault until the end of the session or another USE statement is issued:\n\nUSE db1;\nSELECT COUNT(*) FROM mytable; # selects from db1.mytable\nUSE db2;\nSELECT COUNT(*) FROM mytable; # selects from db2.mytable\n\nThe DATABASE() function (SCHEMA() is a synonym) returns the default database.\n\nAnother way to set the default database is specifying its name at mysql\ncommand line client startup.\n\nURL: https://mariadb.com/kb/en/use/','','https://mariadb.com/kb/en/use/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (410,26,'SHOW FUNCTION CODE','Syntax\n------\n\nSHOW FUNCTION CODE func_name\n\nDescription\n-----------\n\nSHOW FUNCTION CODE shows a representation of the internal implementation of\nthe stored function.\n\nIt is similar to SHOW PROCEDURE CODE but for stored functions.\n\nURL: https://mariadb.com/kb/en/show-function-code/','','https://mariadb.com/kb/en/show-function-code/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (411,26,'SHOW COLLATION','Syntax\n------\n\nSHOW COLLATION\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThe output from SHOW COLLATION includes all available collations. The LIKE\nclause, if present on its own, indicates which collation names to match. The\nWHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe same information can be queried from the Information Schema COLLATIONS\ntable.\n\nSee Setting Character Sets and Collations for details on specifying the\ncollation at the server, database, table and column levels.\n\nExamples\n--------\n\nSHOW COLLATION LIKE \'latin1%\';\n+-------------------+---------+----+---------+----------+---------+\n| Collation | Charset | Id | Default | Compiled | Sortlen |\n+-------------------+---------+----+---------+----------+---------+\n| latin1_german1_ci | latin1 | 5 | | Yes | 1 |\n| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |\n| latin1_danish_ci | latin1 | 15 | | Yes | 1 |\n| latin1_german2_ci | latin1 | 31 | | Yes | 2 |\n| latin1_bin | latin1 | 47 | | Yes | 1 |\n| latin1_general_ci | latin1 | 48 | | Yes | 1 |\n| latin1_general_cs | latin1 | 49 | | Yes | 1 |\n| latin1_spanish_ci | latin1 | 94 | | Yes | 1 |\n+-------------------+---------+----+---------+----------+---------+\n\nSHOW COLLATION WHERE Sortlen LIKE \'8\' AND Charset LIKE \'utf8\';\n+--------------------+---------+-----+---------+----------+---------+\n| Collation | Charset | Id | Default | Compiled | Sortlen |\n+--------------------+---------+-----+---------+----------+---------+\n| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |\n| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |\n| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |\n| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |\n| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |\n| utf8_polish_ci | utf8 | 197 | | Yes | 8 |\n| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |\n| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |\n| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |\n| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |\n| utf8_czech_ci | utf8 | 202 | | Yes | 8 |\n| utf8_danish_ci | utf8 | 203 | | Yes | 8 |\n| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |\n| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |\n| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |\n| utf8_roman_ci | utf8 | 207 | | Yes | 8 |\n| utf8_persian_ci | utf8 | 208 | | Yes | 8 |\n| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |\n| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |\n| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |\n| utf8_croatian_ci | utf8 | 213 | | Yes | 8 |\n+--------------------+---------+-----+---------+----------+---------+\n\nURL: https://mariadb.com/kb/en/show-collation/','','https://mariadb.com/kb/en/show-collation/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (412,27,'DELETE','Syntax\n------\n\nSingle-table syntax:\n\nDELETE [LOW_PRIORITY] [QUICK] [IGNORE] \n FROM tbl_name [PARTITION (partition_list)]\n [FOR PORTION OF period FROM expr1 TO expr2]\n [WHERE where_condition]\n [ORDER BY ...]\n [LIMIT row_count]\n [RETURNING select_expr\n [, select_expr ...]]\n\nMultiple-table syntax:\n\nDELETE [LOW_PRIORITY] [QUICK] [IGNORE]\n tbl_name[.*] [, tbl_name[.*]] ...\n FROM table_references\n [WHERE where_condition]\n\nOr:\n\nDELETE [LOW_PRIORITY] [QUICK] [IGNORE]\n FROM tbl_name[.*] [, tbl_name[.*]] ...\n USING table_references\n [WHERE where_condition]\n\nTrimming history:\n\nDELETE HISTORY\n FROM tbl_name [PARTITION (partition_list)]\n [BEFORE SYSTEM_TIME [TIMESTAMP|TRANSACTION] expression]\n\nDescription\n-----------\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| LOW_PRIORITY | Wait until all SELECT\'s are done before |\n| | starting the statement. Used with storage |\n| | engines that uses table locking (MyISAM, Aria |\n| | etc). See HIGH_PRIORITY and LOW_PRIORITY |\n| | clauses for details. |\n+---------------------------+------------------------------------------------+\n| QUICK | Signal the storage engine that it should |\n| | expect that a lot of rows are deleted. The |\n| | storage engine engine can do things to speed |\n| | up the DELETE like ignoring merging of data |\n| | blocks until all rows are deleted from the |\n| | block (instead of when a block is half full). |\n| | This speeds up things at the expanse of lost |\n| | space in data blocks. At least MyISAM and |\n| | Aria support this feature. |\n+---------------------------+------------------------------------------------+\n| IGNORE | Don\'t stop the query even if a not-critical |\n| | error occurs (like data overflow). See How |\n| | IGNORE works for a full description. |\n+---------------------------+------------------------------------------------+\n\nFor the single-table syntax, the DELETE statement deletes rows from tbl_name\nand returns a count of the number of deleted rows. This count can be obtained\nby calling the ROW_COUNT() function. The WHERE clause, if given, specifies the\nconditions that identify which rows to delete. With no WHERE clause, all rows\nare deleted. If the ORDER BY clause is specified, the rows are deleted in the\norder that is specified. The LIMIT clause places a limit on the number of rows\nthat can be deleted.\n\nFor the multiple-table syntax, DELETE deletes from each tbl_name the rows that\nsatisfy the conditions. In this case, ORDER BY and LIMIT> cannot be used. A\nDELETE can also reference tables which are located in different databases; see\nIdentifier Qualifiers for the syntax.\n\nwhere_condition is an expression that evaluates to true for each row to be\ndeleted. It is specified as described in SELECT.\n\nCurrently, you cannot delete from a table and select from the same table in a\nsubquery.\n\nYou need the DELETE privilege on a table to delete rows from it. You need only\nthe SELECT privilege for any columns that are only read, such as those named\nin the WHERE clause. See GRANT.\n\nAs stated, a DELETE statement with no WHERE clause deletes all rows. A faster\nway to do this, when you do not need to know the number of deleted rows, is to\nuse TRUNCATE TABLE. However, within a transaction or if you have a lock on the\ntable, TRUNCATE TABLE cannot be used whereas DELETE can. See TRUNCATE TABLE,\nand LOCK.\n\nPARTITION\n---------\n\nSee Partition Pruning and Selection for details.\n\nFOR PORTION OF\n--------------\n\nMariaDB starting with 10.4.3\n----------------------------\nSee Application Time Periods - Deletion by Portion.\n\nRETURNING\n---------\n\nIt is possible to return a resultset of the deleted rows for a single table to\nthe client by using the syntax DELETE ... RETURNING select_expr [,\nselect_expr2 ...]]\n\nAny of SQL expression that can be calculated from a single row fields is\nallowed. Subqueries are allowed. The AS keyword is allowed, so it is possible\nto use aliases.\n\nThe use of aggregate functions is not allowed. RETURNING cannot be used in\nmulti-table DELETEs.\n\nMariaDB starting with 10.3.1\n----------------------------\n\nSame Source and Target Table\n----------------------------\n\nUntil MariaDB 10.3.1, deleting from a table with the same source and target\nwas not possible. From MariaDB 10.3.1, this is now possible. For example:\n\nDELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE b.c2=0);\n\nMariaDB starting with 10.3.4\n----------------------------\n\nDELETE HISTORY\n--------------\n\nOne can use DELETE HISTORY to delete historical information from\nSystem-versioned tables.\n\nExamples\n--------\n\nHow to use the ORDER BY and LIMIT clauses:\n\nDELETE FROM page_hit ORDER BY timestamp LIMIT 1000000;\n\nHow to use the RETURNING clause:\n\nDELETE FROM t RETURNING f1;\n+------+\n| f1 |\n+------+\n| 5 |\n| 50 |\n| 500 |\n+------+\n\nThe following statement joins two tables: one is only used to satisfy a WHERE\ncondition, but no row is deleted from it; rows from the other table are\ndeleted, instead.\n\nDELETE post FROM blog INNER JOIN post WHERE blog.id = post.blog_id;\n\nDeleting from the Same Source and Target\n----------------------------------------\n\nCREATE TABLE t1 (c1 INT, c2 INT);\nDELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE b.c2=0);\n\nUntil MariaDB 10.3.1, this returned:\n\nERROR 1093 (HY000): Table \'t1\' is specified twice, both as a target for\n\'DELETE\' \n and as a separate source for\n\nFrom MariaDB 10.3.1:\n\nQuery OK, 0 rows affected (0.00 sec)\n\nURL: https://mariadb.com/kb/en/delete/','','https://mariadb.com/kb/en/delete/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (413,27,'REPLACE','Syntax\n------\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n[RETURNING select_expr \n [, select_expr ...]]\n\nOr:\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n[RETURNING select_expr \n [, select_expr ...]]\n\nOr:\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n[RETURNING select_expr \n [, select_expr ...]]\n\nDescription\n-----------\n\nREPLACE works exactly like INSERT, except that if an old row in the table has\nthe same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row\nis deleted before the new row is inserted. If the table has more than one\nUNIQUE keys, it is possible that the new row conflicts with more than one row.\nIn this case, all conflicting rows will be deleted.\n\nThe table name can be specified in the form db_name.tbl_name or, if a default\ndatabase is selected, in the form tbl_name (see Identifier Qualifiers). This\nallows to use REPLACE ... SELECT to copy rows between different databases.\n\nMariaDB starting with 10.5.0\n----------------------------\nThe RETURNING clause was introduced in MariaDB 10.5.0\n\nBasically it works like this:\n\nBEGIN;\nSELECT 1 FROM t1 WHERE key=# FOR UPDATE;\nIF found-row\n DELETE FROM t1 WHERE key=# ;\nENDIF\nINSERT INTO t1 VALUES (...);\nEND;\n\nThe above can be replaced with:\n\nREPLACE INTO t1 VALUES (...)\n\nREPLACE is a MariaDB/MySQL extension to the SQL standard. It either inserts,\nor deletes and inserts. For other MariaDB/MySQL extensions to standard SQL ---\nthat also handle duplicate values --- see IGNORE and INSERT ON DUPLICATE KEY\nUPDATE.\n\nNote that unless the table has a PRIMARY KEY or UNIQUE index, using a REPLACE\nstatement makes no sense. It becomes equivalent to INSERT, because there is no\nindex to be used to determine whether a new row duplicates another.\n\nValues for all columns are taken from the values sSee Partition Pruning and\nSelection for details.pecified in the REPLACE statement. Any missing columns\nare set to their default values, just as happens for INSERT. You cannot refer\nto values from the current row and use them in the new row. If you use an\nassignment such as \'SET col = col + 1\', the reference to the column name on\nthe right hand side is treated as DEFAULT(col), so the assignment is\nequivalent to \'SET col = DEFAULT(col) + 1\'.\n\nTo use REPLACE, you must have both the INSERT and DELETE privileges for the\ntable.\n\nThere are some gotchas you should be aware of, before using REPLACE:\n\n* If there is an AUTO_INCREMENT field, a new value will be generated.\n* If there are foreign keys, ON DELETE action will be activated by REPLACE.\n* Triggers on DELETE and INSERT will be activated by REPLACE.\n\nTo avoid some of these behaviors, you can use INSERT ... ON DUPLICATE KEY\nUPDATE.\n\nThis statement activates INSERT and DELETE triggers. See Trigger Overview for\ndetails.\n\nPARTITION\n---------\n\nSee Partition Pruning and Selection for details.\n\nREPLACE RETURNING\n-----------------\n\nREPLACE ... RETURNING returns a resultset of the replaced rows.\n\nThis returns the listed columns for all the rows that are replaced, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple REPLACE statement\n\nREPLACE INTO t2 VALUES (1,\'Leopard\'),(2,\'Dog\') RETURNING id2, id2+id2 \nas Total ,id2|id2, id2&&id2;\n+-----+-------+---------+----------+\n| id2 | Total | id2|id2 | id2&&id2 |\n+-----+-------+---------+----------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n+-----+-------+---------+----------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\nPREPARE stmt FROM \"REPLACE INTO t2 SET id2=3, animal2=\'Fox\' RETURNING f2(id2),\nUPPER(animal2)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f2(id2) | UPPER(animal2) |\n+---------+----------------+\n| 6 | FOX |\n+---------+----------------+\n\nSubqueries in the statement\n\nREPLACE INTO t1 SELECT * FROM t2 RETURNING (SELECT id2 FROM t2 WHERE \nid2 IN (SELECT id2 FROM t2 WHERE id2=1)) AS new_id;\n+--------+\n| new_id |\n+--------+\n| 1 |\n| 1 |\n| 1 |\n| 1 |\n+--------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used..\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used, or it can be used in REPLACE...SEL==\nDescription\n\nREPLACE ... RETURNING returns a resultset of the replaced rows.\n\nThis returns the listed columns for all the rows that are replaced, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple REPLACE statement\n\nREPLACE INTO t2 VALUES (1,\'Leopard\'),(2,\'Dog\') RETURNING id2, id2+id2 \nas Total ,id2|id2, id2&&id2;\n+-----+-------+---------+----------+\n| id2 | Total | id2|id2 | id2&&id2 |\n+-----+-------+---------+----------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n+-----+-------+---------+----------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\nPREPARE stmt FROM \"REPLACE INTO t2 SET id2=3, animal2=\'Fox\' RETURNING f2(id2),\nUPPER(animal2)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f2(id2) | UPPER(animal2) |\n+---------+----------------+\n| 6 | FOX |\n+---------+----------------+\n\nSubqueries in the statement\n\nREPLACE INTO t1 SELECT * FROM t2 RETURNING (SELECT id2 FROM t2 WHERE \nid2 IN (SELECT id2 FROM t2 WHERE id2=1)) AS new_id;\n+--------+\n| new_id |\n+--------+\n| 1 |\n| 1 |\n| 1 |\n| 1 |\n+--------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used..\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used, or it can be used in\nREPLACE...SELECT...RETURNING if the table in the RETURNING clause is not the\nsame as the REPLACE table. ECT...RETURNING if the table in the RETURNING\nclause is not the same as the REPLACE table.\n\nURL: https://mariadb.com/kb/en/replace/','','https://mariadb.com/kb/en/replace/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (414,27,'UPDATE','Syntax\n------\n\nSingle-table syntax:\n\nUPDATE [LOW_PRIORITY] [IGNORE] table_reference \n [PARTITION (partition_list)]\n [FOR PORTION OF period FROM expr1 TO expr2]\n SET col1={expr1|DEFAULT} [,col2={expr2|DEFAULT}] ...\n [WHERE where_condition]\n [ORDER BY ...]\n [LIMIT row_count]\n\nMultiple-table syntax:\n\nUPDATE [LOW_PRIORITY] [IGNORE] table_references\n SET col1={expr1|DEFAULT} [, col2={expr2|DEFAULT}] ...\n [WHERE where_condition]\n\nDescription\n-----------\n\nFor the single-table syntax, the UPDATE statement updates columns of existing\nrows in the named table with new values. The SET clause indicates which\ncolumns to modify and the values they should be given. Each value can be given\nas an expression, or the keyword DEFAULT to set a column explicitly to its\ndefault value. The WHERE clause, if given, specifies the conditions that\nidentify which rows to update. With no WHERE clause, all rows are updated. If\nthe ORDER BY clause is specified, the rows are updated in the order that is\nspecified. The LIMIT clause places a limit on the number of rows that can be\nupdated.\n\nUntil MariaDB 10.3.2, for the multiple-table syntax, UPDATE updates rows in\neach table named in table_references that satisfy the conditions. In this\ncase, ORDER BY and LIMIT cannot be used. This restriction was lifted in\nMariaDB 10.3.2 and both clauses can be used with multiple-table updates. An\nUPDATE can also reference tables which are located in different databases; see\nIdentifier Qualifiers for the syntax.\n\nwhere_condition is an expression that evaluates to true for each row to be\nupdated.\n\ntable_references and where_condition are as specified as described in SELECT.\n\nFor single-table updates, assignments are evaluated in left-to-right order,\nwhile for multi-table updates, there is no guarantee of a particular order. If\nthe SIMULTANEOUS_ASSIGNMENT sql_mode (available from MariaDB 10.3.5) is set,\nUPDATE statements evaluate all assignments simultaneously.\n\nYou need the UPDATE privilege only for columns referenced in an UPDATE that\nare actually updated. You need only the SELECT privilege for any columns that\nare read but not modified. See GRANT.\n\nThe UPDATE statement supports the following modifiers:\n\n* If you use the LOW_PRIORITY keyword, execution of\n the UPDATE is delayed until no other clients are reading from\n the table. This affects only storage engines that use only table-level\n locking (MyISAM, MEMORY, MERGE). See HIGH_PRIORITY and LOW_PRIORITY clauses\nfor details.\n* If you use the IGNORE keyword, the update statement does \n not abort even if errors occur during the update. Rows for which\n duplicate-key conflicts occur are not updated. Rows for which columns are\n updated to values that would cause data conversion errors are updated to the\n closest valid values instead.\n\nPARTITION\n---------\n\nSee Partition Pruning and Selection for details.\n\nFOR PORTION OF\n--------------\n\nMariaDB starting with 10.4.3\n----------------------------\nSee Application Time Periods - Updating by Portion.\n\nUPDATE Statements With the Same Source and Target\n-------------------------------------------------\n\nMariaDB starting with 10.3.2\n----------------------------\nFrom MariaDB 10.3.2, UPDATE statements may have the same source and target.\n\nFor example, given the following table:\n\nDROP TABLE t1;\nCREATE TABLE t1 (c1 INT, c2 INT);\nINSERT INTO t1 VALUES (10,10), (20,20);\n\nUntil MariaDB 10.3.1, the following UPDATE statement would not work:\n\nUPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);\nERROR 1093 (HY000): Table \'t1\' is specified twice, \n both as a target for \'UPDATE\' and as a separate source for data\n\nFrom MariaDB 10.3.2, the statement executes successfully:\n\nUPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);\n\nSELECT * FROM t1;\n+------+------+\n| c1 | c2 |\n+------+------+\n| 10 | 10 |\n| 21 | 20 |\n+------+------+\n\nExample\n-------\n\nSingle-table syntax:\n\nUPDATE table_name SET column1 = value1, column2 = value2 WHERE id=100;\n\nMultiple-table syntax:\n\nUPDATE tab1, tab2 SET tab1.column1 = value1, tab1.column2 = value2 WHERE\ntab1.id = tab2.id;\n\nURL: https://mariadb.com/kb/en/update/','','https://mariadb.com/kb/en/update/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (415,27,'IGNORE','The IGNORE option tells the server to ignore some common errors.\n\nIGNORE can be used with the following statements:\n\n* DELETE\n* INSERT (see also INSERT IGNORE)\n* LOAD DATA INFILE\n* UPDATE\n* ALTER TABLE\n* CREATE TABLE ... SELECT\n* INSERT ... SELECT\n\nThe logic used:\n\n* Variables out of ranges are replaced with the maximum/minimum value.\n\n* SQL_MODEs STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE,\nNO_ZERO_DATE are ignored.\n\n* Inserting NULL in a NOT NULL field will insert 0 ( in a numerical\n field), 0000-00-00 ( in a date field) or an empty string ( in a character\n field).\n\n* Rows that cause a duplicate key error or break a foreign key constraint are\n not inserted, updated, or deleted.\n\nThe following errors are ignored:\n\n+---------------------+---------------------------------+--------------------+\n| Error number | Symbolic error name | Description |\n+---------------------+---------------------------------+--------------------+\n| 1022 | ER_DUP_KEY | Can\'t write; |\n| | | duplicate key in |\n| | | table \'%s\' |\n+---------------------+---------------------------------+--------------------+\n| 1048 | ER_BAD_NULL_ERROR | Column \'%s\' |\n| | | cannot be null |\n+---------------------+---------------------------------+--------------------+\n| 1062 | ER_DUP_ENTRY | Duplicate entry |\n| | | \'%s\' for key %d |\n+---------------------+---------------------------------+--------------------+\n| 1242 | ER_SUBQUERY_NO_1_ROW | Subquery returns |\n| | | more than 1 row |\n+---------------------+---------------------------------+--------------------+\n| 1264 | ER_WARN_DATA_OUT_OF_RANGE | Out of range |\n| | | value for column |\n| | | \'%s\' at row %ld |\n+---------------------+---------------------------------+--------------------+\n| 1265 | WARN_DATA_TRUNCATED | Data truncated |\n| | | for column \'%s\' |\n| | | at row %ld |\n+---------------------+---------------------------------+--------------------+\n| 1292 | ER_TRUNCATED_WRONG_VALUE | Truncated |\n| | | incorrect %s |\n| | | value: \'%s\' |\n+---------------------+---------------------------------+--------------------+\n| 1366 | ER_TRUNCATED_WRONG_VALUE_FOR_FI | Incorrect integer |\n| | LD | value |\n+---------------------+---------------------------------+--------------------+\n| 1369 | ER_VIEW_CHECK_FAILED | CHECK OPTION |\n| | | failed \'%s.%s\' |\n+---------------------+---------------------------------+--------------------+\n| 1451 | ER_ROW_IS_REFERENCED_2 | Cannot delete or |\n| | | update a parent |\n| | | row |\n+---------------------+---------------------------------+--------------------+\n| 1452 | ER_NO_REFERENCED_ROW_2 | Cannot add or |\n| | | update a child |\n| | | row: a foreign |\n| | | key constraint |\n| | | fails (%s) |\n+---------------------+---------------------------------+--------------------+\n| 1526 | ER_NO_PARTITION_FOR_GIVEN_VALUE | Table has no |\n| | | partition for |\n| | | value %s |\n+---------------------+---------------------------------+--------------------+\n| 1586 | ER_DUP_ENTRY_WITH_KEY_NAME | Duplicate entry |\n| | | \'%s\' for key \'%s\' |\n+---------------------+---------------------------------+--------------------+\n| 1591 | ER_NO_PARTITION_FOR_GIVEN_VALUE | Table has no |\n| | SILENT | partition for |\n| | | some existing |\n| | | values |\n+---------------------+---------------------------------+--------------------+\n| 1748 | ER_ROW_DOES_NOT_MATCH_GIVEN_PAR | Found a row not |\n| | ITION_SET | matching the |\n| | | given partition |\n| | | set |\n+---------------------+---------------------------------+--------------------+\n\nIgnored errors normally generate a warning.\n\nA property of the IGNORE clause consists in causing transactional engines and\nnon-transactional engines (like XtraDB and Aria) to behave the same way. For\nexample, normally a multi-row insert which tries to violate a UNIQUE contraint\nis completely rolled back on XtraDB/InnoDB, but might be partially executed on\nAria. With the IGNORE clause, the statement will be partially executed in both\nengines.\n\nDuplicate key errors also generate warnings. The OLD_MODE server variable can\nbe used to prevent this.\n\nURL: https://mariadb.com/kb/en/ignore/','','https://mariadb.com/kb/en/ignore/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (416,27,'SELECT','Syntax\n------\n\nSELECT\n [ALL | DISTINCT | DISTINCTROW]\n [HIGH_PRIORITY]\n [STRAIGHT_JOIN]\n [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]\n [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]\n select_expr [, select_expr ...]\n [ FROM table_references\n [WHERE where_condition]\n [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]]\n [HAVING where_condition]\n [ORDER BY {col_name | expr | position} [ASC | DESC], ...]\n [LIMIT {[offset,] row_count | row_count OFFSET offset [ROWS EXAMINED\nrows_limit] } |\n [OFFSET start { ROW | ROWS }]\n [FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }]\n]\n procedure|[PROCEDURE procedure_name(argument_list)]\n [INTO OUTFILE \'file_name\' [CHARACTER SET charset_name] [export_options] |\n INTO DUMPFILE \'file_name\' | INTO var_name [, var_name] ]\n [FOR UPDATE lock_option | LOCK IN SHARE MODE lock_option]\nexport_options:\n [{FIELDS | COLUMNS}\n [TERMINATED BY \'string\']\n [[OPTIONALLY] ENCLOSED BY \'char\']\n [ESCAPED BY \'char\']\n ]\n [LINES\n [STARTING BY \'string\']\n [TERMINATED BY \'string\']\n ]\nlock_option:\n [WAIT n | NOWAIT | SKIP LOCKED]\n\nDescription\n-----------\n\nSELECT is used to retrieve rows selected from one or more tables, and can\ninclude UNION statements and subqueries.\n\n* Each select_expr expression indicates a column or data that you want to\nretrieve. You\nmust have at least one select expression. See Select Expressions below.\n\n* The FROM clause indicates the table or tables from which to retrieve rows.\nUse either a single table name or a JOIN expression. See JOIN\nfor details. If no table is involved, FROM DUAL can be specified.\n\n* Each table can also be specified as db_name.tabl_name. Each column can also\nbe specified as tbl_name.col_name or even db_name.tbl_name.col_name. This\nallows one to write queries which involve multiple databases. See Identifier\nQualifiers for syntax details.\n\n* The WHERE clause, if given, indicates the condition or\n conditions that rows must satisfy to be selected.\n where_condition is an expression that evaluates to true for\n each row to be selected. The statement selects all rows if there is no WHERE\n clause.\nIn the WHERE clause, you can use any of the functions and\n operators that MariaDB supports, except for aggregate (summary) functions.\nSee Functions and Operators and Functions and Modifiers for use with GROUP BY\n(aggregate).\n\n* Use the ORDER BY clause to order the results.\n\n* Use the LIMIT clause allows you to restrict the results to only\na certain number of rows, optionally with an offset.\n\n* Use the GROUP BY and HAVING clauses to group\nrows together when they have columns or computed values in common.\n\nSELECT can also be used to retrieve rows computed without reference to any\ntable.\n\nSelect Expressions\n------------------\n\nA SELECT statement must contain one or more select expressions, separated by\ncommas. Each select expression can be one of the following:\n\n* The name of a column.\n* Any expression using functions and operators.\n* * to select all columns from all tables in the FROM clause.\n* tbl_name.* to select all columns from just the table tbl_name.\n\nWhen specifying a column, you can either use just the column name or qualify\nthe column name with the name of the table using tbl_name.col_name. The\nqualified form is useful if you are joining multiple tables in the FROM\nclause. If you do not qualify the column names when selecting from multiple\ntables, MariaDB will try to find the column in each table. It is an error if\nthat column name exists in multiple tables.\n\nYou can quote column names using backticks. If you are qualifying column names\nwith table names, quote each part separately as `tbl_name`.`col_name`.\n\nIf you use any grouping functions in any of the select expressions, all rows\nin your results will be implicitly grouped, as if you had used GROUP BY NULL.\n\nDISTINCT\n--------\n\nA query may produce some identical rows. By default, all rows are retrieved,\neven when their values are the same. To explicitly specify that you want to\nretrieve identical rows, use the ALL option. If you want duplicates to be\nremoved from the resultset, use the DISTINCT option. DISTINCTROW is a synonym\nfor DISTINCT. See also COUNT DISTINCT and SELECT UNIQUE in Oracle mode.\n\nINTO\n----\n\nThe INTO clause is used to specify that the query results should be written to\na file or variable.\n\n* SELECT INTO OUTFILE - formatting and writing the result to an external file.\n* SELECT INTO DUMPFILE - binary-safe writing of the unformatted results to an\nexternal file.\n* SELECT INTO Variable - selecting and setting variables.\n\nThe reverse of SELECT INTO OUTFILE is LOAD DATA.\n\nLIMIT\n-----\n\nRestricts the number of returned rows. See LIMIT and LIMIT ROWS EXAMINED for\ndetails.\n\nLOCK IN SHARE MODE/FOR UPDATE\n-----------------------------\n\nSee LOCK IN SHARE MODE and FOR UPDATE for details on the respective locking\nclauses.\n\nOFFSET ... FETCH\n----------------\n\nMariaDB starting with 10.6\n--------------------------\nSee SELECT ... OFFSET ... FETCH.\n\nORDER BY\n--------\n\nOrder a resultset. See ORDER BY for details.\n\nPARTITION\n---------\n\nSpecifies to the optimizer which partitions are relevant for the query. Other\npartitions will not be read. See Partition Pruning and Selection for details.\n\nPROCEDURE\n---------\n\nPasses the whole result set to a C Procedure. See PROCEDURE and PROCEDURE\nANALYSE (the only built-in procedure not requiring the server to be\nrecompiled).\n\nSKIP LOCKED\n-----------\n\nMariaDB starting with 10.6\n--------------------------\nThe SKIP LOCKED clause was introduced in MariaDB 10.6.0.\n\nThis causes those rows that couldn\'t be locked (LOCK IN SHARE MODE or FOR\nUPDATE) to be excluded from the result set. An explicit NOWAIT is implied\nhere. This is only implemented on InnoDB tables and ignored otherwise.\n\nSQL_CALC_FOUND_ROWS\n-------------------\n\nWhen SQL_CALC_FOUND_ROWS is used, then MariaDB will calculate how many rows\nwould have been in the result, if there would be no LIMIT clause. The result\ncan be found by calling the function FOUND_ROWS() in your next sql statement.\n\nmax_statement_time clause\n-------------------------\n\nBy using max_statement_time in conjunction with SET STATEMENT, it is possible\nto limit the execution time of individual queries. For example:\n\nSET STATEMENT max_statement_time=100 FOR \n SELECT field1 FROM table_name ORDER BY field1;\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nExamples\n--------\n\nSELECT f1,f2 FROM t1 WHERE (f3<=10) AND (f4=\'y\');\n\nSee Getting Data from MariaDB (Beginner tutorial), or the various\nsub-articles, for more examples.\n\nURL: https://mariadb.com/kb/en/select/','','https://mariadb.com/kb/en/select/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (417,27,'JOIN Syntax','Description\n-----------\n\nMariaDB supports the following JOIN syntaxes for the table_references part of\nSELECT statements and multiple-table DELETE and UPDATE statements:\n\ntable_references:\n table_reference [, table_reference] ...\n\ntable_reference:\n table_factor\n | join_table\n\ntable_factor:\n tbl_name [PARTITION (partition_list)]\n [query_system_time_period_specification] [[AS] alias] [index_hint_list]\n | table_subquery [query_system_time_period_specification] [AS] alias\n | ( table_references )\n | { ON table_reference LEFT OUTER JOIN table_reference\n ON conditional_expr }\n\njoin_table:\n table_reference [INNER | CROSS] JOIN table_factor [join_condition]\n | table_reference STRAIGHT_JOIN table_factor\n | table_reference STRAIGHT_JOIN table_factor ON conditional_expr\n | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition\n | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor\n\njoin_condition:\n ON conditional_expr\n | USING (column_list)\n\nquery_system_time_period_specification:\n FOR SYSTEM_TIME AS OF point_in_time\n | FOR SYSTEM_TIME BETWEEN point_in_time AND point_in_time\n | FOR SYSTEM_TIME FROM point_in_time TO point_in_time\n | FOR SYSTEM_TIME ALL\n\npoint_in_time:\n [TIMESTAMP] expression\n | TRANSACTION expression\n\nindex_hint_list:\n index_hint [, index_hint] ...\n\nindex_hint:\n USE {INDEX|KEY}\n [{FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])\n | IGNORE {INDEX|KEY}\n [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)\n | FORCE {INDEX|KEY}\n [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)\n\nindex_list:\n index_name [, index_name] ...\n\nA table reference is also known as a join expression.\n\nEach table can also be specified as db_name.tabl_name. This allows to write\nqueries which involve multiple databases. See Identifier Qualifiers for syntax\ndetails.\n\nThe syntax of table_factor is extended in comparison with the SQL Standard.\nThe latter accepts only table_reference, not a list of them inside a pair of\nparentheses.\n\nThis is a conservative extension if we consider each comma in a list of\ntable_reference items as equivalent to an inner join. For example:\n\nSELECT * FROM t1 LEFT JOIN (t2, t3, t4)\n ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)\n\nis equivalent to:\n\nSELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)\n ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)\n\nIn MariaDB, CROSS JOIN is a syntactic equivalent to INNER JOIN (they can\nreplace each other). In standard SQL, they are not equivalent. INNER JOIN is\nused with an ON clause, CROSS JOIN is used otherwise.\n\nIn general, parentheses can be ignored in join expressions containing only\ninner join operations. MariaDB also supports nested joins (see\nhttp://dev.mysql.com/doc/refman/5.1/en/nested-join-optimization.html).\n\nSee System-versioned tables for more information about FOR SYSTEM_TIME syntax.\n\nIndex hints can be specified to affect how the MariaDB optimizer makes use of\nindexes. For more information, see How to force query plans.\n\nExamples\n--------\n\nSELECT left_tbl.*\n FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id\n WHERE right_tbl.id IS NULL;\n\nURL: https://mariadb.com/kb/en/join-syntax/','','https://mariadb.com/kb/en/join-syntax/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (418,27,'Scalar Subqueries','A scalar subquery is a subquery that returns a single value. This is the\nsimplest form of a subquery, and can be used in most places a literal or\nsingle column value is valid.\n\nThe data type, length and character set and collation are all taken from the\nresult returned by the subquery. The result of a subquery can always be NULL,\nthat is, no result returned. Even if the original value is defined as NOT\nNULL, this is disregarded.\n\nA subquery cannot be used where only a literal is expected, for example LOAD\nDATA INFILE expects a literal string containing the file name, and LIMIT\nrequires a literal integer.\n\nExamples\n--------\n\nCREATE TABLE sq1 (num TINYINT);\n\nCREATE TABLE sq2 (num TINYINT);\n\nINSERT INTO sq1 VALUES (1);\n\nINSERT INTO sq2 VALUES (10* (SELECT num FROM sq1));\n\nSELECT * FROM sq2;\n+------+\n| num |\n+------+\n| 10 |\n+------+\n\nInserting a second row means the subquery is no longer a scalar, and this\nparticular query is not valid:\n\nINSERT INTO sq1 VALUES (2);\n\nINSERT INTO sq2 VALUES (10* (SELECT num FROM sq1));\nERROR 1242 (21000): Subquery returns more than 1 row\n\nNo rows in the subquery, so the scalar is NULL:\n\nINSERT INTO sq2 VALUES (10* (SELECT num FROM sq3 WHERE num=\'3\'));\n\nSELECT * FROM sq2;\n+------+\n| num |\n+------+\n| 10 |\n| NULL |\n+------+\n\nA more traditional scalar subquery, as part of a WHERE clause:\n\nSELECT * FROM sq1 WHERE num = (SELECT MAX(num)/10 FROM sq2); \n+------+\n| num |\n+------+\n| 1 |\n+------+\n\nURL: https://mariadb.com/kb/en/subqueries-scalar-subqueries/','','https://mariadb.com/kb/en/subqueries-scalar-subqueries/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (419,27,'Row Subqueries','A row subquery is a subquery returning a single row, as opposed to a scalar\nsubquery, which returns a single column from a row, or a literal.\n\nExamples\n--------\n\nCREATE TABLE staff (name VARCHAR(10), age TINYINT);\n\nCREATE TABLE customer (name VARCHAR(10), age TINYINT);\n\nINSERT INTO staff VALUES (\'Bilhah\',37), (\'Valerius\',61), (\'Maia\',25);\n\nINSERT INTO customer VALUES (\'Thanasis\',48), (\'Valerius\',61), (\'Brion\',51);\n\nSELECT * FROM staff WHERE (name,age) = (SELECT name,age FROM customer WHERE\nname=\'Valerius\');\n+----------+------+\n| name | age |\n+----------+------+\n| Valerius | 61 |\n+----------+------+\n\nFinding all rows in one table also in another:\n\nSELECT name,age FROM staff WHERE (name,age) IN (SELECT name,age FROM customer);\n+----------+------+\n| name | age |\n+----------+------+\n| Valerius | 61 |\n+----------+------+\n\nURL: https://mariadb.com/kb/en/subqueries-row-subqueries/','','https://mariadb.com/kb/en/subqueries-row-subqueries/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (420,27,'Subqueries and ALL','Subqueries using the ALL keyword will return true if the comparison returns\ntrue for each row returned by the subquery, or the subquery returns no rows.\n\nSyntax\n------\n\nscalar_expression comparison_operator ALL <Table subquery>\n\n* scalar_expression may be any expression that evaluates to a single\nvalue\n* comparison_operator may be any one of: =, >, <, >=, <=, <> or !=\n\nALL returns:\n\n* NULL if the comparison operator returns NULL for at least one row returned\nby the Table subquery or scalar_expression returns NULL.\n* FALSE if the comparison operator returns FALSE for at least one row returned\nby the Table subquery.\n* TRUE if the comparison operator returns TRUE for all rows returned by the\nTable subquery, or if Table subquery returns no rows.\n\nNOT IN is an alias for <> ALL.\n\nExamples\n--------\n\nCREATE TABLE sq1 (num TINYINT);\n\nCREATE TABLE sq2 (num2 TINYINT);\n\nINSERT INTO sq1 VALUES(100);\n\nINSERT INTO sq2 VALUES(40),(50),(60);\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nSince 100 > all of 40,50 and 60, the evaluation is true and the row is returned\n\nAdding a second row to sq1, where the evaluation for that record is false:\n\nINSERT INTO sq1 VALUES(30);\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nAdding a new row to sq2, causing all evaluations to be false:\n\nINSERT INTO sq2 VALUES(120);\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);\nEmpty set (0.00 sec)\n\nWhen the subquery returns no results, the evaluation is still true:\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2 WHERE num2 > 300);\n+------+\n| num |\n+------+\n| 100 |\n| 30 |\n+------+\n\nEvaluating against a NULL will cause the result to be unknown, or not true,\nand therefore return no rows:\n\nINSERT INTO sq2 VALUES (NULL);\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);\n\nURL: https://mariadb.com/kb/en/subqueries-and-all/','','https://mariadb.com/kb/en/subqueries-and-all/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (421,27,'Subqueries and ANY','Subqueries using the ANY keyword will return true if the comparison returns\ntrue for at least one row returned by the subquery.\n\nSyntax\n------\n\nThe required syntax for an ANY or SOME quantified comparison is:\n\nscalar_expression comparison_operator ANY <Table subquery>\n\nOr:\n\nscalar_expression comparison_operator SOME <Table subquery>\n\n* scalar_expression may be any expression that evaluates to a\nsingle value.\n* comparison_operator may be any one of =, >, <, >=, <=, <> or !=.\n\nANY returns:\n\n* TRUE if the comparison operator returns TRUE for at least one row returned\nby the Table subquery.\n* FALSE if the comparison operator returns FALSE for all rows returned by the\nTable subquery, or Table subquery has zero rows.\n* NULL if the comparison operator returns NULL for at least one row returned\nby the Table subquery and doesn\'t returns TRUE for any of them, or if\nscalar_expression returns NULL.\n\nSOME is a synmonym for ANY, and IN is a synonym for = ANY\n\nExamples\n--------\n\nCREATE TABLE sq1 (num TINYINT);\n\nCREATE TABLE sq2 (num2 TINYINT);\n\nINSERT INTO sq1 VALUES(100);\n\nINSERT INTO sq2 VALUES(40),(50),(120);\n\nSELECT * FROM sq1 WHERE num > ANY (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\n100 is greater than two of the three values, and so the expression evaluates\nas true.\n\nSOME is a synonym for ANY:\n\nSELECT * FROM sq1 WHERE num < SOME (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nIN is a synonym for = ANY, and here there are no matches, so no results are\nreturned:\n\nSELECT * FROM sq1 WHERE num IN (SELECT * FROM sq2);\nEmpty set (0.00 sec)\n\nINSERT INTO sq2 VALUES(100);\nQuery OK, 1 row affected (0.05 sec)\n\nSELECT * FROM sq1 WHERE num <> ANY (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nReading this query, the results may be counter-intuitive. It may seem to read\nas \"SELECT * FROM sq1 WHERE num does not match any results in sq2. Since it\ndoes match 100, it could seem that the results are incorrect. However, the\nquery returns a result if the match does not match any of sq2. Since 100\nalready does not match 40, the expression evaluates to true immediately,\nregardless of the 100\'s matching. It may be more easily readable to use SOME\nin a case such as this:\n\nSELECT * FROM sq1 WHERE num <> SOME (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nURL: https://mariadb.com/kb/en/subqueries-and-any/','','https://mariadb.com/kb/en/subqueries-and-any/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (422,27,'Subqueries and EXISTS','Syntax\n------\n\nSELECT ... WHERE EXISTS <Table subquery>\n\nDescription\n-----------\n\nSubqueries using the EXISTS keyword will return true if the subquery returns\nany rows. Conversely, subqueries using NOT EXISTS will return true only if the\nsubquery returns no rows from the table.\n\nEXISTS subqueries ignore the columns specified by the SELECT of the subquery,\nsince they\'re not relevant. For example,\n\nSELECT col1 FROM t1 WHERE EXISTS (SELECT * FROM t2);\n\nand\n\nSELECT col1 FROM t1 WHERE EXISTS (SELECT col2 FROM t2);\n\nproduce identical results.\n\nExamples\n--------\n\nCREATE TABLE sq1 (num TINYINT);\n\nCREATE TABLE sq2 (num2 TINYINT);\n\nINSERT INTO sq1 VALUES(100);\n\nINSERT INTO sq2 VALUES(40),(50),(60);\n\nSELECT * FROM sq1 WHERE EXISTS (SELECT * FROM sq2 WHERE num2>50);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nSELECT * FROM sq1 WHERE NOT EXISTS (SELECT * FROM sq2 GROUP BY num2 HAVING\nMIN(num2)=40);\nEmpty set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/subqueries-and-exists/','','https://mariadb.com/kb/en/subqueries-and-exists/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (423,27,'Subqueries in a FROM Clause','Although subqueries are more commonly placed in a WHERE clause, they can also\nform part of the FROM clause. Such subqueries are commonly called derived\ntables.\n\nIf a subquery is used in this way, you must also use an AS clause to name the\nresult of the subquery.\n\nORACLE mode\n-----------\n\nMariaDB starting with 10.6.0\n----------------------------\nFrom MariaDB 10.6.0, anonymous subqueries in a FROM clause (no AS clause) are\npermitted in ORACLE mode.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nAssume that, given the data above, you want to return the average total for\nall students. In other words, the average of Chun\'s 148 (75+73), Esben\'s 74\n(43+31), etc.\n\nYou cannot do the following:\n\nSELECT AVG(SUM(score)) FROM student GROUP BY name;\nERROR 1111 (HY000): Invalid use of group function\n\nA subquery in the FROM clause is however permitted:\n\nSELECT AVG(sq_sum) FROM (SELECT SUM(score) AS sq_sum FROM student GROUP BY\nname) AS t;\n+-------------+\n| AVG(sq_sum) |\n+-------------+\n| 134.0000 |\n+-------------+\n\nFrom MariaDB 10.6 in ORACLE mode, the following is permitted:\n\nSELECT * FROM (SELECT 1 FROM DUAL), (SELECT 2 FROM DUAL);\n\nURL: https://mariadb.com/kb/en/subqueries-in-a-from-clause/','','https://mariadb.com/kb/en/subqueries-in-a-from-clause/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (424,27,'Subqueries and JOINs','A subquery can quite often, but not in all cases, be rewritten as a JOIN.\n\nRewriting Subqueries as JOINS\n-----------------------------\n\nA subquery using IN can be rewritten with the DISTINCT keyword, for example:\n\nSELECT * FROM table1 WHERE col1 IN (SELECT col1 FROM table2);\n\ncan be rewritten as:\n\nSELECT DISTINCT table1.* FROM table1, table2 WHERE table1.col1=table2.col1;\n\nNOT IN or NOT EXISTS queries can also be rewritten. For example, these two\nqueries returns the same result:\n\nSELECT * FROM table1 WHERE col1 NOT IN (SELECT col1 FROM table2);\nSELECT * FROM table1 WHERE NOT EXISTS (SELECT col1 FROM table2 WHERE\ntable1.col1=table2.col1);\n\nand both can be rewritten as:\n\nSELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE\ntable2.id IS NULL;\n\nSubqueries that can be rewritten as a LEFT JOIN are sometimes more efficient.\n\nUsing Subqueries instead of JOINS\n---------------------------------\n\nThere are some scenarios, though, which call for subqueries rather than joins:\n\n* When you want duplicates, but not false duplicates. Suppose Table_1\n has three rows — {1,1,2}\n — and Table_2 has two rows\n — {1,2,2}. If you need to list the rows\n in Table_1 which are also in Table_2, only this\n subquery-based SELECT statement will give the right answer\n (1,1,2):\n\nSELECT Table_1.column_1 \nFROM Table_1 \nWHERE Table_1.column_1 IN \n (SELECT Table_2.column_1\n FROM Table_2);\n\n* This SQL statement won\'t work:\n\nSELECT Table_1.column_1 \nFROM Table_1,Table_2 \nWHERE Table_1.column_1 = Table_2.column_1;\n\n* because the result will be {1,1,2,2}\n — and the duplication of 2 is an error. This SQL\n statement won\'t work either:\n\nSELECT DISTINCT Table_1.column_1 \nFROM Table_1,Table_2 \nWHERE Table_1.column_1 = Table_2.column_1;\n\n* because the result will be {1,2} — and\n the removal of the duplicated 1 is an error too.\n\n* When the outermost statement is not a query. The SQL statement:\n\nUPDATE Table_1 SET column_1 = (SELECT column_1 FROM Table_2);\n\n* can\'t be expressed using a join unless some rare SQL3 features are used.\n\n* When the join is over an expression. The SQL statement:\n\nSELECT * FROM Table_1 \nWHERE column_1 + 5 =\n (SELECT MAX(column_1) FROM Table_2);\n\n* is hard to express with a join. In fact, the only way we can think of is\n this SQL statement:\n\nSELECT Table_1.*\nFROM Table_1, \n (SELECT MAX(column_1) AS max_column_1 FROM Table_2) AS Table_2\nWHERE Table_1.column_1 + 5 = Table_2.max_column_1;\n\n* which still involves a parenthesized query, so nothing is gained from the\n transformation.\n\n* When you want to see the exception. For example, suppose the question is:\n what books are longer than Das Kapital? These two queries are effectively\n almost the same:\n\nSELECT DISTINCT Bookcolumn_1.* \nFROM Books AS Bookcolumn_1 JOIN Books AS Bookcolumn_2 USING(page_count) \nWHERE title = \'Das Kapital\';\n\nSELECT DISTINCT Bookcolumn_1.* \nFROM Books AS Bookcolumn_1 \nWHERE Bookcolumn_1.page_count > \n (SELECT DISTINCT page_count\n FROM Books AS Bookcolumn_2\n WHERE title = \'Das Kapital\');\n\n* The difference is between these two SQL statements is, if there are two\n editions of Das Kapital (with different page counts), then the self-join\n example will return the books which are longer than the shortest edition\n of Das Kapital. That might be the wrong answer, since the original\n question didn\'t ask for \"... longer than ANY book named Das Kapital\"\n (it seems to contain a false assumption that there\'s only one edition).\n\nURL: https://mariadb.com/kb/en/subqueries-and-joins/','','https://mariadb.com/kb/en/subqueries-and-joins/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (425,27,'Subquery Limitations','There are a number of limitations regarding subqueries, which are discussed\nbelow. The following tables and data will be used in the examples that follow:\n\nCREATE TABLE staff(name VARCHAR(10),age TINYINT);\n\nCREATE TABLE customer(name VARCHAR(10),age TINYINT);\n\nINSERT INTO staff VALUES \n(\'Bilhah\',37), (\'Valerius\',61), (\'Maia\',25);\n\nINSERT INTO customer VALUES \n(\'Thanasis\',48), (\'Valerius\',61), (\'Brion\',51);\n\nORDER BY and LIMIT\n------------------\n\nTo use ORDER BY or limit LIMIT in subqueries both must be used.. For example:\n\nSELECT * FROM staff WHERE name IN (SELECT name FROM customer ORDER BY name);\n+----------+------+\n| name | age |\n+----------+------+\n| Valerius | 61 |\n+----------+------+\n\nis valid, but\n\nSELECT * FROM staff WHERE name IN (SELECT NAME FROM customer ORDER BY name\nLIMIT 1);\nERROR 1235 (42000): This version of MariaDB doesn\'t \n yet support \'LIMIT & IN/ALL/ANY/SOME subquery\'\n\nis not.\n\nModifying and Selecting from the Same Table\n-------------------------------------------\n\nIt\'s not possible to both modify and select from the same table in a subquery.\nFor example:\n\nDELETE FROM staff WHERE name = (SELECT name FROM staff WHERE age=61);\nERROR 1093 (HY000): Table \'staff\' is specified twice, both \n as a target for \'DELETE\' and as a separate source for data\n\nRow Comparison Operations\n-------------------------\n\nThere is only partial support for row comparison operations. The expression in\n\nexpr op {ALL|ANY|SOME} subquery,\n\nmust be scalar and the subquery can only return a single column.\n\nHowever, because of the way IN is implemented (it is rewritten as a sequence\nof = comparisons and AND), the expression in\n\nexpression [NOT] IN subquery\n\nis permitted to be an n-tuple and the subquery can return rows of n-tuples.\n\nFor example:\n\nSELECT * FROM staff WHERE (name,age) NOT IN (\n SELECT name,age FROM customer WHERE age >=51]\n);\n+--------+------+\n| name | age |\n+--------+------+\n| Bilhah | 37 |\n| Maia | 25 |\n+--------+------+\n\nis permitted, but\n\nSELECT * FROM staff WHERE (name,age) = ALL (\n SELECT name,age FROM customer WHERE age >=51\n);\nERROR 1241 (21000): Operand should contain 1 column(s)\n\nis not.\n\nCorrelated Subqueries\n---------------------\n\nSubqueries in the FROM clause cannot be correlated subqueries. They cannot be\nevaluated for each row of the outer query since they are evaluated to produce\na result set during when the query is executed.\n\nStored Functions\n----------------\n\nA subquery can refer to a stored function which modifies data. This is an\nextension to the SQL standard, but can result in indeterminate outcomes. For\nexample, take:\n\nSELECT ... WHERE x IN (SELECT f() ...);\n\nwhere f() inserts rows. The function f() could be executed a different number\nof times depending on how the optimizer chooses to handle the query.\n\nThis sort of construct is therefore not safe to use in replication that is not\nrow-based, as there could be different results on the master and the slave.\n\nURL: https://mariadb.com/kb/en/subquery-limitations/','','https://mariadb.com/kb/en/subquery-limitations/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (426,27,'UNION','UNION is used to combine the results from multiple SELECT statements into a\nsingle result set.\n\nSyntax\n------\n\nSELECT ...\nUNION [ALL | DISTINCT] SELECT ...\n[UNION [ALL | DISTINCT] SELECT ...]\n[ORDER BY [column [, column ...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}]\n\nDescription\n-----------\n\nUNION is used to combine the results from multiple SELECT statements into a\nsingle result set.\n\nThe column names from the first SELECT statement are used as the column names\nfor the results returned. Selected columns listed in corresponding positions\nof each SELECT statement should have the same data type. (For example, the\nfirst column selected by the first statement should have the same type as the\nfirst column selected by the other statements.)\n\nIf they don\'t, the type and length of the columns in the result take into\naccount the values returned by all of the SELECTs, so there is no need for\nexplicit casting. Note that currently this is not the case for recursive CTEs\n- see MDEV-12325.\n\nTable names can be specified as db_name.tbl_name. This permits writing UNIONs\nwhich involve multiple databases. See Identifier Qualifiers for syntax details.\n\nUNION queries cannot be used with aggregate functions.\n\nEXCEPT and UNION have the same operation precedence and INTERSECT has a higher\nprecedence, unless running in Oracle mode, in which case all three have the\nsame precedence.\n\nALL/DISTINCT\n------------\n\nThe ALL keyword causes duplicate rows to be preserved. The DISTINCT keyword\n(the default if the keyword is omitted) causes duplicate rows to be removed by\nthe results.\n\nUNION ALL and UNION DISTINCT can both be present in a query. In this case,\nUNION DISTINCT will override any UNION ALLs to its left.\n\nMariaDB starting with 10.1.1\n----------------------------\nUntil MariaDB 10.1.1, all UNION ALL statements required the server to create a\ntemporary table. Since MariaDB 10.1.1, the server can in most cases execute\nUNION ALL without creating a temporary table, improving performance (see\nMDEV-334).\n\nORDER BY and LIMIT\n------------------\n\nIndividual SELECTs can contain their own ORDER BY and LIMIT clauses. In this\ncase, the individual queries need to be wrapped between parentheses. However,\nthis does not affect the order of the UNION, so they only are useful to limit\nthe record read by one SELECT.\n\nThe UNION can have global ORDER BY and LIMIT clauses, which affect the whole\nresultset. If the columns retrieved by individual SELECT statements have an\nalias (AS), the ORDER BY must use that alias, not the real column names.\n\nHIGH_PRIORITY\n-------------\n\nSpecifying a query as HIGH_PRIORITY will not work inside a UNION. If applied\nto the first SELECT, it will be ignored. Applying to a later SELECT results in\na syntax error:\n\nERROR 1234 (42000): Incorrect usage/placement of \'HIGH_PRIORITY\'\n\nSELECT ... INTO ...\n-------------------\n\nIndividual SELECTs cannot be written INTO DUMPFILE or INTO OUTFILE. If the\nlast SELECT statement specifies INTO DUMPFILE or INTO OUTFILE, the entire\nresult of the UNION will be written. Placing the clause after any other SELECT\nwill result in a syntax error.\n\nIf the result is a single row, SELECT ... INTO @var_name can also be used.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nParentheses\n-----------\n\nFrom MariaDB 10.4.0, parentheses can be used to specify precedence. Before\nthis, a syntax error would be returned.\n\nExamples\n--------\n\nUNION between tables having different column names:\n\n(SELECT e_name AS name, email FROM employees)\nUNION\n(SELECT c_name AS name, email FROM customers);\n\nSpecifying the UNION\'s global order and limiting total rows:\n\n(SELECT name, email FROM employees)\nUNION\n(SELECT name, email FROM customers)\nORDER BY name LIMIT 10;\n\nAdding a constant row:\n\n(SELECT \'John Doe\' AS name, \'john.doe@example.net\' AS email)\nUNION\n(SELECT name, email FROM customers);\n\nDiffering types:\n\nSELECT CAST(\'x\' AS CHAR(1)) UNION SELECT REPEAT(\'y\',4);\n+----------------------+\n| CAST(\'x\' AS CHAR(1)) |\n+----------------------+\n| x |\n| yyyy |\n+----------------------+\n\nReturning the results in order of each individual SELECT by use of a sort\ncolumn:\n\n(SELECT 1 AS sort_column, e_name AS name, email FROM employees)\nUNION\n(SELECT 2, c_name AS name, email FROM customers) ORDER BY sort_column;\n\nDifference between UNION, EXCEPT and INTERSECT. INTERSECT ALL and EXCEPT ALL\nare available from MariaDB 10.5.0.\n\nCREATE TABLE seqs (i INT);\nINSERT INTO seqs VALUES (1),(2),(2),(3),(3),(4),(5),(6);\n\nSELECT i FROM seqs WHERE i <= 3 UNION SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 UNION ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n| 3 |\n| 3 |\n| 3 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n| 3 |\n+------+\n\nParentheses for specifying precedence, from MariaDB 10.4.0\n\nCREATE OR REPLACE TABLE t1 (a INT);\nCREATE OR REPLACE TABLE t2 (b INT);\nCREATE OR REPLACE TABLE t3 (c INT);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4);\nINSERT INTO t2 VALUES (5),(6);\nINSERT INTO t3 VALUES (1),(6);\n\n((SELECT a FROM t1) UNION (SELECT b FROM t2)) INTERSECT (SELECT c FROM t3);\n+------+\n| a |\n+------+\n| 1 |\n| 6 |\n+------+\n\n(SELECT a FROM t1) UNION ((SELECT b FROM t2) INTERSECT (SELECT c FROM t3));\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 6 |\n+------+\n\nURL: https://mariadb.com/kb/en/union/','','https://mariadb.com/kb/en/union/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (427,27,'EXCEPT','MariaDB starting with 10.3.0\n----------------------------\nEXCEPT was introduced in MariaDB 10.3.0.\n\nThe result of EXCEPT is all records of the left SELECT result set except\nrecords which are in right SELECT result set, i.e. it is subtraction of two\nresult sets. From MariaDB 10.6.1, MINUS is a synonym.\n\nSyntax\n------\n\nSELECT ...\n(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL |\nDISTINCT]) SELECT ...\n[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL |\nDISTINCT]) SELECT ...]\n[ORDER BY [{col_name | expr | position} [ASC | DESC] [, {col_name | expr |\nposition} [ASC | DESC] ...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}\n| OFFSET start { ROW | ROWS }\n| FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]\n\nPlease note:\n\n* Brackets for explicit operation precedence are not supported; use a subquery\nin the FROM clause as a workaround).\n\nDescription\n-----------\n\nMariaDB has supported EXCEPT and INTERSECT in addition to UNION since MariaDB\n10.3.\n\nThe queries before and after EXCEPT must be SELECT or VALUES statements.\n\nAll behavior for naming columns, ORDER BY and LIMIT is the same as for UNION.\nNote that the alternative SELECT ... OFFSET ... FETCH syntax is only\nsupported. This allows us to use the WITH TIES clause.\n\nEXCEPT implicitly supposes a DISTINCT operation.\n\nThe result of EXCEPT is all records of the left SELECT result except records\nwhich are in right SELECT result set, i.e. it is subtraction of two result\nsets.\n\nEXCEPT and UNION have the same operation precedence and INTERSECT has a higher\nprecedence, unless running in Oracle mode, in which case all three have the\nsame precedence.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nParentheses\n-----------\n\nFrom MariaDB 10.4.0, parentheses can be used to specify precedence. Before\nthis, a syntax error would be returned.\n\nMariaDB starting with 10.5.0\n----------------------------\n\nALL/DISTINCT\n------------\n\nEXCEPT ALL and EXCEPT DISTINCT were introduced in MariaDB 10.5.0. The ALL\noperator leaves duplicates intact, while the DISTINCT operator removes\nduplicates. DISTINCT is the default behavior if neither operator is supplied,\nand the only behavior prior to MariaDB 10.5.\n\nExamples\n--------\n\nShow customers which are not employees:\n\n(SELECT e_name AS name, email FROM customers)\nEXCEPT\n(SELECT c_name AS name, email FROM employees);\n\nDifference between UNION, EXCEPT and INTERSECT. INTERSECT ALL and EXCEPT ALL\nare available from MariaDB 10.5.0.\n\nCREATE TABLE seqs (i INT);\nINSERT INTO seqs VALUES (1),(2),(2),(3),(3),(4),(5),(6);\n\nSELECT i FROM seqs WHERE i <= 3 UNION SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 UNION ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n| 3 |\n| 3 |\n| 3 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n| 3 |\n+------+\n\nParentheses for specifying precedence, from MariaDB 10.4.0\n\nCREATE OR REPLACE TABLE t1 (a INT);\nCREATE OR REPLACE TABLE t2 (b INT);\nCREATE OR REPLACE TABLE t3 (c INT);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4);\nINSERT INTO t2 VALUES (5),(6);\nINSERT INTO t3 VALUES (1),(6);\n\n((SELECT a FROM t1) UNION (SELECT b FROM t2)) EXCEPT (SELECT c FROM t3);\n+------+\n| a |\n+------+\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n+------+\n\n(SELECT a FROM t1) UNION ((SELECT b FROM t2) EXCEPT (SELECT c FROM t3));\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n+------+\n\nHere is an example that makes use of the SEQUENCE storage engine and the\nVALUES statement, to generate a numeric sequence and remove some arbitrary\nnumbers from it:\n\n(SELECT seq FROM seq_1_to_10) EXCEPT VALUES (2), (3), (4);\n+-----+\n| seq |\n+-----+\n| 1 |\n| 5 |\n| 6 |\n| 7 |\n| 8 |\n| 9 |\n| 10 |\n+-----+\n\nURL: https://mariadb.com/kb/en/except/','','https://mariadb.com/kb/en/except/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (428,27,'INTERSECT','MariaDB starting with 10.3.0\n----------------------------\nINTERSECT was introduced in MariaDB 10.3.0.\n\nThe result of an intersect is the intersection of right and left SELECT\nresults, i.e. only records that are present in both result sets will be\nincluded in the result of the operation.\n\nSyntax\n------\n\nSELECT ...\n(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL |\nDISTINCT]) SELECT ...\n[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL |\nDISTINCT]) SELECT ...]\n[ORDER BY [column [, column ...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}]\n\nDescription\n-----------\n\nMariaDB has supported INTERSECT (as well as EXCEPT) in addition to UNION since\nMariaDB 10.3.\n\nAll behavior for naming columns, ORDER BY and LIMIT is the same as for UNION.\n\nINTERSECT implicitly supposes a DISTINCT operation.\n\nThe result of an intersect is the intersection of right and left SELECT\nresults, i.e. only records that are present in both result sets will be\nincluded in the result of the operation.\n\nINTERSECT has higher precedence than UNION and EXCEPT (unless running running\nin Oracle mode, in which case all three have the same precedence). If possible\nit will be executed linearly but if not it will be translated to a subquery in\nthe FROM clause:\n\n(select a,b from t1)\nunion\n(select c,d from t2)\nintersect\n(select e,f from t3)\nunion\n(select 4,4);\n\nwill be translated to:\n\n(select a,b from t1)\nunion\nselect c,d from\n ((select c,d from t2)\n intersect\n (select e,f from t3)) dummy_subselect\nunion\n(select 4,4)\n\nMariaDB starting with 10.4.0\n----------------------------\n\nParentheses\n-----------\n\nFrom MariaDB 10.4.0, parentheses can be used to specify precedence. Before\nthis, a syntax error would be returned.\n\nMariaDB starting with 10.5.0\n----------------------------\n\nALL/DISTINCT\n------------\n\nINTERSECT ALL and INTERSECT DISTINCT were introduced in MariaDB 10.5.0. The\nALL operator leaves duplicates intact, while the DISTINCT operator removes\nduplicates. DISTINCT is the default behavior if neither operator is supplied,\nand the only behavior prior to MariaDB 10.5.\n\nExamples\n--------\n\nShow customers which are employees:\n\n(SELECT e_name AS name, email FROM employees)\nINTERSECT\n(SELECT c_name AS name, email FROM customers);\n\nDifference between UNION, EXCEPT and INTERSECT. INTERSECT ALL and EXCEPT ALL\nare available from MariaDB 10.5.0.\n\nCREATE TABLE seqs (i INT);\nINSERT INTO seqs VALUES (1),(2),(2),(3),(3),(4),(5),(6);\n\nSELECT i FROM seqs WHERE i <= 3 UNION SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 UNION ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n| 3 |\n| 3 |\n| 3 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n| 3 |\n+------+\n\nParentheses for specifying precedence, from MariaDB 10.4.0\n\nCREATE OR REPLACE TABLE t1 (a INT);\nCREATE OR REPLACE TABLE t2 (b INT);\nCREATE OR REPLACE TABLE t3 (c INT);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4);\nINSERT INTO t2 VALUES (5),(6);\nINSERT INTO t3 VALUES (1),(6);\n\n((SELECT a FROM t1) UNION (SELECT b FROM t2)) INTERSECT (SELECT c FROM t3);\n+------+\n| a |\n+------+\n| 1 |\n| 6 |\n+------+\n\n(SELECT a FROM t1) UNION ((SELECT b FROM t2) INTERSECT (SELECT c FROM t3));\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 6 |\n+------+\n\nURL: https://mariadb.com/kb/en/intersect/','','https://mariadb.com/kb/en/intersect/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (429,27,'Precedence Control in Table Operations','MariaDB starting with 10.4.0\n----------------------------\nBeginning in MariaDB 10.4, you can control the ordering of execution on table\noperations using parentheses.\n\nSyntax\n------\n\n( expression )\n[ORDER BY [column[, column...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}]\n\nDescription\n-----------\n\nUsing parentheses in your SQL allows you to control the order of execution for\nSELECT statements and Table Value Constructor, including UNION, EXCEPT, and\nINTERSECT operations. MariaDB executes the parenthetical expression before the\nrest of the statement. You can then use ORDER BY and LIMIT clauses the further\norganize the result-set.\n\nNote: In practice, the Optimizer may rearrange the exact order in which\nMariaDB executes different parts of the statement. When it calculates the\nresult-set, however, it returns values as though the parenthetical expression\nwere executed first.\n\nExample\n-------\n\nCREATE TABLE test.t1 (num INT);\n\nINSERT INTO test.t1 VALUES (1),(2),(3);\n\n(SELECT * FROM test.t1 \n UNION \n VALUES (10)) \nINTERSECT \nVALUES (1),(3),(10),(11);\n+------+\n| num |\n+------+\n| 1 |\n| 3 |\n| 10 |\n+------+\n\n((SELECT * FROM test.t1 \n UNION\n VALUES (10))\n INTERSECT \n VALUES (1),(3),(10),(11)) \nORDER BY 1 DESC;\n+------+\n| num |\n+------+\n| 10 |\n| 3 |\n| 1 |\n+------+\n\nURL: https://mariadb.com/kb/en/precedence-control-in-table-operations/','','https://mariadb.com/kb/en/precedence-control-in-table-operations/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (430,27,'LIMIT','Description\n-----------\n\nUse the LIMIT clause to restrict the number of returned rows. When you use a\nsingle integer n with LIMIT, the first n rows will be returned. Use the ORDER\nBY clause to control which rows come first. You can also select a number of\nrows after an offset using either of the following:\n\nLIMIT offset, row_count\nLIMIT row_count OFFSET offset\n\nWhen you provide an offset m with a limit n, the first m rows will be ignored,\nand the following n rows will be returned.\n\nExecuting an UPDATE with the LIMIT clause is not safe for replication. LIMIT 0\nis an exception to this rule (see MDEV-6170).\n\nThere is a LIMIT ROWS EXAMINED optimization which provides the means to\nterminate the execution of SELECT statements which examine too many rows, and\nthus use too many resources. See LIMIT ROWS EXAMINED.\n\nMulti-Table Updates\n-------------------\n\nMariaDB starting with 10.3.2\n----------------------------\nUntil MariaDB 10.3.1, it was not possible to use LIMIT (or ORDER BY) in a\nmulti-table UPDATE statement. This restriction was lifted in MariaDB 10.3.2.\n\nGROUP_CONCAT\n------------\n\nMariaDB starting with 10.3.2\n----------------------------\nStarting from MariaDB 10.3.3, it is possible to use LIMIT with GROUP_CONCAT().\n\nExamples\n--------\n\nCREATE TABLE members (name VARCHAR(20));\nINSERT INTO members VALUES(\'Jagdish\'),(\'Kenny\'),(\'Rokurou\'),(\'Immaculada\');\n\nSELECT * FROM members;\n+------------+\n| name |\n+------------+\n| Jagdish |\n| Kenny |\n| Rokurou |\n| Immaculada |\n+------------+\n\nSelect the first two names (no ordering specified):\n\nSELECT * FROM members LIMIT 2;\n+---------+\n| name |\n+---------+\n| Jagdish |\n| Kenny |\n+---------+\n\nAll the names in alphabetical order:\n\nSELECT * FROM members ORDER BY name;\n+------------+\n| name |\n+------------+\n| Immaculada |\n| Jagdish |\n| Kenny |\n| Rokurou |\n+------------+\n\nThe first two names, ordered alphabetically:\n\nSELECT * FROM members ORDER BY name LIMIT 2;\n+------------+\n| name |\n+------------+\n| Immaculada |\n| Jagdish |\n+------------+\n\nThe third name, ordered alphabetically (the first name would be offset zero,\nso the third is offset two):\n\nSELECT * FROM members ORDER BY name LIMIT 2,1;\n+-------+\n| name |\n+-------+\n| Kenny |\n+-------+\n\nFrom MariaDB 10.3.2, LIMIT can be used in a multi-table update:\n\nCREATE TABLE warehouse (product_id INT, qty INT);\nINSERT INTO warehouse VALUES (1,100),(2,100),(3,100),(4,100);\n\nCREATE TABLE store (product_id INT, qty INT);\nINSERT INTO store VALUES (1,5),(2,5),(3,5),(4,5);\n\nUPDATE warehouse,store SET warehouse.qty = warehouse.qty-2, store.qty =\nstore.qty+2 \n WHERE (warehouse.product_id = store.product_id AND store.product_id >= 1)\n ORDER BY store.product_id DESC LIMIT 2;\n\nSELECT * FROM warehouse;\n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 100 |\n| 2 | 100 |\n| 3 | 98 |\n| 4 | 98 |\n+------------+------+\n\nSELECT * FROM store;\n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 5 |\n| 2 | 5 |\n| 3 | 7 |\n| 4 | 7 |\n+------------+------+\n\nFrom MariaDB 10.3.3, LIMIT can be used with GROUP_CONCAT, so, for example,\ngiven the following table:\n\nCREATE TABLE d (dd DATE, cc INT);\n\nINSERT INTO d VALUES (\'2017-01-01\',1);\nINSERT INTO d VALUES (\'2017-01-02\',2);\nINSERT INTO d VALUES (\'2017-01-04\',3);\n\nthe following query:\n\nSELECT SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc\nDESC),\",\",1) FROM d;\n+----------------------------------------------------------------------------+\n| SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC),\",\",1) |\n+----------------------------------------------------------------------------+\n| 2017-01-04:3 |\n+----------------------------------------------------------------------------+\n\ncan be more simply rewritten as:\n\nSELECT GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC LIMIT 1) FROM d;\n+-------------------------------------------------------------+\n| GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC LIMIT 1) |\n+-------------------------------------------------------------+\n| 2017-01-04:3 |\n+-------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/limit/','','https://mariadb.com/kb/en/limit/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (431,27,'ORDER BY','Description\n-----------\n\nUse the ORDER BY clause to order a resultset, such as that are returned from a\nSELECT statement. You can specify just a column or use any expression with\nfunctions. If you are using the GROUP BY clause, you can use grouping\nfunctions in ORDER BY. Ordering is done after grouping.\n\nYou can use multiple ordering expressions, separated by commas. Rows will be\nsorted by the first expression, then by the second expression if they have the\nsame value for the first, and so on.\n\nYou can use the keywords ASC and DESC after each ordering expression to force\nthat ordering to be ascending or descending, respectively. Ordering is\nascending by default.\n\nYou can also use a single integer as the ordering expression. If you use an\ninteger n, the results will be ordered by the nth column in the select\nexpression.\n\nWhen string values are compared, they are compared as if by the STRCMP\nfunction. STRCMP ignores trailing whitespace and may normalize characters and\nignore case, depending on the collation in use.\n\nDuplicated entries in the ORDER BY clause are removed.\n\nORDER BY can also be used to order the activities of a DELETE or UPDATE\nstatement (usually with the LIMIT clause).\n\nMariaDB starting with 10.3.2\n----------------------------\nUntil MariaDB 10.3.1, it was not possible to use ORDER BY (or LIMIT) in a\nmulti-table UPDATE statement. This restriction was lifted in MariaDB 10.3.2.\n\nMariaDB starting with 10.5\n--------------------------\nFrom MariaDB 10.5, MariaDB allows packed sort keys and values of non-sorted\nfields in the sort buffer. This can make filesort temporary files much smaller\nwhen VARCHAR, CHAR or BLOBs are used, notably speeding up some ORDER BY sorts.\n\nExamples\n--------\n\nCREATE TABLE seq (i INT, x VARCHAR(1));\nINSERT INTO seq VALUES (1,\'a\'), (2,\'b\'), (3,\'b\'), (4,\'f\'), (5,\'e\');\n\nSELECT * FROM seq ORDER BY i;\n+------+------+\n| i | x |\n+------+------+\n| 1 | a |\n| 2 | b |\n| 3 | b |\n| 4 | f |\n| 5 | e |\n+------+------+\n\nSELECT * FROM seq ORDER BY i DESC;\n+------+------+\n| i | x |\n+------+------+\n| 5 | e |\n| 4 | f |\n| 3 | b |\n| 2 | b |\n| 1 | a |\n+------+------+\n\nSELECT * FROM seq ORDER BY x,i;\n+------+------+\n| i | x |\n+------+------+\n| 1 | a |\n| 2 | b |\n| 3 | b |\n| 5 | e |\n| 4 | f |\n+------+------+\n\nORDER BY in an UPDATE statement, in conjunction with LIMIT:\n\nUPDATE seq SET x=\'z\' WHERE x=\'b\' ORDER BY i DESC LIMIT 1;\n\nSELECT * FROM seq;\n+------+------+\n| i | x |\n+------+------+\n| 1 | a |\n| 2 | b |\n| 3 | z |\n| 4 | f |\n| 5 | e |\n+------+------+\n\nFrom MariaDB 10.3.2, ORDER BY can be used in a multi-table update:\n\nCREATE TABLE warehouse (product_id INT, qty INT);\nINSERT INTO warehouse VALUES (1,100),(2,100),(3,100),(4,100);\n\nCREATE TABLE store (product_id INT, qty INT);\nINSERT INTO store VALUES (1,5),(2,5),(3,5),(4,5);\n\nUPDATE warehouse,store SET warehouse.qty = warehouse.qty-2, store.qty =\nstore.qty+2 \n WHERE (warehouse.product_id = store.product_id AND store.product_id >= 1)\n ORDER BY store.product_id DESC LIMIT 2;\n\nSELECT * FROM warehouse;\n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 100 |\n| 2 | 100 |\n| 3 | 98 |\n| 4 | 98 |\n+------------+------+\n\nSELECT * FROM store;\n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 5 |\n| 2 | 5 |\n| 3 | 7 |\n| 4 | 7 |\n+------------+------+\n\nURL: https://mariadb.com/kb/en/order-by/','','https://mariadb.com/kb/en/order-by/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (432,27,'GROUP BY','Use the GROUP BY clause in a SELECT statement to group rows together that have\nthe same value in one or more column, or the same computed value using\nexpressions with any functions and operators except grouping functions. When\nyou use a GROUP BY clause, you will get a single result row for each group of\nrows that have the same value for the expression given in GROUP BY.\n\nWhen grouping rows, grouping values are compared as if by the = operator. For\nstring values, the = operator ignores trailing whitespace and may normalize\ncharacters and ignore case, depending on the collation in use.\n\nYou can use any of the grouping functions in your select expression. Their\nvalues will be calculated based on all the rows that have been grouped\ntogether for each result row. If you select a non-grouped column or a value\ncomputed from a non-grouped column, it is undefined which row the returned\nvalue is taken from. This is not permitted if the ONLY_FULL_GROUP_BY SQL_MODE\nis used.\n\nYou can use multiple expressions in the GROUP BY clause, separated by commas.\nRows are grouped together if they match on each of the expressions.\n\nYou can also use a single integer as the grouping expression. If you use an\ninteger n, the results will be grouped by the nth column in the select\nexpression.\n\nThe WHERE clause is applied before the GROUP BY clause. It filters\nnon-aggregated rows before the rows are grouped together. To filter grouped\nrows based on aggregate values, use the HAVING clause. The HAVING clause takes\nany expression and evaluates it as a boolean, just like the WHERE clause. You\ncan use grouping functions in the HAVING clause. As with the select\nexpression, if you reference non-grouped columns in the HAVING clause, the\nbehavior is undefined.\n\nBy default, if a GROUP BY clause is present, the rows in the output will be\nsorted by the expressions used in the GROUP BY. You can also specify ASC or\nDESC (ascending, descending) after those expressions, like in ORDER BY. The\ndefault is ASC.\n\nIf you want the rows to be sorted by another field, you can add an explicit\nORDER BY. If you don\'t want the result to be ordered, you can add ORDER BY\nNULL.\n\nWITH ROLLUP\n-----------\n\nThe WITH ROLLUP modifer adds extra rows to the resultset that represent\nsuper-aggregate summaries. For a full description with examples, see SELECT\nWITH ROLLUP.\n\nGROUP BY Examples\n-----------------\n\nConsider the following table that records how many times each user has played\nand won a game:\n\nCREATE TABLE plays (name VARCHAR(16), plays INT, wins INT);\nINSERT INTO plays VALUES \n (\"John\", 20, 5),\n (\"Robert\", 22, 8),\n (\"Wanda\", 32, 8),\n (\"Susan\", 17, 3);\n\nGet a list of win counts along with a count:\n\nSELECT wins, COUNT(*) FROM plays GROUP BY wins;\n+------+----------+\n| wins | COUNT(*) |\n+------+----------+\n| 3 | 1 |\n| 5 | 1 |\n| 8 | 2 |\n+------+----------+\n3 rows in set (0.00 sec)\n\nThe GROUP BY expression can be a computed value, and can refer back to an\nidentifer specified with AS. Get a list of win averages along with a count:\n\nSELECT (wins / plays) AS winavg, COUNT(*) FROM plays GROUP BY winavg;\n+--------+----------+\n| winavg | COUNT(*) |\n+--------+----------+\n| 0.1765 | 1 |\n| 0.2500 | 2 |\n| 0.3636 | 1 |\n+--------+----------+\n3 rows in set (0.00 sec)\n\nYou can use any grouping function in the select expression. For each win\naverage as above, get a list of the average play count taken to get that\naverage:\n\nSELECT (wins / plays) AS winavg, AVG(plays) FROM plays \n GROUP BY winavg;\n+--------+------------+\n| winavg | AVG(plays) |\n+--------+------------+\n| 0.1765 | 17.0000 |\n| 0.2500 | 26.0000 |\n| 0.3636 | 22.0000 |\n+--------+------------+\n3 rows in set (0.00 sec)\n\nYou can filter on aggregate information using the HAVING clause. The HAVING\nclause is applied after GROUP BY and allows you to filter on aggregate data\nthat is not available to the WHERE clause. Restrict the above example to\nresults that involve an average number of plays over 20:\n\nSELECT (wins / plays) AS winavg, AVG(plays) FROM plays \n GROUP BY winavg HAVING AVG(plays) > 20;\n+--------+------------+\n| winavg | AVG(plays) |\n+--------+------------+\n| 0.2500 | 26.0000 |\n| 0.3636 | 22.0000 |\n+--------+------------+\n2 rows in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/group-by/','','https://mariadb.com/kb/en/group-by/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (433,27,'WITH','MariaDB starting with 10.2.1\n----------------------------\nCommon Table Expressions were introduced in MariaDB 10.2.1.\n\nSyntax\n------\n\nWITH [RECURSIVE] table_reference [(columns_list)] AS (\n SELECT ...\n)\n[CYCLE cycle_column_list RESTRICT]\nSELECT ...\n\nDescription\n-----------\n\nThe WITH keyword signifies a Common Table Expression (CTE). It allows you to\nrefer to a subquery expression many times in a query, as if having a temporary\ntable that only exists for the duration of a query.\n\nThere are two kinds of CTEs:\n\n* Non-Recursive\n* Recursive (signified by the RECURSIVE keyword, supported since MariaDB\n10.2.2)\n\nYou can use table_reference as any normal table in the external SELECT part.\nYou can also use WITH in subqueries, as well as with EXPLAIN and SELECT.\n\nPoorly-formed recursive CTEs can in theory cause infinite loops. The\nmax_recursive_iterations system variable limits the number of recursions.\n\nCYCLE ... RESTRICT\n------------------\n\nMariaDB starting with 10.5.2\n----------------------------\nThe CYCLE clause enables CTE cycle detection, avoiding excessive or infinite\nloops, MariaDB supports a relaxed, non-standard grammar.\n\nThe SQL Standard permits a CYCLE clause, as follows:\n\nWITH RECURSIVE ... (\n ...\n)\nCYCLE <cycle column list>\nSET <cycle mark column> TO <cycle mark value> DEFAULT <non-cycle mark value>\nUSING <path column>\n\nwhere all clauses are mandatory.\n\nMariaDB does not support this, but from 10.5.2 permits a non-standard relaxed\ngrammar, as follows:\n\nWITH RECURSIVE ... (\n ...\n)\nCYCLE <cycle column list> RESTRICT\n\nWith the use of CYCLE ... RESTRICT it makes no difference whether the CTE uses\nUNION ALL or UNION DISTINCT anymore. UNION ALL means \"all rows, but without\ncycles\", which is exactly what the CYCLE clause enables. And UNION DISTINCT\nmeans all rows should be different, which, again, is what will happen — as\nuniqueness is enforced over a subset of columns, complete rows will\nautomatically all be different.\n\nExamples\n--------\n\nBelow is an example with the WITH at the top level:\n\nWITH t AS (SELECT a FROM t1 WHERE b >= \'c\') \n SELECT * FROM t2, t WHERE t2.c = t.a;\n\nThe example below uses WITH in a subquery:\n\nSELECT t1.a, t1.b FROM t1, t2\n WHERE t1.a > t2.c\n AND t2.c IN(WITH t AS (SELECT * FROM t1 WHERE t1.a < 5)\n SELECT t2.c FROM t2, t WHERE t2.c = t.a);\n\nBelow is an example of a Recursive CTE:\n\nWITH RECURSIVE ancestors AS \n ( SELECT * FROM folks\n WHERE name=\"Alex\"\n UNION\n SELECT f.*\n FROM folks AS f, ancestors AS a\n WHERE f.id = a.father OR f.id = a.mother )\nSELECT * FROM ancestors;\n\nTake the following structure, and data,\n\nCREATE TABLE t1 (from_ int, to_ int);\nINSERT INTO t1 VALUES (1,2), (1,100), (2,3), (3,4), (4,1);\nSELECT * FROM t1;\n+-------+------+\n| from_ | to_ |\n+-------+------+\n| 1 | 2 |\n| 1 | 100 |\n| 2 | 3 |\n| 3 | 4 |\n| 4 | 1 |\n+-------+------+\n\nGiven the above, the following query would theoretically result in an infinite\nloop due to the last record in t1 (note that max_recursive_iterations is set\nto 10 for the purposes of this example, to avoid the excessive number of\ncycles):\n\nSET max_recursive_iterations=10;\n\nWITH RECURSIVE cte (depth, from_, to_) AS ( \n SELECT 0,1,1 UNION DISTINCT SELECT depth+1, t1.from_, t1.to_\n FROM t1, cte WHERE t1.from_ = cte.to_\n) \nSELECT * FROM cte;\n+-------+-------+------+\n| depth | from_ | to_ |\n+-------+-------+------+\n| 0 | 1 | 1 |\n| 1 | 1 | 2 |\n| 1 | 1 | 100 |\n| 2 | 2 | 3 |\n| 3 | 3 | 4 |\n| 4 | 4 | 1 |\n| 5 | 1 | 2 |\n| 5 | 1 | 100 |\n| 6 | 2 | 3 |\n| 7 | 3 | 4 |\n| 8 | 4 | 1 |\n| 9 | 1 | 2 |\n| 9 | 1 | 100 |\n| 10 | 2 | 3 |\n+-------+-------+------+\n\nHowever, the CYCLE ... RESTRICT clause (from MariaDB 10.5.2) can overcome this:\n\nWITH RECURSIVE cte (depth, from_, to_) AS ( \n SELECT 0,1,1 UNION SELECT depth+1, t1.from_, t1.to_\n FROM t1, cte WHERE t1.from_ = cte.to_\n) \nCYCLE from_, to_ RESTRICT \nSELECT * FROM cte;\n+-------+-------+------+\n| depth | from_ | to_ |\n+-------+-------+------+\n| 0 | 1 | 1 |\n| 1 | 1 | 2 |\n| 1 | 1 | 100 |\n| 2 | 2 | 3 |\n| 3 | 3 | 4 |\n| 4 | 4 | 1 |\n+-------+-------+------+\n\nURL: https://mariadb.com/kb/en/with/','','https://mariadb.com/kb/en/with/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (434,27,'Non-Recursive Common Table Expressions Overview','Common Table Expressions (CTEs) are a standard SQL feature, and are\nessentially temporary named result sets. There are two kinds of CTEs:\nNon-Recursive, which this article covers; and Recursive.\n\nMariaDB starting with 10.2.1\n----------------------------\nCommon table expressions were introduced in MariaDB 10.2.1.\n\nNon-Recursive CTEs\n------------------\n\nThe WITH keyword signifies a CTE. It is given a name, followed by a body (the\nmain query) as follows:\n\nCTEs are similar to derived tables. For example\n\nWITH engineers AS \n ( SELECT * FROM employees\n WHERE dept = \'Engineering\' )\n\nSELECT * FROM engineers\nWHERE ...\n\nSELECT * FROM\n ( SELECT * FROM employees\n WHERE dept = \'Engineering\' ) AS engineers\nWHERE\n...\n\nA non-recursive CTE is basically a query-local VIEW. There are several\nadvantages and caveats to them. The syntax is more readable than nested FROM\n(SELECT ...). A CTE can refer to another and it can be referenced from\nmultiple places.\n\nA CTE referencing Another CTE\n-----------------------------\n\nUsing this format makes for a more readable SQL than a nested FROM(SELECT ...)\nclause. Below is an example of this:\n\nWITH engineers AS (\nSELECT * FROM employees\nWHERE dept IN(\'Development\',\'Support\') ),\neu_engineers AS ( SELECT * FROM engineers WHERE country IN(\'NL\',...) )\nSELECT\n...\nFROM eu_engineers;\n\nMultiple Uses of a CTE\n----------------------\n\nThis can be an \'anti-self join\', for example:\n\nWITH engineers AS (\nSELECT * FROM employees\nWHERE dept IN(\'Development\',\'Support\') )\n\nSELECT * FROM engineers E1\nWHERE NOT EXISTS\n (SELECT 1 FROM engineers E2\n WHERE E2.country=E1.country\n AND E2.name <> E1.name );\n\nOr, for year-over-year comparisons, for example:\n\nWITH sales_product_year AS (\nSELECT product, YEAR(ship_date) AS year,\nSUM(price) AS total_amt\nFROM item_sales\nGROUP BY product, year )\n\nSELECT *\nFROM sales_product_year CUR,\nsales_product_year PREV,\nWHERE CUR.product=PREV.product \nAND CUR.year=PREV.year + 1 \nAND CUR.total_amt > PREV.total_amt\n\nAnother use is to compare individuals against their group. Below is an example\nof how this might be executed:\n\nWITH sales_product_year AS (\nSELECT product,\nYEAR(ship_date) AS year,\nSUM(price) AS total_amt\nFROM item_sales\nGROUP BY product, year\n)\n\nSELECT * \nFROM sales_product_year S1\nWHERE\ntotal_amt > \n (SELECT 0.1 * SUM(total_amt)\n FROM sales_product_year S2\n WHERE S2.year = S1.year)\n\nURL: https://mariadb.com/kb/en/non-recursive-common-table-expressions-overview/','','https://mariadb.com/kb/en/non-recursive-common-table-expressions-overview/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (435,27,'Recursive Common Table Expressions Overview','MariaDB starting with 10.2.2\n----------------------------\nRecursive Common Table Expressions have been supported since MariaDB 10.2.2.\n\nCommon Table Expressions (CTEs) are a standard SQL feature, and are\nessentially temporary named result sets. CTEs first appeared in the SQL\nstandard in 1999, and the first implementations began appearing in 2007.\n\nThere are two kinds of CTEs:\n\n* Non-recursive\n* Recursive, which this article covers.\n\nSQL is generally poor at recursive structures.\n\nCTEs permit a query to reference itself. A recursive CTE will repeatedly\nexecute subsets of the data until it obtains the complete result set. This\nmakes it particularly useful for handing hierarchical or tree-structured data.\nmax_recursive_iterations avoids infinite loops.\n\nSyntax example\n--------------\n\nWITH RECURSIVE signifies a recursive CTE. It is given a name, followed by a\nbody (the main query) as follows:\n\nComputation\n-----------\n\nGiven the following structure:\n\nFirst execute the anchor part of the query:\n\nNext, execute the recursive part of the query:\n\nSummary so far\n--------------\n\nwith recursive R as (\n select anchor_data\n union [all]\n select recursive_part\n from R, ...\n)\nselect ...\n\n* Compute anchor_data\n* Compute recursive_part to get the new data\n* if (new data is non-empty) goto 2;\n\nCAST to avoid truncating data\n-----------------------------\n\nAs currently implemented by MariaDB and by the SQL Standard, data may be\ntruncated if not correctly cast. It is necessary to CAST the column to the\ncorrect width if the CTE\'s recursive part produces wider values for a column\nthan the CTE\'s nonrecursive part. Some other DBMS give an error in this\nsituation, and MariaDB\'s behavior may change in future - see MDEV-12325. See\nthe examples below.\n\nExamples\n--------\n\nTransitive closure - determining bus destinations\n-------------------------------------------------\n\nSample data:\n\nCREATE TABLE bus_routes (origin varchar(50), dst varchar(50));\nINSERT INTO bus_routes VALUES \n (\'New York\', \'Boston\'),\n (\'Boston\', \'New York\'),\n (\'New York\', \'Washington\'),\n (\'Washington\', \'Boston\'),\n (\'Washington\', \'Raleigh\');\n\nNow, we want to return the bus destinations with New York as the origin:\n\nWITH RECURSIVE bus_dst as ( \n SELECT origin as dst FROM bus_routes WHERE origin=\'New York\'\n UNION\n SELECT bus_routes.dst FROM bus_routes JOIN bus_dst ON bus_dst.dst=\nbus_routes.origin \n) \nSELECT * FROM bus_dst;\n+------------+\n| dst |\n+------------+\n| New York |\n| Boston |\n| Washington |\n| Raleigh |\n+------------+\n\nThe above example is computed as follows:\n\nFirst, the anchor data is calculated:\n\n* Starting from New York\n* Boston and Washington are added\n\nNext, the recursive part:\n\n* Starting from Boston and then Washington\n* Raleigh is added\n* UNION excludes nodes that are already present.\n\nComputing paths - determining bus routes\n----------------------------------------\n\nThis time, we are trying to get bus routes such as \"New York -> Washington ->\nRaleigh\".\n\nUsing the same sample data as the previous example:\n\nWITH RECURSIVE paths (cur_path, cur_dest) AS (\n SELECT origin, origin FROM bus_routes WHERE origin=\'New York\'\n UNION\n SELECT CONCAT(paths.cur_path, \',\', bus_routes.dst), bus_routes.dst\n FROM paths\n JOIN bus_routes\n ON paths.cur_dest = bus_routes.origin AND\n NOT FIND_IN_SET(bus_routes.dst, paths.cur_path)\n) \nSELECT * FROM paths;\n+-----------------------------+------------+\n| cur_path | cur_dest |\n+-----------------------------+------------+\n| New York | New York |\n| New York,Boston | Boston |\n| New York,Washington | Washington |\n| New York,Washington,Boston | Boston |\n| New York,Washington,Raleigh | Raleigh |\n+-----------------------------+------------+\n\nCAST to avoid data truncation\n-----------------------------\n\nIn the following example, data is truncated because the results are not\nspecifically cast to a wide enough type:\n\nWITH RECURSIVE tbl AS (\n SELECT NULL AS col\n UNION\n SELECT \"THIS NEVER SHOWS UP\" AS col FROM tbl\n)\nSELECT col FROM tbl\n+------+\n| col |\n+------+\n| NULL |\n| |\n+------+\n\nExplicitly use CAST to overcome this:\n\nWITH RECURSIVE tbl AS (\n SELECT CAST(NULL AS CHAR(50)) AS col\n UNION SELECT \"THIS NEVER SHOWS UP\" AS col FROM tbl\n) \nSELECT * FROM tbl;\n+---------------------+\n| col |\n+---------------------+\n| NULL |\n| THIS NEVER SHOWS UP |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/recursive-common-table-expressions-overview/','','https://mariadb.com/kb/en/recursive-common-table-expressions-overview/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (436,27,'SELECT WITH ROLLUP','Syntax\n------\n\nSee SELECT for the full syntax.\n\nDescription\n-----------\n\nThe WITH ROLLUP modifier adds extra rows to the resultset that represent\nsuper-aggregate summaries. The super-aggregated column is represented by a\nNULL value. Multiple aggregates over different columns will be added if there\nare multiple GROUP BY columns.\n\nThe LIMIT clause can be used at the same time, and is applied after the WITH\nROLLUP rows have been added.\n\nWITH ROLLUP cannot be used with ORDER BY. Some sorting is still possible by\nusing ASC or DESC clauses with the GROUP BY column, although the\nsuper-aggregate rows will always be added last.\n\nExamples\n--------\n\nThese examples use the following sample table\n\nCREATE TABLE booksales ( \n country VARCHAR(35), genre ENUM(\'fiction\',\'non-fiction\'), year YEAR, sales\nINT);\n\nINSERT INTO booksales VALUES\n (\'Senegal\',\'fiction\',2014,12234), (\'Senegal\',\'fiction\',2015,15647),\n (\'Senegal\',\'non-fiction\',2014,64980), (\'Senegal\',\'non-fiction\',2015,78901),\n (\'Paraguay\',\'fiction\',2014,87970), (\'Paraguay\',\'fiction\',2015,76940),\n (\'Paraguay\',\'non-fiction\',2014,8760), (\'Paraguay\',\'non-fiction\',2015,9030);\n\nThe addition of the WITH ROLLUP modifier in this example adds an extra row\nthat aggregates both years:\n\nSELECT year, SUM(sales) FROM booksales GROUP BY year;\n+------+------------+\n| year | SUM(sales) |\n+------+------------+\n| 2014 | 173944 |\n| 2015 | 180518 |\n+------+------------+\n2 rows in set (0.08 sec)\n\nSELECT year, SUM(sales) FROM booksales GROUP BY year WITH ROLLUP;\n+------+------------+\n| year | SUM(sales) |\n+------+------------+\n| 2014 | 173944 |\n| 2015 | 180518 |\n| NULL | 354462 |\n+------+------------+\n\nIn the following example, each time the genre, the year or the country change,\nanother super-aggregate row is added:\n\nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year, genre;\n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2015 | fiction | 76940 |\n| Paraguay | 2015 | non-fiction | 9030 |\n| Senegal | 2014 | fiction | 12234 |\n| Senegal | 2014 | non-fiction | 64980 |\n| Senegal | 2015 | fiction | 15647 |\n| Senegal | 2015 | non-fiction | 78901 |\n+----------+------+-------------+------------+\n\nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year, genre WITH ROLLUP;\n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2014 | NULL | 96730 |\n| Paraguay | 2015 | fiction | 76940 |\n| Paraguay | 2015 | non-fiction | 9030 |\n| Paraguay | 2015 | NULL | 85970 |\n| Paraguay | NULL | NULL | 182700 |\n| Senegal | 2014 | fiction | 12234 |\n| Senegal | 2014 | non-fiction | 64980 |\n| Senegal | 2014 | NULL | 77214 |\n| Senegal | 2015 | fiction | 15647 |\n| Senegal | 2015 | non-fiction | 78901 |\n| Senegal | 2015 | NULL | 94548 |\n| Senegal | NULL | NULL | 171762 |\n| NULL | NULL | NULL | 354462 |\n+----------+------+-------------+------------+\n\nThe LIMIT clause, applied after WITH ROLLUP:\n\nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year, genre WITH ROLLUP LIMIT 4;\n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2014 | NULL | 96730 |\n| Paraguay | 2015 | fiction | 76940 |\n+----------+------+-------------+------------+\n\nSorting by year descending:\n\nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year DESC, genre WITH ROLLUP;\n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2015 | fiction | 76940 |\n| Paraguay | 2015 | non-fiction | 9030 |\n| Paraguay | 2015 | NULL | 85970 |\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2014 | NULL | 96730 |\n| Paraguay | NULL | NULL | 182700 |\n| Senegal | 2015 | fiction | 15647 |\n| Senegal | 2015 | non-fiction | 78901 |\n| Senegal | 2015 | NULL | 94548 |\n| Senegal | 2014 | fiction | 12234 |\n| Senegal | 2014 | non-fiction | 64980 |\n| Senegal | 2014 | NULL | 77214 |\n| Senegal | NULL | NULL | 171762 |\n| NULL | NULL | NULL | 354462 |\n+----------+------+-------------+------------+\n\nURL: https://mariadb.com/kb/en/select-with-rollup/','','https://mariadb.com/kb/en/select-with-rollup/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (437,27,'SELECT INTO OUTFILE','Syntax\n------\n\nSELECT ... INTO OUTFILE \'file_name\'\n [CHARACTER SET charset_name]\n [export_options]\n\nexport_options:\n [{FIELDS | COLUMNS}\n [TERMINATED BY \'string\']\n [[OPTIONALLY] ENCLOSED BY \'char\']\n [ESCAPED BY \'char\']\n ]\n [LINES\n [STARTING BY \'string\']\n [TERMINATED BY \'string\']\n ]\n\nDescription\n-----------\n\nSELECT INTO OUTFILE writes the resulting rows to a file, and allows the use of\ncolumn and row terminators to specify a particular output format. The default\nis to terminate fields with tabs (\\t) and lines with newlines (\\n).\n\nThe file must not exist. It cannot be overwritten. A user needs the FILE\nprivilege to run this statement. Also, MariaDB needs permission to write files\nin the specified location. If the secure_file_priv system variable is set to a\nnon-empty directory name, the file can only be written to that directory.\n\nThe LOAD DATA INFILE statement complements SELECT INTO OUTFILE.\n\nCharacter-sets\n--------------\n\nThe CHARACTER SET clause specifies the character set in which the results are\nto be written. Without the clause, no conversion takes place (the binary\ncharacter set). In this case, if there are multiple character sets, the output\nwill contain these too, and may not easily be able to be reloaded.\n\nIn cases where you have two servers using different character-sets, using\nSELECT INTO OUTFILE to transfer data from one to the other can have unexpected\nresults. To ensure that MariaDB correctly interprets the escape sequences, use\nthe CHARACTER SET clause on both the SELECT INTO OUTFILE statement and the\nsubsequent LOAD DATA INFILE statement.\n\nExample\n-------\n\nThe following example produces a file in the CSV format:\n\nSELECT customer_id, firstname, surname from customer\n INTO OUTFILE \'/exportdata/customers.txt\'\n FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'\"\'\n LINES TERMINATED BY \'\\n\';\n\nThe following ANSI syntax is also supported for simple SELECT without UNION\n\nSELECT customer_id, firstname, surname INTO OUTFILE \'/exportdata/customers.txt\'\n FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'\"\'\n LINES TERMINATED BY \'\\n\'\n FROM customers;\n\nIf you want to use the ANSI syntax with UNION or similar construct you have to\nuse the syntax:\n\nSELECT * INTO OUTFILE \"/tmp/skr3\" FROM (SELECT * FROM t1 UNION SELECT * FROM\nt1);\n\nURL: https://mariadb.com/kb/en/select-into-outfile/','','https://mariadb.com/kb/en/select-into-outfile/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (438,27,'SELECT INTO DUMPFILE','Syntax\n------\n\nSELECT ... INTO DUMPFILE \'file_path\'\n\nDescription\n-----------\n\nSELECT ... INTO DUMPFILE is a SELECT clause which writes the resultset into a\nsingle unformatted row, without any separators, in a file. The results will\nnot be returned to the client.\n\nfile_path can be an absolute path, or a relative path starting from the data\ndirectory. It can only be specified as a string literal, not as a variable.\nHowever, the statement can be dynamically composed and executed as a prepared\nstatement to work around this limitation.\n\nThis statement is binary-safe and so is particularly useful for writing BLOB\nvalues to file. It can be used, for example, to copy an image or an audio\ndocument from the database to a file. SELECT ... INTO FILE can be used to save\na text file.\n\nThe file must not exist. It cannot be overwritten. A user needs the FILE\nprivilege to run this statement. Also, MariaDB needs permission to write files\nin the specified location. If the secure_file_priv system variable is set to a\nnon-empty directory name, the file can only be written to that directory.\n\nSince MariaDB 5.1, the character_set_filesystem system variable has controlled\ninterpretation of file names that are given as literal strings.\n\nExample\n-------\n\nSELECT _utf8\'Hello world!\' INTO DUMPFILE \'/tmp/world\';\n\nSELECT LOAD_FILE(\'/tmp/world\') AS world;\n+--------------+\n| world |\n+--------------+\n| Hello world! |\n+--------------+\n\nURL: https://mariadb.com/kb/en/select-into-dumpfile/','','https://mariadb.com/kb/en/select-into-dumpfile/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (439,27,'FOR UPDATE','InnoDB supports row-level locking. Selected rows can be locked using LOCK IN\nSHARE MODE or FOR UPDATE. In both cases, a lock is acquired on the rows read\nby the query, and it will be released when the current transaction is\ncommitted.\n\nThe FOR UPDATE clause of SELECT applies only when autocommit is set to 0 or\nthe SELECT is enclosed in a transaction. A lock is acquired on the rows, and\nother transactions are prevented from writing the rows, acquire locks, and\nfrom reading them (unless their isolation level is READ UNCOMMITTED).\n\nIf autocommit is set to 1, the LOCK IN SHARE MODE and FOR UPDATE clauses have\nno effect.\n\nIf the isolation level is set to SERIALIZABLE, all plain SELECT statements are\nconverted to SELECT ... LOCK IN SHARE MODE.\n\nExample\n-------\n\nSELECT * FROM trans WHERE period=2001 FOR UPDATE;\n\nURL: https://mariadb.com/kb/en/for-update/','','https://mariadb.com/kb/en/for-update/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (440,27,'LOCK IN SHARE MODE','InnoDB supports row-level locking. Selected rows can be locked using LOCK IN\nSHARE MODE or FOR UPDATE. In both cases, a lock is acquired on the rows read\nby the query, and it will be released when the current transaction is\ncommitted.\n\nWhen LOCK IN SHARE MODE is specified in a SELECT statement, MariaDB will wait\nuntil all transactions that have modified the rows are committed. Then, a\nwrite lock is acquired. All transactions can read the rows, but if they want\nto modify them, they have to wait until your transaction is committed.\n\nIf autocommit is set to 1, the LOCK IN SHARE MODE and FOR UPDATE clauses have\nno effect.\n\nURL: https://mariadb.com/kb/en/lock-in-share-mode/','','https://mariadb.com/kb/en/lock-in-share-mode/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (441,27,'Optimizer Hints','Optimizer hints\n---------------\n\nThere are some options available in SELECT to affect the execution plan. These\nare known as optimizer hints.\n\nHIGH PRIORITY\n-------------\n\nHIGH_PRIORITY gives the statement a higher priority. If the table is locked,\nhigh priority SELECTs will be executed as soon as the lock is released, even\nif other statements are queued. HIGH_PRIORITY applies only if the storage\nengine only supports table-level locking (MyISAM, MEMORY, MERGE). See\nHIGH_PRIORITY and LOW_PRIORITY clauses for details.\n\nSQL_CACHE / SQL_NO_CACHE\n------------------------\n\nIf the query_cache_type system variable is set to 2 or DEMAND, and the current\nstatement is cacheable, SQL_CACHE causes the query to be cached and\nSQL_NO_CACHE causes the query not to be cached. For UNIONs, SQL_CACHE or\nSQL_NO_CACHE should be specified for the first query. See also The Query Cache\nfor more detail and a list of the types of statements that aren\'t cacheable.\n\nSQL_BUFFER_RESULT\n-----------------\n\nSQL_BUFFER_RESULT forces the optimizer to use a temporary table to process the\nresult. This is useful to free locks as soon as possible.\n\nSQL_SMALL_RESULT / SQL_BIG_RESULT\n---------------------------------\n\nSQL_SMALL_RESULT and SQL_BIG_RESULT tell the optimizer whether the result is\nvery big or not. Usually, GROUP BY and DISTINCT operations are performed using\na temporary table. Only if the result is very big, using a temporary table is\nnot convenient. The optimizer automatically knows if the result is too big,\nbut you can force the optimizer to use a temporary table with\nSQL_SMALL_RESULT, or avoid the temporary table using SQL_BIG_RESULT.\n\nSTRAIGHT_JOIN\n-------------\n\nSTRAIGHT_JOIN applies to the JOIN queries, and tells the optimizer that the\ntables must be read in the order they appear in the SELECT. For const and\nsystem table this options is sometimes ignored.\n\nSQL_CALC_FOUND_ROWS\n-------------------\n\nSQL_CALC_FOUND_ROWS is only applied when using the LIMIT clause. If this\noption is used, MariaDB will count how many rows would match the query,\nwithout the LIMIT clause. That number can be retrieved in the next query,\nusing FOUND_ROWS().\n\nUSE/FORCE/IGNORE INDEX\n----------------------\n\nUSE INDEX, FORCE INDEX and IGNORE INDEX constrain the query planning to a\nspecific index.\n\nFor further information about some of these options, see How to force query\nplans.\n\nURL: https://mariadb.com/kb/en/optimizer-hints/','','https://mariadb.com/kb/en/optimizer-hints/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (442,27,'PROCEDURE','The PROCEDURE clause of SELECT passes the whole result set to a Procedure\nwhich will process it. These Procedures are not Stored Procedures, and can\nonly be written in the C language, so it is necessary to recompile the server.\n\nCurrently, the only available procedure is ANALYSE, which examines the\nresultset and suggests the optimal datatypes for each column. It is defined in\nthe sql/sql_analyse.cc file, and can be used as an example to create more\nProcedures.\n\nThis clause cannot be used in a view\'s definition.\n\nURL: https://mariadb.com/kb/en/procedure/','','https://mariadb.com/kb/en/procedure/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (443,27,'DUAL','Description\n-----------\n\nYou are allowed to specify DUAL as a dummy table name in situations where no\ntables are referenced, such as the following SELECT statement:\n\nSELECT 1 + 1 FROM DUAL;\n+-------+\n| 1 + 1 |\n+-------+\n| 2 |\n+-------+\n\nDUAL is purely for the convenience of people who require that all SELECT\nstatements should have FROM and possibly other clauses. MariaDB ignores the\nclauses. MariaDB does not require FROM DUAL if no tables are referenced.\n\nFROM DUAL could be used when you only SELECT computed values, but require a\nWHERE clause, perhaps to test that a script correctly handles empty resultsets:\n\nSELECT 1 FROM DUAL WHERE FALSE;\nEmpty set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/dual/','','https://mariadb.com/kb/en/dual/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (444,27,'SELECT ... OFFSET ... FETCH','MariaDB starting with 10.6.0\n----------------------------\nSELECT ... OFFSET ... FETCH was introduced in MariaDB 10.6.\n\nSyntax\n------\n\nOFFSET start { ROW | ROWS }\nFETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }\n\nDescription\n-----------\n\nThe OFFSET clause allows one to return only those elements of a resultset that\ncome after a specified offset. The FETCH clause specifies the number of rows\nto return, while ONLY or WITH TIES specifies whether or not to also return any\nfurther results that tie for last place according to the ordered resultset.\n\nEither the singular ROW or the plural ROWS can be used after the OFFSET and\nFETCH clauses; the choice has no impact on the results.\n\nIn the case of WITH TIES, an ORDER BY clause is required, otherwise an ERROR\nwill be returned.\n\nSELECT i FROM t1 FETCH FIRST 2 ROWS WITH TIES;\nERROR 4180 (HY000): FETCH ... WITH TIES requires ORDER BY clause to be present\n\nExamples\n--------\n\nGiven a table with 6 rows:\n\nCREATE OR REPLACE TABLE t1 (i INT);\nINSERT INTO t1 VALUES (1),(2),(3),(4), (4), (5);\nSELECT i FROM t1 ORDER BY i ASC;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 4 |\n| 5 |\n+------+\n\nOFFSET 2 allows one to skip the first two results.\n\nSELECT i FROM t1 ORDER BY i ASC OFFSET 2 ROWS;\n+------+\n| i |\n+------+\n| 3 |\n| 4 |\n| 4 |\n| 5 |\n+------+\n\nFETCH FIRST 3 ROWS ONLY limits the results to three rows only\n\nSELECT i FROM t1 ORDER BY i ASC OFFSET 1 ROWS FETCH FIRST 3 ROWS ONLY;\n+------+\n| i |\n+------+\n| 2 |\n| 3 |\n| 4 |\n+------+\n\nThe same outcome can also be achieved with the LIMIT clause:\n\nSELECT i FROM t1 ORDER BY i ASC LIMIT 3 OFFSET 1;\n+------+\n| i |\n+------+\n| 2 |\n| 3 |\n| 4 |\n+------+\n\nWITH TIES ensures the tied result 4 is also returned.\n\nSELECT i FROM t1 ORDER BY i ASC OFFSET 1 ROWS FETCH FIRST 3 ROWS WITH TIES;\n+------+\n| i |\n+------+\n| 2 |\n| 3 |\n| 4 |\n| 4 |\n+------+\n\nURL: https://mariadb.com/kb/en/select-offset-fetch/','','https://mariadb.com/kb/en/select-offset-fetch/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (445,27,'INSERT','Syntax\n------\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nOr:\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nOr:\n\nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nThe INSERT statement is used to insert new rows into an existing table. The\nINSERT ... VALUES and INSERT ... SET forms of the statement insert rows based\non explicitly specified values. The INSERT ... SELECT form inserts rows\nselected from another table or tables. INSERT ... SELECT is discussed further\nin the INSERT ... SELECT article.\n\nThe table name can be specified in the form db_name.tbl_name or, if a default\ndatabase is selected, in the form tbl_name (see Identifier Qualifiers). This\nallows to use INSERT ... SELECT to copy rows between different databases.\n\nThe PARTITION clause can be used in both the INSERT and the SELECT part. See\nPartition Pruning and Selection for details.\n\nMariaDB starting with 10.5\n--------------------------\nThe RETURNING clause was introduced in MariaDB 10.5.\n\nThe columns list is optional. It specifies which values are explicitly\ninserted, and in which order. If this clause is not specified, all values must\nbe explicitly specified, in the same order they are listed in the table\ndefinition.\n\nThe list of value follow the VALUES or VALUE keyword (which are\ninterchangeable, regardless how much values you want to insert), and is\nwrapped by parenthesis. The values must be listed in the same order as the\ncolumns list. It is possible to specify more than one list to insert more than\none rows with a single statement. If many rows are inserted, this is a speed\noptimization.\n\nFor one-row statements, the SET clause may be more simple, because you don\'t\nneed to remember the columns order. All values are specified in the form col =\nexpr.\n\nValues can also be specified in the form of a SQL expression or subquery.\nHowever, the subquery cannot access the same table that is named in the INTO\nclause.\n\nIf you use the LOW_PRIORITY keyword, execution of the INSERT is delayed until\nno other clients are reading from the table. If you use the HIGH_PRIORITY\nkeyword, the statement has the same priority as SELECTs. This affects only\nstorage engines that use only table-level locking (MyISAM, MEMORY, MERGE).\nHowever, if one of these keywords is specified, concurrent inserts cannot be\nused. See HIGH_PRIORITY and LOW_PRIORITY clauses for details.\n\nINSERT DELAYED\n--------------\n\nFor more details on the DELAYED option, see INSERT DELAYED.\n\nHIGH PRIORITY and LOW PRIORITY\n------------------------------\n\nSee HIGH_PRIORITY and LOW_PRIORITY.\n\nDefaults and Duplicate Values\n-----------------------------\n\nSee INSERT - Default & Duplicate Values for details..\n\nINSERT IGNORE\n-------------\n\nSee INSERT IGNORE.\n\nINSERT ON DUPLICATE KEY UPDATE\n------------------------------\n\nSee INSERT ON DUPLICATE KEY UPDATE.\n\nExamples\n--------\n\nSpecifying the column names:\n\nINSERT INTO person (first_name, last_name) VALUES (\'John\', \'Doe\');\n\nInserting more than 1 row at a time:\n\nINSERT INTO tbl_name VALUES (1, \"row 1\"), (2, \"row 2\");\n\nUsing the SET clause:\n\nINSERT INTO person SET first_name = \'John\', last_name = \'Doe\';\n\nSELECTing from another table:\n\nINSERT INTO contractor SELECT * FROM person WHERE status = \'c\';\n\nSee INSERT ON DUPLICATE KEY UPDATE and INSERT IGNORE for further examples.\n\nINSERT ... RETURNING\n--------------------\n\nINSERT ... RETURNING returns a resultset of the inserted rows.\n\nThis returns the listed columns for all the rows that are inserted, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple INSERT statement\n\nINSERT INTO t2 VALUES (1,\'Dog\'),(2,\'Lion\'),(3,\'Tiger\'),(4,\'Leopard\') \nRETURNING id2,id2+id2,id2&id2,id2||id2;\n+-----+---------+---------+----------+\n| id2 | id2+id2 | id2&id2 | id2||id2 |\n+-----+---------+---------+----------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n| 3 | 6 | 3 | 1 |\n| 4 | 8 | 4 | 1 |\n+-----+---------+---------+----------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\n\nPREPARE stmt FROM \"INSERT INTO t1 SET id1=1, animal1=\'Bear\' RETURNING f(id1),\nUPPER(animal1)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f(id1) | UPPER(animal1) |\n+---------+----------------+\n| 2 | BEAR |\n+---------+----------------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used.\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values, and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used or it can be used in\nINSERT...SELECT...RETURNING if the table in the RETURNING clause is not the\nsame as the INSERT table.\n\nURL: https://mariadb.com/kb/en/insert/','','https://mariadb.com/kb/en/insert/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (446,27,'INSERT DELAYED','Syntax\n------\n\nINSERT DELAYED ...\n\nDescription\n-----------\n\nThe DELAYED option for the INSERT statement is a MariaDB/MySQL extension to\nstandard SQL that is very useful if you have clients that cannot or need not\nwait for the INSERT to complete. This is a common situation when you use\nMariaDB for logging and you also periodically run SELECT and UPDATE statements\nthat take a long time to complete.\n\nWhen a client uses INSERT DELAYED, it gets an okay from the server at once,\nand the row is queued to be inserted when the table is not in use by any other\nthread.\n\nAnother major benefit of using INSERT DELAYED is that inserts from many\nclients are bundled together and written in one block. This is much faster\nthan performing many separate inserts.\n\nNote that INSERT DELAYED is slower than a normal INSERT if the table is not\notherwise in use. There is also the additional overhead for the server to\nhandle a separate thread for each table for which there are delayed rows. This\nmeans that you should use INSERT DELAYED only when you are really sure that\nyou need it.\n\nThe queued rows are held only in memory until they are inserted into the\ntable. This means that if you terminate mysqld forcibly (for example, with\nkill -9) or if mysqld dies unexpectedly, any queued rows that have not been\nwritten to disk are lost.\n\nThe number of concurrent INSERT DELAYED threads is limited by the\nmax_delayed_threads server system variables. If it is set to 0, INSERT DELAYED\nis disabled. The session value can be equal to the global value, or 0 to\ndisable this statement for the current session. If this limit has been\nreached, the DELAYED clause will be silently ignore for subsequent statements\n(no error will be produced).\n\nLimitations\n-----------\n\nThere are some limitations on the use of DELAYED:\n\n* INSERT DELAYED works only with MyISAM, MEMORY, ARCHIVE,\n and BLACKHOLE tables. If you execute INSERT DELAYED with another storage\nengine, you will get an error like this: ERROR 1616 (HY000): DELAYED option\nnot supported for table \'tab_name\'\n* For MyISAM tables, if there are no free blocks in the middle of the data\n file, concurrent SELECT and INSERT statements are supported. Under these\n circumstances, you very seldom need to use INSERT DELAYED\n with MyISAM.\n* INSERT DELAYED should be used only for\n INSERT statements that specify value lists. The server\n ignores DELAYED for INSERT ... SELECT\n or INSERT ... ON DUPLICATE KEY UPDATE statements.\n* Because the INSERT DELAYED statement returns immediately,\n before the rows are inserted, you cannot use\n LAST_INSERT_ID() to get the\n AUTO_INCREMENT value that the statement might generate.\n* DELAYED rows are not visible to SELECT\n statements until they actually have been inserted.\n* After INSERT DELAYED, ROW_COUNT() returns the number of the rows you tried\nto insert, not the number of the successful writes.\n* DELAYED is ignored on slave replication servers, so that \n INSERT DELAYED is treated as a normal\n INSERT on slaves. This is because\n DELAYED could cause the slave to have different data than\n the master. INSERT DELAYED statements are not safe for replication.\n* Pending INSERT DELAYED statements are lost if a table is\n write locked and ALTER TABLE is used to modify the table structure.\n* INSERT DELAYED is not supported for views. If you try, you will get an error\nlike this: ERROR 1347 (HY000): \'view_name\' is not BASE TABLE\n* INSERT DELAYED is not supported for partitioned tables.\n* INSERT DELAYED is not supported within stored programs.\n* INSERT DELAYED does not work with triggers.\n* INSERT DELAYED does not work if there is a check constraint in place.\n* INSERT DELAYED does not work if skip-new mode is active.\n\nURL: https://mariadb.com/kb/en/insert-delayed/','','https://mariadb.com/kb/en/insert-delayed/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (447,27,'INSERT SELECT','Syntax\n------\n\nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [(col_name,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]\n\nDescription\n-----------\n\nWith INSERT ... SELECT, you can quickly insert many rows into a table from one\nor more other tables. For example:\n\nINSERT INTO tbl_temp2 (fld_id)\n SELECT tbl_temp1.fld_order_id\n FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;\n\ntbl_name can also be specified in the form db_name.tbl_name (see Identifier\nQualifiers). This allows to copy rows between different databases.\n\nIf the new table has a primary key or UNIQUE indexes, you can use IGNORE to\nhandle duplicate key errors during the query. The newer values will not be\ninserted if an identical value already exists.\n\nREPLACE can be used instead of INSERT to prevent duplicates on UNIQUE indexes\nby deleting old values. In that case, ON DUPLICATE KEY UPDATE cannot be used.\n\nINSERT ... SELECT works for tables which already exist. To create a table for\na given resultset, you can use CREATE TABLE ... SELECT.\n\nURL: https://mariadb.com/kb/en/insert-select/','','https://mariadb.com/kb/en/insert-select/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (448,27,'LOAD DATA INFILE','Syntax\n------\n\nLOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE \'file_name\'\n [REPLACE | IGNORE]\n INTO TABLE tbl_name\n [CHARACTER SET charset_name]\n [{FIELDS | COLUMNS}\n [TERMINATED BY \'string\']\n [[OPTIONALLY] ENCLOSED BY \'char\']\n [ESCAPED BY \'char\']\n ]\n [LINES\n [STARTING BY \'string\']\n [TERMINATED BY \'string\']\n ]\n [IGNORE number LINES]\n [(col_name_or_user_var,...)]\n [SET col_name = expr,...]\n\nDescription\n-----------\n\nLOAD DATA INFILE is unsafe for statement-based replication.\n\nReads rows from a text file into the designated table on the database at a\nvery high speed. The file name must be given as a literal string.\n\nFiles are written to disk using the SELECT INTO OUTFILE statement. You can\nthen read the files back into a table using the LOAD DATA INFILE statement.\nThe FIELDS and LINES clauses are the same in both statements. These clauses\nare optional, but if both are specified then the FIELDS clause must precede\nLINES.\n\nExecuting this statement activates INSERT triggers.\n\nOne must have the FILE privilege to be able to execute LOAD DATA INFILE. This\nis to ensure normal users cannot read system files. LOAD DATA LOCAL INFILE\ndoes not have this requirement.\n\nIf the secure_file_priv system variable is set (by default it is not), the\nloaded file must be present in the specified directory.\n\nNote that MariaDB\'s systemd unit file restricts access to /home, /root, and\n/run/user by default. See Configuring access to home directories.\n\nLOAD DATA LOCAL INFILE\n----------------------\n\nWhen you execute the LOAD DATA INFILE statement, MariaDB Server attempts to\nread the input file from its own file system. By contrast, when you execute\nthe LOAD DATA LOCAL INFILE statement, the client attempts to read the input\nfile from its file system, and it sends the contents of the input file to the\nMariaDB Server. This allows you to load files from the client\'s local file\nsystem into the database.\n\nIf you don\'t want to permit this operation (perhaps for security reasons), you\ncan disable the LOAD DATA LOCAL INFILE statement on either the server or the\nclient.\n\n* The LOAD DATA LOCAL INFILE statement can be disabled on the server by\nsetting the local_infile system variable to 0.\n* The LOAD DATA LOCAL INFILE statement can be disabled on the client. If you\nare using MariaDB Connector/C, this can be done by unsetting the\nCLIENT_LOCAL_FILES capability flag with the mysql_real_connect function or by\nunsetting the MYSQL_OPT_LOCAL_INFILE option with mysql_optionsv function. If\nyou are using a different client or client library, then see the documentation\nfor your specific client or client library to determine how it handles the\nLOAD DATA LOCAL INFILE statement.\n\nIf the LOAD DATA LOCAL INFILE statement is disabled by either the server or\nthe client and if the user attempts to execute it, then the server will cause\nthe statement to fail with the following error message:\n\nThe used command is not allowed with this MariaDB version\n\nNote that it is not entirely accurate to say that the MariaDB version does not\nsupport the command. It would be more accurate to say that the MariaDB\nconfiguration does not support the command. See MDEV-20500 for more\ninformation.\n\nFrom MariaDB 10.5.2, the error message is more accurate:\n\nThe used command is not allowed because the MariaDB server or client \n has disabled the local infile capability\n\nREPLACE and IGNORE\n------------------\n\nIf you load data from a file into a table that already contains data and has a\nprimary key, you may encounter issues where the statement attempts to insert a\nrow with a primary key that already exists. When this happens, the statement\nfails with Error 1064, protecting the data already on the table. If you want\nMariaDB to overwrite duplicates, use the REPLACE keyword.\n\nThe REPLACE keyword works like the REPLACE statement. Here, the statement\nattempts to load the data from the file. If the row does not exist, it adds it\nto the table. If the row contains an existing primary key, it replaces the\ntable data. That is, in the event of a conflict, it assumes the file contains\nthe desired row.\n\nThis operation can cause a degradation in load speed by a factor of 20 or more\nif the part that has already been loaded is larger than the capacity of the\nInnoDB Buffer Pool. This happens because it causes a lot of turnaround in the\nbuffer pool.\n\nUse the IGNORE keyword when you want to skip any rows that contain a\nconflicting primary key. Here, the statement attempts to load the data from\nthe file. If the row does not exist, it adds it to the table. If the row\ncontains an existing primary key, it ignores the addition request and moves on\nto the next. That is, in the event of a conflict, it assumes the table\ncontains the desired row.\n\nCharacter-sets\n--------------\n\nWhen the statement opens the file, it attempts to read the contents using the\ndefault character-set, as defined by the character_set_database system\nvariable.\n\nIn the cases where the file was written using a character-set other than the\ndefault, you can specify the character-set to use with the CHARACTER SET\nclause in the statement. It ignores character-sets specified by the SET NAMES\nstatement and by the character_set_client system variable. Setting the\nCHARACTER SET clause to a value of binary indicates \"no conversion.\"\n\nThe statement interprets all fields in the file as having the same\ncharacter-set, regardless of the column data type. To properly interpret file\ncontents, you must ensure that it was written with the correct character-set.\nIf you write a data file with mysqldump -T or with the SELECT INTO OUTFILE\nstatement with the mysql client, be sure to use the --default-character-set\noption, so that the output is written with the desired character-set.\n\nWhen using mixed character sets, use the CHARACTER SET clause in both SELECT\nINTO OUTFILE and LOAD DATA INFILE to ensure that MariaDB correctly interprets\nthe escape sequences.\n\nThe character_set_filesystem system variable controls the interpretation of\nthe filename.\n\nIt is currently not possible to load data files that use the ucs2 character\nset.\n\nPreprocessing Inputs\n--------------------\n\ncol_name_or_user_var can be a column name, or a user variable. In the case of\na variable, the SET statement can be used to preprocess the value before\nloading into the table.\n\nPriority and Concurrency\n------------------------\n\nIn storage engines that perform table-level locking (MyISAM, MEMORY and\nMERGE), using the LOW_PRIORITY keyword, MariaDB delays insertions until no\nother clients are reading from the table. Alternatively, when using the MyISAM\nstorage engine, you can use the CONCURRENT keyword to perform concurrent\ninsertion.\n\nThe LOW_PRIORITY and CONCURRENT keywords are mutually exclusive. They cannot\nbe used in the same statement.\n\nProgress Reporting\n------------------\n\nThe LOAD DATA INFILE statement supports progress reporting. You may find this\nuseful when dealing with long-running operations. Using another client you can\nissue a SHOW PROCESSLIST query to check the progress of the data load.\n\nUsing mariadb-import/mysqlimport\n--------------------------------\n\nMariaDB ships with a separate utility for loading data from files:\nmariadb-import (or mysqlimport before MariaDB 10.5). It operates by sending\nLOAD DATA INFILE statements to the server.\n\nUsing mariadb-import/mysqlimport you can compress the file using the\n--compress option, to get better performance over slow networks, providing\nboth the client and server support the compressed protocol. Use the --local\noption to load from the local file system.\n\nIndexing\n--------\n\nIn cases where the storage engine supports ALTER TABLE... DISABLE KEYS\nstatements (MyISAM and Aria), the LOAD DATA INFILE statement automatically\ndisables indexes during the execution.\n\nExamples\n--------\n\nYou have a file with this content (note the the separator is \',\', not tab,\nwhich is the default):\n\n2,2\n3,3\n4,4\n5,5\n6,8\n\nCREATE TABLE t1 (a int, b int, c int, d int, PRIMARY KEY (a));\nLOAD DATA LOCAL INFILE \n \'/tmp/loaddata7.dat\' INTO TABLE t1 FIELDS TERMINATED BY \',\' (a,b) SET c=a+b;\nSELECT * FROM t1;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| 2 | 2 | 4 |\n| 3 | 3 | 6 |\n| 4 | 4 | 8 |\n| 5 | 5 | 10 |\n| 6 | 8 | 14 |\n+------+------+------+\n\nAnother example, given the following data (the separator is a tab):\n\n1 a\n2 b\n\nThe value of the first column is doubled before loading:\n\nLOAD DATA INFILE \'ld.txt\' INTO TABLE ld (@i,v) SET i=@i*2;\n\nSELECT * FROM ld;\n+------+------+\n| i | v |\n+------+------+\n| 2 | a |\n| 4 | b |\n+------+------+\n\nURL: https://mariadb.com/kb/en/load-data-infile/','','https://mariadb.com/kb/en/load-data-infile/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (449,27,'LOAD XML','Syntax\n------\n\nLOAD XML [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE \'file_name\'\n [REPLACE | IGNORE]\n INTO TABLE [db_name.]tbl_name\n [CHARACTER SET charset_name]\n [ROWS IDENTIFIED BY \'<tagname>\']\n [IGNORE number {LINES | ROWS}]\n [(column_or_user_var,...)]\n [SET col_name = expr,...]\n\nDescription\n-----------\n\nThe LOAD XML statement reads data from an XML file into a table. The file_name\nmust be given as a literal string. The tagname in the optional ROWS IDENTIFIED\nBY clause must also be given as a literal string, and must be surrounded by\nangle brackets (< and >).\n\nLOAD XML acts as the complement of running the mysql client in XML output mode\n(that is, starting the client with the --xml option). To write data from a\ntable to an XML file, use a command such as the following one from the system\nshell:\n\nshell> mysql --xml -e \'SELECT * FROM mytable\' > file.xml\n\nTo read the file back into a table, use LOAD XML INFILE. By default, the <row>\nelement is considered to be the equivalent of a database table row; this can\nbe changed using the ROWS IDENTIFIED BY clause.\n\nThis statement supports three different XML formats:\n\n* Column names as attributes and column values as attribute values:\n\n<row column1=\"value1\" column2=\"value2\" .../>\n\n* Column names as tags and column values as the content of these tags:\n\n<row>\n <column1>value1</column1>\n <column2>value2</column2>\n</row>\n\n* Column names are the name attributes of <field> tags, and values are\n the contents of these tags:\n\n<row>\n <field name=\'column1\'>value1</field>\n <field name=\'column2\'>value2</field>\n</row>\n\nThis is the format used by other tools, such as mysqldump.\n\nAll 3 formats can be used in the same XML file; the import routine\nautomatically detects the format for each row and interprets it correctly.\nTags are matched based on the tag or attribute name and the column name.\n\nThe following clauses work essentially the same way for LOAD XML as they do\nfor LOAD DATA:\n\n* LOW_PRIORITY or CONCURRENT\n* LOCAL\n* REPLACE or IGNORE\n* CHARACTER SET\n* (column_or_user_var,...)\n* SET\n\nSee LOAD DATA for more information about these clauses.\n\nThe IGNORE number LINES or IGNORE number ROWS clause causes the first number\nrows in the XML file to be skipped. It is analogous to the LOAD DATA\nstatement\'s IGNORE ... LINES clause.\n\nIf the LOW_PRIORITY keyword is used, insertions are delayed until no other\nclients are reading from the table. The CONCURRENT keyword allowes the use of\nconcurrent inserts. These clauses cannot be specified together.\n\nThis statement activates INSERT triggers.\n\nURL: https://mariadb.com/kb/en/load-xml/','','https://mariadb.com/kb/en/load-xml/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (450,27,'Concurrent Inserts','The MyISAM storage engine supports concurrent inserts. This feature allows\nSELECT statements to be executed during INSERT operations, reducing contention.\n\nWhether concurrent inserts can be used or not depends on the value of the\nconcurrent_insert server system variable:\n\n* NEVER (0) disables concurrent inserts.\n* AUTO (1) allows concurrent inserts only when the target table has no free\nblocks (no data in the middle of the table has been deleted after the last\nOPTIMIZE TABLE). This is the default.\n* ALWAYS (2) always enables concurrent inserts, in which case new rows are\nadded at the end of a table if the table is being used by another thread.\n\nIf the binary log is used, CREATE TABLE ... SELECT and INSERT ... SELECT\nstatements cannot use concurrent inserts. These statements acquire a read lock\non the table, so concurrent inserts will need to wait. This way the log can be\nsafely used to restore data.\n\nConcurrent inserts are not used by replicas with the row based replication\n(see binary log formats).\n\nIf an INSERT statement contain the HIGH_PRIORITY clause, concurrent inserts\ncannot be used. INSERT ... DELAYED is usually unneeded if concurrent inserts\nare enabled.\n\nLOAD DATA INFILE uses concurrent inserts if the CONCURRENT keyword is\nspecified and concurrent_insert is not NEVER. This makes the statement slower\n(even if no other sessions access the table) but reduces contention.\n\nLOCK TABLES allows non-conflicting concurrent inserts if a READ LOCAL lock is\nused. Concurrent inserts are not allowed if the LOCAL keyword is omitted.\n\nNotes\n-----\n\nThe decision to enable concurrent insert for a table is done when the table is\nopened. If you change the value of concurrent_insert it will only affect new\nopened tables. If you want it to work for also for tables in use or cached,\nyou should do FLUSH TABLES after setting the variable.\n\nURL: https://mariadb.com/kb/en/concurrent-inserts/','','https://mariadb.com/kb/en/concurrent-inserts/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (451,27,'HIGH_PRIORITY and LOW_PRIORITY','The InnoDB storage engine uses row-level locking to ensure data integrity.\nHowever some storage engines (such as MEMORY, MyISAM, Aria and MERGE) lock the\nwhole table to prevent conflicts. These storage engines use two separate\nqueues to remember pending statements; one is for SELECTs and the other one is\nfor write statements (INSERT, DELETE, UPDATE). By default, the latter has a\nhigher priority.\n\nTo give write operations a lower priority, the low_priority_updates server\nsystem variable can be set to ON. The option is available on both the global\nand session levels, and it can be set at startup or via the SET statement.\n\nWhen too many table locks have been set by write statements, some pending\nSELECTs are executed. The maximum number of write locks that can be acquired\nbefore this happens is determined by the max_write_lock_count server system\nvariable, which is dynamic.\n\nIf write statements have a higher priority (default), the priority of\nindividual write statements (INSERT, REPLACE, UPDATE, DELETE) can be changed\nvia the LOW_PRIORITY attribute, and the priority of a SELECT statement can be\nraised via the HIGH_PRIORITY attribute. Also, LOCK TABLES supports a\nLOW_PRIORITY attribute for WRITE locks.\n\nIf read statements have a higher priority, the priority of an INSERT can be\nchanged via the HIGH_PRIORITY attribute. However, the priority of other write\nstatements cannot be raised individually.\n\nThe use of LOW_PRIORITY or HIGH_PRIORITY for an INSERT prevents Concurrent\nInserts from being used.\n\nURL: https://mariadb.com/kb/en/high_priority-and-low_priority/','','https://mariadb.com/kb/en/high_priority-and-low_priority/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (452,27,'INSERT - Default & Duplicate Values','Default Values\n--------------\n\nIf the SQL_MODE contains STRICT_TRANS_TABLES and you are inserting into a\ntransactional table (like InnoDB), or if the SQL_MODE contains\nSTRICT_ALL_TABLES, all NOT NULL columns which do not have a DEFAULT value (and\nare not AUTO_INCREMENT) must be explicitly referenced in INSERT statements. If\nnot, an error like this is produced:\n\nERROR 1364 (HY000): Field \'col\' doesn\'t have a default value\n\nIn all other cases, if a NOT NULL column without a DEFAULT value is not\nreferenced, an empty value will be inserted (for example, 0 for INTEGER\ncolumns and \'\' for CHAR columns). See NULL Values in MariaDB:Inserting for\nexamples.\n\nIf a NOT NULL column having a DEFAULT value is not referenced, NULL will be\ninserted.\n\nIf a NULL column having a DEFAULT value is not referenced, its default value\nwill be inserted. It is also possible to explicitly assign the default value\nusing the DEFAULT keyword or the DEFAULT() function.\n\nIf the DEFAULT keyword is used but the column does not have a DEFAULT value,\nan error like this is produced:\n\nERROR 1364 (HY000): Field \'col\' doesn\'t have a default value\n\nDuplicate Values\n----------------\n\nBy default, if you try to insert a duplicate row and there is a UNIQUE index,\nINSERT stops and an error like this is produced:\n\nERROR 1062 (23000): Duplicate entry \'dup_value\' for key \'col\'\n\nTo handle duplicates you can use the IGNORE clause, INSERT ON DUPLICATE KEY\nUPDATE or the REPLACE statement. Note that the IGNORE and DELAYED options are\nignored when you use ON DUPLICATE KEY UPDATE.\n\nURL: https://mariadb.com/kb/en/insert-default-duplicate-values/','','https://mariadb.com/kb/en/insert-default-duplicate-values/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (453,27,'INSERT IGNORE','Ignoring Errors\n---------------\n\nNormally INSERT stops and rolls back when it encounters an error.\n\nBy using the IGNORE keyword all errors are converted to warnings, which will\nnot stop inserts of additional rows.\n\nThe IGNORE and DELAYED options are ignored when you use ON DUPLICATE KEY\nUPDATE.\n\nPrior to MySQL and MariaDB 5.5.28, no warnings were issued for duplicate key\nerrors when using IGNORE. You can get the old behavior if you set OLD_MODE to\nNO_DUP_KEY_WARNINGS_WITH_IGNORE.\n\nExamples\n--------\n\nCREATE TABLE t1 (x INT UNIQUE);\n\nINSERT INTO t1 VALUES(1),(2);\n\nINSERT INTO t1 VALUES(2),(3);\nERROR 1062 (23000): Duplicate entry \'2\' for key \'x\'\nSELECT * FROM t1;\n+------+\n| x |\n+------+\n| 1 |\n| 2 |\n+------+\n2 rows in set (0.00 sec)\n\nINSERT IGNORE INTO t1 VALUES(2),(3);\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n\nSHOW WARNINGS;\n+---------+------+---------------------------------+\n| Level | Code | Message |\n+---------+------+---------------------------------+\n| Warning | 1062 | Duplicate entry \'2\' for key \'x\' |\n+---------+------+---------------------------------+\n\nSELECT * FROM t1;\n+------+\n| x |\n+------+\n| 1 |\n| 2 |\n| 3 |\n+------+\n\nSee INSERT ON DUPLICATE KEY UPDATE for further examples using that syntax.\n\nURL: https://mariadb.com/kb/en/insert-ignore/','','https://mariadb.com/kb/en/insert-ignore/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (454,27,'INSERT ON DUPLICATE KEY UPDATE','Syntax\n------\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n\nOr:\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n\nOr:\n\nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n\nDescription\n-----------\n\nINSERT ... ON DUPLICATE KEY UPDATE is a MariaDB/MySQL extension to the INSERT\nstatement that, if it finds a duplicate unique or primary key, will instead\nperform an UPDATE.\n\nThe row/s affected value is reported as 1 if a row is inserted, and 2 if a row\nis updated, unless the API\'s CLIENT_FOUND_ROWS flag is set.\n\nIf more than one unique index is matched, only the first is updated. It is not\nrecommended to use this statement on tables with more than one unique index.\n\nIf the table has an AUTO_INCREMENT primary key and the statement inserts or\nupdates a row, the LAST_INSERT_ID() function returns its AUTO_INCREMENT value.\n\nThe VALUES() function can only be used in a ON DUPLICATE KEY UPDATE clause and\nhas no meaning in any other context. It returns the column values from the\nINSERT portion of the statement. This function is particularly useful for\nmulti-rows inserts.\n\nThe IGNORE and DELAYED options are ignored when you use ON DUPLICATE KEY\nUPDATE.\n\nSee Partition Pruning and Selection for details on the PARTITION clause.\n\nThis statement activates INSERT and UPDATE triggers. See Trigger Overview for\ndetails.\n\nSee also a similar statement, REPLACE.\n\nExamples\n--------\n\nCREATE TABLE ins_duplicate (id INT PRIMARY KEY, animal VARCHAR(30));\nINSERT INTO ins_duplicate VALUES (1,\'Aardvark\'), (2,\'Cheetah\'), (3,\'Zebra\');\n\nIf there is no existing key, the statement runs as a regular INSERT:\n\nINSERT INTO ins_duplicate VALUES (4,\'Gorilla\') \n ON DUPLICATE KEY UPDATE animal=\'Gorilla\';\nQuery OK, 1 row affected (0.07 sec)\n\nSELECT * FROM ins_duplicate;\n+----+----------+\n| id | animal |\n+----+----------+\n| 1 | Aardvark |\n| 2 | Cheetah |\n| 3 | Zebra |\n| 4 | Gorilla |\n+----+----------+\n\nA regular INSERT with a primary key value of 1 will fail, due to the existing\nkey:\n\nINSERT INTO ins_duplicate VALUES (1,\'Antelope\');\nERROR 1062 (23000): Duplicate entry \'1\' for key \'PRIMARY\'\n\nHowever, we can use an INSERT ON DUPLICATE KEY UPDATE instead:\n\nINSERT INTO ins_duplicate VALUES (1,\'Antelope\') \n ON DUPLICATE KEY UPDATE animal=\'Antelope\';\nQuery OK, 2 rows affected (0.09 sec)\n\nNote that there are two rows reported as affected, but this refers only to the\nUPDATE.\n\nSELECT * FROM ins_duplicate;\n+----+----------+\n| id | animal |\n+----+----------+\n| 1 | Antelope |\n| 2 | Cheetah |\n| 3 | Zebra |\n| 4 | Gorilla |\n+----+----------+\n\nAdding a second unique column:\n\nALTER TABLE ins_duplicate ADD id2 INT;\nUPDATE ins_duplicate SET id2=id+10;\nALTER TABLE ins_duplicate ADD UNIQUE KEY(id2);\n\nWhere two rows match the unique keys match, only the first is updated. This\ncan be unsafe and is not recommended unless you are certain what you are doing.\n\nINSERT INTO ins_duplicate VALUES (2,\'Lion\',13) \n ON DUPLICATE KEY UPDATE animal=\'Lion\';\nQuery OK, 2 rows affected (0.004 sec)\n\nSELECT * FROM ins_duplicate;\n+----+----------+------+\n| id | animal | id2 |\n+----+----------+------+\n| 1 | Antelope | 11 |\n| 2 | Lion | 12 |\n| 3 | Zebra | 13 |\n| 4 | Gorilla | 14 |\n+----+----------+------+\n\nAlthough the third row with an id of 3 has an id2 of 13, which also matched,\nit was not updated.\n\nChanging id to an auto_increment field. If a new row is added, the\nauto_increment is moved forward. If the row is updated, it remains the same.\n\nALTER TABLE `ins_duplicate` CHANGE `id` `id` INT( 11 ) NOT NULL AUTO_INCREMENT;\nALTER TABLE ins_duplicate DROP id2;\nSELECT Auto_increment FROM INFORMATION_SCHEMA.TABLES \n WHERE TABLE_NAME=\'ins_duplicate\';\n+----------------+\n| Auto_increment |\n+----------------+\n| 5 |\n+----------------+\n\nINSERT INTO ins_duplicate VALUES (2,\'Leopard\') \n ON DUPLICATE KEY UPDATE animal=\'Leopard\';\nQuery OK, 2 rows affected (0.00 sec)\n\nSELECT Auto_increment FROM INFORMATION_SCHEMA.TABLES \n WHERE TABLE_NAME=\'ins_duplicate\';\n+----------------+\n| Auto_increment |\n+----------------+\n| 5 |\n+----------------+\n\nINSERT INTO ins_duplicate VALUES (5,\'Wild Dog\') \n ON DUPLICATE KEY UPDATE animal=\'Wild Dog\';\nQuery OK, 1 row affected (0.09 sec)\n\nSELECT * FROM ins_duplicate;\n+----+----------+\n| id | animal |\n+----+----------+\n| 1 | Antelope |\n| 2 | Leopard |\n| 3 | Zebra |\n| 4 | Gorilla |\n| 5 | Wild Dog |\n+----+----------+\n\nSELECT Auto_increment FROM INFORMATION_SCHEMA.TABLES \n WHERE TABLE_NAME=\'ins_duplicate\';\n+----------------+\n| Auto_increment |\n+----------------+\n| 6 |\n+----------------+\n\nRefering to column values from the INSERT portion of the statement:\n\nINSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)\n ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);\n\nSee the VALUES() function for more.\n\nURL: https://mariadb.com/kb/en/insert-on-duplicate-key-update/','','https://mariadb.com/kb/en/insert-on-duplicate-key-update/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (455,27,'INSERT...RETURNING','MariaDB starting with 10.5.0\n----------------------------\nINSERT ... RETURNING was added in MariaDB 10.5.0, and returns a resultset of\nthe inserted rows.\n\nSyntax\n------\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nOr:\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nOr:\n\nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nDescription\n-----------\n\nINSERT ... RETURNING returns a resultset of the inserted rows.\n\nThis returns the listed columns for all the rows that are inserted, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple INSERT statements:\n\nCREATE OR REPLACE TABLE t2 (id INT, animal VARCHAR(20), t TIMESTAMP);\n\nINSERT INTO t2 (id) VALUES (2),(3) RETURNING id,t;\n+------+---------------------+\n| id | t |\n+------+---------------------+\n| 2 | 2021-04-28 00:59:32 |\n| 3 | 2021-04-28 00:59:32 |\n+------+---------------------+\n\nINSERT INTO t2(id,animal) VALUES\n(1,\'Dog\'),(2,\'Lion\'),(3,\'Tiger\'),(4,\'Leopard\') \n RETURNING id,id+id,id&id,id||id;\n+------+-------+-------+--------+\n| id | id+id | id&id | id||id |\n+------+-------+-------+--------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n| 3 | 6 | 3 | 1 |\n| 4 | 8 | 4 | 1 |\n+------+-------+-------+--------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\n\nPREPARE stmt FROM \"INSERT INTO t1 SET id1=1, animal1=\'Bear\' RETURNING f(id1),\nUPPER(animal1)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f(id1) | UPPER(animal1) |\n+---------+----------------+\n| 2 | BEAR |\n+---------+----------------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used.\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values, and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used or it can be used in\nINSERT...SELECT...RETURNING if the table in the RETURNING clause is not the\nsame as the INSERT table.\n\nURL: https://mariadb.com/kb/en/insertreturning/','','https://mariadb.com/kb/en/insertreturning/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (456,27,'REPLACE...RETURNING','MariaDB starting with 10.5.0\n----------------------------\nREPLACE ... RETURNING was added in MariaDB 10.5.0, and returns a resultset of\nthe replaced rows.\n\nSyntax\n------\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n[RETURNING select_expr \n [, select_expr ...]]\n\nOr:\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n[RETURNING select_expr \n [, select_expr ...]]\n\nOr:\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n[RETURNING select_expr \n [, select_expr ...]]\n\nDescription\n-----------\n\nREPLACE ... RETURNING returns a resultset of the replaced rows.\n\nThis returns the listed columns for all the rows that are replaced, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple REPLACE statement\n\nREPLACE INTO t2 VALUES (1,\'Leopard\'),(2,\'Dog\') RETURNING id2, id2+id2 \nas Total ,id2|id2, id2&&id2;\n+-----+-------+---------+----------+\n| id2 | Total | id2|id2 | id2&&id2 |\n+-----+-------+---------+----------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n+-----+-------+---------+----------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\nPREPARE stmt FROM \"REPLACE INTO t2 SET id2=3, animal2=\'Fox\' RETURNING f2(id2),\nUPPER(animal2)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f2(id2) | UPPER(animal2) |\n+---------+----------------+\n| 6 | FOX |\n+---------+----------------+\n\nSubqueries in the statement\n\nREPLACE INTO t1 SELECT * FROM t2 RETURNING (SELECT id2 FROM t2 WHERE \nid2 IN (SELECT id2 FROM t2 WHERE id2=1)) AS new_id;\n+--------+\n| new_id |\n+--------+\n| 1 |\n| 1 |\n| 1 |\n| 1 |\n+--------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used..\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used, or it can be used in\nREPLACE...SELECT...RETURNING if the table in the RETURNING clause is not the\nsame as the REPLACE table.\n\nURL: https://mariadb.com/kb/en/replacereturning/','','https://mariadb.com/kb/en/replacereturning/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (457,27,'CALL','Syntax\n------\n\nCALL sp_name([parameter[,...]])\nCALL sp_name[()]\n\nDescription\n-----------\n\nThe CALL statement invokes a stored procedure that was defined previously with\nCREATE PROCEDURE.\n\nStored procedure names can be specified as database_name.procedure_name.\nProcedure names and database names can be quoted with backticks (). This is\nnecessary if they are reserved words, or contain special characters. See\nidentifier qualifiers for details.\n\nCALL p() and CALL p are equivalent.\n\nIf parentheses are used, any number of spaces, tab characters and newline\ncharacters are allowed between the procedure\'s name and the open parenthesis.\n\nCALL can pass back values to its caller using parameters that are declared as\nOUT or INOUT parameters. If no value is assigned to an OUT parameter, NULL is\nassigned (and its former value is lost). To pass such values from another\nstored program you can use user-defined variables, local variables or\nroutine\'s parameters; in other contexts, you can only use user-defined\nvariables.\n\nCALL can also be executed as a prepared statement. Placeholders can be used\nfor IN parameters in all versions of MariaDB; for OUT and INOUT parameters,\nplaceholders can be used since MariaDB 5.5.\n\nWhen the procedure returns, a client program can also obtain the number of\nrows affected for the final statement executed within the routine: At the SQL\nlevel, call the ROW_COUNT() function; from the C API, call the\nmysql_affected_rows() function.\n\nIf the CLIENT_MULTI_RESULTS API flag is set, CALL can return any number of\nresultsets and the called stored procedure can execute prepared statements. If\nit is not set, at most one resultset can be returned and prepared statements\ncannot be used within procedures.\n\nURL: https://mariadb.com/kb/en/call/','','https://mariadb.com/kb/en/call/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (458,27,'DO','Syntax\n------\n\nDO expr [, expr] ...\n\nDescription\n-----------\n\nDO executes the expressions but does not return any results. In most respects,\nDO is shorthand for SELECT expr, ..., but has the advantage that it is\nslightly faster when you do not care about the result.\n\nDO is useful primarily with functions that have side effects, such as\nRELEASE_LOCK().\n\nURL: https://mariadb.com/kb/en/do/','','https://mariadb.com/kb/en/do/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (459,27,'Comment Syntax','There are three supported comment styles in MariaDB:\n\n* From a \'#\' to the end of a line:SELECT * FROM users; # This is a comment\n\n* From a \'-- \' to the end of a line. The space after the two dashes is\nrequired (as in MySQL).SELECT * FROM users; -- This is a comment\n\n* C style comments from an opening \'/*\' to a closing \'*/\'. Comments of this\nform can span multiple lines:SELECT * FROM users; /* This is a\nmulti-line\ncomment */\n\nNested comments are possible in some situations, but they are not supported or\nrecommended.\n\nExecutable Comments\n-------------------\n\nAs an aid to portability between different databases, MariaDB supports\nexecutable comments. These special comments allow you to embed SQL code which\nwill not execute when run on other databases, but will execute when run on\nMariaDB.\n\nMariaDB supports both MySQL\'s executable comment format, and a slightly\nmodified version specific to MariaDB. This way, if you have SQL code that\nworks on MySQL and MariaDB, but not other databases, you can wrap it in a\nMySQL executable comment, and if you have code that specifically takes\nadvantage of features only available in MariaDB you can use the MariaDB\nspecific format to hide the code from MySQL.\n\nExecutable Comment Syntax\n-------------------------\n\nMySQL and MariaDB executable comment syntax:\n\n/*! MySQL or MariaDB-specific code */\n\nCode that should be executed only starting from a specific MySQL or MariaDB\nversion:\n\n/*!##### MySQL or MariaDB-specific code */\n\nThe numbers, represented by \'######\' in the syntax examples above specify the\nspecific the minimum versions of MySQL and MariaDB that should execute the\ncomment. The first number is the major version, the second 2 numbers are the\nminor version and the last 2 is the patch level.\n\nFor example, if you want to embed some code that should only execute on MySQL\nor MariaDB starting from 5.1.0, you would do the following:\n\n/*!50100 MySQL and MariaDB 5.1.0 (and above) code goes here. */\n\nMariaDB-only executable comment syntax (starting from MariaDB 5.3.1):\n\n/*M! MariaDB-specific code */\n/*M!###### MariaDB-specific code */\n\nMariaDB ignores MySQL-style executable comments that have a version number in\nthe range 50700..99999. This is needed to skip features introduced in\nMySQL-5.7 that are not ported to MariaDB 10.x yet.\n\n/*!50701 MariaDB-10.x ignores MySQL-5.7 specific code */\n\nNote: comments which have a version number in the range 50700..99999 that use\nMariaDB-style executable comment syntax are still executed.\n\n/*M!50701 MariaDB-10.x does not ignore this */\n\nStatement delimiters cannot be used within executable comments.\n\nExamples\n--------\n\nIn MySQL all the following will return 2: In MariaDB, the last 2 queries would\nreturn 3.\n\nSELECT 2 /* +1 */;\nSELECT 1 /*! +1 */;\nSELECT 1 /*!50101 +1 */;\nSELECT 2 /*M! +1 */;\nSELECT 2 /*M!50301 +1 */;\n\nThe following executable statement will not work due to the delimiter inside\nthe executable portion:\n\n/*M!100100 select 1 ; */\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual\nthat corresponds to your MariaDB server version for the right syntax to use\nnear \'\' at line 1\n\nInstead, the delimiter should be placed outside the executable portion:\n\n/*M!100100 select 1 */;\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n\nURL: https://mariadb.com/kb/en/comment-syntax/','','https://mariadb.com/kb/en/comment-syntax/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (460,27,'HANDLER Commands','Syntax\n------\n\nHANDLER tbl_name OPEN [ [AS] alias]\nHANDLER tbl_name READ index_name { = | >= | <= | < } (value1,value2,...)\n [ WHERE where_condition ] [LIMIT ... ]\nHANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }\n [ WHERE where_condition ] [LIMIT ... ]\nHANDLER tbl_name READ { FIRST | NEXT }\n [ WHERE where_condition ] [LIMIT ... ]\nHANDLER tbl_name CLOSE\n\nDescription\n-----------\n\nThe HANDLER statement provides direct access to table storage engine\ninterfaces for key lookups and key or table scans. It is available for at\nleast Aria, Memory, MyISAM and InnoDB tables (and should work with most\n\'normal\' storage engines, but not with system tables, MERGE or views).\n\nHANDLER ... OPEN opens a table, allowing it to be accessible to subsequent\nHANDLER ... READ statements. The table can either be opened using an alias\n(which must then be used by HANDLER ... READ, or a table name.\n\nThe table object is only closed when HANDLER ... CLOSE is called by the\nsession, and is not shared by other sessions.\n\nPrepared statements work with HANDLER READ, which gives a much higher\nperformance (50% speedup) as there is no parsing and all data is transformed\nin binary (without conversions to text, as with the normal protocol).\n\nThe HANDLER command does not work with partitioned tables.\n\nKey Lookup\n----------\n\nA key lookup is started with:\n\nHANDLER tbl_name READ index_name { = | >= | <= | < } (value,value) [LIMIT...]\n\nThe values stands for the value of each of the key columns. For most key types\n(except for HASH keys in MEMORY storage engine) you can use a prefix subset of\nit\'s columns.\n\nIf you are using LIMIT, then in case of >= or > then there is an implicit NEXT\nimplied, while if you are using <= or < then there is an implicit PREV implied.\n\nAfter the initial read, you can use\n\nHANDLER tbl_name READ index_name NEXT [ LIMIT ... ]\nor\nHANDLER tbl_name READ index_name PREV [ LIMIT ... ]\n\nto scan the rows in key order.\n\nNote that the row order is not defined for keys with duplicated values and\nwill vary from engine to engine.\n\nKey Scans\n---------\n\nYou can scan a table in key order by doing:\n\nHANDLER tbl_name READ index_name FIRST [ LIMIT ... ]\nHANDLER tbl_name READ index_name NEXT [ LIMIT ... ]\n\nor, if the handler supports backwards key scans (most do):\n\nHANDLER tbl_name READ index_name LAST [ LIMIT ... ]\nHANDLER tbl_name READ index_name PREV [ LIMIT ... ]\n\nTable Scans\n-----------\n\nYou can scan a table in row order by doing:\n\nHANDLER tbl_name READ FIRST [ LIMIT ... ]\nHANDLER tbl_name READ NEXT [ LIMIT ... ]\n\nLimitations\n-----------\n\nAs this is a direct interface to the storage engine, some limitations may\napply for what you can do and what happens if the table changes. Here follows\nsome of the common limitations:\n\nFinding \'Old Rows\'\n------------------\n\nHANDLER READ is not transaction safe, consistent or atomic. It\'s ok for the\nstorage engine to returns rows that existed when you started the scan but that\nwere later deleted. This can happen as the storage engine may cache rows as\npart of the scan from a previous read.\n\nYou may also find rows committed since the scan originally started.\n\nInvisible Columns\n-----------------\n\nHANDLER ... READ also reads the data of invisible-columns.\n\nSystem-Versioned Tables\n-----------------------\n\nHANDLER ... READ reads everything from system-versioned tables, and so\nincludes row_start and row_end fields, as well as all rows that have since\nbeen deleted or changed, including when history partitions are used.\n\nOther Limitations\n-----------------\n\n* If you do an ALTER TABLE, all your HANDLERs for that table are automatically\nclosed.\n* If you do an ALTER TABLE for a table that is used by some other connection\nwith HANDLER, the ALTER TABLE will wait for the HANDLER to be closed.\n* For HASH keys, you must use all key parts when searching for a row.\n* For HASH keys, you can\'t do a key scan of all values. You can only find all\nrows with the same key value.\n* While each HANDLER READ command is atomic, if you do a scan in many steps,\nthen some engines may give you error 1020 if the table changed between the\ncommands. Please refer to the specific engine handler page if this happens.\n\nError Codes\n-----------\n\n* Error 1031 (ER_ILLEGAL_HA) Table storage engine for \'t1\' doesn\'t have this\noption\nIf you get this for HANDLER OPEN it means the storage engine doesn\'t support\nHANDLER calls.\nIf you get this for HANDLER READ it means you are trying to use an incomplete\nHASH key.\n\n* Error 1020 (ER_CHECKREAD) Record has changed since last read in table \'...\'\nThis means that the table changed between two reads and the handler can\'t\nhandle this case for the given scan.\n\nURL: https://mariadb.com/kb/en/handler-commands/','','https://mariadb.com/kb/en/handler-commands/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (461,27,'HANDLER for MEMORY Tables','This article explains how to use HANDLER commands efficiently with MEMORY/HEAP\ntables.\n\nIf you want to scan a table for over different key values, not just search for\nexact key values, you should create your keys with \'USING BTREE\':\n\nCREATE TABLE t1 (a INT, b INT, KEY(a), KEY b USING BTREE (b)) engine=memory;\n\nIn the above table, a is a HASH key that only supports exact matches (=) while\nb is a BTREE key that you can use to scan the table in key order, starting\nfrom start or from a given key value.\n\nThe limitations for HANDLER READ with Memory|HEAP tables are:\n\nLimitations for HASH keys\n-------------------------\n\n* You must use all key parts when searching for a row.\n* You can\'t do a key scan of all values. You can only find all rows with the\nsame key value.\n* READ NEXT gives error 1031 if the tables changed since last read.\n\nLimitations for BTREE keys\n--------------------------\n\n* READ NEXT gives error 1031 if the tables changed since last read. This\nlimitation can be lifted in the future.\n\nLimitations for table scans\n---------------------------\n\n* READ NEXT gives error 1031 if the table was truncated since last READ call.\n\nURL: https://mariadb.com/kb/en/handler-for-memory-tables/','','https://mariadb.com/kb/en/handler-for-memory-tables/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (462,27,'Useful MariaDB Queries','This page is intended to be a quick reference of commonly-used and/or useful\nqueries in MariaDB.\n\nCreating a Table\n----------------\n\nCREATE TABLE t1 ( a INT );\nCREATE TABLE t2 ( b INT );\nCREATE TABLE student_tests (\n name CHAR(10), test CHAR(10), \n score TINYINT, test_date DATE\n);\n\nSee CREATE TABLE for more.\n\nInserting Records\n-----------------\n\nINSERT INTO t1 VALUES (1), (2), (3);\nINSERT INTO t2 VALUES (2), (4);\n\nINSERT INTO student_tests \n (name, test, score, test_date) VALUES\n (\'Chun\', \'SQL\', 75, \'2012-11-05\'), \n (\'Chun\', \'Tuning\', 73, \'2013-06-14\'),\n (\'Esben\', \'SQL\', 43, \'2014-02-11\'), \n (\'Esben\', \'Tuning\', 31, \'2014-02-09\'), \n (\'Kaolin\', \'SQL\', 56, \'2014-01-01\'),\n (\'Kaolin\', \'Tuning\', 88, \'2013-12-29\'), \n (\'Tatiana\', \'SQL\', 87, \'2012-04-28\'), \n (\'Tatiana\', \'Tuning\', 83, \'2013-09-30\');\n\nSee INSERT for more.\n\nUsing AUTO_INCREMENT\n--------------------\n\nThe AUTO_INCREMENT attribute is used to automatically generate a unique\nidentity for new rows.\n\nCREATE TABLE student_details (\n id INT NOT NULL AUTO_INCREMENT, name CHAR(10), \n date_of_birth DATE, PRIMARY KEY (id)\n);\n\nWhen inserting, the id field can be omitted, and is automatically created.\n\nINSERT INTO student_details (name,date_of_birth) VALUES \n (\'Chun\', \'1993-12-31\'), \n (\'Esben\',\'1946-01-01\'),\n (\'Kaolin\',\'1996-07-16\'),\n (\'Tatiana\', \'1988-04-13\');\n\nSELECT * FROM student_details;\n+----+---------+---------------+\n| id | name | date_of_birth |\n+----+---------+---------------+\n| 1 | Chun | 1993-12-31 |\n| 2 | Esben | 1946-01-01 |\n| 3 | Kaolin | 1996-07-16 |\n| 4 | Tatiana | 1988-04-13 |\n+----+---------+---------------+\n\nSee AUTO_INCREMENT for more.\n\nQuerying from two tables on a common value\n------------------------------------------\n\nSELECT * FROM t1 INNER JOIN t2 ON t1.a = t2.b;\n\nThis kind of query is called a join - see JOINS for more.\n\nFinding the Maximum Value\n-------------------------\n\nSELECT MAX(a) FROM t1;\n+--------+\n| MAX(a) |\n+--------+\n| 3 |\n+--------+\n\nSee the MAX() function for more, as well as Finding the maximum value and\ngrouping the results below for a more practical example.\n\nFinding the Minimum Value\n-------------------------\n\nSELECT MIN(a) FROM t1;\n+--------+\n| MIN(a) |\n+--------+\n| 1 |\n+--------+\n\nSee the MIN() function for more.\n\nFinding the Average Value\n-------------------------\n\nSELECT AVG(a) FROM t1;\n+--------+\n| AVG(a) |\n+--------+\n| 2.0000 |\n+--------+\n\nSee the AVG() function for more.\n\nFinding the Maximum Value and Grouping the Results\n--------------------------------------------------\n\nSELECT name, MAX(score) FROM student_tests GROUP BY name;\n+---------+------------+\n| name | MAX(score) |\n+---------+------------+\n| Chun | 75 |\n| Esben | 43 |\n| Kaolin | 88 |\n| Tatiana | 87 |\n+---------+------------+\n\nSee the MAX() function for more.\n\nOrdering Results\n----------------\n\nSELECT name, test, score FROM student_tests ORDER BY score DESC;\n+---------+--------+-------+\n| name | test | score |\n+---------+--------+-------+\n| Kaolin | Tuning | 88 |\n| Tatiana | SQL | 87 |\n| Tatiana | Tuning | 83 |\n| Chun | SQL | 75 |\n| Chun | Tuning | 73 |\n| Kaolin | SQL | 56 |\n| Esben | SQL | 43 |\n| Esben | Tuning | 31 |\n+---------+--------+-------+\n\nSee ORDER BY for more.\n\nFinding the Row with the Minimum of a Particular Column\n-------------------------------------------------------\n\nIn this example, we want to find the lowest test score for any student.\n\nSELECT name,test, score FROM student_tests WHERE score=(SELECT MIN(score) FROM\nstudent);\n+-------+--------+-------+\n| name | test | score |\n+-------+--------+-------+\n| Esben | Tuning | 31 |\n+-------+--------+-------+\n\nFinding Rows with the Maximum Value of a Column by Group\n--------------------------------------------------------\n\nThis example returns the best test results of each student:\n\nSELECT name, test, score FROM student_tests st1 WHERE score = (\n SELECT MAX(score) FROM student st2 WHERE st1.name = st2.name\n); \n+---------+--------+-------+\n| name | test | score |\n+---------+--------+-------+\n| Chun | SQL | 75 |\n| Esben | SQL | 43 |\n| Kaolin | Tuning | 88 |\n| Tatiana | SQL | 87 |\n+---------+--------+-------+\n\nCalculating Age\n---------------\n\nThe TIMESTAMPDIFF function can be used to calculate someone\'s age:\n\nSELECT CURDATE() AS today;\n+------------+\n| today |\n+------------+\n| 2014-02-17 |\n+------------+\n\nSELECT name, date_of_birth, TIMESTAMPDIFF(YEAR,date_of_birth,\'2014-08-02\') AS\nage \n FROM student_details;\n+---------+---------------+------+\n| name | date_of_birth | age |\n+---------+---------------+------+\n| Chun | 1993-12-31 | 20 |\n| Esben | 1946-01-01 | 68 |\n| Kaolin | 1996-07-16 | 18 |\n| Tatiana | 1988-04-13 | 26 |\n+---------+---------------+------+\n\nSee TIMESTAMPDIFF() for more.\n\nUsing User-defined Variables\n----------------------------\n\nThis example sets a user-defined variable with the average test score, and\nthen uses it in a later query to return all results above the average.\n\nSELECT @avg_score:= AVG(score) FROM student_tests;\n+-------------------------+\n| @avg_score:= AVG(score) |\n+-------------------------+\n| 67.000000000 |\n+-------------------------+\n\nSELECT * FROM student_tests WHERE score > @avg_score;\n+---------+--------+-------+------------+\n| name | test | score | test_date |\n+---------+--------+-------+------------+\n| Chun | SQL | 75 | 2012-11-05 |\n| Chun | Tuning | 73 | 2013-06-14 |\n| Kaolin | Tuning | 88 | 2013-12-29 |\n| Tatiana | SQL | 87 | 2012-04-28 |\n| Tatiana | Tuning | 83 | 2013-09-30 |\n+---------+--------+-------+------------+\n\nUser-defined variables can also be used to add an incremental counter to a\nresultset:\n\nSET @count = 0;\n\nSELECT @count := @count + 1 AS counter, name, date_of_birth FROM\nstudent_details;\n+---------+---------+---------------+\n| counter | name | date_of_birth |\n+---------+---------+---------------+\n| 1 | Chun | 1993-12-31 |\n| 2 | Esben | 1946-01-01 |\n| 3 | Kaolin | 1996-07-16 |\n| 4 | Tatiana | 1988-04-13 |\n+---------+---------+---------------+\n\nSee User-defined Variables for more.\n\nView Tables in Order of Size\n----------------------------\n\nReturns a list of all tables in the database, ordered by size:\n\nSELECT table_schema as `DB`, table_name AS `Table`, \n ROUND(((data_length + index_length) / 1024 / 1024), 2) `Size (MB)`\n FROM information_schema.TABLES\n ORDER BY (data_length + index_length) DESC;\n\n+--------------------+---------------------------------------+-----------+\n| DB | Table | Size (MB) |\n+--------------------+---------------------------------------+-----------+\n| wordpress | wp_simple_history_contexts | 7.05 |\n| wordpress | wp_posts | 6.59 |\n| wordpress | wp_simple_history | 3.05 |\n| wordpress | wp_comments | 2.73 |\n| wordpress | wp_commentmeta | 2.47 |\n| wordpress | wp_simple_login_log | 2.03 |\n...\n\nRemoving Duplicates\n-------------------\n\nMariaDB starting with 10.3\n--------------------------\nThe following syntax is only valid MariaDB 10.3 and beyond:\n\nThis example assumes there\'s a unique ID, but that all other fields are\nidentical. In the example below, there are 4 records, 3 of which are\nduplicates, so two of the three duplicates need to be removed. The\nintermediate SELECT is not necessary, but demonstrates what is being returned.\n\nCREATE TABLE t (id INT, f1 VARCHAR(2));\n\nINSERT INTO t VALUES (1,\'a\'), (2,\'a\'), (3,\'b\'), (4,\'a\');\n\nSELECT * FROM t t1, t t2 WHERE t1.f1=t2.f1 AND t1.id<>t2.id AND t1.id=(\n SELECT MAX(id) FROM t tab WHERE tab.f1=t1.f1\n);\n+------+------+------+------+\n| id | f1 | id | f1 |\n+------+------+------+------+\n| 4 | a | 1 | a |\n| 4 | a | 2 | a |\n+------+------+------+------+\n\nDELETE FROM t WHERE id IN (\n SELECT t2.id FROM t t1, t t2 WHERE t1.f1=t2.f1 AND t1.id<>t2.id AND t1.id=(\n SELECT MAX(id) FROM t tab WHERE tab.f1=t1.f1\n )\n);\nQuery OK, 2 rows affected (0.120 sec)\n\nSELECT * FROM t;\n+------+------+\n| id | f1 |\n+------+------+\n| 3 | b |\n| 4 | a |\n+------+------\n\nURL: https://mariadb.com/kb/en/useful-mariadb-queries/','','https://mariadb.com/kb/en/useful-mariadb-queries/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (463,28,'ANALYZE FORMAT=JSON','ANALYZE FORMAT=JSON is a mix of the EXPLAIN FORMAT=JSON and ANALYZE statement\nfeatures. The ANALYZE FORMAT=JSON $statement will execute $statement, and then\nprint the output of EXPLAIN FORMAT=JSON, amended with data from the query\nexecution.\n\nBasic Execution Data\n--------------------\n\nYou can get the following also from tabular ANALYZE statement form:\n\n* r_rows is provided for any node that reads rows. It shows how many rows\nwere read, on average \n* r_filtered is provided whenever there is a condition that is checked. It\nshows the percentage of rows left after checking the condition.\n\nAdvanced Execution Data\n-----------------------\n\nThe most important data not available in the regular tabula ANALYZE statement\nare:\n\n* r_loops field. This shows how many times the node was executed. Most query\nplan elements have this field.\n* r_total_time_ms field. It shows how much time in total was spent executing\nthis node. If the node has subnodes, their execution time is included.\n* r_buffer_size field. Query plan nodes that make use of buffers report the\nsize of buffer that was was used.\n\nSHOW ANALYZE FORMAT=JSON\n------------------------\n\nMariaDB starting with 10.9\n--------------------------\nSHOW ANALYZE FORMAT=JSON for <connection_id> extends ANALYZE [FORMAT=JSON]\n<select> to allow one to analyze a query currently running in another\nconnection.\n\nData About Individual Query Plan Nodes\n--------------------------------------\n\n* filesort node reports whether sorting was done with LIMIT n parameter, and\nhow many rows were in the sort result. \n* block-nl-join node has r_loops field, which allows to tell whether Using\njoin buffer was efficient \n* range-checked-for-each-record reports counters that show the result of the\ncheck. \n* expression-cache is used for subqueries, and it reports how many times the\ncache was used, and what cache hit ratio was.\n* union_result node has r_rows so one can see how many rows were produced\nafter UNION operation\n* and so forth\n\nUse Cases\n---------\n\nSee Examples of ANALYZE FORMAT=JSON.\n\nURL: https://mariadb.com/kb/en/analyze-format-json/','','https://mariadb.com/kb/en/analyze-format-json/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (464,28,'ANALYZE FORMAT=JSON Examples','Example #1\n----------\n\nCustomers who have ordered more than 1M goods.\n\nANALYZE FORMAT=JSON\nSELECT COUNT(*)\nFROM customer\nWHERE\n (SELECT SUM(o_totalprice) FROM orders WHERE o_custkey=c_custkey) > 1000*1000;\n\nThe query takes 40 seconds over cold cache\n\nEXPLAIN: {\n \"query_block\": {\n \"select_id\": 1,\n \"r_loops\": 1,\n \"r_total_time_ms\": 39872,\n \"table\": {\n \"table_name\": \"customer\",\n \"access_type\": \"index\",\n \"key\": \"i_c_nationkey\",\n \"key_length\": \"5\",\n \"used_key_parts\": [\"c_nationkey\"],\n \"r_loops\": 1,\n \"rows\": 150303,\n \"r_rows\": 150000,\n \"r_total_time_ms\": 270.3,\n \"filtered\": 100,\n \"r_filtered\": 60.691,\n \"attached_condition\": \"((subquery#2) > <cache>((1000 * 1000)))\",\n \"using_index\": true\n },\n \"subqueries\": [\n {\n \"query_block\": {\n \"select_id\": 2,\n \"r_loops\": 150000,\n \"r_total_time_ms\": 39531,\n \"table\": {\n \"table_name\": \"orders\",\n \"access_type\": \"ref\",\n \"possible_keys\": [\"i_o_custkey\"],\n \"key\": \"i_o_custkey\",\n \"key_length\": \"5\",\n \"used_key_parts\": [\"o_custkey\"],\n \"ref\": [\"dbt3sf1.customer.c_custkey\"],\n \"r_loops\": 150000,\n \"rows\": 7,\n \"r_rows\": 10,\n \"r_total_time_ms\": 39208,\n \"filtered\": 100,\n \"r_filtered\": 100\n }\n }\n }\n ]\n }\n}\nANALYZE shows that 39.2 seconds were spent in the subquery, which was executed\n150K times (for every row of outer table).\n\nURL: https://mariadb.com/kb/en/analyze-formatjson-examples/','','https://mariadb.com/kb/en/analyze-formatjson-examples/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (465,28,'ANALYZE Statement','Description\n-----------\n\nThe ANALYZE statement is similar to the EXPLAIN statement. ANALYZE statement\nwill invoke the optimizer, execute the statement, and then produce EXPLAIN\noutput instead of the result set. The EXPLAIN output will be annotated with\nstatistics from statement execution.\n\nThis lets one check how close the optimizer\'s estimates about the query plan\nare to the reality. ANALYZE produces an overview, while the ANALYZE\nFORMAT=JSON command provides a more detailed view of the query plan and the\nquery execution.\n\nThe syntax is\n\nANALYZE explainable_statement;\n\nwhere the statement is any statement for which one can run EXPLAIN.\n\nCommand Output\n--------------\n\nConsider an example:\n\nANALYZE SELECT * FROM tbl1 \nWHERE key1 \n BETWEEN 10 AND 200 AND\n col1 LIKE \'foo%\'\\G\n\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: tbl1\n type: range\npossible_keys: key1\n key: key1\n key_len: 5\n ref: NULL\n rows: 181\n r_rows: 181\n filtered: 100.00\n r_filtered: 10.50\n Extra: Using index condition; Using where\n\nCompared to EXPLAIN, ANALYZE produces two extra columns:\n\n* r_rows is an observation-based counterpart of the rows column. It shows how\nmany rows were actually read from the table. \n* r_filtered is an observation-based counterpart of the filtered column. It\nshows which fraction of rows was left after applying the WHERE condition.\n\nInterpreting the Output\n-----------------------\n\nJoins\n-----\n\nLet\'s consider a more complicated example.\n\nANALYZE SELECT *\nFROM orders, customer \nWHERE\n customer.c_custkey=orders.o_custkey AND\n customer.c_acctbal < 0 AND\n orders.o_totalprice > 200*1000\n\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n| id | select_type | table | type | possible_keys | key | key_len |\nref | rows | r_rows | filtered | r_filtered | Extra |\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n| 1 | SIMPLE | customer | ALL | PRIMARY,... | NULL | NULL |\nNULL | 149095 | 150000 | 18.08 | 9.13 | Using where |\n| 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 |\ncustomer.c_custkey | 7 | 10 | 100.00 | 30.03 | Using where |\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n\nHere, one can see that\n\n* For table customer, customer.rows=149095, customer.r_rows=150000. The\nestimate for number of rows we will read was fairly precise\n* customer.filtered=18.08, customer.r_filtered=9.13. The optimizer somewhat\noverestimated the number of records that will match selectivity of condition\nattached to `customer` table (in general, when you have a full scan and\nr_filtered is less than 15%, it\'s time to consider adding an appropriate\nindex).\n* For table orders, orders.rows=7, orders.r_rows=10. This means that on\naverage, there are 7 orders for a given c_custkey, but in our case there were\n10, which is close to the expectation (when this number is consistently far\nfrom the expectation, it may be time to run ANALYZE TABLE, or even edit the\ntable statistics manually to get better query plans).\n* orders.filtered=100, orders.r_filtered=30.03. The optimizer didn\'t have any\nway to estimate which fraction of records will be left after it checks the\ncondition that is attached to table orders (it\'s orders.o_totalprice >\n200*1000). So, it used 100%. In reality, it is 30%. 30% is typically not\nselective enough to warrant adding new indexes. For joins with many tables, it\nmight be worth to collect and use column statistics for columns in question,\nthis may help the optimizer to pick a better query plan.\n\nMeaning of NULL in r_rows and r_filtered\n----------------------------------------\n\nLet\'s modify the previous example slightly\n\nANALYZE SELECT * \nFROM orders, customer \nWHERE\n customer.c_custkey=orders.o_custkey AND\n customer.c_acctbal < -0 AND\n customer.c_comment LIKE \'%foo%\' AND\n orders.o_totalprice > 200*1000;\n\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n| id | select_type | table | type | possible_keys | key | key_len |\nref | rows | r_rows | filtered | r_filtered | Extra |\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n| 1 | SIMPLE | customer | ALL | PRIMARY,... | NULL | NULL |\nNULL | 149095 | 150000 | 18.08 | 0.00 | Using where |\n| 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 |\ncustomer.c_custkey | 7 | NULL | 100.00 | NULL | Using where |\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n\nHere, one can see that orders.r_rows=NULL and orders.r_filtered=NULL. This\nmeans that table orders was not scanned even once. Indeed, we can also see\ncustomer.r_filtered=0.00. This shows that a part of WHERE attached to table\n`customer` was never satisfied (or, satisfied in less than 0.01% of cases).\n\nANALYZE FORMAT=JSON\n-------------------\n\nANALYZE FORMAT=JSON produces JSON output. It produces much more information\nthan tabular ANALYZE.\n\nNotes\n-----\n\n* ANALYZE UPDATE or ANALYZE DELETE will actually make updates/deletes (ANALYZE\nSELECT will perform the select operation and then discard the resultset).\n* PostgreSQL has a similar command, EXPLAIN ANALYZE.\n* The EXPLAIN in the slow query log feature allows MariaDB to have ANALYZE\noutput of slow queries printed into the slow query log (see MDEV-6388).\n\nURL: https://mariadb.com/kb/en/analyze-statement/','','https://mariadb.com/kb/en/analyze-statement/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (466,28,'EXPLAIN','Syntax\n------\n\nEXPLAIN tbl_name [col_name | wild]\n\nOr\n\nEXPLAIN [EXTENDED | PARTITIONS | FORMAT=JSON] \n {SELECT select_options | UPDATE update_options | DELETE delete_options}\n\nDescription\n-----------\n\nThe EXPLAIN statement can be used either as a synonym for DESCRIBE or as a way\nto obtain information about how MariaDB executes a SELECT, UPDATE or DELETE\nstatement:\n\n* \'EXPLAIN tbl_name\' is synonymous with \n \'DESCRIBE tbl_name\' or\n \'SHOW COLUMNS FROM tbl_name\'.\n* When you precede a SELECT, UPDATE or a DELETE statement with the keyword \n EXPLAIN, MariaDB displays information from the optimizer\n about the query execution plan. That is, MariaDB explains how it would\n process the SELECT, UPDATE or DELETE, including information about how tables\n are joined and in which order. EXPLAIN EXTENDED can be\n used to provide additional information.\n* EXPLAIN PARTITIONS is useful only when examining queries involving\npartitioned tables. For details, see Partition pruning and selection.\n* ANALYZE statement performs the query as well as producing EXPLAIN output,\nand provides actual as well as estimated statistics.\n* EXPLAIN output can be printed in the slow query log. See EXPLAIN in the Slow\nQuery Log for details.\n\nSHOW EXPLAIN shows the output of a running statement. In some cases, its\noutput can be closer to reality than EXPLAIN.\n\nThe ANALYZE statement runs a statement and returns information about its\nexecution plan. It also shows additional columns, to check how much the\noptimizer\'s estimation about filtering and found rows are close to reality.\n\nThere is an online EXPLAIN Analyzer that you can use to share EXPLAIN and\nEXPLAIN EXTENDED output with others.\n\nEXPLAIN can acquire metadata locks in the same way that SELECT does, as it\nneeds to know table metadata and, sometimes, data as well.\n\nColumns in EXPLAIN ... SELECT\n-----------------------------\n\n+--------------------------------------+--------------------------------------+\n| Column name | Description |\n+--------------------------------------+--------------------------------------+\n| id | Sequence number that shows in which |\n| | order tables are joined. |\n+--------------------------------------+--------------------------------------+\n| select_type | What kind of SELECT the table comes |\n| | from. |\n+--------------------------------------+--------------------------------------+\n| table | Alias name of table. Materialized |\n| | temporary tables for sub queries |\n| | are named <subquery#> |\n+--------------------------------------+--------------------------------------+\n| type | How rows are found from the table |\n| | (join type). |\n+--------------------------------------+--------------------------------------+\n| possible_keys | keys in table that could be used to |\n| | find rows in the table |\n+--------------------------------------+--------------------------------------+\n| key | The name of the key that is used to |\n| | retrieve rows. NULL is no key was |\n| | used. |\n+--------------------------------------+--------------------------------------+\n| key_len | How many bytes of the key that was |\n| | used (shows if we are using only |\n| | parts of the multi-column key). |\n+--------------------------------------+--------------------------------------+\n| ref | The reference that is used as the |\n| | key value. |\n+--------------------------------------+--------------------------------------+\n| rows | An estimate of how many rows we |\n| | will find in the table for each key |\n| | lookup. |\n+--------------------------------------+--------------------------------------+\n| Extra | Extra information about this join. |\n+--------------------------------------+--------------------------------------+\n\nHere are descriptions of the values for some of the more complex columns in\nEXPLAIN ... SELECT:\n\n\"Select_type\" Column\n--------------------\n\nThe select_type column can have the following values:\n\n+-----------------+-----------------------------------+-----------------------+\n| Value | Description | Comment |\n+-----------------+-----------------------------------+-----------------------+\n| DEPENDENT | The SUBQUERY is DEPENDENT. | |\n| SUBQUERY | | |\n+-----------------+-----------------------------------+-----------------------+\n| DEPENDENT UNION | The UNION is DEPENDENT. | |\n+-----------------+-----------------------------------+-----------------------+\n| DERIVED | The SELECT is DERIVED from the | |\n| | PRIMARY. | |\n+-----------------+-----------------------------------+-----------------------+\n| MATERIALIZED | The SUBQUERY is MATERIALIZED. | Materialized tables |\n| | | will be populated at |\n| | | first access and |\n| | | will be accessed by |\n| | | the primary key (= |\n| | | one key lookup). |\n| | | Number of rows in |\n| | | EXPLAIN shows the |\n| | | cost of populating |\n| | | the table |\n+-----------------+-----------------------------------+-----------------------+\n| PRIMARY | The SELECT is in the outermost | |\n| | query, but there is also a | |\n| | SUBQUERY within it. | |\n+-----------------+-----------------------------------+-----------------------+\n| SIMPLE | It is a simple SELECT query | |\n| | without any SUBQUERY or UNION. | |\n+-----------------+-----------------------------------+-----------------------+\n| SUBQUERY | The SELECT is a SUBQUERY of the | |\n| | PRIMARY. | |\n+-----------------+-----------------------------------+-----------------------+\n| UNCACHEABLE | The SUBQUERY is UNCACHEABLE. | |\n| SUBQUERY | | |\n+-----------------+-----------------------------------+-----------------------+\n| UNCACHEABLE | The UNION is UNCACHEABLE. | |\n| UNION | | |\n+-----------------+-----------------------------------+-----------------------+\n| UNION | The SELECT is a UNION of the | |\n| | PRIMARY. | |\n+-----------------+-----------------------------------+-----------------------+\n| UNION RESULT | The result of the UNION. | |\n+-----------------+-----------------------------------+-----------------------+\n| LATERAL DERIVED | The SELECT uses a Lateral | |\n| | Derived optimization | |\n+-----------------+-----------------------------------+-----------------------+\n\n\"Type\" Column\n-------------\n\nThis column contains information on how the table is accessed.\n\n+------------------------+---------------------------------------------------+\n| Value | Description |\n+------------------------+---------------------------------------------------+\n| ALL | A full table scan is done for the table (all |\n| | rows are read). This is bad if the table is |\n| | large and the table is joined against a previous |\n| | table! This happens when the optimizer could |\n| | not find any usable index to access rows. |\n+------------------------+---------------------------------------------------+\n| const | There is only one possibly matching row in the |\n| | table. The row is read before the optimization |\n| | phase and all columns in the table are treated |\n| | as constants. |\n+------------------------+---------------------------------------------------+\n| eq_ref | A unique index is used to find the rows. This is |\n| | the best possible plan to find the row. |\n+------------------------+---------------------------------------------------+\n| fulltext | A fulltext index is used to access the rows. |\n+------------------------+---------------------------------------------------+\n| index_merge | A \'range\' access is done for for several index |\n| | and the found rows are merged. The key column |\n| | shows which keys are used. |\n+------------------------+---------------------------------------------------+\n| index_subquery | This is similar as ref, but used for sub queries |\n| | that are transformed to key lookups. |\n+------------------------+---------------------------------------------------+\n| index | A full scan over the used index. Better than |\n| | ALL but still bad if index is large and the |\n| | table is joined against a previous table. |\n+------------------------+---------------------------------------------------+\n| range | The table will be accessed with a key over one |\n| | or more value ranges. |\n+------------------------+---------------------------------------------------+\n| ref_or_null | Like \'ref\' but in addition another search for |\n| | the \'null\' value is done if the first value was |\n| | not found. This happens usually with sub queries. |\n+------------------------+---------------------------------------------------+\n| ref | A non unique index or prefix of an unique index |\n| | is used to find the rows. Good if the prefix |\n| | doesn\'t match many rows. |\n+------------------------+---------------------------------------------------+\n| system | The table has 0 or 1 rows. |\n+------------------------+---------------------------------------------------+\n| unique_subquery | This is similar as eq_ref, but used for sub |\n| | queries that are transformed to key lookups |\n+------------------------+---------------------------------------------------+\n\n\"Extra\" Column\n--------------\n\nThis column consists of one or more of the following values, separated by \';\'\n\nNote that some of these values are detected after the optimization phase.\n\nThe optimization phase can do the following changes to the WHERE clause:\n\n* Add the expressions from the ON and USING clauses to the WHERE\n clause.\n* Constant propagation: If there is column=constant, replace all column\n instances with this constant.\n* Replace all columns from \'const\' tables with their values.\n* Remove the used key columns from the WHERE (as this will be tested as\n part of the key lookup).\n* Remove impossible constant sub expressions.\n For example WHERE \'(a=1 and a=2) OR b=1\' becomes \'b=1\'.\n* Replace columns with other columns that has identical values:\n Example: WHERE a=b and a=c may be treated\n as \'WHERE a=b and a=c and b=c\'.\n* Add extra conditions to detect impossible row conditions earlier. This\n happens mainly with OUTER JOIN where we in some cases add detection\n of NULL values in the WHERE (Part of \'Not exists\' optimization).\n This can cause an unexpected \'Using where\' in the Extra column.\n* For each table level we remove expressions that have already been tested when\n we read the previous row. Example: When joining tables t1 with t2\n using the following WHERE \'t1.a=1 and t1.a=t2.b\', we don\'t have to\n test \'t1.a=1\' when checking rows in t2 as we already know that this\n expression is true.\n\n+------------------------+---------------------------------------------------+\n| Value | Description |\n+------------------------+---------------------------------------------------+\n| const row not found | The table was a system table (a table with |\n| | should exactly one row), but no row was found. |\n+------------------------+---------------------------------------------------+\n| Distinct | If distinct optimization (remove duplicates) was |','','https://mariadb.com/kb/en/explain/');
-update help_topic set description = CONCAT(description, '\n| | used. This is marked only for the last table in |\n| | the SELECT. |\n+------------------------+---------------------------------------------------+\n| Full scan on NULL key | The table is a part of the sub query and if the |\n| | value that is used to match the sub query will |\n| | be NULL, we will do a full table scan. |\n+------------------------+---------------------------------------------------+\n| Impossible HAVING | The used HAVING clause is always false so the |\n| | SELECT will return no rows. |\n+------------------------+---------------------------------------------------+\n| Impossible WHERE | The used WHERE clause is always false so the |\n| noticed after reading | SELECT will return no rows. This case was |\n| const tables. | detected after we had read all \'const\' tables |\n| | and used the column values as constant in the |\n| | WHERE clause. For example: WHERE const_column=5 |\n| | and const_column had a value of 4. |\n+------------------------+---------------------------------------------------+\n| Impossible WHERE | The used WHERE clause is always false so the |\n| | SELECT will return no rows. For example: WHERE |\n| | 1=2 |\n+------------------------+---------------------------------------------------+\n| No matching min/max | During early optimization of MIN()/MAX() values |\n| row | it was detected that no row could match the |\n| | WHERE clause. The MIN()/MAX() function will |\n| | return NULL. |\n+------------------------+---------------------------------------------------+\n| no matching row in | The table was a const table (a table with only |\n| const table | one possible matching row), but no row was found. |\n+------------------------+---------------------------------------------------+\n| No tables used | The SELECT was a sub query that did not use any |\n| | tables. For example a there was no FROM clause |\n| | or a FROM DUAL clause. |\n+------------------------+---------------------------------------------------+\n| Not exists | Stop searching after more row if we find one |\n| | single matching row. This optimization is used |\n| | with LEFT JOIN where one is explicitly searching |\n| | for rows that doesn\'t exists in the LEFT JOIN |\n| | TABLE. Example: SELECT * FROM t1 LEFT JOIN t2 on |\n| | (...) WHERE t2.not_null_column IS NULL. As |\n| | t2.not_null_column can only be NULL if there was |\n| | no matching row for on condition, we can stop |\n| | searching if we find a single matching row. |\n+------------------------+---------------------------------------------------+\n| Open_frm_only | For information_schema tables. Only the frm |\n| | (table definition file was opened) was opened |\n| | for each matching row. |\n+------------------------+---------------------------------------------------+\n| Open_full_table | For information_schema tables. A full table open |\n| | for each matching row is done to retrieve the |\n| | requested information. (Slow) |\n+------------------------+---------------------------------------------------+\n| Open_trigger_only | For information_schema tables. Only the trigger |\n| | file definition was opened for each matching row. |\n+------------------------+---------------------------------------------------+\n| Range checked for | This only happens when there was no good default |\n| each record (index | index to use but there may some index that could |\n| map: ...) | be used when we can treat all columns from |\n| | previous table as constants. For each row |\n| | combination the optimizer will decide which |\n| | index to use (if any) to fetch a row from this |\n| | table. This is not fast, but faster than a full |\n| | table scan that is the only other choice. The |\n| | index map is a bitmask that shows which index |\n| | are considered for each row condition. |\n+------------------------+---------------------------------------------------+\n| Scanned 0/1/all | For information_schema tables. Shows how many |\n| databases | times we had to do a directory scan. |\n+------------------------+---------------------------------------------------+\n| Select tables | All tables in the join was optimized away. This |\n| optimized away | happens when we are only using COUNT(*), MIN() |\n| | and MAX() functions in the SELECT and we where |\n| | able to replace all of these with constants. |\n+------------------------+---------------------------------------------------+\n| Skip_open_table | For information_schema tables. The queried table |\n| | didn\'t need to be opened. |\n+------------------------+---------------------------------------------------+\n| unique row not found | The table was detected to be a const table (a |\n| | table with only one possible matching row) |\n| | during the early optimization phase, but no row |\n| | was found. |\n+------------------------+---------------------------------------------------+\n| Using filesort | Filesort is needed to resolve the query. This |\n| | means an extra phase where we first collect all |\n| | columns to sort, sort them with a disk based |\n| | merge sort and then use the sorted set to |\n| | retrieve the rows in sorted order. If the column |\n| | set is small, we store all the columns in the |\n| | sort file to not have to go to the database to |\n| | retrieve them again. |\n+------------------------+---------------------------------------------------+\n| Using index | Only the index is used to retrieve the needed |\n| | information from the table. There is no need to |\n| | perform an extra seek to retrieve the actual |\n| | record. |\n+------------------------+---------------------------------------------------+\n| Using index condition | Like \'Using where\' but the where condition is |\n| | pushed down to the table engine for internal |\n| | optimization at the index level. |\n+------------------------+---------------------------------------------------+\n| Using index | Like \'Using index condition\' but in addition we |\n| condition(BKA) | use batch key access to retrieve rows. |\n+------------------------+---------------------------------------------------+\n| Using index for | The index is being used to resolve a GROUP BY or |\n| group-by | DISTINCT query. The rows are not read. This is |\n| | very efficient if the table has a lot of |\n| | identical index entries as duplicates are |\n| | quickly jumped over. |\n+------------------------+---------------------------------------------------+\n| Using intersect(...) | For index_merge joins. Shows which index are |\n| | part of the intersect. |\n+------------------------+---------------------------------------------------+\n| Using join buffer | We store previous row combinations in a row |\n| | buffer to be able to match each row against all |\n| | of the rows combinations in the join buffer at |\n| | one go. |\n+------------------------+---------------------------------------------------+\n| Using sort_union(...) | For index_merge joins. Shows which index are |\n| | part of the union. |\n+------------------------+---------------------------------------------------+\n| Using temporary | A temporary table is created to hold the result. |\n| | This typically happens if you are using GROUP |\n| | BY, DISTINCT or ORDER BY. |\n+------------------------+---------------------------------------------------+\n| Using where | A WHERE expression (in additional to the |\n| | possible key lookup) is used to check if the row |\n| | should be accepted. If you don\'t have \'Using |\n| | where\' together with a join type of ALL, you are |\n| | probably doing something wrong! |\n+------------------------+---------------------------------------------------+\n| Using where with | Like \'Using where\' but the where condition is |\n| pushed condition | pushed down to the table engine for internal |\n| | optimization at the row level. |\n+------------------------+---------------------------------------------------+\n| Using buffer | The UPDATE statement will first buffer the rows, |\n| | and then run the updates, rather than do updates |\n| | on the fly. See Using Buffer UPDATE Algorithm |\n| | for a detailed explanation. |\n+------------------------+---------------------------------------------------+\n\nEXPLAIN EXTENDED\n----------------\n\nThe EXTENDED keyword adds another column, filtered, to the output. This is a\npercentage estimate of the table rows that will be filtered by the condition.\n\nAn EXPLAIN EXTENDED will always throw a warning, as it adds extra Message\ninformation to a subsequent SHOW WARNINGS statement. This includes what the\nSELECT query would look like after optimizing and rewriting rules are applied\nand how the optimizer qualifies columns and tables.\n\nExamples\n--------\n\nAs synonym for DESCRIBE or SHOW COLUMNS FROM:\n\nDESCRIBE city;\n+------------+----------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+------------+----------+------+-----+---------+----------------+\n| Id | int(11) | NO | PRI | NULL | auto_increment |\n| Name | char(35) | YES | | NULL | |\n| Country | char(3) | NO | UNI | | |\n| District | char(20) | YES | MUL | | |\n| Population | int(11) | YES | | NULL | |\n+------------+----------+------+-----+---------+----------------+\n\nA simple set of examples to see how EXPLAIN can identify poor index usage:\n\nCREATE TABLE IF NOT EXISTS `employees_example` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `first_name` varchar(30) NOT NULL,\n `last_name` varchar(40) NOT NULL,\n `position` varchar(25) NOT NULL,\n `home_address` varchar(50) NOT NULL,\n `home_phone` varchar(12) NOT NULL,\n `employee_code` varchar(25) NOT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `employee_code` (`employee_code`),\n KEY `first_name` (`first_name`,`last_name`)\n) ENGINE=Aria;\n\nINSERT INTO `employees_example` (`first_name`, `last_name`, `position`,\n`home_address`, `home_phone`, `employee_code`)\n VALUES\n (\'Mustapha\', \'Mond\', \'Chief Executive Officer\', \'692 Promiscuous Plaza\',\n\'326-555-3492\', \'MM1\'),\n (\'Henry\', \'Foster\', \'Store Manager\', \'314 Savage Circle\', \'326-555-3847\',\n\'HF1\'),\n (\'Bernard\', \'Marx\', \'Cashier\', \'1240 Ambient Avenue\', \'326-555-8456\', \'BM1\'),\n (\'Lenina\', \'Crowne\', \'Cashier\', \'281 Bumblepuppy Boulevard\', \'328-555-2349\',\n\'LC1\'),\n (\'Fanny\', \'Crowne\', \'Restocker\', \'1023 Bokanovsky Lane\', \'326-555-6329\',\n\'FC1\'),\n (\'Helmholtz\', \'Watson\', \'Janitor\', \'944 Soma Court\', \'329-555-2478\', \'HW1\');\n\nSHOW INDEXES FROM employees_example;\n+-------------------+------------+---------------+--------------+--------------\n+-----------+-------------+----------+--------+------+------------+---------+--\n------------+\n| Table | Non_unique | Key_name | Seq_in_index | Column_name \n | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |\nIndex_comment |\n+-------------------+------------+---------------+--------------+--------------\n+-----------+-------------+----------+--------+------+------------+---------+--\n------------+\n| employees_example | 0 | PRIMARY | 1 | id \n | A | 7 | NULL | NULL | | BTREE | |\n |\n| employees_example | 0 | employee_code | 1 |\nemployee_code | A | 7 | NULL | NULL | | BTREE \n | | |\n| employees_example | 1 | first_name | 1 | first_name \n | A | NULL | NULL | NULL | | BTREE | |\n |') WHERE help_topic_id = 466;
-update help_topic set description = CONCAT(description, '\n| employees_example | 1 | first_name | 2 | last_name \n | A | NULL | NULL | NULL | | BTREE | |\n |\n+-------------------+------------+---------------+--------------+--------------\n+-----------+-------------+----------+--------+------+------------+---------+--\n------------+\n\nSELECT on a primary key:\n\nEXPLAIN SELECT * FROM employees_example WHERE id=1;\n+------+-------------+-------------------+-------+---------------+---------+---\n-----+-------+------+-------+\n| id | select_type | table | type | possible_keys | key |\nkey_len | ref | rows | Extra |\n+------+-------------+-------------------+-------+---------------+---------+---\n-----+-------+------+-------+\n| 1 | SIMPLE | employees_example | const | PRIMARY | PRIMARY | 4\n | const | 1 | |\n+------+-------------+-------------------+-------+---------------+---------+---\n-----+-------+------+-------+\n\nThe type is const, which means that only one possible result could be\nreturned. Now, returning the same record but searching by their phone number:\n\nEXPLAIN SELECT * FROM employees_example WHERE home_phone=\'326-555-3492\';\n+------+-------------+-------------------+------+---------------+------+-------\n-+------+------+-------------+\n| id | select_type | table | type | possible_keys | key |\nkey_len | ref | rows | Extra |\n+------+-------------+-------------------+------+---------------+------+-------\n-+------+------+-------------+\n| 1 | SIMPLE | employees_example | ALL | NULL | NULL | NULL \n | NULL | 6 | Using where |\n+------+-------------+-------------------+------+---------------+------+-------\n-+------+------+-------------+\n\nHere, the type is All, which means no index could be used. Looking at the rows\ncount, a full table scan (all six rows) had to be performed in order to\nretrieve the record. If it\'s a requirement to search by phone number, an index\nwill have to be created.\n\nSHOW EXPLAIN example:\n\nSHOW EXPLAIN FOR 1;\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n| id | select_type | table | type | possible_keys | key | key_len | ref |\nrows | Extra |\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n| 1 | SIMPLE | tbl | index | NULL | a | 5 | NULL |\n1000107 | Using index |\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n1 row in set, 1 warning (0.00 sec)\n\nExample of ref_or_null Optimization\n-----------------------------------\n\nSELECT * FROM table_name\n WHERE key_column=expr OR key_column IS NULL;\n\nref_or_null is something that often happens when you use subqueries with NOT\nIN as then one has to do an extra check for NULL values if the first value\ndidn\'t have a matching row.\n\nURL: https://mariadb.com/kb/en/explain/') WHERE help_topic_id = 466;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (467,28,'EXPLAIN ANALYZE','The syntax for the EXPLAIN ANALYZE feature was changed to ANALYZE statement,\navailable since MariaDB 10.1.0. See ANALYZE statement.\n\nURL: https://mariadb.com/kb/en/explain-analyze/','','https://mariadb.com/kb/en/explain-analyze/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (468,28,'EXPLAIN FORMAT=JSON','Synopsis\n--------\n\nEXPLAIN FORMAT=JSON is a variant of EXPLAIN command that produces output in\nJSON form. The output always has one row which has only one column titled\n\"JSON\". The contents are a JSON representation of the query plan, formatted\nfor readability:\n\nEXPLAIN FORMAT=JSON SELECT * FROM t1 WHERE col1=1\\G\n\n*************************** 1. row ***************************\nEXPLAIN: {\n \"query_block\": {\n \"select_id\": 1,\n \"table\": {\n \"table_name\": \"t1\",\n \"access_type\": \"ALL\",\n \"rows\": 1000,\n \"filtered\": 100,\n \"attached_condition\": \"(t1.col1 = 1)\"\n }\n }\n}\n\nOutput is different from MySQL\n------------------------------\n\nThe output of MariaDB\'s EXPLAIN FORMAT=JSON is different from EXPLAIN\nFORMAT=JSON in MySQL.The reasons for that are:\n\n* MySQL\'s output has deficiencies. Some are listed here: EXPLAIN FORMAT=JSON\nin MySQL\n* The output of MySQL\'s EXPLAIN FORMAT=JSON is not defined. Even MySQL\nWorkbench has trouble parsing it (see this blog post).\n* MariaDB has query optimizations that MySQL does not have. Ergo, MariaDB\ngenerates query plans that MySQL does not generate.\n\nA (as yet incomplete) list of how MariaDB\'s output is different from MySQL can\nbe found here: EXPLAIN FORMAT=JSON differences from MySQL.\n\nOutput Format\n-------------\n\nTODO: MariaDB\'s output format description.\n\nURL: https://mariadb.com/kb/en/explain-format-json/','','https://mariadb.com/kb/en/explain-format-json/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (469,28,'DESCRIBE','Syntax\n------\n\n{DESCRIBE | DESC} tbl_name [col_name | wild]\n\nDescription\n-----------\n\nDESCRIBE provides information about the columns in a table. It is a shortcut\nfor SHOW COLUMNS FROM. These statements also display information for views.\n\ncol_name can be a column name, or a string containing the SQL \"%\" and \"_\"\nwildcard characters to obtain output only for the columns with names matching\nthe string. There is no need to enclose the string within quotes unless it\ncontains spaces or other special characters.\n\nDESCRIBE city;\n+------------+----------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+------------+----------+------+-----+---------+----------------+\n| Id | int(11) | NO | PRI | NULL | auto_increment |\n| Name | char(35) | YES | | NULL | |\n| Country | char(3) | NO | UNI | | |\n| District | char(20) | YES | MUL | | |\n| Population | int(11) | YES | | NULL | |\n+------------+----------+------+-----+---------+----------------+\n\nThe description for SHOW COLUMNS provides more information about the output\ncolumns.\n\nURL: https://mariadb.com/kb/en/describe/','','https://mariadb.com/kb/en/describe/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (470,29,'Identifier Names','Databases, tables, indexes, columns, aliases, views, stored routines,\ntriggers, events, variables, partitions, tablespaces, savepoints, labels,\nusers, roles, are collectively known as identifiers, and have certain rules\nfor naming.\n\nIdentifiers may be quoted using the backtick character - `. Quoting is\noptional for identifiers that don\'t contain special characters, or for\nidentifiers that are not reserved words. If the ANSI_QUOTES SQL_MODE flag is\nset, double quotes (\") can also be used to quote identifiers. If the MSSQL\nflag is set, square brackets ([ and ]) can be used for quoting.\n\nEven when using reserved words as names, fully qualified names do not need to\nbe quoted. For example, test.select has only one possible meaning, so it is\ncorrectly parsed even without quotes.\n\nUnquoted\n--------\n\nThe following characters are valid, and allow identifiers to be unquoted:\n\n* ASCII: [0-9,a-z,A-Z$_] (numerals 0-9, basic Latin letters, both lowercase\nand uppercase, dollar sign, underscore)\n* Extended: U+0080 .. U+FFFF\n\nQuoted\n------\n\nThe following characters are valid, but identifiers using them must be quoted:\n\n* ASCII: U+0001 .. U+007F (full Unicode Basic Multilingual Plane (BMP) except\nfor U+0000)\n* Extended: U+0080 .. U+FFFF \n* Identifier quotes can themselves be used as part of an identifier, as long\nas they are quoted.\n\nFurther Rules\n-------------\n\nThere are a number of other rules for identifiers:\n\n* Identifiers are stored as Unicode (UTF-8)\n* Identifiers may or may not be case-sensitive. See Indentifier\nCase-sensitivity.\n* Database, table and column names can\'t end with space characters\n* Identifier names may begin with a numeral, but can\'t only contain numerals\nunless quoted.\n* An identifier starting with a numeral, followed by an \'e\', may be parsed as\na floating point number, and needs to be quoted.\n* Identifiers are not permitted to contain the ASCII NUL character (U+0000)\nand supplementary characters (U+10000 and higher).\n* Names such as 5e6, 9e are not prohibited, but it\'s strongly recommended not\nto use them, as they could lead to ambiguity in certain contexts, being\ntreated as a number or expression.\n* User variables cannot be used as part of an identifier, or as an identifier\nin an SQL statement.\n\nQuote Character\n---------------\n\nThe regular quote character is the backtick character - `, but if the\nANSI_QUOTES SQL_MODE option is specified, a regular double quote - \" may be\nused as well.\n\nThe backtick character can be used as part of an identifier. In that case the\nidentifier needs to be quoted. The quote character can be the backtick, but in\nthat case, the backtick in the name must be escaped with another backtick.\n\nMaximum Length\n--------------\n\n* Databases, tables, columns, indexes, constraints, stored routines, triggers,\nevents, views, tablespaces, servers and log file groups have a maximum length\nof 64 characters.\n* Compound statement labels have a maximum length of 16 characters\n* Aliases have a maximum length of 256 characters, except for column aliases\nin CREATE VIEW statements, which are checked against the maximum column length\nof 64 characters (not the maximum alias length of 256 characters).\n* Users have a maximum length of 80 characters.\n* Roles have a maximum length of 128 characters.\n* Multi-byte characters do not count extra towards towards the character limit.\n\nMultiple Identifiers\n--------------------\n\nMariaDB allows the column name to be used on its own if the reference will be\nunambiguous, or the table name to be used with the column name, or all three\nof the database, table and column names. A period is used to separate the\nidentifiers, and the period can be surrounded by spaces.\n\nExamples\n--------\n\nUsing the period to separate identifiers:\n\nCREATE TABLE t1 (i int);\n\nINSERT INTO t1(i) VALUES (10);\n\nSELECT i FROM t1;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nSELECT t1.i FROM t1;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nSELECT test.t1.i FROM t1;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nThe period can be separated by spaces:\n\nSELECT test . t1 . i FROM t1;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nResolving ambiguity:\n\nCREATE TABLE t2 (i int);\n\nSELECT i FROM t1 LEFT JOIN t2 ON t1.i=t2.i;\nERROR 1052 (23000): Column \'i\' in field list is ambiguous\n\nSELECT t1.i FROM t1 LEFT JOIN t2 ON t1.i=t2.i;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nCreating a table with characters that require quoting:\n\nCREATE TABLE 123% (i int);\nERROR 1064 (42000): You have an error in your SQL syntax; \n check the manual that corresponds to your MariaDB server version for the\nright syntax \n to use near \'123% (i int)\' at line 1\n\nCREATE TABLE `123%` (i int);\nQuery OK, 0 rows affected (0.85 sec)\n\nCREATE TABLE `TABLE` (i int);\nQuery OK, 0 rows affected (0.36 sec)\n\nUsing double quotes as a quoting character:\n\nCREATE TABLE \"SELECT\" (i int);\nERROR 1064 (42000): You have an error in your SQL syntax; \n check the manual that corresponds to your MariaDB server version for the\nright syntax \n to use near \'\"SELECT\" (i int)\' at line 1\n\nSET sql_mode=\'ANSI_QUOTES\';\nQuery OK, 0 rows affected (0.03 sec)\n\nCREATE TABLE \"SELECT\" (i int);\nQuery OK, 0 rows affected (0.46 sec)\n\nUsing an identifier quote as part of an identifier name:\n\nSHOW VARIABLES LIKE \'sql_mode\';\n+---------------+-------------+\n| Variable_name | Value |\n+---------------+-------------+\n| sql_mode | ANSI_QUOTES |\n+---------------+-------------+\n\nCREATE TABLE \"fg`d\" (i int);\nQuery OK, 0 rows affected (0.34 sec)\n\nCreating the table named * (Unicode number: U+002A) requires quoting.\n\nCREATE TABLE `*` (a INT);\n\nFloating point ambiguity:\n\nCREATE TABLE 8984444cce5d (x INT);\nQuery OK, 0 rows affected (0.38 sec)\n\nCREATE TABLE 8981e56cce5d (x INT);\nERROR 1064 (42000): You have an error in your SQL syntax; \n check the manual that corresponds to your MariaDB server version for the\nright syntax \n to use near \'8981e56cce5d (x INT)\' at line 1\n\nCREATE TABLE `8981e56cce5d` (x INT);\nQuery OK, 0 rows affected (0.39 sec)\n\nURL: https://mariadb.com/kb/en/identifier-names/','','https://mariadb.com/kb/en/identifier-names/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (471,29,'Identifier Case-sensitivity','Whether objects are case-sensitive or not is partly determined by the\nunderlying operating system. Unix-based systems are case-sensitive, Windows is\nnot, while Mac OS X is usually case-insensitive by default, but devices can be\nconfigured as case-sensitive using Disk Utility.\n\nDatabase, table, table aliases and trigger names are affected by the systems\ncase-sensitivity, while index, column, column aliases, stored routine and\nevent names are never case sensitive.\n\nLog file group name are case sensitive.\n\nThe lower_case_table_names server system variable plays a key role. It\ndetermines whether table names, aliases and database names are compared in a\ncase-sensitive manner. If set to 0 (the default on Unix-based systems), table\nnames and aliases and database names are compared in a case-sensitive manner.\nIf set to 1 (the default on Windows), names are stored in lowercase and not\ncompared in a case-sensitive manner. If set to 2 (the default on Mac OS X),\nnames are stored as declared, but compared in lowercase.\n\nIt is thus possible to make Unix-based systems behave like Windows and ignore\ncase-sensitivity, but the reverse is not true, as the underlying Windows\nfilesystem can not support this.\n\nEven on case-insensitive systems, you are required to use the same case\nconsistently within the same statement. The following statement fails, as it\nrefers to the table name in a different case.\n\nSELECT * FROM a_table WHERE A_table.id>10;\n\nFor a full list of identifier naming rules, see Identifier Names.\n\nPlease note that lower_case_table_names is a database initialization\nparameter. This means that, along with innodb_page_size, this variable must be\nset before running mysql_install_db, and will not change the behavior of\nservers unless applied before the creation of core system databases.\n\nURL: https://mariadb.com/kb/en/identifier-case-sensitivity/','','https://mariadb.com/kb/en/identifier-case-sensitivity/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (472,29,'Binary Literals','Binary literals can be written in one of the following formats: b\'value\',\nB\'value\' or 0bvalue, where value is a string composed by 0 and 1 digits.\n\nBinary literals are interpreted as binary strings, and are convenient to\nrepresent VARBINARY, BINARY or BIT values.\n\nTo convert a binary literal into an integer, just add 0.\n\nExamples\n--------\n\nPrinting the value as a binary string:\n\nSELECT 0b1000001;\n+-----------+\n| 0b1000001 |\n+-----------+\n| A |\n+-----------+\n\nConverting the same value into a number:\n\nSELECT 0b1000001+0;\n+-------------+\n| 0b1000001+0 |\n+-------------+\n| 65 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/binary-literals/','','https://mariadb.com/kb/en/binary-literals/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (473,29,'Boolean Literals','In MariaDB, FALSE is a synonym of 0 and TRUE is a synonym of 1. These\nconstants are case insensitive, so TRUE, True, and true are equivalent.\n\nThese terms are not synonyms of 0 and 1 when used with the IS operator. So,\nfor example, 10 IS TRUE returns 1, while 10 = TRUE returns 0 (because 1 != 10).\n\nThe IS operator accepts a third constant exists: UNKNOWN. It is always a\nsynonym of NULL.\n\nTRUE and FALSE are reserved words, while UNKNOWN is not.\n\nURL: https://mariadb.com/kb/en/sql-language-structure-boolean-literals/','','https://mariadb.com/kb/en/sql-language-structure-boolean-literals/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (474,29,'Date and Time Literals','Standard syntaxes\n-----------------\n\nMariaDB supports the SQL standard and ODBC syntaxes for DATE, TIME and\nTIMESTAMP literals.\n\nSQL standard syntax:\n\n* DATE \'string\'\n* TIME \'string\'\n* TIMESTAMP \'string\'\n\nODBC syntax:\n\n* {d \'string\'}\n* {t \'string\'}\n* {ts \'string\'}\n\nThe timestamp literals are treated as DATETIME literals, because in MariaDB\nthe range of DATETIME is closer to the TIMESTAMP range in the SQL standard.\n\nstring is a string in a proper format, as explained below.\n\nDATE literals\n-------------\n\nA DATE string is a string in one of the following formats: \'YYYY-MM-DD\' or\n\'YY-MM-DD\'. Note that any punctuation character can be used as delimiter. All\ndelimiters must consist of 1 character. Different delimiters can be used in\nthe same string. Delimiters are optional (but if one delimiter is used, all\ndelimiters must be used).\n\nA DATE literal can also be an integer, in one of the following formats:\nYYYYMMDD or YYMMDD.\n\nAll the following DATE literals are valid, and they all represent the same\nvalue:\n\n\'19940101\'\n\'940101\'\n\'1994-01-01\'\n\'94/01/01\'\n\'1994-01/01\'\n\'94:01!01\'\n19940101\n940101\n\nDATETIME literals\n-----------------\n\nA DATETIME string is a string in one of the following formats: \'YYYY-MM-DD\nHH:MM:SS\' or \'YY-MM-DD HH:MM:SS\'. Note that any punctuation character can be\nused as delimiter for the date part and for the time part. All delimiters must\nconsist of 1 character. Different delimiters can be used in the same string.\nThe hours, minutes and seconds parts can consist of one character. For this\nreason, delimiters are mandatory for DATETIME literals.\n\nThe delimiter between the date part and the time part can be a T or any\nsequence of space characters (including tabs, new lines and carriage returns).\n\nA DATETIME literal can also be a number, in one of the following formats:\nYYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD or YYMMDD. In this case, all the time\nsubparts must consist of 2 digits.\n\nAll the following DATE literals are valid, and they all represent the same\nvalue:\n\n\'1994-01-01T12:30:03\'\n\'1994/01/01\\n\\t 12+30+03\'\n\'1994/01\\\\01\\n\\t 12+30-03\'\n\'1994-01-01 12:30:3\'\n\nTIME literals\n-------------\n\nA TIME string is a string in one of the following formats: \'D HH:MM:SS\',\n\'HH:MM:SS, \'D HH:MM\', \'HH:MM\', \'D HH\', or \'SS\'. D is a value from 0 to 34\nwhich represents days. : is the only allowed delimiter for TIME literals.\nDelimiters are mandatory, with an exception: the \'HHMMSS\' format is allowed.\nWhen delimiters are used, each part of the literal can consist of one\ncharacter.\n\nA TIME literal can also be a number in one of the following formats: HHMMSS,\nMMSS, or SS.\n\nThe following literals are equivalent:\n\n\'09:05:00\'\n\'9:05:0\'\n\'9:5:0\'\n\'090500\'\n\n2-digit years\n-------------\n\nThe year part in DATE and DATETIME literals is determined as follows:\n\n* 70 - 99 = 1970 - 1999\n* 00 - 69 = 2000 - 2069\n\nMicroseconds\n------------\n\nDATETIME and TIME literals can have an optional microseconds part. For both\nstring and numeric forms, it is expressed as a decimal part. Up to 6 decimal\ndigits are allowed. Examples:\n\n\'12:30:00.123456\'\n123000.123456\n\nSee Microseconds in MariaDB for details.\n\nDate and time literals and the SQL_MODE\n---------------------------------------\n\nUnless the SQL_MODE NO_ZERO_DATE flag is set, some special values are allowed:\nthe \'0000-00-00\' DATE, the \'00:00:00\' TIME, and the 0000-00-00 00:00:00\nDATETIME.\n\nIf the ALLOW_INVALID_DATES flag is set, the invalid dates (for example, 30th\nFebruary) are allowed. If not, if the NO_ZERO_DATE is set, an error is\nproduced; otherwise, a zero-date is returned.\n\nUnless the NO_ZERO_IN_DATE flag is set, each subpart of a date or time value\n(years, hours...) can be set to 0.\n\nURL: https://mariadb.com/kb/en/date-and-time-literals/','','https://mariadb.com/kb/en/date-and-time-literals/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (475,29,'Hexadecimal Literals','Hexadecimal literals can be written using any of the following syntaxes:\n\n* x\'value\'\n* X\'value\' (SQL standard)\n* 0xvalue (ODBC)\n\nvalue is a sequence of hexadecimal digits (from 0 to 9 and from A to F). The\ncase of the digits does not matter. With the first two syntaxes, value must\nconsist of an even number of digits. With the last syntax, digits can be even,\nand they are treated as if they had an extra 0 at the beginning.\n\nNormally, hexadecimal literals are interpreted as binary string, where each\npair of digits represents a character. When used in a numeric context, they\nare interpreted as integers. (See the example below). In no case can a\nhexadecimal literal be a decimal number.\n\nThe first two syntaxes; X\'value\' and x\'value, follow the SQL standard, and\nbehave as a string in all contexts in MariaDB since MariaDB 10.0.3 and MariaDB\n5.5.31 (fixing MDEV-4489). The latter syntax, 0xvalue, is a MySQL/MariaDB\nextension for hex hybrids and behaves as a string or as a number depending on\ncontext. MySQL treats all syntaxes the same, so there may be different results\nin MariaDB and MySQL (see below).\n\nExamples\n--------\n\nRepresenting the a character with the three syntaxes explained above:\n\nSELECT x\'61\', X\'61\', 0x61;\n+-------+-------+------+\n| x\'61\' | X\'61\' | 0x61 |\n+-------+-------+------+\n| a | a | a |\n+-------+-------+------+\n\nHexadecimal literals in a numeric context:\n\nSELECT 0 + 0xF, -0xF;\n+---------+------+\n| 0 + 0xF | -0xF |\n+---------+------+\n| 15 | -15 |\n+---------+------+\n\nFun with Types\n--------------\n\nCREATE TABLE t1 (a INT, b VARCHAR(10));\nINSERT INTO t1 VALUES (0x31, 0x61),(COALESCE(0x31), COALESCE(0x61));\n\nSELECT * FROM t1;\n+------+------+\n| a | b |\n+------+------+\n| 49 | a |\n| 1 | a |\n+------+------+\n\nThe reason for the differing results above is that when 0x31 is inserted\ndirectly to the column, it\'s treated as a number, while when 0x31 is passed to\nCOALESCE(), it\'s treated as a string, because:\n\n* HEX values have a string data type by default.\n* COALESCE() has the same data type as the argument.\n\nDifferences Between MariaDB and MySQL\n-------------------------------------\n\nSELECT x\'0a\'+0;\n+---------+\n| x\'0a\'+0 |\n+---------+\n| 0 |\n+---------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect DOUBLE value: \'\\x0A\'\n\nSELECT X\'0a\'+0;\n+---------+\n| X\'0a\'+0 |\n+---------+\n| 0 |\n+---------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect DOUBLE value: \'\\x0A\'\n\nSELECT 0x0a+0;\n+--------+\n| 0x0a+0 |\n+--------+\n| 10 |\n+--------+\n\nIn MySQL (up until at least MySQL 8.0.26):\n\nSELECT x\'0a\'+0;\n+---------+\n| x\'0a\'+0 |\n+---------+\n| 10 |\n+---------+\n\nSELECT X\'0a\'+0;\n+---------+\n| X\'0a\'+0 |\n+---------+\n| 10 |\n+---------+\n\nSELECT 0x0a+0;\n+--------+\n| 0x0a+0 |\n+--------+\n| 10 |\n+--------+\n\nURL: https://mariadb.com/kb/en/hexadecimal-literals/','','https://mariadb.com/kb/en/hexadecimal-literals/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (476,29,'Identifier Qualifiers','Qualifiers are used within SQL statements to reference data structures, such\nas databases, tables, or columns. For example, typically a SELECT query\ncontains references to some columns and at least one table.\n\nQualifiers can be composed by one or more identifiers, where the initial parts\naffect the context within which the final identifier is interpreted:\n\n* For a database, only the database identifier needs to be specified.\n* For objects which are contained in a database (like tables, views,\nfunctions, etc) the database identifier can be specified. If no database is\nspecified, the current database is assumed (see USE and DATABASE() for more\ndetails). If there is no default database and no database is specified, an\nerror is issued.\n* For column names, the table and the database are generally obvious from the\ncontext of the statement. It is however possible to specify the table\nidentifier, or the database identifier plus the table identifier.\n* An identifier is fully-qualified if it contains all possible qualifiers, for\nexample, the following column is fully qualified: db_name.tbl_name.col_name.\n\nIf a qualifier is composed by more than one identifier, a dot (.) must be used\nas a separator. All identifiers can be quoted individually. Extra spacing\n(including new lines and tabs) is allowed.\n\nAll the following examples are valid:\n\n* db_name.tbl_name.col_name\n* tbl_name\n* `db_name`.`tbl_name`.`col_name`\n* `db_name` . `tbl_name`\n* db_name. tbl_name\n\nIf a table identifier is prefixed with a dot (.), the default database is\nassumed. This syntax is supported for ODBC compliance, but has no practical\neffect on MariaDB. These qualifiers are equivalent:\n\n* tbl_name\n* . tbl_name\n* .`tbl_name`\n* . `tbl_name`\n\nFor DML statements, it is possible to specify a list of the partitions using\nthe PARTITION clause. See Partition Pruning and Selection for details.\n\nURL: https://mariadb.com/kb/en/identifier-qualifiers/','','https://mariadb.com/kb/en/identifier-qualifiers/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (477,29,'Identifier to File Name Mapping','Some identifiers map to a file name on the filesystem. Databases each have\ntheir own directory, while, depending on the storage engine, table names and\nindex names may map to a file name.\n\nNot all characters that are allowed in table names can be used in file names.\nEvery filesystem has its own rules of what characters can be used in file\nnames. To let the user create tables using all characters allowed in the SQL\nStandard and to not depend on whatever particular filesystem a particular\ndatabase resides, MariaDB encodes \"potentially unsafe\" characters in the table\nname to derive the corresponding file name.\n\nThis is implemented using a special character set. MariaDB converts a table\nname to the \"filename\" character set to get the file name for this table. And\nit converts the file name from the \"filename\" character set to, for example,\nutf8 to get the table name for this file name.\n\nThe conversion rules are as follows: if the identifier is made up only of\nbasic Latin numbers, letters and/or the underscore character, the encoding\nmatches the name (see however Identifier Case Sensitivity). Otherwise they are\nencoded according to the following table:\n\n+-----------------+------------+-----------+--------+-----------+-----------+\n| Code Range | Pattern | Number | Used | Unused | Blocks |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 00C0..017F | [@][0..4][ | 5*20= 100 | 97 | 3 | Latin-1 |\n| | ..z] | | | | Supplemen |\n| | | | | | + Latin |\n| | | | | | Extended- |\n| | | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 0370..03FF | [@][5..9][ | 5*20= 100 | 88 | 12 | Greek |\n| | ..z] | | | | and |\n| | | | | | Coptic |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 0400..052F | [@][g..z][ | 20*7= 140 | 137 | 3 | Cyrillic |\n| | ..6] | | | | + |\n| | | | | | Cyrillic |\n| | | | | | Supplemen |\n| | | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 0530..058F | [@][g..z][ | 20*2= 40 | 38 | 2 | Armenian |\n| | ..8] | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 2160..217F | [@][g..z][ | 20*1= 20 | 16 | 4 | Number |\n| | ] | | | | Forms |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 0180..02AF | [@][g..z][ | 20*11=220 | 203 | 17 | Latin |\n| | ..k] | | | | Extended- |\n| | | | | | + IPA |\n| | | | | | Extension |\n| | | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 1E00..1EFF | [@][g..z][ | 20*7= 140 | 136 | 4 | Latin |\n| | ..r] | | | | Extended |\n| | | | | | Additiona |\n| | | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 1F00..1FFF | [@][g..z][ | 20*8= 160 | 144 | 16 | Greek |\n| | ..z] | | | | Extended |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| .... .... | [@][a..f][ | 6*20= 120 | 0 | 120 | RESERVED |\n| | ..z] | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 24B6..24E9 | [@][@][a.. | 26 | 26 | 0 | Enclosed |\n| | ] | | | | Alphanume |\n| | | | | | ics |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| FF21..FF5A | [@][a..z][ | 26 | 26 | 0 | Halfwidth |\n| | ] | | | | and |\n| | | | | | Fullwidth |\n| | | | | | forms |\n+-----------------+------------+-----------+--------+-----------+-----------+\n\nCode Range values are UCS-2.\n\nAll of this encoding happens transparently at the filesystem level with one\nexception. Until MySQL 5.1.6, an old encoding was used. Identifiers created in\na version before MySQL 5.1.6, and which haven\'t been updated to the new\nencoding, the server prefixes mysql50 to their name.\n\nExamples\n--------\n\nFind the file name for a table with a non-Latin1 name:\n\nselect cast(convert(\"this_is_таблица\" USING filename) as binary);\n+------------------------------------------------------------------+\n| cast(convert(\"this_is_таблица\" USING filename) as binary) |\n+------------------------------------------------------------------+\n| this_is_@y0@g0@h0@r0@o0@i1@g0 |\n+------------------------------------------------------------------+\n\nFind the table name for a file name:\n\nselect convert(_filename \"this_is_@y0@g0@h0@r0@o0@i1@g0\" USING utf8);\n+---------------------------------------------------------------+\n| convert(_filename \"this_is_@y0@g0@h0@r0@o0@i1@g0\" USING utf8) |\n+---------------------------------------------------------------+\n| this_is_таблица |\n+---------------------------------------------------------------+\n\nAn old table created before MySQL 5.1.6, with the old encoding:\n\nSHOW TABLES;\n+--------------------+\n| Tables_in_test |\n+--------------------+\n| #mysql50#table@1 |\n+--------------------+\n\nThe prefix needs to be supplied to reference this table:\n\nSHOW COLUMNS FROM `table@1`;\nERROR 1146 (42S02): Table \'test.table@1\' doesn\'t exist\n\nSHOW COLUMNS FROM `#mysql50#table@1`;\n+-------+---------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-------+\n| i | int(11) | YES | | NULL | |\n+-------+---------+------+-----+---------+-------+\n\nURL: https://mariadb.com/kb/en/identifier-to-file-name-mapping/','','https://mariadb.com/kb/en/identifier-to-file-name-mapping/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (478,29,'Numeric Literals','Numeric literals are written as a sequence of digits from 0 to 9. Initial\nzeros are ignored. A sign can always precede the digits, but it is optional\nfor positive numbers. In decimal numbers, the integer part and the decimal\npart are divided with a dot (.).\n\nIf the integer part is zero, it can be omitted, but the literal must begin\nwith a dot.\n\nThe notation with exponent can be used. The exponent is preceded by an E or e\ncharacter. The exponent can be preceded by a sign and must be an integer. A\nnumber N with an exponent part X, is calculated as N * POW(10, X).\n\nIn some cases, adding zeroes at the end of a decimal number can increment the\nprecision of the expression where the number is used. For example, PI() by\ndefault returns a number with 6 decimal digits. But the PI()+0.0000000000\nexpression (with 10 zeroes) returns a number with 10 decimal digits.\n\nHexadecimal literals are interpreted as numbers when used in numeric contexts.\n\nExamples\n--------\n\n10\n+10\n-10\n\nAll these literals are equivalent:\n\n0.1\n.1\n+0.1\n+.1\n\nWith exponents:\n\n0.2E3 -- 0.2 * POW(10, 3) = 200\n.2e3\n.2e+2\n1.1e-10 -- 0.00000000011\n-1.1e10 -- -11000000000\n\nURL: https://mariadb.com/kb/en/numeric-iterals/','','https://mariadb.com/kb/en/numeric-iterals/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (479,29,'Reserved Words','The following is a list of all reserved words in MariaDB.\n\nReserved words cannot be used as Identifiers, unless they are quoted.\n\nThe definitive list of reserved words for each version can be found by\nexamining the sql/lex.h and sql/sql_yacc.yy files.\n\nReserved Words\n--------------\n\n+--------------------------------------------+--------------------------------+\n| Keyword | Notes |\n+--------------------------------------------+--------------------------------+\n| ACCESSIBLE | |\n+--------------------------------------------+--------------------------------+\n| ADD | |\n+--------------------------------------------+--------------------------------+\n| ALL | |\n+--------------------------------------------+--------------------------------+\n| ALTER | |\n+--------------------------------------------+--------------------------------+\n| ANALYZE | |\n+--------------------------------------------+--------------------------------+\n| AND | |\n+--------------------------------------------+--------------------------------+\n| AS | |\n+--------------------------------------------+--------------------------------+\n| ASC | |\n+--------------------------------------------+--------------------------------+\n| ASENSITIVE | |\n+--------------------------------------------+--------------------------------+\n| BEFORE | |\n+--------------------------------------------+--------------------------------+\n| BETWEEN | |\n+--------------------------------------------+--------------------------------+\n| BIGINT | |\n+--------------------------------------------+--------------------------------+\n| BINARY | |\n+--------------------------------------------+--------------------------------+\n| BLOB | |\n+--------------------------------------------+--------------------------------+\n| BOTH | |\n+--------------------------------------------+--------------------------------+\n| BY | |\n+--------------------------------------------+--------------------------------+\n| CALL | |\n+--------------------------------------------+--------------------------------+\n| CASCADE | |\n+--------------------------------------------+--------------------------------+\n| CASE | |\n+--------------------------------------------+--------------------------------+\n| CHANGE | |\n+--------------------------------------------+--------------------------------+\n| CHAR | |\n+--------------------------------------------+--------------------------------+\n| CHARACTER | |\n+--------------------------------------------+--------------------------------+\n| CHECK | |\n+--------------------------------------------+--------------------------------+\n| COLLATE | |\n+--------------------------------------------+--------------------------------+\n| COLUMN | |\n+--------------------------------------------+--------------------------------+\n| CONDITION | |\n+--------------------------------------------+--------------------------------+\n| CONSTRAINT | |\n+--------------------------------------------+--------------------------------+\n| CONTINUE | |\n+--------------------------------------------+--------------------------------+\n| CONVERT | |\n+--------------------------------------------+--------------------------------+\n| CREATE | |\n+--------------------------------------------+--------------------------------+\n| CROSS | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_DATE | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_ROLE | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_TIME | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_TIMESTAMP | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_USER | |\n+--------------------------------------------+--------------------------------+\n| CURSOR | |\n+--------------------------------------------+--------------------------------+\n| DATABASE | |\n+--------------------------------------------+--------------------------------+\n| DATABASES | |\n+--------------------------------------------+--------------------------------+\n| DAY_HOUR | |\n+--------------------------------------------+--------------------------------+\n| DAY_MICROSECOND | |\n+--------------------------------------------+--------------------------------+\n| DAY_MINUTE | |\n+--------------------------------------------+--------------------------------+\n| DAY_SECOND | |\n+--------------------------------------------+--------------------------------+\n| DEC | |\n+--------------------------------------------+--------------------------------+\n| DECIMAL | |\n+--------------------------------------------+--------------------------------+\n| DECLARE | |\n+--------------------------------------------+--------------------------------+\n| DEFAULT | |\n+--------------------------------------------+--------------------------------+\n| DELAYED | |\n+--------------------------------------------+--------------------------------+\n| DELETE | |\n+--------------------------------------------+--------------------------------+\n| DELETE_DOMAIN_ID | |\n+--------------------------------------------+--------------------------------+\n| DESC | |\n+--------------------------------------------+--------------------------------+\n| DESCRIBE | |\n+--------------------------------------------+--------------------------------+\n| DETERMINISTIC | |\n+--------------------------------------------+--------------------------------+\n| DISTINCT | |\n+--------------------------------------------+--------------------------------+\n| DISTINCTROW | |\n+--------------------------------------------+--------------------------------+\n| DIV | |\n+--------------------------------------------+--------------------------------+\n| DO_DOMAIN_IDS | |\n+--------------------------------------------+--------------------------------+\n| DOUBLE | |\n+--------------------------------------------+--------------------------------+\n| DROP | |\n+--------------------------------------------+--------------------------------+\n| DUAL | |\n+--------------------------------------------+--------------------------------+\n| EACH | |\n+--------------------------------------------+--------------------------------+\n| ELSE | |\n+--------------------------------------------+--------------------------------+\n| ELSEIF | |\n+--------------------------------------------+--------------------------------+\n| ENCLOSED | |\n+--------------------------------------------+--------------------------------+\n| ESCAPED | |\n+--------------------------------------------+--------------------------------+\n| EXCEPT | Added in MariaDB 10.3.0 |\n+--------------------------------------------+--------------------------------+\n| EXISTS | |\n+--------------------------------------------+--------------------------------+\n| EXIT | |\n+--------------------------------------------+--------------------------------+\n| EXPLAIN | |\n+--------------------------------------------+--------------------------------+\n| FALSE | |\n+--------------------------------------------+--------------------------------+\n| FETCH | |\n+--------------------------------------------+--------------------------------+\n| FLOAT | |\n+--------------------------------------------+--------------------------------+\n| FLOAT4 | |\n+--------------------------------------------+--------------------------------+\n| FLOAT8 | |\n+--------------------------------------------+--------------------------------+\n| FOR | |\n+--------------------------------------------+--------------------------------+\n| FORCE | |\n+--------------------------------------------+--------------------------------+\n| FOREIGN | |\n+--------------------------------------------+--------------------------------+\n| FROM | |\n+--------------------------------------------+--------------------------------+\n| FULLTEXT | |\n+--------------------------------------------+--------------------------------+\n| GENERAL | |\n+--------------------------------------------+--------------------------------+\n| GRANT | |\n+--------------------------------------------+--------------------------------+\n| GROUP | |\n+--------------------------------------------+--------------------------------+\n| HAVING | |\n+--------------------------------------------+--------------------------------+\n| HIGH_PRIORITY | |\n+--------------------------------------------+--------------------------------+\n| HOUR_MICROSECOND | |\n+--------------------------------------------+--------------------------------+\n| HOUR_MINUTE | |\n+--------------------------------------------+--------------------------------+\n| HOUR_SECOND | |','','https://mariadb.com/kb/en/reserved-words/');
-update help_topic set description = CONCAT(description, '\n+--------------------------------------------+--------------------------------+\n| IF | |\n+--------------------------------------------+--------------------------------+\n| IGNORE | |\n+--------------------------------------------+--------------------------------+\n| IGNORE_DOMAIN_IDS | |\n+--------------------------------------------+--------------------------------+\n| IGNORE_SERVER_IDS | |\n+--------------------------------------------+--------------------------------+\n| IN | |\n+--------------------------------------------+--------------------------------+\n| INDEX | |\n+--------------------------------------------+--------------------------------+\n| INFILE | |\n+--------------------------------------------+--------------------------------+\n| INNER | |\n+--------------------------------------------+--------------------------------+\n| INOUT | |\n+--------------------------------------------+--------------------------------+\n| INSENSITIVE | |\n+--------------------------------------------+--------------------------------+\n| INSERT | |\n+--------------------------------------------+--------------------------------+\n| INT | |\n+--------------------------------------------+--------------------------------+\n| INT1 | |\n+--------------------------------------------+--------------------------------+\n| INT2 | |\n+--------------------------------------------+--------------------------------+\n| INT3 | |\n+--------------------------------------------+--------------------------------+\n| INT4 | |\n+--------------------------------------------+--------------------------------+\n| INT8 | |\n+--------------------------------------------+--------------------------------+\n| INTEGER | |\n+--------------------------------------------+--------------------------------+\n| INTERSECT | Added in MariaDB 10.3.0 |\n+--------------------------------------------+--------------------------------+\n| INTERVAL | |\n+--------------------------------------------+--------------------------------+\n| INTO | |\n+--------------------------------------------+--------------------------------+\n| IS | |\n+--------------------------------------------+--------------------------------+\n| ITERATE | |\n+--------------------------------------------+--------------------------------+\n| JOIN | |\n+--------------------------------------------+--------------------------------+\n| KEY | |\n+--------------------------------------------+--------------------------------+\n| KEYS | |\n+--------------------------------------------+--------------------------------+\n| KILL | |\n+--------------------------------------------+--------------------------------+\n| LEADING | |\n+--------------------------------------------+--------------------------------+\n| LEAVE | |\n+--------------------------------------------+--------------------------------+\n| LEFT | |\n+--------------------------------------------+--------------------------------+\n| LIKE | |\n+--------------------------------------------+--------------------------------+\n| LIMIT | |\n+--------------------------------------------+--------------------------------+\n| LINEAR | |\n+--------------------------------------------+--------------------------------+\n| LINES | |\n+--------------------------------------------+--------------------------------+\n| LOAD | |\n+--------------------------------------------+--------------------------------+\n| LOCALTIME | |\n+--------------------------------------------+--------------------------------+\n| LOCALTIMESTAMP | |\n+--------------------------------------------+--------------------------------+\n| LOCK | |\n+--------------------------------------------+--------------------------------+\n| LONG | |\n+--------------------------------------------+--------------------------------+\n| LONGBLOB | |\n+--------------------------------------------+--------------------------------+\n| LONGTEXT | |\n+--------------------------------------------+--------------------------------+\n| LOOP | |\n+--------------------------------------------+--------------------------------+\n| LOW_PRIORITY | |\n+--------------------------------------------+--------------------------------+\n| MASTER_HEARTBEAT_PERIOD | |\n+--------------------------------------------+--------------------------------+\n| MASTER_SSL_VERIFY_SERVER_CERT | |\n+--------------------------------------------+--------------------------------+\n| MATCH | |\n+--------------------------------------------+--------------------------------+\n| MAXVALUE | |\n+--------------------------------------------+--------------------------------+\n| MEDIUMBLOB | |\n+--------------------------------------------+--------------------------------+\n| MEDIUMINT | |\n+--------------------------------------------+--------------------------------+\n| MEDIUMTEXT | |\n+--------------------------------------------+--------------------------------+\n| MIDDLEINT | |\n+--------------------------------------------+--------------------------------+\n| MINUTE_MICROSECOND | |\n+--------------------------------------------+--------------------------------+\n| MINUTE_SECOND | |\n+--------------------------------------------+--------------------------------+\n| MOD | |\n+--------------------------------------------+--------------------------------+\n| MODIFIES | |\n+--------------------------------------------+--------------------------------+\n| NATURAL | |\n+--------------------------------------------+--------------------------------+\n| NOT | |\n+--------------------------------------------+--------------------------------+\n| NO_WRITE_TO_BINLOG | |\n+--------------------------------------------+--------------------------------+\n| NULL | |\n+--------------------------------------------+--------------------------------+\n| NUMERIC | |\n+--------------------------------------------+--------------------------------+\n| OFFSET | Added in MariaDB 10.6.0 |\n+--------------------------------------------+--------------------------------+\n| ON | |\n+--------------------------------------------+--------------------------------+\n| OPTIMIZE | |\n+--------------------------------------------+--------------------------------+\n| OPTION | |\n+--------------------------------------------+--------------------------------+\n| OPTIONALLY | |\n+--------------------------------------------+--------------------------------+\n| OR | |\n+--------------------------------------------+--------------------------------+\n| ORDER | |\n+--------------------------------------------+--------------------------------+\n| OUT | |\n+--------------------------------------------+--------------------------------+\n| OUTER | |\n+--------------------------------------------+--------------------------------+\n| OUTFILE | |\n+--------------------------------------------+--------------------------------+\n| OVER | |\n+--------------------------------------------+--------------------------------+\n| PAGE_CHECKSUM | |\n+--------------------------------------------+--------------------------------+\n| PARSE_VCOL_EXPR | |\n+--------------------------------------------+--------------------------------+\n| PARTITION | |\n+--------------------------------------------+--------------------------------+\n| POSITION | |\n+--------------------------------------------+--------------------------------+\n| PRECISION | |\n+--------------------------------------------+--------------------------------+\n| PRIMARY | |\n+--------------------------------------------+--------------------------------+\n| PROCEDURE | |\n+--------------------------------------------+--------------------------------+\n| PURGE | |\n+--------------------------------------------+--------------------------------+\n| RANGE | |\n+--------------------------------------------+--------------------------------+\n| READ | |\n+--------------------------------------------+--------------------------------+\n| READS | |\n+--------------------------------------------+--------------------------------+\n| READ_WRITE | |\n+--------------------------------------------+--------------------------------+\n| REAL | |\n+--------------------------------------------+--------------------------------+\n| RECURSIVE | |\n+--------------------------------------------+--------------------------------+\n| REF_SYSTEM_ID | |\n+--------------------------------------------+--------------------------------+\n| REFERENCES | |\n+--------------------------------------------+--------------------------------+\n| REGEXP | |\n+--------------------------------------------+--------------------------------+\n| RELEASE | |\n+--------------------------------------------+--------------------------------+\n| RENAME | |') WHERE help_topic_id = 479;
-update help_topic set description = CONCAT(description, '\n+--------------------------------------------+--------------------------------+\n| REPEAT | |\n+--------------------------------------------+--------------------------------+\n| REPLACE | |\n+--------------------------------------------+--------------------------------+\n| REQUIRE | |\n+--------------------------------------------+--------------------------------+\n| RESIGNAL | |\n+--------------------------------------------+--------------------------------+\n| RESTRICT | |\n+--------------------------------------------+--------------------------------+\n| RETURN | |\n+--------------------------------------------+--------------------------------+\n| RETURNING | |\n+--------------------------------------------+--------------------------------+\n| REVOKE | |\n+--------------------------------------------+--------------------------------+\n| RIGHT | |\n+--------------------------------------------+--------------------------------+\n| RLIKE | |\n+--------------------------------------------+--------------------------------+\n| ROWS | |\n+--------------------------------------------+--------------------------------+\n| SCHEMA | |\n+--------------------------------------------+--------------------------------+\n| SCHEMAS | |\n+--------------------------------------------+--------------------------------+\n| SECOND_MICROSECOND | |\n+--------------------------------------------+--------------------------------+\n| SELECT | |\n+--------------------------------------------+--------------------------------+\n| SENSITIVE | |\n+--------------------------------------------+--------------------------------+\n| SEPARATOR | |\n+--------------------------------------------+--------------------------------+\n| SET | |\n+--------------------------------------------+--------------------------------+\n| SHOW | |\n+--------------------------------------------+--------------------------------+\n| SIGNAL | |\n+--------------------------------------------+--------------------------------+\n| SLOW | |\n+--------------------------------------------+--------------------------------+\n| SMALLINT | |\n+--------------------------------------------+--------------------------------+\n| SPATIAL | |\n+--------------------------------------------+--------------------------------+\n| SPECIFIC | |\n+--------------------------------------------+--------------------------------+\n| SQL | |\n+--------------------------------------------+--------------------------------+\n| SQLEXCEPTION | |\n+--------------------------------------------+--------------------------------+\n| SQLSTATE | |\n+--------------------------------------------+--------------------------------+\n| SQLWARNING | |\n+--------------------------------------------+--------------------------------+\n| SQL_BIG_RESULT | |\n+--------------------------------------------+--------------------------------+\n| SQL_CALC_FOUND_ROWS | |\n+--------------------------------------------+--------------------------------+\n| SQL_SMALL_RESULT | |\n+--------------------------------------------+--------------------------------+\n| SSL | |\n+--------------------------------------------+--------------------------------+\n| STARTING | |\n+--------------------------------------------+--------------------------------+\n| STATS_AUTO_RECALC | |\n+--------------------------------------------+--------------------------------+\n| STATS_PERSISTENT | |\n+--------------------------------------------+--------------------------------+\n| STATS_SAMPLE_PAGES | |\n+--------------------------------------------+--------------------------------+\n| STRAIGHT_JOIN | |\n+--------------------------------------------+--------------------------------+\n| TABLE | |\n+--------------------------------------------+--------------------------------+\n| TERMINATED | |\n+--------------------------------------------+--------------------------------+\n| THEN | |\n+--------------------------------------------+--------------------------------+\n| TINYBLOB | |\n+--------------------------------------------+--------------------------------+\n| TINYINT | |\n+--------------------------------------------+--------------------------------+\n| TINYTEXT | |\n+--------------------------------------------+--------------------------------+\n| TO | |\n+--------------------------------------------+--------------------------------+\n| TRAILING | |\n+--------------------------------------------+--------------------------------+\n| TRIGGER | |\n+--------------------------------------------+--------------------------------+\n| TRUE | |\n+--------------------------------------------+--------------------------------+\n| UNDO | |\n+--------------------------------------------+--------------------------------+\n| UNION | |\n+--------------------------------------------+--------------------------------+\n| UNIQUE | |\n+--------------------------------------------+--------------------------------+\n| UNLOCK | |\n+--------------------------------------------+--------------------------------+\n| UNSIGNED | |\n+--------------------------------------------+--------------------------------+\n| UPDATE | |\n+--------------------------------------------+--------------------------------+\n| USAGE | |\n+--------------------------------------------+--------------------------------+\n| USE | |\n+--------------------------------------------+--------------------------------+\n| USING | |\n+--------------------------------------------+--------------------------------+\n| UTC_DATE | |\n+--------------------------------------------+--------------------------------+\n| UTC_TIME | |\n+--------------------------------------------+--------------------------------+\n| UTC_TIMESTAMP | |\n+--------------------------------------------+--------------------------------+\n| VALUES | |\n+--------------------------------------------+--------------------------------+\n| VARBINARY | |\n+--------------------------------------------+--------------------------------+\n| VARCHAR | |\n+--------------------------------------------+--------------------------------+\n| VARCHARACTER | |\n+--------------------------------------------+--------------------------------+\n| VARYING | |\n+--------------------------------------------+--------------------------------+\n| WHEN | |\n+--------------------------------------------+--------------------------------+\n| WHERE | |\n+--------------------------------------------+--------------------------------+\n| WHILE | |\n+--------------------------------------------+--------------------------------+\n| WINDOW | Only disallowed for table |\n| | aliases. |\n+--------------------------------------------+--------------------------------+\n| WITH | |\n+--------------------------------------------+--------------------------------+\n| WRITE | |\n+--------------------------------------------+--------------------------------+\n| XOR | |\n+--------------------------------------------+--------------------------------+\n| YEAR_MONTH | |\n+--------------------------------------------+--------------------------------+\n| ZEROFILL | |\n+--------------------------------------------+--------------------------------+\n\nExceptions\n----------\n\nSome keywords are exceptions for historical reasons, and are permitted as\nunquoted identifiers. These include:\n\n+-----------------------------------------------------------------------------+\n| Keyword |\n+-----------------------------------------------------------------------------+\n| ACTION |\n+-----------------------------------------------------------------------------+\n| BIT |\n+-----------------------------------------------------------------------------+\n| DATE |\n+-----------------------------------------------------------------------------+\n| ENUM |\n+-----------------------------------------------------------------------------+\n| NO |\n+-----------------------------------------------------------------------------+\n| TEXT |\n+-----------------------------------------------------------------------------+\n| TIME |\n+-----------------------------------------------------------------------------+\n| TIMESTAMP |\n+-----------------------------------------------------------------------------+\n\nOracle Mode\n-----------\n\nIn Oracle mode, from MariaDB 10.3, there are a number of extra reserved words:\n\n+--------------------------------------------+--------------------------------+\n| Keyword | Notes |\n+--------------------------------------------+--------------------------------+\n| BODY | |\n+--------------------------------------------+--------------------------------+\n| ELSIF | |\n+--------------------------------------------+--------------------------------+\n| GOTO | |\n+--------------------------------------------+--------------------------------+\n| HISTORY | <= MariaDB 10.3.6 only |') WHERE help_topic_id = 479;
-update help_topic set description = CONCAT(description, '\n+--------------------------------------------+--------------------------------+\n| MINUS | From MariaDB 10.6.1 |\n+--------------------------------------------+--------------------------------+\n| OTHERS | |\n+--------------------------------------------+--------------------------------+\n| PACKAGE | |\n+--------------------------------------------+--------------------------------+\n| PERIOD | <= MariaDB 10.3.6 only |\n+--------------------------------------------+--------------------------------+\n| RAISE | |\n+--------------------------------------------+--------------------------------+\n| ROWNUM | From MariaDB 10.6.1 |\n+--------------------------------------------+--------------------------------+\n| ROWTYPE | |\n+--------------------------------------------+--------------------------------+\n| SYSDATE | From MariaDB 10.6.1 |\n+--------------------------------------------+--------------------------------+\n| SYSTEM | <= MariaDB 10.3.6 only. Note |\n| | however that SYSTEM sometimes |\n| | needs to be quoted to avoid |\n| | confusion with |\n| | System-versioned tables. |\n+--------------------------------------------+--------------------------------+\n| SYSTEM_TIME | <= MariaDB 10.3.6 only |\n+--------------------------------------------+--------------------------------+\n| VERSIONING | <= MariaDB 10.3.6 only |\n+--------------------------------------------+--------------------------------+\n| WITHOUT | <= MariaDB 10.3.6 only |\n+--------------------------------------------+--------------------------------+\n\nFunction Names\n--------------\n\nIf the IGNORE_SPACE SQL_MODE flag is set, function names become reserved words.\n\nURL: https://mariadb.com/kb/en/reserved-words/') WHERE help_topic_id = 479;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (480,29,'String Literals','Strings are sequences of characters and are enclosed with quotes.\n\nThe syntax is:\n\n[_charset_name]\'string\' [COLLATE collation_name]\n\nFor example:\n\n\'The MariaDB Foundation\'\n_utf8 \'Foundation\' COLLATE utf8_unicode_ci;\n\nStrings can either be enclosed in single quotes or in double quotes (the same\ncharacter must be used to both open and close the string).\n\nThe ANSI SQL-standard does not permit double quotes for enclosing strings, and\nalthough MariaDB does by default, if the MariaDB server has enabled the\nANSI_QUOTES_SQL SQL_MODE, double quotes will be treated as being used for\nidentifiers instead of strings.\n\nStrings that are next to each other are automatically concatenated. For\nexample:\n\n\'The \' \'MariaDB \' \'Foundation\'\n\nand\n\n\'The MariaDB Foundation\'\n\nare equivalent.\n\nThe \\ (backslash character) is used to escape characters (unless the SQL_MODE\nhasn\'t been set to NO_BACKSLASH_ESCAPES). For example:\n\n\'MariaDB\'s new features\'\n\nis not a valid string because of the single quote in the middle of the string,\nwhich is treated as if it closes the string, but is actually meant as part of\nthe string, an apostrophe. The backslash character helps in situations like\nthis:\n\n\'MariaDB\\\'s new features\'\n\nis now a valid string, and if displayed, will appear without the backslash.\n\nSELECT \'MariaDB\\\'s new features\';\n+------------------------+\n| MariaDB\'s new features |\n+------------------------+\n| MariaDB\'s new features |\n+------------------------+\n\nAnother way to escape the quoting character is repeating it twice:\n\nSELECT \'I\'\'m here\', \"\"\"Double\"\"\";\n+----------+----------+\n| I\'m here | \"Double\" |\n+----------+----------+\n| I\'m here | \"Double\" |\n+----------+----------+\n\nEscape Sequences\n----------------\n\nThere are other escape sequences also. Here is a full list:\n\n+-----------------------------------------------+-----------------------------+\n| Escape sequence | Character |\n+-----------------------------------------------+-----------------------------+\n| \\0 | ASCII NUL (0x00). |\n+-----------------------------------------------+-----------------------------+\n| \\\' | Single quote (\"\'\"). |\n+-----------------------------------------------+-----------------------------+\n| \\\" | Double quote (\"\"\"). |\n+-----------------------------------------------+-----------------------------+\n| \\b | Backspace. |\n+-----------------------------------------------+-----------------------------+\n| \\n | Newline, or linefeed,. |\n+-----------------------------------------------+-----------------------------+\n| \\r | Carriage return. |\n+-----------------------------------------------+-----------------------------+\n| \\t | Tab. |\n+-----------------------------------------------+-----------------------------+\n| \\Z | ASCII 26 (Control+Z). See |\n| | note following the table. |\n+-----------------------------------------------+-----------------------------+\n| \\\\ | Backslash (\"\\\"). |\n+-----------------------------------------------+-----------------------------+\n| \\% | \"%\" character. See note |\n| | following the table. |\n+-----------------------------------------------+-----------------------------+\n| \\_ | A \"_\" character. See note |\n| | following the table. |\n+-----------------------------------------------+-----------------------------+\n\nEscaping the % and _ characters can be necessary when using the LIKE operator,\nwhich treats them as special characters.\n\nThe ASCII 26 character (\\Z) needs to be escaped when included in a batch file\nwhich needs to be executed in Windows. The reason is that ASCII 26, in\nWindows, is the end of file (EOF).\n\nBackslash (\\), if not used as an escape character, must always be escaped.\nWhen followed by a character that is not in the above table, backslashes will\nsimply be ignored.\n\nURL: https://mariadb.com/kb/en/string-literals/','','https://mariadb.com/kb/en/string-literals/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (481,29,'Table Value Constructors','MariaDB starting with 10.3.3\n----------------------------\nTable Value Constructors were introduced in MariaDB 10.3.3\n\nSyntax\n------\n\nVALUES ( row_value[, row_value...]), (...)...\n\nDescription\n-----------\n\nIn Unions, Views, and sub-queries, a Table Value Constructor (TVC) allows you\nto inject arbitrary values into the result-set. The given values must have the\nsame number of columns as the result-set, otherwise it returns Error 1222.\n\nExamples\n--------\n\nUsing TVC\'s with UNION operations:\n\nCREATE TABLE test.t1 (val1 INT, val2 INT);\nINSERT INTO test.t1 VALUES(5, 8), (3, 4), (1, 2);\n\nSELECT * FROM test.t1\nUNION\nVALUES (70, 90), (100, 110);\n\n+------+------+\n| val1 | val2 |\n+------+------+\n| 5 | 8 | \n| 3 | 4 |\n| 1 | 2 |\n| 70 | 90 |\n| 100 | 110 |\n+------+------+\n\nUsing TVC\'s with a CREATE VIEW statement:\n\nCREATE VIEW v1 AS VALUES (7, 9), (9, 10);\n\nSELECT * FROM v1;\n+---+----+\n| 7 | 9 |\n+---+----+\n| 7 | 9 |\n| 9 | 10 |\n+---+----+\n\nUsing TVC with an ORDER BY clause:\n\nSELECT * FROM test.t1\nUNION\nVALUES (10, 20), (30, 40), (50, 60), (70, 80)\nORDER BY val1 DESC;\n\nUsing TVC with LIMIT clause:\n\nSELECT * FROM test.t1\nUNION\nVALUES (10, 20), (30, 40), (50, 60), (70, 80)\nLIMIT 2 OFFSET 4;\n\n+------+------+\n| val1 | val2 |\n+------+------+\n| 30 | 40 | \n| 50 | 60 |\n+------+------+\n\nURL: https://mariadb.com/kb/en/table-value-constructors/','','https://mariadb.com/kb/en/table-value-constructors/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (482,29,'User-Defined Variables','User-defined variables are variables which can be created by the user and\nexist in the session. This means that no one can access user-defined variables\nthat have been set by another user, and when the session is closed these\nvariables expire. However, these variables can be shared between several\nqueries and stored programs.\n\nUser-defined variables names must be preceded by a single at character (@).\nWhile it is safe to use a reserved word as a user-variable name, the only\nallowed characters are ASCII letters, digits, dollar sign ($), underscore (_)\nand dot (.). If other characters are used, the name can be quoted in one of\nthe following ways:\n\n* @`var_name`\n* @\'var_name\'\n* @\"var_name\"\n\nThese characters can be escaped as usual.\n\nUser-variables names are case insensitive, though they were case sensitive in\nMySQL 4.1 and older versions.\n\nUser-defined variables cannot be declared. They can be read even if no value\nhas been set yet; in that case, they are NULL. To set a value for a\nuser-defined variable you can use:\n\n* SET statement;\n* := operator within a SQL statement;\n* SELECT ... INTO.\n\nSince user-defined variables type cannot be declared, the only way to force\ntheir type is using CAST() or CONVERT():\n\nSET @str = CAST(123 AS CHAR(5));\n\nIf a variable has not been used yet, its value is NULL:\n\nSELECT @x IS NULL;\n+------------+\n| @x IS NULL |\n+------------+\n| 1 |\n+------------+\n\nIt is unsafe to read a user-defined variable and set its value in the same\nstatement (unless the command is SET), because the order of these actions is\nundefined.\n\nUser-defined variables can be used in most MariaDB\'s statements and clauses\nwhich accept an SQL expression. However there are some exceptions, like the\nLIMIT clause.\n\nThey must be used to PREPARE a prepared statement:\n\n@sql = \'DELETE FROM my_table WHERE c>1;\';\nPREPARE stmt FROM @sql;\nEXECUTE stmt;\nDEALLOCATE PREPARE stmt;\n\nAnother common use is to include a counter in a query:\n\nSET @var = 0;\nSELECT a, b, c, (@var:=@var+1) AS counter FROM my_table;\n\nInformation Schema\n------------------\n\nUser-defined variables can be viewed in the Information Schema USER_VARIABLES\nTable (as part of the User Variables plugin) from MariaDB 10.2.\n\nFlushing User-Defined Variables\n-------------------------------\n\nUser-defined variables are reset and the Information Schema table emptied with\nthe FLUSH USER_VARIABLES statement.\n\nSET @str = CAST(123 AS CHAR(5));\n\nSELECT * FROM information_schema.USER_VARIABLES ORDER BY VARIABLE_NAME;\n+---------------+----------------+---------------+--------------------+\n| VARIABLE_NAME | VARIABLE_VALUE | VARIABLE_TYPE | CHARACTER_SET_NAME |\n+---------------+----------------+---------------+--------------------+\n| str | 123 | VARCHAR | utf8mb3 |\n+---------------+----------------+---------------+--------------------+\n\nFLUSH USER_VARIABLES;\n\nSELECT * FROM information_schema.USER_VARIABLES ORDER BY VARIABLE_NAME;\nEmpty set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/user-defined-variables/','','https://mariadb.com/kb/en/user-defined-variables/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (483,29,'Delimiters','The default delimiter in the mysql client (from MariaDB 10.4.6, also called\nmariadb) is the semicolon.\n\nWhen creating stored programs from the command-line, it is likely you will\nneed to differentiate between the regular delimiter and a delimiter inside a\nBEGIN END block. To understand better, consider the following example:\n\nCREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC\nBEGIN\n DECLARE x TINYINT;\n SET x = 42;\n RETURN x;\nEND;\n\nIf you enter the above line by line, the mysql client will treat the first\nsemicolon, at the end of the DECLARE x TINYINT line, as the end of the\nstatement. Since that\'s only a partial definition, it will throw a syntax\nerror, as follows:\n\nCREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC\nBEGIN\nDECLARE x TINYINT;\nERROR 1064 (42000): You have an error in your SQL syntax; \ncheck the manual that corresponds to your MariaDB server version\n for the right syntax to use near \'\' at line 3\n\nThe solution is to specify a distinct delimiter for the duration of the\nprocess, using the DELIMITER command. The delimiter can be any set of\ncharacters you choose, but it needs to be a distinctive set of characters that\nwon\'t cause further confusion. // is a common choice, and used throughout the\nknowledgebase.\n\nHere\'s how the function could be successfully entered from the mysql client\nwith the new delimiter.\n\nDELIMITER //\n\nCREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC\nBEGIN\n DECLARE x TINYINT;\n SET x = 42;\n RETURN x;\nEND\n\n//\n\nDELIMITER ;\n\nAt the end, the delimiter is restored to the default semicolon. The \\g and \\G\ndelimiters can always be used, even when a custom delimiter is specified.\n\nURL: https://mariadb.com/kb/en/delimiters/','','https://mariadb.com/kb/en/delimiters/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (484,29,'SQL_MODE=ORACLE','From MariaDB 10.3, setting the sql_mode system variable to Oracle allows the\nserver to understand a subset of Oracle\'s PL/SQL language. For example:\n\nSET SQL_MODE=\'ORACLE\';\n\nAll traditional MariaDB SQL/PSM syntax should work as before, as long as it\ndoes not conflict with Oracle\'s PL/SQL syntax. All MariaDB functions should be\nsupported in both normal and Oracle modes.\n\nPrior to MariaDB 10.3, MariaDB does not support Oracle\'s PL/SQL language, and\nSET SQL_MODE=ORACLE is only an alias for the following sql_mode in those\nversions:\n\nSET SQL_MODE=\'PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS,\nNO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER\';\n\nFrom MariaDB 10.3, SET SQL_MODE=ORACLE is same as:\n\nSET SQL_MODE=\'PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,\nNO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT\';\n\nSupported Syntax in Oracle Mode\n-------------------------------\n\nStored Procedures and Stored Functions\n--------------------------------------\n\nOracle mode makes the following changes to Stored Procedures and Stored\nFunctions:\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 (param OUT INT) | ANSI uses (OUT param INT) |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 (a IN OUT INT) | ANSI uses (INOUT param INT) |\n+-----------------------------------------+-----------------------------------+\n| AS before function body | CREATE FUNCTION f1 RETURN NUMBER |\n| | AS BEGIN... |\n+-----------------------------------------+-----------------------------------+\n| IS before function body | CREATE FUNCTION f1 RETURN NUMBER |\n| | IS BEGIN... |\n+-----------------------------------------+-----------------------------------+\n| If function has no parameters then | Example: CREATE PROCEDURE p1 AS |\n| parentheses must be omitted | BEGIN NULL; END; |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 AS BEGIN END p1; | Optional routine name after END |\n| | keyword. MDEV-12089 |\n+-----------------------------------------+-----------------------------------+\n| CREATE FUNCTION f1(a VARCHAR) | VARCHAR can be used without |\n| | length for routine parameters |\n| | and RETURN clause. The length is |\n| | inherited from the argument at |\n| | call time. MDEV-10596 |\n+-----------------------------------------+-----------------------------------+\n| CREATE AGGREGATE FUNCTION f1( ) | Creates an aggregate function, |\n| | which performs the function |\n| | against a set of rows and |\n| | returns one aggregate result. |\n+-----------------------------------------+-----------------------------------+\n| No CALL needed in Stored Procedures | In Oracle mode one can call |\n| | other stored procedures with |\n| | name only. MDEV-12107 |\n+-----------------------------------------+-----------------------------------+\n| RETURN. Can also be used in stored | ANSI uses RETURNS. MariaDB mode |\n| procedures | only supports RETURNS in stored |\n| | functions |\n+-----------------------------------------+-----------------------------------+\n\nCursors\n-------\n\nOracle mode makes the following changes to Cursors:\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 AS CURSOR cur IS | Explicit cursor with FOR loop. |\n| (SELECT a, b FROM t1); BEGIN FOR rec | MDEV-10581 |\n| IN cur ... | |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 AS rec IN (SELECT | Implicit cursor with FOR loop. |\n| a, b FROM t1) | MDEV-12098 |\n+-----------------------------------------+-----------------------------------+\n| CURSOR c(prm_a VARCHAR2, prm_b | Cursor with parameters. |\n| VARCHAR2) ... OPEN c(1,2) | MDEV-10597 |\n+-----------------------------------------+-----------------------------------+\n| CURSOR c(prm_a VARCHAR2, prm_b | Cursor with parameters and FOR |\n| VARCHAR2) ... FOR rec in c(1,2) | loop. MDEV-12314 |\n+-----------------------------------------+-----------------------------------+\n| s %ISOPEN, %ROWCOUNT, %FOUND, %NOTFOUND | Explicit cursor attributes. |\n| | MDEV-10582 |\n+-----------------------------------------+-----------------------------------+\n\nLOOP\n----\n\nOracle mode makes the following changes to LOOP:\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| FOR i IN 1..10 LOOP ... END LOOP | Numeric FOR loop. MDEV-10580 |\n+-----------------------------------------+-----------------------------------+\n| GOTO | GOTO statement. MDEV-10697 |\n+-----------------------------------------+-----------------------------------+\n| <<label>> used with GOTO | ANSI uses label:. MDEV-10697 |\n+-----------------------------------------+-----------------------------------+\n| To leave loop block: EXIT [ label ] [ | ANSI syntax is IF bool_expr THEN |\n| WHEN bool_expr ] | LEAVE label |\n+-----------------------------------------+-----------------------------------+\n| [<<label>>] WHILE boolean_expression | Oracle style WHILE loop |\n| LOOP statement... END LOOP [ label ] ; | |\n+-----------------------------------------+-----------------------------------+\n| CONTINUE [ label ] [ WHEN | CONTINUE is only valid inside a |\n| boolean_expression] | loop |\n+-----------------------------------------+-----------------------------------+\n\nVariables\n---------\n\n+------------------------------+-----------------+--------------------------+\n| Oracle syntax | Version | Description |\n+------------------------------+-----------------+--------------------------+\n| var:= 10; Can also be used | 10.3 | MariaDB uses SET var= |\n| with MariaDB systemvariables | | 10; |\n+------------------------------+-----------------+--------------------------+\n| var INT := 10 | 10.3 | Default variable value |\n+------------------------------+-----------------+--------------------------+\n| var1 | 10.3 | Take data type from a |\n| table_name.column_name%TYPE | | table column. MDEV-10577 |\n+------------------------------+-----------------+--------------------------+\n| var2 var1%TYPE | 10.3 | Take data type from |\n| | | another variable |\n+------------------------------+-----------------+--------------------------+\n| rec1 table_name%ROWTYPE | 10.3 | Take ROW structure from |\n| | | a table. MDEV-12133 |\n+------------------------------+-----------------+--------------------------+\n| rec2 rec1%ROWTYPE | 10.3 | Take ROW structure from |\n| | | ROW variable |\n+------------------------------+-----------------+--------------------------+\n| CURSOR c1 IS SELECT a,b | 10.3 | Take ROW structure from |\n| FROM t1; rec1 c1%ROWTYPE; | | a cursor. MDEV-12011 |\n+------------------------------+-----------------+--------------------------+\n| Variables can be declared | 10.3 | In MariaDB mode, |\n| after cursor declarations | | variables must be |\n| | | declared before |\n| | | cursors. MDEV-10598 |\n+------------------------------+-----------------+--------------------------+\n| Triggers uses :NEW and :OLD | 10.3 | ANSI uses NEW and OLD. |\n| | | MDEV-10579 |\n+------------------------------+-----------------+--------------------------+\n| SQLCODE | 10.3 | Returns the number code |\n| | | of the most recent |\n| | | exception. Can only be |\n| | | used in Stored |\n| | | Procedures. MDEV-10578 |\n+------------------------------+-----------------+--------------------------+\n| SQLERRM | 10.3 | Returns the error |\n| | | message associdated to |\n| | | it\'s error number |\n| | | argument or SQLCODE if |\n| | | no argument is given. |\n| | | Can only be used in |\n| | | Stored Procedures. |\n| | | MDEV-10578 |\n+------------------------------+-----------------+--------------------------+\n| SQL%ROWCOUNT | 10.3 | Almost same as |\n| | | ROW_COUNT(). MDEV-10583 |\n+------------------------------+-----------------+--------------------------+\n| ROWNUM | 10.6.1 | Returns number of |\n| | | accepted rows |\n+------------------------------+-----------------+--------------------------+\n\nExceptions\n----------\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| BEGIN ... EXCEPTION WHEN OTHERS THEN | Exception handlers are declared |\n| BEGIN .. END; END; | at the end of a block |\n+-----------------------------------------+-----------------------------------+\n| TOO_MANY_ROWS, NO_DATA_FOUND, | Predefined exceptions. MDEV-10839 |\n| DUP_VAL_ON_INDEX | |\n+-----------------------------------------+-----------------------------------+\n| RAISE TOO_MANY_ROWS ; .... EXCEPTION | Exception can be used with RAISE |\n| WHEN TOO_MANY_ROWS THEN ... | and EXCEPTION...WHEN. MDEV-10840 |\n+-----------------------------------------+-----------------------------------+\n| CREATE OR REPLACE FUNCTION f1 (a INT) | User defined exceptions. |\n| RETURN INT AS e1 EXCEPTION... | MDEV-10587 |\n+-----------------------------------------+-----------------------------------+\n\nBEGIN Blocks\n------------\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| BEGIN to start a block | MariaDB uses BEGIN NOT ATOMIC |\n| | for anyonymous blocks. MDEV-10655 |\n+-----------------------------------------+-----------------------------------+\n| DECLARE is used before BEGIN | DECLARE a INT; b VARCHAR(10); |\n| | BEGIN v:= 10; END; |\n+-----------------------------------------+-----------------------------------+\n| WHEN DUP_VAL_ON_INDEX THEN NULL ; | Do not require BEGIN..END in |\n| NULL; WHEN OTHERS THEN NULL | multi-statement exception |\n| | handlers in THEN clause. |\n| | MDEV-12088 |\n+-----------------------------------------+-----------------------------------+\n\nSimple Syntax Compatibility\n---------------------------\n\n+------------------------------+-----------------+--------------------------+\n| Oracle syntax | Version | Description |\n+------------------------------+-----------------+--------------------------+\n| ELSIF | 10.3 | ANSI uses ELSEIF |\n+------------------------------+-----------------+--------------------------+\n| SELECT UNIQUE | 10.3 | Same as SELECT |\n| | | DISTINCT. MDEV-12086 |','','https://mariadb.com/kb/en/sql_modeoracle/');
-update help_topic set description = CONCAT(description, '\n+------------------------------+-----------------+--------------------------+\n| TRUNCATE TABLE t1 [DROP | 10.3 | DROP STORAGE and REUSE |\n| STORAGE] or [REUSE STORAGE] | | STORAGE are allowed as |\n| | | optional keywords for |\n| | | TRUNCATE TABLE. |\n| | | MDEV-10588 |\n+------------------------------+-----------------+--------------------------+\n| Subqueries in a FROM clause | 10.6 | SELECT * FROM (SELECT 1 |\n| without an alias | | FROM DUAL), (SELECT 2 |\n| | | FROM DUAL) |\n+------------------------------+-----------------+--------------------------+\n| UNION, EXCEPT and INTERSECT | 10.3 | INTERSECT has higher |\n| all have the same | | precedence than UNION |\n| precedence. | | and EXCEPT in |\n| | | non-Oracle modes. |\n+------------------------------+-----------------+--------------------------+\n| MINUS | 10.6 | MINUS is a synonym for |\n| | | EXCEPT. |\n+------------------------------+-----------------+--------------------------+\n\nFunctions\n---------\n\n+------------------------------+-----------------+--------------------------+\n| Oracle syntax | Version | Description |\n+------------------------------+-----------------+--------------------------+\n| ADD_MONTHS() | 10.6.1 | Added as a wrapper for |\n| | | DATE_ADD() to enhance |\n| | | Oracle compatibility. |\n| | | All modes. |\n+------------------------------+-----------------+--------------------------+\n| CAST(expr as VARCHAR(N)) | 10.3 | Cast expression to a |\n| | | VARCHAR(N). MDEV-11275 |\n+------------------------------+-----------------+--------------------------+\n| DECODE | 10.3 | In Oracle mode, |\n| | | compares and matches |\n| | | search expressions |\n+------------------------------+-----------------+--------------------------+\n| LENGTH() is same as | 10.3 | MariaDB translates |\n| CHAR_LENGTH() | | LENGTH() to |\n| | | OCTET_LENGTH(). In all |\n| | | modes one can use |\n| | | LENGTHB() as a synonym |\n| | | to OCTET_LENGTH() |\n+------------------------------+-----------------+--------------------------+\n| CHR(num) | 10.3 | Returns a VARCHAR(1) |\n| | | with character set and |\n| | | collation according to |\n| | | @@character_set_database |\n| | | and @@collation_database |\n+------------------------------+-----------------+--------------------------+\n| substr(\'abc\',0 ,3) same as | 10.3 | Position 0 for substr() |\n| substr(\'abc\', 1 ,3) | | is same as position 1 |\n+------------------------------+-----------------+--------------------------+\n| SYS_GUID | 10.6.1 | Generates a globally |\n| | | unique identifier. |\n| | | Similar to UUID but |\n| | | without the -. All |\n| | | modes. |\n+------------------------------+-----------------+--------------------------+\n| TO_CHAR | 10.6.1 | Added to enhance Oracle |\n| | | compatibility. All |\n| | | modes. |\n+------------------------------+-----------------+--------------------------+\n| TRIM, LTRIM, RTRIM, LPAD | 10.3 | Returns NULL instead of |\n| and RPAD | | an empty string if |\n| | | returning an empty |\n| | | result. These functions |\n| | | can also be accessed |\n| | | outside of ORACLE mode |\n| | | by suffixing _ORACLE |\n| | | onto the end of the |\n| | | function name, such as |\n| | | TRIM_ORACLE. |\n+------------------------------+-----------------+--------------------------+\n\nPrepared Statements\n-------------------\n\nOracle mode makes the following changes to Prepared Statements:\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| PREPARE stmt FROM \'SELECT :1, :2\' | ANSI uses ?. MDEV-10801 |\n+-----------------------------------------+-----------------------------------+\n| EXECUTE IMMEDIATE \'INSERT INTO t1 | Dynamic placeholders. MDEV-10801 |\n| SELECT (:x,:y) FROM DUAL\' USING 10,20 | |\n+-----------------------------------------+-----------------------------------+\n\nSynonyms for Basic SQL Types\n----------------------------\n\n+--------------------------------+-------------------------------------------+\n| Oracle type | MariaDB synonym |\n+--------------------------------+-------------------------------------------+\n| VARCHAR2 | VARCHAR |\n+--------------------------------+-------------------------------------------+\n| NUMBER | DECIMAL |\n+--------------------------------+-------------------------------------------+\n| DATE (with time portion) | MariaDB DATETIME |\n+--------------------------------+-------------------------------------------+\n| RAW | VARBINARY |\n+--------------------------------+-------------------------------------------+\n| CLOB | LONGTEXT |\n+--------------------------------+-------------------------------------------+\n| BLOB | LONGBLOB |\n+--------------------------------+-------------------------------------------+\n\nThis was implemented as part of MDEV-10343.\n\nIf one does a SHOW CREATE TABLE in ORACLE mode on a table that has a native\nMariaDB DATE column, it will be displayed as mariadb_schema.date to not\nconflict with the Oracle DATE type.\n\nPackages\n--------\n\nThe following syntax has been supported since MariaDB 10.3.5:\n\n* CREATE PACKAGE\n* CREATE PACKAGE BODY\n* DROP PACKAGE\n* DROP PACKAGE BODY\n* SHOW CREATE PACKAGE\n* SHOW CREATE PACKAGE BODY\n\nNULL Handling\n-------------\n\nOracle mode makes the following changes to NULL handling:\n\nNULL As a Statement\n-------------------\n\nNULL can be used as a statement:\n\nIF a=10 THEN NULL; ELSE NULL; END IF\n\nTranslating Empty String Literals to NULL\n-----------------------------------------\n\nIn Oracle, empty string (\'\') and NULL are the same thing,\n\nBy using sql_mode=EMPTY_STRING_IS_NULL you can get a similar experience in\nMariaDB:\n\nSET sql_mode=EMPTY_STRING_IS_NULL;\nSELECT \'\' IS NULL; -- returns TRUE\nINSERT INTO t1 VALUES (\'\'); -- inserts NULL\n\nConcat Operator Ignores NULL\n----------------------------\n\nCONCAT() and || ignore NULL in Oracle mode. Can also be accessed outside of\nORACLE mode by using CONCAT_OPERATOR_ORACLE. MDEV-11880 and MDEV-12143.\n\nReserved Words\n--------------\n\nThere are a number of extra reserved words in Oracle mode.\n\nSHOW CREATE TABLE\n-----------------\n\nThe SHOW CREATE TABLE statement will not display MariaDB-specific table\noptions, such as AUTO_INCREMENT or CHARSET, when Oracle mode is set.\n\nURL: https://mariadb.com/kb/en/sql_modeoracle/') WHERE help_topic_id = 484;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (485,30,'CONTAINS','Syntax\n------\n\nContains(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether a geometry g1 completely contains geometry\ng2. CONTAINS() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_CONTAINS() uses object shapes.\n\nThis tests the opposite relationship to Within().\n\nURL: https://mariadb.com/kb/en/contains/','','https://mariadb.com/kb/en/contains/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (486,30,'CROSSES','Syntax\n------\n\nCrosses(g1,g2)\n\nDescription\n-----------\n\nReturns 1 if g1 spatially crosses g2. Returns NULL if g1 is a Polygon or a\nMultiPolygon, or if g2 is a Point or a MultiPoint. Otherwise, returns 0.\n\nThe term spatially crosses denotes a spatial relation between two given\ngeometries that has the following properties:\n\n* The two geometries intersect\n* Their intersection results in a geometry that has a dimension that is one\n less than the maximum dimension of the two given geometries\n* Their intersection is not equal to either of the two given geometries\n\nCROSSES() is based on the original MySQL implementation, and uses object\nbounding rectangles, while ST_CROSSES() uses object shapes.\n\nURL: https://mariadb.com/kb/en/crosses/','','https://mariadb.com/kb/en/crosses/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (487,30,'DISJOINT','Syntax\n------\n\nDisjoint(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 is spatially disjoint from (does not\nintersect) g2.\n\nDISJOINT() tests the opposite relationship to INTERSECTS().\n\nDISJOINT() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_DISJOINT() uses object shapes.\n\nURL: https://mariadb.com/kb/en/disjoint/','','https://mariadb.com/kb/en/disjoint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (488,30,'EQUALS','Syntax\n------\n\nEquals(g1,g2)\n\nFrom MariaDB 10.2.3:\n\nMBREQUALS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 is spatially equal to g2.\n\nEQUALS() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_EQUALS() uses object shapes.\n\nFrom MariaDB 10.2.3, MBREQUALS is a synonym for Equals.\n\nURL: https://mariadb.com/kb/en/equals/','','https://mariadb.com/kb/en/equals/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (489,30,'INTERSECTS','Syntax\n------\n\nINTERSECTS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 spatially intersects geometry\ng2.\n\nINTERSECTS() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_INTERSECTS() uses object shapes.\n\nINTERSECTS() tests the opposite relationship to DISJOINT().\n\nURL: https://mariadb.com/kb/en/intersects/','','https://mariadb.com/kb/en/intersects/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (490,30,'OVERLAPS','Syntax\n------\n\nOVERLAPS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 spatially overlaps g2. The term\nspatially overlaps is used if two geometries intersect and their intersection\nresults in a geometry of the same dimension but not equal to either of the\ngiven geometries.\n\nOVERLAPS() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_OVERLAPS() uses object shapes.\n\nURL: https://mariadb.com/kb/en/overlaps/','','https://mariadb.com/kb/en/overlaps/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (491,30,'ST_CONTAINS','Syntax\n------\n\nST_CONTAINS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether a geometry g1 completely contains geometry\ng2.\n\nST_CONTAINS() uses object shapes, while CONTAINS(), based on the original\nMySQL implementation, uses object bounding rectangles.\n\nST_CONTAINS tests the opposite relationship to ST_WITHIN().\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60, 125 100, 175\n150))\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'POINT(174 149)\');\n\nSELECT ST_CONTAINS(@g1,@g2);\n+----------------------+\n| ST_CONTAINS(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSET @g2 = ST_GEOMFROMTEXT(\'POINT(175 151)\');\n\nSELECT ST_CONTAINS(@g1,@g2);\n+----------------------+\n| ST_CONTAINS(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/st-contains/','','https://mariadb.com/kb/en/st-contains/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (492,30,'ST_CROSSES','Syntax\n------\n\nST_CROSSES(g1,g2)\n\nDescription\n-----------\n\nReturns 1 if geometry g1 spatially crosses geometry g2. Returns NULL if g1 is\na Polygon or a MultiPolygon, or if g2 is a Point or a MultiPoint. Otherwise,\nreturns 0.\n\nThe term spatially crosses denotes a spatial relation between two given\ngeometries that has the following properties:\n\n* The two geometries intersect\n* Their intersection results in a geometry that has a dimension that is one\n less than the maximum dimension of the two given geometries\n* Their intersection is not equal to either of the two given geometries\n\nST_CROSSES() uses object shapes, while CROSSES(), based on the original MySQL\nimplementation, uses object bounding rectangles.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(174 149, 176 151)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60, 125 100, 175\n150))\');\n\nSELECT ST_CROSSES(@g1,@g2);\n+---------------------+\n| ST_CROSSES(@g1,@g2) |\n+---------------------+\n| 1 |\n+---------------------+\n\nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(176 149, 176 151)\');\n\nSELECT ST_CROSSES(@g1,@g2);\n+---------------------+\n| ST_CROSSES(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/st-crosses/','','https://mariadb.com/kb/en/st-crosses/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (493,30,'ST_DIFFERENCE','Syntax\n------\n\nST_DIFFERENCE(g1,g2)\n\nDescription\n-----------\n\nReturns a geometry representing the point set difference of the given geometry\nvalues.\n\nExample\n-------\n\nSET @g1 = POINT(10,10), @g2 = POINT(20,20);\n\nSELECT ST_AsText(ST_Difference(@g1, @g2));\n+------------------------------------+\n| ST_AsText(ST_Difference(@g1, @g2)) |\n+------------------------------------+\n| POINT(10 10) |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_difference/','','https://mariadb.com/kb/en/st_difference/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (494,30,'ST_DISJOINT','Syntax\n------\n\nST_DISJOINT(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 is spatially disjoint from\n(does not intersect with) geometry g2.\n\nST_DISJOINT() uses object shapes, while DISJOINT(), based on the original\nMySQL implementation, uses object bounding rectangles.\n\nST_DISJOINT() tests the opposite relationship to ST_INTERSECTS().\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(0 0)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 0, 0 2)\');\n\nSELECT ST_DISJOINT(@g1,@g2);\n+----------------------+\n| ST_DISJOINT(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(0 0, 0 2)\');\n\nSELECT ST_DISJOINT(@g1,@g2);\n+----------------------+\n| ST_DISJOINT(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/st_disjoint/','','https://mariadb.com/kb/en/st_disjoint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (495,30,'ST_DISTANCE','Syntax\n------\n\nST_DISTANCE(g1,g2)\n\nDescription\n-----------\n\nReturns the distance between two geometries, or null if not given valid inputs.\n\nExample\n-------\n\nSELECT ST_Distance(POINT(1,2),POINT(2,2));\n+------------------------------------+\n| ST_Distance(POINT(1,2),POINT(2,2)) |\n+------------------------------------+\n| 1 |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_distance/','','https://mariadb.com/kb/en/st_distance/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (496,30,'ST_DISTANCE_SPHERE','MariaDB starting with 10.2.38\n-----------------------------\nST_DISTANCE_SPHERE was introduced in MariaDB 10.2.38, MariaDB 10.3.29, MariaDB\n10.4.19 and MariaDB 10.5.10.\n\nSyntax\n------\n\nST_DISTANCE_SPHERE(g1,g2,[r])\n\nDescription\n-----------\n\nReturns the spherical distance between two geometries (point or multipoint) on\na sphere with the optional radius r (default is the Earth radius if r is not\nspecified), or NULL if not given valid inputs.\n\nExample\n-------\n\nset @zenica = ST_GeomFromText(\'POINT(17.907743 44.203438)\');\nset @sarajevo = ST_GeomFromText(\'POINT(18.413076 43.856258)\');\nSELECT ST_Distance_Sphere(@zenica, @sarajevo);\n55878.59337591705\n\nURL: https://mariadb.com/kb/en/st_distance_sphere/','','https://mariadb.com/kb/en/st_distance_sphere/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (497,30,'ST_EQUALS','Syntax\n------\n\nST_EQUALS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 is spatially equal to geometry\ng2.\n\nST_EQUALS() uses object shapes, while EQUALS(), based on the original MySQL\nimplementation, uses object bounding rectangles.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(174 149, 176 151)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(176 151, 174 149)\');\n\nSELECT ST_EQUALS(@g1,@g2);\n+--------------------+\n| ST_EQUALS(@g1,@g2) |\n+--------------------+\n| 1 |\n+--------------------+\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(0 2)\');\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 0)\');\n\nSELECT ST_EQUALS(@g1,@g2);\n+--------------------+\n| ST_EQUALS(@g1,@g2) |\n+--------------------+\n| 0 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/st-equals/','','https://mariadb.com/kb/en/st-equals/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (498,30,'ST_INTERSECTS','Syntax\n------\n\nST_INTERSECTS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 spatially intersects geometry\ng2.\n\nST_INTERSECTS() uses object shapes, while INTERSECTS(), based on the original\nMySQL implementation, uses object bounding rectangles.\n\nST_INTERSECTS() tests the opposite relationship to ST_DISJOINT().\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(0 0)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(0 0, 0 2)\');\n\nSELECT ST_INTERSECTS(@g1,@g2);\n+------------------------+\n| ST_INTERSECTS(@g1,@g2) |\n+------------------------+\n| 1 |\n+------------------------+\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 0, 0 2)\');\n\nSELECT ST_INTERSECTS(@g1,@g2);\n+------------------------+\n| ST_INTERSECTS(@g1,@g2) |\n+------------------------+\n| 0 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/st-intersects/','','https://mariadb.com/kb/en/st-intersects/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (499,30,'ST_LENGTH','Syntax\n------\n\nST_LENGTH(ls)\n\nDescription\n-----------\n\nReturns as a double-precision number the length of the LineString value ls in\nits associated spatial reference.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT ST_LENGTH(ST_GeomFromText(@ls));\n+---------------------------------+\n| ST_LENGTH(ST_GeomFromText(@ls)) |\n+---------------------------------+\n| 2.82842712474619 |\n+---------------------------------+\n\nURL: https://mariadb.com/kb/en/st_length/','','https://mariadb.com/kb/en/st_length/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (500,30,'ST_OVERLAPS','Syntax\n------\n\nST_OVERLAPS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 spatially overlaps geometry g2.\n\nThe term spatially overlaps is used if two geometries intersect and their\nintersection results in a geometry of the same dimension but not equal to\neither of the given geometries.\n\nST_OVERLAPS() uses object shapes, while OVERLAPS(), based on the original\nMySQL implementation, uses object bounding rectangles.\n\nURL: https://mariadb.com/kb/en/st-overlaps/','','https://mariadb.com/kb/en/st-overlaps/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (501,30,'ST_TOUCHES','Syntax\n------\n\nST_TOUCHES(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 spatially touches geometry g2.\nTwo geometries spatially touch if the interiors of the geometries do not\nintersect, but the boundary of one of the geometries intersects either the\nboundary or the interior of the other.\n\nST_TOUCHES() uses object shapes, while TOUCHES(), based on the original MySQL\nimplementation, uses object bounding rectangles.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 0)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 0, 0 2)\');\n\nSELECT ST_TOUCHES(@g1,@g2);\n+---------------------+\n| ST_TOUCHES(@g1,@g2) |\n+---------------------+\n| 1 |\n+---------------------+\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 1)\');\n\nSELECT ST_TOUCHES(@g1,@g2);\n+---------------------+\n| ST_TOUCHES(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/st-touches/','','https://mariadb.com/kb/en/st-touches/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (502,30,'ST_WITHIN','Syntax\n------\n\nST_WITHIN(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 is spatially within geometry g2.\n\nThis tests the opposite relationship as ST_CONTAINS().\n\nST_WITHIN() uses object shapes, while WITHIN(), based on the original MySQL\nimplementation, uses object bounding rectangles.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(174 149)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60, 125 100, 175\n150))\');\n\nSELECT ST_WITHIN(@g1,@g2);\n+--------------------+\n| ST_WITHIN(@g1,@g2) |\n+--------------------+\n| 1 |\n+--------------------+\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(176 151)\');\n\nSELECT ST_WITHIN(@g1,@g2);\n+--------------------+\n| ST_WITHIN(@g1,@g2) |\n+--------------------+\n| 0 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/st-within/','','https://mariadb.com/kb/en/st-within/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (503,30,'TOUCHES','Syntax\n------\n\nTouches(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 spatially touches g2. Two geometries\nspatially touch if the interiors of the geometries do not intersect, but the\nboundary of one of the geometries intersects either the boundary or the\ninterior of the other.\n\nTOUCHES() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_TOUCHES() uses object shapes.\n\nURL: https://mariadb.com/kb/en/touches/','','https://mariadb.com/kb/en/touches/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (504,30,'WITHIN','Syntax\n------\n\nWithin(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 is spatially within g2. This tests the\nopposite relationship as Contains().\n\nWITHIN() is based on the original MySQL implementation, and uses object\nbounding rectangles, while ST_WITHIN() uses object shapes.\n\nExamples\n--------\n\nSET @g1 = GEOMFROMTEXT(\'POINT(174 149)\');\nSET @g2 = GEOMFROMTEXT(\'POINT(176 151)\');\nSET @g3 = GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))\');\n\nSELECT within(@g1,@g3);\n+-----------------+\n| within(@g1,@g3) |\n+-----------------+\n| 1 |\n+-----------------+\n\nSELECT within(@g2,@g3);\n+-----------------+\n| within(@g2,@g3) |\n+-----------------+\n| 0 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/within/','','https://mariadb.com/kb/en/within/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (505,31,'Microseconds in MariaDB','The TIME, DATETIME, and TIMESTAMP types, along with the temporal functions,\nCAST and dynamic columns, support microseconds. The datetime precision of a\ncolumn can be specified when creating the table with CREATE TABLE, for example:\n\nCREATE TABLE example(\n col_microsec DATETIME(6),\n col_millisec TIME(3)\n);\n\nGenerally, the precision can be specified for any TIME, DATETIME, or TIMESTAMP\ncolumn, in parentheses, after the type name. The datetime precision specifies\nnumber of digits after the decimal dot and can be any integer number from 0 to\n6. If no precision is specified it is assumed to be 0, for backward\ncompatibility reasons.\n\nA datetime precision can be specified wherever a type name is used. For\nexample:\n\n* when declaring arguments of stored routines.\n* when specifying a return type of a stored function.\n* when declaring variables.\n* in a CAST function:create function example(x datetime(5)) returns time(4)\nbegin\n declare y timestamp(6);\n return cast(x as time(2));\nend;\n\n%f is used as the formatting option for microseconds in the STR_TO_DATE,\nDATE_FORMAT and FROM_UNIXTIME functions, for example:\n\nSELECT STR_TO_DATE(\'20200809 020917076\',\'%Y%m%d %H%i%s%f\');\n+-----------------------------------------------------+\n| STR_TO_DATE(\'20200809 020917076\',\'%Y%m%d %H%i%s%f\') |\n+-----------------------------------------------------+\n| 2020-08-09 02:09:17.076000 |\n+-----------------------------------------------------+\n\nAdditional Information\n----------------------\n\n* when comparing anything to a temporal value (DATETIME, TIME, DATE, or\nTIMESTAMP), both values are compared as temporal values, not as strings.\n* The INFORMATION_SCHEMA.COLUMNS table has a new column DATETIME_PRECISION\n* NOW(), CURTIME(), UTC_TIMESTAMP(), UTC_TIME(), CURRENT_TIME(),\nCURRENT_TIMESTAMP(), LOCALTIME() and LOCALTIMESTAMP() now accept datetime\nprecision as an optional argument. For example:SELECT CURTIME(4);\n--> 10:11:12.3456\n\n* TIME_TO_SEC() and UNIX_TIMESTAMP() preserve microseconds of the argument.\nThese functions will return a decimal number if the result non-zero datetime\nprecision and an integer otherwise (for backward compatibility).SELECT\nTIME_TO_SEC(\'10:10:10.12345\');\n--> 36610.12345\n\n* Current versions of this patch fix a bug in the following optimization: in\n certain queries with DISTINCT MariaDB can ignore this clause if it can\n prove that all result rows are unique anyway, for example, when a primary key\n is compared with a constant. Sometimes this optimization was applied\n incorrectly, though — for example, when comparing a\n string with a date constant. This is now fixed.\n* DATE_ADD() and DATE_SUB() functions can now take a TIME\n expression as an argument (not just DATETIME as before).SELECT\nTIME(\'10:10:10\') + INTERVAL 100 MICROSECOND;\n--> 10:10:10.000100\n\n* The event_time field in the mysql.general_log table and the start_time,\nquery_time, and lock_time fields in the mysql.slow_log table now store values\nwith microsecond precision.\n* This patch fixed a bug when comparing a temporal value using the BETWEEN\noperator and one of the operands is NULL.\n* The old syntax TIMESTAMP(N), where N is the display width, is no longer\nsupported. It was deprecated in MySQL 4.1.0 (released on\n 2003-04-03).\n* when a DATETIME value is compared to a TIME value, the latter is treated as\na full datetime with a zero date part, similar to comparing DATE to a\nDATETIME, or to comparing DECIMAL numbers.\n Earlier versions of MariaDB used to compare only the time part of both\noperands in such a case.\n* In MariaDB, an extra column TIME_MS has been added to the\nINFORMATION_SCHEMA.PROCESSLIST table, as well as to the output of SHOW FULL\nPROCESSLIST.\n\nNote: When you convert a temporal value to a value with a smaller precision,\nit will be truncated, not rounded. This is done to guarantee that the date\npart is not changed. For example:\n\nSELECT CAST(\'2009-12-31 23:59:59.998877\' as DATETIME(3));\n-> 2009-12-31 23:59:59.998\n\nMySQL 5.6 Microseconds\n----------------------\n\nMySQL 5.6 introduced microseconds using a slightly different implementation to\nMariaDB 5.3. Since MariaDB 10.1, MariaDB has defaulted to the MySQL format, by\nmeans of the --mysql56-temporal-format variable. The MySQL version requires\nslightly more storage but has some advantages in permitting the eventual\nsupport of negative dates, and in replication.\n\nURL: https://mariadb.com/kb/en/microseconds-in-mariadb/','','https://mariadb.com/kb/en/microseconds-in-mariadb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (506,31,'Date and Time Units','The INTERVAL keyword can be used to add or subtract a time interval of time to\na DATETIME, DATE or TIME value.\n\nThe syntax is:\n\nINTERVAL time_quantity time_unit\n\nFor example, the SECOND unit is used below by the DATE_ADD() function:\n\nSELECT \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND;\n+-------------------------------------------+\n| \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND |\n+-------------------------------------------+\n| 2009-01-01 00:00:00 |\n+-------------------------------------------+\n\nThe following units are valid:\n\n+---------------------+------------------------------------------------------+\n| Unit | Description |\n+---------------------+------------------------------------------------------+\n| MICROSECOND | Microseconds |\n+---------------------+------------------------------------------------------+\n| SECOND | Seconds |\n+---------------------+------------------------------------------------------+\n| MINUTE | Minutes |\n+---------------------+------------------------------------------------------+\n| HOUR | Hours |\n+---------------------+------------------------------------------------------+\n| DAY | Days |\n+---------------------+------------------------------------------------------+\n| WEEK | Weeks |\n+---------------------+------------------------------------------------------+\n| MONTH | Months |\n+---------------------+------------------------------------------------------+\n| QUARTER | Quarters |\n+---------------------+------------------------------------------------------+\n| YEAR | Years |\n+---------------------+------------------------------------------------------+\n| SECOND_MICROSECOND | Seconds.Microseconds |\n+---------------------+------------------------------------------------------+\n| MINUTE_MICROSECOND | Minutes.Seconds.Microseconds |\n+---------------------+------------------------------------------------------+\n| MINUTE_SECOND | Minutes.Seconds |\n+---------------------+------------------------------------------------------+\n| HOUR_MICROSECOND | Hours.Minutes.Seconds.Microseconds |\n+---------------------+------------------------------------------------------+\n| HOUR_SECOND | Hours.Minutes.Seconds |\n+---------------------+------------------------------------------------------+\n| HOUR_MINUTE | Hours.Minutes |\n+---------------------+------------------------------------------------------+\n| DAY_MICROSECOND | Days Hours.Minutes.Seconds.Microseconds |\n+---------------------+------------------------------------------------------+\n| DAY_SECOND | Days Hours.Minutes.Seconds |\n+---------------------+------------------------------------------------------+\n| DAY_MINUTE | Days Hours.Minutes |\n+---------------------+------------------------------------------------------+\n| DAY_HOUR | Days Hours |\n+---------------------+------------------------------------------------------+\n| YEAR_MONTH | Years-Months |\n+---------------------+------------------------------------------------------+\n\nThe time units containing an underscore are composite; that is, they consist\nof multiple base time units. For base time units, time_quantity is an integer\nnumber. For composite units, the quantity must be expressed as a string with\nmultiple integer numbers separated by any punctuation character.\n\nExample of composite units:\n\nINTERVAL \'2:2\' YEAR_MONTH\nINTERVAL \'1:30:30\' HOUR_SECOND\nINTERVAL \'1!30!30\' HOUR_SECOND -- same as above\n\nTime units can be used in the following contexts:\n\n* after a + or a - operator;\n* with the following DATE or TIME functions: ADDDATE(), SUBDATE(), DATE_ADD(),\nDATE_SUB(), TIMESTAMPADD(), TIMESTAMPDIFF(), EXTRACT();\n* in the ON SCHEDULE clause of CREATE EVENT and ALTER EVENT.\n* when defining a partitioning BY SYSTEM_TIME\n\nURL: https://mariadb.com/kb/en/date-and-time-units/','','https://mariadb.com/kb/en/date-and-time-units/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (507,31,'ADD_MONTHS','MariaDB starting with 10.6.1\n----------------------------\nThe ADD_MONTHS function was introduced in MariaDB 10.6.1 to enhance Oracle\ncompatibility. Similar functionality can be achieved with the DATE_ADD\nfunction.\n\nSyntax\n------\n\nADD_MONTHS(date, months)\n\nDescription\n-----------\n\nADD_MONTHS adds an integer months to a given date (DATE, DATETIME or\nTIMESTAMP), returning the resulting date.\n\nmonths can be positive or negative.\n\nThe resulting day component will remain the same as that specified in date,\nunless the resulting month has fewer days than the day component of the given\ndate, in which case the day will be the last day of the resulting month.\n\nReturns NULL if given an invalid date, or a NULL argument.\n\nExamples\n--------\n\nSELECT ADD_MONTHS(\'2012-01-31\', 2);\n+-----------------------------+\n| ADD_MONTHS(\'2012-01-31\', 2) |\n+-----------------------------+\n| 2012-03-31 |\n+-----------------------------+\n\nSELECT ADD_MONTHS(\'2012-01-31\', -5);\n+------------------------------+\n| ADD_MONTHS(\'2012-01-31\', -5) |\n+------------------------------+\n| 2011-08-31 |\n+------------------------------+\n\nSELECT ADD_MONTHS(\'2011-01-31\', 1);\n+-----------------------------+\n| ADD_MONTHS(\'2011-01-31\', 1) |\n+-----------------------------+\n| 2011-02-28 |\n+-----------------------------+\n\nSELECT ADD_MONTHS(\'2012-01-31\', 1);\n+-----------------------------+\n| ADD_MONTHS(\'2012-01-31\', 1) |\n+-----------------------------+\n| 2012-02-29 |\n+-----------------------------+\n\nSELECT ADD_MONTHS(\'2012-01-31\', 2);\n+-----------------------------+\n| ADD_MONTHS(\'2012-01-31\', 2) |\n+-----------------------------+\n| 2012-03-31 |\n+-----------------------------+\n\nSELECT ADD_MONTHS(\'2012-01-31\', 3);\n+-----------------------------+\n| ADD_MONTHS(\'2012-01-31\', 3) |\n+-----------------------------+\n| 2012-04-30 |\n+-----------------------------+\n\nURL: https://mariadb.com/kb/en/add_months/','','https://mariadb.com/kb/en/add_months/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (508,31,'ADDDATE','Syntax\n------\n\nADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)\n\nDescription\n-----------\n\nWhen invoked with the INTERVAL form of the second argument, ADDDATE() is a\nsynonym for DATE_ADD(). The related function SUBDATE() is a synonym for\nDATE_SUB(). For information on the INTERVAL unit argument, see the discussion\nfor DATE_ADD().\n\nWhen invoked with the days form of the second argument, MariaDB treats it as\nan integer number of days to be added to expr.\n\nExamples\n--------\n\nSELECT DATE_ADD(\'2008-01-02\', INTERVAL 31 DAY);\n+-----------------------------------------+\n| DATE_ADD(\'2008-01-02\', INTERVAL 31 DAY) |\n+-----------------------------------------+\n| 2008-02-02 |\n+-----------------------------------------+\n\nSELECT ADDDATE(\'2008-01-02\', INTERVAL 31 DAY);\n+----------------------------------------+\n| ADDDATE(\'2008-01-02\', INTERVAL 31 DAY) |\n+----------------------------------------+\n| 2008-02-02 |\n+----------------------------------------+\n\nSELECT ADDDATE(\'2008-01-02\', 31);\n+---------------------------+\n| ADDDATE(\'2008-01-02\', 31) |\n+---------------------------+\n| 2008-02-02 |\n+---------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, ADDDATE(d, 10) from t1;\n+---------------------+---------------------+\n| d | ADDDATE(d, 10) |\n+---------------------+---------------------+\n| 2007-01-30 21:31:07 | 2007-02-09 21:31:07 |\n| 1983-10-15 06:42:51 | 1983-10-25 06:42:51 |\n| 2011-04-21 12:34:56 | 2011-05-01 12:34:56 |\n| 2011-10-30 06:31:41 | 2011-11-09 06:31:41 |\n| 2011-01-30 14:03:25 | 2011-02-09 14:03:25 |\n| 2004-10-07 11:19:34 | 2004-10-17 11:19:34 |\n+---------------------+---------------------+\n\nSELECT d, ADDDATE(d, INTERVAL 10 HOUR) from t1;\n+---------------------+------------------------------+\n| d | ADDDATE(d, INTERVAL 10 HOUR) |\n+---------------------+------------------------------+\n| 2007-01-30 21:31:07 | 2007-01-31 07:31:07 |\n| 1983-10-15 06:42:51 | 1983-10-15 16:42:51 |\n| 2011-04-21 12:34:56 | 2011-04-21 22:34:56 |\n| 2011-10-30 06:31:41 | 2011-10-30 16:31:41 |\n| 2011-01-30 14:03:25 | 2011-01-31 00:03:25 |\n| 2004-10-07 11:19:34 | 2004-10-07 21:19:34 |\n+---------------------+------------------------------+\n\nURL: https://mariadb.com/kb/en/adddate/','','https://mariadb.com/kb/en/adddate/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (509,31,'ADDTIME','Syntax\n------\n\nADDTIME(expr1,expr2)\n\nDescription\n-----------\n\nADDTIME() adds expr2 to expr1 and returns the result. expr1 is a time or\ndatetime expression, and expr2 is a time expression.\n\nExamples\n--------\n\nSELECT ADDTIME(\'2007-12-31 23:59:59.999999\', \'1 1:1:1.000002\');\n+---------------------------------------------------------+\n| ADDTIME(\'2007-12-31 23:59:59.999999\', \'1 1:1:1.000002\') |\n+---------------------------------------------------------+\n| 2008-01-02 01:01:01.000001 |\n+---------------------------------------------------------+\n\nSELECT ADDTIME(\'01:00:00.999999\', \'02:00:00.999998\');\n+-----------------------------------------------+\n| ADDTIME(\'01:00:00.999999\', \'02:00:00.999998\') |\n+-----------------------------------------------+\n| 03:00:01.999997 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/addtime/','','https://mariadb.com/kb/en/addtime/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (510,31,'CONVERT_TZ','Syntax\n------\n\nCONVERT_TZ(dt,from_tz,to_tz)\n\nDescription\n-----------\n\nCONVERT_TZ() converts a datetime value dt from the time zone given by from_tz\nto the time zone given by to_tz and returns the resulting value.\n\nIn order to use named time zones, such as GMT, MET or Africa/Johannesburg, the\ntime_zone tables must be loaded (see mysql_tzinfo_to_sql).\n\nNo conversion will take place if the value falls outside of the supported\nTIMESTAMP range (\'1970-01-01 00:00:01\' to \'2038-01-19 05:14:07\' UTC) when\nconverted from from_tz to UTC.\n\nThis function returns NULL if the arguments are invalid (or named time zones\nhave not been loaded).\n\nSee time zones for more information.\n\nExamples\n--------\n\nSELECT CONVERT_TZ(\'2016-01-01 12:00:00\',\'+00:00\',\'+10:00\');\n+-----------------------------------------------------+\n| CONVERT_TZ(\'2016-01-01 12:00:00\',\'+00:00\',\'+10:00\') |\n+-----------------------------------------------------+\n| 2016-01-01 22:00:00 |\n+-----------------------------------------------------+\n\nUsing named time zones (with the time zone tables loaded):\n\nSELECT CONVERT_TZ(\'2016-01-01 12:00:00\',\'GMT\',\'Africa/Johannesburg\');\n+---------------------------------------------------------------+\n| CONVERT_TZ(\'2016-01-01 12:00:00\',\'GMT\',\'Africa/Johannesburg\') |\n+---------------------------------------------------------------+\n| 2016-01-01 14:00:00 |\n+---------------------------------------------------------------+\n\nThe value is out of the TIMESTAMP range, so no conversion takes place:\n\nSELECT CONVERT_TZ(\'1969-12-31 22:00:00\',\'+00:00\',\'+10:00\');\n+-----------------------------------------------------+\n| CONVERT_TZ(\'1969-12-31 22:00:00\',\'+00:00\',\'+10:00\') |\n+-----------------------------------------------------+\n| 1969-12-31 22:00:00 |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/convert_tz/','','https://mariadb.com/kb/en/convert_tz/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (511,31,'CURDATE','Syntax\n------\n\nCURDATE()\nCURRENT_DATE\nCURRENT_DATE()\n\nDescription\n-----------\n\nCURDATE returns the current date as a value in \'YYYY-MM-DD\' or YYYYMMDD\nformat, depending on whether the function is used in a string or numeric\ncontext.\n\nCURRENT_DATE and CURRENT_DATE() are synonyms.\n\nExamples\n--------\n\nSELECT CURDATE();\n+------------+\n| CURDATE() |\n+------------+\n| 2019-03-05 |\n+------------+\n\nIn a numeric context (note this is not performing date calculations):\n\nSELECT CURDATE() +0;\n+--------------+\n| CURDATE() +0 |\n+--------------+\n| 20190305 |\n+--------------+\n\nData calculation:\n\nSELECT CURDATE() - INTERVAL 5 DAY;\n+----------------------------+\n| CURDATE() - INTERVAL 5 DAY |\n+----------------------------+\n| 2019-02-28 |\n+----------------------------+\n\nURL: https://mariadb.com/kb/en/curdate/','','https://mariadb.com/kb/en/curdate/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (512,31,'CURRENT_DATE','Syntax\n------\n\nCURRENT_DATE, CURRENT_DATE()\n\nDescription\n-----------\n\nCURRENT_DATE and CURRENT_DATE() are synonyms for CURDATE().\n\nURL: https://mariadb.com/kb/en/current_date/','','https://mariadb.com/kb/en/current_date/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (513,31,'CURRENT_TIME','Syntax\n------\n\nCURRENT_TIME\nCURRENT_TIME([precision])\n\nDescription\n-----------\n\nCURRENT_TIME and CURRENT_TIME() are synonyms for CURTIME().\n\nURL: https://mariadb.com/kb/en/current_time/','','https://mariadb.com/kb/en/current_time/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (514,31,'CURRENT_TIMESTAMP','Syntax\n------\n\nCURRENT_TIMESTAMP\nCURRENT_TIMESTAMP([precision])\n\nDescription\n-----------\n\nCURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms for NOW().\n\nURL: https://mariadb.com/kb/en/current_timestamp/','','https://mariadb.com/kb/en/current_timestamp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (515,31,'CURTIME','Syntax\n------\n\nCURTIME([precision])\n\nDescription\n-----------\n\nReturns the current time as a value in \'HH:MM:SS\' or HHMMSS.uuuuuu format,\ndepending on whether the function is used in a string or numeric context. The\nvalue is expressed in the current time zone.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nExamples\n--------\n\nSELECT CURTIME();\n+-----------+\n| CURTIME() |\n+-----------+\n| 12:45:39 |\n+-----------+\n\nSELECT CURTIME() + 0;\n+---------------+\n| CURTIME() + 0 |\n+---------------+\n| 124545.000000 |\n+---------------+\n\nWith precision:\n\nSELECT CURTIME(2);\n+-------------+\n| CURTIME(2) |\n+-------------+\n| 09:49:08.09 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/curtime/','','https://mariadb.com/kb/en/curtime/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (516,31,'DATE FUNCTION','Syntax\n------\n\nDATE(expr)\n\nDescription\n-----------\n\nExtracts the date part of the date or datetime expression expr.\n\nExamples\n--------\n\nSELECT DATE(\'2013-07-18 12:21:32\');\n+-----------------------------+\n| DATE(\'2013-07-18 12:21:32\') |\n+-----------------------------+\n| 2013-07-18 |\n+-----------------------------+\n\nError Handling\n--------------\n\nUntil MariaDB 5.5.32, some versions of MariaDB returned 0000-00-00 when passed\nan invalid date. From 5.5.32, NULL is returned.\n\nURL: https://mariadb.com/kb/en/date-function/','','https://mariadb.com/kb/en/date-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (517,31,'DATEDIFF','Syntax\n------\n\nDATEDIFF(expr1,expr2)\n\nDescription\n-----------\n\nDATEDIFF() returns (expr1 – expr2) expressed as a value in days from one date\nto the other. expr1 and expr2 are date or date-and-time expressions. Only the\ndate parts of the values are used in the calculation.\n\nExamples\n--------\n\nSELECT DATEDIFF(\'2007-12-31 23:59:59\',\'2007-12-30\');\n+----------------------------------------------+\n| DATEDIFF(\'2007-12-31 23:59:59\',\'2007-12-30\') |\n+----------------------------------------------+\n| 1 |\n+----------------------------------------------+\n\nSELECT DATEDIFF(\'2010-11-30 23:59:59\',\'2010-12-31\');\n+----------------------------------------------+\n| DATEDIFF(\'2010-11-30 23:59:59\',\'2010-12-31\') |\n+----------------------------------------------+\n| -31 |\n+----------------------------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2011-05-23 10:56:05 |\n+---------------------+\n\nSELECT d, DATEDIFF(NOW(),d) FROM t1;\n+---------------------+-------------------+\n| d | DATEDIFF(NOW(),d) |\n+---------------------+-------------------+\n| 2007-01-30 21:31:07 | 1574 |\n| 1983-10-15 06:42:51 | 10082 |\n| 2011-04-21 12:34:56 | 32 |\n| 2011-10-30 06:31:41 | -160 |\n| 2011-01-30 14:03:25 | 113 |\n| 2004-10-07 11:19:34 | 2419 |\n+---------------------+-------------------+\n\nURL: https://mariadb.com/kb/en/datediff/','','https://mariadb.com/kb/en/datediff/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (518,31,'DATE_ADD','Syntax\n------\n\nDATE_ADD(date,INTERVAL expr unit)\n\nDescription\n-----------\n\nPerforms date arithmetic. The date argument specifies the starting date or\ndatetime value. expr is an expression specifying the interval value to be\nadded or subtracted from the starting date. expr is a string; it may start\nwith a \"-\" for negative intervals. unit is a keyword indicating the units in\nwhich the expression should be interpreted. See Date and Time Units for a\ncomplete list of permitted units.\n\nExamples\n--------\n\nSELECT \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND;\n+-------------------------------------------+\n| \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND |\n+-------------------------------------------+\n| 2009-01-01 00:00:00 |\n+-------------------------------------------+\n\nSELECT INTERVAL 1 DAY + \'2008-12-31\';\n+-------------------------------+\n| INTERVAL 1 DAY + \'2008-12-31\' |\n+-------------------------------+\n| 2009-01-01 |\n+-------------------------------+\n\nSELECT \'2005-01-01\' - INTERVAL 1 SECOND;\n+----------------------------------+\n| \'2005-01-01\' - INTERVAL 1 SECOND |\n+----------------------------------+\n| 2004-12-31 23:59:59 |\n+----------------------------------+\n\nSELECT DATE_ADD(\'2000-12-31 23:59:59\', INTERVAL 1 SECOND);\n+----------------------------------------------------+\n| DATE_ADD(\'2000-12-31 23:59:59\', INTERVAL 1 SECOND) |\n+----------------------------------------------------+\n| 2001-01-01 00:00:00 |\n+----------------------------------------------------+\n\nSELECT DATE_ADD(\'2010-12-31 23:59:59\', INTERVAL 1 DAY);\n+-------------------------------------------------+\n| DATE_ADD(\'2010-12-31 23:59:59\', INTERVAL 1 DAY) |\n+-------------------------------------------------+\n| 2011-01-01 23:59:59 |\n+-------------------------------------------------+\n\nSELECT DATE_ADD(\'2100-12-31 23:59:59\', INTERVAL \'1:1\' MINUTE_SECOND);\n+---------------------------------------------------------------+\n| DATE_ADD(\'2100-12-31 23:59:59\', INTERVAL \'1:1\' MINUTE_SECOND) |\n+---------------------------------------------------------------+\n| 2101-01-01 00:01:00 |\n+---------------------------------------------------------------+\n\nSELECT DATE_ADD(\'1900-01-01 00:00:00\', INTERVAL \'-1 10\' DAY_HOUR);\n+------------------------------------------------------------+\n| DATE_ADD(\'1900-01-01 00:00:00\', INTERVAL \'-1 10\' DAY_HOUR) |\n+------------------------------------------------------------+\n| 1899-12-30 14:00:00 |\n+------------------------------------------------------------+\n\nSELECT DATE_ADD(\'1992-12-31 23:59:59.000002\', INTERVAL \'1.999999\'\nSECOND_MICROSECOND);\n+------------------------------------------------------------------------------\n-+\n| DATE_ADD(\'1992-12-31 23:59:59.000002\', INTERVAL \'1.999999\'\nSECOND_MICROSECOND) |\n+------------------------------------------------------------------------------\n-+\n| 1993-01-01 00:00:01.000001 \n |\n+------------------------------------------------------------------------------\n-+\n\nURL: https://mariadb.com/kb/en/date_add/','','https://mariadb.com/kb/en/date_add/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (519,31,'DATE_FORMAT','Syntax\n------\n\nDATE_FORMAT(date, format[, locale])\n\nDescription\n-----------\n\nFormats the date value according to the format string.\n\nThe language used for the names is controlled by the value of the\nlc_time_names system variable. See server locale for more on the supported\nlocales.\n\nThe options that can be used by DATE_FORMAT(), as well as its inverse\nSTR_TO_DATE() and the FROM_UNIXTIME() function, are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| %a | Short weekday name in current locale |\n| | (Variable lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %b | Short form month name in current locale. For |\n| | locale en_US this is one of: |\n| | Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov |\n| | or Dec. |\n+---------------------------+------------------------------------------------+\n| %c | Month with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %D | Day with English suffix \'th\', \'nd\', \'st\' or |\n| | \'rd\'\'. (1st, 2nd, 3rd...). |\n+---------------------------+------------------------------------------------+\n| %d | Day with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %e | Day with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %f | Microseconds 6 digits. |\n+---------------------------+------------------------------------------------+\n| %H | Hour with 2 digits between 00-23. |\n+---------------------------+------------------------------------------------+\n| %h | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %I | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %i | Minute with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %j | Day of the year (001-366) |\n+---------------------------+------------------------------------------------+\n| %k | Hour with 1 digits between 0-23. |\n+---------------------------+------------------------------------------------+\n| %l | Hour with 1 digits between 1-12. |\n+---------------------------+------------------------------------------------+\n| %M | Full month name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %m | Month with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %p | AM/PM according to current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %r | Time in 12 hour format, followed by AM/PM. |\n| | Short for \'%I:%i:%S %p\'. |\n+---------------------------+------------------------------------------------+\n| %S | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %s | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %T | Time in 24 hour format. Short for \'%H:%i:%S\'. |\n+---------------------------+------------------------------------------------+\n| %U | Week number (00-53), when first day of the |\n| | week is Sunday. |\n+---------------------------+------------------------------------------------+\n| %u | Week number (00-53), when first day of the |\n| | week is Monday. |\n+---------------------------+------------------------------------------------+\n| %V | Week number (01-53), when first day of the |\n| | week is Sunday. Used with %X. |\n+---------------------------+------------------------------------------------+\n| %v | Week number (01-53), when first day of the |\n| | week is Monday. Used with %x. |\n+---------------------------+------------------------------------------------+\n| %W | Full weekday name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %w | Day of the week. 0 = Sunday, 6 = Saturday. |\n+---------------------------+------------------------------------------------+\n| %X | Year with 4 digits when first day of the week |\n| | is Sunday. Used with %V. |\n+---------------------------+------------------------------------------------+\n| %x | Year with 4 digits when first day of the week |\n| | is Monday. Used with %v. |\n+---------------------------+------------------------------------------------+\n| %Y | Year with 4 digits. |\n+---------------------------+------------------------------------------------+\n| %y | Year with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %# | For str_to_date(), skip all numbers. |\n+---------------------------+------------------------------------------------+\n| %. | For str_to_date(), skip all punctation |\n| | characters. |\n+---------------------------+------------------------------------------------+\n| %@ | For str_to_date(), skip all alpha characters. |\n+---------------------------+------------------------------------------------+\n| %% | A literal % character. |\n+---------------------------+------------------------------------------------+\n\nTo get a date in one of the standard formats, GET_FORMAT() can be used.\n\nExamples\n--------\n\nSELECT DATE_FORMAT(\'2009-10-04 22:23:00\', \'%W %M %Y\');\n+------------------------------------------------+\n| DATE_FORMAT(\'2009-10-04 22:23:00\', \'%W %M %Y\') |\n+------------------------------------------------+\n| Sunday October 2009 |\n+------------------------------------------------+\n\nSELECT DATE_FORMAT(\'2007-10-04 22:23:00\', \'%H:%i:%s\');\n+------------------------------------------------+\n| DATE_FORMAT(\'2007-10-04 22:23:00\', \'%H:%i:%s\') |\n+------------------------------------------------+\n| 22:23:00 |\n+------------------------------------------------+\n\nSELECT DATE_FORMAT(\'1900-10-04 22:23:00\', \'%D %y %a %d %m %b %j\');\n+------------------------------------------------------------+\n| DATE_FORMAT(\'1900-10-04 22:23:00\', \'%D %y %a %d %m %b %j\') |\n+------------------------------------------------------------+\n| 4th 00 Thu 04 10 Oct 277 |\n+------------------------------------------------------------+\n\nSELECT DATE_FORMAT(\'1997-10-04 22:23:00\', \'%H %k %I %r %T %S %w\');\n+------------------------------------------------------------+\n| DATE_FORMAT(\'1997-10-04 22:23:00\', \'%H %k %I %r %T %S %w\') |\n+------------------------------------------------------------+\n| 22 22 10 10:23:00 PM 22:23:00 00 6 |\n+------------------------------------------------------------+\n\nSELECT DATE_FORMAT(\'1999-01-01\', \'%X %V\');\n+------------------------------------+\n| DATE_FORMAT(\'1999-01-01\', \'%X %V\') |\n+------------------------------------+\n| 1998 52 |\n+------------------------------------+\n\nSELECT DATE_FORMAT(\'2006-06-00\', \'%d\');\n+---------------------------------+\n| DATE_FORMAT(\'2006-06-00\', \'%d\') |\n+---------------------------------+\n| 00 |\n+---------------------------------+\n\nMariaDB starting with 10.3.2\n----------------------------\nOptionally, the locale can be explicitly specified as the third DATE_FORMAT()\nargument. Doing so makes the function independent from the session settings,\nand the three argument version of DATE_FORMAT() can be used in virtual indexed\nand persistent generated-columns:\n\nSELECT DATE_FORMAT(\'2006-01-01\', \'%W\', \'el_GR\');\n+------------------------------------------+\n| DATE_FORMAT(\'2006-01-01\', \'%W\', \'el_GR\') |\n+------------------------------------------+\n| ΚυÏιακή |\n+------------------------------------------+\n\nURL: https://mariadb.com/kb/en/date_format/','','https://mariadb.com/kb/en/date_format/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (520,31,'DATE_SUB','Syntax\n------\n\nDATE_SUB(date,INTERVAL expr unit)\n\nDescription\n-----------\n\nPerforms date arithmetic. The date argument specifies the starting date or\ndatetime value. expr is an expression specifying the interval value to be\nadded or subtracted from the starting date. expr is a string; it may start\nwith a \"-\" for negative intervals. unit is a keyword indicating the units in\nwhich the expression should be interpreted. See Date and Time Units for a\ncomplete list of permitted units.\n\nSee also DATE_ADD().\n\nExamples\n--------\n\nSELECT DATE_SUB(\'1998-01-02\', INTERVAL 31 DAY);\n+-----------------------------------------+\n| DATE_SUB(\'1998-01-02\', INTERVAL 31 DAY) |\n+-----------------------------------------+\n| 1997-12-02 |\n+-----------------------------------------+\n\nSELECT DATE_SUB(\'2005-01-01 00:00:00\', INTERVAL \'1 1:1:1\' DAY_SECOND);\n+----------------------------------------------------------------+\n| DATE_SUB(\'2005-01-01 00:00:00\', INTERVAL \'1 1:1:1\' DAY_SECOND) |\n+----------------------------------------------------------------+\n| 2004-12-30 22:58:59 |\n+----------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/date_sub/','','https://mariadb.com/kb/en/date_sub/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (521,31,'DAY','Syntax\n------\n\nDAY(date)\n\nDescription\n-----------\n\nDAY() is a synonym for DAYOFMONTH().\n\nURL: https://mariadb.com/kb/en/day/','','https://mariadb.com/kb/en/day/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (522,31,'DAYNAME','Syntax\n------\n\nDAYNAME(date)\n\nDescription\n-----------\n\nReturns the name of the weekday for date. The language used for the name is\ncontrolled by the value of the lc_time_names system variable. See server\nlocale for more on the supported locales.\n\nExamples\n--------\n\nSELECT DAYNAME(\'2007-02-03\');\n+-----------------------+\n| DAYNAME(\'2007-02-03\') |\n+-----------------------+\n| Saturday |\n+-----------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, DAYNAME(d) FROM t1;\n+---------------------+------------+\n| d | DAYNAME(d) |\n+---------------------+------------+\n| 2007-01-30 21:31:07 | Tuesday |\n| 1983-10-15 06:42:51 | Saturday |\n| 2011-04-21 12:34:56 | Thursday |\n| 2011-10-30 06:31:41 | Sunday |\n| 2011-01-30 14:03:25 | Sunday |\n| 2004-10-07 11:19:34 | Thursday |\n+---------------------+------------+\n\nChanging the locale:\n\nSET lc_time_names = \'fr_CA\';\n\nSELECT DAYNAME(\'2013-04-01\');\n+-----------------------+\n| DAYNAME(\'2013-04-01\') |\n+-----------------------+\n| lundi |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/dayname/','','https://mariadb.com/kb/en/dayname/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (523,31,'DAYOFMONTH','Syntax\n------\n\nDAYOFMONTH(date)\n\nDescription\n-----------\n\nReturns the day of the month for date, in the range 1 to 31, or 0 for dates\nsuch as \'0000-00-00\' or \'2008-00-00\' which have a zero day part.\n\nDAY() is a synonym.\n\nExamples\n--------\n\nSELECT DAYOFMONTH(\'2007-02-03\');\n+--------------------------+\n| DAYOFMONTH(\'2007-02-03\') |\n+--------------------------+\n| 3 |\n+--------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d FROM t1 where DAYOFMONTH(d) = 30;\n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/dayofmonth/','','https://mariadb.com/kb/en/dayofmonth/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (524,31,'DAYOFWEEK','Syntax\n------\n\nDAYOFWEEK(date)\n\nDescription\n-----------\n\nReturns the day of the week index for the date (1 = Sunday, 2 = Monday, ..., 7\n= Saturday). These index values correspond to the ODBC standard.\n\nThis contrasts with WEEKDAY() which follows a different index numbering (0 =\nMonday, 1 = Tuesday, ... 6 = Sunday).\n\nExamples\n--------\n\nSELECT DAYOFWEEK(\'2007-02-03\');\n+-------------------------+\n| DAYOFWEEK(\'2007-02-03\') |\n+-------------------------+\n| 7 |\n+-------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, DAYNAME(d), DAYOFWEEK(d), WEEKDAY(d) from t1;\n+---------------------+------------+--------------+------------+\n| d | DAYNAME(d) | DAYOFWEEK(d) | WEEKDAY(d) |\n+---------------------+------------+--------------+------------+\n| 2007-01-30 21:31:07 | Tuesday | 3 | 1 |\n| 1983-10-15 06:42:51 | Saturday | 7 | 5 |\n| 2011-04-21 12:34:56 | Thursday | 5 | 3 |\n| 2011-10-30 06:31:41 | Sunday | 1 | 6 |\n| 2011-01-30 14:03:25 | Sunday | 1 | 6 |\n| 2004-10-07 11:19:34 | Thursday | 5 | 3 |\n+---------------------+------------+--------------+------------+\n\nURL: https://mariadb.com/kb/en/dayofweek/','','https://mariadb.com/kb/en/dayofweek/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (525,31,'DAYOFYEAR','Syntax\n------\n\nDAYOFYEAR(date)\n\nDescription\n-----------\n\nReturns the day of the year for date, in the range 1 to 366.\n\nExamples\n--------\n\nSELECT DAYOFYEAR(\'2018-02-16\');\n+-------------------------+\n| DAYOFYEAR(\'2018-02-16\') |\n+-------------------------+\n| 47 |\n+-------------------------+\n\nURL: https://mariadb.com/kb/en/dayofyear/','','https://mariadb.com/kb/en/dayofyear/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (526,31,'EXTRACT','Syntax\n------\n\nEXTRACT(unit FROM date)\n\nDescription\n-----------\n\nThe EXTRACT() function extracts the required unit from the date. See Date and\nTime Units for a complete list of permitted units.\n\nIn MariaDB 10.0.7 and MariaDB 5.5.35, EXTRACT (HOUR FROM ...) was changed to\nreturn a value from 0 to 23, adhering to the SQL standard. Until MariaDB\n10.0.6 and MariaDB 5.5.34, and in all versions of MySQL at least as of MySQL\n5.7, it could return a value > 23. HOUR() is not a standard function, so\ncontinues to adhere to the old behaviour inherited from MySQL.\n\nExamples\n--------\n\nSELECT EXTRACT(YEAR FROM \'2009-07-02\');\n+---------------------------------+\n| EXTRACT(YEAR FROM \'2009-07-02\') |\n+---------------------------------+\n| 2009 |\n+---------------------------------+\n\nSELECT EXTRACT(YEAR_MONTH FROM \'2009-07-02 01:02:03\');\n+------------------------------------------------+\n| EXTRACT(YEAR_MONTH FROM \'2009-07-02 01:02:03\') |\n+------------------------------------------------+\n| 200907 |\n+------------------------------------------------+\n\nSELECT EXTRACT(DAY_MINUTE FROM \'2009-07-02 01:02:03\');\n+------------------------------------------------+\n| EXTRACT(DAY_MINUTE FROM \'2009-07-02 01:02:03\') |\n+------------------------------------------------+\n| 20102 |\n+------------------------------------------------+\n\nSELECT EXTRACT(MICROSECOND FROM \'2003-01-02 10:30:00.000123\');\n+--------------------------------------------------------+\n| EXTRACT(MICROSECOND FROM \'2003-01-02 10:30:00.000123\') |\n+--------------------------------------------------------+\n| 123 |\n+--------------------------------------------------------+\n\nFrom MariaDB 10.0.7 and MariaDB 5.5.35, EXTRACT (HOUR FROM...) returns a value\nfrom 0 to 23, as per the SQL standard. HOUR is not a standard function, so\ncontinues to adhere to the old behaviour inherited from MySQL.\n\nSELECT EXTRACT(HOUR FROM \'26:30:00\'), HOUR(\'26:30:00\');\n+-------------------------------+------------------+\n| EXTRACT(HOUR FROM \'26:30:00\') | HOUR(\'26:30:00\') |\n+-------------------------------+------------------+\n| 2 | 26 |\n+-------------------------------+------------------+\n\nURL: https://mariadb.com/kb/en/extract/','','https://mariadb.com/kb/en/extract/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (527,31,'FROM_DAYS','Syntax\n------\n\nFROM_DAYS(N)\n\nDescription\n-----------\n\nGiven a day number N, returns a DATE value. The day count is based on the\nnumber of days from the start of the standard calendar (0000-00-00).\n\nThe function is not designed for use with dates before the advent of the\nGregorian calendar in October 1582. Results will not be reliable since it\ndoesn\'t account for the lost days when the calendar changed from the Julian\ncalendar.\n\nThis is the converse of the TO_DAYS() function.\n\nExamples\n--------\n\nSELECT FROM_DAYS(730669);\n+-------------------+\n| FROM_DAYS(730669) |\n+-------------------+\n| 2000-07-03 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/from_days/','','https://mariadb.com/kb/en/from_days/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (528,31,'FROM_UNIXTIME','Syntax\n------\n\nFROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)\n\nDescription\n-----------\n\nReturns a representation of the unix_timestamp argument as a value in\n\'YYYY-MM-DD HH:MM:SS\' or YYYYMMDDHHMMSS.uuuuuu format, depending on whether\nthe function is used in a string or numeric context. The value is expressed in\nthe current time zone. unix_timestamp is an internal timestamp value such as\nis produced by the UNIX_TIMESTAMP() function.\n\nIf format is given, the result is formatted according to the format string,\nwhich is used the same way as listed in the entry for the DATE_FORMAT()\nfunction.\n\nTimestamps in MariaDB have a maximum value of 2147483647, equivalent to\n2038-01-19 05:14:07. This is due to the underlying 32-bit limitation. Using\nthe function on a timestamp beyond this will result in NULL being returned.\nUse DATETIME as a storage type if you require dates beyond this.\n\nThe options that can be used by FROM_UNIXTIME(), as well as DATE_FORMAT() and\nSTR_TO_DATE(), are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| %a | Short weekday name in current locale |\n| | (Variable lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %b | Short form month name in current locale. For |\n| | locale en_US this is one of: |\n| | Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov |\n| | or Dec. |\n+---------------------------+------------------------------------------------+\n| %c | Month with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %D | Day with English suffix \'th\', \'nd\', \'st\' or |\n| | \'rd\'\'. (1st, 2nd, 3rd...). |\n+---------------------------+------------------------------------------------+\n| %d | Day with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %e | Day with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %f | Microseconds 6 digits. |\n+---------------------------+------------------------------------------------+\n| %H | Hour with 2 digits between 00-23. |\n+---------------------------+------------------------------------------------+\n| %h | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %I | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %i | Minute with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %j | Day of the year (001-366) |\n+---------------------------+------------------------------------------------+\n| %k | Hour with 1 digits between 0-23. |\n+---------------------------+------------------------------------------------+\n| %l | Hour with 1 digits between 1-12. |\n+---------------------------+------------------------------------------------+\n| %M | Full month name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %m | Month with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %p | AM/PM according to current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %r | Time in 12 hour format, followed by AM/PM. |\n| | Short for \'%I:%i:%S %p\'. |\n+---------------------------+------------------------------------------------+\n| %S | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %s | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %T | Time in 24 hour format. Short for \'%H:%i:%S\'. |\n+---------------------------+------------------------------------------------+\n| %U | Week number (00-53), when first day of the |\n| | week is Sunday. |\n+---------------------------+------------------------------------------------+\n| %u | Week number (00-53), when first day of the |\n| | week is Monday. |\n+---------------------------+------------------------------------------------+\n| %V | Week number (01-53), when first day of the |\n| | week is Sunday. Used with %X. |\n+---------------------------+------------------------------------------------+\n| %v | Week number (01-53), when first day of the |\n| | week is Monday. Used with %x. |\n+---------------------------+------------------------------------------------+\n| %W | Full weekday name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %w | Day of the week. 0 = Sunday, 6 = Saturday. |\n+---------------------------+------------------------------------------------+\n| %X | Year with 4 digits when first day of the week |\n| | is Sunday. Used with %V. |\n+---------------------------+------------------------------------------------+\n| %x | Year with 4 digits when first day of the week |\n| | is Sunday. Used with %v. |\n+---------------------------+------------------------------------------------+\n| %Y | Year with 4 digits. |\n+---------------------------+------------------------------------------------+\n| %y | Year with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %# | For str_to_date(), skip all numbers. |\n+---------------------------+------------------------------------------------+\n| %. | For str_to_date(), skip all punctation |\n| | characters. |\n+---------------------------+------------------------------------------------+\n| %@ | For str_to_date(), skip all alpha characters. |\n+---------------------------+------------------------------------------------+\n| %% | A literal % character. |\n+---------------------------+------------------------------------------------+\n\nPerformance Considerations\n--------------------------\n\nIf your session time zone is set to SYSTEM (the default), FROM_UNIXTIME() will\ncall the OS function to convert the data using the system time zone. At least\non Linux, the corresponding function (localtime_r) uses a global mutex inside\nglibc that can cause contention under high concurrent load.\n\nSet your time zone to a named time zone to avoid this issue. See mysql time\nzone tables for details on how to do this.\n\nExamples\n--------\n\nSELECT FROM_UNIXTIME(1196440219);\n+---------------------------+\n| FROM_UNIXTIME(1196440219) |\n+---------------------------+\n| 2007-11-30 11:30:19 |\n+---------------------------+\n\nSELECT FROM_UNIXTIME(1196440219) + 0;\n+-------------------------------+\n| FROM_UNIXTIME(1196440219) + 0 |\n+-------------------------------+\n| 20071130113019.000000 |\n+-------------------------------+\n\nSELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), \'%Y %D %M %h:%i:%s %x\');\n+---------------------------------------------------------+\n| FROM_UNIXTIME(UNIX_TIMESTAMP(), \'%Y %D %M %h:%i:%s %x\') |\n+---------------------------------------------------------+\n| 2010 27th March 01:03:47 2010 |\n+---------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/from_unixtime/','','https://mariadb.com/kb/en/from_unixtime/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (529,31,'GET_FORMAT','Syntax\n------\n\nGET_FORMAT({DATE|DATETIME|TIME}, {\'EUR\'|\'USA\'|\'JIS\'|\'ISO\'|\'INTERNAL\'})\n\nDescription\n-----------\n\nReturns a format string. This function is useful in combination with the\nDATE_FORMAT() and the STR_TO_DATE() functions.\n\nPossible result formats are:\n\n+--------------------------------------+--------------------------------------+\n| Function Call | Result Format |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'EUR\') | \'%d.%m.%Y\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'USA\') | \'%m.%d.%Y\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'JIS\') | \'%Y-%m-%d\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'ISO\') | \'%Y-%m-%d\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'INTERNAL\') | \'%Y%m%d\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'EUR\') | \'%Y-%m-%d %H.%i.%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'USA\') | \'%Y-%m-%d %H.%i.%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'JIS\') | \'%Y-%m-%d %H:%i:%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'ISO\') | \'%Y-%m-%d %H:%i:%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'INTERNAL\') | \'%Y%m%d%H%i%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'EUR\') | \'%H.%i.%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'USA\') | \'%h:%i:%s %p\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'JIS\') | \'%H:%i:%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'ISO\') | \'%H:%i:%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'INTERNAL\') | \'%H%i%s\' |\n+--------------------------------------+--------------------------------------+\n\nExamples\n--------\n\nObtaining the string matching to the standard European date format:\n\nSELECT GET_FORMAT(DATE, \'EUR\');\n+-------------------------+\n| GET_FORMAT(DATE, \'EUR\') |\n+-------------------------+\n| %d.%m.%Y |\n+-------------------------+\n\nUsing the same string to format a date:\n\nSELECT DATE_FORMAT(\'2003-10-03\',GET_FORMAT(DATE,\'EUR\'));\n+--------------------------------------------------+\n| DATE_FORMAT(\'2003-10-03\',GET_FORMAT(DATE,\'EUR\')) |\n+--------------------------------------------------+\n| 03.10.2003 |\n+--------------------------------------------------+\n\nSELECT STR_TO_DATE(\'10.31.2003\',GET_FORMAT(DATE,\'USA\'));\n+--------------------------------------------------+\n| STR_TO_DATE(\'10.31.2003\',GET_FORMAT(DATE,\'USA\')) |\n+--------------------------------------------------+\n| 2003-10-31 |\n+--------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/get_format/','','https://mariadb.com/kb/en/get_format/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (530,31,'HOUR','Syntax\n------\n\nHOUR(time)\n\nDescription\n-----------\n\nReturns the hour for time. The range of the return value is 0 to 23 for\ntime-of-day values. However, the range of TIME values actually is much larger,\nso HOUR can return values greater than 23.\n\nThe return value is always positive, even if a negative TIME value is provided.\n\nExamples\n--------\n\nSELECT HOUR(\'10:05:03\');\n+------------------+\n| HOUR(\'10:05:03\') |\n+------------------+\n| 10 |\n+------------------+\n\nSELECT HOUR(\'272:59:59\');\n+-------------------+\n| HOUR(\'272:59:59\') |\n+-------------------+\n| 272 |\n+-------------------+\n\nDifference between EXTRACT (HOUR FROM ...) (>= MariaDB 10.0.7 and MariaDB\n5.5.35) and HOUR:\n\nSELECT EXTRACT(HOUR FROM \'26:30:00\'), HOUR(\'26:30:00\');\n+-------------------------------+------------------+\n| EXTRACT(HOUR FROM \'26:30:00\') | HOUR(\'26:30:00\') |\n+-------------------------------+------------------+\n| 2 | 26 |\n+-------------------------------+------------------+\n\nURL: https://mariadb.com/kb/en/hour/','','https://mariadb.com/kb/en/hour/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (531,31,'LAST_DAY','Syntax\n------\n\nLAST_DAY(date)\n\nDescription\n-----------\n\nTakes a date or datetime value and returns the corresponding value for the\nlast day of the month. Returns NULL if the argument is invalid.\n\nExamples\n--------\n\nSELECT LAST_DAY(\'2003-02-05\');\n+------------------------+\n| LAST_DAY(\'2003-02-05\') |\n+------------------------+\n| 2003-02-28 |\n+------------------------+\n\nSELECT LAST_DAY(\'2004-02-05\');\n+------------------------+\n| LAST_DAY(\'2004-02-05\') |\n+------------------------+\n| 2004-02-29 |\n+------------------------+\n\nSELECT LAST_DAY(\'2004-01-01 01:01:01\');\n+---------------------------------+\n| LAST_DAY(\'2004-01-01 01:01:01\') |\n+---------------------------------+\n| 2004-01-31 |\n+---------------------------------+\n\nSELECT LAST_DAY(\'2003-03-32\');\n+------------------------+\n| LAST_DAY(\'2003-03-32\') |\n+------------------------+\n| NULL |\n+------------------------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Incorrect datetime value: \'2003-03-32\'\n\nURL: https://mariadb.com/kb/en/last_day/','','https://mariadb.com/kb/en/last_day/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (532,31,'LOCALTIME','Syntax\n------\n\nLOCALTIME\nLOCALTIME([precision])\n\nDescription\n-----------\n\nLOCALTIME and LOCALTIME() are synonyms for NOW().\n\nURL: https://mariadb.com/kb/en/localtime/','','https://mariadb.com/kb/en/localtime/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (533,31,'LOCALTIMESTAMP','Syntax\n------\n\nLOCALTIMESTAMP\nLOCALTIMESTAMP([precision])\n\nDescription\n-----------\n\nLOCALTIMESTAMP and LOCALTIMESTAMP() are synonyms for NOW().\n\nURL: https://mariadb.com/kb/en/localtimestamp/','','https://mariadb.com/kb/en/localtimestamp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (534,31,'MAKEDATE','Syntax\n------\n\nMAKEDATE(year,dayofyear)\n\nDescription\n-----------\n\nReturns a date, given year and day-of-year values. dayofyear must be greater\nthan 0 or the result is NULL.\n\nExamples\n--------\n\nSELECT MAKEDATE(2011,31), MAKEDATE(2011,32);\n+-------------------+-------------------+\n| MAKEDATE(2011,31) | MAKEDATE(2011,32) |\n+-------------------+-------------------+\n| 2011-01-31 | 2011-02-01 |\n+-------------------+-------------------+\n\nSELECT MAKEDATE(2011,365), MAKEDATE(2014,365);\n+--------------------+--------------------+\n| MAKEDATE(2011,365) | MAKEDATE(2014,365) |\n+--------------------+--------------------+\n| 2011-12-31 | 2014-12-31 |\n+--------------------+--------------------+\n\nSELECT MAKEDATE(2011,0);\n+------------------+\n| MAKEDATE(2011,0) |\n+------------------+\n| NULL |\n+------------------+\n\nURL: https://mariadb.com/kb/en/makedate/','','https://mariadb.com/kb/en/makedate/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (535,31,'MAKETIME','Syntax\n------\n\nMAKETIME(hour,minute,second)\n\nDescription\n-----------\n\nReturns a time value calculated from the hour, minute, and second arguments.\n\nIf minute or second are out of the range 0 to 60, NULL is returned. The hour\ncan be in the range -838 to 838, outside of which the value is truncated with\na warning.\n\nExamples\n--------\n\nSELECT MAKETIME(13,57,33);\n+--------------------+\n| MAKETIME(13,57,33) |\n+--------------------+\n| 13:57:33 |\n+--------------------+\n\nSELECT MAKETIME(-13,57,33);\n+---------------------+\n| MAKETIME(-13,57,33) |\n+---------------------+\n| -13:57:33 |\n+---------------------+\n\nSELECT MAKETIME(13,67,33);\n+--------------------+\n| MAKETIME(13,67,33) |\n+--------------------+\n| NULL |\n+--------------------+\n\nSELECT MAKETIME(-1000,57,33);\n+-----------------------+\n| MAKETIME(-1000,57,33) |\n+-----------------------+\n| -838:59:59 |\n+-----------------------+\n1 row in set, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+-----------------------------------------------+\n| Level | Code | Message |\n+---------+------+-----------------------------------------------+\n| Warning | 1292 | Truncated incorrect time value: \'-1000:57:33\' |\n+---------+------+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/maketime/','','https://mariadb.com/kb/en/maketime/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (536,31,'MICROSECOND','Syntax\n------\n\nMICROSECOND(expr)\n\nDescription\n-----------\n\nReturns the microseconds from the time or datetime expression expr as a number\nin the range from 0 to 999999.\n\nIf expr is a time with no microseconds, zero is returned, while if expr is a\ndate with no time, zero with a warning is returned.\n\nExamples\n--------\n\nSELECT MICROSECOND(\'12:00:00.123456\');\n+--------------------------------+\n| MICROSECOND(\'12:00:00.123456\') |\n+--------------------------------+\n| 123456 |\n+--------------------------------+\n\nSELECT MICROSECOND(\'2009-12-31 23:59:59.000010\');\n+-------------------------------------------+\n| MICROSECOND(\'2009-12-31 23:59:59.000010\') |\n+-------------------------------------------+\n| 10 |\n+-------------------------------------------+\n\nSELECT MICROSECOND(\'2013-08-07 12:13:14\');\n+------------------------------------+\n| MICROSECOND(\'2013-08-07 12:13:14\') |\n+------------------------------------+\n| 0 |\n+------------------------------------+\n\nSELECT MICROSECOND(\'2013-08-07\');\n+---------------------------+\n| MICROSECOND(\'2013-08-07\') |\n+---------------------------+\n| 0 |\n+---------------------------+\n1 row in set, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+----------------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------------+\n| Warning | 1292 | Truncated incorrect time value: \'2013-08-07\' |\n+---------+------+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/microsecond/','','https://mariadb.com/kb/en/microsecond/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (537,31,'MINUTE','Syntax\n------\n\nMINUTE(time)\n\nDescription\n-----------\n\nReturns the minute for time, in the range 0 to 59.\n\nExamples\n--------\n\nSELECT MINUTE(\'2013-08-03 11:04:03\');\n+-------------------------------+\n| MINUTE(\'2013-08-03 11:04:03\') |\n+-------------------------------+\n| 4 |\n+-------------------------------+\n\nSELECT MINUTE (\'23:12:50\');\n+---------------------+\n| MINUTE (\'23:12:50\') |\n+---------------------+\n| 12 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/minute/','','https://mariadb.com/kb/en/minute/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (538,31,'MONTH','Syntax\n------\n\nMONTH(date)\n\nDescription\n-----------\n\nReturns the month for date in the range 1 to 12 for January to December, or 0\nfor dates such as \'0000-00-00\' or \'2008-00-00\' that have a zero month part.\n\nExamples\n--------\n\nSELECT MONTH(\'2019-01-03\');\n+---------------------+\n| MONTH(\'2019-01-03\') |\n+---------------------+\n| 1 |\n+---------------------+\n\nSELECT MONTH(\'2019-00-03\');\n+---------------------+\n| MONTH(\'2019-00-03\') |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/month/','','https://mariadb.com/kb/en/month/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (539,31,'MONTHNAME','Syntax\n------\n\nMONTHNAME(date)\n\nDescription\n-----------\n\nReturns the full name of the month for date. The language used for the name is\ncontrolled by the value of the lc_time_names system variable. See server\nlocale for more on the supported locales.\n\nExamples\n--------\n\nSELECT MONTHNAME(\'2019-02-03\');\n+-------------------------+\n| MONTHNAME(\'2019-02-03\') |\n+-------------------------+\n| February |\n+-------------------------+\n\nChanging the locale:\n\nSET lc_time_names = \'fr_CA\';\n\nSELECT MONTHNAME(\'2019-05-21\');\n+-------------------------+\n| MONTHNAME(\'2019-05-21\') |\n+-------------------------+\n| mai |\n+-------------------------+\n\nURL: https://mariadb.com/kb/en/monthname/','','https://mariadb.com/kb/en/monthname/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (540,31,'NOW','Syntax\n------\n\nNOW([precision])\nCURRENT_TIMESTAMP\nCURRENT_TIMESTAMP([precision])\nLOCALTIME, LOCALTIME([precision])\nLOCALTIMESTAMP\nLOCALTIMESTAMP([precision])\n\nDescription\n-----------\n\nReturns the current date and time as a value in \'YYYY-MM-DD HH:MM:SS\' or\nYYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a\nstring or numeric context. The value is expressed in the current time zone.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nNOW() (or its synonyms) can be used as the default value for TIMESTAMP columns\nas well as, since MariaDB 10.0.1, DATETIME columns. Before MariaDB 10.0.1, it\nwas only possible for a single TIMESTAMP column per table to contain the\nCURRENT_TIMESTAMP as its default.\n\nWhen displayed in the INFORMATION_SCHEMA.COLUMNS table, a default CURRENT\nTIMESTAMP is displayed as CURRENT_TIMESTAMP up until MariaDB 10.2.2, and as\ncurrent_timestamp() from MariaDB 10.2.3, due to to MariaDB 10.2 accepting\nexpressions in the DEFAULT clause.\n\nChanging the timestamp system variable with a SET timestamp statement affects\nthe value returned by NOW(), but not by SYSDATE().\n\nExamples\n--------\n\nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2010-03-27 13:13:25 |\n+---------------------+\n\nSELECT NOW() + 0;\n+-----------------------+\n| NOW() + 0 |\n+-----------------------+\n| 20100327131329.000000 |\n+-----------------------+\n\nWith precision:\n\nSELECT CURRENT_TIMESTAMP(2);\n+------------------------+\n| CURRENT_TIMESTAMP(2) |\n+------------------------+\n| 2018-07-10 09:47:26.24 |\n+------------------------+\n\nUsed as a default TIMESTAMP:\n\nCREATE TABLE t (createdTS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\nFrom MariaDB 10.2.2:\n\nSELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=\'test\'\n AND COLUMN_NAME LIKE \'%ts%\'\\G\n*************************** 1. row ***************************\n TABLE_CATALOG: def\n TABLE_SCHEMA: test\n TABLE_NAME: t\n COLUMN_NAME: ts\n ORDINAL_POSITION: 1\n COLUMN_DEFAULT: current_timestamp()\n...\n\n<= MariaDB 10.2.1\n\nSELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=\'test\'\n AND COLUMN_NAME LIKE \'%ts%\'\\G\n*************************** 1. row ***************************\n TABLE_CATALOG: def\n TABLE_SCHEMA: test\n TABLE_NAME: t\n COLUMN_NAME: createdTS\n ORDINAL_POSITION: 1\n COLUMN_DEFAULT: CURRENT_TIMESTAMP\n...\n\nURL: https://mariadb.com/kb/en/now/','','https://mariadb.com/kb/en/now/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (541,31,'PERIOD_ADD','Syntax\n------\n\nPERIOD_ADD(P,N)\n\nDescription\n-----------\n\nAdds N months to period P. P is in the format YYMM or YYYYMM, and is not a\ndate value. If P contains a two-digit year, values from 00 to 69 are converted\nto from 2000 to 2069, while values from 70 are converted to 1970 upwards.\n\nReturns a value in the format YYYYMM.\n\nExamples\n--------\n\nSELECT PERIOD_ADD(200801,2);\n+----------------------+\n| PERIOD_ADD(200801,2) |\n+----------------------+\n| 200803 |\n+----------------------+\n\nSELECT PERIOD_ADD(6910,2);\n+--------------------+\n| PERIOD_ADD(6910,2) |\n+--------------------+\n| 206912 |\n+--------------------+\n\nSELECT PERIOD_ADD(7010,2);\n+--------------------+\n| PERIOD_ADD(7010,2) |\n+--------------------+\n| 197012 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/period_add/','','https://mariadb.com/kb/en/period_add/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (542,31,'PERIOD_DIFF','Syntax\n------\n\nPERIOD_DIFF(P1,P2)\n\nDescription\n-----------\n\nReturns the number of months between periods P1 and P2. P1 and P2 can be in\nthe format YYMM or YYYYMM, and are not date values.\n\nIf P1 or P2 contains a two-digit year, values from 00 to 69 are converted to\nfrom 2000 to 2069, while values from 70 are converted to 1970 upwards.\n\nExamples\n--------\n\nSELECT PERIOD_DIFF(200802,200703);\n+----------------------------+\n| PERIOD_DIFF(200802,200703) |\n+----------------------------+\n| 11 |\n+----------------------------+\n\nSELECT PERIOD_DIFF(6902,6803);\n+------------------------+\n| PERIOD_DIFF(6902,6803) |\n+------------------------+\n| 11 |\n+------------------------+\n\nSELECT PERIOD_DIFF(7002,6803);\n+------------------------+\n| PERIOD_DIFF(7002,6803) |\n+------------------------+\n| -1177 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/period_diff/','','https://mariadb.com/kb/en/period_diff/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (543,31,'QUARTER','Syntax\n------\n\nQUARTER(date)\n\nDescription\n-----------\n\nReturns the quarter of the year for date, in the range 1 to 4. Returns 0 if\nmonth contains a zero value, or NULL if the given value is not otherwise a\nvalid date (zero values are accepted).\n\nExamples\n--------\n\nSELECT QUARTER(\'2008-04-01\');\n+-----------------------+\n| QUARTER(\'2008-04-01\') |\n+-----------------------+\n| 2 |\n+-----------------------+\n\nSELECT QUARTER(\'2019-00-01\');\n+-----------------------+\n| QUARTER(\'2019-00-01\') |\n+-----------------------+\n| 0 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/quarter/','','https://mariadb.com/kb/en/quarter/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (544,31,'SECOND','Syntax\n------\n\nSECOND(time)\n\nDescription\n-----------\n\nReturns the second for a given time (which can include microseconds), in the\nrange 0 to 59, or NULL if not given a valid time value.\n\nExamples\n--------\n\nSELECT SECOND(\'10:05:03\');\n+--------------------+\n| SECOND(\'10:05:03\') |\n+--------------------+\n| 3 |\n+--------------------+\n\nSELECT SECOND(\'10:05:01.999999\');\n+---------------------------+\n| SECOND(\'10:05:01.999999\') |\n+---------------------------+\n| 1 |\n+---------------------------+\n\nURL: https://mariadb.com/kb/en/second/','','https://mariadb.com/kb/en/second/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (545,31,'SEC_TO_TIME','Syntax\n------\n\nSEC_TO_TIME(seconds)\n\nDescription\n-----------\n\nReturns the seconds argument, converted to hours, minutes, and seconds, as a\nTIME value. The range of the result is constrained to that of the TIME data\ntype. A warning occurs if the argument corresponds to a value outside that\nrange.\n\nThe time will be returned in the format hh:mm:ss, or hhmmss if used in a\nnumeric calculation.\n\nExamples\n--------\n\nSELECT SEC_TO_TIME(12414);\n+--------------------+\n| SEC_TO_TIME(12414) |\n+--------------------+\n| 03:26:54 |\n+--------------------+\n\nSELECT SEC_TO_TIME(12414)+0;\n+----------------------+\n| SEC_TO_TIME(12414)+0 |\n+----------------------+\n| 32654 |\n+----------------------+\n\nSELECT SEC_TO_TIME(9999999);\n+----------------------+\n| SEC_TO_TIME(9999999) |\n+----------------------+\n| 838:59:59 |\n+----------------------+\n1 row in set, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+-------------------------------------------+\n| Level | Code | Message |\n+---------+------+-------------------------------------------+\n| Warning | 1292 | Truncated incorrect time value: \'9999999\' |\n+---------+------+-------------------------------------------+\n\nURL: https://mariadb.com/kb/en/sec_to_time/','','https://mariadb.com/kb/en/sec_to_time/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (546,31,'STR_TO_DATE','Syntax\n------\n\nSTR_TO_DATE(str,format)\n\nDescription\n-----------\n\nThis is the inverse of the DATE_FORMAT() function. It takes a string str and a\nformat string format. STR_TO_DATE() returns a DATETIME value if the format\nstring contains both date and time parts, or a DATE or TIME value if the\nstring contains only date or time parts.\n\nThe date, time, or datetime values contained in str should be given in the\nformat indicated by format. If str contains an illegal date, time, or datetime\nvalue, STR_TO_DATE() returns NULL. An illegal value also produces a warning.\n\nUnder specific SQL_MODE settings an error may also be generated if the str\nisn\'t a valid date:\n\n* ALLOW_INVALID_DATES\n* NO_ZERO_DATE\n* NO_ZERO_IN_DATE\n\nThe options that can be used by STR_TO_DATE(), as well as its inverse\nDATE_FORMAT() and the FROM_UNIXTIME() function, are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| %a | Short weekday name in current locale |\n| | (Variable lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %b | Short form month name in current locale. For |\n| | locale en_US this is one of: |\n| | Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov |\n| | or Dec. |\n+---------------------------+------------------------------------------------+\n| %c | Month with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %D | Day with English suffix \'th\', \'nd\', \'st\' or |\n| | \'rd\'\'. (1st, 2nd, 3rd...). |\n+---------------------------+------------------------------------------------+\n| %d | Day with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %e | Day with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %f | Microseconds 6 digits. |\n+---------------------------+------------------------------------------------+\n| %H | Hour with 2 digits between 00-23. |\n+---------------------------+------------------------------------------------+\n| %h | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %I | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %i | Minute with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %j | Day of the year (001-366) |\n+---------------------------+------------------------------------------------+\n| %k | Hour with 1 digits between 0-23. |\n+---------------------------+------------------------------------------------+\n| %l | Hour with 1 digits between 1-12. |\n+---------------------------+------------------------------------------------+\n| %M | Full month name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %m | Month with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %p | AM/PM according to current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %r | Time in 12 hour format, followed by AM/PM. |\n| | Short for \'%I:%i:%S %p\'. |\n+---------------------------+------------------------------------------------+\n| %S | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %s | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %T | Time in 24 hour format. Short for \'%H:%i:%S\'. |\n+---------------------------+------------------------------------------------+\n| %U | Week number (00-53), when first day of the |\n| | week is Sunday. |\n+---------------------------+------------------------------------------------+\n| %u | Week number (00-53), when first day of the |\n| | week is Monday. |\n+---------------------------+------------------------------------------------+\n| %V | Week number (01-53), when first day of the |\n| | week is Sunday. Used with %X. |\n+---------------------------+------------------------------------------------+\n| %v | Week number (01-53), when first day of the |\n| | week is Monday. Used with %x. |\n+---------------------------+------------------------------------------------+\n| %W | Full weekday name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %w | Day of the week. 0 = Sunday, 6 = Saturday. |\n+---------------------------+------------------------------------------------+\n| %X | Year with 4 digits when first day of the week |\n| | is Sunday. Used with %V. |\n+---------------------------+------------------------------------------------+\n| %x | Year with 4 digits when first day of the week |\n| | is Monday. Used with %v. |\n+---------------------------+------------------------------------------------+\n| %Y | Year with 4 digits. |\n+---------------------------+------------------------------------------------+\n| %y | Year with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %# | For str_to_date(), skip all numbers. |\n+---------------------------+------------------------------------------------+\n| %. | For str_to_date(), skip all punctation |\n| | characters. |\n+---------------------------+------------------------------------------------+\n| %@ | For str_to_date(), skip all alpha characters. |\n+---------------------------+------------------------------------------------+\n| %% | A literal % character. |\n+---------------------------+------------------------------------------------+\n\nExamples\n--------\n\nSELECT STR_TO_DATE(\'Wednesday, June 2, 2014\', \'%W, %M %e, %Y\');\n+---------------------------------------------------------+\n| STR_TO_DATE(\'Wednesday, June 2, 2014\', \'%W, %M %e, %Y\') |\n+---------------------------------------------------------+\n| 2014-06-02 |\n+---------------------------------------------------------+\n\nSELECT STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W, %M %e, %Y\');\n+--------------------------------------------------------------+\n| STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W, %M %e, %Y\') |\n+--------------------------------------------------------------+\n| NULL |\n+--------------------------------------------------------------+\n1 row in set, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+-------------------------------------------------------------\n---------------------+\n| Level | Code | Message \n |\n+---------+------+-------------------------------------------------------------\n---------------------+\n| Warning | 1411 | Incorrect datetime value: \'Wednesday23423, June 2, 2014\'\nfor function str_to_date |\n+---------+------+-------------------------------------------------------------\n---------------------+\n\nSELECT STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W%#, %M %e, %Y\');\n+----------------------------------------------------------------+\n| STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W%#, %M %e, %Y\') |\n+----------------------------------------------------------------+\n| 2014-06-02 |\n+----------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/str_to_date/','','https://mariadb.com/kb/en/str_to_date/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (547,31,'SUBDATE','Syntax\n------\n\nSUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)\n\nDescription\n-----------\n\nWhen invoked with the INTERVAL form of the second argument, SUBDATE() is a\nsynonym for DATE_SUB(). See Date and Time Units for a complete list of\npermitted units.\n\nThe second form allows the use of an integer value for days. In such cases, it\nis interpreted as the number of days to be subtracted from the date or\ndatetime expression expr.\n\nExamples\n--------\n\nSELECT DATE_SUB(\'2008-01-02\', INTERVAL 31 DAY);\n+-----------------------------------------+\n| DATE_SUB(\'2008-01-02\', INTERVAL 31 DAY) |\n+-----------------------------------------+\n| 2007-12-02 |\n+-----------------------------------------+\n\nSELECT SUBDATE(\'2008-01-02\', INTERVAL 31 DAY);\n+----------------------------------------+\n| SUBDATE(\'2008-01-02\', INTERVAL 31 DAY) |\n+----------------------------------------+\n| 2007-12-02 |\n+----------------------------------------+\n\nSELECT SUBDATE(\'2008-01-02 12:00:00\', 31);\n+------------------------------------+\n| SUBDATE(\'2008-01-02 12:00:00\', 31) |\n+------------------------------------+\n| 2007-12-02 12:00:00 |\n+------------------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, SUBDATE(d, 10) from t1;\n+---------------------+---------------------+\n| d | SUBDATE(d, 10) |\n+---------------------+---------------------+\n| 2007-01-30 21:31:07 | 2007-01-20 21:31:07 |\n| 1983-10-15 06:42:51 | 1983-10-05 06:42:51 |\n| 2011-04-21 12:34:56 | 2011-04-11 12:34:56 |\n| 2011-10-30 06:31:41 | 2011-10-20 06:31:41 |\n| 2011-01-30 14:03:25 | 2011-01-20 14:03:25 |\n| 2004-10-07 11:19:34 | 2004-09-27 11:19:34 |\n+---------------------+---------------------+\n\nSELECT d, SUBDATE(d, INTERVAL 10 MINUTE) from t1;\n+---------------------+--------------------------------+\n| d | SUBDATE(d, INTERVAL 10 MINUTE) |\n+---------------------+--------------------------------+\n| 2007-01-30 21:31:07 | 2007-01-30 21:21:07 |\n| 1983-10-15 06:42:51 | 1983-10-15 06:32:51 |\n| 2011-04-21 12:34:56 | 2011-04-21 12:24:56 |\n| 2011-10-30 06:31:41 | 2011-10-30 06:21:41 |\n| 2011-01-30 14:03:25 | 2011-01-30 13:53:25 |\n| 2004-10-07 11:19:34 | 2004-10-07 11:09:34 |\n+---------------------+--------------------------------+\n\nURL: https://mariadb.com/kb/en/subdate/','','https://mariadb.com/kb/en/subdate/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (548,31,'SUBTIME','Syntax\n------\n\nSUBTIME(expr1,expr2)\n\nDescription\n-----------\n\nSUBTIME() returns expr1 - expr2 expressed as a value in the same format as\nexpr1. expr1 is a time or datetime expression, and expr2 is a time expression.\n\nExamples\n--------\n\nSELECT SUBTIME(\'2007-12-31 23:59:59.999999\',\'1 1:1:1.000002\');\n+--------------------------------------------------------+\n| SUBTIME(\'2007-12-31 23:59:59.999999\',\'1 1:1:1.000002\') |\n+--------------------------------------------------------+\n| 2007-12-30 22:58:58.999997 |\n+--------------------------------------------------------+\n\nSELECT SUBTIME(\'01:00:00.999999\', \'02:00:00.999998\');\n+-----------------------------------------------+\n| SUBTIME(\'01:00:00.999999\', \'02:00:00.999998\') |\n+-----------------------------------------------+\n| -00:59:59.999999 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/subtime/','','https://mariadb.com/kb/en/subtime/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (549,31,'SYSDATE','Syntax\n------\n\nSYSDATE([precision])\n\nDescription\n-----------\n\nReturns the current date and time as a value in \'YYYY-MM-DD HH:MM:SS\' or\nYYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a\nstring or numeric context.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nSYSDATE() returns the time at which it executes. This differs from the\nbehavior for NOW(), which returns a constant time that indicates the time at\nwhich the statement began to execute. (Within a stored routine or trigger,\nNOW() returns the time at which the routine or triggering statement began to\nexecute.)\n\nIn addition, changing the timestamp system variable with a SET timestamp\nstatement affects the value returned by NOW() but not by SYSDATE(). This means\nthat timestamp settings in the binary log have no effect on invocations of\nSYSDATE().\n\nBecause SYSDATE() can return different values even within the same statement,\nand is not affected by SET TIMESTAMP, it is non-deterministic and therefore\nunsafe for replication if statement-based binary logging is used. If that is a\nproblem, you can use row-based logging, or start the server with the mysqld\noption --sysdate-is-now to cause SYSDATE() to be an alias for NOW(). The\nnon-deterministic nature of SYSDATE() also means that indexes cannot be used\nfor evaluating expressions that refer to it, and that statements using the\nSYSDATE() function are unsafe for statement-based replication.\n\nExamples\n--------\n\nDifference between NOW() and SYSDATE():\n\nSELECT NOW(), SLEEP(2), NOW();\n+---------------------+----------+---------------------+\n| NOW() | SLEEP(2) | NOW() |\n+---------------------+----------+---------------------+\n| 2010-03-27 13:23:40 | 0 | 2010-03-27 13:23:40 |\n+---------------------+----------+---------------------+\n\nSELECT SYSDATE(), SLEEP(2), SYSDATE();\n+---------------------+----------+---------------------+\n| SYSDATE() | SLEEP(2) | SYSDATE() |\n+---------------------+----------+---------------------+\n| 2010-03-27 13:23:52 | 0 | 2010-03-27 13:23:54 |\n+---------------------+----------+---------------------+\n\nWith precision:\n\nSELECT SYSDATE(4);\n+--------------------------+\n| SYSDATE(4) |\n+--------------------------+\n| 2018-07-10 10:17:13.1689 |\n+--------------------------+\n\nURL: https://mariadb.com/kb/en/sysdate/','','https://mariadb.com/kb/en/sysdate/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (550,31,'TIME Function','Syntax\n------\n\nTIME(expr)\n\nDescription\n-----------\n\nExtracts the time part of the time or datetime expression expr and returns it\nas a string.\n\nExamples\n--------\n\nSELECT TIME(\'2003-12-31 01:02:03\');\n+-----------------------------+\n| TIME(\'2003-12-31 01:02:03\') |\n+-----------------------------+\n| 01:02:03 |\n+-----------------------------+\n\nSELECT TIME(\'2003-12-31 01:02:03.000123\');\n+------------------------------------+\n| TIME(\'2003-12-31 01:02:03.000123\') |\n+------------------------------------+\n| 01:02:03.000123 |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/time-function/','','https://mariadb.com/kb/en/time-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (551,31,'TIMEDIFF','Syntax\n------\n\nTIMEDIFF(expr1,expr2)\n\nDescription\n-----------\n\nTIMEDIFF() returns expr1 - expr2 expressed as a time value. expr1 and expr2\nare time or date-and-time expressions, but both must be of the same type.\n\nExamples\n--------\n\nSELECT TIMEDIFF(\'2000:01:01 00:00:00\', \'2000:01:01 00:00:00.000001\');\n+---------------------------------------------------------------+\n| TIMEDIFF(\'2000:01:01 00:00:00\', \'2000:01:01 00:00:00.000001\') |\n+---------------------------------------------------------------+\n| -00:00:00.000001 |\n+---------------------------------------------------------------+\n\nSELECT TIMEDIFF(\'2008-12-31 23:59:59.000001\', \'2008-12-30 01:01:01.000002\');\n+----------------------------------------------------------------------+\n| TIMEDIFF(\'2008-12-31 23:59:59.000001\', \'2008-12-30 01:01:01.000002\') |\n+----------------------------------------------------------------------+\n| 46:58:57.999999 |\n+----------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/timediff/','','https://mariadb.com/kb/en/timediff/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (552,31,'TIMESTAMP FUNCTION','Syntax\n------\n\nTIMESTAMP(expr), TIMESTAMP(expr1,expr2)\n\nDescription\n-----------\n\nWith a single argument, this function returns the date or datetime expression\nexpr as a datetime value. With two arguments, it adds the time expression\nexpr2 to the date or datetime expression expr1 and returns the result as a\ndatetime value.\n\nExamples\n--------\n\nSELECT TIMESTAMP(\'2003-12-31\');\n+-------------------------+\n| TIMESTAMP(\'2003-12-31\') |\n+-------------------------+\n| 2003-12-31 00:00:00 |\n+-------------------------+\n\nSELECT TIMESTAMP(\'2003-12-31 12:00:00\',\'6:30:00\');\n+--------------------------------------------+\n| TIMESTAMP(\'2003-12-31 12:00:00\',\'6:30:00\') |\n+--------------------------------------------+\n| 2003-12-31 18:30:00 |\n+--------------------------------------------+\n\nURL: https://mariadb.com/kb/en/timestamp-function/','','https://mariadb.com/kb/en/timestamp-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (553,31,'TIMESTAMPADD','Syntax\n------\n\nTIMESTAMPADD(unit,interval,datetime_expr)\n\nDescription\n-----------\n\nAdds the integer expression interval to the date or datetime expression\ndatetime_expr. The unit for interval is given by the unit argument, which\nshould be one of the following values: MICROSECOND, SECOND, MINUTE, HOUR, DAY,\nWEEK, MONTH, QUARTER, or YEAR.\n\nThe unit value may be specified using one of keywords as shown, or with a\nprefix of SQL_TSI_. For example, DAY and SQL_TSI_DAY both are legal.\n\nBefore MariaDB 5.5, FRAC_SECOND was permitted as a synonym for MICROSECOND.\n\nExamples\n--------\n\nSELECT TIMESTAMPADD(MINUTE,1,\'2003-01-02\');\n+-------------------------------------+\n| TIMESTAMPADD(MINUTE,1,\'2003-01-02\') |\n+-------------------------------------+\n| 2003-01-02 00:01:00 |\n+-------------------------------------+\n\nSELECT TIMESTAMPADD(WEEK,1,\'2003-01-02\');\n+-----------------------------------+\n| TIMESTAMPADD(WEEK,1,\'2003-01-02\') |\n+-----------------------------------+\n| 2003-01-09 |\n+-----------------------------------+\n\nURL: https://mariadb.com/kb/en/timestampadd/','','https://mariadb.com/kb/en/timestampadd/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (554,31,'TIMESTAMPDIFF','Syntax\n------\n\nTIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)\n\nDescription\n-----------\n\nReturns datetime_expr2 - datetime_expr1, where datetime_expr1 and\ndatetime_expr2 are date or datetime expressions. One expression may be a date\nand the other a datetime; a date value is treated as a datetime having the\ntime part \'00:00:00\' where necessary. The unit for the result (an integer) is\ngiven by the unit argument. The legal values for unit are the same as those\nlisted in the description of the TIMESTAMPADD() function, i.e MICROSECOND,\nSECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.\n\nTIMESTAMPDIFF can also be used to calculate age.\n\nExamples\n--------\n\nSELECT TIMESTAMPDIFF(MONTH,\'2003-02-01\',\'2003-05-01\');\n+------------------------------------------------+\n| TIMESTAMPDIFF(MONTH,\'2003-02-01\',\'2003-05-01\') |\n+------------------------------------------------+\n| 3 |\n+------------------------------------------------+\n\nSELECT TIMESTAMPDIFF(YEAR,\'2002-05-01\',\'2001-01-01\');\n+-----------------------------------------------+\n| TIMESTAMPDIFF(YEAR,\'2002-05-01\',\'2001-01-01\') |\n+-----------------------------------------------+\n| -1 |\n+-----------------------------------------------+\n\nSELECT TIMESTAMPDIFF(MINUTE,\'2003-02-01\',\'2003-05-01 12:05:55\');\n+----------------------------------------------------------+\n| TIMESTAMPDIFF(MINUTE,\'2003-02-01\',\'2003-05-01 12:05:55\') |\n+----------------------------------------------------------+\n| 128885 |\n+----------------------------------------------------------+\n\nCalculating age:\n\nSELECT CURDATE();\n+------------+\n| CURDATE() |\n+------------+\n| 2019-05-27 |\n+------------+\n\nSELECT TIMESTAMPDIFF(YEAR, \'1971-06-06\', CURDATE()) AS age;\n+------+\n| age |\n+------+\n| 47 |\n+------+\n\nSELECT TIMESTAMPDIFF(YEAR, \'1971-05-06\', CURDATE()) AS age;\n+------+\n| age |\n+------+\n| 48 |\n+------+\n\nAge as of 2014-08-02:\n\nSELECT name, date_of_birth, TIMESTAMPDIFF(YEAR,date_of_birth,\'2014-08-02\') AS\nage \n FROM student_details;\n+---------+---------------+------+\n| name | date_of_birth | age |\n+---------+---------------+------+\n| Chun | 1993-12-31 | 20 |\n| Esben | 1946-01-01 | 68 |\n| Kaolin | 1996-07-16 | 18 |\n| Tatiana | 1988-04-13 | 26 |\n+---------+---------------+------+\n\nURL: https://mariadb.com/kb/en/timestampdiff/','','https://mariadb.com/kb/en/timestampdiff/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (555,31,'TIME_FORMAT','Syntax\n------\n\nTIME_FORMAT(time,format)\n\nDescription\n-----------\n\nThis is used like the DATE_FORMAT() function, but the format string may\ncontain format specifiers only for hours, minutes, and seconds. Other\nspecifiers produce a NULL value or 0.\n\nExamples\n--------\n\nSELECT TIME_FORMAT(\'100:00:00\', \'%H %k %h %I %l\');\n+--------------------------------------------+\n| TIME_FORMAT(\'100:00:00\', \'%H %k %h %I %l\') |\n+--------------------------------------------+\n| 100 100 04 04 4 |\n+--------------------------------------------+\n\nURL: https://mariadb.com/kb/en/time_format/','','https://mariadb.com/kb/en/time_format/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (556,31,'TIME_TO_SEC','Syntax\n------\n\nTIME_TO_SEC(time)\n\nDescription\n-----------\n\nReturns the time argument, converted to seconds.\n\nThe value returned by TIME_TO_SEC is of type DOUBLE. Before MariaDB 5.3 (and\nMySQL 5.6), the type was INT. The returned value preserves microseconds of the\nargument. See also Microseconds in MariaDB.\n\nExamples\n--------\n\nSELECT TIME_TO_SEC(\'22:23:00\');\n+-------------------------+\n| TIME_TO_SEC(\'22:23:00\') |\n+-------------------------+\n| 80580 |\n+-------------------------+\n\nSELECT TIME_TO_SEC(\'00:39:38\');\n+-------------------------+\n| TIME_TO_SEC(\'00:39:38\') |\n+-------------------------+\n| 2378 |\n+-------------------------+\n\nSELECT TIME_TO_SEC(\'09:12:55.2355\');\n+------------------------------+\n| TIME_TO_SEC(\'09:12:55.2355\') |\n+------------------------------+\n| 33175.2355 |\n+------------------------------+\n1 row in set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/time_to_sec/','','https://mariadb.com/kb/en/time_to_sec/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (557,31,'TO_DAYS','Syntax\n------\n\nTO_DAYS(date)\n\nDescription\n-----------\n\nGiven a date date, returns the number of days since the start of the current\ncalendar (0000-00-00).\n\nThe function is not designed for use with dates before the advent of the\nGregorian calendar in October 1582. Results will not be reliable since it\ndoesn\'t account for the lost days when the calendar changed from the Julian\ncalendar.\n\nThis is the converse of the FROM_DAYS() function.\n\nExamples\n--------\n\nSELECT TO_DAYS(\'2007-10-07\');\n+-----------------------+\n| TO_DAYS(\'2007-10-07\') |\n+-----------------------+\n| 733321 |\n+-----------------------+\n\nSELECT TO_DAYS(\'0000-01-01\');\n+-----------------------+\n| TO_DAYS(\'0000-01-01\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT TO_DAYS(950501);\n+-----------------+\n| TO_DAYS(950501) |\n+-----------------+\n| 728779 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/to_days/','','https://mariadb.com/kb/en/to_days/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (558,31,'TO_SECONDS','Syntax\n------\n\nTO_SECONDS(expr)\n\nDescription\n-----------\n\nReturns the number of seconds from year 0 till expr, or NULL if expr is not a\nvalid date or datetime.\n\nExamples\n--------\n\nSELECT TO_SECONDS(\'2013-06-13\');\n+--------------------------+\n| TO_SECONDS(\'2013-06-13\') |\n+--------------------------+\n| 63538300800 |\n+--------------------------+\n\nSELECT TO_SECONDS(\'2013-06-13 21:45:13\');\n+-----------------------------------+\n| TO_SECONDS(\'2013-06-13 21:45:13\') |\n+-----------------------------------+\n| 63538379113 |\n+-----------------------------------+\n\nSELECT TO_SECONDS(NOW());\n+-------------------+\n| TO_SECONDS(NOW()) |\n+-------------------+\n| 63543530875 |\n+-------------------+\n\nSELECT TO_SECONDS(20130513);\n+----------------------+\n| TO_SECONDS(20130513) |\n+----------------------+\n| 63535622400 |\n+----------------------+\n1 row in set (0.00 sec)\n\nSELECT TO_SECONDS(130513);\n+--------------------+\n| TO_SECONDS(130513) |\n+--------------------+\n| 63535622400 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/to_seconds/','','https://mariadb.com/kb/en/to_seconds/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (559,31,'UNIX_TIMESTAMP','Syntax\n------\n\nUNIX_TIMESTAMP()\nUNIX_TIMESTAMP(date)\n\nDescription\n-----------\n\nIf called with no argument, returns a Unix timestamp (seconds since\n\'1970-01-01 00:00:00\' UTC) as an unsigned integer. If UNIX_TIMESTAMP() is\ncalled with a date argument, it returns the value of the argument as seconds\nsince \'1970-01-01 00:00:00\' UTC. date may be a DATE string, a DATETIME string,\na TIMESTAMP, or a number in the format YYMMDD or YYYYMMDD. The server\ninterprets date as a value in the current time zone and converts it to an\ninternal value in UTC. Clients can set their time zone as described in time\nzones.\n\nThe inverse function of UNIX_TIMESTAMP() is FROM_UNIXTIME()\n\nUNIX_TIMESTAMP() supports microseconds.\n\nTimestamps in MariaDB have a maximum value of 2147483647, equivalent to\n2038-01-19 05:14:07. This is due to the underlying 32-bit limitation. Using\nthe function on a date beyond this will result in NULL being returned. Use\nDATETIME as a storage type if you require dates beyond this.\n\nError Handling\n--------------\n\nReturns NULL for wrong arguments to UNIX_TIMESTAMP(). In MySQL and MariaDB\nbefore 5.3 wrong arguments to UNIX_TIMESTAMP() returned 0.\n\nCompatibility\n-------------\n\nAs you can see in the examples above, UNIX_TIMESTAMP(constant-date-string)\nreturns a timestamp with 6 decimals while MariaDB 5.2 and before returns it\nwithout decimals. This can cause a problem if you are using UNIX_TIMESTAMP()\nas a partitioning function. You can fix this by using\nFLOOR(UNIX_TIMESTAMP(..)) or changing the date string to a date number, like\n20080101000000.\n\nExamples\n--------\n\nSELECT UNIX_TIMESTAMP();\n+------------------+\n| UNIX_TIMESTAMP() |\n+------------------+\n| 1269711082 |\n+------------------+\n\nSELECT UNIX_TIMESTAMP(\'2007-11-30 10:30:19\');\n+---------------------------------------+\n| UNIX_TIMESTAMP(\'2007-11-30 10:30:19\') |\n+---------------------------------------+\n| 1196436619.000000 |\n+---------------------------------------+\n\nSELECT UNIX_TIMESTAMP(\"2007-11-30 10:30:19.123456\");\n+----------------------------------------------+\n| unix_timestamp(\"2007-11-30 10:30:19.123456\") |\n+----------------------------------------------+\n| 1196411419.123456 |\n+----------------------------------------------+\n\nSELECT FROM_UNIXTIME(UNIX_TIMESTAMP(\'2007-11-30 10:30:19\'));\n+------------------------------------------------------+\n| FROM_UNIXTIME(UNIX_TIMESTAMP(\'2007-11-30 10:30:19\')) |\n+------------------------------------------------------+\n| 2007-11-30 10:30:19.000000 |\n+------------------------------------------------------+\n\nSELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(\'2007-11-30 10:30:19\')));\n+-------------------------------------------------------------+\n| FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(\'2007-11-30 10:30:19\'))) |\n+-------------------------------------------------------------+\n| 2007-11-30 10:30:19 |\n+-------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/unix_timestamp/','','https://mariadb.com/kb/en/unix_timestamp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (560,31,'UTC_DATE','Syntax\n------\n\nUTC_DATE, UTC_DATE()\n\nDescription\n-----------\n\nReturns the current UTC date as a value in \'YYYY-MM-DD\' or YYYYMMDD format,\ndepending on whether the function is used in a string or numeric context.\n\nExamples\n--------\n\nSELECT UTC_DATE(), UTC_DATE() + 0;\n+------------+----------------+\n| UTC_DATE() | UTC_DATE() + 0 |\n+------------+----------------+\n| 2010-03-27 | 20100327 |\n+------------+----------------+\n\nURL: https://mariadb.com/kb/en/utc_date/','','https://mariadb.com/kb/en/utc_date/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (561,31,'UTC_TIME','Syntax\n------\n\nUTC_TIME\nUTC_TIME([precision])\n\nDescription\n-----------\n\nReturns the current UTC time as a value in \'HH:MM:SS\' or HHMMSS.uuuuuu format,\ndepending on whether the function is used in a string or numeric context.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nExamples\n--------\n\nSELECT UTC_TIME(), UTC_TIME() + 0;\n+------------+----------------+\n| UTC_TIME() | UTC_TIME() + 0 |\n+------------+----------------+\n| 17:32:34 | 173234.000000 |\n+------------+----------------+\n\nWith precision:\n\nSELECT UTC_TIME(5);\n+----------------+\n| UTC_TIME(5) |\n+----------------+\n| 07:52:50.78369 |\n+----------------+\n\nURL: https://mariadb.com/kb/en/utc_time/','','https://mariadb.com/kb/en/utc_time/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (562,31,'UTC_TIMESTAMP','Syntax\n------\n\nUTC_TIMESTAMP\nUTC_TIMESTAMP([precision])\n\nDescription\n-----------\n\nReturns the current UTC date and time as a value in \'YYYY-MM-DD HH:MM:SS\' or\nYYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a\nstring or numeric context.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nExamples\n--------\n\nSELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;\n+---------------------+-----------------------+\n| UTC_TIMESTAMP() | UTC_TIMESTAMP() + 0 |\n+---------------------+-----------------------+\n| 2010-03-27 17:33:16 | 20100327173316.000000 |\n+---------------------+-----------------------+\n\nWith precision:\n\nSELECT UTC_TIMESTAMP(4);\n+--------------------------+\n| UTC_TIMESTAMP(4) |\n+--------------------------+\n| 2018-07-10 07:51:09.1019 |\n+--------------------------+\n\nURL: https://mariadb.com/kb/en/utc_timestamp/','','https://mariadb.com/kb/en/utc_timestamp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (563,31,'WEEK','Syntax\n------\n\nWEEK(date[,mode])\n\nDescription\n-----------\n\nThis function returns the week number for date. The two-argument form of\nWEEK() allows you to specify whether the week starts on Sunday or Monday and\nwhether the return value should be in the range from 0 to 53 or from 1 to 53.\nIf the mode argument is omitted, the value of the default_week_format system\nvariable is used.\n\nModes\n-----\n\n+-------+---------------------+--------+------------------------------------+\n| Mode | 1st day of week | Range | Week 1 is the 1st week with |\n+-------+---------------------+--------+------------------------------------+\n| 0 | Sunday | 0-53 | a Sunday in this year |\n+-------+---------------------+--------+------------------------------------+\n| 1 | Monday | 0-53 | more than 3 days this year |\n+-------+---------------------+--------+------------------------------------+\n| 2 | Sunday | 1-53 | a Sunday in this year |\n+-------+---------------------+--------+------------------------------------+\n| 3 | Monday | 1-53 | more than 3 days this year |\n+-------+---------------------+--------+------------------------------------+\n| 4 | Sunday | 0-53 | more than 3 days this year |\n+-------+---------------------+--------+------------------------------------+\n| 5 | Monday | 0-53 | a Monday in this year |\n+-------+---------------------+--------+------------------------------------+\n| 6 | Sunday | 1-53 | more than 3 days this year |\n+-------+---------------------+--------+------------------------------------+\n| 7 | Monday | 1-53 | a Monday in this year |\n+-------+---------------------+--------+------------------------------------+\n\nWith the mode value of 3, which means \'more than 3 days this year\', weeks are\nnumbered according to ISO 8601:1988.\n\nExamples\n--------\n\nSELECT WEEK(\'2008-02-20\');\n+--------------------+\n| WEEK(\'2008-02-20\') |\n+--------------------+\n| 7 |\n+--------------------+\n\nSELECT WEEK(\'2008-02-20\',0);\n+----------------------+\n| WEEK(\'2008-02-20\',0) |\n+----------------------+\n| 7 |\n+----------------------+\n\nSELECT WEEK(\'2008-02-20\',1);\n+----------------------+\n| WEEK(\'2008-02-20\',1) |\n+----------------------+\n| 8 |\n+----------------------+\n\nSELECT WEEK(\'2008-12-31\',0);\n+----------------------+\n| WEEK(\'2008-12-31\',0) |\n+----------------------+\n| 52 |\n+----------------------+\n\nSELECT WEEK(\'2008-12-31\',1);\n+----------------------+\n| WEEK(\'2008-12-31\',1) |\n+----------------------+\n| 53 |\n+----------------------+\n\nSELECT WEEK(\'2019-12-30\',3);\n+----------------------+\n| WEEK(\'2019-12-30\',3) |\n+----------------------+\n| 1 |\n+----------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, WEEK(d,0), WEEK(d,1) from t1;\n+---------------------+-----------+-----------+\n| d | WEEK(d,0) | WEEK(d,1) |\n+---------------------+-----------+-----------+\n| 2007-01-30 21:31:07 | 4 | 5 |\n| 1983-10-15 06:42:51 | 41 | 41 |\n| 2011-04-21 12:34:56 | 16 | 16 |\n| 2011-10-30 06:31:41 | 44 | 43 |\n| 2011-01-30 14:03:25 | 5 | 4 |\n| 2004-10-07 11:19:34 | 40 | 41 |\n+---------------------+-----------+-----------+\n\nURL: https://mariadb.com/kb/en/week/','','https://mariadb.com/kb/en/week/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (564,31,'WEEKDAY','Syntax\n------\n\nWEEKDAY(date)\n\nDescription\n-----------\n\nReturns the weekday index for date (0 = Monday, 1 = Tuesday, ... 6 = Sunday).\n\nThis contrasts with DAYOFWEEK() which follows the ODBC standard (1 = Sunday, 2\n= Monday, ..., 7 = Saturday).\n\nExamples\n--------\n\nSELECT WEEKDAY(\'2008-02-03 22:23:00\');\n+--------------------------------+\n| WEEKDAY(\'2008-02-03 22:23:00\') |\n+--------------------------------+\n| 6 |\n+--------------------------------+\n\nSELECT WEEKDAY(\'2007-11-06\');\n+-----------------------+\n| WEEKDAY(\'2007-11-06\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d FROM t1 where WEEKDAY(d) = 6;\n+---------------------+\n| d |\n+---------------------+\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/weekday/','','https://mariadb.com/kb/en/weekday/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (565,31,'WEEKOFYEAR','Syntax\n------\n\nWEEKOFYEAR(date)\n\nDescription\n-----------\n\nReturns the calendar week of the date as a number in the range from 1 to 53.\nWEEKOFYEAR() is a compatibility function that is equivalent to WEEK(date,3).\n\nExamples\n--------\n\nSELECT WEEKOFYEAR(\'2008-02-20\');\n+--------------------------+\n| WEEKOFYEAR(\'2008-02-20\') |\n+--------------------------+\n| 8 |\n+--------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nselect * from t1;\n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 1983-10-15 06:42:51 |\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n| 2004-10-07 11:19:34 |\n+---------------------+\n\nSELECT d, WEEKOFYEAR(d), WEEK(d,3) from t1;\n+---------------------+---------------+-----------+\n| d | WEEKOFYEAR(d) | WEEK(d,3) |\n+---------------------+---------------+-----------+\n| 2007-01-30 21:31:07 | 5 | 5 |\n| 1983-10-15 06:42:51 | 41 | 41 |\n| 2011-04-21 12:34:56 | 16 | 16 |\n| 2011-10-30 06:31:41 | 43 | 43 |\n| 2011-01-30 14:03:25 | 4 | 4 |\n| 2004-10-07 11:19:34 | 41 | 41 |\n+---------------------+---------------+-----------+\n\nURL: https://mariadb.com/kb/en/weekofyear/','','https://mariadb.com/kb/en/weekofyear/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (566,31,'YEAR','Syntax\n------\n\nYEAR(date)\n\nDescription\n-----------\n\nReturns the year for the given date, in the range 1000 to 9999, or 0 for the\n\"zero\" date.\n\nExamples\n--------\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT * FROM t1;\n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 1983-10-15 06:42:51 |\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n| 2004-10-07 11:19:34 |\n+---------------------+\n\nSELECT * FROM t1 WHERE YEAR(d) = 2011;\n+---------------------+\n| d |\n+---------------------+\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n+---------------------+\n\nSELECT YEAR(\'1987-01-01\');\n+--------------------+\n| YEAR(\'1987-01-01\') |\n+--------------------+\n| 1987 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/year/','','https://mariadb.com/kb/en/year/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (567,31,'YEARWEEK','Syntax\n------\n\nYEARWEEK(date), YEARWEEK(date,mode)\n\nDescription\n-----------\n\nReturns year and week for a date. The mode argument works exactly like the\nmode argument to WEEK(). The year in the result may be different from the year\nin the date argument for the first and the last week of the year.\n\nExamples\n--------\n\nSELECT YEARWEEK(\'1987-01-01\');\n+------------------------+\n| YEARWEEK(\'1987-01-01\') |\n+------------------------+\n| 198652 |\n+------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT * FROM t1;\n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 1983-10-15 06:42:51 |\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n| 2004-10-07 11:19:34 |\n+---------------------+\n6 rows in set (0.02 sec)\n\nSELECT YEARWEEK(d) FROM t1 WHERE YEAR(d) = 2011;\n+-------------+\n| YEARWEEK(d) |\n+-------------+\n| 201116 |\n| 201144 |\n| 201105 |\n+-------------+\n3 rows in set (0.03 sec)\n\nURL: https://mariadb.com/kb/en/yearweek/','','https://mariadb.com/kb/en/yearweek/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (568,32,'Well-Known Binary (WKB) Format','WKB stands for Well-Known Binary, a format for representing geographical and\ngeometrical data.\n\nWKB uses 1-byte unsigned integers, 4-byte unsigned integers, and 8-byte\ndouble-precision numbers.\n\n* The first byte indicates the byte order. 00 for big endian, or 01 for little\nendian.\n* The next 4 bytes indicate the geometry type. Values from 1 to 7 indicate\nwhether the type is Point, LineString, Polygon, MultiPoint, MultiLineString,\nMultiPolygon, or GeometryCollection respectively. \n* The 8-byte floats represent the co-ordinates.\n\nTake the following example, a sequence of 21 bytes each represented by two hex\ndigits:\n\n000000000140000000000000004010000000000000\n\n* It\'s big endian\n000000000140000000000000004010000000000000\n\n* It\'s a POINT\n000000000140000000000000004010000000000000\n\n* The X co-ordinate is 2.0\n000000000140000000000000004010000000000000\n\n* The Y-co-ordinate is 4.0\n000000000140000000000000004010000000000000\n\nURL: https://mariadb.com/kb/en/well-known-binary-wkb-format/','','https://mariadb.com/kb/en/well-known-binary-wkb-format/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (569,32,'AsBinary','A synonym for ST_AsBinary().\n\nURL: https://mariadb.com/kb/en/wkb-asbinary/','','https://mariadb.com/kb/en/wkb-asbinary/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (570,32,'AsWKB','A synonym for ST_AsBinary().\n\nURL: https://mariadb.com/kb/en/aswkb/','','https://mariadb.com/kb/en/aswkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (571,32,'MLineFromWKB','Syntax\n------\n\nMLineFromWKB(wkb[,srid])\nMultiLineStringFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a MULTILINESTRING value using its WKB representation and SRID.\n\nMLineFromWKB() and MultiLineStringFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(MLineFromText(\'MULTILINESTRING((10 48,10 21,10 0),(16\n0,16 23,16 48))\'));\n\nSELECT ST_AsText(MLineFromWKB(@g));\n+--------------------------------------------------------+\n| ST_AsText(MLineFromWKB(@g)) |\n+--------------------------------------------------------+\n| MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48)) |\n+--------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/mlinefromwkb/','','https://mariadb.com/kb/en/mlinefromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (572,32,'MPointFromWKB','Syntax\n------\n\nMPointFromWKB(wkb[,srid])\nMultiPointFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a MULTIPOINT value using its WKB representation and SRID.\n\nMPointFromWKB() and MultiPointFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(MPointFromText(\'MultiPoint( 1 1, 2 2, 5 3, 7 2, 9 3, 8 4,\n6 6, 6 9, 4 9, 1 5 )\'));\n\nSELECT ST_AsText(MPointFromWKB(@g));\n+-----------------------------------------------------+\n| ST_AsText(MPointFromWKB(@g)) |\n+-----------------------------------------------------+\n| MULTIPOINT(1 1,2 2,5 3,7 2,9 3,8 4,6 6,6 9,4 9,1 5) |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/mpointfromwkb/','','https://mariadb.com/kb/en/mpointfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (573,32,'MPolyFromWKB','Syntax\n------\n\nMPolyFromWKB(wkb[,srid])\nMultiPolygonFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a MULTIPOLYGON value using its WKB representation and SRID.\n\nMPolyFromWKB() and MultiPolygonFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(MPointFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28\n26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))\'));\n\nSELECT ST_AsText(MPolyFromWKB(@g))\\G\n*************************** 1. row ***************************\nST_AsText(MPolyFromWKB(@g)): MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52\n18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))\n\nURL: https://mariadb.com/kb/en/mpolyfromwkb/','','https://mariadb.com/kb/en/mpolyfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (574,32,'GeomCollFromWKB','A synonym for ST_GeomCollFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-geomcollfromwkb/','','https://mariadb.com/kb/en/wkb-geomcollfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (575,32,'GeometryCollectionFromWKB','A synonym for ST_GeomCollFromWKB.\n\nURL: https://mariadb.com/kb/en/geometrycollectionfromwkb/','','https://mariadb.com/kb/en/geometrycollectionfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (576,32,'GeometryFromWKB','A synonym for ST_GeomFromWKB.\n\nURL: https://mariadb.com/kb/en/geometryfromwkb/','','https://mariadb.com/kb/en/geometryfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (577,32,'GeomFromWKB','A synonym for ST_GeomFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-geomfromwkb/','','https://mariadb.com/kb/en/wkb-geomfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (578,32,'LineFromWKB','A synonym for ST_LineFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-linefromwkb/','','https://mariadb.com/kb/en/wkb-linefromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (579,32,'LineStringFromWKB','A synonym for ST_LineFromWKB.\n\nURL: https://mariadb.com/kb/en/linestringfromwkb/','','https://mariadb.com/kb/en/linestringfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (580,32,'MultiLineStringFromWKB','A synonym for MLineFromWKB().\n\nURL: https://mariadb.com/kb/en/multilinestringfromwkb/','','https://mariadb.com/kb/en/multilinestringfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (581,32,'MultiPointFromWKB','A synonym for MPointFromWKB.\n\nURL: https://mariadb.com/kb/en/multipointfromwkb/','','https://mariadb.com/kb/en/multipointfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (582,32,'MultiPolygonFromWKB','Synonym for MPolyFromWKB.\n\nURL: https://mariadb.com/kb/en/multipolygonfromwkb/','','https://mariadb.com/kb/en/multipolygonfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (583,32,'PointFromWKB','A synonym for ST_PointFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-pointfromwkb/','','https://mariadb.com/kb/en/wkb-pointfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (584,32,'PolyFromWKB','A synonym for ST_PolyFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-polyfromwkb/','','https://mariadb.com/kb/en/wkb-polyfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (585,32,'PolygonFromWKB','A synonym for ST_PolyFromWKB.\n\nURL: https://mariadb.com/kb/en/polygonfromwkb/','','https://mariadb.com/kb/en/polygonfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (586,32,'ST_AsBinary','Syntax\n------\n\nST_AsBinary(g)\nAsBinary(g)\nST_AsWKB(g)\nAsWKB(g)\n\nDescription\n-----------\n\nConverts a value in internal geometry format to its WKB representation and\nreturns the binary result.\n\nST_AsBinary(), AsBinary(), ST_AsWKB() and AsWKB() are synonyms,\n\nExamples\n--------\n\nSET @poly = ST_GeomFromText(\'POLYGON((0 0,0 1,1 1,1 0,0 0))\');\nSELECT ST_AsBinary(@poly);\n\nSELECT ST_AsText(ST_GeomFromWKB(ST_AsWKB(@poly)));\n+--------------------------------------------+\n| ST_AsText(ST_GeomFromWKB(ST_AsWKB(@poly))) |\n+--------------------------------------------+\n| POLYGON((0 0,0 1,1 1,1 0,0 0)) |\n+--------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_asbinary/','','https://mariadb.com/kb/en/st_asbinary/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (587,32,'ST_AsWKB','A synonym for ST_AsBinary().\n\nURL: https://mariadb.com/kb/en/st_aswkb/','','https://mariadb.com/kb/en/st_aswkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (588,32,'ST_GeomCollFromWKB','Syntax\n------\n\nST_GeomCollFromWKB(wkb[,srid])\nST_GeometryCollectionFromWKB(wkb[,srid])\nGeomCollFromWKB(wkb[,srid])\nGeometryCollectionFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a GEOMETRYCOLLECTION value using its WKB representation and SRID.\n\nST_GeomCollFromWKB(), ST_GeometryCollectionFromWKB(), GeomCollFromWKB() and\nGeometryCollectionFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_GeomFromText(\'GEOMETRYCOLLECTION(\n POLYGON((5 5,10 5,10 10,5 5)),POINT(10 10))\'));\n\nSELECT ST_AsText(ST_GeomCollFromWKB(@g));\n+----------------------------------------------------------------+\n| ST_AsText(ST_GeomCollFromWKB(@g)) |\n+----------------------------------------------------------------+\n| GEOMETRYCOLLECTION(POLYGON((5 5,10 5,10 10,5 5)),POINT(10 10)) |\n+----------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geomcollfromwkb/','','https://mariadb.com/kb/en/st_geomcollfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (589,32,'ST_GeometryCollectionFromWKB','A synonym for ST_GeomCollFromWKB.\n\nURL: https://mariadb.com/kb/en/st_geometrycollectionfromwkb/','','https://mariadb.com/kb/en/st_geometrycollectionfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (590,32,'ST_GeometryFromWKB','A synonym for ST_GeomFromWKB.\n\nURL: https://mariadb.com/kb/en/st_geometryfromwkb/','','https://mariadb.com/kb/en/st_geometryfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (591,32,'ST_GeomFromWKB','Syntax\n------\n\nST_GeomFromWKB(wkb[,srid])\nST_GeometryFromWKB(wkb[,srid])\nGeomFromWKB(wkb[,srid])\nGeometryFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a geometry value of any type using its WKB representation and SRID.\n\nST_GeomFromWKB(), ST_GeometryFromWKB(), GeomFromWKB() and GeometryFromWKB()\nare synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_LineFromText(\'LINESTRING(0 4, 4 6)\'));\n\nSELECT ST_AsText(ST_GeomFromWKB(@g));\n+-------------------------------+\n| ST_AsText(ST_GeomFromWKB(@g)) |\n+-------------------------------+\n| LINESTRING(0 4,4 6) |\n+-------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geomfromwkb/','','https://mariadb.com/kb/en/st_geomfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (592,32,'ST_LineFromWKB','Syntax\n------\n\nST_LineFromWKB(wkb[,srid])\nLineFromWKB(wkb[,srid])\nST_LineStringFromWKB(wkb[,srid])\nLineStringFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a LINESTRING value using its WKB representation and SRID.\n\nST_LineFromWKB(), LineFromWKB(), ST_LineStringFromWKB(), and\nLineStringFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_LineFromText(\'LineString(0 4,4 6)\'));\n\nSELECT ST_AsText(ST_LineFromWKB(@g)) AS l;\n+---------------------+\n| l |\n+---------------------+\n| LINESTRING(0 4,4 6) |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/st_linefromwkb/','','https://mariadb.com/kb/en/st_linefromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (593,32,'ST_LineStringFromWKB','A synonym for ST_LineFromWKB.\n\nURL: https://mariadb.com/kb/en/st_linestringfromwkb/','','https://mariadb.com/kb/en/st_linestringfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (594,32,'ST_PointFromWKB','Syntax\n------\n\nST_PointFromWKB(wkb[,srid])\nPointFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a POINT value using its WKB representation and SRID.\n\nST_PointFromWKB() and PointFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_PointFromText(\'POINT(0 4)\'));\n\nSELECT ST_AsText(ST_PointFromWKB(@g)) AS p;\n+------------+\n| p |\n+------------+\n| POINT(0 4) |\n+------------+\n\nURL: https://mariadb.com/kb/en/st_pointfromwkb/','','https://mariadb.com/kb/en/st_pointfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (595,32,'ST_PolyFromWKB','Syntax\n------\n\nST_PolyFromWKB(wkb[,srid])\nST_PolygonFromWKB(wkb[,srid])\nPolyFromWKB(wkb[,srid])\nPolygonFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a POLYGON value using its WKB representation and SRID.\n\nST_PolyFromWKB(), ST_PolygonFromWKB(), PolyFromWKB() and PolygonFromWKB() are\nsynonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_PolyFromText(\'POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1\n1))\'));\n\nSELECT ST_AsText(ST_PolyFromWKB(@g)) AS p;\n+----------------------------------------+\n| p |\n+----------------------------------------+\n| POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1 1)) |\n+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_polyfromwkb/','','https://mariadb.com/kb/en/st_polyfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (596,32,'ST_PolygonFromWKB','A synonym for ST_PolyFromWKB.\n\nURL: https://mariadb.com/kb/en/st_polygonfromwkb/','','https://mariadb.com/kb/en/st_polygonfromwkb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (597,34,'Geometry Types','Description\n-----------\n\nMariaDB provides a standard way of creating spatial columns for geometry\ntypes, for example, with CREATE TABLE or ALTER TABLE. Currently, spatial\ncolumns are supported for MyISAM, InnoDB and ARCHIVE tables. See also SPATIAL\nINDEX.\n\nThe basic geometry type is GEOMETRY. But the type can be more specific. The\nfollowing types are supported:\n\n+-----------------------------------------------------------------------------+\n| Geometry Types |\n+-----------------------------------------------------------------------------+\n| POINT |\n+-----------------------------------------------------------------------------+\n| LINESTRING |\n+-----------------------------------------------------------------------------+\n| POLYGON |\n+-----------------------------------------------------------------------------+\n| MULTIPOINT |\n+-----------------------------------------------------------------------------+\n| MULTILINESTRING |\n+-----------------------------------------------------------------------------+\n| MULTIPOLYGON |\n+-----------------------------------------------------------------------------+\n| GEOMETRYCOLLECTION |\n+-----------------------------------------------------------------------------+\n| GEOMETRY |\n+-----------------------------------------------------------------------------+\n\nExamples\n--------\n\nNote: For clarity, only one type is listed per table in the examples below,\nbut a table row can contain multiple types. For example:\n\nCREATE TABLE object (shapeA POLYGON, shapeB LINESTRING);\n\nPOINT\n-----\n\nCREATE TABLE gis_point (g POINT);\nSHOW FIELDS FROM gis_point;\nINSERT INTO gis_point VALUES\n (PointFromText(\'POINT(10 10)\')),\n (PointFromText(\'POINT(20 10)\')),\n (PointFromText(\'POINT(20 20)\')),\n (PointFromWKB(AsWKB(PointFromText(\'POINT(10 20)\'))));\n\nLINESTRING\n----------\n\nCREATE TABLE gis_line (g LINESTRING);\nSHOW FIELDS FROM gis_line;\nINSERT INTO gis_line VALUES\n (LineFromText(\'LINESTRING(0 0,0 10,10 0)\')),\n (LineStringFromText(\'LINESTRING(10 10,20 10,20 20,10 20,10 10)\')),\n (LineStringFromWKB(AsWKB(LineString(Point(10, 10), Point(40, 10)))));\n\nPOLYGON\n-------\n\nCREATE TABLE gis_polygon (g POLYGON);\nSHOW FIELDS FROM gis_polygon;\nINSERT INTO gis_polygon VALUES\n (PolygonFromText(\'POLYGON((10 10,20 10,20 20,10 20,10 10))\')),\n (PolyFromText(\'POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10\n20,10 10))\')),\n (PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30,\n30), Point(0, 0))))));\n\nMULTIPOINT\n----------\n\nCREATE TABLE gis_multi_point (g MULTIPOINT);\nSHOW FIELDS FROM gis_multi_point;\nINSERT INTO gis_multi_point VALUES\n (MultiPointFromText(\'MULTIPOINT(0 0,10 10,10 20,20 20)\')),\n (MPointFromText(\'MULTIPOINT(1 1,11 11,11 21,21 21)\')),\n (MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));\n\nMULTILINESTRING\n---------------\n\nCREATE TABLE gis_multi_line (g MULTILINESTRING);\nSHOW FIELDS FROM gis_multi_line;\nINSERT INTO gis_multi_line VALUES\n (MultiLineStringFromText(\'MULTILINESTRING((10 48,10 21,10 0),(16 0,16\n23,16 48))\')),\n (MLineFromText(\'MULTILINESTRING((10 48,10 21,10 0))\')),\n (MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)),\nLineString(Point(2, 5), Point(5, 8), Point(21, 7))))));\n\nMULTIPOLYGON\n------------\n\nCREATE TABLE gis_multi_polygon (g MULTIPOLYGON);\nSHOW FIELDS FROM gis_multi_polygon;\nINSERT INTO gis_multi_polygon VALUES\n (MultiPolygonFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52\n18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))\')),\n (MPolyFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66\n23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))\')),\n (MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3,\n3), Point(3, 0), Point(0, 3)))))));\n\nGEOMETRYCOLLECTION\n------------------\n\nCREATE TABLE gis_geometrycollection (g GEOMETRYCOLLECTION);\nSHOW FIELDS FROM gis_geometrycollection;\nINSERT INTO gis_geometrycollection VALUES\n (GeomCollFromText(\'GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10\n10))\')),\n (GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6),\nLineString(Point(3, 6), Point(7, 9)))))),\n (GeomFromText(\'GeometryCollection()\')),\n (GeomFromText(\'GeometryCollection EMPTY\'));\n\nGEOMETRY\n--------\n\nCREATE TABLE gis_geometry (g GEOMETRY);\nSHOW FIELDS FROM gis_geometry;\nINSERT into gis_geometry SELECT * FROM gis_point;\nINSERT into gis_geometry SELECT * FROM gis_line;\nINSERT into gis_geometry SELECT * FROM gis_polygon;\nINSERT into gis_geometry SELECT * FROM gis_multi_point;\nINSERT into gis_geometry SELECT * FROM gis_multi_line;\nINSERT into gis_geometry SELECT * FROM gis_multi_polygon;\nINSERT into gis_geometry SELECT * FROM gis_geometrycollection;\n\nURL: https://mariadb.com/kb/en/geometry-types/','','https://mariadb.com/kb/en/geometry-types/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (598,34,'Geometry Hierarchy','Description\n-----------\n\nGeometry is the base class. It is an abstract class. The instantiable\nsubclasses of Geometry are restricted to zero-, one-, and two-dimensional\ngeometric objects that exist in two-dimensional coordinate space. All\ninstantiable geometry classes are defined so that valid instances of a\ngeometry class are topologically closed (that is, all defined geometries\ninclude their boundary).\n\nThe base Geometry class has subclasses for Point, Curve, Surface, and\nGeometryCollection:\n\n* Point represents zero-dimensional objects.\n* Curve represents one-dimensional objects, and has subclass LineString, with\nsub-subclasses Line and LinearRing.\n* Surface is designed for two-dimensional objects and has subclass Polygon.\n* GeometryCollection has specialized zero-, one-, and two-dimensional\ncollection classes named MultiPoint, MultiLineString, and MultiPolygon for\nmodeling geometries corresponding to collections of Points, LineStrings, and\nPolygons, respectively. MultiCurve and MultiSurface are introduced as abstract\nsuperclasses that generalize the collection interfaces to handle Curves and\nSurfaces.\n\nGeometry, Curve, Surface, MultiCurve, and MultiSurface are defined as\nnon-instantiable classes. They define a common set of methods for their\nsubclasses and are included for extensibility.\n\nPoint, LineString, Polygon, GeometryCollection, MultiPoint, MultiLineString,\nand MultiPolygon are instantiable classes.\n\nURL: https://mariadb.com/kb/en/geometry-hierarchy/','','https://mariadb.com/kb/en/geometry-hierarchy/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (599,34,'SPATIAL INDEX','Description\n-----------\n\nOn MyISAM, Aria and InnoDB tables, MariaDB can create spatial indexes (an\nR-tree index) using syntax similar to that for creating regular indexes, but\nextended with the SPATIAL keyword. Currently, columns in spatial indexes must\nbe declared NOT NULL.\n\nSpatial indexes can be created when the table is created, or added after the\nfact like so:\n\n* with CREATE TABLE: CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g));\n\n* with ALTER TABLE: ALTER TABLE geom ADD SPATIAL INDEX(g);\n\n* with CREATE INDEX: CREATE SPATIAL INDEX sp_index ON geom (g);\n\nSPATIAL INDEX creates an R-tree index. For storage engines that support\nnon-spatial indexing of spatial columns, the engine creates a B-tree index. A\nB-tree index on spatial values is useful for exact-value lookups, but not for\nrange scans.\n\nFor more information on indexing spatial columns, see CREATE INDEX.\n\nTo drop spatial indexes, use ALTER TABLE or DROP INDEX:\n\n* with ALTER TABLE: ALTER TABLE geom DROP INDEX g;\n\n* with DROP INDEX: DROP INDEX sp_index ON geom;\n\nData-at-Rest Encyption\n----------------------\n\nBefore MariaDB 10.4.3, InnoDB\'s spatial indexes could not be encrypted. If an\nInnoDB table was encrypted and if it contained spatial indexes, then those\nindexes would be unencrypted.\n\nIn MariaDB 10.4.3 and later, if innodb_checksum_algorithm is set to full_crc32\nor strict_full_crc32, and if the table does not use ROW_FORMAT=COMPRESSED,\nthen InnoDB spatial indexes will be encrypted if the table is encrypted.\n\nSee MDEV-12026 for more information.\n\nURL: https://mariadb.com/kb/en/spatial-index/','','https://mariadb.com/kb/en/spatial-index/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (600,35,'BOUNDARY','A synonym for ST_BOUNDARY.\n\nURL: https://mariadb.com/kb/en/geometry-properties-boundary/','','https://mariadb.com/kb/en/geometry-properties-boundary/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (601,35,'DIMENSION','A synonym for ST_DIMENSION.\n\nURL: https://mariadb.com/kb/en/dimension/','','https://mariadb.com/kb/en/dimension/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (602,35,'ENVELOPE','A synonym for ST_ENVELOPE.\n\nURL: https://mariadb.com/kb/en/geometry-properties-envelope/','','https://mariadb.com/kb/en/geometry-properties-envelope/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (603,35,'GeometryN','A synonym for ST_GeometryN.\n\nURL: https://mariadb.com/kb/en/geometry-properties-geometryn/','','https://mariadb.com/kb/en/geometry-properties-geometryn/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (604,35,'GeometryType','A synonym for ST_GeometryType.\n\nURL: https://mariadb.com/kb/en/geometry-properties-geometrytype/','','https://mariadb.com/kb/en/geometry-properties-geometrytype/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (605,35,'IsClosed','A synonym for ST_IsClosed.\n\nURL: https://mariadb.com/kb/en/isclosed/','','https://mariadb.com/kb/en/isclosed/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (606,35,'IsEmpty','A synonym for ST_IsEmpty.\n\nURL: https://mariadb.com/kb/en/geometry-properties-isempty/','','https://mariadb.com/kb/en/geometry-properties-isempty/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (607,35,'IsRing','A synonym for ST_IsRing.\n\nURL: https://mariadb.com/kb/en/isring/','','https://mariadb.com/kb/en/isring/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (608,35,'IsSimple','A synonym for ST_IsSImple.\n\nURL: https://mariadb.com/kb/en/geometry-properties-issimple/','','https://mariadb.com/kb/en/geometry-properties-issimple/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (609,35,'NumGeometries','A synonym for ST_NumGeometries.\n\nURL: https://mariadb.com/kb/en/geometry-properties-numgeometries/','','https://mariadb.com/kb/en/geometry-properties-numgeometries/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (610,35,'SRID','A synonym for ST_SRID.\n\nURL: https://mariadb.com/kb/en/geometry-properties-srid/','','https://mariadb.com/kb/en/geometry-properties-srid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (611,35,'ST_BOUNDARY','MariaDB starting with 10.1.2\n----------------------------\nThe ST_BOUNDARY function was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_BOUNDARY(g)\nBOUNDARY(g)\n\nDescription\n-----------\n\nReturns a geometry that is the closure of the combinatorial boundary of the\ngeometry value g.\n\nBOUNDARY() is a synonym.\n\nExamples\n--------\n\nSELECT ST_AsText(ST_Boundary(ST_GeomFromText(\'LINESTRING(3 3,0 0, -3 3)\')));\n+----------------------------------------------------------------------+\n| ST_AsText(ST_Boundary(ST_GeomFromText(\'LINESTRING(3 3,0 0, -3 3)\'))) |\n+----------------------------------------------------------------------+\n| MULTIPOINT(3 3,-3 3) |\n+----------------------------------------------------------------------+\n\nSELECT ST_AsText(ST_Boundary(ST_GeomFromText(\'POLYGON((3 3,0 0, -3 3, 3\n3))\')));\n+--------------------------------------------------------------------------+\n| ST_AsText(ST_Boundary(ST_GeomFromText(\'POLYGON((3 3,0 0, -3 3, 3 3))\'))) |\n+--------------------------------------------------------------------------+\n| LINESTRING(3 3,0 0,-3 3,3 3) |\n+--------------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_boundary/','','https://mariadb.com/kb/en/st_boundary/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (612,35,'ST_DIMENSION','Syntax\n------\n\nST_Dimension(g)\nDimension(g)\n\nDescription\n-----------\n\nReturns the inherent dimension of the geometry value g. The result can be\n\n+------------------------------------+---------------------------------------+\n| Dimension | Definition |\n+------------------------------------+---------------------------------------+\n| -1 | empty geometry |\n+------------------------------------+---------------------------------------+\n| 0 | geometry with no length or area |\n+------------------------------------+---------------------------------------+\n| 1 | geometry with no area but nonzero |\n| | length |\n+------------------------------------+---------------------------------------+\n| 2 | geometry with nonzero area |\n+------------------------------------+---------------------------------------+\n\nST_Dimension() and Dimension() are synonyms.\n\nExamples\n--------\n\nSELECT Dimension(GeomFromText(\'LineString(1 1,2 2)\'));\n+------------------------------------------------+\n| Dimension(GeomFromText(\'LineString(1 1,2 2)\')) |\n+------------------------------------------------+\n| 1 |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_dimension/','','https://mariadb.com/kb/en/st_dimension/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (613,35,'ST_ENVELOPE','Syntax\n------\n\nST_ENVELOPE(g)\nENVELOPE(g)\n\nDescription\n-----------\n\nReturns the Minimum Bounding Rectangle (MBR) for the geometry value g. The\nresult is returned as a Polygon value.\n\nThe polygon is defined by the corner points of the bounding box:\n\nPOLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))\n\nST_ENVELOPE() and ENVELOPE() are synonyms.\n\nExamples\n--------\n\nSELECT AsText(ST_ENVELOPE(GeomFromText(\'LineString(1 1,4 4)\')));\n+----------------------------------------------------------+\n| AsText(ST_ENVELOPE(GeomFromText(\'LineString(1 1,4 4)\'))) |\n+----------------------------------------------------------+\n| POLYGON((1 1,4 1,4 4,1 4,1 1)) |\n+----------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_envelope/','','https://mariadb.com/kb/en/st_envelope/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (614,35,'ST_GEOMETRYN','Syntax\n------\n\nST_GeometryN(gc,N)\nGeometryN(gc,N)\n\nDescription\n-----------\n\nReturns the N-th geometry in the GeometryCollection gc. Geometries are\nnumbered beginning with 1.\n\nST_GeometryN() and GeometryN() are synonyms.\n\nExample\n-------\n\nSET @gc = \'GeometryCollection(Point(1 1),LineString(12 14, 9 11))\';\n\nSELECT AsText(GeometryN(GeomFromText(@gc),1));\n+----------------------------------------+\n| AsText(GeometryN(GeomFromText(@gc),1)) |\n+----------------------------------------+\n| POINT(1 1) |\n+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geometryn/','','https://mariadb.com/kb/en/st_geometryn/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (615,35,'ST_GEOMETRYTYPE','Syntax\n------\n\nST_GeometryType(g)\nGeometryType(g)\n\nDescription\n-----------\n\nReturns as a string the name of the geometry type of which the geometry\ninstance g is a member. The name corresponds to one of the instantiable\nGeometry subclasses.\n\nST_GeometryType() and GeometryType() are synonyms.\n\nExamples\n--------\n\nSELECT GeometryType(GeomFromText(\'POINT(1 1)\'));\n+------------------------------------------+\n| GeometryType(GeomFromText(\'POINT(1 1)\')) |\n+------------------------------------------+\n| POINT |\n+------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geometrytype/','','https://mariadb.com/kb/en/st_geometrytype/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (616,35,'ST_ISCLOSED','Syntax\n------\n\nST_IsClosed(g)\nIsClosed(g)\n\nDescription\n-----------\n\nReturns 1 if a given LINESTRING\'s start and end points are the same, or 0 if\nthey are not the same. Before MariaDB 10.1.5, returns NULL if not given a\nLINESTRING. After MariaDB 10.1.5, returns -1.\n\nST_IsClosed() and IsClosed() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(0 0, 0 4, 4 4, 0 0)\';\nSELECT ST_ISCLOSED(GEOMFROMTEXT(@ls));\n+--------------------------------+\n| ST_ISCLOSED(GEOMFROMTEXT(@ls)) |\n+--------------------------------+\n| 1 |\n+--------------------------------+\n\nSET @ls = \'LineString(0 0, 0 4, 4 4, 0 1)\';\nSELECT ST_ISCLOSED(GEOMFROMTEXT(@ls));\n+--------------------------------+\n| ST_ISCLOSED(GEOMFROMTEXT(@ls)) |\n+--------------------------------+\n| 0 |\n+--------------------------------+\n\nURL: https://mariadb.com/kb/en/st_isclosed/','','https://mariadb.com/kb/en/st_isclosed/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (617,35,'ST_ISEMPTY','Syntax\n------\n\nST_IsEmpty(g)\nIsEmpty(g)\n\nDescription\n-----------\n\nIsEmpty is a function defined by the OpenGIS specification, but is not fully\nimplemented by MariaDB or MySQL.\n\nSince MariaDB and MySQL do not support GIS EMPTY values such as POINT EMPTY,\nas implemented it simply returns 1 if the geometry value g is invalid, 0 if it\nis valid, and NULL if the argument is NULL.\n\nST_IsEmpty() and IsEmpty() are synonyms.\n\nURL: https://mariadb.com/kb/en/st_isempty/','','https://mariadb.com/kb/en/st_isempty/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (618,35,'ST_IsRing','MariaDB starting with 10.1.2\n----------------------------\nThe ST_IsRing function was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_IsRing(g)\nIsRing(g)\n\nDescription\n-----------\n\nReturns true if a given LINESTRING is a ring, that is, both ST_IsClosed and\nST_IsSimple. A simple curve does not pass through the same point more than\nonce. However, see MDEV-7510.\n\nSt_IsRing() and IsRing() are synonyms.\n\nURL: https://mariadb.com/kb/en/st_isring/','','https://mariadb.com/kb/en/st_isring/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (619,35,'ST_IsSimple','Syntax\n------\n\nST_IsSimple(g)\nIsSimple(g)\n\nDescription\n-----------\n\nReturns true if the given Geometry has no anomalous geometric points, false if\nit does, or NULL if given a NULL value.\n\nST_IsSimple() and IsSimple() are synonyms.\n\nExamples\n--------\n\nA POINT is always simple.\n\nSET @g = \'Point(1 2)\';\n\nSELECT ST_ISSIMPLE(GEOMFROMTEXT(@g));\n+-------------------------------+\n| ST_ISSIMPLE(GEOMFROMTEXT(@g)) |\n+-------------------------------+\n| 1 |\n+-------------------------------+\n\nURL: https://mariadb.com/kb/en/st_issimple/','','https://mariadb.com/kb/en/st_issimple/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (620,35,'ST_NUMGEOMETRIES','Syntax\n------\n\nST_NumGeometries(gc)\nNumGeometries(gc)\n\nDescription\n-----------\n\nReturns the number of geometries in the GeometryCollection gc.\n\nST_NumGeometries() and NumGeometries() are synonyms.\n\nExample\n-------\n\nSET @gc = \'GeometryCollection(Point(1 1),LineString(2 2, 3 3))\';\n\nSELECT NUMGEOMETRIES(GeomFromText(@gc));\n+----------------------------------+\n| NUMGEOMETRIES(GeomFromText(@gc)) |\n+----------------------------------+\n| 2 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/st_numgeometries/','','https://mariadb.com/kb/en/st_numgeometries/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (621,35,'ST_RELATE','MariaDB starting with 10.1.2\n----------------------------\nThe ST_RELATE() function was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_Relate(g1, g2, i)\n\nDescription\n-----------\n\nReturns true if Geometry g1 is spatially related to Geometryg2 by testing for\nintersections between the interior, boundary and exterior of the two\ngeometries as specified by the values in intersection matrix pattern i.\n\nURL: https://mariadb.com/kb/en/st_relate/','','https://mariadb.com/kb/en/st_relate/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (622,35,'ST_SRID','Syntax\n------\n\nST_SRID(g)\nSRID(g)\n\nDescription\n-----------\n\nReturns an integer indicating the Spatial Reference System ID for the geometry\nvalue g.\n\nIn MariaDB, the SRID value is just an integer associated with the geometry\nvalue. All calculations are done assuming Euclidean (planar) geometry.\n\nST_SRID() and SRID() are synonyms.\n\nExamples\n--------\n\nSELECT SRID(GeomFromText(\'LineString(1 1,2 2)\',101));\n+-----------------------------------------------+\n| SRID(GeomFromText(\'LineString(1 1,2 2)\',101)) |\n+-----------------------------------------------+\n| 101 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_srid/','','https://mariadb.com/kb/en/st_srid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (623,36,'LOAD_FILE','Syntax\n------\n\nLOAD_FILE(file_name)\n\nDescription\n-----------\n\nReads the file and returns the file contents as a string. To use this\nfunction, the file must be located on the server host, you must specify the\nfull path name to the file, and you must have the FILE privilege. The file\nmust be readable by all and it must be less than the size, in bytes, of the\nmax_allowed_packet system variable. If the secure_file_priv system variable is\nset to a non-empty directory name, the file to be loaded must be located in\nthat directory.\n\nIf the file does not exist or cannot be read because one of the preceding\nconditions is not satisfied, the function returns NULL.\n\nSince MariaDB 5.1, the character_set_filesystem system variable has controlled\ninterpretation of file names that are given as literal strings.\n\nStatements using the LOAD_FILE() function are not safe for statement based\nreplication. This is because the slave will execute the LOAD_FILE() command\nitself. If the file doesn\'t exist on the slave, the function will return NULL.\n\nExamples\n--------\n\nUPDATE t SET blob_col=LOAD_FILE(\'/tmp/picture\') WHERE id=1;\n\nURL: https://mariadb.com/kb/en/load_file/','','https://mariadb.com/kb/en/load_file/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (624,36,'NOT REGEXP','Syntax\n------\n\nexpr NOT REGEXP pat, expr NOT RLIKE pat\n\nDescription\n-----------\n\nThis is the same as NOT (expr REGEXP pat).\n\nURL: https://mariadb.com/kb/en/not-regexp/','','https://mariadb.com/kb/en/not-regexp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (625,36,'REGEXP','Syntax\n------\n\nexpr REGEXP pat, expr RLIKE pat\n\nDescription\n-----------\n\nPerforms a pattern match of a string expression expr against a pattern pat.\nThe pattern can be an extended regular expression. See Regular Expressions\nOverview for details on the syntax for regular expressions (see also PCRE\nRegular Expressions).\n\nReturns 1 if expr matches pat or 0 if it doesn\'t match. If either expr or pat\nare NULL, the result is NULL.\n\nThe negative form NOT REGEXP also exists, as an alias for NOT (string REGEXP\npattern). RLIKE and NOT RLIKE are synonyms for REGEXP and NOT REGEXP,\noriginally provided for mSQL compatibility.\n\nThe pattern need not be a literal string. For example, it can be specified as\na string expression or table column.\n\nNote: Because MariaDB uses the C escape syntax in strings (for example, \"\\n\"\nto represent the newline character), you must double any \"\\\" that you use in\nyour REGEXP strings.\n\nREGEXP is not case sensitive, except when used with binary strings.\n\nMariaDB 10.0.5 moved to the PCRE regex library - see PCRE Regular Expressions\nfor enhancements to REGEXP introduced in MariaDB 10.0.5.\n\nThe default_regex_flags variable addresses the remaining compatibilities\nbetween PCRE and the old regex library.\n\nExamples\n--------\n\nSELECT \'Monty!\' REGEXP \'m%y%%\';\n+-------------------------+\n| \'Monty!\' REGEXP \'m%y%%\' |\n+-------------------------+\n| 0 |\n+-------------------------+\n\nSELECT \'Monty!\' REGEXP \'.*\';\n+----------------------+\n| \'Monty!\' REGEXP \'.*\' |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT \'new*\\n*line\' REGEXP \'new\\\\*.\\\\*line\';\n+---------------------------------------+\n| \'new*\\n*line\' REGEXP \'new\\\\*.\\\\*line\' |\n+---------------------------------------+\n| 1 |\n+---------------------------------------+\n\nSELECT \'a\' REGEXP \'A\', \'a\' REGEXP BINARY \'A\';\n+----------------+-----------------------+\n| \'a\' REGEXP \'A\' | \'a\' REGEXP BINARY \'A\' |\n+----------------+-----------------------+\n| 1 | 0 |\n+----------------+-----------------------+\n\nSELECT \'a\' REGEXP \'^[a-d]\';\n+---------------------+\n| \'a\' REGEXP \'^[a-d]\' |\n+---------------------+\n| 1 |\n+---------------------+\n\ndefault_regex_flags examples\n----------------------------\n\nMariaDB 10.0.11 introduced the default_regex_flags variable to address the\nremaining compatibilities between PCRE and the old regex library.\n\nThe default behaviour (multiline match is off)\n\nSELECT \'a\\nb\\nc\' RLIKE \'^b$\';\n+---------------------------+\n| \'(?m)a\\nb\\nc\' RLIKE \'^b$\' |\n+---------------------------+\n| 0 |\n+---------------------------+\n\nEnabling the multiline option using the PCRE option syntax:\n\nSELECT \'a\\nb\\nc\' RLIKE \'(?m)^b$\';\n+---------------------------+\n| \'a\\nb\\nc\' RLIKE \'(?m)^b$\' |\n+---------------------------+\n| 1 |\n+---------------------------+\n\nEnabling the multiline option using default_regex_flags\n\nSET default_regex_flags=\'MULTILINE\';\nSELECT \'a\\nb\\nc\' RLIKE \'^b$\';\n+-----------------------+\n| \'a\\nb\\nc\' RLIKE \'^b$\' |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/regexp/','','https://mariadb.com/kb/en/regexp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (626,36,'REGEXP_INSTR','Syntax\n------\n\nREGEXP_INSTR(subject, pattern)\n\nReturns the position of the first occurrence of the regular expression pattern\nin the string subject, or 0 if pattern was not found.\n\nThe positions start with 1 and are measured in characters (i.e. not in bytes),\nwhich is important for multi-byte character sets. You can cast a multi-byte\ncharacter set to BINARY to get offsets in bytes.\n\nThe function follows the case sensitivity rules of the effective collation.\nMatching is performed case insensitively for case insensitive collations, and\ncase sensitively for case sensitive collations and for binary data.\n\nThe collation case sensitivity can be overwritten using the (?i) and (?-i)\nPCRE flags.\n\nMariaDB uses the PCRE regular expression library for enhanced regular\nexpression performance, and REGEXP_INSTR was introduced as part of this\nenhancement.\n\nExamples\n--------\n\nSELECT REGEXP_INSTR(\'abc\',\'b\');\n-> 2\n\nSELECT REGEXP_INSTR(\'abc\',\'x\');\n-> 0\n\nSELECT REGEXP_INSTR(\'BJÖRN\',\'N\');\n-> 5\n\nCasting a multi-byte character set as BINARY to get offsets in bytes:\n\nSELECT REGEXP_INSTR(BINARY \'BJÖRN\',\'N\') AS cast_utf8_to_binary;\n-> 6\n\nCase sensitivity:\n\nSELECT REGEXP_INSTR(\'ABC\',\'b\');\n-> 2\n\nSELECT REGEXP_INSTR(\'ABC\' COLLATE utf8_bin,\'b\');\n-> 0\n\nSELECT REGEXP_INSTR(BINARY\'ABC\',\'b\');\n-> 0\n\nSELECT REGEXP_INSTR(\'ABC\',\'(?-i)b\');\n-> 0\n\nSELECT REGEXP_INSTR(\'ABC\' COLLATE utf8_bin,\'(?i)b\');\n-> 2\n\nURL: https://mariadb.com/kb/en/regexp_instr/','','https://mariadb.com/kb/en/regexp_instr/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (627,36,'REGEXP_REPLACE','Syntax\n------\n\nREGEXP_REPLACE(subject, pattern, replace)\n\nDescription\n-----------\n\nREGEXP_REPLACE returns the string subject with all occurrences of the regular\nexpression pattern replaced by the string replace. If no occurrences are\nfound, then subject is returned as is.\n\nThe replace string can have backreferences to the subexpressions in the form\n\\N, where N is a number from 1 to 9.\n\nThe function follows the case sensitivity rules of the effective collation.\nMatching is performed case insensitively for case insensitive collations, and\ncase sensitively for case sensitive collations and for binary data.\n\nThe collation case sensitivity can be overwritten using the (?i) and (?-i)\nPCRE flags.\n\nMariaDB uses the PCRE regular expression library for enhanced regular\nexpression performance, and REGEXP_REPLACE was introduced as part of this\nenhancement.\n\nThe default_regex_flags variable addresses the remaining compatibilities\nbetween PCRE and the old regex library.\n\nExamples\n--------\n\nSELECT REGEXP_REPLACE(\'ab12cd\',\'[0-9]\',\'\') AS remove_digits;\n-> abcd\n\nSELECT\nREGEXP_REPLACE(\'<html><head><title>title</title><body>body</body></htm>\',\n\'<.+?>\',\' \')\nAS strip_html;\n-> title body\n\nBackreferences to the subexpressions in the form \\N, where N is a number from\n1 to 9:\n\nSELECT REGEXP_REPLACE(\'James Bond\',\'^(.*) (.*)$\',\'\\\\2, \\\\1\') AS reorder_name;\n-> Bond, James\n\nCase insensitive and case sensitive matches:\n\nSELECT REGEXP_REPLACE(\'ABC\',\'b\',\'-\') AS case_insensitive;\n-> A-C\n\nSELECT REGEXP_REPLACE(\'ABC\' COLLATE utf8_bin,\'b\',\'-\') AS case_sensitive;\n-> ABC\n\nSELECT REGEXP_REPLACE(BINARY \'ABC\',\'b\',\'-\') AS binary_data;\n-> ABC\n\nOverwriting the collation case sensitivity using the (?i) and (?-i) PCRE flags.\n\nSELECT REGEXP_REPLACE(\'ABC\',\'(?-i)b\',\'-\') AS force_case_sensitive;\n-> ABC\n\nSELECT REGEXP_REPLACE(BINARY \'ABC\',\'(?i)b\',\'-\') AS force_case_insensitive;\n-> A-C\n\nURL: https://mariadb.com/kb/en/regexp_replace/','','https://mariadb.com/kb/en/regexp_replace/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (628,36,'REGEXP_SUBSTR','Syntax\n------\n\nREGEXP_SUBSTR(subject,pattern)\n\nDescription\n-----------\n\nReturns the part of the string subject that matches the regular expression\npattern, or an empty string if pattern was not found.\n\nThe function follows the case sensitivity rules of the effective collation.\nMatching is performed case insensitively for case insensitive collations, and\ncase sensitively for case sensitive collations and for binary data.\n\nThe collation case sensitivity can be overwritten using the (?i) and (?-i)\nPCRE flags.\n\nMariaDB uses the PCRE regular expression library for enhanced regular\nexpression performance, and REGEXP_SUBSTR was introduced as part of this\nenhancement.\n\nThe default_regex_flags variable addresses the remaining compatibilities\nbetween PCRE and the old regex library.\n\nExamples\n--------\n\nSELECT REGEXP_SUBSTR(\'ab12cd\',\'[0-9]+\');\n-> 12\n\nSELECT REGEXP_SUBSTR(\n \'See https://mariadb.org/en/foundation/ for details\',\n \'https?://[^/]*\');\n-> https://mariadb.org\n\nSELECT REGEXP_SUBSTR(\'ABC\',\'b\');\n-> B\n\nSELECT REGEXP_SUBSTR(\'ABC\' COLLATE utf8_bin,\'b\');\n->\n\nSELECT REGEXP_SUBSTR(BINARY\'ABC\',\'b\');\n->\n\nSELECT REGEXP_SUBSTR(\'ABC\',\'(?i)b\');\n-> B\n\nSELECT REGEXP_SUBSTR(\'ABC\' COLLATE utf8_bin,\'(?+i)b\');\n-> B\n\nURL: https://mariadb.com/kb/en/regexp_substr/','','https://mariadb.com/kb/en/regexp_substr/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (629,36,'ASCII','Syntax\n------\n\nASCII(str)\n\nDescription\n-----------\n\nReturns the numeric ASCII value of the leftmost character of the string\nargument. Returns 0 if the given string is empty and NULL if it is NULL.\n\nASCII() works for 8-bit characters.\n\nExamples\n--------\n\nSELECT ASCII(9);\n+----------+\n| ASCII(9) |\n+----------+\n| 57 |\n+----------+\n\nSELECT ASCII(\'9\');\n+------------+\n| ASCII(\'9\') |\n+------------+\n| 57 |\n+------------+\n\nSELECT ASCII(\'abc\');\n+--------------+\n| ASCII(\'abc\') |\n+--------------+\n| 97 |\n+--------------+\n\nURL: https://mariadb.com/kb/en/ascii/','','https://mariadb.com/kb/en/ascii/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (630,36,'BIN','Syntax\n------\n\nBIN(N)\n\nDescription\n-----------\n\nReturns a string representation of the binary value of the given longlong\n(that is, BIGINT) number. This is equivalent to CONV(N,10,2). The argument\nshould be positive. If it is a FLOAT, it will be truncated. Returns NULL if\nthe argument is NULL.\n\nExamples\n--------\n\nSELECT BIN(12);\n+---------+\n| BIN(12) |\n+---------+\n| 1100 |\n+---------+\n\nURL: https://mariadb.com/kb/en/bin/','','https://mariadb.com/kb/en/bin/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (631,36,'BINARY Operator','This page describes the BINARY operator. For details about the data type, see\nBinary Data Type.\n\nSyntax\n------\n\nBINARY\n\nDescription\n-----------\n\nThe BINARY operator casts the string following it to a binary string. This is\nan easy way to force a column comparison to be done byte by byte rather than\ncharacter by character. This causes the comparison to be case sensitive even\nif the column isn\'t defined as BINARY or BLOB.\n\nBINARY also causes trailing spaces to be significant.\n\nExamples\n--------\n\nSELECT \'a\' = \'A\';\n+-----------+\n| \'a\' = \'A\' |\n+-----------+\n| 1 |\n+-----------+\n\nSELECT BINARY \'a\' = \'A\';\n+------------------+\n| BINARY \'a\' = \'A\' |\n+------------------+\n| 0 |\n+------------------+\n\nSELECT \'a\' = \'a \';\n+------------+\n| \'a\' = \'a \' |\n+------------+\n| 1 |\n+------------+\n\nSELECT BINARY \'a\' = \'a \';\n+-------------------+\n| BINARY \'a\' = \'a \' |\n+-------------------+\n| 0 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/binary-operator/','','https://mariadb.com/kb/en/binary-operator/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (632,36,'BIT_LENGTH','Syntax\n------\n\nBIT_LENGTH(str)\n\nDescription\n-----------\n\nReturns the length of the given string argument in bits. If the argument is\nnot a string, it will be converted to string. If the argument is NULL, it\nreturns NULL.\n\nExamples\n--------\n\nSELECT BIT_LENGTH(\'text\');\n+--------------------+\n| BIT_LENGTH(\'text\') |\n+--------------------+\n| 32 |\n+--------------------+\n\nSELECT BIT_LENGTH(\'\');\n+----------------+\n| BIT_LENGTH(\'\') |\n+----------------+\n| 0 |\n+----------------+\n\nCompatibility\n-------------\n\nPostgreSQL and Sybase support BIT_LENGTH().\n\nURL: https://mariadb.com/kb/en/bit_length/','','https://mariadb.com/kb/en/bit_length/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (633,36,'CAST','Syntax\n------\n\nCAST(expr AS type)\n\nDescription\n-----------\n\nThe CAST() function takes a value of one type and produces a value of another\ntype, similar to the CONVERT() function.\n\nThe type can be one of the following values:\n\n* BINARY\n* CHAR\n* DATE\n* DATETIME\n* DECIMAL[(M[,D])]\n* DOUBLE\n* FLOAT (from MariaDB 10.4.5)\n* INTEGER\nShort for SIGNED INTEGER\n\n* SIGNED [INTEGER]\n* UNSIGNED [INTEGER]\n* TIME\n* VARCHAR (in Oracle mode, from MariaDB 10.3)\n\nThe main difference between CAST and CONVERT() is that CONVERT(expr,type) is\nODBC syntax while CAST(expr as type) and CONVERT(... USING ...) are SQL92\nsyntax.\n\nIn MariaDB 10.4 and later, you can use the CAST() function with the INTERVAL\nkeyword.\n\nUntil MariaDB 5.5.31, X\'HHHH\', the standard SQL syntax for binary string\nliterals, erroneously worked in the same way as 0xHHHH. In 5.5.31 it was\nintentionally changed to behave as a string in all contexts (and never as a\nnumber).\n\nThis introduced an incompatibility with previous versions of MariaDB, and all\nversions of MySQL (see the example below).\n\nExamples\n--------\n\nSimple casts:\n\nSELECT CAST(\"abc\" AS BINARY);\nSELECT CAST(\"1\" AS UNSIGNED INTEGER);\nSELECT CAST(123 AS CHAR CHARACTER SET utf8)\n\nNote that when one casts to CHAR without specifying the character set, the\ncollation_connection character set collation will be used. When used with CHAR\nCHARACTER SET, the default collation for that character set will be used.\n\nSELECT COLLATION(CAST(123 AS CHAR));\n+------------------------------+\n| COLLATION(CAST(123 AS CHAR)) |\n+------------------------------+\n| latin1_swedish_ci |\n+------------------------------+\n\nSELECT COLLATION(CAST(123 AS CHAR CHARACTER SET utf8));\n+-------------------------------------------------+\n| COLLATION(CAST(123 AS CHAR CHARACTER SET utf8)) |\n+-------------------------------------------------+\n| utf8_general_ci |\n+-------------------------------------------------+\n\nIf you also want to change the collation, you have to use the COLLATE operator:\n\nSELECT COLLATION(CAST(123 AS CHAR CHARACTER SET utf8) \n COLLATE utf8_unicode_ci);\n+-------------------------------------------------------------------------+\n| COLLATION(CAST(123 AS CHAR CHARACTER SET utf8) COLLATE utf8_unicode_ci) |\n+-------------------------------------------------------------------------+\n| utf8_unicode_ci |\n+-------------------------------------------------------------------------+\n\nUsing CAST() to order an ENUM field as a CHAR rather than the internal\nnumerical value:\n\nCREATE TABLE enum_list (enum_field enum(\'c\',\'a\',\'b\'));\n\nINSERT INTO enum_list (enum_field) \nVALUES(\'c\'),(\'a\'),(\'c\'),(\'b\');\n\nSELECT * FROM enum_list \nORDER BY enum_field;\n+------------+\n| enum_field |\n+------------+\n| c |\n| c |\n| a |\n| b |\n+------------+\n\nSELECT * FROM enum_list \nORDER BY CAST(enum_field AS CHAR);\n+------------+\n| enum_field |\n+------------+\n| a |\n| b |\n| c |\n| c |\n+------------+\n\nFrom MariaDB 5.5.31, the following will trigger warnings, since x\'aa\' and\n\'X\'aa\' no longer behave as a number. Previously, and in all versions of MySQL,\nno warnings are triggered since they did erroneously behave as a number:\n\nSELECT CAST(0xAA AS UNSIGNED), CAST(x\'aa\' AS UNSIGNED), CAST(X\'aa\' AS\nUNSIGNED);\n+------------------------+-------------------------+-------------------------+\n| CAST(0xAA AS UNSIGNED) | CAST(x\'aa\' AS UNSIGNED) | CAST(X\'aa\' AS UNSIGNED) |\n+------------------------+-------------------------+-------------------------+\n| 170 | 0 | 0 |\n+------------------------+-------------------------+-------------------------+\n1 row in set, 2 warnings (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect INTEGER value: \'\\xAA\'\nWarning (Code 1292): Truncated incorrect INTEGER value: \'\\xAA\'\n\nCasting to intervals:\n\nSELECT CAST(2019-01-04 INTERVAL AS DAY_SECOND(2)) AS \"Cast\";\n\n+-------------+\n| Cast |\n+-------------+\n| 00:20:17.00 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/cast/','','https://mariadb.com/kb/en/cast/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (634,36,'CHAR Function','Syntax\n------\n\nCHAR(N,... [USING charset_name])\n\nDescription\n-----------\n\nCHAR() interprets each argument as an INT and returns a string consisting of\nthe characters given by the code values of those integers. NULL values are\nskipped. By default, CHAR() returns a binary string. To produce a string in a\ngiven character set, use the optional USING clause:\n\nSELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));\n+---------------------+--------------------------------+\n| CHARSET(CHAR(0x65)) | CHARSET(CHAR(0x65 USING utf8)) |\n+---------------------+--------------------------------+\n| binary | utf8 |\n+---------------------+--------------------------------+\n\nIf USING is given and the result string is illegal for the given character\nset, a warning is issued. Also, if strict SQL mode is enabled, the result from\nCHAR() becomes NULL.\n\nExamples\n--------\n\nSELECT CHAR(77,97,114,\'105\',97,\'68\',66);\n+----------------------------------+\n| CHAR(77,97,114,\'105\',97,\'68\',66) |\n+----------------------------------+\n| MariaDB |\n+----------------------------------+\n\nSELECT CHAR(77,77.3,\'77.3\');\n+----------------------+\n| CHAR(77,77.3,\'77.3\') |\n+----------------------+\n| MMM |\n+----------------------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect INTEGER value: \'77.3\'\n\nURL: https://mariadb.com/kb/en/char-function/','','https://mariadb.com/kb/en/char-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (635,36,'CHAR_LENGTH','Syntax\n------\n\nCHAR_LENGTH(str)\nCHARACTER_LENGTH(str)\n\nDescription\n-----------\n\nReturns the length of the given string argument, measured in characters. A\nmulti-byte character counts as a single character. This means that for a\nstring containing five two-byte characters, LENGTH() (or OCTET_LENGTH() in\nOracle mode) returns 10, whereas CHAR_LENGTH() returns 5. If the argument is\nNULL, it returns NULL.\n\nIf the argument is not a string value, it is converted into a string.\n\nIt is synonymous with the CHARACTER_LENGTH() function.\n\nExamples\n--------\n\nSELECT CHAR_LENGTH(\'MariaDB\');\n+------------------------+\n| CHAR_LENGTH(\'MariaDB\') |\n+------------------------+\n| 7 |\n+------------------------+\n\nWhen Oracle mode from MariaDB 10.3 is not set:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 2 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nIn Oracle mode from MariaDB 10.3:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 1 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nURL: https://mariadb.com/kb/en/char_length/','','https://mariadb.com/kb/en/char_length/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (636,36,'CHR','MariaDB starting with 10.3.1\n----------------------------\nThe CHR() function was introduced in MariaDB 10.3.1 to provide Oracle\ncompatibility\n\nSyntax\n------\n\nCHR(N)\n\nDescription\n-----------\n\nCHR() interprets each argument N as an integer and returns a VARCHAR(1) string\nconsisting of the character given by the code values of the integer. The\ncharacter set and collation of the string are set according to the values of\nthe character_set_database and collation_database system variables.\n\nCHR() is similar to the CHAR() function, but only accepts a single argument.\n\nCHR() is available in all sql_modes.\n\nExamples\n--------\n\nSELECT CHR(67);\n+---------+\n| CHR(67) |\n+---------+\n| C |\n+---------+\n\nSELECT CHR(\'67\');\n+-----------+\n| CHR(\'67\') |\n+-----------+\n| C |\n+-----------+\n\nSELECT CHR(\'C\');\n+----------+\n| CHR(\'C\') |\n+----------+\n| |\n+----------+\n1 row in set, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+---------+------+----------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------+\n| Warning | 1292 | Truncated incorrect INTEGER value: \'C\' |\n+---------+------+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/chr/','','https://mariadb.com/kb/en/chr/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (637,36,'CONCAT','Syntax\n------\n\nCONCAT(str1,str2,...)\n\nDescription\n-----------\n\nReturns the string that results from concatenating the arguments. May have one\nor more arguments. If all arguments are non-binary strings, the result is a\nnon-binary string. If the arguments include any binary strings, the result is\na binary string. A numeric argument is converted to its equivalent binary\nstring form; if you want to avoid that, you can use an explicit type cast, as\nin this example:\n\nSELECT CONCAT(CAST(int_col AS CHAR), char_col);\n\nCONCAT() returns NULL if any argument is NULL.\n\nA NULL parameter hides all information contained in other parameters from the\nresult. Sometimes this is not desirable; to avoid this, you can:\n\n* Use the CONCAT_WS() function with an empty separator, because that function\nis NULL-safe.\n* Use IFNULL() to turn NULLs into empty strings.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, CONCAT ignores NULL.\n\nExamples\n--------\n\nSELECT CONCAT(\'Ma\', \'ria\', \'DB\');\n+---------------------------+\n| CONCAT(\'Ma\', \'ria\', \'DB\') |\n+---------------------------+\n| MariaDB |\n+---------------------------+\n\nSELECT CONCAT(\'Ma\', \'ria\', NULL, \'DB\');\n+---------------------------------+\n| CONCAT(\'Ma\', \'ria\', NULL, \'DB\') |\n+---------------------------------+\n| NULL |\n+---------------------------------+\n\nSELECT CONCAT(42.0);\n+--------------+\n| CONCAT(42.0) |\n+--------------+\n| 42.0 |\n+--------------+\n\nUsing IFNULL() to handle NULLs:\n\nSELECT CONCAT(\'The value of @v is: \', IFNULL(@v, \'\'));\n+------------------------------------------------+\n| CONCAT(\'The value of @v is: \', IFNULL(@v, \'\')) |\n+------------------------------------------------+\n| The value of @v is: |\n+------------------------------------------------+\n\nIn Oracle mode, from MariaDB 10.3:\n\nSELECT CONCAT(\'Ma\', \'ria\', NULL, \'DB\');\n+---------------------------------+\n| CONCAT(\'Ma\', \'ria\', NULL, \'DB\') |\n+---------------------------------+\n| MariaDB |\n+---------------------------------+\n\nURL: https://mariadb.com/kb/en/concat/','','https://mariadb.com/kb/en/concat/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (638,36,'CONCAT_WS','Syntax\n------\n\nCONCAT_WS(separator,str1,str2,...)\n\nDescription\n-----------\n\nCONCAT_WS() stands for Concatenate With Separator and is a special form of\nCONCAT(). The first argument is the separator for the rest of the arguments.\nThe separator is added between the strings to be concatenated. The separator\ncan be a string, as can the rest of the arguments.\n\nIf the separator is NULL, the result is NULL; all other NULL values are\nskipped. This makes CONCAT_WS() suitable when you want to concatenate some\nvalues and avoid losing all information if one of them is NULL.\n\nExamples\n--------\n\nSELECT CONCAT_WS(\',\',\'First name\',\'Second name\',\'Last Name\');\n+-------------------------------------------------------+\n| CONCAT_WS(\',\',\'First name\',\'Second name\',\'Last Name\') |\n+-------------------------------------------------------+\n| First name,Second name,Last Name |\n+-------------------------------------------------------+\n\nSELECT CONCAT_WS(\'-\',\'Floor\',NULL,\'Room\');\n+------------------------------------+\n| CONCAT_WS(\'-\',\'Floor\',NULL,\'Room\') |\n+------------------------------------+\n| Floor-Room |\n+------------------------------------+\n\nIn some cases, remember to include a space in the separator string:\n\nSET @a = \'gnu\', @b = \'penguin\', @c = \'sea lion\';\nQuery OK, 0 rows affected (0.00 sec)\n\nSELECT CONCAT_WS(\', \', @a, @b, @c);\n+-----------------------------+\n| CONCAT_WS(\', \', @a, @b, @c) |\n+-----------------------------+\n| gnu, penguin, sea lion |\n+-----------------------------+\n\nUsing CONCAT_WS() to handle NULLs:\n\nSET @a = \'a\', @b = NULL, @c = \'c\';\n\nSELECT CONCAT_WS(\'\', @a, @b, @c);\n+---------------------------+\n| CONCAT_WS(\'\', @a, @b, @c) |\n+---------------------------+\n| ac |\n+---------------------------+\n\nURL: https://mariadb.com/kb/en/concat_ws/','','https://mariadb.com/kb/en/concat_ws/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (639,36,'CONVERT','Syntax\n------\n\nCONVERT(expr,type), CONVERT(expr USING transcoding_name)\n\nDescription\n-----------\n\nThe CONVERT() and CAST() functions take a value of one type and produce a\nvalue of another type.\n\nThe type can be one of the following values:\n\n* BINARY\n* CHAR\n* DATE\n* DATETIME\n* DECIMAL[(M[,D])]\n* DOUBLE\n* FLOAT (from MariaDB 10.4.5)\n* INTEGER\nShort for SIGNED INTEGER\n\n* SIGNED [INTEGER]\n* UNSIGNED [INTEGER]\n* TIME\n* VARCHAR (in Oracle mode, from MariaDB 10.3)\n\nNote that in MariaDB, INT and INTEGER are the same thing.\n\nBINARY produces a string with the BINARY data type. If the optional length is\ngiven, BINARY(N) causes the cast to use no more than N bytes of the argument.\nValues shorter than the given number in bytes are padded with 0x00 bytes to\nmake them equal the length value.\n\nCHAR(N) causes the cast to use no more than the number of characters given in\nthe argument.\n\nThe main difference between the CAST() and CONVERT() is that\nCONVERT(expr,type) is ODBC syntax while CAST(expr as type) and CONVERT(...\nUSING ...) are SQL92 syntax.\n\nCONVERT() with USING is used to convert data between different character sets.\nIn MariaDB, transcoding names are the same as the corresponding character set\nnames. For example, this statement converts the string \'abc\' in the default\ncharacter set to the corresponding string in the utf8 character set:\n\nSELECT CONVERT(\'abc\' USING utf8);\n\nExamples\n--------\n\nSELECT enum_col FROM tbl_name \nORDER BY CAST(enum_col AS CHAR);\n\nConverting a BINARY to string to permit the LOWER function to work:\n\nSET @x = \'AardVark\';\n\nSET @x = BINARY \'AardVark\';\n\nSELECT LOWER(@x), LOWER(CONVERT (@x USING latin1));\n+-----------+----------------------------------+\n| LOWER(@x) | LOWER(CONVERT (@x USING latin1)) |\n+-----------+----------------------------------+\n| AardVark | aardvark |\n+-----------+----------------------------------+\n\nURL: https://mariadb.com/kb/en/convert/','','https://mariadb.com/kb/en/convert/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (640,36,'ELT','Syntax\n------\n\nELT(N, str1[, str2, str3,...])\n\nDescription\n-----------\n\nTakes a numeric argument and a series of string arguments. Returns the string\nthat corresponds to the given numeric position. For instance, it returns str1\nif N is 1, str2 if N is 2, and so on. If the numeric argument is a FLOAT,\nMariaDB rounds it to the nearest INTEGER. If the numeric argument is less than\n1, greater than the total number of arguments, or not a number, ELT() returns\nNULL. It must have at least two arguments.\n\nIt is complementary to the FIELD() function.\n\nExamples\n--------\n\nSELECT ELT(1, \'ej\', \'Heja\', \'hej\', \'foo\');\n+------------------------------------+\n| ELT(1, \'ej\', \'Heja\', \'hej\', \'foo\') |\n+------------------------------------+\n| ej |\n+------------------------------------+\n\nSELECT ELT(4, \'ej\', \'Heja\', \'hej\', \'foo\');\n+------------------------------------+\n| ELT(4, \'ej\', \'Heja\', \'hej\', \'foo\') |\n+------------------------------------+\n| foo |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/elt/','','https://mariadb.com/kb/en/elt/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (641,36,'EXPORT_SET','Syntax\n------\n\nEXPORT_SET(bits, on, off[, separator[, number_of_bits]])\n\nDescription\n-----------\n\nTakes a minimum of three arguments. Returns a string where each bit in the\ngiven bits argument is returned, with the string values given for on and off.\n\nBits are examined from right to left, (from low-order to high-order bits).\nStrings are added to the result from left to right, separated by a separator\nstring (defaults as \',\'). You can optionally limit the number of bits the\nEXPORT_SET() function examines using the number_of_bits option.\n\nIf any of the arguments are set as NULL, the function returns NULL.\n\nExamples\n--------\n\nSELECT EXPORT_SET(5,\'Y\',\'N\',\',\',4);\n+-----------------------------+\n| EXPORT_SET(5,\'Y\',\'N\',\',\',4) |\n+-----------------------------+\n| Y,N,Y,N |\n+-----------------------------+\n\nSELECT EXPORT_SET(6,\'1\',\'0\',\',\',10);\n+------------------------------+\n| EXPORT_SET(6,\'1\',\'0\',\',\',10) |\n+------------------------------+\n| 0,1,1,0,0,0,0,0,0,0 |\n+------------------------------+\n\nURL: https://mariadb.com/kb/en/export_set/','','https://mariadb.com/kb/en/export_set/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (642,36,'EXTRACTVALUE','Syntax\n------\n\nEXTRACTVALUE(xml_frag, xpath_expr)\n\nDescription\n-----------\n\nThe EXTRACTVALUE() function takes two string arguments: a fragment of XML\nmarkup and an XPath expression, (also known as a locator). It returns the text\n(That is, CDDATA), of the first text node which is a child of the element or\nelements matching the XPath expression.\n\nIn cases where a valid XPath expression does not match any text nodes in a\nvalid XML fragment, (including the implicit /text() expression), the\nEXTRACTVALUE() function returns an empty string.\n\nInvalid Arguments\n-----------------\n\nWhen either the XML fragment or the XPath expression is NULL, the\nEXTRACTVALUE() function returns NULL. When the XML fragment is invalid, it\nraises a warning Code 1525:\n\nWarning (Code 1525): Incorrect XML value: \'parse error at line 1 pos 11:\nunexpected END-OF-INPUT\'\n\nWhen the XPath value is invalid, it generates an Error 1105:\n\nERROR 1105 (HY000): XPATH syntax error: \')\'\n\nExplicit text() Expressions\n---------------------------\n\nThis function is the equivalent of performing a match using the XPath\nexpression after appending /text(). In other words:\n\nSELECT\n EXTRACTVALUE(\'<cases><case>example</case></cases>\', \'/cases/case\')\n AS \'Base Example\',\n EXTRACTVALUE(\'<cases><case>example</case></cases>\', \'/cases/case/text()\')\n AS \'text() Example\';\n+--------------+----------------+\n| Base Example | text() Example |\n+--------------+----------------+\n| example | example |\n+--------------+----------------+\n\nCount Matches\n-------------\n\nWhen EXTRACTVALUE() returns multiple matches, it returns the content of the\nfirst child text node of each matching element, in the matched order, as a\nsingle, space-delimited string.\n\nBy design, the EXTRACTVALUE() function makes no distinction between a match on\nan empty element and no match at all. If you need to determine whether no\nmatching element was found in the XML fragment or if an element was found that\ncontained no child text nodes, use the XPath count() function.\n\nFor instance, when looking for a value that exists, but contains no child text\nnodes, you would get a count of the number of matching instances:\n\nSELECT\n EXTRACTVALUE(\'<cases><case/></cases>\', \'/cases/case\')\n AS \'Empty Example\',\n EXTRACTVALUE(\'<cases><case/></cases>\', \'count(/cases/case)\')\n AS \'count() Example\';\n+---------------+-----------------+\n| Empty Example | count() Example |\n+---------------+-----------------+\n| | 1 |\n+---------------+-----------------+\n\nAlternatively, when looking for a value that doesn\'t exist, count() returns 0.\n\nSELECT\n EXTRACTVALUE(\'<cases><case/></cases>\', \'/cases/person\')\n AS \'No Match Example\',\n EXTRACTVALUE(\'<cases><case/></cases>\', \'count(/cases/person)\')\n AS \'count() Example\';\n+------------------+-----------------+\n| No Match Example | count() Example |\n+------------------+-----------------+\n| | 0|\n+------------------+-----------------+\n\nMatches\n-------\n\nImportant: The EXTRACTVALUE() function only returns CDDATA. It does not return\ntags that the element might contain or the text that these child elements\ncontain.\n\nSELECT\n\nEXTRACTVALUE(\'<cases><case>Person<email>x@example.com</email></case></cases>\',\n\'/cases\')\n AS Case;\n+--------+\n| Case |\n+--------+\n| Person |\n+--------+\n\nNote, in the above example, while the XPath expression matches to the parent\n<case> instance, it does not return the contained <email> tag or its content.\n\nExamples\n--------\n\nSELECT\n ExtractValue(\'<a>ccc<b>ddd</b></a>\', \'/a\') AS val1,\n ExtractValue(\'<a>ccc<b>ddd</b></a>\', \'/a/b\') AS val2,\n ExtractValue(\'<a>ccc<b>ddd</b></a>\', \'//b\') AS val3,\n ExtractValue(\'<a>ccc<b>ddd</b></a>\', \'/b\') AS val4,\n ExtractValue(\'<a>ccc<b>ddd</b><b>eee</b></a>\', \'//b\') AS val5;\n+------+------+------+------+---------+\n| val1 | val2 | val3 | val4 | val5 |\n+------+------+------+------+---------+\n| ccc | ddd | ddd | | ddd eee |\n+------+------+------+------+---------+\n\nURL: https://mariadb.com/kb/en/extractvalue/','','https://mariadb.com/kb/en/extractvalue/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (643,36,'FIELD','Syntax\n------\n\nFIELD(pattern, str1[,str2,...])\n\nDescription\n-----------\n\nReturns the index position of the string or number matching the given pattern.\nReturns 0 in the event that none of the arguments match the pattern. Raises an\nError 1582 if not given at least two arguments.\n\nWhen all arguments given to the FIELD() function are strings, they are treated\nas case-insensitive. When all the arguments are numbers, they are treated as\nnumbers. Otherwise, they are treated as doubles.\n\nIf the given pattern occurs more than once, the FIELD() function only returns\nthe index of the first instance. If the given pattern is NULL, the function\nreturns 0, as a NULL pattern always fails to match.\n\nThis function is complementary to the ELT() function.\n\nExamples\n--------\n\nSELECT FIELD(\'ej\', \'Hej\', \'ej\', \'Heja\', \'hej\', \'foo\') \n AS \'Field Results\';\n+---------------+\n| Field Results | \n+---------------+\n| 2 |\n+---------------+\n\nSELECT FIELD(\'fo\', \'Hej\', \'ej\', \'Heja\', \'hej\', \'foo\')\n AS \'Field Results\';\n+---------------+\n| Field Results | \n+---------------+\n| 0 |\n+---------------+\n\nSELECT FIELD(1, 2, 3, 4, 5, 1) AS \'Field Results\';\n+---------------+\n| Field Results |\n+---------------+\n| 5 |\n+---------------+\n\nSELECT FIELD(NULL, 2, 3) AS \'Field Results\';\n+---------------+\n| Field Results |\n+---------------+\n| 0 |\n+---------------+\n\nSELECT FIELD(\'fail\') AS \'Field Results\';\nError 1582 (42000): Incorrect parameter count in call\nto native function \'field\'\n\nURL: https://mariadb.com/kb/en/field/','','https://mariadb.com/kb/en/field/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (644,36,'FIND_IN_SET','Syntax\n------\n\nFIND_IN_SET(pattern, strlist)\n\nDescription\n-----------\n\nReturns the index position where the given pattern occurs in a string list.\nThe first argument is the pattern you want to search for. The second argument\nis a string containing comma-separated variables. If the second argument is of\nthe SET data-type, the function is optimized to use bit arithmetic.\n\nIf the pattern does not occur in the string list or if the string list is an\nempty string, the function returns 0. If either argument is NULL, the function\nreturns NULL. The function does not return the correct result if the pattern\ncontains a comma (\",\") character.\n\nExamples\n--------\n\nSELECT FIND_IN_SET(\'b\',\'a,b,c,d\') AS \"Found Results\";\n+---------------+\n| Found Results |\n+---------------+\n| 2 |\n+---------------+\n\nURL: https://mariadb.com/kb/en/find_in_set/','','https://mariadb.com/kb/en/find_in_set/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (645,36,'FORMAT','Syntax\n------\n\nFORMAT(num, decimal_position[, locale])\n\nDescription\n-----------\n\nFormats the given number for display as a string, adding separators to\nappropriate position and rounding the results to the given decimal position.\nFor instance, it would format 15233.345 to 15,233.35.\n\nIf the given decimal position is 0, it rounds to return no decimal point or\nfractional part. You can optionally specify a locale value to format numbers\nto the pattern appropriate for the given region.\n\nExamples\n--------\n\nSELECT FORMAT(1234567890.09876543210, 4) AS \'Format\';\n+--------------------+\n| Format |\n+--------------------+\n| 1,234,567,890.0988 |\n+--------------------+\n\nSELECT FORMAT(1234567.89, 4) AS \'Format\';\n+----------------+\n| Format |\n+----------------+\n| 1,234,567.8900 |\n+----------------+\n\nSELECT FORMAT(1234567.89, 0) AS \'Format\';\n+-----------+\n| Format |\n+-----------+\n| 1,234,568 |\n+-----------+\n\nSELECT FORMAT(123456789,2,\'rm_CH\') AS \'Format\';\n+----------------+\n| Format |\n+----------------+\n| 123\'456\'789,00 |\n+----------------+\n\nURL: https://mariadb.com/kb/en/format/','','https://mariadb.com/kb/en/format/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (646,36,'FROM_BASE64','Syntax\n------\n\nFROM_BASE64(str)\n\nDescription\n-----------\n\nDecodes the given base-64 encode string, returning the result as a binary\nstring. Returns NULL if the given string is NULL or if it\'s invalid.\n\nIt is the reverse of the TO_BASE64 function.\n\nThere are numerous methods to base-64 encode a string. MariaDB uses the\nfollowing:\n\n* It encodes alphabet value 64 as \'+\'.\n* It encodes alphabet value 63 as \'/\'.\n* It codes output in groups of four printable characters. Each three byte of\ndata encoded uses four characters. If the final group is incomplete, it pads\nthe difference with the \'=\' character.\n* It divides long output, adding a new line very 76 characters.\n* In decoding, it recognizes and ignores newlines, carriage returns, tabs and\nspace whitespace characters.\n\nSELECT TO_BASE64(\'Maria\') AS \'Input\';\n+-----------+\n| Input |\n+-----------+\n| TWFyaWE= |\n+-----------+\n\nSELECT FROM_BASE64(\'TWFyaWE=\') AS \'Output\';\n+--------+\n| Output |\n+--------+\n| Maria |\n+--------+\n\nURL: https://mariadb.com/kb/en/from_base64/','','https://mariadb.com/kb/en/from_base64/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (647,36,'HEX','Syntax\n------\n\nHEX(N_or_S)\n\nDescription\n-----------\n\nIf N_or_S is a number, returns a string representation of the hexadecimal\nvalue of N, where N is a longlong (BIGINT) number. This is equivalent to\nCONV(N,10,16).\n\nIf N_or_S is a string, returns a hexadecimal string representation of N_or_S\nwhere each byte of each character in N_or_S is converted to two hexadecimal\ndigits. If N_or_S is NULL, returns NULL. The inverse of this operation is\nperformed by the UNHEX() function.\n\nMariaDB starting with 10.5.0\n----------------------------\nHEX() with an INET6 argument returns a hexadecimal representation of the\nunderlying 16-byte binary string.\n\nExamples\n--------\n\nSELECT HEX(255);\n+----------+\n| HEX(255) |\n+----------+\n| FF |\n+----------+\n\nSELECT 0x4D617269614442;\n+------------------+\n| 0x4D617269614442 |\n+------------------+\n| MariaDB |\n+------------------+\n\nSELECT HEX(\'MariaDB\');\n+----------------+\n| HEX(\'MariaDB\') |\n+----------------+\n| 4D617269614442 |\n+----------------+\n\nFrom MariaDB 10.5.0:\n\nSELECT HEX(CAST(\'2001:db8::ff00:42:8329\' AS INET6));\n+----------------------------------------------+\n| HEX(CAST(\'2001:db8::ff00:42:8329\' AS INET6)) |\n+----------------------------------------------+\n| 20010DB8000000000000FF0000428329 |\n+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/hex/','','https://mariadb.com/kb/en/hex/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (648,36,'INSTR','Syntax\n------\n\nINSTR(str,substr)\n\nDescription\n-----------\n\nReturns the position of the first occurrence of substring substr in string\nstr. This is the same as the two-argument form of LOCATE(), except that the\norder of the arguments is reversed.\n\nINSTR() performs a case-insensitive search.\n\nIf any argument is NULL, returns NULL.\n\nExamples\n--------\n\nSELECT INSTR(\'foobarbar\', \'bar\');\n+---------------------------+\n| INSTR(\'foobarbar\', \'bar\') |\n+---------------------------+\n| 4 |\n+---------------------------+\n\nSELECT INSTR(\'My\', \'Maria\');\n+----------------------+\n| INSTR(\'My\', \'Maria\') |\n+----------------------+\n| 0 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/instr/','','https://mariadb.com/kb/en/instr/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (649,36,'LCASE','Syntax\n------\n\nLCASE(str)\n\nDescription\n-----------\n\nLCASE() is a synonym for LOWER().\n\nURL: https://mariadb.com/kb/en/lcase/','','https://mariadb.com/kb/en/lcase/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (650,36,'LEFT','Syntax\n------\n\nLEFT(str,len)\n\nDescription\n-----------\n\nReturns the leftmost len characters from the string str, or NULL if any\nargument is NULL.\n\nExamples\n--------\n\nSELECT LEFT(\'MariaDB\', 5);\n+--------------------+\n| LEFT(\'MariaDB\', 5) |\n+--------------------+\n| Maria |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/left/','','https://mariadb.com/kb/en/left/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (651,36,'INSERT Function','Syntax\n------\n\nINSERT(str,pos,len,newstr)\n\nDescription\n-----------\n\nReturns the string str, with the substring beginning at position pos and len\ncharacters long replaced by the string newstr. Returns the original string if\npos is not within the length of the string. Replaces the rest of the string\nfrom position pos if len is not within the length of the rest of the string.\nReturns NULL if any argument is NULL.\n\nExamples\n--------\n\nSELECT INSERT(\'Quadratic\', 3, 4, \'What\');\n+-----------------------------------+\n| INSERT(\'Quadratic\', 3, 4, \'What\') |\n+-----------------------------------+\n| QuWhattic |\n+-----------------------------------+\n\nSELECT INSERT(\'Quadratic\', -1, 4, \'What\');\n+------------------------------------+\n| INSERT(\'Quadratic\', -1, 4, \'What\') |\n+------------------------------------+\n| Quadratic |\n+------------------------------------+\n\nSELECT INSERT(\'Quadratic\', 3, 100, \'What\');\n+-------------------------------------+\n| INSERT(\'Quadratic\', 3, 100, \'What\') |\n+-------------------------------------+\n| QuWhat |\n+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/insert-function/','','https://mariadb.com/kb/en/insert-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (652,36,'LENGTH','Syntax\n------\n\nLENGTH(str)\n\nDescription\n-----------\n\nReturns the length of the string str.\n\nIn the default mode, when Oracle mode from MariaDB 10.3 is not set, the length\nis measured in bytes. In this case, a multi-byte character counts as multiple\nbytes. This means that for a string containing five two-byte characters,\nLENGTH() returns 10, whereas CHAR_LENGTH() returns 5.\n\nWhen running Oracle mode from MariaDB 10.3, the length is measured in\ncharacters, and LENGTH is a synonym for CHAR_LENGTH().\n\nIf str is not a string value, it is converted into a string. If str is NULL,\nthe function returns NULL.\n\nExamples\n--------\n\nSELECT LENGTH(\'MariaDB\');\n+-------------------+\n| LENGTH(\'MariaDB\') |\n+-------------------+\n| 7 |\n+-------------------+\n\nWhen Oracle mode from MariaDB 10.3 is not set:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 2 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nIn Oracle mode from MariaDB 10.3:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 1 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nURL: https://mariadb.com/kb/en/length/','','https://mariadb.com/kb/en/length/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (653,36,'LENGTHB','MariaDB starting with 10.3.1\n----------------------------\nIntroduced in MariaDB 10.3.1 as part of the Oracle compatibility enhancements.\n\nSyntax\n------\n\nLENGTHB(str)\n\nDescription\n-----------\n\nLENGTHB() returns the length of the given string, in bytes. When Oracle mode\nis not set, this is a synonym for LENGTH.\n\nA multi-byte character counts as multiple bytes. This means that for a string\ncontaining five two-byte characters, LENGTHB() returns 10, whereas\nCHAR_LENGTH() returns 5.\n\nIf str is not a string value, it is converted into a string. If str is NULL,\nthe function returns NULL.\n\nExamples\n--------\n\nWhen Oracle mode from MariaDB 10.3 is not set:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 2 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nIn Oracle mode from MariaDB 10.3:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 1 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nURL: https://mariadb.com/kb/en/lengthb/','','https://mariadb.com/kb/en/lengthb/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (654,36,'LIKE','Syntax\n------\n\nexpr LIKE pat [ESCAPE \'escape_char\']\nexpr NOT LIKE pat [ESCAPE \'escape_char\']\n\nDescription\n-----------\n\nTests whether expr matches the pattern pat. Returns either 1 (TRUE) or 0\n(FALSE). Both expr and pat may be any valid expression and are evaluated to\nstrings. Patterns may use the following wildcard characters:\n\n* % matches any number of characters, including zero.\n* _ matches any single character.\n\nUse NOT LIKE to test if a string does not match a pattern. This is equivalent\nto using the NOT operator on the entire LIKE expression.\n\nIf either the expression or the pattern is NULL, the result is NULL.\n\nLIKE performs case-insensitive substring matches if the collation for the\nexpression and pattern is case-insensitive. For case-sensitive matches,\ndeclare either argument to use a binary collation using COLLATE, or coerce\neither of them to a BINARY string using CAST. Use SHOW COLLATION to get a list\nof available collations. Collations ending in _bin are case-sensitive.\n\nNumeric arguments are coerced to binary strings.\n\nThe _ wildcard matches a single character, not byte. It will only match a\nmulti-byte character if it is valid in the expression\'s character set. For\nexample, _ will match _utf8\"€\", but it will not match _latin1\"€\" because the\nEuro sign is not a valid latin1 character. If necessary, use CONVERT to use\nthe expression in a different character set.\n\nIf you need to match the characters _ or %, you must escape them. By default,\nyou can prefix the wildcard characters the backslash character \\ to escape\nthem. The backslash is used both to encode special characters like newlines\nwhen a string is parsed as well as to escape wildcards in a pattern after\nparsing. Thus, to match an actual backslash, you sometimes need to\ndouble-escape it as \"\\\\\\\\\".\n\nTo avoid difficulties with the backslash character, you can change the\nwildcard escape character using ESCAPE in a LIKE expression. The argument to\nESCAPE must be a single-character string.\n\nExamples\n--------\n\nSelect the days that begin with \"T\":\n\nCREATE TABLE t1 (d VARCHAR(16));\nINSERT INTO t1 VALUES \n (\"Monday\"), (\"Tuesday\"), (\"Wednesday\"),\n (\"Thursday\"), (\"Friday\"), (\"Saturday\"), (\"Sunday\");\nSELECT * FROM t1 WHERE d LIKE \"T%\";\n\nSELECT * FROM t1 WHERE d LIKE \"T%\";\n+----------+\n| d |\n+----------+\n| Tuesday |\n| Thursday |\n+----------+\n\nSelect the days that contain the substring \"es\":\n\nSELECT * FROM t1 WHERE d LIKE \"%es%\";\n\nSELECT * FROM t1 WHERE d LIKE \"%es%\";\n+-----------+\n| d |\n+-----------+\n| Tuesday |\n| Wednesday |\n+-----------+\n\nSelect the six-character day names:\n\nSELECT * FROM t1 WHERE d like \"___day\";\n\nSELECT * FROM t1 WHERE d like \"___day\";\n+---------+\n| d |\n+---------+\n| Monday |\n| Friday |\n| Sunday |\n+---------+\n\nWith the default collations, LIKE is case-insensitive:\n\nSELECT * FROM t1 where d like \"t%\";\n\nSELECT * FROM t1 where d like \"t%\";\n+----------+\n| d |\n+----------+\n| Tuesday |\n| Thursday |\n+----------+\n\nUse COLLATE to specify a binary collation, forcing case-sensitive matches:\n\nSELECT * FROM t1 WHERE d like \"t%\" COLLATE latin1_bin;\n\nSELECT * FROM t1 WHERE d like \"t%\" COLLATE latin1_bin;\nEmpty set (0.00 sec)\n\nYou can include functions and operators in the expression to match. Select\ndates based on their day name:\n\nCREATE TABLE t2 (d DATETIME);\nINSERT INTO t2 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\nSELECT * FROM t2 WHERE DAYNAME(d) LIKE \"T%\";\n\nSELECT * FROM t2 WHERE DAYNAME(d) LIKE \"T%\";\n+------------------+\n| d |\n+------------------+\n| 2007-01-30 21:31 |\n| 2011-04-21 12:34 |\n| 2004-10-07 11:19 |\n+------------------+\n3 rows in set, 7 warnings (0.00 sec)\n\nOptimizing LIKE\n---------------\n\n* MariaDB can use indexes for LIKE on string columns in the case where the\nLIKE doesn\'t start with % or _.\n* Starting from MariaDB 10.0, one can set the\noptimizer_use_condition_selectivity variable to 5. If this is done, then the\noptimizer will read optimizer_selectivity_sampling_limit rows to calculate the\nselectivity of the LIKE expression before starting to calculate the query\nplan. This can help speed up some LIKE queries by providing the optimizer with\nmore information about your data.\n\nURL: https://mariadb.com/kb/en/like/','','https://mariadb.com/kb/en/like/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (655,36,'LOCATE','Syntax\n------\n\nLOCATE(substr,str), LOCATE(substr,str,pos)\n\nDescription\n-----------\n\nThe first syntax returns the position of the first occurrence of substring\nsubstr in string str. The second syntax returns the position of the first\noccurrence of substring substr in string str, starting at position pos.\nReturns 0 if substr is not in str.\n\nLOCATE() performs a case-insensitive search.\n\nIf any argument is NULL, returns NULL.\n\nINSTR() is the same as the two-argument form of LOCATE(), except that the\norder of the arguments is reversed.\n\nExamples\n--------\n\nSELECT LOCATE(\'bar\', \'foobarbar\');\n+----------------------------+\n| LOCATE(\'bar\', \'foobarbar\') |\n+----------------------------+\n| 4 |\n+----------------------------+\n\nSELECT LOCATE(\'My\', \'Maria\');\n+-----------------------+\n| LOCATE(\'My\', \'Maria\') |\n+-----------------------+\n| 0 |\n+-----------------------+\n\nSELECT LOCATE(\'bar\', \'foobarbar\', 5);\n+-------------------------------+\n| LOCATE(\'bar\', \'foobarbar\', 5) |\n+-------------------------------+\n| 7 |\n+-------------------------------+\n\nURL: https://mariadb.com/kb/en/locate/','','https://mariadb.com/kb/en/locate/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (656,36,'LOWER','Syntax\n------\n\nLOWER(str)\n\nDescription\n-----------\n\nReturns the string str with all characters changed to lowercase according to\nthe current character set mapping. The default is latin1 (cp1252 West\nEuropean).\n\nExamples\n--------\n\nSELECT LOWER(\'QUADRATICALLY\');\n+------------------------+\n| LOWER(\'QUADRATICALLY\') |\n+------------------------+\n| quadratically |\n+------------------------+\n\nLOWER() (and UPPER()) are ineffective when applied to binary strings (BINARY,\nVARBINARY, BLOB). To perform lettercase conversion, CONVERT the string to a\nnon-binary string:\n\nSET @str = BINARY \'North Carolina\';\n\nSELECT LOWER(@str), LOWER(CONVERT(@str USING latin1));\n+----------------+-----------------------------------+\n| LOWER(@str) | LOWER(CONVERT(@str USING latin1)) |\n+----------------+-----------------------------------+\n| North Carolina | north carolina |\n+----------------+-----------------------------------+\n\nURL: https://mariadb.com/kb/en/lower/','','https://mariadb.com/kb/en/lower/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (657,36,'LPAD','Syntax\n------\n\nLPAD(str, len [,padstr])\n\nDescription\n-----------\n\nReturns the string str, left-padded with the string padstr to a length of len\ncharacters. If str is longer than len, the return value is shortened to len\ncharacters. If padstr is omitted, the LPAD function pads spaces.\n\nPrior to MariaDB 10.3.1, the padstr parameter was mandatory.\n\nReturns NULL if given a NULL argument. If the result is empty (zero length),\nreturns either an empty string or, from MariaDB 10.3.6 with SQL_MODE=Oracle,\nNULL.\n\nThe Oracle mode version of the function can be accessed outside of Oracle mode\nby using LPAD_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT LPAD(\'hello\',10,\'.\');\n+----------------------+\n| LPAD(\'hello\',10,\'.\') |\n+----------------------+\n| .....hello |\n+----------------------+\n\nSELECT LPAD(\'hello\',2,\'.\');\n+---------------------+\n| LPAD(\'hello\',2,\'.\') |\n+---------------------+\n| he |\n+---------------------+\n\nFrom MariaDB 10.3.1, with the pad string defaulting to space.\n\nSELECT LPAD(\'hello\',10);\n+------------------+\n| LPAD(\'hello\',10) |\n+------------------+\n| hello |\n+------------------+\n\nOracle mode version from MariaDB 10.3.6:\n\nSELECT LPAD(\'\',0),LPAD_ORACLE(\'\',0);\n+------------+-------------------+\n| LPAD(\'\',0) | LPAD_ORACLE(\'\',0) |\n+------------+-------------------+\n| | NULL |\n+------------+-------------------+\n\nURL: https://mariadb.com/kb/en/lpad/','','https://mariadb.com/kb/en/lpad/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (658,36,'LTRIM','Syntax\n------\n\nLTRIM(str)\n\nDescription\n-----------\n\nReturns the string str with leading space characters removed.\n\nReturns NULL if given a NULL argument. If the result is empty, returns either\nan empty string, or, from MariaDB 10.3.6 with SQL_MODE=Oracle, NULL.\n\nThe Oracle mode version of the function can be accessed outside of Oracle mode\nby using LTRIM_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT QUOTE(LTRIM(\' MariaDB \'));\n+-------------------------------+\n| QUOTE(LTRIM(\' MariaDB \')) |\n+-------------------------------+\n| \'MariaDB \' |\n+-------------------------------+\n\nOracle mode version from MariaDB 10.3.6:\n\nSELECT LTRIM(\'\'),LTRIM_ORACLE(\'\');\n+-----------+------------------+\n| LTRIM(\'\') | LTRIM_ORACLE(\'\') |\n+-----------+------------------+\n| | NULL |\n+-----------+------------------+\n\nURL: https://mariadb.com/kb/en/ltrim/','','https://mariadb.com/kb/en/ltrim/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (659,36,'MAKE_SET','Syntax\n------\n\nMAKE_SET(bits,str1,str2,...)\n\nDescription\n-----------\n\nReturns a set value (a string containing substrings separated by \",\"\ncharacters) consisting of the strings that have the corresponding bit in bits\nset. str1 corresponds to bit 0, str2 to bit 1, and so on. NULL values in str1,\nstr2, ... are not appended to the result.\n\nExamples\n--------\n\nSELECT MAKE_SET(1,\'a\',\'b\',\'c\');\n+-------------------------+\n| MAKE_SET(1,\'a\',\'b\',\'c\') |\n+-------------------------+\n| a |\n+-------------------------+\n\nSELECT MAKE_SET(1 | 4,\'hello\',\'nice\',\'world\');\n+----------------------------------------+\n| MAKE_SET(1 | 4,\'hello\',\'nice\',\'world\') |\n+----------------------------------------+\n| hello,world |\n+----------------------------------------+\n\nSELECT MAKE_SET(1 | 4,\'hello\',\'nice\',NULL,\'world\');\n+---------------------------------------------+\n| MAKE_SET(1 | 4,\'hello\',\'nice\',NULL,\'world\') |\n+---------------------------------------------+\n| hello |\n+---------------------------------------------+\n\nSELECT QUOTE(MAKE_SET(0,\'a\',\'b\',\'c\'));\n+--------------------------------+\n| QUOTE(MAKE_SET(0,\'a\',\'b\',\'c\')) |\n+--------------------------------+\n| \'\' |\n+--------------------------------+\n\nURL: https://mariadb.com/kb/en/make_set/','','https://mariadb.com/kb/en/make_set/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (660,36,'MATCH AGAINST','Syntax\n------\n\nMATCH (col1,col2,...) AGAINST (expr [search_modifier])\n\nDescription\n-----------\n\nA special construct used to perform a fulltext search on a fulltext index.\n\nSee Fulltext Index Overview for a full description, and Full-text Indexes for\nmore articles on the topic.\n\nExamples\n--------\n\nCREATE TABLE ft_myisam(copy TEXT,FULLTEXT(copy)) ENGINE=MyISAM;\n\nINSERT INTO ft_myisam(copy) VALUES (\'Once upon a time\'), (\'There was a wicked\nwitch\'), \n (\'Who ate everybody up\');\n\nSELECT * FROM ft_myisam WHERE MATCH(copy) AGAINST(\'wicked\');\n+--------------------------+\n| copy |\n+--------------------------+\n| There was a wicked witch |\n+--------------------------+\n\nSELECT id, body, MATCH (title,body) AGAINST\n (\'Security implications of running MySQL as root\'\n IN NATURAL LANGUAGE MODE) AS score\n FROM articles WHERE MATCH (title,body) AGAINST\n (\'Security implications of running MySQL as root\'\n IN NATURAL LANGUAGE MODE);\n+----+-------------------------------------+-----------------+\n| id | body | score |\n+----+-------------------------------------+-----------------+\n| 4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |\n| 6 | When configured properly, MySQL ... | 1.3114095926285 |\n+----+-------------------------------------+-----------------+\n\nURL: https://mariadb.com/kb/en/match-against/','','https://mariadb.com/kb/en/match-against/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (661,36,'MID','Syntax\n------\n\nMID(str,pos,len)\n\nDescription\n-----------\n\nMID(str,pos,len) is a synonym for SUBSTRING(str,pos,len).\n\nExamples\n--------\n\nSELECT MID(\'abcd\',4,1);\n+-----------------+\n| MID(\'abcd\',4,1) |\n+-----------------+\n| d |\n+-----------------+\n\nSELECT MID(\'abcd\',2,2);\n+-----------------+\n| MID(\'abcd\',2,2) |\n+-----------------+\n| bc |\n+-----------------+\n\nA negative starting position:\n\nSELECT MID(\'abcd\',-2,4);\n+------------------+\n| MID(\'abcd\',-2,4) |\n+------------------+\n| cd |\n+------------------+\n\nURL: https://mariadb.com/kb/en/mid/','','https://mariadb.com/kb/en/mid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (662,36,'NOT LIKE','Syntax\n------\n\nexpr NOT LIKE pat [ESCAPE \'escape_char\']\n\nDescription\n-----------\n\nThis is the same as NOT (expr LIKE pat [ESCAPE \'escape_char\']).\n\nURL: https://mariadb.com/kb/en/not-like/','','https://mariadb.com/kb/en/not-like/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (663,36,'OCTET_LENGTH','Syntax\n------\n\nOCTET_LENGTH(str)\n\nDescription\n-----------\n\nOCTET_LENGTH() returns the length of the given string, in octets (bytes). This\nis a synonym for LENGTHB(), and, when Oracle mode from MariaDB 10.3 is not\nset, a synonym for LENGTH().\n\nA multi-byte character counts as multiple bytes. This means that for a string\ncontaining five two-byte characters, OCTET_LENGTH() returns 10, whereas\nCHAR_LENGTH() returns 5.\n\nIf str is not a string value, it is converted into a string. If str is NULL,\nthe function returns NULL.\n\nExamples\n--------\n\nWhen Oracle mode from MariaDB 10.3 is not set:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 2 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nIn Oracle mode from MariaDB 10.3:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 1 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nURL: https://mariadb.com/kb/en/octet_length/','','https://mariadb.com/kb/en/octet_length/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (664,36,'ORD','Syntax\n------\n\nORD(str)\n\nDescription\n-----------\n\nIf the leftmost character of the string str is a multi-byte character, returns\nthe code for that character, calculated from the numeric values of its\nconstituent bytes using this formula:\n\n(1st byte code)\n+ (2nd byte code x 256)\n+ (3rd byte code x 256 x 256) ...\n\nIf the leftmost character is not a multi-byte character, ORD() returns the\nsame value as the ASCII() function.\n\nExamples\n--------\n\nSELECT ORD(\'2\');\n+----------+\n| ORD(\'2\') |\n+----------+\n| 50 |\n+----------+\n\nURL: https://mariadb.com/kb/en/ord/','','https://mariadb.com/kb/en/ord/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (665,36,'POSITION','Syntax\n------\n\nPOSITION(substr IN str)\n\nDescription\n-----------\n\nPOSITION(substr IN str) is a synonym for LOCATE(substr,str).\n\nIt\'s part of ODBC 3.0.\n\nURL: https://mariadb.com/kb/en/position/','','https://mariadb.com/kb/en/position/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (666,36,'QUOTE','Syntax\n------\n\nQUOTE(str)\n\nDescription\n-----------\n\nQuotes a string to produce a result that can be used as a properly escaped\ndata value in an SQL statement. The string is returned enclosed by single\nquotes and with each instance of single quote (\"\'\"), backslash (\"\\\"), ASCII\nNUL, and Control-Z preceded by a backslash. If the argument is NULL, the\nreturn value is the word \"NULL\" without enclosing single quotes.\n\nExamples\n--------\n\nSELECT QUOTE(\"Don\'t!\");\n+-----------------+\n| QUOTE(\"Don\'t!\") |\n+-----------------+\n| \'Don\\\'t!\' |\n+-----------------+\n\nSELECT QUOTE(NULL); \n+-------------+\n| QUOTE(NULL) |\n+-------------+\n| NULL |\n+-------------+\n\nURL: https://mariadb.com/kb/en/quote/','','https://mariadb.com/kb/en/quote/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (667,36,'REPEAT Function','Syntax\n------\n\nREPEAT(str,count)\n\nDescription\n-----------\n\nReturns a string consisting of the string str repeated count times. If count\nis less than 1, returns an empty string. Returns NULL if str or count are NULL.\n\nExamples\n--------\n\nSELECT QUOTE(REPEAT(\'MariaDB \',4));\n+------------------------------------+\n| QUOTE(REPEAT(\'MariaDB \',4)) |\n+------------------------------------+\n| \'MariaDB MariaDB MariaDB MariaDB \' |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/repeat-function/','','https://mariadb.com/kb/en/repeat-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (668,36,'REPLACE Function','Syntax\n------\n\nREPLACE(str,from_str,to_str)\n\nDescription\n-----------\n\nReturns the string str with all occurrences of the string from_str replaced by\nthe string to_str. REPLACE() performs a case-sensitive match when searching\nfor from_str.\n\nExamples\n--------\n\nSELECT REPLACE(\'www.mariadb.org\', \'w\', \'Ww\');\n+---------------------------------------+\n| REPLACE(\'www.mariadb.org\', \'w\', \'Ww\') |\n+---------------------------------------+\n| WwWwWw.mariadb.org |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/replace-function/','','https://mariadb.com/kb/en/replace-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (669,36,'REVERSE','Syntax\n------\n\nREVERSE(str)\n\nDescription\n-----------\n\nReturns the string str with the order of the characters reversed.\n\nExamples\n--------\n\nSELECT REVERSE(\'desserts\');\n+---------------------+\n| REVERSE(\'desserts\') |\n+---------------------+\n| stressed |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/reverse/','','https://mariadb.com/kb/en/reverse/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (670,36,'RIGHT','Syntax\n------\n\nRIGHT(str,len)\n\nDescription\n-----------\n\nReturns the rightmost len characters from the string str, or NULL if any\nargument is NULL.\n\nExamples\n--------\n\nSELECT RIGHT(\'MariaDB\', 2);\n+---------------------+\n| RIGHT(\'MariaDB\', 2) |\n+---------------------+\n| DB |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/right/','','https://mariadb.com/kb/en/right/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (671,36,'RPAD','Syntax\n------\n\nRPAD(str, len [, padstr])\n\nDescription\n-----------\n\nReturns the string str, right-padded with the string padstr to a length of len\ncharacters. If str is longer than len, the return value is shortened to len\ncharacters. If padstr is omitted, the RPAD function pads spaces.\n\nPrior to MariaDB 10.3.1, the padstr parameter was mandatory.\n\nReturns NULL if given a NULL argument. If the result is empty (a length of\nzero), returns either an empty string, or, from MariaDB 10.3.6 with\nSQL_MODE=Oracle, NULL.\n\nThe Oracle mode version of the function can be accessed outside of Oracle mode\nby using RPAD_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT RPAD(\'hello\',10,\'.\');\n+----------------------+\n| RPAD(\'hello\',10,\'.\') |\n+----------------------+\n| hello..... |\n+----------------------+\n\nSELECT RPAD(\'hello\',2,\'.\');\n+---------------------+\n| RPAD(\'hello\',2,\'.\') |\n+---------------------+\n| he |\n+---------------------+\n\nFrom MariaDB 10.3.1, with the pad string defaulting to space.\n\nSELECT RPAD(\'hello\',30);\n+--------------------------------+\n| RPAD(\'hello\',30) |\n+--------------------------------+\n| hello |\n+--------------------------------+\n\nOracle mode version from MariaDB 10.3.6:\n\nSELECT RPAD(\'\',0),RPAD_ORACLE(\'\',0);\n+------------+-------------------+\n| RPAD(\'\',0) | RPAD_ORACLE(\'\',0) |\n+------------+-------------------+\n| | NULL |\n+------------+-------------------+\n\nURL: https://mariadb.com/kb/en/rpad/','','https://mariadb.com/kb/en/rpad/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (672,36,'RTRIM','Syntax\n------\n\nRTRIM(str)\n\nDescription\n-----------\n\nReturns the string str with trailing space characters removed.\n\nReturns NULL if given a NULL argument. If the result is empty, returns either\nan empty string, or, from MariaDB 10.3.6 with SQL_MODE=Oracle, NULL.\n\nThe Oracle mode version of the function can be accessed outside of Oracle mode\nby using RTRIM_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT QUOTE(RTRIM(\'MariaDB \'));\n+-----------------------------+\n| QUOTE(RTRIM(\'MariaDB \')) |\n+-----------------------------+\n| \'MariaDB\' |\n+-----------------------------+\n\nOracle mode version from MariaDB 10.3.6:\n\nSELECT RTRIM(\'\'),RTRIM_ORACLE(\'\');\n+-----------+------------------+\n| RTRIM(\'\') | RTRIM_ORACLE(\'\') |\n+-----------+------------------+\n| | NULL |\n+-----------+------------------+\n\nURL: https://mariadb.com/kb/en/rtrim/','','https://mariadb.com/kb/en/rtrim/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (673,36,'SOUNDEX','Syntax\n------\n\nSOUNDEX(str)\n\nDescription\n-----------\n\nReturns a soundex string from str. Two strings that sound almost the same\nshould have identical soundex strings. A standard soundex string is four\ncharacters long, but the SOUNDEX() function returns an arbitrarily long\nstring. You can use SUBSTRING() on the result to get a standard soundex\nstring. All non-alphabetic characters in str are ignored. All international\nalphabetic characters outside the A-Z range are treated as vowels.\n\nImportant: When using SOUNDEX(), you should be aware of the following details:\n\n* This function, as currently implemented, is intended to work well with\n strings that are in the English language only. Strings in other languages may\n not produce reasonable results.\n\n* This function implements the original Soundex algorithm, not the more\npopular enhanced version (also described by D. Knuth). The difference is that\noriginal version discards vowels first and duplicates second, whereas the\nenhanced version discards duplicates first and vowels second.\n\nExamples\n--------\n\nSOUNDEX(\'Hello\');\n+------------------+\n| SOUNDEX(\'Hello\') |\n+------------------+\n| H400 |\n+------------------+\n\nSELECT SOUNDEX(\'MariaDB\');\n+--------------------+\n| SOUNDEX(\'MariaDB\') |\n+--------------------+\n| M631 |\n+--------------------+\n\nSELECT SOUNDEX(\'Knowledgebase\');\n+--------------------------+\n| SOUNDEX(\'Knowledgebase\') |\n+--------------------------+\n| K543212 |\n+--------------------------+\n\nSELECT givenname, surname FROM users WHERE SOUNDEX(givenname) =\nSOUNDEX(\"robert\");\n+-----------+---------+\n| givenname | surname |\n+-----------+---------+\n| Roberto | Castro |\n+-----------+---------+\n\nURL: https://mariadb.com/kb/en/soundex/','','https://mariadb.com/kb/en/soundex/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (674,36,'SOUNDS LIKE','Syntax\n------\n\nexpr1 SOUNDS LIKE expr2\n\nDescription\n-----------\n\nThis is the same as SOUNDEX(expr1) = SOUNDEX(expr2).\n\nExample\n-------\n\nSELECT givenname, surname FROM users WHERE givenname SOUNDS LIKE \"robert\";\n+-----------+---------+\n| givenname | surname |\n+-----------+---------+\n| Roberto | Castro |\n+-----------+---------+\n\nURL: https://mariadb.com/kb/en/sounds-like/','','https://mariadb.com/kb/en/sounds-like/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (675,36,'SPACE','Syntax\n------\n\nSPACE(N)\n\nDescription\n-----------\n\nReturns a string consisting of N space characters. If N is NULL, returns NULL.\n\nExamples\n--------\n\nSELECT QUOTE(SPACE(6));\n+-----------------+\n| QUOTE(SPACE(6)) |\n+-----------------+\n| \' \' |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/space/','','https://mariadb.com/kb/en/space/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (676,36,'STRCMP','Syntax\n------\n\nSTRCMP(expr1,expr2)\n\nDescription\n-----------\n\nSTRCMP() returns 0 if the strings are the same, -1 if the first argument is\nsmaller than the second according to the current sort order, and 1 if the\nstrings are otherwise not the same. Returns NULL is either argument is NULL.\n\nExamples\n--------\n\nSELECT STRCMP(\'text\', \'text2\');\n+-------------------------+\n| STRCMP(\'text\', \'text2\') |\n+-------------------------+\n| -1 |\n+-------------------------+\n\nSELECT STRCMP(\'text2\', \'text\');\n+-------------------------+\n| STRCMP(\'text2\', \'text\') |\n+-------------------------+\n| 1 |\n+-------------------------+\n\nSELECT STRCMP(\'text\', \'text\');\n+------------------------+\n| STRCMP(\'text\', \'text\') |\n+------------------------+\n| 0 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/strcmp/','','https://mariadb.com/kb/en/strcmp/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (677,36,'SUBSTR','Description\n-----------\n\nSUBSTR() is a synonym for SUBSTRING().\n\nURL: https://mariadb.com/kb/en/substr/','','https://mariadb.com/kb/en/substr/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (678,36,'SUBSTRING','Syntax\n------\n\nSUBSTRING(str,pos), \nSUBSTRING(str FROM pos), \nSUBSTRING(str,pos,len),\nSUBSTRING(str FROM pos FOR len)\n\nSUBSTR(str,pos), \nSUBSTR(str FROM pos), \nSUBSTR(str,pos,len),\nSUBSTR(str FROM pos FOR len)\n\nDescription\n-----------\n\nThe forms without a len argument return a substring from string str starting\nat position pos.\n\nThe forms with a len argument return a substring len characters long from\nstring str, starting at position pos.\n\nThe forms that use FROM are standard SQL syntax.\n\nIt is also possible to use a negative value for pos. In this case, the\nbeginning of the substring is pos characters from the end of the string,\nrather than the beginning. A negative value may be used for pos in any of the\nforms of this function.\n\nBy default, the position of the first character in the string from which the\nsubstring is to be extracted is reckoned as 1. For Oracle-compatibility, from\nMariaDB 10.3.3, when sql_mode is set to \'oracle\', position zero is treated as\nposition 1 (although the first character is still reckoned as 1).\n\nIf any argument is NULL, returns NULL.\n\nExamples\n--------\n\nSELECT SUBSTRING(\'Knowledgebase\',5);\n+------------------------------+\n| SUBSTRING(\'Knowledgebase\',5) |\n+------------------------------+\n| ledgebase |\n+------------------------------+\n\nSELECT SUBSTRING(\'MariaDB\' FROM 6);\n+-----------------------------+\n| SUBSTRING(\'MariaDB\' FROM 6) |\n+-----------------------------+\n| DB |\n+-----------------------------+\n\nSELECT SUBSTRING(\'Knowledgebase\',3,7);\n+--------------------------------+\n| SUBSTRING(\'Knowledgebase\',3,7) |\n+--------------------------------+\n| owledge |\n+--------------------------------+\n\nSELECT SUBSTRING(\'Knowledgebase\', -4);\n+--------------------------------+\n| SUBSTRING(\'Knowledgebase\', -4) |\n+--------------------------------+\n| base |\n+--------------------------------+\n\nSELECT SUBSTRING(\'Knowledgebase\', -8, 4);\n+-----------------------------------+\n| SUBSTRING(\'Knowledgebase\', -8, 4) |\n+-----------------------------------+\n| edge |\n+-----------------------------------+\n\nSELECT SUBSTRING(\'Knowledgebase\' FROM -8 FOR 4);\n+------------------------------------------+\n| SUBSTRING(\'Knowledgebase\' FROM -8 FOR 4) |\n+------------------------------------------+\n| edge |\n+------------------------------------------+\n\nOracle mode from MariaDB 10.3.3:\n\nSELECT SUBSTR(\'abc\',0,3);\n+-------------------+\n| SUBSTR(\'abc\',0,3) |\n+-------------------+\n| |\n+-------------------+\n\nSELECT SUBSTR(\'abc\',1,2);\n+-------------------+\n| SUBSTR(\'abc\',1,2) |\n+-------------------+\n| ab |\n+-------------------+\n\nSET sql_mode=\'oracle\';\n\nSELECT SUBSTR(\'abc\',0,3);\n+-------------------+\n| SUBSTR(\'abc\',0,3) |\n+-------------------+\n| abc |\n+-------------------+\n\nSELECT SUBSTR(\'abc\',1,2);\n+-------------------+\n| SUBSTR(\'abc\',1,2) |\n+-------------------+\n| ab |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/substring/','','https://mariadb.com/kb/en/substring/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (679,36,'SUBSTRING_INDEX','Syntax\n------\n\nSUBSTRING_INDEX(str,delim,count)\n\nDescription\n-----------\n\nReturns the substring from string str before count occurrences of the\ndelimiter delim. If count is positive, everything to the left of the final\ndelimiter (counting from the left) is returned. If count is negative,\neverything to the right of the final delimiter (counting from the right) is\nreturned. SUBSTRING_INDEX() performs a case-sensitive match when searching for\ndelim.\n\nIf any argument is NULL, returns NULL.\n\nFor example\n\nSUBSTRING_INDEX(\'www.mariadb.org\', \'.\', 2)\n\nmeans \"Return all of the characters up to the 2nd occurrence of .\"\n\nExamples\n--------\n\nSELECT SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', 2);\n+--------------------------------------------+\n| SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', 2) |\n+--------------------------------------------+\n| www.mariadb |\n+--------------------------------------------+\n\nSELECT SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', -2);\n+---------------------------------------------+\n| SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', -2) |\n+---------------------------------------------+\n| mariadb.org |\n+---------------------------------------------+\n\nURL: https://mariadb.com/kb/en/substring_index/','','https://mariadb.com/kb/en/substring_index/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (680,36,'TO_BASE64','Syntax\n------\n\nTO_BASE64(str)\n\nDescription\n-----------\n\nConverts the string argument str to its base-64 encoded form, returning the\nresult as a character string in the connection character set and collation.\n\nThe argument str will be converted to string first if it is not a string. A\nNULL argument will return a NULL result.\n\nThe reverse function, FROM_BASE64(), decodes an encoded base-64 string.\n\nThere are a numerous different methods to base-64 encode a string. The\nfollowing are used by MariaDB and MySQL:\n\n* Alphabet value 64 is encoded as \'+\'.\n* Alphabet value 63 is encoded as \'/\'.\n* Encoding output is made up of groups of four printable characters, with each\nthree bytes of data encoded using four characters. If the final group is not\ncomplete, it is padded with \'=\' characters to make up a length of four.\n* To divide long output, a newline is added after every 76 characters.\n* Decoding will recognize and ignore newlines, carriage returns, tabs, and\nspaces.\n\nExamples\n--------\n\nSELECT TO_BASE64(\'Maria\');\n+--------------------+\n| TO_BASE64(\'Maria\') |\n+--------------------+\n| TWFyaWE= |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/to_base64/','','https://mariadb.com/kb/en/to_base64/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (681,36,'TO_CHAR','MariaDB starting with 10.6.1\n----------------------------\nThe TO_CHAR function was introduced in MariaDB 10.6.1 to enhance Oracle\ncompatibility.\n\nSyntax\n------\n\nTO_CHAR(expr[, fmt])\n\nDescription\n-----------\n\nThe TO_CHAR function converts an expr of type date, datetime, time or\ntimestamp to a string. The optional fmt argument supports\nYYYY/YYY/YY/RRRR/RR/MM/MON/MONTH/MI/DD/DY/HH/HH12/HH24/SS and special\ncharacters. The default value is \"YYYY-MM-DD HH24:MI:SS\".\n\nIn Oracle, TO_CHAR can also be used to convert numbers to strings, but this is\nnot supported in MariaDB and will give an error.\n\nExamples\n--------\n\nSELECT TO_CHAR(\'1980-01-11 04:50:39\', \'YYYY-MM-DD\');\n+----------------------------------------------+\n| TO_CHAR(\'1980-01-11 04:50:39\', \'YYYY-MM-DD\') |\n+----------------------------------------------+\n| 1980-01-11 |\n+----------------------------------------------+\n\nSELECT TO_CHAR(\'1980-01-11 04:50:39\', \'HH24-MI-SS\');\n+----------------------------------------------+\n| TO_CHAR(\'1980-01-11 04:50:39\', \'HH24-MI-SS\') |\n+----------------------------------------------+\n| 04-50-39 |\n+----------------------------------------------+\n\nSELECT TO_CHAR(\'00-01-01 00:00:00\', \'YY-MM-DD HH24:MI:SS\');\n+-----------------------------------------------------+\n| TO_CHAR(\'00-01-01 00:00:00\', \'YY-MM-DD HH24:MI:SS\') |\n+-----------------------------------------------------+\n| 00-01-01 00:00:00 |\n+-----------------------------------------------------+\n\nSELECT TO_CHAR(\'99-12-31 23:59:59\', \'YY-MM-DD HH24:MI:SS\');\n+-----------------------------------------------------+\n| TO_CHAR(\'99-12-31 23:59:59\', \'YY-MM-DD HH24:MI:SS\') |\n+-----------------------------------------------------+\n| 99-12-31 23:59:59 |\n+-----------------------------------------------------+\n\nSELECT TO_CHAR(\'9999-12-31 23:59:59\', \'YY-MM-DD HH24:MI:SS\');\n+-------------------------------------------------------+\n| TO_CHAR(\'9999-12-31 23:59:59\', \'YY-MM-DD HH24:MI:SS\') |\n+-------------------------------------------------------+\n| 99-12-31 23:59:59 |\n+-------------------------------------------------------+\n\nSELECT TO_CHAR(\'21-01-03 08:30:00\', \'Y-MONTH-DY HH:MI:SS\');\n+-----------------------------------------------------+\n| TO_CHAR(\'21-01-03 08:30:00\', \'Y-MONTH-DY HH:MI:SS\') |\n+-----------------------------------------------------+\n| 1-January -Sun 08:30:00 |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/to_char/','','https://mariadb.com/kb/en/to_char/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (682,36,'TRIM','Syntax\n------\n\nTRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr FROM] str)\n\nFrom MariaDB 10.3.6\n\nTRIM_ORACLE([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr\nFROM] str)\n\nDescription\n-----------\n\nReturns the string str with all remstr prefixes or suffixes removed. If none\nof the specifiers BOTH, LEADING, or TRAILING is given, BOTH is assumed. remstr\nis optional and, if not specified, spaces are removed.\n\nReturns NULL if given a NULL argument. If the result is empty, returns either\nan empty string, or, from MariaDB 10.3.6 with SQL_MODE=Oracle, NULL.\nSQL_MODE=Oracle is not set by default.\n\nThe Oracle mode version of the function can be accessed in any mode by using\nTRIM_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT TRIM(\' bar \')\\G\n*************************** 1. row ***************************\nTRIM(\' bar \'): bar\n\nSELECT TRIM(LEADING \'x\' FROM \'xxxbarxxx\')\\G\n*************************** 1. row ***************************\nTRIM(LEADING \'x\' FROM \'xxxbarxxx\'): barxxx\n\nSELECT TRIM(BOTH \'x\' FROM \'xxxbarxxx\')\\G\n*************************** 1. row ***************************\nTRIM(BOTH \'x\' FROM \'xxxbarxxx\'): bar\n\nSELECT TRIM(TRAILING \'xyz\' FROM \'barxxyz\')\\G\n*************************** 1. row ***************************\nTRIM(TRAILING \'xyz\' FROM \'barxxyz\'): barx\n\nFrom MariaDB 10.3.6, with SQL_MODE=Oracle not set:\n\nSELECT TRIM(\'\'),TRIM_ORACLE(\'\');\n+----------+-----------------+\n| TRIM(\'\') | TRIM_ORACLE(\'\') |\n+----------+-----------------+\n| | NULL |\n+----------+-----------------+\n\nFrom MariaDB 10.3.6, with SQL_MODE=Oracle set:\n\nSELECT TRIM(\'\'),TRIM_ORACLE(\'\');\n+----------+-----------------+\n| TRIM(\'\') | TRIM_ORACLE(\'\') |\n+----------+-----------------+\n| NULL | NULL |\n+----------+-----------------+\n\nURL: https://mariadb.com/kb/en/trim/','','https://mariadb.com/kb/en/trim/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (683,36,'UCASE','Syntax\n------\n\nUCASE(str)\n\nDescription\n-----------\n\nUCASE() is a synonym for UPPER().\n\nURL: https://mariadb.com/kb/en/ucase/','','https://mariadb.com/kb/en/ucase/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (684,36,'UNCOMPRESSED_LENGTH','Syntax\n------\n\nUNCOMPRESSED_LENGTH(compressed_string)\n\nDescription\n-----------\n\nReturns the length that the compressed string had before being compressed with\nCOMPRESS().\n\nUNCOMPRESSED_LENGTH() returns NULL or an incorrect result if the string is not\ncompressed.\n\nUntil MariaDB 10.3.1, returns MYSQL_TYPE_LONGLONG, or bigint(10), in all\ncases. From MariaDB 10.3.1, returns MYSQL_TYPE_LONG, or int(10), when the\nresult would fit within 32-bits.\n\nExamples\n--------\n\nSELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT(\'a\',30)));\n+-----------------------------------------------+\n| UNCOMPRESSED_LENGTH(COMPRESS(REPEAT(\'a\',30))) |\n+-----------------------------------------------+\n| 30 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/uncompressed_length/','','https://mariadb.com/kb/en/uncompressed_length/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (685,36,'UNHEX','Syntax\n------\n\nUNHEX(str)\n\nDescription\n-----------\n\nPerforms the inverse operation of HEX(str). That is, it interprets each pair\nof hexadecimal digits in the argument as a number and converts it to the\ncharacter represented by the number. The resulting characters are returned as\na binary string.\n\nIf str is NULL, UNHEX() returns NULL.\n\nExamples\n--------\n\nSELECT HEX(\'MariaDB\');\n+----------------+\n| HEX(\'MariaDB\') |\n+----------------+\n| 4D617269614442 |\n+----------------+\n\nSELECT UNHEX(\'4D617269614442\');\n+-------------------------+\n| UNHEX(\'4D617269614442\') |\n+-------------------------+\n| MariaDB |\n+-------------------------+\n\nSELECT 0x4D617269614442;\n+------------------+\n| 0x4D617269614442 |\n+------------------+\n| MariaDB |\n+------------------+\n\nSELECT UNHEX(HEX(\'string\'));\n+----------------------+\n| UNHEX(HEX(\'string\')) |\n+----------------------+\n| string |\n+----------------------+\n\nSELECT HEX(UNHEX(\'1267\'));\n+--------------------+\n| HEX(UNHEX(\'1267\')) |\n+--------------------+\n| 1267 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/unhex/','','https://mariadb.com/kb/en/unhex/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (686,36,'UPDATEXML','Syntax\n------\n\nUpdateXML(xml_target, xpath_expr, new_xml)\n\nDescription\n-----------\n\nThis function replaces a single portion of a given fragment of XML markup\nxml_target with a new XML fragment new_xml, and then returns the changed XML.\nThe portion of xml_target that is replaced matches an XPath expression\nxpath_expr supplied by the user. If no expression matching xpath_expr is\nfound, or if multiple matches are found, the function returns the original\nxml_target XML fragment. All three arguments should be strings.\n\nExamples\n--------\n\nSELECT\n UpdateXML(\'<a><b>ccc</b><d></d></a>\', \'/a\', \'<e>fff</e>\') AS val1,\n UpdateXML(\'<a><b>ccc</b><d></d></a>\', \'/b\', \'<e>fff</e>\') AS val2,\n UpdateXML(\'<a><b>ccc</b><d></d></a>\', \'//b\', \'<e>fff</e>\') AS val3,\n UpdateXML(\'<a><b>ccc</b><d></d></a>\', \'/a/d\', \'<e>fff</e>\') AS val4,\n UpdateXML(\'<a><d></d><b>ccc</b><d></d></a>\', \'/a/d\', \'<e>fff</e>\') AS val5\n \\G\n*************************** 1. row ***************************\nval1: <e>fff</e>\nval2: <a><b>ccc</b><d></d></a>\nval3: <a><e>fff</e><d></d></a>\nval4: <a><b>ccc</b><e>fff</e></a>\nval5: <a><d></d><b>ccc</b><d></d></a>\n1 row in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/updatexml/','','https://mariadb.com/kb/en/updatexml/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (687,36,'UPPER','Syntax\n------\n\nUPPER(str)\n\nDescription\n-----------\n\nReturns the string str with all characters changed to uppercase according to\nthe current character set mapping. The default is latin1 (cp1252 West\nEuropean).\n\nSELECT UPPER(surname), givenname FROM users ORDER BY surname;\n+----------------+------------+\n| UPPER(surname) | givenname |\n+----------------+------------+\n| ABEL | Jacinto |\n| CASTRO | Robert |\n| COSTA | Phestos |\n| MOSCHELLA | Hippolytos |\n+----------------+------------+\n\nUPPER() is ineffective when applied to binary strings (BINARY, VARBINARY,\nBLOB). The description of LOWER() shows how to perform lettercase conversion\nof binary strings.\n\nURL: https://mariadb.com/kb/en/upper/','','https://mariadb.com/kb/en/upper/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (688,36,'WEIGHT_STRING','Syntax\n------\n\nWEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])\n levels: N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ...\n\nDescription\n-----------\n\nReturns a binary string representing the string\'s sorting and comparison\nvalue. A string with a lower result means that for sorting purposes the string\nappears before a string with a higher result.\n\nWEIGHT_STRING() is particularly useful when adding new collations, for testing\npurposes.\n\nIf str is a non-binary string (CHAR, VARCHAR or TEXT), WEIGHT_STRING returns\nthe string\'s collation weight. If str is a binary string (BINARY, VARBINARY or\nBLOB), the return value is simply the input value, since the weight for each\nbyte in a binary string is the byte value.\n\nWEIGHT_STRING() returns NULL if given a NULL input.\n\nThe optional AS clause permits casting the input string to a binary or\nnon-binary string, as well as to a particular length.\n\nAS BINARY(N) measures the length in bytes rather than characters, and right\npads with 0x00 bytes to the desired length.\n\nAS CHAR(N) measures the length in characters, and right pads with spaces to\nthe desired length.\n\nN has a minimum value of 1, and if it is less than the length of the input\nstring, the string is truncated without warning.\n\nThe optional LEVEL clause specifies that the return value should contain\nweights for specific collation levels. The levels specifier can either be a\nsingle integer, a comma-separated list of integers, or a range of integers\nseparated by a dash (whitespace is ignored). Integers can range from 1 to a\nmaximum of 6, dependent on the collation, and need to be listed in ascending\norder.\n\nIf the LEVEL clause is no provided, a default of 1 to the maximum for the\ncollation is assumed.\n\nIf the LEVEL is specified without using a range, an optional modifier is\npermitted.\n\nASC, the default, returns the weights without any modification.\n\nDESC returns bitwise-inverted weights.\n\nREVERSE returns the weights in reverse order.\n\nExamples\n--------\n\nThe examples below use the HEX() function to represent non-printable results\nin hexadecimal format.\n\nSELECT HEX(WEIGHT_STRING(\'x\'));\n+-------------------------+\n| HEX(WEIGHT_STRING(\'x\')) |\n+-------------------------+\n| 0058 |\n+-------------------------+\n\nSELECT HEX(WEIGHT_STRING(\'x\' AS BINARY(4)));\n+--------------------------------------+\n| HEX(WEIGHT_STRING(\'x\' AS BINARY(4))) |\n+--------------------------------------+\n| 78000000 |\n+--------------------------------------+\n\nSELECT HEX(WEIGHT_STRING(\'x\' AS CHAR(4)));\n+------------------------------------+\n| HEX(WEIGHT_STRING(\'x\' AS CHAR(4))) |\n+------------------------------------+\n| 0058002000200020 |\n+------------------------------------+\n\nSELECT HEX(WEIGHT_STRING(0xaa22ee LEVEL 1));\n+--------------------------------------+\n| HEX(WEIGHT_STRING(0xaa22ee LEVEL 1)) |\n+--------------------------------------+\n| AA22EE |\n+--------------------------------------+\n\nSELECT HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 DESC));\n+-------------------------------------------+\n| HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 DESC)) |\n+-------------------------------------------+\n| 55DD11 |\n+-------------------------------------------+\n\nSELECT HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 REVERSE));\n+----------------------------------------------+\n| HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 REVERSE)) |\n+----------------------------------------------+\n| EE22AA |\n+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/weight_string/','','https://mariadb.com/kb/en/weight_string/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (689,36,'Type Conversion','Implicit type conversion takes place when MariaDB is using operands or\ndifferent types, in order to make the operands compatible.\n\nIt is best practice not to rely upon implicit conversion; rather use CAST to\nexplicitly convert types.\n\nRules for Conversion on Comparison\n----------------------------------\n\n* If either argument is NULL, the result of the comparison is NULL unless the\nNULL-safe <=> equality comparison operator is used.\n* If both arguments are integers, they are compared as integers.\n* If both arguments are strings, they are compared as strings.\n* If one argument is decimal and the other argument is decimal or integer,\nthey are compared as decimals.\n* If one argument is decimal and the other argument is a floating point, they\nare compared as floating point values.\n* If one argument is string and the other argument is integer, they are\ncompared as decimals. This conversion was added in MariaDB 10.3.36. Prior to\n10.3.36, this combination was compared as floating point values, which did not\nalways work well for huge 64-bit integers because of a possible precision loss\non conversion to double.\n* If a hexadecimal argument is not compared to a number, it is treated as a\nbinary string.\n* If a constant is compared to a TIMESTAMP or DATETIME, the constant is\nconverted to a timestamp, unless used as an argument to the IN function.\n* In other cases, arguments are compared as floating point, or real, numbers.\n\nNote that if a string column is being compared with a numeric value, MariaDB\nwill not use the index on the column, as there are numerous alternatives that\nmay evaluate as equal (see examples below).\n\nComparison Examples\n-------------------\n\nConverting a string to a number:\n\nSELECT 15+\'15\';\n+---------+\n| 15+\'15\' |\n+---------+\n| 30 |\n+---------+\n\nConverting a number to a string:\n\nSELECT CONCAT(15,\'15\');\n+-----------------+\n| CONCAT(15,\'15\') |\n+-----------------+\n| 1515 |\n+-----------------+\n\nFloating point number errors:\n\nSELECT \'9746718491924563214\' = 9746718491924563213;\n+---------------------------------------------+\n| \'9746718491924563214\' = 9746718491924563213 |\n+---------------------------------------------+\n| 1 |\n+---------------------------------------------+\n\nNumeric equivalence with strings:\n\nSELECT \'5\' = 5;\n+---------+\n| \'5\' = 5 |\n+---------+\n| 1 |\n+---------+\n\nSELECT \' 5\' = 5;\n+------------+\n| \' 5\' = 5 |\n+------------+\n| 1 |\n+------------+\n\nSELECT \' 5 \' = 5;\n+--------------+\n| \' 5 \' = 5 |\n+--------------+\n| 1 |\n+--------------+\n1 row in set, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+--------------------------------------------+\n| Level | Code | Message |\n+-------+------+--------------------------------------------+\n| Note | 1292 | Truncated incorrect DOUBLE value: \' 5 \' |\n+-------+------+--------------------------------------------+\n\nAs a result of the above, MariaDB cannot use the index when comparing a string\nwith a numeric value in the example below:\n\nCREATE TABLE t (a VARCHAR(10), b VARCHAR(10), INDEX idx_a (a));\n\nINSERT INTO t VALUES \n (\'1\', \'1\'), (\'2\', \'2\'), (\'3\', \'3\'),\n (\'4\', \'4\'), (\'5\', \'5\'), (\'1\', \'5\');\n\nEXPLAIN SELECT * FROM t WHERE a = \'3\' \\G\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: t\n type: ref\npossible_keys: idx_a\n key: idx_a\n key_len: 13\n ref: const\n rows: 1\n Extra: Using index condition\n\nEXPLAIN SELECT * FROM t WHERE a = 3 \\G\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: t\n type: ALL\npossible_keys: idx_a\n key: NULL\n key_len: NULL\n ref: NULL\n rows: 6\n Extra: Using where\n\nRules for Conversion on Dyadic Arithmetic Operations\n----------------------------------------------------\n\nImplicit type conversion also takes place on dyadic arithmetic operations\n(+,-,*,/). MariaDB chooses the minimum data type that is guaranteed to fit the\nresult and converts both arguments to the result data type.\n\nFor addition (+), subtraction (-) and multiplication (*), the result data type\nis chosen as follows:\n\n* If either of the arguments is an approximate number (float, double), the\nresult is double.\n* If either of the arguments is a string (char, varchar, text), the result is\ndouble.\n* If either of the arguments is a decimal number, the result is decimal.\n* If either of the arguments is of a temporal type with a non-zero fractional\nsecond precision (time(N), datetime(N), timestamp(N)), the result is decimal.\n* If either of the arguments is of a temporal type with a zero fractional\nsecond precision (time(0), date, datetime(0), timestamp(0)), the result may\nvary between int, int unsigned, bigint or bigint unsigned, depending on the\nexact data type combination.\n* If both arguments are integer numbers (tinyint, smallint, mediumint,\nbigint), the result may vary between int, int unsigned, bigint or bigint\nunsigned, depending of the exact data types and their signs.\n\nFor division (/), the result data type is chosen as follows:\n\n* If either of the arguments is an approximate number (float, double), the\nresult is double.\n* If either of the arguments is a string (char, varchar, text), the result is\ndouble.\n* Otherwise, the result is decimal.\n\nArithmetic Examples\n-------------------\n\nNote, the above rules mean that when an argument of a temporal data type\nappears in addition or subtraction, it\'s treated as a number by default.\n\nSELECT TIME\'10:20:30\' + 1;\n+--------------------+\n| TIME\'10:20:30\' + 1 |\n+--------------------+\n| 102031 |\n+--------------------+\n\nIn order to do temporal addition or subtraction instead, use the DATE_ADD() or\nDATE_SUB() functions, or an INTERVAL expression as the second argument:\n\nSELECT TIME\'10:20:30\' + INTERVAL 1 SECOND;\n+------------------------------------+\n| TIME\'10:20:30\' + INTERVAL 1 SECOND |\n+------------------------------------+\n| 10:20:31 |\n+------------------------------------+\n\nSELECT \"2.2\" + 3;\n+-----------+\n| \"2.2\" + 3 |\n+-----------+\n| 5.2 |\n+-----------+\n\nSELECT 2.2 + 3;\n+---------+\n| 2.2 + 3 |\n+---------+\n| 5.2 |\n+---------+\n\nSELECT 2.2 / 3;\n+---------+\n| 2.2 / 3 |\n+---------+\n| 0.73333 |\n+---------+\n\nSELECT \"2.2\" / 3;\n+--------------------+\n| \"2.2\" / 3 |\n+--------------------+\n| 0.7333333333333334 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/type-conversion/','','https://mariadb.com/kb/en/type-conversion/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (690,37,'_rowid','Syntax\n------\n\n_rowid\n\nDescription\n-----------\n\nThe _rowid pseudo column is mapped to the primary key in the related table.\nThis can be used as a replacement of the rowid pseudo column in other\ndatabases. Another usage is to simplify sql queries as one doesn\'t have to\nknow the name of the primary key.\n\nExamples\n--------\n\ncreate table t1 (a int primary key, b varchar(80));\ninsert into t1 values (1,\"one\"),(2,\"two\");\nselect * from t1 where _rowid=1;\n\n+---+------+\n| a | b |\n+---+------+\n| 1 | one |\n+---+------+\n\nupdate t1 set b=\"three\" where _rowid=2;\nselect * from t1 where _rowid>=1 and _rowid<=10;\n\n+---+-------+\n| a | b |\n+---+-------+\n| 1 | one |\n| 2 | three |\n+---+-------+\n\nURL: https://mariadb.com/kb/en/_rowid/','','https://mariadb.com/kb/en/_rowid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (691,38,'ALTER TABLE','Syntax\n------\n\nALTER [ONLINE] [IGNORE] TABLE [IF EXISTS] tbl_name\n [WAIT n | NOWAIT]\n alter_specification [, alter_specification] ...\nalter_specification:\n table_option ...\n | ADD [COLUMN] [IF NOT EXISTS] col_name column_definition\n [FIRST | AFTER col_name ]\n | ADD [COLUMN] [IF NOT EXISTS] (col_name column_definition,...)\n | ADD {INDEX|KEY} [IF NOT EXISTS] [index_name]\n [index_type] (index_col_name,...) [index_option] ...\n | ADD [CONSTRAINT [symbol]] PRIMARY KEY\n [index_type] (index_col_name,...) [index_option] ...\n | ADD [CONSTRAINT [symbol]]\n UNIQUE [INDEX|KEY] [index_name]\n [index_type] (index_col_name,...) [index_option] ...\n | ADD FULLTEXT [INDEX|KEY] [index_name]\n (index_col_name,...) [index_option] ...\n | ADD SPATIAL [INDEX|KEY] [index_name]\n (index_col_name,...) [index_option] ...\n | ADD [CONSTRAINT [symbol]]\n FOREIGN KEY [IF NOT EXISTS] [index_name] (index_col_name,...)\n reference_definition\n | ADD PERIOD FOR SYSTEM_TIME (start_column_name, end_column_name)\n | ALTER [COLUMN] col_name SET DEFAULT literal | (expression)\n | ALTER [COLUMN] col_name DROP DEFAULT\n | ALTER {INDEX|KEY} index_name [NOT] INVISIBLE\n | CHANGE [COLUMN] [IF EXISTS] old_col_name new_col_name column_definition\n [FIRST|AFTER col_name]\n | MODIFY [COLUMN] [IF EXISTS] col_name column_definition\n [FIRST | AFTER col_name]\n | DROP [COLUMN] [IF EXISTS] col_name [RESTRICT|CASCADE]\n | DROP PRIMARY KEY\n | DROP {INDEX|KEY} [IF EXISTS] index_name\n | DROP FOREIGN KEY [IF EXISTS] fk_symbol\n | DROP CONSTRAINT [IF EXISTS] constraint_name\n | DISABLE KEYS\n | ENABLE KEYS\n | RENAME [TO] new_tbl_name\n | ORDER BY col_name [, col_name] ...\n | RENAME COLUMN old_col_name TO new_col_name\n | RENAME {INDEX|KEY} old_index_name TO new_index_name\n | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]\n | [DEFAULT] CHARACTER SET [=] charset_name\n | [DEFAULT] COLLATE [=] collation_name\n | DISCARD TABLESPACE\n | IMPORT TABLESPACE\n | ALGORITHM [=] {DEFAULT|INPLACE|COPY|NOCOPY|INSTANT}\n | LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}\n | FORCE\n | partition_options\n | ADD PARTITION [IF NOT EXISTS] (partition_definition)\n | DROP PARTITION [IF EXISTS] partition_names\n | COALESCE PARTITION number\n | REORGANIZE PARTITION [partition_names INTO (partition_definitions)]\n | ANALYZE PARTITION partition_names\n | CHECK PARTITION partition_names\n | OPTIMIZE PARTITION partition_names\n | REBUILD PARTITION partition_names\n | REPAIR PARTITION partition_names\n | EXCHANGE PARTITION partition_name WITH TABLE tbl_name\n | REMOVE PARTITIONING\n | ADD SYSTEM VERSIONING\n | DROP SYSTEM VERSIONING\nindex_col_name:\n col_name [(length)] [ASC | DESC]\nindex_type:\n USING {BTREE | HASH | RTREE}\nindex_option:\n [ KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n | CLUSTERING={YES| NO} ]\n [ IGNORED | NOT IGNORED ]\ntable_options:\n table_option [[,] table_option] ...\n\nDescription\n-----------\n\nALTER TABLE enables you to change the structure of an existing table. For\nexample, you can add or delete columns, create or destroy indexes, change the\ntype of existing columns, or rename columns or the table itself. You can also\nchange the comment for the table and the storage engine of the table.\n\nIf another connection is using the table, a metadata lock is active, and this\nstatement will wait until the lock is released. This is also true for\nnon-transactional tables.\n\nWhen adding a UNIQUE index on a column (or a set of columns) which have\nduplicated values, an error will be produced and the statement will be\nstopped. To suppress the error and force the creation of UNIQUE indexes,\ndiscarding duplicates, the IGNORE option can be specified. This can be useful\nif a column (or a set of columns) should be UNIQUE but it contains duplicate\nvalues; however, this technique provides no control on which rows are\npreserved and which are deleted. Also, note that IGNORE is accepted but\nignored in ALTER TABLE ... EXCHANGE PARTITION statements.\n\nThis statement can also be used to rename a table. For details see RENAME\nTABLE.\n\nWhen an index is created, the storage engine may use a configurable buffer in\nthe process. Incrementing the buffer speeds up the index creation. Aria and\nMyISAM allocate a buffer whose size is defined by aria_sort_buffer_size or\nmyisam_sort_buffer_size, also used for REPAIR TABLE. InnoDB allocates three\nbuffers whose size is defined by innodb_sort_buffer_size.\n\nPrivileges\n----------\n\nExecuting the ALTER TABLE statement generally requires at least the ALTER\nprivilege for the table or the database..\n\nIf you are renaming a table, then it also requires the DROP, CREATE and INSERT\nprivileges for the table or the database as well.\n\nOnline DDL\n----------\n\nOnline DDL is supported with the ALGORITHM and LOCK clauses.\n\nSee InnoDB Online DDL Overview for more information on online DDL with InnoDB.\n\nALTER ONLINE TABLE\n------------------\n\nALTER ONLINE TABLE also works for partitioned tables.\n\nOnline ALTER TABLE is available by executing the following:\n\nALTER ONLINE TABLE ...;\n\nThis statement has the following semantics:\n\nThis statement is equivalent to the following:\n\nALTER TABLE ... LOCK=NONE;\n\nSee the LOCK alter specification for more information.\n\nThis statement is equivalent to the following:\n\nALTER TABLE ... ALGORITHM=INPLACE;\n\nSee the ALGORITHM alter specification for more information.\n\nWAIT/NOWAIT\n-----------\n\nMariaDB starting with 10.3.0\n----------------------------\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nIF EXISTS\n---------\n\nThe IF EXISTS and IF NOT EXISTS clauses are available for the following:\n\nADD COLUMN [IF NOT EXISTS]\nADD INDEX [IF NOT EXISTS]\nADD FOREIGN KEY [IF NOT EXISTS]\nADD PARTITION [IF NOT EXISTS]\nCREATE INDEX [IF NOT EXISTS]\nDROP COLUMN [IF EXISTS]\nDROP INDEX [IF EXISTS]\nDROP FOREIGN KEY [IF EXISTS]\nDROP PARTITION [IF EXISTS]\nCHANGE COLUMN [IF EXISTS]\nMODIFY COLUMN [IF EXISTS]\nDROP INDEX [IF EXISTS]\nWhen IF EXISTS and IF NOT EXISTS are used in clauses, queries will not report\nerrors when the condition is triggered for that clause. A warning with the\nsame message text will be issued and the ALTER will move on to the next clause\nin the statement (or end if finished).\n\nMariaDB starting with 10.5.2\n----------------------------\nIf this is directive is used after ALTER ... TABLE, one will not get an error\nif the table doesn\'t exist.\n\nColumn Definitions\n------------------\n\nSee CREATE TABLE: Column Definitions for information about column definitions.\n\nIndex Definitions\n-----------------\n\nSee CREATE TABLE: Index Definitions for information about index definitions.\n\nThe CREATE INDEX and DROP INDEX statements can also be used to add or remove\nan index.\n\nCharacter Sets and Collations\n-----------------------------\n\nCONVERT TO CHARACTER SET charset_name [COLLATE collation_name]\n[DEFAULT] CHARACTER SET [=] charset_name\n[DEFAULT] COLLATE [=] collation_name\nSee Setting Character Sets and Collations for details on setting the character\nsets and collations.\n\nAlter Specifications\n--------------------\n\nTable Options\n-------------\n\nSee CREATE TABLE: Table Options for information about table options.\n\nADD COLUMN\n----------\n\n... ADD COLUMN [IF NOT EXISTS] (col_name column_definition,...)\nAdds a column to the table. The syntax is the same as in CREATE TABLE. If you\nare using IF NOT_EXISTS the column will not be added if it was not there\nalready. This is very useful when doing scripts to modify tables.\n\nThe FIRST and AFTER clauses affect the physical order of columns in the\ndatafile. Use FIRST to add a column in the first (leftmost) position, or AFTER\nfollowed by a column name to add the new column in any other position. Note\nthat, nowadays, the physical position of a column is usually irrelevant.\n\nSee also Instant ADD COLUMN for InnoDB.\n\nDROP COLUMN\n-----------\n\n... DROP COLUMN [IF EXISTS] col_name [CASCADE|RESTRICT]\nDrops the column from the table. If you are using IF EXISTS you will not get\nan error if the column didn\'t exist. If the column is part of any index, the\ncolumn will be dropped from them, except if you add a new column with\nidentical name at the same time. The index will be dropped if all columns from\nthe index were dropped. If the column was used in a view or trigger, you will\nget an error next time the view or trigger is accessed.\n\nMariaDB starting with 10.2.8\n----------------------------\nDropping a column that is part of a multi-column UNIQUE constraint is not\npermitted. For example:\n\nCREATE TABLE a (\n a int,\n b int,\n primary key (a,b)\n);\n\nALTER TABLE x DROP COLUMN a;\n[42000][1072] Key column \'A\' doesn\'t exist in table\n\nThe reason is that dropping column a would result in the new constraint that\nall values in column b be unique. In order to drop the column, an explicit\nDROP PRIMARY KEY and ADD PRIMARY KEY would be required. Up until MariaDB\n10.2.7, the column was dropped and the additional constraint applied,\nresulting in the following structure:\n\nALTER TABLE x DROP COLUMN a;\nQuery OK, 0 rows affected (0.46 sec)\n\nDESC x;\n+-------+---------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-------+\n| b | int(11) | NO | PRI | NULL | |\n+-------+---------+------+-----+---------+-------+\n\nMariaDB starting with 10.4.0\n----------------------------\nMariaDB 10.4.0 supports instant DROP COLUMN. DROP COLUMN of an indexed column\nwould imply DROP INDEX (and in the case of a non-UNIQUE multi-column index,\npossibly ADD INDEX). These will not be allowed with ALGORITHM=INSTANT, but\nunlike before, they can be allowed with ALGORITHM=NOCOPY\n\nRESTRICT and CASCADE are allowed to make porting from other database systems\neasier. In MariaDB, they do nothing.\n\nMODIFY COLUMN\n-------------\n\nAllows you to modify the type of a column. The column will be at the same\nplace as the original column and all indexes on the column will be kept. Note\nthat when modifying column, you should specify all attributes for the new\ncolumn.\n\nCREATE TABLE t1 (a INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY((a));\nALTER TABLE t1 MODIFY a BIGINT UNSIGNED AUTO_INCREMENT;\n\nCHANGE COLUMN\n-------------\n\nWorks like MODIFY COLUMN except that you can also change the name of the\ncolumn. The column will be at the same place as the original column and all\nindex on the column will be kept.\n\nCREATE TABLE t1 (a INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a));\nALTER TABLE t1 CHANGE a b BIGINT UNSIGNED AUTO_INCREMENT;\n\nALTER COLUMN\n------------\n\nThis lets you change column options.\n\nCREATE TABLE t1 (a INT UNSIGNED AUTO_INCREMENT, b varchar(50), PRIMARY KEY(a));\nALTER TABLE t1 ALTER b SET DEFAULT \'hello\';\n\nRENAME INDEX/KEY\n----------------\n\nMariaDB starting with 10.5.2\n----------------------------\nFrom MariaDB 10.5.2, it is possible to rename an index using the RENAME INDEX\n(or RENAME KEY) syntax, for example:\n\nALTER TABLE t1 RENAME INDEX i_old TO i_new;\n\nRENAME COLUMN\n-------------\n\nMariaDB starting with 10.5.2\n----------------------------\nFrom MariaDB 10.5.2, it is possible to rename a column using the RENAME COLUMN\nsyntax, for example:\n\nALTER TABLE t1 RENAME COLUMN c_old TO c_new;\n\nADD PRIMARY KEY\n---------------\n\nAdd a primary key.\n\nFor PRIMARY KEY indexes, you can specify a name for the index, but it is\nsilently ignored, and the name of the index is always PRIMARY.\n\nSee Getting Started with Indexes: Primary Key for more information.\n\nDROP PRIMARY KEY\n----------------\n\nDrop a primary key.\n\nFor PRIMARY KEY indexes, you can specify a name for the index, but it is\nsilently ignored, and the name of the index is always PRIMARY.\n\nSee Getting Started with Indexes: Primary Key for more information.\n\nADD FOREIGN KEY\n---------------\n\nAdd a foreign key.\n\nFor FOREIGN KEY indexes, a reference definition must be provided.\n\nFor FOREIGN KEY indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nFirst, you have to specify the name of the target (parent) table and a column\nor a column list which must be indexed and whose values must match to the\nforeign key\'s values. The MATCH clause is accepted to improve the\ncompatibility with other DBMS\'s, but has no meaning in MariaDB. The ON DELETE\nand ON UPDATE clauses specify what must be done when a DELETE (or a REPLACE)\nstatements attempts to delete a referenced row from the parent table, and when\nan UPDATE statement attempts to modify the referenced foreign key columns in a\nparent table row, respectively. The following options are allowed:\n\n* RESTRICT: The delete/update operation is not performed. The statement\nterminates with a 1451 error (SQLSTATE \'2300\').\n* NO ACTION: Synonym for RESTRICT.\n* CASCADE: The delete/update operation is performed in both tables.\n* SET NULL: The update or delete goes ahead in the parent table, and the\ncorresponding foreign key fields in the child table are set to NULL. (They\nmust not be defined as NOT NULL for this to succeed).\n* SET DEFAULT: This option is implemented only for the legacy PBXT storage\nengine, which is disabled by default and no longer maintained. It sets the\nchild table\'s foreign key fields to their DEFAULT values when the referenced\nparent table key entries are updated or deleted.\n\nIf either clause is omitted, the default behavior for the omitted clause is\nRESTRICT.\n\nSee Foreign Keys for more information.\n\nDROP FOREIGN KEY\n----------------\n\nDrop a foreign key.\n\nSee Foreign Keys for more information.\n\nADD INDEX\n---------\n\nAdd a plain index.\n\nPlain indexes are regular indexes that are not unique, and are not acting as a\nprimary key or a foreign key. They are also not the \"specialized\" FULLTEXT or\nSPATIAL indexes.\n\nSee Getting Started with Indexes: Plain Indexes for more information.\n\nDROP INDEX\n----------\n\nDrop a plain index.\n\nPlain indexes are regular indexes that are not unique, and are not acting as a\nprimary key or a foreign key. They are also not the \"specialized\" FULLTEXT or\nSPATIAL indexes.\n\nSee Getting Started with Indexes: Plain Indexes for more information.\n\nADD UNIQUE INDEX\n----------------\n\nAdd a unique index.\n\nThe UNIQUE keyword means that the index will not accept duplicated values,','','https://mariadb.com/kb/en/alter-table/');
-update help_topic set description = CONCAT(description, '\nexcept for NULLs. An error will raise if you try to insert duplicate values in\na UNIQUE index.\n\nFor UNIQUE indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nSee Getting Started with Indexes: Unique Index for more information.\n\nDROP UNIQUE INDEX\n-----------------\n\nDrop a unique index.\n\nThe UNIQUE keyword means that the index will not accept duplicated values,\nexcept for NULLs. An error will raise if you try to insert duplicate values in\na UNIQUE index.\n\nFor UNIQUE indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nSee Getting Started with Indexes: Unique Index for more information.\n\nADD FULLTEXT INDEX\n------------------\n\nAdd a FULLTEXT index.\n\nSee Full-Text Indexes for more information.\n\nDROP FULLTEXT INDEX\n-------------------\n\nDrop a FULLTEXT index.\n\nSee Full-Text Indexes for more information.\n\nADD SPATIAL INDEX\n-----------------\n\nAdd a SPATIAL index.\n\nSee SPATIAL INDEX for more information.\n\nDROP SPATIAL INDEX\n------------------\n\nDrop a SPATIAL index.\n\nSee SPATIAL INDEX for more information.\n\nENABLE/ DISABLE KEYS\n--------------------\n\nDISABLE KEYS will disable all non unique keys for the table for storage\nengines that support this (at least MyISAM and Aria). This can be used to\nspeed up inserts into empty tables.\n\nENABLE KEYS will enable all disabled keys.\n\nRENAME TO\n---------\n\nRenames the table. See also RENAME TABLE.\n\nADD CONSTRAINT\n--------------\n\nModifies the table adding a constraint on a particular column or columns.\n\nMariaDB starting with 10.2.1\n----------------------------\nMariaDB 10.2.1 introduced new ways to define a constraint.\n\nNote: Before MariaDB 10.2.1, constraint expressions were accepted in syntax,\nbut ignored.\n\nALTER TABLE table_name \nADD CONSTRAINT [constraint_name] CHECK(expression);\nBefore a row is inserted or updated, all constraints are evaluated in the\norder they are defined. If any constraint fails, then the row will not be\nupdated. One can use most deterministic functions in a constraint, including\nUDF\'s.\n\nCREATE TABLE account_ledger (\n id INT PRIMARY KEY AUTO_INCREMENT,\n transaction_name VARCHAR(100),\n credit_account VARCHAR(100),\n credit_amount INT,\n debit_account VARCHAR(100),\n debit_amount INT);\n\nALTER TABLE account_ledger \nADD CONSTRAINT is_balanced \n CHECK((debit_amount + credit_amount) = 0);\n\nThe constraint_name is optional. If you don\'t provide one in the ALTER TABLE\nstatement, MariaDB auto-generates a name for you. This is done so that you can\nremove it later using DROP CONSTRAINT clause.\n\nYou can disable all constraint expression checks by setting the variable\ncheck_constraint_checks to OFF. You may find this useful when loading a table\nthat violates some constraints that you want to later find and fix in SQL.\n\nTo view constraints on a table, query information_schema.TABLE_CONSTRAINTS:\n\nSELECT CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE \nFROM information_schema.TABLE_CONSTRAINTS\nWHERE TABLE_NAME = \'account_ledger\';\n\n+-----------------+----------------+-----------------+\n| CONSTRAINT_NAME | TABLE_NAME | CONSTRAINT_TYPE |\n+-----------------+----------------+-----------------+\n| is_balanced | account_ledger | CHECK |\n+-----------------+----------------+-----------------+\n\nDROP CONSTRAINT\n---------------\n\nMariaDB starting with 10.2.22\n-----------------------------\nDROP CONSTRAINT for UNIQUE and FOREIGN KEY constraints was introduced in\nMariaDB 10.2.22 and MariaDB 10.3.13.\n\nMariaDB starting with 10.2.1\n----------------------------\nDROP CONSTRAINT for CHECK constraints was introduced in MariaDB 10.2.1\n\nModifies the table, removing the given constraint.\n\nALTER TABLE table_name\nDROP CONSTRAINT constraint_name;\n\nWhen you add a constraint to a table, whether through a CREATE TABLE or ALTER\nTABLE...ADD CONSTRAINT statement, you can either set a constraint_name\nyourself, or allow MariaDB to auto-generate one for you. To view constraints\non a table, query information_schema.TABLE_CONSTRAINTS. For instance,\n\nCREATE TABLE t (\n a INT,\n b INT,\n c INT,\n CONSTRAINT CHECK(a > b),\n CONSTRAINT check_equals CHECK(a = c));\n\nSELECT CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE \nFROM information_schema.TABLE_CONSTRAINTS\nWHERE TABLE_NAME = \'t\';\n\n+-----------------+----------------+-----------------+\n| CONSTRAINT_NAME | TABLE_NAME | CONSTRAINT_TYPE |\n+-----------------+----------------+-----------------+\n| check_equals | t | CHECK |\n| CONSTRAINT_1 | t | CHECK |\n+-----------------+----------------+-----------------+\n\nTo remove a constraint from the table, issue an ALTER TABLE...DROP CONSTRAINT\nstatement. For example,\n\nALTER TABLE t DROP CONSTRAINT is_unique;\n\nADD SYSTEM VERSIONING\n---------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nSystem-versioned tables was added in MariaDB 10.3.4.\n\nAdd system versioning.\n\nDROP SYSTEM VERSIONING\n----------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nSystem-versioned tables was added in MariaDB 10.3.4.\n\nDrop system versioning.\n\nADD PERIOD FOR SYSTEM_TIME\n--------------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nSystem-versioned tables was added in MariaDB 10.3.4.\n\nFORCE\n-----\n\nALTER TABLE ... FORCE can force MariaDB to re-build the table.\n\nIn MariaDB 5.5 and before, this could only be done by setting the ENGINE table\noption to its old value. For example, for an InnoDB table, one could execute\nthe following:\n\nALTER TABLE tab_name ENGINE = InnoDB;\n\nThe FORCE option can be used instead. For example, :\n\nALTER TABLE tab_name FORCE;\n\nWith InnoDB, the table rebuild will only reclaim unused space (i.e. the space\npreviously used for deleted rows) if the innodb_file_per_table system variable\nis set to ON (the default). If the system variable is OFF, then the space will\nnot be reclaimed, but it will be-re-used for new data that\'s later added.\n\nEXCHANGE PARTITION\n------------------\n\nThis is used to exchange the contents of a partition with another table.\n\nThis is performed by swapping the tablespaces of the partition with the other\ntable.\n\nSee copying InnoDB\'s transportable tablespaces for more information.\n\nDISCARD TABLESPACE\n------------------\n\nThis is used to discard an InnoDB table\'s tablespace.\n\nSee copying InnoDB\'s transportable tablespaces for more information.\n\nIMPORT TABLESPACE\n-----------------\n\nThis is used to import an InnoDB table\'s tablespace. The tablespace should\nhave been copied from its original server after executing FLUSH TABLES FOR\nEXPORT.\n\nSee copying InnoDB\'s transportable tablespaces for more information.\n\nALTER TABLE ... IMPORT only applies to InnoDB tables. Most other popular\nstorage engines, such as Aria and MyISAM, will recognize their data files as\nsoon as they\'ve been placed in the proper directory under the datadir, and no\nspecial DDL is required to import them.\n\nALGORITHM\n---------\n\nThe ALTER TABLE statement supports the ALGORITHM clause. This clause is one of\nthe clauses that is used to implement online DDL. ALTER TABLE supports several\ndifferent algorithms. An algorithm can be explicitly chosen for an ALTER TABLE\noperation by setting the ALGORITHM clause. The supported values are:\n\n* ALGORITHM=DEFAULT - This implies the default behavior for the specific\nstatement, such as if no ALGORITHM clause is specified.\n* ALGORITHM=COPY\n* ALGORITHM=INPLACE\n* ALGORITHM=NOCOPY - This was added in MariaDB 10.3.7.\n* ALGORITHM=INSTANT - This was added in MariaDB 10.3.7.\n\nSee InnoDB Online DDL Overview: ALGORITHM for information on how the ALGORITHM\nclause affects InnoDB.\n\nALGORITHM=DEFAULT\n-----------------\n\nThe default behavior, which occurs if ALGORITHM=DEFAULT is specified, or if\nALGORITHM is not specified at all, usually only makes a copy if the operation\ndoesn\'t support being done in-place at all. In this case, the most efficient\navailable algorithm will usually be used.\n\nHowever, in MariaDB 10.3.6 and before, if the value of the old_alter_table\nsystem variable is set to ON, then the default behavior is to perform ALTER\nTABLE operations by making a copy of the table using the old algorithm.\n\nIn MariaDB 10.3.7 and later, the old_alter_table system variable is\ndeprecated. Instead, the alter_algorithm system variable defines the default\nalgorithm for ALTER TABLE operations.\n\nALGORITHM=COPY\n--------------\n\nALGORITHM=COPY is the name for the original ALTER TABLE algorithm from early\nMariaDB versions.\n\nWhen ALGORITHM=COPY is set, MariaDB essentially does the following operations:\n\n-- Create a temporary table with the new definition\nCREATE TEMPORARY TABLE tmp_tab (\n...\n);\n\n-- Copy the data from the original table\nINSERT INTO tmp_tab\n SELECT * FROM original_tab;\n\n-- Drop the original table\nDROP TABLE original_tab;\n\n-- Rename the temporary table, so that it replaces the original one\nRENAME TABLE tmp_tab TO original_tab;\n\nThis algorithm is very inefficient, but it is generic, so it works for all\nstorage engines.\n\nIf ALGORITHM=COPY is specified, then the copy algorithm will be used even if\nit is not necessary. This can result in a lengthy table copy. If multiple\nALTER TABLE operations are required that each require the table to be rebuilt,\nthen it is best to specify all operations in a single ALTER TABLE statement,\nso that the table is only rebuilt once.\n\nALGORITHM=INPLACE\n-----------------\n\nALGORITHM=COPY can be incredibly slow, because the whole table has to be\ncopied and rebuilt. ALGORITHM=INPLACE was introduced as a way to avoid this by\nperforming operations in-place and avoiding the table copy and rebuild, when\npossible.\n\nWhen ALGORITHM=INPLACE is set, the underlying storage engine uses\noptimizations to perform the operation while avoiding the table copy and\nrebuild. However, INPLACE is a bit of a misnomer, since some operations may\nstill require the table to be rebuilt for some storage engines. Regardless,\nseveral operations can be performed without a full copy of the table for some\nstorage engines.\n\nA more accurate name would have been ALGORITHM=ENGINE, where ENGINE refers to\nan \"engine-specific\" algorithm.\n\nIf an ALTER TABLE operation supports ALGORITHM=INPLACE, then it can be\nperformed using optimizations by the underlying storage engine, but it may\nrebuilt.\n\nSee InnoDB Online DDL Operations with ALGORITHM=INPLACE for more.\n\nALGORITHM=NOCOPY\n----------------\n\nALGORITHM=NOCOPY was introduced in MariaDB 10.3.7.\n\nALGORITHM=INPLACE can sometimes be surprisingly slow in instances where it has\nto rebuild the clustered index, because when the clustered index has to be\nrebuilt, the whole table has to be rebuilt. ALGORITHM=NOCOPY was introduced as\na way to avoid this.\n\nIf an ALTER TABLE operation supports ALGORITHM=NOCOPY, then it can be\nperformed without rebuilding the clustered index.\n\nIf ALGORITHM=NOCOPY is specified for an ALTER TABLE operation that does not\nsupport ALGORITHM=NOCOPY, then an error will be raised. In this case, raising\nan error is preferable, if the alternative is for the operation to rebuild the\nclustered index, and perform unexpectedly slowly.\n\nSee InnoDB Online DDL Operations with ALGORITHM=NOCOPY for more.\n\nALGORITHM=INSTANT\n-----------------\n\nALGORITHM=INSTANT was introduced in MariaDB 10.3.7.\n\nALGORITHM=INPLACE can sometimes be surprisingly slow in instances where it has\nto modify data files. ALGORITHM=INSTANT was introduced as a way to avoid this.\n\nIf an ALTER TABLE operation supports ALGORITHM=INSTANT, then it can be\nperformed without modifying any data files.\n\nIf ALGORITHM=INSTANT is specified for an ALTER TABLE operation that does not\nsupport ALGORITHM=INSTANT, then an error will be raised. In this case, raising\nan error is preferable, if the alternative is for the operation to modify data\nfiles, and perform unexpectedly slowly.\n\nSee InnoDB Online DDL Operations with ALGORITHM=INSTANT for more.\n\nLOCK\n----\n\nThe ALTER TABLE statement supports the LOCK clause. This clause is one of the\nclauses that is used to implement online DDL. ALTER TABLE supports several\ndifferent locking strategies. A locking strategy can be explicitly chosen for\nan ALTER TABLE operation by setting the LOCK clause. The supported values are:\n\n* DEFAULT: Acquire the least restrictive lock on the table that is supported\nfor the specific operation. Permit the maximum amount of concurrency that is\nsupported for the specific operation.\n* NONE: Acquire no lock on the table. Permit all concurrent DML. If this\nlocking strategy is not permitted for an operation, then an error is raised.\n* SHARED: Acquire a read lock on the table. Permit read-only concurrent DML.\nIf this locking strategy is not permitted for an operation, then an error is\nraised.\n* EXCLUSIVE: Acquire a write lock on the table. Do not permit concurrent DML.\n\nDifferent storage engines support different locking strategies for different\noperations. If a specific locking strategy is chosen for an ALTER TABLE\noperation, and that table\'s storage engine does not support that locking\nstrategy for that specific operation, then an error will be raised.\n\nIf the LOCK clause is not explicitly set, then the operation uses LOCK=DEFAULT.\n\nALTER ONLINE TABLE is equivalent to LOCK=NONE. Therefore, the ALTER ONLINE\nTABLE statement can be used to ensure that your ALTER TABLE operation allows\nall concurrent DML.\n\nSee InnoDB Online DDL Overview: LOCK for information on how the LOCK clause\naffects InnoDB.\n\nProgress Reporting\n------------------\n\nMariaDB provides progress reporting for ALTER TABLE statement for clients that\nsupport the new progress reporting protocol. For example, if you were using\nthe mysql client, then the progress report might look like this::\n\nALTER TABLE test ENGINE=Aria;\nStage: 1 of 2 \'copy to tmp table\' 46% of stage\n\nThe progress report is also shown in the output of the SHOW PROCESSLIST\nstatement and in the contents of the information_schema.PROCESSLIST table.\n\nSee Progress Reporting for more information.\n\nAborting ALTER TABLE Operations\n-------------------------------\n\nIf an ALTER TABLE operation is being performed and the connection is killed,') WHERE help_topic_id = 691;
-update help_topic set description = CONCAT(description, '\nthe changes will be rolled back in a controlled manner. The rollback can be a\nslow operation as the time it takes is relative to how far the operation has\nprogressed.\n\nMariaDB starting with 10.2.13\n-----------------------------\nAborting ALTER TABLE ... ALGORITHM=COPY was made faster by removing excessive\nundo logging (MDEV-11415). This significantly shortens the time it takes to\nabort a running ALTER TABLE operation.\n\nAtomic ALTER TABLE\n------------------\n\nMariaDB starting with 10.6.1\n----------------------------\nFrom MariaDB 10.6, ALTER TABLE is atomic for most engines, including InnoDB,\nMyRocks, MyISAM and Aria (MDEV-25180). This means that if there is a crash\n(server down or power outage) during an ALTER TABLE operation, after recovery,\neither the old table and associated triggers and status will be intact, or the\nnew table will be active.\n\nIn older MariaDB versions one could get leftover #sql-alter..\',\n\'#sql-backup..\' or \'table_name.frmË\' files if the system crashed during the\nALTER TABLE operation.\n\nSee Atomic DDL for more information.\n\nReplication\n-----------\n\nMariaDB starting with 10.8.1\n----------------------------\nBefore MariaDB 10.8.1, ALTER TABLE got fully executed on the primary first,\nand only then was it replicated and started executing on replicas. From\nMariaDB 10.8.1, ALTER TABLE gains an option to replicate sooner and begin\nexecuting on replicas when it merely starts executing on the primary, not when\nit finishes. This way the replication lag caused by a heavy ALTER TABLE can be\ncompletely eliminated (MDEV-11675).\n\nExamples\n--------\n\nAdding a new column:\n\nALTER TABLE t1 ADD x INT;\n\nDropping a column:\n\nALTER TABLE t1 DROP x;\n\nModifying the type of a column:\n\nALTER TABLE t1 MODIFY x bigint unsigned;\n\nChanging the name and type of a column:\n\nALTER TABLE t1 CHANGE a b bigint unsigned auto_increment;\n\nCombining multiple clauses in a single ALTER TABLE statement, separated by\ncommas:\n\nALTER TABLE t1 DROP x, ADD x2 INT, CHANGE y y2 INT;\n\nChanging the storage engine and adding a comment:\n\nALTER TABLE t1 \n ENGINE = InnoDB\n COMMENT = \'First of three tables containing usage info\';\n\nRebuilding the table (the previous example will also rebuild the table if it\nwas already InnoDB):\n\nALTER TABLE t1 FORCE;\n\nDropping an index:\n\nALTER TABLE rooms DROP INDEX u;\n\nAdding a unique index:\n\nALTER TABLE rooms ADD UNIQUE INDEX u(room_number);\n\nFrom MariaDB 10.5.3, adding a primary key for an application-time period table\nwith a WITHOUT OVERLAPS constraint:\n\nALTER TABLE rooms ADD PRIMARY KEY(room_number, p WITHOUT OVERLAPS);\n\nFrom MariaDB 10.8.1, ALTER query can be replicated faster with the setting of\n\nSET @@SESSION.binlog_alter_two_phase = true;\n\nprior the ALTER query. Binlog would contain two event groups\n\n| master-bin.000001 | 495 | Gtid | 1 | 537 | GTID\n0-1-2 START ALTER |\n| master-bin.000001 | 537 | Query | 1 | 655 | use\n`test`; alter table t add column b int, algorithm=inplace |\n| master-bin.000001 | 655 | Gtid | 1 | 700 | GTID\n0-1-3 COMMIT ALTER id=2 |\n| master-bin.000001 | 700 | Query | 1 | 835 | use\n`test`; alter table t add column b int, algorithm=inplace |\n\nof which the first one gets delivered to replicas before ALTER is taken to\nactual execution on the primary.\n\nURL: https://mariadb.com/kb/en/alter-table/') WHERE help_topic_id = 691;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (692,38,'ALTER DATABASE','Modifies a database, changing its overall characteristics.\n\nSyntax\n------\n\nALTER {DATABASE | SCHEMA} [db_name]\n alter_specification ...\nALTER {DATABASE | SCHEMA} db_name\n UPGRADE DATA DIRECTORY NAME\n\nalter_specification:\n [DEFAULT] CHARACTER SET [=] charset_name\n | [DEFAULT] COLLATE [=] collation_name\n | COMMENT [=] \'comment\'\n\nDescription\n-----------\n\nALTER DATABASE enables you to change the overall characteristics of a\ndatabase. These characteristics are stored in the db.opt file in the database\ndirectory. To use ALTER DATABASE, you need the ALTER privilege on the\ndatabase. ALTER SCHEMA is a synonym for ALTER DATABASE.\n\nThe CHARACTER SET clause changes the default database character set. The\nCOLLATE clause changes the default database collation. See Character Sets and\nCollations for more.\n\nYou can see what character sets and collations are available using,\nrespectively, the SHOW CHARACTER SET and SHOW COLLATION statements.\n\nChanging the default character set/collation of a database does not change the\ncharacter set/collation of any stored procedures or stored functions that were\npreviously created, and relied on the defaults. These need to be dropped and\nrecreated in order to apply the character set/collation changes.\n\nThe database name can be omitted from the first syntax, in which case the\nstatement applies to the default database.\n\nThe syntax that includes the UPGRADE DATA DIRECTORY NAME clause was added in\nMySQL 5.1.23. It updates the name of the directory associated with the\ndatabase to use the encoding implemented in MySQL 5.1 for mapping database\nnames to database directory names (see Identifier to File Name Mapping). This\nclause is for use under these conditions:\n\n* It is intended when upgrading MySQL to 5.1 or later from older versions.\n* It is intended to update a database directory name to the current encoding\nformat if the name contains special characters that need encoding.\n* The statement is used by mysqlcheck (as invoked by mysql_upgrade).\n\nFor example,if a database in MySQL 5.0 has a name of a-b-c, the name contains\ninstance of the `-\' character. In 5.0, the database directory is also named\na-b-c, which is not necessarily safe for all file systems. In MySQL 5.1 and\nup, the same database name is encoded as a@002db@002dc to produce a file\nsystem-neutral directory name.\n\nWhen a MySQL installation is upgraded to MySQL 5.1 or later from an older\nversion,the server displays a name such as a-b-c (which is in the old format)\nas #mysql50#a-b-c, and you must refer to the name using the #mysql50# prefix.\nUse UPGRADE DATA DIRECTORY NAME in this case to explicitly tell the server to\nre-encode the database directory name to the current encoding format:\n\nALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME;\n\nAfter executing this statement, you can refer to the database as a-b-c without\nthe special #mysql50# prefix.\n\nCOMMENT\n-------\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, it is possible to add a comment of a maximum of 1024\nbytes. If the comment length exceeds this length, a error/warning code 4144 is\nthrown. The database comment is also added to the db.opt file, as well as to\nthe information_schema.schemata table.\n\nExamples\n--------\n\nALTER DATABASE test CHARACTER SET=\'utf8\' COLLATE=\'utf8_bin\';\n\nFrom MariaDB 10.5.0:\n\nALTER DATABASE p COMMENT=\'Presentations\';\n\nURL: https://mariadb.com/kb/en/alter-database/','','https://mariadb.com/kb/en/alter-database/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (693,38,'ALTER EVENT','Modifies one or more characteristics of an existing event.\n\nSyntax\n------\n\nALTER\n [DEFINER = { user | CURRENT_USER }]\n EVENT event_name\n [ON SCHEDULE schedule]\n [ON COMPLETION [NOT] PRESERVE]\n [RENAME TO new_event_name]\n [ENABLE | DISABLE | DISABLE ON SLAVE]\n [COMMENT \'comment\']\n [DO sql_statement]\n\nDescription\n-----------\n\nThe ALTER EVENT statement is used to change one or more of the characteristics\nof an existing event without the need to drop and recreate it. The syntax for\neach of the DEFINER, ON SCHEDULE, ON COMPLETION, COMMENT, ENABLE / DISABLE,\nand DO clauses is exactly the same as when used with CREATE EVENT.\n\nThis statement requires the EVENT privilege. When a user executes a successful\nALTER EVENT statement, that user becomes the definer for the affected event.\n\n(In MySQL 5.1.11 and earlier, an event could be altered only by its definer,\nor by a user having the SUPER privilege.)\n\nALTER EVENT works only with an existing event:\n\nALTER EVENT no_such_event ON SCHEDULE EVERY \'2:3\' DAY_HOUR;\nERROR 1539 (HY000): Unknown event \'no_such_event\'\n\nExamples\n--------\n\nALTER EVENT myevent \n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n\nURL: https://mariadb.com/kb/en/alter-event/','','https://mariadb.com/kb/en/alter-event/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (694,38,'ALTER FUNCTION','Syntax\n------\n\nALTER FUNCTION func_name [characteristic ...]\n\ncharacteristic:\n { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n\nDescription\n-----------\n\nThis statement can be used to change the characteristics of a stored function.\nMore than one change may be specified in an ALTER FUNCTION statement. However,\nyou cannot change the parameters or body of a stored function using this\nstatement; to make such changes, you must drop and re-create the function\nusing DROP FUNCTION and CREATE FUNCTION.\n\nYou must have the ALTER ROUTINE privilege for the function. (That privilege is\ngranted automatically to the function creator.) If binary logging is enabled,\nthe ALTER FUNCTION statement might also require the SUPER privilege, as\ndescribed in Binary Logging of Stored Routines.\n\nExample\n-------\n\nALTER FUNCTION hello SQL SECURITY INVOKER;\n\nURL: https://mariadb.com/kb/en/alter-function/','','https://mariadb.com/kb/en/alter-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (695,38,'ALTER LOGFILE GROUP','Syntax\n------\n\nALTER LOGFILE GROUP logfile_group\n ADD UNDOFILE \'file_name\'\n [INITIAL_SIZE [=] size]\n [WAIT]\n ENGINE [=] engine_name\n\nThe ALTER LOGFILE GROUP statement is not supported by MariaDB. It was\noriginally inherited from MySQL NDB Cluster. See MDEV-19295 for more\ninformation.\n\nURL: https://mariadb.com/kb/en/alter-logfile-group/','','https://mariadb.com/kb/en/alter-logfile-group/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (696,38,'ALTER PROCEDURE','Syntax\n------\n\nALTER PROCEDURE proc_name [characteristic ...]\n\ncharacteristic:\n { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n\nDescription\n-----------\n\nThis statement can be used to change the characteristics of a stored\nprocedure. More than one change may be specified in an ALTER PROCEDURE\nstatement. However, you cannot change the parameters or body of a stored\nprocedure using this statement. To make such changes, you must drop and\nre-create the procedure using either CREATE OR REPLACE PROCEDURE (since\nMariaDB 10.1.3) or DROP PROCEDURE and CREATE PROCEDURE (MariaDB 10.1.2 and\nbefore).\n\nYou must have the ALTER ROUTINE privilege for the procedure. By default, that\nprivilege is granted automatically to the procedure creator. See Stored\nRoutine Privileges.\n\nExample\n-------\n\nALTER PROCEDURE simpleproc SQL SECURITY INVOKER;\n\nURL: https://mariadb.com/kb/en/alter-procedure/','','https://mariadb.com/kb/en/alter-procedure/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (697,38,'ALTER SERVER','Syntax\n------\n\nALTER SERVER server_name\n OPTIONS (option [, option] ...)\n\nDescription\n-----------\n\nAlters the server information for server_name, adjusting the specified options\nas per the CREATE SERVER command. The corresponding fields in the\nmysql.servers table are updated accordingly. This statement requires the SUPER\nprivilege or, from MariaDB 10.5.2, the FEDERATED ADMIN privilege.\n\nALTER SERVER is not written to the binary log, irrespective of the binary log\nformat being used. From MariaDB 10.1.13, Galera replicates the CREATE SERVER,\nALTER SERVER and DROP SERVER statements.\n\nExamples\n--------\n\nALTER SERVER s OPTIONS (USER \'sally\');\n\nURL: https://mariadb.com/kb/en/alter-server/','','https://mariadb.com/kb/en/alter-server/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (698,38,'ALTER TABLESPACE','The ALTER TABLESPACE statement is not supported by MariaDB. It was originally\ninherited from MySQL NDB Cluster. In MySQL 5.7 and later, the statement is\nalso supported for InnoDB. However, MariaDB has chosen not to include that\nspecific feature. See MDEV-19294 for more information.\n\nURL: https://mariadb.com/kb/en/alter-tablespace/','','https://mariadb.com/kb/en/alter-tablespace/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (699,38,'ALTER VIEW','Syntax\n------\n\nALTER\n [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\n [DEFINER = { user | CURRENT_USER }]\n [SQL SECURITY { DEFINER | INVOKER }]\n VIEW view_name [(column_list)]\n AS select_statement\n [WITH [CASCADED | LOCAL] CHECK OPTION]\n\nDescription\n-----------\n\nThis statement changes the definition of a view, which must exist. The syntax\nis similar to that for CREATE VIEW and the effect is the same as for CREATE OR\nREPLACE VIEW if the view exists. This statement requires the CREATE VIEW and\nDROP privileges for the view, and some privilege for each column referred to\nin the SELECT statement. ALTER VIEW is allowed only to the definer or users\nwith the SUPER privilege.\n\nExample\n-------\n\nALTER VIEW v AS SELECT a, a*3 AS a2 FROM t;\n\nURL: https://mariadb.com/kb/en/alter-view/','','https://mariadb.com/kb/en/alter-view/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (700,38,'CREATE TABLE','Syntax\n------\n\nCREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name\n (create_definition,...) [table_options ]... [partition_options]\nCREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name\n [(create_definition,...)] [table_options ]... [partition_options]\n select_statement\nCREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name\n { LIKE old_table_name | (LIKE old_table_name) }\nselect_statement:\n [IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement)\n\nDescription\n-----------\n\nUse the CREATE TABLE statement to create a table with the given name.\n\nIn its most basic form, the CREATE TABLE statement provides a table name\nfollowed by a list of columns, indexes, and constraints. By default, the table\nis created in the default database. Specify a database with db_name.tbl_name.\nIf you quote the table name, you must quote the database name and table name\nseparately as `db_name`.`tbl_name`. This is particularly useful for CREATE\nTABLE ... SELECT, because it allows to create a table into a database, which\ncontains data from other databases. See Identifier Qualifiers.\n\nIf a table with the same name exists, error 1050 results. Use IF NOT EXISTS to\nsuppress this error and issue a note instead. Use SHOW WARNINGS to see notes.\n\nThe CREATE TABLE statement automatically commits the current transaction,\nexcept when using the TEMPORARY keyword.\n\nFor valid identifiers to use as table names, see Identifier Names.\n\nNote: if the default_storage_engine is set to ColumnStore then it needs\nsetting on all UMs. Otherwise when the tables using the default engine are\nreplicated across UMs they will use the wrong engine. You should therefore not\nuse this option as a session variable with ColumnStore.\n\nMicrosecond precision can be between 0-6. If no precision is specified it is\nassumed to be 0, for backward compatibility reasons.\n\nPrivileges\n----------\n\nExecuting the CREATE TABLE statement requires the CREATE privilege for the\ntable or the database.\n\nCREATE OR REPLACE\n-----------------\n\nIf the OR REPLACE clause is used and the table already exists, then instead of\nreturning an error, the server will drop the existing table and replace it\nwith the newly defined table.\n\nThis syntax was originally added to make replication more robust if it has to\nrollback and repeat statements such as CREATE ... SELECT on replicas.\n\nCREATE OR REPLACE TABLE table_name (a int);\n\nis basically the same as:\n\nDROP TABLE IF EXISTS table_name;\nCREATE TABLE table_name (a int);\n\nwith the following exceptions:\n\n* If table_name was locked with LOCK TABLES it will continue to be locked\nafter the statement.\n* Temporary tables are only dropped if the TEMPORARY keyword was used. (With\nDROP TABLE, temporary tables are preferred to be dropped before normal\ntables).\n\nThings to be Aware of With CREATE OR REPLACE\n--------------------------------------------\n\n* The table is dropped first (if it existed), after that the CREATE is done.\nBecause of this, if the CREATE fails, then the table will not exist anymore\nafter the statement. If the table was used with LOCK TABLES it will be\nunlocked.\n* One can\'t use OR REPLACE together with IF EXISTS.\n* Slaves in replication will by default use CREATE OR REPLACE when replicating\nCREATE statements that don\'\'t use IF EXISTS. This can be changed by setting\nthe variable slave-ddl-exec-mode to STRICT.\n\nCREATE TABLE IF NOT EXISTS\n--------------------------\n\nIf the IF NOT EXISTS clause is used, then the table will only be created if a\ntable with the same name does not already exist. If the table already exists,\nthen a warning will be triggered by default.\n\nCREATE TEMPORARY TABLE\n----------------------\n\nUse the TEMPORARY keyword to create a temporary table that is only available\nto the current session. Temporary tables are dropped when the session ends.\nTemporary table names are specific to the session. They will not conflict with\nother temporary tables from other sessions even if they share the same name.\nThey will shadow names of non-temporary tables or views, if they are\nidentical. A temporary table can have the same name as a non-temporary table\nwhich is located in the same database. In that case, their name will reference\nthe temporary table when used in SQL statements. You must have the CREATE\nTEMPORARY TABLES privilege on the database to create temporary tables. If no\nstorage engine is specified, the default_tmp_storage_engine setting will\ndetermine the engine.\n\nROCKSDB temporary tables cannot be created by setting the\ndefault_tmp_storage_engine system variable, or using CREATE TEMPORARY TABLE\nLIKE. Before MariaDB 10.7, they could be specified, but would silently fail,\nand a MyISAM table would be created instead. From MariaDB 10.7 an error is\nreturned. Explicitly creating a temporary table with ENGINE=ROCKSDB has never\nbeen permitted.\n\nCREATE TABLE ... LIKE\n---------------------\n\nUse the LIKE clause instead of a full table definition to create a table with\nthe same definition as another table, including columns, indexes, and table\noptions. Foreign key definitions, as well as any DATA DIRECTORY or INDEX\nDIRECTORY table options specified on the original table, will not be created.\n\nCREATE TABLE ... SELECT\n-----------------------\n\nYou can create a table containing data from other tables using the CREATE ...\nSELECT statement. Columns will be created in the table for each field returned\nby the SELECT query.\n\nYou can also define some columns normally and add other columns from a SELECT.\nYou can also create columns in the normal way and assign them some values\nusing the query, this is done to force a certain type or other field\ncharacteristics. The columns that are not named in the query will be placed\nbefore the others. For example:\n\nCREATE TABLE test (a INT NOT NULL, b CHAR(10)) ENGINE=MyISAM\n SELECT 5 AS b, c, d FROM another_table;\n\nRemember that the query just returns data. If you want to use the same\nindexes, or the same columns attributes ([NOT] NULL, DEFAULT, AUTO_INCREMENT)\nin the new table, you need to specify them manually. Types and sizes are not\nautomatically preserved if no data returned by the SELECT requires the full\nsize, and VARCHAR could be converted into CHAR. The CAST() function can be\nused to forcee the new table to use certain types.\n\nAliases (AS) are taken into account, and they should always be used when you\nSELECT an expression (function, arithmetical operation, etc).\n\nIf an error occurs during the query, the table will not be created at all.\n\nIf the new table has a primary key or UNIQUE indexes, you can use the IGNORE\nor REPLACE keywords to handle duplicate key errors during the query. IGNORE\nmeans that the newer values must not be inserted an identical value exists in\nthe index. REPLACE means that older values must be overwritten.\n\nIf the columns in the new table are more than the rows returned by the query,\nthe columns populated by the query will be placed after other columns. Note\nthat if the strict SQL_MODE is on, and the columns that are not names in the\nquery do not have a DEFAULT value, an error will raise and no rows will be\ncopied.\n\nConcurrent inserts are not used during the execution of a CREATE ... SELECT.\n\nIf the table already exists, an error similar to the following will be\nreturned:\n\nERROR 1050 (42S01): Table \'t\' already exists\n\nIf the IF NOT EXISTS clause is used and the table exists, a note will be\nproduced instead of an error.\n\nTo insert rows from a query into an existing table, INSERT ... SELECT can be\nused.\n\nColumn Definitions\n------------------\n\ncreate_definition:\n { col_name column_definition | index_definition | period_definition | CHECK\n(expr) }\ncolumn_definition:\n data_type\n [NOT NULL | NULL] [DEFAULT default_value | (expression)]\n [ON UPDATE [NOW | CURRENT_TIMESTAMP] [(precision)]]\n [AUTO_INCREMENT] [ZEROFILL] [UNIQUE [KEY] | [PRIMARY] KEY]\n [INVISIBLE] [{WITH|WITHOUT} SYSTEM VERSIONING]\n [COMMENT \'string\'] [REF_SYSTEM_ID = value]\n [reference_definition]\n | data_type [GENERATED ALWAYS]\n AS { { ROW {START|END} } | { (expression) [VIRTUAL | PERSISTENT | STORED] } }\n [UNIQUE [KEY]] [COMMENT \'string\']\nconstraint_definition:\n CONSTRAINT [constraint_name] CHECK (expression)\nNote: Until MariaDB 10.4, MariaDB accepts the shortcut format with a\nREFERENCES clause only in ALTER TABLE and CREATE TABLE statements, but that\nsyntax does nothing. For example:\n\nCREATE TABLE b(for_key INT REFERENCES a(not_key));\n\nMariaDB simply parses it without returning any error or warning, for\ncompatibility with other DBMS\'s. Before MariaDB 10.2.1 this was also true for\nCHECK constraints. However, only the syntax described below creates foreign\nkeys.\n\nFrom MariaDB 10.5, MariaDB will attempt to apply the constraint. See Foreign\nKeys examples.\n\nEach definition either creates a column in the table or specifies and index or\nconstraint on one or more columns. See Indexes below for details on creating\nindexes.\n\nCreate a column by specifying a column name and a data type, optionally\nfollowed by column options. See Data Types for a full list of data types\nallowed in MariaDB.\n\nNULL and NOT NULL\n-----------------\n\nUse the NULL or NOT NULL options to specify that values in the column may or\nmay not be NULL, respectively. By default, values may be NULL. See also NULL\nValues in MariaDB.\n\nDEFAULT Column Option\n---------------------\n\nMariaDB starting with 10.2.1\n----------------------------\nThe DEFAULT clause was enhanced in MariaDB 10.2.1. Some enhancements include\n\n* BLOB and TEXT columns now support DEFAULT.\n* The DEFAULT clause can now be used with an expression or function.\n\nSpecify a default value using the DEFAULT clause. If you don\'t specify DEFAULT\nthen the following rules apply:\n\n* If the column is not defined with NOT NULL, AUTO_INCREMENT or TIMESTAMP, an\nexplicit DEFAULT NULL will be added.\nNote that in MySQL and in MariaDB before 10.1.6, you may get an explicit\nDEFAULT for primary key parts, if not specified with NOT NULL.\n\nThe default value will be used if you INSERT a row without specifying a value\nfor that column, or if you specify DEFAULT for that column. Before MariaDB\n10.2.1 you couldn\'t usually provide an expression or function to evaluate at\ninsertion time. You had to provide a constant default value instead. The one\nexception is that you may use CURRENT_TIMESTAMP as the default value for a\nTIMESTAMP column to use the current timestamp at insertion time.\n\nCURRENT_TIMESTAMP may also be used as the default value for a DATETIME\n\nFrom MariaDB 10.2.1 you can use most functions in DEFAULT. Expressions should\nhave parentheses around them. If you use a non deterministic function in\nDEFAULT then all inserts to the table will be replicated in row mode. You can\neven refer to earlier columns in the DEFAULT expression (excluding\nAUTO_INCREMENT columns):\n\nCREATE TABLE t1 (a int DEFAULT (1+1), b int DEFAULT (a+1));\nCREATE TABLE t2 (a bigint primary key DEFAULT UUID_SHORT());\n\nThe DEFAULT clause cannot contain any stored functions or subqueries, and a\ncolumn used in the clause must already have been defined earlier in the\nstatement.\n\nSince MariaDB 10.2.1, it is possible to assign BLOB or TEXT columns a DEFAULT\nvalue. In earlier versions, assigning a default to these columns was not\npossible.\n\nMariaDB starting with 10.3.3\n----------------------------\nStarting from 10.3.3 you can also use DEFAULT (NEXT VALUE FOR sequence)\n\nAUTO_INCREMENT Column Option\n----------------------------\n\nUse AUTO_INCREMENT to create a column whose value can can be set automatically\nfrom a simple counter. You can only use AUTO_INCREMENT on a column with an\ninteger type. The column must be a key, and there can only be one\nAUTO_INCREMENT column in a table. If you insert a row without specifying a\nvalue for that column (or if you specify 0, NULL, or DEFAULT as the value),\nthe actual value will be taken from the counter, with each insertion\nincrementing the counter by one. You can still insert a value explicitly. If\nyou insert a value that is greater than the current counter value, the counter\nis set based on the new value. An AUTO_INCREMENT column is implicitly NOT\nNULL. Use LAST_INSERT_ID to get the AUTO_INCREMENT value most recently used by\nan INSERT statement.\n\nZEROFILL Column Option\n----------------------\n\nIf the ZEROFILL column option is specified for a column using a numeric data\ntype, then the column will be set to UNSIGNED and the spaces used by default\nto pad the field are replaced with zeros. ZEROFILL is ignored in expressions\nor as part of a UNION. ZEROFILL is a non-standard MySQL and MariaDB\nenhancement.\n\nPRIMARY KEY Column Option\n-------------------------\n\nUse PRIMARY KEY to make a column a primary key. A primary key is a special\ntype of a unique key. There can be at most one primary key per table, and it\nis implicitly NOT NULL.\n\nSpecifying a column as a unique key creates a unique index on that column. See\nthe Index Definitions section below for more information.\n\nUNIQUE KEY Column Option\n------------------------\n\nUse UNIQUE KEY (or just UNIQUE) to specify that all values in the column must\nbe distinct from each other. Unless the column is NOT NULL, there may be\nmultiple rows with NULL in the column.\n\nSpecifying a column as a unique key creates a unique index on that column. See\nthe Index Definitions section below for more information.\n\nCOMMENT Column Option\n---------------------\n\nYou can provide a comment for each column using the COMMENT clause. The\nmaximum length is 1024 characters. Use the SHOW FULL COLUMNS statement to see\ncolumn comments.\n\nREF_SYSTEM_ID\n-------------\n\nREF_SYSTEM_ID can be used to specify Spatial Reference System IDs for spatial\ndata type columns. For example:\n\nCREATE TABLE t1(g GEOMETRY(9,4) REF_SYSTEM_ID=101);\n\nGenerated Columns\n-----------------\n\nA generated column is a column in a table that cannot explicitly be set to a\nspecific value in a DML query. Instead, its value is automatically generated\nbased on an expression. This expression might generate the value based on the\nvalues of other columns in the table, or it might generate the value by\ncalling built-in functions or user-defined functions (UDFs).\n\nThere are two types of generated columns:\n\n* PERSISTENT or STORED: This type\'s value is actually stored in the table.','','https://mariadb.com/kb/en/create-table/');
-update help_topic set description = CONCAT(description, '\n* VIRTUAL: This type\'s value is not stored at all. Instead, the value is\ngenerated dynamically when the table is queried. This type is the default.\n\nGenerated columns are also sometimes called computed columns or virtual\ncolumns.\n\nFor a complete description about generated columns and their limitations, see\nGenerated (Virtual and Persistent/Stored) Columns.\n\nCOMPRESSED\n----------\n\nMariaDB starting with 10.3.3\n----------------------------\nCertain columns may be compressed. See Storage-Engine Independent Column\nCompression.\n\nINVISIBLE\n---------\n\nMariaDB starting with 10.3.3\n----------------------------\nColumns may be made invisible, and hidden in certain contexts. See Invisible\nColumns.\n\nWITH SYSTEM VERSIONING Column Option\n------------------------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nColumns may be explicitly marked as included from system versioning. See\nSystem-versioned tables for details.\n\nWITHOUT SYSTEM VERSIONING Column Option\n---------------------------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nColumns may be explicitly marked as excluded from system versioning. See\nSystem-versioned tables for details.\n\nIndex Definitions\n-----------------\n\nindex_definition:\n {INDEX|KEY} [index_name] [index_type] (index_col_name,...) [index_option]\n...\n {{{|}}} {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)\n[index_option] ...\n {{{|}}} [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)\n[index_option] ...\n {{{|}}} [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type]\n(index_col_name,...) [index_option] ...\n {{{|}}} [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)\nreference_definition\n\nindex_col_name:\n col_name [(length)] [ASC | DESC]\n\nindex_type:\n USING {BTREE | HASH | RTREE}\n\nindex_option:\n [ KEY_BLOCK_SIZE [=] value\n {{{|}}} index_type\n {{{|}}} WITH PARSER parser_name\n {{{|}}} COMMENT \'string\'\n {{{|}}} CLUSTERING={YES| NO} ]\n [ IGNORED | NOT IGNORED ]\n\nreference_definition:\n REFERENCES tbl_name (index_col_name,...)\n [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]\n [ON DELETE reference_option]\n [ON UPDATE reference_option]\n\nreference_option:\n RESTRICT | CASCADE | SET NULL | NO ACTION\n\nINDEX and KEY are synonyms.\n\nIndex names are optional, if not specified an automatic name will be assigned.\nIndex name are needed to drop indexes and appear in error messages when a\nconstraint is violated.\n\nIndex Categories\n----------------\n\nPlain Indexes\n-------------\n\nPlain indexes are regular indexes that are not unique, and are not acting as a\nprimary key or a foreign key. They are also not the \"specialized\" FULLTEXT or\nSPATIAL indexes.\n\nSee Getting Started with Indexes: Plain Indexes for more information.\n\nPRIMARY KEY\n-----------\n\nFor PRIMARY KEY indexes, you can specify a name for the index, but it is\nignored, and the name of the index is always PRIMARY. From MariaDB 10.3.18 and\nMariaDB 10.4.8, a warning is explicitly issued if a name is specified. Before\nthen, the name was silently ignored.\n\nSee Getting Started with Indexes: Primary Key for more information.\n\nUNIQUE\n------\n\nThe UNIQUE keyword means that the index will not accept duplicated values,\nexcept for NULLs. An error will raise if you try to insert duplicate values in\na UNIQUE index.\n\nFor UNIQUE indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nSee Getting Started with Indexes: Unique Index for more information.\n\nFOREIGN KEY\n-----------\n\nFor FOREIGN KEY indexes, a reference definition must be provided.\n\nFor FOREIGN KEY indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nFirst, you have to specify the name of the target (parent) table and a column\nor a column list which must be indexed and whose values must match to the\nforeign key\'s values. The MATCH clause is accepted to improve the\ncompatibility with other DBMS\'s, but has no meaning in MariaDB. The ON DELETE\nand ON UPDATE clauses specify what must be done when a DELETE (or a REPLACE)\nstatements attempts to delete a referenced row from the parent table, and when\nan UPDATE statement attempts to modify the referenced foreign key columns in a\nparent table row, respectively. The following options are allowed:\n\n* RESTRICT: The delete/update operation is not performed. The statement\nterminates with a 1451 error (SQLSTATE \'2300\').\n* NO ACTION: Synonym for RESTRICT.\n* CASCADE: The delete/update operation is performed in both tables.\n* SET NULL: The update or delete goes ahead in the parent table, and the\ncorresponding foreign key fields in the child table are set to NULL. (They\nmust not be defined as NOT NULL for this to succeed).\n* SET DEFAULT: This option is currently implemented only for the PBXT storage\nengine, which is disabled by default and no longer maintained. It sets the\nchild table\'s foreign key fields to their DEFAULT values when the referenced\nparent table key entries are updated or deleted.\n\nIf either clause is omitted, the default behavior for the omitted clause is\nRESTRICT.\n\nSee Foreign Keys for more information.\n\nFULLTEXT\n--------\n\nUse the FULLTEXT keyword to create full-text indexes.\n\nSee Full-Text Indexes for more information.\n\nSPATIAL\n-------\n\nUse the SPATIAL keyword to create geometric indexes.\n\nSee SPATIAL INDEX for more information.\n\nIndex Options\n-------------\n\nKEY_BLOCK_SIZE Index Option\n---------------------------\n\nThe KEY_BLOCK_SIZE index option is similar to the KEY_BLOCK_SIZE table option.\n\nWith the InnoDB storage engine, if you specify a non-zero value for the\nKEY_BLOCK_SIZE table option for the whole table, then the table will\nimplicitly be created with the ROW_FORMAT table option set to COMPRESSED.\nHowever, this does not happen if you just set the KEY_BLOCK_SIZE index option\nfor one or more indexes in the table. The InnoDB storage engine ignores the\nKEY_BLOCK_SIZE index option. However, the SHOW CREATE TABLE statement may\nstill report it for the index.\n\nFor information about the KEY_BLOCK_SIZE index option, see the KEY_BLOCK_SIZE\ntable option below.\n\nIndex Types\n-----------\n\nEach storage engine supports some or all index types. See Storage Engine Index\nTypes for details on permitted index types for each storage engine.\n\nDifferent index types are optimized for different kind of operations:\n\n* BTREE is the default type, and normally is the best choice. It is supported\nby all storage engines. It can be used to compare a column\'s value with a\nvalue using the =, >, >=, <, <=, BETWEEN, and LIKE operators. BTREE can also\nbe used to find NULL values. Searches against an index prefix are possible.\n* HASH is only supported by the MEMORY storage engine. HASH indexes can only\nbe used for =, <=, and >= comparisons. It can not be used for the ORDER BY\nclause. Searches against an index prefix are not possible.\n* RTREE is the default for SPATIAL indexes, but if the storage engine does not\nsupport it BTREE can be used.\n\nIndex columns names are listed between parenthesis. After each column, a\nprefix length can be specified. If no length is specified, the whole column\nwill be indexed. ASC and DESC can be specified for compatibility with are\nDBMS\'s, but have no meaning in MariaDB.\n\nWITH PARSER Index Option\n------------------------\n\nThe WITH PARSER index option only applies to FULLTEXT indexes and contains the\nfulltext parser name. The fulltext parser must be an installed plugin.\n\nCOMMENT Index Option\n--------------------\n\nA comment of up to 1024 characters is permitted with the COMMENT index option.\n\nThe COMMENT index option allows you to specify a comment with user-readable\ntext describing what the index is for. This information is not used by the\nserver itself.\n\nCLUSTERING Index Option\n-----------------------\n\nThe CLUSTERING index option is only valid for tables using the TokuDB storage\nengine.\n\nIGNORED / NOT IGNORED\n---------------------\n\nMariaDB starting with 10.6.0\n----------------------------\nFrom MariaDB 10.6.0, indexes can be specified to be ignored by the optimizer.\nSee Ignored Indexes.\n\nPeriods\n-------\n\nMariaDB starting with 10.3.4\n----------------------------\n\nperiod_definition:\n PERIOD FOR SYSTEM_TIME (start_column_name, end_column_name)\nMariaDB supports a subset of the standard syntax for periods. At the moment\nit\'s only used for creating System-versioned tables. Both columns must be\ncreated, must be either of a TIMESTAMP(6) or BIGINT UNSIGNED type, and be\ngenerated as ROW START and ROW END accordingly. See System-versioned tables\nfor details.\n\nThe table must also have the WITH SYSTEM VERSIONING clause.\n\nConstraint Expressions\n----------------------\n\nMariaDB starting with 10.2.1\n----------------------------\nMariaDB 10.2.1 introduced new ways to define a constraint.\n\nNote: Before MariaDB 10.2.1, constraint expressions were accepted in the\nsyntax but ignored.\n\nMariaDB 10.2.1 introduced two ways to define a constraint:\n\n* CHECK(expression) given as part of a column definition.\n* CONSTRAINT [constraint_name] CHECK (expression)\n\nBefore a row is inserted or updated, all constraints are evaluated in the\norder they are defined. If any constraints fails, then the row will not be\nupdated. One can use most deterministic functions in a constraint, including\nUDFs.\n\ncreate table t1 (a int check(a>0) ,b int check (b> 0), constraint abc check\n(a>b));\n\nIf you use the second format and you don\'t give a name to the constraint, then\nthe constraint will get a auto generated name. This is done so that you can\nlater delete the constraint with ALTER TABLE DROP constraint_name.\n\nOne can disable all constraint expression checks by setting the variable\ncheck_constraint_checks to OFF. This is useful for example when loading a\ntable that violates some constraints that you want to later find and fix in\nSQL.\n\nSee CONSTRAINT for more information.\n\nTable Options\n-------------\n\nFor each individual table you create (or alter), you can set some table\noptions. The general syntax for setting options is:\n\n<OPTION_NAME> = <option_value>, [<OPTION_NAME> = <option_value> ...]\n\nThe equal sign is optional.\n\nSome options are supported by the server and can be used for all tables, no\nmatter what storage engine they use; other options can be specified for all\nstorage engines, but have a meaning only for some engines. Also, engines can\nextend CREATE TABLE with new options.\n\nIf the IGNORE_BAD_TABLE_OPTIONS SQL_MODE is enabled, wrong table options\ngenerate a warning; otherwise, they generate an error.\n\ntable_option: \n [STORAGE] ENGINE [=] engine_name\n | AUTO_INCREMENT [=] value\n | AVG_ROW_LENGTH [=] value\n | [DEFAULT] CHARACTER SET [=] charset_name\n | CHECKSUM [=] {0 | 1}\n | [DEFAULT] COLLATE [=] collation_name\n | COMMENT [=] \'string\'\n | CONNECTION [=] \'connect_string\'\n | DATA DIRECTORY [=] \'absolute path to directory\'\n | DELAY_KEY_WRITE [=] {0 | 1}\n | ENCRYPTED [=] {YES | NO}\n | ENCRYPTION_KEY_ID [=] value\n | IETF_QUOTES [=] {YES | NO}\n | INDEX DIRECTORY [=] \'absolute path to directory\'\n | INSERT_METHOD [=] { NO | FIRST | LAST }\n | KEY_BLOCK_SIZE [=] value\n | MAX_ROWS [=] value\n | MIN_ROWS [=] value\n | PACK_KEYS [=] {0 | 1 | DEFAULT}\n | PAGE_CHECKSUM [=] {0 | 1}\n | PAGE_COMPRESSED [=] {0 | 1}\n | PAGE_COMPRESSION_LEVEL [=] {0 .. 9}\n | PASSWORD [=] \'string\'\n | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT|PAGE}\n | SEQUENCE [=] {0|1}\n | STATS_AUTO_RECALC [=] {DEFAULT|0|1}\n | STATS_PERSISTENT [=] {DEFAULT|0|1}\n | STATS_SAMPLE_PAGES [=] {DEFAULT|value}\n | TABLESPACE tablespace_name\n | TRANSACTIONAL [=] {0 | 1}\n | UNION [=] (tbl_name[,tbl_name]...)\n | WITH SYSTEM VERSIONING\n\n[STORAGE] ENGINE\n----------------\n\n[STORAGE] ENGINE specifies a storage engine for the table. If this option is\nnot used, the default storage engine is used instead. That is, the\ndefault_storage_engine session option value if it is set, or the value\nspecified for the --default-storage-engine mysqld startup option, or the\ndefault storage engine, InnoDB. If the specified storage engine is not\ninstalled and active, the default value will be used, unless the\nNO_ENGINE_SUBSTITUTION SQL MODE is set (default). This is only true for CREATE\nTABLE, not for ALTER TABLE. For a list of storage engines that are present in\nyour server, issue a SHOW ENGINES.\n\nAUTO_INCREMENT\n--------------\n\nAUTO_INCREMENT specifies the initial value for the AUTO_INCREMENT primary key.\nThis works for MyISAM, Aria, InnoDB, MEMORY, and ARCHIVE tables. You can\nchange this option with ALTER TABLE, but in that case the new value must be\nhigher than the highest value which is present in the AUTO_INCREMENT column.\nIf the storage engine does not support this option, you can insert (and then\ndelete) a row having the wanted value - 1 in the AUTO_INCREMENT column.\n\nAVG_ROW_LENGTH\n--------------\n\nAVG_ROW_LENGTH is the average rows size. It only applies to tables using\nMyISAM and Aria storage engines that have the ROW_FORMAT table option set to\nFIXED format.\n\nMyISAM uses MAX_ROWS and AVG_ROW_LENGTH to decide the maximum size of a table\n(default: 256TB, or the maximum file size allowed by the system).\n\n[DEFAULT] CHARACTER SET/CHARSET\n-------------------------------\n\n[DEFAULT] CHARACTER SET (or [DEFAULT] CHARSET) is used to set a default\ncharacter set for the table. This is the character set used for all columns\nwhere an explicit character set is not specified. If this option is omitted or\nDEFAULT is specified, database\'s default character set will be used. See\nSetting Character Sets and Collations for details on setting the character\nsets.\n\nCHECKSUM/TABLE_CHECKSUM\n-----------------------\n\nCHECKSUM (or TABLE_CHECKSUM) can be set to 1 to maintain a live checksum for\nall table\'s rows. This makes write operations slower, but CHECKSUM TABLE will\nbe very fast. This option is only supported for MyISAM and Aria tables.\n\n[DEFAULT] COLLATE\n-----------------\n\n[DEFAULT] COLLATE is used to set a default collation for the table. This is\nthe collation used for all columns where an explicit character set is not\nspecified. If this option is omitted or DEFAULT is specified, database\'s') WHERE help_topic_id = 700;
-update help_topic set description = CONCAT(description, '\ndefault option will be used. See Setting Character Sets and Collations for\ndetails on setting the collations\n\nCOMMENT\n-------\n\nCOMMENT is a comment for the table. The maximum length is 2048 characters.\nAlso used to define table parameters when creating a Spider table.\n\nCONNECTION\n----------\n\nCONNECTION is used to specify a server name or a connection string for a\nSpider, CONNECT, Federated or FederatedX table.\n\nDATA DIRECTORY/INDEX DIRECTORY\n------------------------------\n\nDATA DIRECTORY and INDEX DIRECTORY are supported for MyISAM and Aria, and DATA\nDIRECTORY is also supported by InnoDB if the innodb_file_per_table server\nsystem variable is enabled, but only in CREATE TABLE, not in ALTER TABLE. So,\ncarefully choose a path for InnoDB tables at creation time, because it cannot\nbe changed without dropping and re-creating the table. These options specify\nthe paths for data files and index files, respectively. If these options are\nomitted, the database\'s directory will be used to store data files and index\nfiles. Note that these table options do not work for partitioned tables (use\nthe partition options instead), or if the server has been invoked with the\n--skip-symbolic-links startup option. To avoid the overwriting of old files\nwith the same name that could be present in the directories, you can use the\n--keep_files_on_create option (an error will be issued if files already\nexist). These options are ignored if the NO_DIR_IN_CREATE SQL_MODE is enabled\n(useful for replication slaves). Also note that symbolic links cannot be used\nfor InnoDB tables.\n\nDATA DIRECTORY works by creating symlinks from where the table would normally\nhave been (inside the datadir) to where the option specifies. For security\nreasons, to avoid bypassing the privilege system, the server does not permit\nsymlinks inside the datadir. Therefore, DATA DIRECTORY cannot be used to\nspecify a location inside the datadir. An attempt to do so will result in an\nerror 1210 (HY000) Incorrect arguments to DATA DIRECTORY.\n\nDELAY_KEY_WRITE\n---------------\n\nDELAY_KEY_WRITE is supported by MyISAM and Aria, and can be set to 1 to speed\nup write operations. In that case, when data are modified, the indexes are not\nupdated until the table is closed. Writing the changes to the index file\naltogether can be much faster. However, note that this option is applied only\nif the delay_key_write server variable is set to \'ON\'. If it is \'OFF\' the\ndelayed index writes are always disabled, and if it is \'ALL\' the delayed index\nwrites are always used, disregarding the value of DELAY_KEY_WRITE.\n\nENCRYPTED\n---------\n\nThe ENCRYPTED table option can be used to manually set the encryption status\nof an InnoDB table. See InnoDB Encryption for more information.\n\nAria does not support the ENCRYPTED table option. See MDEV-18049.\n\nSee Data-at-Rest Encryption for more information.\n\nENCRYPTION_KEY_ID\n-----------------\n\nThe ENCRYPTION_KEY_ID table option can be used to manually set the encryption\nkey of an InnoDB table. See InnoDB Encryption for more information.\n\nAria does not support the ENCRYPTION_KEY_ID table option. See MDEV-18049.\n\nSee Data-at-Rest Encryption for more information.\n\nIETF_QUOTES\n-----------\n\nFor the CSV storage engine, the IETF_QUOTES option, when set to YES, enables\nIETF-compatible parsing of embedded quote and comma characters. Enabling this\noption for a table improves compatibility with other tools that use CSV, but\nis not compatible with MySQL CSV tables, or MariaDB CSV tables created without\nthis option. Disabled by default.\n\nINSERT_METHOD\n-------------\n\nINSERT_METHOD is only used with MERGE tables. This option determines in which\nunderlying table the new rows should be inserted. If you set it to \'NO\' (which\nis the default) no new rows can be added to the table (but you will still be\nable to perform INSERTs directly against the underlying tables). FIRST means\nthat the rows are inserted into the first table, and LAST means that thet are\ninserted into the last table.\n\nKEY_BLOCK_SIZE\n--------------\n\nKEY_BLOCK_SIZE is used to determine the size of key blocks, in bytes or\nkilobytes. However, this value is just a hint, and the storage engine could\nmodify or ignore it. If KEY_BLOCK_SIZE is set to 0, the storage engine\'s\ndefault value will be used.\n\nWith the InnoDB storage engine, if you specify a non-zero value for the\nKEY_BLOCK_SIZE table option for the whole table, then the table will\nimplicitly be created with the ROW_FORMAT table option set to COMPRESSED.\n\nMIN_ROWS/MAX_ROWS\n-----------------\n\nMIN_ROWS and MAX_ROWS let the storage engine know how many rows you are\nplanning to store as a minimum and as a maximum. These values will not be used\nas real limits, but they help the storage engine to optimize the table.\nMIN_ROWS is only used by MEMORY storage engine to decide the minimum memory\nthat is always allocated. MAX_ROWS is used to decide the minimum size for\nindexes.\n\nPACK_KEYS\n---------\n\nPACK_KEYS can be used to determine whether the indexes will be compressed. Set\nit to 1 to compress all keys. With a value of 0, compression will not be used.\nWith the DEFAULT value, only long strings will be compressed. Uncompressed\nkeys are faster.\n\nPAGE_CHECKSUM\n-------------\n\nPAGE_CHECKSUM is only applicable to Aria tables, and determines whether\nindexes and data should use page checksums for extra safety.\n\nPAGE_COMPRESSED\n---------------\n\nPAGE_COMPRESSED is used to enable InnoDB page compression for InnoDB tables.\n\nPAGE_COMPRESSION_LEVEL\n----------------------\n\nPAGE_COMPRESSION_LEVEL is used to set the compression level for InnoDB page\ncompression for InnoDB tables. The table must also have the PAGE_COMPRESSED\ntable option set to 1.\n\nValid values for PAGE_COMPRESSION_LEVEL are 1 (the best speed) through 9 (the\nbest compression), .\n\nPASSWORD\n--------\n\nPASSWORD is unused.\n\nRAID_TYPE\n---------\n\nRAID_TYPE is an obsolete option, as the raid support has been disabled since\nMySQL 5.0.\n\nROW_FORMAT\n----------\n\nThe ROW_FORMAT table option specifies the row format for the data file.\nPossible values are engine-dependent.\n\nSupported MyISAM Row Formats\n----------------------------\n\nFor MyISAM, the supported row formats are:\n\n* FIXED\n* DYNAMIC\n* COMPRESSED\n\nThe COMPRESSED row format can only be set by the myisampack command line tool.\n\nSee MyISAM Storage Formats for more information.\n\nSupported Aria Row Formats\n--------------------------\n\nFor Aria, the supported row formats are:\n\n* PAGE\n* FIXED\n* DYNAMIC.\n\nSee Aria Storage Formats for more information.\n\nSupported InnoDB Row Formats\n----------------------------\n\nFor InnoDB, the supported row formats are:\n\n* COMPACT\n* REDUNDANT\n* COMPRESSED\n* DYNAMIC.\n\nIf the ROW_FORMAT table option is set to FIXED for an InnoDB table, then the\nserver will either return an error or a warning depending on the value of the\ninnodb_strict_mode system variable. If the innodb_strict_mode system variable\nis set to OFF, then a warning is issued, and MariaDB will create the table\nusing the default row format for the specific MariaDB server version. If the\ninnodb_strict_mode system variable is set to ON, then an error will be raised.\n\nSee InnoDB Storage Formats for more information.\n\nOther Storage Engines and ROW_FORMAT\n------------------------------------\n\nOther storage engines do not support the ROW_FORMAT table option.\n\nSEQUENCE\n--------\n\nMariaDB starting with 10.3\n--------------------------\nIf the table is a sequence, then it will have the SEQUENCE set to 1.\n\nSTATS_AUTO_RECALC\n-----------------\n\nSTATS_AUTO_RECALC indicates whether to automatically recalculate persistent\nstatistics (see STATS_PERSISTENT, below) for an InnoDB table. If set to 1,\nstatistics will be recalculated when more than 10% of the data has changed.\nWhen set to 0, stats will be recalculated only when an ANALYZE TABLE is run.\nIf set to DEFAULT, or left out, the value set by the innodb_stats_auto_recalc\nsystem variable applies. See InnoDB Persistent Statistics.\n\nSTATS_PERSISTENT\n----------------\n\nSTATS_PERSISTENT indicates whether the InnoDB statistics created by ANALYZE\nTABLE will remain on disk or not. It can be set to 1 (on disk), 0 (not on\ndisk, the pre-MariaDB 10 behavior), or DEFAULT (the same as leaving out the\noption), in which case the value set by the innodb_stats_persistent system\nvariable will apply. Persistent statistics stored on disk allow the statistics\nto survive server restarts, and provide better query plan stability. See\nInnoDB Persistent Statistics.\n\nSTATS_SAMPLE_PAGES\n------------------\n\nSTATS_SAMPLE_PAGES indicates how many pages are used to sample index\nstatistics. If 0 or DEFAULT, the default value, the innodb_stats_sample_pages\nvalue is used. See InnoDB Persistent Statistics.\n\nTRANSACTIONAL\n-------------\n\nTRANSACTIONAL is only applicable for Aria tables. In future Aria tables\ncreated with this option will be fully transactional, but currently this\nprovides a form of crash protection. See Aria Storage Engine for more details.\n\nUNION\n-----\n\nUNION must be specified when you create a MERGE table. This option contains a\ncomma-separated list of MyISAM tables which are accessed by the new table. The\nlist is enclosed between parenthesis. Example: UNION = (t1,t2)\n\nWITH SYSTEM VERSIONING\n----------------------\n\nWITH SYSTEM VERSIONING is used for creating System-versioned tables.\n\nPartitions\n----------\n\npartition_options:\n PARTITION BY\n { [LINEAR] HASH(expr)\n | [LINEAR] KEY(column_list)\n | RANGE(expr)\n | LIST(expr)\n | SYSTEM_TIME [INTERVAL time_quantity time_unit] [LIMIT num] }\n [PARTITIONS num]\n [SUBPARTITION BY\n { [LINEAR] HASH(expr)\n | [LINEAR] KEY(column_list) }\n [SUBPARTITIONS num]\n ]\n [(partition_definition [, partition_definition] ...)]\npartition_definition:\n PARTITION partition_name\n [VALUES {LESS THAN {(expr) | MAXVALUE} | IN (value_list)}]\n [[STORAGE] ENGINE [=] engine_name]\n [COMMENT [=] \'comment_text\' ]\n [DATA DIRECTORY [=] \'data_dir\']\n [INDEX DIRECTORY [=] \'index_dir\']\n [MAX_ROWS [=] max_number_of_rows]\n [MIN_ROWS [=] min_number_of_rows]\n [TABLESPACE [=] tablespace_name]\n [NODEGROUP [=] node_group_id]\n [(subpartition_definition [, subpartition_definition] ...)]\nsubpartition_definition:\n SUBPARTITION logical_name\n [[STORAGE] ENGINE [=] engine_name]\n [COMMENT [=] \'comment_text\' ]\n [DATA DIRECTORY [=] \'data_dir\']\n [INDEX DIRECTORY [=] \'index_dir\']\n [MAX_ROWS [=] max_number_of_rows]\n [MIN_ROWS [=] min_number_of_rows]\n [TABLESPACE [=] tablespace_name]\n [NODEGROUP [=] node_group_id]\nIf the PARTITION BY clause is used, the table will be partitioned. A partition\nmethod must be explicitly indicated for partitions and subpartitions.\nPartition methods are:\n\n* [LINEAR] HASH creates a hash key which will be used to read and write rows.\nThe partition function can be any valid SQL expression which returns an\nINTEGER number. Thus, it is possible to use the HASH method on an integer\ncolumn, or on functions which accept integer columns as an argument. However,\nVALUES LESS THAN and VALUES IN clauses can not be used with HASH. An example:\n\nCREATE TABLE t1 (a INT, b CHAR(5), c DATETIME)\n PARTITION BY HASH ( YEAR(c) );\n\n[LINEAR] HASH can be used for subpartitions, too.\n\n* [LINEAR] KEY is similar to HASH, but the index has an even distribution of\ndata. Also, the expression can only be a column or a list of columns. VALUES\nLESS THAN and VALUES IN clauses can not be used with KEY.\n* RANGE partitions the rows using on a range of values, using the VALUES LESS\nTHAN operator. VALUES IN is not allowed with RANGE. The partition function can\nbe any valid SQL expression which returns a single value.\n* LIST assigns partitions based on a table\'s column with a restricted set of\npossible values. It is similar to RANGE, but VALUES IN must be used for at\nleast 1 columns, and VALUES LESS THAN is disallowed.\n* SYSTEM_TIME partitioning is used for System-versioned tables to store\nhistorical data separately from current data.\n\nOnly HASH and KEY can be used for subpartitions, and they can be [LINEAR].\n\nIt is possible to define up to 1024 partitions and subpartitions.\n\nThe number of defined partitions can be optionally specified as PARTITION\ncount. This can be done to avoid specifying all partitions individually. But\nyou can also declare each individual partition and, additionally, specify a\nPARTITIONS count clause; in the case, the number of PARTITIONs must equal\ncount.\n\nAlso see Partitioning Types Overview.\n\nSequences\n---------\n\nMariaDB starting with 10.3\n--------------------------\nCREATE TABLE can also be used to create a SEQUENCE. See CREATE SEQUENCE and\nSequence Overview.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL. CREATE TABLE is atomic, except for CREATE\nOR REPLACE, which is only crash safe.\n\nExamples\n--------\n\ncreate table if not exists test (\na bigint auto_increment primary key,\nname varchar(128) charset utf8,\nkey name (name(32))\n) engine=InnoDB default charset latin1;\n\nThis example shows a couple of things:\n\n* Usage of IF NOT EXISTS; If the table already existed, it will not be\ncreated. There will not be any error for the client, just a warning.\n* How to create a PRIMARY KEY that is automatically generated.\n* How to specify a table-specific character set and another for a column.\n* How to create an index (name) that is only partly indexed (to save space).\n\nThe following clauses will work from MariaDB 10.2.1 only.\n\nCREATE TABLE t1(\n a int DEFAULT (1+1),\n b int DEFAULT (a+1),\n expires DATETIME DEFAULT(NOW() + INTERVAL 1 YEAR),\n x BLOB DEFAULT USER()\n);\n\nURL: https://mariadb.com/kb/en/create-table/') WHERE help_topic_id = 700;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (701,38,'DROP TABLE','Syntax\n------\n\nDROP [TEMPORARY] TABLE [IF EXISTS] [/*COMMENT TO SAVE*/]\n tbl_name [, tbl_name] ...\n [WAIT n|NOWAIT]\n [RESTRICT | CASCADE]\n\nDescription\n-----------\n\nDROP TABLE removes one or more tables. You must have the DROP privilege for\neach table. All table data and the table definition are removed, as well as\ntriggers associated to the table, so be careful with this statement! If any of\nthe tables named in the argument list do not exist, MariaDB returns an error\nindicating by name which non-existing tables it was unable to drop, but it\nalso drops all of the tables in the list that do exist.\n\nImportant: When a table is dropped, user privileges on the table are not\nautomatically dropped. See GRANT.\n\nIf another thread is using the table in an explicit transaction or an\nautocommit transaction, then the thread acquires a metadata lock (MDL) on the\ntable. The DROP TABLE statement will wait in the \"Waiting for table metadata\nlock\" thread state until the MDL is released. MDLs are released in the\nfollowing cases:\n\n* If an MDL is acquired in an explicit transaction, then the MDL will be\nreleased when the transaction ends.\n* If an MDL is acquired in an autocommit transaction, then the MDL will be\nreleased when the statement ends.\n* Transactional and non-transactional tables are handled the same.\n\nNote that for a partitioned table, DROP TABLE permanently removes the table\ndefinition, all of its partitions, and all of the data which was stored in\nthose partitions. It also removes the partitioning definition (.par) file\nassociated with the dropped table.\n\nFor each referenced table, DROP TABLE drops a temporary table with that name,\nif it exists. If it does not exist, and the TEMPORARY keyword is not used, it\ndrops a non-temporary table with the same name, if it exists. The TEMPORARY\nkeyword ensures that a non-temporary table will not accidentally be dropped.\n\nUse IF EXISTS to prevent an error from occurring for tables that do not exist.\nA NOTE is generated for each non-existent table when using IF EXISTS. See SHOW\nWARNINGS.\n\nIf a foreign key references this table, the table cannot be dropped. In this\ncase, it is necessary to drop the foreign key first.\n\nRESTRICT and CASCADE are allowed to make porting from other database systems\neasier. In MariaDB, they do nothing.\n\nThe comment before the table names (/*COMMENT TO SAVE*/) is stored in the\nbinary log. That feature can be used by replication tools to send their\ninternal messages.\n\nIt is possible to specify table names as db_name.tab_name. This is useful to\ndelete tables from multiple databases with one statement. See Identifier\nQualifiers for details.\n\nThe DROP privilege is required to use DROP TABLE on non-temporary tables. For\ntemporary tables, no privilege is required, because such tables are only\nvisible for the current session.\n\nNote: DROP TABLE automatically commits the current active transaction, unless\nyou use the TEMPORARY keyword.\n\nMariaDB starting with 10.5.4\n----------------------------\nFrom MariaDB 10.5.4, DROP TABLE reliably deletes table remnants inside a\nstorage engine even if the .frm file is missing. Before then, a missing .frm\nfile would result in the statement failing.\n\nMariaDB starting with 10.3.1\n----------------------------\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nDROP TABLE in replication\n-------------------------\n\nDROP TABLE has the following characteristics in replication:\n\n* DROP TABLE IF EXISTS are always logged.\n* DROP TABLE without IF EXISTS for tables that don\'t exist are not written to\nthe binary log.\n* Dropping of TEMPORARY tables are prefixed in the log with TEMPORARY. These\ndrops are only logged when running statement or mixed mode replication.\n* One DROP TABLE statement can be logged with up to 3 different DROP\nstatements:\nDROP TEMPORARY TABLE list_of_non_transactional_temporary_tables\nDROP TEMPORARY TABLE list_of_transactional_temporary_tables\nDROP TABLE list_of_normal_tables\n\nDROP TABLE on the primary is treated on the replica as DROP TABLE IF EXISTS.\nYou can change that by setting slave-ddl-exec-mode to STRICT.\n\nDropping an Internal #sql-... Table\n-----------------------------------\n\nFrom MariaDB 10.6, DROP TABLE is atomic and the following does not apply.\nUntil MariaDB 10.5, if the mariadbd/mysqld process is killed during an ALTER\nTABLE you may find a table named #sql-... in your data directory. In MariaDB\n10.3, InnoDB tables with this prefix will be deleted automatically during\nstartup. From MariaDB 10.4, these temporary tables will always be deleted\nautomatically.\n\nIf you want to delete one of these tables explicitly you can do so by using\nthe following syntax:\n\nDROP TABLE `#mysql50##sql-...`;\n\nWhen running an ALTER TABLE…ALGORITHM=INPLACE that rebuilds the table, InnoDB\nwill create an internal #sql-ib table. Until MariaDB 10.3.2, for these tables,\nthe .frm file will be called something else. In order to drop such a table\nafter a server crash, you must rename the #sql*.frm file to match the\n#sql-ib*.ibd file.\n\nFrom MariaDB 10.3.3, the same name as the .frm file is used for the\nintermediate copy of the table. The #sql-ib names are used by TRUNCATE and\ndelayed DROP.\n\nFrom MariaDB 10.2.19 and MariaDB 10.3.10, the #sql-ib tables will be deleted\nautomatically.\n\nDropping All Tables in a Database\n---------------------------------\n\nThe best way to drop all tables in a database is by executing DROP DATABASE,\nwhich will drop the database itself, and all tables in it.\n\nHowever, if you want to drop all tables in the database, but you also want to\nkeep the database itself and any other non-table objects in it, then you would\nneed to execute DROP TABLE to drop each individual table. You can construct\nthese DROP TABLE commands by querying the TABLES table in the\ninformation_schema database. For example:\n\nSELECT CONCAT(\'DROP TABLE IF EXISTS `\', TABLE_SCHEMA, \'`.`\', TABLE_NAME, \'`;\')\nFROM information_schema.TABLES\nWHERE TABLE_SCHEMA = \'mydb\';\n\nAtomic DROP TABLE\n-----------------\n\nMariaDB starting with 10.6.1\n----------------------------\nFrom MariaDB 10.6, DROP TABLE for a single table is atomic (MDEV-25180) for\nmost engines, including InnoDB, MyRocks, MyISAM and Aria.\n\nThis means that if there is a crash (server down or power outage) during DROP\nTABLE, all tables that have been processed so far will be completely dropped,\nincluding related trigger files and status entries, and the binary log will\ninclude a DROP TABLE statement for the dropped tables. Tables for which the\ndrop had not started will be left intact.\n\nIn older MariaDB versions, there was a small chance that, during a server\ncrash happening in the middle of DROP TABLE, some storage engines that were\nusing multiple storage files, like MyISAM, could have only a part of its\ninternal files dropped.\n\nIn MariaDB 10.5, DROP TABLE was extended to be able to delete a table that was\nonly partly dropped (MDEV-11412) as explained above. Atomic DROP TABLE is the\nfinal piece to make DROP TABLE fully reliable.\n\nDropping multiple tables is crash-safe.\n\nSee Atomic DDL for more information.\n\nExamples\n--------\n\nDROP TABLE Employees, Customers;\n\nNotes\n-----\n\nBeware that DROP TABLE can drop both tables and sequences. This is mainly done\nto allow old tools like mysqldump to work with sequences.\n\nURL: https://mariadb.com/kb/en/drop-table/','','https://mariadb.com/kb/en/drop-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (702,38,'RENAME TABLE','Syntax\n------\n\nRENAME TABLE[S] [IF EXISTS] tbl_name \n [WAIT n | NOWAIT]\n TO new_tbl_name\n [, tbl_name2 TO new_tbl_name2] ...\n\nDescription\n-----------\n\nThis statement renames one or more tables or views, but not the privileges\nassociated with them.\n\nIF EXISTS\n---------\n\nMariaDB starting with 10.5.2\n----------------------------\nIf this directive is used, one will not get an error if the table to be\nrenamed doesn\'t exist.\n\nThe rename operation is done atomically, which means that no other session can\naccess any of the tables while the rename is running. For example, if you have\nan existing table old_table, you can create another table new_table that has\nthe same structure but is empty, and then replace the existing table with the\nempty one as follows (assuming that backup_table does not already exist):\n\nCREATE TABLE new_table (...);\nRENAME TABLE old_table TO backup_table, new_table TO old_table;\n\ntbl_name can optionally be specified as db_name.tbl_name. See Identifier\nQualifiers. This allows to use RENAME to move a table from a database to\nanother (as long as they are on the same filesystem):\n\nRENAME TABLE db1.t TO db2.t;\n\nNote that moving a table to another database is not possible if it has some\ntriggers. Trying to do so produces the following error:\n\nERROR 1435 (HY000): Trigger in wrong schema\n\nAlso, views cannot be moved to another database:\n\nERROR 1450 (HY000): Changing schema from \'old_db\' to \'new_db\' is not allowed.\n\nMultiple tables can be renamed in a single statement. The presence or absence\nof the optional S (RENAME TABLE or RENAME TABLES) has no impact, whether a\nsingle or multiple tables are being renamed.\n\nIf a RENAME TABLE renames more than one table and one renaming fails, all\nrenames executed by the same statement are rolled back.\n\nRenames are always executed in the specified order. Knowing this, it is also\npossible to swap two tables\' names:\n\nRENAME TABLE t1 TO tmp_table,\n t2 TO t1,\n tmp_table TO t2;\n\nWAIT/NOWAIT\n-----------\n\nMariaDB starting with 10.3.0\n----------------------------\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nPrivileges\n----------\n\nExecuting the RENAME TABLE statement requires the DROP, CREATE and INSERT\nprivileges for the table or the database.\n\nAtomic RENAME TABLE\n-------------------\n\nMariaDB starting with 10.6.1\n----------------------------\nFrom MariaDB 10.6, RENAME TABLE is atomic for most engines, including InnoDB,\nMyRocks, MyISAM and Aria (MDEV-23842). This means that if there is a crash\n(server down or power outage) during RENAME TABLE, all tables will revert to\ntheir original names and any changes to trigger files will be reverted.\n\nIn older MariaDB version there was a small chance that, during a server crash\nhappening in the middle of RENAME TABLE, some tables could have been renamed\n(in the worst case partly) while others would not be renamed.\n\nSee Atomic DDL for more information.\n\nURL: https://mariadb.com/kb/en/rename-table/','','https://mariadb.com/kb/en/rename-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (703,38,'TRUNCATE TABLE','Syntax\n------\n\nTRUNCATE [TABLE] tbl_name\n [WAIT n | NOWAIT]\n\nDescription\n-----------\n\nTRUNCATE TABLE empties a table completely. It requires the DROP privilege. See\nGRANT.\n\ntbl_name can also be specified in the form db_name.tbl_name (see Identifier\nQualifiers).\n\nLogically, TRUNCATE TABLE is equivalent to a DELETE statement that deletes all\nrows, but there are practical differences under some circumstances.\n\nTRUNCATE TABLE will fail for an InnoDB table if any FOREIGN KEY constraints\nfrom other tables reference the table, returning the error:\n\nERROR 1701 (42000): Cannot truncate a table referenced in a foreign key\nconstraint\n\nForeign Key constraints between columns in the same table are permitted.\n\nFor an InnoDB table, if there are no FOREIGN KEY constraints, InnoDB performs\nfast truncation by dropping the original table and creating an empty one with\nthe same definition, which is much faster than deleting rows one by one. The\nAUTO_INCREMENT counter is reset by TRUNCATE TABLE, regardless of whether there\nis a FOREIGN KEY constraint.\n\nThe count of rows affected by TRUNCATE TABLE is accurate only when it is\nmapped to a DELETE statement.\n\nFor other storage engines, TRUNCATE TABLE differs from DELETE in the following\nways:\n\n* Truncate operations drop and re-create the table, which is much\n faster than deleting rows one by one, particularly for large tables.\n* Truncate operations cause an implicit commit.\n* Truncation operations cannot be performed if the session holds an\n active table lock.\n* Truncation operations do not return a meaningful value for the number\n of deleted rows. The usual result is \"0 rows affected,\" which should\n be interpreted as \"no information.\"\n* As long as the table format file tbl_name.frm is valid, the\n table can be re-created as an empty table\n with TRUNCATE TABLE, even if the data or index files have become\n corrupted.\n* The table handler does not remember the last\n used AUTO_INCREMENT value, but starts counting\n from the beginning. This is true even for MyISAM and InnoDB, which normally\n do not reuse sequence values.\n* When used with partitioned tables, TRUNCATE TABLE preserves\n the partitioning; that is, the data and index files are dropped and\n re-created, while the partition definitions (.par) file is\n unaffected.\n* Since truncation of a table does not make any use of DELETE,\n the TRUNCATE statement does not invoke ON DELETE triggers.\n* TRUNCATE TABLE will only reset the values in the Performance Schema summary\ntables to zero or null, and will not remove the rows.\n\nFor the purposes of binary logging and replication, TRUNCATE TABLE is treated\nas DROP TABLE followed by CREATE TABLE (DDL rather than DML).\n\nTRUNCATE TABLE does not work on views. Currently, TRUNCATE TABLE drops all\nhistorical records from a system-versioned table.\n\nMariaDB starting with 10.3.0\n----------------------------\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nOracle-mode\n-----------\n\nOracle-mode from MariaDB 10.3 permits the optional keywords REUSE STORAGE or\nDROP STORAGE to be used.\n\nTRUNCATE [TABLE] tbl_name [{DROP | REUSE} STORAGE] [WAIT n | NOWAIT]\n\nThese have no effect on the operation.\n\nPerformance\n-----------\n\nTRUNCATE TABLE is faster than DELETE, because it drops and re-creates a table.\n\nWith InnoDB, TRUNCATE TABLE is slower if innodb_file_per_table=ON is set (the\ndefault). This is because TRUNCATE TABLE unlinks the underlying tablespace\nfile, which can be an expensive operation. See MDEV-8069 for more details.\n\nThe performance issues with innodb_file_per_table=ON can be exacerbated in\ncases where the InnoDB buffer pool is very large and\ninnodb_adaptive_hash_index=ON is set. In that case, using DROP TABLE followed\nby CREATE TABLE instead of TRUNCATE TABLE may perform better. Setting\ninnodb_adaptive_hash_index=OFF (it defaults to ON before MariaDB 10.5) can\nalso help. In MariaDB 10.2 only, from MariaDB 10.2.19, this performance can\nalso be improved by setting innodb_safe_truncate=OFF. See MDEV-9459 for more\ndetails.\n\nSetting innodb_adaptive_hash_index=OFF can also improve TRUNCATE TABLE\nperformance in general. See MDEV-16796 for more details.\n\nURL: https://mariadb.com/kb/en/truncate-table/','','https://mariadb.com/kb/en/truncate-table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (704,38,'CREATE DATABASE','Syntax\n------\n\nCREATE [OR REPLACE] {DATABASE | SCHEMA} [IF NOT EXISTS] db_name\n [create_specification] ...\n\ncreate_specification:\n [DEFAULT] CHARACTER SET [=] charset_name\n | [DEFAULT] COLLATE [=] collation_name\n | COMMENT [=] \'comment\'\n\nDescription\n-----------\n\nCREATE DATABASE creates a database with the given name. To use this statement,\nyou need the CREATE privilege for the database. CREATE SCHEMA is a synonym for\nCREATE DATABASE.\n\nFor valid identifiers to use as database names, see Identifier Names.\n\nOR REPLACE\n----------\n\nMariaDB starting with 10.1.3\n----------------------------\nThe OR REPLACE clause was added in MariaDB 10.1.3\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP DATABASE IF EXISTS db_name;\nCREATE DATABASE db_name ...;\n\nIF NOT EXISTS\n-------------\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified database already exists.\n\nCOMMENT\n-------\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, it is possible to add a comment of a maximum of 1024\nbytes. If the comment length exceeds this length, a error/warning code 4144 is\nthrown. The database comment is also added to the db.opt file, as well as to\nthe information_schema.schemata table.\n\nExamples\n--------\n\nCREATE DATABASE db1;\nQuery OK, 1 row affected (0.18 sec)\n\nCREATE DATABASE db1;\nERROR 1007 (HY000): Can\'t create database \'db1\'; database exists\n\nCREATE OR REPLACE DATABASE db1;\nQuery OK, 2 rows affected (0.00 sec)\n\nCREATE DATABASE IF NOT EXISTS db1;\nQuery OK, 1 row affected, 1 warning (0.01 sec)\n\nSHOW WARNINGS;\n+-------+------+----------------------------------------------+\n| Level | Code | Message |\n+-------+------+----------------------------------------------+\n| Note | 1007 | Can\'t create database \'db1\'; database exists |\n+-------+------+----------------------------------------------+\n\nSetting the character sets and collation. See Setting Character Sets and\nCollations for more details.\n\nCREATE DATABASE czech_slovak_names \n CHARACTER SET = \'keybcs2\'\n COLLATE = \'keybcs2_bin\';\n\nComments, from MariaDB 10.5.0:\n\nCREATE DATABASE presentations COMMENT \'Presentations for conferences\';\n\nURL: https://mariadb.com/kb/en/create-database/','','https://mariadb.com/kb/en/create-database/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (705,38,'CREATE EVENT','Syntax\n------\n\nCREATE [OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n EVENT\n [IF NOT EXISTS]\n event_name\n ON SCHEDULE schedule\n [ON COMPLETION [NOT] PRESERVE]\n [ENABLE | DISABLE | DISABLE ON SLAVE]\n [COMMENT \'comment\']\n DO sql_statement;\n\nschedule:\n AT timestamp [+ INTERVAL interval] ...\n | EVERY interval\n [STARTS timestamp [+ INTERVAL interval] ...]\n [ENDS timestamp [+ INTERVAL interval] ...]\n\ninterval:\n quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |\n WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |\n DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}\n\nDescription\n-----------\n\nThis statement creates and schedules a new event. It requires the EVENT\nprivilege for the schema in which the event is to be created.\n\nThe minimum requirements for a valid CREATE EVENT statement are as follows:\n\n* The keywords CREATE EVENT plus an event name, which uniquely identifies\n the event in the current schema. (Prior to MySQL 5.1.12, the event name\n needed to be unique only among events created by the same user on a given\n database.)\n* An ON SCHEDULE clause, which determines when and how often the event\n executes.\n* A DO clause, which contains the SQL statement to be executed by an\n event.\n\nHere is an example of a minimal CREATE EVENT statement:\n\nCREATE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n\nThe previous statement creates an event named myevent. This event executes\nonce — one hour following its creation — by running an SQL statement that\nincrements the value of the myschema.mytable table\'s mycol column by 1.\n\nThe event_name must be a valid MariaDB identifier with a maximum length of 64\ncharacters. It may be delimited using back ticks, and may be qualified with\nthe name of a database schema. An event is associated with both a MariaDB user\n(the definer) and a schema, and its name must be unique among names of events\nwithin that schema. In general, the rules governing event names are the same\nas those for names of stored routines. See Identifier Names.\n\nIf no schema is indicated as part of event_name, the default (current) schema\nis assumed.\n\nFor valid identifiers to use as event names, see Identifier Names.\n\nOR REPLACE\n----------\n\nThe OR REPLACE clause was included in MariaDB 10.1.4. If used and the event\nalready exists, instead of an error being returned, the existing event will be\ndropped and replaced by the newly defined event.\n\nIF NOT EXISTS\n-------------\n\nIf the IF NOT EXISTS clause is used, MariaDB will return a warning instead of\nan error if the event already exists. Cannot be used together with OR REPLACE.\n\nON SCHEDULE\n-----------\n\nThe ON SCHEDULE clause can be used to specify when the event must be triggered.\n\nAT\n--\n\nIf you want to execute the event only once (one time event), you can use the\nAT keyword, followed by a timestamp. If you use CURRENT_TIMESTAMP, the event\nacts as soon as it is created. As a convenience, you can add one or more\nintervals to that timestamp. You can also specify a timestamp in the past, so\nthat the event is stored but not triggered, until you modify it via ALTER\nEVENT.\n\nThe following example shows how to create an event that will be triggered\ntomorrow at a certain time:\n\nCREATE EVENT example\nON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY + INTERVAL 3 HOUR\nDO something;\n\nYou can also specify that an event must be triggered at a regular interval\n(recurring event). In such cases, use the EVERY clause followed by the\ninterval.\n\nIf an event is recurring, you can specify when the first execution must happen\nvia the STARTS clause and a maximum time for the last execution via the ENDS\nclause. STARTS and ENDS clauses are followed by a timestamp and, optionally,\none or more intervals. The ENDS clause can specify a timestamp in the past, so\nthat the event is stored but not executed until you modify it via ALTER EVENT.\n\nIn the following example, next month a recurring event will be triggered\nhourly for a week:\n\nCREATE EVENT example\nON SCHEDULE EVERY 1 HOUR\nSTARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH\nENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK\nDO some_task;\n\nIntervals consist of a quantity and a time unit. The time units are the same\nused for other staments and time functions, except that you can\'t use\nmicroseconds for events. For simple time units, like HOUR or MINUTE, the\nquantity is an integer number, for example \'10 MINUTE\'. For composite time\nunits, like HOUR_MINUTE or HOUR_SECOND, the quantity must be a string with all\ninvolved simple values and their separators, for example \'2:30\' or \'2:30:30\'.\n\nON COMPLETION [NOT] PRESERVE\n----------------------------\n\nThe ON COMPLETION clause can be used to specify if the event must be deleted\nafter its last execution (that is, after its AT or ENDS timestamp is past). By\ndefault, events are dropped when they are expired. To explicitly state that\nthis is the desired behaviour, you can use ON COMPLETION NOT PRESERVE.\nInstead, if you want the event to be preserved, you can use ON COMPLETION\nPRESERVE.\n\nIn you specify ON COMPLETION NOT PRESERVE, and you specify a timestamp in the\npast for AT or ENDS clause, the event will be immediatly dropped. In such\ncases, you will get a Note 1558: \"Event execution time is in the past and ON\nCOMPLETION NOT PRESERVE is set. The event was dropped immediately after\ncreation\".\n\nENABLE/DISABLE/DISABLE ON SLAVE\n-------------------------------\n\nEvents are ENABLEd by default. If you want to stop MariaDB from executing an\nevent, you may specify DISABLE. When it is ready to be activated, you may\nenable it using ALTER EVENT. Another option is DISABLE ON SLAVE, which\nindicates that an event was created on a master and has been replicated to the\nslave, which is prevented from executing the event. If DISABLE ON SLAVE is\nspecifically set, the event will be disabled everywhere. It will not be\nexecuted on the mater or the slaves.\n\nCOMMENT\n-------\n\nThe COMMENT clause may be used to set a comment for the event. Maximum length\nfor comments is 64 characters. The comment is a string, so it must be quoted.\nTo see events comments, you can query the INFORMATION_SCHEMA.EVENTS table (the\ncolumn is named EVENT_COMMENT).\n\nExamples\n--------\n\nMinimal CREATE EVENT statement:\n\nCREATE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n\nAn event that will be triggered tomorrow at a certain time:\n\nCREATE EVENT example\nON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY + INTERVAL 3 HOUR\nDO something;\n\nNext month a recurring event will be triggered hourly for a week:\n\nCREATE EVENT example\nON SCHEDULE EVERY 1 HOUR\nSTARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH\nENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK\nDO some_task;\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\nERROR 1537 (HY000): Event \'myevent\' already exists\n\nCREATE OR REPLACE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;;\nQuery OK, 0 rows affected (0.00 sec)\n\nCREATE EVENT IF NOT EXISTS myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+--------------------------------+\n| Level | Code | Message |\n+-------+------+--------------------------------+\n| Note | 1537 | Event \'myevent\' already exists |\n+-------+------+--------------------------------+\n\nURL: https://mariadb.com/kb/en/create-event/','','https://mariadb.com/kb/en/create-event/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (706,38,'CREATE FUNCTION','Syntax\n------\n\nCREATE [OR REPLACE]\n [DEFINER = {user | CURRENT_USER | role | CURRENT_ROLE }]\n [AGGREGATE] FUNCTION [IF NOT EXISTS] func_name ([func_parameter[,...]])\n RETURNS type\n [characteristic ...]\n RETURN func_body\nfunc_parameter:\n [ IN | OUT | INOUT | IN OUT ] param_name type\ntype:\n Any valid MariaDB data type\ncharacteristic:\n LANGUAGE SQL\n | [NOT] DETERMINISTIC\n | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\nfunc_body:\n Valid SQL procedure statement\n\nDescription\n-----------\n\nUse the CREATE FUNCTION statement to create a new stored function. You must\nhave the CREATE ROUTINE database privilege to use CREATE FUNCTION. A function\ntakes any number of arguments and returns a value from the function body. The\nfunction body can be any valid SQL expression as you would use, for example,\nin any select expression. If you have the appropriate privileges, you can call\nthe function exactly as you would any built-in function. See Security below\nfor details on privileges.\n\nYou can also use a variant of the CREATE FUNCTION statement to install a\nuser-defined function (UDF) defined by a plugin. See CREATE FUNCTION (UDF) for\ndetails.\n\nYou can use a SELECT statement for the function body by enclosing it in\nparentheses, exactly as you would to use a subselect for any other expression.\nThe SELECT statement must return a single value. If more than one column is\nreturned when the function is called, error 1241 results. If more than one row\nis returned when the function is called, error 1242 results. Use a LIMIT\nclause to ensure only one row is returned.\n\nYou can also replace the RETURN clause with a BEGIN...END compound statement.\nThe compound statement must contain a RETURN statement. When the function is\ncalled, the RETURN statement immediately returns its result, and any\nstatements after RETURN are effectively ignored.\n\nBy default, a function is associated with the current database. To associate\nthe function explicitly with a given database, specify the fully-qualified\nname as db_name.func_name when you create it. If the function name is the same\nas the name of a built-in function, you must use the fully qualified name when\nyou call it.\n\nThe parameter list enclosed within parentheses must always be present. If\nthere are no parameters, an empty parameter list of () should be used.\nParameter names are not case sensitive.\n\nEach parameter can be declared to use any valid data type, except that the\nCOLLATE attribute cannot be used.\n\nFor valid identifiers to use as function names, see Identifier Names.\n\nIN | OUT | INOUT | IN OUT\n-------------------------\n\nMariaDB starting with 10.8.0\n----------------------------\nThe function parameter qualifiers for IN, OUT, INOUT, and IN OUT were added in\na 10.8.0 preview release. Prior to 10.8.0 quantifiers were supported only in\nprocedures.\n\nOUT, INOUT and its equivalent IN OUT, are only valid if called from SET and\nnot SELECT. These quantifiers are especially useful for creating functions\nwith more than one return value. This allows functions to be more complex and\nnested.\n\nDELIMITER $$\nCREATE FUNCTION add_func3(IN a INT, IN b INT, OUT c INT) RETURNS INT\nBEGIN\n SET c = 100;\n RETURN a + b;\nEND;\n$$\nDELIMITER ;\n\nSET @a = 2;\nSET @b = 3;\nSET @c = 0;\nSET @res= add_func3(@a, @b, @c);\n\nSELECT add_func3(@a, @b, @c);\nERROR 4186 (HY000): OUT or INOUT argument 3 for function add_func3 is not\nallowed here\n\nDELIMITER $$\nCREATE FUNCTION add_func4(IN a INT, IN b INT, d INT) RETURNS INT\nBEGIN\n DECLARE c, res INT;\n SET res = add_func3(a, b, c) + d;\n if (c > 99) then\n return 3;\n else\n return res;\n end if;\nEND;\n$$\n\nDELIMITER ;\n\nSELECT add_func4(1,2,3);\n+------------------+\n| add_func4(1,2,3) |\n+------------------+\n| 3 |\n+------------------+\n\nAGGREGATE\n---------\n\nMariaDB starting with 10.3.3\n----------------------------\nFrom MariaDB 10.3.3, it is possible to create stored aggregate functions as\nwell. See Stored Aggregate Functions for details.\n\nRETURNS\n-------\n\nThe RETURNS clause specifies the return type of the function. NULL values are\npermitted with all return types.\n\nWhat happens if the RETURN clause returns a value of a different type? It\ndepends on the SQL_MODE in effect at the moment of the function creation.\n\nIf the SQL_MODE is strict (STRICT_ALL_TABLES or STRICT_TRANS_TABLES flags are\nspecified), a 1366 error will be produced.\n\nOtherwise, the value is coerced to the proper type. For example, if a function\nspecifies an ENUM or SET value in the RETURNS clause, but the RETURN clause\nreturns an integer, the value returned from the function is the string for the\ncorresponding ENUM member of set of SET members.\n\nMariaDB stores the SQL_MODE system variable setting that is in effect at the\ntime a routine is created, and always executes the routine with this setting\nin force, regardless of the server SQL mode in effect when the routine is\ninvoked.\n\nLANGUAGE SQL\n------------\n\nLANGUAGE SQL is a standard SQL clause, and it can be used in MariaDB for\nportability. However that clause has no meaning, because SQL is the only\nsupported language for stored functions.\n\nA function is deterministic if it can produce only one result for a given list\nof parameters. If the result may be affected by stored data, server variables,\nrandom numbers or any value that is not explicitly passed, then the function\nis not deterministic. Also, a function is non-deterministic if it uses\nnon-deterministic functions like NOW() or CURRENT_TIMESTAMP(). The optimizer\nmay choose a faster execution plan if it known that the function is\ndeterministic. In such cases, you should declare the routine using the\nDETERMINISTIC keyword. If you want to explicitly state that the function is\nnot deterministic (which is the default) you can use the NOT DETERMINISTIC\nkeywords.\n\nIf you declare a non-deterministic function as DETERMINISTIC, you may get\nincorrect results. If you declare a deterministic function as NOT\nDETERMINISTIC, in some cases the queries will be slower.\n\nOR REPLACE\n----------\n\nMariaDB starting with 10.1.3\n----------------------------\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP FUNCTION IF EXISTS function_name;\nCREATE FUNCTION function_name ...;\n\nwith the exception that any existing privileges for the function are not\ndropped.\n\nIF NOT EXISTS\n-------------\n\nMariaDB starting with 10.1.3\n----------------------------\nIf the IF NOT EXISTS clause is used, MariaDB will return a warning instead of\nan error if the function already exists. Cannot be used together with OR\nREPLACE.\n\n[NOT] DETERMINISTIC\n-------------------\n\nThe [NOT] DETERMINISTIC clause also affects binary logging, because the\nSTATEMENT format can not be used to store or replicate non-deterministic\nstatements.\n\nCONTAINS SQL, NO SQL, READS SQL DATA, and MODIFIES SQL DATA are informative\nclauses that tell the server what the function does. MariaDB does not check in\nany way whether the specified clause is correct. If none of these clauses are\nspecified, CONTAINS SQL is used by default.\n\nMODIFIES SQL DATA\n-----------------\n\nMODIFIES SQL DATA means that the function contains statements that may modify\ndata stored in databases. This happens if the function contains statements\nlike DELETE, UPDATE, INSERT, REPLACE or DDL.\n\nREADS SQL DATA\n--------------\n\nREADS SQL DATA means that the function reads data stored in databases, but\ndoes not modify any data. This happens if SELECT statements are used, but\nthere no write operations are executed.\n\nCONTAINS SQL\n------------\n\nCONTAINS SQL means that the function contains at least one SQL statement, but\nit does not read or write any data stored in a database. Examples include SET\nor DO.\n\nNO SQL\n------\n\nNO SQL means nothing, because MariaDB does not currently support any language\nother than SQL.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nFrom MariaDB 10.3, a subset of Oracle\'s PL/SQL language has been supported in\naddition to the traditional SQL/PSM-based MariaDB syntax. See Oracle mode from\nMariaDB 10.3 for details on changes when running Oracle mode.\n\nSecurity\n--------\n\nYou must have the EXECUTE privilege on a function to call it. MariaDB\nautomatically grants the EXECUTE and ALTER ROUTINE privileges to the account\nthat called CREATE FUNCTION, even if the DEFINER clause was used.\n\nEach function has an account associated as the definer. By default, the\ndefiner is the account that created the function. Use the DEFINER clause to\nspecify a different account as the definer. You must have the SUPER privilege,\nor, from MariaDB 10.5.2, the SET USER privilege, to use the DEFINER clause.\nSee Account Names for details on specifying accounts.\n\nThe SQL SECURITY clause specifies what privileges are used when a function is\ncalled. If SQL SECURITY is INVOKER, the function body will be evaluated using\nthe privileges of the user calling the function. If SQL SECURITY is DEFINER,\nthe function body is always evaluated using the privileges of the definer\naccount. DEFINER is the default.\n\nThis allows you to create functions that grant limited access to certain data.\nFor example, say you have a table that stores some employee information, and\nthat you\'ve granted SELECT privileges only on certain columns to the user\naccount roger.\n\nCREATE TABLE employees (name TINYTEXT, dept TINYTEXT, salary INT);\nGRANT SELECT (name, dept) ON employees TO roger;\n\nTo allow the user the get the maximum salary for a department, define a\nfunction and grant the EXECUTE privilege:\n\nCREATE FUNCTION max_salary (dept TINYTEXT) RETURNS INT RETURN\n (SELECT MAX(salary) FROM employees WHERE employees.dept = dept);\nGRANT EXECUTE ON FUNCTION max_salary TO roger;\n\nSince SQL SECURITY defaults to DEFINER, whenever the user roger calls this\nfunction, the subselect will execute with your privileges. As long as you have\nprivileges to select the salary of each employee, the caller of the function\nwill be able to get the maximum salary for each department without being able\nto see individual salaries.\n\nCharacter sets and collations\n-----------------------------\n\nFunction return types can be declared to use any valid character set and\ncollation. If used, the COLLATE attribute needs to be preceded by a CHARACTER\nSET attribute.\n\nIf the character set and collation are not specifically set in the statement,\nthe database defaults at the time of creation will be used. If the database\ndefaults change at a later stage, the stored function character set/collation\nwill not be changed at the same time; the stored function needs to be dropped\nand recreated to ensure the same character set/collation as the database is\nused.\n\nExamples\n--------\n\nThe following example function takes a parameter, performs an operation using\nan SQL function, and returns the result.\n\nCREATE FUNCTION hello (s CHAR(20))\n RETURNS CHAR(50) DETERMINISTIC\n RETURN CONCAT(\'Hello, \',s,\'!\');\n\nSELECT hello(\'world\');\n+----------------+\n| hello(\'world\') |\n+----------------+\n| Hello, world! |\n+----------------+\n\nYou can use a compound statement in a function to manipulate data with\nstatements like INSERT and UPDATE. The following example creates a counter\nfunction that uses a temporary table to store the current value. Because the\ncompound statement contains statements terminated with semicolons, you have to\nfirst change the statement delimiter with the DELIMITER statement to allow the\nsemicolon to be used in the function body. See Delimiters in the mysql client\nfor more.\n\nCREATE TEMPORARY TABLE counter (c INT);\nINSERT INTO counter VALUES (0);\nDELIMITER //\nCREATE FUNCTION counter () RETURNS INT\n BEGIN\n UPDATE counter SET c = c + 1;\n RETURN (SELECT c FROM counter LIMIT 1);\n END //\nDELIMITER ;\n\nCharacter set and collation:\n\nCREATE FUNCTION hello2 (s CHAR(20))\n RETURNS CHAR(50) CHARACTER SET \'utf8\' COLLATE \'utf8_bin\' DETERMINISTIC\n RETURN CONCAT(\'Hello, \',s,\'!\');\n\nURL: https://mariadb.com/kb/en/create-function/','','https://mariadb.com/kb/en/create-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (707,38,'CREATE INDEX','Syntax\n------\n\nCREATE [OR REPLACE] [UNIQUE|FULLTEXT|SPATIAL] INDEX \n [IF NOT EXISTS] index_name\n [index_type]\n ON tbl_name (index_col_name,...)\n [WAIT n | NOWAIT]\n [index_option]\n [algorithm_option | lock_option] ...\n\nindex_col_name:\n col_name [(length)] [ASC | DESC]\n\nindex_type:\n USING {BTREE | HASH | RTREE}\n\nindex_option:\n [ KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n | CLUSTERING={YES| NO} ]\n [ IGNORED | NOT IGNORED ]\n\nalgorithm_option:\n ALGORITHM [=] {DEFAULT|INPLACE|COPY|NOCOPY|INSTANT}\n\nlock_option:\n LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}\n\nDescription\n-----------\n\nCREATE INDEX is mapped to an ALTER TABLE statement to create indexes. See\nALTER TABLE. CREATE INDEX cannot be used to create a PRIMARY KEY; use ALTER\nTABLE instead.\n\nIf another connection is using the table, a metadata lock is active, and this\nstatement will wait until the lock is released. This is also true for\nnon-transactional tables.\n\nAnother shortcut, DROP INDEX, allows the removal of an index.\n\nFor valid identifiers to use as index names, see Identifier Names.\n\nNote that KEY_BLOCK_SIZE is currently ignored in CREATE INDEX, although it is\nincluded in the output of SHOW CREATE TABLE.\n\nPrivileges\n----------\n\nExecuting the CREATE INDEX statement requires the INDEX privilege for the\ntable or the database.\n\nOnline DDL\n----------\n\nOnline DDL is supported with the ALGORITHM and LOCK clauses.\n\nSee InnoDB Online DDL Overview for more information on online DDL with InnoDB.\n\nCREATE OR REPLACE INDEX\n-----------------------\n\nIf the OR REPLACE clause is used and if the index already exists, then instead\nof returning an error, the server will drop the existing index and replace it\nwith the newly defined index.\n\nCREATE INDEX IF NOT EXISTS\n--------------------------\n\nIf the IF NOT EXISTS clause is used, then the index will only be created if an\nindex with the same name does not already exist. If the index already exists,\nthen a warning will be triggered by default.\n\nIndex Definitions\n-----------------\n\nSee CREATE TABLE: Index Definitions for information about index definitions.\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nALGORITHM\n---------\n\nSee ALTER TABLE: ALGORITHM for more information.\n\nLOCK\n----\n\nSee ALTER TABLE: LOCK for more information.\n\nProgress Reporting\n------------------\n\nMariaDB provides progress reporting for CREATE INDEX statement for clients\nthat support the new progress reporting protocol. For example, if you were\nusing the mysql client, then the progress report might look like this::\n\nCREATE INDEX i ON tab (num);\nStage: 1 of 2 \'copy to tmp table\' 46% of stage\n\nThe progress report is also shown in the output of the SHOW PROCESSLIST\nstatement and in the contents of the information_schema.PROCESSLIST table.\n\nSee Progress Reporting for more information.\n\nWITHOUT OVERLAPS\n----------------\n\nMariaDB starting with 10.5.3\n----------------------------\nThe WITHOUT OVERLAPS clause allows one to constrain a primary or unique index\nsuch that application-time periods cannot overlap.\n\nExamples\n--------\n\nCreating a unique index:\n\nCREATE UNIQUE INDEX HomePhone ON Employees(Home_Phone);\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE INDEX xi ON xx5 (x);\nQuery OK, 0 rows affected (0.03 sec)\n\nCREATE INDEX xi ON xx5 (x);\nERROR 1061 (42000): Duplicate key name \'xi\'\n\nCREATE OR REPLACE INDEX xi ON xx5 (x);\nQuery OK, 0 rows affected (0.03 sec)\n\nCREATE INDEX IF NOT EXISTS xi ON xx5 (x);\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------+\n| Note | 1061 | Duplicate key name \'xi\' |\n+-------+------+-------------------------+\n\nFrom MariaDB 10.5.3, creating a unique index for an application-time period\ntable with a WITHOUT OVERLAPS constraint:\n\nCREATE UNIQUE INDEX u ON rooms (room_number, p WITHOUT OVERLAPS);\n\nURL: https://mariadb.com/kb/en/create-index/','','https://mariadb.com/kb/en/create-index/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (708,38,'CREATE PACKAGE','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nCREATE\n [ OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n PACKAGE [ IF NOT EXISTS ]\n [ db_name . ] package_name\n [ package_characteristic ... ]\n{ AS | IS }\n [ package_specification_element ... ]\nEND [ package_name ]\n\npackage_characteristic:\n COMMENT \'string\'\n | SQL SECURITY { DEFINER | INVOKER }\n\npackage_specification_element:\n FUNCTION_SYM package_specification_function ;\n | PROCEDURE_SYM package_specification_procedure ;\n\npackage_specification_function:\n func_name [ ( func_param [, func_param]... ) ]\n RETURNS func_return_type\n [ package_routine_characteristic... ]\n\npackage_specification_procedure:\n proc_name [ ( proc_param [, proc_param]... ) ]\n [ package_routine_characteristic... ]\n\nfunc_return_type:\n type\n\nfunc_param:\n param_name [ IN | OUT | INOUT | IN OUT ] type\n\nproc_param:\n param_name [ IN | OUT | INOUT | IN OUT ] type\n\ntype:\n Any valid MariaDB explicit or anchored data type\n\npackage_routine_characteristic:\n COMMENT \'string\'\n | LANGUAGE SQL\n | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n\nDescription\n-----------\n\nThe CREATE PACKAGE statement can be used when Oracle SQL_MODE is set.\n\nThe CREATE PACKAGE creates the specification for a stored package (a\ncollection of logically related stored objects). A stored package\nspecification declares public routines (procedures and functions) of the\npackage, but does not implement these routines.\n\nA package whose specification was created by the CREATE PACKAGE statement,\nshould later be implemented using the CREATE PACKAGE BODY statement.\n\nFunction parameter quantifiers IN | OUT | INOUT | IN OUT\n--------------------------------------------------------\n\nMariaDB starting with 10.8.0\n----------------------------\nThe function parameter quantifiers for IN, OUT, INOUT, and IN OUT where added\nin a 10.8.0 preview release. Prior to 10.8.0 quantifiers were supported only\nin procedures.\n\nOUT, INOUT and its equivalent IN OUT, are only valid if called from SET and\nnot SELECT. These quantifiers are especially useful for creating functions and\nprocedures with more than one return value. This allows functions and\nprocedures to be more complex and nested.\n\nExamples\n--------\n\nSET sql_mode=ORACLE;\nDELIMITER $$\nCREATE OR REPLACE PACKAGE employee_tools AS\n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);\n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));\n PROCEDURE raiseSalaryStd(eid INT);\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));\nEND;\n$$\nDELIMITER ;\n\nURL: https://mariadb.com/kb/en/create-package/','','https://mariadb.com/kb/en/create-package/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (709,38,'CREATE PACKAGE BODY','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nCREATE [ OR REPLACE ]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n PACKAGE BODY\n [ IF NOT EXISTS ]\n [ db_name . ] package_name\n [ package_characteristic... ]\n{ AS | IS }\n package_implementation_declare_section\n package_implementation_executable_section\nEND [ package_name]\n\npackage_implementation_declare_section:\n package_implementation_item_declaration\n [ package_implementation_item_declaration... ]\n [ package_implementation_routine_definition... ]\n | package_implementation_routine_definition\n [ package_implementation_routine_definition...]\n\npackage_implementation_item_declaration:\n variable_declaration ;\n\nvariable_declaration:\n variable_name[,...] type [:= expr ]\n\npackage_implementation_routine_definition:\n FUNCTION package_specification_function\n [ package_implementation_function_body ] ;\n | PROCEDURE package_specification_procedure\n [ package_implementation_procedure_body ] ;\n\npackage_implementation_function_body:\n { AS | IS } package_routine_body [func_name]\n\npackage_implementation_procedure_body:\n { AS | IS } package_routine_body [proc_name]\n\npackage_routine_body:\n [ package_routine_declarations ]\n BEGIN\n statements [ EXCEPTION exception_handlers ]\n END\n\npackage_routine_declarations:\n package_routine_declaration \';\' [package_routine_declaration \';\']...\n\npackage_routine_declaration:\n variable_declaration\n | condition_name CONDITION FOR condition_value\n | user_exception_name EXCEPTION\n | CURSOR_SYM cursor_name\n [ ( cursor_formal_parameters ) ]\n IS select_statement\n ;\n\npackage_implementation_executable_section:\n END\n | BEGIN\n statement ; [statement ; ]...\n [EXCEPTION exception_handlers]\n END\n\nexception_handlers:\n exception_handler [exception_handler...]\n\nexception_handler:\n WHEN_SYM condition_value [, condition_value]...\n THEN_SYM statement ; [statement ;]...\n\ncondition_value:\n condition_name\n | user_exception_name\n | SQLWARNING\n | SQLEXCEPTION\n | NOT FOUND\n | OTHERS_SYM\n | SQLSTATE [VALUE] sqlstate_value\n | mariadb_error_code\n\nDescription\n-----------\n\nThe CREATE PACKAGE BODY statement can be used when Oracle SQL_MODE is set.\n\nThe CREATE PACKAGE BODY statement creates the package body for a stored\npackage. The package specification must be previously created using the CREATE\nPACKAGE statement.\n\nA package body provides implementations of the package public routines and can\noptionally have:\n\n* package-wide private variables\n* package private routines\n* forward declarations for private routines\n* an executable initialization section\n\nExamples\n--------\n\nSET sql_mode=ORACLE;\nDELIMITER $$\nCREATE OR REPLACE PACKAGE employee_tools AS\n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);\n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));\n PROCEDURE raiseSalaryStd(eid INT);\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));\nEND;\n$$\nCREATE PACKAGE BODY employee_tools AS\n -- package body variables\n stdRaiseAmount DECIMAL(10,2):=500;\n\n-- private routines\n PROCEDURE log (eid INT, ecmnt TEXT) AS\n BEGIN\n INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt);\n END;\n\n-- public routines\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS\n eid INT;\n BEGIN\n INSERT INTO employee (name, salary) VALUES (ename, esalary);\n eid:= last_insert_id();\n log(eid, \'hire \' || ename);\n END;\n\nFUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS\n nSalary DECIMAL(10,2);\n BEGIN\n SELECT salary INTO nSalary FROM employee WHERE id=eid;\n log(eid, \'getSalary id=\' || eid || \' salary=\' || nSalary);\n RETURN nSalary;\n END;\n\nPROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS\n BEGIN\n UPDATE employee SET salary=salary+amount WHERE id=eid;\n log(eid, \'raiseSalary id=\' || eid || \' amount=\' || amount);\n END;\n\nPROCEDURE raiseSalaryStd(eid INT) AS\n BEGIN\n raiseSalary(eid, stdRaiseAmount);\n log(eid, \'raiseSalaryStd id=\' || eid);\n END;\n\nBEGIN\n -- This code is executed when the current session\n -- accesses any of the package routines for the first time\n log(0, \'Session \' || connection_id() || \' \' || current_user || \' started\');\nEND;\n$$\n\nDELIMITER ;\n\nURL: https://mariadb.com/kb/en/create-package-body/','','https://mariadb.com/kb/en/create-package-body/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (710,38,'CREATE PROCEDURE','Syntax\n------\n\nCREATE\n [OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])\n [characteristic ...] routine_body\n\nproc_parameter:\n [ IN | OUT | INOUT ] param_name type\n\ntype:\n Any valid MariaDB data type\n\ncharacteristic:\n LANGUAGE SQL\n | [NOT] DETERMINISTIC\n | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n\nroutine_body:\n Valid SQL procedure statement\n\nDescription\n-----------\n\nCreates a stored procedure. By default, a routine is associated with the\ndefault database. To associate the routine explicitly with a given database,\nspecify the name as db_name.sp_name when you create it.\n\nWhen the routine is invoked, an implicit USE db_name is performed (and undone\nwhen the routine terminates). The causes the routine to have the given default\ndatabase while it executes. USE statements within stored routines are\ndisallowed.\n\nWhen a stored procedure has been created, you invoke it by using the CALL\nstatement (see CALL).\n\nTo execute the CREATE PROCEDURE statement, it is necessary to have the CREATE\nROUTINE privilege. By default, MariaDB automatically grants the ALTER ROUTINE\nand EXECUTE privileges to the routine creator. See also Stored Routine\nPrivileges.\n\nThe DEFINER and SQL SECURITY clauses specify the security context to be used\nwhen checking access privileges at routine execution time, as described here.\nRequires the SUPER privilege, or, from MariaDB 10.5.2, the SET USER privilege.\n\nIf the routine name is the same as the name of a built-in SQL function, you\nmust use a space between the name and the following parenthesis when defining\nthe routine, or a syntax error occurs. This is also true when you invoke the\nroutine later. For this reason, we suggest that it is better to avoid re-using\nthe names of existing SQL functions for your own stored routines.\n\nThe IGNORE_SPACE SQL mode applies to built-in functions, not to stored\nroutines. It is always allowable to have spaces after a routine name,\nregardless of whether IGNORE_SPACE is enabled.\n\nThe parameter list enclosed within parentheses must always be present. If\nthere are no parameters, an empty parameter list of () should be used.\nParameter names are not case sensitive.\n\nEach parameter can be declared to use any valid data type, except that the\nCOLLATE attribute cannot be used.\n\nFor valid identifiers to use as procedure names, see Identifier Names.\n\nThings to be Aware of With CREATE OR REPLACE\n--------------------------------------------\n\n* One can\'t use OR REPLACE together with IF EXISTS.\n\nCREATE PROCEDURE IF NOT EXISTS\n------------------------------\n\nIf the IF NOT EXISTS clause is used, then the procedure will only be created\nif a procedure with the same name does not already exist. If the procedure\nalready exists, then a warning will be triggered by default.\n\nIN/OUT/INOUT\n------------\n\nEach parameter is an IN parameter by default. To specify otherwise for a\nparameter, use the keyword OUT or INOUT before the parameter name.\n\nAn IN parameter passes a value into a procedure. The procedure might modify\nthe value, but the modification is not visible to the caller when the\nprocedure returns. An OUT parameter passes a value from the procedure back to\nthe caller. Its initial value is NULL within the procedure, and its value is\nvisible to the caller when the procedure returns. An INOUT parameter is\ninitialized by the caller, can be modified by the procedure, and any change\nmade by the procedure is visible to the caller when the procedure returns.\n\nFor each OUT or INOUT parameter, pass a user-defined variable in the CALL\nstatement that invokes the procedure so that you can obtain its value when the\nprocedure returns. If you are calling the procedure from within another stored\nprocedure or function, you can also pass a routine parameter or local routine\nvariable as an IN or INOUT parameter.\n\nDETERMINISTIC/NOT DETERMINISTIC\n-------------------------------\n\nDETERMINISTIC and NOT DETERMINISTIC apply only to functions. Specifying\nDETERMINISTC or NON-DETERMINISTIC in procedures has no effect. The default\nvalue is NOT DETERMINISTIC. Functions are DETERMINISTIC when they always\nreturn the same value for the same input. For example, a truncate or substring\nfunction. Any function involving data, therefore, is always NOT DETERMINISTIC.\n\nCONTAINS SQL/NO SQL/READS SQL DATA/MODIFIES SQL DATA\n----------------------------------------------------\n\nCONTAINS SQL, NO SQL, READS SQL DATA, and MODIFIES SQL DATA are informative\nclauses that tell the server what the function does. MariaDB does not check in\nany way whether the specified clause is correct. If none of these clauses are\nspecified, CONTAINS SQL is used by default.\n\nMODIFIES SQL DATA means that the function contains statements that may modify\ndata stored in databases. This happens if the function contains statements\nlike DELETE, UPDATE, INSERT, REPLACE or DDL.\n\nREADS SQL DATA means that the function reads data stored in databases, but\ndoes not modify any data. This happens if SELECT statements are used, but\nthere no write operations are executed.\n\nCONTAINS SQL means that the function contains at least one SQL statement, but\nit does not read or write any data stored in a database. Examples include SET\nor DO.\n\nNO SQL means nothing, because MariaDB does not currently support any language\nother than SQL.\n\nThe routine_body consists of a valid SQL procedure statement. This can be a\nsimple statement such as SELECT or INSERT, or it can be a compound statement\nwritten using BEGIN and END. Compound statements can contain declarations,\nloops, and other control structure statements. See Programmatic and Compound\nStatements for syntax details.\n\nMariaDB allows routines to contain DDL statements, such as CREATE and DROP.\nMariaDB also allows stored procedures (but not stored functions) to contain\nSQL transaction statements such as COMMIT.\n\nFor additional information about statements that are not allowed in stored\nroutines, see Stored Routine Limitations.\n\nInvoking stored procedure from within programs\n----------------------------------------------\n\nFor information about invoking stored procedures from within programs written\nin a language that has a MariaDB/MySQL interface, see CALL.\n\nOR REPLACE\n----------\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP PROCEDURE IF EXISTS name;\nCREATE PROCEDURE name ...;\n\nwith the exception that any existing privileges for the procedure are not\ndropped.\n\nsql_mode\n--------\n\nMariaDB stores the sql_mode system variable setting that is in effect at the\ntime a routine is created, and always executes the routine with this setting\nin force, regardless of the server SQL mode in effect when the routine is\ninvoked.\n\nCharacter Sets and Collations\n-----------------------------\n\nProcedure parameters can be declared with any character set/collation. If the\ncharacter set and collation are not specifically set, the database defaults at\nthe time of creation will be used. If the database defaults change at a later\nstage, the stored procedure character set/collation will not be changed at the\nsame time; the stored procedure needs to be dropped and recreated to ensure\nthe same character set/collation as the database is used.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nFrom MariaDB 10.3, a subset of Oracle\'s PL/SQL language has been supported in\naddition to the traditional SQL/PSM-based MariaDB syntax. See Oracle mode from\nMariaDB 10.3 for details on changes when running Oracle mode.\n\nExamples\n--------\n\nThe following example shows a simple stored procedure that uses an OUT\nparameter. It uses the DELIMITER command to set a new delimiter for the\nduration of the process — see Delimiters in the mysql client.\n\nDELIMITER //\n\nCREATE PROCEDURE simpleproc (OUT param1 INT)\n BEGIN\n SELECT COUNT(*) INTO param1 FROM t;\n END;\n//\n\nDELIMITER ;\n\nCALL simpleproc(@a);\n\nSELECT @a;\n+------+\n| @a |\n+------+\n| 1 |\n+------+\n\nCharacter set and collation:\n\nDELIMITER //\n\nCREATE PROCEDURE simpleproc2 (\n OUT param1 CHAR(10) CHARACTER SET \'utf8\' COLLATE \'utf8_bin\'\n)\n BEGIN\n SELECT CONCAT(\'a\'),f1 INTO param1 FROM t;\n END;\n//\n\nDELIMITER ;\n\nCREATE OR REPLACE:\n\nDELIMITER //\n\nCREATE PROCEDURE simpleproc2 (\n OUT param1 CHAR(10) CHARACTER SET \'utf8\' COLLATE \'utf8_bin\'\n)\n BEGIN\n SELECT CONCAT(\'a\'),f1 INTO param1 FROM t;\n END;\n//\nERROR 1304 (42000): PROCEDURE simpleproc2 already exists\n\nDELIMITER ;\n\nDELIMITER //\n\nCREATE OR REPLACE PROCEDURE simpleproc2 (\n OUT param1 CHAR(10) CHARACTER SET \'utf8\' COLLATE \'utf8_bin\'\n)\n BEGIN\n SELECT CONCAT(\'a\'),f1 INTO param1 FROM t;\n END;\n//\nERROR 1304 (42000): PROCEDURE simpleproc2 already exists\n\nDELIMITER ;\nQuery OK, 0 rows affected (0.03 sec)\n\nURL: https://mariadb.com/kb/en/create-procedure/','','https://mariadb.com/kb/en/create-procedure/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (711,38,'CREATE SERVER','Syntax\n------\n\nCREATE [OR REPLACE] SERVER [IF NOT EXISTS] server_name\n FOREIGN DATA WRAPPER wrapper_name\n OPTIONS (option [, option] ...)\n\noption:\n { HOST character-literal\n | DATABASE character-literal\n | USER character-literal\n | PASSWORD character-literal\n | SOCKET character-literal\n | OWNER character-literal\n | PORT numeric-literal }\n\nDescription\n-----------\n\nThis statement creates the definition of a server for use with the Spider,\nConnect, FEDERATED or FederatedX storage engine. The CREATE SERVER statement\ncreates a new row within the servers table within the mysql database. This\nstatement requires the SUPER privilege or, from MariaDB 10.5.2, the FEDERATED\nADMIN privilege.\n\nThe server_name should be a unique reference to the server. Server definitions\nare global within the scope of the server, it is not possible to qualify the\nserver definition to a specific database. server_name has a maximum length of\n64 characters (names longer than 64 characters are silently truncated), and is\ncase insensitive. You may specify the name as a quoted string.\n\nThe wrapper_name may be quoted with single quotes. Supported values are:\n\n* mysql\n* mariadb (in MariaDB 10.3 and later)\n\nFor each option you must specify either a character literal or numeric\nliteral. Character literals are UTF-8, support a maximum length of 64\ncharacters and default to a blank (empty) string. String literals are silently\ntruncated to 64 characters. Numeric literals must be a number between 0 and\n9999, default value is 0.\n\nNote: The OWNER option is currently not applied, and has no effect on the\nownership or operation of the server connection that is created.\n\nThe CREATE SERVER statement creates an entry in the mysql.servers table that\ncan later be used with the CREATE TABLE statement when creating a Spider,\nConnect, FederatedX or FEDERATED table. The options that you specify will be\nused to populate the columns in the mysql.servers table. The table columns are\nServer_name, Host, Db, Username, Password, Port and Socket.\n\nDROP SERVER removes a previously created server definition.\n\nCREATE SERVER is not written to the binary log, irrespective of the binary log\nformat being used. From MariaDB 10.1.13, Galera replicates the CREATE SERVER,\nALTER SERVER and DROP SERVER statements.\n\nFor valid identifiers to use as server names, see Identifier Names.\n\nOR REPLACE\n----------\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP SERVER IF EXISTS name;\nCREATE SERVER server_name ...;\n\nIF NOT EXISTS\n-------------\n\nIf the IF NOT EXISTS clause is used, MariaDB will return a warning instead of\nan error if the server already exists. Cannot be used together with OR REPLACE.\n\nExamples\n--------\n\nCREATE SERVER s\nFOREIGN DATA WRAPPER mysql\nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE \'test\');\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE SERVER s \nFOREIGN DATA WRAPPER mysql \nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE \'test\');\nERROR 1476 (HY000): The foreign server, s, you are trying to create already\nexists\n\nCREATE OR REPLACE SERVER s \nFOREIGN DATA WRAPPER mysql \nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE \'test\');\nQuery OK, 0 rows affected (0.00 sec)\n\nCREATE SERVER IF NOT EXISTS s \nFOREIGN DATA WRAPPER mysql \nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE \'test\');\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+---------------------------------------------------------------\n+\n| Level | Code | Message \n |\n+-------+------+---------------------------------------------------------------\n+\n| Note | 1476 | The foreign server, s, you are trying to create already\nexists |\n+-------+------+---------------------------------------------------------------\n+\n\nURL: https://mariadb.com/kb/en/create-server/','','https://mariadb.com/kb/en/create-server/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (712,38,'CREATE TABLESPACE','The CREATE TABLESPACE statement is not supported by MariaDB. It was originally\ninherited from MySQL NDB Cluster. In MySQL 5.7 and later, the statement is\nalso supported for InnoDB. However, MariaDB has chosen not to include that\nspecific feature. See MDEV-19294 for more information.\n\nURL: https://mariadb.com/kb/en/create-tablespace/','','https://mariadb.com/kb/en/create-tablespace/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (713,38,'CREATE TRIGGER','Syntax\n------\n\nCREATE [OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n TRIGGER [IF NOT EXISTS] trigger_name trigger_time trigger_event\n ON tbl_name FOR EACH ROW\n [{ FOLLOWS | PRECEDES } other_trigger_name ]\n trigger_stmt;\n\nDescription\n-----------\n\nThis statement creates a new trigger. A trigger is a named database object\nthat is associated with a table, and that activates when a particular event\noccurs for the table. The trigger becomes associated with the table named\ntbl_name, which must refer to a permanent table. You cannot associate a\ntrigger with a TEMPORARY table or a view.\n\nCREATE TRIGGER requires the TRIGGER privilege for the table associated with\nthe trigger.\n\nMariaDB starting with 10.2.3\n----------------------------\nYou can have multiple triggers for the same trigger_time and trigger_event.\n\nFor valid identifiers to use as trigger names, see Identifier Names.\n\nOR REPLACE\n----------\n\nMariaDB starting with 10.1.4\n----------------------------\nIf used and the trigger already exists, instead of an error being returned,\nthe existing trigger will be dropped and replaced by the newly defined trigger.\n\nDEFINER\n-------\n\nThe DEFINER clause determines the security context to be used when checking\naccess privileges at trigger activation time. Usage requires the SUPER\nprivilege, or, from MariaDB 10.5.2, the SET USER privilege.\n\nIF NOT EXISTS\n-------------\n\nMariaDB starting with 10.1.4\n----------------------------\nIf the IF NOT EXISTS clause is used, the trigger will only be created if a\ntrigger of the same name does not exist. If the trigger already exists, by\ndefault a warning will be returned.\n\ntrigger_time\n------------\n\ntrigger_time is the trigger action time. It can be BEFORE or AFTER to indicate\nthat the trigger activates before or after each row to be modified.\n\ntrigger_event\n-------------\n\ntrigger_event indicates the kind of statement that activates the trigger. The\ntrigger_event can be one of the following:\n\n* INSERT: The trigger is activated whenever a new row is inserted into the\ntable; for example, through INSERT, LOAD DATA, and REPLACE statements.\n* UPDATE: The trigger is activated whenever a row is modified; for example,\nthrough UPDATE statements.\n* DELETE: The trigger is activated whenever a row is deleted from the table;\nfor example, through DELETE and REPLACE statements. However, DROP TABLE and\nTRUNCATE statements on the table do not activate this trigger, because they do\nnot use DELETE. Dropping a partition does not activate DELETE triggers, either.\n\nFOLLOWS/PRECEDES other_trigger_name\n-----------------------------------\n\nMariaDB starting with 10.2.3\n----------------------------\nThe FOLLOWS other_trigger_name and PRECEDES other_trigger_name options were\nadded in MariaDB 10.2.3 as part of supporting multiple triggers per action\ntime. This is the same syntax used by MySQL 5.7, although MySQL 5.7 does not\nhave multi-trigger support.\n\nFOLLOWS adds the new trigger after another trigger while PRECEDES adds the new\ntrigger before another trigger. If neither option is used, the new trigger is\nadded last for the given action and time.\n\nFOLLOWS and PRECEDES are not stored in the trigger definition. However the\ntrigger order is guaranteed to not change over time. mariadb-dump/mysqldump\nand other backup methods will not change trigger order. You can verify the\ntrigger order from the ACTION_ORDER column in INFORMATION_SCHEMA.TRIGGERS\ntable.\n\nSELECT trigger_name, action_order FROM information_schema.triggers \n WHERE event_object_table=\'t1\';\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and CREATE TRIGGER is atomic.\n\nExamples\n--------\n\nCREATE DEFINER=`root`@`localhost` TRIGGER increment_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\n\nOR REPLACE and IF NOT EXISTS\n\nCREATE DEFINER=`root`@`localhost` TRIGGER increment_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\nERROR 1359 (HY000): Trigger already exists\n\nCREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER increment_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\nQuery OK, 0 rows affected (0.12 sec)\n\nCREATE DEFINER=`root`@`localhost` TRIGGER IF NOT EXISTS increment_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------+\n| Level | Code | Message |\n+-------+------+------------------------+\n| Note | 1359 | Trigger already exists |\n+-------+------+------------------------+\n1 row in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/create-trigger/','','https://mariadb.com/kb/en/create-trigger/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (714,38,'CREATE VIEW','Syntax\n------\n\nCREATE\n [OR REPLACE]\n [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n [SQL SECURITY { DEFINER | INVOKER }]\n VIEW [IF NOT EXISTS] view_name [(column_list)]\n AS select_statement\n [WITH [CASCADED | LOCAL] CHECK OPTION]\n\nDescription\n-----------\n\nThe CREATE VIEW statement creates a new view, or replaces an existing one if\nthe OR REPLACE clause is given. If the view does not exist, CREATE OR REPLACE\nVIEW is the same as CREATE VIEW. If the view does exist, CREATE OR REPLACE\nVIEW is the same as ALTER VIEW.\n\nThe select_statement is a SELECT statement that provides the definition of the\nview. (When you select from the view, you select in effect using the SELECT\nstatement.) select_statement can select from base tables or other views.\n\nThe view definition is \"frozen\" at creation time, so changes to the underlying\ntables afterwards do not affect the view definition. For example, if a view is\ndefined as SELECT * on a table, new columns added to the table later do not\nbecome part of the view. A SHOW CREATE VIEW shows that such queries are\nrewritten and column names are included in the view definition.\n\nThe view definition must be a query that does not return errors at view\ncreation times. However, the base tables used by the views might be altered\nlater and the query may not be valid anymore. In this case, querying the view\nwill result in an error. CHECK TABLE helps in finding this kind of problems.\n\nThe ALGORITHM clause affects how MariaDB processes the view. The DEFINER and\nSQL SECURITY clauses specify the security context to be used when checking\naccess privileges at view invocation time. The WITH CHECK OPTION clause can be\ngiven to constrain inserts or updates to rows in tables referenced by the\nview. These clauses are described later in this section.\n\nThe CREATE VIEW statement requires the CREATE VIEW privilege for the view, and\nsome privilege for each column selected by the SELECT statement. For columns\nused elsewhere in the SELECT statement you must have the SELECT privilege. If\nthe OR REPLACE clause is present, you must also have the DROP privilege for\nthe view.\n\nA view belongs to a database. By default, a new view is created in the default\ndatabase. To create the view explicitly in a given database, specify the name\nas db_name.view_name when you create it.\n\nCREATE VIEW test.v AS SELECT * FROM t;\n\nBase tables and views share the same namespace within a database, so a\ndatabase cannot contain a base table and a view that have the same name.\n\nViews must have unique column names with no duplicates, just like base tables.\nBy default, the names of the columns retrieved by the SELECT statement are\nused for the view column names. To define explicit names for the view columns,\nthe optional column_list clause can be given as a list of comma-separated\nidentifiers. The number of names in column_list must be the same as the number\nof columns retrieved by the SELECT statement.\n\nMySQL until 5.1.28\n------------------\nPrior to MySQL 5.1.29, When you modify an existing view, the current view\ndefinition is backed up and saved. It is stored in that table\'s database\ndirectory, in a subdirectory named arc. The backup file for a view v is named\nv.frm-00001. If you alter the view again, the next backup is named\nv.frm-00002. The three latest view backup definitions are stored. Backed up\nview definitions are not preserved by mysqldump, or any other such programs,\nbut you can retain them using a file copy operation. However, they are not\nneeded for anything but to provide you with a backup of your previous view\ndefinition. It is safe to remove these backup definitions, but only while\nmysqld is not running. If you delete the arc subdirectory or its files while\nmysqld is running, you will receive an error the next time you try to alter\nthe view:\n\nMariaDB [test]> ALTER VIEW v AS SELECT * FROM t; \nERROR 6 (HY000): Error on delete of \'.\\test\\arc/v.frm-0004\' (Errcode: 2)\n\nColumns retrieved by the SELECT statement can be simple references to table\ncolumns. They can also be expressions that use functions, constant values,\noperators, and so forth.\n\nUnqualified table or view names in the SELECT statement are interpreted with\nrespect to the default database. A view can refer to tables or views in other\ndatabases by qualifying the table or view name with the proper database name.\n\nA view can be created from many kinds of SELECT statements. It can refer to\nbase tables or other views. It can use joins, UNION, and subqueries. The\nSELECT need not even refer to any tables. The following example defines a view\nthat selects two columns from another table, as well as an expression\ncalculated from those columns:\n\nCREATE TABLE t (qty INT, price INT);\n\nINSERT INTO t VALUES(3, 50);\n\nCREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;\n\nSELECT * FROM v;\n+------+-------+-------+\n| qty | price | value |\n+------+-------+-------+\n| 3 | 50 | 150 |\n+------+-------+-------+\n\nA view definition is subject to the following restrictions:\n\n* The SELECT statement cannot contain a subquery in the FROM clause.\n* The SELECT statement cannot refer to system or user variables.\n* Within a stored program, the definition cannot refer to program parameters\nor local variables.\n* The SELECT statement cannot refer to prepared statement parameters.\n* Any table or view referred to in the definition must exist. However, after a\nview has been created, it is possible to drop a table or view that the\ndefinition refers to. In this case, use of the view results in an error. To\ncheck a view definition for problems of this kind, use the CHECK TABLE\nstatement.\n* The definition cannot refer to a TEMPORARY table, and you cannot create a\nTEMPORARY view.\n* Any tables named in the view definition must exist at definition time.\n* You cannot associate a trigger with a view.\n* For valid identifiers to use as view names, see Identifier Names.\n\nORDER BY is allowed in a view definition, but it is ignored if you select from\na view using a statement that has its own ORDER BY.\n\nFor other options or clauses in the definition, they are added to the options\nor clauses of the statement that references the view, but the effect is\nundefined. For example, if a view definition includes a LIMIT clause, and you\nselect from the view using a statement that has its own LIMIT clause, it is\nundefined which limit applies. This same principle applies to options such as\nALL, DISTINCT, or SQL_SMALL_RESULT that follow the SELECT keyword, and to\nclauses such as INTO, FOR UPDATE, and LOCK IN SHARE MODE.\n\nThe PROCEDURE clause cannot be used in a view definition, and it cannot be\nused if a view is referenced in the FROM clause.\n\nIf you create a view and then change the query processing environment by\nchanging system variables, that may affect the results that you get from the\nview:\n\nCREATE VIEW v (mycol) AS SELECT \'abc\';\n\nSET sql_mode = \'\';\n\nSELECT \"mycol\" FROM v;\n+-------+\n| mycol |\n+-------+\n| mycol | \n+-------+\n\nSET sql_mode = \'ANSI_QUOTES\';\n\nSELECT \"mycol\" FROM v;\n+-------+\n| mycol |\n+-------+\n| abc | \n+-------+\n\nThe DEFINER and SQL SECURITY clauses determine which MariaDB account to use\nwhen checking access privileges for the view when a statement is executed that\nreferences the view. They were added in MySQL 5.1.2. The legal SQL SECURITY\ncharacteristic values are DEFINER and INVOKER. These indicate that the\nrequired privileges must be held by the user who defined or invoked the view,\nrespectively. The default SQL SECURITY value is DEFINER.\n\nIf a user value is given for the DEFINER clause, it should be a MariaDB\naccount in \'user_name\'@\'host_name\' format (the same format used in the GRANT\nstatement). The user_name and host_name values both are required. The definer\ncan also be given as CURRENT_USER or CURRENT_USER(). The default DEFINER value\nis the user who executes the CREATE VIEW statement. This is the same as\nspecifying DEFINER = CURRENT_USER explicitly.\n\nIf you specify the DEFINER clause, these rules determine the legal DEFINER\nuser values:\n\n* If you do not have the SUPER privilege, or, from MariaDB 10.5.2, the SET\nUSER privilege, the only legal user value is your own account, either\nspecified literally or by using CURRENT_USER. You cannot set the definer to\nsome other account.\n* If you have the SUPER privilege, or, from MariaDB 10.5.2, the SET USER\nprivilege, you can specify any syntactically legal account name. If the\naccount does not actually exist, a warning is generated.\n* If the SQL SECURITY value is DEFINER but the definer account does not exist\nwhen the view is referenced, an error occurs.\n\nWithin a view definition, CURRENT_USER returns the view\'s DEFINER value by\ndefault. For views defined with the SQL SECURITY INVOKER characteristic,\nCURRENT_USER returns the account for the view\'s invoker. For information about\nuser auditing within views, see\nhttp://dev.mysql.com/doc/refman/5.1/en/account-activity-auditing.html.\n\nWithin a stored routine that is defined with the SQL SECURITY DEFINER\ncharacteristic, CURRENT_USER returns the routine\'s DEFINER value. This also\naffects a view defined within such a program, if the view definition contains\na DEFINER value of CURRENT_USER.\n\nView privileges are checked like this:\n\n* At view definition time, the view creator must have the privileges needed to\nuse the top-level objects accessed by the view. For example, if the view\ndefinition refers to table columns, the creator must have privileges for the\ncolumns, as described previously. If the definition refers to a stored\nfunction, only the privileges needed to invoke the function can be checked.\nThe privileges required when the function runs can be checked only as it\nexecutes: For different invocations of the function, different execution paths\nwithin the function might be taken.\n* When a view is referenced, privileges for objects accessed by the view are\nchecked against the privileges held by the view creator or invoker, depending\non whether the SQL SECURITY characteristic is DEFINER or INVOKER, respectively.\n* If reference to a view causes execution of a stored function, privilege\nchecking for statements executed within the function depend on whether the\nfunction is defined with a SQL SECURITY characteristic of DEFINER or INVOKER.\nIf the security characteristic is DEFINER, the function runs with the\nprivileges of its creator. If the characteristic is INVOKER, the function runs\nwith the privileges determined by the view\'s SQL SECURITY characteristic.\n\nExample: A view might depend on a stored function, and that function might\ninvoke other stored routines. For example, the following view invokes a stored\nfunction f():\n\nCREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);\n\nSuppose that f() contains a statement such as this:\n\nIF name IS NULL then\n CALL p1();\nELSE\n CALL p2();\nEND IF;\n\nThe privileges required for executing statements within f() need to be checked\nwhen f() executes. This might mean that privileges are needed for p1() or\np2(), depending on the execution path within f(). Those privileges must be\nchecked at runtime, and the user who must possess the privileges is determined\nby the SQL SECURITY values of the view v and the function f().\n\nThe DEFINER and SQL SECURITY clauses for views are extensions to standard SQL.\nIn standard SQL, views are handled using the rules for SQL SECURITY INVOKER.\n\nIf you invoke a view that was created before MySQL 5.1.2, it is treated as\nthough it was created with a SQL SECURITY DEFINER clause and with a DEFINER\nvalue that is the same as your account. However, because the actual definer is\nunknown, MySQL issues a warning. To make the warning go away, it is sufficient\nto re-create the view so that the view definition includes a DEFINER clause.\n\nThe optional ALGORITHM clause is an extension to standard SQL. It affects how\nMariaDB processes the view. ALGORITHM takes three values: MERGE, TEMPTABLE, or\nUNDEFINED. The default algorithm is UNDEFINED if no ALGORITHM clause is\npresent. See View Algorithms for more information.\n\nSome views are updatable. That is, you can use them in statements such as\nUPDATE, DELETE, or INSERT to update the contents of the underlying table. For\na view to be updatable, there must be a one-to-one relationship between the\nrows in the view and the rows in the underlying table. There are also certain\nother constructs that make a view non-updatable. See Inserting and Updating\nwith Views.\n\nWITH CHECK OPTION\n-----------------\n\nThe WITH CHECK OPTION clause can be given for an updatable view to prevent\ninserts or updates to rows except those for which the WHERE clause in the\nselect_statement is true.\n\nIn a WITH CHECK OPTION clause for an updatable view, the LOCAL and CASCADED\nkeywords determine the scope of check testing when the view is defined in\nterms of another view. The LOCAL keyword restricts the CHECK OPTION only to\nthe view being defined. CASCADED causes the checks for underlying views to be\nevaluated as well. When neither keyword is given, the default is CASCADED.\n\nFor more information about updatable views and the WITH CHECK OPTION clause,\nsee Inserting and Updating with Views.\n\nIF NOT EXISTS\n-------------\n\nMariaDB starting with 10.1.3\n----------------------------\nThe IF NOT EXISTS clause was added in MariaDB 10.1.3\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified view already exists. Cannot be used together with\nthe OR REPLACE clause.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and CREATE VIEW is atomic.\n\nExamples\n--------\n\nCREATE TABLE t (a INT, b INT) ENGINE = InnoDB;\n\nINSERT INTO t VALUES (1,1), (2,2), (3,3);\n\nCREATE VIEW v AS SELECT a, a*2 AS a2 FROM t;\n\nSELECT * FROM v;\n+------+------+\n| a | a2 |\n+------+------+\n| 1 | 2 |\n| 2 | 4 |\n| 3 | 6 |\n+------+------+\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE VIEW v AS SELECT a, a*2 AS a2 FROM t;\nERROR 1050 (42S01): Table \'v\' already exists\n\nCREATE OR REPLACE VIEW v AS SELECT a, a*2 AS a2 FROM t;\nQuery OK, 0 rows affected (0.04 sec)\n\nCREATE VIEW IF NOT EXISTS v AS SELECT a, a*2 AS a2 FROM t;\nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n','','https://mariadb.com/kb/en/create-view/');
-update help_topic set description = CONCAT(description, '\nSHOW WARNINGS;\n+-------+------+--------------------------+\n| Level | Code | Message |\n+-------+------+--------------------------+\n| Note | 1050 | Table \'v\' already exists |\n+-------+------+--------------------------+\n\nURL: https://mariadb.com/kb/en/create-view/') WHERE help_topic_id = 714;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (715,38,'Generated (Virtual and Persistent/Stored) Columns','Syntax\n------\n\n<type> [GENERATED ALWAYS] AS ( <expression> )\n[VIRTUAL | PERSISTENT | STORED] [UNIQUE] [UNIQUE KEY] [COMMENT <text>]\n\nMariaDB\'s generated columns syntax is designed to be similar to the syntax for\nMicrosoft SQL Server\'s computed columns and Oracle Database\'s virtual columns.\nIn MariaDB 10.2 and later, the syntax is also compatible with the syntax for\nMySQL\'s generated columns.\n\nDescription\n-----------\n\nA generated column is a column in a table that cannot explicitly be set to a\nspecific value in a DML query. Instead, its value is automatically generated\nbased on an expression. This expression might generate the value based on the\nvalues of other columns in the table, or it might generate the value by\ncalling built-in functions or user-defined functions (UDFs).\n\nThere are two types of generated columns:\n\n* PERSISTENT (a.k.a. STORED): This type\'s value is actually stored in the\ntable.\n* VIRTUAL: This type\'s value is not stored at all. Instead, the value is\ngenerated dynamically when the table is queried. This type is the default.\n\nGenerated columns are also sometimes called computed columns or virtual\ncolumns.\n\nSupported Features\n------------------\n\nStorage Engine Support\n----------------------\n\n* Generated columns can only be used with storage engines which support them.\nIf you try to use a storage engine that does not support them, then you will\nsee an error similar to the following:\n\nERROR 1910 (HY000): TokuDB storage engine does not support computed columns\n\n* InnoDB, Aria, MyISAM and CONNECT support generated columns.\n\n* A column in a MERGE table can be built on a PERSISTENT generated column.\nHowever, a column in a MERGE table can not be defined as a VIRTUAL and\nPERSISTENT generated column.\n\nData Type Support\n-----------------\n\n* All data types are supported when defining generated columns.\n\n* Using the ZEROFILL column option is supported when defining generated\ncolumns.\n\n* Using the AUTO_INCREMENT column option is not supported when defining\ngenerated columns. Until MariaDB 10.2.25, it was supported, but this support\nwas removed, because it would not work correctly. See MDEV-11117.\n\nIndex Support\n-------------\n\n* Using a generated column as a table\'s primary key is not supported. See\nMDEV-5590 for more information. If you try to use one as a primary key, then\nyou will see an error similar to the following:\n\nERROR 1903 (HY000): Primary key cannot be defined upon a computed column\n\n* Using PERSISTENT generated columns as part of a foreign key is supported.\n\n* Referencing PERSISTENT generated columns as part of a foreign key is also\nsupported.\nHowever, using the ON UPDATE CASCADE, ON UPDATE SET NULL, or ON DELETE SET\nNULL clauses is not supported. If you try to use an unsupported clause, then\nyou will see an error similar to the following:\n\nERROR 1905 (HY000): Cannot define foreign key with ON UPDATE SET NULL clause\non a computed column\n\n* Defining indexes on both VIRTUAL and PERSISTENT generated columns is\nsupported.\nIf an index is defined on a generated column, then the optimizer considers\nusing it in the same way as indexes based on \"real\" columns.\n\nStatement Support\n-----------------\n\n* Generated columns are used in DML queries just as if they were \"real\"\ncolumns.\nHowever, VIRTUAL and PERSISTENT generated columns differ in how their data is\nstored.\nValues for PERSISTENT generated columns are generated whenever a DML queries\ninserts or updates the row with the special DEFAULT value. This generates the\ncolumns value, and it is stored in the table like the other \"real\" columns.\nThis value can be read by other DML queries just like the other \"real\" columns.\nValues for VIRTUAL generated columns are not stored in the table. Instead, the\nvalue is generated dynamically whenever the column is queried. If other\ncolumns in a row are queried, but the VIRTUAL generated column is not one of\nthe queried columns, then the column\'s value is not generated.\n\n* The SELECT statement supports generated columns.\n\n* Generated columns can be referenced in the INSERT, UPDATE, and DELETE\nstatements.\nHowever, VIRTUAL or PERSISTENT generated columns cannot be explicitly set to\nany other values than NULL or DEFAULT. If a generated column is explicitly set\nto any other value, then the outcome depends on whether strict mode is enabled\nin sql_mode. If it is not enabled, then a warning will be raised and the\ndefault generated value will be used instead. If it is enabled, then an error\nwill be raised instead.\n\n* The CREATE TABLE statement has limited support for generated columns.\nIt supports defining generated columns in a new table.\nIt supports using generated columns to partition tables.\nIt does not support using the versioning clauses with generated columns.\n\n* The ALTER TABLE statement has limited support for generated columns.\nIt supports the MODIFY and CHANGE clauses for PERSISTENT generated columns.\nIt does not support the MODIFY clause for VIRTUAL generated columns if\nALGORITHM is not set to COPY. See MDEV-15476 for more information.\nIt does not support the CHANGE clause for VIRTUAL generated columns if\nALGORITHM is not set to COPY. See MDEV-17035 for more information.\nIt does not support altering a table if ALGORITHM is not set to COPY if the\ntable has a VIRTUAL generated column that is indexed. See MDEV-14046 for more\ninformation.\nIt does not support adding a VIRTUAL generated column with the ADD clause if\nthe same statement is also adding other columns if ALGORITHM is not set to\nCOPY. See MDEV-17468 for more information.\nIt also does not support altering an existing column into a VIRTUAL generated\ncolumn.\nIt supports using generated columns to partition tables.\nIt does not support using the versioning clauses with generated columns.\n\n* The SHOW CREATE TABLE statement supports generated columns.\n\n* The DESCRIBE statement can be used to check whether a table has generated\ncolumns.\nYou can tell which columns are generated by looking for the ones where the\nExtra column is set to either VIRTUAL or PERSISTENT. For example:\n\nDESCRIBE table1;\n+-------+-------------+------+-----+---------+------------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+-------------+------+-----+---------+------------+\n| a | int(11) | NO | | NULL | |\n| b | varchar(32) | YES | | NULL | |\n| c | int(11) | YES | | NULL | VIRTUAL |\n| d | varchar(5) | YES | | NULL | PERSISTENT |\n+-------+-------------+------+-----+---------+------------+\n\n* Generated columns can be properly referenced in the NEW and OLD rows in\ntriggers.\n\n* Stored procedures support generated columns.\n\n* The HANDLER statement supports generated columns.\n\nExpression Support\n------------------\n\n* Most legal, deterministic expressions which can be calculated are supported\nin expressions for generated columns.\n\n* Most built-in functions are supported in expressions for generated columns.\nHowever, some built-in functions can\'t be supported for technical reasons. For\nexample, If you try to use an unsupported function in an expression, an error\nis generated similar to the following:\n\nERROR 1901 (HY000): Function or expression \'dayname()\' cannot be used in the\nGENERATED ALWAYS AS clause of `v`\n\n* Subqueries are not supported in expressions for generated columns because\nthe underlying data can change.\n\n* Using anything that depends on data outside the row is not supported in\nexpressions for generated columns.\n\n* Stored functions are not supported in expressions for generated columns. See\nMDEV-17587 for more information.\n\n* Non-deterministic built-in functions are supported in expressions for not\nindexed VIRTUAL generated columns.\n\n* Non-deterministic built-in functions are not supported in expressions for\nPERSISTENT or indexed VIRTUAL generated columns.\n\n* User-defined functions (UDFs) are supported in expressions for generated\ncolumns.\nHowever, MariaDB can\'t check whether a UDF is deterministic, so it is up to\nthe user to be sure that they do not use non-deterministic UDFs with VIRTUAL\ngenerated columns.\n\n* Defining a generated column based on other generated columns defined before\nit in the table definition is supported. For example:\n\nCREATE TABLE t1 (a int as (1), b int as (a));\n\n* However, defining a generated column based on other generated columns\ndefined after in the table definition is not supported in expressions for\ngeneration columns because generated columns are calculated in the order they\nare defined.\n\n* Using an expression that exceeds 255 characters in length is supported in\nexpressions for generated columns. The new limit for the entire table\ndefinition, including all expressions for generated columns, is 65,535 bytes.\n\n* Using constant expressions is supported in expressions for generated\ncolumns. For example:\n\nCREATE TABLE t1 (a int as (1));\n\nMaking Stored Values Consistent\n-------------------------------\n\nWhen a generated column is PERSISTENT or indexed, the value of the expression\nneeds to be consistent regardless of the SQL Mode flags in the current\nsession. If it is not, then the table will be seen as corrupted when the value\nthat should actually be returned by the computed expression and the value that\nwas previously stored and/or indexed using a different sql_mode setting\ndisagree.\n\nThere are currently two affected classes of inconsistencies: character padding\nand unsigned subtraction:\n\n* For a VARCHAR or TEXT generated column the length of the value returned can\nvary depending on the PAD_CHAR_TO_FULL_LENGTH sql_mode flag. To make the\nvalue consistent, create the generated column using an RTRIM() or RPAD()\nfunction. Alternately, create the generated column as a CHAR column so that\nits data is always fully padded.\n\n* If a SIGNED generated column is based on the subtraction of an UNSIGNED\nvalue, the resulting value can vary depending on how large the value is and\nthe NO_UNSIGNED_SUBTRACTION sql_mode flag. To make the value consistent, use\nCAST() to ensure that each UNSIGNED operand is SIGNED before the subtraction.\n\nMariaDB starting with 10.5\n--------------------------\nBeginning in MariaDB 10.5, there is a fatal error generated when trying to\ncreate a generated column whose value can change depending on the SQL Mode\nwhen its data is PERSISTENT or indexed.\n\nFor an existing generated column that has a potentially inconsistent value, a\nwarning about a bad expression is generated the first time it is used (if\nwarnings are enabled).\n\nBeginning in MariaDB 10.4.8, MariaDB 10.3.18, and MariaDB 10.2.27 a\npotentially inconsistent generated column outputs a warning when created or\nfirst used (without restricting their creation).\n\nHere is an example of two tables that would be rejected in MariaDB 10.5 and\nwarned about in the other listed versions:\n\nCREATE TABLE bad_pad (\n txt CHAR(5),\n -- CHAR -> VARCHAR or CHAR -> TEXT can\'t be persistent or indexed:\n vtxt VARCHAR(5) AS (txt) PERSISTENT\n);\n\nCREATE TABLE bad_sub (\n num1 BIGINT UNSIGNED,\n num2 BIGINT UNSIGNED,\n -- The resulting value can vary for some large values\n vnum BIGINT AS (num1 - num2) VIRTUAL,\n KEY(vnum)\n);\n\nThe warnings for the above tables look like this:\n\nWarning (Code 1901): Function or expression \'`txt`\' cannot be used in the\nGENERATED ALWAYS AS clause of `vtxt`\nWarning (Code 1105): Expression depends on the @@sql_mode value\nPAD_CHAR_TO_FULL_LENGTH\n\nWarning (Code 1901): Function or expression \'`num1` - `num2`\' cannot be used\nin the GENERATED ALWAYS AS clause of `vnum`\nWarning (Code 1105): Expression depends on the @@sql_mode value\nNO_UNSIGNED_SUBTRACTION\n\nTo work around the issue, force the padding or type to make the generated\ncolumn\'s expression return a consistent value. For example:\n\nCREATE TABLE good_pad (\n txt CHAR(5),\n -- Using RTRIM() or RPAD() makes the value consistent:\n vtxt VARCHAR(5) AS (RTRIM(txt)) PERSISTENT,\n -- When not persistent or indexed, it is OK for the value to vary by mode:\n vtxt2 VARCHAR(5) AS (txt) VIRTUAL,\n -- CHAR -> CHAR is always OK:\n txt2 CHAR(5) AS (txt) PERSISTENT\n);\n\nCREATE TABLE good_sub (\n num1 BIGINT UNSIGNED,\n num2 BIGINT UNSIGNED,\n -- The indexed value will always be consistent in this expression:\n vnum BIGINT AS (CAST(num1 AS SIGNED) - CAST(num2 AS SIGNED)) VIRTUAL,\n KEY(vnum)\n);\n\nMySQL Compatibility Support\n---------------------------\n\n* The STORED keyword is supported as an alias for the PERSISTENT keyword.\n\n* Tables created with MySQL 5.7 or later that contain MySQL\'s generated\ncolumns can be imported into MariaDB without a dump and restore.\n\nImplementation Differences\n--------------------------\n\nGenerated columns are subject to various constraints in other DBMSs that are\nnot present in MariaDB\'s implementation. Generated columns may also be called\ncomputed columns or virtual columns in different implementations. The various\ndetails for a specific implementation can be found in the documentation for\neach specific DBMS.\n\nImplementation Differences Compared to Microsoft SQL Server\n-----------------------------------------------------------\n\nMariaDB\'s generated columns implementation does not enforce the following\nrestrictions that are present in Microsoft SQL Server\'s computed columns\nimplementation:\n\n* MariaDB allows server variables in generated column expressions, including\nthose that change dynamically, such as warning_count.\n* MariaDB allows the CONVERT_TZ() function to be called with a named time zone\nas an argument, even though time zone names and time offsets are configurable.\n* MariaDB allows the CAST() function to be used with non-unicode character\nsets, even though character sets are configurable and differ between\nbinaries/versions.\n* MariaDB allows FLOAT expressions to be used in generated columns. Microsoft\nSQL Server considers these expressions to be \"imprecise\" due to potential\ncross-platform differences in floating-point implementations and precision.\n* Microsoft SQL Server requires the ARITHABORT mode to be set, so that\ndivision by zero returns an error, and not a NULL.\n* Microsoft SQL Server requires QUOTED_IDENTIFIER to be set in sql_mode. In\nMariaDB, if data is inserted without ANSI_QUOTES set in sql_mode, then it will','','https://mariadb.com/kb/en/generated-columns/');
-update help_topic set description = CONCAT(description, '\nbe processed and stored differently in a generated column that contains quoted\nidentifiers.\n\nMicrosoft SQL Server enforces the above restrictions by doing one of the\nfollowing things:\n\n* Refusing to create computed columns.\n* Refusing to allow updates to a table containing them.\n* Refusing to use an index over such a column if it can not be guaranteed that\nthe expression is fully deterministic.\n\nIn MariaDB, as long as the sql_mode, language, and other settings that were in\neffect during the CREATE TABLE remain unchanged, the generated column\nexpression will always be evaluated the same. If any of these things change,\nthen please be aware that the generated column expression might not be\nevaluated the same way as it previously was.\n\nIf you try to update a virtual column, you will get an error if the default\nstrict mode is enabled in sql_mode, or a warning otherwise.\n\nDevelopment History\n-------------------\n\nGenerated columns was originally developed by Andrey Zhakov. It was then\nmodified by Sanja Byelkin and Igor Babaev at Monty Program for inclusion in\nMariaDB. Monty did the work on MariaDB 10.2 to lift a some of the old\nlimitations.\n\nExamples\n--------\n\nHere is an example table that uses both VIRTUAL and PERSISTENT virtual columns:\n\nUSE TEST;\n\nCREATE TABLE table1 (\n a INT NOT NULL,\n b VARCHAR(32),\n c INT AS (a mod 10) VIRTUAL,\n d VARCHAR(5) AS (left(b,5)) PERSISTENT);\n\nIf you describe the table, you can easily see which columns are virtual by\nlooking in the \"Extra\" column:\n\nDESCRIBE table1;\n+-------+-------------+------+-----+---------+------------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+-------------+------+-----+---------+------------+\n| a | int(11) | NO | | NULL | |\n| b | varchar(32) | YES | | NULL | |\n| c | int(11) | YES | | NULL | VIRTUAL |\n| d | varchar(5) | YES | | NULL | PERSISTENT |\n+-------+-------------+------+-----+---------+------------+\n\nTo find out what function(s) generate the value of the virtual column you can\nuse SHOW CREATE TABLE:\n\nSHOW CREATE TABLE table1;\n\n| table1 | CREATE TABLE `table1` (\n `a` int(11) NOT NULL,\n `b` varchar(32) DEFAULT NULL,\n `c` int(11) AS (a mod 10) VIRTUAL,\n `d` varchar(5) AS (left(b,5)) PERSISTENT\n) ENGINE=MyISAM DEFAULT CHARSET=latin1 |\n\nIf you try to insert non-default values into a virtual column, you will\nreceive a warning and what you tried to insert will be ignored and the derived\nvalue inserted instead:\n\nWARNINGS;\nShow warnings enabled.\n\nINSERT INTO table1 VALUES (1, \'some text\',default,default);\nQuery OK, 1 row affected (0.00 sec)\n\nINSERT INTO table1 VALUES (2, \'more text\',5,default);\nQuery OK, 1 row affected, 1 warning (0.00 sec)\n\nWarning (Code 1645): The value specified for computed column \'c\' in table\n\'table1\' has been ignored.\n\nINSERT INTO table1 VALUES (123, \'even more text\',default,\'something\');\nQuery OK, 1 row affected, 2 warnings (0.00 sec)\n\nWarning (Code 1645): The value specified for computed column \'d\' in table\n\'table1\' has been ignored.\nWarning (Code 1265): Data truncated for column \'d\' at row 1\n\nSELECT * FROM table1;\n+-----+----------------+------+-------+\n| a | b | c | d |\n+-----+----------------+------+-------+\n| 1 | some text | 1 | some |\n| 2 | more text | 2 | more |\n| 123 | even more text | 3 | even |\n+-----+----------------+------+-------+\n3 rows in set (0.00 sec)\n\nIf the ZEROFILL clause is specified, it should be placed directly after the\ntype definition, before the AS (<expression>):\n\nCREATE TABLE table2 (a INT, b INT ZEROFILL AS (a*2) VIRTUAL);\nINSERT INTO table2 (a) VALUES (1);\n\nSELECT * FROM table2;\n+------+------------+\n| a | b |\n+------+------------+\n| 1 | 0000000002 |\n+------+------------+\n1 row in set (0.00 sec)\n\nYou can also use virtual columns to implement a \"poor man\'s partial index\".\nSee example at the end of Unique Index.\n\nURL: https://mariadb.com/kb/en/generated-columns/') WHERE help_topic_id = 715;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (716,38,'Invisible Columns','MariaDB starting with 10.3.3\n----------------------------\nInvisible columns (sometimes also called hidden columns) first appeared in\nMariaDB 10.3.3.\n\nColumns can be given an INVISIBLE attribute in a CREATE TABLE or ALTER TABLE\nstatement. These columns will then not be listed in the results of a SELECT *\nstatement, nor do they need to be assigned a value in an INSERT statement,\nunless INSERT explicitly mentions them by name.\n\nSince SELECT * does not return the invisible columns, new tables or views\ncreated in this manner will have no trace of the invisible columns. If\nspecifically referenced in the SELECT statement, the columns will be brought\ninto the view/new table, but the INVISIBLE attribute will not.\n\nInvisible columns can be declared as NOT NULL, but then require a DEFAULT\nvalue.\n\nIt is not possible for all columns in a table to be invisible.\n\nExamples\n--------\n\nCREATE TABLE t (x INT INVISIBLE);\nERROR 1113 (42000): A table must have at least 1 column\n\nCREATE TABLE t (x INT, y INT INVISIBLE, z INT INVISIBLE NOT NULL);\nERROR 4106 (HY000): Invisible column `z` must have a default value\n\nCREATE TABLE t (x INT, y INT INVISIBLE, z INT INVISIBLE NOT NULL DEFAULT 4);\n\nINSERT INTO t VALUES (1),(2);\n\nINSERT INTO t (x,y) VALUES (3,33);\n\nSELECT * FROM t;\n+------+\n| x |\n+------+\n| 1 |\n| 2 |\n| 3 |\n+------+\n\nSELECT x,y,z FROM t;\n+------+------+---+\n| x | y | z |\n+------+------+---+\n| 1 | NULL | 4 |\n| 2 | NULL | 4 |\n| 3 | 33 | 4 |\n+------+------+---+\n\nDESC t;\n+-------+---------+------+-----+---------+-----------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-----------+\n| x | int(11) | YES | | NULL | |\n| y | int(11) | YES | | NULL | INVISIBLE |\n| z | int(11) | NO | | 4 | INVISIBLE |\n+-------+---------+------+-----+---------+-----------+\n\nALTER TABLE t MODIFY x INT INVISIBLE, MODIFY y INT, MODIFY z INT NOT NULL\nDEFAULT 4;\n\nDESC t;\n+-------+---------+------+-----+---------+-----------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-----------+\n| x | int(11) | YES | | NULL | INVISIBLE |\n| y | int(11) | YES | | NULL | |\n| z | int(11) | NO | | 4 | |\n+-------+---------+------+-----+---------+-----------+\n\nCreating a view from a table with hidden columns:\n\nCREATE VIEW v1 AS SELECT * FROM t;\n\nDESC v1;\n+-------+---------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-------+\n| y | int(11) | YES | | NULL | |\n| z | int(11) | NO | | 4 | |\n+-------+---------+------+-----+---------+-------+\n\nCREATE VIEW v2 AS SELECT x,y,z FROM t;\n\nDESC v2;\n+-------+---------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-------+\n| x | int(11) | YES | | NULL | |\n| y | int(11) | YES | | NULL | |\n| z | int(11) | NO | | 4 | |\n+-------+---------+------+-----+---------+-------+\n\nAdding a Surrogate Primary Key:\n\ncreate table t1 (x bigint unsigned not null, y varchar(16), z text);\n\ninsert into t1 values (123, \'qq11\', \'ipsum\');\n\ninsert into t1 values (123, \'qq22\', \'lorem\');\n\nalter table t1 add pkid serial primary key invisible first;\n\ninsert into t1 values (123, \'qq33\', \'amet\');\n\nselect * from t1;\n+-----+------+-------+\n| x | y | z |\n+-----+------+-------+\n| 123 | qq11 | ipsum |\n| 123 | qq22 | lorem |\n| 123 | qq33 | amet |\n+-----+------+-------+\n\nselect pkid, z from t1;\n+------+-------+\n| pkid | z |\n+------+-------+\n| 1 | ipsum |\n| 2 | lorem |\n| 3 | amet |\n+------+-------+\n\nURL: https://mariadb.com/kb/en/invisible-columns/','','https://mariadb.com/kb/en/invisible-columns/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (717,38,'DROP DATABASE','Syntax\n------\n\nDROP {DATABASE | SCHEMA} [IF EXISTS] db_name\n\nDescription\n-----------\n\nDROP DATABASE drops all tables in the database and deletes the database. Be\nvery careful with this statement! To use DROP DATABASE, you need the DROP\nprivilege on the database. DROP SCHEMA is a synonym for DROP DATABASE.\n\nImportant: When a database is dropped, user privileges on the database are not\nautomatically dropped. See GRANT.\n\nIF EXISTS\n---------\n\nUse IF EXISTS to prevent an error from occurring for databases that do not\nexist. A NOTE is generated for each non-existent database when using IF\nEXISTS. See SHOW WARNINGS.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL.\n\nDROP DATABASE is implemented as\n\nloop over all tables\n DROP TABLE table\n\nEach individual DROP TABLE is atomic while DROP DATABASE as a whole is\ncrash-safe.\n\nExamples\n--------\n\nDROP DATABASE bufg;\nQuery OK, 0 rows affected (0.39 sec)\n\nDROP DATABASE bufg;\nERROR 1008 (HY000): Can\'t drop database \'bufg\'; database doesn\'t exist\n\n\\W\nShow warnings enabled.\n\nDROP DATABASE IF EXISTS bufg;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\nNote (Code 1008): Can\'t drop database \'bufg\'; database doesn\'t exist\n\nURL: https://mariadb.com/kb/en/drop-database/','','https://mariadb.com/kb/en/drop-database/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (718,38,'DROP EVENT','Syntax\n------\n\nDROP EVENT [IF EXISTS] event_name\n\nDescription\n-----------\n\nThis statement drops the event named event_name. The event immediately ceases\nbeing active, and is deleted completely from the server.\n\nIf the event does not exist, the error ERROR 1517 (HY000): Unknown event\n\'event_name\' results. You can override this and cause the statement to\ngenerate a NOTE for non-existent events instead by using IF EXISTS. See SHOW\nWARNINGS.\n\nThis statement requires the EVENT privilege. In MySQL 5.1.11 and earlier, an\nevent could be dropped only by its definer, or by a user having the SUPER\nprivilege.\n\nExamples\n--------\n\nDROP EVENT myevent3;\n\nUsing the IF EXISTS clause:\n\nDROP EVENT IF EXISTS myevent3;\nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------------+\n| Note | 1305 | Event myevent3 does not exist |\n+-------+------+-------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-event/','','https://mariadb.com/kb/en/drop-event/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (719,38,'DROP FUNCTION','Syntax\n------\n\nDROP FUNCTION [IF EXISTS] f_name\n\nDescription\n-----------\n\nThe DROP FUNCTION statement is used to drop a stored function or a\nuser-defined function (UDF). That is, the specified routine is removed from\nthe server, along with all privileges specific to the function. You must have\nthe ALTER ROUTINE privilege for the routine in order to drop it. If the\nautomatic_sp_privileges server system variable is set, both the ALTER ROUTINE\nand EXECUTE privileges are granted automatically to the routine creator - see\nStored Routine Privileges.\n\nIF EXISTS\n---------\n\nThe IF EXISTS clause is a MySQL/MariaDB extension. It prevents an error from\noccurring if the function does not exist. A NOTE is produced that can be\nviewed with SHOW WARNINGS.\n\nFor dropping a user-defined functions (UDF), see DROP FUNCTION UDF.\n\nExamples\n--------\n\nDROP FUNCTION hello;\nQuery OK, 0 rows affected (0.042 sec)\n\nDROP FUNCTION hello;\nERROR 1305 (42000): FUNCTION test.hello does not exist\n\nDROP FUNCTION IF EXISTS hello;\nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------+\n| Note | 1305 | FUNCTION test.hello does not exist |\n+-------+------+------------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-function/','','https://mariadb.com/kb/en/drop-function/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (720,38,'DROP INDEX','Syntax\n------\n\nDROP INDEX [IF EXISTS] index_name ON tbl_name \n [WAIT n |NOWAIT]\n\nDescription\n-----------\n\nDROP INDEX drops the index named index_name from the table tbl_name. This\nstatement is mapped to an ALTER TABLE statement to drop the index.\n\nIf another connection is using the table, a metadata lock is active, and this\nstatement will wait until the lock is released. This is also true for\nnon-transactional tables.\n\nSee ALTER TABLE.\n\nAnother shortcut, CREATE INDEX, allows the creation of an index.\n\nTo remove the primary key, `PRIMARY` must be specified as index_name. Note\nthat the quotes are necessary, because PRIMARY is a keyword.\n\nPrivileges\n----------\n\nExecuting the DROP INDEX statement requires the INDEX privilege for the table\nor the database.\n\nOnline DDL\n----------\n\nOnline DDL is used by default with InnoDB, when the drop index operation\nsupports it.\n\nSee InnoDB Online DDL Overview for more information on online DDL with InnoDB.\n\nDROP INDEX IF EXISTS ...\n------------------------\n\nIf the IF EXISTS clause is used, then MariaDB will return a warning instead of\nan error if the index does not exist.\n\nWAIT/NOWAIT\n-----------\n\nMariaDB starting with 10.3.0\n----------------------------\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nProgress Reporting\n------------------\n\nMariaDB provides progress reporting for DROP INDEX statement for clients that\nsupport the new progress reporting protocol. For example, if you were using\nthe mysql client, then the progress report might look like this::\n\nURL: https://mariadb.com/kb/en/drop-index/','','https://mariadb.com/kb/en/drop-index/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (721,38,'DROP PACKAGE','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nDROP PACKAGE [IF EXISTS] [ db_name . ] package_name\n\nDescription\n-----------\n\nThe DROP PACKAGE statement can be used when Oracle SQL_MODE is set.\n\nThe DROP PACKAGE statement drops a stored package entirely:\n\n* Drops the package specification (earlier created using the CREATE PACKAGE\nstatement).\n* Drops the package implementation, if the implementation was already created\nusing the CREATE PACKAGE BODY statement.\n\nURL: https://mariadb.com/kb/en/drop-package/','','https://mariadb.com/kb/en/drop-package/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (722,38,'DROP PACKAGE BODY','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nDROP PACKAGE BODY [IF EXISTS] [ db_name . ] package_name\n\nDescription\n-----------\n\nThe DROP PACKAGE BODY statement can be used when Oracle SQL_MODE is set.\n\nThe DROP PACKAGE BODY statement drops the package body (i.e the\nimplementation), previously created using the CREATE PACKAGE BODY statement.\n\nNote, DROP PACKAGE BODY drops only the package implementation, but does not\ndrop the package specification. Use DROP PACKAGE to drop the package entirely\n(i.e. both implementation and specification).\n\nURL: https://mariadb.com/kb/en/drop-package-body/','','https://mariadb.com/kb/en/drop-package-body/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (723,38,'DROP PROCEDURE','Syntax\n------\n\nDROP PROCEDURE [IF EXISTS] sp_name\n\nDescription\n-----------\n\nThis statement is used to drop a stored procedure. That is, the specified\nroutine is removed from the server along with all privileges specific to the\nprocedure. You must have the ALTER ROUTINE privilege for the routine. If the\nautomatic_sp_privileges server system variable is set, that privilege and\nEXECUTE are granted automatically to the routine creator - see Stored Routine\nPrivileges.\n\nThe IF EXISTS clause is a MySQL/MariaDB extension. It prevents an error from\noccurring if the procedure or function does not exist. A NOTE is produced that\ncan be viewed with SHOW WARNINGS.\n\nWhile this statement takes effect immediately, threads which are executing a\nprocedure can continue execution.\n\nExamples\n--------\n\nDROP PROCEDURE simpleproc;\n\nIF EXISTS:\n\nDROP PROCEDURE simpleproc;\nERROR 1305 (42000): PROCEDURE test.simpleproc does not exist\n\nDROP PROCEDURE IF EXISTS simpleproc;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------------+\n| Note | 1305 | PROCEDURE test.simpleproc does not exist |\n+-------+------+------------------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-procedure/','','https://mariadb.com/kb/en/drop-procedure/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (724,38,'DROP SERVER','Syntax\n------\n\nDROP SERVER [ IF EXISTS ] server_name\n\nDescription\n-----------\n\nDrops the server definition for the server named server_name. The\ncorresponding row within the mysql.servers table will be deleted. This\nstatement requires the SUPER privilege or, from MariaDB 10.5.2, the FEDERATED\nADMIN privilege.\n\nDropping a server for a table does not affect any FederatedX, FEDERATED,\nConnect or Spider tables that used this connection information when they were\ncreated.\n\nDROP SERVER is not written to the binary log, irrespective of the binary log\nformat being used. From MariaDB 10.1.13, Galera replicates the CREATE SERVER,\nALTER SERVER and DROP SERVER statements.\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will not return an error if the\nserver does not exist. Unlike all other statements, DROP SERVER IF EXISTS does\nnot issue a note if the server does not exist. See MDEV-9400.\n\nExamples\n--------\n\nDROP SERVER s;\n\nIF EXISTS:\n\nDROP SERVER s;\nERROR 1477 (HY000): The foreign server name you are trying to reference \n does not exist. Data source error: s\n\nDROP SERVER IF EXISTS s;\nQuery OK, 0 rows affected (0.00 sec)\n\nURL: https://mariadb.com/kb/en/drop-server/','','https://mariadb.com/kb/en/drop-server/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (725,38,'DROP TABLESPACE','The DROP TABLESPACE statement is not supported by MariaDB. It was originally\ninherited from MySQL NDB Cluster. In MySQL 5.7 and later, the statement is\nalso supported for InnoDB. However, MariaDB has chosen not to include that\nspecific feature. See MDEV-19294 for more information.\n\nURL: https://mariadb.com/kb/en/drop-tablespace/','','https://mariadb.com/kb/en/drop-tablespace/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (726,38,'DROP TRIGGER','Syntax\n------\n\nDROP TRIGGER [IF EXISTS] [schema_name.]trigger_name\n\nDescription\n-----------\n\nThis statement drops a trigger. The schema (database) name is optional. If the\nschema is omitted, the trigger is dropped from the default schema. Its use\nrequires the TRIGGER privilege for the table associated with the trigger.\n\nUse IF EXISTS to prevent an error from occurring for a trigger that does not\nexist. A NOTE is generated for a non-existent trigger when using IF EXISTS.\nSee SHOW WARNINGS.\n\nNote: Triggers for a table are also dropped if you drop the table.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and DROP TRIGGER is atomic.\n\nExamples\n--------\n\nDROP TRIGGER test.example_trigger;\n\nUsing the IF EXISTS clause:\n\nDROP TRIGGER IF EXISTS test.example_trigger;\nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------+\n| Level | Code | Message |\n+-------+------+------------------------+\n| Note | 1360 | Trigger does not exist |\n+-------+------+------------------------+\n\nURL: https://mariadb.com/kb/en/drop-trigger/','','https://mariadb.com/kb/en/drop-trigger/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (727,38,'DROP VIEW','Syntax\n------\n\nDROP VIEW [IF EXISTS]\n view_name [, view_name] ...\n [RESTRICT | CASCADE]\n\nDescription\n-----------\n\nDROP VIEW removes one or more views. You must have the DROP privilege for each\nview. If any of the views named in the argument list do not exist, MariaDB\nreturns an error indicating by name which non-existing views it was unable to\ndrop, but it also drops all of the views in the list that do exist.\n\nThe IF EXISTS clause prevents an error from occurring for views that don\'t\nexist. When this clause is given, a NOTE is generated for each non-existent\nview. See SHOW WARNINGS.\n\nRESTRICT and CASCADE, if given, are parsed and ignored.\n\nIt is possible to specify view names as db_name.view_name. This is useful to\ndelete views from multiple databases with one statement. See Identifier\nQualifiers for details.\n\nThe DROP privilege is required to use DROP TABLE on non-temporary tables. For\ntemporary tables, no privilege is required, because such tables are only\nvisible for the current session.\n\nIf a view references another view, it will be possible to drop the referenced\nview. However, the other view will reference a view which does not exist any\nmore. Thus, querying it will produce an error similar to the following:\n\nERROR 1356 (HY000): View \'db_name.view_name\' references invalid table(s) or \ncolumn(s) or function(s) or definer/invoker of view lack rights to use them\n\nThis problem is reported in the output of CHECK TABLE.\n\nNote that it is not necessary to use DROP VIEW to replace an existing view,\nbecause CREATE VIEW has an OR REPLACE clause.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and DROP VIEW for a singular view is\natomic. Dropping multiple views is crash-safe.\n\nExamples\n--------\n\nDROP VIEW v,v2;\n\nGiven views v and v2, but no view v3\n\nDROP VIEW v,v2,v3;\nERROR 1051 (42S02): Unknown table \'v3\'\n\nDROP VIEW IF EXISTS v,v2,v3;\nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------+\n| Note | 1051 | Unknown table \'test.v3\' |\n+-------+------+-------------------------+\n\nURL: https://mariadb.com/kb/en/drop-view/','','https://mariadb.com/kb/en/drop-view/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (728,38,'CONSTRAINT','MariaDB supports the implementation of constraints at the table-level using\neither CREATE TABLE or ALTER TABLE statements. A table constraint restricts\nthe data you can add to the table. If you attempt to insert invalid data on a\ncolumn, MariaDB throws an error.\n\nSyntax\n------\n\n[CONSTRAINT [symbol]] constraint_expression\n\nconstraint_expression:\n | PRIMARY KEY [index_type] (index_col_name, ...) [index_option] ...\n | FOREIGN KEY [index_name] (index_col_name, ...)\n REFERENCES tbl_name (index_col_name, ...)\n [ON DELETE reference_option]\n [ON UPDATE reference_option]\n | UNIQUE [INDEX|KEY] [index_name]\n [index_type] (index_col_name, ...) [index_option] ...\n | CHECK (check_constraints)\n\nindex_type:\n USING {BTREE | HASH | RTREE}\n\nindex_col_name:\n col_name [(length)] [ASC | DESC]\n\nindex_option:\n | KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n | CLUSTERING={YES|NO}\n\nreference_option:\n RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT\n\nDescription\n-----------\n\nConstraints provide restrictions on the data you can add to a table. This\nallows you to enforce data integrity from MariaDB, rather than through\napplication logic. When a statement violates a constraint, MariaDB throws an\nerror.\n\nThere are four types of table constraints:\n\n+------------------------------------+---------------------------------------+\n| Constraint | Description |\n+------------------------------------+---------------------------------------+\n| PRIMARY KEY | Sets the column for referencing |\n| | rows. Values must be unique and not |\n| | null. |\n+------------------------------------+---------------------------------------+\n| FOREIGN KEY | Sets the column to reference the |\n| | primary key on another table. |\n+------------------------------------+---------------------------------------+\n| UNIQUE | Requires values in column or columns |\n| | only occur once in the table. |\n+------------------------------------+---------------------------------------+\n| CHECK | Checks whether the data meets the |\n| | given condition. |\n+------------------------------------+---------------------------------------+\n\nThe Information Schema TABLE_CONSTRAINTS Table contains information about\ntables that have constraints.\n\nFOREIGN KEY Constraints\n-----------------------\n\nInnoDB supports foreign key constraints. The syntax for a foreign key\nconstraint definition in InnoDB looks like this:\n\n[CONSTRAINT [symbol]] FOREIGN KEY\n [index_name] (index_col_name, ...)\n REFERENCES tbl_name (index_col_name,...)\n [ON DELETE reference_option]\n [ON UPDATE reference_option]\n\nreference_option:\n RESTRICT | CASCADE | SET NULL | NO ACTION\n\nThe Information Schema REFERENTIAL_CONSTRAINTS table has more information\nabout foreign keys.\n\nCHECK Constraints\n-----------------\n\nMariaDB starting with 10.2.1\n----------------------------\nFrom MariaDB 10.2.1, constraints are enforced. Before MariaDB 10.2.1\nconstraint expressions were accepted in the syntax but ignored.\n\nIn MariaDB 10.2.1 you can define constraints in 2 different ways:\n\n* CHECK(expression) given as part of a column definition.\n* CONSTRAINT [constraint_name] CHECK (expression)\n\nBefore a row is inserted or updated, all constraints are evaluated in the\norder they are defined. If any constraint expression returns false, then the\nrow will not be inserted or updated. One can use most deterministic functions\nin a constraint, including UDFs.\n\nCREATE TABLE t1 (a INT CHECK (a>2), b INT CHECK (b>2), CONSTRAINT a_greater\nCHECK (a>b));\n\nIf you use the second format and you don\'t give a name to the constraint, then\nthe constraint will get an automatically generated name. This is done so that\nyou can later delete the constraint with ALTER TABLE DROP constraint_name.\n\nOne can disable all constraint expression checks by setting the\ncheck_constraint_checks variable to OFF. This is useful for example when\nloading a table that violates some constraints that you want to later find and\nfix in SQL.\n\nReplication\n-----------\n\nIn row-based replication, only the master checks constraints, and failed\nstatements will not be replicated. In statement-based replication, the slaves\nwill also check constraints. Constraints should therefore be identical, as\nwell as deterministic, in a replication environment.\n\nAuto_increment\n--------------\n\nMariaDB starting with 10.2.6\n----------------------------\n* From MariaDB 10.2.6, auto_increment columns are no longer permitted in check\nconstraints. Previously they were permitted, but would not work correctly. See\nMDEV-11117.\n\nExamples\n--------\n\nCREATE TABLE product (category INT NOT NULL, id INT NOT NULL,\n price DECIMAL,\n PRIMARY KEY(category, id)) ENGINE=INNODB;\nCREATE TABLE customer (id INT NOT NULL,\n PRIMARY KEY (id)) ENGINE=INNODB;\nCREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,\n product_category INT NOT NULL,\n product_id INT NOT NULL,\n customer_id INT NOT NULL,\n PRIMARY KEY(no),\n INDEX (product_category, product_id),\n FOREIGN KEY (product_category, product_id)\n REFERENCES product(category, id)\n ON UPDATE CASCADE ON DELETE RESTRICT,\n INDEX (customer_id),\n FOREIGN KEY (customer_id)\n REFERENCES customer(id)) ENGINE=INNODB;\n\nMariaDB starting with 10.2.1\n----------------------------\nThe following examples will work from MariaDB 10.2.1 onwards.\n\nNumeric constraints and comparisons:\n\nCREATE TABLE t1 (a INT CHECK (a>2), b INT CHECK (b>2), CONSTRAINT a_greater\nCHECK (a>b));\n\nINSERT INTO t1(a) VALUES (1);\nERROR 4022 (23000): CONSTRAINT `a` failed for `test`.`t1`\n\nINSERT INTO t1(a,b) VALUES (3,4);\nERROR 4022 (23000): CONSTRAINT `a_greater` failed for `test`.`t1`\n\nINSERT INTO t1(a,b) VALUES (4,3);\nQuery OK, 1 row affected (0.04 sec)\n\nDropping a constraint:\n\nALTER TABLE t1 DROP CONSTRAINT a_greater;\n\nAdding a constraint:\n\nALTER TABLE t1 ADD CONSTRAINT a_greater CHECK (a>b);\n\nDate comparisons and character length:\n\nCREATE TABLE t2 (name VARCHAR(30) CHECK (CHAR_LENGTH(name)>2), start_date\nDATE, \n end_date DATE CHECK (start_date IS NULL OR end_date IS NULL OR\nstart_date<end_date));\n\nINSERT INTO t2(name, start_date, end_date) VALUES(\'Ione\', \'2003-12-15\',\n\'2014-11-09\');\nQuery OK, 1 row affected (0.04 sec)\n\nINSERT INTO t2(name, start_date, end_date) VALUES(\'Io\', \'2003-12-15\',\n\'2014-11-09\');\nERROR 4022 (23000): CONSTRAINT `name` failed for `test`.`t2`\n\nINSERT INTO t2(name, start_date, end_date) VALUES(\'Ione\', NULL, \'2014-11-09\');\nQuery OK, 1 row affected (0.04 sec)\n\nINSERT INTO t2(name, start_date, end_date) VALUES(\'Ione\', \'2015-12-15\',\n\'2014-11-09\');\nERROR 4022 (23000): CONSTRAINT `end_date` failed for `test`.`t2`\n\nA misplaced parenthesis:\n\nCREATE TABLE t3 (name VARCHAR(30) CHECK (CHAR_LENGTH(name>2)), start_date\nDATE, \n end_date DATE CHECK (start_date IS NULL OR end_date IS NULL OR\nstart_date<end_date));\nQuery OK, 0 rows affected (0.32 sec)\n\nINSERT INTO t3(name, start_date, end_date) VALUES(\'Io\', \'2003-12-15\',\n\'2014-11-09\');\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n\nSHOW WARNINGS;\n+---------+------+----------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------+\n| Warning | 1292 | Truncated incorrect DOUBLE value: \'Io\' |\n+---------+------+----------------------------------------+\n\nCompare the definition of table t2 to table t3. CHAR_LENGTH(name)>2 is very\ndifferent to CHAR_LENGTH(name>2) as the latter mistakenly performs a numeric\ncomparison on the name field, leading to unexpected results.\n\nURL: https://mariadb.com/kb/en/constraint/','','https://mariadb.com/kb/en/constraint/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (729,38,'Dynamic Columns','Dynamic columns allow one to store different sets of columns for each row in a\ntable. It works by storing a set of columns in a blob and having a small set\nof functions to manipulate it. Dynamic columns should be used when it is not\npossible to use regular columns. A typical use case is when one needs to store\nitems that may have many different attributes (like size, color, weight, etc),\nand the set of possible attributes is very large and/or unknown in advance. In\nthat case, attributes can be put into dynamic columns.\n\nDynamic Columns Basics\n----------------------\n\nThe table should have a blob column which will be used as storage for dynamic\ncolumns:\n\ncreate table assets (\n item_name varchar(32) primary key, -- A common attribute for all items\n dynamic_cols blob -- Dynamic columns will be stored here\n);\n\nOnce created, one can access dynamic columns via dynamic column functions:\n\nInsert a row with two dynamic columns: color=blue, size=XL\n\nINSERT INTO assets VALUES \n (\'MariaDB T-shirt\', COLUMN_CREATE(\'color\', \'blue\', \'size\', \'XL\'));\n\nInsert another row with dynamic columns: color=black, price=500\n\nINSERT INTO assets VALUES\n (\'Thinkpad Laptop\', COLUMN_CREATE(\'color\', \'black\', \'price\', 500));\n\nSelect dynamic column \'color\' for all items:\n\nSELECT item_name, COLUMN_GET(dynamic_cols, \'color\' as char) \n AS color FROM assets;\n+-----------------+-------+\n| item_name | color |\n+-----------------+-------+\n| MariaDB T-shirt | blue |\n| Thinkpad Laptop | black |\n+-----------------+-------+\n\nIt is possible to add and remove dynamic columns from a row:\n\n-- Remove a column:\nUPDATE assets SET dynamic_cols=COLUMN_DELETE(dynamic_cols, \"price\") \nWHERE COLUMN_GET(dynamic_cols, \'color\' as char)=\'black\';\n\n-- Add a column:\nUPDATE assets SET dynamic_cols=COLUMN_ADD(dynamic_cols, \'warranty\', \'3 years\')\nWHERE item_name=\'Thinkpad Laptop\';\n\nYou can also list all columns, or get them together with their values in JSON\nformat:\n\nSELECT item_name, column_list(dynamic_cols) FROM assets;\n+-----------------+---------------------------+\n| item_name | column_list(dynamic_cols) |\n+-----------------+---------------------------+\n| MariaDB T-shirt | `size`,`color` |\n| Thinkpad Laptop | `color`,`warranty` |\n+-----------------+---------------------------+\n\nSELECT item_name, COLUMN_JSON(dynamic_cols) FROM assets;\n+-----------------+----------------------------------------+\n| item_name | COLUMN_JSON(dynamic_cols) |\n+-----------------+----------------------------------------+\n| MariaDB T-shirt | {\"size\":\"XL\",\"color\":\"blue\"} |\n| Thinkpad Laptop | {\"color\":\"black\",\"warranty\":\"3 years\"} |\n+-----------------+----------------------------------------+\n\nDynamic Columns Reference\n-------------------------\n\nThe rest of this page is a complete reference of dynamic columns in MariaDB\n\nDynamic Columns Functions\n-------------------------\n\nCOLUMN_CREATE\n-------------\n\nCOLUMN_CREATE(column_nr, value [as type], [column_nr, value \n [as type]]...);\nCOLUMN_CREATE(column_name, value [as type], [column_name, value \n [as type]]...);\n\nReturn a dynamic columns blob that stores the specified columns with values.\n\nThe return value is suitable for\n\n* \nstoring in a table\nfurther modification with other dynamic columns functions\n\nThe as type part allows one to specify the value type. In most cases, this is\nredundant because MariaDB will be able to deduce the type of the value.\nExplicit type specification may be needed when the type of the value is not\napparent. For example, a literal \'2012-12-01\' has a CHAR type by default, one\nwill need to specify \'2012-12-01\' AS DATE to have it stored as a date. See the\nDatatypes section for further details. Note also MDEV-597.\n\nTypical usage:\n\n-- MariaDB 5.3+:\nINSERT INTO tbl SET dyncol_blob=COLUMN_CREATE(1 /*column id*/, \"value\");\n-- MariaDB 10.0.1+:\nINSERT INTO tbl SET dyncol_blob=COLUMN_CREATE(\"column_name\", \"value\");\n\nCOLUMN_ADD\n----------\n\nCOLUMN_ADD(dyncol_blob, column_nr, value [as type], \n [column_nr, value [as type]]...);\nCOLUMN_ADD(dyncol_blob, column_name, value [as type], \n [column_name, value [as type]]...);\n\nAdds or updates dynamic columns.\n\n* \ndyncol_blob must be either a valid dynamic columns blob (for example,\nCOLUMN_CREATE returns such blob), or an empty string.\ncolumn_name specifies the name of the column to be added. If dyncol_blob\nalready has a column with this name, it will be overwritten.\nvalue specifies the new value for the column. Passing a NULL value will cause\nthe column to be deleted.\nas type is optional. See #datatypes section for a discussion about types.\n\nThe return value is a dynamic column blob after the modifications.\n\nTypical usage:\n\n-- MariaDB 5.3+:\nUPDATE tbl SET dyncol_blob=COLUMN_ADD(dyncol_blob, 1 /*column id*/, \"value\") \n WHERE id=1;\n-- MariaDB 10.0.1+:\nUPDATE t1 SET dyncol_blob=COLUMN_ADD(dyncol_blob, \"column_name\", \"value\") \n WHERE id=1;\n\nNote: COLUMN_ADD() is a regular function (just like CONCAT()), hence, in order\nto update the value in the table you have to use the UPDATE ... SET\ndynamic_col=COLUMN_ADD(dynamic_col, ....) pattern.\n\nCOLUMN_GET\n----------\n\nCOLUMN_GET(dyncol_blob, column_nr as type);\nCOLUMN_GET(dyncol_blob, column_name as type);\n\nGet the value of a dynamic column by its name. If no column with the given\nname exists, NULL will be returned.\n\ncolumn_name as type requires that one specify the datatype of the dynamic\ncolumn they are reading.\n\nThis may seem counter-intuitive: why would one need to specify which datatype\nthey\'re retrieving? Can\'t the dynamic columns system figure the datatype from\nthe data being stored?\n\nThe answer is: SQL is a statically-typed language. The SQL interpreter needs\nto know the datatypes of all expressions before the query is run (for example,\nwhen one is using prepared statements and runs \"select COLUMN_GET(...)\", the\nprepared statement API requires the server to inform the client about the\ndatatype of the column being read before the query is executed and the server\ncan see what datatype the column actually has).\n\nSee the Datatypes section for more information about datatypes.\n\nCOLUMN_DELETE\n-------------\n\nCOLUMN_DELETE(dyncol_blob, column_nr, column_nr...);\nCOLUMN_DELETE(dyncol_blob, column_name, column_name...);\n\nDelete a dynamic column with the specified name. Multiple names can be given.\n\nThe return value is a dynamic column blob after the modification.\n\nCOLUMN_EXISTS\n-------------\n\nCOLUMN_EXISTS(dyncol_blob, column_nr);\nCOLUMN_EXISTS(dyncol_blob, column_name);\n\nCheck if a column with name column_name exists in dyncol_blob. If yes, return\n1, otherwise return 0.\n\nCOLUMN_LIST\n-----------\n\nCOLUMN_LIST(dyncol_blob);\n\nReturn a comma-separated list of column names. The names are quoted with\nbackticks.\n\nSELECT column_list(column_create(\'col1\',\'val1\',\'col2\',\'val2\'));\n+---------------------------------------------------------+\n| column_list(column_create(\'col1\',\'val1\',\'col2\',\'val2\')) |\n+---------------------------------------------------------+\n| `col1`,`col2` |\n+---------------------------------------------------------+\n\nCOLUMN_CHECK\n------------\n\nCOLUMN_CHECK(dyncol_blob);\n\nCheck if dyncol_blob is a valid packed dynamic columns blob. Return value of 1\nmeans the blob is valid, return value of 0 means it is not.\n\nRationale: Normally, one works with valid dynamic column blobs. Functions like\nCOLUMN_CREATE, COLUMN_ADD, COLUMN_DELETE always return valid dynamic column\nblobs. However, if a dynamic column blob is accidentally truncated, or\ntranscoded from one character set to another, it will be corrupted. This\nfunction can be used to check if a value in a blob field is a valid dynamic\ncolumn blob.\n\nNote: It is possible that a truncation cut a Dynamic Column \"clearly\" so that\nCOLUMN_CHECK will not notice the corruption, but in any case of truncation a\nwarning is issued during value storing.\n\nCOLUMN_JSON\n-----------\n\nCOLUMN_JSON(dyncol_blob);\n\nReturn a JSON representation of data in dyncol_blob.\n\nExample:\n\nSELECT item_name, COLUMN_JSON(dynamic_cols) FROM assets;\n+-----------------+----------------------------------------+\n| item_name | COLUMN_JSON(dynamic_cols) |\n+-----------------+----------------------------------------+\n| MariaDB T-shirt | {\"size\":\"XL\",\"color\":\"blue\"} |\n| Thinkpad Laptop | {\"color\":\"black\",\"warranty\":\"3 years\"} |\n+-----------------+----------------------------------------+\n\nLimitation: COLUMN_JSON will decode nested dynamic columns at a nesting level\nof not more than 10 levels deep. Dynamic columns that are nested deeper than\n10 levels will be shown as BINARY string, without encoding.\n\nNesting Dynamic Columns\n-----------------------\n\nIt is possible to use nested dynamic columns by putting one dynamic column\nblob inside another. The COLUMN_JSON function will display nested columns.\n\nSET @tmp= column_create(\'parent_column\', \n column_create(\'child_column\', 12345));\nQuery OK, 0 rows affected (0.00 sec)\n\nSELECT column_json(@tmp);\n+------------------------------------------+\n| column_json(@tmp) |\n+------------------------------------------+\n| {\"parent_column\":{\"child_column\":12345}} |\n+------------------------------------------+\n\nSELECT column_get(column_get(@tmp, \'parent_column\' AS char), \n \'child_column\' AS int);\n+------------------------------------------------------------------------------\n\n| column_get(column_get(@tmp, \'parent_column\' as char), \'child_column\' as int)\n|\n+------------------------------------------------------------------------------\n\n| 12345\n|\n+------------------------------------------------------------------------------\n\nIf you are trying to get a nested dynamic column as a string use \'as BINARY\'\nas the last argument of COLUMN_GET (otherwise problems with character set\nconversion and illegal symbols are possible):\n\nselect column_json( column_get(\n column_create(\'test1\',\n column_create(\'key1\',\'value1\',\'key2\',\'value2\',\'key3\',\'value3\')),\n \'test1\' as BINARY));\n\nDatatypes\n---------\n\nIn SQL, one needs to define the type of each column in a table. Dynamic\ncolumns do not provide any way to declare a type in advance (\"whenever there\nis a column \'weight\', it should be integer\" is not possible). However, each\nparticular dynamic column value is stored together with its datatype.\n\nThe set of possible datatypes is mostly the same as that used by the SQL CAST\nand CONVERT functions. However, note that there are currently some differences\n- see MDEV-597.\n\n+--------+----------------------------------------------+-------------------+\n| type | dynamic column internal type | description |\n+--------+----------------------------------------------+-------------------+\n| BINARY | DYN_COL_STRING | (variable length |\n| (N)] | | string with |\n| | | binary charset) |\n+--------+----------------------------------------------+-------------------+\n| CHAR[( | DYN_COL_STRING | (variable length |\n| )] | | string with |\n| | | charset) |\n+--------+----------------------------------------------+-------------------+\n| DATE | DYN_COL_DATE | (date - 3 bytes) |\n+--------+----------------------------------------------+-------------------+\n| DATETI | DYN_COL_DATETIME | (date and time |\n| E[(D)] | | (with |\n| | | microseconds) - |\n| | | 9 bytes) |\n+--------+----------------------------------------------+-------------------+\n| DECIMA | DYN_COL_DECIMAL | (variable length |\n| [(M[,D | | binary decimal |\n| )] | | representation |\n| | | with MariaDB |\n| | | limitation) |\n+--------+----------------------------------------------+-------------------+\n| DOUBLE | DYN_COL_DOUBLE | (64 bit |\n| (M,D)] | | double-precision |\n| | | floating point) |\n+--------+----------------------------------------------+-------------------+\n| INTEGE | DYN_COL_INT | (variable |\n| | | length, up to 64 |\n| | | bit signed |\n| | | integer) |\n+--------+----------------------------------------------+-------------------+\n| SIGNED | DYN_COL_INT | (variable |\n| [INTEG | | length, up to 64 |\n| R] | | bit signed |\n| | | integer) |\n+--------+----------------------------------------------+-------------------+\n| TIME[( | DYN_COL_TIME | (time (with |\n| )] | | microseconds, |\n| | | may be negative) |\n| | | - 6 bytes) |\n+--------+----------------------------------------------+-------------------+\n| UNSIGN | DYN_COL_UINT | (variable |\n| D | | length, up to |','','https://mariadb.com/kb/en/dynamic-columns/');
-update help_topic set description = CONCAT(description, '\n| [INTEG | | 64bit unsigned |\n| R] | | integer) |\n+--------+----------------------------------------------+-------------------+\n\nA Note About Lengths\n--------------------\n\nIf you\'re running queries like\n\nSELECT COLUMN_GET(blob, \'colname\' as CHAR) ...\n\nwithout specifying a maximum length (i.e. using #as CHAR#, not as CHAR(n)),\nMariaDB will report the maximum length of the resultset column to be\n53,6870,911 (bytes or characters?) for MariaDB 5.3-10.0.0 and 16,777,216 for\nMariaDB 10.0.1+. This may cause excessive memory usage in some client\nlibraries, because they try to pre-allocate a buffer of maximum resultset\nwidth. If you suspect you\'re hitting this problem, use CHAR(n) whenever you\'re\nusing COLUMN_GET in the select list.\n\nMariaDB 5.3 vs MariaDB 10.0\n---------------------------\n\nThe dynamic columns feature was introduced into MariaDB in two steps:\n\n* MariaDB 5.3 was the first version to support dynamic columns. Only numbers\n could be used as column names in this version.\n* In MariaDB 10.0.1, column names can be either numbers or strings.\n Also, the COLUMN_JSON and COLUMN_CHECK functions were added.\n\nSee also Dynamic Columns in MariaDB 10.\n\nClient-side API\n---------------\n\nIt is also possible to create or parse dynamic columns blobs on the client\nside. libmysql client library now includes an API for writing/reading dynamic\ncolumn blobs. See dynamic-columns-api for details.\n\nLimitations\n-----------\n\n+---------------------------------------------------+------------------------+\n| Description | Limit |\n+---------------------------------------------------+------------------------+\n| Max number of columns | 65535 |\n+---------------------------------------------------+------------------------+\n| Max total length of packed dynamic column | max_allowed_packet |\n| | (1G) |\n+---------------------------------------------------+------------------------+\n\nURL: https://mariadb.com/kb/en/dynamic-columns/') WHERE help_topic_id = 729;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (730,38,'Dynamic Columns from MariaDB 10','MariaDB starting with 10.0.1\n----------------------------\nMariaDB 10.0.1 introduced the following improvements to the dynamic columns\nfeature.\n\nColumn Name Support\n-------------------\n\nIt is possible to refer to column by names. Names can be used everywhere where\nin MariaDB 5.3 one could use only strings:\n\n* Create a dynamic column blob:\n\nCOLUMN_CREATE(\'int_col\', 123 as int, \'double_col\', 3.14 as double,\n\'string_col\', \'text-data\' as char);\n\n* Set a column value:\n\nCOLUMN_ADD(dyncol_blob, \'intcol\', 1234);\n\n* Get a column value:\n\nCOLUMN_GET(dynstr, \'column1\' as char(10));\n\n* Check whether a column exists\n\nCOLUMN_EXISTS(dyncol_blob, \'column_name\');\n\nChanges in Behavior\n-------------------\n\n* Column list output now includes quoting:\n\nselect column_list(column_create(1, 22, 2, 23));\n+------------------------------------------+\n| column_list(column_create(1, 22, 2, 23)) |\n+------------------------------------------+\n| `1`,`2` |\n+------------------------------------------+\nselect column_list(column_create(\'column1\', 22, \'column2\', 23)); \n+----------------------------------------------------------+\n| column_list(column_create(\'column1\', 22, \'column2\', 23)) |\n+----------------------------------------------------------+\n| `column1`,`column2` |\n+----------------------------------------------------------+\n\n* Column name interpretation has been changed so that the string now is not\nconverted to a number. So some \"magic\" tricks will not work any more, for\nexample, \"1test\" and \"1\" now become different column names:\n\nselect column_list(column_add(column_create(\'1a\', 22), \'1b\', 23));\n+------------------------------------------------------------+\n| column_list(column_add(column_create(\'1a\', 22), \'1b\', 23)) |\n+------------------------------------------------------------+\n| `1a`,`1b` |\n+------------------------------------------------------------+\n\n* Old behavior:\n\nselect column_list(column_add(column_create(\'1a\', 22), \'1b\', 23));\n+------------------------------------------------------------+\n| column_list(column_add(column_create(\'1a\', 22), \'1b\', 23)) |\n+------------------------------------------------------------+\n| 1 |\n+------------------------------------------------------------+\n\nNew Functions\n-------------\n\nThe following new functions have been added to dynamic columns in MariaDB 10\n\nCOLUMN_CHECK\n------------\n\nCOLUMN_CHECK is used to check a column\'s integrity. When it encounters an\nerror it does not return illegal format errors but returns false instead. It\nalso checks integrity more thoroughly and finds errors in the dynamic column\ninternal structures which might not be found by other functions.\n\nselect column_check(column_create(\'column1\', 22));\n+--------------------------------------------+\n| column_check(column_create(\'column1\', 22)) |\n+--------------------------------------------+\n| 1 |\n+--------------------------------------------+\nselect column_check(\'abracadabra\');\n+-----------------------------+\n| column_check(\'abracadabra\') |\n+-----------------------------+\n| 0 |\n+-----------------------------+\n\nCOLUMN_JSON\n-----------\n\nCOLUMN_JSON converts all dynamic column record content to a JSON object.\n\nselect column_json(column_create(\'column1\', 1, \'column2\', \"two\"));\n+------------------------------------------------------------+\n| column_json(column_create(\'column1\', 1, \'column2\', \"two\")) |\n+------------------------------------------------------------+\n| {\"column1\":1,\"column2\":\"two\"} |\n+------------------------------------------------------------+\n\nOther Changes\n-------------\n\n* All API functions has prefix mariadb_dyncol_ (old prefix dynamic_column_ is\ndepricated\n* API changed to be able to work with the new format (*_named functions).\n* Removed \'delete\' function because deleting could be done by adding NULL\nvalue.\n* \'Time\' and \'datetime\' in the new format are stored without microseconds if\nthey are 0.\n* New function added to API (except that two which are representing SQL level\nfunctions):\n\'Unpack\' the dynamic columns content to an arrays of values and names.\n3 functions to get any column value as string, integer (long long) or floating\npoint (double).\n\n* New type of \"dynamic column\" row added on the API level (in SQL level output\nit is a string but if you use dynamic column functions to construct object it\nwill be added as dynamic column value) which allow to add dynamic columns\ninside dynamic columns. JSON function represent such recursive constructions\ncorrectly but limit depth of representation as current implementation limit\n(internally depth of dynamic columns embedding is not limited).\n\nInterface with Cassandra\n------------------------\n\nCassandraSE is no longer actively being developed and has been removed in\nMariaDB 10.6. See MDEV-23024.\n\nSome internal changes were added to dynamic columns to allow them to serve as\nan interface to Apache Cassandra dynamic columns. The Cassandra engine may\npack all columns which were not mentioned in the MariaDB interface table\ndefinition and even bring changes in the dynamic column contents back to the\ncassandra columns family (the table analog in cassandra).\n\nURL: https://mariadb.com/kb/en/dynamic-columns-from-mariadb-10/','','https://mariadb.com/kb/en/dynamic-columns-from-mariadb-10/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (731,38,'MERGE','Description\n-----------\n\nThe MERGE storage engine, also known as the MRG_MyISAM engine, is a collection\nof identical MyISAM tables that can be used as one. \"Identical\" means that all\ntables have identical column and index information. You cannot merge MyISAM\ntables in which the columns are listed in a different order, do not have\nexactly the same columns, or have the indexes in different order. However, any\nor all of the MyISAM tables can be compressed with myisampack. Columns names\nand indexes names can be different, as long as data types and NULL/NOT NULL\nclauses are the same. Differences in table options such as AVG_ROW_LENGTH,\nMAX_ROWS, or PACK_KEYS do not matter.\n\nEach index in a MERGE table must match an index in underlying MyISAM tables,\nbut the opposite is not true. Also, a MERGE table cannot have a PRIMARY KEY or\nUNIQUE indexes, because it cannot enforce uniqueness over all underlying\ntables.\n\nThe following options are meaningful for MERGE tables:\n\n* UNION. This option specifies the list of the underlying MyISAM tables. The\nlist is enclosed between parentheses and separated with commas.\n* INSERT_METHOD. This options specifies whether, and how, INSERTs are allowed\nfor the table. Allowed values are: NO (INSERTs are not allowed), FIRST (new\nrows will be written into the first table specified in the UNION list), LAST\n(new rows will be written into the last table specified in the UNION list).\nThe default value is NO.\n\nIf you define a MERGE table with a definition which is different from the\nunderlying MyISAM tables, or one of the underlying tables is not MyISAM, the\nCREATE TABLE statement will not return any error. But any statement which\ninvolves the table will produce an error like the following:\n\nERROR 1168 (HY000): Unable to open underlying table which is differently\ndefined \n or of non-MyISAM type or doesn\'t exist\n\nA CHECK TABLE will show more information about the problem.\n\nThe error is also produced if the table is properly define, but an underlying\ntable\'s definition changes at some point in time.\n\nIf you try to insert a new row into a MERGE table with INSERT_METHOD=NO, you\nwill get an error like the following:\n\nERROR 1036 (HY000): Table \'tbl_name\' is read only\n\nIt is possible to build a MERGE table on MyISAM tables which have one or more\nvirtual columns. MERGE itself does not support virtual columns, thus such\ncolumns will be seen as regular columns. The data types and sizes will still\nneed to be identical, and they cannot be NOT NULL.\n\nExamples\n--------\n\nCREATE TABLE t1 (\n a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,\n message CHAR(20)) ENGINE=MyISAM;\n\nCREATE TABLE t2 (\n a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,\n message CHAR(20)) ENGINE=MyISAM;\n\nINSERT INTO t1 (message) VALUES (\'Testing\'),(\'table\'),(\'t1\');\n\nINSERT INTO t2 (message) VALUES (\'Testing\'),(\'table\'),(\'t2\');\n\nCREATE TABLE total (\n a INT NOT NULL AUTO_INCREMENT,\n message CHAR(20), INDEX(a))\n ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;\n\nSELECT * FROM total;\n+---+---------+\n| a | message |\n+---+---------+\n| 1 | Testing |\n| 2 | table |\n| 3 | t1 |\n| 1 | Testing |\n| 2 | table |\n| 3 | t2 |\n+---+---------+\n\nIn the following example, we\'ll create three MyISAM tables, and then a MERGE\ntable on them. However, one of them uses a different data type for the column\nb, so a SELECT will produce an error:\n\nCREATE TABLE t1 (\n a INT,\n b INT\n) ENGINE = MyISAM;\n\nCREATE TABLE t2 (\n a INT,\n b INT\n) ENGINE = MyISAM;\n\nCREATE TABLE t3 (\n a INT,\n b TINYINT\n) ENGINE = MyISAM;\n\nCREATE TABLE t_mrg (\n a INT,\n b INT\n) ENGINE = MERGE,UNION=(t1,t2,t3);\n\nSELECT * FROM t_mrg;\nERROR 1168 (HY000): Unable to open underlying table which is differently\ndefined\n or of non-MyISAM type or doesn\'t exist\n\nTo find out what\'s wrong, we\'ll use a CHECK TABLE:\n\nCHECK TABLE t_mrg\\G\n*************************** 1. row ***************************\n Table: test.t_mrg\n Op: check\nMsg_type: Error\nMsg_text: Table \'test.t3\' is differently defined or of non-MyISAM type or\ndoesn\'t exist\n*************************** 2. row ***************************\n Table: test.t_mrg\n Op: check\nMsg_type: Error\nMsg_text: Unable to open underlying table which is differently defined or of\nnon-MyISAM type or doesn\'t exist\n*************************** 3. row ***************************\n Table: test.t_mrg\n Op: check\nMsg_type: error\nMsg_text: Corrupt\n\nNow, we know that the problem is in t3\'s definition.\n\nURL: https://mariadb.com/kb/en/merge/','','https://mariadb.com/kb/en/merge/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (732,39,'Sequence Overview','MariaDB starting with 10.3\n--------------------------\nSequences were introduced in MariaDB 10.3.\n\nIntroduction\n------------\n\nA sequence is an object that generates a sequence of numeric values, as\nspecified by the CREATE SEQUENCE statement.\n\nCREATE SEQUENCE will create a sequence that generates new values when called\nwith NEXT VALUE FOR sequence_name. It\'s an alternative to AUTO INCREMENT when\none wants to have more control of how the numbers are generated. As the\nSEQUENCE caches values (up to the CACHE value in the CREATE SEQUENCE\nstatement, by default 1000) it can in some cases be much faster than AUTO\nINCREMENT. Another benefit is that one can access the last value generated by\nall used sequences, which solves one of the limitations with LAST_INSERT_ID().\n\nCreating a Sequence\n-------------------\n\nThe CREATE SEQUENCE statement is used to create a sequence. Here is an example\nof a sequence starting at 100, incrementing by 10 each time:\n\nCREATE SEQUENCE s START WITH 100 INCREMENT BY 10;\n\nThe CREATE SEQUENCE statement, along with defaults, can be viewd with the SHOW\nCREATE SEQUENCE STATEMENT, for example:\n\nSHOW CREATE SEQUENCE s\\G\n*************************** 1. row ***************************\n Table: s\nCreate Table: CREATE SEQUENCE `s` start with 100 minvalue 1 maxvalue\n9223372036854775806 \n increment by 10 cache 1000 nocycle ENGINE=InnoDB\n\nUsing Sequence Objects\n----------------------\n\nTo get the next value from a sequence, use\n\nNEXT VALUE FOR sequence_name\n\nor\n\nNEXTVAL(sequence_name)\n\nor in Oracle mode (SQL_MODE=ORACLE)\n\nsequence_name.nextval\n\nFor retrieving the last value used by the current connection from a sequence\nuse:\n\nPREVIOUS VALUE FOR sequence_name\n\nor\n\nLASTVAL(sequence_name)\n\nor in Oracle mode (SQL_MODE=ORACLE)\n\nsequence_name.currval\n\nFor example:\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 100 |\n+------------+\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 110 |\n+------------+\n\nSELECT LASTVAL(s);\n+------------+\n| LASTVAL(s) |\n+------------+\n| 110 |\n+------------+\n\nUsing Sequences in DEFAULT\n--------------------------\n\nMariaDB starting with 10.3.3\n----------------------------\nStarting from 10.3.3 you can use Sequences in DEFAULT:\n\ncreate sequence s1;\ncreate table t1 (a int primary key default (next value for s1), b int);\ninsert into t1 (b) values (1),(2);\nselect * from t1;\n+---+------+\n| a | b |\n+---+------+\n| 1 | 1 |\n| 2 | 2 |\n+---+------+\n\nChanging a Sequence\n-------------------\n\nThe ALTER SEQUENCE statement is used for changing sequences. For example, to\nrestart the sequence at another value:\n\nALTER SEQUENCE s RESTART 50;\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 50 |\n+------------+\n\nThe SETVAL function can also be used to set the next value to be returned for\na SEQUENCE, for example:\n\nSELECT SETVAL(s, 100);\n+----------------+\n| SETVAL(s, 100) |\n+----------------+\n| 100 |\n+----------------+\n\nSETVAL can only be used to increase the sequence value. Attempting to set a\nlower value will fail, returning NULL:\n\nSELECT SETVAL(s, 50);\n+---------------+\n| SETVAL(s, 50) |\n+---------------+\n| NULL |\n+---------------+\n\nDropping a Sequence\n-------------------\n\nThe DROP SEQUENCE statement is used to drop a sequence, for example:\n\nDROP SEQUENCE s;\n\nReplication\n-----------\n\nIf one wants to use Sequences in a master-master setup or with Galera one\nshould use INCREMENT=0. This will tell the Sequence to use\nauto_increment_increment and auto_increment_offset to generate unique values\nfor each server.\n\nStandards Compliance\n--------------------\n\nMariaDB 10.3 supports both ANSI SQL and Oracle syntax for sequences.\n\nHowever as SEQUENCE is implemented as a special kind of table, it uses the\nsame namespace as tables. The benefits are that sequences show up in SHOW\nTABLES, and one can also create a sequence with CREATE TABLE and drop it with\nDROP TABLE. One can SELECT from it as from any other table. This ensures that\nall old tools that work with tables should work with sequences.\n\nSince sequence objects act as regular tables in many contexts, they will be\naffected by LOCK TABLES. This is not the case in other DBMS, such as Oracle,\nwhere LOCK TABLE does not affect sequences.\n\nNotes\n-----\n\nOne of the goals with the Sequence implementation is that all old tools, such\nas mysqldump, should work unchanged, while still keeping the normal usage of\nsequence standard compatibly.\n\nTo make this possible, sequence is currently implemented as a table with a few\nexclusive properties.\n\nThe special properties for sequence tables are:\n\n* A sequence table has always one row.\n* When one creates a sequence, either with CREATE TABLE or CREATE SEQUENCE,\none row will be inserted.\n* If one tries to insert into a sequence table, the single row will be\nupdated. This allows mysqldump to work but also gives the additional benefit\nthat one can change all properties of a sequence with a single insert. New\napplications should of course also use ALTER SEQUENCE.\n* UPDATE or DELETE can\'t be performed on Sequence objects.\n* Doing a select on the sequence shows the current state of the sequence,\nexcept the values that are reserved in the cache. The next_value column shows\nthe next value not reserved by the cache.\n* FLUSH TABLES will close the sequence and the next sequence number generated\nwill be according to what\'s stored in the Sequence object. In effect, this\nwill discard the cached values.\n* A number of normal table operations work on Sequence tables. See next\nsection.\n\nTable Operations that Work with Sequences\n-----------------------------------------\n\n* SHOW CREATE TABLE sequence_name. This shows the table structure that is\nbehind the SEQUENCE including the field names that can be used with SELECT or\neven CREATE TABLE.\n* CREATE TABLE sequence-structure ... SEQUENCE=1\n* ALTER TABLE sequence RENAME TO sequence2\n* RENAME TABLE sequence_name TO new_sequence_name\n* DROP TABLE sequence_name. This is allowed mainly to get old tools like\nmysqldump to work with sequence tables.\n* SHOW TABLES\n\nImplementation\n--------------\n\nInternally, sequence tables are created as a normal table without rollback\n(the InnoDB, Aria and MySAM engines support this), wrapped by a sequence\nengine object. This allowed us to create sequences with almost no performance\nimpact for normal tables. (The cost is one \'if\' per insert if the binary log\nis enabled).\n\nUnderlying Table Structure\n--------------------------\n\nThe following example shows the table structure of sequences and how it can be\nused as a table. (Output of results are slightly edited to make them easier to\nread)\n\ncreate sequence t1;\nshow create sequence t1\\G\n*************************** 1. row ***************************\n CREATE SEQUENCE `t1` start with 1 minvalue 1 maxvalue 9223372036854775806\n increment by 1 cache 1000 nocycle ENGINE=InnoDB\n\nshow create table t1\\G\n*************************** 1. row ***************************\nCreate Table: CREATE TABLE `t1` (\n `next_not_cached_value` bigint(21) NOT NULL,\n `minimum_value` bigint(21) NOT NULL,\n `maximum_value` bigint(21) NOT NULL,\n `start_value` bigint(21) NOT NULL COMMENT \'start value when sequences is\ncreated or value if RESTART is used\',\n `increment` bigint(21) NOT NULL COMMENT \'increment value\',\n `cache_size` bigint(21) unsigned NOT NULL,\n `cycle_option` tinyint(1) unsigned NOT NULL COMMENT \'0 if no cycles are\nallowed, 1 if the sequence should begin a new cycle when maximum_value is\npassed\',\n `cycle_count` bigint(21) NOT NULL COMMENT \'How many cycles have been done\'\n) ENGINE=InnoDB SEQUENCE=1\n\nselect * from t1\\G\nnext_not_cached_value: 1\n minimum_value: 1\n maximum_value: 9223372036854775806\n start_value: 1\n increment: 1\n cache_size: 1000\n cycle_option: 0\n cycle_count: 0\n\nThe cycle_count column is incremented every time the sequence wraps around.\n\nCredits\n-------\n\n* Thanks to Jianwe Zhao from Aliyun for his work on SEQUENCE in AliSQL, which\ngave ideas and inspiration for this work.\n* Thanks to Peter Gulutzan,who helped test and gave useful comments about the\nimplementation.\n\nURL: https://mariadb.com/kb/en/sequence-overview/','','https://mariadb.com/kb/en/sequence-overview/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (733,39,'CREATE SEQUENCE','MariaDB starting with 10.3\n--------------------------\nCREATE SEQUENCE was introduced in MariaDB 10.3.\n\nSyntax\n------\n\nCREATE [OR REPLACE] [TEMPORARY] SEQUENCE [IF NOT EXISTS] sequence_name\n[ INCREMENT [ BY | = ] increment ]\n[ MINVALUE [=] minvalue | NO MINVALUE | NOMINVALUE ]\n[ MAXVALUE [=] maxvalue | NO MAXVALUE | NOMAXVALUE ]\n[ START [ WITH | = ] start ] \n[ CACHE [=] cache | NOCACHE ] [ CYCLE | NOCYCLE] \n[table_options]\nThe options for CREATE SEQUENCE can be given in any order, optionally followed\nby table_options.\n\ntable_options can be any of the normal table options in CREATE TABLE but the\nmost usable ones are ENGINE=... and COMMENT=.\n\nNOMAXVALUE and NOMINVALUE are there to allow one to create SEQUENCEs using the\nOracle syntax.\n\nDescription\n-----------\n\nCREATE SEQUENCE will create a sequence that generates new values when called\nwith NEXT VALUE FOR sequence_name. It\'s an alternative to AUTO INCREMENT when\none wants to have more control of how the numbers are generated. As the\nSEQUENCE caches values (up to CACHE) it can in some cases be much faster than\nAUTO INCREMENT. Another benefit is that one can access the last value\ngenerated by all used sequences, which solves one of the limitations with\nLAST_INSERT_ID().\n\nCREATE SEQUENCE requires the CREATE privilege.\n\nDROP SEQUENCE can be used to drop a sequence, and ALTER SEQUENCE to change it.\n\nArguments to Create\n-------------------\n\nThe following options may be used:\n\n+---------------+------------------------------+----------------------------+\n| Option | Default value | Description |\n+---------------+------------------------------+----------------------------+\n| INCREMENT | 1 | Increment to use for |\n| | | values. May be negative. |\n| | | Setting an increment of 0 |\n| | | causes the sequence to |\n| | | use the value of the |\n| | | auto_increment_increment |\n| | | system variable at the |\n| | | time of creation, which |\n| | | is always a positive |\n| | | number. (see MDEV-16035). |\n+---------------+------------------------------+----------------------------+\n| MINVALUE | 1 if INCREMENT > 0 and | Minimum value for the |\n| | -9223372036854775807 if | sequence |\n| | INCREMENT < 0 | |\n+---------------+------------------------------+----------------------------+\n| MAXVALUE | 9223372036854775806 if | Max value for sequence |\n| | INCREMENT > 0 and -1 if | |\n| | INCREMENT < 0 | |\n+---------------+------------------------------+----------------------------+\n| START | MINVALUE if INCREMENT > 0 | First value that the |\n| | and MAX_VALUE if INCREMENT< | sequence will generate |\n| | 0 | |\n+---------------+------------------------------+----------------------------+\n| CACHE | 1000 | Number of values that |\n| | | should be cached. 0 if no |\n| | | CACHE. The underlying |\n| | | table will be updated |\n| | | first time a new sequence |\n| | | number is generated and |\n| | | each time the cache runs |\n| | | out. |\n+---------------+------------------------------+----------------------------+\n\nIf CYCLE is used then the sequence should start again from MINVALUE after it\nhas run out of values. Default value is NOCYCLE.\n\nConstraints on Create Arguments\n-------------------------------\n\nTo be able to create a legal sequence, the following must hold:\n\n* MAXVALUE >= start\n* MAXVALUE > MINVALUE\n* START >= MINVALUE\n* MAXVALUE <= 9223372036854775806 (LONGLONG_MAX-1)\n* MINVALUE >= -9223372036854775807 (LONGLONG_MIN+1)\n\nNote that sequences can\'t generate the maximum/minimum 64 bit number because\nof the constraint of MINVALUE and MAXVALUE.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and CREATE SEQUENCE is atomic.\n\nExamples\n--------\n\nCREATE SEQUENCE s START WITH 100 INCREMENT BY 10;\n\nCREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;\n\nThe following statement fails, as the increment conflicts with the defaults\n\nCREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10;\nERROR 4082 (HY000): Sequence \'test.s3\' values are conflicting\n\nThe sequence can be created by specifying workable minimum and maximum values:\n\nCREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10 MINVALUE=-100 MAXVALUE=1000;\n\nURL: https://mariadb.com/kb/en/create-sequence/','','https://mariadb.com/kb/en/create-sequence/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (734,39,'ALTER SEQUENCE','MariaDB starting with 10.3.1\n----------------------------\nALTER SEQUENCE was introduced in MariaDB 10.3.\n\nSyntax\n------\n\nALTER SEQUENCE [IF EXISTS] sequence_name\n[ INCREMENT [ BY | = ] increment ]\n[ MINVALUE [=] minvalue | NO MINVALUE | NOMINVALUE ]\n[ MAXVALUE [=] maxvalue | NO MAXVALUE | NOMAXVALUE ]\n[ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ]\n[ RESTART [[WITH | =] restart]\n\nALTER SEQUENCE allows one to change any values for a SEQUENCE created with\nCREATE SEQUENCE.\n\nThe options for ALTER SEQUENCE can be given in any order.\n\nDescription\n-----------\n\nALTER SEQUENCE changes the parameters of an existing sequence generator. Any\nparameters not specifically set in the ALTER SEQUENCE command retain their\nprior settings.\n\nALTER SEQUENCE requires the ALTER privilege.\n\nArguments to ALTER SEQUENCE\n---------------------------\n\nThe following options may be used:\n\n+---------------+-------------------------------+---------------------------+\n| Option | Default value | Description |\n+---------------+-------------------------------+---------------------------+\n| INCREMENT | 1 | Increment to use for |\n| | | values. May be negative. |\n+---------------+-------------------------------+---------------------------+\n| MINVALUE | 1 if INCREMENT > 0 and | Minimum value for the |\n| | -9223372036854775807 if | sequence. |\n| | INCREMENT < 0 | |\n+---------------+-------------------------------+---------------------------+\n| MAXVALUE | 9223372036854775806 if | Max value for sequence. |\n| | INCREMENT > 0 and -1 if | |\n| | INCREMENT < 0 | |\n+---------------+-------------------------------+---------------------------+\n| START | MINVALUE if INCREMENT > 0 | First value that the |\n| | and MAX_VALUE if INCREMENT< 0 | sequence will generate. |\n+---------------+-------------------------------+---------------------------+\n| CACHE | 1000 | Number of values that |\n| | | should be cached. 0 if |\n| | | no CACHE. The |\n| | | underlying table will be |\n| | | updated first time a new |\n| | | sequence number is |\n| | | generated and each time |\n| | | the cache runs out. |\n+---------------+-------------------------------+---------------------------+\n| CYCLE | 0 (= NO CYCLE) | 1 if the sequence should |\n| | | start again from |\n| | | MINVALUE# after it has |\n| | | run out of values. |\n+---------------+-------------------------------+---------------------------+\n| RESTART | START if restart value not | If RESTART option is |\n| | is given | used, NEXT VALUE will |\n| | | return the restart value. |\n+---------------+-------------------------------+---------------------------+\n\nThe optional clause RESTART [ WITH restart ] sets the next value for the\nsequence. This is equivalent to calling the SETVAL() function with the is_used\nargument as 0. The specified value will be returned by the next call of\nnextval. Using RESTART with no restart value is equivalent to supplying the\nstart value that was recorded by CREATE SEQUENCE or last set by ALTER SEQUENCE\nSTART WITH.\n\nALTER SEQUENCE will not allow you to change the sequence so that it\'s\ninconsistent. For example:\n\nCREATE SEQUENCE s1;\nALTER SEQUENCE s1 MINVALUE 10;\nERROR 4061 (HY000): Sequence \'test.t1\' values are conflicting\n\nALTER SEQUENCE s1 MINVALUE 10 RESTART 10;\nERROR 4061 (HY000): Sequence \'test.t1\' values are conflicting\n\nALTER SEQUENCE s1 MINVALUE 10 START 10 RESTART 10;\n\nINSERT\n------\n\nTo allow SEQUENCE objects to be backed up by old tools, like mysqldump, one\ncan use SELECT to read the current state of a SEQUENCE object and use an\nINSERT to update the SEQUENCE object. INSERT is only allowed if all fields are\nspecified:\n\nCREATE SEQUENCE s1;\nINSERT INTO s1 VALUES(1000,10,2000,1005,1,1000,0,0);\nSELECT * FROM s1;\n\n+------------+-----------+-----------+-------+-----------+-------+-------+-----\n-+\n| next_value | min_value | max_value | start | increment | cache | cycle |\nround |\n+------------+-----------+-----------+-------+-----------+-------+-------+-----\n-+\n| 1000 | 10 | 2000 | 1005 | 1 | 1000 | 0 | \n0 |\n+------------+-----------+-----------+-------+-----------+-------+-------+-----\n-+\n\nSHOW CREATE SEQUENCE s1;\n+-------+----------------------------------------------------------------------\n---------------------------------------+\n| Table | Create Table \n |\n+-------+----------------------------------------------------------------------\n---------------------------------------+\n| s1 | CREATE SEQUENCE `s1` start with 1005 minvalue 10 maxvalue 2000\nincrement by 1 cache 1000 nocycle ENGINE=Aria |\n+-------+----------------------------------------------------------------------\n---------------------------------------+\n\nNotes\n-----\n\nALTER SEQUENCE will instantly affect all future SEQUENCE operations. This is\nin contrast to some other databases where the changes requested by ALTER\nSEQUENCE will not be seen until the sequence cache has run out.\n\nALTER SEQUENCE will take a full table lock of the sequence object during its\n(brief) operation. This ensures that ALTER SEQUENCE is replicated correctly.\nIf you only want to set the next sequence value to a higher value than\ncurrent, then you should use SETVAL() instead, as this is not blocking.\n\nIf you want to change storage engine, sequence comment or rename the sequence,\nyou can use ALTER TABLE for this.\n\nURL: https://mariadb.com/kb/en/alter-sequence/','','https://mariadb.com/kb/en/alter-sequence/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (735,39,'DROP SEQUENCE','MariaDB starting with 10.3\n--------------------------\nDROP SEQUENCE was introduced in MariaDB 10.3.\n\nSyntax\n------\n\nDROP [TEMPORARY] SEQUENCE [IF EXISTS] [/*COMMENT TO SAVE*/]\n sequence_name [, sequence_name] ...\n\nDescription\n-----------\n\nDROP SEQUENCE removes one or more sequences created with CREATE SEQUENCE. You\nmust have the DROP privilege for each sequence. MariaDB returns an error\nindicating by name which non-existing tables it was unable to drop, but it\nalso drops all of the tables in the list that do exist.\n\nImportant: When a table is dropped, user privileges on the table are not\nautomatically dropped. See GRANT.\n\nIf another connection is using the sequence, a metadata lock is active, and\nthis statement will wait until the lock is released. This is also true for\nnon-transactional tables.\n\nFor each referenced sequence, DROP SEQUENCE drops a temporary sequence with\nthat name, if it exists. If it does not exist, and the TEMPORARY keyword is\nnot used, it drops a non-temporary sequence with the same name, if it exists.\nThe TEMPORARY keyword ensures that a non-temporary sequence will not\naccidentally be dropped.\n\nUse IF EXISTS to prevent an error from occurring for sequences that do not\nexist. A NOTE is generated for each non-existent sequence when using IF\nEXISTS. See SHOW WARNINGS.\n\nDROP SEQUENCE requires the DROP privilege.\n\nNotes\n-----\n\nDROP SEQUENCE only removes sequences, not tables. However, DROP TABLE can\nremove both sequences and tables.\n\nURL: https://mariadb.com/kb/en/drop-sequence/','','https://mariadb.com/kb/en/drop-sequence/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (736,39,'NEXT VALUE for sequence_name','MariaDB starting with 10.3\n--------------------------\nSEQUENCEs were introduced in MariaDB 10.3\n\nSyntax\n------\n\nNEXT VALUE FOR sequence\n\nor\n\nNEXTVAL(sequence_name)\n\nor in Oracle mode (SQL_MODE=ORACLE)\n\nsequence_name.nextval\n\nNEXT VALUE FOR is ANSI SQL syntax while NEXTVAL() is PostgreSQL syntax.\n\nDescription\n-----------\n\nGenerate next value for a SEQUENCE.\n\n* You can greatly speed up NEXT VALUE by creating the sequence with the CACHE\noption. If not, every NEXT VALUE usage will cause changes in the stored\nSEQUENCE table.\n* When using NEXT VALUE the value will be reserved at once and will not be\nreused, except if the SEQUENCE was created with CYCLE. This means that when\nyou are using SEQUENCEs you have to expect gaps in the generated sequence\nnumbers.\n* If one updates the SEQUENCE with SETVAL() or ALTER SEQUENCE ... RESTART,\nNEXT VALUE FOR will notice this and start from the next requested value.\n* FLUSH TABLES will close the sequence and the next sequence number generated\nwill be according to what\'s stored in the SEQUENCE object. In effect, this\nwill discard the cached values.\n* A server restart (or closing the current connection) also causes a drop of\nall cached values. The cached sequence numbers are reserved only for the\ncurrent connection.\n* NEXT VALUE requires the INSERT privilege.\n\nMariaDB starting with 10.3.3\n----------------------------\n* You can also use NEXT VALUE FOR sequence for column DEFAULT.\n\nURL: https://mariadb.com/kb/en/next-value-for-sequence_name/','','https://mariadb.com/kb/en/next-value-for-sequence_name/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (737,39,'PREVIOUS VALUE FOR sequence_name','MariaDB starting with 10.3\n--------------------------\nSEQUENCEs were introduced in MariaDB 10.3.\n\nSyntax\n------\n\nPREVIOUS VALUE FOR sequence_name\n\nor\n\nLASTVAL(sequence_name)\n\nor in Oracle mode (SQL_MODE=ORACLE)\n\nsequence_name.currval\n\nPREVIOUS VALUE FOR is IBM DB2 syntax while LASTVAL() is PostgreSQL syntax.\n\nDescription\n-----------\n\nGet last value in the current connection generated from a sequence.\n\n* If the sequence has not yet been used by the connection, PREVIOUS VALUE FOR\nreturns NULL (the same thing applies with a new connection which doesn\'t see a\nlast value for an existing sequence).\n* If a SEQUENCE has been dropped and re-created then it\'s treated as a new\nSEQUENCE and PREVIOUS VALUE FOR will return NULL.\n* FLUSH TABLES has no effect on PREVIOUS VALUE FOR.\n* Previous values for all used sequences are stored per connection until\nconnection ends.\n* PREVIOUS VALUE FOR requires the SELECT privilege.\n\nExample\n-------\n\nCREATE SEQUENCE s START WITH 100 INCREMENT BY 10;\n\nSELECT PREVIOUS VALUE FOR s;\n+----------------------+\n| PREVIOUS VALUE FOR s |\n+----------------------+\n| NULL |\n+----------------------+\n\n# The function works for sequences only, if the table is used an error is\ngenerated\nSELECT PREVIOUS VALUE FOR t;\nERROR 4089 (42S02): \'test.t\' is not a SEQUENCE\n\n# Call the NEXT VALUE FOR s:\nSELECT NEXT VALUE FOR s;\n+------------------+\n| NEXT VALUE FOR s |\n+------------------+\n| 100 |\n+------------------+\n\nSELECT PREVIOUS VALUE FOR s;\n+----------------------+\n| PREVIOUS VALUE FOR s |\n+----------------------+\n| 100 |\n+----------------------+\n\nNow try to start the new connection and check that the last value is still\nNULL, before updating the value in the new connection after the output of the\nnew connection gets current value (110 in the example below). Note that first\nconnection cannot see this change and the result of last value still remains\nthe same (100 in the example above).\n\n$ .mysql -uroot test -e\"SELECT PREVIOUS VALUE FOR s; SELECT NEXT VALUE FOR s;\nSELECT PREVIOUS VALUE FOR s;\"\n+----------------------+\n| PREVIOUS VALUE FOR s |\n+----------------------+\n| NULL |\n+----------------------+\n+------------------+\n| NEXT VALUE FOR s |\n+------------------+\n| 110 |\n+------------------+\n+----------------------+\n| PREVIOUS VALUE FOR s |\n+----------------------+\n| 110 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/previous-value-for-sequence_name/','','https://mariadb.com/kb/en/previous-value-for-sequence_name/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (738,39,'SETVAL','MariaDB starting with 10.3.1\n----------------------------\nSEQUENCEs were introduced in MariaDB 10.3.\n\nSyntax\n------\n\nSETVAL(sequence_name, next_value, [is_used, [round]])\n\nDescription\n-----------\n\nSet the next value to be returned for a SEQUENCE.\n\nThis function is compatible with PostgreSQL syntax, extended with the round\nargument.\n\nIf the is_used argument is not given or is 1 or true, then the next used value\nwill one after the given value. If is_used is 0 or false then the next\ngenerated value will be the given value.\n\nIf round is used then it will set the round value (or the internal cycle\ncount, starting at zero) for the sequence. If round is not used, it\'s assumed\nto be 0.\n\nnext_value must be an integer literal.\n\nFor SEQUENCE tables defined with CYCLE (see CREATE SEQUENCE) one should use\nboth next_value and round to define the next value. In this case the current\nsequence value is defined to be round, next_value.\n\nThe result returned by SETVAL() is next_value or NULL if the given next_value\nand round is smaller than the current value.\n\nSETVAL() will not set the SEQUENCE value to a something that is less than its\ncurrent value. This is needed to ensure that SETVAL() is replication safe. If\nyou want to set the SEQUENCE to a smaller number use ALTER SEQUENCE.\n\nIf CYCLE is used, first round and then next_value are compared to see if the\nvalue is bigger than the current value.\n\nInternally, in the MariaDB server, SETVAL() is used to inform slaves that a\nSEQUENCE has changed value. The slave may get SETVAL() statements out of\norder, but this is ok as only the biggest one will have an effect.\n\nSETVAL requires the INSERT privilege.\n\nExamples\n--------\n\nSELECT setval(foo, 42); -- Next nextval will return 43\nSELECT setval(foo, 42, true); -- Same as above\nSELECT setval(foo, 42, false); -- Next nextval will return 42\n\nSETVAL setting higher and lower values on a sequence with an increment of 10:\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 50 |\n+------------+\n\nSELECT SETVAL(s, 100);\n+----------------+\n| SETVAL(s, 100) |\n+----------------+\n| 100 |\n+----------------+\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 110 |\n+------------+\n\nSELECT SETVAL(s, 50);\n+---------------+\n| SETVAL(s, 50) |\n+---------------+\n| NULL |\n+---------------+\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 120 |\n+------------+\n\nExample demonstrating round:\n\nCREATE OR REPLACE SEQUENCE s1\n START WITH 1\n MINVALUE 1\n MAXVALUE 99\n INCREMENT BY 1\n CACHE 20\n CYCLE;\n\nSELECT SETVAL(s1, 99, 1, 0);\n+----------------------+\n| SETVAL(s1, 99, 1, 0) |\n+----------------------+\n| 99 |\n+----------------------+\n\nSELECT NEXTVAL(s1);\n+-------------+\n| NEXTVAL(s1) |\n+-------------+\n| 1 |\n+-------------+\n\nThe following statement returns NULL, as the given next_value and round is\nsmaller than the current value.\n\nSELECT SETVAL(s1, 99, 1, 0);\n+----------------------+\n| SETVAL(s1, 99, 1, 0) |\n+----------------------+\n| NULL |\n+----------------------+\n\nSELECT NEXTVAL(s1);\n+-------------+\n| NEXTVAL(s1) |\n+-------------+\n| 2 |\n+-------------+\n\nIncreasing the round from zero to 1 will allow next_value to be returned.\n\nSELECT SETVAL(s1, 99, 1, 1);\n+----------------------+\n| SETVAL(s1, 99, 1, 1) |\n+----------------------+\n| 99 |\n+----------------------+\n\nSELECT NEXTVAL(s1);\n+-------------+\n| NEXTVAL(s1) |\n+-------------+\n| 1 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/setval/','','https://mariadb.com/kb/en/setval/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (739,40,'JSON_ARRAYAGG','MariaDB starting with 10.5.0\n----------------------------\nJSON_ARRAYAGG was added in MariaDB 10.5.0.\n\nSyntax\n------\n\nJSON_ARRAYAGG(column_or_expression)\n\nDescription\n-----------\n\nJSON_ARRAYAGG returns a JSON array containing an element for each value in a\ngiven set of JSON or SQL values. It acts on a column or an expression that\nevaluates to a single value.\n\nReturns NULL in the case of an error, or if the result contains no rows.\n\nJSON_ARRAYAGG cannot currently be used as a window function.\n\nThe full syntax is as follows:\n\nJSON_ARRAYAGG([DISTINCT] expr [,expr ...]\n [ORDER BY {unsigned_integer | col_name | expr}\n [ASC | DESC] [,col_name ...]]\n [LIMIT {[offset,] row_count | row_count OFFSET offset}])\n\nExamples\n--------\n\nCREATE TABLE t1 (a INT, b INT);\n\nINSERT INTO t1 VALUES (1, 1),(2, 1), (1, 1),(2, 1), (3, 2),(2, 2),(2, 2),(2,\n2);\n\nSELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1;\n+-------------------+-------------------+\n| JSON_ARRAYAGG(a) | JSON_ARRAYAGG(b) |\n+-------------------+-------------------+\n| [1,2,1,2,3,2,2,2] | [1,1,1,1,2,2,2,2] |\n+-------------------+-------------------+\n\nSELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1 GROUP BY b;\n+------------------+------------------+\n| JSON_ARRAYAGG(a) | JSON_ARRAYAGG(b) |\n+------------------+------------------+\n| [1,2,1,2] | [1,1,1,1] |\n| [3,2,2,2] | [2,2,2,2] |\n+------------------+------------------+\n\nURL: https://mariadb.com/kb/en/json_arrayagg/','','https://mariadb.com/kb/en/json_arrayagg/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (740,40,'JSON_OBJECTAGG','MariaDB starting with 10.5.0\n----------------------------\nJSON_OBJECTAGG was added in MariaDB 10.5.0.\n\nSyntax\n------\n\nJSON_OBJECTAGG(key, value)\n\nDescription\n-----------\n\nJSON_OBJECTAGG returns a JSON object containing key-value pairs. It takes two\nexpressions that evaluate to a single value, or two column names, as\narguments, the first used as a key, and the second as a value.\n\nReturns NULL in the case of an error, or if the result contains no rows.\n\nJSON_OBJECTAGG cannot currently be used as a window function.\n\nExamples\n--------\n\nselect * from t1;\n+------+-------+\n| a | b |\n+------+-------+\n| 1 | Hello |\n| 1 | World |\n| 2 | This |\n+------+-------+\n\nSELECT JSON_OBJECTAGG(a, b) FROM t1;\n+----------------------------------------+\n| JSON_OBJECTAGG(a, b) |\n+----------------------------------------+\n| {\"1\":\"Hello\", \"1\":\"World\", \"2\":\"This\"} |\n+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_objectagg/','','https://mariadb.com/kb/en/json_objectagg/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (741,40,'JSONPath Expressions','A number of JSON functions accept JSON Path expressions. MariaDB defines this\npath as follows:\n\nJSON Path Syntax\n----------------\n\npath : [\'lax\'] \'$\' [step]*\n\nThe path starts with an optional path mode. At the moment, MariaDB supports\nonly the \"lax\" mode, which is also the mode that is used when it is not\nexplicitly specified.\n\nThe $ symbol represents the context item. The search always starts from the\ncontext item; because of that, the path always starts with $.\n\nThen, it is followed by zero or more steps, which select element(s) in the\nJSON document. A step may be one of the following:\n\n* Object member selector\n* Array element selector\n* Wildcard selector\n\nObject Member Selector\n----------------------\n\nTo select member(s) in a JSON object, one can use one of the following:\n\n* .memberName selects the value of the member with name memberName.\n* .\"memberName\" - the same as above but allows one to select a member with a\nname that\'s not a valid identifier (that is, has space, dot, and/or other\ncharacters)\n* .* - selects the values of all members of the object.\n\nIf the current item is an array (instead of an object), nothing will be\nselected.\n\nArray Element Selector\n----------------------\n\nTo select elements of an array, one can use one of the following:\n\n* [N] selects element number N in the array. The elements are counted from\nzero.\n* [*] selects all elements in the array.\n\nIf the current item is an object (instead of an array), nothing will be\nselected.\n\nStarting from MariaDB server 10.9, JSON path also supports negative index in\narray, \'last\' keyword and range notation (\'to\' keyword) for accessing array\nelements. Negative index starts from -1.\n\n* [-N] selects n th element from end.\n* [last-N] selects n th element from the last element.\n* [M to N] selects range of elements starting from index M to N.\n\nExample:\n\nSET @json=\'{\n \"A\": [0,\n [1, 2, 3],\n [4, 5, 6],\n \"seven\",\n 0.8,\n true,\n false,\n \"eleven\",\n [12, [13, 14], {\"key1\":\"value1\"},[15]],\n true],\n \"B\": {\"C\": 1},\n \"D\": 2\n }\';\nSELECT JSON_EXTRACT(@json, \'$.A[-8][1]\');\n+--------------------------------------------------+\n| JSON_EXTRACT(@json, \'$.A[-8][1]\') |\n+--------------------------------------------------+\n| 5 |\n+--------------------------------------------------+\n\nSELECT JSON_EXTRACT(@json, \'$.A[last-7][1]\');\n+-----------------------------------------------+\n| SELECT JSON_EXTRACT(@json, \'$.A[last-7][1]\'); |\n+-----------------------------------------------+\n| 5 |\n+-----------------------------------------------+\n\nSET @json= \'[\n [1, {\"key1\": \"value1\"}, 3],\n [false, 5, 6],\n [7, 8, [9, {\"key2\": 2}, 11]],\n [15, 1.34, [14], [\"string1\", [16, {\"key1\":[1,2,3,[4,5,6]]}, 18]]],\n [19, 20],\n 21, 22\n ]\';\n\nSELECT JSON_EXTRACT(@json, \'$[0 to 3][2]\');\n+-----------------------------------------------+\n| JSON_EXTRACT(@json, \'$[0 to 3][2]\') |\n+-----------------------------------------------+\n| [3, 6, [9, {\"key2\": 2}, 11], [14]] |\n+-----------------------------------------------+\n\nThis will produce output for first index of eighth from last element of a two\ndimensional array.\n\nNote: In range notation, when M > N ( when M,N are greater than or equal to 0)\nor (size of array - M or size of array - N when M, N are less than 0), then it\nis treated as an impossible range and NULL is returned.\n\nSET @json= \'[1, 2, 3, 4, 5]\';\nSELECT JSON_EXTRACT(@json, \'$[4 to 2]\');\n+-----------------------------------+\n| JSON_EXTRACT(@json, \'$[4 to 2]\') |\n+-----------------------------------+\n| NULL |\n+-----------------------------------+\n\nWildcard\n--------\n\nThe wildcard step, **, recursively selects all child elements of the current\nelement. Both array elements and object members are selected.\n\nThe wildcard step must not be the last step in the JSONPath expression. It\nmust be followed by an array or object member selector step.\n\nFor example:\n\nselect json_extract(@json_doc, \'$**.price\');\n\nwill select all object members in the document that are named price, while\n\nselect json_extract(@json_doc, \'$**[2]\');\n\nwill select the second element in each of the arrays present in the document.\n\nCompatibility\n-------------\n\nMariaDB\'s JSONPath syntax supports a subset of JSON Path\'s definition in the\nSQL Standard. The most notable things not supported are the strict mode and\nfilters.\n\nMariaDB\'s JSONPath is close to MySQL\'s JSONPath. The wildcard step ( ** ) is a\nnon-standard extension that has the same meaning as in MySQL. The differences\nbetween MariaDB and MySQL\'s JSONPath are: MySQL supports [last] and [M to N]\nas array element selectors; MySQL doesn\'t allow one to specify the mode\nexplicitly (but uses lax mode implicitly).\n\nURL: https://mariadb.com/kb/en/jsonpath-expressions/','','https://mariadb.com/kb/en/jsonpath-expressions/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (742,40,'JSON_ARRAY','Syntax\n------\n\nJSON_ARRAY([value[, value2] ...])\n\nDescription\n-----------\n\nReturns a JSON array containing the listed values. The list can be empty.\n\nExample\n-------\n\nSELECT Json_Array(56, 3.1416, \'My name is \"Foo\"\', NULL);\n+--------------------------------------------------+\n| Json_Array(56, 3.1416, \'My name is \"Foo\"\', NULL) |\n+--------------------------------------------------+\n| [56, 3.1416, \"My name is \\\"Foo\\\"\", null] |\n+--------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_array/','','https://mariadb.com/kb/en/json_array/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (743,40,'JSON_ARRAY_APPEND','Syntax\n------\n\nJSON_ARRAY_APPEND(json_doc, path, value[, path, value] ...)\n\nDescription\n-----------\n\nAppends values to the end of the specified arrays within a JSON document,\nreturning the result, or NULL if any of the arguments are NULL.\n\nEvaluation is performed from left to right, with the resulting document from\nthe previous pair becoming the new value against which the next pair is\nevaluated.\n\nIf the json_doc is not a valid JSON document, or if any of the paths are not\nvalid, or contain a * or ** wildcard, an error is returned.\n\nExamples\n--------\n\nSET @json = \'[1, 2, [3, 4]]\';\n\nSELECT JSON_ARRAY_APPEND(@json, \'$[0]\', 5)\n+-------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$[0]\', 5) |\n+-------------------------------------+\n| [[1, 5], 2, [3, 4]] |\n+-------------------------------------+\n\nSELECT JSON_ARRAY_APPEND(@json, \'$[1]\', 6);\n+-------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$[1]\', 6) |\n+-------------------------------------+\n| [1, [2, 6], [3, 4]] |\n+-------------------------------------+\n\nSELECT JSON_ARRAY_APPEND(@json, \'$[1]\', 6, \'$[2]\', 7);\n+------------------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$[1]\', 6, \'$[2]\', 7) |\n+------------------------------------------------+\n| [1, [2, 6], [3, 4, 7]] |\n+------------------------------------------------+\n\nSELECT JSON_ARRAY_APPEND(@json, \'$\', 5);\n+----------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$\', 5) |\n+----------------------------------+\n| [1, 2, [3, 4], 5] |\n+----------------------------------+\n\nSET @json = \'{\"A\": 1, \"B\": [2], \"C\": [3, 4]}\';\n\nSELECT JSON_ARRAY_APPEND(@json, \'$.B\', 5);\n+------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$.B\', 5) |\n+------------------------------------+\n| {\"A\": 1, \"B\": [2, 5], \"C\": [3, 4]} |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_array_append/','','https://mariadb.com/kb/en/json_array_append/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (744,40,'JSON_ARRAY_INSERT','Syntax\n------\n\nJSON_ARRAY_INSERT(json_doc, path, value[, path, value] ...)\n\nDescription\n-----------\n\nInserts a value into a JSON document, returning the modified document, or NULL\nif any of the arguments are NULL.\n\nEvaluation is performed from left to right, with the resulting document from\nthe previous pair becoming the new value against which the next pair is\nevaluated.\n\nIf the json_doc is not a valid JSON document, or if any of the paths are not\nvalid, or contain a * or ** wildcard, an error is returned.\n\nExamples\n--------\n\nSET @json = \'[1, 2, [3, 4]]\';\n\nSELECT JSON_ARRAY_INSERT(@json, \'$[0]\', 5);\n+-------------------------------------+\n| JSON_ARRAY_INSERT(@json, \'$[0]\', 5) |\n+-------------------------------------+\n| [5, 1, 2, [3, 4]] |\n+-------------------------------------+\n\nSELECT JSON_ARRAY_INSERT(@json, \'$[1]\', 6);\n+-------------------------------------+\n| JSON_ARRAY_INSERT(@json, \'$[1]\', 6) |\n+-------------------------------------+\n| [1, 6, 2, [3, 4]] |\n+-------------------------------------+\n\nSELECT JSON_ARRAY_INSERT(@json, \'$[1]\', 6, \'$[2]\', 7);\n+------------------------------------------------+\n| JSON_ARRAY_INSERT(@json, \'$[1]\', 6, \'$[2]\', 7) |\n+------------------------------------------------+\n| [1, 6, 7, 2, [3, 4]] |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_array_insert/','','https://mariadb.com/kb/en/json_array_insert/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (745,40,'JSON_COMPACT','Syntax\n------\n\nJSON_COMPACT(json_doc)\n\nDescription\n-----------\n\nRemoves all unnecessary spaces so the json document is as short as possible.\n\nExample\n-------\n\nSET @j = \'{ \"A\": 1, \"B\": [2, 3]}\';\n\nSELECT JSON_COMPACT(@j), @j;\n+-------------------+------------------------+\n| JSON_COMPACT(@j) | @j |\n+-------------------+------------------------+\n| {\"A\":1,\"B\":[2,3]} | { \"A\": 1, \"B\": [2, 3]} |\n+-------------------+------------------------+\n\nURL: https://mariadb.com/kb/en/json_compact/','','https://mariadb.com/kb/en/json_compact/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (746,40,'JSON_CONTAINS','Syntax\n------\n\nJSON_CONTAINS(json_doc, val[, path])\n\nDescription\n-----------\n\nReturns whether or not the specified value is found in the given JSON document\nor, optionally, at the specified path within the document. Returns 1 if it\ndoes, 0 if not and NULL if any of the arguments are null. An error occurs if\nthe document or path is not valid, or contains the * or ** wildcards.\n\nExamples\n--------\n\nSET @json = \'{\"A\": 0, \"B\": {\"C\": 1}, \"D\": 2}\';\n\nSELECT JSON_CONTAINS(@json, \'2\', \'$.A\');\n+----------------------------------+\n| JSON_CONTAINS(@json, \'2\', \'$.A\') |\n+----------------------------------+\n| 0 |\n+----------------------------------+\n\nSELECT JSON_CONTAINS(@json, \'2\', \'$.D\');\n+----------------------------------+\n| JSON_CONTAINS(@json, \'2\', \'$.D\') |\n+----------------------------------+\n| 1 |\n+----------------------------------+\n\nSELECT JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.A\');\n+-----------------------------------------+\n| JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.A\') |\n+-----------------------------------------+\n| 0 |\n+-----------------------------------------+\n\nSELECT JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.B\');\n+-----------------------------------------+\n| JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.B\') |\n+-----------------------------------------+\n| 1 |\n+-----------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_contains/','','https://mariadb.com/kb/en/json_contains/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (747,40,'JSON_CONTAINS_PATH','Syntax\n------\n\nJSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)\n\nDescription\n-----------\n\nIndicates whether the given JSON document contains data at the specified path\nor paths. Returns 1 if it does, 0 if not and NULL if any of the arguments are\nnull.\n\nThe return_arg can be one or all:\n\n* one - Returns 1 if at least one path exists within the JSON document. \n* all - Returns 1 only if all paths exist within the JSON document.\n\nExamples\n--------\n\nSET @json = \'{\"A\": 1, \"B\": [2], \"C\": [3, 4]}\';\n\nSELECT JSON_CONTAINS_PATH(@json, \'one\', \'$.A\', \'$.D\');\n+------------------------------------------------+\n| JSON_CONTAINS_PATH(@json, \'one\', \'$.A\', \'$.D\') |\n+------------------------------------------------+\n| 1 |\n+------------------------------------------------+\n1 row in set (0.00 sec)\n\nSELECT JSON_CONTAINS_PATH(@json, \'all\', \'$.A\', \'$.D\');\n+------------------------------------------------+\n| JSON_CONTAINS_PATH(@json, \'all\', \'$.A\', \'$.D\') |\n+------------------------------------------------+\n| 0 |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_contains_path/','','https://mariadb.com/kb/en/json_contains_path/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (748,40,'JSON_DEPTH','Syntax\n------\n\nJSON_DEPTH(json_doc)\n\nDescription\n-----------\n\nReturns the maximum depth of the given JSON document, or NULL if the argument\nis null. An error will occur if the argument is an invalid JSON document.\n\n* Scalar values or empty arrays or objects have a depth of 1.\n* Arrays or objects that are not empty but contain only elements or member\nvalues of depth 1 will have a depth of 2.\n* In other cases, the depth will be greater than 2.\n\nExamples\n--------\n\nSELECT JSON_DEPTH(\'[]\'), JSON_DEPTH(\'true\'), JSON_DEPTH(\'{}\');\n+------------------+--------------------+------------------+\n| JSON_DEPTH(\'[]\') | JSON_DEPTH(\'true\') | JSON_DEPTH(\'{}\') |\n+------------------+--------------------+------------------+\n| 1 | 1 | 1 |\n+------------------+--------------------+------------------+\n\nSELECT JSON_DEPTH(\'[1, 2, 3]\'), JSON_DEPTH(\'[[], {}, []]\');\n+-------------------------+----------------------------+\n| JSON_DEPTH(\'[1, 2, 3]\') | JSON_DEPTH(\'[[], {}, []]\') |\n+-------------------------+----------------------------+\n| 2 | 2 |\n+-------------------------+----------------------------+\n\nSELECT JSON_DEPTH(\'[1, 2, [3, 4, 5, 6], 7]\');\n+---------------------------------------+\n| JSON_DEPTH(\'[1, 2, [3, 4, 5, 6], 7]\') |\n+---------------------------------------+\n| 3 |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_depth/','','https://mariadb.com/kb/en/json_depth/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (749,40,'JSON_DETAILED','Syntax\n------\n\nJSON_DETAILED(json_doc[, tab_size])\n\nDescription\n-----------\n\nRepresents JSON in the most understandable way emphasizing nested structures.\n\nExample\n-------\n\nSET @j = \'{ \"A\":1,\"B\":[2,3]}\';\n\nSELECT @j;\n+--------------------+\n| @j |\n+--------------------+\n| { \"A\":1,\"B\":[2,3]} |\n+--------------------+\n\nSELECT JSON_DETAILED(@j);\n+------------------------------------------------------------+\n| JSON_DETAILED(@j) |\n+------------------------------------------------------------+\n| {\n \"A\": 1,\n \"B\":\n [\n 2,\n 3\n ]\n} |\n+------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_detailed/','','https://mariadb.com/kb/en/json_detailed/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (750,40,'JSON_EXISTS','Syntax\n------\n\nDescription\n-----------\n\nDetermines whether a specified JSON value exists in the given data. Returns 1\nif found, 0 if not, or NULL if any of the inputs were NULL.\n\nExamples\n--------\n\nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2\");\n+------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2\") |\n+------------------------------------------------------------+\n| 1 |\n+------------------------------------------------------------+\n\nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key3\");\n+------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key3\") |\n+------------------------------------------------------------+\n| 0 |\n+------------------------------------------------------------+\n\nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2[1]\");\n+---------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2[1]\") |\n+---------------------------------------------------------------+\n| 1 |\n+---------------------------------------------------------------+\n\nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2[10]\");\n+----------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2[10]\") |\n+----------------------------------------------------------------+\n| 0 |\n+----------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_exists/','','https://mariadb.com/kb/en/json_exists/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (751,40,'JSON_EXTRACT','Syntax\n------\n\nJSON_EXTRACT(json_doc, path[, path] ...)\n\nDescription\n-----------\n\nExtracts data from a JSON document. The extracted data is selected from the\nparts matching the path arguments. Returns all matched values; either as a\nsingle matched value, or, if the arguments could return multiple values, a\nresult autowrapped as an array in the matching order.\n\nReturns NULL if no paths match or if any of the arguments are NULL.\n\nAn error will occur if any path argument is not a valid path, or if the\njson_doc argument is not a valid JSON document.\n\nThe path expression be a JSONPath expression as supported by MariaDB\n\nExamples\n--------\n\nSET @json = \'[1, 2, [3, 4]]\';\n\nSELECT JSON_EXTRACT(@json, \'$[1]\');\n+-----------------------------+\n| JSON_EXTRACT(@json, \'$[1]\') |\n+-----------------------------+\n| 2 |\n+-----------------------------+\n\nSELECT JSON_EXTRACT(@json, \'$[2]\');\n+-----------------------------+\n| JSON_EXTRACT(@json, \'$[2]\') |\n+-----------------------------+\n| [3, 4] |\n+-----------------------------+\n\nSELECT JSON_EXTRACT(@json, \'$[2][1]\');\n+--------------------------------+\n| JSON_EXTRACT(@json, \'$[2][1]\') |\n+--------------------------------+\n| 4 |\n+--------------------------------+\n\nURL: https://mariadb.com/kb/en/json_extract/','','https://mariadb.com/kb/en/json_extract/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (752,40,'JSON_INSERT','Syntax\n------\n\nJSON_INSERT(json_doc, path, val[, path, val] ...)\n\nDescription\n-----------\n\nInserts data into a JSON document, returning the resulting document or NULL if\nany argument is null.\n\nAn error will occur if the JSON document is not invalid, or if any of the\npaths are invalid or contain a * or ** wildcard.\n\nJSON_INSERT can only insert data while JSON_REPLACE can only update. JSON_SET\ncan update or insert data.\n\nExamples\n--------\n\nSET @json = \'{ \"A\": 0, \"B\": [1, 2]}\';\n\nSELECT JSON_INSERT(@json, \'$.C\', \'[3, 4]\');\n+--------------------------------------+\n| JSON_INSERT(@json, \'$.C\', \'[3, 4]\') |\n+--------------------------------------+\n| { \"A\": 0, \"B\": [1, 2], \"C\":\"[3, 4]\"} |\n+--------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_insert/','','https://mariadb.com/kb/en/json_insert/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (753,40,'JSON_KEYS','Syntax\n------\n\nJSON_KEYS(json_doc[, path])\n\nDescription\n-----------\n\nReturns the keys as a JSON array from the top-level value of a JSON object or,\nif the optional path argument is provided, the top-level keys from the path.\n\nExcludes keys from nested sub-objects in the top level value. The resulting\narray will be empty if the selected object is empty.\n\nReturns NULL if any of the arguments are null, a given path does not locate an\nobject, or if the json_doc argument is not an object.\n\nAn error will occur if JSON document is invalid, the path is invalid or if the\npath contains a * or ** wildcard.\n\nExamples\n--------\n\nSELECT JSON_KEYS(\'{\"A\": 1, \"B\": {\"C\": 2}}\');\n+--------------------------------------+\n| JSON_KEYS(\'{\"A\": 1, \"B\": {\"C\": 2}}\') |\n+--------------------------------------+\n| [\"A\", \"B\"] |\n+--------------------------------------+\n\nSELECT JSON_KEYS(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\', \'$.C\');\n+-----------------------------------------------------+\n| JSON_KEYS(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\', \'$.C\') |\n+-----------------------------------------------------+\n| [\"D\"] |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_keys/','','https://mariadb.com/kb/en/json_keys/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (754,40,'JSON_LENGTH','Syntax\n------\n\nJSON_LENGTH(json_doc[, path])\n\nDescription\n-----------\n\nReturns the length of a JSON document, or, if the optional path argument is\ngiven, the length of the value within the document specified by the path.\n\nReturns NULL if any of the arguments argument are null or the path argument\ndoes not identify a value in the document.\n\nAn error will occur if the JSON document is invalid, the path is invalid or if\nthe path contains a * or ** wildcard.\n\nLength will be determined as follow:\n\n* A scalar\'s length is always 1.\n* If an array, the number of elements in the array.\n* If an object, the number of members in the object.\n\nThe length of nested arrays or objects are not counted.\n\nExamples\n--------\n\nURL: https://mariadb.com/kb/en/json_length/','','https://mariadb.com/kb/en/json_length/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (755,40,'JSON_LOOSE','Syntax\n------\n\nJSON_LOOSE(json_doc)\n\nDescription\n-----------\n\nAdds spaces to a JSON document to make it look more readable.\n\nExample\n-------\n\nSET @j = \'{ \"A\":1,\"B\":[2,3]}\';\n\nSELECT JSON_LOOSE(@j), @j;\n+-----------------------+--------------------+\n| JSON_LOOSE(@j) | @j |\n+-----------------------+--------------------+\n| {\"A\": 1, \"B\": [2, 3]} | { \"A\":1,\"B\":[2,3]} |\n+-----------------------+--------------------+\n\nURL: https://mariadb.com/kb/en/json_loose/','','https://mariadb.com/kb/en/json_loose/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (756,40,'JSON_MERGE','Syntax\n------\n\nJSON_MERGE(json_doc, json_doc[, json_doc] ...)\n\nDescription\n-----------\n\nMerges the given JSON documents.\n\nReturns the merged result,or NULL if any argument is NULL.\n\nAn error occurs if any of the arguments are not valid JSON documents.\n\nJSON_MERGE has been deprecated since MariaDB 10.2.25, MariaDB 10.3.16 and\nMariaDB 10.4.5. JSON_MERGE_PATCH is an RFC 7396-compliant replacement, and\nJSON_MERGE_PRESERVE is a synonym.\n\nExample\n-------\n\nSET @json1 = \'[1, 2]\';\nSET @json2 = \'[3, 4]\';\n\nSELECT JSON_MERGE(@json1,@json2);\n+---------------------------+\n| JSON_MERGE(@json1,@json2) |\n+---------------------------+\n| [1, 2, 3, 4] |\n+---------------------------+\n\nURL: https://mariadb.com/kb/en/json_merge/','','https://mariadb.com/kb/en/json_merge/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (757,40,'JSON_MERGE_PATCH','MariaDB starting with 10.2.25\n-----------------------------\nJSON_MERGE_PATCH was introduced in MariaDB 10.2.25, MariaDB 10.3.16 and\nMariaDB 10.4.5.\n\nSyntax\n------\n\nJSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)\n\nDescription\n-----------\n\nMerges the given JSON documents, returning the merged result, or NULL if any\nargument is NULL.\n\nJSON_MERGE_PATCH is an RFC 7396-compliant replacement for JSON_MERGE, which\nhas been deprecated.\n\nExample\n-------\n\nSET @json1 = \'[1, 2]\';\nSET @json2 = \'[2, 3]\';\nSELECT JSON_MERGE_PATCH(@json1,@json2),JSON_MERGE_PRESERVE(@json1,@json2);\n+---------------------------------+------------------------------------+\n| JSON_MERGE_PATCH(@json1,@json2) | JSON_MERGE_PRESERVE(@json1,@json2) |\n+---------------------------------+------------------------------------+\n| [2, 3] | [1, 2, 2, 3] |\n+---------------------------------+------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_merge_patch/','','https://mariadb.com/kb/en/json_merge_patch/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (758,40,'JSON_MERGE_PRESERVE','MariaDB starting with 10.2.25\n-----------------------------\nJSON_MERGE_PRESERVE was introduced in MariaDB 10.2.25, MariaDB 10.3.16 and\nMariaDB 10.4.5.\n\nSyntax\n------\n\nJSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)\n\nDescription\n-----------\n\nMerges the given JSON documents, returning the merged result, or NULL if any\nargument is NULL.\n\nJSON_MERGE_PRESERVE was introduced in MariaDB 10.2.25, MariaDB 10.3.16 and\nMariaDB 10.4.5 as a synonym for JSON_MERGE, which has been deprecated.\n\nExample\n-------\n\nSET @json1 = \'[1, 2]\';\nSET @json2 = \'[2, 3]\';\nSELECT JSON_MERGE_PATCH(@json1,@json2),JSON_MERGE_PRESERVE(@json1,@json2);\n+---------------------------------+------------------------------------+\n| JSON_MERGE_PATCH(@json1,@json2) | JSON_MERGE_PRESERVE(@json1,@json2) |\n+---------------------------------+------------------------------------+\n| [2, 3] | [1, 2, 2, 3] |\n+---------------------------------+------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_merge_preserve/','','https://mariadb.com/kb/en/json_merge_preserve/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (759,40,'JSON_OBJECT','Syntax\n------\n\nJSON_OBJECT([key, value[, key, value] ...])\n\nDescription\n-----------\n\nReturns a JSON object containing the given key/value pairs. The key/value list\ncan be empty.\n\nAn error will occur if there are an odd number of arguments, or any key name\nis NULL.\n\nExample\n-------\n\nSELECT JSON_OBJECT(\"id\", 1, \"name\", \"Monty\");\n+---------------------------------------+\n| JSON_OBJECT(\"id\", 1, \"name\", \"Monty\") |\n+---------------------------------------+\n| {\"id\": 1, \"name\": \"Monty\"} |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_object/','','https://mariadb.com/kb/en/json_object/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (760,40,'JSON_QUERY','Syntax\n------\n\nJSON_QUERY(json_doc, path)\n\nDescription\n-----------\n\nGiven a JSON document, returns an object or array specified by the path.\nReturns NULL if not given a valid JSON document, or if there is no match.\n\nExamples\n--------\n\nselect json_query(\'{\"key1\":{\"a\":1, \"b\":[1,2]}}\', \'$.key1\');\n+-----------------------------------------------------+\n| json_query(\'{\"key1\":{\"a\":1, \"b\":[1,2]}}\', \'$.key1\') |\n+-----------------------------------------------------+\n| {\"a\":1, \"b\":[1,2]} |\n+-----------------------------------------------------+\n\nselect json_query(\'{\"key1\":123, \"key1\": [1,2,3]}\', \'$.key1\');\n+-------------------------------------------------------+\n| json_query(\'{\"key1\":123, \"key1\": [1,2,3]}\', \'$.key1\') |\n+-------------------------------------------------------+\n| [1,2,3] |\n+-------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_query/','','https://mariadb.com/kb/en/json_query/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (761,40,'JSON_QUOTE','Syntax\n------\n\nJSON_QUOTE(json_value)\n\nDescription\n-----------\n\nQuotes a string as a JSON value, usually for producing valid JSON string\nliterals for inclusion in JSON documents. Wraps the string with double quote\ncharacters and escapes interior quotes and other special characters, returning\na utf8mb4 string.\n\nReturns NULL if the argument is NULL.\n\nExamples\n--------\n\nSELECT JSON_QUOTE(\'A\'), JSON_QUOTE(\"B\"), JSON_QUOTE(\'\"C\"\');\n+-----------------+-----------------+-------------------+\n| JSON_QUOTE(\'A\') | JSON_QUOTE(\"B\") | JSON_QUOTE(\'\"C\"\') |\n+-----------------+-----------------+-------------------+\n| \"A\" | \"B\" | \"\\\"C\\\"\" |\n+-----------------+-----------------+-------------------+\n\nURL: https://mariadb.com/kb/en/json_quote/','','https://mariadb.com/kb/en/json_quote/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (762,40,'JSON_REMOVE','Syntax\n------\n\nJSON_REMOVE(json_doc, path[, path] ...)\n\nDescription\n-----------\n\nRemoves data from a JSON document returning the result, or NULL if any of the\narguments are null. If the element does not exist in the document, no changes\nare made.\n\nAn error will occur if JSON document is invalid, the path is invalid or if the\npath contains a * or ** wildcard.\n\nPath arguments are evaluated from left to right, with the result from the\nearlier evaluation being used as the value for the next.\n\nExamples\n--------\n\nSELECT JSON_REMOVE(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\', \'$.C\');\n+-------------------------------------------------------+\n| JSON_REMOVE(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\', \'$.C\') |\n+-------------------------------------------------------+\n| {\"A\": 1, \"B\": 2} |\n+-------------------------------------------------------+\n\nSELECT JSON_REMOVE(\'[\"A\", \"B\", [\"C\", \"D\"], \"E\"]\', \'$[1]\');\n+----------------------------------------------------+\n| JSON_REMOVE(\'[\"A\", \"B\", [\"C\", \"D\"], \"E\"]\', \'$[1]\') |\n+----------------------------------------------------+\n| [\"A\", [\"C\", \"D\"], \"E\"] |\n+----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_remove/','','https://mariadb.com/kb/en/json_remove/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (763,40,'JSON_REPLACE','Syntax\n------\n\nJSON_REPLACE(json_doc, path, val[, path, val] ...)\n\nDescription\n-----------\n\nReplaces existing values in a JSON document, returning the result, or NULL if\nany of the arguments are NULL.\n\nAn error will occur if the JSON document is invalid, the path is invalid or if\nthe path contains a * or ** wildcard.\n\nPaths and values are evaluated from left to right, with the result from the\nearlier evaluation being used as the value for the next.\n\nJSON_REPLACE can only update data, while JSON_INSERT can only insert. JSON_SET\ncan update or insert data.\n\nExamples\n--------\n\nSELECT JSON_REPLACE(\'{ \"A\": 1, \"B\": [2, 3]}\', \'$.B[1]\', 4);\n+-----------------------------------------------------+\n| JSON_REPLACE(\'{ \"A\": 1, \"B\": [2, 3]}\', \'$.B[1]\', 4) |\n+-----------------------------------------------------+\n| { \"A\": 1, \"B\": [2, 4]} |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_replace/','','https://mariadb.com/kb/en/json_replace/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (764,40,'JSON_SEARCH','Syntax\n------\n\nJSON_SEARCH(json_doc, return_arg, search_str[, escape_char[, path] ...])\n\nDescription\n-----------\n\nReturns the path to the given string within a JSON document, or NULL if any of\njson_doc, search_str or a path argument is NULL; if the search string is not\nfound, or if no path exists within the document.\n\nA warning will occur if the JSON document is not valid, any of the path\narguments are not valid, if return_arg is neither one nor all, or if the\nescape character is not a constant. NULL will be returned.\n\nreturn_arg can be one of two values:\n\n* \'one: Terminates after finding the first match, so will return one path\nstring. If there is more than one match, it is undefined which is considered\nfirst.\n* all: Returns all matching path strings, without duplicates. Multiple strings\nare autowrapped as an array. The order is undefined.\n\nExamples\n--------\n\nSET @json = \'[\"A\", [{\"B\": \"1\"}], {\"C\":\"AB\"}, {\"D\":\"BC\"}]\';\n\nSELECT JSON_SEARCH(@json, \'one\', \'AB\');\n+---------------------------------+\n| JSON_SEARCH(@json, \'one\', \'AB\') |\n+---------------------------------+\n| \"$[2].C\" |\n+---------------------------------+\n\nURL: https://mariadb.com/kb/en/json_search/','','https://mariadb.com/kb/en/json_search/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (765,40,'JSON_SET','Syntax\n------\n\nJSON_SET(json_doc, path, val[, path, val] ...)\n\nDescription\n-----------\n\nUpdates or inserts data into a JSON document, returning the result, or NULL if\nany of the arguments are NULL or the optional path fails to find an object.\n\nAn error will occur if the JSON document is invalid, the path is invalid or if\nthe path contains a * or wildcard.\n\nJSON_SET can update or insert data, while JSON_REPLACE can only update, and\nJSON_INSERT only insert.\n\nExamples\n--------\n\nSELECT JSON_SET(Priv, \'$.locked\', \'true\') FROM mysql.global_priv\n\nURL: https://mariadb.com/kb/en/json_set/','','https://mariadb.com/kb/en/json_set/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (766,40,'JSON_TABLE','MariaDB starting with 10.6.0\n----------------------------\nJSON_TABLE was added in MariaDB 10.6.0.\n\nJSON_TABLE is a table function that converts JSON data into a relational form.\n\nSyntax\n------\n\nJSON_TABLE(json_doc, \n context_path COLUMNS (column_list)\n) [AS] alias\n\ncolumn_list:\n column[, column][, ...]\n\ncolumn:\n name FOR ORDINALITY\n | name type PATH path_str [on_empty] [on_error]\n | name type EXISTS PATH path_str\n | NESTED PATH path_str COLUMNS (column_list)\n\non_empty:\n {NULL | DEFAULT string | ERROR} ON EMPTY\n\non_error:\n {NULL | DEFAULT string | ERROR} ON ERROR\n\nDescription\n-----------\n\nJSON_TABLE can be used in contexts where a table reference can be used; in the\nFROM clause of a SELECT statement, and in multi-table UPDATE/DELETE statements.\n\njson_doc is the JSON document to extract data from. In the simplest case, it\nis a string literal containing JSON. In more complex cases it can be an\narbitrary expression returning JSON. The expression may have references to\ncolumns of other tables. However, one can only refer to tables that precede\nthis JSON_TABLE invocation. For RIGHT JOIN, it is assumed that its outer side\nprecedes the inner. All tables in outer selects are also considered preceding.\n\ncontext_path is a JSON Path expression pointing to a collection of nodes in\njson_doc that will be used as the source of rows.\n\nThe COLUMNS clause declares the names and types of the columns that JSON_TABLE\nreturns, as well as how the values of the columns are produced.\n\nColumn Definitions\n------------------\n\nThe following types of columns are supported:\n\nPath Columns\n------------\n\nname type PATH path_str [on_empty] [on_error]\n\nLocates the JSON node pointed to by path_str and returns its value. The\npath_str is evaluated using the current row source node as the context node.\n\nset @json=\'\n[\n {\"name\":\"Laptop\", \"color\":\"black\", \"price\":\"1000\"},\n {\"name\":\"Jeans\", \"color\":\"blue\"}\n]\';\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n name varchar(10) path \'$.name\',\n color varchar(10) path \'$.color\',\n price decimal(8,2) path \'$.price\' )\n) as jt;\n+--------+-------+---------+\n| name | color | price |\n+--------+-------+---------+\n| Laptop | black | 1000.00 |\n| Jeans | blue | NULL |\n+--------+-------+---------+\n\nThe on_empty and on_error clauses specify the actions to be performed when the\nvalue was not found or there was an error condition. See the ON EMPTY and ON\nERROR clauses section for details.\n\nORDINALITY Columns\n------------------\n\nname FOR ORDINALITY\n\nCounts the rows, starting from 1.\n\nExample:\n\nset @json=\'\n[\n {\"name\":\"Laptop\", \"color\":\"black\"},\n {\"name\":\"Jeans\", \"color\":\"blue\"}\n]\';\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n id for ordinality,\n name varchar(10) path \'$.name\')\n) as jt;\n+------+--------+\n| id | name |\n+------+--------+\n| 1 | Laptop |\n| 2 | Jeans |\n+------+--------+\n\nEXISTS PATH Columns\n-------------------\n\nname type EXISTS PATH path_str\n\nChecks whether the node pointed to by value_path exists. The value_path is\nevaluated using the current row source node as the context node.\n\nset @json=\'\n[\n {\"name\":\"Laptop\", \"color\":\"black\", \"price\":1000},\n {\"name\":\"Jeans\", \"color\":\"blue\"}\n]\';\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n name varchar(10) path \'$.name\',\n has_price integer exists path \'$.price\')\n) as jt;\n+--------+-----------+\n| name | has_price |\n+--------+-----------+\n| Laptop | 1 |\n| Jeans | 0 |\n+--------+-----------+\n\nNESTED PATHs\n------------\n\nNESTED PATH converts nested JSON structures into multiple rows.\n\nNESTED PATH path COLUMNS (column_list)\n\nIt finds the sequence of JSON nodes pointed to by path and uses it to produce\nrows. For each found node, a row is generated with column values as specified\nby the NESTED PATH\'s COLUMNS clause. If path finds no nodes, only one row is\ngenerated with all columns having NULL values.\n\nFor example, consider a JSON document that contains an array of items, and\neach item, in turn, is expected to have an array of its available sizes:\n\nset @json=\'\n[\n {\"name\":\"Jeans\", \"sizes\": [32, 34, 36]},\n {\"name\":\"T-Shirt\", \"sizes\":[\"Medium\", \"Large\"]},\n {\"name\":\"Cellphone\"}\n]\';\n\nNESTED PATH allows one to produce a separate row for each size each item has:\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n name varchar(10) path \'$.name\',\n nested path \'$.sizes[*]\' columns (\n size varchar(32) path \'$\'\n )\n )\n) as jt;\n+-----------+--------+\n| name | size |\n+-----------+--------+\n| Jeans | 32 |\n| Jeans | 34 |\n| Jeans | 36 |\n| T-Shirt | Medium |\n| T-Shirt | Large |\n| Cellphone | NULL |\n+-----------+--------+\n\nNESTED PATH clauses can be nested within one another. They can also be located\nnext to each other. In that case, the nested path clauses will produce records\none at a time. The ones that are not producing records will have all columns\nset to NULL.\n\nExample:\n\nset @json=\'\n[\n {\"name\":\"Jeans\", \"sizes\": [32, 34, 36], \"colors\":[\"black\", \"blue\"]}\n]\';\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n name varchar(10) path \'$.name\',\n nested path \'$.sizes[*]\' columns (\n size varchar(32) path \'$\'\n ),\n nested path \'$.colors[*]\' columns (\n color varchar(32) path \'$\'\n )\n )\n) as jt;\n\n+-------+------+-------+\n| name | size | color |\n+-------+------+-------+\n| Jeans | 32 | NULL |\n| Jeans | 34 | NULL |\n| Jeans | 36 | NULL |\n| Jeans | NULL | black |\n| Jeans | NULL | blue |\n+-------+------+-------+\n\nON EMPTY and ON ERROR Clauses\n-----------------------------\n\nThe ON EMPTY clause specifies what will be done when the element specified by\nthe search path is missing in the JSON document.\n\non_empty:\n {NULL | DEFAULT string | ERROR} ON EMPTY\n\nWhen ON EMPTY clause is not present, NULL ON EMPTY is implied.\n\non_error:\n {NULL | DEFAULT string | ERROR} ON ERROR\n\nThe ON ERROR clause specifies what should be done if a JSON structure error\noccurs when trying to extract the value pointed to by the path expression. A\nJSON structure error here occurs only when one attempts to convert a JSON\nnon-scalar (array or object) into a scalar value. When the ON ERROR clause is\nnot present, NULL ON ERROR is implied.\n\nNote: A datatype conversion error (e.g. attempt to store a non-integer value\ninto an integer field, or a varchar column being truncated) is not considered\na JSON error and so will not trigger the ON ERROR behavior. It will produce\nwarnings, in the same way as CAST(value AS datatype) would.\n\nReplication\n-----------\n\nIn the current code, evaluation of JSON_TABLE is deterministic, that is, for a\ngiven input string JSON_TABLE will always produce the same set of rows in the\nsame order. However, one can think of JSON documents that one can consider\nidentical which will produce different output. In order to be future-proof and\nwithstand changes like:\n\n* sorting JSON object members by name (like MySQL does)\n* changing the way duplicate object members are handled\nthe function is marked as unsafe for statement-based replication.\n\nExtracting a Subdocument into a Column\n--------------------------------------\n\nMariaDB starting with 10.6.9\n----------------------------\nPrior to MariaDB 10.6.9, JSON_TABLE did not allow one to extract a JSON\n\"subdocument\" into a JSON column.\n\nSELECT * FROM JSON_TABLE(\'{\"foo\": [1,2,3,4]}\',\'$\' columns( jscol json path\n\'$.foo\') ) AS T;\n+-------+\n| jscol |\n+-------+\n| NULL |\n+-------+\n\nThis is supported from MariaDB 10.6.9:\n\nSELECT * FROM JSON_TABLE(\'{\"foo\": [1,2,3,4]}\',\'$\' columns( jscol json path\n\'$.foo\') ) AS T;\n+-----------+\n| jscol |\n+-----------+\n| [1,2,3,4] |\n+-----------+\n\nURL: https://mariadb.com/kb/en/json_table/','','https://mariadb.com/kb/en/json_table/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (767,40,'JSON_TYPE','Syntax\n------\n\nJSON_TYPE(json_val)\n\nDescription\n-----------\n\nReturns the type of a JSON value (as a string), or NULL if the argument is\nnull.\n\nAn error will occur if the argument is an invalid JSON value.\n\nThe following is a complete list of the possible return types:\n\n+-----------------------------------+-----------------+-----------------------+\n| Return type | Value | Example |\n+-----------------------------------+-----------------+-----------------------+\n| ARRAY | JSON array | [1, 2, {\"key\": |\n| | | \"value\"}] |\n+-----------------------------------+-----------------+-----------------------+\n| OBJECT | JSON object | {\"key\":\"value\"} |\n+-----------------------------------+-----------------+-----------------------+\n| BOOLEAN | JSON | true, false |\n| | true/false | |\n| | literals | |\n+-----------------------------------+-----------------+-----------------------+\n| DOUBLE | A number with | 1.2 |\n| | at least one | |\n| | floating point | |\n| | decimal. | |\n+-----------------------------------+-----------------+-----------------------+\n| INTEGER | A number | 1 |\n| | without a | |\n| | floating point | |\n| | decimal. | |\n+-----------------------------------+-----------------+-----------------------+\n| NULL | JSON null | null |\n| | literal (this | |\n| | is returned as | |\n| | a string, not | |\n| | to be confused | |\n| | with the SQL | |\n| | NULL value!) | |\n+-----------------------------------+-----------------+-----------------------+\n| STRING | JSON String | \"a sample string\" |\n+-----------------------------------+-----------------+-----------------------+\n\nExamples\n--------\n\nSELECT JSON_TYPE(\'{\"A\": 1, \"B\": 2, \"C\": 3}\');\n+---------------------------------------+\n| JSON_TYPE(\'{\"A\": 1, \"B\": 2, \"C\": 3}\') |\n+---------------------------------------+\n| OBJECT |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_type/','','https://mariadb.com/kb/en/json_type/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (768,40,'JSON_UNQUOTE','Syntax\n------\n\nJSON_UNQUOTE(val)\n\nDescription\n-----------\n\nUnquotes a JSON value, returning a string, or NULL if the argument is null.\n\nAn error will occur if the given value begins and ends with double quotes and\nis an invalid JSON string literal.\n\nIf the given value is not a JSON string, value is passed through unmodified.\n\nCertain character sequences have special meanings within a string. Usually, a\nbackslash is ignored, but the escape sequences in the table below are\nrecognised by MariaDB, unless the SQL Mode is set to NO_BACKSLASH_ESCAPES SQL.\n\n+-----------------------------------------------+-----------------------------+\n| Escape sequence | Character |\n+-----------------------------------------------+-----------------------------+\n| \\\" | Double quote (\") |\n+-----------------------------------------------+-----------------------------+\n| \\b | Backslash |\n+-----------------------------------------------+-----------------------------+\n| \\f | Formfeed |\n+-----------------------------------------------+-----------------------------+\n| \\n | Newline (linefeed) |\n+-----------------------------------------------+-----------------------------+\n| \\r | Carriage return |\n+-----------------------------------------------+-----------------------------+\n| \\t | Tab |\n+-----------------------------------------------+-----------------------------+\n| \\\\ | Backslash (\\) |\n+-----------------------------------------------+-----------------------------+\n| \\uXXXX | UTF-8 bytes for Unicode |\n| | value XXXX |\n+-----------------------------------------------+-----------------------------+\n\nExamples\n--------\n\nSELECT JSON_UNQUOTE(\'\"Monty\"\');\n+-------------------------+\n| JSON_UNQUOTE(\'\"Monty\"\') |\n+-------------------------+\n| Monty |\n+-------------------------+\n\nWith the default SQL Mode:\n\nSELECT JSON_UNQUOTE(\'Si\\bng\\ting\');\n+-----------------------------+\n| JSON_UNQUOTE(\'Si\\bng\\ting\') |\n+-----------------------------+\n| Sng ing |\n+-----------------------------+\n\nSetting NO_BACKSLASH_ESCAPES:\n\nSET @@sql_mode = \'NO_BACKSLASH_ESCAPES\';\n\nSELECT JSON_UNQUOTE(\'Si\\bng\\ting\');\n+-----------------------------+\n| JSON_UNQUOTE(\'Si\\bng\\ting\') |\n+-----------------------------+\n| Si\\bng\\ting |\n+-----------------------------+\n\nURL: https://mariadb.com/kb/en/json_unquote/','','https://mariadb.com/kb/en/json_unquote/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (769,40,'JSON_VALID','Syntax\n------\n\nJSON_VALID(value)\n\nDescription\n-----------\n\nIndicates whether the given value is a valid JSON document or not. Returns 1\nif valid, 0 if not, and NULL if the argument is NULL.\n\nFrom MariaDB 10.4.3, the JSON_VALID function is automatically used as a CHECK\nconstraint for the JSON data type alias in order to ensure that a valid json\ndocument is inserted.\n\nExamples\n--------\n\nSELECT JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\"}\');\n+------------------------------------------+\n| JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\"}\') |\n+------------------------------------------+\n| 1 |\n+------------------------------------------+\n\nSELECT JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\", \"oddfield\"}\');\n+------------------------------------------------------+\n| JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\", \"oddfield\"}\') |\n+------------------------------------------------------+\n| 0 |\n+------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_valid/','','https://mariadb.com/kb/en/json_valid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (770,40,'JSON_VALUE','Syntax\n------\n\nJSON_VALUE(json_doc, path)\n\nDescription\n-----------\n\nGiven a JSON document, returns the scalar specified by the path. Returns NULL\nif not given a valid JSON document, or if there is no match.\n\nExamples\n--------\n\nselect json_value(\'{\"key1\":123}\', \'$.key1\');\n+--------------------------------------+\n| json_value(\'{\"key1\":123}\', \'$.key1\') |\n+--------------------------------------+\n| 123 |\n+--------------------------------------+\n\nselect json_value(\'{\"key1\": [1,2,3], \"key1\":123}\', \'$.key1\');\n+-------------------------------------------------------+\n| json_value(\'{\"key1\": [1,2,3], \"key1\":123}\', \'$.key1\') |\n+-------------------------------------------------------+\n| 123 |\n+-------------------------------------------------------+\n\nIn the SET statement below, two escape characters are needed, as a single\nescape character would be applied by the SQL parser in the SET statement, and\nthe escaped character would not form part of the saved value.\n\nSET @json = \'{\"key1\":\"60\\\\\" Table\", \"key2\":\"1\"}\';\n\nSELECT JSON_VALUE(@json,\'$.key1\') AS Name , json_value(@json,\'$.key2\') as ID;\n+-----------+------+\n| Name | ID |\n+-----------+------+\n| 60\" Table | 1 |\n+-----------+------+\n\nURL: https://mariadb.com/kb/en/json_value/','','https://mariadb.com/kb/en/json_value/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (771,41,'Window Functions Overview','Introduction\n------------\n\nWindow functions allow calculations to be performed across a set of rows\nrelated to the current row.\n\nSyntax\n------\n\nfunction (expression) OVER (\n [ PARTITION BY expression_list ]\n [ ORDER BY order_list [ frame_clause ] ] )\n\nfunction:\n A valid window function\n\nexpression_list:\n expression | column_name [, expr_list ]\n\norder_list:\n expression | column_name [ ASC | DESC ]\n [, ... ]\n\nframe_clause:\n {ROWS | RANGE} {frame_border | BETWEEN frame_border AND frame_border}\n\nframe_border:\n | UNBOUNDED PRECEDING\n | UNBOUNDED FOLLOWING\n | CURRENT ROW\n | expr PRECEDING\n | expr FOLLOWING\n\nDescription\n-----------\n\nIn some ways, window functions are similar to aggregate functions in that they\nperform calculations across a set of rows. However, unlike aggregate\nfunctions, the output is not grouped into a single row.\n\nNon-aggregate window functions include\n\n* CUME_DIST\n* DENSE_RANK\n* FIRST_VALUE\n* LAG\n* LAST_VALUE\n* LEAD\n* MEDIAN\n* NTH_VALUE\n* NTILE\n* PERCENT_RANK\n* PERCENTILE_CONT\n* PERCENTILE_DISC\n* RANK, ROW_NUMBER\n\nAggregate functions that can also be used as window functions include\n\n* AVG\n* BIT_AND\n* BIT_OR\n* BIT_XOR\n* COUNT\n* MAX\n* MIN\n* STD\n* STDDEV\n* STDDEV_POP\n* STDDEV_SAMP\n* SUM\n* VAR_POP\n* VAR_SAMP\n* VARIANCE\n\nWindow function queries are characterised by the OVER keyword, following which\nthe set of rows used for the calculation is specified. By default, the set of\nrows used for the calculation (the \"window) is the entire dataset, which can\nbe ordered with the ORDER BY clause. The PARTITION BY clause is used to reduce\nthe window to a particular group within the dataset.\n\nFor example, given the following data:\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nthe following two queries return the average partitioned by test and by name\nrespectively:\n\nSELECT name, test, score, AVG(score) OVER (PARTITION BY test) \n AS average_by_test FROM student;\n+---------+--------+-------+-----------------+\n| name | test | score | average_by_test |\n+---------+--------+-------+-----------------+\n| Chun | SQL | 75 | 65.2500 |\n| Chun | Tuning | 73 | 68.7500 |\n| Esben | SQL | 43 | 65.2500 |\n| Esben | Tuning | 31 | 68.7500 |\n| Kaolin | SQL | 56 | 65.2500 |\n| Kaolin | Tuning | 88 | 68.7500 |\n| Tatiana | SQL | 87 | 65.2500 |\n| Tatiana | Tuning | 83 | 68.7500 |\n+---------+--------+-------+-----------------+\n\nSELECT name, test, score, AVG(score) OVER (PARTITION BY name) \n AS average_by_name FROM student;\n+---------+--------+-------+-----------------+\n| name | test | score | average_by_name |\n+---------+--------+-------+-----------------+\n| Chun | SQL | 75 | 74.0000 |\n| Chun | Tuning | 73 | 74.0000 |\n| Esben | SQL | 43 | 37.0000 |\n| Esben | Tuning | 31 | 37.0000 |\n| Kaolin | SQL | 56 | 72.0000 |\n| Kaolin | Tuning | 88 | 72.0000 |\n| Tatiana | SQL | 87 | 85.0000 |\n| Tatiana | Tuning | 83 | 85.0000 |\n+---------+--------+-------+-----------------+\n\nIt is also possible to specify which rows to include for the window function\n(for example, the current row and all preceding rows). See Window Frames for\nmore details.\n\nScope\n-----\n\nWindow functions were introduced in SQL:2003, and their definition was\nexpanded in subsequent versions of the standard. The last expansion was in the\nlatest version of the standard, SQL:2011.\n\nMost database products support a subset of the standard, they implement some\nfunctions defined as late as in SQL:2011, and at the same time leave some\nparts of SQL:2008 unimplemented.\n\nMariaDB:\n\n* Supports ROWS and RANGE-type frames\nAll kinds of frame bounds are supported, including RANGE PRECEDING|FOLLOWING n\nframe bounds (unlike PostgreSQL or MS SQL Server)\nDoes not yet support DATE[TIME] datatype and arithmetic for RANGE-type frames\n(MDEV-9727)\n\n* Does not support GROUPS-type frames (it seems that no popular database\nsupports it, either)\n\n* Does not support frame exclusion (no other database seems to support it,\neither) (MDEV-9724)\n* Does not support explicit NULLS FIRST or NULLS LAST.\n* Does not support nested navigation in window functions (this is\nVALUE_OF(expr AT row_marker [, default_value) syntax)\n\n* The following window functions are supported:\n\"Streamable\" window functions: ROW_NUMBER, RANK, DENSE_RANK, \nWindow functions that can be streamed once the number of rows in partition is\nknown: PERCENT_RANK, CUME_DIST, NTILE\n\n* Aggregate functions that are currently supported as window functions are:\nCOUNT, SUM, AVG, BIT_OR, BIT_AND, BIT_XOR.\n* Aggregate functions with the DISTINCT specifier (e.g. COUNT( DISTINCT x))\nare not supported as window functions.\n\nLinks\n-----\n\n* MDEV-6115 is the main jira task for window functions development. Other\ntasks are are attached as sub-tasks\n* bb-10.2-mdev9543 is the feature tree for window functions. Development is\nongoing, and this tree has the newest changes.\n* Testcases are in mysql-test/t/win*.test\n\nExamples\n--------\n\nGiven the following sample data:\n\nCREATE TABLE users (\n email VARCHAR(30),\n first_name VARCHAR(30),\n last_name VARCHAR(30),\n account_type VARCHAR(30)\n);\n\nINSERT INTO users VALUES \n (\'admin@boss.org\', \'Admin\', \'Boss\', \'admin\'),\n (\'bob.carlsen@foo.bar\', \'Bob\', \'Carlsen\', \'regular\'),\n (\'eddie.stevens@data.org\', \'Eddie\', \'Stevens\', \'regular\'),\n (\'john.smith@xyz.org\', \'John\', \'Smith\', \'regular\'),\n (\'root@boss.org\', \'Root\', \'Chief\', \'admin\')\n\nFirst, let\'s order the records by email alphabetically, giving each an\nascending rnum value starting with 1. This will make use of the ROW_NUMBER\nwindow function:\n\nSELECT row_number() OVER (ORDER BY email) AS rnum,\n email, first_name, last_name, account_type\nFROM users ORDER BY email;\n+------+------------------------+------------+-----------+--------------+\n| rnum | email | first_name | last_name | account_type |\n+------+------------------------+------------+-----------+--------------+\n| 1 | admin@boss.org | Admin | Boss | admin |\n| 2 | bob.carlsen@foo.bar | Bob | Carlsen | regular |\n| 3 | eddie.stevens@data.org | Eddie | Stevens | regular |\n| 4 | john.smith@xyz.org | John | Smith | regular |\n| 5 | root@boss.org | Root | Chief | admin |\n+------+------------------------+------------+-----------+--------------\n\nWe can generate separate sequences based on account type, using the PARTITION\nBY clause:\n\nSELECT row_number() OVER (PARTITION BY account_type ORDER BY email) AS rnum, \n email, first_name, last_name, account_type\nFROM users ORDER BY account_type,email;\n+------+------------------------+------------+-----------+--------------+\n| rnum | email | first_name | last_name | account_type |\n+------+------------------------+------------+-----------+--------------+\n| 1 | admin@boss.org | Admin | Boss | admin |\n| 2 | root@boss.org | Root | Chief | admin |\n| 1 | bob.carlsen@foo.bar | Bob | Carlsen | regular |\n| 2 | eddie.stevens@data.org | Eddie | Stevens | regular |\n| 3 | john.smith@xyz.org | John | Smith | regular |\n+------+------------------------+------------+-----------+--------------+\n\nGiven the following structure and data, we want to find the top 5 salaries\nfrom each department.\n\nCREATE TABLE employee_salaries (dept VARCHAR(20), name VARCHAR(20), salary\nINT(11));\n\nINSERT INTO employee_salaries VALUES\n(\'Engineering\', \'Dharma\', 3500),\n(\'Engineering\', \'Binh\', 3000),\n(\'Engineering\', \'Adalynn\', 2800),\n(\'Engineering\', \'Samuel\', 2500),\n(\'Engineering\', \'Cveta\', 2200),\n(\'Engineering\', \'Ebele\', 1800),\n(\'Sales\', \'Carbry\', 500),\n(\'Sales\', \'Clytemnestra\', 400),\n(\'Sales\', \'Juraj\', 300),\n(\'Sales\', \'Kalpana\', 300),\n(\'Sales\', \'Svantepolk\', 250),\n(\'Sales\', \'Angelo\', 200);\n\nWe could do this without using window functions, as follows:\n\nselect dept, name, salary\nfrom employee_salaries as t1\nwhere (select count(t2.salary)\n from employee_salaries as t2\n where t1.name != t2.name and\n t1.dept = t2.dept and\n t2.salary > t1.salary) < 5\norder by dept, salary desc;\n\n+-------------+--------------+--------+\n| dept | name | salary |\n+-------------+--------------+--------+\n| Engineering | Dharma | 3500 |\n| Engineering | Binh | 3000 |\n| Engineering | Adalynn | 2800 |\n| Engineering | Samuel | 2500 |\n| Engineering | Cveta | 2200 |\n| Sales | Carbry | 500 |\n| Sales | Clytemnestra | 400 |\n| Sales | Juraj | 300 |\n| Sales | Kalpana | 300 |\n| Sales | Svantepolk | 250 |\n+-------------+--------------+--------+\n\nThis has a number of disadvantages:\n\n* if there is no index, the query could take a long time if the\nemployee_salary_table is large\n* Adding and maintaining indexes adds overhead, and even with indexes on dept\nand salary, each subquery execution adds overhead by performing a lookup\nthrough the index.\n\nLet\'s try achieve the same with window functions. First, generate a rank for\nall employees, using the RANK function.\n\nselect rank() over (partition by dept order by salary desc) as ranking,\n dept, name, salary\n from employee_salaries\n order by dept, ranking;\n+---------+-------------+--------------+--------+\n| ranking | dept | name | salary |\n+---------+-------------+--------------+--------+\n| 1 | Engineering | Dharma | 3500 |\n| 2 | Engineering | Binh | 3000 |\n| 3 | Engineering | Adalynn | 2800 |\n| 4 | Engineering | Samuel | 2500 |\n| 5 | Engineering | Cveta | 2200 |\n| 6 | Engineering | Ebele | 1800 |\n| 1 | Sales | Carbry | 500 |\n| 2 | Sales | Clytemnestra | 400 |\n| 3 | Sales | Juraj | 300 |\n| 3 | Sales | Kalpana | 300 |\n| 5 | Sales | Svantepolk | 250 |\n| 6 | Sales | Angelo | 200 |\n+---------+-------------+--------------+--------+\n\nEach department has a separate sequence of ranks due to the PARTITION BY\nclause. This particular sequence of values for rank() is given by the ORDER BY\nclause inside the window function’s OVER clause. Finally, to get our results\nin a readable format we order the data by dept and the newly generated ranking\ncolumn.\n\nNow, we need to reduce the results to find only the top 5 per department. Here\nis a common mistake:\n\nselect\nrank() over (partition by dept order by salary desc) as ranking,\ndept, name, salary\nfrom employee_salaries\nwhere ranking <= 5\norder by dept, ranking;\n\nERROR 1054 (42S22): Unknown column \'ranking\' in \'where clause\'\n\nTrying to filter only the first 5 values per department by putting a where\nclause in the statement does not work, due to the way window functions are\ncomputed. The computation of window functions happens after all WHERE, GROUP\nBY and HAVING clauses have been completed, right before ORDER BY, so the WHERE\nclause has no idea that the ranking column exists. It is only present after we\nhave filtered and grouped all the rows.\n\nTo counteract this problem, we need to wrap our query into a derived table. We\ncan then attach a where clause to it:\n\nselect *from (select rank() over (partition by dept order by salary desc) as\nranking,\n dept, name, salary\nfrom employee_salaries) as salary_ranks\nwhere (salary_ranks.ranking <= 5)\n order by dept, ranking;\n+---------+-------------+--------------+--------+\n| ranking | dept | name | salary |\n+---------+-------------+--------------+--------+\n| 1 | Engineering | Dharma | 3500 |\n| 2 | Engineering | Binh | 3000 |\n| 3 | Engineering | Adalynn | 2800 |\n| 4 | Engineering | Samuel | 2500 |\n| 5 | Engineering | Cveta | 2200 |\n| 1 | Sales | Carbry | 500 |\n| 2 | Sales | Clytemnestra | 400 |\n| 3 | Sales | Juraj | 300 |\n| 3 | Sales | Kalpana | 300 |\n| 5 | Sales | Svantepolk | 250 |\n+---------+-------------+--------------+--------+\n\nURL: https://mariadb.com/kb/en/window-functions-overview/','','https://mariadb.com/kb/en/window-functions-overview/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (772,41,'CUME_DIST','Syntax\n------\n\nCUME_DIST() OVER ( \n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nCUME_DIST() is a window function that returns the cumulative distribution of a\ngiven row. The following formula is used to calculate the value:\n\n(number of rows <= current row) / (total rows)\n\nExamples\n--------\n\ncreate table t1 (\n pk int primary key,\n a int,\n b int\n);\n\ninsert into t1 values\n( 1 , 0, 10),\n( 2 , 0, 10),\n( 3 , 1, 10),\n( 4 , 1, 10),\n( 8 , 2, 10),\n( 5 , 2, 20),\n( 6 , 2, 20),\n( 7 , 2, 20),\n( 9 , 4, 20),\n(10 , 4, 20);\n\nselect pk, a, b,\n rank() over (order by a) as rank,\n percent_rank() over (order by a) as pct_rank,\n cume_dist() over (order by a) as cume_dist\nfrom t1;\n+----+------+------+------+--------------+--------------+\n| pk | a | b | rank | pct_rank | cume_dist |\n+----+------+------+------+--------------+--------------+\n| 1 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 2 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 3 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 4 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 5 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 6 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 7 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 8 | 2 | 10 | 5 | 0.4444444444 | 0.8000000000 |\n| 9 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n| 10 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n+----+------+------+------+--------------+--------------+\n\nselect pk, a, b,\n percent_rank() over (order by pk) as pct_rank,\n cume_dist() over (order by pk) as cume_dist\nfrom t1 order by pk;\n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 0.1000000000 |\n| 2 | 0 | 10 | 0.1111111111 | 0.2000000000 |\n| 3 | 1 | 10 | 0.2222222222 | 0.3000000000 |\n| 4 | 1 | 10 | 0.3333333333 | 0.4000000000 |\n| 5 | 2 | 20 | 0.4444444444 | 0.5000000000 |\n| 6 | 2 | 20 | 0.5555555556 | 0.6000000000 |\n| 7 | 2 | 20 | 0.6666666667 | 0.7000000000 |\n| 8 | 2 | 10 | 0.7777777778 | 0.8000000000 |\n| 9 | 4 | 20 | 0.8888888889 | 0.9000000000 |\n| 10 | 4 | 20 | 1.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n\nselect pk, a, b,\n percent_rank() over (partition by a order by a) as pct_rank,\n cume_dist() over (partition by a order by a) as cume_dist\nfrom t1;\n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 2 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 3 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 4 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 5 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 6 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 7 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 8 | 2 | 10 | 0.0000000000 | 1.0000000000 |\n| 9 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n| 10 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n\nURL: https://mariadb.com/kb/en/cume_dist/','','https://mariadb.com/kb/en/cume_dist/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (773,41,'DENSE_RANK','Syntax\n------\n\nDENSE_RANK() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nDENSE_RANK() is a window function that displays the number of a given row,\nstarting at one and following the ORDER BY sequence of the window function,\nwith identical values receiving the same result. Unlike the RANK() function,\nthere are no skipped values if the preceding results are identical. It is also\nsimilar to the ROW_NUMBER() function except that in that function, identical\nvalues will receive a different row number for each result.\n\nExamples\n--------\n\nThe distinction between DENSE_RANK(), RANK() and ROW_NUMBER():\n\nCREATE TABLE student(course VARCHAR(10), mark int, name varchar(10));\n\nINSERT INTO student VALUES \n (\'Maths\', 60, \'Thulile\'),\n (\'Maths\', 60, \'Pritha\'),\n (\'Maths\', 70, \'Voitto\'),\n (\'Maths\', 55, \'Chun\'),\n (\'Biology\', 60, \'Bilal\'),\n (\'Biology\', 70, \'Roger\');\n\nSELECT \n RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS rank,\n DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS dense_rank,\n ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC) AS row_num,\n course, mark, name\nFROM student ORDER BY course, mark DESC;\n+------+------------+---------+---------+------+---------+\n| rank | dense_rank | row_num | course | mark | name |\n+------+------------+---------+---------+------+---------+\n| 1 | 1 | 1 | Biology | 70 | Roger |\n| 2 | 2 | 2 | Biology | 60 | Bilal |\n| 1 | 1 | 1 | Maths | 70 | Voitto |\n| 2 | 2 | 2 | Maths | 60 | Thulile |\n| 2 | 2 | 3 | Maths | 60 | Pritha |\n| 4 | 3 | 4 | Maths | 55 | Chun |\n+------+------------+---------+---------+------+---------+\n\nURL: https://mariadb.com/kb/en/dense_rank/','','https://mariadb.com/kb/en/dense_rank/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (774,41,'FIRST_VALUE','Syntax\n------\n\nFIRST_VALUE(expr) OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nFIRST_VALUE returns the first result from an ordered set, or NULL if no such\nresult exists.\n\nExamples\n--------\n\nCREATE TABLE t1 (\n pk int primary key,\n a int,\n b int,\n c char(10),\n d decimal(10, 3),\n e real\n);\n\nINSERT INTO t1 VALUES\n( 1, 0, 1, \'one\', 0.1, 0.001),\n( 2, 0, 2, \'two\', 0.2, 0.002),\n( 3, 0, 3, \'three\', 0.3, 0.003),\n( 4, 1, 2, \'three\', 0.4, 0.004),\n( 5, 1, 1, \'two\', 0.5, 0.005),\n( 6, 1, 1, \'one\', 0.6, 0.006),\n( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n( 8, 2, 1, \'n_two\', NULL, 0.008),\n( 9, 2, 2, NULL, 0.7, 0.009),\n(10, 2, 0, \'n_four\', 0.8, 0.010),\n(11, 2, 10, NULL, 0.9, NULL);\n\nSELECT pk, FIRST_VALUE(pk) OVER (ORDER BY pk) AS first_asc,\n LAST_VALUE(pk) OVER (ORDER BY pk) AS last_asc,\n FIRST_VALUE(pk) OVER (ORDER BY pk DESC) AS first_desc,\n LAST_VALUE(pk) OVER (ORDER BY pk DESC) AS last_desc\nFROM t1\nORDER BY pk DESC;\n\n+----+-----------+----------+------------+-----------+\n| pk | first_asc | last_asc | first_desc | last_desc |\n+----+-----------+----------+------------+-----------+\n| 11 | 1 | 11 | 11 | 11 |\n| 10 | 1 | 10 | 11 | 10 |\n| 9 | 1 | 9 | 11 | 9 |\n| 8 | 1 | 8 | 11 | 8 |\n| 7 | 1 | 7 | 11 | 7 |\n| 6 | 1 | 6 | 11 | 6 |\n| 5 | 1 | 5 | 11 | 5 |\n| 4 | 1 | 4 | 11 | 4 |\n| 3 | 1 | 3 | 11 | 3 |\n| 2 | 1 | 2 | 11 | 2 |\n| 1 | 1 | 1 | 11 | 1 |\n+----+-----------+----------+------------+-----------+\n\nCREATE OR REPLACE TABLE t1 (i int);\nINSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);\n\nSELECT i,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and 1 FOLLOWING) AS\nf_1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and 1 FOLLOWING) AS\nl_1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\nf_1p1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\nf_1p1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) AS\nf_2p1p,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) AS\nf_2p1p,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING) AS\nf_1f2f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING) AS\nf_1f2f\nFROM t1;\n\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| i | f_1f | l_1f | f_1p1f | f_1p1f | f_2p1p | f_2p1p | f_1f2f | f_1f2f |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| 1 | 1 | 2 | 1 | 2 | NULL | NULL | 2 | 3 |\n| 2 | 2 | 3 | 1 | 3 | 1 | 1 | 3 | 4 |\n| 3 | 3 | 4 | 2 | 4 | 1 | 2 | 4 | 5 |\n| 4 | 4 | 5 | 3 | 5 | 2 | 3 | 5 | 6 |\n| 5 | 5 | 6 | 4 | 6 | 3 | 4 | 6 | 7 |\n| 6 | 6 | 7 | 5 | 7 | 4 | 5 | 7 | 8 |\n| 7 | 7 | 8 | 6 | 8 | 5 | 6 | 8 | 9 |\n| 8 | 8 | 9 | 7 | 9 | 6 | 7 | 9 | 10 |\n| 9 | 9 | 10 | 8 | 10 | 7 | 8 | 10 | 10 |\n| 10 | 10 | 10 | 9 | 10 | 8 | 9 | NULL | NULL |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n\nURL: https://mariadb.com/kb/en/first_value/','','https://mariadb.com/kb/en/first_value/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (775,41,'LAG','Syntax\n------\n\nLAG (expr[, offset]) OVER ( \n [ PARTITION BY partition_expression ]\n < ORDER BY order_list >\n)\n\nDescription\n-----------\n\nThe LAG function accesses data from a previous row according to the ORDER BY\nclause without the need for a self-join. The specific row is determined by the\noffset (default 1), which specifies the number of rows behind the current row\nto use. An offset of 0 is the current row.\n\nExamples\n--------\n\nCREATE TABLE t1 (pk int primary key, a int, b int, c char(10), d decimal(10,\n3), e real);\n\nINSERT INTO t1 VALUES\n ( 1, 0, 1, \'one\', 0.1, 0.001),\n ( 2, 0, 2, \'two\', 0.2, 0.002),\n ( 3, 0, 3, \'three\', 0.3, 0.003),\n ( 4, 1, 2, \'three\', 0.4, 0.004),\n ( 5, 1, 1, \'two\', 0.5, 0.005),\n ( 6, 1, 1, \'one\', 0.6, 0.006),\n ( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n ( 8, 2, 1, \'n_two\', NULL, 0.008),\n ( 9, 2, 2, NULL, 0.7, 0.009),\n (10, 2, 0, \'n_four\', 0.8, 0.010),\n (11, 2, 10, NULL, 0.9, NULL);\n\nSELECT pk, LAG(pk) OVER (ORDER BY pk) AS l,\n LAG(pk,1) OVER (ORDER BY pk) AS l1,\n LAG(pk,2) OVER (ORDER BY pk) AS l2,\n LAG(pk,0) OVER (ORDER BY pk) AS l0,\n LAG(pk,-1) OVER (ORDER BY pk) AS lm1,\n LAG(pk,-2) OVER (ORDER BY pk) AS lm2\nFROM t1;\n+----+------+------+------+------+------+------+\n| pk | l | l1 | l2 | l0 | lm1 | lm2 |\n+----+------+------+------+------+------+------+\n| 1 | NULL | NULL | NULL | 1 | 2 | 3 |\n| 2 | 1 | 1 | NULL | 2 | 3 | 4 |\n| 3 | 2 | 2 | 1 | 3 | 4 | 5 |\n| 4 | 3 | 3 | 2 | 4 | 5 | 6 |\n| 5 | 4 | 4 | 3 | 5 | 6 | 7 |\n| 6 | 5 | 5 | 4 | 6 | 7 | 8 |\n| 7 | 6 | 6 | 5 | 7 | 8 | 9 |\n| 8 | 7 | 7 | 6 | 8 | 9 | 10 |\n| 9 | 8 | 8 | 7 | 9 | 10 | 11 |\n| 10 | 9 | 9 | 8 | 10 | 11 | NULL |\n| 11 | 10 | 10 | 9 | 11 | NULL | NULL |\n+----+------+------+------+------+------+------+\n\nURL: https://mariadb.com/kb/en/lag/','','https://mariadb.com/kb/en/lag/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (776,41,'LEAD','Syntax\n------\n\nLEAD (expr[, offset]) OVER ( \n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nThe LEAD function accesses data from a following row in the same result set\nwithout the need for a self-join. The specific row is determined by the offset\n(default 1), which specifies the number of rows ahead the current row to use.\nAn offset of 0 is the current row.\n\nExample\n-------\n\nCREATE TABLE t1 (pk int primary key, a int, b int, c char(10), d decimal(10,\n3), e real);\n\nINSERT INTO t1 VALUES\n ( 1, 0, 1, \'one\', 0.1, 0.001),\n ( 2, 0, 2, \'two\', 0.2, 0.002),\n ( 3, 0, 3, \'three\', 0.3, 0.003),\n ( 4, 1, 2, \'three\', 0.4, 0.004),\n ( 5, 1, 1, \'two\', 0.5, 0.005),\n ( 6, 1, 1, \'one\', 0.6, 0.006),\n ( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n ( 8, 2, 1, \'n_two\', NULL, 0.008),\n ( 9, 2, 2, NULL, 0.7, 0.009),\n (10, 2, 0, \'n_four\', 0.8, 0.010),\n (11, 2, 10, NULL, 0.9, NULL);\n\nSELECT pk, LEAD(pk) OVER (ORDER BY pk) AS l,\n LEAD(pk,1) OVER (ORDER BY pk) AS l1,\n LEAD(pk,2) OVER (ORDER BY pk) AS l2,\n LEAD(pk,0) OVER (ORDER BY pk) AS l0,\n LEAD(pk,-1) OVER (ORDER BY pk) AS lm1,\n LEAD(pk,-2) OVER (ORDER BY pk) AS lm2\nFROM t1;\n+----+------+------+------+------+------+------+\n| pk | l | l1 | l2 | l0 | lm1 | lm2 |\n+----+------+------+------+------+------+------+\n| 1 | 2 | 2 | 3 | 1 | NULL | NULL |\n| 2 | 3 | 3 | 4 | 2 | 1 | NULL |\n| 3 | 4 | 4 | 5 | 3 | 2 | 1 |\n| 4 | 5 | 5 | 6 | 4 | 3 | 2 |\n| 5 | 6 | 6 | 7 | 5 | 4 | 3 |\n| 6 | 7 | 7 | 8 | 6 | 5 | 4 |\n| 7 | 8 | 8 | 9 | 7 | 6 | 5 |\n| 8 | 9 | 9 | 10 | 8 | 7 | 6 |\n| 9 | 10 | 10 | 11 | 9 | 8 | 7 |\n| 10 | 11 | 11 | NULL | 10 | 9 | 8 |\n| 11 | NULL | NULL | NULL | 11 | 10 | 9 |\n+----+------+------+------+------+------+------+\n\nURL: https://mariadb.com/kb/en/lead/','','https://mariadb.com/kb/en/lead/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (777,41,'Median Window Function','MariaDB starting with 10.3.3\n----------------------------\nThe MEDIAN() window function was first introduced with in MariaDB 10.3.3.\n\nSyntax\n------\n\nMEDIAN(median expression) OVER (\n [ PARTITION BY partition_expression ]\n)\n\nDescription\n-----------\n\nMEDIAN() is a window function that returns the median value of a range of\nvalues.\n\nIt is a specific case of PERCENTILE_CONT, with an argument of 0.5 and the\nORDER BY column the one in MEDIAN\'s argument.\n\nMEDIAN(<median-arg>) OVER ( [ PARTITION BY partition_expression] )\n\nIs equivalent to:\n\nPERCENTILE_CONT(0.5) WITHIN \n GROUP (ORDER BY <median-arg>) OVER ( [ PARTITION BY partition_expression ])\n\nExamples\n--------\n\nCREATE TABLE book_rating (name CHAR(30), star_rating TINYINT);\n\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 5);\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 3);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 1);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 2);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 5);\n\nSELECT name, median(star_rating) OVER (PARTITION BY name) FROM book_rating;\n+-----------------------+----------------------------------------------+\n| name | median(star_rating) OVER (PARTITION BY name) |\n+-----------------------+----------------------------------------------+\n| Lord of the Ladybirds | 4.0000000000 |\n| Lord of the Ladybirds | 4.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n+-----------------------+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/median/','','https://mariadb.com/kb/en/median/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (778,41,'NTH_VALUE','Syntax\n------\n\nNTH_VALUE (expr[, num_row]) OVER ( \n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nThe NTH_VALUE function returns the value evaluated at row number num_row of\nthe window frame, starting from 1, or NULL if the row does not exist.\n\nURL: https://mariadb.com/kb/en/nth_value/','','https://mariadb.com/kb/en/nth_value/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (779,41,'NTILE','Syntax\n------\n\nNTILE (expr) OVER ( \n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nNTILE() is a window function that returns an integer indicating which group a\ngiven row falls into. The number of groups is specified in the argument\n(expr), starting at one. Ordered rows in the partition are divided into the\nspecified number of groups with as equal a size as possible.\n\nExamples\n--------\n\ncreate table t1 (\n pk int primary key,\n a int,\n b int\n );\n\ninsert into t1 values\n (11 , 0, 10),\n (12 , 0, 10),\n (13 , 1, 10),\n (14 , 1, 10),\n (18 , 2, 10),\n (15 , 2, 20),\n (16 , 2, 20),\n (17 , 2, 20),\n (19 , 4, 20),\n (20 , 4, 20);\n\nselect pk, a, b,\n ntile(1) over (order by pk)\n from t1;\n+----+------+------+-----------------------------+\n| pk | a | b | ntile(1) over (order by pk) |\n+----+------+------+-----------------------------+\n| 11 | 0 | 10 | 1 |\n| 12 | 0 | 10 | 1 |\n| 13 | 1 | 10 | 1 |\n| 14 | 1 | 10 | 1 |\n| 15 | 2 | 20 | 1 |\n| 16 | 2 | 20 | 1 |\n| 17 | 2 | 20 | 1 |\n| 18 | 2 | 10 | 1 |\n| 19 | 4 | 20 | 1 |\n| 20 | 4 | 20 | 1 |\n+----+------+------+-----------------------------+\n\nselect pk, a, b,\n ntile(4) over (order by pk)\n from t1;\n+----+------+------+-----------------------------+\n| pk | a | b | ntile(4) over (order by pk) |\n+----+------+------+-----------------------------+\n| 11 | 0 | 10 | 1 |\n| 12 | 0 | 10 | 1 |\n| 13 | 1 | 10 | 1 |\n| 14 | 1 | 10 | 2 |\n| 15 | 2 | 20 | 2 |\n| 16 | 2 | 20 | 2 |\n| 17 | 2 | 20 | 3 |\n| 18 | 2 | 10 | 3 |\n| 19 | 4 | 20 | 4 |\n| 20 | 4 | 20 | 4 |\n+----+------+------+-----------------------------+\n\nURL: https://mariadb.com/kb/en/ntile/','','https://mariadb.com/kb/en/ntile/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (780,41,'PERCENT_RANK','Syntax\n------\n\nPERCENT_RANK() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nPERCENT_RANK() is a window function that returns the relative percent rank of\na given row. The following formula is used to calculate the percent rank:\n\n(rank - 1) / (number of rows in the window or partition - 1)\n\nExamples\n--------\n\ncreate table t1 (\n pk int primary key,\n a int,\n b int\n);\n\ninsert into t1 values\n( 1 , 0, 10),\n( 2 , 0, 10),\n( 3 , 1, 10),\n( 4 , 1, 10),\n( 8 , 2, 10),\n( 5 , 2, 20),\n( 6 , 2, 20),\n( 7 , 2, 20),\n( 9 , 4, 20),\n(10 , 4, 20);\n\nselect pk, a, b,\n rank() over (order by a) as rank,\n percent_rank() over (order by a) as pct_rank,\n cume_dist() over (order by a) as cume_dist\nfrom t1;\n+----+------+------+------+--------------+--------------+\n| pk | a | b | rank | pct_rank | cume_dist |\n+----+------+------+------+--------------+--------------+\n| 1 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 2 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 3 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 4 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 5 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 6 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 7 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 8 | 2 | 10 | 5 | 0.4444444444 | 0.8000000000 |\n| 9 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n| 10 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n+----+------+------+------+--------------+--------------+\n\nselect pk, a, b,\n percent_rank() over (order by pk) as pct_rank,\n cume_dist() over (order by pk) as cume_dist\nfrom t1 order by pk;\n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 0.1000000000 |\n| 2 | 0 | 10 | 0.1111111111 | 0.2000000000 |\n| 3 | 1 | 10 | 0.2222222222 | 0.3000000000 |\n| 4 | 1 | 10 | 0.3333333333 | 0.4000000000 |\n| 5 | 2 | 20 | 0.4444444444 | 0.5000000000 |\n| 6 | 2 | 20 | 0.5555555556 | 0.6000000000 |\n| 7 | 2 | 20 | 0.6666666667 | 0.7000000000 |\n| 8 | 2 | 10 | 0.7777777778 | 0.8000000000 |\n| 9 | 4 | 20 | 0.8888888889 | 0.9000000000 |\n| 10 | 4 | 20 | 1.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n\nselect pk, a, b,\n percent_rank() over (partition by a order by a) as pct_rank,\n cume_dist() over (partition by a order by a) as cume_dist\nfrom t1;\n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 2 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 3 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 4 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 5 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 6 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 7 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 8 | 2 | 10 | 0.0000000000 | 1.0000000000 |\n| 9 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n| 10 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n\nURL: https://mariadb.com/kb/en/percent_rank/','','https://mariadb.com/kb/en/percent_rank/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (781,41,'PERCENTILE_CONT','MariaDB starting with 10.3.3\n----------------------------\nThe PERCENTILE_CONT() window function was first introduced with in MariaDB\n10.3.3.\n\nSyntax\n------\n\nDescription\n-----------\n\nPERCENTILE_CONT() (standing for continuous percentile) is a window function\nwhich returns a value which corresponds to the given fraction in the sort\norder. If required, it will interpolate between adjacent input items.\n\nEssentially, the following process is followed to find the value to return:\n\n* Get the number of rows in the partition, denoted by N\n* RN = p*(N-1), where p denotes the argument to the PERCENTILE_CONT function\n* calculate the FRN(floor row number) and CRN(column row number for the group(\nFRN= floor(RN) and CRN = ceil(RN))\n* look up rows FRN and CRN\n* If (CRN = FRN = RN) then the result is (value of expression from row at RN)\n* Otherwise the result is\n* (CRN - RN) * (value of expression for row at FRN) +\n* (RN - FRN) * (value of expression for row at CRN)\n\nThe MEDIAN function is a specific case of PERCENTILE_CONT, equivalent to\nPERCENTILE_CONT(0.5).\n\nExamples\n--------\n\nCREATE TABLE book_rating (name CHAR(30), star_rating TINYINT);\n\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 5);\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 3);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 1);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 2);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 5);\n\nSELECT name, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc\n FROM book_rating;\n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 4.0000000000 |\n| Lord of the Ladybirds | 4.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n+-----------------------+--------------+\n\nSELECT name, PERCENTILE_CONT(1) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc\n FROM book_rating;\n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 5.0000000000 |\n| Lord of the Ladybirds | 5.0000000000 |\n| Lady of the Flies | 5.0000000000 |\n| Lady of the Flies | 5.0000000000 |\n| Lady of the Flies | 5.0000000000 |\n+-----------------------+--------------+\n\nSELECT name, PERCENTILE_CONT(0) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc\n FROM book_rating;\n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 3.0000000000 |\n| Lord of the Ladybirds | 3.0000000000 |\n| Lady of the Flies | 1.0000000000 |\n| Lady of the Flies | 1.0000000000 |\n| Lady of the Flies | 1.0000000000 |\n+-----------------------+--------------+\n\nSELECT name, PERCENTILE_CONT(0.6) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc\n FROM book_rating;\n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 4.2000000000 |\n| Lord of the Ladybirds | 4.2000000000 |\n| Lady of the Flies | 2.6000000000 |\n| Lady of the Flies | 2.6000000000 |\n| Lady of the Flies | 2.6000000000 |\n+-----------------------+--------------+\n\nURL: https://mariadb.com/kb/en/percentile_cont/','','https://mariadb.com/kb/en/percentile_cont/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (782,41,'PERCENTILE_DISC','MariaDB starting with 10.3.3\n----------------------------\nThe PERCENTILE_DISC() window function was first introduced with in MariaDB\n10.3.3.\n\nSyntax\n------\n\nDescription\n-----------\n\nPERCENTILE_DISC() (standing for discrete percentile) is a window function\nwhich returns the first value in the set whose ordered position is the same or\nmore than the specified fraction.\n\nEssentially, the following process is followed to find the value to return:\n\n* Get the number of rows in the partition.\n* Walk through the partition, in order, until finding the the first row with\nCUME_DIST() >= function_argument.\n\nExamples\n--------\n\nCREATE TABLE book_rating (name CHAR(30), star_rating TINYINT);\n\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 5);\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 3);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 1);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 2);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 5);\n\nSELECT name, PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY star_rating)\n OVER (PARTITION BY name) AS pc FROM book_rating;\n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 3 |\n| Lord of the Ladybirds | 3 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n+-----------------------+------+\n5 rows in set (0.000 sec)\n\nSELECT name, PERCENTILE_DISC(0) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc FROM book_rating;\n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 3 |\n| Lord of the Ladybirds | 3 |\n| Lady of the Flies | 1 |\n| Lady of the Flies | 1 |\n| Lady of the Flies | 1 |\n+-----------------------+------+\n5 rows in set (0.000 sec)\n\nSELECT name, PERCENTILE_DISC(1) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc FROM book_rating;\n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 5 |\n| Lord of the Ladybirds | 5 |\n| Lady of the Flies | 5 |\n| Lady of the Flies | 5 |\n| Lady of the Flies | 5 |\n+-----------------------+------+\n5 rows in set (0.000 sec)\n\nSELECT name, PERCENTILE_DISC(0.6) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc FROM book_rating;\n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 5 |\n| Lord of the Ladybirds | 5 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n+-----------------------+------\n\nURL: https://mariadb.com/kb/en/percentile_disc/','','https://mariadb.com/kb/en/percentile_disc/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (783,41,'RANK','Syntax\n------\n\nRANK() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nRANK() is a window function that displays the number of a given row, starting\nat one and following the ORDER BY sequence of the window function, with\nidentical values receiving the same result. It is similar to the ROW_NUMBER()\nfunction except that in that function, identical values will receive a\ndifferent row number for each result.\n\nExamples\n--------\n\nThe distinction between DENSE_RANK(), RANK() and ROW_NUMBER():\n\nCREATE TABLE student(course VARCHAR(10), mark int, name varchar(10));\n\nINSERT INTO student VALUES \n (\'Maths\', 60, \'Thulile\'),\n (\'Maths\', 60, \'Pritha\'),\n (\'Maths\', 70, \'Voitto\'),\n (\'Maths\', 55, \'Chun\'),\n (\'Biology\', 60, \'Bilal\'),\n (\'Biology\', 70, \'Roger\');\n\nSELECT \n RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS rank,\n DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS dense_rank,\n ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC) AS row_num,\n course, mark, name\nFROM student ORDER BY course, mark DESC;\n+------+------------+---------+---------+------+---------+\n| rank | dense_rank | row_num | course | mark | name |\n+------+------------+---------+---------+------+---------+\n| 1 | 1 | 1 | Biology | 70 | Roger |\n| 2 | 2 | 2 | Biology | 60 | Bilal |\n| 1 | 1 | 1 | Maths | 70 | Voitto |\n| 2 | 2 | 2 | Maths | 60 | Thulile |\n| 2 | 2 | 3 | Maths | 60 | Pritha |\n| 4 | 3 | 4 | Maths | 55 | Chun |\n+------+------------+---------+---------+------+---------+\n\nURL: https://mariadb.com/kb/en/rank/','','https://mariadb.com/kb/en/rank/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (784,41,'ROW_NUMBER','Syntax\n------\n\nROW_NUMBER() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nROW_NUMBER() is a window function that displays the number of a given row,\nstarting at one and following the ORDER BY sequence of the window function,\nwith identical values receiving different row numbers. It is similar to the\nRANK() and DENSE_RANK() functions except that in that function, identical\nvalues will receive the same rank for each result.\n\nExamples\n--------\n\nThe distinction between DENSE_RANK(), RANK() and ROW_NUMBER():\n\nCREATE TABLE student(course VARCHAR(10), mark int, name varchar(10));\n\nINSERT INTO student VALUES \n (\'Maths\', 60, \'Thulile\'),\n (\'Maths\', 60, \'Pritha\'),\n (\'Maths\', 70, \'Voitto\'),\n (\'Maths\', 55, \'Chun\'),\n (\'Biology\', 60, \'Bilal\'),\n (\'Biology\', 70, \'Roger\');\n\nSELECT \n RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS rank,\n DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS dense_rank,\n ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC) AS row_num,\n course, mark, name\nFROM student ORDER BY course, mark DESC;\n+------+------------+---------+---------+------+---------+\n| rank | dense_rank | row_num | course | mark | name |\n+------+------------+---------+---------+------+---------+\n| 1 | 1 | 1 | Biology | 70 | Roger |\n| 2 | 2 | 2 | Biology | 60 | Bilal |\n| 1 | 1 | 1 | Maths | 70 | Voitto |\n| 2 | 2 | 2 | Maths | 60 | Thulile |\n| 2 | 2 | 3 | Maths | 60 | Pritha |\n| 4 | 3 | 4 | Maths | 55 | Chun |\n+------+------------+---------+---------+------+---------+\n\nURL: https://mariadb.com/kb/en/row_number/','','https://mariadb.com/kb/en/row_number/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (785,41,'Aggregate Functions as Window Functions','It is possible to use aggregate functions as window functions. An aggregate\nfunction used as a window function must have the OVER clause. For example,\nhere\'s COUNT() used as a window function:\n\nselect COUNT(*) over (order by column) from table;\n\nMariaDB currently allows these aggregate functions to be used as window\nfunctions:\n\n* AVG\n* BIT_AND\n* BIT_OR\n* BIT_XOR\n* COUNT\n* JSON_ARRAYAGG\n* JSON_OBJECTAGG\n* MAX\n* MIN\n* STD\n* STDDEV\n* STDDEV_POP\n* STDDEV_SAMP\n* SUM\n* VAR_POP\n* VAR_SAMP\n* VARIANCE\n\nURL: https://mariadb.com/kb/en/aggregate-functions-as-window-functions/','','https://mariadb.com/kb/en/aggregate-functions-as-window-functions/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (786,41,'ColumnStore Window Functions','Introduction\n------------\n\nMariaDB ColumnStore provides support for window functions broadly following\nthe SQL 2003 specification. A window function allows for calculations relating\nto a window of data surrounding the current row in a result set. This\ncapability provides for simplified queries in support of common business\nquestions such as cumulative totals, rolling averages, and top 10 lists.\n\nAggregate functions are utilized for window functions however differ in\nbehavior from a group by query because the rows remain ungrouped. This\nprovides support for cumulative sums and rolling averages, for example.\n\nTwo key concepts for window functions are Partition and Frame:\n\n* A Partition is a group of rows, or window, that have the same value for a\nspecific column, for example a Partition can be created over a time period\nsuch as a quarter or lookup values.\n* The Frame for each row is a subset of the row\'s Partition. The frame\ntypically is dynamic allowing for a sliding frame of rows within the\nPartition. The Frame determines the range of rows for the windowing function.\nA Frame could be defined as the last X rows and next Y rows all the way up to\nthe entire Partition.\n\nWindow functions are applied after joins, group by, and having clauses are\ncalculated.\n\nSyntax\n------\n\nA window function is applied in the select clause using the following syntax:\n\nfunction_name ([expression [, expression ... ]]) OVER ( window_definition )\n\nwhere window_definition is defined as:\n\n[ PARTITION BY expression [, ...] ]\n[ ORDER BY expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ]\n[ frame_clause ]\n\nPARTITION BY:\n\n* Divides the window result set into groups based on one or more expressions.\n* An expression may be a constant, column, and non window function expressions.\n* A query is not limited to a single partition by clause. Different partition\nclauses can be used across different window function applications.\n* The partition by columns do not need to be in the select list but do need to\nbe available from the query result set.\n* If there is no PARTITION BY clause, all rows of the result set define the\ngroup.\n\nORDER BY\n\n* Defines the ordering of values within the partition.\n* Can be ordered by multiple keys which may be a constant, column or non\nwindow function expression.\n* The order by columns do not need to be in the select list but need to be\navailable from the query result set.\n* Use of a select column alias from the query is not supported.\n* ASC (default) and DESC options allow for ordering ascending or descending.\n* NULLS FIRST and NULL_LAST options specify whether null values come first or\nlast in the ordering sequence. NULLS_FIRST is the default for ASC order, and\nNULLS_LAST is the default for DESC order.\n\nand the optional frame_clause is defined as:\n\n{ RANGE | ROWS } frame_start\n{ RANGE | ROWS } BETWEEN frame_start AND frame_end\n\nand the optional frame_start and frame_end are defined as (value being a\nnumeric expression):\n\nUNBOUNDED PRECEDING\nvalue PRECEDING\nCURRENT ROW\nvalue FOLLOWING\nUNBOUNDED FOLLOWING\n\nRANGE/ROWS:\n\n* Defines the windowing clause for calculating the set of rows that the\nfunction applies to for calculating a given rows window function result.\n* Requires an ORDER BY clause to define the row order for the window.\n* ROWS specify the window in physical units, i.e. result set rows and must be\na constant or expression evaluating to a positive numeric value.\n* RANGE specifies the window as a logical offset. If the the expression\nevaluates to a numeric value then the ORDER BY expression must be a numeric or\nDATE type. If the expression evaluates to an interval value then the ORDER BY\nexpression must be a DATE data type.\n* UNBOUNDED PRECEDING indicates the window starts at the first row of the\npartition.\n* UNBOUNDED FOLLOWING indicates the window ends at the last row of the\npartition.\n* CURRENT ROW specifies the window start or ends at the current row or value.\n* If omitted, the default is ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.\n\nSupported Functions\n-------------------\n\n+--------------------------------+-------------------------------------------+\n| Function | Description |\n+--------------------------------+-------------------------------------------+\n| AVG() | The average of all input values. |\n+--------------------------------+-------------------------------------------+\n| COUNT() | Number of input rows. |\n+--------------------------------+-------------------------------------------+\n| CUME_DIST() | Calculates the cumulative distribution, |\n| | or relative rank, of the current row to |\n| | other rows in the same partition. Number |\n| | of peer or preceding rows / number of |\n| | rows in partition. |\n+--------------------------------+-------------------------------------------+\n| DENSE_RANK() | Ranks items in a group leaving no gaps |\n| | in ranking sequence when there are ties. |\n+--------------------------------+-------------------------------------------+\n| FIRST_VALUE() | The value evaluated at the row that is |\n| | the first row of the window frame |\n| | (counting from 1); null if no such row. |\n+--------------------------------+-------------------------------------------+\n| LAG() | The value evaluated at the row that is |\n| | offset rows before the current row |\n| | within the partition; if there is no |\n| | such row, instead return default. Both |\n| | offset and default are evaluated with |\n| | respect to the current row. If omitted, |\n| | offset defaults to 1 and default to |\n| | null. LAG provides access to more than |\n| | one row of a table at the same time |\n| | without a self-join. Given a series of |\n| | rows returned from a query and a |\n| | position of the cursor, LAG provides |\n| | access to a row at a given physical |\n| | offset prior to that position. |\n+--------------------------------+-------------------------------------------+\n| LAST_VALUE() | The value evaluated at the row that is |\n| | the last row of the window frame |\n| | (counting from 1); null if no such row. |\n+--------------------------------+-------------------------------------------+\n| LEAD() | Provides access to a row at a given |\n| | physical offset beyond that position. |\n| | Returns value evaluated at the row that |\n| | is offset rows after the current row |\n| | within the partition; if there is no |\n| | such row, instead return default. Both |\n| | offset and default are evaluated with |\n| | respect to the current row. If omitted, |\n| | offset defaults to 1 and default to null. |\n+--------------------------------+-------------------------------------------+\n| MAX() | Maximum value of expression across all |\n| | input values. |\n+--------------------------------+-------------------------------------------+\n| MEDIAN() | An inverse distribution function that |\n| | assumes a continuous distribution model. |\n| | It takes a numeric or datetime value and |\n| | returns the middle value or an |\n| | interpolated value that would be the |\n| | middle value once the values are sorted. |\n| | Nulls are ignored in the calculation. |\n+--------------------------------+-------------------------------------------+\n| MIN() | Minimum value of expression across all |\n| | input values. |\n+--------------------------------+-------------------------------------------+\n| NTH_VALUE() | The value evaluated at the row that is |\n| | the nth row of the window frame |\n| | (counting from 1); null if no such row. |\n+--------------------------------+-------------------------------------------+\n| NTILE() | Divides an ordered data set into a |\n| | number of buckets indicated by expr and |\n| | assigns the appropriate bucket number to |\n| | each row. The buckets are numbered 1 |\n| | through expr. The expr value must |\n| | resolve to a positive constant for each |\n| | partition. Integer ranging from 1 to the |\n| | argument value, dividing the partition |\n| | as equally as possible. |\n+--------------------------------+-------------------------------------------+\n| PERCENT_RANK() | relative rank of the current row: (rank |\n| | - 1) / (total rows - 1). |\n+--------------------------------+-------------------------------------------+\n| PERCENTILE_CONT() | An inverse distribution function that |\n| | assumes a continuous distribution model. |\n| | It takes a percentile value and a sort |\n| | specification, and returns an |\n| | interpolated value that would fall into |\n| | that percentile value with respect to |\n| | the sort specification. Nulls are |\n| | ignored in the calculation. |\n+--------------------------------+-------------------------------------------+\n| PERCENTILE_DISC() | An inverse distribution function that |\n| | assumes a discrete distribution model. |\n| | It takes a percentile value and a sort |\n| | specification and returns an element |\n| | from the set. Nulls are ignored in the |\n| | calculation. |\n+--------------------------------+-------------------------------------------+\n| RANK() | rank of the current row with gaps; same |\n| | as row_number of its first peer. |\n+--------------------------------+-------------------------------------------+\n| ROW_NUMBER() | number of the current row within its |\n| | partition, counting from 1 |\n+--------------------------------+-------------------------------------------+\n| STDDEV() STDDEV_POP() | Computes the population standard |\n| | deviation and returns the square root of |\n| | the population variance. |\n+--------------------------------+-------------------------------------------+\n| STDDEV_SAMP() | Computes the cumulative sample standard |\n| | deviation and returns the square root of |\n| | the sample variance. |\n+--------------------------------+-------------------------------------------+\n| SUM() | Sum of expression across all input |\n| | values. |\n+--------------------------------+-------------------------------------------+\n| VARIANCE() VAR_POP() | Population variance of the input values |\n| | (square of the population standard |\n| | deviation). |\n+--------------------------------+-------------------------------------------+\n| VAR_SAMP() | Sample variance of the input values |\n| | (square of the sample standard |\n| | deviation). |\n+--------------------------------+-------------------------------------------+\n\nExamples\n--------\n\nExample Schema\n--------------\n\nThe examples are all based on the following simplified sales opportunity table:\n\ncreate table opportunities (\nid int,\naccountName varchar(20),\nname varchar(128),\nowner varchar(7),\namount decimal(10,2),\ncloseDate date,\nstageName varchar(11)\n) engine=columnstore;\n\nSome example values are (thanks to https://www.mockaroo.com for sample data\ngeneration):\n\n+----+---------------+------+--------+---------+-------------+-------------+\n| id | accountName | name | owner | amount | closeDate | stageName |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 1 | Browseblab | Mult | Bob | 26444.8 | 2016-10-20 | Negotiating |','','https://mariadb.com/kb/en/window-functions-columnstore-window-functions/');
-update help_topic set description = CONCAT(description, '\n| | | -lat | | | | |\n| | | ral | | | | |\n| | | exec | | | | |\n| | | tive | | | | |\n| | | func | | | | |\n| | | ion | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 2 | Mita | Orga | Maria | 477878. | 2016-11-28 | ClosedWon |\n| | | ic | | 1 | | |\n| | | dema | | | | |\n| | | d-dr | | | | |\n| | | ven | | | | |\n| | | benc | | | | |\n| | | mark | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 3 | Miboo | De-e | Olivie | 80181.7 | 2017-01-05 | ClosedWon |\n| | | gine | | | | |\n| | | red | | | | |\n| | | hybr | | | | |\n| | | d | | | | |\n| | | grou | | | | |\n| | | ware | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 4 | Youbridge | Ente | Chris | 946245. | 2016-07-02 | ClosedWon |\n| | | pris | | 9 | | |\n| | | -wid | | | | |\n| | | | | | | |\n| | | bott | | | | |\n| | | m-li | | | | |\n| | | e | | | | |\n| | | Grap | | | | |\n| | | ic | | | | |\n| | | Inte | | | | |\n| | | face | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 5 | Skyba | Reve | Maria | 696241. | 2017-02-17 | Negotiating |\n| | | se-e | | 2 | | |\n| | | gine | | | | |\n| | | red | | | | |\n| | | fres | | | | |\n| | | -thi | | | | |\n| | | king | | | | |\n| | | stan | | | | |\n| | | ardi | | | | |\n| | | atio | | | | |\n| | | | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 6 | Eayo | Fund | Bob | 765605. | 2016-08-27 | Prospecting |\n| | | ment | | 2 | | |\n| | | l | | | | |\n| | | well | | | | |\n| | | modu | | | | |\n| | | ated | | | | |\n| | | arti | | | | |\n| | | icia | | | | |\n| | | | | | | |\n| | | inte | | | | |\n| | | lige | | | | |\n| | | ce | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 7 | Yotz | Exte | Chris | 319624. | 2017-01-06 | ClosedLost |\n| | | ded | | 0 | | |\n| | | seco | | | | |\n| | | dary | | | | |\n| | | infr | | | | |\n| | | stru | | | | |\n| | | ture | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 8 | Oloo | Conf | Chris | 321016. | 2017-03-08 | ClosedLost |\n| | | gura | | 6 | | |\n| | | le | | | | |\n| | | web- | | | | |\n| | | nabl | | | | |\n| | | d | | | | |\n| | | data | | | | |\n| | | ware | | | | |\n| | | ouse | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 9 | Kaymbo | Mult | Bob | 690881. | 2017-01-02 | Developing |\n| | | -lat | | 1 | | |\n| | | ral | | | | |\n| | | web- | | | | |\n| | | nabl | | | | |\n| | | d | | | | |\n| | | defi | | | | |\n| | | itio | | | | |\n| | | | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 10 | Rhyloo | Publ | Chris | 965477. | 2016-11-07 | Prospecting |\n| | | c-ke | | 4 | | |\n| | | | | | | |\n| | | cohe | | | | |\n| | | ent | | | | |\n| | | infr | | | | |\n| | | stru | | | | |\n| | | ture | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n\nThe schema, sample data, and queries are available as an attachment to this\narticle.\n\nCumulative Sum and Running Max Example\n--------------------------------------\n\nWindow functions can be used to achieve cumulative / running calculations on a\ndetail report. In this case a won opportunity report for a 7 day period adds\ncolumns to show the accumulated won amount as well as the current highest\nopportunity amount in preceding rows.\n\nselect owner, \naccountName, \nCloseDate, \namount, \nsum(amount) over (order by CloseDate rows between unbounded preceding and\ncurrent row) cumeWon, \nmax(amount) over (order by CloseDate rows between unbounded preceding and\ncurrent row) runningMax\nfrom opportunities \nwhere stageName=\'ClosedWon\' \nand closeDate >= \'2016-10-02\' and closeDate <= \'2016-10-09\' \norder by CloseDate;\n\nwith example results:\n\n+--------+---------------+-------------+---------+----------+--------------+\n| owner | accountName | CloseDate | amount | cumeWon | runningMax |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Babbleopia | 2016-10-02 | 437636. | 437636.4 | 437636.47 |\n| | | | 7 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Thoughtworks | 2016-10-04 | 146086. | 583722.9 | 437636.47 |\n| | | | 1 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Olivie | Devpulse | 2016-10-05 | 834235. | 1417958. | 834235.93 |\n| | | | 3 | 1 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Chris | Linkbridge | 2016-10-07 | 539977. | 2458738. | 834235.93 |\n| | | | 5 | 5 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Olivie | Trupe | 2016-10-07 | 500802. | 1918761. | 834235.93 |\n| | | | 9 | 0 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Latz | 2016-10-08 | 857254. | 3315993. | 857254.87 |\n| | | | 7 | 2 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Chris | Avamm | 2016-10-09 | 699566. | 4015560. | 857254.87 |\n| | | | 6 | 8 | |\n+--------+---------------+-------------+---------+----------+--------------+\n\nPartitioned Cumulative Sum and Running Max Example\n--------------------------------------------------\n\nThe above example can be partitioned, so that the window functions are over a\nparticular field grouping such as owner and accumulate within that grouping.\nThis is achieved by adding the syntax \"partition by <columns>\" in the window\nfunction clause.\n\nselect owner, \naccountName, \nCloseDate, \namount, \nsum(amount) over (partition by owner order by CloseDate rows between unbounded\npreceding and current row) cumeWon, \nmax(amount) over (partition by owner order by CloseDate rows between unbounded\npreceding and current row) runningMax \nfrom opportunities \nwhere stageName=\'ClosedWon\' \nand closeDate >= \'2016-10-02\' and closeDate <= \'2016-10-09\' \norder by owner, CloseDate;\n\nwith example results:\n\n+--------+---------------+-------------+---------+----------+--------------+\n| owner | accountName | CloseDate | amount | cumeWon | runningMax |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Babbleopia | 2016-10-02 | 437636. | 437636.4 | 437636.47 |\n| | | | 7 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Thoughtworks | 2016-10-04 | 146086. | 583722.9 | 437636.47 |\n| | | | 1 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Latz | 2016-10-08 | 857254. | 1440977. | 857254.87 |\n| | | | 7 | 5 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Chris | Linkbridge | 2016-10-07 | 539977. | 539977.4 | 539977.45 |\n| | | | 5 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Chris | Avamm | 2016-10-09 | 699566. | 1239544. | 699566.86 |\n| | | | 6 | 1 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Olivie | Devpulse | 2016-10-05 | 834235. | 834235.9 | 834235.93 |\n| | | | 3 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Olivie | Trupe | 2016-10-07 | 500802. | 1335038. | 834235.93 |\n| | | | 9 | 2 | |\n+--------+---------------+-------------+---------+----------+--------------+\n\nRanking / Top Results\n---------------------\n\nThe rank window function allows for ranking or assigning a numeric order value\nbased on the window function definition. Using the Rank() function will result\nin the same value for ties / equal values and the next rank value skipped. The\nDense_Rank() function behaves similarly except the next consecutive number is\nused after a tie rather than skipped. The Row_Number() function will provide a\nunique ordering value. The example query shows the Rank() function being\napplied to rank sales reps by the number of opportunities for Q4 2016.\n\nselect owner, \nwonCount, \nrank() over (order by wonCount desc) rank \nfrom (\n select owner,\n count(*) wonCount\n from opportunities\n where stageName=\'ClosedWon\'\n and closeDate >= \'2016-10-01\' and closeDate < \'2016-12-31\'\n group by owner\n) t\norder by rank;\n\nwith example results (note the query is technically incorrect by using\ncloseDate < \'2016-12-31\' however this creates a tie scenario for illustrative\npurposes):\n\n+----------------------+----------------------------------+------------------+\n| owner | wonCount | rank |\n+----------------------+----------------------------------+------------------+\n| Bill | 19 | 1 |\n+----------------------+----------------------------------+------------------+\n| Chris | 15 | 2 |') WHERE help_topic_id = 786;
-update help_topic set description = CONCAT(description, '\n+----------------------+----------------------------------+------------------+\n| Maria | 14 | 3 |\n+----------------------+----------------------------------+------------------+\n| Bob | 14 | 3 |\n+----------------------+----------------------------------+------------------+\n| Olivier | 10 | 5 |\n+----------------------+----------------------------------+------------------+\n\nIf the dense_rank function is used the rank values would be 1,2,3,3,4 and for\nthe row_number function the values would be 1,2,3,4,5.\n\nFirst and Last Values\n---------------------\n\nThe first_value and last_value functions allow determining the first and last\nvalues of a given range. Combined with a group by this allows summarizing\nopening and closing values. The example shows a more complex case where\ndetailed information is presented for first and last opportunity by quarter.\n\nselect a.year, \na.quarter, \nf.accountName firstAccountName, \nf.owner firstOwner, \nf.amount firstAmount, \nl.accountName lastAccountName, \nl.owner lastOwner, \nl.amount lastAmount \nfrom (\n select year,\n quarter,\n min(firstId) firstId,\n min(lastId) lastId\n from (\n select year(closeDate) year,\n quarter(closeDate) quarter,\n first_value(id) over (partition by year(closeDate), quarter(closeDate)\norder by closeDate rows between unbounded preceding and current row) firstId, \n last_value(id) over (partition by year(closeDate), quarter(closeDate)\norder by closeDate rows between current row and unbounded following) lastId \n from opportunities where stageName=\'ClosedWon\'\n ) t\n group by year, quarter order by year,quarter\n) a \njoin opportunities f on a.firstId = f.id \njoin opportunities l on a.lastId = l.id \norder by year, quarter;\n\nwith example results:\n\n+----+------+------------+--------+---------+-----------+-------+--------+\n| ye | quar | firstAccou | firstO | firstAm | lastAccou | lastO | lastAm |\n| r | er | tName | ner | unt | tName | ner | unt |\n+----+------+------------+--------+---------+-----------+-------+--------+\n| 20 | 3 | Skidoo | Bill | 523295. | Skipstorm | Bill | 151420 |\n| 6 | | | | 7 | | | 86 |\n+----+------+------------+--------+---------+-----------+-------+--------+\n| 20 | 4 | Skimia | Chris | 961513. | Avamm | Maria | 112493 |\n| 6 | | | | 9 | | | 65 |\n+----+------+------------+--------+---------+-----------+-------+--------+\n| 20 | 1 | Yombu | Bob | 536875. | Skaboo | Chris | 270273 |\n| 7 | | | | 1 | | | 08 |\n+----+------+------------+--------+---------+-----------+-------+--------+\n\nPrior and Next Example\n----------------------\n\nSometimes it useful to understand the previous and next values in the context\nof a given row. The lag and lead window functions provide this capability. By\ndefault the offset is one providing the prior or next value but can also be\nprovided to get a larger offset. The example query is a report of\nopportunities by account name showing the opportunity amount, and the prior\nand next opportunity amount for that account by close date.\n\nselect accountName, \ncloseDate, \namount currentOppAmount, \nlag(amount) over (partition by accountName order by closeDate) priorAmount,\nlead(amount) over (partition by accountName order by closeDate) nextAmount \nfrom opportunities \norder by accountName, closeDate \nlimit 9;\n\nwith example results:\n\n+--------------+-----------+-------------------+--------------+-------------+\n| accountName | closeDate | currentOppAmount | priorAmount | nextAmount |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2016-09-1 | 645098.45 | NULL | 161086.82 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2016-10-1 | 161086.82 | 645098.45 | 350235.75 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2016-12-1 | 350235.75 | 161086.82 | 878595.89 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2016-12-3 | 878595.89 | 350235.75 | 922322.39 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2017-01-2 | 922322.39 | 878595.89 | NULL |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abatz | 2016-10-1 | 795424.15 | NULL | NULL |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Agimba | 2016-07-0 | 288974.84 | NULL | 914461.49 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Agimba | 2016-09-0 | 914461.49 | 288974.84 | 176645.52 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Agimba | 2016-09-2 | 176645.52 | 914461.49 | NULL |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n\nQuartiles Example\n-----------------\n\nThe NTile window function allows for breaking up a data set into portions\nassigned a numeric value to each portion of the range. NTile(4) breaks the\ndata up into quartiles (4 sets). The example query produces a report of all\nopportunities summarizing the quartile boundaries of amount values.\n\nselect t.quartile, \nmin(t.amount) min, \nmax(t.amount) max \nfrom (\n select amount,\n ntile(4) over (order by amount asc) quartile\n from opportunities\n where closeDate >= \'2016-10-01\' and closeDate <= \'2016-12-31\'\n ) t\ngroup by quartile \norder by quartile;\n\nWith example results:\n\n+-----------------------------------------+----------------+----------------+\n| quartile | min | max |\n+-----------------------------------------+----------------+----------------+\n| 1 | 6337.15 | 287634.01 |\n+-----------------------------------------+----------------+----------------+\n| 2 | 288796.14 | 539977.45 |\n+-----------------------------------------+----------------+----------------+\n| 3 | 540070.04 | 748727.51 |\n+-----------------------------------------+----------------+----------------+\n| 4 | 753670.77 | 998864.47 |\n+-----------------------------------------+----------------+----------------+\n\nPercentile Example\n------------------\n\nThe percentile functions have a slightly different syntax from other window\nfunctions as can be seen in the example below. These functions can be only\napplied against numeric values. The argument to the function is the percentile\nto evaluate. Following \'within group\' is the sort expression which indicates\nthe sort column and optionally order. Finally after \'over\' is an optional\npartition by clause, for no partition clause use \'over ()\'. The example below\nutilizes the value 0.5 to calculate the median opportunity amount in the rows.\nThe values differ sometimes because percentile_cont will return the average of\nthe 2 middle rows for an even data set while percentile_desc returns the first\nencountered in the sort.\n\nselect owner, \naccountName, \nCloseDate, \namount,\npercentile_cont(0.5) within group (order by amount) over (partition by owner)\npct_cont,\npercentile_disc(0.5) within group (order by amount) over (partition by owner)\npct_disc\nfrom opportunities \nwhere stageName=\'ClosedWon\' \nand closeDate >= \'2016-10-02\' and closeDate <= \'2016-10-09\' \norder by owner, CloseDate;\n\nWith example results:\n\n+--------+----------------+-------------+---------+------------+------------+\n| owner | accountName | CloseDate | amount | pct_cont | pct_disc |\n+--------+----------------+-------------+---------+------------+------------+\n| Bill | Babbleopia | 2016-10-02 | 437636. | 437636.470 | 437636.47 |\n| | | | 7 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Bill | Thoughtworks | 2016-10-04 | 146086. | 437636.470 | 437636.47 |\n| | | | 1 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Bill | Latz | 2016-10-08 | 857254. | 437636.470 | 437636.47 |\n| | | | 7 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Chris | Linkbridge | 2016-10-07 | 539977. | 619772.155 | 539977.45 |\n| | | | 5 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Chris | Avamm | 2016-10-09 | 699566. | 619772.155 | 539977.45 |\n| | | | 6 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Olivie | Devpulse | 2016-10-05 | 834235. | 667519.110 | 500802.29 |\n| | | | 3 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Olivie | Trupe | 2016-10-07 | 500802. | 667519.110 | 500802.29 |\n| | | | 9 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n\nURL: https://mariadb.com/kb/en/window-functions-columnstore-window-functions/') WHERE help_topic_id = 786;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (787,41,'Window Frames','Syntax\n------\n\nframe_clause:\n {ROWS | RANGE} {frame_border | BETWEEN frame_border AND frame_border}\n\nframe_border:\n | UNBOUNDED PRECEDING\n | UNBOUNDED FOLLOWING\n | CURRENT ROW\n | expr PRECEDING\n | expr FOLLOWING\n\nDescription\n-----------\n\nA basic overview of window functions is described in Window Functions\nOverview. Window frames expand this functionality by allowing the function to\ninclude a specified a number of rows around the current row.\n\nThese include:\n\n* All rows before the current row (UNBOUNDED PRECEDING), for example RANGE\nBETWEEN UNBOUNDED PRECEDING AND CURRENT ROW\n* All rows after the current row (UNBOUNDED FOLLOWING), for example RANGE\nBETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING\n* A set number of rows before the current row (expr PRECEDING) for example\nRANGE BETWEEN 6 PRECEDING AND CURRENT ROW\n* A set number of rows after the current row (expr PRECEDING AND expr\nFOLLOWING) for example RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING\n* A specified number of rows both before and after the current row, for\nexample RANGE BETWEEN 6 PRECEDING AND 3 FOLLOWING\n\nThe following functions operate on window frames:\n\n* AVG\n* BIT_AND\n* BIT_OR\n* BIT_XOR\n* COUNT\n* LEAD\n* MAX\n* MIN\n* NTILE\n* STD\n* STDDEV\n* STDDEV_POP\n* STDDEV_SAMP\n* SUM\n* VAR_POP\n* VAR_SAMP\n* VARIANCE\n\nWindow frames are determined by the frame_clause in the window function\nrequest.\n\nTake the following example:\n\nCREATE TABLE `student_test` (\n name char(10),\n test char(10),\n score tinyint(4)\n);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, SUM(score) \n OVER () AS total_score\n FROM student_test;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Chun | SQL | 75 | 453 |\n| Chun | Tuning | 73 | 453 |\n| Esben | SQL | 43 | 453 |\n| Esben | Tuning | 31 | 453 |\n| Kaolin | SQL | 56 | 453 |\n| Kaolin | Tuning | 88 | 453 |\n| Tatiana | SQL | 87 | 453 |\n+---------+--------+-------+-------------+\n\nBy not specifying an OVER clause, the SUM function is run over the entire\ndataset. However, if we specify an ORDER BY condition based on score (and\norder the entire result in the same way for clarity), the following result is\nreturned:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score) AS total_score\n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 31 |\n| Esben | SQL | 43 | 74 |\n| Kaolin | SQL | 56 | 130 |\n| Chun | Tuning | 73 | 203 |\n| Chun | SQL | 75 | 278 |\n| Tatiana | SQL | 87 | 365 |\n| Kaolin | Tuning | 88 | 453 |\n+---------+--------+-------+-------------+\n\nThe total_score column represents a running total of the current row, and all\nprevious rows. The window frame in this example expands as the function\nproceeds.\n\nThe above query makes use of the default to define the window frame. It could\nbe written explicitly as follows:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS\ntotal_score \n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 31 |\n| Esben | SQL | 43 | 74 |\n| Kaolin | SQL | 56 | 130 |\n| Chun | Tuning | 73 | 203 |\n| Chun | SQL | 75 | 278 |\n| Tatiana | SQL | 87 | 365 |\n| Kaolin | Tuning | 88 | 453 |\n+---------+--------+-------+-------------+\n\nLet\'s look at some alternatives:\n\nFirstly, applying the window function to the current row and all following\nrows can be done with the use of UNBOUNDED FOLLOWING:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS\ntotal_score \n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 453 |\n| Esben | SQL | 43 | 422 |\n| Kaolin | SQL | 56 | 379 |\n| Chun | Tuning | 73 | 323 |\n| Chun | SQL | 75 | 250 |\n| Tatiana | SQL | 87 | 175 |\n| Kaolin | Tuning | 88 | 88 |\n+---------+--------+-------+-------------+\n\nIt\'s possible to specify a number of rows, rather than the entire unbounded\nfollowing or preceding set. The following example takes the current row, as\nwell as the previous row:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS\ntotal_score \n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 31 |\n| Esben | SQL | 43 | 74 |\n| Kaolin | SQL | 56 | 99 |\n| Chun | Tuning | 73 | 129 |\n| Chun | SQL | 75 | 148 |\n| Tatiana | SQL | 87 | 162 |\n| Kaolin | Tuning | 88 | 175 |\n+---------+--------+-------+-------------+\n\nThe current row and the following row:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\ntotal_score \n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 74 |\n| Esben | SQL | 43 | 130 |\n| Kaolin | SQL | 56 | 172 |\n| Chun | Tuning | 73 | 204 |\n| Chun | SQL | 75 | 235 |\n| Tatiana | SQL | 87 | 250 |\n| Kaolin | Tuning | 88 | 175 |\n+---------+--------+-------+-------------+\n\nURL: https://mariadb.com/kb/en/window-frames/','','https://mariadb.com/kb/en/window-frames/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (788,42,'SPIDER_BG_DIRECT_SQL','Syntax\n------\n\nSPIDER_BG_DIRECT_SQL(\'sql\', \'tmp_table_list\', \'parameters\')\n\nDescription\n-----------\n\nExecutes the given SQL statement in the background on the remote server, as\ndefined in the parameters listing. If the query returns a result-set, it\nsttores the results in the given temporary table. When the given SQL statement\nexecutes successfully, this function returns the number of called UDF\'s. It\nreturns 0 when the given SQL statement fails.\n\nThis function is a UDF installed with the Spider storage engine.\n\nExamples\n--------\n\nSELECT SPIDER_BG_DIRECT_SQL(\'SELECT * FROM example_table\', \'\', \n \'srv \"node1\", port \"8607\"\') AS \"Direct Query\";\n+--------------+\n| Direct Query | \n+--------------+\n| 1 |\n+--------------+\n\nParameters\n----------\n\nerror_rw_mode\n-------------\n\n* Description: Returns empty results on network error.\n0 : Return error on getting network error.\n1: Return 0 records on getting network error.\n\n* Default Table Value: 0\n* DSN Parameter Name: erwm\n\nURL: https://mariadb.com/kb/en/spider_bg_direct_sql/','','https://mariadb.com/kb/en/spider_bg_direct_sql/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (789,42,'SPIDER_COPY_TABLES','Syntax\n------\n\nSPIDER_COPY_TABLES(spider_table_name, \n source_link_id, destination_link_id_list [,parameters])\n\nDescription\n-----------\n\nA UDF installed with the Spider Storage Engine, this function copies table\ndata from source_link_id to destination_link_id_list. The service does not\nneed to be stopped in order to copy.\n\nIf the Spider table is partitioned, the name must be of the format\ntable_name#P#partition_name. The partition name can be viewed in the\nmysql.spider_tables table, for example:\n\nSELECT table_name FROM mysql.spider_tables;\n+-------------+\n| table_name |\n+-------------+\n| spt_a#P#pt1 |\n| spt_a#P#pt2 |\n| spt_a#P#pt3 |\n+-------------+\n\nReturns 1 if the data was copied successfully, or 0 if copying the data failed.\n\nURL: https://mariadb.com/kb/en/spider_copy_tables/','','https://mariadb.com/kb/en/spider_copy_tables/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (790,42,'SPIDER_DIRECT_SQL','Syntax\n------\n\nSPIDER_DIRECT_SQL(\'sql\', \'tmp_table_list\', \'parameters\')\n\nDescription\n-----------\n\nA UDF installed with the Spider Storage Engine, this function is used to\nexecute the SQL string sql on the remote server, as defined in parameters. If\nany resultsets are returned, they are stored in the tmp_table_list.\n\nThe function returns 1 if the SQL executes successfully, or 0 if it fails.\n\nExamples\n--------\n\nSELECT SPIDER_DIRECT_SQL(\'SELECT * FROM s\', \'\', \'srv \"node1\", port \"8607\"\');\n+----------------------------------------------------------------------+\n| SPIDER_DIRECT_SQL(\'SELECT * FROM s\', \'\', \'srv \"node1\", port \"8607\"\') |\n+----------------------------------------------------------------------+\n| 1 |\n+----------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/spider_direct_sql/','','https://mariadb.com/kb/en/spider_direct_sql/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (791,42,'SPIDER_FLUSH_TABLE_MON_CACHE','Syntax\n------\n\nSPIDER_FLUSH_TABLE_MON_CACHE()\n\nDescription\n-----------\n\nA UDF installed with the Spider Storage Engine, this function is used for\nrefreshing monitoring server information. It returns a value of 1.\n\nExamples\n--------\n\nSELECT SPIDER_FLUSH_TABLE_MON_CACHE();\n+--------------------------------+\n| SPIDER_FLUSH_TABLE_MON_CACHE() |\n+--------------------------------+\n| 1 |\n+--------------------------------+\n\nURL: https://mariadb.com/kb/en/spider_flush_table_mon_cache/','','https://mariadb.com/kb/en/spider_flush_table_mon_cache/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (792,43,'COLUMN_ADD','Syntax\n------\n\nCOLUMN_ADD(dyncol_blob, column_nr, value [as type], [column_nr, value [as\ntype]]...);\nCOLUMN_ADD(dyncol_blob, column_name, value [as type], [column_name, value [as\ntype]]...);\n\nDescription\n-----------\n\nAdds or updates dynamic columns.\n\n* dyncol_blob must be either a valid dynamic columns blob (for example,\nCOLUMN_CREATE returns such blob), or an empty string.\n* column_name specifies the name of the column to be added. If dyncol_blob\nalready has a column with this name, it will be overwritten.\n* value specifies the new value for the column. Passing a NULL value will\ncause the column to be deleted.\n* as type is optional. See #datatypes section for a discussion about types.\n\nThe return value is a dynamic column blob after the modifications.\n\nExamples\n--------\n\nUPDATE t1 SET dyncol_blob=COLUMN_ADD(dyncol_blob, \"column_name\", \"value\")\nWHERE id=1;\n\nNote: COLUMN_ADD() is a regular function (just like CONCAT()), hence, in order\nto update the value in the table you have to use the UPDATE ... SET\ndynamic_col=COLUMN_ADD(dynamic_col, ....) pattern.\n\nURL: https://mariadb.com/kb/en/column_add/','','https://mariadb.com/kb/en/column_add/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (793,43,'COLUMN_CHECK','Syntax\n------\n\nCOLUMN_CHECK(dyncol_blob);\n\nDescription\n-----------\n\nCheck if dyncol_blob is a valid packed dynamic columns blob. Return value of 1\nmeans the blob is valid, return value of 0 means it is not.\n\nRationale: Normally, one works with valid dynamic column blobs. Functions like\nCOLUMN_CREATE, COLUMN_ADD, COLUMN_DELETE always return valid dynamic column\nblobs. However, if a dynamic column blob is accidentally truncated, or\ntranscoded from one character set to another, it will be corrupted. This\nfunction can be used to check if a value in a blob field is a valid dynamic\ncolumn blob.\n\nURL: https://mariadb.com/kb/en/column_check/','','https://mariadb.com/kb/en/column_check/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (794,43,'COLUMN_CREATE','Syntax\n------\n\nCOLUMN_CREATE(column_nr, value [as type], [column_nr, value [as type]]...);\nCOLUMN_CREATE(column_name, value [as type], [column_name, value [as type]]...);\n\nDescription\n-----------\n\nReturns a dynamic columns blob that stores the specified columns with values.\n\nThe return value is suitable for\n\n* storing in a table\n* further modification with other dynamic columns functions\n\nThe as type part allows one to specify the value type. In most cases, this is\nredundant because MariaDB will be able to deduce the type of the value.\nExplicit type specification may be needed when the type of the value is not\napparent. For example, a literal \'2012-12-01\' has a CHAR type by default, one\nwill need to specify \'2012-12-01\' AS DATE to have it stored as a date. See\nDynamic Columns:Datatypes for further details.\n\nExamples\n--------\n\nINSERT INTO tbl SET dyncol_blob=COLUMN_CREATE(\"column_name\", \"value\");\n\nURL: https://mariadb.com/kb/en/column_create/','','https://mariadb.com/kb/en/column_create/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (795,43,'COLUMN_DELETE','Syntax\n------\n\nCOLUMN_DELETE(dyncol_blob, column_nr, column_nr...);\nCOLUMN_DELETE(dyncol_blob, column_name, column_name...);\n\nDescription\n-----------\n\nDeletes a dynamic column with the specified name. Multiple names can be given.\nThe return value is a dynamic column blob after the modification.\n\nURL: https://mariadb.com/kb/en/column_delete/','','https://mariadb.com/kb/en/column_delete/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (796,43,'COLUMN_EXISTS','Syntax\n------\n\nCOLUMN_EXISTS(dyncol_blob, column_nr);\nCOLUMN_EXISTS(dyncol_blob, column_name);\n\nDescription\n-----------\n\nChecks if a column with name column_name exists in dyncol_blob. If yes, return\n1, otherwise return 0. See dynamic columns for more information.\n\nURL: https://mariadb.com/kb/en/column_exists/','','https://mariadb.com/kb/en/column_exists/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (797,43,'COLUMN_GET','Syntax\n------\n\nCOLUMN_GET(dyncol_blob, column_nr as type);\nCOLUMN_GET(dyncol_blob, column_name as type);\n\nDescription\n-----------\n\nGets the value of a dynamic column by its name. If no column with the given\nname exists, NULL will be returned.\n\ncolumn_name as type requires that one specify the datatype of the dynamic\ncolumn they are reading.\n\nThis may seem counter-intuitive: why would one need to specify which datatype\nthey\'re retrieving? Can\'t the dynamic columns system figure the datatype from\nthe data being stored?\n\nThe answer is: SQL is a statically-typed language. The SQL interpreter needs\nto know the datatypes of all expressions before the query is run (for example,\nwhen one is using prepared statements and runs \"select COLUMN_GET(...)\", the\nprepared statement API requires the server to inform the client about the\ndatatype of the column being read before the query is executed and the server\ncan see what datatype the column actually has).\n\nLengths\n-------\n\nIf you\'re running queries like:\n\nSELECT COLUMN_GET(blob, \'colname\' as CHAR) ...\n\nwithout specifying a maximum length (i.e. using as CHAR, not as CHAR(n)),\nMariaDB will report the maximum length of the resultset column to be\n16,777,216. This may cause excessive memory usage in some client libraries,\nbecause they try to pre-allocate a buffer of maximum resultset width. To avoid\nthis problem, use CHAR(n) whenever you\'re using COLUMN_GET in the select list.\n\nSee Dynamic Columns:Datatypes for more information about datatypes.\n\nURL: https://mariadb.com/kb/en/column_get/','','https://mariadb.com/kb/en/column_get/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (798,43,'COLUMN_JSON','Syntax\n------\n\nCOLUMN_JSON(dyncol_blob)\n\nDescription\n-----------\n\nReturns a JSON representation of data in dyncol_blob. Can also be used to\ndisplay nested columns. See dynamic columns for more information.\n\nExample\n-------\n\nselect item_name, COLUMN_JSON(dynamic_cols) from assets;\n+-----------------+----------------------------------------+\n| item_name | COLUMN_JSON(dynamic_cols) |\n+-----------------+----------------------------------------+\n| MariaDB T-shirt | {\"size\":\"XL\",\"color\":\"blue\"} |\n| Thinkpad Laptop | {\"color\":\"black\",\"warranty\":\"3 years\"} |\n+-----------------+----------------------------------------+\n\nLimitation: COLUMN_JSON will decode nested dynamic columns at a nesting level\nof not more than 10 levels deep. Dynamic columns that are nested deeper than\n10 levels will be shown as BINARY string, without encoding.\n\nURL: https://mariadb.com/kb/en/column_json/','','https://mariadb.com/kb/en/column_json/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (799,43,'COLUMN_LIST','Syntax\n------\n\nCOLUMN_LIST(dyncol_blob);\n\nDescription\n-----------\n\nReturns a comma-separated list of column names. The names are quoted with\nbackticks.\n\nSee dynamic columns for more information.\n\nURL: https://mariadb.com/kb/en/column_list/','','https://mariadb.com/kb/en/column_list/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (800,44,'WSREP_LAST_SEEN_GTID','MariaDB starting with 10.4.2\n----------------------------\nWSREP_LAST_SEEN_GTID was added as part of Galera 4 in MariaDB 10.4.2.\n\nSyntax\n------\n\nWSREP_LAST_SEEN_GTID()\n\nDescription\n-----------\n\nReturns the Global Transaction ID of the most recent write transaction\nobserved by the client.\n\nThe result can be useful to determine the transaction to provide to\nWSREP_SYNC_WAIT_UPTO_GTID for waiting and unblocking purposes.\n\nURL: https://mariadb.com/kb/en/wsrep_last_seen_gtid/','','https://mariadb.com/kb/en/wsrep_last_seen_gtid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (801,44,'WSREP_LAST_WRITTEN_GTID','MariaDB starting with 10.4.2\n----------------------------\nWSREP_LAST_WRITTEN_GTID was added as part of Galera 4 in MariaDB 10.4.2.\n\nSyntax\n------\n\nWSREP_LAST_WRITTEN_GTID()\n\nDescription\n-----------\n\nReturns the Global Transaction ID of the most recent write transaction\nperformed by the client.\n\nURL: https://mariadb.com/kb/en/wsrep_last_written_gtid/','','https://mariadb.com/kb/en/wsrep_last_written_gtid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (802,44,'WSREP_SYNC_WAIT_UPTO_GTID','MariaDB starting with 10.4.2\n----------------------------\nWSREP_SYNC_WAIT_UPTO_GTID was added as part of Galera 4 in MariaDB 10.4.2.\n\nSyntax\n------\n\nWSREP_SYNC_WAIT_UPTO_GTID(gtid[,timeout])\n\nDescription\n-----------\n\nBlocks the client until the transaction specified by the given Global\nTransaction ID is applied and committed by the node.\n\nThe optional timeout argument can be used to specify a block timeout in\nseconds. If not provided, the timeout will be indefinite.\n\nReturns the node that applied and committed the Global Transaction ID,\nER_LOCAL_WAIT_TIMEOUT if the function is timed out before this, or\nER_WRONG_ARGUMENTS if the function is given an invalid GTID.\n\nThe result from WSREP_LAST_SEEN_GTID can be useful to determine the\ntransaction to provide to WSREP_SYNC_WAIT_UPTO_GTID for waiting and unblocking\npurposes.\n\nURL: https://mariadb.com/kb/en/wsrep_sync_wait_upto_gtid/','','https://mariadb.com/kb/en/wsrep_sync_wait_upto_gtid/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (803,45,'System-Versioned Tables','MariaDB supports temporal data tables in the form of system-versioning tables\n(allowing you to query and operate on historic data, discussed below),\napplication-time periods (allow you to query and operate on a temporal range\nof data), and bitemporal tables (which combine both system-versioning and\napplication-time periods).\n\nSystem-Versioned Tables\n-----------------------\n\nSystem-versioned tables store the history of all changes, not only data which\nis currently valid. This allows data analysis for any point in time, auditing\nof changes and comparison of data from different points in time. Typical uses\ncases are:\n\n* Forensic analysis & legal requirements to store data for N years.\n* Data analytics (retrospective, trends etc.), e.g. to get your staff\ninformation as of one year ago.\n* Point-in-time recovery - recover a table state as of particular point in\ntime.\n\nSystem-versioned tables were first introduced in the SQL:2011 standard.\n\nCreating a System-Versioned Table\n---------------------------------\n\nThe CREATE TABLE syntax has been extended to permit creating a\nsystem-versioned table. To be system-versioned, according to SQL:2011, a table\nmust have two generated columns, a period, and a special table option clause:\n\nCREATE TABLE t(\n x INT,\n start_timestamp TIMESTAMP(6) GENERATED ALWAYS AS ROW START,\n end_timestamp TIMESTAMP(6) GENERATED ALWAYS AS ROW END,\n PERIOD FOR SYSTEM_TIME(start_timestamp, end_timestamp)\n) WITH SYSTEM VERSIONING;\n\nIn MariaDB one can also use a simplified syntax:\n\nCREATE TABLE t (\n x INT\n) WITH SYSTEM VERSIONING;\n\nIn the latter case no extra columns will be created and they won\'t clutter the\noutput of, say, SELECT * FROM t. The versioning information will still be\nstored, and it can be accessed via the pseudo-columns ROW_START and ROW_END:\n\nSELECT x, ROW_START, ROW_END FROM t;\n\nAdding or Removing System Versioning To/From a Table\n----------------------------------------------------\n\nAn existing table can be altered to enable system versioning for it.\n\nCREATE TABLE t(\n x INT\n);\n\nALTER TABLE t ADD SYSTEM VERSIONING;\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `x` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING\n\nSimilarly, system versioning can be removed from a table:\n\nALTER TABLE t DROP SYSTEM VERSIONING;\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `x` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nOne can also add system versioning with all columns created explicitly:\n\nALTER TABLE t ADD COLUMN ts TIMESTAMP(6) GENERATED ALWAYS AS ROW START,\n ADD COLUMN te TIMESTAMP(6) GENERATED ALWAYS AS ROW END,\n ADD PERIOD FOR SYSTEM_TIME(ts, te),\n ADD SYSTEM VERSIONING;\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `x` int(11) DEFAULT NULL,\n `ts` timestamp(6) GENERATED ALWAYS AS ROW START,\n `te` timestamp(6) GENERATED ALWAYS AS ROW END,\n PERIOD FOR SYSTEM_TIME (`ts`, `te`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING\n\nInserting Data\n--------------\n\nWhen data is inserted into a system-versioned table, it is given a row_start\nvalue of the current timestamp, and a row_end value of\nFROM_UNIXTIME(2147483647.999999). The current timestamp can be adjusted by\nsetting the timestamp system variable, for example:\n\nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2022-10-24 23:09:38 |\n+---------------------+\n\nINSERT INTO t VALUES(1);\n\nSET @@timestamp = UNIX_TIMESTAMP(\'2033-10-24\');\n\nINSERT INTO t VALUES(2);\n\nSET @@timestamp = default;\n\nINSERT INTO t VALUES(3);\n\nSELECT a,row_start,row_end FROM t;\n+------+----------------------------+----------------------------+\n| a | row_start | row_end |\n+------+----------------------------+----------------------------+\n| 1 | 2022-10-24 23:09:38.951347 | 2038-01-19 05:14:07.999999 |\n| 2 | 2033-10-24 00:00:00.000000 | 2038-01-19 05:14:07.999999 |\n| 3 | 2022-10-24 23:09:38.961857 | 2038-01-19 05:14:07.999999 |\n+------+----------------------------+----------------------------+\n\nQuerying Historical Data\n------------------------\n\nSELECT\n------\n\nTo query the historical data one uses the clause FOR SYSTEM_TIME directly\nafter the table name (before the table alias, if any). SQL:2011 provides three\nsyntactic extensions:\n\n* AS OF is used to see the table as it was at a specific point in time in the\npast:\n\nSELECT * FROM t FOR SYSTEM_TIME AS OF TIMESTAMP\'2016-10-09 08:07:06\';\n\n* BETWEEN start AND end will show all rows that were visible at any point\nbetween two specified points in time. It works inclusively, a row visible\nexactly at start or exactly at end will be shown too.\n\nSELECT * FROM t FOR SYSTEM_TIME BETWEEN (NOW() - INTERVAL 1 YEAR) AND NOW();\n\n* FROM start TO end will also show all rows that were visible at any point\nbetween two specified points in time, including start, but excluding end.\n\nSELECT * FROM t FOR SYSTEM_TIME FROM \'2016-01-01 00:00:00\' TO \'2017-01-01\n00:00:00\';\n\nAdditionally MariaDB implements a non-standard extension:\n\n* ALL will show all rows, historical and current.\n\nSELECT * FROM t FOR SYSTEM_TIME ALL;\n\nIf the FOR SYSTEM_TIME clause is not used, the table will show the current\ndata. This is usually the same as if one had specified FOR SYSTEM_TIME AS OF\nCURRENT_TIMESTAMP, unless one has adjusted the row_start value (until MariaDB\n10.11, only possible by setting the secure_timestamp variable). For example:\n\nCREATE OR REPLACE TABLE t (a int) WITH SYSTEM VERSIONING;\n\nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2022-10-24 23:43:37 |\n+---------------------+\n\nINSERT INTO t VALUES (1);\n\nSET @@timestamp = UNIX_TIMESTAMP(\'2033-03-03\');\n\nINSERT INTO t VALUES (2);\n\nDELETE FROM t;\n\nSET @@timestamp = default;\n\nSELECT a, row_start, row_end FROM t FOR SYSTEM_TIME ALL;\n+------+----------------------------+----------------------------+\n| a | row_start | row_end |\n+------+----------------------------+----------------------------+\n| 1 | 2022-10-24 23:43:37.192725 | 2033-03-03 00:00:00.000000 |\n| 2 | 2033-03-03 00:00:00.000000 | 2033-03-03 00:00:00.000000 |\n+------+----------------------------+----------------------------+\n2 rows in set (0.000 sec)\n\nSELECT a, row_start, row_end FROM t FOR SYSTEM_TIME AS OF CURRENT_TIMESTAMP;\n+------+----------------------------+----------------------------+\n| a | row_start | row_end |\n+------+----------------------------+----------------------------+\n| 1 | 2022-10-24 23:43:37.192725 | 2033-03-03 00:00:00.000000 |\n+------+----------------------------+----------------------------+\n1 row in set (0.000 sec)\n\nSELECT a, row_start, row_end FROM t;\nEmpty set (0.001 sec)\n\nViews and Subqueries\n--------------------\n\nWhen a system-versioned tables is used in a view or in a subquery in the from\nclause, FOR SYSTEM_TIME can be used directly in the view or subquery body, or\n(non-standard) applied to the whole view when it\'s being used in a SELECT:\n\nCREATE VIEW v1 AS SELECT * FROM t FOR SYSTEM_TIME AS OF TIMESTAMP\'2016-10-09\n08:07:06\';\n\nOr\n\nCREATE VIEW v1 AS SELECT * FROM t;\nSELECT * FROM v1 FOR SYSTEM_TIME AS OF TIMESTAMP\'2016-10-09 08:07:06\';\n\nUse in Replication and Binary Logs\n----------------------------------\n\nTables that use system-versioning implicitly add the row_end column to the\nPrimary Key. While this is generally not an issue for most use cases, it can\nlead to problems when re-applying write statements from the binary log or in\nreplication environments, where a primary retries an SQL statement on the\nreplica.\n\nSpecifically, these writes include a value on the row_end column containing\nthe timestamp from when the write was initially made. The re-occurrence of the\nPrimary Key with the old system-versioning columns raises an error due to the\nduplication.\n\nTo mitigate this with MariaDB Replication, set the secure_timestamp system\nvariable to YES on the replica. When set, the replica uses its own system\nclock when applying to the row log, meaning that the primary can retry as many\ntimes as needed without causing a conflict. The retries generate new\nhistorical rows with new values for the row_start and row_end columns.\n\nTransaction-Precise History in InnoDB\n-------------------------------------\n\nA point in time when a row was inserted or deleted does not necessarily mean\nthat a change became visible at the same moment. With transactional tables, a\nrow might have been inserted in a long transaction, and became visible hours\nafter it was inserted.\n\nFor some applications — for example, when doing data analytics on one-year-old\ndata — this distinction does not matter much. For others — forensic analysis —\nit might be crucial.\n\nMariaDB supports transaction-precise history (only for the InnoDB storage\nengine) that allows seeing the data exactly as it would\'ve been seen by a new\nconnection doing a SELECT at the specified point in time — rows inserted\nbefore that point, but committed after will not be shown.\n\nTo use transaction-precise history, InnoDB needs to remember not timestamps,\nbut transaction identifier per row. This is done by creating generated columns\nas BIGINT UNSIGNED, not TIMESTAMP(6):\n\nCREATE TABLE t(\n x INT,\n start_trxid BIGINT UNSIGNED GENERATED ALWAYS AS ROW START,\n end_trxid BIGINT UNSIGNED GENERATED ALWAYS AS ROW END,\n PERIOD FOR SYSTEM_TIME(start_trxid, end_trxid)\n) WITH SYSTEM VERSIONING;\n\nThese columns must be specified explicitly, but they can be made INVISIBLE to\navoid cluttering SELECT * output.\n\nWhen one uses transaction-precise history, one can optionally use transaction\nidentifiers in the FOR SYSTEM_TIME clause:\n\nSELECT * FROM t FOR SYSTEM_TIME AS OF TRANSACTION 12345;\n\nThis will show the data, exactly as it was seen by the transaction with the\nidentifier 12345.\n\nStoring the History Separately\n------------------------------\n\nWhen the history is stored together with the current data, it increases the\nsize of the table, so current data queries — table scans and index searches —\nwill take more time, because they will need to skip over historical data. If\nmost queries on that table use only current data, it might make sense to store\nthe history separately, to reduce the overhead from versioning.\n\nThis is done by partitioning the table by SYSTEM_TIME. Because of the\npartition pruning optimization, all current data queries will only access one\npartition, the one that stores current data.\n\nThis example shows how to create such a partitioned table:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME (\n PARTITION p_hist HISTORY,\n PARTITION p_cur CURRENT\n );\n\nIn this example all history will be stored in the partition p_hist while all\ncurrent data will be in the partition p_cur. The table must have exactly one\ncurrent partition and at least one historical partition.\n\nPartitioning by SYSTEM_TIME also supports automatic partition rotation. One\ncan rotate historical partitions by time or by size. This example shows how to\nrotate partitions by size:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME LIMIT 100000 (\n PARTITION p0 HISTORY,\n PARTITION p1 HISTORY,\n PARTITION pcur CURRENT\n );\n\nMariaDB will start writing history rows into partition p0, and when it reaches\na size of 100000 rows, MariaDB will switch to partition p1. There are only two\nhistorical partitions, so when p1 overflows, MariaDB will issue a warning, but\nwill continue writing into it.\n\nSimilarly, one can rotate partitions by time:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 WEEK (\n PARTITION p0 HISTORY,\n PARTITION p1 HISTORY,\n PARTITION p2 HISTORY,\n PARTITION pcur CURRENT\n );\n\nThis means that the history for the first week after the table was created\nwill be stored in p0. The history for the second week — in p1, and all later\nhistory will go into p2. One can see the exact rotation time for each\npartition in the INFORMATION_SCHEMA.PARTITIONS table.\n\nIt is possible to combine partitioning by SYSTEM_TIME and subpartitions:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME\n SUBPARTITION BY KEY (x)\n SUBPARTITIONS 4 (\n PARTITION ph HISTORY,\n PARTITION pc CURRENT\n );\n\nDefault Partitions\n------------------\n\nMariaDB starting with 10.5.0\n----------------------------\nSince partitioning by current and historical data is such a typical usecase,\nfrom MariaDB 10.5, it is possible to use a simplified statement to do so. For\nexample, instead of\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING \n PARTITION BY SYSTEM_TIME (\n PARTITION p0 HISTORY,\n PARTITION pn CURRENT\n);\n\nyou can use\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING \n PARTITION BY SYSTEM_TIME;\n\nYou can also specify the number of partitions, which is useful if you want to\nrotate history by time, for example:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING \n PARTITION BY SYSTEM_TIME\n INTERVAL 1 MONTH\n PARTITIONS 12;\n\nSpecifying the number of partitions without specifying a rotation condition\nwill result in a warning:\n\nCREATE OR REPLACE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME PARTITIONS 12;\nQuery OK, 0 rows affected, 1 warning (0.518 sec)\n\nWarning (Code 4115): Maybe missing parameters: no rotation condition for\nmultiple HISTORY partitions.\n\nwhile specifying only 1 partition will result in an error:\n\nCREATE OR REPLACE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME PARTITIONS 1;\nERROR 4128 (HY000): Wrong partitions for `t`: must have at least one HISTORY\nand exactly one last CURRENT\n\nAutomatically Creating Partitions\n---------------------------------\n\nMariaDB starting with 10.9.1\n----------------------------\nFrom MariaDB 10.9.1, the AUTO keyword can be used to automatically create\nhistory partitions.\n\nFor example\n\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR AUTO;\n','','https://mariadb.com/kb/en/system-versioned-tables/');
-update help_topic set description = CONCAT(description, '\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 MONTH\n STARTS \'2021-01-01 00:00:00\' AUTO PARTITIONS 12;\n\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME LIMIT 1000 AUTO;\n\nOr with explicit partitions:\n\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR AUTO\n (PARTITION p0 HISTORY, PARTITION pn CURRENT);\n\nTo disable or enable auto-creation one can use ALTER TABLE by adding or\nremoving AUTO from the partitioning specification:\n\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR AUTO;\n\n# Disables auto-creation:\nALTER TABLE t1 PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR;\n\n# Enables auto-creation:\nALTER TABLE t1 PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR AUTO;\n\nIf the rest of the partitioning specification is identical to CREATE TABLE, no\nrepartitioning will be done (for details see MDEV-27328).\n\nRemoving Old History\n--------------------\n\nBecause it stores all the history, a system-versioned table might grow very\nlarge over time. There are many options to trim down the space and remove the\nold history.\n\nOne can completely drop the versioning from the table and add it back again,\nthis will delete all the history:\n\nALTER TABLE t DROP SYSTEM VERSIONING;\nALTER TABLE t ADD SYSTEM VERSIONING;\n\nIt might be a rather time-consuming operation, though, as the table will need\nto be rebuilt, possibly twice (depending on the storage engine).\n\nAnother option would be to use partitioning and drop some of historical\npartitions:\n\nALTER TABLE t DROP PARTITION p0;\n\nNote, that one cannot drop a current partition or the only historical\npartition.\n\nAnd the third option; one can use a variant of the DELETE statement to prune\nthe history:\n\nDELETE HISTORY FROM t;\n\nor only old history up to a specific point in time:\n\nDELETE HISTORY FROM t BEFORE SYSTEM_TIME \'2016-10-09 08:07:06\';\n\nor to a specific transaction (with BEFORE SYSTEM_TIME TRANSACTION xxx).\n\nTo protect the integrity of the history, this statement requires a special\nDELETE HISTORY privilege.\n\nCurrently, using the DELETE HISTORY statement with a BEFORE SYSTEM_TIME\ngreater than the ROW_END of the active records (as a TIMESTAMP, this has a\nmaximum value of \'2038-01-19 03:14:07\' UTC) will result in the historical\nrecords being dropped, and the active records being deleted and moved to\nhistory. See MDEV-25468.\n\nPrior to MariaDB 10.4.5, the TRUNCATE TABLE statement drops all historical\nrecords from a system-versioned-table.\n\nFrom MariaDB 10.4.5, historic data is protected from TRUNCATE statements, as\nper the SQL standard, and an Error 4137 is instead raised:\n\nTRUNCATE t;\nERROR 4137 (HY000): System-versioned tables do not support TRUNCATE TABLE\n\nExcluding Columns From Versioning\n---------------------------------\n\nAnother MariaDB extension allows to version only a subset of columns in a\ntable. This is useful, for example, if you have a table with user information\nthat should be versioned, but one column is, let\'s say, a login counter that\nis incremented often and is not interesting to version. Such a column can be\nexcluded from versioning by declaring it WITHOUT VERSIONING\n\nCREATE TABLE t (\n x INT,\n y INT WITHOUT SYSTEM VERSIONING\n) WITH SYSTEM VERSIONING;\n\nA column can also be declared WITH VERSIONING, that will automatically make\nthe table versioned. The statement below is equivalent to the one above:\n\nCREATE TABLE t (\n x INT WITH SYSTEM VERSIONING,\n y INT\n);\n\nChanges in other sections: https://mariadb.com/kb/en/create-table/\nhttps://mariadb.com/kb/en/alter-table/ https://mariadb.com/kb/en/join-syntax/\nhttps://mariadb.com/kb/en/partitioning-types-overview/\nhttps://mariadb.com/kb/en/date-and-time-units/\nhttps://mariadb.com/kb/en/delete/ https://mariadb.com/kb/en/grant/\n\nthey all reference back to this page\n\nAlso, TODO:\n\n* limitations (size, speed, adding history to unique not nullable columns)\n\nSystem Variables\n----------------\n\nThere are a number of system variables related to system-versioned tables:\n\nsystem_versioning_alter_history\n-------------------------------\n\n* Description: SQL:2011 does not allow ALTER TABLE on system-versioned tables.\nWhen this variable is set to ERROR, an attempt to alter a system-versioned\ntable will result in an error. When this variable is set to KEEP, ALTER TABLE\nwill be allowed, but the history will become incorrect — querying historical\ndata will show the new table structure. This mode is still useful, for\nexample, when adding new columns to a table. Note that if historical data\ncontains or would contain nulls, attempting to ALTER these columns to be NOT\nNULL will return an error (or warning if strict_mode is not set).\n* Commandline: --system-versioning-alter-history=value\n* Scope: Global, Session\n* Dynamic: Yes\n* Type: Enum\n* Default Value: ERROR\n* Valid Values: ERROR, KEEP\n\nsystem_versioning_asof\n----------------------\n\n* Description: If set to a specific timestamp value, an implicit FOR\nSYSTEM_TIME AS OF clause will be applied to all queries. This is useful if one\nwants to do many queries for history at the specific point in time. Set it to\nDEFAULT to restore the default behavior. Has no effect on DML, so queries such\nas INSERT .. SELECT and REPLACE .. SELECT need to state AS OF explicitly.\n* Commandline: None\n* Scope: Global, Session\n* Dynamic: Yes\n* Type: Varchar\n* Default Value: DEFAULT\n\nsystem_versioning_innodb_algorithm_simple\n-----------------------------------------\n\n* Description: Never fully implemented and removed in the following release.\n* Commandline: --system-versioning-innodb-algorithm-simple[={0|1}]\n* Scope: Global, Session\n* Dynamic: Yes\n* Type: Boolean\n* Default Value: ON\n* Introduced: MariaDB 10.3.4\n* Removed: MariaDB 10.3.5\n\nsystem_versioning_insert_history\n--------------------------------\n\n* Description: Allows direct inserts into ROW_START and ROW_END columns if\nsecure_timestamp allows changing timestamp.\n* Commandline: --system-versioning-insert-history[={0|1}]\n* Scope: Global, Session\n* Dynamic: Yes\n* Type: Boolean\n* Default Value: OFF\n* Introduced: MariaDB 10.11.0\n\nLimitations\n-----------\n\n* Versioning clauses can not be applied to generated (virtual and persistent)\ncolumns.\n* Before MariaDB 10.11, mariadb-dump did not read historical rows from\nversioned tables, and so historical data would not be backed up. Also, a\nrestore of the timestamps would not be possible as they cannot be defined by\nan insert/a user. From MariaDB 10.11, use the -H or --dump-history options to\ninclude the history.\n\nURL: https://mariadb.com/kb/en/system-versioned-tables/') WHERE help_topic_id = 803;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (804,45,'Application-Time Periods','MariaDB starting with 10.4.3\n----------------------------\nSupport for application-time period-versioning was added in MariaDB 10.4.3.\n\nExtending system-versioned tables, MariaDB 10.4 supports application-time\nperiod tables. Time periods are defined by a range between two temporal\ncolumns. The columns must be of the same temporal data type, i.e. DATE,\nTIMESTAMP or DATETIME (TIME and YEAR are not supported), and of the same width.\n\nUsing time periods implicitly defines the two columns as NOT NULL. It also\nadds a constraint to check whether the first value is less than the second\nvalue. The constraint is invisible to SHOW CREATE TABLE statements. The name\nof this constraint is prefixed by the time period name, to avoid conflict with\nother constraints.\n\nCreating Tables with Time Periods\n---------------------------------\n\nTo create a table with a time period, use a CREATE TABLE statement with the\nPERIOD table option.\n\nCREATE TABLE t1(\n name VARCHAR(50),\n date_1 DATE,\n date_2 DATE,\n PERIOD FOR date_period(date_1, date_2));\n\nThis creates a table with a time_period period and populates the table with\nsome basic temporal values.\n\nExamples are available in the MariaDB Server source code, at\nmysql-test/suite/period/r/create.result.\n\nAdding and Removing Time Periods\n--------------------------------\n\nThe ALTER TABLE statement now supports syntax for adding and removing time\nperiods from a table. To add a period, use the ADD PERIOD clause.\n\nFor example:\n\nCREATE OR REPLACE TABLE rooms (\n room_number INT,\n guest_name VARCHAR(255),\n checkin DATE,\n checkout DATE\n );\n\nALTER TABLE rooms ADD PERIOD FOR p(checkin,checkout);\n\nTo remove a period, use the DROP PERIOD clause:\n\nALTER TABLE rooms DROP PERIOD FOR p;\n\nBoth ADD PERIOD and DROP PERIOD clauses include an option to handle whether\nthe period already exists:\n\nALTER TABLE rooms ADD PERIOD IF NOT EXISTS FOR p(checkin,checkout);\n\nALTER TABLE rooms DROP PERIOD IF EXISTS FOR p;\n\nDeletion by Portion\n-------------------\n\nYou can also remove rows that fall within certain time periods.\n\nWhen MariaDB executes a DELETE FOR PORTION statement, it removes the row:\n\n* When the row period falls completely within the delete period, it removes\nthe row.\n* When the row period overlaps the delete period, it shrinks the row, removing\nthe overlap from the first or second row period value.\n* When the delete period falls completely within the row period, it splits the\nrow into two rows. The first row runs from the starting row period to the\nstarting delete period. The second runs from the ending delete period to the\nending row period.\n\nTo test this, first populate the table with some data to operate on:\n\nCREATE TABLE t1(\n name VARCHAR(50),\n date_1 DATE,\n date_2 DATE,\n PERIOD FOR date_period(date_1, date_2));\n\nINSERT INTO t1 (name, date_1, date_2) VALUES\n (\'a\', \'1999-01-01\', \'2000-01-01\'),\n (\'b\', \'1999-01-01\', \'2018-12-12\'),\n (\'c\', \'1999-01-01\', \'2017-01-01\'),\n (\'d\', \'2017-01-01\', \'2019-01-01\');\n\nSELECT * FROM t1;\n+------+------------+------------+\n| name | date_1 | date_2 |\n+------+------------+------------+\n| a | 1999-01-01 | 2000-01-01 |\n| b | 1999-01-01 | 2018-12-12 |\n| c | 1999-01-01 | 2017-01-01 |\n| d | 2017-01-01 | 2019-01-01 |\n+------+------------+------------+\n\nThen, run the DELETE FOR PORTION statement:\n\nDELETE FROM t1\nFOR PORTION OF date_period\n FROM \'2001-01-01\' TO \'2018-01-01\';\nQuery OK, 3 rows affected (0.028 sec)\n\nSELECT * FROM t1 ORDER BY name;\n+------+------------+------------+\n| name | date_1 | date_2 |\n+------+------------+------------+\n| a | 1999-01-01 | 2000-01-01 |\n| b | 1999-01-01 | 2001-01-01 |\n| b | 2018-01-01 | 2018-12-12 |\n| c | 1999-01-01 | 2001-01-01 |\n| d | 2018-01-01 | 2019-01-01 |\n+------+------------+------------+\n\nHere:\n\n* a is unchanged, as the range falls entirely out of the specified portion to\nbe deleted.\n* b, with values ranging from 1999 to 2018, is split into two rows, 1999 to\n2000 and 2018-01 to 2018-12.\n* c, with values ranging from 1999 to 2017, where only the upper value falls\nwithin the portion to be deleted, has been shrunk to 1999 to 2001.\n* d, with values ranging from 2017 to 2019, where only the lower value falls\nwithin the portion to be deleted, has been shrunk to 2018 to 2019.\n\nThe DELETE FOR PORTION statement has the following restrictions\n\n* The FROM...TO clause must be constant\n* Multi-delete is not supported\n\nIf there are DELETE or INSERT triggers, it works as follows: any matched row\nis deleted, and then one or two rows are inserted. If the record is deleted\ncompletely, nothing is inserted.\n\nUpdating by Portion\n-------------------\n\nThe UPDATE syntax now supports UPDATE FOR PORTION, which modifies rows based\non their occurrence in a range:\n\nTo test it, first populate the table with some data:\n\nTRUNCATE t1;\n\nINSERT INTO t1 (name, date_1, date_2) VALUES\n (\'a\', \'1999-01-01\', \'2000-01-01\'),\n (\'b\', \'1999-01-01\', \'2018-12-12\'),\n (\'c\', \'1999-01-01\', \'2017-01-01\'),\n (\'d\', \'2017-01-01\', \'2019-01-01\');\n\nSELECT * FROM t1;\n+------+------------+------------+\n| name | date_1 | date_2 |\n+------+------------+------------+\n| a | 1999-01-01 | 2000-01-01 |\n| b | 1999-01-01 | 2018-12-12 |\n| c | 1999-01-01 | 2017-01-01 |\n| d | 2017-01-01 | 2019-01-01 |\n+------+------------+------------+\n\nThen run the update:\n\nUPDATE t1 FOR PORTION OF date_period\n FROM \'2000-01-01\' TO \'2018-01-01\'\nSET name = CONCAT(name,\'_original\');\n\nSELECT * FROM t1 ORDER BY name;\n+------------+------------+------------+\n| name | date_1 | date_2 |\n+------------+------------+------------+\n| a | 1999-01-01 | 2000-01-01 |\n| b | 1999-01-01 | 2000-01-01 |\n| b | 2018-01-01 | 2018-12-12 |\n| b_original | 2000-01-01 | 2018-01-01 |\n| c | 1999-01-01 | 2000-01-01 |\n| c_original | 2000-01-01 | 2017-01-01 |\n| d | 2018-01-01 | 2019-01-01 |\n| d_original | 2017-01-01 | 2018-01-01 |\n+------------+------------+------------+\n\n* a is unchanged, as the range falls entirely out of the specified portion to\nbe deleted.\n* b, with values ranging from 1999 to 2018, is split into two rows, 1999 to\n2000 and 2018-01 to 2018-12.\n* c, with values ranging from 1999 to 2017, where only the upper value falls\nwithin the portion to be deleted, has been shrunk to 1999 to 2001.\n* d, with values ranging from 2017 to 2019, where only the lower value falls\nwithin the portion to be deleted, has been shrunk to 2018 to 2019. \n* Original rows affected by the update have \"_original\" appended to the name.\n\nThe UPDATE FOR PORTION statement has the following limitations:\n\n* The operation cannot modify the two temporal columns used by the time period\n* The operation cannot reference period values in the SET expression\n* FROM...TO expressions must be constant\n\nWITHOUT OVERLAPS\n----------------\n\nMariaDB starting with 10.5.3\n----------------------------\nMariaDB 10.5 introduced a new clause, WITHOUT OVERLAPS, which allows one to\ncreate an index specifying that application time periods should not overlap.\n\nAn index constrained by WITHOUT OVERLAPS is required to be either a primary\nkey or a unique index.\n\nTake the following example, an application time period table for a booking\nsystem:\n\nCREATE OR REPLACE TABLE rooms (\n room_number INT,\n guest_name VARCHAR(255),\n checkin DATE,\n checkout DATE,\n PERIOD FOR p(checkin,checkout)\n );\n\nINSERT INTO rooms VALUES \n (1, \'Regina\', \'2020-10-01\', \'2020-10-03\'),\n (2, \'Cochise\', \'2020-10-02\', \'2020-10-05\'),\n (1, \'Nowell\', \'2020-10-03\', \'2020-10-07\'),\n (2, \'Eusebius\', \'2020-10-04\', \'2020-10-06\');\n\nOur system is not intended to permit overlapping bookings, so the fourth\nrecord above should not have been inserted. Using WITHOUT OVERLAPS in a unique\nindex (in this case based on a combination of room number and the application\ntime period) allows us to specify this constraint in the table definition.\n\nCREATE OR REPLACE TABLE rooms (\n room_number INT,\n guest_name VARCHAR(255),\n checkin DATE,\n checkout DATE,\n PERIOD FOR p(checkin,checkout),\n UNIQUE (room_number, p WITHOUT OVERLAPS)\n );\n\nINSERT INTO rooms VALUES \n (1, \'Regina\', \'2020-10-01\', \'2020-10-03\'),\n (2, \'Cochise\', \'2020-10-02\', \'2020-10-05\'),\n (1, \'Nowell\', \'2020-10-03\', \'2020-10-07\'),\n (2, \'Eusebius\', \'2020-10-04\', \'2020-10-06\');\nERROR 1062 (23000): Duplicate entry \'2-2020-10-06-2020-10-04\' for key\n\'room_number\'\n\nFurther Examples\n----------------\n\nThe implicit change from NULL to NOT NULL:\n\nCREATE TABLE `t2` (\n `id` int(11) DEFAULT NULL,\n `d1` datetime DEFAULT NULL,\n `d2` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\nALTER TABLE t2 ADD PERIOD FOR p(d1,d2);\n\nSHOW CREATE TABLE t2\\G\n*************************** 1. row ***************************\n Table: t2\nCreate Table: CREATE TABLE `t2` (\n `id` int(11) DEFAULT NULL,\n `d1` datetime NOT NULL,\n `d2` datetime NOT NULL,\n PERIOD FOR `p` (`d1`, `d2`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nDue to this constraint, trying to add a time period where null data already\nexists will fail.\n\nCREATE OR REPLACE TABLE `t2` (\n `id` int(11) DEFAULT NULL,\n `d1` datetime DEFAULT NULL,\n `d2` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\nINSERT INTO t2(id) VALUES(1);\n\nALTER TABLE t2 ADD PERIOD FOR p(d1,d2);\nERROR 1265 (01000): Data truncated for column \'d1\' at row 1\n\nURL: https://mariadb.com/kb/en/application-time-periods/','','https://mariadb.com/kb/en/application-time-periods/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (805,45,'Bitemporal Tables','MariaDB starting with 10.4.3\n----------------------------\nBitemporal tables are tables that use versioning both at the system and\napplication-time period levels.\n\nUsing Bitemporal Tables\n-----------------------\n\nTo create a bitemporal table, use:\n\nCREATE TABLE test.t3 (\n date_1 DATE,\n date_2 DATE,\n row_start TIMESTAMP(6) AS ROW START INVISIBLE,\n row_end TIMESTAMP(6) AS ROW END INVISIBLE,\n PERIOD FOR application_time(date_1, date_2),\n PERIOD FOR system_time(row_start, row_end))\nWITH SYSTEM VERSIONING;\n\nNote that, while system_time here is also a time period, it cannot be used in\nDELETE FOR PORTION or UPDATE FOR PORTION statements.\n\nDELETE FROM test.t3 \nFOR PORTION OF system_time \n FROM \'2000-01-01\' TO \'2018-01-01\';\nERROR 42000: You have an error in your SQL syntax; check the manual that\ncorresponds \n to your MariaDB server version for the right syntax to use near\n \'of system_time from \'2000-01-01\' to \'2018-01-01\'\' at line 1\n\nURL: https://mariadb.com/kb/en/bitemporal-tables/','','https://mariadb.com/kb/en/bitemporal-tables/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (806,46,'ST_AsGeoJSON','Syntax\n------\n\nST_AsGeoJSON(g[, max_decimals[, options]])\n\nDescription\n-----------\n\nReturns the given geometry g as a GeoJSON element. The optional max_decimals\nlimits the maximum number of decimals displayed.\n\nThe optional options flag can be set to 1 to add a bounding box to the output.\n\nExamples\n--------\n\nSELECT ST_AsGeoJSON(ST_GeomFromText(\'POINT(5.3 7.2)\'));\n+-------------------------------------------------+\n| ST_AsGeoJSON(ST_GeomFromText(\'POINT(5.3 7.2)\')) |\n+-------------------------------------------------+\n| {\"type\": \"Point\", \"coordinates\": [5.3, 7.2]} |\n+-------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/geojson-st_asgeojson/','','https://mariadb.com/kb/en/geojson-st_asgeojson/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (807,46,'ST_GeomFromGeoJSON','MariaDB starting with 10.2.4\n----------------------------\nST_GeomFromGeoJSON was added in MariaDB 10.2.4\n\nSyntax\n------\n\nST_GeomFromGeoJSON(g[, option])\n\nDescription\n-----------\n\nGiven a GeoJSON input g, returns a geometry object. The option specifies what\nto do if g contains geometries with coordinate dimensions higher than 2.\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| 1 | Return an error (the default) |\n+---------------------------+------------------------------------------------+\n| 2 - 4 | The document is accepted, but the coordinates |\n| | for higher coordinate dimensions are stripped |\n| | off. |\n+---------------------------+------------------------------------------------+\n\nNote that this function did not work correctly before MariaDB 10.2.8 - see\nMDEV-12180.\n\nExamples\n--------\n\nSET @j = \'{ \"type\": \"Point\", \"coordinates\": [5.3, 15.0]}\';\n\nSELECT ST_AsText(ST_GeomFromGeoJSON(@j));\n+-----------------------------------+\n| ST_AsText(ST_GeomFromGeoJSON(@j)) |\n+-----------------------------------+\n| POINT(5.3 15) |\n+-----------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geomfromgeojson/','','https://mariadb.com/kb/en/st_geomfromgeojson/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (808,47,'Operator Precedence','The precedence is the order in which the SQL operators are evaluated.\n\nThe following list shows the SQL operator precedence. Operators that appear\nfirst in the list have a higher precedence. Operators which are listed\ntogether have the same precedence.\n\n* INTERVAL\n* BINARY, COLLATE\n* !\n* - (unary minus), [[bitwise-not|]] (unary bit inversion)\n* || (string concatenation)\n* ^\n* *, /, DIV, %, MOD\n* -, +\n* <<, >>\n* &\n* |\n* = (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN\n* BETWEEN, CASE, WHEN, THEN, ELSE, END\n* NOT\n* &&, AND\n* XOR\n* || (logical or), OR\n* = (assignment), :=\n\nFunctions precedence is always higher than operators precedence.\n\nIn this page CASE refers to the CASE operator, not to the CASE statement.\n\nIf the HIGH_NOT_PRECEDENCE SQL_MODE is set, NOT has the same precedence as !.\n\nThe || operator\'s precedence, as well as its meaning, depends on the\nPIPES_AS_CONCAT SQL_MODE flag: if it is on, || can be used to concatenate\nstrings (like the CONCAT() function) and has a higher precedence.\n\nThe = operator\'s precedence depends on the context - it is higher when = is\nused as a comparison operator.\n\nParenthesis can be used to modify the operators precedence in an expression.\n\nShort-circuit evaluation\n------------------------\n\nThe AND, OR, && and || operators support short-circuit evaluation. This means\nthat, in some cases, the expression on the right of those operators is not\nevaluated, because its result cannot affect the result. In the following\ncases, short-circuit evaluation is used and x() is not evaluated:\n\n* FALSE AND x()\n* FALSE && x()\n* TRUE OR x()\n* TRUE || x()\n* NULL BETWEEN x() AND x()\n\nNote however that the short-circuit evaluation does not apply to NULL AND x().\nAlso, BETWEEN\'s right operands are not evaluated if the left operand is NULL,\nbut in all other cases all the operands are evaluated.\n\nThis is a speed optimization. Also, since functions can have side-effects,\nthis behavior can be used to choose whether execute them or not using a\nconcise syntax:\n\nSELECT some_function() OR log_error();\n\nURL: https://mariadb.com/kb/en/operator-precedence/','','https://mariadb.com/kb/en/operator-precedence/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (809,48,'Addition Operator (+)','Syntax\n------\n\n+\n\nDescription\n-----------\n\nAddition.\n\nIf both operands are integers, the result is calculated with BIGINT precision.\nIf either integer is unsigned, the result is also an unsigned integer.\n\nFor real or string operands, the operand with the highest precision determines\nthe result precision.\n\nExamples\n--------\n\nSELECT 3+5;\n+-----+\n| 3+5 |\n+-----+\n| 8 |\n+-----+\n\nURL: https://mariadb.com/kb/en/addition-operator/','','https://mariadb.com/kb/en/addition-operator/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (810,48,'Division Operator (/)','Syntax\n------\n\n/\n\nDescription\n-----------\n\nDivision operator. Dividing by zero will return NULL. By default, returns four\ndigits after the decimal. This is determined by the server system variable\ndiv_precision_increment which by default is four. It can be set from 0 to 30.\n\nDividing by zero returns NULL. If the ERROR_ON_DIVISION_BY_ZERO SQL_MODE is\nused (the default since MariaDB 10.2.4), a division by zero also produces a\nwarning.\n\nExamples\n--------\n\nSELECT 4/5;\n+--------+\n| 4/5 |\n+--------+\n| 0.8000 |\n+--------+\n\nSELECT 300/(2-2);\n+-----------+\n| 300/(2-2) |\n+-----------+\n| NULL |\n+-----------+\n\nSELECT 300/7;\n+---------+\n| 300/7 |\n+---------+\n| 42.8571 |\n+---------+\n\nChanging div_precision_increment for the session from the default of four to\nsix:\n\nSET div_precision_increment = 6;\n\nSELECT 300/7;\n+-----------+\n| 300/7 |\n+-----------+\n| 42.857143 |\n+-----------+\n\nSELECT 300/7;\n+-----------+\n| 300/7 |\n+-----------+\n| 42.857143 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/division-operator/','','https://mariadb.com/kb/en/division-operator/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (811,48,'Modulo Operator (%)','Syntax\n------\n\nN % M\n\nDescription\n-----------\n\nModulo operator. Returns the remainder of N divided by M. See also MOD.\n\nExamples\n--------\n\nSELECT 1042 % 50;\n+-----------+\n| 1042 % 50 |\n+-----------+\n| 42 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/modulo-operator/','','https://mariadb.com/kb/en/modulo-operator/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (812,48,'Multiplication Operator (*)','Syntax\n------\n\n*\n\nDescription\n-----------\n\nMultiplication operator.\n\nExamples\n--------\n\nSELECT 7*6;\n+-----+\n| 7*6 |\n+-----+\n| 42 |\n+-----+\n\nSELECT 1234567890*9876543210;\n+-----------------------+\n| 1234567890*9876543210 |\n+-----------------------+\n| -6253480962446024716 |\n+-----------------------+\n\nSELECT 18014398509481984*18014398509481984.0;\n+---------------------------------------+\n| 18014398509481984*18014398509481984.0 |\n+---------------------------------------+\n| 324518553658426726783156020576256.0 |\n+---------------------------------------+\n\nSELECT 18014398509481984*18014398509481984;\n+-------------------------------------+\n| 18014398509481984*18014398509481984 |\n+-------------------------------------+\n| 0 |\n+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/multiplication-operator/','','https://mariadb.com/kb/en/multiplication-operator/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (813,48,'Subtraction Operator (-)','Syntax\n------\n\n-\n\nDescription\n-----------\n\nSubtraction. The operator is also used as the unary minus for changing sign.\n\nIf both operands are integers, the result is calculated with BIGINT precision.\nIf either integer is unsigned, the result is also an unsigned integer, unless\nthe NO_UNSIGNED_SUBTRACTION SQL_MODE is enabled, in which case the result is\nalways signed.\n\nFor real or string operands, the operand with the highest precision determines\nthe result precision.\n\nExamples\n--------\n\nSELECT 96-9;\n+------+\n| 96-9 |\n+------+\n| 87 |\n+------+\n\nSELECT 15-17;\n+-------+\n| 15-17 |\n+-------+\n| -2 |\n+-------+\n\nSELECT 3.66 + 1.333;\n+--------------+\n| 3.66 + 1.333 |\n+--------------+\n| 4.993 |\n+--------------+\n\nUnary minus:\n\nSELECT - (3+5);\n+---------+\n| - (3+5) |\n+---------+\n| -8 |\n+---------+\n\nURL: https://mariadb.com/kb/en/subtraction-operator-/','','https://mariadb.com/kb/en/subtraction-operator-/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (814,49,'CHANGE MASTER TO','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nCHANGE MASTER [\'connection_name\'] TO master_def [, master_def] ... \n [FOR CHANNEL \'channel_name\']\n\nmaster_def:\n MASTER_BIND = \'interface_name\'\n | MASTER_HOST = \'host_name\'\n | MASTER_USER = \'user_name\'\n | MASTER_PASSWORD = \'password\'\n | MASTER_PORT = port_num\n | MASTER_CONNECT_RETRY = interval\n | MASTER_HEARTBEAT_PERIOD = interval\n | MASTER_LOG_FILE = \'master_log_name\'\n | MASTER_LOG_POS = master_log_pos\n | RELAY_LOG_FILE = \'relay_log_name\'\n | RELAY_LOG_POS = relay_log_pos\n | MASTER_DELAY = interval\n | MASTER_SSL = {0|1}\n | MASTER_SSL_CA = \'ca_file_name\'\n | MASTER_SSL_CAPATH = \'ca_directory_name\'\n | MASTER_SSL_CERT = \'cert_file_name\'\n | MASTER_SSL_CRL = \'crl_file_name\'\n | MASTER_SSL_CRLPATH = \'crl_directory_name\'\n | MASTER_SSL_KEY = \'key_file_name\'\n | MASTER_SSL_CIPHER = \'cipher_list\'\n | MASTER_SSL_VERIFY_SERVER_CERT = {0|1}\n | MASTER_USE_GTID = {current_pos|slave_pos|no}\n | MASTER_DEMOTE_TO_SLAVE = bool\n | IGNORE_SERVER_IDS = (server_id_list)\n | DO_DOMAIN_IDS = ([N,..])\n | IGNORE_DOMAIN_IDS = ([N,..])\n\nDescription\n-----------\n\nThe CHANGE MASTER statement sets the options that a replica uses to connect to\nand replicate from a primary.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nto using the channel_name directly after CHANGE MASTER.\n\nMulti-Source Replication\n------------------------\n\nIf you are using multi-source replication, then you need to specify a\nconnection name when you execute CHANGE MASTER. There are two ways to do this:\n\n* Setting the default_master_connection system variable prior to executing\nCHANGE MASTER.\n* Setting the connection_name parameter when executing CHANGE MASTER.\n\ndefault_master_connection\n-------------------------\n\nSET default_master_connection = \'gandalf\';\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE;\n\nconnection_name\n---------------\n\nSTOP SLAVE \'gandalf\';\nCHANGE MASTER \'gandalf\' TO \n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE \'gandalf\';\n\nOptions\n-------\n\nConnection Options\n------------------\n\nMASTER_USER\n-----------\n\nThe MASTER_USER option for CHANGE MASTER defines the user account that the\nreplica will use to connect to the primary.\n\nThis user account will need the REPLICATION SLAVE privilege (or, from MariaDB\n10.5.1, the REPLICATION REPLICA on the primary.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_USER=\'repl\',\n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE;\n\nThe maximum length of the MASTER_USER string is 96 characters until MariaDB\n10.5, and 128 characters from MariaDB 10.6.\n\nMASTER_PASSWORD\n---------------\n\nThe MASTER_USER option for CHANGE MASTER defines the password that the replica\nwill use to connect to the primary as the user account defined by the\nMASTER_USER option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE;\n\nThe maximum length of the MASTER_PASSWORD string is 32 characters. The\neffective maximum length of the string depends on how many bytes are used per\ncharacter and can be up to 96 characters.\n\nDue to MDEV-29994, the password can be silently truncated to 41 characters\nwhen MariaDB is restarted. For this reason it is recommended to use a password\nthat is shorter than this.\n\nMASTER_HOST\n-----------\n\nThe MASTER_HOST option for CHANGE MASTER defines the hostname or IP address of\nthe primary.\n\nIf you set the value of the MASTER_HOST option to the empty string, then that\nis not the same as not setting the option\'s value at all. If you set the value\nof the MASTER_HOST option to the empty string, then the CHANGE MASTER command\nwill fail with an error. In MariaDB 5.3 and before, if you set the value of\nthe MASTER_HOST option to the empty string, then the CHANGE MASTER command\nwould succeed, but the subsequent START SLAVE command would fail.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_HOST=\'dbserver1.example.com\',\n MASTER_USER=\'repl\',\n MASTER_PASSWORD=\'new3cret\',\n MASTER_USE_GTID=slave_pos;\nSTART SLAVE;\n\nIf you set the value of the MASTER_HOST option in a CHANGE MASTER command,\nthen the replica assumes that the primary is different from before, even if\nyou set the value of this option to the same value it had previously. In this\nscenario, the replica will consider the old values for the primary\'s binary\nlog file name and position to be invalid for the new primary. As a side\neffect, if you do not explicitly set the values of the MASTER_LOG_FILE and\nMASTER_LOG_POS options in the statement, then the statement will be implicitly\nappended with MASTER_LOG_FILE=\'\' and MASTER_LOG_POS=4. However, if you enable\nGTID mode for replication by setting the MASTER_USE_GTID option to some value\nother than no in the statement, then these values will effectively be ignored\nanyway.\n\nReplicas cannot connect to primaries using Unix socket files or Windows named\npipes. The replica must connect to the primary using TCP/IP.\n\nThe maximum length of the MASTER_HOST string is 60 characters until MariaDB\n10.5, and 255 characters from MariaDB 10.6.\n\nMASTER_PORT\n-----------\n\nThe MASTER_PORT option for CHANGE MASTER defines the TCP/IP port of the\nprimary.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_HOST=\'dbserver1.example.com\',\n MASTER_PORT=3307,\n MASTER_USER=\'repl\',\n MASTER_PASSWORD=\'new3cret\',\n MASTER_USE_GTID=slave_pos;\nSTART SLAVE;\n\nIf you set the value of the MASTER_PORT option in a CHANGE MASTER command,\nthen the replica assumes that the primary is different from before, even if\nyou set the value of this option to the same value it had previously. In this\nscenario, the replica will consider the old values for the primary\'s binary\nlog file name and position to be invalid for the new primary. As a side\neffect, if you do not explicitly set the values of the MASTER_LOG_FILE and\nMASTER_LOG_POS options in the statement, then the statement will be implicitly\nappended with MASTER_LOG_FILE=\'\' and MASTER_LOG_POS=4. However, if you enable\nGTID mode for replication by setting the MASTER_USE_GTID option to some value\nother than no in the statement, then these values will effectively be ignored\nanyway.\n\nReplicas cannot connect to primaries using Unix socket files or Windows named\npipes. The replica must connect to the primary using TCP/IP.\n\nMASTER_CONNECT_RETRY\n--------------------\n\nThe MASTER_CONNECT_RETRY option for CHANGE MASTER defines how many seconds\nthat the replica will wait between connection retries. The default is 60.\n\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_CONNECT_RETRY=20;\nSTART SLAVE;\n\nThe number of connection attempts is limited by the master_retry_count option.\nIt can be set either on the command-line or in a server option group in an\noption file prior to starting up the server. For example:\n\n[mariadb]\n...\nmaster_retry_count=4294967295\n\nMASTER_BIND\n-----------\n\nThe MASTER_BIND option for CHANGE MASTER is only supported by MySQL 5.6.2 and\nlater and by MySQL NDB Cluster 7.3.1 and later. This option is not supported\nby MariaDB. See MDEV-19248 for more information.\n\nThe MASTER_BIND option for CHANGE MASTER can be used on replicas that have\nmultiple network interfaces to choose which network interface the replica will\nuse to connect to the primary.\n\nMASTER_HEARTBEAT_PERIOD\n-----------------------\n\nThe MASTER_HEARTBEAT_PERIOD option for CHANGE MASTER can be used to set the\ninterval in seconds between replication heartbeats. Whenever the primary\'s\nbinary log is updated with an event, the waiting period for the next heartbeat\nis reset.\n\nThis option\'s interval argument has the following characteristics:\n\n* It is a decimal value with a range of 0 to 4294967 seconds.\n* It has a resolution of hundredths of a second.\n* Its smallest valid non-zero value is 0.001.\n* Its default value is the value of the slave_net_timeout system variable\ndivided by 2.\n* If it\'s set to 0, then heartbeats are disabled.\n\nHeartbeats are sent by the primary only if there are no unsent events in the\nbinary log file for a period longer than the interval.\n\nIf the RESET SLAVE statement is executed, then the heartbeat interval is reset\nto the default.\n\nIf the slave_net_timeout system variable is set to a value that is lower than\nthe current heartbeat interval, then a warning will be issued.\n\nTLS Options\n-----------\n\nThe TLS options are used for providing information about TLS. The options can\nbe set even on replicas that are compiled without TLS support. The TLS options\nare saved to either the default master.info file or the file that is\nconfigured by the master_info_file option, but these TLS options are ignored\nunless the replica supports TLS.\n\nSee Replication with Secure Connections for more information.\n\nMASTER_SSL\n----------\n\nThe MASTER_SSL option for CHANGE MASTER tells the replica whether to force TLS\nfor the connection. The valid values are 0 or 1.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL=1;\nSTART SLAVE;\n\nMASTER_SSL_CA\n-------------\n\nThe MASTER_SSL_CA option for CHANGE MASTER defines a path to a PEM file that\nshould contain one or more X509 certificates for trusted Certificate\nAuthorities (CAs) to use for TLS. This option requires that you use the\nabsolute path, not a relative path. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\nSTART SLAVE;\n\nSee Secure Connections Overview: Certificate Authorities (CAs) for more\ninformation.\n\nThe maximum length of MASTER_SSL_CA string is 511 characters.\n\nMASTER_SSL_CAPATH\n-----------------\n\nThe MASTER_SSL_CAPATH option for CHANGE MASTER defines a path to a directory\nthat contains one or more PEM files that should each contain one X509\ncertificate for a trusted Certificate Authority (CA) to use for TLS. This\noption requires that you use the absolute path, not a relative path. The\ndirectory specified by this option needs to be run through the openssl rehash\ncommand. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CAPATH=\'/etc/my.cnf.d/certificates/ca/\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\nSTART SLAVE;\n\nSee Secure Connections Overview: Certificate Authorities (CAs) for more\ninformation.\n\nThe maximum length of MASTER_SSL_CA_PATH string is 511 characters.\n\nMASTER_SSL_CERT\n---------------\n\nThe MASTER_SSL_CERT option for CHANGE MASTER defines a path to the X509\ncertificate file to use for TLS. This option requires that you use the\nabsolute path, not a relative path. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\nSTART SLAVE;\n\nThe maximum length of MASTER_SSL_CERT string is 511 characters.\n\nMASTER_SSL_CRL\n--------------\n\nThe MASTER_SSL_CRL option for CHANGE MASTER defines a path to a PEM file that\nshould contain one or more revoked X509 certificates to use for TLS. This\noption requires that you use the absolute path, not a relative path.\n\nThis option is only supported if the server was built with OpenSSL. If the\nserver was built with yaSSL, then this option is not supported. See TLS and\nCryptography Libraries Used by MariaDB for more information about which\nlibraries are used on which platforms.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1,\n MASTER_SSL_CRL=\'/etc/my.cnf.d/certificates/crl.pem\';\nSTART SLAVE;\n\nSee Secure Connections Overview: Certificate Revocation Lists (CRLs) for more\ninformation.\n\nThe maximum length of MASTER_SSL_CRL string is 511 characters.\n\nMASTER_SSL_CRLPATH\n------------------\n\nThe MASTER_SSL_CRLPATH option for CHANGE MASTER defines a path to a directory\nthat contains one or more PEM files that should each contain one revoked X509\ncertificate to use for TLS. This option requires that you use the absolute\npath, not a relative path. The directory specified by this variable needs to\nbe run through the openssl rehash command.\n\nThis option is only supported if the server was built with OpenSSL. If the\nserver was built with yaSSL, then this option is not supported. See TLS and\nCryptography Libraries Used by MariaDB for more information about which\nlibraries are used on which platforms.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1,\n MASTER_SSL_CRLPATH=\'/etc/my.cnf.d/certificates/crl/\';\nSTART SLAVE;\n\nSee Secure Connections Overview: Certificate Revocation Lists (CRLs) for more\ninformation.\n\nThe maximum length of MASTER_SSL_CRL_PATH string is 511 characters.\n\nMASTER_SSL_KEY\n--------------\n\nThe MASTER_SSL_KEY option for CHANGE MASTER defines a path to a private key\nfile to use for TLS. This option requires that you use the absolute path, not\na relative path. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;','','https://mariadb.com/kb/en/change-master-to/');
-update help_topic set description = CONCAT(description, '\nSTART SLAVE;\n\nThe maximum length of MASTER_SSL_KEY string is 511 characters.\n\nMASTER_SSL_CIPHER\n-----------------\n\nThe MASTER_SSL_CIPHER option for CHANGE MASTER defines the list of permitted\nciphers or cipher suites to use for TLS. Besides cipher names, if MariaDB was\ncompiled with OpenSSL, this option could be set to \"SSLv3\" or \"TLSv1.2\" to\nallow all SSLv3 or all TLSv1.2 ciphers. Note that the TLSv1.3 ciphers cannot\nbe excluded when using OpenSSL, even by using this option. See Using TLSv1.3\nfor details. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1,\n MASTER_SSL_CIPHER=\'TLSv1.2\';\nSTART SLAVE;\n\nThe maximum length of MASTER_SSL_CIPHER string is 511 characters.\n\nMASTER_SSL_VERIFY_SERVER_CERT\n-----------------------------\n\nThe MASTER_SSL_VERIFY_SERVER_CERT option for CHANGE MASTER enables server\ncertificate verification. This option is disabled by default.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\nSTART SLAVE;\n\nSee Secure Connections Overview: Server Certificate Verification for more\ninformation.\n\nBinary Log Options\n------------------\n\nThese options are related to the binary log position on the primary.\n\nMASTER_LOG_FILE\n---------------\n\nThe MASTER_LOG_FILE option for CHANGE MASTER can be used along with\nMASTER_LOG_POS to specify the coordinates at which the replica\'s I/O thread\nshould begin reading from the primary\'s binary logs the next time the thread\nstarts.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4;\nSTART SLAVE;\n\nThe MASTER_LOG_FILE and MASTER_LOG_POS options cannot be specified if the\nRELAY_LOG_FILE and RELAY_LOG_POS options were also specified.\n\nThe MASTER_LOG_FILE and MASTER_LOG_POS options are effectively ignored if you\nenable GTID mode for replication by setting the MASTER_USE_GTID option to some\nvalue other than no in the statement.\n\nMASTER_LOG_POS\n--------------\n\nThe MASTER_LOG_POS option for CHANGE MASTER can be used along with\nMASTER_LOG_FILE to specify the coordinates at which the replica\'s I/O thread\nshould begin reading from the primary\'s binary logs the next time the thread\nstarts.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4;\nSTART SLAVE;\n\nThe MASTER_LOG_FILE and MASTER_LOG_POS options cannot be specified if the\nRELAY_LOG_FILE and RELAY_LOG_POS options were also specified.\n\nThe MASTER_LOG_FILE and MASTER_LOG_POS options are effectively ignored if you\nenable GTID mode for replication by setting the MASTER_USE_GTID option to some\nvalue other than no in the statement.\n\nRelay Log Options\n-----------------\n\nThese options are related to the relay log position on the replica.\n\nRELAY_LOG_FILE\n--------------\n\nThe RELAY_LOG_FILE option for CHANGE MASTER can be used along with the\nRELAY_LOG_POS option to specify the coordinates at which the replica\'s SQL\nthread should begin reading from the relay log the next time the thread starts.\n\nThe CHANGE MASTER statement usually deletes all relay log files. However, if\nthe RELAY_LOG_FILE and/or RELAY_LOG_POS options are specified, then existing\nrelay log files are kept.\n\nWhen you want to change the relay log position, you only need to stop the\nreplica\'s SQL thread. The replica\'s I/O thread can continue running. The STOP\nSLAVE and START SLAVE statements support the SQL_THREAD option for this\nscenario. For example:\n\nSTOP SLAVE SQL_THREAD;\nCHANGE MASTER TO\n RELAY_LOG_FILE=\'slave-relay-bin.006\',\n RELAY_LOG_POS=4025;\nSTART SLAVE SQL_THREAD;\n\nWhen the value of this option is changed, the metadata about the replica\'s SQL\nthread\'s position in the relay logs will also be changed in the relay-log.info\nfile or the file that is configured by the relay_log_info_file system variable.\n\nThe RELAY_LOG_FILE and RELAY_LOG_POS options cannot be specified if the\nMASTER_LOG_FILE and MASTER_LOG_POS options were also specified.\n\nRELAY_LOG_POS\n-------------\n\nThe RELAY_LOG_POS option for CHANGE MASTER can be used along with the\nRELAY_LOG_FILE option to specify the coordinates at which the replica\'s SQL\nthread should begin reading from the relay log the next time the thread starts.\n\nThe CHANGE MASTER statement usually deletes all relay log files. However, if\nthe RELAY_LOG_FILE and/or RELAY_LOG_POS options are specified, then existing\nrelay log files are kept.\n\nWhen you want to change the relay log position, you only need to stop the\nreplica\'s SQL thread. The replica\'s I/O thread can continue running. The STOP\nSLAVE and START SLAVE statements support the SQL_THREAD option for this\nscenario. For example:\n\nSTOP SLAVE SQL_THREAD;\nCHANGE MASTER TO\n RELAY_LOG_FILE=\'slave-relay-bin.006\',\n RELAY_LOG_POS=4025;\nSTART SLAVE SQL_THREAD;\n\nWhen the value of this option is changed, the metadata about the replica\'s SQL\nthread\'s position in the relay logs will also be changed in the relay-log.info\nfile or the file that is configured by the relay_log_info_file system variable.\n\nThe RELAY_LOG_FILE and RELAY_LOG_POS options cannot be specified if the\nMASTER_LOG_FILE and MASTER_LOG_POS options were also specified.\n\nGTID Options\n------------\n\nMASTER_USE_GTID\n---------------\n\nThe MASTER_USE_GTID option for CHANGE MASTER can be used to configure the\nreplica to use the global transaction ID (GTID) when connecting to a primary.\nThe possible values are:\n\n* current_pos - Replicate in GTID mode and use gtid_current_pos as the\nposition to start downloading transactions from the primary. Deprecated from\nMariaDB 10.10. Using to transition to primary can break the replication state\nif the replica executes local transactions due to actively updating\ngtid_current_pos with gtid_binlog_pos and gtid_slave_pos. Use the new, safe,\nMASTER_DEMOTE_TO_SLAVE=<bool> option instead.\n* slave_pos - Replicate in GTID mode and use gtid_slave_pos as the position to\nstart downloading transactions from the primary. From MariaDB 10.5.1,\nreplica_pos is an alias for slave_pos.\n* no - Don\'t replicate in GTID mode.\n\nMASTER_DEMOTE_TO_SLAVE\n----------------------\n\nMariaDB starting with 10.10\n---------------------------\nUsed to transition a primary to become a replica. Replaces the old\nMASTER_USE_GTID=current_pos with a safe alternative by forcing users to set\nUsing_Gtid=Slave_Pos and merging gtid_binlog_pos into gtid_slave_pos once at\nCHANGE MASTER TO time. If gtid_slave_pos is more recent than gtid_binlog_pos\n(as in the case of chain replication), the replication state should be\npreserved.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_USE_GTID = current_pos;\nSTART SLAVE;\n\nOr:\n\nSTOP SLAVE;\nSET GLOBAL gtid_slave_pos=\'0-1-153\';\nCHANGE MASTER TO\n MASTER_USE_GTID = slave_pos;\nSTART SLAVE;\n\nReplication Filter Options\n--------------------------\n\nAlso see Replication filters.\n\nIGNORE_SERVER_IDS\n-----------------\n\nThe IGNORE_SERVER_IDS option for CHANGE MASTER can be used to configure a\nreplica to ignore binary log events that originated from certain servers.\nFiltered binary log events will not get logged to the replica’s relay log, and\nthey will not be applied by the replica.\n\nThe option\'s value can be specified by providing a comma-separated list of\nserver_id values. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_SERVER_IDS = (3,5);\nSTART SLAVE;\n\nIf you would like to clear a previously set list, then you can set the value\nto an empty list. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_SERVER_IDS = ();\nSTART SLAVE;\n\nDO_DOMAIN_IDS\n-------------\n\nThe DO_DOMAIN_IDS option for CHANGE MASTER can be used to configure a replica\nto only apply binary log events if the transaction\'s GTID is in a specific\ngtid_domain_id value. Filtered binary log events will not get logged to the\nreplica’s relay log, and they will not be applied by the replica.\n\nThe option\'s value can be specified by providing a comma-separated list of\ngtid_domain_id values. Duplicate values are automatically ignored. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n DO_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n\nIf you would like to clear a previously set list, then you can set the value\nto an empty list. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n DO_DOMAIN_IDS = ();\nSTART SLAVE;\n\nThe DO_DOMAIN_IDS option and the IGNORE_DOMAIN_IDS option cannot both be set\nto non-empty values at the same time. If you want to set the DO_DOMAIN_IDS\noption, and the IGNORE_DOMAIN_IDS option was previously set, then you need to\nclear the value of the IGNORE_DOMAIN_IDS option. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_DOMAIN_IDS = (),\n DO_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n\nThe DO_DOMAIN_IDS option can only be specified if the replica is replicating\nin GTID mode. Therefore, the MASTER_USE_GTID option must also be set to some\nvalue other than no in order to use this option.\n\nIGNORE_DOMAIN_IDS\n-----------------\n\nThe IGNORE_DOMAIN_IDS option for CHANGE MASTER can be used to configure a\nreplica to ignore binary log events if the transaction\'s GTID is in a specific\ngtid_domain_id value. Filtered binary log events will not get logged to the\nreplica’s relay log, and they will not be applied by the replica.\n\nThe option\'s value can be specified by providing a comma-separated list of\ngtid_domain_id values. Duplicate values are automatically ignored. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n\nIf you would like to clear a previously set list, then you can set the value\nto an empty list. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_DOMAIN_IDS = ();\nSTART SLAVE;\n\nThe DO_DOMAIN_IDS option and the IGNORE_DOMAIN_IDS option cannot both be set\nto non-empty values at the same time. If you want to set the IGNORE_DOMAIN_IDS\noption, and the DO_DOMAIN_IDS option was previously set, then you need to\nclear the value of the DO_DOMAIN_IDS option. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n DO_DOMAIN_IDS = (),\n IGNORE_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n\nThe IGNORE_DOMAIN_IDS option can only be specified if the replica is\nreplicating in GTID mode. Therefore, the MASTER_USE_GTID option must also be\nset to some value other than no in order to use this option.\n\nDelayed Replication Options\n---------------------------\n\nMASTER_DELAY\n------------\n\nThe MASTER_DELAY option for CHANGE MASTER can be used to enable delayed\nreplication. This option specifies the time in seconds (at least) that a\nreplica should lag behind the primary up to a maximum value of 2147483647, or\nabout 68 years. Before executing an event, the replica will first wait, if\nnecessary, until the given time has passed since the event was created on the\nprimary. The result is that the replica will reflect the state of the primary\nsome time back in the past. The default is zero, no delay.\n\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_DELAY=3600;\nSTART SLAVE;\n\nChanging Option Values\n----------------------\n\nIf you don\'t specify a given option when executing the CHANGE MASTER\nstatement, then the option keeps its old value in most cases. Most of the\ntime, there is no need to specify the options that do not need to change. For\nexample, if the password for the user account that the replica uses to connect\nto its primary has changed, but no other options need to change, then you can\njust change the MASTER_PASSWORD option by executing the following commands:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE;\n\nThere are some cases where options are implicitly reset, such as when the\nMASTER_HOST and MASTER_PORT options are changed.\n\nOption Persistence\n------------------\n\nThe values of the MASTER_LOG_FILE and MASTER_LOG_POS options (i.e. the binary\nlog position on the primary) and most other options are written to either the\ndefault master.info file or the file that is configured by the\nmaster_info_file option. The replica\'s I/O thread keeps this binary log\nposition updated as it downloads events only when MASTER_USE_GTID option is\nset to NO. Otherwise the file is not updated on a per event basis.\n\nThe master_info_file option can be set either on the command-line or in a\nserver option group in an option file prior to starting up the server. For\nexample:\n\n[mariadb]\n...\nmaster_info_file=/mariadb/myserver1-master.info\n\nThe values of the RELAY_LOG_FILE and RELAY_LOG_POS options (i.e. the relay log\nposition) are written to either the default relay-log.info file or the file\nthat is configured by the relay_log_info_file system variable. The replica\'s\nSQL thread keeps this relay log position updated as it applies events.\n\nThe relay_log_info_file system variable can be set either on the command-line\nor in a server option group in an option file prior to starting up the server.\nFor example:\n\n[mariadb]\n...\nrelay_log_info_file=/mariadb/myserver1-relay-log.info\n\nGTID Persistence\n----------------\n\nIf the replica is replicating binary log events that contain GTIDs, then the\nreplica\'s SQL thread will write every GTID that it applies to the\nmysql.gtid_slave_pos table. This GTID can be inspected and modified through\nthe gtid_slave_pos system variable.\n\nIf the replica has the log_slave_updates system variable enabled and if the\nreplica has the binary log enabled, then every write by the replica\'s SQL\nthread will also go into the replica\'s binary log. This means that GTIDs of\nreplicated transactions would be reflected in the value of the gtid_binlog_pos\nsystem variable.\n\nCreating a Replica from a Backup\n--------------------------------\n\nThe CHANGE MASTER statement is useful for setting up a replica when you have a\nbackup of the primary and you also have the binary log position or GTID\nposition corresponding to the backup.\n\nAfter restoring the backup on the replica, you could execute something like\nthis to use the binary log position:\n\nCHANGE MASTER TO\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4;\nSTART SLAVE;\n') WHERE help_topic_id = 814;
-update help_topic set description = CONCAT(description, '\nOr you could execute something like this to use the GTID position:\n\nSET GLOBAL gtid_slave_pos=\'0-1-153\';\nCHANGE MASTER TO\n MASTER_USE_GTID=slave_pos;\nSTART SLAVE;\n\nSee Setting up a Replication Slave with Mariabackup for more information on\nhow to do this with Mariabackup.\n\nExample\n-------\n\nThe following example changes the primary and primary\'s binary log\ncoordinates. This is used when you want to set up the replica to replicate the\nprimary:\n\nCHANGE MASTER TO\n MASTER_HOST=\'master2.mycompany.com\',\n MASTER_USER=\'replication\',\n MASTER_PASSWORD=\'bigs3cret\',\n MASTER_PORT=3306,\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4,\n MASTER_CONNECT_RETRY=10;\nSTART SLAVE;\n\nURL: https://mariadb.com/kb/en/change-master-to/') WHERE help_topic_id = 814;
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (815,49,'START SLAVE','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nSTART SLAVE [\"connection_name\"] [thread_type [, thread_type] ... ] [FOR\nCHANNEL \"connection_name\"]\nSTART SLAVE [\"connection_name\"] [SQL_THREAD] UNTIL \n MASTER_LOG_FILE = \'log_name\', MASTER_LOG_POS = log_pos [FOR CHANNEL\n\"connection_name\"]\nSTART SLAVE [\"connection_name\"] [SQL_THREAD] UNTIL\n RELAY_LOG_FILE = \'log_name\', RELAY_LOG_POS = log_pos [FOR CHANNEL\n\"connection_name\"]\nSTART SLAVE [\"connection_name\"] [SQL_THREAD] UNTIL\n MASTER_GTID_POS = <GTID position> [FOR CHANNEL \"connection_name\"]\nSTART ALL SLAVES [thread_type [, thread_type]]\n\nSTART REPLICA [\"connection_name\"] [thread_type [, thread_type] ... ] -- from\n10.5.1\nSTART REPLICA [\"connection_name\"] [SQL_THREAD] UNTIL \n MASTER_LOG_FILE = \'log_name\', MASTER_LOG_POS = log_pos -- from 10.5.1\nSTART REPLICA [\"connection_name\"] [SQL_THREAD] UNTIL\n RELAY_LOG_FILE = \'log_name\', RELAY_LOG_POS = log_pos -- from 10.5.1\nSTART REPLICA [\"connection_name\"] [SQL_THREAD] UNTIL\n MASTER_GTID_POS = <GTID position> -- from 10.5.1\nSTART ALL REPLICAS [thread_type [, thread_type]] -- from 10.5.1\n\nthread_type: IO_THREAD | SQL_THREAD\n\nDescription\n-----------\n\nSTART SLAVE (START REPLICA from MariaDB 10.5.1) with no thread_type options\nstarts both of the replica threads (see replication). The I/O thread reads\nevents from the primary server and stores them in the relay log. The SQL\nthread reads events from the relay log and executes them. START SLAVE requires\nthe SUPER privilege, or, from MariaDB 10.5.2, the REPLICATION SLAVE ADMIN\nprivilege.\n\nIf START SLAVE succeeds in starting the replica threads, it returns without\nany error. However, even in that case, it might be that the replica threads\nstart and then later stop (for example, because they do not manage to connect\nto the primary or read its binary log, or some other problem). START SLAVE\ndoes not warn you about this. You must check the replica\'s error log for error\nmessages generated by the replica threads, or check that they are running\nsatisfactorily with SHOW SLAVE STATUS (SHOW REPLICA STATUS from MariaDB\n10.5.1).\n\nSTART SLAVE UNTIL\n-----------------\n\nSTART SLAVE UNTIL refers to the SQL_THREAD replica position at which the\nSQL_THREAD replication will halt. If SQL_THREAD isn\'t specified both threads\nare started.\n\nSTART SLAVE UNTIL master_gtid_pos=xxx is also supported. See Global\nTransaction ID/START SLAVE UNTIL master_gtid_pos=xxx for more details.\n\nconnection_name\n---------------\n\nIf there is only one nameless primary, or the default primary (as specified by\nthe default_master_connection system variable) is intended, connection_name\ncan be omitted. If provided, the START SLAVE statement will apply to the\nspecified primary. connection_name is case-insensitive.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after START SLAVE.\n\nSTART ALL SLAVES\n----------------\n\nSTART ALL SLAVES starts all configured replicas (replicas with master_host not\nempty) that were not started before. It will give a note for all started\nconnections. You can check the notes with SHOW WARNINGS.\n\nSTART REPLICA\n-------------\n\nMariaDB starting with 10.5.1\n----------------------------\nSTART REPLICA is an alias for START SLAVE from MariaDB 10.5.1.\n\nURL: https://mariadb.com/kb/en/start-replica/','','https://mariadb.com/kb/en/start-replica/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (816,49,'STOP SLAVE','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nSTOP SLAVE [\"connection_name\"] [thread_type [, thread_type] ... ] [FOR CHANNEL\n\"connection_name\"]\n\nSTOP ALL SLAVES [thread_type [, thread_type]]\n\nSTOP REPLICA [\"connection_name\"] [thread_type [, thread_type] ... ] -- from\n10.5.1\n\nSTOP ALL REPLICAS [thread_type [, thread_type]] -- from 10.5.1\n\nthread_type: IO_THREAD | SQL_THREAD\n\nDescription\n-----------\n\nStops the replica threads. STOP SLAVE requires the SUPER privilege, or, from\nMariaDB 10.5.2, the REPLICATION SLAVE ADMIN privilege.\n\nLike START SLAVE, this statement may be used with the IO_THREAD and SQL_THREAD\noptions to name the thread or threads to be stopped. In almost all cases, one\nnever need to use the thread_type options.\n\nSTOP SLAVE waits until any current replication event group affecting one or\nmore non-transactional tables has finished executing (if there is any such\nreplication group), or until the user issues a KILL QUERY or KILL CONNECTION\nstatement.\n\nNote that STOP SLAVE doesn\'t delete the connection permanently. Next time you\nexecute START SLAVE or the MariaDB server restarts, the replica connection is\nrestored with it\'s original arguments. If you want to delete a connection, you\nshould execute RESET SLAVE.\n\nSTOP ALL SLAVES\n---------------\n\nSTOP ALL SLAVES stops all your running replicas. It will give you a note for\nevery stopped connection. You can check the notes with SHOW WARNINGS.\n\nconnection_name\n---------------\n\nThe connection_name option is used for multi-source replication.\n\nIf there is only one nameless master, or the default master (as specified by\nthe default_master_connection system variable) is intended, connection_name\ncan be omitted. If provided, the STOP SLAVE statement will apply to the\nspecified master. connection_name is case-insensitive.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after STOP SLAVE.\n\nSTOP REPLICA\n------------\n\nMariaDB starting with 10.5.1\n----------------------------\nSTOP REPLICA is an alias for STOP SLAVE from MariaDB 10.5.1.\n\nURL: https://mariadb.com/kb/en/stop-replica/','','https://mariadb.com/kb/en/stop-replica/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (817,49,'RESET REPLICA/SLAVE','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nRESET REPLICA [\"connection_name\"] [ALL] [FOR CHANNEL \"connection_name\"] --\nfrom MariaDB 10.5.1 \nRESET SLAVE [\"connection_name\"] [ALL] [FOR CHANNEL \"connection_name\"]\n\nDescription\n-----------\n\nRESET REPLICA/SLAVE makes the replica forget its replication position in the\nmaster\'s binary log. This statement is meant to be used for a clean start. It\ndeletes the master.info and relay-log.info files, all the relay log files, and\nstarts a new relay log file. To use RESET REPLICA/SLAVE, the replica threads\nmust be stopped (use STOP REPLICA/SLAVE if necessary).\n\nNote: All relay log files are deleted, even if they have not been completely\nexecuted by the slave SQL thread. (This is a condition likely to exist on a\nreplication slave if you have issued a STOP REPLICA/SLAVE statement or if the\nslave is highly loaded.)\n\nNote: RESET REPLICA does not reset the global gtid_slave_pos variable. This\nmeans that a replica server configured with CHANGE MASTER TO\nMASTER_USE_GTID=slave_pos will not receive events with GTIDs occurring before\nthe state saved in gtid_slave_pos. If the intent is to reprocess these events,\ngtid_slave_pos must be manually reset, e.g. by executing set global\ngtid_slave_pos=\"\".\n\nConnection information stored in the master.info file is immediately reset\nusing any values specified in the corresponding startup options. This\ninformation includes values such as master host, master port, master user, and\nmaster password. If the replica SQL thread was in the middle of replicating\ntemporary tables when it was stopped, and RESET REPLICA/SLAVE is issued, these\nreplicated temporary tables are deleted on the slave.\n\nThe ALL also resets the PORT, HOST, USER and PASSWORD parameters for the\nslave. If you are using a connection name, it will permanently delete it and\nit will not show up anymore in SHOW ALL REPLICAS/SLAVE STATUS.\n\nconnection_name\n---------------\n\nThe connection_name option is used for multi-source replication.\n\nIf there is only one nameless primary, or the default primary (as specified by\nthe default_master_connection system variable) is intended, connection_name\ncan be omitted. If provided, the RESET REPLICA/SLAVE statement will apply to\nthe specified primary. connection_name is case-insensitive.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after RESET REPLICA.\n\nRESET REPLICA\n-------------\n\nMariaDB starting with 10.5.1\n----------------------------\nRESET REPLICA is an alias for RESET SLAVE from MariaDB 10.5.1.\n\nURL: https://mariadb.com/kb/en/reset-replica/','','https://mariadb.com/kb/en/reset-replica/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (818,49,'RESET MASTER','RESET MASTER [TO #]\n\nDeletes all binary log files listed in the index file, resets the binary log\nindex file to be empty, and creates a new binary log file with a suffix of\n.000001.\n\nIf TO # is given, then the first new binary log file will start from number #.\n\nThis statement is for use only when the master is started for the first time,\nand should never be used if any slaves are actively replicating from the\nbinary log.\n\nURL: https://mariadb.com/kb/en/reset-master/','','https://mariadb.com/kb/en/reset-master/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (819,50,'EXECUTE Statement','Syntax\n------\n\nEXECUTE stmt_name\n [USING expression[, expression] ...]\n\nMariaDB starting with 10.2.3\n----------------------------\nEXECUTE with expression as parameters was introduced in MariaDB 10.2.3. Before\nthat one could only use variables (@var_name) as parameters.\n\nDescription\n-----------\n\nAfter preparing a statement with PREPARE, you execute it with an EXECUTE\nstatement that refers to the prepared statement name. If the prepared\nstatement contains any parameter markers, you must supply a USING clause that\nlists user variables containing the values to be bound to the parameters.\nParameter values can be supplied only by user variables, and the USING clause\nmust name exactly as many variables as the number of parameter markers in the\nstatement.\n\nYou can execute a given prepared statement multiple times, passing different\nvariables to it or setting the variables to different values before each\nexecution.\n\nIf the specified statement has not been PREPAREd, an error similar to the\nfollowing is produced:\n\nERROR 1243 (HY000): Unknown prepared statement handler (stmt_name) given to\nEXECUTE\n\nExample\n-------\n\nSee example in PREPARE.\n\nURL: https://mariadb.com/kb/en/execute-statement/','','https://mariadb.com/kb/en/execute-statement/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (820,50,'PREPARE Statement','Syntax\n------\n\nPREPARE stmt_name FROM preparable_stmt\n\nDescription\n-----------\n\nThe PREPARE statement prepares a statement and assigns it a name, stmt_name,\nby which to refer to the statement later. Statement names are not case\nsensitive. preparable_stmt is either a string literal or a user variable (not\na local variable, an SQL expression or a subquery) that contains the text of\nthe statement. The text must represent a single SQL statement, not multiple\nstatements. Within the statement, \"?\" characters can be used as parameter\nmarkers to indicate where data values are to be bound to the query later when\nyou execute it. The \"?\" characters should not be enclosed within quotes, even\nif you intend to bind them to string values. Parameter markers can be used\nonly where expressions should appear, not for SQL keywords, identifiers, and\nso forth.\n\nThe scope of a prepared statement is the session within which it is created.\nOther sessions cannot see it.\n\nIf a prepared statement with the given name already exists, it is deallocated\nimplicitly before the new statement is prepared. This means that if the new\nstatement contains an error and cannot be prepared, an error is returned and\nno statement with the given name exists.\n\nPrepared statements can be PREPAREd and EXECUTEd in a stored procedure, but\nnot in a stored function or trigger. Also, even if the statement is PREPAREd\nin a procedure, it will not be deallocated when the procedure execution ends.\n\nA prepared statement can access user-defined variables, but not local\nvariables or procedure\'s parameters.\n\nIf the prepared statement contains a syntax error, PREPARE will fail. As a\nside effect, stored procedures can use it to check if a statement is valid.\nFor example:\n\nCREATE PROCEDURE `test_stmt`(IN sql_text TEXT)\nBEGIN\n DECLARE EXIT HANDLER FOR SQLEXCEPTION\n BEGIN\n SELECT CONCAT(sql_text, \' is not valid\');\n END;\n SET @SQL := sql_text;\n PREPARE stmt FROM @SQL;\n DEALLOCATE PREPARE stmt;\nEND;\n\nThe FOUND_ROWS() and ROW_COUNT() functions, if called immediatly after\nEXECUTE, return the number of rows read or affected by the prepared\nstatements; however, if they are called after DEALLOCATE PREPARE, they provide\ninformation about this statement. If the prepared statement produces errors or\nwarnings, GET DIAGNOSTICS return information about them. DEALLOCATE PREPARE\nshouldn\'t clear the diagnostics area, unless it produces an error.\n\nA prepared statement is executed with EXECUTE and released with DEALLOCATE\nPREPARE.\n\nThe max_prepared_stmt_count server system variable determines the number of\nallowed prepared statements that can be prepared on the server. If it is set\nto 0, prepared statements are not allowed. If the limit is reached, an error\nsimilar to the following will be produced:\n\nERROR 1461 (42000): Can\'t create more than max_prepared_stmt_count statements \n (current value: 0)\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, PREPARE stmt FROM \'SELECT :1, :2\' is used,\ninstead of ?.\n\nPermitted Statements\n--------------------\n\nMariaDB starting with 10.6.2\n----------------------------\nAll statements can be prepared, except PREPARE, EXECUTE, and DEALLOCATE / DROP\nPREPARE.\n\nPrior to this, not all statements can be prepared. Only the following SQL\ncommands are permitted:\n\n* ALTER TABLE\n* ANALYZE TABLE\n* BINLOG\n* CACHE INDEX\n* CALL\n* CHANGE MASTER\n* CHECKSUM {TABLE | TABLES}\n* COMMIT\n* {CREATE | DROP} DATABASE\n* {CREATE | DROP} INDEX\n* {CREATE | RENAME | DROP} TABLE\n* {CREATE | RENAME | DROP} USER\n* {CREATE | DROP} VIEW\n* DELETE\n* DESCRIBE\n* DO\n* EXPLAIN\n* FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES | LOGS |\nSTATUS | \n MASTER | SLAVE | DES_KEY_FILE | USER_RESOURCES | QUERY CACHE |\nTABLE_STATISTICS | \n INDEX_STATISTICS | USER_STATISTICS | CLIENT_STATISTICS}\n* GRANT\n* INSERT\n* INSTALL {PLUGIN | SONAME}\n* HANDLER READ\n* KILL\n* LOAD INDEX INTO CACHE\n* OPTIMIZE TABLE\n* REPAIR TABLE\n* REPLACE\n* RESET {MASTER | SLAVE | QUERY CACHE}\n* REVOKE\n* ROLLBACK\n* SELECT\n* SET\n* SET GLOBAL SQL_SLAVE_SKIP_COUNTER\n* SET ROLE\n* SET SQL_LOG_BIN\n* SET TRANSACTION ISOLATION LEVEL\n* SHOW EXPLAIN\n* SHOW {DATABASES | TABLES | OPEN TABLES | TABLE STATUS | COLUMNS | INDEX |\nTRIGGERS | \n EVENTS | GRANTS | CHARACTER SET | COLLATION | ENGINES | PLUGINS [SONAME] |\nPRIVILEGES | \n PROCESSLIST | PROFILE | PROFILES | VARIABLES | STATUS | WARNINGS | ERRORS |\n TABLE_STATISTICS | INDEX_STATISTICS | USER_STATISTICS | CLIENT_STATISTICS |\nAUTHORS | \n CONTRIBUTORS}\n* SHOW CREATE {DATABASE | TABLE | VIEW | PROCEDURE | FUNCTION | TRIGGER |\nEVENT}\n* SHOW {FUNCTION | PROCEDURE} CODE\n* SHOW BINLOG EVENTS\n* SHOW SLAVE HOSTS\n* SHOW {MASTER | BINARY} LOGS\n* SHOW {MASTER | SLAVE | TABLES | INNODB | FUNCTION | PROCEDURE} STATUS\n* SLAVE {START | STOP}\n* TRUNCATE TABLE\n* SHUTDOWN\n* UNINSTALL {PLUGIN | SONAME}\n* UPDATE\n\nSynonyms are not listed here, but can be used. For example, DESC can be used\ninstead of DESCRIBE.\n\nCompound statements can be prepared too.\n\nNote that if a statement can be run in a stored routine, it will work even if\nit is called by a prepared statement. For example, SIGNAL can\'t be directly\nprepared. However, it is allowed in stored routines. If the x() procedure\ncontains SIGNAL, you can still prepare and execute the \'CALL x();\' prepared\nstatement.\n\nPREPARE supports most kinds of expressions as well, for example:\n\nPREPARE stmt FROM CONCAT(\'SELECT * FROM \', table_name);\n\nWhen PREPARE is used with a statement which is not supported, the following\nerror is produced:\n\nERROR 1295 (HY000): This command is not supported in the prepared statement\nprotocol yet\n\nExample\n-------\n\ncreate table t1 (a int,b char(10));\ninsert into t1 values (1,\"one\"),(2, \"two\"),(3,\"three\");\nprepare test from \"select * from t1 where a=?\";\nset @param=2;\nexecute test using @param;\n+------+------+\n| a | b |\n+------+------+\n| 2 | two |\n+------+------+\nset @param=3;\nexecute test using @param;\n+------+-------+\n| a | b |\n+------+-------+\n| 3 | three |\n+------+-------+\ndeallocate prepare test;\n\nSince identifiers are not permitted as prepared statements parameters,\nsometimes it is necessary to dynamically compose an SQL statement. This\ntechnique is called dynamic SQL). The following example shows how to use\ndynamic SQL:\n\nCREATE PROCEDURE test.stmt_test(IN tab_name VARCHAR(64))\nBEGIN\n SET @sql = CONCAT(\'SELECT COUNT(*) FROM \', tab_name);\n PREPARE stmt FROM @sql;\n EXECUTE stmt;\n DEALLOCATE PREPARE stmt;\nEND;\n\nCALL test.stmt_test(\'mysql.user\');\n+----------+\n| COUNT(*) |\n+----------+\n| 4 |\n+----------+\n\nUse of variables in prepared statements:\n\nPREPARE stmt FROM \'SELECT @x;\';\n\nSET @x = 1;\n\nEXECUTE stmt;\n+------+\n| @x |\n+------+\n| 1 |\n+------+\n\nSET @x = 0;\n\nEXECUTE stmt;\n+------+\n| @x |\n+------+\n| 0 |\n+------+\n\nDEALLOCATE PREPARE stmt;\n\nURL: https://mariadb.com/kb/en/prepare-statement/','','https://mariadb.com/kb/en/prepare-statement/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (821,50,'DEALLOCATE / DROP PREPARE','Syntax\n------\n\n{DEALLOCATE | DROP} PREPARE stmt_name\n\nDescription\n-----------\n\nTo deallocate a prepared statement produced with PREPARE, use a DEALLOCATE\nPREPARE statement that refers to the prepared statement name.\n\nA prepared statement is implicitly deallocated when a new PREPARE command is\nissued. In that case, there is no need to use DEALLOCATE.\n\nAttempting to execute a prepared statement after deallocating it results in an\nerror, as if it was not prepared at all:\n\nERROR 1243 (HY000): Unknown prepared statement handler (stmt_name) given to\nEXECUTE\n\nIf the specified statement has not been PREPAREd, an error similar to the\nfollowing will be produced:\n\nERROR 1243 (HY000): Unknown prepared statement handler (stmt_name) given to\nDEALLOCATE PREPARE\n\nExample\n-------\n\nSee example in PREPARE.\n\nURL: https://mariadb.com/kb/en/deallocate-drop-prepare/','','https://mariadb.com/kb/en/deallocate-drop-prepare/');
-insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (822,50,'EXECUTE IMMEDIATE','MariaDB starting with 10.2.3\n----------------------------\nEXECUTE IMMEDIATE was introduced in MariaDB 10.2.3.\n\nSyntax\n------\n\nEXECUTE IMMEDIATE statement\n\nDescription\n-----------\n\nEXECUTE IMMEDIATE executes a dynamic SQL statement created on the fly, which\ncan reduce performance overhead.\n\nFor example:\n\nEXECUTE IMMEDIATE \'SELECT 1\'\n\nwhich is shorthand for:\n\nprepare stmt from \"select 1\";\nexecute stmt;\ndeallocate prepare stmt;\n\nEXECUTE IMMEDIATE supports complex expressions as prepare source and\nparameters:\n\nEXECUTE IMMEDIATE CONCAT(\'SELECT COUNT(*) FROM \', \'t1\', \' WHERE a=?\') USING\n5+5;\n\nLimitations: subselects and stored function calls are not supported as a\nprepare source.\n\nThe following examples return an error:\n\nCREATE OR REPLACE FUNCTION f1() RETURNS VARCHAR(64) RETURN \'SELECT * FROM t1\';\nEXECUTE IMMEDIATE f1();\nERROR 1970 (42000): EXECUTE IMMEDIATE does not support subqueries or stored\nfunctions\n\nEXECUTE IMMEDIATE (SELECT \'SELECT * FROM t1\');\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual\nthat \n corresponds to your MariaDB server version for the right syntax to use near\n \'SELECT \'SELECT * FROM t1\')\' at line 1\n\nCREATE OR REPLACE FUNCTION f1() RETURNS INT RETURN 10;\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING f1();\nERROR 1970 (42000): EXECUTE..USING does not support subqueries or stored\nfunctions\n\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING (SELECT 10);\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual\nthat \n corresponds to your MariaDB server version for the right syntax to use near\n \'SELECT 10)\' at line 1\n\nOne can use a user or an SP variable as a workaround:\n\nCREATE OR REPLACE FUNCTION f1() RETURNS VARCHAR(64) RETURN \'SELECT * FROM t1\';\nSET @stmt=f1();\nEXECUTE IMMEDIATE @stmt;\n\nSET @stmt=(SELECT \'SELECT 1\');\nEXECUTE IMMEDIATE @stmt;\n\nCREATE OR REPLACE FUNCTION f1() RETURNS INT RETURN 10;\nSET @param=f1();\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING @param;\n\nSET @param=(SELECT 10);\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING @param;\n\nEXECUTE IMMEDIATE supports user variables and SP variables as OUT parameters\n\nDELIMITER $$\nCREATE OR REPLACE PROCEDURE p1(OUT a INT)\nBEGIN\n SET a:= 10;\nEND;\n$$\nDELIMITER ;\nSET @a=2;\nEXECUTE IMMEDIATE \'CALL p1(?)\' USING @a;\nSELECT @a;\n+------+\n| @a |\n+------+\n| 10 |\n+------+\n\nSimilar to PREPARE, EXECUTE IMMEDIATE is allowed in stored procedures but is\nnot allowed in stored functions.\n\nThis example uses EXECUTE IMMEDIATE inside a stored procedure:\n\nDELIMITER $$\nCREATE OR REPLACE PROCEDURE p1()\nBEGIN\n EXECUTE IMMEDIATE \'SELECT 1\';\nEND;\n$$\nDELIMITER ;\nCALL p1;\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n\nThis script returns an error:\n\nDELIMITER $$\nCREATE FUNCTION f1() RETURNS INT\nBEGIN\n EXECUTE IMMEDIATE \'DO 1\';\n RETURN 1;\nEND;\n$$\nERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger\n\nEXECUTE IMMEDIATE can use DEFAULT and IGNORE indicators as bind parameters:\n\nCREATE OR REPLACE TABLE t1 (a INT DEFAULT 10);\nEXECUTE IMMEDIATE \'INSERT INTO t1 VALUES (?)\' USING DEFAULT;\nSELECT * FROM t1;\n+------+\n| a |\n+------+\n| 10 |\n+------+\n\nEXECUTE IMMEDIATE increments the Com_execute_immediate status variable, as\nwell as the Com_stmt_prepare, Com_stmt_execute and Com_stmt_close status\nvariables.\n\nNote, EXECUTE IMMEDIATE does not increment the Com_execute_sql status\nvariable. Com_execute_sql is used only for PREPARE..EXECUTE.\n\nThis session screenshot demonstrates how EXECUTE IMMEDIATE affects status\nvariables:\n\nSELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME RLIKE \n (\'COM_(EXECUTE|STMT_PREPARE|STMT_EXECUTE|STMT_CLOSE)\');\n\n+-----------------------+----------------+\n| VARIABLE_NAME | VARIABLE_VALUE |\n+-----------------------+----------------+\n| COM_EXECUTE_IMMEDIATE | 0 |\n| COM_EXECUTE_SQL | 0 |\n| COM_STMT_CLOSE | 0 |\n| COM_STMT_EXECUTE | 0 |\n| COM_STMT_PREPARE | 0 |\n+-----------------------+----------------+\n\nEXECUTE IMMEDIATE \'SELECT 1\';\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n\nSELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME RLIKE \n (\'COM_(EXECUTE|STMT_PREPARE|STMT_EXECUTE|STMT_CLOSE)\');\n+-----------------------+----------------+\n| VARIABLE_NAME | VARIABLE_VALUE |\n+-----------------------+----------------+\n| COM_EXECUTE_IMMEDIATE | 1 |\n| COM_EXECUTE_SQL | 0 |\n| COM_STMT_CLOSE | 1 |\n| COM_STMT_EXECUTE | 1 |\n| COM_STMT_PREPARE | 1 |\n+-----------------------+----------------+\n\nURL: https://mariadb.com/kb/en/execute-immediate/','','https://mariadb.com/kb/en/execute-immediate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (54,4,'CRC32C','MariaDB starting with 10.8\n--------------------------\nIntroduced in MariaDB 10.8.0 to compute a cyclic redundancy check (CRC) value\nusing the Castagnoli polynomial.\n\nSyntax\n------\n\nCRC32C([par,]expr)\n\nDescription\n-----------\n\nMariaDB has always included a native unary function CRC32() that computes the\nCRC-32 of a string using the ISO 3309 polynomial that used by zlib and many\nothers.\n\nInnoDB and MyRocks use a different polynomial, which was implemented in SSE4.2\ninstructions that were introduced in the Intel Nehalem microarchitecture. This\nis commonly called CRC-32C (Castagnoli).\n\nThe CRC32C function uses the Castagnoli polynomial.\n\nThis allows SELECT…INTO DUMPFILE to be used for the creation of files with\nvalid checksums, such as a logically empty InnoDB redo log file ib_logfile0\ncorresponding to a particular log sequence number.\n\nThe optional parameter allows the checksum to be computed in pieces:\nCRC32C(\'MariaDB\')=CRC32C(CRC32C(\'Maria\'),\'DB\').\n\nExamples\n--------\n\nSELECT CRC32C(\'MariaDB\');\n+-------------------+\n| CRC32C(\'MariaDB\') |\n+-------------------+\n| 809606978 |\n+-------------------+\n\nSELECT CRC32C(CRC32C(\'Maria\'),\'DB\');\n+------------------------------+\n| CRC32C(CRC32C(\'Maria\'),\'DB\') |\n+------------------------------+\n| 809606978 |\n+------------------------------+\n\nURL: https://mariadb.com/kb/en/crc32c/','','https://mariadb.com/kb/en/crc32c/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (55,4,'DEGREES','Syntax\n------\n\nDEGREES(X)\n\nDescription\n-----------\n\nReturns the argument X, converted from radians to degrees.\n\nThis is the converse of the RADIANS() function.\n\nExamples\n--------\n\nSELECT DEGREES(PI());\n+---------------+\n| DEGREES(PI()) |\n+---------------+\n| 180 |\n+---------------+\n\nSELECT DEGREES(PI() / 2);\n+-------------------+\n| DEGREES(PI() / 2) |\n+-------------------+\n| 90 |\n+-------------------+\n\nSELECT DEGREES(45);\n+-----------------+\n| DEGREES(45) |\n+-----------------+\n| 2578.3100780887 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/degrees/','','https://mariadb.com/kb/en/degrees/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (56,4,'EXP','Syntax\n------\n\nEXP(X)\n\nDescription\n-----------\n\nReturns the value of e (the base of natural logarithms) raised to the power of\nX. The inverse of this function is LOG() (using a single argument only) or\nLN().\n\nIf X is NULL, this function returns NULL.\n\nExamples\n--------\n\nSELECT EXP(2);\n+------------------+\n| EXP(2) |\n+------------------+\n| 7.38905609893065 |\n+------------------+\n\nSELECT EXP(-2);\n+--------------------+\n| EXP(-2) |\n+--------------------+\n| 0.1353352832366127 |\n+--------------------+\n\nSELECT EXP(0);\n+--------+\n| EXP(0) |\n+--------+\n| 1 |\n+--------+\n\nSELECT EXP(NULL);\n+-----------+\n| EXP(NULL) |\n+-----------+\n| NULL |\n+-----------+\n\nURL: https://mariadb.com/kb/en/exp/','','https://mariadb.com/kb/en/exp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (57,4,'FLOOR','Syntax\n------\n\nFLOOR(X)\n\nDescription\n-----------\n\nReturns the largest integer value not greater than X.\n\nExamples\n--------\n\nSELECT FLOOR(1.23);\n+-------------+\n| FLOOR(1.23) |\n+-------------+\n| 1 |\n+-------------+\n\nSELECT FLOOR(-1.23);\n+--------------+\n| FLOOR(-1.23) |\n+--------------+\n| -2 |\n+--------------+\n\nURL: https://mariadb.com/kb/en/floor/','','https://mariadb.com/kb/en/floor/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (58,4,'LN','Syntax\n------\n\nLN(X)\n\nDescription\n-----------\n\nReturns the natural logarithm of X; that is, the base-e logarithm of X. If X\nis less than or equal to 0, or NULL, then NULL is returned.\n\nThe inverse of this function is EXP().\n\nExamples\n--------\n\nSELECT LN(2);\n+-------------------+\n| LN(2) |\n+-------------------+\n| 0.693147180559945 |\n+-------------------+\n\nSELECT LN(-2);\n+--------+\n| LN(-2) |\n+--------+\n| NULL |\n+--------+\n\nURL: https://mariadb.com/kb/en/ln/','','https://mariadb.com/kb/en/ln/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (59,4,'LOG','Syntax\n------\n\nLOG(X), LOG(B,X)\n\nDescription\n-----------\n\nIf called with one parameter, this function returns the natural logarithm of\nX. If X is less than or equal to 0, then NULL is returned.\n\nIf called with two parameters, it returns the logarithm of X to the base B. If\nB is <= 1 or X <= 0, the function returns NULL.\n\nIf any argument is NULL, the function returns NULL.\n\nThe inverse of this function (when called with a single argument) is the EXP()\nfunction.\n\nExamples\n--------\n\nLOG(X):\n\nSELECT LOG(2);\n+-------------------+\n| LOG(2) |\n+-------------------+\n| 0.693147180559945 |\n+-------------------+\n\nSELECT LOG(-2);\n+---------+\n| LOG(-2) |\n+---------+\n| NULL |\n+---------+\n\nLOG(B,X)\n\nSELECT LOG(2,16);\n+-----------+\n| LOG(2,16) |\n+-----------+\n| 4 |\n+-----------+\n\nSELECT LOG(3,27);\n+-----------+\n| LOG(3,27) |\n+-----------+\n| 3 |\n+-----------+\n\nSELECT LOG(3,1);\n+----------+\n| LOG(3,1) |\n+----------+\n| 0 |\n+----------+\n\nSELECT LOG(3,0);\n+----------+\n| LOG(3,0) |\n+----------+\n| NULL |\n+----------+\n\nURL: https://mariadb.com/kb/en/log/','','https://mariadb.com/kb/en/log/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (60,4,'LOG10','Syntax\n------\n\nLOG10(X)\n\nDescription\n-----------\n\nReturns the base-10 logarithm of X.\n\nExamples\n--------\n\nSELECT LOG10(2);\n+-------------------+\n| LOG10(2) |\n+-------------------+\n| 0.301029995663981 |\n+-------------------+\n\nSELECT LOG10(100);\n+------------+\n| LOG10(100) |\n+------------+\n| 2 |\n+------------+\n\nSELECT LOG10(-100);\n+-------------+\n| LOG10(-100) |\n+-------------+\n| NULL |\n+-------------+\n\nURL: https://mariadb.com/kb/en/log10/','','https://mariadb.com/kb/en/log10/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (61,4,'LOG2','Syntax\n------\n\nLOG2(X)\n\nDescription\n-----------\n\nReturns the base-2 logarithm of X.\n\nExamples\n--------\n\nSELECT LOG2(4398046511104);\n+---------------------+\n| LOG2(4398046511104) |\n+---------------------+\n| 42 |\n+---------------------+\n\nSELECT LOG2(65536);\n+-------------+\n| LOG2(65536) |\n+-------------+\n| 16 |\n+-------------+\n\nSELECT LOG2(-100);\n+------------+\n| LOG2(-100) |\n+------------+\n| NULL |\n+------------+\n\nURL: https://mariadb.com/kb/en/log2/','','https://mariadb.com/kb/en/log2/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (62,4,'MOD','Syntax\n------\n\nMOD(N,M), N % M, N MOD M\n\nDescription\n-----------\n\nModulo operation. Returns the remainder of N divided by M. See also Modulo\nOperator.\n\nIf the ERROR_ON_DIVISION_BY_ZERO SQL_MODE is used, any number modulus zero\nproduces an error. Otherwise, it returns NULL.\n\nThe integer part of a division can be obtained using DIV.\n\nExamples\n--------\n\nSELECT 1042 % 50;\n+-----------+\n| 1042 % 50 |\n+-----------+\n| 42 |\n+-----------+\n\nSELECT MOD(234, 10);\n+--------------+\n| MOD(234, 10) |\n+--------------+\n| 4 |\n+--------------+\n\nSELECT 253 % 7;\n+---------+\n| 253 % 7 |\n+---------+\n| 1 |\n+---------+\n\nSELECT MOD(29,9);\n+-----------+\n| MOD(29,9) |\n+-----------+\n| 2 |\n+-----------+\n\nSELECT 29 MOD 9;\n+----------+\n| 29 MOD 9 |\n+----------+\n| 2 |\n+----------+\n\nURL: https://mariadb.com/kb/en/mod/','','https://mariadb.com/kb/en/mod/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (63,4,'OCT','Syntax\n------\n\nOCT(N)\n\nDescription\n-----------\n\nReturns a string representation of the octal value of N, where N is a longlong\n(BIGINT) number. This is equivalent to CONV(N,10,8). Returns NULL if N is NULL.\n\nExamples\n--------\n\nSELECT OCT(34);\n+---------+\n| OCT(34) |\n+---------+\n| 42 |\n+---------+\n\nSELECT OCT(12);\n+---------+\n| OCT(12) |\n+---------+\n| 14 |\n+---------+\n\nURL: https://mariadb.com/kb/en/oct/','','https://mariadb.com/kb/en/oct/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (64,4,'PI','Syntax\n------\n\nPI()\n\nDescription\n-----------\n\nReturns the value of π (pi). The default number of decimal places displayed is\nsix, but MariaDB uses the full double-precision value internally.\n\nExamples\n--------\n\nSELECT PI();\n+----------+\n| PI() |\n+----------+\n| 3.141593 |\n+----------+\n\nSELECT PI()+0.0000000000000000000000;\n+-------------------------------+\n| PI()+0.0000000000000000000000 |\n+-------------------------------+\n| 3.1415926535897931159980 |\n+-------------------------------+\n\nURL: https://mariadb.com/kb/en/pi/','','https://mariadb.com/kb/en/pi/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (65,4,'POW','Syntax\n------\n\nPOW(X,Y)\n\nDescription\n-----------\n\nReturns the value of X raised to the power of Y.\n\nPOWER() is a synonym.\n\nExamples\n--------\n\nSELECT POW(2,3);\n+----------+\n| POW(2,3) |\n+----------+\n| 8 |\n+----------+\n\nSELECT POW(2,-2);\n+-----------+\n| POW(2,-2) |\n+-----------+\n| 0.25 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/pow/','','https://mariadb.com/kb/en/pow/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (66,4,'POWER','Syntax\n------\n\nPOWER(X,Y)\n\nDescription\n-----------\n\nThis is a synonym for POW(), which returns the value of X raised to the power\nof Y.\n\nURL: https://mariadb.com/kb/en/power/','','https://mariadb.com/kb/en/power/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (67,4,'RADIANS','Syntax\n------\n\nRADIANS(X)\n\nDescription\n-----------\n\nReturns the argument X, converted from degrees to radians. Note that π radians\nequals 180 degrees.\n\nThis is the converse of the DEGREES() function.\n\nExamples\n--------\n\nSELECT RADIANS(45);\n+-------------------+\n| RADIANS(45) |\n+-------------------+\n| 0.785398163397448 |\n+-------------------+\n\nSELECT RADIANS(90);\n+-----------------+\n| RADIANS(90) |\n+-----------------+\n| 1.5707963267949 |\n+-----------------+\n\nSELECT RADIANS(PI());\n+--------------------+\n| RADIANS(PI()) |\n+--------------------+\n| 0.0548311355616075 |\n+--------------------+\n\nSELECT RADIANS(180);\n+------------------+\n| RADIANS(180) |\n+------------------+\n| 3.14159265358979 |\n+------------------+\n\nURL: https://mariadb.com/kb/en/radians/','','https://mariadb.com/kb/en/radians/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (68,4,'RAND','Syntax\n------\n\nRAND(), RAND(N)\n\nDescription\n-----------\n\nReturns a random DOUBLE precision floating point value v in the range 0 <= v <\n1.0. If a constant integer argument N is specified, it is used as the seed\nvalue, which produces a repeatable sequence of column values. In the example\nbelow, note that the sequences of values produced by RAND(3) is the same both\nplaces where it occurs.\n\nIn a WHERE clause, RAND() is evaluated each time the WHERE is executed.\n\nStatements using the RAND() function are not safe for statement-based\nreplication.\n\nPractical uses\n--------------\n\nThe expression to get a random integer from a given range is the following:\n\nFLOOR(min_value + RAND() * (max_value - min_value +1))\n\nRAND() is often used to read random rows from a table, as follows:\n\nSELECT * FROM my_table ORDER BY RAND() LIMIT 10;\n\nNote, however, that this technique should never be used on a large table as it\nwill be extremely slow. MariaDB will read all rows in the table, generate a\nrandom value for each of them, order them, and finally will apply the LIMIT\nclause.\n\nExamples\n--------\n\nCREATE TABLE t (i INT);\n\nINSERT INTO t VALUES(1),(2),(3);\n\nSELECT i, RAND() FROM t;\n+------+-------------------+\n| i | RAND() |\n+------+-------------------+\n| 1 | 0.255651095188829 |\n| 2 | 0.833920199269355 |\n| 3 | 0.40264774151393 |\n+------+-------------------+\n\nSELECT i, RAND(3) FROM t;\n+------+-------------------+\n| i | RAND(3) |\n+------+-------------------+\n| 1 | 0.90576975597606 |\n| 2 | 0.373079058130345 |\n| 3 | 0.148086053457191 |\n+------+-------------------+\n\nSELECT i, RAND() FROM t;\n+------+-------------------+\n| i | RAND() |\n+------+-------------------+\n| 1 | 0.511478140495232 |\n| 2 | 0.349447508668012 |\n| 3 | 0.212803152588013 |\n+------+-------------------+\n\nUsing the same seed, the same sequence will be returned:\n\nSELECT i, RAND(3) FROM t;\n+------+-------------------+\n| i | RAND(3) |\n+------+-------------------+\n| 1 | 0.90576975597606 |\n| 2 | 0.373079058130345 |\n| 3 | 0.148086053457191 |\n+------+-------------------+\n\nGenerating a random number from 5 to 15:\n\nSELECT FLOOR(5 + (RAND() * 11));\n\nURL: https://mariadb.com/kb/en/rand/','','https://mariadb.com/kb/en/rand/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (69,4,'ROUND','Syntax\n------\n\nROUND(X), ROUND(X,D)\n\nDescription\n-----------\n\nRounds the argument X to D decimal places. D defaults to 0 if not specified. D\ncan be negative to cause D digits left of the decimal point of the value X to\nbecome zero.\n\nThe rounding algorithm depends on the data type of X:\n\n* for floating point types (FLOAT, DOUBLE) the C libraries rounding function\nis used, so the behavior *may* differ between operating systems\n* for fixed point types (DECIMAL, DEC/NUMBER/FIXED) the \"round half up\" rule\nis used, meaning that e.g. a value ending in exactly .5 is always rounded up.\n\nExamples\n--------\n\nSELECT ROUND(-1.23);\n+--------------+\n| ROUND(-1.23) |\n+--------------+\n| -1 |\n+--------------+\n\nSELECT ROUND(-1.58);\n+--------------+\n| ROUND(-1.58) |\n+--------------+\n| -2 |\n+--------------+\n\nSELECT ROUND(1.58); \n+-------------+\n| ROUND(1.58) |\n+-------------+\n| 2 |\n+-------------+\n\nSELECT ROUND(1.298, 1);\n+-----------------+\n| ROUND(1.298, 1) |\n+-----------------+\n| 1.3 |\n+-----------------+\n\nSELECT ROUND(1.298, 0);\n+-----------------+\n| ROUND(1.298, 0) |\n+-----------------+\n| 1 |\n+-----------------+\n\nSELECT ROUND(23.298, -1);\n+-------------------+\n| ROUND(23.298, -1) |\n+-------------------+\n| 20 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/round/','','https://mariadb.com/kb/en/round/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (70,4,'SIGN','Syntax\n------\n\nSIGN(X)\n\nDescription\n-----------\n\nReturns the sign of the argument as -1, 0, or 1, depending on whether X is\nnegative, zero, or positive.\n\nExamples\n--------\n\nSELECT SIGN(-32);\n+-----------+\n| SIGN(-32) |\n+-----------+\n| -1 |\n+-----------+\n\nSELECT SIGN(0);\n+---------+\n| SIGN(0) |\n+---------+\n| 0 |\n+---------+\n\nSELECT SIGN(234);\n+-----------+\n| SIGN(234) |\n+-----------+\n| 1 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/sign/','','https://mariadb.com/kb/en/sign/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (71,4,'SIN','Syntax\n------\n\nSIN(X)\n\nDescription\n-----------\n\nReturns the sine of X, where X is given in radians.\n\nExamples\n--------\n\nSELECT SIN(1.5707963267948966);\n+-------------------------+\n| SIN(1.5707963267948966) |\n+-------------------------+\n| 1 |\n+-------------------------+\n\nSELECT SIN(PI());\n+----------------------+\n| SIN(PI()) |\n+----------------------+\n| 1.22460635382238e-16 |\n+----------------------+\n\nSELECT ROUND(SIN(PI()));\n+------------------+\n| ROUND(SIN(PI())) |\n+------------------+\n| 0 |\n+------------------+\n\nURL: https://mariadb.com/kb/en/sin/','','https://mariadb.com/kb/en/sin/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (72,4,'SQRT','Syntax\n------\n\nSQRT(X)\n\nDescription\n-----------\n\nReturns the square root of X. If X is negative, NULL is returned.\n\nExamples\n--------\n\nSELECT SQRT(4);\n+---------+\n| SQRT(4) |\n+---------+\n| 2 |\n+---------+\n\nSELECT SQRT(20);\n+------------------+\n| SQRT(20) |\n+------------------+\n| 4.47213595499958 |\n+------------------+\n\nSELECT SQRT(-16);\n+-----------+\n| SQRT(-16) |\n+-----------+\n| NULL |\n+-----------+\n\nSELECT SQRT(1764);\n+------------+\n| SQRT(1764) |\n+------------+\n| 42 |\n+------------+\n\nURL: https://mariadb.com/kb/en/sqrt/','','https://mariadb.com/kb/en/sqrt/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (73,4,'TAN','Syntax\n------\n\nTAN(X)\n\nDescription\n-----------\n\nReturns the tangent of X, where X is given in radians.\n\nExamples\n--------\n\nSELECT TAN(0.7853981633974483);\n+-------------------------+\n| TAN(0.7853981633974483) |\n+-------------------------+\n| 0.9999999999999999 |\n+-------------------------+\n\nSELECT TAN(PI());\n+-----------------------+\n| TAN(PI()) |\n+-----------------------+\n| -1.22460635382238e-16 |\n+-----------------------+\n\nSELECT TAN(PI()+1);\n+-----------------+\n| TAN(PI()+1) |\n+-----------------+\n| 1.5574077246549 |\n+-----------------+\n\nSELECT TAN(RADIANS(PI()));\n+--------------------+\n| TAN(RADIANS(PI())) |\n+--------------------+\n| 0.0548861508080033 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/tan/','','https://mariadb.com/kb/en/tan/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (74,4,'TRUNCATE','This page documents the TRUNCATE function. See TRUNCATE TABLE for the DDL\nstatement.\n\nSyntax\n------\n\nTRUNCATE(X,D)\n\nDescription\n-----------\n\nReturns the number X, truncated to D decimal places. If D is 0, the result has\nno decimal point or fractional part. D can be negative to cause D digits left\nof the decimal point of the value X to become zero.\n\nExamples\n--------\n\nSELECT TRUNCATE(1.223,1);\n+-------------------+\n| TRUNCATE(1.223,1) |\n+-------------------+\n| 1.2 |\n+-------------------+\n\nSELECT TRUNCATE(1.999,1);\n+-------------------+\n| TRUNCATE(1.999,1) |\n+-------------------+\n| 1.9 |\n+-------------------+\n\nSELECT TRUNCATE(1.999,0); \n+-------------------+\n| TRUNCATE(1.999,0) |\n+-------------------+\n| 1 |\n+-------------------+\n\nSELECT TRUNCATE(-1.999,1);\n+--------------------+\n| TRUNCATE(-1.999,1) |\n+--------------------+\n| -1.9 |\n+--------------------+\n\nSELECT TRUNCATE(122,-2);\n+------------------+\n| TRUNCATE(122,-2) |\n+------------------+\n| 100 |\n+------------------+\n\nSELECT TRUNCATE(10.28*100,0);\n+-----------------------+\n| TRUNCATE(10.28*100,0) |\n+-----------------------+\n| 1028 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/truncate/','','https://mariadb.com/kb/en/truncate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (75,5,'INSTALL PLUGIN','Syntax\n------\n\nINSTALL PLUGIN [IF NOT EXISTS] plugin_name SONAME \'plugin_library\'\n\nDescription\n-----------\n\nThis statement installs an individual plugin from the specified library. To\ninstall the whole library (which could be required), use INSTALL SONAME. See\nalso Installing a Plugin.\n\nplugin_name is the name of the plugin as defined in the plugin declaration\nstructure contained in the library file. Plugin names are not case sensitive.\nFor maximal compatibility, plugin names should be limited to ASCII letters,\ndigits, and underscore, because they are used in C source files, shell command\nlines, M4 and Bourne shell scripts, and SQL environments.\n\nplugin_library is the name of the shared library that contains the plugin\ncode. The file name extension can be omitted (which makes the statement look\nthe same on all architectures).\n\nThe shared library must be located in the plugin directory (that is, the\ndirectory named by the plugin_dir system variable). The library must be in the\nplugin directory itself, not in a subdirectory. By default, plugin_dir is\nplugin directory under the directory named by the pkglibdir configuration\nvariable, but it can be changed by setting the value of plugin_dir at server\nstartup. For example, set its value in a my.cnf file:\n\n[mysqld]\nplugin_dir=/path/to/plugin/directory\nIf the value of plugin_dir is a relative path name, it is taken to be relative\nto the MySQL base directory (the value of the basedir system variable).\n\nINSTALL PLUGIN adds a line to the mysql.plugin table that describes the\nplugin. This table contains the plugin name and library file name.\n\nINSTALL PLUGIN causes the server to read option (my.cnf) files just as during\nserver startup. This enables the plugin to pick up any relevant options from\nthose files. It is possible to add plugin options to an option file even\nbefore loading a plugin (if the loose prefix is used). It is also possible to\nuninstall a plugin, edit my.cnf, and install the plugin again. Restarting the\nplugin this way enables it to the new option values without a server restart.\n\nINSTALL PLUGIN also loads and initializes the plugin code to make the plugin\navailable for use. A plugin is initialized by executing its initialization\nfunction, which handles any setup that the plugin must perform before it can\nbe used.\n\nTo use INSTALL PLUGIN, you must have the INSERT privilege for the mysql.plugin\ntable.\n\nAt server startup, the server loads and initializes any plugin that is listed\nin the mysql.plugin table. This means that a plugin is installed with INSTALL\nPLUGIN only once, not every time the server starts. Plugin loading at startup\ndoes not occur if the server is started with the --skip-grant-tables option.\n\nWhen the server shuts down, it executes the de-initialization function for\neach plugin that is loaded so that the plugin has a chance to perform any\nfinal cleanup.\n\nIf you need to load plugins for a single server startup when the\n--skip-grant-tables option is given (which tells the server not to read system\ntables), use the --plugin-load mysqld option.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nIF NOT EXISTS\n-------------\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a note instead of\nan error if the specified plugin already exists. See SHOW WARNINGS.\n\nExamples\n--------\n\nINSTALL PLUGIN sphinx SONAME \'ha_sphinx.so\';\n\nThe extension can also be omitted:\n\nINSTALL PLUGIN innodb SONAME \'ha_xtradb\';\n\nFrom MariaDB 10.4.0:\n\nINSTALL PLUGIN IF NOT EXISTS example SONAME \'ha_example\';\nQuery OK, 0 rows affected (0.104 sec)\n\nINSTALL PLUGIN IF NOT EXISTS example SONAME \'ha_example\';\nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------+\n| Note | 1968 | Plugin \'example\' already installed |\n+-------+------+------------------------------------+\n\nURL: https://mariadb.com/kb/en/install-plugin/','','https://mariadb.com/kb/en/install-plugin/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (76,5,'UNINSTALL PLUGIN','Syntax\n------\n\nUNINSTALL PLUGIN [IF EXISTS] plugin_name\n\nDescription\n-----------\n\nThis statement removes a single installed plugin. To uninstall the whole\nlibrary which contains the plugin, use UNINSTALL SONAME. You cannot uninstall\na plugin if any table that uses it is open.\n\nplugin_name must be the name of some plugin that is listed in the mysql.plugin\ntable. The server executes the plugin\'s deinitialization function and removes\nthe row for the plugin from the mysql.plugin table, so that subsequent server\nrestarts will not load and initialize the plugin. UNINSTALL PLUGIN does not\nremove the plugin\'s shared library file.\n\nTo use UNINSTALL PLUGIN, you must have the DELETE privilege for the\nmysql.plugin table.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will return a note instead of an\nerror if the plugin does not exist. See SHOW WARNINGS.\n\nExamples\n--------\n\nUNINSTALL PLUGIN example;\n\nFrom MariaDB 10.4.0:\n\nUNINSTALL PLUGIN IF EXISTS example;\nQuery OK, 0 rows affected (0.099 sec)\n\nUNINSTALL PLUGIN IF EXISTS example;\nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------------+\n| Note | 1305 | PLUGIN example does not exist |\n+-------+------+-------------------------------+\n\nURL: https://mariadb.com/kb/en/uninstall-plugin/','','https://mariadb.com/kb/en/uninstall-plugin/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (77,5,'INSTALL SONAME','Syntax\n------\n\nINSTALL SONAME \'plugin_library\'\n\nDescription\n-----------\n\nThis statement is a variant of INSTALL PLUGIN. It installs all plugins from a\ngiven plugin_library. See INSTALL PLUGIN for details.\n\nplugin_library is the name of the shared library that contains the plugin\ncode. The file name extension (for example, libmyplugin.so or libmyplugin.dll)\ncan be omitted (which makes the statement look the same on all architectures).\n\nThe shared library must be located in the plugin directory (that is, the\ndirectory named by the plugin_dir system variable). The library must be in the\nplugin directory itself, not in a subdirectory. By default, plugin_dir is\nplugin directory under the directory named by the pkglibdir configuration\nvariable, but it can be changed by setting the value of plugin_dir at server\nstartup. For example, set its value in a my.cnf file:\n\n[mysqld]\nplugin_dir=/path/to/plugin/directory\nIf the value of plugin_dir is a relative path name, it is taken to be relative\nto the MySQL base directory (the value of the basedir system variable).\n\nINSTALL SONAME adds one or more lines to the mysql.plugin table that describes\nthe plugin. This table contains the plugin name and library file name.\n\nINSTALL SONAME causes the server to read option (my.cnf) files just as during\nserver startup. This enables the plugin to pick up any relevant options from\nthose files. It is possible to add plugin options to an option file even\nbefore loading a plugin (if the loose prefix is used). It is also possible to\nuninstall a plugin, edit my.cnf, and install the plugin again. Restarting the\nplugin this way enables it to the new option values without a server restart.\n\nINSTALL SONAME also loads and initializes the plugin code to make the plugin\navailable for use. A plugin is initialized by executing its initialization\nfunction, which handles any setup that the plugin must perform before it can\nbe used.\n\nTo use INSTALL SONAME, you must have the INSERT privilege for the mysql.plugin\ntable.\n\nAt server startup, the server loads and initializes any plugin that is listed\nin the mysql.plugin table. This means that a plugin is installed with INSTALL\nSONAME only once, not every time the server starts. Plugin loading at startup\ndoes not occur if the server is started with the --skip-grant-tables option.\n\nWhen the server shuts down, it executes the de-initialization function for\neach plugin that is loaded so that the plugin has a chance to perform any\nfinal cleanup.\n\nIf you need to load plugins for a single server startup when the\n--skip-grant-tables option is given (which tells the server not to read system\ntables), use the --plugin-load mysqld option.\n\nIf you need to install only one plugin from a library, use the INSTALL PLUGIN\nstatement.\n\nExamples\n--------\n\nTo load the XtraDB storage engine and all of its information_schema tables\nwith one statement, use\n\nINSTALL SONAME \'ha_xtradb\';\n\nThis statement can be used instead of INSTALL PLUGIN even when the library\ncontains only one plugin:\n\nINSTALL SONAME \'ha_sequence\';\n\nURL: https://mariadb.com/kb/en/install-soname/','','https://mariadb.com/kb/en/install-soname/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (78,5,'UNINSTALL SONAME','Syntax\n------\n\nUNINSTALL SONAME [IF EXISTS] \'plugin_library\'\n\nDescription\n-----------\n\nThis statement is a variant of UNINSTALL PLUGIN statement, that removes all\nplugins belonging to a specified plugin_library. See UNINSTALL PLUGIN for\ndetails.\n\nplugin_library is the name of the shared library that contains the plugin\ncode. The file name extension (for example, libmyplugin.so or libmyplugin.dll)\ncan be omitted (which makes the statement look the same on all architectures).\n\nTo use UNINSTALL SONAME, you must have the DELETE privilege for the\nmysql.plugin table.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will return a note instead of an\nerror if the plugin library does not exist. See SHOW WARNINGS.\n\nExamples\n--------\n\nTo uninstall the XtraDB plugin and all of its information_schema tables with\none statement, use\n\nUNINSTALL SONAME \'ha_xtradb\';\n\nFrom MariaDB 10.4.0:\n\nUNINSTALL SONAME IF EXISTS \'ha_example\';\nQuery OK, 0 rows affected (0.099 sec)\n\nUNINSTALL SONAME IF EXISTS \'ha_example\';\nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------------------+\n| Note | 1305 | SONAME ha_example.so does not exist |\n+-------+------+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/uninstall-soname/','','https://mariadb.com/kb/en/uninstall-soname/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (79,5,'Plugin Overview','Plugins are server components that enhance MariaDB in some way. These can be\nanything from new storage engines, plugins for enhancing full-text parsing, or\neven small enhancements, such as a plugin to get a timestamp as an integer.\n\nQuerying Plugin Information\n---------------------------\n\nThere are a number of ways to see which plugins are currently active.\n\nA server almost always has a large number of active plugins, because the\nserver contains a large number of built-in plugins, which are active by\ndefault and cannot be uninstalled.\n\nQuerying Plugin Information with SHOW PLUGINS\n---------------------------------------------\n\nThe SHOW PLUGINS statement can be used to query information about all active\nplugins.\n\nFor example:\n\nSHOW PLUGINS\\G;\n********************** 1. row **********************\n Name: binlog\n Status: ACTIVE\n Type: STORAGE ENGINE\nLibrary: NULL\nLicense: GPL\n********************** 2. row **********************\n Name: mysql_native_password\n Status: ACTIVE\n Type: AUTHENTICATION\nLibrary: NULL\nLicense: GPL\n********************** 3. row **********************\n Name: mysql_old_password\n Status: ACTIVE\n Type: AUTHENTICATION\nLibrary: NULL\nLicense: GPL\n...\n\nIf a plugin\'s Library column has a NULL value, then the plugin is built-in,\nand it cannot be uninstalled.\n\nQuerying Plugin Information with information_schema.PLUGINS\n-----------------------------------------------------------\n\nThe information_schema.PLUGINS table can be queried to get more detailed\ninformation about plugins.\n\nFor example:\n\nSELECT * FROM information_schema.PLUGINS\\G\n...\n*************************** 6. row ***************************\n PLUGIN_NAME: CSV\n PLUGIN_VERSION: 1.0\n PLUGIN_STATUS: ACTIVE\n PLUGIN_TYPE: STORAGE ENGINE\n PLUGIN_TYPE_VERSION: 100003.0\n PLUGIN_LIBRARY: NULL\nPLUGIN_LIBRARY_VERSION: NULL\n PLUGIN_AUTHOR: Brian Aker, MySQL AB\n PLUGIN_DESCRIPTION: CSV storage engine\n PLUGIN_LICENSE: GPL\n LOAD_OPTION: FORCE\n PLUGIN_MATURITY: Stable\n PLUGIN_AUTH_VERSION: 1.0\n*************************** 7. row ***************************\n PLUGIN_NAME: MEMORY\n PLUGIN_VERSION: 1.0\n PLUGIN_STATUS: ACTIVE\n PLUGIN_TYPE: STORAGE ENGINE\n PLUGIN_TYPE_VERSION: 100003.0\n PLUGIN_LIBRARY: NULL\nPLUGIN_LIBRARY_VERSION: NULL\n PLUGIN_AUTHOR: MySQL AB\n PLUGIN_DESCRIPTION: Hash based, stored in memory, useful for temporary\ntables\n PLUGIN_LICENSE: GPL\n LOAD_OPTION: FORCE\n PLUGIN_MATURITY: Stable\n PLUGIN_AUTH_VERSION: 1.0\n...\n\nIf a plugin\'s PLUGIN_LIBRARY column has the NULL value, then the plugin is\nbuilt-in, and it cannot be uninstalled.\n\nQuerying Plugin Information with mysql.plugin\n---------------------------------------------\n\nThe mysql.plugin table can be queried to get information about installed\nplugins.\n\nThis table only contains information about plugins that have been installed\nvia the following methods:\n\n* The INSTALL SONAME statement.\n* The INSTALL PLUGIN statement.\n* The mysql_plugin utility.\n\nThis table does not contain information about:\n\n* Built-in plugins.\n* Plugins loaded with the --plugin-load-add option.\n* Plugins loaded with the --plugin-load option.\n\nThis table only contains enough information to reload the plugin when the\nserver is restarted, which means it only contains the plugin name and the\nplugin library.\n\nFor example:\n\nSELECT * FROM mysql.plugin;\n\n+------+------------+\n| name | dl |\n+------+------------+\n| PBXT | libpbxt.so |\n+------+------------+\n\nInstalling a Plugin\n-------------------\n\nThere are three primary ways to install a plugin:\n\n* A plugin can be installed dynamically with an SQL statement.\n* A plugin can be installed with a mysqld option, but it requires a server\nrestart.\n* A plugin can be installed with the mysql_plugin utility, while the server is\ncompletely offline.\n\nWhen you are installing a plugin, you also have to ensure that:\n\n* The server\'s plugin directory is properly configured, and the plugin\'s\nlibrary is in the plugin directory.\n* The server\'s minimum plugin maturity is properly configured, and the plugin\nis mature enough to be installed.\n\nInstalling a Plugin Dynamically\n-------------------------------\n\nA plugin can be installed dynamically by executing either the INSTALL SONAME\nor the INSTALL PLUGIN statement.\n\nIf a plugin is installed with one of these statements, then a record will be\nadded to the mysql.plugins table for the plugin. This means that the plugin\nwill automatically be loaded every time the server restarts, unless\nspecifically uninstalled or deactivated.\n\nInstalling a Plugin with INSTALL SONAME\n---------------------------------------\n\nYou can install a plugin dynamically by executing the INSTALL SONAME\nstatement. INSTALL SONAME installs all plugins from the given plugin library.\nThis could be required for some plugin libraries.\n\nFor example, to install all plugins in the server_audit plugin library (which\nis currently only the server_audit audit plugin), you could execute the\nfollowing:\n\nINSTALL SONAME \'server_audit\';\n\nInstalling a Plugin with INSTALL PLUGIN\n---------------------------------------\n\nYou can install a plugin dynamically by executing the INSTALL PLUGIN\nstatement. INSTALL PLUGIN installs a single plugin from the given plugin\nlibrary.\n\nFor example, to install the server_audit audit plugin from the server_audit\nplugin library, you could execute the following:\n\nINSTALL PLUGIN server_audit SONAME \'server_audit\';\n\nInstalling a Plugin with Plugin Load Options\n--------------------------------------------\n\nA plugin can be installed with a mysqld option by providing either the\n--plugin-load-add or the --plugin-load option.\n\nIf a plugin is installed with one of these options, then a record will not be\nadded to the mysql.plugins table for the plugin. This means that if the server\nis restarted without the same option set, then the plugin will not\nautomatically be loaded.\n\nInstalling a Plugin with --plugin-load-add\n------------------------------------------\n\nYou can install a plugin with the --plugin-load-add option by specifying the\noption as a command-line argument to mysqld or by specifying the option in a\nrelevant server option group in an option file.\n\nThe --plugin-load-add option uses the following format:\n\n* Plugins can be specified in the format name=library, where name is the\nplugin name and library is the plugin library. This format installs a single\nplugin from the given plugin library.\n* Plugins can also be specified in the format library, where library is the\nplugin library. This format installs all plugins from the given plugin library.\n* Multiple plugins can be specified by separating them with semicolons.\n\nFor example, to install all plugins in the server_audit plugin library (which\nis currently only the server_audit audit plugin) and also the ed25519\nauthentication plugin from the auth_ed25519 plugin library, you could set the\noption to the following values on the command-line:\n\n$ mysqld --user=mysql --plugin-load-add=\'server_audit\'\n--plugin-load-add=\'ed25519=auth_ed25519\'\n\nYou could also set the option to the same values in an option file:\n\n[mariadb]\n...\nplugin_load_add = server_audit\nplugin_load_add = ed25519=auth_ed25519\n\nSpecial care must be taken when specifying both the --plugin-load option and\nthe --plugin-load-add option together. The --plugin-load option resets the\nplugin load list, and this can cause unexpected problems if you are not aware.\nThe --plugin-load-add option does not reset the plugin load list, so it is\nmuch safer to use. See Specifying Multiple Plugin Load Options for more\ninformation.\n\nInstalling a Plugin with --plugin-load\n--------------------------------------\n\nYou can install a plugin with the --plugin-load option by specifying the\noption as a command-line argument to mysqld or by specifying the option in a\nrelevant server option group in an option file.\n\nThe --plugin-load option uses the following format:\n\n* Plugins can be specified in the format name=library, where name is the\nplugin name and library is the plugin library. This format installs a single\nplugin from the given plugin library.\n* Plugins can also be specified in the format library, where library is the\nplugin library. This format installs all plugins from the given plugin library.\n* Multiple plugins can be specified by separating them with semicolons.\n\nFor example, to install all plugins in the server_audit plugin library (which\nis currently only the server_audit audit plugin) and also the ed25519\nauthentication plugin from the auth_ed25519 plugin library, you could set the\noption to the following values on the command-line:\n\n$ mysqld --user=mysql --plugin-load=\'server_audit;ed25519=auth_ed25519\'\n\nYou could also set the option to the same values in an option file:\n\n[mariadb]\n...\nplugin_load = server_audit;ed25519=auth_ed25519\n\nSpecial care must be taken when specifying the --plugin-load option multiple\ntimes, or when specifying both the --plugin-load option and the\n--plugin-load-add option together. The --plugin-load option resets the plugin\nload list, and this can cause unexpected problems if you are not aware. The\n--plugin-load-add option does not reset the plugin load list, so it is much\nsafer to use. See Specifying Multiple Plugin Load Options for more information.\n\nSpecifying Multiple Plugin Load Options\n---------------------------------------\n\nSpecial care must be taken when specifying the --plugin-load option multiple\ntimes, or when specifying both the --plugin-load option and the\n--plugin-load-add option. The --plugin-load option resets the plugin load\nlist, and this can cause unexpected problems if you are not aware. The\n--plugin-load-add option does not reset the plugin load list, so it is much\nsafer to use.\n\nThis can have the following consequences:\n\n* If the --plugin-load option is specified multiple times, then only the last\ninstance will have any effect. For example, in the following case, the first\ninstance of the option is reset:\n\n[mariadb]\n...\nplugin_load = server_audit\nplugin_load = ed25519=auth_ed25519\n\n* If the --plugin-load option is specified after the --plugin-load-add option,\nthen it will also reset the changes made by that option. For example, in the\nfollowing case, the --plugin-load-add option does not do anything, because the\nsubsequent --plugin-load option resets the plugin load list:\n\n[mariadb]\n...\nplugin_load_add = server_audit\nplugin_load = ed25519=auth_ed25519\n\n* In contrast, if the --plugin-load option is specified before the\n--plugin-load-add option, then it will work fine, because the\n--plugin-load-add option does not reset the plugin load list. For example, in\nthe following case, both plugins are properly loaded:\n\n[mariadb]\n...\nplugin_load = server_audit\nplugin_load_add = ed25519=auth_ed25519\n\nInstalling a Plugin with mysql_plugin\n-------------------------------------\n\nA plugin can be installed with the mysql_plugin utility if the server is\ncompletely offline.\n\nThe syntax is:\n\nmysql_plugin [options] <plugin> ENABLE|DISABLE\n\nFor example, to install the server_audit audit plugin, you could execute the\nfollowing:\n\nmysql_plugin server_audit ENABLE\n\nIf a plugin is installed with this utility, then a record will be added to the\nmysql.plugins table for the plugin. This means that the plugin will\nautomatically be loaded every time the server restarts, unless specifically\nuninstalled or deactivated.\n\nConfiguring the Plugin Directory\n--------------------------------\n\nWhen a plugin is being installed, the server looks for the plugin\'s library in\nthe server\'s plugin directory. This directory is configured by the plugin_dir\nsystem variable. This can be specified as a command-line argument to mysqld or\nit can be specified in a relevant server option group in an option file. For\nexample:\n\n[mariadb]\n...\nplugin_dir = /usr/lib64/mysql/plugin\n\nConfiguring the Minimum Plugin Maturity\n---------------------------------------\n\nWhen a plugin is being installed, the server compares the plugin\'s maturity\nlevel against the server\'s minimum allowed plugin maturity. This can help\nprevent users from using unstable plugins on production servers. This minimum\nplugin maturity is configured by the plugin_maturity system variable. This can\nbe specified as a command-line argument to mysqld or it can be specified in a\nrelevant server option group in an option file. For example:\n\n[mariadb]\n...\nplugin_maturity = stable\n\nConfiguring Plugin Activation at Server Startup\n-----------------------------------------------\n\nA plugin will be loaded by default when the server starts if:\n\n* The plugin was installed with the INSTALL SONAME statement.\n* The plugin was installed with the INSTALL PLUGIN statement.\n* The plugin was installed with the mysql_plugin utility.\n* The server is configured to load the plugin with the --plugin-load-add\noption.\n* The server is configured to load the plugin with the --plugin-load option.\n\nThis behavior can be changed with special options that take the form\n--plugin-name. For example, for the server_audit audit plugin, the special\noption is called --server-audit.\n\nThe possible values for these special options are:\n\n+---------------------------------------+------------------------------------+\n| Option Value | Description |\n+---------------------------------------+------------------------------------+\n| OFF | Disables the plugin without |\n| | removing it from the |\n| | mysql.plugins table. |\n+---------------------------------------+------------------------------------+\n| ON | Enables the plugin. If the plugin |\n| | cannot be initialized, then the |\n| | server will still continue |\n| | starting up, but the plugin will |\n| | be disabled. |\n+---------------------------------------+------------------------------------+\n| FORCE | Enables the plugin. If the plugin |','','https://mariadb.com/kb/en/plugin-overview/');
+update help_topic set description = CONCAT(description, '\n| | cannot be initialized, then the |\n| | server will fail to start with an |\n| | error. |\n+---------------------------------------+------------------------------------+\n| FORCE_PLUS_PERMANENT | Enables the plugin. If the plugin |\n| | cannot be initialized, then the |\n| | server will fail to start with an |\n| | error. In addition, the plugin |\n| | cannot be uninstalled with |\n| | UNINSTALL SONAME or UNINSTALL |\n| | PLUGIN while the server is |\n| | running. |\n+---------------------------------------+------------------------------------+\n\nA plugin\'s status can be found by looking at the PLUGIN_STATUS column of the\ninformation_schema.PLUGINS table.\n\nUninstalling Plugins\n--------------------\n\nPlugins that are found in the mysql.plugin table, that is those that were\ninstalled with INSTALL SONAME, INSTALL PLUGIN or mysql_plugin can be\nuninstalled in one of two ways:\n\n* The UNINSTALL SONAME or the UNINSTALL PLUGIN statement while the server is\nrunning\n* With mysql_plugin while the server is offline.\n\nPlugins that were enabled as a --plugin-load option do not need to be\nuninstalled. If --plugin-load is omitted the next time the server starts, or\nthe plugin is not listed as one of the --plugin-load entries, the plugin will\nnot be loaded.\n\nUNINSTALL PLUGIN uninstalls a single installed plugin, while UNINSTALL SONAME\nuninstalls all plugins belonging to a given library.\n\nURL: https://mariadb.com/kb/en/plugin-overview/') WHERE help_topic_id = 79;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (80,6,'MBR Definition','Description\n-----------\n\nThe MBR (Minimum Bounding Rectangle), or Envelope is the bounding geometry,\nformed by the minimum and maximum (X,Y) coordinates:\n\nExamples\n--------\n\n((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))\n\nURL: https://mariadb.com/kb/en/mbr-definition/','','https://mariadb.com/kb/en/mbr-definition/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (81,6,'MBRContains','Syntax\n------\n\nMBRContains(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangle of g1\ncontains the Minimum Bounding Rectangle of g2. This tests the opposite\nrelationship as MBRWithin().\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\n\nSET @g2 = GeomFromText(\'Point(1 1)\');\n\nSELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);\n+----------------------+----------------------+\n| MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |\n+----------------------+----------------------+\n| 1 | 0 |\n+----------------------+----------------------+\n\nURL: https://mariadb.com/kb/en/mbrcontains/','','https://mariadb.com/kb/en/mbrcontains/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (82,6,'MBRDisjoint','Syntax\n------\n\nMBRDisjoint(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 are disjoint. Two geometries are disjoint if they do not\nintersect, that is touch or overlap.\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECTmbrdisjoint(@g1,@g2);\n+----------------------+\n| mbrdisjoint(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrdisjoint(@g1,@g2);\n+----------------------+\n| mbrdisjoint(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/mbrdisjoint/','','https://mariadb.com/kb/en/mbrdisjoint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (83,6,'MBREqual','Syntax\n------\n\nMBREqual(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 are the same.\n\nExamples\n--------\n\nSET @g1=GEOMFROMTEXT(\'LINESTRING(0 0, 1 2)\');\nSET @g2=GEOMFROMTEXT(\'POLYGON((0 0, 0 2, 1 2, 1 0, 0 0))\');\nSELECT MbrEqual(@g1,@g2);\n+-------------------+\n| MbrEqual(@g1,@g2) |\n+-------------------+\n| 1 |\n+-------------------+\n\nSET @g1=GEOMFROMTEXT(\'LINESTRING(0 0, 1 3)\');\nSET @g2=GEOMFROMTEXT(\'POLYGON((0 0, 0 2, 1 4, 1 0, 0 0))\');\nSELECT MbrEqual(@g1,@g2);\n+-------------------+\n| MbrEqual(@g1,@g2) |\n+-------------------+\n| 0 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/mbrequal/','','https://mariadb.com/kb/en/mbrequal/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (84,6,'MBRIntersects','Syntax\n------\n\nMBRIntersects(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 intersect.\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrintersects(@g1,@g2);\n+------------------------+\n| mbrintersects(@g1,@g2) |\n+------------------------+\n| 1 |\n+------------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECT mbrintersects(@g1,@g2);\n+------------------------+\n| mbrintersects(@g1,@g2) |\n+------------------------+\n| 0 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/mbrintersects/','','https://mariadb.com/kb/en/mbrintersects/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (85,6,'MBROverlaps','Syntax\n------\n\nMBROverlaps(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 overlap. The term spatially overlaps is used if two\ngeometries intersect and their intersection results in a geometry of the same\ndimension but not equal to either of the given geometries.\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECT mbroverlaps(@g1,@g2);\n+----------------------+\n| mbroverlaps(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbroverlaps(@g1,@g2);\n+----------------------+\n| mbroverlaps(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 4,4 4,4 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbroverlaps(@g1,@g2);\n+----------------------+\n| mbroverlaps(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/mbroverlaps/','','https://mariadb.com/kb/en/mbroverlaps/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (86,6,'MBRTouches','Syntax\n------\n\nMBRTouches(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangles of the two\ngeometries g1 and g2 touch. Two geometries spatially touch if the interiors of\nthe geometries do not intersect, but the boundary of one of the geometries\nintersects either the boundary or the interior of the other.\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECT mbrtouches(@g1,@g2);\n+---------------------+\n| mbrtouches(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrtouches(@g1,@g2);\n+---------------------+\n| mbrtouches(@g1,@g2) |\n+---------------------+\n| 1 |\n+---------------------+\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 4,4 4,4 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrtouches(@g1,@g2);\n+---------------------+\n| mbrtouches(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/mbrtouches/','','https://mariadb.com/kb/en/mbrtouches/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (87,6,'MBRWithin','Syntax\n------\n\nMBRWithin(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether the Minimum Bounding Rectangle of g1 is\nwithin the Minimum Bounding Rectangle of g2. This tests the opposite\nrelationship as MBRContains().\n\nExamples\n--------\n\nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((0 0,0 5,5 5,5 0,0 0))\');\nSELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);\n+--------------------+--------------------+\n| MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |\n+--------------------+--------------------+\n| 1 | 0 |\n+--------------------+--------------------+\n\nURL: https://mariadb.com/kb/en/mbrwithin/','','https://mariadb.com/kb/en/mbrwithin/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (88,7,'CASE OPERATOR','Syntax\n------\n\nCASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN\nresult ...] [ELSE result] END\n\nCASE WHEN [condition] THEN result [WHEN [condition] THEN result ...]\n[ELSE result] END\n\nDescription\n-----------\n\nThe first version returns the result where value=compare_value. The second\nversion returns the result for the first condition that is true. If there was\nno matching result value, the result after ELSE is returned, or NULL if there\nis no ELSE part.\n\nThere is also a CASE statement, which differs from the CASE operator described\nhere.\n\nExamples\n--------\n\nSELECT CASE 1 WHEN 1 THEN \'one\' WHEN 2 THEN \'two\' ELSE \'more\' END;\n+------------------------------------------------------------+\n| CASE 1 WHEN 1 THEN \'one\' WHEN 2 THEN \'two\' ELSE \'more\' END |\n+------------------------------------------------------------+\n| one |\n+------------------------------------------------------------+\n\nSELECT CASE WHEN 1>0 THEN \'true\' ELSE \'false\' END;\n+--------------------------------------------+\n| CASE WHEN 1>0 THEN \'true\' ELSE \'false\' END |\n+--------------------------------------------+\n| true |\n+--------------------------------------------+\n\nSELECT CASE BINARY \'B\' WHEN \'a\' THEN 1 WHEN \'b\' THEN 2 END;\n+-----------------------------------------------------+\n| CASE BINARY \'B\' WHEN \'a\' THEN 1 WHEN \'b\' THEN 2 END |\n+-----------------------------------------------------+\n| NULL |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/case-operator/','','https://mariadb.com/kb/en/case-operator/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (89,7,'IF Function','Syntax\n------\n\nIF(expr1,expr2,expr3)\n\nDescription\n-----------\n\nIf expr1 is TRUE (expr1 <> 0 and expr1 <> NULL) then IF() returns expr2;\notherwise it returns expr3. IF() returns a numeric or string value, depending\non the context in which it is used.\n\nNote: There is also an IF statement which differs from the IF() function\ndescribed here.\n\nExamples\n--------\n\nSELECT IF(1>2,2,3);\n+-------------+\n| IF(1>2,2,3) |\n+-------------+\n| 3 |\n+-------------+\n\nSELECT IF(1<2,\'yes\',\'no\');\n+--------------------+\n| IF(1<2,\'yes\',\'no\') |\n+--------------------+\n| yes |\n+--------------------+\n\nSELECT IF(STRCMP(\'test\',\'test1\'),\'no\',\'yes\');\n+---------------------------------------+\n| IF(STRCMP(\'test\',\'test1\'),\'no\',\'yes\') |\n+---------------------------------------+\n| no |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/if-function/','','https://mariadb.com/kb/en/if-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (90,7,'IFNULL','Syntax\n------\n\nIFNULL(expr1,expr2)\nNVL(expr1,expr2)\n\nDescription\n-----------\n\nIf expr1 is not NULL, IFNULL() returns expr1; otherwise it returns expr2.\nIFNULL() returns a numeric or string value, depending on the context in which\nit is used.\n\nFrom MariaDB 10.3, NVL() is an alias for IFNULL().\n\nExamples\n--------\n\nSELECT IFNULL(1,0); \n+-------------+\n| IFNULL(1,0) |\n+-------------+\n| 1 |\n+-------------+\n\nSELECT IFNULL(NULL,10);\n+-----------------+\n| IFNULL(NULL,10) |\n+-----------------+\n| 10 |\n+-----------------+\n\nSELECT IFNULL(1/0,10);\n+----------------+\n| IFNULL(1/0,10) |\n+----------------+\n| 10.0000 |\n+----------------+\n\nSELECT IFNULL(1/0,\'yes\');\n+-------------------+\n| IFNULL(1/0,\'yes\') |\n+-------------------+\n| yes |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/ifnull/','','https://mariadb.com/kb/en/ifnull/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (91,7,'NULLIF','Syntax\n------\n\nNULLIF(expr1,expr2)\n\nDescription\n-----------\n\nReturns NULL if expr1 = expr2 is true, otherwise returns expr1. This is the\nsame as CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.\n\nExamples\n--------\n\nSELECT NULLIF(1,1);\n+-------------+\n| NULLIF(1,1) |\n+-------------+\n| NULL |\n+-------------+\n\nSELECT NULLIF(1,2);\n+-------------+\n| NULLIF(1,2) |\n+-------------+\n| 1 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/nullif/','','https://mariadb.com/kb/en/nullif/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (92,7,'NVL','MariaDB starting with 10.3\n--------------------------\nFrom MariaDB 10.3, NVL is a synonym for IFNULL.\n\nURL: https://mariadb.com/kb/en/nvl/','','https://mariadb.com/kb/en/nvl/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (93,7,'NVL2','MariaDB starting with 10.3\n--------------------------\nThe NLV2 function was introduced in MariaDB 10.3.0.\n\nSyntax\n------\n\nNVL2(expr1,expr2,expr3)\n\nDescription\n-----------\n\nThe NVL2 function returns a value based on whether a specified expression is\nNULL or not. If expr1 is not NULL, then NVL2 returns expr2. If expr1 is NULL,\nthen NVL2 returns expr3.\n\nExamples\n--------\n\nSELECT NVL2(NULL,1,2);\n+----------------+\n| NVL2(NULL,1,2) |\n+----------------+\n| 2 |\n+----------------+\n\nSELECT NVL2(\'x\',1,2);\n+---------------+\n| NVL2(\'x\',1,2) |\n+---------------+\n| 1 |\n+---------------+\n\nURL: https://mariadb.com/kb/en/nvl2/','','https://mariadb.com/kb/en/nvl2/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (94,8,'SET TRANSACTION','Syntax\n------\n\nSET [GLOBAL | SESSION] TRANSACTION\n transaction_property [, transaction_property] ...\n\ntransaction_property:\n ISOLATION LEVEL level\n | READ WRITE\n | READ ONLY\n\nlevel:\n REPEATABLE READ\n | READ COMMITTED\n | READ UNCOMMITTED\n | SERIALIZABLE\n\nDescription\n-----------\n\nThis statement sets the transaction isolation level or the transaction access\nmode globally, for the current session, or for the next transaction:\n\n* With the GLOBAL keyword, the statement sets the default\n transaction level globally for all subsequent sessions. Existing sessions are\n unaffected.\n* With the SESSION keyword, the statement sets the default\n transaction level for all subsequent transactions performed within the\n current session.\n* Without any SESSION or GLOBAL keyword,\n the statement sets the isolation level for the next (not started) transaction\n performed within the current session.\n\nA change to the global default isolation level requires the SUPER privilege.\nAny session is free to change its session isolation level (even in the middle\nof a transaction), or the isolation level for its next transaction.\n\nIsolation Level\n---------------\n\nTo set the global default isolation level at server startup, use the\n--transaction-isolation=level option on the command line or in an option file.\nValues of level for this option use dashes rather than spaces, so the\nallowable values are READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, or\nSERIALIZABLE. For example, to set the default isolation level to REPEATABLE\nREAD, use these lines in the [mysqld] section of an option file:\n\n[mysqld]\ntransaction-isolation = REPEATABLE-READ\nTo determine the global and session transaction isolation levels at runtime,\ncheck the value of the tx_isolation system variable:\n\nSELECT @@GLOBAL.tx_isolation, @@tx_isolation;\n\nInnoDB supports each of the translation isolation levels described here using\ndifferent locking strategies. The default level is REPEATABLE READ. For\nadditional information about InnoDB record-level locks and how it uses them to\nexecute various types of statements, see InnoDB Lock Modes, and\nhttp://dev.mysql.com/doc/refman/en/innodb-locks-set.html.\n\nIsolation Levels\n----------------\n\nThe following sections describe how MariaDB supports the different transaction\nlevels.\n\nREAD UNCOMMITTED\n----------------\n\nSELECT statements are performed in a non-locking fashion, but a possible\nearlier version of a row might be used. Thus, using this isolation level, such\nreads are not consistent. This is also called a \"dirty read.\" Otherwise, this\nisolation level works like READ COMMITTED.\n\nREAD COMMITTED\n--------------\n\nA somewhat Oracle-like isolation level with respect to consistent\n(non-locking) reads: Each consistent read, even within the same transaction,\nsets and reads its own fresh snapshot. See\nhttp://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.\n\nFor locking reads (SELECT with FOR UPDATE or LOCK IN SHARE MODE), InnoDB locks\nonly index records, not the gaps before them, and thus allows the free\ninsertion of new records next to locked records. For UPDATE and DELETE\nstatements, locking depends on whether the statement uses a unique index with\na unique search condition (such as WHERE id = 100), or a range-type search\ncondition (such as WHERE id > 100). For a unique index with a unique search\ncondition, InnoDB locks only the index record found, not the gap before it.\nFor range-type searches, InnoDB locks the index range scanned, using gap locks\nor next-key (gap plus index-record) locks to block insertions by other\nsessions into the gaps covered by the range. This is necessary because\n\"phantom rows\" must be blocked for MySQL replication and recovery to work.\n\nNote: If the READ COMMITTED isolation level is used or the\ninnodb_locks_unsafe_for_binlog system variable is enabled, there is no InnoDB\ngap locking except for foreign-key constraint checking and duplicate-key\nchecking. Also, record locks for non-matching rows are released after MariaDB\nhas evaluated the WHERE condition.If you use READ COMMITTED or enable\ninnodb_locks_unsafe_for_binlog, you must use row-based binary logging.\n\nREPEATABLE READ\n---------------\n\nThis is the default isolation level for InnoDB. For consistent reads, there is\nan important difference from the READ COMMITTED isolation level: All\nconsistent reads within the same transaction read the snapshot established by\nthe first read. This convention means that if you issue several plain\n(non-locking) SELECT statements within the same transaction, these SELECT\nstatements are consistent also with respect to each other. See\nhttp://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.\n\nFor locking reads (SELECT with FOR UPDATE or LOCK IN SHARE MODE), UPDATE, and\nDELETE statements, locking depends on whether the statement uses a unique\nindex with a unique search condition, or a range-type search condition. For a\nunique index with a unique search condition, InnoDB locks only the index\nrecord found, not the gap before it. For other search conditions, InnoDB locks\nthe index range scanned, using gap locks or next-key (gap plus index-record)\nlocks to block insertions by other sessions into the gaps covered by the range.\n\nThis is the minimum isolation level for non-distributed XA transactions.\n\nSERIALIZABLE\n------------\n\nThis level is like REPEATABLE READ, but InnoDB implicitly converts all plain\nSELECT statements to SELECT ... LOCK IN SHARE MODE if autocommit is disabled.\nIf autocommit is enabled, the SELECT is its own transaction. It therefore is\nknown to be read only and can be serialized if performed as a consistent\n(non-locking) read and need not block for other transactions. (This means that\nto force a plain SELECT to block if other transactions have modified the\nselected rows, you should disable autocommit.)\n\nDistributed XA transactions should always use this isolation level.\n\nAccess Mode\n-----------\n\nThe access mode specifies whether the transaction is allowed to write data or\nnot. By default, transactions are in READ WRITE mode (see the tx_read_only\nsystem variable). READ ONLY mode allows the storage engine to apply\noptimizations that cannot be used for transactions which write data. The only\nexception to this rule is that read only transactions can perform DDL\nstatements on temporary tables.\n\nIt is not permitted to specify both READ WRITE and READ ONLY in the same\nstatement.\n\nREAD WRITE and READ ONLY can also be specified in the START TRANSACTION\nstatement, in which case the specified mode is only valid for one transaction.\n\nExamples\n--------\n\nSET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;\n\nAttempting to set the isolation level within an existing transaction without\nspecifying GLOBAL or SESSION.\n\nSTART TRANSACTION;\n\nSET TRANSACTION ISOLATION LEVEL SERIALIZABLE;\nERROR 1568 (25001): Transaction characteristics can\'t be changed while a\ntransaction is in progress\n\nURL: https://mariadb.com/kb/en/set-transaction/','','https://mariadb.com/kb/en/set-transaction/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (95,8,'START TRANSACTION','Syntax\n------\n\nSTART TRANSACTION [transaction_property [, transaction_property] ...] | BEGIN\n[WORK]\nCOMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]\nROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]\nSET autocommit = {0 | 1}\n\ntransaction_property:\n WITH CONSISTENT SNAPSHOT\n | READ WRITE\n | READ ONLY\n\nDescription\n-----------\n\nThe START TRANSACTION or BEGIN statement begins a new transaction. COMMIT\ncommits the current transaction, making its changes permanent. ROLLBACK rolls\nback the current transaction, canceling its changes. The SET autocommit\nstatement disables or enables the default autocommit mode for the current\nsession.\n\nSTART TRANSACTION and SET autocommit = 1 implicitly commit the current\ntransaction, if any.\n\nThe optional WORK keyword is supported for COMMIT and ROLLBACK, as are the\nCHAIN and RELEASE clauses. CHAIN and RELEASE can be used for additional\ncontrol over transaction completion. The value of the completion_type system\nvariable determines the default completion behavior.\n\nThe AND CHAIN clause causes a new transaction to begin as soon as the current\none ends, and the new transaction has the same isolation level as the\njust-terminated transaction. The RELEASE clause causes the server to\ndisconnect the current client session after terminating the current\ntransaction. Including the NO keyword suppresses CHAIN or RELEASE completion,\nwhich can be useful if the completion_type system variable is set to cause\nchaining or release completion by default.\n\nAccess Mode\n-----------\n\nThe access mode specifies whether the transaction is allowed to write data or\nnot. By default, transactions are in READ WRITE mode (see the tx_read_only\nsystem variable). READ ONLY mode allows the storage engine to apply\noptimizations that cannot be used for transactions which write data. The only\nexception to this rule is that read only transactions can perform DDL\nstatements on temporary tables.\n\nIt is not permitted to specify both READ WRITE and READ ONLY in the same\nstatement.\n\nREAD WRITE and READ ONLY can also be specified in the SET TRANSACTION\nstatement, in which case the specified mode is valid for all sessions, or for\nall subsequent transaction used by the current session.\n\nautocommit\n----------\n\nBy default, MariaDB runs with autocommit mode enabled. This means that as soon\nas you execute a statement that updates (modifies) a table, MariaDB stores the\nupdate on disk to make it permanent. To disable autocommit mode, use the\nfollowing statement:\n\nSET autocommit=0;\n\nAfter disabling autocommit mode by setting the autocommit variable to zero,\nchanges to transaction-safe tables (such as those for InnoDB or NDBCLUSTER)\nare not made permanent immediately. You must use COMMIT to store your changes\nto disk or ROLLBACK to ignore the changes.\n\nTo disable autocommit mode for a single series of statements, use the START\nTRANSACTION statement.\n\nDDL Statements\n--------------\n\nDDL statements (CREATE, ALTER, DROP) and administrative statements (FLUSH,\nRESET, OPTIMIZE, ANALYZE, CHECK, REPAIR, CACHE INDEX), transaction management\nstatements (BEGIN, START TRANSACTION) and LOAD DATA INFILE, cause an implicit\nCOMMIT and start a new transaction. An exception to this rule are the DDL that\noperate on temporary tables: you can CREATE, ALTER and DROP them without\ncausing any COMMIT, but those actions cannot be rolled back. This means that\nif you call ROLLBACK, the temporary tables you created in the transaction will\nremain, while the rest of the transaction will be rolled back.\n\nTransactions cannot be used in Stored Functions or Triggers. In Stored\nProcedures and Events BEGIN is not allowed, so you should use START\nTRANSACTION instead.\n\nA transaction acquires a metadata lock on every table it accesses to prevent\nother connections from altering their structure. The lock is released at the\nend of the transaction. This happens even with non-transactional storage\nengines (like MEMORY or CONNECT), so it makes sense to use transactions with\nnon-transactional tables.\n\nin_transaction\n--------------\n\nThe in_transaction system variable is a session-only, read-only variable that\nreturns 1 inside a transaction, and 0 if not in a transaction.\n\nWITH CONSISTENT SNAPSHOT\n------------------------\n\nThe WITH CONSISTENT SNAPSHOT option starts a consistent read for storage\nengines such as InnoDB that can do so, the same as if a START TRANSACTION\nfollowed by a SELECT from any InnoDB table was issued.\n\nSee Enhancements for START TRANSACTION WITH CONSISTENT SNAPSHOT.\n\nExamples\n--------\n\nSTART TRANSACTION;\nSELECT @A:=SUM(salary) FROM table1 WHERE type=1;\nUPDATE table2 SET summary=@A WHERE type=1;\nCOMMIT;\n\nURL: https://mariadb.com/kb/en/start-transaction/','','https://mariadb.com/kb/en/start-transaction/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (96,8,'COMMIT','The COMMIT statement ends a transaction, saving any changes to the data so\nthat they become visible to subsequent transactions. Also, unlocks metadata\nchanged by current transaction. If autocommit is set to 1, an implicit commit\nis performed after each statement. Otherwise, all transactions which don\'t end\nwith an explicit COMMIT are implicitly rollbacked and the changes are lost.\nThe ROLLBACK statement can be used to do this explicitly.\n\nThe required syntax for the COMMIT statement is as follows:\n\nCOMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]\n\nCOMMIT is the more important transaction terminator, as well as the more\ninteresting one. The basic form of the COMMIT statement is simply the keyword\nCOMMIT (the keyword WORK is simply noise and can be omitted without changing\nthe effect).\n\nThe optional AND CHAIN clause is a convenience for initiating a new\ntransaction as soon as the old transaction terminates. If AND CHAIN is\nspecified, then there is effectively nothing between the old and new\ntransactions, although they remain separate. The characteristics of the new\ntransaction will be the same as the characteristics of the old one — that is,\nthe new transaction will have the same access mode, isolation level and\ndiagnostics area size (we\'ll discuss all of these shortly) as the transaction\njust terminated.\n\nRELEASE tells the server to disconnect the client immediately after the\ncurrent transaction.\n\nThere are NO RELEASE and AND NO CHAIN options. By default, commits do not\nRELEASE or CHAIN, but it\'s possible to change this default behavior with the\ncompletion_type server system variable. In this case, the AND NO CHAIN and NO\nRELEASE options override the server default.\n\nURL: https://mariadb.com/kb/en/commit/','','https://mariadb.com/kb/en/commit/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (97,8,'ROLLBACK','The ROLLBACK statement rolls back (ends) a transaction, destroying any changes\nto SQL-data so that they never become visible to subsequent transactions. The\nrequired syntax for the ROLLBACK statement is as follows.\n\nROLLBACK [ WORK ] [ AND [ NO ] CHAIN ] \n[ TO [ SAVEPOINT ] {<savepoint name> | <simple target specification>} ]\n\nThe ROLLBACK statement will either end a transaction, destroying all data\nchanges that happened during any of the transaction, or it will just destroy\nany data changes that happened since you established a savepoint. The basic\nform of the ROLLBACK statement is just the keyword ROLLBACK (the keyword WORK\nis simply noise and can be omitted without changing the effect).\n\nThe optional AND CHAIN clause is a convenience for initiating a new\ntransaction as soon as the old transaction terminates. If AND CHAIN is\nspecified, then there is effectively nothing between the old and new\ntransactions, although they remain separate. The characteristics of the new\ntransaction will be the same as the characteristics of the old one — that is,\nthe new transaction will have the same access mode, isolation level and\ndiagnostics area size (we\'ll discuss all of these shortly) as the transaction\njust terminated. The AND NO CHAIN option just tells your DBMS to end the\ntransaction — that is, these four SQL statements are equivalent:\n\nROLLBACK; \nROLLBACK WORK; \nROLLBACK AND NO CHAIN; \nROLLBACK WORK AND NO CHAIN;\n\nAll of them end a transaction without saving any transaction characteristics.\nThe only other options, the equivalent statements:\n\nROLLBACK AND CHAIN;\nROLLBACK WORK AND CHAIN;\n\nboth tell your DBMS to end a transaction, but to save that transaction\'s\ncharacteristics for the next transaction.\n\nROLLBACK is much simpler than COMMIT: it may involve no more than a few\ndeletions (of Cursors, locks, prepared SQL statements and log-file entries).\nIt\'s usually assumed that ROLLBACK can\'t fail, although such a thing is\nconceivable (for example, an encompassing transaction might reject an attempt\nto ROLLBACK because it\'s lining up for a COMMIT).\n\nROLLBACK cancels all effects of a transaction. It does not cancel effects on\nobjects outside the DBMS\'s control (for example the values in host program\nvariables or the settings made by some SQL/CLI function calls). But in\ngeneral, it is a convenient statement for those situations when you say \"oops,\nthis isn\'t working\" or when you simply don\'t care whether your temporary work\nbecomes permanent or not.\n\nHere is a moot question. If all you\'ve been doing is SELECTs, so that there\nhave been no data changes, should you end the transaction with ROLLBACK or\nCOMMIT? It shouldn\'t really matter because both ROLLBACK and COMMIT do the\nsame transaction-terminating job. However, the popular conception is that\nROLLBACK implies failure, so after a successful series of SELECT statements\nthe convention is to end the transaction with COMMIT rather than ROLLBACK.\n\nMariaDB (and most other DBMSs) supports rollback of SQL-data change\nstatements, but not of SQL-Schema statements. This means that if you use any\nof CREATE, ALTER, DROP, GRANT, REVOKE, you are implicitly committing at\nexecution time.\n\nINSERT INTO Table_2 VALUES(5); \nDROP TABLE Table_3 CASCADE; \nROLLBACK;\n\nThe result will be that both the INSERT and the DROP will go through as\nseparate transactions so the ROLLBACK will have no effect.\n\nURL: https://mariadb.com/kb/en/rollback/','','https://mariadb.com/kb/en/rollback/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (98,8,'LOCK TABLES','Syntax\n------\n\nLOCK TABLE[S]\n tbl_name [[AS] alias] lock_type\n [, tbl_name [[AS] alias] lock_type] ...\n [WAIT n|NOWAIT]\n\nlock_type:\n READ [LOCAL]\n | [LOW_PRIORITY] WRITE\n | WRITE CONCURRENT\n\nUNLOCK TABLES\n\nDescription\n-----------\n\nThe lock_type can be one of:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| READ | Read lock, no writes allowed |\n+---------------------------+------------------------------------------------+\n| READ LOCAL | Read lock, but allow concurrent inserts |\n+---------------------------+------------------------------------------------+\n| WRITE | Exclusive write lock. No other connections |\n| | can read or write to this table |\n+---------------------------+------------------------------------------------+\n| LOW_PRIORITY WRITE | Exclusive write lock, but allow new read |\n| | locks on the table until we get the write |\n| | lock. |\n+---------------------------+------------------------------------------------+\n| WRITE CONCURRENT | Exclusive write lock, but allow READ LOCAL |\n| | locks to the table. |\n+---------------------------+------------------------------------------------+\n\nMariaDB enables client sessions to acquire table locks explicitly for the\npurpose of cooperating with other sessions for access to tables, or to prevent\nother sessions from modifying tables during periods when a session requires\nexclusive access to them. A session can acquire or release locks only for\nitself. One session cannot acquire locks for another session or release locks\nheld by another session.\n\nLocks may be used to emulate transactions or to get more speed when updating\ntables.\n\nLOCK TABLES explicitly acquires table locks for the current client session.\nTable locks can be acquired for base tables or views. To use LOCK TABLES, you\nmust have the LOCK TABLES privilege, and the SELECT privilege for each object\nto be locked. See GRANT\n\nFor view locking, LOCK TABLES adds all base tables used in the view to the set\nof tables to be locked and locks them automatically. If you lock a table\nexplicitly with LOCK TABLES, any tables used in triggers are also locked\nimplicitly, as described in Triggers and Implicit Locks.\n\nUNLOCK TABLES explicitly releases any table locks held by the current session.\n\nMariaDB starting with 10.3.0\n----------------------------\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nLimitations\n-----------\n\n* LOCK TABLES doesn\'t work when using Galera cluster. You may experience\ncrashes or locks when used with Galera.\n* LOCK TABLES works on XtraDB/InnoDB tables only if the innodb_table_locks\nsystem variable is set to 1 (the default) and autocommit is set to 0 (1 is\ndefault). Please note that no error message will be returned on LOCK TABLES\nwith innodb_table_locks = 0.\n* LOCK TABLES implicitly commits the active transaction, if any. Also,\nstarting a transaction always releases all table locks acquired with LOCK\nTABLES. This means that there is no way to have table locks and an active\ntransaction at the same time. The only exceptions are the transactions in\nautocommit mode. To preserve the data integrity between transactional and\nnon-transactional tables, the GET_LOCK() function can be used.\n* When using LOCK TABLES on a TEMPORARY table, it will always be locked with a\nWRITE lock.\n* While a connection holds an explicit read lock on a table, it cannot modify\nit. If you try, the following error will be produced:\n\nERROR 1099 (HY000): Table \'tab_name\' was locked with a READ lock and can\'t be\nupdated\n\n* While a connection holds an explicit lock on a table, it cannot access a\nnon-locked table. If you try, the following error will be produced:\n\nERROR 1100 (HY000): Table \'tab_name\' was not locked with LOCK TABLES\n\n* While a connection holds an explicit lock on a table, it cannot issue the\nfollowing: INSERT DELAYED, CREATE TABLE, CREATE TABLE ... LIKE, and DDL\nstatements involving stored programs and views (except for triggers). If you\ntry, the following error will be produced:\n\nERROR 1192 (HY000): Can\'t execute the given command because you have active\nlocked tables or an active transaction\n\n* LOCK TABLES can not be used in stored routines - if you try, the following\nerror will be produced on creation. This restriction was removed in MariaDB\n10.6.2:\n\nERROR 1314 (0A000): LOCK is not allowed in stored procedures\n\nURL: https://mariadb.com/kb/en/lock-tables/','','https://mariadb.com/kb/en/lock-tables/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (99,8,'SAVEPOINT','Syntax\n------\n\nSAVEPOINT identifier\nROLLBACK [WORK] TO [SAVEPOINT] identifier\nRELEASE SAVEPOINT identifier\n\nDescription\n-----------\n\nInnoDB supports the SQL statements SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE\nSAVEPOINT and the optional WORK keyword for ROLLBACK.\n\nEach savepoint must have a legal MariaDB identifier. A savepoint is a named\nsub-transaction.\n\nNormally ROLLBACK undoes the changes performed by the whole transaction. When\nused with the TO clause, it undoes the changes performed after the specified\nsavepoint, and erases all subsequent savepoints. However, all locks that have\nbeen acquired after the save point will survive. RELEASE SAVEPOINT does not\nrollback or commit any changes, but removes the specified savepoint.\n\nWhen the execution of a trigger or a stored function begins, it is not\npossible to use statements which reference a savepoint which was defined from\nout of that stored program.\n\nWhen a COMMIT (including implicit commits) or a ROLLBACK statement (with no TO\nclause) is performed, they act on the whole transaction, and all savepoints\nare removed.\n\nErrors\n------\n\nIf COMMIT or ROLLBACK is issued and no transaction was started, no error is\nreported.\n\nIf SAVEPOINT is issued and no transaction was started, no error is reported\nbut no savepoint is created. When ROLLBACK TO SAVEPOINT or RELEASE SAVEPOINT\nis called for a savepoint that does not exist, an error like this is issued:\n\nERROR 1305 (42000): SAVEPOINT svp_name does not exist\n\nURL: https://mariadb.com/kb/en/savepoint/','','https://mariadb.com/kb/en/savepoint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (100,8,'Metadata Locking','MariaDB supports metadata locking. This means that when a transaction\n(including XA transactions) uses a table, it locks its metadata until the end\nof transaction. Non-transactional tables are also locked, as well as views and\nobjects which are related to locked tables/views (stored functions, triggers,\netc). When a connection tries to use a DDL statement (like an ALTER TABLE)\nwhich modifies a table that is locked, that connection is queued, and has to\nwait until it\'s unlocked. Using savepoints and performing a partial rollback\ndoes not release metadata locks.\n\nLOCK TABLES ... WRITE are also queued. Some wrong statements which produce an\nerror may not need to wait for the lock to be freed.\n\nThe metadata lock\'s timeout is determined by the value of the\nlock_wait_timeout server system variable (in seconds). However, note that its\ndefault value is 31536000 (1 year, MariaDB <= 10.2.3), or 86400 (1 day,\nMariaDB >= 10.2.4). If this timeout is exceeded, the following error is\nreturned:\n\nERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction\n\nIf the metadata_lock_info plugin is installed, the Information Schema\nmetadata_lock_info table stores information about existing metadata locks.\n\nMariaDB starting with 10.5.2\n----------------------------\nFrom MariaDB 10.5, the Performance Schema metadata_locks table contains\nmetadata lock information.\n\nExample\n-------\n\nLet\'s use the following MEMORY (non-transactional) table:\n\nCREATE TABLE t (a INT) ENGINE = MEMORY;\n\nConnection 1 starts a transaction, and INSERTs a row into t:\n\nSTART TRANSACTION;\n\nINSERT INTO t SET a=1;\n\nt\'s metadata is now locked by connection 1. Connection 2 tries to alter t, but\nhas to wait:\n\nALTER TABLE t ADD COLUMN b INT;\n\nConnection 2\'s prompt is blocked now.\n\nNow connection 1 ends the transaction:\n\nCOMMIT;\n\n...and connection 2 finally gets the output of its command:\n\nQuery OK, 1 row affected (35.23 sec)\nRecords: 1 Duplicates: 0 Warnings: 0\n\nURL: https://mariadb.com/kb/en/metadata-locking/','','https://mariadb.com/kb/en/metadata-locking/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (101,8,'Transaction Timeouts','MariaDB has always had the wait_timeout and interactive_timeout settings,\nwhich close connections after a certain period of inactivity.\n\nHowever, these are by default set to a long wait period. In situations where\ntransactions may be started, but not committed or rolled back, more granular\ncontrol and a shorter timeout may be desirable so as to avoid locks being held\nfor too long.\n\nMariaDB 10.3 introduced three new variables to handle this situation.\n\n* idle_transaction_timeout (all transactions)\n* idle_write_transaction_timeout (write transactions - called\nidle_readwrite_transaction_timeout until MariaDB 10.3.2)\n* idle_readonly_transaction_timeout (read transactions)\n\nThese accept a time in seconds to time out, by closing the connection,\ntransactions that are idle for longer than this period. By default all are set\nto zero, or no timeout.\n\nidle_transaction_timeout affects all transactions,\nidle_write_transaction_timeout affects write transactions only and\nidle_readonly_transaction_timeout affects read transactions only. The latter\ntwo variables work independently. However, if either is set along with\nidle_transaction_timeout, the settings for idle_write_transaction_timeout or\nidle_readonly_transaction_timeout will take precedence.\n\nExamples\n--------\n\nSET SESSION idle_transaction_timeout=2;\nBEGIN;\nSELECT * FROM t;\nEmpty set (0.000 sec)\n## wait 3 seconds\nSELECT * FROM t;\nERROR 2006 (HY000): MySQL server has gone away\n\nSET SESSION idle_write_transaction_timeout=2;\nBEGIN;\nSELECT * FROM t;\nEmpty set (0.000 sec)\n## wait 3 seconds\nSELECT * FROM t;\nEmpty set (0.000 sec)\nINSERT INTO t VALUES(1);\n## wait 3 seconds\nSELECT * FROM t;\nERROR 2006 (HY000): MySQL server has gone away\n\nSET SESSION idle_transaction_timeout=2, SESSION\nidle_readonly_transaction_timeout=10;\nBEGIN;\nSELECT * FROM t;\nEmpty set (0.000 sec)\n ## wait 3 seconds\nSELECT * FROM t;\nEmpty set (0.000 sec)\n## wait 11 seconds\nSELECT * FROM t;\nERROR 2006 (HY000): MySQL server has gone away\n\nURL: https://mariadb.com/kb/en/transaction-timeouts/','','https://mariadb.com/kb/en/transaction-timeouts/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (102,8,'UNLOCK TABLES','Syntax\n------\n\nUNLOCK TABLES\n\nDescription\n-----------\n\nUNLOCK TABLES explicitly releases any table locks held by the current session.\nSee LOCK TABLES for more information.\n\nIn addition to releasing table locks acquired by the LOCK TABLES statement,\nthe UNLOCK TABLES statement also releases the global read lock acquired by the\nFLUSH TABLES WITH READ LOCK statement. The FLUSH TABLES WITH READ LOCK\nstatement is very useful for performing backups. See FLUSH for more\ninformation about FLUSH TABLES WITH READ LOCK.\n\nURL: https://mariadb.com/kb/en/transactions-unlock-tables/','','https://mariadb.com/kb/en/transactions-unlock-tables/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (103,8,'WAIT and NOWAIT','MariaDB starting with 10.3.0\n----------------------------\nMariaDB 10.3.0 introduced extended syntax so that it is possible to set\ninnodb_lock_wait_timeout and lock_wait_timeout for the following statements:\n\nSyntax\n------\n\nALTER TABLE tbl_name [WAIT n|NOWAIT] ...\nCREATE ... INDEX ON tbl_name (index_col_name, ...) [WAIT n|NOWAIT] ...\nDROP INDEX ... [WAIT n|NOWAIT]\nDROP TABLE tbl_name [WAIT n|NOWAIT] ...\nLOCK TABLE ... [WAIT n|NOWAIT]\nOPTIMIZE TABLE tbl_name [WAIT n|NOWAIT]\nRENAME TABLE tbl_name [WAIT n|NOWAIT] ...\nSELECT ... FOR UPDATE [WAIT n|NOWAIT]\nSELECT ... LOCK IN SHARE MODE [WAIT n|NOWAIT]\nTRUNCATE TABLE tbl_name [WAIT n|NOWAIT]\n\nDescription\n-----------\n\nThe lock wait timeout can be explicitly set in the statement by using either\nWAIT n (to set the wait in seconds) or NOWAIT, in which case the statement\nwill immediately fail if the lock cannot be obtained. WAIT 0 is equivalent to\nNOWAIT.\n\nURL: https://mariadb.com/kb/en/wait-and-nowait/','','https://mariadb.com/kb/en/wait-and-nowait/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (104,8,'XA Transactions','Overview\n--------\n\nThe MariaDB XA implementation is based on the X/Open CAE document Distributed\nTransaction Processing: The XA Specification. This document is published by\nThe Open Group and available at\nhttp://www.opengroup.org/public/pubs/catalog/c193.htm.\n\nXA transactions are designed to allow distributed transactions, where a\ntransaction manager (the application) controls a transaction which involves\nmultiple resources. Such resources are usually DBMSs, but could be resources\nof any type. The whole set of required transactional operations is called a\nglobal transaction. Each subset of operations which involve a single resource\nis called a local transaction. XA used a 2-phases commit (2PC). With the first\ncommit, the transaction manager tells each resource to prepare an effective\ncommit, and waits for a confirm message. The changes are not still made\neffective at this point. If any of the resources encountered an error, the\ntransaction manager will rollback the global transaction. If all resources\ncommunicate that the first commit is successful, the transaction manager can\nrequire a second commit, which makes the changes effective.\n\nIn MariaDB, XA transactions can only be used with storage engines that support\nthem. At least InnoDB, TokuDB, SPIDER and MyRocks support them. For InnoDB,\nuntil MariaDB 10.2, XA transactions can be disabled by setting the\ninnodb_support_xa server system variable to 0. From MariaDB 10.3, XA\ntransactions are always supported.\n\nLike regular transactions, XA transactions create metadata locks on accessed\ntables.\n\nXA transactions require REPEATABLE READ as a minimum isolation level. However,\ndistributed transactions should always use SERIALIZABLE.\n\nTrying to start more than one XA transaction at the same time produces a 1400\nerror (SQLSTATE \'XAE09\'). The same error is produced when attempting to start\nan XA transaction while a regular transaction is in effect. Trying to start a\nregular transaction while an XA transaction is in effect produces a 1399 error\n(SQLSTATE \'XAE07\').\n\nThe statements that cause an implicit COMMIT for regular transactions produce\na 1400 error (SQLSTATE \'XAE09\') if a XA transaction is in effect.\n\nInternal XA vs External XA\n--------------------------\n\nXA transactions are an overloaded term in MariaDB. If a storage engine is\nXA-capable, it can mean one or both of these:\n\n* It supports MariaDB\'s internal two-phase commit API. This is transparent to\nthe user. Sometimes this is called \"internal XA\", since MariaDB\'s internal\ntransaction coordinator log can handle coordinating these transactions.\n\n* It supports XA transactions, with the XA START, XA PREPARE, XA COMMIT, etc.\nstatements. Sometimes this is called \"external XA\", since it requires the use\nof an external transaction coordinator to use this feature properly.\n\nTransaction Coordinator Log\n---------------------------\n\nIf you have two or more XA-capable storage engines enabled, then a transaction\ncoordinator log must be available.\n\nThere are currently two implementations of the transaction coordinator log:\n\n* Binary log-based transaction coordinator log\n* Memory-mapped file-based transaction coordinator log\n\nIf the binary log is enabled on a server, then the server will use the binary\nlog-based transaction coordinator log. Otherwise, it will use the\nmemory-mapped file-based transaction coordinator log.\n\nSee Transaction Coordinator Log for more information.\n\nSyntax\n------\n\nXA {START|BEGIN} xid [JOIN|RESUME]\n\nXA END xid [SUSPEND [FOR MIGRATE]]\n\nXA PREPARE xid\n\nXA COMMIT xid [ONE PHASE]\n\nXA ROLLBACK xid\n\nXA RECOVER [FORMAT=[\'RAW\'|\'SQL\']]\n\nxid: gtrid [, bqual [, formatID ]]\n\nThe interface to XA transactions is a set of SQL statements starting with XA.\nEach statement changes a transaction\'s state, determining which actions it can\nperform. A transaction which does not exist is in the NON-EXISTING state.\n\nXA START (or BEGIN) starts a transaction and defines its xid (a transaction\nidentifier). The JOIN or RESUME keywords have no effect. The new transaction\nwill be in ACTIVE state.\n\nThe xid can have 3 components, though only the first one is mandatory. gtrid\nis a quoted string representing a global transaction identifier. bqual is a\nquoted string representing a local transaction identifier. formatID is an\nunsigned integer indicating the format used for the first two components; if\nnot specified, defaults to 1. MariaDB does not interpret in any way these\ncomponents, and only uses them to identify a transaction. xids of transactions\nin effect must be unique.\n\nXA END declares that the specified ACTIVE transaction is finished and it\nchanges its state to IDLE. SUSPEND [FOR MIGRATE] has no effect.\n\nXA PREPARE prepares an IDLE transaction for commit, changing its state to\nPREPARED. This is the first commit.\n\nXA COMMIT definitely commits and terminates a transaction which has already\nbeen PREPARED. If the ONE PHASE clause is specified, this statements performs\na 1-phase commit on an IDLE transaction.\n\nXA ROLLBACK rolls back and terminates an IDLE or PREPARED transaction.\n\nXA RECOVER shows information about all PREPARED transactions.\n\nWhen trying to execute an operation which is not allowed for the transaction\'s\ncurrent state, an error is produced:\n\nXA COMMIT \'test\' ONE PHASE;\nERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global\ntransaction is in the ACTIVE state\n\nXA COMMIT \'test2\';\nERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global\ntransaction is in the NON-EXISTING state\n\nXA RECOVER\n----------\n\nThe XA RECOVER statement shows information about all transactions which are in\nthe PREPARED state. It does not matter which connection created the\ntransaction: if it has been PREPARED, it appears. But this does not mean that\na connection can commit or rollback a transaction which was started by another\nconnection. Note that transactions using a 1-phase commit are never in the\nPREPARED state, so they cannot be shown by XA RECOVER.\n\nXA RECOVER produces four columns:\n\nXA RECOVER;\n+----------+--------------+--------------+------+\n| formatID | gtrid_length | bqual_length | data |\n+----------+--------------+--------------+------+\n| 1 | 4 | 0 | test |\n+----------+--------------+--------------+------+\n\nMariaDB starting with 10.3.3\n----------------------------\nYou can use XA RECOVER FORMAT=\'SQL\' to get the data in a human readable form\nthat can be directly copy-pasted into XA COMMIT or XA ROLLBACK. This is\nparticularly useful for binary xid generated by some transaction coordinators.\n\nformatID is the formatID part of xid.\n\ndata are the gtrid and bqual parts of xid, concatenated.\n\ngtrid_length and bqual_length are the lengths of gtrid and bqual, respectevely.\n\nExamples\n--------\n\n2-phases commit:\n\nXA START \'test\';\n\nINSERT INTO t VALUES (1,2);\n\nXA END \'test\';\n\nXA PREPARE \'test\';\n\nXA COMMIT \'test\';\n\n1-phase commit:\n\nXA START \'test\';\n\nINSERT INTO t VALUES (1,2);\n\nXA END \'test\';\n\nXA COMMIT \'test\' ONE PHASE;\n\nHuman-readable:\n\nxa start \'12\\r34\\t67\\v78\', \'abc\\ndef\', 3;\n\ninsert t1 values (40);\n\nxa end \'12\\r34\\t67\\v78\', \'abc\\ndef\', 3;\n\nxa prepare \'12\\r34\\t67\\v78\', \'abc\\ndef\', 3;\n\nxa recover format=\'RAW\';\n+----------+--------------+--------------+--------------------+\n| formatID | gtrid_length | bqual_length | data |\n+----------+--------------+--------------+--------------------+\n34 67v78abc 11 | 7 | 12\ndef |\n+----------+--------------+--------------+--------------------+\n\nxa recover format=\'SQL\';\n+----------+--------------+--------------+-------------------------------------\n---------+\n| formatID | gtrid_length | bqual_length | data \n |\n+----------+--------------+--------------+-------------------------------------\n---------+\n| 3 | 11 | 7 |\nX\'31320d3334093637763738\',X\'6162630a646566\',3 |\n+----------+--------------+--------------+-------------------------------------\n---------+\n\nxa rollback X\'31320d3334093637763738\',X\'6162630a646566\',3;\n\nKnown Issues\n------------\n\nMariaDB Galera Cluster\n----------------------\n\nMariaDB Galera Cluster does not support XA transactions.\n\nHowever, MariaDB Galera Cluster builds include a built-in plugin called wsrep.\nPrior to MariaDB 10.4.3, this plugin was internally considered an XA-capable\nstorage engine. Consequently, these MariaDB Galera Cluster builds have\nmultiple XA-capable storage engines by default, even if the only \"real\"\nstorage engine that supports external XA transactions enabled on these builds\nby default is InnoDB. Therefore, when using one these builds MariaDB would be\nforced to use a transaction coordinator log by default, which could have\nperformance implications.\n\nSee Transaction Coordinator Log Overview: MariaDB Galera Cluster for more\ninformation.\n\nURL: https://mariadb.com/kb/en/xa-transactions/','','https://mariadb.com/kb/en/xa-transactions/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (105,10,'CREATE USER','Syntax\n------\n\nCREATE [OR REPLACE] USER [IF NOT EXISTS] \n user_specification [,user_specification ...] \n [REQUIRE {NONE | tls_option [[AND] tls_option ...] }]\n [WITH resource_option [resource_option ...] ]\n [lock_option] [password_option]\n\nuser_specification:\n username [authentication_option]\n\nauthentication_option:\n IDENTIFIED BY \'password\'\n | IDENTIFIED BY PASSWORD \'password_hash\'\n | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule ...]\n\nauthentication_rule:\n authentication_plugin\n | authentication_plugin {USING|AS} \'authentication_string\'\n | authentication_plugin {USING|AS} PASSWORD(\'password\')\n\ntls_option:\n SSL\n | X509\n | CIPHER \'cipher\'\n | ISSUER \'issuer\'\n | SUBJECT \'subject\'\n\nresource_option:\n MAX_QUERIES_PER_HOUR count\n | MAX_UPDATES_PER_HOUR count\n | MAX_CONNECTIONS_PER_HOUR count\n | MAX_USER_CONNECTIONS count\n | MAX_STATEMENT_TIME time\n\npassword_option:\n PASSWORD EXPIRE\n | PASSWORD EXPIRE DEFAULT\n | PASSWORD EXPIRE NEVER\n | PASSWORD EXPIRE INTERVAL N DAY\n\nlock_option:\n ACCOUNT LOCK\n | ACCOUNT UNLOCK\n}\n\nDescription\n-----------\n\nThe CREATE USER statement creates new MariaDB accounts. To use it, you must\nhave the global CREATE USER privilege or the INSERT privilege for the mysql\ndatabase. For each account, CREATE USER creates a new row in mysql.user (until\nMariaDB 10.3 this is a table, from MariaDB 10.4 it\'s a view) or\nmysql.global_priv_table (from MariaDB 10.4) that has no privileges.\n\nIf any of the specified accounts, or any permissions for the specified\naccounts, already exist, then the server returns ERROR 1396 (HY000). If an\nerror occurs, CREATE USER will still create the accounts that do not result in\nan error. Only one error is produced for all users which have not been created:\n\nERROR 1396 (HY000): \n Operation CREATE USER failed for \'u1\'@\'%\',\'u2\'@\'%\'\n\nCREATE USER, DROP USER, CREATE ROLE, and DROP ROLE all produce the same error\ncode when they fail.\n\nSee Account Names below for details on how account names are specified.\n\nOR REPLACE\n----------\n\nIf the optional OR REPLACE clause is used, it is basically a shortcut for:\n\nDROP USER IF EXISTS name;\nCREATE USER name ...;\n\nFor example:\n\nCREATE USER foo2@test IDENTIFIED BY \'password\';\nERROR 1396 (HY000): Operation CREATE USER failed for \'foo2\'@\'test\'\n\nCREATE OR REPLACE USER foo2@test IDENTIFIED BY \'password\';\nQuery OK, 0 rows affected (0.00 sec)\n\nIF NOT EXISTS\n-------------\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified user already exists.\n\nFor example:\n\nCREATE USER foo2@test IDENTIFIED BY \'password\';\nERROR 1396 (HY000): Operation CREATE USER failed for \'foo2\'@\'test\'\n\nCREATE USER IF NOT EXISTS foo2@test IDENTIFIED BY \'password\';\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+----------------------------------------------------+\n| Level | Code | Message |\n+-------+------+----------------------------------------------------+\n| Note | 1973 | Can\'t create user \'foo2\'@\'test\'; it already exists |\n+-------+------+----------------------------------------------------+\n\nAuthentication Options\n----------------------\n\nIDENTIFIED BY \'password\'\n------------------------\n\nThe optional IDENTIFIED BY clause can be used to provide an account with a\npassword. The password should be specified in plain text. It will be hashed by\nthe PASSWORD function prior to being stored in the\nmysql.user/mysql.global_priv_table table.\n\nFor example, if our password is mariadb, then we can create the user with:\n\nCREATE USER foo2@test IDENTIFIED BY \'mariadb\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED BY PASSWORD \'password_hash\'\n--------------------------------------\n\nThe optional IDENTIFIED BY PASSWORD clause can be used to provide an account\nwith a password that has already been hashed. The password should be specified\nas a hash that was provided by the PASSWORD function. It will be stored in the\nmysql.user/mysql.global_priv_table table as-is.\n\nFor example, if our password is mariadb, then we can find the hash with:\n\nSELECT PASSWORD(\'mariadb\');\n+-------------------------------------------+\n| PASSWORD(\'mariadb\') |\n+-------------------------------------------+\n| *54958E764CE10E50764C2EECBB71D01F08549980 |\n+-------------------------------------------+\n1 row in set (0.00 sec)\n\nAnd then we can create a user with the hash:\n\nCREATE USER foo2@test IDENTIFIED BY PASSWORD\n\'*54958E764CE10E50764C2EECBB71D01F08549980\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED {VIA|WITH} authentication_plugin\n-------------------------------------------\n\nThe optional IDENTIFIED VIA authentication_plugin allows you to specify that\nthe account should be authenticated by a specific authentication plugin. The\nplugin name must be an active authentication plugin as per SHOW PLUGINS. If it\ndoesn\'t show up in that output, then you will need to install it with INSTALL\nPLUGIN or INSTALL SONAME.\n\nFor example, this could be used with the PAM authentication plugin:\n\nCREATE USER foo2@test IDENTIFIED VIA pam;\n\nSome authentication plugins allow additional arguments to be specified after a\nUSING or AS keyword. For example, the PAM authentication plugin accepts a\nservice name:\n\nCREATE USER foo2@test IDENTIFIED VIA pam USING \'mariadb\';\n\nThe exact meaning of the additional argument would depend on the specific\nauthentication plugin.\n\nMariaDB starting with 10.4.0\n----------------------------\nThe USING or AS keyword can also be used to provide a plain-text password to a\nplugin if it\'s provided as an argument to the PASSWORD() function. This is\nonly valid for authentication plugins that have implemented a hook for the\nPASSWORD() function. For example, the ed25519 authentication plugin supports\nthis:\n\nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 USING PASSWORD(\'secret\');\n\nMariaDB starting with 10.4.3\n----------------------------\nOne can specify many authentication plugins, they all work as alternatives\nways of authenticating a user:\n\nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 USING PASSWORD(\'secret\') OR\nunix_socket;\n\nBy default, when you create a user without specifying an authentication\nplugin, MariaDB uses the mysql_native_password plugin.\n\nTLS Options\n-----------\n\nBy default, MariaDB transmits data between the server and clients without\nencrypting it. This is generally acceptable when the server and client run on\nthe same host or in networks where security is guaranteed through other means.\nHowever, in cases where the server and client exist on separate networks or\nthey are in a high-risk network, the lack of encryption does introduce\nsecurity concerns as a malicious actor could potentially eavesdrop on the\ntraffic as it is sent over the network between them.\n\nTo mitigate this concern, MariaDB allows you to encrypt data in transit\nbetween the server and clients using the Transport Layer Security (TLS)\nprotocol. TLS was formerly known as Secure Socket Layer (SSL), but strictly\nspeaking the SSL protocol is a predecessor to TLS and, that version of the\nprotocol is now considered insecure. The documentation still uses the term SSL\noften and for compatibility reasons TLS-related server system and status\nvariables still use the prefix ssl_, but internally, MariaDB only supports its\nsecure successors.\n\nSee Secure Connections Overview for more information about how to determine\nwhether your MariaDB server has TLS support.\n\nYou can set certain TLS-related restrictions for specific user accounts. For\ninstance, you might use this with user accounts that require access to\nsensitive data while sending it across networks that you do not control. These\nrestrictions can be enabled for a user account with the CREATE USER, ALTER\nUSER, or GRANT statements. The following options are available:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| REQUIRE NONE | TLS is not required for this account, but can |\n| | still be used. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SSL | The account must use TLS, but no valid X509 |\n| | certificate is required. This option cannot |\n| | be combined with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE X509 | The account must use TLS and must have a |\n| | valid X509 certificate. This option implies |\n| | REQUIRE SSL. This option cannot be combined |\n| | with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE ISSUER \'issuer\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the Certificate |\n| | Authority must be the one specified via the |\n| | string issuer. This option implies REQUIRE |\n| | X509. This option can be combined with the |\n| | SUBJECT, and CIPHER options in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SUBJECT \'subject\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the |\n| | certificate\'s Subject must be the one |\n| | specified via the string subject. This option |\n| | implies REQUIRE X509. This option can be |\n| | combined with the ISSUER, and CIPHER options |\n| | in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE CIPHER \'cipher\' | The account must use TLS, but no valid X509 |\n| | certificate is required. Also, the encryption |\n| | used for the connection must use a specific |\n| | cipher method specified in the string cipher. |\n| | This option implies REQUIRE SSL. This option |\n| | can be combined with the ISSUER, and SUBJECT |\n| | options in any order. |\n+---------------------------+------------------------------------------------+\n\nThe REQUIRE keyword must be used only once for all specified options, and the\nAND keyword can be used to separate individual options, but it is not required.\n\nFor example, you can create a user account that requires these TLS options\nwith the following:\n\nCREATE USER \'alice\'@\'%\'\n REQUIRE SUBJECT \'/CN=alice/O=My Dom, Inc./C=US/ST=Oregon/L=Portland\'\n AND ISSUER \'/C=FI/ST=Somewhere/L=City/ O=Some Company/CN=Peter\nParker/emailAddress=p.parker@marvel.com\'\n AND CIPHER \'SHA-DES-CBC3-EDH-RSA\';\n\nIf any of these options are set for a specific user account, then any client\nwho tries to connect with that user account will have to be configured to\nconnect with TLS.\n\nSee Securing Connections for Client and Server for information on how to\nenable TLS on the client and server.\n\nResource Limit Options\n----------------------\n\nIt is possible to set per-account limits for certain server resources. The\nfollowing table shows the values that can be set per account:\n\n+--------------------------------------+--------------------------------------+\n| Limit Type | Decription |\n+--------------------------------------+--------------------------------------+\n| MAX_QUERIES_PER_HOUR | Number of statements that the |\n| | account can issue per hour |\n| | (including updates) |\n+--------------------------------------+--------------------------------------+\n| MAX_UPDATES_PER_HOUR | Number of updates (not queries) |\n| | that the account can issue per hour |\n+--------------------------------------+--------------------------------------+\n| MAX_CONNECTIONS_PER_HOUR | Number of connections that the |\n| | account can start per hour |\n+--------------------------------------+--------------------------------------+\n| MAX_USER_CONNECTIONS | Number of simultaneous connections |\n| | that can be accepted from the same |\n| | account; if it is 0, |\n| | max_connections will be used |\n| | instead; if max_connections is 0, |\n| | there is no limit for this |\n| | account\'s simultaneous connections. |\n+--------------------------------------+--------------------------------------+\n| MAX_STATEMENT_TIME | Timeout, in seconds, for statements |','','https://mariadb.com/kb/en/create-user/');
+update help_topic set description = CONCAT(description, '\n| | executed by the user. See also |\n| | Aborting Statements that Exceed a |\n| | Certain Time to Execute. |\n+--------------------------------------+--------------------------------------+\n\nIf any of these limits are set to 0, then there is no limit for that resource\nfor that user.\n\nHere is an example showing how to create a user with resource limits:\n\nCREATE USER \'someone\'@\'localhost\' WITH\n MAX_USER_CONNECTIONS 10\n MAX_QUERIES_PER_HOUR 200;\n\nThe resources are tracked per account, which means \'user\'@\'server\'; not per\nuser name or per connection.\n\nThe count can be reset for all users using FLUSH USER_RESOURCES, FLUSH\nPRIVILEGES or mysqladmin reload.\n\nPer account resource limits are stored in the user table, in the mysql\ndatabase. Columns used for resources limits are named max_questions,\nmax_updates, max_connections (for MAX_CONNECTIONS_PER_HOUR), and\nmax_user_connections (for MAX_USER_CONNECTIONS).\n\nAccount Names\n-------------\n\nAccount names have both a user name component and a host name component, and\nare specified as \'user_name\'@\'host_name\'.\n\nThe user name and host name may be unquoted, quoted as strings using double\nquotes (\") or single quotes (\'), or quoted as identifiers using backticks (`).\nYou must use quotes when using special characters (such as a hyphen) or\nwildcard characters. If you quote, you must quote the user name and host name\nseparately (for example \'user_name\'@\'host_name\').\n\nHost Name Component\n-------------------\n\nIf the host name is not provided, it is assumed to be \'%\'.\n\nHost names may contain the wildcard characters % and _. They are matched as if\nby the LIKE clause. If you need to use a wildcard character literally (for\nexample, to match a domain name with an underscore), prefix the character with\na backslash. See LIKE for more information on escaping wildcard characters.\n\nHost name matches are case-insensitive. Host names can match either domain\nnames or IP addresses. Use \'localhost\' as the host name to allow only local\nclient connections.\n\nYou can use a netmask to match a range of IP addresses using \'base_ip/netmask\'\nas the host name. A user with an IP address ip_addr will be allowed to connect\nif the following condition is true:\n\nip_addr & netmask = base_ip\n\nFor example, given a user:\n\nCREATE USER \'maria\'@\'247.150.130.0/255.255.255.0\';\n\nthe IP addresses satisfying this condition range from 247.150.130.0 to\n247.150.130.255.\n\nUsing 255.255.255.255 is equivalent to not using a netmask at all. Netmasks\ncannot be used for IPv6 addresses.\n\nNote that the credentials added when creating a user with the \'%\' wildcard\nhost will not grant access in all cases. For example, some systems come with\nan anonymous localhost user, and when connecting from localhost this will take\nprecedence.\n\nBefore MariaDB 10.6, the host name component could be up to 60 characters in\nlength. Starting from MariaDB 10.6, it can be up to 255 characters.\n\nUser Name Component\n-------------------\n\nUser names must match exactly, including case. A user name that is empty is\nknown as an anonymous account and is allowed to match a login attempt with any\nuser name component. These are described more in the next section.\n\nFor valid identifiers to use as user names, see Identifier Names.\n\nIt is possible for more than one account to match when a user connects.\nMariaDB selects the first matching account after sorting according to the\nfollowing criteria:\n\n* Accounts with an exact host name are sorted before accounts using a wildcard\nin the\nhost name. Host names using a netmask are considered to be exact for sorting.\n* Accounts with a wildcard in the host name are sorted according to the\nposition of\nthe first wildcard character. Those with a wildcard character later in the\nhost name\nsort before those with a wildcard character earlier in the host name.\n* Accounts with a non-empty user name sort before accounts with an empty user\nname.\n* Accounts with an empty user name are sorted last. As mentioned previously,\nthese are known as anonymous accounts. These are described more in the next\nsection.\n\nThe following table shows a list of example account as sorted by these\ncriteria:\n\n+---------+-------------+\n| User | Host |\n+---------+-------------+\n| joffrey | 192.168.0.3 |\n| | 192.168.0.% |\n| joffrey | 192.168.% |\n| | 192.168.% |\n+---------+-------------+\n\nOnce connected, you only have the privileges granted to the account that\nmatched, not all accounts that could have matched. For example, consider the\nfollowing commands:\n\nCREATE USER \'joffrey\'@\'192.168.0.3\';\nCREATE USER \'joffrey\'@\'%\';\nGRANT SELECT ON test.t1 to \'joffrey\'@\'192.168.0.3\';\nGRANT SELECT ON test.t2 to \'joffrey\'@\'%\';\n\nIf you connect as joffrey from 192.168.0.3, you will have the SELECT privilege\non the table test.t1, but not on the table test.t2. If you connect as joffrey\nfrom any other IP address, you will have the SELECT privilege on the table\ntest.t2, but not on the table test.t1.\n\nUsernames can be up to 80 characters long before 10.6 and starting from 10.6\nit can be 128 characters long.\n\nAnonymous Accounts\n------------------\n\nAnonymous accounts are accounts where the user name portion of the account\nname is empty. These accounts act as special catch-all accounts. If a user\nattempts to log into the system from a host, and an anonymous account exists\nwith a host name portion that matches the user\'s host, then the user will log\nin as the anonymous account if there is no more specific account match for the\nuser name that the user entered.\n\nFor example, here are some anonymous accounts:\n\nCREATE USER \'\'@\'localhost\';\nCREATE USER \'\'@\'192.168.0.3\';\n\nFixing a Legacy Default Anonymous Account\n-----------------------------------------\n\nOn some systems, the mysql.db table has some entries for the \'\'@\'%\' anonymous\naccount by default. Unfortunately, there is no matching entry in the\nmysql.user/mysql.global_priv_table table, which means that this anonymous\naccount doesn\'t exactly exist, but it does have privileges--usually on the\ndefault test database created by mysql_install_db. These account-less\nprivileges are a legacy that is leftover from a time when MySQL\'s privilege\nsystem was less advanced.\n\nThis situation means that you will run into errors if you try to create a\n\'\'@\'%\' account. For example:\n\nCREATE USER \'\'@\'%\';\nERROR 1396 (HY000): Operation CREATE USER failed for \'\'@\'%\'\n\nThe fix is to DELETE the row in the mysql.db table and then execute FLUSH\nPRIVILEGES:\n\nDELETE FROM mysql.db WHERE User=\'\' AND Host=\'%\';\nFLUSH PRIVILEGES;\n\nAnd then the account can be created:\n\nCREATE USER \'\'@\'%\';\nQuery OK, 0 rows affected (0.01 sec)\n\nSee MDEV-13486 for more information.\n\nPassword Expiry\n---------------\n\nMariaDB starting with 10.4.3\n----------------------------\nBesides automatic password expiry, as determined by default_password_lifetime,\npassword expiry times can be set on an individual user basis, overriding the\nglobal setting, for example:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\n\nSee User Password Expiry for more details.\n\nAccount Locking\n---------------\n\nMariaDB starting with 10.4.2\n----------------------------\nAccount locking permits privileged administrators to lock/unlock user\naccounts. No new client connections will be permitted if an account is locked\n(existing connections are not affected). For example:\n\nCREATE USER \'marijn\'@\'localhost\' ACCOUNT LOCK;\n\nSee Account Locking for more details.\n\nFrom MariaDB 10.4.7 and MariaDB 10.5.8, the lock_option and password_option\nclauses can occur in either order.\n\nURL: https://mariadb.com/kb/en/create-user/') WHERE help_topic_id = 105;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (106,10,'ALTER USER','Syntax\n------\n\nALTER USER [IF EXISTS] \n user_specification [,user_specification] ...\n [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]\n [WITH resource_option [resource_option] ...]\n [lock_option] [password_option]\n\nuser_specification:\n username [authentication_option]\n\nauthentication_option:\n IDENTIFIED BY \'password\'\n | IDENTIFIED BY PASSWORD \'password_hash\'\n | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule] ...\n\nauthentication_rule:\n authentication_plugin\n | authentication_plugin {USING|AS} \'authentication_string\'\n | authentication_plugin {USING|AS} PASSWORD(\'password\')\n\ntls_option\n SSL\n | X509\n | CIPHER \'cipher\'\n | ISSUER \'issuer\'\n | SUBJECT \'subject\'\n\nresource_option\n MAX_QUERIES_PER_HOUR count\n | MAX_UPDATES_PER_HOUR count\n | MAX_CONNECTIONS_PER_HOUR count\n | MAX_USER_CONNECTIONS count\n | MAX_STATEMENT_TIME time\n\npassword_option:\n PASSWORD EXPIRE\n | PASSWORD EXPIRE DEFAULT\n | PASSWORD EXPIRE NEVER\n | PASSWORD EXPIRE INTERVAL N DAY\n\nlock_option:\n ACCOUNT LOCK\n | ACCOUNT UNLOCK\n}\n\nDescription\n-----------\n\nThe ALTER USER statement modifies existing MariaDB accounts. To use it, you\nmust have the global CREATE USER privilege or the UPDATE privilege for the\nmysql database. The global SUPER privilege is also required if the read_only\nsystem variable is enabled.\n\nIf any of the specified user accounts do not yet exist, an error results. If\nan error occurs, ALTER USER will still modify the accounts that do not result\nin an error. Only one error is produced for all users which have not been\nmodified.\n\nIF EXISTS\n---------\n\nWhen the IF EXISTS clause is used, MariaDB will return a warning instead of an\nerror for each specified user that does not exist.\n\nAccount Names\n-------------\n\nFor ALTER USER statements, account names are specified as the username\nargument in the same way as they are for CREATE USER statements. See account\nnames from the CREATE USER page for details on how account names are specified.\n\nCURRENT_USER or CURRENT_USER() can also be used to alter the account logged\ninto the current session. For example, to change the current user\'s password\nto mariadb:\n\nALTER USER CURRENT_USER() IDENTIFIED BY \'mariadb\';\n\nAuthentication Options\n----------------------\n\nMariaDB starting with 10.4\n--------------------------\nFrom MariaDB 10.4, it is possible to use more than one authentication plugin\nfor each user account. For example, this can be useful to slowly migrate users\nto the more secure ed25519 authentication plugin over time, while allowing the\nold mysql_native_password authentication plugin as an alternative for the\ntransitional period. See Authentication from MariaDB 10.4 for more.\n\nWhen running ALTER USER, not specifying an authentication option in the\nIDENTIFIED VIA clause will remove that authentication method. (However this\nwas not the case before MariaDB 10.4.13, see MDEV-21928)\n\nFor example, a user is created with the ability to authenticate via both a\npassword and unix_socket:\n\nCREATE USER \'bob\'@\'localhost\' \n IDENTIFIED VIA mysql_native_password USING PASSWORD(\'pwd\')\n OR unix_socket;\n\nSHOW CREATE USER \'bob\'@\'localhost\'\\G\n*************************** 1. row ***************************\nCREATE USER for bob@localhost: CREATE USER `bob`@`localhost` \n IDENTIFIED VIA mysql_native_password\n USING \'*975B2CD4FF9AE554FE8AD33168FBFC326D2021DD\'\n OR unix_socket\n\nIf the user\'s password is updated, but unix_socket authentication is not\nspecified in the IDENTIFIED VIA clause, unix_socket authentication will no\nlonger be permitted.\n\nALTER USER \'bob\'@\'localhost\' IDENTIFIED VIA mysql_native_password \n USING PASSWORD(\'pwd2\');\n\nSHOW CREATE USER \'bob\'@\'localhost\'\\G\n*************************** 1. row ***************************\nCREATE USER for bob@localhost: CREATE USER `bob`@`localhost` \n IDENTIFIED BY PASSWORD \'*38366FDA01695B6A5A9DD4E428D9FB8F7EB75512\'\n\nIDENTIFIED BY \'password\'\n------------------------\n\nThe optional IDENTIFIED BY clause can be used to provide an account with a\npassword. The password should be specified in plain text. It will be hashed by\nthe PASSWORD function prior to being stored to the mysql.user table.\n\nFor example, if our password is mariadb, then we can set the account\'s\npassword with:\n\nALTER USER foo2@test IDENTIFIED BY \'mariadb\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED BY PASSWORD \'password_hash\'\n--------------------------------------\n\nThe optional IDENTIFIED BY PASSWORD clause can be used to provide an account\nwith a password that has already been hashed. The password should be specified\nas a hash that was provided by the PASSWORD#function. It will be stored to the\nmysql.user table as-is.\n\nFor example, if our password is mariadb, then we can find the hash with:\n\nSELECT PASSWORD(\'mariadb\');\n+-------------------------------------------+\n| PASSWORD(\'mariadb\') |\n+-------------------------------------------+\n| *54958E764CE10E50764C2EECBB71D01F08549980 |\n+-------------------------------------------+\n\nAnd then we can set an account\'s password with the hash:\n\nALTER USER foo2@test \n IDENTIFIED BY PASSWORD \'*54958E764CE10E50764C2EECBB71D01F08549980\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED {VIA|WITH} authentication_plugin\n-------------------------------------------\n\nThe optional IDENTIFIED VIA authentication_plugin allows you to specify that\nthe account should be authenticated by a specific authentication plugin. The\nplugin name must be an active authentication plugin as per SHOW PLUGINS. If it\ndoesn\'t show up in that output, then you will need to install it with INSTALL\nPLUGIN or INSTALL SONAME.\n\nFor example, this could be used with the PAM authentication plugin:\n\nALTER USER foo2@test IDENTIFIED VIA pam;\n\nSome authentication plugins allow additional arguments to be specified after a\nUSING or AS keyword. For example, the PAM authentication plugin accepts a\nservice name:\n\nALTER USER foo2@test IDENTIFIED VIA pam USING \'mariadb\';\n\nThe exact meaning of the additional argument would depend on the specific\nauthentication plugin.\n\nIn MariaDB 10.4 and later, the USING or AS keyword can also be used to provide\na plain-text password to a plugin if it\'s provided as an argument to the\nPASSWORD() function. This is only valid for authentication plugins that have\nimplemented a hook for the PASSWORD() function. For example, the ed25519\nauthentication plugin supports this:\n\nALTER USER safe@\'%\' IDENTIFIED VIA ed25519 USING PASSWORD(\'secret\');\n\nTLS Options\n-----------\n\nBy default, MariaDB transmits data between the server and clients without\nencrypting it. This is generally acceptable when the server and client run on\nthe same host or in networks where security is guaranteed through other means.\nHowever, in cases where the server and client exist on separate networks or\nthey are in a high-risk network, the lack of encryption does introduce\nsecurity concerns as a malicious actor could potentially eavesdrop on the\ntraffic as it is sent over the network between them.\n\nTo mitigate this concern, MariaDB allows you to encrypt data in transit\nbetween the server and clients using the Transport Layer Security (TLS)\nprotocol. TLS was formerly known as Secure Socket Layer (SSL), but strictly\nspeaking the SSL protocol is a predecessor to TLS and, that version of the\nprotocol is now considered insecure. The documentation still uses the term SSL\noften and for compatibility reasons TLS-related server system and status\nvariables still use the prefix ssl_, but internally, MariaDB only supports its\nsecure successors.\n\nSee Secure Connections Overview for more information about how to determine\nwhether your MariaDB server has TLS support.\n\nYou can set certain TLS-related restrictions for specific user accounts. For\ninstance, you might use this with user accounts that require access to\nsensitive data while sending it across networks that you do not control. These\nrestrictions can be enabled for a user account with the CREATE USER, ALTER\nUSER, or GRANT statements. The following options are available:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| REQUIRE NONE | TLS is not required for this account, but can |\n| | still be used. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SSL | The account must use TLS, but no valid X509 |\n| | certificate is required. This option cannot |\n| | be combined with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE X509 | The account must use TLS and must have a |\n| | valid X509 certificate. This option implies |\n| | REQUIRE SSL. This option cannot be combined |\n| | with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE ISSUER \'issuer\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the Certificate |\n| | Authority must be the one specified via the |\n| | string issuer. This option implies REQUIRE |\n| | X509. This option can be combined with the |\n| | SUBJECT, and CIPHER options in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SUBJECT \'subject\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the |\n| | certificate\'s Subject must be the one |\n| | specified via the string subject. This option |\n| | implies REQUIRE X509. This option can be |\n| | combined with the ISSUER, and CIPHER options |\n| | in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE CIPHER \'cipher\' | The account must use TLS, but no valid X509 |\n| | certificate is required. Also, the encryption |\n| | used for the connection must use a specific |\n| | cipher method specified in the string cipher. |\n| | This option implies REQUIRE SSL. This option |\n| | can be combined with the ISSUER, and SUBJECT |\n| | options in any order. |\n+---------------------------+------------------------------------------------+\n\nThe REQUIRE keyword must be used only once for all specified options, and the\nAND keyword can be used to separate individual options, but it is not required.\n\nFor example, you can alter a user account to require these TLS options with\nthe following:\n\nALTER USER \'alice\'@\'%\'\n REQUIRE SUBJECT \'/CN=alice/O=My Dom, Inc./C=US/ST=Oregon/L=Portland\' AND\n ISSUER \'/C=FI/ST=Somewhere/L=City/ O=Some Company/CN=Peter\nParker/emailAddress=p.parker@marvel.com\'\n AND CIPHER \'SHA-DES-CBC3-EDH-RSA\';\n\nIf any of these options are set for a specific user account, then any client\nwho tries to connect with that user account will have to be configured to\nconnect with TLS.\n\nSee Securing Connections for Client and Server for information on how to\nenable TLS on the client and server.\n\nResource Limit Options\n----------------------\n\nIt is possible to set per-account limits for certain server resources. The\nfollowing table shows the values that can be set per account:\n\n+------------------------------------+---------------------------------------+\n| Limit Type | Description |\n+------------------------------------+---------------------------------------+\n| MAX_QUERIES_PER_HOUR | Number of statements that the |\n| | account can issue per hour |\n| | (including updates) |\n+------------------------------------+---------------------------------------+\n| MAX_UPDATES_PER_HOUR | Number of updates (not queries) that |\n| | the account can issue per hour |\n+------------------------------------+---------------------------------------+\n| MAX_CONNECTIONS_PER_HOUR | Number of connections that the |\n| | account can start per hour |\n+------------------------------------+---------------------------------------+\n| MAX_USER_CONNECTIONS | Number of simultaneous connections |\n| | that can be accepted from the same |\n| | account; if it is 0, max_connections |\n| | will be used instead; if |\n| | max_connections is 0, there is no |\n| | limit for this account\'s |\n| | simultaneous connections. |','','https://mariadb.com/kb/en/alter-user/');
+update help_topic set description = CONCAT(description, '\n+------------------------------------+---------------------------------------+\n| MAX_STATEMENT_TIME | Timeout, in seconds, for statements |\n| | executed by the user. See also |\n| | Aborting Statements that Exceed a |\n| | Certain Time to Execute. |\n+------------------------------------+---------------------------------------+\n\nIf any of these limits are set to 0, then there is no limit for that resource\nfor that user.\n\nHere is an example showing how to set an account\'s resource limits:\n\nALTER USER \'someone\'@\'localhost\' WITH\n MAX_USER_CONNECTIONS 10\n MAX_QUERIES_PER_HOUR 200;\n\nThe resources are tracked per account, which means \'user\'@\'server\'; not per\nuser name or per connection.\n\nThe count can be reset for all users using FLUSH USER_RESOURCES, FLUSH\nPRIVILEGES or mysqladmin reload.\n\nPer account resource limits are stored in the user table, in the mysql\ndatabase. Columns used for resources limits are named max_questions,\nmax_updates, max_connections (for MAX_CONNECTIONS_PER_HOUR), and\nmax_user_connections (for MAX_USER_CONNECTIONS).\n\nPassword Expiry\n---------------\n\nMariaDB starting with 10.4.3\n----------------------------\nBesides automatic password expiry, as determined by default_password_lifetime,\npassword expiry times can be set on an individual user basis, overriding the\nglobal setting, for example:\n\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE NEVER;\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n\nSee User Password Expiry for more details.\n\nAccount Locking\n---------------\n\nMariaDB starting with 10.4.2\n----------------------------\nAccount locking permits privileged administrators to lock/unlock user\naccounts. No new client connections will be permitted if an account is locked\n(existing connections are not affected). For example:\n\nALTER USER \'marijn\'@\'localhost\' ACCOUNT LOCK;\n\nSee Account Locking for more details.\n\nFrom MariaDB 10.4.7 and MariaDB 10.5.8, the lock_option and password_option\nclauses can occur in either order.\n\nURL: https://mariadb.com/kb/en/alter-user/') WHERE help_topic_id = 106;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (107,10,'DROP USER','Syntax\n------\n\nDROP USER [IF EXISTS] user_name [, user_name] ...\n\nDescription\n-----------\n\nThe DROP USER statement removes one or more MariaDB accounts. It removes\nprivilege rows for the account from all grant tables. To use this statement,\nyou must have the global CREATE USER privilege or the DELETE privilege for the\nmysql database. Each account is named using the same format as for the CREATE\nUSER statement; for example, \'jeffrey\'@\'localhost\'. If you specify only the\nuser name part of the account name, a host name part of \'%\' is used. For\nadditional information about specifying account names, see CREATE USER.\n\nNote that, if you specify an account that is currently connected, it will not\nbe deleted until the connection is closed. The connection will not be\nautomatically closed.\n\nIf any of the specified user accounts do not exist, ERROR 1396 (HY000)\nresults. If an error occurs, DROP USER will still drop the accounts that do\nnot result in an error. Only one error is produced for all users which have\nnot been dropped:\n\nERROR 1396 (HY000): Operation DROP USER failed for \'u1\'@\'%\',\'u2\'@\'%\'\n\nFailed CREATE or DROP operations, for both users and roles, produce the same\nerror code.\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will return a note instead of an\nerror if the user does not exist.\n\nExamples\n--------\n\nDROP USER bob;\n\nDROP USER foo2@localhost,foo2@\'127.%\';\n\nIF EXISTS:\n\nDROP USER bob;\nERROR 1396 (HY000): Operation DROP USER failed for \'bob\'@\'%\'\n\nDROP USER IF EXISTS bob;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+---------------------------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------------------------+\n| Note | 1974 | Can\'t drop user \'bob\'@\'%\'; it doesn\'t exist |\n+-------+------+---------------------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-user/','','https://mariadb.com/kb/en/drop-user/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (108,10,'GRANT','Syntax\n------\n\nGRANT\n priv_type [(column_list)]\n [, priv_type [(column_list)]] ...\n ON [object_type] priv_level\n TO user_specification [ user_options ...]\n\nuser_specification:\n username [authentication_option]\n | PUBLIC\nauthentication_option:\n IDENTIFIED BY \'password\'\n | IDENTIFIED BY PASSWORD \'password_hash\'\n | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule ...]\n\nauthentication_rule:\n authentication_plugin\n | authentication_plugin {USING|AS} \'authentication_string\'\n | authentication_plugin {USING|AS} PASSWORD(\'password\')\n\nGRANT PROXY ON username\n TO user_specification [, user_specification ...]\n [WITH GRANT OPTION]\n\nGRANT rolename TO grantee [, grantee ...]\n [WITH ADMIN OPTION]\n\ngrantee:\n rolename\n username [authentication_option]\n\nuser_options:\n [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]\n [WITH with_option [with_option] ...]\n\nobject_type:\n TABLE\n | FUNCTION\n | PROCEDURE\n | PACKAGE\n\npriv_level:\n *\n | *.*\n | db_name.*\n | db_name.tbl_name\n | tbl_name\n | db_name.routine_name\n\nwith_option:\n GRANT OPTION\n | resource_option\n\nresource_option:\n MAX_QUERIES_PER_HOUR count\n | MAX_UPDATES_PER_HOUR count\n | MAX_CONNECTIONS_PER_HOUR count\n | MAX_USER_CONNECTIONS count\n | MAX_STATEMENT_TIME time\n\ntls_option:\n SSL\n | X509\n | CIPHER \'cipher\'\n | ISSUER \'issuer\'\n | SUBJECT \'subject\'\n\nDescription\n-----------\n\nThe GRANT statement allows you to grant privileges or roles to accounts. To\nuse GRANT, you must have the GRANT OPTION privilege, and you must have the\nprivileges that you are granting.\n\nUse the REVOKE statement to revoke privileges granted with the GRANT statement.\n\nUse the SHOW GRANTS statement to determine what privileges an account has.\n\nAccount Names\n-------------\n\nFor GRANT statements, account names are specified as the username argument in\nthe same way as they are for CREATE USER statements. See account names from\nthe CREATE USER page for details on how account names are specified.\n\nImplicit Account Creation\n-------------------------\n\nThe GRANT statement also allows you to implicitly create accounts in some\ncases.\n\nIf the account does not yet exist, then GRANT can implicitly create it. To\nimplicitly create an account with GRANT, a user is required to have the same\nprivileges that would be required to explicitly create the account with the\nCREATE USER statement.\n\nIf the NO_AUTO_CREATE_USER SQL_MODE is set, then accounts can only be created\nif authentication information is specified, or with a CREATE USER statement.\nIf no authentication information is provided, GRANT will produce an error when\nthe specified account does not exist, for example:\n\nshow variables like \'%sql_mode%\' ;\n+---------------+--------------------------------------------+\n| Variable_name | Value |\n+---------------+--------------------------------------------+\n| sql_mode | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |\n+---------------+--------------------------------------------+\n\nGRANT USAGE ON *.* TO \'user123\'@\'%\' IDENTIFIED BY \'\';\nERROR 1133 (28000): Can\'t find any matching row in the user table\n\nGRANT USAGE ON *.* TO \'user123\'@\'%\' \n IDENTIFIED VIA PAM using \'mariadb\' require ssl ;\nQuery OK, 0 rows affected (0.00 sec)\n\nselect host, user from mysql.user where user=\'user123\' ;\n\n+------+----------+\n| host | user |\n+------+----------+\n| % | user123 |\n+------+----------+\n\nPrivilege Levels\n----------------\n\nPrivileges can be set globally, for an entire database, for a table or\nroutine, or for individual columns in a table. Certain privileges can only be\nset at certain levels.\n\n* Global privileges priv_type are granted using *.* for\npriv_level. Global privileges include privileges to administer the database\nand manage user accounts, as well as privileges for all tables, functions, and\nprocedures. Global privileges are stored in the mysql.user table prior to\nMariaDB 10.4, and in mysql.global_priv table afterwards.\n* Database privileges priv_type are granted using db_name.*\nfor priv_level, or using just * to use default database. Database\nprivileges include privileges to create tables and functions, as well as\nprivileges for all tables, functions, and procedures in the database. Database\nprivileges are stored in the mysql.db table.\n* Table privileges priv_type are granted using db_name.tbl_name\nfor priv_level, or using just tbl_name to specify a table in the default\ndatabase. The TABLE keyword is optional. Table privileges include the\nability to select and change data in the table. Certain table privileges can\nbe granted for individual columns.\n* Column privileges priv_type are granted by specifying a table for\npriv_level and providing a column list after the privilege type. They allow\nyou to control exactly which columns in a table users can select and change.\n* Function privileges priv_type are granted using FUNCTION db_name.routine_name\nfor priv_level, or using just FUNCTION routine_name to specify a function\nin the default database.\n* Procedure privileges priv_type are granted using PROCEDURE\ndb_name.routine_name\nfor priv_level, or using just PROCEDURE routine_name to specify a procedure\nin the default database.\n\nThe USAGE Privilege\n-------------------\n\nThe USAGE privilege grants no real privileges. The SHOW GRANTS statement will\nshow a global USAGE privilege for a newly-created user. You can use USAGE with\nthe GRANT statement to change options like GRANT OPTION and\nMAX_USER_CONNECTIONS without changing any account privileges.\n\nThe ALL PRIVILEGES Privilege\n----------------------------\n\nThe ALL PRIVILEGES privilege grants all available privileges. Granting all\nprivileges only affects the given privilege level. For example, granting all\nprivileges on a table does not grant any privileges on the database or\nglobally.\n\nUsing ALL PRIVILEGES does not grant the special GRANT OPTION privilege.\n\nYou can use ALL instead of ALL PRIVILEGES.\n\nThe GRANT OPTION Privilege\n--------------------------\n\nUse the WITH GRANT OPTION clause to give users the ability to grant privileges\nto other users at the given privilege level. Users with the GRANT OPTION\nprivilege can only grant privileges they have. They cannot grant privileges at\na higher privilege level than they have the GRANT OPTION privilege.\n\nThe GRANT OPTION privilege cannot be set for individual columns. If you use\nWITH GRANT OPTION when specifying column privileges, the GRANT OPTION\nprivilege will be granted for the entire table.\n\nUsing the WITH GRANT OPTION clause is equivalent to listing GRANT OPTION as a\nprivilege.\n\nGlobal Privileges\n-----------------\n\nThe following table lists the privileges that can be granted globally. You can\nalso grant all database, table, and function privileges globally. When granted\nglobally, these privileges apply to all databases, tables, or functions,\nincluding those created later.\n\nTo set a global privilege, use *.* for priv_level.\n\nBINLOG ADMIN\n------------\n\nEnables administration of the binary log, including the PURGE BINARY LOGS\nstatement and setting the system variables:\n\n* binlog_annotate_row_events\n* binlog_cache_size\n* binlog_commit_wait_count\n* binlog_commit_wait_usec\n* binlog_direct_non_transactional_updates\n* binlog_expire_logs_seconds\n* binlog_file_cache_size\n* binlog_format\n* binlog_row_image\n* binlog_row_metadata\n* binlog_stmt_cache_size\n* expire_logs_days\n* log_bin_compress\n* log_bin_compress_min_len\n* log_bin_trust_function_creators\n* max_binlog_cache_size\n* max_binlog_size\n* max_binlog_stmt_cache_size\n* sql_log_bin and\n* sync_binlog.\n\nAdded in MariaDB 10.5.2.\n\nBINLOG MONITOR\n--------------\n\nNew name for REPLICATION CLIENT from MariaDB 10.5.2, (REPLICATION CLIENT still\nsupported as an alias for compatibility purposes). Permits running SHOW\ncommands related to the binary log, in particular the SHOW BINLOG STATUS and\nSHOW BINARY LOGS statements. Unlike REPLICATION CLIENT prior to MariaDB 10.5,\nSHOW REPLICA STATUS isn\'t included in this privilege, and REPLICA MONITOR is\nrequired.\n\nBINLOG REPLAY\n-------------\n\nEnables replaying the binary log with the BINLOG statement (generated by\nmariadb-binlog), executing SET timestamp when secure_timestamp is set to\nreplication, and setting the session values of system variables usually\nincluded in BINLOG output, in particular:\n\n* gtid_domain_id\n* gtid_seq_no\n* pseudo_thread_id\n* server_id.\n\nAdded in MariaDB 10.5.2\n\nCONNECTION ADMIN\n----------------\n\nEnables administering connection resource limit options. This includes\nignoring the limits specified by:\n\n* max_connections\n* max_user_connections and\n* max_password_errors.\n\nThe statements specified in init_connect are not executed, killing connections\nand queries owned by other users is permitted. The following\nconnection-related system variables can be changed:\n\n* connect_timeout\n* disconnect_on_expired_password\n* extra_max_connections\n* init_connect\n* max_connections\n* max_connect_errors\n* max_password_errors\n* proxy_protocol_networks\n* secure_auth\n* slow_launch_time\n* thread_pool_exact_stats\n* thread_pool_dedicated_listener\n* thread_pool_idle_timeout\n* thread_pool_max_threads\n* thread_pool_min_threads\n* thread_pool_oversubscribe\n* thread_pool_prio_kickup_timer\n* thread_pool_priority\n* thread_pool_size, and\n* thread_pool_stall_limit.\n\nAdded in MariaDB 10.5.2.\n\nCREATE USER\n-----------\n\nCreate a user using the CREATE USER statement, or implicitly create a user\nwith the GRANT statement.\n\nFEDERATED ADMIN\n---------------\n\nExecute CREATE SERVER, ALTER SERVER, and DROP SERVER statements. Added in\nMariaDB 10.5.2.\n\nFILE\n----\n\nRead and write files on the server, using statements like LOAD DATA INFILE or\nfunctions like LOAD_FILE(). Also needed to create CONNECT outward tables.\nMariaDB server must have the permissions to access those files.\n\nGRANT OPTION\n------------\n\nGrant global privileges. You can only grant privileges that you have.\n\nPROCESS\n-------\n\nShow information about the active processes, for example via SHOW PROCESSLIST\nor mysqladmin processlist. If you have the PROCESS privilege, you can see all\nthreads. Otherwise, you can see only your own threads (that is, threads\nassociated with the MariaDB account that you are using).\n\nREAD_ONLY ADMIN\n---------------\n\nUser can set the read_only system variable and allows the user to perform\nwrite operations, even when the read_only option is active. Added in MariaDB\n10.5.2.\n\nFrom MariaDB 10.11.0, the READ_ONLY ADMIN privilege has been removed from\nSUPER. The benefit of this is that one can remove the READ_ONLY ADMIN\nprivilege from all users and ensure that no one can make any changes on any\nnon-temporary tables. This is useful on replicas when one wants to ensure that\nthe replica is kept identical to the primary.\n\nRELOAD\n------\n\nExecute FLUSH statements or equivalent mariadb-admin/mysqladmin commands.\n\nREPLICATION CLIENT\n------------------\n\nExecute SHOW MASTER STATUS and SHOW BINARY LOGS informative statements.\nRenamed to BINLOG MONITOR in MariaDB 10.5.2 (but still supported as an alias\nfor compatibility reasons). SHOW SLAVE STATUS was part of REPLICATION CLIENT\nprior to MariaDB 10.5.\n\nREPLICATION MASTER ADMIN\n------------------------\n\nPermits administration of primary servers, including the SHOW REPLICA HOSTS\nstatement, and setting the gtid_binlog_state, gtid_domain_id,\nmaster_verify_checksum and server_id system variables. Added in MariaDB 10.5.2.\n\nREPLICA MONITOR\n---------------\n\nPermit SHOW REPLICA STATUS and SHOW RELAYLOG EVENTS. From MariaDB 10.5.9.\n\nWhen a user would upgrade from an older major release to a MariaDB 10.5 minor\nrelease prior to MariaDB 10.5.9, certain user accounts would lose\ncapabilities. For example, a user account that had the REPLICATION CLIENT\nprivilege in older major releases could run SHOW REPLICA STATUS, but after\nupgrading to a MariaDB 10.5 minor release prior to MariaDB 10.5.9, they could\nno longer run SHOW REPLICA STATUS, because that statement was changed to\nrequire the REPLICATION REPLICA ADMIN privilege.\n\nThis issue is fixed in MariaDB 10.5.9 with this new privilege, which now\ngrants the user the ability to execute SHOW [ALL] (SLAVE | REPLICA) STATUS.\n\nWhen a database is upgraded from an older major release to MariaDB Server\n10.5.9 or later, any user accounts with the REPLICATION CLIENT or REPLICATION\nSLAVE privileges will automatically be granted the new REPLICA MONITOR\nprivilege. The privilege fix occurs when the server is started up, not when\nmariadb-upgrade is performed.\n\nHowever, when a database is upgraded from an early 10.5 minor release to\n10.5.9 and later, the user will have to fix any user account privileges\nmanually.\n\nREPLICATION REPLICA\n-------------------\n\nSynonym for REPLICATION SLAVE. From MariaDB 10.5.1.\n\nREPLICATION SLAVE\n-----------------\n\nAccounts used by replica servers on the primary need this privilege. This is\nneeded to get the updates made on the master. From MariaDB 10.5.1, REPLICATION\nREPLICA is an alias for REPLICATION SLAVE.\n\nREPLICATION SLAVE ADMIN\n-----------------------\n\nPermits administering replica servers, including START REPLICA/SLAVE, STOP\nREPLICA/SLAVE, CHANGE MASTER, SHOW REPLICA/SLAVE STATUS, SHOW RELAYLOG EVENTS\nstatements, replaying the binary log with the BINLOG statement (generated by\nmariadb-binlog), and setting the system variables:\n\n* gtid_cleanup_batch_size\n* gtid_ignore_duplicates\n* gtid_pos_auto_engines\n* gtid_slave_pos\n* gtid_strict_mode\n* init_slave\n* read_binlog_speed_limit\n* relay_log_purge\n* relay_log_recovery\n* replicate_do_db\n* replicate_do_table\n* replicate_events_marked_for_skip\n* replicate_ignore_db\n* replicate_ignore_table\n* replicate_wild_do_table\n* replicate_wild_ignore_table\n* slave_compressed_protocol\n* slave_ddl_exec_mode\n* slave_domain_parallel_threads\n* slave_exec_mode\n* slave_max_allowed_packet\n* slave_net_timeout\n* slave_parallel_max_queued\n* slave_parallel_mode\n* slave_parallel_threads\n* slave_parallel_workers\n* slave_run_triggers_for_rbr\n* slave_sql_verify_checksum\n* slave_transaction_retry_interval\n* slave_type_conversions\n* sync_master_info\n* sync_relay_log, and\n* sync_relay_log_info.\n\nAdded in MariaDB 10.5.2.\n\nSET USER\n--------\n','','https://mariadb.com/kb/en/grant/');
+update help_topic set description = CONCAT(description, '\nEnables setting the DEFINER when creating triggers, views, stored functions\nand stored procedures. Added in MariaDB 10.5.2.\n\nSHOW DATABASES\n--------------\n\nList all databases using the SHOW DATABASES statement. Without the SHOW\nDATABASES privilege, you can still issue the SHOW DATABASES statement, but it\nwill only list databases containing tables on which you have privileges.\n\nSHUTDOWN\n--------\n\nShut down the server using SHUTDOWN or the mysqladmin shutdown command.\n\nSUPER\n-----\n\nExecute superuser statements: CHANGE MASTER TO, KILL (users who do not have\nthis privilege can only KILL their own threads), PURGE LOGS, SET global system\nvariables, or the mysqladmin debug command. Also, this permission allows the\nuser to write data even if the read_only startup option is set, enable or\ndisable logging, enable or disable replication on replica, specify a DEFINER\nfor statements that support that clause, connect once reaching the\nMAX_CONNECTIONS. If a statement has been specified for the init-connect mysqld\noption, that command will not be executed when a user with SUPER privileges\nconnects to the server.\n\nThe SUPER privilege has been split into multiple smaller privileges from\nMariaDB 10.5.2 to allow for more fine-grained privileges, although it remains\nan alias for these smaller privileges.\n\nFrom MariaDB 10.11.0, the READ_ONLY ADMIN privilege has been removed from\nSUPER. The benefit of this is that one can remove the READ_ONLY ADMIN\nprivilege from all users and ensure that no one can make any changes on any\nnon-temporary tables. This is useful on replicas when one wants to ensure that\nthe replica is kept identical to the primary.\n\nDatabase Privileges\n-------------------\n\nThe following table lists the privileges that can be granted at the database\nlevel. You can also grant all table and function privileges at the database\nlevel. Table and function privileges on a database apply to all tables or\nfunctions in that database, including those created later.\n\nTo set a privilege for a database, specify the database using db_name.* for\npriv_level, or just use * to specify the default database.\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| CREATE | Create a database using the CREATE |\n| | DATABASE statement, when the privilege |\n| | is granted for a database. You can |\n| | grant the CREATE privilege on |\n| | databases that do not yet exist. This |\n| | also grants the CREATE privilege on |\n| | all tables in the database. |\n+----------------------------------+-----------------------------------------+\n| CREATE ROUTINE | Create Stored Programs using the |\n| | CREATE PROCEDURE and CREATE FUNCTION |\n| | statements. |\n+----------------------------------+-----------------------------------------+\n| CREATE TEMPORARY TABLES | Create temporary tables with the |\n| | CREATE TEMPORARY TABLE statement. This |\n| | privilege enable writing and dropping |\n| | those temporary tables |\n+----------------------------------+-----------------------------------------+\n| DROP | Drop a database using the DROP |\n| | DATABASE statement, when the privilege |\n| | is granted for a database. This also |\n| | grants the DROP privilege on all |\n| | tables in the database. |\n+----------------------------------+-----------------------------------------+\n| EVENT | Create, drop and alter EVENTs. |\n+----------------------------------+-----------------------------------------+\n| GRANT OPTION | Grant database privileges. You can |\n| | only grant privileges that you have. |\n+----------------------------------+-----------------------------------------+\n| LOCK TABLES | Acquire explicit locks using the LOCK |\n| | TABLES statement; you also need to |\n| | have the SELECT privilege on a table, |\n| | in order to lock it. |\n+----------------------------------+-----------------------------------------+\n\nTable Privileges\n----------------\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| ALTER | Change the structure of an existing |\n| | table using the ALTER TABLE statement. |\n+----------------------------------+-----------------------------------------+\n| CREATE | Create a table using the CREATE TABLE |\n| | statement. You can grant the CREATE |\n| | privilege on tables that do not yet |\n| | exist. |\n+----------------------------------+-----------------------------------------+\n| CREATE VIEW | Create a view using the CREATE_VIEW |\n| | statement. |\n+----------------------------------+-----------------------------------------+\n| DELETE | Remove rows from a table using the |\n| | DELETE statement. |\n+----------------------------------+-----------------------------------------+\n| DELETE HISTORY | Remove historical rows from a table |\n| | using the DELETE HISTORY statement. |\n| | Displays as DELETE VERSIONING ROWS |\n| | when running SHOW GRANTS until MariaDB |\n| | 10.3.15 and until MariaDB 10.4.5 |\n| | (MDEV-17655), or when running SHOW |\n| | PRIVILEGES until MariaDB 10.5.2, |\n| | MariaDB 10.4.13 and MariaDB 10.3.23 |\n| | (MDEV-20382). From MariaDB 10.3.4. |\n| | From MariaDB 10.3.5, if a user has the |\n| | SUPER privilege but not this |\n| | privilege, running mysql_upgrade will |\n| | grant this privilege as well. |\n+----------------------------------+-----------------------------------------+\n| DROP | Drop a table using the DROP TABLE |\n| | statement or a view using the DROP |\n| | VIEW statement. Also required to |\n| | execute the TRUNCATE TABLE statement. |\n+----------------------------------+-----------------------------------------+\n| GRANT OPTION | Grant table privileges. You can only |\n| | grant privileges that you have. |\n+----------------------------------+-----------------------------------------+\n| INDEX | Create an index on a table using the |\n| | CREATE INDEX statement. Without the |\n| | INDEX privilege, you can still create |\n| | indexes when creating a table using |\n| | the CREATE TABLE statement if the you |\n| | have the CREATE privilege, and you can |\n| | create indexes using the ALTER TABLE |\n| | statement if you have the ALTER |\n| | privilege. |\n+----------------------------------+-----------------------------------------+\n| INSERT | Add rows to a table using the INSERT |\n| | statement. The INSERT privilege can |\n| | also be set on individual columns; see |\n| | Column Privileges below for details. |\n+----------------------------------+-----------------------------------------+\n| REFERENCES | Unused. |\n+----------------------------------+-----------------------------------------+\n| SELECT | Read data from a table using the |\n| | SELECT statement. The SELECT privilege |\n| | can also be set on individual columns; |\n| | see Column Privileges below for |\n| | details. |\n+----------------------------------+-----------------------------------------+\n| SHOW VIEW | Show the CREATE VIEW statement to |\n| | create a view using the SHOW CREATE |\n| | VIEW statement. |\n+----------------------------------+-----------------------------------------+\n| TRIGGER | Execute triggers associated to tables |\n| | you update, execute the CREATE TRIGGER |\n| | and DROP TRIGGER statements. You will |\n| | still be able to see triggers. |\n+----------------------------------+-----------------------------------------+\n| UPDATE | Update existing rows in a table using |\n| | the UPDATE statement. UPDATE |\n| | statements usually include a WHERE |\n| | clause to update only certain rows. |\n| | You must have SELECT privileges on the |\n| | table or the appropriate columns for |\n| | the WHERE clause. The UPDATE privilege |\n| | can also be set on individual columns; |\n| | see Column Privileges below for |\n| | details. |\n+----------------------------------+-----------------------------------------+\n\nColumn Privileges\n-----------------\n\nSome table privileges can be set for individual columns of a table. To use\ncolumn privileges, specify the table explicitly and provide a list of column\nnames after the privilege type. For example, the following statement would\nallow the user to read the names and positions of employees, but not other\ninformation from the same table, such as salaries.\n\nGRANT SELECT (name, position) on Employee to \'jeffrey\'@\'localhost\';\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| INSERT (column_list) | Add rows specifying values in columns |\n| | using the INSERT statement. If you |\n| | only have column-level INSERT |\n| | privileges, you must specify the |\n| | columns you are setting in the INSERT |\n| | statement. All other columns will be |\n| | set to their default values, or NULL. |\n+----------------------------------+-----------------------------------------+\n| REFERENCES (column_list) | Unused. |\n+----------------------------------+-----------------------------------------+\n| SELECT (column_list) | Read values in columns using the |\n| | SELECT statement. You cannot access or |\n| | query any columns for which you do not |\n| | have SELECT privileges, including in |\n| | WHERE, ON, GROUP BY, and ORDER BY |\n| | clauses. |\n+----------------------------------+-----------------------------------------+\n| UPDATE (column_list) | Update values in columns of existing |\n| | rows using the UPDATE statement. |\n| | UPDATE statements usually include a |\n| | WHERE clause to update only certain |\n| | rows. You must have SELECT privileges |\n| | on the table or the appropriate |\n| | columns for the WHERE clause. |\n+----------------------------------+-----------------------------------------+\n\nFunction Privileges\n-------------------\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |') WHERE help_topic_id = 108;
+update help_topic set description = CONCAT(description, '\n+----------------------------------+-----------------------------------------+\n| ALTER ROUTINE | Change the characteristics of a stored |\n| | function using the ALTER FUNCTION |\n| | statement. |\n+----------------------------------+-----------------------------------------+\n| EXECUTE | Use a stored function. You need SELECT |\n| | privileges for any tables or columns |\n| | accessed by the function. |\n+----------------------------------+-----------------------------------------+\n| GRANT OPTION | Grant function privileges. You can |\n| | only grant privileges that you have. |\n+----------------------------------+-----------------------------------------+\n\nProcedure Privileges\n--------------------\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| ALTER ROUTINE | Change the characteristics of a stored |\n| | procedure using the ALTER PROCEDURE |\n| | statement. |\n+----------------------------------+-----------------------------------------+\n| EXECUTE | Execute a stored procedure using the |\n| | CALL statement. The privilege to call |\n| | a procedure may allow you to perform |\n| | actions you wouldn\'t otherwise be able |\n| | to do, such as insert rows into a |\n| | table. |\n+----------------------------------+-----------------------------------------+\n| GRANT OPTION | Grant procedure privileges. You can |\n| | only grant privileges that you have. |\n+----------------------------------+-----------------------------------------+\n\nGRANT EXECUTE ON PROCEDURE mysql.create_db TO maintainer;\n\nProxy Privileges\n----------------\n\n+----------------------------------+-----------------------------------------+\n| Privilege | Description |\n+----------------------------------+-----------------------------------------+\n| PROXY | Permits one user to be a proxy for |\n| | another. |\n+----------------------------------+-----------------------------------------+\n\nThe PROXY privilege allows one user to proxy as another user, which means\ntheir privileges change to that of the proxy user, and the CURRENT_USER()\nfunction returns the user name of the proxy user.\n\nThe PROXY privilege only works with authentication plugins that support it.\nThe default mysql_native_password authentication plugin does not support proxy\nusers.\n\nThe pam authentication plugin is the only plugin included with MariaDB that\ncurrently supports proxy users. The PROXY privilege is commonly used with the\npam authentication plugin to enable user and group mapping with PAM.\n\nFor example, to grant the PROXY privilege to an anonymous account that\nauthenticates with the pam authentication plugin, you could execute the\nfollowing:\n\nCREATE USER \'dba\'@\'%\' IDENTIFIED BY \'strongpassword\';\nGRANT ALL PRIVILEGES ON *.* TO \'dba\'@\'%\' ;\n\nCREATE USER \'\'@\'%\' IDENTIFIED VIA pam USING \'mariadb\';\nGRANT PROXY ON \'dba\'@\'%\' TO \'\'@\'%\';\n\nA user account can only grant the PROXY privilege for a specific user account\nif the granter also has the PROXY privilege for that specific user account,\nand if that privilege is defined WITH GRANT OPTION. For example, the following\nexample fails because the granter does not have the PROXY privilege for that\nspecific user account at all:\n\nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n\nSHOW GRANTS;\n+------------------------------------------------------------------------------\n----------------------------------------+\n| Grants for alice@localhost \n |\n+------------------------------------------------------------------------------\n----------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\' IDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' |\n+------------------------------------------------------------------------------\n----------------------------------------+\n\nGRANT PROXY ON \'dba\'@\'localhost\' TO \'bob\'@\'localhost\';\nERROR 1698 (28000): Access denied for user \'alice\'@\'localhost\'\n\nAnd the following example fails because the granter does have the PROXY\nprivilege for that specific user account, but it is not defined WITH GRANT\nOPTION:\n\nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n\nSHOW GRANTS;\n+------------------------------------------------------------------------------\n----------------------------------------+\n| Grants for alice@localhost \n |\n+------------------------------------------------------------------------------\n----------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\' IDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' |\n| GRANT PROXY ON \'dba\'@\'localhost\' TO \'alice\'@\'localhost\' \n |\n+------------------------------------------------------------------------------\n----------------------------------------+\n\nGRANT PROXY ON \'dba\'@\'localhost\' TO \'bob\'@\'localhost\';\nERROR 1698 (28000): Access denied for user \'alice\'@\'localhost\'\n\nBut the following example succeeds because the granter does have the PROXY\nprivilege for that specific user account, and it is defined WITH GRANT OPTION:\n\nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n\nSHOW GRANTS;\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n| Grants for alice@localhost \n |\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\' IDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' WITH GRANT OPTION |\n| GRANT PROXY ON \'dba\'@\'localhost\' TO \'alice\'@\'localhost\' WITH GRANT OPTION \n |\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n\nGRANT PROXY ON \'dba\'@\'localhost\' TO \'bob\'@\'localhost\';\n\nA user account can grant the PROXY privilege for any other user account if the\ngranter has the PROXY privilege for the \'\'@\'%\' anonymous user account, like\nthis:\n\nGRANT PROXY ON \'\'@\'%\' TO \'dba\'@\'localhost\' WITH GRANT OPTION;\n\nFor example, the following example succeeds because the user can grant the\nPROXY privilege for any other user account:\n\nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n\nSHOW GRANTS;\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n| Grants for alice@localhost \n |\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\' IDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' WITH GRANT OPTION |\n| GRANT PROXY ON \'\'@\'%\' TO \'alice\'@\'localhost\' WITH GRANT OPTION \n |\n+------------------------------------------------------------------------------\n----------------------------------------------------------+\n\nGRANT PROXY ON \'app1_dba\'@\'localhost\' TO \'bob\'@\'localhost\';\nQuery OK, 0 rows affected (0.004 sec)\n\nGRANT PROXY ON \'app2_dba\'@\'localhost\' TO \'carol\'@\'localhost\';\nQuery OK, 0 rows affected (0.004 sec)\n\nThe default root user accounts created by mysql_install_db have this\nprivilege. For example:\n\nGRANT ALL PRIVILEGES ON *.* TO \'root\'@\'localhost\' WITH GRANT OPTION;\nGRANT PROXY ON \'\'@\'%\' TO \'root\'@\'localhost\' WITH GRANT OPTION;\n\nThis allows the default root user accounts to grant the PROXY privilege for\nany other user account, and it also allows the default root user accounts to\ngrant others the privilege to do the same.\n\nAuthentication Options\n----------------------\n\nThe authentication options for the GRANT statement are the same as those for\nthe CREATE USER statement.\n\nIDENTIFIED BY \'password\'\n------------------------\n\nThe optional IDENTIFIED BY clause can be used to provide an account with a\npassword. The password should be specified in plain text. It will be hashed by\nthe PASSWORD function prior to being stored.\n\nFor example, if our password is mariadb, then we can create the user with:\n\nGRANT USAGE ON *.* TO foo2@test IDENTIFIED BY \'mariadb\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nIf the user account already exists and if you provide the IDENTIFIED BY\nclause, then the user\'s password will be changed. You must have the privileges\nneeded for the SET PASSWORD statement to change a user\'s password with GRANT.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED BY PASSWORD \'password_hash\'\n--------------------------------------\n\nThe optional IDENTIFIED BY PASSWORD clause can be used to provide an account\nwith a password that has already been hashed. The password should be specified\nas a hash that was provided by the PASSWORD function. It will be stored as-is.\n\nFor example, if our password is mariadb, then we can find the hash with:\n\nSELECT PASSWORD(\'mariadb\');\n+-------------------------------------------+\n| PASSWORD(\'mariadb\') |\n+-------------------------------------------+\n| *54958E764CE10E50764C2EECBB71D01F08549980 |\n+-------------------------------------------+\n1 row in set (0.00 sec)\n\nAnd then we can create a user with the hash:\n\nGRANT USAGE ON *.* TO foo2@test IDENTIFIED BY \n PASSWORD \'*54958E764CE10E50764C2EECBB71D01F08549980\';\n\nIf you do not specify a password with the IDENTIFIED BY clause, the user will\nbe able to connect without a password. A blank password is not a wildcard to\nmatch any password. The user must connect without providing a password if no\npassword is set.\n\nIf the user account already exists and if you provide the IDENTIFIED BY\nclause, then the user\'s password will be changed. You must have the privileges\nneeded for the SET PASSWORD statement to change a user\'s password with GRANT.\n\nThe only authentication plugins that this clause supports are\nmysql_native_password and mysql_old_password.\n\nIDENTIFIED {VIA|WITH} authentication_plugin\n-------------------------------------------\n\nThe optional IDENTIFIED VIA authentication_plugin allows you to specify that\nthe account should be authenticated by a specific authentication plugin. The\nplugin name must be an active authentication plugin as per SHOW PLUGINS. If it\ndoesn\'t show up in that output, then you will need to install it with INSTALL\nPLUGIN or INSTALL SONAME.\n\nFor example, this could be used with the PAM authentication plugin:\n\nGRANT USAGE ON *.* TO foo2@test IDENTIFIED VIA pam;\n\nSome authentication plugins allow additional arguments to be specified after a\nUSING or AS keyword. For example, the PAM authentication plugin accepts a\nservice name:\n\nGRANT USAGE ON *.* TO foo2@test IDENTIFIED VIA pam USING \'mariadb\';\n\nThe exact meaning of the additional argument would depend on the specific\nauthentication plugin.\n\nMariaDB starting with 10.4.0\n----------------------------\nThe USING or AS keyword can also be used to provide a plain-text password to a\nplugin if it\'s provided as an argument to the PASSWORD() function. This is\nonly valid for authentication plugins that have implemented a hook for the\nPASSWORD() function. For example, the ed25519 authentication plugin supports\nthis:\n\nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 \n USING PASSWORD(\'secret\');\n\nMariaDB starting with 10.4.3\n----------------------------\nOne can specify many authentication plugins, they all work as alternatives\nways of authenticating a user:\n\nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 \n USING PASSWORD(\'secret\') OR unix_socket;\n\nBy default, when you create a user without specifying an authentication\nplugin, MariaDB uses the mysql_native_password plugin.\n\nResource Limit Options\n----------------------\n\nIt is possible to set per-account limits for certain server resources. The\nfollowing table shows the values that can be set per account:\n\n+--------------------------------------+--------------------------------------+') WHERE help_topic_id = 108;
+update help_topic set description = CONCAT(description, '\n| Limit Type | Decription |\n+--------------------------------------+--------------------------------------+\n| MAX_QUERIES_PER_HOUR | Number of statements that the |\n| | account can issue per hour |\n| | (including updates) |\n+--------------------------------------+--------------------------------------+\n| MAX_UPDATES_PER_HOUR | Number of updates (not queries) |\n| | that the account can issue per hour |\n+--------------------------------------+--------------------------------------+\n| MAX_CONNECTIONS_PER_HOUR | Number of connections that the |\n| | account can start per hour |\n+--------------------------------------+--------------------------------------+\n| MAX_USER_CONNECTIONS | Number of simultaneous connections |\n| | that can be accepted from the same |\n| | account; if it is 0, |\n| | max_connections will be used |\n| | instead; if max_connections is 0, |\n| | there is no limit for this |\n| | account\'s simultaneous connections. |\n+--------------------------------------+--------------------------------------+\n| MAX_STATEMENT_TIME | Timeout, in seconds, for statements |\n| | executed by the user. See also |\n| | Aborting Statements that Exceed a |\n| | Certain Time to Execute. |\n+--------------------------------------+--------------------------------------+\n\nIf any of these limits are set to 0, then there is no limit for that resource\nfor that user.\n\nTo set resource limits for an account, if you do not want to change that\naccount\'s privileges, you can issue a GRANT statement with the USAGE\nprivilege, which has no meaning. The statement can name some or all limit\ntypes, in any order.\n\nHere is an example showing how to set resource limits:\n\nGRANT USAGE ON *.* TO \'someone\'@\'localhost\' WITH\n MAX_USER_CONNECTIONS 0\n MAX_QUERIES_PER_HOUR 200;\n\nThe resources are tracked per account, which means \'user\'@\'server\'; not per\nuser name or per connection.\n\nThe count can be reset for all users using FLUSH USER_RESOURCES, FLUSH\nPRIVILEGES or mysqladmin reload.\n\nUsers with the CONNECTION ADMIN privilege (in MariaDB 10.5.2 and later) or the\nSUPER privilege are not restricted by max_user_connections, max_connections,\nor max_password_errors.\n\nPer account resource limits are stored in the user table, in the mysql\ndatabase. Columns used for resources limits are named max_questions,\nmax_updates, max_connections (for MAX_CONNECTIONS_PER_HOUR), and\nmax_user_connections (for MAX_USER_CONNECTIONS).\n\nTLS Options\n-----------\n\nBy default, MariaDB transmits data between the server and clients without\nencrypting it. This is generally acceptable when the server and client run on\nthe same host or in networks where security is guaranteed through other means.\nHowever, in cases where the server and client exist on separate networks or\nthey are in a high-risk network, the lack of encryption does introduce\nsecurity concerns as a malicious actor could potentially eavesdrop on the\ntraffic as it is sent over the network between them.\n\nTo mitigate this concern, MariaDB allows you to encrypt data in transit\nbetween the server and clients using the Transport Layer Security (TLS)\nprotocol. TLS was formerly known as Secure Socket Layer (SSL), but strictly\nspeaking the SSL protocol is a predecessor to TLS and, that version of the\nprotocol is now considered insecure. The documentation still uses the term SSL\noften and for compatibility reasons TLS-related server system and status\nvariables still use the prefix ssl_, but internally, MariaDB only supports its\nsecure successors.\n\nSee Secure Connections Overview for more information about how to determine\nwhether your MariaDB server has TLS support.\n\nYou can set certain TLS-related restrictions for specific user accounts. For\ninstance, you might use this with user accounts that require access to\nsensitive data while sending it across networks that you do not control. These\nrestrictions can be enabled for a user account with the CREATE USER, ALTER\nUSER, or GRANT statements. The following options are available:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| REQUIRE NONE | TLS is not required for this account, but can |\n| | still be used. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SSL | The account must use TLS, but no valid X509 |\n| | certificate is required. This option cannot |\n| | be combined with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE X509 | The account must use TLS and must have a |\n| | valid X509 certificate. This option implies |\n| | REQUIRE SSL. This option cannot be combined |\n| | with other TLS options. |\n+---------------------------+------------------------------------------------+\n| REQUIRE ISSUER \'issuer\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the Certificate |\n| | Authority must be the one specified via the |\n| | string issuer. This option implies REQUIRE |\n| | X509. This option can be combined with the |\n| | SUBJECT, and CIPHER options in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE SUBJECT \'subject\' | The account must use TLS and must have a |\n| | valid X509 certificate. Also, the |\n| | certificate\'s Subject must be the one |\n| | specified via the string subject. This option |\n| | implies REQUIRE X509. This option can be |\n| | combined with the ISSUER, and CIPHER options |\n| | in any order. |\n+---------------------------+------------------------------------------------+\n| REQUIRE CIPHER \'cipher\' | The account must use TLS, but no valid X509 |\n| | certificate is required. Also, the encryption |\n| | used for the connection must use a specific |\n| | cipher method specified in the string cipher. |\n| | This option implies REQUIRE SSL. This option |\n| | can be combined with the ISSUER, and SUBJECT |\n| | options in any order. |\n+---------------------------+------------------------------------------------+\n\nThe REQUIRE keyword must be used only once for all specified options, and the\nAND keyword can be used to separate individual options, but it is not required.\n\nFor example, you can create a user account that requires these TLS options\nwith the following:\n\nGRANT USAGE ON *.* TO \'alice\'@\'%\'\n REQUIRE SUBJECT \'/CN=alice/O=My Dom, Inc./C=US/ST=Oregon/L=Portland\'\n AND ISSUER \'/C=FI/ST=Somewhere/L=City/ O=Some Company/CN=Peter\nParker/emailAddress=p.parker@marvel.com\'\n AND CIPHER \'SHA-DES-CBC3-EDH-RSA\';\n\nIf any of these options are set for a specific user account, then any client\nwho tries to connect with that user account will have to be configured to\nconnect with TLS.\n\nSee Securing Connections for Client and Server for information on how to\nenable TLS on the client and server.\n\nRoles\n-----\n\nSyntax\n------\n\nGRANT role TO grantee [, grantee ... ]\n[ WITH ADMIN OPTION ]\n\ngrantee:\n rolename\n username [authentication_option]\n\nThe GRANT statement is also used to grant the use of a role to one or more\nusers or other roles. In order to be able to grant a role, the grantor doing\nso must have permission to do so (see WITH ADMIN in the CREATE ROLE article).\n\nSpecifying the WITH ADMIN OPTION permits the grantee to in turn grant the role\nto another.\n\nFor example, the following commands show how to grant the same role to a\ncouple different users.\n\nGRANT journalist TO hulda;\n\nGRANT journalist TO berengar WITH ADMIN OPTION;\n\nIf a user has been granted a role, they do not automatically obtain all\npermissions associated with that role. These permissions are only in use when\nthe user activates the role with the SET ROLE statement.\n\nTO PUBLIC\n---------\n\nMariaDB starting with 10.11\n---------------------------\n\nSyntax\n------\n\nGRANT <privilege> ON <database>.<object> TO PUBLIC;\nREVOKE <privilege> ON <database>.<object> FROM PUBLIC;\n\nGRANT ... TO PUBLIC grants privileges to all users with access to the server.\nThe privileges also apply to users created after the privileges are granted.\nThis can be useful when one only wants to state once that all users need to\nhave a certain set of privileges.\n\nWhen running SHOW GRANTS, a user will also see all privileges inherited from\nPUBLIC. SHOW GRANTS FOR PUBLIC will only show TO PUBLIC grants.\n\nGrant Examples\n--------------\n\nGranting Root-like Privileges\n-----------------------------\n\nYou can create a user that has privileges similar to the default root accounts\nby executing the following:\n\nCREATE USER \'alexander\'@\'localhost\';\nGRANT ALL PRIVILEGES ON *.* to \'alexander\'@\'localhost\' WITH GRANT OPTION;\n\nURL: https://mariadb.com/kb/en/grant/') WHERE help_topic_id = 108;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (109,10,'RENAME USER','Syntax\n------\n\nRENAME USER old_user TO new_user\n [, old_user TO new_user] ...\n\nDescription\n-----------\n\nThe RENAME USER statement renames existing MariaDB accounts. To use it, you\nmust have the global CREATE USER privilege or the UPDATE privilege for the\nmysql database. Each account is named using the same format as for the CREATE\nUSER statement; for example, \'jeffrey\'@\'localhost\'. If you specify only the\nuser name part of the account name, a host name part of \'%\' is used.\n\nIf any of the old user accounts do not exist or any of the new user accounts\nalready exist, ERROR 1396 (HY000) results. If an error occurs, RENAME USER\nwill still rename the accounts that do not result in an error.\n\nExamples\n--------\n\nCREATE USER \'donald\', \'mickey\';\nRENAME USER \'donald\' TO \'duck\'@\'localhost\', \'mickey\' TO \'mouse\'@\'localhost\';\n\nURL: https://mariadb.com/kb/en/rename-user/','','https://mariadb.com/kb/en/rename-user/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (110,10,'REVOKE','Privileges\n----------\n\nSyntax\n------\n\nREVOKE \n priv_type [(column_list)]\n [, priv_type [(column_list)]] ...\n ON [object_type] priv_level\n FROM user [, user] ...\n\nREVOKE ALL PRIVILEGES, GRANT OPTION\n FROM user [, user] ...\n\nDescription\n-----------\n\nThe REVOKE statement enables system administrators to revoke privileges (or\nroles - see section below) from MariaDB accounts. Each account is named using\nthe same format as for the GRANT statement; for example,\n\'jeffrey\'@\'localhost\'. If you specify only the user name part of the account\nname, a host name part of \'%\' is used. For details on the levels at which\nprivileges exist, the allowable priv_type and priv_level values, and the\nsyntax for specifying users and passwords, see GRANT.\n\nTo use the first REVOKE syntax, you must have the GRANT OPTION privilege, and\nyou must have the privileges that you are revoking.\n\nTo revoke all privileges, use the second syntax, which drops all global,\ndatabase, table, column, and routine privileges for the named user or users:\n\nREVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...\n\nTo use this REVOKE syntax, you must have the global CREATE USER privilege or\nthe UPDATE privilege for the mysql database. See GRANT.\n\nExamples\n--------\n\nREVOKE SUPER ON *.* FROM \'alexander\'@\'localhost\';\n\nRoles\n-----\n\nSyntax\n------\n\nREVOKE role [, role ...]\n FROM grantee [, grantee2 ... ]\n\nREVOKE ADMIN OPTION FOR role FROM grantee [, grantee2]\n\nDescription\n-----------\n\nREVOKE is also used to remove a role from a user or another role that it\'s\npreviously been assigned to. If a role has previously been set as a default\nrole, REVOKE does not remove the record of the default role from the\nmysql.user table. If the role is subsequently granted again, it will again be\nthe user\'s default. Use SET DEFAULT ROLE NONE to explicitly remove this.\n\nBefore MariaDB 10.1.13, the REVOKE role statement was not permitted in\nprepared statements.\n\nExample\n-------\n\nREVOKE journalist FROM hulda\n\nURL: https://mariadb.com/kb/en/revoke/','','https://mariadb.com/kb/en/revoke/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (111,10,'SET PASSWORD','Syntax\n------\n\nSET PASSWORD [FOR user] =\n {\n PASSWORD(\'some password\')\n | OLD_PASSWORD(\'some password\')\n | \'encrypted password\'\n }\n\nDescription\n-----------\n\nThe SET PASSWORD statement assigns a password to an existing MariaDB user\naccount.\n\nIf the password is specified using the PASSWORD() or OLD_PASSWORD() function,\nthe literal text of the password should be given. If the password is specified\nwithout using either function, the password should be the already-encrypted\npassword value as returned by PASSWORD().\n\nOLD_PASSWORD() should only be used if your MariaDB/MySQL clients are very old\n(< 4.0.0).\n\nWith no FOR clause, this statement sets the password for the current user. Any\nclient that has connected to the server using a non-anonymous account can\nchange the password for that account.\n\nWith a FOR clause, this statement sets the password for a specific account on\nthe current server host. Only clients that have the UPDATE privilege for the\nmysql database can do this. The user value should be given in\nuser_name@host_name format, where user_name and host_name are exactly as they\nare listed in the User and Host columns of the mysql.user table (or view in\nMariaDB-10.4 onwards) entry.\n\nThe argument to PASSWORD() and the password given to MariaDB clients can be of\narbitrary length.\n\nAuthentication Plugin Support\n-----------------------------\n\nMariaDB starting with 10.4\n--------------------------\nIn MariaDB 10.4 and later, SET PASSWORD (with or without PASSWORD()) works for\naccounts authenticated via any authentication plugin that supports passwords\nstored in the mysql.global_priv table.\n\nThe ed25519, mysql_native_password, and mysql_old_password authentication\nplugins store passwords in the mysql.global_priv table.\n\nIf you run SET PASSWORD on an account that authenticates with one of these\nauthentication plugins that stores passwords in the mysql.global_priv table,\nthen the PASSWORD() function is evaluated by the specific authentication\nplugin used by the account. The authentication plugin hashes the password with\na method that is compatible with that specific authentication plugin.\n\nThe unix_socket, named_pipe, gssapi, and pam authentication plugins do not\nstore passwords in the mysql.global_priv table. These authentication plugins\nrely on other methods to authenticate the user.\n\nIf you attempt to run SET PASSWORD on an account that authenticates with one\nof these authentication plugins that doesn\'t store a password in the\nmysql.global_priv table, then MariaDB Server will raise a warning like the\nfollowing:\n\nSET PASSWORD is ignored for users authenticating via unix_socket plugin\n\nSee Authentication from MariaDB 10.4 for an overview of authentication changes\nin MariaDB 10.4.\n\nMariaDB until 10.3\n------------------\nIn MariaDB 10.3 and before, SET PASSWORD (with or without PASSWORD()) only\nworks for accounts authenticated via mysql_native_password or\nmysql_old_password authentication plugins\n\nPasswordless User Accounts\n--------------------------\n\nUser accounts do not always require passwords to login.\n\nThe unix_socket , named_pipe and gssapi authentication plugins do not require\na password to authenticate the user.\n\nThe pam authentication plugin may or may not require a password to\nauthenticate the user, depending on the specific configuration.\n\nThe mysql_native_password and mysql_old_password authentication plugins\nrequire passwords for authentication, but the password can be blank. In that\ncase, no password is required.\n\nIf you provide a password while attempting to log into the server as an\naccount that doesn\'t require a password, then MariaDB server will simply\nignore the password.\n\nMariaDB starting with 10.4\n--------------------------\nIn MariaDB 10.4 and later, a user account can be defined to use multiple\nauthentication plugins in a specific order of preference. This specific\nscenario may be more noticeable in these versions, since an account could be\nassociated with some authentication plugins that require a password, and some\nthat do not.\n\nExample\n-------\n\nFor example, if you had an entry with User and Host column values of \'bob\' and\n\'%.loc.gov\', you would write the statement like this:\n\nSET PASSWORD FOR \'bob\'@\'%.loc.gov\' = PASSWORD(\'newpass\');\n\nIf you want to delete a password for a user, you would do:\n\nSET PASSWORD FOR \'bob\'@localhost = PASSWORD(\"\");\n\nURL: https://mariadb.com/kb/en/set-password/','','https://mariadb.com/kb/en/set-password/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (112,10,'CREATE ROLE','Syntax\n------\n\nCREATE [OR REPLACE] ROLE [IF NOT EXISTS] role \n [WITH ADMIN\n {CURRENT_USER | CURRENT_ROLE | user | role}]\n\nDescription\n-----------\n\nThe CREATE ROLE statement creates one or more MariaDB roles. To use it, you\nmust have the global CREATE USER privilege or the INSERT privilege for the\nmysql database. For each account, CREATE ROLE creates a new row in the\nmysql.user table that has no privileges, and with the corresponding is_role\nfield set to Y. It also creates a record in the mysql.roles_mapping table.\n\nIf any of the specified roles already exist, ERROR 1396 (HY000) results. If an\nerror occurs, CREATE ROLE will still create the roles that do not result in an\nerror. The maximum length for a role is 128 characters. Role names can be\nquoted, as explained in the Identifier names page. Only one error is produced\nfor all roles which have not been created:\n\nERROR 1396 (HY000): Operation CREATE ROLE failed for \'a\',\'b\',\'c\'\n\nFailed CREATE or DROP operations, for both users and roles, produce the same\nerror code.\n\nPUBLIC and NONE are reserved, and cannot be used as role names. NONE is used\nto unset a role and PUBLIC has a special use in other systems, such as Oracle,\nso is reserved for compatibility purposes.\n\nFor valid identifiers to use as role names, see Identifier Names.\n\nWITH ADMIN\n----------\n\nThe optional WITH ADMIN clause determines whether the current user, the\ncurrent role or another user or role has use of the newly created role. If the\nclause is omitted, WITH ADMIN CURRENT_USER is treated as the default, which\nmeans that the current user will be able to GRANT this role to users.\n\nOR REPLACE\n----------\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP ROLE IF EXISTS name;\nCREATE ROLE name ...;\n\nIF NOT EXISTS\n-------------\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified role already exists. Cannot be used together with\nthe OR REPLACE clause.\n\nExamples\n--------\n\nCREATE ROLE journalist;\n\nCREATE ROLE developer WITH ADMIN lorinda@localhost;\n\nGranting the role to another user. Only user lorinda@localhost has permission\nto grant the developer role:\n\nSELECT USER();\n+-------------------+\n| USER() |\n+-------------------+\n| henning@localhost |\n+-------------------+\n...\nGRANT developer TO ian@localhost;\nAccess denied for user \'henning\'@\'localhost\'\n\nSELECT USER();\n+-------------------+\n| USER() |\n+-------------------+\n| lorinda@localhost |\n+-------------------+\n\nGRANT m_role TO ian@localhost;\n\nThe OR REPLACE and IF NOT EXISTS clauses. The journalist role already exists:\n\nCREATE ROLE journalist;\nERROR 1396 (HY000): Operation CREATE ROLE failed for \'journalist\'\n\nCREATE OR REPLACE ROLE journalist;\nQuery OK, 0 rows affected (0.00 sec)\n\nCREATE ROLE IF NOT EXISTS journalist;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+---------------------------------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------------------------------+\n| Note | 1975 | Can\'t create role \'journalist\'; it already exists |\n+-------+------+---------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/create-role/','','https://mariadb.com/kb/en/create-role/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (113,10,'DROP ROLE','Syntax\n------\n\nDROP ROLE [IF EXISTS] role_name [,role_name ...]\n\nDescription\n-----------\n\nThe DROP ROLE statement removes one or more MariaDB roles. To use this\nstatement, you must have the global CREATE USER privilege or the DELETE\nprivilege for the mysql database.\n\nDROP ROLE does not disable roles for connections which selected them with SET\nROLE. If a role has previously been set as a default role, DROP ROLE does not\nremove the record of the default role from the mysql.user table. If the role\nis subsequently recreated and granted, it will again be the user\'s default.\nUse SET DEFAULT ROLE NONE to explicitly remove this.\n\nIf any of the specified user accounts do not exist, ERROR 1396 (HY000)\nresults. If an error occurs, DROP ROLE will still drop the roles that do not\nresult in an error. Only one error is produced for all roles which have not\nbeen dropped:\n\nERROR 1396 (HY000): Operation DROP ROLE failed for \'a\',\'b\',\'c\'\n\nFailed CREATE or DROP operations, for both users and roles, produce the same\nerror code.\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will return a warning instead of an\nerror if the role does not exist.\n\nExamples\n--------\n\nDROP ROLE journalist;\n\nThe same thing using the optional IF EXISTS clause:\n\nDROP ROLE journalist;\nERROR 1396 (HY000): Operation DROP ROLE failed for \'journalist\'\n\nDROP ROLE IF EXISTS journalist;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nNote (Code 1975): Can\'t drop role \'journalist\'; it doesn\'t exist\n\nURL: https://mariadb.com/kb/en/drop-role/','','https://mariadb.com/kb/en/drop-role/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (114,10,'SET ROLE','Syntax\n------\n\nSET ROLE { role | NONE }\n\nDescription\n-----------\n\nThe SET ROLE statement enables a role, along with all of its associated\npermissions, for the current session. To unset a role, use NONE .\n\nIf a role that doesn\'t exist, or to which the user has not been assigned, is\nspecified, an ERROR 1959 (OP000): Invalid role specification error occurs.\n\nAn automatic SET ROLE is implicitly performed when a user connects if that\nuser has been assigned a default role. See SET DEFAULT ROLE.\n\nExample\n-------\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n\nSET ROLE staff;\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| staff |\n+--------------+\n\nSET ROLE NONE;\n\nSELECT CURRENT_ROLE();\n+----------------+\n| CURRENT_ROLE() |\n+----------------+\n| NULL |\n+----------------+\n\nURL: https://mariadb.com/kb/en/set-role/','','https://mariadb.com/kb/en/set-role/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (115,10,'SET DEFAULT ROLE','Syntax\n------\n\nSET DEFAULT ROLE { role | NONE } [ FOR user@host ]\n\nDescription\n-----------\n\nThe SET DEFAULT ROLE statement sets a default role for a specified (or\ncurrent) user. A default role is automatically enabled when a user connects\n(an implicit SET ROLE statement is executed immediately after a connection is\nestablished).\n\nTo be able to set a role as a default, the role must already have been granted\nto that user, and one needs the privileges to enable this role (if you cannot\ndo SET ROLE X, you won\'t be able to do SET DEFAULT ROLE X). To set a default\nrole for another user one needs to have write access to the mysql database.\n\nTo remove a user\'s default role, use SET DEFAULT ROLE NONE [ FOR user@host ].\nThe record of the default role is not removed if the role is dropped or\nrevoked, so if the role is subsequently re-created or granted, it will again\nbe the user\'s default role.\n\nThe default role is stored in the default_role column in the mysql.user\ntable/view, as well as in the Information Schema APPLICABLE_ROLES table, so\nthese can be viewed to see which role has been assigned to a user as the\ndefault.\n\nExamples\n--------\n\nSetting a default role for the current user:\n\nSET DEFAULT ROLE journalist;\n\nRemoving a default role from the current user:\n\nSET DEFAULT ROLE NONE;\n\nSetting a default role for another user. The role has to have been granted to\nthe user before it can be set as default:\n\nCREATE ROLE journalist;\nCREATE USER taniel;\n\nSET DEFAULT ROLE journalist FOR taniel;\nERROR 1959 (OP000): Invalid role specification `journalist`\n\nGRANT journalist TO taniel;\nSET DEFAULT ROLE journalist FOR taniel;\n\nViewing mysql.user:\n\nselect * from mysql.user where user=\'taniel\'\\G\n*************************** 1. row ***************************\n Host: %\n User: taniel\n...\n is_role: N\n default_role: journalist\n...\n\nRemoving a default role for another user\n\nSET DEFAULT ROLE NONE FOR taniel;\n\nURL: https://mariadb.com/kb/en/set-default-role/','','https://mariadb.com/kb/en/set-default-role/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (116,10,'Roles Overview','Description\n-----------\n\nA role bundles a number of privileges together. It assists larger\norganizations where, typically, a number of users would have the same\nprivileges, and, previously, the only way to change the privileges for a group\nof users was by changing each user\'s privileges individually.\n\nAlternatively, multiple external users could have been assigned the same user,\nand there would have been no way to see which actual user was responsible for\nwhich action.\n\nWith roles, managing this is easy. For example, there could be a number of\nusers assigned to a journalist role, with identical privileges. Changing the\nprivileges for all the journalists is a matter of simply changing the role\'s\nprivileges, while the individual user is still linked with any changes that\ntake place.\n\nRoles are created with the CREATE ROLE statement, and dropped with the DROP\nROLE statement. Roles are then assigned to a user with an extension to the\nGRANT statement, while privileges are assigned to a role in the regular way\nwith GRANT. Similarly, the REVOKE statement can be used to both revoke a role\nfrom a user, or revoke a privilege from a role.\n\nOnce a user has connected, he can obtain all privileges associated with a role\nby setting a role with the SET ROLE statement. The CURRENT_ROLE function\nreturns the currently set role for the session, if any.\n\nOnly roles granted directly to a user can be set, roles granted to other roles\ncannot. Instead the privileges granted to a role, which is, in turn, granted\nto another role (grantee), will be immediately available to any user who sets\nthis second grantee role.\n\nThe SET DEFAULT ROLE statement allows one to set a default role for a user. A\ndefault role is automatically enabled when a user connects (an implicit SET\nROLE statement is executed immediately after a connection is established).\n\nRoles were implemented as a GSoC 2013 project by Vicentiu Ciorbaru.\n\nSystem Tables\n-------------\n\nInformation about roles and who they\'ve been granted to can be found in the\nInformation Schema APPLICABLE_ROLES table as well as the mysql.ROLES_MAPPING\ntable.\n\nThe Information Schema ENABLED_ROLES table shows the enabled roles for the\ncurrent session.\n\nExamples\n--------\n\nCreating a role and granting a privilege:\n\nCREATE ROLE journalist;\n\nGRANT SHOW DATABASES ON *.* TO journalist;\n\nGRANT journalist to hulda;\n\nNote, that hulda has no SHOW DATABASES privilege, even though she was granted\nthe journalist role. She needs to set the role first:\n\nSHOW DATABASES;\n+--------------------+\n| Database |\n+--------------------+\n| information_schema |\n+--------------------+\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n\nSET ROLE journalist;\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| journalist |\n+--------------+\n\nSHOW DATABASES;\n+--------------------+\n| Database |\n+--------------------+\n| ... |\n| information_schema |\n| mysql |\n| performance_schema |\n| test |\n| ... |\n+--------------------+\n\nSET ROLE NONE;\n\nRoles can be granted to roles:\n\nCREATE ROLE writer;\n\nGRANT SELECT ON data.* TO writer;\n\nGRANT writer TO journalist;\n\nBut one does not need to set a role granted to a role. For example, hulda will\nautomatically get all writer privileges when she sets the journalist role:\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n\nSHOW TABLES FROM data;\nEmpty set (0.01 sec)\n\nSET ROLE journalist;\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| journalist |\n+--------------+\n\nSHOW TABLES FROM data;\n+------------------------------+\n| Tables_in_data |\n+------------------------------+\n| set1 |\n| ... |\n+------------------------------+\n\nRoles and Views (and Stored Routines)\n-------------------------------------\n\nWhen a user sets a role, he, in a sense, has two identities with two\nassociated sets of privileges. But a view (or a stored routine) can have only\none definer. So, when a view (or a stored routine) is created with the SQL\nSECURITY DEFINER, one can specify whether the definer should be CURRENT_USER\n(and the view will have none of the privileges of the user\'s role) or\nCURRENT_ROLE (in this case, the view will use role\'s privileges, but none of\nthe user\'s privileges). As a result, sometimes one can create a view that is\nimpossible to use.\n\nCREATE ROLE r1;\n\nGRANT ALL ON db1.* TO r1;\n\nGRANT r1 TO foo@localhost;\n\nGRANT ALL ON db.* TO foo@localhost;\n\nSELECT CURRENT_USER\n+---------------+\n| current_user |\n+---------------+\n| foo@localhost |\n+---------------+\n\nSET ROLE r1;\n\nCREATE TABLE db1.t1 (i int);\n\nCREATE VIEW db.v1 AS SELECT * FROM db1.t1;\n\nSHOW CREATE VIEW db.v1;\n+------+-----------------------------------------------------------------------\n------------------------------------------------------------------+------------\n---------+----------------------+\n| View | Create View \n |\ncharacter_set_client | collation_connection |\n+------+-----------------------------------------------------------------------\n------------------------------------------------------------------+------------\n---------+----------------------+\n| v1 | CREATE ALGORITHM=UNDEFINED DEFINER=`foo`@`localhost` SQL SECURITY\nDEFINER VIEW `db`.`v1` AS SELECT `db1`.`t1`.`i` AS `i` from `db1`.`t1` | utf8 \n | utf8_general_ci |\n+------+-----------------------------------------------------------------------\n------------------------------------------------------------------+------------\n---------+----------------------+\n\nCREATE DEFINER=CURRENT_ROLE VIEW db.v2 AS SELECT * FROM db1.t1;\n\nSHOW CREATE VIEW db.b2;\n+------+-----------------------------------------------------------------------\n-----------------------------------------------------+----------------------+--\n-------------------+\n| View | Create View \n | character_set_client |\ncollation_connection |\n+------+-----------------------------------------------------------------------\n-----------------------------------------------------+----------------------+--\n-------------------+\n| v2 | CREATE ALGORITHM=UNDEFINED DEFINER=`r1` SQL SECURITY DEFINER VIEW\n`db`.`v2` AS select `db1`.`t1`.`a` AS `a` from `db1`.`t1` | utf8 \n | utf8_general_ci |\n+------+-----------------------------------------------------------------------\n-----------------------------------------------------+----------------------+--\n-------------------+\n\nOther Resources\n---------------\n\n* Roles Review by Peter Gulutzan\n\nURL: https://mariadb.com/kb/en/roles_overview/','','https://mariadb.com/kb/en/roles_overview/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (117,10,'Account Locking','MariaDB starting with 10.4.2\n----------------------------\nAccount locking was introduced in MariaDB 10.4.2.\n\nDescription\n-----------\n\nAccount locking permits privileged administrators to lock/unlock user\naccounts. No new client connections will be permitted if an account is locked\n(existing connections are not affected).\n\nUser accounts can be locked at creation, with the CREATE USER statement, or\nmodified after creation with the ALTER USER statement. For example:\n\nCREATE USER \'lorin\'@\'localhost\' ACCOUNT LOCK;\n\nor\n\nALTER USER \'marijn\'@\'localhost\' ACCOUNT LOCK;\n\nThe server will return an ER_ACCOUNT_HAS_BEEN_LOCKED error when locked users\nattempt to connect:\n\nmysql -ulorin\n ERROR 4151 (HY000): Access denied, this account is locked\n\nThe ALTER USER statement is also used to unlock a user:\n\nALTER USER \'lorin\'@\'localhost\' ACCOUNT UNLOCK;\n\nThe SHOW CREATE USER statement will show whether the account is locked:\n\nSHOW CREATE USER \'marijn\'@\'localhost\';\n+-----------------------------------------------+\n| CREATE USER for marijn@localhost |\n+-----------------------------------------------+\n| CREATE USER \'marijn\'@\'localhost\' ACCOUNT LOCK |\n+-----------------------------------------------+\n\nas well as querying the mysql.global_priv table:\n\nSELECT CONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)) FROM\nmysql.global_priv \n WHERE user=\'marijn\';\n+------------------------------------------------------------------------------\n-------+\n| CONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)) \n |\n+------------------------------------------------------------------------------\n-------+\n| marijn@localhost => {\n \"access\": 0,\n \"plugin\": \"mysql_native_password\",\n \"authentication_string\": \"\",\n \"account_locked\": true,\n \"password_last_changed\": 1558017158\n} |\n+------------------------------------------------------------------------------\n-------+\n\nURL: https://mariadb.com/kb/en/account-locking/','','https://mariadb.com/kb/en/account-locking/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (118,10,'Authentication from MariaDB 10.4','MariaDB starting with 10.4\n--------------------------\nMariaDB 10.4 introduced a number of changes to the authentication process,\nintended to make things easier and more intuitive.\n\nOverview\n--------\n\nThere are four new main features in 10.4 relating to authentication:\n\n* It is possible to use more than one authentication plugin for each user\naccount. For example, this can be useful to slowly migrate users to the more\nsecure ed25519 authentication plugin over time, while allowing the old\nmysql_native_password authentication plugin as an alternative for the\ntransitional period.\n* The root@localhost user account created by mysql_install_db is created with\nthe ability to use two authentication plugins.\nFirst, it is configured to try to use the unix_socket authentication plugin.\nThis allows the root@localhost user to login without a password via the local\nUnix socket file defined by the socket system variable, as long as the login\nis attempted from a process owned by the operating system root user account.\nSecond, if authentication fails with the unix_socket authentication plugin,\nthen it is configured to try to use the mysql_native_password authentication\nplugin. However, an invalid password is initially set, so in order to\nauthenticate this way, a password must be set with SET PASSWORD.\nHowever, just using the unix_socket authentication plugin may be fine for many\nusers, and it is very secure. You may want to try going without password\nauthentication to see how well it works for you. Remember, the best way to\nkeep your password safe is not to have one!\n\n* All user accounts, passwords, and global privileges are now stored in the\nmysql.global_priv table. The mysql.user table still exists and has exactly the\nsame set of columns as before, but it’s now a view that references the\nmysql.global_priv table. Tools that analyze the mysql.user table should\ncontinue to work as before. From MariaDB 10.4.13, the dedicated mariadb.sys\nuser is created as the definer of this view. Previously root was the definer,\nwhich resulted in privilege problems when this username was changed.\n* MariaDB 10.4 adds supports for User Password Expiry, which is not active by\ndefault.\n\nDescription\n-----------\n\nAs a result of the above changes, the open-for-everyone all-powerful root\naccount is finally gone. And installation scripts will no longer demand that\nyou \"PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !\", because\nthe root account is securely created automatically.\n\nTwo all-powerful accounts are created by default — root and the OS user that\nowns the data directory, typically mysql. They are created as:\n\nCREATE USER root@localhost IDENTIFIED VIA unix_socket OR mysql_native_password\nUSING \'invalid\'\nCREATE USER mysql@localhost IDENTIFIED VIA unix_socket OR\nmysql_native_password USING \'invalid\'\n\nUsing unix_socket means that if you are the system root user, you can login as\nroot@locahost without a password. This technique was pioneered by Otto\nKekäläinen in Debian MariaDB packages and has been successfully used in Debian\nsince as early as MariaDB 10.0.\n\nIt is based on a simple fact that asking the system root for a password adds\nno extra security — root has full access to all the data files and all process\nmemory anyway. But not asking for a password means, there is no root password\nto forget (no need for the numerous tutorials on \"how to reset MariaDB root\npassword\"). And if you want to script some tedious database work, there is no\nneed to store the root password in plain text for the script to use (no need\nfor debian-sys-maint user).\n\nStill, some users may wish to log in as MariaDB root without using sudo. Hence\nthe old authentication method — conventional MariaDB password — is still\navailable. By default it is disabled (\"invalid\" is not a valid password hash),\nbut one can set the password with a usual SET PASSWORD statement. And still\nretain the password-less access via sudo.\n\nIf you install MariaDB locally (say from a tarball), you would not want to use\nsudo to be able to login. This is why MariaDB creates a second all-powerful\nuser with the same name as a system user that owns the data directory. In\nlocal (not system-wide) installations, this will be the user who installed\nMariaDB — they automatically get convenient password-less root-like access,\nbecause they can access all the data files anyway.\n\nEven if MariaDB is installed system-wide, you may not want to run your\ndatabase maintenance scripts as system root — now you can run them as system\nmysql user. And you will know that they will never destroy your entire system,\neven if you make a typo in a shell script.\n\nHowever, seasoned MariaDB DBAs who are used to the old ways do need to make\nsome changes. See the examples below for common tasks.\n\nCookbook\n--------\n\nAfter installing MariaDB system-wide the first thing you’ve got used to doing\nis logging in into the unprotected root account and protecting it, that is,\nsetting the root password:\n\n$ sudo dnf install MariaDB-server\n$ mysql -uroot\n...\nMariaDB> set password = password(\"XH4VmT3_jt\");\n\nThis is not only unnecessary now, it will simply not work — there is no\nunprotected root account. To login as root use\n\n$ sudo dnf install MariaDB-server\n$ sudo mysql\n\nNote that it implies you are connecting via the unix socket, not tcp. If you\nhappen to have protocol=tcp in a system-wide /etc/my.cnf file, use sudo mysql\n--protocol=socket.\n\nAfter installing MariaDB locally you’ve also used to connect to the\nunprotected root account using mysql -uroot. This will not work either, simply\nuse mysql without specifying a username.\n\nIf you\'ve forgotten your root password, no problem — you can still connect\nusing sudo and change the password. And if you\'ve also removed unix_socket\nauthentication, to restore access do as follows:\n\n* restart MariaDB with --skip-grant-tables\n* login into the unprotected server\n* run FLUSH PRIVILEGES (note, before 10.4 this would’ve been the last step,\nnot anymore). This disables --skip-grant-tables and allows you to change the\nstored authentication method\n* run SET PASSWORD FOR root@localhost to change the root password.\n\nTo view inside privilege tables, the old mysql.user table still exists. You\ncan select from it as before, although you cannot update it anymore. It\ndoesn’t show alternative authentication plugins and this was one of the\nreasons for switching to the mysql.global_priv table — complex authentication\nrules did not fit into rigid structure of a relational table. You can select\nfrom the new table, for example:\n\nselect concat(user, \'@\', host, \' => \', json_detailed(priv)) from\nmysql.global_priv;\n\nReverting to the Previous Authentication Method for root@localhost\n------------------------------------------------------------------\n\nIf you don\'t want the root@localhost user account created by mysql_install_db\nto use unix_socket authentication by default, then there are a few ways to\nrevert to the previous mysql_native_password authentication method for this\nuser account.\n\nConfiguring mysql_install_db to Revert to the Previous Authentication Method\n----------------------------------------------------------------------------\n\nOne way to revert to the previous mysql_native_password authentication method\nfor the root@localhost user account is to execute mysql_install_db with a\nspecial option. If mysql_install_db is executed while\n--auth-root-authentication-method=normal is specified, then it will create the\ndefault user accounts using the default behavior of MariaDB 10.3 and before.\n\nThis means that the root@localhost user account will use mysql_native_password\nauthentication by default. There are some other differences as well. See\nmysql_install_db: User Accounts Created by Default for more information.\n\nFor example, the option can be set on the command-line while running\nmysql_install_db:\n\nmysql_install_db --user=mysql --datadir=/var/lib/mysql\n--auth-root-authentication-method=normal\n\nThe option can also be set in an option file in an option group supported by\nmysql_install_db. For example:\n\n[mysql_install_db]\nauth_root_authentication_method=normal\n\nIf the option is set in an option file and if mysql_install_db is executed,\nthen mysql_install_db will read this option from the option file, and it will\nautomatically set this option.\n\nAltering the User Account to Revert to the Previous Authentication Method\n-------------------------------------------------------------------------\n\nIf you have already installed MariaDB, and if the root@localhost user account\nis already using unix_socket authentication, then you can revert to the old\nmysql_native_password authentication method for the user account by executing\nthe following:\n\nALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING\nPASSWORD(\"verysecret\")\n\nURL: https://mariadb.com/kb/en/authentication-from-mariadb-104/','','https://mariadb.com/kb/en/authentication-from-mariadb-104/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (119,10,'User Password Expiry','MariaDB starting with 10.4.3\n----------------------------\nUser password expiry was introduced in MariaDB 10.4.3.\n\nPassword expiry permits administrators to expire user passwords, either\nmanually or automatically.\n\nSystem Variables\n----------------\n\nThere are two system variables which affect password expiry:\ndefault_password_lifetime, which determines the amount of time between\nrequiring the user to change their password. 0, the default, means automatic\npassword expiry is not active.\n\nThe second variable, disconnect_on_expired_password determines whether a\nclient is permitted to connect if their password has expired, or whether they\nare permitted to connect in sandbox mode, able to perform a limited subset of\nqueries related to resetting the password, in particular SET PASSWORD and SET.\n\nSetting a Password Expiry Limit for a User\n------------------------------------------\n\nBesides automatic password expiry, as determined by default_password_lifetime,\npassword expiry times can be set on an individual user basis, overriding the\nglobal using the CREATE USER or ALTER USER statements, for example:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\n\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\n\nLimits can be disabled by use of the NEVER keyword, for example:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE NEVER;\n\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE NEVER;\n\nA manually set limit can be restored the system default by use of DEFAULT, for\nexample:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n\nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n\nSHOW CREATE USER\n----------------\n\nThe SHOW CREATE USER statement will display information about the password\nexpiry status of the user. Unlike MySQL, it will not display if the user is\nunlocked, or if the password expiry is set to default.\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\nCREATE USER \'konstantin\'@\'localhost\' PASSWORD EXPIRE NEVER;\nCREATE USER \'amse\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n\nSHOW CREATE USER \'monty\'@\'localhost\';\n+------------------------------------------------------------------+\n| CREATE USER for monty@localhost |\n+------------------------------------------------------------------+\n| CREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY |\n+------------------------------------------------------------------+\n\nSHOW CREATE USER \'konstantin\'@\'localhost\';\n+------------------------------------------------------------+\n| CREATE USER for konstantin@localhost |\n+------------------------------------------------------------+\n| CREATE USER \'konstantin\'@\'localhost\' PASSWORD EXPIRE NEVER |\n+------------------------------------------------------------+\n\nSHOW CREATE USER \'amse\'@\'localhost\';\n+--------------------------------+\n| CREATE USER for amse@localhost |\n+--------------------------------+\n| CREATE USER \'amse\'@\'localhost\' |\n+--------------------------------+\n\nChecking When Passwords Expire\n------------------------------\n\nThe following query can be used to check when the current passwords expire for\nall users:\n\nWITH password_expiration_info AS (\n SELECT User, Host,\n IF(\n IFNULL(JSON_EXTRACT(Priv, \'$.password_lifetime\'), -1) = -1,\n @@global.default_password_lifetime,\n JSON_EXTRACT(Priv, \'$.password_lifetime\')\n ) AS password_lifetime,\n JSON_EXTRACT(Priv, \'$.password_last_changed\') AS password_last_changed\n FROM mysql.global_priv\n)\nSELECT pei.User, pei.Host,\n pei.password_lifetime,\n FROM_UNIXTIME(pei.password_last_changed) AS password_last_changed_datetime,\n FROM_UNIXTIME(\n pei.password_last_changed +\n (pei.password_lifetime * 60 * 60 * 24)\n ) AS password_expiration_datetime\n FROM password_expiration_info pei\n WHERE pei.password_lifetime != 0\n AND pei.password_last_changed IS NOT NULL\nUNION\nSELECT pei.User, pei.Host,\n pei.password_lifetime,\n FROM_UNIXTIME(pei.password_last_changed) AS password_last_changed_datetime,\n 0 AS password_expiration_datetime\n FROM password_expiration_info pei\n WHERE pei.password_lifetime = 0\n OR pei.password_last_changed IS NULL;\n\n--connect-expired-password Client Option\n----------------------------------------\n\nThe mysql client --connect-expired-password option notifies the server that\nthe client is prepared to handle expired password sandbox mode (even if the\n--batch option was specified).\n\nURL: https://mariadb.com/kb/en/user-password-expiry/','','https://mariadb.com/kb/en/user-password-expiry/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (120,11,'ST_X','Syntax\n------\n\nST_X(p)\nX(p)\n\nDescription\n-----------\n\nReturns the X-coordinate value for the point p as a double-precision number.\n\nST_X() and X() are synonyms.\n\nExamples\n--------\n\nSET @pt = \'Point(56.7 53.34)\';\n\nSELECT X(GeomFromText(@pt));\n+----------------------+\n| X(GeomFromText(@pt)) |\n+----------------------+\n| 56.7 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/st_x/','','https://mariadb.com/kb/en/st_x/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (121,11,'ST_Y','Syntax\n------\n\nST_Y(p)\nY(p)\n\nDescription\n-----------\n\nReturns the Y-coordinate value for the point p as a double-precision number.\n\nST_Y() and Y() are synonyms.\n\nExamples\n--------\n\nSET @pt = \'Point(56.7 53.34)\';\n\nSELECT Y(GeomFromText(@pt));\n+----------------------+\n| Y(GeomFromText(@pt)) |\n+----------------------+\n| 53.34 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/st_y/','','https://mariadb.com/kb/en/st_y/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (122,11,'X','A synonym for ST_X.\n\nURL: https://mariadb.com/kb/en/point-properties-x/','','https://mariadb.com/kb/en/point-properties-x/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (123,11,'Y','A synonym for ST_Y.\n\nURL: https://mariadb.com/kb/en/point-properties-y/','','https://mariadb.com/kb/en/point-properties-y/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (124,12,'UNCOMPRESS','Syntax\n------\n\nUNCOMPRESS(string_to_uncompress)\n\nDescription\n-----------\n\nUncompresses a string compressed by the COMPRESS() function. If the argument\nis not a compressed value, the result is NULL. This function requires MariaDB\nto have been compiled with a compression library such as zlib. Otherwise, the\nreturn value is always NULL. The have_compress server system variable\nindicates whether a compression library is present.\n\nExamples\n--------\n\nSELECT UNCOMPRESS(COMPRESS(\'a string\'));\n+----------------------------------+\n| UNCOMPRESS(COMPRESS(\'a string\')) |\n+----------------------------------+\n| a string |\n+----------------------------------+\n\nSELECT UNCOMPRESS(\'a string\');\n+------------------------+\n| UNCOMPRESS(\'a string\') |\n+------------------------+\n| NULL |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/uncompress/','','https://mariadb.com/kb/en/uncompress/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (125,12,'DECODE','Syntax\n------\n\nDECODE(crypt_str,pass_str)\n\nIn Oracle mode from MariaDB 10.3.2:\n\nDECODE(expr, search_expr, result_expr [, search_expr2, result_expr2 ...]\n[default_expr])\n\nIn all modes from MariaDB 10.3.2:\n\nDECODE_ORACLE(expr, search_expr, result_expr [, search_expr2, result_expr2\n...] [default_expr])\n\nDescription\n-----------\n\nIn the default mode, DECODE decrypts the encrypted string crypt_str using\npass_str as the password. crypt_str should be a string returned from ENCODE().\nThe resulting string will be the original string only if pass_str is the same.\n\nIn Oracle mode from MariaDB 10.3.2, DECODE compares expr to the search\nexpressions, in order. If it finds a match, the corresponding result\nexpression is returned. If no matches are found, the default expression is\nreturned, or NULL if no default is provided.\n\nNULLs are treated as equivalent.\n\nDECODE_ORACLE is a synonym for the Oracle-mode version of the function, and is\navailable in all modes.\n\nExamples\n--------\n\nFrom MariaDB 10.3.2:\n\nSELECT DECODE_ORACLE(2+1,3*1,\'found1\',3*2,\'found2\',\'default\');\n+--------------------------------------------------------+\n| DECODE_ORACLE(2+1,3*1,\'found1\',3*2,\'found2\',\'default\') |\n+--------------------------------------------------------+\n| found1 |\n+--------------------------------------------------------+\n\nSELECT DECODE_ORACLE(2+4,3*1,\'found1\',3*2,\'found2\',\'default\');\n+--------------------------------------------------------+\n| DECODE_ORACLE(2+4,3*1,\'found1\',3*2,\'found2\',\'default\') |\n+--------------------------------------------------------+\n| found2 |\n+--------------------------------------------------------+\n\nSELECT DECODE_ORACLE(2+2,3*1,\'found1\',3*2,\'found2\',\'default\');\n+--------------------------------------------------------+\n| DECODE_ORACLE(2+2,3*1,\'found1\',3*2,\'found2\',\'default\') |\n+--------------------------------------------------------+\n| default |\n+--------------------------------------------------------+\n\nNulls are treated as equivalent:\n\nSELECT DECODE_ORACLE(NULL,NULL,\'Nulls are equivalent\',\'Nulls are not\nequivalent\');\n+----------------------------------------------------------------------------+\n| DECODE_ORACLE(NULL,NULL,\'Nulls are equivalent\',\'Nulls are not equivalent\') |\n+----------------------------------------------------------------------------+\n| Nulls are equivalent |\n+----------------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/decode/','','https://mariadb.com/kb/en/decode/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (126,12,'DECODE_ORACLE','MariaDB starting with 10.3.2\n----------------------------\nDECODE_ORACLE is a synonym for the Oracle mode version of the DECODE function,\nand is available in all modes.\n\nURL: https://mariadb.com/kb/en/decode_oracle/','','https://mariadb.com/kb/en/decode_oracle/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (127,12,'AES_DECRYPT','Syntax\n------\n\nAES_DECRYPT(crypt_str,key_str)\n\nDescription\n-----------\n\nThis function allows decryption of data using the official AES (Advanced\nEncryption Standard) algorithm. For more information, see the description of\nAES_ENCRYPT().\n\nURL: https://mariadb.com/kb/en/aes_decrypt/','','https://mariadb.com/kb/en/aes_decrypt/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (128,12,'AES_ENCRYPT','Syntax\n------\n\nAES_ENCRYPT(str,key_str)\n\nDescription\n-----------\n\nAES_ENCRYPT() and AES_DECRYPT() allow encryption and decryption of data using\nthe official AES (Advanced Encryption Standard) algorithm, previously known as\n\"Rijndael.\" Encoding with a 128-bit key length is used, but you can extend it\nup to 256 bits by modifying the source. We chose 128 bits because it is much\nfaster and it is secure enough for most purposes.\n\nAES_ENCRYPT() encrypts a string str using the key key_str, and returns a\nbinary string.\n\nAES_DECRYPT() decrypts the encrypted string and returns the original string.\n\nThe input arguments may be any length. If either argument is NULL, the result\nof this function is also NULL.\n\nBecause AES is a block-level algorithm, padding is used to encode uneven\nlength strings and so the result string length may be calculated using this\nformula:\n\n16 x (trunc(string_length / 16) + 1)\n\nIf AES_DECRYPT() detects invalid data or incorrect padding, it returns NULL.\nHowever, it is possible for AES_DECRYPT() to return a non-NULL value (possibly\ngarbage) if the input data or the key is invalid.\n\nExamples\n--------\n\nINSERT INTO t VALUES (AES_ENCRYPT(\'text\',SHA2(\'password\',512)));\n\nURL: https://mariadb.com/kb/en/aes_encrypt/','','https://mariadb.com/kb/en/aes_encrypt/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (129,12,'COMPRESS','Syntax\n------\n\nCOMPRESS(string_to_compress)\n\nDescription\n-----------\n\nCompresses a string and returns the result as a binary string. This function\nrequires MariaDB to have been compiled with a compression library such as\nzlib. Otherwise, the return value is always NULL. The compressed string can be\nuncompressed with UNCOMPRESS().\n\nThe have_compress server system variable indicates whether a compression\nlibrary is present.\n\nExamples\n--------\n\nSELECT LENGTH(COMPRESS(REPEAT(\'a\',1000)));\n+------------------------------------+\n| LENGTH(COMPRESS(REPEAT(\'a\',1000))) |\n+------------------------------------+\n| 21 |\n+------------------------------------+\n\nSELECT LENGTH(COMPRESS(\'\'));\n+----------------------+\n| LENGTH(COMPRESS(\'\')) |\n+----------------------+\n| 0 |\n+----------------------+\n\nSELECT LENGTH(COMPRESS(\'a\'));\n+-----------------------+\n| LENGTH(COMPRESS(\'a\')) |\n+-----------------------+\n| 13 |\n+-----------------------+\n\nSELECT LENGTH(COMPRESS(REPEAT(\'a\',16)));\n+----------------------------------+\n| LENGTH(COMPRESS(REPEAT(\'a\',16))) |\n+----------------------------------+\n| 15 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/compress/','','https://mariadb.com/kb/en/compress/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (130,12,'DES_DECRYPT','DES_DECRYPT has been deprecated from MariaDB 10.10.0, and will be removed in a\nfuture release.\n\nSyntax\n------\n\nDES_DECRYPT(crypt_str[,key_str])\n\nDescription\n-----------\n\nDecrypts a string encrypted with DES_ENCRYPT(). If an error occurs, this\nfunction returns NULL.\n\nThis function works only if MariaDB has been configured with TLS support.\n\nIf no key_str argument is given, DES_DECRYPT() examines the first byte of the\nencrypted string to determine the DES key number that was used to encrypt the\noriginal string, and then reads the key from the DES key file to decrypt the\nmessage. For this to work, the user must have the SUPER privilege. The key\nfile can be specified with the --des-key-file server option.\n\nIf you pass this function a key_str argument, that string is used as the key\nfor decrypting the message.\n\nIf the crypt_str argument does not appear to be an encrypted string, MariaDB\nreturns the given crypt_str.\n\nURL: https://mariadb.com/kb/en/des_decrypt/','','https://mariadb.com/kb/en/des_decrypt/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (131,12,'DES_ENCRYPT','DES_ENCRYPT has been deprecated from MariaDB 10.10.0, and will be removed in a\nfuture release.\n\nSyntax\n------\n\nDES_ENCRYPT(str[,{key_num|key_str}])\n\nDescription\n-----------\n\nEncrypts the string with the given key using the Triple-DES algorithm.\n\nThis function works only if MariaDB has been configured with TLS support.\n\nThe encryption key to use is chosen based on the second argument to\nDES_ENCRYPT(), if one was given. With no argument, the first key from the DES\nkey file is used. With a key_num argument, the given key number (0-9) from the\nDES key file is used. With a key_str argument, the given key string is used to\nencrypt str.\n\nThe key file can be specified with the --des-key-file server option.\n\nThe return string is a binary string where the first character is CHAR(128 |\nkey_num). If an error occurs, DES_ENCRYPT() returns NULL.\n\nThe 128 is added to make it easier to recognize an encrypted key. If you use a\nstring key, key_num is 127.\n\nThe string length for the result is given by this formula:\n\nnew_len = orig_len + (8 - (orig_len % 8)) + 1\n\nEach line in the DES key file has the following format:\n\nkey_num des_key_str\n\nEach key_num value must be a number in the range from 0 to 9. Lines in the\nfile may be in any order. des_key_str is the string that is used to encrypt\nthe message. There should be at least one space between the number and the\nkey. The first key is the default key that is used if you do not specify any\nkey argument to DES_ENCRYPT().\n\nYou can tell MariaDB to read new key values from the key file with the FLUSH\nDES_KEY_FILE statement. This requires the RELOAD privilege.\n\nOne benefit of having a set of default keys is that it gives applications a\nway to check for the existence of encrypted column values, without giving the\nend user the right to decrypt those values.\n\nExamples\n--------\n\nSELECT customer_address FROM customer_table \n WHERE crypted_credit_card = DES_ENCRYPT(\'credit_card_number\');\n\nURL: https://mariadb.com/kb/en/des_encrypt/','','https://mariadb.com/kb/en/des_encrypt/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (132,12,'ENCODE','Syntax\n------\n\nENCODE(str,pass_str)\n\nDescription\n-----------\n\nENCODE is not considered cryptographically secure, and should not be used for\npassword encryption.\n\nEncrypt str using pass_str as the password. To decrypt the result, use\nDECODE().\n\nThe result is a binary string of the same length as str.\n\nThe strength of the encryption is based on how good the random generator is.\n\nIt is not recommended to rely on the encryption performed by the ENCODE\nfunction. Using a salt value (changed when a password is updated) will improve\nmatters somewhat, but for storing passwords, consider a more cryptographically\nsecure function, such as SHA2().\n\nExamples\n--------\n\nENCODE(\'not so secret text\', CONCAT(\'random_salt\',\'password\'))\n\nURL: https://mariadb.com/kb/en/encode/','','https://mariadb.com/kb/en/encode/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (133,12,'ENCRYPT','Syntax\n------\n\nENCRYPT(str[,salt])\n\nDescription\n-----------\n\nEncrypts a string using the Unix crypt() system call, returning an encrypted\nbinary string. The salt argument should be a string with at least two\ncharacters or the returned result will be NULL. If no salt argument is given,\na random value of sufficient length is used.\n\nIt is not recommended to use ENCRYPT() with utf16, utf32 or ucs2 multi-byte\ncharacter sets because the crypt() system call expects a string terminated\nwith a zero byte.\n\nNote that the underlying crypt() system call may have some limitations, such\nas ignoring all but the first eight characters.\n\nIf the have_crypt system variable is set to NO (because the crypt() system\ncall is not available), the ENCRYPT function will always return NULL.\n\nExamples\n--------\n\nSELECT ENCRYPT(\'encrypt me\');\n+-----------------------+\n| ENCRYPT(\'encrypt me\') |\n+-----------------------+\n| 4I5BsEx0lqTDk |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/encrypt/','','https://mariadb.com/kb/en/encrypt/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (134,12,'MD5','Syntax\n------\n\nMD5(str)\n\nDescription\n-----------\n\nCalculates an MD5 128-bit checksum for the string.\n\nThe return value is a 32-hex digit string, and as of MariaDB 5.5, is a\nnonbinary string in the connection character set and collation, determined by\nthe values of the character_set_connection and collation_connection system\nvariables. Before 5.5, the return value was a binary string.\n\nNULL is returned if the argument was NULL.\n\nExamples\n--------\n\nSELECT MD5(\'testing\');\n+----------------------------------+\n| MD5(\'testing\') |\n+----------------------------------+\n| ae2b1fca515949e5d54fb22b8ed95575 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/md5/','','https://mariadb.com/kb/en/md5/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (135,12,'OLD_PASSWORD','Syntax\n------\n\nOLD_PASSWORD(str)\n\nDescription\n-----------\n\nOLD_PASSWORD() was added to MySQL when the implementation of PASSWORD() was\nchanged to improve security. OLD_PASSWORD() returns the value of the old\n(pre-MySQL 4.1) implementation of PASSWORD() as a string, and is intended to\npermit you to reset passwords for any pre-4.1 clients that need to connect to\na more recent MySQL server version, or any version of MariaDB, without locking\nthem out.\n\nAs of MariaDB 5.5, the return value is a nonbinary string in the connection\ncharacter set and collation, determined by the values of the\ncharacter_set_connection and collation_connection system variables. Before\n5.5, the return value was a binary string.\n\nThe return value is 16 bytes in length, or NULL if the argument was NULL.\n\nURL: https://mariadb.com/kb/en/old_password/','','https://mariadb.com/kb/en/old_password/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (136,12,'PASSWORD','Syntax\n------\n\nPASSWORD(str)\n\nDescription\n-----------\n\nThe PASSWORD() function is used for hashing passwords for use in\nauthentication by the MariaDB server. It is not intended for use in other\napplications.\n\nCalculates and returns a hashed password string from the plaintext password\nstr. Returns an empty string (>= MariaDB 10.0.4) if the argument was NULL.\n\nThe return value is a nonbinary string in the connection character set and\ncollation, determined by the values of the character_set_connection and\ncollation_connection system variables.\n\nThis is the function that is used for hashing MariaDB passwords for storage in\nthe Password column of the user table (see privileges), usually used with the\nSET PASSWORD statement. It is not intended for use in other applications.\n\nUntil MariaDB 10.3, the return value is 41-bytes in length, and the first\ncharacter is always \'*\'. From MariaDB 10.4, the function takes into account\nthe authentication plugin where applicable (A CREATE USER or SET PASSWORD\nstatement). For example, when used in conjunction with a user authenticated by\nthe ed25519 plugin, the statement will create a longer hash:\n\nCREATE USER edtest@localhost IDENTIFIED VIA ed25519 USING PASSWORD(\'secret\');\n\nCREATE USER edtest2@localhost IDENTIFIED BY \'secret\';\n\nSELECT CONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)) FROM\nmysql.global_priv\n WHERE user LIKE \'edtest%\'\\G\n*************************** 1. row ***************************\nCONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)): edtest@localhost => {\n...\n \"plugin\": \"ed25519\",\n \"authentication_string\": \"ZIgUREUg5PVgQ6LskhXmO+eZLS0nC8be6HPjYWR4YJY\",\n...\n}\n*************************** 2. row ***************************\nCONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)): edtest2@localhost => {\n...\n \"plugin\": \"mysql_native_password\",\n \"authentication_string\": \"*14E65567ABDB5135D0CFD9A70B3032C179A49EE7\",\n...\n}\n\nThe behavior of this function is affected by the value of the old_passwords\nsystem variable. If this is set to 1 (0 is default), MariaDB reverts to using\nthe mysql_old_password authentication plugin by default for newly created\nusers and passwords.\n\nExamples\n--------\n\nSELECT PASSWORD(\'notagoodpwd\');\n+-------------------------------------------+\n| PASSWORD(\'notagoodpwd\') |\n+-------------------------------------------+\n| *3A70EE9FC6594F88CE9E959CD51C5A1C002DC937 |\n+-------------------------------------------+\n\nSET PASSWORD FOR \'bob\'@\'%.loc.gov\' = PASSWORD(\'newpass\');\n\nURL: https://mariadb.com/kb/en/password/','','https://mariadb.com/kb/en/password/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (137,12,'SHA1','Syntax\n------\n\nSHA1(str), SHA(str)\n\nDescription\n-----------\n\nCalculates an SHA-1 160-bit checksum for the string str, as described in RFC\n3174 (Secure Hash Algorithm).\n\nThe value is returned as a string of 40 hex digits, or NULL if the argument\nwas NULL. As of MariaDB 5.5, the return value is a nonbinary string in the\nconnection character set and collation, determined by the values of the\ncharacter_set_connection and collation_connection system variables. Before\n5.5, the return value was a binary string.\n\nExamples\n--------\n\nSELECT SHA1(\'some boring text\');\n+------------------------------------------+\n| SHA1(\'some boring text\') |\n+------------------------------------------+\n| af969fc2085b1bb6d31e517d5c456def5cdd7093 |\n+------------------------------------------+\n\nURL: https://mariadb.com/kb/en/sha1/','','https://mariadb.com/kb/en/sha1/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (138,12,'SHA2','Syntax\n------\n\nSHA2(str,hash_len)\n\nDescription\n-----------\n\nGiven a string str, calculates an SHA-2 checksum, which is considered more\ncryptographically secure than its SHA-1 equivalent. The SHA-2 family includes\nSHA-224, SHA-256, SHA-384, and SHA-512, and the hash_len must correspond to\none of these, i.e. 224, 256, 384 or 512. 0 is equivalent to 256.\n\nThe return value is a nonbinary string in the connection character set and\ncollation, determined by the values of the character_set_connection and\ncollation_connection system variables.\n\nNULL is returned if the hash length is not valid, or the string str is NULL.\n\nSHA2 will only work if MariaDB was has been configured with TLS support.\n\nExamples\n--------\n\nSELECT SHA2(\'Maria\',224);\n+----------------------------------------------------------+\n| SHA2(\'Maria\',224) |\n+----------------------------------------------------------+\n| 6cc67add32286412efcab9d0e1675a43a5c2ef3cec8879f81516ff83 |\n+----------------------------------------------------------+\n\nSELECT SHA2(\'Maria\',256);\n+------------------------------------------------------------------+\n| SHA2(\'Maria\',256) |\n+------------------------------------------------------------------+\n| 9ff18ebe7449349f358e3af0b57cf7a032c1c6b2272cb2656ff85eb112232f16 |\n+------------------------------------------------------------------+\n\nSELECT SHA2(\'Maria\',0);\n+------------------------------------------------------------------+\n| SHA2(\'Maria\',0) |\n+------------------------------------------------------------------+\n| 9ff18ebe7449349f358e3af0b57cf7a032c1c6b2272cb2656ff85eb112232f16 |\n+------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/sha2/','','https://mariadb.com/kb/en/sha2/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (139,13,'ENDPOINT','A synonym for ST_ENDPOINT.\n\nURL: https://mariadb.com/kb/en/linestring-properties-endpoint/','','https://mariadb.com/kb/en/linestring-properties-endpoint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (140,13,'GLENGTH','Syntax\n------\n\nGLength(ls)\n\nDescription\n-----------\n\nReturns as a double-precision number the length of the LineString value ls in\nits associated spatial reference.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT GLength(GeomFromText(@ls));\n+----------------------------+\n| GLength(GeomFromText(@ls)) |\n+----------------------------+\n| 2.82842712474619 |\n+----------------------------+\n\nURL: https://mariadb.com/kb/en/glength/','','https://mariadb.com/kb/en/glength/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (141,13,'NumPoints','A synonym for ST_NumPoints.\n\nURL: https://mariadb.com/kb/en/linestring-properties-numpoints/','','https://mariadb.com/kb/en/linestring-properties-numpoints/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (142,13,'PointN','A synonym for ST_PointN.\n\nURL: https://mariadb.com/kb/en/linestring-properties-pointn/','','https://mariadb.com/kb/en/linestring-properties-pointn/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (143,13,'STARTPOINT','A synonym for ST_STARTPOINT.\n\nURL: https://mariadb.com/kb/en/linestring-properties-startpoint/','','https://mariadb.com/kb/en/linestring-properties-startpoint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (144,13,'ST_ENDPOINT','Syntax\n------\n\nST_EndPoint(ls)\nEndPoint(ls)\n\nDescription\n-----------\n\nReturns the Point that is the endpoint of the LineString value ls.\n\nST_EndPoint() and EndPoint() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT AsText(EndPoint(GeomFromText(@ls)));\n+-------------------------------------+\n| AsText(EndPoint(GeomFromText(@ls))) |\n+-------------------------------------+\n| POINT(3 3) |\n+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_endpoint/','','https://mariadb.com/kb/en/st_endpoint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (145,13,'ST_NUMPOINTS','Syntax\n------\n\nST_NumPoints(ls)\nNumPoints(ls)\n\nDescription\n-----------\n\nReturns the number of Point objects in the LineString value ls.\n\nST_NumPoints() and NumPoints() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT NumPoints(GeomFromText(@ls));\n+------------------------------+\n| NumPoints(GeomFromText(@ls)) |\n+------------------------------+\n| 3 |\n+------------------------------+\n\nURL: https://mariadb.com/kb/en/st_numpoints/','','https://mariadb.com/kb/en/st_numpoints/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (146,13,'ST_POINTN','Syntax\n------\n\nST_PointN(ls,N)\nPointN(ls,N)\n\nDescription\n-----------\n\nReturns the N-th Point in the LineString value ls. Points are numbered\nbeginning with 1.\n\nST_PointN() and PointN() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT AsText(PointN(GeomFromText(@ls),2));\n+-------------------------------------+\n| AsText(PointN(GeomFromText(@ls),2)) |\n+-------------------------------------+\n| POINT(2 2) |\n+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_pointn/','','https://mariadb.com/kb/en/st_pointn/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (147,13,'ST_STARTPOINT','Syntax\n------\n\nST_StartPoint(ls)\nStartPoint(ls)\n\nDescription\n-----------\n\nReturns the Point that is the start point of the LineString value ls.\n\nST_StartPoint() and StartPoint() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT AsText(StartPoint(GeomFromText(@ls)));\n+---------------------------------------+\n| AsText(StartPoint(GeomFromText(@ls))) |\n+---------------------------------------+\n| POINT(1 1) |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_startpoint/','','https://mariadb.com/kb/en/st_startpoint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (148,14,'GET_LOCK','Syntax\n------\n\nGET_LOCK(str,timeout)\n\nDescription\n-----------\n\nTries to obtain a lock with a name given by the string str, using a timeout of\ntimeout seconds. Returns 1 if the lock was obtained successfully, 0 if the\nattempt timed out (for example, because another client has previously locked\nthe name), or NULL if an error occurred (such as running out of memory or the\nthread was killed with mysqladmin kill).\n\nA lock is released with RELEASE_LOCK(), when the connection terminates (either\nnormally or abnormally). A connection can hold multiple locks at the same\ntime, so a lock that is no longer needed needs to be explicitly released.\n\nThe IS_FREE_LOCK function returns whether a specified lock a free or not, and\nthe IS_USED_LOCK whether the function is in use or not.\n\nLocks obtained with GET_LOCK() do not interact with transactions. That is,\ncommitting a transaction does not release any such locks obtained during the\ntransaction.\n\nIt is also possible to recursively set the same lock. If a lock with the same\nname is set n times, it needs to be released n times as well.\n\nstr is case insensitive for GET_LOCK() and related functions. If str is an\nempty string or NULL, GET_LOCK() returns NULL and does nothing. From MariaDB\n10.2.2, timeout supports microseconds. Before then, it was rounded to the\nclosest integer.\n\nIf the metadata_lock_info plugin is installed, locks acquired with this\nfunction are visible in the Information Schema METADATA_LOCK_INFO table.\n\nThis function can be used to implement application locks or to simulate record\nlocks. Names are locked on a server-wide basis. If a name has been locked by\none client, GET_LOCK() blocks any request by another client for a lock with\nthe same name. This allows clients that agree on a given lock name to use the\nname to perform cooperative advisory locking. But be aware that it also allows\na client that is not among the set of cooperating clients to lock a name,\neither inadvertently or deliberately, and thus prevent any of the cooperating\nclients from locking that name. One way to reduce the likelihood of this is to\nuse lock names that are database-specific or application-specific. For\nexample, use lock names of the form db_name.str or app_name.str.\n\nStatements using the GET_LOCK function are not safe for statement-based\nreplication.\n\nThe patch to permit multiple locks was contributed by Konstantin \"Kostja\"\nOsipov (MDEV-3917).\n\nExamples\n--------\n\nSELECT GET_LOCK(\'lock1\',10);\n+----------------------+\n| GET_LOCK(\'lock1\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT IS_FREE_LOCK(\'lock1\'), IS_USED_LOCK(\'lock1\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock1\') | IS_USED_LOCK(\'lock1\') |\n+-----------------------+-----------------------+\n| 0 | 46 |\n+-----------------------+-----------------------+\n\nSELECT IS_FREE_LOCK(\'lock2\'), IS_USED_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock2\') | IS_USED_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 1 | NULL |\n+-----------------------+-----------------------+\n\nMultiple locks can be held:\n\nSELECT GET_LOCK(\'lock2\',10);\n+----------------------+\n| GET_LOCK(\'lock2\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT IS_FREE_LOCK(\'lock1\'), IS_FREE_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock1\') | IS_FREE_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 0 | 0 |\n+-----------------------+-----------------------+\n\nSELECT RELEASE_LOCK(\'lock1\'), RELEASE_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| RELEASE_LOCK(\'lock1\') | RELEASE_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 1 | 1 |\n+-----------------------+-----------------------+\n\nIt is possible to hold the same lock recursively. This example is viewed using\nthe metadata_lock_info plugin:\n\nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA |\nTABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 |\n |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n\nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA |\nTABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 |\n |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n\nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\nEmpty set (0.000 sec)\n\nTimeout example: Connection 1:\n\nSELECT GET_LOCK(\'lock4\',10);\n+----------------------+\n| GET_LOCK(\'lock4\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 2:\n\nSELECT GET_LOCK(\'lock4\',10);\n\nAfter 10 seconds...\n\n+----------------------+\n| GET_LOCK(\'lock4\',10) |\n+----------------------+\n| 0 |\n+----------------------+\n\nDeadlocks are automatically detected and resolved. Connection 1:\n\nSELECT GET_LOCK(\'lock5\',10); \n+----------------------+\n| GET_LOCK(\'lock5\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 2:\n\nSELECT GET_LOCK(\'lock6\',10);\n+----------------------+\n| GET_LOCK(\'lock6\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 1:\n\nSELECT GET_LOCK(\'lock6\',10); \n+----------------------+\n| GET_LOCK(\'lock6\',10) |\n+----------------------+\n| 0 |\n+----------------------+\n\nConnection 2:\n\nSELECT GET_LOCK(\'lock5\',10);\nERROR 1213 (40001): Deadlock found when trying to get lock; try restarting\ntransaction\n\nURL: https://mariadb.com/kb/en/get_lock/','','https://mariadb.com/kb/en/get_lock/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (149,14,'INET6_ATON','Syntax\n------\n\nINET6_ATON(expr)\n\nDescription\n-----------\n\nGiven an IPv6 or IPv4 network address as a string, returns a binary string\nthat represents the numeric value of the address.\n\nNo trailing zone ID\'s or traling network masks are permitted. For IPv4\naddresses, or IPv6 addresses with IPv4 address parts, no classful addresses or\ntrailing port numbers are permitted and octal numbers are not supported.\n\nThe returned binary string will be VARBINARY(16) or VARBINARY(4) for IPv6 and\nIPv4 addresses respectively.\n\nReturns NULL if the argument is not understood.\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, INET6_ATON can take INET6 as an argument.\n\nExamples\n--------\n\nSELECT HEX(INET6_ATON(\'10.0.1.1\'));\n+-----------------------------+\n| HEX(INET6_ATON(\'10.0.1.1\')) |\n+-----------------------------+\n| 0A000101 |\n+-----------------------------+\n\nSELECT HEX(INET6_ATON(\'48f3::d432:1431:ba23:846f\'));\n+----------------------------------------------+\n| HEX(INET6_ATON(\'48f3::d432:1431:ba23:846f\')) |\n+----------------------------------------------+\n| 48F3000000000000D4321431BA23846F |\n+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/inet6_aton/','','https://mariadb.com/kb/en/inet6_aton/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (150,14,'INET6_NTOA','Syntax\n------\n\nINET6_NTOA(expr)\n\nDescription\n-----------\n\nGiven an IPv6 or IPv4 network address as a numeric binary string, returns the\naddress as a nonbinary string in the connection character set.\n\nThe return string is lowercase, and is platform independent, since it does not\nuse functions specific to the operating system. It has a maximum length of 39\ncharacters.\n\nReturns NULL if the argument is not understood.\n\nExamples\n--------\n\nSELECT INET6_NTOA(UNHEX(\'0A000101\'));\n+-------------------------------+\n| INET6_NTOA(UNHEX(\'0A000101\')) |\n+-------------------------------+\n| 10.0.1.1 |\n+-------------------------------+\n\nSELECT INET6_NTOA(UNHEX(\'48F3000000000000D4321431BA23846F\'));\n+-------------------------------------------------------+\n| INET6_NTOA(UNHEX(\'48F3000000000000D4321431BA23846F\')) |\n+-------------------------------------------------------+\n| 48f3::d432:1431:ba23:846f |\n+-------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/inet6_ntoa/','','https://mariadb.com/kb/en/inet6_ntoa/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (151,14,'INET_ATON','Syntax\n------\n\nINET_ATON(expr)\n\nDescription\n-----------\n\nGiven the dotted-quad representation of an IPv4 network address as a string,\nreturns an integer that represents the numeric value of the address. Addresses\nmay be 4- or 8-byte addresses.\n\nReturns NULL if the argument is not understood.\n\nExamples\n--------\n\nSELECT INET_ATON(\'192.168.1.1\');\n+--------------------------+\n| INET_ATON(\'192.168.1.1\') |\n+--------------------------+\n| 3232235777 |\n+--------------------------+\n\nThis is calculated as follows: 192 x 2563 + 168 x 256 2 + 1 x 256 + 1\n\nURL: https://mariadb.com/kb/en/inet_aton/','','https://mariadb.com/kb/en/inet_aton/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (152,14,'INET_NTOA','Syntax\n------\n\nINET_NTOA(expr)\n\nDescription\n-----------\n\nGiven a numeric IPv4 network address in network byte order (4 or 8 byte),\nreturns the dotted-quad representation of the address as a string.\n\nExamples\n--------\n\nSELECT INET_NTOA(3232235777);\n+-----------------------+\n| INET_NTOA(3232235777) |\n+-----------------------+\n| 192.168.1.1 |\n+-----------------------+\n\n192.168.1.1 corresponds to 3232235777 since 192 x 2563 + 168 x 256 2 + 1 x 256\n+ 1 = 3232235777\n\nURL: https://mariadb.com/kb/en/inet_ntoa/','','https://mariadb.com/kb/en/inet_ntoa/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (153,14,'IS_FREE_LOCK','Syntax\n------\n\nIS_FREE_LOCK(str)\n\nDescription\n-----------\n\nChecks whether the lock named str is free to use (that is, not locked).\nReturns 1 if the lock is free (no one is using the lock), 0 if the lock is in\nuse, and NULL if an error occurs (such as an incorrect argument, like an empty\nstring or NULL). str is case insensitive.\n\nIf the metadata_lock_info plugin is installed, the Information Schema\nmetadata_lock_info table contains information about locks of this kind (as\nwell as metadata locks).\n\nStatements using the IS_FREE_LOCK function are not safe for statement-based\nreplication.\n\nURL: https://mariadb.com/kb/en/is_free_lock/','','https://mariadb.com/kb/en/is_free_lock/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (154,14,'IS_IPV4','Syntax\n------\n\nIS_IPV4(expr)\n\nDescription\n-----------\n\nIf the expression is a valid IPv4 address, returns 1, otherwise returns 0.\n\nIS_IPV4() is stricter than INET_ATON(), but as strict as INET6_ATON(), in\ndetermining the validity of an IPv4 address. This implies that if IS_IPV4\nreturns 1, the same expression will always return a non-NULL result when\npassed to INET_ATON(), but that the reverse may not apply.\n\nExamples\n--------\n\nSELECT IS_IPV4(\'1110.0.1.1\');\n+-----------------------+\n| IS_IPV4(\'1110.0.1.1\') |\n+-----------------------+\n| 0 |\n+-----------------------+\n\nSELECT IS_IPV4(\'48f3::d432:1431:ba23:846f\');\n+--------------------------------------+\n| IS_IPV4(\'48f3::d432:1431:ba23:846f\') |\n+--------------------------------------+\n| 0 |\n+--------------------------------------+\n\nURL: https://mariadb.com/kb/en/is_ipv4/','','https://mariadb.com/kb/en/is_ipv4/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (155,14,'IS_IPV4_COMPAT','Syntax\n------\n\nIS_IPV4_COMPAT(expr)\n\nDescription\n-----------\n\nReturns 1 if a given numeric binary string IPv6 address, such as returned by\nINET6_ATON(), is IPv4-compatible, otherwise returns 0.\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, when the argument is not INET6, automatic implicit CAST\nto INET6 is applied. As a consequence, IS_IPV4_COMPAT now understands\narguments in both text representation and binary(16) representation. Before\nMariaDB 10.5.0, the function understood only binary(16) representation.\n\nExamples\n--------\n\nSELECT IS_IPV4_COMPAT(INET6_ATON(\'::10.0.1.1\'));\n+------------------------------------------+\n| IS_IPV4_COMPAT(INET6_ATON(\'::10.0.1.1\')) |\n+------------------------------------------+\n| 1 |\n+------------------------------------------+\n\nSELECT IS_IPV4_COMPAT(INET6_ATON(\'::48f3::d432:1431:ba23:846f\'));\n+-----------------------------------------------------------+\n| IS_IPV4_COMPAT(INET6_ATON(\'::48f3::d432:1431:ba23:846f\')) |\n+-----------------------------------------------------------+\n| 0 |\n+-----------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/is_ipv4_compat/','','https://mariadb.com/kb/en/is_ipv4_compat/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (156,14,'IS_IPV4_MAPPED','Syntax\n------\n\nIS_IPV4_MAPPED(expr)\n\nDescription\n-----------\n\nReturns 1 if a given a numeric binary string IPv6 address, such as returned by\nINET6_ATON(), is a valid IPv4-mapped address, otherwise returns 0.\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, when the argument is not INET6, automatic implicit CAST\nto INET6 is applied. As a consequence, IS_IPV4_MAPPED now understands\narguments in both text representation and binary(16) representation. Before\nMariaDB 10.5.0, the function understood only binary(16) representation.\n\nExamples\n--------\n\nSELECT IS_IPV4_MAPPED(INET6_ATON(\'::10.0.1.1\'));\n+------------------------------------------+\n| IS_IPV4_MAPPED(INET6_ATON(\'::10.0.1.1\')) |\n+------------------------------------------+\n| 0 |\n+------------------------------------------+\n\nSELECT IS_IPV4_MAPPED(INET6_ATON(\'::ffff:10.0.1.1\'));\n+-----------------------------------------------+\n| IS_IPV4_MAPPED(INET6_ATON(\'::ffff:10.0.1.1\')) |\n+-----------------------------------------------+\n| 1 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/is_ipv4_mapped/','','https://mariadb.com/kb/en/is_ipv4_mapped/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (157,14,'IS_IPV6','Syntax\n------\n\nIS_IPV6(expr)\n\nDescription\n-----------\n\nReturns 1 if the expression is a valid IPv6 address specified as a string,\notherwise returns 0. Does not consider IPv4 addresses to be valid IPv6\naddresses.\n\nExamples\n--------\n\nSELECT IS_IPV6(\'48f3::d432:1431:ba23:846f\');\n+--------------------------------------+\n| IS_IPV6(\'48f3::d432:1431:ba23:846f\') |\n+--------------------------------------+\n| 1 |\n+--------------------------------------+\n1 row in set (0.02 sec)\n\nSELECT IS_IPV6(\'10.0.1.1\');\n+---------------------+\n| IS_IPV6(\'10.0.1.1\') |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/is_ipv6/','','https://mariadb.com/kb/en/is_ipv6/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (158,14,'IS_USED_LOCK','Syntax\n------\n\nIS_USED_LOCK(str)\n\nDescription\n-----------\n\nChecks whether the lock named str is in use (that is, locked). If so, it\nreturns the connection identifier of the client that holds the lock.\nOtherwise, it returns NULL. str is case insensitive.\n\nIf the metadata_lock_info plugin is installed, the Information Schema\nmetadata_lock_info table contains information about locks of this kind (as\nwell as metadata locks).\n\nStatements using the IS_USED_LOCK function are not safe for statement-based\nreplication.\n\nURL: https://mariadb.com/kb/en/is_used_lock/','','https://mariadb.com/kb/en/is_used_lock/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (159,14,'MASTER_GTID_WAIT','Syntax\n------\n\nMASTER_GTID_WAIT(gtid-list[, timeout)\n\nDescription\n-----------\n\nThis function takes a string containing a comma-separated list of global\ntransaction id\'s (similar to the value of, for example, gtid_binlog_pos). It\nwaits until the value of gtid_slave_pos has the same or higher seq_no within\nall replication domains specified in the gtid-list; in other words, it waits\nuntil the slave has reached the specified GTID position.\n\nAn optional second argument gives a timeout in seconds. If the timeout expires\nbefore the specified GTID position is reached, then the function returns -1.\nPassing NULL or a negative number for the timeout means no timeout, and the\nfunction will wait indefinitely.\n\nIf the wait completes without a timeout, 0 is returned. Passing NULL for the\ngtid-list makes the function return NULL immediately, without waiting.\n\nThe gtid-list may be the empty string, in which case MASTER_GTID_WAIT()\nreturns immediately. If the gtid-list contains fewer domains than\ngtid_slave_pos, then only those domains are waited upon. If gtid-list contains\na domain that is not present in @@gtid_slave_pos, then MASTER_GTID_WAIT() will\nwait until an event containing such domain_id arrives on the slave (or until\ntimed out or killed).\n\nMASTER_GTID_WAIT() can be useful to ensure that a slave has caught up to a\nmaster. Simply take the value of gtid_binlog_pos on the master, and use it in\na MASTER_GTID_WAIT() call on the slave; when the call completes, the slave\nwill have caught up with that master position.\n\nMASTER_GTID_WAIT() can also be used in client applications together with the\nlast_gtid session variable. This is useful in a read-scaleout replication\nsetup, where the application writes to a single master but divides the reads\nout to a number of slaves to distribute the load. In such a setup, there is a\nrisk that an application could first do an update on the master, and then a\nbit later do a read on a slave, and if the slave is not fast enough, the data\nread from the slave might not include the update just made, possibly confusing\nthe application and/or the end-user. One way to avoid this is to request the\nvalue of last_gtid on the master just after the update. Then before doing the\nread on the slave, do a MASTER_GTID_WAIT() on the value obtained from the\nmaster; this will ensure that the read is not performed until the slave has\nreplicated sufficiently far for the update to have become visible.\n\nNote that MASTER_GTID_WAIT() can be used even if the slave is configured not\nto use GTID for connections (CHANGE MASTER TO master_use_gtid=no). This is\nbecause from MariaDB 10, GTIDs are always logged on the master server, and\nalways recorded on the slave servers.\n\nDifferences to MASTER_POS_WAIT()\n--------------------------------\n\n* MASTER_GTID_WAIT() is global; it waits for any master connection to reach\n the specified GTID position. MASTER_POS_WAIT() works only against a\n specific connection. This also means that while MASTER_POS_WAIT() aborts if\n its master connection is terminated with STOP SLAVE or due to an error,\n MASTER_GTID_WAIT() continues to wait while slaves are stopped.\n\n* MASTER_GTID_WAIT() can take its timeout as a floating-point value, so a\n timeout in fractional seconds is supported, eg. MASTER_GTID_WAIT(\"0-1-100\",\n 0.5). (The minimum wait is one microsecond, 0.000001 seconds).\n\n* MASTER_GTID_WAIT() allows one to specify a timeout of zero in order to do a\n non-blocking check to see if the slaves have progressed to a specific GTID\nposition\n (MASTER_POS_WAIT() takes a zero timeout as meaning an infinite wait). To do\n an infinite MASTER_GTID_WAIT(), specify a negative timeout, or omit the\n timeout argument.\n\n* MASTER_GTID_WAIT() does not return the number of events executed since the\n wait started, nor does it return NULL if a slave thread is stopped. It\n always returns either 0 for successful wait completed, or -1 for timeout\n reached (or NULL if the specified gtid-pos is NULL).\n\nSince MASTER_GTID_WAIT() looks only at the seq_no part of the GTIDs, not the\nserver_id, care is needed if a slave becomes diverged from another server so\nthat two different GTIDs with the same seq_no (in the same domain) arrive at\nthe same server. This situation is in any case best avoided; setting\ngtid_strict_mode is recommended, as this will prevent any such out-of-order\nsequence numbers from ever being replicated on a slave.\n\nURL: https://mariadb.com/kb/en/master_gtid_wait/','','https://mariadb.com/kb/en/master_gtid_wait/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (160,14,'MASTER_POS_WAIT','Syntax\n------\n\nMASTER_POS_WAIT(log_name,log_pos[,timeout,[\"connection_name\"]])\n\nDescription\n-----------\n\nThis function is useful in replication for controlling primary/replica\nsynchronization. It blocks until the replica has read and applied all updates\nup to the specified position (log_name,log_pos) in the primary log. The return\nvalue is the number of log events the replica had to wait for to advance to\nthe specified position. The function returns NULL if the replica SQL thread is\nnot started, the replica\'s primary information is not initialized, the\narguments are incorrect, or an error occurs. It returns -1 if the timeout has\nbeen exceeded. If the replica SQL thread stops while MASTER_POS_WAIT() is\nwaiting, the function returns NULL. If the replica is past the specified\nposition, the function returns immediately.\n\nIf a timeout value is specified, MASTER_POS_WAIT() stops waiting when timeout\nseconds have elapsed. timeout must be greater than 0; a zero or negative\ntimeout means no timeout.\n\nThe connection_name is used when you are using multi-source-replication. If\nyou don\'t specify it, it\'s set to the value of the default_master_connection\nsystem variable.\n\nStatements using the MASTER_POS_WAIT() function are not safe for replication.\n\nURL: https://mariadb.com/kb/en/master_pos_wait/','','https://mariadb.com/kb/en/master_pos_wait/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (161,14,'NAME_CONST','Syntax\n------\n\nNAME_CONST(name,value)\n\nDescription\n-----------\n\nReturns the given value. When used to produce a result set column,\nNAME_CONST() causes the column to have the given name. The arguments should be\nconstants.\n\nThis function is used internally when replicating stored procedures. It makes\nlittle sense to use it explicitly in SQL statements, and it was not supposed\nto be used like that.\n\nSELECT NAME_CONST(\'myname\', 14);\n+--------+\n| myname |\n+--------+\n| 14 |\n+--------+\n\nURL: https://mariadb.com/kb/en/name_const/','','https://mariadb.com/kb/en/name_const/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (162,14,'RELEASE_ALL_LOCKS','MariaDB until 10.5.2\n--------------------\nRELEASE_ALL_LOCKS was added in MariaDB 10.5.2.\n\nSyntax\n------\n\nRELEASE_ALL_LOCKS()\n\nDescription\n-----------\n\nReleases all named locks held by the current session. Returns the number of\nlocks released, or 0 if none were held.\n\nStatements using the RELEASE_ALL_LOCKS function are not safe for\nstatement-based replication.\n\nExamples\n--------\n\nSELECT RELEASE_ALL_LOCKS();\n+---------------------+\n| RELEASE_ALL_LOCKS() | \n+---------------------+\n| 0 |\n+---------------------+\n\nSELECT GET_LOCK(\'lock1\',10);\n+----------------------+\n| GET_LOCK(\'lock1\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT RELEASE_ALL_LOCKS();\n+---------------------+\n| RELEASE_ALL_LOCKS() | \n+---------------------+\n| 1 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/release_all_locks/','','https://mariadb.com/kb/en/release_all_locks/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (163,14,'RELEASE_LOCK','Syntax\n------\n\nRELEASE_LOCK(str)\n\nDescription\n-----------\n\nReleases the lock named by the string str that was obtained with GET_LOCK().\nReturns 1 if the lock was released, 0 if the lock was not established by this\nthread (in which case the lock is not released), and NULL if the named lock\ndid not exist. The lock does not exist if it was never obtained by a call to\nGET_LOCK() or if it has previously been released.\n\nstr is case insensitive. If str is an empty string or NULL, RELEASE_LOCK()\nreturns NULL and does nothing.\n\nStatements using the RELEASE_LOCK() function are not safe for replication.\n\nThe DO statement is convenient to use with RELEASE_LOCK().\n\nExamples\n--------\n\nConnection1:\n\nSELECT GET_LOCK(\'lock1\',10);\n+----------------------+\n| GET_LOCK(\'lock1\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 2:\n\nSELECT GET_LOCK(\'lock2\',10);\n+----------------------+\n| GET_LOCK(\'lock2\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nConnection 1:\n\nSELECT RELEASE_LOCK(\'lock1\'), RELEASE_LOCK(\'lock2\'), RELEASE_LOCK(\'lock3\');\n+-----------------------+-----------------------+-----------------------+\n| RELEASE_LOCK(\'lock1\') | RELEASE_LOCK(\'lock2\') | RELEASE_LOCK(\'lock3\') |\n+-----------------------+-----------------------+-----------------------+\n| 1 | 0 | NULL |\n+-----------------------+-----------------------+-----------------------+\n\nFrom MariaDB 10.0.2, it is possible to hold the same lock recursively. This\nexample is viewed using the metadata_lock_info plugin:\n\nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA |\nTABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 |\n |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n\nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE | TABLE_SCHEMA |\nTABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 |\n |\n+-----------+---------------------+---------------+-----------+--------------+-\n----------+\n\nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\nEmpty set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/release_lock/','','https://mariadb.com/kb/en/release_lock/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (164,14,'SLEEP','Syntax\n------\n\nSLEEP(duration)\n\nDescription\n-----------\n\nSleeps (pauses) for the number of seconds given by the duration argument, then\nreturns 0. If SLEEP() is interrupted, it returns 1. The duration may have a\nfractional part given in microseconds.\n\nStatements using the SLEEP() function are not safe for replication.\n\nExample\n-------\n\nSELECT SLEEP(5.5);\n+------------+\n| SLEEP(5.5) |\n+------------+\n| 0 |\n+------------+\n1 row in set (5.50 sec)\n\nURL: https://mariadb.com/kb/en/sleep/','','https://mariadb.com/kb/en/sleep/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (165,14,'SYS_GUID','MariaDB starting with 10.6.1\n----------------------------\nThe SYS_GUID function was introduced in MariaDB 10.6.1 to enhance Oracle\ncompatibility. Similar functionality can be achieved with the UUID function.\n\nSyntax\n------\n\nSYS_GUID()\n\nDescription\n-----------\n\nReturns a 16-byte globally unique identifier (GUID), similar to the UUID\nfunction, but without the - character.\n\nExample\n-------\n\nSELECT SYS_GUID();\n+----------------------------------+\n| SYS_GUID() |\n+----------------------------------+\n| 2C574E45BA2811EBB265F859713E4BE4 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/sys_guid/','','https://mariadb.com/kb/en/sys_guid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (166,14,'UUID','Syntax\n------\n\nUUID()\n\nDescription\n-----------\n\nReturns a Universally Unique Identifier (UUID).\n\nA UUID is designed as a number that is globally unique in space and time. Two\ncalls to UUID() are expected to generate two different values, even if these\ncalls are performed on two separate computers that are not connected to each\nother.\n\nUUID() results are intended to be unique, but cannot always be relied upon to\nunpredictable and unguessable, so should not be relied upon for these purposes.\n\nA UUID is a 128-bit number represented by a utf8 string of five hexadecimal\nnumbers in aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee format:\n\n* The first three numbers are generated from a timestamp.\n* The fourth number preserves temporal uniqueness in case the timestamp value\n loses monotonicity (for example, due to daylight saving time).\n* The fifth number is an IEEE 802 node number that provides spatial uniqueness.\n A random number is substituted if the latter is not available (for example,\n because the host computer has no Ethernet card, or we do not know how to find\n the hardware address of an interface on your operating system). In this case,\n spatial uniqueness cannot be guaranteed. Nevertheless, a collision should\n have very low probability.\n\nCurrently, the MAC address of an interface is taken into account only on\nFreeBSD and Linux. On other operating systems, MariaDB uses a randomly\ngenerated 48-bit number.\n\nStatements using the UUID() function are not safe for replication.\n\nThe results are generated according to the \"DCE 1.1:Remote Procedure Call\"\n(Appendix A) CAE (Common Applications Environment) Specifications published by\nThe Open Group in October 1997 (Document Number C706).\n\nExamples\n--------\n\nSELECT UUID();\n+--------------------------------------+\n| UUID() |\n+--------------------------------------+\n| cd41294a-afb0-11df-bc9b-00241dd75637 |\n+--------------------------------------+\n\nURL: https://mariadb.com/kb/en/uuid/','','https://mariadb.com/kb/en/uuid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (167,14,'UUID_SHORT','Syntax\n------\n\nUUID_SHORT()\n\nDescription\n-----------\n\nReturns a \"short\" universally unique identifier as a 64-bit unsigned integer\n(rather than a string-form 128-bit identifier as returned by the UUID()\nfunction).\n\nThe value of UUID_SHORT() is guaranteed to be unique if the following\nconditions hold:\n\n* The server_id of the current host is unique among your set of master and\n slave servers\n* server_id is between 0 and 255\n* You don\'t set back your system time for your server between mysqld restarts\n* You do not invoke UUID_SHORT() on average more than 16\n million times per second between mysqld restarts\n\nThe UUID_SHORT() return value is constructed this way:\n\n(server_id & 255) << 56\n+ (server_startup_time_in_seconds << 24)\n+ incremented_variable++;\n\nStatements using the UUID_SHORT() function are not safe for statement-based\nreplication.\n\nExamples\n--------\n\nSELECT UUID_SHORT();\n+-------------------+\n| UUID_SHORT() |\n+-------------------+\n| 21517162376069120 |\n+-------------------+\n\ncreate table t1 (a bigint unsigned default(uuid_short()) primary key);\ninsert into t1 values(),();\nselect * from t1;\n+-------------------+\n| a |\n+-------------------+\n| 98113699159474176 |\n| 98113699159474177 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/uuid_short/','','https://mariadb.com/kb/en/uuid_short/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (168,14,'VALUES / VALUE','Syntax\n------\n\nMariaDB starting with 10.3.3\n----------------------------\n\nVALUE(col_name)\n\nMariaDB until 10.3.2\n--------------------\n\nVALUES(col_name)\n\nDescription\n-----------\n\nIn an INSERT ... ON DUPLICATE KEY UPDATE statement, you can use the\nVALUES(col_name) function in the UPDATE clause to refer to column values from\nthe INSERT portion of the statement. In other words, VALUES(col_name) in the\nUPDATE clause refers to the value of col_name that would be inserted, had no\nduplicate-key conflict occurred. This function is especially useful in\nmultiple-row inserts.\n\nThe VALUES() function is meaningful only in INSERT ... ON DUPLICATE KEY UPDATE\nstatements and returns NULL otherwise.\n\nIn MariaDB 10.3.3 this function was renamed to VALUE(), because it\'s\nincompatible with the standard Table Value Constructors syntax, implemented in\nMariaDB 10.3.3.\n\nThe VALUES() function can still be used even from MariaDB 10.3.3, but only in\nINSERT ... ON DUPLICATE KEY UPDATE statements; it\'s a syntax error otherwise.\n\nExamples\n--------\n\nMariaDB starting with 10.3.3\n----------------------------\n\nINSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6)\n ON DUPLICATE KEY UPDATE c=VALUE(a)+VALUE(b);\n\nMariaDB until 10.3.2\n--------------------\n\nINSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6)\n ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);\n\nURL: https://mariadb.com/kb/en/values-value/','','https://mariadb.com/kb/en/values-value/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (169,15,'!','Syntax\n------\n\nNOT, !\n\nDescription\n-----------\n\nLogical NOT. Evaluates to 1 if the operand is 0, to 0 if the operand is\nnon-zero, and NOT NULL returns NULL.\n\nBy default, the ! operator has a higher precedence. If the HIGH_NOT_PRECEDENCE\nSQL_MODE flag is set, NOT and ! have the same precedence.\n\nExamples\n--------\n\nSELECT NOT 10;\n+--------+\n| NOT 10 |\n+--------+\n| 0 |\n+--------+\n\nSELECT NOT 0;\n+-------+\n| NOT 0 |\n+-------+\n| 1 |\n+-------+\n\nSELECT NOT NULL;\n+----------+\n| NOT NULL |\n+----------+\n| NULL |\n+----------+\n\nSELECT ! (1+1);\n+---------+\n| ! (1+1) |\n+---------+\n| 0 |\n+---------+\n\nSELECT ! 1+1;\n+-------+\n| ! 1+1 |\n+-------+\n| 1 |\n+-------+\n\nURL: https://mariadb.com/kb/en/not/','','https://mariadb.com/kb/en/not/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (170,15,'&&','Syntax\n------\n\nAND, &&\n\nDescription\n-----------\n\nLogical AND. Evaluates to 1 if all operands are non-zero and not NULL, to 0 if\none or more operands are 0, otherwise NULL is returned.\n\nFor this operator, short-circuit evaluation can be used.\n\nExamples\n--------\n\nSELECT 1 && 1;\n+--------+\n| 1 && 1 |\n+--------+\n| 1 |\n+--------+\n\nSELECT 1 && 0;\n+--------+\n| 1 && 0 |\n+--------+\n| 0 |\n+--------+\n\nSELECT 1 && NULL;\n+-----------+\n| 1 && NULL |\n+-----------+\n| NULL |\n+-----------+\n\nSELECT 0 && NULL;\n+-----------+\n| 0 && NULL |\n+-----------+\n| 0 |\n+-----------+\n\nSELECT NULL && 0;\n+-----------+\n| NULL && 0 |\n+-----------+\n| 0 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/and/','','https://mariadb.com/kb/en/and/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (171,15,'XOR','Syntax\n------\n\nXOR\n\nDescription\n-----------\n\nXOR stands for eXclusive OR. Returns NULL if either operand is NULL. For\nnon-NULL operands, evaluates to 1 if an odd number of operands is non-zero,\notherwise 0 is returned.\n\nExamples\n--------\n\nSELECT 1 XOR 1;\n+---------+\n| 1 XOR 1 |\n+---------+\n| 0 |\n+---------+\n\nSELECT 1 XOR 0;\n+---------+\n| 1 XOR 0 |\n+---------+\n| 1 |\n+---------+\n\nSELECT 1 XOR NULL;\n+------------+\n| 1 XOR NULL |\n+------------+\n| NULL |\n+------------+\n\nIn the following example, the right 1 XOR 1 is evaluated first, and returns 0.\nThen, 1 XOR 0 is evaluated, and 1 is returned.\n\nSELECT 1 XOR 1 XOR 1;\n+---------------+\n| 1 XOR 1 XOR 1 |\n+---------------+\n| 1 |\n+---------------+\n\nURL: https://mariadb.com/kb/en/xor/','','https://mariadb.com/kb/en/xor/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (172,15,'||','Syntax\n------\n\nOR, ||\n\nDescription\n-----------\n\nLogical OR. When both operands are non-NULL, the result is 1 if any operand is\nnon-zero, and 0 otherwise. With a NULL operand, the result is 1 if the other\noperand is non-zero, and NULL otherwise. If both operands are NULL, the result\nis NULL.\n\nFor this operator, short-circuit evaluation can be used.\n\nNote that, if the PIPES_AS_CONCAT SQL_MODE is set, || is used as a string\nconcatenation operator. This means that a || b is the same as CONCAT(a,b). See\nCONCAT() for details.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, || ignores NULL.\n\nExamples\n--------\n\nSELECT 1 || 1;\n+--------+\n| 1 || 1 |\n+--------+\n| 1 |\n+--------+\n\nSELECT 1 || 0;\n+--------+\n| 1 || 0 |\n+--------+\n| 1 |\n+--------+\n\nSELECT 0 || 0;\n+--------+\n| 0 || 0 |\n+--------+\n| 0 |\n+--------+\n\nSELECT 0 || NULL;\n+-----------+\n| 0 || NULL |\n+-----------+\n| NULL |\n+-----------+\n\nSELECT 1 || NULL;\n+-----------+\n| 1 || NULL |\n+-----------+\n| 1 |\n+-----------+\n\nIn Oracle mode, from MariaDB 10.3:\n\nSELECT 0 || NULL;\n+-----------+\n| 0 || NULL |\n+-----------+\n| 0 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/or/','','https://mariadb.com/kb/en/or/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (173,16,'Stored Aggregate Functions','MariaDB starting with 10.3.3\n----------------------------\nThe ability to create stored aggregate functions was added in MariaDB 10.3.3.\n\nAggregate functions are functions that are computed over a sequence of rows\nand return one result for the sequence of rows.\n\nCreating a custom aggregate function is done using the CREATE FUNCTION\nstatement with two main differences:\n\n* The addition of the AGGREGATE keyword, so CREATE AGGREGATE FUNCTION\n* The FETCH GROUP NEXT ROW instruction inside the loop\n* Oracle PL/SQL compatibility using SQL/PL is provided\n\nStandard Syntax\n---------------\n\nCREATE AGGREGATE FUNCTION function_name (parameters) RETURNS return_type\nBEGIN\n All types of declarations\n DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN return_val;\n LOOP\n FETCH GROUP NEXT ROW; // fetches next row from table\n other instructions\n END LOOP;\nEND\n\nStored aggregate functions were a 2016 Google Summer of Code project by Varun\nGupta.\n\nUsing SQL/PL\n------------\n\nSET sql_mode=Oracle;\nDELIMITER //\n\nCREATE AGGREGATE FUNCTION function_name (parameters) RETURN return_type\n declarations\nBEGIN\n LOOP\n FETCH GROUP NEXT ROW; -- fetches next row from table\n -- other instructions\n\nEND LOOP;\nEXCEPTION\n WHEN NO_DATA_FOUND THEN\n RETURN return_val;\nEND //\n\nDELIMITER ;\n\nExamples\n--------\n\nFirst a simplified example:\n\nCREATE TABLE marks(stud_id INT, grade_count INT);\n\nINSERT INTO marks VALUES (1,6), (2,4), (3,7), (4,5), (5,8);\n\nSELECT * FROM marks;\n+---------+-------------+\n| stud_id | grade_count |\n+---------+-------------+\n| 1 | 6 |\n| 2 | 4 |\n| 3 | 7 |\n| 4 | 5 |\n| 5 | 8 |\n+---------+-------------+\n\nDELIMITER //\nCREATE AGGREGATE FUNCTION IF NOT EXISTS aggregate_count(x INT) RETURNS INT\nBEGIN\n DECLARE count_students INT DEFAULT 0;\n DECLARE CONTINUE HANDLER FOR NOT FOUND\n RETURN count_students;\n LOOP\n FETCH GROUP NEXT ROW;\n IF x THEN\n SET count_students = count_students+1;\n END IF;\n END LOOP;\nEND //\nDELIMITER ;\n\nA non-trivial example that cannot easily be rewritten using existing functions:\n\nDELIMITER //\nCREATE AGGREGATE FUNCTION medi_int(x INT) RETURNS DOUBLE\nBEGIN\n DECLARE CONTINUE HANDLER FOR NOT FOUND\n BEGIN\n DECLARE res DOUBLE;\n DECLARE cnt INT DEFAULT (SELECT COUNT(*) FROM tt);\n DECLARE lim INT DEFAULT (cnt-1) DIV 2;\n IF cnt % 2 = 0 THEN\n SET res = (SELECT AVG(a) FROM (SELECT a FROM tt ORDER BY a LIMIT\nlim,2) ttt);\n ELSE\n SET res = (SELECT a FROM tt ORDER BY a LIMIT lim,1);\n END IF;\n DROP TEMPORARY TABLE tt;\n RETURN res;\n END;\n CREATE TEMPORARY TABLE tt (a INT);\n LOOP\n FETCH GROUP NEXT ROW;\n INSERT INTO tt VALUES (x);\n END LOOP;\nEND //\nDELIMITER ;\n\nSQL/PL Example\n--------------\n\nThis uses the same marks table as created above.\n\nSET sql_mode=Oracle;\nDELIMITER //\n\nCREATE AGGREGATE FUNCTION aggregate_count(x INT) RETURN INT AS count_students\nINT DEFAULT 0;\nBEGIN\n LOOP\n FETCH GROUP NEXT ROW;\n IF x THEN\n SET count_students := count_students+1;\n END IF;\n END LOOP;\nEXCEPTION\n WHEN NO_DATA_FOUND THEN\n RETURN count_students;\nEND aggregate_count //\nDELIMITER ;\n\nSELECT aggregate_count(stud_id) FROM marks;\n\nURL: https://mariadb.com/kb/en/stored-aggregate-functions/','','https://mariadb.com/kb/en/stored-aggregate-functions/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (174,16,'AVG','Syntax\n------\n\nAVG([DISTINCT] expr)\n\nDescription\n-----------\n\nReturns the average value of expr. The DISTINCT option can be used to return\nthe average of the distinct values of expr. NULL values are ignored. It is an\naggregate function, and so can be used with the GROUP BY clause.\n\nAVG() returns NULL if there were no matching rows.\n\nAVG() can be used as a window function.\n\nExamples\n--------\n\nCREATE TABLE sales (sales_value INT);\n\nINSERT INTO sales VALUES(10),(20),(20),(40);\n\nSELECT AVG(sales_value) FROM sales;\n+------------------+\n| AVG(sales_value) |\n+------------------+\n| 22.5000 |\n+------------------+\n\nSELECT AVG(DISTINCT(sales_value)) FROM sales;\n+----------------------------+\n| AVG(DISTINCT(sales_value)) |\n+----------------------------+\n| 23.3333 |\n+----------------------------+\n\nCommonly, AVG() is used with a GROUP BY clause:\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT name, AVG(score) FROM student GROUP BY name;\n+---------+------------+\n| name | AVG(score) |\n+---------+------------+\n| Chun | 74.0000 |\n| Esben | 37.0000 |\n| Kaolin | 72.0000 |\n| Tatiana | 85.0000 |\n+---------+------------+\n\nBe careful to avoid this common mistake, not grouping correctly and returning\nmismatched data:\n\nSELECT name,test,AVG(score) FROM student;\n+------+------+------------+\n| name | test | MIN(score) |\n+------+------+------------+\n| Chun | SQL | 31 |\n+------+------+------------+\n\nAs a window function:\n\nCREATE TABLE student_test (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT name, test, score, AVG(score) OVER (PARTITION BY test) \n AS average_by_test FROM student_test;\n+---------+--------+-------+-----------------+\n| name | test | score | average_by_test |\n+---------+--------+-------+-----------------+\n| Chun | SQL | 75 | 65.2500 |\n| Chun | Tuning | 73 | 68.7500 |\n| Esben | SQL | 43 | 65.2500 |\n| Esben | Tuning | 31 | 68.7500 |\n| Kaolin | SQL | 56 | 65.2500 |\n| Kaolin | Tuning | 88 | 68.7500 |\n| Tatiana | SQL | 87 | 65.2500 |\n| Tatiana | Tuning | 83 | 68.7500 |\n+---------+--------+-------+-----------------+\n\nURL: https://mariadb.com/kb/en/avg/','','https://mariadb.com/kb/en/avg/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (175,16,'BIT_AND','Syntax\n------\n\nBIT_AND(expr) [over_clause]\n\nDescription\n-----------\n\nReturns the bitwise AND of all bits in expr. The calculation is performed with\n64-bit (BIGINT) precision. It is an aggregate function, and so can be used\nwith the GROUP BY clause.\n\nIf no rows match, BIT_AND will return a value with all bits set to 1. NULL\nvalues have no effect on the result unless all results are NULL, which is\ntreated as no match.\n\nBIT_AND can be used as a window function with the addition of the over_clause.\n\nExamples\n--------\n\nCREATE TABLE vals (x INT);\n\nINSERT INTO vals VALUES(111),(110),(100);\n\nSELECT BIT_AND(x), BIT_OR(x), BIT_XOR(x) FROM vals;\n+------------+-----------+------------+\n| BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+------------+-----------+------------+\n| 100 | 111 | 101 |\n+------------+-----------+------------+\n\nAs an aggregate function:\n\nCREATE TABLE vals2 (category VARCHAR(1), x INT);\n\nINSERT INTO vals2 VALUES\n (\'a\',111),(\'a\',110),(\'a\',100),\n (\'b\',\'000\'),(\'b\',001),(\'b\',011);\n\nSELECT category, BIT_AND(x), BIT_OR(x), BIT_XOR(x) \n FROM vals GROUP BY category;\n+----------+------------+-----------+------------+\n| category | BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+----------+------------+-----------+------------+\n| a | 100 | 111 | 101 |\n| b | 0 | 11 | 10 |\n+----------+------------+-----------+------------+\n\nNo match:\n\nSELECT BIT_AND(NULL);\n+----------------------+\n| BIT_AND(NULL) |\n+----------------------+\n| 18446744073709551615 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/bit_and/','','https://mariadb.com/kb/en/bit_and/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (176,16,'BIT_OR','Syntax\n------\n\nBIT_OR(expr) [over_clause]\n\nDescription\n-----------\n\nReturns the bitwise OR of all bits in expr. The calculation is performed with\n64-bit (BIGINT) precision. It is an aggregate function, and so can be used\nwith the GROUP BY clause.\n\nIf no rows match, BIT_OR will return a value with all bits set to 0. NULL\nvalues have no effect on the result unless all results are NULL, which is\ntreated as no match.\n\nBIT_OR can be used as a window function with the addition of the over_clause.\n\nExamples\n--------\n\nCREATE TABLE vals (x INT);\n\nINSERT INTO vals VALUES(111),(110),(100);\n\nSELECT BIT_AND(x), BIT_OR(x), BIT_XOR(x) FROM vals;\n+------------+-----------+------------+\n| BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+------------+-----------+------------+\n| 100 | 111 | 101 |\n+------------+-----------+------------+\n\nAs an aggregate function:\n\nCREATE TABLE vals2 (category VARCHAR(1), x INT);\n\nINSERT INTO vals2 VALUES\n (\'a\',111),(\'a\',110),(\'a\',100),\n (\'b\',\'000\'),(\'b\',001),(\'b\',011);\n\nSELECT category, BIT_AND(x), BIT_OR(x), BIT_XOR(x) \n FROM vals GROUP BY category;\n+----------+------------+-----------+------------+\n| category | BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+----------+------------+-----------+------------+\n| a | 100 | 111 | 101 |\n| b | 0 | 11 | 10 |\n+----------+------------+-----------+------------+\n\nNo match:\n\nSELECT BIT_OR(NULL);\n+--------------+\n| BIT_OR(NULL) |\n+--------------+\n| 0 |\n+--------------+\n\nURL: https://mariadb.com/kb/en/bit_or/','','https://mariadb.com/kb/en/bit_or/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (177,16,'BIT_XOR','Syntax\n------\n\nBIT_XOR(expr) [over_clause]\n\nDescription\n-----------\n\nReturns the bitwise XOR of all bits in expr. The calculation is performed with\n64-bit (BIGINT) precision. It is an aggregate function, and so can be used\nwith the GROUP BY clause.\n\nIf no rows match, BIT_XOR will return a value with all bits set to 0. NULL\nvalues have no effect on the result unless all results are NULL, which is\ntreated as no match.\n\nBIT_XOR can be used as a window function with the addition of the over_clause.\n\nExamples\n--------\n\nCREATE TABLE vals (x INT);\n\nINSERT INTO vals VALUES(111),(110),(100);\n\nSELECT BIT_AND(x), BIT_OR(x), BIT_XOR(x) FROM vals;\n+------------+-----------+------------+\n| BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+------------+-----------+------------+\n| 100 | 111 | 101 |\n+------------+-----------+------------+\n\nAs an aggregate function:\n\nCREATE TABLE vals2 (category VARCHAR(1), x INT);\n\nINSERT INTO vals2 VALUES\n (\'a\',111),(\'a\',110),(\'a\',100),\n (\'b\',\'000\'),(\'b\',001),(\'b\',011);\n\nSELECT category, BIT_AND(x), BIT_OR(x), BIT_XOR(x) \n FROM vals GROUP BY category;\n+----------+------------+-----------+------------+\n| category | BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+----------+------------+-----------+------------+\n| a | 100 | 111 | 101 |\n| b | 0 | 11 | 10 |\n+----------+------------+-----------+------------+\n\nNo match:\n\nSELECT BIT_XOR(NULL);\n+---------------+\n| BIT_XOR(NULL) |\n+---------------+\n| 0 |\n+---------------+\n\nURL: https://mariadb.com/kb/en/bit_xor/','','https://mariadb.com/kb/en/bit_xor/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (178,16,'COUNT','Syntax\n------\n\nCOUNT(expr)\n\nDescription\n-----------\n\nReturns a count of the number of non-NULL values of expr in the rows retrieved\nby a SELECT statement. The result is a BIGINT value. It is an aggregate\nfunction, and so can be used with the GROUP BY clause.\n\nCOUNT(*) counts the total number of rows in a table.\n\nCOUNT() returns 0 if there were no matching rows.\n\nCOUNT() can be used as a window function.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT COUNT(*) FROM student;\n+----------+\n| COUNT(*) |\n+----------+\n| 8 |\n+----------+\n\nCOUNT(DISTINCT) example:\n\nSELECT COUNT(DISTINCT (name)) FROM student;\n+------------------------+\n| COUNT(DISTINCT (name)) |\n+------------------------+\n| 4 |\n+------------------------+\n\nAs a window function\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, COUNT(score) OVER (PARTITION BY name) \n AS tests_written FROM student_test;\n+---------+--------+-------+---------------+\n| name | test | score | tests_written |\n+---------+--------+-------+---------------+\n| Chun | SQL | 75 | 2 |\n| Chun | Tuning | 73 | 2 |\n| Esben | SQL | 43 | 2 |\n| Esben | Tuning | 31 | 2 |\n| Kaolin | SQL | 56 | 2 |\n| Kaolin | Tuning | 88 | 2 |\n| Tatiana | SQL | 87 | 1 |\n+---------+--------+-------+---------------+\n\nURL: https://mariadb.com/kb/en/count/','','https://mariadb.com/kb/en/count/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (179,16,'COUNT DISTINCT','Syntax\n------\n\nCOUNT(DISTINCT expr,[expr...])\n\nDescription\n-----------\n\nReturns a count of the number of different non-NULL values.\n\nCOUNT(DISTINCT) returns 0 if there were no matching rows.\n\nAlthough, from MariaDB 10.2.0, COUNT can be used as a window function, COUNT\nDISTINCT cannot be.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT COUNT(*) FROM student;\n+----------+\n| COUNT(*) |\n+----------+\n| 8 |\n+----------+\n\nSELECT COUNT(DISTINCT (name)) FROM student;\n+------------------------+\n| COUNT(DISTINCT (name)) |\n+------------------------+\n| 4 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/count-distinct/','','https://mariadb.com/kb/en/count-distinct/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (180,16,'GROUP_CONCAT','Syntax\n------\n\nGROUP_CONCAT(expr)\n\nDescription\n-----------\n\nThis function returns a string result with the concatenated non-NULL values\nfrom a group. It returns NULL if there are no non-NULL values.\n\nThe maximum returned length in bytes is determined by the group_concat_max_len\nserver system variable, which defaults to 1M (>= MariaDB 10.2.4) or 1K (<=\nMariaDB 10.2.3).\n\nIf group_concat_max_len <= 512, the return type is VARBINARY or VARCHAR;\notherwise, the return type is BLOB or TEXT. The choice between binary or\nnon-binary types depends from the input.\n\nThe full syntax is as follows:\n\nGROUP_CONCAT([DISTINCT] expr [,expr ...]\n [ORDER BY {unsigned_integer | col_name | expr}\n [ASC | DESC] [,col_name ...]]\n [SEPARATOR str_val]\n [LIMIT {[offset,] row_count | row_count OFFSET offset}])\n\nDISTINCT eliminates duplicate values from the output string.\n\nORDER BY determines the order of returned values.\n\nSEPARATOR specifies a separator between the values. The default separator is a\ncomma (,). It is possible to avoid using a separator by specifying an empty\nstring.\n\nLIMIT\n-----\n\nMariaDB starting with 10.3.3\n----------------------------\nUntil MariaDB 10.3.2, it was not possible to use the LIMIT clause with\nGROUP_CONCAT. This restriction was lifted in MariaDB 10.3.3.\n\nExamples\n--------\n\nSELECT student_name,\n GROUP_CONCAT(test_score)\n FROM student\n GROUP BY student_name;\n\nGet a readable list of MariaDB users from the mysql.user table:\n\nSELECT GROUP_CONCAT(DISTINCT User ORDER BY User SEPARATOR \'\\n\')\n FROM mysql.user;\n\nIn the former example, DISTINCT is used because the same user may occur more\nthan once. The new line (\\n) used as a SEPARATOR makes the results easier to\nread.\n\nGet a readable list of hosts from which each user can connect:\n\nSELECT User, GROUP_CONCAT(Host ORDER BY Host SEPARATOR \', \') \n FROM mysql.user GROUP BY User ORDER BY User;\n\nThe former example shows the difference between the GROUP_CONCAT\'s ORDER BY\n(which sorts the concatenated hosts), and the SELECT\'s ORDER BY (which sorts\nthe rows).\n\nFrom MariaDB 10.3.3, LIMIT can be used with GROUP_CONCAT, so, for example,\ngiven the following table:\n\nCREATE TABLE d (dd DATE, cc INT);\n\nINSERT INTO d VALUES (\'2017-01-01\',1);\nINSERT INTO d VALUES (\'2017-01-02\',2);\nINSERT INTO d VALUES (\'2017-01-04\',3);\n\nthe following query:\n\nSELECT SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc\nDESC),\",\",1) FROM d;\n+----------------------------------------------------------------------------+\n| SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC),\",\",1) |\n+----------------------------------------------------------------------------+\n| 2017-01-04:3 |\n+----------------------------------------------------------------------------+\n\ncan be more simply rewritten as:\n\nSELECT GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC LIMIT 1) FROM d;\n+-------------------------------------------------------------+\n| GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC LIMIT 1) |\n+-------------------------------------------------------------+\n| 2017-01-04:3 |\n+-------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/group_concat/','','https://mariadb.com/kb/en/group_concat/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (181,16,'MAX','Syntax\n------\n\nMAX([DISTINCT] expr)\n\nDescription\n-----------\n\nReturns the largest, or maximum, value of expr. MAX() can also take a string\nargument in which case it returns the maximum string value. The DISTINCT\nkeyword can be used to find the maximum of the distinct values of expr,\nhowever, this produces the same result as omitting DISTINCT.\n\nNote that SET and ENUM fields are currently compared by their string value\nrather than their relative position in the set, so MAX() may produce a\ndifferent highest result than ORDER BY DESC.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nMAX() can be used as a window function.\n\nMAX() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT name, MAX(score) FROM student GROUP BY name;\n+---------+------------+\n| name | MAX(score) |\n+---------+------------+\n| Chun | 75 |\n| Esben | 43 |\n| Kaolin | 88 |\n| Tatiana | 87 |\n+---------+------------+\n\nMAX string:\n\nSELECT MAX(name) FROM student;\n+-----------+\n| MAX(name) |\n+-----------+\n| Tatiana |\n+-----------+\n\nBe careful to avoid this common mistake, not grouping correctly and returning\nmismatched data:\n\nSELECT name,test,MAX(SCORE) FROM student;\n+------+------+------------+\n| name | test | MAX(SCORE) |\n+------+------+------------+\n| Chun | SQL | 88 |\n+------+------+------------+\n\nDifference between ORDER BY DESC and MAX():\n\nCREATE TABLE student2(name CHAR(10),grade ENUM(\'b\',\'c\',\'a\'));\n\nINSERT INTO student2 VALUES(\'Chun\',\'b\'),(\'Esben\',\'c\'),(\'Kaolin\',\'a\');\n\nSELECT MAX(grade) FROM student2;\n+------------+\n| MAX(grade) |\n+------------+\n| c |\n+------------+\n\nSELECT grade FROM student2 ORDER BY grade DESC LIMIT 1;\n+-------+\n| grade |\n+-------+\n| a |\n+-------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, MAX(score) \n OVER (PARTITION BY name) AS highest_score FROM student_test;\n+---------+--------+-------+---------------+\n| name | test | score | highest_score |\n+---------+--------+-------+---------------+\n| Chun | SQL | 75 | 75 |\n| Chun | Tuning | 73 | 75 |\n| Esben | SQL | 43 | 43 |\n| Esben | Tuning | 31 | 43 |\n| Kaolin | SQL | 56 | 88 |\n| Kaolin | Tuning | 88 | 88 |\n| Tatiana | SQL | 87 | 87 |\n+---------+--------+-------+---------------+\n\nURL: https://mariadb.com/kb/en/max/','','https://mariadb.com/kb/en/max/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (182,16,'MIN','Syntax\n------\n\nMIN([DISTINCT] expr)\n\nDescription\n-----------\n\nReturns the minimum value of expr. MIN() may take a string argument, in which\ncase it returns the minimum string value. The DISTINCT keyword can be used to\nfind the minimum of the distinct values of expr, however, this produces the\nsame result as omitting DISTINCT.\n\nNote that SET and ENUM fields are currently compared by their string value\nrather than their relative position in the set, so MIN() may produce a\ndifferent lowest result than ORDER BY ASC.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nMIN() can be used as a window function.\n\nMIN() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nSELECT name, MIN(score) FROM student GROUP BY name;\n+---------+------------+\n| name | MIN(score) |\n+---------+------------+\n| Chun | 73 |\n| Esben | 31 |\n| Kaolin | 56 |\n| Tatiana | 83 |\n+---------+------------+\n\nMIN() with a string:\n\nSELECT MIN(name) FROM student;\n+-----------+\n| MIN(name) |\n+-----------+\n| Chun |\n+-----------+\n\nBe careful to avoid this common mistake, not grouping correctly and returning\nmismatched data:\n\nSELECT name,test,MIN(score) FROM student;\n+------+------+------------+\n| name | test | MIN(score) |\n+------+------+------------+\n| Chun | SQL | 31 |\n+------+------+------------+\n\nDifference between ORDER BY ASC and MIN():\n\nCREATE TABLE student2(name CHAR(10),grade ENUM(\'b\',\'c\',\'a\'));\n\nINSERT INTO student2 VALUES(\'Chun\',\'b\'),(\'Esben\',\'c\'),(\'Kaolin\',\'a\');\n\nSELECT MIN(grade) FROM student2;\n+------------+\n| MIN(grade) |\n+------------+\n| a |\n+------------+\n\nSELECT grade FROM student2 ORDER BY grade ASC LIMIT 1;\n+-------+\n| grade |\n+-------+\n| b |\n+-------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, MIN(score) \n OVER (PARTITION BY name) AS lowest_score FROM student_test;\n+---------+--------+-------+--------------+\n| name | test | score | lowest_score |\n+---------+--------+-------+--------------+\n| Chun | SQL | 75 | 73 |\n| Chun | Tuning | 73 | 73 |\n| Esben | SQL | 43 | 31 |\n| Esben | Tuning | 31 | 31 |\n| Kaolin | SQL | 56 | 56 |\n| Kaolin | Tuning | 88 | 56 |\n| Tatiana | SQL | 87 | 87 |\n+---------+--------+-------+--------------+\n\nURL: https://mariadb.com/kb/en/min/','','https://mariadb.com/kb/en/min/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (183,16,'STD','Syntax\n------\n\nSTD(expr)\n\nDescription\n-----------\n\nReturns the population standard deviation of expr. This is an extension to\nstandard SQL. The standard SQL function STDDEV_POP() can be used instead.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nSTD() can be used as a window function.\n\nThis function returns NULL if there were no matching rows.\n\nExamples\n--------\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, STDDEV_POP(score) \n OVER (PARTITION BY test) AS stddev_results FROM student_test;\n+---------+--------+-------+----------------+\n| name | test | score | stddev_results |\n+---------+--------+-------+----------------+\n| Chun | SQL | 75 | 16.9466 |\n| Chun | Tuning | 73 | 24.1247 |\n| Esben | SQL | 43 | 16.9466 |\n| Esben | Tuning | 31 | 24.1247 |\n| Kaolin | SQL | 56 | 16.9466 |\n| Kaolin | Tuning | 88 | 24.1247 |\n| Tatiana | SQL | 87 | 16.9466 |\n+---------+--------+-------+----------------+\n\nURL: https://mariadb.com/kb/en/std/','','https://mariadb.com/kb/en/std/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (184,16,'STDDEV','Syntax\n------\n\nSTDDEV(expr)\n\nDescription\n-----------\n\nReturns the population standard deviation of expr. This function is provided\nfor compatibility with Oracle. The standard SQL function STDDEV_POP() can be\nused instead.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nSTDDEV() can be used as a window function.\n\nThis function returns NULL if there were no matching rows.\n\nExamples\n--------\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, STDDEV_POP(score) \n OVER (PARTITION BY test) AS stddev_results FROM student_test;\n+---------+--------+-------+----------------+\n| name | test | score | stddev_results |\n+---------+--------+-------+----------------+\n| Chun | SQL | 75 | 16.9466 |\n| Chun | Tuning | 73 | 24.1247 |\n| Esben | SQL | 43 | 16.9466 |\n| Esben | Tuning | 31 | 24.1247 |\n| Kaolin | SQL | 56 | 16.9466 |\n| Kaolin | Tuning | 88 | 24.1247 |\n| Tatiana | SQL | 87 | 16.9466 |\n+---------+--------+-------+----------------+\n\nURL: https://mariadb.com/kb/en/stddev/','','https://mariadb.com/kb/en/stddev/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (185,16,'STDDEV_POP','Syntax\n------\n\nSTDDEV_POP(expr)\n\nDescription\n-----------\n\nReturns the population standard deviation of expr (the square root of\nVAR_POP()). You can also use STD() or STDDEV(), which are equivalent but not\nstandard SQL.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nSTDDEV_POP() can be used as a window function.\n\nSTDDEV_POP() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, STDDEV_POP(score) \n OVER (PARTITION BY test) AS stddev_results FROM student_test;\n+---------+--------+-------+----------------+\n| name | test | score | stddev_results |\n+---------+--------+-------+----------------+\n| Chun | SQL | 75 | 16.9466 |\n| Chun | Tuning | 73 | 24.1247 |\n| Esben | SQL | 43 | 16.9466 |\n| Esben | Tuning | 31 | 24.1247 |\n| Kaolin | SQL | 56 | 16.9466 |\n| Kaolin | Tuning | 88 | 24.1247 |\n| Tatiana | SQL | 87 | 16.9466 |\n+---------+--------+-------+----------------+\n\nURL: https://mariadb.com/kb/en/stddev_pop/','','https://mariadb.com/kb/en/stddev_pop/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (186,16,'STDDEV_SAMP','Syntax\n------\n\nSTDDEV_SAMP(expr)\n\nDescription\n-----------\n\nReturns the sample standard deviation of expr (the square root of VAR_SAMP()).\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nSTDDEV_SAMP() can be used as a window function.\n\nSTDDEV_SAMP() returns NULL if there were no matching rows.\n\nURL: https://mariadb.com/kb/en/stddev_samp/','','https://mariadb.com/kb/en/stddev_samp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (187,16,'SUM','Syntax\n------\n\nSUM([DISTINCT] expr)\n\nDescription\n-----------\n\nReturns the sum of expr. If the return set has no rows, SUM() returns NULL.\nThe DISTINCT keyword can be used to sum only the distinct values of expr.\n\nSUM() can be used as a window function, although not with the DISTINCT\nspecifier.\n\nExamples\n--------\n\nCREATE TABLE sales (sales_value INT);\nINSERT INTO sales VALUES(10),(20),(20),(40);\n\nSELECT SUM(sales_value) FROM sales;\n+------------------+\n| SUM(sales_value) |\n+------------------+\n| 90 |\n+------------------+\n\nSELECT SUM(DISTINCT(sales_value)) FROM sales;\n+----------------------------+\n| SUM(DISTINCT(sales_value)) |\n+----------------------------+\n| 70 |\n+----------------------------+\n\nCommonly, SUM is used with a GROUP BY clause:\n\nCREATE TABLE sales (name CHAR(10), month CHAR(10), units INT);\n\nINSERT INTO sales VALUES \n (\'Chun\', \'Jan\', 75), (\'Chun\', \'Feb\', 73),\n (\'Esben\', \'Jan\', 43), (\'Esben\', \'Feb\', 31),\n (\'Kaolin\', \'Jan\', 56), (\'Kaolin\', \'Feb\', 88),\n (\'Tatiana\', \'Jan\', 87), (\'Tatiana\', \'Feb\', 83);\n\nSELECT name, SUM(units) FROM sales GROUP BY name;\n+---------+------------+\n| name | SUM(units) |\n+---------+------------+\n| Chun | 148 |\n| Esben | 74 |\n| Kaolin | 144 |\n| Tatiana | 170 |\n+---------+------------+\n\nThe GROUP BY clause is required when using an aggregate function along with\nregular column data, otherwise the result will be a mismatch, as in the\nfollowing common type of mistake:\n\nSELECT name,SUM(units) FROM sales\n;+------+------------+\n| name | SUM(units) |\n+------+------------+\n| Chun | 536 |\n+------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, SUM(score) OVER (PARTITION BY name) AS total_score\nFROM student_test;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Chun | SQL | 75 | 148 |\n| Chun | Tuning | 73 | 148 |\n| Esben | SQL | 43 | 74 |\n| Esben | Tuning | 31 | 74 |\n| Kaolin | SQL | 56 | 144 |\n| Kaolin | Tuning | 88 | 144 |\n| Tatiana | SQL | 87 | 87 |\n+---------+--------+-------+-------------+\n\nURL: https://mariadb.com/kb/en/sum/','','https://mariadb.com/kb/en/sum/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (188,16,'VARIANCE','Syntax\n------\n\nVARIANCE(expr)\n\nDescription\n-----------\n\nReturns the population standard variance of expr. This is an extension to\nstandard SQL. The standard SQL function VAR_POP() can be used instead.\n\nVariance is calculated by\n\n* working out the mean for the set\n* for each number, subtracting the mean and squaring the result\n* calculate the average of the resulting differences\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nVARIANCE() can be used as a window function.\n\nVARIANCE() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nCREATE TABLE v(i tinyint);\n\nINSERT INTO v VALUES(101),(99);\n\nSELECT VARIANCE(i) FROM v;\n+-------------+\n| VARIANCE(i) |\n+-------------+\n| 1.0000 |\n+-------------+\n\nINSERT INTO v VALUES(120),(80);\n\nSELECT VARIANCE(i) FROM v;\n+-------------+\n| VARIANCE(i) |\n+-------------+\n| 200.5000 |\n+-------------+\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, VAR_POP(score) \n OVER (PARTITION BY test) AS variance_results FROM student_test;\n+---------+--------+-------+------------------+\n| name | test | score | variance_results |\n+---------+--------+-------+------------------+\n| Chun | SQL | 75 | 287.1875 |\n| Chun | Tuning | 73 | 582.0000 |\n| Esben | SQL | 43 | 287.1875 |\n| Esben | Tuning | 31 | 582.0000 |\n| Kaolin | SQL | 56 | 287.1875 |\n| Kaolin | Tuning | 88 | 582.0000 |\n| Tatiana | SQL | 87 | 287.1875 |\n+---------+--------+-------+------------------+\n\nURL: https://mariadb.com/kb/en/variance/','','https://mariadb.com/kb/en/variance/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (189,16,'VAR_POP','Syntax\n------\n\nVAR_POP(expr)\n\nDescription\n-----------\n\nReturns the population standard variance of expr. It considers rows as the\nwhole population, not as a sample, so it has the number of rows as the\ndenominator. You can also use VARIANCE(), which is equivalent but is not\nstandard SQL.\n\nVariance is calculated by\n\n* working out the mean for the set\n* for each number, subtracting the mean and squaring the result\n* calculate the average of the resulting differences\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nVAR_POP() can be used as a window function.\n\nVAR_POP() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nCREATE TABLE v(i tinyint);\n\nINSERT INTO v VALUES(101),(99);\n\nSELECT VAR_POP(i) FROM v;\n+------------+\n| VAR_POP(i) |\n+------------+\n| 1.0000 |\n+------------+\n\nINSERT INTO v VALUES(120),(80);\n\nSELECT VAR_POP(i) FROM v;\n+------------+\n| VAR_POP(i) |\n+------------+\n| 200.5000 |\n+------------+\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, VAR_POP(score) \n OVER (PARTITION BY test) AS variance_results FROM student_test;\n+---------+--------+-------+------------------+\n| name | test | score | variance_results |\n+---------+--------+-------+------------------+\n| Chun | SQL | 75 | 287.1875 |\n| Esben | SQL | 43 | 287.1875 |\n| Kaolin | SQL | 56 | 287.1875 |\n| Tatiana | SQL | 87 | 287.1875 |\n| Chun | Tuning | 73 | 582.0000 |\n| Esben | Tuning | 31 | 582.0000 |\n| Kaolin | Tuning | 88 | 582.0000 |\n+---------+--------+-------+------------------+\n\nURL: https://mariadb.com/kb/en/var_pop/','','https://mariadb.com/kb/en/var_pop/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (190,16,'VAR_SAMP','Syntax\n------\n\nVAR_SAMP(expr)\n\nDescription\n-----------\n\nReturns the sample variance of expr. That is, the denominator is the number of\nrows minus one.\n\nIt is an aggregate function, and so can be used with the GROUP BY clause.\n\nVAR_SAMP() can be used as a window function.\n\nVAR_SAMP() returns NULL if there were no matching rows.\n\nExamples\n--------\n\nAs an aggregate function:\n\nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n\nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n\nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n\nAs a window function:\n\nCREATE OR REPLACE TABLE student_test (name CHAR(10), test CHAR(10), score\nTINYINT);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, VAR_SAMP(score) \n OVER (PARTITION BY test) AS variance_results FROM student_test;\n+---------+--------+-------+------------------+\n| name | test | score | variance_results |\n+---------+--------+-------+------------------+\n| Chun | SQL | 75 | 382.9167 |\n| Chun | Tuning | 73 | 873.0000 |\n| Esben | SQL | 43 | 382.9167 |\n| Esben | Tuning | 31 | 873.0000 |\n| Kaolin | SQL | 56 | 382.9167 |\n| Kaolin | Tuning | 88 | 873.0000 |\n| Tatiana | SQL | 87 | 382.9167 |\n+---------+--------+-------+------------------+\n\nURL: https://mariadb.com/kb/en/var_samp/','','https://mariadb.com/kb/en/var_samp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (191,17,'BENCHMARK','Syntax\n------\n\nBENCHMARK(count,expr)\n\nDescription\n-----------\n\nThe BENCHMARK() function executes the expression expr repeatedly count times.\nIt may be used to time how quickly MariaDB processes the expression. The\nresult value is always 0. The intended use is from within the mysql client,\nwhich reports query execution times.\n\nExamples\n--------\n\nSELECT BENCHMARK(1000000,ENCODE(\'hello\',\'goodbye\'));\n+----------------------------------------------+\n| BENCHMARK(1000000,ENCODE(\'hello\',\'goodbye\')) |\n+----------------------------------------------+\n| 0 |\n+----------------------------------------------+\n1 row in set (0.21 sec)\n\nURL: https://mariadb.com/kb/en/benchmark/','','https://mariadb.com/kb/en/benchmark/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (192,17,'BINLOG_GTID_POS','Syntax\n------\n\nBINLOG_GTID_POS(binlog_filename,binlog_offset)\n\nDescription\n-----------\n\nThe BINLOG_GTID_POS() function takes as input an old-style binary log position\nin the form of a file name and a file offset. It looks up the position in the\ncurrent binlog, and returns a string representation of the corresponding GTID\nposition. If the position is not found in the current binlog, NULL is returned.\n\nExamples\n--------\n\nSELECT BINLOG_GTID_POS(\"master-bin.000001\", 600);\n\nURL: https://mariadb.com/kb/en/binlog_gtid_pos/','','https://mariadb.com/kb/en/binlog_gtid_pos/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (193,17,'CHARSET','Syntax\n------\n\nCHARSET(str)\n\nDescription\n-----------\n\nReturns the character set of the string argument. If str is not a string, it\nis considered as a binary string (so the function returns \'binary\'). This\napplies to NULL, too. The return value is a string in the utf8 character set.\n\nExamples\n--------\n\nSELECT CHARSET(\'abc\');\n+----------------+\n| CHARSET(\'abc\') |\n+----------------+\n| latin1 |\n+----------------+\n\nSELECT CHARSET(CONVERT(\'abc\' USING utf8));\n+------------------------------------+\n| CHARSET(CONVERT(\'abc\' USING utf8)) |\n+------------------------------------+\n| utf8 |\n+------------------------------------+\n\nSELECT CHARSET(USER());\n+-----------------+\n| CHARSET(USER()) |\n+-----------------+\n| utf8 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/charset/','','https://mariadb.com/kb/en/charset/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (194,17,'COERCIBILITY','Syntax\n------\n\nCOERCIBILITY(str)\n\nDescription\n-----------\n\nReturns the collation coercibility value of the string argument. Coercibility\ndefines what will be converted to what in case of collation conflict, with an\nexpression with higher coercibility being converted to the collation of an\nexpression with lower coercibility.\n\n+-----------------------------+---------------------------+------------------+\n| Coercibility | Description | Example |\n+-----------------------------+---------------------------+------------------+\n| 0 | Explicit | Value using a |\n| | | COLLATE clause |\n+-----------------------------+---------------------------+------------------+\n| 1 | No collation | Concatenated |\n| | | strings using |\n| | | different |\n| | | collations |\n+-----------------------------+---------------------------+------------------+\n| 2 | Implicit | Column value |\n+-----------------------------+---------------------------+------------------+\n| 3 | Constant | USER() return |\n| | | value |\n+-----------------------------+---------------------------+------------------+\n| 4 | Coercible | Literal string |\n+-----------------------------+---------------------------+------------------+\n| 5 | Ignorable | NULL or derived |\n| | | from NULL |\n+-----------------------------+---------------------------+------------------+\n\nExamples\n--------\n\nSELECT COERCIBILITY(\'abc\' COLLATE latin1_swedish_ci);\n+-----------------------------------------------+\n| COERCIBILITY(\'abc\' COLLATE latin1_swedish_ci) |\n+-----------------------------------------------+\n| 0 |\n+-----------------------------------------------+\n\nSELECT COERCIBILITY(USER());\n+----------------------+\n| COERCIBILITY(USER()) |\n+----------------------+\n| 3 |\n+----------------------+\n\nSELECT COERCIBILITY(\'abc\');\n+---------------------+\n| COERCIBILITY(\'abc\') |\n+---------------------+\n| 4 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/coercibility/','','https://mariadb.com/kb/en/coercibility/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (195,17,'COLLATION','Syntax\n------\n\nCOLLATION(str)\n\nDescription\n-----------\n\nReturns the collation of the string argument. If str is not a string, it is\nconsidered as a binary string (so the function returns \'binary\'). This applies\nto NULL, too. The return value is a string in the utf8 character set.\n\nSee Character Sets and Collations.\n\nExamples\n--------\n\nSELECT COLLATION(\'abc\');\n+-------------------+\n| COLLATION(\'abc\') |\n+-------------------+\n| latin1_swedish_ci |\n+-------------------+\n\nSELECT COLLATION(_utf8\'abc\');\n+-----------------------+\n| COLLATION(_utf8\'abc\') |\n+-----------------------+\n| utf8_general_ci |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/collation/','','https://mariadb.com/kb/en/collation/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (196,17,'CONNECTION_ID','Syntax\n------\n\nCONNECTION_ID()\n\nDescription\n-----------\n\nReturns the connection ID for the connection. Every connection (including\nevents) has an ID that is unique among the set of currently connected clients.\n\nUntil MariaDB 10.3.1, returns MYSQL_TYPE_LONGLONG, or bigint(10), in all\ncases. From MariaDB 10.3.1, returns MYSQL_TYPE_LONG, or int(10), when the\nresult would fit within 32-bits.\n\nExamples\n--------\n\nSELECT CONNECTION_ID();\n+-----------------+\n| CONNECTION_ID() |\n+-----------------+\n| 3 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/connection_id/','','https://mariadb.com/kb/en/connection_id/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (197,17,'CURRENT_ROLE','Syntax\n------\n\nCURRENT_ROLE, CURRENT_ROLE()\n\nDescription\n-----------\n\nReturns the current role name. This determines your access privileges. The\nreturn value is a string in the utf8 character set.\n\nIf there is no current role, NULL is returned.\n\nThe output of SELECT CURRENT_ROLE is equivalent to the contents of the\nENABLED_ROLES Information Schema table.\n\nUSER() returns the combination of user and host used to login. CURRENT_USER()\nreturns the account used to determine current connection\'s privileges.\n\nExamples\n--------\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n\nSET ROLE staff;\n\nSELECT CURRENT_ROLE;\n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| staff |\n+--------------+\n\nURL: https://mariadb.com/kb/en/current_role/','','https://mariadb.com/kb/en/current_role/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (198,17,'CURRENT_USER','Syntax\n------\n\nCURRENT_USER, CURRENT_USER()\n\nDescription\n-----------\n\nReturns the user name and host name combination for the MariaDB account that\nthe server used to authenticate the current client. This account determines\nyour access privileges. The return value is a string in the utf8 character set.\n\nThe value of CURRENT_USER() can differ from the value of USER().\nCURRENT_ROLE() returns the current active role.\n\nExamples\n--------\n\nshell> mysql --user=\"anonymous\"\n\nselect user(),current_user();\n+---------------------+----------------+\n| user() | current_user() |\n+---------------------+----------------+\n| anonymous@localhost | @localhost |\n+---------------------+----------------+\n\nWhen calling CURRENT_USER() in a stored procedure, it returns the owner of the\nstored procedure, as defined with DEFINER.\n\nURL: https://mariadb.com/kb/en/current_user/','','https://mariadb.com/kb/en/current_user/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (199,17,'DATABASE','Syntax\n------\n\nDATABASE()\n\nDescription\n-----------\n\nReturns the default (current) database name as a string in the utf8 character\nset. If there is no default database, DATABASE() returns NULL. Within a stored\nroutine, the default database is the database that the routine is associated\nwith, which is not necessarily the same as the database that is the default in\nthe calling context.\n\nSCHEMA() is a synonym for DATABASE().\n\nTo select a default database, the USE statement can be run. Another way to set\nthe default database is specifying its name at mysql command line client\nstartup.\n\nExamples\n--------\n\nSELECT DATABASE();\n+------------+\n| DATABASE() |\n+------------+\n| NULL |\n+------------+\n\nUSE test;\nDatabase changed\n\nSELECT DATABASE();\n+------------+\n| DATABASE() |\n+------------+\n| test |\n+------------+\n\nURL: https://mariadb.com/kb/en/database/','','https://mariadb.com/kb/en/database/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (200,17,'DECODE_HISTOGRAM','Syntax\n------\n\nDECODE_HISTOGRAM(hist_type,histogram)\n\nDescription\n-----------\n\nReturns a string of comma separated numeric values corresponding to a\nprobability distribution represented by the histogram of type hist_type\n(SINGLE_PREC_HB or DOUBLE_PREC_HB). The hist_type and histogram would be\ncommonly used from the mysql.column_stats table.\n\nSee Histogram Based Statistics for details.\n\nExamples\n--------\n\nCREATE TABLE origin (\n i INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n v INT UNSIGNED NOT NULL\n);\n\nINSERT INTO origin(v) VALUES \n (1),(2),(3),(4),(5),(10),(20),\n (30),(40),(50),(60),(70),(80),\n (90),(100),(200),(400),(800);\n\nSET histogram_size=10,histogram_type=SINGLE_PREC_HB;\n\nANALYZE TABLE origin PERSISTENT FOR ALL;\n+-------------+---------+----------+-----------------------------------------+\n| Table | Op | Msg_type | Msg_text |\n+-------------+---------+----------+-----------------------------------------+\n| test.origin | analyze | status | Engine-independent statistics collected |\n| test.origin | analyze | status | OK |\n+-------------+---------+----------+-----------------------------------------+\n\nSELECT db_name,table_name,column_name,hist_type,\n hex(histogram),decode_histogram(hist_type,histogram)\n FROM mysql.column_stats WHERE db_name=\'test\' and table_name=\'origin\';\n+---------+------------+-------------+----------------+----------------------+-\n-----------------------------------------------------------------+\n| db_name | table_name | column_name | hist_type | hex(histogram) |\ndecode_histogram(hist_type,histogram) |\n+---------+------------+-------------+----------------+----------------------+-\n-----------------------------------------------------------------+\n| test | origin | i | SINGLE_PREC_HB | 0F2D3C5A7887A5C3D2F0 |\n0.059,0.118,0.059,0.118,0.118,0.059,0.118,0.118,0.059,0.118,0.059 |\n| test | origin | v | SINGLE_PREC_HB | 000001060C0F161C1F7F |\n0.000,0.000,0.004,0.020,0.024,0.012,0.027,0.024,0.012,0.376,0.502 |\n+---------+------------+-------------+----------------+----------------------+-\n-----------------------------------------------------------------+\n\nSET histogram_size=20,histogram_type=DOUBLE_PREC_HB;\n\nANALYZE TABLE origin PERSISTENT FOR ALL;\n+-------------+---------+----------+-----------------------------------------+\n| Table | Op | Msg_type | Msg_text |\n+-------------+---------+----------+-----------------------------------------+\n| test.origin | analyze | status | Engine-independent statistics collected |\n| test.origin | analyze | status | OK |\n+-------------+---------+----------+-----------------------------------------+\n\nSELECT db_name,table_name,column_name,\n hist_type,hex(histogram),decode_histogram(hist_type,histogram)\n FROM mysql.column_stats WHERE db_name=\'test\' and table_name=\'origin\';\n+---------+------------+-------------+----------------+------------------------\n-----------------+-------------------------------------------------------------\n---------------------------+\n| db_name | table_name | column_name | hist_type | hex(histogram) \n | decode_histogram(hist_type,histogram)\n |\n+---------+------------+-------------+----------------+------------------------\n-----------------+-------------------------------------------------------------\n---------------------------+\n| test | origin | i | DOUBLE_PREC_HB |\n0F0F2D2D3C3C5A5A78788787A5A5C3C3D2D2F0F0 |\n0.05882,0.11765,0.05882,0.11765,0.11765,0.05882,0.11765,0.11765,0.05882,0.11765\n0.05882 |\n| test | origin | v | DOUBLE_PREC_HB |\n5200F600480116067E0CB30F1B16831CB81FD67F |\n0.00125,0.00250,0.00125,0.01877,0.02502,0.01253,0.02502,0.02502,0.01253,0.37546\n0.50063 |\n\nURL: https://mariadb.com/kb/en/decode_histogram/','','https://mariadb.com/kb/en/decode_histogram/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (201,17,'DEFAULT','Syntax\n------\n\nDEFAULT(col_name)\n\nDescription\n-----------\n\nReturns the default value for a table column. If the column has no default\nvalue (and is not NULLABLE - NULLABLE fields have a NULL default), an error is\nreturned.\n\nFor integer columns using AUTO_INCREMENT, 0 is returned.\n\nWhen using DEFAULT as a value to set in an INSERT or UPDATE statement, you can\nuse the bare keyword DEFAULT without the parentheses and argument to refer to\nthe column in context. You can only use DEFAULT as a bare keyword if you are\nusing it alone without a surrounding expression or function.\n\nExamples\n--------\n\nSelect only non-default values for a column:\n\nSELECT i FROM t WHERE i != DEFAULT(i);\n\nUpdate values to be one greater than the default value:\n\nUPDATE t SET i = DEFAULT(i)+1 WHERE i < 100;\n\nWhen referring to the default value exactly in UPDATE or INSERT, you can omit\nthe argument:\n\nINSERT INTO t (i) VALUES (DEFAULT);\nUPDATE t SET i = DEFAULT WHERE i < 100;\n\nCREATE OR REPLACE TABLE t (\n i INT NOT NULL AUTO_INCREMENT,\n j INT NOT NULL,\n k INT DEFAULT 3,\n l INT NOT NULL DEFAULT 4,\n m INT,\n PRIMARY KEY (i)\n);\n\nDESC t;\n+-------+---------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+----------------+\n| i | int(11) | NO | PRI | NULL | auto_increment |\n| j | int(11) | NO | | NULL | |\n| k | int(11) | YES | | 3 | |\n| l | int(11) | NO | | 4 | |\n| m | int(11) | YES | | NULL | |\n+-------+---------+------+-----+---------+----------------+\n\nINSERT INTO t (j) VALUES (1);\nINSERT INTO t (j,m) VALUES (2,2);\nINSERT INTO t (j,l,m) VALUES (3,3,3);\n\nSELECT * FROM t;\n+---+---+------+---+------+\n| i | j | k | l | m |\n+---+---+------+---+------+\n| 1 | 1 | 3 | 4 | NULL |\n| 2 | 2 | 3 | 4 | 2 |\n| 3 | 3 | 3 | 3 | 3 |\n+---+---+------+---+------+\n\nSELECT DEFAULT(i), DEFAULT(k), DEFAULT (l), DEFAULT(m) FROM t;\n+------------+------------+-------------+------------+\n| DEFAULT(i) | DEFAULT(k) | DEFAULT (l) | DEFAULT(m) |\n+------------+------------+-------------+------------+\n| 0 | 3 | 4 | NULL |\n| 0 | 3 | 4 | NULL |\n| 0 | 3 | 4 | NULL |\n+------------+------------+-------------+------------+\n\nSELECT DEFAULT(i), DEFAULT(k), DEFAULT (l), DEFAULT(m), DEFAULT(j) FROM t;\nERROR 1364 (HY000): Field \'j\' doesn\'t have a default value\n\nSELECT * FROM t WHERE i = DEFAULT(i);\nEmpty set (0.001 sec)\n\nSELECT * FROM t WHERE j = DEFAULT(j);\nERROR 1364 (HY000): Field \'j\' doesn\'t have a default value\n\nSELECT * FROM t WHERE k = DEFAULT(k);\n+---+---+------+---+------+\n| i | j | k | l | m |\n+---+---+------+---+------+\n| 1 | 1 | 3 | 4 | NULL |\n| 2 | 2 | 3 | 4 | 2 |\n| 3 | 3 | 3 | 3 | 3 |\n+---+---+------+---+------+\n\nSELECT * FROM t WHERE l = DEFAULT(l);\n+---+---+------+---+------+\n| i | j | k | l | m |\n+---+---+------+---+------+\n| 1 | 1 | 3 | 4 | NULL |\n| 2 | 2 | 3 | 4 | 2 |\n+---+---+------+---+------+\n\nSELECT * FROM t WHERE m = DEFAULT(m);\nEmpty set (0.001 sec)\n\nSELECT * FROM t WHERE m <=> DEFAULT(m);\n+---+---+------+---+------+\n| i | j | k | l | m |\n+---+---+------+---+------+\n| 1 | 1 | 3 | 4 | NULL |\n+---+---+------+---+------+\n\nURL: https://mariadb.com/kb/en/default/','','https://mariadb.com/kb/en/default/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (202,17,'FOUND_ROWS','Syntax\n------\n\nFOUND_ROWS()\n\nDescription\n-----------\n\nA SELECT statement may include a LIMIT clause to restrict the number of rows\nthe server returns to the client. In some cases, it is desirable to know how\nmany rows the statement would have returned without the LIMIT, but without\nrunning the statement again. To obtain this row count, include a\nSQL_CALC_FOUND_ROWS option in the SELECT statement, and then invoke\nFOUND_ROWS() afterwards.\n\nYou can also use FOUND_ROWS() to obtain the number of rows returned by a\nSELECT which does not contain a LIMIT clause. In this case you don\'t need to\nuse the SQL_CALC_FOUND_ROWS option. This can be useful for example in a stored\nprocedure.\n\nAlso, this function works with some other statements which return a resultset,\nincluding SHOW, DESC and HELP. For DELETE ... RETURNING you should use\nROW_COUNT(). It also works as a prepared statement, or after executing a\nprepared statement.\n\nStatements which don\'t return any results don\'t affect FOUND_ROWS() - the\nprevious value will still be returned.\n\nWarning: When used after a CALL statement, this function returns the number of\nrows selected by the last query in the procedure, not by the whole procedure.\n\nStatements using the FOUND_ROWS() function are not safe for replication.\n\nExamples\n--------\n\nSHOW ENGINES\\G\n*************************** 1. row ***************************\n Engine: CSV\n Support: YES\n Comment: Stores tables as CSV files\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 2. row ***************************\n Engine: MRG_MyISAM\n Support: YES\n Comment: Collection of identical MyISAM tables\nTransactions: NO\n XA: NO\n Savepoints: NO\n\n...\n\n*************************** 8. row ***************************\n Engine: PERFORMANCE_SCHEMA\n Support: YES\n Comment: Performance Schema\nTransactions: NO\n XA: NO\n Savepoints: NO\n8 rows in set (0.000 sec)\n\nSELECT FOUND_ROWS();\n+--------------+\n| FOUND_ROWS() |\n+--------------+\n| 8 |\n+--------------+\n\nSELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;\n\nSELECT FOUND_ROWS();\n+--------------+\n| FOUND_ROWS() |\n+--------------+\n| 23 |\n+--------------+\n\nURL: https://mariadb.com/kb/en/found_rows/','','https://mariadb.com/kb/en/found_rows/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (203,17,'LAST_INSERT_ID','Syntax\n------\n\nLAST_INSERT_ID(), LAST_INSERT_ID(expr)\n\nDescription\n-----------\n\nLAST_INSERT_ID() (no arguments) returns the first automatically generated\nvalue successfully inserted for an AUTO_INCREMENT column as a result of the\nmost recently executed INSERT statement. The value of LAST_INSERT_ID() remains\nunchanged if no rows are successfully inserted.\n\nIf one gives an argument to LAST_INSERT_ID(), then it will return the value of\nthe expression and the next call to LAST_INSERT_ID() will return the same\nvalue. The value will also be sent to the client and can be accessed by the\nmysql_insert_id function.\n\nFor example, after inserting a row that generates an AUTO_INCREMENT value, you\ncan get the value like this:\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 9 |\n+------------------+\n\nYou can also use LAST_INSERT_ID() to delete the last inserted row:\n\nDELETE FROM product WHERE id = LAST_INSERT_ID();\n\nIf no rows were successfully inserted, LAST_INSERT_ID() returns 0.\n\nThe value of LAST_INSERT_ID() will be consistent across all versions if all\nrows in the INSERT or UPDATE statement were successful.\n\nThe currently executing statement does not affect the value of\nLAST_INSERT_ID(). Suppose that you generate an AUTO_INCREMENT value with one\nstatement, and then refer to LAST_INSERT_ID() in a multiple-row INSERT\nstatement that inserts rows into a table with its own AUTO_INCREMENT column.\nThe value of LAST_INSERT_ID() will remain stable in the second statement; its\nvalue for the second and later rows is not affected by the earlier row\ninsertions. (However, if you mix references to LAST_INSERT_ID() and\nLAST_INSERT_ID(expr), the effect is undefined.)\n\nIf the previous statement returned an error, the value of LAST_INSERT_ID() is\nundefined. For transactional tables, if the statement is rolled back due to an\nerror, the value of LAST_INSERT_ID() is left undefined. For manual ROLLBACK,\nthe value of LAST_INSERT_ID() is not restored to that before the transaction;\nit remains as it was at the point of the ROLLBACK.\n\nWithin the body of a stored routine (procedure or function) or a trigger, the\nvalue of LAST_INSERT_ID() changes the same way as for statements executed\noutside the body of these kinds of objects. The effect of a stored routine or\ntrigger upon the value of LAST_INSERT_ID() that is seen by following\nstatements depends on the kind of routine:\n\n* If a stored procedure executes statements that change the value of\nLAST_INSERT_ID(), the new value will be seen by statements that follow the\nprocedure call.\n\n* For stored functions and triggers that change the value, the value is\nrestored when the function or trigger ends, so following statements will not\nsee a changed value.\n\nExamples\n--------\n\nCREATE TABLE t (\n id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n f VARCHAR(1))\nENGINE = InnoDB;\n\nINSERT INTO t(f) VALUES(\'a\');\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 1 |\n+------------------+\n\nINSERT INTO t(f) VALUES(\'b\');\n\nINSERT INTO t(f) VALUES(\'c\');\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 3 |\n+------------------+\n\nINSERT INTO t(f) VALUES(\'d\'),(\'e\');\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 4 |\n+------------------+\n\nSELECT * FROM t;\n+----+------+\n| id | f |\n+----+------+\n| 1 | a |\n| 2 | b |\n| 3 | c |\n| 4 | d |\n| 5 | e |\n+----+------+\n\nSELECT LAST_INSERT_ID(12);\n+--------------------+\n| LAST_INSERT_ID(12) |\n+--------------------+\n| 12 |\n+--------------------+\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 12 |\n+------------------+\n\nINSERT INTO t(f) VALUES(\'f\');\n\nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 6 |\n+------------------+\n\nSELECT * FROM t;\n+----+------+\n| id | f |\n+----+------+\n| 1 | a |\n| 2 | b |\n| 3 | c |\n| 4 | d |\n| 5 | e |\n| 6 | f |\n+----+------+\n\nSELECT LAST_INSERT_ID(12);\n+--------------------+\n| LAST_INSERT_ID(12) |\n+--------------------+\n| 12 |\n+--------------------+\n\nINSERT INTO t(f) VALUES(\'g\');\n\nSELECT * FROM t;\n+----+------+\n| id | f |\n+----+------+\n| 1 | a |\n| 2 | b |\n| 3 | c |\n| 4 | d |\n| 5 | e |\n| 6 | f |\n| 7 | g |\n+----+------+\n\nURL: https://mariadb.com/kb/en/last_insert_id/','','https://mariadb.com/kb/en/last_insert_id/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (204,17,'LAST_VALUE','Syntax\n------\n\nLAST_VALUE(expr,[expr,...])\n\nLAST_VALUE(expr) OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nLAST_VALUE() evaluates all expressions and returns the last.\n\nThis is useful together with setting user variables to a value with\n@var:=expr, for example when you want to get data of rows updated/deleted\nwithout having to do two queries against the table.\n\nLAST_VALUE can be used as a window function.\n\nReturns NULL if no last value exists.\n\nExamples\n--------\n\nCREATE TABLE t1 (a int, b int);\nINSERT INTO t1 VALUES(1,10),(2,20);\nDELETE FROM t1 WHERE a=1 AND last_value(@a:=a,@b:=b,1);\nSELECT @a,@b;\n+------+------+\n| @a | @b |\n+------+------+\n| 1 | 10 |\n+------+------+\n\nAs a window function:\n\nCREATE TABLE t1 (\n pk int primary key,\n a int,\n b int,\n c char(10),\n d decimal(10, 3),\n e real\n);\n\nINSERT INTO t1 VALUES\n( 1, 0, 1, \'one\', 0.1, 0.001),\n( 2, 0, 2, \'two\', 0.2, 0.002),\n( 3, 0, 3, \'three\', 0.3, 0.003),\n( 4, 1, 2, \'three\', 0.4, 0.004),\n( 5, 1, 1, \'two\', 0.5, 0.005),\n( 6, 1, 1, \'one\', 0.6, 0.006),\n( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n( 8, 2, 1, \'n_two\', NULL, 0.008),\n( 9, 2, 2, NULL, 0.7, 0.009),\n(10, 2, 0, \'n_four\', 0.8, 0.010),\n(11, 2, 10, NULL, 0.9, NULL);\n\nSELECT pk, FIRST_VALUE(pk) OVER (ORDER BY pk) AS first_asc,\n LAST_VALUE(pk) OVER (ORDER BY pk) AS last_asc,\n FIRST_VALUE(pk) OVER (ORDER BY pk DESC) AS first_desc,\n LAST_VALUE(pk) OVER (ORDER BY pk DESC) AS last_desc\nFROM t1\nORDER BY pk DESC;\n\n+----+-----------+----------+------------+-----------+\n| pk | first_asc | last_asc | first_desc | last_desc |\n+----+-----------+----------+------------+-----------+\n| 11 | 1 | 11 | 11 | 11 |\n| 10 | 1 | 10 | 11 | 10 |\n| 9 | 1 | 9 | 11 | 9 |\n| 8 | 1 | 8 | 11 | 8 |\n| 7 | 1 | 7 | 11 | 7 |\n| 6 | 1 | 6 | 11 | 6 |\n| 5 | 1 | 5 | 11 | 5 |\n| 4 | 1 | 4 | 11 | 4 |\n| 3 | 1 | 3 | 11 | 3 |\n| 2 | 1 | 2 | 11 | 2 |\n| 1 | 1 | 1 | 11 | 1 |\n+----+-----------+----------+------------+-----------+\n\nCREATE OR REPLACE TABLE t1 (i int);\nINSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);\n\nSELECT i,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and 1 FOLLOWING) AS\nf_1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and 1 FOLLOWING) AS\nl_1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\nf_1p1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\nf_1p1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) AS\nf_2p1p,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) AS\nf_2p1p,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING) AS\nf_1f2f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING) AS\nf_1f2f\nFROM t1;\n\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| i | f_1f | l_1f | f_1p1f | f_1p1f | f_2p1p | f_2p1p | f_1f2f | f_1f2f |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| 1 | 1 | 2 | 1 | 2 | NULL | NULL | 2 | 3 |\n| 2 | 2 | 3 | 1 | 3 | 1 | 1 | 3 | 4 |\n| 3 | 3 | 4 | 2 | 4 | 1 | 2 | 4 | 5 |\n| 4 | 4 | 5 | 3 | 5 | 2 | 3 | 5 | 6 |\n| 5 | 5 | 6 | 4 | 6 | 3 | 4 | 6 | 7 |\n| 6 | 6 | 7 | 5 | 7 | 4 | 5 | 7 | 8 |\n| 7 | 7 | 8 | 6 | 8 | 5 | 6 | 8 | 9 |\n| 8 | 8 | 9 | 7 | 9 | 6 | 7 | 9 | 10 |\n| 9 | 9 | 10 | 8 | 10 | 7 | 8 | 10 | 10 |\n| 10 | 10 | 10 | 9 | 10 | 8 | 9 | NULL | NULL |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n\nURL: https://mariadb.com/kb/en/last_value/','','https://mariadb.com/kb/en/last_value/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (205,17,'PROCEDURE ANALYSE','Syntax\n------\n\nanalyse([max_elements[,max_memory]])\n\nDescription\n-----------\n\nThis procedure is defined in the sql/sql_analyse.cc file. It examines the\nresult from a query and returns an analysis of the results that suggests\noptimal data types for each column. To obtain this analysis, append PROCEDURE\nANALYSE to the end of a SELECT statement:\n\nSELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max_elements,[max_memory]])\n\nFor example:\n\nSELECT col1, col2 FROM table1 PROCEDURE ANALYSE(10, 2000);\n\nThe results show some statistics for the values returned by the query, and\npropose an optimal data type for the columns. This can be helpful for checking\nyour existing tables, or after importing new data. You may need to try\ndifferent settings for the arguments so that PROCEDURE ANALYSE() does not\nsuggest the ENUM data type when it is not appropriate.\n\nThe arguments are optional and are used as follows:\n\n* max_elements (default 256) is the maximum number of distinct values that\nanalyse notices per column. This is used by analyse to check whether the\noptimal data type should be of type ENUM; if there are more than max_elements\ndistinct values, then ENUM is not a suggested type.\n* max_memory (default 8192) is the maximum amount of memory that analyse\nshould allocate per column while trying to find all distinct values.\n\nURL: https://mariadb.com/kb/en/procedure-analyse/','','https://mariadb.com/kb/en/procedure-analyse/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (206,17,'ROWNUM','MariaDB starting with 10.6.1\n----------------------------\nFrom MariaDB 10.6.1, the ROWNUM() function is supported.\n\nSyntax\n------\n\nROWNUM()\n\nIn Oracle mode one can just use ROWNUM, without the parentheses.\n\nDescription\n-----------\n\nROWNUM() returns the current number of accepted rows in the current context.\nIt main purpose is to emulate the ROWNUM pseudo column in Oracle. For MariaDB\nnative applications, we recommend the usage of LIMIT, as it is easier to use\nand gives more predictable results than the usage of ROWNUM().\n\nThe main difference between using LIMIT and ROWNUM() to limit the rows in the\nresult is that LIMIT works on the result set while ROWNUM works on the number\nof accepted rows (before any ORDER or GROUP BY clauses).\n\nThe following queries will return the same results:\n\nSELECT * from t1 LIMIT 10;\nSELECT * from t1 WHERE ROWNUM() <= 10;\n\nWhile the following may return different results based on in which orders the\nrows are found:\n\nSELECT * from t1 ORDER BY a LIMIT 10;\nSELECT * from t1 ORDER BY a WHERE ROWNUM() <= 10;\n\nThe recommended way to use ROWNUM to limit the number of returned rows and get\npredictable results is to have the query in a subquery and test for ROWNUM()\nin the outer query:\n\nSELECT * FROM (select * from t1 ORDER BY a) WHERE ROWNUM() <= 10;\n\nROWNUM() can be used in the following contexts:\n\n* SELECT\n* INSERT\n* UPDATE\n* DELETE\n* LOAD DATA INFILE\n\nUsed in other contexts, ROWNUM() will return 0.\n\nExamples\n--------\n\nINSERT INTO t1 VALUES (1,ROWNUM()),(2,ROWNUM()),(3,ROWNUM());\n\nINSERT INTO t1 VALUES (1),(2) returning a, ROWNUM();\n\nUPDATE t1 SET row_num_column=ROWNUM();\n\nDELETE FROM t1 WHERE a < 10 AND ROWNUM() < 2;\n\nLOAD DATA INFILE \'filename\' into table t1 fields terminated by \',\' \n lines terminated by \"\\r\\n\" (a,b) set c=ROWNUM();\n\nOptimizations\n-------------\n\nIn many cases where ROWNUM() is used, MariaDB will use the same optimizations\nit uses with LIMIT.\n\nLIMIT optimization is possible when using ROWNUM in the following manner:\n\n* When one is in a top level WHERE clause comparing ROWNUM() with a numerical\nconstant using any of the following expressions:\nROWNUM() < number\nROWNUM() <= number\nROWNUM() = 1\nROWNUM() can be also be the right argument to the comparison function.\n\nIn the above cases, LIMIT optimization can be done in the following cases:\n\n* For the current sub query when the ROWNUM comparison is done on the top\nlevel:\n\nSELECT * from t1 WHERE ROWNUM() <= 2 AND t1.a > 0\n\n* For an inner sub query, when the upper level has only a ROWNUM() comparison\nin the WHERE clause:\n\nSELECT * from (select * from t1) as t WHERE ROWNUM() <= 2\n\nOther Changes Related to ROWNUM\n-------------------------------\n\nWhen ROWNUM() is used anywhere in a query, the optimization to ignore ORDER BY\nin subqueries are disabled.\n\nThis was done to get the following common Oracle query to work as expected:\n\nselect * from (select * from t1 order by a desc) as t where rownum() <= 2;\n\nBy default MariaDB ignores any ORDER BY in subqueries both because the SQL\nstandard defines results sets in subqueries to be un-ordered and because of\nperformance reasons (especially when using views in subqueries). See MDEV-3926\n\"Wrong result with GROUP BY ... WITH ROLLUP\" for a discussion of this topic.\n\nOther Considerations\n--------------------\n\nWhile MariaDB tries to emulate Oracle\'s usage of ROWNUM() as closely as\npossible, there are cases where the result is different:\n\n* When the optimizer finds rows in a different order (because of different\nstorage methods or optimization). This may also happen in Oracle if one adds\nor deletes an index, in which case the rows may be found in a different order.\n\nNote that usage of ROWNUM() in functions or stored procedures will use their\nown context, not the caller\'s context.\n\nURL: https://mariadb.com/kb/en/rownum/','','https://mariadb.com/kb/en/rownum/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (207,17,'ROW_COUNT','Syntax\n------\n\nROW_COUNT()\n\nDescription\n-----------\n\nROW_COUNT() returns the number of rows updated, inserted or deleted by the\npreceding statement. This is the same as the row count that the mysql client\ndisplays and the value from the mysql_affected_rows() C API function.\n\nGenerally:\n\n* For statements which return a result set (such as SELECT, SHOW, DESC or\nHELP), returns -1, even when the result set is empty. This is also true for\nadministrative statements, such as OPTIMIZE.\n* For DML statements other than SELECT and for ALTER TABLE, returns the number\nof affected rows.\n* For DDL statements (including TRUNCATE) and for other statements which don\'t\nreturn any result set (such as USE, DO, SIGNAL or DEALLOCATE PREPARE), returns\n0.\n\nFor UPDATE, affected rows is by default the number of rows that were actually\nchanged. If the CLIENT_FOUND_ROWS flag to mysql_real_connect() is specified\nwhen connecting to mysqld, affected rows is instead the number of rows matched\nby the WHERE clause.\n\nFor REPLACE, deleted rows are also counted. So, if REPLACE deletes a row and\nadds a new row, ROW_COUNT() returns 2.\n\nFor INSERT ... ON DUPLICATE KEY, updated rows are counted twice. So, if INSERT\nadds a new rows and modifies another row, ROW_COUNT() returns 3.\n\nROW_COUNT() does not take into account rows that are not directly\ndeleted/updated by the last statement. This means that rows deleted by foreign\nkeys or triggers are not counted.\n\nWarning: You can use ROW_COUNT() with prepared statements, but you need to\ncall it after EXECUTE, not after DEALLOCATE PREPARE, because the row count for\nallocate prepare is always 0.\n\nWarning: When used after a CALL statement, this function returns the number of\nrows affected by the last statement in the procedure, not by the whole\nprocedure.\n\nWarning: After INSERT DELAYED, ROW_COUNT() returns the number of the rows you\ntried to insert, not the number of the successful writes.\n\nThis information can also be found in the diagnostics area.\n\nStatements using the ROW_COUNT() function are not safe for replication.\n\nExamples\n--------\n\nCREATE TABLE t (A INT);\n\nINSERT INTO t VALUES(1),(2),(3);\n\nSELECT ROW_COUNT();\n+-------------+\n| ROW_COUNT() |\n+-------------+\n| 3 |\n+-------------+\n\nDELETE FROM t WHERE A IN(1,2);\n\nSELECT ROW_COUNT(); \n+-------------+\n| ROW_COUNT() |\n+-------------+\n| 2 |\n+-------------+\n\nExample with prepared statements:\n\nSET @q = \'INSERT INTO t VALUES(1),(2),(3);\';\n\nPREPARE stmt FROM @q;\n\nEXECUTE stmt;\nQuery OK, 3 rows affected (0.39 sec)\nRecords: 3 Duplicates: 0 Warnings: 0\n\nSELECT ROW_COUNT();\n+-------------+\n| ROW_COUNT() |\n+-------------+\n| 3 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/row_count/','','https://mariadb.com/kb/en/row_count/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (208,17,'SCHEMA','Syntax\n------\n\nSCHEMA()\n\nDescription\n-----------\n\nThis function is a synonym for DATABASE().\n\nURL: https://mariadb.com/kb/en/schema/','','https://mariadb.com/kb/en/schema/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (209,17,'SESSION_USER','Syntax\n------\n\nSESSION_USER()\n\nDescription\n-----------\n\nSESSION_USER() is a synonym for USER().\n\nURL: https://mariadb.com/kb/en/session_user/','','https://mariadb.com/kb/en/session_user/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (210,17,'SYSTEM_USER','Syntax\n------\n\nSYSTEM_USER()\n\nDescription\n-----------\n\nSYSTEM_USER() is a synonym for USER().\n\nURL: https://mariadb.com/kb/en/system_user/','','https://mariadb.com/kb/en/system_user/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (211,17,'USER','Syntax\n------\n\nUSER()\n\nDescription\n-----------\n\nReturns the current MariaDB user name and host name, given when authenticating\nto MariaDB, as a string in the utf8 character set.\n\nNote that the value of USER() may differ from the value of CURRENT_USER(),\nwhich is the user used to authenticate the current client. CURRENT_ROLE()\nreturns the current active role.\n\nSYSTEM_USER() and SESSION_USER are synonyms for USER().\n\nStatements using the USER() function or one of its synonyms are not safe for\nstatement level replication.\n\nExamples\n--------\n\nshell> mysql --user=\"anonymous\"\n\nSELECT USER(),CURRENT_USER();\n+---------------------+----------------+\n| USER() | CURRENT_USER() |\n+---------------------+----------------+\n| anonymous@localhost | @localhost |\n+---------------------+----------------+\n\nTo select only the IP address, use SUBSTRING_INDEX(),\n\nSELECT SUBSTRING_INDEX(USER(), \'@\', -1);\n+----------------------------------+\n| SUBSTRING_INDEX(USER(), \'@\', -1) |\n+----------------------------------+\n| 192.168.0.101 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/user/','','https://mariadb.com/kb/en/user/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (212,17,'VERSION','Syntax\n------\n\nVERSION()\n\nDescription\n-----------\n\nReturns a string that indicates the MariaDB server version. The string uses\nthe utf8 character set.\n\nExamples\n--------\n\nSELECT VERSION();\n+----------------+\n| VERSION() |\n+----------------+\n| 10.4.7-MariaDB |\n+----------------+\n\nThe VERSION() string may have one or more of the following suffixes:\n\n+---------------------------+------------------------------------------------+\n| Suffix | Description |\n+---------------------------+------------------------------------------------+\n| -embedded | The server is an embedded server (libmysqld). |\n+---------------------------+------------------------------------------------+\n| -log | General logging, slow logging or binary |\n| | (replication) logging is enabled. |\n+---------------------------+------------------------------------------------+\n| -debug | The server is compiled for debugging. |\n+---------------------------+------------------------------------------------+\n| -valgrind | The server is compiled to be instrumented |\n| | with valgrind. |\n+---------------------------+------------------------------------------------+\n\nChanging the Version String\n---------------------------\n\nSome old legacy code may break because they are parsing the VERSION string and\nexpecting a MySQL string or a simple version string like Joomla til API17, see\nMDEV-7780.\n\nFrom MariaDB 10.2, one can fool these applications by setting the version\nstring from the command line or the my.cnf files with --version=....\n\nURL: https://mariadb.com/kb/en/version/','','https://mariadb.com/kb/en/version/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (213,18,'Assignment Operator (:=)','Syntax\n------\n\nvar_name := expr\n\nDescription\n-----------\n\nAssignment operator for assigning a value. The value on the right is assigned\nto the variable on left.\n\nUnlike the = operator, := can always be used to assign a value to a variable.\n\nThis operator works with both user-defined variables and local variables.\n\nWhen assigning the same value to several variables, LAST_VALUE() can be useful.\n\nExamples\n--------\n\nSELECT @x := 10;\n+----------+\n| @x := 10 |\n+----------+\n| 10 |\n+----------+\n\nSELECT @x, @y := @x;\n+------+----------+\n| @x | @y := @x |\n+------+----------+\n| 10 | 10 |\n+------+----------+\n\nURL: https://mariadb.com/kb/en/assignment-operator/','','https://mariadb.com/kb/en/assignment-operator/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (214,18,'Assignment Operator (=)','Syntax\n------\n\nidentifier = expr\n\nDescription\n-----------\n\nThe equal sign is used as both an assignment operator in certain contexts, and\nas a comparison operator. When used as assignment operator, the value on the\nright is assigned to the variable (or column, in some contexts) on the left.\n\nSince its use can be ambiguous, unlike the := assignment operator, the =\nassignment operator cannot be used in all contexts, and is only valid as part\nof a SET statement, or the SET clause of an UPDATE statement\n\nThis operator works with both user-defined variables and local variables.\n\nExamples\n--------\n\nUPDATE table_name SET x = 2 WHERE x > 100;\n\nSET @x = 1, @y := 2;\n\nURL: https://mariadb.com/kb/en/assignment-operators-assignment-operator/','','https://mariadb.com/kb/en/assignment-operators-assignment-operator/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (215,19,'Not Equal Operator','Syntax\n------\n\n<>, !=\n\nDescription\n-----------\n\nNot equal operator. Evaluates both SQL expressions and returns 1 if they are\nnot equal and 0 if they are equal, or NULL if either expression is NULL. If\nthe expressions return different data types, (for instance, a number and a\nstring), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) != (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a != t2.x) OR (t1.b != t2.y)\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT \'.01\' <> \'0.01\';\n+-----------------+\n| \'.01\' <> \'0.01\' |\n+-----------------+\n| 1 |\n+-----------------+\n\nSELECT .01 <> \'0.01\';\n+---------------+\n| .01 <> \'0.01\' |\n+---------------+\n| 0 |\n+---------------+\n\nSELECT \'zapp\' <> \'zappp\';\n+-------------------+\n| \'zapp\' <> \'zappp\' |\n+-------------------+\n| 1 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/not-equal/','','https://mariadb.com/kb/en/not-equal/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (216,19,'<','Syntax\n------\n\n<\n\nDescription\n-----------\n\nLess than operator. Evaluates both SQL expressions and returns 1 if the left\nvalue is less than the right value and 0 if it is not, or NULL if either\nexpression is NULL. If the expressions return different data types, (for\ninstance, a number and a string), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) < (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a < t2.x) OR ((t1.a = t2.x) AND (t1.b < t2.y))\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT 2 < 2;\n+-------+\n| 2 < 2 |\n+-------+\n| 0 |\n+-------+\n\nType conversion:\n\nSELECT 3<\'4\';\n+-------+\n| 3<\'4\' |\n+-------+\n| 1 |\n+-------+\n\nCase insensitivity - see Character Sets and Collations:\n\nSELECT \'a\'<\'A\';\n+---------+\n| \'a\'<\'A\' |\n+---------+\n| 0 |\n+---------+\n\nURL: https://mariadb.com/kb/en/less-than/','','https://mariadb.com/kb/en/less-than/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (217,19,'<=','Syntax\n------\n\n<=\n\nDescription\n-----------\n\nLess than or equal operator. Evaluates both SQL expressions and returns 1 if\nthe left value is less than or equal to the right value and 0 if it is not, or\nNULL if either expression is NULL. If the expressions return different data\ntypes, (for instance, a number and a string), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) <= (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a < t2.x) OR ((t1.a = t2.x) AND (t1.b <= t2.y))\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT 0.1 <= 2;\n+----------+\n| 0.1 <= 2 |\n+----------+\n| 1 |\n+----------+\n\nSELECT \'a\'<=\'A\';\n+----------+\n| \'a\'<=\'A\' |\n+----------+\n| 1 |\n+----------+\n\nURL: https://mariadb.com/kb/en/less-than-or-equal/','','https://mariadb.com/kb/en/less-than-or-equal/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (218,19,'<=>','Syntax\n------\n\n<=>\n\nDescription\n-----------\n\nNULL-safe equal operator. It performs an equality comparison like the =\noperator, but returns 1 rather than NULL if both operands are NULL, and 0\nrather than NULL if one operand is NULL.\n\na <=> b is equivalent to a = b OR (a IS NULL AND b IS NULL).\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) <=> (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a <=> t2.x) AND (t1.b <=> t2.y)\nFROM t1 INNER JOIN t2;\n\nSee also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;\n+---------+---------------+------------+\n| 1 <=> 1 | NULL <=> NULL | 1 <=> NULL |\n+---------+---------------+------------+\n| 1 | 1 | 0 |\n+---------+---------------+------------+\n\nSELECT 1 = 1, NULL = NULL, 1 = NULL;\n+-------+-------------+----------+\n| 1 = 1 | NULL = NULL | 1 = NULL |\n+-------+-------------+----------+\n| 1 | NULL | NULL |\n+-------+-------------+----------+\n\nURL: https://mariadb.com/kb/en/null-safe-equal/','','https://mariadb.com/kb/en/null-safe-equal/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (219,19,'=','Syntax\n------\n\nleft_expr = right_expr\n\nDescription\n-----------\n\nEqual operator. Evaluates both SQL expressions and returns 1 if they are\nequal, 0 if they are not equal, or NULL if either expression is NULL. If the\nexpressions return different data types (for example, a number and a string),\na type conversion is performed.\n\nWhen used in row comparisons these two queries are synonymous and return the\nsame results:\n\nSELECT (t1.a, t1.b) = (t2.x, t2.y) FROM t1 INNER JOIN t2;\n\nSELECT (t1.a = t2.x) AND (t1.b = t2.y) FROM t1 INNER JOIN t2;\n\nTo perform a NULL-safe comparison, use the <=> operator.\n\n= can also be used as an assignment operator.\n\nExamples\n--------\n\nSELECT 1 = 0;\n+-------+\n| 1 = 0 |\n+-------+\n| 0 |\n+-------+\n\nSELECT \'0\' = 0;\n+---------+\n| \'0\' = 0 |\n+---------+\n| 1 |\n+---------+\n\nSELECT \'0.0\' = 0;\n+-----------+\n| \'0.0\' = 0 |\n+-----------+\n| 1 |\n+-----------+\n\nSELECT \'0.01\' = 0;\n+------------+\n| \'0.01\' = 0 |\n+------------+\n| 0 |\n+------------+\n\nSELECT \'.01\' = 0.01;\n+--------------+\n| \'.01\' = 0.01 |\n+--------------+\n| 1 |\n+--------------+\n\nSELECT (5 * 2) = CONCAT(\'1\', \'0\');\n+----------------------------+\n| (5 * 2) = CONCAT(\'1\', \'0\') |\n+----------------------------+\n| 1 |\n+----------------------------+\n\nSELECT 1 = NULL;\n+----------+\n| 1 = NULL |\n+----------+\n| NULL |\n+----------+\n\nSELECT NULL = NULL;\n+-------------+\n| NULL = NULL |\n+-------------+\n| NULL |\n+-------------+\n\nURL: https://mariadb.com/kb/en/equal/','','https://mariadb.com/kb/en/equal/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (220,19,'>','Syntax\n------\n\n>\n\nDescription\n-----------\n\nGreater than operator. Evaluates both SQL expressions and returns 1 if the\nleft value is greater than the right value and 0 if it is not, or NULL if\neither expression is NULL. If the expressions return different data types,\n(for instance, a number and a string), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) > (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a > t2.x) OR ((t1.a = t2.x) AND (t1.b > t2.y))\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT 2 > 2;\n+-------+\n| 2 > 2 |\n+-------+\n| 0 |\n+-------+\n\nSELECT \'b\' > \'a\';\n+-----------+\n| \'b\' > \'a\' |\n+-----------+\n| 1 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/greater-than/','','https://mariadb.com/kb/en/greater-than/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (221,19,'>=','Syntax\n------\n\n>=\n\nDescription\n-----------\n\nGreater than or equal operator. Evaluates both SQL expressions and returns 1\nif the left value is greater than or equal to the right value and 0 if it is\nnot, or NULL if either expression is NULL. If the expressions return different\ndata types, (for instance, a number and a string), performs type conversion.\n\nWhen used in row comparisons these two queries return the same results:\n\nSELECT (t1.a, t1.b) >= (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n\nSELECT (t1.a > t2.x) OR ((t1.a = t2.x) AND (t1.b >= t2.y))\nFROM t1 INNER JOIN t2;\n\nExamples\n--------\n\nSELECT 2 >= 2;\n+--------+\n| 2 >= 2 |\n+--------+\n| 1 |\n+--------+\n\nSELECT \'A\' >= \'a\';\n+------------+\n| \'A\' >= \'a\' |\n+------------+\n| 1 |\n+------------+\n\nURL: https://mariadb.com/kb/en/greater-than-or-equal/','','https://mariadb.com/kb/en/greater-than-or-equal/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (222,19,'BETWEEN AND','Syntax\n------\n\nexpr BETWEEN min AND max\n\nDescription\n-----------\n\nIf expr is greater than or equal to min and expr is less than or equal to max,\nBETWEEN returns 1, otherwise it returns 0. This is equivalent to the\nexpression (min <= expr AND expr <= max) if all the arguments are of the same\ntype. Otherwise type conversion takes place according to the rules described\nat Type Conversion, but applied to all the three arguments.\n\nExamples\n--------\n\nSELECT 1 BETWEEN 2 AND 3;\n+-------------------+\n| 1 BETWEEN 2 AND 3 |\n+-------------------+\n| 0 |\n+-------------------+\n\nSELECT \'b\' BETWEEN \'a\' AND \'c\';\n+-------------------------+\n| \'b\' BETWEEN \'a\' AND \'c\' |\n+-------------------------+\n| 1 |\n+-------------------------+\n\nSELECT 2 BETWEEN 2 AND \'3\';\n+---------------------+\n| 2 BETWEEN 2 AND \'3\' |\n+---------------------+\n| 1 |\n+---------------------+\n\nSELECT 2 BETWEEN 2 AND \'x-3\';\n+-----------------------+\n| 2 BETWEEN 2 AND \'x-3\' |\n+-----------------------+\n| 0 |\n+-----------------------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect DOUBLE value: \'x-3\'\n\nNULL:\n\nSELECT 1 BETWEEN 1 AND NULL;\n+----------------------+\n| 1 BETWEEN 1 AND NULL |\n+----------------------+\n| NULL |\n+----------------------+\n\nDATE, DATETIME and TIMESTAMP examples. Omitting the time component compares\nagainst 00:00, so later times on the same date are not returned:\n\nCREATE TABLE `x` (\n a date ,\n b datetime,\n c timestamp\n)\n\nINSERT INTO x VALUES \n (\'2018-11-11\', \'2018-11-11 05:15\', \'2018-11-11 05:15\'), \n (\'2018-11-12\', \'2018-11-12 05:15\', \'2018-11-12 05:15\');\n\nSELECT * FROM x WHERE a BETWEEN \'2018-11-11\' AND \'2018-11-12\';\n+------------+---------------------+---------------------+\n| a | b | c |\n+------------+---------------------+---------------------+\n| 2018-11-11 | 2018-11-11 05:15:00 | 2018-11-11 05:15:00 |\n| 2018-11-12 | 2018-11-12 05:15:00 | 2018-11-12 05:15:00 |\n+------------+---------------------+---------------------+\n\nSELECT * FROM x WHERE b BETWEEN \'2018-11-11\' AND \'2018-11-12\';\n+------------+---------------------+---------------------+\n| a | b | c |\n+------------+---------------------+---------------------+\n| 2018-11-11 | 2018-11-11 05:15:00 | 2018-11-11 05:15:00 |\n+------------+---------------------+---------------------+\n\nSELECT * FROM x WHERE c BETWEEN \'2018-11-11\' AND \'2018-11-12\';\n+------------+---------------------+---------------------+\n| a | b | c |\n+------------+---------------------+---------------------+\n| 2018-11-11 | 2018-11-11 05:15:00 | 2018-11-11 05:15:00 |\n+------------+---------------------+---------------------+\n\nURL: https://mariadb.com/kb/en/between-and/','','https://mariadb.com/kb/en/between-and/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (223,19,'COALESCE','Syntax\n------\n\nCOALESCE(value,...)\n\nDescription\n-----------\n\nReturns the first non-NULL value in the list, or NULL if there are no non-NULL\nvalues. At least one parameter must be passed.\n\nThe function is useful when substituting a default value for null values when\ndisplaying data.\n\nSee also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT COALESCE(NULL,1);\n+------------------+\n| COALESCE(NULL,1) |\n+------------------+\n| 1 |\n+------------------+\n\nSELECT COALESCE(NULL,NULL,NULL);\n+--------------------------+\n| COALESCE(NULL,NULL,NULL) |\n+--------------------------+\n| NULL |\n+--------------------------+\n\nWhen two arguments are given, COALESCE() is the same as IFNULL():\n\nSET @a=NULL, @b=1;\n\nSELECT COALESCE(@a, @b), IFNULL(@a, @b);\n+------------------+----------------+\n| COALESCE(@a, @b) | IFNULL(@a, @b) |\n+------------------+----------------+\n| 1 | 1 |\n+------------------+----------------+\n\nHex type confusion:\n\nCREATE TABLE t1 (a INT, b VARCHAR(10));\nINSERT INTO t1 VALUES (0x31, 0x61),(COALESCE(0x31), COALESCE(0x61));\n\nSELECT * FROM t1;\n+------+------+\n| a | b |\n+------+------+\n| 49 | a |\n| 1 | a |\n+------+------+\n\nThe reason for the differing results above is that when 0x31 is inserted\ndirectly to the column, it\'s treated as a number (see Hexadecimal Literals),\nwhile when 0x31 is passed to COALESCE(), it\'s treated as a string, because:\n\n* HEX values have a string data type by default.\n* COALESCE() has the same data type as the argument.\n\nSubstituting zero for NULL (in this case when the aggregate function returns\nNULL after finding no rows):\n\nSELECT SUM(score) FROM student;\n+------------+\n| SUM(score) |\n+------------+\n| NULL |\n+------------+\n\nSELECT COALESCE(SUM(score),0) FROM student;\n+------------------------+\n| COALESCE(SUM(score),0) |\n+------------------------+\n| 0 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/coalesce/','','https://mariadb.com/kb/en/coalesce/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (224,19,'GREATEST','Syntax\n------\n\nGREATEST(value1,value2,...)\n\nDescription\n-----------\n\nWith two or more arguments, returns the largest (maximum-valued) argument. The\narguments are compared using the same rules as for LEAST().\n\nExamples\n--------\n\nSELECT GREATEST(2,0);\n+---------------+\n| GREATEST(2,0) |\n+---------------+\n| 2 |\n+---------------+\n\nSELECT GREATEST(34.0,3.0,5.0,767.0);\n+------------------------------+\n| GREATEST(34.0,3.0,5.0,767.0) |\n+------------------------------+\n| 767.0 |\n+------------------------------+\n\nSELECT GREATEST(\'B\',\'A\',\'C\');\n+-----------------------+\n| GREATEST(\'B\',\'A\',\'C\') |\n+-----------------------+\n| C |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/greatest/','','https://mariadb.com/kb/en/greatest/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (225,19,'IN','Syntax\n------\n\nexpr IN (value,...)\n\nDescription\n-----------\n\nReturns 1 if expr is equal to any of the values in the IN list, else returns\n0. If all values are constants, they are evaluated according to the type of\nexpr and sorted. The search for the item then is done using a binary search.\nThis means IN is very quick if the IN value list consists entirely of\nconstants. Otherwise, type conversion takes place according to the rules\ndescribed at Type Conversion, but applied to all the arguments.\n\nIf expr is NULL, IN always returns NULL. If at least one of the values in the\nlist is NULL, and one of the comparisons is true, the result is 1. If at least\none of the values in the list is NULL and none of the comparisons is true, the\nresult is NULL.\n\nExamples\n--------\n\nSELECT 2 IN (0,3,5,7);\n+----------------+\n| 2 IN (0,3,5,7) |\n+----------------+\n| 0 |\n+----------------+\n\nSELECT \'wefwf\' IN (\'wee\',\'wefwf\',\'weg\');\n+----------------------------------+\n| \'wefwf\' IN (\'wee\',\'wefwf\',\'weg\') |\n+----------------------------------+\n| 1 |\n+----------------------------------+\n\nType conversion:\n\nSELECT 1 IN (\'1\', \'2\', \'3\');\n+----------------------+\n| 1 IN (\'1\', \'2\', \'3\') |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT NULL IN (1, 2, 3);\n+-------------------+\n| NULL IN (1, 2, 3) |\n+-------------------+\n| NULL |\n+-------------------+\n\nSELECT 1 IN (1, 2, NULL);\n+-------------------+\n| 1 IN (1, 2, NULL) |\n+-------------------+\n| 1 |\n+-------------------+\n\nSELECT 5 IN (1, 2, NULL);\n+-------------------+\n| 5 IN (1, 2, NULL) |\n+-------------------+\n| NULL |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/in/','','https://mariadb.com/kb/en/in/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (226,19,'INTERVAL','Syntax\n------\n\nINTERVAL(N,N1,N2,N3,...)\n\nDescription\n-----------\n\nReturns the index of the last argument that is less than the first argument or\nis NULL.\n\nReturns 0 if N < N1, 1 if N < N2, 2 if N < N3 and so on or -1 if N is NULL.\nAll arguments are treated as integers. It is required that N1 < N2 < N3 < ...\n< Nn for this function to work correctly. This is because a fast binary search\nis used.\n\nExamples\n--------\n\nSELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);\n+--------------------------------------+\n| INTERVAL(23, 1, 15, 17, 30, 44, 200) |\n+--------------------------------------+\n| 3 |\n+--------------------------------------+\n\nSELECT INTERVAL(10, 1, 10, 100, 1000);\n+--------------------------------+\n| INTERVAL(10, 1, 10, 100, 1000) |\n+--------------------------------+\n| 2 |\n+--------------------------------+\n\nSELECT INTERVAL(22, 23, 30, 44, 200);\n+-------------------------------+\n| INTERVAL(22, 23, 30, 44, 200) |\n+-------------------------------+\n| 0 |\n+-------------------------------+\n\nSELECT INTERVAL(10, 2, NULL);\n+-----------------------+\n| INTERVAL(10, 2, NULL) |\n+-----------------------+\n| 2 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/interval/','','https://mariadb.com/kb/en/interval/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (227,19,'IS','Syntax\n------\n\nIS boolean_value\n\nDescription\n-----------\n\nTests a value against a boolean value, where boolean_value can be TRUE, FALSE,\nor UNKNOWN.\n\nThere is an important difference between using IS TRUE or comparing a value\nwith TRUE using =. When using =, only 1 equals to TRUE. But when using IS\nTRUE, all values which are logically true (like a number > 1) return TRUE.\n\nExamples\n--------\n\nSELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;\n+-----------+------------+-----------------+\n| 1 IS TRUE | 0 IS FALSE | NULL IS UNKNOWN |\n+-----------+------------+-----------------+\n| 1 | 1 | 1 |\n+-----------+------------+-----------------+\n\nDifference between = and IS TRUE:\n\nSELECT 2 = TRUE, 2 IS TRUE;\n+----------+-----------+\n| 2 = TRUE | 2 IS TRUE |\n+----------+-----------+\n| 0 | 1 |\n+----------+-----------+\n\nURL: https://mariadb.com/kb/en/is/','','https://mariadb.com/kb/en/is/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (228,19,'IS NOT','Syntax\n------\n\nIS NOT boolean_value\n\nDescription\n-----------\n\nTests a value against a boolean value, where boolean_value can be TRUE, FALSE,\nor UNKNOWN.\n\nExamples\n--------\n\nSELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;\n+------------------+------------------+---------------------+\n| 1 IS NOT UNKNOWN | 0 IS NOT UNKNOWN | NULL IS NOT UNKNOWN |\n+------------------+------------------+---------------------+\n| 1 | 1 | 0 |\n+------------------+------------------+---------------------+\n\nSELECT NULL IS NOT TRUE, NULL IS NOT FALSE;\n+------------------+-------------------+\n| NULL IS NOT TRUE | NULL IS NOT FALSE |\n+------------------+-------------------+\n| 1 | 1 |\n+------------------+-------------------+\n\nURL: https://mariadb.com/kb/en/is-not/','','https://mariadb.com/kb/en/is-not/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (229,19,'IS NOT NULL','Syntax\n------\n\nIS NOT NULL\n\nDescription\n-----------\n\nTests whether a value is not NULL. See also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;\n+---------------+---------------+------------------+\n| 1 IS NOT NULL | 0 IS NOT NULL | NULL IS NOT NULL |\n+---------------+---------------+------------------+\n| 1 | 1 | 0 |\n+---------------+---------------+------------------+\n\nURL: https://mariadb.com/kb/en/is-not-null/','','https://mariadb.com/kb/en/is-not-null/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (230,19,'IS NULL','Syntax\n------\n\nIS NULL\n\nDescription\n-----------\n\nTests whether a value is NULL. See also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;\n+-----------+-----------+--------------+\n| 1 IS NULL | 0 IS NULL | NULL IS NULL |\n+-----------+-----------+--------------+\n| 0 | 0 | 1 |\n+-----------+-----------+--------------+\n\nCompatibility\n-------------\n\nSome ODBC applications use the syntax auto_increment_field IS NOT NULL to find\nthe latest row that was inserted with an autogenerated key value. If your\napplications need this, you can set the sql_auto_is_null variable to 1.\n\nSET @@sql_auto_is_null=1;\nCREATE TABLE t1 (auto_increment_column INT NOT NULL AUTO_INCREMENT PRIMARY\nKEY);\nINSERT INTO t1 VALUES (NULL);\nSELECT * FROM t1 WHERE auto_increment_column IS NULL;\n\n+-----------------------+\n| auto_increment_column |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/is-null/','','https://mariadb.com/kb/en/is-null/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (231,19,'ISNULL','Syntax\n------\n\nISNULL(expr)\n\nDescription\n-----------\n\nIf expr is NULL, ISNULL() returns 1, otherwise it returns 0.\n\nSee also NULL Values in MariaDB.\n\nExamples\n--------\n\nSELECT ISNULL(1+1);\n+-------------+\n| ISNULL(1+1) |\n+-------------+\n| 0 |\n+-------------+\n\nSELECT ISNULL(1/0);\n+-------------+\n| ISNULL(1/0) |\n+-------------+\n| 1 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/isnull/','','https://mariadb.com/kb/en/isnull/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (232,19,'LEAST','Syntax\n------\n\nLEAST(value1,value2,...)\n\nDescription\n-----------\n\nWith two or more arguments, returns the smallest (minimum-valued) argument.\nThe arguments are compared using the following rules:\n\n* If the return value is used in an INTEGER context or all arguments are\ninteger-valued, they are compared as integers.\n* If the return value is used in a REAL context or all arguments are\nreal-valued, they are compared as reals.\n* If any argument is a case-sensitive string, the arguments are compared as\ncase-sensitive strings.\n* In all other cases, the arguments are compared as case-insensitive strings.\n\nLEAST() returns NULL if any argument is NULL.\n\nExamples\n--------\n\nSELECT LEAST(2,0);\n+------------+\n| LEAST(2,0) |\n+------------+\n| 0 |\n+------------+\n\nSELECT LEAST(34.0,3.0,5.0,767.0);\n+---------------------------+\n| LEAST(34.0,3.0,5.0,767.0) |\n+---------------------------+\n| 3.0 |\n+---------------------------+\n\nSELECT LEAST(\'B\',\'A\',\'C\');\n+--------------------+\n| LEAST(\'B\',\'A\',\'C\') |\n+--------------------+\n| A |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/least/','','https://mariadb.com/kb/en/least/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (233,19,'NOT BETWEEN','Syntax\n------\n\nexpr NOT BETWEEN min AND max\n\nDescription\n-----------\n\nThis is the same as NOT (expr BETWEEN min AND max).\n\nNote that the meaning of the alternative form NOT expr BETWEEN min AND max is\naffected by the HIGH_NOT_PRECEDENCE SQL_MODE flag.\n\nExamples\n--------\n\nSELECT 1 NOT BETWEEN 2 AND 3;\n+-----------------------+\n| 1 NOT BETWEEN 2 AND 3 |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT \'b\' NOT BETWEEN \'a\' AND \'c\';\n+-----------------------------+\n| \'b\' NOT BETWEEN \'a\' AND \'c\' |\n+-----------------------------+\n| 0 |\n+-----------------------------+\n\nNULL:\n\nSELECT 1 NOT BETWEEN 1 AND NULL;\n+--------------------------+\n| 1 NOT BETWEEN 1 AND NULL |\n+--------------------------+\n| NULL |\n+--------------------------+\n\nURL: https://mariadb.com/kb/en/not-between/','','https://mariadb.com/kb/en/not-between/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (234,19,'NOT IN','Syntax\n------\n\nexpr NOT IN (value,...)\n\nDescription\n-----------\n\nThis is the same as NOT (expr IN (value,...)).\n\nExamples\n--------\n\nSELECT 2 NOT IN (0,3,5,7);\n+--------------------+\n| 2 NOT IN (0,3,5,7) |\n+--------------------+\n| 1 |\n+--------------------+\n\nSELECT \'wefwf\' NOT IN (\'wee\',\'wefwf\',\'weg\');\n+--------------------------------------+\n| \'wefwf\' NOT IN (\'wee\',\'wefwf\',\'weg\') |\n+--------------------------------------+\n| 0 |\n+--------------------------------------+\n\nSELECT 1 NOT IN (\'1\', \'2\', \'3\');\n+--------------------------+\n| 1 NOT IN (\'1\', \'2\', \'3\') |\n+--------------------------+\n| 0 |\n+--------------------------+\n\nNULL:\n\nSELECT NULL NOT IN (1, 2, 3);\n+-----------------------+\n| NULL NOT IN (1, 2, 3) |\n+-----------------------+\n| NULL |\n+-----------------------+\n\nSELECT 1 NOT IN (1, 2, NULL);\n+-----------------------+\n| 1 NOT IN (1, 2, NULL) |\n+-----------------------+\n| 0 |\n+-----------------------+\n\nSELECT 5 NOT IN (1, 2, NULL);\n+-----------------------+\n| 5 NOT IN (1, 2, NULL) |\n+-----------------------+\n| NULL |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/not-in/','','https://mariadb.com/kb/en/not-in/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (235,20,'&','Syntax\n------\n\n&\n\nDescription\n-----------\n\nBitwise AND. Converts the values to binary and compares bits. Only if both the\ncorresponding bits are 1 is the resulting bit also 1.\n\nSee also bitwise OR.\n\nExamples\n--------\n\nSELECT 2&1;\n+-----+\n| 2&1 |\n+-----+\n| 0 |\n+-----+\n\nSELECT 3&1;\n+-----+\n| 3&1 |\n+-----+\n| 1 |\n+-----+\n\nSELECT 29 & 15;\n+---------+\n| 29 & 15 |\n+---------+\n| 13 |\n+---------+\n\nURL: https://mariadb.com/kb/en/bitwise_and/','','https://mariadb.com/kb/en/bitwise_and/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (236,20,'<<','Syntax\n------\n\nvalue1 << value2\n\nDescription\n-----------\n\nConverts a longlong (BIGINT) number (value1) to binary and shifts value2 units\nto the left.\n\nExamples\n--------\n\nSELECT 1 << 2;\n+--------+\n| 1 << 2 |\n+--------+\n| 4 |\n+--------+\n\nURL: https://mariadb.com/kb/en/shift-left/','','https://mariadb.com/kb/en/shift-left/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (237,20,'>>','Syntax\n------\n\nvalue1 >> value2\n\nDescription\n-----------\n\nConverts a longlong (BIGINT) number (value1) to binary and shifts value2 units\nto the right.\n\nExamples\n--------\n\nSELECT 4 >> 2;\n+--------+\n| 4 >> 2 |\n+--------+\n| 1 |\n+--------+\n\nURL: https://mariadb.com/kb/en/shift-right/','','https://mariadb.com/kb/en/shift-right/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (238,20,'BIT_COUNT','Syntax\n------\n\nBIT_COUNT(N)\n\nDescription\n-----------\n\nReturns the number of bits that are set in the argument N.\n\nExamples\n--------\n\nSELECT BIT_COUNT(29), BIT_COUNT(b\'101010\');\n+---------------+----------------------+\n| BIT_COUNT(29) | BIT_COUNT(b\'101010\') |\n+---------------+----------------------+\n| 4 | 3 |\n+---------------+----------------------+\n\nURL: https://mariadb.com/kb/en/bit_count/','','https://mariadb.com/kb/en/bit_count/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (239,20,'^','Syntax\n------\n\n^\n\nDescription\n-----------\n\nBitwise XOR. Converts the values to binary and compares bits. If one (and only\none) of the corresponding bits is 1 is the resulting bit also 1.\n\nExamples\n--------\n\nSELECT 1 ^ 1;\n+-------+\n| 1 ^ 1 |\n+-------+\n| 0 |\n+-------+\n\nSELECT 1 ^ 0;\n+-------+\n| 1 ^ 0 |\n+-------+\n| 1 |\n+-------+\n\nSELECT 11 ^ 3;\n+--------+\n| 11 ^ 3 |\n+--------+\n| 8 |\n+--------+\n\nURL: https://mariadb.com/kb/en/bitwise-xor/','','https://mariadb.com/kb/en/bitwise-xor/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (240,20,'|','Syntax\n------\n\n|\n\nDescription\n-----------\n\nBitwise OR. Converts the values to binary and compares bits. If either of the\ncorresponding bits has a value of 1, the resulting bit is also 1.\n\nSee also bitwise AND.\n\nExamples\n--------\n\nSELECT 2|1;\n+-----+\n| 2|1 |\n+-----+\n| 3 |\n+-----+\n\nSELECT 29 | 15;\n+---------+\n| 29 | 15 |\n+---------+\n| 31 |\n+---------+\n\nURL: https://mariadb.com/kb/en/bitwise-or/','','https://mariadb.com/kb/en/bitwise-or/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (241,20,'~','Syntax\n------\n\n~\n\nDescription\n-----------\n\nBitwise NOT. Converts the value to 4 bytes binary and inverts all bits.\n\nExamples\n--------\n\nSELECT 3 & ~1;\n+--------+\n| 3 & ~1 |\n+--------+\n| 2 |\n+--------+\n\nSELECT 5 & ~1;\n+--------+\n| 5 & ~1 |\n+--------+\n| 4 |\n+--------+\n\nURL: https://mariadb.com/kb/en/bitwise-not/','','https://mariadb.com/kb/en/bitwise-not/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (242,20,'Parentheses','Parentheses are sometimes called precedence operators - this means that they\ncan be used to change the other operator\'s precedence in an expression. The\nexpressions that are written between parentheses are computed before the\nexpressions that are written outside. Parentheses must always contain an\nexpression (that is, they cannot be empty), and can be nested.\n\nFor example, the following expressions could return different results:\n\n* NOT a OR b\n* NOT (a OR b)\n\nIn the first case, NOT applies to a, so if a is FALSE or b is TRUE, the\nexpression returns TRUE. In the second case, NOT applies to the result of a OR\nb, so if at least one of a or b is TRUE, the expression is TRUE.\n\nWhen the precedence of operators is not intuitive, you can use parentheses to\nmake it immediately clear for whoever reads the statement.\n\nThe precedence of the NOT operator can also be affected by the\nHIGH_NOT_PRECEDENCE SQL_MODE flag.\n\nOther uses\n----------\n\nParentheses must always be used to enclose subqueries.\n\nParentheses can also be used in a JOIN statement between multiple tables to\ndetermine which tables must be joined first.\n\nAlso, parentheses are used to enclose the list of parameters to be passed to\nbuilt-in functions, user-defined functions and stored routines. However, when\nno parameter is passed to a stored procedure, parentheses are optional. For\nbuiltin functions and user-defined functions, spaces are not allowed between\nthe function name and the open parenthesis, unless the IGNORE_SPACE SQL_MODE\nis set. For stored routines (and for functions if IGNORE_SPACE is set) spaces\nare allowed before the open parenthesis, including tab characters and new line\ncharacters.\n\nSyntax errors\n-------------\n\nIf there are more open parentheses than closed parentheses, the error usually\nlooks like this:\n\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual that\ncorresponds to your MariaDB server version for the right syntax to use near \'\'\na\nt line 1\n\nNote the empty string.\n\nIf there are more closed parentheses than open parentheses, the error usually\nlooks like this:\n\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual that\ncorresponds to your MariaDB server version for the right syntax to use near \')\'\nat line 1\n\nNote the quoted closed parenthesis.\n\nURL: https://mariadb.com/kb/en/parentheses/','','https://mariadb.com/kb/en/parentheses/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (243,20,'TRUE FALSE','Description\n-----------\n\nThe constants TRUE and FALSE evaluate to 1 and 0, respectively. The constant\nnames can be written in any lettercase.\n\nExamples\n--------\n\nSELECT TRUE, true, FALSE, false;\n+------+------+-------+-------+\n| TRUE | TRUE | FALSE | FALSE |\n+------+------+-------+-------+\n| 1 | 1 | 0 | 0 |\n+------+------+-------+-------+\n\nURL: https://mariadb.com/kb/en/true-false/','','https://mariadb.com/kb/en/true-false/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (244,21,'ANALYZE TABLE','Syntax\n------\n\nANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [,tbl_name ...] \n [PERSISTENT FOR [ALL|COLUMNS ([col_name [,col_name ...]])]\n [INDEXES ([index_name [,index_name ...]])]]\n\nDescription\n-----------\n\nANALYZE TABLE analyzes and stores the key distribution for a table (index\nstatistics). This statement works with MyISAM, Aria and InnoDB tables. During\nthe analysis, InnoDB will allow reads/writes, and MyISAM/Aria reads/inserts.\nFor MyISAM tables, this statement is equivalent to using myisamchk --analyze.\n\nFor more information on how the analysis works within InnoDB, see InnoDB\nLimitations.\n\nMariaDB uses the stored key distribution to decide the order in which tables\nshould be joined when you perform a join on something other than a constant.\nIn addition, key distributions can be used when deciding which indexes to use\nfor a specific table within a query.\n\nThis statement requires SELECT and INSERT privileges for the table.\n\nBy default, ANALYZE TABLE statements are written to the binary log and will be\nreplicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure the\nstatement is not written to the binary log.\n\nFrom MariaDB 10.3.19, ANALYZE TABLE statements are not logged to the binary\nlog if read_only is set. See also Read-Only Replicas.\n\nANALYZE TABLE is also supported for partitioned tables. You can use ALTER\nTABLE ... ANALYZE PARTITION to analyze one or more partitions.\n\nThe Aria storage engine supports progress reporting for the ANALYZE TABLE\nstatement.\n\nEngine-Independent Statistics\n-----------------------------\n\nANALYZE TABLE supports engine-independent statistics. See Engine-Independent\nTable Statistics: Collecting Statistics with the ANALYZE TABLE Statement for\nmore information.\n\nUseful Variables\n----------------\n\nFor calculating the number of duplicates, ANALYZE TABLE uses a buffer of\nsort_buffer_size bytes per column. You can slightly increase the speed of\nANALYZE TABLE by increasing this variable.\n\nURL: https://mariadb.com/kb/en/analyze-table/','','https://mariadb.com/kb/en/analyze-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (245,21,'CHECK TABLE','Syntax\n------\n\nCHECK TABLE tbl_name [, tbl_name] ... [option] ...\n\noption = {FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED | CHANGED}\n\nDescription\n-----------\n\nCHECK TABLE checks a table or tables for errors. CHECK TABLE works for\nArchive, Aria, CSV, InnoDB and MyISAM tables. For Aria and MyISAM tables, the\nkey statistics are updated as well. For CSV, see also Checking and Repairing\nCSV Tables.\n\nAs an alternative, myisamchk is a commandline tool for checking MyISAM tables\nwhen the tables are not being accessed. For Aria tables, there is a similar\ntool: aria_chk.\n\nFor checking dynamic columns integrity, COLUMN_CHECK() can be used.\n\nCHECK TABLE can also check views for problems, such as tables that are\nreferenced in the view definition that no longer exist.\n\nCHECK TABLE is also supported for partitioned tables. You can use ALTER TABLE\n... CHECK PARTITION to check one or more partitions.\n\nThe meaning of the different options are as follows - note that this can vary\na bit between storage engines:\n\n+-----+----------------------------------------------------------------------+\n| FOR | Do a very quick check if the storage format for the table has |\n| UPG | changed so that one needs to do a REPAIR. This is only needed when |\n| ADE | one upgrades between major versions of MariaDB or MySQL. This is |\n| | usually done by running mysql_upgrade. |\n+-----+----------------------------------------------------------------------+\n| FAS | Only check tables that has not been closed properly or are marked |\n| | as corrupt. Only supported by the MyISAM and Aria engines. For |\n| | other engines the table is checked normally |\n+-----+----------------------------------------------------------------------+\n| CHA | Check only tables that has changed since last REPAIR / CHECK. Only |\n| GED | supported by the MyISAM and Aria engines. For other engines the |\n| | table is checked normally. |\n+-----+----------------------------------------------------------------------+\n| QUI | Do a fast check. For MyISAM and Aria, this means skipping the check |\n| K | of the delete link chain, which may take some time. |\n+-----+----------------------------------------------------------------------+\n| MED | Scan also the data files. Checks integrity between data and index |\n| UM | files with checksums. In most cases this should find all possible |\n| | errors. |\n+-----+----------------------------------------------------------------------+\n| EXT | Does a full check to verify every possible error. For MyISAM and |\n| NDE | Aria, verify for each row that all it keys exists and points to the |\n| | row. This may take a long time on large tables. Ignored by InnoDB |\n| | before MariaDB 10.6.11, MariaDB 10.7.7, MariaDB 10.8.6 and MariaDB |\n| | 10.9.4. |\n+-----+----------------------------------------------------------------------+\n\nFor most cases running CHECK TABLE without options or MEDIUM should be good\nenough.\n\nThe Aria storage engine supports progress reporting for this statement.\n\nIf you want to know if two tables are identical, take a look at CHECKSUM TABLE.\n\nInnoDB\n------\n\nIf CHECK TABLE finds an error in an InnoDB table, MariaDB might shutdown to\nprevent the error propagation. In this case, the problem will be reported in\nthe error log. Otherwise the table or an index might be marked as corrupted,\nto prevent use. This does not happen with some minor problems, like a wrong\nnumber of entries in a secondary index. Those problems are reported in the\noutput of CHECK TABLE.\n\nEach tablespace contains a header with metadata. This header is not checked by\nthis statement.\n\nDuring the execution of CHECK TABLE, other threads may be blocked.\n\nURL: https://mariadb.com/kb/en/check-table/','','https://mariadb.com/kb/en/check-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (246,21,'CHECK VIEW','Syntax\n------\n\nCHECK VIEW view_name\n\nDescription\n-----------\n\nThe CHECK VIEW statement was introduced in MariaDB 10.0.18 to assist with\nfixing MDEV-6916, an issue introduced in MariaDB 5.2 where the view algorithms\nwere swapped. It checks whether the view algorithm is correct. It is run as\npart of mysql_upgrade, and should not normally be required in regular use.\n\nURL: https://mariadb.com/kb/en/check-view/','','https://mariadb.com/kb/en/check-view/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (247,21,'CHECKSUM TABLE','Syntax\n------\n\nCHECKSUM TABLE tbl_name [, tbl_name] ... [ QUICK | EXTENDED ]\n\nDescription\n-----------\n\nCHECKSUM TABLE reports a table checksum. This is very useful if you want to\nknow if two tables are the same (for example on a master and slave).\n\nWith QUICK, the live table checksum is reported if it is available, or NULL\notherwise. This is very fast. A live checksum is enabled by specifying the\nCHECKSUM=1 table option when you create the table; currently, this is\nsupported only for Aria and MyISAM tables.\n\nWith EXTENDED, the entire table is read row by row and the checksum is\ncalculated. This can be very slow for large tables.\n\nIf neither QUICK nor EXTENDED is specified, MariaDB returns a live checksum if\nthe table storage engine supports it and scans the table otherwise.\n\nCHECKSUM TABLE requires the SELECT privilege for the table.\n\nFor a nonexistent table, CHECKSUM TABLE returns NULL and generates a warning.\n\nThe table row format affects the checksum value. If the row format changes,\nthe checksum will change. This means that when a table created with a\nMariaDB/MySQL version is upgraded to another version, the checksum value will\nprobably change.\n\nTwo identical tables should always match to the same checksum value; however,\nalso for non-identical tables there is a very slight chance that they will\nreturn the same value as the hashing algorithm is not completely\ncollision-free.\n\nIdentical Tables\n----------------\n\nIdentical tables mean that the CREATE statement is identical and that the\nfollowing variable, which affects the storage formats, was the same when the\ntables were created:\n\n* mysql56-temporal-format\n\nDifferences Between MariaDB and MySQL\n-------------------------------------\n\nCHECKSUM TABLE may give a different result as MariaDB doesn\'t ignore NULLs in\nthe columns as MySQL 5.1 does (Later MySQL versions should calculate checksums\nthe same way as MariaDB). You can get the \'old style\' checksum in MariaDB by\nstarting mysqld with the --old option. Note however that that the MyISAM and\nAria storage engines in MariaDB are using the new checksum internally, so if\nyou are using --old, the CHECKSUM command will be slower as it needs to\ncalculate the checksum row by row. Starting from MariaDB Server 10.9, --old is\ndeprecated and will be removed in a future release. Set --old-mode or OLD_MODE\nto COMPAT_5_1_CHECKSUM to get \'old style\' checksum.\n\nURL: https://mariadb.com/kb/en/checksum-table/','','https://mariadb.com/kb/en/checksum-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (248,21,'OPTIMIZE TABLE','Syntax\n------\n\nOPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE\n tbl_name [, tbl_name] ...\n [WAIT n | NOWAIT]\n\nDescription\n-----------\n\nOPTIMIZE TABLE has two main functions. It can either be used to defragment\ntables, or to update the InnoDB fulltext index.\n\nMariaDB starting with 10.3.0\n----------------------------\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nDefragmenting\n-------------\n\nOPTIMIZE TABLE works for InnoDB (before MariaDB 10.1.1, only if the\ninnodb_file_per_table server system variable is set), Aria, MyISAM and ARCHIVE\ntables, and should be used if you have deleted a large part of a table or if\nyou have made many changes to a table with variable-length rows (tables that\nhave VARCHAR, VARBINARY, BLOB, or TEXT columns). Deleted rows are maintained\nin a linked list and subsequent INSERT operations reuse old row positions.\n\nThis statement requires SELECT and INSERT privileges for the table.\n\nBy default, OPTIMIZE TABLE statements are written to the binary log and will\nbe replicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure\nthe statement is not written to the binary log.\n\nFrom MariaDB 10.3.19, OPTIMIZE TABLE statements are not logged to the binary\nlog if read_only is set. See also Read-Only Replicas.\n\nOPTIMIZE TABLE is also supported for partitioned tables. You can use ALTER\nTABLE ... OPTIMIZE PARTITION to optimize one or more partitions.\n\nYou can use OPTIMIZE TABLE to reclaim the unused space and to defragment the\ndata file. With other storage engines, OPTIMIZE TABLE does nothing by default,\nand returns this message: \" The storage engine for the table doesn\'t support\noptimize\". However, if the server has been started with the --skip-new option,\nOPTIMIZE TABLE is linked to ALTER TABLE, and recreates the table. This\noperation frees the unused space and updates index statistics.\n\nThe Aria storage engine supports progress reporting for this statement.\n\nIf a MyISAM table is fragmented, concurrent inserts will not be performed\nuntil an OPTIMIZE TABLE statement is executed on that table, unless the\nconcurrent_insert server system variable is set to ALWAYS.\n\nUpdating an InnoDB fulltext index\n---------------------------------\n\nWhen rows are added or deleted to an InnoDB fulltext index, the index is not\nimmediately re-organized, as this can be an expensive operation. Change\nstatistics are stored in a separate location . The fulltext index is only\nfully re-organized when an OPTIMIZE TABLE statement is run.\n\nBy default, an OPTIMIZE TABLE will defragment a table. In order to use it to\nupdate fulltext index statistics, the innodb_optimize_fulltext_only system\nvariable must be set to 1. This is intended to be a temporary setting, and\nshould be reset to 0 once the fulltext index has been re-organized.\n\nSince fulltext re-organization can take a long time, the\ninnodb_ft_num_word_optimize variable limits the re-organization to a number of\nwords (2000 by default). You can run multiple OPTIMIZE statements to fully\nre-organize the index.\n\nDefragmenting InnoDB tablespaces\n--------------------------------\n\nMariaDB 10.1.1 merged the Facebook/Kakao defragmentation patch, allowing one\nto use OPTIMIZE TABLE to defragment InnoDB tablespaces. For this functionality\nto be enabled, the innodb_defragment system variable must be enabled. No new\ntables are created and there is no need to copy data from old tables to new\ntables. Instead, this feature loads n pages (determined by\ninnodb-defragment-n-pages) and tries to move records so that pages would be\nfull of records and then frees pages that are fully empty after the operation.\nNote that tablespace files (including ibdata1) will not shrink as the result\nof defragmentation, but one will get better memory utilization in the InnoDB\nbuffer pool as there are fewer data pages in use.\n\nSee Defragmenting InnoDB Tablespaces for more details.\n\nURL: https://mariadb.com/kb/en/optimize-table/','','https://mariadb.com/kb/en/optimize-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (249,21,'REPAIR TABLE','Syntax\n------\n\nREPAIR [NO_WRITE_TO_BINLOG | LOCAL] TABLE\n tbl_name [, tbl_name] ...\n [QUICK] [EXTENDED] [USE_FRM]\n\nDescription\n-----------\n\nREPAIR TABLE repairs a possibly corrupted table. By default, it has the same\neffect as\n\nmyisamchk --recover tbl_name\n\nor\n\naria_chk --recover tbl_name\n\nSee aria_chk and myisamchk for more.\n\nREPAIR TABLE works for Archive, Aria, CSV and MyISAM tables. For InnoDB, see\nrecovery modes. For CSV, see also Checking and Repairing CSV Tables. For\nArchive, this statement also improves compression. If the storage engine does\nnot support this statement, a warning is issued.\n\nThis statement requires SELECT and INSERT privileges for the table.\n\nBy default, REPAIR TABLE statements are written to the binary log and will be\nreplicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure the\nstatement is not written to the binary log.\n\nFrom MariaDB 10.3.19, REPAIR TABLE statements are not logged to the binary log\nif read_only is set. See also Read-Only Replicas.\n\nWhen an index is recreated, the storage engine may use a configurable buffer\nin the process. Incrementing the buffer speeds up the index creation. Aria and\nMyISAM allocate a buffer whose size is defined by aria_sort_buffer_size or\nmyisam_sort_buffer_size, also used for ALTER TABLE.\n\nREPAIR TABLE is also supported for partitioned tables. However, the USE_FRM\noption cannot be used with this statement on a partitioned table.\n\nALTER TABLE ... REPAIR PARTITION can be used to repair one or more partitions.\n\nThe Aria storage engine supports progress reporting for this statement.\n\nURL: https://mariadb.com/kb/en/repair-table/','','https://mariadb.com/kb/en/repair-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (250,21,'REPAIR VIEW','Syntax\n------\n\nREPAIR [NO_WRITE_TO_BINLOG | LOCAL] VIEW view_name[, view_name] ... [FROM\nMYSQL]\n\nDescription\n-----------\n\nThe REPAIR VIEW statement was introduced to assist with fixing MDEV-6916, an\nissue introduced in MariaDB 5.2 where the view algorithms were swapped\ncompared to their MySQL on disk representation. It checks whether the view\nalgorithm is correct. It is run as part of mysql_upgrade, and should not\nnormally be required in regular use.\n\nBy default it corrects the checksum and if necessary adds the mariadb-version\nfield. If the optional FROM MYSQL clause is used, and no mariadb-version field\nis present, the MERGE and TEMPTABLE algorithms are toggled.\n\nBy default, REPAIR VIEW statements are written to the binary log and will be\nreplicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure the\nstatement is not written to the binary log.\n\nURL: https://mariadb.com/kb/en/repair-view/','','https://mariadb.com/kb/en/repair-view/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (251,22,'mysql.func Table','The mysql.func table stores information about user-defined functions (UDFs)\ncreated with the CREATE FUNCTION UDF statement.\n\nMariaDB starting with 10.4\n--------------------------\nIn MariaDB 10.4 and later, this table uses the Aria storage engine.\n\nMariaDB until 10.3\n------------------\nIn MariaDB 10.3 and before, this table uses the MyISAM storage engine.\n\nThe mysql.func table contains the following fields:\n\n+----------+---------+---------+-------+--------------+---------------------+\n| Field | Type | Null | Key | Default | Description |\n+----------+---------+---------+-------+--------------+---------------------+\n| name | char(64 | NO | PRI | | UDF name |\n| | | | | | |\n+----------+---------+---------+-------+--------------+---------------------+\n| ret | tinyint | NO | | 0 | |\n| | 1) | | | | |\n+----------+---------+---------+-------+--------------+---------------------+\n| dl | char(12 | NO | | | Shared library name |\n| | ) | | | | |\n+----------+---------+---------+-------+--------------+---------------------+\n| type | enum(\'f | NO | | NULL | Type, either |\n| | nction\' | | | | function or |\n| | \'aggreg | | | | aggregate. |\n| | te\') | | | | Aggregate |\n| | | | | | functions are |\n| | | | | | summary functions |\n| | | | | | such as SUM() and |\n| | | | | | AVG(). |\n+----------+---------+---------+-------+--------------+---------------------+\n\nExample\n-------\n\nSELECT * FROM mysql.func;\n+------------------------------+-----+--------------+-----------+\n| name | ret | dl | type |\n+------------------------------+-----+--------------+-----------+\n| spider_direct_sql | 2 | ha_spider.so | function |\n| spider_bg_direct_sql | 2 | ha_spider.so | aggregate |\n| spider_ping_table | 2 | ha_spider.so | function |\n| spider_copy_tables | 2 | ha_spider.so | function |\n| spider_flush_table_mon_cache | 2 | ha_spider.so | function |\n+------------------------------+-----+--------------+-----------+\n\nURL: https://mariadb.com/kb/en/mysqlfunc-table/','','https://mariadb.com/kb/en/mysqlfunc-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (252,22,'CREATE FUNCTION UDF','Syntax\n------\n\nCREATE [OR REPLACE] [AGGREGATE] FUNCTION [IF NOT EXISTS] function_name\n RETURNS {STRING|INTEGER|REAL|DECIMAL}\n SONAME shared_library_name\n\nDescription\n-----------\n\nA user-defined function (UDF) is a way to extend MariaDB with a new function\nthat works like a native (built-in) MariaDB function such as ABS() or CONCAT().\n\nfunction_name is the name that should be used in SQL statements to invoke the\nfunction.\n\nTo create a function, you must have the INSERT privilege for the mysql\ndatabase. This is necessary becauseCREATE FUNCTION adds a row to the\nmysql.func system table that records the function\'s name, type, and shared\nlibrary name. If you do not have this table, you should run the mysql_upgrade\ncommand to create it.\n\nUDFs need to be written in C, C++ or another language that uses C calling\nconventions, MariaDB needs to have been dynamically compiled, and your\noperating system must support dynamic loading.\n\nFor an example, see sql/udf_example.cc in the source tree. For a collection of\nexisting UDFs see http://www.mysqludf.org/.\n\nStatements making use of user-defined functions are not safe for replication.\n\nFor creating a stored function as opposed to a user-defined function, see\nCREATE FUNCTION.\n\nFor valid identifiers to use as function names, see Identifier Names.\n\nRETURNS\n-------\n\nThe RETURNS clause indicates the type of the function\'s return value, and can\nbe one of STRING, INTEGER, REAL or DECIMAL. DECIMAL functions currently return\nstring values and should be written like STRING functions.\n\nshared_library_name\n-------------------\n\nshared_library_name is the basename of the shared object file that contains\nthe code that implements the function. The file must be located in the plugin\ndirectory. This directory is given by the value of the plugin_dir system\nvariable. Note that before MariaDB/MySQL 5.1, the shared object could be\nlocated in any directory that was searched by your system\'s dynamic linker.\n\nAGGREGATE\n---------\n\nAggregate functions are summary functions such as SUM() and AVG().\n\nMariaDB starting with 10.4\n--------------------------\nAggregate UDF functions can be used as window functions.\n\nOR REPLACE\n----------\n\nMariaDB starting with 10.1.3\n----------------------------\nThe OR REPLACE clause was added in MariaDB 10.1.3\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP FUNCTION IF EXISTS function_name;\nCREATE FUNCTION name ...;\n\nIF NOT EXISTS\n-------------\n\nMariaDB starting with 10.1.3\n----------------------------\nThe IF NOT EXISTS clause was added in MariaDB 10.1.3\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified function already exists. Cannot be used together\nwith OR REPLACE.\n\nUpgrading a UDF\n---------------\n\nTo upgrade the UDF\'s shared library, first run a DROP FUNCTION statement, then\nupgrade the shared library and finally run the CREATE FUNCTION statement. If\nyou upgrade without following this process, you may crash the server.\n\nExamples\n--------\n\nCREATE FUNCTION jsoncontains_path RETURNS integer SONAME \'ha_connect.so\';\nQuery OK, 0 rows affected (0.00 sec)\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE FUNCTION jsoncontains_path RETURNS integer SONAME \'ha_connect.so\';\nERROR 1125 (HY000): Function \'jsoncontains_path\' already exists\n\nCREATE OR REPLACE FUNCTION jsoncontains_path RETURNS integer SONAME\n\'ha_connect.so\';\nQuery OK, 0 rows affected (0.00 sec)\n\nCREATE FUNCTION IF NOT EXISTS jsoncontains_path RETURNS integer SONAME\n\'ha_connect.so\';\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+---------------------------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------------------------+\n| Note | 1125 | Function \'jsoncontains_path\' already exists |\n+-------+------+---------------------------------------------+\n\nURL: https://mariadb.com/kb/en/create-function-udf/','','https://mariadb.com/kb/en/create-function-udf/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (253,22,'DROP FUNCTION UDF','Syntax\n------\n\nDROP FUNCTION [IF EXISTS] function_name\n\nDescription\n-----------\n\nThis statement drops the user-defined function (UDF) named function_name.\n\nTo drop a function, you must have the DELETE privilege for the mysql database.\nThis is because DROP FUNCTION removes the row from the mysql.func system table\nthat records the function\'s name, type and shared library name.\n\nFor dropping a stored function, see DROP FUNCTION.\n\nUpgrading a UDF\n---------------\n\nTo upgrade the UDF\'s shared library, first run a DROP FUNCTION statement, then\nupgrade the shared library and finally run the CREATE FUNCTION statement. If\nyou upgrade without following this process, you may crash the server.\n\nExamples\n--------\n\nDROP FUNCTION jsoncontains_path;\n\nIF EXISTS:\n\nDROP FUNCTION jsoncontains_path;\nERROR 1305 (42000): FUNCTION test.jsoncontains_path does not exist\n\nDROP FUNCTION IF EXISTS jsoncontains_path;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------------------+\n| Note | 1305 | FUNCTION test.jsoncontains_path does not exist |\n+-------+------+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-function-udf/','','https://mariadb.com/kb/en/drop-function-udf/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (254,22,'Creating User-Defined Functions','User-defined functions allow MariaDB to be extended with a new function that\nworks like a native (built-in) MariaDB function such as ABS() or CONCAT().\nThere are alternative ways to add a new function: writing a native function\n(which requires modifying and compiling the server source code), or writing a\nstored function.\n\nStatements making use of user-defined functions are not safe for replication.\n\nFunctions are written in C or C++, and to make use of them, the operating\nsystem must support dynamic loading.\n\nEach new SQL function requires corresponding functions written in C/C++. In\nthe list below, at least the main function - x() - and one other, are\nrequired. x should be replaced by the name of the function you are creating.\n\nAll functions need to be thread-safe, so not global or static variables that\nchange can be allocated. Memory is allocated in x_init()/ and freed in\nx_deinit().\n\nSimple Functions\n----------------\n\nx()\n---\n\nRequired for all UDFs; this is where the results are calculated.\n\n+------------------------------------------+----------------------------------+\n| C/C++ type | SQL type |\n+------------------------------------------+----------------------------------+\n| char * | STRING |\n+------------------------------------------+----------------------------------+\n| long long | INTEGER |\n+------------------------------------------+----------------------------------+\n| double | REAL |\n+------------------------------------------+----------------------------------+\n\nDECIMAL functions return string values, and so should be written accordingly.\nIt is not possible to create ROW functions.\n\nx_init()\n--------\n\nInitialization function for x(). Can be used for the following:\n\n* Check the number of arguments to X() (the SQL equivalent).\n* Verify the argument types, or to force arguments to be of a particular type\nafter the function is called.\n* Specify whether the result can be NULL.\n* Specify the maximum result length.\n* For REAL functions, specify the maximum number of decimals for the result.\n* Allocate any required memory.\n\nx_deinit()\n----------\n\nDe-initialization function for x(). Used to de-allocate memory that was\nallocated in x_init().\n\nDescription\n-----------\n\nEach time the SQL function X() is called:\n\n* MariaDB will first call the C/C++ initialization function, x_init(),\nassuming it exists. All setup will be performed, and if it returns an error,\nthe SQL statement is aborted and no further functions are called.\n* If there is no x_init() function, or it has been called and did not return\nan error, x() is then called once per row.\n* After all rows have finished processing, x_deinit() is called, if present,\nto clean up by de-allocating any memory that was allocated in x_init().\n* See User-defined Functions Calling Sequences for more details on the\nfunctions.\n\nAggregate Functions\n-------------------\n\nThe following functions are required for aggregate functions, such as AVG()\nand SUM(). When using CREATE FUNCTION, the AGGREGATE keyword is required.\n\nx_clear()\n---------\n\nUsed to reset the current aggregate, but without inserting the argument as the\ninitial aggregate value for the new group.\n\nx_add()\n-------\n\nUsed to add the argument to the current aggregate.\n\nx_remove()\n----------\n\nStarting from MariaDB 10.4, improves the support of window functions (so it is\nnot obligatory to add it) and should remove the argument from the current\naggregate.\n\nDescription\n-----------\n\nEach time the aggregate SQL function X() is called:\n\n* MariaDB will first call the C/C++ initialization function, x_init(),\nassuming it exists. All setup will be performed, and if it returns an error,\nthe SQL statement is aborted and no further functions are called.\n* If there is no x_init() function, or it has been called and did not return\nan error, x() is then called once per row.\n* After all rows have finished processing, x_deinit() is called, if present,\nto clean up by de-allocating any memory that was allocated in x_init().\n\n* MariaDB will first call the C/C++ initialization function, x_init(),\nassuming it exists. All setup will be performed, and if it returns an error,\nthe SQL statement is aborted and no further functions are called.\n* The table is sorted according to the GROUP BY expression.\n* x_clear() is called for the first row of each new group.\n* x_add() is called once per row for each row in the same group.\n* x() is called when the group changes, or after the last row, to get the\naggregate result. \n* The latter three steps are repeated until all rows have been processed.\n* After all rows have finished processing, x_deinit() is called, if present,\nto clean up by de-allocating any memory that was allocated in x_init().\n\nExamples\n--------\n\nFor an example, see sql/udf_example.cc in the source tree. For a collection of\nexisting UDFs see https://github.com/mysqludf.\n\nURL: https://mariadb.com/kb/en/creating-user-defined-functions/','','https://mariadb.com/kb/en/creating-user-defined-functions/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (255,22,'User-Defined Functions Calling Sequences','The functions described in Creating User-defined Functions are expanded on\nthis page. They are declared as follows:\n\nSimple Functions\n----------------\n\nx()\n---\n\nIf x() returns an integer, it is declared as follows:\n\nlong long x(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n\nIf x() returns a string (DECIMAL functions also return string values), it is\ndeclared as follows:\n\nchar *x(UDF_INIT *initid, UDF_ARGS *args,\n char *result, unsigned long *length,\n char *is_null, char *error);\n\nIf x() returns a real, it is declared as follows:\n\ndouble x(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n\nx_init()\n--------\n\nmy_bool x_init(UDF_INIT *initid, UDF_ARGS *args, char *message);\n\nx_deinit()\n----------\n\nvoid x_deinit(UDF_INIT *initid);\n\nDescription\n-----------\n\ninitid is a parameter passed to all three functions that points to a UDF_INIT\nstructure, used for communicating information between the functions. Its\nstructure members are:\n\n* my_bool maybe_null\nmaybe_null should be set to 1 if x_init can return a NULL value, Defaults to 1\nif any arguments are declared maybe_null.\n\n* unsigned int decimals\nNumber of decimals after the decimal point. The default, if an explicit number\nof decimals is passed in the arguments to the main function, is the maximum\nnumber of decimals, so if 9.5, 9.55 and 9.555 are passed to the function, the\ndefault would be three (based on 9.555, the maximum). If there are no\nexplicit number of decimals, the default is set to 31, or one more than the\nmaximum for the DOUBLE, FLOAT and DECIMAL types. This default can be changed\nin the function to suit the actual calculation.\n\n* unsigned int max_length\nMaximum length of the result. For integers, the default is 21. For strings,\nthe length of the longest argument. For reals, the default is 13 plus the\nnumber of decimals indicated by initid->decimals. The length includes any\nsigns or decimal points. Can also be set to 65KB or 16MB in order to return a\nBLOB. The memory remains unallocated, but this is used to decide on the data\ntype to use if the data needs to be temporarily stored.\n\n* char *ptr\nA pointer for use as required by the function. Commonly, initid->ptr is used\nto communicate allocated memory, with x_init() allocating the memory and\nassigning it to this pointer, x() using it, and x_deinit() de-allocating it.\n\n* my_bool const_item\nShould be set to 1 in x_init() if x() always returns the same value, otherwise\n0.\n\nAggregate Functions\n-------------------\n\nx_clear()\n---------\n\nx_clear() is a required function for aggregate functions, and is declared as\nfollows:\n\nvoid x_clear(UDF_INIT *initid, char *is_null, char *error);\n\nIt is called when the summary results need to be reset, that is at the\nbeginning of each new group. but also to reset the values when there were no\nmatching rows.\n\nis_null is set to point to CHAR(0) before calling x_clear().\n\nIn the case of an error, you can store the value to which the error argument\npoints (a single-byte variable, not a string string buffer) in the variable.\n\nx_reset()\n---------\n\nx_reset() is declared as follows:\n\nvoid x_reset(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n\nIt is called on finding the first row in a new group. Should reset the summary\nvariables, and then use UDF_ARGS as the first value in the group\'s internal\nsummary value. The function is not required if the UDF interface uses\nx_clear().\n\nx_add()\n-------\n\nx_add() is declared as follows:\n\nvoid x_add(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n\nIt is called for all rows belonging to the same group, and should be used to\nadd the value in UDF_ARGS to the internal summary variable.\n\nx_remove()\n----------\n\nx_remove() was added in MariaDB 10.4 and is declared as follows (same as\nx_add()):\n\nvoid x_remove(UDF_INIT* initid, UDF_ARGS* args,\n char* is_null, char *error );\n\nIt adds more efficient support of aggregate UDFs as window functions.\nx_remove() should \"subtract\" the row (reverse x_add()). In MariaDB 10.4\naggregate UDFs will work as WINDOW functions without x_remove() but it will\nnot be so efficient.\n\nIf x_remove() supported (defined) detected automatically.\n\nURL: https://mariadb.com/kb/en/user-defined-functions-calling-sequences/','','https://mariadb.com/kb/en/user-defined-functions-calling-sequences/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (256,22,'User-Defined Functions Security','The MariaDB server imposes a number of limitations on user-defined functions\nfor security purposes.\n\n* The INSERT privilege for the mysql database is required to run CREATE\nFUNCTION, as a record will be added to the mysql.func-table.\n* The DELETE privilege for the mysql database is required to run DROP FUNCTION\nas the corresponding record will be removed from the mysql.func-table.\n* UDF object files can only be placed in the plugin directory, as specified by\nthe value of the plugin_dir system variable.\n* At least one symbol, beyond the required x() - corresponding to an SQL\nfunction X()) - is required. These can be x_init(), x_deinit(), xxx_reset(),\nx_clear() and x_add() functions (see Creating User-defined Functions). The\nallow-suspicious-udfs mysqld option (by default unset) provides a workaround,\npermitting only one symbol to be used. This is not recommended, as it opens\nthe possibility of loading shared objects that are not legitimate user-defined\nfunctions.\n\nURL: https://mariadb.com/kb/en/user-defined-functions-security/','','https://mariadb.com/kb/en/user-defined-functions-security/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (257,23,'Numeric Data Type Overview','There are a number of numeric data types:\n\n* TINYINT\n* BOOLEAN - Synonym for TINYINT(1)\n* INT1 - Synonym for TINYINT\n* SMALLINT\n* INT2 - Synonym for SMALLINT\n* MEDIUMINT\n* INT3 - Synonym for MEDIUMINT\n* INT, INTEGER\n* INT4 - Synonym for INT\n* BIGINT\n* INT8 - Synonym for BIGINT\n* DECIMAL, DEC, NUMERIC, FIXED\n* FLOAT\n* DOUBLE, DOUBLE PRECISION, REAL\n* BIT\n\nSee the specific articles for detailed information on each.\n\nSIGNED, UNSIGNED and ZEROFILL\n-----------------------------\n\nMost numeric types can be defined as SIGNED, UNSIGNED or ZEROFILL, for example:\n\nTINYINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nIf SIGNED, or no attribute, is specified, a portion of the numeric type will\nbe reserved for the sign (plus or minus). For example, a TINYINT SIGNED can\nrange from -128 to 127.\n\nIf UNSIGNED is specified, no portion of the numeric type is reserved for the\nsign, so for integer types range can be larger. For example, a TINYINT\nUNSIGNED can range from 0 to 255. Floating point and fixed-point types also\ncan be UNSIGNED, but this only prevents negative values from being stored and\ndoesn\'t alter the range.\n\nIf ZEROFILL is specified, the column will be set to UNSIGNED and the spaces\nused by default to pad the field are replaced with zeros. ZEROFILL is ignored\nin expressions or as part of a UNION. ZEROFILL is a non-standard MySQL and\nMariaDB enhancement.\n\nNote that although the preferred syntax indicates that the attributes are\nexclusive, more than one attribute can be specified.\n\nUntil MariaDB 10.2.7 (MDEV-8659), any combination of the attributes could be\nused in any order, with duplicates. In this case:\n\n* the presence of ZEROFILL makes the column UNSIGNED ZEROFILL.\n* the presence of UNSIGNED makes the column UNSIGNED.\n\nFrom MariaDB 10.2.8, only the following combinations are supported:\n\n* SIGNED\n* UNSIGNED\n* ZEROFILL\n* UNSIGNED ZEROFILL\n* ZEROFILL UNSIGNED\n\nThe latter two should be replaced with simply ZEROFILL, but are still accepted\nby the parser.\n\nExamples\n--------\n\nCREATE TABLE zf (\n i1 TINYINT SIGNED,\n i2 TINYINT UNSIGNED,\n i3 TINYINT ZEROFILL\n);\n\nINSERT INTO zf VALUES (2,2,2);\n\nSELECT * FROM zf;\n+------+------+------+\n| i1 | i2 | i3 |\n+------+------+------+\n| 2 | 2 | 002 |\n+------+------+------+\n\nRange\n-----\n\nWhen attempting to add a value that is out of the valid range for the numeric\ntype, MariaDB will react depending on the strict SQL_MODE setting.\n\nIf strict_mode has been set (the default from MariaDB 10.2.4), MariaDB will\nreturn an error.\n\nIf strict_mode has not been set (the default until MariaDB 10.2.3), MariaDB\nwill adjust the number to fit in the field, returning a warning.\n\nExamples\n--------\n\nWith strict_mode set:\n\nSHOW VARIABLES LIKE \'sql_mode\';\n+---------------+--------------------------------------------------------------\n----------------------------+\n| Variable_name | Value \n |\n+---------------+--------------------------------------------------------------\n----------------------------+\n| sql_mode |\nSTRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SU\nSTITUTION |\n+---------------+--------------------------------------------------------------\n----------------------------+\n\nCREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT UNSIGNED);\n\nINSERT INTO ranges VALUES (257,257,257);\nERROR 1264 (22003): Out of range value for column \'i1\' at row 1\n\nSELECT * FROM ranges;\nEmpty set (0.10 sec)\n\nWith strict_mode unset:\n\nSHOW VARIABLES LIKE \'sql_mode%\';\n+---------------+-------+\n| Variable_name | Value |\n+---------------+-------+\n| sql_mode | |\n+---------------+-------+\n\nCREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT UNSIGNED);\n\nINSERT INTO ranges VALUES (257,257,257);\nQuery OK, 1 row affected, 2 warnings (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+---------------------------------------------+\n| Level | Code | Message |\n+---------+------+---------------------------------------------+\n| Warning | 1264 | Out of range value for column \'i1\' at row 1 |\n| Warning | 1264 | Out of range value for column \'i3\' at row 1 |\n+---------+------+---------------------------------------------+\n2 rows in set (0.00 sec)\n\nSELECT * FROM ranges;\n+------+------+------+\n| i1 | i2 | i3 |\n+------+------+------+\n| 127 | 257 | 255 |\n+------+------+------+\n\nAuto_increment\n--------------\n\nThe AUTO_INCREMENT attribute can be used to generate a unique identity for new\nrows. For more details, see auto_increment.\n\nURL: https://mariadb.com/kb/en/numeric-data-type-overview/','','https://mariadb.com/kb/en/numeric-data-type-overview/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (258,23,'TINYINT','Syntax\n------\n\nTINYINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA very small integer. The signed range is -128 to 127. The unsigned range is 0\nto 255. For details on the attributes, see Numeric Data Type Overview.\n\nINT1 is a synonym for TINYINT. BOOL and BOOLEAN are synonyms for TINYINT(1).\n\nExamples\n--------\n\nCREATE TABLE tinyints (a TINYINT,b TINYINT UNSIGNED,c TINYINT ZEROFILL);\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO tinyints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO tinyints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO tinyints VALUES (-10,10,10);\n\nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 10 | 010 |\n+------+------+------+\n\nINSERT INTO tinyints VALUES (128,128,128);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO tinyints VALUES (127,128,128);\n\nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 10 | 010 |\n| 127 | 128 | 128 |\n+------+------+------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO tinyints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.08 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO tinyints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.11 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO tinyints VALUES (-10,10,10);\n\nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 0 | 000 |\n| -10 | 10 | 000 |\n| -10 | 10 | 010 |\n+------+------+------+\n\nINSERT INTO tinyints VALUES (128,128,128);\nQuery OK, 1 row affected, 1 warning (0.19 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO tinyints VALUES (127,128,128);\n\nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 0 | 000 |\n| -10 | 10 | 000 |\n| -10 | 10 | 010 |\n| 127 | 128 | 128 |\n| 127 | 128 | 128 |\n+------+------+------+\n\nURL: https://mariadb.com/kb/en/tinyint/','','https://mariadb.com/kb/en/tinyint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (259,23,'BOOLEAN','Syntax\n------\n\nBOOL, BOOLEAN\n\nDescription\n-----------\n\nThese types are synonyms for TINYINT(1). A value of zero is considered false.\nNon-zero values are considered true.\n\nHowever, the values TRUE and FALSE are merely aliases for 1 and 0. See Boolean\nLiterals, as well as the IS operator for testing values against a boolean.\n\nExamples\n--------\n\nCREATE TABLE boo (i BOOLEAN);\n\nDESC boo;\n+-------+------------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+------------+------+-----+---------+-------+\n| i | tinyint(1) | YES | | NULL | |\n+-------+------------+------+-----+---------+-------+\n\nSELECT IF(0, \'true\', \'false\');\n+------------------------+\n| IF(0, \'true\', \'false\') |\n+------------------------+\n| false |\n+------------------------+\n\nSELECT IF(1, \'true\', \'false\');\n+------------------------+\n| IF(1, \'true\', \'false\') |\n+------------------------+\n| true |\n+------------------------+\n\nSELECT IF(2, \'true\', \'false\');\n+------------------------+\n| IF(2, \'true\', \'false\') |\n+------------------------+\n| true |\n+------------------------+\n\nTRUE and FALSE as aliases for 1 and 0:\n\nSELECT IF(0 = FALSE, \'true\', \'false\');\n\n+--------------------------------+\n| IF(0 = FALSE, \'true\', \'false\') |\n+--------------------------------+\n| true |\n+--------------------------------+\n\nSELECT IF(1 = TRUE, \'true\', \'false\');\n+-------------------------------+\n| IF(1 = TRUE, \'true\', \'false\') |\n+-------------------------------+\n| true |\n+-------------------------------+\n\nSELECT IF(2 = TRUE, \'true\', \'false\');\n+-------------------------------+\n| IF(2 = TRUE, \'true\', \'false\') |\n+-------------------------------+\n| false |\n+-------------------------------+\n\nSELECT IF(2 = FALSE, \'true\', \'false\');\n+--------------------------------+\n| IF(2 = FALSE, \'true\', \'false\') |\n+--------------------------------+\n| false |\n+--------------------------------+\n\nThe last two statements display the results shown because 2 is equal to\nneither 1 nor 0.\n\nURL: https://mariadb.com/kb/en/boolean/','','https://mariadb.com/kb/en/boolean/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (260,23,'SMALLINT','Syntax\n------\n\nSMALLINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA small integer. The signed range is -32768 to 32767. The unsigned range is 0\nto 65535.\n\nIf a column has been set to ZEROFILL, all values will be prepended by zeros so\nthat the SMALLINT value contains a number of M digits.\n\nNote: If the ZEROFILL attribute has been specified, the column will\nautomatically become UNSIGNED.\n\nINT2 is a synonym for SMALLINT.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nExamples\n--------\n\nCREATE TABLE smallints (a SMALLINT,b SMALLINT UNSIGNED,c SMALLINT ZEROFILL);\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO smallints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO smallints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO smallints VALUES (-10,10,10);\n\nINSERT INTO smallints VALUES (32768,32768,32768);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO smallints VALUES (32767,32768,32768);\n\nSELECT * FROM smallints;\n+-------+-------+-------+\n| a | b | c |\n+-------+-------+-------+\n| -10 | 10 | 00010 |\n| 32767 | 32768 | 32768 |\n+-------+-------+-------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO smallints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.09 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO smallints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO smallints VALUES (-10,10,10);\n\nINSERT INTO smallints VALUES (32768,32768,32768);\nQuery OK, 1 row affected, 1 warning (0.04 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO smallints VALUES (32767,32768,32768);\n\nSELECT * FROM smallints;\n+-------+-------+-------+\n| a | b | c |\n+-------+-------+-------+\n| -10 | 0 | 00000 |\n| -10 | 10 | 00000 |\n| -10 | 10 | 00010 |\n| 32767 | 32768 | 32768 |\n| 32767 | 32768 | 32768 |\n+-------+-------+-------+\n\nURL: https://mariadb.com/kb/en/smallint/','','https://mariadb.com/kb/en/smallint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (261,23,'MEDIUMINT','Syntax\n------\n\nMEDIUMINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA medium-sized integer. The signed range is -8388608 to 8388607. The unsigned\nrange is 0 to 16777215.\n\nZEROFILL pads the integer with zeroes and assumes UNSIGNED (even if UNSIGNED\nis not specified).\n\nINT3 is a synonym for MEDIUMINT.\n\nFor details on the attributes, see Numeric Data Type Overview.\n\nExamples\n--------\n\nCREATE TABLE mediumints (a MEDIUMINT,b MEDIUMINT UNSIGNED,c MEDIUMINT\nZEROFILL);\n\nDESCRIBE mediumints;\n+-------+--------------------------------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+--------------------------------+------+-----+---------+-------+\n| a | mediumint(9) | YES | | NULL | |\n| b | mediumint(8) unsigned | YES | | NULL | |\n| c | mediumint(8) unsigned zerofill | YES | | NULL | |\n+-------+--------------------------------+------+-----+---------+-------+\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO mediumints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO mediumints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO mediumints VALUES (-10,10,10);\n\nINSERT INTO mediumints VALUES (8388608,8388608,8388608);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO mediumints VALUES (8388607,8388608,8388608);\n\nSELECT * FROM mediumints;\n+---------+---------+----------+\n| a | b | c |\n+---------+---------+----------+\n| -10 | 10 | 00000010 |\n| 8388607 | 8388608 | 08388608 |\n+---------+---------+----------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO mediumints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.05 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO mediumints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO mediumints VALUES (-10,10,10);\n\nINSERT INTO mediumints VALUES (8388608,8388608,8388608);\nQuery OK, 1 row affected, 1 warning (0.05 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO mediumints VALUES (8388607,8388608,8388608);\n\nSELECT * FROM mediumints;\n+---------+---------+----------+\n| a | b | c |\n+---------+---------+----------+\n| -10 | 0 | 00000000 |\n| -10 | 0 | 00000000 |\n| -10 | 10 | 00000000 |\n| -10 | 10 | 00000010 |\n| 8388607 | 8388608 | 08388608 |\n| 8388607 | 8388608 | 08388608 |\n+---------+---------+----------+\n\nURL: https://mariadb.com/kb/en/mediumint/','','https://mariadb.com/kb/en/mediumint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (262,23,'INT','Syntax\n------\n\nINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\nINTEGER[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA normal-size integer. When marked UNSIGNED, it ranges from 0 to 4294967295,\notherwise its range is -2147483648 to 2147483647 (SIGNED is the default). If a\ncolumn has been set to ZEROFILL, all values will be prepended by zeros so that\nthe INT value contains a number of M digits. INTEGER is a synonym for INT.\n\nNote: If the ZEROFILL attribute has been specified, the column will\nautomatically become UNSIGNED.\n\nINT4 is a synonym for INT.\n\nFor details on the attributes, see Numeric Data Type Overview.\n\nExamples\n--------\n\nCREATE TABLE ints (a INT,b INT UNSIGNED,c INT ZEROFILL);\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO ints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO ints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO ints VALUES (-10,10,10);\n\nINSERT INTO ints VALUES (2147483648,2147483648,2147483648);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO ints VALUES (2147483647,2147483648,2147483648);\n\nSELECT * FROM ints;\n+------------+------------+------------+\n| a | b | c |\n+------------+------------+------------+\n| -10 | 10 | 0000000010 |\n| 2147483647 | 2147483648 | 2147483648 |\n+------------+------------+------------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO ints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.10 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO ints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO ints VALUES (-10,10,10);\n\nINSERT INTO ints VALUES (2147483648,2147483648,2147483648);\nQuery OK, 1 row affected, 1 warning (0.07 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO ints VALUES (2147483647,2147483648,2147483648);\n\nSELECT * FROM ints;\n+------------+------------+------------+\n| a | b | c |\n+------------+------------+------------+\n| -10 | 0 | 0000000000 |\n| -10 | 10 | 0000000000 |\n| -10 | 10 | 0000000010 |\n| 2147483647 | 2147483648 | 2147483648 |\n| 2147483647 | 2147483648 | 2147483648 |\n+------------+------------+------------+\n\nURL: https://mariadb.com/kb/en/int/','','https://mariadb.com/kb/en/int/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (263,23,'BIGINT','Syntax\n------\n\nBIGINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA large integer. The signed range is -9223372036854775808 to\n9223372036854775807. The unsigned range is 0 to 18446744073709551615.\n\nIf a column has been set to ZEROFILL, all values will be prepended by zeros so\nthat the BIGINT value contains a number of M digits.\n\nNote: If the ZEROFILL attribute has been specified, the column will\nautomatically become UNSIGNED.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nSERIAL is an alias for:\n\nBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE\n\nINT8 is a synonym for BIGINT.\n\nExamples\n--------\n\nCREATE TABLE bigints (a BIGINT,b BIGINT UNSIGNED,c BIGINT ZEROFILL);\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO bigints VALUES (-10,-10,-10);\nERROR 1264 (22003): Out of range value for column \'b\' at row 1\n\nINSERT INTO bigints VALUES (-10,10,-10);\nERROR 1264 (22003): Out of range value for column \'c\' at row 1\n\nINSERT INTO bigints VALUES (-10,10,10);\n\nINSERT INTO bigints VALUES\n(9223372036854775808,9223372036854775808,9223372036854775808);\nERROR 1264 (22003): Out of range value for column \'a\' at row 1\n\nINSERT INTO bigints VALUES\n(9223372036854775807,9223372036854775808,9223372036854775808);\n\nSELECT * FROM bigints;\n+---------------------+---------------------+----------------------+\n| a | b | c |\n+---------------------+---------------------+----------------------+\n| -10 | 10 | 00000000000000000010 |\n| 9223372036854775807 | 9223372036854775808 | 09223372036854775808 |\n+---------------------+---------------------+----------------------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO bigints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.08 sec)\nWarning (Code 1264): Out of range value for column \'b\' at row 1\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO bigints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at row 1\n\nINSERT INTO bigints VALUES (-10,10,10);\n\nINSERT INTO bigints VALUES\n(9223372036854775808,9223372036854775808,9223372036854775808);\nQuery OK, 1 row affected, 1 warning (0.07 sec)\nWarning (Code 1264): Out of range value for column \'a\' at row 1\n\nINSERT INTO bigints VALUES\n(9223372036854775807,9223372036854775808,9223372036854775808);\n\nSELECT * FROM bigints;\n+---------------------+---------------------+----------------------+\n| a | b | c |\n+---------------------+---------------------+----------------------+\n| -10 | 0 | 00000000000000000000 |\n| -10 | 10 | 00000000000000000000 |\n| -10 | 10 | 00000000000000000010 |\n| 9223372036854775807 | 9223372036854775808 | 09223372036854775808 |\n| 9223372036854775807 | 9223372036854775808 | 09223372036854775808 |\n+---------------------+---------------------+----------------------+\n\nURL: https://mariadb.com/kb/en/bigint/','','https://mariadb.com/kb/en/bigint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (264,23,'DECIMAL','Syntax\n------\n\nDECIMAL[(M[,D])] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA packed \"exact\" fixed-point number. M is the total number of digits (the\nprecision) and D is the number of digits after the decimal point (the scale).\n\n* The decimal point and (for negative numbers) the \"-\" sign are not\ncounted in M. \n* If D is 0, values have no decimal point or fractional\npart and on INSERT the value will be rounded to the nearest DECIMAL. \n* The maximum number of digits (M) for DECIMAL is 65. \n* The maximum number of supported decimals (D) is 30 before MariadB 10.2.1 and\n38 afterwards. \n* If D is omitted, the default is 0. If M is omitted, the default is 10.\n\nUNSIGNED, if specified, disallows negative values.\n\nZEROFILL, if specified, pads the number with zeros, up to the total number of\ndigits specified by M.\n\nAll basic calculations (+, -, *, /) with DECIMAL columns are done with a\nprecision of 65 digits.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nDEC, NUMERIC and FIXED are synonyms, as well as NUMBER in Oracle mode from\nMariaDB 10.3.\n\nExamples\n--------\n\nCREATE TABLE t1 (d DECIMAL UNSIGNED ZEROFILL);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4.0),(5.2),(5.7);\nQuery OK, 6 rows affected, 2 warnings (0.16 sec)\nRecords: 6 Duplicates: 0 Warnings: 2\n\nNote (Code 1265): Data truncated for column \'d\' at row 5\nNote (Code 1265): Data truncated for column \'d\' at row 6\n\nSELECT * FROM t1;\n+------------+\n| d |\n+------------+\n| 0000000001 |\n| 0000000002 |\n| 0000000003 |\n| 0000000004 |\n| 0000000005 |\n| 0000000006 |\n+------------+\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO t1 VALUES (-7);\nERROR 1264 (22003): Out of range value for column \'d\' at row 1\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO t1 VALUES (-7);\nQuery OK, 1 row affected, 1 warning (0.02 sec)\nWarning (Code 1264): Out of range value for column \'d\' at row 1\n\nSELECT * FROM t1;\n+------------+\n| d |\n+------------+\n| 0000000001 |\n| 0000000002 |\n| 0000000003 |\n| 0000000004 |\n| 0000000005 |\n| 0000000006 |\n| 0000000000 |\n+------------+\n\nURL: https://mariadb.com/kb/en/decimal/','','https://mariadb.com/kb/en/decimal/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (265,23,'FLOAT','Syntax\n------\n\nFLOAT[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA small (single-precision) floating-point number (see DOUBLE for a\nregular-size floating point number). Allowable values are:\n\n* -3.402823466E+38 to -1.175494351E-38\n* 0\n* 1.175494351E-38 to 3.402823466E+38.\n\nThese are the theoretical limits, based on the IEEE standard. The actual range\nmight be slightly smaller depending on your hardware or operating system.\n\nM is the total number of digits and D is the number of digits following the\ndecimal point. If M and D are omitted, values are stored to the limits allowed\nby the hardware. A single-precision floating-point number is accurate to\napproximately 7 decimal places.\n\nUNSIGNED, if specified, disallows negative values.\n\nUsing FLOAT might give you some unexpected problems because all calculations\nin MariaDB are done with double precision. See Floating Point Accuracy.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nURL: https://mariadb.com/kb/en/float/','','https://mariadb.com/kb/en/float/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (266,23,'DOUBLE','Syntax\n------\n\nDOUBLE[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\nDOUBLE PRECISION[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\nREAL[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\n\nDescription\n-----------\n\nA normal-size (double-precision) floating-point number (see FLOAT for a\nsingle-precision floating-point number).\n\nAllowable values are:\n\n* -1.7976931348623157E+308 to -2.2250738585072014E-308\n* 0\n* 2.2250738585072014E-308 to 1.7976931348623157E+308\n\nThese are the theoretical limits, based on the IEEE standard. The actual range\nmight be slightly smaller depending on your hardware or operating system.\n\nM is the total number of digits and D is the number of digits following the\ndecimal point. If M and D are omitted, values are stored to the limits allowed\nby the hardware. A double-precision floating-point number is accurate to\napproximately 15 decimal places.\n\nUNSIGNED, if specified, disallows negative values.\n\nZEROFILL, if specified, pads the number with zeros, up to the total number of\ndigits specified by M.\n\nREAL and DOUBLE PRECISION are synonyms, unless the REAL_AS_FLOAT SQL mode is\nenabled, in which case REAL is a synonym for FLOAT rather than DOUBLE.\n\nSee Floating Point Accuracy for issues when using floating-point numbers.\n\nFor more details on the attributes, see Numeric Data Type Overview.\n\nExamples\n--------\n\nCREATE TABLE t1 (d DOUBLE(5,0) zerofill);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4);\n\nSELECT * FROM t1;\n+-------+\n| d |\n+-------+\n| 00001 |\n| 00002 |\n| 00003 |\n| 00004 |\n+-------+\n\nURL: https://mariadb.com/kb/en/double/','','https://mariadb.com/kb/en/double/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (267,23,'BIT','Syntax\n------\n\nBIT[(M)]\n\nDescription\n-----------\n\nA bit-field type. M indicates the number of bits per value, from 1 to 64. The\ndefault is 1 if M is omitted.\n\nBit values can be inserted with b\'value\' notation, where value is the bit\nvalue in 0\'s and 1\'s.\n\nBit fields are automatically zero-padded from the left to the full length of\nthe bit, so for example in a BIT(4) field, \'10\' is equivalent to \'0010\'.\n\nBits are returned as binary, so to display them, either add 0, or use a\nfunction such as HEX, OCT or BIN to convert them.\n\nExamples\n--------\n\nCREATE TABLE b ( b1 BIT(8) );\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nINSERT INTO b VALUES (b\'11111111\');\n\nINSERT INTO b VALUES (b\'01010101\');\n\nINSERT INTO b VALUES (b\'1111111111111\');\nERROR 1406 (22001): Data too long for column \'b1\' at row 1\n\nSELECT b1+0, HEX(b1), OCT(b1), BIN(b1) FROM b;\n+------+---------+---------+----------+\n| b1+0 | HEX(b1) | OCT(b1) | BIN(b1) |\n+------+---------+---------+----------+\n| 255 | FF | 377 | 11111111 |\n| 85 | 55 | 125 | 1010101 |\n+------+---------+---------+----------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nINSERT INTO b VALUES (b\'11111111\'),(b\'01010101\'),(b\'1111111111111\');\nQuery OK, 3 rows affected, 1 warning (0.10 sec)\nRecords: 3 Duplicates: 0 Warnings: 1\n\nSHOW WARNINGS;\n+---------+------+---------------------------------------------+\n| Level | Code | Message |\n+---------+------+---------------------------------------------+\n| Warning | 1264 | Out of range value for column \'b1\' at row 3 |\n+---------+------+---------------------------------------------+\n\nSELECT b1+0, HEX(b1), OCT(b1), BIN(b1) FROM b;\n+------+---------+---------+----------+\n| b1+0 | HEX(b1) | OCT(b1) | BIN(b1) |\n+------+---------+---------+----------+\n| 255 | FF | 377 | 11111111 |\n| 85 | 55 | 125 | 1010101 |\n| 255 | FF | 377 | 11111111 |\n+------+---------+---------+----------+\n\nURL: https://mariadb.com/kb/en/bit/','','https://mariadb.com/kb/en/bit/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (268,23,'Floating-point Accuracy','Due to their nature, not all floating-point numbers can be stored with exact\nprecision. Hardware architecture, the CPU or even the compiler version and\noptimization level may affect the precision.\n\nIf you are comparing DOUBLEs or FLOATs with numeric decimals, it is not safe\nto use the equality operator.\n\nSometimes, changing a floating-point number from single-precision (FLOAT) to\ndouble-precision (DOUBLE) will fix the problem.\n\nExample\n-------\n\nf1, f2 and f3 have seemingly identical values across each row, but due to\nfloating point accuracy, the results may be unexpected.\n\nCREATE TABLE fpn (id INT, f1 FLOAT, f2 DOUBLE, f3 DECIMAL (10,3));\nINSERT INTO fpn VALUES (1,2,2,2),(2,0.1,0.1,0.1);\n\nSELECT * FROM fpn WHERE f1*f1 = f2*f2;\n+------+------+------+-------+\n| id | f1 | f2 | f3 |\n+------+------+------+-------+\n| 1 | 2 | 2 | 2.000 |\n+------+------+------+-------+\n\nThe reason why only one instead of two rows was returned becomes clear when we\nsee how the floating point squares were evaluated.\n\nSELECT f1*f1, f2*f2, f3*f3 FROM fpn;\n+----------------------+----------------------+----------+\n| f1*f1 | f2*f2 | f3*f3 |\n+----------------------+----------------------+----------+\n| 4 | 4 | 4.000000 |\n| 0.010000000298023226 | 0.010000000000000002 | 0.010000 |\n+----------------------+----------------------+----------+\n\nURL: https://mariadb.com/kb/en/floating-point-accuracy/','','https://mariadb.com/kb/en/floating-point-accuracy/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (269,23,'BINARY','This page describes the BINARY data type. For details about the operator, see\nBinary Operator.\n\nSyntax\n------\n\nBINARY(M)\n\nDescription\n-----------\n\nThe BINARY type is similar to the CHAR type, but stores binary byte strings\nrather than non-binary character strings. M represents the column length in\nbytes.\n\nIt contains no character set, and comparison and sorting are based on the\nnumeric value of the bytes.\n\nIf the maximum length is exceeded, and SQL strict mode is not enabled , the\nextra characters will be dropped with a warning. If strict mode is enabled, an\nerror will occur.\n\nBINARY values are right-padded with 0x00 (the zero byte) to the specified\nlength when inserted. The padding is not removed on select, so this needs to\nbe taken into account when sorting and comparing, where all bytes are\nsignificant. The zero byte, 0x00 is less than a space for comparison purposes.\n\nExamples\n--------\n\nInserting too many characters, first with strict mode off, then with it on:\n\nCREATE TABLE bins (a BINARY(10));\n\nINSERT INTO bins VALUES(\'12345678901\');\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n\nSELECT * FROM bins;\n+------------+\n| a |\n+------------+\n| 1234567890 |\n+------------+\n\nSET sql_mode=\'STRICT_ALL_TABLES\';\n\nINSERT INTO bins VALUES(\'12345678901\');\nERROR 1406 (22001): Data too long for column \'a\' at row 1\n\nSorting is performed with the byte value:\n\nTRUNCATE bins;\n\nINSERT INTO bins VALUES(\'A\'),(\'B\'),(\'a\'),(\'b\');\n\nSELECT * FROM bins ORDER BY a;\n+------+\n| a |\n+------+\n| A |\n| B |\n| a |\n| b |\n+------+\n\nUsing CAST to sort as a CHAR instead:\n\nSELECT * FROM bins ORDER BY CAST(a AS CHAR);\n+------+\n| a |\n+------+\n| a |\n| A |\n| b |\n| B |\n+------+\n\nThe field is a BINARY(10), so padding of two \'\\0\'s are inserted, causing\ncomparisons that don\'t take this into account to fail:\n\nTRUNCATE bins;\n\nINSERT INTO bins VALUES(\'12345678\');\n\nSELECT a = \'12345678\', a = \'12345678\\0\\0\' from bins;\n+----------------+--------------------+\n| a = \'12345678\' | a = \'12345678\\0\\0\' |\n+----------------+--------------------+\n| 0 | 1 |\n+----------------+--------------------+\n\nURL: https://mariadb.com/kb/en/binary/','','https://mariadb.com/kb/en/binary/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (270,23,'BLOB','Syntax\n------\n\nBLOB[(M)]\n\nDescription\n-----------\n\nA BLOB column with a maximum length of 65,535 (216 - 1) bytes. Each BLOB value\nis stored using a two-byte length prefix that indicates the number of bytes in\nthe value.\n\nAn optional length M can be given for this type. If this is done, MariaDB\ncreates the column as the smallest BLOB type large enough to hold values M\nbytes long.\n\nBLOBS can also be used to store dynamic columns.\n\nBefore MariaDB 10.2.1, BLOB and TEXT columns could not be assigned a DEFAULT\nvalue. This restriction was lifted in MariaDB 10.2.1.\n\nIndexing\n--------\n\nMariaDB starting with 10.4\n--------------------------\nFrom MariaDB 10.4, it is possible to set a unique index on a column that uses\nthe BLOB data type. In previous releases this was not possible, as the index\nwould only guarantee the uniqueness of a fixed number of characters.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, BLOB is a synonym for LONGBLOB.\n\nURL: https://mariadb.com/kb/en/blob/','','https://mariadb.com/kb/en/blob/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (271,23,'BLOB and TEXT Data Types','Description\n-----------\n\nA BLOB is a binary large object that can hold a variable amount of data. The\nfour BLOB types are\n\n* TINYBLOB,\n* BLOB, \n* MEDIUMBLOB, and\n* LONGBLOB.\n\nThese differ only in the maximum length of the values they can hold.\n\nThe TEXT types are\n\n* TINYTEXT,\n* TEXT,\n* MEDIUMTEXT, and\n* LONGTEXT.\n* JSON (alias for LONGTEXT)\n\nThese correspond to the four BLOB types and have the same maximum lengths and\nstorage requirements.\n\nMariaDB starting with 10.2.1\n----------------------------\nStarting from MariaDB 10.2.1, BLOB and TEXT columns can have a DEFAULT value.\n\nMariaDB starting with 10.4.3\n----------------------------\nFrom MariaDB 10.4, it is possible to set a unique index on columns that use\nthe BLOB or TEXT data types.\n\nURL: https://mariadb.com/kb/en/blob-and-text-data-types/','','https://mariadb.com/kb/en/blob-and-text-data-types/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (272,23,'CHAR','This article covers the CHAR data type. See CHAR Function for the function.\n\nSyntax\n------\n\n[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA fixed-length string that is always right-padded with spaces to the specified\nlength when stored. M represents the column length in characters. The range of\nM is 0 to 255. If M is omitted, the length is 1.\n\nCHAR(0) columns can contain 2 values: an empty string or NULL. Such columns\ncannot be part of an index. The CONNECT storage engine does not support\nCHAR(0).\n\nNote: Trailing spaces are removed when CHAR values are retrieved unless the\nPAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.\n\nBefore MariaDB 10.2, all collations were of type PADSPACE, meaning that CHAR\n(as well as VARCHAR and TEXT) values are compared without regard for trailing\nspaces. This does not apply to the LIKE pattern-matching operator, which takes\ninto account trailing spaces.\n\nIf a unique index consists of a column where trailing pad characters are\nstripped or ignored, inserts into that column where values differ only by the\nnumber of trailing pad characters will result in a duplicate-key error.\n\nExamples\n--------\n\nTrailing spaces:\n\nCREATE TABLE strtest (c CHAR(10));\nINSERT INTO strtest VALUES(\'Maria \');\n\nSELECT c=\'Maria\',c=\'Maria \' FROM strtest;\n+-----------+--------------+\n| c=\'Maria\' | c=\'Maria \' |\n+-----------+--------------+\n| 1 | 1 |\n+-----------+--------------+\n\nSELECT c LIKE \'Maria\',c LIKE \'Maria \' FROM strtest;\n+----------------+-------------------+\n| c LIKE \'Maria\' | c LIKE \'Maria \' |\n+----------------+-------------------+\n| 1 | 0 |\n+----------------+-------------------+\n\nNO PAD Collations\n-----------------\n\nNO PAD collations regard trailing spaces as normal characters. You can get a\nlist of all NO PAD collations by querying the Information Schema Collations\ntable, for example:\n\nSELECT collation_name FROM information_schema.collations \n WHERE collation_name LIKE \"%nopad%\";\n+------------------------------+\n| collation_name |\n+------------------------------+\n| big5_chinese_nopad_ci |\n| big5_nopad_bin |\n...\n\nURL: https://mariadb.com/kb/en/char/','','https://mariadb.com/kb/en/char/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (273,23,'CHAR BYTE','Description\n-----------\n\nThe CHAR BYTE data type is an alias for the BINARY data type. This is a\ncompatibility feature.\n\nURL: https://mariadb.com/kb/en/char-byte/','','https://mariadb.com/kb/en/char-byte/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (274,23,'ENUM','Syntax\n------\n\nENUM(\'value1\',\'value2\',...) [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n\nDescription\n-----------\n\nAn enumeration. A string object that can have only one value, chosen from the\nlist of values \'value1\', \'value2\', ..., NULL or the special \'\' error value. In\ntheory, an ENUM column can have a maximum of 65,535 distinct values; in\npractice, the real maximum depends on many factors. ENUM values are\nrepresented internally as integers.\n\nTrailing spaces are automatically stripped from ENUM values on table creation.\n\nENUMs require relatively little storage space compared to strings, either one\nor two bytes depending on the number of enumeration values.\n\nNULL and empty values\n---------------------\n\nAn ENUM can also contain NULL and empty values. If the ENUM column is declared\nto permit NULL values, NULL becomes a valid value, as well as the default\nvalue (see below). If strict SQL Mode is not enabled, and an invalid value is\ninserted into an ENUM, a special empty string, with an index value of zero\n(see Numeric index, below), is inserted, with a warning. This may be\nconfusing, because the empty string is also a possible value, and the only\ndifference if that is this case its index is not 0. Inserting will fail with\nan error if strict mode is active.\n\nIf a DEFAULT clause is missing, the default value will be:\n\n* NULL if the column is nullable;\n* otherwise, the first value in the enumeration.\n\nNumeric index\n-------------\n\nENUM values are indexed numerically in the order they are defined, and sorting\nwill be performed in this numeric order. We suggest not using ENUM to store\nnumerals, as there is little to no storage space benefit, and it is easy to\nconfuse the enum integer with the enum numeral value by leaving out the quotes.\n\nAn ENUM defined as ENUM(\'apple\',\'orange\',\'pear\') would have the following\nindex values:\n\n+--------------------------------------+--------------------------------------+\n| Index | Value |\n+--------------------------------------+--------------------------------------+\n| NULL | NULL |\n+--------------------------------------+--------------------------------------+\n| 0 | \'\' |\n+--------------------------------------+--------------------------------------+\n| 1 | \'apple\' |\n+--------------------------------------+--------------------------------------+\n| 2 | \'orange\' |\n+--------------------------------------+--------------------------------------+\n| 3 | \'pear\' |\n+--------------------------------------+--------------------------------------+\n\nExamples\n--------\n\nCREATE TABLE fruits (\n id INT NOT NULL auto_increment PRIMARY KEY,\n fruit ENUM(\'apple\',\'orange\',\'pear\'),\n bushels INT);\n\nDESCRIBE fruits;\n+---------+-------------------------------+------+-----+---------+-------------\n--+\n| Field | Type | Null | Key | Default | Extra \n |\n+---------+-------------------------------+------+-----+---------+-------------\n--+\n| id | int(11) | NO | PRI | NULL |\nauto_increment |\n| fruit | enum(\'apple\',\'orange\',\'pear\') | YES | | NULL | \n |\n| bushels | int(11) | YES | | NULL | \n |\n+---------+-------------------------------+------+-----+---------+-------------\n--+\n\nINSERT INTO fruits\n (fruit,bushels) VALUES\n (\'pear\',20),\n (\'apple\',100),\n (\'orange\',25);\n\nINSERT INTO fruits\n (fruit,bushels) VALUES\n (\'avocado\',10);\nERROR 1265 (01000): Data truncated for column \'fruit\' at row 1\n\nSELECT * FROM fruits;\n+----+--------+---------+\n| id | fruit | bushels |\n+----+--------+---------+\n| 1 | pear | 20 |\n| 2 | apple | 100 |\n| 3 | orange | 25 |\n+----+--------+---------+\n\nSelecting by numeric index:\n\nSELECT * FROM fruits WHERE fruit=2;\n+----+--------+---------+\n| id | fruit | bushels |\n+----+--------+---------+\n| 3 | orange | 25 |\n+----+--------+---------+\n\nSorting is according to the index value:\n\nCREATE TABLE enums (a ENUM(\'2\',\'1\'));\n\nINSERT INTO enums VALUES (\'1\'),(\'2\');\n\nSELECT * FROM enums ORDER BY a ASC;\n+------+\n| a |\n+------+\n| 2 |\n| 1 |\n+------+\n\nIt\'s easy to get confused between returning the enum integer with the stored\nvalue, so we don\'t suggest using ENUM to store numerals. The first example\nreturns the 1st indexed field (\'2\' has an index value of 1, as it\'s defined\nfirst), while the second example returns the string value \'1\'.\n\nSELECT * FROM enums WHERE a=1;\n+------+\n| a |\n+------+\n| 2 |\n+------+\n\nSELECT * FROM enums WHERE a=\'1\';\n+------+\n| a |\n+------+\n| 1 |\n+------+\n\nURL: https://mariadb.com/kb/en/enum/','','https://mariadb.com/kb/en/enum/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (275,23,'INET6','MariaDB starting with 10.5.0\n----------------------------\nThe INET6 data type was added in MariaDB 10.5.0\n\nSyntax\n------\n\nINET6\n\nDescription\n-----------\n\nThe INET6 data type is intended for storage of IPv6 addresses, as well as IPv4\naddresses assuming conventional mapping of IPv4 addresses into IPv6 addresses.\n\nBoth short and long IPv6 notation are permitted, according to RFC-5952.\n\n* Values are stored as a 16-byte fixed length binary string, with most\nsignificant byte first.\n* Storage engines see INET6 as BINARY(16).\n* Clients see INET6 as CHAR(39) and get text representation on retrieval.\n\nThe IPv4-compatible notation is considered as deprecated. It is supported for\ncompatibility with the INET6_ATON function, which also understands this\nformat. It\'s recommended to use the mapped format to store IPv4 addresses in\nINET6.\n\nWhen an IPv4 mapped (or compatible) value is stored in INET6, it still\noccupies 16 bytes:\n\nRetrieval\n---------\n\nOn retrieval, in the client-server text protocol, INET6 values are converted\nto the short text representation, according to RFC-5952, that is with all\nleading zeroes in each group removed and with consequent zero groups\ncompressed.\n\nBesides creating one\'s own stored function, there is no a way to retrieve an\nINET6 value using long text representation.\n\nCasting\n-------\n\n* CAST from a character string to INET6 understands addresses in short or long\ntext notation (including IPv4 mapped and compatible addresses). NULL is\nreturned if the format is not understood.\n* CAST from a binary string to INET6 requires a 16-byte string as an argument.\nNULL is returned if the argument length is not equal to 16.\n* CAST from other data types to INET6 first converts data to a character\nstring, then CAST from character string to INET6 is applied.\n* CAST from INET6 to CHAR returns short text address notation.\n* CAST from INET6 to BINARY returns its 16-byte binary string representation.\n* CAST from INET6 to data types other than CHAR (e.g. SIGNED, UNSIGNED, TIME,\netc) returns an error.\n\nComparisons\n-----------\n\nAn INET6 expression can be compared to:\n\n* another INET6 expression\n* a character string expression with a text (short or long) address\nrepresentation:\n* a 16-byte binary string expression:\n\nAttempting to compare INET6 to an expression of any other data type returns an\nerror.\n\nMixing INET6 Values for Result\n------------------------------\n\nAn INET6 expression can be mixed for result (i.e. UNION, CASE..THEN, COALESCE\netc) with:\n\n* another INET6 expression. The resulting data type is INET6.\n* a character string in text (short or long) address representation. The\nresult data type is INET6. The character string counterpart is automatically\nconverted to INET6. If the string format is not understood, it\'s converted\nwith a warning to either NULL or to \'::\', depending on the NULL-ability of the\nresult.\n* a 16-byte binary string. The resulting data type is INET6. The binary string\ncounterpart is automatically converted to INET6. If the length of the binary\nstring is not equal to 16, it\'s converted with a warning to NULL or to \'::\'\ndepending on the NULL-ability of the result.\n\nAttempts to mix INET6 for result with other data types will return an error.\n\nMixing INET6 with other data types for LEAST and GREATEST, when mixing for\ncomparison and mixing for result are involved at the same time, uses the same\nrules with mixing for result, described in the previous paragraphs.\n\nFunctions and Operators\n-----------------------\n\n* HEX() with an INET6 argument returns a hexadecimal representation of the\nunderlying 16-byte binary string\n* Arithmetic operators (+,-,*,/,MOD,DIV) are not supported for INET6. This may\nchange in the future.\n* The INET6_ATON function now understands INET6 values as an argument\n* The prototypes of the IS_IPV4_COMPAT and IS_IPV4_MAPPED functions have\nchanged from a BINARY(16) to a INET6,\n* When the argument for these two functions is not INET6, automatic implicit\nCAST to INET6 is applied. As a consequence, both functions now understand\narguments in both text representation and binary(16) representation. Before\nMariaDB 10.5.0, these functions understood only binary(16) representation.\n\nPrepared Statement Parameters\n-----------------------------\n\nINET6 understands both text and binary(16) address representation in prepared\nstatement parameters (PREPARE..EXECUTE and EXECUTE IMMEDIATE statements).\n\nMigration between BINARY(16) and INET6\n---------------------------------------\n\nBefore MariaDB 10.5.0, you may have used BINARY(16) as a storage for IPv6\ninternet addresses, in combination with INET6_ATON and INET6_NTOA to\nrespectively insert and retrieve data.\n\nFrom 10.5, you can ALTER BINARY(16) columns storing IPv6 addresses to INET6.\nAfter such an alter, there is no a need to use INET6_ATON() and INET6_NTOA().\nAddresses can be inserted and retrieved directly.\n\nIt is also possible to convert INET6 columns to BINARY(16) and continue using\nthe data in combination with INET6_NTOA() and INET6_ATON().\n\nExamples\n--------\n\nCREATE TABLE t1 (a INET6);\n\nInserting using short text address notation:\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n\nLong text address notation:\n\nINSERT INTO t1 VALUES (\'2001:0db8:0000:0000:0000:ff00:0042:8329\');\n\n16-byte binary string notation:\n\nINSERT INTO t1 VALUES (0x20010DB8000000000000FF0000428329);\nINSERT INTO t1 VALUES (UNHEX(\'20010DB8000000000000FF0000428329\'));\n\nIPv4 addresses, using IPv4-mapped and IPv4-compatible notations:\n\nINSERT INTO t1 VALUES (\'::ffff:192.0.2.128\'); -- mapped\nINSERT INTO t1 VALUES (\'::192.0.2.128\'); -- compatible\n\nSELECT * FROM t1;\n+------------------------+\n| a |\n+------------------------+\n| 2001:db8::ff00:42:8329 |\n| 2001:db8::ff00:42:8329 |\n| 2001:db8::ff00:42:8329 |\n| 2001:db8::ff00:42:8329 |\n| ::ffff:192.0.2.128 |\n| ::192.0.2.128 |\n+------------------------+\n\nIPv4 mapped (or compatible) values still occupy 16 bytes:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'::ffff:192.0.2.128\');\n\nSELECT * FROM t1;\n+--------------------+\n| a |\n+--------------------+\n| ::ffff:192.0.2.128 |\n+--------------------+\n\nSELECT HEX(a) FROM t1;\n+----------------------------------+\n| HEX(a) |\n+----------------------------------+\n| 00000000000000000000FFFFC0000280 |\n+----------------------------------+\n\nCasting from INET6 to anything other than CHAR returns an error:\n\nSELECT CAST(a AS DECIMAL) FROM t1;\n\nERROR 4079 (HY000): Illegal parameter data type inet6 for operation\n\'decimal_typecast\'\n\nComparison Examples\n-------------------\n\nComparison with another INET6 expression:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n CREATE OR REPLACE TABLE t2 (a INET6);\n\nINSERT INTO t1 VALUES\n(\'2001:db8::ff00:42:8328\'),(\'2001:db8::ff00:42:8329\');\n INSERT INTO t2 VALUES\n(\'2001:db8::ff00:42:832a\'),(\'2001:db8::ff00:42:8329\');\n\nSELECT t1.* FROM t1,t2 WHERE t1.a=t2.a;\n +------------------------+\n | a |\n +------------------------+\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nWith a character string expression with a text (short or long) address\nrepresentation:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n\nSELECT * FROM t1 WHERE a=\'2001:db8::ff00:42:8329\';\n +------------------------+\n | a |\n +------------------------+\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nWith a 16-byte binary string expression:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n\nSELECT * FROM t1 WHERE a=X\'20010DB8000000000000FF0000428329\';\n +------------------------+\n | a |\n +------------------------+\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nWith an expression of another data type:\n\nSELECT * FROM t1 WHERE a=1;\nERROR 4078 (HY000): Illegal parameter data types inet6 and int for operation\n\'=\'\n\nMixing for Result Examples\n--------------------------\n\nMixed with another INET6 expression, returning an INET6 data type:\n\nCREATE OR REPLACE TABLE t1 (a INET6, b INET6);\n\nINSERT INTO t1 VALUES (NULL,\'2001:db8::ff00:42:8329\');\n\nSELECT a FROM t1 UNION SELECT b FROM t1;\n +------------------------+\n | a |\n +------------------------+\n | NULL |\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nSELECT COALESCE(a, b) FROM t1;\n +------------------------+\n | COALESCE(a, b) |\n +------------------------+\n | 2001:db8::ff00:42:8329 |\n +------------------------+\n\nMixed with a character string in text (short or long) address representation:\n\nCREATE OR REPLACE TABLE t1 (a INET6, b VARCHAR(64));\n\nINSERT INTO t1 VALUES (NULL,\'2001:db8::ff00:42:8328\');\n\nINSERT INTO t1 VALUES (NULL,\'2001:db8::ff00:42:832a garbage\');\n\nSELECT COALESCE(a,b) FROM t1;\n +------------------------+\n | COALESCE(a,b) |\n +------------------------+\n | 2001:db8::ff00:42:8328 |\n | NULL |\n +------------------------+\n 2 rows in set, 1 warning (0.001 sec)\n\nSHOW WARNINGS;\n\n+---------+------+---------------------------------------------------------+\n | Level | Code | Message\n|\n\n+---------+------+---------------------------------------------------------+\n | Warning | 1292 | Incorrect inet6 value: \'2001:db8::ff00:42:832a garbage\'\n|\n\n+---------+------+---------------------------------------------------------+\n\nMixed with a 16-byte binary string:\n\nCREATE OR REPLACE TABLE t1 (a INET6, b VARBINARY(16));\n\nINSERT INTO t1 VALUES (NULL,CONCAT(0xFFFF,REPEAT(0x0000,6),0xFFFF));\n\nINSERT INTO t1 VALUES (NULL,0x00/*garbage*/);\n\nSELECT COALESCE(a,b) FROM t1;\n +---------------+\n | COALESCE(a,b) |\n +---------------+\n | ffff::ffff |\n | NULL |\n +---------------+\n 2 rows in set, 1 warning (0.001 sec)\n\nSHOW WARNINGS;\n +---------+------+-------------------------------+\n | Level | Code | Message |\n +---------+------+-------------------------------+\n | Warning | 1292 | Incorrect inet6 value: \'\\x00\' |\n +---------+------+-------------------------------+\n\nMixing with other data types:\n\nSELECT CAST(\'ffff::ffff\' AS INET6) UNION SELECT 1;\nERROR 4078 (HY000): Illegal parameter data types inet6 and int for operation\n\'UNION\'\n\nFunctions and Operators Examples\n--------------------------------\n\nHEX with an INET6 argument returning a hexadecimal representation:\n\nSELECT HEX(CAST(\'2001:db8::ff00:42:8329\' AS INET6));\n +----------------------------------------------+\n | HEX(CAST(\'2001:db8::ff00:42:8329\' AS INET6)) |\n +----------------------------------------------+\n | 20010DB8000000000000FF0000428329 |\n +----------------------------------------------+\n\nINET6_ATON now understands INET6 values as an argument:\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n\nSELECT a, HEX(INET6_ATON(a)) FROM t1;\n +------------------------+----------------------------------+\n | a | HEX(INET6_ATON(a)) |\n +------------------------+----------------------------------+\n | 2001:db8::ff00:42:8329 | 20010DB8000000000000FF0000428329 |\n +------------------------+----------------------------------+\n\nIS_IPV4_COMPAT and IS_IPV4_MAPPED prototype now a BINARY(16)):\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\n INSERT INTO t1 VALUES (\'::ffff:192.168.0.1\');\n INSERT INTO t1 VALUES (\'::192.168.0.1\');\n\nSELECT a, IS_IPV4_MAPPED(a), IS_IPV4_COMPAT(a) FROM t1;\n +------------------------+-------------------+-------------------+\n | a | IS_IPV4_MAPPED(a) | IS_IPV4_COMPAT(a) |\n +------------------------+-------------------+-------------------+\n | 2001:db8::ff00:42:8329 | 0 | 0 |\n | ::ffff:192.168.0.1 | 1 | 0 |\n | ::192.168.0.1 | 0 | 1 |\n +------------------------+-------------------+-------------------+\n\nAutomatic implicit CAST to INET6:\n\nCREATE OR REPLACE TABLE t1 (\n a INET6,\n b VARCHAR(39) DEFAULT a\n );\n\nINSERT INTO t1 (a) VALUES (\'ffff::ffff\'),(\'::ffff:192.168.0.1\');\n\nSELECT a, IS_IPV4_MAPPED(a), b, IS_IPV4_MAPPED(b) FROM t1;\n\n+--------------------+-------------------+--------------------+----------------\n--+\n | a | IS_IPV4_MAPPED(a) | b |\nIS_IPV4_MAPPED(b) |\n\n+--------------------+-------------------+--------------------+----------------\n--+\n | ffff::ffff | 0 | ffff::ffff |\n 0 |\n | ::ffff:192.168.0.1 | 1 | ::ffff:192.168.0.1 |\n 1 |\n\n+--------------------+-------------------+--------------------+----------------\n--+\n\nCREATE OR REPLACE TABLE t1 (\n a INET6,\n b BINARY(16) DEFAULT UNHEX(HEX(a))\n );\n\nINSERT INTO t1 (a) VALUES (\'ffff::ffff\'),(\'::ffff:192.168.0.1\');\n\nSELECT a, IS_IPV4_MAPPED(a), HEX(b), IS_IPV4_MAPPED(b) FROM t1;\n\n+--------------------+-------------------+----------------------------------+--\n----------------+\n | a | IS_IPV4_MAPPED(a) | HEX(b)\n | IS_IPV4_MAPPED(b) |\n\n+--------------------+-------------------+----------------------------------+--\n----------------+\n | ffff::ffff | 0 |\nFFFF000000000000000000000000FFFF | 0 |\n | ::ffff:192.168.0.1 | 1 |\n00000000000000000000FFFFC0A80001 | 1 |\n\n+--------------------+-------------------+----------------------------------+--\n----------------+\n\nPrepared Statement Parameters Examples\n--------------------------------------\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nEXECUTE IMMEDIATE \'INSERT INTO t1 VALUES (?)\' USING \'ffff::fffe\';\nEXECUTE IMMEDIATE \'INSERT INTO t1 VALUES (?)\' USING\nX\'FFFF000000000000000000000000FFFF\';\n\nSELECT * FROM t1;\n+------------+\n| a |\n+------------+\n| ffff::fffe |\n| ffff::ffff |\n+------------+\n\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING \'ffff::fffe\';\n+------------+\n| a |\n+------------+\n| ffff::fffe |\n+------------+\n\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING','','https://mariadb.com/kb/en/inet6/');
+update help_topic set description = CONCAT(description, '\nX\'FFFF000000000000000000000000FFFF\';\n+------------+\n| a |\n+------------+\n| ffff::ffff |\n+------------+\n\nMigration between BINARY(16) and INET6 Examples\n-----------------------------------------------\n\nBefore MariaDB 10.5:\n\nCREATE OR REPLACE TABLE t1 (a BINARY(16));\n\nINSERT INTO t1 VALUES (INET6_ATON(\'ffff::ffff\'));\n\nSELECT INET6_NTOA(a) FROM t1;\n+---------------+\n| INET6_NTOA(a) |\n+---------------+\n| ffff::ffff |\n+---------------+\n\nMigrating to INET6, from MariaDB 10.5:\n\nALTER TABLE t1 MODIFY a INET6;\n\nINSERT INTO t1 VALUES (\'ffff::fffe\');\n\nSELECT * FROM t1;\n+------------+\n| a |\n+------------+\n| ffff::ffff |\n| ffff::fffe |\n+------------+\n\nMigration from INET6 to BINARY(16):\n\nCREATE OR REPLACE TABLE t1 (a INET6);\n\nINSERT INTO t1 VALUES (\'2001:db8::ff00:42:8329\');\nINSERT INTO t1 VALUES (\'::ffff:192.168.0.1\');\nINSERT INTO t1 VALUES (\'::192.168.0.1\');\n\nALTER TABLE t1 MODIFY a BINARY(16);\n\nSELECT INET6_NTOA(a) FROM t1;\n+------------------------+\n| INET6_NTOA(a) |\n+------------------------+\n| 2001:db8::ff00:42:8329 |\n| ::ffff:192.168.0.1 |\n| ::192.168.0.1 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/inet6/') WHERE help_topic_id = 275;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (276,23,'JSON Data Type','MariaDB starting with 10.2.7\n----------------------------\nThe JSON alias was added in MariaDB 10.2.7. This was done to make it possible\nto use JSON columns in statement based replication from MySQL to MariaDB and\nto make it possible for MariaDB to read mysqldumps from MySQL.\n\nJSON is an alias for LONGTEXT introduced for compatibility reasons with\nMySQL\'s JSON data type. MariaDB implements this as a LONGTEXT rather, as the\nJSON data type contradicts the SQL standard, and MariaDB\'s benchmarks indicate\nthat performance is at least equivalent.\n\nIn order to ensure that a a valid json document is inserted, the JSON_VALID\nfunction can be used as a CHECK constraint. This constraint is automatically\nincluded for types using the JSON alias from MariaDB 10.4.3.\n\nExamples\n--------\n\nCREATE TABLE t (j JSON);\n\nDESC t;\n+-------+----------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+----------+------+-----+---------+-------+\n| j | longtext | YES | | NULL | |\n+-------+----------+------+-----+---------+-------+\n\nWith validation:\n\nCREATE TABLE t2 (\n j JSON\n CHECK (JSON_VALID(j))\n);\n\nINSERT INTO t2 VALUES (\'invalid\');\nERROR 4025 (23000): CONSTRAINT `j` failed for `test`.`t2`\n\nINSERT INTO t2 VALUES (\'{\"id\": 1, \"name\": \"Monty\"}\');\nQuery OK, 1 row affected (0.13 sec)\n\nReplicating JSON Data Between MySQL and MariaDB\n-----------------------------------------------\n\nThe JSON type in MySQL stores the JSON object in a compact form, not as\nLONGTEXT as in MariaDB. This means that row based replication will not work\nfor JSON types from MySQL to MariaDB.\n\nThere are a a few different ways to solve this:\n\n* Use statement based replication.\n* Change the JSON column to type TEXT in MySQL\n* If you must use row-based replication and cannot change the MySQL master\nfrom JSON to TEXT, you can try to introduce an intermediate MySQL slave and\nchange the column type from JSON to TEXT on it. Then you replicate from this\nintermediate slave to MariaDB.\n\nConverting a MySQL TABLE with JSON Fields to MariaDB\n----------------------------------------------------\n\nMariaDB can\'t directly access MySQL\'s JSON format.\n\nThere are a a few different ways to move the table to MariaDB:\n\n* From MariaDB 10.5.7, see the you can use the mysql_json plugin. See Making\nMariaDB understand MySQL JSON.\n* Change the JSON column to type TEXT in MySQL. After this, MariaDB can\ndirectly use the table without any need for a dump and restore.\n* Use mariadb-dump/mysqldump to copy the table.\n\nDifferences Between MySQL JSON Strings and MariaDB JSON Strings\n---------------------------------------------------------------\n\n* In MySQL, JSON is an object and is compared according to json values. In\nMariaDB JSON strings are normal strings and compared as strings. One exception\nis when using JSON_EXTRACT() in which case strings are unescaped before\ncomparison.\n\nURL: https://mariadb.com/kb/en/json-data-type/','','https://mariadb.com/kb/en/json-data-type/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (277,23,'MEDIUMBLOB','Syntax\n------\n\nMEDIUMBLOB\n\nDescription\n-----------\n\nA BLOB column with a maximum length of 16,777,215 (224 - 1) bytes. Each\nMEDIUMBLOB value is stored using a three-byte length prefix that indicates the\nnumber of bytes in the value.\n\nURL: https://mariadb.com/kb/en/mediumblob/','','https://mariadb.com/kb/en/mediumblob/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (278,23,'MEDIUMTEXT','Syntax\n------\n\nMEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA TEXT column with a maximum length of 16,777,215 (224 - 1) characters. The\neffective maximum length is less if the value contains multi-byte characters.\nEach MEDIUMTEXT value is stored using a three-byte length prefix that\nindicates the number of bytes in the value.\n\nURL: https://mariadb.com/kb/en/mediumtext/','','https://mariadb.com/kb/en/mediumtext/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (279,23,'LONGBLOB','Syntax\n------\n\nLONGBLOB\n\nDescription\n-----------\n\nA BLOB column with a maximum length of 4,294,967,295 bytes or 4GB (232 - 1).\nThe effective maximum length of LONGBLOB columns depends on the configured\nmaximum packet size in the client/server protocol and available memory. Each\nLONGBLOB value is stored using a four-byte length prefix that indicates the\nnumber of bytes in the value.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, BLOB is a synonym for LONGBLOB.\n\nURL: https://mariadb.com/kb/en/longblob/','','https://mariadb.com/kb/en/longblob/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (280,23,'LONGTEXT','Syntax\n------\n\nLONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA TEXT column with a maximum length of 4,294,967,295 or 4GB (232 - 1)\ncharacters. The effective maximum length is less if the value contains\nmulti-byte characters. The effective maximum length of LONGTEXT columns also\ndepends on the configured maximum packet size in the client/server protocol\nand available memory. Each LONGTEXT value is stored using a four-byte length\nprefix that indicates the number of bytes in the value.\n\nFrom MariaDB 10.2.7, JSON is an alias for LONGTEXT. See JSON Data Type for\ndetails.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, CLOB is a synonym for LONGTEXT.\n\nURL: https://mariadb.com/kb/en/longtext/','','https://mariadb.com/kb/en/longtext/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (281,23,'ROW','MariaDB starting with 10.3.0\n----------------------------\nThe ROW data type was introduced in MariaDB 10.3.0.\n\nSyntax\n------\n\nROW (<field name> <data type> [{, <field name> <data type>}... ])\n\nDescription\n-----------\n\nROW is a data type for stored procedure variables.\n\nFeatures\n--------\n\nROW fields as normal variables\n------------------------------\n\nROW fields (members) act as normal variables, and are able to appear in all\nquery parts where a stored procedure variable is allowed:\n\n* Assignment is using the := operator and the SET command:\n\na.x:= 10;\na.x:= b.x;\nSET a.x= 10, a.y=20, a.z= b.z;\n\n* Passing to functions and operators:\n\nSELECT f1(rec.a), rec.a<10;\n\n* Clauses (select list, WHERE, HAVING, LIMIT, etc...,):\n\nSELECT var.a, t1.b FROM t1 WHERE t1.b=var.b LIMIT var.c;\n\n* INSERT values:\n\nINSERT INTO t1 VALUES (rec.a, rec.b, rec.c);\n\n* SELECT .. INTO targets\n\nSELECT a,b INTO rec.a, rec.b FROM t1 WHERE t1.id=10;\n\n* Dynamic SQL out parameters (EXECUTE and EXECUTE IMMEDIATE)\n\nEXECUTE IMMEDIATE \'CALL proc_with_out_param(?)\' USING rec.a;\n\nROW type variables as FETCH targets\n-----------------------------------\n\nROW type variables are allowed as FETCH targets:\n\nFETCH cur INTO rec;\n\nwhere cur is a CURSOR and rec is a ROW type stored procedure variable.\n\nNote, currently an attempt to use FETCH for a ROW type variable returns this\nerror:\n\nERROR 1328 (HY000): Incorrect number of FETCH variables\n\nFETCH from a cursor cur into a ROW variable rec works as follows:\n\n* The number of fields in cur must match the number of fields in rec.\n Otherwise, an error is reported.\n\n* Assignment is done from left to right. The first cursor field is assigned to\n the first variable field, the second cursor field is assigned to the second\n variable field, etc.\n\n* Field names in rec are not important and can differ from field names\n in cur.\n\nSee FETCH Examples (below) for examples of using this with sql_mode=ORACLE and\nsql_mode=DEFAULT.\n\nROW type variables as SELECT...INTO targets\n-------------------------------------------\n\nROW type variables are allowed as SELECT..INTO targets with some differences\ndepending on which sql_mode is in use.\n\n* When using sql_mode=ORACLE, table%ROWTYPE and cursor%ROWTYPE\n variables can be used as SELECT...INTO targets.\n\n* Using multiple ROW variables in the SELECT..INTO list will report an\n error.\n\n* Using ROW variables with a different column count than in\n the SELECT..INTO list will report an error.\n\nSee SELECT...INTO Examples (below) for examples of using this with\nsql_mode=ORACLE and sql_mode=DEFAULT.\n\nFeatures not implemented\n------------------------\n\nThe following features are planned, but not implemented yet:\n\n* Returning a ROW type expression from a stored function (see MDEV-12252).\nThis will need some grammar change to support field names after parentheses:\n\nSELECT f1().x FROM DUAL;\n\n* Returning a ROW type expression from a built-in hybrid type function, such\nas CASE, IF, etc. \n* ROW of ROWs\n\nExamples\n--------\n\nDeclaring a ROW in a stored procedure\n-------------------------------------\n\nDELIMITER $$\nCREATE PROCEDURE p1()\nBEGIN\n DECLARE r ROW (c1 INT, c2 VARCHAR(10));\n SET r.c1= 10;\n SET r.c2= \'test\';\n INSERT INTO t1 VALUES (r.c1, r.c2);\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nFETCH Examples\n--------------\n\nA complete FETCH example for sql_mode=ORACLE:\n\nDROP TABLE IF EXISTS t1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nINSERT INTO t1 VALUES (20,\'b20\');\nINSERT INTO t1 VALUES (30,\'b30\');\n\nSET sql_mode=oracle;\nDROP PROCEDURE IF EXISTS p1;\nDELIMITER $$\nCREATE PROCEDURE p1 AS\n rec ROW(a INT, b VARCHAR(32));\n CURSOR c IS SELECT a,b FROM t1;\nBEGIN\n OPEN c;\n LOOP\n FETCH c INTO rec;\n EXIT WHEN c%NOTFOUND;\n SELECT (\'rec=(\' || rec.a ||\',\'|| rec.b||\')\');\n END LOOP;\n CLOSE c;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nA complete FETCH example for sql_mode=DEFAULT:\n\nDROP TABLE IF EXISTS t1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nINSERT INTO t1 VALUES (20,\'b20\');\nINSERT INTO t1 VALUES (30,\'b30\');\n\nSET sql_mode=DEFAULT;\nDROP PROCEDURE IF EXISTS p1;\nDELIMITER $$\nCREATE PROCEDURE p1()\nBEGIN\n DECLARE done INT DEFAULT FALSE;\n DECLARE rec ROW(a INT, b VARCHAR(32));\n DECLARE c CURSOR FOR SELECT a,b FROM t1;\n DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;\n OPEN c;\nread_loop:\n LOOP\n FETCH c INTO rec;\n IF done THEN\n LEAVE read_loop;\n END IF;\n SELECT CONCAT(\'rec=(\',rec.a,\',\',rec.b,\')\');\n END LOOP;\n CLOSE c;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nSELECT...INTO Examples\n----------------------\n\nA SELECT...INTO example for sql_mode=DEFAULT:\n\nSET sql_mode=DEFAULT;\nDROP TABLE IF EXISTS t1;\nDROP PROCEDURE IF EXISTS p1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nDELIMITER $$\nCREATE PROCEDURE p1()\nBEGIN\n DECLARE rec1 ROW(a INT, b VARCHAR(32));\n SELECT * FROM t1 INTO rec1;\n SELECT rec1.a, rec1.b;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nThe above example returns:\n\n+--------+--------+\n| rec1.a | rec1.b |\n+--------+--------+\n| 10 | b10 |\n+--------+--------+\n\nA SELECT...INTO example for sql_mode=ORACLE:\n\nSET sql_mode=ORACLE;\nDROP TABLE IF EXISTS t1;\nDROP PROCEDURE IF EXISTS p1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nDELIMITER $$\nCREATE PROCEDURE p1 AS\n rec1 ROW(a INT, b VARCHAR(32));\nBEGIN\n SELECT * FROM t1 INTO rec1;\n SELECT rec1.a, rec1.b;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nThe above example returns:\n\n+--------+--------+\n| rec1.a | rec1.b |\n+--------+--------+\n| 10 | b10 |\n+--------+--------+\n\nAn example for sql_mode=ORACLE using table%ROWTYPE variables as SELECT..INTO\ntargets:\n\nSET sql_mode=ORACLE;\nDROP TABLE IF EXISTS t1;\nDROP PROCEDURE IF EXISTS p1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nDELIMITER $$\nCREATE PROCEDURE p1 AS\n rec1 t1%ROWTYPE;\nBEGIN\n SELECT * FROM t1 INTO rec1;\n SELECT rec1.a, rec1.b;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nThe above example returns:\n\n+--------+--------+\n| rec1.a | rec1.b |\n+--------+--------+\n| 10 | b10 |\n+--------+--------+\n\nAn example for sql_mode=ORACLE using cursor%ROWTYPE variables as SELECT..INTO\ntargets:\n\nSET sql_mode=ORACLE;\nDROP TABLE IF EXISTS t1;\nDROP PROCEDURE IF EXISTS p1;\nCREATE TABLE t1 (a INT, b VARCHAR(32));\nINSERT INTO t1 VALUES (10,\'b10\');\nDELIMITER $$\nCREATE PROCEDURE p1 AS\n CURSOR cur1 IS SELECT * FROM t1;\n rec1 cur1%ROWTYPE;\nBEGIN\n SELECT * FROM t1 INTO rec1;\n SELECT rec1.a, rec1.b;\nEND;\n$$\nDELIMITER ;\nCALL p1();\n\nThe above example returns:\n\n+--------+--------+\n| rec1.a | rec1.b |\n+--------+--------+\n| 10 | b10 |\n+--------+--------+\n\nURL: https://mariadb.com/kb/en/row/','','https://mariadb.com/kb/en/row/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (282,23,'TEXT','Syntax\n------\n\nTEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA TEXT column with a maximum length of 65,535 (216 - 1) characters. The\neffective maximum length is less if the value contains multi-byte characters.\nEach TEXT value is stored using a two-byte length prefix that indicates the\nnumber of bytes in the value. If you need a bigger storage, consider using\nMEDIUMTEXT instead.\n\nAn optional length M can be given for this type. If this is done, MariaDB\ncreates the column as the smallest TEXT type large enough to hold values M\ncharacters long.\n\nBefore MariaDB 10.2, all MariaDB collations were of type PADSPACE, meaning\nthat TEXT (as well as VARCHAR and CHAR values) are compared without regard for\ntrailing spaces. This does not apply to the LIKE pattern-matching operator,\nwhich takes into account trailing spaces.\n\nBefore MariaDB 10.2.1, BLOB and TEXT columns could not be assigned a DEFAULT\nvalue. This restriction was lifted in MariaDB 10.2.1.\n\nExamples\n--------\n\nTrailing spaces:\n\nCREATE TABLE strtest (d TEXT(10));\nINSERT INTO strtest VALUES(\'Maria \');\n\nSELECT d=\'Maria\',d=\'Maria \' FROM strtest;\n+-----------+--------------+\n| d=\'Maria\' | d=\'Maria \' |\n+-----------+--------------+\n| 1 | 1 |\n+-----------+--------------+\n\nSELECT d LIKE \'Maria\',d LIKE \'Maria \' FROM strtest;\n+----------------+-------------------+\n| d LIKE \'Maria\' | d LIKE \'Maria \' |\n+----------------+-------------------+\n| 0 | 1 |\n+----------------+-------------------+\n\nIndexing\n--------\n\nTEXT columns can only be indexed over a specified length. This means that they\ncannot be used as the primary key of a table norm until MariaDB 10.4, can a\nunique index be created on them.\n\nMariaDB starting with 10.4\n--------------------------\nStarting with MariaDB 10.4, a unique index can be created on a TEXT column.\n\nInternally, this uses hash indexing to quickly check the values and if a hash\ncollision is found, the actual stored values are compared in order to retain\nthe uniqueness.\n\nDifference between VARCHAR and TEXT\n-----------------------------------\n\n* VARCHAR columns can be fully indexed. TEXT columns can only be indexed over\na specified length.\n* Using TEXT or BLOB in a SELECT query that uses temporary tables for storing\nintermediate results will force the temporary table to be disk based (using\nthe Aria storage engine instead of the memory storage engine, which is a bit\nslower. This is not that bad as the Aria storage engine caches the rows in\nmemory. To get the benefit of this, one should ensure that the\naria_pagecache_buffer_size variable is big enough to hold most of the row and\nindex data for temporary tables.\n\nFor Storage Engine Developers\n-----------------------------\n\n* Internally the full length of the VARCHAR column is allocated inside each\nTABLE objects record[] structure. As there are three such buffers, each open\ntable will allocate 3 times max-length-to-store-varchar bytes of memory.\n* TEXT and BLOB columns are stored with a pointer (4 or 8 bytes) + a 1-4 bytes\nlength. The TEXT data is only stored once. This means that internally TEXT\nuses less memory for each open table but instead has the additional overhead\nthat each TEXT object needs to be allocated and freed for each row access\n(with some caching in between).\n\nURL: https://mariadb.com/kb/en/text/','','https://mariadb.com/kb/en/text/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (283,23,'TINYBLOB','Syntax\n------\n\nTINYBLOB\n\nDescription\n-----------\n\nA BLOB column with a maximum length of 255 (28 - 1) bytes. Each TINYBLOB value\nis stored using a one-byte length prefix that indicates the number of bytes in\nthe value.\n\nURL: https://mariadb.com/kb/en/tinyblob/','','https://mariadb.com/kb/en/tinyblob/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (284,23,'TINYTEXT','Syntax\n------\n\nTINYTEXT [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA TEXT column with a maximum length of 255 (28 - 1) characters. The effective\nmaximum length is less if the value contains multi-byte characters. Each\nTINYTEXT value is stored using a one-byte length prefix that indicates the\nnumber of bytes in the value.\n\nURL: https://mariadb.com/kb/en/tinytext/','','https://mariadb.com/kb/en/tinytext/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (285,23,'VARBINARY','Syntax\n------\n\nVARBINARY(M)\n\nDescription\n-----------\n\nThe VARBINARY type is similar to the VARCHAR type, but stores binary byte\nstrings rather than non-binary character strings. M represents the maximum\ncolumn length in bytes.\n\nIt contains no character set, and comparison and sorting are based on the\nnumeric value of the bytes.\n\nIf the maximum length is exceeded, and SQL strict mode is not enabled , the\nextra characters will be dropped with a warning. If strict mode is enabled, an\nerror will occur.\n\nUnlike BINARY values, VARBINARYs are not right-padded when inserting.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, RAW is a synonym for VARBINARY.\n\nExamples\n--------\n\nInserting too many characters, first with strict mode off, then with it on:\n\nCREATE TABLE varbins (a VARBINARY(10));\n\nINSERT INTO varbins VALUES(\'12345678901\');\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n\nSELECT * FROM varbins;\n+------------+\n| a |\n+------------+\n| 1234567890 |\n+------------+\n\nSET sql_mode=\'STRICT_ALL_TABLES\';\n\nINSERT INTO varbins VALUES(\'12345678901\');\nERROR 1406 (22001): Data too long for column \'a\' at row 1\n\nSorting is performed with the byte value:\n\nTRUNCATE varbins;\n\nINSERT INTO varbins VALUES(\'A\'),(\'B\'),(\'a\'),(\'b\');\n\nSELECT * FROM varbins ORDER BY a;\n+------+\n| a |\n+------+\n| A |\n| B |\n| a |\n| b |\n+------+\n\nUsing CAST to sort as a CHAR instead:\n\nSELECT * FROM varbins ORDER BY CAST(a AS CHAR);\n+------+\n| a |\n+------+\n| a |\n| A |\n| b |\n| B |\n+------+\n\nURL: https://mariadb.com/kb/en/varbinary/','','https://mariadb.com/kb/en/varbinary/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (286,23,'VARCHAR','Syntax\n------\n\n[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]\n\nDescription\n-----------\n\nA variable-length string. M represents the maximum column length in\ncharacters. The range of M is 0 to 65,532. The effective maximum length of a\nVARCHAR is subject to the maximum row size and the character set used. For\nexample, utf8 characters can require up to three bytes per character, so a\nVARCHAR column that uses the utf8 character set can be declared to be a\nmaximum of 21,844 characters.\n\nNote: For the ColumnStore engine, M represents the maximum column length in\nbytes.\n\nMariaDB stores VARCHAR values as a one-byte or two-byte length prefix plus\ndata. The length prefix indicates the number of bytes in the value. A VARCHAR\ncolumn uses one length byte if values require no more than 255 bytes, two\nlength bytes if values may require more than 255 bytes.\n\nMariaDB follows the standard SQL specification, and does not remove trailing\nspaces from VARCHAR values.\n\nVARCHAR(0) columns can contain 2 values: an empty string or NULL. Such columns\ncannot be part of an index. The CONNECT storage engine does not support\nVARCHAR(0).\n\nVARCHAR is shorthand for CHARACTER VARYING. NATIONAL VARCHAR is the standard\nSQL way to define that a VARCHAR column should use some predefined character\nset. MariaDB uses utf8 as this predefined character set, as does MySQL 4.1 and\nup. NVARCHAR is shorthand for NATIONAL VARCHAR.\n\nBefore MariaDB 10.2, all MariaDB collations were of type PADSPACE, meaning\nthat VARCHAR (as well as CHAR and TEXT values) are compared without regard for\ntrailing spaces. This does not apply to the LIKE pattern-matching operator,\nwhich takes into account trailing spaces. From MariaDB 10.2, a number of NO\nPAD collations are available.\n\nIf a unique index consists of a column where trailing pad characters are\nstripped or ignored, inserts into that column where values differ only by the\nnumber of trailing pad characters will result in a duplicate-key error.\n\nExamples\n--------\n\nThe following are equivalent:\n\nVARCHAR(30) CHARACTER SET utf8\nNATIONAL VARCHAR(30)\nNVARCHAR(30)\nNCHAR VARCHAR(30)\nNATIONAL CHARACTER VARYING(30)\nNATIONAL CHAR VARYING(30)\n\nTrailing spaces:\n\nCREATE TABLE strtest (v VARCHAR(10));\nINSERT INTO strtest VALUES(\'Maria \');\n\nSELECT v=\'Maria\',v=\'Maria \' FROM strtest;\n+-----------+--------------+\n| v=\'Maria\' | v=\'Maria \' |\n+-----------+--------------+\n| 1 | 1 |\n+-----------+--------------+\n\nSELECT v LIKE \'Maria\',v LIKE \'Maria \' FROM strtest;\n+----------------+-------------------+\n| v LIKE \'Maria\' | v LIKE \'Maria \' |\n+----------------+-------------------+\n| 0 | 1 |\n+----------------+-------------------+\n\nTruncation\n----------\n\n* Depending on whether or not strict sql mode is set, you will either get a\nwarning or an error if you try to insert a string that is too long into a\nVARCHAR column. If the extra characters are spaces, the spaces that can\'t fit\nwill be removed and you will always get a warning, regardless of the sql mode\nsetting.\n\nDifference Between VARCHAR and TEXT\n-----------------------------------\n\n* VARCHAR columns can be fully indexed. TEXT columns can only be indexed over\na specified length.\n* Using TEXT or BLOB in a SELECT query that uses temporary tables for storing\nintermediate results will force the temporary table to be disk based (using\nthe Aria storage engine instead of the memory storage engine, which is a bit\nslower. This is not that bad as the Aria storage engine caches the rows in\nmemory. To get the benefit of this, one should ensure that the\naria_pagecache_buffer_size variable is big enough to hold most of the row and\nindex data for temporary tables.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, VARCHAR2 is a synonym.\n\nFor Storage Engine Developers\n-----------------------------\n\n* Internally the full length of the VARCHAR column is allocated inside each\nTABLE objects record[] structure. As there are three such buffers, each open\ntable will allocate 3 times max-length-to-store-varchar bytes of memory.\n* TEXT and BLOB columns are stored with a pointer (4 or 8 bytes) + a 1-4 bytes\nlength. The TEXT data is only stored once. This means that internally TEXT\nuses less memory for each open table but instead has the additional overhead\nthat each TEXT object needs to be allocated and freed for each row access\n(with some caching in between).\n\nURL: https://mariadb.com/kb/en/varchar/','','https://mariadb.com/kb/en/varchar/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (287,23,'SET Data Type','Syntax\n------\n\nSET(\'value1\',\'value2\',...) [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n\nDescription\n-----------\n\nA set. A string object that can have zero or more values, each of which must\nbe chosen from the list of values \'value1\', \'value2\', ... A SET column can\nhave a maximum of 64 members. SET values are represented internally as\nintegers.\n\nSET values cannot contain commas.\n\nIf a SET contains duplicate values, an error will be returned if strict mode\nis enabled, or a warning if strict mode is not enabled.\n\nURL: https://mariadb.com/kb/en/set-data-type/','','https://mariadb.com/kb/en/set-data-type/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (288,23,'UUID Data Type','MariaDB starting with 10.7.0\n----------------------------\nThe UUID data type was added in a MariaDB 10.7.0 preview.\n\nSyntax\n------\n\nUUID\n\nDescription\n-----------\n\nThe UUID data type is intended for the storage of 128-bit UUID (Universally\nUnique Identifier) data. See the UUID function page for more details on UUIDs\nthemselves.\n\nRetrieval\n---------\n\nData retrieved by this data type is in the string representation defined in\nRFC4122.\n\nCasting\n-------\n\nString literals of hexadecimal characters and CHAR/VARCHAR/TEXT can be cast to\nthe UUID data type. Likewise hexadecimal literals, binary-literals, and\nBINARY/VARBINARY/BLOB types can also be cast to UUID.\n\nThe data type will not accept a short UUID generated with the UUID_SHORT\nfunction, but will accept a value without the - character generated by the\nSYS_GUID function (or inserted directly). Hyphens can be partially omitted as\nwell, or included after any group of two digits.\n\nThe type does not accept UUIDs in braces, permitted by some implementations.\n\nStorage\n-------\n\nUUID are stored in an index friendly manner, the order of a UUID of\nllllllll-mmmm-Vhhh-vsss-nnnnnnnnnnnn is stored as:\n\nnnnnnnnnnnnn-vsss-Vhhh-mmmm-llllllll\n\nThis provides a sorting order, if a UUIDv1 (node and timestamp) is used, of\nthe node, followed by the timestamp.\n\nExamples\n--------\n\nCREATE TABLE t1 (id UUID);\n\nDirectly Inserting via string literals:\n\nINSERT INTO t1 VALUES(\'123e4567-e89b-12d3-a456-426655440000\');\n\nDirectly Inserting via hexadecimal literals:\n\nINSERT INTO t1 VALUES (x\'fffffffffffffffffffffffffffffffe\');\n\nGenerating and inserting via the UUID function.\n\nINSERT INTO t1 VALUES (UUID());\n\nRetrieval:\n\nSELECT * FROM t1;\n+--------------------------------------+\n| id |\n+--------------------------------------+\n| 123e4567-e89b-12d3-a456-426655440000 |\n| ffffffff-ffff-ffff-ffff-fffffffffffe |\n| 93aac041-1a14-11ec-ab4e-f859713e4be4 |\n+--------------------------------------+\n\nThe UUID_SHORT function does not generate valid full-length UUID:\n\nINSERT INTO t1 VALUES (UUID_SHORT());\nERROR 1292 (22007): Incorrect uuid value: \'99440417627439104\' \n for column `test`.`t1`.`id` at row 1\n\nAccepting a value without the - character, either directly or generated by the\nSYS_GUID function:\n\nINSERT INTO t1 VALUES (SYS_GUID());\n\nSELECT * FROM t1;\n+--------------------------------------+\n| id |\n+--------------------------------------+\n| 123e4567-e89b-12d3-a456-426655440000 |\n| ffffffff-ffff-ffff-ffff-fffffffffffe |\n| 93aac041-1a14-11ec-ab4e-f859713e4be4 |\n| ea0368d3-1a14-11ec-ab4e-f859713e4be4 |\n+--------------------------------------+\n\nSELECT SYS_GUID();\n+----------------------------------+\n| SYS_GUID() |\n+----------------------------------+\n| ff5b6bcc1a1411ecab4ef859713e4be4 |\n+----------------------------------+\n\nINSERT INTO t1 VALUES (\'ff5b6bcc1a1411ecab4ef859713e4be4\');\n\nSELECT * FROM t1;\n+--------------------------------------+\n| id |\n+--------------------------------------+\n| 123e4567-e89b-12d3-a456-426655440000 |\n| ffffffff-ffff-ffff-ffff-fffffffffffe |\n| 93aac041-1a14-11ec-ab4e-f859713e4be4 |\n| ea0368d3-1a14-11ec-ab4e-f859713e4be4 |\n| ff5b6bcc-1a14-11ec-ab4e-f859713e4be4 |\n+--------------------------------------+\n\nValid and invalid hyphen and brace usage:\n\nTRUNCATE t1;\n\nINSERT INTO t1 VALUES (\'f8aa-ed66-1a1b-11ec-ab4e-f859-713e-4be4\');\n\nINSERT INTO t1 VALUES (\'1b80667f1a1c-11ecab4ef859713e4be4\');\n\nINSERT INTO t1 VALUES (\'2fd6c945-1a-1c-11ec-ab4e-f859713e4be4\');\n\nINSERT INTO t1 VALUES (\'49-c9-f9-59-1a-1c-11ec-ab4e-f859713e4be4\');\n\nINSERT INTO t1 VALUES (\'57-96-da-c1-1a-1c-11-ec-ab-4e-f8-59-71-3e-4b-e4\');\n\nINSERT INTO t1 VALUES (\'6-eb74f8f-1a1c-11ec-ab4e-f859713e4be4\');\n\nINSERT INTO t1 VALUES (\'{29bad136-1a1d-11ec-ab4e-f859713e4be4}\');\nERROR 1292 (22007): Incorrect uuid value:\n\'{29bad136-1a1d-11ec-ab4e-f859713e4be4}\' \n for column `test`.`t1`.`id` at row 1\n\nSELECT * FROM t1;\n+--------------------------------------+\n| id |\n+--------------------------------------+\n| f8aaed66-1a1b-11ec-ab4e-f859713e4be4 |\n| 1b80667f-1a1c-11ec-ab4e-f859713e4be4 |\n| 2fd6c945-1a1c-11ec-ab4e-f859713e4be4 |\n| 49c9f959-1a1c-11ec-ab4e-f859713e4be4 |\n| 5796dac1-1a1c-11ec-ab4e-f859713e4be4 |\n| 6eb74f8f-1a1c-11ec-ab4e-f859713e4be4 |\n+--------------------------------------+\n\nURL: https://mariadb.com/kb/en/uuid-data-type/','','https://mariadb.com/kb/en/uuid-data-type/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (289,23,'DATE','Syntax\n------\n\nDATE\n\nDescription\n-----------\n\nA date. The supported range is \'1000-01-01\' to \'9999-12-31\'. MariaDB displays\nDATE values in \'YYYY-MM-DD\' format, but can be assigned dates in looser\nformats, including strings or numbers, as long as they make sense. These\ninclude a short year, YY-MM-DD, no delimiters, YYMMDD, or any other acceptable\ndelimiter, for example YYYY/MM/DD. For details, see date and time literals.\n\n\'0000-00-00\' is a permitted special value (zero-date), unless the NO_ZERO_DATE\nSQL_MODE is used. Also, individual components of a date can be set to 0 (for\nexample: \'2015-00-12\'), unless the NO_ZERO_IN_DATE SQL_MODE is used. In many\ncases, the result of en expression involving a zero-date, or a date with\nzero-parts, is NULL. If the ALLOW_INVALID_DATES SQL_MODE is enabled, if the\nday part is in the range between 1 and 31, the date does not produce any\nerror, even for months that have less than 31 days.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, DATE with a time portion is a synonym for\nDATETIME. See also mariadb_schema.\n\nExamples\n--------\n\nCREATE TABLE t1 (d DATE);\n\nINSERT INTO t1 VALUES (\"2010-01-12\"), (\"2011-2-28\"), (\'120314\'),(\'13*04*21\');\n\nSELECT * FROM t1;\n+------------+\n| d |\n+------------+\n| 2010-01-12 |\n| 2011-02-28 |\n| 2012-03-14 |\n| 2013-04-21 |\n+------------+\n\nURL: https://mariadb.com/kb/en/date/','','https://mariadb.com/kb/en/date/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (290,23,'TIME','Syntax\n------\n\nTIME [(<microsecond precision>)]\n\nDescription\n-----------\n\nA time. The range is \'-838:59:59.999999\' to \'838:59:59.999999\'. Microsecond\nprecision can be from 0-6; if not specified 0 is used. Microseconds have been\navailable since MariaDB 5.3.\n\nMariaDB displays TIME values in \'HH:MM:SS.ssssss\' format, but allows\nassignment of times in looser formats, including \'D HH:MM:SS\', \'HH:MM:SS\',\n\'HH:MM\', \'D HH:MM\', \'D HH\', \'SS\', or \'HHMMSS\', as well as permitting dropping\nof any leading zeros when a delimiter is provided, for example \'3:9:10\'. For\ndetails, see date and time literals.\n\nMariaDB starting with 10.1.2\n----------------------------\nMariaDB 10.1.2 introduced the --mysql56-temporal-format option, on by default,\nwhich allows MariaDB to store TIMEs using the same low-level format MySQL 5.6\nuses.\n\nInternal Format\n---------------\n\nIn MariaDB 10.1.2 a new temporal format was introduced from MySQL 5.6 that\nalters how the TIME, DATETIME and TIMESTAMP columns operate at lower levels.\nThese changes allow these temporal data types to have fractional parts and\nnegative values. You can disable this feature using the\nmysql56_temporal_format system variable.\n\nTables that include TIMESTAMP values that were created on an older version of\nMariaDB or that were created while the mysql56_temporal_format system variable\nwas disabled continue to store data using the older data type format.\n\nIn order to update table columns from the older format to the newer format,\nexecute an ALTER TABLE... MODIFY COLUMN statement that changes the column to\nthe *same* data type. This change may be needed if you want to export the\ntable\'s tablespace and import it onto a server that has\nmysql56_temporal_format=ON set (see MDEV-15225).\n\nFor instance, if you have a TIME column in your table:\n\nSHOW VARIABLES LIKE \'mysql56_temporal_format\';\n\n+-------------------------+-------+\n| Variable_name | Value |\n+-------------------------+-------+\n| mysql56_temporal_format | ON |\n+-------------------------+-------+\n\nALTER TABLE example_table MODIFY ts_col TIME;\n\nWhen MariaDB executes the ALTER TABLE statement, it converts the data from the\nolder temporal format to the newer one.\n\nIn the event that you have several tables and columns using temporal data\ntypes that you want to switch over to the new format, make sure the system\nvariable is enabled, then perform a dump and restore using mysqldump. The\ncolumns using relevant temporal data types are restored using the new temporal\nformat.\n\nStarting from MariaDB 10.5.1 columns with old temporal formats are marked with\na /* mariadb-5.3 */ comment in the output of SHOW CREATE TABLE, SHOW COLUMNS,\nDESCRIBE statements, as well as in the COLUMN_TYPE column of the\nINFORMATION_SCHEMA.COLUMNS Table.\n\nSHOW CREATE TABLE mariadb5312_time\\G\n*************************** 1. row ***************************\n Table: mariadb5312_time\nCreate Table: CREATE TABLE `mariadb5312_time` (\n `t0` time /* mariadb-5.3 */ DEFAULT NULL,\n `t6` time(6) /* mariadb-5.3 */ DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=latin1\n\nNote, columns with the current format are not marked with a comment.\n\nExamples\n--------\n\nINSERT INTO time VALUES (\'90:00:00\'), (\'800:00:00\'), (800), (22), (151413),\n(\'9:6:3\'), (\'12 09\');\n\nSELECT * FROM time;\n+-----------+\n| t |\n+-----------+\n| 90:00:00 |\n| 800:00:00 |\n| 00:08:00 |\n| 00:00:22 |\n| 15:14:13 |\n| 09:06:03 |\n| 297:00:00 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/time/','','https://mariadb.com/kb/en/time/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (291,23,'DATETIME','Syntax\n------\n\nDATETIME [(microsecond precision)]\n\nDescription\n-----------\n\nA date and time combination.\n\nMariaDB displays DATETIME values in \'YYYY-MM-DD HH:MM:SS.ffffff\' format, but\nallows assignment of values to DATETIME columns using either strings or\nnumbers. For details, see date and time literals.\n\nDATETIME columns also accept CURRENT_TIMESTAMP as the default value.\n\nMariaDB 10.1.2 introduced the --mysql56-temporal-format option, on by default,\nwhich allows MariaDB to store DATETMEs using the same low-level format MySQL\n5.6 uses. For more information, see Internal Format, below.\n\nFor storage requirements, see Data Type Storage Requirements.\n\nSupported Values\n----------------\n\nMariaDB stores values that use the DATETIME data type in a format that\nsupports values between 1000-01-01 00:00:00.000000 and 9999-12-31\n23:59:59.999999.\n\nMariaDB can also store microseconds with a precision between 0 and 6. If no\nmicrosecond precision is specified, then 0 is used by default.\n\nMariaDB also supports \'0000-00-00\' as a special zero-date value, unless\nNO_ZERO_DATE is specified in the SQL_MODE. Similarly, individual components of\na date can be set to 0 (for example: \'2015-00-12\'), unless NO_ZERO_IN_DATE is\nspecified in the SQL_MODE. In many cases, the result of en expression\ninvolving a zero-date, or a date with zero-parts, is NULL. If the\nALLOW_INVALID_DATES SQL_MODE is enabled, if the day part is in the range\nbetween 1 and 31, the date does not produce any error, even for months that\nhave less than 31 days.\n\nTime Zones\n----------\n\nIf a column uses the DATETIME data type, then any inserted values are stored\nas-is, so no automatic time zone conversions are performed.\n\nMariaDB also does not currently support time zone literals that contain time\nzone identifiers. See MDEV-11829 for more information.\n\nMariaDB validates DATETIME literals against the session\'s time zone. For\nexample, if a specific time range never occurred in a specific time zone due\nto daylight savings time, then DATETIME values within that range would be\ninvalid for that time zone.\n\nFor example, daylight savings time started on March 10, 2019 in the US, so the\ntime range between 02:00:00 and 02:59:59 is invalid for that day in US time\nzones:\n\nSET time_zone = \'America/New_York\';\nQuery OK, 0 rows affected (0.000 sec)\n\nINSERT INTO timestamp_test VALUES (\'2019-03-10 02:55:05\');\nERROR 1292 (22007): Incorrect datetime value: \'2019-03-10 02:55:05\' for column\n`db1`.`timestamp_test`.`timestamp_test` at row 1\n\nBut that same time range is fine in other time zones, such as Coordinated\nUniversal Time (UTC). For example:\n\nSET time_zone = \'UTC\';\nQuery OK, 0 rows affected (0.000 sec)\n\nINSERT INTO timestamp_test VALUES (\'2019-03-10 02:55:05\');\nQuery OK, 1 row affected (0.002 sec)\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, DATE with a time portion is a synonym for\nDATETIME. See also mariadb_schema.\n\nInternal Format\n---------------\n\nIn MariaDB 10.1.2 a new temporal format was introduced from MySQL 5.6 that\nalters how the TIME, DATETIME and TIMESTAMP columns operate at lower levels.\nThese changes allow these temporal data types to have fractional parts and\nnegative values. You can disable this feature using the\nmysql56_temporal_format system variable.\n\nTables that include TIMESTAMP values that were created on an older version of\nMariaDB or that were created while the mysql56_temporal_format system variable\nwas disabled continue to store data using the older data type format.\n\nIn order to update table columns from the older format to the newer format,\nexecute an ALTER TABLE... MODIFY COLUMN statement that changes the column to\nthe *same* data type. This change may be needed if you want to export the\ntable\'s tablespace and import it onto a server that has\nmysql56_temporal_format=ON set (see MDEV-15225).\n\nFor instance, if you have a DATETIME column in your table:\n\nSHOW VARIABLES LIKE \'mysql56_temporal_format\';\n\n+-------------------------+-------+\n| Variable_name | Value |\n+-------------------------+-------+\n| mysql56_temporal_format | ON |\n+-------------------------+-------+\n\nALTER TABLE example_table MODIFY ts_col DATETIME;\n\nWhen MariaDB executes the ALTER TABLE statement, it converts the data from the\nolder temporal format to the newer one.\n\nIn the event that you have several tables and columns using temporal data\ntypes that you want to switch over to the new format, make sure the system\nvariable is enabled, then perform a dump and restore using mysqldump. The\ncolumns using relevant temporal data types are restored using the new temporal\nformat.\n\nStarting from MariaDB 10.5.1 columns with old temporal formats are marked with\na /* mariadb-5.3 */ comment in the output of SHOW CREATE TABLE, SHOW COLUMNS,\nDESCRIBE statements, as well as in the COLUMN_TYPE column of the\nINFORMATION_SCHEMA.COLUMNS Table.\n\nSHOW CREATE TABLE mariadb5312_datetime\\G\n*************************** 1. row ***************************\n Table: mariadb5312_datetime\nCreate Table: CREATE TABLE `mariadb5312_datetime` (\n `dt0` datetime /* mariadb-5.3 */ DEFAULT NULL,\n `dt6` datetime(6) /* mariadb-5.3 */ DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=latin1\n\nExamples\n--------\n\nCREATE TABLE t1 (d DATETIME);\n\nINSERT INTO t1 VALUES (\"2011-03-11\"), (\"2012-04-19 13:08:22\"),\n (\"2013-07-18 13:44:22.123456\");\n\nSELECT * FROM t1;\n+---------------------+\n| d |\n+---------------------+\n| 2011-03-11 00:00:00 |\n| 2012-04-19 13:08:22 |\n| 2013-07-18 13:44:22 |\n+---------------------+\n\nCREATE TABLE t2 (d DATETIME(6));\n\nINSERT INTO t2 VALUES (\"2011-03-11\"), (\"2012-04-19 13:08:22\"),\n (\"2013-07-18 13:44:22.123456\");\n\nSELECT * FROM t2;\n+----------------------------+\n| d |\n+----------------------------+\n| 2011-03-11 00:00:00.000000 |\n| 2012-04-19 13:08:22.000000 |\n| 2013-07-18 13:44:22.123456 |\n+----------------------------++\n\nStrings used in datetime context are automatically converted to datetime(6).\nIf you want to have a datetime without seconds, you should use\nCONVERT(..,datetime).\n\nSELECT CONVERT(\'2007-11-30 10:30:19\',datetime);\n+-----------------------------------------+\n| CONVERT(\'2007-11-30 10:30:19\',datetime) |\n+-----------------------------------------+\n| 2007-11-30 10:30:19 |\n+-----------------------------------------+\n\nSELECT CONVERT(\'2007-11-30 10:30:19\',datetime(6));\n+--------------------------------------------+\n| CONVERT(\'2007-11-30 10:30:19\',datetime(6)) |\n+--------------------------------------------+\n| 2007-11-30 10:30:19.000000 |\n+--------------------------------------------+\n\nURL: https://mariadb.com/kb/en/datetime/','','https://mariadb.com/kb/en/datetime/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (292,23,'TIMESTAMP','Syntax\n------\n\nTIMESTAMP [(<microsecond precision)]\n\nDescription\n-----------\n\nA timestamp in the format YYYY-MM-DD HH:MM:SS.ffffff.\n\nThe timestamp field is generally used to define at which moment in time a row\nwas added or updated and by default will automatically be assigned the current\ndatetime when a record is inserted or updated. The automatic properties only\napply to the first TIMESTAMP in the record; subsequent TIMESTAMP columns will\nnot be changed.\n\nMariaDB includes the --mysql56-temporal-format option, on by default, which\nallows MariaDB to store TIMESTAMPs using the same low-level format MySQL 5.6\nuses.\n\nFor more information, see Internal Format.\n\nSupported Values\n----------------\n\nMariaDB stores values that use the TIMESTAMP data type as the number of\nseconds since \'1970-01-01 00:00:00\' (UTC). This means that the TIMESTAMP data\ntype can hold values between \'1970-01-01 00:00:01\' (UTC) and \'2038-01-19\n03:14:07\' (UTC).\n\nMariaDB can also store microseconds with a precision between 0 and 6. If no\nmicrosecond precision is specified, then 0 is used by default.\n\nAutomatic Values\n----------------\n\nMariaDB has special behavior for the first column that uses the TIMESTAMP data\ntype in a specific table. For the first column that uses the TIMESTAMP data\ntype in a specific table, MariaDB automatically assigns the following\nproperties to the column:\n\n* DEFAULT CURRENT_TIMESTAMP\n* ON UPDATE CURRENT_TIMESTAMP\n\nThis means that if the column is not explicitly assigned a value in an INSERT\nor UPDATE query, then MariaDB will automatically initialize the column\'s value\nwith the current date and time.\n\nThis automatic initialization for INSERT and UPDATE queries can also be\nexplicitly enabled for a column that uses the TIMESTAMP data type by\nspecifying the DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP\nclauses for the column. In these clauses, any synonym of CURRENT_TIMESTAMP is\naccepted, including CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(),\nLOCALTIMESTAMP, and LOCALTIMESTAMP().\n\nThis automatic initialization for INSERT queries can also be explicitly\ndisabled for a column that uses the TIMESTAMP data type by specifying a\nconstant DEFAULT value. For example, DEFAULT 0.\n\nThis automatic initialization for UPDATE queries can also be explicitly\ndisabled for a column that uses the TIMESTAMP data type by specifying a\nDEFAULT clause for the column, but no ON UPDATE clause. If a DEFAULT clause is\nexplicitly specified for a column that uses the TIMESTAMP data type, but an ON\nUPDATE clause is not specified for the column, then the timestamp value will\nnot automatically change when an UPDATE statement is executed.\n\nMariaDB also has special behavior if NULL is assigned to column that uses the\nTIMESTAMP data type. If the column is assigned the NULL value in an INSERT or\nUPDATE query, then MariaDB will automatically initialize the column\'s value\nwith the current date and time. For details, see NULL values in MariaDB.\n\nThis automatic initialization for NULL values can also be explicitly disabled\nfor a column that uses the TIMESTAMP data type by specifying the NULL\nattribute for the column. In this case, if the column\'s value is set to NULL,\nthen the column\'s value will actually be set to NULL.\n\nTime Zones\n----------\n\nIf a column uses the TIMESTAMP data type, then any inserted values are\nconverted from the session\'s time zone to Coordinated Universal Time (UTC)\nwhen stored, and converted back to the session\'s time zone when retrieved.\n\nMariaDB does not currently store any time zone identifier with the value of\nthe TIMESTAMP data type. See MDEV-10018 for more information.\n\nMariaDB does not currently support time zone literals that contain time zone\nidentifiers. See MDEV-11829 for more information.\n\nLimitations\n-----------\n\n* Because the TIMESTAMP value is stored as Epoch Seconds, the timestamp value\n\'1970-01-01 00:00:00\' (UTC) is reserved since the second #0 is used to\nrepresent \'0000-00-00 00:00:00\'.\n* In MariaDB 5.5 and before there could only be one TIMESTAMP column per table\nthat had CURRENT_TIMESTAMP defined as its default value. This limit has no\nlonger applied since MariaDB 10.0.\n\nSQL_MODE=MAXDB\n--------------\n\nIf the SQL_MODE is set to MAXDB, TIMESTAMP fields will be silently converted\nto DATETIME.\n\nInternal Format\n---------------\n\nIn MariaDB 10.1.2 a new temporal format was introduced from MySQL 5.6 that\nalters how the TIME, DATETIME and TIMESTAMP columns operate at lower levels.\nThese changes allow these temporal data types to have fractional parts and\nnegative values. You can disable this feature using the\nmysql56_temporal_format system variable.\n\nTables that include TIMESTAMP values that were created on an older version of\nMariaDB or that were created while the mysql56_temporal_format system variable\nwas disabled continue to store data using the older data type format.\n\nIn order to update table columns from the older format to the newer format,\nexecute an ALTER TABLE... MODIFY COLUMN statement that changes the column to\nthe *same* data type. This change may be needed if you want to export the\ntable\'s tablespace and import it onto a server that has\nmysql56_temporal_format=ON set (see MDEV-15225).\n\nFor instance, if you have a TIMESTAMP column in your table:\n\nSHOW VARIABLES LIKE \'mysql56_temporal_format\';\n\n+-------------------------+-------+\n| Variable_name | Value |\n+-------------------------+-------+\n| mysql56_temporal_format | ON |\n+-------------------------+-------+\n\nALTER TABLE example_table MODIFY ts_col TIMESTAMP;\n\nWhen MariaDB executes the ALTER TABLE statement, it converts the data from the\nolder temporal format to the newer one.\n\nIn the event that you have several tables and columns using temporal data\ntypes that you want to switch over to the new format, make sure the system\nvariable is enabled, then perform a dump and restore using mysqldump. The\ncolumns using relevant temporal data types are restored using the new temporal\nformat.\n\nStarting from MariaDB 10.5.1 columns with old temporal formats are marked with\na /* mariadb-5.3 */ comment in the output of SHOW CREATE TABLE, SHOW COLUMNS,\nDESCRIBE statements, as well as in the COLUMN_TYPE column of the\nINFORMATION_SCHEMA.COLUMNS Table.\n\nSHOW CREATE TABLE mariadb5312_timestamp\\G\n*************************** 1. row ***************************\n Table: mariadb5312_timestamp\nCreate Table: CREATE TABLE `mariadb5312_timestamp` (\n `ts0` timestamp /* mariadb-5.3 */ NOT NULL DEFAULT current_timestamp() ON\nUPDATE current_timestamp(),\n `ts6` timestamp(6) /* mariadb-5.3 */ NOT NULL DEFAULT \'0000-00-00\n00:00:00.000000\'\n) ENGINE=MyISAM DEFAULT CHARSET=latin1\n\nNote: Prior to MySQL 4.1 a different format for the TIMESTAMP datatype was\nused. This format is unsupported in MariaDB 5.1 and upwards.\n\nExamples\n--------\n\nCREATE TABLE t (id INT, ts TIMESTAMP);\n\nDESC t;\n+-------+-----------+------+-----+-------------------+-------------------------\n---+\n| Field | Type | Null | Key | Default | Extra \n |\n+-------+-----------+------+-----+-------------------+-------------------------\n---+\n| id | int(11) | YES | | NULL | \n |\n| ts | timestamp | NO | | CURRENT_TIMESTAMP | on update\nCURRENT_TIMESTAMP |\n+-------+-----------+------+-----+-------------------+-------------------------\n---+\n\nINSERT INTO t(id) VALUES (1),(2);\n\nSELECT * FROM t;\n+------+---------------------+\n| id | ts |\n+------+---------------------+\n| 1 | 2013-07-22 12:50:05 |\n| 2 | 2013-07-22 12:50:05 |\n+------+---------------------+\n\nINSERT INTO t VALUES (3,NULL),(4,\'2001-07-22 12:12:12\');\n\nSELECT * FROM t;\n+------+---------------------+\n| id | ts |\n+------+---------------------+\n| 1 | 2013-07-22 12:50:05 |\n| 2 | 2013-07-22 12:50:05 |\n| 3 | 2013-07-22 12:51:56 |\n| 4 | 2001-07-22 12:12:12 |\n+------+---------------------+\n\nConverting to Unix epoch:\n\nSELECT ts, UNIX_TIMESTAMP(ts) FROM t;\n+---------------------+--------------------+\n| ts | UNIX_TIMESTAMP(ts) |\n+---------------------+--------------------+\n| 2013-07-22 12:50:05 | 1374490205 |\n| 2013-07-22 12:50:05 | 1374490205 |\n| 2013-07-22 12:51:56 | 1374490316 |\n| 2001-07-22 12:12:12 | 995796732 |\n+---------------------+--------------------+\n\nUpdate also changes the timestamp:\n\nUPDATE t set id=5 WHERE id=1;\n\nSELECT * FROM t;\n+------+---------------------+\n| id | ts |\n+------+---------------------+\n| 5 | 2013-07-22 14:52:33 |\n| 2 | 2013-07-22 12:50:05 |\n| 3 | 2013-07-22 12:51:56 |\n| 4 | 2001-07-22 12:12:12 |\n+------+---------------------+\n\nDefault NULL:\n\nCREATE TABLE t2 (id INT, ts TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP);\n\nINSERT INTO t(id) VALUES (1),(2);\n\nSELECT * FROM t2;\n\nINSERT INTO t2(id) VALUES (1),(2);\n\nSELECT * FROM t2;\n+------+------+\n| id | ts |\n+------+------+\n| 1 | NULL |\n| 2 | NULL |\n+------+------+\n\nUPDATE t2 SET id=3 WHERE id=1;\n\nSELECT * FROM t2;\n+------+---------------------+\n| id | ts |\n+------+---------------------+\n| 3 | 2013-07-22 15:32:22 |\n| 2 | NULL |\n+------+---------------------+\n\nOnly the first timestamp is automatically inserted and updated:\n\nCREATE TABLE t3 (id INT, ts1 TIMESTAMP, ts2 TIMESTAMP);\n\nINSERT INTO t3(id) VALUES (1),(2);\n\nSELECT * FROM t3;\n+------+---------------------+---------------------+\n| id | ts1 | ts2 |\n+------+---------------------+---------------------+\n| 1 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |\n| 2 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |\n+------+---------------------+---------------------+\n\nDESC t3;\n+-------+-----------+------+-----+---------------------+-----------------------\n-----+\n| Field | Type | Null | Key | Default | Extra \n |\n+-------+-----------+------+-----+---------------------+-----------------------\n-----+\n| id | int(11) | YES | | NULL | \n |\n| ts1 | timestamp | NO | | CURRENT_TIMESTAMP | on update\nCURRENT_TIMESTAMP |\n| ts2 | timestamp | NO | | 0000-00-00 00:00:00 | \n |\n+-------+-----------+------+-----+---------------------+-----------------------\n-----+\n\nExplicitly setting a timestamp with the CURRENT_TIMESTAMP function:\n\nINSERT INTO t3(id,ts2) VALUES (3,CURRENT_TIMESTAMP());\n\nSELECT * FROM t3;\n+------+---------------------+---------------------+\n| id | ts1 | ts2 |\n+------+---------------------+---------------------+\n| 1 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |\n| 2 | 2013-07-22 15:35:07 | 0000-00-00 00:00:00 |\n| 3 | 2013-07-22 15:38:52 | 2013-07-22 15:38:52 |\n+------+---------------------+---------------------+\n\nSpecifying the timestamp as NOT NULL:\n\nCREATE TABLE t4 (id INT, ts TIMESTAMP NOT NULL);\n\nINSERT INTO t4(id) VALUES (1);\nSELECT SLEEP(1);\nINSERT INTO t4(id,ts) VALUES (2,NULL);\n\nSELECT * FROM t4;\n\nURL: https://mariadb.com/kb/en/timestamp/','','https://mariadb.com/kb/en/timestamp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (293,23,'YEAR Data Type','Syntax\n------\n\nYEAR[(4)]\n\nDescription\n-----------\n\nA year in two-digit or four-digit format. The default is four-digit format.\nNote that the two-digit format has been deprecated since MariaDB 5.5.27.\n\nIn four-digit format, the allowable values are 1901 to 2155, and 0000. In\ntwo-digit format, the allowable values are 70 to 69, representing years from\n1970 to 2069. MariaDB displays YEAR values in YYYY format, but allows you to\nassign values to YEAR columns using either strings or numbers.\n\nInserting numeric zero has a different result for YEAR(4) and YEAR(2). For\nYEAR(2), the value 00 reflects the year 2000. For YEAR(4), the value 0000\nreflects the year zero. This only applies to numeric zero. String zero always\nreflects the year 2000.\n\nExamples\n--------\n\nAccepting a string or a number:\n\nCREATE TABLE y(y YEAR);\n\nINSERT INTO y VALUES (1990),(\'2012\');\n\nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n+------+\n\nWith strict_mode set, the default from MariaDB 10.2.4:\n\nOut of range:\n\nINSERT INTO y VALUES (1005),(\'3080\');\nERROR 1264 (22003): Out of range value for column \'y\' at row 1\n\nINSERT INTO y VALUES (\'2013-12-12\');\nERROR 1265 (01000): Data truncated for column \'y\' at row 1\n\nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n+------+\n\nWith strict_mode unset, the default until MariaDB 10.2.3:\n\nOut of range:\n\nINSERT INTO y VALUES (1005),(\'3080\');\nQuery OK, 2 rows affected, 2 warnings (0.05 sec)\nRecords: 2 Duplicates: 0 Warnings: 2\n\nSHOW WARNINGS;\n+---------+------+--------------------------------------------+\n| Level | Code | Message |\n+---------+------+--------------------------------------------+\n| Warning | 1264 | Out of range value for column \'y\' at row 1 |\n| Warning | 1264 | Out of range value for column \'y\' at row 2 |\n+---------+------+--------------------------------------------+\n\nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n| 0000 |\n| 0000 |\n+------+\n\nTruncating:\n\nINSERT INTO y VALUES (\'2013-12-12\');\nQuery OK, 1 row affected, 1 warning (0.05 sec)\n\nSHOW WARNINGS;\n+---------+------+----------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------+\n| Warning | 1265 | Data truncated for column \'y\' at row 1 |\n+---------+------+----------------------------------------+\n\nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n| 0000 |\n| 0000 |\n| 2013 |\n+------+\n\nDifference between YEAR(2) and YEAR(4), and string and numeric zero:\n\nCREATE TABLE y2(y YEAR(4), y2 YEAR(2));\nQuery OK, 0 rows affected, 1 warning (0.40 sec)\n\nNote (Code 1287): \'YEAR(2)\' is deprecated and will be removed in a future\nrelease. \n Please use YEAR(4) instead\n\nINSERT INTO y2 VALUES(0,0),(\'0\',\'0\');\n\nSELECT YEAR(y),YEAR(y2) FROM y2;\n+---------+----------+\n| YEAR(y) | YEAR(y2) |\n+---------+----------+\n| 0 | 2000 |\n| 2000 | 2000 |\n+---------+----------+\n\nURL: https://mariadb.com/kb/en/year-data-type/','','https://mariadb.com/kb/en/year-data-type/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (294,23,'AUTO_INCREMENT','Description\n-----------\n\nThe AUTO_INCREMENT attribute can be used to generate a unique identity for new\nrows. When you insert a new record to the table (or upon adding an\nAUTO_INCREMENT attribute with the ALTER TABLE statement), and the\nauto_increment field is NULL or DEFAULT (in the case of an INSERT), the value\nwill automatically be incremented. This also applies to 0, unless the\nNO_AUTO_VALUE_ON_ZERO SQL_MODE is enabled.\n\nAUTO_INCREMENT columns start from 1 by default. The automatically generated\nvalue can never be lower than 0.\n\nEach table can have only one AUTO_INCREMENT column. It must defined as a key\n(not necessarily the PRIMARY KEY or UNIQUE key). In some storage engines\n(including the default InnoDB), if the key consists of multiple columns, the\nAUTO_INCREMENT column must be the first column. Storage engines that permit\nthe column to be placed elsewhere are Aria, MyISAM, MERGE, Spider, TokuDB,\nBLACKHOLE, FederatedX and Federated.\n\nCREATE TABLE animals (\n id MEDIUMINT NOT NULL AUTO_INCREMENT,\n name CHAR(30) NOT NULL,\n PRIMARY KEY (id)\n );\n\nINSERT INTO animals (name) VALUES\n (\'dog\'),(\'cat\'),(\'penguin\'),\n (\'fox\'),(\'whale\'),(\'ostrich\');\n\nSELECT * FROM animals;\n+----+---------+\n| id | name |\n+----+---------+\n| 1 | dog |\n| 2 | cat |\n| 3 | penguin |\n| 4 | fox |\n| 5 | whale |\n| 6 | ostrich |\n+----+---------+\n\nSERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.\n\nCREATE TABLE t (id SERIAL, c CHAR(1)) ENGINE=InnoDB;\n\nSHOW CREATE TABLE t \\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\n `c` char(1) DEFAULT NULL,\n UNIQUE KEY `id` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nSetting or Changing the Auto_Increment Value\n--------------------------------------------\n\nYou can use an ALTER TABLE statement to assign a new value to the\nauto_increment table option, or set the insert_id server system variable to\nchange the next AUTO_INCREMENT value inserted by the current session.\n\nLAST_INSERT_ID() can be used to see the last AUTO_INCREMENT value inserted by\nthe current session.\n\nALTER TABLE animals AUTO_INCREMENT=8;\n\nINSERT INTO animals (name) VALUES (\'aardvark\');\n\nSELECT * FROM animals;\n+----+-----------+\n| id | name |\n+----+-----------+\n| 1 | dog |\n| 2 | cat |\n| 3 | penguin |\n| 4 | fox |\n| 5 | whale |\n| 6 | ostrich |\n| 8 | aardvark |\n+----+-----------+\n\nSET insert_id=12;\n\nINSERT INTO animals (name) VALUES (\'gorilla\');\n\nSELECT * FROM animals;\n+----+-----------+\n| id | name |\n+----+-----------+\n| 1 | dog |\n| 2 | cat |\n| 3 | penguin |\n| 4 | fox |\n| 5 | whale |\n| 6 | ostrich |\n| 8 | aardvark |\n| 12 | gorilla |\n+----+-----------+\n\nInnoDB\n------\n\nUntil MariaDB 10.2.3, InnoDB used an auto-increment counter that is stored in\nmemory. When the server restarts, the counter is re-initialized to the highest\nvalue used in the table, which cancels the effects of any AUTO_INCREMENT = N\noption in the table statements.\n\nFrom MariaDB 10.2.4, this restriction has been lifted and AUTO_INCREMENT is\npersistent.\n\nSee also AUTO_INCREMENT Handling in InnoDB.\n\nSetting Explicit Values\n-----------------------\n\nIt is possible to specify a value for an AUTO_INCREMENT column. If the key is\nprimary or unique, the value must not already exist in the key.\n\nIf the new value is higher than the current maximum value, the AUTO_INCREMENT\nvalue is updated, so the next value will be higher. If the new value is lower\nthan the current maximum value, the AUTO_INCREMENT value remains unchanged.\n\nThe following example demonstrates these behaviors:\n\nCREATE TABLE t (id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE =\nInnoDB;\n\nINSERT INTO t VALUES (NULL);\nSELECT id FROM t;\n+----+\n| id |\n+----+\n| 1 |\n+----+\n\nINSERT INTO t VALUES (10); -- higher value\nSELECT id FROM t;\n+----+\n| id |\n+----+\n| 1 |\n| 10 |\n+----+\n\nINSERT INTO t VALUES (2); -- lower value\nINSERT INTO t VALUES (NULL); -- auto value\nSELECT id FROM t;\n+----+\n| id |\n+----+\n| 1 |\n| 2 |\n| 10 |\n| 11 |\n+----+\n\nThe ARCHIVE storage engine does not allow to insert a value that is lower than\nthe current maximum.\n\nMissing Values\n--------------\n\nAn AUTO_INCREMENT column normally has missing values. This happens because if\na row is deleted, or an AUTO_INCREMENT value is explicitly updated, old values\nare never re-used. The REPLACE statement also deletes a row, and its value is\nwasted. With InnoDB, values can be reserved by a transaction; but if the\ntransaction fails (for example, because of a ROLLBACK) the reserved value will\nbe lost.\n\nThus AUTO_INCREMENT values can be used to sort results in a chronological\norder, but not to create a numeric sequence.\n\nReplication\n-----------\n\nTo make master-master or Galera safe to use AUTO_INCREMENT one should use the\nsystem variables auto_increment_increment and auto_increment_offset to\ngenerate unique values for each server.\n\nCHECK Constraints, DEFAULT Values and Virtual Columns\n-----------------------------------------------------\n\nMariaDB starting with 10.2.6\n----------------------------\nFrom MariaDB 10.2.6 auto_increment columns are no longer permitted in CHECK\nconstraints, DEFAULT value expressions and virtual columns. They were\npermitted in earlier versions, but did not work correctly. See MDEV-11117.\n\nGenerating Auto_Increment Values When Adding the Attribute\n----------------------------------------------------------\n\nCREATE OR REPLACE TABLE t1 (a INT);\nINSERT t1 VALUES (0),(0),(0);\nALTER TABLE t1 MODIFY a INT NOT NULL AUTO_INCREMENT PRIMARY KEY;\nSELECT * FROM t1;\n+---+\n| a |\n+---+\n| 1 |\n| 2 |\n| 3 |\n+---+\n\nCREATE OR REPLACE TABLE t1 (a INT);\nINSERT t1 VALUES (5),(0),(8),(0);\nALTER TABLE t1 MODIFY a INT NOT NULL AUTO_INCREMENT PRIMARY KEY;\nSELECT * FROM t1;\n+---+\n| a |\n+---+\n| 5 |\n| 6 |\n| 8 |\n| 9 |\n+---+\n\nIf the NO_AUTO_VALUE_ON_ZERO SQL_MODE is set, zero values will not be\nautomatically incremented:\n\nSET SQL_MODE=\'no_auto_value_on_zero\';\nCREATE OR REPLACE TABLE t1 (a INT);\nINSERT t1 VALUES (3), (0);\nALTER TABLE t1 MODIFY a INT NOT NULL AUTO_INCREMENT PRIMARY KEY;\nSELECT * FROM t1;\n+---+\n| a |\n+---+\n| 0 |\n| 3 |\n+---+\n\nURL: https://mariadb.com/kb/en/auto_increment/','','https://mariadb.com/kb/en/auto_increment/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (295,24,'Using Compound Statements Outside of Stored Programs','Compound statements can also be used outside of stored programs.\n\ndelimiter |\nIF @have_innodb THEN\n CREATE TABLE IF NOT EXISTS innodb_index_stats (\n database_name VARCHAR(64) NOT NULL,\n table_name VARCHAR(64) NOT NULL,\n index_name VARCHAR(64) NOT NULL,\n last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE\nCURRENT_TIMESTAMP,\n stat_name VARCHAR(64) NOT NULL,\n stat_value BIGINT UNSIGNED NOT NULL,\n sample_size BIGINT UNSIGNED,\n stat_description VARCHAR(1024) NOT NULL,\n PRIMARY KEY (database_name, table_name, index_name, stat_name)\n ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;\nEND IF|\nQuery OK, 0 rows affected, 2 warnings (0.00 sec)\n\nNote, that using compound statements this way is subject to following\nlimitations:\n\n* Only BEGIN, IF, CASE, LOOP, WHILE, REPEAT statements may start a compound\nstatement outside of stored programs.\n* BEGIN must use the BEGIN NOT ATOMIC syntax (otherwise it\'ll be confused with\nBEGIN that starts a transaction).\n* A compound statement might not start with a label.\n* A compound statement is parsed completely—note \"2 warnings\" in the above\nexample, even if the condition was false (InnoDB was, indeed, disabled), and\nthe CREATE TABLE statement was not executed, it was still parsed and the\nparser produced \"Unknown storage engine\" warning.\n\nInside a compound block first three limitations do not apply, one can use\nanything that can be used inside a stored program — including labels,\ncondition handlers, variables, and so on:\n\nBEGIN NOT ATOMIC\n DECLARE foo CONDITION FOR 1146;\n DECLARE x INT DEFAULT 0;\n DECLARE CONTINUE HANDLER FOR SET x=1;\n INSERT INTO test.t1 VALUES (\"hndlr1\", val, 2);\n END|\n\nExample how to use IF:\n\nIF (1>0) THEN BEGIN NOT ATOMIC SELECT 1; END ; END IF;;\n\nExample of how to use WHILE loop:\n\nDELIMITER |\nBEGIN NOT ATOMIC\n DECLARE x INT DEFAULT 0;\n WHILE x <= 10 DO\n SET x = x + 1;\n SELECT x;\n END WHILE;\nEND|\nDELIMITER ;\n\nURL:\nhttps://mariadb.com/kb/en/using-compound-statements-outside-of-stored-programs/','','https://mariadb.com/kb/en/using-compound-statements-outside-of-stored-programs/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (296,24,'BEGIN END','Syntax\n------\n\n[begin_label:] BEGIN [NOT ATOMIC]\n [statement_list]\nEND [end_label]\n\nNOT ATOMIC is required when used outside of a stored procedure. Inside stored\nprocedures or within an anonymous block, BEGIN alone starts a new anonymous\nblock.\n\nDescription\n-----------\n\nBEGIN ... END syntax is used for writing compound statements. A compound\nstatement can contain multiple statements, enclosed by the BEGIN and END\nkeywords. statement_list represents a list of one or more statements, each\nterminated by a semicolon (i.e., ;) statement delimiter. statement_list is\noptional, which means that the empty compound statement (BEGIN END) is legal.\n\nNote that END will perform a commit. If you are running in autocommit mode,\nevery statement will be committed separately. If you are not running in\nautocommit mode, you must execute a COMMIT or ROLLBACK after END to get the\ndatabase up to date.\n\nUse of multiple statements requires that a client is able to send statement\nstrings containing the ; statement delimiter. This is handled in the mysql\ncommand-line client with the DELIMITER command. Changing the ;\nend-of-statement delimiter (for example, to //) allows ; to be used in a\nprogram body.\n\nA compound statement within a stored program can be labeled. end_label cannot\nbe given unless begin_label also is present. If both are present, they must be\nthe same.\n\nBEGIN ... END constructs can be nested. Each block can define its own\nvariables, a CONDITION, a HANDLER and a CURSOR, which don\'t exist in the outer\nblocks. The most local declarations override the outer objects which use the\nsame name (see example below).\n\nThe declarations order is the following:\n\n* DECLARE local variables;\n* DECLARE CONDITIONs;\n* DECLARE CURSORs;\n* DECLARE HANDLERs;\n\nNote that DECLARE HANDLER contains another BEGIN ... END construct.\n\nHere is an example of a very simple, anonymous block:\n\nBEGIN NOT ATOMIC\nSET @a=1;\nCREATE TABLE test.t1(a INT);\nEND|\n\nBelow is an example of nested blocks in a stored procedure:\n\nCREATE PROCEDURE t( )\nBEGIN\n DECLARE x TINYINT UNSIGNED DEFAULT 1;\n BEGIN\n DECLARE x CHAR(2) DEFAULT \'02\';\n DECLARE y TINYINT UNSIGNED DEFAULT 10;\n SELECT x, y;\n END;\n SELECT x;\nEND;\n\nIn this example, a TINYINT variable, x is declared in the outter block. But in\nthe inner block x is re-declared as a CHAR and an y variable is declared. The\ninner SELECT shows the \"new\" value of x, and the value of y. But when x is\nselected in the outer block, the \"old\" value is returned. The final SELECT\ndoesn\'t try to read y, because it doesn\'t exist in that context.\n\nURL: https://mariadb.com/kb/en/begin-end/','','https://mariadb.com/kb/en/begin-end/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (297,24,'CASE Statement','Syntax\n------\n\nCASE case_value\n WHEN when_value THEN statement_list\n [WHEN when_value THEN statement_list] ...\n [ELSE statement_list]\nEND CASE\n\nOr:\n\nCASE\n WHEN search_condition THEN statement_list\n [WHEN search_condition THEN statement_list] ...\n [ELSE statement_list]\nEND CASE\n\nDescription\n-----------\n\nThe text on this page describes the CASE statement for stored programs. See\nthe CASE OPERATOR for details on the CASE operator outside of stored programs.\n\nThe CASE statement for stored programs implements a complex conditional\nconstruct. If a search_condition evaluates to true, the corresponding SQL\nstatement list is executed. If no search condition matches, the statement list\nin the ELSE clause is executed. Each statement_list consists of one or more\nstatements.\n\nThe CASE statement cannot have an ELSE NULL clause, and it is terminated with\nEND CASE instead of END. implements a complex conditional construct. If a\nsearch_condition evaluates to true, the corresponding SQL statement list is\nexecuted. If no search condition matches, the statement list in the ELSE\nclause is executed. Each statement_list consists of one or more statements.\n\nIf no when_value or search_condition matches the value tested and the CASE\nstatement contains no ELSE clause, a Case not found for CASE statement error\nresults.\n\nEach statement_list consists of one or more statements; an empty\nstatement_list is not allowed. To handle situations where no value is matched\nby any WHEN clause, use an ELSE containing an empty BEGIN ... END block, as\nshown in this example:\n\nDELIMITER |\nCREATE PROCEDURE p()\nBEGIN\n DECLARE v INT DEFAULT 1;\n CASE v\n WHEN 2 THEN SELECT v;\n WHEN 3 THEN SELECT 0;\n ELSE BEGIN END;\n END CASE;\nEND;\n|\n\nThe indentation used here in the ELSE clause is for purposes of clarity only,\nand is not otherwise significant. See Delimiters in the mysql client for more\non the use of the delimiter command.\n\nNote: The syntax of the CASE statement used inside stored programs differs\nslightly from that of the SQL CASE expression described in CASE OPERATOR. The\nCASE statement cannot have an ELSE NULL clause, and it is terminated with END\nCASE instead of END.\n\nURL: https://mariadb.com/kb/en/case-statement/','','https://mariadb.com/kb/en/case-statement/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (298,24,'DECLARE CONDITION','Syntax\n------\n\nDECLARE condition_name CONDITION FOR condition_value\n\ncondition_value:\n SQLSTATE [VALUE] sqlstate_value\n | mysql_error_code\n\nDescription\n-----------\n\nThe DECLARE ... CONDITION statement defines a named error condition. It\nspecifies a condition that needs specific handling and associates a name with\nthat condition. Later, the name can be used in a DECLARE ... HANDLER, SIGNAL\nor RESIGNAL statement (as long as the statement is located in the same BEGIN\n... END block).\n\nConditions must be declared after local variables, but before CURSORs and\nHANDLERs.\n\nA condition_value for DECLARE ... CONDITION can be an SQLSTATE value (a\n5-character string literal) or a MySQL error code (a number). You should not\nuse SQLSTATE value \'00000\' or MySQL error code 0, because those indicate\nsucess rather than an error condition. If you try, or if you specify an\ninvalid SQLSTATE value, an error like this is produced:\n\nERROR 1407 (42000): Bad SQLSTATE: \'00000\'\n\nFor a list of SQLSTATE values and MariaDB error codes, see MariaDB Error Codes.\n\nURL: https://mariadb.com/kb/en/declare-condition/','','https://mariadb.com/kb/en/declare-condition/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (299,24,'DECLARE HANDLER','Syntax\n------\n\nDECLARE handler_type HANDLER\n FOR condition_value [, condition_value] ...\n statement\n\nhandler_type:\n CONTINUE\n | EXIT\n | UNDO\n\ncondition_value:\n SQLSTATE [VALUE] sqlstate_value\n | condition_name\n | SQLWARNING\n | NOT FOUND\n | SQLEXCEPTION\n | mariadb_error_code\n\nDescription\n-----------\n\nThe DECLARE ... HANDLER statement specifies handlers that each may deal with\none or more conditions. If one of these conditions occurs, the specified\nstatement is executed. statement can be a simple statement (for example, SET\nvar_name = value), or it can be a compound statement written using BEGIN and\nEND.\n\nHandlers must be declared after local variables, a CONDITION and a CURSOR.\n\nFor a CONTINUE handler, execution of the current program continues after\nexecution of the handler statement. For an EXIT handler, execution terminates\nfor the BEGIN ... END compound statement in which the handler is declared.\n(This is true even if the condition occurs in an inner block.) The UNDO\nhandler type statement is not supported.\n\nIf a condition occurs for which no handler has been declared, the default\naction is EXIT.\n\nA condition_value for DECLARE ... HANDLER can be any of the following values:\n\n* An SQLSTATE value (a 5-character string literal) or a MariaDB error\ncode (a number). You should not use SQLSTATE value \'00000\' or MariaDB\nerror code 0, because those indicate sucess rather than an error\ncondition. For a list of SQLSTATE values and MariaDB error codes, see\nMariaDB Error Codes.\n* A condition name previously specified with DECLARE ... CONDITION. It must be\nin the same stored program. See DECLARE CONDITION.\n* SQLWARNING is shorthand for the class of SQLSTATE values that begin\nwith \'01\'.\n* NOT FOUND is shorthand for the class of SQLSTATE values that begin\nwith \'02\'. This is relevant only the context of cursors and is used to\ncontrol what happens when a cursor reaches the end of a data set. If\nno more rows are available, a No Data condition occurs with SQLSTATE\nvalue 02000. To detect this condition, you can set up a handler for it\n(or for a NOT FOUND condition). An example is shown in Cursor Overview. This\ncondition also occurs for SELECT ... INTO var_list statements that retrieve no\nrows.\n* SQLEXCEPTION is shorthand for the class of SQLSTATE values that do\nnot begin with \'00\', \'01\', or \'02\'.\n\nWhen an error raises, in some cases it could be handled by multiple HANDLERs.\nFor example, there may be an handler for 1050 error, a separate handler for\nthe 42S01 SQLSTATE, and another separate handler for the SQLEXCEPTION class:\nin theory all occurrences of HANDLER may catch the 1050 error, but MariaDB\nchooses the HANDLER with the highest precedence. Here are the precedence rules:\n\n* Handlers which refer to an error code have the highest precedence.\n* Handlers which refer to a SQLSTATE come next.\n* Handlers which refer to an error class have the lowest precedence.\n\nIn some cases, a statement could produce multiple errors. If this happens, in\nsome cases multiple handlers could have the highest precedence. In such cases,\nthe choice of the handler is indeterminate.\n\nNote that if an error occurs within a CONTINUE HANDLER block, it can be\nhandled by another HANDLER. However, a HANDLER which is already in the stack\n(that is, it has been called to handle an error and its execution didn\'t\nfinish yet) cannot handle new errors—this prevents endless loops. For example,\nsuppose that a stored procedure contains a CONTINUE HANDLER for SQLWARNING and\nanother CONTINUE HANDLER for NOT FOUND. At some point, a NOT FOUND error\noccurs, and the execution enters the NOT FOUND HANDLER. But within that\nhandler, a warning occurs, and the execution enters the SQLWARNING HANDLER. If\nanother NOT FOUND error occurs, it cannot be handled again by the NOT FOUND\nHANDLER, because its execution is not finished.\n\nWhen a DECLARE HANDLER block can handle more than one error condition, it may\nbe useful to know which errors occurred. To do so, you can use the GET\nDIAGNOSTICS statement.\n\nAn error that is handled by a DECLARE HANDLER construct can be issued again\nusing the RESIGNAL statement.\n\nBelow is an example using DECLARE HANDLER:\n\nCREATE TABLE test.t (s1 INT, PRIMARY KEY (s1));\n\nDELIMITER //\n\nCREATE PROCEDURE handlerdemo ( )\n BEGIN\n DECLARE CONTINUE HANDLER FOR SQLSTATE \'23000\' SET @x2 = 1;\n SET @x = 1;\n INSERT INTO test.t VALUES (1);\n SET @x = 2;\n INSERT INTO test.t VALUES (1);\n SET @x = 3;\n END;\n //\n\nDELIMITER ;\n\nCALL handlerdemo( );\n\nSELECT @x;\n+------+\n| @x |\n+------+\n| 3 |\n+------+\n\nURL: https://mariadb.com/kb/en/declare-handler/','','https://mariadb.com/kb/en/declare-handler/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (300,24,'DECLARE Variable','Syntax\n------\n\nDECLARE var_name [, var_name] ... [[ROW] TYPE OF]] type [DEFAULT value]\n\nDescription\n-----------\n\nThis statement is used to declare local variables within stored programs. To\nprovide a default value for the variable, include a DEFAULT clause. The value\ncan be specified as an expression (even subqueries are permitted); it need not\nbe a constant. If the DEFAULT clause is missing, the initial value is NULL.\n\nLocal variables are treated like stored routine parameters with respect to\ndata type and overflow checking. See CREATE PROCEDURE.\n\nLocal variables must be declared before CONDITIONs, CURSORs and HANDLERs.\n\nLocal variable names are not case sensitive.\n\nThe scope of a local variable is within the BEGIN ... END block where it is\ndeclared. The variable can be referred to in blocks nested within the\ndeclaring block, except those blocks that declare a variable with the same\nname.\n\nTYPE OF / ROW TYPE OF\n---------------------\n\nMariaDB starting with 10.3\n--------------------------\nTYPE OF and ROW TYPE OF anchored data types for stored routines were\nintroduced in MariaDB 10.3.\n\nAnchored data types allow a data type to be defined based on another object,\nsuch as a table row, rather than specifically set in the declaration. If the\nanchor object changes, so will the anchored data type. This can lead to\nroutines being easier to maintain, so that if the data type in the table is\nchanged, it will automatically be changed in the routine as well.\n\nVariables declared with ROW TYPE OF will have the same features as implicit\nROW variables. It is not possible to use ROW TYPE OF variables in a LIMIT\nclause.\n\nThe real data type of TYPE OF and ROW TYPE OF table_name will become known at\nthe very beginning of the stored routine call. ALTER TABLE or DROP TABLE\nstatements performed inside the current routine on the tables that appear in\nanchors won\'t affect the data type of the anchored variables, even if the\nvariable is declared after an ALTER TABLE or DROP TABLE statement.\n\nThe real data type of a ROW TYPE OF cursor_name variable will become known\nwhen execution enters into the block where the variable is declared. Data type\ninstantiation will happen only once. In a cursor ROW TYPE OF variable that is\ndeclared inside a loop, its data type will become known on the very first\niteration and won\'t change on further loop iterations.\n\nThe tables referenced in TYPE OF and ROW TYPE OF declarations will be checked\nfor existence at the beginning of the stored routine call. CREATE PROCEDURE or\nCREATE FUNCTION will not check the referenced tables for existence.\n\nExamples\n--------\n\nTYPE OF and ROW TYPE OF from MariaDB 10.3:\n\nDECLARE tmp TYPE OF t1.a; -- Get the data type from the column {{a}} in the\ntable {{t1}}\n\nDECLARE rec1 ROW TYPE OF t1; -- Get the row data type from the table {{t1}}\n\nDECLARE rec2 ROW TYPE OF cur1; -- Get the row data type from the cursor\n{{cur1}}\n\nURL: https://mariadb.com/kb/en/declare-variable/','','https://mariadb.com/kb/en/declare-variable/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (301,24,'FOR','MariaDB starting with 10.3\n--------------------------\nFOR loops were introduced in MariaDB 10.3.\n\nSyntax\n------\n\nInteger range FOR loop:\n\n[begin_label:]\nFOR var_name IN [ REVERSE ] lower_bound .. upper_bound\nDO statement_list\nEND FOR [ end_label ]\n\nExplicit cursor FOR loop\n\n[begin_label:]\nFOR record_name IN cursor_name [ ( cursor_actual_parameter_list)]\nDO statement_list\nEND FOR [ end_label ]\n\nExplicit cursor FOR loop (Oracle mode)\n\n[begin_label:]\nFOR record_name IN cursor_name [ ( cursor_actual_parameter_list)]\nLOOP\n statement_list\nEND LOOP [ end_label ]\n\nImplicit cursor FOR loop\n\n[begin_label:]\nFOR record_name IN ( select_statement )\nDO statement_list\nEND FOR [ end_label ]\n\nDescription\n-----------\n\nFOR loops allow code to be executed a fixed number of times.\n\nIn an integer range FOR loop, MariaDB will compare the lower bound and upper\nbound values, and assign the lower bound value to a counter. If REVERSE is not\nspecified, and the upper bound value is greater than or equal to the counter,\nthe counter will be incremented and the statement will continue, after which\nthe loop is entered again. If the upper bound value is greater than the\ncounter, the loop will be exited.\n\nIf REVERSE is specified, the counter is decremented, and the upper bound value\nneeds to be less than or equal for the loop to continue.\n\nExamples\n--------\n\nIntger range FOR loop:\n\nCREATE TABLE t1 (a INT);\n\nDELIMITER //\n\nFOR i IN 1..3\nDO\n INSERT INTO t1 VALUES (i);\nEND FOR;\n//\n\nDELIMITER ;\n\nSELECT * FROM t1;\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n+------+\n\nREVERSE integer range FOR loop:\n\nCREATE OR REPLACE TABLE t1 (a INT);\n\nDELIMITER //\nFOR i IN REVERSE 4..12\n DO\n INSERT INTO t1 VALUES (i);\nEND FOR;\n//\nQuery OK, 9 rows affected (0.422 sec)\n\nDELIMITER ;\n\nSELECT * FROM t1;\n+------+\n| a |\n+------+\n| 12 |\n| 11 |\n| 10 |\n| 9 |\n| 8 |\n| 7 |\n| 6 |\n| 5 |\n| 4 |\n+------+\n\nExplicit cursor in Oracle mode:\n\nSET sql_mode=ORACLE;\n\nCREATE OR REPLACE TABLE t1 (a INT, b VARCHAR(32));\n\nINSERT INTO t1 VALUES (10,\'b0\');\nINSERT INTO t1 VALUES (11,\'b1\');\nINSERT INTO t1 VALUES (12,\'b2\');\n\nDELIMITER //\n\nCREATE OR REPLACE PROCEDURE p1(pa INT) AS \n CURSOR cur(va INT) IS\n SELECT a, b FROM t1 WHERE a=va;\nBEGIN\n FOR rec IN cur(pa)\n LOOP\n SELECT rec.a, rec.b;\n END LOOP;\nEND;\n//\n\nDELIMITER ;\n\nCALL p1(10);\n+-------+-------+\n| rec.a | rec.b |\n+-------+-------+\n| 10 | b0 |\n+-------+-------+\n\nCALL p1(11);\n+-------+-------+\n| rec.a | rec.b |\n+-------+-------+\n| 11 | b1 |\n+-------+-------+\n\nCALL p1(12);\n+-------+-------+\n| rec.a | rec.b |\n+-------+-------+\n| 12 | b2 |\n+-------+-------+\n\nCALL p1(13);\nQuery OK, 0 rows affected (0.000 sec)\n\nURL: https://mariadb.com/kb/en/for/','','https://mariadb.com/kb/en/for/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (302,24,'GOTO','MariaDB starting with 10.3\n--------------------------\nThe GOTO statement was introduced in MariaDB 10.3 for Oracle compatibility.\n\nSyntax\n------\n\nGOTO label\n\nDescription\n-----------\n\nThe GOTO statement causes the code to jump to the specified label, and\ncontinue operating from there. It is only accepted when in Oracle mode.\n\nExample\n-------\n\nSET sql_mode=ORACLE;\n\nDELIMITER //\n\nCREATE OR REPLACE PROCEDURE p1 AS\n\nBEGIN\n\nSELECT 1;\n GOTO label;\n SELECT 2;\n <<label>>\n SELECT 3;\n\nEND;\n\n//\n\nDELIMITER\n\ncall p1();\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n1 row in set (0.000 sec)\n\n+---+\n| 3 |\n+---+\n| 3 |\n+---+\n1 row in set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/goto/','','https://mariadb.com/kb/en/goto/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (303,24,'IF','Syntax\n------\n\nIF search_condition THEN statement_list\n [ELSEIF search_condition THEN statement_list] ...\n [ELSE statement_list]\nEND IF;\n\nDescription\n-----------\n\nIF implements a basic conditional construct. If the search_condition evaluates\nto true, the corresponding SQL statement list is executed. If no\nsearch_condition matches, the statement list in the ELSE clause is executed.\nEach statement_list consists of one or more statements.\n\nURL: https://mariadb.com/kb/en/if/','','https://mariadb.com/kb/en/if/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (304,24,'ITERATE','Syntax\n------\n\nITERATE label\n\nITERATE can appear only within LOOP, REPEAT, and WHILE statements. ITERATE\nmeans \"do the loop again\", and uses the statement\'s label to determine which\nstatements to repeat. The label must be in the same stored program, not in a\ncaller procedure.\n\nIf you try to use ITERATE with a non-existing label, or if the label is\nassociated to a construct which is not a loop, the following error will be\nproduced:\n\nERROR 1308 (42000): ITERATE with no matching label: <label_name>\n\nBelow is an example of how ITERATE might be used:\n\nCREATE PROCEDURE doiterate(p1 INT)\nBEGIN\n label1: LOOP\n SET p1 = p1 + 1;\n IF p1 < 10 THEN ITERATE label1; END IF;\n LEAVE label1;\n END LOOP label1;\n SET @x = p1;\nEND\n\nURL: https://mariadb.com/kb/en/iterate/','','https://mariadb.com/kb/en/iterate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (305,24,'Labels','Syntax\n------\n\nlabel: <construct>\n[label]\n\nLabels are MariaDB identifiers which can be used to identify a BEGIN ... END\nconstruct or a loop. They have a maximum length of 16 characters and can be\nquoted with backticks (i.e.., `).\n\nLabels have a start part and an end part. The start part must precede the\nportion of code it refers to, must be followed by a colon (:) and can be on\nthe same or different line. The end part is optional and adds nothing, but can\nmake the code more readable. If used, the end part must precede the\nconstruct\'s delimiter (;). Constructs identified by a label can be nested.\nEach construct can be identified by only one label.\n\nLabels need not be unique in the stored program they belong to. However, a\nlabel for an inner loop cannot be identical to a label for an outer loop. In\nthis case, the following error would be produced:\n\nERROR 1309 (42000): Redefining label <label_name>\n\nLEAVE and ITERATE statements can be used to exit or repeat a portion of code\nidentified by a label. They must be in the same Stored Routine, Trigger or\nEvent which contains the target label.\n\nBelow is an example using a simple label that is used to exit a LOOP:\n\nCREATE PROCEDURE `test_sp`()\nBEGIN\n `my_label`:\n LOOP\n SELECT \'looping\';\n LEAVE `my_label`;\n END LOOP;\n SELECT \'out of loop\';\nEND;\n\nThe following label is used to exit a procedure, and has an end part:\n\nCREATE PROCEDURE `test_sp`()\n`my_label`:\nBEGIN\n IF @var = 1 THEN\n LEAVE `my_label`;\n END IF;\n DO something();\nEND `my_label`;\n\nURL: https://mariadb.com/kb/en/labels/','','https://mariadb.com/kb/en/labels/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (306,24,'LEAVE','Syntax\n------\n\nLEAVE label\n\nThis statement is used to exit the flow control construct that has the given\nlabel. The label must be in the same stored program, not in a caller\nprocedure. LEAVE can be used within BEGIN ... END or loop constructs (LOOP,\nREPEAT, WHILE). In Stored Procedures, Triggers and Events, LEAVE can refer to\nthe outmost BEGIN ... END construct; in that case, the program exits the\nprocedure. In Stored Functions, RETURN can be used instead.\n\nNote that LEAVE cannot be used to exit a DECLARE HANDLER block.\n\nIf you try to LEAVE a non-existing label, or if you try to LEAVE a HANDLER\nblock, the following error will be produced:\n\nERROR 1308 (42000): LEAVE with no matching label: <label_name>\n\nThe following example uses LEAVE to exit the procedure if a condition is true:\n\nCREATE PROCEDURE proc(IN p TINYINT)\nCONTAINS SQL\n`whole_proc`:\nBEGIN\n SELECT 1;\n IF p < 1 THEN\n LEAVE `whole_proc`;\n END IF;\n SELECT 2;\nEND;\n\nCALL proc(0);\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n\nURL: https://mariadb.com/kb/en/leave/','','https://mariadb.com/kb/en/leave/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (307,24,'LOOP','Syntax\n------\n\n[begin_label:] LOOP\n statement_list\nEND LOOP [end_label]\n\nDescription\n-----------\n\nLOOP implements a simple loop construct, enabling repeated execution of the\nstatement list, which consists of one or more statements, each terminated by a\nsemicolon (i.e., ;) statement delimiter. The statements within the loop are\nrepeated until the loop is exited; usually this is accomplished with a LEAVE\nstatement.\n\nA LOOP statement can be labeled. end_label cannot be given unless begin_label\nalso is present. If both are present, they must be the same.\n\nSee Delimiters in the mysql client for more on delimiter usage in the client.\n\nURL: https://mariadb.com/kb/en/loop/','','https://mariadb.com/kb/en/loop/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (308,24,'REPEAT LOOP','Syntax\n------\n\n[begin_label:] REPEAT\n statement_list\nUNTIL search_condition\nEND REPEAT [end_label]\n\nThe statement list within a REPEAT statement is repeated until the\nsearch_condition is true. Thus, a REPEAT always enters the loop at least once.\nstatement_list consists of one or more statements, each terminated by a\nsemicolon (i.e., ;) statement delimiter.\n\nA REPEAT statement can be labeled. end_label cannot be given unless\nbegin_label also is present. If both are present, they must be the same.\n\nSee Delimiters in the mysql client for more on client delimiter usage.\n\nDELIMITER //\n\nCREATE PROCEDURE dorepeat(p1 INT)\n BEGIN\n SET @x = 0;\n REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;\n END\n//\n\nCALL dorepeat(1000)//\n\nSELECT @x//\n+------+\n| @x |\n+------+\n| 1001 |\n+------+\n\nURL: https://mariadb.com/kb/en/repeat-loop/','','https://mariadb.com/kb/en/repeat-loop/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (309,24,'RESIGNAL','Syntax\n------\n\nRESIGNAL [error_condition]\n [SET error_property\n [, error_property] ...]\n\nerror_condition:\n SQLSTATE [VALUE] \'sqlstate_value\'\n | condition_name\n\nerror_property:\n error_property_name = <error_property_value>\n\nerror_property_name:\n CLASS_ORIGIN\n | SUBCLASS_ORIGIN\n | MESSAGE_TEXT\n | MYSQL_ERRNO\n | CONSTRAINT_CATALOG\n | CONSTRAINT_SCHEMA\n | CONSTRAINT_NAME\n | CATALOG_NAME\n | SCHEMA_NAME\n | TABLE_NAME\n | COLUMN_NAME\n | CURSOR_NAME\n\nDescription\n-----------\n\nThe syntax of RESIGNAL and its semantics are very similar to SIGNAL. This\nstatement can only be used within an error HANDLER. It produces an error, like\nSIGNAL. RESIGNAL clauses are the same as SIGNAL, except that they all are\noptional, even SQLSTATE. All the properties which are not specified in\nRESIGNAL, will be identical to the properties of the error that was received\nby the error HANDLER. For a description of the clauses, see diagnostics area.\n\nNote that RESIGNAL does not empty the diagnostics area: it just appends\nanother error condition.\n\nRESIGNAL, without any clauses, produces an error which is identical to the\nerror that was received by HANDLER.\n\nIf used out of a HANDLER construct, RESIGNAL produces the following error:\n\nERROR 1645 (0K000): RESIGNAL when handler not active\n\nIn MariaDB 5.5, if a HANDLER contained a CALL to another procedure, that\nprocedure could use RESIGNAL. Since MariaDB 10.0, trying to do this raises the\nabove error.\n\nFor a list of SQLSTATE values and MariaDB error codes, see MariaDB Error Codes.\n\nThe following procedure tries to query two tables which don\'t exist, producing\na 1146 error in both cases. Those errors will trigger the HANDLER. The first\ntime the error will be ignored and the client will not receive it, but the\nsecond time, the error is re-signaled, so the client will receive it.\n\nCREATE PROCEDURE test_error( )\nBEGIN\n DECLARE CONTINUE HANDLER\n FOR 1146\n BEGIN\n IF @hide_errors IS FALSE THEN\n RESIGNAL;\n END IF;\n END;\n SET @hide_errors = TRUE;\n SELECT \'Next error will be ignored\' AS msg;\n SELECT `c` FROM `temptab_one`;\n SELECT \'Next error won\'\'t be ignored\' AS msg;\n SET @hide_errors = FALSE;\n SELECT `c` FROM `temptab_two`;\nEND;\n\nCALL test_error( );\n\n+----------------------------+\n| msg |\n+----------------------------+\n| Next error will be ignored |\n+----------------------------+\n\n+-----------------------------+\n| msg |\n+-----------------------------+\n| Next error won\'t be ignored |\n+-----------------------------+\n\nERROR 1146 (42S02): Table \'test.temptab_two\' doesn\'t exist\n\nThe following procedure re-signals an error, modifying only the error message\nto clarify the cause of the problem.\n\nCREATE PROCEDURE test_error()\nBEGIN\n DECLARE CONTINUE HANDLER\n FOR 1146\n BEGIN\n RESIGNAL SET\n MESSAGE_TEXT = \'`temptab` does not exist\';\n END;\n SELECT `c` FROM `temptab`;\nEND;\n\nCALL test_error( );\nERROR 1146 (42S02): `temptab` does not exist\n\nAs explained above, this works on MariaDB 5.5, but produces a 1645 error since\n10.0.\n\nCREATE PROCEDURE handle_error()\nBEGIN\n RESIGNAL;\nEND;\nCREATE PROCEDURE p()\nBEGIN\n DECLARE EXIT HANDLER FOR SQLEXCEPTION CALL p();\n SIGNAL SQLSTATE \'45000\';\nEND;\n\nURL: https://mariadb.com/kb/en/resignal/','','https://mariadb.com/kb/en/resignal/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (310,24,'RETURN','Syntax\n------\n\nRETURN expr\n\nThe RETURN statement terminates execution of a stored function and returns the\nvalue expr to the function caller. There must be at least one RETURN statement\nin a stored function. If the function has multiple exit points, all exit\npoints must have a RETURN.\n\nThis statement is not used in stored procedures, triggers, or events. LEAVE\ncan be used instead.\n\nThe following example shows that RETURN can return the result of a scalar\nsubquery:\n\nCREATE FUNCTION users_count() RETURNS BOOL\n READS SQL DATA\nBEGIN\n RETURN (SELECT COUNT(DISTINCT User) FROM mysql.user);\nEND;\n\nURL: https://mariadb.com/kb/en/return/','','https://mariadb.com/kb/en/return/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (311,24,'SELECT INTO','Syntax\n------\n\nSELECT col_name [, col_name] ...\n INTO var_name [, var_name] ...\n table_expr\n\nDescription\n-----------\n\nSELECT ... INTO enables selected columns to be stored directly into variables.\nNo resultset is produced. The query should return a single row. If the query\nreturns no rows, a warning with error code 1329 occurs (No data), and the\nvariable values remain unchanged. If the query returns multiple rows, error\n1172 occurs (Result consisted of more than one row). If it is possible that\nthe statement may retrieve multiple rows, you can use LIMIT 1 to limit the\nresult set to a single row.\n\nThe INTO clause can also be specified at the end of the statement.\n\nIn the context of such statements that occur as part of events executed by the\nEvent Scheduler, diagnostics messages (not only errors, but also warnings) are\nwritten to the error log, and, on Windows, to the application event log.\n\nThis statement can be used with both local variables and user-defined\nvariables.\n\nFor the complete syntax, see SELECT.\n\nAnother way to set a variable\'s value is the SET statement.\n\nSELECT ... INTO results are not stored in the query cache even if SQL_CACHE is\nspecified.\n\nExamples\n--------\n\nSELECT id, data INTO @x,@y \nFROM test.t1 LIMIT 1;\nSELECT * from t1 where t1.a=@x and t1.b=@y\n\nIf you want to use this construct with UNION you have to use the syntax:\n\nSELECT * INTO @x FROM (SELECT t1.a FROM t1 UNION SELECT t2.a FROM t2);\n\nURL: https://mariadb.com/kb/en/selectinto/','','https://mariadb.com/kb/en/selectinto/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (312,24,'SIGNAL','Syntax\n------\n\nSIGNAL error_condition\n [SET error_property\n [, error_property] ...]\n\nerror_condition:\n SQLSTATE [VALUE] \'sqlstate_value\'\n | condition_name\n\nerror_property:\n error_property_name = <error_property_value>\n\nerror_property_name:\n CLASS_ORIGIN\n | SUBCLASS_ORIGIN\n | MESSAGE_TEXT\n | MYSQL_ERRNO\n | CONSTRAINT_CATALOG\n | CONSTRAINT_SCHEMA\n | CONSTRAINT_NAME\n | CATALOG_NAME\n | SCHEMA_NAME\n | TABLE_NAME\n | COLUMN_NAME\n | CURSOR_NAME\n\nSIGNAL empties the diagnostics area and produces a custom error. This\nstatement can be used anywhere, but is generally useful when used inside a\nstored program. When the error is produced, it can be caught by a HANDLER. If\nnot, the current stored program, or the current statement, will terminate with\nthe specified error.\n\nSometimes an error HANDLER just needs to SIGNAL the same error it received,\noptionally with some changes. Usually the RESIGNAL statement is the most\nconvenient way to do this.\n\nerror_condition can be an SQLSTATE value or a named error condition defined\nvia DECLARE CONDITION. SQLSTATE must be a constant string consisting of five\ncharacters. These codes are standard to ODBC and ANSI SQL. For customized\nerrors, the recommended SQLSTATE is \'45000\'. For a list of SQLSTATE values\nused by MariaDB, see the MariaDB Error Codes page. The SQLSTATE can be read\nvia the API method mysql_sqlstate( ).\n\nTo specify error properties user-defined variables and local variables can be\nused, as well as character set conversions (but you can\'t set a collation).\n\nThe error properties, their type and their default values are explained in the\ndiagnostics area page.\n\nErrors\n------\n\nIf the SQLSTATE is not valid, the following error like this will be produced:\n\nERROR 1407 (42000): Bad SQLSTATE: \'123456\'\n\nIf a property is specified more than once, an error like this will be produced:\n\nERROR 1641 (42000): Duplicate condition information item \'MESSAGE_TEXT\'\n\nIf you specify a condition name which is not declared, an error like this will\nbe produced:\n\nERROR 1319 (42000): Undefined CONDITION: cond_name\n\nIf MYSQL_ERRNO is out of range, you will get an error like this:\n\nERROR 1231 (42000): Variable \'MYSQL_ERRNO\' can\'t be set to the value of \'0\'\n\nExamples\n--------\n\nHere\'s what happens if SIGNAL is used in the client to generate errors:\n\nSIGNAL SQLSTATE \'01000\';\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n\n+---------+------+------------------------------------------+\n| Level | Code | Message |\n+---------+------+------------------------------------------+\n| Warning | 1642 | Unhandled user-defined warning condition |\n+---------+------+------------------------------------------+\n1 row in set (0.06 sec)\n\nSIGNAL SQLSTATE \'02000\';\nERROR 1643 (02000): Unhandled user-defined not found condition\n\nHow to specify MYSQL_ERRNO and MESSAGE_TEXT properties:\n\nSIGNAL SQLSTATE \'45000\' SET MYSQL_ERRNO=30001, MESSAGE_TEXT=\'H\nello, world!\';\n\nERROR 30001 (45000): Hello, world!\n\nThe following code shows how to use user variables, local variables and\ncharacter set conversion with SIGNAL:\n\nCREATE PROCEDURE test_error(x INT)\nBEGIN\n DECLARE errno SMALLINT UNSIGNED DEFAULT 31001;\n SET @errmsg = \'Hello, world!\';\n IF x = 1 THEN\n SIGNAL SQLSTATE \'45000\' SET\n MYSQL_ERRNO = errno,\n MESSAGE_TEXT = @errmsg;\n ELSE\n SIGNAL SQLSTATE \'45000\' SET\n MYSQL_ERRNO = errno,\n MESSAGE_TEXT = _utf8\'Hello, world!\';\n END IF;\nEND;\n\nHow to use named error conditions:\n\nCREATE PROCEDURE test_error(n INT)\nBEGIN\n DECLARE `too_big` CONDITION FOR SQLSTATE \'45000\';\n IF n > 10 THEN\n SIGNAL `too_big`;\n END IF;\nEND;\n\nIn this example, we\'ll define a HANDLER for an error code. When the error\noccurs, we SIGNAL a more informative error which makes sense for our procedure:\n\nCREATE PROCEDURE test_error()\nBEGIN\n DECLARE EXIT HANDLER\n FOR 1146\n BEGIN\n SIGNAL SQLSTATE \'45000\' SET\n MESSAGE_TEXT = \'Temporary tables not found; did you call init()\nprocedure?\';\n END;\n -- this will produce a 1146 error\n SELECT `c` FROM `temptab`;\nEND;\n\nURL: https://mariadb.com/kb/en/signal/','','https://mariadb.com/kb/en/signal/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (313,24,'WHILE','Syntax\n------\n\n[begin_label:] WHILE search_condition DO\n statement_list\nEND WHILE [end_label]\n\nDescription\n-----------\n\nThe statement list within a WHILE statement is repeated as long as the\nsearch_condition is true. statement_list consists of one or more statements.\nIf the loop must be executed at least once, REPEAT ... LOOP can be used\ninstead.\n\nA WHILE statement can be labeled. end_label cannot be given unless begin_label\nalso is present. If both are present, they must be the same.\n\nExamples\n--------\n\nCREATE PROCEDURE dowhile()\nBEGIN\n DECLARE v1 INT DEFAULT 5;\n\nWHILE v1 > 0 DO\n ...\n SET v1 = v1 - 1;\n END WHILE;\nEND\n\nURL: https://mariadb.com/kb/en/while/','','https://mariadb.com/kb/en/while/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (314,24,'Cursor Overview','Description\n-----------\n\nA cursor is a structure that allows you to go over records sequentially, and\nperform processing based on the result.\n\nMariaDB permits cursors inside stored programs, and MariaDB cursors are\nnon-scrollable, read-only and asensitive.\n\n* Non-scrollable means that the rows can only be fetched in the order\nspecified by the SELECT statement. Rows cannot be skipped, you cannot jump to\na specific row, and you cannot fetch rows in reverse order.\n* Read-only means that data cannot be updated through the cursor.\n* Asensitive means that the cursor points to the actual underlying data. This\nkind of cursor is quicker than the alternative, an insensitive cursor, as no\ndata is copied to a temporary table. However, changes to the data being used\nby the cursor will affect the cursor data.\n\nCursors are created with a DECLARE CURSOR statement and opened with an OPEN\nstatement. Rows are read with a FETCH statement before the cursor is finally\nclosed with a CLOSE statement.\n\nWhen FETCH is issued and there are no more rows to extract, the following\nerror is produced:\n\nERROR 1329 (02000): No data - zero rows fetched, selected, or processed\n\nTo avoid problems, a DECLARE HANDLER statement is generally used. The HANDLER\nshould handler the 1329 error, or the \'02000\' SQLSTATE, or the NOT FOUND error\nclass.\n\nOnly SELECT statements are allowed for cursors, and they cannot be contained\nin a variable - so, they cannot be composed dynamically. However, it is\npossible to SELECT from a view. Since the CREATE VIEW statement can be\nexecuted as a prepared statement, it is possible to dynamically create the\nview that is queried by the cursor.\n\nFrom MariaDB 10.3.0, cursors can have parameters. Cursor parameters can appear\nin any part of the DECLARE CURSOR select_statement where a stored procedure\nvariable is allowed (select list, WHERE, HAVING, LIMIT etc). See DECLARE\nCURSOR and OPEN for syntax, and below for an example:\n\nExamples\n--------\n\nCREATE TABLE c1(i INT);\n\nCREATE TABLE c2(i INT);\n\nCREATE TABLE c3(i INT);\n\nDELIMITER //\n\nCREATE PROCEDURE p1()\nBEGIN\n DECLARE done INT DEFAULT FALSE;\n DECLARE x, y INT;\n DECLARE cur1 CURSOR FOR SELECT i FROM test.c1;\n DECLARE cur2 CURSOR FOR SELECT i FROM test.c2;\n DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;\n\nOPEN cur1;\n OPEN cur2;\n\nread_loop: LOOP\n FETCH cur1 INTO x;\n FETCH cur2 INTO y;\n IF done THEN\n LEAVE read_loop;\n END IF;\n IF x < y THEN\n INSERT INTO test.c3 VALUES (x);\n ELSE\n INSERT INTO test.c3 VALUES (y);\n END IF;\n END LOOP;\n\nCLOSE cur1;\n CLOSE cur2;\nEND; //\n\nDELIMITER ;\n\nINSERT INTO c1 VALUES(5),(50),(500);\n\nINSERT INTO c2 VALUES(10),(20),(30);\n\nCALL p1;\n\nSELECT * FROM c3;\n+------+\n| i |\n+------+\n| 5 |\n| 20 |\n| 30 |\n+------+\n\nFrom MariaDB 10.3.0\n\nDROP PROCEDURE IF EXISTS p1;\nDROP TABLE IF EXISTS t1;\nCREATE TABLE t1 (a INT, b VARCHAR(10));\n\nINSERT INTO t1 VALUES (1,\'old\'),(2,\'old\'),(3,\'old\'),(4,\'old\'),(5,\'old\');\n\nDELIMITER //\n\nCREATE PROCEDURE p1(min INT,max INT)\nBEGIN\n DECLARE done INT DEFAULT FALSE;\n DECLARE va INT;\n DECLARE cur CURSOR(pmin INT, pmax INT) FOR SELECT a FROM t1 WHERE a BETWEEN\npmin AND pmax;\n DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;\n OPEN cur(min,max);\n read_loop: LOOP\n FETCH cur INTO va;\n IF done THEN\n LEAVE read_loop;\n END IF;\n INSERT INTO t1 VALUES (va,\'new\');\n END LOOP;\n CLOSE cur;\nEND;\n//\n\nDELIMITER ;\n\nCALL p1(2,4);\n\nSELECT * FROM t1;\n+------+------+\n| a | b |\n+------+------+\n| 1 | old |\n| 2 | old |\n| 3 | old |\n| 4 | old |\n| 5 | old |\n| 2 | new |\n| 3 | new |\n| 4 | new |\n+------+------+\n\nURL: https://mariadb.com/kb/en/cursor-overview/','','https://mariadb.com/kb/en/cursor-overview/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (315,24,'DECLARE CURSOR','Syntax\n------\n\n<= MariaDB 10.2\n\nDECLARE cursor_name CURSOR FOR select_statement\n\nFrom MariaDB 10.3\n\nDECLARE cursor_name CURSOR [(cursor_formal_parameter[,...])] FOR\nselect_statement\n\ncursor_formal_parameter:\n name type [collate clause]\n\nFrom MariaDB 10.8\n\nDECLARE cursor_name CURSOR [(cursor_formal_parameter[,...])] FOR\nselect_statement\n\ncursor_formal_parameter:\n [IN] name type [collate clause]\n\nDescription\n-----------\n\nThis statement declares a cursor. Multiple cursors may be declared in a stored\nprogram, but each cursor in a given block must have a unique name.\n\nselect_statement is not executed until the OPEN statement is executed. It is\nimportant to remember this if the query produces an error, or calls functions\nwhich have side effects.\n\nA SELECT associated to a cursor can use variables, but the query itself cannot\nbe a variable, and cannot be dynamically composed. The SELECT statement cannot\nhave an INTO clause.\n\nCursors must be declared before HANDLERs, but after local variables and\nCONDITIONs.\n\nParameters\n----------\n\nMariaDB starting with 10.3.0\n----------------------------\nFrom MariaDB 10.3.0, cursors can have parameters. This is a non-standard SQL\nextension. Cursor parameters can appear in any part of the DECLARE CURSOR\nselect_statement where a stored procedure variable is allowed (select list,\nWHERE, HAVING, LIMIT etc).\n\nIN\n--\n\nMariaDB starting with 10.8.0\n----------------------------\nFrom MariaDB 10.8.0 preview release, the IN qualifier is supported in the\ncursor_format_parameter part of the syntax.\n\nSee Cursor Overview for an example.\n\nURL: https://mariadb.com/kb/en/declare-cursor/','','https://mariadb.com/kb/en/declare-cursor/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (316,24,'OPEN','Syntax\n------\n\n<= MariaDB 10.2\n\nOPEN cursor_name\n\nFrom MariaDB 10.3\n\nOPEN cursor_name [expression[,...]];\n\nDescription\n-----------\n\nThis statement opens a cursor which was previously declared with DECLARE\nCURSOR.\n\nThe query associated to the DECLARE CURSOR is executed when OPEN is executed.\nIt is important to remember this if the query produces an error, or calls\nfunctions which have side effects.\n\nThis is necessary in order to FETCH rows from a cursor.\n\nSee Cursor Overview for an example.\n\nURL: https://mariadb.com/kb/en/open/','','https://mariadb.com/kb/en/open/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (317,24,'FETCH','Syntax\n------\n\nFETCH cursor_name INTO var_name [, var_name] ...\n\nDescription\n-----------\n\nThis statement fetches the next row (if a row exists) using the specified open\ncursor, and advances the cursor pointer.\n\nvar_name can be a local variable, but not a user-defined variable.\n\nIf no more rows are available, a No Data condition occurs with SQLSTATE value\n02000. To detect this condition, you can set up a handler for it (or for a NOT\nFOUND condition).\n\nSee Cursor Overview for an example.\n\nURL: https://mariadb.com/kb/en/fetch/','','https://mariadb.com/kb/en/fetch/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (318,24,'CLOSE','Syntax\n------\n\nCLOSE cursor_name\n\nDescription\n-----------\n\nThis statement closes a previously opened cursor. The cursor must have been\npreviously opened or else an error occurs.\n\nIf not closed explicitly, a cursor is closed at the end of the compound\nstatement in which it was declared.\n\nSee Cursor Overview for an example.\n\nURL: https://mariadb.com/kb/en/close/','','https://mariadb.com/kb/en/close/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (319,25,'BUFFER','A synonym for ST_BUFFER.\n\nURL: https://mariadb.com/kb/en/buffer/','','https://mariadb.com/kb/en/buffer/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (320,25,'CONVEXHULL','A synonym for ST_CONVEXHULL.\n\nURL: https://mariadb.com/kb/en/convexhull/','','https://mariadb.com/kb/en/convexhull/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (321,25,'GEOMETRYCOLLECTION','Syntax\n------\n\nGeometryCollection(g1,g2,...)\n\nDescription\n-----------\n\nConstructs a WKB GeometryCollection. If any argument is not a well-formed WKB\nrepresentation of a geometry, the return value is NULL.\n\nExamples\n--------\n\nCREATE TABLE gis_geometrycollection (g GEOMETRYCOLLECTION);\nSHOW FIELDS FROM gis_geometrycollection;\nINSERT INTO gis_geometrycollection VALUES\n (GeomCollFromText(\'GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10\n10))\')),\n (GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6),\nLineString(Point(3, 6), Point(7, 9)))))),\n (GeomFromText(\'GeometryCollection()\')),\n (GeomFromText(\'GeometryCollection EMPTY\'));\n\nURL: https://mariadb.com/kb/en/geometrycollection/','','https://mariadb.com/kb/en/geometrycollection/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (322,25,'LINESTRING','Syntax\n------\n\nLineString(pt1,pt2,...)\n\nDescription\n-----------\n\nConstructs a WKB LineString value from a number of WKB Point arguments. If any\nargument is not a WKB Point, the return value is NULL. If the number of Point\narguments is less than two, the return value is NULL.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT AsText(EndPoint(GeomFromText(@ls)));\n+-------------------------------------+\n| AsText(EndPoint(GeomFromText(@ls))) |\n+-------------------------------------+\n| POINT(3 3) |\n+-------------------------------------+\n\nCREATE TABLE gis_line (g LINESTRING);\nINSERT INTO gis_line VALUES\n (LineFromText(\'LINESTRING(0 0,0 10,10 0)\')),\n (LineStringFromText(\'LINESTRING(10 10,20 10,20 20,10 20,10 10)\')),\n (LineStringFromWKB(AsWKB(LineString(Point(10, 10), Point(40, 10)))));\n\nURL: https://mariadb.com/kb/en/linestring/','','https://mariadb.com/kb/en/linestring/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (323,25,'MULTILINESTRING','Syntax\n------\n\nMultiLineString(ls1,ls2,...)\n\nDescription\n-----------\n\nConstructs a WKB MultiLineString value using WKB LineString arguments. If any\nargument is not a WKB LineString, the return value is NULL.\n\nExample\n-------\n\nCREATE TABLE gis_multi_line (g MULTILINESTRING);\nINSERT INTO gis_multi_line VALUES\n (MultiLineStringFromText(\'MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16\n48))\')),\n (MLineFromText(\'MULTILINESTRING((10 48,10 21,10 0))\')),\n (MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2), \n Point(3, 5)), LineString(Point(2, 5),Point(5, 8),Point(21, 7))))));\n\nURL: https://mariadb.com/kb/en/multilinestring/','','https://mariadb.com/kb/en/multilinestring/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (324,25,'MULTIPOINT','Syntax\n------\n\nMultiPoint(pt1,pt2,...)\n\nDescription\n-----------\n\nConstructs a WKB MultiPoint value using WKB Point arguments. If any argument\nis not a WKB Point, the return value is NULL.\n\nExamples\n--------\n\nSET @g = ST_GEOMFROMTEXT(\'MultiPoint( 1 1, 2 2, 5 3, 7 2, 9 3, 8 4, 6 6, 6 9,\n4 9, 1 5 )\');\n\nCREATE TABLE gis_multi_point (g MULTIPOINT);\nINSERT INTO gis_multi_point VALUES\n (MultiPointFromText(\'MULTIPOINT(0 0,10 10,10 20,20 20)\')),\n (MPointFromText(\'MULTIPOINT(1 1,11 11,11 21,21 21)\')),\n (MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));\n\nURL: https://mariadb.com/kb/en/multipoint/','','https://mariadb.com/kb/en/multipoint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (325,25,'MULTIPOLYGON','Syntax\n------\n\nMultiPolygon(poly1,poly2,...)\n\nDescription\n-----------\n\nConstructs a WKB MultiPolygon value from a set of WKB Polygon arguments. If\nany argument is not a WKB Polygon, the return value is NULL.\n\nExample\n-------\n\nCREATE TABLE gis_multi_polygon (g MULTIPOLYGON);\nINSERT INTO gis_multi_polygon VALUES\n (MultiPolygonFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52\n18,66 23,73 9,48 6,52 18)),\n ((59 18,67 18,67 13,59 13,59 18)))\')),\n (MPolyFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66\n23,73 9,48 6,52 18)),\n ((59 18,67 18,67 13,59 13,59 18)))\')),\n (MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(\n Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));\n\nURL: https://mariadb.com/kb/en/multipolygon/','','https://mariadb.com/kb/en/multipolygon/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (326,25,'POINT','Syntax\n------\n\nPoint(x,y)\n\nDescription\n-----------\n\nConstructs a WKB Point using the given coordinates.\n\nExamples\n--------\n\nSET @g = ST_GEOMFROMTEXT(\'Point(1 1)\');\n\nCREATE TABLE gis_point (g POINT);\nINSERT INTO gis_point VALUES\n (PointFromText(\'POINT(10 10)\')),\n (PointFromText(\'POINT(20 10)\')),\n (PointFromText(\'POINT(20 20)\')),\n (PointFromWKB(AsWKB(PointFromText(\'POINT(10 20)\'))));\n\nURL: https://mariadb.com/kb/en/point/','','https://mariadb.com/kb/en/point/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (327,25,'PointOnSurface','A synonym for ST_PointOnSurface.\n\nURL: https://mariadb.com/kb/en/pointonsurface/','','https://mariadb.com/kb/en/pointonsurface/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (328,25,'POLYGON','Syntax\n------\n\nPolygon(ls1,ls2,...)\n\nDescription\n-----------\n\nConstructs a WKB Polygon value from a number of WKB LineString arguments. If\nany argument does not represent the WKB of a LinearRing (that is, not a closed\nand simple LineString) the return value is NULL.\n\nNote that according to the OpenGIS standard, a POLYGON should have exactly one\nExteriorRing and all other rings should lie within that ExteriorRing and thus\nbe the InteriorRings. Practically, however, some systems, including MariaDB\'s,\npermit polygons to have several \'ExteriorRings\'. In the case of there being\nmultiple, non-overlapping exterior rings ST_NUMINTERIORRINGS() will return 1.\n\nExamples\n--------\n\nSET @g = ST_GEOMFROMTEXT(\'POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1 1))\');\n\nCREATE TABLE gis_polygon (g POLYGON);\nINSERT INTO gis_polygon VALUES\n (PolygonFromText(\'POLYGON((10 10,20 10,20 20,10 20,10 10))\')),\n (PolyFromText(\'POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10\n20,10 10))\')),\n (PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30,\n30), Point(0, 0))))));\n\nNon-overlapping \'polygon\':\n\nSELECT ST_NumInteriorRings(ST_PolyFromText(\'POLYGON((0 0,10 0,10 10,0 10,0 0),\n (-1 -1,-5 -1,-5 -5,-1 -5,-1 -1))\')) AS NumInteriorRings;\n+------------------+\n| NumInteriorRings |\n+------------------+\n| 1 |\n+------------------+\n\nURL: https://mariadb.com/kb/en/polygon/','','https://mariadb.com/kb/en/polygon/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (329,25,'ST_BUFFER','Syntax\n------\n\nST_BUFFER(g1,r)\nBUFFER(g1,r)\n\nDescription\n-----------\n\nReturns a geometry that represents all points whose distance from geometry g1\nis less than or equal to distance, or radius, r.\n\nUses for this function could include creating for example a new geometry\nrepresenting a buffer zone around an island.\n\nBUFFER() is a synonym.\n\nExamples\n--------\n\nDetermining whether a point is within a buffer zone:\n\nSET @g1 = ST_GEOMFROMTEXT(\'POLYGON((10 10, 10 20, 20 20, 20 10, 10 10))\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'POINT(8 8)\');\n\nSELECT ST_WITHIN(@g2,ST_BUFFER(@g1,5));\n+---------------------------------+\n| ST_WITHIN(@g2,ST_BUFFER(@g1,5)) |\n+---------------------------------+\n| 1 |\n+---------------------------------+\n\nSELECT ST_WITHIN(@g2,ST_BUFFER(@g1,1));\n+---------------------------------+\n| ST_WITHIN(@g2,ST_BUFFER(@g1,1)) |\n+---------------------------------+\n| 0 |\n+---------------------------------+\n\nURL: https://mariadb.com/kb/en/st_buffer/','','https://mariadb.com/kb/en/st_buffer/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (330,25,'ST_CONVEXHULL','MariaDB starting with 10.1.2\n----------------------------\nST_ConvexHull() was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_ConvexHull(g)\nConvexHull(g)\n\nDescription\n-----------\n\nGiven a geometry, returns a geometry that is the minimum convex geometry\nenclosing all geometries within the set. Returns NULL if the geometry value is\nNULL or an empty value.\n\nST_ConvexHull() and ConvexHull() are synonyms.\n\nExamples\n--------\n\nThe ConvexHull of a single point is simply the single point:\n\nSET @g = ST_GEOMFROMTEXT(\'Point(0 0)\');\n\nSELECT ST_ASTEXT(ST_CONVEXHULL(@g));\n+------------------------------+\n| ST_ASTEXT(ST_CONVEXHULL(@g)) |\n+------------------------------+\n| POINT(0 0) |\n+------------------------------+\n\nSET @g = ST_GEOMFROMTEXT(\'MultiPoint(0 0, 1 2, 2 3)\');\n\nSELECT ST_ASTEXT(ST_CONVEXHULL(@g));\n+------------------------------+\n| ST_ASTEXT(ST_CONVEXHULL(@g)) |\n+------------------------------+\n| POLYGON((0 0,1 2,2 3,0 0)) |\n+------------------------------+\n\nSET @g = ST_GEOMFROMTEXT(\'MultiPoint( 1 1, 2 2, 5 3, 7 2, 9 3, 8 4, 6 6, 6 9,\n4 9, 1 5 )\');\n\nSELECT ST_ASTEXT(ST_CONVEXHULL(@g));\n+----------------------------------------+\n| ST_ASTEXT(ST_CONVEXHULL(@g)) |\n+----------------------------------------+\n| POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1 1)) |\n+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_convexhull/','','https://mariadb.com/kb/en/st_convexhull/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (331,25,'ST_INTERSECTION','Syntax\n------\n\nST_INTERSECTION(g1,g2)\n\nDescription\n-----------\n\nReturns a geometry that is the intersection, or shared portion, of geometry g1\nand geometry g2.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 1)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 1, 0 2)\');\n\nSELECT ASTEXT(ST_INTERSECTION(@g1,@g2));\n+----------------------------------+\n| ASTEXT(ST_INTERSECTION(@g1,@g2)) |\n+----------------------------------+\n| POINT(2 1) |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/st_intersection/','','https://mariadb.com/kb/en/st_intersection/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (332,25,'ST_POINTONSURFACE','MariaDB starting with 10.1.2\n----------------------------\nST_POINTONSURFACE() was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_PointOnSurface(g)\nPointOnSurface(g)\n\nDescription\n-----------\n\nGiven a geometry, returns a POINT guaranteed to intersect a surface. However,\nsee MDEV-7514.\n\nST_PointOnSurface() and PointOnSurface() are synonyms.\n\nURL: https://mariadb.com/kb/en/st_pointonsurface/','','https://mariadb.com/kb/en/st_pointonsurface/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (333,25,'ST_SYMDIFFERENCE','Syntax\n------\n\nST_SYMDIFFERENCE(g1,g2)\n\nDescription\n-----------\n\nReturns a geometry that represents the portions of geometry g1 and geometry g2\nthat don\'t intersect.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(10 20, 10 40)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(10 15, 10 25)\');\n\nSELECT ASTEXT(ST_SYMDIFFERENCE(@g1,@g2));\n+----------------------------------------------+\n| ASTEXT(ST_SYMDIFFERENCE(@g1,@g2)) |\n+----------------------------------------------+\n| MULTILINESTRING((10 15,10 20),(10 25,10 40)) |\n+----------------------------------------------+\n\nSET @g2 = ST_GeomFromText(\'LINESTRING(10 20, 10 41)\');\n\nSELECT ASTEXT(ST_SYMDIFFERENCE(@g1,@g2));\n+-----------------------------------+\n| ASTEXT(ST_SYMDIFFERENCE(@g1,@g2)) |\n+-----------------------------------+\n| LINESTRING(10 40,10 41) |\n+-----------------------------------+\n\nURL: https://mariadb.com/kb/en/st_symdifference/','','https://mariadb.com/kb/en/st_symdifference/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (334,25,'ST_UNION','Syntax\n------\n\nST_UNION(g1,g2)\n\nDescription\n-----------\n\nReturns a geometry that is the union of the geometry g1 and geometry g2.\n\nExamples\n--------\n\nSET @g1 = GEOMFROMTEXT(\'POINT (0 2)\');\n\nSET @g2 = GEOMFROMTEXT(\'POINT (2 0)\');\n\nSELECT ASTEXT(ST_UNION(@g1,@g2));\n+---------------------------+\n| ASTEXT(ST_UNION(@g1,@g2)) |\n+---------------------------+\n| MULTIPOINT(2 0,0 2) |\n+---------------------------+\n\nSET @g1 = GEOMFROMTEXT(\'POLYGON((0 0,0 3,3 3,3 0,0 0))\');\n\nSET @g2 = GEOMFROMTEXT(\'POLYGON((2 2,4 2,4 4,2 4,2 2))\');\n\nSELECT ASTEXT(ST_UNION(@g1,@g2));\n+------------------------------------------------+\n| ASTEXT(ST_UNION(@g1,@g2)) |\n+------------------------------------------------+\n| POLYGON((0 0,0 3,2 3,2 4,4 4,4 2,3 2,3 0,0 0)) |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_union/','','https://mariadb.com/kb/en/st_union/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (335,26,'SHOW GRANTS','Syntax\n------\n\nSHOW GRANTS [FOR user|role]\n\nDescription\n-----------\n\nThe SHOW GRANTS statement lists privileges granted to a particular user or\nrole.\n\nUsers\n-----\n\nThe statement lists the GRANT statement or statements that must be issued to\nduplicate the privileges that are granted to a MariaDB user account. The\naccount is named using the same format as for the GRANT statement; for\nexample, \'jeffrey\'@\'localhost\'. If you specify only the user name part of the\naccount name, a host name part of \'%\' is used. For additional information\nabout specifying account names, see GRANT.\n\nSHOW GRANTS FOR \'root\'@\'localhost\';\n+---------------------------------------------------------------------+\n| Grants for root@localhost |\n+---------------------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'root\'@\'localhost\' WITH GRANT OPTION |\n+---------------------------------------------------------------------+\n\nTo list the privileges granted to the account that you are using to connect to\nthe server, you can use any of the following statements:\n\nSHOW GRANTS;\nSHOW GRANTS FOR CURRENT_USER;\nSHOW GRANTS FOR CURRENT_USER();\n\nIf SHOW GRANTS FOR CURRENT_USER (or any of the equivalent syntaxes) is used in\nDEFINER context (such as within a stored procedure that is defined with SQL\nSECURITY DEFINER), the grants displayed are those of the definer and not the\ninvoker.\n\nNote that the DELETE HISTORY privilege, introduced in MariaDB 10.3.4, was\ndisplayed as DELETE VERSIONING ROWS when running SHOW GRANTS until MariaDB\n10.3.15 (MDEV-17655).\n\nRoles\n-----\n\nSHOW GRANTS can also be used to view the privileges granted to a role.\n\nExample\n-------\n\nSHOW GRANTS FOR journalist;\n+------------------------------------------+\n| Grants for journalist |\n+------------------------------------------+\n| GRANT USAGE ON *.* TO \'journalist\' |\n| GRANT DELETE ON `test`.* TO \'journalist\' |\n+------------------------------------------+\n\nFOR PUBLIC\n----------\n\nMariaDB starting with 10.11\n---------------------------\nGRANT ... TO PUBLIC was introduced in MariaDB 10.11 to grant privileges to all\nusers. SHOW GRANTS FOR PUBLIC shows all these grants.\n\nSHOW GRANTS FOR public;\n+------------------------------------------------+\n| Grants for PUBLIC |\n+------------------------------------------------+\n| GRANT ALL PRIVILEGES ON `dev_db`.* TO `PUBLIC` |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-grants/','','https://mariadb.com/kb/en/show-grants/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (336,26,'SHOW CREATE USER','Syntax\n------\n\nSHOW CREATE USER user_name\n\nDescription\n-----------\n\nShows the CREATE USER statement that created the given user. The statement\nrequires the SELECT privilege for the mysql database, except for the current\nuser.\n\nExamples\n--------\n\nCREATE USER foo4@test require cipher \'text\' \n issuer \'foo_issuer\' subject \'foo_subject\';\n\nSHOW CREATE USER foo4@test\\G\n*************************** 1. row ***************************\nCREATE USER \'foo4\'@\'test\' \n REQUIRE ISSUER \'foo_issuer\'\n SUBJECT \'foo_subject\'\n CIPHER \'text\'\n\nUser Password Expiry:\n\nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY;\n\nSHOW CREATE USER \'monty\'@\'localhost\';\n+------------------------------------------------------------------+\n| CREATE USER for monty@localhost |\n+------------------------------------------------------------------+\n| CREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL 120 DAY |\n+------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-create-user/','','https://mariadb.com/kb/en/show-create-user/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (337,26,'SHOW COLUMNS','Syntax\n------\n\nSHOW [FULL] {COLUMNS | FIELDS} FROM tbl_name [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW COLUMNS displays information about the columns in a given table. It also\nworks for views. The LIKE clause, if present on its own, indicates which\ncolumn names to match. The WHERE and LIKE clauses can be given to select rows\nusing more general conditions, as discussed in Extended SHOW.\n\nIf the data types differ from what you expect them to be based on a CREATE\nTABLE statement, note that MariaDB sometimes changes data types when you\ncreate or alter a table. The conditions under which this occurs are described\nin the Silent Column Changes article.\n\nThe FULL keyword causes the output to include the column collation and\ncomments, as well as the privileges you have for each column.\n\nYou can use db_name.tbl_name as an alternative to the tbl_name FROM db_name\nsyntax. In other words, these two statements are equivalent:\n\nSHOW COLUMNS FROM mytable FROM mydb;\nSHOW COLUMNS FROM mydb.mytable;\n\nSHOW COLUMNS displays the following values for each table column:\n\nField indicates the column name.\n\nType indicates the column data type.\n\nCollation indicates the collation for non-binary string columns, or NULL for\nother columns. This value is displayed only if you use the FULL keyword.\n\nThe Null field contains YES if NULL values can be stored in the column, NO if\nnot.\n\nThe Key field indicates whether the column is indexed:\n\n* If Key is empty, the column either is not indexed or is indexed only as a\n secondary column in a multiple-column, non-unique index.\n* If Key is PRI, the column is a PRIMARY KEY or\n is one of the columns in a multiple-column PRIMARY KEY.\n* If Key is UNI, the column is the first column of a unique-valued\n index that cannot contain NULL values.\n* If Key is MUL, multiple occurrences of a given value are allowed\n within the column. The column is the first column of a non-unique index or a\n unique-valued index that can contain NULL values.\n\nIf more than one of the Key values applies to a given column of a table, Key\ndisplays the one with the highest priority, in the order PRI, UNI, MUL.\n\nA UNIQUE index may be displayed as PRI if it cannot contain NULL values and\nthere is no PRIMARY KEY in the table. A UNIQUE index may display as MUL if\nseveral columns form a composite UNIQUE index; although the combination of the\ncolumns is unique, each column can still hold multiple occurrences of a given\nvalue.\n\nThe Default field indicates the default value that is assigned to the column.\n\nThe Extra field contains any additional information that is available about a\ngiven column.\n\n+------------------------+---------------------------------------------------+\n| Value | Description |\n+------------------------+---------------------------------------------------+\n| AUTO_INCREMENT | The column was created with the AUTO_INCREMENT |\n| | keyword. |\n+------------------------+---------------------------------------------------+\n| PERSISTENT | The column was created with the PERSISTENT |\n| | keyword. (New in 5.3) |\n+------------------------+---------------------------------------------------+\n| VIRTUAL | The column was created with the VIRTUAL keyword. |\n| | (New in 5.3) |\n+------------------------+---------------------------------------------------+\n| on update | The column is a TIMESTAMP column that is |\n| CURRENT_TIMESTAMP | automatically updated on INSERT and UPDATE. |\n+------------------------+---------------------------------------------------+\n\nPrivileges indicates the privileges you have for the column. This value is\ndisplayed only if you use the FULL keyword.\n\nComment indicates any comment the column has. This value is displayed only if\nyou use the FULL keyword.\n\nSHOW FIELDS is a synonym for SHOW COLUMNS. Also DESCRIBE and EXPLAIN can be\nused as shortcuts.\n\nYou can also list a table\'s columns with:\n\nmysqlshow db_name tbl_name\n\nSee the mysqlshow command for more details.\n\nThe DESCRIBE statement provides information similar to SHOW COLUMNS. The\ninformation_schema.COLUMNS table provides similar, but more complete,\ninformation.\n\nThe SHOW CREATE TABLE, SHOW TABLE STATUS, and SHOW INDEX statements also\nprovide information about tables.\n\nExamples\n--------\n\nSHOW COLUMNS FROM city;\n+------------+----------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+------------+----------+------+-----+---------+----------------+\n| Id | int(11) | NO | PRI | NULL | auto_increment |\n| Name | char(35) | NO | | | |\n| Country | char(3) | NO | UNI | | |\n| District | char(20) | YES | MUL | | |\n| Population | int(11) | NO | | 0 | |\n+------------+----------+------+-----+---------+----------------+\n\nSHOW COLUMNS FROM employees WHERE Type LIKE \'Varchar%\';\n+---------------+-------------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+---------------+-------------+------+-----+---------+-------+\n| first_name | varchar(30) | NO | MUL | NULL | |\n| last_name | varchar(40) | NO | | NULL | |\n| position | varchar(25) | NO | | NULL | |\n| home_address | varchar(50) | NO | | NULL | |\n| home_phone | varchar(12) | NO | | NULL | |\n| employee_code | varchar(25) | NO | UNI | NULL | |\n+---------------+-------------+------+-----+---------+-------+\n\nURL: https://mariadb.com/kb/en/show-columns/','','https://mariadb.com/kb/en/show-columns/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (338,26,'SHOW CREATE TABLE','Syntax\n------\n\nSHOW CREATE TABLE tbl_name\n\nDescription\n-----------\n\nShows the CREATE TABLE statement that created the given table. The statement\nrequires the SELECT privilege for the table. This statement also works with\nviews and SEQUENCE.\n\nSHOW CREATE TABLE quotes table and column names according to the value of the\nsql_quote_show_create server system variable.\n\nCertain SQL_MODE values can result in parts of the original CREATE statement\nnot being included in the output. MariaDB-specific table options, column\noptions, and index options are not included in the output of this statement if\nthe NO_TABLE_OPTIONS, NO_FIELD_OPTIONS and NO_KEY_OPTIONS SQL_MODE flags are\nused. All MariaDB-specific table attributes are also not shown when a\nnon-MariaDB/MySQL emulation mode is used, which includes ANSI, DB2,\nPOSTGRESQL, MSSQL, MAXDB or ORACLE.\n\nInvalid table options, column options and index options are normally commented\nout (note, that it is possible to create a table with invalid options, by\naltering a table of a different engine, where these options were valid). To\nhave them uncommented, enable the IGNORE_BAD_TABLE_OPTIONS SQL_MODE. Remember\nthat replaying a CREATE TABLE statement with uncommented invalid options will\nfail with an error, unless the IGNORE_BAD_TABLE_OPTIONS SQL_MODE is in effect.\n\nNote that SHOW CREATE TABLE is not meant to provide metadata about a table. It\nprovides information about how the table was declared, but the real table\nstructure could differ a bit. For example, if an index has been declared as\nHASH, the CREATE TABLE statement returned by SHOW CREATE TABLE will declare\nthat index as HASH; however, it is possible that the index is in fact a BTREE,\nbecause the storage engine does not support HASH.\n\nMariaDB starting with 10.2.1\n----------------------------\nMariaDB 10.2.1 permits TEXT and BLOB data types to be assigned a DEFAULT\nvalue. As a result, from MariaDB 10.2.1, SHOW CREATE TABLE will append a\nDEFAULT NULL to nullable TEXT or BLOB fields if no specific default is\nprovided.\n\nMariaDB starting with 10.2.2\n----------------------------\nFrom MariaDB 10.2.2, numbers are no longer quoted in the DEFAULT clause in\nSHOW CREATE statement. Previously, MariaDB quoted numbers.\n\nIndex Order\n-----------\n\nIndexes are sorted and displayed in the following order, which may differ from\nthe order of the CREATE TABLE statement.\n\n* PRIMARY KEY\n* UNIQUE keys where all column are NOT NULL\n* UNIQUE keys that don\'t contain partial segments\n* Other UNIQUE keys\n* LONG UNIQUE keys\n* Normal keys\n* Fulltext keys\n\nSee sql/sql_table.cc for details.\n\nExamples\n--------\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `s` char(60) DEFAULT NULL,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nWith sql_quote_show_create off:\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE t (\n id int(11) NOT NULL AUTO_INCREMENT,\n s char(60) DEFAULT NULL,\n PRIMARY KEY (id)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nUnquoted numeric DEFAULTs, from MariaDB 10.2.2:\n\nCREATE TABLE td (link TINYINT DEFAULT 1);\n\nSHOW CREATE TABLE td\\G\n*************************** 1. row ***************************\n Table: td\nCreate Table: CREATE TABLE `td` (\n `link` tinyint(4) DEFAULT 1\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nQuoted numeric DEFAULTs, until MariaDB 10.2.1:\n\nCREATE TABLE td (link TINYINT DEFAULT 1);\n\nSHOW CREATE TABLE td\\G\n*************************** 1. row ***************************\n Table: td\nCreate Table: CREATE TABLE `td` (\n `link` tinyint(4) DEFAULT \'1\'\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nSQL_MODE impacting the output:\n\nSELECT @@sql_mode;\n+------------------------------------------------------------------------------\n------------+\n| @@sql_mode \n |\n+------------------------------------------------------------------------------\n------------+\n|\nSTRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SU\nSTITUTION |\n+------------------------------------------------------------------------------\n------------+\n\nCREATE TABLE `t1` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `msg` varchar(100) DEFAULT NULL,\n PRIMARY KEY (`id`)\n ) ENGINE=InnoDB DEFAULT CHARSET=latin1\n;\n\nSHOW CREATE TABLE t1\\G\n*************************** 1. row ***************************\n Table: t1\nCreate Table: CREATE TABLE `t1` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `msg` varchar(100) DEFAULT NULL,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nSET SQL_MODE=ORACLE;\n\nSHOW CREATE TABLE t1\\G\n*************************** 1. row ***************************\n Table: t1\nCreate Table: CREATE TABLE \"t1\" (\n \"id\" int(11) NOT NULL,\n \"msg\" varchar(100) DEFAULT NULL,\n PRIMARY KEY (\"id\")\n\nURL: https://mariadb.com/kb/en/show-create-table/','','https://mariadb.com/kb/en/show-create-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (339,26,'SHOW INDEX','Syntax\n------\n\nSHOW {INDEX | INDEXES | KEYS} \n FROM tbl_name [FROM db_name]\n [WHERE expr]\n\nDescription\n-----------\n\nSHOW INDEX returns table index information. The format resembles that of the\nSQLStatistics call in ODBC.\n\nYou can use db_name.tbl_name as an alternative to the tbl_name FROM db_name\nsyntax. These two statements are equivalent:\n\nSHOW INDEX FROM mytable FROM mydb;\nSHOW INDEX FROM mydb.mytable;\n\nSHOW KEYS and SHOW INDEXES are synonyms for SHOW INDEX.\n\nYou can also list a table\'s indexes with the mariadb-show/mysqlshow command:\n\nmysqlshow -k db_name tbl_name\n\nThe information_schema.STATISTICS table stores similar information.\n\nThe following fields are returned by SHOW INDEX.\n\n+------------------------+---------------------------------------------------+\n| Field | Description |\n+------------------------+---------------------------------------------------+\n| Table | Table name |\n+------------------------+---------------------------------------------------+\n| Non_unique | 1 if the index permits duplicate values, 0 if |\n| | values must be unique. |\n+------------------------+---------------------------------------------------+\n| Key_name | Index name. The primary key is always named |\n| | PRIMARY. |\n+------------------------+---------------------------------------------------+\n| Seq_in_index | The column\'s sequence in the index, beginning |\n| | with 1. |\n+------------------------+---------------------------------------------------+\n| Column_name | Column name. |\n+------------------------+---------------------------------------------------+\n| Collation | Either A, if the column is sorted in ascending |\n| | order in the index, or NULL if it\'s not sorted. |\n+------------------------+---------------------------------------------------+\n| Cardinality | Estimated number of unique values in the index. |\n| | The cardinality statistics are calculated at |\n| | various times, and can help the optimizer make |\n| | improved decisions. |\n+------------------------+---------------------------------------------------+\n| Sub_part | NULL if the entire column is included in the |\n| | index, or the number of included characters if |\n| | not. |\n+------------------------+---------------------------------------------------+\n| Packed | NULL if the index is not packed, otherwise how |\n| | the index is packed. |\n+------------------------+---------------------------------------------------+\n| Null | NULL if NULL values are permitted in the column, |\n| | an empty string if NULLs are not permitted. |\n+------------------------+---------------------------------------------------+\n| Index_type | The index type, which can be BTREE, FULLTEXT, |\n| | HASH or RTREE. See Storage Engine Index Types. |\n+------------------------+---------------------------------------------------+\n| Comment | Other information, such as whether the index is |\n| | disabled. |\n+------------------------+---------------------------------------------------+\n| Index_comment | Contents of the COMMENT attribute when the index |\n| | was created. |\n+------------------------+---------------------------------------------------+\n| Ignored | Whether or not an index will be ignored by the |\n| | optimizer. See Ignored Indexes. From MariaDB |\n| | 10.6.0. |\n+------------------------+---------------------------------------------------+\n\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nExamples\n--------\n\nCREATE TABLE IF NOT EXISTS `employees_example` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `first_name` varchar(30) NOT NULL,\n `last_name` varchar(40) NOT NULL,\n `position` varchar(25) NOT NULL,\n `home_address` varchar(50) NOT NULL,\n `home_phone` varchar(12) NOT NULL,\n `employee_code` varchar(25) NOT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `employee_code` (`employee_code`),\n KEY `first_name` (`first_name`,`last_name`)\n) ENGINE=Aria;\n\nINSERT INTO `employees_example` (`first_name`, `last_name`, `position`,\n`home_address`, `home_phone`, `employee_code`)\n VALUES\n (\'Mustapha\', \'Mond\', \'Chief Executive Officer\', \'692 Promiscuous Plaza\',\n\'326-555-3492\', \'MM1\'),\n (\'Henry\', \'Foster\', \'Store Manager\', \'314 Savage Circle\', \'326-555-3847\',\n\'HF1\'),\n (\'Bernard\', \'Marx\', \'Cashier\', \'1240 Ambient Avenue\', \'326-555-8456\', \'BM1\'),\n (\'Lenina\', \'Crowne\', \'Cashier\', \'281 Bumblepuppy Boulevard\', \'328-555-2349\',\n\'LC1\'),\n (\'Fanny\', \'Crowne\', \'Restocker\', \'1023 Bokanovsky Lane\', \'326-555-6329\',\n\'FC1\'),\n (\'Helmholtz\', \'Watson\', \'Janitor\', \'944 Soma Court\', \'329-555-2478\', \'HW1\');\n\nSHOW INDEXES FROM employees_example\\G\n*************************** 1. row ***************************\n Table: employees_example\n Non_unique: 0\n Key_name: PRIMARY\n Seq_in_index: 1\n Column_name: id\n Collation: A\n Cardinality: 6\n Sub_part: NULL\n Packed: NULL\n Null:\n Index_type: BTREE\n Comment:\nIndex_comment: \n Ignored: NO\n*************************** 2. row ***************************\n Table: employees_example\n Non_unique: 0\n Key_name: employee_code\n Seq_in_index: 1\n Column_name: employee_code\n Collation: A\n Cardinality: 6\n Sub_part: NULL\n Packed: NULL\n Null:\n Index_type: BTREE\n Comment:\nIndex_comment: \n Ignored: NO\n*************************** 3. row ***************************\n Table: employees_example\n Non_unique: 1\n Key_name: first_name\n Seq_in_index: 1\n Column_name: first_name\n Collation: A\n Cardinality: NULL\n Sub_part: NULL\n Packed: NULL\n Null:\n Index_type: BTREE\n Comment:\nIndex_comment: \n Ignored: NO\n*************************** 4. row ***************************\n Table: employees_example\n Non_unique: 1\n Key_name: first_name\n Seq_in_index: 2\n Column_name: last_name\n Collation: A\n Cardinality: NULL\n Sub_part: NULL\n Packed: NULL\n Null:\n Index_type: BTREE\n Comment:\nIndex_comment: \n Ignored: NO\n\nURL: https://mariadb.com/kb/en/show-index/','','https://mariadb.com/kb/en/show-index/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (340,26,'SHOW EXPLAIN','Syntax\n------\n\nSHOW EXPLAIN [FORMAT=JSON] FOR <connection_id>;\nEXPLAIN [FORMAT=JSON] FOR CONNECTION <connection_id>;\n\nDescription\n-----------\n\nThe SHOW EXPLAIN command allows one to get an EXPLAIN (that is, a description\nof a query plan) of a query running in a certain connection.\n\nSHOW EXPLAIN FOR <connection_id>;\n\nwill produce an EXPLAIN output for the query that connection number\nconnection_id is running. The connection id can be obtained with SHOW\nPROCESSLIST.\n\nSHOW EXPLAIN FOR 1;\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n| id | select_type | table | type | possible_keys | key | key_len | ref |\nrows | Extra |\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n| 1 | SIMPLE | tbl | index | NULL | a | 5 | NULL |\n1000107 | Using index |\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n1 row in set, 1 warning (0.00 sec)\n\nThe output is always accompanied with a warning which shows the query the\ntarget connection is running (this shows what the EXPLAIN is for):\n\nSHOW WARNINGS;\n+-------+------+------------------------+\n| Level | Code | Message |\n+-------+------+------------------------+\n| Note | 1003 | select sum(a) from tbl |\n+-------+------+------------------------+\n1 row in set (0.00 sec)\n\nEXPLAIN FOR CONNECTION\n----------------------\n\nMariaDB starting with 10.9\n--------------------------\nThe EXPLAIN FOR CONNECTION syntax was added for MySQL compatibility.\n\nFORMAT=JSON\n-----------\n\nMariaDB starting with 10.9\n--------------------------\nSHOW EXPLAIN [FORMAT=JSON] FOR <connection_id> extends SHOW EXPLAIN to return\nmore detailed JSON output.\n\nPossible Errors\n---------------\n\nThe output can be only produced if the target connection is currently running\na query, which has a ready query plan. If this is not the case, the output\nwill be:\n\nSHOW EXPLAIN FOR 2;\nERROR 1932 (HY000): Target is not running an EXPLAINable command\n\nYou will get this error when:\n\n* the target connection is not running a command for which one can run EXPLAIN\n* the target connection is running a command for which one can run EXPLAIN, but\nthere is no query plan yet (for example, tables are open and locks are\n acquired before the query plan is produced)\n\nDifferences Between SHOW EXPLAIN and EXPLAIN Outputs\n----------------------------------------------------\n\nBackground\n----------\n\nIn MySQL, EXPLAIN execution takes a slightly different route from the way the\nreal query (typically the SELECT) is optimized. This is unfortunate, and has\ncaused a number of bugs in EXPLAIN. (For example, see MDEV-326, MDEV-410, and\nlp:1013343. lp:992942 is not directly about EXPLAIN, but it also would not\nhave existed if MySQL didn\'t try to delete parts of a query plan in the middle\nof the query)\n\nSHOW EXPLAIN examines a running SELECT, and hence its output may be slightly\ndifferent from what EXPLAIN SELECT would produce. We did our best to make sure\nthat either the difference is negligible, or SHOW EXPLAIN\'s output is closer\nto reality than EXPLAIN\'s output.\n\nList of Recorded Differences\n----------------------------\n\n* SHOW EXPLAIN may have Extra=\'no matching row in const table\', where EXPLAIN\nwould produce Extra=\'Impossible WHERE ...\'\n* For queries with subqueries, SHOW EXPLAIN may print select_type==PRIMARY\nwhere regular EXPLAIN used to print select_type==SIMPLE, or vice versa.\n\nRequired Permissions\n--------------------\n\nRunning SHOW EXPLAIN requires the same permissions as running SHOW PROCESSLIST\nwould.\n\nURL: https://mariadb.com/kb/en/show-explain/','','https://mariadb.com/kb/en/show-explain/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (341,26,'BACKUP STAGE','MariaDB starting with 10.4.1\n----------------------------\nThe BACKUP STAGE commands were introduced in MariaDB 10.4.1.\n\nThe BACKUP STAGE commands are a set of commands to make it possible to make an\nefficient external backup tool.\n\nSyntax\n------\n\nBACKUP STAGE [START | FLUSH | BLOCK_DDL | BLOCK_COMMIT | END ]\n\nIn the following text, a transactional table means InnoDB or \"InnoDB-like\nengine with redo log that can lock redo purges and can be copied without locks\nby an outside process\".\n\nGoals with BACKUP STAGE Commands\n--------------------------------\n\n* To be able to do a majority of the backup with the minimum possible server\nlocks. Especially for transactional tables (InnoDB, MyRocks etc) there is only\nneed for a very short block of new commits while copying statistics and log\ntables.\n* DDL are only needed to be blocked for a very short duration of the backup\nwhile mariabackup is copying the tables affected by DDL during the initial\npart of the backup.\n* Most non transactional tables (those that are not in use) will be copied\nduring BACKUP STAGE START. The exceptions are system statistic and log tables\nthat are not blocked during the backup until BLOCK_COMMIT.\n* Should work efficiently with backup tools that use disk snapshots.\n* Should work as efficiently as possible for all table types that store data\non the local disks.\n* As little copying as possible under higher level stages/locks. For example,\n.frm (dictionary) and .trn (trigger) files should be copying while copying the\ntable data.\n\nBACKUP STAGE Commands\n---------------------\n\nBACKUP STAGE START\n------------------\n\nThe START stage is designed for the following tasks:\n\n* Blocks purge of redo files for storage engines that needs this (Aria)\n* Start logging of DDL commands into \'datadir\'/ddl.log. This may take a short\ntime as the command has to wait until there are no active DDL commands.\n\nBACKUP STAGE FLUSH\n------------------\n\nThe FLUSH stage is designed for the following tasks:\n\n* FLUSH all changes for inactive non-transactional tables, except for\nstatistics and log tables.\n* Close all tables that are not in use, to ensure they are marked as closed\nfor the backup.\n* BLOCK all new write locks for all non transactional tables (except\nstatistics and log tables). The command will not wait for tables that are in\nuse by read-only transactions.\n\nDDLs don\'t have to be blocked at this stage as they can\'t cause the table to\nbe in an inconsistent state. This is true also for non-transactional tables.\n\nBACKUP STAGE BLOCK_DDL\n----------------------\n\nThe BLOCK_DDL stage is designed for the following tasks:\n\n* Wait for all statements using write locked non-transactional tables to end.\n* Blocks CREATE TABLE, DROP TABLE, TRUNCATE TABLE, and RENAME TABLE.\n* Blocks also start off a new ALTER TABLE and the final rename phase of ALTER\nTABLE. Running ALTER TABLES are not blocked.\n\nBACKUP STAGE BLOCK_COMMIT\n-------------------------\n\nThe BLOCK_COMMIT stage is designed for the following tasks:\n\n* Lock the binary log and commit/rollback to ensure that no changes are\ncommitted to any tables. If there are active commits or data to be copied to\nthe binary log this will be allowed to finish. Active transactions will not\naffect BLOCK_COMMIT.\n* This doesn\'t lock temporary tables that are not used by replication. However\nthese will be blocked when it\'s time to write to the binary log.\n* Lock system log tables and statistics tables, flush them and mark them\nclosed.\n\nWhen the BLOCK_COMMIT\'s stages return, this is the \'backup time\'. Everything\ncommitted will be in the backup and everything not committed will roll back.\n\nTransactional engines will continue to do changes to the redo log during the\nBLOCK COMMIT stage, but this is not important as all of these will roll back\nlater as the changes will not be committed.\n\nBACKUP STAGE END\n----------------\n\nThe END stage is designed for the following tasks:\n\n* End DDL logging\n* Free resources\n\nUsing BACKUP STAGE Commands with Backup Tools\n---------------------------------------------\n\nUsing BACKUP STAGE Commands with Mariabackup\n--------------------------------------------\n\nThe BACKUP STAGE commands are a set of commands to make it possible to make an\nefficient external backup tool. How Mariabackup uses these commands depends on\nwhether you are using the version that is bundled with MariaDB Community\nServer or the version that is bundled with MariaDB Enterprise Server. See\nMariabackup and BACKUP STAGE Commands for some examples on how Mariabackup\nuses these commands.\n\nIf you would like to use a version of Mariabackup that uses the BACKUP STAGE\ncommands in an efficient way, then one option is to use MariaDB Enterprise\nBackup that is bundled with MariaDB Enterprise Server.\n\nUsing BACKUP STAGE Commands with Storage Snapshots\n--------------------------------------------------\n\nThe BACKUP STAGE commands are a set of commands to make it possible to make an\nefficient external backup tool. These commands could even be used by tools\nthat perform backups by taking a snapshot of a file system, SAN, or some other\nkind of storage device. See Storage Snapshots and BACKUP STAGE Commands for\nsome examples on how to use each BACKUP STAGE command in an efficient way.\n\nPrivileges\n----------\n\nBACKUP STAGE requires the RELOAD privilege.\n\nNotes\n-----\n\n* Only one connection can run BACKUP STAGE START. If a second connection\ntries, it will wait until the first one has executed BACKUP STAGE END.\n* If the user skips a BACKUP STAGE, then all intermediate backup stages will\nautomatically be run. This will allow us to add new stages within the BACKUP\nSTAGE hierarchy in the future with even more precise locks without causing\nproblems for tools using an earlier version of the BACKUP STAGE implementation.\n* One can use the max_statement_time or lock_wait_timeout system variables to\nensure that a BACKUP STAGE command doesn\'t block the server too long.\n* DDL logging will only be available in MariaDB Enterprise Server 10.2 and\nlater.\n* A disconnect will automatically release backup stages.\n* There is no easy way to see which is the current stage.\n\nURL: https://mariadb.com/kb/en/backup-stage/','','https://mariadb.com/kb/en/backup-stage/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (342,26,'BACKUP LOCK','MariaDB starting with 10.4.2\n----------------------------\nThe BACKUP LOCK command was introduced in MariaDB 10.4.2.\n\nBACKUP LOCK blocks a table from DDL statements. This is mainly intended to be\nused by tools like mariabackup that need to ensure there are no DDLs on a\ntable while the table files are opened. For example, for an Aria table that\nstores data in 3 files with extensions .frm, .MAI and .MAD. Normal read/write\noperations can continue as normal.\n\nSyntax\n------\n\nTo lock a table:\n\nBACKUP LOCK table_name\n\nTo unlock a table:\n\nBACKUP UNLOCK\n\nUsage in a Backup Tool\n----------------------\n\nBACKUP LOCK [database.]table_name;\n - Open all files related to a table (for example, t.frm, t.MAI and t.MYD)\nBACKUP UNLOCK;\n- Copy data\n- Close files\n\nThis ensures that all files are from the same generation, that is created at\nthe same time by the MariaDB server. This works, because the open files will\npoint to the original table files which will not be affected if there is any\nALTER TABLE while copying the files.\n\nPrivileges\n----------\n\nBACKUP LOCK requires the RELOAD privilege.\n\nNotes\n-----\n\n* The idea is that the BACKUP LOCK should be held for as short a time as\npossible by the backup tool. The time to take an uncontested lock is very\nshort! One can easily do 50,000 locks/unlocks per second on low end hardware.\n* One should use different connections for BACKUP STAGE commands and BACKUP\nLOCK.\n\nImplementation\n--------------\n\n* Internally, BACKUP LOCK is implemented by taking an MDLSHARED_HIGH_PRIO MDL\nlock on the table object, which protects the table from any DDL operations.\n\nURL: https://mariadb.com/kb/en/backup-lock/','','https://mariadb.com/kb/en/backup-lock/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (343,26,'FLUSH','Syntax\n------\n\nFLUSH [NO_WRITE_TO_BINLOG | LOCAL]\n flush_option [, flush_option] ...\n\nor when flushing tables:\n\nFLUSH [NO_WRITE_TO_BINLOG | LOCAL] TABLES [table_list] [table_flush_option]\n\nwhere table_list is a list of tables separated by , (comma).\n\nDescription\n-----------\n\nThe FLUSH statement clears or reloads various internal caches used by MariaDB.\nTo execute FLUSH, you must have the RELOAD privilege. See GRANT.\n\nThe RESET statement is similar to FLUSH. See RESET.\n\nYou cannot issue a FLUSH statement from within a stored function or a trigger.\nDoing so within a stored procedure is permitted, as long as it is not called\nby a stored function or trigger. See Stored Routine Limitations, Stored\nFunction Limitations and Trigger Limitations.\n\nIf a listed table is a view, an error like the following will be produced:\n\nERROR 1347 (HY000): \'test.v\' is not BASE TABLE\n\nBy default, FLUSH statements are written to the binary log and will be\nreplicated. The NO_WRITE_TO_BINLOG keyword (LOCAL is an alias) will ensure the\nstatement is not written to the binary log.\n\nThe different flush options are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| CHANGED_PAGE_BITMAPS | XtraDB only. Internal command used for backup |\n| | purposes. See the Information Schema |\n| | CHANGED_PAGE_BITMAPS Table. |\n+---------------------------+------------------------------------------------+\n| CLIENT_STATISTICS | Reset client statistics (see SHOW |\n| | CLIENT_STATISTICS). |\n+---------------------------+------------------------------------------------+\n| DES_KEY_FILE | Reloads the DES key file (Specified with the |\n| | --des-key-file startup option). |\n+---------------------------+------------------------------------------------+\n| HOSTS | Flush the hostname cache (used for converting |\n| | ip to host names and for unblocking blocked |\n| | hosts. See max_connect_errors and |\n| | performance_schema.host_cache |\n+---------------------------+------------------------------------------------+\n| INDEX_STATISTICS | Reset index statistics (see SHOW |\n| | INDEX_STATISTICS). |\n+---------------------------+------------------------------------------------+\n| [ERROR | ENGINE | | Close and reopen the specified log type, or |\n| GENERAL | SLOW | BINARY | all log types if none are specified. FLUSH |\n| | RELAY] LOGS | RELAY LOGS [connection-name] can be used to |\n| | flush the relay logs for a specific |\n| | connection. Only one connection can be |\n| | specified per FLUSH command. See Multi-source |\n| | replication. FLUSH ENGINE LOGS will delete |\n| | all unneeded Aria redo logs. Since MariaDB |\n| | 10.1.30 and MariaDB 10.2.11, FLUSH BINARY |\n| | LOGS DELETE_DOMAIN_ID=(list-of-domains) can |\n| | be used to discard obsolete GTID domains from |\n| | the server\'s binary log state. In order for |\n| | this to be successful, no event group from |\n| | the listed GTID domains can be present in |\n| | existing binary log files. If some still |\n| | exist, then they must be purged prior to |\n| | executing this command. If the command |\n| | completes successfully, then it also rotates |\n| | the binary log. |\n+---------------------------+------------------------------------------------+\n| MASTER | Deprecated option, use RESET MASTER instead. |\n+---------------------------+------------------------------------------------+\n| PRIVILEGES | Reload all privileges from the privilege |\n| | tables in the mysql database. If the server |\n| | is started with --skip-grant-table option, |\n| | this will activate the privilege tables again. |\n+---------------------------+------------------------------------------------+\n| QUERY CACHE | Defragment the query cache to better utilize |\n| | its memory. If you want to reset the query |\n| | cache, you can do it with RESET QUERY CACHE. |\n+---------------------------+------------------------------------------------+\n| QUERY_RESPONSE_TIME | See the QUERY_RESPONSE_TIME plugin. |\n+---------------------------+------------------------------------------------+\n| SLAVE | Deprecated option, use RESET REPLICA or RESET |\n| | SLAVE instead. |\n+---------------------------+------------------------------------------------+\n| SSL | Used to dynamically reinitialize the server\'s |\n| | TLS context by reloading the files defined by |\n| | several TLS system variables. See FLUSH SSL |\n| | for more information. This command was first |\n| | added in MariaDB 10.4.1. |\n+---------------------------+------------------------------------------------+\n| STATUS | Resets all server status variables that can |\n| | be reset to 0. Not all global status |\n| | variables support this, so not all global |\n| | values are reset. See FLUSH STATUS for more |\n| | information. |\n+---------------------------+------------------------------------------------+\n| TABLE | Close tables given as options or all open |\n| | tables if no table list was used. From |\n| | MariaDB 10.4.1, using without any table list |\n| | will only close tables not in use, and tables |\n| | not locked by the FLUSH TABLES connection. If |\n| | there are no locked tables, FLUSH TABLES will |\n| | be instant and will not cause any waits, as |\n| | it no longer waits for tables in use. When a |\n| | table list is provided, from MariaDB 10.4.1, |\n| | the server will wait for the end of any |\n| | transactions that are using the tables. |\n| | Previously, FLUSH TABLES only waited for the |\n| | statements to complete. |\n+---------------------------+------------------------------------------------+\n| TABLES | Same as FLUSH TABLE. |\n+---------------------------+------------------------------------------------+\n| TABLES ... FOR EXPORT | For InnoDB tables, flushes table changes to |\n| | disk to permit binary table copies while the |\n| | server is running. See FLUSH TABLES ... FOR |\n| | EXPORT for more. |\n+---------------------------+------------------------------------------------+\n| TABLES WITH READ LOCK | Closes all open tables. New tables are only |\n| | allowed to be opened with read locks until an |\n| | UNLOCK TABLES is given. |\n+---------------------------+------------------------------------------------+\n| TABLES WITH READ LOCK | As TABLES WITH READ LOCK but also disable all |\n| AND DISABLE CHECKPOINT | checkpoint writes by transactional table |\n| | engines. This is useful when doing a disk |\n| | snapshot of all tables. |\n+---------------------------+------------------------------------------------+\n| TABLE_STATISTICS | Reset table statistics (see SHOW |\n| | TABLE_STATISTICS). |\n+---------------------------+------------------------------------------------+\n| USER_RESOURCES | Resets all per hour user resources. This |\n| | enables clients that have exhausted their |\n| | resources to connect again. |\n+---------------------------+------------------------------------------------+\n| USER_STATISTICS | Reset user statistics (see SHOW |\n| | USER_STATISTICS). |\n+---------------------------+------------------------------------------------+\n| USER_VARIABLES | Reset user variables (see User-defined |\n| | variables). |\n+---------------------------+------------------------------------------------+\n\nYou can also use the mysqladmin client to flush things. Use mysqladmin --help\nto examine what flush commands it supports.\n\nFLUSH RELAY LOGS\n----------------\n\nFLUSH RELAY LOGS \'connection_name\';\n\nCompatibility with MySQL\n------------------------\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after the FLUSH command.\n\nFor example, one can now use:\n\nFLUSH RELAY LOGS FOR CHANNEL \'connection_name\';\n\nFLUSH STATUS\n------------\n\nServer status variables can be reset by executing the following:\n\nFLUSH STATUS;\n\nGlobal Status Variables that Support FLUSH STATUS\n-------------------------------------------------\n\nNot all global status variables support being reset by FLUSH STATUS.\nCurrently, the following status variables are reset by FLUSH STATUS:\n\n* Aborted_clients\n* Aborted_connects\n* Binlog_cache_disk_use\n* Binlog_cache_use\n* Binlog_stmt_cache_disk_use\n* Binlog_stmt_cache_use\n* Connection_errors_accept\n* Connection_errors_internal\n* Connection_errors_max_connections\n* Connection_errors_peer_address\n* Connection_errors_select\n* Connection_errors_tcpwrap\n* Created_tmp_files\n* Delayed_errors\n* Delayed_writes\n* Feature_check_constraint\n* Feature_delay_key_write\n* Max_used_connections\n* Opened_plugin_libraries\n* Performance_schema_accounts_lost\n* Performance_schema_cond_instances_lost\n* Performance_schema_digest_lost\n* Performance_schema_file_handles_lost\n* Performance_schema_file_instances_lost\n* Performance_schema_hosts_lost\n* Performance_schema_locker_lost\n* Performance_schema_mutex_instances_lost\n* Performance_schema_rwlock_instances_lost\n* Performance_schema_session_connect_attrs_lost\n* Performance_schema_socket_instances_lost\n* Performance_schema_stage_classes_lost\n* Performance_schema_statement_classes_lost\n* Performance_schema_table_handles_lost\n* Performance_schema_table_instances_lost\n* Performance_schema_thread_instances_lost\n* Performance_schema_users_lost\n* Qcache_hits\n* Qcache_inserts\n* Qcache_lowmem_prunes\n* Qcache_not_cached\n* Rpl_semi_sync_master_no_times\n* Rpl_semi_sync_master_no_tx\n* Rpl_semi_sync_master_timefunc_failures\n* Rpl_semi_sync_master_wait_pos_backtraverse\n* Rpl_semi_sync_master_yes_tx\n* Rpl_transactions_multi_engine\n* Server_audit_writes_failed\n* Slave_retried_transactions\n* Slow_launch_threads\n* Ssl_accept_renegotiates\n* Ssl_accepts\n* Ssl_callback_cache_hits\n* Ssl_client_connects\n* Ssl_connect_renegotiates\n* Ssl_ctx_verify_depth\n* Ssl_ctx_verify_mode\n* Ssl_finished_accepts\n* Ssl_finished_connects\n* Ssl_session_cache_hits\n* Ssl_session_cache_misses\n* Ssl_session_cache_overflows\n* Ssl_session_cache_size\n* Ssl_session_cache_timeouts\n* Ssl_sessions_reused\n* Ssl_used_session_cache_entries\n* Subquery_cache_hit\n* Subquery_cache_miss\n* Table_locks_immediate\n* Table_locks_waited\n* Tc_log_max_pages_used\n* Tc_log_page_waits\n* Transactions_gtid_foreign_engine\n* Transactions_multi_engine\n\nThe different usage of FLUSH TABLES\n-----------------------------------\n\nThe purpose of FLUSH TABLES\n---------------------------\n\nThe purpose of FLUSH TABLES is to clean up the open table cache and table\ndefinition cache from not in use tables. This frees up memory and file\ndescriptors. Normally this is not needed as the caches works on a FIFO bases,\nbut can be useful if the server seams to use up to much memory for some reason.\n\nThe purpose of FLUSH TABLES WITH READ LOCK \n-------------------------------------------\n\nFLUSH TABLES WITH READ LOCK is useful if you want to take a backup of some\ntables. When FLUSH TABLES WITH READ LOCK returns, all write access to tables\nare blocked and all tables are marked as \'properly closed\' on disk. The tables\ncan still be used for read operations.\n\nThe purpose of FLUSH TABLES table_list\n--------------------------------------\n\nFLUSH TABLES table_list is useful if you want to copy a table object/files to\nor from the server. This command puts a lock that stops new users of the table\nand will wait until everyone has stopped using the table. The table is then\nremoved from the table definition and table cache.\n\nNote that it\'s up to the user to ensure that no one is accessing the table\nbetween FLUSH TABLES and the table is copied to or from the server. This can\nbe secured by using LOCK TABLES.\n','','https://mariadb.com/kb/en/flush/');
+update help_topic set description = CONCAT(description, '\nIf there are any tables locked by the connection that is using FLUSH TABLES\nall the locked tables will be closed as part of the flush and reopened and\nrelocked before FLUSH TABLES returns. This allows one to copy the table after\nFLUSH TABLES returns without having any writes on the table. For now this\nworks works with most tables, except InnoDB as InnoDB may do background purges\non the table even while it\'s write locked.\n\nThe purpose of FLUSH TABLES table_list WITH READ LOCK\n-----------------------------------------------------\n\nFLUSH TABLES table_list WITH READ LOCK should work as FLUSH TABLES WITH READ\nLOCK, but only those tables that are listed will be properly closed. However\nin practice this works exactly like FLUSH TABLES WITH READ LOCK as the FLUSH\ncommand has anyway to wait for all WRITE operations to end because we are\ndepending on a global read lock for this code. In the future we should\nconsider fixing this to instead use meta data locks.\n\nImplementation of FLUSH TABLES commands in MariaDB 10.4.8 and above\n-------------------------------------------------------------------\n\nImplementation of FLUSH TABLES\n------------------------------\n\n* Free memory and file descriptors not in use\n\nImplementation of FLUSH TABLES WITH READ LOCK\n---------------------------------------------\n\n* Lock all tables read only for simple old style backup.\n* All background writes are suspended and tables are marked as closed.\n* No statement requiring table changes are allowed for any user until UNLOCK\nTABLES.\n\nInstead of using FLUSH TABLE WITH READ LOCK one should in most cases instead\nuse BACKUP STAGE BLOCK_COMMIT.\n\nImplementation of FLUSH TABLES table_list\n-----------------------------------------\n\n* Free memory and file descriptors for tables not in use from table list.\n* Lock given tables as read only.\n* Wait until all translations has ended that uses any of the given tables.\n* Wait until all background writes are suspended and tables are marked as\nclosed.\n\nImplementation of FLUSH TABLES table_list FOR EXPORT\n----------------------------------------------------\n\n* Free memory and file descriptors for tables not in use from table list\n* Lock given tables as read.\n* Wait until all background writes are suspended and tables are marked as\nclosed.\n* Check that all tables supports FOR EXPORT\n* No changes to these tables allowed until UNLOCK TABLES\n\nThis is basically the same behavior as in old MariaDB version if one first\nlock the tables, then do FLUSH TABLES. The tables will be copyable until\nUNLOCK TABLES.\n\nFLUSH SSL\n---------\n\nMariaDB starting with 10.4\n--------------------------\nThe FLUSH SSL command was first added in MariaDB 10.4.\n\nIn MariaDB 10.4 and later, the FLUSH SSL command can be used to dynamically\nreinitialize the server\'s TLS context. This is most useful if you need to\nreplace a certificate that is about to expire without restarting the server.\n\nThis operation is performed by reloading the files defined by the following\nTLS system variables:\n\n* ssl_cert\n* ssl_key\n* ssl_ca\n* ssl_capath\n* ssl_crl\n* ssl_crlpath\n\nThese TLS system variables are not dynamic, so their values can not be changed\nwithout restarting the server.\n\nIf you want to dynamically reinitialize the server\'s TLS context, then you\nneed to change the certificate and key files at the relevant paths defined by\nthese TLS system variables, without actually changing the values of the\nvariables. See MDEV-19341 for more information.\n\nReducing Memory Usage\n---------------------\n\nTo flush some of the global caches that take up memory, you could execute the\nfollowing command:\n\nFLUSH LOCAL HOSTS,\n QUERY CACHE,\n TABLE_STATISTICS,\n INDEX_STATISTICS,\n USER_STATISTICS;\n\nURL: https://mariadb.com/kb/en/flush/') WHERE help_topic_id = 343;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (344,26,'FLUSH QUERY CACHE','Description\n-----------\n\nYou can defragment the query cache to better utilize its memory with the FLUSH\nQUERY CACHE statement. The statement does not remove any queries from the\ncache.\n\nThe RESET QUERY CACHE statement removes all query results from the query\ncache. The FLUSH TABLES statement also does this.\n\nURL: https://mariadb.com/kb/en/flush-query-cache/','','https://mariadb.com/kb/en/flush-query-cache/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (345,26,'FLUSH TABLES FOR EXPORT','Syntax\n------\n\nFLUSH TABLES table_name [, table_name] FOR EXPORT\n\nDescription\n-----------\n\nFLUSH TABLES ... FOR EXPORT flushes changes to the specified tables to disk so\nthat binary copies can be made while the server is still running. This works\nfor Archive, Aria, CSV, InnoDB, MyISAM, MERGE, and XtraDB tables.\n\nThe table is read locked until one has issued UNLOCK TABLES.\n\nIf a storage engine does not support FLUSH TABLES FOR EXPORT, a 1031 error\n(SQLSTATE \'HY000\') is produced.\n\nIf FLUSH TABLES ... FOR EXPORT is in effect in the session, the following\nstatements will produce an error if attempted:\n\n* FLUSH TABLES WITH READ LOCK\n* FLUSH TABLES ... WITH READ LOCK\n* FLUSH TABLES ... FOR EXPORT\n* Any statement trying to update any table\n\nIf any of the following statements is in effect in the session, attempting\nFLUSH TABLES ... FOR EXPORT will produce an error.\n\n* FLUSH TABLES ... WITH READ LOCK\n* FLUSH TABLES ... FOR EXPORT\n* LOCK TABLES ... READ\n* LOCK TABLES ... WRITE\n\nFLUSH FOR EXPORT is not written to the binary log.\n\nThis statement requires the RELOAD and the LOCK TABLES privileges.\n\nIf one of the specified tables cannot be locked, none of the tables will be\nlocked.\n\nIf a table does not exist, an error like the following will be produced:\n\nERROR 1146 (42S02): Table \'test.xxx\' doesn\'t exist\n\nIf a table is a view, an error like the following will be produced:\n\nERROR 1347 (HY000): \'test.v\' is not BASE TABLE\n\nExample\n-------\n\nFLUSH TABLES test.t1 FOR EXPORT;\n# Copy files related to the table (see below)\nUNLOCK TABLES;\n\nFor a full description, please see copying MariaDB tables.\n\nURL: https://mariadb.com/kb/en/flush-tables-for-export/','','https://mariadb.com/kb/en/flush-tables-for-export/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (346,26,'SHOW RELAYLOG EVENTS','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nSHOW RELAYLOG [\'connection_name\'] EVENTS\n [IN \'log_name\'] [FROM pos] [LIMIT [offset,] row_count]\n [ FOR CHANNEL \'channel_name\']\n\nDescription\n-----------\n\nOn replicas, this command shows the events in the relay log. If \'log_name\' is\nnot specified, the first relay log is shown.\n\nSyntax for the LIMIT clause is the same as for SELECT ... LIMIT.\n\nUsing the LIMIT clause is highly recommended because the SHOW RELAYLOG EVENTS\ncommand returns the complete contents of the relay log, which can be quite\nlarge.\n\nThis command does not return events related to setting user and system\nvariables. If you need those, use mariadb-binlog/mysqlbinlog.\n\nOn the primary, this command does nothing.\n\nRequires the REPLICA MONITOR privilege (>= MariaDB 10.5.9), the REPLICATION\nSLAVE ADMIN privilege (>= MariaDB 10.5.2) or the REPLICATION SLAVE privilege\n(<= MariaDB 10.5.1).\n\nconnection_name\n---------------\n\nIf there is only one nameless primary, or the default primary (as specified by\nthe default_master_connection system variable) is intended, connection_name\ncan be omitted. If provided, the SHOW RELAYLOG statement will apply to the\nspecified primary. connection_name is case-insensitive.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after SHOW RELAYLOG.\n\nURL: https://mariadb.com/kb/en/show-relaylog-events/','','https://mariadb.com/kb/en/show-relaylog-events/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (347,26,'SHOW SLAVE STATUS','Syntax\n------\n\nSHOW SLAVE [\"connection_name\"] STATUS [FOR CHANNEL \"connection_name\"]\nSHOW REPLICA [\"connection_name\"] STATUS -- From MariaDB 10.5.1\n\nor\n\nSHOW ALL SLAVES STATUS\nSHOW ALL REPLICAS STATUS -- From MariaDB 10.5.1\n\nDescription\n-----------\n\nThis statement is to be run on a replica and provides status information on\nessential parameters of the replica threads.\n\nThis statement requires the SUPER privilege, the REPLICATION_CLIENT privilege,\nor, from MariaDB 10.5.2, the REPLICATION SLAVE ADMIN privilege, or, from\nMariaDB 10.5.9, the REPLICA MONITOR privilege.\n\nMulti-Source\n------------\n\nThe ALL and \"connection_name\" options allow you to connect to many primaries\nat the same time.\n\nALL SLAVES (or ALL REPLICAS from MariaDB 10.5.1) gives you a list of all\nconnections to the primary nodes.\n\nThe rows will be sorted according to Connection_name.\n\nIf you specify a connection_name, you only get the information about that\nconnection. If connection_name is not used, then the name set by\ndefault_master_connection is used. If the connection name doesn\'t exist you\nwill get an error: There is no master connection for \'xxx\'.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after SHOW SLAVE.\n\nColumn Descriptions\n-------------------\n\n+---------------+---------------------------------------+-------------------+\n| Name | Description | Added |\n+---------------+---------------------------------------+-------------------+\n| Connection_na | Name of the primary connection. | |\n| e | Returned with SHOW ALL SLAVES STATUS | |\n| | (or SHOW ALL REPLICAS STATUS from | |\n| | MariaDB 10.5.1) only. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_SQL_Sta | State of SQL thread. Returned with | |\n| e | SHOW ALL SLAVES STATUS (or SHOW ALL | |\n| | REPLICAS STATUS from MariaDB 10.5.1) | |\n| | only. See Slave SQL Thread States. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_IO_Stat | State of I/O thread. See Slave I/O | |\n| | Thread States. | |\n+---------------+---------------------------------------+-------------------+\n| Master_host | Master host that the replica is | |\n| | connected to. | |\n+---------------+---------------------------------------+-------------------+\n| Master_user | Account user name being used to | |\n| | connect to the primary. | |\n+---------------+---------------------------------------+-------------------+\n| Master_port | The port being used to connect to | |\n| | the primary. | |\n+---------------+---------------------------------------+-------------------+\n| Connect_Retry | Time in seconds between retries to | |\n| | connect. The default is 60. The | |\n| | CHANGE MASTER TO statement can set | |\n| | this. The master-retry-count option | |\n| | determines the maximum number of | |\n| | reconnection attempts. | |\n+---------------+---------------------------------------+-------------------+\n| Master_Log_Fi | Name of the primary binary log file | |\n| e | that the I/O thread is currently | |\n| | reading from. | |\n+---------------+---------------------------------------+-------------------+\n| Read_Master_L | Position up to which the I/O thread | |\n| g_Pos | has read in the current primary | |\n| | binary log file. | |\n+---------------+---------------------------------------+-------------------+\n| Relay_Log_Fil | Name of the relay log file that the | |\n| | SQL thread is currently processing. | |\n+---------------+---------------------------------------+-------------------+\n| Relay_Log_Pos | Position up to which the SQL thread | |\n| | has finished processing in the | |\n| | current relay log file. | |\n+---------------+---------------------------------------+-------------------+\n| Relay_Master_ | Name of the primary binary log file | |\n| og_File | that contains the most recent event | |\n| | executed by the SQL thread. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_IO_Runn | Whether the replica I/O thread is | |\n| ng | running and connected (Yes), running | |\n| | but not connected to a primary | |\n| | (Connecting) or not running (No). | |\n+---------------+---------------------------------------+-------------------+\n| Slave_SQL_Run | Whether or not the SQL thread is | |\n| ing | running. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Do_ | Databases specified for replicating | |\n| B | with the replicate_do_db option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Ign | Databases specified for ignoring | |\n| re_DB | with the replicate_ignore_db option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Do_ | Tables specified for replicating | |\n| able | with the replicate_do_table option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Ign | Tables specified for ignoring with | |\n| re_Table | the replicate_ignore_table option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Wil | Tables specified for replicating | |\n| _Do_Table | with the replicate_wild_do_table | |\n| | option. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Wil | Tables specified for ignoring with | |\n| _Ignore_Table | the replicate_wild_ignore_table | |\n| | option. | |\n+---------------+---------------------------------------+-------------------+\n| Last_Errno | Alias for Last_SQL_Errno (see below) | |\n+---------------+---------------------------------------+-------------------+\n| Last Error | Alias for Last_SQL_Error (see below) | |\n+---------------+---------------------------------------+-------------------+\n| Skip_Counter | Number of events that a replica | |\n| | skips from the master, as recorded | |\n| | in the sql_slave_skip_counter system | |\n| | variable. | |\n+---------------+---------------------------------------+-------------------+\n| Exec_Master_L | Position up to which the SQL thread | |\n| g_Pos | has processed in the current master | |\n| | binary log file. Can be used to | |\n| | start a new replica from a current | |\n| | replica with the CHANGE MASTER TO | |\n| | ... MASTER_LOG_POS option. | |\n+---------------+---------------------------------------+-------------------+\n| Relay_Log_Spa | Total size of all relay log files | |\n| e | combined. | |\n+---------------+---------------------------------------+-------------------+\n| Until_Conditi | | |\n| n | | |\n+---------------+---------------------------------------+-------------------+\n| Until_Log_Fil | The MASTER_LOG_FILE value of the | |\n| | START SLAVE UNTIL condition. | |\n+---------------+---------------------------------------+-------------------+\n| Until_Log_Pos | The MASTER_LOG_POS value of the | |\n| | START SLAVE UNTIL condition. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Al | Whether an SSL connection is | |\n| owed | permitted (Yes), not permitted (No) | |\n| | or permitted but without the replica | |\n| | having SSL support enabled (Ignored) | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_CA | The MASTER_SSL_CA option of the | |\n| File | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_CA | The MASTER_SSL_CAPATH option of the | |\n| Path | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Ce | The MASTER_SSL_CERT option of the | |\n| t | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Ci | The MASTER_SSL_CIPHER option of the | |\n| her | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Ke | The MASTER_SSL_KEY option of the | |\n| | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Seconds_Behin | Difference between the timestamp | |\n| _Master | logged on the master for the event | |\n| | that the replica is currently | |\n| | processing, and the current | |\n| | timestamp on the replica. Zero if | |\n| | the replica is not currently | |\n| | processing an event. With parallel | |\n| | replication, seconds_behind_master | |\n| | is updated only after transactions | |\n| | commit. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Ve | The MASTER_SSL_VERIFY_SERVER_CERT | |\n| ify_Server_Ce | option of the CHANGE MASTER TO | |\n| t | statement. | |\n+---------------+---------------------------------------+-------------------+\n| Last_IO_Errno | Error code of the most recent error | |\n| | that caused the I/O thread to stop | |\n| | (also recorded in the replica\'s | |\n| | error log). 0 means no error. RESET | |\n| | SLAVE or RESET MASTER will reset | |\n| | this value. | |\n+---------------+---------------------------------------+-------------------+\n| Last_IO_Error | Error message of the most recent | |\n| | error that caused the I/O thread to | |\n| | stop (also recorded in the replica\'s | |\n| | error log). An empty string means no | |\n| | error. RESET SLAVE or RESET MASTER | |\n| | will reset this value. | |\n+---------------+---------------------------------------+-------------------+\n| Last_SQL_Errn | Error code of the most recent error | |\n| | that caused the SQL thread to stop | |\n| | (also recorded in the replica\'s | |\n| | error log). 0 means no error. RESET | |\n| | SLAVE or RESET MASTER will reset | |\n| | this value. | |\n+---------------+---------------------------------------+-------------------+\n| Last_SQL_Erro | Error message of the most recent | |\n| | error that caused the SQL thread to | |\n| | stop (also recorded in the replica\'s | |','','https://mariadb.com/kb/en/show-replica-status/');
+update help_topic set description = CONCAT(description, '\n| | error log). An empty string means no | |\n| | error. RESET SLAVE or RESET MASTER | |\n| | will reset this value. | |\n+---------------+---------------------------------------+-------------------+\n| Replicate_Ign | List of server_ids that are | |\n| re_Server_Ids | currently being ignored for | |\n| | replication purposes, or an empty | |\n| | string for none, as specified in the | |\n| | IGNORE_SERVER_IDS option of the | |\n| | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_Server | The master\'s server_id value. | |\n| Id | | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Cr | The MASTER_SSL_CRL option of the | |\n| | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Master_SSL_Cr | The MASTER_SSL_CRLPATH option of the | |\n| path | CHANGE MASTER TO statement. | |\n+---------------+---------------------------------------+-------------------+\n| Using_Gtid | Whether or not global transaction | |\n| | ID\'s are being used for replication | |\n| | (can be No, Slave_Pos, or | |\n| | Current_Pos). | |\n+---------------+---------------------------------------+-------------------+\n| Gtid_IO_Pos | Current global transaction ID value. | |\n+---------------+---------------------------------------+-------------------+\n| Retried_trans | Number of retried transactions for | |\n| ctions | this connection. Returned with SHOW | |\n| | ALL SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| Max_relay_log | Max relay log size for this | |\n| size | connection. Returned with SHOW ALL | |\n| | SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| Executed_log_ | How many log entries the replica has | |\n| ntries | executed. Returned with SHOW ALL | |\n| | SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_receive | How many heartbeats we have got from | |\n| _heartbeats | the master. Returned with SHOW ALL | |\n| | SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_heartbe | How often to request a heartbeat | |\n| t_period | packet from the master (in seconds). | |\n| | Returned with SHOW ALL SLAVES STATUS | |\n| | only. | |\n+---------------+---------------------------------------+-------------------+\n| Gtid_Slave_Po | GTID of the last event group | |\n| | replicated on a replica server, for | |\n| | each replication domain, as stored | |\n| | in the gtid_slave_pos system | |\n| | variable. Returned with SHOW ALL | |\n| | SLAVES STATUS only. | |\n+---------------+---------------------------------------+-------------------+\n| SQL_Delay | Value specified by MASTER_DELAY in | MariaDB 10.2.3 |\n| | CHANGE MASTER (or 0 if none). | |\n+---------------+---------------------------------------+-------------------+\n| SQL_Remaining | When the replica is delaying the | MariaDB 10.2.3 |\n| Delay | execution of an event due to | |\n| | MASTER_DELAY, this is the number of | |\n| | seconds of delay remaining before | |\n| | the event will be applied. | |\n| | Otherwise, the value is NULL. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_SQL_Run | The state of the SQL driver threads, | MariaDB 10.2.3 |\n| ing_State | same as in SHOW PROCESSLIST. When | |\n| | the replica is delaying the | |\n| | execution of an event due to | |\n| | MASTER_DELAY, this field displays: | |\n| | \"Waiting until MASTER_DELAY seconds | |\n| | after master executed event\". | |\n+---------------+---------------------------------------+-------------------+\n| Slave_DDL_Gro | This status variable counts the | MariaDB 10.3.7 |\n| ps | occurrence of DDL statements. This | |\n| | is a replica-side counter for | |\n| | optimistic parallel replication. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_Non_Tra | This status variable counts the | MariaDB 10.3.7 |\n| sactional_Gro | occurrence of non-transactional | |\n| ps | event groups. This is a | |\n| | replica-side counter for optimistic | |\n| | parallel replication. | |\n+---------------+---------------------------------------+-------------------+\n| Slave_Transac | This status variable counts the | MariaDB 10.3.7 |\n| ional_Groups | occurrence of transactional event | |\n| | groups. This is a replica-side | |\n| | counter for optimistic parallel | |\n| | replication. | |\n+---------------+---------------------------------------+-------------------+\n\nSHOW REPLICA STATUS\n-------------------\n\nMariaDB starting with 10.5.1\n----------------------------\nSHOW REPLICA STATUS is an alias for SHOW SLAVE STATUS from MariaDB 10.5.1.\n\nExamples\n--------\n\nIf you issue this statement using the mysql client, you can use a \\G statement\nterminator rather than a semicolon to obtain a more readable vertical layout.\n\nSHOW SLAVE STATUS\\G\n*************************** 1. row ***************************\n Slave_IO_State: Waiting for master to send event\n Master_Host: db01.example.com\n Master_User: replicant\n Master_Port: 3306\n Connect_Retry: 60\n Master_Log_File: mariadb-bin.000010\n Read_Master_Log_Pos: 548\n Relay_Log_File: relay-bin.000004\n Relay_Log_Pos: 837\n Relay_Master_Log_File: mariadb-bin.000010\n Slave_IO_Running: Yes\n Slave_SQL_Running: Yes\n Replicate_Do_DB:\n Replicate_Ignore_DB:\n Replicate_Do_Table:\n Replicate_Ignore_Table:\n Replicate_Wild_Do_Table:\n Replicate_Wild_Ignore_Table:\n Last_Errno: 0\n Last_Error:\n Skip_Counter: 0\n Exec_Master_Log_Pos: 548\n Relay_Log_Space: 1497\n Until_Condition: None\n Until_Log_File:\n Until_Log_Pos: 0\n Master_SSL_Allowed: No\n Master_SSL_CA_File:\n Master_SSL_CA_Path:\n Master_SSL_Cert:\n Master_SSL_Cipher:\n Master_SSL_Key:\n Seconds_Behind_Master: 0\nMaster_SSL_Verify_Server_Cert: No\n Last_IO_Errno: 0\n Last_IO_Error:\n Last_SQL_Errno: 0\n Last_SQL_Error:\n Replicate_Ignore_Server_Ids:\n Master_Server_Id: 101\n Master_SSL_Crl:\n Master_SSL_Crlpath:\n Using_Gtid: No\n Gtid_IO_Pos:\n\nSHOW ALL SLAVES STATUS\\G\n*************************** 1. row ***************************\n Connection_name:\n Slave_SQL_State: Slave has read all relay log; waiting for the\nslave I/O thread to update it\n Slave_IO_State: Waiting for master to send event\n Master_Host: db01.example.com\n Master_User: replicant\n Master_Port: 3306\n Connect_Retry: 60\n Master_Log_File: mariadb-bin.000010\n Read_Master_Log_Pos: 3608\n Relay_Log_File: relay-bin.000004\n Relay_Log_Pos: 3897\n Relay_Master_Log_File: mariadb-bin.000010\n Slave_IO_Running: Yes\n Slave_SQL_Running: Yes\n Replicate_Do_DB:\n Replicate_Ignore_DB:\n Replicate_Do_Table:\n Replicate_Ignore_Table:\n Replicate_Wild_Do_Table:\n Replicate_Wild_Ignore_Table:\n Last_Errno: 0\n Last_Error:\n Skip_Counter: 0\n Exec_Master_Log_Pos: 3608\n Relay_Log_Space: 4557\n Until_Condition: None\n Until_Log_File:\n Until_Log_Pos: 0\n Master_SSL_Allowed: No\n Master_SSL_CA_File:\n Master_SSL_CA_Path:\n Master_SSL_Cert:\n Master_SSL_Cipher:\n Master_SSL_Key:\n Seconds_Behind_Master: 0\nMaster_SSL_Verify_Server_Cert: No\n Last_IO_Errno: 0\n Last_IO_Error:\n Last_SQL_Errno: 0\n Last_SQL_Error:\n Replicate_Ignore_Server_Ids:\n Master_Server_Id: 101\n Master_SSL_Crl:\n Master_SSL_Crlpath:\n Using_Gtid: No\n Gtid_IO_Pos:\n Retried_transactions: 0\n Max_relay_log_size: 104857600\n Executed_log_entries: 40\n Slave_received_heartbeats: 11\n Slave_heartbeat_period: 1800.000\n Gtid_Slave_Pos: 0-101-2320\n\nYou can also access some of the variables directly from status variables:\n\nSET @@default_master_connection=\"test\" ;\nshow status like \"%slave%\"\n\nVariable_name Value\nCom_show_slave_hosts 0\nCom_show_slave_status 0\nCom_start_all_slaves 0\nCom_start_slave 0\nCom_stop_all_slaves 0\nCom_stop_slave 0\nRpl_semi_sync_slave_status OFF\nSlave_connections 0\nSlave_heartbeat_period 1800.000\nSlave_open_temp_tables 0\nSlave_received_heartbeats 0\nSlave_retried_transactions 0\nSlave_running OFF\nSlaves_connected 0\nSlaves_running 1\n\nURL: https://mariadb.com/kb/en/show-replica-status/') WHERE help_topic_id = 347;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (348,26,'SHOW MASTER STATUS','Syntax\n------\n\nSHOW MASTER STATUS\nSHOW BINLOG STATUS -- From MariaDB 10.5.2\n\nDescription\n-----------\n\nProvides status information about the binary log files of the primary.\n\nThis statement requires the SUPER privilege, the REPLICATION_CLIENT privilege,\nor, from MariaDB 10.5.2, the BINLOG MONITOR privilege.\n\nTo see information about the current GTIDs in the binary log, use the\ngtid_binlog_pos variable.\n\nSHOW MASTER STATUS was renamed to SHOW BINLOG STATUS in MariaDB 10.5.2, but\nthe old name remains an alias for compatibility purposes.\n\nExample\n-------\n\nSHOW MASTER STATUS;\n+--------------------+----------+--------------+------------------+\n| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |\n+--------------------+----------+--------------+------------------+\n| mariadb-bin.000016 | 475 | | |\n+--------------------+----------+--------------+------------------+\nSELECT @@global.gtid_binlog_pos;\n+--------------------------+\n| @@global.gtid_binlog_pos |\n+--------------------------+\n| 0-1-2 |\n+--------------------------+\n\nURL: https://mariadb.com/kb/en/show-binlog-status/','','https://mariadb.com/kb/en/show-binlog-status/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (349,26,'SHOW SLAVE HOSTS','Syntax\n------\n\nSHOW SLAVE HOSTS\nSHOW REPLICA HOSTS -- from MariaDB 10.5.1\n\nDescription\n-----------\n\nThis command is run on the primary and displays a list of replicas that are\ncurrently registered with it. Only replicas started with the\n--report-host=host_name option are visible in this list.\n\nThe output looks like this:\n\nSHOW SLAVE HOSTS;\n+------------+-----------+------+-----------+\n| Server_id | Host | Port | Master_id |\n+------------+-----------+------+-----------+\n| 192168010 | iconnect2 | 3306 | 192168011 |\n| 1921680101 | athena | 3306 | 192168011 |\n+------------+-----------+------+-----------+\n\n* Server_id: The unique server ID of the replica server, as configured in the\nserver\'s option file, or on the command line with --server-id=value.\n* Host: The host name of the replica server, as configured in the server\'s\noption file, or on the command line with --report-host=host_name. Note that\nthis can differ from the machine name as configured in the operating system.\n* Port: The port the replica server is listening on.\n* Master_id: The unique server ID of the primary server that the replica\nserver is replicating from.\n\nSome MariaDB and MySQL versions report another variable, rpl_recovery_rank.\nThis variable was never used, and was eventually removed in MariaDB 10.1.2 .\n\nRequires the REPLICATION MASTER ADMIN privilege (>= MariaDB 10.5.2) or the\nREPLICATION SLAVE privilege (<= MariaDB 10.5.1).\n\nSHOW REPLICA HOSTS\n------------------\n\nMariaDB starting with 10.5.1\n----------------------------\nSHOW REPLICA HOSTS is an alias for SHOW SLAVE HOSTS from MariaDB 10.5.1.\n\nURL: https://mariadb.com/kb/en/show-replica-hosts/','','https://mariadb.com/kb/en/show-replica-hosts/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (350,26,'SHOW PLUGINS','Syntax\n------\n\nSHOW PLUGINS;\n\nDescription\n-----------\n\nSHOW PLUGINS displays information about installed plugins. The Library column\nindicates the plugin library - if it is NULL, the plugin is built-in and\ncannot be uninstalled.\n\nThe PLUGINS table in the information_schema database contains more detailed\ninformation.\n\nFor specific information about storage engines (a particular type of plugin),\nsee the information_schema.ENGINES table and the SHOW ENGINES statement.\n\nExamples\n--------\n\nSHOW PLUGINS;\n+----------------------------+----------+--------------------+-------------+---\n-----+\n| Name | Status | Type | Library |\nLicense |\n+----------------------------+----------+--------------------+-------------+---\n-----+\n| binlog | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| mysql_native_password | ACTIVE | AUTHENTICATION | NULL |\nGPL |\n| mysql_old_password | ACTIVE | AUTHENTICATION | NULL |\nGPL |\n| MRG_MyISAM | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| MyISAM | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| CSV | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| MEMORY | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| FEDERATED | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| Aria | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| InnoDB | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL |\nGPL |\n...\n| INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL |\nGPL |\n| INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL |\nGPL |\n| SPHINX | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| FEEDBACK | DISABLED | INFORMATION SCHEMA | NULL |\nGPL |\n| partition | ACTIVE | STORAGE ENGINE | NULL |\nGPL |\n| pam | ACTIVE | AUTHENTICATION | auth_pam.so |\nGPL |\n+----------------------------+----------+--------------------+-------------+---\n-----+\n\nURL: https://mariadb.com/kb/en/show-plugins/','','https://mariadb.com/kb/en/show-plugins/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (351,26,'SHOW PLUGINS SONAME','Syntax\n------\n\nSHOW PLUGINS SONAME { library | LIKE \'pattern\' | WHERE expr };\n\nDescription\n-----------\n\nSHOW PLUGINS SONAME displays information about compiled-in and all server\nplugins in the plugin_dir directory, including plugins that haven\'t been\ninstalled.\n\nExamples\n--------\n\nSHOW PLUGINS SONAME \'ha_example.so\';\n+----------+---------------+----------------+---------------+---------+\n| Name | Status | Type | Library | License |\n+----------+---------------+----------------+---------------+---------+\n| EXAMPLE | NOT INSTALLED | STORAGE ENGINE | ha_example.so | GPL |\n| UNUSABLE | NOT INSTALLED | DAEMON | ha_example.so | GPL |\n+----------+---------------+----------------+---------------+---------+\n\nThere is also a corresponding information_schema table, called ALL_PLUGINS,\nwhich contains more complete information.\n\nURL: https://mariadb.com/kb/en/show-plugins-soname/','','https://mariadb.com/kb/en/show-plugins-soname/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (352,26,'SET','Syntax\n------\n\nSET variable_assignment [, variable_assignment] ...\n\nvariable_assignment:\n user_var_name = expr\n | [GLOBAL | SESSION] system_var_name = expr\n | [@@global. | @@session. | @@]system_var_name = expr\n\nOne can also set a user variable in any expression with this syntax:\n\nuser_var_name:= expr\n\nDescription\n-----------\n\nThe SET statement assigns values to different types of variables that affect\nthe operation of the server or your client. Older versions of MySQL employed\nSET OPTION, but this syntax was deprecated in favor of SET without OPTION, and\nwas removed in MariaDB 10.0.\n\nChanging a system variable by using the SET statement does not make the change\npermanently. To do so, the change must be made in a configuration file.\n\nFor setting variables on a per-query basis, see SET STATEMENT.\n\nSee SHOW VARIABLES for documentation on viewing server system variables.\n\nSee Server System Variables for a list of all the system variables.\n\nGLOBAL / SESSION\n----------------\n\nWhen setting a system variable, the scope can be specified as either GLOBAL or\nSESSION.\n\nA global variable change affects all new sessions. It does not affect any\ncurrently open sessions, including the one that made the change.\n\nA session variable change affects the current session only.\n\nIf the variable has a session value, not specifying either GLOBAL or SESSION\nwill be the same as specifying SESSION. If the variable only has a global\nvalue, not specifying GLOBAL or SESSION will apply to the change to the global\nvalue.\n\nDEFAULT\n-------\n\nSetting a global variable to DEFAULT will restore it to the server default,\nand setting a session variable to DEFAULT will restore it to the current\nglobal value.\n\nExamples\n--------\n\n* innodb_sync_spin_loops is a global variable.\n* skip_parallel_replication is a session variable.\n* max_error_count is both global and session.\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE \n VARIABLE_NAME IN (\'max_error_count\', \'skip_parallel_replication\',\n\'innodb_sync_spin_loops\');\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 64 | 64 |\n| SKIP_PARALLEL_REPLICATION | OFF | NULL |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n\nSetting the session values:\n\nSET max_error_count=128;Query OK, 0 rows affected (0.000 sec)\n\nSET skip_parallel_replication=ON;Query OK, 0 rows affected (0.000 sec)\n\nSET innodb_sync_spin_loops=60;\nERROR 1229 (HY000): Variable \'innodb_sync_spin_loops\' is a GLOBAL variable \n and should be set with SET GLOBAL\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE \n VARIABLE_NAME IN (\'max_error_count\', \'skip_parallel_replication\',\n\'innodb_sync_spin_loops\');\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 128 | 64 |\n| SKIP_PARALLEL_REPLICATION | ON | NULL |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n\nSetting the global values:\n\nSET GLOBAL max_error_count=256;\n\nSET GLOBAL skip_parallel_replication=ON;\nERROR 1228 (HY000): Variable \'skip_parallel_replication\' is a SESSION variable \n and can\'t be used with SET GLOBAL\n\nSET GLOBAL innodb_sync_spin_loops=120;\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE \n VARIABLE_NAME IN (\'max_error_count\', \'skip_parallel_replication\',\n\'innodb_sync_spin_loops\');\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 128 | 256 |\n| SKIP_PARALLEL_REPLICATION | ON | NULL |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 120 |\n+---------------------------+---------------+--------------+\n\nSHOW VARIABLES will by default return the session value unless the variable is\nglobal only.\n\nSHOW VARIABLES LIKE \'max_error_count\';\n+-----------------+-------+\n| Variable_name | Value |\n+-----------------+-------+\n| max_error_count | 128 |\n+-----------------+-------+\n\nSHOW VARIABLES LIKE \'skip_parallel_replication\';\n+---------------------------+-------+\n| Variable_name | Value |\n+---------------------------+-------+\n| skip_parallel_replication | ON |\n+---------------------------+-------+\n\nSHOW VARIABLES LIKE \'innodb_sync_spin_loops\';\n+------------------------+-------+\n| Variable_name | Value |\n+------------------------+-------+\n| innodb_sync_spin_loops | 120 |\n+------------------------+-------+\n\nUsing the inplace syntax:\n\nSELECT (@a:=1);\n+---------+\n| (@a:=1) |\n+---------+\n| 1 |\n+---------+\n\nSELECT @a;\n+------+\n| @a |\n+------+\n| 1 |\n+------+\n\nURL: https://mariadb.com/kb/en/set/','','https://mariadb.com/kb/en/set/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (353,26,'SET CHARACTER SET','Syntax\n------\n\nSET {CHARACTER SET | CHARSET}\n {charset_name | DEFAULT}\n\nDescription\n-----------\n\nSets the character_set_client and character_set_results session system\nvariables to the specified character set and collation_connection to the value\nof collation_database, which implicitly sets character_set_connection to the\nvalue of character_set_database.\n\nThis maps all strings sent between the current client and the server with the\ngiven mapping.\n\nExample\n-------\n\nSHOW VARIABLES LIKE \'character_set\\_%\';\n+--------------------------+--------+\n| Variable_name | Value |\n+--------------------------+--------+\n| character_set_client | utf8 |\n| character_set_connection | utf8 |\n| character_set_database | latin1 |\n| character_set_filesystem | binary |\n| character_set_results | utf8 |\n| character_set_server | latin1 |\n| character_set_system | utf8 |\n+--------------------------+--------+\n\nSHOW VARIABLES LIKE \'collation%\';\n+----------------------+-------------------+\n| Variable_name | Value |\n+----------------------+-------------------+\n| collation_connection | utf8_general_ci |\n| collation_database | latin1_swedish_ci |\n| collation_server | latin1_swedish_ci |\n+----------------------+-------------------+\n\nSET CHARACTER SET utf8mb4;\n\nSHOW VARIABLES LIKE \'character_set\\_%\';\n+--------------------------+---------+\n| Variable_name | Value |\n+--------------------------+---------+\n| character_set_client | utf8mb4 |\n| character_set_connection | latin1 |\n| character_set_database | latin1 |\n| character_set_filesystem | binary |\n| character_set_results | utf8mb4 |\n| character_set_server | latin1 |\n| character_set_system | utf8 |\n+--------------------------+---------+\n\nSHOW VARIABLES LIKE \'collation%\';\n+----------------------+-------------------+\n| Variable_name | Value |\n+----------------------+-------------------+\n| collation_connection | latin1_swedish_ci |\n| collation_database | latin1_swedish_ci |\n| collation_server | latin1_swedish_ci |\n+----------------------+-------------------+\n\nURL: https://mariadb.com/kb/en/set-character-set/','','https://mariadb.com/kb/en/set-character-set/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (354,26,'SET NAMES','Syntax\n------\n\nSET NAMES {\'charset_name\'\n [COLLATE \'collation_name\'] | DEFAULT}\n\nDescription\n-----------\n\nSets the character_set_client, character_set_connection, character_set_results\nand, implicitly, the collation_connection session system variables to the\nspecified character set and collation.\n\nThis determines which character set the client will use to send statements to\nthe server, and the server will use for sending results back to the client.\n\nucs2, utf16, utf16le and utf32 are not valid character sets for SET NAMES, as\nthey cannot be used as client character sets.\n\nThe collation clause is optional. If not defined (or if DEFAULT is specified),\nthe default collation for the character set will be used.\n\nQuotes are optional for the character set or collation clauses.\n\nExamples\n--------\n\nSELECT VARIABLE_NAME, SESSION_VALUE \n FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'character_set_c%\' OR\n VARIABLE_NAME LIKE \'character_set_re%\' OR\n VARIABLE_NAME LIKE \'collation_c%\';\n+--------------------------+-----------------+\n| VARIABLE_NAME | SESSION_VALUE |\n+--------------------------+-----------------+\n| CHARACTER_SET_RESULTS | utf8 |\n| CHARACTER_SET_CONNECTION | utf8 |\n| CHARACTER_SET_CLIENT | utf8 |\n| COLLATION_CONNECTION | utf8_general_ci |\n+--------------------------+-----------------+\n\nSET NAMES big5;\n\nSELECT VARIABLE_NAME, SESSION_VALUE \n FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'character_set_c%\' OR\n VARIABLE_NAME LIKE \'character_set_re%\' OR\n VARIABLE_NAME LIKE \'collation_c%\';\n+--------------------------+-----------------+\n| VARIABLE_NAME | SESSION_VALUE |\n+--------------------------+-----------------+\n| CHARACTER_SET_RESULTS | big5 |\n| CHARACTER_SET_CONNECTION | big5 |\n| CHARACTER_SET_CLIENT | big5 |\n| COLLATION_CONNECTION | big5_chinese_ci |\n+--------------------------+-----------------+\n\nSET NAMES \'latin1\' COLLATE \'latin1_bin\';\n\nSELECT VARIABLE_NAME, SESSION_VALUE \n FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'character_set_c%\' OR\n VARIABLE_NAME LIKE \'character_set_re%\' OR\n VARIABLE_NAME LIKE \'collation_c%\';\n+--------------------------+---------------+\n| VARIABLE_NAME | SESSION_VALUE |\n+--------------------------+---------------+\n| CHARACTER_SET_RESULTS | latin1 |\n| CHARACTER_SET_CONNECTION | latin1 |\n| CHARACTER_SET_CLIENT | latin1 |\n| COLLATION_CONNECTION | latin1_bin |\n+--------------------------+---------------+\n\nSET NAMES DEFAULT;\n\nSELECT VARIABLE_NAME, SESSION_VALUE \n FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'character_set_c%\' OR\n VARIABLE_NAME LIKE \'character_set_re%\' OR\n VARIABLE_NAME LIKE \'collation_c%\';\n+--------------------------+-------------------+\n| VARIABLE_NAME | SESSION_VALUE |\n+--------------------------+-------------------+\n| CHARACTER_SET_RESULTS | latin1 |\n| CHARACTER_SET_CONNECTION | latin1 |\n| CHARACTER_SET_CLIENT | latin1 |\n| COLLATION_CONNECTION | latin1_swedish_ci |\n+--------------------------+-------------------+\n\nURL: https://mariadb.com/kb/en/set-names/','','https://mariadb.com/kb/en/set-names/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (355,26,'SET SQL_LOG_BIN','Syntax\n------\n\nSET [SESSION] sql_log_bin = {0|1}\n\nDescription\n-----------\n\nSets the sql_log_bin system variable, which disables or enables binary logging\nfor the current connection, if the client has the SUPER privilege. The\nstatement is refused with an error if the client does not have that privilege.\n\nBefore MariaDB 5.5 and before MySQL 5.6 one could also set sql_log_bin as a\nglobal variable. This was disabled as this was too dangerous as it could\ndamage replication.\n\nURL: https://mariadb.com/kb/en/set-sql_log_bin/','','https://mariadb.com/kb/en/set-sql_log_bin/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (356,26,'SET STATEMENT','MariaDB starting with 10.1.2\n----------------------------\nPer-query variables were introduced in MariaDB 10.1.2\n\nSET STATEMENT can be used to set the value of a system variable for the\nduration of the statement. It is also possible to set multiple variables.\n\nSyntax\n------\n\nSET STATEMENT var1=value1 [, var2=value2, ...] \n FOR <statement>\n\nwhere varN is a system variable (list of allowed variables is provided below),\nand valueN is a constant literal.\n\nDescription\n-----------\n\nSET STATEMENT var1=value1 FOR stmt\n\nis roughly equivalent to\n\nSET @save_value=@@var1;\nSET SESSION var1=value1;\nstmt;\nSET SESSION var1=@save_value;\n\nThe server parses the whole statement before executing it, so any variables\nset in this fashion that affect the parser may not have the expected effect.\nExamples include the charset variables, sql_mode=ansi_quotes, etc.\n\nExamples\n--------\n\nOne can limit statement execution time max_statement_time:\n\nSET STATEMENT max_statement_time=1000 FOR SELECT ... ;\n\nOne can switch on/off individual optimizations:\n\nSET STATEMENT optimizer_switch=\'materialization=off\' FOR SELECT ....;\n\nIt is possible to enable MRR/BKA for a query:\n\nSET STATEMENT join_cache_level=6, optimizer_switch=\'mrr=on\' FOR SELECT ...\n\nNote that it makes no sense to try to set a session variable inside a SET\nSTATEMENT:\n\n#USELESS STATEMENT\nSET STATEMENT sort_buffer_size = 100000 for SET SESSION sort_buffer_size =\n200000;\n\nFor the above, after setting sort_buffer_size to 200000 it will be reset to\nits original state (the state before the SET STATEMENT started) after the\nstatement execution.\n\nLimitations\n-----------\n\nThere are a number of variables that cannot be set on per-query basis. These\ninclude:\n\n* autocommit\n* character_set_client\n* character_set_connection\n* character_set_filesystem\n* collation_connection\n* default_master_connection\n* debug_sync\n* interactive_timeout\n* gtid_domain_id\n* last_insert_id\n* log_slow_filter\n* log_slow_rate_limit\n* log_slow_verbosity\n* long_query_time\n* min_examined_row_limit\n* profiling\n* profiling_history_size\n* query_cache_type\n* rand_seed1\n* rand_seed2\n* skip_replication\n* slow_query_log\n* sql_log_off\n* tx_isolation\n* wait_timeout\n\nSource\n------\n\n* The feature was originally implemented as a Google Summer of Code 2009\nproject by Joseph Lukas. \n* Percona Server 5.6 included it as Per-query variable statement\n* MariaDB ported the patch and fixed many bugs. The task in MariaDB Jira is\nMDEV-5231.\n\nURL: https://mariadb.com/kb/en/set-statement/','','https://mariadb.com/kb/en/set-statement/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (357,26,'SET Variable','Syntax\n------\n\nSET var_name = expr [, var_name = expr] ...\n\nDescription\n-----------\n\nThe SET statement in stored programs is an extended version of the general SET\nstatement. Referenced variables may be ones declared inside a stored program,\nglobal system variables, or user-defined variables.\n\nThe SET statement in stored programs is implemented as part of the\npre-existing SET syntax. This allows an extended syntax of SET a=x, b=y, ...\nwhere different variable types (locally declared variables, global and session\nserver variables, user-defined variables) can be mixed. This also allows\ncombinations of local variables and some options that make sense only for\nsystem variables; in that case, the options are recognized but ignored.\n\nSET can be used with both local variables and user-defined variables.\n\nWhen setting several variables using the columns returned by a query, SELECT\nINTO should be preferred.\n\nTo set many variables to the same value, the LAST_VALUE( ) function can be\nused.\n\nBelow is an example of how a user-defined variable may be set:\n\nSET @x = 1;\n\nURL: https://mariadb.com/kb/en/set-variable/','','https://mariadb.com/kb/en/set-variable/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (358,26,'About SHOW','SHOW has many forms that provide information about databases, tables, columns,\nor status information about the server. These include:\n\n* SHOW AUTHORS\n* SHOW CHARACTER SET [like_or_where]\n* SHOW COLLATION [like_or_where]\n* SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where]\n* SHOW CONTRIBUTORS\n* SHOW CREATE DATABASE db_name\n* SHOW CREATE EVENT event_name\n* SHOW CREATE PACKAGE package_name\n* SHOW CREATE PACKAGE BODY package_name\n* SHOW CREATE PROCEDURE proc_name\n* SHOW CREATE TABLE tbl_name\n* SHOW CREATE TRIGGER trigger_name\n* SHOW CREATE VIEW view_name\n* SHOW DATABASES [like_or_where]\n* SHOW ENGINE engine_name {STATUS | MUTEX}\n* SHOW [STORAGE] ENGINES\n* SHOW ERRORS [LIMIT [offset,] row_count]\n* SHOW [FULL] EVENTS\n* SHOW FUNCTION CODE func_name\n* SHOW FUNCTION STATUS [like_or_where]\n* SHOW GRANTS FOR user\n* SHOW INDEX FROM tbl_name [FROM db_name]\n* SHOW INNODB STATUS\n* SHOW OPEN TABLES [FROM db_name] [like_or_where]\n* SHOW PLUGINS\n* SHOW PROCEDURE CODE proc_name\n* SHOW PROCEDURE STATUS [like_or_where]\n* SHOW PRIVILEGES\n* SHOW [FULL] PROCESSLIST\n* SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n]\n* SHOW PROFILES\n* SHOW [GLOBAL | SESSION] STATUS [like_or_where]\n* SHOW TABLE STATUS [FROM db_name] [like_or_where]\n* SHOW TABLES [FROM db_name] [like_or_where]\n* SHOW TRIGGERS [FROM db_name] [like_or_where]\n* SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]\n* SHOW WARNINGS [LIMIT [offset,] row_count]\n\nlike_or_where:\n LIKE \'pattern\'\n | WHERE expr\n\nIf the syntax for a given SHOW statement includes a LIKE \'pattern\' part,\n\'pattern\' is a string that can contain the SQL \"%\" and \"_\" wildcard\ncharacters. The pattern is useful for restricting statement output to matching\nvalues.\n\nSeveral SHOW statements also accept a WHERE clause that provides more\nflexibility in specifying which rows to display. See Extended Show.\n\nURL: https://mariadb.com/kb/en/about-show/','','https://mariadb.com/kb/en/about-show/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (359,26,'Extended Show','The following SHOW statements can be extended by using a WHERE clause and a\nLIKE clause to refine the results:\n\n* SHOW CHARACTER SET\n* SHOW COLLATION\n* SHOW COLUMNS\n* SHOW DATABASES\n* SHOW FUNCTION STATUS\n* SHOW INDEX\n* SHOW OPEN TABLES\n* SHOW PACKAGE STATUS\n* SHOW PACKAGE BODY STATUS\n* SHOW INDEX\n* SHOW PROCEDURE STATUS\n* SHOW STATUS\n* SHOW TABLE STATUS\n* SHOW TABLES\n* SHOW TRIGGERS\n* SHOW VARIABLES\n\nAs with a regular SELECT, the WHERE clause can be used for the specific\ncolumns returned, and the LIKE clause with the regular wildcards.\n\nExamples\n--------\n\nSHOW TABLES;\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n| t1 |\n| view1 |\n+----------------------+\n\nShowing the tables beginning with a only.\n\nSHOW TABLES WHERE Tables_in_test LIKE \'a%\';\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n+----------------------+\n\nVariables whose name starts with aria and with a valued of greater than 8192:\n\nSHOW VARIABLES WHERE Variable_name LIKE \'aria%\' AND Value >8192;\n+------------------------------+---------------------+\n| Variable_name | Value |\n+------------------------------+---------------------+\n| aria_checkpoint_log_activity | 1048576 |\n| aria_log_file_size | 1073741824 |\n| aria_max_sort_file_size | 9223372036853727232 |\n| aria_pagecache_buffer_size | 134217728 |\n| aria_sort_buffer_size | 134217728 |\n+------------------------------+---------------------+\n\nShortcut, just returning variables whose name begins with aria.\n\nSHOW VARIABLES LIKE \'aria%\';\n+------------------------------------------+---------------------+\n| Variable_name | Value |\n+------------------------------------------+---------------------+\n| aria_block_size | 8192 |\n| aria_checkpoint_interval | 30 |\n| aria_checkpoint_log_activity | 1048576 |\n| aria_force_start_after_recovery_failures | 0 |\n| aria_group_commit | none |\n| aria_group_commit_interval | 0 |\n| aria_log_file_size | 1073741824 |\n| aria_log_purge_type | immediate |\n| aria_max_sort_file_size | 9223372036853727232 |\n| aria_page_checksum | ON |\n| aria_pagecache_age_threshold | 300 |\n| aria_pagecache_buffer_size | 134217728 |\n| aria_pagecache_division_limit | 100 |\n| aria_recover | NORMAL |\n| aria_repair_threads | 1 |\n| aria_sort_buffer_size | 134217728 |\n| aria_stats_method | nulls_unequal |\n| aria_sync_log_dir | NEWFILE |\n| aria_used_for_temp_tables | ON |\n+------------------------------------------+---------------------+\n\nURL: https://mariadb.com/kb/en/extended-show/','','https://mariadb.com/kb/en/extended-show/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (360,26,'SHOW AUTHORS','Syntax\n------\n\nSHOW AUTHORS\n\nDescription\n-----------\n\nThe SHOW AUTHORS statement displays information about the people who work on\nMariaDB. For each author, it displays Name, Location, and Comment values. All\ncolumns are encoded as latin1.\n\nThese include:\n\n* First the active people in MariaDB are listed.\n* Then the active people in MySQL.\n* Last the people that have contributed to MariaDB/MySQL in the past.\n\nThe order is somewhat related to importance of the contribution given to the\nMariaDB project, but this is not 100% accurate. There is still room for\nimprovement and debate...\n\nExample\n-------\n\nSHOW AUTHORS\\G\n*************************** 1. row ***************************\n Name: Michael (Monty) Widenius\nLocation: Tusby, Finland\n Comment: Lead developer and main author\n*************************** 2. row ***************************\n Name: Sergei Golubchik\nLocation: Kerpen, Germany\n Comment: Architect, Full-text search, precision math, plugin framework,\nmerges etc\n*************************** 3. row ***************************\n Name: Igor Babaev\nLocation: Bellevue, USA\n Comment: Optimizer, keycache, core work\n*************************** 4. row ***************************\n Name: Sergey Petrunia\nLocation: St. Petersburg, Russia\n Comment: Optimizer\n*************************** 5. row ***************************\n Name: Oleksandr Byelkin\nLocation: Lugansk, Ukraine\n Comment: Query Cache (4.0), Subqueries (4.1), Views (5.0)\n*************************** 6. row ***************************\n Name: Timour Katchaounov\nLocation: Sofia , Bulgaria\n Comment: Optimizer\n*************************** 7. row ***************************\n Name: Kristian Nielsen\nLocation: Copenhagen, Denmark\n Comment: Replication, Async client prototocol, General buildbot stuff\n*************************** 8. row ***************************\n Name: Alexander (Bar) Barkov\nLocation: Izhevsk, Russia\n Comment: Unicode and character sets\n*************************** 9. row ***************************\n Name: Alexey Botchkov (Holyfoot)\nLocation: Izhevsk, Russia\n Comment: GIS extensions, embedded server, precision math\n*************************** 10. row ***************************\n Name: Daniel Bartholomew\nLocation: Raleigh, USA\n Comment: MariaDB documentation, Buildbot, releases\n*************************** 11. row ***************************\n Name: Colin Charles\nLocation: Selangor, Malesia\n Comment: MariaDB documentation, talks at a LOT of conferences\n*************************** 12. row ***************************\n Name: Sergey Vojtovich\nLocation: Izhevsk, Russia\n Comment: initial implementation of plugin architecture, maintained native\nstorage engines (MyISAM, MEMORY, ARCHIVE, etc), rewrite of table cache\n*************************** 13. row ***************************\n Name: Vladislav Vaintroub\nLocation: Mannheim, Germany\n Comment: MariaDB Java connector, new thread pool, Windows optimizations\n*************************** 14. row ***************************\n Name: Elena Stepanova\nLocation: Sankt Petersburg, Russia\n Comment: QA, test cases\n*************************** 15. row ***************************\n Name: Georg Richter\nLocation: Heidelberg, Germany\n Comment: New LGPL C connector, PHP connector\n*************************** 16. row ***************************\n Name: Jan Lindström\nLocation: Ylämylly, Finland\n Comment: Working on InnoDB\n*************************** 17. row ***************************\n Name: Lixun Peng\nLocation: Hangzhou, China\n Comment: Multi Source replication\n*************************** 18. row ***************************\n Name: Olivier Bertrand\nLocation: Paris, France\n Comment: CONNECT storage engine\n*************************** 19. row ***************************\n Name: Kentoku Shiba\nLocation: Tokyo, Japan\n Comment: Spider storage engine, metadata_lock_info Information schema\n*************************** 20. row ***************************\n Name: Percona\nLocation: CA, USA\n Comment: XtraDB, microslow patches, extensions to slow log\n*************************** 21. row ***************************\n Name: Vicentiu Ciorbaru\nLocation: Bucharest, Romania\n Comment: Roles\n*************************** 22. row ***************************\n Name: Sudheera Palihakkara\nLocation: \n Comment: PCRE Regular Expressions\n*************************** 23. row ***************************\n Name: Pavel Ivanov\nLocation: USA\n Comment: Some patches and bug fixes\n*************************** 24. row ***************************\n Name: Konstantin Osipov\nLocation: Moscow, Russia\n Comment: Prepared statements (4.1), Cursors (5.0), GET_LOCK (10.0)\n*************************** 25. row ***************************\n Name: Ian Gilfillan\nLocation: South Africa\n Comment: MariaDB documentation\n*************************** 26. row ***************************\n Name: Federico Razolli\nLocation: Italy\n Comment: MariaDB documentation Italian translation\n*************************** 27. row ***************************\n Name: Guilhem Bichot\nLocation: Bordeaux, France\n Comment: Replication (since 4.0)\n*************************** 28. row ***************************\n Name: Andrei Elkin\nLocation: Espoo, Finland\n Comment: Replication\n*************************** 29. row ***************************\n Name: Dmitri Lenev\nLocation: Moscow, Russia\n Comment: Time zones support (4.1), Triggers (5.0)\n*************************** 30. row ***************************\n Name: Marc Alff\nLocation: Denver, CO, USA\n Comment: Signal, Resignal, Performance schema\n*************************** 31. row ***************************\n Name: Mikael Ronström\nLocation: Stockholm, Sweden\n Comment: NDB Cluster, Partitioning, online alter table\n*************************** 32. row ***************************\n Name: Ingo Strüwing\nLocation: Berlin, Germany\n Comment: Bug fixing in MyISAM, Merge tables etc\n*************************** 33. row ***************************\n Name: Marko Mäkelä\nLocation: Helsinki, Finland\n Comment: InnoDB core developer\n...\n\nURL: https://mariadb.com/kb/en/show-authors/','','https://mariadb.com/kb/en/show-authors/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (361,26,'SHOW BINARY LOGS','Syntax\n------\n\nSHOW BINARY LOGS\nSHOW MASTER LOGS\n\nDescription\n-----------\n\nLists the binary log files on the server. This statement is used as part of\nthe procedure described in PURGE BINARY LOGS, that shows how to determine\nwhich logs can be purged.\n\nThis statement requires the SUPER privilege, the REPLICATION_CLIENT privilege,\nor, from MariaDB 10.5.2, the BINLOG MONITOR privilege.\n\nExamples\n--------\n\nSHOW BINARY LOGS;\n+--------------------+-----------+\n| Log_name | File_size |\n+--------------------+-----------+\n| mariadb-bin.000001 | 19039 |\n| mariadb-bin.000002 | 717389 |\n| mariadb-bin.000003 | 300 |\n| mariadb-bin.000004 | 333 |\n| mariadb-bin.000005 | 899 |\n| mariadb-bin.000006 | 125 |\n| mariadb-bin.000007 | 18907 |\n| mariadb-bin.000008 | 19530 |\n| mariadb-bin.000009 | 151 |\n| mariadb-bin.000010 | 151 |\n| mariadb-bin.000011 | 125 |\n| mariadb-bin.000012 | 151 |\n| mariadb-bin.000013 | 151 |\n| mariadb-bin.000014 | 125 |\n| mariadb-bin.000015 | 151 |\n| mariadb-bin.000016 | 314 |\n+--------------------+-----------+\n\nURL: https://mariadb.com/kb/en/show-binary-logs/','','https://mariadb.com/kb/en/show-binary-logs/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (362,26,'SHOW BINLOG EVENTS','Syntax\n------\n\nSHOW BINLOG EVENTS\n [IN \'log_name\'] [FROM pos] [LIMIT [offset,] row_count]\n\nDescription\n-----------\n\nShows the events in the binary log. If you do not specify \'log_name\', the\nfirst binary log is displayed.\n\nRequires the BINLOG MONITOR privilege (>= MariaDB 10.5.2) or the REPLICATION\nSLAVE privilege (<= MariaDB 10.5.1).\n\nExample\n-------\n\nSHOW BINLOG EVENTS IN \'mysql_sandbox10019-bin.000002\';\n+-------------------------------+-----+-------------------+-----------+--------\n----+------------------------------------------------+\n| Log_name | Pos | Event_type | Server_id |\nEnd_log_pos | Info |\n+-------------------------------+-----+-------------------+-----------+--------\n----+------------------------------------------------+\n| mysql_sandbox10019-bin.000002 | 4 | Format_desc | 1 | \n 248 | Server ver: 10.0.19-MariaDB-log, Binlog ver: 4 |\n| mysql_sandbox10019-bin.000002 | 248 | Gtid_list | 1 | \n 273 | [] |\n| mysql_sandbox10019-bin.000002 | 273 | Binlog_checkpoint | 1 | \n 325 | mysql_sandbox10019-bin.000002 |\n| mysql_sandbox10019-bin.000002 | 325 | Gtid | 1 | \n 363 | GTID 0-1-1 |\n| mysql_sandbox10019-bin.000002 | 363 | Query | 1 | \n 446 | CREATE DATABASE blog |\n| mysql_sandbox10019-bin.000002 | 446 | Gtid | 1 | \n 484 | GTID 0-1-2 |\n| mysql_sandbox10019-bin.000002 | 484 | Query | 1 | \n 571 | use `blog`; CREATE TABLE bb (id INT) |\n+-------------------------------+-----+-------------------+-----------+--------\n----+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-binlog-events/','','https://mariadb.com/kb/en/show-binlog-events/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (363,26,'SHOW CHARACTER SET','Syntax\n------\n\nSHOW CHARACTER SET\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThe SHOW CHARACTER SET statement shows all available character sets. The LIKE\nclause, if present on its own, indicates which character set names to match.\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe same information can be queried from the Information Schema CHARACTER_SETS\ntable.\n\nSee Setting Character Sets and Collations for details on specifying the\ncharacter set at the server, database, table and column levels.\n\nExamples\n--------\n\nSHOW CHARACTER SET LIKE \'latin%\';\n+---------+-----------------------------+-------------------+--------+\n| Charset | Description | Default collation | Maxlen |\n+---------+-----------------------------+-------------------+--------+\n| latin1 | cp1252 West European | latin1_swedish_ci | 1 |\n| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |\n| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |\n| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |\n+---------+-----------------------------+-------------------+--------+\n\nSHOW CHARACTER SET WHERE Maxlen LIKE \'2\';\n+---------+---------------------------+-------------------+--------+\n| Charset | Description | Default collation | Maxlen |\n+---------+---------------------------+-------------------+--------+\n| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |\n| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |\n| euckr | EUC-KR Korean | euckr_korean_ci | 2 |\n| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |\n| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |\n| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |\n| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |\n+---------+---------------------------+-------------------+--------+\n\nURL: https://mariadb.com/kb/en/show-character-set/','','https://mariadb.com/kb/en/show-character-set/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (364,26,'SHOW CLIENT_STATISTICS','Syntax\n------\n\nSHOW CLIENT_STATISTICS\n\nDescription\n-----------\n\nThe SHOW CLIENT_STATISTICS statement is part of the User Statistics feature.\nIt was removed as a separate statement in MariaDB 10.1.1, but effectively\nreplaced by the generic SHOW information_schema_table statement. The\ninformation_schema.CLIENT_STATISTICS table holds statistics about client\nconnections.\n\nThe userstat system variable must be set to 1 to activate this feature. See\nthe User Statistics and information_schema.CLIENT_STATISTICS articles for more\ninformation.\n\nExample\n-------\n\nSHOW CLIENT_STATISTICS\\G\n*************************** 1. row ***************************\n Client: localhost\n Total_connections: 35\nConcurrent_connections: 0\n Connected_time: 708\n Busy_time: 2.5557979999999985\n Cpu_time: 0.04123740000000002\n Bytes_received: 3883\n Bytes_sent: 21595\n Binlog_bytes_written: 0\n Rows_read: 18\n Rows_sent: 115\n Rows_deleted: 0\n Rows_inserted: 0\n Rows_updated: 0\n Select_commands: 70\n Update_commands: 0\n Other_commands: 0\n Commit_transactions: 1\n Rollback_transactions: 0\n Denied_connections: 0\n Lost_connections: 0\n Access_denied: 0\n Empty_queries: 35\n\nURL: https://mariadb.com/kb/en/show-client-statistics/','','https://mariadb.com/kb/en/show-client-statistics/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (365,26,'SHOW CONTRIBUTORS','Syntax\n------\n\nSHOW CONTRIBUTORS\n\nDescription\n-----------\n\nThe SHOW CONTRIBUTORS statement displays information about the companies and\npeople who financially contribute to MariaDB. For each contributor, it\ndisplays Name, Location, and Comment values. All columns are encoded as latin1.\n\nIt displays all members and sponsors of the MariaDB Foundation as well as\nother financial contributors.\n\nExample\n-------\n\nSHOW CONTRIBUTORS;\n+---------------------+-------------------------------+------------------------\n------------------------------------+\n| Name | Location | Comment \n |\n+---------------------+-------------------------------+------------------------\n------------------------------------+\n| Alibaba Cloud | https://www.alibabacloud.com/ | Platinum Sponsor of\nthe MariaDB Foundation |\n| Tencent Cloud | https://cloud.tencent.com | Platinum Sponsor of\nthe MariaDB Foundation |\n| Microsoft | https://microsoft.com/ | Platinum Sponsor of\nthe MariaDB Foundation |\n| MariaDB Corporation | https://mariadb.com | Founding member,\nPlatinum Sponsor of the MariaDB Foundation |\n| ServiceNow | https://servicenow.com | Platinum Sponsor of\nthe MariaDB Foundation |\n| Intel | https://www.intel.com | Platinum Sponsor of\nthe MariaDB Foundation |\n| SIT | https://sit.org | Platinum Sponsor of\nthe MariaDB Foundation |\n| Visma | https://visma.com | Gold Sponsor of the\nMariaDB Foundation |\n| DBS | https://dbs.com | Gold Sponsor of the\nMariaDB Foundation |\n| IBM | https://www.ibm.com | Gold Sponsor of the\nMariaDB Foundation |\n| Automattic | https://automattic.com | Silver Sponsor of the\nMariaDB Foundation |\n| Percona | https://www.percona.com/ | Sponsor of the MariaDB\nFoundation |\n| Galera Cluster | https://galeracluster.com | Sponsor of the MariaDB\nFoundation |\n| Google | USA | Sponsoring encryption,\nparallel replication and GTID |\n| Facebook | USA | Sponsoring\nnon-blocking API, LIMIT ROWS EXAMINED etc |\n| Ronald Bradford | Brisbane, Australia | EFF contribution for\nUC2006 Auction |\n| Sheeri Kritzer | Boston, Mass. USA | EFF contribution for\nUC2006 Auction |\n| Mark Shuttleworth | London, UK. | EFF contribution for\nUC2006 Auction |\n+---------------------+-------------------------------+------------------------\n------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-contributors/','','https://mariadb.com/kb/en/show-contributors/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (366,26,'SHOW CREATE DATABASE','Syntax\n------\n\nSHOW CREATE {DATABASE | SCHEMA} db_name\n\nDescription\n-----------\n\nShows the CREATE DATABASE statement that creates the given database. SHOW\nCREATE SCHEMA is a synonym for SHOW CREATE DATABASE. SHOW CREATE DATABASE\nquotes database names according to the value of the sql_quote_show_create\nserver system variable.\n\nExamples\n--------\n\nSHOW CREATE DATABASE test;\n+----------+-----------------------------------------------------------------+\n| Database | Create Database |\n+----------+-----------------------------------------------------------------+\n| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ |\n+----------+-----------------------------------------------------------------+\n\nSHOW CREATE SCHEMA test;\n+----------+-----------------------------------------------------------------+\n| Database | Create Database |\n+----------+-----------------------------------------------------------------+\n| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ |\n+----------+-----------------------------------------------------------------+\n\nWith sql_quote_show_create off:\n\nSHOW CREATE DATABASE test;\n+----------+---------------------------------------------------------------+\n| Database | Create Database |\n+----------+---------------------------------------------------------------+\n| test | CREATE DATABASE test /*!40100 DEFAULT CHARACTER SET latin1 */ |\n+----------+---------------------------------------------------------------+\n\nWith a comment, from MariaDB 10.5:\n\nSHOW CREATE DATABASE p;\n+----------+-------------------------------------------------------------------\n------------------+\n| Database | Create Database \n |\n+----------+-------------------------------------------------------------------\n------------------+\n| p | CREATE DATABASE `p` /*!40100 DEFAULT CHARACTER SET latin1 */\nCOMMENT \'presentations\' |\n+----------+-------------------------------------------------------------------\n------------------+\n\nURL: https://mariadb.com/kb/en/show-create-database/','','https://mariadb.com/kb/en/show-create-database/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (367,26,'SHOW CREATE EVENT','Syntax\n------\n\nSHOW CREATE EVENT event_name\n\nDescription\n-----------\n\nThis statement displays the CREATE EVENT statement needed to re-create a given\nevent, as well as the SQL_MODE that was used when the trigger has been created\nand the character set used by the connection. To find out which events are\npresent, use SHOW EVENTS.\n\nThe output of this statement is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n\nThe information_schema.EVENTS table provides similar, but more complete,\ninformation.\n\nExamples\n--------\n\nSHOW CREATE EVENT test.e_daily\\G\n*************************** 1. row ***************************\n Event: e_daily\n sql_mode:\n time_zone: SYSTEM\n Create Event: CREATE EVENT `e_daily`\n ON SCHEDULE EVERY 1 DAY\n STARTS CURRENT_TIMESTAMP + INTERVAL 6 HOUR\n ON COMPLETION NOT PRESERVE\n ENABLE\n COMMENT \'Saves total number of sessions then\n clears the table each day\'\n DO BEGIN\n INSERT INTO site_activity.totals (time, total)\n SELECT CURRENT_TIMESTAMP, COUNT(*)\n FROM site_activity.sessions;\n DELETE FROM site_activity.sessions;\n END\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-create-event/','','https://mariadb.com/kb/en/show-create-event/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (368,26,'SHOW CREATE FUNCTION','Syntax\n------\n\nSHOW CREATE FUNCTION func_name\n\nDescription\n-----------\n\nThis statement is similar to SHOW CREATE PROCEDURE but for stored functions.\n\nThe output of this statement is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n\nExample\n-------\n\nSHOW CREATE FUNCTION VatCents\\G\n*************************** 1. row ***************************\n Function: VatCents\n sql_mode:\n Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION\n`VatCents`(price DECIMAL(10,2)) RETURNS int(11)\n DETERMINISTIC\nBEGIN\n DECLARE x INT;\n SET x = price * 114;\n RETURN x;\nEND\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-create-function/','','https://mariadb.com/kb/en/show-create-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (369,26,'SHOW CREATE PACKAGE','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nSHOW CREATE PACKAGE [ db_name . ] package_name\n\nDescription\n-----------\n\nThe SHOW CREATE PACKAGE statement can be used when Oracle SQL_MODE is set.\n\nShows the CREATE statement that creates the given package specification.\n\nExamples\n--------\n\nSHOW CREATE PACKAGE employee_tools\\G\n*************************** 1. row ***************************\n Package: employee_tools\n sql_mode:\nPIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS\nNO_FIELD_OPTIONS,NO_AUTO_CREATE_USER\n Create Package: CREATE DEFINER=\"root\"@\"localhost\" PACKAGE\n\"employee_tools\" AS\n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);\n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));\n PROCEDURE raiseSalaryStd(eid INT);\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));\nEND\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-create-package/','','https://mariadb.com/kb/en/show-create-package/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (370,26,'SHOW CREATE PACKAGE BODY','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nSHOW CREATE PACKAGE BODY [ db_name . ] package_name\n\nDescription\n-----------\n\nThe SHOW CREATE PACKAGE BODY statement can be used when Oracle SQL_MODE is set.\n\nShows the CREATE statement that creates the given package body (i.e. the\nimplementation).\n\nExamples\n--------\n\nSHOW CREATE PACKAGE BODY employee_tools\\G\n*************************** 1. row ***************************\n Package body: employee_tools\n sql_mode:\nPIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS\nNO_FIELD_OPTIONS,NO_AUTO_CREATE_USER\n Create Package Body: CREATE DEFINER=\"root\"@\"localhost\" PACKAGE BODY\n\"employee_tools\" AS\n\nstdRaiseAmount DECIMAL(10,2):=500;\n\nPROCEDURE log (eid INT, ecmnt TEXT) AS\n BEGIN\n INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt);\n END;\n\nPROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS\n eid INT;\n BEGIN\n INSERT INTO employee (name, salary) VALUES (ename, esalary);\n eid:= last_insert_id();\n log(eid, \'hire \' || ename);\n END;\n\nFUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS\n nSalary DECIMAL(10,2);\n BEGIN\n SELECT salary INTO nSalary FROM employee WHERE id=eid;\n log(eid, \'getSalary id=\' || eid || \' salary=\' || nSalary);\n RETURN nSalary;\n END;\n\nPROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS\n BEGIN\n UPDATE employee SET salary=salary+amount WHERE id=eid;\n log(eid, \'raiseSalary id=\' || eid || \' amount=\' || amount);\n END;\n\nPROCEDURE raiseSalaryStd(eid INT) AS\n BEGIN\n raiseSalary(eid, stdRaiseAmount);\n log(eid, \'raiseSalaryStd id=\' || eid);\n END;\n\nBEGIN \n log(0, \'Session \' || connection_id() || \' \' || current_user || \' started\');\nEND\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-create-package-body/','','https://mariadb.com/kb/en/show-create-package-body/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (371,26,'SHOW CREATE PROCEDURE','Syntax\n------\n\nSHOW CREATE PROCEDURE proc_name\n\nDescription\n-----------\n\nThis statement is a MariaDB extension. It returns the exact string that can be\nused to re-create the named stored procedure, as well as the SQL_MODE that was\nused when the trigger has been created and the character set used by the\nconnection.. A similar statement, SHOW CREATE FUNCTION, displays information\nabout stored functions.\n\nBoth statements require that you are the owner of the routine or have the\nSELECT privilege on the mysql.proc table. When neither is true, the statements\ndisplay NULL for the Create Procedure or Create Function field.\n\nWarning Users with SELECT privileges on mysql.proc or USAGE privileges on *.*\ncan view the text of routines, even when they do not have privileges for the\nfunction or procedure itself.\n\nThe output of these statements is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n\nExamples\n--------\n\nHere\'s a comparison of the SHOW CREATE PROCEDURE and SHOW CREATE FUNCTION\nstatements.\n\nSHOW CREATE PROCEDURE test.simpleproc\\G\n*************************** 1. row ***************************\n Procedure: simpleproc\n sql_mode:\n Create Procedure: CREATE PROCEDURE `simpleproc`(OUT param1 INT)\n BEGIN\n SELECT COUNT(*) INTO param1 FROM t;\n END\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nSHOW CREATE FUNCTION test.hello\\G\n*************************** 1. row ***************************\n Function: hello\n sql_mode:\n Create Function: CREATE FUNCTION `hello`(s CHAR(20))\n RETURNS CHAR(50)\n RETURN CONCAT(\'Hello, \',s,\'!\')\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nWhen the user issuing the statement does not have privileges on the routine,\nattempting to CALL the procedure raises Error 1370.\n\nCALL test.prc1();\nError 1370 (42000): execute command denieed to user \'test_user\'@\'localhost\'\nfor routine \'test\'.\'prc1\'\n\nIf the user neither has privilege to the routine nor the SELECT privilege on\nmysql.proc table, it raises Error 1305, informing them that the procedure does\nnot exist.\n\nSHOW CREATE TABLES test.prc1\\G\nError 1305 (42000): PROCEDURE prc1 does not exist\n\nURL: https://mariadb.com/kb/en/show-create-procedure/','','https://mariadb.com/kb/en/show-create-procedure/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (372,26,'SHOW CREATE SEQUENCE','MariaDB starting with 10.3.1\n----------------------------\nSequences were introduced in MariaDB 10.3.\n\nSyntax\n------\n\nSHOW CREATE SEQUENCE sequence_name;\n\nDescription\n-----------\n\nShows the CREATE SEQUENCE statement that created the given sequence. The\nstatement requires the SELECT privilege for the table.\n\nExample\n-------\n\nCREATE SEQUENCE s1 START WITH 50;\nSHOW CREATE SEQUENCE s1\\G;\n*************************** 1. row ***************************\n Table: s1\nCreate Table: CREATE SEQUENCE `s1` start with 50 minvalue 1 maxvalue\n9223372036854775806 \n increment by 1 cache 1000 nocycle ENGINE=InnoDB\n\nNotes\n-----\n\nIf you want to see the underlying table structure used for the SEQUENCE you\ncan use SHOW CREATE TABLE on the SEQUENCE. You can also use SELECT to read the\ncurrent recorded state of the SEQUENCE:\n\nSHOW CREATE TABLE s1\\G\n*************************** 1. row ***************************\n Table: s1\nCreate Table: CREATE TABLE `s1` (\n `next_not_cached_value` bigint(21) NOT NULL,\n `minimum_value` bigint(21) NOT NULL,\n `maximum_value` bigint(21) NOT NULL,\n `start_value` bigint(21) NOT NULL COMMENT \'start value when sequences is\ncreated \n or value if RESTART is used\',\n `increment` bigint(21) NOT NULL COMMENT \'increment value\',\n `cache_size` bigint(21) unsigned NOT NULL,\n `cycle_option` tinyint(1) unsigned NOT NULL COMMENT \'0 if no cycles are\nallowed, \n 1 if the sequence should begin a new cycle when maximum_value is passed\',\n `cycle_count` bigint(21) NOT NULL COMMENT \'How many cycles have been done\'\n) ENGINE=InnoDB SEQUENCE=1\n\nSELECT * FROM s1\\G\n*************************** 1. row ***************************\nnext_not_cached_value: 50\n minimum_value: 1\n maximum_value: 9223372036854775806\n start_value: 50\n increment: 1\n cache_size: 1000\n cycle_option: 0\n cycle_count: 0\n\nURL: https://mariadb.com/kb/en/show-create-sequence/','','https://mariadb.com/kb/en/show-create-sequence/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (373,26,'SHOW CREATE TRIGGER','Syntax\n------\n\nSHOW CREATE TRIGGER trigger_name\n\nDescription\n-----------\n\nThis statement shows a CREATE TRIGGER statement that creates the given\ntrigger, as well as the SQL_MODE that was used when the trigger has been\ncreated and the character set used by the connection.\n\nThe output of this statement is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n\nExamples\n--------\n\nSHOW CREATE TRIGGER example\\G\n*************************** 1. row ***************************\n Trigger: example\n sql_mode:\nONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,STRICT_ALL_TABLES\n,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO\n\nENGINE_SUBSTITUTION\nSQL Original Statement: CREATE DEFINER=`root`@`localhost` TRIGGER example\nBEFORE\n INSERT ON t FOR EACH ROW\nBEGIN\n SET NEW.c = NEW.c * 2;\nEND\n character_set_client: cp850\n collation_connection: cp850_general_ci\n Database Collation: utf8_general_ci\n Created: 2016-09-29 13:53:34.35\n\nMariaDB starting with 10.2.3\n----------------------------\nThe Created column was added in MySQL 5.7 and MariaDB 10.2.3 as part of\nintroducing multiple trigger events per action.\n\nURL: https://mariadb.com/kb/en/show-create-trigger/','','https://mariadb.com/kb/en/show-create-trigger/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (374,26,'SHOW CREATE VIEW','Syntax\n------\n\nSHOW CREATE VIEW view_name\n\nDescription\n-----------\n\nThis statement shows a CREATE VIEW statement that creates the given view, as\nwell as the character set used by the connection when the view was created.\nThis statement also works with views.\n\nSHOW CREATE VIEW quotes table, column and stored function names according to\nthe value of the sql_quote_show_create server system variable.\n\nExamples\n--------\n\nSHOW CREATE VIEW example\\G\n*************************** 1. row ***************************\n View: example\n Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL\nSECURITY DEFINER VIEW `example` AS (select `t`.`id` AS `id`,`t`.`s` AS `s` from\n`t`)\ncharacter_set_client: cp850\ncollation_connection: cp850_general_ci\n\nWith sql_quote_show_create off:\n\nSHOW CREATE VIEW example\\G\n*************************** 1. row ***************************\n View: example\n Create View: CREATE ALGORITHM=UNDEFINED DEFINER=root@localhost SQL\nSECU\nRITY DEFINER VIEW example AS (select t.id AS id,t.s AS s from t)\ncharacter_set_client: cp850\ncollation_connection: cp850_general_ci\n\nGrants\n------\n\nTo be able to see a view, you need to have the SHOW VIEW and the SELECT\nprivilege on the view:\n\nGRANT SHOW VIEW,SELECT ON test_database.test_view TO \'test\'@\'localhost\';\n\nURL: https://mariadb.com/kb/en/show-create-view/','','https://mariadb.com/kb/en/show-create-view/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (375,26,'SHOW DATABASES','Syntax\n------\n\nSHOW {DATABASES | SCHEMAS}\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW DATABASES lists the databases on the MariaDB server host. SHOW SCHEMAS is\na synonym for SHOW DATABASES. The LIKE clause, if present on its own,\nindicates which database names to match. The WHERE and LIKE clauses can be\ngiven to select rows using more general conditions, as discussed in Extended\nSHOW.\n\nYou see only those databases for which you have some kind of privilege, unless\nyou have the global SHOW DATABASES privilege. You can also get this list using\nthe mysqlshow command.\n\nIf the server was started with the --skip-show-database option, you cannot use\nthis statement at all unless you have the SHOW DATABASES privilege.\n\nThe list of results returned by SHOW DATABASES is based on directories in the\ndata directory, which is how MariaDB implements databases. It\'s possible that\noutput includes directories that do not correspond to actual databases.\n\nThe Information Schema SCHEMATA table also contains database information.\n\nExamples\n--------\n\nSHOW DATABASES;\n+--------------------+\n| Database |\n+--------------------+\n| information_schema |\n| mysql |\n| performance_schema |\n| test |\n+--------------------+\n\nSHOW DATABASES LIKE \'m%\';\n+---------------+\n| Database (m%) |\n+---------------+\n| mysql |\n+---------------+\n\nURL: https://mariadb.com/kb/en/show-databases/','','https://mariadb.com/kb/en/show-databases/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (376,26,'SHOW ENGINE','Syntax\n------\n\nSHOW ENGINE engine_name {STATUS | MUTEX}\n\nDescription\n-----------\n\nSHOW ENGINE displays operational information about a storage engine. The\nfollowing statements currently are supported:\n\nSHOW ENGINE INNODB STATUS\nSHOW ENGINE INNODB MUTEX\nSHOW ENGINE PERFORMANCE_SCHEMA STATUS\nSHOW ENGINE ROCKSDB STATUS\n\nIf the Sphinx Storage Engine is installed, the following is also supported:\n\nSHOW ENGINE SPHINX STATUS\n\nSee SHOW ENGINE SPHINX STATUS.\n\nOlder (and now removed) synonyms were SHOW INNODB STATUS for SHOW ENGINE\nINNODB STATUS and SHOW MUTEX STATUS for SHOW ENGINE INNODB MUTEX.\n\nSHOW ENGINE INNODB STATUS\n-------------------------\n\nSHOW ENGINE INNODB STATUS displays extensive information from the standard\nInnoDB Monitor about the state of the InnoDB storage engine. See SHOW ENGINE\nINNODB STATUS for more.\n\nSHOW ENGINE INNODB MUTEX\n------------------------\n\nSHOW ENGINE INNODB MUTEX displays InnoDB mutex statistics.\n\nThe statement displays the following output fields:\n\n* Type: Always InnoDB.\n* Name: The source file where the mutex is implemented, and the line number\n in the file where the mutex is created. The line number is dependent on the\nMariaDB version.\n* Status: This field displays the following values if UNIV_DEBUG was defined\nat compilation time (for example, in include/univ.h in the InnoDB part of the\nsource tree). Only the os_waits value is displayed if UNIV_DEBUG was not\ndefined. Without UNIV_DEBUG, the information on which the output is based is\ninsufficient to distinguish regular mutexes and mutexes that protect\n rw-locks (which allow multiple readers or a single writer). Consequently, the\n output may appear to contain multiple rows for the same mutex.\ncount indicates how many times the mutex was requested.\nspin_waits indicates how many times the spinlock had to run.\nspin_rounds indicates the number of spinlock rounds. (spin_rounds divided by\n spin_waits provides the average round count.)\nos_waits indicates the number of operating system waits. This occurs when\n the spinlock did not work (the mutex was not locked during the spinlock and\n it was necessary to yield to the operating system and wait).\nos_yields indicates the number of times a the thread trying to lock a mutex\n gave up its timeslice and yielded to the operating system (on the\n presumption that allowing other threads to run will free the mutex so that\n it can be locked).\nos_wait_times indicates the amount of time (in ms) spent in operating system\n waits, if the timed_mutexes system variable is 1 (ON). If timed_mutexes is 0\n (OFF), timing is disabled, so os_wait_times is 0. timed_mutexes is off by\n default.\n\nInformation from this statement can be used to diagnose system problems. For\nexample, large values of spin_waits and spin_rounds may indicate scalability\nproblems.\n\nThe information_schema.INNODB_MUTEXES table provides similar information.\n\nSHOW ENGINE PERFORMANCE_SCHEMA STATUS\n-------------------------------------\n\nThis statement shows how much memory is used for performance_schema tables and\ninternal buffers.\n\nThe output contains the following fields:\n\n* Type: Always performance_schema.\n* Name: The name of a table, the name of an internal buffer, or the\nperformance_schema word, followed by a dot and an attribute. Internal buffers\nnames are enclosed by parenthesis. performance_schema means that the attribute\nrefers to the whole database (it is a total). \n* Status: The value for the attribute.\n\nThe following attributes are shown, in this order, for all tables:\n\n* row_size: The memory used for an individual record. This value will never\nchange.\n* row_count: The number of rows in the table or buffer. For some tables, this\nvalue depends on a server system variable.\n* memory: For tables and performance_schema, this is the result of row_size *\nrow_count.\n\nFor internal buffers, the attributes are:\n\n* count\n* size\n\nSHOW ENGINE ROCKSDB STATUS\n--------------------------\n\nSee also MyRocks Performance Troubleshooting\n\nURL: https://mariadb.com/kb/en/show-engine/','','https://mariadb.com/kb/en/show-engine/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (377,26,'SHOW ENGINE INNODB STATUS','SHOW ENGINE INNODB STATUS is a specific form of the SHOW ENGINE statement that\ndisplays the InnoDB Monitor output, which is extensive InnoDB information\nwhich can be useful in diagnosing problems.\n\nThe following sections are displayed\n\n* Status: Shows the timestamp, monitor name and the number of seconds, or the\nelapsed time between the current time and the time the InnoDB Monitor output\nwas last displayed. The per-second averages are based upon this time.\n* BACKGROUND THREAD: srv_master_thread lines show work performed by the main\nbackground thread.\n* SEMAPHORES: Threads waiting for a semaphore and stats on how the number of\ntimes threads have needed a spin or a wait on a mutex or rw-lock semaphore. If\nthis number of threads is large, there may be I/O or contention issues.\nReducing the size of the innodb_thread_concurrency system variable may help if\ncontention is related to thread scheduling. Spin rounds per wait shows the\nnumber of spinlock rounds per OS wait for a mutex. \n* LATEST FOREIGN KEY ERROR: Only shown if there has been a foreign key\nconstraint error, it displays the failed statement and information about the\nconstraint and the related tables.\n* LATEST DETECTED DEADLOCK: Only shown if there has been a deadlock, it\ndisplays the transactions involved in the deadlock and the statements being\nexecuted, held and required locked and the transaction rolled back to.\n* TRANSACTIONS: The output of this section can help identify lock contention,\nas well as reasons for the deadlocks.\n* FILE I/O: InnoDB thread information as well as pending I/O operations and\nI/O performance statistics.\n* INSERT BUFFER AND ADAPTIVE HASH INDEX: InnoDB insert buffer (old name for\nthe change buffer) and adaptive hash index status information, including the\nnumber of each type of operation performed, and adaptive hash index\nperformance.\n* LOG: InnoDB log information, including current log sequence number, how far\nthe log has been flushed to disk, the position at which InnoDB last took a\ncheckpoint, pending writes and write performance statistics.\n* BUFFER POOL AND MEMORY: Information on buffer pool pages read and written,\nwhich allows you to see the number of data file I/O operations performed by\nyour queries. See InnoDB Buffer Pool for more. Similar information is also\navailable from the INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS table.\n* ROW OPERATIONS:Information about the main thread, including the number and\nperformance rate for each type of row operation.\n\nIf the innodb_status_output_locks system variable is set to 1, extended lock\ninformation will be displayed.\n\nExample output:\n\n=====================================\n2019-09-06 12:44:13 0x7f93cc236700 INNODB MONITOR OUTPUT\n=====================================\nPer second averages calculated from the last 4 seconds\n-----------------\nBACKGROUND THREAD\n-----------------\nsrv_master_thread loops: 2 srv_active, 0 srv_shutdown, 83698 srv_idle\nsrv_master_thread log flush and writes: 83682\n----------\nSEMAPHORES\n----------\nOS WAIT ARRAY INFO: reservation count 15\nOS WAIT ARRAY INFO: signal count 8\nRW-shared spins 0, rounds 20, OS waits 7\nRW-excl spins 0, rounds 0, OS waits 0\nRW-sx spins 0, rounds 0, OS waits 0\nSpin rounds per wait: 20.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx\n------------\nTRANSACTIONS\n------------\nTrx id counter 236\nPurge done for trx\'s n:o < 236 undo n:o < 0 state: running\nHistory list length 22\nLIST OF TRANSACTIONS FOR EACH SESSION:\n---TRANSACTION 421747401994584, not started\n0 lock struct(s), heap size 1136, 0 row lock(s)\n---TRANSACTION 421747401990328, not started\n0 lock struct(s), heap size 1136, 0 row lock(s)\n--------\nFILE I/O\n--------\nI/O thread 0 state: waiting for completed aio requests (insert buffer thread)\nI/O thread 1 state: waiting for completed aio requests (log thread)\nI/O thread 2 state: waiting for completed aio requests (read thread)\nI/O thread 3 state: waiting for completed aio requests (read thread)\nI/O thread 4 state: waiting for completed aio requests (read thread)\nI/O thread 5 state: waiting for completed aio requests (read thread)\nI/O thread 6 state: waiting for completed aio requests (write thread)\nI/O thread 7 state: waiting for completed aio requests (write thread)\nI/O thread 8 state: waiting for completed aio requests (write thread)\nI/O thread 9 state: waiting for completed aio requests (write thread)\nPending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,\n ibuf aio reads:, log i/o\'s:, sync i/o\'s:\nPending flushes (fsync) log: 0; buffer pool: 0\n286 OS file reads, 171 OS file writes, 22 OS fsyncs\n0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s\n-------------------------------------\nINSERT BUFFER AND ADAPTIVE HASH INDEX\n-------------------------------------\nIbuf: size 1, free list len 0, seg size 2, 0 merges\nmerged operations:\n insert 0, delete mark 0, delete 0\ndiscarded operations:\n insert 0, delete mark 0, delete 0\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\nHash table size 34679, node heap has 0 buffer(s)\n0.00 hash searches/s, 0.00 non-hash searches/s\n---\nLOG\n---\nLog sequence number 445926\nLog flushed up to 445926\nPages flushed up to 445926\nLast checkpoint at 445917\n0 pending log flushes, 0 pending chkp writes\n18 log i/o\'s done, 0.00 log i/o\'s/second\n----------------------\nBUFFER POOL AND MEMORY\n----------------------\nTotal large memory allocated 167772160\nDictionary memory allocated 50768\nBuffer pool size 8012\nFree buffers 7611\nDatabase pages 401\nOld database pages 0\nModified db pages 0\nPercent of dirty pages(LRU & free pages): 0.000\nMax dirty pages percent: 75.000\nPending reads 0\nPending writes: LRU 0, flush list 0, single page 0\nPages made young 0, not young 0\n0.00 youngs/s, 0.00 non-youngs/s\nPages read 264, created 137, written 156\n0.00 reads/s, 0.00 creates/s, 0.00 writes/s\nNo buffer pool page gets since the last printout\nPages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead\n0.00/s\nLRU len: 401, unzip_LRU len: 0\nI/O sum[0]:cur[0], unzip sum[0]:cur[0]\n--------------\nROW OPERATIONS\n--------------\n0 queries inside InnoDB, 0 queries in queue\n0 read views open inside InnoDB\nProcess ID=4267, Main thread ID=140272021272320, state: sleeping\nNumber of rows inserted 1, updated 0, deleted 0, read 1\n0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s\nNumber of system rows inserted 0, updated 0, deleted 0, read 0\n0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s\n----------------------------\nEND OF INNODB MONITOR OUTPUT\n============================\n\nURL: https://mariadb.com/kb/en/show-engine-innodb-status/','','https://mariadb.com/kb/en/show-engine-innodb-status/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (378,26,'SHOW ENGINES','Syntax\n------\n\nSHOW [STORAGE] ENGINES\n\nDescription\n-----------\n\nSHOW ENGINES displays status information about the server\'s storage engines.\nThis is particularly useful for checking whether a storage engine is\nsupported, or to see what the default engine is. SHOW TABLE TYPES is a\ndeprecated synonym.\n\nThe information_schema.ENGINES table provides the same information.\n\nSince storage engines are plugins, different information about them is also\nshown in the information_schema.PLUGINS table and by the SHOW PLUGINS\nstatement.\n\nNote that both MySQL\'s InnoDB and Percona\'s XtraDB replacement are labeled as\nInnoDB. However, if XtraDB is in use, it will be specified in the COMMENT\nfield. See XtraDB and InnoDB. The same applies to FederatedX.\n\nThe output consists of the following columns:\n\n* Engine indicates the engine\'s name.\n* Support indicates whether the engine is installed, and whether it is the\ndefault engine for the current session.\n* Comment is a brief description.\n* Transactions, XA and Savepoints indicate whether transactions, XA\ntransactions and transaction savepoints are supported by the engine.\n\nExamples\n--------\n\nSHOW ENGINES\\G\n*************************** 1. row ***************************\n Engine: InnoDB\n Support: DEFAULT\n Comment: Supports transactions, row-level locking, and foreign keys\nTransactions: YES\n XA: YES\n Savepoints: YES\n*************************** 2. row ***************************\n Engine: CSV\n Support: YES\n Comment: CSV storage engine\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 3. row ***************************\n Engine: MyISAM\n Support: YES\n Comment: MyISAM storage engine\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 4. row ***************************\n Engine: BLACKHOLE\n Support: YES\n Comment: /dev/null storage engine (anything you write to it disappears)\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 5. row ***************************\n Engine: FEDERATED\n Support: YES\n Comment: FederatedX pluggable storage engine\nTransactions: YES\n XA: NO\n Savepoints: YES\n*************************** 6. row ***************************\n Engine: MRG_MyISAM\n Support: YES\n Comment: Collection of identical MyISAM tables\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 7. row ***************************\n Engine: ARCHIVE\n Support: YES\n Comment: Archive storage engine\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 8. row ***************************\n Engine: MEMORY\n Support: YES\n Comment: Hash based, stored in memory, useful for temporary tables\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 9. row ***************************\n Engine: PERFORMANCE_SCHEMA\n Support: YES\n Comment: Performance Schema\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 10. row ***************************\n Engine: Aria\n Support: YES\n Comment: Crash-safe tables with MyISAM heritage\nTransactions: NO\n XA: NO\n Savepoints: NO\n10 rows in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/show-engines/','','https://mariadb.com/kb/en/show-engines/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (379,26,'SHOW ERRORS','Syntax\n------\n\nSHOW ERRORS [LIMIT [offset,] row_count]\nSHOW ERRORS [LIMIT row_count OFFSET offset]\nSHOW COUNT(*) ERRORS\n\nDescription\n-----------\n\nThis statement is similar to SHOW WARNINGS, except that instead of displaying\nerrors, warnings, and notes, it displays only errors.\n\nThe LIMIT clause has the same syntax as for the SELECT statement.\n\nThe SHOW COUNT(*) ERRORS statement displays the number of errors. You can also\nretrieve this number from the error_count variable.\n\nSHOW COUNT(*) ERRORS;\nSELECT @@error_count;\n\nThe value of error_count might be greater than the number of messages\ndisplayed by SHOW WARNINGS if the max_error_count system variable is set so\nlow that not all messages are stored.\n\nFor a list of MariaDB error codes, see MariaDB Error Codes.\n\nExamples\n--------\n\nSELECT f();\nERROR 1305 (42000): FUNCTION f does not exist\n\nSHOW COUNT(*) ERRORS;\n+-----------------------+\n| @@session.error_count |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSHOW ERRORS;\n+-------+------+---------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------+\n| Error | 1305 | FUNCTION f does not exist |\n+-------+------+---------------------------+\n\nURL: https://mariadb.com/kb/en/show-errors/','','https://mariadb.com/kb/en/show-errors/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (380,26,'SHOW EVENTS','Syntax\n------\n\nSHOW EVENTS [{FROM | IN} schema_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nShows information about Event Manager events (created with CREATE EVENT).\nRequires the EVENT privilege. Without any arguments, SHOW EVENTS lists all of\nthe events in the current schema:\n\nSELECT CURRENT_USER(), SCHEMA();\n+----------------+----------+\n| CURRENT_USER() | SCHEMA() |\n+----------------+----------+\n| jon@ghidora | myschema |\n+----------------+----------+\n\nSHOW EVENTS\\G\n*************************** 1. row ***************************\n Db: myschema\n Name: e_daily\n Definer: jon@ghidora\n Time zone: SYSTEM\n Type: RECURRING\n Execute at: NULL\n Interval value: 10\n Interval field: SECOND\n Starts: 2006-02-09 10:41:23\n Ends: NULL\n Status: ENABLED\n Originator: 0\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nTo see the event action, use SHOW CREATE EVENT instead, or look at the\ninformation_schema.EVENTS table.\n\nTo see events for a specific schema, use the FROM clause. For example, to see\nevents for the test schema, use the following statement:\n\nSHOW EVENTS FROM test;\n\nThe LIKE clause, if present, indicates which event names to match. The WHERE\nclause can be given to select rows using more general conditions, as discussed\nin Extended Show.\n\nURL: https://mariadb.com/kb/en/show-events/','','https://mariadb.com/kb/en/show-events/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (381,26,'SHOW FUNCTION STATUS','Syntax\n------\n\nSHOW FUNCTION STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThis statement is similar to SHOW PROCEDURE STATUS but for stored functions.\n\nThe LIKE clause, if present on its own, indicates which function names to\nmatch.\n\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe information_schema.ROUTINES table contains more detailed information.\n\nExamples\n--------\n\nShowing all stored functions:\n\nSHOW FUNCTION STATUS\\G\n*************************** 1. row ***************************\n Db: test\n Name: VatCents\n Type: FUNCTION\n Definer: root@localhost\n Modified: 2013-06-01 12:40:31\n Created: 2013-06-01 12:40:31\n Security_type: DEFINER\n Comment:\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nStored functions whose name starts with \'V\':\n\nSHOW FUNCTION STATUS LIKE \'V%\' \\G\n*************************** 1. row ***************************\n Db: test\n Name: VatCents\n Type: FUNCTION\n Definer: root@localhost\n Modified: 2013-06-01 12:40:31\n Created: 2013-06-01 12:40:31\n Security_type: DEFINER\n Comment:\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nStored functions with a security type of \'DEFINER\':\n\nSHOW FUNCTION STATUS WHERE Security_type LIKE \'DEFINER\' \\G\n*************************** 1. row ***************************\n Db: test\n Name: VatCents\n Type: FUNCTION\n Definer: root@localhost\n Modified: 2013-06-01 12:40:31\n Created: 2013-06-01 12:40:31\n Security_type: DEFINER\n Comment:\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-function-status/','','https://mariadb.com/kb/en/show-function-status/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (382,26,'SHOW LOCALES','SHOW LOCALES was introduced as part of the Information Schema plugin extension.\n\nSHOW LOCALES is used to return locales information as part of the Locales\nplugin. While the information_schema.LOCALES table has 8 columns, the SHOW\nLOCALES statement will only display 4 of them:\n\nExample\n-------\n\nSHOW LOCALES;\n+-----+-------+-------------------------------------+------------------------+\n| Id | Name | Description | Error_Message_Language |\n+-----+-------+-------------------------------------+------------------------+\n| 0 | en_US | English - United States | english |\n| 1 | en_GB | English - United Kingdom | english |\n| 2 | ja_JP | Japanese - Japan | japanese |\n| 3 | sv_SE | Swedish - Sweden | swedish |\n...\n\nURL: https://mariadb.com/kb/en/show-locales/','','https://mariadb.com/kb/en/show-locales/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (383,26,'SHOW OPEN TABLES','Syntax\n------\n\nSHOW OPEN TABLES [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW OPEN TABLES lists the non-TEMPORARY tables that are currently open in the\ntable cache. See http://dev.mysql.com/doc/refman/5.1/en/table-cache.html.\n\nThe FROM and LIKE clauses may be used.\n\nThe FROM clause, if present, restricts the tables shown to those present in\nthe db_name database.\n\nThe LIKE clause, if present on its own, indicates which table names to match.\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe following information is returned:\n\n+---------------------------+------------------------------------------------+\n| Column | Description |\n+---------------------------+------------------------------------------------+\n| Database | Database name. |\n+---------------------------+------------------------------------------------+\n| Name | Table name. |\n+---------------------------+------------------------------------------------+\n| In_use | Number of table instances being used. |\n+---------------------------+------------------------------------------------+\n| Name_locked | 1 if the table is name-locked, e.g. if it is |\n| | being dropped or renamed, otherwise 0. |\n+---------------------------+------------------------------------------------+\n\nBefore MariaDB 5.5, each use of, for example, LOCK TABLE ... WRITE would\nincrement In_use for that table. With the implementation of the metadata\nlocking improvements in MariaDB 5.5, LOCK TABLE... WRITE acquires a strong MDL\nlock, and concurrent connections will wait on this MDL lock, so any subsequent\nLOCK TABLE... WRITE will not increment In_use.\n\nExample\n-------\n\nSHOW OPEN TABLES;\n+----------+---------------------------+--------+-------------+\n| Database | Table | In_use | Name_locked |\n+----------+---------------------------+--------+-------------+\n...\n| test | xjson | 0 | 0 |\n| test | jauthor | 0 | 0 |\n| test | locks | 1 | 0 |\n...\n+----------+---------------------------+--------+-------------+\n\nURL: https://mariadb.com/kb/en/show-open-tables/','','https://mariadb.com/kb/en/show-open-tables/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (384,26,'SHOW PACKAGE BODY STATUS','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nSHOW PACKAGE BODY STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThe SHOW PACKAGE BODY STATUS statement returns characteristics of stored\npackage bodies (implementations), such as the database, name, type, creator,\ncreation and modification dates, and character set information. A similar\nstatement, SHOW PACKAGE STATUS, displays information about stored package\nspecifications.\n\nThe LIKE clause, if present, indicates which package names to match. The WHERE\nand LIKE clauses can be given to select rows using more general conditions, as\ndiscussed in Extended SHOW.\n\nThe ROUTINES table in the INFORMATION_SCHEMA database contains more detailed\ninformation.\n\nExamples\n--------\n\nSHOW PACKAGE BODY STATUS LIKE \'pkg1\'\\G\n*************************** 1. row ***************************\n Db: test\n Name: pkg1\n Type: PACKAGE BODY\n Definer: root@localhost\n Modified: 2018-02-27 14:44:14\n Created: 2018-02-27 14:44:14\n Security_type: DEFINER\n Comment: This is my first package body\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-package-body-status/','','https://mariadb.com/kb/en/show-package-body-status/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (385,26,'SHOW PACKAGE STATUS','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nSHOW PACKAGE STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThe SHOW PACKAGE STATUS statement returns characteristics of stored package\nspecifications, such as the database, name, type, creator, creation and\nmodification dates, and character set information. A similar statement, SHOW\nPACKAGE BODY STATUS, displays information about stored package bodies (i.e.\nimplementations).\n\nThe LIKE clause, if present, indicates which package names to match. The WHERE\nand LIKE clauses can be given to select rows using more general conditions, as\ndiscussed in Extended SHOW.\n\nThe ROUTINES table in the INFORMATION_SCHEMA database contains more detailed\ninformation.\n\nExamples\n--------\n\nSHOW PACKAGE STATUS LIKE \'pkg1\'\\G\n*************************** 1. row ***************************\n Db: test\n Name: pkg1\n Type: PACKAGE\n Definer: root@localhost\n Modified: 2018-02-27 14:38:15\n Created: 2018-02-27 14:38:15\n Security_type: DEFINER\n Comment: This is my first package\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-package-status/','','https://mariadb.com/kb/en/show-package-status/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (386,26,'SHOW PRIVILEGES','Syntax\n------\n\nSHOW PRIVILEGES\n\nDescription\n-----------\n\nSHOW PRIVILEGES shows the list of system privileges that the MariaDB server\nsupports. The exact list of privileges depends on the version of your server.\n\nNote that before MariaDB 10.3.23, MariaDB 10.4.13 and MariaDB 10.5.2 , the\nDelete history privilege displays as Delete versioning rows (MDEV-20382).\n\nExample\n-------\n\nFrom MariaDB 10.5.9\n\nSHOW PRIVILEGES;\n+--------------------------+---------------------------------------+-----------\n--------------------------------------------------------+\n| Privilege | Context | Comment \n |\n+--------------------------+---------------------------------------+-----------\n--------------------------------------------------------+\n| Alter | Tables | To alter\nthe table |\n| Alter routine | Functions,Procedures | To alter\nor drop stored functions/procedures |\n| Create | Databases,Tables,Indexes | To create\nnew databases and tables |\n| Create routine | Databases | To use\nCREATE FUNCTION/PROCEDURE |\n| Create temporary tables | Databases | To use\nCREATE TEMPORARY TABLE |\n| Create view | Tables | To create\nnew views |\n| Create user | Server Admin | To create\nnew users |\n| Delete | Tables | To delete\nexisting rows |\n| Delete history | Tables | To delete\nversioning table historical rows |\n| Drop | Databases,Tables | To drop\ndatabases, tables, and views |\n| Event | Server Admin | To\ncreate, alter, drop and execute events |\n| Execute | Functions,Procedures | To\nexecute stored routines |\n| File | File access on server | To read\nand write files on the server |\n| Grant option | Databases,Tables,Functions,Procedures | To give\nto other users those privileges you possess |\n| Index | Tables | To create\nor drop indexes |\n| Insert | Tables | To insert\ndata into tables |\n| Lock tables | Databases | To use\nLOCK TABLES (together with SELECT privilege) |\n| Process | Server Admin | To view\nthe plain text of currently executing queries |\n| Proxy | Server Admin | To make\nproxy user possible |\n| References | Databases,Tables | To have\nreferences on tables |\n| Reload | Server Admin | To reload\nor refresh tables, logs and privileges |\n| Binlog admin | Server | To purge\nbinary logs |\n| Binlog monitor | Server | To use\nSHOW BINLOG STATUS and SHOW BINARY LOG |\n| Binlog replay | Server | To use\nBINLOG (generated by mariadb-binlog) |\n| Replication master admin | Server | To\nmonitor connected slaves |\n| Replication slave admin | Server | To\nstart/stop slave and apply binlog events |\n| Slave monitor | Server | To use\nSHOW SLAVE STATUS and SHOW RELAYLOG EVENTS |\n| Replication slave | Server Admin | To read\nbinary log events from the master |\n| Select | Tables | To\nretrieve rows from table |\n| Show databases | Server Admin | To see\nall databases with SHOW DATABASES |\n| Show view | Tables | To see\nviews with SHOW CREATE VIEW |\n| Shutdown | Server Admin | To shut\ndown the server |\n| Super | Server Admin | To use\nKILL thread, SET GLOBAL, CHANGE MASTER, etc. |\n| Trigger | Tables | To use\ntriggers |\n| Create tablespace | Server Admin | To\ncreate/alter/drop tablespaces |\n| Update | Tables | To update\nexisting rows |\n| Set user | Server | To create\nviews and stored routines with a different definer |\n| Federated admin | Server | To\nexecute the CREATE SERVER, ALTER SERVER, DROP SERVER statements |\n| Connection admin | Server | To bypass\nconnection limits and kill other users\' connections |\n| Read_only admin | Server | To\nperform write operations even if @@read_only=ON |\n| Usage | Server Admin | No\nprivileges - allow connect only |\n+--------------------------+---------------------------------------+-----------\n--------------------------------------------------------+\n41 rows in set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/show-privileges/','','https://mariadb.com/kb/en/show-privileges/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (387,26,'SHOW PROCEDURE CODE','Syntax\n------\n\nSHOW PROCEDURE CODE proc_name\n\nDescription\n-----------\n\nThis statement is a MariaDB extension that is available only for servers that\nhave been built with debugging support. It displays a representation of the\ninternal implementation of the named stored procedure. A similar statement,\nSHOW FUNCTION CODE, displays information about stored functions.\n\nBoth statements require that you be the owner of the routine or have SELECT\naccess to the mysql.proc table.\n\nIf the named routine is available, each statement produces a result set. Each\nrow in the result set corresponds to one \"instruction\" in the routine. The\nfirst column is Pos, which is an ordinal number beginning with 0. The second\ncolumn is Instruction, which contains an SQL statement (usually changed from\nthe original source), or a directive which has meaning only to the\nstored-routine handler.\n\nExamples\n--------\n\nDELIMITER //\n\nCREATE PROCEDURE p1 ()\n BEGIN\n DECLARE fanta INT DEFAULT 55;\n DROP TABLE t2;\n LOOP\n INSERT INTO t3 VALUES (fanta);\n END LOOP;\n END//\nQuery OK, 0 rows affected (0.00 sec)\n\nSHOW PROCEDURE CODE p1//\n+-----+----------------------------------------+\n| Pos | Instruction |\n+-----+----------------------------------------+\n| 0 | set fanta@0 55 |\n| 1 | stmt 9 \"DROP TABLE t2\" |\n| 2 | stmt 5 \"INSERT INTO t3 VALUES (fanta)\" |\n| 3 | jump 2 |\n+-----+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/show-procedure-code/','','https://mariadb.com/kb/en/show-procedure-code/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (388,26,'SHOW PROCEDURE STATUS','Syntax\n------\n\nSHOW PROCEDURE STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThis statement is a MariaDB extension. It returns characteristics of a stored\nprocedure, such as the database, name, type, creator, creation and\nmodification dates, and character set information. A similar statement, SHOW\nFUNCTION STATUS, displays information about stored functions.\n\nThe LIKE clause, if present, indicates which procedure or function names to\nmatch. The WHERE and LIKE clauses can be given to select rows using more\ngeneral conditions, as discussed in Extended SHOW.\n\nThe ROUTINES table in the INFORMATION_SCHEMA database contains more detailed\ninformation.\n\nExamples\n--------\n\nSHOW PROCEDURE STATUS LIKE \'p1\'\\G\n*************************** 1. row ***************************\n Db: test\n Name: p1\n Type: PROCEDURE\n Definer: root@localhost\n Modified: 2010-08-23 13:23:03\n Created: 2010-08-23 13:23:03\n Security_type: DEFINER\n Comment:\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n\nURL: https://mariadb.com/kb/en/show-procedure-status/','','https://mariadb.com/kb/en/show-procedure-status/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (389,26,'SHOW PROCESSLIST','Syntax\n------\n\nSHOW [FULL] PROCESSLIST\n\nDescription\n-----------\n\nSHOW PROCESSLIST shows you which threads are running. You can also get this\ninformation from the information_schema.PROCESSLIST table or the mysqladmin\nprocesslist command. If you have the PROCESS privilege, you can see all\nthreads. Otherwise, you can see only your own threads (that is, threads\nassociated with the MariaDB account that you are using). If you do not use the\nFULL keyword, only the first 100 characters of each statement are shown in the\nInfo field.\n\nThe columns shown in SHOW PROCESSLIST are:\n\n+---------------------+------------------------------------------------------+\n| Name | Description |\n+---------------------+------------------------------------------------------+\n| ID | The client\'s process ID. |\n+---------------------+------------------------------------------------------+\n| USER | The username associated with the process. |\n+---------------------+------------------------------------------------------+\n| HOST | The host the client is connected to. |\n+---------------------+------------------------------------------------------+\n| DB | The default database of the process (NULL if no |\n| | default). |\n+---------------------+------------------------------------------------------+\n| COMMAND | The command type. See Thread Command Values. |\n+---------------------+------------------------------------------------------+\n| TIME | The amount of time, in seconds, the process has |\n| | been in its current state. For a replica SQL thread |\n| | before MariaDB 10.1, this is the time in seconds |\n| | between the last replicated event\'s timestamp and |\n| | the replica machine\'s real time. |\n+---------------------+------------------------------------------------------+\n| STATE | See Thread States. |\n+---------------------+------------------------------------------------------+\n| INFO | The statement being executed. |\n+---------------------+------------------------------------------------------+\n| PROGRESS | The total progress of the process (0-100%) (see |\n| | Progress Reporting). |\n+---------------------+------------------------------------------------------+\n\nSee TIME_MS column in information_schema.PROCESSLIST for differences in the\nTIME column between MariaDB and MySQL.\n\nThe information_schema.PROCESSLIST table contains the following additional\ncolumns:\n\n+---------------------+------------------------------------------------------+\n| Name | Description |\n+---------------------+------------------------------------------------------+\n| TIME_MS | The amount of time, in milliseconds, the process |\n| | has been in its current state. |\n+---------------------+------------------------------------------------------+\n| STAGE | The stage the process is currently in. |\n+---------------------+------------------------------------------------------+\n| MAX_STAGE | The maximum number of stages. |\n+---------------------+------------------------------------------------------+\n| PROGRESS | The progress of the process within the current |\n| | stage (0-100%). |\n+---------------------+------------------------------------------------------+\n| MEMORY_USED | The amount of memory used by the process. |\n+---------------------+------------------------------------------------------+\n| EXAMINED_ROWS | The number of rows the process has examined. |\n+---------------------+------------------------------------------------------+\n| QUERY_ID | Query ID. |\n+---------------------+------------------------------------------------------+\n\nNote that the PROGRESS field from the information schema, and the PROGRESS\nfield from SHOW PROCESSLIST display different results. SHOW PROCESSLIST shows\nthe total progress, while the information schema shows the progress for the\ncurrent stage only.\n\nThreads can be killed using their thread_id or their query_id, with the KILL\nstatement.\n\nSince queries on this table are locking, if the performance_schema is enabled,\nyou may want to query the THREADS table instead.\n\nExamples\n--------\n\nSHOW PROCESSLIST;\n+----+-----------------+-----------+------+---------+------+-------------------\n----+------------------+----------+\n| Id | User | Host | db | Command | Time | State \n | Info | Progress |\n+----+-----------------+-----------+------+---------+------+-------------------\n----+------------------+----------+\n| 2 | event_scheduler | localhost | NULL | Daemon | 2693 | Waiting on empty\nqueue | NULL | 0.000 |\n| 4 | root | localhost | NULL | Query | 0 | Table lock \n | SHOW PROCESSLIST | 0.000 |\n+----+-----------------+-----------+------+---------+------+-------------------\n----+------------------+----------+\n\nURL: https://mariadb.com/kb/en/show-processlist/','','https://mariadb.com/kb/en/show-processlist/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (390,26,'SHOW PROFILE','Syntax\n------\n\nSHOW PROFILE [type [, type] ... ]\n [FOR QUERY n]\n [LIMIT row_count [OFFSET offset]]\n\ntype:\n ALL\n | BLOCK IO\n | CONTEXT SWITCHES\n | CPU\n | IPC\n | MEMORY\n | PAGE FAULTS\n | SOURCE\n | SWAPS\n\nDescription\n-----------\n\nThe SHOW PROFILE and SHOW PROFILES statements display profiling information\nthat indicates resource usage for statements executed during the course of the\ncurrent session.\n\nProfiling is controlled by the profiling session variable, which has a default\nvalue of 0 (OFF). Profiling is enabled by setting profiling to 1 or ON:\n\nSET profiling = 1;\n\nSHOW PROFILES displays a list of the most recent statements sent to the\nmaster. The size of the list is controlled by the profiling_history_size\nsession variable, which has a default value of 15. The maximum value is 100.\nSetting the value to 0 has the practical effect of disabling profiling.\n\nAll statements are profiled except SHOW PROFILES and SHOW PROFILE, so you will\nfind neither of those statements in the profile list. Malformed statements are\nprofiled. For example, SHOW PROFILING is an illegal statement, and a syntax\nerror occurs if you try to execute it, but it will show up in the profiling\nlist.\n\nSHOW PROFILE displays detailed information about a single statement. Without\nthe FOR QUERY n clause, the output pertains to the most recently executed\nstatement. If FOR QUERY n is included, SHOW PROFILE displays information for\nstatement n. The values of n correspond to the Query_ID values displayed by\nSHOW PROFILES.\n\nThe LIMIT row_count clause may be given to limit the output to row_count rows.\nIf LIMIT is given, OFFSET offset may be added to begin the output offset rows\ninto the full set of rows.\n\nBy default, SHOW PROFILE displays Status and Duration columns. The Status\nvalues are like the State values displayed by SHOW PROCESSLIST, although there\nmight be some minor differences in interpretation for the two statements for\nsome status values (see\nhttp://dev.mysql.com/doc/refman/5.6/en/thread-information.html).\n\nOptional type values may be specified to display specific additional types of\ninformation:\n\n* ALL displays all information\n* BLOCK IO displays counts for block input and output operations\n* CONTEXT SWITCHES displays counts for voluntary and involuntary context\nswitches\n* CPU displays user and system CPU usage times\n* IPC displays counts for messages sent and received\n* MEMORY is not currently implemented\n* PAGE FAULTS displays counts for major and minor page faults\n* SOURCE displays the names of functions from the source code, together with\nthe name and line number of the file in which the function occurs\n* SWAPS displays swap counts\n\nProfiling is enabled per session. When a session ends, its profiling\ninformation is lost.\n\nThe information_schema.PROFILING table contains similar information.\n\nExamples\n--------\n\nSELECT @@profiling;\n+-------------+\n| @@profiling |\n+-------------+\n| 0 |\n+-------------+\n\nSET profiling = 1;\n\nUSE test;\n\nDROP TABLE IF EXISTS t1;\n\nCREATE TABLE T1 (id INT);\n\nSHOW PROFILES;\n+----------+------------+--------------------------+\n| Query_ID | Duration | Query |\n+----------+------------+--------------------------+\n| 1 | 0.00009200 | SELECT DATABASE() |\n| 2 | 0.00023800 | show databases |\n| 3 | 0.00018900 | show tables |\n| 4 | 0.00014700 | DROP TABLE IF EXISTS t1 |\n| 5 | 0.24476900 | CREATE TABLE T1 (id INT) |\n+----------+------------+--------------------------+\n\nSHOW PROFILE;\n+----------------------+----------+\n| Status | Duration |\n+----------------------+----------+\n| starting | 0.000042 |\n| checking permissions | 0.000044 |\n| creating table | 0.244645 |\n| After create | 0.000013 |\n| query end | 0.000003 |\n| freeing items | 0.000016 |\n| logging slow query | 0.000003 |\n| cleaning up | 0.000003 |\n+----------------------+----------+\n\nSHOW PROFILE FOR QUERY 4;\n+--------------------+----------+\n| Status | Duration |\n+--------------------+----------+\n| starting | 0.000126 |\n| query end | 0.000004 |\n| freeing items | 0.000012 |\n| logging slow query | 0.000003 |\n| cleaning up | 0.000002 |\n+--------------------+----------+\n\nSHOW PROFILE CPU FOR QUERY 5;\n+----------------------+----------+----------+------------+\n| Status | Duration | CPU_user | CPU_system |\n+----------------------+----------+----------+------------+\n| starting | 0.000042 | 0.000000 | 0.000000 |\n| checking permissions | 0.000044 | 0.000000 | 0.000000 |\n| creating table | 0.244645 | 0.000000 | 0.000000 |\n| After create | 0.000013 | 0.000000 | 0.000000 |\n| query end | 0.000003 | 0.000000 | 0.000000 |\n| freeing items | 0.000016 | 0.000000 | 0.000000 |\n| logging slow query | 0.000003 | 0.000000 | 0.000000 |\n| cleaning up | 0.000003 | 0.000000 | 0.000000 |\n+----------------------+----------+----------+------------+\n\nURL: https://mariadb.com/kb/en/show-profile/','','https://mariadb.com/kb/en/show-profile/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (391,26,'SHOW PROFILES','Syntax\n------\n\nSHOW PROFILES\n\nDescription\n-----------\n\nThe SHOW PROFILES statement displays profiling information that indicates\nresource usage for statements executed during the course of the current\nsession. It is used together with SHOW PROFILE.\n\nURL: https://mariadb.com/kb/en/show-profiles/','','https://mariadb.com/kb/en/show-profiles/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (392,26,'SHOW QUERY_RESPONSE_TIME','It is possible to use SHOW QUERY_RESPONSE_TIME as an alternative for\nretrieving information from the QUERY_RESPONSE_TIME plugin.\n\nThis was introduced as part of the Information Schema plugin extension.\n\nURL: https://mariadb.com/kb/en/show-query_response_time/','','https://mariadb.com/kb/en/show-query_response_time/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (393,26,'SHOW STATUS','Syntax\n------\n\nSHOW [GLOBAL | SESSION] STATUS\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW STATUS provides server status information. This information also can be\nobtained using the mysqladmin extended-status command, or by querying the\nInformation Schema GLOBAL_STATUS and SESSION_STATUS tables. The LIKE clause,\nif present, indicates which variable names to match. The WHERE clause can be\ngiven to select rows using more general conditions.\n\nWith the GLOBAL modifier, SHOW STATUS displays the status values for all\nconnections to MariaDB. With SESSION, it displays the status values for the\ncurrent connection. If no modifier is present, the default is SESSION. LOCAL\nis a synonym for SESSION. If you see a lot of 0 values, the reason is probably\nthat you have used SHOW STATUS with a new connection instead of SHOW GLOBAL\nSTATUS.\n\nSome status variables have only a global value. For these, you get the same\nvalue for both GLOBAL and SESSION.\n\nSee Server Status Variables for a full list, scope and description of the\nvariables that can be viewed with SHOW STATUS.\n\nThe LIKE clause, if present on its own, indicates which variable name to match.\n\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nExamples\n--------\n\nFull output from MariaDB 10.1.17:\n\nSHOW GLOBAL STATUS;\n+--------------------------------------------------------------+---------------\n------------------------+\n| Variable_name | Value \n |\n+--------------------------------------------------------------+---------------\n------------------------+\n| Aborted_clients | 0 \n |\n| Aborted_connects | 0 \n |\n| Access_denied_errors | 0 \n |\n| Acl_column_grants | 0 \n |\n| Acl_database_grants | 2 \n |\n| Acl_function_grants | 0 \n |\n| Acl_procedure_grants | 0 \n |\n| Acl_proxy_users | 2 \n |\n| Acl_role_grants | 0 \n |\n| Acl_roles | 0 \n |\n| Acl_table_grants | 0 \n |\n| Acl_users | 6 \n |\n| Aria_pagecache_blocks_not_flushed | 0 \n |\n| Aria_pagecache_blocks_unused | 15706 \n |\n| Aria_pagecache_blocks_used | 0 \n |\n| Aria_pagecache_read_requests | 0 \n |\n| Aria_pagecache_reads | 0 \n |\n| Aria_pagecache_write_requests | 0 \n |\n| Aria_pagecache_writes | 0 \n |\n| Aria_transaction_log_syncs | 0 \n |\n| Binlog_commits | 0 \n |\n| Binlog_group_commits | 0 \n |\n| Binlog_group_commit_trigger_count | 0 \n |\n| Binlog_group_commit_trigger_lock_wait | 0 \n |\n| Binlog_group_commit_trigger_timeout | 0 \n |\n| Binlog_snapshot_file | \n |\n| Binlog_snapshot_position | 0 \n |\n| Binlog_bytes_written | 0 \n |\n| Binlog_cache_disk_use | 0 \n |\n| Binlog_cache_use | 0 \n |\n| Binlog_stmt_cache_disk_use | 0 \n |\n| Binlog_stmt_cache_use | 0 \n |\n| Busy_time | 0.000000 \n |\n| Bytes_received | 432 \n |\n| Bytes_sent | 15183 \n |\n| Com_admin_commands | 1 \n |\n| Com_alter_db | 0 \n |\n| Com_alter_db_upgrade | 0 \n |\n| Com_alter_event | 0 \n |\n| Com_alter_function | 0 \n |\n| Com_alter_procedure | 0 \n |\n| Com_alter_server | 0 \n |\n| Com_alter_table | 0 \n |\n| Com_alter_tablespace | 0 \n |\n| Com_analyze | 0 \n |\n| Com_assign_to_keycache | 0 \n |\n| Com_begin | 0 \n |\n| Com_binlog | 0 \n |\n| Com_call_procedure | 0 \n |\n| Com_change_db | 0 \n |\n| Com_change_master | 0 \n |\n| Com_check | 0 \n |\n| Com_checksum | 0 \n |\n| Com_commit | 0 \n |\n| Com_compound_sql | 0 \n |\n| Com_create_db | 0 \n |\n| Com_create_event | 0 \n |\n| Com_create_function | 0 \n |\n| Com_create_index | 0 \n |\n| Com_create_procedure | 0 \n |\n| Com_create_role | 0 \n |\n| Com_create_server | 0 \n |\n| Com_create_table | 0 \n |\n| Com_create_temporary_table | 0 \n |\n| Com_create_trigger | 0 \n |\n| Com_create_udf | 0 \n |\n| Com_create_user | 0 \n |\n| Com_create_view | 0 \n |\n| Com_dealloc_sql | 0 \n |\n| Com_delete | 0 \n |\n| Com_delete_multi | 0 \n |\n| Com_do | 0 \n |\n| Com_drop_db | 0 \n |\n| Com_drop_event | 0 \n |\n| Com_drop_function | 0 \n |\n| Com_drop_index | 0 \n |\n| Com_drop_procedure | 0 \n |\n| Com_drop_role | 0 \n |\n| Com_drop_server | 0 \n |\n| Com_drop_table | 0 \n |\n| Com_drop_temporary_table | 0 \n |\n| Com_drop_trigger | 0 \n |\n| Com_drop_user | 0 \n |\n| Com_drop_view | 0 \n |\n| Com_empty_query | 0 \n |\n| Com_execute_sql | 0 \n |\n| Com_flush | 0 \n |\n| Com_get_diagnostics | 0 \n |\n| Com_grant | 0 \n |\n| Com_grant_role | 0 \n |\n| Com_ha_close | 0 \n |\n| Com_ha_open | 0 \n |\n| Com_ha_read | 0 \n |\n| Com_help | 0 \n |\n| Com_insert | 0 \n |\n| Com_insert_select | 0 \n |\n| Com_install_plugin | 0 \n |\n| Com_kill | 0 \n |\n| Com_load | 0 \n |\n| Com_lock_tables | 0 \n |\n| Com_optimize | 0 \n |\n| Com_preload_keys | 0 \n |\n| Com_prepare_sql | 0 \n |\n| Com_purge | 0 \n |\n| Com_purge_before_date | 0 \n |\n| Com_release_savepoint | 0 \n |\n| Com_rename_table | 0 \n |\n| Com_rename_user | 0 \n |\n| Com_repair | 0 \n |\n| Com_replace | 0 \n |\n| Com_replace_select | 0 \n |\n| Com_reset | 0 \n |\n| Com_resignal | 0 \n |\n| Com_revoke | 0 \n |\n| Com_revoke_all | 0 \n |\n| Com_revoke_role | 0 \n |\n| Com_rollback | 0 \n |\n| Com_rollback_to_savepoint | 0 \n |\n| Com_savepoint | 0 \n |\n| Com_select | 1 \n |\n| Com_set_option | 0 \n |\n| Com_show_authors | 0 \n |\n| Com_show_binlog_events | 0 \n |\n| Com_show_binlogs | 0 \n |\n| Com_show_charsets | 0 \n |\n| Com_show_collations | 0 \n |\n| Com_show_contributors | 0 \n |\n| Com_show_create_db | 0 \n |\n| Com_show_create_event | 0 \n |\n| Com_show_create_func | 0 \n |\n| Com_show_create_proc | 0 \n |\n| Com_show_create_table | 0 \n |\n| Com_show_create_trigger | 0 \n |\n| Com_show_databases | 0 \n |\n| Com_show_engine_logs | 0 \n |','','https://mariadb.com/kb/en/show-status/');
+update help_topic set description = CONCAT(description, '\n| Com_show_engine_mutex | 0 \n |\n| Com_show_engine_status | 0 \n |\n| Com_show_errors | 0 \n |\n| Com_show_events | 0 \n |\n| Com_show_explain | 0 \n |\n| Com_show_fields | 0 \n |\n| Com_show_function_status | 0 \n |\n| Com_show_generic | 0 \n |\n| Com_show_grants | 0 \n |\n| Com_show_keys | 0 \n |\n| Com_show_master_status | 0 \n |\n| Com_show_open_tables | 0 \n |\n| Com_show_plugins | 0 \n |\n| Com_show_privileges | 0 \n |\n| Com_show_procedure_status | 0 \n |\n| Com_show_processlist | 0 \n |\n| Com_show_profile | 0 \n |\n| Com_show_profiles | 0 \n |\n| Com_show_relaylog_events | 0 \n |\n| Com_show_slave_hosts | 0 \n |\n| Com_show_slave_status | 0 \n |\n| Com_show_status | 2 \n |\n| Com_show_storage_engines | 0 \n |\n| Com_show_table_status | 0 \n |\n| Com_show_tables | 0 \n |\n| Com_show_triggers | 0 \n |\n| Com_show_variables | 0 \n |\n| Com_show_warnings | 0 \n |\n| Com_shutdown | 0 \n |\n| Com_signal | 0 \n |\n| Com_start_all_slaves | 0 \n |\n| Com_start_slave | 0 \n |\n| Com_stmt_close | 0 \n |\n| Com_stmt_execute | 0 \n |\n| Com_stmt_fetch | 0 \n |\n| Com_stmt_prepare | 0 \n |\n| Com_stmt_reprepare | 0 \n |\n| Com_stmt_reset | 0 \n |\n| Com_stmt_send_long_data | 0 \n |\n| Com_stop_all_slaves | 0 \n |\n| Com_stop_slave | 0 \n |\n| Com_truncate | 0 \n |\n| Com_uninstall_plugin | 0 \n |\n| Com_unlock_tables | 0 \n |\n| Com_update | 0 \n |\n| Com_update_multi | 0 \n |\n| Com_xa_commit | 0 \n |\n| Com_xa_end | 0 \n |\n| Com_xa_prepare | 0 \n |\n| Com_xa_recover | 0 \n |\n| Com_xa_rollback | 0 \n |\n| Com_xa_start | 0 \n |\n| Compression | OFF \n |\n| Connection_errors_accept | 0 \n |\n| Connection_errors_internal | 0 \n |\n| Connection_errors_max_connections | 0 \n |\n| Connection_errors_peer_address | 0 \n |\n| Connection_errors_select | 0 \n |\n| Connection_errors_tcpwrap | 0 \n |\n| Connections | 4 \n |\n| Cpu_time | 0.000000 \n |\n| Created_tmp_disk_tables | 0 \n |\n| Created_tmp_files | 6 \n |\n| Created_tmp_tables | 2 \n |\n| Delayed_errors | 0 \n |\n| Delayed_insert_threads | 0 \n |\n| Delayed_writes | 0 \n |\n| Delete_scan | 0 \n |\n| Empty_queries | 0 \n |\n| Executed_events | 0 \n |\n| Executed_triggers | 0 \n |\n| Feature_delay_key_write | 0 \n |\n| Feature_dynamic_columns | 0 \n |\n| Feature_fulltext | 0 \n |\n| Feature_gis | 0 \n |\n| Feature_locale | 0 \n |\n| Feature_subquery | 0 \n |\n| Feature_timezone | 0 \n |\n| Feature_trigger | 0 \n |\n| Feature_xml | 0 \n |\n| Flush_commands | 1 \n |\n| Handler_commit | 1 \n |\n| Handler_delete | 0 \n |\n| Handler_discover | 0 \n |\n| Handler_external_lock | 0 \n |\n| Handler_icp_attempts | 0 \n |\n| Handler_icp_match | 0 \n |\n| Handler_mrr_init | 0 \n |\n| Handler_mrr_key_refills | 0 \n |\n| Handler_mrr_rowid_refills | 0 \n |\n| Handler_prepare | 0 \n |\n| Handler_read_first | 3 \n |\n| Handler_read_key | 0 \n |\n| Handler_read_last | 0 \n |\n| Handler_read_next | 0 \n |\n| Handler_read_prev | 0 \n |\n| Handler_read_retry | 0 \n |\n| Handler_read_rnd | 0 \n |\n| Handler_read_rnd_deleted | 0 \n |\n| Handler_read_rnd_next | 537 \n |\n| Handler_rollback | 0 \n |\n| Handler_savepoint | 0 \n |\n| Handler_savepoint_rollback | 0 \n |\n| Handler_tmp_update | 0 \n |\n| Handler_tmp_write | 516 \n |\n| Handler_update | 0 \n |\n| Handler_write | 0 \n |\n| Innodb_available_undo_logs | 128 \n |\n| Innodb_background_log_sync | 222 \n |\n| Innodb_buffer_pool_bytes_data | 2523136 \n |\n| Innodb_buffer_pool_bytes_dirty | 0 \n |\n| Innodb_buffer_pool_dump_status | Dumping\nbuffer pool(s) not yet started |\n| Innodb_buffer_pool_load_status | Loading\nbuffer pool(s) not yet started |\n| Innodb_buffer_pool_pages_data | 154 \n |\n| Innodb_buffer_pool_pages_dirty | 0 \n |\n| Innodb_buffer_pool_pages_flushed | 1 \n |\n| Innodb_buffer_pool_pages_free | 8037 \n |\n| Innodb_buffer_pool_pages_lru_flushed | 0 \n |\n| Innodb_buffer_pool_pages_made_not_young | 0 \n |\n| Innodb_buffer_pool_pages_made_young | 0 \n |\n| Innodb_buffer_pool_pages_misc | 0 \n |\n| Innodb_buffer_pool_pages_old | 0 \n |\n| Innodb_buffer_pool_pages_total | 8191 \n |\n| Innodb_buffer_pool_read_ahead | 0 \n |\n| Innodb_buffer_pool_read_ahead_evicted | 0 \n |\n| Innodb_buffer_pool_read_ahead_rnd | 0 \n |\n| Innodb_buffer_pool_read_requests | 558 \n |\n| Innodb_buffer_pool_reads | 155 \n |\n| Innodb_buffer_pool_wait_free | 0 \n |\n| Innodb_buffer_pool_write_requests | 1 \n |\n| Innodb_checkpoint_age | 0 \n |\n| Innodb_checkpoint_max_age | 80826164 \n |\n| Innodb_data_fsyncs | 5 \n |\n| Innodb_data_pending_fsyncs | 0 \n |\n| Innodb_data_pending_reads | 0 \n |\n| Innodb_data_pending_writes | 0 \n |\n| Innodb_data_read | 2609664 \n |\n| Innodb_data_reads | 172 \n |\n| Innodb_data_writes | 5 \n |\n| Innodb_data_written | 34304 \n |\n| Innodb_dblwr_pages_written | 1 \n |\n| Innodb_dblwr_writes | 1 \n |\n| Innodb_deadlocks | 0 \n |\n| Innodb_have_atomic_builtins | ON \n |\n| Innodb_history_list_length | 0 \n |\n| Innodb_ibuf_discarded_delete_marks | 0 \n |\n| Innodb_ibuf_discarded_deletes | 0 \n |\n| Innodb_ibuf_discarded_inserts | 0 \n |\n| Innodb_ibuf_free_list | 0 \n |\n| Innodb_ibuf_merged_delete_marks | 0 \n |\n| Innodb_ibuf_merged_deletes | 0 \n |\n| Innodb_ibuf_merged_inserts | 0 \n |\n| Innodb_ibuf_merges | 0 \n |') WHERE help_topic_id = 393;
+update help_topic set description = CONCAT(description, '\n| Innodb_ibuf_segment_size | 2 \n |\n| Innodb_ibuf_size | 1 \n |\n| Innodb_log_waits | 0 \n |\n| Innodb_log_write_requests | 0 \n |\n| Innodb_log_writes | 1 \n |\n| Innodb_lsn_current | 1616829 \n |\n| Innodb_lsn_flushed | 1616829 \n |\n| Innodb_lsn_last_checkpoint | 1616829 \n |\n| Innodb_master_thread_active_loops | 0 \n |\n| Innodb_master_thread_idle_loops | 222 \n |\n| Innodb_max_trx_id | 2308 \n |\n| Innodb_mem_adaptive_hash | 2217568 \n |\n| Innodb_mem_dictionary | 630703 \n |\n| Innodb_mem_total | 140771328 \n |\n| Innodb_mutex_os_waits | 1 \n |\n| Innodb_mutex_spin_rounds | 30 \n |\n| Innodb_mutex_spin_waits | 1 \n |\n| Innodb_oldest_view_low_limit_trx_id | 0 \n |\n| Innodb_os_log_fsyncs | 3 \n |\n| Innodb_os_log_pending_fsyncs | 0 \n |\n| Innodb_os_log_pending_writes | 0 \n |\n| Innodb_os_log_written | 512 \n |\n| Innodb_page_size | 16384 \n |\n| Innodb_pages_created | 0 \n |\n| Innodb_pages_read | 154 \n |\n| Innodb_pages_written | 1 \n |\n| Innodb_purge_trx_id | 0 \n |\n| Innodb_purge_undo_no | 0 \n |\n| Innodb_read_views_memory | 88 \n |\n| Innodb_row_lock_current_waits | 0 \n |\n| Innodb_row_lock_time | 0 \n |\n| Innodb_row_lock_time_avg | 0 \n |\n| Innodb_row_lock_time_max | 0 \n |\n| Innodb_row_lock_waits | 0 \n |\n| Innodb_rows_deleted | 0 \n |\n| Innodb_rows_inserted | 0 \n |\n| Innodb_rows_read | 0 \n |\n| Innodb_rows_updated | 0 \n |\n| Innodb_system_rows_deleted | 0 \n |\n| Innodb_system_rows_inserted | 0 \n |\n| Innodb_system_rows_read | 0 \n |\n| Innodb_system_rows_updated | 0 \n |\n| Innodb_s_lock_os_waits | 2 \n |\n| Innodb_s_lock_spin_rounds | 60 \n |\n| Innodb_s_lock_spin_waits | 2 \n |\n| Innodb_truncated_status_writes | 0 \n |\n| Innodb_x_lock_os_waits | 0 \n |\n| Innodb_x_lock_spin_rounds | 0 \n |\n| Innodb_x_lock_spin_waits | 0 \n |\n| Innodb_page_compression_saved | 0 \n |\n| Innodb_page_compression_trim_sect512 | 0 \n |\n| Innodb_page_compression_trim_sect1024 | 0 \n |\n| Innodb_page_compression_trim_sect2048 | 0 \n |\n| Innodb_page_compression_trim_sect4096 | 0 \n |\n| Innodb_page_compression_trim_sect8192 | 0 \n |\n| Innodb_page_compression_trim_sect16384 | 0 \n |\n| Innodb_page_compression_trim_sect32768 | 0 \n |\n| Innodb_num_index_pages_written | 0 \n |\n| Innodb_num_non_index_pages_written | 5 \n |\n| Innodb_num_pages_page_compressed | 0 \n |\n| Innodb_num_page_compressed_trim_op | 0 \n |\n| Innodb_num_page_compressed_trim_op_saved | 0 \n |\n| Innodb_num_pages_page_decompressed | 0 \n |\n| Innodb_num_pages_page_compression_error | 0 \n |\n| Innodb_num_pages_encrypted | 0 \n |\n| Innodb_num_pages_decrypted | 0 \n |\n| Innodb_have_lz4 | OFF \n |\n| Innodb_have_lzo | OFF \n |\n| Innodb_have_lzma | OFF \n |\n| Innodb_have_bzip2 | OFF \n |\n| Innodb_have_snappy | OFF \n |\n| Innodb_defragment_compression_failures | 0 \n |\n| Innodb_defragment_failures | 0 \n |\n| Innodb_defragment_count | 0 \n |\n| Innodb_onlineddl_rowlog_rows | 0 \n |\n| Innodb_onlineddl_rowlog_pct_used | 0 \n |\n| Innodb_onlineddl_pct_progress | 0 \n |\n| Innodb_secondary_index_triggered_cluster_reads | 0 \n |\n| Innodb_secondary_index_triggered_cluster_reads_avoided | 0 \n |\n| Innodb_encryption_rotation_pages_read_from_cache | 0 \n |\n| Innodb_encryption_rotation_pages_read_from_disk | 0 \n |\n| Innodb_encryption_rotation_pages_modified | 0 \n |\n| Innodb_encryption_rotation_pages_flushed | 0 \n |\n| Innodb_encryption_rotation_estimated_iops | 0 \n |\n| Innodb_scrub_background_page_reorganizations | 0 \n |\n| Innodb_scrub_background_page_splits | 0 \n |\n| Innodb_scrub_background_page_split_failures_underflow | 0 \n |\n| Innodb_scrub_background_page_split_failures_out_of_filespace | 0 \n |\n| Innodb_scrub_background_page_split_failures_missing_index | 0 \n |\n| Innodb_scrub_background_page_split_failures_unknown | 0 \n |\n| Key_blocks_not_flushed | 0 \n |\n| Key_blocks_unused | 107163 \n |\n| Key_blocks_used | 0 \n |\n| Key_blocks_warm | 0 \n |\n| Key_read_requests | 0 \n |\n| Key_reads | 0 \n |\n| Key_write_requests | 0 \n |\n| Key_writes | 0 \n |\n| Last_query_cost | 0.000000 \n |\n| Master_gtid_wait_count | 0 \n |\n| Master_gtid_wait_time | 0 \n |\n| Master_gtid_wait_timeouts | 0 \n |\n| Max_statement_time_exceeded | 0 \n |\n| Max_used_connections | 1 \n |\n| Memory_used | 273614696 \n |\n| Not_flushed_delayed_rows | 0 \n |\n| Open_files | 25 \n |\n| Open_streams | 0 \n |\n| Open_table_definitions | 18 \n |\n| Open_tables | 11 \n |\n| Opened_files | 77 \n |\n| Opened_plugin_libraries | 0 \n |\n| Opened_table_definitions | 18 \n |\n| Opened_tables | 18 \n |\n| Opened_views | 0 \n |\n| Performance_schema_accounts_lost | 0 \n |\n| Performance_schema_cond_classes_lost | 0 \n |\n| Performance_schema_cond_instances_lost | 0 \n |\n| Performance_schema_digest_lost | 0 \n |\n| Performance_schema_file_classes_lost | 0 \n |\n| Performance_schema_file_handles_lost | 0 \n |\n| Performance_schema_file_instances_lost | 0 \n |\n| Performance_schema_hosts_lost | 0 \n |\n| Performance_schema_locker_lost | 0 \n |\n| Performance_schema_mutex_classes_lost | 0 \n |\n| Performance_schema_mutex_instances_lost | 0 \n |\n| Performance_schema_rwlock_classes_lost | 0 \n |\n| Performance_schema_rwlock_instances_lost | 0 \n |\n| Performance_schema_session_connect_attrs_lost | 0 \n |\n| Performance_schema_socket_classes_lost | 0 \n |\n| Performance_schema_socket_instances_lost | 0 \n |\n| Performance_schema_stage_classes_lost | 0 \n |\n| Performance_schema_statement_classes_lost | 0 \n |\n| Performance_schema_table_handles_lost | 0 \n |\n| Performance_schema_table_instances_lost | 0 \n |\n| Performance_schema_thread_classes_lost | 0 \n |\n| Performance_schema_thread_instances_lost | 0 \n |\n| Performance_schema_users_lost | 0 \n |\n| Prepared_stmt_count | 0 \n |\n| Qcache_free_blocks | 1 \n |\n| Qcache_free_memory | 1031336 \n |\n| Qcache_hits | 0 \n |\n| Qcache_inserts | 0 \n |\n| Qcache_lowmem_prunes | 0 \n |\n| Qcache_not_cached | 0 \n |\n| Qcache_queries_in_cache | 0 \n |\n| Qcache_total_blocks | 1 \n |\n| Queries | 4 \n |\n| Questions | 4 \n |\n| Rows_read | 10 \n |\n| Rows_sent | 517 \n |\n| Rows_tmp_read | 516 \n |\n| Rpl_status | AUTH_MASTER \n |') WHERE help_topic_id = 393;
+update help_topic set description = CONCAT(description, '\n| Select_full_join | 0 \n |\n| Select_full_range_join | 0 \n |\n| Select_range | 0 \n |\n| Select_range_check | 0 \n |\n| Select_scan | 2 \n |\n| Slave_connections | 0 \n |\n| Slave_heartbeat_period | 0.000 \n |\n| Slave_open_temp_tables | 0 \n |\n| Slave_received_heartbeats | 0 \n |\n| Slave_retried_transactions | 0 \n |\n| Slave_running | OFF \n |\n| Slave_skipped_errors | 0 \n |\n| Slaves_connected | 0 \n |\n| Slaves_running | 0 \n |\n| Slow_launch_threads | 0 \n |\n| Slow_queries | 0 \n |\n| Sort_merge_passes | 0 \n |\n| Sort_priority_queue_sorts | 0 \n |\n| Sort_range | 0 \n |\n| Sort_rows | 0 \n |\n| Sort_scan | 0 \n |\n| Ssl_accept_renegotiates | 0 \n |\n| Ssl_accepts | 0 \n |\n| Ssl_callback_cache_hits | 0 \n |\n| Ssl_cipher | \n |\n| Ssl_cipher_list | \n |\n| Ssl_client_connects | 0 \n |\n| Ssl_connect_renegotiates | 0 \n |\n| Ssl_ctx_verify_depth | 0 \n |\n| Ssl_ctx_verify_mode | 0 \n |\n| Ssl_default_timeout | 0 \n |\n| Ssl_finished_accepts | 0 \n |\n| Ssl_finished_connects | 0 \n |\n| Ssl_server_not_after | \n |\n| Ssl_server_not_before | \n |\n| Ssl_session_cache_hits | 0 \n |\n| Ssl_session_cache_misses | 0 \n |\n| Ssl_session_cache_mode | NONE \n |\n| Ssl_session_cache_overflows | 0 \n |\n| Ssl_session_cache_size | 0 \n |\n| Ssl_session_cache_timeouts | 0 \n |\n| Ssl_sessions_reused | 0 \n |\n| Ssl_used_session_cache_entries | 0 \n |\n| Ssl_verify_depth | 0 \n |\n| Ssl_verify_mode | 0 \n |\n| Ssl_version | \n |\n| Subquery_cache_hit | 0 \n |\n| Subquery_cache_miss | 0 \n |\n| Syncs | 2 \n |\n| Table_locks_immediate | 21 \n |\n| Table_locks_waited | 0 \n |\n| Tc_log_max_pages_used | 0 \n |\n| Tc_log_page_size | 4096 \n |\n| Tc_log_page_waits | 0 \n |\n| Threadpool_idle_threads | 0 \n |\n| Threadpool_threads | 0 \n |\n| Threads_cached | 0 \n |\n| Threads_connected | 1 \n |\n| Threads_created | 2 \n |\n| Threads_running | 1 \n |\n| Update_scan | 0 \n |\n| Uptime | 223 \n |\n| Uptime_since_flush_status | 223 \n |\n| wsrep_cluster_conf_id |\n18446744073709551615 |\n| wsrep_cluster_size | 0 \n |\n| wsrep_cluster_state_uuid | \n |\n| wsrep_cluster_status | Disconnected \n |\n| wsrep_connected | OFF \n |\n| wsrep_local_bf_aborts | 0 \n |\n| wsrep_local_index |\n18446744073709551615 |\n| wsrep_provider_name | \n |\n| wsrep_provider_vendor | \n |\n| wsrep_provider_version | \n |\n| wsrep_ready | OFF \n |\n| wsrep_thread_count | 0 \n |\n+--------------------------------------------------------------+---------------\n------------------------+\n516 rows in set (0.00 sec)\n\nExample of filtered output:\n\nSHOW STATUS LIKE \'Key%\';\n+------------------------+--------+\n| Variable_name | Value |\n+------------------------+--------+\n| Key_blocks_not_flushed | 0 |\n| Key_blocks_unused | 107163 |\n| Key_blocks_used | 0 |\n| Key_blocks_warm | 0 |\n| Key_read_requests | 0 |\n| Key_reads | 0 |\n| Key_write_requests | 0 |\n| Key_writes | 0 |\n+------------------------+--------+\n8 rows in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/show-status/') WHERE help_topic_id = 393;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (394,26,'SHOW TABLE STATUS','Syntax\n------\n\nSHOW TABLE STATUS [{FROM | IN} db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW TABLE STATUS works like SHOW TABLES, but provides more extensive\ninformation about each non-TEMPORARY table.\n\nThe LIKE clause, if present on its own, indicates which table names to match.\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe following information is returned:\n\n+---------------------------+------------------------------------------------+\n| Column | Description |\n+---------------------------+------------------------------------------------+\n| Name | Table name. |\n+---------------------------+------------------------------------------------+\n| Engine | Table storage engine. |\n+---------------------------+------------------------------------------------+\n| Version | Version number from the table\'s .frm file. |\n+---------------------------+------------------------------------------------+\n| Row_format | Row format (see InnoDB, Aria and MyISAM row |\n| | formats). |\n+---------------------------+------------------------------------------------+\n| Rows | Number of rows in the table. Some engines, |\n| | such as XtraDB and InnoDB may store an |\n| | estimate. |\n+---------------------------+------------------------------------------------+\n| Avg_row_length | Average row length in the table. |\n+---------------------------+------------------------------------------------+\n| Data_length | For InnoDB/XtraDB, the index size, in pages, |\n| | multiplied by the page size. For Aria and |\n| | MyISAM, length of the data file, in bytes. |\n| | For MEMORY, the approximate allocated memory. |\n+---------------------------+------------------------------------------------+\n| Max_data_length | Maximum length of the data file, ie the total |\n| | number of bytes that could be stored in the |\n| | table. Not used in XtraDB and InnoDB. |\n+---------------------------+------------------------------------------------+\n| Index_length | Length of the index file. |\n+---------------------------+------------------------------------------------+\n| Data_free | Bytes allocated but unused. For InnoDB tables |\n| | in a shared tablespace, the free space of the |\n| | shared tablespace with small safety margin. |\n| | An estimate in the case of partitioned tables |\n| | - see the PARTITIONS table. |\n+---------------------------+------------------------------------------------+\n| Auto_increment | Next AUTO_INCREMENT value. |\n+---------------------------+------------------------------------------------+\n| Create_time | Time the table was created. Some engines just |\n| | return the ctime information from the file |\n| | system layer here, in that case the value is |\n| | not necessarily the table creation time but |\n| | rather the time the file system metadata for |\n| | it had last changed. |\n+---------------------------+------------------------------------------------+\n| Update_time | Time the table was last updated. On Windows, |\n| | the timestamp is not updated on update, so |\n| | MyISAM values will be inaccurate. In InnoDB, |\n| | if shared tablespaces are used, will be NULL, |\n| | while buffering can also delay the update, so |\n| | the value will differ from the actual time of |\n| | the last UPDATE, INSERT or DELETE. |\n+---------------------------+------------------------------------------------+\n| Check_time | Time the table was last checked. Not kept by |\n| | all storage engines, in which case will be |\n| | NULL. |\n+---------------------------+------------------------------------------------+\n| Collation | Character set and collation. |\n+---------------------------+------------------------------------------------+\n| Checksum | Live checksum value, if any. |\n+---------------------------+------------------------------------------------+\n| Create_options | Extra CREATE TABLE options. |\n+---------------------------+------------------------------------------------+\n| Comment | Table comment provided when MariaDB created |\n| | the table. |\n+---------------------------+------------------------------------------------+\n| Max_index_length | Maximum index length (supported by MyISAM and |\n| | Aria tables). Added in MariaDB 10.3.5. |\n+---------------------------+------------------------------------------------+\n| Temporary | Placeholder to signal that a table is a |\n| | temporary table. Currently always \"N\", except |\n| | \"Y\" for generated information_schema tables |\n| | and NULL for views. Added in MariaDB 10.3.5. |\n+---------------------------+------------------------------------------------+\n\nSimilar information can be found in the information_schema.TABLES table as\nwell as by using mysqlshow:\n\nmysqlshow --status db_name\n\nViews\n-----\n\nFor views, all columns in SHOW TABLE STATUS are NULL except \'Name\' and\n\'Comment\'\n\nExample\n-------\n\nshow table status\\G\n*************************** 1. row ***************************\n Name: bus_routes\n Engine: InnoDB\n Version: 10\n Row_format: Dynamic\n Rows: 5\n Avg_row_length: 3276\n Data_length: 16384\nMax_data_length: 0\n Index_length: 0\n Data_free: 0\n Auto_increment: NULL\n Create_time: 2017-05-24 11:17:46\n Update_time: NULL\n Check_time: NULL\n Collation: latin1_swedish_ci\n Checksum: NULL\n Create_options: \n Comment:\n\nURL: https://mariadb.com/kb/en/show-table-status/','','https://mariadb.com/kb/en/show-table-status/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (395,26,'SHOW TABLES','Syntax\n------\n\nSHOW [FULL] TABLES [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW TABLES lists the non-TEMPORARY tables, sequences and views in a given\ndatabase.\n\nThe LIKE clause, if present on its own, indicates which table names to match.\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW. For example, when searching for\ntables in the test database, the column name for use in the WHERE and LIKE\nclauses will be Tables_in_test\n\nThe FULL modifier is supported such that SHOW FULL TABLES displays a second\noutput column. Values for the second column, Table_type, are BASE TABLE for a\ntable, VIEW for a view and SEQUENCE for a sequence.\n\nYou can also get this information using:\n\nmysqlshow db_name\n\nSee mysqlshow for more details.\n\nIf you have no privileges for a base table or view, it does not show up in the\noutput from SHOW TABLES or mysqlshow db_name.\n\nThe information_schema.TABLES table, as well as the SHOW TABLE STATUS\nstatement, provide extended information about tables.\n\nExamples\n--------\n\nSHOW TABLES;\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n| t1 |\n| view1 |\n+----------------------+\n\nShowing the tables beginning with a only.\n\nSHOW TABLES WHERE Tables_in_test LIKE \'a%\';\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n+----------------------+\n\nShowing tables and table types:\n\nSHOW FULL TABLES;\n+----------------+------------+\n| Tables_in_test | Table_type |\n+----------------+------------+\n| s1 | SEQUENCE |\n| student | BASE TABLE |\n| v1 | VIEW |\n+----------------+------------+\n\nURL: https://mariadb.com/kb/en/show-tables/','','https://mariadb.com/kb/en/show-tables/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (396,26,'SHOW TABLE_STATISTICS','Syntax\n------\n\nSHOW TABLE_STATISTICS\n\nDescription\n-----------\n\nThe SHOW TABLE_STATISTICS statementis part of the User Statistics feature. It\nwas removed as a separate statement in MariaDB 10.1.1, but effectively\nreplaced by the generic SHOW information_schema_table statement. The\ninformation_schema.TABLE_STATISTICS table shows statistics on table usage\n\nThe userstat system variable must be set to 1 to activate this feature. See\nthe User Statistics and information_schema.TABLE_STATISTICS articles for more\ninformation.\n\nExample\n-------\n\nSHOW TABLE_STATISTICS\\G\n*************************** 1. row ***************************\n Table_schema: mysql\n Table_name: proxies_priv\n Rows_read: 2\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n*************************** 2. row ***************************\n Table_schema: test\n Table_name: employees_example\n Rows_read: 7\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n*************************** 3. row ***************************\n Table_schema: mysql\n Table_name: user\n Rows_read: 16\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n*************************** 4. row ***************************\n Table_schema: mysql\n Table_name: db\n Rows_read: 2\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n\nURL: https://mariadb.com/kb/en/show-table-statistics/','','https://mariadb.com/kb/en/show-table-statistics/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (397,26,'SHOW TRIGGERS','Syntax\n------\n\nSHOW TRIGGERS [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW TRIGGERS lists the triggers currently defined for tables in a database\n(the default database unless a FROM clause is given). This statement requires\nthe TRIGGER privilege (prior to MySQL 5.1.22, it required the SUPER privilege).\n\nThe LIKE clause, if present on its own, indicates which table names to match\nand causes the statement to display triggers for those tables. The WHERE and\nLIKE clauses can be given to select rows using more general conditions, as\ndiscussed in Extended SHOW.\n\nSimilar information is stored in the information_schema.TRIGGERS table.\n\nMariaDB starting with 10.2.3\n----------------------------\nIf there are multiple triggers for the same action, then the triggers are\nshown in action order.\n\nExamples\n--------\n\nFor the trigger defined at Trigger Overview:\n\nSHOW triggers Like \'animals\' \\G\n*************************** 1. row ***************************\n Trigger: the_mooses_are_loose\n Event: INSERT\n Table: animals\n Statement: BEGIN\n IF NEW.name = \'Moose\' THEN\n UPDATE animal_count SET animal_count.animals = animal_count.animals+100;\n ELSE \n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\n END IF;\nEND\n Timing: AFTER\n Created: 2016-09-29 13:53:34.35\n sql_mode:\n Definer: root@localhost\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nListing all triggers associated with a certain table:\n\nSHOW TRIGGERS FROM test WHERE `Table` = \'user\' \\G\n*************************** 1. row ***************************\n Trigger: user_ai\n Event: INSERT\n Table: user\n Statement: BEGIN END\n Timing: AFTER\n Created: 2016-09-29 13:53:34.35\n sql_mode:\n Definer: root@%\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\nSHOW triggers WHERE Event Like \'Insert\' \\G\n*************************** 1. row ***************************\n Trigger: the_mooses_are_loose\n Event: INSERT\n Table: animals\n Statement: BEGIN\n IF NEW.name = \'Moose\' THEN\n UPDATE animal_count SET animal_count.animals = animal_count.animals+100;\n ELSE \n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\n END IF;\nEND\n Timing: AFTER\n Created: 2016-09-29 13:53:34.35\n sql_mode:\n Definer: root@localhost\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n\n* character_set_client is the session value of the character_set_client system\nvariable when the trigger was created. \n* collation_connection is the session value of the collation_connection system\nvariable when the trigger was\n created. \n* Database Collation is the collation of the database \n with which the trigger is associated.\n\nThese columns were added in MariaDB/MySQL 5.1.21.\n\nOld triggers created before MySQL 5.7 and MariaDB 10.2.3 has NULL in the\nCreated column.\n\nURL: https://mariadb.com/kb/en/show-triggers/','','https://mariadb.com/kb/en/show-triggers/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (398,26,'SHOW USER_STATISTICS','Syntax\n------\n\nSHOW USER_STATISTICS\n\nDescription\n-----------\n\nThe SHOW USER_STATISTICS statement is part of the User Statistics feature. It\nwas removed as a separate statement in MariaDB 10.1.1, but effectively\nreplaced by the generic SHOW information_schema_table statement. The\ninformation_schema.USER_STATISTICS table holds statistics about user activity.\nYou can use this table to find out such things as which user is causing the\nmost load and which users are being abusive. You can also use this table to\nmeasure how close to capacity the server may be.\n\nThe userstat system variable must be set to 1 to activate this feature. See\nthe User Statistics and information_schema.USER_STATISTICS table for more\ninformation.\n\nExample\n-------\n\nSHOW USER_STATISTICS\\G\n*************************** 1. row ***************************\n User: root\n Total_connections: 1\nConcurrent_connections: 0\n Connected_time: 3297\n Busy_time: 0.14113400000000006\n Cpu_time: 0.017637000000000003\n Bytes_received: 969\n Bytes_sent: 22355\n Binlog_bytes_written: 0\n Rows_read: 10\n Rows_sent: 67\n Rows_deleted: 0\n Rows_inserted: 0\n Rows_updated: 0\n Select_commands: 7\n Update_commands: 0\n Other_commands: 0\n Commit_transactions: 1\n Rollback_transactions: 0\n Denied_connections: 0\n Lost_connections: 0\n Access_denied: 0\n Empty_queries: 7\n\nURL: https://mariadb.com/kb/en/show-user-statistics/','','https://mariadb.com/kb/en/show-user-statistics/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (399,26,'SHOW VARIABLES','Syntax\n------\n\nSHOW [GLOBAL | SESSION] VARIABLES\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nSHOW VARIABLES shows the values of MariaDB system variables. This information\nalso can be obtained using the mysqladmin variables command. The LIKE clause,\nif present, indicates which variable names to match. The WHERE clause can be\ngiven to select rows using more general conditions.\n\nWith the GLOBAL modifier, SHOW VARIABLES displays the values that are used for\nnew connections to MariaDB. With SESSION, it displays the values that are in\neffect for the current connection. If no modifier is present, the default is\nSESSION. LOCAL is a synonym for SESSION. With a LIKE clause, the statement\ndisplays only rows for those variables with names that match the pattern. To\nobtain the row for a specific variable, use a LIKE clause as shown:\n\nSHOW VARIABLES LIKE \'maria_group_commit\';\nSHOW SESSION VARIABLES LIKE \'maria_group_commit\';\n\nTo get a list of variables whose name match a pattern, use the \"%\" wildcard\ncharacter in a LIKE clause:\n\nSHOW VARIABLES LIKE \'%maria%\';\nSHOW GLOBAL VARIABLES LIKE \'%maria%\';\n\nWildcard characters can be used in any position within the pattern to be\nmatched. Strictly speaking, because \"_\" is a wildcard that matches any single\ncharacter, you should escape it as \"\\_\" to match it literally. In practice,\nthis is rarely necessary.\n\nThe WHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nSee SET for information on setting server system variables.\n\nSee Server System Variables for a list of all the variables that can be set.\n\nYou can also see the server variables by querying the Information Schema\nGLOBAL_VARIABLES and SESSION_VARIABLES tables.\n\nExamples\n--------\n\nSHOW VARIABLES LIKE \'aria%\';\n+------------------------------------------+---------------------+\n| Variable_name | Value |\n+------------------------------------------+---------------------+\n| aria_block_size | 8192 |\n| aria_checkpoint_interval | 30 |\n| aria_checkpoint_log_activity | 1048576 |\n| aria_force_start_after_recovery_failures | 0 |\n| aria_group_commit | none |\n| aria_group_commit_interval | 0 |\n| aria_log_file_size | 1073741824 |\n| aria_log_purge_type | immediate |\n| aria_max_sort_file_size | 9223372036853727232 |\n| aria_page_checksum | ON |\n| aria_pagecache_age_threshold | 300 |\n| aria_pagecache_buffer_size | 134217728 |\n| aria_pagecache_division_limit | 100 |\n| aria_recover | NORMAL |\n| aria_repair_threads | 1 |\n| aria_sort_buffer_size | 134217728 |\n| aria_stats_method | nulls_unequal |\n| aria_sync_log_dir | NEWFILE |\n| aria_used_for_temp_tables | ON |\n+------------------------------------------+---------------------+\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'max_error_count\' OR\n VARIABLE_NAME LIKE \'innodb_sync_spin_loops\';\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 64 | 64 |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n\nSET GLOBAL max_error_count=128;\n\nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'max_error_count\' OR\n VARIABLE_NAME LIKE \'innodb_sync_spin_loops\';\n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 64 | 128 |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n\nSET GLOBAL max_error_count=128;\n\nSHOW VARIABLES LIKE \'max_error_count\';\n+-----------------+-------+\n| Variable_name | Value |\n+-----------------+-------+\n| max_error_count | 64 |\n+-----------------+-------+\n\nSHOW GLOBAL VARIABLES LIKE \'max_error_count\';\n+-----------------+-------+\n| Variable_name | Value |\n+-----------------+-------+\n| max_error_count | 128 |\n+-----------------+-------+\n\nBecause the following variable only has a global scope, the global value is\nreturned even when specifying SESSION (in this case by default):\n\nSHOW VARIABLES LIKE \'innodb_sync_spin_loops\';\n+------------------------+-------+\n| Variable_name | Value |\n+------------------------+-------+\n| innodb_sync_spin_loops | 30 |\n+------------------------+-------+\n\nURL: https://mariadb.com/kb/en/show-variables/','','https://mariadb.com/kb/en/show-variables/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (400,26,'SHOW WARNINGS','Syntax\n------\n\nSHOW WARNINGS [LIMIT [offset,] row_count]\nSHOW ERRORS [LIMIT row_count OFFSET offset]\nSHOW COUNT(*) WARNINGS\n\nDescription\n-----------\n\nSHOW WARNINGS shows the error, warning, and note messages that resulted from\nthe last statement that generated messages in the current session. It shows\nnothing if the last statement used a table and generated no messages. (That\nis, a statement that uses a table but generates no messages clears the message\nlist.) Statements that do not use tables and do not generate messages have no\neffect on the message list.\n\nA note is different to a warning in that it only appears if the sql_notes\nvariable is set to 1 (the default), and is not converted to an error if strict\nmode is enabled.\n\nA related statement, SHOW ERRORS, shows only the errors.\n\nThe SHOW COUNT(*) WARNINGS statement displays the total number of errors,\nwarnings, and notes. You can also retrieve this number from the warning_count\nvariable:\n\nSHOW COUNT(*) WARNINGS;\nSELECT @@warning_count;\n\nThe value of warning_count might be greater than the number of messages\ndisplayed by SHOW WARNINGS if the max_error_count system variable is set so\nlow that not all messages are stored.\n\nThe LIMIT clause has the same syntax as for the SELECT statement.\n\nSHOW WARNINGS can be used after EXPLAIN EXTENDED to see how a query is\ninternally rewritten by MariaDB.\n\nIf the sql_notes server variable is set to 1, Notes are included in the output\nof SHOW WARNINGS; if it is set to 0, this statement will not show (or count)\nNotes.\n\nThe results of SHOW WARNINGS and SHOW COUNT(*) WARNINGS are directly sent to\nthe client. If you need to access those information in a stored program, you\ncan use the GET DIAGNOSTICS statement instead.\n\nFor a list of MariaDB error codes, see MariaDB Error Codes.\n\nThe mysql client also has a number of options related to warnings. The \\W\ncommand will show warnings after every statement, while \\w will disable this.\nStarting the client with the --show-warnings option will show warnings after\nevery statement.\n\nMariaDB 10.3.1 implements a stored routine error stack trace. SHOW WARNINGS\ncan also be used to show more information. See the example below.\n\nExamples\n--------\n\nSELECT 1/0;\n+------+\n| 1/0 |\n+------+\n| NULL |\n+------+\n\nSHOW COUNT(*) WARNINGS;\n+-------------------------+\n| @@session.warning_count |\n+-------------------------+\n| 1 |\n+-------------------------+\n\nSHOW WARNINGS;\n+---------+------+---------------+\n| Level | Code | Message |\n+---------+------+---------------+\n| Warning | 1365 | Division by 0 |\n+---------+------+---------------+\n\nStack Trace\n-----------\n\nFrom MariaDB 10.3.1, displaying a stack trace:\n\nDELIMITER $$\nCREATE OR REPLACE PROCEDURE p1()\n BEGIN\n DECLARE c CURSOR FOR SELECT * FROM not_existing;\n OPEN c;\n CLOSE c;\n END;\n$$\nCREATE OR REPLACE PROCEDURE p2()\n BEGIN\n CALL p1;\n END;\n$$\nDELIMITER ;\nCALL p2;\nERROR 1146 (42S02): Table \'test.not_existing\' doesn\'t exist\n\nSHOW WARNINGS;\n+-------+------+-----------------------------------------+\n| Level | Code | Message |\n+-------+------+-----------------------------------------+\n| Error | 1146 | Table \'test.not_existing\' doesn\'t exist |\n| Note | 4091 | At line 6 in test.p1 |\n| Note | 4091 | At line 4 in test.p2 |\n+-------+------+-----------------------------------------+\n\nSHOW WARNINGS displays a stack trace, showing where the error actually\nhappened:\n\n* Line 4 in test.p1 is the OPEN command which actually raised the error\n* Line 3 in test.p2 is the CALL statement, calling p1 from p2.\n\nURL: https://mariadb.com/kb/en/show-warnings/','','https://mariadb.com/kb/en/show-warnings/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (401,26,'SHOW WSREP_MEMBERSHIP','SHOW WSREP_MEMBERSHIP is part of the WSREP_INFO plugin.\n\nSyntax\n------\n\nSHOW WSREP_MEMBERSHIP\n\nDescription\n-----------\n\nThe SHOW WSREP_MEMBERSHIP statement returns Galera node cluster membership\ninformation. It returns the same information as found in the\ninformation_schema.WSREP_MEMBERSHIP table. Only users with the SUPER privilege\ncan access this information.\n\nExamples\n--------\n\nSHOW WSREP_MEMBERSHIP;\n+-------+--------------------------------------+----------+-----------------+\n| Index | Uuid | Name | Address |\n+-------+--------------------------------------+----------+-----------------+\n| 0 | 19058073-8940-11e4-8570-16af7bf8fced | my_node1 | 10.0.2.15:16001 |\n| 1 | 19f2b0e0-8942-11e4-9cb8-b39e8ee0b5dd | my_node3 | 10.0.2.15:16003 |\n| 2 | d85e62db-8941-11e4-b1ef-4bc9980e476d | my_node2 | 10.0.2.15:16002 |\n+-------+--------------------------------------+----------+-----------------+\n\nURL: https://mariadb.com/kb/en/show-wsrep_membership/','','https://mariadb.com/kb/en/show-wsrep_membership/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (402,26,'SHOW WSREP_STATUS','SHOW WSREP_STATUS is part of the WSREP_INFO plugin.\n\nSyntax\n------\n\nSHOW WSREP_STATUS\n\nDescription\n-----------\n\nThe SHOW WSREP_STATUS statement returns Galera node and cluster status\ninformation. It returns the same information as found in the\ninformation_schema.WSREP_STATUS table. Only users with the SUPER privilege can\naccess this information.\n\nExamples\n--------\n\nSHOW WSREP_STATUS;\n+------------+-------------+----------------+--------------+\n| Node_Index | Node_Status | Cluster_Status | Cluster_Size |\n+------------+-------------+----------------+--------------+\n| 0 | Synced | Primary | 3 |\n+------------+-------------+----------------+--------------+\n\nURL: https://mariadb.com/kb/en/show-wsrep_status/','','https://mariadb.com/kb/en/show-wsrep_status/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (403,26,'BINLOG','Syntax\n------\n\nBINLOG \'str\'\n\nDescription\n-----------\n\nBINLOG is an internal-use statement. It is generated by the\nmariadb-binlog/mysqlbinlog program as the printable representation of certain\nevents in binary log files. The \'str\' value is a base 64-encoded string the\nthat server decodes to determine the data change indicated by the\ncorresponding event. This statement requires the SUPER privilege (<= MariaDB\n10.5.1) or theBINLOG REPLAY privilege (>= MariaDB 10.5.2).\n\nURL: https://mariadb.com/kb/en/binlog/','','https://mariadb.com/kb/en/binlog/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (404,26,'PURGE BINARY LOGS','Syntax\n------\n\nPURGE { BINARY | MASTER } LOGS\n { TO \'log_name\' | BEFORE datetime_expr }\n\nDescription\n-----------\n\nThe PURGE BINARY LOGS statement deletes all the binary log files listed in the\nlog index file prior to the specified log file name or date. BINARY and MASTER\nare synonyms. Deleted log files also are removed from the list recorded in the\nindex file, so that the given log file becomes the first in the list.\n\nThe datetime expression is in the format \'YYYY-MM-DD hh:mm:ss\'.\n\nIf a replica is active but has yet to read from a binary log file you attempt\nto delete, the statement will fail with an error. However, if the replica is\nnot connected and has yet to read from a log file you delete, the file will be\ndeleted, but the replica will be unable to continue replicating once it\nconnects again.\n\nThis statement has no effect if the server was not started with the --log-bin\noption to enable binary logging.\n\nTo list the binary log files on the server, use SHOW BINARY LOGS. To see which\nfiles they are reading, use SHOW SLAVE STATUS (or SHOW REPLICA STATUS from\nMariaDB 10.5.1). You can only delete the files that are older than the oldest\nfile that is used by the slaves.\n\nTo delete all binary log files, use RESET MASTER. To move to a new log file\n(for example if you want to remove the current log file), use FLUSH LOGS\nbefore you execute PURGE LOGS.\n\nIf the expire_logs_days server system variable is not set to 0, the server\nautomatically deletes binary log files after the given number of days. From\nMariaDB 10.6, the binlog_expire_logs_seconds variable allows more precise\ncontrol over binlog deletion, and takes precedence if both are non-zero.\n\nRequires the SUPER privilege or, from MariaDB 10.5.2, the BINLOG ADMIN\nprivilege, to run.\n\nExamples\n--------\n\nPURGE BINARY LOGS TO \'mariadb-bin.000063\';\n\nPURGE BINARY LOGS BEFORE \'2013-04-21\';\n\nPURGE BINARY LOGS BEFORE \'2013-04-22 09:55:22\';\n\nURL: https://mariadb.com/kb/en/purge-binary-logs/','','https://mariadb.com/kb/en/purge-binary-logs/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (405,26,'CACHE INDEX','Syntax\n------\n\nCACHE INDEX \n tbl_index_list [, tbl_index_list] ...\n IN key_cache_name\n\ntbl_index_list:\n tbl_name [[INDEX|KEY] (index_name[, index_name] ...)]\n\nDescription\n-----------\n\nThe CACHE INDEX statement assigns table indexes to a specific key cache. It is\nused only for MyISAM tables.\n\nA default key cache exists and cannot be destroyed. To create more key caches,\nthe key_buffer_size server system variable.\n\nThe associations between tables indexes and key caches are lost on server\nrestart. To recreate them automatically, it is necessary to configure caches\nin a configuration file and include some CACHE INDEX (and optionally LOAD\nINDEX) statements in the init file.\n\nExamples\n--------\n\nThe following statement assigns indexes from the tables t1, t2, and t3 to the\nkey cache named hot_cache:\n\nCACHE INDEX t1, t2, t3 IN hot_cache;\n+---------+--------------------+----------+----------+\n| Table | Op | Msg_type | Msg_text |\n+---------+--------------------+----------+----------+\n| test.t1 | assign_to_keycache | status | OK |\n| test.t2 | assign_to_keycache | status | OK |\n| test.t3 | assign_to_keycache | status | OK |\n+---------+--------------------+----------+----------+\n\nImplementation (for MyISAM)\n---------------------------\n\nNormally CACHE INDEX should not take a long time to execute. Internally it\'s\nimplemented the following way:\n\n* Find the right key cache (under LOCK_global_system_variables)\n* Open the table with a TL_READ_NO_INSERT lock.\n* Flush the original key cache for the given file (under key cache lock)\n* Flush the new key cache for the given file (safety)\n* Move the file to the new key cache (under file share lock)\n\nThe only possible long operations are getting the locks for the table and\nflushing the original key cache, if there were many key blocks for the file in\nit.\n\nWe plan to also add CACHE INDEX for Aria tables if there is a need for this.\n\nURL: https://mariadb.com/kb/en/cache-index/','','https://mariadb.com/kb/en/cache-index/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (406,26,'HELP Command','Syntax\n------\n\nHELP search_string\n\nDescription\n-----------\n\nThe HELP command can be used in any MariaDB client, such as the mysql\ncommand-line client, to get basic syntax help and a short description for most\ncommands and functions.\n\nIf you provide an argument to the HELP command, the mysql client uses it as a\nsearch string to access server-side help. The proper operation of this command\nrequires that the help tables in the mysql database be initialized with help\ntopic information.\n\nIf there is no match for the search string, the search fails. Use HELP\ncontents to see a list of the help categories:\n\nHELP contents\nYou asked for help about help category: \"Contents\"\nFor more information, type \'help <item>\', where <item> is one of the following\ncategories:\n Account Management\n Administration\n Compound Statements\n Data Definition\n Data Manipulation\n Data Types\n Functions\n Functions and Modifiers for Use with GROUP BY\n Geographic Features\n Help Metadata\n Language Structure\n Plugins\n Procedures\n Sequences\n Table Maintenance\n Transactions\n User-Defined Functions\n Utility\n\nIf a search string matches multiple items, MariaDB shows a list of matching\ntopics:\n\nHELP drop\nMany help items for your request exist.\nTo make a more specific request, please type \'help <item>\',\nwhere <item> is one of the following\ntopics:\n ALTER TABLE\n DROP DATABASE\n DROP EVENT\n DROP FUNCTION\n DROP FUNCTION UDF\n DROP INDEX\n DROP PACKAGE\n DROP PACKAGE BODY\n DROP PROCEDURE\n DROP ROLE\n DROP SEQUENCE\n DROP SERVER\n DROP TABLE\n DROP TRIGGER\n DROP USER\n DROP VIEW\n\nThen you can enter a topic as the search string to see the help entry for that\ntopic.\n\nThe help is provided with the MariaDB server and makes use of four help tables\nfound in the mysql database: help_relation, help_topic, help_category and\nhelp_keyword. These tables are populated by the mysql_install_db or\nfill_help_table.sql scripts which, until MariaDB 10.4.7, contain data\ngenerated from an old version of MySQL.\n\nURL: https://mariadb.com/kb/en/help-command/','','https://mariadb.com/kb/en/help-command/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (407,26,'KILL [CONNECTION | QUERY]','Syntax\n------\n\nKILL [HARD | SOFT] { {CONNECTION|QUERY} thread_id | QUERY ID query_id | USER\nuser_name }\n\nDescription\n-----------\n\nEach connection to mysqld runs in a separate thread. You can see which threads\nare running with the SHOW PROCESSLIST statement and kill a thread with the\nKILL thread_id statement. KILL allows the optional CONNECTION or QUERY\nmodifier:\n\n* KILL CONNECTION is the same as KILL with no\n modifier: It terminates the connection associated with the given thread or\nquery id.\n* KILL QUERY terminates the statement that the connection thread_id is\n currently executing, but leaves the connection itself intact.\n* KILL QUERY ID terminates the query by query_id, leaving the connection\nintact.\n\nIf a connection is terminated that has an active transaction, the transaction\nwill be rolled back. If only a query is killed, the current transaction will\nstay active. See also idle_transaction_timeout.\n\nIf you have the PROCESS privilege, you can see all threads. If you have the\nSUPER privilege, or, from MariaDB 10.5.2, the CONNECTION ADMIN privilege, you\ncan kill all threads and statements. Otherwise, you can see and kill only your\nown threads and statements.\n\nKilling queries that repair or create indexes on MyISAM and Aria tables may\nresult in corrupted tables. Use the SOFT option to avoid this!\n\nThe HARD option (default) kills a command as soon as possible. If you use\nSOFT, then critical operations that may leave a table in an inconsistent state\nwill not be interrupted. Such operations include REPAIR and INDEX creation for\nMyISAM and Aria tables (REPAIR TABLE, OPTIMIZE TABLE).\n\nKILL ... USER username will kill all connections/queries for a given user.\nUSER can be specified one of the following ways:\n\n* username (Kill without regard to hostname)\n* username@hostname\n* CURRENT_USER or CURRENT_USER()\n\nIf you specify a thread id and that thread does not exist, you get the\nfollowing error:\n\nERROR 1094 (HY000): Unknown thread id: <thread_id>\n\nIf you specify a query id that doesn\'t exist, you get the following error:\n\nERROR 1957 (HY000): Unknown query id: <query_id>\n\nHowever, if you specify a user name, no error is issued for non-connected (or\neven non-existing) users. To check if the connection/query has been killed,\nyou can use the ROW_COUNT() function.\n\nA client whose connection is killed receives the following error:\n\nERROR 1317 (70100): Query execution was interrupted\n\nTo obtain a list of existing sessions, use the SHOW PROCESSLIST statement or\nquery the Information Schema PROCESSLIST table.\n\nNote: You cannot use KILL with the Embedded MySQL Server library because the\nembedded server merely runs inside the threads of the host application. It\ndoes not create any connection threads of its own.\n\nNote: You can also use mysqladmin kill thread_id [,thread_id...] to kill\nconnections. To get a list of running queries, use mysqladmin processlist. See\nmysqladmin.\n\nPercona Toolkit contains a program, pt-kill that can be used to automatically\nkill connections that match certain criteria. For example, it can be used to\nterminate idle connections, or connections that have been busy for more than\n60 seconds.\n\nURL: https://mariadb.com/kb/en/kill/','','https://mariadb.com/kb/en/kill/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (408,26,'LOAD INDEX','Syntax\n------\n\nLOAD INDEX INTO CACHE\n tbl_index_list [, tbl_index_list] ...\n\ntbl_index_list:\n tbl_name\n [[INDEX|KEY] (index_name[, index_name] ...)]\n [IGNORE LEAVES]\n\nDescription\n-----------\n\nThe LOAD INDEX INTO CACHE statement preloads a table index into the key cache\nto which it has been assigned by an explicit CACHE INDEX statement, or into\nthe default key cache otherwise. LOAD INDEX INTO CACHE is used only for MyISAM\nor Aria tables.\n\nThe IGNORE LEAVES modifier causes only blocks for the nonleaf nodes of the\nindex to be preloaded.\n\nURL: https://mariadb.com/kb/en/load-index/','','https://mariadb.com/kb/en/load-index/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (409,26,'RESET','Syntax\n------\n\nRESET reset_option [, reset_option] ...\n\nDescription\n-----------\n\nThe RESET statement is used to clear the state of various server operations.\nYou must have the RELOAD privilege to execute RESET.\n\nRESET acts as a stronger version of the FLUSH statement.\n\nThe different RESET options are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| SLAVE | Deletes all relay logs from the slave and |\n| [\"connection_name\"] [ALL] | reset the replication position in the master |\n| | binary log. |\n+---------------------------+------------------------------------------------+\n| MASTER | Deletes all old binary logs, makes the binary |\n| | index file (--log-bin-index) empty and |\n| | creates a new binary log file. This is |\n| | useful when you want to reset the master to |\n| | an initial state. If you want to just delete |\n| | old, not used binary logs, you should use the |\n| | PURGE BINARY LOGS command. |\n+---------------------------+------------------------------------------------+\n| QUERY CACHE | Removes all queries from the query cache. See |\n| | also FLUSH QUERY CACHE. |\n+---------------------------+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/reset/','','https://mariadb.com/kb/en/reset/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (410,26,'SHUTDOWN','Syntax\n------\n\nSHUTDOWN [WAIT FOR ALL { SLAVES | REPLICAS } ]\n\nDescription\n-----------\n\nThe SHUTDOWN command shuts the server down.\n\nWAIT FOR ALL SLAVES\n-------------------\n\nMariaDB starting with 10.4.4\n----------------------------\nThe WAIT FOR ALL SLAVES option was first added in MariaDB 10.4.4. WAIT FOR ALL\nREPLICAS has been a synonym since MariaDB 10.5.1.\n\nWhen a master server is shutdown and it goes through the normal shutdown\nprocess, the master kills client threads in random order. By default, the\nmaster also considers its binary log dump threads to be regular client\nthreads. As a consequence, the binary log dump threads can be killed while\nclient threads still exist, and this means that data can be written on the\nmaster during a normal shutdown that won\'t be replicated. This is true even if\nsemi-synchronous replication is being used.\n\nIn MariaDB 10.4 and later, this problem can be solved by shutting down the\nserver with the SHUTDOWN command and by providing the WAIT FOR ALL SLAVES\noption to the command. For example:\n\nSHUTDOWN WAIT FOR ALL SLAVES;\n\nWhen the WAIT FOR ALL SLAVES option is provided, the server only kills its\nbinary log dump threads after all client threads have been killed, and it only\ncompletes the shutdown after the last binary log has been sent to all\nconnected replicas.\n\nSee Replication Threads: Binary Log Dump Threads and the Shutdown Process for\nmore information.\n\nRequired Permissions\n--------------------\n\nOne must have a SHUTDOWN privilege (see GRANT) to use this command. It is the\nsame privilege one needs to use the mariadb-admin/mysqladmin shutdown command.\n\nShutdown for Upgrades\n---------------------\n\nIf you are doing a shutdown to migrate to another major version of MariaDB,\nplease ensure that the innodb_fast_shutdown variable is not 2 (fast crash\nshutdown). The default of this variable is 1.\n\nExample\n-------\n\nThe following example shows how to create an event which turns off the server\nat a certain time:\n\nCREATE EVENT `test`.`shutd`\n ON SCHEDULE\n EVERY 1 DAY\n STARTS \'2014-01-01 20:00:00\'\n COMMENT \'Shutdown Maria when the office is closed\'\nDO BEGIN\n SHUTDOWN;\nEND;\n\nOther Ways to Stop mysqld\n-------------------------\n\nYou can use the mariadb-admin/mysqladmin shutdown command to take down mysqld\ncleanly.\n\nYou can also use the system kill command on Unix with signal SIGTERM (15)\n\nkill -SIGTERM pid-of-mysqld-process\n\nYou can find the process number of the server process in the file that ends\nwith .pid in your data directory.\n\nThe above is identical to mysqladmin shutdown.\n\nOn windows you should use:\n\nNET STOP MySQL\n\nURL: https://mariadb.com/kb/en/shutdown/','','https://mariadb.com/kb/en/shutdown/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (411,26,'USE','Syntax\n------\n\nUSE db_name\n\nDescription\n-----------\n\nThe \'USE db_name\' statement tells MariaDB to use the db_name database as the\ndefault (current) database for subsequent statements. The database remains the\ndefault until the end of the session or another USE statement is issued:\n\nUSE db1;\nSELECT COUNT(*) FROM mytable; # selects from db1.mytable\nUSE db2;\nSELECT COUNT(*) FROM mytable; # selects from db2.mytable\n\nThe DATABASE() function (SCHEMA() is a synonym) returns the default database.\n\nAnother way to set the default database is specifying its name at mysql\ncommand line client startup.\n\nURL: https://mariadb.com/kb/en/use/','','https://mariadb.com/kb/en/use/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (412,26,'SHOW FUNCTION CODE','Syntax\n------\n\nSHOW FUNCTION CODE func_name\n\nDescription\n-----------\n\nSHOW FUNCTION CODE shows a representation of the internal implementation of\nthe stored function.\n\nIt is similar to SHOW PROCEDURE CODE but for stored functions.\n\nURL: https://mariadb.com/kb/en/show-function-code/','','https://mariadb.com/kb/en/show-function-code/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (413,26,'SHOW COLLATION','Syntax\n------\n\nSHOW COLLATION\n [LIKE \'pattern\' | WHERE expr]\n\nDescription\n-----------\n\nThe output from SHOW COLLATION includes all available collations. The LIKE\nclause, if present on its own, indicates which collation names to match. The\nWHERE and LIKE clauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n\nThe same information can be queried from the Information Schema COLLATIONS\ntable.\n\nSee Setting Character Sets and Collations for details on specifying the\ncollation at the server, database, table and column levels.\n\nExamples\n--------\n\nSHOW COLLATION LIKE \'latin1%\';\n+-------------------+---------+----+---------+----------+---------+\n| Collation | Charset | Id | Default | Compiled | Sortlen |\n+-------------------+---------+----+---------+----------+---------+\n| latin1_german1_ci | latin1 | 5 | | Yes | 1 |\n| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |\n| latin1_danish_ci | latin1 | 15 | | Yes | 1 |\n| latin1_german2_ci | latin1 | 31 | | Yes | 2 |\n| latin1_bin | latin1 | 47 | | Yes | 1 |\n| latin1_general_ci | latin1 | 48 | | Yes | 1 |\n| latin1_general_cs | latin1 | 49 | | Yes | 1 |\n| latin1_spanish_ci | latin1 | 94 | | Yes | 1 |\n+-------------------+---------+----+---------+----------+---------+\n\nSHOW COLLATION WHERE Sortlen LIKE \'8\' AND Charset LIKE \'utf8\';\n+--------------------+---------+-----+---------+----------+---------+\n| Collation | Charset | Id | Default | Compiled | Sortlen |\n+--------------------+---------+-----+---------+----------+---------+\n| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |\n| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |\n| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |\n| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |\n| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |\n| utf8_polish_ci | utf8 | 197 | | Yes | 8 |\n| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |\n| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |\n| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |\n| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |\n| utf8_czech_ci | utf8 | 202 | | Yes | 8 |\n| utf8_danish_ci | utf8 | 203 | | Yes | 8 |\n| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |\n| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |\n| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |\n| utf8_roman_ci | utf8 | 207 | | Yes | 8 |\n| utf8_persian_ci | utf8 | 208 | | Yes | 8 |\n| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |\n| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |\n| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |\n| utf8_croatian_ci | utf8 | 213 | | Yes | 8 |\n+--------------------+---------+-----+---------+----------+---------+\n\nURL: https://mariadb.com/kb/en/show-collation/','','https://mariadb.com/kb/en/show-collation/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (414,27,'DELETE','Syntax\n------\n\nSingle-table syntax:\n\nDELETE [LOW_PRIORITY] [QUICK] [IGNORE] \n FROM tbl_name [PARTITION (partition_list)]\n [FOR PORTION OF period FROM expr1 TO expr2]\n [WHERE where_condition]\n [ORDER BY ...]\n [LIMIT row_count]\n [RETURNING select_expr\n [, select_expr ...]]\n\nMultiple-table syntax:\n\nDELETE [LOW_PRIORITY] [QUICK] [IGNORE]\n tbl_name[.*] [, tbl_name[.*]] ...\n FROM table_references\n [WHERE where_condition]\n\nOr:\n\nDELETE [LOW_PRIORITY] [QUICK] [IGNORE]\n FROM tbl_name[.*] [, tbl_name[.*]] ...\n USING table_references\n [WHERE where_condition]\n\nTrimming history:\n\nDELETE HISTORY\n FROM tbl_name [PARTITION (partition_list)]\n [BEFORE SYSTEM_TIME [TIMESTAMP|TRANSACTION] expression]\n\nDescription\n-----------\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| LOW_PRIORITY | Wait until all SELECT\'s are done before |\n| | starting the statement. Used with storage |\n| | engines that uses table locking (MyISAM, Aria |\n| | etc). See HIGH_PRIORITY and LOW_PRIORITY |\n| | clauses for details. |\n+---------------------------+------------------------------------------------+\n| QUICK | Signal the storage engine that it should |\n| | expect that a lot of rows are deleted. The |\n| | storage engine engine can do things to speed |\n| | up the DELETE like ignoring merging of data |\n| | blocks until all rows are deleted from the |\n| | block (instead of when a block is half full). |\n| | This speeds up things at the expanse of lost |\n| | space in data blocks. At least MyISAM and |\n| | Aria support this feature. |\n+---------------------------+------------------------------------------------+\n| IGNORE | Don\'t stop the query even if a not-critical |\n| | error occurs (like data overflow). See How |\n| | IGNORE works for a full description. |\n+---------------------------+------------------------------------------------+\n\nFor the single-table syntax, the DELETE statement deletes rows from tbl_name\nand returns a count of the number of deleted rows. This count can be obtained\nby calling the ROW_COUNT() function. The WHERE clause, if given, specifies the\nconditions that identify which rows to delete. With no WHERE clause, all rows\nare deleted. If the ORDER BY clause is specified, the rows are deleted in the\norder that is specified. The LIMIT clause places a limit on the number of rows\nthat can be deleted.\n\nFor the multiple-table syntax, DELETE deletes from each tbl_name the rows that\nsatisfy the conditions. In this case, ORDER BY and LIMIT> cannot be used. A\nDELETE can also reference tables which are located in different databases; see\nIdentifier Qualifiers for the syntax.\n\nwhere_condition is an expression that evaluates to true for each row to be\ndeleted. It is specified as described in SELECT.\n\nCurrently, you cannot delete from a table and select from the same table in a\nsubquery.\n\nYou need the DELETE privilege on a table to delete rows from it. You need only\nthe SELECT privilege for any columns that are only read, such as those named\nin the WHERE clause. See GRANT.\n\nAs stated, a DELETE statement with no WHERE clause deletes all rows. A faster\nway to do this, when you do not need to know the number of deleted rows, is to\nuse TRUNCATE TABLE. However, within a transaction or if you have a lock on the\ntable, TRUNCATE TABLE cannot be used whereas DELETE can. See TRUNCATE TABLE,\nand LOCK.\n\nPARTITION\n---------\n\nSee Partition Pruning and Selection for details.\n\nFOR PORTION OF\n--------------\n\nMariaDB starting with 10.4.3\n----------------------------\nSee Application Time Periods - Deletion by Portion.\n\nRETURNING\n---------\n\nIt is possible to return a resultset of the deleted rows for a single table to\nthe client by using the syntax DELETE ... RETURNING select_expr [,\nselect_expr2 ...]]\n\nAny of SQL expression that can be calculated from a single row fields is\nallowed. Subqueries are allowed. The AS keyword is allowed, so it is possible\nto use aliases.\n\nThe use of aggregate functions is not allowed. RETURNING cannot be used in\nmulti-table DELETEs.\n\nMariaDB starting with 10.3.1\n----------------------------\n\nSame Source and Target Table\n----------------------------\n\nUntil MariaDB 10.3.1, deleting from a table with the same source and target\nwas not possible. From MariaDB 10.3.1, this is now possible. For example:\n\nDELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE b.c2=0);\n\nMariaDB starting with 10.3.4\n----------------------------\n\nDELETE HISTORY\n--------------\n\nOne can use DELETE HISTORY to delete historical information from\nSystem-versioned tables.\n\nExamples\n--------\n\nHow to use the ORDER BY and LIMIT clauses:\n\nDELETE FROM page_hit ORDER BY timestamp LIMIT 1000000;\n\nHow to use the RETURNING clause:\n\nDELETE FROM t RETURNING f1;\n+------+\n| f1 |\n+------+\n| 5 |\n| 50 |\n| 500 |\n+------+\n\nThe following statement joins two tables: one is only used to satisfy a WHERE\ncondition, but no row is deleted from it; rows from the other table are\ndeleted, instead.\n\nDELETE post FROM blog INNER JOIN post WHERE blog.id = post.blog_id;\n\nDeleting from the Same Source and Target\n----------------------------------------\n\nCREATE TABLE t1 (c1 INT, c2 INT);\nDELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE b.c2=0);\n\nUntil MariaDB 10.3.1, this returned:\n\nERROR 1093 (HY000): Table \'t1\' is specified twice, both as a target for\n\'DELETE\' \n and as a separate source for\n\nFrom MariaDB 10.3.1:\n\nQuery OK, 0 rows affected (0.00 sec)\n\nURL: https://mariadb.com/kb/en/delete/','','https://mariadb.com/kb/en/delete/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (415,27,'REPLACE','Syntax\n------\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n[RETURNING select_expr \n [, select_expr ...]]\n\nOr:\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n[RETURNING select_expr \n [, select_expr ...]]\n\nOr:\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n[RETURNING select_expr \n [, select_expr ...]]\n\nDescription\n-----------\n\nREPLACE works exactly like INSERT, except that if an old row in the table has\nthe same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row\nis deleted before the new row is inserted. If the table has more than one\nUNIQUE keys, it is possible that the new row conflicts with more than one row.\nIn this case, all conflicting rows will be deleted.\n\nThe table name can be specified in the form db_name.tbl_name or, if a default\ndatabase is selected, in the form tbl_name (see Identifier Qualifiers). This\nallows to use REPLACE ... SELECT to copy rows between different databases.\n\nMariaDB starting with 10.5.0\n----------------------------\nThe RETURNING clause was introduced in MariaDB 10.5.0\n\nBasically it works like this:\n\nBEGIN;\nSELECT 1 FROM t1 WHERE key=# FOR UPDATE;\nIF found-row\n DELETE FROM t1 WHERE key=# ;\nENDIF\nINSERT INTO t1 VALUES (...);\nEND;\n\nThe above can be replaced with:\n\nREPLACE INTO t1 VALUES (...)\n\nREPLACE is a MariaDB/MySQL extension to the SQL standard. It either inserts,\nor deletes and inserts. For other MariaDB/MySQL extensions to standard SQL ---\nthat also handle duplicate values --- see IGNORE and INSERT ON DUPLICATE KEY\nUPDATE.\n\nNote that unless the table has a PRIMARY KEY or UNIQUE index, using a REPLACE\nstatement makes no sense. It becomes equivalent to INSERT, because there is no\nindex to be used to determine whether a new row duplicates another.\n\nValues for all columns are taken from the values sSee Partition Pruning and\nSelection for details.pecified in the REPLACE statement. Any missing columns\nare set to their default values, just as happens for INSERT. You cannot refer\nto values from the current row and use them in the new row. If you use an\nassignment such as \'SET col = col + 1\', the reference to the column name on\nthe right hand side is treated as DEFAULT(col), so the assignment is\nequivalent to \'SET col = DEFAULT(col) + 1\'.\n\nTo use REPLACE, you must have both the INSERT and DELETE privileges for the\ntable.\n\nThere are some gotchas you should be aware of, before using REPLACE:\n\n* If there is an AUTO_INCREMENT field, a new value will be generated.\n* If there are foreign keys, ON DELETE action will be activated by REPLACE.\n* Triggers on DELETE and INSERT will be activated by REPLACE.\n\nTo avoid some of these behaviors, you can use INSERT ... ON DUPLICATE KEY\nUPDATE.\n\nThis statement activates INSERT and DELETE triggers. See Trigger Overview for\ndetails.\n\nPARTITION\n---------\n\nSee Partition Pruning and Selection for details.\n\nREPLACE RETURNING\n-----------------\n\nREPLACE ... RETURNING returns a resultset of the replaced rows.\n\nThis returns the listed columns for all the rows that are replaced, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple REPLACE statement\n\nREPLACE INTO t2 VALUES (1,\'Leopard\'),(2,\'Dog\') RETURNING id2, id2+id2 \nas Total ,id2|id2, id2&&id2;\n+-----+-------+---------+----------+\n| id2 | Total | id2|id2 | id2&&id2 |\n+-----+-------+---------+----------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n+-----+-------+---------+----------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\nPREPARE stmt FROM \"REPLACE INTO t2 SET id2=3, animal2=\'Fox\' RETURNING f2(id2),\nUPPER(animal2)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f2(id2) | UPPER(animal2) |\n+---------+----------------+\n| 6 | FOX |\n+---------+----------------+\n\nSubqueries in the statement\n\nREPLACE INTO t1 SELECT * FROM t2 RETURNING (SELECT id2 FROM t2 WHERE \nid2 IN (SELECT id2 FROM t2 WHERE id2=1)) AS new_id;\n+--------+\n| new_id |\n+--------+\n| 1 |\n| 1 |\n| 1 |\n| 1 |\n+--------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used..\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used, or it can be used in REPLACE...SEL==\nDescription\n\nREPLACE ... RETURNING returns a resultset of the replaced rows.\n\nThis returns the listed columns for all the rows that are replaced, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple REPLACE statement\n\nREPLACE INTO t2 VALUES (1,\'Leopard\'),(2,\'Dog\') RETURNING id2, id2+id2 \nas Total ,id2|id2, id2&&id2;\n+-----+-------+---------+----------+\n| id2 | Total | id2|id2 | id2&&id2 |\n+-----+-------+---------+----------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n+-----+-------+---------+----------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\nPREPARE stmt FROM \"REPLACE INTO t2 SET id2=3, animal2=\'Fox\' RETURNING f2(id2),\nUPPER(animal2)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f2(id2) | UPPER(animal2) |\n+---------+----------------+\n| 6 | FOX |\n+---------+----------------+\n\nSubqueries in the statement\n\nREPLACE INTO t1 SELECT * FROM t2 RETURNING (SELECT id2 FROM t2 WHERE \nid2 IN (SELECT id2 FROM t2 WHERE id2=1)) AS new_id;\n+--------+\n| new_id |\n+--------+\n| 1 |\n| 1 |\n| 1 |\n| 1 |\n+--------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used..\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used, or it can be used in\nREPLACE...SELECT...RETURNING if the table in the RETURNING clause is not the\nsame as the REPLACE table. ECT...RETURNING if the table in the RETURNING\nclause is not the same as the REPLACE table.\n\nURL: https://mariadb.com/kb/en/replace/','','https://mariadb.com/kb/en/replace/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (416,27,'UPDATE','Syntax\n------\n\nSingle-table syntax:\n\nUPDATE [LOW_PRIORITY] [IGNORE] table_reference \n [PARTITION (partition_list)]\n [FOR PORTION OF period FROM expr1 TO expr2]\n SET col1={expr1|DEFAULT} [,col2={expr2|DEFAULT}] ...\n [WHERE where_condition]\n [ORDER BY ...]\n [LIMIT row_count]\n\nMultiple-table syntax:\n\nUPDATE [LOW_PRIORITY] [IGNORE] table_references\n SET col1={expr1|DEFAULT} [, col2={expr2|DEFAULT}] ...\n [WHERE where_condition]\n\nDescription\n-----------\n\nFor the single-table syntax, the UPDATE statement updates columns of existing\nrows in the named table with new values. The SET clause indicates which\ncolumns to modify and the values they should be given. Each value can be given\nas an expression, or the keyword DEFAULT to set a column explicitly to its\ndefault value. The WHERE clause, if given, specifies the conditions that\nidentify which rows to update. With no WHERE clause, all rows are updated. If\nthe ORDER BY clause is specified, the rows are updated in the order that is\nspecified. The LIMIT clause places a limit on the number of rows that can be\nupdated.\n\nUntil MariaDB 10.3.2, for the multiple-table syntax, UPDATE updates rows in\neach table named in table_references that satisfy the conditions. In this\ncase, ORDER BY and LIMIT cannot be used. This restriction was lifted in\nMariaDB 10.3.2 and both clauses can be used with multiple-table updates. An\nUPDATE can also reference tables which are located in different databases; see\nIdentifier Qualifiers for the syntax.\n\nwhere_condition is an expression that evaluates to true for each row to be\nupdated.\n\ntable_references and where_condition are as specified as described in SELECT.\n\nFor single-table updates, assignments are evaluated in left-to-right order,\nwhile for multi-table updates, there is no guarantee of a particular order. If\nthe SIMULTANEOUS_ASSIGNMENT sql_mode (available from MariaDB 10.3.5) is set,\nUPDATE statements evaluate all assignments simultaneously.\n\nYou need the UPDATE privilege only for columns referenced in an UPDATE that\nare actually updated. You need only the SELECT privilege for any columns that\nare read but not modified. See GRANT.\n\nThe UPDATE statement supports the following modifiers:\n\n* If you use the LOW_PRIORITY keyword, execution of\n the UPDATE is delayed until no other clients are reading from\n the table. This affects only storage engines that use only table-level\n locking (MyISAM, MEMORY, MERGE). See HIGH_PRIORITY and LOW_PRIORITY clauses\nfor details.\n* If you use the IGNORE keyword, the update statement does \n not abort even if errors occur during the update. Rows for which\n duplicate-key conflicts occur are not updated. Rows for which columns are\n updated to values that would cause data conversion errors are updated to the\n closest valid values instead.\n\nPARTITION\n---------\n\nSee Partition Pruning and Selection for details.\n\nFOR PORTION OF\n--------------\n\nMariaDB starting with 10.4.3\n----------------------------\nSee Application Time Periods - Updating by Portion.\n\nUPDATE Statements With the Same Source and Target\n-------------------------------------------------\n\nMariaDB starting with 10.3.2\n----------------------------\nFrom MariaDB 10.3.2, UPDATE statements may have the same source and target.\n\nFor example, given the following table:\n\nDROP TABLE t1;\nCREATE TABLE t1 (c1 INT, c2 INT);\nINSERT INTO t1 VALUES (10,10), (20,20);\n\nUntil MariaDB 10.3.1, the following UPDATE statement would not work:\n\nUPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);\nERROR 1093 (HY000): Table \'t1\' is specified twice, \n both as a target for \'UPDATE\' and as a separate source for data\n\nFrom MariaDB 10.3.2, the statement executes successfully:\n\nUPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);\n\nSELECT * FROM t1;\n+------+------+\n| c1 | c2 |\n+------+------+\n| 10 | 10 |\n| 21 | 20 |\n+------+------+\n\nExample\n-------\n\nSingle-table syntax:\n\nUPDATE table_name SET column1 = value1, column2 = value2 WHERE id=100;\n\nMultiple-table syntax:\n\nUPDATE tab1, tab2 SET tab1.column1 = value1, tab1.column2 = value2 WHERE\ntab1.id = tab2.id;\n\nURL: https://mariadb.com/kb/en/update/','','https://mariadb.com/kb/en/update/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (417,27,'IGNORE','The IGNORE option tells the server to ignore some common errors.\n\nIGNORE can be used with the following statements:\n\n* DELETE\n* INSERT (see also INSERT IGNORE)\n* LOAD DATA INFILE\n* UPDATE\n* ALTER TABLE\n* CREATE TABLE ... SELECT\n* INSERT ... SELECT\n\nThe logic used:\n\n* Variables out of ranges are replaced with the maximum/minimum value.\n\n* SQL_MODEs STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE,\nNO_ZERO_DATE are ignored.\n\n* Inserting NULL in a NOT NULL field will insert 0 ( in a numerical\n field), 0000-00-00 ( in a date field) or an empty string ( in a character\n field).\n\n* Rows that cause a duplicate key error or break a foreign key constraint are\n not inserted, updated, or deleted.\n\nThe following errors are ignored:\n\n+---------------------+---------------------------------+--------------------+\n| Error number | Symbolic error name | Description |\n+---------------------+---------------------------------+--------------------+\n| 1022 | ER_DUP_KEY | Can\'t write; |\n| | | duplicate key in |\n| | | table \'%s\' |\n+---------------------+---------------------------------+--------------------+\n| 1048 | ER_BAD_NULL_ERROR | Column \'%s\' |\n| | | cannot be null |\n+---------------------+---------------------------------+--------------------+\n| 1062 | ER_DUP_ENTRY | Duplicate entry |\n| | | \'%s\' for key %d |\n+---------------------+---------------------------------+--------------------+\n| 1242 | ER_SUBQUERY_NO_1_ROW | Subquery returns |\n| | | more than 1 row |\n+---------------------+---------------------------------+--------------------+\n| 1264 | ER_WARN_DATA_OUT_OF_RANGE | Out of range |\n| | | value for column |\n| | | \'%s\' at row %ld |\n+---------------------+---------------------------------+--------------------+\n| 1265 | WARN_DATA_TRUNCATED | Data truncated |\n| | | for column \'%s\' |\n| | | at row %ld |\n+---------------------+---------------------------------+--------------------+\n| 1292 | ER_TRUNCATED_WRONG_VALUE | Truncated |\n| | | incorrect %s |\n| | | value: \'%s\' |\n+---------------------+---------------------------------+--------------------+\n| 1366 | ER_TRUNCATED_WRONG_VALUE_FOR_FI | Incorrect integer |\n| | LD | value |\n+---------------------+---------------------------------+--------------------+\n| 1369 | ER_VIEW_CHECK_FAILED | CHECK OPTION |\n| | | failed \'%s.%s\' |\n+---------------------+---------------------------------+--------------------+\n| 1451 | ER_ROW_IS_REFERENCED_2 | Cannot delete or |\n| | | update a parent |\n| | | row |\n+---------------------+---------------------------------+--------------------+\n| 1452 | ER_NO_REFERENCED_ROW_2 | Cannot add or |\n| | | update a child |\n| | | row: a foreign |\n| | | key constraint |\n| | | fails (%s) |\n+---------------------+---------------------------------+--------------------+\n| 1526 | ER_NO_PARTITION_FOR_GIVEN_VALUE | Table has no |\n| | | partition for |\n| | | value %s |\n+---------------------+---------------------------------+--------------------+\n| 1586 | ER_DUP_ENTRY_WITH_KEY_NAME | Duplicate entry |\n| | | \'%s\' for key \'%s\' |\n+---------------------+---------------------------------+--------------------+\n| 1591 | ER_NO_PARTITION_FOR_GIVEN_VALUE | Table has no |\n| | SILENT | partition for |\n| | | some existing |\n| | | values |\n+---------------------+---------------------------------+--------------------+\n| 1748 | ER_ROW_DOES_NOT_MATCH_GIVEN_PAR | Found a row not |\n| | ITION_SET | matching the |\n| | | given partition |\n| | | set |\n+---------------------+---------------------------------+--------------------+\n\nIgnored errors normally generate a warning.\n\nA property of the IGNORE clause consists in causing transactional engines and\nnon-transactional engines (like XtraDB and Aria) to behave the same way. For\nexample, normally a multi-row insert which tries to violate a UNIQUE contraint\nis completely rolled back on XtraDB/InnoDB, but might be partially executed on\nAria. With the IGNORE clause, the statement will be partially executed in both\nengines.\n\nDuplicate key errors also generate warnings. The OLD_MODE server variable can\nbe used to prevent this.\n\nURL: https://mariadb.com/kb/en/ignore/','','https://mariadb.com/kb/en/ignore/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (418,27,'SELECT','Syntax\n------\n\nSELECT\n [ALL | DISTINCT | DISTINCTROW]\n [HIGH_PRIORITY]\n [STRAIGHT_JOIN]\n [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]\n [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]\n select_expr [, select_expr ...]\n [ FROM table_references\n [WHERE where_condition]\n [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]]\n [HAVING where_condition]\n [ORDER BY {col_name | expr | position} [ASC | DESC], ...]\n [LIMIT {[offset,] row_count | row_count OFFSET offset [ROWS EXAMINED\nrows_limit] } |\n [OFFSET start { ROW | ROWS }]\n [FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }]\n]\n procedure|[PROCEDURE procedure_name(argument_list)]\n [INTO OUTFILE \'file_name\' [CHARACTER SET charset_name] [export_options] |\n INTO DUMPFILE \'file_name\' | INTO var_name [, var_name] ]\n [FOR UPDATE lock_option | LOCK IN SHARE MODE lock_option]\nexport_options:\n [{FIELDS | COLUMNS}\n [TERMINATED BY \'string\']\n [[OPTIONALLY] ENCLOSED BY \'char\']\n [ESCAPED BY \'char\']\n ]\n [LINES\n [STARTING BY \'string\']\n [TERMINATED BY \'string\']\n ]\nlock_option:\n [WAIT n | NOWAIT | SKIP LOCKED]\n\nDescription\n-----------\n\nSELECT is used to retrieve rows selected from one or more tables, and can\ninclude UNION statements and subqueries.\n\n* Each select_expr expression indicates a column or data that you want to\nretrieve. You\nmust have at least one select expression. See Select Expressions below.\n\n* The FROM clause indicates the table or tables from which to retrieve rows.\nUse either a single table name or a JOIN expression. See JOIN\nfor details. If no table is involved, FROM DUAL can be specified.\n\n* Each table can also be specified as db_name.tabl_name. Each column can also\nbe specified as tbl_name.col_name or even db_name.tbl_name.col_name. This\nallows one to write queries which involve multiple databases. See Identifier\nQualifiers for syntax details.\n\n* The WHERE clause, if given, indicates the condition or\n conditions that rows must satisfy to be selected.\n where_condition is an expression that evaluates to true for\n each row to be selected. The statement selects all rows if there is no WHERE\n clause.\nIn the WHERE clause, you can use any of the functions and\n operators that MariaDB supports, except for aggregate (summary) functions.\nSee Functions and Operators and Functions and Modifiers for use with GROUP BY\n(aggregate).\n\n* Use the ORDER BY clause to order the results.\n\n* Use the LIMIT clause allows you to restrict the results to only\na certain number of rows, optionally with an offset.\n\n* Use the GROUP BY and HAVING clauses to group\nrows together when they have columns or computed values in common.\n\nSELECT can also be used to retrieve rows computed without reference to any\ntable.\n\nSelect Expressions\n------------------\n\nA SELECT statement must contain one or more select expressions, separated by\ncommas. Each select expression can be one of the following:\n\n* The name of a column.\n* Any expression using functions and operators.\n* * to select all columns from all tables in the FROM clause.\n* tbl_name.* to select all columns from just the table tbl_name.\n\nWhen specifying a column, you can either use just the column name or qualify\nthe column name with the name of the table using tbl_name.col_name. The\nqualified form is useful if you are joining multiple tables in the FROM\nclause. If you do not qualify the column names when selecting from multiple\ntables, MariaDB will try to find the column in each table. It is an error if\nthat column name exists in multiple tables.\n\nYou can quote column names using backticks. If you are qualifying column names\nwith table names, quote each part separately as `tbl_name`.`col_name`.\n\nIf you use any grouping functions in any of the select expressions, all rows\nin your results will be implicitly grouped, as if you had used GROUP BY NULL.\n\nDISTINCT\n--------\n\nA query may produce some identical rows. By default, all rows are retrieved,\neven when their values are the same. To explicitly specify that you want to\nretrieve identical rows, use the ALL option. If you want duplicates to be\nremoved from the resultset, use the DISTINCT option. DISTINCTROW is a synonym\nfor DISTINCT. See also COUNT DISTINCT and SELECT UNIQUE in Oracle mode.\n\nINTO\n----\n\nThe INTO clause is used to specify that the query results should be written to\na file or variable.\n\n* SELECT INTO OUTFILE - formatting and writing the result to an external file.\n* SELECT INTO DUMPFILE - binary-safe writing of the unformatted results to an\nexternal file.\n* SELECT INTO Variable - selecting and setting variables.\n\nThe reverse of SELECT INTO OUTFILE is LOAD DATA.\n\nLIMIT\n-----\n\nRestricts the number of returned rows. See LIMIT and LIMIT ROWS EXAMINED for\ndetails.\n\nLOCK IN SHARE MODE/FOR UPDATE\n-----------------------------\n\nSee LOCK IN SHARE MODE and FOR UPDATE for details on the respective locking\nclauses.\n\nOFFSET ... FETCH\n----------------\n\nMariaDB starting with 10.6\n--------------------------\nSee SELECT ... OFFSET ... FETCH.\n\nORDER BY\n--------\n\nOrder a resultset. See ORDER BY for details.\n\nPARTITION\n---------\n\nSpecifies to the optimizer which partitions are relevant for the query. Other\npartitions will not be read. See Partition Pruning and Selection for details.\n\nPROCEDURE\n---------\n\nPasses the whole result set to a C Procedure. See PROCEDURE and PROCEDURE\nANALYSE (the only built-in procedure not requiring the server to be\nrecompiled).\n\nSKIP LOCKED\n-----------\n\nMariaDB starting with 10.6\n--------------------------\nThe SKIP LOCKED clause was introduced in MariaDB 10.6.0.\n\nThis causes those rows that couldn\'t be locked (LOCK IN SHARE MODE or FOR\nUPDATE) to be excluded from the result set. An explicit NOWAIT is implied\nhere. This is only implemented on InnoDB tables and ignored otherwise.\n\nSQL_CALC_FOUND_ROWS\n-------------------\n\nWhen SQL_CALC_FOUND_ROWS is used, then MariaDB will calculate how many rows\nwould have been in the result, if there would be no LIMIT clause. The result\ncan be found by calling the function FOUND_ROWS() in your next sql statement.\n\nmax_statement_time clause\n-------------------------\n\nBy using max_statement_time in conjunction with SET STATEMENT, it is possible\nto limit the execution time of individual queries. For example:\n\nSET STATEMENT max_statement_time=100 FOR \n SELECT field1 FROM table_name ORDER BY field1;\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nExamples\n--------\n\nSELECT f1,f2 FROM t1 WHERE (f3<=10) AND (f4=\'y\');\n\nSee Getting Data from MariaDB (Beginner tutorial), or the various\nsub-articles, for more examples.\n\nURL: https://mariadb.com/kb/en/select/','','https://mariadb.com/kb/en/select/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (419,27,'JOIN Syntax','Description\n-----------\n\nMariaDB supports the following JOIN syntaxes for the table_references part of\nSELECT statements and multiple-table DELETE and UPDATE statements:\n\ntable_references:\n table_reference [, table_reference] ...\n\ntable_reference:\n table_factor\n | join_table\n\ntable_factor:\n tbl_name [PARTITION (partition_list)]\n [query_system_time_period_specification] [[AS] alias] [index_hint_list]\n | table_subquery [query_system_time_period_specification] [AS] alias\n | ( table_references )\n | { ON table_reference LEFT OUTER JOIN table_reference\n ON conditional_expr }\n\njoin_table:\n table_reference [INNER | CROSS] JOIN table_factor [join_condition]\n | table_reference STRAIGHT_JOIN table_factor\n | table_reference STRAIGHT_JOIN table_factor ON conditional_expr\n | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition\n | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor\n\njoin_condition:\n ON conditional_expr\n | USING (column_list)\n\nquery_system_time_period_specification:\n FOR SYSTEM_TIME AS OF point_in_time\n | FOR SYSTEM_TIME BETWEEN point_in_time AND point_in_time\n | FOR SYSTEM_TIME FROM point_in_time TO point_in_time\n | FOR SYSTEM_TIME ALL\n\npoint_in_time:\n [TIMESTAMP] expression\n | TRANSACTION expression\n\nindex_hint_list:\n index_hint [, index_hint] ...\n\nindex_hint:\n USE {INDEX|KEY}\n [{FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])\n | IGNORE {INDEX|KEY}\n [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)\n | FORCE {INDEX|KEY}\n [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)\n\nindex_list:\n index_name [, index_name] ...\n\nA table reference is also known as a join expression.\n\nEach table can also be specified as db_name.tabl_name. This allows to write\nqueries which involve multiple databases. See Identifier Qualifiers for syntax\ndetails.\n\nThe syntax of table_factor is extended in comparison with the SQL Standard.\nThe latter accepts only table_reference, not a list of them inside a pair of\nparentheses.\n\nThis is a conservative extension if we consider each comma in a list of\ntable_reference items as equivalent to an inner join. For example:\n\nSELECT * FROM t1 LEFT JOIN (t2, t3, t4)\n ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)\n\nis equivalent to:\n\nSELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)\n ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)\n\nIn MariaDB, CROSS JOIN is a syntactic equivalent to INNER JOIN (they can\nreplace each other). In standard SQL, they are not equivalent. INNER JOIN is\nused with an ON clause, CROSS JOIN is used otherwise.\n\nIn general, parentheses can be ignored in join expressions containing only\ninner join operations. MariaDB also supports nested joins (see\nhttp://dev.mysql.com/doc/refman/5.1/en/nested-join-optimization.html).\n\nSee System-versioned tables for more information about FOR SYSTEM_TIME syntax.\n\nIndex hints can be specified to affect how the MariaDB optimizer makes use of\nindexes. For more information, see How to force query plans.\n\nExamples\n--------\n\nSELECT left_tbl.*\n FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id\n WHERE right_tbl.id IS NULL;\n\nURL: https://mariadb.com/kb/en/join-syntax/','','https://mariadb.com/kb/en/join-syntax/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (420,27,'Scalar Subqueries','A scalar subquery is a subquery that returns a single value. This is the\nsimplest form of a subquery, and can be used in most places a literal or\nsingle column value is valid.\n\nThe data type, length and character set and collation are all taken from the\nresult returned by the subquery. The result of a subquery can always be NULL,\nthat is, no result returned. Even if the original value is defined as NOT\nNULL, this is disregarded.\n\nA subquery cannot be used where only a literal is expected, for example LOAD\nDATA INFILE expects a literal string containing the file name, and LIMIT\nrequires a literal integer.\n\nExamples\n--------\n\nCREATE TABLE sq1 (num TINYINT);\n\nCREATE TABLE sq2 (num TINYINT);\n\nINSERT INTO sq1 VALUES (1);\n\nINSERT INTO sq2 VALUES (10* (SELECT num FROM sq1));\n\nSELECT * FROM sq2;\n+------+\n| num |\n+------+\n| 10 |\n+------+\n\nInserting a second row means the subquery is no longer a scalar, and this\nparticular query is not valid:\n\nINSERT INTO sq1 VALUES (2);\n\nINSERT INTO sq2 VALUES (10* (SELECT num FROM sq1));\nERROR 1242 (21000): Subquery returns more than 1 row\n\nNo rows in the subquery, so the scalar is NULL:\n\nINSERT INTO sq2 VALUES (10* (SELECT num FROM sq3 WHERE num=\'3\'));\n\nSELECT * FROM sq2;\n+------+\n| num |\n+------+\n| 10 |\n| NULL |\n+------+\n\nA more traditional scalar subquery, as part of a WHERE clause:\n\nSELECT * FROM sq1 WHERE num = (SELECT MAX(num)/10 FROM sq2); \n+------+\n| num |\n+------+\n| 1 |\n+------+\n\nURL: https://mariadb.com/kb/en/subqueries-scalar-subqueries/','','https://mariadb.com/kb/en/subqueries-scalar-subqueries/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (421,27,'Row Subqueries','A row subquery is a subquery returning a single row, as opposed to a scalar\nsubquery, which returns a single column from a row, or a literal.\n\nExamples\n--------\n\nCREATE TABLE staff (name VARCHAR(10), age TINYINT);\n\nCREATE TABLE customer (name VARCHAR(10), age TINYINT);\n\nINSERT INTO staff VALUES (\'Bilhah\',37), (\'Valerius\',61), (\'Maia\',25);\n\nINSERT INTO customer VALUES (\'Thanasis\',48), (\'Valerius\',61), (\'Brion\',51);\n\nSELECT * FROM staff WHERE (name,age) = (SELECT name,age FROM customer WHERE\nname=\'Valerius\');\n+----------+------+\n| name | age |\n+----------+------+\n| Valerius | 61 |\n+----------+------+\n\nFinding all rows in one table also in another:\n\nSELECT name,age FROM staff WHERE (name,age) IN (SELECT name,age FROM customer);\n+----------+------+\n| name | age |\n+----------+------+\n| Valerius | 61 |\n+----------+------+\n\nURL: https://mariadb.com/kb/en/subqueries-row-subqueries/','','https://mariadb.com/kb/en/subqueries-row-subqueries/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (422,27,'Subqueries and ALL','Subqueries using the ALL keyword will return true if the comparison returns\ntrue for each row returned by the subquery, or the subquery returns no rows.\n\nSyntax\n------\n\nscalar_expression comparison_operator ALL <Table subquery>\n\n* scalar_expression may be any expression that evaluates to a single\nvalue\n* comparison_operator may be any one of: =, >, <, >=, <=, <> or !=\n\nALL returns:\n\n* NULL if the comparison operator returns NULL for at least one row returned\nby the Table subquery or scalar_expression returns NULL.\n* FALSE if the comparison operator returns FALSE for at least one row returned\nby the Table subquery.\n* TRUE if the comparison operator returns TRUE for all rows returned by the\nTable subquery, or if Table subquery returns no rows.\n\nNOT IN is an alias for <> ALL.\n\nExamples\n--------\n\nCREATE TABLE sq1 (num TINYINT);\n\nCREATE TABLE sq2 (num2 TINYINT);\n\nINSERT INTO sq1 VALUES(100);\n\nINSERT INTO sq2 VALUES(40),(50),(60);\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nSince 100 > all of 40,50 and 60, the evaluation is true and the row is returned\n\nAdding a second row to sq1, where the evaluation for that record is false:\n\nINSERT INTO sq1 VALUES(30);\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nAdding a new row to sq2, causing all evaluations to be false:\n\nINSERT INTO sq2 VALUES(120);\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);\nEmpty set (0.00 sec)\n\nWhen the subquery returns no results, the evaluation is still true:\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2 WHERE num2 > 300);\n+------+\n| num |\n+------+\n| 100 |\n| 30 |\n+------+\n\nEvaluating against a NULL will cause the result to be unknown, or not true,\nand therefore return no rows:\n\nINSERT INTO sq2 VALUES (NULL);\n\nSELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);\n\nURL: https://mariadb.com/kb/en/subqueries-and-all/','','https://mariadb.com/kb/en/subqueries-and-all/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (423,27,'Subqueries and ANY','Subqueries using the ANY keyword will return true if the comparison returns\ntrue for at least one row returned by the subquery.\n\nSyntax\n------\n\nThe required syntax for an ANY or SOME quantified comparison is:\n\nscalar_expression comparison_operator ANY <Table subquery>\n\nOr:\n\nscalar_expression comparison_operator SOME <Table subquery>\n\n* scalar_expression may be any expression that evaluates to a\nsingle value.\n* comparison_operator may be any one of =, >, <, >=, <=, <> or !=.\n\nANY returns:\n\n* TRUE if the comparison operator returns TRUE for at least one row returned\nby the Table subquery.\n* FALSE if the comparison operator returns FALSE for all rows returned by the\nTable subquery, or Table subquery has zero rows.\n* NULL if the comparison operator returns NULL for at least one row returned\nby the Table subquery and doesn\'t returns TRUE for any of them, or if\nscalar_expression returns NULL.\n\nSOME is a synmonym for ANY, and IN is a synonym for = ANY\n\nExamples\n--------\n\nCREATE TABLE sq1 (num TINYINT);\n\nCREATE TABLE sq2 (num2 TINYINT);\n\nINSERT INTO sq1 VALUES(100);\n\nINSERT INTO sq2 VALUES(40),(50),(120);\n\nSELECT * FROM sq1 WHERE num > ANY (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\n100 is greater than two of the three values, and so the expression evaluates\nas true.\n\nSOME is a synonym for ANY:\n\nSELECT * FROM sq1 WHERE num < SOME (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nIN is a synonym for = ANY, and here there are no matches, so no results are\nreturned:\n\nSELECT * FROM sq1 WHERE num IN (SELECT * FROM sq2);\nEmpty set (0.00 sec)\n\nINSERT INTO sq2 VALUES(100);\nQuery OK, 1 row affected (0.05 sec)\n\nSELECT * FROM sq1 WHERE num <> ANY (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nReading this query, the results may be counter-intuitive. It may seem to read\nas \"SELECT * FROM sq1 WHERE num does not match any results in sq2. Since it\ndoes match 100, it could seem that the results are incorrect. However, the\nquery returns a result if the match does not match any of sq2. Since 100\nalready does not match 40, the expression evaluates to true immediately,\nregardless of the 100\'s matching. It may be more easily readable to use SOME\nin a case such as this:\n\nSELECT * FROM sq1 WHERE num <> SOME (SELECT * FROM sq2);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nURL: https://mariadb.com/kb/en/subqueries-and-any/','','https://mariadb.com/kb/en/subqueries-and-any/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (424,27,'Subqueries and EXISTS','Syntax\n------\n\nSELECT ... WHERE EXISTS <Table subquery>\n\nDescription\n-----------\n\nSubqueries using the EXISTS keyword will return true if the subquery returns\nany rows. Conversely, subqueries using NOT EXISTS will return true only if the\nsubquery returns no rows from the table.\n\nEXISTS subqueries ignore the columns specified by the SELECT of the subquery,\nsince they\'re not relevant. For example,\n\nSELECT col1 FROM t1 WHERE EXISTS (SELECT * FROM t2);\n\nand\n\nSELECT col1 FROM t1 WHERE EXISTS (SELECT col2 FROM t2);\n\nproduce identical results.\n\nExamples\n--------\n\nCREATE TABLE sq1 (num TINYINT);\n\nCREATE TABLE sq2 (num2 TINYINT);\n\nINSERT INTO sq1 VALUES(100);\n\nINSERT INTO sq2 VALUES(40),(50),(60);\n\nSELECT * FROM sq1 WHERE EXISTS (SELECT * FROM sq2 WHERE num2>50);\n+------+\n| num |\n+------+\n| 100 |\n+------+\n\nSELECT * FROM sq1 WHERE NOT EXISTS (SELECT * FROM sq2 GROUP BY num2 HAVING\nMIN(num2)=40);\nEmpty set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/subqueries-and-exists/','','https://mariadb.com/kb/en/subqueries-and-exists/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (425,27,'Subqueries in a FROM Clause','Although subqueries are more commonly placed in a WHERE clause, they can also\nform part of the FROM clause. Such subqueries are commonly called derived\ntables.\n\nIf a subquery is used in this way, you must also use an AS clause to name the\nresult of the subquery.\n\nORACLE mode\n-----------\n\nMariaDB starting with 10.6.0\n----------------------------\nFrom MariaDB 10.6.0, anonymous subqueries in a FROM clause (no AS clause) are\npermitted in ORACLE mode.\n\nExamples\n--------\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nAssume that, given the data above, you want to return the average total for\nall students. In other words, the average of Chun\'s 148 (75+73), Esben\'s 74\n(43+31), etc.\n\nYou cannot do the following:\n\nSELECT AVG(SUM(score)) FROM student GROUP BY name;\nERROR 1111 (HY000): Invalid use of group function\n\nA subquery in the FROM clause is however permitted:\n\nSELECT AVG(sq_sum) FROM (SELECT SUM(score) AS sq_sum FROM student GROUP BY\nname) AS t;\n+-------------+\n| AVG(sq_sum) |\n+-------------+\n| 134.0000 |\n+-------------+\n\nFrom MariaDB 10.6 in ORACLE mode, the following is permitted:\n\nSELECT * FROM (SELECT 1 FROM DUAL), (SELECT 2 FROM DUAL);\n\nURL: https://mariadb.com/kb/en/subqueries-in-a-from-clause/','','https://mariadb.com/kb/en/subqueries-in-a-from-clause/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (426,27,'Subqueries and JOINs','A subquery can quite often, but not in all cases, be rewritten as a JOIN.\n\nRewriting Subqueries as JOINS\n-----------------------------\n\nA subquery using IN can be rewritten with the DISTINCT keyword, for example:\n\nSELECT * FROM table1 WHERE col1 IN (SELECT col1 FROM table2);\n\ncan be rewritten as:\n\nSELECT DISTINCT table1.* FROM table1, table2 WHERE table1.col1=table2.col1;\n\nNOT IN or NOT EXISTS queries can also be rewritten. For example, these two\nqueries returns the same result:\n\nSELECT * FROM table1 WHERE col1 NOT IN (SELECT col1 FROM table2);\nSELECT * FROM table1 WHERE NOT EXISTS (SELECT col1 FROM table2 WHERE\ntable1.col1=table2.col1);\n\nand both can be rewritten as:\n\nSELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE\ntable2.id IS NULL;\n\nSubqueries that can be rewritten as a LEFT JOIN are sometimes more efficient.\n\nUsing Subqueries instead of JOINS\n---------------------------------\n\nThere are some scenarios, though, which call for subqueries rather than joins:\n\n* When you want duplicates, but not false duplicates. Suppose Table_1\n has three rows — {1,1,2}\n — and Table_2 has two rows\n — {1,2,2}. If you need to list the rows\n in Table_1 which are also in Table_2, only this\n subquery-based SELECT statement will give the right answer\n (1,1,2):\n\nSELECT Table_1.column_1 \nFROM Table_1 \nWHERE Table_1.column_1 IN \n (SELECT Table_2.column_1\n FROM Table_2);\n\n* This SQL statement won\'t work:\n\nSELECT Table_1.column_1 \nFROM Table_1,Table_2 \nWHERE Table_1.column_1 = Table_2.column_1;\n\n* because the result will be {1,1,2,2}\n — and the duplication of 2 is an error. This SQL\n statement won\'t work either:\n\nSELECT DISTINCT Table_1.column_1 \nFROM Table_1,Table_2 \nWHERE Table_1.column_1 = Table_2.column_1;\n\n* because the result will be {1,2} — and\n the removal of the duplicated 1 is an error too.\n\n* When the outermost statement is not a query. The SQL statement:\n\nUPDATE Table_1 SET column_1 = (SELECT column_1 FROM Table_2);\n\n* can\'t be expressed using a join unless some rare SQL3 features are used.\n\n* When the join is over an expression. The SQL statement:\n\nSELECT * FROM Table_1 \nWHERE column_1 + 5 =\n (SELECT MAX(column_1) FROM Table_2);\n\n* is hard to express with a join. In fact, the only way we can think of is\n this SQL statement:\n\nSELECT Table_1.*\nFROM Table_1, \n (SELECT MAX(column_1) AS max_column_1 FROM Table_2) AS Table_2\nWHERE Table_1.column_1 + 5 = Table_2.max_column_1;\n\n* which still involves a parenthesized query, so nothing is gained from the\n transformation.\n\n* When you want to see the exception. For example, suppose the question is:\n what books are longer than Das Kapital? These two queries are effectively\n almost the same:\n\nSELECT DISTINCT Bookcolumn_1.* \nFROM Books AS Bookcolumn_1 JOIN Books AS Bookcolumn_2 USING(page_count) \nWHERE title = \'Das Kapital\';\n\nSELECT DISTINCT Bookcolumn_1.* \nFROM Books AS Bookcolumn_1 \nWHERE Bookcolumn_1.page_count > \n (SELECT DISTINCT page_count\n FROM Books AS Bookcolumn_2\n WHERE title = \'Das Kapital\');\n\n* The difference is between these two SQL statements is, if there are two\n editions of Das Kapital (with different page counts), then the self-join\n example will return the books which are longer than the shortest edition\n of Das Kapital. That might be the wrong answer, since the original\n question didn\'t ask for \"... longer than ANY book named Das Kapital\"\n (it seems to contain a false assumption that there\'s only one edition).\n\nURL: https://mariadb.com/kb/en/subqueries-and-joins/','','https://mariadb.com/kb/en/subqueries-and-joins/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (427,27,'Subquery Limitations','There are a number of limitations regarding subqueries, which are discussed\nbelow. The following tables and data will be used in the examples that follow:\n\nCREATE TABLE staff(name VARCHAR(10),age TINYINT);\n\nCREATE TABLE customer(name VARCHAR(10),age TINYINT);\n\nINSERT INTO staff VALUES \n(\'Bilhah\',37), (\'Valerius\',61), (\'Maia\',25);\n\nINSERT INTO customer VALUES \n(\'Thanasis\',48), (\'Valerius\',61), (\'Brion\',51);\n\nORDER BY and LIMIT\n------------------\n\nTo use ORDER BY or limit LIMIT in subqueries both must be used.. For example:\n\nSELECT * FROM staff WHERE name IN (SELECT name FROM customer ORDER BY name);\n+----------+------+\n| name | age |\n+----------+------+\n| Valerius | 61 |\n+----------+------+\n\nis valid, but\n\nSELECT * FROM staff WHERE name IN (SELECT NAME FROM customer ORDER BY name\nLIMIT 1);\nERROR 1235 (42000): This version of MariaDB doesn\'t \n yet support \'LIMIT & IN/ALL/ANY/SOME subquery\'\n\nis not.\n\nModifying and Selecting from the Same Table\n-------------------------------------------\n\nIt\'s not possible to both modify and select from the same table in a subquery.\nFor example:\n\nDELETE FROM staff WHERE name = (SELECT name FROM staff WHERE age=61);\nERROR 1093 (HY000): Table \'staff\' is specified twice, both \n as a target for \'DELETE\' and as a separate source for data\n\nRow Comparison Operations\n-------------------------\n\nThere is only partial support for row comparison operations. The expression in\n\nexpr op {ALL|ANY|SOME} subquery,\n\nmust be scalar and the subquery can only return a single column.\n\nHowever, because of the way IN is implemented (it is rewritten as a sequence\nof = comparisons and AND), the expression in\n\nexpression [NOT] IN subquery\n\nis permitted to be an n-tuple and the subquery can return rows of n-tuples.\n\nFor example:\n\nSELECT * FROM staff WHERE (name,age) NOT IN (\n SELECT name,age FROM customer WHERE age >=51]\n);\n+--------+------+\n| name | age |\n+--------+------+\n| Bilhah | 37 |\n| Maia | 25 |\n+--------+------+\n\nis permitted, but\n\nSELECT * FROM staff WHERE (name,age) = ALL (\n SELECT name,age FROM customer WHERE age >=51\n);\nERROR 1241 (21000): Operand should contain 1 column(s)\n\nis not.\n\nCorrelated Subqueries\n---------------------\n\nSubqueries in the FROM clause cannot be correlated subqueries. They cannot be\nevaluated for each row of the outer query since they are evaluated to produce\na result set during when the query is executed.\n\nStored Functions\n----------------\n\nA subquery can refer to a stored function which modifies data. This is an\nextension to the SQL standard, but can result in indeterminate outcomes. For\nexample, take:\n\nSELECT ... WHERE x IN (SELECT f() ...);\n\nwhere f() inserts rows. The function f() could be executed a different number\nof times depending on how the optimizer chooses to handle the query.\n\nThis sort of construct is therefore not safe to use in replication that is not\nrow-based, as there could be different results on the master and the slave.\n\nURL: https://mariadb.com/kb/en/subquery-limitations/','','https://mariadb.com/kb/en/subquery-limitations/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (428,27,'UNION','UNION is used to combine the results from multiple SELECT statements into a\nsingle result set.\n\nSyntax\n------\n\nSELECT ...\nUNION [ALL | DISTINCT] SELECT ...\n[UNION [ALL | DISTINCT] SELECT ...]\n[ORDER BY [column [, column ...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}]\n\nDescription\n-----------\n\nUNION is used to combine the results from multiple SELECT statements into a\nsingle result set.\n\nThe column names from the first SELECT statement are used as the column names\nfor the results returned. Selected columns listed in corresponding positions\nof each SELECT statement should have the same data type. (For example, the\nfirst column selected by the first statement should have the same type as the\nfirst column selected by the other statements.)\n\nIf they don\'t, the type and length of the columns in the result take into\naccount the values returned by all of the SELECTs, so there is no need for\nexplicit casting. Note that currently this is not the case for recursive CTEs\n- see MDEV-12325.\n\nTable names can be specified as db_name.tbl_name. This permits writing UNIONs\nwhich involve multiple databases. See Identifier Qualifiers for syntax details.\n\nUNION queries cannot be used with aggregate functions.\n\nEXCEPT and UNION have the same operation precedence and INTERSECT has a higher\nprecedence, unless running in Oracle mode, in which case all three have the\nsame precedence.\n\nALL/DISTINCT\n------------\n\nThe ALL keyword causes duplicate rows to be preserved. The DISTINCT keyword\n(the default if the keyword is omitted) causes duplicate rows to be removed by\nthe results.\n\nUNION ALL and UNION DISTINCT can both be present in a query. In this case,\nUNION DISTINCT will override any UNION ALLs to its left.\n\nMariaDB starting with 10.1.1\n----------------------------\nUntil MariaDB 10.1.1, all UNION ALL statements required the server to create a\ntemporary table. Since MariaDB 10.1.1, the server can in most cases execute\nUNION ALL without creating a temporary table, improving performance (see\nMDEV-334).\n\nORDER BY and LIMIT\n------------------\n\nIndividual SELECTs can contain their own ORDER BY and LIMIT clauses. In this\ncase, the individual queries need to be wrapped between parentheses. However,\nthis does not affect the order of the UNION, so they only are useful to limit\nthe record read by one SELECT.\n\nThe UNION can have global ORDER BY and LIMIT clauses, which affect the whole\nresultset. If the columns retrieved by individual SELECT statements have an\nalias (AS), the ORDER BY must use that alias, not the real column names.\n\nHIGH_PRIORITY\n-------------\n\nSpecifying a query as HIGH_PRIORITY will not work inside a UNION. If applied\nto the first SELECT, it will be ignored. Applying to a later SELECT results in\na syntax error:\n\nERROR 1234 (42000): Incorrect usage/placement of \'HIGH_PRIORITY\'\n\nSELECT ... INTO ...\n-------------------\n\nIndividual SELECTs cannot be written INTO DUMPFILE or INTO OUTFILE. If the\nlast SELECT statement specifies INTO DUMPFILE or INTO OUTFILE, the entire\nresult of the UNION will be written. Placing the clause after any other SELECT\nwill result in a syntax error.\n\nIf the result is a single row, SELECT ... INTO @var_name can also be used.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nParentheses\n-----------\n\nFrom MariaDB 10.4.0, parentheses can be used to specify precedence. Before\nthis, a syntax error would be returned.\n\nExamples\n--------\n\nUNION between tables having different column names:\n\n(SELECT e_name AS name, email FROM employees)\nUNION\n(SELECT c_name AS name, email FROM customers);\n\nSpecifying the UNION\'s global order and limiting total rows:\n\n(SELECT name, email FROM employees)\nUNION\n(SELECT name, email FROM customers)\nORDER BY name LIMIT 10;\n\nAdding a constant row:\n\n(SELECT \'John Doe\' AS name, \'john.doe@example.net\' AS email)\nUNION\n(SELECT name, email FROM customers);\n\nDiffering types:\n\nSELECT CAST(\'x\' AS CHAR(1)) UNION SELECT REPEAT(\'y\',4);\n+----------------------+\n| CAST(\'x\' AS CHAR(1)) |\n+----------------------+\n| x |\n| yyyy |\n+----------------------+\n\nReturning the results in order of each individual SELECT by use of a sort\ncolumn:\n\n(SELECT 1 AS sort_column, e_name AS name, email FROM employees)\nUNION\n(SELECT 2, c_name AS name, email FROM customers) ORDER BY sort_column;\n\nDifference between UNION, EXCEPT and INTERSECT. INTERSECT ALL and EXCEPT ALL\nare available from MariaDB 10.5.0.\n\nCREATE TABLE seqs (i INT);\nINSERT INTO seqs VALUES (1),(2),(2),(3),(3),(4),(5),(6);\n\nSELECT i FROM seqs WHERE i <= 3 UNION SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 UNION ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n| 3 |\n| 3 |\n| 3 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n| 3 |\n+------+\n\nParentheses for specifying precedence, from MariaDB 10.4.0\n\nCREATE OR REPLACE TABLE t1 (a INT);\nCREATE OR REPLACE TABLE t2 (b INT);\nCREATE OR REPLACE TABLE t3 (c INT);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4);\nINSERT INTO t2 VALUES (5),(6);\nINSERT INTO t3 VALUES (1),(6);\n\n((SELECT a FROM t1) UNION (SELECT b FROM t2)) INTERSECT (SELECT c FROM t3);\n+------+\n| a |\n+------+\n| 1 |\n| 6 |\n+------+\n\n(SELECT a FROM t1) UNION ((SELECT b FROM t2) INTERSECT (SELECT c FROM t3));\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 6 |\n+------+\n\nURL: https://mariadb.com/kb/en/union/','','https://mariadb.com/kb/en/union/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (429,27,'EXCEPT','MariaDB starting with 10.3.0\n----------------------------\nEXCEPT was introduced in MariaDB 10.3.0.\n\nThe result of EXCEPT is all records of the left SELECT result set except\nrecords which are in right SELECT result set, i.e. it is subtraction of two\nresult sets. From MariaDB 10.6.1, MINUS is a synonym.\n\nSyntax\n------\n\nSELECT ...\n(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL |\nDISTINCT]) SELECT ...\n[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL |\nDISTINCT]) SELECT ...]\n[ORDER BY [{col_name | expr | position} [ASC | DESC] [, {col_name | expr |\nposition} [ASC | DESC] ...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}\n| OFFSET start { ROW | ROWS }\n| FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]\n\nPlease note:\n\n* Brackets for explicit operation precedence are not supported; use a subquery\nin the FROM clause as a workaround).\n\nDescription\n-----------\n\nMariaDB has supported EXCEPT and INTERSECT in addition to UNION since MariaDB\n10.3.\n\nThe queries before and after EXCEPT must be SELECT or VALUES statements.\n\nAll behavior for naming columns, ORDER BY and LIMIT is the same as for UNION.\nNote that the alternative SELECT ... OFFSET ... FETCH syntax is only\nsupported. This allows us to use the WITH TIES clause.\n\nEXCEPT implicitly supposes a DISTINCT operation.\n\nThe result of EXCEPT is all records of the left SELECT result except records\nwhich are in right SELECT result set, i.e. it is subtraction of two result\nsets.\n\nEXCEPT and UNION have the same operation precedence and INTERSECT has a higher\nprecedence, unless running in Oracle mode, in which case all three have the\nsame precedence.\n\nMariaDB starting with 10.4.0\n----------------------------\n\nParentheses\n-----------\n\nFrom MariaDB 10.4.0, parentheses can be used to specify precedence. Before\nthis, a syntax error would be returned.\n\nMariaDB starting with 10.5.0\n----------------------------\n\nALL/DISTINCT\n------------\n\nEXCEPT ALL and EXCEPT DISTINCT were introduced in MariaDB 10.5.0. The ALL\noperator leaves duplicates intact, while the DISTINCT operator removes\nduplicates. DISTINCT is the default behavior if neither operator is supplied,\nand the only behavior prior to MariaDB 10.5.\n\nExamples\n--------\n\nShow customers which are not employees:\n\n(SELECT e_name AS name, email FROM customers)\nEXCEPT\n(SELECT c_name AS name, email FROM employees);\n\nDifference between UNION, EXCEPT and INTERSECT. INTERSECT ALL and EXCEPT ALL\nare available from MariaDB 10.5.0.\n\nCREATE TABLE seqs (i INT);\nINSERT INTO seqs VALUES (1),(2),(2),(3),(3),(4),(5),(6);\n\nSELECT i FROM seqs WHERE i <= 3 UNION SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 UNION ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n| 3 |\n| 3 |\n| 3 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n| 3 |\n+------+\n\nParentheses for specifying precedence, from MariaDB 10.4.0\n\nCREATE OR REPLACE TABLE t1 (a INT);\nCREATE OR REPLACE TABLE t2 (b INT);\nCREATE OR REPLACE TABLE t3 (c INT);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4);\nINSERT INTO t2 VALUES (5),(6);\nINSERT INTO t3 VALUES (1),(6);\n\n((SELECT a FROM t1) UNION (SELECT b FROM t2)) EXCEPT (SELECT c FROM t3);\n+------+\n| a |\n+------+\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n+------+\n\n(SELECT a FROM t1) UNION ((SELECT b FROM t2) EXCEPT (SELECT c FROM t3));\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n+------+\n\nHere is an example that makes use of the SEQUENCE storage engine and the\nVALUES statement, to generate a numeric sequence and remove some arbitrary\nnumbers from it:\n\n(SELECT seq FROM seq_1_to_10) EXCEPT VALUES (2), (3), (4);\n+-----+\n| seq |\n+-----+\n| 1 |\n| 5 |\n| 6 |\n| 7 |\n| 8 |\n| 9 |\n| 10 |\n+-----+\n\nURL: https://mariadb.com/kb/en/except/','','https://mariadb.com/kb/en/except/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (430,27,'INTERSECT','MariaDB starting with 10.3.0\n----------------------------\nINTERSECT was introduced in MariaDB 10.3.0.\n\nThe result of an intersect is the intersection of right and left SELECT\nresults, i.e. only records that are present in both result sets will be\nincluded in the result of the operation.\n\nSyntax\n------\n\nSELECT ...\n(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL |\nDISTINCT]) SELECT ...\n[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL |\nDISTINCT]) SELECT ...]\n[ORDER BY [column [, column ...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}]\n\nDescription\n-----------\n\nMariaDB has supported INTERSECT (as well as EXCEPT) in addition to UNION since\nMariaDB 10.3.\n\nAll behavior for naming columns, ORDER BY and LIMIT is the same as for UNION.\n\nINTERSECT implicitly supposes a DISTINCT operation.\n\nThe result of an intersect is the intersection of right and left SELECT\nresults, i.e. only records that are present in both result sets will be\nincluded in the result of the operation.\n\nINTERSECT has higher precedence than UNION and EXCEPT (unless running running\nin Oracle mode, in which case all three have the same precedence). If possible\nit will be executed linearly but if not it will be translated to a subquery in\nthe FROM clause:\n\n(select a,b from t1)\nunion\n(select c,d from t2)\nintersect\n(select e,f from t3)\nunion\n(select 4,4);\n\nwill be translated to:\n\n(select a,b from t1)\nunion\nselect c,d from\n ((select c,d from t2)\n intersect\n (select e,f from t3)) dummy_subselect\nunion\n(select 4,4)\n\nMariaDB starting with 10.4.0\n----------------------------\n\nParentheses\n-----------\n\nFrom MariaDB 10.4.0, parentheses can be used to specify precedence. Before\nthis, a syntax error would be returned.\n\nMariaDB starting with 10.5.0\n----------------------------\n\nALL/DISTINCT\n------------\n\nINTERSECT ALL and INTERSECT DISTINCT were introduced in MariaDB 10.5.0. The\nALL operator leaves duplicates intact, while the DISTINCT operator removes\nduplicates. DISTINCT is the default behavior if neither operator is supplied,\nand the only behavior prior to MariaDB 10.5.\n\nExamples\n--------\n\nShow customers which are employees:\n\n(SELECT e_name AS name, email FROM employees)\nINTERSECT\n(SELECT c_name AS name, email FROM customers);\n\nDifference between UNION, EXCEPT and INTERSECT. INTERSECT ALL and EXCEPT ALL\nare available from MariaDB 10.5.0.\n\nCREATE TABLE seqs (i INT);\nINSERT INTO seqs VALUES (1),(2),(2),(3),(3),(4),(5),(6);\n\nSELECT i FROM seqs WHERE i <= 3 UNION SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 UNION ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n| 3 |\n| 3 |\n| 3 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 EXCEPT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 2 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n+------+\n\nSELECT i FROM seqs WHERE i <= 3 INTERSECT ALL SELECT i FROM seqs WHERE i>=3;\n+------+\n| i |\n+------+\n| 3 |\n| 3 |\n+------+\n\nParentheses for specifying precedence, from MariaDB 10.4.0\n\nCREATE OR REPLACE TABLE t1 (a INT);\nCREATE OR REPLACE TABLE t2 (b INT);\nCREATE OR REPLACE TABLE t3 (c INT);\n\nINSERT INTO t1 VALUES (1),(2),(3),(4);\nINSERT INTO t2 VALUES (5),(6);\nINSERT INTO t3 VALUES (1),(6);\n\n((SELECT a FROM t1) UNION (SELECT b FROM t2)) INTERSECT (SELECT c FROM t3);\n+------+\n| a |\n+------+\n| 1 |\n| 6 |\n+------+\n\n(SELECT a FROM t1) UNION ((SELECT b FROM t2) INTERSECT (SELECT c FROM t3));\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 6 |\n+------+\n\nURL: https://mariadb.com/kb/en/intersect/','','https://mariadb.com/kb/en/intersect/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (431,27,'Precedence Control in Table Operations','MariaDB starting with 10.4.0\n----------------------------\nBeginning in MariaDB 10.4, you can control the ordering of execution on table\noperations using parentheses.\n\nSyntax\n------\n\n( expression )\n[ORDER BY [column[, column...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}]\n\nDescription\n-----------\n\nUsing parentheses in your SQL allows you to control the order of execution for\nSELECT statements and Table Value Constructor, including UNION, EXCEPT, and\nINTERSECT operations. MariaDB executes the parenthetical expression before the\nrest of the statement. You can then use ORDER BY and LIMIT clauses the further\norganize the result-set.\n\nNote: In practice, the Optimizer may rearrange the exact order in which\nMariaDB executes different parts of the statement. When it calculates the\nresult-set, however, it returns values as though the parenthetical expression\nwere executed first.\n\nExample\n-------\n\nCREATE TABLE test.t1 (num INT);\n\nINSERT INTO test.t1 VALUES (1),(2),(3);\n\n(SELECT * FROM test.t1 \n UNION \n VALUES (10)) \nINTERSECT \nVALUES (1),(3),(10),(11);\n+------+\n| num |\n+------+\n| 1 |\n| 3 |\n| 10 |\n+------+\n\n((SELECT * FROM test.t1 \n UNION\n VALUES (10))\n INTERSECT \n VALUES (1),(3),(10),(11)) \nORDER BY 1 DESC;\n+------+\n| num |\n+------+\n| 10 |\n| 3 |\n| 1 |\n+------+\n\nURL: https://mariadb.com/kb/en/precedence-control-in-table-operations/','','https://mariadb.com/kb/en/precedence-control-in-table-operations/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (432,27,'LIMIT','Description\n-----------\n\nUse the LIMIT clause to restrict the number of returned rows. When you use a\nsingle integer n with LIMIT, the first n rows will be returned. Use the ORDER\nBY clause to control which rows come first. You can also select a number of\nrows after an offset using either of the following:\n\nLIMIT offset, row_count\nLIMIT row_count OFFSET offset\n\nWhen you provide an offset m with a limit n, the first m rows will be ignored,\nand the following n rows will be returned.\n\nExecuting an UPDATE with the LIMIT clause is not safe for replication. LIMIT 0\nis an exception to this rule (see MDEV-6170).\n\nThere is a LIMIT ROWS EXAMINED optimization which provides the means to\nterminate the execution of SELECT statements which examine too many rows, and\nthus use too many resources. See LIMIT ROWS EXAMINED.\n\nMulti-Table Updates\n-------------------\n\nMariaDB starting with 10.3.2\n----------------------------\nUntil MariaDB 10.3.1, it was not possible to use LIMIT (or ORDER BY) in a\nmulti-table UPDATE statement. This restriction was lifted in MariaDB 10.3.2.\n\nGROUP_CONCAT\n------------\n\nMariaDB starting with 10.3.2\n----------------------------\nStarting from MariaDB 10.3.3, it is possible to use LIMIT with GROUP_CONCAT().\n\nExamples\n--------\n\nCREATE TABLE members (name VARCHAR(20));\nINSERT INTO members VALUES(\'Jagdish\'),(\'Kenny\'),(\'Rokurou\'),(\'Immaculada\');\n\nSELECT * FROM members;\n+------------+\n| name |\n+------------+\n| Jagdish |\n| Kenny |\n| Rokurou |\n| Immaculada |\n+------------+\n\nSelect the first two names (no ordering specified):\n\nSELECT * FROM members LIMIT 2;\n+---------+\n| name |\n+---------+\n| Jagdish |\n| Kenny |\n+---------+\n\nAll the names in alphabetical order:\n\nSELECT * FROM members ORDER BY name;\n+------------+\n| name |\n+------------+\n| Immaculada |\n| Jagdish |\n| Kenny |\n| Rokurou |\n+------------+\n\nThe first two names, ordered alphabetically:\n\nSELECT * FROM members ORDER BY name LIMIT 2;\n+------------+\n| name |\n+------------+\n| Immaculada |\n| Jagdish |\n+------------+\n\nThe third name, ordered alphabetically (the first name would be offset zero,\nso the third is offset two):\n\nSELECT * FROM members ORDER BY name LIMIT 2,1;\n+-------+\n| name |\n+-------+\n| Kenny |\n+-------+\n\nFrom MariaDB 10.3.2, LIMIT can be used in a multi-table update:\n\nCREATE TABLE warehouse (product_id INT, qty INT);\nINSERT INTO warehouse VALUES (1,100),(2,100),(3,100),(4,100);\n\nCREATE TABLE store (product_id INT, qty INT);\nINSERT INTO store VALUES (1,5),(2,5),(3,5),(4,5);\n\nUPDATE warehouse,store SET warehouse.qty = warehouse.qty-2, store.qty =\nstore.qty+2 \n WHERE (warehouse.product_id = store.product_id AND store.product_id >= 1)\n ORDER BY store.product_id DESC LIMIT 2;\n\nSELECT * FROM warehouse;\n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 100 |\n| 2 | 100 |\n| 3 | 98 |\n| 4 | 98 |\n+------------+------+\n\nSELECT * FROM store;\n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 5 |\n| 2 | 5 |\n| 3 | 7 |\n| 4 | 7 |\n+------------+------+\n\nFrom MariaDB 10.3.3, LIMIT can be used with GROUP_CONCAT, so, for example,\ngiven the following table:\n\nCREATE TABLE d (dd DATE, cc INT);\n\nINSERT INTO d VALUES (\'2017-01-01\',1);\nINSERT INTO d VALUES (\'2017-01-02\',2);\nINSERT INTO d VALUES (\'2017-01-04\',3);\n\nthe following query:\n\nSELECT SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc\nDESC),\",\",1) FROM d;\n+----------------------------------------------------------------------------+\n| SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC),\",\",1) |\n+----------------------------------------------------------------------------+\n| 2017-01-04:3 |\n+----------------------------------------------------------------------------+\n\ncan be more simply rewritten as:\n\nSELECT GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC LIMIT 1) FROM d;\n+-------------------------------------------------------------+\n| GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC LIMIT 1) |\n+-------------------------------------------------------------+\n| 2017-01-04:3 |\n+-------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/limit/','','https://mariadb.com/kb/en/limit/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (433,27,'ORDER BY','Description\n-----------\n\nUse the ORDER BY clause to order a resultset, such as that are returned from a\nSELECT statement. You can specify just a column or use any expression with\nfunctions. If you are using the GROUP BY clause, you can use grouping\nfunctions in ORDER BY. Ordering is done after grouping.\n\nYou can use multiple ordering expressions, separated by commas. Rows will be\nsorted by the first expression, then by the second expression if they have the\nsame value for the first, and so on.\n\nYou can use the keywords ASC and DESC after each ordering expression to force\nthat ordering to be ascending or descending, respectively. Ordering is\nascending by default.\n\nYou can also use a single integer as the ordering expression. If you use an\ninteger n, the results will be ordered by the nth column in the select\nexpression.\n\nWhen string values are compared, they are compared as if by the STRCMP\nfunction. STRCMP ignores trailing whitespace and may normalize characters and\nignore case, depending on the collation in use.\n\nDuplicated entries in the ORDER BY clause are removed.\n\nORDER BY can also be used to order the activities of a DELETE or UPDATE\nstatement (usually with the LIMIT clause).\n\nMariaDB starting with 10.3.2\n----------------------------\nUntil MariaDB 10.3.1, it was not possible to use ORDER BY (or LIMIT) in a\nmulti-table UPDATE statement. This restriction was lifted in MariaDB 10.3.2.\n\nMariaDB starting with 10.5\n--------------------------\nFrom MariaDB 10.5, MariaDB allows packed sort keys and values of non-sorted\nfields in the sort buffer. This can make filesort temporary files much smaller\nwhen VARCHAR, CHAR or BLOBs are used, notably speeding up some ORDER BY sorts.\n\nExamples\n--------\n\nCREATE TABLE seq (i INT, x VARCHAR(1));\nINSERT INTO seq VALUES (1,\'a\'), (2,\'b\'), (3,\'b\'), (4,\'f\'), (5,\'e\');\n\nSELECT * FROM seq ORDER BY i;\n+------+------+\n| i | x |\n+------+------+\n| 1 | a |\n| 2 | b |\n| 3 | b |\n| 4 | f |\n| 5 | e |\n+------+------+\n\nSELECT * FROM seq ORDER BY i DESC;\n+------+------+\n| i | x |\n+------+------+\n| 5 | e |\n| 4 | f |\n| 3 | b |\n| 2 | b |\n| 1 | a |\n+------+------+\n\nSELECT * FROM seq ORDER BY x,i;\n+------+------+\n| i | x |\n+------+------+\n| 1 | a |\n| 2 | b |\n| 3 | b |\n| 5 | e |\n| 4 | f |\n+------+------+\n\nORDER BY in an UPDATE statement, in conjunction with LIMIT:\n\nUPDATE seq SET x=\'z\' WHERE x=\'b\' ORDER BY i DESC LIMIT 1;\n\nSELECT * FROM seq;\n+------+------+\n| i | x |\n+------+------+\n| 1 | a |\n| 2 | b |\n| 3 | z |\n| 4 | f |\n| 5 | e |\n+------+------+\n\nFrom MariaDB 10.3.2, ORDER BY can be used in a multi-table update:\n\nCREATE TABLE warehouse (product_id INT, qty INT);\nINSERT INTO warehouse VALUES (1,100),(2,100),(3,100),(4,100);\n\nCREATE TABLE store (product_id INT, qty INT);\nINSERT INTO store VALUES (1,5),(2,5),(3,5),(4,5);\n\nUPDATE warehouse,store SET warehouse.qty = warehouse.qty-2, store.qty =\nstore.qty+2 \n WHERE (warehouse.product_id = store.product_id AND store.product_id >= 1)\n ORDER BY store.product_id DESC LIMIT 2;\n\nSELECT * FROM warehouse;\n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 100 |\n| 2 | 100 |\n| 3 | 98 |\n| 4 | 98 |\n+------------+------+\n\nSELECT * FROM store;\n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 5 |\n| 2 | 5 |\n| 3 | 7 |\n| 4 | 7 |\n+------------+------+\n\nURL: https://mariadb.com/kb/en/order-by/','','https://mariadb.com/kb/en/order-by/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (434,27,'GROUP BY','Use the GROUP BY clause in a SELECT statement to group rows together that have\nthe same value in one or more column, or the same computed value using\nexpressions with any functions and operators except grouping functions. When\nyou use a GROUP BY clause, you will get a single result row for each group of\nrows that have the same value for the expression given in GROUP BY.\n\nWhen grouping rows, grouping values are compared as if by the = operator. For\nstring values, the = operator ignores trailing whitespace and may normalize\ncharacters and ignore case, depending on the collation in use.\n\nYou can use any of the grouping functions in your select expression. Their\nvalues will be calculated based on all the rows that have been grouped\ntogether for each result row. If you select a non-grouped column or a value\ncomputed from a non-grouped column, it is undefined which row the returned\nvalue is taken from. This is not permitted if the ONLY_FULL_GROUP_BY SQL_MODE\nis used.\n\nYou can use multiple expressions in the GROUP BY clause, separated by commas.\nRows are grouped together if they match on each of the expressions.\n\nYou can also use a single integer as the grouping expression. If you use an\ninteger n, the results will be grouped by the nth column in the select\nexpression.\n\nThe WHERE clause is applied before the GROUP BY clause. It filters\nnon-aggregated rows before the rows are grouped together. To filter grouped\nrows based on aggregate values, use the HAVING clause. The HAVING clause takes\nany expression and evaluates it as a boolean, just like the WHERE clause. You\ncan use grouping functions in the HAVING clause. As with the select\nexpression, if you reference non-grouped columns in the HAVING clause, the\nbehavior is undefined.\n\nBy default, if a GROUP BY clause is present, the rows in the output will be\nsorted by the expressions used in the GROUP BY. You can also specify ASC or\nDESC (ascending, descending) after those expressions, like in ORDER BY. The\ndefault is ASC.\n\nIf you want the rows to be sorted by another field, you can add an explicit\nORDER BY. If you don\'t want the result to be ordered, you can add ORDER BY\nNULL.\n\nWITH ROLLUP\n-----------\n\nThe WITH ROLLUP modifer adds extra rows to the resultset that represent\nsuper-aggregate summaries. For a full description with examples, see SELECT\nWITH ROLLUP.\n\nGROUP BY Examples\n-----------------\n\nConsider the following table that records how many times each user has played\nand won a game:\n\nCREATE TABLE plays (name VARCHAR(16), plays INT, wins INT);\nINSERT INTO plays VALUES \n (\"John\", 20, 5),\n (\"Robert\", 22, 8),\n (\"Wanda\", 32, 8),\n (\"Susan\", 17, 3);\n\nGet a list of win counts along with a count:\n\nSELECT wins, COUNT(*) FROM plays GROUP BY wins;\n+------+----------+\n| wins | COUNT(*) |\n+------+----------+\n| 3 | 1 |\n| 5 | 1 |\n| 8 | 2 |\n+------+----------+\n3 rows in set (0.00 sec)\n\nThe GROUP BY expression can be a computed value, and can refer back to an\nidentifer specified with AS. Get a list of win averages along with a count:\n\nSELECT (wins / plays) AS winavg, COUNT(*) FROM plays GROUP BY winavg;\n+--------+----------+\n| winavg | COUNT(*) |\n+--------+----------+\n| 0.1765 | 1 |\n| 0.2500 | 2 |\n| 0.3636 | 1 |\n+--------+----------+\n3 rows in set (0.00 sec)\n\nYou can use any grouping function in the select expression. For each win\naverage as above, get a list of the average play count taken to get that\naverage:\n\nSELECT (wins / plays) AS winavg, AVG(plays) FROM plays \n GROUP BY winavg;\n+--------+------------+\n| winavg | AVG(plays) |\n+--------+------------+\n| 0.1765 | 17.0000 |\n| 0.2500 | 26.0000 |\n| 0.3636 | 22.0000 |\n+--------+------------+\n3 rows in set (0.00 sec)\n\nYou can filter on aggregate information using the HAVING clause. The HAVING\nclause is applied after GROUP BY and allows you to filter on aggregate data\nthat is not available to the WHERE clause. Restrict the above example to\nresults that involve an average number of plays over 20:\n\nSELECT (wins / plays) AS winavg, AVG(plays) FROM plays \n GROUP BY winavg HAVING AVG(plays) > 20;\n+--------+------------+\n| winavg | AVG(plays) |\n+--------+------------+\n| 0.2500 | 26.0000 |\n| 0.3636 | 22.0000 |\n+--------+------------+\n2 rows in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/group-by/','','https://mariadb.com/kb/en/group-by/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (435,27,'WITH','MariaDB starting with 10.2.1\n----------------------------\nCommon Table Expressions were introduced in MariaDB 10.2.1.\n\nSyntax\n------\n\nWITH [RECURSIVE] table_reference [(columns_list)] AS (\n SELECT ...\n)\n[CYCLE cycle_column_list RESTRICT]\nSELECT ...\n\nDescription\n-----------\n\nThe WITH keyword signifies a Common Table Expression (CTE). It allows you to\nrefer to a subquery expression many times in a query, as if having a temporary\ntable that only exists for the duration of a query.\n\nThere are two kinds of CTEs:\n\n* Non-Recursive\n* Recursive (signified by the RECURSIVE keyword, supported since MariaDB\n10.2.2)\n\nYou can use table_reference as any normal table in the external SELECT part.\nYou can also use WITH in subqueries, as well as with EXPLAIN and SELECT.\n\nPoorly-formed recursive CTEs can in theory cause infinite loops. The\nmax_recursive_iterations system variable limits the number of recursions.\n\nCYCLE ... RESTRICT\n------------------\n\nMariaDB starting with 10.5.2\n----------------------------\nThe CYCLE clause enables CTE cycle detection, avoiding excessive or infinite\nloops, MariaDB supports a relaxed, non-standard grammar.\n\nThe SQL Standard permits a CYCLE clause, as follows:\n\nWITH RECURSIVE ... (\n ...\n)\nCYCLE <cycle column list>\nSET <cycle mark column> TO <cycle mark value> DEFAULT <non-cycle mark value>\nUSING <path column>\n\nwhere all clauses are mandatory.\n\nMariaDB does not support this, but from 10.5.2 permits a non-standard relaxed\ngrammar, as follows:\n\nWITH RECURSIVE ... (\n ...\n)\nCYCLE <cycle column list> RESTRICT\n\nWith the use of CYCLE ... RESTRICT it makes no difference whether the CTE uses\nUNION ALL or UNION DISTINCT anymore. UNION ALL means \"all rows, but without\ncycles\", which is exactly what the CYCLE clause enables. And UNION DISTINCT\nmeans all rows should be different, which, again, is what will happen — as\nuniqueness is enforced over a subset of columns, complete rows will\nautomatically all be different.\n\nExamples\n--------\n\nBelow is an example with the WITH at the top level:\n\nWITH t AS (SELECT a FROM t1 WHERE b >= \'c\') \n SELECT * FROM t2, t WHERE t2.c = t.a;\n\nThe example below uses WITH in a subquery:\n\nSELECT t1.a, t1.b FROM t1, t2\n WHERE t1.a > t2.c\n AND t2.c IN(WITH t AS (SELECT * FROM t1 WHERE t1.a < 5)\n SELECT t2.c FROM t2, t WHERE t2.c = t.a);\n\nBelow is an example of a Recursive CTE:\n\nWITH RECURSIVE ancestors AS \n ( SELECT * FROM folks\n WHERE name=\"Alex\"\n UNION\n SELECT f.*\n FROM folks AS f, ancestors AS a\n WHERE f.id = a.father OR f.id = a.mother )\nSELECT * FROM ancestors;\n\nTake the following structure, and data,\n\nCREATE TABLE t1 (from_ int, to_ int);\nINSERT INTO t1 VALUES (1,2), (1,100), (2,3), (3,4), (4,1);\nSELECT * FROM t1;\n+-------+------+\n| from_ | to_ |\n+-------+------+\n| 1 | 2 |\n| 1 | 100 |\n| 2 | 3 |\n| 3 | 4 |\n| 4 | 1 |\n+-------+------+\n\nGiven the above, the following query would theoretically result in an infinite\nloop due to the last record in t1 (note that max_recursive_iterations is set\nto 10 for the purposes of this example, to avoid the excessive number of\ncycles):\n\nSET max_recursive_iterations=10;\n\nWITH RECURSIVE cte (depth, from_, to_) AS ( \n SELECT 0,1,1 UNION DISTINCT SELECT depth+1, t1.from_, t1.to_\n FROM t1, cte WHERE t1.from_ = cte.to_\n) \nSELECT * FROM cte;\n+-------+-------+------+\n| depth | from_ | to_ |\n+-------+-------+------+\n| 0 | 1 | 1 |\n| 1 | 1 | 2 |\n| 1 | 1 | 100 |\n| 2 | 2 | 3 |\n| 3 | 3 | 4 |\n| 4 | 4 | 1 |\n| 5 | 1 | 2 |\n| 5 | 1 | 100 |\n| 6 | 2 | 3 |\n| 7 | 3 | 4 |\n| 8 | 4 | 1 |\n| 9 | 1 | 2 |\n| 9 | 1 | 100 |\n| 10 | 2 | 3 |\n+-------+-------+------+\n\nHowever, the CYCLE ... RESTRICT clause (from MariaDB 10.5.2) can overcome this:\n\nWITH RECURSIVE cte (depth, from_, to_) AS ( \n SELECT 0,1,1 UNION SELECT depth+1, t1.from_, t1.to_\n FROM t1, cte WHERE t1.from_ = cte.to_\n) \nCYCLE from_, to_ RESTRICT \nSELECT * FROM cte;\n+-------+-------+------+\n| depth | from_ | to_ |\n+-------+-------+------+\n| 0 | 1 | 1 |\n| 1 | 1 | 2 |\n| 1 | 1 | 100 |\n| 2 | 2 | 3 |\n| 3 | 3 | 4 |\n| 4 | 4 | 1 |\n+-------+-------+------+\n\nURL: https://mariadb.com/kb/en/with/','','https://mariadb.com/kb/en/with/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (436,27,'Non-Recursive Common Table Expressions Overview','Common Table Expressions (CTEs) are a standard SQL feature, and are\nessentially temporary named result sets. There are two kinds of CTEs:\nNon-Recursive, which this article covers; and Recursive.\n\nMariaDB starting with 10.2.1\n----------------------------\nCommon table expressions were introduced in MariaDB 10.2.1.\n\nNon-Recursive CTEs\n------------------\n\nThe WITH keyword signifies a CTE. It is given a name, followed by a body (the\nmain query) as follows:\n\nCTEs are similar to derived tables. For example\n\nWITH engineers AS \n ( SELECT * FROM employees\n WHERE dept = \'Engineering\' )\n\nSELECT * FROM engineers\nWHERE ...\n\nSELECT * FROM\n ( SELECT * FROM employees\n WHERE dept = \'Engineering\' ) AS engineers\nWHERE\n...\n\nA non-recursive CTE is basically a query-local VIEW. There are several\nadvantages and caveats to them. The syntax is more readable than nested FROM\n(SELECT ...). A CTE can refer to another and it can be referenced from\nmultiple places.\n\nA CTE referencing Another CTE\n-----------------------------\n\nUsing this format makes for a more readable SQL than a nested FROM(SELECT ...)\nclause. Below is an example of this:\n\nWITH engineers AS (\nSELECT * FROM employees\nWHERE dept IN(\'Development\',\'Support\') ),\neu_engineers AS ( SELECT * FROM engineers WHERE country IN(\'NL\',...) )\nSELECT\n...\nFROM eu_engineers;\n\nMultiple Uses of a CTE\n----------------------\n\nThis can be an \'anti-self join\', for example:\n\nWITH engineers AS (\nSELECT * FROM employees\nWHERE dept IN(\'Development\',\'Support\') )\n\nSELECT * FROM engineers E1\nWHERE NOT EXISTS\n (SELECT 1 FROM engineers E2\n WHERE E2.country=E1.country\n AND E2.name <> E1.name );\n\nOr, for year-over-year comparisons, for example:\n\nWITH sales_product_year AS (\nSELECT product, YEAR(ship_date) AS year,\nSUM(price) AS total_amt\nFROM item_sales\nGROUP BY product, year )\n\nSELECT *\nFROM sales_product_year CUR,\nsales_product_year PREV,\nWHERE CUR.product=PREV.product \nAND CUR.year=PREV.year + 1 \nAND CUR.total_amt > PREV.total_amt\n\nAnother use is to compare individuals against their group. Below is an example\nof how this might be executed:\n\nWITH sales_product_year AS (\nSELECT product,\nYEAR(ship_date) AS year,\nSUM(price) AS total_amt\nFROM item_sales\nGROUP BY product, year\n)\n\nSELECT * \nFROM sales_product_year S1\nWHERE\ntotal_amt > \n (SELECT 0.1 * SUM(total_amt)\n FROM sales_product_year S2\n WHERE S2.year = S1.year)\n\nURL: https://mariadb.com/kb/en/non-recursive-common-table-expressions-overview/','','https://mariadb.com/kb/en/non-recursive-common-table-expressions-overview/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (437,27,'Recursive Common Table Expressions Overview','MariaDB starting with 10.2.2\n----------------------------\nRecursive Common Table Expressions have been supported since MariaDB 10.2.2.\n\nCommon Table Expressions (CTEs) are a standard SQL feature, and are\nessentially temporary named result sets. CTEs first appeared in the SQL\nstandard in 1999, and the first implementations began appearing in 2007.\n\nThere are two kinds of CTEs:\n\n* Non-recursive\n* Recursive, which this article covers.\n\nSQL is generally poor at recursive structures.\n\nCTEs permit a query to reference itself. A recursive CTE will repeatedly\nexecute subsets of the data until it obtains the complete result set. This\nmakes it particularly useful for handing hierarchical or tree-structured data.\nmax_recursive_iterations avoids infinite loops.\n\nSyntax example\n--------------\n\nWITH RECURSIVE signifies a recursive CTE. It is given a name, followed by a\nbody (the main query) as follows:\n\nComputation\n-----------\n\nGiven the following structure:\n\nFirst execute the anchor part of the query:\n\nNext, execute the recursive part of the query:\n\nSummary so far\n--------------\n\nwith recursive R as (\n select anchor_data\n union [all]\n select recursive_part\n from R, ...\n)\nselect ...\n\n* Compute anchor_data\n* Compute recursive_part to get the new data\n* if (new data is non-empty) goto 2;\n\nCAST to avoid truncating data\n-----------------------------\n\nAs currently implemented by MariaDB and by the SQL Standard, data may be\ntruncated if not correctly cast. It is necessary to CAST the column to the\ncorrect width if the CTE\'s recursive part produces wider values for a column\nthan the CTE\'s nonrecursive part. Some other DBMS give an error in this\nsituation, and MariaDB\'s behavior may change in future - see MDEV-12325. See\nthe examples below.\n\nExamples\n--------\n\nTransitive closure - determining bus destinations\n-------------------------------------------------\n\nSample data:\n\nCREATE TABLE bus_routes (origin varchar(50), dst varchar(50));\nINSERT INTO bus_routes VALUES \n (\'New York\', \'Boston\'),\n (\'Boston\', \'New York\'),\n (\'New York\', \'Washington\'),\n (\'Washington\', \'Boston\'),\n (\'Washington\', \'Raleigh\');\n\nNow, we want to return the bus destinations with New York as the origin:\n\nWITH RECURSIVE bus_dst as ( \n SELECT origin as dst FROM bus_routes WHERE origin=\'New York\'\n UNION\n SELECT bus_routes.dst FROM bus_routes JOIN bus_dst ON bus_dst.dst=\nbus_routes.origin \n) \nSELECT * FROM bus_dst;\n+------------+\n| dst |\n+------------+\n| New York |\n| Boston |\n| Washington |\n| Raleigh |\n+------------+\n\nThe above example is computed as follows:\n\nFirst, the anchor data is calculated:\n\n* Starting from New York\n* Boston and Washington are added\n\nNext, the recursive part:\n\n* Starting from Boston and then Washington\n* Raleigh is added\n* UNION excludes nodes that are already present.\n\nComputing paths - determining bus routes\n----------------------------------------\n\nThis time, we are trying to get bus routes such as \"New York -> Washington ->\nRaleigh\".\n\nUsing the same sample data as the previous example:\n\nWITH RECURSIVE paths (cur_path, cur_dest) AS (\n SELECT origin, origin FROM bus_routes WHERE origin=\'New York\'\n UNION\n SELECT CONCAT(paths.cur_path, \',\', bus_routes.dst), bus_routes.dst\n FROM paths\n JOIN bus_routes\n ON paths.cur_dest = bus_routes.origin AND\n NOT FIND_IN_SET(bus_routes.dst, paths.cur_path)\n) \nSELECT * FROM paths;\n+-----------------------------+------------+\n| cur_path | cur_dest |\n+-----------------------------+------------+\n| New York | New York |\n| New York,Boston | Boston |\n| New York,Washington | Washington |\n| New York,Washington,Boston | Boston |\n| New York,Washington,Raleigh | Raleigh |\n+-----------------------------+------------+\n\nCAST to avoid data truncation\n-----------------------------\n\nIn the following example, data is truncated because the results are not\nspecifically cast to a wide enough type:\n\nWITH RECURSIVE tbl AS (\n SELECT NULL AS col\n UNION\n SELECT \"THIS NEVER SHOWS UP\" AS col FROM tbl\n)\nSELECT col FROM tbl\n+------+\n| col |\n+------+\n| NULL |\n| |\n+------+\n\nExplicitly use CAST to overcome this:\n\nWITH RECURSIVE tbl AS (\n SELECT CAST(NULL AS CHAR(50)) AS col\n UNION SELECT \"THIS NEVER SHOWS UP\" AS col FROM tbl\n) \nSELECT * FROM tbl;\n+---------------------+\n| col |\n+---------------------+\n| NULL |\n| THIS NEVER SHOWS UP |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/recursive-common-table-expressions-overview/','','https://mariadb.com/kb/en/recursive-common-table-expressions-overview/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (438,27,'SELECT WITH ROLLUP','Syntax\n------\n\nSee SELECT for the full syntax.\n\nDescription\n-----------\n\nThe WITH ROLLUP modifier adds extra rows to the resultset that represent\nsuper-aggregate summaries. The super-aggregated column is represented by a\nNULL value. Multiple aggregates over different columns will be added if there\nare multiple GROUP BY columns.\n\nThe LIMIT clause can be used at the same time, and is applied after the WITH\nROLLUP rows have been added.\n\nWITH ROLLUP cannot be used with ORDER BY. Some sorting is still possible by\nusing ASC or DESC clauses with the GROUP BY column, although the\nsuper-aggregate rows will always be added last.\n\nExamples\n--------\n\nThese examples use the following sample table\n\nCREATE TABLE booksales ( \n country VARCHAR(35), genre ENUM(\'fiction\',\'non-fiction\'), year YEAR, sales\nINT);\n\nINSERT INTO booksales VALUES\n (\'Senegal\',\'fiction\',2014,12234), (\'Senegal\',\'fiction\',2015,15647),\n (\'Senegal\',\'non-fiction\',2014,64980), (\'Senegal\',\'non-fiction\',2015,78901),\n (\'Paraguay\',\'fiction\',2014,87970), (\'Paraguay\',\'fiction\',2015,76940),\n (\'Paraguay\',\'non-fiction\',2014,8760), (\'Paraguay\',\'non-fiction\',2015,9030);\n\nThe addition of the WITH ROLLUP modifier in this example adds an extra row\nthat aggregates both years:\n\nSELECT year, SUM(sales) FROM booksales GROUP BY year;\n+------+------------+\n| year | SUM(sales) |\n+------+------------+\n| 2014 | 173944 |\n| 2015 | 180518 |\n+------+------------+\n2 rows in set (0.08 sec)\n\nSELECT year, SUM(sales) FROM booksales GROUP BY year WITH ROLLUP;\n+------+------------+\n| year | SUM(sales) |\n+------+------------+\n| 2014 | 173944 |\n| 2015 | 180518 |\n| NULL | 354462 |\n+------+------------+\n\nIn the following example, each time the genre, the year or the country change,\nanother super-aggregate row is added:\n\nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year, genre;\n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2015 | fiction | 76940 |\n| Paraguay | 2015 | non-fiction | 9030 |\n| Senegal | 2014 | fiction | 12234 |\n| Senegal | 2014 | non-fiction | 64980 |\n| Senegal | 2015 | fiction | 15647 |\n| Senegal | 2015 | non-fiction | 78901 |\n+----------+------+-------------+------------+\n\nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year, genre WITH ROLLUP;\n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2014 | NULL | 96730 |\n| Paraguay | 2015 | fiction | 76940 |\n| Paraguay | 2015 | non-fiction | 9030 |\n| Paraguay | 2015 | NULL | 85970 |\n| Paraguay | NULL | NULL | 182700 |\n| Senegal | 2014 | fiction | 12234 |\n| Senegal | 2014 | non-fiction | 64980 |\n| Senegal | 2014 | NULL | 77214 |\n| Senegal | 2015 | fiction | 15647 |\n| Senegal | 2015 | non-fiction | 78901 |\n| Senegal | 2015 | NULL | 94548 |\n| Senegal | NULL | NULL | 171762 |\n| NULL | NULL | NULL | 354462 |\n+----------+------+-------------+------------+\n\nThe LIMIT clause, applied after WITH ROLLUP:\n\nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year, genre WITH ROLLUP LIMIT 4;\n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2014 | NULL | 96730 |\n| Paraguay | 2015 | fiction | 76940 |\n+----------+------+-------------+------------+\n\nSorting by year descending:\n\nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year DESC, genre WITH ROLLUP;\n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2015 | fiction | 76940 |\n| Paraguay | 2015 | non-fiction | 9030 |\n| Paraguay | 2015 | NULL | 85970 |\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2014 | NULL | 96730 |\n| Paraguay | NULL | NULL | 182700 |\n| Senegal | 2015 | fiction | 15647 |\n| Senegal | 2015 | non-fiction | 78901 |\n| Senegal | 2015 | NULL | 94548 |\n| Senegal | 2014 | fiction | 12234 |\n| Senegal | 2014 | non-fiction | 64980 |\n| Senegal | 2014 | NULL | 77214 |\n| Senegal | NULL | NULL | 171762 |\n| NULL | NULL | NULL | 354462 |\n+----------+------+-------------+------------+\n\nURL: https://mariadb.com/kb/en/select-with-rollup/','','https://mariadb.com/kb/en/select-with-rollup/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (439,27,'SELECT INTO OUTFILE','Syntax\n------\n\nSELECT ... INTO OUTFILE \'file_name\'\n [CHARACTER SET charset_name]\n [export_options]\n\nexport_options:\n [{FIELDS | COLUMNS}\n [TERMINATED BY \'string\']\n [[OPTIONALLY] ENCLOSED BY \'char\']\n [ESCAPED BY \'char\']\n ]\n [LINES\n [STARTING BY \'string\']\n [TERMINATED BY \'string\']\n ]\n\nDescription\n-----------\n\nSELECT INTO OUTFILE writes the resulting rows to a file, and allows the use of\ncolumn and row terminators to specify a particular output format. The default\nis to terminate fields with tabs (\\t) and lines with newlines (\\n).\n\nThe file must not exist. It cannot be overwritten. A user needs the FILE\nprivilege to run this statement. Also, MariaDB needs permission to write files\nin the specified location. If the secure_file_priv system variable is set to a\nnon-empty directory name, the file can only be written to that directory.\n\nThe LOAD DATA INFILE statement complements SELECT INTO OUTFILE.\n\nCharacter-sets\n--------------\n\nThe CHARACTER SET clause specifies the character set in which the results are\nto be written. Without the clause, no conversion takes place (the binary\ncharacter set). In this case, if there are multiple character sets, the output\nwill contain these too, and may not easily be able to be reloaded.\n\nIn cases where you have two servers using different character-sets, using\nSELECT INTO OUTFILE to transfer data from one to the other can have unexpected\nresults. To ensure that MariaDB correctly interprets the escape sequences, use\nthe CHARACTER SET clause on both the SELECT INTO OUTFILE statement and the\nsubsequent LOAD DATA INFILE statement.\n\nExample\n-------\n\nThe following example produces a file in the CSV format:\n\nSELECT customer_id, firstname, surname from customer\n INTO OUTFILE \'/exportdata/customers.txt\'\n FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'\"\'\n LINES TERMINATED BY \'\\n\';\n\nThe following ANSI syntax is also supported for simple SELECT without UNION\n\nSELECT customer_id, firstname, surname INTO OUTFILE \'/exportdata/customers.txt\'\n FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'\"\'\n LINES TERMINATED BY \'\\n\'\n FROM customers;\n\nIf you want to use the ANSI syntax with UNION or similar construct you have to\nuse the syntax:\n\nSELECT * INTO OUTFILE \"/tmp/skr3\" FROM (SELECT * FROM t1 UNION SELECT * FROM\nt1);\n\nURL: https://mariadb.com/kb/en/select-into-outfile/','','https://mariadb.com/kb/en/select-into-outfile/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (440,27,'SELECT INTO DUMPFILE','Syntax\n------\n\nSELECT ... INTO DUMPFILE \'file_path\'\n\nDescription\n-----------\n\nSELECT ... INTO DUMPFILE is a SELECT clause which writes the resultset into a\nsingle unformatted row, without any separators, in a file. The results will\nnot be returned to the client.\n\nfile_path can be an absolute path, or a relative path starting from the data\ndirectory. It can only be specified as a string literal, not as a variable.\nHowever, the statement can be dynamically composed and executed as a prepared\nstatement to work around this limitation.\n\nThis statement is binary-safe and so is particularly useful for writing BLOB\nvalues to file. It can be used, for example, to copy an image or an audio\ndocument from the database to a file. SELECT ... INTO FILE can be used to save\na text file.\n\nThe file must not exist. It cannot be overwritten. A user needs the FILE\nprivilege to run this statement. Also, MariaDB needs permission to write files\nin the specified location. If the secure_file_priv system variable is set to a\nnon-empty directory name, the file can only be written to that directory.\n\nSince MariaDB 5.1, the character_set_filesystem system variable has controlled\ninterpretation of file names that are given as literal strings.\n\nExample\n-------\n\nSELECT _utf8\'Hello world!\' INTO DUMPFILE \'/tmp/world\';\n\nSELECT LOAD_FILE(\'/tmp/world\') AS world;\n+--------------+\n| world |\n+--------------+\n| Hello world! |\n+--------------+\n\nURL: https://mariadb.com/kb/en/select-into-dumpfile/','','https://mariadb.com/kb/en/select-into-dumpfile/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (441,27,'FOR UPDATE','InnoDB supports row-level locking. Selected rows can be locked using LOCK IN\nSHARE MODE or FOR UPDATE. In both cases, a lock is acquired on the rows read\nby the query, and it will be released when the current transaction is\ncommitted.\n\nThe FOR UPDATE clause of SELECT applies only when autocommit is set to 0 or\nthe SELECT is enclosed in a transaction. A lock is acquired on the rows, and\nother transactions are prevented from writing the rows, acquire locks, and\nfrom reading them (unless their isolation level is READ UNCOMMITTED).\n\nIf autocommit is set to 1, the LOCK IN SHARE MODE and FOR UPDATE clauses have\nno effect.\n\nIf the isolation level is set to SERIALIZABLE, all plain SELECT statements are\nconverted to SELECT ... LOCK IN SHARE MODE.\n\nExample\n-------\n\nSELECT * FROM trans WHERE period=2001 FOR UPDATE;\n\nURL: https://mariadb.com/kb/en/for-update/','','https://mariadb.com/kb/en/for-update/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (442,27,'LOCK IN SHARE MODE','InnoDB supports row-level locking. Selected rows can be locked using LOCK IN\nSHARE MODE or FOR UPDATE. In both cases, a lock is acquired on the rows read\nby the query, and it will be released when the current transaction is\ncommitted.\n\nWhen LOCK IN SHARE MODE is specified in a SELECT statement, MariaDB will wait\nuntil all transactions that have modified the rows are committed. Then, a\nwrite lock is acquired. All transactions can read the rows, but if they want\nto modify them, they have to wait until your transaction is committed.\n\nIf autocommit is set to 1, the LOCK IN SHARE MODE and FOR UPDATE clauses have\nno effect.\n\nURL: https://mariadb.com/kb/en/lock-in-share-mode/','','https://mariadb.com/kb/en/lock-in-share-mode/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (443,27,'Optimizer Hints','Optimizer hints\n---------------\n\nThere are some options available in SELECT to affect the execution plan. These\nare known as optimizer hints.\n\nHIGH PRIORITY\n-------------\n\nHIGH_PRIORITY gives the statement a higher priority. If the table is locked,\nhigh priority SELECTs will be executed as soon as the lock is released, even\nif other statements are queued. HIGH_PRIORITY applies only if the storage\nengine only supports table-level locking (MyISAM, MEMORY, MERGE). See\nHIGH_PRIORITY and LOW_PRIORITY clauses for details.\n\nSQL_CACHE / SQL_NO_CACHE\n------------------------\n\nIf the query_cache_type system variable is set to 2 or DEMAND, and the current\nstatement is cacheable, SQL_CACHE causes the query to be cached and\nSQL_NO_CACHE causes the query not to be cached. For UNIONs, SQL_CACHE or\nSQL_NO_CACHE should be specified for the first query. See also The Query Cache\nfor more detail and a list of the types of statements that aren\'t cacheable.\n\nSQL_BUFFER_RESULT\n-----------------\n\nSQL_BUFFER_RESULT forces the optimizer to use a temporary table to process the\nresult. This is useful to free locks as soon as possible.\n\nSQL_SMALL_RESULT / SQL_BIG_RESULT\n---------------------------------\n\nSQL_SMALL_RESULT and SQL_BIG_RESULT tell the optimizer whether the result is\nvery big or not. Usually, GROUP BY and DISTINCT operations are performed using\na temporary table. Only if the result is very big, using a temporary table is\nnot convenient. The optimizer automatically knows if the result is too big,\nbut you can force the optimizer to use a temporary table with\nSQL_SMALL_RESULT, or avoid the temporary table using SQL_BIG_RESULT.\n\nSTRAIGHT_JOIN\n-------------\n\nSTRAIGHT_JOIN applies to the JOIN queries, and tells the optimizer that the\ntables must be read in the order they appear in the SELECT. For const and\nsystem table this options is sometimes ignored.\n\nSQL_CALC_FOUND_ROWS\n-------------------\n\nSQL_CALC_FOUND_ROWS is only applied when using the LIMIT clause. If this\noption is used, MariaDB will count how many rows would match the query,\nwithout the LIMIT clause. That number can be retrieved in the next query,\nusing FOUND_ROWS().\n\nUSE/FORCE/IGNORE INDEX\n----------------------\n\nUSE INDEX, FORCE INDEX and IGNORE INDEX constrain the query planning to a\nspecific index.\n\nFor further information about some of these options, see How to force query\nplans.\n\nURL: https://mariadb.com/kb/en/optimizer-hints/','','https://mariadb.com/kb/en/optimizer-hints/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (444,27,'PROCEDURE','The PROCEDURE clause of SELECT passes the whole result set to a Procedure\nwhich will process it. These Procedures are not Stored Procedures, and can\nonly be written in the C language, so it is necessary to recompile the server.\n\nCurrently, the only available procedure is ANALYSE, which examines the\nresultset and suggests the optimal datatypes for each column. It is defined in\nthe sql/sql_analyse.cc file, and can be used as an example to create more\nProcedures.\n\nThis clause cannot be used in a view\'s definition.\n\nURL: https://mariadb.com/kb/en/procedure/','','https://mariadb.com/kb/en/procedure/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (445,27,'DUAL','Description\n-----------\n\nYou are allowed to specify DUAL as a dummy table name in situations where no\ntables are referenced, such as the following SELECT statement:\n\nSELECT 1 + 1 FROM DUAL;\n+-------+\n| 1 + 1 |\n+-------+\n| 2 |\n+-------+\n\nDUAL is purely for the convenience of people who require that all SELECT\nstatements should have FROM and possibly other clauses. MariaDB ignores the\nclauses. MariaDB does not require FROM DUAL if no tables are referenced.\n\nFROM DUAL could be used when you only SELECT computed values, but require a\nWHERE clause, perhaps to test that a script correctly handles empty resultsets:\n\nSELECT 1 FROM DUAL WHERE FALSE;\nEmpty set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/dual/','','https://mariadb.com/kb/en/dual/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (446,27,'SELECT ... OFFSET ... FETCH','MariaDB starting with 10.6.0\n----------------------------\nSELECT ... OFFSET ... FETCH was introduced in MariaDB 10.6.\n\nSyntax\n------\n\nOFFSET start { ROW | ROWS }\nFETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }\n\nDescription\n-----------\n\nThe OFFSET clause allows one to return only those elements of a resultset that\ncome after a specified offset. The FETCH clause specifies the number of rows\nto return, while ONLY or WITH TIES specifies whether or not to also return any\nfurther results that tie for last place according to the ordered resultset.\n\nEither the singular ROW or the plural ROWS can be used after the OFFSET and\nFETCH clauses; the choice has no impact on the results.\n\nIn the case of WITH TIES, an ORDER BY clause is required, otherwise an ERROR\nwill be returned.\n\nSELECT i FROM t1 FETCH FIRST 2 ROWS WITH TIES;\nERROR 4180 (HY000): FETCH ... WITH TIES requires ORDER BY clause to be present\n\nExamples\n--------\n\nGiven a table with 6 rows:\n\nCREATE OR REPLACE TABLE t1 (i INT);\nINSERT INTO t1 VALUES (1),(2),(3),(4), (4), (5);\nSELECT i FROM t1 ORDER BY i ASC;\n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 4 |\n| 5 |\n+------+\n\nOFFSET 2 allows one to skip the first two results.\n\nSELECT i FROM t1 ORDER BY i ASC OFFSET 2 ROWS;\n+------+\n| i |\n+------+\n| 3 |\n| 4 |\n| 4 |\n| 5 |\n+------+\n\nFETCH FIRST 3 ROWS ONLY limits the results to three rows only\n\nSELECT i FROM t1 ORDER BY i ASC OFFSET 1 ROWS FETCH FIRST 3 ROWS ONLY;\n+------+\n| i |\n+------+\n| 2 |\n| 3 |\n| 4 |\n+------+\n\nThe same outcome can also be achieved with the LIMIT clause:\n\nSELECT i FROM t1 ORDER BY i ASC LIMIT 3 OFFSET 1;\n+------+\n| i |\n+------+\n| 2 |\n| 3 |\n| 4 |\n+------+\n\nWITH TIES ensures the tied result 4 is also returned.\n\nSELECT i FROM t1 ORDER BY i ASC OFFSET 1 ROWS FETCH FIRST 3 ROWS WITH TIES;\n+------+\n| i |\n+------+\n| 2 |\n| 3 |\n| 4 |\n| 4 |\n+------+\n\nURL: https://mariadb.com/kb/en/select-offset-fetch/','','https://mariadb.com/kb/en/select-offset-fetch/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (447,27,'INSERT','Syntax\n------\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nOr:\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nOr:\n\nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nThe INSERT statement is used to insert new rows into an existing table. The\nINSERT ... VALUES and INSERT ... SET forms of the statement insert rows based\non explicitly specified values. The INSERT ... SELECT form inserts rows\nselected from another table or tables. INSERT ... SELECT is discussed further\nin the INSERT ... SELECT article.\n\nThe table name can be specified in the form db_name.tbl_name or, if a default\ndatabase is selected, in the form tbl_name (see Identifier Qualifiers). This\nallows to use INSERT ... SELECT to copy rows between different databases.\n\nThe PARTITION clause can be used in both the INSERT and the SELECT part. See\nPartition Pruning and Selection for details.\n\nMariaDB starting with 10.5\n--------------------------\nThe RETURNING clause was introduced in MariaDB 10.5.\n\nThe columns list is optional. It specifies which values are explicitly\ninserted, and in which order. If this clause is not specified, all values must\nbe explicitly specified, in the same order they are listed in the table\ndefinition.\n\nThe list of value follow the VALUES or VALUE keyword (which are\ninterchangeable, regardless how much values you want to insert), and is\nwrapped by parenthesis. The values must be listed in the same order as the\ncolumns list. It is possible to specify more than one list to insert more than\none rows with a single statement. If many rows are inserted, this is a speed\noptimization.\n\nFor one-row statements, the SET clause may be more simple, because you don\'t\nneed to remember the columns order. All values are specified in the form col =\nexpr.\n\nValues can also be specified in the form of a SQL expression or subquery.\nHowever, the subquery cannot access the same table that is named in the INTO\nclause.\n\nIf you use the LOW_PRIORITY keyword, execution of the INSERT is delayed until\nno other clients are reading from the table. If you use the HIGH_PRIORITY\nkeyword, the statement has the same priority as SELECTs. This affects only\nstorage engines that use only table-level locking (MyISAM, MEMORY, MERGE).\nHowever, if one of these keywords is specified, concurrent inserts cannot be\nused. See HIGH_PRIORITY and LOW_PRIORITY clauses for details.\n\nINSERT DELAYED\n--------------\n\nFor more details on the DELAYED option, see INSERT DELAYED.\n\nHIGH PRIORITY and LOW PRIORITY\n------------------------------\n\nSee HIGH_PRIORITY and LOW_PRIORITY.\n\nDefaults and Duplicate Values\n-----------------------------\n\nSee INSERT - Default & Duplicate Values for details..\n\nINSERT IGNORE\n-------------\n\nSee INSERT IGNORE.\n\nINSERT ON DUPLICATE KEY UPDATE\n------------------------------\n\nSee INSERT ON DUPLICATE KEY UPDATE.\n\nExamples\n--------\n\nSpecifying the column names:\n\nINSERT INTO person (first_name, last_name) VALUES (\'John\', \'Doe\');\n\nInserting more than 1 row at a time:\n\nINSERT INTO tbl_name VALUES (1, \"row 1\"), (2, \"row 2\");\n\nUsing the SET clause:\n\nINSERT INTO person SET first_name = \'John\', last_name = \'Doe\';\n\nSELECTing from another table:\n\nINSERT INTO contractor SELECT * FROM person WHERE status = \'c\';\n\nSee INSERT ON DUPLICATE KEY UPDATE and INSERT IGNORE for further examples.\n\nINSERT ... RETURNING\n--------------------\n\nINSERT ... RETURNING returns a resultset of the inserted rows.\n\nThis returns the listed columns for all the rows that are inserted, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple INSERT statement\n\nINSERT INTO t2 VALUES (1,\'Dog\'),(2,\'Lion\'),(3,\'Tiger\'),(4,\'Leopard\') \nRETURNING id2,id2+id2,id2&id2,id2||id2;\n+-----+---------+---------+----------+\n| id2 | id2+id2 | id2&id2 | id2||id2 |\n+-----+---------+---------+----------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n| 3 | 6 | 3 | 1 |\n| 4 | 8 | 4 | 1 |\n+-----+---------+---------+----------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\n\nPREPARE stmt FROM \"INSERT INTO t1 SET id1=1, animal1=\'Bear\' RETURNING f(id1),\nUPPER(animal1)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f(id1) | UPPER(animal1) |\n+---------+----------------+\n| 2 | BEAR |\n+---------+----------------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used.\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values, and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used or it can be used in\nINSERT...SELECT...RETURNING if the table in the RETURNING clause is not the\nsame as the INSERT table.\n\nURL: https://mariadb.com/kb/en/insert/','','https://mariadb.com/kb/en/insert/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (448,27,'INSERT DELAYED','Syntax\n------\n\nINSERT DELAYED ...\n\nDescription\n-----------\n\nThe DELAYED option for the INSERT statement is a MariaDB/MySQL extension to\nstandard SQL that is very useful if you have clients that cannot or need not\nwait for the INSERT to complete. This is a common situation when you use\nMariaDB for logging and you also periodically run SELECT and UPDATE statements\nthat take a long time to complete.\n\nWhen a client uses INSERT DELAYED, it gets an okay from the server at once,\nand the row is queued to be inserted when the table is not in use by any other\nthread.\n\nAnother major benefit of using INSERT DELAYED is that inserts from many\nclients are bundled together and written in one block. This is much faster\nthan performing many separate inserts.\n\nNote that INSERT DELAYED is slower than a normal INSERT if the table is not\notherwise in use. There is also the additional overhead for the server to\nhandle a separate thread for each table for which there are delayed rows. This\nmeans that you should use INSERT DELAYED only when you are really sure that\nyou need it.\n\nThe queued rows are held only in memory until they are inserted into the\ntable. This means that if you terminate mysqld forcibly (for example, with\nkill -9) or if mysqld dies unexpectedly, any queued rows that have not been\nwritten to disk are lost.\n\nThe number of concurrent INSERT DELAYED threads is limited by the\nmax_delayed_threads server system variables. If it is set to 0, INSERT DELAYED\nis disabled. The session value can be equal to the global value, or 0 to\ndisable this statement for the current session. If this limit has been\nreached, the DELAYED clause will be silently ignore for subsequent statements\n(no error will be produced).\n\nLimitations\n-----------\n\nThere are some limitations on the use of DELAYED:\n\n* INSERT DELAYED works only with MyISAM, MEMORY, ARCHIVE,\n and BLACKHOLE tables. If you execute INSERT DELAYED with another storage\nengine, you will get an error like this: ERROR 1616 (HY000): DELAYED option\nnot supported for table \'tab_name\'\n* For MyISAM tables, if there are no free blocks in the middle of the data\n file, concurrent SELECT and INSERT statements are supported. Under these\n circumstances, you very seldom need to use INSERT DELAYED\n with MyISAM.\n* INSERT DELAYED should be used only for\n INSERT statements that specify value lists. The server\n ignores DELAYED for INSERT ... SELECT\n or INSERT ... ON DUPLICATE KEY UPDATE statements.\n* Because the INSERT DELAYED statement returns immediately,\n before the rows are inserted, you cannot use\n LAST_INSERT_ID() to get the\n AUTO_INCREMENT value that the statement might generate.\n* DELAYED rows are not visible to SELECT\n statements until they actually have been inserted.\n* After INSERT DELAYED, ROW_COUNT() returns the number of the rows you tried\nto insert, not the number of the successful writes.\n* DELAYED is ignored on slave replication servers, so that \n INSERT DELAYED is treated as a normal\n INSERT on slaves. This is because\n DELAYED could cause the slave to have different data than\n the master. INSERT DELAYED statements are not safe for replication.\n* Pending INSERT DELAYED statements are lost if a table is\n write locked and ALTER TABLE is used to modify the table structure.\n* INSERT DELAYED is not supported for views. If you try, you will get an error\nlike this: ERROR 1347 (HY000): \'view_name\' is not BASE TABLE\n* INSERT DELAYED is not supported for partitioned tables.\n* INSERT DELAYED is not supported within stored programs.\n* INSERT DELAYED does not work with triggers.\n* INSERT DELAYED does not work if there is a check constraint in place.\n* INSERT DELAYED does not work if skip-new mode is active.\n\nURL: https://mariadb.com/kb/en/insert-delayed/','','https://mariadb.com/kb/en/insert-delayed/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (449,27,'INSERT SELECT','Syntax\n------\n\nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [(col_name,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]\n\nDescription\n-----------\n\nWith INSERT ... SELECT, you can quickly insert many rows into a table from one\nor more other tables. For example:\n\nINSERT INTO tbl_temp2 (fld_id)\n SELECT tbl_temp1.fld_order_id\n FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;\n\ntbl_name can also be specified in the form db_name.tbl_name (see Identifier\nQualifiers). This allows to copy rows between different databases.\n\nIf the new table has a primary key or UNIQUE indexes, you can use IGNORE to\nhandle duplicate key errors during the query. The newer values will not be\ninserted if an identical value already exists.\n\nREPLACE can be used instead of INSERT to prevent duplicates on UNIQUE indexes\nby deleting old values. In that case, ON DUPLICATE KEY UPDATE cannot be used.\n\nINSERT ... SELECT works for tables which already exist. To create a table for\na given resultset, you can use CREATE TABLE ... SELECT.\n\nURL: https://mariadb.com/kb/en/insert-select/','','https://mariadb.com/kb/en/insert-select/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (450,27,'LOAD DATA INFILE','Syntax\n------\n\nLOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE \'file_name\'\n [REPLACE | IGNORE]\n INTO TABLE tbl_name\n [CHARACTER SET charset_name]\n [{FIELDS | COLUMNS}\n [TERMINATED BY \'string\']\n [[OPTIONALLY] ENCLOSED BY \'char\']\n [ESCAPED BY \'char\']\n ]\n [LINES\n [STARTING BY \'string\']\n [TERMINATED BY \'string\']\n ]\n [IGNORE number LINES]\n [(col_name_or_user_var,...)]\n [SET col_name = expr,...]\n\nDescription\n-----------\n\nLOAD DATA INFILE is unsafe for statement-based replication.\n\nReads rows from a text file into the designated table on the database at a\nvery high speed. The file name must be given as a literal string.\n\nFiles are written to disk using the SELECT INTO OUTFILE statement. You can\nthen read the files back into a table using the LOAD DATA INFILE statement.\nThe FIELDS and LINES clauses are the same in both statements. These clauses\nare optional, but if both are specified then the FIELDS clause must precede\nLINES.\n\nExecuting this statement activates INSERT triggers.\n\nOne must have the FILE privilege to be able to execute LOAD DATA INFILE. This\nis to ensure normal users cannot read system files. LOAD DATA LOCAL INFILE\ndoes not have this requirement.\n\nIf the secure_file_priv system variable is set (by default it is not), the\nloaded file must be present in the specified directory.\n\nNote that MariaDB\'s systemd unit file restricts access to /home, /root, and\n/run/user by default. See Configuring access to home directories.\n\nLOAD DATA LOCAL INFILE\n----------------------\n\nWhen you execute the LOAD DATA INFILE statement, MariaDB Server attempts to\nread the input file from its own file system. By contrast, when you execute\nthe LOAD DATA LOCAL INFILE statement, the client attempts to read the input\nfile from its file system, and it sends the contents of the input file to the\nMariaDB Server. This allows you to load files from the client\'s local file\nsystem into the database.\n\nIf you don\'t want to permit this operation (perhaps for security reasons), you\ncan disable the LOAD DATA LOCAL INFILE statement on either the server or the\nclient.\n\n* The LOAD DATA LOCAL INFILE statement can be disabled on the server by\nsetting the local_infile system variable to 0.\n* The LOAD DATA LOCAL INFILE statement can be disabled on the client. If you\nare using MariaDB Connector/C, this can be done by unsetting the\nCLIENT_LOCAL_FILES capability flag with the mysql_real_connect function or by\nunsetting the MYSQL_OPT_LOCAL_INFILE option with mysql_optionsv function. If\nyou are using a different client or client library, then see the documentation\nfor your specific client or client library to determine how it handles the\nLOAD DATA LOCAL INFILE statement.\n\nIf the LOAD DATA LOCAL INFILE statement is disabled by either the server or\nthe client and if the user attempts to execute it, then the server will cause\nthe statement to fail with the following error message:\n\nThe used command is not allowed with this MariaDB version\n\nNote that it is not entirely accurate to say that the MariaDB version does not\nsupport the command. It would be more accurate to say that the MariaDB\nconfiguration does not support the command. See MDEV-20500 for more\ninformation.\n\nFrom MariaDB 10.5.2, the error message is more accurate:\n\nThe used command is not allowed because the MariaDB server or client \n has disabled the local infile capability\n\nREPLACE and IGNORE\n------------------\n\nIf you load data from a file into a table that already contains data and has a\nprimary key, you may encounter issues where the statement attempts to insert a\nrow with a primary key that already exists. When this happens, the statement\nfails with Error 1064, protecting the data already on the table. If you want\nMariaDB to overwrite duplicates, use the REPLACE keyword.\n\nThe REPLACE keyword works like the REPLACE statement. Here, the statement\nattempts to load the data from the file. If the row does not exist, it adds it\nto the table. If the row contains an existing primary key, it replaces the\ntable data. That is, in the event of a conflict, it assumes the file contains\nthe desired row.\n\nThis operation can cause a degradation in load speed by a factor of 20 or more\nif the part that has already been loaded is larger than the capacity of the\nInnoDB Buffer Pool. This happens because it causes a lot of turnaround in the\nbuffer pool.\n\nUse the IGNORE keyword when you want to skip any rows that contain a\nconflicting primary key. Here, the statement attempts to load the data from\nthe file. If the row does not exist, it adds it to the table. If the row\ncontains an existing primary key, it ignores the addition request and moves on\nto the next. That is, in the event of a conflict, it assumes the table\ncontains the desired row.\n\nCharacter-sets\n--------------\n\nWhen the statement opens the file, it attempts to read the contents using the\ndefault character-set, as defined by the character_set_database system\nvariable.\n\nIn the cases where the file was written using a character-set other than the\ndefault, you can specify the character-set to use with the CHARACTER SET\nclause in the statement. It ignores character-sets specified by the SET NAMES\nstatement and by the character_set_client system variable. Setting the\nCHARACTER SET clause to a value of binary indicates \"no conversion.\"\n\nThe statement interprets all fields in the file as having the same\ncharacter-set, regardless of the column data type. To properly interpret file\ncontents, you must ensure that it was written with the correct character-set.\nIf you write a data file with mysqldump -T or with the SELECT INTO OUTFILE\nstatement with the mysql client, be sure to use the --default-character-set\noption, so that the output is written with the desired character-set.\n\nWhen using mixed character sets, use the CHARACTER SET clause in both SELECT\nINTO OUTFILE and LOAD DATA INFILE to ensure that MariaDB correctly interprets\nthe escape sequences.\n\nThe character_set_filesystem system variable controls the interpretation of\nthe filename.\n\nIt is currently not possible to load data files that use the ucs2 character\nset.\n\nPreprocessing Inputs\n--------------------\n\ncol_name_or_user_var can be a column name, or a user variable. In the case of\na variable, the SET statement can be used to preprocess the value before\nloading into the table.\n\nPriority and Concurrency\n------------------------\n\nIn storage engines that perform table-level locking (MyISAM, MEMORY and\nMERGE), using the LOW_PRIORITY keyword, MariaDB delays insertions until no\nother clients are reading from the table. Alternatively, when using the MyISAM\nstorage engine, you can use the CONCURRENT keyword to perform concurrent\ninsertion.\n\nThe LOW_PRIORITY and CONCURRENT keywords are mutually exclusive. They cannot\nbe used in the same statement.\n\nProgress Reporting\n------------------\n\nThe LOAD DATA INFILE statement supports progress reporting. You may find this\nuseful when dealing with long-running operations. Using another client you can\nissue a SHOW PROCESSLIST query to check the progress of the data load.\n\nUsing mariadb-import/mysqlimport\n--------------------------------\n\nMariaDB ships with a separate utility for loading data from files:\nmariadb-import (or mysqlimport before MariaDB 10.5). It operates by sending\nLOAD DATA INFILE statements to the server.\n\nUsing mariadb-import/mysqlimport you can compress the file using the\n--compress option, to get better performance over slow networks, providing\nboth the client and server support the compressed protocol. Use the --local\noption to load from the local file system.\n\nIndexing\n--------\n\nIn cases where the storage engine supports ALTER TABLE... DISABLE KEYS\nstatements (MyISAM and Aria), the LOAD DATA INFILE statement automatically\ndisables indexes during the execution.\n\nExamples\n--------\n\nYou have a file with this content (note the the separator is \',\', not tab,\nwhich is the default):\n\n2,2\n3,3\n4,4\n5,5\n6,8\n\nCREATE TABLE t1 (a int, b int, c int, d int, PRIMARY KEY (a));\nLOAD DATA LOCAL INFILE \n \'/tmp/loaddata7.dat\' INTO TABLE t1 FIELDS TERMINATED BY \',\' (a,b) SET c=a+b;\nSELECT * FROM t1;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| 2 | 2 | 4 |\n| 3 | 3 | 6 |\n| 4 | 4 | 8 |\n| 5 | 5 | 10 |\n| 6 | 8 | 14 |\n+------+------+------+\n\nAnother example, given the following data (the separator is a tab):\n\n1 a\n2 b\n\nThe value of the first column is doubled before loading:\n\nLOAD DATA INFILE \'ld.txt\' INTO TABLE ld (@i,v) SET i=@i*2;\n\nSELECT * FROM ld;\n+------+------+\n| i | v |\n+------+------+\n| 2 | a |\n| 4 | b |\n+------+------+\n\nURL: https://mariadb.com/kb/en/load-data-infile/','','https://mariadb.com/kb/en/load-data-infile/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (451,27,'LOAD XML','Syntax\n------\n\nLOAD XML [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE \'file_name\'\n [REPLACE | IGNORE]\n INTO TABLE [db_name.]tbl_name\n [CHARACTER SET charset_name]\n [ROWS IDENTIFIED BY \'<tagname>\']\n [IGNORE number {LINES | ROWS}]\n [(column_or_user_var,...)]\n [SET col_name = expr,...]\n\nDescription\n-----------\n\nThe LOAD XML statement reads data from an XML file into a table. The file_name\nmust be given as a literal string. The tagname in the optional ROWS IDENTIFIED\nBY clause must also be given as a literal string, and must be surrounded by\nangle brackets (< and >).\n\nLOAD XML acts as the complement of running the mysql client in XML output mode\n(that is, starting the client with the --xml option). To write data from a\ntable to an XML file, use a command such as the following one from the system\nshell:\n\nshell> mysql --xml -e \'SELECT * FROM mytable\' > file.xml\n\nTo read the file back into a table, use LOAD XML INFILE. By default, the <row>\nelement is considered to be the equivalent of a database table row; this can\nbe changed using the ROWS IDENTIFIED BY clause.\n\nThis statement supports three different XML formats:\n\n* Column names as attributes and column values as attribute values:\n\n<row column1=\"value1\" column2=\"value2\" .../>\n\n* Column names as tags and column values as the content of these tags:\n\n<row>\n <column1>value1</column1>\n <column2>value2</column2>\n</row>\n\n* Column names are the name attributes of <field> tags, and values are\n the contents of these tags:\n\n<row>\n <field name=\'column1\'>value1</field>\n <field name=\'column2\'>value2</field>\n</row>\n\nThis is the format used by other tools, such as mysqldump.\n\nAll 3 formats can be used in the same XML file; the import routine\nautomatically detects the format for each row and interprets it correctly.\nTags are matched based on the tag or attribute name and the column name.\n\nThe following clauses work essentially the same way for LOAD XML as they do\nfor LOAD DATA:\n\n* LOW_PRIORITY or CONCURRENT\n* LOCAL\n* REPLACE or IGNORE\n* CHARACTER SET\n* (column_or_user_var,...)\n* SET\n\nSee LOAD DATA for more information about these clauses.\n\nThe IGNORE number LINES or IGNORE number ROWS clause causes the first number\nrows in the XML file to be skipped. It is analogous to the LOAD DATA\nstatement\'s IGNORE ... LINES clause.\n\nIf the LOW_PRIORITY keyword is used, insertions are delayed until no other\nclients are reading from the table. The CONCURRENT keyword allowes the use of\nconcurrent inserts. These clauses cannot be specified together.\n\nThis statement activates INSERT triggers.\n\nURL: https://mariadb.com/kb/en/load-xml/','','https://mariadb.com/kb/en/load-xml/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (452,27,'Concurrent Inserts','The MyISAM storage engine supports concurrent inserts. This feature allows\nSELECT statements to be executed during INSERT operations, reducing contention.\n\nWhether concurrent inserts can be used or not depends on the value of the\nconcurrent_insert server system variable:\n\n* NEVER (0) disables concurrent inserts.\n* AUTO (1) allows concurrent inserts only when the target table has no free\nblocks (no data in the middle of the table has been deleted after the last\nOPTIMIZE TABLE). This is the default.\n* ALWAYS (2) always enables concurrent inserts, in which case new rows are\nadded at the end of a table if the table is being used by another thread.\n\nIf the binary log is used, CREATE TABLE ... SELECT and INSERT ... SELECT\nstatements cannot use concurrent inserts. These statements acquire a read lock\non the table, so concurrent inserts will need to wait. This way the log can be\nsafely used to restore data.\n\nConcurrent inserts are not used by replicas with the row based replication\n(see binary log formats).\n\nIf an INSERT statement contain the HIGH_PRIORITY clause, concurrent inserts\ncannot be used. INSERT ... DELAYED is usually unneeded if concurrent inserts\nare enabled.\n\nLOAD DATA INFILE uses concurrent inserts if the CONCURRENT keyword is\nspecified and concurrent_insert is not NEVER. This makes the statement slower\n(even if no other sessions access the table) but reduces contention.\n\nLOCK TABLES allows non-conflicting concurrent inserts if a READ LOCAL lock is\nused. Concurrent inserts are not allowed if the LOCAL keyword is omitted.\n\nNotes\n-----\n\nThe decision to enable concurrent insert for a table is done when the table is\nopened. If you change the value of concurrent_insert it will only affect new\nopened tables. If you want it to work for also for tables in use or cached,\nyou should do FLUSH TABLES after setting the variable.\n\nURL: https://mariadb.com/kb/en/concurrent-inserts/','','https://mariadb.com/kb/en/concurrent-inserts/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (453,27,'HIGH_PRIORITY and LOW_PRIORITY','The InnoDB storage engine uses row-level locking to ensure data integrity.\nHowever some storage engines (such as MEMORY, MyISAM, Aria and MERGE) lock the\nwhole table to prevent conflicts. These storage engines use two separate\nqueues to remember pending statements; one is for SELECTs and the other one is\nfor write statements (INSERT, DELETE, UPDATE). By default, the latter has a\nhigher priority.\n\nTo give write operations a lower priority, the low_priority_updates server\nsystem variable can be set to ON. The option is available on both the global\nand session levels, and it can be set at startup or via the SET statement.\n\nWhen too many table locks have been set by write statements, some pending\nSELECTs are executed. The maximum number of write locks that can be acquired\nbefore this happens is determined by the max_write_lock_count server system\nvariable, which is dynamic.\n\nIf write statements have a higher priority (default), the priority of\nindividual write statements (INSERT, REPLACE, UPDATE, DELETE) can be changed\nvia the LOW_PRIORITY attribute, and the priority of a SELECT statement can be\nraised via the HIGH_PRIORITY attribute. Also, LOCK TABLES supports a\nLOW_PRIORITY attribute for WRITE locks.\n\nIf read statements have a higher priority, the priority of an INSERT can be\nchanged via the HIGH_PRIORITY attribute. However, the priority of other write\nstatements cannot be raised individually.\n\nThe use of LOW_PRIORITY or HIGH_PRIORITY for an INSERT prevents Concurrent\nInserts from being used.\n\nURL: https://mariadb.com/kb/en/high_priority-and-low_priority/','','https://mariadb.com/kb/en/high_priority-and-low_priority/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (454,27,'INSERT - Default & Duplicate Values','Default Values\n--------------\n\nIf the SQL_MODE contains STRICT_TRANS_TABLES and you are inserting into a\ntransactional table (like InnoDB), or if the SQL_MODE contains\nSTRICT_ALL_TABLES, all NOT NULL columns which do not have a DEFAULT value (and\nare not AUTO_INCREMENT) must be explicitly referenced in INSERT statements. If\nnot, an error like this is produced:\n\nERROR 1364 (HY000): Field \'col\' doesn\'t have a default value\n\nIn all other cases, if a NOT NULL column without a DEFAULT value is not\nreferenced, an empty value will be inserted (for example, 0 for INTEGER\ncolumns and \'\' for CHAR columns). See NULL Values in MariaDB:Inserting for\nexamples.\n\nIf a NOT NULL column having a DEFAULT value is not referenced, NULL will be\ninserted.\n\nIf a NULL column having a DEFAULT value is not referenced, its default value\nwill be inserted. It is also possible to explicitly assign the default value\nusing the DEFAULT keyword or the DEFAULT() function.\n\nIf the DEFAULT keyword is used but the column does not have a DEFAULT value,\nan error like this is produced:\n\nERROR 1364 (HY000): Field \'col\' doesn\'t have a default value\n\nDuplicate Values\n----------------\n\nBy default, if you try to insert a duplicate row and there is a UNIQUE index,\nINSERT stops and an error like this is produced:\n\nERROR 1062 (23000): Duplicate entry \'dup_value\' for key \'col\'\n\nTo handle duplicates you can use the IGNORE clause, INSERT ON DUPLICATE KEY\nUPDATE or the REPLACE statement. Note that the IGNORE and DELAYED options are\nignored when you use ON DUPLICATE KEY UPDATE.\n\nURL: https://mariadb.com/kb/en/insert-default-duplicate-values/','','https://mariadb.com/kb/en/insert-default-duplicate-values/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (455,27,'INSERT IGNORE','Ignoring Errors\n---------------\n\nNormally INSERT stops and rolls back when it encounters an error.\n\nBy using the IGNORE keyword all errors are converted to warnings, which will\nnot stop inserts of additional rows.\n\nThe IGNORE and DELAYED options are ignored when you use ON DUPLICATE KEY\nUPDATE.\n\nPrior to MySQL and MariaDB 5.5.28, no warnings were issued for duplicate key\nerrors when using IGNORE. You can get the old behavior if you set OLD_MODE to\nNO_DUP_KEY_WARNINGS_WITH_IGNORE.\n\nExamples\n--------\n\nCREATE TABLE t1 (x INT UNIQUE);\n\nINSERT INTO t1 VALUES(1),(2);\n\nINSERT INTO t1 VALUES(2),(3);\nERROR 1062 (23000): Duplicate entry \'2\' for key \'x\'\nSELECT * FROM t1;\n+------+\n| x |\n+------+\n| 1 |\n| 2 |\n+------+\n2 rows in set (0.00 sec)\n\nINSERT IGNORE INTO t1 VALUES(2),(3);\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n\nSHOW WARNINGS;\n+---------+------+---------------------------------+\n| Level | Code | Message |\n+---------+------+---------------------------------+\n| Warning | 1062 | Duplicate entry \'2\' for key \'x\' |\n+---------+------+---------------------------------+\n\nSELECT * FROM t1;\n+------+\n| x |\n+------+\n| 1 |\n| 2 |\n| 3 |\n+------+\n\nSee INSERT ON DUPLICATE KEY UPDATE for further examples using that syntax.\n\nURL: https://mariadb.com/kb/en/insert-ignore/','','https://mariadb.com/kb/en/insert-ignore/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (456,27,'INSERT ON DUPLICATE KEY UPDATE','Syntax\n------\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n\nOr:\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n\nOr:\n\nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n\nDescription\n-----------\n\nINSERT ... ON DUPLICATE KEY UPDATE is a MariaDB/MySQL extension to the INSERT\nstatement that, if it finds a duplicate unique or primary key, will instead\nperform an UPDATE.\n\nThe row/s affected value is reported as 1 if a row is inserted, and 2 if a row\nis updated, unless the API\'s CLIENT_FOUND_ROWS flag is set.\n\nIf more than one unique index is matched, only the first is updated. It is not\nrecommended to use this statement on tables with more than one unique index.\n\nIf the table has an AUTO_INCREMENT primary key and the statement inserts or\nupdates a row, the LAST_INSERT_ID() function returns its AUTO_INCREMENT value.\n\nThe VALUES() function can only be used in a ON DUPLICATE KEY UPDATE clause and\nhas no meaning in any other context. It returns the column values from the\nINSERT portion of the statement. This function is particularly useful for\nmulti-rows inserts.\n\nThe IGNORE and DELAYED options are ignored when you use ON DUPLICATE KEY\nUPDATE.\n\nSee Partition Pruning and Selection for details on the PARTITION clause.\n\nThis statement activates INSERT and UPDATE triggers. See Trigger Overview for\ndetails.\n\nSee also a similar statement, REPLACE.\n\nExamples\n--------\n\nCREATE TABLE ins_duplicate (id INT PRIMARY KEY, animal VARCHAR(30));\nINSERT INTO ins_duplicate VALUES (1,\'Aardvark\'), (2,\'Cheetah\'), (3,\'Zebra\');\n\nIf there is no existing key, the statement runs as a regular INSERT:\n\nINSERT INTO ins_duplicate VALUES (4,\'Gorilla\') \n ON DUPLICATE KEY UPDATE animal=\'Gorilla\';\nQuery OK, 1 row affected (0.07 sec)\n\nSELECT * FROM ins_duplicate;\n+----+----------+\n| id | animal |\n+----+----------+\n| 1 | Aardvark |\n| 2 | Cheetah |\n| 3 | Zebra |\n| 4 | Gorilla |\n+----+----------+\n\nA regular INSERT with a primary key value of 1 will fail, due to the existing\nkey:\n\nINSERT INTO ins_duplicate VALUES (1,\'Antelope\');\nERROR 1062 (23000): Duplicate entry \'1\' for key \'PRIMARY\'\n\nHowever, we can use an INSERT ON DUPLICATE KEY UPDATE instead:\n\nINSERT INTO ins_duplicate VALUES (1,\'Antelope\') \n ON DUPLICATE KEY UPDATE animal=\'Antelope\';\nQuery OK, 2 rows affected (0.09 sec)\n\nNote that there are two rows reported as affected, but this refers only to the\nUPDATE.\n\nSELECT * FROM ins_duplicate;\n+----+----------+\n| id | animal |\n+----+----------+\n| 1 | Antelope |\n| 2 | Cheetah |\n| 3 | Zebra |\n| 4 | Gorilla |\n+----+----------+\n\nAdding a second unique column:\n\nALTER TABLE ins_duplicate ADD id2 INT;\nUPDATE ins_duplicate SET id2=id+10;\nALTER TABLE ins_duplicate ADD UNIQUE KEY(id2);\n\nWhere two rows match the unique keys match, only the first is updated. This\ncan be unsafe and is not recommended unless you are certain what you are doing.\n\nINSERT INTO ins_duplicate VALUES (2,\'Lion\',13) \n ON DUPLICATE KEY UPDATE animal=\'Lion\';\nQuery OK, 2 rows affected (0.004 sec)\n\nSELECT * FROM ins_duplicate;\n+----+----------+------+\n| id | animal | id2 |\n+----+----------+------+\n| 1 | Antelope | 11 |\n| 2 | Lion | 12 |\n| 3 | Zebra | 13 |\n| 4 | Gorilla | 14 |\n+----+----------+------+\n\nAlthough the third row with an id of 3 has an id2 of 13, which also matched,\nit was not updated.\n\nChanging id to an auto_increment field. If a new row is added, the\nauto_increment is moved forward. If the row is updated, it remains the same.\n\nALTER TABLE `ins_duplicate` CHANGE `id` `id` INT( 11 ) NOT NULL AUTO_INCREMENT;\nALTER TABLE ins_duplicate DROP id2;\nSELECT Auto_increment FROM INFORMATION_SCHEMA.TABLES \n WHERE TABLE_NAME=\'ins_duplicate\';\n+----------------+\n| Auto_increment |\n+----------------+\n| 5 |\n+----------------+\n\nINSERT INTO ins_duplicate VALUES (2,\'Leopard\') \n ON DUPLICATE KEY UPDATE animal=\'Leopard\';\nQuery OK, 2 rows affected (0.00 sec)\n\nSELECT Auto_increment FROM INFORMATION_SCHEMA.TABLES \n WHERE TABLE_NAME=\'ins_duplicate\';\n+----------------+\n| Auto_increment |\n+----------------+\n| 5 |\n+----------------+\n\nINSERT INTO ins_duplicate VALUES (5,\'Wild Dog\') \n ON DUPLICATE KEY UPDATE animal=\'Wild Dog\';\nQuery OK, 1 row affected (0.09 sec)\n\nSELECT * FROM ins_duplicate;\n+----+----------+\n| id | animal |\n+----+----------+\n| 1 | Antelope |\n| 2 | Leopard |\n| 3 | Zebra |\n| 4 | Gorilla |\n| 5 | Wild Dog |\n+----+----------+\n\nSELECT Auto_increment FROM INFORMATION_SCHEMA.TABLES \n WHERE TABLE_NAME=\'ins_duplicate\';\n+----------------+\n| Auto_increment |\n+----------------+\n| 6 |\n+----------------+\n\nRefering to column values from the INSERT portion of the statement:\n\nINSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)\n ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);\n\nSee the VALUES() function for more.\n\nURL: https://mariadb.com/kb/en/insert-on-duplicate-key-update/','','https://mariadb.com/kb/en/insert-on-duplicate-key-update/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (457,27,'INSERT...RETURNING','MariaDB starting with 10.5.0\n----------------------------\nINSERT ... RETURNING was added in MariaDB 10.5.0, and returns a resultset of\nthe inserted rows.\n\nSyntax\n------\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nOr:\n\nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nOr:\n\nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ] [RETURNING select_expr\n [, select_expr ...]]\n\nDescription\n-----------\n\nINSERT ... RETURNING returns a resultset of the inserted rows.\n\nThis returns the listed columns for all the rows that are inserted, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple INSERT statements:\n\nCREATE OR REPLACE TABLE t2 (id INT, animal VARCHAR(20), t TIMESTAMP);\n\nINSERT INTO t2 (id) VALUES (2),(3) RETURNING id,t;\n+------+---------------------+\n| id | t |\n+------+---------------------+\n| 2 | 2021-04-28 00:59:32 |\n| 3 | 2021-04-28 00:59:32 |\n+------+---------------------+\n\nINSERT INTO t2(id,animal) VALUES\n(1,\'Dog\'),(2,\'Lion\'),(3,\'Tiger\'),(4,\'Leopard\') \n RETURNING id,id+id,id&id,id||id;\n+------+-------+-------+--------+\n| id | id+id | id&id | id||id |\n+------+-------+-------+--------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n| 3 | 6 | 3 | 1 |\n| 4 | 8 | 4 | 1 |\n+------+-------+-------+--------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\n\nPREPARE stmt FROM \"INSERT INTO t1 SET id1=1, animal1=\'Bear\' RETURNING f(id1),\nUPPER(animal1)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f(id1) | UPPER(animal1) |\n+---------+----------------+\n| 2 | BEAR |\n+---------+----------------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used.\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values, and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used or it can be used in\nINSERT...SELECT...RETURNING if the table in the RETURNING clause is not the\nsame as the INSERT table.\n\nURL: https://mariadb.com/kb/en/insertreturning/','','https://mariadb.com/kb/en/insertreturning/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (458,27,'REPLACE...RETURNING','MariaDB starting with 10.5.0\n----------------------------\nREPLACE ... RETURNING was added in MariaDB 10.5.0, and returns a resultset of\nthe replaced rows.\n\nSyntax\n------\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n[RETURNING select_expr \n [, select_expr ...]]\n\nOr:\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n[RETURNING select_expr \n [, select_expr ...]]\n\nOr:\n\nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n[RETURNING select_expr \n [, select_expr ...]]\n\nDescription\n-----------\n\nREPLACE ... RETURNING returns a resultset of the replaced rows.\n\nThis returns the listed columns for all the rows that are replaced, or\nalternatively, the specified SELECT expression. Any SQL expressions which can\nbe calculated can be used in the select expression for the RETURNING clause,\nincluding virtual columns and aliases, expressions which use various operators\nsuch as bitwise, logical and arithmetic operators, string functions, date-time\nfunctions, numeric functions, control flow functions, secondary functions and\nstored functions. Along with this, statements which have subqueries and\nprepared statements can also be used.\n\nExamples\n--------\n\nSimple REPLACE statement\n\nREPLACE INTO t2 VALUES (1,\'Leopard\'),(2,\'Dog\') RETURNING id2, id2+id2 \nas Total ,id2|id2, id2&&id2;\n+-----+-------+---------+----------+\n| id2 | Total | id2|id2 | id2&&id2 |\n+-----+-------+---------+----------+\n| 1 | 2 | 1 | 1 |\n| 2 | 4 | 2 | 1 |\n+-----+-------+---------+----------+\n\nUsing stored functions in RETURNING\n\nDELIMITER |\nCREATE FUNCTION f(arg INT) RETURNS INT\n BEGIN\n RETURN (SELECT arg+arg);\n END|\n\nDELIMITER ;\nPREPARE stmt FROM \"REPLACE INTO t2 SET id2=3, animal2=\'Fox\' RETURNING f2(id2),\nUPPER(animal2)\";\n\nEXECUTE stmt;\n+---------+----------------+\n| f2(id2) | UPPER(animal2) |\n+---------+----------------+\n| 6 | FOX |\n+---------+----------------+\n\nSubqueries in the statement\n\nREPLACE INTO t1 SELECT * FROM t2 RETURNING (SELECT id2 FROM t2 WHERE \nid2 IN (SELECT id2 FROM t2 WHERE id2=1)) AS new_id;\n+--------+\n| new_id |\n+--------+\n| 1 |\n| 1 |\n| 1 |\n| 1 |\n+--------+\n\nSubqueries in the RETURNING clause that return more than one row or column\ncannot be used..\n\nAggregate functions cannot be used in the RETURNING clause. Since aggregate\nfunctions work on a set of values and if the purpose is to get the row count,\nROW_COUNT() with SELECT can be used, or it can be used in\nREPLACE...SELECT...RETURNING if the table in the RETURNING clause is not the\nsame as the REPLACE table.\n\nURL: https://mariadb.com/kb/en/replacereturning/','','https://mariadb.com/kb/en/replacereturning/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (459,27,'CALL','Syntax\n------\n\nCALL sp_name([parameter[,...]])\nCALL sp_name[()]\n\nDescription\n-----------\n\nThe CALL statement invokes a stored procedure that was defined previously with\nCREATE PROCEDURE.\n\nStored procedure names can be specified as database_name.procedure_name.\nProcedure names and database names can be quoted with backticks (). This is\nnecessary if they are reserved words, or contain special characters. See\nidentifier qualifiers for details.\n\nCALL p() and CALL p are equivalent.\n\nIf parentheses are used, any number of spaces, tab characters and newline\ncharacters are allowed between the procedure\'s name and the open parenthesis.\n\nCALL can pass back values to its caller using parameters that are declared as\nOUT or INOUT parameters. If no value is assigned to an OUT parameter, NULL is\nassigned (and its former value is lost). To pass such values from another\nstored program you can use user-defined variables, local variables or\nroutine\'s parameters; in other contexts, you can only use user-defined\nvariables.\n\nCALL can also be executed as a prepared statement. Placeholders can be used\nfor IN parameters in all versions of MariaDB; for OUT and INOUT parameters,\nplaceholders can be used since MariaDB 5.5.\n\nWhen the procedure returns, a client program can also obtain the number of\nrows affected for the final statement executed within the routine: At the SQL\nlevel, call the ROW_COUNT() function; from the C API, call the\nmysql_affected_rows() function.\n\nIf the CLIENT_MULTI_RESULTS API flag is set, CALL can return any number of\nresultsets and the called stored procedure can execute prepared statements. If\nit is not set, at most one resultset can be returned and prepared statements\ncannot be used within procedures.\n\nURL: https://mariadb.com/kb/en/call/','','https://mariadb.com/kb/en/call/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (460,27,'DO','Syntax\n------\n\nDO expr [, expr] ...\n\nDescription\n-----------\n\nDO executes the expressions but does not return any results. In most respects,\nDO is shorthand for SELECT expr, ..., but has the advantage that it is\nslightly faster when you do not care about the result.\n\nDO is useful primarily with functions that have side effects, such as\nRELEASE_LOCK().\n\nURL: https://mariadb.com/kb/en/do/','','https://mariadb.com/kb/en/do/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (461,27,'Comment Syntax','There are three supported comment styles in MariaDB:\n\n* From a \'#\' to the end of a line:SELECT * FROM users; # This is a comment\n\n* From a \'-- \' to the end of a line. The space after the two dashes is\nrequired (as in MySQL).SELECT * FROM users; -- This is a comment\n\n* C style comments from an opening \'/*\' to a closing \'*/\'. Comments of this\nform can span multiple lines:SELECT * FROM users; /* This is a\nmulti-line\ncomment */\n\nNested comments are possible in some situations, but they are not supported or\nrecommended.\n\nExecutable Comments\n-------------------\n\nAs an aid to portability between different databases, MariaDB supports\nexecutable comments. These special comments allow you to embed SQL code which\nwill not execute when run on other databases, but will execute when run on\nMariaDB.\n\nMariaDB supports both MySQL\'s executable comment format, and a slightly\nmodified version specific to MariaDB. This way, if you have SQL code that\nworks on MySQL and MariaDB, but not other databases, you can wrap it in a\nMySQL executable comment, and if you have code that specifically takes\nadvantage of features only available in MariaDB you can use the MariaDB\nspecific format to hide the code from MySQL.\n\nExecutable Comment Syntax\n-------------------------\n\nMySQL and MariaDB executable comment syntax:\n\n/*! MySQL or MariaDB-specific code */\n\nCode that should be executed only starting from a specific MySQL or MariaDB\nversion:\n\n/*!##### MySQL or MariaDB-specific code */\n\nThe numbers, represented by \'######\' in the syntax examples above specify the\nspecific the minimum versions of MySQL and MariaDB that should execute the\ncomment. The first number is the major version, the second 2 numbers are the\nminor version and the last 2 is the patch level.\n\nFor example, if you want to embed some code that should only execute on MySQL\nor MariaDB starting from 5.1.0, you would do the following:\n\n/*!50100 MySQL and MariaDB 5.1.0 (and above) code goes here. */\n\nMariaDB-only executable comment syntax (starting from MariaDB 5.3.1):\n\n/*M! MariaDB-specific code */\n/*M!###### MariaDB-specific code */\n\nMariaDB ignores MySQL-style executable comments that have a version number in\nthe range 50700..99999. This is needed to skip features introduced in\nMySQL-5.7 that are not ported to MariaDB 10.x yet.\n\n/*!50701 MariaDB-10.x ignores MySQL-5.7 specific code */\n\nNote: comments which have a version number in the range 50700..99999 that use\nMariaDB-style executable comment syntax are still executed.\n\n/*M!50701 MariaDB-10.x does not ignore this */\n\nStatement delimiters cannot be used within executable comments.\n\nExamples\n--------\n\nIn MySQL all the following will return 2: In MariaDB, the last 2 queries would\nreturn 3.\n\nSELECT 2 /* +1 */;\nSELECT 1 /*! +1 */;\nSELECT 1 /*!50101 +1 */;\nSELECT 2 /*M! +1 */;\nSELECT 2 /*M!50301 +1 */;\n\nThe following executable statement will not work due to the delimiter inside\nthe executable portion:\n\n/*M!100100 select 1 ; */\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual\nthat corresponds to your MariaDB server version for the right syntax to use\nnear \'\' at line 1\n\nInstead, the delimiter should be placed outside the executable portion:\n\n/*M!100100 select 1 */;\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n\nURL: https://mariadb.com/kb/en/comment-syntax/','','https://mariadb.com/kb/en/comment-syntax/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (462,27,'HANDLER Commands','Syntax\n------\n\nHANDLER tbl_name OPEN [ [AS] alias]\nHANDLER tbl_name READ index_name { = | >= | <= | < } (value1,value2,...)\n [ WHERE where_condition ] [LIMIT ... ]\nHANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }\n [ WHERE where_condition ] [LIMIT ... ]\nHANDLER tbl_name READ { FIRST | NEXT }\n [ WHERE where_condition ] [LIMIT ... ]\nHANDLER tbl_name CLOSE\n\nDescription\n-----------\n\nThe HANDLER statement provides direct access to table storage engine\ninterfaces for key lookups and key or table scans. It is available for at\nleast Aria, Memory, MyISAM and InnoDB tables (and should work with most\n\'normal\' storage engines, but not with system tables, MERGE or views).\n\nHANDLER ... OPEN opens a table, allowing it to be accessible to subsequent\nHANDLER ... READ statements. The table can either be opened using an alias\n(which must then be used by HANDLER ... READ, or a table name.\n\nThe table object is only closed when HANDLER ... CLOSE is called by the\nsession, and is not shared by other sessions.\n\nPrepared statements work with HANDLER READ, which gives a much higher\nperformance (50% speedup) as there is no parsing and all data is transformed\nin binary (without conversions to text, as with the normal protocol).\n\nThe HANDLER command does not work with partitioned tables.\n\nKey Lookup\n----------\n\nA key lookup is started with:\n\nHANDLER tbl_name READ index_name { = | >= | <= | < } (value,value) [LIMIT...]\n\nThe values stands for the value of each of the key columns. For most key types\n(except for HASH keys in MEMORY storage engine) you can use a prefix subset of\nit\'s columns.\n\nIf you are using LIMIT, then in case of >= or > then there is an implicit NEXT\nimplied, while if you are using <= or < then there is an implicit PREV implied.\n\nAfter the initial read, you can use\n\nHANDLER tbl_name READ index_name NEXT [ LIMIT ... ]\nor\nHANDLER tbl_name READ index_name PREV [ LIMIT ... ]\n\nto scan the rows in key order.\n\nNote that the row order is not defined for keys with duplicated values and\nwill vary from engine to engine.\n\nKey Scans\n---------\n\nYou can scan a table in key order by doing:\n\nHANDLER tbl_name READ index_name FIRST [ LIMIT ... ]\nHANDLER tbl_name READ index_name NEXT [ LIMIT ... ]\n\nor, if the handler supports backwards key scans (most do):\n\nHANDLER tbl_name READ index_name LAST [ LIMIT ... ]\nHANDLER tbl_name READ index_name PREV [ LIMIT ... ]\n\nTable Scans\n-----------\n\nYou can scan a table in row order by doing:\n\nHANDLER tbl_name READ FIRST [ LIMIT ... ]\nHANDLER tbl_name READ NEXT [ LIMIT ... ]\n\nLimitations\n-----------\n\nAs this is a direct interface to the storage engine, some limitations may\napply for what you can do and what happens if the table changes. Here follows\nsome of the common limitations:\n\nFinding \'Old Rows\'\n------------------\n\nHANDLER READ is not transaction safe, consistent or atomic. It\'s ok for the\nstorage engine to returns rows that existed when you started the scan but that\nwere later deleted. This can happen as the storage engine may cache rows as\npart of the scan from a previous read.\n\nYou may also find rows committed since the scan originally started.\n\nInvisible Columns\n-----------------\n\nHANDLER ... READ also reads the data of invisible-columns.\n\nSystem-Versioned Tables\n-----------------------\n\nHANDLER ... READ reads everything from system-versioned tables, and so\nincludes row_start and row_end fields, as well as all rows that have since\nbeen deleted or changed, including when history partitions are used.\n\nOther Limitations\n-----------------\n\n* If you do an ALTER TABLE, all your HANDLERs for that table are automatically\nclosed.\n* If you do an ALTER TABLE for a table that is used by some other connection\nwith HANDLER, the ALTER TABLE will wait for the HANDLER to be closed.\n* For HASH keys, you must use all key parts when searching for a row.\n* For HASH keys, you can\'t do a key scan of all values. You can only find all\nrows with the same key value.\n* While each HANDLER READ command is atomic, if you do a scan in many steps,\nthen some engines may give you error 1020 if the table changed between the\ncommands. Please refer to the specific engine handler page if this happens.\n\nError Codes\n-----------\n\n* Error 1031 (ER_ILLEGAL_HA) Table storage engine for \'t1\' doesn\'t have this\noption\nIf you get this for HANDLER OPEN it means the storage engine doesn\'t support\nHANDLER calls.\nIf you get this for HANDLER READ it means you are trying to use an incomplete\nHASH key.\n\n* Error 1020 (ER_CHECKREAD) Record has changed since last read in table \'...\'\nThis means that the table changed between two reads and the handler can\'t\nhandle this case for the given scan.\n\nURL: https://mariadb.com/kb/en/handler-commands/','','https://mariadb.com/kb/en/handler-commands/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (463,27,'HANDLER for MEMORY Tables','This article explains how to use HANDLER commands efficiently with MEMORY/HEAP\ntables.\n\nIf you want to scan a table for over different key values, not just search for\nexact key values, you should create your keys with \'USING BTREE\':\n\nCREATE TABLE t1 (a INT, b INT, KEY(a), KEY b USING BTREE (b)) engine=memory;\n\nIn the above table, a is a HASH key that only supports exact matches (=) while\nb is a BTREE key that you can use to scan the table in key order, starting\nfrom start or from a given key value.\n\nThe limitations for HANDLER READ with Memory|HEAP tables are:\n\nLimitations for HASH keys\n-------------------------\n\n* You must use all key parts when searching for a row.\n* You can\'t do a key scan of all values. You can only find all rows with the\nsame key value.\n* READ NEXT gives error 1031 if the tables changed since last read.\n\nLimitations for BTREE keys\n--------------------------\n\n* READ NEXT gives error 1031 if the tables changed since last read. This\nlimitation can be lifted in the future.\n\nLimitations for table scans\n---------------------------\n\n* READ NEXT gives error 1031 if the table was truncated since last READ call.\n\nURL: https://mariadb.com/kb/en/handler-for-memory-tables/','','https://mariadb.com/kb/en/handler-for-memory-tables/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (464,27,'Useful MariaDB Queries','This page is intended to be a quick reference of commonly-used and/or useful\nqueries in MariaDB.\n\nCreating a Table\n----------------\n\nCREATE TABLE t1 ( a INT );\nCREATE TABLE t2 ( b INT );\nCREATE TABLE student_tests (\n name CHAR(10), test CHAR(10), \n score TINYINT, test_date DATE\n);\n\nSee CREATE TABLE for more.\n\nInserting Records\n-----------------\n\nINSERT INTO t1 VALUES (1), (2), (3);\nINSERT INTO t2 VALUES (2), (4);\n\nINSERT INTO student_tests \n (name, test, score, test_date) VALUES\n (\'Chun\', \'SQL\', 75, \'2012-11-05\'), \n (\'Chun\', \'Tuning\', 73, \'2013-06-14\'),\n (\'Esben\', \'SQL\', 43, \'2014-02-11\'), \n (\'Esben\', \'Tuning\', 31, \'2014-02-09\'), \n (\'Kaolin\', \'SQL\', 56, \'2014-01-01\'),\n (\'Kaolin\', \'Tuning\', 88, \'2013-12-29\'), \n (\'Tatiana\', \'SQL\', 87, \'2012-04-28\'), \n (\'Tatiana\', \'Tuning\', 83, \'2013-09-30\');\n\nSee INSERT for more.\n\nUsing AUTO_INCREMENT\n--------------------\n\nThe AUTO_INCREMENT attribute is used to automatically generate a unique\nidentity for new rows.\n\nCREATE TABLE student_details (\n id INT NOT NULL AUTO_INCREMENT, name CHAR(10), \n date_of_birth DATE, PRIMARY KEY (id)\n);\n\nWhen inserting, the id field can be omitted, and is automatically created.\n\nINSERT INTO student_details (name,date_of_birth) VALUES \n (\'Chun\', \'1993-12-31\'), \n (\'Esben\',\'1946-01-01\'),\n (\'Kaolin\',\'1996-07-16\'),\n (\'Tatiana\', \'1988-04-13\');\n\nSELECT * FROM student_details;\n+----+---------+---------------+\n| id | name | date_of_birth |\n+----+---------+---------------+\n| 1 | Chun | 1993-12-31 |\n| 2 | Esben | 1946-01-01 |\n| 3 | Kaolin | 1996-07-16 |\n| 4 | Tatiana | 1988-04-13 |\n+----+---------+---------------+\n\nSee AUTO_INCREMENT for more.\n\nQuerying from two tables on a common value\n------------------------------------------\n\nSELECT * FROM t1 INNER JOIN t2 ON t1.a = t2.b;\n\nThis kind of query is called a join - see JOINS for more.\n\nFinding the Maximum Value\n-------------------------\n\nSELECT MAX(a) FROM t1;\n+--------+\n| MAX(a) |\n+--------+\n| 3 |\n+--------+\n\nSee the MAX() function for more, as well as Finding the maximum value and\ngrouping the results below for a more practical example.\n\nFinding the Minimum Value\n-------------------------\n\nSELECT MIN(a) FROM t1;\n+--------+\n| MIN(a) |\n+--------+\n| 1 |\n+--------+\n\nSee the MIN() function for more.\n\nFinding the Average Value\n-------------------------\n\nSELECT AVG(a) FROM t1;\n+--------+\n| AVG(a) |\n+--------+\n| 2.0000 |\n+--------+\n\nSee the AVG() function for more.\n\nFinding the Maximum Value and Grouping the Results\n--------------------------------------------------\n\nSELECT name, MAX(score) FROM student_tests GROUP BY name;\n+---------+------------+\n| name | MAX(score) |\n+---------+------------+\n| Chun | 75 |\n| Esben | 43 |\n| Kaolin | 88 |\n| Tatiana | 87 |\n+---------+------------+\n\nSee the MAX() function for more.\n\nOrdering Results\n----------------\n\nSELECT name, test, score FROM student_tests ORDER BY score DESC;\n+---------+--------+-------+\n| name | test | score |\n+---------+--------+-------+\n| Kaolin | Tuning | 88 |\n| Tatiana | SQL | 87 |\n| Tatiana | Tuning | 83 |\n| Chun | SQL | 75 |\n| Chun | Tuning | 73 |\n| Kaolin | SQL | 56 |\n| Esben | SQL | 43 |\n| Esben | Tuning | 31 |\n+---------+--------+-------+\n\nSee ORDER BY for more.\n\nFinding the Row with the Minimum of a Particular Column\n-------------------------------------------------------\n\nIn this example, we want to find the lowest test score for any student.\n\nSELECT name,test, score FROM student_tests WHERE score=(SELECT MIN(score) FROM\nstudent);\n+-------+--------+-------+\n| name | test | score |\n+-------+--------+-------+\n| Esben | Tuning | 31 |\n+-------+--------+-------+\n\nFinding Rows with the Maximum Value of a Column by Group\n--------------------------------------------------------\n\nThis example returns the best test results of each student:\n\nSELECT name, test, score FROM student_tests st1 WHERE score = (\n SELECT MAX(score) FROM student st2 WHERE st1.name = st2.name\n); \n+---------+--------+-------+\n| name | test | score |\n+---------+--------+-------+\n| Chun | SQL | 75 |\n| Esben | SQL | 43 |\n| Kaolin | Tuning | 88 |\n| Tatiana | SQL | 87 |\n+---------+--------+-------+\n\nCalculating Age\n---------------\n\nThe TIMESTAMPDIFF function can be used to calculate someone\'s age:\n\nSELECT CURDATE() AS today;\n+------------+\n| today |\n+------------+\n| 2014-02-17 |\n+------------+\n\nSELECT name, date_of_birth, TIMESTAMPDIFF(YEAR,date_of_birth,\'2014-08-02\') AS\nage \n FROM student_details;\n+---------+---------------+------+\n| name | date_of_birth | age |\n+---------+---------------+------+\n| Chun | 1993-12-31 | 20 |\n| Esben | 1946-01-01 | 68 |\n| Kaolin | 1996-07-16 | 18 |\n| Tatiana | 1988-04-13 | 26 |\n+---------+---------------+------+\n\nSee TIMESTAMPDIFF() for more.\n\nUsing User-defined Variables\n----------------------------\n\nThis example sets a user-defined variable with the average test score, and\nthen uses it in a later query to return all results above the average.\n\nSELECT @avg_score:= AVG(score) FROM student_tests;\n+-------------------------+\n| @avg_score:= AVG(score) |\n+-------------------------+\n| 67.000000000 |\n+-------------------------+\n\nSELECT * FROM student_tests WHERE score > @avg_score;\n+---------+--------+-------+------------+\n| name | test | score | test_date |\n+---------+--------+-------+------------+\n| Chun | SQL | 75 | 2012-11-05 |\n| Chun | Tuning | 73 | 2013-06-14 |\n| Kaolin | Tuning | 88 | 2013-12-29 |\n| Tatiana | SQL | 87 | 2012-04-28 |\n| Tatiana | Tuning | 83 | 2013-09-30 |\n+---------+--------+-------+------------+\n\nUser-defined variables can also be used to add an incremental counter to a\nresultset:\n\nSET @count = 0;\n\nSELECT @count := @count + 1 AS counter, name, date_of_birth FROM\nstudent_details;\n+---------+---------+---------------+\n| counter | name | date_of_birth |\n+---------+---------+---------------+\n| 1 | Chun | 1993-12-31 |\n| 2 | Esben | 1946-01-01 |\n| 3 | Kaolin | 1996-07-16 |\n| 4 | Tatiana | 1988-04-13 |\n+---------+---------+---------------+\n\nSee User-defined Variables for more.\n\nView Tables in Order of Size\n----------------------------\n\nReturns a list of all tables in the database, ordered by size:\n\nSELECT table_schema as `DB`, table_name AS `Table`, \n ROUND(((data_length + index_length) / 1024 / 1024), 2) `Size (MB)`\n FROM information_schema.TABLES\n ORDER BY (data_length + index_length) DESC;\n\n+--------------------+---------------------------------------+-----------+\n| DB | Table | Size (MB) |\n+--------------------+---------------------------------------+-----------+\n| wordpress | wp_simple_history_contexts | 7.05 |\n| wordpress | wp_posts | 6.59 |\n| wordpress | wp_simple_history | 3.05 |\n| wordpress | wp_comments | 2.73 |\n| wordpress | wp_commentmeta | 2.47 |\n| wordpress | wp_simple_login_log | 2.03 |\n...\n\nRemoving Duplicates\n-------------------\n\nMariaDB starting with 10.3\n--------------------------\nThe following syntax is only valid MariaDB 10.3 and beyond:\n\nThis example assumes there\'s a unique ID, but that all other fields are\nidentical. In the example below, there are 4 records, 3 of which are\nduplicates, so two of the three duplicates need to be removed. The\nintermediate SELECT is not necessary, but demonstrates what is being returned.\n\nCREATE TABLE t (id INT, f1 VARCHAR(2));\n\nINSERT INTO t VALUES (1,\'a\'), (2,\'a\'), (3,\'b\'), (4,\'a\');\n\nSELECT * FROM t t1, t t2 WHERE t1.f1=t2.f1 AND t1.id<>t2.id AND t1.id=(\n SELECT MAX(id) FROM t tab WHERE tab.f1=t1.f1\n);\n+------+------+------+------+\n| id | f1 | id | f1 |\n+------+------+------+------+\n| 4 | a | 1 | a |\n| 4 | a | 2 | a |\n+------+------+------+------+\n\nDELETE FROM t WHERE id IN (\n SELECT t2.id FROM t t1, t t2 WHERE t1.f1=t2.f1 AND t1.id<>t2.id AND t1.id=(\n SELECT MAX(id) FROM t tab WHERE tab.f1=t1.f1\n )\n);\nQuery OK, 2 rows affected (0.120 sec)\n\nSELECT * FROM t;\n+------+------+\n| id | f1 |\n+------+------+\n| 3 | b |\n| 4 | a |\n+------+------\n\nURL: https://mariadb.com/kb/en/useful-mariadb-queries/','','https://mariadb.com/kb/en/useful-mariadb-queries/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (465,28,'ANALYZE FORMAT=JSON','ANALYZE FORMAT=JSON is a mix of the EXPLAIN FORMAT=JSON and ANALYZE statement\nfeatures. The ANALYZE FORMAT=JSON $statement will execute $statement, and then\nprint the output of EXPLAIN FORMAT=JSON, amended with data from the query\nexecution.\n\nBasic Execution Data\n--------------------\n\nYou can get the following also from tabular ANALYZE statement form:\n\n* r_rows is provided for any node that reads rows. It shows how many rows\nwere read, on average \n* r_filtered is provided whenever there is a condition that is checked. It\nshows the percentage of rows left after checking the condition.\n\nAdvanced Execution Data\n-----------------------\n\nThe most important data not available in the regular tabula ANALYZE statement\nare:\n\n* r_loops field. This shows how many times the node was executed. Most query\nplan elements have this field.\n* r_total_time_ms field. It shows how much time in total was spent executing\nthis node. If the node has subnodes, their execution time is included.\n* r_buffer_size field. Query plan nodes that make use of buffers report the\nsize of buffer that was was used.\n\nSHOW ANALYZE FORMAT=JSON\n------------------------\n\nMariaDB starting with 10.9\n--------------------------\nSHOW ANALYZE FORMAT=JSON for <connection_id> extends ANALYZE [FORMAT=JSON]\n<select> to allow one to analyze a query currently running in another\nconnection.\n\nData About Individual Query Plan Nodes\n--------------------------------------\n\n* filesort node reports whether sorting was done with LIMIT n parameter, and\nhow many rows were in the sort result. \n* block-nl-join node has r_loops field, which allows to tell whether Using\njoin buffer was efficient \n* range-checked-for-each-record reports counters that show the result of the\ncheck. \n* expression-cache is used for subqueries, and it reports how many times the\ncache was used, and what cache hit ratio was.\n* union_result node has r_rows so one can see how many rows were produced\nafter UNION operation\n* and so forth\n\nUse Cases\n---------\n\nSee Examples of ANALYZE FORMAT=JSON.\n\nURL: https://mariadb.com/kb/en/analyze-format-json/','','https://mariadb.com/kb/en/analyze-format-json/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (466,28,'ANALYZE FORMAT=JSON Examples','Example #1\n----------\n\nCustomers who have ordered more than 1M goods.\n\nANALYZE FORMAT=JSON\nSELECT COUNT(*)\nFROM customer\nWHERE\n (SELECT SUM(o_totalprice) FROM orders WHERE o_custkey=c_custkey) > 1000*1000;\n\nThe query takes 40 seconds over cold cache\n\nEXPLAIN: {\n \"query_block\": {\n \"select_id\": 1,\n \"r_loops\": 1,\n \"r_total_time_ms\": 39872,\n \"table\": {\n \"table_name\": \"customer\",\n \"access_type\": \"index\",\n \"key\": \"i_c_nationkey\",\n \"key_length\": \"5\",\n \"used_key_parts\": [\"c_nationkey\"],\n \"r_loops\": 1,\n \"rows\": 150303,\n \"r_rows\": 150000,\n \"r_total_time_ms\": 270.3,\n \"filtered\": 100,\n \"r_filtered\": 60.691,\n \"attached_condition\": \"((subquery#2) > <cache>((1000 * 1000)))\",\n \"using_index\": true\n },\n \"subqueries\": [\n {\n \"query_block\": {\n \"select_id\": 2,\n \"r_loops\": 150000,\n \"r_total_time_ms\": 39531,\n \"table\": {\n \"table_name\": \"orders\",\n \"access_type\": \"ref\",\n \"possible_keys\": [\"i_o_custkey\"],\n \"key\": \"i_o_custkey\",\n \"key_length\": \"5\",\n \"used_key_parts\": [\"o_custkey\"],\n \"ref\": [\"dbt3sf1.customer.c_custkey\"],\n \"r_loops\": 150000,\n \"rows\": 7,\n \"r_rows\": 10,\n \"r_total_time_ms\": 39208,\n \"filtered\": 100,\n \"r_filtered\": 100\n }\n }\n }\n ]\n }\n}\nANALYZE shows that 39.2 seconds were spent in the subquery, which was executed\n150K times (for every row of outer table).\n\nURL: https://mariadb.com/kb/en/analyze-formatjson-examples/','','https://mariadb.com/kb/en/analyze-formatjson-examples/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (467,28,'ANALYZE Statement','Description\n-----------\n\nThe ANALYZE statement is similar to the EXPLAIN statement. ANALYZE statement\nwill invoke the optimizer, execute the statement, and then produce EXPLAIN\noutput instead of the result set. The EXPLAIN output will be annotated with\nstatistics from statement execution.\n\nThis lets one check how close the optimizer\'s estimates about the query plan\nare to the reality. ANALYZE produces an overview, while the ANALYZE\nFORMAT=JSON command provides a more detailed view of the query plan and the\nquery execution.\n\nThe syntax is\n\nANALYZE explainable_statement;\n\nwhere the statement is any statement for which one can run EXPLAIN.\n\nCommand Output\n--------------\n\nConsider an example:\n\nANALYZE SELECT * FROM tbl1 \nWHERE key1 \n BETWEEN 10 AND 200 AND\n col1 LIKE \'foo%\'\\G\n\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: tbl1\n type: range\npossible_keys: key1\n key: key1\n key_len: 5\n ref: NULL\n rows: 181\n r_rows: 181\n filtered: 100.00\n r_filtered: 10.50\n Extra: Using index condition; Using where\n\nCompared to EXPLAIN, ANALYZE produces two extra columns:\n\n* r_rows is an observation-based counterpart of the rows column. It shows how\nmany rows were actually read from the table. \n* r_filtered is an observation-based counterpart of the filtered column. It\nshows which fraction of rows was left after applying the WHERE condition.\n\nInterpreting the Output\n-----------------------\n\nJoins\n-----\n\nLet\'s consider a more complicated example.\n\nANALYZE SELECT *\nFROM orders, customer \nWHERE\n customer.c_custkey=orders.o_custkey AND\n customer.c_acctbal < 0 AND\n orders.o_totalprice > 200*1000\n\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n| id | select_type | table | type | possible_keys | key | key_len |\nref | rows | r_rows | filtered | r_filtered | Extra |\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n| 1 | SIMPLE | customer | ALL | PRIMARY,... | NULL | NULL |\nNULL | 149095 | 150000 | 18.08 | 9.13 | Using where |\n| 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 |\ncustomer.c_custkey | 7 | 10 | 100.00 | 30.03 | Using where |\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n\nHere, one can see that\n\n* For table customer, customer.rows=149095, customer.r_rows=150000. The\nestimate for number of rows we will read was fairly precise\n* customer.filtered=18.08, customer.r_filtered=9.13. The optimizer somewhat\noverestimated the number of records that will match selectivity of condition\nattached to `customer` table (in general, when you have a full scan and\nr_filtered is less than 15%, it\'s time to consider adding an appropriate\nindex).\n* For table orders, orders.rows=7, orders.r_rows=10. This means that on\naverage, there are 7 orders for a given c_custkey, but in our case there were\n10, which is close to the expectation (when this number is consistently far\nfrom the expectation, it may be time to run ANALYZE TABLE, or even edit the\ntable statistics manually to get better query plans).\n* orders.filtered=100, orders.r_filtered=30.03. The optimizer didn\'t have any\nway to estimate which fraction of records will be left after it checks the\ncondition that is attached to table orders (it\'s orders.o_totalprice >\n200*1000). So, it used 100%. In reality, it is 30%. 30% is typically not\nselective enough to warrant adding new indexes. For joins with many tables, it\nmight be worth to collect and use column statistics for columns in question,\nthis may help the optimizer to pick a better query plan.\n\nMeaning of NULL in r_rows and r_filtered\n----------------------------------------\n\nLet\'s modify the previous example slightly\n\nANALYZE SELECT * \nFROM orders, customer \nWHERE\n customer.c_custkey=orders.o_custkey AND\n customer.c_acctbal < -0 AND\n customer.c_comment LIKE \'%foo%\' AND\n orders.o_totalprice > 200*1000;\n\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n| id | select_type | table | type | possible_keys | key | key_len |\nref | rows | r_rows | filtered | r_filtered | Extra |\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n| 1 | SIMPLE | customer | ALL | PRIMARY,... | NULL | NULL |\nNULL | 149095 | 150000 | 18.08 | 0.00 | Using where |\n| 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 |\ncustomer.c_custkey | 7 | NULL | 100.00 | NULL | Using where |\n+----+-------------+----------+------+---------------+-------------+---------+-\n------------------+--------+--------+----------+------------+-------------+\n\nHere, one can see that orders.r_rows=NULL and orders.r_filtered=NULL. This\nmeans that table orders was not scanned even once. Indeed, we can also see\ncustomer.r_filtered=0.00. This shows that a part of WHERE attached to table\n`customer` was never satisfied (or, satisfied in less than 0.01% of cases).\n\nANALYZE FORMAT=JSON\n-------------------\n\nANALYZE FORMAT=JSON produces JSON output. It produces much more information\nthan tabular ANALYZE.\n\nNotes\n-----\n\n* ANALYZE UPDATE or ANALYZE DELETE will actually make updates/deletes (ANALYZE\nSELECT will perform the select operation and then discard the resultset).\n* PostgreSQL has a similar command, EXPLAIN ANALYZE.\n* The EXPLAIN in the slow query log feature allows MariaDB to have ANALYZE\noutput of slow queries printed into the slow query log (see MDEV-6388).\n\nURL: https://mariadb.com/kb/en/analyze-statement/','','https://mariadb.com/kb/en/analyze-statement/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (468,28,'EXPLAIN','Syntax\n------\n\nEXPLAIN tbl_name [col_name | wild]\n\nOr\n\nEXPLAIN [EXTENDED | PARTITIONS | FORMAT=JSON] \n {SELECT select_options | UPDATE update_options | DELETE delete_options}\n\nDescription\n-----------\n\nThe EXPLAIN statement can be used either as a synonym for DESCRIBE or as a way\nto obtain information about how MariaDB executes a SELECT, UPDATE or DELETE\nstatement:\n\n* \'EXPLAIN tbl_name\' is synonymous with \n \'DESCRIBE tbl_name\' or\n \'SHOW COLUMNS FROM tbl_name\'.\n* When you precede a SELECT, UPDATE or a DELETE statement with the keyword \n EXPLAIN, MariaDB displays information from the optimizer\n about the query execution plan. That is, MariaDB explains how it would\n process the SELECT, UPDATE or DELETE, including information about how tables\n are joined and in which order. EXPLAIN EXTENDED can be\n used to provide additional information.\n* EXPLAIN PARTITIONS is useful only when examining queries involving\npartitioned tables. For details, see Partition pruning and selection.\n* ANALYZE statement performs the query as well as producing EXPLAIN output,\nand provides actual as well as estimated statistics.\n* EXPLAIN output can be printed in the slow query log. See EXPLAIN in the Slow\nQuery Log for details.\n\nSHOW EXPLAIN shows the output of a running statement. In some cases, its\noutput can be closer to reality than EXPLAIN.\n\nThe ANALYZE statement runs a statement and returns information about its\nexecution plan. It also shows additional columns, to check how much the\noptimizer\'s estimation about filtering and found rows are close to reality.\n\nThere is an online EXPLAIN Analyzer that you can use to share EXPLAIN and\nEXPLAIN EXTENDED output with others.\n\nEXPLAIN can acquire metadata locks in the same way that SELECT does, as it\nneeds to know table metadata and, sometimes, data as well.\n\nColumns in EXPLAIN ... SELECT\n-----------------------------\n\n+--------------------------------------+--------------------------------------+\n| Column name | Description |\n+--------------------------------------+--------------------------------------+\n| id | Sequence number that shows in which |\n| | order tables are joined. |\n+--------------------------------------+--------------------------------------+\n| select_type | What kind of SELECT the table comes |\n| | from. |\n+--------------------------------------+--------------------------------------+\n| table | Alias name of table. Materialized |\n| | temporary tables for sub queries |\n| | are named <subquery#> |\n+--------------------------------------+--------------------------------------+\n| type | How rows are found from the table |\n| | (join type). |\n+--------------------------------------+--------------------------------------+\n| possible_keys | keys in table that could be used to |\n| | find rows in the table |\n+--------------------------------------+--------------------------------------+\n| key | The name of the key that is used to |\n| | retrieve rows. NULL is no key was |\n| | used. |\n+--------------------------------------+--------------------------------------+\n| key_len | How many bytes of the key that was |\n| | used (shows if we are using only |\n| | parts of the multi-column key). |\n+--------------------------------------+--------------------------------------+\n| ref | The reference that is used as the |\n| | key value. |\n+--------------------------------------+--------------------------------------+\n| rows | An estimate of how many rows we |\n| | will find in the table for each key |\n| | lookup. |\n+--------------------------------------+--------------------------------------+\n| Extra | Extra information about this join. |\n+--------------------------------------+--------------------------------------+\n\nHere are descriptions of the values for some of the more complex columns in\nEXPLAIN ... SELECT:\n\n\"Select_type\" Column\n--------------------\n\nThe select_type column can have the following values:\n\n+-----------------+-----------------------------------+-----------------------+\n| Value | Description | Comment |\n+-----------------+-----------------------------------+-----------------------+\n| DEPENDENT | The SUBQUERY is DEPENDENT. | |\n| SUBQUERY | | |\n+-----------------+-----------------------------------+-----------------------+\n| DEPENDENT UNION | The UNION is DEPENDENT. | |\n+-----------------+-----------------------------------+-----------------------+\n| DERIVED | The SELECT is DERIVED from the | |\n| | PRIMARY. | |\n+-----------------+-----------------------------------+-----------------------+\n| MATERIALIZED | The SUBQUERY is MATERIALIZED. | Materialized tables |\n| | | will be populated at |\n| | | first access and |\n| | | will be accessed by |\n| | | the primary key (= |\n| | | one key lookup). |\n| | | Number of rows in |\n| | | EXPLAIN shows the |\n| | | cost of populating |\n| | | the table |\n+-----------------+-----------------------------------+-----------------------+\n| PRIMARY | The SELECT is in the outermost | |\n| | query, but there is also a | |\n| | SUBQUERY within it. | |\n+-----------------+-----------------------------------+-----------------------+\n| SIMPLE | It is a simple SELECT query | |\n| | without any SUBQUERY or UNION. | |\n+-----------------+-----------------------------------+-----------------------+\n| SUBQUERY | The SELECT is a SUBQUERY of the | |\n| | PRIMARY. | |\n+-----------------+-----------------------------------+-----------------------+\n| UNCACHEABLE | The SUBQUERY is UNCACHEABLE. | |\n| SUBQUERY | | |\n+-----------------+-----------------------------------+-----------------------+\n| UNCACHEABLE | The UNION is UNCACHEABLE. | |\n| UNION | | |\n+-----------------+-----------------------------------+-----------------------+\n| UNION | The SELECT is a UNION of the | |\n| | PRIMARY. | |\n+-----------------+-----------------------------------+-----------------------+\n| UNION RESULT | The result of the UNION. | |\n+-----------------+-----------------------------------+-----------------------+\n| LATERAL DERIVED | The SELECT uses a Lateral | |\n| | Derived optimization | |\n+-----------------+-----------------------------------+-----------------------+\n\n\"Type\" Column\n-------------\n\nThis column contains information on how the table is accessed.\n\n+------------------------+---------------------------------------------------+\n| Value | Description |\n+------------------------+---------------------------------------------------+\n| ALL | A full table scan is done for the table (all |\n| | rows are read). This is bad if the table is |\n| | large and the table is joined against a previous |\n| | table! This happens when the optimizer could |\n| | not find any usable index to access rows. |\n+------------------------+---------------------------------------------------+\n| const | There is only one possibly matching row in the |\n| | table. The row is read before the optimization |\n| | phase and all columns in the table are treated |\n| | as constants. |\n+------------------------+---------------------------------------------------+\n| eq_ref | A unique index is used to find the rows. This is |\n| | the best possible plan to find the row. |\n+------------------------+---------------------------------------------------+\n| fulltext | A fulltext index is used to access the rows. |\n+------------------------+---------------------------------------------------+\n| index_merge | A \'range\' access is done for for several index |\n| | and the found rows are merged. The key column |\n| | shows which keys are used. |\n+------------------------+---------------------------------------------------+\n| index_subquery | This is similar as ref, but used for sub queries |\n| | that are transformed to key lookups. |\n+------------------------+---------------------------------------------------+\n| index | A full scan over the used index. Better than |\n| | ALL but still bad if index is large and the |\n| | table is joined against a previous table. |\n+------------------------+---------------------------------------------------+\n| range | The table will be accessed with a key over one |\n| | or more value ranges. |\n+------------------------+---------------------------------------------------+\n| ref_or_null | Like \'ref\' but in addition another search for |\n| | the \'null\' value is done if the first value was |\n| | not found. This happens usually with sub queries. |\n+------------------------+---------------------------------------------------+\n| ref | A non unique index or prefix of an unique index |\n| | is used to find the rows. Good if the prefix |\n| | doesn\'t match many rows. |\n+------------------------+---------------------------------------------------+\n| system | The table has 0 or 1 rows. |\n+------------------------+---------------------------------------------------+\n| unique_subquery | This is similar as eq_ref, but used for sub |\n| | queries that are transformed to key lookups |\n+------------------------+---------------------------------------------------+\n\n\"Extra\" Column\n--------------\n\nThis column consists of one or more of the following values, separated by \';\'\n\nNote that some of these values are detected after the optimization phase.\n\nThe optimization phase can do the following changes to the WHERE clause:\n\n* Add the expressions from the ON and USING clauses to the WHERE\n clause.\n* Constant propagation: If there is column=constant, replace all column\n instances with this constant.\n* Replace all columns from \'const\' tables with their values.\n* Remove the used key columns from the WHERE (as this will be tested as\n part of the key lookup).\n* Remove impossible constant sub expressions.\n For example WHERE \'(a=1 and a=2) OR b=1\' becomes \'b=1\'.\n* Replace columns with other columns that has identical values:\n Example: WHERE a=b and a=c may be treated\n as \'WHERE a=b and a=c and b=c\'.\n* Add extra conditions to detect impossible row conditions earlier. This\n happens mainly with OUTER JOIN where we in some cases add detection\n of NULL values in the WHERE (Part of \'Not exists\' optimization).\n This can cause an unexpected \'Using where\' in the Extra column.\n* For each table level we remove expressions that have already been tested when\n we read the previous row. Example: When joining tables t1 with t2\n using the following WHERE \'t1.a=1 and t1.a=t2.b\', we don\'t have to\n test \'t1.a=1\' when checking rows in t2 as we already know that this\n expression is true.\n\n+------------------------+---------------------------------------------------+\n| Value | Description |\n+------------------------+---------------------------------------------------+\n| const row not found | The table was a system table (a table with |\n| | should exactly one row), but no row was found. |\n+------------------------+---------------------------------------------------+\n| Distinct | If distinct optimization (remove duplicates) was |','','https://mariadb.com/kb/en/explain/');
+update help_topic set description = CONCAT(description, '\n| | used. This is marked only for the last table in |\n| | the SELECT. |\n+------------------------+---------------------------------------------------+\n| Full scan on NULL key | The table is a part of the sub query and if the |\n| | value that is used to match the sub query will |\n| | be NULL, we will do a full table scan. |\n+------------------------+---------------------------------------------------+\n| Impossible HAVING | The used HAVING clause is always false so the |\n| | SELECT will return no rows. |\n+------------------------+---------------------------------------------------+\n| Impossible WHERE | The used WHERE clause is always false so the |\n| noticed after reading | SELECT will return no rows. This case was |\n| const tables. | detected after we had read all \'const\' tables |\n| | and used the column values as constant in the |\n| | WHERE clause. For example: WHERE const_column=5 |\n| | and const_column had a value of 4. |\n+------------------------+---------------------------------------------------+\n| Impossible WHERE | The used WHERE clause is always false so the |\n| | SELECT will return no rows. For example: WHERE |\n| | 1=2 |\n+------------------------+---------------------------------------------------+\n| No matching min/max | During early optimization of MIN()/MAX() values |\n| row | it was detected that no row could match the |\n| | WHERE clause. The MIN()/MAX() function will |\n| | return NULL. |\n+------------------------+---------------------------------------------------+\n| no matching row in | The table was a const table (a table with only |\n| const table | one possible matching row), but no row was found. |\n+------------------------+---------------------------------------------------+\n| No tables used | The SELECT was a sub query that did not use any |\n| | tables. For example a there was no FROM clause |\n| | or a FROM DUAL clause. |\n+------------------------+---------------------------------------------------+\n| Not exists | Stop searching after more row if we find one |\n| | single matching row. This optimization is used |\n| | with LEFT JOIN where one is explicitly searching |\n| | for rows that doesn\'t exists in the LEFT JOIN |\n| | TABLE. Example: SELECT * FROM t1 LEFT JOIN t2 on |\n| | (...) WHERE t2.not_null_column IS NULL. As |\n| | t2.not_null_column can only be NULL if there was |\n| | no matching row for on condition, we can stop |\n| | searching if we find a single matching row. |\n+------------------------+---------------------------------------------------+\n| Open_frm_only | For information_schema tables. Only the frm |\n| | (table definition file was opened) was opened |\n| | for each matching row. |\n+------------------------+---------------------------------------------------+\n| Open_full_table | For information_schema tables. A full table open |\n| | for each matching row is done to retrieve the |\n| | requested information. (Slow) |\n+------------------------+---------------------------------------------------+\n| Open_trigger_only | For information_schema tables. Only the trigger |\n| | file definition was opened for each matching row. |\n+------------------------+---------------------------------------------------+\n| Range checked for | This only happens when there was no good default |\n| each record (index | index to use but there may some index that could |\n| map: ...) | be used when we can treat all columns from |\n| | previous table as constants. For each row |\n| | combination the optimizer will decide which |\n| | index to use (if any) to fetch a row from this |\n| | table. This is not fast, but faster than a full |\n| | table scan that is the only other choice. The |\n| | index map is a bitmask that shows which index |\n| | are considered for each row condition. |\n+------------------------+---------------------------------------------------+\n| Scanned 0/1/all | For information_schema tables. Shows how many |\n| databases | times we had to do a directory scan. |\n+------------------------+---------------------------------------------------+\n| Select tables | All tables in the join was optimized away. This |\n| optimized away | happens when we are only using COUNT(*), MIN() |\n| | and MAX() functions in the SELECT and we where |\n| | able to replace all of these with constants. |\n+------------------------+---------------------------------------------------+\n| Skip_open_table | For information_schema tables. The queried table |\n| | didn\'t need to be opened. |\n+------------------------+---------------------------------------------------+\n| unique row not found | The table was detected to be a const table (a |\n| | table with only one possible matching row) |\n| | during the early optimization phase, but no row |\n| | was found. |\n+------------------------+---------------------------------------------------+\n| Using filesort | Filesort is needed to resolve the query. This |\n| | means an extra phase where we first collect all |\n| | columns to sort, sort them with a disk based |\n| | merge sort and then use the sorted set to |\n| | retrieve the rows in sorted order. If the column |\n| | set is small, we store all the columns in the |\n| | sort file to not have to go to the database to |\n| | retrieve them again. |\n+------------------------+---------------------------------------------------+\n| Using index | Only the index is used to retrieve the needed |\n| | information from the table. There is no need to |\n| | perform an extra seek to retrieve the actual |\n| | record. |\n+------------------------+---------------------------------------------------+\n| Using index condition | Like \'Using where\' but the where condition is |\n| | pushed down to the table engine for internal |\n| | optimization at the index level. |\n+------------------------+---------------------------------------------------+\n| Using index | Like \'Using index condition\' but in addition we |\n| condition(BKA) | use batch key access to retrieve rows. |\n+------------------------+---------------------------------------------------+\n| Using index for | The index is being used to resolve a GROUP BY or |\n| group-by | DISTINCT query. The rows are not read. This is |\n| | very efficient if the table has a lot of |\n| | identical index entries as duplicates are |\n| | quickly jumped over. |\n+------------------------+---------------------------------------------------+\n| Using intersect(...) | For index_merge joins. Shows which index are |\n| | part of the intersect. |\n+------------------------+---------------------------------------------------+\n| Using join buffer | We store previous row combinations in a row |\n| | buffer to be able to match each row against all |\n| | of the rows combinations in the join buffer at |\n| | one go. |\n+------------------------+---------------------------------------------------+\n| Using sort_union(...) | For index_merge joins. Shows which index are |\n| | part of the union. |\n+------------------------+---------------------------------------------------+\n| Using temporary | A temporary table is created to hold the result. |\n| | This typically happens if you are using GROUP |\n| | BY, DISTINCT or ORDER BY. |\n+------------------------+---------------------------------------------------+\n| Using where | A WHERE expression (in additional to the |\n| | possible key lookup) is used to check if the row |\n| | should be accepted. If you don\'t have \'Using |\n| | where\' together with a join type of ALL, you are |\n| | probably doing something wrong! |\n+------------------------+---------------------------------------------------+\n| Using where with | Like \'Using where\' but the where condition is |\n| pushed condition | pushed down to the table engine for internal |\n| | optimization at the row level. |\n+------------------------+---------------------------------------------------+\n| Using buffer | The UPDATE statement will first buffer the rows, |\n| | and then run the updates, rather than do updates |\n| | on the fly. See Using Buffer UPDATE Algorithm |\n| | for a detailed explanation. |\n+------------------------+---------------------------------------------------+\n\nEXPLAIN EXTENDED\n----------------\n\nThe EXTENDED keyword adds another column, filtered, to the output. This is a\npercentage estimate of the table rows that will be filtered by the condition.\n\nAn EXPLAIN EXTENDED will always throw a warning, as it adds extra Message\ninformation to a subsequent SHOW WARNINGS statement. This includes what the\nSELECT query would look like after optimizing and rewriting rules are applied\nand how the optimizer qualifies columns and tables.\n\nExamples\n--------\n\nAs synonym for DESCRIBE or SHOW COLUMNS FROM:\n\nDESCRIBE city;\n+------------+----------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+------------+----------+------+-----+---------+----------------+\n| Id | int(11) | NO | PRI | NULL | auto_increment |\n| Name | char(35) | YES | | NULL | |\n| Country | char(3) | NO | UNI | | |\n| District | char(20) | YES | MUL | | |\n| Population | int(11) | YES | | NULL | |\n+------------+----------+------+-----+---------+----------------+\n\nA simple set of examples to see how EXPLAIN can identify poor index usage:\n\nCREATE TABLE IF NOT EXISTS `employees_example` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `first_name` varchar(30) NOT NULL,\n `last_name` varchar(40) NOT NULL,\n `position` varchar(25) NOT NULL,\n `home_address` varchar(50) NOT NULL,\n `home_phone` varchar(12) NOT NULL,\n `employee_code` varchar(25) NOT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `employee_code` (`employee_code`),\n KEY `first_name` (`first_name`,`last_name`)\n) ENGINE=Aria;\n\nINSERT INTO `employees_example` (`first_name`, `last_name`, `position`,\n`home_address`, `home_phone`, `employee_code`)\n VALUES\n (\'Mustapha\', \'Mond\', \'Chief Executive Officer\', \'692 Promiscuous Plaza\',\n\'326-555-3492\', \'MM1\'),\n (\'Henry\', \'Foster\', \'Store Manager\', \'314 Savage Circle\', \'326-555-3847\',\n\'HF1\'),\n (\'Bernard\', \'Marx\', \'Cashier\', \'1240 Ambient Avenue\', \'326-555-8456\', \'BM1\'),\n (\'Lenina\', \'Crowne\', \'Cashier\', \'281 Bumblepuppy Boulevard\', \'328-555-2349\',\n\'LC1\'),\n (\'Fanny\', \'Crowne\', \'Restocker\', \'1023 Bokanovsky Lane\', \'326-555-6329\',\n\'FC1\'),\n (\'Helmholtz\', \'Watson\', \'Janitor\', \'944 Soma Court\', \'329-555-2478\', \'HW1\');\n\nSHOW INDEXES FROM employees_example;\n+-------------------+------------+---------------+--------------+--------------\n+-----------+-------------+----------+--------+------+------------+---------+--\n------------+\n| Table | Non_unique | Key_name | Seq_in_index | Column_name \n | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |\nIndex_comment |\n+-------------------+------------+---------------+--------------+--------------\n+-----------+-------------+----------+--------+------+------------+---------+--\n------------+\n| employees_example | 0 | PRIMARY | 1 | id \n | A | 7 | NULL | NULL | | BTREE | |\n |\n| employees_example | 0 | employee_code | 1 |\nemployee_code | A | 7 | NULL | NULL | | BTREE \n | | |\n| employees_example | 1 | first_name | 1 | first_name \n | A | NULL | NULL | NULL | | BTREE | |\n |') WHERE help_topic_id = 468;
+update help_topic set description = CONCAT(description, '\n| employees_example | 1 | first_name | 2 | last_name \n | A | NULL | NULL | NULL | | BTREE | |\n |\n+-------------------+------------+---------------+--------------+--------------\n+-----------+-------------+----------+--------+------+------------+---------+--\n------------+\n\nSELECT on a primary key:\n\nEXPLAIN SELECT * FROM employees_example WHERE id=1;\n+------+-------------+-------------------+-------+---------------+---------+---\n-----+-------+------+-------+\n| id | select_type | table | type | possible_keys | key |\nkey_len | ref | rows | Extra |\n+------+-------------+-------------------+-------+---------------+---------+---\n-----+-------+------+-------+\n| 1 | SIMPLE | employees_example | const | PRIMARY | PRIMARY | 4\n | const | 1 | |\n+------+-------------+-------------------+-------+---------------+---------+---\n-----+-------+------+-------+\n\nThe type is const, which means that only one possible result could be\nreturned. Now, returning the same record but searching by their phone number:\n\nEXPLAIN SELECT * FROM employees_example WHERE home_phone=\'326-555-3492\';\n+------+-------------+-------------------+------+---------------+------+-------\n-+------+------+-------------+\n| id | select_type | table | type | possible_keys | key |\nkey_len | ref | rows | Extra |\n+------+-------------+-------------------+------+---------------+------+-------\n-+------+------+-------------+\n| 1 | SIMPLE | employees_example | ALL | NULL | NULL | NULL \n | NULL | 6 | Using where |\n+------+-------------+-------------------+------+---------------+------+-------\n-+------+------+-------------+\n\nHere, the type is All, which means no index could be used. Looking at the rows\ncount, a full table scan (all six rows) had to be performed in order to\nretrieve the record. If it\'s a requirement to search by phone number, an index\nwill have to be created.\n\nSHOW EXPLAIN example:\n\nSHOW EXPLAIN FOR 1;\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n| id | select_type | table | type | possible_keys | key | key_len | ref |\nrows | Extra |\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n| 1 | SIMPLE | tbl | index | NULL | a | 5 | NULL |\n1000107 | Using index |\n+------+-------------+-------+-------+---------------+------+---------+------+-\n-------+-------------+\n1 row in set, 1 warning (0.00 sec)\n\nExample of ref_or_null Optimization\n-----------------------------------\n\nSELECT * FROM table_name\n WHERE key_column=expr OR key_column IS NULL;\n\nref_or_null is something that often happens when you use subqueries with NOT\nIN as then one has to do an extra check for NULL values if the first value\ndidn\'t have a matching row.\n\nURL: https://mariadb.com/kb/en/explain/') WHERE help_topic_id = 468;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (469,28,'EXPLAIN ANALYZE','The syntax for the EXPLAIN ANALYZE feature was changed to ANALYZE statement,\navailable since MariaDB 10.1.0. See ANALYZE statement.\n\nURL: https://mariadb.com/kb/en/explain-analyze/','','https://mariadb.com/kb/en/explain-analyze/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (470,28,'EXPLAIN FORMAT=JSON','Synopsis\n--------\n\nEXPLAIN FORMAT=JSON is a variant of EXPLAIN command that produces output in\nJSON form. The output always has one row which has only one column titled\n\"JSON\". The contents are a JSON representation of the query plan, formatted\nfor readability:\n\nEXPLAIN FORMAT=JSON SELECT * FROM t1 WHERE col1=1\\G\n\n*************************** 1. row ***************************\nEXPLAIN: {\n \"query_block\": {\n \"select_id\": 1,\n \"table\": {\n \"table_name\": \"t1\",\n \"access_type\": \"ALL\",\n \"rows\": 1000,\n \"filtered\": 100,\n \"attached_condition\": \"(t1.col1 = 1)\"\n }\n }\n}\n\nOutput is different from MySQL\n------------------------------\n\nThe output of MariaDB\'s EXPLAIN FORMAT=JSON is different from EXPLAIN\nFORMAT=JSON in MySQL.The reasons for that are:\n\n* MySQL\'s output has deficiencies. Some are listed here: EXPLAIN FORMAT=JSON\nin MySQL\n* The output of MySQL\'s EXPLAIN FORMAT=JSON is not defined. Even MySQL\nWorkbench has trouble parsing it (see this blog post).\n* MariaDB has query optimizations that MySQL does not have. Ergo, MariaDB\ngenerates query plans that MySQL does not generate.\n\nA (as yet incomplete) list of how MariaDB\'s output is different from MySQL can\nbe found here: EXPLAIN FORMAT=JSON differences from MySQL.\n\nOutput Format\n-------------\n\nTODO: MariaDB\'s output format description.\n\nURL: https://mariadb.com/kb/en/explain-format-json/','','https://mariadb.com/kb/en/explain-format-json/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (471,28,'DESCRIBE','Syntax\n------\n\n{DESCRIBE | DESC} tbl_name [col_name | wild]\n\nDescription\n-----------\n\nDESCRIBE provides information about the columns in a table. It is a shortcut\nfor SHOW COLUMNS FROM. These statements also display information for views.\n\ncol_name can be a column name, or a string containing the SQL \"%\" and \"_\"\nwildcard characters to obtain output only for the columns with names matching\nthe string. There is no need to enclose the string within quotes unless it\ncontains spaces or other special characters.\n\nDESCRIBE city;\n+------------+----------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+------------+----------+------+-----+---------+----------------+\n| Id | int(11) | NO | PRI | NULL | auto_increment |\n| Name | char(35) | YES | | NULL | |\n| Country | char(3) | NO | UNI | | |\n| District | char(20) | YES | MUL | | |\n| Population | int(11) | YES | | NULL | |\n+------------+----------+------+-----+---------+----------------+\n\nThe description for SHOW COLUMNS provides more information about the output\ncolumns.\n\nURL: https://mariadb.com/kb/en/describe/','','https://mariadb.com/kb/en/describe/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (472,29,'Identifier Names','Databases, tables, indexes, columns, aliases, views, stored routines,\ntriggers, events, variables, partitions, tablespaces, savepoints, labels,\nusers, roles, are collectively known as identifiers, and have certain rules\nfor naming.\n\nIdentifiers may be quoted using the backtick character - `. Quoting is\noptional for identifiers that don\'t contain special characters, or for\nidentifiers that are not reserved words. If the ANSI_QUOTES SQL_MODE flag is\nset, double quotes (\") can also be used to quote identifiers. If the MSSQL\nflag is set, square brackets ([ and ]) can be used for quoting.\n\nEven when using reserved words as names, fully qualified names do not need to\nbe quoted. For example, test.select has only one possible meaning, so it is\ncorrectly parsed even without quotes.\n\nUnquoted\n--------\n\nThe following characters are valid, and allow identifiers to be unquoted:\n\n* ASCII: [0-9,a-z,A-Z$_] (numerals 0-9, basic Latin letters, both lowercase\nand uppercase, dollar sign, underscore)\n* Extended: U+0080 .. U+FFFF\n\nQuoted\n------\n\nThe following characters are valid, but identifiers using them must be quoted:\n\n* ASCII: U+0001 .. U+007F (full Unicode Basic Multilingual Plane (BMP) except\nfor U+0000)\n* Extended: U+0080 .. U+FFFF \n* Identifier quotes can themselves be used as part of an identifier, as long\nas they are quoted.\n\nFurther Rules\n-------------\n\nThere are a number of other rules for identifiers:\n\n* Identifiers are stored as Unicode (UTF-8)\n* Identifiers may or may not be case-sensitive. See Indentifier\nCase-sensitivity.\n* Database, table and column names can\'t end with space characters\n* Identifier names may begin with a numeral, but can\'t only contain numerals\nunless quoted.\n* An identifier starting with a numeral, followed by an \'e\', may be parsed as\na floating point number, and needs to be quoted.\n* Identifiers are not permitted to contain the ASCII NUL character (U+0000)\nand supplementary characters (U+10000 and higher).\n* Names such as 5e6, 9e are not prohibited, but it\'s strongly recommended not\nto use them, as they could lead to ambiguity in certain contexts, being\ntreated as a number or expression.\n* User variables cannot be used as part of an identifier, or as an identifier\nin an SQL statement.\n\nQuote Character\n---------------\n\nThe regular quote character is the backtick character - `, but if the\nANSI_QUOTES SQL_MODE option is specified, a regular double quote - \" may be\nused as well.\n\nThe backtick character can be used as part of an identifier. In that case the\nidentifier needs to be quoted. The quote character can be the backtick, but in\nthat case, the backtick in the name must be escaped with another backtick.\n\nMaximum Length\n--------------\n\n* Databases, tables, columns, indexes, constraints, stored routines, triggers,\nevents, views, tablespaces, servers and log file groups have a maximum length\nof 64 characters.\n* Compound statement labels have a maximum length of 16 characters\n* Aliases have a maximum length of 256 characters, except for column aliases\nin CREATE VIEW statements, which are checked against the maximum column length\nof 64 characters (not the maximum alias length of 256 characters).\n* Users have a maximum length of 80 characters.\n* Roles have a maximum length of 128 characters.\n* Multi-byte characters do not count extra towards towards the character limit.\n\nMultiple Identifiers\n--------------------\n\nMariaDB allows the column name to be used on its own if the reference will be\nunambiguous, or the table name to be used with the column name, or all three\nof the database, table and column names. A period is used to separate the\nidentifiers, and the period can be surrounded by spaces.\n\nExamples\n--------\n\nUsing the period to separate identifiers:\n\nCREATE TABLE t1 (i int);\n\nINSERT INTO t1(i) VALUES (10);\n\nSELECT i FROM t1;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nSELECT t1.i FROM t1;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nSELECT test.t1.i FROM t1;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nThe period can be separated by spaces:\n\nSELECT test . t1 . i FROM t1;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nResolving ambiguity:\n\nCREATE TABLE t2 (i int);\n\nSELECT i FROM t1 LEFT JOIN t2 ON t1.i=t2.i;\nERROR 1052 (23000): Column \'i\' in field list is ambiguous\n\nSELECT t1.i FROM t1 LEFT JOIN t2 ON t1.i=t2.i;\n+------+\n| i |\n+------+\n| 10 |\n+------+\n\nCreating a table with characters that require quoting:\n\nCREATE TABLE 123% (i int);\nERROR 1064 (42000): You have an error in your SQL syntax; \n check the manual that corresponds to your MariaDB server version for the\nright syntax \n to use near \'123% (i int)\' at line 1\n\nCREATE TABLE `123%` (i int);\nQuery OK, 0 rows affected (0.85 sec)\n\nCREATE TABLE `TABLE` (i int);\nQuery OK, 0 rows affected (0.36 sec)\n\nUsing double quotes as a quoting character:\n\nCREATE TABLE \"SELECT\" (i int);\nERROR 1064 (42000): You have an error in your SQL syntax; \n check the manual that corresponds to your MariaDB server version for the\nright syntax \n to use near \'\"SELECT\" (i int)\' at line 1\n\nSET sql_mode=\'ANSI_QUOTES\';\nQuery OK, 0 rows affected (0.03 sec)\n\nCREATE TABLE \"SELECT\" (i int);\nQuery OK, 0 rows affected (0.46 sec)\n\nUsing an identifier quote as part of an identifier name:\n\nSHOW VARIABLES LIKE \'sql_mode\';\n+---------------+-------------+\n| Variable_name | Value |\n+---------------+-------------+\n| sql_mode | ANSI_QUOTES |\n+---------------+-------------+\n\nCREATE TABLE \"fg`d\" (i int);\nQuery OK, 0 rows affected (0.34 sec)\n\nCreating the table named * (Unicode number: U+002A) requires quoting.\n\nCREATE TABLE `*` (a INT);\n\nFloating point ambiguity:\n\nCREATE TABLE 8984444cce5d (x INT);\nQuery OK, 0 rows affected (0.38 sec)\n\nCREATE TABLE 8981e56cce5d (x INT);\nERROR 1064 (42000): You have an error in your SQL syntax; \n check the manual that corresponds to your MariaDB server version for the\nright syntax \n to use near \'8981e56cce5d (x INT)\' at line 1\n\nCREATE TABLE `8981e56cce5d` (x INT);\nQuery OK, 0 rows affected (0.39 sec)\n\nURL: https://mariadb.com/kb/en/identifier-names/','','https://mariadb.com/kb/en/identifier-names/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (473,29,'Identifier Case-sensitivity','Whether objects are case-sensitive or not is partly determined by the\nunderlying operating system. Unix-based systems are case-sensitive, Windows is\nnot, while Mac OS X is usually case-insensitive by default, but devices can be\nconfigured as case-sensitive using Disk Utility.\n\nDatabase, table, table aliases and trigger names are affected by the systems\ncase-sensitivity, while index, column, column aliases, stored routine and\nevent names are never case sensitive.\n\nLog file group name are case sensitive.\n\nThe lower_case_table_names server system variable plays a key role. It\ndetermines whether table names, aliases and database names are compared in a\ncase-sensitive manner. If set to 0 (the default on Unix-based systems), table\nnames and aliases and database names are compared in a case-sensitive manner.\nIf set to 1 (the default on Windows), names are stored in lowercase and not\ncompared in a case-sensitive manner. If set to 2 (the default on Mac OS X),\nnames are stored as declared, but compared in lowercase.\n\nIt is thus possible to make Unix-based systems behave like Windows and ignore\ncase-sensitivity, but the reverse is not true, as the underlying Windows\nfilesystem can not support this.\n\nEven on case-insensitive systems, you are required to use the same case\nconsistently within the same statement. The following statement fails, as it\nrefers to the table name in a different case.\n\nSELECT * FROM a_table WHERE A_table.id>10;\n\nFor a full list of identifier naming rules, see Identifier Names.\n\nPlease note that lower_case_table_names is a database initialization\nparameter. This means that, along with innodb_page_size, this variable must be\nset before running mysql_install_db, and will not change the behavior of\nservers unless applied before the creation of core system databases.\n\nURL: https://mariadb.com/kb/en/identifier-case-sensitivity/','','https://mariadb.com/kb/en/identifier-case-sensitivity/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (474,29,'Binary Literals','Binary literals can be written in one of the following formats: b\'value\',\nB\'value\' or 0bvalue, where value is a string composed by 0 and 1 digits.\n\nBinary literals are interpreted as binary strings, and are convenient to\nrepresent VARBINARY, BINARY or BIT values.\n\nTo convert a binary literal into an integer, just add 0.\n\nExamples\n--------\n\nPrinting the value as a binary string:\n\nSELECT 0b1000001;\n+-----------+\n| 0b1000001 |\n+-----------+\n| A |\n+-----------+\n\nConverting the same value into a number:\n\nSELECT 0b1000001+0;\n+-------------+\n| 0b1000001+0 |\n+-------------+\n| 65 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/binary-literals/','','https://mariadb.com/kb/en/binary-literals/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (475,29,'Boolean Literals','In MariaDB, FALSE is a synonym of 0 and TRUE is a synonym of 1. These\nconstants are case insensitive, so TRUE, True, and true are equivalent.\n\nThese terms are not synonyms of 0 and 1 when used with the IS operator. So,\nfor example, 10 IS TRUE returns 1, while 10 = TRUE returns 0 (because 1 != 10).\n\nThe IS operator accepts a third constant exists: UNKNOWN. It is always a\nsynonym of NULL.\n\nTRUE and FALSE are reserved words, while UNKNOWN is not.\n\nURL: https://mariadb.com/kb/en/sql-language-structure-boolean-literals/','','https://mariadb.com/kb/en/sql-language-structure-boolean-literals/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (476,29,'Date and Time Literals','Standard syntaxes\n-----------------\n\nMariaDB supports the SQL standard and ODBC syntaxes for DATE, TIME and\nTIMESTAMP literals.\n\nSQL standard syntax:\n\n* DATE \'string\'\n* TIME \'string\'\n* TIMESTAMP \'string\'\n\nODBC syntax:\n\n* {d \'string\'}\n* {t \'string\'}\n* {ts \'string\'}\n\nThe timestamp literals are treated as DATETIME literals, because in MariaDB\nthe range of DATETIME is closer to the TIMESTAMP range in the SQL standard.\n\nstring is a string in a proper format, as explained below.\n\nDATE literals\n-------------\n\nA DATE string is a string in one of the following formats: \'YYYY-MM-DD\' or\n\'YY-MM-DD\'. Note that any punctuation character can be used as delimiter. All\ndelimiters must consist of 1 character. Different delimiters can be used in\nthe same string. Delimiters are optional (but if one delimiter is used, all\ndelimiters must be used).\n\nA DATE literal can also be an integer, in one of the following formats:\nYYYYMMDD or YYMMDD.\n\nAll the following DATE literals are valid, and they all represent the same\nvalue:\n\n\'19940101\'\n\'940101\'\n\'1994-01-01\'\n\'94/01/01\'\n\'1994-01/01\'\n\'94:01!01\'\n19940101\n940101\n\nDATETIME literals\n-----------------\n\nA DATETIME string is a string in one of the following formats: \'YYYY-MM-DD\nHH:MM:SS\' or \'YY-MM-DD HH:MM:SS\'. Note that any punctuation character can be\nused as delimiter for the date part and for the time part. All delimiters must\nconsist of 1 character. Different delimiters can be used in the same string.\nThe hours, minutes and seconds parts can consist of one character. For this\nreason, delimiters are mandatory for DATETIME literals.\n\nThe delimiter between the date part and the time part can be a T or any\nsequence of space characters (including tabs, new lines and carriage returns).\n\nA DATETIME literal can also be a number, in one of the following formats:\nYYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD or YYMMDD. In this case, all the time\nsubparts must consist of 2 digits.\n\nAll the following DATE literals are valid, and they all represent the same\nvalue:\n\n\'1994-01-01T12:30:03\'\n\'1994/01/01\\n\\t 12+30+03\'\n\'1994/01\\\\01\\n\\t 12+30-03\'\n\'1994-01-01 12:30:3\'\n\nTIME literals\n-------------\n\nA TIME string is a string in one of the following formats: \'D HH:MM:SS\',\n\'HH:MM:SS, \'D HH:MM\', \'HH:MM\', \'D HH\', or \'SS\'. D is a value from 0 to 34\nwhich represents days. : is the only allowed delimiter for TIME literals.\nDelimiters are mandatory, with an exception: the \'HHMMSS\' format is allowed.\nWhen delimiters are used, each part of the literal can consist of one\ncharacter.\n\nA TIME literal can also be a number in one of the following formats: HHMMSS,\nMMSS, or SS.\n\nThe following literals are equivalent:\n\n\'09:05:00\'\n\'9:05:0\'\n\'9:5:0\'\n\'090500\'\n\n2-digit years\n-------------\n\nThe year part in DATE and DATETIME literals is determined as follows:\n\n* 70 - 99 = 1970 - 1999\n* 00 - 69 = 2000 - 2069\n\nMicroseconds\n------------\n\nDATETIME and TIME literals can have an optional microseconds part. For both\nstring and numeric forms, it is expressed as a decimal part. Up to 6 decimal\ndigits are allowed. Examples:\n\n\'12:30:00.123456\'\n123000.123456\n\nSee Microseconds in MariaDB for details.\n\nDate and time literals and the SQL_MODE\n---------------------------------------\n\nUnless the SQL_MODE NO_ZERO_DATE flag is set, some special values are allowed:\nthe \'0000-00-00\' DATE, the \'00:00:00\' TIME, and the 0000-00-00 00:00:00\nDATETIME.\n\nIf the ALLOW_INVALID_DATES flag is set, the invalid dates (for example, 30th\nFebruary) are allowed. If not, if the NO_ZERO_DATE is set, an error is\nproduced; otherwise, a zero-date is returned.\n\nUnless the NO_ZERO_IN_DATE flag is set, each subpart of a date or time value\n(years, hours...) can be set to 0.\n\nURL: https://mariadb.com/kb/en/date-and-time-literals/','','https://mariadb.com/kb/en/date-and-time-literals/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (477,29,'Hexadecimal Literals','Hexadecimal literals can be written using any of the following syntaxes:\n\n* x\'value\'\n* X\'value\' (SQL standard)\n* 0xvalue (ODBC)\n\nvalue is a sequence of hexadecimal digits (from 0 to 9 and from A to F). The\ncase of the digits does not matter. With the first two syntaxes, value must\nconsist of an even number of digits. With the last syntax, digits can be even,\nand they are treated as if they had an extra 0 at the beginning.\n\nNormally, hexadecimal literals are interpreted as binary string, where each\npair of digits represents a character. When used in a numeric context, they\nare interpreted as integers. (See the example below). In no case can a\nhexadecimal literal be a decimal number.\n\nThe first two syntaxes; X\'value\' and x\'value, follow the SQL standard, and\nbehave as a string in all contexts in MariaDB since MariaDB 10.0.3 and MariaDB\n5.5.31 (fixing MDEV-4489). The latter syntax, 0xvalue, is a MySQL/MariaDB\nextension for hex hybrids and behaves as a string or as a number depending on\ncontext. MySQL treats all syntaxes the same, so there may be different results\nin MariaDB and MySQL (see below).\n\nExamples\n--------\n\nRepresenting the a character with the three syntaxes explained above:\n\nSELECT x\'61\', X\'61\', 0x61;\n+-------+-------+------+\n| x\'61\' | X\'61\' | 0x61 |\n+-------+-------+------+\n| a | a | a |\n+-------+-------+------+\n\nHexadecimal literals in a numeric context:\n\nSELECT 0 + 0xF, -0xF;\n+---------+------+\n| 0 + 0xF | -0xF |\n+---------+------+\n| 15 | -15 |\n+---------+------+\n\nFun with Types\n--------------\n\nCREATE TABLE t1 (a INT, b VARCHAR(10));\nINSERT INTO t1 VALUES (0x31, 0x61),(COALESCE(0x31), COALESCE(0x61));\n\nSELECT * FROM t1;\n+------+------+\n| a | b |\n+------+------+\n| 49 | a |\n| 1 | a |\n+------+------+\n\nThe reason for the differing results above is that when 0x31 is inserted\ndirectly to the column, it\'s treated as a number, while when 0x31 is passed to\nCOALESCE(), it\'s treated as a string, because:\n\n* HEX values have a string data type by default.\n* COALESCE() has the same data type as the argument.\n\nDifferences Between MariaDB and MySQL\n-------------------------------------\n\nSELECT x\'0a\'+0;\n+---------+\n| x\'0a\'+0 |\n+---------+\n| 0 |\n+---------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect DOUBLE value: \'\\x0A\'\n\nSELECT X\'0a\'+0;\n+---------+\n| X\'0a\'+0 |\n+---------+\n| 0 |\n+---------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect DOUBLE value: \'\\x0A\'\n\nSELECT 0x0a+0;\n+--------+\n| 0x0a+0 |\n+--------+\n| 10 |\n+--------+\n\nIn MySQL (up until at least MySQL 8.0.26):\n\nSELECT x\'0a\'+0;\n+---------+\n| x\'0a\'+0 |\n+---------+\n| 10 |\n+---------+\n\nSELECT X\'0a\'+0;\n+---------+\n| X\'0a\'+0 |\n+---------+\n| 10 |\n+---------+\n\nSELECT 0x0a+0;\n+--------+\n| 0x0a+0 |\n+--------+\n| 10 |\n+--------+\n\nURL: https://mariadb.com/kb/en/hexadecimal-literals/','','https://mariadb.com/kb/en/hexadecimal-literals/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (478,29,'Identifier Qualifiers','Qualifiers are used within SQL statements to reference data structures, such\nas databases, tables, or columns. For example, typically a SELECT query\ncontains references to some columns and at least one table.\n\nQualifiers can be composed by one or more identifiers, where the initial parts\naffect the context within which the final identifier is interpreted:\n\n* For a database, only the database identifier needs to be specified.\n* For objects which are contained in a database (like tables, views,\nfunctions, etc) the database identifier can be specified. If no database is\nspecified, the current database is assumed (see USE and DATABASE() for more\ndetails). If there is no default database and no database is specified, an\nerror is issued.\n* For column names, the table and the database are generally obvious from the\ncontext of the statement. It is however possible to specify the table\nidentifier, or the database identifier plus the table identifier.\n* An identifier is fully-qualified if it contains all possible qualifiers, for\nexample, the following column is fully qualified: db_name.tbl_name.col_name.\n\nIf a qualifier is composed by more than one identifier, a dot (.) must be used\nas a separator. All identifiers can be quoted individually. Extra spacing\n(including new lines and tabs) is allowed.\n\nAll the following examples are valid:\n\n* db_name.tbl_name.col_name\n* tbl_name\n* `db_name`.`tbl_name`.`col_name`\n* `db_name` . `tbl_name`\n* db_name. tbl_name\n\nIf a table identifier is prefixed with a dot (.), the default database is\nassumed. This syntax is supported for ODBC compliance, but has no practical\neffect on MariaDB. These qualifiers are equivalent:\n\n* tbl_name\n* . tbl_name\n* .`tbl_name`\n* . `tbl_name`\n\nFor DML statements, it is possible to specify a list of the partitions using\nthe PARTITION clause. See Partition Pruning and Selection for details.\n\nURL: https://mariadb.com/kb/en/identifier-qualifiers/','','https://mariadb.com/kb/en/identifier-qualifiers/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (479,29,'Identifier to File Name Mapping','Some identifiers map to a file name on the filesystem. Databases each have\ntheir own directory, while, depending on the storage engine, table names and\nindex names may map to a file name.\n\nNot all characters that are allowed in table names can be used in file names.\nEvery filesystem has its own rules of what characters can be used in file\nnames. To let the user create tables using all characters allowed in the SQL\nStandard and to not depend on whatever particular filesystem a particular\ndatabase resides, MariaDB encodes \"potentially unsafe\" characters in the table\nname to derive the corresponding file name.\n\nThis is implemented using a special character set. MariaDB converts a table\nname to the \"filename\" character set to get the file name for this table. And\nit converts the file name from the \"filename\" character set to, for example,\nutf8 to get the table name for this file name.\n\nThe conversion rules are as follows: if the identifier is made up only of\nbasic Latin numbers, letters and/or the underscore character, the encoding\nmatches the name (see however Identifier Case Sensitivity). Otherwise they are\nencoded according to the following table:\n\n+-----------------+------------+-----------+--------+-----------+-----------+\n| Code Range | Pattern | Number | Used | Unused | Blocks |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 00C0..017F | [@][0..4][ | 5*20= 100 | 97 | 3 | Latin-1 |\n| | ..z] | | | | Supplemen |\n| | | | | | + Latin |\n| | | | | | Extended- |\n| | | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 0370..03FF | [@][5..9][ | 5*20= 100 | 88 | 12 | Greek |\n| | ..z] | | | | and |\n| | | | | | Coptic |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 0400..052F | [@][g..z][ | 20*7= 140 | 137 | 3 | Cyrillic |\n| | ..6] | | | | + |\n| | | | | | Cyrillic |\n| | | | | | Supplemen |\n| | | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 0530..058F | [@][g..z][ | 20*2= 40 | 38 | 2 | Armenian |\n| | ..8] | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 2160..217F | [@][g..z][ | 20*1= 20 | 16 | 4 | Number |\n| | ] | | | | Forms |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 0180..02AF | [@][g..z][ | 20*11=220 | 203 | 17 | Latin |\n| | ..k] | | | | Extended- |\n| | | | | | + IPA |\n| | | | | | Extension |\n| | | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 1E00..1EFF | [@][g..z][ | 20*7= 140 | 136 | 4 | Latin |\n| | ..r] | | | | Extended |\n| | | | | | Additiona |\n| | | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 1F00..1FFF | [@][g..z][ | 20*8= 160 | 144 | 16 | Greek |\n| | ..z] | | | | Extended |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| .... .... | [@][a..f][ | 6*20= 120 | 0 | 120 | RESERVED |\n| | ..z] | | | | |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| 24B6..24E9 | [@][@][a.. | 26 | 26 | 0 | Enclosed |\n| | ] | | | | Alphanume |\n| | | | | | ics |\n+-----------------+------------+-----------+--------+-----------+-----------+\n| FF21..FF5A | [@][a..z][ | 26 | 26 | 0 | Halfwidth |\n| | ] | | | | and |\n| | | | | | Fullwidth |\n| | | | | | forms |\n+-----------------+------------+-----------+--------+-----------+-----------+\n\nCode Range values are UCS-2.\n\nAll of this encoding happens transparently at the filesystem level with one\nexception. Until MySQL 5.1.6, an old encoding was used. Identifiers created in\na version before MySQL 5.1.6, and which haven\'t been updated to the new\nencoding, the server prefixes mysql50 to their name.\n\nExamples\n--------\n\nFind the file name for a table with a non-Latin1 name:\n\nselect cast(convert(\"this_is_таблица\" USING filename) as binary);\n+------------------------------------------------------------------+\n| cast(convert(\"this_is_таблица\" USING filename) as binary) |\n+------------------------------------------------------------------+\n| this_is_@y0@g0@h0@r0@o0@i1@g0 |\n+------------------------------------------------------------------+\n\nFind the table name for a file name:\n\nselect convert(_filename \"this_is_@y0@g0@h0@r0@o0@i1@g0\" USING utf8);\n+---------------------------------------------------------------+\n| convert(_filename \"this_is_@y0@g0@h0@r0@o0@i1@g0\" USING utf8) |\n+---------------------------------------------------------------+\n| this_is_таблица |\n+---------------------------------------------------------------+\n\nAn old table created before MySQL 5.1.6, with the old encoding:\n\nSHOW TABLES;\n+--------------------+\n| Tables_in_test |\n+--------------------+\n| #mysql50#table@1 |\n+--------------------+\n\nThe prefix needs to be supplied to reference this table:\n\nSHOW COLUMNS FROM `table@1`;\nERROR 1146 (42S02): Table \'test.table@1\' doesn\'t exist\n\nSHOW COLUMNS FROM `#mysql50#table@1`;\n+-------+---------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-------+\n| i | int(11) | YES | | NULL | |\n+-------+---------+------+-----+---------+-------+\n\nURL: https://mariadb.com/kb/en/identifier-to-file-name-mapping/','','https://mariadb.com/kb/en/identifier-to-file-name-mapping/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (480,29,'Numeric Literals','Numeric literals are written as a sequence of digits from 0 to 9. Initial\nzeros are ignored. A sign can always precede the digits, but it is optional\nfor positive numbers. In decimal numbers, the integer part and the decimal\npart are divided with a dot (.).\n\nIf the integer part is zero, it can be omitted, but the literal must begin\nwith a dot.\n\nThe notation with exponent can be used. The exponent is preceded by an E or e\ncharacter. The exponent can be preceded by a sign and must be an integer. A\nnumber N with an exponent part X, is calculated as N * POW(10, X).\n\nIn some cases, adding zeroes at the end of a decimal number can increment the\nprecision of the expression where the number is used. For example, PI() by\ndefault returns a number with 6 decimal digits. But the PI()+0.0000000000\nexpression (with 10 zeroes) returns a number with 10 decimal digits.\n\nHexadecimal literals are interpreted as numbers when used in numeric contexts.\n\nExamples\n--------\n\n10\n+10\n-10\n\nAll these literals are equivalent:\n\n0.1\n.1\n+0.1\n+.1\n\nWith exponents:\n\n0.2E3 -- 0.2 * POW(10, 3) = 200\n.2e3\n.2e+2\n1.1e-10 -- 0.00000000011\n-1.1e10 -- -11000000000\n\nURL: https://mariadb.com/kb/en/numeric-iterals/','','https://mariadb.com/kb/en/numeric-iterals/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (481,29,'Reserved Words','The following is a list of all reserved words in MariaDB.\n\nReserved words cannot be used as Identifiers, unless they are quoted.\n\nThe definitive list of reserved words for each version can be found by\nexamining the sql/lex.h and sql/sql_yacc.yy files.\n\nReserved Words\n--------------\n\n+--------------------------------------------+--------------------------------+\n| Keyword | Notes |\n+--------------------------------------------+--------------------------------+\n| ACCESSIBLE | |\n+--------------------------------------------+--------------------------------+\n| ADD | |\n+--------------------------------------------+--------------------------------+\n| ALL | |\n+--------------------------------------------+--------------------------------+\n| ALTER | |\n+--------------------------------------------+--------------------------------+\n| ANALYZE | |\n+--------------------------------------------+--------------------------------+\n| AND | |\n+--------------------------------------------+--------------------------------+\n| AS | |\n+--------------------------------------------+--------------------------------+\n| ASC | |\n+--------------------------------------------+--------------------------------+\n| ASENSITIVE | |\n+--------------------------------------------+--------------------------------+\n| BEFORE | |\n+--------------------------------------------+--------------------------------+\n| BETWEEN | |\n+--------------------------------------------+--------------------------------+\n| BIGINT | |\n+--------------------------------------------+--------------------------------+\n| BINARY | |\n+--------------------------------------------+--------------------------------+\n| BLOB | |\n+--------------------------------------------+--------------------------------+\n| BOTH | |\n+--------------------------------------------+--------------------------------+\n| BY | |\n+--------------------------------------------+--------------------------------+\n| CALL | |\n+--------------------------------------------+--------------------------------+\n| CASCADE | |\n+--------------------------------------------+--------------------------------+\n| CASE | |\n+--------------------------------------------+--------------------------------+\n| CHANGE | |\n+--------------------------------------------+--------------------------------+\n| CHAR | |\n+--------------------------------------------+--------------------------------+\n| CHARACTER | |\n+--------------------------------------------+--------------------------------+\n| CHECK | |\n+--------------------------------------------+--------------------------------+\n| COLLATE | |\n+--------------------------------------------+--------------------------------+\n| COLUMN | |\n+--------------------------------------------+--------------------------------+\n| CONDITION | |\n+--------------------------------------------+--------------------------------+\n| CONSTRAINT | |\n+--------------------------------------------+--------------------------------+\n| CONTINUE | |\n+--------------------------------------------+--------------------------------+\n| CONVERT | |\n+--------------------------------------------+--------------------------------+\n| CREATE | |\n+--------------------------------------------+--------------------------------+\n| CROSS | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_DATE | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_ROLE | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_TIME | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_TIMESTAMP | |\n+--------------------------------------------+--------------------------------+\n| CURRENT_USER | |\n+--------------------------------------------+--------------------------------+\n| CURSOR | |\n+--------------------------------------------+--------------------------------+\n| DATABASE | |\n+--------------------------------------------+--------------------------------+\n| DATABASES | |\n+--------------------------------------------+--------------------------------+\n| DAY_HOUR | |\n+--------------------------------------------+--------------------------------+\n| DAY_MICROSECOND | |\n+--------------------------------------------+--------------------------------+\n| DAY_MINUTE | |\n+--------------------------------------------+--------------------------------+\n| DAY_SECOND | |\n+--------------------------------------------+--------------------------------+\n| DEC | |\n+--------------------------------------------+--------------------------------+\n| DECIMAL | |\n+--------------------------------------------+--------------------------------+\n| DECLARE | |\n+--------------------------------------------+--------------------------------+\n| DEFAULT | |\n+--------------------------------------------+--------------------------------+\n| DELAYED | |\n+--------------------------------------------+--------------------------------+\n| DELETE | |\n+--------------------------------------------+--------------------------------+\n| DELETE_DOMAIN_ID | |\n+--------------------------------------------+--------------------------------+\n| DESC | |\n+--------------------------------------------+--------------------------------+\n| DESCRIBE | |\n+--------------------------------------------+--------------------------------+\n| DETERMINISTIC | |\n+--------------------------------------------+--------------------------------+\n| DISTINCT | |\n+--------------------------------------------+--------------------------------+\n| DISTINCTROW | |\n+--------------------------------------------+--------------------------------+\n| DIV | |\n+--------------------------------------------+--------------------------------+\n| DO_DOMAIN_IDS | |\n+--------------------------------------------+--------------------------------+\n| DOUBLE | |\n+--------------------------------------------+--------------------------------+\n| DROP | |\n+--------------------------------------------+--------------------------------+\n| DUAL | |\n+--------------------------------------------+--------------------------------+\n| EACH | |\n+--------------------------------------------+--------------------------------+\n| ELSE | |\n+--------------------------------------------+--------------------------------+\n| ELSEIF | |\n+--------------------------------------------+--------------------------------+\n| ENCLOSED | |\n+--------------------------------------------+--------------------------------+\n| ESCAPED | |\n+--------------------------------------------+--------------------------------+\n| EXCEPT | Added in MariaDB 10.3.0 |\n+--------------------------------------------+--------------------------------+\n| EXISTS | |\n+--------------------------------------------+--------------------------------+\n| EXIT | |\n+--------------------------------------------+--------------------------------+\n| EXPLAIN | |\n+--------------------------------------------+--------------------------------+\n| FALSE | |\n+--------------------------------------------+--------------------------------+\n| FETCH | |\n+--------------------------------------------+--------------------------------+\n| FLOAT | |\n+--------------------------------------------+--------------------------------+\n| FLOAT4 | |\n+--------------------------------------------+--------------------------------+\n| FLOAT8 | |\n+--------------------------------------------+--------------------------------+\n| FOR | |\n+--------------------------------------------+--------------------------------+\n| FORCE | |\n+--------------------------------------------+--------------------------------+\n| FOREIGN | |\n+--------------------------------------------+--------------------------------+\n| FROM | |\n+--------------------------------------------+--------------------------------+\n| FULLTEXT | |\n+--------------------------------------------+--------------------------------+\n| GENERAL | |\n+--------------------------------------------+--------------------------------+\n| GRANT | |\n+--------------------------------------------+--------------------------------+\n| GROUP | |\n+--------------------------------------------+--------------------------------+\n| HAVING | |\n+--------------------------------------------+--------------------------------+\n| HIGH_PRIORITY | |\n+--------------------------------------------+--------------------------------+\n| HOUR_MICROSECOND | |\n+--------------------------------------------+--------------------------------+\n| HOUR_MINUTE | |\n+--------------------------------------------+--------------------------------+\n| HOUR_SECOND | |','','https://mariadb.com/kb/en/reserved-words/');
+update help_topic set description = CONCAT(description, '\n+--------------------------------------------+--------------------------------+\n| IF | |\n+--------------------------------------------+--------------------------------+\n| IGNORE | |\n+--------------------------------------------+--------------------------------+\n| IGNORE_DOMAIN_IDS | |\n+--------------------------------------------+--------------------------------+\n| IGNORE_SERVER_IDS | |\n+--------------------------------------------+--------------------------------+\n| IN | |\n+--------------------------------------------+--------------------------------+\n| INDEX | |\n+--------------------------------------------+--------------------------------+\n| INFILE | |\n+--------------------------------------------+--------------------------------+\n| INNER | |\n+--------------------------------------------+--------------------------------+\n| INOUT | |\n+--------------------------------------------+--------------------------------+\n| INSENSITIVE | |\n+--------------------------------------------+--------------------------------+\n| INSERT | |\n+--------------------------------------------+--------------------------------+\n| INT | |\n+--------------------------------------------+--------------------------------+\n| INT1 | |\n+--------------------------------------------+--------------------------------+\n| INT2 | |\n+--------------------------------------------+--------------------------------+\n| INT3 | |\n+--------------------------------------------+--------------------------------+\n| INT4 | |\n+--------------------------------------------+--------------------------------+\n| INT8 | |\n+--------------------------------------------+--------------------------------+\n| INTEGER | |\n+--------------------------------------------+--------------------------------+\n| INTERSECT | Added in MariaDB 10.3.0 |\n+--------------------------------------------+--------------------------------+\n| INTERVAL | |\n+--------------------------------------------+--------------------------------+\n| INTO | |\n+--------------------------------------------+--------------------------------+\n| IS | |\n+--------------------------------------------+--------------------------------+\n| ITERATE | |\n+--------------------------------------------+--------------------------------+\n| JOIN | |\n+--------------------------------------------+--------------------------------+\n| KEY | |\n+--------------------------------------------+--------------------------------+\n| KEYS | |\n+--------------------------------------------+--------------------------------+\n| KILL | |\n+--------------------------------------------+--------------------------------+\n| LEADING | |\n+--------------------------------------------+--------------------------------+\n| LEAVE | |\n+--------------------------------------------+--------------------------------+\n| LEFT | |\n+--------------------------------------------+--------------------------------+\n| LIKE | |\n+--------------------------------------------+--------------------------------+\n| LIMIT | |\n+--------------------------------------------+--------------------------------+\n| LINEAR | |\n+--------------------------------------------+--------------------------------+\n| LINES | |\n+--------------------------------------------+--------------------------------+\n| LOAD | |\n+--------------------------------------------+--------------------------------+\n| LOCALTIME | |\n+--------------------------------------------+--------------------------------+\n| LOCALTIMESTAMP | |\n+--------------------------------------------+--------------------------------+\n| LOCK | |\n+--------------------------------------------+--------------------------------+\n| LONG | |\n+--------------------------------------------+--------------------------------+\n| LONGBLOB | |\n+--------------------------------------------+--------------------------------+\n| LONGTEXT | |\n+--------------------------------------------+--------------------------------+\n| LOOP | |\n+--------------------------------------------+--------------------------------+\n| LOW_PRIORITY | |\n+--------------------------------------------+--------------------------------+\n| MASTER_HEARTBEAT_PERIOD | |\n+--------------------------------------------+--------------------------------+\n| MASTER_SSL_VERIFY_SERVER_CERT | |\n+--------------------------------------------+--------------------------------+\n| MATCH | |\n+--------------------------------------------+--------------------------------+\n| MAXVALUE | |\n+--------------------------------------------+--------------------------------+\n| MEDIUMBLOB | |\n+--------------------------------------------+--------------------------------+\n| MEDIUMINT | |\n+--------------------------------------------+--------------------------------+\n| MEDIUMTEXT | |\n+--------------------------------------------+--------------------------------+\n| MIDDLEINT | |\n+--------------------------------------------+--------------------------------+\n| MINUTE_MICROSECOND | |\n+--------------------------------------------+--------------------------------+\n| MINUTE_SECOND | |\n+--------------------------------------------+--------------------------------+\n| MOD | |\n+--------------------------------------------+--------------------------------+\n| MODIFIES | |\n+--------------------------------------------+--------------------------------+\n| NATURAL | |\n+--------------------------------------------+--------------------------------+\n| NOT | |\n+--------------------------------------------+--------------------------------+\n| NO_WRITE_TO_BINLOG | |\n+--------------------------------------------+--------------------------------+\n| NULL | |\n+--------------------------------------------+--------------------------------+\n| NUMERIC | |\n+--------------------------------------------+--------------------------------+\n| OFFSET | Added in MariaDB 10.6.0 |\n+--------------------------------------------+--------------------------------+\n| ON | |\n+--------------------------------------------+--------------------------------+\n| OPTIMIZE | |\n+--------------------------------------------+--------------------------------+\n| OPTION | |\n+--------------------------------------------+--------------------------------+\n| OPTIONALLY | |\n+--------------------------------------------+--------------------------------+\n| OR | |\n+--------------------------------------------+--------------------------------+\n| ORDER | |\n+--------------------------------------------+--------------------------------+\n| OUT | |\n+--------------------------------------------+--------------------------------+\n| OUTER | |\n+--------------------------------------------+--------------------------------+\n| OUTFILE | |\n+--------------------------------------------+--------------------------------+\n| OVER | |\n+--------------------------------------------+--------------------------------+\n| PAGE_CHECKSUM | |\n+--------------------------------------------+--------------------------------+\n| PARSE_VCOL_EXPR | |\n+--------------------------------------------+--------------------------------+\n| PARTITION | |\n+--------------------------------------------+--------------------------------+\n| POSITION | |\n+--------------------------------------------+--------------------------------+\n| PRECISION | |\n+--------------------------------------------+--------------------------------+\n| PRIMARY | |\n+--------------------------------------------+--------------------------------+\n| PROCEDURE | |\n+--------------------------------------------+--------------------------------+\n| PURGE | |\n+--------------------------------------------+--------------------------------+\n| RANGE | |\n+--------------------------------------------+--------------------------------+\n| READ | |\n+--------------------------------------------+--------------------------------+\n| READS | |\n+--------------------------------------------+--------------------------------+\n| READ_WRITE | |\n+--------------------------------------------+--------------------------------+\n| REAL | |\n+--------------------------------------------+--------------------------------+\n| RECURSIVE | |\n+--------------------------------------------+--------------------------------+\n| REF_SYSTEM_ID | |\n+--------------------------------------------+--------------------------------+\n| REFERENCES | |\n+--------------------------------------------+--------------------------------+\n| REGEXP | |\n+--------------------------------------------+--------------------------------+\n| RELEASE | |\n+--------------------------------------------+--------------------------------+\n| RENAME | |') WHERE help_topic_id = 481;
+update help_topic set description = CONCAT(description, '\n+--------------------------------------------+--------------------------------+\n| REPEAT | |\n+--------------------------------------------+--------------------------------+\n| REPLACE | |\n+--------------------------------------------+--------------------------------+\n| REQUIRE | |\n+--------------------------------------------+--------------------------------+\n| RESIGNAL | |\n+--------------------------------------------+--------------------------------+\n| RESTRICT | |\n+--------------------------------------------+--------------------------------+\n| RETURN | |\n+--------------------------------------------+--------------------------------+\n| RETURNING | |\n+--------------------------------------------+--------------------------------+\n| REVOKE | |\n+--------------------------------------------+--------------------------------+\n| RIGHT | |\n+--------------------------------------------+--------------------------------+\n| RLIKE | |\n+--------------------------------------------+--------------------------------+\n| ROWS | |\n+--------------------------------------------+--------------------------------+\n| SCHEMA | |\n+--------------------------------------------+--------------------------------+\n| SCHEMAS | |\n+--------------------------------------------+--------------------------------+\n| SECOND_MICROSECOND | |\n+--------------------------------------------+--------------------------------+\n| SELECT | |\n+--------------------------------------------+--------------------------------+\n| SENSITIVE | |\n+--------------------------------------------+--------------------------------+\n| SEPARATOR | |\n+--------------------------------------------+--------------------------------+\n| SET | |\n+--------------------------------------------+--------------------------------+\n| SHOW | |\n+--------------------------------------------+--------------------------------+\n| SIGNAL | |\n+--------------------------------------------+--------------------------------+\n| SLOW | |\n+--------------------------------------------+--------------------------------+\n| SMALLINT | |\n+--------------------------------------------+--------------------------------+\n| SPATIAL | |\n+--------------------------------------------+--------------------------------+\n| SPECIFIC | |\n+--------------------------------------------+--------------------------------+\n| SQL | |\n+--------------------------------------------+--------------------------------+\n| SQLEXCEPTION | |\n+--------------------------------------------+--------------------------------+\n| SQLSTATE | |\n+--------------------------------------------+--------------------------------+\n| SQLWARNING | |\n+--------------------------------------------+--------------------------------+\n| SQL_BIG_RESULT | |\n+--------------------------------------------+--------------------------------+\n| SQL_CALC_FOUND_ROWS | |\n+--------------------------------------------+--------------------------------+\n| SQL_SMALL_RESULT | |\n+--------------------------------------------+--------------------------------+\n| SSL | |\n+--------------------------------------------+--------------------------------+\n| STARTING | |\n+--------------------------------------------+--------------------------------+\n| STATS_AUTO_RECALC | |\n+--------------------------------------------+--------------------------------+\n| STATS_PERSISTENT | |\n+--------------------------------------------+--------------------------------+\n| STATS_SAMPLE_PAGES | |\n+--------------------------------------------+--------------------------------+\n| STRAIGHT_JOIN | |\n+--------------------------------------------+--------------------------------+\n| TABLE | |\n+--------------------------------------------+--------------------------------+\n| TERMINATED | |\n+--------------------------------------------+--------------------------------+\n| THEN | |\n+--------------------------------------------+--------------------------------+\n| TINYBLOB | |\n+--------------------------------------------+--------------------------------+\n| TINYINT | |\n+--------------------------------------------+--------------------------------+\n| TINYTEXT | |\n+--------------------------------------------+--------------------------------+\n| TO | |\n+--------------------------------------------+--------------------------------+\n| TRAILING | |\n+--------------------------------------------+--------------------------------+\n| TRIGGER | |\n+--------------------------------------------+--------------------------------+\n| TRUE | |\n+--------------------------------------------+--------------------------------+\n| UNDO | |\n+--------------------------------------------+--------------------------------+\n| UNION | |\n+--------------------------------------------+--------------------------------+\n| UNIQUE | |\n+--------------------------------------------+--------------------------------+\n| UNLOCK | |\n+--------------------------------------------+--------------------------------+\n| UNSIGNED | |\n+--------------------------------------------+--------------------------------+\n| UPDATE | |\n+--------------------------------------------+--------------------------------+\n| USAGE | |\n+--------------------------------------------+--------------------------------+\n| USE | |\n+--------------------------------------------+--------------------------------+\n| USING | |\n+--------------------------------------------+--------------------------------+\n| UTC_DATE | |\n+--------------------------------------------+--------------------------------+\n| UTC_TIME | |\n+--------------------------------------------+--------------------------------+\n| UTC_TIMESTAMP | |\n+--------------------------------------------+--------------------------------+\n| VALUES | |\n+--------------------------------------------+--------------------------------+\n| VARBINARY | |\n+--------------------------------------------+--------------------------------+\n| VARCHAR | |\n+--------------------------------------------+--------------------------------+\n| VARCHARACTER | |\n+--------------------------------------------+--------------------------------+\n| VARYING | |\n+--------------------------------------------+--------------------------------+\n| WHEN | |\n+--------------------------------------------+--------------------------------+\n| WHERE | |\n+--------------------------------------------+--------------------------------+\n| WHILE | |\n+--------------------------------------------+--------------------------------+\n| WINDOW | Only disallowed for table |\n| | aliases. |\n+--------------------------------------------+--------------------------------+\n| WITH | |\n+--------------------------------------------+--------------------------------+\n| WRITE | |\n+--------------------------------------------+--------------------------------+\n| XOR | |\n+--------------------------------------------+--------------------------------+\n| YEAR_MONTH | |\n+--------------------------------------------+--------------------------------+\n| ZEROFILL | |\n+--------------------------------------------+--------------------------------+\n\nExceptions\n----------\n\nSome keywords are exceptions for historical reasons, and are permitted as\nunquoted identifiers. These include:\n\n+-----------------------------------------------------------------------------+\n| Keyword |\n+-----------------------------------------------------------------------------+\n| ACTION |\n+-----------------------------------------------------------------------------+\n| BIT |\n+-----------------------------------------------------------------------------+\n| DATE |\n+-----------------------------------------------------------------------------+\n| ENUM |\n+-----------------------------------------------------------------------------+\n| NO |\n+-----------------------------------------------------------------------------+\n| TEXT |\n+-----------------------------------------------------------------------------+\n| TIME |\n+-----------------------------------------------------------------------------+\n| TIMESTAMP |\n+-----------------------------------------------------------------------------+\n\nOracle Mode\n-----------\n\nIn Oracle mode, from MariaDB 10.3, there are a number of extra reserved words:\n\n+--------------------------------------------+--------------------------------+\n| Keyword | Notes |\n+--------------------------------------------+--------------------------------+\n| BODY | |\n+--------------------------------------------+--------------------------------+\n| ELSIF | |\n+--------------------------------------------+--------------------------------+\n| GOTO | |\n+--------------------------------------------+--------------------------------+\n| HISTORY | <= MariaDB 10.3.6 only |') WHERE help_topic_id = 481;
+update help_topic set description = CONCAT(description, '\n+--------------------------------------------+--------------------------------+\n| MINUS | From MariaDB 10.6.1 |\n+--------------------------------------------+--------------------------------+\n| OTHERS | |\n+--------------------------------------------+--------------------------------+\n| PACKAGE | |\n+--------------------------------------------+--------------------------------+\n| PERIOD | <= MariaDB 10.3.6 only |\n+--------------------------------------------+--------------------------------+\n| RAISE | |\n+--------------------------------------------+--------------------------------+\n| ROWNUM | From MariaDB 10.6.1 |\n+--------------------------------------------+--------------------------------+\n| ROWTYPE | |\n+--------------------------------------------+--------------------------------+\n| SYSDATE | From MariaDB 10.6.1 |\n+--------------------------------------------+--------------------------------+\n| SYSTEM | <= MariaDB 10.3.6 only. Note |\n| | however that SYSTEM sometimes |\n| | needs to be quoted to avoid |\n| | confusion with |\n| | System-versioned tables. |\n+--------------------------------------------+--------------------------------+\n| SYSTEM_TIME | <= MariaDB 10.3.6 only |\n+--------------------------------------------+--------------------------------+\n| VERSIONING | <= MariaDB 10.3.6 only |\n+--------------------------------------------+--------------------------------+\n| WITHOUT | <= MariaDB 10.3.6 only |\n+--------------------------------------------+--------------------------------+\n\nFunction Names\n--------------\n\nIf the IGNORE_SPACE SQL_MODE flag is set, function names become reserved words.\n\nURL: https://mariadb.com/kb/en/reserved-words/') WHERE help_topic_id = 481;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (482,29,'String Literals','Strings are sequences of characters and are enclosed with quotes.\n\nThe syntax is:\n\n[_charset_name]\'string\' [COLLATE collation_name]\n\nFor example:\n\n\'The MariaDB Foundation\'\n_utf8 \'Foundation\' COLLATE utf8_unicode_ci;\n\nStrings can either be enclosed in single quotes or in double quotes (the same\ncharacter must be used to both open and close the string).\n\nThe ANSI SQL-standard does not permit double quotes for enclosing strings, and\nalthough MariaDB does by default, if the MariaDB server has enabled the\nANSI_QUOTES_SQL SQL_MODE, double quotes will be treated as being used for\nidentifiers instead of strings.\n\nStrings that are next to each other are automatically concatenated. For\nexample:\n\n\'The \' \'MariaDB \' \'Foundation\'\n\nand\n\n\'The MariaDB Foundation\'\n\nare equivalent.\n\nThe \\ (backslash character) is used to escape characters (unless the SQL_MODE\nhasn\'t been set to NO_BACKSLASH_ESCAPES). For example:\n\n\'MariaDB\'s new features\'\n\nis not a valid string because of the single quote in the middle of the string,\nwhich is treated as if it closes the string, but is actually meant as part of\nthe string, an apostrophe. The backslash character helps in situations like\nthis:\n\n\'MariaDB\\\'s new features\'\n\nis now a valid string, and if displayed, will appear without the backslash.\n\nSELECT \'MariaDB\\\'s new features\';\n+------------------------+\n| MariaDB\'s new features |\n+------------------------+\n| MariaDB\'s new features |\n+------------------------+\n\nAnother way to escape the quoting character is repeating it twice:\n\nSELECT \'I\'\'m here\', \"\"\"Double\"\"\";\n+----------+----------+\n| I\'m here | \"Double\" |\n+----------+----------+\n| I\'m here | \"Double\" |\n+----------+----------+\n\nEscape Sequences\n----------------\n\nThere are other escape sequences also. Here is a full list:\n\n+-----------------------------------------------+-----------------------------+\n| Escape sequence | Character |\n+-----------------------------------------------+-----------------------------+\n| \\0 | ASCII NUL (0x00). |\n+-----------------------------------------------+-----------------------------+\n| \\\' | Single quote (\"\'\"). |\n+-----------------------------------------------+-----------------------------+\n| \\\" | Double quote (\"\"\"). |\n+-----------------------------------------------+-----------------------------+\n| \\b | Backspace. |\n+-----------------------------------------------+-----------------------------+\n| \\n | Newline, or linefeed,. |\n+-----------------------------------------------+-----------------------------+\n| \\r | Carriage return. |\n+-----------------------------------------------+-----------------------------+\n| \\t | Tab. |\n+-----------------------------------------------+-----------------------------+\n| \\Z | ASCII 26 (Control+Z). See |\n| | note following the table. |\n+-----------------------------------------------+-----------------------------+\n| \\\\ | Backslash (\"\\\"). |\n+-----------------------------------------------+-----------------------------+\n| \\% | \"%\" character. See note |\n| | following the table. |\n+-----------------------------------------------+-----------------------------+\n| \\_ | A \"_\" character. See note |\n| | following the table. |\n+-----------------------------------------------+-----------------------------+\n\nEscaping the % and _ characters can be necessary when using the LIKE operator,\nwhich treats them as special characters.\n\nThe ASCII 26 character (\\Z) needs to be escaped when included in a batch file\nwhich needs to be executed in Windows. The reason is that ASCII 26, in\nWindows, is the end of file (EOF).\n\nBackslash (\\), if not used as an escape character, must always be escaped.\nWhen followed by a character that is not in the above table, backslashes will\nsimply be ignored.\n\nURL: https://mariadb.com/kb/en/string-literals/','','https://mariadb.com/kb/en/string-literals/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (483,29,'Table Value Constructors','MariaDB starting with 10.3.3\n----------------------------\nTable Value Constructors were introduced in MariaDB 10.3.3\n\nSyntax\n------\n\nVALUES ( row_value[, row_value...]), (...)...\n\nDescription\n-----------\n\nIn Unions, Views, and sub-queries, a Table Value Constructor (TVC) allows you\nto inject arbitrary values into the result-set. The given values must have the\nsame number of columns as the result-set, otherwise it returns Error 1222.\n\nExamples\n--------\n\nUsing TVC\'s with UNION operations:\n\nCREATE TABLE test.t1 (val1 INT, val2 INT);\nINSERT INTO test.t1 VALUES(5, 8), (3, 4), (1, 2);\n\nSELECT * FROM test.t1\nUNION\nVALUES (70, 90), (100, 110);\n\n+------+------+\n| val1 | val2 |\n+------+------+\n| 5 | 8 | \n| 3 | 4 |\n| 1 | 2 |\n| 70 | 90 |\n| 100 | 110 |\n+------+------+\n\nUsing TVC\'s with a CREATE VIEW statement:\n\nCREATE VIEW v1 AS VALUES (7, 9), (9, 10);\n\nSELECT * FROM v1;\n+---+----+\n| 7 | 9 |\n+---+----+\n| 7 | 9 |\n| 9 | 10 |\n+---+----+\n\nUsing TVC with an ORDER BY clause:\n\nSELECT * FROM test.t1\nUNION\nVALUES (10, 20), (30, 40), (50, 60), (70, 80)\nORDER BY val1 DESC;\n\nUsing TVC with LIMIT clause:\n\nSELECT * FROM test.t1\nUNION\nVALUES (10, 20), (30, 40), (50, 60), (70, 80)\nLIMIT 2 OFFSET 4;\n\n+------+------+\n| val1 | val2 |\n+------+------+\n| 30 | 40 | \n| 50 | 60 |\n+------+------+\n\nURL: https://mariadb.com/kb/en/table-value-constructors/','','https://mariadb.com/kb/en/table-value-constructors/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (484,29,'User-Defined Variables','User-defined variables are variables which can be created by the user and\nexist in the session. This means that no one can access user-defined variables\nthat have been set by another user, and when the session is closed these\nvariables expire. However, these variables can be shared between several\nqueries and stored programs.\n\nUser-defined variables names must be preceded by a single at character (@).\nWhile it is safe to use a reserved word as a user-variable name, the only\nallowed characters are ASCII letters, digits, dollar sign ($), underscore (_)\nand dot (.). If other characters are used, the name can be quoted in one of\nthe following ways:\n\n* @`var_name`\n* @\'var_name\'\n* @\"var_name\"\n\nThese characters can be escaped as usual.\n\nUser-variables names are case insensitive, though they were case sensitive in\nMySQL 4.1 and older versions.\n\nUser-defined variables cannot be declared. They can be read even if no value\nhas been set yet; in that case, they are NULL. To set a value for a\nuser-defined variable you can use:\n\n* SET statement;\n* := operator within a SQL statement;\n* SELECT ... INTO.\n\nSince user-defined variables type cannot be declared, the only way to force\ntheir type is using CAST() or CONVERT():\n\nSET @str = CAST(123 AS CHAR(5));\n\nIf a variable has not been used yet, its value is NULL:\n\nSELECT @x IS NULL;\n+------------+\n| @x IS NULL |\n+------------+\n| 1 |\n+------------+\n\nIt is unsafe to read a user-defined variable and set its value in the same\nstatement (unless the command is SET), because the order of these actions is\nundefined.\n\nUser-defined variables can be used in most MariaDB\'s statements and clauses\nwhich accept an SQL expression. However there are some exceptions, like the\nLIMIT clause.\n\nThey must be used to PREPARE a prepared statement:\n\n@sql = \'DELETE FROM my_table WHERE c>1;\';\nPREPARE stmt FROM @sql;\nEXECUTE stmt;\nDEALLOCATE PREPARE stmt;\n\nAnother common use is to include a counter in a query:\n\nSET @var = 0;\nSELECT a, b, c, (@var:=@var+1) AS counter FROM my_table;\n\nInformation Schema\n------------------\n\nUser-defined variables can be viewed in the Information Schema USER_VARIABLES\nTable (as part of the User Variables plugin) from MariaDB 10.2.\n\nFlushing User-Defined Variables\n-------------------------------\n\nUser-defined variables are reset and the Information Schema table emptied with\nthe FLUSH USER_VARIABLES statement.\n\nSET @str = CAST(123 AS CHAR(5));\n\nSELECT * FROM information_schema.USER_VARIABLES ORDER BY VARIABLE_NAME;\n+---------------+----------------+---------------+--------------------+\n| VARIABLE_NAME | VARIABLE_VALUE | VARIABLE_TYPE | CHARACTER_SET_NAME |\n+---------------+----------------+---------------+--------------------+\n| str | 123 | VARCHAR | utf8mb3 |\n+---------------+----------------+---------------+--------------------+\n\nFLUSH USER_VARIABLES;\n\nSELECT * FROM information_schema.USER_VARIABLES ORDER BY VARIABLE_NAME;\nEmpty set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/user-defined-variables/','','https://mariadb.com/kb/en/user-defined-variables/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (485,29,'Delimiters','The default delimiter in the mysql client (from MariaDB 10.4.6, also called\nmariadb) is the semicolon.\n\nWhen creating stored programs from the command-line, it is likely you will\nneed to differentiate between the regular delimiter and a delimiter inside a\nBEGIN END block. To understand better, consider the following example:\n\nCREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC\nBEGIN\n DECLARE x TINYINT;\n SET x = 42;\n RETURN x;\nEND;\n\nIf you enter the above line by line, the mysql client will treat the first\nsemicolon, at the end of the DECLARE x TINYINT line, as the end of the\nstatement. Since that\'s only a partial definition, it will throw a syntax\nerror, as follows:\n\nCREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC\nBEGIN\nDECLARE x TINYINT;\nERROR 1064 (42000): You have an error in your SQL syntax; \ncheck the manual that corresponds to your MariaDB server version\n for the right syntax to use near \'\' at line 3\n\nThe solution is to specify a distinct delimiter for the duration of the\nprocess, using the DELIMITER command. The delimiter can be any set of\ncharacters you choose, but it needs to be a distinctive set of characters that\nwon\'t cause further confusion. // is a common choice, and used throughout the\nknowledgebase.\n\nHere\'s how the function could be successfully entered from the mysql client\nwith the new delimiter.\n\nDELIMITER //\n\nCREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC\nBEGIN\n DECLARE x TINYINT;\n SET x = 42;\n RETURN x;\nEND\n\n//\n\nDELIMITER ;\n\nAt the end, the delimiter is restored to the default semicolon. The \\g and \\G\ndelimiters can always be used, even when a custom delimiter is specified.\n\nURL: https://mariadb.com/kb/en/delimiters/','','https://mariadb.com/kb/en/delimiters/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (486,29,'SQL_MODE=ORACLE','From MariaDB 10.3, setting the sql_mode system variable to Oracle allows the\nserver to understand a subset of Oracle\'s PL/SQL language. For example:\n\nSET SQL_MODE=\'ORACLE\';\n\nAll traditional MariaDB SQL/PSM syntax should work as before, as long as it\ndoes not conflict with Oracle\'s PL/SQL syntax. All MariaDB functions should be\nsupported in both normal and Oracle modes.\n\nPrior to MariaDB 10.3, MariaDB does not support Oracle\'s PL/SQL language, and\nSET SQL_MODE=ORACLE is only an alias for the following sql_mode in those\nversions:\n\nSET SQL_MODE=\'PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS,\nNO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER\';\n\nFrom MariaDB 10.3, SET SQL_MODE=ORACLE is same as:\n\nSET SQL_MODE=\'PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,\nNO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT\';\n\nSupported Syntax in Oracle Mode\n-------------------------------\n\nStored Procedures and Stored Functions\n--------------------------------------\n\nOracle mode makes the following changes to Stored Procedures and Stored\nFunctions:\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 (param OUT INT) | ANSI uses (OUT param INT) |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 (a IN OUT INT) | ANSI uses (INOUT param INT) |\n+-----------------------------------------+-----------------------------------+\n| AS before function body | CREATE FUNCTION f1 RETURN NUMBER |\n| | AS BEGIN... |\n+-----------------------------------------+-----------------------------------+\n| IS before function body | CREATE FUNCTION f1 RETURN NUMBER |\n| | IS BEGIN... |\n+-----------------------------------------+-----------------------------------+\n| If function has no parameters then | Example: CREATE PROCEDURE p1 AS |\n| parentheses must be omitted | BEGIN NULL; END; |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 AS BEGIN END p1; | Optional routine name after END |\n| | keyword. MDEV-12089 |\n+-----------------------------------------+-----------------------------------+\n| CREATE FUNCTION f1(a VARCHAR) | VARCHAR can be used without |\n| | length for routine parameters |\n| | and RETURN clause. The length is |\n| | inherited from the argument at |\n| | call time. MDEV-10596 |\n+-----------------------------------------+-----------------------------------+\n| CREATE AGGREGATE FUNCTION f1( ) | Creates an aggregate function, |\n| | which performs the function |\n| | against a set of rows and |\n| | returns one aggregate result. |\n+-----------------------------------------+-----------------------------------+\n| No CALL needed in Stored Procedures | In Oracle mode one can call |\n| | other stored procedures with |\n| | name only. MDEV-12107 |\n+-----------------------------------------+-----------------------------------+\n| RETURN. Can also be used in stored | ANSI uses RETURNS. MariaDB mode |\n| procedures | only supports RETURNS in stored |\n| | functions |\n+-----------------------------------------+-----------------------------------+\n\nCursors\n-------\n\nOracle mode makes the following changes to Cursors:\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 AS CURSOR cur IS | Explicit cursor with FOR loop. |\n| (SELECT a, b FROM t1); BEGIN FOR rec | MDEV-10581 |\n| IN cur ... | |\n+-----------------------------------------+-----------------------------------+\n| CREATE PROCEDURE p1 AS rec IN (SELECT | Implicit cursor with FOR loop. |\n| a, b FROM t1) | MDEV-12098 |\n+-----------------------------------------+-----------------------------------+\n| CURSOR c(prm_a VARCHAR2, prm_b | Cursor with parameters. |\n| VARCHAR2) ... OPEN c(1,2) | MDEV-10597 |\n+-----------------------------------------+-----------------------------------+\n| CURSOR c(prm_a VARCHAR2, prm_b | Cursor with parameters and FOR |\n| VARCHAR2) ... FOR rec in c(1,2) | loop. MDEV-12314 |\n+-----------------------------------------+-----------------------------------+\n| s %ISOPEN, %ROWCOUNT, %FOUND, %NOTFOUND | Explicit cursor attributes. |\n| | MDEV-10582 |\n+-----------------------------------------+-----------------------------------+\n\nLOOP\n----\n\nOracle mode makes the following changes to LOOP:\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| FOR i IN 1..10 LOOP ... END LOOP | Numeric FOR loop. MDEV-10580 |\n+-----------------------------------------+-----------------------------------+\n| GOTO | GOTO statement. MDEV-10697 |\n+-----------------------------------------+-----------------------------------+\n| <<label>> used with GOTO | ANSI uses label:. MDEV-10697 |\n+-----------------------------------------+-----------------------------------+\n| To leave loop block: EXIT [ label ] [ | ANSI syntax is IF bool_expr THEN |\n| WHEN bool_expr ] | LEAVE label |\n+-----------------------------------------+-----------------------------------+\n| [<<label>>] WHILE boolean_expression | Oracle style WHILE loop |\n| LOOP statement... END LOOP [ label ] ; | |\n+-----------------------------------------+-----------------------------------+\n| CONTINUE [ label ] [ WHEN | CONTINUE is only valid inside a |\n| boolean_expression] | loop |\n+-----------------------------------------+-----------------------------------+\n\nVariables\n---------\n\n+------------------------------+-----------------+--------------------------+\n| Oracle syntax | Version | Description |\n+------------------------------+-----------------+--------------------------+\n| var:= 10; Can also be used | 10.3 | MariaDB uses SET var= |\n| with MariaDB systemvariables | | 10; |\n+------------------------------+-----------------+--------------------------+\n| var INT := 10 | 10.3 | Default variable value |\n+------------------------------+-----------------+--------------------------+\n| var1 | 10.3 | Take data type from a |\n| table_name.column_name%TYPE | | table column. MDEV-10577 |\n+------------------------------+-----------------+--------------------------+\n| var2 var1%TYPE | 10.3 | Take data type from |\n| | | another variable |\n+------------------------------+-----------------+--------------------------+\n| rec1 table_name%ROWTYPE | 10.3 | Take ROW structure from |\n| | | a table. MDEV-12133 |\n+------------------------------+-----------------+--------------------------+\n| rec2 rec1%ROWTYPE | 10.3 | Take ROW structure from |\n| | | ROW variable |\n+------------------------------+-----------------+--------------------------+\n| CURSOR c1 IS SELECT a,b | 10.3 | Take ROW structure from |\n| FROM t1; rec1 c1%ROWTYPE; | | a cursor. MDEV-12011 |\n+------------------------------+-----------------+--------------------------+\n| Variables can be declared | 10.3 | In MariaDB mode, |\n| after cursor declarations | | variables must be |\n| | | declared before |\n| | | cursors. MDEV-10598 |\n+------------------------------+-----------------+--------------------------+\n| Triggers uses :NEW and :OLD | 10.3 | ANSI uses NEW and OLD. |\n| | | MDEV-10579 |\n+------------------------------+-----------------+--------------------------+\n| SQLCODE | 10.3 | Returns the number code |\n| | | of the most recent |\n| | | exception. Can only be |\n| | | used in Stored |\n| | | Procedures. MDEV-10578 |\n+------------------------------+-----------------+--------------------------+\n| SQLERRM | 10.3 | Returns the error |\n| | | message associdated to |\n| | | it\'s error number |\n| | | argument or SQLCODE if |\n| | | no argument is given. |\n| | | Can only be used in |\n| | | Stored Procedures. |\n| | | MDEV-10578 |\n+------------------------------+-----------------+--------------------------+\n| SQL%ROWCOUNT | 10.3 | Almost same as |\n| | | ROW_COUNT(). MDEV-10583 |\n+------------------------------+-----------------+--------------------------+\n| ROWNUM | 10.6.1 | Returns number of |\n| | | accepted rows |\n+------------------------------+-----------------+--------------------------+\n\nExceptions\n----------\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| BEGIN ... EXCEPTION WHEN OTHERS THEN | Exception handlers are declared |\n| BEGIN .. END; END; | at the end of a block |\n+-----------------------------------------+-----------------------------------+\n| TOO_MANY_ROWS, NO_DATA_FOUND, | Predefined exceptions. MDEV-10839 |\n| DUP_VAL_ON_INDEX | |\n+-----------------------------------------+-----------------------------------+\n| RAISE TOO_MANY_ROWS ; .... EXCEPTION | Exception can be used with RAISE |\n| WHEN TOO_MANY_ROWS THEN ... | and EXCEPTION...WHEN. MDEV-10840 |\n+-----------------------------------------+-----------------------------------+\n| CREATE OR REPLACE FUNCTION f1 (a INT) | User defined exceptions. |\n| RETURN INT AS e1 EXCEPTION... | MDEV-10587 |\n+-----------------------------------------+-----------------------------------+\n\nBEGIN Blocks\n------------\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| BEGIN to start a block | MariaDB uses BEGIN NOT ATOMIC |\n| | for anyonymous blocks. MDEV-10655 |\n+-----------------------------------------+-----------------------------------+\n| DECLARE is used before BEGIN | DECLARE a INT; b VARCHAR(10); |\n| | BEGIN v:= 10; END; |\n+-----------------------------------------+-----------------------------------+\n| WHEN DUP_VAL_ON_INDEX THEN NULL ; | Do not require BEGIN..END in |\n| NULL; WHEN OTHERS THEN NULL | multi-statement exception |\n| | handlers in THEN clause. |\n| | MDEV-12088 |\n+-----------------------------------------+-----------------------------------+\n\nSimple Syntax Compatibility\n---------------------------\n\n+------------------------------+-----------------+--------------------------+\n| Oracle syntax | Version | Description |\n+------------------------------+-----------------+--------------------------+\n| ELSIF | 10.3 | ANSI uses ELSEIF |\n+------------------------------+-----------------+--------------------------+\n| SELECT UNIQUE | 10.3 | Same as SELECT |\n| | | DISTINCT. MDEV-12086 |','','https://mariadb.com/kb/en/sql_modeoracle/');
+update help_topic set description = CONCAT(description, '\n+------------------------------+-----------------+--------------------------+\n| TRUNCATE TABLE t1 [DROP | 10.3 | DROP STORAGE and REUSE |\n| STORAGE] or [REUSE STORAGE] | | STORAGE are allowed as |\n| | | optional keywords for |\n| | | TRUNCATE TABLE. |\n| | | MDEV-10588 |\n+------------------------------+-----------------+--------------------------+\n| Subqueries in a FROM clause | 10.6 | SELECT * FROM (SELECT 1 |\n| without an alias | | FROM DUAL), (SELECT 2 |\n| | | FROM DUAL) |\n+------------------------------+-----------------+--------------------------+\n| UNION, EXCEPT and INTERSECT | 10.3 | INTERSECT has higher |\n| all have the same | | precedence than UNION |\n| precedence. | | and EXCEPT in |\n| | | non-Oracle modes. |\n+------------------------------+-----------------+--------------------------+\n| MINUS | 10.6 | MINUS is a synonym for |\n| | | EXCEPT. |\n+------------------------------+-----------------+--------------------------+\n\nFunctions\n---------\n\n+------------------------------+-----------------+--------------------------+\n| Oracle syntax | Version | Description |\n+------------------------------+-----------------+--------------------------+\n| ADD_MONTHS() | 10.6.1 | Added as a wrapper for |\n| | | DATE_ADD() to enhance |\n| | | Oracle compatibility. |\n| | | All modes. |\n+------------------------------+-----------------+--------------------------+\n| CAST(expr as VARCHAR(N)) | 10.3 | Cast expression to a |\n| | | VARCHAR(N). MDEV-11275 |\n+------------------------------+-----------------+--------------------------+\n| DECODE | 10.3 | In Oracle mode, |\n| | | compares and matches |\n| | | search expressions |\n+------------------------------+-----------------+--------------------------+\n| LENGTH() is same as | 10.3 | MariaDB translates |\n| CHAR_LENGTH() | | LENGTH() to |\n| | | OCTET_LENGTH(). In all |\n| | | modes one can use |\n| | | LENGTHB() as a synonym |\n| | | to OCTET_LENGTH() |\n+------------------------------+-----------------+--------------------------+\n| CHR(num) | 10.3 | Returns a VARCHAR(1) |\n| | | with character set and |\n| | | collation according to |\n| | | @@character_set_database |\n| | | and @@collation_database |\n+------------------------------+-----------------+--------------------------+\n| substr(\'abc\',0 ,3) same as | 10.3 | Position 0 for substr() |\n| substr(\'abc\', 1 ,3) | | is same as position 1 |\n+------------------------------+-----------------+--------------------------+\n| SYS_GUID | 10.6.1 | Generates a globally |\n| | | unique identifier. |\n| | | Similar to UUID but |\n| | | without the -. All |\n| | | modes. |\n+------------------------------+-----------------+--------------------------+\n| TO_CHAR | 10.6.1 | Added to enhance Oracle |\n| | | compatibility. All |\n| | | modes. |\n+------------------------------+-----------------+--------------------------+\n| TRIM, LTRIM, RTRIM, LPAD | 10.3 | Returns NULL instead of |\n| and RPAD | | an empty string if |\n| | | returning an empty |\n| | | result. These functions |\n| | | can also be accessed |\n| | | outside of ORACLE mode |\n| | | by suffixing _ORACLE |\n| | | onto the end of the |\n| | | function name, such as |\n| | | TRIM_ORACLE. |\n+------------------------------+-----------------+--------------------------+\n\nPrepared Statements\n-------------------\n\nOracle mode makes the following changes to Prepared Statements:\n\n+-----------------------------------------+-----------------------------------+\n| Oracle syntax | Description |\n+-----------------------------------------+-----------------------------------+\n| PREPARE stmt FROM \'SELECT :1, :2\' | ANSI uses ?. MDEV-10801 |\n+-----------------------------------------+-----------------------------------+\n| EXECUTE IMMEDIATE \'INSERT INTO t1 | Dynamic placeholders. MDEV-10801 |\n| SELECT (:x,:y) FROM DUAL\' USING 10,20 | |\n+-----------------------------------------+-----------------------------------+\n\nSynonyms for Basic SQL Types\n----------------------------\n\n+--------------------------------+-------------------------------------------+\n| Oracle type | MariaDB synonym |\n+--------------------------------+-------------------------------------------+\n| VARCHAR2 | VARCHAR |\n+--------------------------------+-------------------------------------------+\n| NUMBER | DECIMAL |\n+--------------------------------+-------------------------------------------+\n| DATE (with time portion) | MariaDB DATETIME |\n+--------------------------------+-------------------------------------------+\n| RAW | VARBINARY |\n+--------------------------------+-------------------------------------------+\n| CLOB | LONGTEXT |\n+--------------------------------+-------------------------------------------+\n| BLOB | LONGBLOB |\n+--------------------------------+-------------------------------------------+\n\nThis was implemented as part of MDEV-10343.\n\nIf one does a SHOW CREATE TABLE in ORACLE mode on a table that has a native\nMariaDB DATE column, it will be displayed as mariadb_schema.date to not\nconflict with the Oracle DATE type.\n\nPackages\n--------\n\nThe following syntax has been supported since MariaDB 10.3.5:\n\n* CREATE PACKAGE\n* CREATE PACKAGE BODY\n* DROP PACKAGE\n* DROP PACKAGE BODY\n* SHOW CREATE PACKAGE\n* SHOW CREATE PACKAGE BODY\n\nNULL Handling\n-------------\n\nOracle mode makes the following changes to NULL handling:\n\nNULL As a Statement\n-------------------\n\nNULL can be used as a statement:\n\nIF a=10 THEN NULL; ELSE NULL; END IF\n\nTranslating Empty String Literals to NULL\n-----------------------------------------\n\nIn Oracle, empty string (\'\') and NULL are the same thing,\n\nBy using sql_mode=EMPTY_STRING_IS_NULL you can get a similar experience in\nMariaDB:\n\nSET sql_mode=EMPTY_STRING_IS_NULL;\nSELECT \'\' IS NULL; -- returns TRUE\nINSERT INTO t1 VALUES (\'\'); -- inserts NULL\n\nConcat Operator Ignores NULL\n----------------------------\n\nCONCAT() and || ignore NULL in Oracle mode. Can also be accessed outside of\nORACLE mode by using CONCAT_OPERATOR_ORACLE. MDEV-11880 and MDEV-12143.\n\nReserved Words\n--------------\n\nThere are a number of extra reserved words in Oracle mode.\n\nSHOW CREATE TABLE\n-----------------\n\nThe SHOW CREATE TABLE statement will not display MariaDB-specific table\noptions, such as AUTO_INCREMENT or CHARSET, when Oracle mode is set.\n\nURL: https://mariadb.com/kb/en/sql_modeoracle/') WHERE help_topic_id = 486;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (487,30,'CONTAINS','Syntax\n------\n\nContains(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether a geometry g1 completely contains geometry\ng2. CONTAINS() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_CONTAINS() uses object shapes.\n\nThis tests the opposite relationship to Within().\n\nURL: https://mariadb.com/kb/en/contains/','','https://mariadb.com/kb/en/contains/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (488,30,'CROSSES','Syntax\n------\n\nCrosses(g1,g2)\n\nDescription\n-----------\n\nReturns 1 if g1 spatially crosses g2. Returns NULL if g1 is a Polygon or a\nMultiPolygon, or if g2 is a Point or a MultiPoint. Otherwise, returns 0.\n\nThe term spatially crosses denotes a spatial relation between two given\ngeometries that has the following properties:\n\n* The two geometries intersect\n* Their intersection results in a geometry that has a dimension that is one\n less than the maximum dimension of the two given geometries\n* Their intersection is not equal to either of the two given geometries\n\nCROSSES() is based on the original MySQL implementation, and uses object\nbounding rectangles, while ST_CROSSES() uses object shapes.\n\nURL: https://mariadb.com/kb/en/crosses/','','https://mariadb.com/kb/en/crosses/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (489,30,'DISJOINT','Syntax\n------\n\nDisjoint(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 is spatially disjoint from (does not\nintersect) g2.\n\nDISJOINT() tests the opposite relationship to INTERSECTS().\n\nDISJOINT() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_DISJOINT() uses object shapes.\n\nURL: https://mariadb.com/kb/en/disjoint/','','https://mariadb.com/kb/en/disjoint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (490,30,'EQUALS','Syntax\n------\n\nEquals(g1,g2)\n\nFrom MariaDB 10.2.3:\n\nMBREQUALS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 is spatially equal to g2.\n\nEQUALS() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_EQUALS() uses object shapes.\n\nFrom MariaDB 10.2.3, MBREQUALS is a synonym for Equals.\n\nURL: https://mariadb.com/kb/en/equals/','','https://mariadb.com/kb/en/equals/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (491,30,'INTERSECTS','Syntax\n------\n\nINTERSECTS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 spatially intersects geometry\ng2.\n\nINTERSECTS() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_INTERSECTS() uses object shapes.\n\nINTERSECTS() tests the opposite relationship to DISJOINT().\n\nURL: https://mariadb.com/kb/en/intersects/','','https://mariadb.com/kb/en/intersects/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (492,30,'OVERLAPS','Syntax\n------\n\nOVERLAPS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 spatially overlaps g2. The term\nspatially overlaps is used if two geometries intersect and their intersection\nresults in a geometry of the same dimension but not equal to either of the\ngiven geometries.\n\nOVERLAPS() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_OVERLAPS() uses object shapes.\n\nURL: https://mariadb.com/kb/en/overlaps/','','https://mariadb.com/kb/en/overlaps/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (493,30,'ST_CONTAINS','Syntax\n------\n\nST_CONTAINS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether a geometry g1 completely contains geometry\ng2.\n\nST_CONTAINS() uses object shapes, while CONTAINS(), based on the original\nMySQL implementation, uses object bounding rectangles.\n\nST_CONTAINS tests the opposite relationship to ST_WITHIN().\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60, 125 100, 175\n150))\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'POINT(174 149)\');\n\nSELECT ST_CONTAINS(@g1,@g2);\n+----------------------+\n| ST_CONTAINS(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSET @g2 = ST_GEOMFROMTEXT(\'POINT(175 151)\');\n\nSELECT ST_CONTAINS(@g1,@g2);\n+----------------------+\n| ST_CONTAINS(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/st-contains/','','https://mariadb.com/kb/en/st-contains/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (494,30,'ST_CROSSES','Syntax\n------\n\nST_CROSSES(g1,g2)\n\nDescription\n-----------\n\nReturns 1 if geometry g1 spatially crosses geometry g2. Returns NULL if g1 is\na Polygon or a MultiPolygon, or if g2 is a Point or a MultiPoint. Otherwise,\nreturns 0.\n\nThe term spatially crosses denotes a spatial relation between two given\ngeometries that has the following properties:\n\n* The two geometries intersect\n* Their intersection results in a geometry that has a dimension that is one\n less than the maximum dimension of the two given geometries\n* Their intersection is not equal to either of the two given geometries\n\nST_CROSSES() uses object shapes, while CROSSES(), based on the original MySQL\nimplementation, uses object bounding rectangles.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(174 149, 176 151)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60, 125 100, 175\n150))\');\n\nSELECT ST_CROSSES(@g1,@g2);\n+---------------------+\n| ST_CROSSES(@g1,@g2) |\n+---------------------+\n| 1 |\n+---------------------+\n\nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(176 149, 176 151)\');\n\nSELECT ST_CROSSES(@g1,@g2);\n+---------------------+\n| ST_CROSSES(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/st-crosses/','','https://mariadb.com/kb/en/st-crosses/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (495,30,'ST_DIFFERENCE','Syntax\n------\n\nST_DIFFERENCE(g1,g2)\n\nDescription\n-----------\n\nReturns a geometry representing the point set difference of the given geometry\nvalues.\n\nExample\n-------\n\nSET @g1 = POINT(10,10), @g2 = POINT(20,20);\n\nSELECT ST_AsText(ST_Difference(@g1, @g2));\n+------------------------------------+\n| ST_AsText(ST_Difference(@g1, @g2)) |\n+------------------------------------+\n| POINT(10 10) |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_difference/','','https://mariadb.com/kb/en/st_difference/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (496,30,'ST_DISJOINT','Syntax\n------\n\nST_DISJOINT(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 is spatially disjoint from\n(does not intersect with) geometry g2.\n\nST_DISJOINT() uses object shapes, while DISJOINT(), based on the original\nMySQL implementation, uses object bounding rectangles.\n\nST_DISJOINT() tests the opposite relationship to ST_INTERSECTS().\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(0 0)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 0, 0 2)\');\n\nSELECT ST_DISJOINT(@g1,@g2);\n+----------------------+\n| ST_DISJOINT(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(0 0, 0 2)\');\n\nSELECT ST_DISJOINT(@g1,@g2);\n+----------------------+\n| ST_DISJOINT(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/st_disjoint/','','https://mariadb.com/kb/en/st_disjoint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (497,30,'ST_DISTANCE','Syntax\n------\n\nST_DISTANCE(g1,g2)\n\nDescription\n-----------\n\nReturns the distance between two geometries, or null if not given valid inputs.\n\nExample\n-------\n\nSELECT ST_Distance(POINT(1,2),POINT(2,2));\n+------------------------------------+\n| ST_Distance(POINT(1,2),POINT(2,2)) |\n+------------------------------------+\n| 1 |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_distance/','','https://mariadb.com/kb/en/st_distance/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (498,30,'ST_DISTANCE_SPHERE','MariaDB starting with 10.2.38\n-----------------------------\nST_DISTANCE_SPHERE was introduced in MariaDB 10.2.38, MariaDB 10.3.29, MariaDB\n10.4.19 and MariaDB 10.5.10.\n\nSyntax\n------\n\nST_DISTANCE_SPHERE(g1,g2,[r])\n\nDescription\n-----------\n\nReturns the spherical distance between two geometries (point or multipoint) on\na sphere with the optional radius r (default is the Earth radius if r is not\nspecified), or NULL if not given valid inputs.\n\nExample\n-------\n\nset @zenica = ST_GeomFromText(\'POINT(17.907743 44.203438)\');\nset @sarajevo = ST_GeomFromText(\'POINT(18.413076 43.856258)\');\nSELECT ST_Distance_Sphere(@zenica, @sarajevo);\n55878.59337591705\n\nURL: https://mariadb.com/kb/en/st_distance_sphere/','','https://mariadb.com/kb/en/st_distance_sphere/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (499,30,'ST_EQUALS','Syntax\n------\n\nST_EQUALS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 is spatially equal to geometry\ng2.\n\nST_EQUALS() uses object shapes, while EQUALS(), based on the original MySQL\nimplementation, uses object bounding rectangles.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(174 149, 176 151)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(176 151, 174 149)\');\n\nSELECT ST_EQUALS(@g1,@g2);\n+--------------------+\n| ST_EQUALS(@g1,@g2) |\n+--------------------+\n| 1 |\n+--------------------+\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(0 2)\');\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 0)\');\n\nSELECT ST_EQUALS(@g1,@g2);\n+--------------------+\n| ST_EQUALS(@g1,@g2) |\n+--------------------+\n| 0 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/st-equals/','','https://mariadb.com/kb/en/st-equals/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (500,30,'ST_INTERSECTS','Syntax\n------\n\nST_INTERSECTS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 spatially intersects geometry\ng2.\n\nST_INTERSECTS() uses object shapes, while INTERSECTS(), based on the original\nMySQL implementation, uses object bounding rectangles.\n\nST_INTERSECTS() tests the opposite relationship to ST_DISJOINT().\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(0 0)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(0 0, 0 2)\');\n\nSELECT ST_INTERSECTS(@g1,@g2);\n+------------------------+\n| ST_INTERSECTS(@g1,@g2) |\n+------------------------+\n| 1 |\n+------------------------+\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 0, 0 2)\');\n\nSELECT ST_INTERSECTS(@g1,@g2);\n+------------------------+\n| ST_INTERSECTS(@g1,@g2) |\n+------------------------+\n| 0 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/st-intersects/','','https://mariadb.com/kb/en/st-intersects/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (501,30,'ST_LENGTH','Syntax\n------\n\nST_LENGTH(ls)\n\nDescription\n-----------\n\nReturns as a double-precision number the length of the LineString value ls in\nits associated spatial reference.\n\nExamples\n--------\n\nSET @ls = \'LineString(1 1,2 2,3 3)\';\n\nSELECT ST_LENGTH(ST_GeomFromText(@ls));\n+---------------------------------+\n| ST_LENGTH(ST_GeomFromText(@ls)) |\n+---------------------------------+\n| 2.82842712474619 |\n+---------------------------------+\n\nURL: https://mariadb.com/kb/en/st_length/','','https://mariadb.com/kb/en/st_length/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (502,30,'ST_OVERLAPS','Syntax\n------\n\nST_OVERLAPS(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 spatially overlaps geometry g2.\n\nThe term spatially overlaps is used if two geometries intersect and their\nintersection results in a geometry of the same dimension but not equal to\neither of the given geometries.\n\nST_OVERLAPS() uses object shapes, while OVERLAPS(), based on the original\nMySQL implementation, uses object bounding rectangles.\n\nURL: https://mariadb.com/kb/en/st-overlaps/','','https://mariadb.com/kb/en/st-overlaps/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (503,30,'ST_TOUCHES','Syntax\n------\n\nST_TOUCHES(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 spatially touches geometry g2.\nTwo geometries spatially touch if the interiors of the geometries do not\nintersect, but the boundary of one of the geometries intersects either the\nboundary or the interior of the other.\n\nST_TOUCHES() uses object shapes, while TOUCHES(), based on the original MySQL\nimplementation, uses object bounding rectangles.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 0)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 0, 0 2)\');\n\nSELECT ST_TOUCHES(@g1,@g2);\n+---------------------+\n| ST_TOUCHES(@g1,@g2) |\n+---------------------+\n| 1 |\n+---------------------+\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 1)\');\n\nSELECT ST_TOUCHES(@g1,@g2);\n+---------------------+\n| ST_TOUCHES(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/st-touches/','','https://mariadb.com/kb/en/st-touches/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (504,30,'ST_WITHIN','Syntax\n------\n\nST_WITHIN(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether geometry g1 is spatially within geometry g2.\n\nThis tests the opposite relationship as ST_CONTAINS().\n\nST_WITHIN() uses object shapes, while WITHIN(), based on the original MySQL\nimplementation, uses object bounding rectangles.\n\nExamples\n--------\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(174 149)\');\n\nSET @g2 = ST_GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60, 125 100, 175\n150))\');\n\nSELECT ST_WITHIN(@g1,@g2);\n+--------------------+\n| ST_WITHIN(@g1,@g2) |\n+--------------------+\n| 1 |\n+--------------------+\n\nSET @g1 = ST_GEOMFROMTEXT(\'POINT(176 151)\');\n\nSELECT ST_WITHIN(@g1,@g2);\n+--------------------+\n| ST_WITHIN(@g1,@g2) |\n+--------------------+\n| 0 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/st-within/','','https://mariadb.com/kb/en/st-within/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (505,30,'TOUCHES','Syntax\n------\n\nTouches(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 spatially touches g2. Two geometries\nspatially touch if the interiors of the geometries do not intersect, but the\nboundary of one of the geometries intersects either the boundary or the\ninterior of the other.\n\nTOUCHES() is based on the original MySQL implementation and uses object\nbounding rectangles, while ST_TOUCHES() uses object shapes.\n\nURL: https://mariadb.com/kb/en/touches/','','https://mariadb.com/kb/en/touches/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (506,30,'WITHIN','Syntax\n------\n\nWithin(g1,g2)\n\nDescription\n-----------\n\nReturns 1 or 0 to indicate whether g1 is spatially within g2. This tests the\nopposite relationship as Contains().\n\nWITHIN() is based on the original MySQL implementation, and uses object\nbounding rectangles, while ST_WITHIN() uses object shapes.\n\nExamples\n--------\n\nSET @g1 = GEOMFROMTEXT(\'POINT(174 149)\');\nSET @g2 = GEOMFROMTEXT(\'POINT(176 151)\');\nSET @g3 = GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))\');\n\nSELECT within(@g1,@g3);\n+-----------------+\n| within(@g1,@g3) |\n+-----------------+\n| 1 |\n+-----------------+\n\nSELECT within(@g2,@g3);\n+-----------------+\n| within(@g2,@g3) |\n+-----------------+\n| 0 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/within/','','https://mariadb.com/kb/en/within/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (507,31,'Microseconds in MariaDB','The TIME, DATETIME, and TIMESTAMP types, along with the temporal functions,\nCAST and dynamic columns, support microseconds. The datetime precision of a\ncolumn can be specified when creating the table with CREATE TABLE, for example:\n\nCREATE TABLE example(\n col_microsec DATETIME(6),\n col_millisec TIME(3)\n);\n\nGenerally, the precision can be specified for any TIME, DATETIME, or TIMESTAMP\ncolumn, in parentheses, after the type name. The datetime precision specifies\nnumber of digits after the decimal dot and can be any integer number from 0 to\n6. If no precision is specified it is assumed to be 0, for backward\ncompatibility reasons.\n\nA datetime precision can be specified wherever a type name is used. For\nexample:\n\n* when declaring arguments of stored routines.\n* when specifying a return type of a stored function.\n* when declaring variables.\n* in a CAST function:create function example(x datetime(5)) returns time(4)\nbegin\n declare y timestamp(6);\n return cast(x as time(2));\nend;\n\n%f is used as the formatting option for microseconds in the STR_TO_DATE,\nDATE_FORMAT and FROM_UNIXTIME functions, for example:\n\nSELECT STR_TO_DATE(\'20200809 020917076\',\'%Y%m%d %H%i%s%f\');\n+-----------------------------------------------------+\n| STR_TO_DATE(\'20200809 020917076\',\'%Y%m%d %H%i%s%f\') |\n+-----------------------------------------------------+\n| 2020-08-09 02:09:17.076000 |\n+-----------------------------------------------------+\n\nAdditional Information\n----------------------\n\n* when comparing anything to a temporal value (DATETIME, TIME, DATE, or\nTIMESTAMP), both values are compared as temporal values, not as strings.\n* The INFORMATION_SCHEMA.COLUMNS table has a new column DATETIME_PRECISION\n* NOW(), CURTIME(), UTC_TIMESTAMP(), UTC_TIME(), CURRENT_TIME(),\nCURRENT_TIMESTAMP(), LOCALTIME() and LOCALTIMESTAMP() now accept datetime\nprecision as an optional argument. For example:SELECT CURTIME(4);\n--> 10:11:12.3456\n\n* TIME_TO_SEC() and UNIX_TIMESTAMP() preserve microseconds of the argument.\nThese functions will return a decimal number if the result non-zero datetime\nprecision and an integer otherwise (for backward compatibility).SELECT\nTIME_TO_SEC(\'10:10:10.12345\');\n--> 36610.12345\n\n* Current versions of this patch fix a bug in the following optimization: in\n certain queries with DISTINCT MariaDB can ignore this clause if it can\n prove that all result rows are unique anyway, for example, when a primary key\n is compared with a constant. Sometimes this optimization was applied\n incorrectly, though — for example, when comparing a\n string with a date constant. This is now fixed.\n* DATE_ADD() and DATE_SUB() functions can now take a TIME\n expression as an argument (not just DATETIME as before).SELECT\nTIME(\'10:10:10\') + INTERVAL 100 MICROSECOND;\n--> 10:10:10.000100\n\n* The event_time field in the mysql.general_log table and the start_time,\nquery_time, and lock_time fields in the mysql.slow_log table now store values\nwith microsecond precision.\n* This patch fixed a bug when comparing a temporal value using the BETWEEN\noperator and one of the operands is NULL.\n* The old syntax TIMESTAMP(N), where N is the display width, is no longer\nsupported. It was deprecated in MySQL 4.1.0 (released on\n 2003-04-03).\n* when a DATETIME value is compared to a TIME value, the latter is treated as\na full datetime with a zero date part, similar to comparing DATE to a\nDATETIME, or to comparing DECIMAL numbers.\n Earlier versions of MariaDB used to compare only the time part of both\noperands in such a case.\n* In MariaDB, an extra column TIME_MS has been added to the\nINFORMATION_SCHEMA.PROCESSLIST table, as well as to the output of SHOW FULL\nPROCESSLIST.\n\nNote: When you convert a temporal value to a value with a smaller precision,\nit will be truncated, not rounded. This is done to guarantee that the date\npart is not changed. For example:\n\nSELECT CAST(\'2009-12-31 23:59:59.998877\' as DATETIME(3));\n-> 2009-12-31 23:59:59.998\n\nMySQL 5.6 Microseconds\n----------------------\n\nMySQL 5.6 introduced microseconds using a slightly different implementation to\nMariaDB 5.3. Since MariaDB 10.1, MariaDB has defaulted to the MySQL format, by\nmeans of the --mysql56-temporal-format variable. The MySQL version requires\nslightly more storage but has some advantages in permitting the eventual\nsupport of negative dates, and in replication.\n\nURL: https://mariadb.com/kb/en/microseconds-in-mariadb/','','https://mariadb.com/kb/en/microseconds-in-mariadb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (508,31,'Date and Time Units','The INTERVAL keyword can be used to add or subtract a time interval of time to\na DATETIME, DATE or TIME value.\n\nThe syntax is:\n\nINTERVAL time_quantity time_unit\n\nFor example, the SECOND unit is used below by the DATE_ADD() function:\n\nSELECT \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND;\n+-------------------------------------------+\n| \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND |\n+-------------------------------------------+\n| 2009-01-01 00:00:00 |\n+-------------------------------------------+\n\nThe following units are valid:\n\n+---------------------+------------------------------------------------------+\n| Unit | Description |\n+---------------------+------------------------------------------------------+\n| MICROSECOND | Microseconds |\n+---------------------+------------------------------------------------------+\n| SECOND | Seconds |\n+---------------------+------------------------------------------------------+\n| MINUTE | Minutes |\n+---------------------+------------------------------------------------------+\n| HOUR | Hours |\n+---------------------+------------------------------------------------------+\n| DAY | Days |\n+---------------------+------------------------------------------------------+\n| WEEK | Weeks |\n+---------------------+------------------------------------------------------+\n| MONTH | Months |\n+---------------------+------------------------------------------------------+\n| QUARTER | Quarters |\n+---------------------+------------------------------------------------------+\n| YEAR | Years |\n+---------------------+------------------------------------------------------+\n| SECOND_MICROSECOND | Seconds.Microseconds |\n+---------------------+------------------------------------------------------+\n| MINUTE_MICROSECOND | Minutes.Seconds.Microseconds |\n+---------------------+------------------------------------------------------+\n| MINUTE_SECOND | Minutes.Seconds |\n+---------------------+------------------------------------------------------+\n| HOUR_MICROSECOND | Hours.Minutes.Seconds.Microseconds |\n+---------------------+------------------------------------------------------+\n| HOUR_SECOND | Hours.Minutes.Seconds |\n+---------------------+------------------------------------------------------+\n| HOUR_MINUTE | Hours.Minutes |\n+---------------------+------------------------------------------------------+\n| DAY_MICROSECOND | Days Hours.Minutes.Seconds.Microseconds |\n+---------------------+------------------------------------------------------+\n| DAY_SECOND | Days Hours.Minutes.Seconds |\n+---------------------+------------------------------------------------------+\n| DAY_MINUTE | Days Hours.Minutes |\n+---------------------+------------------------------------------------------+\n| DAY_HOUR | Days Hours |\n+---------------------+------------------------------------------------------+\n| YEAR_MONTH | Years-Months |\n+---------------------+------------------------------------------------------+\n\nThe time units containing an underscore are composite; that is, they consist\nof multiple base time units. For base time units, time_quantity is an integer\nnumber. For composite units, the quantity must be expressed as a string with\nmultiple integer numbers separated by any punctuation character.\n\nExample of composite units:\n\nINTERVAL \'2:2\' YEAR_MONTH\nINTERVAL \'1:30:30\' HOUR_SECOND\nINTERVAL \'1!30!30\' HOUR_SECOND -- same as above\n\nTime units can be used in the following contexts:\n\n* after a + or a - operator;\n* with the following DATE or TIME functions: ADDDATE(), SUBDATE(), DATE_ADD(),\nDATE_SUB(), TIMESTAMPADD(), TIMESTAMPDIFF(), EXTRACT();\n* in the ON SCHEDULE clause of CREATE EVENT and ALTER EVENT.\n* when defining a partitioning BY SYSTEM_TIME\n\nURL: https://mariadb.com/kb/en/date-and-time-units/','','https://mariadb.com/kb/en/date-and-time-units/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (509,31,'ADD_MONTHS','MariaDB starting with 10.6.1\n----------------------------\nThe ADD_MONTHS function was introduced in MariaDB 10.6.1 to enhance Oracle\ncompatibility. Similar functionality can be achieved with the DATE_ADD\nfunction.\n\nSyntax\n------\n\nADD_MONTHS(date, months)\n\nDescription\n-----------\n\nADD_MONTHS adds an integer months to a given date (DATE, DATETIME or\nTIMESTAMP), returning the resulting date.\n\nmonths can be positive or negative.\n\nThe resulting day component will remain the same as that specified in date,\nunless the resulting month has fewer days than the day component of the given\ndate, in which case the day will be the last day of the resulting month.\n\nReturns NULL if given an invalid date, or a NULL argument.\n\nExamples\n--------\n\nSELECT ADD_MONTHS(\'2012-01-31\', 2);\n+-----------------------------+\n| ADD_MONTHS(\'2012-01-31\', 2) |\n+-----------------------------+\n| 2012-03-31 |\n+-----------------------------+\n\nSELECT ADD_MONTHS(\'2012-01-31\', -5);\n+------------------------------+\n| ADD_MONTHS(\'2012-01-31\', -5) |\n+------------------------------+\n| 2011-08-31 |\n+------------------------------+\n\nSELECT ADD_MONTHS(\'2011-01-31\', 1);\n+-----------------------------+\n| ADD_MONTHS(\'2011-01-31\', 1) |\n+-----------------------------+\n| 2011-02-28 |\n+-----------------------------+\n\nSELECT ADD_MONTHS(\'2012-01-31\', 1);\n+-----------------------------+\n| ADD_MONTHS(\'2012-01-31\', 1) |\n+-----------------------------+\n| 2012-02-29 |\n+-----------------------------+\n\nSELECT ADD_MONTHS(\'2012-01-31\', 2);\n+-----------------------------+\n| ADD_MONTHS(\'2012-01-31\', 2) |\n+-----------------------------+\n| 2012-03-31 |\n+-----------------------------+\n\nSELECT ADD_MONTHS(\'2012-01-31\', 3);\n+-----------------------------+\n| ADD_MONTHS(\'2012-01-31\', 3) |\n+-----------------------------+\n| 2012-04-30 |\n+-----------------------------+\n\nURL: https://mariadb.com/kb/en/add_months/','','https://mariadb.com/kb/en/add_months/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (510,31,'ADDDATE','Syntax\n------\n\nADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)\n\nDescription\n-----------\n\nWhen invoked with the INTERVAL form of the second argument, ADDDATE() is a\nsynonym for DATE_ADD(). The related function SUBDATE() is a synonym for\nDATE_SUB(). For information on the INTERVAL unit argument, see the discussion\nfor DATE_ADD().\n\nWhen invoked with the days form of the second argument, MariaDB treats it as\nan integer number of days to be added to expr.\n\nExamples\n--------\n\nSELECT DATE_ADD(\'2008-01-02\', INTERVAL 31 DAY);\n+-----------------------------------------+\n| DATE_ADD(\'2008-01-02\', INTERVAL 31 DAY) |\n+-----------------------------------------+\n| 2008-02-02 |\n+-----------------------------------------+\n\nSELECT ADDDATE(\'2008-01-02\', INTERVAL 31 DAY);\n+----------------------------------------+\n| ADDDATE(\'2008-01-02\', INTERVAL 31 DAY) |\n+----------------------------------------+\n| 2008-02-02 |\n+----------------------------------------+\n\nSELECT ADDDATE(\'2008-01-02\', 31);\n+---------------------------+\n| ADDDATE(\'2008-01-02\', 31) |\n+---------------------------+\n| 2008-02-02 |\n+---------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, ADDDATE(d, 10) from t1;\n+---------------------+---------------------+\n| d | ADDDATE(d, 10) |\n+---------------------+---------------------+\n| 2007-01-30 21:31:07 | 2007-02-09 21:31:07 |\n| 1983-10-15 06:42:51 | 1983-10-25 06:42:51 |\n| 2011-04-21 12:34:56 | 2011-05-01 12:34:56 |\n| 2011-10-30 06:31:41 | 2011-11-09 06:31:41 |\n| 2011-01-30 14:03:25 | 2011-02-09 14:03:25 |\n| 2004-10-07 11:19:34 | 2004-10-17 11:19:34 |\n+---------------------+---------------------+\n\nSELECT d, ADDDATE(d, INTERVAL 10 HOUR) from t1;\n+---------------------+------------------------------+\n| d | ADDDATE(d, INTERVAL 10 HOUR) |\n+---------------------+------------------------------+\n| 2007-01-30 21:31:07 | 2007-01-31 07:31:07 |\n| 1983-10-15 06:42:51 | 1983-10-15 16:42:51 |\n| 2011-04-21 12:34:56 | 2011-04-21 22:34:56 |\n| 2011-10-30 06:31:41 | 2011-10-30 16:31:41 |\n| 2011-01-30 14:03:25 | 2011-01-31 00:03:25 |\n| 2004-10-07 11:19:34 | 2004-10-07 21:19:34 |\n+---------------------+------------------------------+\n\nURL: https://mariadb.com/kb/en/adddate/','','https://mariadb.com/kb/en/adddate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (511,31,'ADDTIME','Syntax\n------\n\nADDTIME(expr1,expr2)\n\nDescription\n-----------\n\nADDTIME() adds expr2 to expr1 and returns the result. expr1 is a time or\ndatetime expression, and expr2 is a time expression.\n\nExamples\n--------\n\nSELECT ADDTIME(\'2007-12-31 23:59:59.999999\', \'1 1:1:1.000002\');\n+---------------------------------------------------------+\n| ADDTIME(\'2007-12-31 23:59:59.999999\', \'1 1:1:1.000002\') |\n+---------------------------------------------------------+\n| 2008-01-02 01:01:01.000001 |\n+---------------------------------------------------------+\n\nSELECT ADDTIME(\'01:00:00.999999\', \'02:00:00.999998\');\n+-----------------------------------------------+\n| ADDTIME(\'01:00:00.999999\', \'02:00:00.999998\') |\n+-----------------------------------------------+\n| 03:00:01.999997 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/addtime/','','https://mariadb.com/kb/en/addtime/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (512,31,'CONVERT_TZ','Syntax\n------\n\nCONVERT_TZ(dt,from_tz,to_tz)\n\nDescription\n-----------\n\nCONVERT_TZ() converts a datetime value dt from the time zone given by from_tz\nto the time zone given by to_tz and returns the resulting value.\n\nIn order to use named time zones, such as GMT, MET or Africa/Johannesburg, the\ntime_zone tables must be loaded (see mysql_tzinfo_to_sql).\n\nNo conversion will take place if the value falls outside of the supported\nTIMESTAMP range (\'1970-01-01 00:00:01\' to \'2038-01-19 05:14:07\' UTC) when\nconverted from from_tz to UTC.\n\nThis function returns NULL if the arguments are invalid (or named time zones\nhave not been loaded).\n\nSee time zones for more information.\n\nExamples\n--------\n\nSELECT CONVERT_TZ(\'2016-01-01 12:00:00\',\'+00:00\',\'+10:00\');\n+-----------------------------------------------------+\n| CONVERT_TZ(\'2016-01-01 12:00:00\',\'+00:00\',\'+10:00\') |\n+-----------------------------------------------------+\n| 2016-01-01 22:00:00 |\n+-----------------------------------------------------+\n\nUsing named time zones (with the time zone tables loaded):\n\nSELECT CONVERT_TZ(\'2016-01-01 12:00:00\',\'GMT\',\'Africa/Johannesburg\');\n+---------------------------------------------------------------+\n| CONVERT_TZ(\'2016-01-01 12:00:00\',\'GMT\',\'Africa/Johannesburg\') |\n+---------------------------------------------------------------+\n| 2016-01-01 14:00:00 |\n+---------------------------------------------------------------+\n\nThe value is out of the TIMESTAMP range, so no conversion takes place:\n\nSELECT CONVERT_TZ(\'1969-12-31 22:00:00\',\'+00:00\',\'+10:00\');\n+-----------------------------------------------------+\n| CONVERT_TZ(\'1969-12-31 22:00:00\',\'+00:00\',\'+10:00\') |\n+-----------------------------------------------------+\n| 1969-12-31 22:00:00 |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/convert_tz/','','https://mariadb.com/kb/en/convert_tz/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (513,31,'CURDATE','Syntax\n------\n\nCURDATE()\nCURRENT_DATE\nCURRENT_DATE()\n\nDescription\n-----------\n\nCURDATE returns the current date as a value in \'YYYY-MM-DD\' or YYYYMMDD\nformat, depending on whether the function is used in a string or numeric\ncontext.\n\nCURRENT_DATE and CURRENT_DATE() are synonyms.\n\nExamples\n--------\n\nSELECT CURDATE();\n+------------+\n| CURDATE() |\n+------------+\n| 2019-03-05 |\n+------------+\n\nIn a numeric context (note this is not performing date calculations):\n\nSELECT CURDATE() +0;\n+--------------+\n| CURDATE() +0 |\n+--------------+\n| 20190305 |\n+--------------+\n\nData calculation:\n\nSELECT CURDATE() - INTERVAL 5 DAY;\n+----------------------------+\n| CURDATE() - INTERVAL 5 DAY |\n+----------------------------+\n| 2019-02-28 |\n+----------------------------+\n\nURL: https://mariadb.com/kb/en/curdate/','','https://mariadb.com/kb/en/curdate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (514,31,'CURRENT_DATE','Syntax\n------\n\nCURRENT_DATE, CURRENT_DATE()\n\nDescription\n-----------\n\nCURRENT_DATE and CURRENT_DATE() are synonyms for CURDATE().\n\nURL: https://mariadb.com/kb/en/current_date/','','https://mariadb.com/kb/en/current_date/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (515,31,'CURRENT_TIME','Syntax\n------\n\nCURRENT_TIME\nCURRENT_TIME([precision])\n\nDescription\n-----------\n\nCURRENT_TIME and CURRENT_TIME() are synonyms for CURTIME().\n\nURL: https://mariadb.com/kb/en/current_time/','','https://mariadb.com/kb/en/current_time/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (516,31,'CURRENT_TIMESTAMP','Syntax\n------\n\nCURRENT_TIMESTAMP\nCURRENT_TIMESTAMP([precision])\n\nDescription\n-----------\n\nCURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms for NOW().\n\nURL: https://mariadb.com/kb/en/current_timestamp/','','https://mariadb.com/kb/en/current_timestamp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (517,31,'CURTIME','Syntax\n------\n\nCURTIME([precision])\n\nDescription\n-----------\n\nReturns the current time as a value in \'HH:MM:SS\' or HHMMSS.uuuuuu format,\ndepending on whether the function is used in a string or numeric context. The\nvalue is expressed in the current time zone.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nExamples\n--------\n\nSELECT CURTIME();\n+-----------+\n| CURTIME() |\n+-----------+\n| 12:45:39 |\n+-----------+\n\nSELECT CURTIME() + 0;\n+---------------+\n| CURTIME() + 0 |\n+---------------+\n| 124545.000000 |\n+---------------+\n\nWith precision:\n\nSELECT CURTIME(2);\n+-------------+\n| CURTIME(2) |\n+-------------+\n| 09:49:08.09 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/curtime/','','https://mariadb.com/kb/en/curtime/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (518,31,'DATE FUNCTION','Syntax\n------\n\nDATE(expr)\n\nDescription\n-----------\n\nExtracts the date part of the date or datetime expression expr.\n\nExamples\n--------\n\nSELECT DATE(\'2013-07-18 12:21:32\');\n+-----------------------------+\n| DATE(\'2013-07-18 12:21:32\') |\n+-----------------------------+\n| 2013-07-18 |\n+-----------------------------+\n\nError Handling\n--------------\n\nUntil MariaDB 5.5.32, some versions of MariaDB returned 0000-00-00 when passed\nan invalid date. From 5.5.32, NULL is returned.\n\nURL: https://mariadb.com/kb/en/date-function/','','https://mariadb.com/kb/en/date-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (519,31,'DATEDIFF','Syntax\n------\n\nDATEDIFF(expr1,expr2)\n\nDescription\n-----------\n\nDATEDIFF() returns (expr1 – expr2) expressed as a value in days from one date\nto the other. expr1 and expr2 are date or date-and-time expressions. Only the\ndate parts of the values are used in the calculation.\n\nExamples\n--------\n\nSELECT DATEDIFF(\'2007-12-31 23:59:59\',\'2007-12-30\');\n+----------------------------------------------+\n| DATEDIFF(\'2007-12-31 23:59:59\',\'2007-12-30\') |\n+----------------------------------------------+\n| 1 |\n+----------------------------------------------+\n\nSELECT DATEDIFF(\'2010-11-30 23:59:59\',\'2010-12-31\');\n+----------------------------------------------+\n| DATEDIFF(\'2010-11-30 23:59:59\',\'2010-12-31\') |\n+----------------------------------------------+\n| -31 |\n+----------------------------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2011-05-23 10:56:05 |\n+---------------------+\n\nSELECT d, DATEDIFF(NOW(),d) FROM t1;\n+---------------------+-------------------+\n| d | DATEDIFF(NOW(),d) |\n+---------------------+-------------------+\n| 2007-01-30 21:31:07 | 1574 |\n| 1983-10-15 06:42:51 | 10082 |\n| 2011-04-21 12:34:56 | 32 |\n| 2011-10-30 06:31:41 | -160 |\n| 2011-01-30 14:03:25 | 113 |\n| 2004-10-07 11:19:34 | 2419 |\n+---------------------+-------------------+\n\nURL: https://mariadb.com/kb/en/datediff/','','https://mariadb.com/kb/en/datediff/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (520,31,'DATE_ADD','Syntax\n------\n\nDATE_ADD(date,INTERVAL expr unit)\n\nDescription\n-----------\n\nPerforms date arithmetic. The date argument specifies the starting date or\ndatetime value. expr is an expression specifying the interval value to be\nadded or subtracted from the starting date. expr is a string; it may start\nwith a \"-\" for negative intervals. unit is a keyword indicating the units in\nwhich the expression should be interpreted. See Date and Time Units for a\ncomplete list of permitted units.\n\nExamples\n--------\n\nSELECT \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND;\n+-------------------------------------------+\n| \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND |\n+-------------------------------------------+\n| 2009-01-01 00:00:00 |\n+-------------------------------------------+\n\nSELECT INTERVAL 1 DAY + \'2008-12-31\';\n+-------------------------------+\n| INTERVAL 1 DAY + \'2008-12-31\' |\n+-------------------------------+\n| 2009-01-01 |\n+-------------------------------+\n\nSELECT \'2005-01-01\' - INTERVAL 1 SECOND;\n+----------------------------------+\n| \'2005-01-01\' - INTERVAL 1 SECOND |\n+----------------------------------+\n| 2004-12-31 23:59:59 |\n+----------------------------------+\n\nSELECT DATE_ADD(\'2000-12-31 23:59:59\', INTERVAL 1 SECOND);\n+----------------------------------------------------+\n| DATE_ADD(\'2000-12-31 23:59:59\', INTERVAL 1 SECOND) |\n+----------------------------------------------------+\n| 2001-01-01 00:00:00 |\n+----------------------------------------------------+\n\nSELECT DATE_ADD(\'2010-12-31 23:59:59\', INTERVAL 1 DAY);\n+-------------------------------------------------+\n| DATE_ADD(\'2010-12-31 23:59:59\', INTERVAL 1 DAY) |\n+-------------------------------------------------+\n| 2011-01-01 23:59:59 |\n+-------------------------------------------------+\n\nSELECT DATE_ADD(\'2100-12-31 23:59:59\', INTERVAL \'1:1\' MINUTE_SECOND);\n+---------------------------------------------------------------+\n| DATE_ADD(\'2100-12-31 23:59:59\', INTERVAL \'1:1\' MINUTE_SECOND) |\n+---------------------------------------------------------------+\n| 2101-01-01 00:01:00 |\n+---------------------------------------------------------------+\n\nSELECT DATE_ADD(\'1900-01-01 00:00:00\', INTERVAL \'-1 10\' DAY_HOUR);\n+------------------------------------------------------------+\n| DATE_ADD(\'1900-01-01 00:00:00\', INTERVAL \'-1 10\' DAY_HOUR) |\n+------------------------------------------------------------+\n| 1899-12-30 14:00:00 |\n+------------------------------------------------------------+\n\nSELECT DATE_ADD(\'1992-12-31 23:59:59.000002\', INTERVAL \'1.999999\'\nSECOND_MICROSECOND);\n+------------------------------------------------------------------------------\n-+\n| DATE_ADD(\'1992-12-31 23:59:59.000002\', INTERVAL \'1.999999\'\nSECOND_MICROSECOND) |\n+------------------------------------------------------------------------------\n-+\n| 1993-01-01 00:00:01.000001 \n |\n+------------------------------------------------------------------------------\n-+\n\nURL: https://mariadb.com/kb/en/date_add/','','https://mariadb.com/kb/en/date_add/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (521,31,'DATE_FORMAT','Syntax\n------\n\nDATE_FORMAT(date, format[, locale])\n\nDescription\n-----------\n\nFormats the date value according to the format string.\n\nThe language used for the names is controlled by the value of the\nlc_time_names system variable. See server locale for more on the supported\nlocales.\n\nThe options that can be used by DATE_FORMAT(), as well as its inverse\nSTR_TO_DATE() and the FROM_UNIXTIME() function, are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| %a | Short weekday name in current locale |\n| | (Variable lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %b | Short form month name in current locale. For |\n| | locale en_US this is one of: |\n| | Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov |\n| | or Dec. |\n+---------------------------+------------------------------------------------+\n| %c | Month with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %D | Day with English suffix \'th\', \'nd\', \'st\' or |\n| | \'rd\'\'. (1st, 2nd, 3rd...). |\n+---------------------------+------------------------------------------------+\n| %d | Day with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %e | Day with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %f | Microseconds 6 digits. |\n+---------------------------+------------------------------------------------+\n| %H | Hour with 2 digits between 00-23. |\n+---------------------------+------------------------------------------------+\n| %h | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %I | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %i | Minute with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %j | Day of the year (001-366) |\n+---------------------------+------------------------------------------------+\n| %k | Hour with 1 digits between 0-23. |\n+---------------------------+------------------------------------------------+\n| %l | Hour with 1 digits between 1-12. |\n+---------------------------+------------------------------------------------+\n| %M | Full month name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %m | Month with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %p | AM/PM according to current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %r | Time in 12 hour format, followed by AM/PM. |\n| | Short for \'%I:%i:%S %p\'. |\n+---------------------------+------------------------------------------------+\n| %S | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %s | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %T | Time in 24 hour format. Short for \'%H:%i:%S\'. |\n+---------------------------+------------------------------------------------+\n| %U | Week number (00-53), when first day of the |\n| | week is Sunday. |\n+---------------------------+------------------------------------------------+\n| %u | Week number (00-53), when first day of the |\n| | week is Monday. |\n+---------------------------+------------------------------------------------+\n| %V | Week number (01-53), when first day of the |\n| | week is Sunday. Used with %X. |\n+---------------------------+------------------------------------------------+\n| %v | Week number (01-53), when first day of the |\n| | week is Monday. Used with %x. |\n+---------------------------+------------------------------------------------+\n| %W | Full weekday name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %w | Day of the week. 0 = Sunday, 6 = Saturday. |\n+---------------------------+------------------------------------------------+\n| %X | Year with 4 digits when first day of the week |\n| | is Sunday. Used with %V. |\n+---------------------------+------------------------------------------------+\n| %x | Year with 4 digits when first day of the week |\n| | is Monday. Used with %v. |\n+---------------------------+------------------------------------------------+\n| %Y | Year with 4 digits. |\n+---------------------------+------------------------------------------------+\n| %y | Year with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %# | For str_to_date(), skip all numbers. |\n+---------------------------+------------------------------------------------+\n| %. | For str_to_date(), skip all punctation |\n| | characters. |\n+---------------------------+------------------------------------------------+\n| %@ | For str_to_date(), skip all alpha characters. |\n+---------------------------+------------------------------------------------+\n| %% | A literal % character. |\n+---------------------------+------------------------------------------------+\n\nTo get a date in one of the standard formats, GET_FORMAT() can be used.\n\nExamples\n--------\n\nSELECT DATE_FORMAT(\'2009-10-04 22:23:00\', \'%W %M %Y\');\n+------------------------------------------------+\n| DATE_FORMAT(\'2009-10-04 22:23:00\', \'%W %M %Y\') |\n+------------------------------------------------+\n| Sunday October 2009 |\n+------------------------------------------------+\n\nSELECT DATE_FORMAT(\'2007-10-04 22:23:00\', \'%H:%i:%s\');\n+------------------------------------------------+\n| DATE_FORMAT(\'2007-10-04 22:23:00\', \'%H:%i:%s\') |\n+------------------------------------------------+\n| 22:23:00 |\n+------------------------------------------------+\n\nSELECT DATE_FORMAT(\'1900-10-04 22:23:00\', \'%D %y %a %d %m %b %j\');\n+------------------------------------------------------------+\n| DATE_FORMAT(\'1900-10-04 22:23:00\', \'%D %y %a %d %m %b %j\') |\n+------------------------------------------------------------+\n| 4th 00 Thu 04 10 Oct 277 |\n+------------------------------------------------------------+\n\nSELECT DATE_FORMAT(\'1997-10-04 22:23:00\', \'%H %k %I %r %T %S %w\');\n+------------------------------------------------------------+\n| DATE_FORMAT(\'1997-10-04 22:23:00\', \'%H %k %I %r %T %S %w\') |\n+------------------------------------------------------------+\n| 22 22 10 10:23:00 PM 22:23:00 00 6 |\n+------------------------------------------------------------+\n\nSELECT DATE_FORMAT(\'1999-01-01\', \'%X %V\');\n+------------------------------------+\n| DATE_FORMAT(\'1999-01-01\', \'%X %V\') |\n+------------------------------------+\n| 1998 52 |\n+------------------------------------+\n\nSELECT DATE_FORMAT(\'2006-06-00\', \'%d\');\n+---------------------------------+\n| DATE_FORMAT(\'2006-06-00\', \'%d\') |\n+---------------------------------+\n| 00 |\n+---------------------------------+\n\nMariaDB starting with 10.3.2\n----------------------------\nOptionally, the locale can be explicitly specified as the third DATE_FORMAT()\nargument. Doing so makes the function independent from the session settings,\nand the three argument version of DATE_FORMAT() can be used in virtual indexed\nand persistent generated-columns:\n\nSELECT DATE_FORMAT(\'2006-01-01\', \'%W\', \'el_GR\');\n+------------------------------------------+\n| DATE_FORMAT(\'2006-01-01\', \'%W\', \'el_GR\') |\n+------------------------------------------+\n| ΚυÏιακή |\n+------------------------------------------+\n\nURL: https://mariadb.com/kb/en/date_format/','','https://mariadb.com/kb/en/date_format/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (522,31,'DATE_SUB','Syntax\n------\n\nDATE_SUB(date,INTERVAL expr unit)\n\nDescription\n-----------\n\nPerforms date arithmetic. The date argument specifies the starting date or\ndatetime value. expr is an expression specifying the interval value to be\nadded or subtracted from the starting date. expr is a string; it may start\nwith a \"-\" for negative intervals. unit is a keyword indicating the units in\nwhich the expression should be interpreted. See Date and Time Units for a\ncomplete list of permitted units.\n\nSee also DATE_ADD().\n\nExamples\n--------\n\nSELECT DATE_SUB(\'1998-01-02\', INTERVAL 31 DAY);\n+-----------------------------------------+\n| DATE_SUB(\'1998-01-02\', INTERVAL 31 DAY) |\n+-----------------------------------------+\n| 1997-12-02 |\n+-----------------------------------------+\n\nSELECT DATE_SUB(\'2005-01-01 00:00:00\', INTERVAL \'1 1:1:1\' DAY_SECOND);\n+----------------------------------------------------------------+\n| DATE_SUB(\'2005-01-01 00:00:00\', INTERVAL \'1 1:1:1\' DAY_SECOND) |\n+----------------------------------------------------------------+\n| 2004-12-30 22:58:59 |\n+----------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/date_sub/','','https://mariadb.com/kb/en/date_sub/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (523,31,'DAY','Syntax\n------\n\nDAY(date)\n\nDescription\n-----------\n\nDAY() is a synonym for DAYOFMONTH().\n\nURL: https://mariadb.com/kb/en/day/','','https://mariadb.com/kb/en/day/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (524,31,'DAYNAME','Syntax\n------\n\nDAYNAME(date)\n\nDescription\n-----------\n\nReturns the name of the weekday for date. The language used for the name is\ncontrolled by the value of the lc_time_names system variable. See server\nlocale for more on the supported locales.\n\nExamples\n--------\n\nSELECT DAYNAME(\'2007-02-03\');\n+-----------------------+\n| DAYNAME(\'2007-02-03\') |\n+-----------------------+\n| Saturday |\n+-----------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, DAYNAME(d) FROM t1;\n+---------------------+------------+\n| d | DAYNAME(d) |\n+---------------------+------------+\n| 2007-01-30 21:31:07 | Tuesday |\n| 1983-10-15 06:42:51 | Saturday |\n| 2011-04-21 12:34:56 | Thursday |\n| 2011-10-30 06:31:41 | Sunday |\n| 2011-01-30 14:03:25 | Sunday |\n| 2004-10-07 11:19:34 | Thursday |\n+---------------------+------------+\n\nChanging the locale:\n\nSET lc_time_names = \'fr_CA\';\n\nSELECT DAYNAME(\'2013-04-01\');\n+-----------------------+\n| DAYNAME(\'2013-04-01\') |\n+-----------------------+\n| lundi |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/dayname/','','https://mariadb.com/kb/en/dayname/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (525,31,'DAYOFMONTH','Syntax\n------\n\nDAYOFMONTH(date)\n\nDescription\n-----------\n\nReturns the day of the month for date, in the range 1 to 31, or 0 for dates\nsuch as \'0000-00-00\' or \'2008-00-00\' which have a zero day part.\n\nDAY() is a synonym.\n\nExamples\n--------\n\nSELECT DAYOFMONTH(\'2007-02-03\');\n+--------------------------+\n| DAYOFMONTH(\'2007-02-03\') |\n+--------------------------+\n| 3 |\n+--------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d FROM t1 where DAYOFMONTH(d) = 30;\n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/dayofmonth/','','https://mariadb.com/kb/en/dayofmonth/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (526,31,'DAYOFWEEK','Syntax\n------\n\nDAYOFWEEK(date)\n\nDescription\n-----------\n\nReturns the day of the week index for the date (1 = Sunday, 2 = Monday, ..., 7\n= Saturday). These index values correspond to the ODBC standard.\n\nThis contrasts with WEEKDAY() which follows a different index numbering (0 =\nMonday, 1 = Tuesday, ... 6 = Sunday).\n\nExamples\n--------\n\nSELECT DAYOFWEEK(\'2007-02-03\');\n+-------------------------+\n| DAYOFWEEK(\'2007-02-03\') |\n+-------------------------+\n| 7 |\n+-------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, DAYNAME(d), DAYOFWEEK(d), WEEKDAY(d) from t1;\n+---------------------+------------+--------------+------------+\n| d | DAYNAME(d) | DAYOFWEEK(d) | WEEKDAY(d) |\n+---------------------+------------+--------------+------------+\n| 2007-01-30 21:31:07 | Tuesday | 3 | 1 |\n| 1983-10-15 06:42:51 | Saturday | 7 | 5 |\n| 2011-04-21 12:34:56 | Thursday | 5 | 3 |\n| 2011-10-30 06:31:41 | Sunday | 1 | 6 |\n| 2011-01-30 14:03:25 | Sunday | 1 | 6 |\n| 2004-10-07 11:19:34 | Thursday | 5 | 3 |\n+---------------------+------------+--------------+------------+\n\nURL: https://mariadb.com/kb/en/dayofweek/','','https://mariadb.com/kb/en/dayofweek/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (527,31,'DAYOFYEAR','Syntax\n------\n\nDAYOFYEAR(date)\n\nDescription\n-----------\n\nReturns the day of the year for date, in the range 1 to 366.\n\nExamples\n--------\n\nSELECT DAYOFYEAR(\'2018-02-16\');\n+-------------------------+\n| DAYOFYEAR(\'2018-02-16\') |\n+-------------------------+\n| 47 |\n+-------------------------+\n\nURL: https://mariadb.com/kb/en/dayofyear/','','https://mariadb.com/kb/en/dayofyear/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (528,31,'EXTRACT','Syntax\n------\n\nEXTRACT(unit FROM date)\n\nDescription\n-----------\n\nThe EXTRACT() function extracts the required unit from the date. See Date and\nTime Units for a complete list of permitted units.\n\nIn MariaDB 10.0.7 and MariaDB 5.5.35, EXTRACT (HOUR FROM ...) was changed to\nreturn a value from 0 to 23, adhering to the SQL standard. Until MariaDB\n10.0.6 and MariaDB 5.5.34, and in all versions of MySQL at least as of MySQL\n5.7, it could return a value > 23. HOUR() is not a standard function, so\ncontinues to adhere to the old behaviour inherited from MySQL.\n\nExamples\n--------\n\nSELECT EXTRACT(YEAR FROM \'2009-07-02\');\n+---------------------------------+\n| EXTRACT(YEAR FROM \'2009-07-02\') |\n+---------------------------------+\n| 2009 |\n+---------------------------------+\n\nSELECT EXTRACT(YEAR_MONTH FROM \'2009-07-02 01:02:03\');\n+------------------------------------------------+\n| EXTRACT(YEAR_MONTH FROM \'2009-07-02 01:02:03\') |\n+------------------------------------------------+\n| 200907 |\n+------------------------------------------------+\n\nSELECT EXTRACT(DAY_MINUTE FROM \'2009-07-02 01:02:03\');\n+------------------------------------------------+\n| EXTRACT(DAY_MINUTE FROM \'2009-07-02 01:02:03\') |\n+------------------------------------------------+\n| 20102 |\n+------------------------------------------------+\n\nSELECT EXTRACT(MICROSECOND FROM \'2003-01-02 10:30:00.000123\');\n+--------------------------------------------------------+\n| EXTRACT(MICROSECOND FROM \'2003-01-02 10:30:00.000123\') |\n+--------------------------------------------------------+\n| 123 |\n+--------------------------------------------------------+\n\nFrom MariaDB 10.0.7 and MariaDB 5.5.35, EXTRACT (HOUR FROM...) returns a value\nfrom 0 to 23, as per the SQL standard. HOUR is not a standard function, so\ncontinues to adhere to the old behaviour inherited from MySQL.\n\nSELECT EXTRACT(HOUR FROM \'26:30:00\'), HOUR(\'26:30:00\');\n+-------------------------------+------------------+\n| EXTRACT(HOUR FROM \'26:30:00\') | HOUR(\'26:30:00\') |\n+-------------------------------+------------------+\n| 2 | 26 |\n+-------------------------------+------------------+\n\nURL: https://mariadb.com/kb/en/extract/','','https://mariadb.com/kb/en/extract/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (529,31,'FROM_DAYS','Syntax\n------\n\nFROM_DAYS(N)\n\nDescription\n-----------\n\nGiven a day number N, returns a DATE value. The day count is based on the\nnumber of days from the start of the standard calendar (0000-00-00).\n\nThe function is not designed for use with dates before the advent of the\nGregorian calendar in October 1582. Results will not be reliable since it\ndoesn\'t account for the lost days when the calendar changed from the Julian\ncalendar.\n\nThis is the converse of the TO_DAYS() function.\n\nExamples\n--------\n\nSELECT FROM_DAYS(730669);\n+-------------------+\n| FROM_DAYS(730669) |\n+-------------------+\n| 2000-07-03 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/from_days/','','https://mariadb.com/kb/en/from_days/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (530,31,'FROM_UNIXTIME','Syntax\n------\n\nFROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format)\n\nDescription\n-----------\n\nReturns a representation of the unix_timestamp argument as a value in\n\'YYYY-MM-DD HH:MM:SS\' or YYYYMMDDHHMMSS.uuuuuu format, depending on whether\nthe function is used in a string or numeric context. The value is expressed in\nthe current time zone. unix_timestamp is an internal timestamp value such as\nis produced by the UNIX_TIMESTAMP() function.\n\nIf format is given, the result is formatted according to the format string,\nwhich is used the same way as listed in the entry for the DATE_FORMAT()\nfunction.\n\nTimestamps in MariaDB have a maximum value of 2147483647, equivalent to\n2038-01-19 05:14:07. This is due to the underlying 32-bit limitation. Using\nthe function on a timestamp beyond this will result in NULL being returned.\nUse DATETIME as a storage type if you require dates beyond this.\n\nThe options that can be used by FROM_UNIXTIME(), as well as DATE_FORMAT() and\nSTR_TO_DATE(), are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| %a | Short weekday name in current locale |\n| | (Variable lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %b | Short form month name in current locale. For |\n| | locale en_US this is one of: |\n| | Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov |\n| | or Dec. |\n+---------------------------+------------------------------------------------+\n| %c | Month with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %D | Day with English suffix \'th\', \'nd\', \'st\' or |\n| | \'rd\'\'. (1st, 2nd, 3rd...). |\n+---------------------------+------------------------------------------------+\n| %d | Day with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %e | Day with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %f | Microseconds 6 digits. |\n+---------------------------+------------------------------------------------+\n| %H | Hour with 2 digits between 00-23. |\n+---------------------------+------------------------------------------------+\n| %h | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %I | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %i | Minute with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %j | Day of the year (001-366) |\n+---------------------------+------------------------------------------------+\n| %k | Hour with 1 digits between 0-23. |\n+---------------------------+------------------------------------------------+\n| %l | Hour with 1 digits between 1-12. |\n+---------------------------+------------------------------------------------+\n| %M | Full month name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %m | Month with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %p | AM/PM according to current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %r | Time in 12 hour format, followed by AM/PM. |\n| | Short for \'%I:%i:%S %p\'. |\n+---------------------------+------------------------------------------------+\n| %S | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %s | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %T | Time in 24 hour format. Short for \'%H:%i:%S\'. |\n+---------------------------+------------------------------------------------+\n| %U | Week number (00-53), when first day of the |\n| | week is Sunday. |\n+---------------------------+------------------------------------------------+\n| %u | Week number (00-53), when first day of the |\n| | week is Monday. |\n+---------------------------+------------------------------------------------+\n| %V | Week number (01-53), when first day of the |\n| | week is Sunday. Used with %X. |\n+---------------------------+------------------------------------------------+\n| %v | Week number (01-53), when first day of the |\n| | week is Monday. Used with %x. |\n+---------------------------+------------------------------------------------+\n| %W | Full weekday name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %w | Day of the week. 0 = Sunday, 6 = Saturday. |\n+---------------------------+------------------------------------------------+\n| %X | Year with 4 digits when first day of the week |\n| | is Sunday. Used with %V. |\n+---------------------------+------------------------------------------------+\n| %x | Year with 4 digits when first day of the week |\n| | is Sunday. Used with %v. |\n+---------------------------+------------------------------------------------+\n| %Y | Year with 4 digits. |\n+---------------------------+------------------------------------------------+\n| %y | Year with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %# | For str_to_date(), skip all numbers. |\n+---------------------------+------------------------------------------------+\n| %. | For str_to_date(), skip all punctation |\n| | characters. |\n+---------------------------+------------------------------------------------+\n| %@ | For str_to_date(), skip all alpha characters. |\n+---------------------------+------------------------------------------------+\n| %% | A literal % character. |\n+---------------------------+------------------------------------------------+\n\nPerformance Considerations\n--------------------------\n\nIf your session time zone is set to SYSTEM (the default), FROM_UNIXTIME() will\ncall the OS function to convert the data using the system time zone. At least\non Linux, the corresponding function (localtime_r) uses a global mutex inside\nglibc that can cause contention under high concurrent load.\n\nSet your time zone to a named time zone to avoid this issue. See mysql time\nzone tables for details on how to do this.\n\nExamples\n--------\n\nSELECT FROM_UNIXTIME(1196440219);\n+---------------------------+\n| FROM_UNIXTIME(1196440219) |\n+---------------------------+\n| 2007-11-30 11:30:19 |\n+---------------------------+\n\nSELECT FROM_UNIXTIME(1196440219) + 0;\n+-------------------------------+\n| FROM_UNIXTIME(1196440219) + 0 |\n+-------------------------------+\n| 20071130113019.000000 |\n+-------------------------------+\n\nSELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), \'%Y %D %M %h:%i:%s %x\');\n+---------------------------------------------------------+\n| FROM_UNIXTIME(UNIX_TIMESTAMP(), \'%Y %D %M %h:%i:%s %x\') |\n+---------------------------------------------------------+\n| 2010 27th March 01:03:47 2010 |\n+---------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/from_unixtime/','','https://mariadb.com/kb/en/from_unixtime/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (531,31,'GET_FORMAT','Syntax\n------\n\nGET_FORMAT({DATE|DATETIME|TIME}, {\'EUR\'|\'USA\'|\'JIS\'|\'ISO\'|\'INTERNAL\'})\n\nDescription\n-----------\n\nReturns a format string. This function is useful in combination with the\nDATE_FORMAT() and the STR_TO_DATE() functions.\n\nPossible result formats are:\n\n+--------------------------------------+--------------------------------------+\n| Function Call | Result Format |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'EUR\') | \'%d.%m.%Y\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'USA\') | \'%m.%d.%Y\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'JIS\') | \'%Y-%m-%d\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'ISO\') | \'%Y-%m-%d\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATE,\'INTERNAL\') | \'%Y%m%d\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'EUR\') | \'%Y-%m-%d %H.%i.%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'USA\') | \'%Y-%m-%d %H.%i.%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'JIS\') | \'%Y-%m-%d %H:%i:%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'ISO\') | \'%Y-%m-%d %H:%i:%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(DATETIME,\'INTERNAL\') | \'%Y%m%d%H%i%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'EUR\') | \'%H.%i.%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'USA\') | \'%h:%i:%s %p\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'JIS\') | \'%H:%i:%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'ISO\') | \'%H:%i:%s\' |\n+--------------------------------------+--------------------------------------+\n| GET_FORMAT(TIME,\'INTERNAL\') | \'%H%i%s\' |\n+--------------------------------------+--------------------------------------+\n\nExamples\n--------\n\nObtaining the string matching to the standard European date format:\n\nSELECT GET_FORMAT(DATE, \'EUR\');\n+-------------------------+\n| GET_FORMAT(DATE, \'EUR\') |\n+-------------------------+\n| %d.%m.%Y |\n+-------------------------+\n\nUsing the same string to format a date:\n\nSELECT DATE_FORMAT(\'2003-10-03\',GET_FORMAT(DATE,\'EUR\'));\n+--------------------------------------------------+\n| DATE_FORMAT(\'2003-10-03\',GET_FORMAT(DATE,\'EUR\')) |\n+--------------------------------------------------+\n| 03.10.2003 |\n+--------------------------------------------------+\n\nSELECT STR_TO_DATE(\'10.31.2003\',GET_FORMAT(DATE,\'USA\'));\n+--------------------------------------------------+\n| STR_TO_DATE(\'10.31.2003\',GET_FORMAT(DATE,\'USA\')) |\n+--------------------------------------------------+\n| 2003-10-31 |\n+--------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/get_format/','','https://mariadb.com/kb/en/get_format/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (532,31,'HOUR','Syntax\n------\n\nHOUR(time)\n\nDescription\n-----------\n\nReturns the hour for time. The range of the return value is 0 to 23 for\ntime-of-day values. However, the range of TIME values actually is much larger,\nso HOUR can return values greater than 23.\n\nThe return value is always positive, even if a negative TIME value is provided.\n\nExamples\n--------\n\nSELECT HOUR(\'10:05:03\');\n+------------------+\n| HOUR(\'10:05:03\') |\n+------------------+\n| 10 |\n+------------------+\n\nSELECT HOUR(\'272:59:59\');\n+-------------------+\n| HOUR(\'272:59:59\') |\n+-------------------+\n| 272 |\n+-------------------+\n\nDifference between EXTRACT (HOUR FROM ...) (>= MariaDB 10.0.7 and MariaDB\n5.5.35) and HOUR:\n\nSELECT EXTRACT(HOUR FROM \'26:30:00\'), HOUR(\'26:30:00\');\n+-------------------------------+------------------+\n| EXTRACT(HOUR FROM \'26:30:00\') | HOUR(\'26:30:00\') |\n+-------------------------------+------------------+\n| 2 | 26 |\n+-------------------------------+------------------+\n\nURL: https://mariadb.com/kb/en/hour/','','https://mariadb.com/kb/en/hour/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (533,31,'LAST_DAY','Syntax\n------\n\nLAST_DAY(date)\n\nDescription\n-----------\n\nTakes a date or datetime value and returns the corresponding value for the\nlast day of the month. Returns NULL if the argument is invalid.\n\nExamples\n--------\n\nSELECT LAST_DAY(\'2003-02-05\');\n+------------------------+\n| LAST_DAY(\'2003-02-05\') |\n+------------------------+\n| 2003-02-28 |\n+------------------------+\n\nSELECT LAST_DAY(\'2004-02-05\');\n+------------------------+\n| LAST_DAY(\'2004-02-05\') |\n+------------------------+\n| 2004-02-29 |\n+------------------------+\n\nSELECT LAST_DAY(\'2004-01-01 01:01:01\');\n+---------------------------------+\n| LAST_DAY(\'2004-01-01 01:01:01\') |\n+---------------------------------+\n| 2004-01-31 |\n+---------------------------------+\n\nSELECT LAST_DAY(\'2003-03-32\');\n+------------------------+\n| LAST_DAY(\'2003-03-32\') |\n+------------------------+\n| NULL |\n+------------------------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Incorrect datetime value: \'2003-03-32\'\n\nURL: https://mariadb.com/kb/en/last_day/','','https://mariadb.com/kb/en/last_day/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (534,31,'LOCALTIME','Syntax\n------\n\nLOCALTIME\nLOCALTIME([precision])\n\nDescription\n-----------\n\nLOCALTIME and LOCALTIME() are synonyms for NOW().\n\nURL: https://mariadb.com/kb/en/localtime/','','https://mariadb.com/kb/en/localtime/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (535,31,'LOCALTIMESTAMP','Syntax\n------\n\nLOCALTIMESTAMP\nLOCALTIMESTAMP([precision])\n\nDescription\n-----------\n\nLOCALTIMESTAMP and LOCALTIMESTAMP() are synonyms for NOW().\n\nURL: https://mariadb.com/kb/en/localtimestamp/','','https://mariadb.com/kb/en/localtimestamp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (536,31,'MAKEDATE','Syntax\n------\n\nMAKEDATE(year,dayofyear)\n\nDescription\n-----------\n\nReturns a date, given year and day-of-year values. dayofyear must be greater\nthan 0 or the result is NULL.\n\nExamples\n--------\n\nSELECT MAKEDATE(2011,31), MAKEDATE(2011,32);\n+-------------------+-------------------+\n| MAKEDATE(2011,31) | MAKEDATE(2011,32) |\n+-------------------+-------------------+\n| 2011-01-31 | 2011-02-01 |\n+-------------------+-------------------+\n\nSELECT MAKEDATE(2011,365), MAKEDATE(2014,365);\n+--------------------+--------------------+\n| MAKEDATE(2011,365) | MAKEDATE(2014,365) |\n+--------------------+--------------------+\n| 2011-12-31 | 2014-12-31 |\n+--------------------+--------------------+\n\nSELECT MAKEDATE(2011,0);\n+------------------+\n| MAKEDATE(2011,0) |\n+------------------+\n| NULL |\n+------------------+\n\nURL: https://mariadb.com/kb/en/makedate/','','https://mariadb.com/kb/en/makedate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (537,31,'MAKETIME','Syntax\n------\n\nMAKETIME(hour,minute,second)\n\nDescription\n-----------\n\nReturns a time value calculated from the hour, minute, and second arguments.\n\nIf minute or second are out of the range 0 to 60, NULL is returned. The hour\ncan be in the range -838 to 838, outside of which the value is truncated with\na warning.\n\nExamples\n--------\n\nSELECT MAKETIME(13,57,33);\n+--------------------+\n| MAKETIME(13,57,33) |\n+--------------------+\n| 13:57:33 |\n+--------------------+\n\nSELECT MAKETIME(-13,57,33);\n+---------------------+\n| MAKETIME(-13,57,33) |\n+---------------------+\n| -13:57:33 |\n+---------------------+\n\nSELECT MAKETIME(13,67,33);\n+--------------------+\n| MAKETIME(13,67,33) |\n+--------------------+\n| NULL |\n+--------------------+\n\nSELECT MAKETIME(-1000,57,33);\n+-----------------------+\n| MAKETIME(-1000,57,33) |\n+-----------------------+\n| -838:59:59 |\n+-----------------------+\n1 row in set, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+-----------------------------------------------+\n| Level | Code | Message |\n+---------+------+-----------------------------------------------+\n| Warning | 1292 | Truncated incorrect time value: \'-1000:57:33\' |\n+---------+------+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/maketime/','','https://mariadb.com/kb/en/maketime/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (538,31,'MICROSECOND','Syntax\n------\n\nMICROSECOND(expr)\n\nDescription\n-----------\n\nReturns the microseconds from the time or datetime expression expr as a number\nin the range from 0 to 999999.\n\nIf expr is a time with no microseconds, zero is returned, while if expr is a\ndate with no time, zero with a warning is returned.\n\nExamples\n--------\n\nSELECT MICROSECOND(\'12:00:00.123456\');\n+--------------------------------+\n| MICROSECOND(\'12:00:00.123456\') |\n+--------------------------------+\n| 123456 |\n+--------------------------------+\n\nSELECT MICROSECOND(\'2009-12-31 23:59:59.000010\');\n+-------------------------------------------+\n| MICROSECOND(\'2009-12-31 23:59:59.000010\') |\n+-------------------------------------------+\n| 10 |\n+-------------------------------------------+\n\nSELECT MICROSECOND(\'2013-08-07 12:13:14\');\n+------------------------------------+\n| MICROSECOND(\'2013-08-07 12:13:14\') |\n+------------------------------------+\n| 0 |\n+------------------------------------+\n\nSELECT MICROSECOND(\'2013-08-07\');\n+---------------------------+\n| MICROSECOND(\'2013-08-07\') |\n+---------------------------+\n| 0 |\n+---------------------------+\n1 row in set, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+----------------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------------+\n| Warning | 1292 | Truncated incorrect time value: \'2013-08-07\' |\n+---------+------+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/microsecond/','','https://mariadb.com/kb/en/microsecond/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (539,31,'MINUTE','Syntax\n------\n\nMINUTE(time)\n\nDescription\n-----------\n\nReturns the minute for time, in the range 0 to 59.\n\nExamples\n--------\n\nSELECT MINUTE(\'2013-08-03 11:04:03\');\n+-------------------------------+\n| MINUTE(\'2013-08-03 11:04:03\') |\n+-------------------------------+\n| 4 |\n+-------------------------------+\n\nSELECT MINUTE (\'23:12:50\');\n+---------------------+\n| MINUTE (\'23:12:50\') |\n+---------------------+\n| 12 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/minute/','','https://mariadb.com/kb/en/minute/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (540,31,'MONTH','Syntax\n------\n\nMONTH(date)\n\nDescription\n-----------\n\nReturns the month for date in the range 1 to 12 for January to December, or 0\nfor dates such as \'0000-00-00\' or \'2008-00-00\' that have a zero month part.\n\nExamples\n--------\n\nSELECT MONTH(\'2019-01-03\');\n+---------------------+\n| MONTH(\'2019-01-03\') |\n+---------------------+\n| 1 |\n+---------------------+\n\nSELECT MONTH(\'2019-00-03\');\n+---------------------+\n| MONTH(\'2019-00-03\') |\n+---------------------+\n| 0 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/month/','','https://mariadb.com/kb/en/month/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (541,31,'MONTHNAME','Syntax\n------\n\nMONTHNAME(date)\n\nDescription\n-----------\n\nReturns the full name of the month for date. The language used for the name is\ncontrolled by the value of the lc_time_names system variable. See server\nlocale for more on the supported locales.\n\nExamples\n--------\n\nSELECT MONTHNAME(\'2019-02-03\');\n+-------------------------+\n| MONTHNAME(\'2019-02-03\') |\n+-------------------------+\n| February |\n+-------------------------+\n\nChanging the locale:\n\nSET lc_time_names = \'fr_CA\';\n\nSELECT MONTHNAME(\'2019-05-21\');\n+-------------------------+\n| MONTHNAME(\'2019-05-21\') |\n+-------------------------+\n| mai |\n+-------------------------+\n\nURL: https://mariadb.com/kb/en/monthname/','','https://mariadb.com/kb/en/monthname/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (542,31,'NOW','Syntax\n------\n\nNOW([precision])\nCURRENT_TIMESTAMP\nCURRENT_TIMESTAMP([precision])\nLOCALTIME, LOCALTIME([precision])\nLOCALTIMESTAMP\nLOCALTIMESTAMP([precision])\n\nDescription\n-----------\n\nReturns the current date and time as a value in \'YYYY-MM-DD HH:MM:SS\' or\nYYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a\nstring or numeric context. The value is expressed in the current time zone.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nNOW() (or its synonyms) can be used as the default value for TIMESTAMP columns\nas well as, since MariaDB 10.0.1, DATETIME columns. Before MariaDB 10.0.1, it\nwas only possible for a single TIMESTAMP column per table to contain the\nCURRENT_TIMESTAMP as its default.\n\nWhen displayed in the INFORMATION_SCHEMA.COLUMNS table, a default CURRENT\nTIMESTAMP is displayed as CURRENT_TIMESTAMP up until MariaDB 10.2.2, and as\ncurrent_timestamp() from MariaDB 10.2.3, due to to MariaDB 10.2 accepting\nexpressions in the DEFAULT clause.\n\nChanging the timestamp system variable with a SET timestamp statement affects\nthe value returned by NOW(), but not by SYSDATE().\n\nExamples\n--------\n\nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2010-03-27 13:13:25 |\n+---------------------+\n\nSELECT NOW() + 0;\n+-----------------------+\n| NOW() + 0 |\n+-----------------------+\n| 20100327131329.000000 |\n+-----------------------+\n\nWith precision:\n\nSELECT CURRENT_TIMESTAMP(2);\n+------------------------+\n| CURRENT_TIMESTAMP(2) |\n+------------------------+\n| 2018-07-10 09:47:26.24 |\n+------------------------+\n\nUsed as a default TIMESTAMP:\n\nCREATE TABLE t (createdTS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\nFrom MariaDB 10.2.2:\n\nSELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=\'test\'\n AND COLUMN_NAME LIKE \'%ts%\'\\G\n*************************** 1. row ***************************\n TABLE_CATALOG: def\n TABLE_SCHEMA: test\n TABLE_NAME: t\n COLUMN_NAME: ts\n ORDINAL_POSITION: 1\n COLUMN_DEFAULT: current_timestamp()\n...\n\n<= MariaDB 10.2.1\n\nSELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=\'test\'\n AND COLUMN_NAME LIKE \'%ts%\'\\G\n*************************** 1. row ***************************\n TABLE_CATALOG: def\n TABLE_SCHEMA: test\n TABLE_NAME: t\n COLUMN_NAME: createdTS\n ORDINAL_POSITION: 1\n COLUMN_DEFAULT: CURRENT_TIMESTAMP\n...\n\nURL: https://mariadb.com/kb/en/now/','','https://mariadb.com/kb/en/now/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (543,31,'PERIOD_ADD','Syntax\n------\n\nPERIOD_ADD(P,N)\n\nDescription\n-----------\n\nAdds N months to period P. P is in the format YYMM or YYYYMM, and is not a\ndate value. If P contains a two-digit year, values from 00 to 69 are converted\nto from 2000 to 2069, while values from 70 are converted to 1970 upwards.\n\nReturns a value in the format YYYYMM.\n\nExamples\n--------\n\nSELECT PERIOD_ADD(200801,2);\n+----------------------+\n| PERIOD_ADD(200801,2) |\n+----------------------+\n| 200803 |\n+----------------------+\n\nSELECT PERIOD_ADD(6910,2);\n+--------------------+\n| PERIOD_ADD(6910,2) |\n+--------------------+\n| 206912 |\n+--------------------+\n\nSELECT PERIOD_ADD(7010,2);\n+--------------------+\n| PERIOD_ADD(7010,2) |\n+--------------------+\n| 197012 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/period_add/','','https://mariadb.com/kb/en/period_add/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (544,31,'PERIOD_DIFF','Syntax\n------\n\nPERIOD_DIFF(P1,P2)\n\nDescription\n-----------\n\nReturns the number of months between periods P1 and P2. P1 and P2 can be in\nthe format YYMM or YYYYMM, and are not date values.\n\nIf P1 or P2 contains a two-digit year, values from 00 to 69 are converted to\nfrom 2000 to 2069, while values from 70 are converted to 1970 upwards.\n\nExamples\n--------\n\nSELECT PERIOD_DIFF(200802,200703);\n+----------------------------+\n| PERIOD_DIFF(200802,200703) |\n+----------------------------+\n| 11 |\n+----------------------------+\n\nSELECT PERIOD_DIFF(6902,6803);\n+------------------------+\n| PERIOD_DIFF(6902,6803) |\n+------------------------+\n| 11 |\n+------------------------+\n\nSELECT PERIOD_DIFF(7002,6803);\n+------------------------+\n| PERIOD_DIFF(7002,6803) |\n+------------------------+\n| -1177 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/period_diff/','','https://mariadb.com/kb/en/period_diff/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (545,31,'QUARTER','Syntax\n------\n\nQUARTER(date)\n\nDescription\n-----------\n\nReturns the quarter of the year for date, in the range 1 to 4. Returns 0 if\nmonth contains a zero value, or NULL if the given value is not otherwise a\nvalid date (zero values are accepted).\n\nExamples\n--------\n\nSELECT QUARTER(\'2008-04-01\');\n+-----------------------+\n| QUARTER(\'2008-04-01\') |\n+-----------------------+\n| 2 |\n+-----------------------+\n\nSELECT QUARTER(\'2019-00-01\');\n+-----------------------+\n| QUARTER(\'2019-00-01\') |\n+-----------------------+\n| 0 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/quarter/','','https://mariadb.com/kb/en/quarter/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (546,31,'SECOND','Syntax\n------\n\nSECOND(time)\n\nDescription\n-----------\n\nReturns the second for a given time (which can include microseconds), in the\nrange 0 to 59, or NULL if not given a valid time value.\n\nExamples\n--------\n\nSELECT SECOND(\'10:05:03\');\n+--------------------+\n| SECOND(\'10:05:03\') |\n+--------------------+\n| 3 |\n+--------------------+\n\nSELECT SECOND(\'10:05:01.999999\');\n+---------------------------+\n| SECOND(\'10:05:01.999999\') |\n+---------------------------+\n| 1 |\n+---------------------------+\n\nURL: https://mariadb.com/kb/en/second/','','https://mariadb.com/kb/en/second/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (547,31,'SEC_TO_TIME','Syntax\n------\n\nSEC_TO_TIME(seconds)\n\nDescription\n-----------\n\nReturns the seconds argument, converted to hours, minutes, and seconds, as a\nTIME value. The range of the result is constrained to that of the TIME data\ntype. A warning occurs if the argument corresponds to a value outside that\nrange.\n\nThe time will be returned in the format hh:mm:ss, or hhmmss if used in a\nnumeric calculation.\n\nExamples\n--------\n\nSELECT SEC_TO_TIME(12414);\n+--------------------+\n| SEC_TO_TIME(12414) |\n+--------------------+\n| 03:26:54 |\n+--------------------+\n\nSELECT SEC_TO_TIME(12414)+0;\n+----------------------+\n| SEC_TO_TIME(12414)+0 |\n+----------------------+\n| 32654 |\n+----------------------+\n\nSELECT SEC_TO_TIME(9999999);\n+----------------------+\n| SEC_TO_TIME(9999999) |\n+----------------------+\n| 838:59:59 |\n+----------------------+\n1 row in set, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+-------------------------------------------+\n| Level | Code | Message |\n+---------+------+-------------------------------------------+\n| Warning | 1292 | Truncated incorrect time value: \'9999999\' |\n+---------+------+-------------------------------------------+\n\nURL: https://mariadb.com/kb/en/sec_to_time/','','https://mariadb.com/kb/en/sec_to_time/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (548,31,'STR_TO_DATE','Syntax\n------\n\nSTR_TO_DATE(str,format)\n\nDescription\n-----------\n\nThis is the inverse of the DATE_FORMAT() function. It takes a string str and a\nformat string format. STR_TO_DATE() returns a DATETIME value if the format\nstring contains both date and time parts, or a DATE or TIME value if the\nstring contains only date or time parts.\n\nThe date, time, or datetime values contained in str should be given in the\nformat indicated by format. If str contains an illegal date, time, or datetime\nvalue, STR_TO_DATE() returns NULL. An illegal value also produces a warning.\n\nUnder specific SQL_MODE settings an error may also be generated if the str\nisn\'t a valid date:\n\n* ALLOW_INVALID_DATES\n* NO_ZERO_DATE\n* NO_ZERO_IN_DATE\n\nThe options that can be used by STR_TO_DATE(), as well as its inverse\nDATE_FORMAT() and the FROM_UNIXTIME() function, are:\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| %a | Short weekday name in current locale |\n| | (Variable lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %b | Short form month name in current locale. For |\n| | locale en_US this is one of: |\n| | Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov |\n| | or Dec. |\n+---------------------------+------------------------------------------------+\n| %c | Month with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %D | Day with English suffix \'th\', \'nd\', \'st\' or |\n| | \'rd\'\'. (1st, 2nd, 3rd...). |\n+---------------------------+------------------------------------------------+\n| %d | Day with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %e | Day with 1 or 2 digits. |\n+---------------------------+------------------------------------------------+\n| %f | Microseconds 6 digits. |\n+---------------------------+------------------------------------------------+\n| %H | Hour with 2 digits between 00-23. |\n+---------------------------+------------------------------------------------+\n| %h | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %I | Hour with 2 digits between 01-12. |\n+---------------------------+------------------------------------------------+\n| %i | Minute with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %j | Day of the year (001-366) |\n+---------------------------+------------------------------------------------+\n| %k | Hour with 1 digits between 0-23. |\n+---------------------------+------------------------------------------------+\n| %l | Hour with 1 digits between 1-12. |\n+---------------------------+------------------------------------------------+\n| %M | Full month name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %m | Month with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %p | AM/PM according to current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %r | Time in 12 hour format, followed by AM/PM. |\n| | Short for \'%I:%i:%S %p\'. |\n+---------------------------+------------------------------------------------+\n| %S | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %s | Seconds with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %T | Time in 24 hour format. Short for \'%H:%i:%S\'. |\n+---------------------------+------------------------------------------------+\n| %U | Week number (00-53), when first day of the |\n| | week is Sunday. |\n+---------------------------+------------------------------------------------+\n| %u | Week number (00-53), when first day of the |\n| | week is Monday. |\n+---------------------------+------------------------------------------------+\n| %V | Week number (01-53), when first day of the |\n| | week is Sunday. Used with %X. |\n+---------------------------+------------------------------------------------+\n| %v | Week number (01-53), when first day of the |\n| | week is Monday. Used with %x. |\n+---------------------------+------------------------------------------------+\n| %W | Full weekday name in current locale (Variable |\n| | lc_time_names). |\n+---------------------------+------------------------------------------------+\n| %w | Day of the week. 0 = Sunday, 6 = Saturday. |\n+---------------------------+------------------------------------------------+\n| %X | Year with 4 digits when first day of the week |\n| | is Sunday. Used with %V. |\n+---------------------------+------------------------------------------------+\n| %x | Year with 4 digits when first day of the week |\n| | is Monday. Used with %v. |\n+---------------------------+------------------------------------------------+\n| %Y | Year with 4 digits. |\n+---------------------------+------------------------------------------------+\n| %y | Year with 2 digits. |\n+---------------------------+------------------------------------------------+\n| %# | For str_to_date(), skip all numbers. |\n+---------------------------+------------------------------------------------+\n| %. | For str_to_date(), skip all punctation |\n| | characters. |\n+---------------------------+------------------------------------------------+\n| %@ | For str_to_date(), skip all alpha characters. |\n+---------------------------+------------------------------------------------+\n| %% | A literal % character. |\n+---------------------------+------------------------------------------------+\n\nExamples\n--------\n\nSELECT STR_TO_DATE(\'Wednesday, June 2, 2014\', \'%W, %M %e, %Y\');\n+---------------------------------------------------------+\n| STR_TO_DATE(\'Wednesday, June 2, 2014\', \'%W, %M %e, %Y\') |\n+---------------------------------------------------------+\n| 2014-06-02 |\n+---------------------------------------------------------+\n\nSELECT STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W, %M %e, %Y\');\n+--------------------------------------------------------------+\n| STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W, %M %e, %Y\') |\n+--------------------------------------------------------------+\n| NULL |\n+--------------------------------------------------------------+\n1 row in set, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+---------+------+-------------------------------------------------------------\n---------------------+\n| Level | Code | Message \n |\n+---------+------+-------------------------------------------------------------\n---------------------+\n| Warning | 1411 | Incorrect datetime value: \'Wednesday23423, June 2, 2014\'\nfor function str_to_date |\n+---------+------+-------------------------------------------------------------\n---------------------+\n\nSELECT STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W%#, %M %e, %Y\');\n+----------------------------------------------------------------+\n| STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W%#, %M %e, %Y\') |\n+----------------------------------------------------------------+\n| 2014-06-02 |\n+----------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/str_to_date/','','https://mariadb.com/kb/en/str_to_date/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (549,31,'SUBDATE','Syntax\n------\n\nSUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)\n\nDescription\n-----------\n\nWhen invoked with the INTERVAL form of the second argument, SUBDATE() is a\nsynonym for DATE_SUB(). See Date and Time Units for a complete list of\npermitted units.\n\nThe second form allows the use of an integer value for days. In such cases, it\nis interpreted as the number of days to be subtracted from the date or\ndatetime expression expr.\n\nExamples\n--------\n\nSELECT DATE_SUB(\'2008-01-02\', INTERVAL 31 DAY);\n+-----------------------------------------+\n| DATE_SUB(\'2008-01-02\', INTERVAL 31 DAY) |\n+-----------------------------------------+\n| 2007-12-02 |\n+-----------------------------------------+\n\nSELECT SUBDATE(\'2008-01-02\', INTERVAL 31 DAY);\n+----------------------------------------+\n| SUBDATE(\'2008-01-02\', INTERVAL 31 DAY) |\n+----------------------------------------+\n| 2007-12-02 |\n+----------------------------------------+\n\nSELECT SUBDATE(\'2008-01-02 12:00:00\', 31);\n+------------------------------------+\n| SUBDATE(\'2008-01-02 12:00:00\', 31) |\n+------------------------------------+\n| 2007-12-02 12:00:00 |\n+------------------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, SUBDATE(d, 10) from t1;\n+---------------------+---------------------+\n| d | SUBDATE(d, 10) |\n+---------------------+---------------------+\n| 2007-01-30 21:31:07 | 2007-01-20 21:31:07 |\n| 1983-10-15 06:42:51 | 1983-10-05 06:42:51 |\n| 2011-04-21 12:34:56 | 2011-04-11 12:34:56 |\n| 2011-10-30 06:31:41 | 2011-10-20 06:31:41 |\n| 2011-01-30 14:03:25 | 2011-01-20 14:03:25 |\n| 2004-10-07 11:19:34 | 2004-09-27 11:19:34 |\n+---------------------+---------------------+\n\nSELECT d, SUBDATE(d, INTERVAL 10 MINUTE) from t1;\n+---------------------+--------------------------------+\n| d | SUBDATE(d, INTERVAL 10 MINUTE) |\n+---------------------+--------------------------------+\n| 2007-01-30 21:31:07 | 2007-01-30 21:21:07 |\n| 1983-10-15 06:42:51 | 1983-10-15 06:32:51 |\n| 2011-04-21 12:34:56 | 2011-04-21 12:24:56 |\n| 2011-10-30 06:31:41 | 2011-10-30 06:21:41 |\n| 2011-01-30 14:03:25 | 2011-01-30 13:53:25 |\n| 2004-10-07 11:19:34 | 2004-10-07 11:09:34 |\n+---------------------+--------------------------------+\n\nURL: https://mariadb.com/kb/en/subdate/','','https://mariadb.com/kb/en/subdate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (550,31,'SUBTIME','Syntax\n------\n\nSUBTIME(expr1,expr2)\n\nDescription\n-----------\n\nSUBTIME() returns expr1 - expr2 expressed as a value in the same format as\nexpr1. expr1 is a time or datetime expression, and expr2 is a time expression.\n\nExamples\n--------\n\nSELECT SUBTIME(\'2007-12-31 23:59:59.999999\',\'1 1:1:1.000002\');\n+--------------------------------------------------------+\n| SUBTIME(\'2007-12-31 23:59:59.999999\',\'1 1:1:1.000002\') |\n+--------------------------------------------------------+\n| 2007-12-30 22:58:58.999997 |\n+--------------------------------------------------------+\n\nSELECT SUBTIME(\'01:00:00.999999\', \'02:00:00.999998\');\n+-----------------------------------------------+\n| SUBTIME(\'01:00:00.999999\', \'02:00:00.999998\') |\n+-----------------------------------------------+\n| -00:59:59.999999 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/subtime/','','https://mariadb.com/kb/en/subtime/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (551,31,'SYSDATE','Syntax\n------\n\nSYSDATE([precision])\n\nDescription\n-----------\n\nReturns the current date and time as a value in \'YYYY-MM-DD HH:MM:SS\' or\nYYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a\nstring or numeric context.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nSYSDATE() returns the time at which it executes. This differs from the\nbehavior for NOW(), which returns a constant time that indicates the time at\nwhich the statement began to execute. (Within a stored routine or trigger,\nNOW() returns the time at which the routine or triggering statement began to\nexecute.)\n\nIn addition, changing the timestamp system variable with a SET timestamp\nstatement affects the value returned by NOW() but not by SYSDATE(). This means\nthat timestamp settings in the binary log have no effect on invocations of\nSYSDATE().\n\nBecause SYSDATE() can return different values even within the same statement,\nand is not affected by SET TIMESTAMP, it is non-deterministic and therefore\nunsafe for replication if statement-based binary logging is used. If that is a\nproblem, you can use row-based logging, or start the server with the mysqld\noption --sysdate-is-now to cause SYSDATE() to be an alias for NOW(). The\nnon-deterministic nature of SYSDATE() also means that indexes cannot be used\nfor evaluating expressions that refer to it, and that statements using the\nSYSDATE() function are unsafe for statement-based replication.\n\nExamples\n--------\n\nDifference between NOW() and SYSDATE():\n\nSELECT NOW(), SLEEP(2), NOW();\n+---------------------+----------+---------------------+\n| NOW() | SLEEP(2) | NOW() |\n+---------------------+----------+---------------------+\n| 2010-03-27 13:23:40 | 0 | 2010-03-27 13:23:40 |\n+---------------------+----------+---------------------+\n\nSELECT SYSDATE(), SLEEP(2), SYSDATE();\n+---------------------+----------+---------------------+\n| SYSDATE() | SLEEP(2) | SYSDATE() |\n+---------------------+----------+---------------------+\n| 2010-03-27 13:23:52 | 0 | 2010-03-27 13:23:54 |\n+---------------------+----------+---------------------+\n\nWith precision:\n\nSELECT SYSDATE(4);\n+--------------------------+\n| SYSDATE(4) |\n+--------------------------+\n| 2018-07-10 10:17:13.1689 |\n+--------------------------+\n\nURL: https://mariadb.com/kb/en/sysdate/','','https://mariadb.com/kb/en/sysdate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (552,31,'TIME Function','Syntax\n------\n\nTIME(expr)\n\nDescription\n-----------\n\nExtracts the time part of the time or datetime expression expr and returns it\nas a string.\n\nExamples\n--------\n\nSELECT TIME(\'2003-12-31 01:02:03\');\n+-----------------------------+\n| TIME(\'2003-12-31 01:02:03\') |\n+-----------------------------+\n| 01:02:03 |\n+-----------------------------+\n\nSELECT TIME(\'2003-12-31 01:02:03.000123\');\n+------------------------------------+\n| TIME(\'2003-12-31 01:02:03.000123\') |\n+------------------------------------+\n| 01:02:03.000123 |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/time-function/','','https://mariadb.com/kb/en/time-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (553,31,'TIMEDIFF','Syntax\n------\n\nTIMEDIFF(expr1,expr2)\n\nDescription\n-----------\n\nTIMEDIFF() returns expr1 - expr2 expressed as a time value. expr1 and expr2\nare time or date-and-time expressions, but both must be of the same type.\n\nExamples\n--------\n\nSELECT TIMEDIFF(\'2000:01:01 00:00:00\', \'2000:01:01 00:00:00.000001\');\n+---------------------------------------------------------------+\n| TIMEDIFF(\'2000:01:01 00:00:00\', \'2000:01:01 00:00:00.000001\') |\n+---------------------------------------------------------------+\n| -00:00:00.000001 |\n+---------------------------------------------------------------+\n\nSELECT TIMEDIFF(\'2008-12-31 23:59:59.000001\', \'2008-12-30 01:01:01.000002\');\n+----------------------------------------------------------------------+\n| TIMEDIFF(\'2008-12-31 23:59:59.000001\', \'2008-12-30 01:01:01.000002\') |\n+----------------------------------------------------------------------+\n| 46:58:57.999999 |\n+----------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/timediff/','','https://mariadb.com/kb/en/timediff/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (554,31,'TIMESTAMP FUNCTION','Syntax\n------\n\nTIMESTAMP(expr), TIMESTAMP(expr1,expr2)\n\nDescription\n-----------\n\nWith a single argument, this function returns the date or datetime expression\nexpr as a datetime value. With two arguments, it adds the time expression\nexpr2 to the date or datetime expression expr1 and returns the result as a\ndatetime value.\n\nExamples\n--------\n\nSELECT TIMESTAMP(\'2003-12-31\');\n+-------------------------+\n| TIMESTAMP(\'2003-12-31\') |\n+-------------------------+\n| 2003-12-31 00:00:00 |\n+-------------------------+\n\nSELECT TIMESTAMP(\'2003-12-31 12:00:00\',\'6:30:00\');\n+--------------------------------------------+\n| TIMESTAMP(\'2003-12-31 12:00:00\',\'6:30:00\') |\n+--------------------------------------------+\n| 2003-12-31 18:30:00 |\n+--------------------------------------------+\n\nURL: https://mariadb.com/kb/en/timestamp-function/','','https://mariadb.com/kb/en/timestamp-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (555,31,'TIMESTAMPADD','Syntax\n------\n\nTIMESTAMPADD(unit,interval,datetime_expr)\n\nDescription\n-----------\n\nAdds the integer expression interval to the date or datetime expression\ndatetime_expr. The unit for interval is given by the unit argument, which\nshould be one of the following values: MICROSECOND, SECOND, MINUTE, HOUR, DAY,\nWEEK, MONTH, QUARTER, or YEAR.\n\nThe unit value may be specified using one of keywords as shown, or with a\nprefix of SQL_TSI_. For example, DAY and SQL_TSI_DAY both are legal.\n\nBefore MariaDB 5.5, FRAC_SECOND was permitted as a synonym for MICROSECOND.\n\nExamples\n--------\n\nSELECT TIMESTAMPADD(MINUTE,1,\'2003-01-02\');\n+-------------------------------------+\n| TIMESTAMPADD(MINUTE,1,\'2003-01-02\') |\n+-------------------------------------+\n| 2003-01-02 00:01:00 |\n+-------------------------------------+\n\nSELECT TIMESTAMPADD(WEEK,1,\'2003-01-02\');\n+-----------------------------------+\n| TIMESTAMPADD(WEEK,1,\'2003-01-02\') |\n+-----------------------------------+\n| 2003-01-09 |\n+-----------------------------------+\n\nURL: https://mariadb.com/kb/en/timestampadd/','','https://mariadb.com/kb/en/timestampadd/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (556,31,'TIMESTAMPDIFF','Syntax\n------\n\nTIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)\n\nDescription\n-----------\n\nReturns datetime_expr2 - datetime_expr1, where datetime_expr1 and\ndatetime_expr2 are date or datetime expressions. One expression may be a date\nand the other a datetime; a date value is treated as a datetime having the\ntime part \'00:00:00\' where necessary. The unit for the result (an integer) is\ngiven by the unit argument. The legal values for unit are the same as those\nlisted in the description of the TIMESTAMPADD() function, i.e MICROSECOND,\nSECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.\n\nTIMESTAMPDIFF can also be used to calculate age.\n\nExamples\n--------\n\nSELECT TIMESTAMPDIFF(MONTH,\'2003-02-01\',\'2003-05-01\');\n+------------------------------------------------+\n| TIMESTAMPDIFF(MONTH,\'2003-02-01\',\'2003-05-01\') |\n+------------------------------------------------+\n| 3 |\n+------------------------------------------------+\n\nSELECT TIMESTAMPDIFF(YEAR,\'2002-05-01\',\'2001-01-01\');\n+-----------------------------------------------+\n| TIMESTAMPDIFF(YEAR,\'2002-05-01\',\'2001-01-01\') |\n+-----------------------------------------------+\n| -1 |\n+-----------------------------------------------+\n\nSELECT TIMESTAMPDIFF(MINUTE,\'2003-02-01\',\'2003-05-01 12:05:55\');\n+----------------------------------------------------------+\n| TIMESTAMPDIFF(MINUTE,\'2003-02-01\',\'2003-05-01 12:05:55\') |\n+----------------------------------------------------------+\n| 128885 |\n+----------------------------------------------------------+\n\nCalculating age:\n\nSELECT CURDATE();\n+------------+\n| CURDATE() |\n+------------+\n| 2019-05-27 |\n+------------+\n\nSELECT TIMESTAMPDIFF(YEAR, \'1971-06-06\', CURDATE()) AS age;\n+------+\n| age |\n+------+\n| 47 |\n+------+\n\nSELECT TIMESTAMPDIFF(YEAR, \'1971-05-06\', CURDATE()) AS age;\n+------+\n| age |\n+------+\n| 48 |\n+------+\n\nAge as of 2014-08-02:\n\nSELECT name, date_of_birth, TIMESTAMPDIFF(YEAR,date_of_birth,\'2014-08-02\') AS\nage \n FROM student_details;\n+---------+---------------+------+\n| name | date_of_birth | age |\n+---------+---------------+------+\n| Chun | 1993-12-31 | 20 |\n| Esben | 1946-01-01 | 68 |\n| Kaolin | 1996-07-16 | 18 |\n| Tatiana | 1988-04-13 | 26 |\n+---------+---------------+------+\n\nURL: https://mariadb.com/kb/en/timestampdiff/','','https://mariadb.com/kb/en/timestampdiff/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (557,31,'TIME_FORMAT','Syntax\n------\n\nTIME_FORMAT(time,format)\n\nDescription\n-----------\n\nThis is used like the DATE_FORMAT() function, but the format string may\ncontain format specifiers only for hours, minutes, and seconds. Other\nspecifiers produce a NULL value or 0.\n\nExamples\n--------\n\nSELECT TIME_FORMAT(\'100:00:00\', \'%H %k %h %I %l\');\n+--------------------------------------------+\n| TIME_FORMAT(\'100:00:00\', \'%H %k %h %I %l\') |\n+--------------------------------------------+\n| 100 100 04 04 4 |\n+--------------------------------------------+\n\nURL: https://mariadb.com/kb/en/time_format/','','https://mariadb.com/kb/en/time_format/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (558,31,'TIME_TO_SEC','Syntax\n------\n\nTIME_TO_SEC(time)\n\nDescription\n-----------\n\nReturns the time argument, converted to seconds.\n\nThe value returned by TIME_TO_SEC is of type DOUBLE. Before MariaDB 5.3 (and\nMySQL 5.6), the type was INT. The returned value preserves microseconds of the\nargument. See also Microseconds in MariaDB.\n\nExamples\n--------\n\nSELECT TIME_TO_SEC(\'22:23:00\');\n+-------------------------+\n| TIME_TO_SEC(\'22:23:00\') |\n+-------------------------+\n| 80580 |\n+-------------------------+\n\nSELECT TIME_TO_SEC(\'00:39:38\');\n+-------------------------+\n| TIME_TO_SEC(\'00:39:38\') |\n+-------------------------+\n| 2378 |\n+-------------------------+\n\nSELECT TIME_TO_SEC(\'09:12:55.2355\');\n+------------------------------+\n| TIME_TO_SEC(\'09:12:55.2355\') |\n+------------------------------+\n| 33175.2355 |\n+------------------------------+\n1 row in set (0.000 sec)\n\nURL: https://mariadb.com/kb/en/time_to_sec/','','https://mariadb.com/kb/en/time_to_sec/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (559,31,'TO_DAYS','Syntax\n------\n\nTO_DAYS(date)\n\nDescription\n-----------\n\nGiven a date date, returns the number of days since the start of the current\ncalendar (0000-00-00).\n\nThe function is not designed for use with dates before the advent of the\nGregorian calendar in October 1582. Results will not be reliable since it\ndoesn\'t account for the lost days when the calendar changed from the Julian\ncalendar.\n\nThis is the converse of the FROM_DAYS() function.\n\nExamples\n--------\n\nSELECT TO_DAYS(\'2007-10-07\');\n+-----------------------+\n| TO_DAYS(\'2007-10-07\') |\n+-----------------------+\n| 733321 |\n+-----------------------+\n\nSELECT TO_DAYS(\'0000-01-01\');\n+-----------------------+\n| TO_DAYS(\'0000-01-01\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nSELECT TO_DAYS(950501);\n+-----------------+\n| TO_DAYS(950501) |\n+-----------------+\n| 728779 |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/to_days/','','https://mariadb.com/kb/en/to_days/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (560,31,'TO_SECONDS','Syntax\n------\n\nTO_SECONDS(expr)\n\nDescription\n-----------\n\nReturns the number of seconds from year 0 till expr, or NULL if expr is not a\nvalid date or datetime.\n\nExamples\n--------\n\nSELECT TO_SECONDS(\'2013-06-13\');\n+--------------------------+\n| TO_SECONDS(\'2013-06-13\') |\n+--------------------------+\n| 63538300800 |\n+--------------------------+\n\nSELECT TO_SECONDS(\'2013-06-13 21:45:13\');\n+-----------------------------------+\n| TO_SECONDS(\'2013-06-13 21:45:13\') |\n+-----------------------------------+\n| 63538379113 |\n+-----------------------------------+\n\nSELECT TO_SECONDS(NOW());\n+-------------------+\n| TO_SECONDS(NOW()) |\n+-------------------+\n| 63543530875 |\n+-------------------+\n\nSELECT TO_SECONDS(20130513);\n+----------------------+\n| TO_SECONDS(20130513) |\n+----------------------+\n| 63535622400 |\n+----------------------+\n1 row in set (0.00 sec)\n\nSELECT TO_SECONDS(130513);\n+--------------------+\n| TO_SECONDS(130513) |\n+--------------------+\n| 63535622400 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/to_seconds/','','https://mariadb.com/kb/en/to_seconds/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (561,31,'UNIX_TIMESTAMP','Syntax\n------\n\nUNIX_TIMESTAMP()\nUNIX_TIMESTAMP(date)\n\nDescription\n-----------\n\nIf called with no argument, returns a Unix timestamp (seconds since\n\'1970-01-01 00:00:00\' UTC) as an unsigned integer. If UNIX_TIMESTAMP() is\ncalled with a date argument, it returns the value of the argument as seconds\nsince \'1970-01-01 00:00:00\' UTC. date may be a DATE string, a DATETIME string,\na TIMESTAMP, or a number in the format YYMMDD or YYYYMMDD. The server\ninterprets date as a value in the current time zone and converts it to an\ninternal value in UTC. Clients can set their time zone as described in time\nzones.\n\nThe inverse function of UNIX_TIMESTAMP() is FROM_UNIXTIME()\n\nUNIX_TIMESTAMP() supports microseconds.\n\nTimestamps in MariaDB have a maximum value of 2147483647, equivalent to\n2038-01-19 05:14:07. This is due to the underlying 32-bit limitation. Using\nthe function on a date beyond this will result in NULL being returned. Use\nDATETIME as a storage type if you require dates beyond this.\n\nError Handling\n--------------\n\nReturns NULL for wrong arguments to UNIX_TIMESTAMP(). In MySQL and MariaDB\nbefore 5.3 wrong arguments to UNIX_TIMESTAMP() returned 0.\n\nCompatibility\n-------------\n\nAs you can see in the examples above, UNIX_TIMESTAMP(constant-date-string)\nreturns a timestamp with 6 decimals while MariaDB 5.2 and before returns it\nwithout decimals. This can cause a problem if you are using UNIX_TIMESTAMP()\nas a partitioning function. You can fix this by using\nFLOOR(UNIX_TIMESTAMP(..)) or changing the date string to a date number, like\n20080101000000.\n\nExamples\n--------\n\nSELECT UNIX_TIMESTAMP();\n+------------------+\n| UNIX_TIMESTAMP() |\n+------------------+\n| 1269711082 |\n+------------------+\n\nSELECT UNIX_TIMESTAMP(\'2007-11-30 10:30:19\');\n+---------------------------------------+\n| UNIX_TIMESTAMP(\'2007-11-30 10:30:19\') |\n+---------------------------------------+\n| 1196436619.000000 |\n+---------------------------------------+\n\nSELECT UNIX_TIMESTAMP(\"2007-11-30 10:30:19.123456\");\n+----------------------------------------------+\n| unix_timestamp(\"2007-11-30 10:30:19.123456\") |\n+----------------------------------------------+\n| 1196411419.123456 |\n+----------------------------------------------+\n\nSELECT FROM_UNIXTIME(UNIX_TIMESTAMP(\'2007-11-30 10:30:19\'));\n+------------------------------------------------------+\n| FROM_UNIXTIME(UNIX_TIMESTAMP(\'2007-11-30 10:30:19\')) |\n+------------------------------------------------------+\n| 2007-11-30 10:30:19.000000 |\n+------------------------------------------------------+\n\nSELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(\'2007-11-30 10:30:19\')));\n+-------------------------------------------------------------+\n| FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(\'2007-11-30 10:30:19\'))) |\n+-------------------------------------------------------------+\n| 2007-11-30 10:30:19 |\n+-------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/unix_timestamp/','','https://mariadb.com/kb/en/unix_timestamp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (562,31,'UTC_DATE','Syntax\n------\n\nUTC_DATE, UTC_DATE()\n\nDescription\n-----------\n\nReturns the current UTC date as a value in \'YYYY-MM-DD\' or YYYYMMDD format,\ndepending on whether the function is used in a string or numeric context.\n\nExamples\n--------\n\nSELECT UTC_DATE(), UTC_DATE() + 0;\n+------------+----------------+\n| UTC_DATE() | UTC_DATE() + 0 |\n+------------+----------------+\n| 2010-03-27 | 20100327 |\n+------------+----------------+\n\nURL: https://mariadb.com/kb/en/utc_date/','','https://mariadb.com/kb/en/utc_date/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (563,31,'UTC_TIME','Syntax\n------\n\nUTC_TIME\nUTC_TIME([precision])\n\nDescription\n-----------\n\nReturns the current UTC time as a value in \'HH:MM:SS\' or HHMMSS.uuuuuu format,\ndepending on whether the function is used in a string or numeric context.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nExamples\n--------\n\nSELECT UTC_TIME(), UTC_TIME() + 0;\n+------------+----------------+\n| UTC_TIME() | UTC_TIME() + 0 |\n+------------+----------------+\n| 17:32:34 | 173234.000000 |\n+------------+----------------+\n\nWith precision:\n\nSELECT UTC_TIME(5);\n+----------------+\n| UTC_TIME(5) |\n+----------------+\n| 07:52:50.78369 |\n+----------------+\n\nURL: https://mariadb.com/kb/en/utc_time/','','https://mariadb.com/kb/en/utc_time/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (564,31,'UTC_TIMESTAMP','Syntax\n------\n\nUTC_TIMESTAMP\nUTC_TIMESTAMP([precision])\n\nDescription\n-----------\n\nReturns the current UTC date and time as a value in \'YYYY-MM-DD HH:MM:SS\' or\nYYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a\nstring or numeric context.\n\nThe optional precision determines the microsecond precision. See Microseconds\nin MariaDB.\n\nExamples\n--------\n\nSELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;\n+---------------------+-----------------------+\n| UTC_TIMESTAMP() | UTC_TIMESTAMP() + 0 |\n+---------------------+-----------------------+\n| 2010-03-27 17:33:16 | 20100327173316.000000 |\n+---------------------+-----------------------+\n\nWith precision:\n\nSELECT UTC_TIMESTAMP(4);\n+--------------------------+\n| UTC_TIMESTAMP(4) |\n+--------------------------+\n| 2018-07-10 07:51:09.1019 |\n+--------------------------+\n\nURL: https://mariadb.com/kb/en/utc_timestamp/','','https://mariadb.com/kb/en/utc_timestamp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (565,31,'WEEK','Syntax\n------\n\nWEEK(date[,mode])\n\nDescription\n-----------\n\nThis function returns the week number for date. The two-argument form of\nWEEK() allows you to specify whether the week starts on Sunday or Monday and\nwhether the return value should be in the range from 0 to 53 or from 1 to 53.\nIf the mode argument is omitted, the value of the default_week_format system\nvariable is used.\n\nModes\n-----\n\n+-------+---------------------+--------+------------------------------------+\n| Mode | 1st day of week | Range | Week 1 is the 1st week with |\n+-------+---------------------+--------+------------------------------------+\n| 0 | Sunday | 0-53 | a Sunday in this year |\n+-------+---------------------+--------+------------------------------------+\n| 1 | Monday | 0-53 | more than 3 days this year |\n+-------+---------------------+--------+------------------------------------+\n| 2 | Sunday | 1-53 | a Sunday in this year |\n+-------+---------------------+--------+------------------------------------+\n| 3 | Monday | 1-53 | more than 3 days this year |\n+-------+---------------------+--------+------------------------------------+\n| 4 | Sunday | 0-53 | more than 3 days this year |\n+-------+---------------------+--------+------------------------------------+\n| 5 | Monday | 0-53 | a Monday in this year |\n+-------+---------------------+--------+------------------------------------+\n| 6 | Sunday | 1-53 | more than 3 days this year |\n+-------+---------------------+--------+------------------------------------+\n| 7 | Monday | 1-53 | a Monday in this year |\n+-------+---------------------+--------+------------------------------------+\n\nWith the mode value of 3, which means \'more than 3 days this year\', weeks are\nnumbered according to ISO 8601:1988.\n\nExamples\n--------\n\nSELECT WEEK(\'2008-02-20\');\n+--------------------+\n| WEEK(\'2008-02-20\') |\n+--------------------+\n| 7 |\n+--------------------+\n\nSELECT WEEK(\'2008-02-20\',0);\n+----------------------+\n| WEEK(\'2008-02-20\',0) |\n+----------------------+\n| 7 |\n+----------------------+\n\nSELECT WEEK(\'2008-02-20\',1);\n+----------------------+\n| WEEK(\'2008-02-20\',1) |\n+----------------------+\n| 8 |\n+----------------------+\n\nSELECT WEEK(\'2008-12-31\',0);\n+----------------------+\n| WEEK(\'2008-12-31\',0) |\n+----------------------+\n| 52 |\n+----------------------+\n\nSELECT WEEK(\'2008-12-31\',1);\n+----------------------+\n| WEEK(\'2008-12-31\',1) |\n+----------------------+\n| 53 |\n+----------------------+\n\nSELECT WEEK(\'2019-12-30\',3);\n+----------------------+\n| WEEK(\'2019-12-30\',3) |\n+----------------------+\n| 1 |\n+----------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d, WEEK(d,0), WEEK(d,1) from t1;\n+---------------------+-----------+-----------+\n| d | WEEK(d,0) | WEEK(d,1) |\n+---------------------+-----------+-----------+\n| 2007-01-30 21:31:07 | 4 | 5 |\n| 1983-10-15 06:42:51 | 41 | 41 |\n| 2011-04-21 12:34:56 | 16 | 16 |\n| 2011-10-30 06:31:41 | 44 | 43 |\n| 2011-01-30 14:03:25 | 5 | 4 |\n| 2004-10-07 11:19:34 | 40 | 41 |\n+---------------------+-----------+-----------+\n\nURL: https://mariadb.com/kb/en/week/','','https://mariadb.com/kb/en/week/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (566,31,'WEEKDAY','Syntax\n------\n\nWEEKDAY(date)\n\nDescription\n-----------\n\nReturns the weekday index for date (0 = Monday, 1 = Tuesday, ... 6 = Sunday).\n\nThis contrasts with DAYOFWEEK() which follows the ODBC standard (1 = Sunday, 2\n= Monday, ..., 7 = Saturday).\n\nExamples\n--------\n\nSELECT WEEKDAY(\'2008-02-03 22:23:00\');\n+--------------------------------+\n| WEEKDAY(\'2008-02-03 22:23:00\') |\n+--------------------------------+\n| 6 |\n+--------------------------------+\n\nSELECT WEEKDAY(\'2007-11-06\');\n+-----------------------+\n| WEEKDAY(\'2007-11-06\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT d FROM t1 where WEEKDAY(d) = 6;\n+---------------------+\n| d |\n+---------------------+\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/weekday/','','https://mariadb.com/kb/en/weekday/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (567,31,'WEEKOFYEAR','Syntax\n------\n\nWEEKOFYEAR(date)\n\nDescription\n-----------\n\nReturns the calendar week of the date as a number in the range from 1 to 53.\nWEEKOFYEAR() is a compatibility function that is equivalent to WEEK(date,3).\n\nExamples\n--------\n\nSELECT WEEKOFYEAR(\'2008-02-20\');\n+--------------------------+\n| WEEKOFYEAR(\'2008-02-20\') |\n+--------------------------+\n| 8 |\n+--------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nselect * from t1;\n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 1983-10-15 06:42:51 |\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n| 2004-10-07 11:19:34 |\n+---------------------+\n\nSELECT d, WEEKOFYEAR(d), WEEK(d,3) from t1;\n+---------------------+---------------+-----------+\n| d | WEEKOFYEAR(d) | WEEK(d,3) |\n+---------------------+---------------+-----------+\n| 2007-01-30 21:31:07 | 5 | 5 |\n| 1983-10-15 06:42:51 | 41 | 41 |\n| 2011-04-21 12:34:56 | 16 | 16 |\n| 2011-10-30 06:31:41 | 43 | 43 |\n| 2011-01-30 14:03:25 | 4 | 4 |\n| 2004-10-07 11:19:34 | 41 | 41 |\n+---------------------+---------------+-----------+\n\nURL: https://mariadb.com/kb/en/weekofyear/','','https://mariadb.com/kb/en/weekofyear/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (568,31,'YEAR','Syntax\n------\n\nYEAR(date)\n\nDescription\n-----------\n\nReturns the year for the given date, in the range 1000 to 9999, or 0 for the\n\"zero\" date.\n\nExamples\n--------\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT * FROM t1;\n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 1983-10-15 06:42:51 |\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n| 2004-10-07 11:19:34 |\n+---------------------+\n\nSELECT * FROM t1 WHERE YEAR(d) = 2011;\n+---------------------+\n| d |\n+---------------------+\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n+---------------------+\n\nSELECT YEAR(\'1987-01-01\');\n+--------------------+\n| YEAR(\'1987-01-01\') |\n+--------------------+\n| 1987 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/year/','','https://mariadb.com/kb/en/year/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (569,31,'YEARWEEK','Syntax\n------\n\nYEARWEEK(date), YEARWEEK(date,mode)\n\nDescription\n-----------\n\nReturns year and week for a date. The mode argument works exactly like the\nmode argument to WEEK(). The year in the result may be different from the year\nin the date argument for the first and the last week of the year.\n\nExamples\n--------\n\nSELECT YEARWEEK(\'1987-01-01\');\n+------------------------+\n| YEARWEEK(\'1987-01-01\') |\n+------------------------+\n| 198652 |\n+------------------------+\n\nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n\nSELECT * FROM t1;\n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 1983-10-15 06:42:51 |\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n| 2004-10-07 11:19:34 |\n+---------------------+\n6 rows in set (0.02 sec)\n\nSELECT YEARWEEK(d) FROM t1 WHERE YEAR(d) = 2011;\n+-------------+\n| YEARWEEK(d) |\n+-------------+\n| 201116 |\n| 201144 |\n| 201105 |\n+-------------+\n3 rows in set (0.03 sec)\n\nURL: https://mariadb.com/kb/en/yearweek/','','https://mariadb.com/kb/en/yearweek/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (570,32,'Well-Known Binary (WKB) Format','WKB stands for Well-Known Binary, a format for representing geographical and\ngeometrical data.\n\nWKB uses 1-byte unsigned integers, 4-byte unsigned integers, and 8-byte\ndouble-precision numbers.\n\n* The first byte indicates the byte order. 00 for big endian, or 01 for little\nendian.\n* The next 4 bytes indicate the geometry type. Values from 1 to 7 indicate\nwhether the type is Point, LineString, Polygon, MultiPoint, MultiLineString,\nMultiPolygon, or GeometryCollection respectively. \n* The 8-byte floats represent the co-ordinates.\n\nTake the following example, a sequence of 21 bytes each represented by two hex\ndigits:\n\n000000000140000000000000004010000000000000\n\n* It\'s big endian\n000000000140000000000000004010000000000000\n\n* It\'s a POINT\n000000000140000000000000004010000000000000\n\n* The X co-ordinate is 2.0\n000000000140000000000000004010000000000000\n\n* The Y-co-ordinate is 4.0\n000000000140000000000000004010000000000000\n\nURL: https://mariadb.com/kb/en/well-known-binary-wkb-format/','','https://mariadb.com/kb/en/well-known-binary-wkb-format/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (571,32,'AsBinary','A synonym for ST_AsBinary().\n\nURL: https://mariadb.com/kb/en/wkb-asbinary/','','https://mariadb.com/kb/en/wkb-asbinary/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (572,32,'AsWKB','A synonym for ST_AsBinary().\n\nURL: https://mariadb.com/kb/en/aswkb/','','https://mariadb.com/kb/en/aswkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (573,32,'MLineFromWKB','Syntax\n------\n\nMLineFromWKB(wkb[,srid])\nMultiLineStringFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a MULTILINESTRING value using its WKB representation and SRID.\n\nMLineFromWKB() and MultiLineStringFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(MLineFromText(\'MULTILINESTRING((10 48,10 21,10 0),(16\n0,16 23,16 48))\'));\n\nSELECT ST_AsText(MLineFromWKB(@g));\n+--------------------------------------------------------+\n| ST_AsText(MLineFromWKB(@g)) |\n+--------------------------------------------------------+\n| MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48)) |\n+--------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/mlinefromwkb/','','https://mariadb.com/kb/en/mlinefromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (574,32,'MPointFromWKB','Syntax\n------\n\nMPointFromWKB(wkb[,srid])\nMultiPointFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a MULTIPOINT value using its WKB representation and SRID.\n\nMPointFromWKB() and MultiPointFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(MPointFromText(\'MultiPoint( 1 1, 2 2, 5 3, 7 2, 9 3, 8 4,\n6 6, 6 9, 4 9, 1 5 )\'));\n\nSELECT ST_AsText(MPointFromWKB(@g));\n+-----------------------------------------------------+\n| ST_AsText(MPointFromWKB(@g)) |\n+-----------------------------------------------------+\n| MULTIPOINT(1 1,2 2,5 3,7 2,9 3,8 4,6 6,6 9,4 9,1 5) |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/mpointfromwkb/','','https://mariadb.com/kb/en/mpointfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (575,32,'MPolyFromWKB','Syntax\n------\n\nMPolyFromWKB(wkb[,srid])\nMultiPolygonFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a MULTIPOLYGON value using its WKB representation and SRID.\n\nMPolyFromWKB() and MultiPolygonFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(MPointFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28\n26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))\'));\n\nSELECT ST_AsText(MPolyFromWKB(@g))\\G\n*************************** 1. row ***************************\nST_AsText(MPolyFromWKB(@g)): MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52\n18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))\n\nURL: https://mariadb.com/kb/en/mpolyfromwkb/','','https://mariadb.com/kb/en/mpolyfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (576,32,'GeomCollFromWKB','A synonym for ST_GeomCollFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-geomcollfromwkb/','','https://mariadb.com/kb/en/wkb-geomcollfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (577,32,'GeometryCollectionFromWKB','A synonym for ST_GeomCollFromWKB.\n\nURL: https://mariadb.com/kb/en/geometrycollectionfromwkb/','','https://mariadb.com/kb/en/geometrycollectionfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (578,32,'GeometryFromWKB','A synonym for ST_GeomFromWKB.\n\nURL: https://mariadb.com/kb/en/geometryfromwkb/','','https://mariadb.com/kb/en/geometryfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (579,32,'GeomFromWKB','A synonym for ST_GeomFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-geomfromwkb/','','https://mariadb.com/kb/en/wkb-geomfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (580,32,'LineFromWKB','A synonym for ST_LineFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-linefromwkb/','','https://mariadb.com/kb/en/wkb-linefromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (581,32,'LineStringFromWKB','A synonym for ST_LineFromWKB.\n\nURL: https://mariadb.com/kb/en/linestringfromwkb/','','https://mariadb.com/kb/en/linestringfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (582,32,'MultiLineStringFromWKB','A synonym for MLineFromWKB().\n\nURL: https://mariadb.com/kb/en/multilinestringfromwkb/','','https://mariadb.com/kb/en/multilinestringfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (583,32,'MultiPointFromWKB','A synonym for MPointFromWKB.\n\nURL: https://mariadb.com/kb/en/multipointfromwkb/','','https://mariadb.com/kb/en/multipointfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (584,32,'MultiPolygonFromWKB','Synonym for MPolyFromWKB.\n\nURL: https://mariadb.com/kb/en/multipolygonfromwkb/','','https://mariadb.com/kb/en/multipolygonfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (585,32,'PointFromWKB','A synonym for ST_PointFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-pointfromwkb/','','https://mariadb.com/kb/en/wkb-pointfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (586,32,'PolyFromWKB','A synonym for ST_PolyFromWKB.\n\nURL: https://mariadb.com/kb/en/wkb-polyfromwkb/','','https://mariadb.com/kb/en/wkb-polyfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (587,32,'PolygonFromWKB','A synonym for ST_PolyFromWKB.\n\nURL: https://mariadb.com/kb/en/polygonfromwkb/','','https://mariadb.com/kb/en/polygonfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (588,32,'ST_AsBinary','Syntax\n------\n\nST_AsBinary(g)\nAsBinary(g)\nST_AsWKB(g)\nAsWKB(g)\n\nDescription\n-----------\n\nConverts a value in internal geometry format to its WKB representation and\nreturns the binary result.\n\nST_AsBinary(), AsBinary(), ST_AsWKB() and AsWKB() are synonyms,\n\nExamples\n--------\n\nSET @poly = ST_GeomFromText(\'POLYGON((0 0,0 1,1 1,1 0,0 0))\');\nSELECT ST_AsBinary(@poly);\n\nSELECT ST_AsText(ST_GeomFromWKB(ST_AsWKB(@poly)));\n+--------------------------------------------+\n| ST_AsText(ST_GeomFromWKB(ST_AsWKB(@poly))) |\n+--------------------------------------------+\n| POLYGON((0 0,0 1,1 1,1 0,0 0)) |\n+--------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_asbinary/','','https://mariadb.com/kb/en/st_asbinary/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (589,32,'ST_AsWKB','A synonym for ST_AsBinary().\n\nURL: https://mariadb.com/kb/en/st_aswkb/','','https://mariadb.com/kb/en/st_aswkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (590,32,'ST_GeomCollFromWKB','Syntax\n------\n\nST_GeomCollFromWKB(wkb[,srid])\nST_GeometryCollectionFromWKB(wkb[,srid])\nGeomCollFromWKB(wkb[,srid])\nGeometryCollectionFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a GEOMETRYCOLLECTION value using its WKB representation and SRID.\n\nST_GeomCollFromWKB(), ST_GeometryCollectionFromWKB(), GeomCollFromWKB() and\nGeometryCollectionFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_GeomFromText(\'GEOMETRYCOLLECTION(\n POLYGON((5 5,10 5,10 10,5 5)),POINT(10 10))\'));\n\nSELECT ST_AsText(ST_GeomCollFromWKB(@g));\n+----------------------------------------------------------------+\n| ST_AsText(ST_GeomCollFromWKB(@g)) |\n+----------------------------------------------------------------+\n| GEOMETRYCOLLECTION(POLYGON((5 5,10 5,10 10,5 5)),POINT(10 10)) |\n+----------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geomcollfromwkb/','','https://mariadb.com/kb/en/st_geomcollfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (591,32,'ST_GeometryCollectionFromWKB','A synonym for ST_GeomCollFromWKB.\n\nURL: https://mariadb.com/kb/en/st_geometrycollectionfromwkb/','','https://mariadb.com/kb/en/st_geometrycollectionfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (592,32,'ST_GeometryFromWKB','A synonym for ST_GeomFromWKB.\n\nURL: https://mariadb.com/kb/en/st_geometryfromwkb/','','https://mariadb.com/kb/en/st_geometryfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (593,32,'ST_GeomFromWKB','Syntax\n------\n\nST_GeomFromWKB(wkb[,srid])\nST_GeometryFromWKB(wkb[,srid])\nGeomFromWKB(wkb[,srid])\nGeometryFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a geometry value of any type using its WKB representation and SRID.\n\nST_GeomFromWKB(), ST_GeometryFromWKB(), GeomFromWKB() and GeometryFromWKB()\nare synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_LineFromText(\'LINESTRING(0 4, 4 6)\'));\n\nSELECT ST_AsText(ST_GeomFromWKB(@g));\n+-------------------------------+\n| ST_AsText(ST_GeomFromWKB(@g)) |\n+-------------------------------+\n| LINESTRING(0 4,4 6) |\n+-------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geomfromwkb/','','https://mariadb.com/kb/en/st_geomfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (594,32,'ST_LineFromWKB','Syntax\n------\n\nST_LineFromWKB(wkb[,srid])\nLineFromWKB(wkb[,srid])\nST_LineStringFromWKB(wkb[,srid])\nLineStringFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a LINESTRING value using its WKB representation and SRID.\n\nST_LineFromWKB(), LineFromWKB(), ST_LineStringFromWKB(), and\nLineStringFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_LineFromText(\'LineString(0 4,4 6)\'));\n\nSELECT ST_AsText(ST_LineFromWKB(@g)) AS l;\n+---------------------+\n| l |\n+---------------------+\n| LINESTRING(0 4,4 6) |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/st_linefromwkb/','','https://mariadb.com/kb/en/st_linefromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (595,32,'ST_LineStringFromWKB','A synonym for ST_LineFromWKB.\n\nURL: https://mariadb.com/kb/en/st_linestringfromwkb/','','https://mariadb.com/kb/en/st_linestringfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (596,32,'ST_PointFromWKB','Syntax\n------\n\nST_PointFromWKB(wkb[,srid])\nPointFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a POINT value using its WKB representation and SRID.\n\nST_PointFromWKB() and PointFromWKB() are synonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_PointFromText(\'POINT(0 4)\'));\n\nSELECT ST_AsText(ST_PointFromWKB(@g)) AS p;\n+------------+\n| p |\n+------------+\n| POINT(0 4) |\n+------------+\n\nURL: https://mariadb.com/kb/en/st_pointfromwkb/','','https://mariadb.com/kb/en/st_pointfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (597,32,'ST_PolyFromWKB','Syntax\n------\n\nST_PolyFromWKB(wkb[,srid])\nST_PolygonFromWKB(wkb[,srid])\nPolyFromWKB(wkb[,srid])\nPolygonFromWKB(wkb[,srid])\n\nDescription\n-----------\n\nConstructs a POLYGON value using its WKB representation and SRID.\n\nST_PolyFromWKB(), ST_PolygonFromWKB(), PolyFromWKB() and PolygonFromWKB() are\nsynonyms.\n\nExamples\n--------\n\nSET @g = ST_AsBinary(ST_PolyFromText(\'POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1\n1))\'));\n\nSELECT ST_AsText(ST_PolyFromWKB(@g)) AS p;\n+----------------------------------------+\n| p |\n+----------------------------------------+\n| POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1 1)) |\n+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_polyfromwkb/','','https://mariadb.com/kb/en/st_polyfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (598,32,'ST_PolygonFromWKB','A synonym for ST_PolyFromWKB.\n\nURL: https://mariadb.com/kb/en/st_polygonfromwkb/','','https://mariadb.com/kb/en/st_polygonfromwkb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (599,34,'Geometry Types','Description\n-----------\n\nMariaDB provides a standard way of creating spatial columns for geometry\ntypes, for example, with CREATE TABLE or ALTER TABLE. Currently, spatial\ncolumns are supported for MyISAM, InnoDB and ARCHIVE tables. See also SPATIAL\nINDEX.\n\nThe basic geometry type is GEOMETRY. But the type can be more specific. The\nfollowing types are supported:\n\n+-----------------------------------------------------------------------------+\n| Geometry Types |\n+-----------------------------------------------------------------------------+\n| POINT |\n+-----------------------------------------------------------------------------+\n| LINESTRING |\n+-----------------------------------------------------------------------------+\n| POLYGON |\n+-----------------------------------------------------------------------------+\n| MULTIPOINT |\n+-----------------------------------------------------------------------------+\n| MULTILINESTRING |\n+-----------------------------------------------------------------------------+\n| MULTIPOLYGON |\n+-----------------------------------------------------------------------------+\n| GEOMETRYCOLLECTION |\n+-----------------------------------------------------------------------------+\n| GEOMETRY |\n+-----------------------------------------------------------------------------+\n\nExamples\n--------\n\nNote: For clarity, only one type is listed per table in the examples below,\nbut a table row can contain multiple types. For example:\n\nCREATE TABLE object (shapeA POLYGON, shapeB LINESTRING);\n\nPOINT\n-----\n\nCREATE TABLE gis_point (g POINT);\nSHOW FIELDS FROM gis_point;\nINSERT INTO gis_point VALUES\n (PointFromText(\'POINT(10 10)\')),\n (PointFromText(\'POINT(20 10)\')),\n (PointFromText(\'POINT(20 20)\')),\n (PointFromWKB(AsWKB(PointFromText(\'POINT(10 20)\'))));\n\nLINESTRING\n----------\n\nCREATE TABLE gis_line (g LINESTRING);\nSHOW FIELDS FROM gis_line;\nINSERT INTO gis_line VALUES\n (LineFromText(\'LINESTRING(0 0,0 10,10 0)\')),\n (LineStringFromText(\'LINESTRING(10 10,20 10,20 20,10 20,10 10)\')),\n (LineStringFromWKB(AsWKB(LineString(Point(10, 10), Point(40, 10)))));\n\nPOLYGON\n-------\n\nCREATE TABLE gis_polygon (g POLYGON);\nSHOW FIELDS FROM gis_polygon;\nINSERT INTO gis_polygon VALUES\n (PolygonFromText(\'POLYGON((10 10,20 10,20 20,10 20,10 10))\')),\n (PolyFromText(\'POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10\n20,10 10))\')),\n (PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30,\n30), Point(0, 0))))));\n\nMULTIPOINT\n----------\n\nCREATE TABLE gis_multi_point (g MULTIPOINT);\nSHOW FIELDS FROM gis_multi_point;\nINSERT INTO gis_multi_point VALUES\n (MultiPointFromText(\'MULTIPOINT(0 0,10 10,10 20,20 20)\')),\n (MPointFromText(\'MULTIPOINT(1 1,11 11,11 21,21 21)\')),\n (MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));\n\nMULTILINESTRING\n---------------\n\nCREATE TABLE gis_multi_line (g MULTILINESTRING);\nSHOW FIELDS FROM gis_multi_line;\nINSERT INTO gis_multi_line VALUES\n (MultiLineStringFromText(\'MULTILINESTRING((10 48,10 21,10 0),(16 0,16\n23,16 48))\')),\n (MLineFromText(\'MULTILINESTRING((10 48,10 21,10 0))\')),\n (MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)),\nLineString(Point(2, 5), Point(5, 8), Point(21, 7))))));\n\nMULTIPOLYGON\n------------\n\nCREATE TABLE gis_multi_polygon (g MULTIPOLYGON);\nSHOW FIELDS FROM gis_multi_polygon;\nINSERT INTO gis_multi_polygon VALUES\n (MultiPolygonFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52\n18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))\')),\n (MPolyFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66\n23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))\')),\n (MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3,\n3), Point(3, 0), Point(0, 3)))))));\n\nGEOMETRYCOLLECTION\n------------------\n\nCREATE TABLE gis_geometrycollection (g GEOMETRYCOLLECTION);\nSHOW FIELDS FROM gis_geometrycollection;\nINSERT INTO gis_geometrycollection VALUES\n (GeomCollFromText(\'GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10\n10))\')),\n (GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6),\nLineString(Point(3, 6), Point(7, 9)))))),\n (GeomFromText(\'GeometryCollection()\')),\n (GeomFromText(\'GeometryCollection EMPTY\'));\n\nGEOMETRY\n--------\n\nCREATE TABLE gis_geometry (g GEOMETRY);\nSHOW FIELDS FROM gis_geometry;\nINSERT into gis_geometry SELECT * FROM gis_point;\nINSERT into gis_geometry SELECT * FROM gis_line;\nINSERT into gis_geometry SELECT * FROM gis_polygon;\nINSERT into gis_geometry SELECT * FROM gis_multi_point;\nINSERT into gis_geometry SELECT * FROM gis_multi_line;\nINSERT into gis_geometry SELECT * FROM gis_multi_polygon;\nINSERT into gis_geometry SELECT * FROM gis_geometrycollection;\n\nURL: https://mariadb.com/kb/en/geometry-types/','','https://mariadb.com/kb/en/geometry-types/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (600,34,'Geometry Hierarchy','Description\n-----------\n\nGeometry is the base class. It is an abstract class. The instantiable\nsubclasses of Geometry are restricted to zero-, one-, and two-dimensional\ngeometric objects that exist in two-dimensional coordinate space. All\ninstantiable geometry classes are defined so that valid instances of a\ngeometry class are topologically closed (that is, all defined geometries\ninclude their boundary).\n\nThe base Geometry class has subclasses for Point, Curve, Surface, and\nGeometryCollection:\n\n* Point represents zero-dimensional objects.\n* Curve represents one-dimensional objects, and has subclass LineString, with\nsub-subclasses Line and LinearRing.\n* Surface is designed for two-dimensional objects and has subclass Polygon.\n* GeometryCollection has specialized zero-, one-, and two-dimensional\ncollection classes named MultiPoint, MultiLineString, and MultiPolygon for\nmodeling geometries corresponding to collections of Points, LineStrings, and\nPolygons, respectively. MultiCurve and MultiSurface are introduced as abstract\nsuperclasses that generalize the collection interfaces to handle Curves and\nSurfaces.\n\nGeometry, Curve, Surface, MultiCurve, and MultiSurface are defined as\nnon-instantiable classes. They define a common set of methods for their\nsubclasses and are included for extensibility.\n\nPoint, LineString, Polygon, GeometryCollection, MultiPoint, MultiLineString,\nand MultiPolygon are instantiable classes.\n\nURL: https://mariadb.com/kb/en/geometry-hierarchy/','','https://mariadb.com/kb/en/geometry-hierarchy/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (601,34,'SPATIAL INDEX','Description\n-----------\n\nOn MyISAM, Aria and InnoDB tables, MariaDB can create spatial indexes (an\nR-tree index) using syntax similar to that for creating regular indexes, but\nextended with the SPATIAL keyword. Currently, columns in spatial indexes must\nbe declared NOT NULL.\n\nSpatial indexes can be created when the table is created, or added after the\nfact like so:\n\n* with CREATE TABLE: CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g));\n\n* with ALTER TABLE: ALTER TABLE geom ADD SPATIAL INDEX(g);\n\n* with CREATE INDEX: CREATE SPATIAL INDEX sp_index ON geom (g);\n\nSPATIAL INDEX creates an R-tree index. For storage engines that support\nnon-spatial indexing of spatial columns, the engine creates a B-tree index. A\nB-tree index on spatial values is useful for exact-value lookups, but not for\nrange scans.\n\nFor more information on indexing spatial columns, see CREATE INDEX.\n\nTo drop spatial indexes, use ALTER TABLE or DROP INDEX:\n\n* with ALTER TABLE: ALTER TABLE geom DROP INDEX g;\n\n* with DROP INDEX: DROP INDEX sp_index ON geom;\n\nData-at-Rest Encyption\n----------------------\n\nBefore MariaDB 10.4.3, InnoDB\'s spatial indexes could not be encrypted. If an\nInnoDB table was encrypted and if it contained spatial indexes, then those\nindexes would be unencrypted.\n\nIn MariaDB 10.4.3 and later, if innodb_checksum_algorithm is set to full_crc32\nor strict_full_crc32, and if the table does not use ROW_FORMAT=COMPRESSED,\nthen InnoDB spatial indexes will be encrypted if the table is encrypted.\n\nSee MDEV-12026 for more information.\n\nURL: https://mariadb.com/kb/en/spatial-index/','','https://mariadb.com/kb/en/spatial-index/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (602,35,'BOUNDARY','A synonym for ST_BOUNDARY.\n\nURL: https://mariadb.com/kb/en/geometry-properties-boundary/','','https://mariadb.com/kb/en/geometry-properties-boundary/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (603,35,'DIMENSION','A synonym for ST_DIMENSION.\n\nURL: https://mariadb.com/kb/en/dimension/','','https://mariadb.com/kb/en/dimension/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (604,35,'ENVELOPE','A synonym for ST_ENVELOPE.\n\nURL: https://mariadb.com/kb/en/geometry-properties-envelope/','','https://mariadb.com/kb/en/geometry-properties-envelope/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (605,35,'GeometryN','A synonym for ST_GeometryN.\n\nURL: https://mariadb.com/kb/en/geometry-properties-geometryn/','','https://mariadb.com/kb/en/geometry-properties-geometryn/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (606,35,'GeometryType','A synonym for ST_GeometryType.\n\nURL: https://mariadb.com/kb/en/geometry-properties-geometrytype/','','https://mariadb.com/kb/en/geometry-properties-geometrytype/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (607,35,'IsClosed','A synonym for ST_IsClosed.\n\nURL: https://mariadb.com/kb/en/isclosed/','','https://mariadb.com/kb/en/isclosed/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (608,35,'IsEmpty','A synonym for ST_IsEmpty.\n\nURL: https://mariadb.com/kb/en/geometry-properties-isempty/','','https://mariadb.com/kb/en/geometry-properties-isempty/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (609,35,'IsRing','A synonym for ST_IsRing.\n\nURL: https://mariadb.com/kb/en/isring/','','https://mariadb.com/kb/en/isring/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (610,35,'IsSimple','A synonym for ST_IsSImple.\n\nURL: https://mariadb.com/kb/en/geometry-properties-issimple/','','https://mariadb.com/kb/en/geometry-properties-issimple/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (611,35,'NumGeometries','A synonym for ST_NumGeometries.\n\nURL: https://mariadb.com/kb/en/geometry-properties-numgeometries/','','https://mariadb.com/kb/en/geometry-properties-numgeometries/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (612,35,'SRID','A synonym for ST_SRID.\n\nURL: https://mariadb.com/kb/en/geometry-properties-srid/','','https://mariadb.com/kb/en/geometry-properties-srid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (613,35,'ST_BOUNDARY','MariaDB starting with 10.1.2\n----------------------------\nThe ST_BOUNDARY function was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_BOUNDARY(g)\nBOUNDARY(g)\n\nDescription\n-----------\n\nReturns a geometry that is the closure of the combinatorial boundary of the\ngeometry value g.\n\nBOUNDARY() is a synonym.\n\nExamples\n--------\n\nSELECT ST_AsText(ST_Boundary(ST_GeomFromText(\'LINESTRING(3 3,0 0, -3 3)\')));\n+----------------------------------------------------------------------+\n| ST_AsText(ST_Boundary(ST_GeomFromText(\'LINESTRING(3 3,0 0, -3 3)\'))) |\n+----------------------------------------------------------------------+\n| MULTIPOINT(3 3,-3 3) |\n+----------------------------------------------------------------------+\n\nSELECT ST_AsText(ST_Boundary(ST_GeomFromText(\'POLYGON((3 3,0 0, -3 3, 3\n3))\')));\n+--------------------------------------------------------------------------+\n| ST_AsText(ST_Boundary(ST_GeomFromText(\'POLYGON((3 3,0 0, -3 3, 3 3))\'))) |\n+--------------------------------------------------------------------------+\n| LINESTRING(3 3,0 0,-3 3,3 3) |\n+--------------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_boundary/','','https://mariadb.com/kb/en/st_boundary/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (614,35,'ST_DIMENSION','Syntax\n------\n\nST_Dimension(g)\nDimension(g)\n\nDescription\n-----------\n\nReturns the inherent dimension of the geometry value g. The result can be\n\n+------------------------------------+---------------------------------------+\n| Dimension | Definition |\n+------------------------------------+---------------------------------------+\n| -1 | empty geometry |\n+------------------------------------+---------------------------------------+\n| 0 | geometry with no length or area |\n+------------------------------------+---------------------------------------+\n| 1 | geometry with no area but nonzero |\n| | length |\n+------------------------------------+---------------------------------------+\n| 2 | geometry with nonzero area |\n+------------------------------------+---------------------------------------+\n\nST_Dimension() and Dimension() are synonyms.\n\nExamples\n--------\n\nSELECT Dimension(GeomFromText(\'LineString(1 1,2 2)\'));\n+------------------------------------------------+\n| Dimension(GeomFromText(\'LineString(1 1,2 2)\')) |\n+------------------------------------------------+\n| 1 |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_dimension/','','https://mariadb.com/kb/en/st_dimension/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (615,35,'ST_ENVELOPE','Syntax\n------\n\nST_ENVELOPE(g)\nENVELOPE(g)\n\nDescription\n-----------\n\nReturns the Minimum Bounding Rectangle (MBR) for the geometry value g. The\nresult is returned as a Polygon value.\n\nThe polygon is defined by the corner points of the bounding box:\n\nPOLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))\n\nST_ENVELOPE() and ENVELOPE() are synonyms.\n\nExamples\n--------\n\nSELECT AsText(ST_ENVELOPE(GeomFromText(\'LineString(1 1,4 4)\')));\n+----------------------------------------------------------+\n| AsText(ST_ENVELOPE(GeomFromText(\'LineString(1 1,4 4)\'))) |\n+----------------------------------------------------------+\n| POLYGON((1 1,4 1,4 4,1 4,1 1)) |\n+----------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_envelope/','','https://mariadb.com/kb/en/st_envelope/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (616,35,'ST_GEOMETRYN','Syntax\n------\n\nST_GeometryN(gc,N)\nGeometryN(gc,N)\n\nDescription\n-----------\n\nReturns the N-th geometry in the GeometryCollection gc. Geometries are\nnumbered beginning with 1.\n\nST_GeometryN() and GeometryN() are synonyms.\n\nExample\n-------\n\nSET @gc = \'GeometryCollection(Point(1 1),LineString(12 14, 9 11))\';\n\nSELECT AsText(GeometryN(GeomFromText(@gc),1));\n+----------------------------------------+\n| AsText(GeometryN(GeomFromText(@gc),1)) |\n+----------------------------------------+\n| POINT(1 1) |\n+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geometryn/','','https://mariadb.com/kb/en/st_geometryn/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (617,35,'ST_GEOMETRYTYPE','Syntax\n------\n\nST_GeometryType(g)\nGeometryType(g)\n\nDescription\n-----------\n\nReturns as a string the name of the geometry type of which the geometry\ninstance g is a member. The name corresponds to one of the instantiable\nGeometry subclasses.\n\nST_GeometryType() and GeometryType() are synonyms.\n\nExamples\n--------\n\nSELECT GeometryType(GeomFromText(\'POINT(1 1)\'));\n+------------------------------------------+\n| GeometryType(GeomFromText(\'POINT(1 1)\')) |\n+------------------------------------------+\n| POINT |\n+------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geometrytype/','','https://mariadb.com/kb/en/st_geometrytype/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (618,35,'ST_ISCLOSED','Syntax\n------\n\nST_IsClosed(g)\nIsClosed(g)\n\nDescription\n-----------\n\nReturns 1 if a given LINESTRING\'s start and end points are the same, or 0 if\nthey are not the same. Before MariaDB 10.1.5, returns NULL if not given a\nLINESTRING. After MariaDB 10.1.5, returns -1.\n\nST_IsClosed() and IsClosed() are synonyms.\n\nExamples\n--------\n\nSET @ls = \'LineString(0 0, 0 4, 4 4, 0 0)\';\nSELECT ST_ISCLOSED(GEOMFROMTEXT(@ls));\n+--------------------------------+\n| ST_ISCLOSED(GEOMFROMTEXT(@ls)) |\n+--------------------------------+\n| 1 |\n+--------------------------------+\n\nSET @ls = \'LineString(0 0, 0 4, 4 4, 0 1)\';\nSELECT ST_ISCLOSED(GEOMFROMTEXT(@ls));\n+--------------------------------+\n| ST_ISCLOSED(GEOMFROMTEXT(@ls)) |\n+--------------------------------+\n| 0 |\n+--------------------------------+\n\nURL: https://mariadb.com/kb/en/st_isclosed/','','https://mariadb.com/kb/en/st_isclosed/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (619,35,'ST_ISEMPTY','Syntax\n------\n\nST_IsEmpty(g)\nIsEmpty(g)\n\nDescription\n-----------\n\nIsEmpty is a function defined by the OpenGIS specification, but is not fully\nimplemented by MariaDB or MySQL.\n\nSince MariaDB and MySQL do not support GIS EMPTY values such as POINT EMPTY,\nas implemented it simply returns 1 if the geometry value g is invalid, 0 if it\nis valid, and NULL if the argument is NULL.\n\nST_IsEmpty() and IsEmpty() are synonyms.\n\nURL: https://mariadb.com/kb/en/st_isempty/','','https://mariadb.com/kb/en/st_isempty/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (620,35,'ST_IsRing','MariaDB starting with 10.1.2\n----------------------------\nThe ST_IsRing function was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_IsRing(g)\nIsRing(g)\n\nDescription\n-----------\n\nReturns true if a given LINESTRING is a ring, that is, both ST_IsClosed and\nST_IsSimple. A simple curve does not pass through the same point more than\nonce. However, see MDEV-7510.\n\nSt_IsRing() and IsRing() are synonyms.\n\nURL: https://mariadb.com/kb/en/st_isring/','','https://mariadb.com/kb/en/st_isring/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (621,35,'ST_IsSimple','Syntax\n------\n\nST_IsSimple(g)\nIsSimple(g)\n\nDescription\n-----------\n\nReturns true if the given Geometry has no anomalous geometric points, false if\nit does, or NULL if given a NULL value.\n\nST_IsSimple() and IsSimple() are synonyms.\n\nExamples\n--------\n\nA POINT is always simple.\n\nSET @g = \'Point(1 2)\';\n\nSELECT ST_ISSIMPLE(GEOMFROMTEXT(@g));\n+-------------------------------+\n| ST_ISSIMPLE(GEOMFROMTEXT(@g)) |\n+-------------------------------+\n| 1 |\n+-------------------------------+\n\nURL: https://mariadb.com/kb/en/st_issimple/','','https://mariadb.com/kb/en/st_issimple/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (622,35,'ST_NUMGEOMETRIES','Syntax\n------\n\nST_NumGeometries(gc)\nNumGeometries(gc)\n\nDescription\n-----------\n\nReturns the number of geometries in the GeometryCollection gc.\n\nST_NumGeometries() and NumGeometries() are synonyms.\n\nExample\n-------\n\nSET @gc = \'GeometryCollection(Point(1 1),LineString(2 2, 3 3))\';\n\nSELECT NUMGEOMETRIES(GeomFromText(@gc));\n+----------------------------------+\n| NUMGEOMETRIES(GeomFromText(@gc)) |\n+----------------------------------+\n| 2 |\n+----------------------------------+\n\nURL: https://mariadb.com/kb/en/st_numgeometries/','','https://mariadb.com/kb/en/st_numgeometries/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (623,35,'ST_RELATE','MariaDB starting with 10.1.2\n----------------------------\nThe ST_RELATE() function was introduced in MariaDB 10.1.2\n\nSyntax\n------\n\nST_Relate(g1, g2, i)\n\nDescription\n-----------\n\nReturns true if Geometry g1 is spatially related to Geometryg2 by testing for\nintersections between the interior, boundary and exterior of the two\ngeometries as specified by the values in intersection matrix pattern i.\n\nURL: https://mariadb.com/kb/en/st_relate/','','https://mariadb.com/kb/en/st_relate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (624,35,'ST_SRID','Syntax\n------\n\nST_SRID(g)\nSRID(g)\n\nDescription\n-----------\n\nReturns an integer indicating the Spatial Reference System ID for the geometry\nvalue g.\n\nIn MariaDB, the SRID value is just an integer associated with the geometry\nvalue. All calculations are done assuming Euclidean (planar) geometry.\n\nST_SRID() and SRID() are synonyms.\n\nExamples\n--------\n\nSELECT SRID(GeomFromText(\'LineString(1 1,2 2)\',101));\n+-----------------------------------------------+\n| SRID(GeomFromText(\'LineString(1 1,2 2)\',101)) |\n+-----------------------------------------------+\n| 101 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/st_srid/','','https://mariadb.com/kb/en/st_srid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (625,36,'LOAD_FILE','Syntax\n------\n\nLOAD_FILE(file_name)\n\nDescription\n-----------\n\nReads the file and returns the file contents as a string. To use this\nfunction, the file must be located on the server host, you must specify the\nfull path name to the file, and you must have the FILE privilege. The file\nmust be readable by all and it must be less than the size, in bytes, of the\nmax_allowed_packet system variable. If the secure_file_priv system variable is\nset to a non-empty directory name, the file to be loaded must be located in\nthat directory.\n\nIf the file does not exist or cannot be read because one of the preceding\nconditions is not satisfied, the function returns NULL.\n\nSince MariaDB 5.1, the character_set_filesystem system variable has controlled\ninterpretation of file names that are given as literal strings.\n\nStatements using the LOAD_FILE() function are not safe for statement based\nreplication. This is because the slave will execute the LOAD_FILE() command\nitself. If the file doesn\'t exist on the slave, the function will return NULL.\n\nExamples\n--------\n\nUPDATE t SET blob_col=LOAD_FILE(\'/tmp/picture\') WHERE id=1;\n\nURL: https://mariadb.com/kb/en/load_file/','','https://mariadb.com/kb/en/load_file/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (626,36,'NOT REGEXP','Syntax\n------\n\nexpr NOT REGEXP pat, expr NOT RLIKE pat\n\nDescription\n-----------\n\nThis is the same as NOT (expr REGEXP pat).\n\nURL: https://mariadb.com/kb/en/not-regexp/','','https://mariadb.com/kb/en/not-regexp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (627,36,'REGEXP','Syntax\n------\n\nexpr REGEXP pat, expr RLIKE pat\n\nDescription\n-----------\n\nPerforms a pattern match of a string expression expr against a pattern pat.\nThe pattern can be an extended regular expression. See Regular Expressions\nOverview for details on the syntax for regular expressions (see also PCRE\nRegular Expressions).\n\nReturns 1 if expr matches pat or 0 if it doesn\'t match. If either expr or pat\nare NULL, the result is NULL.\n\nThe negative form NOT REGEXP also exists, as an alias for NOT (string REGEXP\npattern). RLIKE and NOT RLIKE are synonyms for REGEXP and NOT REGEXP,\noriginally provided for mSQL compatibility.\n\nThe pattern need not be a literal string. For example, it can be specified as\na string expression or table column.\n\nNote: Because MariaDB uses the C escape syntax in strings (for example, \"\\n\"\nto represent the newline character), you must double any \"\\\" that you use in\nyour REGEXP strings.\n\nREGEXP is not case sensitive, except when used with binary strings.\n\nMariaDB 10.0.5 moved to the PCRE regex library - see PCRE Regular Expressions\nfor enhancements to REGEXP introduced in MariaDB 10.0.5.\n\nThe default_regex_flags variable addresses the remaining compatibilities\nbetween PCRE and the old regex library.\n\nExamples\n--------\n\nSELECT \'Monty!\' REGEXP \'m%y%%\';\n+-------------------------+\n| \'Monty!\' REGEXP \'m%y%%\' |\n+-------------------------+\n| 0 |\n+-------------------------+\n\nSELECT \'Monty!\' REGEXP \'.*\';\n+----------------------+\n| \'Monty!\' REGEXP \'.*\' |\n+----------------------+\n| 1 |\n+----------------------+\n\nSELECT \'new*\\n*line\' REGEXP \'new\\\\*.\\\\*line\';\n+---------------------------------------+\n| \'new*\\n*line\' REGEXP \'new\\\\*.\\\\*line\' |\n+---------------------------------------+\n| 1 |\n+---------------------------------------+\n\nSELECT \'a\' REGEXP \'A\', \'a\' REGEXP BINARY \'A\';\n+----------------+-----------------------+\n| \'a\' REGEXP \'A\' | \'a\' REGEXP BINARY \'A\' |\n+----------------+-----------------------+\n| 1 | 0 |\n+----------------+-----------------------+\n\nSELECT \'a\' REGEXP \'^[a-d]\';\n+---------------------+\n| \'a\' REGEXP \'^[a-d]\' |\n+---------------------+\n| 1 |\n+---------------------+\n\ndefault_regex_flags examples\n----------------------------\n\nMariaDB 10.0.11 introduced the default_regex_flags variable to address the\nremaining compatibilities between PCRE and the old regex library.\n\nThe default behaviour (multiline match is off)\n\nSELECT \'a\\nb\\nc\' RLIKE \'^b$\';\n+---------------------------+\n| \'(?m)a\\nb\\nc\' RLIKE \'^b$\' |\n+---------------------------+\n| 0 |\n+---------------------------+\n\nEnabling the multiline option using the PCRE option syntax:\n\nSELECT \'a\\nb\\nc\' RLIKE \'(?m)^b$\';\n+---------------------------+\n| \'a\\nb\\nc\' RLIKE \'(?m)^b$\' |\n+---------------------------+\n| 1 |\n+---------------------------+\n\nEnabling the multiline option using default_regex_flags\n\nSET default_regex_flags=\'MULTILINE\';\nSELECT \'a\\nb\\nc\' RLIKE \'^b$\';\n+-----------------------+\n| \'a\\nb\\nc\' RLIKE \'^b$\' |\n+-----------------------+\n| 1 |\n+-----------------------+\n\nURL: https://mariadb.com/kb/en/regexp/','','https://mariadb.com/kb/en/regexp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (628,36,'REGEXP_INSTR','Syntax\n------\n\nREGEXP_INSTR(subject, pattern)\n\nReturns the position of the first occurrence of the regular expression pattern\nin the string subject, or 0 if pattern was not found.\n\nThe positions start with 1 and are measured in characters (i.e. not in bytes),\nwhich is important for multi-byte character sets. You can cast a multi-byte\ncharacter set to BINARY to get offsets in bytes.\n\nThe function follows the case sensitivity rules of the effective collation.\nMatching is performed case insensitively for case insensitive collations, and\ncase sensitively for case sensitive collations and for binary data.\n\nThe collation case sensitivity can be overwritten using the (?i) and (?-i)\nPCRE flags.\n\nMariaDB uses the PCRE regular expression library for enhanced regular\nexpression performance, and REGEXP_INSTR was introduced as part of this\nenhancement.\n\nExamples\n--------\n\nSELECT REGEXP_INSTR(\'abc\',\'b\');\n-> 2\n\nSELECT REGEXP_INSTR(\'abc\',\'x\');\n-> 0\n\nSELECT REGEXP_INSTR(\'BJÖRN\',\'N\');\n-> 5\n\nCasting a multi-byte character set as BINARY to get offsets in bytes:\n\nSELECT REGEXP_INSTR(BINARY \'BJÖRN\',\'N\') AS cast_utf8_to_binary;\n-> 6\n\nCase sensitivity:\n\nSELECT REGEXP_INSTR(\'ABC\',\'b\');\n-> 2\n\nSELECT REGEXP_INSTR(\'ABC\' COLLATE utf8_bin,\'b\');\n-> 0\n\nSELECT REGEXP_INSTR(BINARY\'ABC\',\'b\');\n-> 0\n\nSELECT REGEXP_INSTR(\'ABC\',\'(?-i)b\');\n-> 0\n\nSELECT REGEXP_INSTR(\'ABC\' COLLATE utf8_bin,\'(?i)b\');\n-> 2\n\nURL: https://mariadb.com/kb/en/regexp_instr/','','https://mariadb.com/kb/en/regexp_instr/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (629,36,'REGEXP_REPLACE','Syntax\n------\n\nREGEXP_REPLACE(subject, pattern, replace)\n\nDescription\n-----------\n\nREGEXP_REPLACE returns the string subject with all occurrences of the regular\nexpression pattern replaced by the string replace. If no occurrences are\nfound, then subject is returned as is.\n\nThe replace string can have backreferences to the subexpressions in the form\n\\N, where N is a number from 1 to 9.\n\nThe function follows the case sensitivity rules of the effective collation.\nMatching is performed case insensitively for case insensitive collations, and\ncase sensitively for case sensitive collations and for binary data.\n\nThe collation case sensitivity can be overwritten using the (?i) and (?-i)\nPCRE flags.\n\nMariaDB uses the PCRE regular expression library for enhanced regular\nexpression performance, and REGEXP_REPLACE was introduced as part of this\nenhancement.\n\nThe default_regex_flags variable addresses the remaining compatibilities\nbetween PCRE and the old regex library.\n\nExamples\n--------\n\nSELECT REGEXP_REPLACE(\'ab12cd\',\'[0-9]\',\'\') AS remove_digits;\n-> abcd\n\nSELECT\nREGEXP_REPLACE(\'<html><head><title>title</title><body>body</body></htm>\',\n\'<.+?>\',\' \')\nAS strip_html;\n-> title body\n\nBackreferences to the subexpressions in the form \\N, where N is a number from\n1 to 9:\n\nSELECT REGEXP_REPLACE(\'James Bond\',\'^(.*) (.*)$\',\'\\\\2, \\\\1\') AS reorder_name;\n-> Bond, James\n\nCase insensitive and case sensitive matches:\n\nSELECT REGEXP_REPLACE(\'ABC\',\'b\',\'-\') AS case_insensitive;\n-> A-C\n\nSELECT REGEXP_REPLACE(\'ABC\' COLLATE utf8_bin,\'b\',\'-\') AS case_sensitive;\n-> ABC\n\nSELECT REGEXP_REPLACE(BINARY \'ABC\',\'b\',\'-\') AS binary_data;\n-> ABC\n\nOverwriting the collation case sensitivity using the (?i) and (?-i) PCRE flags.\n\nSELECT REGEXP_REPLACE(\'ABC\',\'(?-i)b\',\'-\') AS force_case_sensitive;\n-> ABC\n\nSELECT REGEXP_REPLACE(BINARY \'ABC\',\'(?i)b\',\'-\') AS force_case_insensitive;\n-> A-C\n\nURL: https://mariadb.com/kb/en/regexp_replace/','','https://mariadb.com/kb/en/regexp_replace/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (630,36,'REGEXP_SUBSTR','Syntax\n------\n\nREGEXP_SUBSTR(subject,pattern)\n\nDescription\n-----------\n\nReturns the part of the string subject that matches the regular expression\npattern, or an empty string if pattern was not found.\n\nThe function follows the case sensitivity rules of the effective collation.\nMatching is performed case insensitively for case insensitive collations, and\ncase sensitively for case sensitive collations and for binary data.\n\nThe collation case sensitivity can be overwritten using the (?i) and (?-i)\nPCRE flags.\n\nMariaDB uses the PCRE regular expression library for enhanced regular\nexpression performance, and REGEXP_SUBSTR was introduced as part of this\nenhancement.\n\nThe default_regex_flags variable addresses the remaining compatibilities\nbetween PCRE and the old regex library.\n\nExamples\n--------\n\nSELECT REGEXP_SUBSTR(\'ab12cd\',\'[0-9]+\');\n-> 12\n\nSELECT REGEXP_SUBSTR(\n \'See https://mariadb.org/en/foundation/ for details\',\n \'https?://[^/]*\');\n-> https://mariadb.org\n\nSELECT REGEXP_SUBSTR(\'ABC\',\'b\');\n-> B\n\nSELECT REGEXP_SUBSTR(\'ABC\' COLLATE utf8_bin,\'b\');\n->\n\nSELECT REGEXP_SUBSTR(BINARY\'ABC\',\'b\');\n->\n\nSELECT REGEXP_SUBSTR(\'ABC\',\'(?i)b\');\n-> B\n\nSELECT REGEXP_SUBSTR(\'ABC\' COLLATE utf8_bin,\'(?+i)b\');\n-> B\n\nURL: https://mariadb.com/kb/en/regexp_substr/','','https://mariadb.com/kb/en/regexp_substr/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (631,36,'ASCII','Syntax\n------\n\nASCII(str)\n\nDescription\n-----------\n\nReturns the numeric ASCII value of the leftmost character of the string\nargument. Returns 0 if the given string is empty and NULL if it is NULL.\n\nASCII() works for 8-bit characters.\n\nExamples\n--------\n\nSELECT ASCII(9);\n+----------+\n| ASCII(9) |\n+----------+\n| 57 |\n+----------+\n\nSELECT ASCII(\'9\');\n+------------+\n| ASCII(\'9\') |\n+------------+\n| 57 |\n+------------+\n\nSELECT ASCII(\'abc\');\n+--------------+\n| ASCII(\'abc\') |\n+--------------+\n| 97 |\n+--------------+\n\nURL: https://mariadb.com/kb/en/ascii/','','https://mariadb.com/kb/en/ascii/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (632,36,'BIN','Syntax\n------\n\nBIN(N)\n\nDescription\n-----------\n\nReturns a string representation of the binary value of the given longlong\n(that is, BIGINT) number. This is equivalent to CONV(N,10,2). The argument\nshould be positive. If it is a FLOAT, it will be truncated. Returns NULL if\nthe argument is NULL.\n\nExamples\n--------\n\nSELECT BIN(12);\n+---------+\n| BIN(12) |\n+---------+\n| 1100 |\n+---------+\n\nURL: https://mariadb.com/kb/en/bin/','','https://mariadb.com/kb/en/bin/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (633,36,'BINARY Operator','This page describes the BINARY operator. For details about the data type, see\nBinary Data Type.\n\nSyntax\n------\n\nBINARY\n\nDescription\n-----------\n\nThe BINARY operator casts the string following it to a binary string. This is\nan easy way to force a column comparison to be done byte by byte rather than\ncharacter by character. This causes the comparison to be case sensitive even\nif the column isn\'t defined as BINARY or BLOB.\n\nBINARY also causes trailing spaces to be significant.\n\nExamples\n--------\n\nSELECT \'a\' = \'A\';\n+-----------+\n| \'a\' = \'A\' |\n+-----------+\n| 1 |\n+-----------+\n\nSELECT BINARY \'a\' = \'A\';\n+------------------+\n| BINARY \'a\' = \'A\' |\n+------------------+\n| 0 |\n+------------------+\n\nSELECT \'a\' = \'a \';\n+------------+\n| \'a\' = \'a \' |\n+------------+\n| 1 |\n+------------+\n\nSELECT BINARY \'a\' = \'a \';\n+-------------------+\n| BINARY \'a\' = \'a \' |\n+-------------------+\n| 0 |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/binary-operator/','','https://mariadb.com/kb/en/binary-operator/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (634,36,'BIT_LENGTH','Syntax\n------\n\nBIT_LENGTH(str)\n\nDescription\n-----------\n\nReturns the length of the given string argument in bits. If the argument is\nnot a string, it will be converted to string. If the argument is NULL, it\nreturns NULL.\n\nExamples\n--------\n\nSELECT BIT_LENGTH(\'text\');\n+--------------------+\n| BIT_LENGTH(\'text\') |\n+--------------------+\n| 32 |\n+--------------------+\n\nSELECT BIT_LENGTH(\'\');\n+----------------+\n| BIT_LENGTH(\'\') |\n+----------------+\n| 0 |\n+----------------+\n\nCompatibility\n-------------\n\nPostgreSQL and Sybase support BIT_LENGTH().\n\nURL: https://mariadb.com/kb/en/bit_length/','','https://mariadb.com/kb/en/bit_length/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (635,36,'CAST','Syntax\n------\n\nCAST(expr AS type)\n\nDescription\n-----------\n\nThe CAST() function takes a value of one type and produces a value of another\ntype, similar to the CONVERT() function.\n\nThe type can be one of the following values:\n\n* BINARY\n* CHAR\n* DATE\n* DATETIME\n* DECIMAL[(M[,D])]\n* DOUBLE\n* FLOAT (from MariaDB 10.4.5)\n* INTEGER\nShort for SIGNED INTEGER\n\n* SIGNED [INTEGER]\n* UNSIGNED [INTEGER]\n* TIME\n* VARCHAR (in Oracle mode, from MariaDB 10.3)\n\nThe main difference between CAST and CONVERT() is that CONVERT(expr,type) is\nODBC syntax while CAST(expr as type) and CONVERT(... USING ...) are SQL92\nsyntax.\n\nIn MariaDB 10.4 and later, you can use the CAST() function with the INTERVAL\nkeyword.\n\nUntil MariaDB 5.5.31, X\'HHHH\', the standard SQL syntax for binary string\nliterals, erroneously worked in the same way as 0xHHHH. In 5.5.31 it was\nintentionally changed to behave as a string in all contexts (and never as a\nnumber).\n\nThis introduced an incompatibility with previous versions of MariaDB, and all\nversions of MySQL (see the example below).\n\nExamples\n--------\n\nSimple casts:\n\nSELECT CAST(\"abc\" AS BINARY);\nSELECT CAST(\"1\" AS UNSIGNED INTEGER);\nSELECT CAST(123 AS CHAR CHARACTER SET utf8)\n\nNote that when one casts to CHAR without specifying the character set, the\ncollation_connection character set collation will be used. When used with CHAR\nCHARACTER SET, the default collation for that character set will be used.\n\nSELECT COLLATION(CAST(123 AS CHAR));\n+------------------------------+\n| COLLATION(CAST(123 AS CHAR)) |\n+------------------------------+\n| latin1_swedish_ci |\n+------------------------------+\n\nSELECT COLLATION(CAST(123 AS CHAR CHARACTER SET utf8));\n+-------------------------------------------------+\n| COLLATION(CAST(123 AS CHAR CHARACTER SET utf8)) |\n+-------------------------------------------------+\n| utf8_general_ci |\n+-------------------------------------------------+\n\nIf you also want to change the collation, you have to use the COLLATE operator:\n\nSELECT COLLATION(CAST(123 AS CHAR CHARACTER SET utf8) \n COLLATE utf8_unicode_ci);\n+-------------------------------------------------------------------------+\n| COLLATION(CAST(123 AS CHAR CHARACTER SET utf8) COLLATE utf8_unicode_ci) |\n+-------------------------------------------------------------------------+\n| utf8_unicode_ci |\n+-------------------------------------------------------------------------+\n\nUsing CAST() to order an ENUM field as a CHAR rather than the internal\nnumerical value:\n\nCREATE TABLE enum_list (enum_field enum(\'c\',\'a\',\'b\'));\n\nINSERT INTO enum_list (enum_field) \nVALUES(\'c\'),(\'a\'),(\'c\'),(\'b\');\n\nSELECT * FROM enum_list \nORDER BY enum_field;\n+------------+\n| enum_field |\n+------------+\n| c |\n| c |\n| a |\n| b |\n+------------+\n\nSELECT * FROM enum_list \nORDER BY CAST(enum_field AS CHAR);\n+------------+\n| enum_field |\n+------------+\n| a |\n| b |\n| c |\n| c |\n+------------+\n\nFrom MariaDB 5.5.31, the following will trigger warnings, since x\'aa\' and\n\'X\'aa\' no longer behave as a number. Previously, and in all versions of MySQL,\nno warnings are triggered since they did erroneously behave as a number:\n\nSELECT CAST(0xAA AS UNSIGNED), CAST(x\'aa\' AS UNSIGNED), CAST(X\'aa\' AS\nUNSIGNED);\n+------------------------+-------------------------+-------------------------+\n| CAST(0xAA AS UNSIGNED) | CAST(x\'aa\' AS UNSIGNED) | CAST(X\'aa\' AS UNSIGNED) |\n+------------------------+-------------------------+-------------------------+\n| 170 | 0 | 0 |\n+------------------------+-------------------------+-------------------------+\n1 row in set, 2 warnings (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect INTEGER value: \'\\xAA\'\nWarning (Code 1292): Truncated incorrect INTEGER value: \'\\xAA\'\n\nCasting to intervals:\n\nSELECT CAST(2019-01-04 INTERVAL AS DAY_SECOND(2)) AS \"Cast\";\n\n+-------------+\n| Cast |\n+-------------+\n| 00:20:17.00 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/cast/','','https://mariadb.com/kb/en/cast/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (636,36,'CHAR Function','Syntax\n------\n\nCHAR(N,... [USING charset_name])\n\nDescription\n-----------\n\nCHAR() interprets each argument as an INT and returns a string consisting of\nthe characters given by the code values of those integers. NULL values are\nskipped. By default, CHAR() returns a binary string. To produce a string in a\ngiven character set, use the optional USING clause:\n\nSELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));\n+---------------------+--------------------------------+\n| CHARSET(CHAR(0x65)) | CHARSET(CHAR(0x65 USING utf8)) |\n+---------------------+--------------------------------+\n| binary | utf8 |\n+---------------------+--------------------------------+\n\nIf USING is given and the result string is illegal for the given character\nset, a warning is issued. Also, if strict SQL mode is enabled, the result from\nCHAR() becomes NULL.\n\nExamples\n--------\n\nSELECT CHAR(77,97,114,\'105\',97,\'68\',66);\n+----------------------------------+\n| CHAR(77,97,114,\'105\',97,\'68\',66) |\n+----------------------------------+\n| MariaDB |\n+----------------------------------+\n\nSELECT CHAR(77,77.3,\'77.3\');\n+----------------------+\n| CHAR(77,77.3,\'77.3\') |\n+----------------------+\n| MMM |\n+----------------------+\n1 row in set, 1 warning (0.00 sec)\n\nWarning (Code 1292): Truncated incorrect INTEGER value: \'77.3\'\n\nURL: https://mariadb.com/kb/en/char-function/','','https://mariadb.com/kb/en/char-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (637,36,'CHAR_LENGTH','Syntax\n------\n\nCHAR_LENGTH(str)\nCHARACTER_LENGTH(str)\n\nDescription\n-----------\n\nReturns the length of the given string argument, measured in characters. A\nmulti-byte character counts as a single character. This means that for a\nstring containing five two-byte characters, LENGTH() (or OCTET_LENGTH() in\nOracle mode) returns 10, whereas CHAR_LENGTH() returns 5. If the argument is\nNULL, it returns NULL.\n\nIf the argument is not a string value, it is converted into a string.\n\nIt is synonymous with the CHARACTER_LENGTH() function.\n\nExamples\n--------\n\nSELECT CHAR_LENGTH(\'MariaDB\');\n+------------------------+\n| CHAR_LENGTH(\'MariaDB\') |\n+------------------------+\n| 7 |\n+------------------------+\n\nWhen Oracle mode from MariaDB 10.3 is not set:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 2 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nIn Oracle mode from MariaDB 10.3:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 1 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nURL: https://mariadb.com/kb/en/char_length/','','https://mariadb.com/kb/en/char_length/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (638,36,'CHR','MariaDB starting with 10.3.1\n----------------------------\nThe CHR() function was introduced in MariaDB 10.3.1 to provide Oracle\ncompatibility\n\nSyntax\n------\n\nCHR(N)\n\nDescription\n-----------\n\nCHR() interprets each argument N as an integer and returns a VARCHAR(1) string\nconsisting of the character given by the code values of the integer. The\ncharacter set and collation of the string are set according to the values of\nthe character_set_database and collation_database system variables.\n\nCHR() is similar to the CHAR() function, but only accepts a single argument.\n\nCHR() is available in all sql_modes.\n\nExamples\n--------\n\nSELECT CHR(67);\n+---------+\n| CHR(67) |\n+---------+\n| C |\n+---------+\n\nSELECT CHR(\'67\');\n+-----------+\n| CHR(\'67\') |\n+-----------+\n| C |\n+-----------+\n\nSELECT CHR(\'C\');\n+----------+\n| CHR(\'C\') |\n+----------+\n| |\n+----------+\n1 row in set, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+---------+------+----------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------+\n| Warning | 1292 | Truncated incorrect INTEGER value: \'C\' |\n+---------+------+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/chr/','','https://mariadb.com/kb/en/chr/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (639,36,'CONCAT','Syntax\n------\n\nCONCAT(str1,str2,...)\n\nDescription\n-----------\n\nReturns the string that results from concatenating the arguments. May have one\nor more arguments. If all arguments are non-binary strings, the result is a\nnon-binary string. If the arguments include any binary strings, the result is\na binary string. A numeric argument is converted to its equivalent binary\nstring form; if you want to avoid that, you can use an explicit type cast, as\nin this example:\n\nSELECT CONCAT(CAST(int_col AS CHAR), char_col);\n\nCONCAT() returns NULL if any argument is NULL.\n\nA NULL parameter hides all information contained in other parameters from the\nresult. Sometimes this is not desirable; to avoid this, you can:\n\n* Use the CONCAT_WS() function with an empty separator, because that function\nis NULL-safe.\n* Use IFNULL() to turn NULLs into empty strings.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, CONCAT ignores NULL.\n\nExamples\n--------\n\nSELECT CONCAT(\'Ma\', \'ria\', \'DB\');\n+---------------------------+\n| CONCAT(\'Ma\', \'ria\', \'DB\') |\n+---------------------------+\n| MariaDB |\n+---------------------------+\n\nSELECT CONCAT(\'Ma\', \'ria\', NULL, \'DB\');\n+---------------------------------+\n| CONCAT(\'Ma\', \'ria\', NULL, \'DB\') |\n+---------------------------------+\n| NULL |\n+---------------------------------+\n\nSELECT CONCAT(42.0);\n+--------------+\n| CONCAT(42.0) |\n+--------------+\n| 42.0 |\n+--------------+\n\nUsing IFNULL() to handle NULLs:\n\nSELECT CONCAT(\'The value of @v is: \', IFNULL(@v, \'\'));\n+------------------------------------------------+\n| CONCAT(\'The value of @v is: \', IFNULL(@v, \'\')) |\n+------------------------------------------------+\n| The value of @v is: |\n+------------------------------------------------+\n\nIn Oracle mode, from MariaDB 10.3:\n\nSELECT CONCAT(\'Ma\', \'ria\', NULL, \'DB\');\n+---------------------------------+\n| CONCAT(\'Ma\', \'ria\', NULL, \'DB\') |\n+---------------------------------+\n| MariaDB |\n+---------------------------------+\n\nURL: https://mariadb.com/kb/en/concat/','','https://mariadb.com/kb/en/concat/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (640,36,'CONCAT_WS','Syntax\n------\n\nCONCAT_WS(separator,str1,str2,...)\n\nDescription\n-----------\n\nCONCAT_WS() stands for Concatenate With Separator and is a special form of\nCONCAT(). The first argument is the separator for the rest of the arguments.\nThe separator is added between the strings to be concatenated. The separator\ncan be a string, as can the rest of the arguments.\n\nIf the separator is NULL, the result is NULL; all other NULL values are\nskipped. This makes CONCAT_WS() suitable when you want to concatenate some\nvalues and avoid losing all information if one of them is NULL.\n\nExamples\n--------\n\nSELECT CONCAT_WS(\',\',\'First name\',\'Second name\',\'Last Name\');\n+-------------------------------------------------------+\n| CONCAT_WS(\',\',\'First name\',\'Second name\',\'Last Name\') |\n+-------------------------------------------------------+\n| First name,Second name,Last Name |\n+-------------------------------------------------------+\n\nSELECT CONCAT_WS(\'-\',\'Floor\',NULL,\'Room\');\n+------------------------------------+\n| CONCAT_WS(\'-\',\'Floor\',NULL,\'Room\') |\n+------------------------------------+\n| Floor-Room |\n+------------------------------------+\n\nIn some cases, remember to include a space in the separator string:\n\nSET @a = \'gnu\', @b = \'penguin\', @c = \'sea lion\';\nQuery OK, 0 rows affected (0.00 sec)\n\nSELECT CONCAT_WS(\', \', @a, @b, @c);\n+-----------------------------+\n| CONCAT_WS(\', \', @a, @b, @c) |\n+-----------------------------+\n| gnu, penguin, sea lion |\n+-----------------------------+\n\nUsing CONCAT_WS() to handle NULLs:\n\nSET @a = \'a\', @b = NULL, @c = \'c\';\n\nSELECT CONCAT_WS(\'\', @a, @b, @c);\n+---------------------------+\n| CONCAT_WS(\'\', @a, @b, @c) |\n+---------------------------+\n| ac |\n+---------------------------+\n\nURL: https://mariadb.com/kb/en/concat_ws/','','https://mariadb.com/kb/en/concat_ws/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (641,36,'CONVERT','Syntax\n------\n\nCONVERT(expr,type), CONVERT(expr USING transcoding_name)\n\nDescription\n-----------\n\nThe CONVERT() and CAST() functions take a value of one type and produce a\nvalue of another type.\n\nThe type can be one of the following values:\n\n* BINARY\n* CHAR\n* DATE\n* DATETIME\n* DECIMAL[(M[,D])]\n* DOUBLE\n* FLOAT (from MariaDB 10.4.5)\n* INTEGER\nShort for SIGNED INTEGER\n\n* SIGNED [INTEGER]\n* UNSIGNED [INTEGER]\n* TIME\n* VARCHAR (in Oracle mode, from MariaDB 10.3)\n\nNote that in MariaDB, INT and INTEGER are the same thing.\n\nBINARY produces a string with the BINARY data type. If the optional length is\ngiven, BINARY(N) causes the cast to use no more than N bytes of the argument.\nValues shorter than the given number in bytes are padded with 0x00 bytes to\nmake them equal the length value.\n\nCHAR(N) causes the cast to use no more than the number of characters given in\nthe argument.\n\nThe main difference between the CAST() and CONVERT() is that\nCONVERT(expr,type) is ODBC syntax while CAST(expr as type) and CONVERT(...\nUSING ...) are SQL92 syntax.\n\nCONVERT() with USING is used to convert data between different character sets.\nIn MariaDB, transcoding names are the same as the corresponding character set\nnames. For example, this statement converts the string \'abc\' in the default\ncharacter set to the corresponding string in the utf8 character set:\n\nSELECT CONVERT(\'abc\' USING utf8);\n\nExamples\n--------\n\nSELECT enum_col FROM tbl_name \nORDER BY CAST(enum_col AS CHAR);\n\nConverting a BINARY to string to permit the LOWER function to work:\n\nSET @x = \'AardVark\';\n\nSET @x = BINARY \'AardVark\';\n\nSELECT LOWER(@x), LOWER(CONVERT (@x USING latin1));\n+-----------+----------------------------------+\n| LOWER(@x) | LOWER(CONVERT (@x USING latin1)) |\n+-----------+----------------------------------+\n| AardVark | aardvark |\n+-----------+----------------------------------+\n\nURL: https://mariadb.com/kb/en/convert/','','https://mariadb.com/kb/en/convert/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (642,36,'ELT','Syntax\n------\n\nELT(N, str1[, str2, str3,...])\n\nDescription\n-----------\n\nTakes a numeric argument and a series of string arguments. Returns the string\nthat corresponds to the given numeric position. For instance, it returns str1\nif N is 1, str2 if N is 2, and so on. If the numeric argument is a FLOAT,\nMariaDB rounds it to the nearest INTEGER. If the numeric argument is less than\n1, greater than the total number of arguments, or not a number, ELT() returns\nNULL. It must have at least two arguments.\n\nIt is complementary to the FIELD() function.\n\nExamples\n--------\n\nSELECT ELT(1, \'ej\', \'Heja\', \'hej\', \'foo\');\n+------------------------------------+\n| ELT(1, \'ej\', \'Heja\', \'hej\', \'foo\') |\n+------------------------------------+\n| ej |\n+------------------------------------+\n\nSELECT ELT(4, \'ej\', \'Heja\', \'hej\', \'foo\');\n+------------------------------------+\n| ELT(4, \'ej\', \'Heja\', \'hej\', \'foo\') |\n+------------------------------------+\n| foo |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/elt/','','https://mariadb.com/kb/en/elt/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (643,36,'EXPORT_SET','Syntax\n------\n\nEXPORT_SET(bits, on, off[, separator[, number_of_bits]])\n\nDescription\n-----------\n\nTakes a minimum of three arguments. Returns a string where each bit in the\ngiven bits argument is returned, with the string values given for on and off.\n\nBits are examined from right to left, (from low-order to high-order bits).\nStrings are added to the result from left to right, separated by a separator\nstring (defaults as \',\'). You can optionally limit the number of bits the\nEXPORT_SET() function examines using the number_of_bits option.\n\nIf any of the arguments are set as NULL, the function returns NULL.\n\nExamples\n--------\n\nSELECT EXPORT_SET(5,\'Y\',\'N\',\',\',4);\n+-----------------------------+\n| EXPORT_SET(5,\'Y\',\'N\',\',\',4) |\n+-----------------------------+\n| Y,N,Y,N |\n+-----------------------------+\n\nSELECT EXPORT_SET(6,\'1\',\'0\',\',\',10);\n+------------------------------+\n| EXPORT_SET(6,\'1\',\'0\',\',\',10) |\n+------------------------------+\n| 0,1,1,0,0,0,0,0,0,0 |\n+------------------------------+\n\nURL: https://mariadb.com/kb/en/export_set/','','https://mariadb.com/kb/en/export_set/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (644,36,'EXTRACTVALUE','Syntax\n------\n\nEXTRACTVALUE(xml_frag, xpath_expr)\n\nDescription\n-----------\n\nThe EXTRACTVALUE() function takes two string arguments: a fragment of XML\nmarkup and an XPath expression, (also known as a locator). It returns the text\n(That is, CDDATA), of the first text node which is a child of the element or\nelements matching the XPath expression.\n\nIn cases where a valid XPath expression does not match any text nodes in a\nvalid XML fragment, (including the implicit /text() expression), the\nEXTRACTVALUE() function returns an empty string.\n\nInvalid Arguments\n-----------------\n\nWhen either the XML fragment or the XPath expression is NULL, the\nEXTRACTVALUE() function returns NULL. When the XML fragment is invalid, it\nraises a warning Code 1525:\n\nWarning (Code 1525): Incorrect XML value: \'parse error at line 1 pos 11:\nunexpected END-OF-INPUT\'\n\nWhen the XPath value is invalid, it generates an Error 1105:\n\nERROR 1105 (HY000): XPATH syntax error: \')\'\n\nExplicit text() Expressions\n---------------------------\n\nThis function is the equivalent of performing a match using the XPath\nexpression after appending /text(). In other words:\n\nSELECT\n EXTRACTVALUE(\'<cases><case>example</case></cases>\', \'/cases/case\')\n AS \'Base Example\',\n EXTRACTVALUE(\'<cases><case>example</case></cases>\', \'/cases/case/text()\')\n AS \'text() Example\';\n+--------------+----------------+\n| Base Example | text() Example |\n+--------------+----------------+\n| example | example |\n+--------------+----------------+\n\nCount Matches\n-------------\n\nWhen EXTRACTVALUE() returns multiple matches, it returns the content of the\nfirst child text node of each matching element, in the matched order, as a\nsingle, space-delimited string.\n\nBy design, the EXTRACTVALUE() function makes no distinction between a match on\nan empty element and no match at all. If you need to determine whether no\nmatching element was found in the XML fragment or if an element was found that\ncontained no child text nodes, use the XPath count() function.\n\nFor instance, when looking for a value that exists, but contains no child text\nnodes, you would get a count of the number of matching instances:\n\nSELECT\n EXTRACTVALUE(\'<cases><case/></cases>\', \'/cases/case\')\n AS \'Empty Example\',\n EXTRACTVALUE(\'<cases><case/></cases>\', \'count(/cases/case)\')\n AS \'count() Example\';\n+---------------+-----------------+\n| Empty Example | count() Example |\n+---------------+-----------------+\n| | 1 |\n+---------------+-----------------+\n\nAlternatively, when looking for a value that doesn\'t exist, count() returns 0.\n\nSELECT\n EXTRACTVALUE(\'<cases><case/></cases>\', \'/cases/person\')\n AS \'No Match Example\',\n EXTRACTVALUE(\'<cases><case/></cases>\', \'count(/cases/person)\')\n AS \'count() Example\';\n+------------------+-----------------+\n| No Match Example | count() Example |\n+------------------+-----------------+\n| | 0|\n+------------------+-----------------+\n\nMatches\n-------\n\nImportant: The EXTRACTVALUE() function only returns CDDATA. It does not return\ntags that the element might contain or the text that these child elements\ncontain.\n\nSELECT\n\nEXTRACTVALUE(\'<cases><case>Person<email>x@example.com</email></case></cases>\',\n\'/cases\')\n AS Case;\n+--------+\n| Case |\n+--------+\n| Person |\n+--------+\n\nNote, in the above example, while the XPath expression matches to the parent\n<case> instance, it does not return the contained <email> tag or its content.\n\nExamples\n--------\n\nSELECT\n ExtractValue(\'<a>ccc<b>ddd</b></a>\', \'/a\') AS val1,\n ExtractValue(\'<a>ccc<b>ddd</b></a>\', \'/a/b\') AS val2,\n ExtractValue(\'<a>ccc<b>ddd</b></a>\', \'//b\') AS val3,\n ExtractValue(\'<a>ccc<b>ddd</b></a>\', \'/b\') AS val4,\n ExtractValue(\'<a>ccc<b>ddd</b><b>eee</b></a>\', \'//b\') AS val5;\n+------+------+------+------+---------+\n| val1 | val2 | val3 | val4 | val5 |\n+------+------+------+------+---------+\n| ccc | ddd | ddd | | ddd eee |\n+------+------+------+------+---------+\n\nURL: https://mariadb.com/kb/en/extractvalue/','','https://mariadb.com/kb/en/extractvalue/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (645,36,'FIELD','Syntax\n------\n\nFIELD(pattern, str1[,str2,...])\n\nDescription\n-----------\n\nReturns the index position of the string or number matching the given pattern.\nReturns 0 in the event that none of the arguments match the pattern. Raises an\nError 1582 if not given at least two arguments.\n\nWhen all arguments given to the FIELD() function are strings, they are treated\nas case-insensitive. When all the arguments are numbers, they are treated as\nnumbers. Otherwise, they are treated as doubles.\n\nIf the given pattern occurs more than once, the FIELD() function only returns\nthe index of the first instance. If the given pattern is NULL, the function\nreturns 0, as a NULL pattern always fails to match.\n\nThis function is complementary to the ELT() function.\n\nExamples\n--------\n\nSELECT FIELD(\'ej\', \'Hej\', \'ej\', \'Heja\', \'hej\', \'foo\') \n AS \'Field Results\';\n+---------------+\n| Field Results | \n+---------------+\n| 2 |\n+---------------+\n\nSELECT FIELD(\'fo\', \'Hej\', \'ej\', \'Heja\', \'hej\', \'foo\')\n AS \'Field Results\';\n+---------------+\n| Field Results | \n+---------------+\n| 0 |\n+---------------+\n\nSELECT FIELD(1, 2, 3, 4, 5, 1) AS \'Field Results\';\n+---------------+\n| Field Results |\n+---------------+\n| 5 |\n+---------------+\n\nSELECT FIELD(NULL, 2, 3) AS \'Field Results\';\n+---------------+\n| Field Results |\n+---------------+\n| 0 |\n+---------------+\n\nSELECT FIELD(\'fail\') AS \'Field Results\';\nError 1582 (42000): Incorrect parameter count in call\nto native function \'field\'\n\nURL: https://mariadb.com/kb/en/field/','','https://mariadb.com/kb/en/field/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (646,36,'FIND_IN_SET','Syntax\n------\n\nFIND_IN_SET(pattern, strlist)\n\nDescription\n-----------\n\nReturns the index position where the given pattern occurs in a string list.\nThe first argument is the pattern you want to search for. The second argument\nis a string containing comma-separated variables. If the second argument is of\nthe SET data-type, the function is optimized to use bit arithmetic.\n\nIf the pattern does not occur in the string list or if the string list is an\nempty string, the function returns 0. If either argument is NULL, the function\nreturns NULL. The function does not return the correct result if the pattern\ncontains a comma (\",\") character.\n\nExamples\n--------\n\nSELECT FIND_IN_SET(\'b\',\'a,b,c,d\') AS \"Found Results\";\n+---------------+\n| Found Results |\n+---------------+\n| 2 |\n+---------------+\n\nURL: https://mariadb.com/kb/en/find_in_set/','','https://mariadb.com/kb/en/find_in_set/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (647,36,'FORMAT','Syntax\n------\n\nFORMAT(num, decimal_position[, locale])\n\nDescription\n-----------\n\nFormats the given number for display as a string, adding separators to\nappropriate position and rounding the results to the given decimal position.\nFor instance, it would format 15233.345 to 15,233.35.\n\nIf the given decimal position is 0, it rounds to return no decimal point or\nfractional part. You can optionally specify a locale value to format numbers\nto the pattern appropriate for the given region.\n\nExamples\n--------\n\nSELECT FORMAT(1234567890.09876543210, 4) AS \'Format\';\n+--------------------+\n| Format |\n+--------------------+\n| 1,234,567,890.0988 |\n+--------------------+\n\nSELECT FORMAT(1234567.89, 4) AS \'Format\';\n+----------------+\n| Format |\n+----------------+\n| 1,234,567.8900 |\n+----------------+\n\nSELECT FORMAT(1234567.89, 0) AS \'Format\';\n+-----------+\n| Format |\n+-----------+\n| 1,234,568 |\n+-----------+\n\nSELECT FORMAT(123456789,2,\'rm_CH\') AS \'Format\';\n+----------------+\n| Format |\n+----------------+\n| 123\'456\'789,00 |\n+----------------+\n\nURL: https://mariadb.com/kb/en/format/','','https://mariadb.com/kb/en/format/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (648,36,'FROM_BASE64','Syntax\n------\n\nFROM_BASE64(str)\n\nDescription\n-----------\n\nDecodes the given base-64 encode string, returning the result as a binary\nstring. Returns NULL if the given string is NULL or if it\'s invalid.\n\nIt is the reverse of the TO_BASE64 function.\n\nThere are numerous methods to base-64 encode a string. MariaDB uses the\nfollowing:\n\n* It encodes alphabet value 64 as \'+\'.\n* It encodes alphabet value 63 as \'/\'.\n* It codes output in groups of four printable characters. Each three byte of\ndata encoded uses four characters. If the final group is incomplete, it pads\nthe difference with the \'=\' character.\n* It divides long output, adding a new line very 76 characters.\n* In decoding, it recognizes and ignores newlines, carriage returns, tabs and\nspace whitespace characters.\n\nSELECT TO_BASE64(\'Maria\') AS \'Input\';\n+-----------+\n| Input |\n+-----------+\n| TWFyaWE= |\n+-----------+\n\nSELECT FROM_BASE64(\'TWFyaWE=\') AS \'Output\';\n+--------+\n| Output |\n+--------+\n| Maria |\n+--------+\n\nURL: https://mariadb.com/kb/en/from_base64/','','https://mariadb.com/kb/en/from_base64/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (649,36,'HEX','Syntax\n------\n\nHEX(N_or_S)\n\nDescription\n-----------\n\nIf N_or_S is a number, returns a string representation of the hexadecimal\nvalue of N, where N is a longlong (BIGINT) number. This is equivalent to\nCONV(N,10,16).\n\nIf N_or_S is a string, returns a hexadecimal string representation of N_or_S\nwhere each byte of each character in N_or_S is converted to two hexadecimal\ndigits. If N_or_S is NULL, returns NULL. The inverse of this operation is\nperformed by the UNHEX() function.\n\nMariaDB starting with 10.5.0\n----------------------------\nHEX() with an INET6 argument returns a hexadecimal representation of the\nunderlying 16-byte binary string.\n\nExamples\n--------\n\nSELECT HEX(255);\n+----------+\n| HEX(255) |\n+----------+\n| FF |\n+----------+\n\nSELECT 0x4D617269614442;\n+------------------+\n| 0x4D617269614442 |\n+------------------+\n| MariaDB |\n+------------------+\n\nSELECT HEX(\'MariaDB\');\n+----------------+\n| HEX(\'MariaDB\') |\n+----------------+\n| 4D617269614442 |\n+----------------+\n\nFrom MariaDB 10.5.0:\n\nSELECT HEX(CAST(\'2001:db8::ff00:42:8329\' AS INET6));\n+----------------------------------------------+\n| HEX(CAST(\'2001:db8::ff00:42:8329\' AS INET6)) |\n+----------------------------------------------+\n| 20010DB8000000000000FF0000428329 |\n+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/hex/','','https://mariadb.com/kb/en/hex/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (650,36,'INSTR','Syntax\n------\n\nINSTR(str,substr)\n\nDescription\n-----------\n\nReturns the position of the first occurrence of substring substr in string\nstr. This is the same as the two-argument form of LOCATE(), except that the\norder of the arguments is reversed.\n\nINSTR() performs a case-insensitive search.\n\nIf any argument is NULL, returns NULL.\n\nExamples\n--------\n\nSELECT INSTR(\'foobarbar\', \'bar\');\n+---------------------------+\n| INSTR(\'foobarbar\', \'bar\') |\n+---------------------------+\n| 4 |\n+---------------------------+\n\nSELECT INSTR(\'My\', \'Maria\');\n+----------------------+\n| INSTR(\'My\', \'Maria\') |\n+----------------------+\n| 0 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/instr/','','https://mariadb.com/kb/en/instr/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (651,36,'LCASE','Syntax\n------\n\nLCASE(str)\n\nDescription\n-----------\n\nLCASE() is a synonym for LOWER().\n\nURL: https://mariadb.com/kb/en/lcase/','','https://mariadb.com/kb/en/lcase/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (652,36,'LEFT','Syntax\n------\n\nLEFT(str,len)\n\nDescription\n-----------\n\nReturns the leftmost len characters from the string str, or NULL if any\nargument is NULL.\n\nExamples\n--------\n\nSELECT LEFT(\'MariaDB\', 5);\n+--------------------+\n| LEFT(\'MariaDB\', 5) |\n+--------------------+\n| Maria |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/left/','','https://mariadb.com/kb/en/left/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (653,36,'INSERT Function','Syntax\n------\n\nINSERT(str,pos,len,newstr)\n\nDescription\n-----------\n\nReturns the string str, with the substring beginning at position pos and len\ncharacters long replaced by the string newstr. Returns the original string if\npos is not within the length of the string. Replaces the rest of the string\nfrom position pos if len is not within the length of the rest of the string.\nReturns NULL if any argument is NULL.\n\nExamples\n--------\n\nSELECT INSERT(\'Quadratic\', 3, 4, \'What\');\n+-----------------------------------+\n| INSERT(\'Quadratic\', 3, 4, \'What\') |\n+-----------------------------------+\n| QuWhattic |\n+-----------------------------------+\n\nSELECT INSERT(\'Quadratic\', -1, 4, \'What\');\n+------------------------------------+\n| INSERT(\'Quadratic\', -1, 4, \'What\') |\n+------------------------------------+\n| Quadratic |\n+------------------------------------+\n\nSELECT INSERT(\'Quadratic\', 3, 100, \'What\');\n+-------------------------------------+\n| INSERT(\'Quadratic\', 3, 100, \'What\') |\n+-------------------------------------+\n| QuWhat |\n+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/insert-function/','','https://mariadb.com/kb/en/insert-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (654,36,'LENGTH','Syntax\n------\n\nLENGTH(str)\n\nDescription\n-----------\n\nReturns the length of the string str.\n\nIn the default mode, when Oracle mode from MariaDB 10.3 is not set, the length\nis measured in bytes. In this case, a multi-byte character counts as multiple\nbytes. This means that for a string containing five two-byte characters,\nLENGTH() returns 10, whereas CHAR_LENGTH() returns 5.\n\nWhen running Oracle mode from MariaDB 10.3, the length is measured in\ncharacters, and LENGTH is a synonym for CHAR_LENGTH().\n\nIf str is not a string value, it is converted into a string. If str is NULL,\nthe function returns NULL.\n\nExamples\n--------\n\nSELECT LENGTH(\'MariaDB\');\n+-------------------+\n| LENGTH(\'MariaDB\') |\n+-------------------+\n| 7 |\n+-------------------+\n\nWhen Oracle mode from MariaDB 10.3 is not set:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 2 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nIn Oracle mode from MariaDB 10.3:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 1 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nURL: https://mariadb.com/kb/en/length/','','https://mariadb.com/kb/en/length/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (655,36,'LENGTHB','MariaDB starting with 10.3.1\n----------------------------\nIntroduced in MariaDB 10.3.1 as part of the Oracle compatibility enhancements.\n\nSyntax\n------\n\nLENGTHB(str)\n\nDescription\n-----------\n\nLENGTHB() returns the length of the given string, in bytes. When Oracle mode\nis not set, this is a synonym for LENGTH.\n\nA multi-byte character counts as multiple bytes. This means that for a string\ncontaining five two-byte characters, LENGTHB() returns 10, whereas\nCHAR_LENGTH() returns 5.\n\nIf str is not a string value, it is converted into a string. If str is NULL,\nthe function returns NULL.\n\nExamples\n--------\n\nWhen Oracle mode from MariaDB 10.3 is not set:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 2 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nIn Oracle mode from MariaDB 10.3:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 1 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nURL: https://mariadb.com/kb/en/lengthb/','','https://mariadb.com/kb/en/lengthb/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (656,36,'LIKE','Syntax\n------\n\nexpr LIKE pat [ESCAPE \'escape_char\']\nexpr NOT LIKE pat [ESCAPE \'escape_char\']\n\nDescription\n-----------\n\nTests whether expr matches the pattern pat. Returns either 1 (TRUE) or 0\n(FALSE). Both expr and pat may be any valid expression and are evaluated to\nstrings. Patterns may use the following wildcard characters:\n\n* % matches any number of characters, including zero.\n* _ matches any single character.\n\nUse NOT LIKE to test if a string does not match a pattern. This is equivalent\nto using the NOT operator on the entire LIKE expression.\n\nIf either the expression or the pattern is NULL, the result is NULL.\n\nLIKE performs case-insensitive substring matches if the collation for the\nexpression and pattern is case-insensitive. For case-sensitive matches,\ndeclare either argument to use a binary collation using COLLATE, or coerce\neither of them to a BINARY string using CAST. Use SHOW COLLATION to get a list\nof available collations. Collations ending in _bin are case-sensitive.\n\nNumeric arguments are coerced to binary strings.\n\nThe _ wildcard matches a single character, not byte. It will only match a\nmulti-byte character if it is valid in the expression\'s character set. For\nexample, _ will match _utf8\"€\", but it will not match _latin1\"€\" because the\nEuro sign is not a valid latin1 character. If necessary, use CONVERT to use\nthe expression in a different character set.\n\nIf you need to match the characters _ or %, you must escape them. By default,\nyou can prefix the wildcard characters the backslash character \\ to escape\nthem. The backslash is used both to encode special characters like newlines\nwhen a string is parsed as well as to escape wildcards in a pattern after\nparsing. Thus, to match an actual backslash, you sometimes need to\ndouble-escape it as \"\\\\\\\\\".\n\nTo avoid difficulties with the backslash character, you can change the\nwildcard escape character using ESCAPE in a LIKE expression. The argument to\nESCAPE must be a single-character string.\n\nExamples\n--------\n\nSelect the days that begin with \"T\":\n\nCREATE TABLE t1 (d VARCHAR(16));\nINSERT INTO t1 VALUES \n (\"Monday\"), (\"Tuesday\"), (\"Wednesday\"),\n (\"Thursday\"), (\"Friday\"), (\"Saturday\"), (\"Sunday\");\nSELECT * FROM t1 WHERE d LIKE \"T%\";\n\nSELECT * FROM t1 WHERE d LIKE \"T%\";\n+----------+\n| d |\n+----------+\n| Tuesday |\n| Thursday |\n+----------+\n\nSelect the days that contain the substring \"es\":\n\nSELECT * FROM t1 WHERE d LIKE \"%es%\";\n\nSELECT * FROM t1 WHERE d LIKE \"%es%\";\n+-----------+\n| d |\n+-----------+\n| Tuesday |\n| Wednesday |\n+-----------+\n\nSelect the six-character day names:\n\nSELECT * FROM t1 WHERE d like \"___day\";\n\nSELECT * FROM t1 WHERE d like \"___day\";\n+---------+\n| d |\n+---------+\n| Monday |\n| Friday |\n| Sunday |\n+---------+\n\nWith the default collations, LIKE is case-insensitive:\n\nSELECT * FROM t1 where d like \"t%\";\n\nSELECT * FROM t1 where d like \"t%\";\n+----------+\n| d |\n+----------+\n| Tuesday |\n| Thursday |\n+----------+\n\nUse COLLATE to specify a binary collation, forcing case-sensitive matches:\n\nSELECT * FROM t1 WHERE d like \"t%\" COLLATE latin1_bin;\n\nSELECT * FROM t1 WHERE d like \"t%\" COLLATE latin1_bin;\nEmpty set (0.00 sec)\n\nYou can include functions and operators in the expression to match. Select\ndates based on their day name:\n\nCREATE TABLE t2 (d DATETIME);\nINSERT INTO t2 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\nSELECT * FROM t2 WHERE DAYNAME(d) LIKE \"T%\";\n\nSELECT * FROM t2 WHERE DAYNAME(d) LIKE \"T%\";\n+------------------+\n| d |\n+------------------+\n| 2007-01-30 21:31 |\n| 2011-04-21 12:34 |\n| 2004-10-07 11:19 |\n+------------------+\n3 rows in set, 7 warnings (0.00 sec)\n\nOptimizing LIKE\n---------------\n\n* MariaDB can use indexes for LIKE on string columns in the case where the\nLIKE doesn\'t start with % or _.\n* Starting from MariaDB 10.0, one can set the\noptimizer_use_condition_selectivity variable to 5. If this is done, then the\noptimizer will read optimizer_selectivity_sampling_limit rows to calculate the\nselectivity of the LIKE expression before starting to calculate the query\nplan. This can help speed up some LIKE queries by providing the optimizer with\nmore information about your data.\n\nURL: https://mariadb.com/kb/en/like/','','https://mariadb.com/kb/en/like/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (657,36,'LOCATE','Syntax\n------\n\nLOCATE(substr,str), LOCATE(substr,str,pos)\n\nDescription\n-----------\n\nThe first syntax returns the position of the first occurrence of substring\nsubstr in string str. The second syntax returns the position of the first\noccurrence of substring substr in string str, starting at position pos.\nReturns 0 if substr is not in str.\n\nLOCATE() performs a case-insensitive search.\n\nIf any argument is NULL, returns NULL.\n\nINSTR() is the same as the two-argument form of LOCATE(), except that the\norder of the arguments is reversed.\n\nExamples\n--------\n\nSELECT LOCATE(\'bar\', \'foobarbar\');\n+----------------------------+\n| LOCATE(\'bar\', \'foobarbar\') |\n+----------------------------+\n| 4 |\n+----------------------------+\n\nSELECT LOCATE(\'My\', \'Maria\');\n+-----------------------+\n| LOCATE(\'My\', \'Maria\') |\n+-----------------------+\n| 0 |\n+-----------------------+\n\nSELECT LOCATE(\'bar\', \'foobarbar\', 5);\n+-------------------------------+\n| LOCATE(\'bar\', \'foobarbar\', 5) |\n+-------------------------------+\n| 7 |\n+-------------------------------+\n\nURL: https://mariadb.com/kb/en/locate/','','https://mariadb.com/kb/en/locate/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (658,36,'LOWER','Syntax\n------\n\nLOWER(str)\n\nDescription\n-----------\n\nReturns the string str with all characters changed to lowercase according to\nthe current character set mapping. The default is latin1 (cp1252 West\nEuropean).\n\nExamples\n--------\n\nSELECT LOWER(\'QUADRATICALLY\');\n+------------------------+\n| LOWER(\'QUADRATICALLY\') |\n+------------------------+\n| quadratically |\n+------------------------+\n\nLOWER() (and UPPER()) are ineffective when applied to binary strings (BINARY,\nVARBINARY, BLOB). To perform lettercase conversion, CONVERT the string to a\nnon-binary string:\n\nSET @str = BINARY \'North Carolina\';\n\nSELECT LOWER(@str), LOWER(CONVERT(@str USING latin1));\n+----------------+-----------------------------------+\n| LOWER(@str) | LOWER(CONVERT(@str USING latin1)) |\n+----------------+-----------------------------------+\n| North Carolina | north carolina |\n+----------------+-----------------------------------+\n\nURL: https://mariadb.com/kb/en/lower/','','https://mariadb.com/kb/en/lower/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (659,36,'LPAD','Syntax\n------\n\nLPAD(str, len [,padstr])\n\nDescription\n-----------\n\nReturns the string str, left-padded with the string padstr to a length of len\ncharacters. If str is longer than len, the return value is shortened to len\ncharacters. If padstr is omitted, the LPAD function pads spaces.\n\nPrior to MariaDB 10.3.1, the padstr parameter was mandatory.\n\nReturns NULL if given a NULL argument. If the result is empty (zero length),\nreturns either an empty string or, from MariaDB 10.3.6 with SQL_MODE=Oracle,\nNULL.\n\nThe Oracle mode version of the function can be accessed outside of Oracle mode\nby using LPAD_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT LPAD(\'hello\',10,\'.\');\n+----------------------+\n| LPAD(\'hello\',10,\'.\') |\n+----------------------+\n| .....hello |\n+----------------------+\n\nSELECT LPAD(\'hello\',2,\'.\');\n+---------------------+\n| LPAD(\'hello\',2,\'.\') |\n+---------------------+\n| he |\n+---------------------+\n\nFrom MariaDB 10.3.1, with the pad string defaulting to space.\n\nSELECT LPAD(\'hello\',10);\n+------------------+\n| LPAD(\'hello\',10) |\n+------------------+\n| hello |\n+------------------+\n\nOracle mode version from MariaDB 10.3.6:\n\nSELECT LPAD(\'\',0),LPAD_ORACLE(\'\',0);\n+------------+-------------------+\n| LPAD(\'\',0) | LPAD_ORACLE(\'\',0) |\n+------------+-------------------+\n| | NULL |\n+------------+-------------------+\n\nURL: https://mariadb.com/kb/en/lpad/','','https://mariadb.com/kb/en/lpad/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (660,36,'LTRIM','Syntax\n------\n\nLTRIM(str)\n\nDescription\n-----------\n\nReturns the string str with leading space characters removed.\n\nReturns NULL if given a NULL argument. If the result is empty, returns either\nan empty string, or, from MariaDB 10.3.6 with SQL_MODE=Oracle, NULL.\n\nThe Oracle mode version of the function can be accessed outside of Oracle mode\nby using LTRIM_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT QUOTE(LTRIM(\' MariaDB \'));\n+-------------------------------+\n| QUOTE(LTRIM(\' MariaDB \')) |\n+-------------------------------+\n| \'MariaDB \' |\n+-------------------------------+\n\nOracle mode version from MariaDB 10.3.6:\n\nSELECT LTRIM(\'\'),LTRIM_ORACLE(\'\');\n+-----------+------------------+\n| LTRIM(\'\') | LTRIM_ORACLE(\'\') |\n+-----------+------------------+\n| | NULL |\n+-----------+------------------+\n\nURL: https://mariadb.com/kb/en/ltrim/','','https://mariadb.com/kb/en/ltrim/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (661,36,'MAKE_SET','Syntax\n------\n\nMAKE_SET(bits,str1,str2,...)\n\nDescription\n-----------\n\nReturns a set value (a string containing substrings separated by \",\"\ncharacters) consisting of the strings that have the corresponding bit in bits\nset. str1 corresponds to bit 0, str2 to bit 1, and so on. NULL values in str1,\nstr2, ... are not appended to the result.\n\nExamples\n--------\n\nSELECT MAKE_SET(1,\'a\',\'b\',\'c\');\n+-------------------------+\n| MAKE_SET(1,\'a\',\'b\',\'c\') |\n+-------------------------+\n| a |\n+-------------------------+\n\nSELECT MAKE_SET(1 | 4,\'hello\',\'nice\',\'world\');\n+----------------------------------------+\n| MAKE_SET(1 | 4,\'hello\',\'nice\',\'world\') |\n+----------------------------------------+\n| hello,world |\n+----------------------------------------+\n\nSELECT MAKE_SET(1 | 4,\'hello\',\'nice\',NULL,\'world\');\n+---------------------------------------------+\n| MAKE_SET(1 | 4,\'hello\',\'nice\',NULL,\'world\') |\n+---------------------------------------------+\n| hello |\n+---------------------------------------------+\n\nSELECT QUOTE(MAKE_SET(0,\'a\',\'b\',\'c\'));\n+--------------------------------+\n| QUOTE(MAKE_SET(0,\'a\',\'b\',\'c\')) |\n+--------------------------------+\n| \'\' |\n+--------------------------------+\n\nURL: https://mariadb.com/kb/en/make_set/','','https://mariadb.com/kb/en/make_set/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (662,36,'MATCH AGAINST','Syntax\n------\n\nMATCH (col1,col2,...) AGAINST (expr [search_modifier])\n\nDescription\n-----------\n\nA special construct used to perform a fulltext search on a fulltext index.\n\nSee Fulltext Index Overview for a full description, and Full-text Indexes for\nmore articles on the topic.\n\nExamples\n--------\n\nCREATE TABLE ft_myisam(copy TEXT,FULLTEXT(copy)) ENGINE=MyISAM;\n\nINSERT INTO ft_myisam(copy) VALUES (\'Once upon a time\'), (\'There was a wicked\nwitch\'), \n (\'Who ate everybody up\');\n\nSELECT * FROM ft_myisam WHERE MATCH(copy) AGAINST(\'wicked\');\n+--------------------------+\n| copy |\n+--------------------------+\n| There was a wicked witch |\n+--------------------------+\n\nSELECT id, body, MATCH (title,body) AGAINST\n (\'Security implications of running MySQL as root\'\n IN NATURAL LANGUAGE MODE) AS score\n FROM articles WHERE MATCH (title,body) AGAINST\n (\'Security implications of running MySQL as root\'\n IN NATURAL LANGUAGE MODE);\n+----+-------------------------------------+-----------------+\n| id | body | score |\n+----+-------------------------------------+-----------------+\n| 4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |\n| 6 | When configured properly, MySQL ... | 1.3114095926285 |\n+----+-------------------------------------+-----------------+\n\nURL: https://mariadb.com/kb/en/match-against/','','https://mariadb.com/kb/en/match-against/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (663,36,'MID','Syntax\n------\n\nMID(str,pos,len)\n\nDescription\n-----------\n\nMID(str,pos,len) is a synonym for SUBSTRING(str,pos,len).\n\nExamples\n--------\n\nSELECT MID(\'abcd\',4,1);\n+-----------------+\n| MID(\'abcd\',4,1) |\n+-----------------+\n| d |\n+-----------------+\n\nSELECT MID(\'abcd\',2,2);\n+-----------------+\n| MID(\'abcd\',2,2) |\n+-----------------+\n| bc |\n+-----------------+\n\nA negative starting position:\n\nSELECT MID(\'abcd\',-2,4);\n+------------------+\n| MID(\'abcd\',-2,4) |\n+------------------+\n| cd |\n+------------------+\n\nURL: https://mariadb.com/kb/en/mid/','','https://mariadb.com/kb/en/mid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (664,36,'NATURAL_SORT_KEY','MariaDB starting with 10.7.0\n----------------------------\nNATURAL_SORT_KEY was added in MariaDB 10.7.0.\n\nSyntax\n------\n\nNATURAL_SORT_KEY(str)\n\nDescription\n-----------\n\nThe NATURAL_SORT_KEY function is used for sorting that is closer to natural\nsorting. Strings are sorted in alphabetical order, while numbers are treated\nin a way such that, for example, 10 is greater than 2, whereas in other forms\nof sorting, 2 would be greater than 10, just like z is greater than ya.\n\nThere are multiple natural sort implementations, differing in the way they\nhandle leading zeroes, fractions, i18n, negatives, decimals and so on.\n\nMariaDB\'s implementation ignores leading zeroes when performing the sort.\n\nYou can use also use NATURAL_SORT_KEY with generated columns. The value is not\nstored permanently in the table. When using a generated column, the virtual\ncolumn must be longer than the base column to cater for embedded numbers in\nthe string and MDEV-24582.\n\nExamples\n--------\n\nStrings and Numbers\n-------------------\n\nCREATE TABLE t1 (c TEXT);\n\nINSERT INTO t1 VALUES (\'b1\'),(\'a2\'),(\'a11\'),(\'a1\');\n\nSELECT c FROM t1;\n+------+\n| c |\n+------+\n| b1 |\n| a2 |\n| a11 |\n| a1 |\n+------+\n\nSELECT c FROM t1 ORDER BY c;\n+------+\n| c |\n+------+\n| a1 |\n| a11 |\n| a2 |\n| b1 |\n+------+\n\nUnsorted, regular sort and natural sort:\n\nTRUNCATE t1;\n\nINSERT INTO t1 VALUES \n (\'5.5.31\'),(\'10.7.0\'),(\'10.2.1\'),\n (\'10.1.22\'),(\'10.3.32\'),(\'10.2.12\');\n\nSELECT c FROM t1;\n+---------+\n| c |\n+---------+\n| 5.5.31 |\n| 10.7.0 |\n| 10.2.1 |\n| 10.1.22 |\n| 10.3.32 |\n| 10.2.12 |\n+---------+\n\nSELECT c FROM t1 ORDER BY c;\n+---------+\n| c |\n+---------+\n| 10.1.22 |\n| 10.2.1 |\n| 10.2.12 |\n| 10.3.32 |\n| 10.7.0 |\n| 5.5.31 |\n+---------+\n\nSELECT c FROM t1 ORDER BY NATURAL_SORT_KEY(c);\n+---------+\n| c |\n+---------+\n| 5.5.31 |\n| 10.1.22 |\n| 10.2.1 |\n| 10.2.12 |\n| 10.3.32 |\n| 10.7.0 |\n+---------+\n\nIPs\n---\n\nSorting IPs, unsorted, regular sort and natural sort::\n\nTRUNCATE t1;\n\nINSERT INTO t1 VALUES \n (\'192.167.3.1\'),(\'192.167.1.12\'),(\'100.200.300.400\'),\n (\'100.50.60.70\'),(\'100.8.9.9\'),(\'127.0.0.1\'),(\'0.0.0.0\');\n\nSELECT c FROM t1;\n+-----------------+\n| c |\n+-----------------+\n| 192.167.3.1 |\n| 192.167.1.12 |\n| 100.200.300.400 |\n| 100.50.60.70 |\n| 100.8.9.9 |\n| 127.0.0.1 |\n| 0.0.0.0 |\n+-----------------+\n\nSELECT c FROM t1 ORDER BY c;\n+-----------------+\n| c |\n+-----------------+\n| 0.0.0.0 |\n| 100.200.300.400 |\n| 100.50.60.70 |\n| 100.8.9.9 |\n| 127.0.0.1 |\n| 192.167.1.12 |\n| 192.167.3.1 |\n+-----------------+\n\nSELECT c FROM t1 ORDER BY NATURAL_SORT_KEY(c);\n+-----------------+\n| c |\n+-----------------+\n| 0.0.0.0 |\n| 100.8.9.9 |\n| 100.50.60.70 |\n| 100.200.300.400 |\n| 127.0.0.1 |\n| 192.167.1.12 |\n| 192.167.3.1 |\n+-----------------+\n\nGenerated Columns\n-----------------\n\nUsing with a generated column:\n\nCREATE TABLE t(c VARCHAR(3), k VARCHAR(4) AS (NATURAL_SORT_KEY(c)) INVISIBLE);\n\nINSERT INTO t(c) VALUES (\'b1\'),(\'a2\'),(\'a11\'),(\'a10\');\n\nSELECT * FROM t ORDER by k;\n+------+\n| c |\n+------+\n| a2 |\n| a10 |\n| a11 |\n| b1 |\n+------+\n\nNote that if the virtual column is not longer, results may not be as expected:\n\nCREATE TABLE t2(c VARCHAR(3), k VARCHAR(3) AS (NATURAL_SORT_KEY(c)) INVISIBLE);\n\nINSERT INTO t2(c) VALUES (\'b1\'),(\'a2\'),(\'a11\'),(\'a10\');\n\nSELECT * FROM t2 ORDER by k;\n+------+\n| c |\n+------+\n| a2 |\n| a11 |\n| a10 |\n| b1 |\n+------+\n\nLeading Zeroes\n--------------\n\nIgnoring leading zeroes can lead to undesirable results in certain contexts.\nFor example:\n\nCREATE TABLE t3 (a VARCHAR(4));\n\nINSERT INTO t3 VALUES \n (\'a1\'), (\'a001\'), (\'a10\'), (\'a001\'), (\'a10\'),\n (\'a01\'), (\'a01\'), (\'a01b\'), (\'a01b\'), (\'a1\');\n\nSELECT a FROM t3 ORDER BY a;\n+------+\n| a |\n+------+\n| a001 |\n| a001 |\n| a01 |\n| a01 |\n| a01b |\n| a01b |\n| a1 |\n| a1 |\n| a10 |\n| a10 |\n+------+\n10 rows in set (0.000 sec)\n\nSELECT a FROM t3 ORDER BY NATURAL_SORT_KEY(a);\n+------+\n| a |\n+------+\n| a1 |\n| a01 |\n| a01 |\n| a001 |\n| a001 |\n| a1 |\n| a01b |\n| a01b |\n| a10 |\n| a10 |\n+------+\n\nThis may not be what we were hoping for in a \'natural\' sort. A workaround is\nto sort by both NATURAL_SORT_KEY and regular sort.\n\nSELECT a FROM t3 ORDER BY NATURAL_SORT_KEY(a), a;\n+------+\n| a |\n+------+\n| a001 |\n| a001 |\n| a01 |\n| a01 |\n| a1 |\n| a1 |\n| a01b |\n| a01b |\n| a10 |\n| a10 |\n+------+\n\nURL: https://mariadb.com/kb/en/natural_sort_key/','','https://mariadb.com/kb/en/natural_sort_key/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (665,36,'NOT LIKE','Syntax\n------\n\nexpr NOT LIKE pat [ESCAPE \'escape_char\']\n\nDescription\n-----------\n\nThis is the same as NOT (expr LIKE pat [ESCAPE \'escape_char\']).\n\nURL: https://mariadb.com/kb/en/not-like/','','https://mariadb.com/kb/en/not-like/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (666,36,'OCTET_LENGTH','Syntax\n------\n\nOCTET_LENGTH(str)\n\nDescription\n-----------\n\nOCTET_LENGTH() returns the length of the given string, in octets (bytes). This\nis a synonym for LENGTHB(), and, when Oracle mode from MariaDB 10.3 is not\nset, a synonym for LENGTH().\n\nA multi-byte character counts as multiple bytes. This means that for a string\ncontaining five two-byte characters, OCTET_LENGTH() returns 10, whereas\nCHAR_LENGTH() returns 5.\n\nIf str is not a string value, it is converted into a string. If str is NULL,\nthe function returns NULL.\n\nExamples\n--------\n\nWhen Oracle mode from MariaDB 10.3 is not set:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 2 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nIn Oracle mode from MariaDB 10.3:\n\nSELECT CHAR_LENGTH(\'Ï€\'), LENGTH(\'Ï€\'), LENGTHB(\'Ï€\'), OCTET_LENGTH(\'Ï€\');\n+-------------------+--------------+---------------+--------------------+\n| CHAR_LENGTH(\'Ï€\') | LENGTH(\'Ï€\') | LENGTHB(\'Ï€\') | OCTET_LENGTH(\'Ï€\') |\n+-------------------+--------------+---------------+--------------------+\n| 1 | 1 | 2 | 2 |\n+-------------------+--------------+---------------+--------------------+\n\nURL: https://mariadb.com/kb/en/octet_length/','','https://mariadb.com/kb/en/octet_length/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (667,36,'ORD','Syntax\n------\n\nORD(str)\n\nDescription\n-----------\n\nIf the leftmost character of the string str is a multi-byte character, returns\nthe code for that character, calculated from the numeric values of its\nconstituent bytes using this formula:\n\n(1st byte code)\n+ (2nd byte code x 256)\n+ (3rd byte code x 256 x 256) ...\n\nIf the leftmost character is not a multi-byte character, ORD() returns the\nsame value as the ASCII() function.\n\nExamples\n--------\n\nSELECT ORD(\'2\');\n+----------+\n| ORD(\'2\') |\n+----------+\n| 50 |\n+----------+\n\nURL: https://mariadb.com/kb/en/ord/','','https://mariadb.com/kb/en/ord/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (668,36,'POSITION','Syntax\n------\n\nPOSITION(substr IN str)\n\nDescription\n-----------\n\nPOSITION(substr IN str) is a synonym for LOCATE(substr,str).\n\nIt\'s part of ODBC 3.0.\n\nURL: https://mariadb.com/kb/en/position/','','https://mariadb.com/kb/en/position/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (669,36,'QUOTE','Syntax\n------\n\nQUOTE(str)\n\nDescription\n-----------\n\nQuotes a string to produce a result that can be used as a properly escaped\ndata value in an SQL statement. The string is returned enclosed by single\nquotes and with each instance of single quote (\"\'\"), backslash (\"\\\"), ASCII\nNUL, and Control-Z preceded by a backslash. If the argument is NULL, the\nreturn value is the word \"NULL\" without enclosing single quotes.\n\nExamples\n--------\n\nSELECT QUOTE(\"Don\'t!\");\n+-----------------+\n| QUOTE(\"Don\'t!\") |\n+-----------------+\n| \'Don\\\'t!\' |\n+-----------------+\n\nSELECT QUOTE(NULL); \n+-------------+\n| QUOTE(NULL) |\n+-------------+\n| NULL |\n+-------------+\n\nURL: https://mariadb.com/kb/en/quote/','','https://mariadb.com/kb/en/quote/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (670,36,'REPEAT Function','Syntax\n------\n\nREPEAT(str,count)\n\nDescription\n-----------\n\nReturns a string consisting of the string str repeated count times. If count\nis less than 1, returns an empty string. Returns NULL if str or count are NULL.\n\nExamples\n--------\n\nSELECT QUOTE(REPEAT(\'MariaDB \',4));\n+------------------------------------+\n| QUOTE(REPEAT(\'MariaDB \',4)) |\n+------------------------------------+\n| \'MariaDB MariaDB MariaDB MariaDB \' |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/repeat-function/','','https://mariadb.com/kb/en/repeat-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (671,36,'REPLACE Function','Syntax\n------\n\nREPLACE(str,from_str,to_str)\n\nDescription\n-----------\n\nReturns the string str with all occurrences of the string from_str replaced by\nthe string to_str. REPLACE() performs a case-sensitive match when searching\nfor from_str.\n\nExamples\n--------\n\nSELECT REPLACE(\'www.mariadb.org\', \'w\', \'Ww\');\n+---------------------------------------+\n| REPLACE(\'www.mariadb.org\', \'w\', \'Ww\') |\n+---------------------------------------+\n| WwWwWw.mariadb.org |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/replace-function/','','https://mariadb.com/kb/en/replace-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (672,36,'REVERSE','Syntax\n------\n\nREVERSE(str)\n\nDescription\n-----------\n\nReturns the string str with the order of the characters reversed.\n\nExamples\n--------\n\nSELECT REVERSE(\'desserts\');\n+---------------------+\n| REVERSE(\'desserts\') |\n+---------------------+\n| stressed |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/reverse/','','https://mariadb.com/kb/en/reverse/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (673,36,'RIGHT','Syntax\n------\n\nRIGHT(str,len)\n\nDescription\n-----------\n\nReturns the rightmost len characters from the string str, or NULL if any\nargument is NULL.\n\nExamples\n--------\n\nSELECT RIGHT(\'MariaDB\', 2);\n+---------------------+\n| RIGHT(\'MariaDB\', 2) |\n+---------------------+\n| DB |\n+---------------------+\n\nURL: https://mariadb.com/kb/en/right/','','https://mariadb.com/kb/en/right/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (674,36,'RPAD','Syntax\n------\n\nRPAD(str, len [, padstr])\n\nDescription\n-----------\n\nReturns the string str, right-padded with the string padstr to a length of len\ncharacters. If str is longer than len, the return value is shortened to len\ncharacters. If padstr is omitted, the RPAD function pads spaces.\n\nPrior to MariaDB 10.3.1, the padstr parameter was mandatory.\n\nReturns NULL if given a NULL argument. If the result is empty (a length of\nzero), returns either an empty string, or, from MariaDB 10.3.6 with\nSQL_MODE=Oracle, NULL.\n\nThe Oracle mode version of the function can be accessed outside of Oracle mode\nby using RPAD_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT RPAD(\'hello\',10,\'.\');\n+----------------------+\n| RPAD(\'hello\',10,\'.\') |\n+----------------------+\n| hello..... |\n+----------------------+\n\nSELECT RPAD(\'hello\',2,\'.\');\n+---------------------+\n| RPAD(\'hello\',2,\'.\') |\n+---------------------+\n| he |\n+---------------------+\n\nFrom MariaDB 10.3.1, with the pad string defaulting to space.\n\nSELECT RPAD(\'hello\',30);\n+--------------------------------+\n| RPAD(\'hello\',30) |\n+--------------------------------+\n| hello |\n+--------------------------------+\n\nOracle mode version from MariaDB 10.3.6:\n\nSELECT RPAD(\'\',0),RPAD_ORACLE(\'\',0);\n+------------+-------------------+\n| RPAD(\'\',0) | RPAD_ORACLE(\'\',0) |\n+------------+-------------------+\n| | NULL |\n+------------+-------------------+\n\nURL: https://mariadb.com/kb/en/rpad/','','https://mariadb.com/kb/en/rpad/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (675,36,'RTRIM','Syntax\n------\n\nRTRIM(str)\n\nDescription\n-----------\n\nReturns the string str with trailing space characters removed.\n\nReturns NULL if given a NULL argument. If the result is empty, returns either\nan empty string, or, from MariaDB 10.3.6 with SQL_MODE=Oracle, NULL.\n\nThe Oracle mode version of the function can be accessed outside of Oracle mode\nby using RTRIM_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT QUOTE(RTRIM(\'MariaDB \'));\n+-----------------------------+\n| QUOTE(RTRIM(\'MariaDB \')) |\n+-----------------------------+\n| \'MariaDB\' |\n+-----------------------------+\n\nOracle mode version from MariaDB 10.3.6:\n\nSELECT RTRIM(\'\'),RTRIM_ORACLE(\'\');\n+-----------+------------------+\n| RTRIM(\'\') | RTRIM_ORACLE(\'\') |\n+-----------+------------------+\n| | NULL |\n+-----------+------------------+\n\nURL: https://mariadb.com/kb/en/rtrim/','','https://mariadb.com/kb/en/rtrim/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (676,36,'SFORMAT','MariaDB starting with 10.7.0\n----------------------------\nSFORMAT was added in MariaDB 10.7.0.\n\nDescription\n-----------\n\nThe SFORMAT function takes an input string and a formatting specification and\nreturns the string formatted using the rules the user passed in the\nspecification.\n\nIt use the fmtlib library for Python-like (as well as Rust, C++20, etc) string\nformatting.\n\nOnly fmtlib 7.0.0+ is supported.\n\nThere is no native support for temporal and decimal values:\n\n* TIME_RESULT is handled as STRING_RESULT\n* DECIMAL_RESULT as REAL_RESULT\n\nExamples\n--------\n\nSELECT SFORMAT(\"The answer is {}.\", 42);\n+----------------------------------+\n| SFORMAT(\"The answer is {}.\", 42) |\n+----------------------------------+\n| The answer is 42. |\n+----------------------------------+\n\nCREATE TABLE test_sformat(mdb_release char(6), mdev int, feature char(20));\n\nINSERT INTO test_sformat VALUES(\'10.7.0\', 25015, \'Python style sformat\'), \n (\'10.7.0\', 4958, \'UUID\');\n\nSELECT * FROM test_sformat;\n+-------------+-------+----------------------+\n| mdb_release | mdev | feature |\n+-------------+-------+----------------------+\n| 10.7.0 | 25015 | Python style sformat |\n| 10.7.0 | 4958 | UUID |\n+-------------+-------+----------------------+\n\nSELECT SFORMAT(\'MariaDB Server {} has a preview for MDEV-{} which is about\n{}\', \n mdb_release, mdev, feature) AS \'Preview Release Examples\'\n FROM test_sformat;\n+------------------------------------------------------------------------------\n---------+\n| Preview Release Examples \n |\n+------------------------------------------------------------------------------\n---------+\n| MariaDB Server 10.7.0 has a preview for MDEV-25015 which is about Python\nstyle sformat |\n| MariaDB Server 10.7.0 has a preview for MDEV-4958 which is about UUID \n |\n+------------------------------------------------------------------------------\n---------+\n\nURL: https://mariadb.com/kb/en/sformat/','','https://mariadb.com/kb/en/sformat/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (677,36,'SOUNDEX','Syntax\n------\n\nSOUNDEX(str)\n\nDescription\n-----------\n\nReturns a soundex string from str. Two strings that sound almost the same\nshould have identical soundex strings. A standard soundex string is four\ncharacters long, but the SOUNDEX() function returns an arbitrarily long\nstring. You can use SUBSTRING() on the result to get a standard soundex\nstring. All non-alphabetic characters in str are ignored. All international\nalphabetic characters outside the A-Z range are treated as vowels.\n\nImportant: When using SOUNDEX(), you should be aware of the following details:\n\n* This function, as currently implemented, is intended to work well with\n strings that are in the English language only. Strings in other languages may\n not produce reasonable results.\n\n* This function implements the original Soundex algorithm, not the more\npopular enhanced version (also described by D. Knuth). The difference is that\noriginal version discards vowels first and duplicates second, whereas the\nenhanced version discards duplicates first and vowels second.\n\nExamples\n--------\n\nSOUNDEX(\'Hello\');\n+------------------+\n| SOUNDEX(\'Hello\') |\n+------------------+\n| H400 |\n+------------------+\n\nSELECT SOUNDEX(\'MariaDB\');\n+--------------------+\n| SOUNDEX(\'MariaDB\') |\n+--------------------+\n| M631 |\n+--------------------+\n\nSELECT SOUNDEX(\'Knowledgebase\');\n+--------------------------+\n| SOUNDEX(\'Knowledgebase\') |\n+--------------------------+\n| K543212 |\n+--------------------------+\n\nSELECT givenname, surname FROM users WHERE SOUNDEX(givenname) =\nSOUNDEX(\"robert\");\n+-----------+---------+\n| givenname | surname |\n+-----------+---------+\n| Roberto | Castro |\n+-----------+---------+\n\nURL: https://mariadb.com/kb/en/soundex/','','https://mariadb.com/kb/en/soundex/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (678,36,'SOUNDS LIKE','Syntax\n------\n\nexpr1 SOUNDS LIKE expr2\n\nDescription\n-----------\n\nThis is the same as SOUNDEX(expr1) = SOUNDEX(expr2).\n\nExample\n-------\n\nSELECT givenname, surname FROM users WHERE givenname SOUNDS LIKE \"robert\";\n+-----------+---------+\n| givenname | surname |\n+-----------+---------+\n| Roberto | Castro |\n+-----------+---------+\n\nURL: https://mariadb.com/kb/en/sounds-like/','','https://mariadb.com/kb/en/sounds-like/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (679,36,'SPACE','Syntax\n------\n\nSPACE(N)\n\nDescription\n-----------\n\nReturns a string consisting of N space characters. If N is NULL, returns NULL.\n\nExamples\n--------\n\nSELECT QUOTE(SPACE(6));\n+-----------------+\n| QUOTE(SPACE(6)) |\n+-----------------+\n| \' \' |\n+-----------------+\n\nURL: https://mariadb.com/kb/en/space/','','https://mariadb.com/kb/en/space/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (680,36,'STRCMP','Syntax\n------\n\nSTRCMP(expr1,expr2)\n\nDescription\n-----------\n\nSTRCMP() returns 0 if the strings are the same, -1 if the first argument is\nsmaller than the second according to the current sort order, and 1 if the\nstrings are otherwise not the same. Returns NULL is either argument is NULL.\n\nExamples\n--------\n\nSELECT STRCMP(\'text\', \'text2\');\n+-------------------------+\n| STRCMP(\'text\', \'text2\') |\n+-------------------------+\n| -1 |\n+-------------------------+\n\nSELECT STRCMP(\'text2\', \'text\');\n+-------------------------+\n| STRCMP(\'text2\', \'text\') |\n+-------------------------+\n| 1 |\n+-------------------------+\n\nSELECT STRCMP(\'text\', \'text\');\n+------------------------+\n| STRCMP(\'text\', \'text\') |\n+------------------------+\n| 0 |\n+------------------------+\n\nURL: https://mariadb.com/kb/en/strcmp/','','https://mariadb.com/kb/en/strcmp/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (681,36,'SUBSTR','Description\n-----------\n\nSUBSTR() is a synonym for SUBSTRING().\n\nURL: https://mariadb.com/kb/en/substr/','','https://mariadb.com/kb/en/substr/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (682,36,'SUBSTRING','Syntax\n------\n\nSUBSTRING(str,pos), \nSUBSTRING(str FROM pos), \nSUBSTRING(str,pos,len),\nSUBSTRING(str FROM pos FOR len)\n\nSUBSTR(str,pos), \nSUBSTR(str FROM pos), \nSUBSTR(str,pos,len),\nSUBSTR(str FROM pos FOR len)\n\nDescription\n-----------\n\nThe forms without a len argument return a substring from string str starting\nat position pos.\n\nThe forms with a len argument return a substring len characters long from\nstring str, starting at position pos.\n\nThe forms that use FROM are standard SQL syntax.\n\nIt is also possible to use a negative value for pos. In this case, the\nbeginning of the substring is pos characters from the end of the string,\nrather than the beginning. A negative value may be used for pos in any of the\nforms of this function.\n\nBy default, the position of the first character in the string from which the\nsubstring is to be extracted is reckoned as 1. For Oracle-compatibility, from\nMariaDB 10.3.3, when sql_mode is set to \'oracle\', position zero is treated as\nposition 1 (although the first character is still reckoned as 1).\n\nIf any argument is NULL, returns NULL.\n\nExamples\n--------\n\nSELECT SUBSTRING(\'Knowledgebase\',5);\n+------------------------------+\n| SUBSTRING(\'Knowledgebase\',5) |\n+------------------------------+\n| ledgebase |\n+------------------------------+\n\nSELECT SUBSTRING(\'MariaDB\' FROM 6);\n+-----------------------------+\n| SUBSTRING(\'MariaDB\' FROM 6) |\n+-----------------------------+\n| DB |\n+-----------------------------+\n\nSELECT SUBSTRING(\'Knowledgebase\',3,7);\n+--------------------------------+\n| SUBSTRING(\'Knowledgebase\',3,7) |\n+--------------------------------+\n| owledge |\n+--------------------------------+\n\nSELECT SUBSTRING(\'Knowledgebase\', -4);\n+--------------------------------+\n| SUBSTRING(\'Knowledgebase\', -4) |\n+--------------------------------+\n| base |\n+--------------------------------+\n\nSELECT SUBSTRING(\'Knowledgebase\', -8, 4);\n+-----------------------------------+\n| SUBSTRING(\'Knowledgebase\', -8, 4) |\n+-----------------------------------+\n| edge |\n+-----------------------------------+\n\nSELECT SUBSTRING(\'Knowledgebase\' FROM -8 FOR 4);\n+------------------------------------------+\n| SUBSTRING(\'Knowledgebase\' FROM -8 FOR 4) |\n+------------------------------------------+\n| edge |\n+------------------------------------------+\n\nOracle mode from MariaDB 10.3.3:\n\nSELECT SUBSTR(\'abc\',0,3);\n+-------------------+\n| SUBSTR(\'abc\',0,3) |\n+-------------------+\n| |\n+-------------------+\n\nSELECT SUBSTR(\'abc\',1,2);\n+-------------------+\n| SUBSTR(\'abc\',1,2) |\n+-------------------+\n| ab |\n+-------------------+\n\nSET sql_mode=\'oracle\';\n\nSELECT SUBSTR(\'abc\',0,3);\n+-------------------+\n| SUBSTR(\'abc\',0,3) |\n+-------------------+\n| abc |\n+-------------------+\n\nSELECT SUBSTR(\'abc\',1,2);\n+-------------------+\n| SUBSTR(\'abc\',1,2) |\n+-------------------+\n| ab |\n+-------------------+\n\nURL: https://mariadb.com/kb/en/substring/','','https://mariadb.com/kb/en/substring/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (683,36,'SUBSTRING_INDEX','Syntax\n------\n\nSUBSTRING_INDEX(str,delim,count)\n\nDescription\n-----------\n\nReturns the substring from string str before count occurrences of the\ndelimiter delim. If count is positive, everything to the left of the final\ndelimiter (counting from the left) is returned. If count is negative,\neverything to the right of the final delimiter (counting from the right) is\nreturned. SUBSTRING_INDEX() performs a case-sensitive match when searching for\ndelim.\n\nIf any argument is NULL, returns NULL.\n\nFor example\n\nSUBSTRING_INDEX(\'www.mariadb.org\', \'.\', 2)\n\nmeans \"Return all of the characters up to the 2nd occurrence of .\"\n\nExamples\n--------\n\nSELECT SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', 2);\n+--------------------------------------------+\n| SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', 2) |\n+--------------------------------------------+\n| www.mariadb |\n+--------------------------------------------+\n\nSELECT SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', -2);\n+---------------------------------------------+\n| SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', -2) |\n+---------------------------------------------+\n| mariadb.org |\n+---------------------------------------------+\n\nURL: https://mariadb.com/kb/en/substring_index/','','https://mariadb.com/kb/en/substring_index/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (684,36,'TO_BASE64','Syntax\n------\n\nTO_BASE64(str)\n\nDescription\n-----------\n\nConverts the string argument str to its base-64 encoded form, returning the\nresult as a character string in the connection character set and collation.\n\nThe argument str will be converted to string first if it is not a string. A\nNULL argument will return a NULL result.\n\nThe reverse function, FROM_BASE64(), decodes an encoded base-64 string.\n\nThere are a numerous different methods to base-64 encode a string. The\nfollowing are used by MariaDB and MySQL:\n\n* Alphabet value 64 is encoded as \'+\'.\n* Alphabet value 63 is encoded as \'/\'.\n* Encoding output is made up of groups of four printable characters, with each\nthree bytes of data encoded using four characters. If the final group is not\ncomplete, it is padded with \'=\' characters to make up a length of four.\n* To divide long output, a newline is added after every 76 characters.\n* Decoding will recognize and ignore newlines, carriage returns, tabs, and\nspaces.\n\nExamples\n--------\n\nSELECT TO_BASE64(\'Maria\');\n+--------------------+\n| TO_BASE64(\'Maria\') |\n+--------------------+\n| TWFyaWE= |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/to_base64/','','https://mariadb.com/kb/en/to_base64/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (685,36,'TO_CHAR','MariaDB starting with 10.6.1\n----------------------------\nThe TO_CHAR function was introduced in MariaDB 10.6.1 to enhance Oracle\ncompatibility.\n\nSyntax\n------\n\nTO_CHAR(expr[, fmt])\n\nDescription\n-----------\n\nThe TO_CHAR function converts an expr of type date, datetime, time or\ntimestamp to a string. The optional fmt argument supports\nYYYY/YYY/YY/RRRR/RR/MM/MON/MONTH/MI/DD/DY/HH/HH12/HH24/SS and special\ncharacters. The default value is \"YYYY-MM-DD HH24:MI:SS\".\n\nIn Oracle, TO_CHAR can also be used to convert numbers to strings, but this is\nnot supported in MariaDB and will give an error.\n\nExamples\n--------\n\nSELECT TO_CHAR(\'1980-01-11 04:50:39\', \'YYYY-MM-DD\');\n+----------------------------------------------+\n| TO_CHAR(\'1980-01-11 04:50:39\', \'YYYY-MM-DD\') |\n+----------------------------------------------+\n| 1980-01-11 |\n+----------------------------------------------+\n\nSELECT TO_CHAR(\'1980-01-11 04:50:39\', \'HH24-MI-SS\');\n+----------------------------------------------+\n| TO_CHAR(\'1980-01-11 04:50:39\', \'HH24-MI-SS\') |\n+----------------------------------------------+\n| 04-50-39 |\n+----------------------------------------------+\n\nSELECT TO_CHAR(\'00-01-01 00:00:00\', \'YY-MM-DD HH24:MI:SS\');\n+-----------------------------------------------------+\n| TO_CHAR(\'00-01-01 00:00:00\', \'YY-MM-DD HH24:MI:SS\') |\n+-----------------------------------------------------+\n| 00-01-01 00:00:00 |\n+-----------------------------------------------------+\n\nSELECT TO_CHAR(\'99-12-31 23:59:59\', \'YY-MM-DD HH24:MI:SS\');\n+-----------------------------------------------------+\n| TO_CHAR(\'99-12-31 23:59:59\', \'YY-MM-DD HH24:MI:SS\') |\n+-----------------------------------------------------+\n| 99-12-31 23:59:59 |\n+-----------------------------------------------------+\n\nSELECT TO_CHAR(\'9999-12-31 23:59:59\', \'YY-MM-DD HH24:MI:SS\');\n+-------------------------------------------------------+\n| TO_CHAR(\'9999-12-31 23:59:59\', \'YY-MM-DD HH24:MI:SS\') |\n+-------------------------------------------------------+\n| 99-12-31 23:59:59 |\n+-------------------------------------------------------+\n\nSELECT TO_CHAR(\'21-01-03 08:30:00\', \'Y-MONTH-DY HH:MI:SS\');\n+-----------------------------------------------------+\n| TO_CHAR(\'21-01-03 08:30:00\', \'Y-MONTH-DY HH:MI:SS\') |\n+-----------------------------------------------------+\n| 1-January -Sun 08:30:00 |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/to_char/','','https://mariadb.com/kb/en/to_char/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (686,36,'TRIM','Syntax\n------\n\nTRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr FROM] str)\n\nFrom MariaDB 10.3.6\n\nTRIM_ORACLE([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr\nFROM] str)\n\nDescription\n-----------\n\nReturns the string str with all remstr prefixes or suffixes removed. If none\nof the specifiers BOTH, LEADING, or TRAILING is given, BOTH is assumed. remstr\nis optional and, if not specified, spaces are removed.\n\nReturns NULL if given a NULL argument. If the result is empty, returns either\nan empty string, or, from MariaDB 10.3.6 with SQL_MODE=Oracle, NULL.\nSQL_MODE=Oracle is not set by default.\n\nThe Oracle mode version of the function can be accessed in any mode by using\nTRIM_ORACLE as the function name.\n\nExamples\n--------\n\nSELECT TRIM(\' bar \')\\G\n*************************** 1. row ***************************\nTRIM(\' bar \'): bar\n\nSELECT TRIM(LEADING \'x\' FROM \'xxxbarxxx\')\\G\n*************************** 1. row ***************************\nTRIM(LEADING \'x\' FROM \'xxxbarxxx\'): barxxx\n\nSELECT TRIM(BOTH \'x\' FROM \'xxxbarxxx\')\\G\n*************************** 1. row ***************************\nTRIM(BOTH \'x\' FROM \'xxxbarxxx\'): bar\n\nSELECT TRIM(TRAILING \'xyz\' FROM \'barxxyz\')\\G\n*************************** 1. row ***************************\nTRIM(TRAILING \'xyz\' FROM \'barxxyz\'): barx\n\nFrom MariaDB 10.3.6, with SQL_MODE=Oracle not set:\n\nSELECT TRIM(\'\'),TRIM_ORACLE(\'\');\n+----------+-----------------+\n| TRIM(\'\') | TRIM_ORACLE(\'\') |\n+----------+-----------------+\n| | NULL |\n+----------+-----------------+\n\nFrom MariaDB 10.3.6, with SQL_MODE=Oracle set:\n\nSELECT TRIM(\'\'),TRIM_ORACLE(\'\');\n+----------+-----------------+\n| TRIM(\'\') | TRIM_ORACLE(\'\') |\n+----------+-----------------+\n| NULL | NULL |\n+----------+-----------------+\n\nURL: https://mariadb.com/kb/en/trim/','','https://mariadb.com/kb/en/trim/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (687,36,'UCASE','Syntax\n------\n\nUCASE(str)\n\nDescription\n-----------\n\nUCASE() is a synonym for UPPER().\n\nURL: https://mariadb.com/kb/en/ucase/','','https://mariadb.com/kb/en/ucase/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (688,36,'UNCOMPRESSED_LENGTH','Syntax\n------\n\nUNCOMPRESSED_LENGTH(compressed_string)\n\nDescription\n-----------\n\nReturns the length that the compressed string had before being compressed with\nCOMPRESS().\n\nUNCOMPRESSED_LENGTH() returns NULL or an incorrect result if the string is not\ncompressed.\n\nUntil MariaDB 10.3.1, returns MYSQL_TYPE_LONGLONG, or bigint(10), in all\ncases. From MariaDB 10.3.1, returns MYSQL_TYPE_LONG, or int(10), when the\nresult would fit within 32-bits.\n\nExamples\n--------\n\nSELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT(\'a\',30)));\n+-----------------------------------------------+\n| UNCOMPRESSED_LENGTH(COMPRESS(REPEAT(\'a\',30))) |\n+-----------------------------------------------+\n| 30 |\n+-----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/uncompressed_length/','','https://mariadb.com/kb/en/uncompressed_length/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (689,36,'UNHEX','Syntax\n------\n\nUNHEX(str)\n\nDescription\n-----------\n\nPerforms the inverse operation of HEX(str). That is, it interprets each pair\nof hexadecimal digits in the argument as a number and converts it to the\ncharacter represented by the number. The resulting characters are returned as\na binary string.\n\nIf str is NULL, UNHEX() returns NULL.\n\nExamples\n--------\n\nSELECT HEX(\'MariaDB\');\n+----------------+\n| HEX(\'MariaDB\') |\n+----------------+\n| 4D617269614442 |\n+----------------+\n\nSELECT UNHEX(\'4D617269614442\');\n+-------------------------+\n| UNHEX(\'4D617269614442\') |\n+-------------------------+\n| MariaDB |\n+-------------------------+\n\nSELECT 0x4D617269614442;\n+------------------+\n| 0x4D617269614442 |\n+------------------+\n| MariaDB |\n+------------------+\n\nSELECT UNHEX(HEX(\'string\'));\n+----------------------+\n| UNHEX(HEX(\'string\')) |\n+----------------------+\n| string |\n+----------------------+\n\nSELECT HEX(UNHEX(\'1267\'));\n+--------------------+\n| HEX(UNHEX(\'1267\')) |\n+--------------------+\n| 1267 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/unhex/','','https://mariadb.com/kb/en/unhex/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (690,36,'UPDATEXML','Syntax\n------\n\nUpdateXML(xml_target, xpath_expr, new_xml)\n\nDescription\n-----------\n\nThis function replaces a single portion of a given fragment of XML markup\nxml_target with a new XML fragment new_xml, and then returns the changed XML.\nThe portion of xml_target that is replaced matches an XPath expression\nxpath_expr supplied by the user. If no expression matching xpath_expr is\nfound, or if multiple matches are found, the function returns the original\nxml_target XML fragment. All three arguments should be strings.\n\nExamples\n--------\n\nSELECT\n UpdateXML(\'<a><b>ccc</b><d></d></a>\', \'/a\', \'<e>fff</e>\') AS val1,\n UpdateXML(\'<a><b>ccc</b><d></d></a>\', \'/b\', \'<e>fff</e>\') AS val2,\n UpdateXML(\'<a><b>ccc</b><d></d></a>\', \'//b\', \'<e>fff</e>\') AS val3,\n UpdateXML(\'<a><b>ccc</b><d></d></a>\', \'/a/d\', \'<e>fff</e>\') AS val4,\n UpdateXML(\'<a><d></d><b>ccc</b><d></d></a>\', \'/a/d\', \'<e>fff</e>\') AS val5\n \\G\n*************************** 1. row ***************************\nval1: <e>fff</e>\nval2: <a><b>ccc</b><d></d></a>\nval3: <a><e>fff</e><d></d></a>\nval4: <a><b>ccc</b><e>fff</e></a>\nval5: <a><d></d><b>ccc</b><d></d></a>\n1 row in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/updatexml/','','https://mariadb.com/kb/en/updatexml/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (691,36,'UPPER','Syntax\n------\n\nUPPER(str)\n\nDescription\n-----------\n\nReturns the string str with all characters changed to uppercase according to\nthe current character set mapping. The default is latin1 (cp1252 West\nEuropean).\n\nSELECT UPPER(surname), givenname FROM users ORDER BY surname;\n+----------------+------------+\n| UPPER(surname) | givenname |\n+----------------+------------+\n| ABEL | Jacinto |\n| CASTRO | Robert |\n| COSTA | Phestos |\n| MOSCHELLA | Hippolytos |\n+----------------+------------+\n\nUPPER() is ineffective when applied to binary strings (BINARY, VARBINARY,\nBLOB). The description of LOWER() shows how to perform lettercase conversion\nof binary strings.\n\nURL: https://mariadb.com/kb/en/upper/','','https://mariadb.com/kb/en/upper/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (692,36,'WEIGHT_STRING','Syntax\n------\n\nWEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])\n levels: N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ...\n\nDescription\n-----------\n\nReturns a binary string representing the string\'s sorting and comparison\nvalue. A string with a lower result means that for sorting purposes the string\nappears before a string with a higher result.\n\nWEIGHT_STRING() is particularly useful when adding new collations, for testing\npurposes.\n\nIf str is a non-binary string (CHAR, VARCHAR or TEXT), WEIGHT_STRING returns\nthe string\'s collation weight. If str is a binary string (BINARY, VARBINARY or\nBLOB), the return value is simply the input value, since the weight for each\nbyte in a binary string is the byte value.\n\nWEIGHT_STRING() returns NULL if given a NULL input.\n\nThe optional AS clause permits casting the input string to a binary or\nnon-binary string, as well as to a particular length.\n\nAS BINARY(N) measures the length in bytes rather than characters, and right\npads with 0x00 bytes to the desired length.\n\nAS CHAR(N) measures the length in characters, and right pads with spaces to\nthe desired length.\n\nN has a minimum value of 1, and if it is less than the length of the input\nstring, the string is truncated without warning.\n\nThe optional LEVEL clause specifies that the return value should contain\nweights for specific collation levels. The levels specifier can either be a\nsingle integer, a comma-separated list of integers, or a range of integers\nseparated by a dash (whitespace is ignored). Integers can range from 1 to a\nmaximum of 6, dependent on the collation, and need to be listed in ascending\norder.\n\nIf the LEVEL clause is no provided, a default of 1 to the maximum for the\ncollation is assumed.\n\nIf the LEVEL is specified without using a range, an optional modifier is\npermitted.\n\nASC, the default, returns the weights without any modification.\n\nDESC returns bitwise-inverted weights.\n\nREVERSE returns the weights in reverse order.\n\nExamples\n--------\n\nThe examples below use the HEX() function to represent non-printable results\nin hexadecimal format.\n\nSELECT HEX(WEIGHT_STRING(\'x\'));\n+-------------------------+\n| HEX(WEIGHT_STRING(\'x\')) |\n+-------------------------+\n| 0058 |\n+-------------------------+\n\nSELECT HEX(WEIGHT_STRING(\'x\' AS BINARY(4)));\n+--------------------------------------+\n| HEX(WEIGHT_STRING(\'x\' AS BINARY(4))) |\n+--------------------------------------+\n| 78000000 |\n+--------------------------------------+\n\nSELECT HEX(WEIGHT_STRING(\'x\' AS CHAR(4)));\n+------------------------------------+\n| HEX(WEIGHT_STRING(\'x\' AS CHAR(4))) |\n+------------------------------------+\n| 0058002000200020 |\n+------------------------------------+\n\nSELECT HEX(WEIGHT_STRING(0xaa22ee LEVEL 1));\n+--------------------------------------+\n| HEX(WEIGHT_STRING(0xaa22ee LEVEL 1)) |\n+--------------------------------------+\n| AA22EE |\n+--------------------------------------+\n\nSELECT HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 DESC));\n+-------------------------------------------+\n| HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 DESC)) |\n+-------------------------------------------+\n| 55DD11 |\n+-------------------------------------------+\n\nSELECT HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 REVERSE));\n+----------------------------------------------+\n| HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 REVERSE)) |\n+----------------------------------------------+\n| EE22AA |\n+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/weight_string/','','https://mariadb.com/kb/en/weight_string/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (693,36,'Type Conversion','Implicit type conversion takes place when MariaDB is using operands or\ndifferent types, in order to make the operands compatible.\n\nIt is best practice not to rely upon implicit conversion; rather use CAST to\nexplicitly convert types.\n\nRules for Conversion on Comparison\n----------------------------------\n\n* If either argument is NULL, the result of the comparison is NULL unless the\nNULL-safe <=> equality comparison operator is used.\n* If both arguments are integers, they are compared as integers.\n* If both arguments are strings, they are compared as strings.\n* If one argument is decimal and the other argument is decimal or integer,\nthey are compared as decimals.\n* If one argument is decimal and the other argument is a floating point, they\nare compared as floating point values.\n* If one argument is string and the other argument is integer, they are\ncompared as decimals. This conversion was added in MariaDB 10.3.36. Prior to\n10.3.36, this combination was compared as floating point values, which did not\nalways work well for huge 64-bit integers because of a possible precision loss\non conversion to double.\n* If a hexadecimal argument is not compared to a number, it is treated as a\nbinary string.\n* If a constant is compared to a TIMESTAMP or DATETIME, the constant is\nconverted to a timestamp, unless used as an argument to the IN function.\n* In other cases, arguments are compared as floating point, or real, numbers.\n\nNote that if a string column is being compared with a numeric value, MariaDB\nwill not use the index on the column, as there are numerous alternatives that\nmay evaluate as equal (see examples below).\n\nComparison Examples\n-------------------\n\nConverting a string to a number:\n\nSELECT 15+\'15\';\n+---------+\n| 15+\'15\' |\n+---------+\n| 30 |\n+---------+\n\nConverting a number to a string:\n\nSELECT CONCAT(15,\'15\');\n+-----------------+\n| CONCAT(15,\'15\') |\n+-----------------+\n| 1515 |\n+-----------------+\n\nFloating point number errors:\n\nSELECT \'9746718491924563214\' = 9746718491924563213;\n+---------------------------------------------+\n| \'9746718491924563214\' = 9746718491924563213 |\n+---------------------------------------------+\n| 1 |\n+---------------------------------------------+\n\nNumeric equivalence with strings:\n\nSELECT \'5\' = 5;\n+---------+\n| \'5\' = 5 |\n+---------+\n| 1 |\n+---------+\n\nSELECT \' 5\' = 5;\n+------------+\n| \' 5\' = 5 |\n+------------+\n| 1 |\n+------------+\n\nSELECT \' 5 \' = 5;\n+--------------+\n| \' 5 \' = 5 |\n+--------------+\n| 1 |\n+--------------+\n1 row in set, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+--------------------------------------------+\n| Level | Code | Message |\n+-------+------+--------------------------------------------+\n| Note | 1292 | Truncated incorrect DOUBLE value: \' 5 \' |\n+-------+------+--------------------------------------------+\n\nAs a result of the above, MariaDB cannot use the index when comparing a string\nwith a numeric value in the example below:\n\nCREATE TABLE t (a VARCHAR(10), b VARCHAR(10), INDEX idx_a (a));\n\nINSERT INTO t VALUES \n (\'1\', \'1\'), (\'2\', \'2\'), (\'3\', \'3\'),\n (\'4\', \'4\'), (\'5\', \'5\'), (\'1\', \'5\');\n\nEXPLAIN SELECT * FROM t WHERE a = \'3\' \\G\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: t\n type: ref\npossible_keys: idx_a\n key: idx_a\n key_len: 13\n ref: const\n rows: 1\n Extra: Using index condition\n\nEXPLAIN SELECT * FROM t WHERE a = 3 \\G\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: t\n type: ALL\npossible_keys: idx_a\n key: NULL\n key_len: NULL\n ref: NULL\n rows: 6\n Extra: Using where\n\nRules for Conversion on Dyadic Arithmetic Operations\n----------------------------------------------------\n\nImplicit type conversion also takes place on dyadic arithmetic operations\n(+,-,*,/). MariaDB chooses the minimum data type that is guaranteed to fit the\nresult and converts both arguments to the result data type.\n\nFor addition (+), subtraction (-) and multiplication (*), the result data type\nis chosen as follows:\n\n* If either of the arguments is an approximate number (float, double), the\nresult is double.\n* If either of the arguments is a string (char, varchar, text), the result is\ndouble.\n* If either of the arguments is a decimal number, the result is decimal.\n* If either of the arguments is of a temporal type with a non-zero fractional\nsecond precision (time(N), datetime(N), timestamp(N)), the result is decimal.\n* If either of the arguments is of a temporal type with a zero fractional\nsecond precision (time(0), date, datetime(0), timestamp(0)), the result may\nvary between int, int unsigned, bigint or bigint unsigned, depending on the\nexact data type combination.\n* If both arguments are integer numbers (tinyint, smallint, mediumint,\nbigint), the result may vary between int, int unsigned, bigint or bigint\nunsigned, depending of the exact data types and their signs.\n\nFor division (/), the result data type is chosen as follows:\n\n* If either of the arguments is an approximate number (float, double), the\nresult is double.\n* If either of the arguments is a string (char, varchar, text), the result is\ndouble.\n* Otherwise, the result is decimal.\n\nArithmetic Examples\n-------------------\n\nNote, the above rules mean that when an argument of a temporal data type\nappears in addition or subtraction, it\'s treated as a number by default.\n\nSELECT TIME\'10:20:30\' + 1;\n+--------------------+\n| TIME\'10:20:30\' + 1 |\n+--------------------+\n| 102031 |\n+--------------------+\n\nIn order to do temporal addition or subtraction instead, use the DATE_ADD() or\nDATE_SUB() functions, or an INTERVAL expression as the second argument:\n\nSELECT TIME\'10:20:30\' + INTERVAL 1 SECOND;\n+------------------------------------+\n| TIME\'10:20:30\' + INTERVAL 1 SECOND |\n+------------------------------------+\n| 10:20:31 |\n+------------------------------------+\n\nSELECT \"2.2\" + 3;\n+-----------+\n| \"2.2\" + 3 |\n+-----------+\n| 5.2 |\n+-----------+\n\nSELECT 2.2 + 3;\n+---------+\n| 2.2 + 3 |\n+---------+\n| 5.2 |\n+---------+\n\nSELECT 2.2 / 3;\n+---------+\n| 2.2 / 3 |\n+---------+\n| 0.73333 |\n+---------+\n\nSELECT \"2.2\" / 3;\n+--------------------+\n| \"2.2\" / 3 |\n+--------------------+\n| 0.7333333333333334 |\n+--------------------+\n\nURL: https://mariadb.com/kb/en/type-conversion/','','https://mariadb.com/kb/en/type-conversion/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (694,37,'_rowid','Syntax\n------\n\n_rowid\n\nDescription\n-----------\n\nThe _rowid pseudo column is mapped to the primary key in the related table.\nThis can be used as a replacement of the rowid pseudo column in other\ndatabases. Another usage is to simplify sql queries as one doesn\'t have to\nknow the name of the primary key.\n\nExamples\n--------\n\ncreate table t1 (a int primary key, b varchar(80));\ninsert into t1 values (1,\"one\"),(2,\"two\");\nselect * from t1 where _rowid=1;\n\n+---+------+\n| a | b |\n+---+------+\n| 1 | one |\n+---+------+\n\nupdate t1 set b=\"three\" where _rowid=2;\nselect * from t1 where _rowid>=1 and _rowid<=10;\n\n+---+-------+\n| a | b |\n+---+-------+\n| 1 | one |\n| 2 | three |\n+---+-------+\n\nURL: https://mariadb.com/kb/en/_rowid/','','https://mariadb.com/kb/en/_rowid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (695,38,'ALTER TABLE','Syntax\n------\n\nALTER [ONLINE] [IGNORE] TABLE [IF EXISTS] tbl_name\n [WAIT n | NOWAIT]\n alter_specification [, alter_specification] ...\nalter_specification:\n table_option ...\n | ADD [COLUMN] [IF NOT EXISTS] col_name column_definition\n [FIRST | AFTER col_name ]\n | ADD [COLUMN] [IF NOT EXISTS] (col_name column_definition,...)\n | ADD {INDEX|KEY} [IF NOT EXISTS] [index_name]\n [index_type] (index_col_name,...) [index_option] ...\n | ADD [CONSTRAINT [symbol]] PRIMARY KEY\n [index_type] (index_col_name,...) [index_option] ...\n | ADD [CONSTRAINT [symbol]]\n UNIQUE [INDEX|KEY] [index_name]\n [index_type] (index_col_name,...) [index_option] ...\n | ADD FULLTEXT [INDEX|KEY] [index_name]\n (index_col_name,...) [index_option] ...\n | ADD SPATIAL [INDEX|KEY] [index_name]\n (index_col_name,...) [index_option] ...\n | ADD [CONSTRAINT [symbol]]\n FOREIGN KEY [IF NOT EXISTS] [index_name] (index_col_name,...)\n reference_definition\n | ADD PERIOD FOR SYSTEM_TIME (start_column_name, end_column_name)\n | ALTER [COLUMN] col_name SET DEFAULT literal | (expression)\n | ALTER [COLUMN] col_name DROP DEFAULT\n | ALTER {INDEX|KEY} index_name [NOT] INVISIBLE\n | CHANGE [COLUMN] [IF EXISTS] old_col_name new_col_name column_definition\n [FIRST|AFTER col_name]\n | MODIFY [COLUMN] [IF EXISTS] col_name column_definition\n [FIRST | AFTER col_name]\n | DROP [COLUMN] [IF EXISTS] col_name [RESTRICT|CASCADE]\n | DROP PRIMARY KEY\n | DROP {INDEX|KEY} [IF EXISTS] index_name\n | DROP FOREIGN KEY [IF EXISTS] fk_symbol\n | DROP CONSTRAINT [IF EXISTS] constraint_name\n | DISABLE KEYS\n | ENABLE KEYS\n | RENAME [TO] new_tbl_name\n | ORDER BY col_name [, col_name] ...\n | RENAME COLUMN old_col_name TO new_col_name\n | RENAME {INDEX|KEY} old_index_name TO new_index_name\n | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]\n | [DEFAULT] CHARACTER SET [=] charset_name\n | [DEFAULT] COLLATE [=] collation_name\n | DISCARD TABLESPACE\n | IMPORT TABLESPACE\n | ALGORITHM [=] {DEFAULT|INPLACE|COPY|NOCOPY|INSTANT}\n | LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}\n | FORCE\n | partition_options\n | ADD PARTITION [IF NOT EXISTS] (partition_definition)\n | DROP PARTITION [IF EXISTS] partition_names\n | COALESCE PARTITION number\n | REORGANIZE PARTITION [partition_names INTO (partition_definitions)]\n | ANALYZE PARTITION partition_names\n | CHECK PARTITION partition_names\n | OPTIMIZE PARTITION partition_names\n | REBUILD PARTITION partition_names\n | REPAIR PARTITION partition_names\n | EXCHANGE PARTITION partition_name WITH TABLE tbl_name\n | REMOVE PARTITIONING\n | ADD SYSTEM VERSIONING\n | DROP SYSTEM VERSIONING\nindex_col_name:\n col_name [(length)] [ASC | DESC]\nindex_type:\n USING {BTREE | HASH | RTREE}\nindex_option:\n [ KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n | CLUSTERING={YES| NO} ]\n [ IGNORED | NOT IGNORED ]\ntable_options:\n table_option [[,] table_option] ...\n\nDescription\n-----------\n\nALTER TABLE enables you to change the structure of an existing table. For\nexample, you can add or delete columns, create or destroy indexes, change the\ntype of existing columns, or rename columns or the table itself. You can also\nchange the comment for the table and the storage engine of the table.\n\nIf another connection is using the table, a metadata lock is active, and this\nstatement will wait until the lock is released. This is also true for\nnon-transactional tables.\n\nWhen adding a UNIQUE index on a column (or a set of columns) which have\nduplicated values, an error will be produced and the statement will be\nstopped. To suppress the error and force the creation of UNIQUE indexes,\ndiscarding duplicates, the IGNORE option can be specified. This can be useful\nif a column (or a set of columns) should be UNIQUE but it contains duplicate\nvalues; however, this technique provides no control on which rows are\npreserved and which are deleted. Also, note that IGNORE is accepted but\nignored in ALTER TABLE ... EXCHANGE PARTITION statements.\n\nThis statement can also be used to rename a table. For details see RENAME\nTABLE.\n\nWhen an index is created, the storage engine may use a configurable buffer in\nthe process. Incrementing the buffer speeds up the index creation. Aria and\nMyISAM allocate a buffer whose size is defined by aria_sort_buffer_size or\nmyisam_sort_buffer_size, also used for REPAIR TABLE. InnoDB allocates three\nbuffers whose size is defined by innodb_sort_buffer_size.\n\nPrivileges\n----------\n\nExecuting the ALTER TABLE statement generally requires at least the ALTER\nprivilege for the table or the database..\n\nIf you are renaming a table, then it also requires the DROP, CREATE and INSERT\nprivileges for the table or the database as well.\n\nOnline DDL\n----------\n\nOnline DDL is supported with the ALGORITHM and LOCK clauses.\n\nSee InnoDB Online DDL Overview for more information on online DDL with InnoDB.\n\nALTER ONLINE TABLE\n------------------\n\nALTER ONLINE TABLE also works for partitioned tables.\n\nOnline ALTER TABLE is available by executing the following:\n\nALTER ONLINE TABLE ...;\n\nThis statement has the following semantics:\n\nThis statement is equivalent to the following:\n\nALTER TABLE ... LOCK=NONE;\n\nSee the LOCK alter specification for more information.\n\nThis statement is equivalent to the following:\n\nALTER TABLE ... ALGORITHM=INPLACE;\n\nSee the ALGORITHM alter specification for more information.\n\nWAIT/NOWAIT\n-----------\n\nMariaDB starting with 10.3.0\n----------------------------\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nIF EXISTS\n---------\n\nThe IF EXISTS and IF NOT EXISTS clauses are available for the following:\n\nADD COLUMN [IF NOT EXISTS]\nADD INDEX [IF NOT EXISTS]\nADD FOREIGN KEY [IF NOT EXISTS]\nADD PARTITION [IF NOT EXISTS]\nCREATE INDEX [IF NOT EXISTS]\nDROP COLUMN [IF EXISTS]\nDROP INDEX [IF EXISTS]\nDROP FOREIGN KEY [IF EXISTS]\nDROP PARTITION [IF EXISTS]\nCHANGE COLUMN [IF EXISTS]\nMODIFY COLUMN [IF EXISTS]\nDROP INDEX [IF EXISTS]\nWhen IF EXISTS and IF NOT EXISTS are used in clauses, queries will not report\nerrors when the condition is triggered for that clause. A warning with the\nsame message text will be issued and the ALTER will move on to the next clause\nin the statement (or end if finished).\n\nMariaDB starting with 10.5.2\n----------------------------\nIf this is directive is used after ALTER ... TABLE, one will not get an error\nif the table doesn\'t exist.\n\nColumn Definitions\n------------------\n\nSee CREATE TABLE: Column Definitions for information about column definitions.\n\nIndex Definitions\n-----------------\n\nSee CREATE TABLE: Index Definitions for information about index definitions.\n\nThe CREATE INDEX and DROP INDEX statements can also be used to add or remove\nan index.\n\nCharacter Sets and Collations\n-----------------------------\n\nCONVERT TO CHARACTER SET charset_name [COLLATE collation_name]\n[DEFAULT] CHARACTER SET [=] charset_name\n[DEFAULT] COLLATE [=] collation_name\nSee Setting Character Sets and Collations for details on setting the character\nsets and collations.\n\nAlter Specifications\n--------------------\n\nTable Options\n-------------\n\nSee CREATE TABLE: Table Options for information about table options.\n\nADD COLUMN\n----------\n\n... ADD COLUMN [IF NOT EXISTS] (col_name column_definition,...)\nAdds a column to the table. The syntax is the same as in CREATE TABLE. If you\nare using IF NOT_EXISTS the column will not be added if it was not there\nalready. This is very useful when doing scripts to modify tables.\n\nThe FIRST and AFTER clauses affect the physical order of columns in the\ndatafile. Use FIRST to add a column in the first (leftmost) position, or AFTER\nfollowed by a column name to add the new column in any other position. Note\nthat, nowadays, the physical position of a column is usually irrelevant.\n\nSee also Instant ADD COLUMN for InnoDB.\n\nDROP COLUMN\n-----------\n\n... DROP COLUMN [IF EXISTS] col_name [CASCADE|RESTRICT]\nDrops the column from the table. If you are using IF EXISTS you will not get\nan error if the column didn\'t exist. If the column is part of any index, the\ncolumn will be dropped from them, except if you add a new column with\nidentical name at the same time. The index will be dropped if all columns from\nthe index were dropped. If the column was used in a view or trigger, you will\nget an error next time the view or trigger is accessed.\n\nMariaDB starting with 10.2.8\n----------------------------\nDropping a column that is part of a multi-column UNIQUE constraint is not\npermitted. For example:\n\nCREATE TABLE a (\n a int,\n b int,\n primary key (a,b)\n);\n\nALTER TABLE x DROP COLUMN a;\n[42000][1072] Key column \'A\' doesn\'t exist in table\n\nThe reason is that dropping column a would result in the new constraint that\nall values in column b be unique. In order to drop the column, an explicit\nDROP PRIMARY KEY and ADD PRIMARY KEY would be required. Up until MariaDB\n10.2.7, the column was dropped and the additional constraint applied,\nresulting in the following structure:\n\nALTER TABLE x DROP COLUMN a;\nQuery OK, 0 rows affected (0.46 sec)\n\nDESC x;\n+-------+---------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-------+\n| b | int(11) | NO | PRI | NULL | |\n+-------+---------+------+-----+---------+-------+\n\nMariaDB starting with 10.4.0\n----------------------------\nMariaDB 10.4.0 supports instant DROP COLUMN. DROP COLUMN of an indexed column\nwould imply DROP INDEX (and in the case of a non-UNIQUE multi-column index,\npossibly ADD INDEX). These will not be allowed with ALGORITHM=INSTANT, but\nunlike before, they can be allowed with ALGORITHM=NOCOPY\n\nRESTRICT and CASCADE are allowed to make porting from other database systems\neasier. In MariaDB, they do nothing.\n\nMODIFY COLUMN\n-------------\n\nAllows you to modify the type of a column. The column will be at the same\nplace as the original column and all indexes on the column will be kept. Note\nthat when modifying column, you should specify all attributes for the new\ncolumn.\n\nCREATE TABLE t1 (a INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY((a));\nALTER TABLE t1 MODIFY a BIGINT UNSIGNED AUTO_INCREMENT;\n\nCHANGE COLUMN\n-------------\n\nWorks like MODIFY COLUMN except that you can also change the name of the\ncolumn. The column will be at the same place as the original column and all\nindex on the column will be kept.\n\nCREATE TABLE t1 (a INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a));\nALTER TABLE t1 CHANGE a b BIGINT UNSIGNED AUTO_INCREMENT;\n\nALTER COLUMN\n------------\n\nThis lets you change column options.\n\nCREATE TABLE t1 (a INT UNSIGNED AUTO_INCREMENT, b varchar(50), PRIMARY KEY(a));\nALTER TABLE t1 ALTER b SET DEFAULT \'hello\';\n\nRENAME INDEX/KEY\n----------------\n\nMariaDB starting with 10.5.2\n----------------------------\nFrom MariaDB 10.5.2, it is possible to rename an index using the RENAME INDEX\n(or RENAME KEY) syntax, for example:\n\nALTER TABLE t1 RENAME INDEX i_old TO i_new;\n\nRENAME COLUMN\n-------------\n\nMariaDB starting with 10.5.2\n----------------------------\nFrom MariaDB 10.5.2, it is possible to rename a column using the RENAME COLUMN\nsyntax, for example:\n\nALTER TABLE t1 RENAME COLUMN c_old TO c_new;\n\nADD PRIMARY KEY\n---------------\n\nAdd a primary key.\n\nFor PRIMARY KEY indexes, you can specify a name for the index, but it is\nsilently ignored, and the name of the index is always PRIMARY.\n\nSee Getting Started with Indexes: Primary Key for more information.\n\nDROP PRIMARY KEY\n----------------\n\nDrop a primary key.\n\nFor PRIMARY KEY indexes, you can specify a name for the index, but it is\nsilently ignored, and the name of the index is always PRIMARY.\n\nSee Getting Started with Indexes: Primary Key for more information.\n\nADD FOREIGN KEY\n---------------\n\nAdd a foreign key.\n\nFor FOREIGN KEY indexes, a reference definition must be provided.\n\nFor FOREIGN KEY indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nFirst, you have to specify the name of the target (parent) table and a column\nor a column list which must be indexed and whose values must match to the\nforeign key\'s values. The MATCH clause is accepted to improve the\ncompatibility with other DBMS\'s, but has no meaning in MariaDB. The ON DELETE\nand ON UPDATE clauses specify what must be done when a DELETE (or a REPLACE)\nstatements attempts to delete a referenced row from the parent table, and when\nan UPDATE statement attempts to modify the referenced foreign key columns in a\nparent table row, respectively. The following options are allowed:\n\n* RESTRICT: The delete/update operation is not performed. The statement\nterminates with a 1451 error (SQLSTATE \'2300\').\n* NO ACTION: Synonym for RESTRICT.\n* CASCADE: The delete/update operation is performed in both tables.\n* SET NULL: The update or delete goes ahead in the parent table, and the\ncorresponding foreign key fields in the child table are set to NULL. (They\nmust not be defined as NOT NULL for this to succeed).\n* SET DEFAULT: This option is implemented only for the legacy PBXT storage\nengine, which is disabled by default and no longer maintained. It sets the\nchild table\'s foreign key fields to their DEFAULT values when the referenced\nparent table key entries are updated or deleted.\n\nIf either clause is omitted, the default behavior for the omitted clause is\nRESTRICT.\n\nSee Foreign Keys for more information.\n\nDROP FOREIGN KEY\n----------------\n\nDrop a foreign key.\n\nSee Foreign Keys for more information.\n\nADD INDEX\n---------\n\nAdd a plain index.\n\nPlain indexes are regular indexes that are not unique, and are not acting as a\nprimary key or a foreign key. They are also not the \"specialized\" FULLTEXT or\nSPATIAL indexes.\n\nSee Getting Started with Indexes: Plain Indexes for more information.\n\nDROP INDEX\n----------\n\nDrop a plain index.\n\nPlain indexes are regular indexes that are not unique, and are not acting as a\nprimary key or a foreign key. They are also not the \"specialized\" FULLTEXT or\nSPATIAL indexes.\n\nSee Getting Started with Indexes: Plain Indexes for more information.\n\nADD UNIQUE INDEX\n----------------\n\nAdd a unique index.\n\nThe UNIQUE keyword means that the index will not accept duplicated values,','','https://mariadb.com/kb/en/alter-table/');
+update help_topic set description = CONCAT(description, '\nexcept for NULLs. An error will raise if you try to insert duplicate values in\na UNIQUE index.\n\nFor UNIQUE indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nSee Getting Started with Indexes: Unique Index for more information.\n\nDROP UNIQUE INDEX\n-----------------\n\nDrop a unique index.\n\nThe UNIQUE keyword means that the index will not accept duplicated values,\nexcept for NULLs. An error will raise if you try to insert duplicate values in\na UNIQUE index.\n\nFor UNIQUE indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nSee Getting Started with Indexes: Unique Index for more information.\n\nADD FULLTEXT INDEX\n------------------\n\nAdd a FULLTEXT index.\n\nSee Full-Text Indexes for more information.\n\nDROP FULLTEXT INDEX\n-------------------\n\nDrop a FULLTEXT index.\n\nSee Full-Text Indexes for more information.\n\nADD SPATIAL INDEX\n-----------------\n\nAdd a SPATIAL index.\n\nSee SPATIAL INDEX for more information.\n\nDROP SPATIAL INDEX\n------------------\n\nDrop a SPATIAL index.\n\nSee SPATIAL INDEX for more information.\n\nENABLE/ DISABLE KEYS\n--------------------\n\nDISABLE KEYS will disable all non unique keys for the table for storage\nengines that support this (at least MyISAM and Aria). This can be used to\nspeed up inserts into empty tables.\n\nENABLE KEYS will enable all disabled keys.\n\nRENAME TO\n---------\n\nRenames the table. See also RENAME TABLE.\n\nADD CONSTRAINT\n--------------\n\nModifies the table adding a constraint on a particular column or columns.\n\nMariaDB starting with 10.2.1\n----------------------------\nMariaDB 10.2.1 introduced new ways to define a constraint.\n\nNote: Before MariaDB 10.2.1, constraint expressions were accepted in syntax,\nbut ignored.\n\nALTER TABLE table_name \nADD CONSTRAINT [constraint_name] CHECK(expression);\nBefore a row is inserted or updated, all constraints are evaluated in the\norder they are defined. If any constraint fails, then the row will not be\nupdated. One can use most deterministic functions in a constraint, including\nUDF\'s.\n\nCREATE TABLE account_ledger (\n id INT PRIMARY KEY AUTO_INCREMENT,\n transaction_name VARCHAR(100),\n credit_account VARCHAR(100),\n credit_amount INT,\n debit_account VARCHAR(100),\n debit_amount INT);\n\nALTER TABLE account_ledger \nADD CONSTRAINT is_balanced \n CHECK((debit_amount + credit_amount) = 0);\n\nThe constraint_name is optional. If you don\'t provide one in the ALTER TABLE\nstatement, MariaDB auto-generates a name for you. This is done so that you can\nremove it later using DROP CONSTRAINT clause.\n\nYou can disable all constraint expression checks by setting the variable\ncheck_constraint_checks to OFF. You may find this useful when loading a table\nthat violates some constraints that you want to later find and fix in SQL.\n\nTo view constraints on a table, query information_schema.TABLE_CONSTRAINTS:\n\nSELECT CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE \nFROM information_schema.TABLE_CONSTRAINTS\nWHERE TABLE_NAME = \'account_ledger\';\n\n+-----------------+----------------+-----------------+\n| CONSTRAINT_NAME | TABLE_NAME | CONSTRAINT_TYPE |\n+-----------------+----------------+-----------------+\n| is_balanced | account_ledger | CHECK |\n+-----------------+----------------+-----------------+\n\nDROP CONSTRAINT\n---------------\n\nMariaDB starting with 10.2.22\n-----------------------------\nDROP CONSTRAINT for UNIQUE and FOREIGN KEY constraints was introduced in\nMariaDB 10.2.22 and MariaDB 10.3.13.\n\nMariaDB starting with 10.2.1\n----------------------------\nDROP CONSTRAINT for CHECK constraints was introduced in MariaDB 10.2.1\n\nModifies the table, removing the given constraint.\n\nALTER TABLE table_name\nDROP CONSTRAINT constraint_name;\n\nWhen you add a constraint to a table, whether through a CREATE TABLE or ALTER\nTABLE...ADD CONSTRAINT statement, you can either set a constraint_name\nyourself, or allow MariaDB to auto-generate one for you. To view constraints\non a table, query information_schema.TABLE_CONSTRAINTS. For instance,\n\nCREATE TABLE t (\n a INT,\n b INT,\n c INT,\n CONSTRAINT CHECK(a > b),\n CONSTRAINT check_equals CHECK(a = c));\n\nSELECT CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE \nFROM information_schema.TABLE_CONSTRAINTS\nWHERE TABLE_NAME = \'t\';\n\n+-----------------+----------------+-----------------+\n| CONSTRAINT_NAME | TABLE_NAME | CONSTRAINT_TYPE |\n+-----------------+----------------+-----------------+\n| check_equals | t | CHECK |\n| CONSTRAINT_1 | t | CHECK |\n+-----------------+----------------+-----------------+\n\nTo remove a constraint from the table, issue an ALTER TABLE...DROP CONSTRAINT\nstatement. For example,\n\nALTER TABLE t DROP CONSTRAINT is_unique;\n\nADD SYSTEM VERSIONING\n---------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nSystem-versioned tables was added in MariaDB 10.3.4.\n\nAdd system versioning.\n\nDROP SYSTEM VERSIONING\n----------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nSystem-versioned tables was added in MariaDB 10.3.4.\n\nDrop system versioning.\n\nADD PERIOD FOR SYSTEM_TIME\n--------------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nSystem-versioned tables was added in MariaDB 10.3.4.\n\nFORCE\n-----\n\nALTER TABLE ... FORCE can force MariaDB to re-build the table.\n\nIn MariaDB 5.5 and before, this could only be done by setting the ENGINE table\noption to its old value. For example, for an InnoDB table, one could execute\nthe following:\n\nALTER TABLE tab_name ENGINE = InnoDB;\n\nThe FORCE option can be used instead. For example, :\n\nALTER TABLE tab_name FORCE;\n\nWith InnoDB, the table rebuild will only reclaim unused space (i.e. the space\npreviously used for deleted rows) if the innodb_file_per_table system variable\nis set to ON (the default). If the system variable is OFF, then the space will\nnot be reclaimed, but it will be-re-used for new data that\'s later added.\n\nEXCHANGE PARTITION\n------------------\n\nThis is used to exchange the contents of a partition with another table.\n\nThis is performed by swapping the tablespaces of the partition with the other\ntable.\n\nSee copying InnoDB\'s transportable tablespaces for more information.\n\nDISCARD TABLESPACE\n------------------\n\nThis is used to discard an InnoDB table\'s tablespace.\n\nSee copying InnoDB\'s transportable tablespaces for more information.\n\nIMPORT TABLESPACE\n-----------------\n\nThis is used to import an InnoDB table\'s tablespace. The tablespace should\nhave been copied from its original server after executing FLUSH TABLES FOR\nEXPORT.\n\nSee copying InnoDB\'s transportable tablespaces for more information.\n\nALTER TABLE ... IMPORT only applies to InnoDB tables. Most other popular\nstorage engines, such as Aria and MyISAM, will recognize their data files as\nsoon as they\'ve been placed in the proper directory under the datadir, and no\nspecial DDL is required to import them.\n\nALGORITHM\n---------\n\nThe ALTER TABLE statement supports the ALGORITHM clause. This clause is one of\nthe clauses that is used to implement online DDL. ALTER TABLE supports several\ndifferent algorithms. An algorithm can be explicitly chosen for an ALTER TABLE\noperation by setting the ALGORITHM clause. The supported values are:\n\n* ALGORITHM=DEFAULT - This implies the default behavior for the specific\nstatement, such as if no ALGORITHM clause is specified.\n* ALGORITHM=COPY\n* ALGORITHM=INPLACE\n* ALGORITHM=NOCOPY - This was added in MariaDB 10.3.7.\n* ALGORITHM=INSTANT - This was added in MariaDB 10.3.7.\n\nSee InnoDB Online DDL Overview: ALGORITHM for information on how the ALGORITHM\nclause affects InnoDB.\n\nALGORITHM=DEFAULT\n-----------------\n\nThe default behavior, which occurs if ALGORITHM=DEFAULT is specified, or if\nALGORITHM is not specified at all, usually only makes a copy if the operation\ndoesn\'t support being done in-place at all. In this case, the most efficient\navailable algorithm will usually be used.\n\nHowever, in MariaDB 10.3.6 and before, if the value of the old_alter_table\nsystem variable is set to ON, then the default behavior is to perform ALTER\nTABLE operations by making a copy of the table using the old algorithm.\n\nIn MariaDB 10.3.7 and later, the old_alter_table system variable is\ndeprecated. Instead, the alter_algorithm system variable defines the default\nalgorithm for ALTER TABLE operations.\n\nALGORITHM=COPY\n--------------\n\nALGORITHM=COPY is the name for the original ALTER TABLE algorithm from early\nMariaDB versions.\n\nWhen ALGORITHM=COPY is set, MariaDB essentially does the following operations:\n\n-- Create a temporary table with the new definition\nCREATE TEMPORARY TABLE tmp_tab (\n...\n);\n\n-- Copy the data from the original table\nINSERT INTO tmp_tab\n SELECT * FROM original_tab;\n\n-- Drop the original table\nDROP TABLE original_tab;\n\n-- Rename the temporary table, so that it replaces the original one\nRENAME TABLE tmp_tab TO original_tab;\n\nThis algorithm is very inefficient, but it is generic, so it works for all\nstorage engines.\n\nIf ALGORITHM=COPY is specified, then the copy algorithm will be used even if\nit is not necessary. This can result in a lengthy table copy. If multiple\nALTER TABLE operations are required that each require the table to be rebuilt,\nthen it is best to specify all operations in a single ALTER TABLE statement,\nso that the table is only rebuilt once.\n\nALGORITHM=INPLACE\n-----------------\n\nALGORITHM=COPY can be incredibly slow, because the whole table has to be\ncopied and rebuilt. ALGORITHM=INPLACE was introduced as a way to avoid this by\nperforming operations in-place and avoiding the table copy and rebuild, when\npossible.\n\nWhen ALGORITHM=INPLACE is set, the underlying storage engine uses\noptimizations to perform the operation while avoiding the table copy and\nrebuild. However, INPLACE is a bit of a misnomer, since some operations may\nstill require the table to be rebuilt for some storage engines. Regardless,\nseveral operations can be performed without a full copy of the table for some\nstorage engines.\n\nA more accurate name would have been ALGORITHM=ENGINE, where ENGINE refers to\nan \"engine-specific\" algorithm.\n\nIf an ALTER TABLE operation supports ALGORITHM=INPLACE, then it can be\nperformed using optimizations by the underlying storage engine, but it may\nrebuilt.\n\nSee InnoDB Online DDL Operations with ALGORITHM=INPLACE for more.\n\nALGORITHM=NOCOPY\n----------------\n\nALGORITHM=NOCOPY was introduced in MariaDB 10.3.7.\n\nALGORITHM=INPLACE can sometimes be surprisingly slow in instances where it has\nto rebuild the clustered index, because when the clustered index has to be\nrebuilt, the whole table has to be rebuilt. ALGORITHM=NOCOPY was introduced as\na way to avoid this.\n\nIf an ALTER TABLE operation supports ALGORITHM=NOCOPY, then it can be\nperformed without rebuilding the clustered index.\n\nIf ALGORITHM=NOCOPY is specified for an ALTER TABLE operation that does not\nsupport ALGORITHM=NOCOPY, then an error will be raised. In this case, raising\nan error is preferable, if the alternative is for the operation to rebuild the\nclustered index, and perform unexpectedly slowly.\n\nSee InnoDB Online DDL Operations with ALGORITHM=NOCOPY for more.\n\nALGORITHM=INSTANT\n-----------------\n\nALGORITHM=INSTANT was introduced in MariaDB 10.3.7.\n\nALGORITHM=INPLACE can sometimes be surprisingly slow in instances where it has\nto modify data files. ALGORITHM=INSTANT was introduced as a way to avoid this.\n\nIf an ALTER TABLE operation supports ALGORITHM=INSTANT, then it can be\nperformed without modifying any data files.\n\nIf ALGORITHM=INSTANT is specified for an ALTER TABLE operation that does not\nsupport ALGORITHM=INSTANT, then an error will be raised. In this case, raising\nan error is preferable, if the alternative is for the operation to modify data\nfiles, and perform unexpectedly slowly.\n\nSee InnoDB Online DDL Operations with ALGORITHM=INSTANT for more.\n\nLOCK\n----\n\nThe ALTER TABLE statement supports the LOCK clause. This clause is one of the\nclauses that is used to implement online DDL. ALTER TABLE supports several\ndifferent locking strategies. A locking strategy can be explicitly chosen for\nan ALTER TABLE operation by setting the LOCK clause. The supported values are:\n\n* DEFAULT: Acquire the least restrictive lock on the table that is supported\nfor the specific operation. Permit the maximum amount of concurrency that is\nsupported for the specific operation.\n* NONE: Acquire no lock on the table. Permit all concurrent DML. If this\nlocking strategy is not permitted for an operation, then an error is raised.\n* SHARED: Acquire a read lock on the table. Permit read-only concurrent DML.\nIf this locking strategy is not permitted for an operation, then an error is\nraised.\n* EXCLUSIVE: Acquire a write lock on the table. Do not permit concurrent DML.\n\nDifferent storage engines support different locking strategies for different\noperations. If a specific locking strategy is chosen for an ALTER TABLE\noperation, and that table\'s storage engine does not support that locking\nstrategy for that specific operation, then an error will be raised.\n\nIf the LOCK clause is not explicitly set, then the operation uses LOCK=DEFAULT.\n\nALTER ONLINE TABLE is equivalent to LOCK=NONE. Therefore, the ALTER ONLINE\nTABLE statement can be used to ensure that your ALTER TABLE operation allows\nall concurrent DML.\n\nSee InnoDB Online DDL Overview: LOCK for information on how the LOCK clause\naffects InnoDB.\n\nProgress Reporting\n------------------\n\nMariaDB provides progress reporting for ALTER TABLE statement for clients that\nsupport the new progress reporting protocol. For example, if you were using\nthe mysql client, then the progress report might look like this::\n\nALTER TABLE test ENGINE=Aria;\nStage: 1 of 2 \'copy to tmp table\' 46% of stage\n\nThe progress report is also shown in the output of the SHOW PROCESSLIST\nstatement and in the contents of the information_schema.PROCESSLIST table.\n\nSee Progress Reporting for more information.\n\nAborting ALTER TABLE Operations\n-------------------------------\n\nIf an ALTER TABLE operation is being performed and the connection is killed,') WHERE help_topic_id = 695;
+update help_topic set description = CONCAT(description, '\nthe changes will be rolled back in a controlled manner. The rollback can be a\nslow operation as the time it takes is relative to how far the operation has\nprogressed.\n\nMariaDB starting with 10.2.13\n-----------------------------\nAborting ALTER TABLE ... ALGORITHM=COPY was made faster by removing excessive\nundo logging (MDEV-11415). This significantly shortens the time it takes to\nabort a running ALTER TABLE operation.\n\nAtomic ALTER TABLE\n------------------\n\nMariaDB starting with 10.6.1\n----------------------------\nFrom MariaDB 10.6, ALTER TABLE is atomic for most engines, including InnoDB,\nMyRocks, MyISAM and Aria (MDEV-25180). This means that if there is a crash\n(server down or power outage) during an ALTER TABLE operation, after recovery,\neither the old table and associated triggers and status will be intact, or the\nnew table will be active.\n\nIn older MariaDB versions one could get leftover #sql-alter..\',\n\'#sql-backup..\' or \'table_name.frmË\' files if the system crashed during the\nALTER TABLE operation.\n\nSee Atomic DDL for more information.\n\nReplication\n-----------\n\nMariaDB starting with 10.8.1\n----------------------------\nBefore MariaDB 10.8.1, ALTER TABLE got fully executed on the primary first,\nand only then was it replicated and started executing on replicas. From\nMariaDB 10.8.1, ALTER TABLE gains an option to replicate sooner and begin\nexecuting on replicas when it merely starts executing on the primary, not when\nit finishes. This way the replication lag caused by a heavy ALTER TABLE can be\ncompletely eliminated (MDEV-11675).\n\nExamples\n--------\n\nAdding a new column:\n\nALTER TABLE t1 ADD x INT;\n\nDropping a column:\n\nALTER TABLE t1 DROP x;\n\nModifying the type of a column:\n\nALTER TABLE t1 MODIFY x bigint unsigned;\n\nChanging the name and type of a column:\n\nALTER TABLE t1 CHANGE a b bigint unsigned auto_increment;\n\nCombining multiple clauses in a single ALTER TABLE statement, separated by\ncommas:\n\nALTER TABLE t1 DROP x, ADD x2 INT, CHANGE y y2 INT;\n\nChanging the storage engine and adding a comment:\n\nALTER TABLE t1 \n ENGINE = InnoDB\n COMMENT = \'First of three tables containing usage info\';\n\nRebuilding the table (the previous example will also rebuild the table if it\nwas already InnoDB):\n\nALTER TABLE t1 FORCE;\n\nDropping an index:\n\nALTER TABLE rooms DROP INDEX u;\n\nAdding a unique index:\n\nALTER TABLE rooms ADD UNIQUE INDEX u(room_number);\n\nFrom MariaDB 10.5.3, adding a primary key for an application-time period table\nwith a WITHOUT OVERLAPS constraint:\n\nALTER TABLE rooms ADD PRIMARY KEY(room_number, p WITHOUT OVERLAPS);\n\nFrom MariaDB 10.8.1, ALTER query can be replicated faster with the setting of\n\nSET @@SESSION.binlog_alter_two_phase = true;\n\nprior the ALTER query. Binlog would contain two event groups\n\n| master-bin.000001 | 495 | Gtid | 1 | 537 | GTID\n0-1-2 START ALTER |\n| master-bin.000001 | 537 | Query | 1 | 655 | use\n`test`; alter table t add column b int, algorithm=inplace |\n| master-bin.000001 | 655 | Gtid | 1 | 700 | GTID\n0-1-3 COMMIT ALTER id=2 |\n| master-bin.000001 | 700 | Query | 1 | 835 | use\n`test`; alter table t add column b int, algorithm=inplace |\n\nof which the first one gets delivered to replicas before ALTER is taken to\nactual execution on the primary.\n\nURL: https://mariadb.com/kb/en/alter-table/') WHERE help_topic_id = 695;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (696,38,'ALTER DATABASE','Modifies a database, changing its overall characteristics.\n\nSyntax\n------\n\nALTER {DATABASE | SCHEMA} [db_name]\n alter_specification ...\nALTER {DATABASE | SCHEMA} db_name\n UPGRADE DATA DIRECTORY NAME\n\nalter_specification:\n [DEFAULT] CHARACTER SET [=] charset_name\n | [DEFAULT] COLLATE [=] collation_name\n | COMMENT [=] \'comment\'\n\nDescription\n-----------\n\nALTER DATABASE enables you to change the overall characteristics of a\ndatabase. These characteristics are stored in the db.opt file in the database\ndirectory. To use ALTER DATABASE, you need the ALTER privilege on the\ndatabase. ALTER SCHEMA is a synonym for ALTER DATABASE.\n\nThe CHARACTER SET clause changes the default database character set. The\nCOLLATE clause changes the default database collation. See Character Sets and\nCollations for more.\n\nYou can see what character sets and collations are available using,\nrespectively, the SHOW CHARACTER SET and SHOW COLLATION statements.\n\nChanging the default character set/collation of a database does not change the\ncharacter set/collation of any stored procedures or stored functions that were\npreviously created, and relied on the defaults. These need to be dropped and\nrecreated in order to apply the character set/collation changes.\n\nThe database name can be omitted from the first syntax, in which case the\nstatement applies to the default database.\n\nThe syntax that includes the UPGRADE DATA DIRECTORY NAME clause was added in\nMySQL 5.1.23. It updates the name of the directory associated with the\ndatabase to use the encoding implemented in MySQL 5.1 for mapping database\nnames to database directory names (see Identifier to File Name Mapping). This\nclause is for use under these conditions:\n\n* It is intended when upgrading MySQL to 5.1 or later from older versions.\n* It is intended to update a database directory name to the current encoding\nformat if the name contains special characters that need encoding.\n* The statement is used by mysqlcheck (as invoked by mysql_upgrade).\n\nFor example,if a database in MySQL 5.0 has a name of a-b-c, the name contains\ninstance of the `-\' character. In 5.0, the database directory is also named\na-b-c, which is not necessarily safe for all file systems. In MySQL 5.1 and\nup, the same database name is encoded as a@002db@002dc to produce a file\nsystem-neutral directory name.\n\nWhen a MySQL installation is upgraded to MySQL 5.1 or later from an older\nversion,the server displays a name such as a-b-c (which is in the old format)\nas #mysql50#a-b-c, and you must refer to the name using the #mysql50# prefix.\nUse UPGRADE DATA DIRECTORY NAME in this case to explicitly tell the server to\nre-encode the database directory name to the current encoding format:\n\nALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME;\n\nAfter executing this statement, you can refer to the database as a-b-c without\nthe special #mysql50# prefix.\n\nCOMMENT\n-------\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, it is possible to add a comment of a maximum of 1024\nbytes. If the comment length exceeds this length, a error/warning code 4144 is\nthrown. The database comment is also added to the db.opt file, as well as to\nthe information_schema.schemata table.\n\nExamples\n--------\n\nALTER DATABASE test CHARACTER SET=\'utf8\' COLLATE=\'utf8_bin\';\n\nFrom MariaDB 10.5.0:\n\nALTER DATABASE p COMMENT=\'Presentations\';\n\nURL: https://mariadb.com/kb/en/alter-database/','','https://mariadb.com/kb/en/alter-database/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (697,38,'ALTER EVENT','Modifies one or more characteristics of an existing event.\n\nSyntax\n------\n\nALTER\n [DEFINER = { user | CURRENT_USER }]\n EVENT event_name\n [ON SCHEDULE schedule]\n [ON COMPLETION [NOT] PRESERVE]\n [RENAME TO new_event_name]\n [ENABLE | DISABLE | DISABLE ON SLAVE]\n [COMMENT \'comment\']\n [DO sql_statement]\n\nDescription\n-----------\n\nThe ALTER EVENT statement is used to change one or more of the characteristics\nof an existing event without the need to drop and recreate it. The syntax for\neach of the DEFINER, ON SCHEDULE, ON COMPLETION, COMMENT, ENABLE / DISABLE,\nand DO clauses is exactly the same as when used with CREATE EVENT.\n\nThis statement requires the EVENT privilege. When a user executes a successful\nALTER EVENT statement, that user becomes the definer for the affected event.\n\n(In MySQL 5.1.11 and earlier, an event could be altered only by its definer,\nor by a user having the SUPER privilege.)\n\nALTER EVENT works only with an existing event:\n\nALTER EVENT no_such_event ON SCHEDULE EVERY \'2:3\' DAY_HOUR;\nERROR 1539 (HY000): Unknown event \'no_such_event\'\n\nExamples\n--------\n\nALTER EVENT myevent \n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n\nURL: https://mariadb.com/kb/en/alter-event/','','https://mariadb.com/kb/en/alter-event/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (698,38,'ALTER FUNCTION','Syntax\n------\n\nALTER FUNCTION func_name [characteristic ...]\n\ncharacteristic:\n { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n\nDescription\n-----------\n\nThis statement can be used to change the characteristics of a stored function.\nMore than one change may be specified in an ALTER FUNCTION statement. However,\nyou cannot change the parameters or body of a stored function using this\nstatement; to make such changes, you must drop and re-create the function\nusing DROP FUNCTION and CREATE FUNCTION.\n\nYou must have the ALTER ROUTINE privilege for the function. (That privilege is\ngranted automatically to the function creator.) If binary logging is enabled,\nthe ALTER FUNCTION statement might also require the SUPER privilege, as\ndescribed in Binary Logging of Stored Routines.\n\nExample\n-------\n\nALTER FUNCTION hello SQL SECURITY INVOKER;\n\nURL: https://mariadb.com/kb/en/alter-function/','','https://mariadb.com/kb/en/alter-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (699,38,'ALTER LOGFILE GROUP','Syntax\n------\n\nALTER LOGFILE GROUP logfile_group\n ADD UNDOFILE \'file_name\'\n [INITIAL_SIZE [=] size]\n [WAIT]\n ENGINE [=] engine_name\n\nThe ALTER LOGFILE GROUP statement is not supported by MariaDB. It was\noriginally inherited from MySQL NDB Cluster. See MDEV-19295 for more\ninformation.\n\nURL: https://mariadb.com/kb/en/alter-logfile-group/','','https://mariadb.com/kb/en/alter-logfile-group/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (700,38,'ALTER PROCEDURE','Syntax\n------\n\nALTER PROCEDURE proc_name [characteristic ...]\n\ncharacteristic:\n { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n\nDescription\n-----------\n\nThis statement can be used to change the characteristics of a stored\nprocedure. More than one change may be specified in an ALTER PROCEDURE\nstatement. However, you cannot change the parameters or body of a stored\nprocedure using this statement. To make such changes, you must drop and\nre-create the procedure using either CREATE OR REPLACE PROCEDURE (since\nMariaDB 10.1.3) or DROP PROCEDURE and CREATE PROCEDURE (MariaDB 10.1.2 and\nbefore).\n\nYou must have the ALTER ROUTINE privilege for the procedure. By default, that\nprivilege is granted automatically to the procedure creator. See Stored\nRoutine Privileges.\n\nExample\n-------\n\nALTER PROCEDURE simpleproc SQL SECURITY INVOKER;\n\nURL: https://mariadb.com/kb/en/alter-procedure/','','https://mariadb.com/kb/en/alter-procedure/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (701,38,'ALTER SERVER','Syntax\n------\n\nALTER SERVER server_name\n OPTIONS (option [, option] ...)\n\nDescription\n-----------\n\nAlters the server information for server_name, adjusting the specified options\nas per the CREATE SERVER command. The corresponding fields in the\nmysql.servers table are updated accordingly. This statement requires the SUPER\nprivilege or, from MariaDB 10.5.2, the FEDERATED ADMIN privilege.\n\nALTER SERVER is not written to the binary log, irrespective of the binary log\nformat being used. From MariaDB 10.1.13, Galera replicates the CREATE SERVER,\nALTER SERVER and DROP SERVER statements.\n\nExamples\n--------\n\nALTER SERVER s OPTIONS (USER \'sally\');\n\nURL: https://mariadb.com/kb/en/alter-server/','','https://mariadb.com/kb/en/alter-server/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (702,38,'ALTER TABLESPACE','The ALTER TABLESPACE statement is not supported by MariaDB. It was originally\ninherited from MySQL NDB Cluster. In MySQL 5.7 and later, the statement is\nalso supported for InnoDB. However, MariaDB has chosen not to include that\nspecific feature. See MDEV-19294 for more information.\n\nURL: https://mariadb.com/kb/en/alter-tablespace/','','https://mariadb.com/kb/en/alter-tablespace/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (703,38,'ALTER VIEW','Syntax\n------\n\nALTER\n [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\n [DEFINER = { user | CURRENT_USER }]\n [SQL SECURITY { DEFINER | INVOKER }]\n VIEW view_name [(column_list)]\n AS select_statement\n [WITH [CASCADED | LOCAL] CHECK OPTION]\n\nDescription\n-----------\n\nThis statement changes the definition of a view, which must exist. The syntax\nis similar to that for CREATE VIEW and the effect is the same as for CREATE OR\nREPLACE VIEW if the view exists. This statement requires the CREATE VIEW and\nDROP privileges for the view, and some privilege for each column referred to\nin the SELECT statement. ALTER VIEW is allowed only to the definer or users\nwith the SUPER privilege.\n\nExample\n-------\n\nALTER VIEW v AS SELECT a, a*3 AS a2 FROM t;\n\nURL: https://mariadb.com/kb/en/alter-view/','','https://mariadb.com/kb/en/alter-view/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (704,38,'CREATE TABLE','Syntax\n------\n\nCREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name\n (create_definition,...) [table_options ]... [partition_options]\nCREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name\n [(create_definition,...)] [table_options ]... [partition_options]\n select_statement\nCREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name\n { LIKE old_table_name | (LIKE old_table_name) }\nselect_statement:\n [IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement)\n\nDescription\n-----------\n\nUse the CREATE TABLE statement to create a table with the given name.\n\nIn its most basic form, the CREATE TABLE statement provides a table name\nfollowed by a list of columns, indexes, and constraints. By default, the table\nis created in the default database. Specify a database with db_name.tbl_name.\nIf you quote the table name, you must quote the database name and table name\nseparately as `db_name`.`tbl_name`. This is particularly useful for CREATE\nTABLE ... SELECT, because it allows to create a table into a database, which\ncontains data from other databases. See Identifier Qualifiers.\n\nIf a table with the same name exists, error 1050 results. Use IF NOT EXISTS to\nsuppress this error and issue a note instead. Use SHOW WARNINGS to see notes.\n\nThe CREATE TABLE statement automatically commits the current transaction,\nexcept when using the TEMPORARY keyword.\n\nFor valid identifiers to use as table names, see Identifier Names.\n\nNote: if the default_storage_engine is set to ColumnStore then it needs\nsetting on all UMs. Otherwise when the tables using the default engine are\nreplicated across UMs they will use the wrong engine. You should therefore not\nuse this option as a session variable with ColumnStore.\n\nMicrosecond precision can be between 0-6. If no precision is specified it is\nassumed to be 0, for backward compatibility reasons.\n\nPrivileges\n----------\n\nExecuting the CREATE TABLE statement requires the CREATE privilege for the\ntable or the database.\n\nCREATE OR REPLACE\n-----------------\n\nIf the OR REPLACE clause is used and the table already exists, then instead of\nreturning an error, the server will drop the existing table and replace it\nwith the newly defined table.\n\nThis syntax was originally added to make replication more robust if it has to\nrollback and repeat statements such as CREATE ... SELECT on replicas.\n\nCREATE OR REPLACE TABLE table_name (a int);\n\nis basically the same as:\n\nDROP TABLE IF EXISTS table_name;\nCREATE TABLE table_name (a int);\n\nwith the following exceptions:\n\n* If table_name was locked with LOCK TABLES it will continue to be locked\nafter the statement.\n* Temporary tables are only dropped if the TEMPORARY keyword was used. (With\nDROP TABLE, temporary tables are preferred to be dropped before normal\ntables).\n\nThings to be Aware of With CREATE OR REPLACE\n--------------------------------------------\n\n* The table is dropped first (if it existed), after that the CREATE is done.\nBecause of this, if the CREATE fails, then the table will not exist anymore\nafter the statement. If the table was used with LOCK TABLES it will be\nunlocked.\n* One can\'t use OR REPLACE together with IF EXISTS.\n* Slaves in replication will by default use CREATE OR REPLACE when replicating\nCREATE statements that don\'\'t use IF EXISTS. This can be changed by setting\nthe variable slave-ddl-exec-mode to STRICT.\n\nCREATE TABLE IF NOT EXISTS\n--------------------------\n\nIf the IF NOT EXISTS clause is used, then the table will only be created if a\ntable with the same name does not already exist. If the table already exists,\nthen a warning will be triggered by default.\n\nCREATE TEMPORARY TABLE\n----------------------\n\nUse the TEMPORARY keyword to create a temporary table that is only available\nto the current session. Temporary tables are dropped when the session ends.\nTemporary table names are specific to the session. They will not conflict with\nother temporary tables from other sessions even if they share the same name.\nThey will shadow names of non-temporary tables or views, if they are\nidentical. A temporary table can have the same name as a non-temporary table\nwhich is located in the same database. In that case, their name will reference\nthe temporary table when used in SQL statements. You must have the CREATE\nTEMPORARY TABLES privilege on the database to create temporary tables. If no\nstorage engine is specified, the default_tmp_storage_engine setting will\ndetermine the engine.\n\nROCKSDB temporary tables cannot be created by setting the\ndefault_tmp_storage_engine system variable, or using CREATE TEMPORARY TABLE\nLIKE. Before MariaDB 10.7, they could be specified, but would silently fail,\nand a MyISAM table would be created instead. From MariaDB 10.7 an error is\nreturned. Explicitly creating a temporary table with ENGINE=ROCKSDB has never\nbeen permitted.\n\nCREATE TABLE ... LIKE\n---------------------\n\nUse the LIKE clause instead of a full table definition to create a table with\nthe same definition as another table, including columns, indexes, and table\noptions. Foreign key definitions, as well as any DATA DIRECTORY or INDEX\nDIRECTORY table options specified on the original table, will not be created.\n\nCREATE TABLE ... SELECT\n-----------------------\n\nYou can create a table containing data from other tables using the CREATE ...\nSELECT statement. Columns will be created in the table for each field returned\nby the SELECT query.\n\nYou can also define some columns normally and add other columns from a SELECT.\nYou can also create columns in the normal way and assign them some values\nusing the query, this is done to force a certain type or other field\ncharacteristics. The columns that are not named in the query will be placed\nbefore the others. For example:\n\nCREATE TABLE test (a INT NOT NULL, b CHAR(10)) ENGINE=MyISAM\n SELECT 5 AS b, c, d FROM another_table;\n\nRemember that the query just returns data. If you want to use the same\nindexes, or the same columns attributes ([NOT] NULL, DEFAULT, AUTO_INCREMENT)\nin the new table, you need to specify them manually. Types and sizes are not\nautomatically preserved if no data returned by the SELECT requires the full\nsize, and VARCHAR could be converted into CHAR. The CAST() function can be\nused to forcee the new table to use certain types.\n\nAliases (AS) are taken into account, and they should always be used when you\nSELECT an expression (function, arithmetical operation, etc).\n\nIf an error occurs during the query, the table will not be created at all.\n\nIf the new table has a primary key or UNIQUE indexes, you can use the IGNORE\nor REPLACE keywords to handle duplicate key errors during the query. IGNORE\nmeans that the newer values must not be inserted an identical value exists in\nthe index. REPLACE means that older values must be overwritten.\n\nIf the columns in the new table are more than the rows returned by the query,\nthe columns populated by the query will be placed after other columns. Note\nthat if the strict SQL_MODE is on, and the columns that are not names in the\nquery do not have a DEFAULT value, an error will raise and no rows will be\ncopied.\n\nConcurrent inserts are not used during the execution of a CREATE ... SELECT.\n\nIf the table already exists, an error similar to the following will be\nreturned:\n\nERROR 1050 (42S01): Table \'t\' already exists\n\nIf the IF NOT EXISTS clause is used and the table exists, a note will be\nproduced instead of an error.\n\nTo insert rows from a query into an existing table, INSERT ... SELECT can be\nused.\n\nColumn Definitions\n------------------\n\ncreate_definition:\n { col_name column_definition | index_definition | period_definition | CHECK\n(expr) }\ncolumn_definition:\n data_type\n [NOT NULL | NULL] [DEFAULT default_value | (expression)]\n [ON UPDATE [NOW | CURRENT_TIMESTAMP] [(precision)]]\n [AUTO_INCREMENT] [ZEROFILL] [UNIQUE [KEY] | [PRIMARY] KEY]\n [INVISIBLE] [{WITH|WITHOUT} SYSTEM VERSIONING]\n [COMMENT \'string\'] [REF_SYSTEM_ID = value]\n [reference_definition]\n | data_type [GENERATED ALWAYS]\n AS { { ROW {START|END} } | { (expression) [VIRTUAL | PERSISTENT | STORED] } }\n [UNIQUE [KEY]] [COMMENT \'string\']\nconstraint_definition:\n CONSTRAINT [constraint_name] CHECK (expression)\nNote: Until MariaDB 10.4, MariaDB accepts the shortcut format with a\nREFERENCES clause only in ALTER TABLE and CREATE TABLE statements, but that\nsyntax does nothing. For example:\n\nCREATE TABLE b(for_key INT REFERENCES a(not_key));\n\nMariaDB simply parses it without returning any error or warning, for\ncompatibility with other DBMS\'s. Before MariaDB 10.2.1 this was also true for\nCHECK constraints. However, only the syntax described below creates foreign\nkeys.\n\nFrom MariaDB 10.5, MariaDB will attempt to apply the constraint. See Foreign\nKeys examples.\n\nEach definition either creates a column in the table or specifies and index or\nconstraint on one or more columns. See Indexes below for details on creating\nindexes.\n\nCreate a column by specifying a column name and a data type, optionally\nfollowed by column options. See Data Types for a full list of data types\nallowed in MariaDB.\n\nNULL and NOT NULL\n-----------------\n\nUse the NULL or NOT NULL options to specify that values in the column may or\nmay not be NULL, respectively. By default, values may be NULL. See also NULL\nValues in MariaDB.\n\nDEFAULT Column Option\n---------------------\n\nMariaDB starting with 10.2.1\n----------------------------\nThe DEFAULT clause was enhanced in MariaDB 10.2.1. Some enhancements include\n\n* BLOB and TEXT columns now support DEFAULT.\n* The DEFAULT clause can now be used with an expression or function.\n\nSpecify a default value using the DEFAULT clause. If you don\'t specify DEFAULT\nthen the following rules apply:\n\n* If the column is not defined with NOT NULL, AUTO_INCREMENT or TIMESTAMP, an\nexplicit DEFAULT NULL will be added.\nNote that in MySQL and in MariaDB before 10.1.6, you may get an explicit\nDEFAULT for primary key parts, if not specified with NOT NULL.\n\nThe default value will be used if you INSERT a row without specifying a value\nfor that column, or if you specify DEFAULT for that column. Before MariaDB\n10.2.1 you couldn\'t usually provide an expression or function to evaluate at\ninsertion time. You had to provide a constant default value instead. The one\nexception is that you may use CURRENT_TIMESTAMP as the default value for a\nTIMESTAMP column to use the current timestamp at insertion time.\n\nCURRENT_TIMESTAMP may also be used as the default value for a DATETIME\n\nFrom MariaDB 10.2.1 you can use most functions in DEFAULT. Expressions should\nhave parentheses around them. If you use a non deterministic function in\nDEFAULT then all inserts to the table will be replicated in row mode. You can\neven refer to earlier columns in the DEFAULT expression (excluding\nAUTO_INCREMENT columns):\n\nCREATE TABLE t1 (a int DEFAULT (1+1), b int DEFAULT (a+1));\nCREATE TABLE t2 (a bigint primary key DEFAULT UUID_SHORT());\n\nThe DEFAULT clause cannot contain any stored functions or subqueries, and a\ncolumn used in the clause must already have been defined earlier in the\nstatement.\n\nSince MariaDB 10.2.1, it is possible to assign BLOB or TEXT columns a DEFAULT\nvalue. In earlier versions, assigning a default to these columns was not\npossible.\n\nMariaDB starting with 10.3.3\n----------------------------\nStarting from 10.3.3 you can also use DEFAULT (NEXT VALUE FOR sequence)\n\nAUTO_INCREMENT Column Option\n----------------------------\n\nUse AUTO_INCREMENT to create a column whose value can can be set automatically\nfrom a simple counter. You can only use AUTO_INCREMENT on a column with an\ninteger type. The column must be a key, and there can only be one\nAUTO_INCREMENT column in a table. If you insert a row without specifying a\nvalue for that column (or if you specify 0, NULL, or DEFAULT as the value),\nthe actual value will be taken from the counter, with each insertion\nincrementing the counter by one. You can still insert a value explicitly. If\nyou insert a value that is greater than the current counter value, the counter\nis set based on the new value. An AUTO_INCREMENT column is implicitly NOT\nNULL. Use LAST_INSERT_ID to get the AUTO_INCREMENT value most recently used by\nan INSERT statement.\n\nZEROFILL Column Option\n----------------------\n\nIf the ZEROFILL column option is specified for a column using a numeric data\ntype, then the column will be set to UNSIGNED and the spaces used by default\nto pad the field are replaced with zeros. ZEROFILL is ignored in expressions\nor as part of a UNION. ZEROFILL is a non-standard MySQL and MariaDB\nenhancement.\n\nPRIMARY KEY Column Option\n-------------------------\n\nUse PRIMARY KEY to make a column a primary key. A primary key is a special\ntype of a unique key. There can be at most one primary key per table, and it\nis implicitly NOT NULL.\n\nSpecifying a column as a unique key creates a unique index on that column. See\nthe Index Definitions section below for more information.\n\nUNIQUE KEY Column Option\n------------------------\n\nUse UNIQUE KEY (or just UNIQUE) to specify that all values in the column must\nbe distinct from each other. Unless the column is NOT NULL, there may be\nmultiple rows with NULL in the column.\n\nSpecifying a column as a unique key creates a unique index on that column. See\nthe Index Definitions section below for more information.\n\nCOMMENT Column Option\n---------------------\n\nYou can provide a comment for each column using the COMMENT clause. The\nmaximum length is 1024 characters. Use the SHOW FULL COLUMNS statement to see\ncolumn comments.\n\nREF_SYSTEM_ID\n-------------\n\nREF_SYSTEM_ID can be used to specify Spatial Reference System IDs for spatial\ndata type columns. For example:\n\nCREATE TABLE t1(g GEOMETRY(9,4) REF_SYSTEM_ID=101);\n\nGenerated Columns\n-----------------\n\nA generated column is a column in a table that cannot explicitly be set to a\nspecific value in a DML query. Instead, its value is automatically generated\nbased on an expression. This expression might generate the value based on the\nvalues of other columns in the table, or it might generate the value by\ncalling built-in functions or user-defined functions (UDFs).\n\nThere are two types of generated columns:\n\n* PERSISTENT or STORED: This type\'s value is actually stored in the table.','','https://mariadb.com/kb/en/create-table/');
+update help_topic set description = CONCAT(description, '\n* VIRTUAL: This type\'s value is not stored at all. Instead, the value is\ngenerated dynamically when the table is queried. This type is the default.\n\nGenerated columns are also sometimes called computed columns or virtual\ncolumns.\n\nFor a complete description about generated columns and their limitations, see\nGenerated (Virtual and Persistent/Stored) Columns.\n\nCOMPRESSED\n----------\n\nMariaDB starting with 10.3.3\n----------------------------\nCertain columns may be compressed. See Storage-Engine Independent Column\nCompression.\n\nINVISIBLE\n---------\n\nMariaDB starting with 10.3.3\n----------------------------\nColumns may be made invisible, and hidden in certain contexts. See Invisible\nColumns.\n\nWITH SYSTEM VERSIONING Column Option\n------------------------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nColumns may be explicitly marked as included from system versioning. See\nSystem-versioned tables for details.\n\nWITHOUT SYSTEM VERSIONING Column Option\n---------------------------------------\n\nMariaDB starting with 10.3.4\n----------------------------\nColumns may be explicitly marked as excluded from system versioning. See\nSystem-versioned tables for details.\n\nIndex Definitions\n-----------------\n\nindex_definition:\n {INDEX|KEY} [index_name] [index_type] (index_col_name,...) [index_option]\n...\n {{{|}}} {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)\n[index_option] ...\n {{{|}}} [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)\n[index_option] ...\n {{{|}}} [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type]\n(index_col_name,...) [index_option] ...\n {{{|}}} [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)\nreference_definition\n\nindex_col_name:\n col_name [(length)] [ASC | DESC]\n\nindex_type:\n USING {BTREE | HASH | RTREE}\n\nindex_option:\n [ KEY_BLOCK_SIZE [=] value\n {{{|}}} index_type\n {{{|}}} WITH PARSER parser_name\n {{{|}}} COMMENT \'string\'\n {{{|}}} CLUSTERING={YES| NO} ]\n [ IGNORED | NOT IGNORED ]\n\nreference_definition:\n REFERENCES tbl_name (index_col_name,...)\n [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]\n [ON DELETE reference_option]\n [ON UPDATE reference_option]\n\nreference_option:\n RESTRICT | CASCADE | SET NULL | NO ACTION\n\nINDEX and KEY are synonyms.\n\nIndex names are optional, if not specified an automatic name will be assigned.\nIndex name are needed to drop indexes and appear in error messages when a\nconstraint is violated.\n\nIndex Categories\n----------------\n\nPlain Indexes\n-------------\n\nPlain indexes are regular indexes that are not unique, and are not acting as a\nprimary key or a foreign key. They are also not the \"specialized\" FULLTEXT or\nSPATIAL indexes.\n\nSee Getting Started with Indexes: Plain Indexes for more information.\n\nPRIMARY KEY\n-----------\n\nFor PRIMARY KEY indexes, you can specify a name for the index, but it is\nignored, and the name of the index is always PRIMARY. From MariaDB 10.3.18 and\nMariaDB 10.4.8, a warning is explicitly issued if a name is specified. Before\nthen, the name was silently ignored.\n\nSee Getting Started with Indexes: Primary Key for more information.\n\nUNIQUE\n------\n\nThe UNIQUE keyword means that the index will not accept duplicated values,\nexcept for NULLs. An error will raise if you try to insert duplicate values in\na UNIQUE index.\n\nFor UNIQUE indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nSee Getting Started with Indexes: Unique Index for more information.\n\nFOREIGN KEY\n-----------\n\nFor FOREIGN KEY indexes, a reference definition must be provided.\n\nFor FOREIGN KEY indexes, you can specify a name for the constraint, using the\nCONSTRAINT keyword. That name will be used in error messages.\n\nFirst, you have to specify the name of the target (parent) table and a column\nor a column list which must be indexed and whose values must match to the\nforeign key\'s values. The MATCH clause is accepted to improve the\ncompatibility with other DBMS\'s, but has no meaning in MariaDB. The ON DELETE\nand ON UPDATE clauses specify what must be done when a DELETE (or a REPLACE)\nstatements attempts to delete a referenced row from the parent table, and when\nan UPDATE statement attempts to modify the referenced foreign key columns in a\nparent table row, respectively. The following options are allowed:\n\n* RESTRICT: The delete/update operation is not performed. The statement\nterminates with a 1451 error (SQLSTATE \'2300\').\n* NO ACTION: Synonym for RESTRICT.\n* CASCADE: The delete/update operation is performed in both tables.\n* SET NULL: The update or delete goes ahead in the parent table, and the\ncorresponding foreign key fields in the child table are set to NULL. (They\nmust not be defined as NOT NULL for this to succeed).\n* SET DEFAULT: This option is currently implemented only for the PBXT storage\nengine, which is disabled by default and no longer maintained. It sets the\nchild table\'s foreign key fields to their DEFAULT values when the referenced\nparent table key entries are updated or deleted.\n\nIf either clause is omitted, the default behavior for the omitted clause is\nRESTRICT.\n\nSee Foreign Keys for more information.\n\nFULLTEXT\n--------\n\nUse the FULLTEXT keyword to create full-text indexes.\n\nSee Full-Text Indexes for more information.\n\nSPATIAL\n-------\n\nUse the SPATIAL keyword to create geometric indexes.\n\nSee SPATIAL INDEX for more information.\n\nIndex Options\n-------------\n\nKEY_BLOCK_SIZE Index Option\n---------------------------\n\nThe KEY_BLOCK_SIZE index option is similar to the KEY_BLOCK_SIZE table option.\n\nWith the InnoDB storage engine, if you specify a non-zero value for the\nKEY_BLOCK_SIZE table option for the whole table, then the table will\nimplicitly be created with the ROW_FORMAT table option set to COMPRESSED.\nHowever, this does not happen if you just set the KEY_BLOCK_SIZE index option\nfor one or more indexes in the table. The InnoDB storage engine ignores the\nKEY_BLOCK_SIZE index option. However, the SHOW CREATE TABLE statement may\nstill report it for the index.\n\nFor information about the KEY_BLOCK_SIZE index option, see the KEY_BLOCK_SIZE\ntable option below.\n\nIndex Types\n-----------\n\nEach storage engine supports some or all index types. See Storage Engine Index\nTypes for details on permitted index types for each storage engine.\n\nDifferent index types are optimized for different kind of operations:\n\n* BTREE is the default type, and normally is the best choice. It is supported\nby all storage engines. It can be used to compare a column\'s value with a\nvalue using the =, >, >=, <, <=, BETWEEN, and LIKE operators. BTREE can also\nbe used to find NULL values. Searches against an index prefix are possible.\n* HASH is only supported by the MEMORY storage engine. HASH indexes can only\nbe used for =, <=, and >= comparisons. It can not be used for the ORDER BY\nclause. Searches against an index prefix are not possible.\n* RTREE is the default for SPATIAL indexes, but if the storage engine does not\nsupport it BTREE can be used.\n\nIndex columns names are listed between parenthesis. After each column, a\nprefix length can be specified. If no length is specified, the whole column\nwill be indexed. ASC and DESC can be specified for compatibility with are\nDBMS\'s, but have no meaning in MariaDB.\n\nWITH PARSER Index Option\n------------------------\n\nThe WITH PARSER index option only applies to FULLTEXT indexes and contains the\nfulltext parser name. The fulltext parser must be an installed plugin.\n\nCOMMENT Index Option\n--------------------\n\nA comment of up to 1024 characters is permitted with the COMMENT index option.\n\nThe COMMENT index option allows you to specify a comment with user-readable\ntext describing what the index is for. This information is not used by the\nserver itself.\n\nCLUSTERING Index Option\n-----------------------\n\nThe CLUSTERING index option is only valid for tables using the TokuDB storage\nengine.\n\nIGNORED / NOT IGNORED\n---------------------\n\nMariaDB starting with 10.6.0\n----------------------------\nFrom MariaDB 10.6.0, indexes can be specified to be ignored by the optimizer.\nSee Ignored Indexes.\n\nPeriods\n-------\n\nMariaDB starting with 10.3.4\n----------------------------\n\nperiod_definition:\n PERIOD FOR SYSTEM_TIME (start_column_name, end_column_name)\nMariaDB supports a subset of the standard syntax for periods. At the moment\nit\'s only used for creating System-versioned tables. Both columns must be\ncreated, must be either of a TIMESTAMP(6) or BIGINT UNSIGNED type, and be\ngenerated as ROW START and ROW END accordingly. See System-versioned tables\nfor details.\n\nThe table must also have the WITH SYSTEM VERSIONING clause.\n\nConstraint Expressions\n----------------------\n\nMariaDB starting with 10.2.1\n----------------------------\nMariaDB 10.2.1 introduced new ways to define a constraint.\n\nNote: Before MariaDB 10.2.1, constraint expressions were accepted in the\nsyntax but ignored.\n\nMariaDB 10.2.1 introduced two ways to define a constraint:\n\n* CHECK(expression) given as part of a column definition.\n* CONSTRAINT [constraint_name] CHECK (expression)\n\nBefore a row is inserted or updated, all constraints are evaluated in the\norder they are defined. If any constraints fails, then the row will not be\nupdated. One can use most deterministic functions in a constraint, including\nUDFs.\n\ncreate table t1 (a int check(a>0) ,b int check (b> 0), constraint abc check\n(a>b));\n\nIf you use the second format and you don\'t give a name to the constraint, then\nthe constraint will get a auto generated name. This is done so that you can\nlater delete the constraint with ALTER TABLE DROP constraint_name.\n\nOne can disable all constraint expression checks by setting the variable\ncheck_constraint_checks to OFF. This is useful for example when loading a\ntable that violates some constraints that you want to later find and fix in\nSQL.\n\nSee CONSTRAINT for more information.\n\nTable Options\n-------------\n\nFor each individual table you create (or alter), you can set some table\noptions. The general syntax for setting options is:\n\n<OPTION_NAME> = <option_value>, [<OPTION_NAME> = <option_value> ...]\n\nThe equal sign is optional.\n\nSome options are supported by the server and can be used for all tables, no\nmatter what storage engine they use; other options can be specified for all\nstorage engines, but have a meaning only for some engines. Also, engines can\nextend CREATE TABLE with new options.\n\nIf the IGNORE_BAD_TABLE_OPTIONS SQL_MODE is enabled, wrong table options\ngenerate a warning; otherwise, they generate an error.\n\ntable_option: \n [STORAGE] ENGINE [=] engine_name\n | AUTO_INCREMENT [=] value\n | AVG_ROW_LENGTH [=] value\n | [DEFAULT] CHARACTER SET [=] charset_name\n | CHECKSUM [=] {0 | 1}\n | [DEFAULT] COLLATE [=] collation_name\n | COMMENT [=] \'string\'\n | CONNECTION [=] \'connect_string\'\n | DATA DIRECTORY [=] \'absolute path to directory\'\n | DELAY_KEY_WRITE [=] {0 | 1}\n | ENCRYPTED [=] {YES | NO}\n | ENCRYPTION_KEY_ID [=] value\n | IETF_QUOTES [=] {YES | NO}\n | INDEX DIRECTORY [=] \'absolute path to directory\'\n | INSERT_METHOD [=] { NO | FIRST | LAST }\n | KEY_BLOCK_SIZE [=] value\n | MAX_ROWS [=] value\n | MIN_ROWS [=] value\n | PACK_KEYS [=] {0 | 1 | DEFAULT}\n | PAGE_CHECKSUM [=] {0 | 1}\n | PAGE_COMPRESSED [=] {0 | 1}\n | PAGE_COMPRESSION_LEVEL [=] {0 .. 9}\n | PASSWORD [=] \'string\'\n | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT|PAGE}\n | SEQUENCE [=] {0|1}\n | STATS_AUTO_RECALC [=] {DEFAULT|0|1}\n | STATS_PERSISTENT [=] {DEFAULT|0|1}\n | STATS_SAMPLE_PAGES [=] {DEFAULT|value}\n | TABLESPACE tablespace_name\n | TRANSACTIONAL [=] {0 | 1}\n | UNION [=] (tbl_name[,tbl_name]...)\n | WITH SYSTEM VERSIONING\n\n[STORAGE] ENGINE\n----------------\n\n[STORAGE] ENGINE specifies a storage engine for the table. If this option is\nnot used, the default storage engine is used instead. That is, the\ndefault_storage_engine session option value if it is set, or the value\nspecified for the --default-storage-engine mysqld startup option, or the\ndefault storage engine, InnoDB. If the specified storage engine is not\ninstalled and active, the default value will be used, unless the\nNO_ENGINE_SUBSTITUTION SQL MODE is set (default). This is only true for CREATE\nTABLE, not for ALTER TABLE. For a list of storage engines that are present in\nyour server, issue a SHOW ENGINES.\n\nAUTO_INCREMENT\n--------------\n\nAUTO_INCREMENT specifies the initial value for the AUTO_INCREMENT primary key.\nThis works for MyISAM, Aria, InnoDB, MEMORY, and ARCHIVE tables. You can\nchange this option with ALTER TABLE, but in that case the new value must be\nhigher than the highest value which is present in the AUTO_INCREMENT column.\nIf the storage engine does not support this option, you can insert (and then\ndelete) a row having the wanted value - 1 in the AUTO_INCREMENT column.\n\nAVG_ROW_LENGTH\n--------------\n\nAVG_ROW_LENGTH is the average rows size. It only applies to tables using\nMyISAM and Aria storage engines that have the ROW_FORMAT table option set to\nFIXED format.\n\nMyISAM uses MAX_ROWS and AVG_ROW_LENGTH to decide the maximum size of a table\n(default: 256TB, or the maximum file size allowed by the system).\n\n[DEFAULT] CHARACTER SET/CHARSET\n-------------------------------\n\n[DEFAULT] CHARACTER SET (or [DEFAULT] CHARSET) is used to set a default\ncharacter set for the table. This is the character set used for all columns\nwhere an explicit character set is not specified. If this option is omitted or\nDEFAULT is specified, database\'s default character set will be used. See\nSetting Character Sets and Collations for details on setting the character\nsets.\n\nCHECKSUM/TABLE_CHECKSUM\n-----------------------\n\nCHECKSUM (or TABLE_CHECKSUM) can be set to 1 to maintain a live checksum for\nall table\'s rows. This makes write operations slower, but CHECKSUM TABLE will\nbe very fast. This option is only supported for MyISAM and Aria tables.\n\n[DEFAULT] COLLATE\n-----------------\n\n[DEFAULT] COLLATE is used to set a default collation for the table. This is\nthe collation used for all columns where an explicit character set is not\nspecified. If this option is omitted or DEFAULT is specified, database\'s') WHERE help_topic_id = 704;
+update help_topic set description = CONCAT(description, '\ndefault option will be used. See Setting Character Sets and Collations for\ndetails on setting the collations\n\nCOMMENT\n-------\n\nCOMMENT is a comment for the table. The maximum length is 2048 characters.\nAlso used to define table parameters when creating a Spider table.\n\nCONNECTION\n----------\n\nCONNECTION is used to specify a server name or a connection string for a\nSpider, CONNECT, Federated or FederatedX table.\n\nDATA DIRECTORY/INDEX DIRECTORY\n------------------------------\n\nDATA DIRECTORY and INDEX DIRECTORY are supported for MyISAM and Aria, and DATA\nDIRECTORY is also supported by InnoDB if the innodb_file_per_table server\nsystem variable is enabled, but only in CREATE TABLE, not in ALTER TABLE. So,\ncarefully choose a path for InnoDB tables at creation time, because it cannot\nbe changed without dropping and re-creating the table. These options specify\nthe paths for data files and index files, respectively. If these options are\nomitted, the database\'s directory will be used to store data files and index\nfiles. Note that these table options do not work for partitioned tables (use\nthe partition options instead), or if the server has been invoked with the\n--skip-symbolic-links startup option. To avoid the overwriting of old files\nwith the same name that could be present in the directories, you can use the\n--keep_files_on_create option (an error will be issued if files already\nexist). These options are ignored if the NO_DIR_IN_CREATE SQL_MODE is enabled\n(useful for replication slaves). Also note that symbolic links cannot be used\nfor InnoDB tables.\n\nDATA DIRECTORY works by creating symlinks from where the table would normally\nhave been (inside the datadir) to where the option specifies. For security\nreasons, to avoid bypassing the privilege system, the server does not permit\nsymlinks inside the datadir. Therefore, DATA DIRECTORY cannot be used to\nspecify a location inside the datadir. An attempt to do so will result in an\nerror 1210 (HY000) Incorrect arguments to DATA DIRECTORY.\n\nDELAY_KEY_WRITE\n---------------\n\nDELAY_KEY_WRITE is supported by MyISAM and Aria, and can be set to 1 to speed\nup write operations. In that case, when data are modified, the indexes are not\nupdated until the table is closed. Writing the changes to the index file\naltogether can be much faster. However, note that this option is applied only\nif the delay_key_write server variable is set to \'ON\'. If it is \'OFF\' the\ndelayed index writes are always disabled, and if it is \'ALL\' the delayed index\nwrites are always used, disregarding the value of DELAY_KEY_WRITE.\n\nENCRYPTED\n---------\n\nThe ENCRYPTED table option can be used to manually set the encryption status\nof an InnoDB table. See InnoDB Encryption for more information.\n\nAria does not support the ENCRYPTED table option. See MDEV-18049.\n\nSee Data-at-Rest Encryption for more information.\n\nENCRYPTION_KEY_ID\n-----------------\n\nThe ENCRYPTION_KEY_ID table option can be used to manually set the encryption\nkey of an InnoDB table. See InnoDB Encryption for more information.\n\nAria does not support the ENCRYPTION_KEY_ID table option. See MDEV-18049.\n\nSee Data-at-Rest Encryption for more information.\n\nIETF_QUOTES\n-----------\n\nFor the CSV storage engine, the IETF_QUOTES option, when set to YES, enables\nIETF-compatible parsing of embedded quote and comma characters. Enabling this\noption for a table improves compatibility with other tools that use CSV, but\nis not compatible with MySQL CSV tables, or MariaDB CSV tables created without\nthis option. Disabled by default.\n\nINSERT_METHOD\n-------------\n\nINSERT_METHOD is only used with MERGE tables. This option determines in which\nunderlying table the new rows should be inserted. If you set it to \'NO\' (which\nis the default) no new rows can be added to the table (but you will still be\nable to perform INSERTs directly against the underlying tables). FIRST means\nthat the rows are inserted into the first table, and LAST means that thet are\ninserted into the last table.\n\nKEY_BLOCK_SIZE\n--------------\n\nKEY_BLOCK_SIZE is used to determine the size of key blocks, in bytes or\nkilobytes. However, this value is just a hint, and the storage engine could\nmodify or ignore it. If KEY_BLOCK_SIZE is set to 0, the storage engine\'s\ndefault value will be used.\n\nWith the InnoDB storage engine, if you specify a non-zero value for the\nKEY_BLOCK_SIZE table option for the whole table, then the table will\nimplicitly be created with the ROW_FORMAT table option set to COMPRESSED.\n\nMIN_ROWS/MAX_ROWS\n-----------------\n\nMIN_ROWS and MAX_ROWS let the storage engine know how many rows you are\nplanning to store as a minimum and as a maximum. These values will not be used\nas real limits, but they help the storage engine to optimize the table.\nMIN_ROWS is only used by MEMORY storage engine to decide the minimum memory\nthat is always allocated. MAX_ROWS is used to decide the minimum size for\nindexes.\n\nPACK_KEYS\n---------\n\nPACK_KEYS can be used to determine whether the indexes will be compressed. Set\nit to 1 to compress all keys. With a value of 0, compression will not be used.\nWith the DEFAULT value, only long strings will be compressed. Uncompressed\nkeys are faster.\n\nPAGE_CHECKSUM\n-------------\n\nPAGE_CHECKSUM is only applicable to Aria tables, and determines whether\nindexes and data should use page checksums for extra safety.\n\nPAGE_COMPRESSED\n---------------\n\nPAGE_COMPRESSED is used to enable InnoDB page compression for InnoDB tables.\n\nPAGE_COMPRESSION_LEVEL\n----------------------\n\nPAGE_COMPRESSION_LEVEL is used to set the compression level for InnoDB page\ncompression for InnoDB tables. The table must also have the PAGE_COMPRESSED\ntable option set to 1.\n\nValid values for PAGE_COMPRESSION_LEVEL are 1 (the best speed) through 9 (the\nbest compression), .\n\nPASSWORD\n--------\n\nPASSWORD is unused.\n\nRAID_TYPE\n---------\n\nRAID_TYPE is an obsolete option, as the raid support has been disabled since\nMySQL 5.0.\n\nROW_FORMAT\n----------\n\nThe ROW_FORMAT table option specifies the row format for the data file.\nPossible values are engine-dependent.\n\nSupported MyISAM Row Formats\n----------------------------\n\nFor MyISAM, the supported row formats are:\n\n* FIXED\n* DYNAMIC\n* COMPRESSED\n\nThe COMPRESSED row format can only be set by the myisampack command line tool.\n\nSee MyISAM Storage Formats for more information.\n\nSupported Aria Row Formats\n--------------------------\n\nFor Aria, the supported row formats are:\n\n* PAGE\n* FIXED\n* DYNAMIC.\n\nSee Aria Storage Formats for more information.\n\nSupported InnoDB Row Formats\n----------------------------\n\nFor InnoDB, the supported row formats are:\n\n* COMPACT\n* REDUNDANT\n* COMPRESSED\n* DYNAMIC.\n\nIf the ROW_FORMAT table option is set to FIXED for an InnoDB table, then the\nserver will either return an error or a warning depending on the value of the\ninnodb_strict_mode system variable. If the innodb_strict_mode system variable\nis set to OFF, then a warning is issued, and MariaDB will create the table\nusing the default row format for the specific MariaDB server version. If the\ninnodb_strict_mode system variable is set to ON, then an error will be raised.\n\nSee InnoDB Storage Formats for more information.\n\nOther Storage Engines and ROW_FORMAT\n------------------------------------\n\nOther storage engines do not support the ROW_FORMAT table option.\n\nSEQUENCE\n--------\n\nMariaDB starting with 10.3\n--------------------------\nIf the table is a sequence, then it will have the SEQUENCE set to 1.\n\nSTATS_AUTO_RECALC\n-----------------\n\nSTATS_AUTO_RECALC indicates whether to automatically recalculate persistent\nstatistics (see STATS_PERSISTENT, below) for an InnoDB table. If set to 1,\nstatistics will be recalculated when more than 10% of the data has changed.\nWhen set to 0, stats will be recalculated only when an ANALYZE TABLE is run.\nIf set to DEFAULT, or left out, the value set by the innodb_stats_auto_recalc\nsystem variable applies. See InnoDB Persistent Statistics.\n\nSTATS_PERSISTENT\n----------------\n\nSTATS_PERSISTENT indicates whether the InnoDB statistics created by ANALYZE\nTABLE will remain on disk or not. It can be set to 1 (on disk), 0 (not on\ndisk, the pre-MariaDB 10 behavior), or DEFAULT (the same as leaving out the\noption), in which case the value set by the innodb_stats_persistent system\nvariable will apply. Persistent statistics stored on disk allow the statistics\nto survive server restarts, and provide better query plan stability. See\nInnoDB Persistent Statistics.\n\nSTATS_SAMPLE_PAGES\n------------------\n\nSTATS_SAMPLE_PAGES indicates how many pages are used to sample index\nstatistics. If 0 or DEFAULT, the default value, the innodb_stats_sample_pages\nvalue is used. See InnoDB Persistent Statistics.\n\nTRANSACTIONAL\n-------------\n\nTRANSACTIONAL is only applicable for Aria tables. In future Aria tables\ncreated with this option will be fully transactional, but currently this\nprovides a form of crash protection. See Aria Storage Engine for more details.\n\nUNION\n-----\n\nUNION must be specified when you create a MERGE table. This option contains a\ncomma-separated list of MyISAM tables which are accessed by the new table. The\nlist is enclosed between parenthesis. Example: UNION = (t1,t2)\n\nWITH SYSTEM VERSIONING\n----------------------\n\nWITH SYSTEM VERSIONING is used for creating System-versioned tables.\n\nPartitions\n----------\n\npartition_options:\n PARTITION BY\n { [LINEAR] HASH(expr)\n | [LINEAR] KEY(column_list)\n | RANGE(expr)\n | LIST(expr)\n | SYSTEM_TIME [INTERVAL time_quantity time_unit] [LIMIT num] }\n [PARTITIONS num]\n [SUBPARTITION BY\n { [LINEAR] HASH(expr)\n | [LINEAR] KEY(column_list) }\n [SUBPARTITIONS num]\n ]\n [(partition_definition [, partition_definition] ...)]\npartition_definition:\n PARTITION partition_name\n [VALUES {LESS THAN {(expr) | MAXVALUE} | IN (value_list)}]\n [[STORAGE] ENGINE [=] engine_name]\n [COMMENT [=] \'comment_text\' ]\n [DATA DIRECTORY [=] \'data_dir\']\n [INDEX DIRECTORY [=] \'index_dir\']\n [MAX_ROWS [=] max_number_of_rows]\n [MIN_ROWS [=] min_number_of_rows]\n [TABLESPACE [=] tablespace_name]\n [NODEGROUP [=] node_group_id]\n [(subpartition_definition [, subpartition_definition] ...)]\nsubpartition_definition:\n SUBPARTITION logical_name\n [[STORAGE] ENGINE [=] engine_name]\n [COMMENT [=] \'comment_text\' ]\n [DATA DIRECTORY [=] \'data_dir\']\n [INDEX DIRECTORY [=] \'index_dir\']\n [MAX_ROWS [=] max_number_of_rows]\n [MIN_ROWS [=] min_number_of_rows]\n [TABLESPACE [=] tablespace_name]\n [NODEGROUP [=] node_group_id]\nIf the PARTITION BY clause is used, the table will be partitioned. A partition\nmethod must be explicitly indicated for partitions and subpartitions.\nPartition methods are:\n\n* [LINEAR] HASH creates a hash key which will be used to read and write rows.\nThe partition function can be any valid SQL expression which returns an\nINTEGER number. Thus, it is possible to use the HASH method on an integer\ncolumn, or on functions which accept integer columns as an argument. However,\nVALUES LESS THAN and VALUES IN clauses can not be used with HASH. An example:\n\nCREATE TABLE t1 (a INT, b CHAR(5), c DATETIME)\n PARTITION BY HASH ( YEAR(c) );\n\n[LINEAR] HASH can be used for subpartitions, too.\n\n* [LINEAR] KEY is similar to HASH, but the index has an even distribution of\ndata. Also, the expression can only be a column or a list of columns. VALUES\nLESS THAN and VALUES IN clauses can not be used with KEY.\n* RANGE partitions the rows using on a range of values, using the VALUES LESS\nTHAN operator. VALUES IN is not allowed with RANGE. The partition function can\nbe any valid SQL expression which returns a single value.\n* LIST assigns partitions based on a table\'s column with a restricted set of\npossible values. It is similar to RANGE, but VALUES IN must be used for at\nleast 1 columns, and VALUES LESS THAN is disallowed.\n* SYSTEM_TIME partitioning is used for System-versioned tables to store\nhistorical data separately from current data.\n\nOnly HASH and KEY can be used for subpartitions, and they can be [LINEAR].\n\nIt is possible to define up to 1024 partitions and subpartitions.\n\nThe number of defined partitions can be optionally specified as PARTITION\ncount. This can be done to avoid specifying all partitions individually. But\nyou can also declare each individual partition and, additionally, specify a\nPARTITIONS count clause; in the case, the number of PARTITIONs must equal\ncount.\n\nAlso see Partitioning Types Overview.\n\nSequences\n---------\n\nMariaDB starting with 10.3\n--------------------------\nCREATE TABLE can also be used to create a SEQUENCE. See CREATE SEQUENCE and\nSequence Overview.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL. CREATE TABLE is atomic, except for CREATE\nOR REPLACE, which is only crash safe.\n\nExamples\n--------\n\ncreate table if not exists test (\na bigint auto_increment primary key,\nname varchar(128) charset utf8,\nkey name (name(32))\n) engine=InnoDB default charset latin1;\n\nThis example shows a couple of things:\n\n* Usage of IF NOT EXISTS; If the table already existed, it will not be\ncreated. There will not be any error for the client, just a warning.\n* How to create a PRIMARY KEY that is automatically generated.\n* How to specify a table-specific character set and another for a column.\n* How to create an index (name) that is only partly indexed (to save space).\n\nThe following clauses will work from MariaDB 10.2.1 only.\n\nCREATE TABLE t1(\n a int DEFAULT (1+1),\n b int DEFAULT (a+1),\n expires DATETIME DEFAULT(NOW() + INTERVAL 1 YEAR),\n x BLOB DEFAULT USER()\n);\n\nURL: https://mariadb.com/kb/en/create-table/') WHERE help_topic_id = 704;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (705,38,'DROP TABLE','Syntax\n------\n\nDROP [TEMPORARY] TABLE [IF EXISTS] [/*COMMENT TO SAVE*/]\n tbl_name [, tbl_name] ...\n [WAIT n|NOWAIT]\n [RESTRICT | CASCADE]\n\nDescription\n-----------\n\nDROP TABLE removes one or more tables. You must have the DROP privilege for\neach table. All table data and the table definition are removed, as well as\ntriggers associated to the table, so be careful with this statement! If any of\nthe tables named in the argument list do not exist, MariaDB returns an error\nindicating by name which non-existing tables it was unable to drop, but it\nalso drops all of the tables in the list that do exist.\n\nImportant: When a table is dropped, user privileges on the table are not\nautomatically dropped. See GRANT.\n\nIf another thread is using the table in an explicit transaction or an\nautocommit transaction, then the thread acquires a metadata lock (MDL) on the\ntable. The DROP TABLE statement will wait in the \"Waiting for table metadata\nlock\" thread state until the MDL is released. MDLs are released in the\nfollowing cases:\n\n* If an MDL is acquired in an explicit transaction, then the MDL will be\nreleased when the transaction ends.\n* If an MDL is acquired in an autocommit transaction, then the MDL will be\nreleased when the statement ends.\n* Transactional and non-transactional tables are handled the same.\n\nNote that for a partitioned table, DROP TABLE permanently removes the table\ndefinition, all of its partitions, and all of the data which was stored in\nthose partitions. It also removes the partitioning definition (.par) file\nassociated with the dropped table.\n\nFor each referenced table, DROP TABLE drops a temporary table with that name,\nif it exists. If it does not exist, and the TEMPORARY keyword is not used, it\ndrops a non-temporary table with the same name, if it exists. The TEMPORARY\nkeyword ensures that a non-temporary table will not accidentally be dropped.\n\nUse IF EXISTS to prevent an error from occurring for tables that do not exist.\nA NOTE is generated for each non-existent table when using IF EXISTS. See SHOW\nWARNINGS.\n\nIf a foreign key references this table, the table cannot be dropped. In this\ncase, it is necessary to drop the foreign key first.\n\nRESTRICT and CASCADE are allowed to make porting from other database systems\neasier. In MariaDB, they do nothing.\n\nThe comment before the table names (/*COMMENT TO SAVE*/) is stored in the\nbinary log. That feature can be used by replication tools to send their\ninternal messages.\n\nIt is possible to specify table names as db_name.tab_name. This is useful to\ndelete tables from multiple databases with one statement. See Identifier\nQualifiers for details.\n\nThe DROP privilege is required to use DROP TABLE on non-temporary tables. For\ntemporary tables, no privilege is required, because such tables are only\nvisible for the current session.\n\nNote: DROP TABLE automatically commits the current active transaction, unless\nyou use the TEMPORARY keyword.\n\nMariaDB starting with 10.5.4\n----------------------------\nFrom MariaDB 10.5.4, DROP TABLE reliably deletes table remnants inside a\nstorage engine even if the .frm file is missing. Before then, a missing .frm\nfile would result in the statement failing.\n\nMariaDB starting with 10.3.1\n----------------------------\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nDROP TABLE in replication\n-------------------------\n\nDROP TABLE has the following characteristics in replication:\n\n* DROP TABLE IF EXISTS are always logged.\n* DROP TABLE without IF EXISTS for tables that don\'t exist are not written to\nthe binary log.\n* Dropping of TEMPORARY tables are prefixed in the log with TEMPORARY. These\ndrops are only logged when running statement or mixed mode replication.\n* One DROP TABLE statement can be logged with up to 3 different DROP\nstatements:\nDROP TEMPORARY TABLE list_of_non_transactional_temporary_tables\nDROP TEMPORARY TABLE list_of_transactional_temporary_tables\nDROP TABLE list_of_normal_tables\n\nDROP TABLE on the primary is treated on the replica as DROP TABLE IF EXISTS.\nYou can change that by setting slave-ddl-exec-mode to STRICT.\n\nDropping an Internal #sql-... Table\n-----------------------------------\n\nFrom MariaDB 10.6, DROP TABLE is atomic and the following does not apply.\nUntil MariaDB 10.5, if the mariadbd/mysqld process is killed during an ALTER\nTABLE you may find a table named #sql-... in your data directory. In MariaDB\n10.3, InnoDB tables with this prefix will be deleted automatically during\nstartup. From MariaDB 10.4, these temporary tables will always be deleted\nautomatically.\n\nIf you want to delete one of these tables explicitly you can do so by using\nthe following syntax:\n\nDROP TABLE `#mysql50##sql-...`;\n\nWhen running an ALTER TABLE…ALGORITHM=INPLACE that rebuilds the table, InnoDB\nwill create an internal #sql-ib table. Until MariaDB 10.3.2, for these tables,\nthe .frm file will be called something else. In order to drop such a table\nafter a server crash, you must rename the #sql*.frm file to match the\n#sql-ib*.ibd file.\n\nFrom MariaDB 10.3.3, the same name as the .frm file is used for the\nintermediate copy of the table. The #sql-ib names are used by TRUNCATE and\ndelayed DROP.\n\nFrom MariaDB 10.2.19 and MariaDB 10.3.10, the #sql-ib tables will be deleted\nautomatically.\n\nDropping All Tables in a Database\n---------------------------------\n\nThe best way to drop all tables in a database is by executing DROP DATABASE,\nwhich will drop the database itself, and all tables in it.\n\nHowever, if you want to drop all tables in the database, but you also want to\nkeep the database itself and any other non-table objects in it, then you would\nneed to execute DROP TABLE to drop each individual table. You can construct\nthese DROP TABLE commands by querying the TABLES table in the\ninformation_schema database. For example:\n\nSELECT CONCAT(\'DROP TABLE IF EXISTS `\', TABLE_SCHEMA, \'`.`\', TABLE_NAME, \'`;\')\nFROM information_schema.TABLES\nWHERE TABLE_SCHEMA = \'mydb\';\n\nAtomic DROP TABLE\n-----------------\n\nMariaDB starting with 10.6.1\n----------------------------\nFrom MariaDB 10.6, DROP TABLE for a single table is atomic (MDEV-25180) for\nmost engines, including InnoDB, MyRocks, MyISAM and Aria.\n\nThis means that if there is a crash (server down or power outage) during DROP\nTABLE, all tables that have been processed so far will be completely dropped,\nincluding related trigger files and status entries, and the binary log will\ninclude a DROP TABLE statement for the dropped tables. Tables for which the\ndrop had not started will be left intact.\n\nIn older MariaDB versions, there was a small chance that, during a server\ncrash happening in the middle of DROP TABLE, some storage engines that were\nusing multiple storage files, like MyISAM, could have only a part of its\ninternal files dropped.\n\nIn MariaDB 10.5, DROP TABLE was extended to be able to delete a table that was\nonly partly dropped (MDEV-11412) as explained above. Atomic DROP TABLE is the\nfinal piece to make DROP TABLE fully reliable.\n\nDropping multiple tables is crash-safe.\n\nSee Atomic DDL for more information.\n\nExamples\n--------\n\nDROP TABLE Employees, Customers;\n\nNotes\n-----\n\nBeware that DROP TABLE can drop both tables and sequences. This is mainly done\nto allow old tools like mysqldump to work with sequences.\n\nURL: https://mariadb.com/kb/en/drop-table/','','https://mariadb.com/kb/en/drop-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (706,38,'RENAME TABLE','Syntax\n------\n\nRENAME TABLE[S] [IF EXISTS] tbl_name \n [WAIT n | NOWAIT]\n TO new_tbl_name\n [, tbl_name2 TO new_tbl_name2] ...\n\nDescription\n-----------\n\nThis statement renames one or more tables or views, but not the privileges\nassociated with them.\n\nIF EXISTS\n---------\n\nMariaDB starting with 10.5.2\n----------------------------\nIf this directive is used, one will not get an error if the table to be\nrenamed doesn\'t exist.\n\nThe rename operation is done atomically, which means that no other session can\naccess any of the tables while the rename is running. For example, if you have\nan existing table old_table, you can create another table new_table that has\nthe same structure but is empty, and then replace the existing table with the\nempty one as follows (assuming that backup_table does not already exist):\n\nCREATE TABLE new_table (...);\nRENAME TABLE old_table TO backup_table, new_table TO old_table;\n\ntbl_name can optionally be specified as db_name.tbl_name. See Identifier\nQualifiers. This allows to use RENAME to move a table from a database to\nanother (as long as they are on the same filesystem):\n\nRENAME TABLE db1.t TO db2.t;\n\nNote that moving a table to another database is not possible if it has some\ntriggers. Trying to do so produces the following error:\n\nERROR 1435 (HY000): Trigger in wrong schema\n\nAlso, views cannot be moved to another database:\n\nERROR 1450 (HY000): Changing schema from \'old_db\' to \'new_db\' is not allowed.\n\nMultiple tables can be renamed in a single statement. The presence or absence\nof the optional S (RENAME TABLE or RENAME TABLES) has no impact, whether a\nsingle or multiple tables are being renamed.\n\nIf a RENAME TABLE renames more than one table and one renaming fails, all\nrenames executed by the same statement are rolled back.\n\nRenames are always executed in the specified order. Knowing this, it is also\npossible to swap two tables\' names:\n\nRENAME TABLE t1 TO tmp_table,\n t2 TO t1,\n tmp_table TO t2;\n\nWAIT/NOWAIT\n-----------\n\nMariaDB starting with 10.3.0\n----------------------------\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nPrivileges\n----------\n\nExecuting the RENAME TABLE statement requires the DROP, CREATE and INSERT\nprivileges for the table or the database.\n\nAtomic RENAME TABLE\n-------------------\n\nMariaDB starting with 10.6.1\n----------------------------\nFrom MariaDB 10.6, RENAME TABLE is atomic for most engines, including InnoDB,\nMyRocks, MyISAM and Aria (MDEV-23842). This means that if there is a crash\n(server down or power outage) during RENAME TABLE, all tables will revert to\ntheir original names and any changes to trigger files will be reverted.\n\nIn older MariaDB version there was a small chance that, during a server crash\nhappening in the middle of RENAME TABLE, some tables could have been renamed\n(in the worst case partly) while others would not be renamed.\n\nSee Atomic DDL for more information.\n\nURL: https://mariadb.com/kb/en/rename-table/','','https://mariadb.com/kb/en/rename-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (707,38,'TRUNCATE TABLE','Syntax\n------\n\nTRUNCATE [TABLE] tbl_name\n [WAIT n | NOWAIT]\n\nDescription\n-----------\n\nTRUNCATE TABLE empties a table completely. It requires the DROP privilege. See\nGRANT.\n\ntbl_name can also be specified in the form db_name.tbl_name (see Identifier\nQualifiers).\n\nLogically, TRUNCATE TABLE is equivalent to a DELETE statement that deletes all\nrows, but there are practical differences under some circumstances.\n\nTRUNCATE TABLE will fail for an InnoDB table if any FOREIGN KEY constraints\nfrom other tables reference the table, returning the error:\n\nERROR 1701 (42000): Cannot truncate a table referenced in a foreign key\nconstraint\n\nForeign Key constraints between columns in the same table are permitted.\n\nFor an InnoDB table, if there are no FOREIGN KEY constraints, InnoDB performs\nfast truncation by dropping the original table and creating an empty one with\nthe same definition, which is much faster than deleting rows one by one. The\nAUTO_INCREMENT counter is reset by TRUNCATE TABLE, regardless of whether there\nis a FOREIGN KEY constraint.\n\nThe count of rows affected by TRUNCATE TABLE is accurate only when it is\nmapped to a DELETE statement.\n\nFor other storage engines, TRUNCATE TABLE differs from DELETE in the following\nways:\n\n* Truncate operations drop and re-create the table, which is much\n faster than deleting rows one by one, particularly for large tables.\n* Truncate operations cause an implicit commit.\n* Truncation operations cannot be performed if the session holds an\n active table lock.\n* Truncation operations do not return a meaningful value for the number\n of deleted rows. The usual result is \"0 rows affected,\" which should\n be interpreted as \"no information.\"\n* As long as the table format file tbl_name.frm is valid, the\n table can be re-created as an empty table\n with TRUNCATE TABLE, even if the data or index files have become\n corrupted.\n* The table handler does not remember the last\n used AUTO_INCREMENT value, but starts counting\n from the beginning. This is true even for MyISAM and InnoDB, which normally\n do not reuse sequence values.\n* When used with partitioned tables, TRUNCATE TABLE preserves\n the partitioning; that is, the data and index files are dropped and\n re-created, while the partition definitions (.par) file is\n unaffected.\n* Since truncation of a table does not make any use of DELETE,\n the TRUNCATE statement does not invoke ON DELETE triggers.\n* TRUNCATE TABLE will only reset the values in the Performance Schema summary\ntables to zero or null, and will not remove the rows.\n\nFor the purposes of binary logging and replication, TRUNCATE TABLE is treated\nas DROP TABLE followed by CREATE TABLE (DDL rather than DML).\n\nTRUNCATE TABLE does not work on views. Currently, TRUNCATE TABLE drops all\nhistorical records from a system-versioned table.\n\nMariaDB starting with 10.3.0\n----------------------------\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nOracle-mode\n-----------\n\nOracle-mode from MariaDB 10.3 permits the optional keywords REUSE STORAGE or\nDROP STORAGE to be used.\n\nTRUNCATE [TABLE] tbl_name [{DROP | REUSE} STORAGE] [WAIT n | NOWAIT]\n\nThese have no effect on the operation.\n\nPerformance\n-----------\n\nTRUNCATE TABLE is faster than DELETE, because it drops and re-creates a table.\n\nWith InnoDB, TRUNCATE TABLE is slower if innodb_file_per_table=ON is set (the\ndefault). This is because TRUNCATE TABLE unlinks the underlying tablespace\nfile, which can be an expensive operation. See MDEV-8069 for more details.\n\nThe performance issues with innodb_file_per_table=ON can be exacerbated in\ncases where the InnoDB buffer pool is very large and\ninnodb_adaptive_hash_index=ON is set. In that case, using DROP TABLE followed\nby CREATE TABLE instead of TRUNCATE TABLE may perform better. Setting\ninnodb_adaptive_hash_index=OFF (it defaults to ON before MariaDB 10.5) can\nalso help. In MariaDB 10.2 only, from MariaDB 10.2.19, this performance can\nalso be improved by setting innodb_safe_truncate=OFF. See MDEV-9459 for more\ndetails.\n\nSetting innodb_adaptive_hash_index=OFF can also improve TRUNCATE TABLE\nperformance in general. See MDEV-16796 for more details.\n\nURL: https://mariadb.com/kb/en/truncate-table/','','https://mariadb.com/kb/en/truncate-table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (708,38,'CREATE DATABASE','Syntax\n------\n\nCREATE [OR REPLACE] {DATABASE | SCHEMA} [IF NOT EXISTS] db_name\n [create_specification] ...\n\ncreate_specification:\n [DEFAULT] CHARACTER SET [=] charset_name\n | [DEFAULT] COLLATE [=] collation_name\n | COMMENT [=] \'comment\'\n\nDescription\n-----------\n\nCREATE DATABASE creates a database with the given name. To use this statement,\nyou need the CREATE privilege for the database. CREATE SCHEMA is a synonym for\nCREATE DATABASE.\n\nFor valid identifiers to use as database names, see Identifier Names.\n\nOR REPLACE\n----------\n\nMariaDB starting with 10.1.3\n----------------------------\nThe OR REPLACE clause was added in MariaDB 10.1.3\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP DATABASE IF EXISTS db_name;\nCREATE DATABASE db_name ...;\n\nIF NOT EXISTS\n-------------\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified database already exists.\n\nCOMMENT\n-------\n\nMariaDB starting with 10.5.0\n----------------------------\nFrom MariaDB 10.5.0, it is possible to add a comment of a maximum of 1024\nbytes. If the comment length exceeds this length, a error/warning code 4144 is\nthrown. The database comment is also added to the db.opt file, as well as to\nthe information_schema.schemata table.\n\nExamples\n--------\n\nCREATE DATABASE db1;\nQuery OK, 1 row affected (0.18 sec)\n\nCREATE DATABASE db1;\nERROR 1007 (HY000): Can\'t create database \'db1\'; database exists\n\nCREATE OR REPLACE DATABASE db1;\nQuery OK, 2 rows affected (0.00 sec)\n\nCREATE DATABASE IF NOT EXISTS db1;\nQuery OK, 1 row affected, 1 warning (0.01 sec)\n\nSHOW WARNINGS;\n+-------+------+----------------------------------------------+\n| Level | Code | Message |\n+-------+------+----------------------------------------------+\n| Note | 1007 | Can\'t create database \'db1\'; database exists |\n+-------+------+----------------------------------------------+\n\nSetting the character sets and collation. See Setting Character Sets and\nCollations for more details.\n\nCREATE DATABASE czech_slovak_names \n CHARACTER SET = \'keybcs2\'\n COLLATE = \'keybcs2_bin\';\n\nComments, from MariaDB 10.5.0:\n\nCREATE DATABASE presentations COMMENT \'Presentations for conferences\';\n\nURL: https://mariadb.com/kb/en/create-database/','','https://mariadb.com/kb/en/create-database/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (709,38,'CREATE EVENT','Syntax\n------\n\nCREATE [OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n EVENT\n [IF NOT EXISTS]\n event_name\n ON SCHEDULE schedule\n [ON COMPLETION [NOT] PRESERVE]\n [ENABLE | DISABLE | DISABLE ON SLAVE]\n [COMMENT \'comment\']\n DO sql_statement;\n\nschedule:\n AT timestamp [+ INTERVAL interval] ...\n | EVERY interval\n [STARTS timestamp [+ INTERVAL interval] ...]\n [ENDS timestamp [+ INTERVAL interval] ...]\n\ninterval:\n quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |\n WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |\n DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}\n\nDescription\n-----------\n\nThis statement creates and schedules a new event. It requires the EVENT\nprivilege for the schema in which the event is to be created.\n\nThe minimum requirements for a valid CREATE EVENT statement are as follows:\n\n* The keywords CREATE EVENT plus an event name, which uniquely identifies\n the event in the current schema. (Prior to MySQL 5.1.12, the event name\n needed to be unique only among events created by the same user on a given\n database.)\n* An ON SCHEDULE clause, which determines when and how often the event\n executes.\n* A DO clause, which contains the SQL statement to be executed by an\n event.\n\nHere is an example of a minimal CREATE EVENT statement:\n\nCREATE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n\nThe previous statement creates an event named myevent. This event executes\nonce — one hour following its creation — by running an SQL statement that\nincrements the value of the myschema.mytable table\'s mycol column by 1.\n\nThe event_name must be a valid MariaDB identifier with a maximum length of 64\ncharacters. It may be delimited using back ticks, and may be qualified with\nthe name of a database schema. An event is associated with both a MariaDB user\n(the definer) and a schema, and its name must be unique among names of events\nwithin that schema. In general, the rules governing event names are the same\nas those for names of stored routines. See Identifier Names.\n\nIf no schema is indicated as part of event_name, the default (current) schema\nis assumed.\n\nFor valid identifiers to use as event names, see Identifier Names.\n\nOR REPLACE\n----------\n\nThe OR REPLACE clause was included in MariaDB 10.1.4. If used and the event\nalready exists, instead of an error being returned, the existing event will be\ndropped and replaced by the newly defined event.\n\nIF NOT EXISTS\n-------------\n\nIf the IF NOT EXISTS clause is used, MariaDB will return a warning instead of\nan error if the event already exists. Cannot be used together with OR REPLACE.\n\nON SCHEDULE\n-----------\n\nThe ON SCHEDULE clause can be used to specify when the event must be triggered.\n\nAT\n--\n\nIf you want to execute the event only once (one time event), you can use the\nAT keyword, followed by a timestamp. If you use CURRENT_TIMESTAMP, the event\nacts as soon as it is created. As a convenience, you can add one or more\nintervals to that timestamp. You can also specify a timestamp in the past, so\nthat the event is stored but not triggered, until you modify it via ALTER\nEVENT.\n\nThe following example shows how to create an event that will be triggered\ntomorrow at a certain time:\n\nCREATE EVENT example\nON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY + INTERVAL 3 HOUR\nDO something;\n\nYou can also specify that an event must be triggered at a regular interval\n(recurring event). In such cases, use the EVERY clause followed by the\ninterval.\n\nIf an event is recurring, you can specify when the first execution must happen\nvia the STARTS clause and a maximum time for the last execution via the ENDS\nclause. STARTS and ENDS clauses are followed by a timestamp and, optionally,\none or more intervals. The ENDS clause can specify a timestamp in the past, so\nthat the event is stored but not executed until you modify it via ALTER EVENT.\n\nIn the following example, next month a recurring event will be triggered\nhourly for a week:\n\nCREATE EVENT example\nON SCHEDULE EVERY 1 HOUR\nSTARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH\nENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK\nDO some_task;\n\nIntervals consist of a quantity and a time unit. The time units are the same\nused for other staments and time functions, except that you can\'t use\nmicroseconds for events. For simple time units, like HOUR or MINUTE, the\nquantity is an integer number, for example \'10 MINUTE\'. For composite time\nunits, like HOUR_MINUTE or HOUR_SECOND, the quantity must be a string with all\ninvolved simple values and their separators, for example \'2:30\' or \'2:30:30\'.\n\nON COMPLETION [NOT] PRESERVE\n----------------------------\n\nThe ON COMPLETION clause can be used to specify if the event must be deleted\nafter its last execution (that is, after its AT or ENDS timestamp is past). By\ndefault, events are dropped when they are expired. To explicitly state that\nthis is the desired behaviour, you can use ON COMPLETION NOT PRESERVE.\nInstead, if you want the event to be preserved, you can use ON COMPLETION\nPRESERVE.\n\nIn you specify ON COMPLETION NOT PRESERVE, and you specify a timestamp in the\npast for AT or ENDS clause, the event will be immediatly dropped. In such\ncases, you will get a Note 1558: \"Event execution time is in the past and ON\nCOMPLETION NOT PRESERVE is set. The event was dropped immediately after\ncreation\".\n\nENABLE/DISABLE/DISABLE ON SLAVE\n-------------------------------\n\nEvents are ENABLEd by default. If you want to stop MariaDB from executing an\nevent, you may specify DISABLE. When it is ready to be activated, you may\nenable it using ALTER EVENT. Another option is DISABLE ON SLAVE, which\nindicates that an event was created on a master and has been replicated to the\nslave, which is prevented from executing the event. If DISABLE ON SLAVE is\nspecifically set, the event will be disabled everywhere. It will not be\nexecuted on the mater or the slaves.\n\nCOMMENT\n-------\n\nThe COMMENT clause may be used to set a comment for the event. Maximum length\nfor comments is 64 characters. The comment is a string, so it must be quoted.\nTo see events comments, you can query the INFORMATION_SCHEMA.EVENTS table (the\ncolumn is named EVENT_COMMENT).\n\nExamples\n--------\n\nMinimal CREATE EVENT statement:\n\nCREATE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n\nAn event that will be triggered tomorrow at a certain time:\n\nCREATE EVENT example\nON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY + INTERVAL 3 HOUR\nDO something;\n\nNext month a recurring event will be triggered hourly for a week:\n\nCREATE EVENT example\nON SCHEDULE EVERY 1 HOUR\nSTARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH\nENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK\nDO some_task;\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\nERROR 1537 (HY000): Event \'myevent\' already exists\n\nCREATE OR REPLACE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;;\nQuery OK, 0 rows affected (0.00 sec)\n\nCREATE EVENT IF NOT EXISTS myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+--------------------------------+\n| Level | Code | Message |\n+-------+------+--------------------------------+\n| Note | 1537 | Event \'myevent\' already exists |\n+-------+------+--------------------------------+\n\nURL: https://mariadb.com/kb/en/create-event/','','https://mariadb.com/kb/en/create-event/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (710,38,'CREATE FUNCTION','Syntax\n------\n\nCREATE [OR REPLACE]\n [DEFINER = {user | CURRENT_USER | role | CURRENT_ROLE }]\n [AGGREGATE] FUNCTION [IF NOT EXISTS] func_name ([func_parameter[,...]])\n RETURNS type\n [characteristic ...]\n RETURN func_body\nfunc_parameter:\n [ IN | OUT | INOUT | IN OUT ] param_name type\ntype:\n Any valid MariaDB data type\ncharacteristic:\n LANGUAGE SQL\n | [NOT] DETERMINISTIC\n | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\nfunc_body:\n Valid SQL procedure statement\n\nDescription\n-----------\n\nUse the CREATE FUNCTION statement to create a new stored function. You must\nhave the CREATE ROUTINE database privilege to use CREATE FUNCTION. A function\ntakes any number of arguments and returns a value from the function body. The\nfunction body can be any valid SQL expression as you would use, for example,\nin any select expression. If you have the appropriate privileges, you can call\nthe function exactly as you would any built-in function. See Security below\nfor details on privileges.\n\nYou can also use a variant of the CREATE FUNCTION statement to install a\nuser-defined function (UDF) defined by a plugin. See CREATE FUNCTION (UDF) for\ndetails.\n\nYou can use a SELECT statement for the function body by enclosing it in\nparentheses, exactly as you would to use a subselect for any other expression.\nThe SELECT statement must return a single value. If more than one column is\nreturned when the function is called, error 1241 results. If more than one row\nis returned when the function is called, error 1242 results. Use a LIMIT\nclause to ensure only one row is returned.\n\nYou can also replace the RETURN clause with a BEGIN...END compound statement.\nThe compound statement must contain a RETURN statement. When the function is\ncalled, the RETURN statement immediately returns its result, and any\nstatements after RETURN are effectively ignored.\n\nBy default, a function is associated with the current database. To associate\nthe function explicitly with a given database, specify the fully-qualified\nname as db_name.func_name when you create it. If the function name is the same\nas the name of a built-in function, you must use the fully qualified name when\nyou call it.\n\nThe parameter list enclosed within parentheses must always be present. If\nthere are no parameters, an empty parameter list of () should be used.\nParameter names are not case sensitive.\n\nEach parameter can be declared to use any valid data type, except that the\nCOLLATE attribute cannot be used.\n\nFor valid identifiers to use as function names, see Identifier Names.\n\nIN | OUT | INOUT | IN OUT\n-------------------------\n\nMariaDB starting with 10.8.0\n----------------------------\nThe function parameter qualifiers for IN, OUT, INOUT, and IN OUT were added in\na 10.8.0 preview release. Prior to 10.8.0 quantifiers were supported only in\nprocedures.\n\nOUT, INOUT and its equivalent IN OUT, are only valid if called from SET and\nnot SELECT. These quantifiers are especially useful for creating functions\nwith more than one return value. This allows functions to be more complex and\nnested.\n\nDELIMITER $$\nCREATE FUNCTION add_func3(IN a INT, IN b INT, OUT c INT) RETURNS INT\nBEGIN\n SET c = 100;\n RETURN a + b;\nEND;\n$$\nDELIMITER ;\n\nSET @a = 2;\nSET @b = 3;\nSET @c = 0;\nSET @res= add_func3(@a, @b, @c);\n\nSELECT add_func3(@a, @b, @c);\nERROR 4186 (HY000): OUT or INOUT argument 3 for function add_func3 is not\nallowed here\n\nDELIMITER $$\nCREATE FUNCTION add_func4(IN a INT, IN b INT, d INT) RETURNS INT\nBEGIN\n DECLARE c, res INT;\n SET res = add_func3(a, b, c) + d;\n if (c > 99) then\n return 3;\n else\n return res;\n end if;\nEND;\n$$\n\nDELIMITER ;\n\nSELECT add_func4(1,2,3);\n+------------------+\n| add_func4(1,2,3) |\n+------------------+\n| 3 |\n+------------------+\n\nAGGREGATE\n---------\n\nMariaDB starting with 10.3.3\n----------------------------\nFrom MariaDB 10.3.3, it is possible to create stored aggregate functions as\nwell. See Stored Aggregate Functions for details.\n\nRETURNS\n-------\n\nThe RETURNS clause specifies the return type of the function. NULL values are\npermitted with all return types.\n\nWhat happens if the RETURN clause returns a value of a different type? It\ndepends on the SQL_MODE in effect at the moment of the function creation.\n\nIf the SQL_MODE is strict (STRICT_ALL_TABLES or STRICT_TRANS_TABLES flags are\nspecified), a 1366 error will be produced.\n\nOtherwise, the value is coerced to the proper type. For example, if a function\nspecifies an ENUM or SET value in the RETURNS clause, but the RETURN clause\nreturns an integer, the value returned from the function is the string for the\ncorresponding ENUM member of set of SET members.\n\nMariaDB stores the SQL_MODE system variable setting that is in effect at the\ntime a routine is created, and always executes the routine with this setting\nin force, regardless of the server SQL mode in effect when the routine is\ninvoked.\n\nLANGUAGE SQL\n------------\n\nLANGUAGE SQL is a standard SQL clause, and it can be used in MariaDB for\nportability. However that clause has no meaning, because SQL is the only\nsupported language for stored functions.\n\nA function is deterministic if it can produce only one result for a given list\nof parameters. If the result may be affected by stored data, server variables,\nrandom numbers or any value that is not explicitly passed, then the function\nis not deterministic. Also, a function is non-deterministic if it uses\nnon-deterministic functions like NOW() or CURRENT_TIMESTAMP(). The optimizer\nmay choose a faster execution plan if it known that the function is\ndeterministic. In such cases, you should declare the routine using the\nDETERMINISTIC keyword. If you want to explicitly state that the function is\nnot deterministic (which is the default) you can use the NOT DETERMINISTIC\nkeywords.\n\nIf you declare a non-deterministic function as DETERMINISTIC, you may get\nincorrect results. If you declare a deterministic function as NOT\nDETERMINISTIC, in some cases the queries will be slower.\n\nOR REPLACE\n----------\n\nMariaDB starting with 10.1.3\n----------------------------\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP FUNCTION IF EXISTS function_name;\nCREATE FUNCTION function_name ...;\n\nwith the exception that any existing privileges for the function are not\ndropped.\n\nIF NOT EXISTS\n-------------\n\nMariaDB starting with 10.1.3\n----------------------------\nIf the IF NOT EXISTS clause is used, MariaDB will return a warning instead of\nan error if the function already exists. Cannot be used together with OR\nREPLACE.\n\n[NOT] DETERMINISTIC\n-------------------\n\nThe [NOT] DETERMINISTIC clause also affects binary logging, because the\nSTATEMENT format can not be used to store or replicate non-deterministic\nstatements.\n\nCONTAINS SQL, NO SQL, READS SQL DATA, and MODIFIES SQL DATA are informative\nclauses that tell the server what the function does. MariaDB does not check in\nany way whether the specified clause is correct. If none of these clauses are\nspecified, CONTAINS SQL is used by default.\n\nMODIFIES SQL DATA\n-----------------\n\nMODIFIES SQL DATA means that the function contains statements that may modify\ndata stored in databases. This happens if the function contains statements\nlike DELETE, UPDATE, INSERT, REPLACE or DDL.\n\nREADS SQL DATA\n--------------\n\nREADS SQL DATA means that the function reads data stored in databases, but\ndoes not modify any data. This happens if SELECT statements are used, but\nthere no write operations are executed.\n\nCONTAINS SQL\n------------\n\nCONTAINS SQL means that the function contains at least one SQL statement, but\nit does not read or write any data stored in a database. Examples include SET\nor DO.\n\nNO SQL\n------\n\nNO SQL means nothing, because MariaDB does not currently support any language\nother than SQL.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nFrom MariaDB 10.3, a subset of Oracle\'s PL/SQL language has been supported in\naddition to the traditional SQL/PSM-based MariaDB syntax. See Oracle mode from\nMariaDB 10.3 for details on changes when running Oracle mode.\n\nSecurity\n--------\n\nYou must have the EXECUTE privilege on a function to call it. MariaDB\nautomatically grants the EXECUTE and ALTER ROUTINE privileges to the account\nthat called CREATE FUNCTION, even if the DEFINER clause was used.\n\nEach function has an account associated as the definer. By default, the\ndefiner is the account that created the function. Use the DEFINER clause to\nspecify a different account as the definer. You must have the SUPER privilege,\nor, from MariaDB 10.5.2, the SET USER privilege, to use the DEFINER clause.\nSee Account Names for details on specifying accounts.\n\nThe SQL SECURITY clause specifies what privileges are used when a function is\ncalled. If SQL SECURITY is INVOKER, the function body will be evaluated using\nthe privileges of the user calling the function. If SQL SECURITY is DEFINER,\nthe function body is always evaluated using the privileges of the definer\naccount. DEFINER is the default.\n\nThis allows you to create functions that grant limited access to certain data.\nFor example, say you have a table that stores some employee information, and\nthat you\'ve granted SELECT privileges only on certain columns to the user\naccount roger.\n\nCREATE TABLE employees (name TINYTEXT, dept TINYTEXT, salary INT);\nGRANT SELECT (name, dept) ON employees TO roger;\n\nTo allow the user the get the maximum salary for a department, define a\nfunction and grant the EXECUTE privilege:\n\nCREATE FUNCTION max_salary (dept TINYTEXT) RETURNS INT RETURN\n (SELECT MAX(salary) FROM employees WHERE employees.dept = dept);\nGRANT EXECUTE ON FUNCTION max_salary TO roger;\n\nSince SQL SECURITY defaults to DEFINER, whenever the user roger calls this\nfunction, the subselect will execute with your privileges. As long as you have\nprivileges to select the salary of each employee, the caller of the function\nwill be able to get the maximum salary for each department without being able\nto see individual salaries.\n\nCharacter sets and collations\n-----------------------------\n\nFunction return types can be declared to use any valid character set and\ncollation. If used, the COLLATE attribute needs to be preceded by a CHARACTER\nSET attribute.\n\nIf the character set and collation are not specifically set in the statement,\nthe database defaults at the time of creation will be used. If the database\ndefaults change at a later stage, the stored function character set/collation\nwill not be changed at the same time; the stored function needs to be dropped\nand recreated to ensure the same character set/collation as the database is\nused.\n\nExamples\n--------\n\nThe following example function takes a parameter, performs an operation using\nan SQL function, and returns the result.\n\nCREATE FUNCTION hello (s CHAR(20))\n RETURNS CHAR(50) DETERMINISTIC\n RETURN CONCAT(\'Hello, \',s,\'!\');\n\nSELECT hello(\'world\');\n+----------------+\n| hello(\'world\') |\n+----------------+\n| Hello, world! |\n+----------------+\n\nYou can use a compound statement in a function to manipulate data with\nstatements like INSERT and UPDATE. The following example creates a counter\nfunction that uses a temporary table to store the current value. Because the\ncompound statement contains statements terminated with semicolons, you have to\nfirst change the statement delimiter with the DELIMITER statement to allow the\nsemicolon to be used in the function body. See Delimiters in the mysql client\nfor more.\n\nCREATE TEMPORARY TABLE counter (c INT);\nINSERT INTO counter VALUES (0);\nDELIMITER //\nCREATE FUNCTION counter () RETURNS INT\n BEGIN\n UPDATE counter SET c = c + 1;\n RETURN (SELECT c FROM counter LIMIT 1);\n END //\nDELIMITER ;\n\nCharacter set and collation:\n\nCREATE FUNCTION hello2 (s CHAR(20))\n RETURNS CHAR(50) CHARACTER SET \'utf8\' COLLATE \'utf8_bin\' DETERMINISTIC\n RETURN CONCAT(\'Hello, \',s,\'!\');\n\nURL: https://mariadb.com/kb/en/create-function/','','https://mariadb.com/kb/en/create-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (711,38,'CREATE INDEX','Syntax\n------\n\nCREATE [OR REPLACE] [UNIQUE|FULLTEXT|SPATIAL] INDEX \n [IF NOT EXISTS] index_name\n [index_type]\n ON tbl_name (index_col_name,...)\n [WAIT n | NOWAIT]\n [index_option]\n [algorithm_option | lock_option] ...\n\nindex_col_name:\n col_name [(length)] [ASC | DESC]\n\nindex_type:\n USING {BTREE | HASH | RTREE}\n\nindex_option:\n [ KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n | CLUSTERING={YES| NO} ]\n [ IGNORED | NOT IGNORED ]\n\nalgorithm_option:\n ALGORITHM [=] {DEFAULT|INPLACE|COPY|NOCOPY|INSTANT}\n\nlock_option:\n LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}\n\nDescription\n-----------\n\nCREATE INDEX is mapped to an ALTER TABLE statement to create indexes. See\nALTER TABLE. CREATE INDEX cannot be used to create a PRIMARY KEY; use ALTER\nTABLE instead.\n\nIf another connection is using the table, a metadata lock is active, and this\nstatement will wait until the lock is released. This is also true for\nnon-transactional tables.\n\nAnother shortcut, DROP INDEX, allows the removal of an index.\n\nFor valid identifiers to use as index names, see Identifier Names.\n\nNote that KEY_BLOCK_SIZE is currently ignored in CREATE INDEX, although it is\nincluded in the output of SHOW CREATE TABLE.\n\nPrivileges\n----------\n\nExecuting the CREATE INDEX statement requires the INDEX privilege for the\ntable or the database.\n\nOnline DDL\n----------\n\nOnline DDL is supported with the ALGORITHM and LOCK clauses.\n\nSee InnoDB Online DDL Overview for more information on online DDL with InnoDB.\n\nCREATE OR REPLACE INDEX\n-----------------------\n\nIf the OR REPLACE clause is used and if the index already exists, then instead\nof returning an error, the server will drop the existing index and replace it\nwith the newly defined index.\n\nCREATE INDEX IF NOT EXISTS\n--------------------------\n\nIf the IF NOT EXISTS clause is used, then the index will only be created if an\nindex with the same name does not already exist. If the index already exists,\nthen a warning will be triggered by default.\n\nIndex Definitions\n-----------------\n\nSee CREATE TABLE: Index Definitions for information about index definitions.\n\nWAIT/NOWAIT\n-----------\n\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nALGORITHM\n---------\n\nSee ALTER TABLE: ALGORITHM for more information.\n\nLOCK\n----\n\nSee ALTER TABLE: LOCK for more information.\n\nProgress Reporting\n------------------\n\nMariaDB provides progress reporting for CREATE INDEX statement for clients\nthat support the new progress reporting protocol. For example, if you were\nusing the mysql client, then the progress report might look like this::\n\nCREATE INDEX i ON tab (num);\nStage: 1 of 2 \'copy to tmp table\' 46% of stage\n\nThe progress report is also shown in the output of the SHOW PROCESSLIST\nstatement and in the contents of the information_schema.PROCESSLIST table.\n\nSee Progress Reporting for more information.\n\nWITHOUT OVERLAPS\n----------------\n\nMariaDB starting with 10.5.3\n----------------------------\nThe WITHOUT OVERLAPS clause allows one to constrain a primary or unique index\nsuch that application-time periods cannot overlap.\n\nExamples\n--------\n\nCreating a unique index:\n\nCREATE UNIQUE INDEX HomePhone ON Employees(Home_Phone);\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE INDEX xi ON xx5 (x);\nQuery OK, 0 rows affected (0.03 sec)\n\nCREATE INDEX xi ON xx5 (x);\nERROR 1061 (42000): Duplicate key name \'xi\'\n\nCREATE OR REPLACE INDEX xi ON xx5 (x);\nQuery OK, 0 rows affected (0.03 sec)\n\nCREATE INDEX IF NOT EXISTS xi ON xx5 (x);\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------+\n| Note | 1061 | Duplicate key name \'xi\' |\n+-------+------+-------------------------+\n\nFrom MariaDB 10.5.3, creating a unique index for an application-time period\ntable with a WITHOUT OVERLAPS constraint:\n\nCREATE UNIQUE INDEX u ON rooms (room_number, p WITHOUT OVERLAPS);\n\nURL: https://mariadb.com/kb/en/create-index/','','https://mariadb.com/kb/en/create-index/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (712,38,'CREATE PACKAGE','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nCREATE\n [ OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n PACKAGE [ IF NOT EXISTS ]\n [ db_name . ] package_name\n [ package_characteristic ... ]\n{ AS | IS }\n [ package_specification_element ... ]\nEND [ package_name ]\n\npackage_characteristic:\n COMMENT \'string\'\n | SQL SECURITY { DEFINER | INVOKER }\n\npackage_specification_element:\n FUNCTION_SYM package_specification_function ;\n | PROCEDURE_SYM package_specification_procedure ;\n\npackage_specification_function:\n func_name [ ( func_param [, func_param]... ) ]\n RETURNS func_return_type\n [ package_routine_characteristic... ]\n\npackage_specification_procedure:\n proc_name [ ( proc_param [, proc_param]... ) ]\n [ package_routine_characteristic... ]\n\nfunc_return_type:\n type\n\nfunc_param:\n param_name [ IN | OUT | INOUT | IN OUT ] type\n\nproc_param:\n param_name [ IN | OUT | INOUT | IN OUT ] type\n\ntype:\n Any valid MariaDB explicit or anchored data type\n\npackage_routine_characteristic:\n COMMENT \'string\'\n | LANGUAGE SQL\n | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n\nDescription\n-----------\n\nThe CREATE PACKAGE statement can be used when Oracle SQL_MODE is set.\n\nThe CREATE PACKAGE creates the specification for a stored package (a\ncollection of logically related stored objects). A stored package\nspecification declares public routines (procedures and functions) of the\npackage, but does not implement these routines.\n\nA package whose specification was created by the CREATE PACKAGE statement,\nshould later be implemented using the CREATE PACKAGE BODY statement.\n\nFunction parameter quantifiers IN | OUT | INOUT | IN OUT\n--------------------------------------------------------\n\nMariaDB starting with 10.8.0\n----------------------------\nThe function parameter quantifiers for IN, OUT, INOUT, and IN OUT where added\nin a 10.8.0 preview release. Prior to 10.8.0 quantifiers were supported only\nin procedures.\n\nOUT, INOUT and its equivalent IN OUT, are only valid if called from SET and\nnot SELECT. These quantifiers are especially useful for creating functions and\nprocedures with more than one return value. This allows functions and\nprocedures to be more complex and nested.\n\nExamples\n--------\n\nSET sql_mode=ORACLE;\nDELIMITER $$\nCREATE OR REPLACE PACKAGE employee_tools AS\n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);\n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));\n PROCEDURE raiseSalaryStd(eid INT);\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));\nEND;\n$$\nDELIMITER ;\n\nURL: https://mariadb.com/kb/en/create-package/','','https://mariadb.com/kb/en/create-package/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (713,38,'CREATE PACKAGE BODY','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nCREATE [ OR REPLACE ]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n PACKAGE BODY\n [ IF NOT EXISTS ]\n [ db_name . ] package_name\n [ package_characteristic... ]\n{ AS | IS }\n package_implementation_declare_section\n package_implementation_executable_section\nEND [ package_name]\n\npackage_implementation_declare_section:\n package_implementation_item_declaration\n [ package_implementation_item_declaration... ]\n [ package_implementation_routine_definition... ]\n | package_implementation_routine_definition\n [ package_implementation_routine_definition...]\n\npackage_implementation_item_declaration:\n variable_declaration ;\n\nvariable_declaration:\n variable_name[,...] type [:= expr ]\n\npackage_implementation_routine_definition:\n FUNCTION package_specification_function\n [ package_implementation_function_body ] ;\n | PROCEDURE package_specification_procedure\n [ package_implementation_procedure_body ] ;\n\npackage_implementation_function_body:\n { AS | IS } package_routine_body [func_name]\n\npackage_implementation_procedure_body:\n { AS | IS } package_routine_body [proc_name]\n\npackage_routine_body:\n [ package_routine_declarations ]\n BEGIN\n statements [ EXCEPTION exception_handlers ]\n END\n\npackage_routine_declarations:\n package_routine_declaration \';\' [package_routine_declaration \';\']...\n\npackage_routine_declaration:\n variable_declaration\n | condition_name CONDITION FOR condition_value\n | user_exception_name EXCEPTION\n | CURSOR_SYM cursor_name\n [ ( cursor_formal_parameters ) ]\n IS select_statement\n ;\n\npackage_implementation_executable_section:\n END\n | BEGIN\n statement ; [statement ; ]...\n [EXCEPTION exception_handlers]\n END\n\nexception_handlers:\n exception_handler [exception_handler...]\n\nexception_handler:\n WHEN_SYM condition_value [, condition_value]...\n THEN_SYM statement ; [statement ;]...\n\ncondition_value:\n condition_name\n | user_exception_name\n | SQLWARNING\n | SQLEXCEPTION\n | NOT FOUND\n | OTHERS_SYM\n | SQLSTATE [VALUE] sqlstate_value\n | mariadb_error_code\n\nDescription\n-----------\n\nThe CREATE PACKAGE BODY statement can be used when Oracle SQL_MODE is set.\n\nThe CREATE PACKAGE BODY statement creates the package body for a stored\npackage. The package specification must be previously created using the CREATE\nPACKAGE statement.\n\nA package body provides implementations of the package public routines and can\noptionally have:\n\n* package-wide private variables\n* package private routines\n* forward declarations for private routines\n* an executable initialization section\n\nExamples\n--------\n\nSET sql_mode=ORACLE;\nDELIMITER $$\nCREATE OR REPLACE PACKAGE employee_tools AS\n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);\n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));\n PROCEDURE raiseSalaryStd(eid INT);\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));\nEND;\n$$\nCREATE PACKAGE BODY employee_tools AS\n -- package body variables\n stdRaiseAmount DECIMAL(10,2):=500;\n\n-- private routines\n PROCEDURE log (eid INT, ecmnt TEXT) AS\n BEGIN\n INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt);\n END;\n\n-- public routines\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS\n eid INT;\n BEGIN\n INSERT INTO employee (name, salary) VALUES (ename, esalary);\n eid:= last_insert_id();\n log(eid, \'hire \' || ename);\n END;\n\nFUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS\n nSalary DECIMAL(10,2);\n BEGIN\n SELECT salary INTO nSalary FROM employee WHERE id=eid;\n log(eid, \'getSalary id=\' || eid || \' salary=\' || nSalary);\n RETURN nSalary;\n END;\n\nPROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS\n BEGIN\n UPDATE employee SET salary=salary+amount WHERE id=eid;\n log(eid, \'raiseSalary id=\' || eid || \' amount=\' || amount);\n END;\n\nPROCEDURE raiseSalaryStd(eid INT) AS\n BEGIN\n raiseSalary(eid, stdRaiseAmount);\n log(eid, \'raiseSalaryStd id=\' || eid);\n END;\n\nBEGIN\n -- This code is executed when the current session\n -- accesses any of the package routines for the first time\n log(0, \'Session \' || connection_id() || \' \' || current_user || \' started\');\nEND;\n$$\n\nDELIMITER ;\n\nURL: https://mariadb.com/kb/en/create-package-body/','','https://mariadb.com/kb/en/create-package-body/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (714,38,'CREATE PROCEDURE','Syntax\n------\n\nCREATE\n [OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])\n [characteristic ...] routine_body\n\nproc_parameter:\n [ IN | OUT | INOUT ] param_name type\n\ntype:\n Any valid MariaDB data type\n\ncharacteristic:\n LANGUAGE SQL\n | [NOT] DETERMINISTIC\n | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n\nroutine_body:\n Valid SQL procedure statement\n\nDescription\n-----------\n\nCreates a stored procedure. By default, a routine is associated with the\ndefault database. To associate the routine explicitly with a given database,\nspecify the name as db_name.sp_name when you create it.\n\nWhen the routine is invoked, an implicit USE db_name is performed (and undone\nwhen the routine terminates). The causes the routine to have the given default\ndatabase while it executes. USE statements within stored routines are\ndisallowed.\n\nWhen a stored procedure has been created, you invoke it by using the CALL\nstatement (see CALL).\n\nTo execute the CREATE PROCEDURE statement, it is necessary to have the CREATE\nROUTINE privilege. By default, MariaDB automatically grants the ALTER ROUTINE\nand EXECUTE privileges to the routine creator. See also Stored Routine\nPrivileges.\n\nThe DEFINER and SQL SECURITY clauses specify the security context to be used\nwhen checking access privileges at routine execution time, as described here.\nRequires the SUPER privilege, or, from MariaDB 10.5.2, the SET USER privilege.\n\nIf the routine name is the same as the name of a built-in SQL function, you\nmust use a space between the name and the following parenthesis when defining\nthe routine, or a syntax error occurs. This is also true when you invoke the\nroutine later. For this reason, we suggest that it is better to avoid re-using\nthe names of existing SQL functions for your own stored routines.\n\nThe IGNORE_SPACE SQL mode applies to built-in functions, not to stored\nroutines. It is always allowable to have spaces after a routine name,\nregardless of whether IGNORE_SPACE is enabled.\n\nThe parameter list enclosed within parentheses must always be present. If\nthere are no parameters, an empty parameter list of () should be used.\nParameter names are not case sensitive.\n\nEach parameter can be declared to use any valid data type, except that the\nCOLLATE attribute cannot be used.\n\nFor valid identifiers to use as procedure names, see Identifier Names.\n\nThings to be Aware of With CREATE OR REPLACE\n--------------------------------------------\n\n* One can\'t use OR REPLACE together with IF EXISTS.\n\nCREATE PROCEDURE IF NOT EXISTS\n------------------------------\n\nIf the IF NOT EXISTS clause is used, then the procedure will only be created\nif a procedure with the same name does not already exist. If the procedure\nalready exists, then a warning will be triggered by default.\n\nIN/OUT/INOUT\n------------\n\nEach parameter is an IN parameter by default. To specify otherwise for a\nparameter, use the keyword OUT or INOUT before the parameter name.\n\nAn IN parameter passes a value into a procedure. The procedure might modify\nthe value, but the modification is not visible to the caller when the\nprocedure returns. An OUT parameter passes a value from the procedure back to\nthe caller. Its initial value is NULL within the procedure, and its value is\nvisible to the caller when the procedure returns. An INOUT parameter is\ninitialized by the caller, can be modified by the procedure, and any change\nmade by the procedure is visible to the caller when the procedure returns.\n\nFor each OUT or INOUT parameter, pass a user-defined variable in the CALL\nstatement that invokes the procedure so that you can obtain its value when the\nprocedure returns. If you are calling the procedure from within another stored\nprocedure or function, you can also pass a routine parameter or local routine\nvariable as an IN or INOUT parameter.\n\nDETERMINISTIC/NOT DETERMINISTIC\n-------------------------------\n\nDETERMINISTIC and NOT DETERMINISTIC apply only to functions. Specifying\nDETERMINISTC or NON-DETERMINISTIC in procedures has no effect. The default\nvalue is NOT DETERMINISTIC. Functions are DETERMINISTIC when they always\nreturn the same value for the same input. For example, a truncate or substring\nfunction. Any function involving data, therefore, is always NOT DETERMINISTIC.\n\nCONTAINS SQL/NO SQL/READS SQL DATA/MODIFIES SQL DATA\n----------------------------------------------------\n\nCONTAINS SQL, NO SQL, READS SQL DATA, and MODIFIES SQL DATA are informative\nclauses that tell the server what the function does. MariaDB does not check in\nany way whether the specified clause is correct. If none of these clauses are\nspecified, CONTAINS SQL is used by default.\n\nMODIFIES SQL DATA means that the function contains statements that may modify\ndata stored in databases. This happens if the function contains statements\nlike DELETE, UPDATE, INSERT, REPLACE or DDL.\n\nREADS SQL DATA means that the function reads data stored in databases, but\ndoes not modify any data. This happens if SELECT statements are used, but\nthere no write operations are executed.\n\nCONTAINS SQL means that the function contains at least one SQL statement, but\nit does not read or write any data stored in a database. Examples include SET\nor DO.\n\nNO SQL means nothing, because MariaDB does not currently support any language\nother than SQL.\n\nThe routine_body consists of a valid SQL procedure statement. This can be a\nsimple statement such as SELECT or INSERT, or it can be a compound statement\nwritten using BEGIN and END. Compound statements can contain declarations,\nloops, and other control structure statements. See Programmatic and Compound\nStatements for syntax details.\n\nMariaDB allows routines to contain DDL statements, such as CREATE and DROP.\nMariaDB also allows stored procedures (but not stored functions) to contain\nSQL transaction statements such as COMMIT.\n\nFor additional information about statements that are not allowed in stored\nroutines, see Stored Routine Limitations.\n\nInvoking stored procedure from within programs\n----------------------------------------------\n\nFor information about invoking stored procedures from within programs written\nin a language that has a MariaDB/MySQL interface, see CALL.\n\nOR REPLACE\n----------\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP PROCEDURE IF EXISTS name;\nCREATE PROCEDURE name ...;\n\nwith the exception that any existing privileges for the procedure are not\ndropped.\n\nsql_mode\n--------\n\nMariaDB stores the sql_mode system variable setting that is in effect at the\ntime a routine is created, and always executes the routine with this setting\nin force, regardless of the server SQL mode in effect when the routine is\ninvoked.\n\nCharacter Sets and Collations\n-----------------------------\n\nProcedure parameters can be declared with any character set/collation. If the\ncharacter set and collation are not specifically set, the database defaults at\nthe time of creation will be used. If the database defaults change at a later\nstage, the stored procedure character set/collation will not be changed at the\nsame time; the stored procedure needs to be dropped and recreated to ensure\nthe same character set/collation as the database is used.\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nFrom MariaDB 10.3, a subset of Oracle\'s PL/SQL language has been supported in\naddition to the traditional SQL/PSM-based MariaDB syntax. See Oracle mode from\nMariaDB 10.3 for details on changes when running Oracle mode.\n\nExamples\n--------\n\nThe following example shows a simple stored procedure that uses an OUT\nparameter. It uses the DELIMITER command to set a new delimiter for the\nduration of the process — see Delimiters in the mysql client.\n\nDELIMITER //\n\nCREATE PROCEDURE simpleproc (OUT param1 INT)\n BEGIN\n SELECT COUNT(*) INTO param1 FROM t;\n END;\n//\n\nDELIMITER ;\n\nCALL simpleproc(@a);\n\nSELECT @a;\n+------+\n| @a |\n+------+\n| 1 |\n+------+\n\nCharacter set and collation:\n\nDELIMITER //\n\nCREATE PROCEDURE simpleproc2 (\n OUT param1 CHAR(10) CHARACTER SET \'utf8\' COLLATE \'utf8_bin\'\n)\n BEGIN\n SELECT CONCAT(\'a\'),f1 INTO param1 FROM t;\n END;\n//\n\nDELIMITER ;\n\nCREATE OR REPLACE:\n\nDELIMITER //\n\nCREATE PROCEDURE simpleproc2 (\n OUT param1 CHAR(10) CHARACTER SET \'utf8\' COLLATE \'utf8_bin\'\n)\n BEGIN\n SELECT CONCAT(\'a\'),f1 INTO param1 FROM t;\n END;\n//\nERROR 1304 (42000): PROCEDURE simpleproc2 already exists\n\nDELIMITER ;\n\nDELIMITER //\n\nCREATE OR REPLACE PROCEDURE simpleproc2 (\n OUT param1 CHAR(10) CHARACTER SET \'utf8\' COLLATE \'utf8_bin\'\n)\n BEGIN\n SELECT CONCAT(\'a\'),f1 INTO param1 FROM t;\n END;\n//\nERROR 1304 (42000): PROCEDURE simpleproc2 already exists\n\nDELIMITER ;\nQuery OK, 0 rows affected (0.03 sec)\n\nURL: https://mariadb.com/kb/en/create-procedure/','','https://mariadb.com/kb/en/create-procedure/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (715,38,'CREATE SERVER','Syntax\n------\n\nCREATE [OR REPLACE] SERVER [IF NOT EXISTS] server_name\n FOREIGN DATA WRAPPER wrapper_name\n OPTIONS (option [, option] ...)\n\noption:\n { HOST character-literal\n | DATABASE character-literal\n | USER character-literal\n | PASSWORD character-literal\n | SOCKET character-literal\n | OWNER character-literal\n | PORT numeric-literal }\n\nDescription\n-----------\n\nThis statement creates the definition of a server for use with the Spider,\nConnect, FEDERATED or FederatedX storage engine. The CREATE SERVER statement\ncreates a new row within the servers table within the mysql database. This\nstatement requires the SUPER privilege or, from MariaDB 10.5.2, the FEDERATED\nADMIN privilege.\n\nThe server_name should be a unique reference to the server. Server definitions\nare global within the scope of the server, it is not possible to qualify the\nserver definition to a specific database. server_name has a maximum length of\n64 characters (names longer than 64 characters are silently truncated), and is\ncase insensitive. You may specify the name as a quoted string.\n\nThe wrapper_name may be quoted with single quotes. Supported values are:\n\n* mysql\n* mariadb (in MariaDB 10.3 and later)\n\nFor each option you must specify either a character literal or numeric\nliteral. Character literals are UTF-8, support a maximum length of 64\ncharacters and default to a blank (empty) string. String literals are silently\ntruncated to 64 characters. Numeric literals must be a number between 0 and\n9999, default value is 0.\n\nNote: The OWNER option is currently not applied, and has no effect on the\nownership or operation of the server connection that is created.\n\nThe CREATE SERVER statement creates an entry in the mysql.servers table that\ncan later be used with the CREATE TABLE statement when creating a Spider,\nConnect, FederatedX or FEDERATED table. The options that you specify will be\nused to populate the columns in the mysql.servers table. The table columns are\nServer_name, Host, Db, Username, Password, Port and Socket.\n\nDROP SERVER removes a previously created server definition.\n\nCREATE SERVER is not written to the binary log, irrespective of the binary log\nformat being used. From MariaDB 10.1.13, Galera replicates the CREATE SERVER,\nALTER SERVER and DROP SERVER statements.\n\nFor valid identifiers to use as server names, see Identifier Names.\n\nOR REPLACE\n----------\n\nIf the optional OR REPLACE clause is used, it acts as a shortcut for:\n\nDROP SERVER IF EXISTS name;\nCREATE SERVER server_name ...;\n\nIF NOT EXISTS\n-------------\n\nIf the IF NOT EXISTS clause is used, MariaDB will return a warning instead of\nan error if the server already exists. Cannot be used together with OR REPLACE.\n\nExamples\n--------\n\nCREATE SERVER s\nFOREIGN DATA WRAPPER mysql\nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE \'test\');\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE SERVER s \nFOREIGN DATA WRAPPER mysql \nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE \'test\');\nERROR 1476 (HY000): The foreign server, s, you are trying to create already\nexists\n\nCREATE OR REPLACE SERVER s \nFOREIGN DATA WRAPPER mysql \nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE \'test\');\nQuery OK, 0 rows affected (0.00 sec)\n\nCREATE SERVER IF NOT EXISTS s \nFOREIGN DATA WRAPPER mysql \nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE \'test\');\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+---------------------------------------------------------------\n+\n| Level | Code | Message \n |\n+-------+------+---------------------------------------------------------------\n+\n| Note | 1476 | The foreign server, s, you are trying to create already\nexists |\n+-------+------+---------------------------------------------------------------\n+\n\nURL: https://mariadb.com/kb/en/create-server/','','https://mariadb.com/kb/en/create-server/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (716,38,'CREATE TABLESPACE','The CREATE TABLESPACE statement is not supported by MariaDB. It was originally\ninherited from MySQL NDB Cluster. In MySQL 5.7 and later, the statement is\nalso supported for InnoDB. However, MariaDB has chosen not to include that\nspecific feature. See MDEV-19294 for more information.\n\nURL: https://mariadb.com/kb/en/create-tablespace/','','https://mariadb.com/kb/en/create-tablespace/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (717,38,'CREATE TRIGGER','Syntax\n------\n\nCREATE [OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n TRIGGER [IF NOT EXISTS] trigger_name trigger_time trigger_event\n ON tbl_name FOR EACH ROW\n [{ FOLLOWS | PRECEDES } other_trigger_name ]\n trigger_stmt;\n\nDescription\n-----------\n\nThis statement creates a new trigger. A trigger is a named database object\nthat is associated with a table, and that activates when a particular event\noccurs for the table. The trigger becomes associated with the table named\ntbl_name, which must refer to a permanent table. You cannot associate a\ntrigger with a TEMPORARY table or a view.\n\nCREATE TRIGGER requires the TRIGGER privilege for the table associated with\nthe trigger.\n\nMariaDB starting with 10.2.3\n----------------------------\nYou can have multiple triggers for the same trigger_time and trigger_event.\n\nFor valid identifiers to use as trigger names, see Identifier Names.\n\nOR REPLACE\n----------\n\nMariaDB starting with 10.1.4\n----------------------------\nIf used and the trigger already exists, instead of an error being returned,\nthe existing trigger will be dropped and replaced by the newly defined trigger.\n\nDEFINER\n-------\n\nThe DEFINER clause determines the security context to be used when checking\naccess privileges at trigger activation time. Usage requires the SUPER\nprivilege, or, from MariaDB 10.5.2, the SET USER privilege.\n\nIF NOT EXISTS\n-------------\n\nMariaDB starting with 10.1.4\n----------------------------\nIf the IF NOT EXISTS clause is used, the trigger will only be created if a\ntrigger of the same name does not exist. If the trigger already exists, by\ndefault a warning will be returned.\n\ntrigger_time\n------------\n\ntrigger_time is the trigger action time. It can be BEFORE or AFTER to indicate\nthat the trigger activates before or after each row to be modified.\n\ntrigger_event\n-------------\n\ntrigger_event indicates the kind of statement that activates the trigger. The\ntrigger_event can be one of the following:\n\n* INSERT: The trigger is activated whenever a new row is inserted into the\ntable; for example, through INSERT, LOAD DATA, and REPLACE statements.\n* UPDATE: The trigger is activated whenever a row is modified; for example,\nthrough UPDATE statements.\n* DELETE: The trigger is activated whenever a row is deleted from the table;\nfor example, through DELETE and REPLACE statements. However, DROP TABLE and\nTRUNCATE statements on the table do not activate this trigger, because they do\nnot use DELETE. Dropping a partition does not activate DELETE triggers, either.\n\nFOLLOWS/PRECEDES other_trigger_name\n-----------------------------------\n\nMariaDB starting with 10.2.3\n----------------------------\nThe FOLLOWS other_trigger_name and PRECEDES other_trigger_name options were\nadded in MariaDB 10.2.3 as part of supporting multiple triggers per action\ntime. This is the same syntax used by MySQL 5.7, although MySQL 5.7 does not\nhave multi-trigger support.\n\nFOLLOWS adds the new trigger after another trigger while PRECEDES adds the new\ntrigger before another trigger. If neither option is used, the new trigger is\nadded last for the given action and time.\n\nFOLLOWS and PRECEDES are not stored in the trigger definition. However the\ntrigger order is guaranteed to not change over time. mariadb-dump/mysqldump\nand other backup methods will not change trigger order. You can verify the\ntrigger order from the ACTION_ORDER column in INFORMATION_SCHEMA.TRIGGERS\ntable.\n\nSELECT trigger_name, action_order FROM information_schema.triggers \n WHERE event_object_table=\'t1\';\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and CREATE TRIGGER is atomic.\n\nExamples\n--------\n\nCREATE DEFINER=`root`@`localhost` TRIGGER increment_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\n\nOR REPLACE and IF NOT EXISTS\n\nCREATE DEFINER=`root`@`localhost` TRIGGER increment_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\nERROR 1359 (HY000): Trigger already exists\n\nCREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER increment_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\nQuery OK, 0 rows affected (0.12 sec)\n\nCREATE DEFINER=`root`@`localhost` TRIGGER IF NOT EXISTS increment_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals = animal_count.animals+1;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------+\n| Level | Code | Message |\n+-------+------+------------------------+\n| Note | 1359 | Trigger already exists |\n+-------+------+------------------------+\n1 row in set (0.00 sec)\n\nURL: https://mariadb.com/kb/en/create-trigger/','','https://mariadb.com/kb/en/create-trigger/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (718,38,'CREATE VIEW','Syntax\n------\n\nCREATE\n [OR REPLACE]\n [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n [SQL SECURITY { DEFINER | INVOKER }]\n VIEW [IF NOT EXISTS] view_name [(column_list)]\n AS select_statement\n [WITH [CASCADED | LOCAL] CHECK OPTION]\n\nDescription\n-----------\n\nThe CREATE VIEW statement creates a new view, or replaces an existing one if\nthe OR REPLACE clause is given. If the view does not exist, CREATE OR REPLACE\nVIEW is the same as CREATE VIEW. If the view does exist, CREATE OR REPLACE\nVIEW is the same as ALTER VIEW.\n\nThe select_statement is a SELECT statement that provides the definition of the\nview. (When you select from the view, you select in effect using the SELECT\nstatement.) select_statement can select from base tables or other views.\n\nThe view definition is \"frozen\" at creation time, so changes to the underlying\ntables afterwards do not affect the view definition. For example, if a view is\ndefined as SELECT * on a table, new columns added to the table later do not\nbecome part of the view. A SHOW CREATE VIEW shows that such queries are\nrewritten and column names are included in the view definition.\n\nThe view definition must be a query that does not return errors at view\ncreation times. However, the base tables used by the views might be altered\nlater and the query may not be valid anymore. In this case, querying the view\nwill result in an error. CHECK TABLE helps in finding this kind of problems.\n\nThe ALGORITHM clause affects how MariaDB processes the view. The DEFINER and\nSQL SECURITY clauses specify the security context to be used when checking\naccess privileges at view invocation time. The WITH CHECK OPTION clause can be\ngiven to constrain inserts or updates to rows in tables referenced by the\nview. These clauses are described later in this section.\n\nThe CREATE VIEW statement requires the CREATE VIEW privilege for the view, and\nsome privilege for each column selected by the SELECT statement. For columns\nused elsewhere in the SELECT statement you must have the SELECT privilege. If\nthe OR REPLACE clause is present, you must also have the DROP privilege for\nthe view.\n\nA view belongs to a database. By default, a new view is created in the default\ndatabase. To create the view explicitly in a given database, specify the name\nas db_name.view_name when you create it.\n\nCREATE VIEW test.v AS SELECT * FROM t;\n\nBase tables and views share the same namespace within a database, so a\ndatabase cannot contain a base table and a view that have the same name.\n\nViews must have unique column names with no duplicates, just like base tables.\nBy default, the names of the columns retrieved by the SELECT statement are\nused for the view column names. To define explicit names for the view columns,\nthe optional column_list clause can be given as a list of comma-separated\nidentifiers. The number of names in column_list must be the same as the number\nof columns retrieved by the SELECT statement.\n\nMySQL until 5.1.28\n------------------\nPrior to MySQL 5.1.29, When you modify an existing view, the current view\ndefinition is backed up and saved. It is stored in that table\'s database\ndirectory, in a subdirectory named arc. The backup file for a view v is named\nv.frm-00001. If you alter the view again, the next backup is named\nv.frm-00002. The three latest view backup definitions are stored. Backed up\nview definitions are not preserved by mysqldump, or any other such programs,\nbut you can retain them using a file copy operation. However, they are not\nneeded for anything but to provide you with a backup of your previous view\ndefinition. It is safe to remove these backup definitions, but only while\nmysqld is not running. If you delete the arc subdirectory or its files while\nmysqld is running, you will receive an error the next time you try to alter\nthe view:\n\nMariaDB [test]> ALTER VIEW v AS SELECT * FROM t; \nERROR 6 (HY000): Error on delete of \'.\\test\\arc/v.frm-0004\' (Errcode: 2)\n\nColumns retrieved by the SELECT statement can be simple references to table\ncolumns. They can also be expressions that use functions, constant values,\noperators, and so forth.\n\nUnqualified table or view names in the SELECT statement are interpreted with\nrespect to the default database. A view can refer to tables or views in other\ndatabases by qualifying the table or view name with the proper database name.\n\nA view can be created from many kinds of SELECT statements. It can refer to\nbase tables or other views. It can use joins, UNION, and subqueries. The\nSELECT need not even refer to any tables. The following example defines a view\nthat selects two columns from another table, as well as an expression\ncalculated from those columns:\n\nCREATE TABLE t (qty INT, price INT);\n\nINSERT INTO t VALUES(3, 50);\n\nCREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;\n\nSELECT * FROM v;\n+------+-------+-------+\n| qty | price | value |\n+------+-------+-------+\n| 3 | 50 | 150 |\n+------+-------+-------+\n\nA view definition is subject to the following restrictions:\n\n* The SELECT statement cannot contain a subquery in the FROM clause.\n* The SELECT statement cannot refer to system or user variables.\n* Within a stored program, the definition cannot refer to program parameters\nor local variables.\n* The SELECT statement cannot refer to prepared statement parameters.\n* Any table or view referred to in the definition must exist. However, after a\nview has been created, it is possible to drop a table or view that the\ndefinition refers to. In this case, use of the view results in an error. To\ncheck a view definition for problems of this kind, use the CHECK TABLE\nstatement.\n* The definition cannot refer to a TEMPORARY table, and you cannot create a\nTEMPORARY view.\n* Any tables named in the view definition must exist at definition time.\n* You cannot associate a trigger with a view.\n* For valid identifiers to use as view names, see Identifier Names.\n\nORDER BY is allowed in a view definition, but it is ignored if you select from\na view using a statement that has its own ORDER BY.\n\nFor other options or clauses in the definition, they are added to the options\nor clauses of the statement that references the view, but the effect is\nundefined. For example, if a view definition includes a LIMIT clause, and you\nselect from the view using a statement that has its own LIMIT clause, it is\nundefined which limit applies. This same principle applies to options such as\nALL, DISTINCT, or SQL_SMALL_RESULT that follow the SELECT keyword, and to\nclauses such as INTO, FOR UPDATE, and LOCK IN SHARE MODE.\n\nThe PROCEDURE clause cannot be used in a view definition, and it cannot be\nused if a view is referenced in the FROM clause.\n\nIf you create a view and then change the query processing environment by\nchanging system variables, that may affect the results that you get from the\nview:\n\nCREATE VIEW v (mycol) AS SELECT \'abc\';\n\nSET sql_mode = \'\';\n\nSELECT \"mycol\" FROM v;\n+-------+\n| mycol |\n+-------+\n| mycol | \n+-------+\n\nSET sql_mode = \'ANSI_QUOTES\';\n\nSELECT \"mycol\" FROM v;\n+-------+\n| mycol |\n+-------+\n| abc | \n+-------+\n\nThe DEFINER and SQL SECURITY clauses determine which MariaDB account to use\nwhen checking access privileges for the view when a statement is executed that\nreferences the view. They were added in MySQL 5.1.2. The legal SQL SECURITY\ncharacteristic values are DEFINER and INVOKER. These indicate that the\nrequired privileges must be held by the user who defined or invoked the view,\nrespectively. The default SQL SECURITY value is DEFINER.\n\nIf a user value is given for the DEFINER clause, it should be a MariaDB\naccount in \'user_name\'@\'host_name\' format (the same format used in the GRANT\nstatement). The user_name and host_name values both are required. The definer\ncan also be given as CURRENT_USER or CURRENT_USER(). The default DEFINER value\nis the user who executes the CREATE VIEW statement. This is the same as\nspecifying DEFINER = CURRENT_USER explicitly.\n\nIf you specify the DEFINER clause, these rules determine the legal DEFINER\nuser values:\n\n* If you do not have the SUPER privilege, or, from MariaDB 10.5.2, the SET\nUSER privilege, the only legal user value is your own account, either\nspecified literally or by using CURRENT_USER. You cannot set the definer to\nsome other account.\n* If you have the SUPER privilege, or, from MariaDB 10.5.2, the SET USER\nprivilege, you can specify any syntactically legal account name. If the\naccount does not actually exist, a warning is generated.\n* If the SQL SECURITY value is DEFINER but the definer account does not exist\nwhen the view is referenced, an error occurs.\n\nWithin a view definition, CURRENT_USER returns the view\'s DEFINER value by\ndefault. For views defined with the SQL SECURITY INVOKER characteristic,\nCURRENT_USER returns the account for the view\'s invoker. For information about\nuser auditing within views, see\nhttp://dev.mysql.com/doc/refman/5.1/en/account-activity-auditing.html.\n\nWithin a stored routine that is defined with the SQL SECURITY DEFINER\ncharacteristic, CURRENT_USER returns the routine\'s DEFINER value. This also\naffects a view defined within such a program, if the view definition contains\na DEFINER value of CURRENT_USER.\n\nView privileges are checked like this:\n\n* At view definition time, the view creator must have the privileges needed to\nuse the top-level objects accessed by the view. For example, if the view\ndefinition refers to table columns, the creator must have privileges for the\ncolumns, as described previously. If the definition refers to a stored\nfunction, only the privileges needed to invoke the function can be checked.\nThe privileges required when the function runs can be checked only as it\nexecutes: For different invocations of the function, different execution paths\nwithin the function might be taken.\n* When a view is referenced, privileges for objects accessed by the view are\nchecked against the privileges held by the view creator or invoker, depending\non whether the SQL SECURITY characteristic is DEFINER or INVOKER, respectively.\n* If reference to a view causes execution of a stored function, privilege\nchecking for statements executed within the function depend on whether the\nfunction is defined with a SQL SECURITY characteristic of DEFINER or INVOKER.\nIf the security characteristic is DEFINER, the function runs with the\nprivileges of its creator. If the characteristic is INVOKER, the function runs\nwith the privileges determined by the view\'s SQL SECURITY characteristic.\n\nExample: A view might depend on a stored function, and that function might\ninvoke other stored routines. For example, the following view invokes a stored\nfunction f():\n\nCREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);\n\nSuppose that f() contains a statement such as this:\n\nIF name IS NULL then\n CALL p1();\nELSE\n CALL p2();\nEND IF;\n\nThe privileges required for executing statements within f() need to be checked\nwhen f() executes. This might mean that privileges are needed for p1() or\np2(), depending on the execution path within f(). Those privileges must be\nchecked at runtime, and the user who must possess the privileges is determined\nby the SQL SECURITY values of the view v and the function f().\n\nThe DEFINER and SQL SECURITY clauses for views are extensions to standard SQL.\nIn standard SQL, views are handled using the rules for SQL SECURITY INVOKER.\n\nIf you invoke a view that was created before MySQL 5.1.2, it is treated as\nthough it was created with a SQL SECURITY DEFINER clause and with a DEFINER\nvalue that is the same as your account. However, because the actual definer is\nunknown, MySQL issues a warning. To make the warning go away, it is sufficient\nto re-create the view so that the view definition includes a DEFINER clause.\n\nThe optional ALGORITHM clause is an extension to standard SQL. It affects how\nMariaDB processes the view. ALGORITHM takes three values: MERGE, TEMPTABLE, or\nUNDEFINED. The default algorithm is UNDEFINED if no ALGORITHM clause is\npresent. See View Algorithms for more information.\n\nSome views are updatable. That is, you can use them in statements such as\nUPDATE, DELETE, or INSERT to update the contents of the underlying table. For\na view to be updatable, there must be a one-to-one relationship between the\nrows in the view and the rows in the underlying table. There are also certain\nother constructs that make a view non-updatable. See Inserting and Updating\nwith Views.\n\nWITH CHECK OPTION\n-----------------\n\nThe WITH CHECK OPTION clause can be given for an updatable view to prevent\ninserts or updates to rows except those for which the WHERE clause in the\nselect_statement is true.\n\nIn a WITH CHECK OPTION clause for an updatable view, the LOCAL and CASCADED\nkeywords determine the scope of check testing when the view is defined in\nterms of another view. The LOCAL keyword restricts the CHECK OPTION only to\nthe view being defined. CASCADED causes the checks for underlying views to be\nevaluated as well. When neither keyword is given, the default is CASCADED.\n\nFor more information about updatable views and the WITH CHECK OPTION clause,\nsee Inserting and Updating with Views.\n\nIF NOT EXISTS\n-------------\n\nMariaDB starting with 10.1.3\n----------------------------\nThe IF NOT EXISTS clause was added in MariaDB 10.1.3\n\nWhen the IF NOT EXISTS clause is used, MariaDB will return a warning instead\nof an error if the specified view already exists. Cannot be used together with\nthe OR REPLACE clause.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and CREATE VIEW is atomic.\n\nExamples\n--------\n\nCREATE TABLE t (a INT, b INT) ENGINE = InnoDB;\n\nINSERT INTO t VALUES (1,1), (2,2), (3,3);\n\nCREATE VIEW v AS SELECT a, a*2 AS a2 FROM t;\n\nSELECT * FROM v;\n+------+------+\n| a | a2 |\n+------+------+\n| 1 | 2 |\n| 2 | 4 |\n| 3 | 6 |\n+------+------+\n\nOR REPLACE and IF NOT EXISTS:\n\nCREATE VIEW v AS SELECT a, a*2 AS a2 FROM t;\nERROR 1050 (42S01): Table \'v\' already exists\n\nCREATE OR REPLACE VIEW v AS SELECT a, a*2 AS a2 FROM t;\nQuery OK, 0 rows affected (0.04 sec)\n\nCREATE VIEW IF NOT EXISTS v AS SELECT a, a*2 AS a2 FROM t;\nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n','','https://mariadb.com/kb/en/create-view/');
+update help_topic set description = CONCAT(description, '\nSHOW WARNINGS;\n+-------+------+--------------------------+\n| Level | Code | Message |\n+-------+------+--------------------------+\n| Note | 1050 | Table \'v\' already exists |\n+-------+------+--------------------------+\n\nURL: https://mariadb.com/kb/en/create-view/') WHERE help_topic_id = 718;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (719,38,'Generated (Virtual and Persistent/Stored) Columns','Syntax\n------\n\n<type> [GENERATED ALWAYS] AS ( <expression> )\n[VIRTUAL | PERSISTENT | STORED] [UNIQUE] [UNIQUE KEY] [COMMENT <text>]\n\nMariaDB\'s generated columns syntax is designed to be similar to the syntax for\nMicrosoft SQL Server\'s computed columns and Oracle Database\'s virtual columns.\nIn MariaDB 10.2 and later, the syntax is also compatible with the syntax for\nMySQL\'s generated columns.\n\nDescription\n-----------\n\nA generated column is a column in a table that cannot explicitly be set to a\nspecific value in a DML query. Instead, its value is automatically generated\nbased on an expression. This expression might generate the value based on the\nvalues of other columns in the table, or it might generate the value by\ncalling built-in functions or user-defined functions (UDFs).\n\nThere are two types of generated columns:\n\n* PERSISTENT (a.k.a. STORED): This type\'s value is actually stored in the\ntable.\n* VIRTUAL: This type\'s value is not stored at all. Instead, the value is\ngenerated dynamically when the table is queried. This type is the default.\n\nGenerated columns are also sometimes called computed columns or virtual\ncolumns.\n\nSupported Features\n------------------\n\nStorage Engine Support\n----------------------\n\n* Generated columns can only be used with storage engines which support them.\nIf you try to use a storage engine that does not support them, then you will\nsee an error similar to the following:\n\nERROR 1910 (HY000): TokuDB storage engine does not support computed columns\n\n* InnoDB, Aria, MyISAM and CONNECT support generated columns.\n\n* A column in a MERGE table can be built on a PERSISTENT generated column.\nHowever, a column in a MERGE table can not be defined as a VIRTUAL and\nPERSISTENT generated column.\n\nData Type Support\n-----------------\n\n* All data types are supported when defining generated columns.\n\n* Using the ZEROFILL column option is supported when defining generated\ncolumns.\n\n* Using the AUTO_INCREMENT column option is not supported when defining\ngenerated columns. Until MariaDB 10.2.25, it was supported, but this support\nwas removed, because it would not work correctly. See MDEV-11117.\n\nIndex Support\n-------------\n\n* Using a generated column as a table\'s primary key is not supported. See\nMDEV-5590 for more information. If you try to use one as a primary key, then\nyou will see an error similar to the following:\n\nERROR 1903 (HY000): Primary key cannot be defined upon a computed column\n\n* Using PERSISTENT generated columns as part of a foreign key is supported.\n\n* Referencing PERSISTENT generated columns as part of a foreign key is also\nsupported.\nHowever, using the ON UPDATE CASCADE, ON UPDATE SET NULL, or ON DELETE SET\nNULL clauses is not supported. If you try to use an unsupported clause, then\nyou will see an error similar to the following:\n\nERROR 1905 (HY000): Cannot define foreign key with ON UPDATE SET NULL clause\non a computed column\n\n* Defining indexes on both VIRTUAL and PERSISTENT generated columns is\nsupported.\nIf an index is defined on a generated column, then the optimizer considers\nusing it in the same way as indexes based on \"real\" columns.\n\nStatement Support\n-----------------\n\n* Generated columns are used in DML queries just as if they were \"real\"\ncolumns.\nHowever, VIRTUAL and PERSISTENT generated columns differ in how their data is\nstored.\nValues for PERSISTENT generated columns are generated whenever a DML queries\ninserts or updates the row with the special DEFAULT value. This generates the\ncolumns value, and it is stored in the table like the other \"real\" columns.\nThis value can be read by other DML queries just like the other \"real\" columns.\nValues for VIRTUAL generated columns are not stored in the table. Instead, the\nvalue is generated dynamically whenever the column is queried. If other\ncolumns in a row are queried, but the VIRTUAL generated column is not one of\nthe queried columns, then the column\'s value is not generated.\n\n* The SELECT statement supports generated columns.\n\n* Generated columns can be referenced in the INSERT, UPDATE, and DELETE\nstatements.\nHowever, VIRTUAL or PERSISTENT generated columns cannot be explicitly set to\nany other values than NULL or DEFAULT. If a generated column is explicitly set\nto any other value, then the outcome depends on whether strict mode is enabled\nin sql_mode. If it is not enabled, then a warning will be raised and the\ndefault generated value will be used instead. If it is enabled, then an error\nwill be raised instead.\n\n* The CREATE TABLE statement has limited support for generated columns.\nIt supports defining generated columns in a new table.\nIt supports using generated columns to partition tables.\nIt does not support using the versioning clauses with generated columns.\n\n* The ALTER TABLE statement has limited support for generated columns.\nIt supports the MODIFY and CHANGE clauses for PERSISTENT generated columns.\nIt does not support the MODIFY clause for VIRTUAL generated columns if\nALGORITHM is not set to COPY. See MDEV-15476 for more information.\nIt does not support the CHANGE clause for VIRTUAL generated columns if\nALGORITHM is not set to COPY. See MDEV-17035 for more information.\nIt does not support altering a table if ALGORITHM is not set to COPY if the\ntable has a VIRTUAL generated column that is indexed. See MDEV-14046 for more\ninformation.\nIt does not support adding a VIRTUAL generated column with the ADD clause if\nthe same statement is also adding other columns if ALGORITHM is not set to\nCOPY. See MDEV-17468 for more information.\nIt also does not support altering an existing column into a VIRTUAL generated\ncolumn.\nIt supports using generated columns to partition tables.\nIt does not support using the versioning clauses with generated columns.\n\n* The SHOW CREATE TABLE statement supports generated columns.\n\n* The DESCRIBE statement can be used to check whether a table has generated\ncolumns.\nYou can tell which columns are generated by looking for the ones where the\nExtra column is set to either VIRTUAL or PERSISTENT. For example:\n\nDESCRIBE table1;\n+-------+-------------+------+-----+---------+------------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+-------------+------+-----+---------+------------+\n| a | int(11) | NO | | NULL | |\n| b | varchar(32) | YES | | NULL | |\n| c | int(11) | YES | | NULL | VIRTUAL |\n| d | varchar(5) | YES | | NULL | PERSISTENT |\n+-------+-------------+------+-----+---------+------------+\n\n* Generated columns can be properly referenced in the NEW and OLD rows in\ntriggers.\n\n* Stored procedures support generated columns.\n\n* The HANDLER statement supports generated columns.\n\nExpression Support\n------------------\n\n* Most legal, deterministic expressions which can be calculated are supported\nin expressions for generated columns.\n\n* Most built-in functions are supported in expressions for generated columns.\nHowever, some built-in functions can\'t be supported for technical reasons. For\nexample, If you try to use an unsupported function in an expression, an error\nis generated similar to the following:\n\nERROR 1901 (HY000): Function or expression \'dayname()\' cannot be used in the\nGENERATED ALWAYS AS clause of `v`\n\n* Subqueries are not supported in expressions for generated columns because\nthe underlying data can change.\n\n* Using anything that depends on data outside the row is not supported in\nexpressions for generated columns.\n\n* Stored functions are not supported in expressions for generated columns. See\nMDEV-17587 for more information.\n\n* Non-deterministic built-in functions are supported in expressions for not\nindexed VIRTUAL generated columns.\n\n* Non-deterministic built-in functions are not supported in expressions for\nPERSISTENT or indexed VIRTUAL generated columns.\n\n* User-defined functions (UDFs) are supported in expressions for generated\ncolumns.\nHowever, MariaDB can\'t check whether a UDF is deterministic, so it is up to\nthe user to be sure that they do not use non-deterministic UDFs with VIRTUAL\ngenerated columns.\n\n* Defining a generated column based on other generated columns defined before\nit in the table definition is supported. For example:\n\nCREATE TABLE t1 (a int as (1), b int as (a));\n\n* However, defining a generated column based on other generated columns\ndefined after in the table definition is not supported in expressions for\ngeneration columns because generated columns are calculated in the order they\nare defined.\n\n* Using an expression that exceeds 255 characters in length is supported in\nexpressions for generated columns. The new limit for the entire table\ndefinition, including all expressions for generated columns, is 65,535 bytes.\n\n* Using constant expressions is supported in expressions for generated\ncolumns. For example:\n\nCREATE TABLE t1 (a int as (1));\n\nMaking Stored Values Consistent\n-------------------------------\n\nWhen a generated column is PERSISTENT or indexed, the value of the expression\nneeds to be consistent regardless of the SQL Mode flags in the current\nsession. If it is not, then the table will be seen as corrupted when the value\nthat should actually be returned by the computed expression and the value that\nwas previously stored and/or indexed using a different sql_mode setting\ndisagree.\n\nThere are currently two affected classes of inconsistencies: character padding\nand unsigned subtraction:\n\n* For a VARCHAR or TEXT generated column the length of the value returned can\nvary depending on the PAD_CHAR_TO_FULL_LENGTH sql_mode flag. To make the\nvalue consistent, create the generated column using an RTRIM() or RPAD()\nfunction. Alternately, create the generated column as a CHAR column so that\nits data is always fully padded.\n\n* If a SIGNED generated column is based on the subtraction of an UNSIGNED\nvalue, the resulting value can vary depending on how large the value is and\nthe NO_UNSIGNED_SUBTRACTION sql_mode flag. To make the value consistent, use\nCAST() to ensure that each UNSIGNED operand is SIGNED before the subtraction.\n\nMariaDB starting with 10.5\n--------------------------\nBeginning in MariaDB 10.5, there is a fatal error generated when trying to\ncreate a generated column whose value can change depending on the SQL Mode\nwhen its data is PERSISTENT or indexed.\n\nFor an existing generated column that has a potentially inconsistent value, a\nwarning about a bad expression is generated the first time it is used (if\nwarnings are enabled).\n\nBeginning in MariaDB 10.4.8, MariaDB 10.3.18, and MariaDB 10.2.27 a\npotentially inconsistent generated column outputs a warning when created or\nfirst used (without restricting their creation).\n\nHere is an example of two tables that would be rejected in MariaDB 10.5 and\nwarned about in the other listed versions:\n\nCREATE TABLE bad_pad (\n txt CHAR(5),\n -- CHAR -> VARCHAR or CHAR -> TEXT can\'t be persistent or indexed:\n vtxt VARCHAR(5) AS (txt) PERSISTENT\n);\n\nCREATE TABLE bad_sub (\n num1 BIGINT UNSIGNED,\n num2 BIGINT UNSIGNED,\n -- The resulting value can vary for some large values\n vnum BIGINT AS (num1 - num2) VIRTUAL,\n KEY(vnum)\n);\n\nThe warnings for the above tables look like this:\n\nWarning (Code 1901): Function or expression \'`txt`\' cannot be used in the\nGENERATED ALWAYS AS clause of `vtxt`\nWarning (Code 1105): Expression depends on the @@sql_mode value\nPAD_CHAR_TO_FULL_LENGTH\n\nWarning (Code 1901): Function or expression \'`num1` - `num2`\' cannot be used\nin the GENERATED ALWAYS AS clause of `vnum`\nWarning (Code 1105): Expression depends on the @@sql_mode value\nNO_UNSIGNED_SUBTRACTION\n\nTo work around the issue, force the padding or type to make the generated\ncolumn\'s expression return a consistent value. For example:\n\nCREATE TABLE good_pad (\n txt CHAR(5),\n -- Using RTRIM() or RPAD() makes the value consistent:\n vtxt VARCHAR(5) AS (RTRIM(txt)) PERSISTENT,\n -- When not persistent or indexed, it is OK for the value to vary by mode:\n vtxt2 VARCHAR(5) AS (txt) VIRTUAL,\n -- CHAR -> CHAR is always OK:\n txt2 CHAR(5) AS (txt) PERSISTENT\n);\n\nCREATE TABLE good_sub (\n num1 BIGINT UNSIGNED,\n num2 BIGINT UNSIGNED,\n -- The indexed value will always be consistent in this expression:\n vnum BIGINT AS (CAST(num1 AS SIGNED) - CAST(num2 AS SIGNED)) VIRTUAL,\n KEY(vnum)\n);\n\nMySQL Compatibility Support\n---------------------------\n\n* The STORED keyword is supported as an alias for the PERSISTENT keyword.\n\n* Tables created with MySQL 5.7 or later that contain MySQL\'s generated\ncolumns can be imported into MariaDB without a dump and restore.\n\nImplementation Differences\n--------------------------\n\nGenerated columns are subject to various constraints in other DBMSs that are\nnot present in MariaDB\'s implementation. Generated columns may also be called\ncomputed columns or virtual columns in different implementations. The various\ndetails for a specific implementation can be found in the documentation for\neach specific DBMS.\n\nImplementation Differences Compared to Microsoft SQL Server\n-----------------------------------------------------------\n\nMariaDB\'s generated columns implementation does not enforce the following\nrestrictions that are present in Microsoft SQL Server\'s computed columns\nimplementation:\n\n* MariaDB allows server variables in generated column expressions, including\nthose that change dynamically, such as warning_count.\n* MariaDB allows the CONVERT_TZ() function to be called with a named time zone\nas an argument, even though time zone names and time offsets are configurable.\n* MariaDB allows the CAST() function to be used with non-unicode character\nsets, even though character sets are configurable and differ between\nbinaries/versions.\n* MariaDB allows FLOAT expressions to be used in generated columns. Microsoft\nSQL Server considers these expressions to be \"imprecise\" due to potential\ncross-platform differences in floating-point implementations and precision.\n* Microsoft SQL Server requires the ARITHABORT mode to be set, so that\ndivision by zero returns an error, and not a NULL.\n* Microsoft SQL Server requires QUOTED_IDENTIFIER to be set in sql_mode. In\nMariaDB, if data is inserted without ANSI_QUOTES set in sql_mode, then it will','','https://mariadb.com/kb/en/generated-columns/');
+update help_topic set description = CONCAT(description, '\nbe processed and stored differently in a generated column that contains quoted\nidentifiers.\n\nMicrosoft SQL Server enforces the above restrictions by doing one of the\nfollowing things:\n\n* Refusing to create computed columns.\n* Refusing to allow updates to a table containing them.\n* Refusing to use an index over such a column if it can not be guaranteed that\nthe expression is fully deterministic.\n\nIn MariaDB, as long as the sql_mode, language, and other settings that were in\neffect during the CREATE TABLE remain unchanged, the generated column\nexpression will always be evaluated the same. If any of these things change,\nthen please be aware that the generated column expression might not be\nevaluated the same way as it previously was.\n\nIf you try to update a virtual column, you will get an error if the default\nstrict mode is enabled in sql_mode, or a warning otherwise.\n\nDevelopment History\n-------------------\n\nGenerated columns was originally developed by Andrey Zhakov. It was then\nmodified by Sanja Byelkin and Igor Babaev at Monty Program for inclusion in\nMariaDB. Monty did the work on MariaDB 10.2 to lift a some of the old\nlimitations.\n\nExamples\n--------\n\nHere is an example table that uses both VIRTUAL and PERSISTENT virtual columns:\n\nUSE TEST;\n\nCREATE TABLE table1 (\n a INT NOT NULL,\n b VARCHAR(32),\n c INT AS (a mod 10) VIRTUAL,\n d VARCHAR(5) AS (left(b,5)) PERSISTENT);\n\nIf you describe the table, you can easily see which columns are virtual by\nlooking in the \"Extra\" column:\n\nDESCRIBE table1;\n+-------+-------------+------+-----+---------+------------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+-------------+------+-----+---------+------------+\n| a | int(11) | NO | | NULL | |\n| b | varchar(32) | YES | | NULL | |\n| c | int(11) | YES | | NULL | VIRTUAL |\n| d | varchar(5) | YES | | NULL | PERSISTENT |\n+-------+-------------+------+-----+---------+------------+\n\nTo find out what function(s) generate the value of the virtual column you can\nuse SHOW CREATE TABLE:\n\nSHOW CREATE TABLE table1;\n\n| table1 | CREATE TABLE `table1` (\n `a` int(11) NOT NULL,\n `b` varchar(32) DEFAULT NULL,\n `c` int(11) AS (a mod 10) VIRTUAL,\n `d` varchar(5) AS (left(b,5)) PERSISTENT\n) ENGINE=MyISAM DEFAULT CHARSET=latin1 |\n\nIf you try to insert non-default values into a virtual column, you will\nreceive a warning and what you tried to insert will be ignored and the derived\nvalue inserted instead:\n\nWARNINGS;\nShow warnings enabled.\n\nINSERT INTO table1 VALUES (1, \'some text\',default,default);\nQuery OK, 1 row affected (0.00 sec)\n\nINSERT INTO table1 VALUES (2, \'more text\',5,default);\nQuery OK, 1 row affected, 1 warning (0.00 sec)\n\nWarning (Code 1645): The value specified for computed column \'c\' in table\n\'table1\' has been ignored.\n\nINSERT INTO table1 VALUES (123, \'even more text\',default,\'something\');\nQuery OK, 1 row affected, 2 warnings (0.00 sec)\n\nWarning (Code 1645): The value specified for computed column \'d\' in table\n\'table1\' has been ignored.\nWarning (Code 1265): Data truncated for column \'d\' at row 1\n\nSELECT * FROM table1;\n+-----+----------------+------+-------+\n| a | b | c | d |\n+-----+----------------+------+-------+\n| 1 | some text | 1 | some |\n| 2 | more text | 2 | more |\n| 123 | even more text | 3 | even |\n+-----+----------------+------+-------+\n3 rows in set (0.00 sec)\n\nIf the ZEROFILL clause is specified, it should be placed directly after the\ntype definition, before the AS (<expression>):\n\nCREATE TABLE table2 (a INT, b INT ZEROFILL AS (a*2) VIRTUAL);\nINSERT INTO table2 (a) VALUES (1);\n\nSELECT * FROM table2;\n+------+------------+\n| a | b |\n+------+------------+\n| 1 | 0000000002 |\n+------+------------+\n1 row in set (0.00 sec)\n\nYou can also use virtual columns to implement a \"poor man\'s partial index\".\nSee example at the end of Unique Index.\n\nURL: https://mariadb.com/kb/en/generated-columns/') WHERE help_topic_id = 719;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (720,38,'Invisible Columns','MariaDB starting with 10.3.3\n----------------------------\nInvisible columns (sometimes also called hidden columns) first appeared in\nMariaDB 10.3.3.\n\nColumns can be given an INVISIBLE attribute in a CREATE TABLE or ALTER TABLE\nstatement. These columns will then not be listed in the results of a SELECT *\nstatement, nor do they need to be assigned a value in an INSERT statement,\nunless INSERT explicitly mentions them by name.\n\nSince SELECT * does not return the invisible columns, new tables or views\ncreated in this manner will have no trace of the invisible columns. If\nspecifically referenced in the SELECT statement, the columns will be brought\ninto the view/new table, but the INVISIBLE attribute will not.\n\nInvisible columns can be declared as NOT NULL, but then require a DEFAULT\nvalue.\n\nIt is not possible for all columns in a table to be invisible.\n\nExamples\n--------\n\nCREATE TABLE t (x INT INVISIBLE);\nERROR 1113 (42000): A table must have at least 1 column\n\nCREATE TABLE t (x INT, y INT INVISIBLE, z INT INVISIBLE NOT NULL);\nERROR 4106 (HY000): Invisible column `z` must have a default value\n\nCREATE TABLE t (x INT, y INT INVISIBLE, z INT INVISIBLE NOT NULL DEFAULT 4);\n\nINSERT INTO t VALUES (1),(2);\n\nINSERT INTO t (x,y) VALUES (3,33);\n\nSELECT * FROM t;\n+------+\n| x |\n+------+\n| 1 |\n| 2 |\n| 3 |\n+------+\n\nSELECT x,y,z FROM t;\n+------+------+---+\n| x | y | z |\n+------+------+---+\n| 1 | NULL | 4 |\n| 2 | NULL | 4 |\n| 3 | 33 | 4 |\n+------+------+---+\n\nDESC t;\n+-------+---------+------+-----+---------+-----------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-----------+\n| x | int(11) | YES | | NULL | |\n| y | int(11) | YES | | NULL | INVISIBLE |\n| z | int(11) | NO | | 4 | INVISIBLE |\n+-------+---------+------+-----+---------+-----------+\n\nALTER TABLE t MODIFY x INT INVISIBLE, MODIFY y INT, MODIFY z INT NOT NULL\nDEFAULT 4;\n\nDESC t;\n+-------+---------+------+-----+---------+-----------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-----------+\n| x | int(11) | YES | | NULL | INVISIBLE |\n| y | int(11) | YES | | NULL | |\n| z | int(11) | NO | | 4 | |\n+-------+---------+------+-----+---------+-----------+\n\nCreating a view from a table with hidden columns:\n\nCREATE VIEW v1 AS SELECT * FROM t;\n\nDESC v1;\n+-------+---------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-------+\n| y | int(11) | YES | | NULL | |\n| z | int(11) | NO | | 4 | |\n+-------+---------+------+-----+---------+-------+\n\nCREATE VIEW v2 AS SELECT x,y,z FROM t;\n\nDESC v2;\n+-------+---------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-------+\n| x | int(11) | YES | | NULL | |\n| y | int(11) | YES | | NULL | |\n| z | int(11) | NO | | 4 | |\n+-------+---------+------+-----+---------+-------+\n\nAdding a Surrogate Primary Key:\n\ncreate table t1 (x bigint unsigned not null, y varchar(16), z text);\n\ninsert into t1 values (123, \'qq11\', \'ipsum\');\n\ninsert into t1 values (123, \'qq22\', \'lorem\');\n\nalter table t1 add pkid serial primary key invisible first;\n\ninsert into t1 values (123, \'qq33\', \'amet\');\n\nselect * from t1;\n+-----+------+-------+\n| x | y | z |\n+-----+------+-------+\n| 123 | qq11 | ipsum |\n| 123 | qq22 | lorem |\n| 123 | qq33 | amet |\n+-----+------+-------+\n\nselect pkid, z from t1;\n+------+-------+\n| pkid | z |\n+------+-------+\n| 1 | ipsum |\n| 2 | lorem |\n| 3 | amet |\n+------+-------+\n\nURL: https://mariadb.com/kb/en/invisible-columns/','','https://mariadb.com/kb/en/invisible-columns/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (721,38,'DROP DATABASE','Syntax\n------\n\nDROP {DATABASE | SCHEMA} [IF EXISTS] db_name\n\nDescription\n-----------\n\nDROP DATABASE drops all tables in the database and deletes the database. Be\nvery careful with this statement! To use DROP DATABASE, you need the DROP\nprivilege on the database. DROP SCHEMA is a synonym for DROP DATABASE.\n\nImportant: When a database is dropped, user privileges on the database are not\nautomatically dropped. See GRANT.\n\nIF EXISTS\n---------\n\nUse IF EXISTS to prevent an error from occurring for databases that do not\nexist. A NOTE is generated for each non-existent database when using IF\nEXISTS. See SHOW WARNINGS.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL.\n\nDROP DATABASE is implemented as\n\nloop over all tables\n DROP TABLE table\n\nEach individual DROP TABLE is atomic while DROP DATABASE as a whole is\ncrash-safe.\n\nExamples\n--------\n\nDROP DATABASE bufg;\nQuery OK, 0 rows affected (0.39 sec)\n\nDROP DATABASE bufg;\nERROR 1008 (HY000): Can\'t drop database \'bufg\'; database doesn\'t exist\n\n\\W\nShow warnings enabled.\n\nDROP DATABASE IF EXISTS bufg;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\nNote (Code 1008): Can\'t drop database \'bufg\'; database doesn\'t exist\n\nURL: https://mariadb.com/kb/en/drop-database/','','https://mariadb.com/kb/en/drop-database/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (722,38,'DROP EVENT','Syntax\n------\n\nDROP EVENT [IF EXISTS] event_name\n\nDescription\n-----------\n\nThis statement drops the event named event_name. The event immediately ceases\nbeing active, and is deleted completely from the server.\n\nIf the event does not exist, the error ERROR 1517 (HY000): Unknown event\n\'event_name\' results. You can override this and cause the statement to\ngenerate a NOTE for non-existent events instead by using IF EXISTS. See SHOW\nWARNINGS.\n\nThis statement requires the EVENT privilege. In MySQL 5.1.11 and earlier, an\nevent could be dropped only by its definer, or by a user having the SUPER\nprivilege.\n\nExamples\n--------\n\nDROP EVENT myevent3;\n\nUsing the IF EXISTS clause:\n\nDROP EVENT IF EXISTS myevent3;\nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------------+\n| Note | 1305 | Event myevent3 does not exist |\n+-------+------+-------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-event/','','https://mariadb.com/kb/en/drop-event/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (723,38,'DROP FUNCTION','Syntax\n------\n\nDROP FUNCTION [IF EXISTS] f_name\n\nDescription\n-----------\n\nThe DROP FUNCTION statement is used to drop a stored function or a\nuser-defined function (UDF). That is, the specified routine is removed from\nthe server, along with all privileges specific to the function. You must have\nthe ALTER ROUTINE privilege for the routine in order to drop it. If the\nautomatic_sp_privileges server system variable is set, both the ALTER ROUTINE\nand EXECUTE privileges are granted automatically to the routine creator - see\nStored Routine Privileges.\n\nIF EXISTS\n---------\n\nThe IF EXISTS clause is a MySQL/MariaDB extension. It prevents an error from\noccurring if the function does not exist. A NOTE is produced that can be\nviewed with SHOW WARNINGS.\n\nFor dropping a user-defined functions (UDF), see DROP FUNCTION UDF.\n\nExamples\n--------\n\nDROP FUNCTION hello;\nQuery OK, 0 rows affected (0.042 sec)\n\nDROP FUNCTION hello;\nERROR 1305 (42000): FUNCTION test.hello does not exist\n\nDROP FUNCTION IF EXISTS hello;\nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------+\n| Note | 1305 | FUNCTION test.hello does not exist |\n+-------+------+------------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-function/','','https://mariadb.com/kb/en/drop-function/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (724,38,'DROP INDEX','Syntax\n------\n\nDROP INDEX [IF EXISTS] index_name ON tbl_name \n [WAIT n |NOWAIT]\n\nDescription\n-----------\n\nDROP INDEX drops the index named index_name from the table tbl_name. This\nstatement is mapped to an ALTER TABLE statement to drop the index.\n\nIf another connection is using the table, a metadata lock is active, and this\nstatement will wait until the lock is released. This is also true for\nnon-transactional tables.\n\nSee ALTER TABLE.\n\nAnother shortcut, CREATE INDEX, allows the creation of an index.\n\nTo remove the primary key, `PRIMARY` must be specified as index_name. Note\nthat the quotes are necessary, because PRIMARY is a keyword.\n\nPrivileges\n----------\n\nExecuting the DROP INDEX statement requires the INDEX privilege for the table\nor the database.\n\nOnline DDL\n----------\n\nOnline DDL is used by default with InnoDB, when the drop index operation\nsupports it.\n\nSee InnoDB Online DDL Overview for more information on online DDL with InnoDB.\n\nDROP INDEX IF EXISTS ...\n------------------------\n\nIf the IF EXISTS clause is used, then MariaDB will return a warning instead of\nan error if the index does not exist.\n\nWAIT/NOWAIT\n-----------\n\nMariaDB starting with 10.3.0\n----------------------------\nSet the lock wait timeout. See WAIT and NOWAIT.\n\nProgress Reporting\n------------------\n\nMariaDB provides progress reporting for DROP INDEX statement for clients that\nsupport the new progress reporting protocol. For example, if you were using\nthe mysql client, then the progress report might look like this::\n\nURL: https://mariadb.com/kb/en/drop-index/','','https://mariadb.com/kb/en/drop-index/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (725,38,'DROP PACKAGE','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nDROP PACKAGE [IF EXISTS] [ db_name . ] package_name\n\nDescription\n-----------\n\nThe DROP PACKAGE statement can be used when Oracle SQL_MODE is set.\n\nThe DROP PACKAGE statement drops a stored package entirely:\n\n* Drops the package specification (earlier created using the CREATE PACKAGE\nstatement).\n* Drops the package implementation, if the implementation was already created\nusing the CREATE PACKAGE BODY statement.\n\nURL: https://mariadb.com/kb/en/drop-package/','','https://mariadb.com/kb/en/drop-package/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (726,38,'DROP PACKAGE BODY','MariaDB starting with 10.3.5\n----------------------------\nOracle-style packages were introduced in MariaDB 10.3.5.\n\nSyntax\n------\n\nDROP PACKAGE BODY [IF EXISTS] [ db_name . ] package_name\n\nDescription\n-----------\n\nThe DROP PACKAGE BODY statement can be used when Oracle SQL_MODE is set.\n\nThe DROP PACKAGE BODY statement drops the package body (i.e the\nimplementation), previously created using the CREATE PACKAGE BODY statement.\n\nNote, DROP PACKAGE BODY drops only the package implementation, but does not\ndrop the package specification. Use DROP PACKAGE to drop the package entirely\n(i.e. both implementation and specification).\n\nURL: https://mariadb.com/kb/en/drop-package-body/','','https://mariadb.com/kb/en/drop-package-body/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (727,38,'DROP PROCEDURE','Syntax\n------\n\nDROP PROCEDURE [IF EXISTS] sp_name\n\nDescription\n-----------\n\nThis statement is used to drop a stored procedure. That is, the specified\nroutine is removed from the server along with all privileges specific to the\nprocedure. You must have the ALTER ROUTINE privilege for the routine. If the\nautomatic_sp_privileges server system variable is set, that privilege and\nEXECUTE are granted automatically to the routine creator - see Stored Routine\nPrivileges.\n\nThe IF EXISTS clause is a MySQL/MariaDB extension. It prevents an error from\noccurring if the procedure or function does not exist. A NOTE is produced that\ncan be viewed with SHOW WARNINGS.\n\nWhile this statement takes effect immediately, threads which are executing a\nprocedure can continue execution.\n\nExamples\n--------\n\nDROP PROCEDURE simpleproc;\n\nIF EXISTS:\n\nDROP PROCEDURE simpleproc;\nERROR 1305 (42000): PROCEDURE test.simpleproc does not exist\n\nDROP PROCEDURE IF EXISTS simpleproc;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------------+\n| Note | 1305 | PROCEDURE test.simpleproc does not exist |\n+-------+------+------------------------------------------+\n\nURL: https://mariadb.com/kb/en/drop-procedure/','','https://mariadb.com/kb/en/drop-procedure/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (728,38,'DROP SERVER','Syntax\n------\n\nDROP SERVER [ IF EXISTS ] server_name\n\nDescription\n-----------\n\nDrops the server definition for the server named server_name. The\ncorresponding row within the mysql.servers table will be deleted. This\nstatement requires the SUPER privilege or, from MariaDB 10.5.2, the FEDERATED\nADMIN privilege.\n\nDropping a server for a table does not affect any FederatedX, FEDERATED,\nConnect or Spider tables that used this connection information when they were\ncreated.\n\nDROP SERVER is not written to the binary log, irrespective of the binary log\nformat being used. From MariaDB 10.1.13, Galera replicates the CREATE SERVER,\nALTER SERVER and DROP SERVER statements.\n\nIF EXISTS\n---------\n\nIf the IF EXISTS clause is used, MariaDB will not return an error if the\nserver does not exist. Unlike all other statements, DROP SERVER IF EXISTS does\nnot issue a note if the server does not exist. See MDEV-9400.\n\nExamples\n--------\n\nDROP SERVER s;\n\nIF EXISTS:\n\nDROP SERVER s;\nERROR 1477 (HY000): The foreign server name you are trying to reference \n does not exist. Data source error: s\n\nDROP SERVER IF EXISTS s;\nQuery OK, 0 rows affected (0.00 sec)\n\nURL: https://mariadb.com/kb/en/drop-server/','','https://mariadb.com/kb/en/drop-server/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (729,38,'DROP TABLESPACE','The DROP TABLESPACE statement is not supported by MariaDB. It was originally\ninherited from MySQL NDB Cluster. In MySQL 5.7 and later, the statement is\nalso supported for InnoDB. However, MariaDB has chosen not to include that\nspecific feature. See MDEV-19294 for more information.\n\nURL: https://mariadb.com/kb/en/drop-tablespace/','','https://mariadb.com/kb/en/drop-tablespace/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (730,38,'DROP TRIGGER','Syntax\n------\n\nDROP TRIGGER [IF EXISTS] [schema_name.]trigger_name\n\nDescription\n-----------\n\nThis statement drops a trigger. The schema (database) name is optional. If the\nschema is omitted, the trigger is dropped from the default schema. Its use\nrequires the TRIGGER privilege for the table associated with the trigger.\n\nUse IF EXISTS to prevent an error from occurring for a trigger that does not\nexist. A NOTE is generated for a non-existent trigger when using IF EXISTS.\nSee SHOW WARNINGS.\n\nNote: Triggers for a table are also dropped if you drop the table.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and DROP TRIGGER is atomic.\n\nExamples\n--------\n\nDROP TRIGGER test.example_trigger;\n\nUsing the IF EXISTS clause:\n\nDROP TRIGGER IF EXISTS test.example_trigger;\nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n\nSHOW WARNINGS;\n+-------+------+------------------------+\n| Level | Code | Message |\n+-------+------+------------------------+\n| Note | 1360 | Trigger does not exist |\n+-------+------+------------------------+\n\nURL: https://mariadb.com/kb/en/drop-trigger/','','https://mariadb.com/kb/en/drop-trigger/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (731,38,'DROP VIEW','Syntax\n------\n\nDROP VIEW [IF EXISTS]\n view_name [, view_name] ...\n [RESTRICT | CASCADE]\n\nDescription\n-----------\n\nDROP VIEW removes one or more views. You must have the DROP privilege for each\nview. If any of the views named in the argument list do not exist, MariaDB\nreturns an error indicating by name which non-existing views it was unable to\ndrop, but it also drops all of the views in the list that do exist.\n\nThe IF EXISTS clause prevents an error from occurring for views that don\'t\nexist. When this clause is given, a NOTE is generated for each non-existent\nview. See SHOW WARNINGS.\n\nRESTRICT and CASCADE, if given, are parsed and ignored.\n\nIt is possible to specify view names as db_name.view_name. This is useful to\ndelete views from multiple databases with one statement. See Identifier\nQualifiers for details.\n\nThe DROP privilege is required to use DROP TABLE on non-temporary tables. For\ntemporary tables, no privilege is required, because such tables are only\nvisible for the current session.\n\nIf a view references another view, it will be possible to drop the referenced\nview. However, the other view will reference a view which does not exist any\nmore. Thus, querying it will produce an error similar to the following:\n\nERROR 1356 (HY000): View \'db_name.view_name\' references invalid table(s) or \ncolumn(s) or function(s) or definer/invoker of view lack rights to use them\n\nThis problem is reported in the output of CHECK TABLE.\n\nNote that it is not necessary to use DROP VIEW to replace an existing view,\nbecause CREATE VIEW has an OR REPLACE clause.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and DROP VIEW for a singular view is\natomic. Dropping multiple views is crash-safe.\n\nExamples\n--------\n\nDROP VIEW v,v2;\n\nGiven views v and v2, but no view v3\n\nDROP VIEW v,v2,v3;\nERROR 1051 (42S02): Unknown table \'v3\'\n\nDROP VIEW IF EXISTS v,v2,v3;\nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n\nSHOW WARNINGS;\n+-------+------+-------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------+\n| Note | 1051 | Unknown table \'test.v3\' |\n+-------+------+-------------------------+\n\nURL: https://mariadb.com/kb/en/drop-view/','','https://mariadb.com/kb/en/drop-view/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (732,38,'CONSTRAINT','MariaDB supports the implementation of constraints at the table-level using\neither CREATE TABLE or ALTER TABLE statements. A table constraint restricts\nthe data you can add to the table. If you attempt to insert invalid data on a\ncolumn, MariaDB throws an error.\n\nSyntax\n------\n\n[CONSTRAINT [symbol]] constraint_expression\n\nconstraint_expression:\n | PRIMARY KEY [index_type] (index_col_name, ...) [index_option] ...\n | FOREIGN KEY [index_name] (index_col_name, ...)\n REFERENCES tbl_name (index_col_name, ...)\n [ON DELETE reference_option]\n [ON UPDATE reference_option]\n | UNIQUE [INDEX|KEY] [index_name]\n [index_type] (index_col_name, ...) [index_option] ...\n | CHECK (check_constraints)\n\nindex_type:\n USING {BTREE | HASH | RTREE}\n\nindex_col_name:\n col_name [(length)] [ASC | DESC]\n\nindex_option:\n | KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n | CLUSTERING={YES|NO}\n\nreference_option:\n RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT\n\nDescription\n-----------\n\nConstraints provide restrictions on the data you can add to a table. This\nallows you to enforce data integrity from MariaDB, rather than through\napplication logic. When a statement violates a constraint, MariaDB throws an\nerror.\n\nThere are four types of table constraints:\n\n+------------------------------------+---------------------------------------+\n| Constraint | Description |\n+------------------------------------+---------------------------------------+\n| PRIMARY KEY | Sets the column for referencing |\n| | rows. Values must be unique and not |\n| | null. |\n+------------------------------------+---------------------------------------+\n| FOREIGN KEY | Sets the column to reference the |\n| | primary key on another table. |\n+------------------------------------+---------------------------------------+\n| UNIQUE | Requires values in column or columns |\n| | only occur once in the table. |\n+------------------------------------+---------------------------------------+\n| CHECK | Checks whether the data meets the |\n| | given condition. |\n+------------------------------------+---------------------------------------+\n\nThe Information Schema TABLE_CONSTRAINTS Table contains information about\ntables that have constraints.\n\nFOREIGN KEY Constraints\n-----------------------\n\nInnoDB supports foreign key constraints. The syntax for a foreign key\nconstraint definition in InnoDB looks like this:\n\n[CONSTRAINT [symbol]] FOREIGN KEY\n [index_name] (index_col_name, ...)\n REFERENCES tbl_name (index_col_name,...)\n [ON DELETE reference_option]\n [ON UPDATE reference_option]\n\nreference_option:\n RESTRICT | CASCADE | SET NULL | NO ACTION\n\nThe Information Schema REFERENTIAL_CONSTRAINTS table has more information\nabout foreign keys.\n\nCHECK Constraints\n-----------------\n\nMariaDB starting with 10.2.1\n----------------------------\nFrom MariaDB 10.2.1, constraints are enforced. Before MariaDB 10.2.1\nconstraint expressions were accepted in the syntax but ignored.\n\nIn MariaDB 10.2.1 you can define constraints in 2 different ways:\n\n* CHECK(expression) given as part of a column definition.\n* CONSTRAINT [constraint_name] CHECK (expression)\n\nBefore a row is inserted or updated, all constraints are evaluated in the\norder they are defined. If any constraint expression returns false, then the\nrow will not be inserted or updated. One can use most deterministic functions\nin a constraint, including UDFs.\n\nCREATE TABLE t1 (a INT CHECK (a>2), b INT CHECK (b>2), CONSTRAINT a_greater\nCHECK (a>b));\n\nIf you use the second format and you don\'t give a name to the constraint, then\nthe constraint will get an automatically generated name. This is done so that\nyou can later delete the constraint with ALTER TABLE DROP constraint_name.\n\nOne can disable all constraint expression checks by setting the\ncheck_constraint_checks variable to OFF. This is useful for example when\nloading a table that violates some constraints that you want to later find and\nfix in SQL.\n\nReplication\n-----------\n\nIn row-based replication, only the master checks constraints, and failed\nstatements will not be replicated. In statement-based replication, the slaves\nwill also check constraints. Constraints should therefore be identical, as\nwell as deterministic, in a replication environment.\n\nAuto_increment\n--------------\n\nMariaDB starting with 10.2.6\n----------------------------\n* From MariaDB 10.2.6, auto_increment columns are no longer permitted in check\nconstraints. Previously they were permitted, but would not work correctly. See\nMDEV-11117.\n\nExamples\n--------\n\nCREATE TABLE product (category INT NOT NULL, id INT NOT NULL,\n price DECIMAL,\n PRIMARY KEY(category, id)) ENGINE=INNODB;\nCREATE TABLE customer (id INT NOT NULL,\n PRIMARY KEY (id)) ENGINE=INNODB;\nCREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,\n product_category INT NOT NULL,\n product_id INT NOT NULL,\n customer_id INT NOT NULL,\n PRIMARY KEY(no),\n INDEX (product_category, product_id),\n FOREIGN KEY (product_category, product_id)\n REFERENCES product(category, id)\n ON UPDATE CASCADE ON DELETE RESTRICT,\n INDEX (customer_id),\n FOREIGN KEY (customer_id)\n REFERENCES customer(id)) ENGINE=INNODB;\n\nMariaDB starting with 10.2.1\n----------------------------\nThe following examples will work from MariaDB 10.2.1 onwards.\n\nNumeric constraints and comparisons:\n\nCREATE TABLE t1 (a INT CHECK (a>2), b INT CHECK (b>2), CONSTRAINT a_greater\nCHECK (a>b));\n\nINSERT INTO t1(a) VALUES (1);\nERROR 4022 (23000): CONSTRAINT `a` failed for `test`.`t1`\n\nINSERT INTO t1(a,b) VALUES (3,4);\nERROR 4022 (23000): CONSTRAINT `a_greater` failed for `test`.`t1`\n\nINSERT INTO t1(a,b) VALUES (4,3);\nQuery OK, 1 row affected (0.04 sec)\n\nDropping a constraint:\n\nALTER TABLE t1 DROP CONSTRAINT a_greater;\n\nAdding a constraint:\n\nALTER TABLE t1 ADD CONSTRAINT a_greater CHECK (a>b);\n\nDate comparisons and character length:\n\nCREATE TABLE t2 (name VARCHAR(30) CHECK (CHAR_LENGTH(name)>2), start_date\nDATE, \n end_date DATE CHECK (start_date IS NULL OR end_date IS NULL OR\nstart_date<end_date));\n\nINSERT INTO t2(name, start_date, end_date) VALUES(\'Ione\', \'2003-12-15\',\n\'2014-11-09\');\nQuery OK, 1 row affected (0.04 sec)\n\nINSERT INTO t2(name, start_date, end_date) VALUES(\'Io\', \'2003-12-15\',\n\'2014-11-09\');\nERROR 4022 (23000): CONSTRAINT `name` failed for `test`.`t2`\n\nINSERT INTO t2(name, start_date, end_date) VALUES(\'Ione\', NULL, \'2014-11-09\');\nQuery OK, 1 row affected (0.04 sec)\n\nINSERT INTO t2(name, start_date, end_date) VALUES(\'Ione\', \'2015-12-15\',\n\'2014-11-09\');\nERROR 4022 (23000): CONSTRAINT `end_date` failed for `test`.`t2`\n\nA misplaced parenthesis:\n\nCREATE TABLE t3 (name VARCHAR(30) CHECK (CHAR_LENGTH(name>2)), start_date\nDATE, \n end_date DATE CHECK (start_date IS NULL OR end_date IS NULL OR\nstart_date<end_date));\nQuery OK, 0 rows affected (0.32 sec)\n\nINSERT INTO t3(name, start_date, end_date) VALUES(\'Io\', \'2003-12-15\',\n\'2014-11-09\');\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n\nSHOW WARNINGS;\n+---------+------+----------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------+\n| Warning | 1292 | Truncated incorrect DOUBLE value: \'Io\' |\n+---------+------+----------------------------------------+\n\nCompare the definition of table t2 to table t3. CHAR_LENGTH(name)>2 is very\ndifferent to CHAR_LENGTH(name>2) as the latter mistakenly performs a numeric\ncomparison on the name field, leading to unexpected results.\n\nURL: https://mariadb.com/kb/en/constraint/','','https://mariadb.com/kb/en/constraint/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (733,38,'Dynamic Columns','Dynamic columns allow one to store different sets of columns for each row in a\ntable. It works by storing a set of columns in a blob and having a small set\nof functions to manipulate it. Dynamic columns should be used when it is not\npossible to use regular columns. A typical use case is when one needs to store\nitems that may have many different attributes (like size, color, weight, etc),\nand the set of possible attributes is very large and/or unknown in advance. In\nthat case, attributes can be put into dynamic columns.\n\nDynamic Columns Basics\n----------------------\n\nThe table should have a blob column which will be used as storage for dynamic\ncolumns:\n\ncreate table assets (\n item_name varchar(32) primary key, -- A common attribute for all items\n dynamic_cols blob -- Dynamic columns will be stored here\n);\n\nOnce created, one can access dynamic columns via dynamic column functions:\n\nInsert a row with two dynamic columns: color=blue, size=XL\n\nINSERT INTO assets VALUES \n (\'MariaDB T-shirt\', COLUMN_CREATE(\'color\', \'blue\', \'size\', \'XL\'));\n\nInsert another row with dynamic columns: color=black, price=500\n\nINSERT INTO assets VALUES\n (\'Thinkpad Laptop\', COLUMN_CREATE(\'color\', \'black\', \'price\', 500));\n\nSelect dynamic column \'color\' for all items:\n\nSELECT item_name, COLUMN_GET(dynamic_cols, \'color\' as char) \n AS color FROM assets;\n+-----------------+-------+\n| item_name | color |\n+-----------------+-------+\n| MariaDB T-shirt | blue |\n| Thinkpad Laptop | black |\n+-----------------+-------+\n\nIt is possible to add and remove dynamic columns from a row:\n\n-- Remove a column:\nUPDATE assets SET dynamic_cols=COLUMN_DELETE(dynamic_cols, \"price\") \nWHERE COLUMN_GET(dynamic_cols, \'color\' as char)=\'black\';\n\n-- Add a column:\nUPDATE assets SET dynamic_cols=COLUMN_ADD(dynamic_cols, \'warranty\', \'3 years\')\nWHERE item_name=\'Thinkpad Laptop\';\n\nYou can also list all columns, or get them together with their values in JSON\nformat:\n\nSELECT item_name, column_list(dynamic_cols) FROM assets;\n+-----------------+---------------------------+\n| item_name | column_list(dynamic_cols) |\n+-----------------+---------------------------+\n| MariaDB T-shirt | `size`,`color` |\n| Thinkpad Laptop | `color`,`warranty` |\n+-----------------+---------------------------+\n\nSELECT item_name, COLUMN_JSON(dynamic_cols) FROM assets;\n+-----------------+----------------------------------------+\n| item_name | COLUMN_JSON(dynamic_cols) |\n+-----------------+----------------------------------------+\n| MariaDB T-shirt | {\"size\":\"XL\",\"color\":\"blue\"} |\n| Thinkpad Laptop | {\"color\":\"black\",\"warranty\":\"3 years\"} |\n+-----------------+----------------------------------------+\n\nDynamic Columns Reference\n-------------------------\n\nThe rest of this page is a complete reference of dynamic columns in MariaDB\n\nDynamic Columns Functions\n-------------------------\n\nCOLUMN_CREATE\n-------------\n\nCOLUMN_CREATE(column_nr, value [as type], [column_nr, value \n [as type]]...);\nCOLUMN_CREATE(column_name, value [as type], [column_name, value \n [as type]]...);\n\nReturn a dynamic columns blob that stores the specified columns with values.\n\nThe return value is suitable for\n\n* \nstoring in a table\nfurther modification with other dynamic columns functions\n\nThe as type part allows one to specify the value type. In most cases, this is\nredundant because MariaDB will be able to deduce the type of the value.\nExplicit type specification may be needed when the type of the value is not\napparent. For example, a literal \'2012-12-01\' has a CHAR type by default, one\nwill need to specify \'2012-12-01\' AS DATE to have it stored as a date. See the\nDatatypes section for further details. Note also MDEV-597.\n\nTypical usage:\n\n-- MariaDB 5.3+:\nINSERT INTO tbl SET dyncol_blob=COLUMN_CREATE(1 /*column id*/, \"value\");\n-- MariaDB 10.0.1+:\nINSERT INTO tbl SET dyncol_blob=COLUMN_CREATE(\"column_name\", \"value\");\n\nCOLUMN_ADD\n----------\n\nCOLUMN_ADD(dyncol_blob, column_nr, value [as type], \n [column_nr, value [as type]]...);\nCOLUMN_ADD(dyncol_blob, column_name, value [as type], \n [column_name, value [as type]]...);\n\nAdds or updates dynamic columns.\n\n* \ndyncol_blob must be either a valid dynamic columns blob (for example,\nCOLUMN_CREATE returns such blob), or an empty string.\ncolumn_name specifies the name of the column to be added. If dyncol_blob\nalready has a column with this name, it will be overwritten.\nvalue specifies the new value for the column. Passing a NULL value will cause\nthe column to be deleted.\nas type is optional. See #datatypes section for a discussion about types.\n\nThe return value is a dynamic column blob after the modifications.\n\nTypical usage:\n\n-- MariaDB 5.3+:\nUPDATE tbl SET dyncol_blob=COLUMN_ADD(dyncol_blob, 1 /*column id*/, \"value\") \n WHERE id=1;\n-- MariaDB 10.0.1+:\nUPDATE t1 SET dyncol_blob=COLUMN_ADD(dyncol_blob, \"column_name\", \"value\") \n WHERE id=1;\n\nNote: COLUMN_ADD() is a regular function (just like CONCAT()), hence, in order\nto update the value in the table you have to use the UPDATE ... SET\ndynamic_col=COLUMN_ADD(dynamic_col, ....) pattern.\n\nCOLUMN_GET\n----------\n\nCOLUMN_GET(dyncol_blob, column_nr as type);\nCOLUMN_GET(dyncol_blob, column_name as type);\n\nGet the value of a dynamic column by its name. If no column with the given\nname exists, NULL will be returned.\n\ncolumn_name as type requires that one specify the datatype of the dynamic\ncolumn they are reading.\n\nThis may seem counter-intuitive: why would one need to specify which datatype\nthey\'re retrieving? Can\'t the dynamic columns system figure the datatype from\nthe data being stored?\n\nThe answer is: SQL is a statically-typed language. The SQL interpreter needs\nto know the datatypes of all expressions before the query is run (for example,\nwhen one is using prepared statements and runs \"select COLUMN_GET(...)\", the\nprepared statement API requires the server to inform the client about the\ndatatype of the column being read before the query is executed and the server\ncan see what datatype the column actually has).\n\nSee the Datatypes section for more information about datatypes.\n\nCOLUMN_DELETE\n-------------\n\nCOLUMN_DELETE(dyncol_blob, column_nr, column_nr...);\nCOLUMN_DELETE(dyncol_blob, column_name, column_name...);\n\nDelete a dynamic column with the specified name. Multiple names can be given.\n\nThe return value is a dynamic column blob after the modification.\n\nCOLUMN_EXISTS\n-------------\n\nCOLUMN_EXISTS(dyncol_blob, column_nr);\nCOLUMN_EXISTS(dyncol_blob, column_name);\n\nCheck if a column with name column_name exists in dyncol_blob. If yes, return\n1, otherwise return 0.\n\nCOLUMN_LIST\n-----------\n\nCOLUMN_LIST(dyncol_blob);\n\nReturn a comma-separated list of column names. The names are quoted with\nbackticks.\n\nSELECT column_list(column_create(\'col1\',\'val1\',\'col2\',\'val2\'));\n+---------------------------------------------------------+\n| column_list(column_create(\'col1\',\'val1\',\'col2\',\'val2\')) |\n+---------------------------------------------------------+\n| `col1`,`col2` |\n+---------------------------------------------------------+\n\nCOLUMN_CHECK\n------------\n\nCOLUMN_CHECK(dyncol_blob);\n\nCheck if dyncol_blob is a valid packed dynamic columns blob. Return value of 1\nmeans the blob is valid, return value of 0 means it is not.\n\nRationale: Normally, one works with valid dynamic column blobs. Functions like\nCOLUMN_CREATE, COLUMN_ADD, COLUMN_DELETE always return valid dynamic column\nblobs. However, if a dynamic column blob is accidentally truncated, or\ntranscoded from one character set to another, it will be corrupted. This\nfunction can be used to check if a value in a blob field is a valid dynamic\ncolumn blob.\n\nNote: It is possible that a truncation cut a Dynamic Column \"clearly\" so that\nCOLUMN_CHECK will not notice the corruption, but in any case of truncation a\nwarning is issued during value storing.\n\nCOLUMN_JSON\n-----------\n\nCOLUMN_JSON(dyncol_blob);\n\nReturn a JSON representation of data in dyncol_blob.\n\nExample:\n\nSELECT item_name, COLUMN_JSON(dynamic_cols) FROM assets;\n+-----------------+----------------------------------------+\n| item_name | COLUMN_JSON(dynamic_cols) |\n+-----------------+----------------------------------------+\n| MariaDB T-shirt | {\"size\":\"XL\",\"color\":\"blue\"} |\n| Thinkpad Laptop | {\"color\":\"black\",\"warranty\":\"3 years\"} |\n+-----------------+----------------------------------------+\n\nLimitation: COLUMN_JSON will decode nested dynamic columns at a nesting level\nof not more than 10 levels deep. Dynamic columns that are nested deeper than\n10 levels will be shown as BINARY string, without encoding.\n\nNesting Dynamic Columns\n-----------------------\n\nIt is possible to use nested dynamic columns by putting one dynamic column\nblob inside another. The COLUMN_JSON function will display nested columns.\n\nSET @tmp= column_create(\'parent_column\', \n column_create(\'child_column\', 12345));\nQuery OK, 0 rows affected (0.00 sec)\n\nSELECT column_json(@tmp);\n+------------------------------------------+\n| column_json(@tmp) |\n+------------------------------------------+\n| {\"parent_column\":{\"child_column\":12345}} |\n+------------------------------------------+\n\nSELECT column_get(column_get(@tmp, \'parent_column\' AS char), \n \'child_column\' AS int);\n+------------------------------------------------------------------------------\n\n| column_get(column_get(@tmp, \'parent_column\' as char), \'child_column\' as int)\n|\n+------------------------------------------------------------------------------\n\n| 12345\n|\n+------------------------------------------------------------------------------\n\nIf you are trying to get a nested dynamic column as a string use \'as BINARY\'\nas the last argument of COLUMN_GET (otherwise problems with character set\nconversion and illegal symbols are possible):\n\nselect column_json( column_get(\n column_create(\'test1\',\n column_create(\'key1\',\'value1\',\'key2\',\'value2\',\'key3\',\'value3\')),\n \'test1\' as BINARY));\n\nDatatypes\n---------\n\nIn SQL, one needs to define the type of each column in a table. Dynamic\ncolumns do not provide any way to declare a type in advance (\"whenever there\nis a column \'weight\', it should be integer\" is not possible). However, each\nparticular dynamic column value is stored together with its datatype.\n\nThe set of possible datatypes is mostly the same as that used by the SQL CAST\nand CONVERT functions. However, note that there are currently some differences\n- see MDEV-597.\n\n+--------+----------------------------------------------+-------------------+\n| type | dynamic column internal type | description |\n+--------+----------------------------------------------+-------------------+\n| BINARY | DYN_COL_STRING | (variable length |\n| (N)] | | string with |\n| | | binary charset) |\n+--------+----------------------------------------------+-------------------+\n| CHAR[( | DYN_COL_STRING | (variable length |\n| )] | | string with |\n| | | charset) |\n+--------+----------------------------------------------+-------------------+\n| DATE | DYN_COL_DATE | (date - 3 bytes) |\n+--------+----------------------------------------------+-------------------+\n| DATETI | DYN_COL_DATETIME | (date and time |\n| E[(D)] | | (with |\n| | | microseconds) - |\n| | | 9 bytes) |\n+--------+----------------------------------------------+-------------------+\n| DECIMA | DYN_COL_DECIMAL | (variable length |\n| [(M[,D | | binary decimal |\n| )] | | representation |\n| | | with MariaDB |\n| | | limitation) |\n+--------+----------------------------------------------+-------------------+\n| DOUBLE | DYN_COL_DOUBLE | (64 bit |\n| (M,D)] | | double-precision |\n| | | floating point) |\n+--------+----------------------------------------------+-------------------+\n| INTEGE | DYN_COL_INT | (variable |\n| | | length, up to 64 |\n| | | bit signed |\n| | | integer) |\n+--------+----------------------------------------------+-------------------+\n| SIGNED | DYN_COL_INT | (variable |\n| [INTEG | | length, up to 64 |\n| R] | | bit signed |\n| | | integer) |\n+--------+----------------------------------------------+-------------------+\n| TIME[( | DYN_COL_TIME | (time (with |\n| )] | | microseconds, |\n| | | may be negative) |\n| | | - 6 bytes) |\n+--------+----------------------------------------------+-------------------+\n| UNSIGN | DYN_COL_UINT | (variable |\n| D | | length, up to |','','https://mariadb.com/kb/en/dynamic-columns/');
+update help_topic set description = CONCAT(description, '\n| [INTEG | | 64bit unsigned |\n| R] | | integer) |\n+--------+----------------------------------------------+-------------------+\n\nA Note About Lengths\n--------------------\n\nIf you\'re running queries like\n\nSELECT COLUMN_GET(blob, \'colname\' as CHAR) ...\n\nwithout specifying a maximum length (i.e. using #as CHAR#, not as CHAR(n)),\nMariaDB will report the maximum length of the resultset column to be\n53,6870,911 (bytes or characters?) for MariaDB 5.3-10.0.0 and 16,777,216 for\nMariaDB 10.0.1+. This may cause excessive memory usage in some client\nlibraries, because they try to pre-allocate a buffer of maximum resultset\nwidth. If you suspect you\'re hitting this problem, use CHAR(n) whenever you\'re\nusing COLUMN_GET in the select list.\n\nMariaDB 5.3 vs MariaDB 10.0\n---------------------------\n\nThe dynamic columns feature was introduced into MariaDB in two steps:\n\n* MariaDB 5.3 was the first version to support dynamic columns. Only numbers\n could be used as column names in this version.\n* In MariaDB 10.0.1, column names can be either numbers or strings.\n Also, the COLUMN_JSON and COLUMN_CHECK functions were added.\n\nSee also Dynamic Columns in MariaDB 10.\n\nClient-side API\n---------------\n\nIt is also possible to create or parse dynamic columns blobs on the client\nside. libmysql client library now includes an API for writing/reading dynamic\ncolumn blobs. See dynamic-columns-api for details.\n\nLimitations\n-----------\n\n+---------------------------------------------------+------------------------+\n| Description | Limit |\n+---------------------------------------------------+------------------------+\n| Max number of columns | 65535 |\n+---------------------------------------------------+------------------------+\n| Max total length of packed dynamic column | max_allowed_packet |\n| | (1G) |\n+---------------------------------------------------+------------------------+\n\nURL: https://mariadb.com/kb/en/dynamic-columns/') WHERE help_topic_id = 733;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (734,38,'Dynamic Columns from MariaDB 10','MariaDB starting with 10.0.1\n----------------------------\nMariaDB 10.0.1 introduced the following improvements to the dynamic columns\nfeature.\n\nColumn Name Support\n-------------------\n\nIt is possible to refer to column by names. Names can be used everywhere where\nin MariaDB 5.3 one could use only strings:\n\n* Create a dynamic column blob:\n\nCOLUMN_CREATE(\'int_col\', 123 as int, \'double_col\', 3.14 as double,\n\'string_col\', \'text-data\' as char);\n\n* Set a column value:\n\nCOLUMN_ADD(dyncol_blob, \'intcol\', 1234);\n\n* Get a column value:\n\nCOLUMN_GET(dynstr, \'column1\' as char(10));\n\n* Check whether a column exists\n\nCOLUMN_EXISTS(dyncol_blob, \'column_name\');\n\nChanges in Behavior\n-------------------\n\n* Column list output now includes quoting:\n\nselect column_list(column_create(1, 22, 2, 23));\n+------------------------------------------+\n| column_list(column_create(1, 22, 2, 23)) |\n+------------------------------------------+\n| `1`,`2` |\n+------------------------------------------+\nselect column_list(column_create(\'column1\', 22, \'column2\', 23)); \n+----------------------------------------------------------+\n| column_list(column_create(\'column1\', 22, \'column2\', 23)) |\n+----------------------------------------------------------+\n| `column1`,`column2` |\n+----------------------------------------------------------+\n\n* Column name interpretation has been changed so that the string now is not\nconverted to a number. So some \"magic\" tricks will not work any more, for\nexample, \"1test\" and \"1\" now become different column names:\n\nselect column_list(column_add(column_create(\'1a\', 22), \'1b\', 23));\n+------------------------------------------------------------+\n| column_list(column_add(column_create(\'1a\', 22), \'1b\', 23)) |\n+------------------------------------------------------------+\n| `1a`,`1b` |\n+------------------------------------------------------------+\n\n* Old behavior:\n\nselect column_list(column_add(column_create(\'1a\', 22), \'1b\', 23));\n+------------------------------------------------------------+\n| column_list(column_add(column_create(\'1a\', 22), \'1b\', 23)) |\n+------------------------------------------------------------+\n| 1 |\n+------------------------------------------------------------+\n\nNew Functions\n-------------\n\nThe following new functions have been added to dynamic columns in MariaDB 10\n\nCOLUMN_CHECK\n------------\n\nCOLUMN_CHECK is used to check a column\'s integrity. When it encounters an\nerror it does not return illegal format errors but returns false instead. It\nalso checks integrity more thoroughly and finds errors in the dynamic column\ninternal structures which might not be found by other functions.\n\nselect column_check(column_create(\'column1\', 22));\n+--------------------------------------------+\n| column_check(column_create(\'column1\', 22)) |\n+--------------------------------------------+\n| 1 |\n+--------------------------------------------+\nselect column_check(\'abracadabra\');\n+-----------------------------+\n| column_check(\'abracadabra\') |\n+-----------------------------+\n| 0 |\n+-----------------------------+\n\nCOLUMN_JSON\n-----------\n\nCOLUMN_JSON converts all dynamic column record content to a JSON object.\n\nselect column_json(column_create(\'column1\', 1, \'column2\', \"two\"));\n+------------------------------------------------------------+\n| column_json(column_create(\'column1\', 1, \'column2\', \"two\")) |\n+------------------------------------------------------------+\n| {\"column1\":1,\"column2\":\"two\"} |\n+------------------------------------------------------------+\n\nOther Changes\n-------------\n\n* All API functions has prefix mariadb_dyncol_ (old prefix dynamic_column_ is\ndepricated\n* API changed to be able to work with the new format (*_named functions).\n* Removed \'delete\' function because deleting could be done by adding NULL\nvalue.\n* \'Time\' and \'datetime\' in the new format are stored without microseconds if\nthey are 0.\n* New function added to API (except that two which are representing SQL level\nfunctions):\n\'Unpack\' the dynamic columns content to an arrays of values and names.\n3 functions to get any column value as string, integer (long long) or floating\npoint (double).\n\n* New type of \"dynamic column\" row added on the API level (in SQL level output\nit is a string but if you use dynamic column functions to construct object it\nwill be added as dynamic column value) which allow to add dynamic columns\ninside dynamic columns. JSON function represent such recursive constructions\ncorrectly but limit depth of representation as current implementation limit\n(internally depth of dynamic columns embedding is not limited).\n\nInterface with Cassandra\n------------------------\n\nCassandraSE is no longer actively being developed and has been removed in\nMariaDB 10.6. See MDEV-23024.\n\nSome internal changes were added to dynamic columns to allow them to serve as\nan interface to Apache Cassandra dynamic columns. The Cassandra engine may\npack all columns which were not mentioned in the MariaDB interface table\ndefinition and even bring changes in the dynamic column contents back to the\ncassandra columns family (the table analog in cassandra).\n\nURL: https://mariadb.com/kb/en/dynamic-columns-from-mariadb-10/','','https://mariadb.com/kb/en/dynamic-columns-from-mariadb-10/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (735,38,'MERGE','Description\n-----------\n\nThe MERGE storage engine, also known as the MRG_MyISAM engine, is a collection\nof identical MyISAM tables that can be used as one. \"Identical\" means that all\ntables have identical column and index information. You cannot merge MyISAM\ntables in which the columns are listed in a different order, do not have\nexactly the same columns, or have the indexes in different order. However, any\nor all of the MyISAM tables can be compressed with myisampack. Columns names\nand indexes names can be different, as long as data types and NULL/NOT NULL\nclauses are the same. Differences in table options such as AVG_ROW_LENGTH,\nMAX_ROWS, or PACK_KEYS do not matter.\n\nEach index in a MERGE table must match an index in underlying MyISAM tables,\nbut the opposite is not true. Also, a MERGE table cannot have a PRIMARY KEY or\nUNIQUE indexes, because it cannot enforce uniqueness over all underlying\ntables.\n\nThe following options are meaningful for MERGE tables:\n\n* UNION. This option specifies the list of the underlying MyISAM tables. The\nlist is enclosed between parentheses and separated with commas.\n* INSERT_METHOD. This options specifies whether, and how, INSERTs are allowed\nfor the table. Allowed values are: NO (INSERTs are not allowed), FIRST (new\nrows will be written into the first table specified in the UNION list), LAST\n(new rows will be written into the last table specified in the UNION list).\nThe default value is NO.\n\nIf you define a MERGE table with a definition which is different from the\nunderlying MyISAM tables, or one of the underlying tables is not MyISAM, the\nCREATE TABLE statement will not return any error. But any statement which\ninvolves the table will produce an error like the following:\n\nERROR 1168 (HY000): Unable to open underlying table which is differently\ndefined \n or of non-MyISAM type or doesn\'t exist\n\nA CHECK TABLE will show more information about the problem.\n\nThe error is also produced if the table is properly define, but an underlying\ntable\'s definition changes at some point in time.\n\nIf you try to insert a new row into a MERGE table with INSERT_METHOD=NO, you\nwill get an error like the following:\n\nERROR 1036 (HY000): Table \'tbl_name\' is read only\n\nIt is possible to build a MERGE table on MyISAM tables which have one or more\nvirtual columns. MERGE itself does not support virtual columns, thus such\ncolumns will be seen as regular columns. The data types and sizes will still\nneed to be identical, and they cannot be NOT NULL.\n\nExamples\n--------\n\nCREATE TABLE t1 (\n a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,\n message CHAR(20)) ENGINE=MyISAM;\n\nCREATE TABLE t2 (\n a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,\n message CHAR(20)) ENGINE=MyISAM;\n\nINSERT INTO t1 (message) VALUES (\'Testing\'),(\'table\'),(\'t1\');\n\nINSERT INTO t2 (message) VALUES (\'Testing\'),(\'table\'),(\'t2\');\n\nCREATE TABLE total (\n a INT NOT NULL AUTO_INCREMENT,\n message CHAR(20), INDEX(a))\n ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;\n\nSELECT * FROM total;\n+---+---------+\n| a | message |\n+---+---------+\n| 1 | Testing |\n| 2 | table |\n| 3 | t1 |\n| 1 | Testing |\n| 2 | table |\n| 3 | t2 |\n+---+---------+\n\nIn the following example, we\'ll create three MyISAM tables, and then a MERGE\ntable on them. However, one of them uses a different data type for the column\nb, so a SELECT will produce an error:\n\nCREATE TABLE t1 (\n a INT,\n b INT\n) ENGINE = MyISAM;\n\nCREATE TABLE t2 (\n a INT,\n b INT\n) ENGINE = MyISAM;\n\nCREATE TABLE t3 (\n a INT,\n b TINYINT\n) ENGINE = MyISAM;\n\nCREATE TABLE t_mrg (\n a INT,\n b INT\n) ENGINE = MERGE,UNION=(t1,t2,t3);\n\nSELECT * FROM t_mrg;\nERROR 1168 (HY000): Unable to open underlying table which is differently\ndefined\n or of non-MyISAM type or doesn\'t exist\n\nTo find out what\'s wrong, we\'ll use a CHECK TABLE:\n\nCHECK TABLE t_mrg\\G\n*************************** 1. row ***************************\n Table: test.t_mrg\n Op: check\nMsg_type: Error\nMsg_text: Table \'test.t3\' is differently defined or of non-MyISAM type or\ndoesn\'t exist\n*************************** 2. row ***************************\n Table: test.t_mrg\n Op: check\nMsg_type: Error\nMsg_text: Unable to open underlying table which is differently defined or of\nnon-MyISAM type or doesn\'t exist\n*************************** 3. row ***************************\n Table: test.t_mrg\n Op: check\nMsg_type: error\nMsg_text: Corrupt\n\nNow, we know that the problem is in t3\'s definition.\n\nURL: https://mariadb.com/kb/en/merge/','','https://mariadb.com/kb/en/merge/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (736,39,'Sequence Overview','MariaDB starting with 10.3\n--------------------------\nSequences were introduced in MariaDB 10.3.\n\nIntroduction\n------------\n\nA sequence is an object that generates a sequence of numeric values, as\nspecified by the CREATE SEQUENCE statement.\n\nCREATE SEQUENCE will create a sequence that generates new values when called\nwith NEXT VALUE FOR sequence_name. It\'s an alternative to AUTO INCREMENT when\none wants to have more control of how the numbers are generated. As the\nSEQUENCE caches values (up to the CACHE value in the CREATE SEQUENCE\nstatement, by default 1000) it can in some cases be much faster than AUTO\nINCREMENT. Another benefit is that one can access the last value generated by\nall used sequences, which solves one of the limitations with LAST_INSERT_ID().\n\nCreating a Sequence\n-------------------\n\nThe CREATE SEQUENCE statement is used to create a sequence. Here is an example\nof a sequence starting at 100, incrementing by 10 each time:\n\nCREATE SEQUENCE s START WITH 100 INCREMENT BY 10;\n\nThe CREATE SEQUENCE statement, along with defaults, can be viewd with the SHOW\nCREATE SEQUENCE STATEMENT, for example:\n\nSHOW CREATE SEQUENCE s\\G\n*************************** 1. row ***************************\n Table: s\nCreate Table: CREATE SEQUENCE `s` start with 100 minvalue 1 maxvalue\n9223372036854775806 \n increment by 10 cache 1000 nocycle ENGINE=InnoDB\n\nUsing Sequence Objects\n----------------------\n\nTo get the next value from a sequence, use\n\nNEXT VALUE FOR sequence_name\n\nor\n\nNEXTVAL(sequence_name)\n\nor in Oracle mode (SQL_MODE=ORACLE)\n\nsequence_name.nextval\n\nFor retrieving the last value used by the current connection from a sequence\nuse:\n\nPREVIOUS VALUE FOR sequence_name\n\nor\n\nLASTVAL(sequence_name)\n\nor in Oracle mode (SQL_MODE=ORACLE)\n\nsequence_name.currval\n\nFor example:\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 100 |\n+------------+\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 110 |\n+------------+\n\nSELECT LASTVAL(s);\n+------------+\n| LASTVAL(s) |\n+------------+\n| 110 |\n+------------+\n\nUsing Sequences in DEFAULT\n--------------------------\n\nMariaDB starting with 10.3.3\n----------------------------\nStarting from 10.3.3 you can use Sequences in DEFAULT:\n\ncreate sequence s1;\ncreate table t1 (a int primary key default (next value for s1), b int);\ninsert into t1 (b) values (1),(2);\nselect * from t1;\n+---+------+\n| a | b |\n+---+------+\n| 1 | 1 |\n| 2 | 2 |\n+---+------+\n\nChanging a Sequence\n-------------------\n\nThe ALTER SEQUENCE statement is used for changing sequences. For example, to\nrestart the sequence at another value:\n\nALTER SEQUENCE s RESTART 50;\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 50 |\n+------------+\n\nThe SETVAL function can also be used to set the next value to be returned for\na SEQUENCE, for example:\n\nSELECT SETVAL(s, 100);\n+----------------+\n| SETVAL(s, 100) |\n+----------------+\n| 100 |\n+----------------+\n\nSETVAL can only be used to increase the sequence value. Attempting to set a\nlower value will fail, returning NULL:\n\nSELECT SETVAL(s, 50);\n+---------------+\n| SETVAL(s, 50) |\n+---------------+\n| NULL |\n+---------------+\n\nDropping a Sequence\n-------------------\n\nThe DROP SEQUENCE statement is used to drop a sequence, for example:\n\nDROP SEQUENCE s;\n\nReplication\n-----------\n\nIf one wants to use Sequences in a master-master setup or with Galera one\nshould use INCREMENT=0. This will tell the Sequence to use\nauto_increment_increment and auto_increment_offset to generate unique values\nfor each server.\n\nStandards Compliance\n--------------------\n\nMariaDB 10.3 supports both ANSI SQL and Oracle syntax for sequences.\n\nHowever as SEQUENCE is implemented as a special kind of table, it uses the\nsame namespace as tables. The benefits are that sequences show up in SHOW\nTABLES, and one can also create a sequence with CREATE TABLE and drop it with\nDROP TABLE. One can SELECT from it as from any other table. This ensures that\nall old tools that work with tables should work with sequences.\n\nSince sequence objects act as regular tables in many contexts, they will be\naffected by LOCK TABLES. This is not the case in other DBMS, such as Oracle,\nwhere LOCK TABLE does not affect sequences.\n\nNotes\n-----\n\nOne of the goals with the Sequence implementation is that all old tools, such\nas mysqldump, should work unchanged, while still keeping the normal usage of\nsequence standard compatibly.\n\nTo make this possible, sequence is currently implemented as a table with a few\nexclusive properties.\n\nThe special properties for sequence tables are:\n\n* A sequence table has always one row.\n* When one creates a sequence, either with CREATE TABLE or CREATE SEQUENCE,\none row will be inserted.\n* If one tries to insert into a sequence table, the single row will be\nupdated. This allows mysqldump to work but also gives the additional benefit\nthat one can change all properties of a sequence with a single insert. New\napplications should of course also use ALTER SEQUENCE.\n* UPDATE or DELETE can\'t be performed on Sequence objects.\n* Doing a select on the sequence shows the current state of the sequence,\nexcept the values that are reserved in the cache. The next_value column shows\nthe next value not reserved by the cache.\n* FLUSH TABLES will close the sequence and the next sequence number generated\nwill be according to what\'s stored in the Sequence object. In effect, this\nwill discard the cached values.\n* A number of normal table operations work on Sequence tables. See next\nsection.\n\nTable Operations that Work with Sequences\n-----------------------------------------\n\n* SHOW CREATE TABLE sequence_name. This shows the table structure that is\nbehind the SEQUENCE including the field names that can be used with SELECT or\neven CREATE TABLE.\n* CREATE TABLE sequence-structure ... SEQUENCE=1\n* ALTER TABLE sequence RENAME TO sequence2\n* RENAME TABLE sequence_name TO new_sequence_name\n* DROP TABLE sequence_name. This is allowed mainly to get old tools like\nmysqldump to work with sequence tables.\n* SHOW TABLES\n\nImplementation\n--------------\n\nInternally, sequence tables are created as a normal table without rollback\n(the InnoDB, Aria and MySAM engines support this), wrapped by a sequence\nengine object. This allowed us to create sequences with almost no performance\nimpact for normal tables. (The cost is one \'if\' per insert if the binary log\nis enabled).\n\nUnderlying Table Structure\n--------------------------\n\nThe following example shows the table structure of sequences and how it can be\nused as a table. (Output of results are slightly edited to make them easier to\nread)\n\ncreate sequence t1;\nshow create sequence t1\\G\n*************************** 1. row ***************************\n CREATE SEQUENCE `t1` start with 1 minvalue 1 maxvalue 9223372036854775806\n increment by 1 cache 1000 nocycle ENGINE=InnoDB\n\nshow create table t1\\G\n*************************** 1. row ***************************\nCreate Table: CREATE TABLE `t1` (\n `next_not_cached_value` bigint(21) NOT NULL,\n `minimum_value` bigint(21) NOT NULL,\n `maximum_value` bigint(21) NOT NULL,\n `start_value` bigint(21) NOT NULL COMMENT \'start value when sequences is\ncreated or value if RESTART is used\',\n `increment` bigint(21) NOT NULL COMMENT \'increment value\',\n `cache_size` bigint(21) unsigned NOT NULL,\n `cycle_option` tinyint(1) unsigned NOT NULL COMMENT \'0 if no cycles are\nallowed, 1 if the sequence should begin a new cycle when maximum_value is\npassed\',\n `cycle_count` bigint(21) NOT NULL COMMENT \'How many cycles have been done\'\n) ENGINE=InnoDB SEQUENCE=1\n\nselect * from t1\\G\nnext_not_cached_value: 1\n minimum_value: 1\n maximum_value: 9223372036854775806\n start_value: 1\n increment: 1\n cache_size: 1000\n cycle_option: 0\n cycle_count: 0\n\nThe cycle_count column is incremented every time the sequence wraps around.\n\nCredits\n-------\n\n* Thanks to Jianwe Zhao from Aliyun for his work on SEQUENCE in AliSQL, which\ngave ideas and inspiration for this work.\n* Thanks to Peter Gulutzan,who helped test and gave useful comments about the\nimplementation.\n\nURL: https://mariadb.com/kb/en/sequence-overview/','','https://mariadb.com/kb/en/sequence-overview/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (737,39,'CREATE SEQUENCE','MariaDB starting with 10.3\n--------------------------\nCREATE SEQUENCE was introduced in MariaDB 10.3.\n\nSyntax\n------\n\nCREATE [OR REPLACE] [TEMPORARY] SEQUENCE [IF NOT EXISTS] sequence_name\n[ INCREMENT [ BY | = ] increment ]\n[ MINVALUE [=] minvalue | NO MINVALUE | NOMINVALUE ]\n[ MAXVALUE [=] maxvalue | NO MAXVALUE | NOMAXVALUE ]\n[ START [ WITH | = ] start ] \n[ CACHE [=] cache | NOCACHE ] [ CYCLE | NOCYCLE] \n[table_options]\nThe options for CREATE SEQUENCE can be given in any order, optionally followed\nby table_options.\n\ntable_options can be any of the normal table options in CREATE TABLE but the\nmost usable ones are ENGINE=... and COMMENT=.\n\nNOMAXVALUE and NOMINVALUE are there to allow one to create SEQUENCEs using the\nOracle syntax.\n\nDescription\n-----------\n\nCREATE SEQUENCE will create a sequence that generates new values when called\nwith NEXT VALUE FOR sequence_name. It\'s an alternative to AUTO INCREMENT when\none wants to have more control of how the numbers are generated. As the\nSEQUENCE caches values (up to CACHE) it can in some cases be much faster than\nAUTO INCREMENT. Another benefit is that one can access the last value\ngenerated by all used sequences, which solves one of the limitations with\nLAST_INSERT_ID().\n\nCREATE SEQUENCE requires the CREATE privilege.\n\nDROP SEQUENCE can be used to drop a sequence, and ALTER SEQUENCE to change it.\n\nArguments to Create\n-------------------\n\nThe following options may be used:\n\n+---------------+------------------------------+----------------------------+\n| Option | Default value | Description |\n+---------------+------------------------------+----------------------------+\n| INCREMENT | 1 | Increment to use for |\n| | | values. May be negative. |\n| | | Setting an increment of 0 |\n| | | causes the sequence to |\n| | | use the value of the |\n| | | auto_increment_increment |\n| | | system variable at the |\n| | | time of creation, which |\n| | | is always a positive |\n| | | number. (see MDEV-16035). |\n+---------------+------------------------------+----------------------------+\n| MINVALUE | 1 if INCREMENT > 0 and | Minimum value for the |\n| | -9223372036854775807 if | sequence |\n| | INCREMENT < 0 | |\n+---------------+------------------------------+----------------------------+\n| MAXVALUE | 9223372036854775806 if | Max value for sequence |\n| | INCREMENT > 0 and -1 if | |\n| | INCREMENT < 0 | |\n+---------------+------------------------------+----------------------------+\n| START | MINVALUE if INCREMENT > 0 | First value that the |\n| | and MAX_VALUE if INCREMENT< | sequence will generate |\n| | 0 | |\n+---------------+------------------------------+----------------------------+\n| CACHE | 1000 | Number of values that |\n| | | should be cached. 0 if no |\n| | | CACHE. The underlying |\n| | | table will be updated |\n| | | first time a new sequence |\n| | | number is generated and |\n| | | each time the cache runs |\n| | | out. |\n+---------------+------------------------------+----------------------------+\n\nIf CYCLE is used then the sequence should start again from MINVALUE after it\nhas run out of values. Default value is NOCYCLE.\n\nConstraints on Create Arguments\n-------------------------------\n\nTo be able to create a legal sequence, the following must hold:\n\n* MAXVALUE >= start\n* MAXVALUE > MINVALUE\n* START >= MINVALUE\n* MAXVALUE <= 9223372036854775806 (LONGLONG_MAX-1)\n* MINVALUE >= -9223372036854775807 (LONGLONG_MIN+1)\n\nNote that sequences can\'t generate the maximum/minimum 64 bit number because\nof the constraint of MINVALUE and MAXVALUE.\n\nAtomic DDL\n----------\n\nMariaDB starting with 10.6.1\n----------------------------\nMariaDB 10.6.1 supports Atomic DDL and CREATE SEQUENCE is atomic.\n\nExamples\n--------\n\nCREATE SEQUENCE s START WITH 100 INCREMENT BY 10;\n\nCREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;\n\nThe following statement fails, as the increment conflicts with the defaults\n\nCREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10;\nERROR 4082 (HY000): Sequence \'test.s3\' values are conflicting\n\nThe sequence can be created by specifying workable minimum and maximum values:\n\nCREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10 MINVALUE=-100 MAXVALUE=1000;\n\nURL: https://mariadb.com/kb/en/create-sequence/','','https://mariadb.com/kb/en/create-sequence/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (738,39,'ALTER SEQUENCE','MariaDB starting with 10.3.1\n----------------------------\nALTER SEQUENCE was introduced in MariaDB 10.3.\n\nSyntax\n------\n\nALTER SEQUENCE [IF EXISTS] sequence_name\n[ INCREMENT [ BY | = ] increment ]\n[ MINVALUE [=] minvalue | NO MINVALUE | NOMINVALUE ]\n[ MAXVALUE [=] maxvalue | NO MAXVALUE | NOMAXVALUE ]\n[ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ]\n[ RESTART [[WITH | =] restart]\n\nALTER SEQUENCE allows one to change any values for a SEQUENCE created with\nCREATE SEQUENCE.\n\nThe options for ALTER SEQUENCE can be given in any order.\n\nDescription\n-----------\n\nALTER SEQUENCE changes the parameters of an existing sequence generator. Any\nparameters not specifically set in the ALTER SEQUENCE command retain their\nprior settings.\n\nALTER SEQUENCE requires the ALTER privilege.\n\nArguments to ALTER SEQUENCE\n---------------------------\n\nThe following options may be used:\n\n+---------------+-------------------------------+---------------------------+\n| Option | Default value | Description |\n+---------------+-------------------------------+---------------------------+\n| INCREMENT | 1 | Increment to use for |\n| | | values. May be negative. |\n+---------------+-------------------------------+---------------------------+\n| MINVALUE | 1 if INCREMENT > 0 and | Minimum value for the |\n| | -9223372036854775807 if | sequence. |\n| | INCREMENT < 0 | |\n+---------------+-------------------------------+---------------------------+\n| MAXVALUE | 9223372036854775806 if | Max value for sequence. |\n| | INCREMENT > 0 and -1 if | |\n| | INCREMENT < 0 | |\n+---------------+-------------------------------+---------------------------+\n| START | MINVALUE if INCREMENT > 0 | First value that the |\n| | and MAX_VALUE if INCREMENT< 0 | sequence will generate. |\n+---------------+-------------------------------+---------------------------+\n| CACHE | 1000 | Number of values that |\n| | | should be cached. 0 if |\n| | | no CACHE. The |\n| | | underlying table will be |\n| | | updated first time a new |\n| | | sequence number is |\n| | | generated and each time |\n| | | the cache runs out. |\n+---------------+-------------------------------+---------------------------+\n| CYCLE | 0 (= NO CYCLE) | 1 if the sequence should |\n| | | start again from |\n| | | MINVALUE# after it has |\n| | | run out of values. |\n+---------------+-------------------------------+---------------------------+\n| RESTART | START if restart value not | If RESTART option is |\n| | is given | used, NEXT VALUE will |\n| | | return the restart value. |\n+---------------+-------------------------------+---------------------------+\n\nThe optional clause RESTART [ WITH restart ] sets the next value for the\nsequence. This is equivalent to calling the SETVAL() function with the is_used\nargument as 0. The specified value will be returned by the next call of\nnextval. Using RESTART with no restart value is equivalent to supplying the\nstart value that was recorded by CREATE SEQUENCE or last set by ALTER SEQUENCE\nSTART WITH.\n\nALTER SEQUENCE will not allow you to change the sequence so that it\'s\ninconsistent. For example:\n\nCREATE SEQUENCE s1;\nALTER SEQUENCE s1 MINVALUE 10;\nERROR 4061 (HY000): Sequence \'test.t1\' values are conflicting\n\nALTER SEQUENCE s1 MINVALUE 10 RESTART 10;\nERROR 4061 (HY000): Sequence \'test.t1\' values are conflicting\n\nALTER SEQUENCE s1 MINVALUE 10 START 10 RESTART 10;\n\nINSERT\n------\n\nTo allow SEQUENCE objects to be backed up by old tools, like mysqldump, one\ncan use SELECT to read the current state of a SEQUENCE object and use an\nINSERT to update the SEQUENCE object. INSERT is only allowed if all fields are\nspecified:\n\nCREATE SEQUENCE s1;\nINSERT INTO s1 VALUES(1000,10,2000,1005,1,1000,0,0);\nSELECT * FROM s1;\n\n+------------+-----------+-----------+-------+-----------+-------+-------+-----\n-+\n| next_value | min_value | max_value | start | increment | cache | cycle |\nround |\n+------------+-----------+-----------+-------+-----------+-------+-------+-----\n-+\n| 1000 | 10 | 2000 | 1005 | 1 | 1000 | 0 | \n0 |\n+------------+-----------+-----------+-------+-----------+-------+-------+-----\n-+\n\nSHOW CREATE SEQUENCE s1;\n+-------+----------------------------------------------------------------------\n---------------------------------------+\n| Table | Create Table \n |\n+-------+----------------------------------------------------------------------\n---------------------------------------+\n| s1 | CREATE SEQUENCE `s1` start with 1005 minvalue 10 maxvalue 2000\nincrement by 1 cache 1000 nocycle ENGINE=Aria |\n+-------+----------------------------------------------------------------------\n---------------------------------------+\n\nNotes\n-----\n\nALTER SEQUENCE will instantly affect all future SEQUENCE operations. This is\nin contrast to some other databases where the changes requested by ALTER\nSEQUENCE will not be seen until the sequence cache has run out.\n\nALTER SEQUENCE will take a full table lock of the sequence object during its\n(brief) operation. This ensures that ALTER SEQUENCE is replicated correctly.\nIf you only want to set the next sequence value to a higher value than\ncurrent, then you should use SETVAL() instead, as this is not blocking.\n\nIf you want to change storage engine, sequence comment or rename the sequence,\nyou can use ALTER TABLE for this.\n\nURL: https://mariadb.com/kb/en/alter-sequence/','','https://mariadb.com/kb/en/alter-sequence/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (739,39,'DROP SEQUENCE','MariaDB starting with 10.3\n--------------------------\nDROP SEQUENCE was introduced in MariaDB 10.3.\n\nSyntax\n------\n\nDROP [TEMPORARY] SEQUENCE [IF EXISTS] [/*COMMENT TO SAVE*/]\n sequence_name [, sequence_name] ...\n\nDescription\n-----------\n\nDROP SEQUENCE removes one or more sequences created with CREATE SEQUENCE. You\nmust have the DROP privilege for each sequence. MariaDB returns an error\nindicating by name which non-existing tables it was unable to drop, but it\nalso drops all of the tables in the list that do exist.\n\nImportant: When a table is dropped, user privileges on the table are not\nautomatically dropped. See GRANT.\n\nIf another connection is using the sequence, a metadata lock is active, and\nthis statement will wait until the lock is released. This is also true for\nnon-transactional tables.\n\nFor each referenced sequence, DROP SEQUENCE drops a temporary sequence with\nthat name, if it exists. If it does not exist, and the TEMPORARY keyword is\nnot used, it drops a non-temporary sequence with the same name, if it exists.\nThe TEMPORARY keyword ensures that a non-temporary sequence will not\naccidentally be dropped.\n\nUse IF EXISTS to prevent an error from occurring for sequences that do not\nexist. A NOTE is generated for each non-existent sequence when using IF\nEXISTS. See SHOW WARNINGS.\n\nDROP SEQUENCE requires the DROP privilege.\n\nNotes\n-----\n\nDROP SEQUENCE only removes sequences, not tables. However, DROP TABLE can\nremove both sequences and tables.\n\nURL: https://mariadb.com/kb/en/drop-sequence/','','https://mariadb.com/kb/en/drop-sequence/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (740,39,'NEXT VALUE for sequence_name','MariaDB starting with 10.3\n--------------------------\nSEQUENCEs were introduced in MariaDB 10.3\n\nSyntax\n------\n\nNEXT VALUE FOR sequence\n\nor\n\nNEXTVAL(sequence_name)\n\nor in Oracle mode (SQL_MODE=ORACLE)\n\nsequence_name.nextval\n\nNEXT VALUE FOR is ANSI SQL syntax while NEXTVAL() is PostgreSQL syntax.\n\nDescription\n-----------\n\nGenerate next value for a SEQUENCE.\n\n* You can greatly speed up NEXT VALUE by creating the sequence with the CACHE\noption. If not, every NEXT VALUE usage will cause changes in the stored\nSEQUENCE table.\n* When using NEXT VALUE the value will be reserved at once and will not be\nreused, except if the SEQUENCE was created with CYCLE. This means that when\nyou are using SEQUENCEs you have to expect gaps in the generated sequence\nnumbers.\n* If one updates the SEQUENCE with SETVAL() or ALTER SEQUENCE ... RESTART,\nNEXT VALUE FOR will notice this and start from the next requested value.\n* FLUSH TABLES will close the sequence and the next sequence number generated\nwill be according to what\'s stored in the SEQUENCE object. In effect, this\nwill discard the cached values.\n* A server restart (or closing the current connection) also causes a drop of\nall cached values. The cached sequence numbers are reserved only for the\ncurrent connection.\n* NEXT VALUE requires the INSERT privilege.\n\nMariaDB starting with 10.3.3\n----------------------------\n* You can also use NEXT VALUE FOR sequence for column DEFAULT.\n\nURL: https://mariadb.com/kb/en/next-value-for-sequence_name/','','https://mariadb.com/kb/en/next-value-for-sequence_name/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (741,39,'PREVIOUS VALUE FOR sequence_name','MariaDB starting with 10.3\n--------------------------\nSEQUENCEs were introduced in MariaDB 10.3.\n\nSyntax\n------\n\nPREVIOUS VALUE FOR sequence_name\n\nor\n\nLASTVAL(sequence_name)\n\nor in Oracle mode (SQL_MODE=ORACLE)\n\nsequence_name.currval\n\nPREVIOUS VALUE FOR is IBM DB2 syntax while LASTVAL() is PostgreSQL syntax.\n\nDescription\n-----------\n\nGet last value in the current connection generated from a sequence.\n\n* If the sequence has not yet been used by the connection, PREVIOUS VALUE FOR\nreturns NULL (the same thing applies with a new connection which doesn\'t see a\nlast value for an existing sequence).\n* If a SEQUENCE has been dropped and re-created then it\'s treated as a new\nSEQUENCE and PREVIOUS VALUE FOR will return NULL.\n* FLUSH TABLES has no effect on PREVIOUS VALUE FOR.\n* Previous values for all used sequences are stored per connection until\nconnection ends.\n* PREVIOUS VALUE FOR requires the SELECT privilege.\n\nExample\n-------\n\nCREATE SEQUENCE s START WITH 100 INCREMENT BY 10;\n\nSELECT PREVIOUS VALUE FOR s;\n+----------------------+\n| PREVIOUS VALUE FOR s |\n+----------------------+\n| NULL |\n+----------------------+\n\n# The function works for sequences only, if the table is used an error is\ngenerated\nSELECT PREVIOUS VALUE FOR t;\nERROR 4089 (42S02): \'test.t\' is not a SEQUENCE\n\n# Call the NEXT VALUE FOR s:\nSELECT NEXT VALUE FOR s;\n+------------------+\n| NEXT VALUE FOR s |\n+------------------+\n| 100 |\n+------------------+\n\nSELECT PREVIOUS VALUE FOR s;\n+----------------------+\n| PREVIOUS VALUE FOR s |\n+----------------------+\n| 100 |\n+----------------------+\n\nNow try to start the new connection and check that the last value is still\nNULL, before updating the value in the new connection after the output of the\nnew connection gets current value (110 in the example below). Note that first\nconnection cannot see this change and the result of last value still remains\nthe same (100 in the example above).\n\n$ .mysql -uroot test -e\"SELECT PREVIOUS VALUE FOR s; SELECT NEXT VALUE FOR s;\nSELECT PREVIOUS VALUE FOR s;\"\n+----------------------+\n| PREVIOUS VALUE FOR s |\n+----------------------+\n| NULL |\n+----------------------+\n+------------------+\n| NEXT VALUE FOR s |\n+------------------+\n| 110 |\n+------------------+\n+----------------------+\n| PREVIOUS VALUE FOR s |\n+----------------------+\n| 110 |\n+----------------------+\n\nURL: https://mariadb.com/kb/en/previous-value-for-sequence_name/','','https://mariadb.com/kb/en/previous-value-for-sequence_name/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (742,39,'SETVAL','MariaDB starting with 10.3.1\n----------------------------\nSEQUENCEs were introduced in MariaDB 10.3.\n\nSyntax\n------\n\nSETVAL(sequence_name, next_value, [is_used, [round]])\n\nDescription\n-----------\n\nSet the next value to be returned for a SEQUENCE.\n\nThis function is compatible with PostgreSQL syntax, extended with the round\nargument.\n\nIf the is_used argument is not given or is 1 or true, then the next used value\nwill one after the given value. If is_used is 0 or false then the next\ngenerated value will be the given value.\n\nIf round is used then it will set the round value (or the internal cycle\ncount, starting at zero) for the sequence. If round is not used, it\'s assumed\nto be 0.\n\nnext_value must be an integer literal.\n\nFor SEQUENCE tables defined with CYCLE (see CREATE SEQUENCE) one should use\nboth next_value and round to define the next value. In this case the current\nsequence value is defined to be round, next_value.\n\nThe result returned by SETVAL() is next_value or NULL if the given next_value\nand round is smaller than the current value.\n\nSETVAL() will not set the SEQUENCE value to a something that is less than its\ncurrent value. This is needed to ensure that SETVAL() is replication safe. If\nyou want to set the SEQUENCE to a smaller number use ALTER SEQUENCE.\n\nIf CYCLE is used, first round and then next_value are compared to see if the\nvalue is bigger than the current value.\n\nInternally, in the MariaDB server, SETVAL() is used to inform slaves that a\nSEQUENCE has changed value. The slave may get SETVAL() statements out of\norder, but this is ok as only the biggest one will have an effect.\n\nSETVAL requires the INSERT privilege.\n\nExamples\n--------\n\nSELECT setval(foo, 42); -- Next nextval will return 43\nSELECT setval(foo, 42, true); -- Same as above\nSELECT setval(foo, 42, false); -- Next nextval will return 42\n\nSETVAL setting higher and lower values on a sequence with an increment of 10:\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 50 |\n+------------+\n\nSELECT SETVAL(s, 100);\n+----------------+\n| SETVAL(s, 100) |\n+----------------+\n| 100 |\n+----------------+\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 110 |\n+------------+\n\nSELECT SETVAL(s, 50);\n+---------------+\n| SETVAL(s, 50) |\n+---------------+\n| NULL |\n+---------------+\n\nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 120 |\n+------------+\n\nExample demonstrating round:\n\nCREATE OR REPLACE SEQUENCE s1\n START WITH 1\n MINVALUE 1\n MAXVALUE 99\n INCREMENT BY 1\n CACHE 20\n CYCLE;\n\nSELECT SETVAL(s1, 99, 1, 0);\n+----------------------+\n| SETVAL(s1, 99, 1, 0) |\n+----------------------+\n| 99 |\n+----------------------+\n\nSELECT NEXTVAL(s1);\n+-------------+\n| NEXTVAL(s1) |\n+-------------+\n| 1 |\n+-------------+\n\nThe following statement returns NULL, as the given next_value and round is\nsmaller than the current value.\n\nSELECT SETVAL(s1, 99, 1, 0);\n+----------------------+\n| SETVAL(s1, 99, 1, 0) |\n+----------------------+\n| NULL |\n+----------------------+\n\nSELECT NEXTVAL(s1);\n+-------------+\n| NEXTVAL(s1) |\n+-------------+\n| 2 |\n+-------------+\n\nIncreasing the round from zero to 1 will allow next_value to be returned.\n\nSELECT SETVAL(s1, 99, 1, 1);\n+----------------------+\n| SETVAL(s1, 99, 1, 1) |\n+----------------------+\n| 99 |\n+----------------------+\n\nSELECT NEXTVAL(s1);\n+-------------+\n| NEXTVAL(s1) |\n+-------------+\n| 1 |\n+-------------+\n\nURL: https://mariadb.com/kb/en/setval/','','https://mariadb.com/kb/en/setval/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (743,40,'JSON_ARRAYAGG','MariaDB starting with 10.5.0\n----------------------------\nJSON_ARRAYAGG was added in MariaDB 10.5.0.\n\nSyntax\n------\n\nJSON_ARRAYAGG(column_or_expression)\n\nDescription\n-----------\n\nJSON_ARRAYAGG returns a JSON array containing an element for each value in a\ngiven set of JSON or SQL values. It acts on a column or an expression that\nevaluates to a single value.\n\nReturns NULL in the case of an error, or if the result contains no rows.\n\nJSON_ARRAYAGG cannot currently be used as a window function.\n\nThe full syntax is as follows:\n\nJSON_ARRAYAGG([DISTINCT] expr [,expr ...]\n [ORDER BY {unsigned_integer | col_name | expr}\n [ASC | DESC] [,col_name ...]]\n [LIMIT {[offset,] row_count | row_count OFFSET offset}])\n\nExamples\n--------\n\nCREATE TABLE t1 (a INT, b INT);\n\nINSERT INTO t1 VALUES (1, 1),(2, 1), (1, 1),(2, 1), (3, 2),(2, 2),(2, 2),(2,\n2);\n\nSELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1;\n+-------------------+-------------------+\n| JSON_ARRAYAGG(a) | JSON_ARRAYAGG(b) |\n+-------------------+-------------------+\n| [1,2,1,2,3,2,2,2] | [1,1,1,1,2,2,2,2] |\n+-------------------+-------------------+\n\nSELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1 GROUP BY b;\n+------------------+------------------+\n| JSON_ARRAYAGG(a) | JSON_ARRAYAGG(b) |\n+------------------+------------------+\n| [1,2,1,2] | [1,1,1,1] |\n| [3,2,2,2] | [2,2,2,2] |\n+------------------+------------------+\n\nURL: https://mariadb.com/kb/en/json_arrayagg/','','https://mariadb.com/kb/en/json_arrayagg/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (744,40,'JSON_OBJECTAGG','MariaDB starting with 10.5.0\n----------------------------\nJSON_OBJECTAGG was added in MariaDB 10.5.0.\n\nSyntax\n------\n\nJSON_OBJECTAGG(key, value)\n\nDescription\n-----------\n\nJSON_OBJECTAGG returns a JSON object containing key-value pairs. It takes two\nexpressions that evaluate to a single value, or two column names, as\narguments, the first used as a key, and the second as a value.\n\nReturns NULL in the case of an error, or if the result contains no rows.\n\nJSON_OBJECTAGG cannot currently be used as a window function.\n\nExamples\n--------\n\nselect * from t1;\n+------+-------+\n| a | b |\n+------+-------+\n| 1 | Hello |\n| 1 | World |\n| 2 | This |\n+------+-------+\n\nSELECT JSON_OBJECTAGG(a, b) FROM t1;\n+----------------------------------------+\n| JSON_OBJECTAGG(a, b) |\n+----------------------------------------+\n| {\"1\":\"Hello\", \"1\":\"World\", \"2\":\"This\"} |\n+----------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_objectagg/','','https://mariadb.com/kb/en/json_objectagg/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (745,40,'JSONPath Expressions','A number of JSON functions accept JSON Path expressions. MariaDB defines this\npath as follows:\n\nJSON Path Syntax\n----------------\n\npath : [\'lax\'] \'$\' [step]*\n\nThe path starts with an optional path mode. At the moment, MariaDB supports\nonly the \"lax\" mode, which is also the mode that is used when it is not\nexplicitly specified.\n\nThe $ symbol represents the context item. The search always starts from the\ncontext item; because of that, the path always starts with $.\n\nThen, it is followed by zero or more steps, which select element(s) in the\nJSON document. A step may be one of the following:\n\n* Object member selector\n* Array element selector\n* Wildcard selector\n\nObject Member Selector\n----------------------\n\nTo select member(s) in a JSON object, one can use one of the following:\n\n* .memberName selects the value of the member with name memberName.\n* .\"memberName\" - the same as above but allows one to select a member with a\nname that\'s not a valid identifier (that is, has space, dot, and/or other\ncharacters)\n* .* - selects the values of all members of the object.\n\nIf the current item is an array (instead of an object), nothing will be\nselected.\n\nArray Element Selector\n----------------------\n\nTo select elements of an array, one can use one of the following:\n\n* [N] selects element number N in the array. The elements are counted from\nzero.\n* [*] selects all elements in the array.\n\nIf the current item is an object (instead of an array), nothing will be\nselected.\n\nStarting from MariaDB server 10.9, JSON path also supports negative index in\narray, \'last\' keyword and range notation (\'to\' keyword) for accessing array\nelements. Negative index starts from -1.\n\n* [-N] selects n th element from end.\n* [last-N] selects n th element from the last element.\n* [M to N] selects range of elements starting from index M to N.\n\nExample:\n\nSET @json=\'{\n \"A\": [0,\n [1, 2, 3],\n [4, 5, 6],\n \"seven\",\n 0.8,\n true,\n false,\n \"eleven\",\n [12, [13, 14], {\"key1\":\"value1\"},[15]],\n true],\n \"B\": {\"C\": 1},\n \"D\": 2\n }\';\nSELECT JSON_EXTRACT(@json, \'$.A[-8][1]\');\n+--------------------------------------------------+\n| JSON_EXTRACT(@json, \'$.A[-8][1]\') |\n+--------------------------------------------------+\n| 5 |\n+--------------------------------------------------+\n\nSELECT JSON_EXTRACT(@json, \'$.A[last-7][1]\');\n+-----------------------------------------------+\n| SELECT JSON_EXTRACT(@json, \'$.A[last-7][1]\'); |\n+-----------------------------------------------+\n| 5 |\n+-----------------------------------------------+\n\nSET @json= \'[\n [1, {\"key1\": \"value1\"}, 3],\n [false, 5, 6],\n [7, 8, [9, {\"key2\": 2}, 11]],\n [15, 1.34, [14], [\"string1\", [16, {\"key1\":[1,2,3,[4,5,6]]}, 18]]],\n [19, 20],\n 21, 22\n ]\';\n\nSELECT JSON_EXTRACT(@json, \'$[0 to 3][2]\');\n+-----------------------------------------------+\n| JSON_EXTRACT(@json, \'$[0 to 3][2]\') |\n+-----------------------------------------------+\n| [3, 6, [9, {\"key2\": 2}, 11], [14]] |\n+-----------------------------------------------+\n\nThis will produce output for first index of eighth from last element of a two\ndimensional array.\n\nNote: In range notation, when M > N ( when M,N are greater than or equal to 0)\nor (size of array - M or size of array - N when M, N are less than 0), then it\nis treated as an impossible range and NULL is returned.\n\nSET @json= \'[1, 2, 3, 4, 5]\';\nSELECT JSON_EXTRACT(@json, \'$[4 to 2]\');\n+-----------------------------------+\n| JSON_EXTRACT(@json, \'$[4 to 2]\') |\n+-----------------------------------+\n| NULL |\n+-----------------------------------+\n\nWildcard\n--------\n\nThe wildcard step, **, recursively selects all child elements of the current\nelement. Both array elements and object members are selected.\n\nThe wildcard step must not be the last step in the JSONPath expression. It\nmust be followed by an array or object member selector step.\n\nFor example:\n\nselect json_extract(@json_doc, \'$**.price\');\n\nwill select all object members in the document that are named price, while\n\nselect json_extract(@json_doc, \'$**[2]\');\n\nwill select the second element in each of the arrays present in the document.\n\nCompatibility\n-------------\n\nMariaDB\'s JSONPath syntax supports a subset of JSON Path\'s definition in the\nSQL Standard. The most notable things not supported are the strict mode and\nfilters.\n\nMariaDB\'s JSONPath is close to MySQL\'s JSONPath. The wildcard step ( ** ) is a\nnon-standard extension that has the same meaning as in MySQL. The differences\nbetween MariaDB and MySQL\'s JSONPath are: MySQL supports [last] and [M to N]\nas array element selectors; MySQL doesn\'t allow one to specify the mode\nexplicitly (but uses lax mode implicitly).\n\nURL: https://mariadb.com/kb/en/jsonpath-expressions/','','https://mariadb.com/kb/en/jsonpath-expressions/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (746,40,'JSON_ARRAY','Syntax\n------\n\nJSON_ARRAY([value[, value2] ...])\n\nDescription\n-----------\n\nReturns a JSON array containing the listed values. The list can be empty.\n\nExample\n-------\n\nSELECT Json_Array(56, 3.1416, \'My name is \"Foo\"\', NULL);\n+--------------------------------------------------+\n| Json_Array(56, 3.1416, \'My name is \"Foo\"\', NULL) |\n+--------------------------------------------------+\n| [56, 3.1416, \"My name is \\\"Foo\\\"\", null] |\n+--------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_array/','','https://mariadb.com/kb/en/json_array/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (747,40,'JSON_ARRAY_APPEND','Syntax\n------\n\nJSON_ARRAY_APPEND(json_doc, path, value[, path, value] ...)\n\nDescription\n-----------\n\nAppends values to the end of the specified arrays within a JSON document,\nreturning the result, or NULL if any of the arguments are NULL.\n\nEvaluation is performed from left to right, with the resulting document from\nthe previous pair becoming the new value against which the next pair is\nevaluated.\n\nIf the json_doc is not a valid JSON document, or if any of the paths are not\nvalid, or contain a * or ** wildcard, an error is returned.\n\nExamples\n--------\n\nSET @json = \'[1, 2, [3, 4]]\';\n\nSELECT JSON_ARRAY_APPEND(@json, \'$[0]\', 5)\n+-------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$[0]\', 5) |\n+-------------------------------------+\n| [[1, 5], 2, [3, 4]] |\n+-------------------------------------+\n\nSELECT JSON_ARRAY_APPEND(@json, \'$[1]\', 6);\n+-------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$[1]\', 6) |\n+-------------------------------------+\n| [1, [2, 6], [3, 4]] |\n+-------------------------------------+\n\nSELECT JSON_ARRAY_APPEND(@json, \'$[1]\', 6, \'$[2]\', 7);\n+------------------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$[1]\', 6, \'$[2]\', 7) |\n+------------------------------------------------+\n| [1, [2, 6], [3, 4, 7]] |\n+------------------------------------------------+\n\nSELECT JSON_ARRAY_APPEND(@json, \'$\', 5);\n+----------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$\', 5) |\n+----------------------------------+\n| [1, 2, [3, 4], 5] |\n+----------------------------------+\n\nSET @json = \'{\"A\": 1, \"B\": [2], \"C\": [3, 4]}\';\n\nSELECT JSON_ARRAY_APPEND(@json, \'$.B\', 5);\n+------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$.B\', 5) |\n+------------------------------------+\n| {\"A\": 1, \"B\": [2, 5], \"C\": [3, 4]} |\n+------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_array_append/','','https://mariadb.com/kb/en/json_array_append/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (748,40,'JSON_ARRAY_INSERT','Syntax\n------\n\nJSON_ARRAY_INSERT(json_doc, path, value[, path, value] ...)\n\nDescription\n-----------\n\nInserts a value into a JSON document, returning the modified document, or NULL\nif any of the arguments are NULL.\n\nEvaluation is performed from left to right, with the resulting document from\nthe previous pair becoming the new value against which the next pair is\nevaluated.\n\nIf the json_doc is not a valid JSON document, or if any of the paths are not\nvalid, or contain a * or ** wildcard, an error is returned.\n\nExamples\n--------\n\nSET @json = \'[1, 2, [3, 4]]\';\n\nSELECT JSON_ARRAY_INSERT(@json, \'$[0]\', 5);\n+-------------------------------------+\n| JSON_ARRAY_INSERT(@json, \'$[0]\', 5) |\n+-------------------------------------+\n| [5, 1, 2, [3, 4]] |\n+-------------------------------------+\n\nSELECT JSON_ARRAY_INSERT(@json, \'$[1]\', 6);\n+-------------------------------------+\n| JSON_ARRAY_INSERT(@json, \'$[1]\', 6) |\n+-------------------------------------+\n| [1, 6, 2, [3, 4]] |\n+-------------------------------------+\n\nSELECT JSON_ARRAY_INSERT(@json, \'$[1]\', 6, \'$[2]\', 7);\n+------------------------------------------------+\n| JSON_ARRAY_INSERT(@json, \'$[1]\', 6, \'$[2]\', 7) |\n+------------------------------------------------+\n| [1, 6, 7, 2, [3, 4]] |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_array_insert/','','https://mariadb.com/kb/en/json_array_insert/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (749,40,'JSON_COMPACT','Syntax\n------\n\nJSON_COMPACT(json_doc)\n\nDescription\n-----------\n\nRemoves all unnecessary spaces so the json document is as short as possible.\n\nExample\n-------\n\nSET @j = \'{ \"A\": 1, \"B\": [2, 3]}\';\n\nSELECT JSON_COMPACT(@j), @j;\n+-------------------+------------------------+\n| JSON_COMPACT(@j) | @j |\n+-------------------+------------------------+\n| {\"A\":1,\"B\":[2,3]} | { \"A\": 1, \"B\": [2, 3]} |\n+-------------------+------------------------+\n\nURL: https://mariadb.com/kb/en/json_compact/','','https://mariadb.com/kb/en/json_compact/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (750,40,'JSON_CONTAINS','Syntax\n------\n\nJSON_CONTAINS(json_doc, val[, path])\n\nDescription\n-----------\n\nReturns whether or not the specified value is found in the given JSON document\nor, optionally, at the specified path within the document. Returns 1 if it\ndoes, 0 if not and NULL if any of the arguments are null. An error occurs if\nthe document or path is not valid, or contains the * or ** wildcards.\n\nExamples\n--------\n\nSET @json = \'{\"A\": 0, \"B\": {\"C\": 1}, \"D\": 2}\';\n\nSELECT JSON_CONTAINS(@json, \'2\', \'$.A\');\n+----------------------------------+\n| JSON_CONTAINS(@json, \'2\', \'$.A\') |\n+----------------------------------+\n| 0 |\n+----------------------------------+\n\nSELECT JSON_CONTAINS(@json, \'2\', \'$.D\');\n+----------------------------------+\n| JSON_CONTAINS(@json, \'2\', \'$.D\') |\n+----------------------------------+\n| 1 |\n+----------------------------------+\n\nSELECT JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.A\');\n+-----------------------------------------+\n| JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.A\') |\n+-----------------------------------------+\n| 0 |\n+-----------------------------------------+\n\nSELECT JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.B\');\n+-----------------------------------------+\n| JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.B\') |\n+-----------------------------------------+\n| 1 |\n+-----------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_contains/','','https://mariadb.com/kb/en/json_contains/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (751,40,'JSON_CONTAINS_PATH','Syntax\n------\n\nJSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)\n\nDescription\n-----------\n\nIndicates whether the given JSON document contains data at the specified path\nor paths. Returns 1 if it does, 0 if not and NULL if any of the arguments are\nnull.\n\nThe return_arg can be one or all:\n\n* one - Returns 1 if at least one path exists within the JSON document. \n* all - Returns 1 only if all paths exist within the JSON document.\n\nExamples\n--------\n\nSET @json = \'{\"A\": 1, \"B\": [2], \"C\": [3, 4]}\';\n\nSELECT JSON_CONTAINS_PATH(@json, \'one\', \'$.A\', \'$.D\');\n+------------------------------------------------+\n| JSON_CONTAINS_PATH(@json, \'one\', \'$.A\', \'$.D\') |\n+------------------------------------------------+\n| 1 |\n+------------------------------------------------+\n1 row in set (0.00 sec)\n\nSELECT JSON_CONTAINS_PATH(@json, \'all\', \'$.A\', \'$.D\');\n+------------------------------------------------+\n| JSON_CONTAINS_PATH(@json, \'all\', \'$.A\', \'$.D\') |\n+------------------------------------------------+\n| 0 |\n+------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_contains_path/','','https://mariadb.com/kb/en/json_contains_path/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (752,40,'JSON_DEPTH','Syntax\n------\n\nJSON_DEPTH(json_doc)\n\nDescription\n-----------\n\nReturns the maximum depth of the given JSON document, or NULL if the argument\nis null. An error will occur if the argument is an invalid JSON document.\n\n* Scalar values or empty arrays or objects have a depth of 1.\n* Arrays or objects that are not empty but contain only elements or member\nvalues of depth 1 will have a depth of 2.\n* In other cases, the depth will be greater than 2.\n\nExamples\n--------\n\nSELECT JSON_DEPTH(\'[]\'), JSON_DEPTH(\'true\'), JSON_DEPTH(\'{}\');\n+------------------+--------------------+------------------+\n| JSON_DEPTH(\'[]\') | JSON_DEPTH(\'true\') | JSON_DEPTH(\'{}\') |\n+------------------+--------------------+------------------+\n| 1 | 1 | 1 |\n+------------------+--------------------+------------------+\n\nSELECT JSON_DEPTH(\'[1, 2, 3]\'), JSON_DEPTH(\'[[], {}, []]\');\n+-------------------------+----------------------------+\n| JSON_DEPTH(\'[1, 2, 3]\') | JSON_DEPTH(\'[[], {}, []]\') |\n+-------------------------+----------------------------+\n| 2 | 2 |\n+-------------------------+----------------------------+\n\nSELECT JSON_DEPTH(\'[1, 2, [3, 4, 5, 6], 7]\');\n+---------------------------------------+\n| JSON_DEPTH(\'[1, 2, [3, 4, 5, 6], 7]\') |\n+---------------------------------------+\n| 3 |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_depth/','','https://mariadb.com/kb/en/json_depth/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (753,40,'JSON_DETAILED','Syntax\n------\n\nJSON_DETAILED(json_doc[, tab_size])\n\nDescription\n-----------\n\nRepresents JSON in the most understandable way emphasizing nested structures.\n\nExample\n-------\n\nSET @j = \'{ \"A\":1,\"B\":[2,3]}\';\n\nSELECT @j;\n+--------------------+\n| @j |\n+--------------------+\n| { \"A\":1,\"B\":[2,3]} |\n+--------------------+\n\nSELECT JSON_DETAILED(@j);\n+------------------------------------------------------------+\n| JSON_DETAILED(@j) |\n+------------------------------------------------------------+\n| {\n \"A\": 1,\n \"B\":\n [\n 2,\n 3\n ]\n} |\n+------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_detailed/','','https://mariadb.com/kb/en/json_detailed/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (754,40,'JSON_EQUALS','MariaDB starting with 10.7.0\n----------------------------\nJSON_EQUALS was added in MariaDB 10.7.0\n\nSyntax\n------\n\nJSON_EQUALS(json1, json2)\n\nDescription\n-----------\n\nChecks if there is equality between two json objects. Returns 1 if it there\nis, 0 if not, or NULL if any of the arguments are null.\n\nExamples\n--------\n\nSELECT JSON_EQUALS(\'{\"a\" :[1, 2, 3],\"b\":[4]}\', \'{\"b\":[4],\"a\":[1, 2, 3.0]}\');\n+------------------------------------------------------------------------+\n| JSON_EQUALS(\'{\"a\" :[1, 2, 3],\"b\":[4]}\', \'{\"b\":[4],\"a\":[1, 2, 3.0]}\') |\n+------------------------------------------------------------------------+\n| 1 |\n+------------------------------------------------------------------------+\n\nSELECT JSON_EQUALS(\'{\"a\":[1, 2, 3]}\', \'{\"a\":[1, 2, 3.01]}\');\n+------------------------------------------------------+\n| JSON_EQUALS(\'{\"a\":[1, 2, 3]}\', \'{\"a\":[1, 2, 3.01]}\') |\n+------------------------------------------------------+\n| 0 |\n+------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_equals/','','https://mariadb.com/kb/en/json_equals/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (755,40,'JSON_EXISTS','Syntax\n------\n\nDescription\n-----------\n\nDetermines whether a specified JSON value exists in the given data. Returns 1\nif found, 0 if not, or NULL if any of the inputs were NULL.\n\nExamples\n--------\n\nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2\");\n+------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2\") |\n+------------------------------------------------------------+\n| 1 |\n+------------------------------------------------------------+\n\nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key3\");\n+------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key3\") |\n+------------------------------------------------------------+\n| 0 |\n+------------------------------------------------------------+\n\nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2[1]\");\n+---------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2[1]\") |\n+---------------------------------------------------------------+\n| 1 |\n+---------------------------------------------------------------+\n\nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2[10]\");\n+----------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\', \"$.key2[10]\") |\n+----------------------------------------------------------------+\n| 0 |\n+----------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_exists/','','https://mariadb.com/kb/en/json_exists/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (756,40,'JSON_EXTRACT','Syntax\n------\n\nJSON_EXTRACT(json_doc, path[, path] ...)\n\nDescription\n-----------\n\nExtracts data from a JSON document. The extracted data is selected from the\nparts matching the path arguments. Returns all matched values; either as a\nsingle matched value, or, if the arguments could return multiple values, a\nresult autowrapped as an array in the matching order.\n\nReturns NULL if no paths match or if any of the arguments are NULL.\n\nAn error will occur if any path argument is not a valid path, or if the\njson_doc argument is not a valid JSON document.\n\nThe path expression be a JSONPath expression as supported by MariaDB\n\nExamples\n--------\n\nSET @json = \'[1, 2, [3, 4]]\';\n\nSELECT JSON_EXTRACT(@json, \'$[1]\');\n+-----------------------------+\n| JSON_EXTRACT(@json, \'$[1]\') |\n+-----------------------------+\n| 2 |\n+-----------------------------+\n\nSELECT JSON_EXTRACT(@json, \'$[2]\');\n+-----------------------------+\n| JSON_EXTRACT(@json, \'$[2]\') |\n+-----------------------------+\n| [3, 4] |\n+-----------------------------+\n\nSELECT JSON_EXTRACT(@json, \'$[2][1]\');\n+--------------------------------+\n| JSON_EXTRACT(@json, \'$[2][1]\') |\n+--------------------------------+\n| 4 |\n+--------------------------------+\n\nURL: https://mariadb.com/kb/en/json_extract/','','https://mariadb.com/kb/en/json_extract/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (757,40,'JSON_INSERT','Syntax\n------\n\nJSON_INSERT(json_doc, path, val[, path, val] ...)\n\nDescription\n-----------\n\nInserts data into a JSON document, returning the resulting document or NULL if\nany argument is null.\n\nAn error will occur if the JSON document is not invalid, or if any of the\npaths are invalid or contain a * or ** wildcard.\n\nJSON_INSERT can only insert data while JSON_REPLACE can only update. JSON_SET\ncan update or insert data.\n\nExamples\n--------\n\nSET @json = \'{ \"A\": 0, \"B\": [1, 2]}\';\n\nSELECT JSON_INSERT(@json, \'$.C\', \'[3, 4]\');\n+--------------------------------------+\n| JSON_INSERT(@json, \'$.C\', \'[3, 4]\') |\n+--------------------------------------+\n| { \"A\": 0, \"B\": [1, 2], \"C\":\"[3, 4]\"} |\n+--------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_insert/','','https://mariadb.com/kb/en/json_insert/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (758,40,'JSON_KEYS','Syntax\n------\n\nJSON_KEYS(json_doc[, path])\n\nDescription\n-----------\n\nReturns the keys as a JSON array from the top-level value of a JSON object or,\nif the optional path argument is provided, the top-level keys from the path.\n\nExcludes keys from nested sub-objects in the top level value. The resulting\narray will be empty if the selected object is empty.\n\nReturns NULL if any of the arguments are null, a given path does not locate an\nobject, or if the json_doc argument is not an object.\n\nAn error will occur if JSON document is invalid, the path is invalid or if the\npath contains a * or ** wildcard.\n\nExamples\n--------\n\nSELECT JSON_KEYS(\'{\"A\": 1, \"B\": {\"C\": 2}}\');\n+--------------------------------------+\n| JSON_KEYS(\'{\"A\": 1, \"B\": {\"C\": 2}}\') |\n+--------------------------------------+\n| [\"A\", \"B\"] |\n+--------------------------------------+\n\nSELECT JSON_KEYS(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\', \'$.C\');\n+-----------------------------------------------------+\n| JSON_KEYS(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\', \'$.C\') |\n+-----------------------------------------------------+\n| [\"D\"] |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_keys/','','https://mariadb.com/kb/en/json_keys/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (759,40,'JSON_LENGTH','Syntax\n------\n\nJSON_LENGTH(json_doc[, path])\n\nDescription\n-----------\n\nReturns the length of a JSON document, or, if the optional path argument is\ngiven, the length of the value within the document specified by the path.\n\nReturns NULL if any of the arguments argument are null or the path argument\ndoes not identify a value in the document.\n\nAn error will occur if the JSON document is invalid, the path is invalid or if\nthe path contains a * or ** wildcard.\n\nLength will be determined as follow:\n\n* A scalar\'s length is always 1.\n* If an array, the number of elements in the array.\n* If an object, the number of members in the object.\n\nThe length of nested arrays or objects are not counted.\n\nExamples\n--------\n\nURL: https://mariadb.com/kb/en/json_length/','','https://mariadb.com/kb/en/json_length/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (760,40,'JSON_LOOSE','Syntax\n------\n\nJSON_LOOSE(json_doc)\n\nDescription\n-----------\n\nAdds spaces to a JSON document to make it look more readable.\n\nExample\n-------\n\nSET @j = \'{ \"A\":1,\"B\":[2,3]}\';\n\nSELECT JSON_LOOSE(@j), @j;\n+-----------------------+--------------------+\n| JSON_LOOSE(@j) | @j |\n+-----------------------+--------------------+\n| {\"A\": 1, \"B\": [2, 3]} | { \"A\":1,\"B\":[2,3]} |\n+-----------------------+--------------------+\n\nURL: https://mariadb.com/kb/en/json_loose/','','https://mariadb.com/kb/en/json_loose/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (761,40,'JSON_MERGE','Syntax\n------\n\nJSON_MERGE(json_doc, json_doc[, json_doc] ...)\n\nDescription\n-----------\n\nMerges the given JSON documents.\n\nReturns the merged result,or NULL if any argument is NULL.\n\nAn error occurs if any of the arguments are not valid JSON documents.\n\nJSON_MERGE has been deprecated since MariaDB 10.2.25, MariaDB 10.3.16 and\nMariaDB 10.4.5. JSON_MERGE_PATCH is an RFC 7396-compliant replacement, and\nJSON_MERGE_PRESERVE is a synonym.\n\nExample\n-------\n\nSET @json1 = \'[1, 2]\';\nSET @json2 = \'[3, 4]\';\n\nSELECT JSON_MERGE(@json1,@json2);\n+---------------------------+\n| JSON_MERGE(@json1,@json2) |\n+---------------------------+\n| [1, 2, 3, 4] |\n+---------------------------+\n\nURL: https://mariadb.com/kb/en/json_merge/','','https://mariadb.com/kb/en/json_merge/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (762,40,'JSON_MERGE_PATCH','MariaDB starting with 10.2.25\n-----------------------------\nJSON_MERGE_PATCH was introduced in MariaDB 10.2.25, MariaDB 10.3.16 and\nMariaDB 10.4.5.\n\nSyntax\n------\n\nJSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)\n\nDescription\n-----------\n\nMerges the given JSON documents, returning the merged result, or NULL if any\nargument is NULL.\n\nJSON_MERGE_PATCH is an RFC 7396-compliant replacement for JSON_MERGE, which\nhas been deprecated.\n\nExample\n-------\n\nSET @json1 = \'[1, 2]\';\nSET @json2 = \'[2, 3]\';\nSELECT JSON_MERGE_PATCH(@json1,@json2),JSON_MERGE_PRESERVE(@json1,@json2);\n+---------------------------------+------------------------------------+\n| JSON_MERGE_PATCH(@json1,@json2) | JSON_MERGE_PRESERVE(@json1,@json2) |\n+---------------------------------+------------------------------------+\n| [2, 3] | [1, 2, 2, 3] |\n+---------------------------------+------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_merge_patch/','','https://mariadb.com/kb/en/json_merge_patch/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (763,40,'JSON_MERGE_PRESERVE','MariaDB starting with 10.2.25\n-----------------------------\nJSON_MERGE_PRESERVE was introduced in MariaDB 10.2.25, MariaDB 10.3.16 and\nMariaDB 10.4.5.\n\nSyntax\n------\n\nJSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)\n\nDescription\n-----------\n\nMerges the given JSON documents, returning the merged result, or NULL if any\nargument is NULL.\n\nJSON_MERGE_PRESERVE was introduced in MariaDB 10.2.25, MariaDB 10.3.16 and\nMariaDB 10.4.5 as a synonym for JSON_MERGE, which has been deprecated.\n\nExample\n-------\n\nSET @json1 = \'[1, 2]\';\nSET @json2 = \'[2, 3]\';\nSELECT JSON_MERGE_PATCH(@json1,@json2),JSON_MERGE_PRESERVE(@json1,@json2);\n+---------------------------------+------------------------------------+\n| JSON_MERGE_PATCH(@json1,@json2) | JSON_MERGE_PRESERVE(@json1,@json2) |\n+---------------------------------+------------------------------------+\n| [2, 3] | [1, 2, 2, 3] |\n+---------------------------------+------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_merge_preserve/','','https://mariadb.com/kb/en/json_merge_preserve/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (764,40,'JSON_NORMALIZE','MariaDB starting with 10.7.0\n----------------------------\nJSON_NORMALIZE was added in MariaDB 10.7.0.\n\nSyntax\n------\n\nJSON_NORMALIZE(json)\n\nDescription\n-----------\n\nRecursively sorts keys and removes spaces, allowing comparison of json\ndocuments for equality.\n\nExamples\n--------\n\nWe may wish our application to use the database to enforce a unique constraint\non the JSON contents, and we can do so using the JSON_NORMALIZE function in\ncombination with a unique key.\n\nFor example, if we have a table with a JSON column:\n\nCREATE TABLE t1 (\n id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,\n val JSON,\n /* other columns here */\n PRIMARY KEY (id)\n);\n\nAdd a unique constraint using JSON_NORMALIZE like this:\n\nALTER TABLE t1\n ADD COLUMN jnorm JSON AS (JSON_NORMALIZE(val)) VIRTUAL,\n ADD UNIQUE KEY (jnorm);\n\nWe can test this by first inserting a row as normal:\n\nINSERT INTO t1 (val) VALUES (\'{\"name\":\"alice\",\"color\":\"blue\"}\');\n\nAnd then seeing what happens with a different string which would produce the\nsame JSON object:\n\nINSERT INTO t1 (val) VALUES (\'{ \"color\": \"blue\", \"name\": \"alice\" }\');\nERROR 1062 (23000): Duplicate entry \'{\"color\":\"blue\",\"name\":\"alice\"}\' for key\n\'jnorm\'\n\nURL: https://mariadb.com/kb/en/json_normalize/','','https://mariadb.com/kb/en/json_normalize/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (765,40,'JSON_OBJECT','Syntax\n------\n\nJSON_OBJECT([key, value[, key, value] ...])\n\nDescription\n-----------\n\nReturns a JSON object containing the given key/value pairs. The key/value list\ncan be empty.\n\nAn error will occur if there are an odd number of arguments, or any key name\nis NULL.\n\nExample\n-------\n\nSELECT JSON_OBJECT(\"id\", 1, \"name\", \"Monty\");\n+---------------------------------------+\n| JSON_OBJECT(\"id\", 1, \"name\", \"Monty\") |\n+---------------------------------------+\n| {\"id\": 1, \"name\": \"Monty\"} |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_object/','','https://mariadb.com/kb/en/json_object/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (766,40,'JSON_QUERY','Syntax\n------\n\nJSON_QUERY(json_doc, path)\n\nDescription\n-----------\n\nGiven a JSON document, returns an object or array specified by the path.\nReturns NULL if not given a valid JSON document, or if there is no match.\n\nExamples\n--------\n\nselect json_query(\'{\"key1\":{\"a\":1, \"b\":[1,2]}}\', \'$.key1\');\n+-----------------------------------------------------+\n| json_query(\'{\"key1\":{\"a\":1, \"b\":[1,2]}}\', \'$.key1\') |\n+-----------------------------------------------------+\n| {\"a\":1, \"b\":[1,2]} |\n+-----------------------------------------------------+\n\nselect json_query(\'{\"key1\":123, \"key1\": [1,2,3]}\', \'$.key1\');\n+-------------------------------------------------------+\n| json_query(\'{\"key1\":123, \"key1\": [1,2,3]}\', \'$.key1\') |\n+-------------------------------------------------------+\n| [1,2,3] |\n+-------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_query/','','https://mariadb.com/kb/en/json_query/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (767,40,'JSON_QUOTE','Syntax\n------\n\nJSON_QUOTE(json_value)\n\nDescription\n-----------\n\nQuotes a string as a JSON value, usually for producing valid JSON string\nliterals for inclusion in JSON documents. Wraps the string with double quote\ncharacters and escapes interior quotes and other special characters, returning\na utf8mb4 string.\n\nReturns NULL if the argument is NULL.\n\nExamples\n--------\n\nSELECT JSON_QUOTE(\'A\'), JSON_QUOTE(\"B\"), JSON_QUOTE(\'\"C\"\');\n+-----------------+-----------------+-------------------+\n| JSON_QUOTE(\'A\') | JSON_QUOTE(\"B\") | JSON_QUOTE(\'\"C\"\') |\n+-----------------+-----------------+-------------------+\n| \"A\" | \"B\" | \"\\\"C\\\"\" |\n+-----------------+-----------------+-------------------+\n\nURL: https://mariadb.com/kb/en/json_quote/','','https://mariadb.com/kb/en/json_quote/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (768,40,'JSON_REMOVE','Syntax\n------\n\nJSON_REMOVE(json_doc, path[, path] ...)\n\nDescription\n-----------\n\nRemoves data from a JSON document returning the result, or NULL if any of the\narguments are null. If the element does not exist in the document, no changes\nare made.\n\nAn error will occur if JSON document is invalid, the path is invalid or if the\npath contains a * or ** wildcard.\n\nPath arguments are evaluated from left to right, with the result from the\nearlier evaluation being used as the value for the next.\n\nExamples\n--------\n\nSELECT JSON_REMOVE(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\', \'$.C\');\n+-------------------------------------------------------+\n| JSON_REMOVE(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\', \'$.C\') |\n+-------------------------------------------------------+\n| {\"A\": 1, \"B\": 2} |\n+-------------------------------------------------------+\n\nSELECT JSON_REMOVE(\'[\"A\", \"B\", [\"C\", \"D\"], \"E\"]\', \'$[1]\');\n+----------------------------------------------------+\n| JSON_REMOVE(\'[\"A\", \"B\", [\"C\", \"D\"], \"E\"]\', \'$[1]\') |\n+----------------------------------------------------+\n| [\"A\", [\"C\", \"D\"], \"E\"] |\n+----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_remove/','','https://mariadb.com/kb/en/json_remove/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (769,40,'JSON_REPLACE','Syntax\n------\n\nJSON_REPLACE(json_doc, path, val[, path, val] ...)\n\nDescription\n-----------\n\nReplaces existing values in a JSON document, returning the result, or NULL if\nany of the arguments are NULL.\n\nAn error will occur if the JSON document is invalid, the path is invalid or if\nthe path contains a * or ** wildcard.\n\nPaths and values are evaluated from left to right, with the result from the\nearlier evaluation being used as the value for the next.\n\nJSON_REPLACE can only update data, while JSON_INSERT can only insert. JSON_SET\ncan update or insert data.\n\nExamples\n--------\n\nSELECT JSON_REPLACE(\'{ \"A\": 1, \"B\": [2, 3]}\', \'$.B[1]\', 4);\n+-----------------------------------------------------+\n| JSON_REPLACE(\'{ \"A\": 1, \"B\": [2, 3]}\', \'$.B[1]\', 4) |\n+-----------------------------------------------------+\n| { \"A\": 1, \"B\": [2, 4]} |\n+-----------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_replace/','','https://mariadb.com/kb/en/json_replace/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (770,40,'JSON_SEARCH','Syntax\n------\n\nJSON_SEARCH(json_doc, return_arg, search_str[, escape_char[, path] ...])\n\nDescription\n-----------\n\nReturns the path to the given string within a JSON document, or NULL if any of\njson_doc, search_str or a path argument is NULL; if the search string is not\nfound, or if no path exists within the document.\n\nA warning will occur if the JSON document is not valid, any of the path\narguments are not valid, if return_arg is neither one nor all, or if the\nescape character is not a constant. NULL will be returned.\n\nreturn_arg can be one of two values:\n\n* \'one: Terminates after finding the first match, so will return one path\nstring. If there is more than one match, it is undefined which is considered\nfirst.\n* all: Returns all matching path strings, without duplicates. Multiple strings\nare autowrapped as an array. The order is undefined.\n\nExamples\n--------\n\nSET @json = \'[\"A\", [{\"B\": \"1\"}], {\"C\":\"AB\"}, {\"D\":\"BC\"}]\';\n\nSELECT JSON_SEARCH(@json, \'one\', \'AB\');\n+---------------------------------+\n| JSON_SEARCH(@json, \'one\', \'AB\') |\n+---------------------------------+\n| \"$[2].C\" |\n+---------------------------------+\n\nURL: https://mariadb.com/kb/en/json_search/','','https://mariadb.com/kb/en/json_search/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (771,40,'JSON_SET','Syntax\n------\n\nJSON_SET(json_doc, path, val[, path, val] ...)\n\nDescription\n-----------\n\nUpdates or inserts data into a JSON document, returning the result, or NULL if\nany of the arguments are NULL or the optional path fails to find an object.\n\nAn error will occur if the JSON document is invalid, the path is invalid or if\nthe path contains a * or wildcard.\n\nJSON_SET can update or insert data, while JSON_REPLACE can only update, and\nJSON_INSERT only insert.\n\nExamples\n--------\n\nSELECT JSON_SET(Priv, \'$.locked\', \'true\') FROM mysql.global_priv\n\nURL: https://mariadb.com/kb/en/json_set/','','https://mariadb.com/kb/en/json_set/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (772,40,'JSON_TABLE','MariaDB starting with 10.6.0\n----------------------------\nJSON_TABLE was added in MariaDB 10.6.0.\n\nJSON_TABLE is a table function that converts JSON data into a relational form.\n\nSyntax\n------\n\nJSON_TABLE(json_doc, \n context_path COLUMNS (column_list)\n) [AS] alias\n\ncolumn_list:\n column[, column][, ...]\n\ncolumn:\n name FOR ORDINALITY\n | name type PATH path_str [on_empty] [on_error]\n | name type EXISTS PATH path_str\n | NESTED PATH path_str COLUMNS (column_list)\n\non_empty:\n {NULL | DEFAULT string | ERROR} ON EMPTY\n\non_error:\n {NULL | DEFAULT string | ERROR} ON ERROR\n\nDescription\n-----------\n\nJSON_TABLE can be used in contexts where a table reference can be used; in the\nFROM clause of a SELECT statement, and in multi-table UPDATE/DELETE statements.\n\njson_doc is the JSON document to extract data from. In the simplest case, it\nis a string literal containing JSON. In more complex cases it can be an\narbitrary expression returning JSON. The expression may have references to\ncolumns of other tables. However, one can only refer to tables that precede\nthis JSON_TABLE invocation. For RIGHT JOIN, it is assumed that its outer side\nprecedes the inner. All tables in outer selects are also considered preceding.\n\ncontext_path is a JSON Path expression pointing to a collection of nodes in\njson_doc that will be used as the source of rows.\n\nThe COLUMNS clause declares the names and types of the columns that JSON_TABLE\nreturns, as well as how the values of the columns are produced.\n\nColumn Definitions\n------------------\n\nThe following types of columns are supported:\n\nPath Columns\n------------\n\nname type PATH path_str [on_empty] [on_error]\n\nLocates the JSON node pointed to by path_str and returns its value. The\npath_str is evaluated using the current row source node as the context node.\n\nset @json=\'\n[\n {\"name\":\"Laptop\", \"color\":\"black\", \"price\":\"1000\"},\n {\"name\":\"Jeans\", \"color\":\"blue\"}\n]\';\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n name varchar(10) path \'$.name\',\n color varchar(10) path \'$.color\',\n price decimal(8,2) path \'$.price\' )\n) as jt;\n+--------+-------+---------+\n| name | color | price |\n+--------+-------+---------+\n| Laptop | black | 1000.00 |\n| Jeans | blue | NULL |\n+--------+-------+---------+\n\nThe on_empty and on_error clauses specify the actions to be performed when the\nvalue was not found or there was an error condition. See the ON EMPTY and ON\nERROR clauses section for details.\n\nORDINALITY Columns\n------------------\n\nname FOR ORDINALITY\n\nCounts the rows, starting from 1.\n\nExample:\n\nset @json=\'\n[\n {\"name\":\"Laptop\", \"color\":\"black\"},\n {\"name\":\"Jeans\", \"color\":\"blue\"}\n]\';\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n id for ordinality,\n name varchar(10) path \'$.name\')\n) as jt;\n+------+--------+\n| id | name |\n+------+--------+\n| 1 | Laptop |\n| 2 | Jeans |\n+------+--------+\n\nEXISTS PATH Columns\n-------------------\n\nname type EXISTS PATH path_str\n\nChecks whether the node pointed to by value_path exists. The value_path is\nevaluated using the current row source node as the context node.\n\nset @json=\'\n[\n {\"name\":\"Laptop\", \"color\":\"black\", \"price\":1000},\n {\"name\":\"Jeans\", \"color\":\"blue\"}\n]\';\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n name varchar(10) path \'$.name\',\n has_price integer exists path \'$.price\')\n) as jt;\n+--------+-----------+\n| name | has_price |\n+--------+-----------+\n| Laptop | 1 |\n| Jeans | 0 |\n+--------+-----------+\n\nNESTED PATHs\n------------\n\nNESTED PATH converts nested JSON structures into multiple rows.\n\nNESTED PATH path COLUMNS (column_list)\n\nIt finds the sequence of JSON nodes pointed to by path and uses it to produce\nrows. For each found node, a row is generated with column values as specified\nby the NESTED PATH\'s COLUMNS clause. If path finds no nodes, only one row is\ngenerated with all columns having NULL values.\n\nFor example, consider a JSON document that contains an array of items, and\neach item, in turn, is expected to have an array of its available sizes:\n\nset @json=\'\n[\n {\"name\":\"Jeans\", \"sizes\": [32, 34, 36]},\n {\"name\":\"T-Shirt\", \"sizes\":[\"Medium\", \"Large\"]},\n {\"name\":\"Cellphone\"}\n]\';\n\nNESTED PATH allows one to produce a separate row for each size each item has:\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n name varchar(10) path \'$.name\',\n nested path \'$.sizes[*]\' columns (\n size varchar(32) path \'$\'\n )\n )\n) as jt;\n+-----------+--------+\n| name | size |\n+-----------+--------+\n| Jeans | 32 |\n| Jeans | 34 |\n| Jeans | 36 |\n| T-Shirt | Medium |\n| T-Shirt | Large |\n| Cellphone | NULL |\n+-----------+--------+\n\nNESTED PATH clauses can be nested within one another. They can also be located\nnext to each other. In that case, the nested path clauses will produce records\none at a time. The ones that are not producing records will have all columns\nset to NULL.\n\nExample:\n\nset @json=\'\n[\n {\"name\":\"Jeans\", \"sizes\": [32, 34, 36], \"colors\":[\"black\", \"blue\"]}\n]\';\n\nselect * from json_table(@json, \'$[*]\' \n columns(\n name varchar(10) path \'$.name\',\n nested path \'$.sizes[*]\' columns (\n size varchar(32) path \'$\'\n ),\n nested path \'$.colors[*]\' columns (\n color varchar(32) path \'$\'\n )\n )\n) as jt;\n\n+-------+------+-------+\n| name | size | color |\n+-------+------+-------+\n| Jeans | 32 | NULL |\n| Jeans | 34 | NULL |\n| Jeans | 36 | NULL |\n| Jeans | NULL | black |\n| Jeans | NULL | blue |\n+-------+------+-------+\n\nON EMPTY and ON ERROR Clauses\n-----------------------------\n\nThe ON EMPTY clause specifies what will be done when the element specified by\nthe search path is missing in the JSON document.\n\non_empty:\n {NULL | DEFAULT string | ERROR} ON EMPTY\n\nWhen ON EMPTY clause is not present, NULL ON EMPTY is implied.\n\non_error:\n {NULL | DEFAULT string | ERROR} ON ERROR\n\nThe ON ERROR clause specifies what should be done if a JSON structure error\noccurs when trying to extract the value pointed to by the path expression. A\nJSON structure error here occurs only when one attempts to convert a JSON\nnon-scalar (array or object) into a scalar value. When the ON ERROR clause is\nnot present, NULL ON ERROR is implied.\n\nNote: A datatype conversion error (e.g. attempt to store a non-integer value\ninto an integer field, or a varchar column being truncated) is not considered\na JSON error and so will not trigger the ON ERROR behavior. It will produce\nwarnings, in the same way as CAST(value AS datatype) would.\n\nReplication\n-----------\n\nIn the current code, evaluation of JSON_TABLE is deterministic, that is, for a\ngiven input string JSON_TABLE will always produce the same set of rows in the\nsame order. However, one can think of JSON documents that one can consider\nidentical which will produce different output. In order to be future-proof and\nwithstand changes like:\n\n* sorting JSON object members by name (like MySQL does)\n* changing the way duplicate object members are handled\nthe function is marked as unsafe for statement-based replication.\n\nExtracting a Subdocument into a Column\n--------------------------------------\n\nMariaDB starting with 10.6.9\n----------------------------\nPrior to MariaDB 10.6.9, JSON_TABLE did not allow one to extract a JSON\n\"subdocument\" into a JSON column.\n\nSELECT * FROM JSON_TABLE(\'{\"foo\": [1,2,3,4]}\',\'$\' columns( jscol json path\n\'$.foo\') ) AS T;\n+-------+\n| jscol |\n+-------+\n| NULL |\n+-------+\n\nThis is supported from MariaDB 10.6.9:\n\nSELECT * FROM JSON_TABLE(\'{\"foo\": [1,2,3,4]}\',\'$\' columns( jscol json path\n\'$.foo\') ) AS T;\n+-----------+\n| jscol |\n+-----------+\n| [1,2,3,4] |\n+-----------+\n\nURL: https://mariadb.com/kb/en/json_table/','','https://mariadb.com/kb/en/json_table/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (773,40,'JSON_TYPE','Syntax\n------\n\nJSON_TYPE(json_val)\n\nDescription\n-----------\n\nReturns the type of a JSON value (as a string), or NULL if the argument is\nnull.\n\nAn error will occur if the argument is an invalid JSON value.\n\nThe following is a complete list of the possible return types:\n\n+-----------------------------------+-----------------+-----------------------+\n| Return type | Value | Example |\n+-----------------------------------+-----------------+-----------------------+\n| ARRAY | JSON array | [1, 2, {\"key\": |\n| | | \"value\"}] |\n+-----------------------------------+-----------------+-----------------------+\n| OBJECT | JSON object | {\"key\":\"value\"} |\n+-----------------------------------+-----------------+-----------------------+\n| BOOLEAN | JSON | true, false |\n| | true/false | |\n| | literals | |\n+-----------------------------------+-----------------+-----------------------+\n| DOUBLE | A number with | 1.2 |\n| | at least one | |\n| | floating point | |\n| | decimal. | |\n+-----------------------------------+-----------------+-----------------------+\n| INTEGER | A number | 1 |\n| | without a | |\n| | floating point | |\n| | decimal. | |\n+-----------------------------------+-----------------+-----------------------+\n| NULL | JSON null | null |\n| | literal (this | |\n| | is returned as | |\n| | a string, not | |\n| | to be confused | |\n| | with the SQL | |\n| | NULL value!) | |\n+-----------------------------------+-----------------+-----------------------+\n| STRING | JSON String | \"a sample string\" |\n+-----------------------------------+-----------------+-----------------------+\n\nExamples\n--------\n\nSELECT JSON_TYPE(\'{\"A\": 1, \"B\": 2, \"C\": 3}\');\n+---------------------------------------+\n| JSON_TYPE(\'{\"A\": 1, \"B\": 2, \"C\": 3}\') |\n+---------------------------------------+\n| OBJECT |\n+---------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_type/','','https://mariadb.com/kb/en/json_type/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (774,40,'JSON_UNQUOTE','Syntax\n------\n\nJSON_UNQUOTE(val)\n\nDescription\n-----------\n\nUnquotes a JSON value, returning a string, or NULL if the argument is null.\n\nAn error will occur if the given value begins and ends with double quotes and\nis an invalid JSON string literal.\n\nIf the given value is not a JSON string, value is passed through unmodified.\n\nCertain character sequences have special meanings within a string. Usually, a\nbackslash is ignored, but the escape sequences in the table below are\nrecognised by MariaDB, unless the SQL Mode is set to NO_BACKSLASH_ESCAPES SQL.\n\n+-----------------------------------------------+-----------------------------+\n| Escape sequence | Character |\n+-----------------------------------------------+-----------------------------+\n| \\\" | Double quote (\") |\n+-----------------------------------------------+-----------------------------+\n| \\b | Backslash |\n+-----------------------------------------------+-----------------------------+\n| \\f | Formfeed |\n+-----------------------------------------------+-----------------------------+\n| \\n | Newline (linefeed) |\n+-----------------------------------------------+-----------------------------+\n| \\r | Carriage return |\n+-----------------------------------------------+-----------------------------+\n| \\t | Tab |\n+-----------------------------------------------+-----------------------------+\n| \\\\ | Backslash (\\) |\n+-----------------------------------------------+-----------------------------+\n| \\uXXXX | UTF-8 bytes for Unicode |\n| | value XXXX |\n+-----------------------------------------------+-----------------------------+\n\nExamples\n--------\n\nSELECT JSON_UNQUOTE(\'\"Monty\"\');\n+-------------------------+\n| JSON_UNQUOTE(\'\"Monty\"\') |\n+-------------------------+\n| Monty |\n+-------------------------+\n\nWith the default SQL Mode:\n\nSELECT JSON_UNQUOTE(\'Si\\bng\\ting\');\n+-----------------------------+\n| JSON_UNQUOTE(\'Si\\bng\\ting\') |\n+-----------------------------+\n| Sng ing |\n+-----------------------------+\n\nSetting NO_BACKSLASH_ESCAPES:\n\nSET @@sql_mode = \'NO_BACKSLASH_ESCAPES\';\n\nSELECT JSON_UNQUOTE(\'Si\\bng\\ting\');\n+-----------------------------+\n| JSON_UNQUOTE(\'Si\\bng\\ting\') |\n+-----------------------------+\n| Si\\bng\\ting |\n+-----------------------------+\n\nURL: https://mariadb.com/kb/en/json_unquote/','','https://mariadb.com/kb/en/json_unquote/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (775,40,'JSON_VALID','Syntax\n------\n\nJSON_VALID(value)\n\nDescription\n-----------\n\nIndicates whether the given value is a valid JSON document or not. Returns 1\nif valid, 0 if not, and NULL if the argument is NULL.\n\nFrom MariaDB 10.4.3, the JSON_VALID function is automatically used as a CHECK\nconstraint for the JSON data type alias in order to ensure that a valid json\ndocument is inserted.\n\nExamples\n--------\n\nSELECT JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\"}\');\n+------------------------------------------+\n| JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\"}\') |\n+------------------------------------------+\n| 1 |\n+------------------------------------------+\n\nSELECT JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\", \"oddfield\"}\');\n+------------------------------------------------------+\n| JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\", \"oddfield\"}\') |\n+------------------------------------------------------+\n| 0 |\n+------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/json_valid/','','https://mariadb.com/kb/en/json_valid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (776,40,'JSON_VALUE','Syntax\n------\n\nJSON_VALUE(json_doc, path)\n\nDescription\n-----------\n\nGiven a JSON document, returns the scalar specified by the path. Returns NULL\nif not given a valid JSON document, or if there is no match.\n\nExamples\n--------\n\nselect json_value(\'{\"key1\":123}\', \'$.key1\');\n+--------------------------------------+\n| json_value(\'{\"key1\":123}\', \'$.key1\') |\n+--------------------------------------+\n| 123 |\n+--------------------------------------+\n\nselect json_value(\'{\"key1\": [1,2,3], \"key1\":123}\', \'$.key1\');\n+-------------------------------------------------------+\n| json_value(\'{\"key1\": [1,2,3], \"key1\":123}\', \'$.key1\') |\n+-------------------------------------------------------+\n| 123 |\n+-------------------------------------------------------+\n\nIn the SET statement below, two escape characters are needed, as a single\nescape character would be applied by the SQL parser in the SET statement, and\nthe escaped character would not form part of the saved value.\n\nSET @json = \'{\"key1\":\"60\\\\\" Table\", \"key2\":\"1\"}\';\n\nSELECT JSON_VALUE(@json,\'$.key1\') AS Name , json_value(@json,\'$.key2\') as ID;\n+-----------+------+\n| Name | ID |\n+-----------+------+\n| 60\" Table | 1 |\n+-----------+------+\n\nURL: https://mariadb.com/kb/en/json_value/','','https://mariadb.com/kb/en/json_value/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (777,41,'Window Functions Overview','Introduction\n------------\n\nWindow functions allow calculations to be performed across a set of rows\nrelated to the current row.\n\nSyntax\n------\n\nfunction (expression) OVER (\n [ PARTITION BY expression_list ]\n [ ORDER BY order_list [ frame_clause ] ] )\n\nfunction:\n A valid window function\n\nexpression_list:\n expression | column_name [, expr_list ]\n\norder_list:\n expression | column_name [ ASC | DESC ]\n [, ... ]\n\nframe_clause:\n {ROWS | RANGE} {frame_border | BETWEEN frame_border AND frame_border}\n\nframe_border:\n | UNBOUNDED PRECEDING\n | UNBOUNDED FOLLOWING\n | CURRENT ROW\n | expr PRECEDING\n | expr FOLLOWING\n\nDescription\n-----------\n\nIn some ways, window functions are similar to aggregate functions in that they\nperform calculations across a set of rows. However, unlike aggregate\nfunctions, the output is not grouped into a single row.\n\nNon-aggregate window functions include\n\n* CUME_DIST\n* DENSE_RANK\n* FIRST_VALUE\n* LAG\n* LAST_VALUE\n* LEAD\n* MEDIAN\n* NTH_VALUE\n* NTILE\n* PERCENT_RANK\n* PERCENTILE_CONT\n* PERCENTILE_DISC\n* RANK, ROW_NUMBER\n\nAggregate functions that can also be used as window functions include\n\n* AVG\n* BIT_AND\n* BIT_OR\n* BIT_XOR\n* COUNT\n* MAX\n* MIN\n* STD\n* STDDEV\n* STDDEV_POP\n* STDDEV_SAMP\n* SUM\n* VAR_POP\n* VAR_SAMP\n* VARIANCE\n\nWindow function queries are characterised by the OVER keyword, following which\nthe set of rows used for the calculation is specified. By default, the set of\nrows used for the calculation (the \"window) is the entire dataset, which can\nbe ordered with the ORDER BY clause. The PARTITION BY clause is used to reduce\nthe window to a particular group within the dataset.\n\nFor example, given the following data:\n\nCREATE TABLE student (name CHAR(10), test CHAR(10), score TINYINT);\n\nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n\nthe following two queries return the average partitioned by test and by name\nrespectively:\n\nSELECT name, test, score, AVG(score) OVER (PARTITION BY test) \n AS average_by_test FROM student;\n+---------+--------+-------+-----------------+\n| name | test | score | average_by_test |\n+---------+--------+-------+-----------------+\n| Chun | SQL | 75 | 65.2500 |\n| Chun | Tuning | 73 | 68.7500 |\n| Esben | SQL | 43 | 65.2500 |\n| Esben | Tuning | 31 | 68.7500 |\n| Kaolin | SQL | 56 | 65.2500 |\n| Kaolin | Tuning | 88 | 68.7500 |\n| Tatiana | SQL | 87 | 65.2500 |\n| Tatiana | Tuning | 83 | 68.7500 |\n+---------+--------+-------+-----------------+\n\nSELECT name, test, score, AVG(score) OVER (PARTITION BY name) \n AS average_by_name FROM student;\n+---------+--------+-------+-----------------+\n| name | test | score | average_by_name |\n+---------+--------+-------+-----------------+\n| Chun | SQL | 75 | 74.0000 |\n| Chun | Tuning | 73 | 74.0000 |\n| Esben | SQL | 43 | 37.0000 |\n| Esben | Tuning | 31 | 37.0000 |\n| Kaolin | SQL | 56 | 72.0000 |\n| Kaolin | Tuning | 88 | 72.0000 |\n| Tatiana | SQL | 87 | 85.0000 |\n| Tatiana | Tuning | 83 | 85.0000 |\n+---------+--------+-------+-----------------+\n\nIt is also possible to specify which rows to include for the window function\n(for example, the current row and all preceding rows). See Window Frames for\nmore details.\n\nScope\n-----\n\nWindow functions were introduced in SQL:2003, and their definition was\nexpanded in subsequent versions of the standard. The last expansion was in the\nlatest version of the standard, SQL:2011.\n\nMost database products support a subset of the standard, they implement some\nfunctions defined as late as in SQL:2011, and at the same time leave some\nparts of SQL:2008 unimplemented.\n\nMariaDB:\n\n* Supports ROWS and RANGE-type frames\nAll kinds of frame bounds are supported, including RANGE PRECEDING|FOLLOWING n\nframe bounds (unlike PostgreSQL or MS SQL Server)\nDoes not yet support DATE[TIME] datatype and arithmetic for RANGE-type frames\n(MDEV-9727)\n\n* Does not support GROUPS-type frames (it seems that no popular database\nsupports it, either)\n\n* Does not support frame exclusion (no other database seems to support it,\neither) (MDEV-9724)\n* Does not support explicit NULLS FIRST or NULLS LAST.\n* Does not support nested navigation in window functions (this is\nVALUE_OF(expr AT row_marker [, default_value) syntax)\n\n* The following window functions are supported:\n\"Streamable\" window functions: ROW_NUMBER, RANK, DENSE_RANK, \nWindow functions that can be streamed once the number of rows in partition is\nknown: PERCENT_RANK, CUME_DIST, NTILE\n\n* Aggregate functions that are currently supported as window functions are:\nCOUNT, SUM, AVG, BIT_OR, BIT_AND, BIT_XOR.\n* Aggregate functions with the DISTINCT specifier (e.g. COUNT( DISTINCT x))\nare not supported as window functions.\n\nLinks\n-----\n\n* MDEV-6115 is the main jira task for window functions development. Other\ntasks are are attached as sub-tasks\n* bb-10.2-mdev9543 is the feature tree for window functions. Development is\nongoing, and this tree has the newest changes.\n* Testcases are in mysql-test/t/win*.test\n\nExamples\n--------\n\nGiven the following sample data:\n\nCREATE TABLE users (\n email VARCHAR(30),\n first_name VARCHAR(30),\n last_name VARCHAR(30),\n account_type VARCHAR(30)\n);\n\nINSERT INTO users VALUES \n (\'admin@boss.org\', \'Admin\', \'Boss\', \'admin\'),\n (\'bob.carlsen@foo.bar\', \'Bob\', \'Carlsen\', \'regular\'),\n (\'eddie.stevens@data.org\', \'Eddie\', \'Stevens\', \'regular\'),\n (\'john.smith@xyz.org\', \'John\', \'Smith\', \'regular\'),\n (\'root@boss.org\', \'Root\', \'Chief\', \'admin\')\n\nFirst, let\'s order the records by email alphabetically, giving each an\nascending rnum value starting with 1. This will make use of the ROW_NUMBER\nwindow function:\n\nSELECT row_number() OVER (ORDER BY email) AS rnum,\n email, first_name, last_name, account_type\nFROM users ORDER BY email;\n+------+------------------------+------------+-----------+--------------+\n| rnum | email | first_name | last_name | account_type |\n+------+------------------------+------------+-----------+--------------+\n| 1 | admin@boss.org | Admin | Boss | admin |\n| 2 | bob.carlsen@foo.bar | Bob | Carlsen | regular |\n| 3 | eddie.stevens@data.org | Eddie | Stevens | regular |\n| 4 | john.smith@xyz.org | John | Smith | regular |\n| 5 | root@boss.org | Root | Chief | admin |\n+------+------------------------+------------+-----------+--------------\n\nWe can generate separate sequences based on account type, using the PARTITION\nBY clause:\n\nSELECT row_number() OVER (PARTITION BY account_type ORDER BY email) AS rnum, \n email, first_name, last_name, account_type\nFROM users ORDER BY account_type,email;\n+------+------------------------+------------+-----------+--------------+\n| rnum | email | first_name | last_name | account_type |\n+------+------------------------+------------+-----------+--------------+\n| 1 | admin@boss.org | Admin | Boss | admin |\n| 2 | root@boss.org | Root | Chief | admin |\n| 1 | bob.carlsen@foo.bar | Bob | Carlsen | regular |\n| 2 | eddie.stevens@data.org | Eddie | Stevens | regular |\n| 3 | john.smith@xyz.org | John | Smith | regular |\n+------+------------------------+------------+-----------+--------------+\n\nGiven the following structure and data, we want to find the top 5 salaries\nfrom each department.\n\nCREATE TABLE employee_salaries (dept VARCHAR(20), name VARCHAR(20), salary\nINT(11));\n\nINSERT INTO employee_salaries VALUES\n(\'Engineering\', \'Dharma\', 3500),\n(\'Engineering\', \'Binh\', 3000),\n(\'Engineering\', \'Adalynn\', 2800),\n(\'Engineering\', \'Samuel\', 2500),\n(\'Engineering\', \'Cveta\', 2200),\n(\'Engineering\', \'Ebele\', 1800),\n(\'Sales\', \'Carbry\', 500),\n(\'Sales\', \'Clytemnestra\', 400),\n(\'Sales\', \'Juraj\', 300),\n(\'Sales\', \'Kalpana\', 300),\n(\'Sales\', \'Svantepolk\', 250),\n(\'Sales\', \'Angelo\', 200);\n\nWe could do this without using window functions, as follows:\n\nselect dept, name, salary\nfrom employee_salaries as t1\nwhere (select count(t2.salary)\n from employee_salaries as t2\n where t1.name != t2.name and\n t1.dept = t2.dept and\n t2.salary > t1.salary) < 5\norder by dept, salary desc;\n\n+-------------+--------------+--------+\n| dept | name | salary |\n+-------------+--------------+--------+\n| Engineering | Dharma | 3500 |\n| Engineering | Binh | 3000 |\n| Engineering | Adalynn | 2800 |\n| Engineering | Samuel | 2500 |\n| Engineering | Cveta | 2200 |\n| Sales | Carbry | 500 |\n| Sales | Clytemnestra | 400 |\n| Sales | Juraj | 300 |\n| Sales | Kalpana | 300 |\n| Sales | Svantepolk | 250 |\n+-------------+--------------+--------+\n\nThis has a number of disadvantages:\n\n* if there is no index, the query could take a long time if the\nemployee_salary_table is large\n* Adding and maintaining indexes adds overhead, and even with indexes on dept\nand salary, each subquery execution adds overhead by performing a lookup\nthrough the index.\n\nLet\'s try achieve the same with window functions. First, generate a rank for\nall employees, using the RANK function.\n\nselect rank() over (partition by dept order by salary desc) as ranking,\n dept, name, salary\n from employee_salaries\n order by dept, ranking;\n+---------+-------------+--------------+--------+\n| ranking | dept | name | salary |\n+---------+-------------+--------------+--------+\n| 1 | Engineering | Dharma | 3500 |\n| 2 | Engineering | Binh | 3000 |\n| 3 | Engineering | Adalynn | 2800 |\n| 4 | Engineering | Samuel | 2500 |\n| 5 | Engineering | Cveta | 2200 |\n| 6 | Engineering | Ebele | 1800 |\n| 1 | Sales | Carbry | 500 |\n| 2 | Sales | Clytemnestra | 400 |\n| 3 | Sales | Juraj | 300 |\n| 3 | Sales | Kalpana | 300 |\n| 5 | Sales | Svantepolk | 250 |\n| 6 | Sales | Angelo | 200 |\n+---------+-------------+--------------+--------+\n\nEach department has a separate sequence of ranks due to the PARTITION BY\nclause. This particular sequence of values for rank() is given by the ORDER BY\nclause inside the window function’s OVER clause. Finally, to get our results\nin a readable format we order the data by dept and the newly generated ranking\ncolumn.\n\nNow, we need to reduce the results to find only the top 5 per department. Here\nis a common mistake:\n\nselect\nrank() over (partition by dept order by salary desc) as ranking,\ndept, name, salary\nfrom employee_salaries\nwhere ranking <= 5\norder by dept, ranking;\n\nERROR 1054 (42S22): Unknown column \'ranking\' in \'where clause\'\n\nTrying to filter only the first 5 values per department by putting a where\nclause in the statement does not work, due to the way window functions are\ncomputed. The computation of window functions happens after all WHERE, GROUP\nBY and HAVING clauses have been completed, right before ORDER BY, so the WHERE\nclause has no idea that the ranking column exists. It is only present after we\nhave filtered and grouped all the rows.\n\nTo counteract this problem, we need to wrap our query into a derived table. We\ncan then attach a where clause to it:\n\nselect *from (select rank() over (partition by dept order by salary desc) as\nranking,\n dept, name, salary\nfrom employee_salaries) as salary_ranks\nwhere (salary_ranks.ranking <= 5)\n order by dept, ranking;\n+---------+-------------+--------------+--------+\n| ranking | dept | name | salary |\n+---------+-------------+--------------+--------+\n| 1 | Engineering | Dharma | 3500 |\n| 2 | Engineering | Binh | 3000 |\n| 3 | Engineering | Adalynn | 2800 |\n| 4 | Engineering | Samuel | 2500 |\n| 5 | Engineering | Cveta | 2200 |\n| 1 | Sales | Carbry | 500 |\n| 2 | Sales | Clytemnestra | 400 |\n| 3 | Sales | Juraj | 300 |\n| 3 | Sales | Kalpana | 300 |\n| 5 | Sales | Svantepolk | 250 |\n+---------+-------------+--------------+--------+\n\nURL: https://mariadb.com/kb/en/window-functions-overview/','','https://mariadb.com/kb/en/window-functions-overview/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (778,41,'CUME_DIST','Syntax\n------\n\nCUME_DIST() OVER ( \n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nCUME_DIST() is a window function that returns the cumulative distribution of a\ngiven row. The following formula is used to calculate the value:\n\n(number of rows <= current row) / (total rows)\n\nExamples\n--------\n\ncreate table t1 (\n pk int primary key,\n a int,\n b int\n);\n\ninsert into t1 values\n( 1 , 0, 10),\n( 2 , 0, 10),\n( 3 , 1, 10),\n( 4 , 1, 10),\n( 8 , 2, 10),\n( 5 , 2, 20),\n( 6 , 2, 20),\n( 7 , 2, 20),\n( 9 , 4, 20),\n(10 , 4, 20);\n\nselect pk, a, b,\n rank() over (order by a) as rank,\n percent_rank() over (order by a) as pct_rank,\n cume_dist() over (order by a) as cume_dist\nfrom t1;\n+----+------+------+------+--------------+--------------+\n| pk | a | b | rank | pct_rank | cume_dist |\n+----+------+------+------+--------------+--------------+\n| 1 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 2 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 3 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 4 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 5 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 6 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 7 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 8 | 2 | 10 | 5 | 0.4444444444 | 0.8000000000 |\n| 9 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n| 10 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n+----+------+------+------+--------------+--------------+\n\nselect pk, a, b,\n percent_rank() over (order by pk) as pct_rank,\n cume_dist() over (order by pk) as cume_dist\nfrom t1 order by pk;\n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 0.1000000000 |\n| 2 | 0 | 10 | 0.1111111111 | 0.2000000000 |\n| 3 | 1 | 10 | 0.2222222222 | 0.3000000000 |\n| 4 | 1 | 10 | 0.3333333333 | 0.4000000000 |\n| 5 | 2 | 20 | 0.4444444444 | 0.5000000000 |\n| 6 | 2 | 20 | 0.5555555556 | 0.6000000000 |\n| 7 | 2 | 20 | 0.6666666667 | 0.7000000000 |\n| 8 | 2 | 10 | 0.7777777778 | 0.8000000000 |\n| 9 | 4 | 20 | 0.8888888889 | 0.9000000000 |\n| 10 | 4 | 20 | 1.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n\nselect pk, a, b,\n percent_rank() over (partition by a order by a) as pct_rank,\n cume_dist() over (partition by a order by a) as cume_dist\nfrom t1;\n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 2 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 3 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 4 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 5 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 6 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 7 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 8 | 2 | 10 | 0.0000000000 | 1.0000000000 |\n| 9 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n| 10 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n\nURL: https://mariadb.com/kb/en/cume_dist/','','https://mariadb.com/kb/en/cume_dist/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (779,41,'DENSE_RANK','Syntax\n------\n\nDENSE_RANK() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nDENSE_RANK() is a window function that displays the number of a given row,\nstarting at one and following the ORDER BY sequence of the window function,\nwith identical values receiving the same result. Unlike the RANK() function,\nthere are no skipped values if the preceding results are identical. It is also\nsimilar to the ROW_NUMBER() function except that in that function, identical\nvalues will receive a different row number for each result.\n\nExamples\n--------\n\nThe distinction between DENSE_RANK(), RANK() and ROW_NUMBER():\n\nCREATE TABLE student(course VARCHAR(10), mark int, name varchar(10));\n\nINSERT INTO student VALUES \n (\'Maths\', 60, \'Thulile\'),\n (\'Maths\', 60, \'Pritha\'),\n (\'Maths\', 70, \'Voitto\'),\n (\'Maths\', 55, \'Chun\'),\n (\'Biology\', 60, \'Bilal\'),\n (\'Biology\', 70, \'Roger\');\n\nSELECT \n RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS rank,\n DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS dense_rank,\n ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC) AS row_num,\n course, mark, name\nFROM student ORDER BY course, mark DESC;\n+------+------------+---------+---------+------+---------+\n| rank | dense_rank | row_num | course | mark | name |\n+------+------------+---------+---------+------+---------+\n| 1 | 1 | 1 | Biology | 70 | Roger |\n| 2 | 2 | 2 | Biology | 60 | Bilal |\n| 1 | 1 | 1 | Maths | 70 | Voitto |\n| 2 | 2 | 2 | Maths | 60 | Thulile |\n| 2 | 2 | 3 | Maths | 60 | Pritha |\n| 4 | 3 | 4 | Maths | 55 | Chun |\n+------+------------+---------+---------+------+---------+\n\nURL: https://mariadb.com/kb/en/dense_rank/','','https://mariadb.com/kb/en/dense_rank/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (780,41,'FIRST_VALUE','Syntax\n------\n\nFIRST_VALUE(expr) OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nFIRST_VALUE returns the first result from an ordered set, or NULL if no such\nresult exists.\n\nExamples\n--------\n\nCREATE TABLE t1 (\n pk int primary key,\n a int,\n b int,\n c char(10),\n d decimal(10, 3),\n e real\n);\n\nINSERT INTO t1 VALUES\n( 1, 0, 1, \'one\', 0.1, 0.001),\n( 2, 0, 2, \'two\', 0.2, 0.002),\n( 3, 0, 3, \'three\', 0.3, 0.003),\n( 4, 1, 2, \'three\', 0.4, 0.004),\n( 5, 1, 1, \'two\', 0.5, 0.005),\n( 6, 1, 1, \'one\', 0.6, 0.006),\n( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n( 8, 2, 1, \'n_two\', NULL, 0.008),\n( 9, 2, 2, NULL, 0.7, 0.009),\n(10, 2, 0, \'n_four\', 0.8, 0.010),\n(11, 2, 10, NULL, 0.9, NULL);\n\nSELECT pk, FIRST_VALUE(pk) OVER (ORDER BY pk) AS first_asc,\n LAST_VALUE(pk) OVER (ORDER BY pk) AS last_asc,\n FIRST_VALUE(pk) OVER (ORDER BY pk DESC) AS first_desc,\n LAST_VALUE(pk) OVER (ORDER BY pk DESC) AS last_desc\nFROM t1\nORDER BY pk DESC;\n\n+----+-----------+----------+------------+-----------+\n| pk | first_asc | last_asc | first_desc | last_desc |\n+----+-----------+----------+------------+-----------+\n| 11 | 1 | 11 | 11 | 11 |\n| 10 | 1 | 10 | 11 | 10 |\n| 9 | 1 | 9 | 11 | 9 |\n| 8 | 1 | 8 | 11 | 8 |\n| 7 | 1 | 7 | 11 | 7 |\n| 6 | 1 | 6 | 11 | 6 |\n| 5 | 1 | 5 | 11 | 5 |\n| 4 | 1 | 4 | 11 | 4 |\n| 3 | 1 | 3 | 11 | 3 |\n| 2 | 1 | 2 | 11 | 2 |\n| 1 | 1 | 1 | 11 | 1 |\n+----+-----------+----------+------------+-----------+\n\nCREATE OR REPLACE TABLE t1 (i int);\nINSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);\n\nSELECT i,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and 1 FOLLOWING) AS\nf_1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and 1 FOLLOWING) AS\nl_1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\nf_1p1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\nf_1p1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) AS\nf_2p1p,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) AS\nf_2p1p,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING) AS\nf_1f2f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING) AS\nf_1f2f\nFROM t1;\n\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| i | f_1f | l_1f | f_1p1f | f_1p1f | f_2p1p | f_2p1p | f_1f2f | f_1f2f |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| 1 | 1 | 2 | 1 | 2 | NULL | NULL | 2 | 3 |\n| 2 | 2 | 3 | 1 | 3 | 1 | 1 | 3 | 4 |\n| 3 | 3 | 4 | 2 | 4 | 1 | 2 | 4 | 5 |\n| 4 | 4 | 5 | 3 | 5 | 2 | 3 | 5 | 6 |\n| 5 | 5 | 6 | 4 | 6 | 3 | 4 | 6 | 7 |\n| 6 | 6 | 7 | 5 | 7 | 4 | 5 | 7 | 8 |\n| 7 | 7 | 8 | 6 | 8 | 5 | 6 | 8 | 9 |\n| 8 | 8 | 9 | 7 | 9 | 6 | 7 | 9 | 10 |\n| 9 | 9 | 10 | 8 | 10 | 7 | 8 | 10 | 10 |\n| 10 | 10 | 10 | 9 | 10 | 8 | 9 | NULL | NULL |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n\nURL: https://mariadb.com/kb/en/first_value/','','https://mariadb.com/kb/en/first_value/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (781,41,'LAG','Syntax\n------\n\nLAG (expr[, offset]) OVER ( \n [ PARTITION BY partition_expression ]\n < ORDER BY order_list >\n)\n\nDescription\n-----------\n\nThe LAG function accesses data from a previous row according to the ORDER BY\nclause without the need for a self-join. The specific row is determined by the\noffset (default 1), which specifies the number of rows behind the current row\nto use. An offset of 0 is the current row.\n\nExamples\n--------\n\nCREATE TABLE t1 (pk int primary key, a int, b int, c char(10), d decimal(10,\n3), e real);\n\nINSERT INTO t1 VALUES\n ( 1, 0, 1, \'one\', 0.1, 0.001),\n ( 2, 0, 2, \'two\', 0.2, 0.002),\n ( 3, 0, 3, \'three\', 0.3, 0.003),\n ( 4, 1, 2, \'three\', 0.4, 0.004),\n ( 5, 1, 1, \'two\', 0.5, 0.005),\n ( 6, 1, 1, \'one\', 0.6, 0.006),\n ( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n ( 8, 2, 1, \'n_two\', NULL, 0.008),\n ( 9, 2, 2, NULL, 0.7, 0.009),\n (10, 2, 0, \'n_four\', 0.8, 0.010),\n (11, 2, 10, NULL, 0.9, NULL);\n\nSELECT pk, LAG(pk) OVER (ORDER BY pk) AS l,\n LAG(pk,1) OVER (ORDER BY pk) AS l1,\n LAG(pk,2) OVER (ORDER BY pk) AS l2,\n LAG(pk,0) OVER (ORDER BY pk) AS l0,\n LAG(pk,-1) OVER (ORDER BY pk) AS lm1,\n LAG(pk,-2) OVER (ORDER BY pk) AS lm2\nFROM t1;\n+----+------+------+------+------+------+------+\n| pk | l | l1 | l2 | l0 | lm1 | lm2 |\n+----+------+------+------+------+------+------+\n| 1 | NULL | NULL | NULL | 1 | 2 | 3 |\n| 2 | 1 | 1 | NULL | 2 | 3 | 4 |\n| 3 | 2 | 2 | 1 | 3 | 4 | 5 |\n| 4 | 3 | 3 | 2 | 4 | 5 | 6 |\n| 5 | 4 | 4 | 3 | 5 | 6 | 7 |\n| 6 | 5 | 5 | 4 | 6 | 7 | 8 |\n| 7 | 6 | 6 | 5 | 7 | 8 | 9 |\n| 8 | 7 | 7 | 6 | 8 | 9 | 10 |\n| 9 | 8 | 8 | 7 | 9 | 10 | 11 |\n| 10 | 9 | 9 | 8 | 10 | 11 | NULL |\n| 11 | 10 | 10 | 9 | 11 | NULL | NULL |\n+----+------+------+------+------+------+------+\n\nURL: https://mariadb.com/kb/en/lag/','','https://mariadb.com/kb/en/lag/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (782,41,'LEAD','Syntax\n------\n\nLEAD (expr[, offset]) OVER ( \n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nThe LEAD function accesses data from a following row in the same result set\nwithout the need for a self-join. The specific row is determined by the offset\n(default 1), which specifies the number of rows ahead the current row to use.\nAn offset of 0 is the current row.\n\nExample\n-------\n\nCREATE TABLE t1 (pk int primary key, a int, b int, c char(10), d decimal(10,\n3), e real);\n\nINSERT INTO t1 VALUES\n ( 1, 0, 1, \'one\', 0.1, 0.001),\n ( 2, 0, 2, \'two\', 0.2, 0.002),\n ( 3, 0, 3, \'three\', 0.3, 0.003),\n ( 4, 1, 2, \'three\', 0.4, 0.004),\n ( 5, 1, 1, \'two\', 0.5, 0.005),\n ( 6, 1, 1, \'one\', 0.6, 0.006),\n ( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n ( 8, 2, 1, \'n_two\', NULL, 0.008),\n ( 9, 2, 2, NULL, 0.7, 0.009),\n (10, 2, 0, \'n_four\', 0.8, 0.010),\n (11, 2, 10, NULL, 0.9, NULL);\n\nSELECT pk, LEAD(pk) OVER (ORDER BY pk) AS l,\n LEAD(pk,1) OVER (ORDER BY pk) AS l1,\n LEAD(pk,2) OVER (ORDER BY pk) AS l2,\n LEAD(pk,0) OVER (ORDER BY pk) AS l0,\n LEAD(pk,-1) OVER (ORDER BY pk) AS lm1,\n LEAD(pk,-2) OVER (ORDER BY pk) AS lm2\nFROM t1;\n+----+------+------+------+------+------+------+\n| pk | l | l1 | l2 | l0 | lm1 | lm2 |\n+----+------+------+------+------+------+------+\n| 1 | 2 | 2 | 3 | 1 | NULL | NULL |\n| 2 | 3 | 3 | 4 | 2 | 1 | NULL |\n| 3 | 4 | 4 | 5 | 3 | 2 | 1 |\n| 4 | 5 | 5 | 6 | 4 | 3 | 2 |\n| 5 | 6 | 6 | 7 | 5 | 4 | 3 |\n| 6 | 7 | 7 | 8 | 6 | 5 | 4 |\n| 7 | 8 | 8 | 9 | 7 | 6 | 5 |\n| 8 | 9 | 9 | 10 | 8 | 7 | 6 |\n| 9 | 10 | 10 | 11 | 9 | 8 | 7 |\n| 10 | 11 | 11 | NULL | 10 | 9 | 8 |\n| 11 | NULL | NULL | NULL | 11 | 10 | 9 |\n+----+------+------+------+------+------+------+\n\nURL: https://mariadb.com/kb/en/lead/','','https://mariadb.com/kb/en/lead/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (783,41,'Median Window Function','MariaDB starting with 10.3.3\n----------------------------\nThe MEDIAN() window function was first introduced with in MariaDB 10.3.3.\n\nSyntax\n------\n\nMEDIAN(median expression) OVER (\n [ PARTITION BY partition_expression ]\n)\n\nDescription\n-----------\n\nMEDIAN() is a window function that returns the median value of a range of\nvalues.\n\nIt is a specific case of PERCENTILE_CONT, with an argument of 0.5 and the\nORDER BY column the one in MEDIAN\'s argument.\n\nMEDIAN(<median-arg>) OVER ( [ PARTITION BY partition_expression] )\n\nIs equivalent to:\n\nPERCENTILE_CONT(0.5) WITHIN \n GROUP (ORDER BY <median-arg>) OVER ( [ PARTITION BY partition_expression ])\n\nExamples\n--------\n\nCREATE TABLE book_rating (name CHAR(30), star_rating TINYINT);\n\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 5);\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 3);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 1);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 2);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 5);\n\nSELECT name, median(star_rating) OVER (PARTITION BY name) FROM book_rating;\n+-----------------------+----------------------------------------------+\n| name | median(star_rating) OVER (PARTITION BY name) |\n+-----------------------+----------------------------------------------+\n| Lord of the Ladybirds | 4.0000000000 |\n| Lord of the Ladybirds | 4.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n+-----------------------+----------------------------------------------+\n\nURL: https://mariadb.com/kb/en/median/','','https://mariadb.com/kb/en/median/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (784,41,'NTH_VALUE','Syntax\n------\n\nNTH_VALUE (expr[, num_row]) OVER ( \n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nThe NTH_VALUE function returns the value evaluated at row number num_row of\nthe window frame, starting from 1, or NULL if the row does not exist.\n\nURL: https://mariadb.com/kb/en/nth_value/','','https://mariadb.com/kb/en/nth_value/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (785,41,'NTILE','Syntax\n------\n\nNTILE (expr) OVER ( \n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nNTILE() is a window function that returns an integer indicating which group a\ngiven row falls into. The number of groups is specified in the argument\n(expr), starting at one. Ordered rows in the partition are divided into the\nspecified number of groups with as equal a size as possible.\n\nExamples\n--------\n\ncreate table t1 (\n pk int primary key,\n a int,\n b int\n );\n\ninsert into t1 values\n (11 , 0, 10),\n (12 , 0, 10),\n (13 , 1, 10),\n (14 , 1, 10),\n (18 , 2, 10),\n (15 , 2, 20),\n (16 , 2, 20),\n (17 , 2, 20),\n (19 , 4, 20),\n (20 , 4, 20);\n\nselect pk, a, b,\n ntile(1) over (order by pk)\n from t1;\n+----+------+------+-----------------------------+\n| pk | a | b | ntile(1) over (order by pk) |\n+----+------+------+-----------------------------+\n| 11 | 0 | 10 | 1 |\n| 12 | 0 | 10 | 1 |\n| 13 | 1 | 10 | 1 |\n| 14 | 1 | 10 | 1 |\n| 15 | 2 | 20 | 1 |\n| 16 | 2 | 20 | 1 |\n| 17 | 2 | 20 | 1 |\n| 18 | 2 | 10 | 1 |\n| 19 | 4 | 20 | 1 |\n| 20 | 4 | 20 | 1 |\n+----+------+------+-----------------------------+\n\nselect pk, a, b,\n ntile(4) over (order by pk)\n from t1;\n+----+------+------+-----------------------------+\n| pk | a | b | ntile(4) over (order by pk) |\n+----+------+------+-----------------------------+\n| 11 | 0 | 10 | 1 |\n| 12 | 0 | 10 | 1 |\n| 13 | 1 | 10 | 1 |\n| 14 | 1 | 10 | 2 |\n| 15 | 2 | 20 | 2 |\n| 16 | 2 | 20 | 2 |\n| 17 | 2 | 20 | 3 |\n| 18 | 2 | 10 | 3 |\n| 19 | 4 | 20 | 4 |\n| 20 | 4 | 20 | 4 |\n+----+------+------+-----------------------------+\n\nURL: https://mariadb.com/kb/en/ntile/','','https://mariadb.com/kb/en/ntile/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (786,41,'PERCENT_RANK','Syntax\n------\n\nPERCENT_RANK() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nPERCENT_RANK() is a window function that returns the relative percent rank of\na given row. The following formula is used to calculate the percent rank:\n\n(rank - 1) / (number of rows in the window or partition - 1)\n\nExamples\n--------\n\ncreate table t1 (\n pk int primary key,\n a int,\n b int\n);\n\ninsert into t1 values\n( 1 , 0, 10),\n( 2 , 0, 10),\n( 3 , 1, 10),\n( 4 , 1, 10),\n( 8 , 2, 10),\n( 5 , 2, 20),\n( 6 , 2, 20),\n( 7 , 2, 20),\n( 9 , 4, 20),\n(10 , 4, 20);\n\nselect pk, a, b,\n rank() over (order by a) as rank,\n percent_rank() over (order by a) as pct_rank,\n cume_dist() over (order by a) as cume_dist\nfrom t1;\n+----+------+------+------+--------------+--------------+\n| pk | a | b | rank | pct_rank | cume_dist |\n+----+------+------+------+--------------+--------------+\n| 1 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 2 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 3 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 4 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 5 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 6 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 7 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 8 | 2 | 10 | 5 | 0.4444444444 | 0.8000000000 |\n| 9 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n| 10 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n+----+------+------+------+--------------+--------------+\n\nselect pk, a, b,\n percent_rank() over (order by pk) as pct_rank,\n cume_dist() over (order by pk) as cume_dist\nfrom t1 order by pk;\n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 0.1000000000 |\n| 2 | 0 | 10 | 0.1111111111 | 0.2000000000 |\n| 3 | 1 | 10 | 0.2222222222 | 0.3000000000 |\n| 4 | 1 | 10 | 0.3333333333 | 0.4000000000 |\n| 5 | 2 | 20 | 0.4444444444 | 0.5000000000 |\n| 6 | 2 | 20 | 0.5555555556 | 0.6000000000 |\n| 7 | 2 | 20 | 0.6666666667 | 0.7000000000 |\n| 8 | 2 | 10 | 0.7777777778 | 0.8000000000 |\n| 9 | 4 | 20 | 0.8888888889 | 0.9000000000 |\n| 10 | 4 | 20 | 1.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n\nselect pk, a, b,\n percent_rank() over (partition by a order by a) as pct_rank,\n cume_dist() over (partition by a order by a) as cume_dist\nfrom t1;\n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 2 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 3 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 4 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 5 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 6 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 7 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 8 | 2 | 10 | 0.0000000000 | 1.0000000000 |\n| 9 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n| 10 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n\nURL: https://mariadb.com/kb/en/percent_rank/','','https://mariadb.com/kb/en/percent_rank/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (787,41,'PERCENTILE_CONT','MariaDB starting with 10.3.3\n----------------------------\nThe PERCENTILE_CONT() window function was first introduced with in MariaDB\n10.3.3.\n\nSyntax\n------\n\nDescription\n-----------\n\nPERCENTILE_CONT() (standing for continuous percentile) is a window function\nwhich returns a value which corresponds to the given fraction in the sort\norder. If required, it will interpolate between adjacent input items.\n\nEssentially, the following process is followed to find the value to return:\n\n* Get the number of rows in the partition, denoted by N\n* RN = p*(N-1), where p denotes the argument to the PERCENTILE_CONT function\n* calculate the FRN(floor row number) and CRN(column row number for the group(\nFRN= floor(RN) and CRN = ceil(RN))\n* look up rows FRN and CRN\n* If (CRN = FRN = RN) then the result is (value of expression from row at RN)\n* Otherwise the result is\n* (CRN - RN) * (value of expression for row at FRN) +\n* (RN - FRN) * (value of expression for row at CRN)\n\nThe MEDIAN function is a specific case of PERCENTILE_CONT, equivalent to\nPERCENTILE_CONT(0.5).\n\nExamples\n--------\n\nCREATE TABLE book_rating (name CHAR(30), star_rating TINYINT);\n\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 5);\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 3);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 1);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 2);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 5);\n\nSELECT name, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc\n FROM book_rating;\n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 4.0000000000 |\n| Lord of the Ladybirds | 4.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n+-----------------------+--------------+\n\nSELECT name, PERCENTILE_CONT(1) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc\n FROM book_rating;\n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 5.0000000000 |\n| Lord of the Ladybirds | 5.0000000000 |\n| Lady of the Flies | 5.0000000000 |\n| Lady of the Flies | 5.0000000000 |\n| Lady of the Flies | 5.0000000000 |\n+-----------------------+--------------+\n\nSELECT name, PERCENTILE_CONT(0) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc\n FROM book_rating;\n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 3.0000000000 |\n| Lord of the Ladybirds | 3.0000000000 |\n| Lady of the Flies | 1.0000000000 |\n| Lady of the Flies | 1.0000000000 |\n| Lady of the Flies | 1.0000000000 |\n+-----------------------+--------------+\n\nSELECT name, PERCENTILE_CONT(0.6) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc\n FROM book_rating;\n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 4.2000000000 |\n| Lord of the Ladybirds | 4.2000000000 |\n| Lady of the Flies | 2.6000000000 |\n| Lady of the Flies | 2.6000000000 |\n| Lady of the Flies | 2.6000000000 |\n+-----------------------+--------------+\n\nURL: https://mariadb.com/kb/en/percentile_cont/','','https://mariadb.com/kb/en/percentile_cont/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (788,41,'PERCENTILE_DISC','MariaDB starting with 10.3.3\n----------------------------\nThe PERCENTILE_DISC() window function was first introduced with in MariaDB\n10.3.3.\n\nSyntax\n------\n\nDescription\n-----------\n\nPERCENTILE_DISC() (standing for discrete percentile) is a window function\nwhich returns the first value in the set whose ordered position is the same or\nmore than the specified fraction.\n\nEssentially, the following process is followed to find the value to return:\n\n* Get the number of rows in the partition.\n* Walk through the partition, in order, until finding the the first row with\nCUME_DIST() >= function_argument.\n\nExamples\n--------\n\nCREATE TABLE book_rating (name CHAR(30), star_rating TINYINT);\n\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 5);\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\', 3);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 1);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 2);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 5);\n\nSELECT name, PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY star_rating)\n OVER (PARTITION BY name) AS pc FROM book_rating;\n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 3 |\n| Lord of the Ladybirds | 3 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n+-----------------------+------+\n5 rows in set (0.000 sec)\n\nSELECT name, PERCENTILE_DISC(0) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc FROM book_rating;\n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 3 |\n| Lord of the Ladybirds | 3 |\n| Lady of the Flies | 1 |\n| Lady of the Flies | 1 |\n| Lady of the Flies | 1 |\n+-----------------------+------+\n5 rows in set (0.000 sec)\n\nSELECT name, PERCENTILE_DISC(1) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc FROM book_rating;\n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 5 |\n| Lord of the Ladybirds | 5 |\n| Lady of the Flies | 5 |\n| Lady of the Flies | 5 |\n| Lady of the Flies | 5 |\n+-----------------------+------+\n5 rows in set (0.000 sec)\n\nSELECT name, PERCENTILE_DISC(0.6) WITHIN GROUP (ORDER BY star_rating) \n OVER (PARTITION BY name) AS pc FROM book_rating;\n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 5 |\n| Lord of the Ladybirds | 5 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n+-----------------------+------\n\nURL: https://mariadb.com/kb/en/percentile_disc/','','https://mariadb.com/kb/en/percentile_disc/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (789,41,'RANK','Syntax\n------\n\nRANK() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nRANK() is a window function that displays the number of a given row, starting\nat one and following the ORDER BY sequence of the window function, with\nidentical values receiving the same result. It is similar to the ROW_NUMBER()\nfunction except that in that function, identical values will receive a\ndifferent row number for each result.\n\nExamples\n--------\n\nThe distinction between DENSE_RANK(), RANK() and ROW_NUMBER():\n\nCREATE TABLE student(course VARCHAR(10), mark int, name varchar(10));\n\nINSERT INTO student VALUES \n (\'Maths\', 60, \'Thulile\'),\n (\'Maths\', 60, \'Pritha\'),\n (\'Maths\', 70, \'Voitto\'),\n (\'Maths\', 55, \'Chun\'),\n (\'Biology\', 60, \'Bilal\'),\n (\'Biology\', 70, \'Roger\');\n\nSELECT \n RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS rank,\n DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS dense_rank,\n ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC) AS row_num,\n course, mark, name\nFROM student ORDER BY course, mark DESC;\n+------+------------+---------+---------+------+---------+\n| rank | dense_rank | row_num | course | mark | name |\n+------+------------+---------+---------+------+---------+\n| 1 | 1 | 1 | Biology | 70 | Roger |\n| 2 | 2 | 2 | Biology | 60 | Bilal |\n| 1 | 1 | 1 | Maths | 70 | Voitto |\n| 2 | 2 | 2 | Maths | 60 | Thulile |\n| 2 | 2 | 3 | Maths | 60 | Pritha |\n| 4 | 3 | 4 | Maths | 55 | Chun |\n+------+------------+---------+---------+------+---------+\n\nURL: https://mariadb.com/kb/en/rank/','','https://mariadb.com/kb/en/rank/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (790,41,'ROW_NUMBER','Syntax\n------\n\nROW_NUMBER() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n)\n\nDescription\n-----------\n\nROW_NUMBER() is a window function that displays the number of a given row,\nstarting at one and following the ORDER BY sequence of the window function,\nwith identical values receiving different row numbers. It is similar to the\nRANK() and DENSE_RANK() functions except that in that function, identical\nvalues will receive the same rank for each result.\n\nExamples\n--------\n\nThe distinction between DENSE_RANK(), RANK() and ROW_NUMBER():\n\nCREATE TABLE student(course VARCHAR(10), mark int, name varchar(10));\n\nINSERT INTO student VALUES \n (\'Maths\', 60, \'Thulile\'),\n (\'Maths\', 60, \'Pritha\'),\n (\'Maths\', 70, \'Voitto\'),\n (\'Maths\', 55, \'Chun\'),\n (\'Biology\', 60, \'Bilal\'),\n (\'Biology\', 70, \'Roger\');\n\nSELECT \n RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS rank,\n DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS dense_rank,\n ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC) AS row_num,\n course, mark, name\nFROM student ORDER BY course, mark DESC;\n+------+------------+---------+---------+------+---------+\n| rank | dense_rank | row_num | course | mark | name |\n+------+------------+---------+---------+------+---------+\n| 1 | 1 | 1 | Biology | 70 | Roger |\n| 2 | 2 | 2 | Biology | 60 | Bilal |\n| 1 | 1 | 1 | Maths | 70 | Voitto |\n| 2 | 2 | 2 | Maths | 60 | Thulile |\n| 2 | 2 | 3 | Maths | 60 | Pritha |\n| 4 | 3 | 4 | Maths | 55 | Chun |\n+------+------------+---------+---------+------+---------+\n\nURL: https://mariadb.com/kb/en/row_number/','','https://mariadb.com/kb/en/row_number/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (791,41,'Aggregate Functions as Window Functions','It is possible to use aggregate functions as window functions. An aggregate\nfunction used as a window function must have the OVER clause. For example,\nhere\'s COUNT() used as a window function:\n\nselect COUNT(*) over (order by column) from table;\n\nMariaDB currently allows these aggregate functions to be used as window\nfunctions:\n\n* AVG\n* BIT_AND\n* BIT_OR\n* BIT_XOR\n* COUNT\n* JSON_ARRAYAGG\n* JSON_OBJECTAGG\n* MAX\n* MIN\n* STD\n* STDDEV\n* STDDEV_POP\n* STDDEV_SAMP\n* SUM\n* VAR_POP\n* VAR_SAMP\n* VARIANCE\n\nURL: https://mariadb.com/kb/en/aggregate-functions-as-window-functions/','','https://mariadb.com/kb/en/aggregate-functions-as-window-functions/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (792,41,'ColumnStore Window Functions','Introduction\n------------\n\nMariaDB ColumnStore provides support for window functions broadly following\nthe SQL 2003 specification. A window function allows for calculations relating\nto a window of data surrounding the current row in a result set. This\ncapability provides for simplified queries in support of common business\nquestions such as cumulative totals, rolling averages, and top 10 lists.\n\nAggregate functions are utilized for window functions however differ in\nbehavior from a group by query because the rows remain ungrouped. This\nprovides support for cumulative sums and rolling averages, for example.\n\nTwo key concepts for window functions are Partition and Frame:\n\n* A Partition is a group of rows, or window, that have the same value for a\nspecific column, for example a Partition can be created over a time period\nsuch as a quarter or lookup values.\n* The Frame for each row is a subset of the row\'s Partition. The frame\ntypically is dynamic allowing for a sliding frame of rows within the\nPartition. The Frame determines the range of rows for the windowing function.\nA Frame could be defined as the last X rows and next Y rows all the way up to\nthe entire Partition.\n\nWindow functions are applied after joins, group by, and having clauses are\ncalculated.\n\nSyntax\n------\n\nA window function is applied in the select clause using the following syntax:\n\nfunction_name ([expression [, expression ... ]]) OVER ( window_definition )\n\nwhere window_definition is defined as:\n\n[ PARTITION BY expression [, ...] ]\n[ ORDER BY expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ]\n[ frame_clause ]\n\nPARTITION BY:\n\n* Divides the window result set into groups based on one or more expressions.\n* An expression may be a constant, column, and non window function expressions.\n* A query is not limited to a single partition by clause. Different partition\nclauses can be used across different window function applications.\n* The partition by columns do not need to be in the select list but do need to\nbe available from the query result set.\n* If there is no PARTITION BY clause, all rows of the result set define the\ngroup.\n\nORDER BY\n\n* Defines the ordering of values within the partition.\n* Can be ordered by multiple keys which may be a constant, column or non\nwindow function expression.\n* The order by columns do not need to be in the select list but need to be\navailable from the query result set.\n* Use of a select column alias from the query is not supported.\n* ASC (default) and DESC options allow for ordering ascending or descending.\n* NULLS FIRST and NULL_LAST options specify whether null values come first or\nlast in the ordering sequence. NULLS_FIRST is the default for ASC order, and\nNULLS_LAST is the default for DESC order.\n\nand the optional frame_clause is defined as:\n\n{ RANGE | ROWS } frame_start\n{ RANGE | ROWS } BETWEEN frame_start AND frame_end\n\nand the optional frame_start and frame_end are defined as (value being a\nnumeric expression):\n\nUNBOUNDED PRECEDING\nvalue PRECEDING\nCURRENT ROW\nvalue FOLLOWING\nUNBOUNDED FOLLOWING\n\nRANGE/ROWS:\n\n* Defines the windowing clause for calculating the set of rows that the\nfunction applies to for calculating a given rows window function result.\n* Requires an ORDER BY clause to define the row order for the window.\n* ROWS specify the window in physical units, i.e. result set rows and must be\na constant or expression evaluating to a positive numeric value.\n* RANGE specifies the window as a logical offset. If the the expression\nevaluates to a numeric value then the ORDER BY expression must be a numeric or\nDATE type. If the expression evaluates to an interval value then the ORDER BY\nexpression must be a DATE data type.\n* UNBOUNDED PRECEDING indicates the window starts at the first row of the\npartition.\n* UNBOUNDED FOLLOWING indicates the window ends at the last row of the\npartition.\n* CURRENT ROW specifies the window start or ends at the current row or value.\n* If omitted, the default is ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.\n\nSupported Functions\n-------------------\n\n+--------------------------------+-------------------------------------------+\n| Function | Description |\n+--------------------------------+-------------------------------------------+\n| AVG() | The average of all input values. |\n+--------------------------------+-------------------------------------------+\n| COUNT() | Number of input rows. |\n+--------------------------------+-------------------------------------------+\n| CUME_DIST() | Calculates the cumulative distribution, |\n| | or relative rank, of the current row to |\n| | other rows in the same partition. Number |\n| | of peer or preceding rows / number of |\n| | rows in partition. |\n+--------------------------------+-------------------------------------------+\n| DENSE_RANK() | Ranks items in a group leaving no gaps |\n| | in ranking sequence when there are ties. |\n+--------------------------------+-------------------------------------------+\n| FIRST_VALUE() | The value evaluated at the row that is |\n| | the first row of the window frame |\n| | (counting from 1); null if no such row. |\n+--------------------------------+-------------------------------------------+\n| LAG() | The value evaluated at the row that is |\n| | offset rows before the current row |\n| | within the partition; if there is no |\n| | such row, instead return default. Both |\n| | offset and default are evaluated with |\n| | respect to the current row. If omitted, |\n| | offset defaults to 1 and default to |\n| | null. LAG provides access to more than |\n| | one row of a table at the same time |\n| | without a self-join. Given a series of |\n| | rows returned from a query and a |\n| | position of the cursor, LAG provides |\n| | access to a row at a given physical |\n| | offset prior to that position. |\n+--------------------------------+-------------------------------------------+\n| LAST_VALUE() | The value evaluated at the row that is |\n| | the last row of the window frame |\n| | (counting from 1); null if no such row. |\n+--------------------------------+-------------------------------------------+\n| LEAD() | Provides access to a row at a given |\n| | physical offset beyond that position. |\n| | Returns value evaluated at the row that |\n| | is offset rows after the current row |\n| | within the partition; if there is no |\n| | such row, instead return default. Both |\n| | offset and default are evaluated with |\n| | respect to the current row. If omitted, |\n| | offset defaults to 1 and default to null. |\n+--------------------------------+-------------------------------------------+\n| MAX() | Maximum value of expression across all |\n| | input values. |\n+--------------------------------+-------------------------------------------+\n| MEDIAN() | An inverse distribution function that |\n| | assumes a continuous distribution model. |\n| | It takes a numeric or datetime value and |\n| | returns the middle value or an |\n| | interpolated value that would be the |\n| | middle value once the values are sorted. |\n| | Nulls are ignored in the calculation. |\n+--------------------------------+-------------------------------------------+\n| MIN() | Minimum value of expression across all |\n| | input values. |\n+--------------------------------+-------------------------------------------+\n| NTH_VALUE() | The value evaluated at the row that is |\n| | the nth row of the window frame |\n| | (counting from 1); null if no such row. |\n+--------------------------------+-------------------------------------------+\n| NTILE() | Divides an ordered data set into a |\n| | number of buckets indicated by expr and |\n| | assigns the appropriate bucket number to |\n| | each row. The buckets are numbered 1 |\n| | through expr. The expr value must |\n| | resolve to a positive constant for each |\n| | partition. Integer ranging from 1 to the |\n| | argument value, dividing the partition |\n| | as equally as possible. |\n+--------------------------------+-------------------------------------------+\n| PERCENT_RANK() | relative rank of the current row: (rank |\n| | - 1) / (total rows - 1). |\n+--------------------------------+-------------------------------------------+\n| PERCENTILE_CONT() | An inverse distribution function that |\n| | assumes a continuous distribution model. |\n| | It takes a percentile value and a sort |\n| | specification, and returns an |\n| | interpolated value that would fall into |\n| | that percentile value with respect to |\n| | the sort specification. Nulls are |\n| | ignored in the calculation. |\n+--------------------------------+-------------------------------------------+\n| PERCENTILE_DISC() | An inverse distribution function that |\n| | assumes a discrete distribution model. |\n| | It takes a percentile value and a sort |\n| | specification and returns an element |\n| | from the set. Nulls are ignored in the |\n| | calculation. |\n+--------------------------------+-------------------------------------------+\n| RANK() | rank of the current row with gaps; same |\n| | as row_number of its first peer. |\n+--------------------------------+-------------------------------------------+\n| ROW_NUMBER() | number of the current row within its |\n| | partition, counting from 1 |\n+--------------------------------+-------------------------------------------+\n| STDDEV() STDDEV_POP() | Computes the population standard |\n| | deviation and returns the square root of |\n| | the population variance. |\n+--------------------------------+-------------------------------------------+\n| STDDEV_SAMP() | Computes the cumulative sample standard |\n| | deviation and returns the square root of |\n| | the sample variance. |\n+--------------------------------+-------------------------------------------+\n| SUM() | Sum of expression across all input |\n| | values. |\n+--------------------------------+-------------------------------------------+\n| VARIANCE() VAR_POP() | Population variance of the input values |\n| | (square of the population standard |\n| | deviation). |\n+--------------------------------+-------------------------------------------+\n| VAR_SAMP() | Sample variance of the input values |\n| | (square of the sample standard |\n| | deviation). |\n+--------------------------------+-------------------------------------------+\n\nExamples\n--------\n\nExample Schema\n--------------\n\nThe examples are all based on the following simplified sales opportunity table:\n\ncreate table opportunities (\nid int,\naccountName varchar(20),\nname varchar(128),\nowner varchar(7),\namount decimal(10,2),\ncloseDate date,\nstageName varchar(11)\n) engine=columnstore;\n\nSome example values are (thanks to https://www.mockaroo.com for sample data\ngeneration):\n\n+----+---------------+------+--------+---------+-------------+-------------+\n| id | accountName | name | owner | amount | closeDate | stageName |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 1 | Browseblab | Mult | Bob | 26444.8 | 2016-10-20 | Negotiating |','','https://mariadb.com/kb/en/window-functions-columnstore-window-functions/');
+update help_topic set description = CONCAT(description, '\n| | | -lat | | | | |\n| | | ral | | | | |\n| | | exec | | | | |\n| | | tive | | | | |\n| | | func | | | | |\n| | | ion | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 2 | Mita | Orga | Maria | 477878. | 2016-11-28 | ClosedWon |\n| | | ic | | 1 | | |\n| | | dema | | | | |\n| | | d-dr | | | | |\n| | | ven | | | | |\n| | | benc | | | | |\n| | | mark | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 3 | Miboo | De-e | Olivie | 80181.7 | 2017-01-05 | ClosedWon |\n| | | gine | | | | |\n| | | red | | | | |\n| | | hybr | | | | |\n| | | d | | | | |\n| | | grou | | | | |\n| | | ware | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 4 | Youbridge | Ente | Chris | 946245. | 2016-07-02 | ClosedWon |\n| | | pris | | 9 | | |\n| | | -wid | | | | |\n| | | | | | | |\n| | | bott | | | | |\n| | | m-li | | | | |\n| | | e | | | | |\n| | | Grap | | | | |\n| | | ic | | | | |\n| | | Inte | | | | |\n| | | face | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 5 | Skyba | Reve | Maria | 696241. | 2017-02-17 | Negotiating |\n| | | se-e | | 2 | | |\n| | | gine | | | | |\n| | | red | | | | |\n| | | fres | | | | |\n| | | -thi | | | | |\n| | | king | | | | |\n| | | stan | | | | |\n| | | ardi | | | | |\n| | | atio | | | | |\n| | | | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 6 | Eayo | Fund | Bob | 765605. | 2016-08-27 | Prospecting |\n| | | ment | | 2 | | |\n| | | l | | | | |\n| | | well | | | | |\n| | | modu | | | | |\n| | | ated | | | | |\n| | | arti | | | | |\n| | | icia | | | | |\n| | | | | | | |\n| | | inte | | | | |\n| | | lige | | | | |\n| | | ce | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 7 | Yotz | Exte | Chris | 319624. | 2017-01-06 | ClosedLost |\n| | | ded | | 0 | | |\n| | | seco | | | | |\n| | | dary | | | | |\n| | | infr | | | | |\n| | | stru | | | | |\n| | | ture | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 8 | Oloo | Conf | Chris | 321016. | 2017-03-08 | ClosedLost |\n| | | gura | | 6 | | |\n| | | le | | | | |\n| | | web- | | | | |\n| | | nabl | | | | |\n| | | d | | | | |\n| | | data | | | | |\n| | | ware | | | | |\n| | | ouse | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 9 | Kaymbo | Mult | Bob | 690881. | 2017-01-02 | Developing |\n| | | -lat | | 1 | | |\n| | | ral | | | | |\n| | | web- | | | | |\n| | | nabl | | | | |\n| | | d | | | | |\n| | | defi | | | | |\n| | | itio | | | | |\n| | | | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n| 10 | Rhyloo | Publ | Chris | 965477. | 2016-11-07 | Prospecting |\n| | | c-ke | | 4 | | |\n| | | | | | | |\n| | | cohe | | | | |\n| | | ent | | | | |\n| | | infr | | | | |\n| | | stru | | | | |\n| | | ture | | | | |\n+----+---------------+------+--------+---------+-------------+-------------+\n\nThe schema, sample data, and queries are available as an attachment to this\narticle.\n\nCumulative Sum and Running Max Example\n--------------------------------------\n\nWindow functions can be used to achieve cumulative / running calculations on a\ndetail report. In this case a won opportunity report for a 7 day period adds\ncolumns to show the accumulated won amount as well as the current highest\nopportunity amount in preceding rows.\n\nselect owner, \naccountName, \nCloseDate, \namount, \nsum(amount) over (order by CloseDate rows between unbounded preceding and\ncurrent row) cumeWon, \nmax(amount) over (order by CloseDate rows between unbounded preceding and\ncurrent row) runningMax\nfrom opportunities \nwhere stageName=\'ClosedWon\' \nand closeDate >= \'2016-10-02\' and closeDate <= \'2016-10-09\' \norder by CloseDate;\n\nwith example results:\n\n+--------+---------------+-------------+---------+----------+--------------+\n| owner | accountName | CloseDate | amount | cumeWon | runningMax |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Babbleopia | 2016-10-02 | 437636. | 437636.4 | 437636.47 |\n| | | | 7 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Thoughtworks | 2016-10-04 | 146086. | 583722.9 | 437636.47 |\n| | | | 1 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Olivie | Devpulse | 2016-10-05 | 834235. | 1417958. | 834235.93 |\n| | | | 3 | 1 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Chris | Linkbridge | 2016-10-07 | 539977. | 2458738. | 834235.93 |\n| | | | 5 | 5 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Olivie | Trupe | 2016-10-07 | 500802. | 1918761. | 834235.93 |\n| | | | 9 | 0 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Latz | 2016-10-08 | 857254. | 3315993. | 857254.87 |\n| | | | 7 | 2 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Chris | Avamm | 2016-10-09 | 699566. | 4015560. | 857254.87 |\n| | | | 6 | 8 | |\n+--------+---------------+-------------+---------+----------+--------------+\n\nPartitioned Cumulative Sum and Running Max Example\n--------------------------------------------------\n\nThe above example can be partitioned, so that the window functions are over a\nparticular field grouping such as owner and accumulate within that grouping.\nThis is achieved by adding the syntax \"partition by <columns>\" in the window\nfunction clause.\n\nselect owner, \naccountName, \nCloseDate, \namount, \nsum(amount) over (partition by owner order by CloseDate rows between unbounded\npreceding and current row) cumeWon, \nmax(amount) over (partition by owner order by CloseDate rows between unbounded\npreceding and current row) runningMax \nfrom opportunities \nwhere stageName=\'ClosedWon\' \nand closeDate >= \'2016-10-02\' and closeDate <= \'2016-10-09\' \norder by owner, CloseDate;\n\nwith example results:\n\n+--------+---------------+-------------+---------+----------+--------------+\n| owner | accountName | CloseDate | amount | cumeWon | runningMax |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Babbleopia | 2016-10-02 | 437636. | 437636.4 | 437636.47 |\n| | | | 7 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Thoughtworks | 2016-10-04 | 146086. | 583722.9 | 437636.47 |\n| | | | 1 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Bill | Latz | 2016-10-08 | 857254. | 1440977. | 857254.87 |\n| | | | 7 | 5 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Chris | Linkbridge | 2016-10-07 | 539977. | 539977.4 | 539977.45 |\n| | | | 5 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Chris | Avamm | 2016-10-09 | 699566. | 1239544. | 699566.86 |\n| | | | 6 | 1 | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Olivie | Devpulse | 2016-10-05 | 834235. | 834235.9 | 834235.93 |\n| | | | 3 | | |\n+--------+---------------+-------------+---------+----------+--------------+\n| Olivie | Trupe | 2016-10-07 | 500802. | 1335038. | 834235.93 |\n| | | | 9 | 2 | |\n+--------+---------------+-------------+---------+----------+--------------+\n\nRanking / Top Results\n---------------------\n\nThe rank window function allows for ranking or assigning a numeric order value\nbased on the window function definition. Using the Rank() function will result\nin the same value for ties / equal values and the next rank value skipped. The\nDense_Rank() function behaves similarly except the next consecutive number is\nused after a tie rather than skipped. The Row_Number() function will provide a\nunique ordering value. The example query shows the Rank() function being\napplied to rank sales reps by the number of opportunities for Q4 2016.\n\nselect owner, \nwonCount, \nrank() over (order by wonCount desc) rank \nfrom (\n select owner,\n count(*) wonCount\n from opportunities\n where stageName=\'ClosedWon\'\n and closeDate >= \'2016-10-01\' and closeDate < \'2016-12-31\'\n group by owner\n) t\norder by rank;\n\nwith example results (note the query is technically incorrect by using\ncloseDate < \'2016-12-31\' however this creates a tie scenario for illustrative\npurposes):\n\n+----------------------+----------------------------------+------------------+\n| owner | wonCount | rank |\n+----------------------+----------------------------------+------------------+\n| Bill | 19 | 1 |\n+----------------------+----------------------------------+------------------+\n| Chris | 15 | 2 |') WHERE help_topic_id = 792;
+update help_topic set description = CONCAT(description, '\n+----------------------+----------------------------------+------------------+\n| Maria | 14 | 3 |\n+----------------------+----------------------------------+------------------+\n| Bob | 14 | 3 |\n+----------------------+----------------------------------+------------------+\n| Olivier | 10 | 5 |\n+----------------------+----------------------------------+------------------+\n\nIf the dense_rank function is used the rank values would be 1,2,3,3,4 and for\nthe row_number function the values would be 1,2,3,4,5.\n\nFirst and Last Values\n---------------------\n\nThe first_value and last_value functions allow determining the first and last\nvalues of a given range. Combined with a group by this allows summarizing\nopening and closing values. The example shows a more complex case where\ndetailed information is presented for first and last opportunity by quarter.\n\nselect a.year, \na.quarter, \nf.accountName firstAccountName, \nf.owner firstOwner, \nf.amount firstAmount, \nl.accountName lastAccountName, \nl.owner lastOwner, \nl.amount lastAmount \nfrom (\n select year,\n quarter,\n min(firstId) firstId,\n min(lastId) lastId\n from (\n select year(closeDate) year,\n quarter(closeDate) quarter,\n first_value(id) over (partition by year(closeDate), quarter(closeDate)\norder by closeDate rows between unbounded preceding and current row) firstId, \n last_value(id) over (partition by year(closeDate), quarter(closeDate)\norder by closeDate rows between current row and unbounded following) lastId \n from opportunities where stageName=\'ClosedWon\'\n ) t\n group by year, quarter order by year,quarter\n) a \njoin opportunities f on a.firstId = f.id \njoin opportunities l on a.lastId = l.id \norder by year, quarter;\n\nwith example results:\n\n+----+------+------------+--------+---------+-----------+-------+--------+\n| ye | quar | firstAccou | firstO | firstAm | lastAccou | lastO | lastAm |\n| r | er | tName | ner | unt | tName | ner | unt |\n+----+------+------------+--------+---------+-----------+-------+--------+\n| 20 | 3 | Skidoo | Bill | 523295. | Skipstorm | Bill | 151420 |\n| 6 | | | | 7 | | | 86 |\n+----+------+------------+--------+---------+-----------+-------+--------+\n| 20 | 4 | Skimia | Chris | 961513. | Avamm | Maria | 112493 |\n| 6 | | | | 9 | | | 65 |\n+----+------+------------+--------+---------+-----------+-------+--------+\n| 20 | 1 | Yombu | Bob | 536875. | Skaboo | Chris | 270273 |\n| 7 | | | | 1 | | | 08 |\n+----+------+------------+--------+---------+-----------+-------+--------+\n\nPrior and Next Example\n----------------------\n\nSometimes it useful to understand the previous and next values in the context\nof a given row. The lag and lead window functions provide this capability. By\ndefault the offset is one providing the prior or next value but can also be\nprovided to get a larger offset. The example query is a report of\nopportunities by account name showing the opportunity amount, and the prior\nand next opportunity amount for that account by close date.\n\nselect accountName, \ncloseDate, \namount currentOppAmount, \nlag(amount) over (partition by accountName order by closeDate) priorAmount,\nlead(amount) over (partition by accountName order by closeDate) nextAmount \nfrom opportunities \norder by accountName, closeDate \nlimit 9;\n\nwith example results:\n\n+--------------+-----------+-------------------+--------------+-------------+\n| accountName | closeDate | currentOppAmount | priorAmount | nextAmount |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2016-09-1 | 645098.45 | NULL | 161086.82 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2016-10-1 | 161086.82 | 645098.45 | 350235.75 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2016-12-1 | 350235.75 | 161086.82 | 878595.89 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2016-12-3 | 878595.89 | 350235.75 | 922322.39 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abata | 2017-01-2 | 922322.39 | 878595.89 | NULL |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Abatz | 2016-10-1 | 795424.15 | NULL | NULL |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Agimba | 2016-07-0 | 288974.84 | NULL | 914461.49 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Agimba | 2016-09-0 | 914461.49 | 288974.84 | 176645.52 |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n| Agimba | 2016-09-2 | 176645.52 | 914461.49 | NULL |\n| | | | | |\n+--------------+-----------+-------------------+--------------+-------------+\n\nQuartiles Example\n-----------------\n\nThe NTile window function allows for breaking up a data set into portions\nassigned a numeric value to each portion of the range. NTile(4) breaks the\ndata up into quartiles (4 sets). The example query produces a report of all\nopportunities summarizing the quartile boundaries of amount values.\n\nselect t.quartile, \nmin(t.amount) min, \nmax(t.amount) max \nfrom (\n select amount,\n ntile(4) over (order by amount asc) quartile\n from opportunities\n where closeDate >= \'2016-10-01\' and closeDate <= \'2016-12-31\'\n ) t\ngroup by quartile \norder by quartile;\n\nWith example results:\n\n+-----------------------------------------+----------------+----------------+\n| quartile | min | max |\n+-----------------------------------------+----------------+----------------+\n| 1 | 6337.15 | 287634.01 |\n+-----------------------------------------+----------------+----------------+\n| 2 | 288796.14 | 539977.45 |\n+-----------------------------------------+----------------+----------------+\n| 3 | 540070.04 | 748727.51 |\n+-----------------------------------------+----------------+----------------+\n| 4 | 753670.77 | 998864.47 |\n+-----------------------------------------+----------------+----------------+\n\nPercentile Example\n------------------\n\nThe percentile functions have a slightly different syntax from other window\nfunctions as can be seen in the example below. These functions can be only\napplied against numeric values. The argument to the function is the percentile\nto evaluate. Following \'within group\' is the sort expression which indicates\nthe sort column and optionally order. Finally after \'over\' is an optional\npartition by clause, for no partition clause use \'over ()\'. The example below\nutilizes the value 0.5 to calculate the median opportunity amount in the rows.\nThe values differ sometimes because percentile_cont will return the average of\nthe 2 middle rows for an even data set while percentile_desc returns the first\nencountered in the sort.\n\nselect owner, \naccountName, \nCloseDate, \namount,\npercentile_cont(0.5) within group (order by amount) over (partition by owner)\npct_cont,\npercentile_disc(0.5) within group (order by amount) over (partition by owner)\npct_disc\nfrom opportunities \nwhere stageName=\'ClosedWon\' \nand closeDate >= \'2016-10-02\' and closeDate <= \'2016-10-09\' \norder by owner, CloseDate;\n\nWith example results:\n\n+--------+----------------+-------------+---------+------------+------------+\n| owner | accountName | CloseDate | amount | pct_cont | pct_disc |\n+--------+----------------+-------------+---------+------------+------------+\n| Bill | Babbleopia | 2016-10-02 | 437636. | 437636.470 | 437636.47 |\n| | | | 7 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Bill | Thoughtworks | 2016-10-04 | 146086. | 437636.470 | 437636.47 |\n| | | | 1 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Bill | Latz | 2016-10-08 | 857254. | 437636.470 | 437636.47 |\n| | | | 7 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Chris | Linkbridge | 2016-10-07 | 539977. | 619772.155 | 539977.45 |\n| | | | 5 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Chris | Avamm | 2016-10-09 | 699566. | 619772.155 | 539977.45 |\n| | | | 6 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Olivie | Devpulse | 2016-10-05 | 834235. | 667519.110 | 500802.29 |\n| | | | 3 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n| Olivie | Trupe | 2016-10-07 | 500802. | 667519.110 | 500802.29 |\n| | | | 9 | 000000 | |\n+--------+----------------+-------------+---------+------------+------------+\n\nURL: https://mariadb.com/kb/en/window-functions-columnstore-window-functions/') WHERE help_topic_id = 792;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (793,41,'Window Frames','Syntax\n------\n\nframe_clause:\n {ROWS | RANGE} {frame_border | BETWEEN frame_border AND frame_border}\n\nframe_border:\n | UNBOUNDED PRECEDING\n | UNBOUNDED FOLLOWING\n | CURRENT ROW\n | expr PRECEDING\n | expr FOLLOWING\n\nDescription\n-----------\n\nA basic overview of window functions is described in Window Functions\nOverview. Window frames expand this functionality by allowing the function to\ninclude a specified a number of rows around the current row.\n\nThese include:\n\n* All rows before the current row (UNBOUNDED PRECEDING), for example RANGE\nBETWEEN UNBOUNDED PRECEDING AND CURRENT ROW\n* All rows after the current row (UNBOUNDED FOLLOWING), for example RANGE\nBETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING\n* A set number of rows before the current row (expr PRECEDING) for example\nRANGE BETWEEN 6 PRECEDING AND CURRENT ROW\n* A set number of rows after the current row (expr PRECEDING AND expr\nFOLLOWING) for example RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING\n* A specified number of rows both before and after the current row, for\nexample RANGE BETWEEN 6 PRECEDING AND 3 FOLLOWING\n\nThe following functions operate on window frames:\n\n* AVG\n* BIT_AND\n* BIT_OR\n* BIT_XOR\n* COUNT\n* LEAD\n* MAX\n* MIN\n* NTILE\n* STD\n* STDDEV\n* STDDEV_POP\n* STDDEV_SAMP\n* SUM\n* VAR_POP\n* VAR_SAMP\n* VARIANCE\n\nWindow frames are determined by the frame_clause in the window function\nrequest.\n\nTake the following example:\n\nCREATE TABLE `student_test` (\n name char(10),\n test char(10),\n score tinyint(4)\n);\n\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73),\n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31),\n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88),\n (\'Tatiana\', \'SQL\', 87);\n\nSELECT name, test, score, SUM(score) \n OVER () AS total_score\n FROM student_test;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Chun | SQL | 75 | 453 |\n| Chun | Tuning | 73 | 453 |\n| Esben | SQL | 43 | 453 |\n| Esben | Tuning | 31 | 453 |\n| Kaolin | SQL | 56 | 453 |\n| Kaolin | Tuning | 88 | 453 |\n| Tatiana | SQL | 87 | 453 |\n+---------+--------+-------+-------------+\n\nBy not specifying an OVER clause, the SUM function is run over the entire\ndataset. However, if we specify an ORDER BY condition based on score (and\norder the entire result in the same way for clarity), the following result is\nreturned:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score) AS total_score\n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 31 |\n| Esben | SQL | 43 | 74 |\n| Kaolin | SQL | 56 | 130 |\n| Chun | Tuning | 73 | 203 |\n| Chun | SQL | 75 | 278 |\n| Tatiana | SQL | 87 | 365 |\n| Kaolin | Tuning | 88 | 453 |\n+---------+--------+-------+-------------+\n\nThe total_score column represents a running total of the current row, and all\nprevious rows. The window frame in this example expands as the function\nproceeds.\n\nThe above query makes use of the default to define the window frame. It could\nbe written explicitly as follows:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS\ntotal_score \n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 31 |\n| Esben | SQL | 43 | 74 |\n| Kaolin | SQL | 56 | 130 |\n| Chun | Tuning | 73 | 203 |\n| Chun | SQL | 75 | 278 |\n| Tatiana | SQL | 87 | 365 |\n| Kaolin | Tuning | 88 | 453 |\n+---------+--------+-------+-------------+\n\nLet\'s look at some alternatives:\n\nFirstly, applying the window function to the current row and all following\nrows can be done with the use of UNBOUNDED FOLLOWING:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS\ntotal_score \n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 453 |\n| Esben | SQL | 43 | 422 |\n| Kaolin | SQL | 56 | 379 |\n| Chun | Tuning | 73 | 323 |\n| Chun | SQL | 75 | 250 |\n| Tatiana | SQL | 87 | 175 |\n| Kaolin | Tuning | 88 | 88 |\n+---------+--------+-------+-------------+\n\nIt\'s possible to specify a number of rows, rather than the entire unbounded\nfollowing or preceding set. The following example takes the current row, as\nwell as the previous row:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS\ntotal_score \n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 31 |\n| Esben | SQL | 43 | 74 |\n| Kaolin | SQL | 56 | 99 |\n| Chun | Tuning | 73 | 129 |\n| Chun | SQL | 75 | 148 |\n| Tatiana | SQL | 87 | 162 |\n| Kaolin | Tuning | 88 | 175 |\n+---------+--------+-------+-------------+\n\nThe current row and the following row:\n\nSELECT name, test, score, SUM(score) \n OVER (ORDER BY score ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS\ntotal_score \n FROM student_test ORDER BY score;\n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Esben | Tuning | 31 | 74 |\n| Esben | SQL | 43 | 130 |\n| Kaolin | SQL | 56 | 172 |\n| Chun | Tuning | 73 | 204 |\n| Chun | SQL | 75 | 235 |\n| Tatiana | SQL | 87 | 250 |\n| Kaolin | Tuning | 88 | 175 |\n+---------+--------+-------+-------------+\n\nURL: https://mariadb.com/kb/en/window-frames/','','https://mariadb.com/kb/en/window-frames/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (794,42,'SPIDER_BG_DIRECT_SQL','Syntax\n------\n\nSPIDER_BG_DIRECT_SQL(\'sql\', \'tmp_table_list\', \'parameters\')\n\nDescription\n-----------\n\nExecutes the given SQL statement in the background on the remote server, as\ndefined in the parameters listing. If the query returns a result-set, it\nsttores the results in the given temporary table. When the given SQL statement\nexecutes successfully, this function returns the number of called UDF\'s. It\nreturns 0 when the given SQL statement fails.\n\nThis function is a UDF installed with the Spider storage engine.\n\nExamples\n--------\n\nSELECT SPIDER_BG_DIRECT_SQL(\'SELECT * FROM example_table\', \'\', \n \'srv \"node1\", port \"8607\"\') AS \"Direct Query\";\n+--------------+\n| Direct Query | \n+--------------+\n| 1 |\n+--------------+\n\nParameters\n----------\n\nerror_rw_mode\n-------------\n\n* Description: Returns empty results on network error.\n0 : Return error on getting network error.\n1: Return 0 records on getting network error.\n\n* Default Table Value: 0\n* DSN Parameter Name: erwm\n\nURL: https://mariadb.com/kb/en/spider_bg_direct_sql/','','https://mariadb.com/kb/en/spider_bg_direct_sql/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (795,42,'SPIDER_COPY_TABLES','Syntax\n------\n\nSPIDER_COPY_TABLES(spider_table_name, \n source_link_id, destination_link_id_list [,parameters])\n\nDescription\n-----------\n\nA UDF installed with the Spider Storage Engine, this function copies table\ndata from source_link_id to destination_link_id_list. The service does not\nneed to be stopped in order to copy.\n\nIf the Spider table is partitioned, the name must be of the format\ntable_name#P#partition_name. The partition name can be viewed in the\nmysql.spider_tables table, for example:\n\nSELECT table_name FROM mysql.spider_tables;\n+-------------+\n| table_name |\n+-------------+\n| spt_a#P#pt1 |\n| spt_a#P#pt2 |\n| spt_a#P#pt3 |\n+-------------+\n\nReturns 1 if the data was copied successfully, or 0 if copying the data failed.\n\nURL: https://mariadb.com/kb/en/spider_copy_tables/','','https://mariadb.com/kb/en/spider_copy_tables/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (796,42,'SPIDER_DIRECT_SQL','Syntax\n------\n\nSPIDER_DIRECT_SQL(\'sql\', \'tmp_table_list\', \'parameters\')\n\nDescription\n-----------\n\nA UDF installed with the Spider Storage Engine, this function is used to\nexecute the SQL string sql on the remote server, as defined in parameters. If\nany resultsets are returned, they are stored in the tmp_table_list.\n\nThe function returns 1 if the SQL executes successfully, or 0 if it fails.\n\nExamples\n--------\n\nSELECT SPIDER_DIRECT_SQL(\'SELECT * FROM s\', \'\', \'srv \"node1\", port \"8607\"\');\n+----------------------------------------------------------------------+\n| SPIDER_DIRECT_SQL(\'SELECT * FROM s\', \'\', \'srv \"node1\", port \"8607\"\') |\n+----------------------------------------------------------------------+\n| 1 |\n+----------------------------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/spider_direct_sql/','','https://mariadb.com/kb/en/spider_direct_sql/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (797,42,'SPIDER_FLUSH_TABLE_MON_CACHE','Syntax\n------\n\nSPIDER_FLUSH_TABLE_MON_CACHE()\n\nDescription\n-----------\n\nA UDF installed with the Spider Storage Engine, this function is used for\nrefreshing monitoring server information. It returns a value of 1.\n\nExamples\n--------\n\nSELECT SPIDER_FLUSH_TABLE_MON_CACHE();\n+--------------------------------+\n| SPIDER_FLUSH_TABLE_MON_CACHE() |\n+--------------------------------+\n| 1 |\n+--------------------------------+\n\nURL: https://mariadb.com/kb/en/spider_flush_table_mon_cache/','','https://mariadb.com/kb/en/spider_flush_table_mon_cache/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (798,43,'COLUMN_ADD','Syntax\n------\n\nCOLUMN_ADD(dyncol_blob, column_nr, value [as type], [column_nr, value [as\ntype]]...);\nCOLUMN_ADD(dyncol_blob, column_name, value [as type], [column_name, value [as\ntype]]...);\n\nDescription\n-----------\n\nAdds or updates dynamic columns.\n\n* dyncol_blob must be either a valid dynamic columns blob (for example,\nCOLUMN_CREATE returns such blob), or an empty string.\n* column_name specifies the name of the column to be added. If dyncol_blob\nalready has a column with this name, it will be overwritten.\n* value specifies the new value for the column. Passing a NULL value will\ncause the column to be deleted.\n* as type is optional. See #datatypes section for a discussion about types.\n\nThe return value is a dynamic column blob after the modifications.\n\nExamples\n--------\n\nUPDATE t1 SET dyncol_blob=COLUMN_ADD(dyncol_blob, \"column_name\", \"value\")\nWHERE id=1;\n\nNote: COLUMN_ADD() is a regular function (just like CONCAT()), hence, in order\nto update the value in the table you have to use the UPDATE ... SET\ndynamic_col=COLUMN_ADD(dynamic_col, ....) pattern.\n\nURL: https://mariadb.com/kb/en/column_add/','','https://mariadb.com/kb/en/column_add/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (799,43,'COLUMN_CHECK','Syntax\n------\n\nCOLUMN_CHECK(dyncol_blob);\n\nDescription\n-----------\n\nCheck if dyncol_blob is a valid packed dynamic columns blob. Return value of 1\nmeans the blob is valid, return value of 0 means it is not.\n\nRationale: Normally, one works with valid dynamic column blobs. Functions like\nCOLUMN_CREATE, COLUMN_ADD, COLUMN_DELETE always return valid dynamic column\nblobs. However, if a dynamic column blob is accidentally truncated, or\ntranscoded from one character set to another, it will be corrupted. This\nfunction can be used to check if a value in a blob field is a valid dynamic\ncolumn blob.\n\nURL: https://mariadb.com/kb/en/column_check/','','https://mariadb.com/kb/en/column_check/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (800,43,'COLUMN_CREATE','Syntax\n------\n\nCOLUMN_CREATE(column_nr, value [as type], [column_nr, value [as type]]...);\nCOLUMN_CREATE(column_name, value [as type], [column_name, value [as type]]...);\n\nDescription\n-----------\n\nReturns a dynamic columns blob that stores the specified columns with values.\n\nThe return value is suitable for\n\n* storing in a table\n* further modification with other dynamic columns functions\n\nThe as type part allows one to specify the value type. In most cases, this is\nredundant because MariaDB will be able to deduce the type of the value.\nExplicit type specification may be needed when the type of the value is not\napparent. For example, a literal \'2012-12-01\' has a CHAR type by default, one\nwill need to specify \'2012-12-01\' AS DATE to have it stored as a date. See\nDynamic Columns:Datatypes for further details.\n\nExamples\n--------\n\nINSERT INTO tbl SET dyncol_blob=COLUMN_CREATE(\"column_name\", \"value\");\n\nURL: https://mariadb.com/kb/en/column_create/','','https://mariadb.com/kb/en/column_create/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (801,43,'COLUMN_DELETE','Syntax\n------\n\nCOLUMN_DELETE(dyncol_blob, column_nr, column_nr...);\nCOLUMN_DELETE(dyncol_blob, column_name, column_name...);\n\nDescription\n-----------\n\nDeletes a dynamic column with the specified name. Multiple names can be given.\nThe return value is a dynamic column blob after the modification.\n\nURL: https://mariadb.com/kb/en/column_delete/','','https://mariadb.com/kb/en/column_delete/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (802,43,'COLUMN_EXISTS','Syntax\n------\n\nCOLUMN_EXISTS(dyncol_blob, column_nr);\nCOLUMN_EXISTS(dyncol_blob, column_name);\n\nDescription\n-----------\n\nChecks if a column with name column_name exists in dyncol_blob. If yes, return\n1, otherwise return 0. See dynamic columns for more information.\n\nURL: https://mariadb.com/kb/en/column_exists/','','https://mariadb.com/kb/en/column_exists/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (803,43,'COLUMN_GET','Syntax\n------\n\nCOLUMN_GET(dyncol_blob, column_nr as type);\nCOLUMN_GET(dyncol_blob, column_name as type);\n\nDescription\n-----------\n\nGets the value of a dynamic column by its name. If no column with the given\nname exists, NULL will be returned.\n\ncolumn_name as type requires that one specify the datatype of the dynamic\ncolumn they are reading.\n\nThis may seem counter-intuitive: why would one need to specify which datatype\nthey\'re retrieving? Can\'t the dynamic columns system figure the datatype from\nthe data being stored?\n\nThe answer is: SQL is a statically-typed language. The SQL interpreter needs\nto know the datatypes of all expressions before the query is run (for example,\nwhen one is using prepared statements and runs \"select COLUMN_GET(...)\", the\nprepared statement API requires the server to inform the client about the\ndatatype of the column being read before the query is executed and the server\ncan see what datatype the column actually has).\n\nLengths\n-------\n\nIf you\'re running queries like:\n\nSELECT COLUMN_GET(blob, \'colname\' as CHAR) ...\n\nwithout specifying a maximum length (i.e. using as CHAR, not as CHAR(n)),\nMariaDB will report the maximum length of the resultset column to be\n16,777,216. This may cause excessive memory usage in some client libraries,\nbecause they try to pre-allocate a buffer of maximum resultset width. To avoid\nthis problem, use CHAR(n) whenever you\'re using COLUMN_GET in the select list.\n\nSee Dynamic Columns:Datatypes for more information about datatypes.\n\nURL: https://mariadb.com/kb/en/column_get/','','https://mariadb.com/kb/en/column_get/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (804,43,'COLUMN_JSON','Syntax\n------\n\nCOLUMN_JSON(dyncol_blob)\n\nDescription\n-----------\n\nReturns a JSON representation of data in dyncol_blob. Can also be used to\ndisplay nested columns. See dynamic columns for more information.\n\nExample\n-------\n\nselect item_name, COLUMN_JSON(dynamic_cols) from assets;\n+-----------------+----------------------------------------+\n| item_name | COLUMN_JSON(dynamic_cols) |\n+-----------------+----------------------------------------+\n| MariaDB T-shirt | {\"size\":\"XL\",\"color\":\"blue\"} |\n| Thinkpad Laptop | {\"color\":\"black\",\"warranty\":\"3 years\"} |\n+-----------------+----------------------------------------+\n\nLimitation: COLUMN_JSON will decode nested dynamic columns at a nesting level\nof not more than 10 levels deep. Dynamic columns that are nested deeper than\n10 levels will be shown as BINARY string, without encoding.\n\nURL: https://mariadb.com/kb/en/column_json/','','https://mariadb.com/kb/en/column_json/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (805,43,'COLUMN_LIST','Syntax\n------\n\nCOLUMN_LIST(dyncol_blob);\n\nDescription\n-----------\n\nReturns a comma-separated list of column names. The names are quoted with\nbackticks.\n\nSee dynamic columns for more information.\n\nURL: https://mariadb.com/kb/en/column_list/','','https://mariadb.com/kb/en/column_list/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (806,44,'WSREP_LAST_SEEN_GTID','MariaDB starting with 10.4.2\n----------------------------\nWSREP_LAST_SEEN_GTID was added as part of Galera 4 in MariaDB 10.4.2.\n\nSyntax\n------\n\nWSREP_LAST_SEEN_GTID()\n\nDescription\n-----------\n\nReturns the Global Transaction ID of the most recent write transaction\nobserved by the client.\n\nThe result can be useful to determine the transaction to provide to\nWSREP_SYNC_WAIT_UPTO_GTID for waiting and unblocking purposes.\n\nURL: https://mariadb.com/kb/en/wsrep_last_seen_gtid/','','https://mariadb.com/kb/en/wsrep_last_seen_gtid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (807,44,'WSREP_LAST_WRITTEN_GTID','MariaDB starting with 10.4.2\n----------------------------\nWSREP_LAST_WRITTEN_GTID was added as part of Galera 4 in MariaDB 10.4.2.\n\nSyntax\n------\n\nWSREP_LAST_WRITTEN_GTID()\n\nDescription\n-----------\n\nReturns the Global Transaction ID of the most recent write transaction\nperformed by the client.\n\nURL: https://mariadb.com/kb/en/wsrep_last_written_gtid/','','https://mariadb.com/kb/en/wsrep_last_written_gtid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (808,44,'WSREP_SYNC_WAIT_UPTO_GTID','MariaDB starting with 10.4.2\n----------------------------\nWSREP_SYNC_WAIT_UPTO_GTID was added as part of Galera 4 in MariaDB 10.4.2.\n\nSyntax\n------\n\nWSREP_SYNC_WAIT_UPTO_GTID(gtid[,timeout])\n\nDescription\n-----------\n\nBlocks the client until the transaction specified by the given Global\nTransaction ID is applied and committed by the node.\n\nThe optional timeout argument can be used to specify a block timeout in\nseconds. If not provided, the timeout will be indefinite.\n\nReturns the node that applied and committed the Global Transaction ID,\nER_LOCAL_WAIT_TIMEOUT if the function is timed out before this, or\nER_WRONG_ARGUMENTS if the function is given an invalid GTID.\n\nThe result from WSREP_LAST_SEEN_GTID can be useful to determine the\ntransaction to provide to WSREP_SYNC_WAIT_UPTO_GTID for waiting and unblocking\npurposes.\n\nURL: https://mariadb.com/kb/en/wsrep_sync_wait_upto_gtid/','','https://mariadb.com/kb/en/wsrep_sync_wait_upto_gtid/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (809,45,'System-Versioned Tables','MariaDB supports temporal data tables in the form of system-versioning tables\n(allowing you to query and operate on historic data, discussed below),\napplication-time periods (allow you to query and operate on a temporal range\nof data), and bitemporal tables (which combine both system-versioning and\napplication-time periods).\n\nSystem-Versioned Tables\n-----------------------\n\nSystem-versioned tables store the history of all changes, not only data which\nis currently valid. This allows data analysis for any point in time, auditing\nof changes and comparison of data from different points in time. Typical uses\ncases are:\n\n* Forensic analysis & legal requirements to store data for N years.\n* Data analytics (retrospective, trends etc.), e.g. to get your staff\ninformation as of one year ago.\n* Point-in-time recovery - recover a table state as of particular point in\ntime.\n\nSystem-versioned tables were first introduced in the SQL:2011 standard.\n\nCreating a System-Versioned Table\n---------------------------------\n\nThe CREATE TABLE syntax has been extended to permit creating a\nsystem-versioned table. To be system-versioned, according to SQL:2011, a table\nmust have two generated columns, a period, and a special table option clause:\n\nCREATE TABLE t(\n x INT,\n start_timestamp TIMESTAMP(6) GENERATED ALWAYS AS ROW START,\n end_timestamp TIMESTAMP(6) GENERATED ALWAYS AS ROW END,\n PERIOD FOR SYSTEM_TIME(start_timestamp, end_timestamp)\n) WITH SYSTEM VERSIONING;\n\nIn MariaDB one can also use a simplified syntax:\n\nCREATE TABLE t (\n x INT\n) WITH SYSTEM VERSIONING;\n\nIn the latter case no extra columns will be created and they won\'t clutter the\noutput of, say, SELECT * FROM t. The versioning information will still be\nstored, and it can be accessed via the pseudo-columns ROW_START and ROW_END:\n\nSELECT x, ROW_START, ROW_END FROM t;\n\nAdding or Removing System Versioning To/From a Table\n----------------------------------------------------\n\nAn existing table can be altered to enable system versioning for it.\n\nCREATE TABLE t(\n x INT\n);\n\nALTER TABLE t ADD SYSTEM VERSIONING;\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `x` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING\n\nSimilarly, system versioning can be removed from a table:\n\nALTER TABLE t DROP SYSTEM VERSIONING;\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `x` int(11) DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nOne can also add system versioning with all columns created explicitly:\n\nALTER TABLE t ADD COLUMN ts TIMESTAMP(6) GENERATED ALWAYS AS ROW START,\n ADD COLUMN te TIMESTAMP(6) GENERATED ALWAYS AS ROW END,\n ADD PERIOD FOR SYSTEM_TIME(ts, te),\n ADD SYSTEM VERSIONING;\n\nSHOW CREATE TABLE t\\G\n*************************** 1. row ***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `x` int(11) DEFAULT NULL,\n `ts` timestamp(6) GENERATED ALWAYS AS ROW START,\n `te` timestamp(6) GENERATED ALWAYS AS ROW END,\n PERIOD FOR SYSTEM_TIME (`ts`, `te`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING\n\nInserting Data\n--------------\n\nWhen data is inserted into a system-versioned table, it is given a row_start\nvalue of the current timestamp, and a row_end value of\nFROM_UNIXTIME(2147483647.999999). The current timestamp can be adjusted by\nsetting the timestamp system variable, for example:\n\nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2022-10-24 23:09:38 |\n+---------------------+\n\nINSERT INTO t VALUES(1);\n\nSET @@timestamp = UNIX_TIMESTAMP(\'2033-10-24\');\n\nINSERT INTO t VALUES(2);\n\nSET @@timestamp = default;\n\nINSERT INTO t VALUES(3);\n\nSELECT a,row_start,row_end FROM t;\n+------+----------------------------+----------------------------+\n| a | row_start | row_end |\n+------+----------------------------+----------------------------+\n| 1 | 2022-10-24 23:09:38.951347 | 2038-01-19 05:14:07.999999 |\n| 2 | 2033-10-24 00:00:00.000000 | 2038-01-19 05:14:07.999999 |\n| 3 | 2022-10-24 23:09:38.961857 | 2038-01-19 05:14:07.999999 |\n+------+----------------------------+----------------------------+\n\nQuerying Historical Data\n------------------------\n\nSELECT\n------\n\nTo query the historical data one uses the clause FOR SYSTEM_TIME directly\nafter the table name (before the table alias, if any). SQL:2011 provides three\nsyntactic extensions:\n\n* AS OF is used to see the table as it was at a specific point in time in the\npast:\n\nSELECT * FROM t FOR SYSTEM_TIME AS OF TIMESTAMP\'2016-10-09 08:07:06\';\n\n* BETWEEN start AND end will show all rows that were visible at any point\nbetween two specified points in time. It works inclusively, a row visible\nexactly at start or exactly at end will be shown too.\n\nSELECT * FROM t FOR SYSTEM_TIME BETWEEN (NOW() - INTERVAL 1 YEAR) AND NOW();\n\n* FROM start TO end will also show all rows that were visible at any point\nbetween two specified points in time, including start, but excluding end.\n\nSELECT * FROM t FOR SYSTEM_TIME FROM \'2016-01-01 00:00:00\' TO \'2017-01-01\n00:00:00\';\n\nAdditionally MariaDB implements a non-standard extension:\n\n* ALL will show all rows, historical and current.\n\nSELECT * FROM t FOR SYSTEM_TIME ALL;\n\nIf the FOR SYSTEM_TIME clause is not used, the table will show the current\ndata. This is usually the same as if one had specified FOR SYSTEM_TIME AS OF\nCURRENT_TIMESTAMP, unless one has adjusted the row_start value (until MariaDB\n10.11, only possible by setting the secure_timestamp variable). For example:\n\nCREATE OR REPLACE TABLE t (a int) WITH SYSTEM VERSIONING;\n\nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2022-10-24 23:43:37 |\n+---------------------+\n\nINSERT INTO t VALUES (1);\n\nSET @@timestamp = UNIX_TIMESTAMP(\'2033-03-03\');\n\nINSERT INTO t VALUES (2);\n\nDELETE FROM t;\n\nSET @@timestamp = default;\n\nSELECT a, row_start, row_end FROM t FOR SYSTEM_TIME ALL;\n+------+----------------------------+----------------------------+\n| a | row_start | row_end |\n+------+----------------------------+----------------------------+\n| 1 | 2022-10-24 23:43:37.192725 | 2033-03-03 00:00:00.000000 |\n| 2 | 2033-03-03 00:00:00.000000 | 2033-03-03 00:00:00.000000 |\n+------+----------------------------+----------------------------+\n2 rows in set (0.000 sec)\n\nSELECT a, row_start, row_end FROM t FOR SYSTEM_TIME AS OF CURRENT_TIMESTAMP;\n+------+----------------------------+----------------------------+\n| a | row_start | row_end |\n+------+----------------------------+----------------------------+\n| 1 | 2022-10-24 23:43:37.192725 | 2033-03-03 00:00:00.000000 |\n+------+----------------------------+----------------------------+\n1 row in set (0.000 sec)\n\nSELECT a, row_start, row_end FROM t;\nEmpty set (0.001 sec)\n\nViews and Subqueries\n--------------------\n\nWhen a system-versioned tables is used in a view or in a subquery in the from\nclause, FOR SYSTEM_TIME can be used directly in the view or subquery body, or\n(non-standard) applied to the whole view when it\'s being used in a SELECT:\n\nCREATE VIEW v1 AS SELECT * FROM t FOR SYSTEM_TIME AS OF TIMESTAMP\'2016-10-09\n08:07:06\';\n\nOr\n\nCREATE VIEW v1 AS SELECT * FROM t;\nSELECT * FROM v1 FOR SYSTEM_TIME AS OF TIMESTAMP\'2016-10-09 08:07:06\';\n\nUse in Replication and Binary Logs\n----------------------------------\n\nTables that use system-versioning implicitly add the row_end column to the\nPrimary Key. While this is generally not an issue for most use cases, it can\nlead to problems when re-applying write statements from the binary log or in\nreplication environments, where a primary retries an SQL statement on the\nreplica.\n\nSpecifically, these writes include a value on the row_end column containing\nthe timestamp from when the write was initially made. The re-occurrence of the\nPrimary Key with the old system-versioning columns raises an error due to the\nduplication.\n\nTo mitigate this with MariaDB Replication, set the secure_timestamp system\nvariable to YES on the replica. When set, the replica uses its own system\nclock when applying to the row log, meaning that the primary can retry as many\ntimes as needed without causing a conflict. The retries generate new\nhistorical rows with new values for the row_start and row_end columns.\n\nTransaction-Precise History in InnoDB\n-------------------------------------\n\nA point in time when a row was inserted or deleted does not necessarily mean\nthat a change became visible at the same moment. With transactional tables, a\nrow might have been inserted in a long transaction, and became visible hours\nafter it was inserted.\n\nFor some applications — for example, when doing data analytics on one-year-old\ndata — this distinction does not matter much. For others — forensic analysis —\nit might be crucial.\n\nMariaDB supports transaction-precise history (only for the InnoDB storage\nengine) that allows seeing the data exactly as it would\'ve been seen by a new\nconnection doing a SELECT at the specified point in time — rows inserted\nbefore that point, but committed after will not be shown.\n\nTo use transaction-precise history, InnoDB needs to remember not timestamps,\nbut transaction identifier per row. This is done by creating generated columns\nas BIGINT UNSIGNED, not TIMESTAMP(6):\n\nCREATE TABLE t(\n x INT,\n start_trxid BIGINT UNSIGNED GENERATED ALWAYS AS ROW START,\n end_trxid BIGINT UNSIGNED GENERATED ALWAYS AS ROW END,\n PERIOD FOR SYSTEM_TIME(start_trxid, end_trxid)\n) WITH SYSTEM VERSIONING;\n\nThese columns must be specified explicitly, but they can be made INVISIBLE to\navoid cluttering SELECT * output.\n\nWhen one uses transaction-precise history, one can optionally use transaction\nidentifiers in the FOR SYSTEM_TIME clause:\n\nSELECT * FROM t FOR SYSTEM_TIME AS OF TRANSACTION 12345;\n\nThis will show the data, exactly as it was seen by the transaction with the\nidentifier 12345.\n\nStoring the History Separately\n------------------------------\n\nWhen the history is stored together with the current data, it increases the\nsize of the table, so current data queries — table scans and index searches —\nwill take more time, because they will need to skip over historical data. If\nmost queries on that table use only current data, it might make sense to store\nthe history separately, to reduce the overhead from versioning.\n\nThis is done by partitioning the table by SYSTEM_TIME. Because of the\npartition pruning optimization, all current data queries will only access one\npartition, the one that stores current data.\n\nThis example shows how to create such a partitioned table:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME (\n PARTITION p_hist HISTORY,\n PARTITION p_cur CURRENT\n );\n\nIn this example all history will be stored in the partition p_hist while all\ncurrent data will be in the partition p_cur. The table must have exactly one\ncurrent partition and at least one historical partition.\n\nPartitioning by SYSTEM_TIME also supports automatic partition rotation. One\ncan rotate historical partitions by time or by size. This example shows how to\nrotate partitions by size:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME LIMIT 100000 (\n PARTITION p0 HISTORY,\n PARTITION p1 HISTORY,\n PARTITION pcur CURRENT\n );\n\nMariaDB will start writing history rows into partition p0, and when it reaches\na size of 100000 rows, MariaDB will switch to partition p1. There are only two\nhistorical partitions, so when p1 overflows, MariaDB will issue a warning, but\nwill continue writing into it.\n\nSimilarly, one can rotate partitions by time:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 WEEK (\n PARTITION p0 HISTORY,\n PARTITION p1 HISTORY,\n PARTITION p2 HISTORY,\n PARTITION pcur CURRENT\n );\n\nThis means that the history for the first week after the table was created\nwill be stored in p0. The history for the second week — in p1, and all later\nhistory will go into p2. One can see the exact rotation time for each\npartition in the INFORMATION_SCHEMA.PARTITIONS table.\n\nIt is possible to combine partitioning by SYSTEM_TIME and subpartitions:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME\n SUBPARTITION BY KEY (x)\n SUBPARTITIONS 4 (\n PARTITION ph HISTORY,\n PARTITION pc CURRENT\n );\n\nDefault Partitions\n------------------\n\nMariaDB starting with 10.5.0\n----------------------------\nSince partitioning by current and historical data is such a typical usecase,\nfrom MariaDB 10.5, it is possible to use a simplified statement to do so. For\nexample, instead of\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING \n PARTITION BY SYSTEM_TIME (\n PARTITION p0 HISTORY,\n PARTITION pn CURRENT\n);\n\nyou can use\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING \n PARTITION BY SYSTEM_TIME;\n\nYou can also specify the number of partitions, which is useful if you want to\nrotate history by time, for example:\n\nCREATE TABLE t (x INT) WITH SYSTEM VERSIONING \n PARTITION BY SYSTEM_TIME\n INTERVAL 1 MONTH\n PARTITIONS 12;\n\nSpecifying the number of partitions without specifying a rotation condition\nwill result in a warning:\n\nCREATE OR REPLACE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME PARTITIONS 12;\nQuery OK, 0 rows affected, 1 warning (0.518 sec)\n\nWarning (Code 4115): Maybe missing parameters: no rotation condition for\nmultiple HISTORY partitions.\n\nwhile specifying only 1 partition will result in an error:\n\nCREATE OR REPLACE TABLE t (x INT) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME PARTITIONS 1;\nERROR 4128 (HY000): Wrong partitions for `t`: must have at least one HISTORY\nand exactly one last CURRENT\n\nAutomatically Creating Partitions\n---------------------------------\n\nMariaDB starting with 10.9.1\n----------------------------\nFrom MariaDB 10.9.1, the AUTO keyword can be used to automatically create\nhistory partitions.\n\nFor example\n\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR AUTO;\n','','https://mariadb.com/kb/en/system-versioned-tables/');
+update help_topic set description = CONCAT(description, '\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 MONTH\n STARTS \'2021-01-01 00:00:00\' AUTO PARTITIONS 12;\n\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME LIMIT 1000 AUTO;\n\nOr with explicit partitions:\n\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR AUTO\n (PARTITION p0 HISTORY, PARTITION pn CURRENT);\n\nTo disable or enable auto-creation one can use ALTER TABLE by adding or\nremoving AUTO from the partitioning specification:\n\nCREATE TABLE t1 (x int) WITH SYSTEM VERSIONING\n PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR AUTO;\n\n# Disables auto-creation:\nALTER TABLE t1 PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR;\n\n# Enables auto-creation:\nALTER TABLE t1 PARTITION BY SYSTEM_TIME INTERVAL 1 HOUR AUTO;\n\nIf the rest of the partitioning specification is identical to CREATE TABLE, no\nrepartitioning will be done (for details see MDEV-27328).\n\nRemoving Old History\n--------------------\n\nBecause it stores all the history, a system-versioned table might grow very\nlarge over time. There are many options to trim down the space and remove the\nold history.\n\nOne can completely drop the versioning from the table and add it back again,\nthis will delete all the history:\n\nALTER TABLE t DROP SYSTEM VERSIONING;\nALTER TABLE t ADD SYSTEM VERSIONING;\n\nIt might be a rather time-consuming operation, though, as the table will need\nto be rebuilt, possibly twice (depending on the storage engine).\n\nAnother option would be to use partitioning and drop some of historical\npartitions:\n\nALTER TABLE t DROP PARTITION p0;\n\nNote, that one cannot drop a current partition or the only historical\npartition.\n\nAnd the third option; one can use a variant of the DELETE statement to prune\nthe history:\n\nDELETE HISTORY FROM t;\n\nor only old history up to a specific point in time:\n\nDELETE HISTORY FROM t BEFORE SYSTEM_TIME \'2016-10-09 08:07:06\';\n\nor to a specific transaction (with BEFORE SYSTEM_TIME TRANSACTION xxx).\n\nTo protect the integrity of the history, this statement requires a special\nDELETE HISTORY privilege.\n\nCurrently, using the DELETE HISTORY statement with a BEFORE SYSTEM_TIME\ngreater than the ROW_END of the active records (as a TIMESTAMP, this has a\nmaximum value of \'2038-01-19 03:14:07\' UTC) will result in the historical\nrecords being dropped, and the active records being deleted and moved to\nhistory. See MDEV-25468.\n\nPrior to MariaDB 10.4.5, the TRUNCATE TABLE statement drops all historical\nrecords from a system-versioned-table.\n\nFrom MariaDB 10.4.5, historic data is protected from TRUNCATE statements, as\nper the SQL standard, and an Error 4137 is instead raised:\n\nTRUNCATE t;\nERROR 4137 (HY000): System-versioned tables do not support TRUNCATE TABLE\n\nExcluding Columns From Versioning\n---------------------------------\n\nAnother MariaDB extension allows to version only a subset of columns in a\ntable. This is useful, for example, if you have a table with user information\nthat should be versioned, but one column is, let\'s say, a login counter that\nis incremented often and is not interesting to version. Such a column can be\nexcluded from versioning by declaring it WITHOUT VERSIONING\n\nCREATE TABLE t (\n x INT,\n y INT WITHOUT SYSTEM VERSIONING\n) WITH SYSTEM VERSIONING;\n\nA column can also be declared WITH VERSIONING, that will automatically make\nthe table versioned. The statement below is equivalent to the one above:\n\nCREATE TABLE t (\n x INT WITH SYSTEM VERSIONING,\n y INT\n);\n\nChanges in other sections: https://mariadb.com/kb/en/create-table/\nhttps://mariadb.com/kb/en/alter-table/ https://mariadb.com/kb/en/join-syntax/\nhttps://mariadb.com/kb/en/partitioning-types-overview/\nhttps://mariadb.com/kb/en/date-and-time-units/\nhttps://mariadb.com/kb/en/delete/ https://mariadb.com/kb/en/grant/\n\nthey all reference back to this page\n\nAlso, TODO:\n\n* limitations (size, speed, adding history to unique not nullable columns)\n\nSystem Variables\n----------------\n\nThere are a number of system variables related to system-versioned tables:\n\nsystem_versioning_alter_history\n-------------------------------\n\n* Description: SQL:2011 does not allow ALTER TABLE on system-versioned tables.\nWhen this variable is set to ERROR, an attempt to alter a system-versioned\ntable will result in an error. When this variable is set to KEEP, ALTER TABLE\nwill be allowed, but the history will become incorrect — querying historical\ndata will show the new table structure. This mode is still useful, for\nexample, when adding new columns to a table. Note that if historical data\ncontains or would contain nulls, attempting to ALTER these columns to be NOT\nNULL will return an error (or warning if strict_mode is not set).\n* Commandline: --system-versioning-alter-history=value\n* Scope: Global, Session\n* Dynamic: Yes\n* Type: Enum\n* Default Value: ERROR\n* Valid Values: ERROR, KEEP\n\nsystem_versioning_asof\n----------------------\n\n* Description: If set to a specific timestamp value, an implicit FOR\nSYSTEM_TIME AS OF clause will be applied to all queries. This is useful if one\nwants to do many queries for history at the specific point in time. Set it to\nDEFAULT to restore the default behavior. Has no effect on DML, so queries such\nas INSERT .. SELECT and REPLACE .. SELECT need to state AS OF explicitly.\n* Commandline: None\n* Scope: Global, Session\n* Dynamic: Yes\n* Type: Varchar\n* Default Value: DEFAULT\n\nsystem_versioning_innodb_algorithm_simple\n-----------------------------------------\n\n* Description: Never fully implemented and removed in the following release.\n* Commandline: --system-versioning-innodb-algorithm-simple[={0|1}]\n* Scope: Global, Session\n* Dynamic: Yes\n* Type: Boolean\n* Default Value: ON\n* Introduced: MariaDB 10.3.4\n* Removed: MariaDB 10.3.5\n\nsystem_versioning_insert_history\n--------------------------------\n\n* Description: Allows direct inserts into ROW_START and ROW_END columns if\nsecure_timestamp allows changing timestamp.\n* Commandline: --system-versioning-insert-history[={0|1}]\n* Scope: Global, Session\n* Dynamic: Yes\n* Type: Boolean\n* Default Value: OFF\n* Introduced: MariaDB 10.11.0\n\nLimitations\n-----------\n\n* Versioning clauses can not be applied to generated (virtual and persistent)\ncolumns.\n* Before MariaDB 10.11, mariadb-dump did not read historical rows from\nversioned tables, and so historical data would not be backed up. Also, a\nrestore of the timestamps would not be possible as they cannot be defined by\nan insert/a user. From MariaDB 10.11, use the -H or --dump-history options to\ninclude the history.\n\nURL: https://mariadb.com/kb/en/system-versioned-tables/') WHERE help_topic_id = 809;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (810,45,'Application-Time Periods','MariaDB starting with 10.4.3\n----------------------------\nSupport for application-time period-versioning was added in MariaDB 10.4.3.\n\nExtending system-versioned tables, MariaDB 10.4 supports application-time\nperiod tables. Time periods are defined by a range between two temporal\ncolumns. The columns must be of the same temporal data type, i.e. DATE,\nTIMESTAMP or DATETIME (TIME and YEAR are not supported), and of the same width.\n\nUsing time periods implicitly defines the two columns as NOT NULL. It also\nadds a constraint to check whether the first value is less than the second\nvalue. The constraint is invisible to SHOW CREATE TABLE statements. The name\nof this constraint is prefixed by the time period name, to avoid conflict with\nother constraints.\n\nCreating Tables with Time Periods\n---------------------------------\n\nTo create a table with a time period, use a CREATE TABLE statement with the\nPERIOD table option.\n\nCREATE TABLE t1(\n name VARCHAR(50),\n date_1 DATE,\n date_2 DATE,\n PERIOD FOR date_period(date_1, date_2));\n\nThis creates a table with a time_period period and populates the table with\nsome basic temporal values.\n\nExamples are available in the MariaDB Server source code, at\nmysql-test/suite/period/r/create.result.\n\nAdding and Removing Time Periods\n--------------------------------\n\nThe ALTER TABLE statement now supports syntax for adding and removing time\nperiods from a table. To add a period, use the ADD PERIOD clause.\n\nFor example:\n\nCREATE OR REPLACE TABLE rooms (\n room_number INT,\n guest_name VARCHAR(255),\n checkin DATE,\n checkout DATE\n );\n\nALTER TABLE rooms ADD PERIOD FOR p(checkin,checkout);\n\nTo remove a period, use the DROP PERIOD clause:\n\nALTER TABLE rooms DROP PERIOD FOR p;\n\nBoth ADD PERIOD and DROP PERIOD clauses include an option to handle whether\nthe period already exists:\n\nALTER TABLE rooms ADD PERIOD IF NOT EXISTS FOR p(checkin,checkout);\n\nALTER TABLE rooms DROP PERIOD IF EXISTS FOR p;\n\nDeletion by Portion\n-------------------\n\nYou can also remove rows that fall within certain time periods.\n\nWhen MariaDB executes a DELETE FOR PORTION statement, it removes the row:\n\n* When the row period falls completely within the delete period, it removes\nthe row.\n* When the row period overlaps the delete period, it shrinks the row, removing\nthe overlap from the first or second row period value.\n* When the delete period falls completely within the row period, it splits the\nrow into two rows. The first row runs from the starting row period to the\nstarting delete period. The second runs from the ending delete period to the\nending row period.\n\nTo test this, first populate the table with some data to operate on:\n\nCREATE TABLE t1(\n name VARCHAR(50),\n date_1 DATE,\n date_2 DATE,\n PERIOD FOR date_period(date_1, date_2));\n\nINSERT INTO t1 (name, date_1, date_2) VALUES\n (\'a\', \'1999-01-01\', \'2000-01-01\'),\n (\'b\', \'1999-01-01\', \'2018-12-12\'),\n (\'c\', \'1999-01-01\', \'2017-01-01\'),\n (\'d\', \'2017-01-01\', \'2019-01-01\');\n\nSELECT * FROM t1;\n+------+------------+------------+\n| name | date_1 | date_2 |\n+------+------------+------------+\n| a | 1999-01-01 | 2000-01-01 |\n| b | 1999-01-01 | 2018-12-12 |\n| c | 1999-01-01 | 2017-01-01 |\n| d | 2017-01-01 | 2019-01-01 |\n+------+------------+------------+\n\nThen, run the DELETE FOR PORTION statement:\n\nDELETE FROM t1\nFOR PORTION OF date_period\n FROM \'2001-01-01\' TO \'2018-01-01\';\nQuery OK, 3 rows affected (0.028 sec)\n\nSELECT * FROM t1 ORDER BY name;\n+------+------------+------------+\n| name | date_1 | date_2 |\n+------+------------+------------+\n| a | 1999-01-01 | 2000-01-01 |\n| b | 1999-01-01 | 2001-01-01 |\n| b | 2018-01-01 | 2018-12-12 |\n| c | 1999-01-01 | 2001-01-01 |\n| d | 2018-01-01 | 2019-01-01 |\n+------+------------+------------+\n\nHere:\n\n* a is unchanged, as the range falls entirely out of the specified portion to\nbe deleted.\n* b, with values ranging from 1999 to 2018, is split into two rows, 1999 to\n2000 and 2018-01 to 2018-12.\n* c, with values ranging from 1999 to 2017, where only the upper value falls\nwithin the portion to be deleted, has been shrunk to 1999 to 2001.\n* d, with values ranging from 2017 to 2019, where only the lower value falls\nwithin the portion to be deleted, has been shrunk to 2018 to 2019.\n\nThe DELETE FOR PORTION statement has the following restrictions\n\n* The FROM...TO clause must be constant\n* Multi-delete is not supported\n\nIf there are DELETE or INSERT triggers, it works as follows: any matched row\nis deleted, and then one or two rows are inserted. If the record is deleted\ncompletely, nothing is inserted.\n\nUpdating by Portion\n-------------------\n\nThe UPDATE syntax now supports UPDATE FOR PORTION, which modifies rows based\non their occurrence in a range:\n\nTo test it, first populate the table with some data:\n\nTRUNCATE t1;\n\nINSERT INTO t1 (name, date_1, date_2) VALUES\n (\'a\', \'1999-01-01\', \'2000-01-01\'),\n (\'b\', \'1999-01-01\', \'2018-12-12\'),\n (\'c\', \'1999-01-01\', \'2017-01-01\'),\n (\'d\', \'2017-01-01\', \'2019-01-01\');\n\nSELECT * FROM t1;\n+------+------------+------------+\n| name | date_1 | date_2 |\n+------+------------+------------+\n| a | 1999-01-01 | 2000-01-01 |\n| b | 1999-01-01 | 2018-12-12 |\n| c | 1999-01-01 | 2017-01-01 |\n| d | 2017-01-01 | 2019-01-01 |\n+------+------------+------------+\n\nThen run the update:\n\nUPDATE t1 FOR PORTION OF date_period\n FROM \'2000-01-01\' TO \'2018-01-01\'\nSET name = CONCAT(name,\'_original\');\n\nSELECT * FROM t1 ORDER BY name;\n+------------+------------+------------+\n| name | date_1 | date_2 |\n+------------+------------+------------+\n| a | 1999-01-01 | 2000-01-01 |\n| b | 1999-01-01 | 2000-01-01 |\n| b | 2018-01-01 | 2018-12-12 |\n| b_original | 2000-01-01 | 2018-01-01 |\n| c | 1999-01-01 | 2000-01-01 |\n| c_original | 2000-01-01 | 2017-01-01 |\n| d | 2018-01-01 | 2019-01-01 |\n| d_original | 2017-01-01 | 2018-01-01 |\n+------------+------------+------------+\n\n* a is unchanged, as the range falls entirely out of the specified portion to\nbe deleted.\n* b, with values ranging from 1999 to 2018, is split into two rows, 1999 to\n2000 and 2018-01 to 2018-12.\n* c, with values ranging from 1999 to 2017, where only the upper value falls\nwithin the portion to be deleted, has been shrunk to 1999 to 2001.\n* d, with values ranging from 2017 to 2019, where only the lower value falls\nwithin the portion to be deleted, has been shrunk to 2018 to 2019. \n* Original rows affected by the update have \"_original\" appended to the name.\n\nThe UPDATE FOR PORTION statement has the following limitations:\n\n* The operation cannot modify the two temporal columns used by the time period\n* The operation cannot reference period values in the SET expression\n* FROM...TO expressions must be constant\n\nWITHOUT OVERLAPS\n----------------\n\nMariaDB starting with 10.5.3\n----------------------------\nMariaDB 10.5 introduced a new clause, WITHOUT OVERLAPS, which allows one to\ncreate an index specifying that application time periods should not overlap.\n\nAn index constrained by WITHOUT OVERLAPS is required to be either a primary\nkey or a unique index.\n\nTake the following example, an application time period table for a booking\nsystem:\n\nCREATE OR REPLACE TABLE rooms (\n room_number INT,\n guest_name VARCHAR(255),\n checkin DATE,\n checkout DATE,\n PERIOD FOR p(checkin,checkout)\n );\n\nINSERT INTO rooms VALUES \n (1, \'Regina\', \'2020-10-01\', \'2020-10-03\'),\n (2, \'Cochise\', \'2020-10-02\', \'2020-10-05\'),\n (1, \'Nowell\', \'2020-10-03\', \'2020-10-07\'),\n (2, \'Eusebius\', \'2020-10-04\', \'2020-10-06\');\n\nOur system is not intended to permit overlapping bookings, so the fourth\nrecord above should not have been inserted. Using WITHOUT OVERLAPS in a unique\nindex (in this case based on a combination of room number and the application\ntime period) allows us to specify this constraint in the table definition.\n\nCREATE OR REPLACE TABLE rooms (\n room_number INT,\n guest_name VARCHAR(255),\n checkin DATE,\n checkout DATE,\n PERIOD FOR p(checkin,checkout),\n UNIQUE (room_number, p WITHOUT OVERLAPS)\n );\n\nINSERT INTO rooms VALUES \n (1, \'Regina\', \'2020-10-01\', \'2020-10-03\'),\n (2, \'Cochise\', \'2020-10-02\', \'2020-10-05\'),\n (1, \'Nowell\', \'2020-10-03\', \'2020-10-07\'),\n (2, \'Eusebius\', \'2020-10-04\', \'2020-10-06\');\nERROR 1062 (23000): Duplicate entry \'2-2020-10-06-2020-10-04\' for key\n\'room_number\'\n\nFurther Examples\n----------------\n\nThe implicit change from NULL to NOT NULL:\n\nCREATE TABLE `t2` (\n `id` int(11) DEFAULT NULL,\n `d1` datetime DEFAULT NULL,\n `d2` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\nALTER TABLE t2 ADD PERIOD FOR p(d1,d2);\n\nSHOW CREATE TABLE t2\\G\n*************************** 1. row ***************************\n Table: t2\nCreate Table: CREATE TABLE `t2` (\n `id` int(11) DEFAULT NULL,\n `d1` datetime NOT NULL,\n `d2` datetime NOT NULL,\n PERIOD FOR `p` (`d1`, `d2`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n\nDue to this constraint, trying to add a time period where null data already\nexists will fail.\n\nCREATE OR REPLACE TABLE `t2` (\n `id` int(11) DEFAULT NULL,\n `d1` datetime DEFAULT NULL,\n `d2` datetime DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\nINSERT INTO t2(id) VALUES(1);\n\nALTER TABLE t2 ADD PERIOD FOR p(d1,d2);\nERROR 1265 (01000): Data truncated for column \'d1\' at row 1\n\nURL: https://mariadb.com/kb/en/application-time-periods/','','https://mariadb.com/kb/en/application-time-periods/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (811,45,'Bitemporal Tables','MariaDB starting with 10.4.3\n----------------------------\nBitemporal tables are tables that use versioning both at the system and\napplication-time period levels.\n\nUsing Bitemporal Tables\n-----------------------\n\nTo create a bitemporal table, use:\n\nCREATE TABLE test.t3 (\n date_1 DATE,\n date_2 DATE,\n row_start TIMESTAMP(6) AS ROW START INVISIBLE,\n row_end TIMESTAMP(6) AS ROW END INVISIBLE,\n PERIOD FOR application_time(date_1, date_2),\n PERIOD FOR system_time(row_start, row_end))\nWITH SYSTEM VERSIONING;\n\nNote that, while system_time here is also a time period, it cannot be used in\nDELETE FOR PORTION or UPDATE FOR PORTION statements.\n\nDELETE FROM test.t3 \nFOR PORTION OF system_time \n FROM \'2000-01-01\' TO \'2018-01-01\';\nERROR 42000: You have an error in your SQL syntax; check the manual that\ncorresponds \n to your MariaDB server version for the right syntax to use near\n \'of system_time from \'2000-01-01\' to \'2018-01-01\'\' at line 1\n\nURL: https://mariadb.com/kb/en/bitemporal-tables/','','https://mariadb.com/kb/en/bitemporal-tables/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (812,46,'ST_AsGeoJSON','Syntax\n------\n\nST_AsGeoJSON(g[, max_decimals[, options]])\n\nDescription\n-----------\n\nReturns the given geometry g as a GeoJSON element. The optional max_decimals\nlimits the maximum number of decimals displayed.\n\nThe optional options flag can be set to 1 to add a bounding box to the output.\n\nExamples\n--------\n\nSELECT ST_AsGeoJSON(ST_GeomFromText(\'POINT(5.3 7.2)\'));\n+-------------------------------------------------+\n| ST_AsGeoJSON(ST_GeomFromText(\'POINT(5.3 7.2)\')) |\n+-------------------------------------------------+\n| {\"type\": \"Point\", \"coordinates\": [5.3, 7.2]} |\n+-------------------------------------------------+\n\nURL: https://mariadb.com/kb/en/geojson-st_asgeojson/','','https://mariadb.com/kb/en/geojson-st_asgeojson/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (813,46,'ST_GeomFromGeoJSON','MariaDB starting with 10.2.4\n----------------------------\nST_GeomFromGeoJSON was added in MariaDB 10.2.4\n\nSyntax\n------\n\nST_GeomFromGeoJSON(g[, option])\n\nDescription\n-----------\n\nGiven a GeoJSON input g, returns a geometry object. The option specifies what\nto do if g contains geometries with coordinate dimensions higher than 2.\n\n+---------------------------+------------------------------------------------+\n| Option | Description |\n+---------------------------+------------------------------------------------+\n| 1 | Return an error (the default) |\n+---------------------------+------------------------------------------------+\n| 2 - 4 | The document is accepted, but the coordinates |\n| | for higher coordinate dimensions are stripped |\n| | off. |\n+---------------------------+------------------------------------------------+\n\nNote that this function did not work correctly before MariaDB 10.2.8 - see\nMDEV-12180.\n\nExamples\n--------\n\nSET @j = \'{ \"type\": \"Point\", \"coordinates\": [5.3, 15.0]}\';\n\nSELECT ST_AsText(ST_GeomFromGeoJSON(@j));\n+-----------------------------------+\n| ST_AsText(ST_GeomFromGeoJSON(@j)) |\n+-----------------------------------+\n| POINT(5.3 15) |\n+-----------------------------------+\n\nURL: https://mariadb.com/kb/en/st_geomfromgeojson/','','https://mariadb.com/kb/en/st_geomfromgeojson/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (814,47,'Operator Precedence','The precedence is the order in which the SQL operators are evaluated.\n\nThe following list shows the SQL operator precedence. Operators that appear\nfirst in the list have a higher precedence. Operators which are listed\ntogether have the same precedence.\n\n* INTERVAL\n* BINARY, COLLATE\n* !\n* - (unary minus), [[bitwise-not|]] (unary bit inversion)\n* || (string concatenation)\n* ^\n* *, /, DIV, %, MOD\n* -, +\n* <<, >>\n* &\n* |\n* = (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN\n* BETWEEN, CASE, WHEN, THEN, ELSE, END\n* NOT\n* &&, AND\n* XOR\n* || (logical or), OR\n* = (assignment), :=\n\nFunctions precedence is always higher than operators precedence.\n\nIn this page CASE refers to the CASE operator, not to the CASE statement.\n\nIf the HIGH_NOT_PRECEDENCE SQL_MODE is set, NOT has the same precedence as !.\n\nThe || operator\'s precedence, as well as its meaning, depends on the\nPIPES_AS_CONCAT SQL_MODE flag: if it is on, || can be used to concatenate\nstrings (like the CONCAT() function) and has a higher precedence.\n\nThe = operator\'s precedence depends on the context - it is higher when = is\nused as a comparison operator.\n\nParenthesis can be used to modify the operators precedence in an expression.\n\nShort-circuit evaluation\n------------------------\n\nThe AND, OR, && and || operators support short-circuit evaluation. This means\nthat, in some cases, the expression on the right of those operators is not\nevaluated, because its result cannot affect the result. In the following\ncases, short-circuit evaluation is used and x() is not evaluated:\n\n* FALSE AND x()\n* FALSE && x()\n* TRUE OR x()\n* TRUE || x()\n* NULL BETWEEN x() AND x()\n\nNote however that the short-circuit evaluation does not apply to NULL AND x().\nAlso, BETWEEN\'s right operands are not evaluated if the left operand is NULL,\nbut in all other cases all the operands are evaluated.\n\nThis is a speed optimization. Also, since functions can have side-effects,\nthis behavior can be used to choose whether execute them or not using a\nconcise syntax:\n\nSELECT some_function() OR log_error();\n\nURL: https://mariadb.com/kb/en/operator-precedence/','','https://mariadb.com/kb/en/operator-precedence/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (815,48,'Addition Operator (+)','Syntax\n------\n\n+\n\nDescription\n-----------\n\nAddition.\n\nIf both operands are integers, the result is calculated with BIGINT precision.\nIf either integer is unsigned, the result is also an unsigned integer.\n\nFor real or string operands, the operand with the highest precision determines\nthe result precision.\n\nExamples\n--------\n\nSELECT 3+5;\n+-----+\n| 3+5 |\n+-----+\n| 8 |\n+-----+\n\nURL: https://mariadb.com/kb/en/addition-operator/','','https://mariadb.com/kb/en/addition-operator/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (816,48,'Division Operator (/)','Syntax\n------\n\n/\n\nDescription\n-----------\n\nDivision operator. Dividing by zero will return NULL. By default, returns four\ndigits after the decimal. This is determined by the server system variable\ndiv_precision_increment which by default is four. It can be set from 0 to 30.\n\nDividing by zero returns NULL. If the ERROR_ON_DIVISION_BY_ZERO SQL_MODE is\nused (the default since MariaDB 10.2.4), a division by zero also produces a\nwarning.\n\nExamples\n--------\n\nSELECT 4/5;\n+--------+\n| 4/5 |\n+--------+\n| 0.8000 |\n+--------+\n\nSELECT 300/(2-2);\n+-----------+\n| 300/(2-2) |\n+-----------+\n| NULL |\n+-----------+\n\nSELECT 300/7;\n+---------+\n| 300/7 |\n+---------+\n| 42.8571 |\n+---------+\n\nChanging div_precision_increment for the session from the default of four to\nsix:\n\nSET div_precision_increment = 6;\n\nSELECT 300/7;\n+-----------+\n| 300/7 |\n+-----------+\n| 42.857143 |\n+-----------+\n\nSELECT 300/7;\n+-----------+\n| 300/7 |\n+-----------+\n| 42.857143 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/division-operator/','','https://mariadb.com/kb/en/division-operator/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (817,48,'Modulo Operator (%)','Syntax\n------\n\nN % M\n\nDescription\n-----------\n\nModulo operator. Returns the remainder of N divided by M. See also MOD.\n\nExamples\n--------\n\nSELECT 1042 % 50;\n+-----------+\n| 1042 % 50 |\n+-----------+\n| 42 |\n+-----------+\n\nURL: https://mariadb.com/kb/en/modulo-operator/','','https://mariadb.com/kb/en/modulo-operator/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (818,48,'Multiplication Operator (*)','Syntax\n------\n\n*\n\nDescription\n-----------\n\nMultiplication operator.\n\nExamples\n--------\n\nSELECT 7*6;\n+-----+\n| 7*6 |\n+-----+\n| 42 |\n+-----+\n\nSELECT 1234567890*9876543210;\n+-----------------------+\n| 1234567890*9876543210 |\n+-----------------------+\n| -6253480962446024716 |\n+-----------------------+\n\nSELECT 18014398509481984*18014398509481984.0;\n+---------------------------------------+\n| 18014398509481984*18014398509481984.0 |\n+---------------------------------------+\n| 324518553658426726783156020576256.0 |\n+---------------------------------------+\n\nSELECT 18014398509481984*18014398509481984;\n+-------------------------------------+\n| 18014398509481984*18014398509481984 |\n+-------------------------------------+\n| 0 |\n+-------------------------------------+\n\nURL: https://mariadb.com/kb/en/multiplication-operator/','','https://mariadb.com/kb/en/multiplication-operator/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (819,48,'Subtraction Operator (-)','Syntax\n------\n\n-\n\nDescription\n-----------\n\nSubtraction. The operator is also used as the unary minus for changing sign.\n\nIf both operands are integers, the result is calculated with BIGINT precision.\nIf either integer is unsigned, the result is also an unsigned integer, unless\nthe NO_UNSIGNED_SUBTRACTION SQL_MODE is enabled, in which case the result is\nalways signed.\n\nFor real or string operands, the operand with the highest precision determines\nthe result precision.\n\nExamples\n--------\n\nSELECT 96-9;\n+------+\n| 96-9 |\n+------+\n| 87 |\n+------+\n\nSELECT 15-17;\n+-------+\n| 15-17 |\n+-------+\n| -2 |\n+-------+\n\nSELECT 3.66 + 1.333;\n+--------------+\n| 3.66 + 1.333 |\n+--------------+\n| 4.993 |\n+--------------+\n\nUnary minus:\n\nSELECT - (3+5);\n+---------+\n| - (3+5) |\n+---------+\n| -8 |\n+---------+\n\nURL: https://mariadb.com/kb/en/subtraction-operator-/','','https://mariadb.com/kb/en/subtraction-operator-/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (820,49,'CHANGE MASTER TO','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nCHANGE MASTER [\'connection_name\'] TO master_def [, master_def] ... \n [FOR CHANNEL \'channel_name\']\n\nmaster_def:\n MASTER_BIND = \'interface_name\'\n | MASTER_HOST = \'host_name\'\n | MASTER_USER = \'user_name\'\n | MASTER_PASSWORD = \'password\'\n | MASTER_PORT = port_num\n | MASTER_CONNECT_RETRY = interval\n | MASTER_HEARTBEAT_PERIOD = interval\n | MASTER_LOG_FILE = \'master_log_name\'\n | MASTER_LOG_POS = master_log_pos\n | RELAY_LOG_FILE = \'relay_log_name\'\n | RELAY_LOG_POS = relay_log_pos\n | MASTER_DELAY = interval\n | MASTER_SSL = {0|1}\n | MASTER_SSL_CA = \'ca_file_name\'\n | MASTER_SSL_CAPATH = \'ca_directory_name\'\n | MASTER_SSL_CERT = \'cert_file_name\'\n | MASTER_SSL_CRL = \'crl_file_name\'\n | MASTER_SSL_CRLPATH = \'crl_directory_name\'\n | MASTER_SSL_KEY = \'key_file_name\'\n | MASTER_SSL_CIPHER = \'cipher_list\'\n | MASTER_SSL_VERIFY_SERVER_CERT = {0|1}\n | MASTER_USE_GTID = {current_pos|slave_pos|no}\n | MASTER_DEMOTE_TO_SLAVE = bool\n | IGNORE_SERVER_IDS = (server_id_list)\n | DO_DOMAIN_IDS = ([N,..])\n | IGNORE_DOMAIN_IDS = ([N,..])\n\nDescription\n-----------\n\nThe CHANGE MASTER statement sets the options that a replica uses to connect to\nand replicate from a primary.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nto using the channel_name directly after CHANGE MASTER.\n\nMulti-Source Replication\n------------------------\n\nIf you are using multi-source replication, then you need to specify a\nconnection name when you execute CHANGE MASTER. There are two ways to do this:\n\n* Setting the default_master_connection system variable prior to executing\nCHANGE MASTER.\n* Setting the connection_name parameter when executing CHANGE MASTER.\n\ndefault_master_connection\n-------------------------\n\nSET default_master_connection = \'gandalf\';\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE;\n\nconnection_name\n---------------\n\nSTOP SLAVE \'gandalf\';\nCHANGE MASTER \'gandalf\' TO \n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE \'gandalf\';\n\nOptions\n-------\n\nConnection Options\n------------------\n\nMASTER_USER\n-----------\n\nThe MASTER_USER option for CHANGE MASTER defines the user account that the\nreplica will use to connect to the primary.\n\nThis user account will need the REPLICATION SLAVE privilege (or, from MariaDB\n10.5.1, the REPLICATION REPLICA on the primary.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_USER=\'repl\',\n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE;\n\nThe maximum length of the MASTER_USER string is 96 characters until MariaDB\n10.5, and 128 characters from MariaDB 10.6.\n\nMASTER_PASSWORD\n---------------\n\nThe MASTER_USER option for CHANGE MASTER defines the password that the replica\nwill use to connect to the primary as the user account defined by the\nMASTER_USER option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE;\n\nThe maximum length of the MASTER_PASSWORD string is 32 characters. The\neffective maximum length of the string depends on how many bytes are used per\ncharacter and can be up to 96 characters.\n\nDue to MDEV-29994, the password can be silently truncated to 41 characters\nwhen MariaDB is restarted. For this reason it is recommended to use a password\nthat is shorter than this.\n\nMASTER_HOST\n-----------\n\nThe MASTER_HOST option for CHANGE MASTER defines the hostname or IP address of\nthe primary.\n\nIf you set the value of the MASTER_HOST option to the empty string, then that\nis not the same as not setting the option\'s value at all. If you set the value\nof the MASTER_HOST option to the empty string, then the CHANGE MASTER command\nwill fail with an error. In MariaDB 5.3 and before, if you set the value of\nthe MASTER_HOST option to the empty string, then the CHANGE MASTER command\nwould succeed, but the subsequent START SLAVE command would fail.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_HOST=\'dbserver1.example.com\',\n MASTER_USER=\'repl\',\n MASTER_PASSWORD=\'new3cret\',\n MASTER_USE_GTID=slave_pos;\nSTART SLAVE;\n\nIf you set the value of the MASTER_HOST option in a CHANGE MASTER command,\nthen the replica assumes that the primary is different from before, even if\nyou set the value of this option to the same value it had previously. In this\nscenario, the replica will consider the old values for the primary\'s binary\nlog file name and position to be invalid for the new primary. As a side\neffect, if you do not explicitly set the values of the MASTER_LOG_FILE and\nMASTER_LOG_POS options in the statement, then the statement will be implicitly\nappended with MASTER_LOG_FILE=\'\' and MASTER_LOG_POS=4. However, if you enable\nGTID mode for replication by setting the MASTER_USE_GTID option to some value\nother than no in the statement, then these values will effectively be ignored\nanyway.\n\nReplicas cannot connect to primaries using Unix socket files or Windows named\npipes. The replica must connect to the primary using TCP/IP.\n\nThe maximum length of the MASTER_HOST string is 60 characters until MariaDB\n10.5, and 255 characters from MariaDB 10.6.\n\nMASTER_PORT\n-----------\n\nThe MASTER_PORT option for CHANGE MASTER defines the TCP/IP port of the\nprimary.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_HOST=\'dbserver1.example.com\',\n MASTER_PORT=3307,\n MASTER_USER=\'repl\',\n MASTER_PASSWORD=\'new3cret\',\n MASTER_USE_GTID=slave_pos;\nSTART SLAVE;\n\nIf you set the value of the MASTER_PORT option in a CHANGE MASTER command,\nthen the replica assumes that the primary is different from before, even if\nyou set the value of this option to the same value it had previously. In this\nscenario, the replica will consider the old values for the primary\'s binary\nlog file name and position to be invalid for the new primary. As a side\neffect, if you do not explicitly set the values of the MASTER_LOG_FILE and\nMASTER_LOG_POS options in the statement, then the statement will be implicitly\nappended with MASTER_LOG_FILE=\'\' and MASTER_LOG_POS=4. However, if you enable\nGTID mode for replication by setting the MASTER_USE_GTID option to some value\nother than no in the statement, then these values will effectively be ignored\nanyway.\n\nReplicas cannot connect to primaries using Unix socket files or Windows named\npipes. The replica must connect to the primary using TCP/IP.\n\nMASTER_CONNECT_RETRY\n--------------------\n\nThe MASTER_CONNECT_RETRY option for CHANGE MASTER defines how many seconds\nthat the replica will wait between connection retries. The default is 60.\n\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_CONNECT_RETRY=20;\nSTART SLAVE;\n\nThe number of connection attempts is limited by the master_retry_count option.\nIt can be set either on the command-line or in a server option group in an\noption file prior to starting up the server. For example:\n\n[mariadb]\n...\nmaster_retry_count=4294967295\n\nMASTER_BIND\n-----------\n\nThe MASTER_BIND option for CHANGE MASTER is only supported by MySQL 5.6.2 and\nlater and by MySQL NDB Cluster 7.3.1 and later. This option is not supported\nby MariaDB. See MDEV-19248 for more information.\n\nThe MASTER_BIND option for CHANGE MASTER can be used on replicas that have\nmultiple network interfaces to choose which network interface the replica will\nuse to connect to the primary.\n\nMASTER_HEARTBEAT_PERIOD\n-----------------------\n\nThe MASTER_HEARTBEAT_PERIOD option for CHANGE MASTER can be used to set the\ninterval in seconds between replication heartbeats. Whenever the primary\'s\nbinary log is updated with an event, the waiting period for the next heartbeat\nis reset.\n\nThis option\'s interval argument has the following characteristics:\n\n* It is a decimal value with a range of 0 to 4294967 seconds.\n* It has a resolution of hundredths of a second.\n* Its smallest valid non-zero value is 0.001.\n* Its default value is the value of the slave_net_timeout system variable\ndivided by 2.\n* If it\'s set to 0, then heartbeats are disabled.\n\nHeartbeats are sent by the primary only if there are no unsent events in the\nbinary log file for a period longer than the interval.\n\nIf the RESET SLAVE statement is executed, then the heartbeat interval is reset\nto the default.\n\nIf the slave_net_timeout system variable is set to a value that is lower than\nthe current heartbeat interval, then a warning will be issued.\n\nTLS Options\n-----------\n\nThe TLS options are used for providing information about TLS. The options can\nbe set even on replicas that are compiled without TLS support. The TLS options\nare saved to either the default master.info file or the file that is\nconfigured by the master_info_file option, but these TLS options are ignored\nunless the replica supports TLS.\n\nSee Replication with Secure Connections for more information.\n\nMASTER_SSL\n----------\n\nThe MASTER_SSL option for CHANGE MASTER tells the replica whether to force TLS\nfor the connection. The valid values are 0 or 1.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL=1;\nSTART SLAVE;\n\nMASTER_SSL_CA\n-------------\n\nThe MASTER_SSL_CA option for CHANGE MASTER defines a path to a PEM file that\nshould contain one or more X509 certificates for trusted Certificate\nAuthorities (CAs) to use for TLS. This option requires that you use the\nabsolute path, not a relative path. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\nSTART SLAVE;\n\nSee Secure Connections Overview: Certificate Authorities (CAs) for more\ninformation.\n\nThe maximum length of MASTER_SSL_CA string is 511 characters.\n\nMASTER_SSL_CAPATH\n-----------------\n\nThe MASTER_SSL_CAPATH option for CHANGE MASTER defines a path to a directory\nthat contains one or more PEM files that should each contain one X509\ncertificate for a trusted Certificate Authority (CA) to use for TLS. This\noption requires that you use the absolute path, not a relative path. The\ndirectory specified by this option needs to be run through the openssl rehash\ncommand. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CAPATH=\'/etc/my.cnf.d/certificates/ca/\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\nSTART SLAVE;\n\nSee Secure Connections Overview: Certificate Authorities (CAs) for more\ninformation.\n\nThe maximum length of MASTER_SSL_CA_PATH string is 511 characters.\n\nMASTER_SSL_CERT\n---------------\n\nThe MASTER_SSL_CERT option for CHANGE MASTER defines a path to the X509\ncertificate file to use for TLS. This option requires that you use the\nabsolute path, not a relative path. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\nSTART SLAVE;\n\nThe maximum length of MASTER_SSL_CERT string is 511 characters.\n\nMASTER_SSL_CRL\n--------------\n\nThe MASTER_SSL_CRL option for CHANGE MASTER defines a path to a PEM file that\nshould contain one or more revoked X509 certificates to use for TLS. This\noption requires that you use the absolute path, not a relative path.\n\nThis option is only supported if the server was built with OpenSSL. If the\nserver was built with yaSSL, then this option is not supported. See TLS and\nCryptography Libraries Used by MariaDB for more information about which\nlibraries are used on which platforms.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1,\n MASTER_SSL_CRL=\'/etc/my.cnf.d/certificates/crl.pem\';\nSTART SLAVE;\n\nSee Secure Connections Overview: Certificate Revocation Lists (CRLs) for more\ninformation.\n\nThe maximum length of MASTER_SSL_CRL string is 511 characters.\n\nMASTER_SSL_CRLPATH\n------------------\n\nThe MASTER_SSL_CRLPATH option for CHANGE MASTER defines a path to a directory\nthat contains one or more PEM files that should each contain one revoked X509\ncertificate to use for TLS. This option requires that you use the absolute\npath, not a relative path. The directory specified by this variable needs to\nbe run through the openssl rehash command.\n\nThis option is only supported if the server was built with OpenSSL. If the\nserver was built with yaSSL, then this option is not supported. See TLS and\nCryptography Libraries Used by MariaDB for more information about which\nlibraries are used on which platforms.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1,\n MASTER_SSL_CRLPATH=\'/etc/my.cnf.d/certificates/crl/\';\nSTART SLAVE;\n\nSee Secure Connections Overview: Certificate Revocation Lists (CRLs) for more\ninformation.\n\nThe maximum length of MASTER_SSL_CRL_PATH string is 511 characters.\n\nMASTER_SSL_KEY\n--------------\n\nThe MASTER_SSL_KEY option for CHANGE MASTER defines a path to a private key\nfile to use for TLS. This option requires that you use the absolute path, not\na relative path. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;','','https://mariadb.com/kb/en/change-master-to/');
+update help_topic set description = CONCAT(description, '\nSTART SLAVE;\n\nThe maximum length of MASTER_SSL_KEY string is 511 characters.\n\nMASTER_SSL_CIPHER\n-----------------\n\nThe MASTER_SSL_CIPHER option for CHANGE MASTER defines the list of permitted\nciphers or cipher suites to use for TLS. Besides cipher names, if MariaDB was\ncompiled with OpenSSL, this option could be set to \"SSLv3\" or \"TLSv1.2\" to\nallow all SSLv3 or all TLSv1.2 ciphers. Note that the TLSv1.3 ciphers cannot\nbe excluded when using OpenSSL, even by using this option. See Using TLSv1.3\nfor details. This option implies the MASTER_SSL option.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1,\n MASTER_SSL_CIPHER=\'TLSv1.2\';\nSTART SLAVE;\n\nThe maximum length of MASTER_SSL_CIPHER string is 511 characters.\n\nMASTER_SSL_VERIFY_SERVER_CERT\n-----------------------------\n\nThe MASTER_SSL_VERIFY_SERVER_CERT option for CHANGE MASTER enables server\ncertificate verification. This option is disabled by default.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\nSTART SLAVE;\n\nSee Secure Connections Overview: Server Certificate Verification for more\ninformation.\n\nBinary Log Options\n------------------\n\nThese options are related to the binary log position on the primary.\n\nMASTER_LOG_FILE\n---------------\n\nThe MASTER_LOG_FILE option for CHANGE MASTER can be used along with\nMASTER_LOG_POS to specify the coordinates at which the replica\'s I/O thread\nshould begin reading from the primary\'s binary logs the next time the thread\nstarts.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4;\nSTART SLAVE;\n\nThe MASTER_LOG_FILE and MASTER_LOG_POS options cannot be specified if the\nRELAY_LOG_FILE and RELAY_LOG_POS options were also specified.\n\nThe MASTER_LOG_FILE and MASTER_LOG_POS options are effectively ignored if you\nenable GTID mode for replication by setting the MASTER_USE_GTID option to some\nvalue other than no in the statement.\n\nMASTER_LOG_POS\n--------------\n\nThe MASTER_LOG_POS option for CHANGE MASTER can be used along with\nMASTER_LOG_FILE to specify the coordinates at which the replica\'s I/O thread\nshould begin reading from the primary\'s binary logs the next time the thread\nstarts.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4;\nSTART SLAVE;\n\nThe MASTER_LOG_FILE and MASTER_LOG_POS options cannot be specified if the\nRELAY_LOG_FILE and RELAY_LOG_POS options were also specified.\n\nThe MASTER_LOG_FILE and MASTER_LOG_POS options are effectively ignored if you\nenable GTID mode for replication by setting the MASTER_USE_GTID option to some\nvalue other than no in the statement.\n\nRelay Log Options\n-----------------\n\nThese options are related to the relay log position on the replica.\n\nRELAY_LOG_FILE\n--------------\n\nThe RELAY_LOG_FILE option for CHANGE MASTER can be used along with the\nRELAY_LOG_POS option to specify the coordinates at which the replica\'s SQL\nthread should begin reading from the relay log the next time the thread starts.\n\nThe CHANGE MASTER statement usually deletes all relay log files. However, if\nthe RELAY_LOG_FILE and/or RELAY_LOG_POS options are specified, then existing\nrelay log files are kept.\n\nWhen you want to change the relay log position, you only need to stop the\nreplica\'s SQL thread. The replica\'s I/O thread can continue running. The STOP\nSLAVE and START SLAVE statements support the SQL_THREAD option for this\nscenario. For example:\n\nSTOP SLAVE SQL_THREAD;\nCHANGE MASTER TO\n RELAY_LOG_FILE=\'slave-relay-bin.006\',\n RELAY_LOG_POS=4025;\nSTART SLAVE SQL_THREAD;\n\nWhen the value of this option is changed, the metadata about the replica\'s SQL\nthread\'s position in the relay logs will also be changed in the relay-log.info\nfile or the file that is configured by the relay_log_info_file system variable.\n\nThe RELAY_LOG_FILE and RELAY_LOG_POS options cannot be specified if the\nMASTER_LOG_FILE and MASTER_LOG_POS options were also specified.\n\nRELAY_LOG_POS\n-------------\n\nThe RELAY_LOG_POS option for CHANGE MASTER can be used along with the\nRELAY_LOG_FILE option to specify the coordinates at which the replica\'s SQL\nthread should begin reading from the relay log the next time the thread starts.\n\nThe CHANGE MASTER statement usually deletes all relay log files. However, if\nthe RELAY_LOG_FILE and/or RELAY_LOG_POS options are specified, then existing\nrelay log files are kept.\n\nWhen you want to change the relay log position, you only need to stop the\nreplica\'s SQL thread. The replica\'s I/O thread can continue running. The STOP\nSLAVE and START SLAVE statements support the SQL_THREAD option for this\nscenario. For example:\n\nSTOP SLAVE SQL_THREAD;\nCHANGE MASTER TO\n RELAY_LOG_FILE=\'slave-relay-bin.006\',\n RELAY_LOG_POS=4025;\nSTART SLAVE SQL_THREAD;\n\nWhen the value of this option is changed, the metadata about the replica\'s SQL\nthread\'s position in the relay logs will also be changed in the relay-log.info\nfile or the file that is configured by the relay_log_info_file system variable.\n\nThe RELAY_LOG_FILE and RELAY_LOG_POS options cannot be specified if the\nMASTER_LOG_FILE and MASTER_LOG_POS options were also specified.\n\nGTID Options\n------------\n\nMASTER_USE_GTID\n---------------\n\nThe MASTER_USE_GTID option for CHANGE MASTER can be used to configure the\nreplica to use the global transaction ID (GTID) when connecting to a primary.\nThe possible values are:\n\n* current_pos - Replicate in GTID mode and use gtid_current_pos as the\nposition to start downloading transactions from the primary. Deprecated from\nMariaDB 10.10. Using to transition to primary can break the replication state\nif the replica executes local transactions due to actively updating\ngtid_current_pos with gtid_binlog_pos and gtid_slave_pos. Use the new, safe,\nMASTER_DEMOTE_TO_SLAVE=<bool> option instead.\n* slave_pos - Replicate in GTID mode and use gtid_slave_pos as the position to\nstart downloading transactions from the primary. From MariaDB 10.5.1,\nreplica_pos is an alias for slave_pos.\n* no - Don\'t replicate in GTID mode.\n\nMASTER_DEMOTE_TO_SLAVE\n----------------------\n\nMariaDB starting with 10.10\n---------------------------\nUsed to transition a primary to become a replica. Replaces the old\nMASTER_USE_GTID=current_pos with a safe alternative by forcing users to set\nUsing_Gtid=Slave_Pos and merging gtid_binlog_pos into gtid_slave_pos once at\nCHANGE MASTER TO time. If gtid_slave_pos is more recent than gtid_binlog_pos\n(as in the case of chain replication), the replication state should be\npreserved.\n\nFor example:\n\nSTOP SLAVE;\nCHANGE MASTER TO\n MASTER_USE_GTID = current_pos;\nSTART SLAVE;\n\nOr:\n\nSTOP SLAVE;\nSET GLOBAL gtid_slave_pos=\'0-1-153\';\nCHANGE MASTER TO\n MASTER_USE_GTID = slave_pos;\nSTART SLAVE;\n\nReplication Filter Options\n--------------------------\n\nAlso see Replication filters.\n\nIGNORE_SERVER_IDS\n-----------------\n\nThe IGNORE_SERVER_IDS option for CHANGE MASTER can be used to configure a\nreplica to ignore binary log events that originated from certain servers.\nFiltered binary log events will not get logged to the replica’s relay log, and\nthey will not be applied by the replica.\n\nThe option\'s value can be specified by providing a comma-separated list of\nserver_id values. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_SERVER_IDS = (3,5);\nSTART SLAVE;\n\nIf you would like to clear a previously set list, then you can set the value\nto an empty list. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_SERVER_IDS = ();\nSTART SLAVE;\n\nDO_DOMAIN_IDS\n-------------\n\nThe DO_DOMAIN_IDS option for CHANGE MASTER can be used to configure a replica\nto only apply binary log events if the transaction\'s GTID is in a specific\ngtid_domain_id value. Filtered binary log events will not get logged to the\nreplica’s relay log, and they will not be applied by the replica.\n\nThe option\'s value can be specified by providing a comma-separated list of\ngtid_domain_id values. Duplicate values are automatically ignored. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n DO_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n\nIf you would like to clear a previously set list, then you can set the value\nto an empty list. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n DO_DOMAIN_IDS = ();\nSTART SLAVE;\n\nThe DO_DOMAIN_IDS option and the IGNORE_DOMAIN_IDS option cannot both be set\nto non-empty values at the same time. If you want to set the DO_DOMAIN_IDS\noption, and the IGNORE_DOMAIN_IDS option was previously set, then you need to\nclear the value of the IGNORE_DOMAIN_IDS option. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_DOMAIN_IDS = (),\n DO_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n\nThe DO_DOMAIN_IDS option can only be specified if the replica is replicating\nin GTID mode. Therefore, the MASTER_USE_GTID option must also be set to some\nvalue other than no in order to use this option.\n\nIGNORE_DOMAIN_IDS\n-----------------\n\nThe IGNORE_DOMAIN_IDS option for CHANGE MASTER can be used to configure a\nreplica to ignore binary log events if the transaction\'s GTID is in a specific\ngtid_domain_id value. Filtered binary log events will not get logged to the\nreplica’s relay log, and they will not be applied by the replica.\n\nThe option\'s value can be specified by providing a comma-separated list of\ngtid_domain_id values. Duplicate values are automatically ignored. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n\nIf you would like to clear a previously set list, then you can set the value\nto an empty list. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n IGNORE_DOMAIN_IDS = ();\nSTART SLAVE;\n\nThe DO_DOMAIN_IDS option and the IGNORE_DOMAIN_IDS option cannot both be set\nto non-empty values at the same time. If you want to set the IGNORE_DOMAIN_IDS\noption, and the DO_DOMAIN_IDS option was previously set, then you need to\nclear the value of the DO_DOMAIN_IDS option. For example:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n DO_DOMAIN_IDS = (),\n IGNORE_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n\nThe IGNORE_DOMAIN_IDS option can only be specified if the replica is\nreplicating in GTID mode. Therefore, the MASTER_USE_GTID option must also be\nset to some value other than no in order to use this option.\n\nDelayed Replication Options\n---------------------------\n\nMASTER_DELAY\n------------\n\nThe MASTER_DELAY option for CHANGE MASTER can be used to enable delayed\nreplication. This option specifies the time in seconds (at least) that a\nreplica should lag behind the primary up to a maximum value of 2147483647, or\nabout 68 years. Before executing an event, the replica will first wait, if\nnecessary, until the given time has passed since the event was created on the\nprimary. The result is that the replica will reflect the state of the primary\nsome time back in the past. The default is zero, no delay.\n\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_DELAY=3600;\nSTART SLAVE;\n\nChanging Option Values\n----------------------\n\nIf you don\'t specify a given option when executing the CHANGE MASTER\nstatement, then the option keeps its old value in most cases. Most of the\ntime, there is no need to specify the options that do not need to change. For\nexample, if the password for the user account that the replica uses to connect\nto its primary has changed, but no other options need to change, then you can\njust change the MASTER_PASSWORD option by executing the following commands:\n\nSTOP SLAVE;\nCHANGE MASTER TO \n MASTER_PASSWORD=\'new3cret\';\nSTART SLAVE;\n\nThere are some cases where options are implicitly reset, such as when the\nMASTER_HOST and MASTER_PORT options are changed.\n\nOption Persistence\n------------------\n\nThe values of the MASTER_LOG_FILE and MASTER_LOG_POS options (i.e. the binary\nlog position on the primary) and most other options are written to either the\ndefault master.info file or the file that is configured by the\nmaster_info_file option. The replica\'s I/O thread keeps this binary log\nposition updated as it downloads events only when MASTER_USE_GTID option is\nset to NO. Otherwise the file is not updated on a per event basis.\n\nThe master_info_file option can be set either on the command-line or in a\nserver option group in an option file prior to starting up the server. For\nexample:\n\n[mariadb]\n...\nmaster_info_file=/mariadb/myserver1-master.info\n\nThe values of the RELAY_LOG_FILE and RELAY_LOG_POS options (i.e. the relay log\nposition) are written to either the default relay-log.info file or the file\nthat is configured by the relay_log_info_file system variable. The replica\'s\nSQL thread keeps this relay log position updated as it applies events.\n\nThe relay_log_info_file system variable can be set either on the command-line\nor in a server option group in an option file prior to starting up the server.\nFor example:\n\n[mariadb]\n...\nrelay_log_info_file=/mariadb/myserver1-relay-log.info\n\nGTID Persistence\n----------------\n\nIf the replica is replicating binary log events that contain GTIDs, then the\nreplica\'s SQL thread will write every GTID that it applies to the\nmysql.gtid_slave_pos table. This GTID can be inspected and modified through\nthe gtid_slave_pos system variable.\n\nIf the replica has the log_slave_updates system variable enabled and if the\nreplica has the binary log enabled, then every write by the replica\'s SQL\nthread will also go into the replica\'s binary log. This means that GTIDs of\nreplicated transactions would be reflected in the value of the gtid_binlog_pos\nsystem variable.\n\nCreating a Replica from a Backup\n--------------------------------\n\nThe CHANGE MASTER statement is useful for setting up a replica when you have a\nbackup of the primary and you also have the binary log position or GTID\nposition corresponding to the backup.\n\nAfter restoring the backup on the replica, you could execute something like\nthis to use the binary log position:\n\nCHANGE MASTER TO\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4;\nSTART SLAVE;\n') WHERE help_topic_id = 820;
+update help_topic set description = CONCAT(description, '\nOr you could execute something like this to use the GTID position:\n\nSET GLOBAL gtid_slave_pos=\'0-1-153\';\nCHANGE MASTER TO\n MASTER_USE_GTID=slave_pos;\nSTART SLAVE;\n\nSee Setting up a Replication Slave with Mariabackup for more information on\nhow to do this with Mariabackup.\n\nExample\n-------\n\nThe following example changes the primary and primary\'s binary log\ncoordinates. This is used when you want to set up the replica to replicate the\nprimary:\n\nCHANGE MASTER TO\n MASTER_HOST=\'master2.mycompany.com\',\n MASTER_USER=\'replication\',\n MASTER_PASSWORD=\'bigs3cret\',\n MASTER_PORT=3306,\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4,\n MASTER_CONNECT_RETRY=10;\nSTART SLAVE;\n\nURL: https://mariadb.com/kb/en/change-master-to/') WHERE help_topic_id = 820;
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (821,49,'START SLAVE','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nSTART SLAVE [\"connection_name\"] [thread_type [, thread_type] ... ] [FOR\nCHANNEL \"connection_name\"]\nSTART SLAVE [\"connection_name\"] [SQL_THREAD] UNTIL \n MASTER_LOG_FILE = \'log_name\', MASTER_LOG_POS = log_pos [FOR CHANNEL\n\"connection_name\"]\nSTART SLAVE [\"connection_name\"] [SQL_THREAD] UNTIL\n RELAY_LOG_FILE = \'log_name\', RELAY_LOG_POS = log_pos [FOR CHANNEL\n\"connection_name\"]\nSTART SLAVE [\"connection_name\"] [SQL_THREAD] UNTIL\n MASTER_GTID_POS = <GTID position> [FOR CHANNEL \"connection_name\"]\nSTART ALL SLAVES [thread_type [, thread_type]]\n\nSTART REPLICA [\"connection_name\"] [thread_type [, thread_type] ... ] -- from\n10.5.1\nSTART REPLICA [\"connection_name\"] [SQL_THREAD] UNTIL \n MASTER_LOG_FILE = \'log_name\', MASTER_LOG_POS = log_pos -- from 10.5.1\nSTART REPLICA [\"connection_name\"] [SQL_THREAD] UNTIL\n RELAY_LOG_FILE = \'log_name\', RELAY_LOG_POS = log_pos -- from 10.5.1\nSTART REPLICA [\"connection_name\"] [SQL_THREAD] UNTIL\n MASTER_GTID_POS = <GTID position> -- from 10.5.1\nSTART ALL REPLICAS [thread_type [, thread_type]] -- from 10.5.1\n\nthread_type: IO_THREAD | SQL_THREAD\n\nDescription\n-----------\n\nSTART SLAVE (START REPLICA from MariaDB 10.5.1) with no thread_type options\nstarts both of the replica threads (see replication). The I/O thread reads\nevents from the primary server and stores them in the relay log. The SQL\nthread reads events from the relay log and executes them. START SLAVE requires\nthe SUPER privilege, or, from MariaDB 10.5.2, the REPLICATION SLAVE ADMIN\nprivilege.\n\nIf START SLAVE succeeds in starting the replica threads, it returns without\nany error. However, even in that case, it might be that the replica threads\nstart and then later stop (for example, because they do not manage to connect\nto the primary or read its binary log, or some other problem). START SLAVE\ndoes not warn you about this. You must check the replica\'s error log for error\nmessages generated by the replica threads, or check that they are running\nsatisfactorily with SHOW SLAVE STATUS (SHOW REPLICA STATUS from MariaDB\n10.5.1).\n\nSTART SLAVE UNTIL\n-----------------\n\nSTART SLAVE UNTIL refers to the SQL_THREAD replica position at which the\nSQL_THREAD replication will halt. If SQL_THREAD isn\'t specified both threads\nare started.\n\nSTART SLAVE UNTIL master_gtid_pos=xxx is also supported. See Global\nTransaction ID/START SLAVE UNTIL master_gtid_pos=xxx for more details.\n\nconnection_name\n---------------\n\nIf there is only one nameless primary, or the default primary (as specified by\nthe default_master_connection system variable) is intended, connection_name\ncan be omitted. If provided, the START SLAVE statement will apply to the\nspecified primary. connection_name is case-insensitive.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after START SLAVE.\n\nSTART ALL SLAVES\n----------------\n\nSTART ALL SLAVES starts all configured replicas (replicas with master_host not\nempty) that were not started before. It will give a note for all started\nconnections. You can check the notes with SHOW WARNINGS.\n\nSTART REPLICA\n-------------\n\nMariaDB starting with 10.5.1\n----------------------------\nSTART REPLICA is an alias for START SLAVE from MariaDB 10.5.1.\n\nURL: https://mariadb.com/kb/en/start-replica/','','https://mariadb.com/kb/en/start-replica/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (822,49,'STOP SLAVE','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nSTOP SLAVE [\"connection_name\"] [thread_type [, thread_type] ... ] [FOR CHANNEL\n\"connection_name\"]\n\nSTOP ALL SLAVES [thread_type [, thread_type]]\n\nSTOP REPLICA [\"connection_name\"] [thread_type [, thread_type] ... ] -- from\n10.5.1\n\nSTOP ALL REPLICAS [thread_type [, thread_type]] -- from 10.5.1\n\nthread_type: IO_THREAD | SQL_THREAD\n\nDescription\n-----------\n\nStops the replica threads. STOP SLAVE requires the SUPER privilege, or, from\nMariaDB 10.5.2, the REPLICATION SLAVE ADMIN privilege.\n\nLike START SLAVE, this statement may be used with the IO_THREAD and SQL_THREAD\noptions to name the thread or threads to be stopped. In almost all cases, one\nnever need to use the thread_type options.\n\nSTOP SLAVE waits until any current replication event group affecting one or\nmore non-transactional tables has finished executing (if there is any such\nreplication group), or until the user issues a KILL QUERY or KILL CONNECTION\nstatement.\n\nNote that STOP SLAVE doesn\'t delete the connection permanently. Next time you\nexecute START SLAVE or the MariaDB server restarts, the replica connection is\nrestored with it\'s original arguments. If you want to delete a connection, you\nshould execute RESET SLAVE.\n\nSTOP ALL SLAVES\n---------------\n\nSTOP ALL SLAVES stops all your running replicas. It will give you a note for\nevery stopped connection. You can check the notes with SHOW WARNINGS.\n\nconnection_name\n---------------\n\nThe connection_name option is used for multi-source replication.\n\nIf there is only one nameless master, or the default master (as specified by\nthe default_master_connection system variable) is intended, connection_name\ncan be omitted. If provided, the STOP SLAVE statement will apply to the\nspecified master. connection_name is case-insensitive.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after STOP SLAVE.\n\nSTOP REPLICA\n------------\n\nMariaDB starting with 10.5.1\n----------------------------\nSTOP REPLICA is an alias for STOP SLAVE from MariaDB 10.5.1.\n\nURL: https://mariadb.com/kb/en/stop-replica/','','https://mariadb.com/kb/en/stop-replica/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (823,49,'RESET REPLICA/SLAVE','The terms master and slave have historically been used in replication, but the\nterms terms primary and replica are now preferred. The old terms are used\nstill used in parts of the documentation, and in MariaDB commands, although\nMariaDB 10.5 has begun the process of renaming. The documentation process is\nongoing. See MDEV-18777 to follow progress on this effort.\n\nSyntax\n------\n\nRESET REPLICA [\"connection_name\"] [ALL] [FOR CHANNEL \"connection_name\"] --\nfrom MariaDB 10.5.1 \nRESET SLAVE [\"connection_name\"] [ALL] [FOR CHANNEL \"connection_name\"]\n\nDescription\n-----------\n\nRESET REPLICA/SLAVE makes the replica forget its replication position in the\nmaster\'s binary log. This statement is meant to be used for a clean start. It\ndeletes the master.info and relay-log.info files, all the relay log files, and\nstarts a new relay log file. To use RESET REPLICA/SLAVE, the replica threads\nmust be stopped (use STOP REPLICA/SLAVE if necessary).\n\nNote: All relay log files are deleted, even if they have not been completely\nexecuted by the slave SQL thread. (This is a condition likely to exist on a\nreplication slave if you have issued a STOP REPLICA/SLAVE statement or if the\nslave is highly loaded.)\n\nNote: RESET REPLICA does not reset the global gtid_slave_pos variable. This\nmeans that a replica server configured with CHANGE MASTER TO\nMASTER_USE_GTID=slave_pos will not receive events with GTIDs occurring before\nthe state saved in gtid_slave_pos. If the intent is to reprocess these events,\ngtid_slave_pos must be manually reset, e.g. by executing set global\ngtid_slave_pos=\"\".\n\nConnection information stored in the master.info file is immediately reset\nusing any values specified in the corresponding startup options. This\ninformation includes values such as master host, master port, master user, and\nmaster password. If the replica SQL thread was in the middle of replicating\ntemporary tables when it was stopped, and RESET REPLICA/SLAVE is issued, these\nreplicated temporary tables are deleted on the slave.\n\nThe ALL also resets the PORT, HOST, USER and PASSWORD parameters for the\nslave. If you are using a connection name, it will permanently delete it and\nit will not show up anymore in SHOW ALL REPLICAS/SLAVE STATUS.\n\nconnection_name\n---------------\n\nThe connection_name option is used for multi-source replication.\n\nIf there is only one nameless primary, or the default primary (as specified by\nthe default_master_connection system variable) is intended, connection_name\ncan be omitted. If provided, the RESET REPLICA/SLAVE statement will apply to\nthe specified primary. connection_name is case-insensitive.\n\nMariaDB starting with 10.7.0\n----------------------------\nThe FOR CHANNEL keyword was added for MySQL compatibility. This is identical\nas using the channel_name directly after RESET REPLICA.\n\nRESET REPLICA\n-------------\n\nMariaDB starting with 10.5.1\n----------------------------\nRESET REPLICA is an alias for RESET SLAVE from MariaDB 10.5.1.\n\nURL: https://mariadb.com/kb/en/reset-replica/','','https://mariadb.com/kb/en/reset-replica/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (824,49,'RESET MASTER','RESET MASTER [TO #]\n\nDeletes all binary log files listed in the index file, resets the binary log\nindex file to be empty, and creates a new binary log file with a suffix of\n.000001.\n\nIf TO # is given, then the first new binary log file will start from number #.\n\nThis statement is for use only when the master is started for the first time,\nand should never be used if any slaves are actively replicating from the\nbinary log.\n\nURL: https://mariadb.com/kb/en/reset-master/','','https://mariadb.com/kb/en/reset-master/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (825,50,'EXECUTE Statement','Syntax\n------\n\nEXECUTE stmt_name\n [USING expression[, expression] ...]\n\nMariaDB starting with 10.2.3\n----------------------------\nEXECUTE with expression as parameters was introduced in MariaDB 10.2.3. Before\nthat one could only use variables (@var_name) as parameters.\n\nDescription\n-----------\n\nAfter preparing a statement with PREPARE, you execute it with an EXECUTE\nstatement that refers to the prepared statement name. If the prepared\nstatement contains any parameter markers, you must supply a USING clause that\nlists user variables containing the values to be bound to the parameters.\nParameter values can be supplied only by user variables, and the USING clause\nmust name exactly as many variables as the number of parameter markers in the\nstatement.\n\nYou can execute a given prepared statement multiple times, passing different\nvariables to it or setting the variables to different values before each\nexecution.\n\nIf the specified statement has not been PREPAREd, an error similar to the\nfollowing is produced:\n\nERROR 1243 (HY000): Unknown prepared statement handler (stmt_name) given to\nEXECUTE\n\nExample\n-------\n\nSee example in PREPARE.\n\nURL: https://mariadb.com/kb/en/execute-statement/','','https://mariadb.com/kb/en/execute-statement/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (826,50,'PREPARE Statement','Syntax\n------\n\nPREPARE stmt_name FROM preparable_stmt\n\nDescription\n-----------\n\nThe PREPARE statement prepares a statement and assigns it a name, stmt_name,\nby which to refer to the statement later. Statement names are not case\nsensitive. preparable_stmt is either a string literal or a user variable (not\na local variable, an SQL expression or a subquery) that contains the text of\nthe statement. The text must represent a single SQL statement, not multiple\nstatements. Within the statement, \"?\" characters can be used as parameter\nmarkers to indicate where data values are to be bound to the query later when\nyou execute it. The \"?\" characters should not be enclosed within quotes, even\nif you intend to bind them to string values. Parameter markers can be used\nonly where expressions should appear, not for SQL keywords, identifiers, and\nso forth.\n\nThe scope of a prepared statement is the session within which it is created.\nOther sessions cannot see it.\n\nIf a prepared statement with the given name already exists, it is deallocated\nimplicitly before the new statement is prepared. This means that if the new\nstatement contains an error and cannot be prepared, an error is returned and\nno statement with the given name exists.\n\nPrepared statements can be PREPAREd and EXECUTEd in a stored procedure, but\nnot in a stored function or trigger. Also, even if the statement is PREPAREd\nin a procedure, it will not be deallocated when the procedure execution ends.\n\nA prepared statement can access user-defined variables, but not local\nvariables or procedure\'s parameters.\n\nIf the prepared statement contains a syntax error, PREPARE will fail. As a\nside effect, stored procedures can use it to check if a statement is valid.\nFor example:\n\nCREATE PROCEDURE `test_stmt`(IN sql_text TEXT)\nBEGIN\n DECLARE EXIT HANDLER FOR SQLEXCEPTION\n BEGIN\n SELECT CONCAT(sql_text, \' is not valid\');\n END;\n SET @SQL := sql_text;\n PREPARE stmt FROM @SQL;\n DEALLOCATE PREPARE stmt;\nEND;\n\nThe FOUND_ROWS() and ROW_COUNT() functions, if called immediatly after\nEXECUTE, return the number of rows read or affected by the prepared\nstatements; however, if they are called after DEALLOCATE PREPARE, they provide\ninformation about this statement. If the prepared statement produces errors or\nwarnings, GET DIAGNOSTICS return information about them. DEALLOCATE PREPARE\nshouldn\'t clear the diagnostics area, unless it produces an error.\n\nA prepared statement is executed with EXECUTE and released with DEALLOCATE\nPREPARE.\n\nThe max_prepared_stmt_count server system variable determines the number of\nallowed prepared statements that can be prepared on the server. If it is set\nto 0, prepared statements are not allowed. If the limit is reached, an error\nsimilar to the following will be produced:\n\nERROR 1461 (42000): Can\'t create more than max_prepared_stmt_count statements \n (current value: 0)\n\nOracle Mode\n-----------\n\nMariaDB starting with 10.3\n--------------------------\nIn Oracle mode from MariaDB 10.3, PREPARE stmt FROM \'SELECT :1, :2\' is used,\ninstead of ?.\n\nPermitted Statements\n--------------------\n\nMariaDB starting with 10.6.2\n----------------------------\nAll statements can be prepared, except PREPARE, EXECUTE, and DEALLOCATE / DROP\nPREPARE.\n\nPrior to this, not all statements can be prepared. Only the following SQL\ncommands are permitted:\n\n* ALTER TABLE\n* ANALYZE TABLE\n* BINLOG\n* CACHE INDEX\n* CALL\n* CHANGE MASTER\n* CHECKSUM {TABLE | TABLES}\n* COMMIT\n* {CREATE | DROP} DATABASE\n* {CREATE | DROP} INDEX\n* {CREATE | RENAME | DROP} TABLE\n* {CREATE | RENAME | DROP} USER\n* {CREATE | DROP} VIEW\n* DELETE\n* DESCRIBE\n* DO\n* EXPLAIN\n* FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES | LOGS |\nSTATUS | \n MASTER | SLAVE | DES_KEY_FILE | USER_RESOURCES | QUERY CACHE |\nTABLE_STATISTICS | \n INDEX_STATISTICS | USER_STATISTICS | CLIENT_STATISTICS}\n* GRANT\n* INSERT\n* INSTALL {PLUGIN | SONAME}\n* HANDLER READ\n* KILL\n* LOAD INDEX INTO CACHE\n* OPTIMIZE TABLE\n* REPAIR TABLE\n* REPLACE\n* RESET {MASTER | SLAVE | QUERY CACHE}\n* REVOKE\n* ROLLBACK\n* SELECT\n* SET\n* SET GLOBAL SQL_SLAVE_SKIP_COUNTER\n* SET ROLE\n* SET SQL_LOG_BIN\n* SET TRANSACTION ISOLATION LEVEL\n* SHOW EXPLAIN\n* SHOW {DATABASES | TABLES | OPEN TABLES | TABLE STATUS | COLUMNS | INDEX |\nTRIGGERS | \n EVENTS | GRANTS | CHARACTER SET | COLLATION | ENGINES | PLUGINS [SONAME] |\nPRIVILEGES | \n PROCESSLIST | PROFILE | PROFILES | VARIABLES | STATUS | WARNINGS | ERRORS |\n TABLE_STATISTICS | INDEX_STATISTICS | USER_STATISTICS | CLIENT_STATISTICS |\nAUTHORS | \n CONTRIBUTORS}\n* SHOW CREATE {DATABASE | TABLE | VIEW | PROCEDURE | FUNCTION | TRIGGER |\nEVENT}\n* SHOW {FUNCTION | PROCEDURE} CODE\n* SHOW BINLOG EVENTS\n* SHOW SLAVE HOSTS\n* SHOW {MASTER | BINARY} LOGS\n* SHOW {MASTER | SLAVE | TABLES | INNODB | FUNCTION | PROCEDURE} STATUS\n* SLAVE {START | STOP}\n* TRUNCATE TABLE\n* SHUTDOWN\n* UNINSTALL {PLUGIN | SONAME}\n* UPDATE\n\nSynonyms are not listed here, but can be used. For example, DESC can be used\ninstead of DESCRIBE.\n\nCompound statements can be prepared too.\n\nNote that if a statement can be run in a stored routine, it will work even if\nit is called by a prepared statement. For example, SIGNAL can\'t be directly\nprepared. However, it is allowed in stored routines. If the x() procedure\ncontains SIGNAL, you can still prepare and execute the \'CALL x();\' prepared\nstatement.\n\nPREPARE supports most kinds of expressions as well, for example:\n\nPREPARE stmt FROM CONCAT(\'SELECT * FROM \', table_name);\n\nWhen PREPARE is used with a statement which is not supported, the following\nerror is produced:\n\nERROR 1295 (HY000): This command is not supported in the prepared statement\nprotocol yet\n\nExample\n-------\n\ncreate table t1 (a int,b char(10));\ninsert into t1 values (1,\"one\"),(2, \"two\"),(3,\"three\");\nprepare test from \"select * from t1 where a=?\";\nset @param=2;\nexecute test using @param;\n+------+------+\n| a | b |\n+------+------+\n| 2 | two |\n+------+------+\nset @param=3;\nexecute test using @param;\n+------+-------+\n| a | b |\n+------+-------+\n| 3 | three |\n+------+-------+\ndeallocate prepare test;\n\nSince identifiers are not permitted as prepared statements parameters,\nsometimes it is necessary to dynamically compose an SQL statement. This\ntechnique is called dynamic SQL). The following example shows how to use\ndynamic SQL:\n\nCREATE PROCEDURE test.stmt_test(IN tab_name VARCHAR(64))\nBEGIN\n SET @sql = CONCAT(\'SELECT COUNT(*) FROM \', tab_name);\n PREPARE stmt FROM @sql;\n EXECUTE stmt;\n DEALLOCATE PREPARE stmt;\nEND;\n\nCALL test.stmt_test(\'mysql.user\');\n+----------+\n| COUNT(*) |\n+----------+\n| 4 |\n+----------+\n\nUse of variables in prepared statements:\n\nPREPARE stmt FROM \'SELECT @x;\';\n\nSET @x = 1;\n\nEXECUTE stmt;\n+------+\n| @x |\n+------+\n| 1 |\n+------+\n\nSET @x = 0;\n\nEXECUTE stmt;\n+------+\n| @x |\n+------+\n| 0 |\n+------+\n\nDEALLOCATE PREPARE stmt;\n\nURL: https://mariadb.com/kb/en/prepare-statement/','','https://mariadb.com/kb/en/prepare-statement/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (827,50,'DEALLOCATE / DROP PREPARE','Syntax\n------\n\n{DEALLOCATE | DROP} PREPARE stmt_name\n\nDescription\n-----------\n\nTo deallocate a prepared statement produced with PREPARE, use a DEALLOCATE\nPREPARE statement that refers to the prepared statement name.\n\nA prepared statement is implicitly deallocated when a new PREPARE command is\nissued. In that case, there is no need to use DEALLOCATE.\n\nAttempting to execute a prepared statement after deallocating it results in an\nerror, as if it was not prepared at all:\n\nERROR 1243 (HY000): Unknown prepared statement handler (stmt_name) given to\nEXECUTE\n\nIf the specified statement has not been PREPAREd, an error similar to the\nfollowing will be produced:\n\nERROR 1243 (HY000): Unknown prepared statement handler (stmt_name) given to\nDEALLOCATE PREPARE\n\nExample\n-------\n\nSee example in PREPARE.\n\nURL: https://mariadb.com/kb/en/deallocate-drop-prepare/','','https://mariadb.com/kb/en/deallocate-drop-prepare/');
+insert into help_topic (help_topic_id,help_category_id,name,description,example,url) values (828,50,'EXECUTE IMMEDIATE','MariaDB starting with 10.2.3\n----------------------------\nEXECUTE IMMEDIATE was introduced in MariaDB 10.2.3.\n\nSyntax\n------\n\nEXECUTE IMMEDIATE statement\n\nDescription\n-----------\n\nEXECUTE IMMEDIATE executes a dynamic SQL statement created on the fly, which\ncan reduce performance overhead.\n\nFor example:\n\nEXECUTE IMMEDIATE \'SELECT 1\'\n\nwhich is shorthand for:\n\nprepare stmt from \"select 1\";\nexecute stmt;\ndeallocate prepare stmt;\n\nEXECUTE IMMEDIATE supports complex expressions as prepare source and\nparameters:\n\nEXECUTE IMMEDIATE CONCAT(\'SELECT COUNT(*) FROM \', \'t1\', \' WHERE a=?\') USING\n5+5;\n\nLimitations: subselects and stored function calls are not supported as a\nprepare source.\n\nThe following examples return an error:\n\nCREATE OR REPLACE FUNCTION f1() RETURNS VARCHAR(64) RETURN \'SELECT * FROM t1\';\nEXECUTE IMMEDIATE f1();\nERROR 1970 (42000): EXECUTE IMMEDIATE does not support subqueries or stored\nfunctions\n\nEXECUTE IMMEDIATE (SELECT \'SELECT * FROM t1\');\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual\nthat \n corresponds to your MariaDB server version for the right syntax to use near\n \'SELECT \'SELECT * FROM t1\')\' at line 1\n\nCREATE OR REPLACE FUNCTION f1() RETURNS INT RETURN 10;\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING f1();\nERROR 1970 (42000): EXECUTE..USING does not support subqueries or stored\nfunctions\n\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING (SELECT 10);\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual\nthat \n corresponds to your MariaDB server version for the right syntax to use near\n \'SELECT 10)\' at line 1\n\nOne can use a user or an SP variable as a workaround:\n\nCREATE OR REPLACE FUNCTION f1() RETURNS VARCHAR(64) RETURN \'SELECT * FROM t1\';\nSET @stmt=f1();\nEXECUTE IMMEDIATE @stmt;\n\nSET @stmt=(SELECT \'SELECT 1\');\nEXECUTE IMMEDIATE @stmt;\n\nCREATE OR REPLACE FUNCTION f1() RETURNS INT RETURN 10;\nSET @param=f1();\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING @param;\n\nSET @param=(SELECT 10);\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING @param;\n\nEXECUTE IMMEDIATE supports user variables and SP variables as OUT parameters\n\nDELIMITER $$\nCREATE OR REPLACE PROCEDURE p1(OUT a INT)\nBEGIN\n SET a:= 10;\nEND;\n$$\nDELIMITER ;\nSET @a=2;\nEXECUTE IMMEDIATE \'CALL p1(?)\' USING @a;\nSELECT @a;\n+------+\n| @a |\n+------+\n| 10 |\n+------+\n\nSimilar to PREPARE, EXECUTE IMMEDIATE is allowed in stored procedures but is\nnot allowed in stored functions.\n\nThis example uses EXECUTE IMMEDIATE inside a stored procedure:\n\nDELIMITER $$\nCREATE OR REPLACE PROCEDURE p1()\nBEGIN\n EXECUTE IMMEDIATE \'SELECT 1\';\nEND;\n$$\nDELIMITER ;\nCALL p1;\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n\nThis script returns an error:\n\nDELIMITER $$\nCREATE FUNCTION f1() RETURNS INT\nBEGIN\n EXECUTE IMMEDIATE \'DO 1\';\n RETURN 1;\nEND;\n$$\nERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger\n\nEXECUTE IMMEDIATE can use DEFAULT and IGNORE indicators as bind parameters:\n\nCREATE OR REPLACE TABLE t1 (a INT DEFAULT 10);\nEXECUTE IMMEDIATE \'INSERT INTO t1 VALUES (?)\' USING DEFAULT;\nSELECT * FROM t1;\n+------+\n| a |\n+------+\n| 10 |\n+------+\n\nEXECUTE IMMEDIATE increments the Com_execute_immediate status variable, as\nwell as the Com_stmt_prepare, Com_stmt_execute and Com_stmt_close status\nvariables.\n\nNote, EXECUTE IMMEDIATE does not increment the Com_execute_sql status\nvariable. Com_execute_sql is used only for PREPARE..EXECUTE.\n\nThis session screenshot demonstrates how EXECUTE IMMEDIATE affects status\nvariables:\n\nSELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME RLIKE \n (\'COM_(EXECUTE|STMT_PREPARE|STMT_EXECUTE|STMT_CLOSE)\');\n\n+-----------------------+----------------+\n| VARIABLE_NAME | VARIABLE_VALUE |\n+-----------------------+----------------+\n| COM_EXECUTE_IMMEDIATE | 0 |\n| COM_EXECUTE_SQL | 0 |\n| COM_STMT_CLOSE | 0 |\n| COM_STMT_EXECUTE | 0 |\n| COM_STMT_PREPARE | 0 |\n+-----------------------+----------------+\n\nEXECUTE IMMEDIATE \'SELECT 1\';\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n\nSELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME RLIKE \n (\'COM_(EXECUTE|STMT_PREPARE|STMT_EXECUTE|STMT_CLOSE)\');\n+-----------------------+----------------+\n| VARIABLE_NAME | VARIABLE_VALUE |\n+-----------------------+----------------+\n| COM_EXECUTE_IMMEDIATE | 1 |\n| COM_EXECUTE_SQL | 0 |\n| COM_STMT_CLOSE | 1 |\n| COM_STMT_EXECUTE | 1 |\n| COM_STMT_PREPARE | 1 |\n+-----------------------+----------------+\n\nURL: https://mariadb.com/kb/en/execute-immediate/','','https://mariadb.com/kb/en/execute-immediate/');
insert into help_keyword values (1, 'work');
insert into help_keyword values (2, 'locks');
insert into help_keyword values (3, 'locking');
@@ -1042,103 +1048,101 @@ insert into help_keyword values (103, 'reset slave');
insert into help_keyword values (104, 'reset replica');
insert into help_keyword values (105, 'drop prepare');
insert into help_keyword values (106, 'deallocate prepare');
-insert into help_relation values (94, 1);
-insert into help_relation values (97, 2);
-insert into help_relation values (97, 3);
-insert into help_relation values (99, 2);
-insert into help_relation values (99, 3);
-insert into help_relation values (101, 2);
-insert into help_relation values (101, 3);
-insert into help_relation values (106, 4);
-insert into help_relation values (107, 5);
-insert into help_relation values (107, 6);
-insert into help_relation values (107, 7);
-insert into help_relation values (107, 8);
-insert into help_relation values (107, 9);
-insert into help_relation values (107, 10);
-insert into help_relation values (107, 11);
-insert into help_relation values (107, 12);
-insert into help_relation values (107, 13);
-insert into help_relation values (107, 14);
-insert into help_relation values (107, 15);
-insert into help_relation values (112, 4);
-insert into help_relation values (115, 16);
-insert into help_relation values (116, 2);
-insert into help_relation values (116, 3);
-insert into help_relation values (147, 2);
-insert into help_relation values (147, 3);
-insert into help_relation values (152, 2);
-insert into help_relation values (152, 3);
-insert into help_relation values (157, 2);
-insert into help_relation values (157, 3);
-insert into help_relation values (161, 2);
-insert into help_relation values (161, 3);
+insert into help_relation values (95, 1);
+insert into help_relation values (98, 2);
+insert into help_relation values (98, 3);
+insert into help_relation values (100, 2);
+insert into help_relation values (100, 3);
+insert into help_relation values (102, 2);
+insert into help_relation values (102, 3);
+insert into help_relation values (107, 4);
+insert into help_relation values (108, 5);
+insert into help_relation values (108, 6);
+insert into help_relation values (108, 7);
+insert into help_relation values (108, 8);
+insert into help_relation values (108, 9);
+insert into help_relation values (108, 10);
+insert into help_relation values (108, 11);
+insert into help_relation values (108, 12);
+insert into help_relation values (108, 13);
+insert into help_relation values (108, 14);
+insert into help_relation values (108, 15);
+insert into help_relation values (113, 4);
+insert into help_relation values (116, 16);
+insert into help_relation values (117, 2);
+insert into help_relation values (117, 3);
+insert into help_relation values (148, 2);
+insert into help_relation values (148, 3);
+insert into help_relation values (153, 2);
+insert into help_relation values (153, 3);
+insert into help_relation values (158, 2);
+insert into help_relation values (158, 3);
insert into help_relation values (162, 2);
insert into help_relation values (162, 3);
-insert into help_relation values (167, 17);
-insert into help_relation values (167, 18);
-insert into help_relation values (168, 19);
-insert into help_relation values (169, 20);
-insert into help_relation values (171, 21);
-insert into help_relation values (212, 22);
-insert into help_relation values (212, 23);
+insert into help_relation values (163, 2);
+insert into help_relation values (163, 3);
+insert into help_relation values (168, 17);
+insert into help_relation values (168, 18);
+insert into help_relation values (169, 19);
+insert into help_relation values (170, 20);
+insert into help_relation values (172, 21);
+insert into help_relation values (213, 22);
insert into help_relation values (213, 23);
-insert into help_relation values (213, 24);
-insert into help_relation values (214, 25);
-insert into help_relation values (214, 26);
-insert into help_relation values (214, 27);
-insert into help_relation values (215, 28);
-insert into help_relation values (216, 29);
-insert into help_relation values (217, 30);
-insert into help_relation values (218, 31);
-insert into help_relation values (219, 32);
-insert into help_relation values (220, 33);
-insert into help_relation values (234, 34);
-insert into help_relation values (235, 35);
-insert into help_relation values (236, 36);
-insert into help_relation values (238, 37);
-insert into help_relation values (239, 38);
-insert into help_relation values (240, 39);
-insert into help_relation values (251, 40);
-insert into help_relation values (252, 4);
-insert into help_relation values (253, 41);
-insert into help_relation values (254, 42);
-insert into help_relation values (255, 43);
-insert into help_relation values (257, 44);
-insert into help_relation values (259, 45);
-insert into help_relation values (260, 46);
-insert into help_relation values (261, 47);
-insert into help_relation values (261, 48);
-insert into help_relation values (262, 49);
-insert into help_relation values (263, 50);
-insert into help_relation values (263, 51);
-insert into help_relation values (263, 52);
-insert into help_relation values (263, 53);
-insert into help_relation values (265, 54);
-insert into help_relation values (265, 55);
-insert into help_relation values (271, 56);
-insert into help_relation values (277, 57);
-insert into help_relation values (277, 58);
-insert into help_relation values (306, 59);
-insert into help_relation values (313, 60);
-insert into help_relation values (313, 61);
-insert into help_relation values (333, 62);
-insert into help_relation values (334, 62);
-insert into help_relation values (335, 63);
+insert into help_relation values (214, 23);
+insert into help_relation values (214, 24);
+insert into help_relation values (215, 25);
+insert into help_relation values (215, 26);
+insert into help_relation values (215, 27);
+insert into help_relation values (216, 28);
+insert into help_relation values (217, 29);
+insert into help_relation values (218, 30);
+insert into help_relation values (219, 31);
+insert into help_relation values (220, 32);
+insert into help_relation values (221, 33);
+insert into help_relation values (235, 34);
+insert into help_relation values (236, 35);
+insert into help_relation values (237, 36);
+insert into help_relation values (239, 37);
+insert into help_relation values (240, 38);
+insert into help_relation values (241, 39);
+insert into help_relation values (252, 40);
+insert into help_relation values (253, 4);
+insert into help_relation values (254, 41);
+insert into help_relation values (255, 42);
+insert into help_relation values (256, 43);
+insert into help_relation values (258, 44);
+insert into help_relation values (260, 45);
+insert into help_relation values (261, 46);
+insert into help_relation values (262, 47);
+insert into help_relation values (262, 48);
+insert into help_relation values (263, 49);
+insert into help_relation values (264, 50);
+insert into help_relation values (264, 51);
+insert into help_relation values (264, 52);
+insert into help_relation values (264, 53);
+insert into help_relation values (266, 54);
+insert into help_relation values (266, 55);
+insert into help_relation values (272, 56);
+insert into help_relation values (278, 57);
+insert into help_relation values (278, 58);
+insert into help_relation values (308, 59);
+insert into help_relation values (315, 60);
+insert into help_relation values (315, 61);
insert into help_relation values (335, 62);
insert into help_relation values (336, 62);
+insert into help_relation values (337, 63);
insert into help_relation values (337, 62);
-insert into help_relation values (340, 2);
-insert into help_relation values (340, 3);
-insert into help_relation values (344, 62);
-insert into help_relation values (345, 62);
+insert into help_relation values (338, 62);
+insert into help_relation values (339, 62);
+insert into help_relation values (342, 2);
+insert into help_relation values (342, 3);
insert into help_relation values (346, 62);
insert into help_relation values (347, 62);
insert into help_relation values (348, 62);
insert into help_relation values (349, 62);
-insert into help_relation values (356, 62);
+insert into help_relation values (350, 62);
+insert into help_relation values (351, 62);
insert into help_relation values (358, 62);
-insert into help_relation values (359, 62);
insert into help_relation values (360, 62);
insert into help_relation values (361, 62);
insert into help_relation values (362, 62);
@@ -1180,67 +1184,69 @@ insert into help_relation values (397, 62);
insert into help_relation values (398, 62);
insert into help_relation values (399, 62);
insert into help_relation values (400, 62);
-insert into help_relation values (405, 64);
-insert into help_relation values (405, 65);
-insert into help_relation values (410, 62);
-insert into help_relation values (411, 62);
-insert into help_relation values (412, 66);
-insert into help_relation values (416, 67);
-insert into help_relation values (427, 68);
-insert into help_relation values (433, 69);
-insert into help_relation values (434, 69);
+insert into help_relation values (401, 62);
+insert into help_relation values (402, 62);
+insert into help_relation values (407, 64);
+insert into help_relation values (407, 65);
+insert into help_relation values (412, 62);
+insert into help_relation values (413, 62);
+insert into help_relation values (414, 66);
+insert into help_relation values (418, 67);
+insert into help_relation values (429, 68);
insert into help_relation values (435, 69);
-insert into help_relation values (440, 2);
-insert into help_relation values (440, 3);
-insert into help_relation values (455, 70);
-insert into help_relation values (462, 71);
-insert into help_relation values (462, 72);
-insert into help_relation values (468, 73);
-insert into help_relation values (468, 74);
-insert into help_relation values (625, 75);
-insert into help_relation values (635, 76);
-insert into help_relation values (654, 77);
-insert into help_relation values (660, 78);
-insert into help_relation values (667, 59);
-insert into help_relation values (682, 79);
-insert into help_relation values (691, 4);
-insert into help_relation values (693, 80);
-insert into help_relation values (700, 81);
-insert into help_relation values (701, 4);
-insert into help_relation values (705, 82);
-insert into help_relation values (711, 83);
-insert into help_relation values (715, 84);
-insert into help_relation values (715, 85);
-insert into help_relation values (715, 86);
-insert into help_relation values (716, 87);
-insert into help_relation values (717, 4);
-insert into help_relation values (718, 4);
-insert into help_relation values (719, 4);
-insert into help_relation values (720, 4);
+insert into help_relation values (436, 69);
+insert into help_relation values (437, 69);
+insert into help_relation values (442, 2);
+insert into help_relation values (442, 3);
+insert into help_relation values (457, 70);
+insert into help_relation values (464, 71);
+insert into help_relation values (464, 72);
+insert into help_relation values (470, 73);
+insert into help_relation values (470, 74);
+insert into help_relation values (627, 75);
+insert into help_relation values (637, 76);
+insert into help_relation values (656, 77);
+insert into help_relation values (662, 78);
+insert into help_relation values (670, 59);
+insert into help_relation values (686, 79);
+insert into help_relation values (695, 4);
+insert into help_relation values (697, 80);
+insert into help_relation values (704, 81);
+insert into help_relation values (705, 4);
+insert into help_relation values (709, 82);
+insert into help_relation values (715, 83);
+insert into help_relation values (719, 84);
+insert into help_relation values (719, 85);
+insert into help_relation values (719, 86);
+insert into help_relation values (720, 87);
insert into help_relation values (721, 4);
insert into help_relation values (722, 4);
insert into help_relation values (723, 4);
insert into help_relation values (724, 4);
+insert into help_relation values (725, 4);
insert into help_relation values (726, 4);
insert into help_relation values (727, 4);
-insert into help_relation values (735, 4);
-insert into help_relation values (736, 88);
-insert into help_relation values (737, 89);
-insert into help_relation values (809, 90);
-insert into help_relation values (809, 91);
-insert into help_relation values (810, 92);
-insert into help_relation values (810, 93);
-insert into help_relation values (811, 94);
-insert into help_relation values (811, 95);
-insert into help_relation values (812, 96);
-insert into help_relation values (812, 97);
-insert into help_relation values (813, 98);
-insert into help_relation values (813, 99);
-insert into help_relation values (814, 100);
-insert into help_relation values (815, 101);
-insert into help_relation values (816, 102);
-insert into help_relation values (817, 103);
-insert into help_relation values (817, 104);
-insert into help_relation values (821, 105);
-insert into help_relation values (821, 106);
+insert into help_relation values (728, 4);
+insert into help_relation values (730, 4);
+insert into help_relation values (731, 4);
+insert into help_relation values (739, 4);
+insert into help_relation values (740, 88);
+insert into help_relation values (741, 89);
+insert into help_relation values (815, 90);
+insert into help_relation values (815, 91);
+insert into help_relation values (816, 92);
+insert into help_relation values (816, 93);
+insert into help_relation values (817, 94);
+insert into help_relation values (817, 95);
+insert into help_relation values (818, 96);
+insert into help_relation values (818, 97);
+insert into help_relation values (819, 98);
+insert into help_relation values (819, 99);
+insert into help_relation values (820, 100);
+insert into help_relation values (821, 101);
+insert into help_relation values (822, 102);
+insert into help_relation values (823, 103);
+insert into help_relation values (823, 104);
+insert into help_relation values (827, 105);
+insert into help_relation values (827, 106);
unlock tables;
diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh
index 3411c53603b..766c1895bb1 100644
--- a/scripts/mysql_install_db.sh
+++ b/scripts/mysql_install_db.sh
@@ -41,6 +41,7 @@ cross_bootstrap=0
auth_root_authentication_method=socket
auth_root_socket_user=""
skip_test_db=0
+extra_file=""
dirname0=`dirname $0 2>/dev/null`
dirname0=`dirname $dirname0 2>/dev/null`
@@ -101,6 +102,8 @@ Usage: $0 [OPTIONS]
group. You must be root to use this option. By default
mysqld runs using your current group and files and
directories that it creates will be owned by you.
+ --extra-file=file Add user defined SQL file, to be executed following
+ regular database initialization.
All other options are passed to the mysqld program
@@ -186,6 +189,8 @@ parse_arguments()
--auth-root-socket-user=*)
auth_root_socket_user="$(parse_arg "$arg")" ;;
--skip-test-db) skip_test_db=1 ;;
+ --extra-file=*)
+ extra_file="$(parse_arg "$arg")" ;;
*)
if test -n "$pick_args"
@@ -407,6 +412,13 @@ do
fi
done
+# Verify extra file exists if it's not null
+if test ! -z "$extra_file" -a ! -f "$extra_file"
+then
+ cannot_find_file "$extra_file"
+ exit 1
+fi
+
if test ! -x "$mysqld"
then
cannot_find_file "$mysqld"
@@ -573,6 +585,12 @@ cat_sql()
then
cat "$mysql_test_db"
fi
+
+ # cat extra file if it's not null
+ if test ! -z "$extra_file"
+ then
+ cat "$extra_file"
+ fi
}
# Create the system and help tables by passing them to "mysqld --bootstrap"
diff --git a/scripts/mysql_system_tables.sql b/scripts/mysql_system_tables.sql
index bc204323d96..fd2f1c95dda 100644
--- a/scripts/mysql_system_tables.sql
+++ b/scripts/mysql_system_tables.sql
@@ -312,7 +312,7 @@ DROP TABLE tmp_proxies_priv;
CREATE TABLE IF NOT EXISTS table_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, cardinality bigint(21) unsigned DEFAULT NULL, PRIMARY KEY (db_name,table_name) ) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Tables';
-CREATE TABLE IF NOT EXISTS column_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, column_name varchar(64) NOT NULL, min_value varbinary(255) DEFAULT NULL, max_value varbinary(255) DEFAULT NULL, nulls_ratio decimal(12,4) DEFAULT NULL, avg_length decimal(12,4) DEFAULT NULL, avg_frequency decimal(12,4) DEFAULT NULL, hist_size tinyint unsigned, hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB'), histogram varbinary(255), PRIMARY KEY (db_name,table_name,column_name) ) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Columns';
+CREATE TABLE IF NOT EXISTS column_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, column_name varchar(64) NOT NULL, min_value varbinary(255) DEFAULT NULL, max_value varbinary(255) DEFAULT NULL, nulls_ratio decimal(12,4) DEFAULT NULL, avg_length decimal(12,4) DEFAULT NULL, avg_frequency decimal(12,4) DEFAULT NULL, hist_size tinyint unsigned, hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB'), histogram longblob, PRIMARY KEY (db_name,table_name,column_name) ) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Columns';
CREATE TABLE IF NOT EXISTS index_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, index_name varchar(64) NOT NULL, prefix_arity int(11) unsigned NOT NULL, avg_frequency decimal(12,4) DEFAULT NULL, PRIMARY KEY (db_name,table_name,index_name,prefix_arity) ) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Indexes';
diff --git a/scripts/mysql_system_tables_fix.sql b/scripts/mysql_system_tables_fix.sql
index d196c207802..e29afc2ff07 100644
--- a/scripts/mysql_system_tables_fix.sql
+++ b/scripts/mysql_system_tables_fix.sql
@@ -29,6 +29,18 @@ set default_storage_engine=Aria;
set enforce_storage_engine=NULL;
set alter_algorithm='DEFAULT';
+
+--
+-- Upgrade mysql.column_stats table early because its quite noisy otherwise
+--
+
+ALTER TABLE column_stats
+ modify min_value varbinary(255) DEFAULT NULL,
+ modify max_value varbinary(255) DEFAULT NULL,
+ modify hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB'),
+ modify histogram longblob,
+ ENGINE=Aria transactional=0;
+
set @have_innodb= (select count(engine) from information_schema.engines where engine='INNODB' and support != 'NO');
# MDEV-21873: 10.2 to 10.3 upgrade doesn't remove semi-sync reference from
@@ -66,7 +78,6 @@ ALTER TABLE help_category ENGINE=Aria transactional=0;
ALTER TABLE help_relation ENGINE=Aria transactional=0;
ALTER TABLE help_keyword ENGINE=Aria transactional=0;
ALTER TABLE table_stats ENGINE=Aria transactional=0;
-ALTER TABLE column_stats ENGINE=Aria transactional=0;
ALTER TABLE index_stats ENGINE=Aria transactional=0;
ALTER TABLE user add File_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL;
@@ -780,9 +791,6 @@ flush privileges;
ALTER TABLE help_category MODIFY url TEXT NOT NULL;
ALTER TABLE help_topic MODIFY url TEXT NOT NULL;
-# MDEV-7383 - varbinary on mix/max of column_stats
-alter table column_stats modify min_value varbinary(255) DEFAULT NULL, modify max_value varbinary(255) DEFAULT NULL;
-
DELIMITER //
IF 'BASE TABLE' = (select table_type from information_schema.tables where table_schema=database() and table_name='user') THEN
CREATE TABLE IF NOT EXISTS global_priv (Host char(255) binary DEFAULT '', User char(128) binary DEFAULT '', Priv JSON NOT NULL DEFAULT '{}' CHECK(JSON_VALID(Priv)), PRIMARY KEY Host (Host,User)) engine=Aria transactional=1 CHARACTER SET utf8 COLLATE utf8_bin comment='Users and global privileges'
diff --git a/scripts/sys_schema/procedures/ps_setup_save.sql b/scripts/sys_schema/procedures/ps_setup_save.sql
index a5a2197e935..b7843ecd1f2 100644
--- a/scripts/sys_schema/procedures/ps_setup_save.sql
+++ b/scripts/sys_schema/procedures/ps_setup_save.sql
@@ -80,14 +80,11 @@ BEGIN
DROP TEMPORARY TABLE IF EXISTS tmp_setup_instruments;
DROP TEMPORARY TABLE IF EXISTS tmp_threads;
- CREATE TEMPORARY TABLE tmp_setup_actors LIKE performance_schema.setup_actors;
- CREATE TEMPORARY TABLE tmp_setup_consumers LIKE performance_schema.setup_consumers;
- CREATE TEMPORARY TABLE tmp_setup_instruments LIKE performance_schema.setup_instruments;
+ CREATE TEMPORARY TABLE tmp_setup_actors AS SELECT * FROM performance_schema.setup_actors;
+ CREATE TEMPORARY TABLE tmp_setup_consumers AS SELECT * FROM performance_schema.setup_consumers;
+ CREATE TEMPORARY TABLE tmp_setup_instruments AS SELECT * FROM performance_schema.setup_instruments;
CREATE TEMPORARY TABLE tmp_threads (THREAD_ID bigint unsigned NOT NULL PRIMARY KEY, INSTRUMENTED enum('YES','NO') NOT NULL);
- INSERT INTO tmp_setup_actors SELECT * FROM performance_schema.setup_actors;
- INSERT INTO tmp_setup_consumers SELECT * FROM performance_schema.setup_consumers;
- INSERT INTO tmp_setup_instruments SELECT * FROM performance_schema.setup_instruments;
INSERT INTO tmp_threads SELECT THREAD_ID, INSTRUMENTED FROM performance_schema.threads;
ELSE
SIGNAL SQLSTATE VALUE '90000'
diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh
index 5279929c5b0..a7c2688df76 100644
--- a/scripts/wsrep_sst_rsync.sh
+++ b/scripts/wsrep_sst_rsync.sh
@@ -616,11 +616,11 @@ FILTER="-f '- /lost+found'
wsrep_log_info "Transfer of InnoDB data files done"
- # second, we transfer InnoDB log files
+ # second, we transfer the InnoDB log file
rsync ${STUNNEL:+--rsh="$STUNNEL"} \
--owner --group --perms --links --specials \
--ignore-times --inplace --dirs --delete --quiet \
- $WHOLE_FILE_OPT -f '+ /ib_logfile[0-9]*' \
+ $WHOLE_FILE_OPT -f '+ /ib_logfile0' \
-f '- **' "$ib_log_dir/" \
"rsync://$WSREP_SST_OPT_ADDR-log_dir" >&2 || RC=$?
diff --git a/sql-common/client.c b/sql-common/client.c
index e65367baddb..d2c6778e167 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -1712,14 +1712,14 @@ static MYSQL_METHODS client_methods=
cli_use_result, /* use_result */
cli_fetch_lengths, /* fetch_lengths */
cli_flush_use_result, /* flush_use_result */
- cli_read_change_user_result /* read_change_user_result */
+ cli_read_change_user_result, /* read_change_user_result */
+ NULL /* on_close_free */
#ifndef MYSQL_SERVER
,cli_list_fields, /* list_fields */
cli_read_prepare_result, /* read_prepare_result */
cli_stmt_execute, /* stmt_execute */
cli_read_binary_rows, /* read_binary_rows */
cli_unbuffered_fetch, /* unbuffered_fetch */
- NULL, /* free_embedded_thd */
cli_read_statistics, /* read_statistics */
cli_read_query_result, /* next_result */
cli_read_binary_rows /* read_rows_from_cursor */
@@ -3321,10 +3321,8 @@ static void mysql_close_free(MYSQL *mysql)
my_free(mysql->user);
my_free(mysql->passwd);
my_free(mysql->db);
-#if defined(EMBEDDED_LIBRARY) || MYSQL_VERSION_ID >= 50100
- my_free(mysql->info_buffer);
- mysql->info_buffer= 0;
-#endif
+ if (mysql->methods && mysql->methods->on_close_free)
+ (*mysql->methods->on_close_free)(mysql);
/* Clear pointers for better safety */
mysql->host_info= mysql->user= mysql->passwd= mysql->db= 0;
}
@@ -3443,13 +3441,6 @@ void STDCALL mysql_close(MYSQL *mysql)
mysql_close_free_options(mysql);
mysql_close_free(mysql);
mysql_detach_stmt_list(&mysql->stmts, "mysql_close");
-#ifndef MYSQL_SERVER
- if (mysql->thd)
- {
- (*mysql->methods->free_embedded_thd)(mysql);
- mysql->thd= 0;
- }
-#endif
if (mysql->free_me)
my_free(mysql);
}
diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt
index 711b7d9101a..dfbe568ac0b 100644
--- a/sql/CMakeLists.txt
+++ b/sql/CMakeLists.txt
@@ -52,6 +52,7 @@ ENDIF()
INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/sql
+${LIBFMT_INCLUDE_DIR}
${PCRE_INCLUDES}
${ZLIB_INCLUDE_DIR}
${SSL_INCLUDE_DIRS}
@@ -97,9 +98,9 @@ SET (SQL_SOURCE
filesort.cc gstream.cc
signal_handler.cc
handler.cc
- hostname.cc init.cc item.cc item_buff.cc item_cmpfunc.cc
- item_create.cc item_func.cc item_geofunc.cc item_row.cc
- item_strfunc.cc item_subselect.cc item_sum.cc item_timefunc.cc
+ hostname.cc init.cc item.cc item_buff.cc item_cmpfunc.cc
+ item_create.cc item_func.cc item_geofunc.cc item_row.cc
+ item_strfunc.cc item_subselect.cc item_sum.cc item_timefunc.cc
key.cc log.cc lock.cc
log_event.cc log_event_server.cc
rpl_record.cc rpl_reporting.cc
@@ -108,33 +109,33 @@ SET (SQL_SOURCE
mysqld.cc net_serv.cc keycaches.cc
../sql-common/client_plugin.c
opt_range.cc opt_sum.cc
- ../sql-common/pack.c parse_file.cc password.c procedure.cc
+ ../sql-common/pack.c parse_file.cc password.c procedure.cc
protocol.cc records.cc repl_failsafe.cc rpl_filter.cc
session_tracker.cc
- set_var.cc
- slave.cc sp.cc sp_cache.cc sp_head.cc sp_pcontext.cc
- sp_rcontext.cc spatial.cc sql_acl.cc sql_analyse.cc sql_base.cc
+ set_var.cc
+ slave.cc sp.cc sp_cache.cc sp_head.cc sp_pcontext.cc
+ sp_rcontext.cc spatial.cc sql_acl.cc sql_analyse.cc sql_base.cc
sql_cache.cc sql_class.cc sql_client.cc sql_crypt.cc
sql_cursor.cc sql_db.cc sql_delete.cc sql_derived.cc
- sql_digest.cc sql_do.cc
+ sql_digest.cc sql_do.cc
sql_error.cc sql_handler.cc sql_get_diagnostics.cc
- sql_help.cc sql_insert.cc sql_lex.cc
+ sql_help.cc sql_insert.cc sql_lex.cc
sql_list.cc sql_load.cc sql_manager.cc
sql_parse.cc sql_bootstrap.cc
- sql_partition.cc sql_plugin.cc sql_prepare.cc sql_rename.cc
+ sql_partition.cc sql_plugin.cc sql_prepare.cc sql_rename.cc
debug_sync.cc debug.cc
sql_repl.cc sql_select.cc sql_show.cc sql_state.c
group_by_handler.cc derived_handler.cc select_handler.cc
sql_statistics.cc sql_string.cc lex_string.h
sql_table.cc sql_test.cc sql_trigger.cc sql_udf.cc sql_union.cc
ddl_log.cc ddl_log.h
- sql_update.cc sql_view.cc strfunc.cc table.cc thr_malloc.cc
- sql_time.cc tztime.cc unireg.cc item_xmlfunc.cc
+ sql_update.cc sql_view.cc strfunc.cc table.cc thr_malloc.cc
+ sql_time.cc tztime.cc unireg.cc item_xmlfunc.cc
uniques.cc
rpl_tblmap.cc sql_binlog.cc event_scheduler.cc
event_data_objects.cc
- event_queue.cc event_db_repository.cc
- sql_tablespace.cc events.cc ../sql-common/my_user.c
+ event_queue.cc event_db_repository.cc
+ events.cc ../sql-common/my_user.c
partition_info.cc rpl_utility.cc rpl_utility_server.cc
rpl_injector.cc sql_locale.cc
rpl_rli.cc rpl_mi.cc sql_servers.cc sql_audit.cc
@@ -150,6 +151,7 @@ SET (SQL_SOURCE
sql_analyze_stmt.cc
sql_join_cache.cc
create_options.cc multi_range_read.cc
+ opt_histogram_json.cc
opt_index_cond_pushdown.cc opt_subselect.cc
opt_table_elimination.cc sql_expression_cache.cc
gcalc_slicescan.cc gcalc_tools.cc
@@ -328,24 +330,24 @@ ENDIF()
# On Solaris, some extra effort is required in order to get dtrace probes
# from static libraries
-DTRACE_INSTRUMENT_STATIC_LIBS(mariadbd
+DTRACE_INSTRUMENT_STATIC_LIBS(mariadbd
"sql;mysys;mysys_ssl;${MYSQLD_STATIC_PLUGIN_LIBS}")
-
+
SET(WITH_MYSQLD_LDFLAGS "" CACHE STRING "Additional linker flags for mysqld")
MARK_AS_ADVANCED(WITH_MYSQLD_LDFLAGS)
IF(WITH_MYSQLD_LDFLAGS)
GET_TARGET_PROPERTY(MYSQLD_LINK_FLAGS mariadbd LINK_FLAGS)
IF(NOT MYSQLD_LINK_FLAGS)
- SET(MYSQLD_LINK_FLAGS)
- ENDIF()
- SET_TARGET_PROPERTIES(mariadbd PROPERTIES LINK_FLAGS
+ SET(MYSQLD_LINK_FLAGS)
+ ENDIF()
+ SET_TARGET_PROPERTIES(mariadbd PROPERTIES LINK_FLAGS
"${MYSQLD_LINK_FLAGS} ${WITH_MYSQLD_LDFLAGS}")
ENDIF()
-# Handle out-of-source build from source package with possibly broken
-# bison. Copy bison output to from source to build directory, if not already
+# Handle out-of-source build from source package with possibly broken
+# bison. Copy bison output to from source to build directory, if not already
# there
IF (NOT BISON_FOUND)
IF (NOT ${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
@@ -407,6 +409,10 @@ ADD_CUSTOM_TARGET(
)
ADD_DEPENDENCIES(sql GenServerSource)
+IF(TARGET libfmt)
+ ADD_DEPENDENCIES(sql libfmt)
+ENDIF()
+
IF(WIN32 OR HAVE_DLOPEN AND NOT DISABLE_SHARED)
ADD_LIBRARY(udf_example MODULE udf_example.c udf_example.def)
SET_TARGET_PROPERTIES(udf_example PROPERTIES PREFIX "")
@@ -456,9 +462,9 @@ IF(TARGET mariadbd AND (NOT CMAKE_CROSSCOMPILING OR DEFINED CMAKE_CROSSCOMPILING
ELSE()
SET(ALL_ON_WINDOWS)
ENDIF()
- ADD_CUSTOM_TARGET(initial_database
+ ADD_CUSTOM_TARGET(initial_database
${ALL_ON_WINDOWS}
- DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/initdb.dep
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/initdb.dep
)
ENDIF()
@@ -467,7 +473,7 @@ IF(WIN32)
FILE(TO_NATIVE_PATH ${my_bootstrap_sql} native_outfile)
# Create bootstrapper SQL script
- ADD_CUSTOM_COMMAND(OUTPUT
+ ADD_CUSTOM_COMMAND(OUTPUT
${my_bootstrap_sql}
COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/scripts
cmd /c copy mysql_system_tables.sql+mysql_system_tables_data.sql+fill_help_tables.sql+mysql_performance_tables.sql+mysql_test_db.sql+mysql_sys_schema.sql ${native_outfile}
@@ -490,16 +496,15 @@ IF(WIN32)
DEPENDS comp_sql ${my_bootstrap_sql}
)
- MYSQL_ADD_EXECUTABLE(mariadb-install-db
+ MYSQL_ADD_EXECUTABLE(mariadb-install-db
mysql_install_db.cc
${CMAKE_CURRENT_BINARY_DIR}/mysql_bootstrap_sql.c
+ password.c
COMPONENT Server
)
-
SET_TARGET_PROPERTIES(mariadb-install-db PROPERTIES COMPILE_DEFINITIONS
- "INSTALL_PLUGINDIR=${INSTALL_PLUGINDIR};INSTALL_SHAREDIR=${INSTALL_SHAREDIR}"
- )
- TARGET_LINK_LIBRARIES(mariadb-install-db mysys shlwapi)
+ "INSTALL_PLUGINDIR=${INSTALL_PLUGINDIR};INSTALL_SHAREDIR=${INSTALL_SHAREDIR}")
+ TARGET_LINK_LIBRARIES(mariadb-install-db mysys mysys_ssl shlwapi)
ADD_LIBRARY(winservice STATIC winservice.c)
TARGET_LINK_LIBRARIES(winservice shell32)
diff --git a/sql/backup.cc b/sql/backup.cc
index 5f74c67add7..3e0986e944f 100644
--- a/sql/backup.cc
+++ b/sql/backup.cc
@@ -427,6 +427,9 @@ bool backup_end(THD *thd)
!wsrep_check_mode(WSREP_MODE_BF_MARIABACKUP))
{
Wsrep_server_state &server_state= Wsrep_server_state::instance();
+ THD_STAGE_INFO(thd, stage_waiting_flow);
+ WSREP_DEBUG("backup_end: waiting for flow control for %s",
+ wsrep_thd_query(thd));
server_state.resume_and_resync();
thd->wsrep_desynced_backup_stage= false;
}
@@ -578,7 +581,7 @@ static char *add_id_to_buffer(char *ptr, const LEX_CUSTRING *from)
tmp.str= buff;
tmp.length= MY_UUID_STRING_LENGTH;
- my_uuid2str(from->str, buff);
+ my_uuid2str(from->str, buff, 1);
return add_str_to_buffer(ptr, &tmp);
}
diff --git a/sql/create_options.cc b/sql/create_options.cc
index 5437de0f0c3..cea5d7af950 100644
--- a/sql/create_options.cc
+++ b/sql/create_options.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010, 2020, MariaDB Corporation.
+/* Copyright (C) 2010, 2020, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -21,6 +21,7 @@
#include "mariadb.h"
#include "create_options.h"
+#include "partition_info.h"
#include <my_getopt.h>
#include "set_var.h"
@@ -339,8 +340,11 @@ bool parse_option_list(THD* thd, handlerton *hton, void *option_struct_arg,
LEX_CSTRING name= { opt->name, opt->name_length };
default_val.str= strmake_root(root, str->ptr(), str->length());
default_val.length= str->length();
- val= new (root) engine_option_value(name, default_val,
- opt->type != HA_OPTION_TYPE_ULL, option_list, &last);
+ val= new (root) engine_option_value(
+ name, default_val, opt->type != HA_OPTION_TYPE_ULL);
+ if (!val)
+ DBUG_RETURN(TRUE);
+ val->link(option_list, &last);
val->parsed= true;
}
}
@@ -497,6 +501,61 @@ bool parse_engine_table_options(THD *thd, handlerton *ht, TABLE_SHARE *share)
DBUG_RETURN(FALSE);
}
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+/**
+ Parses engine-defined partition options
+
+ @param [in] thd thread handler
+ @parem [in] table table with part_info
+
+ @retval TRUE Error
+ @retval FALSE OK
+
+ In the case of ALTER TABLE statements, table->part_info is set up
+ by mysql_unpack_partition(). So, one should not call the present
+ function before the call of mysql_unpack_partition().
+*/
+bool parse_engine_part_options(THD *thd, TABLE *table)
+{
+ MEM_ROOT *root= &table->mem_root;
+ TABLE_SHARE *share= table->s;
+ partition_info *part_info= table->part_info;
+ engine_option_value *tmp_option_list;
+ handlerton *ht;
+ DBUG_ENTER("parse_engine_part_options");
+
+ if (!part_info)
+ DBUG_RETURN(FALSE);
+
+ List_iterator<partition_element> it(part_info->partitions);
+ while (partition_element *part_elem= it++)
+ {
+ if (merge_engine_options(share->option_list, part_elem->option_list,
+ &tmp_option_list, root))
+ DBUG_RETURN(TRUE);
+
+ if (!part_info->is_sub_partitioned())
+ {
+ ht= part_elem->engine_type;
+ if (parse_option_list(thd, ht, &part_elem->option_struct,
+ &tmp_option_list, ht->table_options, TRUE, root))
+ DBUG_RETURN(TRUE);
+ }
+ else
+ {
+ List_iterator<partition_element> sub_it(part_elem->subpartitions);
+ while (partition_element *sub_part_elem= sub_it++)
+ {
+ ht= sub_part_elem->engine_type;
+ if (parse_option_list(thd, ht, &sub_part_elem->option_struct,
+ &tmp_option_list, ht->table_options, TRUE, root))
+ DBUG_RETURN(TRUE);
+ }
+ }
+ }
+ DBUG_RETURN(FALSE);
+}
+#endif
bool engine_options_differ(void *old_struct, void *new_struct,
ha_create_table_option *rules)
@@ -694,10 +753,11 @@ uchar *engine_option_value::frm_read(const uchar *buff, const uchar *buff_end,
return NULL;
buff+= value.length;
- engine_option_value *ptr=new (root)
- engine_option_value(name, value, len & FRM_QUOTED_VALUE, start, end);
+ engine_option_value *ptr=
+ new (root) engine_option_value(name, value, len & FRM_QUOTED_VALUE);
if (!ptr)
return NULL;
+ ptr->link(start, end);
return (uchar *)buff;
}
@@ -766,23 +826,40 @@ bool engine_table_options_frm_read(const uchar *buff, size_t length,
/**
Merges two lists of engine_option_value's with duplicate removal.
-*/
-engine_option_value *merge_engine_table_options(engine_option_value *first,
- engine_option_value *second,
- MEM_ROOT *root)
+ @param [in] source option list
+ @param [in] changes option list whose options overwrite source's
+ @param [out] out new option list created by merging given two
+ @param [in] root MEM_ROOT for allocating memory
+
+ @retval TRUE Error
+ @retval FALSE OK
+*/
+bool merge_engine_options(engine_option_value *source,
+ engine_option_value *changes,
+ engine_option_value **out, MEM_ROOT *root)
{
- engine_option_value *UNINIT_VAR(end), *opt;
- DBUG_ENTER("merge_engine_table_options");
+ engine_option_value *UNINIT_VAR(end), *opt, *opt_copy;
+ *out= 0;
+ DBUG_ENTER("merge_engine_options");
- /* Create copy of first list */
- for (opt= first, first= 0; opt; opt= opt->next)
- new (root) engine_option_value(opt, &first, &end);
+ /* Create copy of source list */
+ for (opt= source; opt; opt= opt->next)
+ {
+ opt_copy= new (root) engine_option_value(opt);
+ if (!opt_copy)
+ DBUG_RETURN(TRUE);
+ opt_copy->link(out, &end);
+ }
- for (opt= second; opt; opt= opt->next)
- new (root) engine_option_value(opt->name, opt->value, opt->quoted_value,
- &first, &end);
- DBUG_RETURN(first);
+ for (opt= changes; opt; opt= opt->next)
+ {
+ opt_copy= new (root) engine_option_value(opt);
+ if (!opt_copy)
+ DBUG_RETURN(TRUE);
+ opt_copy->link(out, &end);
+ }
+ DBUG_RETURN(FALSE);
}
bool is_engine_option_known(engine_option_value *opt,
diff --git a/sql/create_options.h b/sql/create_options.h
index ce64516794b..4961231820f 100644
--- a/sql/create_options.h
+++ b/sql/create_options.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010 Monty Program Ab
+/* Copyright (C) 2010, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -35,30 +35,23 @@ class engine_option_value: public Sql_alloc
bool parsed; ///< to detect unrecognized options
bool quoted_value; ///< option=VAL vs. option='VAL'
- engine_option_value(engine_option_value *src,
- engine_option_value **start, engine_option_value **end) :
+ engine_option_value(engine_option_value *src) :
name(src->name), value(src->value),
next(NULL), parsed(src->parsed), quoted_value(src->quoted_value)
{
- link(start, end);
}
engine_option_value(LEX_CSTRING &name_arg, LEX_CSTRING &value_arg,
- bool quoted,
- engine_option_value **start, engine_option_value **end) :
+ bool quoted) :
name(name_arg), value(value_arg),
next(NULL), parsed(false), quoted_value(quoted)
{
- link(start, end);
}
- engine_option_value(LEX_CSTRING &name_arg,
- engine_option_value **start, engine_option_value **end) :
+ engine_option_value(LEX_CSTRING &name_arg):
name(name_arg), value(null_clex_str),
next(NULL), parsed(false), quoted_value(false)
{
- link(start, end);
}
engine_option_value(LEX_CSTRING &name_arg, ulonglong value_arg,
- engine_option_value **start, engine_option_value **end,
MEM_ROOT *root) :
name(name_arg), next(NULL), parsed(false), quoted_value(false)
{
@@ -66,7 +59,6 @@ class engine_option_value: public Sql_alloc
if (likely((value.str= str= (char *)alloc_root(root, 22))))
{
value.length= longlong10_to_str(value_arg, str, 10) - str;
- link(start, end);
}
}
static uchar *frm_read(const uchar *buff, const uchar *buff_end,
@@ -83,15 +75,18 @@ class Create_field;
bool resolve_sysvar_table_options(handlerton *hton);
void free_sysvar_table_options(handlerton *hton);
bool parse_engine_table_options(THD *thd, handlerton *ht, TABLE_SHARE *share);
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+bool parse_engine_part_options(THD *thd, TABLE *table);
+#endif
bool parse_option_list(THD* thd, handlerton *hton, void *option_struct,
engine_option_value **option_list,
ha_create_table_option *rules,
bool suppress_warning, MEM_ROOT *root);
bool engine_table_options_frm_read(const uchar *buff, size_t length,
TABLE_SHARE *share);
-engine_option_value *merge_engine_table_options(engine_option_value *source,
- engine_option_value *changes,
- MEM_ROOT *root);
+bool merge_engine_options(engine_option_value *source,
+ engine_option_value *changes,
+ engine_option_value **out, MEM_ROOT *root);
uint engine_table_options_frm_length(engine_option_value *table_option_list,
List<Create_field> &create_fields,
diff --git a/sql/ddl_log.cc b/sql/ddl_log.cc
index 8722d88ba95..2ac4e256112 100644
--- a/sql/ddl_log.cc
+++ b/sql/ddl_log.cc
@@ -77,6 +77,8 @@
#define DDL_LOG_MAGIC_LENGTH 4
/* How many times to try to execute a ddl log entry that causes crashes */
#define DDL_LOG_MAX_RETRY 3
+#define DDL_LOG_RETRY_MASK 0xFF
+#define DDL_LOG_RETRY_BITS 8
uchar ddl_log_file_magic[]=
{ (uchar) 254, (uchar) 254, (uchar) 11, (uchar) 2 };
@@ -155,7 +157,7 @@ mysql_mutex_t LOCK_gdl;
#define DDL_LOG_XID_POS 10
/* Used to store unique uuid from the .frm file */
#define DDL_LOG_UUID_POS 18
-/* ID_POS can be used to store something unique, like file size (4 bytes) */
+/* ID_POS can be used to store something unique, like file size (8 bytes) */
#define DDL_LOG_ID_POS DDL_LOG_UUID_POS + MY_UUID_SIZE
#define DDL_LOG_END_POS DDL_LOG_ID_POS + 8
@@ -335,7 +337,7 @@ static bool write_ddl_log_file_entry(uint entry_pos)
static bool update_phase(uint entry_pos, uchar phase)
{
DBUG_ENTER("update_phase");
- DBUG_PRINT("enter", ("phase: %d", (int) phase));
+ DBUG_PRINT("ddl_log", ("pos: %u phase: %u", entry_pos, (uint) phase));
DBUG_RETURN(mysql_file_pwrite(global_ddl_log.file_id, &phase, 1,
global_ddl_log.io_size * entry_pos +
@@ -369,6 +371,8 @@ static bool update_next_entry_pos(uint entry_pos, uint next_entry)
uchar buff[4];
DBUG_ENTER("update_next_entry_pos");
+ DBUG_PRINT("ddl_log", ("pos: %u->%u", entry_pos, next_entry));
+
int4store(buff, next_entry);
DBUG_RETURN(mysql_file_pwrite(global_ddl_log.file_id, buff, sizeof(buff),
global_ddl_log.io_size * entry_pos +
@@ -420,6 +424,7 @@ static bool disable_execute_entry(uint entry_pos)
{
uchar buff[1];
DBUG_ENTER("disable_execute_entry");
+ DBUG_PRINT("ddl_log", ("pos: {%u}", entry_pos));
buff[0]= DDL_LOG_IGNORE_ENTRY_CODE;
DBUG_RETURN(mysql_file_pwrite(global_ddl_log.file_id, buff, sizeof(buff),
@@ -1296,13 +1301,15 @@ static int ddl_log_execute_action(THD *thd, MEM_ROOT *mem_root,
mysql_mutex_assert_owner(&LOCK_gdl);
DBUG_PRINT("ddl_log",
- ("entry type: %u action type: %u (%s) phase: %u next: %u "
+ ("pos: %u=>%u->%u type: %u action: %u (%s) phase: %u "
"handler: '%s' name: '%s' from_name: '%s' tmp_name: '%s'",
+ recovery_state.execute_entry_pos,
+ ddl_log_entry->entry_pos,
+ ddl_log_entry->next_entry,
(uint) ddl_log_entry->entry_type,
(uint) ddl_log_entry->action_type,
ddl_log_action_name[ddl_log_entry->action_type],
(uint) ddl_log_entry->phase,
- ddl_log_entry->next_entry,
ddl_log_entry->handler_name.str,
ddl_log_entry->name.str,
ddl_log_entry->from_name.str,
@@ -2470,13 +2477,13 @@ bool ddl_log_write_entry(DDL_LOG_ENTRY *ddl_log_entry,
error= FALSE;
DBUG_PRINT("ddl_log",
- ("entry type: %u action type: %u (%s) phase: %u next: %u "
+ ("pos: %u->%u action: %u (%s) phase: %u "
"handler: '%s' name: '%s' from_name: '%s' tmp_name: '%s'",
- (uint) ddl_log_entry->entry_type,
+ (*active_entry)->entry_pos,
+ (uint) ddl_log_entry->next_entry,
(uint) ddl_log_entry->action_type,
ddl_log_action_name[ddl_log_entry->action_type],
(uint) ddl_log_entry->phase,
- ddl_log_entry->next_entry,
ddl_log_entry->handler_name.str,
ddl_log_entry->name.str,
ddl_log_entry->from_name.str,
@@ -2510,6 +2517,7 @@ bool ddl_log_write_entry(DDL_LOG_ENTRY *ddl_log_entry,
@param first_entry First entry in linked list of entries
to execute.
+ @param cond_entry Check and don't execute if cond_entry is active
@param[in,out] active_entry Entry to execute, 0 = NULL if the entry
is written first time and needs to be
returned. In this case the entry written
@@ -2520,6 +2528,7 @@ bool ddl_log_write_entry(DDL_LOG_ENTRY *ddl_log_entry,
*/
bool ddl_log_write_execute_entry(uint first_entry,
+ uint cond_entry,
DDL_LOG_MEMORY_ENTRY **active_entry)
{
uchar *file_entry_buf= global_ddl_log.file_entry_buf;
@@ -2536,13 +2545,17 @@ bool ddl_log_write_execute_entry(uint first_entry,
file_entry_buf[DDL_LOG_ENTRY_TYPE_POS]= (uchar)DDL_LOG_EXECUTE_CODE;
int4store(file_entry_buf + DDL_LOG_NEXT_ENTRY_POS, first_entry);
+ int8store(file_entry_buf + DDL_LOG_ID_POS, ((ulonglong)cond_entry << DDL_LOG_RETRY_BITS));
if (!(*active_entry))
{
if (ddl_log_get_free_entry(active_entry))
DBUG_RETURN(TRUE);
got_free_entry= TRUE;
- }
+ }
+ DBUG_PRINT("ddl_log",
+ ("pos: %u=>%u",
+ (*active_entry)->entry_pos, first_entry));
if (write_ddl_log_file_entry((*active_entry)->entry_pos))
{
sql_print_error("DDL_LOG: Error writing execute entry %u",
@@ -2575,6 +2588,7 @@ bool ddl_log_increment_phase(uint entry_pos)
{
bool error;
DBUG_ENTER("ddl_log_increment_phase");
+ DBUG_PRINT("ddl_log", ("pos: %u", entry_pos));
mysql_mutex_lock(&LOCK_gdl);
error= ddl_log_increment_phase_no_lock(entry_pos);
@@ -2754,13 +2768,13 @@ int ddl_log_execute_recovery()
recovery_state.xid= ddl_log_entry.xid;
/* purecov: begin tested */
- if (ddl_log_entry.unique_id > DDL_LOG_MAX_RETRY)
+ if ((ddl_log_entry.unique_id & DDL_LOG_RETRY_MASK) > DDL_LOG_MAX_RETRY)
{
error= -1;
continue;
}
update_unique_id(i, ++ddl_log_entry.unique_id);
- if (ddl_log_entry.unique_id > DDL_LOG_MAX_RETRY)
+ if ((ddl_log_entry.unique_id & DDL_LOG_RETRY_MASK) > DDL_LOG_MAX_RETRY)
{
sql_print_error("DDL_LOG: Aborting executing entry %u after %llu "
"retries", i, ddl_log_entry.unique_id);
@@ -2769,6 +2783,15 @@ int ddl_log_execute_recovery()
}
/* purecov: end tested */
+ uint cond_entry= (uint)(ddl_log_entry.unique_id >> DDL_LOG_RETRY_BITS);
+
+ if (cond_entry && is_execute_entry_active(cond_entry))
+ {
+ if (disable_execute_entry(i))
+ error= -1;
+ continue;
+ }
+
if (ddl_log_execute_entry_no_lock(thd, ddl_log_entry.next_entry))
{
/* Real unpleasant scenario but we have to continue anyway */
@@ -2848,8 +2871,7 @@ void ddl_log_release()
Methods for DDL_LOG_STATE
*/
-static void add_log_entry(DDL_LOG_STATE *state,
- DDL_LOG_MEMORY_ENTRY *log_entry)
+void ddl_log_add_entry(DDL_LOG_STATE *state, DDL_LOG_MEMORY_ENTRY *log_entry)
{
log_entry->next_active_log_entry= state->list;
state->main_entry= state->list= log_entry;
@@ -3028,7 +3050,7 @@ static bool ddl_log_write(DDL_LOG_STATE *ddl_state,
ddl_log_release_memory_entry(log_entry);
DBUG_RETURN(1);
}
- add_log_entry(ddl_state, log_entry);
+ ddl_log_add_entry(ddl_state, log_entry);
ddl_state->flags|= ddl_log_entry->flags; // Update cache
DBUG_RETURN(0);
}
@@ -3178,7 +3200,7 @@ static bool ddl_log_drop(THD *thd, DDL_LOG_STATE *ddl_state,
}
mysql_mutex_unlock(&LOCK_gdl);
- add_log_entry(ddl_state, log_entry);
+ ddl_log_add_entry(ddl_state, log_entry);
DBUG_RETURN(0);
error:
@@ -3478,7 +3500,7 @@ bool ddl_log_store_query(THD *thd, DDL_LOG_STATE *ddl_state,
goto err;
parent_entry_pos= ddl_state->list->entry_pos;
entry_pos= first_entry->entry_pos;
- add_log_entry(ddl_state, first_entry);
+ ddl_log_add_entry(ddl_state, first_entry);
while (length)
{
@@ -3494,7 +3516,7 @@ bool ddl_log_store_query(THD *thd, DDL_LOG_STATE *ddl_state,
if (ddl_log_get_free_entry(&next_entry))
goto err;
ddl_log_entry.next_entry= next_entry_pos= next_entry->entry_pos;
- add_log_entry(ddl_state, next_entry);
+ ddl_log_add_entry(ddl_state, next_entry);
}
else
{
@@ -3526,3 +3548,32 @@ err:
mysql_mutex_unlock(&LOCK_gdl);
DBUG_RETURN(1);
}
+
+
+/*
+ Log an delete frm file
+*/
+
+/*
+ TODO: Partitioning atomic DDL refactoring: this should be replaced with
+ ddl_log_create_table().
+*/
+bool ddl_log_delete_frm(DDL_LOG_STATE *ddl_state, const char *to_path)
+{
+ DDL_LOG_ENTRY ddl_log_entry;
+ DDL_LOG_MEMORY_ENTRY *log_entry;
+ DBUG_ENTER("ddl_log_delete_frm");
+ bzero(&ddl_log_entry, sizeof(ddl_log_entry));
+ ddl_log_entry.action_type= DDL_LOG_DELETE_ACTION;
+ ddl_log_entry.next_entry= ddl_state->list ? ddl_state->list->entry_pos : 0;
+
+ lex_string_set(&ddl_log_entry.handler_name, reg_ext);
+ lex_string_set(&ddl_log_entry.name, to_path);
+
+ mysql_mutex_assert_owner(&LOCK_gdl);
+ if (ddl_log_write_entry(&ddl_log_entry, &log_entry))
+ DBUG_RETURN(1);
+
+ ddl_log_add_entry(ddl_state, log_entry);
+ DBUG_RETURN(0);
+}
diff --git a/sql/ddl_log.h b/sql/ddl_log.h
index a2a6af76a77..9960855a813 100644
--- a/sql/ddl_log.h
+++ b/sql/ddl_log.h
@@ -262,8 +262,14 @@ int ddl_log_execute_recovery();
bool ddl_log_write_entry(DDL_LOG_ENTRY *ddl_log_entry,
DDL_LOG_MEMORY_ENTRY **active_entry);
+bool ddl_log_write_execute_entry(uint first_entry, uint cond_entry,
+ DDL_LOG_MEMORY_ENTRY** active_entry);
+inline
bool ddl_log_write_execute_entry(uint first_entry,
- DDL_LOG_MEMORY_ENTRY **active_entry);
+ DDL_LOG_MEMORY_ENTRY **active_entry)
+{
+ return ddl_log_write_execute_entry(first_entry, 0, active_entry);
+}
bool ddl_log_disable_execute_entry(DDL_LOG_MEMORY_ENTRY **active_entry);
void ddl_log_complete(DDL_LOG_STATE *ddl_log_state);
@@ -279,6 +285,7 @@ void ddl_log_release_memory_entry(DDL_LOG_MEMORY_ENTRY *log_entry);
bool ddl_log_sync();
bool ddl_log_execute_entry(THD *thd, uint first_entry);
+void ddl_log_add_entry(DDL_LOG_STATE *state, DDL_LOG_MEMORY_ENTRY *log_entry);
void ddl_log_release_entries(DDL_LOG_STATE *ddl_log_state);
bool ddl_log_rename_table(THD *thd, DDL_LOG_STATE *ddl_state,
handlerton *hton,
@@ -348,5 +355,6 @@ bool ddl_log_alter_table(THD *thd, DDL_LOG_STATE *ddl_state,
bool is_renamed);
bool ddl_log_store_query(THD *thd, DDL_LOG_STATE *ddl_log_state,
const char *query, size_t length);
+bool ddl_log_delete_frm(DDL_LOG_STATE *ddl_state, const char *to_path);
extern mysql_mutex_t LOCK_gdl;
#endif /* DDL_LOG_INCLUDED */
diff --git a/sql/discover.cc b/sql/discover.cc
index 22d7008630a..201169357a2 100644
--- a/sql/discover.cc
+++ b/sql/discover.cc
@@ -233,7 +233,7 @@ int extension_based_table_discovery(MY_DIR *dirp, const char *ext_meta,
cur++;
}
advance(from, to, cur, skip);
- dirp->number_of_files= (uint)(to - dirp->dir_entry);
+ dirp->number_of_files= to - dirp->dir_entry;
return 0;
}
diff --git a/sql/encryption.cc b/sql/encryption.cc
index 13239b91910..3c7ba2e997b 100644
--- a/sql/encryption.cc
+++ b/sql/encryption.cc
@@ -109,6 +109,7 @@ int initialize_encryption_plugin(st_plugin_int *plugin)
int finalize_encryption_plugin(st_plugin_int *plugin)
{
+ int deinit_status= 0;
bool used= plugin_ref_to_int(encryption_manager) == plugin;
if (used)
@@ -118,18 +119,15 @@ int finalize_encryption_plugin(st_plugin_int *plugin)
encryption_handler.encryption_ctx_size_func= zero_size;
}
- if (plugin && plugin->plugin->deinit && plugin->plugin->deinit(NULL))
- {
- DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
- plugin->name.str));
- }
+ if (plugin && plugin->plugin->deinit)
+ deinit_status= plugin->plugin->deinit(NULL);
if (used)
{
plugin_unlock(NULL, encryption_manager);
encryption_manager= 0;
}
- return 0;
+ return deinit_status;
}
/******************************************************************
diff --git a/sql/field.cc b/sql/field.cc
index 75e1f285d74..78017ab46c5 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -964,6 +964,51 @@ Type_handler::aggregate_for_result_traditional(const Type_handler *a,
}
+bool Field::check_assignability_from(const Type_handler *from,
+ bool ignore) const
+{
+ /*
+ Using type_handler_for_item_field() here to get the data type handler
+ on both sides. This is needed to make sure aggregation for Field
+ works the same way with how Item_field aggregates for UNION or CASE,
+ so these statements:
+ SELECT a FROM t1 UNION SELECT b FROM t1; // Item_field vs Item_field
+ UPDATE t1 SET a=b; // Field vs Item_field
+ either both return "Illegal parameter data types" or both pass
+ the data type compatibility test.
+ For MariaDB standard data types, using type_handler_for_item_field()
+ turns ENUM/SET into just CHAR.
+ */
+ Type_handler_hybrid_field_type th(type_handler()->
+ type_handler_for_item_field());
+ if (th.aggregate_for_result(from->type_handler_for_item_field()))
+ {
+ bool error= (!ignore && get_thd()->is_strict_mode()) ||
+ (type_handler()->is_scalar_type() != from->is_scalar_type());
+ /*
+ Display fully qualified column name for table columns.
+ Display non-qualified names for other things,
+ e.g. SP variables, SP return values, SP and CURSOR parameters.
+ */
+ if (table->s->db.str && table->s->table_name.str)
+ my_printf_error(ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION,
+ "Cannot cast '%s' as '%s' in assignment of %`s.%`s.%`s",
+ MYF(error ? 0 : ME_WARNING),
+ from->name().ptr(), type_handler()->name().ptr(),
+ table->s->db.str, table->s->table_name.str,
+ field_name.str);
+ else
+ my_printf_error(ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION,
+ "Cannot cast '%s' as '%s' in assignment of %`s",
+ MYF(error ? 0 : ME_WARNING),
+ from->name().ptr(), type_handler()->name().ptr(),
+ field_name.str);
+ return error;
+ }
+ return false;
+}
+
+
/*
Test if the given string contains important data:
not spaces for character string,
@@ -1108,19 +1153,27 @@ Field_longstr::pack_sort_string(uchar *to, const SORT_FIELD_ATTR *sort_field)
relative position of the field value in the numeric interval [min,max]
*/
-double Field::pos_in_interval_val_real(Field *min, Field *max)
+double pos_in_interval_for_double(double midp_val, double min_val,
+ double max_val)
{
double n, d;
- n= val_real() - min->val_real();
+ n= midp_val - min_val;
if (n < 0)
return 0.0;
- d= max->val_real() - min->val_real();
+ d= max_val - min_val;
if (d <= 0)
return 1.0;
return MY_MIN(n/d, 1.0);
}
+double Field::pos_in_interval_val_real(Field *min, Field *max)
+{
+ return pos_in_interval_for_double(val_real(), min->val_real(),
+ max->val_real());
+}
+
+
static
inline ulonglong char_prefix_to_ulonglong(uchar *src)
{
@@ -1178,22 +1231,32 @@ static inline double safe_substract(ulonglong a, ulonglong b)
double Field::pos_in_interval_val_str(Field *min, Field *max, uint data_offset)
{
+ return pos_in_interval_for_string(charset(),
+ ptr + data_offset, data_length(),
+ min->ptr + data_offset, min->data_length(),
+ max->ptr + data_offset, max->data_length()
+ );
+}
+
+
+double pos_in_interval_for_string(CHARSET_INFO *cset,
+ const uchar *midp_val, uint32 midp_len,
+ const uchar *min_val, uint32 min_len,
+ const uchar *max_val, uint32 max_len)
+{
uchar mp_prefix[sizeof(ulonglong)];
uchar minp_prefix[sizeof(ulonglong)];
uchar maxp_prefix[sizeof(ulonglong)];
ulonglong mp, minp, maxp;
- charset()->strnxfrm(mp_prefix, sizeof(mp),
- ptr + data_offset,
- data_length());
- charset()->strnxfrm(minp_prefix, sizeof(minp),
- min->ptr + data_offset,
- min->data_length());
- charset()->strnxfrm(maxp_prefix, sizeof(maxp),
- max->ptr + data_offset,
- max->data_length());
- mp= char_prefix_to_ulonglong(mp_prefix);
+
+ cset->strnxfrm(mp_prefix, sizeof(mp), midp_val, midp_len);
+ cset->strnxfrm(minp_prefix, sizeof(minp), min_val, min_len);
+ cset->strnxfrm(maxp_prefix, sizeof(maxp), max_val, max_len);
+
+ mp= char_prefix_to_ulonglong(mp_prefix);
minp= char_prefix_to_ulonglong(minp_prefix);
maxp= char_prefix_to_ulonglong(maxp_prefix);
+
double n, d;
n= safe_substract(mp, minp);
if (n < 0)
@@ -1427,18 +1490,9 @@ bool Field::sp_prepare_and_store_item(THD *thd, Item **value)
Item *expr_item;
- if (!(expr_item= thd->sp_prepare_func_item(value, 1)))
+ if (!(expr_item= thd->sp_fix_func_item_for_assignment(this, value)))
goto error;
- /*
- expr_item is now fixed, it's safe to call cmp_type()
- */
- if (expr_item->cmp_type() == ROW_RESULT)
- {
- my_error(ER_OPERAND_COLUMNS, MYF(0), 1);
- goto error;
- }
-
/* Save the value in the field. Convert the value if needed. */
expr_item->save_in_field(this, 0);
@@ -11124,6 +11178,14 @@ Field::set_warning(Sql_condition::enum_warning_level level, uint code,
will have table == NULL.
*/
THD *thd= get_thd();
+
+ /*
+ In INPLACE ALTER, server can't know which row has generated
+ the warning, so the value of current row is supplied by the engine.
+ */
+ if (current_row)
+ thd->get_stmt_da()->reset_current_row_for_warning(current_row);
+
if (thd->count_cuted_fields > CHECK_FIELD_EXPRESSION)
{
thd->cuted_fields+= cut_increment;
diff --git a/sql/field.h b/sql/field.h
index b96eeedddac..17fcc7f54ad 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -908,6 +908,12 @@ public:
bool is_unsigned() const { return flags & UNSIGNED_FLAG; }
+ bool check_assignability_from(const Type_handler *from, bool ignore) const;
+ bool check_assignability_from(const Field *from, bool ignore) const
+ {
+ return check_assignability_from(from->type_handler(), ignore);
+ }
+
/**
Convenience definition of a copy function returned by
Field::get_copy_func()
@@ -1525,11 +1531,20 @@ public:
if (null_ptr)
null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,uchar*);
}
+
+ /*
+ Copy the Field's value to buff. The value will be in table->record[]
+ format.
+ */
void get_image(uchar *buff, uint length, CHARSET_INFO *cs) const
{ get_image(buff, length, ptr, cs); }
virtual void get_image(uchar *buff, uint length,
const uchar *ptr_arg, CHARSET_INFO *cs) const
{ memcpy(buff,ptr_arg,length); }
+
+ /*
+ Set Field's value to the value in *buf.
+ */
virtual void set_image(const uchar *buff,uint length, CHARSET_INFO *cs)
{ memcpy(ptr,buff,length); }
@@ -1869,6 +1884,7 @@ public:
{
return (double) 0.5;
}
+ virtual bool pos_through_val_str() { return false;}
/*
Check if comparison between the field and an item unambiguously
@@ -2154,6 +2170,8 @@ public:
{
return pos_in_interval_val_str(min, max, length_size());
}
+ bool pos_through_val_str() override {return true;}
+
bool test_if_equality_guarantees_uniqueness(const Item *const_item) const
override;
SEL_ARG *get_mm_leaf(RANGE_OPT_PARAM *param, KEY_PART *key_part,
@@ -5901,4 +5919,12 @@ ulonglong TABLE::vers_start_id() const
return static_cast<ulonglong>(vers_start_field()->val_int());
}
+double pos_in_interval_for_string(CHARSET_INFO *cset,
+ const uchar *midp_val, uint32 midp_len,
+ const uchar *min_val, uint32 min_len,
+ const uchar *max_val, uint32 max_len);
+
+double pos_in_interval_for_double(double midp_val,
+ double min_val, double max_val);
+
#endif /* FIELD_INCLUDED */
diff --git a/sql/gcalc_slicescan.cc b/sql/gcalc_slicescan.cc
index b079bd7a714..f94c7190532 100644
--- a/sql/gcalc_slicescan.cc
+++ b/sql/gcalc_slicescan.cc
@@ -172,7 +172,7 @@ static void GCALC_DBUG_PRINT_SLICE(const char *header,
Gcalc_dyn_list::Gcalc_dyn_list(size_t blk_size, size_t sizeof_item):
- m_blk_size(blk_size - ALLOC_ROOT_MIN_BLOCK_SIZE),
+ m_blk_size(blk_size),
m_sizeof_item(ALIGN_SIZE(sizeof_item)),
m_points_per_blk((uint)((m_blk_size - PH_DATA_OFFSET) / m_sizeof_item)),
m_blk_hook(&m_first_blk),
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index f50aaa578fb..acdadb61df5 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -2143,7 +2143,12 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
}
DBUG_ASSERT(m_new_file == 0);
m_new_file= new_file_array;
- if (unlikely((error= copy_partitions(copied, deleted))))
+ for (i= 0; i < part_count; i++)
+ m_added_file[i]->extra(HA_EXTRA_BEGIN_ALTER_COPY);
+ error= copy_partitions(copied, deleted);
+ for (i= 0; i < part_count; i++)
+ m_added_file[i]->extra(HA_EXTRA_END_ALTER_COPY);
+ if (unlikely(error))
{
/*
Close and unlock the new temporary partitions.
@@ -2733,6 +2738,7 @@ register_query_cache_dependant_tables(THD *thd,
2) MAX_ROWS, MIN_ROWS on partition
3) Index file name on partition
4) Data file name on partition
+ 5) Engine-defined attributes on partition
*/
int ha_partition::set_up_table_before_create(TABLE *tbl,
@@ -2770,6 +2776,10 @@ int ha_partition::set_up_table_before_create(TABLE *tbl,
if (info->connect_string.length)
info->used_fields|= HA_CREATE_USED_CONNECTION;
tbl->s->connect_string= part_elem->connect_string;
+ if (part_elem->option_list)
+ tbl->s->option_list= part_elem->option_list;
+ if (part_elem->option_struct)
+ tbl->s->option_struct= part_elem->option_struct;
DBUG_RETURN(0);
}
@@ -3625,31 +3635,31 @@ bool ha_partition::init_partition_bitmaps()
DBUG_ENTER("ha_partition::init_partition_bitmaps");
/* Initialize the bitmap we use to minimize ha_start_bulk_insert calls */
- if (my_bitmap_init(&m_bulk_insert_started, NULL, m_tot_parts + 1, FALSE))
+ if (my_bitmap_init(&m_bulk_insert_started, NULL, m_tot_parts + 1))
DBUG_RETURN(true);
/* Initialize the bitmap we use to keep track of locked partitions */
- if (my_bitmap_init(&m_locked_partitions, NULL, m_tot_parts, FALSE))
+ if (my_bitmap_init(&m_locked_partitions, NULL, m_tot_parts))
DBUG_RETURN(true);
/*
Initialize the bitmap we use to keep track of partitions which may have
something to reset in ha_reset().
*/
- if (my_bitmap_init(&m_partitions_to_reset, NULL, m_tot_parts, FALSE))
+ if (my_bitmap_init(&m_partitions_to_reset, NULL, m_tot_parts))
DBUG_RETURN(true);
/*
Initialize the bitmap we use to keep track of partitions which returned
HA_ERR_KEY_NOT_FOUND from index_read_map.
*/
- if (my_bitmap_init(&m_key_not_found_partitions, NULL, m_tot_parts, FALSE))
+ if (my_bitmap_init(&m_key_not_found_partitions, NULL, m_tot_parts))
DBUG_RETURN(true);
- if (bitmap_init(&m_mrr_used_partitions, NULL, m_tot_parts, TRUE))
+ if (my_bitmap_init(&m_mrr_used_partitions, NULL, m_tot_parts))
DBUG_RETURN(true);
- if (my_bitmap_init(&m_opened_partitions, NULL, m_tot_parts, FALSE))
+ if (my_bitmap_init(&m_opened_partitions, NULL, m_tot_parts))
DBUG_RETURN(true);
m_file_sample= NULL;
diff --git a/sql/handler.cc b/sql/handler.cc
index 7e42f814cb7..d33a8efed65 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
- Copyright (c) 2009, 2022, MariaDB Corporation.
+ Copyright (c) 2009, 2023, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -581,6 +581,7 @@ static int hton_drop_table(handlerton *hton, const char *path)
int ha_finalize_handlerton(st_plugin_int *plugin)
{
+ int deinit_status= 0;
handlerton *hton= (handlerton *)plugin->data;
DBUG_ENTER("ha_finalize_handlerton");
@@ -595,18 +596,7 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
hton->panic(hton, HA_PANIC_CLOSE);
if (plugin->plugin->deinit)
- {
- /*
- Today we have no defined/special behavior for uninstalling
- engine plugins.
- */
- DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str));
- if (plugin->plugin->deinit(NULL))
- {
- DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
- plugin->name.str));
- }
- }
+ deinit_status= plugin->plugin->deinit(NULL);
free_sysvar_table_options(hton);
update_discovery_counters(hton, -1);
@@ -627,7 +617,7 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
my_free(hton);
end:
- DBUG_RETURN(0);
+ DBUG_RETURN(deinit_status);
}
@@ -1779,6 +1769,13 @@ int ha_commit_trans(THD *thd, bool all)
if (ha_info->ht()->prepare_commit_versioned)
{
trx_end_id= ha_info->ht()->prepare_commit_versioned(thd, &trx_start_id);
+
+ if (trx_end_id == ULONGLONG_MAX)
+ {
+ my_error(ER_ERROR_DURING_COMMIT, MYF(0), 1);
+ goto err;
+ }
+
if (trx_end_id)
break; // FIXME: use a common ID for cross-engine transactions
}
@@ -4153,6 +4150,9 @@ void handler::get_auto_increment(ulonglong offset, ulonglong increment,
int error;
MY_BITMAP *old_read_set;
bool rnd_inited= (inited == RND);
+ bool rev= table->key_info[table->s->next_number_index].
+ key_part[table->s->next_number_keypart].key_part_flag &
+ HA_REVERSE_SORT;
if (rnd_inited && ha_rnd_end())
return;
@@ -4174,7 +4174,8 @@ void handler::get_auto_increment(ulonglong offset, ulonglong increment,
if (table->s->next_number_keypart == 0)
{ // Autoincrement at key-start
- error= ha_index_last(table->record[1]);
+ error= rev ? ha_index_first(table->record[1])
+ : ha_index_last(table->record[1]);
/*
MySQL implicitly assumes such method does locking (as MySQL decides to
use nr+increment without checking again with the handler, in
@@ -4189,9 +4190,8 @@ void handler::get_auto_increment(ulonglong offset, ulonglong increment,
table->key_info + table->s->next_number_index,
table->s->next_number_key_offset);
error= ha_index_read_map(table->record[1], key,
- make_prev_keypart_map(table->s->
- next_number_keypart),
- HA_READ_PREFIX_LAST);
+ make_prev_keypart_map(table->s->next_number_keypart),
+ rev ? HA_READ_KEY_EXACT : HA_READ_PREFIX_LAST);
/*
MySQL needs to call us for next row: assume we are inserting ("a",null)
here, we return 3, and next this statement will want to insert
@@ -8148,7 +8148,7 @@ static Create_field *vers_init_sys_field(THD *thd, const char *field_name, int f
f->set_handler(&type_handler_timestamp2);
f->length= MAX_DATETIME_PRECISION;
}
- f->invisible= DBUG_EVALUATE_IF("sysvers_show", VISIBLE, INVISIBLE_SYSTEM);
+ f->invisible= DBUG_IF("sysvers_show") ? VISIBLE : INVISIBLE_SYSTEM;
if (f->check(thd))
return NULL;
@@ -8161,8 +8161,8 @@ bool Vers_parse_info::create_sys_field(THD *thd, const char *field_name,
{
DBUG_ASSERT(can_native >= 0); /* Requires vers_check_native() called */
Create_field *f= vers_init_sys_field(thd, field_name, flags,
- DBUG_EVALUATE_IF("sysvers_force_trx",
- (bool) can_native, false));
+ DBUG_IF("sysvers_force_trx") &&
+ can_native);
if (!f)
return true;
@@ -8208,8 +8208,7 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields(
{
DBUG_ASSERT(!(alter_info->flags & ALTER_DROP_SYSTEM_VERSIONING));
- if (DBUG_EVALUATE_IF("sysvers_force", true, false) ||
- DBUG_EVALUATE_IF("sysvers_force_trx", true, false))
+ if (DBUG_IF("sysvers_force") || DBUG_IF("sysvers_force_trx"))
{
alter_info->flags|= ALTER_ADD_SYSTEM_VERSIONING;
options|= HA_VERSIONED_TABLE;
@@ -8312,8 +8311,8 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info,
if (!need_check(alter_info) && !share->versioned)
return false;
- if (DBUG_EVALUATE_IF("sysvers_force", 0, share->tmp_table) ||
- DBUG_EVALUATE_IF("sysvers_force_trx", 0, share->tmp_table))
+ if (share->tmp_table &&
+ !DBUG_IF("sysvers_force") && !DBUG_IF("sysvers_force_trx"))
{
my_error(ER_VERS_NOT_SUPPORTED, MYF(0), "CREATE TEMPORARY TABLE");
return true;
diff --git a/sql/handler.h b/sql/handler.h
index e3d968808ee..36f66b78de0 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -838,7 +838,9 @@ typedef bool Log_func(THD*, TABLE*, bool, const uchar*, const uchar*);
// Set by Sql_cmd_alter_table_truncate_partition::execute()
#define ALTER_PARTITION_TRUNCATE (1ULL << 11)
// Set for REORGANIZE PARTITION
-#define ALTER_PARTITION_TABLE_REORG (1ULL << 12)
+#define ALTER_PARTITION_TABLE_REORG (1ULL << 12)
+#define ALTER_PARTITION_CONVERT_IN (1ULL << 13)
+#define ALTER_PARTITION_CONVERT_OUT (1ULL << 14)
/*
This is master database for most of system tables. However there
@@ -1000,39 +1002,6 @@ struct xid_recovery_member
#define MIN_XID_LIST_SIZE 128
#define MAX_XID_LIST_SIZE (1024*128)
-/*
- These structures are used to pass information from a set of SQL commands
- on add/drop/change tablespace definitions to the proper hton.
-*/
-#define UNDEF_NODEGROUP 65535
-enum ts_command_type
-{
- TS_CMD_NOT_DEFINED = -1,
- CREATE_TABLESPACE = 0,
- ALTER_TABLESPACE = 1,
- CREATE_LOGFILE_GROUP = 2,
- ALTER_LOGFILE_GROUP = 3,
- DROP_TABLESPACE = 4,
- DROP_LOGFILE_GROUP = 5,
- CHANGE_FILE_TABLESPACE = 6,
- ALTER_ACCESS_MODE_TABLESPACE = 7
-};
-
-enum ts_alter_tablespace_type
-{
- TS_ALTER_TABLESPACE_TYPE_NOT_DEFINED = -1,
- ALTER_TABLESPACE_ADD_FILE = 1,
- ALTER_TABLESPACE_DROP_FILE = 2
-};
-
-enum tablespace_access_mode
-{
- TS_NOT_DEFINED= -1,
- TS_READ_ONLY = 0,
- TS_READ_WRITE = 1,
- TS_NOT_ACCESSIBLE = 2
-};
-
/* Statistics about batch operations like bulk_insert */
struct ha_copy_info
{
@@ -1043,50 +1012,6 @@ struct ha_copy_info
ha_rows updated;
};
-struct handlerton;
-class st_alter_tablespace : public Sql_alloc
-{
- public:
- const char *tablespace_name;
- const char *logfile_group_name;
- enum ts_command_type ts_cmd_type;
- enum ts_alter_tablespace_type ts_alter_tablespace_type;
- const char *data_file_name;
- const char *undo_file_name;
- const char *redo_file_name;
- ulonglong extent_size;
- ulonglong undo_buffer_size;
- ulonglong redo_buffer_size;
- ulonglong initial_size;
- ulonglong autoextend_size;
- ulonglong max_size;
- uint nodegroup_id;
- handlerton *storage_engine;
- bool wait_until_completed;
- const char *ts_comment;
- enum tablespace_access_mode ts_access_mode;
- st_alter_tablespace()
- {
- tablespace_name= NULL;
- logfile_group_name= "DEFAULT_LG"; //Default log file group
- ts_cmd_type= TS_CMD_NOT_DEFINED;
- data_file_name= NULL;
- undo_file_name= NULL;
- redo_file_name= NULL;
- extent_size= 1024*1024; //Default 1 MByte
- undo_buffer_size= 8*1024*1024; //Default 8 MByte
- redo_buffer_size= 8*1024*1024; //Default 8 MByte
- initial_size= 128*1024*1024; //Default 128 MByte
- autoextend_size= 0; //No autoextension as default
- max_size= 0; //Max size == initial size => no extension
- storage_engine= NULL;
- nodegroup_id= UNDEF_NODEGROUP;
- wait_until_completed= TRUE;
- ts_comment= NULL;
- ts_access_mode= TS_NOT_DEFINED;
- }
-};
-
/* The handler for a table type. Will be included in the TABLE structure */
struct TABLE;
@@ -1150,6 +1075,7 @@ typedef bool (stat_print_fn)(THD *thd, const char *type, size_t type_len,
enum ha_stat_type { HA_ENGINE_STATUS, HA_ENGINE_LOGS, HA_ENGINE_MUTEX };
extern MYSQL_PLUGIN_IMPORT st_plugin_int *hton2plugin[MAX_HA];
+struct handlerton;
#define view_pseudo_hton ((handlerton *)1)
/*
@@ -1515,8 +1441,7 @@ struct handlerton
bool (*show_status)(handlerton *hton, THD *thd, stat_print_fn *print, enum ha_stat_type stat);
uint (*partition_flags)();
alter_table_operations (*alter_table_flags)(alter_table_operations flags);
- int (*alter_tablespace)(handlerton *hton, THD *thd, st_alter_tablespace *ts_info);
- int (*fill_is_table)(handlerton *hton, THD *thd, TABLE_LIST *tables,
+ int (*fill_is_table)(handlerton *hton, THD *thd, TABLE_LIST *tables,
class Item *cond,
enum enum_schema_tables);
uint32 flags; /* global handler flags */
diff --git a/sql/hostname.cc b/sql/hostname.cc
index e23560c7b8c..18164b32517 100644
--- a/sql/hostname.cc
+++ b/sql/hostname.cc
@@ -190,7 +190,7 @@ Host_entry *hostname_cache_first()
static inline Host_entry *hostname_cache_search(const char *ip_key)
{
- return hostname_cache->search((uchar *) ip_key, 0);
+ return hostname_cache->search((uchar *) ip_key, HOST_ENTRY_KEY_SIZE);
}
static void add_hostname_impl(const char *ip_key, const char *hostname,
diff --git a/sql/item.cc b/sql/item.cc
index d260255d3c5..4423b47c4d7 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -56,8 +56,8 @@ const char *item_empty_name="";
const char *item_used_name= "\0";
static int save_field_in_field(Field *, bool *, Field *, bool);
-const Item_bool_static Item_false("FALSE", 0);
-const Item_bool_static Item_true("TRUE", 1);
+Item_bool_static *Item_false;
+Item_bool_static *Item_true;
/**
Compare two Items for List<Item>::add_unique()
@@ -446,7 +446,7 @@ Item::Item(THD *thd):
Item::Item():
name(null_clex_str), orig_name(0), is_expensive_cache(-1)
{
- DBUG_ASSERT(my_progname == NULL); // before main()
+ DBUG_ASSERT(!mysqld_server_started); // Created early
base_flags= item_base_t::FIXED;
with_flags= item_with_t::NONE;
null_value= 0;
@@ -4512,6 +4512,22 @@ bool Item_param::is_evaluable_expression() const
}
+bool Item_param::check_assignability_to(const Field *to, bool ignore) const
+{
+ switch (state) {
+ case SHORT_DATA_VALUE:
+ case LONG_DATA_VALUE:
+ case NULL_VALUE:
+ return to->check_assignability_from(type_handler(), ignore);
+ case NO_VALUE:
+ case IGNORE_VALUE:
+ case DEFAULT_VALUE:
+ break;
+ }
+ return false;
+}
+
+
bool Item_param::can_return_value() const
{
// There's no "default". See comments in Item_param::save_in_field().
@@ -9899,9 +9915,11 @@ void Item_trigger_field::set_required_privilege(bool rw)
bool Item_trigger_field::set_value(THD *thd, sp_rcontext * /*ctx*/, Item **it)
{
- Item *item= thd->sp_prepare_func_item(it);
+ if (fix_fields_if_needed(thd, NULL))
+ return true;
- if (!item || fix_fields_if_needed(thd, NULL))
+ Item *item= thd->sp_fix_func_item_for_assignment(field, it);
+ if (!item)
return true;
if (field->vers_sys_field())
return false;
diff --git a/sql/item.h b/sql/item.h
index 3ce8adafb33..a90cb01c80b 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -772,8 +772,8 @@ enum class item_base_t : item_flags_t
FIXED= (1<<2), // Was fixed with fix_fields().
IS_EXPLICIT_NAME= (1<<3), // The name of this Item was set by the user
// (or was auto generated otherwise)
- IS_IN_WITH_CYCLE= (1<<4) // This item is in CYCLE clause
- // of WITH.
+ IS_IN_WITH_CYCLE= (1<<4), // This item is in CYCLE clause of WITH.
+ AT_TOP_LEVEL= (1<<5) // At top (AND) level of item tree
};
@@ -1327,6 +1327,25 @@ public:
{
set_maybe_null(maybe_null_arg);
}
+ /*
+ Mark the item that it is a top level item, or part of a top level AND item,
+ for WHERE and ON clauses:
+ Example: ... WHERE a=5 AND b=6; Both a=5 and b=6 are top level items
+
+ This is used to indicate that there is no distinction between if the
+ value of the item is FALSE or NULL..
+ This enables Item_cond_and and subquery related items to do special
+ "top level" optimizations.
+ */
+ virtual void top_level_item()
+ {
+ base_flags|= item_base_t::AT_TOP_LEVEL;
+ }
+ /*
+ Return TRUE if this item of top WHERE level (AND/OR)
+ */
+ bool is_top_level_item() const
+ { return (bool) (base_flags & item_base_t::AT_TOP_LEVEL); }
void set_typelib(const TYPELIB *typelib) override
{
@@ -1833,6 +1852,16 @@ public:
*/
virtual bool is_evaluable_expression() const { return true; }
+ virtual bool check_assignability_to(const Field *to, bool ignore) const
+ {
+ /*
+ "this" must be neither DEFAULT/IGNORE,
+ nor Item_param bound to DEFAULT/IGNORE.
+ */
+ DBUG_ASSERT(is_evaluable_expression());
+ return to->check_assignability_from(type_handler(), ignore);
+ }
+
/**
* Check whether the item is a parameter ('?') of stored routine.
* Default implementation returns false. Method is overridden in the class
@@ -2049,25 +2078,6 @@ public:
{
return type_handler()->Item_update_null_value(this);
}
-
- /*
- Inform the item that there will be no distinction between its result
- being FALSE or NULL.
-
- NOTE
- This function will be called for eg. Items that are top-level AND-parts
- of the WHERE clause. Items implementing this function (currently
- Item_cond_and and subquery-related item) enable special optimizations
- when they are "top level".
- */
- virtual void top_level_item() {}
- /*
- Return TRUE if it is item of top WHERE level (AND/OR) and it is
- important, return FALSE if it not important (we can not use to simplify
- calculations) or not top level
- */
- virtual bool is_top_level_item() const
- { return FALSE; /* not important */}
/*
return IN/ALL/ANY subquery or NULL
*/
@@ -2677,18 +2687,27 @@ public:
void register_in(THD *thd);
bool depends_only_on(table_map view_map)
- { return marker & MARKER_FULL_EXTRACTION; }
- int get_extraction_flag()
- { return marker & MARKER_EXTRACTION_MASK; }
+ { return get_extraction_flag() & MARKER_FULL_EXTRACTION; }
+ int get_extraction_flag() const
+ {
+ if (basic_const_item())
+ return MARKER_FULL_EXTRACTION;
+ else
+ return marker & MARKER_EXTRACTION_MASK;
+ }
void set_extraction_flag(int16 flags)
{
- marker &= ~MARKER_EXTRACTION_MASK;
- marker|= flags;
+ if (!basic_const_item())
+ {
+ marker= marker & ~MARKER_EXTRACTION_MASK;
+ marker|= flags;
+ }
}
void clear_extraction_flag()
{
- marker &= ~MARKER_EXTRACTION_MASK;
- }
+ if (!basic_const_item())
+ marker= marker & ~MARKER_EXTRACTION_MASK;
+ }
void check_pushable_cond(Pushdown_checker excl_dep_func, uchar *arg);
bool pushable_cond_checker_for_derived(uchar *arg)
{
@@ -4124,6 +4143,7 @@ class Item_param :public Item_basic_value,
const String *value_query_val_str(THD *thd, String* str) const;
Item *value_clone_item(THD *thd);
bool is_evaluable_expression() const override;
+ bool check_assignability_to(const Field *field, bool ignore) const override;
bool can_return_value() const;
public:
@@ -4470,11 +4490,16 @@ public:
Item_bool_static(const char *str_arg, longlong i):
Item_bool(str_arg, i) {};
+ /* Don't mark static items as top level item */
+ virtual void top_level_item() override {}
void set_join_tab_idx(uint8 join_tab_idx_arg) override
{ DBUG_ASSERT(0); }
+
+ void cleanup() override {}
};
-extern const Item_bool_static Item_false, Item_true;
+/* The following variablese are stored in a read only segment */
+extern Item_bool_static *Item_false, *Item_true;
class Item_uint :public Item_int
{
@@ -6808,6 +6833,10 @@ public:
{
str->append(STRING_WITH_LEN("default"));
}
+ bool check_assignability_to(const Field *to, bool ignore) const override
+ {
+ return false;
+ }
int save_in_field(Field *field_arg, bool) override
{
return field_arg->save_in_field_default_value(false);
@@ -6841,6 +6870,10 @@ public:
{
str->append(STRING_WITH_LEN("ignore"));
}
+ bool check_assignability_to(const Field *to, bool ignore) const override
+ {
+ return false;
+ }
int save_in_field(Field *field_arg, bool) override
{
return field_arg->save_in_field_ignore_value(false);
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 87d75ca61b7..a396a164951 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -1079,14 +1079,14 @@ int Arg_comparator::compare_row()
// NULL was compared
switch (((Item_func*)owner)->functype()) {
case Item_func::NE_FUNC:
- break; // NE never aborts on NULL even if abort_on_null is set
+ break; // NE never aborts on NULL
case Item_func::LT_FUNC:
case Item_func::LE_FUNC:
case Item_func::GT_FUNC:
case Item_func::GE_FUNC:
return -1; // <, <=, > and >= always fail on NULL
case Item_func::EQ_FUNC:
- if (((Item_func_eq*)owner)->abort_on_null)
+ if (owner->is_top_level_item())
return -1; // We do not need correct NULL returning
break;
default:
@@ -1203,12 +1203,6 @@ longlong Item_func_truth::val_int()
}
-bool Item_in_optimizer::is_top_level_item() const
-{
- return args[1]->is_top_level_item();
-}
-
-
void Item_in_optimizer::fix_after_pullout(st_select_lex *new_parent,
Item **ref, bool merge)
{
@@ -1393,7 +1387,8 @@ bool Item_in_optimizer::fix_fields(THD *thd, Item **ref)
}
base_flags|= (item_base_t::FIXED |
- (args[1]->base_flags & item_base_t::MAYBE_NULL));
+ (args[1]->base_flags & (item_base_t::MAYBE_NULL |
+ item_base_t::AT_TOP_LEVEL)));
with_flags|= (item_with_t::SUBQUERY |
args[1]->with_flags |
(args[0]->with_flags &
@@ -2079,7 +2074,7 @@ bool Item_func_between::eval_not_null_tables(void *opt_arg)
return 1;
/* not_null_tables_cache == union(T1(e),T1(e1),T1(e2)) */
- if (pred_level && !negated)
+ if (is_top_level_item() && !negated)
return 0;
/* not_null_tables_cache == union(T1(e), intersection(T1(e1),T1(e2))) */
@@ -2481,6 +2476,10 @@ bool
Item_func_if::fix_fields(THD *thd, Item **ref)
{
DBUG_ASSERT(fixed() == 0);
+ /*
+ Mark that we don't care if args[0] is NULL or FALSE, we regard both cases as
+ false.
+ */
args[0]->top_level_item();
if (Item_func::fix_fields(thd, ref))
@@ -4406,7 +4405,7 @@ Item_func_in::eval_not_null_tables(void *opt_arg)
return 1;
/* not_null_tables_cache == union(T1(e),union(T1(ei))) */
- if (pred_level && negated)
+ if (is_top_level_item() && negated)
return 0;
/* not_null_tables_cache = union(T1(e),intersection(T1(ei))) */
@@ -4861,9 +4860,10 @@ bool Item_func_bit_and::fix_length_and_dec()
Item_cond::Item_cond(THD *thd, Item_cond *item)
:Item_bool_func(thd, item),
- abort_on_null(item->abort_on_null),
and_tables_cache(item->and_tables_cache)
{
+ base_flags|= (item->base_flags & item_base_t::AT_TOP_LEVEL);
+
/*
item->list will be copied by copy_andor_arguments() call
*/
@@ -4871,7 +4871,7 @@ Item_cond::Item_cond(THD *thd, Item_cond *item)
Item_cond::Item_cond(THD *thd, Item *i1, Item *i2):
- Item_bool_func(thd), abort_on_null(0)
+ Item_bool_func(thd)
{
list.push_back(i1, thd->mem_root);
list.push_back(i2, thd->mem_root);
@@ -4919,7 +4919,7 @@ Item_cond::fix_fields(THD *thd, Item **ref)
{
merge_sub_condition(li);
item= *li.ref();
- if (abort_on_null)
+ if (is_top_level_item())
item->top_level_item();
/*
@@ -4948,7 +4948,7 @@ Item_cond::fix_fields(THD *thd, Item **ref)
if (item->can_eval_in_optimize() && !item->with_sp_var() &&
!cond_has_datetime_is_null(item))
{
- if (item->eval_const_cond() == is_and_cond && top_level())
+ if (item->eval_const_cond() == is_and_cond && is_top_level_item())
{
/*
a. This is "... AND true_cond AND ..."
@@ -5054,7 +5054,7 @@ Item_cond::eval_not_null_tables(void *opt_arg)
if (item->can_eval_in_optimize() && !item->with_sp_var() &&
!cond_has_datetime_is_null(item))
{
- if (item->eval_const_cond() == is_and_cond && top_level())
+ if (item->eval_const_cond() == is_and_cond && is_top_level_item())
{
/*
a. This is "... AND true_cond AND ..."
@@ -5497,17 +5497,18 @@ void Item_cond_and::mark_as_condition_AND_part(TABLE_LIST *embedding)
Evaluation of AND(expr, expr, expr ...).
@note
- abort_if_null is set for AND expressions for which we don't care if the
- result is NULL or 0. This is set for:
+ There are AND expressions for which we don't care if the
+ result is NULL or 0. This is the case for:
- WHERE clause
- HAVING clause
- IF(expression)
+ For these we mark them as "top_level_items"
@retval
1 If all expressions are true
@retval
- 0 If all expressions are false or if we find a NULL expression and
- 'abort_on_null' is set.
+ 0 If any of the expressions are false or if we find a NULL expression and
+ this is a top_level_item.
@retval
NULL if all expression are either 1 or NULL
*/
@@ -5523,8 +5524,8 @@ longlong Item_cond_and::val_int()
{
if (!item->val_bool())
{
- if (abort_on_null || !(null_value= item->null_value))
- return 0; // return FALSE
+ if (is_top_level_item() || !(null_value= item->null_value))
+ return 0;
}
}
return null_value ? 0 : 1;
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h
index 8e0a150f9c0..5807ff52047 100644
--- a/sql/item_cmpfunc.h
+++ b/sql/item_cmpfunc.h
@@ -410,7 +410,6 @@ public:
void set_join_tab_idx(uint8 join_tab_idx_arg) override
{ args[1]->set_join_tab_idx(join_tab_idx_arg); }
void get_cache_parameters(List<Item> &parameters) override;
- bool is_top_level_item() const override;
bool eval_not_null_tables(void *opt_arg) override;
bool find_not_null_fields(table_map allowed) override;
void fix_after_pullout(st_select_lex *new_parent, Item **ref,
@@ -630,12 +629,8 @@ public:
class Item_func_not :public Item_bool_func
{
- bool abort_on_null;
public:
- Item_func_not(THD *thd, Item *a):
- Item_bool_func(thd, a), abort_on_null(FALSE) {}
- void top_level_item() override { abort_on_null= 1; }
- bool is_top_level_item() const override { return abort_on_null; }
+ Item_func_not(THD *thd, Item *a): Item_bool_func(thd, a) {}
longlong val_int() override;
enum Functype functype() const override { return NOT_FUNC; }
LEX_CSTRING func_name_cstring() const override
@@ -756,11 +751,10 @@ public:
class Item_func_eq :public Item_bool_rowready_func2
{
- bool abort_on_null;
public:
Item_func_eq(THD *thd, Item *a, Item *b):
Item_bool_rowready_func2(thd, a, b),
- abort_on_null(false), in_equality_no(UINT_MAX)
+ in_equality_no(UINT_MAX)
{}
longlong val_int() override;
enum Functype functype() const override { return EQ_FUNC; }
@@ -771,7 +765,6 @@ public:
static LEX_CSTRING name= {STRING_WITH_LEN("=") };
return name;
}
- void top_level_item() override { abort_on_null= true; }
Item *negated_item(THD *thd) override;
COND *build_equal_items(THD *thd, COND_EQUAL *inherited,
bool link_item_fields,
@@ -957,15 +950,12 @@ protected:
DTCollation cmp_collation;
public:
bool negated; /* <=> the item represents NOT <func> */
- bool pred_level; /* <=> [NOT] <func> is used on a predicate level */
public:
Item_func_opt_neg(THD *thd, Item *a, Item *b, Item *c):
- Item_bool_func(thd, a, b, c), negated(0), pred_level(0) {}
+ Item_bool_func(thd, a, b, c), negated(0) {}
Item_func_opt_neg(THD *thd, List<Item> &list):
- Item_bool_func(thd, list), negated(0), pred_level(0) {}
+ Item_bool_func(thd, list), negated(0) {}
public:
- void top_level_item() override { pred_level= 1; }
- bool is_top_level_item() const override { return pred_level; }
Item *neg_transformer(THD *thd) override
{
negated= !negated;
@@ -2804,11 +2794,9 @@ public:
class Item_func_isnotnull :public Item_func_null_predicate
{
- bool abort_on_null;
public:
Item_func_isnotnull(THD *thd, Item *a):
- Item_func_null_predicate(thd, a), abort_on_null(0)
- { }
+ Item_func_null_predicate(thd, a) {}
longlong val_int() override;
enum Functype functype() const override { return ISNOTNULL_FUNC; }
LEX_CSTRING func_name_cstring() const override
@@ -2818,10 +2806,9 @@ public:
}
enum precedence precedence() const override { return CMP_PRECEDENCE; }
table_map not_null_tables() const override
- { return abort_on_null ? not_null_tables_cache : 0; }
+ { return is_top_level_item() ? not_null_tables_cache : 0; }
Item *neg_transformer(THD *thd) override;
void print(String *str, enum_query_type query_type) override;
- void top_level_item() override { abort_on_null=1; }
Item *get_copy(THD *thd) override
{ return get_item_copy<Item_func_isnotnull>(thd, this); }
};
@@ -3132,17 +3119,19 @@ class Item_cond :public Item_bool_func
{
protected:
List<Item> list;
- bool abort_on_null;
table_map and_tables_cache;
public:
- /* Item_cond() is only used to create top level items */
- Item_cond(THD *thd): Item_bool_func(thd), abort_on_null(1)
- { const_item_cache=0; }
+ Item_cond(THD *thd): Item_bool_func(thd)
+ {
+ /* Item_cond() is only used to create top level items */
+ top_level_item();
+ const_item_cache=0;
+ }
Item_cond(THD *thd, Item *i1, Item *i2);
Item_cond(THD *thd, Item_cond *item);
Item_cond(THD *thd, List<Item> &nlist):
- Item_bool_func(thd), list(nlist), abort_on_null(0) {}
+ Item_bool_func(thd), list(nlist) {}
bool add(Item *item, MEM_ROOT *root)
{
DBUG_ASSERT(item);
@@ -3189,8 +3178,6 @@ public:
List<Item> &fields, uint flags) override;
friend int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves,
COND **conds);
- void top_level_item() override { abort_on_null=1; }
- bool top_level() { return abort_on_null; }
void copy_andor_arguments(THD *thd, Item_cond *item);
bool walk(Item_processor processor, bool walk_subquery, void *arg) override;
Item *do_transform(THD *thd, Item_transformer transformer, uchar *arg,
@@ -3569,7 +3556,7 @@ public:
}
enum precedence precedence() const override { return AND_PRECEDENCE; }
table_map not_null_tables() const override
- { return abort_on_null ? not_null_tables_cache: and_tables_cache; }
+ { return is_top_level_item() ? not_null_tables_cache: and_tables_cache; }
Item *copy_andor_structure(THD *thd) override;
Item *neg_transformer(THD *thd) override;
void mark_as_condition_AND_part(TABLE_LIST *embedding) override;
diff --git a/sql/item_create.cc b/sql/item_create.cc
index dcc64ef10e8..a8ca7d5cff8 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -519,10 +519,11 @@ protected:
};
-class Create_func_crc32 : public Create_func_arg1
+class Create_func_crc32 : public Create_native_func
{
public:
- virtual Item *create_1_arg(THD *thd, Item *arg1);
+ Item *create_native(THD *thd, const LEX_CSTRING *, List<Item> *item_list)
+ override;
static Create_func_crc32 s_singleton;
@@ -532,6 +533,20 @@ protected:
};
+class Create_func_crc32c : public Create_native_func
+{
+public:
+ Item *create_native(THD *thd, const LEX_CSTRING *, List<Item> *item_list)
+ override;
+
+ static Create_func_crc32c s_singleton;
+
+protected:
+ Create_func_crc32c() = default;
+ virtual ~Create_func_crc32c() = default;
+};
+
+
class Create_func_datediff : public Create_func_arg2
{
public:
@@ -918,6 +933,32 @@ protected:
};
+class Create_func_json_normalize : public Create_func_arg1
+{
+public:
+ virtual Item *create_1_arg(THD *thd, Item *arg1);
+
+ static Create_func_json_normalize s_singleton;
+
+protected:
+ Create_func_json_normalize() = default;
+ virtual ~Create_func_json_normalize() = default;
+};
+
+
+class Create_func_json_equals : public Create_func_arg2
+{
+public:
+ virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2);
+
+ static Create_func_json_equals s_singleton;
+
+protected:
+ Create_func_json_equals() = default;
+ virtual ~Create_func_json_equals() = default;
+};
+
+
class Create_func_json_exists : public Create_func_arg2
{
public:
@@ -1639,6 +1680,15 @@ protected:
virtual ~Create_func_name_const() = default;
};
+class Create_func_natural_sort_key : public Create_func_arg1
+{
+public:
+ virtual Item *create_1_arg(THD *thd, Item *arg1) override;
+ static Create_func_natural_sort_key s_singleton;
+protected:
+ Create_func_natural_sort_key() = default;
+ virtual ~Create_func_natural_sort_key() = default;
+};
class Create_func_nullif : public Create_func_arg2
{
@@ -1944,6 +1994,16 @@ protected:
virtual ~Create_func_sec_to_time() = default;
};
+class Create_func_sformat : public Create_native_func
+{
+public:
+ Item *create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list)
+ override;
+ static Create_func_sformat s_singleton;
+protected:
+ Create_func_sformat() = default;
+ virtual ~Create_func_sformat() = default;
+};
class Create_func_sha : public Create_func_arg1
{
@@ -2189,8 +2249,8 @@ public:
static Create_func_to_char s_singleton;
protected:
- Create_func_to_char() {}
- virtual ~Create_func_to_char() {}
+ Create_func_to_char() = default;
+ virtual ~Create_func_to_char() = default;
};
@@ -2285,30 +2345,6 @@ protected:
};
-class Create_func_uuid : public Create_func_arg0
-{
-public:
- virtual Item *create_builder(THD *thd);
-
- static Create_func_uuid s_singleton;
-
-protected:
- Create_func_uuid() = default;
- virtual ~Create_func_uuid() = default;
-};
-
-class Create_func_sys_guid : public Create_func_arg0
-{
-public:
- virtual Item *create_builder(THD *thd);
-
- static Create_func_sys_guid s_singleton;
-
-protected:
- Create_func_sys_guid() {}
- virtual ~Create_func_sys_guid() {}
-};
-
class Create_func_uuid_short : public Create_func_arg0
{
public:
@@ -3158,11 +3194,55 @@ Create_func_cot::create_1_arg(THD *thd, Item *arg1)
Create_func_crc32 Create_func_crc32::s_singleton;
Item*
-Create_func_crc32::create_1_arg(THD *thd, Item *arg1)
+Create_func_crc32::create_native(THD *thd, const LEX_CSTRING *name,
+ List<Item> *item_list)
+{
+ int argc= item_list ? item_list->elements : 0;
+
+ if (unlikely(argc != 1 && argc != 2))
+ {
+ my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name->str);
+ return nullptr;
+ }
+
+ Item *arg1= item_list->pop(), *arg2= argc < 2 ? nullptr : item_list->pop();
+
+ /* This was checked in Create_native_func::create_func() */
+ DBUG_ASSERT(!arg1->is_explicit_name());
+ DBUG_ASSERT(!arg2 || !arg2->is_explicit_name());
+
+ return arg2
+ ? new (thd->mem_root) Item_func_crc32(thd, false, arg1, arg2)
+ : new (thd->mem_root) Item_func_crc32(thd, false, arg1);
+}
+
+
+Create_func_crc32c Create_func_crc32c::s_singleton;
+
+Item*
+Create_func_crc32c::create_native(THD *thd, const LEX_CSTRING *name,
+ List<Item> *item_list)
{
- return new (thd->mem_root) Item_func_crc32(thd, arg1);
+ int argc= item_list ? item_list->elements : 0;
+
+ if (unlikely(argc != 1 && argc != 2))
+ {
+ my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name->str);
+ return nullptr;
+ }
+
+ Item *arg1= item_list->pop(), *arg2= argc < 2 ? nullptr : item_list->pop();
+
+ /* This was checked in Create_native_func::create_func() */
+ DBUG_ASSERT(!arg1->is_explicit_name());
+ DBUG_ASSERT(!arg2 || !arg2->is_explicit_name());
+
+ return arg2
+ ? new (thd->mem_root) Item_func_crc32(thd, true, arg1, arg2)
+ : new (thd->mem_root) Item_func_crc32(thd, true, arg1);
}
+
Create_func_datediff Create_func_datediff::s_singleton;
Item*
@@ -3664,6 +3744,25 @@ Create_func_isnull::create_1_arg(THD *thd, Item *arg1)
return new (thd->mem_root) Item_func_isnull(thd, arg1);
}
+Create_func_json_normalize Create_func_json_normalize::s_singleton;
+
+Item*
+Create_func_json_normalize::create_1_arg(THD *thd, Item *arg1)
+{
+ status_var_increment(thd->status_var.feature_json);
+ return new (thd->mem_root) Item_func_json_normalize(thd, arg1);
+}
+
+
+Create_func_json_equals Create_func_json_equals::s_singleton;
+
+Item*
+Create_func_json_equals::create_2_arg(THD *thd, Item *arg1, Item *arg2)
+{
+ status_var_increment(thd->status_var.feature_json);
+ return new (thd->mem_root) Item_func_json_equals(thd, arg1, arg2);
+}
+
Create_func_json_exists Create_func_json_exists::s_singleton;
@@ -4665,6 +4764,12 @@ Create_func_md5::create_1_arg(THD *thd, Item *arg1)
return new (thd->mem_root) Item_func_md5(thd, arg1);
}
+Create_func_natural_sort_key Create_func_natural_sort_key::s_singleton;
+
+Item *Create_func_natural_sort_key::create_1_arg(THD *thd, Item* arg1)
+{
+ return new (thd->mem_root) Item_func_natural_sort_key(thd, arg1);
+}
Create_func_monthname Create_func_monthname::s_singleton;
@@ -5047,6 +5152,26 @@ Create_func_sec_to_time::create_1_arg(THD *thd, Item *arg1)
return new (thd->mem_root) Item_func_sec_to_time(thd, arg1);
}
+Create_func_sformat Create_func_sformat::s_singleton;
+
+Item*
+Create_func_sformat::create_native(THD *thd, const LEX_CSTRING *name,
+ List<Item> *item_list)
+{
+ int arg_count= 0;
+
+ if (item_list != NULL)
+ arg_count= item_list->elements;
+
+ if (unlikely(arg_count < 1))
+ {
+ my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name->str);
+ return NULL;
+ }
+
+ return new (thd->mem_root) Item_func_sformat(thd, *item_list);
+}
+
Create_func_sha Create_func_sha::s_singleton;
@@ -5365,29 +5490,6 @@ Create_func_unix_timestamp::create_native(THD *thd, const LEX_CSTRING *name,
}
-Create_func_uuid Create_func_uuid::s_singleton;
-
-Item*
-Create_func_uuid::create_builder(THD *thd)
-{
- DBUG_ENTER("Create_func_uuid::create");
- thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
- thd->lex->safe_to_cache_query= 0;
- DBUG_RETURN(new (thd->mem_root) Item_func_uuid(thd, 0));
-}
-
-Create_func_sys_guid Create_func_sys_guid::s_singleton;
-
-Item*
-Create_func_sys_guid::create_builder(THD *thd)
-{
- DBUG_ENTER("Create_func_sys_guid::create");
- thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
- thd->lex->safe_to_cache_query= 0;
- DBUG_RETURN(new (thd->mem_root) Item_func_uuid(thd, 1));
-}
-
-
Create_func_uuid_short Create_func_uuid_short::s_singleton;
Item*
@@ -5594,6 +5696,7 @@ Native_func_registry func_array[] =
{ { STRING_WITH_LEN("COS") }, BUILDER(Create_func_cos)},
{ { STRING_WITH_LEN("COT") }, BUILDER(Create_func_cot)},
{ { STRING_WITH_LEN("CRC32") }, BUILDER(Create_func_crc32)},
+ { { STRING_WITH_LEN("CRC32C") }, BUILDER(Create_func_crc32c)},
{ { STRING_WITH_LEN("DATEDIFF") }, BUILDER(Create_func_datediff)},
{ { STRING_WITH_LEN("DAYNAME") }, BUILDER(Create_func_dayname)},
{ { STRING_WITH_LEN("DAYOFMONTH") }, BUILDER(Create_func_dayofmonth)},
@@ -5635,6 +5738,7 @@ Native_func_registry func_array[] =
{ { STRING_WITH_LEN("JSON_DEPTH") }, BUILDER(Create_func_json_depth)},
{ { STRING_WITH_LEN("JSON_DETAILED") }, BUILDER(Create_func_json_detailed)},
{ { STRING_WITH_LEN("JSON_PRETTY") }, BUILDER(Create_func_json_detailed)},
+ { { STRING_WITH_LEN("JSON_EQUALS") }, BUILDER(Create_func_json_equals)},
{ { STRING_WITH_LEN("JSON_EXISTS") }, BUILDER(Create_func_json_exists)},
{ { STRING_WITH_LEN("JSON_EXTRACT") }, BUILDER(Create_func_json_extract)},
{ { STRING_WITH_LEN("JSON_INSERT") }, BUILDER(Create_func_json_insert)},
@@ -5644,6 +5748,7 @@ Native_func_registry func_array[] =
{ { STRING_WITH_LEN("JSON_MERGE") }, BUILDER(Create_func_json_merge)},
{ { STRING_WITH_LEN("JSON_MERGE_PATCH") }, BUILDER(Create_func_json_merge_patch)},
{ { STRING_WITH_LEN("JSON_MERGE_PRESERVE") }, BUILDER(Create_func_json_merge)},
+ { { STRING_WITH_LEN("JSON_NORMALIZE") }, BUILDER(Create_func_json_normalize)},
{ { STRING_WITH_LEN("JSON_QUERY") }, BUILDER(Create_func_json_query)},
{ { STRING_WITH_LEN("JSON_QUOTE") }, BUILDER(Create_func_json_quote)},
{ { STRING_WITH_LEN("JSON_OBJECT") }, BUILDER(Create_func_json_object)},
@@ -5684,6 +5789,7 @@ Native_func_registry func_array[] =
{ { STRING_WITH_LEN("MD5") }, BUILDER(Create_func_md5)},
{ { STRING_WITH_LEN("MONTHNAME") }, BUILDER(Create_func_monthname)},
{ { STRING_WITH_LEN("NAME_CONST") }, BUILDER(Create_func_name_const)},
+ { {STRING_WITH_LEN("NATURAL_SORT_KEY")}, BUILDER(Create_func_natural_sort_key)},
{ { STRING_WITH_LEN("NVL") }, BUILDER(Create_func_ifnull)},
{ { STRING_WITH_LEN("NVL2") }, BUILDER(Create_func_nvl2)},
{ { STRING_WITH_LEN("NULLIF") }, BUILDER(Create_func_nullif)},
@@ -5713,6 +5819,7 @@ Native_func_registry func_array[] =
{ { STRING_WITH_LEN("RTRIM") }, BUILDER(Create_func_rtrim)},
{ { STRING_WITH_LEN("RTRIM_ORACLE") }, BUILDER(Create_func_rtrim_oracle)},
{ { STRING_WITH_LEN("SEC_TO_TIME") }, BUILDER(Create_func_sec_to_time)},
+ { { STRING_WITH_LEN("SFORMAT") }, BUILDER(Create_func_sformat)},
{ { STRING_WITH_LEN("SHA") }, BUILDER(Create_func_sha)},
{ { STRING_WITH_LEN("SHA1") }, BUILDER(Create_func_sha)},
{ { STRING_WITH_LEN("SHA2") }, BUILDER(Create_func_sha2)},
@@ -5728,7 +5835,6 @@ Native_func_registry func_array[] =
BUILDER(Create_func_substr_oracle)},
{ { STRING_WITH_LEN("SUBSTRING_INDEX") }, BUILDER(Create_func_substr_index)},
{ { STRING_WITH_LEN("SUBTIME") }, BUILDER(Create_func_subtime)},
- { { STRING_WITH_LEN("SYS_GUID") }, BUILDER(Create_func_sys_guid)},
{ { STRING_WITH_LEN("TAN") }, BUILDER(Create_func_tan)},
{ { STRING_WITH_LEN("TIMEDIFF") }, BUILDER(Create_func_timediff)},
{ { STRING_WITH_LEN("TIME_FORMAT") }, BUILDER(Create_func_time_format)},
@@ -5744,7 +5850,6 @@ Native_func_registry func_array[] =
{ { STRING_WITH_LEN("UNIX_TIMESTAMP") }, BUILDER(Create_func_unix_timestamp)},
{ { STRING_WITH_LEN("UPDATEXML") }, BUILDER(Create_func_xml_update)},
{ { STRING_WITH_LEN("UPPER") }, BUILDER(Create_func_ucase)},
- { { STRING_WITH_LEN("UUID") }, BUILDER(Create_func_uuid)},
{ { STRING_WITH_LEN("UUID_SHORT") }, BUILDER(Create_func_uuid_short)},
{ { STRING_WITH_LEN("VERSION") }, BUILDER(Create_func_version)},
{ { STRING_WITH_LEN("WEEKDAY") }, BUILDER(Create_func_weekday)},
diff --git a/sql/item_func.cc b/sql/item_func.cc
index e3f2eb500e0..0f7b26a678d 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -1007,7 +1007,8 @@ err:
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_WARN_DATA_OUT_OF_RANGE,
ER_THD(thd, ER_WARN_DATA_OUT_OF_RANGE),
- name.str, 1L);
+ name.str,
+ thd->get_stmt_da()->current_row_for_warning());
return dec;
}
diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc
index b8a743c2b6f..7e331e287f2 100644
--- a/sql/item_geofunc.cc
+++ b/sql/item_geofunc.cc
@@ -1083,6 +1083,7 @@ Item_func_spatial_rel::get_mm_leaf(RANGE_OPT_PARAM *param,
DBUG_RETURN(0); // out of memory
field->get_key_image(str, key_part->length, key_part->image_type);
SEL_ARG *tree;
+
if (!(tree= new (param->mem_root) SEL_ARG(field, str, str)))
DBUG_RETURN(0); // out of memory
diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc
index 3425f620dda..d32d2d30d4a 100644
--- a/sql/item_jsonfunc.cc
+++ b/sql/item_jsonfunc.cc
@@ -545,6 +545,66 @@ longlong Item_func_json_valid::val_int()
}
+bool Item_func_json_equals::fix_length_and_dec()
+{
+ if (Item_bool_func::fix_length_and_dec())
+ return TRUE;
+ set_maybe_null();
+ return FALSE;
+}
+
+
+longlong Item_func_json_equals::val_int()
+{
+ longlong result= 0;
+
+ String a_tmp, b_tmp;
+
+ String *a= args[0]->val_json(&a_tmp);
+ String *b= args[1]->val_json(&b_tmp);
+
+ DYNAMIC_STRING a_res;
+ if (init_dynamic_string(&a_res, NULL, 0, 0))
+ {
+ null_value= 1;
+ return 1;
+ }
+
+ DYNAMIC_STRING b_res;
+ if (init_dynamic_string(&b_res, NULL, 0, 0))
+ {
+ dynstr_free(&a_res);
+ null_value= 1;
+ return 1;
+ }
+
+ if ((null_value= args[0]->null_value || args[1]->null_value))
+ {
+ null_value= 1;
+ goto end;
+ }
+
+ if (json_normalize(&a_res, a->ptr(), a->length(), a->charset()))
+ {
+ null_value= 1;
+ goto end;
+ }
+
+ if (json_normalize(&b_res, b->ptr(), b->length(), b->charset()))
+ {
+ null_value= 1;
+ goto end;
+ }
+
+ result= strcmp(a_res.str, b_res.str) ? 0 : 1;
+
+end:
+ dynstr_free(&b_res);
+ dynstr_free(&a_res);
+ return result;
+}
+
+
bool Item_func_json_exists::fix_length_and_dec()
{
if (Item_bool_func::fix_length_and_dec())
@@ -1134,7 +1194,7 @@ my_decimal *Item_func_json_extract::val_decimal(my_decimal *to)
case JSON_VALUE_OBJECT:
case JSON_VALUE_ARRAY:
case JSON_VALUE_FALSE:
- case JSON_VALUE_UNINITALIZED:
+ case JSON_VALUE_UNINITIALIZED:
case JSON_VALUE_NULL:
int2my_decimal(E_DEC_FATAL_ERROR, 0, false/*unsigned_flag*/, to);
return to;
@@ -2917,7 +2977,7 @@ longlong Item_func_json_depth::val_int()
bool Item_func_json_type::fix_length_and_dec()
{
collation.set(&my_charset_utf8mb3_general_ci);
- max_length= 12;
+ max_length= 12 * collation.collation->mbmaxlen;
set_maybe_null();
return FALSE;
}
@@ -4104,3 +4164,48 @@ String* Item_func_json_objectagg::val_str(String* str)
}
+String *Item_func_json_normalize::val_str(String *buf)
+{
+ String tmp;
+ String *raw_json= args[0]->val_str(&tmp);
+
+ DYNAMIC_STRING normalized_json;
+ if (init_dynamic_string(&normalized_json, NULL, 0, 0))
+ {
+ null_value= 1;
+ return NULL;
+ }
+
+ null_value= args[0]->null_value;
+ if (null_value)
+ goto end;
+
+ if (json_normalize(&normalized_json,
+ raw_json->ptr(), raw_json->length(),
+ raw_json->charset()))
+ {
+ null_value= 1;
+ goto end;
+ }
+
+ buf->length(0);
+ if (buf->append(normalized_json.str, normalized_json.length))
+ {
+ null_value= 1;
+ goto end;
+ }
+
+end:
+ dynstr_free(&normalized_json);
+ return null_value ? NULL : buf;
+}
+
+
+bool Item_func_json_normalize::fix_length_and_dec()
+{
+ collation.set(&my_charset_utf8mb4_bin);
+ /* 0 becomes 0.0E0, thus one character becomes 5 chars */
+ fix_char_length_ulonglong((ulonglong) args[0]->max_char_length() * 5);
+ set_maybe_null();
+ return FALSE;
+}
diff --git a/sql/item_jsonfunc.h b/sql/item_jsonfunc.h
index 6cdd8851663..70993228241 100644
--- a/sql/item_jsonfunc.h
+++ b/sql/item_jsonfunc.h
@@ -107,6 +107,23 @@ public:
};
+class Item_func_json_equals: public Item_bool_func
+{
+public:
+ Item_func_json_equals(THD *thd, Item *a, Item *b):
+ Item_bool_func(thd, a, b) {}
+ LEX_CSTRING func_name_cstring() const override
+ {
+ static LEX_CSTRING name= {STRING_WITH_LEN("json_equals") };
+ return name;
+ }
+ bool fix_length_and_dec() override;
+ Item *get_copy(THD *thd) override
+ { return get_item_copy<Item_func_json_equals>(thd, this); }
+ longlong val_int() override;
+};
+
+
class Item_func_json_exists: public Item_bool_func
{
protected:
@@ -440,6 +457,24 @@ public:
{ return get_item_copy<Item_func_json_merge_patch>(thd, this); }
};
+
+class Item_func_json_normalize: public Item_json_func
+{
+public:
+ Item_func_json_normalize(THD *thd, Item *a):
+ Item_json_func(thd, a) {}
+ String *val_str(String *) override;
+ LEX_CSTRING func_name_cstring() const override
+ {
+ static LEX_CSTRING name= {STRING_WITH_LEN("json_normalize") };
+ return name;
+ }
+ bool fix_length_and_dec() override;
+ Item *get_copy(THD *thd) override
+ { return get_item_copy<Item_func_json_normalize>(thd, this); }
+};
+
+
class Item_func_json_length: public Item_long_func
{
bool check_arguments() const override
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 0211948f749..7f91246a982 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -1,6 +1,6 @@
/*
Copyright (c) 2000, 2017, Oracle and/or its affiliates.
- Copyright (c) 2009, 2021, MariaDB Corporation.
+ Copyright (c) 2009, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -55,6 +55,11 @@ C_MODE_END
#include <sql_repl.h>
#include "sql_statistics.h"
+/* fmtlib include (https://fmt.dev/). */
+#define FMT_STATIC_THOUSANDS_SEPARATOR ','
+#define FMT_HEADER_ONLY 1
+#include "fmt/format-inl.h"
+
size_t username_char_length= USERNAME_CHAR_LENGTH;
/*
@@ -498,7 +503,7 @@ err:
const char *histogram_types[] =
- {"SINGLE_PREC_HB", "DOUBLE_PREC_HB", 0};
+ {"SINGLE_PREC_HB", "DOUBLE_PREC_HB", "JSON_HB", 0};
static TYPELIB histogram_types_typelib=
{ array_elements(histogram_types),
"histogram_types",
@@ -528,6 +533,14 @@ String *Item_func_decode_histogram::val_str(String *str)
null_value= 1;
return 0;
}
+
+ if (type == JSON_HB)
+ {
+ // It's a JSON histogram. Return it as-is.
+ null_value= 0;
+ return res;
+ }
+
if (type == DOUBLE_PREC_HB && res->length() % 2 != 0)
res->length(res->length() - 1); // one byte is unused
@@ -1303,6 +1316,138 @@ bool Item_func_replace::fix_length_and_dec()
return FALSE;
}
+/*
+ this is done in the constructor to be in the same memroot as
+ the item itself
+*/
+Item_func_sformat::Item_func_sformat(THD *thd, List<Item> &list)
+ : Item_str_func(thd, list)
+{
+ val_arg= new (thd->mem_root) String[arg_count];
+}
+
+
+bool Item_func_sformat::fix_length_and_dec()
+{
+ if (!val_arg)
+ return TRUE;
+
+ ulonglong char_length= 0;
+
+ uint flags= MY_COLL_ALLOW_SUPERSET_CONV |
+ MY_COLL_ALLOW_COERCIBLE_CONV |
+ MY_COLL_ALLOW_NUMERIC_CONV;
+
+ if (Type_std_attributes::agg_item_collations(collation, func_name_cstring(),
+ args, arg_count, flags, 1))
+ return TRUE;
+
+ DTCollation c= collation;
+ if (c.collation->mbminlen > 1)
+ c.collation= &my_charset_utf8mb4_bin;
+
+ for (uint i=0 ; i < arg_count ; i++)
+ {
+ char_length+= args[i]->max_char_length();
+ if (args[i]->result_type() == STRING_RESULT &&
+ Type_std_attributes::agg_item_set_converter(c, func_name_cstring(),
+ args+i, 1, flags, 1))
+ return TRUE;
+ }
+
+ fix_char_length_ulonglong(char_length);
+ return FALSE;
+}
+
+/*
+ allow fmt to take String arguments directly.
+ Inherit from string_view, so all string formatting works.
+ but {:p} doesn't, because it's not char*, not a pointer.
+*/
+namespace fmt {
+ template <> struct formatter<String>: formatter<string_view> {
+ template <typename FormatContext>
+ auto format(String c, FormatContext& ctx) -> decltype(ctx.out()) {
+ string_view name = { c.ptr(), c.length() };
+ return formatter<string_view>::format(name, ctx);
+ };
+ };
+};
+
+/*
+ SFORMAT(format_string, ...)
+ This function receives a formatting specification string and N parameters
+ (N >= 0), and it returns string formatted using the rules the user passed
+ in the specification. It uses fmtlib (https://fmt.dev/).
+*/
+String *Item_func_sformat::val_str(String *res)
+{
+ DBUG_ASSERT(fixed());
+ using ctx= fmt::format_context;
+ String *fmt_arg= NULL;
+ String *parg= NULL;
+ fmt::format_args::format_arg *vargs= NULL;
+
+ null_value= true;
+ if (!(fmt_arg= args[0]->val_str(res)))
+ return NULL;
+
+ if (!(vargs= new fmt::format_args::format_arg[arg_count - 1]))
+ return NULL;
+
+ /* Creates the array of arguments for vformat */
+ for (uint carg= 1; carg < arg_count; carg++)
+ {
+ switch (args[carg]->result_type())
+ {
+ case INT_RESULT:
+ vargs[carg-1]= fmt::detail::make_arg<ctx>(args[carg]->val_int());
+ break;
+ case DECIMAL_RESULT: // TODO
+ case REAL_RESULT:
+ if (args[carg]->field_type() == MYSQL_TYPE_FLOAT)
+ vargs[carg-1]= fmt::detail::make_arg<ctx>((float)args[carg]->val_real());
+ else
+ vargs[carg-1]= fmt::detail::make_arg<ctx>(args[carg]->val_real());
+ break;
+ case STRING_RESULT:
+ if (!(parg= args[carg]->val_str(&val_arg[carg-1])))
+ {
+ delete [] vargs;
+ return NULL;
+ }
+ vargs[carg-1]= fmt::detail::make_arg<ctx>(*parg);
+ break;
+ case TIME_RESULT: // TODO
+ case ROW_RESULT: // TODO
+ default:
+ DBUG_ASSERT(0);
+ delete [] vargs;
+ return NULL;
+ }
+ }
+
+ null_value= false;
+ /* Create the string output */
+ try
+ {
+ auto text = fmt::vformat(fmt_arg->c_ptr_safe(),
+ fmt::format_args(vargs, arg_count-1));
+ res->length(0);
+ res->set_charset(collation.collation);
+ res->append(text.c_str(), text.size(), fmt_arg->charset());
+ }
+ catch (const fmt::format_error &ex)
+ {
+ THD *thd= current_thd;
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ WARN_SFORMAT_ERROR,
+ ER_THD(thd, WARN_SFORMAT_ERROR), ex.what());
+ null_value= true;
+ }
+ delete [] vargs;
+ return null_value ? NULL : res;
+}
/*********************************************************************/
bool Item_func_regexp_replace::fix_length_and_dec()
@@ -4254,14 +4399,32 @@ longlong Item_func_uncompressed_length::val_int()
longlong Item_func_crc32::val_int()
{
DBUG_ASSERT(fixed());
- String *res=args[0]->val_str(&value);
+ DBUG_ASSERT(arg_count == 1 || arg_count == 2);
+ String *res;
+ longlong crc;
+ if (arg_count > 1)
+ {
+ crc= args[0]->val_int();
+ null_value= args[0]->null_value;
+ if (null_value)
+ return 0;
+ res= args[1]->val_str(&value);
+ }
+ else
+ {
+ crc= 0;
+ null_value= 0;
+ res= args[0]->val_str(&value);
+ }
+
if (!res)
{
null_value=1;
return 0; /* purecov: inspected */
}
- null_value=0;
- return (longlong) my_checksum(0L, (uchar*)res->ptr(), res->length());
+
+ return static_cast<longlong>
+ (ulonglong{crc_func(uint32_t(crc), res->ptr(), res->length())});
}
#ifdef HAVE_COMPRESS
@@ -4394,26 +4557,6 @@ err:
#endif
-String *Item_func_uuid::val_str(String *str)
-{
- DBUG_ASSERT(fixed());
- uchar guid[MY_UUID_SIZE];
- size_t length= (without_separators ?
- MY_UUID_ORACLE_STRING_LENGTH :
- MY_UUID_STRING_LENGTH);
-
- str->alloc(length+1);
- str->length(length);
- str->set_charset(system_charset_info);
- my_uuid(guid);
- if (without_separators)
- my_uuid2str_oracle(guid, (char *)str->ptr());
- else
- my_uuid2str(guid, (char *)str->ptr());
- return str;
-}
-
-
Item_func_dyncol_create::Item_func_dyncol_create(THD *thd, List<Item> &args,
DYNCALL_CREATE_DEF *dfs):
Item_str_func(thd, args), defs(dfs), vals(0), keys_num(NULL), keys_str(NULL),
@@ -5319,6 +5462,282 @@ String *Item_temptable_rowid::val_str(String *str)
return &str_value;
}
+/**
+ Helper routine to encode length prefix
+ in natsort_encode_numeric_string().
+
+ The idea is so that bigger input numbers correspond
+ lexicographically bigger output strings.
+
+ Note, that in real use the number would typically
+ small, as it only computes variable *length prefixes*.
+
+ @param[in] n - the number
+ @param[in] s - output string
+
+ @return - length of encoding
+
+ Here is how encoding works
+
+ - n is from 0 to 8
+ Output string calculated as '0'+n (range '0' - '8')
+
+ - n is from 9 to 17
+ Output calculated as concat('9', '0' + n -9)'
+ Output range: '90'-'98'
+
+ -n is from 18 to 26
+ Output calculated as concat('99', '0' + n -18)'
+ Output range '990'-'998'
+
+ - n is from 27 to SIZE_T_MAX
+ Output starts with '999',
+ then log10(n) is encoded as 2-digit decimal number
+ then the number itself is added.
+ Example : for 28 key is concat('999', '01' , '28')
+ i.e '9990128'
+
+ Key length is 5 + ceil(log10(n))
+
+ Output range is
+ (64bit)'9990128' - '9991918446744073709551615'
+ (32bit)'9990128' - '999094294967295'
+*/
+
+/* Largest length of encoded string.*/
+static size_t natsort_encode_length_max(size_t n)
+{
+ return (n < 27) ? n/9+1 : 26;
+}
+
+static void natsort_encode_length(size_t n, String* out)
+{
+ if (n < 27)
+ {
+ if (n >= 9)
+ out->fill(out->length() + n/9,'9');
+ out->append(char(n % 9 + '0'));
+ return;
+ }
+
+ size_t log10n= 0;
+ for (size_t tmp= n / 10; tmp; tmp/= 10)
+ log10n++;
+ out->fill(out->length() + 3, '9');
+ out->append('0' + (char) (log10n / 10));
+ out->append('0' + (char) (log10n % 10));
+ out->append_ulonglong(n);
+}
+
+enum class NATSORT_ERR
+{
+ SUCCESS= 0,
+ KEY_TOO_LARGE= 1,
+ ALLOC_ERROR= 2
+};
+
+/*
+ Encode numeric string for natural sorting.
+
+ @param[in] in - start of the numeric string
+ skipping leading zeros
+
+ @param[in] n_digits - length of the string,
+ in characters, not counting leading zeros.
+
+ @param[out] out - String to write to. The string should
+ have enough preallocated space to fit the encoded key.
+
+ @return
+ NATSORT_ERR::SUCCESS - success
+ NATSORT_ERR::KEY_TOO_LARGE - out string does not have enough
+ space left to accomodate the key.
+
+
+ The resulting encoding of the numeric string is then
+
+ CONCAT(natsort_encode_length(n_digits), in)
+*/
+static NATSORT_ERR natsort_encode_numeric_string(const char *in,
+ size_t n_digits,
+ String *out)
+{
+ DBUG_ASSERT(in);
+ DBUG_ASSERT(n_digits);
+
+ if (out->length() + natsort_encode_length_max(n_digits - 1) + n_digits >
+ out->alloced_length())
+ return NATSORT_ERR::KEY_TOO_LARGE;
+
+ natsort_encode_length(n_digits - 1, out);
+ out->append(in, n_digits);
+ return NATSORT_ERR::SUCCESS;
+}
+
+/*
+ Calculate max size of the natsort key.
+
+ A digit in string expands to 2 chars length_prefix , and the digit
+
+ With even length L=2N, the largest key corresponds to input string
+ in form REPEAT(<digit><letter>,N) and the length of a key is
+ 2N + N = 3N
+
+ With odd input length L=2N+1, largest key is built by appending
+ a digit at the end, with key length 3N+2
+
+*/
+static size_t natsort_max_key_size(size_t input_size)
+{
+ return input_size + (input_size + 1)/2 ;
+}
+
+/**
+ Convert a string to natural sort key.
+ @param[in] in - input string
+ @param[out] out - output string
+ @param[in] max_key_size - the maximum size of the output
+ key, in bytes.
+ @return NATSORT_ERR::SUCCESS - successful completion
+ NATSORT_ERR::ALLOC_ERROR - memory allocation error
+ NATSORT_ERR::KEY_TOO_LARGE - resulting key would exceed max_key_size
+*/
+static NATSORT_ERR to_natsort_key(const String *in, String *out,
+ size_t max_key_size)
+{
+ size_t n_digits= 0;
+ size_t n_lead_zeros= 0;
+ size_t num_start;
+ size_t reserve_length= std::min(
+ natsort_max_key_size(in->length()) + MAX_BIGINT_WIDTH + 2, max_key_size);
+
+ out->length(0);
+ out->set_charset(in->charset());
+
+ if (out->alloc((uint32) reserve_length))
+ return NATSORT_ERR::ALLOC_ERROR;
+
+ for (size_t pos= 0;; pos++)
+ {
+ char c= pos < in->length() ? (*in)[pos] : 0;
+ bool is_digit= (c >= '0' && c <= '9');
+ if (!is_digit && (n_digits || n_lead_zeros))
+ {
+ /* Handle end of digits run.*/
+ if (!n_digits)
+ {
+ /*We only have zeros.*/
+ n_lead_zeros--;
+ num_start= pos - 1;
+ n_digits= 1;
+ }
+ NATSORT_ERR err= natsort_encode_numeric_string(
+ in->ptr() + num_start, n_digits, out);
+ if (err != NATSORT_ERR::SUCCESS)
+ return err;
+
+ /* Reset state.*/
+ n_digits= 0;
+ num_start= size_t(-1);
+ n_lead_zeros= 0;
+ }
+
+ if (pos == in->length())
+ break;
+
+ if (!is_digit)
+ {
+ if (out->length() == max_key_size)
+ return NATSORT_ERR::KEY_TOO_LARGE;
+ out->append(c);
+ }
+ else if (c == '0' && !n_digits)
+ n_lead_zeros++;
+ else if (!n_digits++)
+ num_start= pos;
+ }
+ return NATSORT_ERR::SUCCESS;
+}
+
+String *Item_func_natural_sort_key::val_str(String *out)
+{
+ String *in= args[0]->val_str();
+ if (args[0]->null_value || !in)
+ {
+ null_value= true;
+ return nullptr;
+ }
+ NATSORT_ERR err= NATSORT_ERR::SUCCESS;
+ CHARSET_INFO *cs= in->charset();
+ ulong max_allowed_packet= current_thd->variables.max_allowed_packet;
+ uint errs;
+ String tmp;
+ /*
+ to_natsort_key() only support charsets where digits are represented by
+ a single byte in range 0x30-0x39. Almost everything is OK, just utf16/32
+ won't do. Full ASCII compatibility is not required, so that SJIS and SWE7
+ are fine.
+ */
+ if (cs->mbminlen != 1)
+ {
+ if (tmp.copy(in, &my_charset_utf8mb4_bin, &errs))
+ goto error_exit;
+ in= &tmp;
+ }
+
+ err= to_natsort_key(in, out, max_allowed_packet / cs->mbminlen);
+
+ if (err != NATSORT_ERR::SUCCESS)
+ {
+ if (err == NATSORT_ERR::KEY_TOO_LARGE)
+ {
+ push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_WARN_ALLOWED_PACKET_OVERFLOWED,
+ ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
+ max_allowed_packet);
+ }
+ goto error_exit;
+ }
+
+ if (cs->mbminlen != 1)
+ {
+ /* output string is now utf8, convert to input charset.*/
+ if (tmp.copy(out, cs, &errs) || out->copy(tmp))
+ goto error_exit;
+ }
+ null_value= false;
+ return out;
+
+error_exit:
+ null_value= true;
+ return nullptr;
+}
+
+bool Item_func_natural_sort_key::fix_length_and_dec(void)
+{
+ if (agg_arg_charsets_for_string_result(collation, args, 1))
+ return true;
+ DBUG_ASSERT(collation.collation != NULL);
+ uint32 max_char_len=
+ (uint32) natsort_max_key_size(args[0]->max_char_length());
+ fix_char_length(max_char_len);
+
+ set_maybe_null(args[0]->maybe_null() ||
+ max_char_len * collation.collation->mbmaxlen >
+ current_thd->variables.max_allowed_packet);
+ return false;
+}
+
+/**
+ Disable use in stored virtual functions. Temporarily(?), until
+ the encoding is stable.
+*/
+bool Item_func_natural_sort_key::check_vcol_func_processor(void *arg)
+{
+ return mark_unsupported_function(func_name(), "()", arg,
+ VCOL_NON_DETERMINISTIC);
+}
+
#ifdef WITH_WSREP
#include "wsrep_mysqld.h"
#include "wsrep_server_state.h"
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index 258c0e26bad..86a095a39e6 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -3,7 +3,7 @@
/*
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
- Copyright (c) 2009, 2021, MariaDB
+ Copyright (c) 2009, 2022, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -271,6 +271,25 @@ public:
{ return get_item_copy<Item_func_aes_decrypt>(thd, this); }
};
+class Item_func_natural_sort_key : public Item_str_func
+{
+public:
+ Item_func_natural_sort_key(THD *thd, Item *a)
+ : Item_str_func(thd, a){};
+ String *val_str(String *) override;
+ LEX_CSTRING func_name_cstring() const override
+ {
+ static LEX_CSTRING name= {STRING_WITH_LEN("natural_sort_key")};
+ return name;
+ }
+ bool fix_length_and_dec(void) override;
+ Item *get_copy(THD *thd) override
+ {
+ return get_item_copy<Item_func_natural_sort_key>(thd, this);
+ }
+
+ bool check_vcol_func_processor(void *arg) override;
+};
class Item_func_concat :public Item_str_func
{
@@ -587,6 +606,23 @@ public:
{ return get_item_copy<Item_func_substr>(thd, this); }
};
+class Item_func_sformat :public Item_str_func
+{
+ String *val_arg;
+public:
+ Item_func_sformat(THD *thd, List<Item> &list);
+ ~Item_func_sformat() { delete [] val_arg; }
+ String *val_str(String*) override;
+ bool fix_length_and_dec() override;
+ LEX_CSTRING func_name_cstring() const override
+ {
+ static LEX_CSTRING name= {STRING_WITH_LEN("sformat") };
+ return name;
+ }
+ Item *get_copy(THD *thd) override
+ { return get_item_copy<Item_func_sformat>(thd, this); }
+};
+
class Item_func_substr_oracle :public Item_func_substr
{
protected:
@@ -1909,15 +1945,27 @@ public:
class Item_func_crc32 :public Item_long_func
{
bool check_arguments() const override
- { return args[0]->check_type_can_return_str(func_name_cstring()); }
+ {
+ return args[0]->check_type_can_return_str(func_name_cstring()) &&
+ (arg_count == 1 ||
+ args[1]->check_type_can_return_int(func_name_cstring()));
+ }
String value;
+ uint32 (*const crc_func)(uint32, const void*, size_t);
public:
- Item_func_crc32(THD *thd, Item *a): Item_long_func(thd, a)
+ Item_func_crc32(THD *thd, bool Castagnoli, Item *a) :
+ Item_long_func(thd, a),
+ crc_func(Castagnoli ? my_crc32c : my_checksum)
+ { unsigned_flag= 1; }
+ Item_func_crc32(THD *thd, bool Castagnoli, Item *a, Item *b) :
+ Item_long_func(thd, a, b),
+ crc_func(Castagnoli ? my_crc32c : my_checksum)
{ unsigned_flag= 1; }
LEX_CSTRING func_name_cstring() const override
{
- static LEX_CSTRING name= {STRING_WITH_LEN("crc32") };
- return name;
+ static LEX_CSTRING crc32_name= {STRING_WITH_LEN("crc32") };
+ static LEX_CSTRING crc32c_name= {STRING_WITH_LEN("crc32c") };
+ return crc_func == my_crc32c ? crc32c_name : crc32_name;
}
bool fix_length_and_dec() override { max_length=10; return FALSE; }
longlong val_int() override;
@@ -1996,40 +2044,6 @@ public:
};
-class Item_func_uuid: public Item_str_func
-{
- /* Set if uuid should be returned without separators (Oracle sys_guid) */
- bool without_separators;
-public:
-Item_func_uuid(THD *thd, bool without_separators_arg): Item_str_func(thd),
- without_separators(without_separators_arg)
- {}
- bool fix_length_and_dec() override
- {
- collation.set(DTCollation_numeric());
- fix_char_length(without_separators ? MY_UUID_ORACLE_STRING_LENGTH :
- MY_UUID_STRING_LENGTH);
- return FALSE;
- }
- bool const_item() const override { return false; }
- table_map used_tables() const override { return RAND_TABLE_BIT; }
- LEX_CSTRING func_name_cstring() const override
- {
- static LEX_CSTRING mariadb_name= {STRING_WITH_LEN("uuid") };
- static LEX_CSTRING oracle_name= {STRING_WITH_LEN("sys_guid") };
- return without_separators ? oracle_name : mariadb_name;
- }
- String *val_str(String *) override;
- bool check_vcol_func_processor(void *arg) override
- {
- return mark_unsupported_function(func_name(), "()", arg,
- VCOL_NON_DETERMINISTIC);
- }
- Item *get_copy(THD *thd) override
- { return get_item_copy<Item_func_uuid>(thd, this); }
-};
-
-
class Item_func_dyncol_create: public Item_str_func
{
protected:
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index 862dc15e3e3..d61a620116a 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -1577,7 +1577,7 @@ bool Item_singlerow_subselect::get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t
Item_exists_subselect::Item_exists_subselect(THD *thd,
st_select_lex *select_lex):
- Item_subselect(thd), upper_not(NULL), abort_on_null(0),
+ Item_subselect(thd), upper_not(NULL),
emb_on_expr_nest(NULL), optimizer(0), exists_transformed(0)
{
DBUG_ENTER("Item_exists_subselect::Item_exists_subselect");
@@ -1662,7 +1662,6 @@ Item_allany_subselect::Item_allany_subselect(THD *thd, Item * left_exp,
func= func_creator(all_arg);
init(select_lex, new (thd->mem_root) select_exists_subselect(thd, this));
max_columns= 1;
- abort_on_null= 0;
reset();
//if test_limit will fail then error will be reported to client
test_limit(select_lex->master_unit());
@@ -2237,8 +2236,11 @@ bool Item_allany_subselect::is_maxmin_applicable(JOIN *join)
Check if max/min optimization applicable: It is top item of
WHERE condition.
*/
- return (abort_on_null || (upper_item && upper_item->is_top_level_item())) &&
- !(join->select_lex->master_unit()->uncacheable & ~UNCACHEABLE_EXPLAIN) && !func->eqne_op();
+ return ((is_top_level_item() ||
+ (upper_item && upper_item->is_top_level_item())) &&
+ !(join->select_lex->master_unit()->uncacheable &
+ ~UNCACHEABLE_EXPLAIN) &&
+ !func->eqne_op());
}
@@ -2308,7 +2310,7 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
ref_pointer_array[0],
{STRING_WITH_LEN("<ref>")},
field_name));
- if (!abort_on_null && left_expr->maybe_null())
+ if (!is_top_level_item() && left_expr->maybe_null())
{
/*
We can encounter "NULL IN (SELECT ...)". Wrap the added condition
@@ -2341,7 +2343,7 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
Item *orig_item= item;
item= func->create(thd, expr, item);
- if (!abort_on_null && orig_item->maybe_null())
+ if (!is_top_level_item() && orig_item->maybe_null())
{
having= new (thd->mem_root) Item_is_not_null_test(thd, this, having);
if (left_expr->maybe_null())
@@ -2363,7 +2365,7 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
If we may encounter NULL IN (SELECT ...) and care whether subquery
result is NULL or FALSE, wrap condition in a trig_cond.
*/
- if (!abort_on_null && left_expr->maybe_null())
+ if (!is_top_level_item() && left_expr->maybe_null())
{
disable_cond_guard_for_const_null_left_expr(0);
if (!(item= new (thd->mem_root) Item_func_trig_cond(thd, item,
@@ -2393,7 +2395,7 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
&select_lex->ref_pointer_array[0],
no_matter_name,
field_name));
- if (!abort_on_null && left_expr->maybe_null())
+ if (!is_top_level_item() && left_expr->maybe_null())
{
disable_cond_guard_for_const_null_left_expr(0);
if (!(new_having= new (thd->mem_root)
@@ -2592,7 +2594,7 @@ Item_in_subselect::create_row_in_to_exists_cond(JOIN * join,
list_ref));
Item *col_item= new (thd->mem_root)
Item_cond_or(thd, item_eq, item_isnull);
- if (!abort_on_null && left_expr->element_index(i)->maybe_null() &&
+ if (!is_top_level_item() && left_expr->element_index(i)->maybe_null() &&
get_cond_guard(i))
{
disable_cond_guard_for_const_null_left_expr(i);
@@ -2611,7 +2613,7 @@ Item_in_subselect::create_row_in_to_exists_cond(JOIN * join,
ref_pointer_array[i],
no_matter_name,
list_ref));
- if (!abort_on_null && left_expr->element_index(i)->maybe_null() &&
+ if (!is_top_level_item() && left_expr->element_index(i)->maybe_null() &&
get_cond_guard(i) )
{
disable_cond_guard_for_const_null_left_expr(i);
@@ -2652,7 +2654,7 @@ Item_in_subselect::create_row_in_to_exists_cond(JOIN * join,
ref_pointer_array[i],
no_matter_name,
list_ref));
- if (!abort_on_null && select_lex->ref_pointer_array[i]->maybe_null())
+ if (!is_top_level_item() && select_lex->ref_pointer_array[i]->maybe_null())
{
Item *having_col_item=
new (thd->mem_root)
@@ -2684,7 +2686,7 @@ Item_in_subselect::create_row_in_to_exists_cond(JOIN * join,
}
*having_item= and_items(thd, *having_item, having_col_item);
}
- if (!abort_on_null && left_expr->element_index(i)->maybe_null() &&
+ if (!is_top_level_item() && left_expr->element_index(i)->maybe_null() &&
get_cond_guard(i))
{
if (!(item= new (thd->mem_root)
@@ -3657,7 +3659,7 @@ bool Item_in_subselect::init_cond_guards()
{
DBUG_ASSERT(thd);
uint cols_num= left_expr->cols();
- if (!abort_on_null && !pushed_cond_guards &&
+ if (!is_top_level_item() && !pushed_cond_guards &&
(left_expr->maybe_null() || cols_num > 1))
{
if (!(pushed_cond_guards= (bool*)thd->alloc(sizeof(bool) * cols_num)))
@@ -4243,9 +4245,9 @@ bool subselect_uniquesubquery_engine::copy_ref_key(bool skip_constants)
- NULL if select produces empty row set
- FALSE otherwise.
- In some cases (IN subselect is a top level item, i.e. abort_on_null==TRUE)
- the caller doesn't distinguish between NULL and FALSE result and we just
- return FALSE.
+ In some cases (IN subselect is a top level item, i.e.
+ is_top_level_item() == TRUE, the caller doesn't distinguish between NULL and
+ FALSE result and we just return FALSE.
Otherwise we make a full table scan to see if there is at least one
matching row.
@@ -5100,7 +5102,7 @@ my_bitmap_init_memroot(MY_BITMAP *map, uint n_bits, MEM_ROOT *mem_root)
if (!(bitmap_buf= (my_bitmap_map*) alloc_root(mem_root,
bitmap_buffer_size(n_bits))) ||
- my_bitmap_init(map, bitmap_buf, n_bits, FALSE))
+ my_bitmap_init(map, bitmap_buf, n_bits))
return TRUE;
bitmap_clear_all(map);
return FALSE;
@@ -5989,7 +5991,7 @@ bool Ordered_key::alloc_keys_buffers()
lookup offset.
*/
/* Notice that max_null_row is max array index, we need count, so +1. */
- if (my_bitmap_init(&null_key, NULL, (uint)(max_null_row + 1), FALSE))
+ if (my_bitmap_init(&null_key, NULL, (uint)(max_null_row + 1)))
return TRUE;
cur_key_idx= HA_POS_ERROR;
diff --git a/sql/item_subselect.h b/sql/item_subselect.h
index a304c63c458..8d58e16bb28 100644
--- a/sql/item_subselect.h
+++ b/sql/item_subselect.h
@@ -372,7 +372,6 @@ class Item_exists_subselect :public Item_subselect
protected:
Item_func_not *upper_not;
bool value; /* value of this item (boolean: exists/not-exists) */
- bool abort_on_null;
void init_length_and_dec();
bool select_prepare_to_be_in();
@@ -396,7 +395,7 @@ public:
Item_exists_subselect(THD *thd_arg, st_select_lex *select_lex);
Item_exists_subselect(THD *thd_arg):
- Item_subselect(thd_arg), upper_not(NULL), abort_on_null(0),
+ Item_subselect(thd_arg), upper_not(NULL),
emb_on_expr_nest(NULL), optimizer(0), exists_transformed(0)
{}
@@ -423,8 +422,6 @@ public:
bool fix_length_and_dec() override;
void print(String *str, enum_query_type query_type) override;
bool select_transformer(JOIN *join) override;
- void top_level_item() override { abort_on_null=1; }
- bool is_top_level_item() const override { return abort_on_null; }
bool exists2in_processor(void *opt_arg) override;
Item* expr_cache_insert_transformer(THD *thd, uchar *unused) override;
diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc
index 2f4d34afc6d..a130be4f973 100644
--- a/sql/item_xmlfunc.cc
+++ b/sql/item_xmlfunc.cc
@@ -1232,13 +1232,13 @@ my_xpath_keyword(MY_XPATH *x,
static Item *create_func_true(MY_XPATH *xpath, Item **args, uint nargs)
{
- return (Item*) &Item_true;
+ return (Item*) Item_true;
}
static Item *create_func_false(MY_XPATH *xpath, Item **args, uint nargs)
{
- return (Item*) &Item_false;
+ return (Item*) Item_false;
}
diff --git a/sql/json_table.cc b/sql/json_table.cc
index 65fe3c9a659..21782a9f14b 100644
--- a/sql/json_table.cc
+++ b/sql/json_table.cc
@@ -886,8 +886,7 @@ TABLE *create_table_for_function(THD *thd, TABLE_LIST *sql_table)
my_bitmap_map* bitmaps=
(my_bitmap_map*) thd->alloc(bitmap_buffer_size(field_count));
- my_bitmap_init(&table->def_read_set, (my_bitmap_map*) bitmaps, field_count,
- FALSE);
+ my_bitmap_init(&table->def_read_set, (my_bitmap_map*) bitmaps, field_count);
table->read_set= &table->def_read_set;
bitmap_clear_all(table->read_set);
table->alias_name_used= true;
diff --git a/sql/key.cc b/sql/key.cc
index f2cebfe6d82..b65851cf7c1 100644
--- a/sql/key.cc
+++ b/sql/key.cc
@@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
- Copyright (c) 2018, 2020, MariaDB
+ Copyright (c) 2018, 2021, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -495,6 +495,7 @@ int key_cmp(KEY_PART_INFO *key_part, const uchar *key, uint key_length)
{
int cmp;
store_length= key_part->store_length;
+ int sort_order = (key_part->key_part_flag & HA_REVERSE_SORT) ? -1 : 1;
if (key_part->null_bit)
{
/* This key part allows null values; NULL is lower than everything */
@@ -503,19 +504,19 @@ int key_cmp(KEY_PART_INFO *key_part, const uchar *key, uint key_length)
{
/* the range is expecting a null value */
if (!field_is_null)
- return 1; // Found key is > range
+ return sort_order; // Found key is > range
/* null -- exact match, go to next key part */
continue;
}
else if (field_is_null)
- return -1; // NULL is less than any value
+ return -sort_order; // NULL is less than any value
key++; // Skip null byte
store_length--;
}
if ((cmp=key_part->field->key_cmp(key, key_part->length)) < 0)
- return -1;
+ return -sort_order;
if (cmp > 0)
- return 1;
+ return sort_order;
}
return 0; // Keys are equal
}
@@ -573,6 +574,9 @@ int key_rec_cmp(void *key_p, uchar *first_rec, uchar *second_rec)
/* loop over every key part */
do
{
+ const int GREATER= key_part->key_part_flag & HA_REVERSE_SORT ? -1 : +1;
+ const int LESS= -GREATER;
+
field= key_part->field;
if (key_part->null_bit)
@@ -593,12 +597,12 @@ int key_rec_cmp(void *key_p, uchar *first_rec, uchar *second_rec)
; /* Fall through, no NULL fields */
else
{
- DBUG_RETURN(+1);
+ DBUG_RETURN(GREATER);
}
}
else if (!sec_is_null)
{
- DBUG_RETURN(-1);
+ DBUG_RETURN(LESS);
}
else
goto next_loop; /* Both were NULL */
@@ -612,7 +616,7 @@ int key_rec_cmp(void *key_p, uchar *first_rec, uchar *second_rec)
*/
if ((result= field->cmp_prefix(field->ptr+first_diff, field->ptr+sec_diff,
key_part->length)))
- DBUG_RETURN(result);
+ DBUG_RETURN(result * GREATER);
next_loop:
key_part++;
key_part_num++;
diff --git a/sql/lex.h b/sql/lex.h
index cbf9d9d51b2..4ce88ccc2ee 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -110,6 +110,7 @@ SYMBOL symbols[] = {
{ "CHAIN", SYM(CHAIN_SYM)},
{ "CHANGE", SYM(CHANGE)},
{ "CHANGED", SYM(CHANGED)},
+ { "CHANNEL", SYM(CHANNEL_SYM)},
{ "CHAR", SYM(CHAR_SYM)},
{ "CHARACTER", SYM(CHAR_SYM)},
{ "CHARSET", SYM(CHARSET)},
@@ -567,6 +568,8 @@ SYMBOL symbols[] = {
{ "ROWTYPE", SYM(ROWTYPE_MARIADB_SYM)},
{ "ROW_COUNT", SYM(ROW_COUNT_SYM)},
{ "ROW_FORMAT", SYM(ROW_FORMAT_SYM)},
+ /** sql_function and condition_property_name for GET DIAGNOSTICS */
+ { "ROW_NUMBER", SYM(ROW_NUMBER_SYM)},
{ "RTREE", SYM(RTREE_SYM)},
{ "SAVEPOINT", SYM(SAVEPOINT_SYM)},
{ "SCHEDULE", SYM(SCHEDULE_SYM)},
@@ -781,7 +784,6 @@ SYMBOL sql_functions[] = {
{ "PERCENTILE_CONT", SYM(PERCENTILE_CONT_SYM)},
{ "PERCENTILE_DISC", SYM(PERCENTILE_DISC_SYM)},
{ "RANK", SYM(RANK_SYM)},
- { "ROW_NUMBER", SYM(ROW_NUMBER_SYM)},
{ "SESSION_USER", SYM(USER_SYM)},
{ "STD", SYM(STD_SYM)},
{ "STDDEV", SYM(STD_SYM)},
diff --git a/sql/lock.cc b/sql/lock.cc
index 1099a5c2fb1..0767b787bec 100644
--- a/sql/lock.cc
+++ b/sql/lock.cc
@@ -1,6 +1,6 @@
/*
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
- Copyright (c) 2020, MariaDB
+ Copyright (c) 2020, 2021, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -1141,6 +1141,9 @@ void Global_read_lock::unlock_global_read_lock(THD *thd)
else if (WSREP_NNULL(thd) &&
server_state.state() == Wsrep_server_state::s_synced)
{
+ THD_STAGE_INFO(thd, stage_waiting_flow);
+ WSREP_DEBUG("unlock_global_read_lock: waiting for flow control for %s",
+ wsrep_thd_query(thd));
server_state.resume_and_resync();
wsrep_locked_seqno= WSREP_SEQNO_UNDEFINED;
}
diff --git a/sql/log.cc b/sql/log.cc
index 2dbfa8278a2..c319025e309 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -57,6 +57,7 @@
#include "semisync_master.h"
#include "sp_rcontext.h"
#include "sp_head.h"
+#include "sql_table.h"
#include "wsrep_mysqld.h"
#ifdef WITH_WSREP
@@ -576,13 +577,137 @@ public:
ulong binlog_id;
/* Set if we get an error during commit that must be returned from unlog(). */
bool delayed_error;
-
+ //Will be reset when gtid is written into binlog
+ uchar gtid_flags3;
+ decltype (rpl_gtid::seq_no) sa_seq_no;
private:
binlog_cache_mngr& operator=(const binlog_cache_mngr& info);
binlog_cache_mngr(const binlog_cache_mngr& info);
};
+/**
+ The function handles the first phase of two-phase binlogged ALTER.
+ On master binlogs START ALTER when that is configured to do so.
+ On slave START ALTER gets binlogged and its gtid committed into gtid slave pos
+ table.
+
+ @param thd Thread handle.
+ @param start_alter_id Start Alter identifier or zero.
+ @param[out]
+ partial_alter Is set to true when Start Alter phase is completed.
+ @param if_exists True indicates the binary logging of the query
+ should be done with "if exists" option.
+
+ @return false on success, true on failure
+ @return @c partial_alter set to @c true when START ALTER phase
+ has been completed
+*/
+bool write_bin_log_start_alter(THD *thd, bool& partial_alter,
+ uint64 start_alter_id, bool if_exists)
+{
+#if defined(HAVE_REPLICATION)
+ if (thd->variables.option_bits & OPTION_BIN_TMP_LOG_OFF)
+ return false;
+
+ if (start_alter_id)
+ {
+ if (thd->rgi_slave->get_finish_event_group_called())
+ return false; // can get here through retrying
+
+ DBUG_EXECUTE_IF("at_write_start_alter", {
+ debug_sync_set_action(thd,
+ STRING_WITH_LEN("now wait_for alter_cont"));
+ });
+
+ Master_info *mi= thd->rgi_slave->rli->mi;
+ start_alter_info *info= thd->rgi_slave->sa_info;
+ bool is_shutdown= false;
+
+ info->sa_seq_no= start_alter_id;
+ info->domain_id= thd->variables.gtid_domain_id;
+ mysql_mutex_lock(&mi->start_alter_list_lock);
+ // possible stop-slave's marking of the whole alter state list is checked
+ is_shutdown= mi->is_shutdown;
+ mi->start_alter_list.push_back(info, &mi->mem_root);
+ mysql_mutex_unlock(&mi->start_alter_list_lock);
+ info->state= start_alter_state::REGISTERED;
+ thd->rgi_slave->commit_orderer.wait_for_prior_commit(thd);
+ thd->rgi_slave->start_alter_ev->update_pos(thd->rgi_slave);
+ if (mysql_bin_log.is_open())
+ {
+ Write_log_with_flags wlwf (thd, Gtid_log_event::FL_START_ALTER_E1);
+ if (write_bin_log(thd, true, thd->query(), thd->query_length()))
+ {
+ DBUG_ASSERT(thd->is_error());
+ return true;
+ }
+ }
+ thd->rgi_slave->mark_start_commit();
+ thd->wakeup_subsequent_commits(0);
+ thd->rgi_slave->finish_start_alter_event_group();
+
+ if (is_shutdown)
+ {
+ /* SA exists abruptly and will notify any CA|RA waiter. */
+ mysql_mutex_lock(&mi->start_alter_lock);
+ /*
+ If there is (or will be) unlikely any CA it will execute
+ the whole query before to stop itself.
+ */
+ info->direct_commit_alter= true;
+ info->state= start_alter_state::ROLLBACK_ALTER;
+ mysql_mutex_unlock(&mi->start_alter_lock);
+
+ return true;
+ }
+
+ return false;
+ }
+#endif
+
+#ifndef WITH_WSREP
+ rpl_group_info *rgi= thd->rgi_slave ? thd->rgi_slave : thd->rgi_fake;
+#else
+ rpl_group_info *rgi= thd->slave_thread ? thd->rgi_slave :
+ WSREP(thd) ? (thd->wsrep_rgi ? thd->wsrep_rgi : thd->rgi_fake) :
+ thd->rgi_fake;
+#endif
+
+ if (!rgi && thd->variables.binlog_alter_two_phase)
+ {
+ /* slave applier can handle here only regular ALTER */
+ DBUG_ASSERT(!rgi || !(rgi->gtid_ev_flags_extra &
+ (Gtid_log_event::FL_START_ALTER_E1 |
+ Gtid_log_event::FL_COMMIT_ALTER_E1 |
+ Gtid_log_event::FL_ROLLBACK_ALTER_E1)));
+
+ /*
+ After logging binlog state stays flagged with SA flags3 an seq_no.
+ The state is not reset after write_bin_log() is done which is
+ deferred for the second logging phase.
+ */
+ thd->set_binlog_flags_for_alter(Gtid_log_event::FL_START_ALTER_E1);
+ if(write_bin_log_with_if_exists(thd, false, false, if_exists, false))
+ {
+ DBUG_ASSERT(thd->is_error());
+
+ thd->set_binlog_flags_for_alter(0);
+ return true;
+ }
+ partial_alter= true;
+ }
+ else if (rgi && rgi->direct_commit_alter)
+ {
+ DBUG_ASSERT(rgi->gtid_ev_flags_extra &
+ Gtid_log_event::FL_COMMIT_ALTER_E1);
+
+ partial_alter= true;
+ }
+
+ return false;
+}
+
bool LOGGER::is_log_table_enabled(uint log_table_type)
{
switch (log_table_type) {
@@ -2665,12 +2790,11 @@ static void setup_windows_event_source()
static int find_uniq_filename(char *name, ulong min_log_number_to_use,
ulong *last_used_log_number)
{
- uint i;
char buff[FN_REFLEN], ext_buf[FN_REFLEN];
struct st_my_dir *dir_info;
struct fileinfo *file_info;
ulong max_found= 0, next= 0, number= 0;
- size_t buf_length, length;
+ size_t i, buf_length, length;
char *start, *end;
int error= 0;
DBUG_ENTER("find_uniq_filename");
@@ -3001,7 +3125,7 @@ int MYSQL_BIN_LOG::generate_new_name(char *new_name, const char *log_name,
fn_format(new_name, log_name, mysql_data_home, "", 4);
if (!fn_ext(log_name)[0])
{
- if (DBUG_EVALUATE_IF("binlog_inject_new_name_error", TRUE, FALSE) ||
+ if (DBUG_IF("binlog_inject_new_name_error") ||
unlikely(find_uniq_filename(new_name, next_log_number,
&last_used_log_number)))
{
@@ -3572,7 +3696,7 @@ bool MYSQL_BIN_LOG::open_index_file(const char *index_file_name_arg,
mysql_file_seek(index_file_nr, 0L, MY_SEEK_END, MYF(0)),
0, MYF(MY_WME | MY_WAIT_IF_FULL),
m_key_file_log_index_cache) ||
- DBUG_EVALUATE_IF("fault_injection_openning_index", 1, 0))
+ DBUG_IF("fault_injection_openning_index"))
{
/*
TODO: all operations creating/deleting the index file or a log, should
@@ -3598,7 +3722,7 @@ bool MYSQL_BIN_LOG::open_index_file(const char *index_file_name_arg,
open_purge_index_file(FALSE) ||
purge_index_entry(NULL, NULL, need_mutex) ||
close_purge_index_file() ||
- DBUG_EVALUATE_IF("fault_injection_recovering_index", 1, 0))
+ DBUG_IF("fault_injection_recovering_index"))
{
sql_print_error("MYSQL_BIN_LOG::open_index_file failed to sync the index "
"file.");
@@ -3667,7 +3791,7 @@ bool MYSQL_BIN_LOG::open(const char *log_name,
if (open_purge_index_file(TRUE) ||
register_create_index_entry(log_file_name) ||
sync_purge_index_file() ||
- DBUG_EVALUATE_IF("fault_injection_registering_index", 1, 0))
+ DBUG_IF("fault_injection_registering_index"))
{
/**
TODO:
@@ -3949,7 +4073,7 @@ bool MYSQL_BIN_LOG::open(const char *log_name,
As this is a new log file, we write the file name to the index
file. As every time we write to the index file, we sync it.
*/
- if (DBUG_EVALUATE_IF("fault_injection_updating_index", 1, 0) ||
+ if (DBUG_IF("fault_injection_updating_index") ||
my_b_write(&index_file, (uchar*) log_file_name,
strlen(log_file_name)) ||
my_b_write(&index_file, (uchar*) "\n", 1) ||
@@ -5362,8 +5486,8 @@ int MYSQL_BIN_LOG::new_file_impl()
r.checksum_alg= relay_log_checksum_alg;
DBUG_ASSERT(!is_relay_log ||
relay_log_checksum_alg != BINLOG_CHECKSUM_ALG_UNDEF);
- if (DBUG_EVALUATE_IF("fault_injection_new_file_rotate_event",
- (error= close_on_error= TRUE), FALSE) ||
+ if ((DBUG_IF("fault_injection_new_file_rotate_event") &&
+ (error= close_on_error= TRUE)) ||
(error= write_event(&r)))
{
DBUG_EXECUTE_IF("fault_injection_new_file_rotate_event", errno= 2;);
@@ -5799,6 +5923,39 @@ binlog_cache_mngr *THD::binlog_setup_trx_data()
DBUG_RETURN(cache_mngr);
}
+
+/*
+ Two phase logged ALTER getter and setter methods.
+*/
+uchar THD::get_binlog_flags_for_alter()
+{
+ return mysql_bin_log.is_open() ? binlog_setup_trx_data()->gtid_flags3 : 0;
+}
+
+void THD::set_binlog_flags_for_alter(uchar flags)
+{
+ if (mysql_bin_log.is_open())
+ {
+ // SA must find the flag set empty
+ DBUG_ASSERT(flags != Gtid_log_event::FL_START_ALTER_E1 ||
+ binlog_setup_trx_data()->gtid_flags3 == 0);
+
+ binlog_setup_trx_data()->gtid_flags3= flags;
+ }
+}
+
+uint64 THD::get_binlog_start_alter_seq_no()
+{
+ return mysql_bin_log.is_open() ? binlog_setup_trx_data()->sa_seq_no : 0;
+}
+
+void THD::set_binlog_start_alter_seq_no(uint64 s_no)
+{
+ if (mysql_bin_log.is_open())
+ binlog_setup_trx_data()->sa_seq_no= s_no;
+}
+
+
/*
Function to start a statement and optionally a transaction for the
binary log.
@@ -6329,6 +6486,8 @@ MYSQL_BIN_LOG::write_gtid_event(THD *thd, bool standalone,
DBUG_RETURN(true);
thd->set_last_commit_gtid(gtid);
+ if (thd->get_binlog_flags_for_alter() & Gtid_log_event::FL_START_ALTER_E1)
+ thd->set_binlog_start_alter_seq_no(gtid.seq_no);
Gtid_log_event gtid_event(thd, seq_no, domain_id, standalone,
LOG_EVENT_SUPPRESS_USE_F, is_transactional,
@@ -6776,7 +6935,7 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info, my_bool *with_annotate)
Write the event.
*/
if (write_event(event_info, cache_data, file) ||
- DBUG_EVALUATE_IF("injecting_fault_writing", 1, 0))
+ DBUG_IF("injecting_fault_writing"))
goto err;
error= 0;
@@ -7558,9 +7717,9 @@ bool MYSQL_BIN_LOG::write_incident(THD *thd)
if (likely(is_open()))
{
prev_binlog_id= current_binlog_id;
- if (likely(
- !(error= DBUG_EVALUATE_IF("incident_event_write_error", 1,
- write_incident_already_locked(thd)))) &&
+ if (likely(!(error= DBUG_IF("incident_event_write_error")
+ ? 1
+ : write_incident_already_locked(thd))) &&
likely(!(error= flush_and_sync(0))))
{
update_binlog_end_pos();
@@ -8553,7 +8712,7 @@ MYSQL_BIN_LOG::trx_group_commit_leader(group_commit_entry *leader)
DEBUG_SYNC(leader->thd, "commit_loop_entry_commit_ordered");
++num_commits;
if (current->cache_mngr->using_xa && likely(!current->error) &&
- DBUG_EVALUATE_IF("skip_commit_ordered", 0, 1))
+ !DBUG_IF("skip_commit_ordered"))
{
mysql_mutex_lock(&current->thd->LOCK_thd_data);
run_commit_ordered(current->thd, current->all);
diff --git a/sql/log.h b/sql/log.h
index 7b62a1a5477..c20f0fe5a57 100644
--- a/sql/log.h
+++ b/sql/log.h
@@ -1264,5 +1264,8 @@ get_gtid_list_event(IO_CACHE *cache, Gtid_list_log_event **out_gtid_list);
int binlog_commit(THD *thd, bool all, bool is_ro_1pc= false);
int binlog_commit_by_xid(handlerton *hton, XID *xid);
int binlog_rollback_by_xid(handlerton *hton, XID *xid);
+bool write_bin_log_start_alter(THD *thd, bool& partial_alter,
+ uint64 start_alter_id, bool log_if_exists);
+
#endif /* LOG_H */
diff --git a/sql/log_event.cc b/sql/log_event.cc
index 15f06861928..932a8d1588f 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -1378,6 +1378,7 @@ code_name(int code)
case Q_MASTER_DATA_WRITTEN_CODE: return "Q_MASTER_DATA_WRITTEN_CODE";
case Q_HRNOW: return "Q_HRNOW";
case Q_XID: return "XID";
+ case Q_GTID_FLAGS3: return "Q_GTID_FLAGS3";
}
sprintf(buf, "CODE#%d", code);
return buf;
@@ -1426,7 +1427,8 @@ Query_log_event::Query_log_event(const uchar *buf, uint event_len,
flags2_inited(0), sql_mode_inited(0), charset_inited(0), flags2(0),
auto_increment_increment(1), auto_increment_offset(1),
time_zone_len(0), lc_time_names_number(0), charset_database_number(0),
- table_map_for_update(0), xid(0), master_data_written(0)
+ table_map_for_update(0), xid(0), master_data_written(0), gtid_flags_extra(0),
+ sa_seq_no(0)
{
ulong data_len;
uint32 tmp;
@@ -1442,28 +1444,28 @@ Query_log_event::Query_log_event(const uchar *buf, uint event_len,
post_header_len= description_event->post_header_len[event_type-1];
DBUG_PRINT("info",("event_len: %u common_header_len: %d post_header_len: %d",
event_len, common_header_len, post_header_len));
-
+
/*
We test if the event's length is sensible, and if so we compute data_len.
We cannot rely on QUERY_HEADER_LEN here as it would not be format-tolerant.
We use QUERY_HEADER_MINIMAL_LEN which is the same for 3.23, 4.0 & 5.0.
*/
if (event_len < (uint)(common_header_len + post_header_len))
- DBUG_VOID_RETURN;
+ DBUG_VOID_RETURN;
data_len= event_len - (common_header_len + post_header_len);
buf+= common_header_len;
-
- thread_id= slave_proxy_id= uint4korr(buf + Q_THREAD_ID_OFFSET);
- exec_time= uint4korr(buf + Q_EXEC_TIME_OFFSET);
- db_len= buf[Q_DB_LEN_OFFSET]; // TODO: add a check of all *_len vars
- error_code= uint2korr(buf + Q_ERR_CODE_OFFSET);
+
+ thread_id = slave_proxy_id = uint4korr(buf + Q_THREAD_ID_OFFSET);
+ exec_time = uint4korr(buf + Q_EXEC_TIME_OFFSET);
+ db_len = (uchar)buf[Q_DB_LEN_OFFSET]; // TODO: add a check of all *_len vars
+ error_code = uint2korr(buf + Q_ERR_CODE_OFFSET);
/*
5.0 format starts here.
Depending on the format, we may or not have affected/warnings etc
The remnent post-header to be parsed has length:
*/
- tmp= post_header_len - QUERY_HEADER_MINIMAL_LEN;
+ tmp= post_header_len - QUERY_HEADER_MINIMAL_LEN;
if (tmp)
{
status_vars_len= uint2korr(buf + Q_STATUS_VARS_LEN_OFFSET);
@@ -1610,13 +1612,26 @@ Query_log_event::Query_log_event(const uchar *buf, uint event_len,
pos+= 3;
break;
}
- case Q_XID:
+ case Q_XID:
{
CHECK_SPACE(pos, end, 8);
xid= uint8korr(pos);
pos+= 8;
break;
}
+ case Q_GTID_FLAGS3:
+ {
+ CHECK_SPACE(pos, end, 1);
+ gtid_flags_extra= *pos++;
+ if (gtid_flags_extra & (Gtid_log_event::FL_COMMIT_ALTER_E1 |
+ Gtid_log_event::FL_ROLLBACK_ALTER_E1))
+ {
+ CHECK_SPACE(pos, end, 8);
+ sa_seq_no = uint8korr(pos);
+ pos+= 8;
+ }
+ break;
+ }
default:
/* That's why you must write status vars in growing order of code */
DBUG_PRINT("info",("Query_log_event has unknown status vars (first has\
@@ -2635,7 +2650,7 @@ Gtid_log_event::Gtid_log_event(const uchar *buf, uint event_len,
extra engines flags presence is identifed by non-zero byte value
at this point
*/
- if (flags_extra & FL_EXTRA_MULTI_ENGINE)
+ if (flags_extra & FL_EXTRA_MULTI_ENGINE_E1)
{
DBUG_ASSERT(static_cast<uint>(buf - buf_0) < event_len);
@@ -2643,6 +2658,11 @@ Gtid_log_event::Gtid_log_event(const uchar *buf, uint event_len,
DBUG_ASSERT(extra_engines > 0);
}
+ if (flags_extra & (FL_COMMIT_ALTER_E1 | FL_ROLLBACK_ALTER_E1))
+ {
+ sa_seq_no= uint8korr(buf);
+ buf+= 8;
+ }
}
/*
the strict '<' part of the assert corresponds to extra zero-padded
@@ -2659,6 +2679,20 @@ Gtid_log_event::Gtid_log_event(const uchar *buf, uint event_len,
buf_0[event_len - 1] == 0);
}
+int compare_glle_gtids(const void * _gtid1, const void *_gtid2)
+{
+ rpl_gtid *gtid1= (rpl_gtid *) _gtid1;
+ rpl_gtid *gtid2= (rpl_gtid *) _gtid2;
+
+ int ret;
+ if (*gtid1 < *gtid2)
+ ret= -1;
+ else if (*gtid1 > *gtid2)
+ ret= 1;
+ else
+ ret= 0;
+ return ret;
+}
/* GTID list. */
@@ -3347,8 +3381,7 @@ Rows_log_event::Rows_log_event(const uchar *buf, uint event_len,
/* if my_bitmap_init fails, caught in is_valid() */
if (likely(!my_bitmap_init(&m_cols,
m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL,
- m_width,
- false)))
+ m_width)))
{
DBUG_PRINT("debug", ("Reading from %p", ptr_after_width));
memcpy(m_cols.bitmap, ptr_after_width, (m_width + 7) / 8);
@@ -3372,8 +3405,7 @@ Rows_log_event::Rows_log_event(const uchar *buf, uint event_len,
/* if my_bitmap_init fails, caught in is_valid() */
if (likely(!my_bitmap_init(&m_cols_ai,
m_width <= sizeof(m_bitbuf_ai)*8 ? m_bitbuf_ai : NULL,
- m_width,
- false)))
+ m_width)))
{
DBUG_PRINT("debug", ("Reading from %p", ptr_after_width));
memcpy(m_cols_ai.bitmap, ptr_after_width, (m_width + 7) / 8);
diff --git a/sql/log_event.h b/sql/log_event.h
index 6203c57ead2..97a18d52098 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -240,7 +240,8 @@ class String;
1 + 8 /* type, table_map_for_update */ + \
1 + 4 /* type, master_data_written */ + \
1 + 3 /* type, sec_part of NOW() */ + \
- 1 + 16 + 1 + 60/* type, user_len, user, host_len, host */)
+ 1 + 16 + 1 + 60/* type, user_len, user, host_len, host */ + \
+ 1 + 2 + 8 /* type, flags3, seq_no */)
#define MAX_LOG_EVENT_HEADER ( /* in order of Query_log_event::write */ \
LOG_EVENT_HEADER_LEN + /* write_header */ \
QUERY_HEADER_LEN + /* write_data */ \
@@ -321,6 +322,7 @@ class String;
#define Q_HRNOW 128
#define Q_XID 129
+#define Q_GTID_FLAGS3 130
/* Intvar event post-header */
/* Intvar event data */
@@ -903,6 +905,20 @@ typedef struct st_print_event_info
IO_CACHE review_sql_cache;
#endif
FILE *file;
+
+
+
+ /*
+ Used to include the events within a GTID start/stop boundary
+ */
+ my_bool m_is_event_group_active;
+
+ /*
+ Tracks whether or not output events must be explicitly activated in order
+ to be printed
+ */
+ my_bool m_is_event_group_filtering_enabled;
+
st_print_event_info();
~st_print_event_info() {
@@ -925,6 +941,40 @@ typedef struct st_print_event_info
copy_event_cache_to_file_and_reinit(&body_cache, file);
fflush(file);
}
+
+ /*
+ Notify that all events part of the current group should be printed
+ */
+ void activate_current_event_group()
+ {
+ m_is_event_group_active= TRUE;
+ }
+ void deactivate_current_event_group()
+ {
+ m_is_event_group_active= FALSE;
+ }
+
+ /*
+ Used for displaying events part of an event group.
+ Returns TRUE when both event group filtering is enabled and the current
+ event group should be displayed, OR if event group filtering is
+ disabled. More specifically, if filtering is disabled, all events
+ should be shown.
+ Returns FALSE when event group filtering is enabled and the current event
+ group is filtered out.
+ */
+ my_bool is_event_group_active()
+ {
+ return m_is_event_group_filtering_enabled ? m_is_event_group_active : TRUE;
+ }
+
+ /*
+ Notify that events must be explicitly activated in order to be printed
+ */
+ void enable_event_group_filtering()
+ {
+ m_is_event_group_filtering_enabled= TRUE;
+ }
} PRINT_EVENT_INFO;
#endif
@@ -2128,6 +2178,12 @@ public:
Q_MASTER_DATA_WRITTEN_CODE to the slave's server binlog.
*/
uint32 master_data_written;
+ /*
+ A copy of Gtid event's extra flags that is relevant for two-phase
+ logged ALTER.
+ */
+ uchar gtid_flags_extra;
+ decltype(rpl_gtid::seq_no) sa_seq_no; /* data part for CA/RA flags */
#ifdef MYSQL_SERVER
@@ -2139,6 +2195,7 @@ public:
#endif /* HAVE_REPLICATION */
#else
bool print_query_header(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info);
+ bool print_verbose(IO_CACHE* cache, PRINT_EVENT_INFO* print_event_info);
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif
@@ -2152,8 +2209,10 @@ public:
my_free(data_buf);
}
Log_event_type get_type_code() { return QUERY_EVENT; }
- static int dummy_event(String *packet, ulong ev_offset, enum enum_binlog_checksum_alg checksum_alg);
- static int begin_event(String *packet, ulong ev_offset, enum enum_binlog_checksum_alg checksum_alg);
+ static int dummy_event(String *packet, ulong ev_offset,
+ enum enum_binlog_checksum_alg checksum_alg);
+ static int begin_event(String *packet, ulong ev_offset,
+ enum enum_binlog_checksum_alg checksum_alg);
#ifdef MYSQL_SERVER
bool write();
virtual bool write_post_header_for_derived() { return FALSE; }
@@ -2179,6 +2238,9 @@ public: /* !!! Public in this patch to allow old usage */
size_t event_len,
enum enum_binlog_checksum_alg
checksum_alg);
+ int handle_split_alter_query_log_event(rpl_group_info *rgi,
+ bool &skip_error_check);
+
#endif /* HAVE_REPLICATION */
/*
If true, the event always be applied by slave SQL thread or be printed by
@@ -3587,13 +3649,19 @@ public:
uint64 seq_no;
uint64 commit_id;
uint32 domain_id;
+ uint64 sa_seq_no; // start alter identifier for CA/RA
#ifdef MYSQL_SERVER
event_xid_t xid;
#else
event_mysql_xid_t xid;
#endif
uchar flags2;
- uint flags_extra; // more flags area placed after the regular flags2's one
+ /*
+ More flags area placed after the regular flags2's area. The type
+ is declared to be in agreement with Query_log_event's member that
+ may copy the flags_extra value.
+ */
+ decltype(Query_log_event::gtid_flags_extra) flags_extra;
/*
Number of engine participants in transaction minus 1.
When zero the event does not contain that information.
@@ -3631,14 +3699,19 @@ public:
/* FL_"COMMITTED or ROLLED-BACK"_XA is set for XA transaction. */
static const uchar FL_COMPLETED_XA= 128;
- /* Flags_extra. */
-
/*
- FL_EXTRA_MULTI_ENGINE is set for event group comprising a transaction
+ flags_extra 's bit values.
+ _E1 suffix below stands for Extra to infer the extra flags,
+ their "1st" generation (more *generations* can come when necessary).
+
+ FL_EXTRA_MULTI_ENGINE_E1 is set for event group comprising a transaction
involving multiple storage engines. No flag and extra data are added
to the event when the transaction involves only one engine.
*/
- static const uchar FL_EXTRA_MULTI_ENGINE= 1;
+ static const uchar FL_EXTRA_MULTI_ENGINE_E1= 1;
+ static const uchar FL_START_ALTER_E1= 2;
+ static const uchar FL_COMMIT_ALTER_E1= 4;
+ static const uchar FL_ROLLBACK_ALTER_E1= 8;
#ifdef MYSQL_SERVER
Gtid_log_event(THD *thd_arg, uint64 seq_no, uint32 domain_id, bool standalone,
@@ -5808,4 +5881,12 @@ int row_log_event_uncompress(const Format_description_log_event
uchar* buf, ulong buf_size, bool *is_malloc,
uchar **dst, ulong *newlen);
+bool is_parallel_retry_error(rpl_group_info *rgi, int err);
+
+/*
+ Compares two GTIDs to facilitate sorting a GTID list log event by domain id
+ (ascending) and sequence number (ascending)
+*/
+int compare_glle_gtids(const void * _gtid1, const void *_gtid2);
+
#endif /* _log_event_h */
diff --git a/sql/log_event_client.cc b/sql/log_event_client.cc
index 51667f4fcce..03e319076c7 100644
--- a/sql/log_event_client.cc
+++ b/sql/log_event_client.cc
@@ -17,6 +17,7 @@
*/
+#include "log_event.h"
#ifndef MYSQL_CLIENT
#error MYSQL_CLIENT must be defined here
#endif
@@ -1191,7 +1192,7 @@ void Rows_log_event::change_to_flashback_event(PRINT_EVENT_INFO *print_event_inf
}
/* Copying rows from the end to the begining into event */
- for (uint i= rows_arr.elements; i > 0; --i)
+ for (size_t i= rows_arr.elements; i > 0; --i)
{
LEX_STRING *one_row= dynamic_element(&rows_arr, i - 1, LEX_STRING*);
@@ -2015,6 +2016,19 @@ err:
return 1;
}
+bool Query_log_event::print_verbose(IO_CACHE* cache, PRINT_EVENT_INFO* print_event_info)
+{
+ if (my_b_printf(cache, "### ") ||
+ my_b_write(cache, (uchar *) query, q_len) ||
+ my_b_printf(cache, "\n"))
+ {
+ goto err;
+ }
+ return 0;
+
+err:
+ return 1;
+}
bool Query_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
{
@@ -2030,9 +2044,42 @@ bool Query_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
goto err;
if (!is_flashback)
{
- if (my_b_write(&cache, (uchar*) query, q_len) ||
- my_b_printf(&cache, "\n%s\n", print_event_info->delimiter))
- goto err;
+ if (gtid_flags_extra & (Gtid_log_event::FL_START_ALTER_E1 |
+ Gtid_log_event::FL_COMMIT_ALTER_E1 |
+ Gtid_log_event::FL_ROLLBACK_ALTER_E1))
+ {
+ bool do_print_encoded=
+ print_event_info->base64_output_mode != BASE64_OUTPUT_NEVER &&
+ print_event_info->base64_output_mode != BASE64_OUTPUT_DECODE_ROWS &&
+ !print_event_info->short_form;
+ bool comment_mode= do_print_encoded &&
+ gtid_flags_extra & (Gtid_log_event::FL_START_ALTER_E1 |
+ Gtid_log_event::FL_ROLLBACK_ALTER_E1);
+
+ if(comment_mode)
+ my_b_printf(&cache, "/*!100600 ");
+ if (do_print_encoded)
+ my_b_printf(&cache, "BINLOG '\n");
+ if (print_base64(&cache, print_event_info, do_print_encoded))
+ goto err;
+ if (do_print_encoded)
+ {
+ if(comment_mode)
+ my_b_printf(&cache, "' */%s\n", print_event_info->delimiter);
+ else
+ my_b_printf(&cache, "'%s\n", print_event_info->delimiter);
+ }
+ if (print_event_info->verbose && print_verbose(&cache, print_event_info))
+ {
+ goto err;
+ }
+ }
+ else
+ {
+ if (my_b_write(&cache, (uchar*) query, q_len) ||
+ my_b_printf(&cache, "\n%s\n", print_event_info->delimiter))
+ goto err;
+ }
}
else // is_flashback == 1
{
@@ -2305,6 +2352,8 @@ Gtid_list_log_event::print(FILE *file, PRINT_EVENT_INFO *print_event_info)
char buf[21];
uint32 i;
+ qsort(list, count, sizeof(rpl_gtid), compare_glle_gtids);
+
if (print_header(&cache, print_event_info, FALSE) ||
my_b_printf(&cache, "\tGtid list ["))
goto err;
@@ -3801,6 +3850,8 @@ st_print_event_info::st_print_event_info()
printed_fd_event=FALSE;
file= 0;
base64_output_mode=BASE64_OUTPUT_UNSPEC;
+ m_is_event_group_active= TRUE;
+ m_is_event_group_filtering_enabled= FALSE;
open_cached_file(&head_cache, NULL, NULL, 0, flags);
open_cached_file(&body_cache, NULL, NULL, 0, flags);
open_cached_file(&tail_cache, NULL, NULL, 0, flags);
@@ -3864,6 +3915,15 @@ Gtid_log_event::print(FILE *file, PRINT_EVENT_INFO *print_event_info)
if (flags2 & FL_WAITED)
if (my_b_write_string(&cache, " waited"))
goto err;
+ if (flags_extra & FL_START_ALTER_E1)
+ if (my_b_write_string(&cache, " START ALTER"))
+ goto err;
+ if (flags_extra & FL_COMMIT_ALTER_E1)
+ if (my_b_printf(&cache, " COMMIT ALTER id= %lu", sa_seq_no))
+ goto err;
+ if (flags_extra & FL_ROLLBACK_ALTER_E1)
+ if (my_b_printf(&cache, " ROLLBACK ALTER id= %lu", sa_seq_no))
+ goto err;
if (my_b_printf(&cache, "\n"))
goto err;
diff --git a/sql/log_event_old.cc b/sql/log_event_old.cc
index 4e6b9e3f1c8..1990103598e 100644
--- a/sql/log_event_old.cc
+++ b/sql/log_event_old.cc
@@ -1156,8 +1156,7 @@ Old_rows_log_event::Old_rows_log_event(THD *thd_arg, TABLE *tbl_arg, ulong tid,
/* if my_bitmap_init fails, caught in is_valid() */
if (likely(!my_bitmap_init(&m_cols,
m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL,
- m_width,
- false)))
+ m_width)))
{
/* Cols can be zero if this is a dummy binrows event */
if (likely(cols != NULL))
@@ -1232,8 +1231,7 @@ Old_rows_log_event::Old_rows_log_event(const uchar *buf, uint event_len,
/* if my_bitmap_init fails, caught in is_valid() */
if (likely(!my_bitmap_init(&m_cols,
m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL,
- m_width,
- false)))
+ m_width)))
{
DBUG_PRINT("debug", ("Reading from %p", ptr_after_width));
memcpy(m_cols.bitmap, ptr_after_width, (m_width + 7) / 8);
diff --git a/sql/log_event_server.cc b/sql/log_event_server.cc
index 66a39cc9e66..8d74f11fdef 100644
--- a/sql/log_event_server.cc
+++ b/sql/log_event_server.cc
@@ -52,6 +52,7 @@
#include "compat56.h"
#include "wsrep_mysqld.h"
#include "sql_insert.h"
+#include "sql_table.h"
#include <my_bitmap.h>
#include "rpl_utility.h"
@@ -139,7 +140,7 @@ static const char *HA_ERR(int i)
deadlocks; such errors are handled automatically by rolling back re-trying
the transactions, so should not pollute the error log.
*/
-static bool
+bool
is_parallel_retry_error(rpl_group_info *rgi, int err)
{
if (!rgi->is_parallel_exec)
@@ -471,7 +472,7 @@ static void cleanup_load_tmpdir(LEX_CSTRING *connection_name)
{
MY_DIR *dirp;
FILEINFO *file;
- uint i;
+ size_t i;
char dir[FN_REFLEN], fname[FN_REFLEN];
char prefbuf[31 + MAX_CONNECTION_NAME* MAX_FILENAME_MBWIDTH + 1];
DBUG_ENTER("cleanup_load_tmpdir");
@@ -492,7 +493,7 @@ static void cleanup_load_tmpdir(LEX_CSTRING *connection_name)
load_data_tmp_prefix(prefbuf, connection_name);
DBUG_PRINT("enter", ("dir: '%s' prefix: '%s'", dir, prefbuf));
- for (i=0 ; i < (uint)dirp->number_of_files; i++)
+ for (i=0 ; i < dirp->number_of_files; i++)
{
file=dirp->dir_entry+i;
if (is_prefix(file->name, prefbuf))
@@ -1304,11 +1305,25 @@ bool Query_log_event::write()
start+= 8;
}
+ if (gtid_flags_extra)
+ {
+ *start++= Q_GTID_FLAGS3;
+ *start++= gtid_flags_extra;
+ if (gtid_flags_extra &
+ (Gtid_log_event::FL_COMMIT_ALTER_E1 |
+ Gtid_log_event::FL_ROLLBACK_ALTER_E1))
+ {
+ int8store(start, sa_seq_no);
+ start+= 8;
+ }
+ }
+
+
/*
NOTE: When adding new status vars, please don't forget to update
the MAX_SIZE_LOG_EVENT_STATUS in log_event.h and update the function
code_name() in this file.
-
+
Here there could be code like
if (command-line-option-which-says-"log_this_variable" && inited)
{
@@ -1416,7 +1431,9 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
lc_time_names_number(thd_arg->variables.lc_time_names->number),
charset_database_number(0),
table_map_for_update((ulonglong)thd_arg->table_map_for_update),
- master_data_written(0)
+ master_data_written(0),
+ gtid_flags_extra(thd_arg->get_binlog_flags_for_alter()),
+ sa_seq_no(0)
{
/* status_vars_len is set just before writing the event */
@@ -1552,11 +1569,15 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
use_cache= trx_cache= TRUE;
break;
default:
- use_cache= sqlcom_can_generate_row_events(thd);
+ use_cache= (gtid_flags_extra) ? false : sqlcom_can_generate_row_events(thd);
break;
}
}
+ if (gtid_flags_extra & (Gtid_log_event::FL_COMMIT_ALTER_E1 |
+ Gtid_log_event::FL_ROLLBACK_ALTER_E1))
+ sa_seq_no= thd_arg->get_binlog_start_alter_seq_no();
+
if (!use_cache || direct)
{
cache_type= Log_event::EVENT_NO_CACHE;
@@ -1628,6 +1649,223 @@ bool test_if_equal_repl_errors(int expected_error, int actual_error)
}
+static start_alter_info *get_new_start_alter_info(THD *thd)
+{
+ /*
+ Why on global memory ?- So that process_commit/rollback_alter should not get
+ error when spawned threads exits too early.
+ */
+ start_alter_info *info;
+ if (!(info= (start_alter_info *)my_malloc(PSI_INSTRUMENT_ME,
+ sizeof(start_alter_info), MYF(MY_WME))))
+ {
+ sql_print_error("Failed to allocate memory for ddl log free list");
+ return 0;
+ }
+ info->sa_seq_no= 0;
+ info->domain_id= 0;
+ info->direct_commit_alter= false;
+ info->state= start_alter_state::INVALID;
+ mysql_cond_init(0, &info->start_alter_cond, NULL);
+ info->error= 0;
+
+ return info;
+}
+
+
+/*
+ Perform necessary actions for two-phase-logged ALTER parts, to
+ return
+
+ 0 when the event's query proceeds normal parsing and execution
+ 1 when the event skips parsing and execution
+ -1 as error.
+*/
+int Query_log_event::handle_split_alter_query_log_event(rpl_group_info *rgi,
+ bool &skip_error_check)
+{
+ int rc= 0;
+
+ rgi->gtid_ev_flags_extra= gtid_flags_extra;
+ if (gtid_flags_extra & Gtid_log_event::FL_START_ALTER_E1)
+ {
+ //No Slave, Normal Slave, Start Alter under Worker 1 will simple binlog and exit
+ if(!rgi->rpt || rgi->reserved_start_alter_thread || WSREP(thd))
+ {
+ rc= 1;
+ /*
+ We will just write the binlog and move to next event , because COMMIT
+ Alter will take care of actual work
+ */
+ rgi->reserved_start_alter_thread= false;
+ thd->lex->sql_command= SQLCOM_ALTER_TABLE;
+ Write_log_with_flags wlwf(thd, Gtid_log_event::FL_START_ALTER_E1,
+ true /* wsrep to isolation end */);
+#ifdef WITH_WSREP
+ if (WSREP(thd) && wsrep_thd_is_local(thd) &&
+ // no need to supply other than db in this case
+ wsrep_to_isolation_begin(thd, db, NULL,NULL,NULL,NULL,NULL))
+ return -1;
+#endif
+ if (write_bin_log(thd, false, thd->query(), thd->query_length()))
+ return -1;
+
+ my_ok(thd);
+ return rc;
+ }
+ if (!rgi->sa_info)
+ rgi->sa_info= get_new_start_alter_info(thd);
+ else
+ {
+ /* Not send Start-Alter into query execution when it's to rollback */
+ mysql_mutex_lock(&rgi->rli->mi->start_alter_lock);
+ if (rgi->sa_info->state == start_alter_state::ROLLBACK_ALTER)
+ mysql_cond_broadcast(&rgi->sa_info->start_alter_cond);
+ mysql_mutex_unlock(&rgi->rli->mi->start_alter_lock);
+ }
+
+ return rc;
+ }
+
+ bool is_CA= (gtid_flags_extra & Gtid_log_event::FL_COMMIT_ALTER_E1) ? true : false;
+ if (is_CA)
+ {
+ DBUG_EXECUTE_IF("rpl_slave_stop_CA_before_binlog",
+ {
+ // the awake comes from STOP-SLAVE running driver (sql) thread
+ debug_sync_set_action(thd,
+ STRING_WITH_LEN("now WAIT_FOR proceed_CA_1"));
+ });
+ }
+ start_alter_info *info=NULL;
+ Master_info *mi= NULL;
+
+ rgi->gtid_ev_sa_seq_no= sa_seq_no;
+ // is set for both the direct execution and the write to binlog
+ thd->set_binlog_start_alter_seq_no(sa_seq_no);
+ mi= rgi->rli->mi;
+ mysql_mutex_lock(&mi->start_alter_list_lock);
+ {
+ List_iterator<start_alter_info> info_iterator(mi->start_alter_list);
+ while ((info= info_iterator++))
+ {
+ if(info->sa_seq_no == rgi->gtid_ev_sa_seq_no &&
+ info->domain_id == rgi->current_gtid.domain_id)
+ {
+ info_iterator.remove();
+ break;
+ }
+ }
+ }
+ mysql_mutex_unlock(&mi->start_alter_list_lock);
+
+ if (!info)
+ {
+ if (is_CA)
+ {
+ /*
+ error handeling, direct_commit_alter is turned on, so that we dont
+ wait for master reply in mysql_alter_table (in wait_for_master)
+ */
+ rgi->direct_commit_alter= true;
+#ifdef WITH_WSREP
+ if (WSREP(thd))
+ thd->set_binlog_flags_for_alter(Gtid_log_event::FL_COMMIT_ALTER_E1);
+#endif
+ goto cleanup;
+ }
+ else
+ {
+ //Just write the binlog because there is nothing to be done
+ goto write_binlog;
+ }
+ }
+
+ mysql_mutex_lock(&mi->start_alter_lock);
+ if (info->state != start_alter_state::COMPLETED)
+ {
+ if (is_CA)
+ info->state= start_alter_state::COMMIT_ALTER;
+ else
+ info->state= start_alter_state::ROLLBACK_ALTER;
+ mysql_cond_broadcast(&info->start_alter_cond);
+ mysql_mutex_unlock(&mi->start_alter_lock);
+ /*
+ Wait till Start Alter worker has changed the state to ::COMPLETED
+ when start alter worker reaches the old code write_bin_log(), it will
+ change state to COMMITTED.
+ COMMITTED and `direct_commit_alter == true` at the same time indicates
+ the query needs re-execution by the CA running thread.
+ */
+ mysql_mutex_lock(&mi->start_alter_lock);
+
+ DBUG_ASSERT(info->state == start_alter_state::COMPLETED ||
+ !info->direct_commit_alter);
+
+ while(info->state != start_alter_state::COMPLETED)
+ mysql_cond_wait(&info->start_alter_cond, &mi->start_alter_lock);
+ }
+ else
+ {
+ // SA has completed and left being kicked out by deadlock or ftwrl
+ DBUG_ASSERT(info->direct_commit_alter);
+ }
+ mysql_mutex_unlock(&mi->start_alter_lock);
+
+ if (info->direct_commit_alter)
+ {
+ rgi->direct_commit_alter= true; // execute the query as if there was no SA
+ if (is_CA)
+ goto cleanup;
+ }
+
+write_binlog:
+ rc= 1;
+
+ if(!is_CA)
+ {
+ if(((info && info->error) || error_code) &&
+ global_system_variables.log_warnings > 2)
+ {
+ sql_print_information("Query '%s' having %d error code on master "
+ "is rolled back%s", query, error_code,
+ !(info && info->error) ? "." : ";");
+ if (info && info->error)
+ sql_print_information("its execution on slave %sproduced %d error.",
+ info->error == error_code ? "re":"", info->error);
+ }
+ }
+ {
+ thd->lex->sql_command= SQLCOM_ALTER_TABLE;
+ Write_log_with_flags wlwf(thd, is_CA ? Gtid_log_event::FL_COMMIT_ALTER_E1 :
+ Gtid_log_event::FL_ROLLBACK_ALTER_E1,
+ true);
+#ifdef WITH_WSREP
+ if (WSREP(thd) && wsrep_thd_is_local(thd) &&
+ wsrep_to_isolation_begin(thd, db, NULL,NULL,NULL,NULL,NULL))
+ rc= -1;
+#endif
+ if (rc != -1 &&
+ write_bin_log(thd, false, thd->query(), thd->query_length()))
+ rc= -1;
+ }
+
+ if (!thd->is_error())
+ {
+ skip_error_check= true;
+ my_ok(thd);
+ }
+
+cleanup:
+ if (info)
+ {
+ mysql_cond_destroy(&info->start_alter_cond);
+ my_free(info);
+ }
+ return rc;
+}
+
+
/**
@todo
Compare the values of "affected rows" around here. Something
@@ -1656,6 +1894,7 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
Relay_log_info const *rli= rgi->rli;
Rpl_filter *rpl_filter= rli->mi->rpl_filter;
bool current_stmt_is_commit;
+ bool skip_error_check= false;
DBUG_ENTER("Query_log_event::do_apply_event");
/*
@@ -1666,6 +1905,7 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
you.
*/
thd->catalog= catalog_len ? (char *) catalog : (char *)"";
+ rgi->start_alter_ev= this;
size_t valid_len= Well_formed_prefix(system_charset_info,
db, db_len, NAME_LEN).length();
@@ -1710,13 +1950,15 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
*/
if (is_trans_keyword() || rpl_filter->db_ok(thd->db.str))
{
+ bool is_rb_alter= gtid_flags_extra & Gtid_log_event::FL_ROLLBACK_ALTER_E1;
+
thd->set_time(when, when_sec_part);
thd->set_query_and_id((char*)query_arg, q_len_arg,
thd->charset(), next_query_id());
thd->variables.pseudo_thread_id= thread_id; // for temp tables
DBUG_PRINT("query",("%s", thd->query()));
- if (unlikely(!(expected_error= error_code)) ||
+ if (unlikely(!(expected_error= !is_rb_alter ? error_code : 0)) ||
ignored_error_code(expected_error) ||
!unexpected_error_code(expected_error))
{
@@ -1747,7 +1989,7 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
if (charset_inited)
{
rpl_sql_thread_info *sql_info= thd->system_thread_info.rpl_sql_info;
- if (sql_info->cached_charset_compare(charset))
+ if (thd->slave_thread && sql_info->cached_charset_compare(charset))
{
/* Verify that we support the charsets found in the event. */
if (!(thd->variables.character_set_client=
@@ -1885,47 +2127,69 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
thd->variables.option_bits|= OPTION_MASTER_SQL_ERROR;
thd->variables.option_bits&= ~OPTION_GTID_BEGIN;
}
- /* Execute the query (note that we bypass dispatch_command()) */
- Parser_state parser_state;
- if (!parser_state.init(thd, thd->query(), thd->query_length()))
+
+ int sa_result= 0;
+ bool is_2p_alter= gtid_flags_extra &
+ (Gtid_log_event::FL_START_ALTER_E1 |
+ Gtid_log_event::FL_COMMIT_ALTER_E1 |
+ Gtid_log_event::FL_ROLLBACK_ALTER_E1);
+ if (is_2p_alter)
+ sa_result= handle_split_alter_query_log_event(rgi, skip_error_check);
+ if (sa_result == 0)
{
- DBUG_ASSERT(thd->m_digest == NULL);
- thd->m_digest= & thd->m_digest_state;
- DBUG_ASSERT(thd->m_statement_psi == NULL);
- thd->m_statement_psi= MYSQL_START_STATEMENT(&thd->m_statement_state,
- stmt_info_rpl.m_key,
- thd->db.str, thd->db.length,
- thd->charset(), NULL);
- THD_STAGE_INFO(thd, stage_starting);
- MYSQL_SET_STATEMENT_TEXT(thd->m_statement_psi, thd->query(), thd->query_length());
- if (thd->m_digest != NULL)
- thd->m_digest->reset(thd->m_token_array, max_digest_length);
-
- if (thd->slave_thread)
- {
- /*
- To be compatible with previous releases, the slave thread uses the global
- log_slow_disabled_statements value, wich can be changed dynamically, so we
- have to set the sql_log_slow respectively.
- */
- thd->variables.sql_log_slow= !MY_TEST(global_system_variables.log_slow_disabled_statements & LOG_SLOW_DISABLE_SLAVE);
- }
-
- mysql_parse(thd, thd->query(), thd->query_length(), &parser_state);
- /* Finalize server status flags after executing a statement. */
- thd->update_server_status();
- log_slow_statement(thd);
- thd->lex->restore_set_statement_var();
+ /* Execute the query (note that we bypass dispatch_command()) */
+ Parser_state parser_state;
+ if (!parser_state.init(thd, thd->query(), thd->query_length()))
+ {
+ DBUG_ASSERT(thd->m_digest == NULL);
+ thd->m_digest= & thd->m_digest_state;
+ DBUG_ASSERT(thd->m_statement_psi == NULL);
+ thd->m_statement_psi= MYSQL_START_STATEMENT(&thd->m_statement_state,
+ stmt_info_rpl.m_key,
+ thd->db.str, thd->db.length,
+ thd->charset(), NULL);
+ THD_STAGE_INFO(thd, stage_starting);
+ MYSQL_SET_STATEMENT_TEXT(thd->m_statement_psi, thd->query(), thd->query_length());
+ if (thd->m_digest != NULL)
+ thd->m_digest->reset(thd->m_token_array, max_digest_length);
+
+ if (thd->slave_thread)
+ {
+ /*
+ To be compatible with previous releases, the slave thread uses the global
+ log_slow_disabled_statements value, wich can be changed dynamically, so we
+ have to set the sql_log_slow respectively.
+ */
+ thd->variables.sql_log_slow= !MY_TEST(global_system_variables.log_slow_disabled_statements & LOG_SLOW_DISABLE_SLAVE);
+ }
+ mysql_parse(thd, thd->query(), thd->query_length(), &parser_state);
+ /* Finalize server status flags after executing a statement. */
+ thd->update_server_status();
+ log_slow_statement(thd);
+ thd->lex->restore_set_statement_var();
- /*
- When THD::slave_expected_error gets reset inside execution stack
- that is the case of to be ignored event. In this case the expected
- error must change to the reset value as well.
- */
- expected_error= thd->slave_expected_error;
+ /*
+ When THD::slave_expected_error gets reset inside execution stack
+ that is the case of to be ignored event. In this case the expected
+ error must change to the reset value as well.
+ */
+ expected_error= thd->slave_expected_error;
+ }
+ }
+ else if (sa_result == -1)
+ {
+ rli->report(ERROR_LEVEL, expected_error, rgi->gtid_info(),
+ "TODO start alter error");
+ thd->is_slave_error= 1;
+ goto end;
}
-
thd->variables.option_bits&= ~OPTION_MASTER_SQL_ERROR;
+ if (is_2p_alter && !rgi->is_parallel_exec)
+ {
+ rgi->gtid_ev_flags_extra= 0;
+ rgi->direct_commit_alter= 0;
+ rgi->gtid_ev_sa_seq_no= 0;
+ }
}
else
{
@@ -1988,7 +2252,8 @@ compare_errors:
If we expected a non-zero error code, and we don't get the same error
code, and it should be ignored or is related to a concurrency issue.
*/
- actual_error= thd->is_error() ? thd->get_stmt_da()->sql_errno() : 0;
+ actual_error= thd->is_error() ? thd->get_stmt_da()->sql_errno() :
+ skip_error_check? expected_error : 0;
DBUG_PRINT("info",("expected_error: %d sql_errno: %d",
expected_error, actual_error));
@@ -2384,6 +2649,39 @@ bool Format_description_log_event::write()
}
#if defined(HAVE_REPLICATION)
+/*
+ Auxiliary function to conduct cleanup of unfinished two-phase logged ALTERs.
+*/
+static void check_and_remove_stale_alter(Relay_log_info *rli)
+{
+ Master_info *mi= rli->mi;
+ start_alter_info *info=NULL;
+
+ mysql_mutex_lock(&mi->start_alter_list_lock);
+ List_iterator<start_alter_info> info_iterator(mi->start_alter_list);
+ while ((info= info_iterator++))
+ {
+ DBUG_ASSERT(info->state == start_alter_state::REGISTERED);
+
+ sql_print_warning("ALTER query started at %u-%u-%llu could not "
+ "be completed because of unexpected master server "
+ "or its binlog change", info->sa_seq_no, // todo:gtid
+ 0, 0);
+ info_iterator.remove();
+ mysql_mutex_lock(&mi->start_alter_lock);
+ info->state= start_alter_state::ROLLBACK_ALTER;
+ mysql_mutex_unlock(&mi->start_alter_lock);
+ mysql_cond_broadcast(&info->start_alter_cond);
+ mysql_mutex_lock(&mi->start_alter_lock);
+ while(info->state != start_alter_state::COMPLETED)
+ mysql_cond_wait(&info->start_alter_cond, &mi->start_alter_lock);
+ mysql_mutex_unlock(&mi->start_alter_lock);
+ mysql_cond_destroy(&info->start_alter_cond);
+ my_free(info);
+ }
+ mysql_mutex_unlock(&mi->start_alter_list_lock);
+}
+
int Format_description_log_event::do_apply_event(rpl_group_info *rgi)
{
int ret= 0;
@@ -2401,16 +2699,21 @@ int Format_description_log_event::do_apply_event(rpl_group_info *rgi)
original place when it comes to us; we'll know this by checking
log_pos ("artificial" events have log_pos == 0).
*/
- if (!thd->rli_fake &&
- !is_artificial_event() && created && thd->transaction->all.ha_list)
+ if (!is_artificial_event() && created && !thd->rli_fake && !thd->rgi_fake)
{
- /* This is not an error (XA is safe), just an information */
- rli->report(INFORMATION_LEVEL, 0, NULL,
- "Rolling back unfinished transaction (no COMMIT "
- "or ROLLBACK in relay log). A probable cause is that "
- "the master died while writing the transaction to "
- "its binary log, thus rolled back too.");
- rgi->cleanup_context(thd, 1);
+ // check_and_remove stale Start Alter:s
+ if (flags & LOG_EVENT_BINLOG_IN_USE_F)
+ check_and_remove_stale_alter(rli);
+ if (thd->transaction->all.ha_list)
+ {
+ /* This is not an error (XA is safe), just an information */
+ rli->report(INFORMATION_LEVEL, 0, NULL,
+ "Rolling back unfinished transaction (no COMMIT "
+ "or ROLLBACK in relay log). A probable cause is that "
+ "the master died while writing the transaction to "
+ "its binary log, thus rolled back too.");
+ rgi->cleanup_context(thd, 1);
+ }
}
/*
@@ -3330,7 +3633,14 @@ Gtid_log_event::Gtid_log_event(THD *thd_arg, uint64 seq_no_arg,
extra_engines= count > 1 ? 0 : UCHAR_MAX;
}
if (extra_engines > 0)
- flags_extra|= FL_EXTRA_MULTI_ENGINE;
+ flags_extra|= FL_EXTRA_MULTI_ENGINE_E1;
+ }
+ if (thd->get_binlog_flags_for_alter())
+ {
+ flags_extra |= thd->get_binlog_flags_for_alter();
+ if (flags_extra & (FL_COMMIT_ALTER_E1 | FL_ROLLBACK_ALTER_E1))
+ sa_seq_no= thd->get_binlog_start_alter_seq_no();
+ flags2|= FL_DDL;
}
}
@@ -3403,12 +3713,18 @@ Gtid_log_event::write()
buf[write_len]= flags_extra;
write_len++;
}
- if (flags_extra & FL_EXTRA_MULTI_ENGINE)
+ if (flags_extra & FL_EXTRA_MULTI_ENGINE_E1)
{
buf[write_len]= extra_engines;
write_len++;
}
+ if (flags_extra & (FL_COMMIT_ALTER_E1 | FL_ROLLBACK_ALTER_E1))
+ {
+ int8store(buf + write_len, sa_seq_no);
+ write_len+= 8;
+ }
+
if (write_len < GTID_HEADER_LEN)
{
bzero(buf+write_len, GTID_HEADER_LEN-write_len);
@@ -3472,6 +3788,20 @@ Gtid_log_event::pack_info(Protocol *protocol)
p= strmov(p, " cid=");
p= longlong10_to_str(commit_id, p, 10);
}
+ if (flags_extra & FL_START_ALTER_E1)
+ {
+ p= strmov(p, " START ALTER");
+ }
+ if (flags_extra & FL_COMMIT_ALTER_E1)
+ {
+ p= strmov(p, " COMMIT ALTER id=");
+ p= longlong10_to_str(sa_seq_no, p, 10);
+ }
+ if (flags_extra & FL_ROLLBACK_ALTER_E1)
+ {
+ p= strmov(p, " ROLLBACK ALTER id=");
+ p= longlong10_to_str(sa_seq_no, p, 10);
+ }
protocol->store(buf, p-buf, &my_charset_bin);
}
@@ -3486,6 +3816,9 @@ Gtid_log_event::do_apply_event(rpl_group_info *rgi)
thd->variables.gtid_domain_id= this->domain_id;
thd->variables.gtid_seq_no= this->seq_no;
rgi->gtid_ev_flags2= flags2;
+
+ rgi->gtid_ev_flags_extra= flags_extra;
+ rgi->gtid_ev_sa_seq_no= sa_seq_no;
thd->reset_for_next_command();
if (opt_gtid_strict_mode && opt_bin_log && opt_log_slave_updates)
@@ -3756,6 +4089,12 @@ Gtid_list_log_event::pack_info(Protocol *protocol)
uint32 i;
bool first;
+ /*
+ For output consistency and ease of reading, we sort the GTID list in
+ ascending order
+ */
+ qsort(list, count, sizeof(rpl_gtid), compare_glle_gtids);
+
buf.length(0);
buf.append(STRING_WITH_LEN("["));
first= true;
@@ -5232,8 +5571,7 @@ Rows_log_event::Rows_log_event(THD *thd_arg, TABLE *tbl_arg, ulong tid,
/* if my_bitmap_init fails, caught in is_valid() */
if (likely(!my_bitmap_init(&m_cols,
m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL,
- m_width,
- false)))
+ m_width)))
{
/* Cols can be zero if this is a dummy binrows event */
if (likely(cols != NULL))
@@ -6463,7 +6801,7 @@ int Table_map_log_event::do_apply_event(rpl_group_info *rgi)
LEX_CSTRING tmp_tbl_name= {tname_mem, tname_mem_length };
table_list->init_one_table(&tmp_db_name, &tmp_tbl_name, 0, TL_WRITE);
- table_list->table_id= DBUG_EVALUATE_IF("inject_tblmap_same_id_maps_diff_table", 0, m_table_id);
+ table_list->table_id= DBUG_IF("inject_tblmap_same_id_maps_diff_table") ? 0 : m_table_id;
table_list->updating= 1;
table_list->required_type= TABLE_TYPE_NORMAL;
@@ -6703,7 +7041,7 @@ void Table_map_log_event::init_metadata_fields()
if (binlog_row_metadata == BINLOG_ROW_METADATA_FULL)
{
- if (DBUG_EVALUATE_IF("dont_log_column_name", 0, init_column_name_field()) ||
+ if ((!DBUG_IF("dont_log_column_name") && init_column_name_field()) ||
init_charset_field(&is_enum_or_set_field, ENUM_AND_SET_DEFAULT_CHARSET,
ENUM_AND_SET_COLUMN_CHARSET) ||
init_set_str_value_field() ||
@@ -8285,8 +8623,7 @@ void Update_rows_log_event::init(MY_BITMAP const *cols)
/* if my_bitmap_init fails, caught in is_valid() */
if (likely(!my_bitmap_init(&m_cols_ai,
m_width <= sizeof(m_bitbuf_ai)*8 ? m_bitbuf_ai : NULL,
- m_width,
- false)))
+ m_width)))
{
/* Cols can be zero if this is a dummy binrows event */
if (likely(cols != NULL))
diff --git a/sql/mdl.cc b/sql/mdl.cc
index 8fd1fa7580a..6cb27efba12 100644
--- a/sql/mdl.cc
+++ b/sql/mdl.cc
@@ -2241,8 +2241,8 @@ bool MDL_lock::check_if_conflicting_replication_locks(MDL_context *ctx)
/*
If the conflicting thread is another parallel replication
- thread for the same master and it's not in commit stage, then
- the current transaction has started too early and something is
+ thread for the same master and it's not in commit or post-commit stages,
+ then the current transaction has started too early and something is
seriously wrong.
*/
if (conflicting_rgi_slave &&
@@ -2250,7 +2250,9 @@ bool MDL_lock::check_if_conflicting_replication_locks(MDL_context *ctx)
conflicting_rgi_slave->rli == rgi_slave->rli &&
conflicting_rgi_slave->current_gtid.domain_id ==
rgi_slave->current_gtid.domain_id &&
- !conflicting_rgi_slave->did_mark_start_commit)
+ !((conflicting_rgi_slave->did_mark_start_commit ||
+ conflicting_rgi_slave->worker_error) ||
+ conflicting_rgi_slave->finish_event_group_called))
return 1; // Fatal error
}
}
@@ -2325,6 +2327,20 @@ MDL_context::acquire_lock(MDL_request *mdl_request, double lock_wait_timeout)
DBUG_RETURN(TRUE);
}
+#ifdef WITH_WSREP
+ if (WSREP(get_thd()))
+ {
+ THD* requester= get_thd();
+ bool requester_toi= wsrep_thd_is_toi(requester) || wsrep_thd_is_applying(requester);
+ WSREP_DEBUG("::acquire_lock is TOI %d for %s", requester_toi,
+ wsrep_thd_query(requester));
+ if (requester_toi)
+ THD_STAGE_INFO(requester, stage_waiting_ddl);
+ else
+ THD_STAGE_INFO(requester, stage_waiting_isolation);
+ }
+#endif /* WITH_WSREP */
+
lock->m_waiting.add_ticket(ticket);
/*
diff --git a/sql/my_json_writer.cc b/sql/my_json_writer.cc
index 9470ba57855..54eb8423caf 100644
--- a/sql/my_json_writer.cc
+++ b/sql/my_json_writer.cc
@@ -13,12 +13,11 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-#include "mariadb.h"
-#include "sql_priv.h"
-#include "sql_string.h"
+#include "my_global.h"
#include "my_json_writer.h"
#if !defined(NDEBUG) || defined(JSON_WRITER_UNIT_TEST)
+
bool Json_writer::named_item_expected() const
{
return named_items_expectation.size()
@@ -39,7 +38,13 @@ inline void Json_writer::on_start_object()
#if !defined(NDEBUG) || defined(JSON_WRITER_UNIT_TEST)
if(!fmt_helper.is_making_writer_calls())
{
- VALIDITY_ASSERT(got_name == named_item_expected());
+ if (got_name != named_item_expected())
+ {
+ sql_print_error(got_name
+ ? "Json_writer got a member name which is not expected.\n"
+ : "Json_writer: a member name was expected.\n");
+ VALIDITY_ASSERT(got_name == named_item_expected());
+ }
named_items_expectation.push_back(true);
}
#endif
@@ -60,6 +65,7 @@ void Json_writer::start_object()
document_start= false;
#if !defined(NDEBUG) || defined(JSON_WRITER_UNIT_TEST)
got_name= false;
+ named_items.emplace();
#endif
}
@@ -71,6 +77,8 @@ void Json_writer::start_array()
VALIDITY_ASSERT(got_name == named_item_expected());
named_items_expectation.push_back(false);
got_name= false;
+ if (document_start)
+ named_items.emplace();
}
#endif
@@ -95,6 +103,8 @@ void Json_writer::end_object()
named_items_expectation.pop_back();
VALIDITY_ASSERT(!got_name);
got_name= false;
+ VALIDITY_ASSERT(named_items.size());
+ named_items.pop();
#endif
indent_level-=INDENT_SIZE;
if (!first_child)
@@ -140,7 +150,19 @@ Json_writer& Json_writer::add_member(const char *name, size_t len)
}
#if !defined(NDEBUG) || defined(JSON_WRITER_UNIT_TEST)
if (!fmt_helper.is_making_writer_calls())
+ {
+ VALIDITY_ASSERT(!got_name);
got_name= true;
+ VALIDITY_ASSERT(named_items.size());
+ auto& named_items_keys= named_items.top();
+ auto emplaced= named_items_keys.emplace(name, len);
+ auto is_uniq_key= emplaced.second;
+ if(!is_uniq_key)
+ {
+ sql_print_error("Duplicated key: %s\n", emplaced.first->c_str());
+ VALIDITY_ASSERT(is_uniq_key);
+ }
+ }
#endif
return *this;
}
diff --git a/sql/my_json_writer.h b/sql/my_json_writer.h
index c2e70962514..87d1a7facf1 100644
--- a/sql/my_json_writer.h
+++ b/sql/my_json_writer.h
@@ -17,6 +17,7 @@
#define JSON_WRITER_INCLUDED
#include "my_base.h"
+#include "sql_string.h"
#if !defined(NDEBUG) || defined(JSON_WRITER_UNIT_TEST) || defined ENABLED_JSON_WRITER_CONSISTENCY_CHECKS
#include <set>
@@ -26,12 +27,11 @@
#endif
#ifdef JSON_WRITER_UNIT_TEST
-#include "sql_string.h"
-constexpr uint FAKE_SELECT_LEX_ID= UINT_MAX;
// Also, mock objects are defined in my_json_writer-t.cc
#define VALIDITY_ASSERT(x) if (!(x)) this->invalid_json= true;
#else
-#include "sql_select.h"
+#include "sql_class.h" // For class THD
+#include "log.h" // for sql_print_error
#define VALIDITY_ASSERT(x) DBUG_ASSERT(x)
#endif
@@ -40,8 +40,10 @@ constexpr uint FAKE_SELECT_LEX_ID= UINT_MAX;
class Opt_trace_stmt;
class Opt_trace_context;
class Json_writer;
-struct TABLE_LIST;
+struct TABLE;
+struct st_join_table;
+using JOIN_TAB= struct st_join_table;
/*
Single_line_formatting_helper is used by Json_writer to do better formatting
@@ -216,6 +218,7 @@ class Json_writer
produce an invalid JSON document (e.g. JSON array having named elements).
*/
std::vector<bool> named_items_expectation;
+ std::stack<std::set<std::string> > named_items;
bool named_item_expected() const;
@@ -235,6 +238,8 @@ public:
Json_writer& add_member(const char *name, size_t len);
/* Add atomic values */
+
+ /* Note: the add_str methods do not do escapes. Should this change? */
void add_str(const char* val);
void add_str(const char* val, size_t num_bytes);
void add_str(const String &str);
diff --git a/sql/mysql_install_db.cc b/sql/mysql_install_db.cc
index aa83ad87588..1543cb5ca56 100644
--- a/sql/mysql_install_db.cc
+++ b/sql/mysql_install_db.cc
@@ -21,6 +21,7 @@
#include "mariadb.h"
#include <my_getopt.h>
#include <m_string.h>
+#include <password.h>
#include <windows.h>
#include <shellapi.h>
@@ -30,6 +31,7 @@
#include <sddl.h>
struct IUnknown;
#include <shlwapi.h>
+#include <winservice.h>
#include <string>
@@ -432,16 +434,14 @@ static int create_myini()
}
-static const char update_root_passwd_part1[]=
+static constexpr const char* update_root_passwd=
"UPDATE mysql.global_priv SET priv=json_set(priv,"
"'$.password_last_changed', UNIX_TIMESTAMP(),"
"'$.plugin','mysql_native_password',"
- "'$.authentication_string',PASSWORD(";
-static const char update_root_passwd_part2[]=
- ")) where User='root';\n";
-static const char remove_default_user_cmd[]=
+ "'$.authentication_string','%s') where User='root';\n";
+static constexpr char remove_default_user_cmd[]=
"DELETE FROM mysql.user where User='';\n";
-static const char allow_remote_root_access_cmd[]=
+static constexpr char allow_remote_root_access_cmd[]=
"CREATE TEMPORARY TABLE tmp_user LIKE global_priv;\n"
"INSERT INTO tmp_user SELECT * from global_priv where user='root' "
" AND host='localhost';\n"
@@ -920,18 +920,10 @@ static int create_db_instance(const char *datadir)
/* Change root password if requested. */
if (opt_password && opt_password[0])
{
- verbose("Setting root password",remove_default_user_cmd);
- fputs(update_root_passwd_part1, in);
-
- /* Use hex encoding for password, to avoid escaping problems.*/
- fputc('0', in);
- fputc('x', in);
- for(int i= 0; opt_password[i]; i++)
- {
- fprintf(in,"%02x",opt_password[i]);
- }
-
- fputs(update_root_passwd_part2, in);
+ verbose("Setting root password");
+ char buf[2 * MY_SHA1_HASH_SIZE + 2];
+ my_make_scrambled_password(buf, opt_password, strlen(opt_password));
+ fprintf(in, update_root_passwd, buf);
fflush(in);
}
@@ -966,7 +958,7 @@ end:
auto sc_manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (sc_manager)
{
- auto sc_handle= OpenServiceA(sc_manager,opt_service, DELETE);
+ auto sc_handle= OpenService(sc_manager,opt_service, DELETE);
if (sc_handle)
{
DeleteService(sc_handle);
diff --git a/sql/mysql_upgrade_service.cc b/sql/mysql_upgrade_service.cc
index 7438ab131ea..02fae11a260 100644
--- a/sql/mysql_upgrade_service.cc
+++ b/sql/mysql_upgrade_service.cc
@@ -374,13 +374,17 @@ static void change_service_config()
Write datadir to my.ini, after converting backslashes to
unix style slashes.
*/
- strcpy_s(buf, MAX_PATH, service_properties.datadir);
- for(i= 0; buf[i]; i++)
+ if (service_properties.datadir[0])
{
- if (buf[i] == '\\')
- buf[i]= '/';
+ strcpy_s(buf, MAX_PATH, service_properties.datadir);
+ for (i= 0; buf[i]; i++)
+ {
+ if (buf[i] == '\\')
+ buf[i]= '/';
+ }
+ WritePrivateProfileString("mysqld", "datadir", buf,
+ service_properties.inifile);
}
- WritePrivateProfileString("mysqld", "datadir",buf, service_properties.inifile);
/*
Remove basedir from defaults file, otherwise the service wont come up in
@@ -465,13 +469,8 @@ int main(int argc, char **argv)
}
}
- old_mysqld_exe_exists = (GetFileAttributes(service_properties.mysqld_exe) != INVALID_FILE_ATTRIBUTES);
- log("Phase %d/%d: Fixing server config file%s", ++phase, max_phases, my_ini_exists ? "" : "(skipped)");
-
- snprintf(my_ini_bck, sizeof(my_ini_bck), "%s.BCK", service_properties.inifile);
- CopyFile(service_properties.inifile, my_ini_bck, FALSE);
- upgrade_config_file(service_properties.inifile);
-
+ old_mysqld_exe_exists= (GetFileAttributes(service_properties.mysqld_exe) !=
+ INVALID_FILE_ATTRIBUTES);
bool do_start_stop_server = old_mysqld_exe_exists && initial_service_state != SERVICE_RUNNING;
log("Phase %d/%d: Start and stop server in the old version, to avoid crash recovery %s", ++phase, max_phases,
@@ -526,6 +525,14 @@ int main(int argc, char **argv)
start_duration_ms += 500;
}
}
+
+ log("Phase %d/%d: Fixing server config file%s", ++phase, max_phases,
+ my_ini_exists ? "" : "(skipped)");
+ snprintf(my_ini_bck, sizeof(my_ini_bck), "%s.BCK",
+ service_properties.inifile);
+ CopyFile(service_properties.inifile, my_ini_bck, FALSE);
+ upgrade_config_file(service_properties.inifile);
+
/*
Start mysqld.exe as non-service skipping privileges (so we do not
care about the password). But disable networking and enable pipe
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 5e14739ee82..b75d791573c 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -128,6 +128,7 @@
#ifdef _WIN32
#include <handle_connections_win.h>
#include <sddl.h>
+#include <winservice.h> /* SERVICE_STOPPED, SERVICE_RUNNING etc */
#endif
#include <my_service_manager.h>
@@ -372,6 +373,7 @@ uint volatile global_disable_checkpoint;
ulong slow_start_timeout;
#endif
static MEM_ROOT startup_root;
+MEM_ROOT read_only_root;
/**
@brief 'grant_option' is used to indicate if privileges needs
@@ -643,7 +645,23 @@ struct system_variables max_system_variables;
struct system_status_var global_status_var;
MY_TMPDIR mysql_tmpdir_list;
-MY_BITMAP temp_pool;
+static MY_BITMAP temp_pool;
+static mysql_mutex_t LOCK_temp_pool;
+
+void temp_pool_clear_bit(uint bit)
+{
+ mysql_mutex_lock(&LOCK_temp_pool);
+ bitmap_clear_bit(&temp_pool, bit);
+ mysql_mutex_unlock(&LOCK_temp_pool);
+}
+
+uint temp_pool_set_next()
+{
+ mysql_mutex_lock(&LOCK_temp_pool);
+ uint res= bitmap_set_next(&temp_pool);
+ mysql_mutex_unlock(&LOCK_temp_pool);
+ return res;
+}
CHARSET_INFO *system_charset_info, *files_charset_info ;
CHARSET_INFO *national_charset_info, *table_alias_charset;
@@ -890,11 +908,13 @@ PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list,
key_LOCK_manager, key_LOCK_backup_log,
key_LOCK_prepared_stmt_count,
key_LOCK_rpl_status, key_LOCK_server_started,
- key_LOCK_status,
+ key_LOCK_status, key_LOCK_temp_pool,
key_LOCK_system_variables_hash, key_LOCK_thd_data, key_LOCK_thd_kill,
key_LOCK_user_conn, key_LOCK_uuid_short_generator, key_LOG_LOCK_log,
key_master_info_data_lock, key_master_info_run_lock,
key_master_info_sleep_lock, key_master_info_start_stop_lock,
+ key_master_info_start_alter_lock,
+ key_master_info_start_alter_list_lock,
key_mutex_slave_reporting_capability_err_lock, key_relay_log_info_data_lock,
key_rpl_group_info_sleep_lock,
key_relay_log_info_log_space_lock, key_relay_log_info_run_lock,
@@ -948,6 +968,7 @@ static PSI_mutex_info all_server_mutexes[]=
{ &key_hash_filo_lock, "hash_filo::lock", 0},
{ &key_LOCK_active_mi, "LOCK_active_mi", PSI_FLAG_GLOBAL},
{ &key_LOCK_backup_log, "LOCK_backup_log", PSI_FLAG_GLOBAL},
+ { &key_LOCK_temp_pool, "LOCK_temp_pool", PSI_FLAG_GLOBAL},
{ &key_LOCK_thread_id, "LOCK_thread_id", PSI_FLAG_GLOBAL},
{ &key_LOCK_crypt, "LOCK_crypt", PSI_FLAG_GLOBAL},
{ &key_LOCK_delayed_create, "LOCK_delayed_create", PSI_FLAG_GLOBAL},
@@ -978,6 +999,8 @@ static PSI_mutex_info all_server_mutexes[]=
{ &key_master_info_start_stop_lock, "Master_info::start_stop_lock", 0},
{ &key_master_info_run_lock, "Master_info::run_lock", 0},
{ &key_master_info_sleep_lock, "Master_info::sleep_lock", 0},
+ { &key_master_info_start_alter_lock, "Master_info::start_alter_lock", 0},
+ { &key_master_info_start_alter_list_lock, "Master_info::start_alter_lock", 0},
{ &key_mutex_slave_reporting_capability_err_lock, "Slave_reporting_capability::err_lock", 0},
{ &key_relay_log_info_data_lock, "Relay_log_info::data_lock", 0},
{ &key_relay_log_info_log_space_lock, "Relay_log_info::log_space_lock", 0},
@@ -1509,6 +1532,16 @@ static void end_ssl();
#ifndef EMBEDDED_LIBRARY
+extern Atomic_counter<uint32_t> local_connection_thread_count;
+
+uint THD_count::connection_thd_count()
+{
+ return value() -
+ binlog_dump_thread_count -
+ local_connection_thread_count;
+}
+
+
/****************************************************************************
** Code to end mysqld
****************************************************************************/
@@ -1536,10 +1569,9 @@ static my_bool kill_thread_phase_1(THD *thd, int *n_threads_awaiting_ack)
++(*n_threads_awaiting_ack)))
return 0;
- if (DBUG_EVALUATE_IF("only_kill_system_threads", !thd->system_thread, 0))
+ if (DBUG_IF("only_kill_system_threads") && !thd->system_thread)
return 0;
- if (DBUG_EVALUATE_IF("only_kill_system_threads_no_loop",
- !thd->system_thread, 0))
+ if (DBUG_IF("only_kill_system_threads_no_loop") && !thd->system_thread)
return 0;
thd->awake(KILL_SERVER_HARD);
@@ -1771,12 +1803,13 @@ static void close_connections(void)
*/
DBUG_PRINT("info", ("THD_count: %u", THD_count::value()));
- for (int i= 0; (THD_count::value() - binlog_dump_thread_count -
- n_threads_awaiting_ack) &&
- i < 1000 &&
- DBUG_EVALUATE_IF("only_kill_system_threads_no_loop", 0, 1);
- i++)
+ for (int i= 0; THD_count::connection_thd_count() - n_threads_awaiting_ack
+ && i < 1000; i++)
+ {
+ if (DBUG_IF("only_kill_system_threads_no_loop"))
+ break;
my_sleep(20000);
+ }
if (global_system_variables.log_warnings)
server_threads.iterate(warn_threads_active_after_phase_1);
@@ -1790,19 +1823,18 @@ static void close_connections(void)
#endif
/* All threads has now been aborted */
DBUG_PRINT("quit", ("Waiting for threads to die (count=%u)",
- THD_count::value() - binlog_dump_thread_count -
- n_threads_awaiting_ack));
+ THD_count::connection_thd_count() - n_threads_awaiting_ack));
- while ((THD_count::value() - binlog_dump_thread_count -
- n_threads_awaiting_ack) &&
- DBUG_EVALUATE_IF("only_kill_system_threads_no_loop", 0, 1))
+ while (THD_count::connection_thd_count() - n_threads_awaiting_ack)
{
+ if (DBUG_IF("only_kill_system_threads_no_loop"))
+ break;
my_sleep(1000);
}
/* Kill phase 2 */
server_threads.iterate(kill_thread_phase_2);
- for (uint64 i= 0; THD_count::value(); i++)
+ for (uint64 i= 0; THD_count::value() > local_connection_thread_count; i++)
{
/*
This time the warnings are emitted within the loop to provide a
@@ -2014,6 +2046,8 @@ static void clean_up(bool print_message)
mysql_library_end();
finish_client_errs();
free_root(&startup_root, MYF(0));
+ protect_root(&read_only_root, PROT_READ | PROT_WRITE);
+ free_root(&read_only_root, MYF(0));
cleanup_errmsgs();
free_error_messages();
/* Tell main we are ready */
@@ -2093,6 +2127,7 @@ static void clean_up_mutexes()
mysql_mutex_destroy(&LOCK_active_mi);
mysql_rwlock_destroy(&LOCK_ssl_refresh);
mysql_mutex_destroy(&LOCK_backup_log);
+ mysql_mutex_destroy(&LOCK_temp_pool);
mysql_rwlock_destroy(&LOCK_sys_init_connect);
mysql_rwlock_destroy(&LOCK_sys_init_slave);
mysql_mutex_destroy(&LOCK_global_system_variables);
@@ -3286,7 +3321,7 @@ void my_message_sql(uint error, const char *str, myf MyFlags)
{
if (unlikely(MyFlags & ME_FATAL))
thd->is_fatal_error= 1;
- (void) thd->raise_condition(error, NULL, level, str);
+ (void) thd->raise_condition(error, "\0\0\0\0\0", level, str);
}
else
mysql_audit_general(0, MYSQL_AUDIT_GENERAL_ERROR, error, str);
@@ -3400,7 +3435,6 @@ SHOW_VAR com_status_vars[]= {
{"alter_server", STMT_STATUS(SQLCOM_ALTER_SERVER)},
{"alter_sequence", STMT_STATUS(SQLCOM_ALTER_SEQUENCE)},
{"alter_table", STMT_STATUS(SQLCOM_ALTER_TABLE)},
- {"alter_tablespace", STMT_STATUS(SQLCOM_ALTER_TABLESPACE)},
{"alter_user", STMT_STATUS(SQLCOM_ALTER_USER)},
{"analyze", STMT_STATUS(SQLCOM_ANALYZE)},
{"assign_to_keycache", STMT_STATUS(SQLCOM_ASSIGN_TO_KEYCACHE)},
@@ -3774,6 +3808,8 @@ static int init_early_variables()
set_malloc_size_cb(my_malloc_size_cb_func);
global_status_var.global_memory_used= 0;
init_alloc_root(PSI_NOT_INSTRUMENTED, &startup_root, 1024, 0, MYF(0));
+ init_alloc_root(PSI_NOT_INSTRUMENTED, &read_only_root, 1024, 0,
+ MYF(MY_ROOT_USE_MPROTECT));
return 0;
}
@@ -4273,7 +4309,7 @@ static int init_common_variables()
#endif /* defined(ENABLED_DEBUG_SYNC) */
#if (ENABLE_TEMP_POOL)
- if (use_temp_pool && my_bitmap_init(&temp_pool,0,1024,1))
+ if (use_temp_pool && my_bitmap_init(&temp_pool,0,1024))
return 1;
#else
use_temp_pool= 0;
@@ -4400,6 +4436,7 @@ static int init_thread_environment()
mysql_mutex_init(key_LOCK_commit_ordered, &LOCK_commit_ordered,
MY_MUTEX_INIT_SLOW);
mysql_mutex_init(key_LOCK_backup_log, &LOCK_backup_log, MY_MUTEX_INIT_FAST);
+ mysql_mutex_init(key_LOCK_temp_pool, &LOCK_temp_pool, MY_MUTEX_INIT_FAST);
#ifdef HAVE_OPENSSL
mysql_mutex_init(key_LOCK_des_key_file,
@@ -5089,6 +5126,7 @@ static int init_server_components()
init_global_table_stats();
init_global_index_stats();
+ init_update_queries();
/* Allow storage engine to give real error messages */
if (unlikely(ha_init_errors()))
@@ -5096,6 +5134,9 @@ static int init_server_components()
tc_log= 0; // ha_initialize_handlerton() needs that
+ if (!opt_abort && ddl_log_initialize())
+ unireg_abort(1);
+
if (plugin_init(&remaining_argc, remaining_argv,
(opt_noacl ? PLUGIN_INIT_SKIP_PLUGIN_TABLE : 0) |
(opt_abort ? PLUGIN_INIT_SKIP_INITIALIZATION : 0)))
@@ -5198,6 +5239,7 @@ static int init_server_components()
MARIADB_REMOVED_OPTION("innodb-log-compressed-pages"),
MARIADB_REMOVED_OPTION("innodb-log-files-in-group"),
MARIADB_REMOVED_OPTION("innodb-log-optimize-ddl"),
+ MARIADB_REMOVED_OPTION("innodb-log-write-ahead-size"),
MARIADB_REMOVED_OPTION("innodb-page-cleaners"),
MARIADB_REMOVED_OPTION("innodb-replication-delay"),
MARIADB_REMOVED_OPTION("innodb-scrub-log"),
@@ -5339,9 +5381,6 @@ static int init_server_components()
}
#endif
- if (ddl_log_initialize())
- unireg_abort(1);
-
tc_log= get_tc_log_implementation();
if (tc_log->open(opt_bin_log ? opt_bin_logname : opt_tc_log_file))
@@ -5425,12 +5464,15 @@ static int init_server_components()
ft_init_stopwords();
init_max_user_conn();
- init_update_queries();
init_global_user_stats();
init_global_client_stats();
if (!opt_bootstrap)
servers_init(0);
init_status_vars();
+ Item_false= new (&read_only_root) Item_bool_static("FALSE", 0);
+ Item_true= new (&read_only_root) Item_bool_static("TRUE", 1);
+ DBUG_ASSERT(Item_false);
+
DBUG_RETURN(0);
}
@@ -5794,6 +5836,9 @@ int mysqld_main(int argc, char **argv)
}
#endif /* WITH_WSREP */
+ /* Protect read_only_root against writes */
+ protect_root(&read_only_root, PROT_READ);
+
if (opt_bootstrap)
{
select_thread_in_use= 0; // Allow 'kill' to work
@@ -9217,6 +9262,14 @@ PSI_stage_info stage_starting= { 0, "starting", 0};
PSI_stage_info stage_waiting_for_flush= { 0, "Waiting for non trans tables to be flushed", 0};
PSI_stage_info stage_waiting_for_ddl= { 0, "Waiting for DDLs", 0};
+#ifdef WITH_WSREP
+// Aditional Galera thread states
+PSI_stage_info stage_waiting_isolation= { 0, "Waiting to execute in isolation", 0};
+PSI_stage_info stage_waiting_certification= {0, "Waiting for certification", 0};
+PSI_stage_info stage_waiting_ddl= {0, "Waiting for TOI DDL", 0};
+PSI_stage_info stage_waiting_flow= {0, "Waiting for flow control", 0};
+#endif /* WITH_WSREP */
+
PSI_memory_key key_memory_DATE_TIME_FORMAT;
PSI_memory_key key_memory_DDL_LOG_MEMORY_ENTRY;
PSI_memory_key key_memory_Event_queue_element_for_exec_names;
@@ -9436,6 +9489,13 @@ PSI_stage_info *all_server_stages[]=
& stage_reading_semi_sync_ack,
& stage_waiting_for_deadlock_kill,
& stage_starting
+#ifdef WITH_WSREP
+ ,
+ & stage_waiting_isolation,
+ & stage_waiting_certification,
+ & stage_waiting_ddl,
+ & stage_waiting_flow
+#endif /* WITH_WSREP */
};
PSI_socket_key key_socket_tcpip, key_socket_unix, key_socket_client_connection;
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 6756cbc425a..5ef9dc1a9c7 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -1,5 +1,5 @@
/* Copyright (c) 2006, 2016, Oracle and/or its affiliates.
- Copyright (c) 2010, 2020, MariaDB Corporation.
+ Copyright (c) 2010, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -100,7 +100,9 @@ extern CHARSET_INFO *error_message_charset_info;
extern CHARSET_INFO *character_set_filesystem;
-extern MY_BITMAP temp_pool;
+void temp_pool_clear_bit(uint bit);
+uint temp_pool_set_next();
+
extern bool opt_large_files;
extern bool opt_update_log, opt_bin_log, opt_error_log, opt_bin_log_compress;
extern uint opt_bin_log_compress_min_len;
@@ -330,6 +332,8 @@ extern PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list,
key_LOCK_user_conn, key_LOG_LOCK_log,
key_master_info_data_lock, key_master_info_run_lock,
key_master_info_sleep_lock, key_master_info_start_stop_lock,
+ key_master_info_start_alter_lock,
+ key_master_info_start_alter_list_lock,
key_mutex_slave_reporting_capability_err_lock, key_relay_log_info_data_lock,
key_relay_log_info_log_space_lock, key_relay_log_info_run_lock,
key_rpl_group_info_sleep_lock,
@@ -677,6 +681,13 @@ extern PSI_stage_info stage_slave_background_process_request;
extern PSI_stage_info stage_slave_background_wait_request;
extern PSI_stage_info stage_waiting_for_deadlock_kill;
extern PSI_stage_info stage_starting;
+#ifdef WITH_WSREP
+// Aditional Galera thread states
+extern PSI_stage_info stage_waiting_isolation;
+extern PSI_stage_info stage_waiting_certification;
+extern PSI_stage_info stage_waiting_ddl;
+extern PSI_stage_info stage_waiting_flow;
+#endif /* WITH_WSREP */
#ifdef HAVE_PSI_STATEMENT_INTERFACE
/**
diff --git a/sql/opt_histogram_json.cc b/sql/opt_histogram_json.cc
new file mode 100644
index 00000000000..bea18050a59
--- /dev/null
+++ b/sql/opt_histogram_json.cc
@@ -0,0 +1,1200 @@
+/*
+ Copyright (c) 2021, 2022, MariaDB Corporation.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include "mariadb.h"
+#include "sql_base.h"
+#include "my_json_writer.h"
+#include "sql_statistics.h"
+#include "opt_histogram_json.h"
+
+
+/*
+ @brief
+ Un-escape a JSON string and save it into *out.
+
+ @detail
+ There's no way to tell how much space is needed for the output.
+ Start with a small string and increase its size until json_unescape()
+ succeeds.
+*/
+
+static bool json_unescape_to_string(const char *val, int val_len, String* out)
+{
+ // Make sure 'out' has some memory allocated.
+ if (!out->alloced_length() && out->alloc(128))
+ return true;
+
+ while (1)
+ {
+ uchar *buf= (uchar*)out->ptr();
+ out->length(out->alloced_length());
+
+ int res= json_unescape(&my_charset_utf8mb4_bin,
+ (const uchar*)val,
+ (const uchar*)val + val_len,
+ out->charset(),
+ buf, buf + out->length());
+ if (res >= 0)
+ {
+ out->length(res);
+ return false; // Ok
+ }
+
+ // We get here if the unescaped string didn't fit into memory.
+ if (out->alloc(out->alloced_length()*2))
+ return true;
+ }
+}
+
+
+/*
+ @brief
+ Escape a JSON string and save it into *out.
+
+ @detail
+ There's no way to tell how much space is needed for the output.
+ Start with a small string and increase its size until json_escape()
+ succeeds.
+*/
+
+static int json_escape_to_string(const String *str, String* out)
+{
+ // Make sure 'out' has some memory allocated.
+ if (!out->alloced_length() && out->alloc(128))
+ return JSON_ERROR_OUT_OF_SPACE;
+
+ while (1)
+ {
+ uchar *buf= (uchar*)out->ptr();
+ out->length(out->alloced_length());
+ const uchar *str_ptr= (const uchar*)str->ptr();
+
+ int res= json_escape(str->charset(),
+ str_ptr,
+ str_ptr + str->length(),
+ &my_charset_utf8mb4_bin,
+ buf, buf + out->length());
+ if (res >= 0)
+ {
+ out->length(res);
+ return 0; // Ok
+ }
+
+ if (res != JSON_ERROR_OUT_OF_SPACE)
+ return res; // Some conversion error
+
+ // Out of space error. Try with a bigger buffer
+ if (out->alloc(out->alloced_length()*2))
+ return JSON_ERROR_OUT_OF_SPACE;
+ }
+}
+
+
+class Histogram_json_builder : public Histogram_builder
+{
+ Histogram_json_hb *histogram;
+ /* Number of buckets in the histogram */
+ uint hist_width;
+
+ /*
+ Number of rows that we intend to have in the bucket. That is, this is
+
+ n_rows_in_table / hist_width
+
+ Actual number of rows in the buckets we produce may vary because of
+ "popular values" and rounding.
+ */
+ longlong bucket_capacity;
+
+ /* Number of the buckets already collected */
+ uint n_buckets_collected;
+
+ /*
+ TRUE means do not try to represent values as UTF-8 text in histogram
+ storage. Use start_hex/end_hex for all values.
+ */
+ bool force_binary;
+
+ /* Data about the bucket we are filling now */
+ struct CurBucket
+ {
+ /* Number of values in the bucket so far. */
+ longlong size;
+
+ /* Number of distinct values in the bucket */
+ int ndv;
+ };
+ CurBucket bucket;
+
+ /* Used to create the JSON representation of the histogram. */
+ Json_writer writer;
+
+public:
+
+ Histogram_json_builder(Histogram_json_hb *hist, Field *col, uint col_len,
+ ha_rows rows)
+ : Histogram_builder(col, col_len, rows), histogram(hist)
+ {
+ /*
+ When computing number of rows in the bucket, round it UP. This way, we
+ will not end up with a histogram that has more buckets than intended.
+
+ We may end up producing a histogram with fewer buckets than intended, but
+ this is considered tolerable.
+ */
+ bucket_capacity= (longlong)round(rows2double(records) / histogram->get_width() + 0.5);
+ if (bucket_capacity == 0)
+ bucket_capacity= 1;
+ hist_width= histogram->get_width();
+ n_buckets_collected= 0;
+ bucket.ndv= 0;
+ bucket.size= 0;
+ force_binary= (col->type() == MYSQL_TYPE_BIT);
+
+ writer.start_object();
+ append_histogram_params();
+
+ writer.add_member(Histogram_json_hb::JSON_NAME).start_array();
+ }
+
+ ~Histogram_json_builder() override = default;
+
+private:
+ bool bucket_is_empty() { return bucket.ndv == 0; }
+
+ void append_histogram_params()
+ {
+ char buf[128];
+ String str(buf, sizeof(buf), system_charset_info);
+ THD *thd= current_thd;
+ timeval tv= {thd->query_start(), 0}; // we do not need microseconds
+
+ Timestamp(tv).to_datetime(thd).to_string(&str, 0);
+ writer.add_member("target_histogram_size").add_ull(hist_width);
+ writer.add_member("collected_at").add_str(str.ptr());
+ writer.add_member("collected_by").add_str(server_version);
+ }
+ /*
+ Flush the current bucket out (to JSON output), and set it to be empty.
+ */
+ void finalize_bucket()
+ {
+ double fract= (double) bucket.size / records;
+ writer.add_member("size").add_double(fract);
+ writer.add_member("ndv").add_ll(bucket.ndv);
+ writer.end_object();
+ n_buckets_collected++;
+
+ bucket.ndv= 0;
+ bucket.size= 0;
+ }
+
+ /*
+ Same as finalize_bucket() but also provide the bucket's end value.
+ */
+ bool finalize_bucket_with_end_value(void *elem)
+ {
+ if (append_column_value(elem, false))
+ return true;
+ finalize_bucket();
+ return false;
+ }
+
+ /*
+ Write the first value group to the bucket.
+ @param elem The value we are writing
+ @param cnt The number of such values.
+ */
+ bool start_bucket(void *elem, longlong cnt)
+ {
+ DBUG_ASSERT(bucket.size == 0);
+ writer.start_object();
+ if (append_column_value(elem, true))
+ return true;
+
+ bucket.ndv= 1;
+ bucket.size= cnt;
+ return false;
+ }
+
+ /*
+ Append the passed value into the JSON writer as string value
+ */
+ bool append_column_value(void *elem, bool is_start)
+ {
+ StringBuffer<MAX_FIELD_WIDTH> val;
+
+ // Get the text representation of the value
+ column->store_field_value((uchar*) elem, col_length);
+ String *str= column->val_str(&val);
+
+ // Escape the value for JSON
+ StringBuffer<MAX_FIELD_WIDTH> escaped_val;
+ int rc= JSON_ERROR_ILLEGAL_SYMBOL;
+ if (!force_binary)
+ {
+ rc= json_escape_to_string(str, &escaped_val);
+ if (!rc)
+ {
+ writer.add_member(is_start? "start": "end");
+ writer.add_str(escaped_val.c_ptr_safe());
+ return false;
+ }
+ }
+ if (rc == JSON_ERROR_ILLEGAL_SYMBOL)
+ {
+ escaped_val.set_hex(val.ptr(), val.length());
+ writer.add_member(is_start? "start_hex": "end_hex");
+ writer.add_str(escaped_val.c_ptr_safe());
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ Append a value group of cnt values.
+ */
+ void append_to_bucket(longlong cnt)
+ {
+ bucket.ndv++;
+ bucket.size += cnt;
+ }
+
+public:
+ /*
+ @brief
+ Add data to the histogram.
+
+ @detail
+ The call signals to add a "value group" of elem_cnt rows, each of which
+ has the same value that is provided in *elem.
+
+ Subsequent next() calls will add values that are greater than the
+ current one.
+
+ @return
+ 0 - OK
+ */
+ int next(void *elem, element_count elem_cnt) override
+ {
+ counters.next(elem, elem_cnt);
+ ulonglong count= counters.get_count();
+
+ /*
+ Ok, we've got a "value group" of elem_cnt identical values.
+
+ If we take the values from the value group and put them into
+ the current bucket, how many values will be left after we've
+ filled the bucket?
+ */
+ longlong overflow= bucket.size + elem_cnt - bucket_capacity;
+
+ /*
+ Case #1: This value group should be put into a separate bucket, if
+ A. It fills the current bucket and also fills the next bucket, OR
+ B. It fills the current bucket, which was empty.
+ */
+ if (overflow >= bucket_capacity || (bucket_is_empty() && overflow >= 0))
+ {
+ // Finalize the current bucket
+ if (!bucket_is_empty())
+ finalize_bucket();
+
+ // Start/end the separate bucket for this value group.
+ if (start_bucket(elem, elem_cnt))
+ return 1; // OOM
+
+ if (records == count)
+ {
+ if (finalize_bucket_with_end_value(elem))
+ return 1;
+ }
+ else
+ finalize_bucket();
+ }
+ else if (overflow >= 0)
+ {
+ /*
+ Case #2: is when Case#1 doesn't hold, but we can still fill the
+ current bucket.
+ */
+
+ // If the bucket was empty, it would have been case #1.
+ DBUG_ASSERT(!bucket_is_empty());
+
+ /*
+ Finalize the current bucket. Put there enough values to make it hold
+ bucket_capacity values.
+ */
+ append_to_bucket(bucket_capacity - bucket.size);
+ if (records == count && !overflow)
+ {
+ if (finalize_bucket_with_end_value(elem))
+ return 1;
+ }
+ else
+ finalize_bucket();
+
+ if (overflow > 0)
+ {
+ // Then, start the new bucket with the remaining values.
+ if (start_bucket(elem, overflow))
+ return 1;
+ }
+ }
+ else
+ {
+ // Case #3: there's not enough values to fill the current bucket.
+ if (bucket_is_empty())
+ {
+ if (start_bucket(elem, elem_cnt))
+ return 1;
+ }
+ else
+ append_to_bucket(elem_cnt);
+ }
+
+ if (records == count)
+ {
+ // This is the final value group.
+ if (!bucket_is_empty())
+ {
+ if (finalize_bucket_with_end_value(elem))
+ return 1;
+ }
+ }
+ return 0;
+ }
+
+ /*
+ @brief
+ Finalize the creation of histogram
+ */
+ void finalize() override
+ {
+ writer.end_array();
+ writer.end_object();
+ Binary_string *json_string= (Binary_string *) writer.output.get_string();
+ histogram->set_json_text(n_buckets_collected,
+ json_string->c_ptr(),
+ (size_t)json_string->length());
+ }
+};
+
+
+Histogram_builder *Histogram_json_hb::create_builder(Field *col, uint col_len,
+ ha_rows rows)
+{
+ return new Histogram_json_builder(this, col, col_len, rows);
+}
+
+
+void Histogram_json_hb::init_for_collection(MEM_ROOT *mem_root,
+ Histogram_type htype_arg,
+ ulonglong size_arg)
+{
+ DBUG_ASSERT(htype_arg == JSON_HB);
+ size= (size_t)size_arg;
+}
+
+
+/*
+ A syntax sugar interface to json_string_t
+*/
+class Json_string
+{
+ json_string_t str;
+public:
+ explicit Json_string(const char *name)
+ {
+ json_string_set_str(&str, (const uchar*)name,
+ (const uchar*)name + strlen(name));
+ json_string_set_cs(&str, system_charset_info);
+ }
+ json_string_t *get() { return &str; }
+};
+
+
+/*
+ This [partially] saves the JSON parser state and then can rollback the parser
+ to it.
+
+ The goal of this is to be able to make multiple json_key_matches() calls:
+
+ Json_saved_parser_state save(je);
+ if (json_key_matches(je, KEY_NAME_1)) {
+ ...
+ return;
+ }
+ save.restore_to(je);
+ if (json_key_matches(je, KEY_NAME_2)) {
+ ...
+ }
+
+ This allows one to parse JSON objects where [optional] members come in any
+ order.
+*/
+
+class Json_saved_parser_state
+{
+ const uchar *c_str;
+ my_wc_t c_next;
+ int state;
+public:
+ explicit Json_saved_parser_state(const json_engine_t *je) :
+ c_str(je->s.c_str),
+ c_next(je->s.c_next),
+ state(je->state)
+ {}
+ void restore_to(json_engine_t *je)
+ {
+ je->s.c_str= c_str;
+ je->s.c_next= c_next;
+ je->state= state;
+ }
+};
+
+
+/*
+ @brief
+ Read a constant from JSON document and save it in *out.
+
+ @detail
+ The JSON document stores constant in text form, we need to save it in
+ KeyTupleFormat. String constants in JSON may be escaped.
+*/
+
+bool read_bucket_endpoint(json_engine_t *je, Field *field, String *out,
+ const char **err)
+{
+ if (json_read_value(je))
+ return true;
+
+ if (je->value_type != JSON_VALUE_STRING &&
+ je->value_type != JSON_VALUE_NUMBER)
+ {
+ *err= "String or number expected";
+ return true;
+ }
+
+ const char* je_value= (const char*)je->value;
+ if (je->value_type == JSON_VALUE_STRING && je->value_escaped)
+ {
+ StringBuffer<128> unescape_buf;
+ if (json_unescape_to_string(je_value, je->value_len, &unescape_buf))
+ {
+ *err= "Un-escape error";
+ return true;
+ }
+ field->store_text(unescape_buf.ptr(), unescape_buf.length(),
+ unescape_buf.charset());
+ }
+ else
+ field->store_text(je_value, je->value_len, &my_charset_utf8mb4_bin);
+
+ out->alloc(field->pack_length());
+ uint bytes= field->get_key_image((uchar*)out->ptr(),
+ field->key_length(), Field::itRAW);
+ out->length(bytes);
+ return false;
+}
+
+
+bool read_hex_bucket_endpoint(json_engine_t *je, Field *field, String *out,
+ const char **err)
+{
+ if (json_read_value(je))
+ return true;
+
+ if (je->value_type != JSON_VALUE_STRING || je->value_escaped ||
+ (je->value_len & 1))
+ {
+ *err= "Expected a hex string";
+ return true;
+ }
+ StringBuffer<128> buf;
+
+ for (auto pc= je->value; pc < je->value + je->value_len; pc+=2)
+ {
+ int hex_char1= hexchar_to_int(pc[0]);
+ int hex_char2= hexchar_to_int(pc[1]);
+ if (hex_char1 == -1 || hex_char2 == -1)
+ {
+ *err= "Expected a hex string";
+ return true;
+ }
+ buf.append((hex_char1 << 4) | hex_char2);
+ }
+
+ field->store_text(buf.ptr(), buf.length(), field->charset());
+ out->alloc(field->pack_length());
+ uint bytes= field->get_key_image((uchar*)out->ptr(),
+ field->key_length(), Field::itRAW);
+ out->length(bytes);
+ return false;
+}
+
+
+/*
+ @brief Parse a JSON reprsentation for one histogram bucket
+
+ @param je The JSON parser object
+ @param field Table field we are using histogram (used to convert
+ endpoints from text representation to binary)
+ @param total_size INOUT Fraction of the table rows in the buckets parsed so
+ far.
+ @param assigned_last_end OUT TRUE<=> The bucket had "end" members, the
+ function has saved it in
+ this->last_bucket_end_endp
+ @param err OUT If function returns 1, this *may* be set to point to text
+ describing the error.
+
+ @detail
+
+ Parse a JSON object in this form:
+
+ { "start": "value", "size":nnn.nn, "ndv": nnn, "end": "value"}
+
+ Unknown members are ignored.
+
+ @return
+ 0 OK
+ 1 Parse Error
+ -1 EOF
+*/
+int Histogram_json_hb::parse_bucket(json_engine_t *je, Field *field,
+ double *total_size,
+ bool *assigned_last_end,
+ const char **err)
+{
+ *assigned_last_end= false;
+ if (json_scan_next(je))
+ return 1;
+ if (je->state != JST_VALUE)
+ {
+ if (je->state == JST_ARRAY_END)
+ return -1; // EOF
+ else
+ return 1; // An error
+ }
+
+ if (json_scan_next(je) || je->state != JST_OBJ_START)
+ {
+ *err= "Expected an object in the buckets array";
+ return 1;
+ }
+
+ bool have_start= false;
+ bool have_size= false;
+ bool have_ndv= false;
+
+ double size_d;
+ longlong ndv_ll= 0;
+ StringBuffer<128> value_buf;
+ int rc;
+
+ while (!(rc= json_scan_next(je)) && je->state != JST_OBJ_END)
+ {
+ Json_saved_parser_state save1(je);
+ Json_string start_str("start");
+ if (json_key_matches(je, start_str.get()))
+ {
+ if (read_bucket_endpoint(je, field, &value_buf, err))
+ return 1;
+
+ have_start= true;
+ continue;
+ }
+ save1.restore_to(je);
+
+ Json_string size_str("size");
+ if (json_key_matches(je, size_str.get()))
+ {
+ if (json_read_value(je))
+ return 1;
+
+ const char *size= (const char*)je->value_begin;
+ char *size_end= (char*)je->value_end;
+ int conv_err;
+ size_d= my_strtod(size, &size_end, &conv_err);
+ if (conv_err)
+ {
+ *err= ".size member must be a floating-point value";
+ return 1;
+ }
+ have_size= true;
+ continue;
+ }
+ save1.restore_to(je);
+
+ Json_string ndv_str("ndv");
+ if (json_key_matches(je, ndv_str.get()))
+ {
+ if (json_read_value(je))
+ return 1;
+
+ const char *ndv= (const char*)je->value_begin;
+ char *ndv_end= (char*)je->value_end;
+ int conv_err;
+ ndv_ll= my_strtoll10(ndv, &ndv_end, &conv_err);
+ if (conv_err)
+ {
+ *err= ".ndv member must be an integer value";
+ return 1;
+ }
+ have_ndv= true;
+ continue;
+ }
+ save1.restore_to(je);
+
+ Json_string end_str("end");
+ if (json_key_matches(je, end_str.get()))
+ {
+ if (read_bucket_endpoint(je, field, &value_buf, err))
+ return 1;
+ last_bucket_end_endp.assign(value_buf.ptr(), value_buf.length());
+ *assigned_last_end= true;
+ continue;
+ }
+ save1.restore_to(je);
+
+ // Less common endoints:
+ Json_string start_hex_str("start_hex");
+ if (json_key_matches(je, start_hex_str.get()))
+ {
+ if (read_hex_bucket_endpoint(je, field, &value_buf, err))
+ return 1;
+
+ have_start= true;
+ continue;
+ }
+ save1.restore_to(je);
+
+ Json_string end_hex_str("end_hex");
+ if (json_key_matches(je, end_hex_str.get()))
+ {
+ if (read_hex_bucket_endpoint(je, field, &value_buf, err))
+ return 1;
+ last_bucket_end_endp.assign(value_buf.ptr(), value_buf.length());
+ *assigned_last_end= true;
+ continue;
+ }
+ save1.restore_to(je);
+
+
+ // Some unknown member. Skip it.
+ if (json_skip_key(je))
+ return 1;
+ }
+
+ if (rc)
+ return 1;
+
+ if (!have_start)
+ {
+ *err= "\"start\" element not present";
+ return 1;
+ }
+ if (!have_size)
+ {
+ *err= "\"size\" element not present";
+ return 1;
+ }
+ if (!have_ndv)
+ {
+ *err= "\"ndv\" element not present";
+ return 1;
+ }
+
+ *total_size += size_d;
+
+ buckets.push_back({std::string(value_buf.ptr(), value_buf.length()),
+ *total_size, ndv_ll});
+
+ return 0; // Ok, continue reading
+}
+
+
+/*
+ @brief
+ Parse the histogram from its on-disk JSON representation
+
+ @detail
+ See opt_histogram_json.h, class Histogram_json_hb for description of the
+ data format.
+
+ @return
+ false OK
+ True Error
+*/
+
+bool Histogram_json_hb::parse(MEM_ROOT *mem_root, const char *db_name,
+ const char *table_name, Field *field,
+ Histogram_type type_arg,
+ const char *hist_data, size_t hist_data_len)
+{
+ json_engine_t je;
+ int rc;
+ const char *err= "JSON parse error";
+ double total_size;
+ int end_element;
+ bool end_assigned;
+ DBUG_ENTER("Histogram_json_hb::parse");
+ DBUG_ASSERT(type_arg == JSON_HB);
+
+ json_scan_start(&je, &my_charset_utf8mb4_bin,
+ (const uchar*)hist_data,
+ (const uchar*)hist_data+hist_data_len);
+
+ if (json_scan_next(&je))
+ goto err;
+
+ if (je.state != JST_OBJ_START)
+ {
+ err= "Root JSON element must be a JSON object";
+ goto err;
+ }
+
+ while (1)
+ {
+ if (json_scan_next(&je))
+ goto err;
+ if (je.state == JST_OBJ_END)
+ break; // End of object
+
+ if (je.state != JST_KEY)
+ goto err; // Can' really have this: JSON object has keys in it
+
+ Json_string hist_key_name(JSON_NAME);
+ if (json_key_matches(&je, hist_key_name.get()))
+ {
+ total_size= 0.0;
+ end_element= -1;
+ if (json_scan_next(&je))
+ goto err;
+
+ if (je.state != JST_ARRAY_START)
+ {
+ err= "histogram_hb must contain an array";
+ goto err;
+ }
+
+ while (!(rc= parse_bucket(&je, field, &total_size, &end_assigned, &err)))
+ {
+ if (end_assigned && end_element != -1)
+ end_element= (int)buckets.size();
+ }
+ if (rc > 0) // Got error other than EOF
+ goto err;
+ }
+ else
+ {
+ // Some unknown member. Skip it.
+ if (json_skip_key(&je))
+ return 1;
+ }
+ }
+
+ if (buckets.size() < 1)
+ {
+ err= "Histogram must have at least one bucket";
+ goto err;
+ }
+
+ if (end_element == -1)
+ {
+ buckets.back().start_value= last_bucket_end_endp;
+ }
+ else if (end_element < (int)buckets.size())
+ {
+ err= ".end is only allowed in the last bucket";
+ goto err;
+ }
+
+ DBUG_RETURN(false); // Ok
+err:
+ THD *thd= current_thd;
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_JSON_HISTOGRAM_PARSE_FAILED,
+ ER_THD(thd, ER_JSON_HISTOGRAM_PARSE_FAILED),
+ db_name, table_name,
+ err, (je.s.c_str - (const uchar*)hist_data));
+ sql_print_error(ER_THD(thd, ER_JSON_HISTOGRAM_PARSE_FAILED),
+ db_name, table_name, err,
+ (je.s.c_str - (const uchar*)hist_data));
+
+ DBUG_RETURN(true);
+}
+
+
+static
+void store_key_image_to_rec_no_null(Field *field, const char *ptr, size_t len)
+{
+ MY_BITMAP *old_map= dbug_tmp_use_all_columns(field->table,
+ &field->table->write_set);
+ field->set_key_image((const uchar*)ptr, (uint)len);
+ dbug_tmp_restore_column_map(&field->table->write_set, old_map);
+}
+
+
+static
+double position_in_interval(Field *field, const uchar *key, uint key_len,
+ const std::string& left, const std::string& right)
+{
+ double res;
+ if (field->pos_through_val_str())
+ {
+ StringBuffer<64> buf1, buf2, buf3;
+
+ store_key_image_to_rec_no_null(field, left.data(), left.size());
+ String *min_str= field->val_str(&buf1);
+ /*
+ Make sure we've saved a copy of the data, not a pointer into the
+ field->ptr. We will overwrite the contents of field->ptr with the next
+ store_key_image_to_rec_no_null call
+ */
+ if (&buf1 != min_str)
+ buf1.copy(*min_str);
+ else
+ buf1.copy();
+
+ store_key_image_to_rec_no_null(field, right.data(), right.size());
+ String *max_str= field->val_str(&buf2);
+ /* Same as above */
+ if (&buf2 != max_str)
+ buf2.copy(*max_str);
+ else
+ buf2.copy();
+
+ store_key_image_to_rec_no_null(field, (const char*)key, key_len);
+ String *midp_str= field->val_str(&buf3);
+
+ res= pos_in_interval_for_string(field->charset(),
+ (const uchar*)midp_str->ptr(), midp_str->length(),
+ (const uchar*)buf1.ptr(), buf1.length(),
+ (const uchar*)buf2.ptr(), buf2.length());
+ }
+ else
+ {
+ store_key_image_to_rec_no_null(field, left.data(), field->key_length());
+ double min_val_real= field->val_real();
+
+ store_key_image_to_rec_no_null(field, right.data(), field->key_length());
+ double max_val_real= field->val_real();
+
+ store_key_image_to_rec_no_null(field, (const char*)key, field->key_length());
+ double midp_val_real= field->val_real();
+
+ res= pos_in_interval_for_double(midp_val_real, min_val_real, max_val_real);
+ }
+ return res;
+}
+
+
+double Histogram_json_hb::point_selectivity(Field *field, key_range *endpoint,
+ double avg_sel)
+{
+ const uchar *key = endpoint->key;
+ if (field->real_maybe_null())
+ key++;
+
+ // If the value is outside of the histogram's range, this will "clip" it to
+ // first or last bucket.
+ int endp_cmp;
+ int idx= find_bucket(field, key, &endp_cmp);
+
+ double sel;
+
+ if (buckets[idx].ndv == 1 && (endp_cmp!=0))
+ {
+ /*
+ The bucket has a single value and it doesn't match! Return a very
+ small value.
+ */
+ sel= 0.0;
+ }
+ else
+ {
+ /*
+ We get here when:
+ * The bucket has one value and this is the value we are looking for.
+ * The bucket has multiple values. Then, assume
+ */
+ sel= (buckets[idx].cum_fract - get_left_fract(idx)) / buckets[idx].ndv;
+ }
+ return sel;
+}
+
+
+double Histogram_json_hb::get_left_fract(int idx)
+{
+ if (!idx)
+ return 0.0;
+ else
+ return buckets[idx-1].cum_fract;
+}
+
+std::string& Histogram_json_hb::get_end_value(int idx)
+{
+ if (idx == (int)buckets.size()-1)
+ return last_bucket_end_endp;
+ else
+ return buckets[idx+1].start_value;
+}
+
+/*
+ @param field The table field histogram is for. We don't care about the
+ field's current value, we only need its virtual functions to
+ perform various operations
+ @param min_endp Left endpoint, or NULL if there is none
+ @param max_endp Right endpoint, or NULL if there is none
+ @param avg_sel Average selectivity of "field=const" equality for this field
+
+ @return
+ Range selectivity: a number between 0.0 and 1.0.
+
+ @note
+ This may return 0.0. Adjustments to avoid multiply-by-zero meltdown are
+ made elsewhere.
+*/
+
+double Histogram_json_hb::range_selectivity(Field *field, key_range *min_endp,
+ key_range *max_endp, double avg_sel)
+{
+ double min, max;
+
+ if (min_endp && !(field->real_maybe_null() && min_endp->key[0]))
+ {
+ bool exclusive_endp= (min_endp->flag == HA_READ_AFTER_KEY)? true: false;
+ const uchar *min_key= min_endp->key;
+ uint min_key_len= min_endp->length;
+ if (field->real_maybe_null())
+ {
+ min_key++;
+ min_key_len--;
+ }
+
+ // Find the leftmost bucket that contains the lookup value.
+ // (If the lookup value is to the left of all buckets, find bucket #0)
+ int endp_cmp;
+ int idx= find_bucket(field, min_key, &endp_cmp);
+
+ double sel;
+ // Special handling for buckets with ndv=1:
+ if (buckets[idx].ndv == 1)
+ {
+ if (endp_cmp < 0)
+ sel= 0.0;
+ else if (endp_cmp > 0)
+ sel= 1.0;
+ else // endp_cmp == 0.0
+ sel= (exclusive_endp)? 1.0 : 0.0;
+ }
+ else
+ {
+ sel= position_in_interval(field, min_key, min_key_len,
+ buckets[idx].start_value,
+ get_end_value(idx));
+ }
+ double left_fract= get_left_fract(idx);
+ min= left_fract + sel * (buckets[idx].cum_fract - left_fract);
+ }
+ else
+ min= 0.0;
+
+ if (max_endp)
+ {
+ // The right endpoint cannot be NULL
+ DBUG_ASSERT(!(field->real_maybe_null() && max_endp->key[0]));
+ bool inclusive_endp= (max_endp->flag == HA_READ_AFTER_KEY)? true: false;
+ const uchar *max_key= max_endp->key;
+ uint max_key_len= max_endp->length;
+ if (field->real_maybe_null())
+ {
+ max_key++;
+ max_key_len--;
+ }
+ int endp_cmp;
+ int idx= find_bucket(field, max_key, &endp_cmp);
+
+ if ((endp_cmp == 0) && !inclusive_endp)
+ {
+ /*
+ The range is "col < $CONST" and we've found a bucket starting with
+ $CONST.
+ */
+ if (idx > 0)
+ {
+ // Move to the previous bucket
+ endp_cmp= 1;
+ idx--;
+ }
+ else
+ endp_cmp= -1;
+ }
+ double sel;
+
+ // Special handling for buckets with ndv=1:
+ if (buckets[idx].ndv == 1)
+ {
+ if (endp_cmp < 0)
+ sel= 0.0;
+ else if (endp_cmp > 0)
+ sel= 1.0;
+ else // endp_cmp == 0.0
+ sel= inclusive_endp? 1.0 : 0.0;
+ }
+ else
+ {
+ sel= position_in_interval(field, max_key, max_key_len,
+ buckets[idx].start_value,
+ get_end_value(idx));
+ }
+ double left_fract= get_left_fract(idx);
+ max= left_fract + sel * (buckets[idx].cum_fract - left_fract);
+ }
+ else
+ max= 1.0;
+
+ if (min > max)
+ {
+ /*
+ This can happen due to rounding errors.
+
+ What is the acceptable error size? Json_writer::add_double() uses
+ %.11lg format. This gives 9 digits after the dot. A histogram may have
+ hundreds of buckets, let's multiply the error by 1000. 9-3=6
+ */
+ DBUG_ASSERT(max < min + 1e-6);
+ max= min;
+ }
+ return max - min;
+}
+
+
+void Histogram_json_hb::serialize(Field *field)
+{
+ field->store(json_text.data(), json_text.size(), &my_charset_bin);
+}
+
+
+#ifndef DBUG_OFF
+static int SGN(int x)
+{
+ if (!x)
+ return 0;
+ return (x < 0)? -1 : 1;
+}
+#endif
+
+
+/*
+ @brief
+ Find the leftmost histogram bucket such that "lookup_val >= start_value".
+
+ @param field Field object (used to do value comparisons)
+ @param lookup_val The lookup value in KeyTupleFormat.
+ @param cmp OUT How the lookup_val compares to found_bucket.left_bound:
+ 0 - lookup_val == bucket.left_bound
+ >0 - lookup_val > bucket.left_bound (the most typical)
+ <0 - lookup_val < bucket.left_bound. This can only happen
+ for the first bucket, for all other buckets we would just
+ pick the previous bucket and have cmp>=0.
+ @return
+ The bucket index
+*/
+
+int Histogram_json_hb::find_bucket(const Field *field, const uchar *lookup_val,
+ int *cmp)
+{
+ int res;
+ int low= 0;
+ int high= (int)buckets.size() - 1;
+ *cmp= 1; // By default, (bucket[retval].start_value < *lookup_val)
+
+ while (low + 1 < high)
+ {
+ int middle= (low + high) / 2;
+ res= field->key_cmp((uchar*)buckets[middle].start_value.data(), lookup_val);
+ if (!res)
+ {
+ *cmp= res;
+ low= middle;
+ goto end;
+ }
+ else if (res < 0)
+ low= middle;
+ else //res > 0
+ high= middle;
+ }
+
+ /*
+ If low and high were assigned a value in the above loop and we got here,
+ then the following holds:
+
+ bucket[low].start_value < lookup_val < bucket[high].start_value
+
+ Besides that, there are two special cases: low=0 and high=last_bucket.
+ Handle them below.
+ */
+ if (low == 0)
+ {
+ res= field->key_cmp(lookup_val, (uchar*)buckets[0].start_value.data());
+ if (res <= 0)
+ *cmp= res;
+ else // res>0, lookup_val > buckets[0].start_value
+ {
+ res= field->key_cmp(lookup_val, (uchar*)buckets[high].start_value.data());
+ if (res >= 0) // lookup_val >= buckets[high].start_value
+ {
+ // Move to that bucket
+ low= high;
+ *cmp= res;
+ }
+ else
+ *cmp= 1;
+ }
+ }
+ else if (high == (int)buckets.size() - 1)
+ {
+ res= field->key_cmp(lookup_val, (uchar*)buckets[high].start_value.data());
+ if (res >= 0)
+ {
+ // Ok the value is in the last bucket.
+ *cmp= res;
+ low= high;
+ }
+ else
+ {
+ // The value is in the 'low' bucket.
+ res= field->key_cmp(lookup_val, (uchar*)buckets[low].start_value.data());
+ *cmp= res;
+ }
+ }
+
+end:
+ // Verification: *cmp has correct value
+ DBUG_ASSERT(SGN(*cmp) ==
+ SGN(field->key_cmp(lookup_val,
+ (uchar*)buckets[low].start_value.data())));
+ // buckets[low] <= lookup_val, with one exception of the first bucket.
+ DBUG_ASSERT(low == 0 ||
+ field->key_cmp((uchar*)buckets[low].start_value.data(), lookup_val)<= 0);
+ // buckets[low+1] > lookup_val, with one exception of the last bucket
+ DBUG_ASSERT(low == (int)buckets.size()-1 ||
+ field->key_cmp((uchar*)buckets[low+1].start_value.data(), lookup_val)> 0);
+ return low;
+}
diff --git a/sql/opt_histogram_json.h b/sql/opt_histogram_json.h
new file mode 100644
index 00000000000..e9b69869f4b
--- /dev/null
+++ b/sql/opt_histogram_json.h
@@ -0,0 +1,148 @@
+/*
+ Copyright (c) 2021, MariaDB Corporation.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include "sql_statistics.h"
+
+/*
+ An equi-height histogram which stores real values for bucket bounds.
+
+ Handles @@histogram_type=JSON_HB
+
+ Histogram format in JSON:
+
+ {
+ // The next three are saved but not currently analyzed:
+ "target_histogram_size": nnn,
+ "collected_at": "(date and time)",
+ "collected_by": "(server version)",
+
+ "histogram_hb": [
+ { "start": "value", "size":nnn.nn, "ndv": nnn },
+ ...
+
+ // Optionally, start and/or end can be replaced with _hex variant
+ { "start_hex: "value", "size":nnn.nn, "ndv":nnn},
+
+ ...
+ { "start": "value", "size":nnn.nn, "ndv": nnn, "end": "value"},
+ ]
+ }
+
+ Histogram is a JSON object. It has some global properties and "histogram_hb"
+ member whose value is a JSON array of histogram buckets.
+
+ Each bucket is an object with these members:
+ "start" - the first value in the bucket.
+ "size" - fraction of table rows that is contained in the bucket.
+ "ndv" - Number of Distinct Values in the bucket.
+ "end" - Optionally, the last value in the bucket.
+
+ A bucket is a single-point bucket if it has ndv=1.
+
+ Most buckets have no "end" member: the bucket is assumed to contain all
+ values up to the "start" of the next bucket.
+
+ The exception is single-point buckets where last value is the same as the
+ first value.
+
+ start/end can be replaced with start_hex/end_hex. In _hex variant, the
+ constant is encoded in hex. This encoding is used to handle so called
+ "unassigned characters": some non-UTF8 charsets have byte combinations that
+ are not mapped to any UTF8 character.
+*/
+
+class Histogram_json_hb : public Histogram_base
+{
+ size_t size; /* Number of elements in the histogram */
+
+ /* Collection-time only: collected histogram in the JSON form. */
+ std::string json_text;
+
+ struct Bucket
+ {
+ // The left endpoint in KeyTupleFormat. The endpoint is inclusive, this
+ // value is in this bucket.
+ std::string start_value;
+
+ // Cumulative fraction: The fraction of table rows that fall into this
+ // and preceding buckets.
+ double cum_fract;
+
+ // Number of distinct values in the bucket.
+ longlong ndv;
+ };
+
+ std::vector<Bucket> buckets;
+
+ std::string last_bucket_end_endp;
+
+public:
+ static constexpr const char* JSON_NAME="histogram_hb";
+
+ bool parse(MEM_ROOT *mem_root, const char *db_name, const char *table_name,
+ Field *field, Histogram_type type_arg,
+ const char *hist_data, size_t hist_data_len) override;
+
+ void serialize(Field *field) override;
+
+ Histogram_builder *create_builder(Field *col, uint col_len,
+ ha_rows rows) override;
+
+ // returns number of buckets in the histogram
+ uint get_width() override
+ {
+ return (uint)size;
+ }
+
+ Histogram_type get_type() override
+ {
+ return JSON_HB;
+ }
+
+ /*
+ @brief
+ This used to be the size of the histogram on disk, which was redundant
+ (one can check the size directly). Return the number of buckets instead.
+ */
+ uint get_size() override
+ {
+ return (uint)size;
+ }
+
+ void init_for_collection(MEM_ROOT *mem_root, Histogram_type htype_arg,
+ ulonglong size) override;
+
+ double point_selectivity(Field *field, key_range *endpoint,
+ double avg_sel) override;
+ double range_selectivity(Field *field, key_range *min_endp,
+ key_range *max_endp, double avg_sel) override;
+
+ void set_json_text(ulonglong sz, const char *json_text_arg,
+ size_t json_text_len)
+ {
+ size= (size_t) sz;
+ json_text.assign(json_text_arg, json_text_len);
+ }
+
+private:
+ int parse_bucket(json_engine_t *je, Field *field, double *cumulative_size,
+ bool *assigned_last_end, const char **err);
+
+ double get_left_fract(int idx);
+ std::string& get_end_value(int idx);
+ int find_bucket(const Field *field, const uchar *lookup_val, int *cmp);
+};
+
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index c845147e328..86bd5663623 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
- Copyright (c) 2008, 2020, MariaDB
+ Copyright (c) 2008, 2021, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -1308,7 +1308,7 @@ QUICK_RANGE_SELECT::QUICK_RANGE_SELECT(THD *thd, TABLE *table, uint key_nr,
*create_error= 1;
}
else
- my_bitmap_init(&column_bitmap, bitmap, head->s->fields, FALSE);
+ my_bitmap_init(&column_bitmap, bitmap, head->s->fields);
DBUG_VOID_RETURN;
}
@@ -1906,7 +1906,7 @@ inline void SEL_ARG::make_root()
weight= 1 + (next_key_part? next_key_part->weight : 0);
}
-SEL_ARG::SEL_ARG(Field *f,const uchar *min_value_arg,
+SEL_ARG::SEL_ARG(Field *f, const uchar *min_value_arg,
const uchar *max_value_arg)
:min_flag(0), max_flag(0), maybe_flag(0), maybe_null(f->real_maybe_null()),
elements(1), use_count(1), field(f), min_value((uchar*) min_value_arg),
@@ -1921,7 +1921,8 @@ SEL_ARG::SEL_ARG(Field *field_,uint8 part_,
uchar *min_value_, uchar *max_value_,
uint8 min_flag_,uint8 max_flag_,uint8 maybe_flag_)
:min_flag(min_flag_),max_flag(max_flag_),maybe_flag(maybe_flag_),
- part(part_),maybe_null(field_->real_maybe_null()), elements(1),use_count(1),
+ part(part_),maybe_null(field_->real_maybe_null()),
+ elements(1),use_count(1),
field(field_), min_value(min_value_), max_value(max_value_),
next(0),prev(0),next_key_part(0),color(BLACK),type(KEY_RANGE), weight(1)
{
@@ -1969,7 +1970,8 @@ public:
but we don't know if rounding or truncation happened
(as some Field::store() do not report minor data changes).
*/
- SEL_ARG_LT(THD *thd, const uchar *key, Field *field, Item *value)
+ SEL_ARG_LT(THD *thd, const uchar *key, Field *field,
+ Item *value)
:SEL_ARG_LE(key, field)
{
if (stored_field_cmp_to_item(thd, field, value) == 0)
@@ -2061,7 +2063,8 @@ SEL_ARG *SEL_ARG::clone(RANGE_OPT_PARAM *param, SEL_ARG *new_parent,
}
else
{
- if (!(tmp= new (param->mem_root) SEL_ARG(field,part, min_value,max_value,
+ if (!(tmp= new (param->mem_root) SEL_ARG(field, part,
+ min_value, max_value,
min_flag, max_flag, maybe_flag)))
return 0; // OOM
tmp->parent=new_parent;
@@ -2579,7 +2582,7 @@ static int fill_used_fields_bitmap(PARAM *param)
param->fields_bitmap_size= table->s->column_bitmap_size;
if (!(tmp= (my_bitmap_map*) alloc_root(param->mem_root,
param->fields_bitmap_size)) ||
- my_bitmap_init(&param->needed_fields, tmp, table->s->fields, FALSE))
+ my_bitmap_init(&param->needed_fields, tmp, table->s->fields))
return 1;
bitmap_copy(&param->needed_fields, table->read_set);
@@ -2808,7 +2811,6 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
trace_idx_details.add("usable", false).add("cause", "fulltext");
continue; // ToDo: ft-keys in non-ft ranges, if possible SerG
}
-
trace_idx_details.add("usable", true);
param.key[param.keys]=key_parts;
key_part_info= key_info->key_part;
@@ -2830,6 +2832,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
key_parts->flag= (uint8) key_part_info->key_part_flag;
trace_keypart.add(key_parts->field->field_name);
}
+ trace_keypart.end();
param.real_keynr[param.keys++]=idx;
if (cur_key_len > max_key_len)
max_key_len= cur_key_len;
@@ -3243,6 +3246,7 @@ double records_in_column_ranges(PARAM *param, uint idx,
seq.keyno= idx;
seq.real_keyno= MAX_KEY;
+ seq.key_parts= param->key[idx];
seq.param= param;
seq.start= tree;
seq.is_ror_scan= FALSE;
@@ -3281,7 +3285,10 @@ double records_in_column_ranges(PARAM *param, uint idx,
break;
}
total_rows += rows;
- }
+ }
+ if (total_rows == 0)
+ total_rows= MY_MIN(1, rows2double(param->table->stat_records()));
+
return total_rows;
}
@@ -3370,7 +3377,7 @@ bool calculate_cond_selectivity_for_table(THD *thd, TABLE *table, Item **cond)
my_bitmap_map* buf;
if (!(buf= (my_bitmap_map*)thd->alloc(table->s->column_bitmap_size)))
DBUG_RETURN(TRUE);
- my_bitmap_init(&handled_columns, buf, table->s->fields, FALSE);
+ my_bitmap_init(&handled_columns, buf, table->s->fields);
/*
Calculate the selectivity of the range conditions supported by indexes.
@@ -4158,7 +4165,7 @@ static int find_used_partitions_imerge_list(PART_PRUNE_PARAM *ppar,
*/
return find_used_partitions_imerge(ppar, merges.head());
}
- my_bitmap_init(&all_merges, bitmap_buf, n_bits, FALSE);
+ my_bitmap_init(&all_merges, bitmap_buf, n_bits);
bitmap_set_prefix(&all_merges, n_bits);
List_iterator<SEL_IMERGE> it(merges);
@@ -4432,12 +4439,14 @@ int find_used_partitions(PART_PRUNE_PARAM *ppar, SEL_ARG *key_tree)
key_tree->next_key_part->store_min_key(ppar->key,
&tmp_min_key,
&tmp_min_flag,
- ppar->last_part_partno);
+ ppar->last_part_partno,
+ true);
if (!tmp_max_flag)
key_tree->next_key_part->store_max_key(ppar->key,
&tmp_max_key,
&tmp_max_flag,
- ppar->last_part_partno);
+ ppar->last_part_partno,
+ false);
flag= tmp_min_flag | tmp_max_flag;
}
else
@@ -4814,8 +4823,7 @@ static bool create_partition_index_description(PART_PRUNE_PARAM *ppar)
uint32 bufsize= bitmap_buffer_size(ppar->part_info->num_subparts);
if (!(buf= (my_bitmap_map*) alloc_root(alloc, bufsize)))
return TRUE;
- my_bitmap_init(&ppar->subparts_bitmap, buf, ppar->part_info->num_subparts,
- FALSE);
+ my_bitmap_init(&ppar->subparts_bitmap, buf, ppar->part_info->num_subparts);
}
range_par->key_parts= key_part;
Field **field= (ppar->part_fields)? part_info->part_field_array :
@@ -5642,7 +5650,7 @@ bool create_fields_bitmap(PARAM *param, MY_BITMAP *fields_bitmap)
if (!(bitmap_buf= (my_bitmap_map *) alloc_root(param->mem_root,
param->fields_bitmap_size)))
return TRUE;
- if (my_bitmap_init(fields_bitmap, bitmap_buf, param->table->s->fields, FALSE))
+ if (my_bitmap_init(fields_bitmap, bitmap_buf, param->table->s->fields))
return TRUE;
return FALSE;
@@ -6554,7 +6562,7 @@ ROR_SCAN_INFO *make_ror_scan(const PARAM *param, int idx, SEL_ARG *sel_arg)
DBUG_RETURN(NULL);
if (my_bitmap_init(&ror_scan->covered_fields, bitmap_buf,
- param->table->s->fields, FALSE))
+ param->table->s->fields))
DBUG_RETURN(NULL);
bitmap_clear_all(&ror_scan->covered_fields);
@@ -6671,8 +6679,7 @@ ROR_INTERSECT_INFO* ror_intersect_init(const PARAM *param)
if (!(buf= (my_bitmap_map*) alloc_root(param->mem_root,
param->fields_bitmap_size)))
return NULL;
- if (my_bitmap_init(&info->covered_fields, buf, param->table->s->fields,
- FALSE))
+ if (my_bitmap_init(&info->covered_fields, buf, param->table->s->fields))
return NULL;
info->is_covering= FALSE;
info->index_scan_costs= 0.0;
@@ -7317,7 +7324,7 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
param->fields_bitmap_size);
if (!covered_fields->bitmap ||
my_bitmap_init(covered_fields, covered_fields->bitmap,
- param->table->s->fields, FALSE))
+ param->table->s->fields))
DBUG_RETURN(0);
bitmap_clear_all(covered_fields);
@@ -11536,6 +11543,7 @@ ha_rows check_quick_select(PARAM *param, uint idx, bool index_only,
seq.keyno= idx;
seq.real_keyno= keynr;
+ seq.key_parts= param->key[idx];
seq.param= param;
seq.start= tree;
@@ -11787,6 +11795,46 @@ get_quick_select(PARAM *param,uint idx,SEL_ARG *key_tree, uint mrr_flags,
}
+void SEL_ARG::store_next_min_max_keys(KEY_PART *key,
+ uchar **cur_min_key, uint *cur_min_flag,
+ uchar **cur_max_key, uint *cur_max_flag,
+ int *min_part, int *max_part)
+{
+ DBUG_ASSERT(next_key_part);
+ const bool asc = !(key[next_key_part->part].flag & HA_REVERSE_SORT);
+
+ if (!get_min_flag(key))
+ {
+ if (asc)
+ {
+ *min_part += next_key_part->store_min_key(key, cur_min_key,
+ cur_min_flag, MAX_KEY, true);
+ }
+ else
+ {
+ uint tmp_flag = invert_min_flag(*cur_min_flag);
+ *min_part += next_key_part->store_max_key(key, cur_min_key, &tmp_flag,
+ MAX_KEY, true);
+ *cur_min_flag = invert_max_flag(tmp_flag);
+ }
+ }
+ if (!get_max_flag(key))
+ {
+ if (asc)
+ {
+ *max_part += next_key_part->store_max_key(key, cur_max_key,
+ cur_max_flag, MAX_KEY, false);
+ }
+ else
+ {
+ uint tmp_flag = invert_max_flag(*cur_max_flag);
+ *max_part += next_key_part->store_min_key(key, cur_max_key, &tmp_flag,
+ MAX_KEY, false);
+ *cur_max_flag = invert_min_flag(tmp_flag);
+ }
+ }
+}
+
/*
** Fix this to get all possible sub_ranges
*/
@@ -11800,17 +11848,20 @@ get_quick_keys(PARAM *param,QUICK_RANGE_SELECT *quick,KEY_PART *key,
int min_part= key_tree->part-1, // # of keypart values in min_key buffer
max_part= key_tree->part-1; // # of keypart values in max_key buffer
- if (key_tree->left != &null_element)
+ const bool asc = !(key[key_tree->part].flag & HA_REVERSE_SORT);
+ SEL_ARG *next_tree = asc ? key_tree->left : key_tree->right;
+ if (next_tree != &null_element)
{
- if (get_quick_keys(param,quick,key,key_tree->left,
+ if (get_quick_keys(param,quick,key,next_tree,
min_key,min_key_flag, max_key, max_key_flag))
return 1;
}
uchar *tmp_min_key=min_key,*tmp_max_key=max_key;
- min_part+= key_tree->store_min(key[key_tree->part].store_length,
- &tmp_min_key,min_key_flag);
- max_part+= key_tree->store_max(key[key_tree->part].store_length,
- &tmp_max_key,max_key_flag);
+
+ key_tree->store_min_max(key, key[key_tree->part].store_length,
+ &tmp_min_key, min_key_flag,
+ &tmp_max_key, max_key_flag,
+ &min_part, &max_part);
if (key_tree->next_key_part &&
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE &&
@@ -11820,31 +11871,40 @@ get_quick_keys(PARAM *param,QUICK_RANGE_SELECT *quick,KEY_PART *key,
memcmp(min_key, max_key, (uint)(tmp_max_key - max_key))==0 &&
key_tree->min_flag==0 && key_tree->max_flag==0)
{
+ // psergey-note: simplified the parameters below as follows:
+ // min_key_flag | key_tree->min_flag -> min_key_flag
+ // max_key_flag | key_tree->max_flag -> max_key_flag
if (get_quick_keys(param,quick,key,key_tree->next_key_part,
- tmp_min_key, min_key_flag | key_tree->min_flag,
- tmp_max_key, max_key_flag | key_tree->max_flag))
+ tmp_min_key, min_key_flag,
+ tmp_max_key, max_key_flag))
return 1;
goto end; // Ugly, but efficient
}
{
- uint tmp_min_flag=key_tree->min_flag,tmp_max_flag=key_tree->max_flag;
- if (!tmp_min_flag)
- min_part+= key_tree->next_key_part->store_min_key(key,
- &tmp_min_key,
- &tmp_min_flag,
- MAX_KEY);
- if (!tmp_max_flag)
- max_part+= key_tree->next_key_part->store_max_key(key,
- &tmp_max_key,
- &tmp_max_flag,
- MAX_KEY);
+ uint tmp_min_flag= key_tree->get_min_flag(key);
+ uint tmp_max_flag= key_tree->get_max_flag(key);
+
+ key_tree->store_next_min_max_keys(key,
+ &tmp_min_key, &tmp_min_flag,
+ &tmp_max_key, &tmp_max_flag,
+ &min_part, &max_part);
flag=tmp_min_flag | tmp_max_flag;
}
}
else
{
- flag = (key_tree->min_flag & GEOM_FLAG) ?
- key_tree->min_flag : key_tree->min_flag | key_tree->max_flag;
+ if (asc)
+ {
+ flag= (key_tree->min_flag & GEOM_FLAG) ? key_tree->min_flag:
+ (key_tree->min_flag |
+ key_tree->max_flag);
+ }
+ else
+ {
+ // Invert flags for DESC keypart
+ flag= invert_min_flag(key_tree->min_flag) |
+ invert_max_flag(key_tree->max_flag);
+ }
}
/*
@@ -11905,8 +11965,9 @@ get_quick_keys(PARAM *param,QUICK_RANGE_SELECT *quick,KEY_PART *key,
return 1;
end:
- if (key_tree->right != &null_element)
- return get_quick_keys(param,quick,key,key_tree->right,
+ next_tree= asc ? key_tree->right : key_tree->left;
+ if (next_tree != &null_element)
+ return get_quick_keys(param,quick,key,next_tree,
min_key,min_key_flag,
max_key,max_key_flag);
return 0;
@@ -12628,10 +12689,10 @@ int QUICK_RANGE_SELECT::reset()
if (!mrr_buf_desc)
empty_buf.buffer= empty_buf.buffer_end= empty_buf.end_of_used_area= NULL;
-
- error= file->multi_range_read_init(&seq_funcs, (void*)this, ranges.elements,
- mrr_flags, mrr_buf_desc? mrr_buf_desc:
- &empty_buf);
+
+ error= file->multi_range_read_init(&seq_funcs, (void*)this,
+ (uint)ranges.elements, mrr_flags,
+ mrr_buf_desc? mrr_buf_desc: &empty_buf);
err:
/* Restore bitmaps set on entry */
if (in_ror_merged_scan)
@@ -12743,7 +12804,7 @@ int QUICK_RANGE_SELECT::get_next_prefix(uint prefix_length,
}
}
- uint count= ranges.elements - (uint)(cur_range - (QUICK_RANGE**) ranges.buffer);
+ size_t count= ranges.elements - (size_t)(cur_range - (QUICK_RANGE**) ranges.buffer);
if (count == 0)
{
/* Ranges have already been used up before. None is left for read. */
@@ -12788,7 +12849,7 @@ int QUICK_RANGE_SELECT_GEOM::get_next()
DBUG_RETURN(result);
}
- uint count= ranges.elements - (uint)(cur_range - (QUICK_RANGE**) ranges.buffer);
+ size_t count= ranges.elements - (size_t)(cur_range - (QUICK_RANGE**) ranges.buffer);
if (count == 0)
{
/* Ranges have already been used up before. None is left for read. */
@@ -12829,9 +12890,9 @@ int QUICK_RANGE_SELECT_GEOM::get_next()
bool QUICK_RANGE_SELECT::row_in_ranges()
{
QUICK_RANGE *res;
- uint min= 0;
- uint max= ranges.elements - 1;
- uint mid= (max + min)/2;
+ size_t min= 0;
+ size_t max= ranges.elements - 1;
+ size_t mid= (max + min)/2;
while (min != max)
{
@@ -13035,24 +13096,25 @@ int QUICK_RANGE_SELECT::cmp_next(QUICK_RANGE *range_arg)
key+= store_length, key_part++)
{
int cmp;
+ bool reverse= MY_TEST(key_part->flag & HA_REVERSE_SORT);
store_length= key_part->store_length;
if (key_part->null_bit)
{
if (*key)
{
if (!key_part->field->is_null())
- return 1;
+ return reverse ? 0 : 1;
continue;
}
else if (key_part->field->is_null())
- return 0;
+ return reverse ? 1 : 0;
key++; // Skip null byte
store_length--;
}
if ((cmp=key_part->field->key_cmp(key, key_part->length)) < 0)
- return 0;
+ return reverse ? 1 : 0;
if (cmp > 0)
- return 1;
+ return reverse ? 0 : 1;
}
return (range_arg->flag & NEAR_MAX) ? 1 : 0; // Exact match
}
@@ -13779,6 +13841,17 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree, double read_time)
cause= "not covering";
goto next_index;
}
+
+ {
+ for (uint i= 0; i < table->actual_n_key_parts(cur_index_info); i++)
+ {
+ if (cur_index_info->key_part[i].key_part_flag & HA_REVERSE_SORT)
+ {
+ cause="Reverse-ordered (not supported yet)";
+ goto next_index;
+ }
+ }
+ }
/*
This function is called on the precondition that the index is covering.
@@ -15817,7 +15890,7 @@ int QUICK_GROUP_MIN_MAX_SELECT::next_max_in_range()
DBUG_ASSERT(min_max_ranges.elements > 0);
- for (uint range_idx= min_max_ranges.elements; range_idx > 0; range_idx--)
+ for (size_t range_idx= min_max_ranges.elements; range_idx > 0; range_idx--)
{ /* Search from the right-most range to the left. */
get_dynamic(&min_max_ranges, (uchar*)&cur_range, range_idx - 1);
@@ -16364,7 +16437,7 @@ void QUICK_GROUP_MIN_MAX_SELECT::dbug_dump(int indent, bool verbose)
}
if (min_max_ranges.elements > 0)
{
- fprintf(DBUG_FILE, "%*susing %d quick_ranges for MIN/MAX:\n",
+ fprintf(DBUG_FILE, "%*susing %zu quick_ranges for MIN/MAX:\n",
indent, "", min_max_ranges.elements);
}
}
@@ -16505,6 +16578,7 @@ static void trace_ranges(Json_writer_array *range_trace,
uint n_key_parts= param->table->actual_n_key_parts(keyinfo);
DBUG_ASSERT(range_trace->trace_started());
seq.keyno= idx;
+ seq.key_parts= param->key[idx];
seq.real_keyno= param->real_keynr[idx];
seq.param= param;
seq.start= keypart;
@@ -16582,6 +16656,8 @@ void print_keyparts_name(String *out, const KEY_PART_INFO *key_part,
else
out->append(STRING_WITH_LEN(","));
out->append(key_part->field->field_name);
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ out->append(STRING_WITH_LEN(" DESC"));
}
else
break;
diff --git a/sql/opt_range.h b/sql/opt_range.h
index 6e1dab84e47..a505cd09ea4 100644
--- a/sql/opt_range.h
+++ b/sql/opt_range.h
@@ -54,6 +54,33 @@ struct KEY_PART {
};
+/**
+ A helper function to invert min flags to max flags for DESC key parts.
+ It changes NEAR_MIN, NO_MIN_RANGE to NEAR_MAX, NO_MAX_RANGE appropriately
+*/
+
+inline uint invert_min_flag(uint min_flag)
+{
+ uint max_flag_out = min_flag & ~(NEAR_MIN | NO_MIN_RANGE);
+ if (min_flag & NEAR_MIN) max_flag_out |= NEAR_MAX;
+ if (min_flag & NO_MIN_RANGE) max_flag_out |= NO_MAX_RANGE;
+ return max_flag_out;
+}
+
+
+/**
+ A helper function to invert max flags to min flags for DESC key parts.
+ It changes NEAR_MAX, NO_MAX_RANGE to NEAR_MIN, NO_MIN_RANGE appropriately
+*/
+
+inline uint invert_max_flag(uint max_flag)
+{
+ uint min_flag_out = max_flag & ~(NEAR_MAX | NO_MAX_RANGE);
+ if (max_flag & NEAR_MAX) min_flag_out |= NEAR_MIN;
+ if (max_flag & NO_MAX_RANGE) min_flag_out |= NO_MIN_RANGE;
+ return min_flag_out;
+}
+
class RANGE_OPT_PARAM;
/*
A construction block of the SEL_ARG-graph.
@@ -267,6 +294,8 @@ class RANGE_OPT_PARAM;
- it is a lot easier to compute than computing the number of ranges,
- it can be updated incrementally when performing AND/OR operations on
parts of the graph.
+
+ 6. For handling DESC keyparts, See HowRangeOptimizerHandlesDescKeyparts
*/
class SEL_ARG :public Sql_alloc
@@ -326,11 +355,15 @@ public:
SEL_ARG() = default;
SEL_ARG(SEL_ARG &);
- SEL_ARG(Field *,const uchar *, const uchar *);
- SEL_ARG(Field *field, uint8 part, uchar *min_value, uchar *max_value,
+ SEL_ARG(Field *, const uchar *, const uchar *);
+ SEL_ARG(Field *field, uint8 part,
+ uchar *min_value, uchar *max_value,
uint8 min_flag, uint8 max_flag, uint8 maybe_flag);
+
+ /* This is used to construct degenerate SEL_ARGS like ALWAYS, IMPOSSIBLE, etc */
SEL_ARG(enum Type type_arg)
- :min_flag(0), max_part_no(0) /* first key part means 1. 0 mean 'no parts'*/,
+ :min_flag(0),
+ max_part_no(0) /* first key part means 1. 0 mean 'no parts'*/,
elements(1),use_count(1),left(0),right(0),
next_key_part(0), color(BLACK), type(type_arg), weight(1)
{}
@@ -408,13 +441,14 @@ public:
{
new_max=arg->max_value; flag_max=arg->max_flag;
}
- return new (thd->mem_root) SEL_ARG(field, part, new_min, new_max, flag_min,
+ return new (thd->mem_root) SEL_ARG(field, part,
+ new_min, new_max, flag_min,
flag_max,
MY_TEST(maybe_flag && arg->maybe_flag));
}
SEL_ARG *clone_first(SEL_ARG *arg)
{ // min <= X < arg->min
- return new SEL_ARG(field,part, min_value, arg->min_value,
+ return new SEL_ARG(field, part, min_value, arg->min_value,
min_flag, arg->min_flag & NEAR_MIN ? 0 : NEAR_MAX,
maybe_flag | arg->maybe_flag);
}
@@ -503,6 +537,57 @@ public:
return 0;
}
+ /* Save minimum and maximum, taking index order into account */
+ void store_min_max(KEY_PART *kp,
+ uint length,
+ uchar **min_key, uint min_flag,
+ uchar **max_key, uint max_flag,
+ int *min_part, int *max_part)
+ {
+ if (kp[part].flag & HA_REVERSE_SORT) {
+ *max_part += store_min(length, max_key, min_flag);
+ *min_part += store_max(length, min_key, max_flag);
+ } else {
+ *min_part += store_min(length, min_key, min_flag);
+ *max_part += store_max(length, max_key, max_flag);
+ }
+ }
+ /*
+ Get the flag for range's starting endpoint, taking index order into
+ account.
+ */
+ uint get_min_flag(KEY_PART *kp)
+ {
+ return (kp[part].flag & HA_REVERSE_SORT)? invert_max_flag(max_flag) : min_flag;
+ }
+ /*
+ Get the flag for range's starting endpoint, taking index order into
+ account.
+ */
+ uint get_max_flag(KEY_PART *kp)
+ {
+ return (kp[part].flag & HA_REVERSE_SORT)? invert_min_flag(min_flag) : max_flag ;
+ }
+ /* Get the previous interval, taking index order into account */
+ inline SEL_ARG* index_order_prev(KEY_PART *kp)
+ {
+ return (kp[part].flag & HA_REVERSE_SORT)? next : prev;
+ }
+ /* Get the next interval, taking index order into account */
+ inline SEL_ARG* index_order_next(KEY_PART *kp)
+ {
+ return (kp[part].flag & HA_REVERSE_SORT)? prev : next;
+ }
+
+ /*
+ Produce a single multi-part interval, taking key part ordering into
+ account.
+ */
+ void store_next_min_max_keys(KEY_PART *key, uchar **cur_min_key,
+ uint *cur_min_flag, uchar **cur_max_key,
+ uint *cur_max_flag, int *min_part,
+ int *max_part);
+
/*
Returns a number of keypart values appended to the key buffer
for min key and max key. This function is used by both Range
@@ -515,7 +600,8 @@ public:
int store_min_key(KEY_PART *key,
uchar **range_key,
uint *range_key_flag,
- uint last_part)
+ uint last_part,
+ bool start_key)
{
SEL_ARG *key_tree= first();
uint res= key_tree->store_min(key[key_tree->part].store_length,
@@ -524,15 +610,26 @@ public:
if (!res)
return 0;
*range_key_flag|= key_tree->min_flag;
- if (key_tree->next_key_part &&
- key_tree->next_key_part->type == SEL_ARG::KEY_RANGE &&
+ SEL_ARG *nkp= key_tree->next_key_part;
+ if (nkp && nkp->type == SEL_ARG::KEY_RANGE &&
key_tree->part != last_part &&
- key_tree->next_key_part->part == key_tree->part+1 &&
+ nkp->part == key_tree->part+1 &&
!(*range_key_flag & (NO_MIN_RANGE | NEAR_MIN)))
- res+= key_tree->next_key_part->store_min_key(key,
- range_key,
- range_key_flag,
- last_part);
+ {
+ const bool asc = !(key[key_tree->part].flag & HA_REVERSE_SORT);
+ if (start_key == asc)
+ {
+ res+= nkp->store_min_key(key, range_key, range_key_flag, last_part,
+ start_key);
+ }
+ else
+ {
+ uint tmp_flag = invert_min_flag(*range_key_flag);
+ res += nkp->store_max_key(key, range_key, &tmp_flag, last_part,
+ start_key);
+ *range_key_flag = invert_max_flag(tmp_flag);
+ }
+ }
return res;
}
@@ -540,7 +637,8 @@ public:
int store_max_key(KEY_PART *key,
uchar **range_key,
uint *range_key_flag,
- uint last_part)
+ uint last_part,
+ bool start_key)
{
SEL_ARG *key_tree= last();
uint res=key_tree->store_max(key[key_tree->part].store_length,
@@ -548,15 +646,26 @@ public:
if (!res)
return 0;
*range_key_flag|= key_tree->max_flag;
- if (key_tree->next_key_part &&
- key_tree->next_key_part->type == SEL_ARG::KEY_RANGE &&
+ SEL_ARG *nkp= key_tree->next_key_part;
+ if (nkp && nkp->type == SEL_ARG::KEY_RANGE &&
key_tree->part != last_part &&
- key_tree->next_key_part->part == key_tree->part+1 &&
+ nkp->part == key_tree->part+1 &&
!(*range_key_flag & (NO_MAX_RANGE | NEAR_MAX)))
- res+= key_tree->next_key_part->store_max_key(key,
- range_key,
- range_key_flag,
- last_part);
+ {
+ const bool asc = !(key[key_tree->part].flag & HA_REVERSE_SORT);
+ if ((!start_key && asc) || (start_key && !asc))
+ {
+ res += nkp->store_max_key(key, range_key, range_key_flag, last_part,
+ start_key);
+ }
+ else
+ {
+ uint tmp_flag = invert_max_flag(*range_key_flag);
+ res += nkp->store_min_key(key, range_key, &tmp_flag, last_part,
+ start_key);
+ *range_key_flag = invert_min_flag(tmp_flag);
+ }
+ }
return res;
}
@@ -660,6 +769,73 @@ public:
SEL_ARG *clone_tree(RANGE_OPT_PARAM *param);
};
+/*
+ HowRangeOptimizerHandlesDescKeyparts
+ ====================================
+
+ Starting with MySQL-8.0 and MariaDB 10.8, index key parts may be descending,
+ for example:
+
+ INDEX idx1(col1, col2 DESC, col3, col4 DESC)
+
+ Range Optimizer handles this as follows:
+
+ Other than that, the SEL_ARG graph is built without any regard to DESC
+ keyparts.
+
+ For example, for an index
+
+ INDEX idx2(kp1 DESC, kp2)
+
+ and range
+
+ kp1 BETWEEN 10 and 20 (RANGE-1)
+
+ the SEL_ARG will have min_value=10, max_value=20
+
+ The ordering of key parts is taken into account when SEL_ARG graph is
+ linearized to ranges, in sel_arg_range_seq_next() and get_quick_keys().
+
+ The storage engine expects the first bound to be the first in the index and
+ the last bound to be the last, that is, for (RANGE-1) we will flip min and
+ max and generate these key_range structures:
+
+ start.key='20' , end.key='10'
+
+ See SEL_ARG::store_min_max(). The flag values are flipped as well, see
+ SEL_ARG::get_min_flag(), get_max_flag().
+
+ == Handling multiple key parts ==
+
+ For multi-part keys, the order of key parts has an effect on which ranges are
+ generated. Consider
+
+ kp1 >= 10 AND kp2 >'foo'
+
+ for INDEX(kp1 ASC, kp2 ASC) the range will be
+
+ (kp1, kp2) > (10, 'foo')
+
+ while for INDEX(kp1 ASC, kp2 DESC) it will be just
+
+ kp1 >= 10
+
+ Another example:
+
+ (kp1 BETWEEN 10 AND 20) AND (kp2 BETWEEN 'foo' AND 'quux')
+
+ with INDEX (kp1 ASC, kp2 ASC) will generate
+
+ (10, 'foo') <= (kp1, kp2) < (20, 'quux')
+
+ while with index INDEX (kp1 ASC, kp2 DESC) it will generate
+
+ (10, 'quux') <= (kp1, kp2) < (20, 'foo')
+
+ This is again achieved by sel_arg_range_seq_next() and get_quick_keys()
+ flipping SEL_ARG's min,max, their flags and next/prev as needed.
+*/
+
extern MYSQL_PLUGIN_IMPORT SEL_ARG null_element;
class SEL_ARG_IMPOSSIBLE: public SEL_ARG
diff --git a/sql/opt_range_mrr.cc b/sql/opt_range_mrr.cc
index 20413f5df63..452a6864f06 100644
--- a/sql/opt_range_mrr.cc
+++ b/sql/opt_range_mrr.cc
@@ -34,7 +34,7 @@ typedef struct st_range_seq_entry
uint min_key_flag, max_key_flag;
/* Number of key parts */
- uint min_key_parts, max_key_parts;
+ int min_key_parts, max_key_parts;
SEL_ARG *key_tree;
} RANGE_SEQ_ENTRY;
@@ -47,6 +47,7 @@ typedef struct st_sel_arg_range_seq
uint keyno; /* index of used tree in SEL_TREE structure */
uint real_keyno; /* Number of the index in tables */
PARAM *param;
+ KEY_PART *key_parts;
SEL_ARG *start; /* Root node of the traversed SEL_ARG* graph */
RANGE_SEQ_ENTRY stack[MAX_REF_PARTS];
@@ -105,13 +106,14 @@ static void step_down_to(SEL_ARG_RANGE_SEQ *arg, SEL_ARG *key_tree)
cur->max_key_parts= prev->max_key_parts;
uint16 stor_length= arg->param->key[arg->keyno][key_tree->part].store_length;
- cur->min_key_parts += key_tree->store_min(stor_length, &cur->min_key,
- prev->min_key_flag);
- cur->max_key_parts += key_tree->store_max(stor_length, &cur->max_key,
- prev->max_key_flag);
- cur->min_key_flag= prev->min_key_flag | key_tree->min_flag;
- cur->max_key_flag= prev->max_key_flag | key_tree->max_flag;
+ key_tree->store_min_max(arg->key_parts, stor_length,
+ &cur->min_key, prev->min_key_flag,
+ &cur->max_key, prev->max_key_flag,
+ &cur->min_key_parts, &cur->max_key_parts);
+
+ cur->min_key_flag= prev->min_key_flag | key_tree->get_min_flag(arg->key_parts);
+ cur->max_key_flag= prev->max_key_flag | key_tree->get_max_flag(arg->key_parts);
if (key_tree->is_null_interval())
cur->min_key_flag |= NULL_RANGE;
@@ -165,12 +167,13 @@ bool sel_arg_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range)
/* Ok, we're at some "full tuple" position in the tree */
/* Step down if we can */
- if (key_tree->next && key_tree->next != &null_element)
+ if (key_tree->index_order_next(seq->key_parts) &&
+ key_tree->index_order_next(seq->key_parts) != &null_element)
{
//step down; (update the tuple, we'll step right and stay there)
seq->i--;
- step_down_to(seq, key_tree->next);
- key_tree= key_tree->next;
+ step_down_to(seq, key_tree->index_order_next(seq->key_parts));
+ key_tree= key_tree->index_order_next(seq->key_parts);
seq->is_ror_scan= FALSE;
goto walk_right_n_up;
}
@@ -185,12 +188,13 @@ bool sel_arg_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range)
key_tree= seq->stack[seq->i].key_tree;
/* Step down if we can */
- if (key_tree->next && key_tree->next != &null_element)
+ if (key_tree->index_order_next(seq->key_parts) &&
+ key_tree->index_order_next(seq->key_parts) != &null_element)
{
// Step down; update the tuple
seq->i--;
- step_down_to(seq, key_tree->next);
- key_tree= key_tree->next;
+ step_down_to(seq, key_tree->index_order_next(seq->key_parts));
+ key_tree= key_tree->index_order_next(seq->key_parts);
break;
}
}
@@ -214,16 +218,10 @@ walk_right_n_up:
!key_tree->min_flag && !key_tree->max_flag))
{
seq->is_ror_scan= FALSE;
- if (!key_tree->min_flag)
- cur->min_key_parts +=
- key_tree->next_key_part->store_min_key(seq->param->key[seq->keyno],
- &cur->min_key,
- &cur->min_key_flag, MAX_KEY);
- if (!key_tree->max_flag)
- cur->max_key_parts +=
- key_tree->next_key_part->store_max_key(seq->param->key[seq->keyno],
- &cur->max_key,
- &cur->max_key_flag, MAX_KEY);
+ key_tree->store_next_min_max_keys(seq->param->key[seq->keyno],
+ &cur->min_key, &cur->min_key_flag,
+ &cur->max_key, &cur->max_key_flag,
+ &cur->min_key_parts, &cur->max_key_parts);
break;
}
}
@@ -235,10 +233,11 @@ walk_right_n_up:
key_tree= key_tree->next_key_part;
walk_up_n_right:
- while (key_tree->prev && key_tree->prev != &null_element)
+ while (key_tree->index_order_prev(seq->key_parts) &&
+ key_tree->index_order_prev(seq->key_parts) != &null_element)
{
/* Step up */
- key_tree= key_tree->prev;
+ key_tree= key_tree->index_order_prev(seq->key_parts);
}
step_down_to(seq, key_tree);
}
diff --git a/sql/opt_split.cc b/sql/opt_split.cc
index 18710e85624..85e2df2dbb3 100644
--- a/sql/opt_split.cc
+++ b/sql/opt_split.cc
@@ -707,7 +707,7 @@ double spl_postjoin_oper_cost(THD *thd, double join_record_count, uint rec_len)
void JOIN::add_keyuses_for_splitting()
{
uint i;
- uint idx;
+ size_t idx;
KEYUSE_EXT *keyuse_ext;
KEYUSE_EXT keyuse_ext_end;
double oper_cost;
diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc
index 040d3ed529a..46db641987b 100644
--- a/sql/opt_subselect.cc
+++ b/sql/opt_subselect.cc
@@ -718,7 +718,7 @@ int check_and_do_in_subquery_rewrites(JOIN *join)
{
DBUG_PRINT("info", ("Subquery is semi-join conversion candidate"));
- (void)subquery_types_allow_materialization(thd, in_subs);
+ //(void)subquery_types_allow_materialization(thd, in_subs);
in_subs->is_flattenable_semijoin= TRUE;
@@ -1286,6 +1286,7 @@ bool convert_join_subqueries_to_semijoins(JOIN *join)
while ((in_subq= li++))
{
bool remove_item= TRUE;
+ subquery_types_allow_materialization(thd, in_subq);
/* Stop processing if we've reached a subquery that's attached to the ON clause */
if (in_subq->do_not_convert_to_sj)
@@ -4583,7 +4584,7 @@ SJ_TMP_TABLE::create_sj_weedout_tmp_table(THD *thd)
STEP 1: Get temporary table name
*/
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
- temp_pool_slot = bitmap_lock_set_next(&temp_pool);
+ temp_pool_slot = temp_pool_set_next();
if (temp_pool_slot != MY_BIT_NONE) // we got a slot
sprintf(path, "%s-subquery-%lx-%i", tmp_file_prefix,
@@ -4620,7 +4621,7 @@ SJ_TMP_TABLE::create_sj_weedout_tmp_table(THD *thd)
NullS))
{
if (temp_pool_slot != MY_BIT_NONE)
- bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
+ temp_pool_clear_bit(temp_pool_slot);
DBUG_RETURN(TRUE);
}
strmov(tmpname,path);
@@ -4830,7 +4831,7 @@ err:
thd->mem_root= mem_root_save;
free_tmp_table(thd,table); /* purecov: inspected */
if (temp_pool_slot != MY_BIT_NONE)
- bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
+ temp_pool_clear_bit(temp_pool_slot);
DBUG_RETURN(TRUE); /* purecov: inspected */
}
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index 627ddc86abd..794ec40fc66 100644
--- a/sql/opt_sum.cc
+++ b/sql/opt_sum.cc
@@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates.
- Copyright (c) 2008, 2017, MariaDB Corporation.
+ Copyright (c) 2008, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -953,6 +953,9 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
part->length < part_field->key_length())
break;
+ if (part->key_part_flag & HA_REVERSE_SORT)
+ break; // TODO MDEV-27576
+
if (field->eq(part->field))
{
ref->key= idx;
diff --git a/sql/opt_table_elimination.cc b/sql/opt_table_elimination.cc
index c3297cb81cd..03ee1a2ad62 100644
--- a/sql/opt_table_elimination.cc
+++ b/sql/opt_table_elimination.cc
@@ -1070,7 +1070,7 @@ bool Dep_analysis_context::setup_equality_modules_deps(List<Dep_module>
void *buf;
if (!(buf= thd->alloc(bitmap_buffer_size(offset))) ||
- my_bitmap_init(&expr_deps, (my_bitmap_map*)buf, offset, FALSE))
+ my_bitmap_init(&expr_deps, (my_bitmap_map*)buf, offset))
{
DBUG_RETURN(TRUE); /* purecov: inspected */
}
diff --git a/sql/partition_element.h b/sql/partition_element.h
index c372625682f..1abaa315218 100644
--- a/sql/partition_element.h
+++ b/sql/partition_element.h
@@ -2,6 +2,7 @@
#define PARTITION_ELEMENT_INCLUDED
/* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -111,7 +112,6 @@ public:
ha_rows part_min_rows;
longlong range_value;
const char *partition_name;
- const char *tablespace_name;
struct st_ddl_log_memory_entry *log_entry;
const char* part_comment;
const char* data_file_name;
@@ -127,9 +127,12 @@ public:
bool empty;
elem_type_enum type;
+ engine_option_value *option_list; // create options for partition
+ ha_table_option_struct *option_struct; // structure with parsed options
+
partition_element()
: part_max_rows(0), part_min_rows(0), range_value(0),
- partition_name(NULL), tablespace_name(NULL),
+ partition_name(NULL),
log_entry(NULL), part_comment(NULL),
data_file_name(NULL), index_file_name(NULL),
engine_type(NULL), connect_string(null_clex_str), part_state(PART_NORMAL),
@@ -137,13 +140,13 @@ public:
signed_flag(FALSE), max_value(FALSE),
id(UINT_MAX32),
empty(true),
- type(CONVENTIONAL)
+ type(CONVENTIONAL),
+ option_list(NULL), option_struct(NULL)
{}
partition_element(partition_element *part_elem)
: part_max_rows(part_elem->part_max_rows),
part_min_rows(part_elem->part_min_rows),
range_value(0), partition_name(NULL),
- tablespace_name(part_elem->tablespace_name),
log_entry(NULL),
part_comment(part_elem->part_comment),
data_file_name(part_elem->data_file_name),
@@ -157,7 +160,9 @@ public:
max_value(part_elem->max_value),
id(part_elem->id),
empty(part_elem->empty),
- type(CONVENTIONAL)
+ type(CONVENTIONAL),
+ option_list(part_elem->option_list),
+ option_struct(part_elem->option_struct)
{}
~partition_element() = default;
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index 3af7e97db2b..8bef4165878 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -2434,7 +2434,7 @@ bool partition_info::has_same_partitioning(partition_info *new_part_info)
partition_element *new_part_elem= new_part_it++;
/*
The following must match:
- partition_name, tablespace_name, data_file_name, index_file_name,
+ partition_name, data_file_name, index_file_name,
engine_type, part_max_rows, part_min_rows, nodegroup_id.
(max_value, signed_flag, has_null_value only on partition level,
RANGE/LIST)
@@ -2520,9 +2520,7 @@ bool partition_info::has_same_partitioning(partition_info *new_part_info)
if (strcmp_null(sub_part_elem->data_file_name,
new_sub_part_elem->data_file_name) ||
strcmp_null(sub_part_elem->index_file_name,
- new_sub_part_elem->index_file_name) ||
- strcmp_null(sub_part_elem->tablespace_name,
- new_sub_part_elem->tablespace_name))
+ new_sub_part_elem->index_file_name))
DBUG_RETURN(false);
} while (++j < num_subparts);
@@ -2538,9 +2536,7 @@ bool partition_info::has_same_partitioning(partition_info *new_part_info)
if (strcmp_null(part_elem->data_file_name,
new_part_elem->data_file_name) ||
strcmp_null(part_elem->index_file_name,
- new_part_elem->index_file_name) ||
- strcmp_null(part_elem->tablespace_name,
- new_part_elem->tablespace_name))
+ new_part_elem->index_file_name))
DBUG_RETURN(false);
}
} while (++i < num_parts);
diff --git a/sql/partition_info.h b/sql/partition_info.h
index ebd41ce1764..d80676057d3 100644
--- a/sql/partition_info.h
+++ b/sql/partition_info.h
@@ -83,7 +83,7 @@ struct Vers_part_info : public Sql_alloc
See generate_partition_syntax() for details of how the data is used
in partition expression.
*/
-class partition_info : public Sql_alloc
+class partition_info : public DDL_LOG_STATE, public Sql_alloc
{
public:
/*
@@ -162,10 +162,6 @@ public:
Item *item_free_list;
- struct st_ddl_log_memory_entry *first_log_entry;
- struct st_ddl_log_memory_entry *exec_log_entry;
- struct st_ddl_log_memory_entry *frm_log_entry;
-
/*
Bitmaps of partitions used by the current query.
* read_partitions - partitions to be used for reading.
@@ -305,7 +301,6 @@ public:
part_field_buffers(NULL), subpart_field_buffers(NULL),
restore_part_field_ptrs(NULL), restore_subpart_field_ptrs(NULL),
part_expr(NULL), subpart_expr(NULL), item_free_list(NULL),
- first_log_entry(NULL), exec_log_entry(NULL), frm_log_entry(NULL),
bitmaps_are_initialized(FALSE),
list_array(NULL), vers_info(NULL), err_value(0),
part_info_string(NULL),
@@ -327,6 +322,7 @@ public:
is_auto_partitioned(FALSE),
has_null_value(FALSE), column_list(FALSE)
{
+ bzero((DDL_LOG_STATE *) this, sizeof(DDL_LOG_STATE));
all_fields_in_PF.clear_all();
all_fields_in_PPF.clear_all();
all_fields_in_SPF.clear_all();
@@ -432,8 +428,13 @@ public:
return NULL;
}
uint next_part_no(uint new_parts) const;
+
+ int gen_part_type(THD *thd, String *str) const;
};
+void part_type_error(THD *thd, partition_info *work_part_info,
+ const char *part_type, partition_info *tab_part_info);
+
uint32 get_next_partition_id_range(struct st_partition_iter* part_iter);
bool check_partition_dirs(partition_info *part_info);
diff --git a/sql/rpl_gtid.cc b/sql/rpl_gtid.cc
index fce5f260639..f7059668b11 100644
--- a/sql/rpl_gtid.cc
+++ b/sql/rpl_gtid.cc
@@ -17,6 +17,7 @@
/* Definitions for MariaDB global transaction ID (GTID). */
+#ifndef MYSQL_CLIENT
#include "mariadb.h"
#include "sql_priv.h"
#include "unireg.h"
@@ -24,7 +25,6 @@
#include "sql_base.h"
#include "sql_parse.h"
#include "key.h"
-#include "rpl_gtid.h"
#include "rpl_rli.h"
#include "slave.h"
#include "log_event.h"
@@ -249,8 +249,9 @@ rpl_slave_state::rpl_slave_state()
{
mysql_mutex_init(key_LOCK_slave_state, &LOCK_slave_state,
MY_MUTEX_INIT_SLOW);
- my_hash_init(PSI_INSTRUMENT_ME, &hash, &my_charset_bin, 32, offsetof(element, domain_id),
- sizeof(uint32), NULL, rpl_slave_state_free_element, HASH_UNIQUE);
+ my_hash_init(PSI_INSTRUMENT_ME, &hash, &my_charset_bin, 32,
+ offsetof(element, domain_id), sizeof(element::domain_id),
+ NULL, rpl_slave_state_free_element, HASH_UNIQUE);
my_init_dynamic_array(PSI_INSTRUMENT_ME, &gtid_sort_array, sizeof(rpl_gtid),
8, 8, MYF(0));
}
@@ -366,7 +367,8 @@ rpl_slave_state::get_element(uint32 domain_id)
{
struct element *elem;
- elem= (element *)my_hash_search(&hash, (const uchar *)&domain_id, 0);
+ elem= (element *)my_hash_search(&hash, (const uchar *)&domain_id,
+ sizeof(domain_id));
if (elem)
return elem;
@@ -402,7 +404,8 @@ rpl_slave_state::put_back_list(list_element *list)
list_element *next= list->next;
if ((!e || e->domain_id != list->domain_id) &&
- !(e= (element *)my_hash_search(&hash, (const uchar *)&list->domain_id, 0)))
+ !(e= (element *)my_hash_search(&hash, (const uchar *)&list->domain_id,
+ sizeof(list->domain_id))))
{
err= 1;
goto end;
@@ -604,6 +607,8 @@ rpl_slave_state::record_gtid(THD *thd, const rpl_gtid *gtid, uint64 sub_id,
wait_for_commit* suspended_wfc;
void *hton= NULL;
LEX_CSTRING gtid_pos_table_name;
+ TABLE *tbl= nullptr;
+ MDL_savepoint m_start_of_statement_svp(thd->mdl_context.mdl_savepoint());
DBUG_ENTER("record_gtid");
*out_hton= NULL;
@@ -622,6 +627,18 @@ rpl_slave_state::record_gtid(THD *thd, const rpl_gtid *gtid, uint64 sub_id,
if (!in_statement)
thd->reset_for_next_command();
+ if (thd->rgi_slave && (thd->rgi_slave->gtid_ev_flags_extra &
+ Gtid_log_event::FL_START_ALTER_E1))
+ {
+ /*
+ store the open table table list in ptr, so that is close_thread_tables
+ is called start alter tables are not closed
+ */
+ mysql_mutex_lock(&thd->LOCK_thd_data);
+ tbl= thd->open_tables;
+ thd->open_tables= nullptr;
+ mysql_mutex_unlock(&thd->LOCK_thd_data);
+ }
/*
Only the SQL thread can call select_gtid_pos_table without a mutex
Other threads needs to use a mutex and take into account that the
@@ -731,12 +748,23 @@ end:
{
if (err || (err= ha_commit_trans(thd, FALSE)))
ha_rollback_trans(thd, FALSE);
-
close_thread_tables(thd);
- if (in_transaction)
- thd->mdl_context.release_statement_locks();
- else
- thd->release_transactional_locks();
+ if (!thd->rgi_slave || !(thd->rgi_slave->gtid_ev_flags_extra &
+ Gtid_log_event::FL_START_ALTER_E1))
+ {
+ if (in_transaction)
+ thd->mdl_context.release_statement_locks();
+ else
+ thd->release_transactional_locks();
+ }
+ }
+ if (thd->rgi_slave &&
+ thd->rgi_slave->gtid_ev_flags_extra & Gtid_log_event::FL_START_ALTER_E1)
+ {
+ mysql_mutex_lock(&thd->LOCK_thd_data);
+ thd->open_tables= tbl;
+ mysql_mutex_unlock(&thd->LOCK_thd_data);
+ thd->mdl_context.rollback_to_savepoint(m_start_of_statement_svp);
}
thd->lex->restore_backup_query_tables_list(&lex_backup);
thd->variables.option_bits= thd_saved_option;
@@ -1107,8 +1135,8 @@ rpl_slave_state::iterate(int (*cb)(rpl_gtid *, void *), void *data,
bool locked= false;
my_hash_init(PSI_INSTRUMENT_ME, &gtid_hash, &my_charset_bin, 32,
- offsetof(rpl_gtid, domain_id), sizeof(uint32), NULL, NULL,
- HASH_UNIQUE);
+ offsetof(rpl_gtid, domain_id), sizeof(rpl_gtid::domain_id),
+ NULL, NULL, HASH_UNIQUE);
for (i= 0; i < num_extra; ++i)
if (extra_gtids[i].server_id == global_system_variables.server_id &&
my_hash_insert(&gtid_hash, (uchar *)(&extra_gtids[i])))
@@ -1143,7 +1171,8 @@ rpl_slave_state::iterate(int (*cb)(rpl_gtid *, void *), void *data,
}
/* Check if we have something newer in the extra list. */
- rec= my_hash_search(&gtid_hash, (const uchar *)&best_gtid.domain_id, 0);
+ rec= my_hash_search(&gtid_hash, (const uchar *)&best_gtid.domain_id,
+ sizeof(best_gtid.domain_id));
if (rec)
{
gtid= (rpl_gtid *)rec;
@@ -1243,7 +1272,8 @@ rpl_slave_state::domain_to_gtid(uint32 domain_id, rpl_gtid *out_gtid)
uint64 best_sub_id;
mysql_mutex_lock(&LOCK_slave_state);
- elem= (element *)my_hash_search(&hash, (const uchar *)&domain_id, 0);
+ elem= (element *)my_hash_search(&hash, (const uchar *)&domain_id,
+ sizeof(domain_id));
if (!elem || !(list= elem->list))
{
mysql_mutex_unlock(&LOCK_slave_state);
@@ -1268,6 +1298,7 @@ rpl_slave_state::domain_to_gtid(uint32 domain_id, rpl_gtid *out_gtid)
return true;
}
+#endif
/*
Parse a GTID at the start of a string, and update the pointer to point
@@ -1305,7 +1336,6 @@ gtid_parser_helper(const char **ptr, const char *end, rpl_gtid *out_gtid)
return 0;
}
-
rpl_gtid *
gtid_parse_string_to_list(const char *str, size_t str_len, uint32 *out_len)
{
@@ -1344,6 +1374,7 @@ gtid_parse_string_to_list(const char *str, size_t str_len, uint32 *out_len)
return list;
}
+#ifndef MYSQL_CLIENT
/*
Update the slave replication state with the GTID position obtained from
@@ -1477,8 +1508,9 @@ rpl_slave_state::alloc_gtid_pos_table(LEX_CSTRING *table_name, void *hton,
void rpl_binlog_state::init()
{
- my_hash_init(PSI_INSTRUMENT_ME, &hash, &my_charset_bin, 32, offsetof(element, domain_id),
- sizeof(uint32), NULL, my_free, HASH_UNIQUE);
+ my_hash_init(PSI_INSTRUMENT_ME, &hash, &my_charset_bin, 32,
+ offsetof(element, domain_id), sizeof(element::domain_id),
+ NULL, my_free, HASH_UNIQUE);
my_init_dynamic_array(PSI_INSTRUMENT_ME, &gtid_sort_array, sizeof(rpl_gtid), 8, 8, MYF(0));
mysql_mutex_init(key_LOCK_binlog_state, &LOCK_binlog_state,
MY_MUTEX_INIT_SLOW);
@@ -1580,7 +1612,8 @@ rpl_binlog_state::update_nolock(const struct rpl_gtid *gtid, bool strict)
element *elem;
if ((elem= (element *)my_hash_search(&hash,
- (const uchar *)(&gtid->domain_id), 0)))
+ (const uchar *)(&gtid->domain_id),
+ sizeof(gtid->domain_id))))
{
if (strict && elem->last_gtid && elem->last_gtid->seq_no >= gtid->seq_no)
{
@@ -1628,7 +1661,8 @@ rpl_binlog_state::update_with_next_gtid(uint32 domain_id, uint32 server_id,
gtid->server_id= server_id;
mysql_mutex_lock(&LOCK_binlog_state);
- if ((elem= (element *)my_hash_search(&hash, (const uchar *)(&domain_id), 0)))
+ if ((elem= (element *)my_hash_search(&hash, (const uchar *)(&domain_id),
+ sizeof(domain_id))))
{
gtid->seq_no= ++elem->seq_no_counter;
if (!elem->update_element(gtid))
@@ -1667,7 +1701,8 @@ rpl_binlog_state::element::update_element(const rpl_gtid *gtid)
}
lookup_gtid= (rpl_gtid *)
- my_hash_search(&hash, (const uchar *)&gtid->server_id, 0);
+ my_hash_search(&hash, (const uchar *)&gtid->server_id,
+ sizeof(gtid->server_id));
if (lookup_gtid)
{
lookup_gtid->seq_no= gtid->seq_no;
@@ -1705,8 +1740,8 @@ rpl_binlog_state::alloc_element_nolock(const rpl_gtid *gtid)
{
elem->domain_id= gtid->domain_id;
my_hash_init(PSI_INSTRUMENT_ME, &elem->hash, &my_charset_bin, 32,
- offsetof(rpl_gtid, server_id), sizeof(uint32), NULL, my_free,
- HASH_UNIQUE);
+ offsetof(rpl_gtid, server_id), sizeof(rpl_gtid::domain_id),
+ NULL, my_free, HASH_UNIQUE);
elem->last_gtid= lookup_gtid;
elem->seq_no_counter= gtid->seq_no;
memcpy(lookup_gtid, gtid, sizeof(*lookup_gtid));
@@ -1741,7 +1776,8 @@ rpl_binlog_state::check_strict_sequence(uint32 domain_id, uint32 server_id,
mysql_mutex_lock(&LOCK_binlog_state);
if ((elem= (element *)my_hash_search(&hash,
- (const uchar *)(&domain_id), 0)) &&
+ (const uchar *)(&domain_id),
+ sizeof(domain_id))) &&
elem->last_gtid && elem->last_gtid->seq_no >= seq_no)
{
if (!no_error)
@@ -1769,7 +1805,8 @@ rpl_binlog_state::bump_seq_no_if_needed(uint32 domain_id, uint64 seq_no)
int res;
mysql_mutex_lock(&LOCK_binlog_state);
- if ((elem= (element *)my_hash_search(&hash, (const uchar *)(&domain_id), 0)))
+ if ((elem= (element *)my_hash_search(&hash, (const uchar *)(&domain_id),
+ sizeof(domain_id))))
{
if (elem->seq_no_counter < seq_no)
elem->seq_no_counter= seq_no;
@@ -1787,8 +1824,8 @@ rpl_binlog_state::bump_seq_no_if_needed(uint32 domain_id, uint64 seq_no)
elem->domain_id= domain_id;
my_hash_init(PSI_INSTRUMENT_ME, &elem->hash, &my_charset_bin, 32,
- offsetof(rpl_gtid, server_id), sizeof(uint32), NULL, my_free,
- HASH_UNIQUE);
+ offsetof(rpl_gtid, server_id), sizeof(rpl_gtid::server_id),
+ NULL, my_free, HASH_UNIQUE);
elem->last_gtid= NULL;
elem->seq_no_counter= seq_no;
if (0 == my_hash_insert(&hash, (const uchar *)elem))
@@ -1892,9 +1929,11 @@ rpl_gtid *
rpl_binlog_state::find_nolock(uint32 domain_id, uint32 server_id)
{
element *elem;
- if (!(elem= (element *)my_hash_search(&hash, (const uchar *)&domain_id, 0)))
+ if (!(elem= (element *)my_hash_search(&hash, (const uchar *)&domain_id,
+ sizeof(domain_id))))
return NULL;
- return (rpl_gtid *)my_hash_search(&elem->hash, (const uchar *)&server_id, 0);
+ return (rpl_gtid *)my_hash_search(&elem->hash, (const uchar *)&server_id,
+ sizeof(server_id));
}
rpl_gtid *
@@ -1914,7 +1953,8 @@ rpl_binlog_state::find_most_recent(uint32 domain_id)
rpl_gtid *gtid= NULL;
mysql_mutex_lock(&LOCK_binlog_state);
- elem= (element *)my_hash_search(&hash, (const uchar *)&domain_id, 0);
+ elem= (element *)my_hash_search(&hash, (const uchar *)&domain_id,
+ sizeof(domain_id));
if (elem && elem->last_gtid)
gtid= elem->last_gtid;
mysql_mutex_unlock(&LOCK_binlog_state);
@@ -2183,7 +2223,8 @@ rpl_binlog_state::drop_domain(DYNAMIC_ARRAY *ids,
ptr_domain_id= (uint32*) dynamic_array_ptr(ids, i);
elem= (rpl_binlog_state::element *)
- my_hash_search(&hash, (const uchar *) ptr_domain_id, 0);
+ my_hash_search(&hash, (const uchar *) ptr_domain_id,
+ sizeof(ptr_domain_id[0]));
if (!elem)
{
push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN,
@@ -2244,7 +2285,7 @@ slave_connection_state::slave_connection_state()
{
my_hash_init(PSI_INSTRUMENT_ME, &hash, &my_charset_bin, 32,
offsetof(entry, gtid) + offsetof(rpl_gtid, domain_id),
- sizeof(uint32), NULL, my_free, HASH_UNIQUE);
+ sizeof(rpl_gtid::domain_id), NULL, my_free, HASH_UNIQUE);
my_init_dynamic_array(PSI_INSTRUMENT_ME, &gtid_sort_array, sizeof(rpl_gtid), 8, 8, MYF(0));
}
@@ -2299,7 +2340,8 @@ slave_connection_state::load(const char *slave_request, size_t len)
return 1;
}
if ((e= (const entry *)
- my_hash_search(&hash, (const uchar *)(&gtid->domain_id), 0)))
+ my_hash_search(&hash, (const uchar *)(&gtid->domain_id),
+ sizeof(gtid->domain_id))))
{
my_error(ER_DUPLICATE_GTID_DOMAIN, MYF(0), gtid->domain_id,
gtid->server_id, (ulonglong)gtid->seq_no, e->gtid.domain_id,
@@ -2366,7 +2408,8 @@ slave_connection_state::load(rpl_slave_state *state,
slave_connection_state::entry *
slave_connection_state::find_entry(uint32 domain_id)
{
- return (entry *) my_hash_search(&hash, (const uchar *)(&domain_id), 0);
+ return (entry *) my_hash_search(&hash, (const uchar *)(&domain_id),
+ sizeof(domain_id));
}
@@ -2384,7 +2427,8 @@ int
slave_connection_state::update(const rpl_gtid *in_gtid)
{
entry *e;
- uchar *rec= my_hash_search(&hash, (const uchar *)(&in_gtid->domain_id), 0);
+ uchar *rec= my_hash_search(&hash, (const uchar *)(&in_gtid->domain_id),
+ sizeof(in_gtid->domain_id));
if (rec)
{
e= (entry *)rec;
@@ -2409,7 +2453,8 @@ slave_connection_state::update(const rpl_gtid *in_gtid)
void
slave_connection_state::remove(const rpl_gtid *in_gtid)
{
- uchar *rec= my_hash_search(&hash, (const uchar *)(&in_gtid->domain_id), 0);
+ uchar *rec= my_hash_search(&hash, (const uchar *)(&in_gtid->domain_id),
+ sizeof(in_gtid->domain_id));
#ifdef DBUG_ASSERT_EXISTS
bool err;
rpl_gtid *slave_gtid= &((entry *)rec)->gtid;
@@ -2426,7 +2471,8 @@ slave_connection_state::remove(const rpl_gtid *in_gtid)
void
slave_connection_state::remove_if_present(const rpl_gtid *in_gtid)
{
- uchar *rec= my_hash_search(&hash, (const uchar *)(&in_gtid->domain_id), 0);
+ uchar *rec= my_hash_search(&hash, (const uchar *)(&in_gtid->domain_id),
+ sizeof(in_gtid->domain_id));
if (rec)
my_hash_delete(&hash, rec);
}
@@ -2870,7 +2916,8 @@ void
gtid_waiting::init()
{
my_hash_init(PSI_INSTRUMENT_ME, &hash, &my_charset_bin, 32,
- offsetof(hash_element, domain_id), sizeof(uint32), NULL,
+ offsetof(hash_element, domain_id),
+ sizeof(hash_element::domain_id), NULL,
free_hash_element, HASH_UNIQUE);
mysql_mutex_init(key_LOCK_gtid_waiting, &LOCK_gtid_waiting, 0);
}
@@ -2903,7 +2950,8 @@ gtid_waiting::get_entry(uint32 domain_id)
{
hash_element *e;
- if ((e= (hash_element *)my_hash_search(&hash, (const uchar *)&domain_id, 0)))
+ if ((e= (hash_element *)my_hash_search(&hash, (const uchar *)&domain_id,
+ sizeof(domain_id))))
return e;
if (!(e= (hash_element *)my_malloc(PSI_INSTRUMENT_ME, sizeof(*e), MYF(MY_WME))))
@@ -2953,3 +3001,843 @@ gtid_waiting::remove_from_wait_queue(gtid_waiting::hash_element *he,
queue_remove(&he->queue, elem->queue_idx);
}
+
+#endif
+
+void free_domain_lookup_element(void *p)
+{
+ struct Binlog_gtid_state_validator::audit_elem *audit_elem=
+ (struct Binlog_gtid_state_validator::audit_elem *) p;
+ delete_dynamic(&audit_elem->late_gtids_previous);
+ delete_dynamic(&audit_elem->late_gtids_real);
+ my_free(audit_elem);
+}
+
+Binlog_gtid_state_validator::Binlog_gtid_state_validator()
+{
+ my_hash_init(PSI_INSTRUMENT_ME, &m_audit_elem_domain_lookup, &my_charset_bin, 32,
+ offsetof(struct audit_elem, domain_id), sizeof(uint32),
+ NULL, free_domain_lookup_element, HASH_UNIQUE);
+}
+
+Binlog_gtid_state_validator::~Binlog_gtid_state_validator()
+{
+ my_hash_free(&m_audit_elem_domain_lookup);
+}
+
+void Binlog_gtid_state_validator::initialize_start_gtids(rpl_gtid *start_gtids,
+ size_t n_gtids)
+{
+ size_t i;
+ for(i= 0; i < n_gtids; i++)
+ {
+ rpl_gtid *domain_state_gtid= &start_gtids[i];
+
+ /*
+ If we are initializing from a GLLE, we can have repeat domain ids from
+ differing servers, so we want to ensure our start gtid matches the last
+ known position
+ */
+ struct audit_elem *audit_elem= (struct audit_elem *) my_hash_search(
+ &m_audit_elem_domain_lookup,
+ (const uchar *) &(domain_state_gtid->domain_id), 0);
+ if (audit_elem)
+ {
+ /*
+ We have this domain already specified, so try to overwrite with the
+ more recent GTID
+ */
+ if (domain_state_gtid->seq_no > audit_elem->start_gtid.seq_no)
+ audit_elem->start_gtid = *domain_state_gtid;
+ continue;
+ }
+
+ /* Initialize a new domain */
+ audit_elem= (struct audit_elem *) my_malloc(
+ PSI_NOT_INSTRUMENTED, sizeof(struct audit_elem), MYF(MY_WME));
+ if (!audit_elem)
+ {
+ my_error(ER_OUT_OF_RESOURCES, MYF(0));
+ return;
+ }
+
+ audit_elem->domain_id= start_gtids[i].domain_id;
+ audit_elem->start_gtid= start_gtids[i];
+ audit_elem->last_gtid= {audit_elem->domain_id, 0, 0};
+
+ my_init_dynamic_array(PSI_INSTRUMENT_ME, &audit_elem->late_gtids_real,
+ sizeof(rpl_gtid), 8, 8, MYF(0));
+ my_init_dynamic_array(PSI_INSTRUMENT_ME, &audit_elem->late_gtids_previous,
+ sizeof(rpl_gtid), 8, 8, MYF(0));
+
+ if (my_hash_insert(&m_audit_elem_domain_lookup, (uchar *) audit_elem))
+ {
+ my_free(audit_elem);
+ my_error(ER_OUT_OF_RESOURCES, MYF(0));
+ return;
+ }
+ }
+}
+
+my_bool Binlog_gtid_state_validator::initialize_gtid_state(FILE *out,
+ rpl_gtid *gtids,
+ size_t n_gtids)
+{
+ size_t i;
+ my_bool err= FALSE;
+
+ /*
+ We weren't initialized with starting positions explicitly, so assume the
+ starting positions of the current gtid state
+ */
+ if (!m_audit_elem_domain_lookup.records)
+ initialize_start_gtids(gtids, n_gtids);
+
+ for(i= 0; i < n_gtids; i++)
+ {
+ rpl_gtid *domain_state_gtid= &gtids[i];
+
+ struct audit_elem *audit_elem= (struct audit_elem *) my_hash_search(
+ &m_audit_elem_domain_lookup,
+ (const uchar *) &(domain_state_gtid->domain_id), 0);
+
+ if (!audit_elem)
+ {
+ Binlog_gtid_state_validator::error(
+ out,
+ "Starting GTID position list does not specify an initial value "
+ "for domain %u, whose events may be present in the requested binlog "
+ "file(s). The last known position for this domain was %u-%u-%llu.",
+ domain_state_gtid->domain_id, PARAM_GTID((*domain_state_gtid)));
+ err= TRUE;
+ continue;
+ }
+
+ if (audit_elem->start_gtid.seq_no < domain_state_gtid->seq_no)
+ {
+ Binlog_gtid_state_validator::error(
+ out,
+ "Binary logs are missing data for domain %u. Expected data to "
+ "start from state %u-%u-%llu; however, the initial GTID state of "
+ "the logs was %u-%u-%llu.",
+ domain_state_gtid->domain_id, PARAM_GTID(audit_elem->start_gtid),
+ PARAM_GTID((*domain_state_gtid)));
+ err= TRUE;
+ continue;
+ }
+
+ if (domain_state_gtid->seq_no > audit_elem->last_gtid.seq_no)
+ audit_elem->last_gtid= *domain_state_gtid;
+ }
+ return err;
+}
+
+my_bool Binlog_gtid_state_validator::verify_stop_state(FILE *out,
+ rpl_gtid *stop_gtids,
+ size_t n_stop_gtids)
+{
+ size_t i;
+ for(i= 0; i < n_stop_gtids; i++)
+ {
+ rpl_gtid *stop_gtid= &stop_gtids[i];
+
+ struct audit_elem *audit_elem= (struct audit_elem *) my_hash_search(
+ &m_audit_elem_domain_lookup,
+ (const uchar *) &(stop_gtid->domain_id), 0);
+
+ /*
+ It is okay if stop gtid doesn't exist in current state because it will be treated
+ as a new domain
+ */
+ if (audit_elem && stop_gtid->seq_no <= audit_elem->start_gtid.seq_no)
+ {
+ Binlog_gtid_state_validator::error(
+ out,
+ "--stop-position GTID %u-%u-%llu does not exist in the "
+ "specified binlog files. The current GTID state of domain %u in the "
+ "specified binary logs is %u-%u-%llu",
+ PARAM_GTID((*stop_gtid)), stop_gtid->domain_id,
+ PARAM_GTID(audit_elem->start_gtid));
+ return TRUE;
+ }
+ }
+
+ /* No issues with any GTIDs */
+ return FALSE;
+}
+
+my_bool
+Binlog_gtid_state_validator::verify_gtid_state(FILE *out,
+ rpl_gtid *domain_state_gtid)
+{
+ struct audit_elem *audit_elem= (struct audit_elem *) my_hash_search(
+ &m_audit_elem_domain_lookup,
+ (const uchar *) &(domain_state_gtid->domain_id), 0);
+
+ if (!audit_elem)
+ {
+ Binlog_gtid_state_validator::warn(
+ out,
+ "Binary logs are missing data for domain %u. The current binary log "
+ "specified its "
+ "current state for this domain as %u-%u-%llu, but neither the "
+ "starting GTID position list nor any processed events have "
+ "mentioned "
+ "this domain.",
+ domain_state_gtid->domain_id, PARAM_GTID((*domain_state_gtid)));
+ return TRUE;
+ }
+
+ if (audit_elem->last_gtid.seq_no < domain_state_gtid->seq_no)
+ {
+ Binlog_gtid_state_validator::warn(
+ out,
+ "Binary logs are missing data for domain %u. The current binary log "
+ "state is %u-%u-%llu, but the last seen event was %u-%u-%llu.",
+ domain_state_gtid->domain_id, PARAM_GTID((*domain_state_gtid)),
+ PARAM_GTID(audit_elem->last_gtid));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+my_bool Binlog_gtid_state_validator::record(rpl_gtid *gtid)
+{
+ struct audit_elem *audit_elem= (struct audit_elem *) my_hash_search(
+ &m_audit_elem_domain_lookup, (const uchar *) &(gtid->domain_id), 0);
+
+ if (!audit_elem)
+ {
+ /*
+ We haven't seen any GTIDs in this domian yet. Perform initial set up for
+ this domain so we can monitor its events.
+ */
+ audit_elem= (struct audit_elem *) my_malloc(
+ PSI_NOT_INSTRUMENTED, sizeof(struct audit_elem), MYF(MY_WME));
+ if (!audit_elem)
+ {
+ my_error(ER_OUT_OF_RESOURCES, MYF(0));
+ return TRUE;
+ }
+
+ audit_elem->domain_id= gtid->domain_id;
+ audit_elem->last_gtid= *gtid;
+ audit_elem->start_gtid= {gtid->domain_id, 0, 0};
+
+ my_init_dynamic_array(PSI_INSTRUMENT_ME, &audit_elem->late_gtids_real,
+ sizeof(rpl_gtid), 8, 8, MYF(0));
+ my_init_dynamic_array(PSI_INSTRUMENT_ME, &audit_elem->late_gtids_previous,
+ sizeof(rpl_gtid), 8, 8, MYF(0));
+
+ if (my_hash_insert(&m_audit_elem_domain_lookup, (uchar *) audit_elem))
+ {
+ my_free(audit_elem);
+ my_error(ER_OUT_OF_RESOURCES, MYF(0));
+ return TRUE;
+ }
+ }
+ else
+ {
+ /* Out of order check */
+ if (gtid->seq_no <= audit_elem->last_gtid.seq_no &&
+ gtid->seq_no >= audit_elem->start_gtid.seq_no)
+ {
+ /* GTID is out of order */
+ insert_dynamic(&audit_elem->late_gtids_real, (const void *) gtid);
+ insert_dynamic(&audit_elem->late_gtids_previous,
+ (const void *) &(audit_elem->last_gtid));
+
+ return TRUE;
+ }
+ else
+ {
+ /* GTID is valid */
+ audit_elem->last_gtid= *gtid;
+ }
+ }
+
+ return FALSE;
+}
+
+/*
+ Data structure used to help pass data into report_audit_findings because
+ my_hash_iterate only passes one parameter
+*/
+struct gtid_report_ctx
+{
+ FILE *out_file;
+ my_bool is_strict_mode;
+ my_bool contains_err;
+};
+
+static my_bool report_audit_findings(void *entry, void *report_ctx_arg)
+{
+ struct Binlog_gtid_state_validator::audit_elem *audit_el=
+ (struct Binlog_gtid_state_validator::audit_elem *) entry;
+
+ struct gtid_report_ctx *report_ctx=
+ (struct gtid_report_ctx *) report_ctx_arg;
+ FILE *out= report_ctx->out_file;
+ my_bool is_strict_mode= report_ctx->is_strict_mode;
+ size_t i;
+ void (*report_f)(FILE*, const char*, ...);
+
+ if (is_strict_mode)
+ report_f= Binlog_gtid_state_validator::error;
+ else
+ report_f= Binlog_gtid_state_validator::warn;
+
+ if (audit_el)
+ {
+ if (audit_el->last_gtid.seq_no < audit_el->start_gtid.seq_no)
+ {
+ report_f(out,
+ "Binary logs never reached expected GTID state of %u-%u-%llu",
+ PARAM_GTID(audit_el->start_gtid));
+ report_ctx->contains_err= TRUE;
+ }
+
+ /* Report any out of order GTIDs */
+ for(i= 0; i < audit_el->late_gtids_real.elements; i++)
+ {
+ rpl_gtid *real_gtid=
+ (rpl_gtid *) dynamic_array_ptr(&(audit_el->late_gtids_real), i);
+ rpl_gtid *last_gtid= (rpl_gtid *) dynamic_array_ptr(
+ &(audit_el->late_gtids_previous), i);
+ DBUG_ASSERT(real_gtid && last_gtid);
+
+ report_f(out,
+ "Found out of order GTID. Got %u-%u-%llu after %u-%u-%llu",
+ PARAM_GTID((*real_gtid)), PARAM_GTID((*last_gtid)));
+ report_ctx->contains_err= TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+my_bool Binlog_gtid_state_validator::report(FILE *out, my_bool is_strict_mode)
+{
+ struct gtid_report_ctx report_ctx;
+ report_ctx.out_file= out;
+ report_ctx.is_strict_mode= is_strict_mode;
+ report_ctx.contains_err= FALSE;
+ my_hash_iterate(&m_audit_elem_domain_lookup, report_audit_findings, &report_ctx);
+ fflush(out);
+ return is_strict_mode ? report_ctx.contains_err : FALSE;
+}
+
+Window_gtid_event_filter::Window_gtid_event_filter()
+ : m_has_start(FALSE), m_has_stop(FALSE), m_is_active(FALSE),
+ m_has_passed(FALSE)
+{
+ // m_start and m_stop do not need initial values if unused
+}
+
+int Window_gtid_event_filter::set_start_gtid(rpl_gtid *start)
+{
+ if (m_has_start)
+ {
+ sql_print_error(
+ "Start position cannot have repeated domain "
+ "ids (found %u-%u-%llu when %u-%u-%llu was previously specified)",
+ PARAM_GTID((*start)), PARAM_GTID(m_start));
+ return 1;
+ }
+
+ m_has_start= TRUE;
+ m_start= *start;
+ return 0;
+}
+
+int Window_gtid_event_filter::set_stop_gtid(rpl_gtid *stop)
+{
+ if (m_has_stop)
+ {
+ sql_print_error(
+ "Stop position cannot have repeated domain "
+ "ids (found %u-%u-%llu when %u-%u-%llu was previously specified)",
+ PARAM_GTID((*stop)), PARAM_GTID(m_stop));
+ return 1;
+ }
+
+ m_has_stop= TRUE;
+ m_stop= *stop;
+ return 0;
+}
+
+my_bool Window_gtid_event_filter::is_range_invalid()
+{
+ if (m_has_start && m_has_stop && m_start.seq_no > m_stop.seq_no)
+ {
+ sql_print_error(
+ "Queried GTID range is invalid in strict mode. Stop position "
+ "%u-%u-%llu is not greater than or equal to start %u-%u-%llu.",
+ PARAM_GTID(m_stop), PARAM_GTID(m_start));
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static inline my_bool is_gtid_at_or_after(rpl_gtid *boundary,
+ rpl_gtid *test_gtid)
+{
+ return test_gtid->domain_id == boundary->domain_id &&
+ test_gtid->seq_no >= boundary->seq_no;
+}
+
+static inline my_bool is_gtid_at_or_before(rpl_gtid *boundary,
+ rpl_gtid *test_gtid)
+{
+ return test_gtid->domain_id == boundary->domain_id &&
+ test_gtid->seq_no <= boundary->seq_no;
+}
+
+my_bool Window_gtid_event_filter::exclude(rpl_gtid *gtid)
+{
+ /* Assume result should be excluded to start */
+ my_bool should_exclude= TRUE;
+
+ DBUG_ASSERT((m_has_start && gtid->domain_id == m_start.domain_id) ||
+ (m_has_stop && gtid->domain_id == m_stop.domain_id));
+
+ if (!m_is_active && !m_has_passed)
+ {
+ /*
+ This filter has not yet been activated. Check if the gtid is within the
+ bounds of this window.
+ */
+
+ if (!m_has_start && is_gtid_at_or_before(&m_stop, gtid))
+ {
+ /*
+ Start GTID was not provided, so we want to include everything from here
+ up to m_stop
+ */
+ m_is_active= TRUE;
+ should_exclude= FALSE;
+ }
+ else if ((m_has_start && is_gtid_at_or_after(&m_start, gtid)) &&
+ (!m_has_stop || is_gtid_at_or_before(&m_stop, gtid)))
+ {
+ m_is_active= TRUE;
+
+ DBUG_PRINT("gtid-event-filter",
+ ("Window: Begin (%d-%d-%llu, %d-%d-%llu]",
+ PARAM_GTID(m_start), PARAM_GTID(m_stop)));
+
+ /*
+ As the start of the range is exclusive, if this gtid is the start of
+ the range, exclude it
+ */
+ if (gtid->seq_no == m_start.seq_no)
+ should_exclude= TRUE;
+ else
+ should_exclude= FALSE;
+
+ if (m_has_stop && gtid->seq_no == m_stop.seq_no)
+ {
+ m_has_passed= TRUE;
+ DBUG_PRINT("gtid-event-filter",
+ ("Window: End (%d-%d-%llu, %d-%d-%llu]",
+ PARAM_GTID(m_start), PARAM_GTID(m_stop)));
+ }
+ }
+ } /* if (!m_is_active && !m_has_passed) */
+ else if (m_is_active && !m_has_passed)
+ {
+ /*
+ This window is currently active so we want the event group to be included
+ in the results. Additionally check if we are at the end of the window.
+ If no end of the window is provided, go indefinitely
+ */
+ should_exclude= FALSE;
+
+ if (m_has_stop && is_gtid_at_or_after(&m_stop, gtid))
+ {
+ DBUG_PRINT("gtid-event-filter",
+ ("Window: End (%d-%d-%llu, %d-%d-%llu]",
+ PARAM_GTID(m_start), PARAM_GTID(m_stop)));
+ m_is_active= FALSE;
+ m_has_passed= TRUE;
+
+ if (!is_gtid_at_or_before(&m_stop, gtid))
+ {
+ /*
+ The GTID is after the finite stop of the window, don't let it pass
+ through
+ */
+ should_exclude= TRUE;
+ }
+ }
+ }
+
+ return should_exclude;
+}
+
+my_bool Window_gtid_event_filter::has_finished()
+{
+ return m_has_stop ? m_has_passed : FALSE;
+}
+
+void free_gtid_filter_element(void *p)
+{
+ gtid_filter_element *gfe = (gtid_filter_element *) p;
+ if (gfe->filter)
+ delete gfe->filter;
+ my_free(gfe);
+}
+
+Id_delegating_gtid_event_filter::Id_delegating_gtid_event_filter()
+ : m_num_stateful_filters(0), m_num_completed_filters(0)
+{
+ my_hash_init(PSI_INSTRUMENT_ME, &m_filters_by_id_hash, &my_charset_bin, 32,
+ offsetof(gtid_filter_element, identifier),
+ sizeof(gtid_filter_identifier), NULL, free_gtid_filter_element,
+ HASH_UNIQUE);
+
+ m_default_filter= new Accept_all_gtid_filter();
+}
+
+Id_delegating_gtid_event_filter::~Id_delegating_gtid_event_filter()
+{
+ my_hash_free(&m_filters_by_id_hash);
+ delete m_default_filter;
+}
+
+void Id_delegating_gtid_event_filter::set_default_filter(
+ Gtid_event_filter *filter)
+{
+ if (m_default_filter)
+ delete m_default_filter;
+
+ m_default_filter= filter;
+}
+
+gtid_filter_element *
+Id_delegating_gtid_event_filter::find_or_create_filter_element_for_id(
+ gtid_filter_identifier filter_id)
+{
+ gtid_filter_element *fe= (gtid_filter_element *) my_hash_search(
+ &m_filters_by_id_hash, (const uchar *) &filter_id, 0);
+
+ if (!fe)
+ {
+ gtid_filter_element *new_fe= (gtid_filter_element *) my_malloc(
+ PSI_NOT_INSTRUMENTED, sizeof(gtid_filter_element), MYF(MY_WME));
+ new_fe->filter= NULL;
+ new_fe->identifier= filter_id;
+ if (my_hash_insert(&m_filters_by_id_hash, (uchar*) new_fe))
+ {
+ my_free(new_fe);
+ my_error(ER_OUT_OF_RESOURCES, MYF(0));
+ return NULL;
+ }
+ fe= new_fe;
+ }
+
+ return fe;
+}
+
+my_bool Id_delegating_gtid_event_filter::has_finished()
+{
+ /*
+ If all user-defined filters have deactivated, we are effectively
+ deactivated
+ */
+ return m_num_stateful_filters &&
+ m_num_completed_filters == m_num_stateful_filters;
+}
+
+my_bool Id_delegating_gtid_event_filter::exclude(rpl_gtid *gtid)
+{
+ gtid_filter_identifier filter_id= get_id_from_gtid(gtid);
+ gtid_filter_element *filter_element= (gtid_filter_element *) my_hash_search(
+ &m_filters_by_id_hash, (const uchar *) &filter_id, 0);
+ Gtid_event_filter *filter=
+ (filter_element ? filter_element->filter : m_default_filter);
+ my_bool ret= TRUE;
+
+ if(!filter_element || !filter->has_finished())
+ {
+ ret= filter->exclude(gtid);
+
+ /*
+ If this is an explicitly defined filter, e.g. Window-based filter, check
+ if it has completed, and update the counter accordingly if so.
+ */
+ if (filter_element && filter->has_finished())
+ m_num_completed_filters++;
+ }
+
+ return ret;
+}
+
+Window_gtid_event_filter *
+Domain_gtid_event_filter::find_or_create_window_filter_for_id(
+ uint32 domain_id)
+{
+ gtid_filter_element *filter_element=
+ find_or_create_filter_element_for_id(domain_id);
+ Window_gtid_event_filter *wgef= NULL;
+
+ if (filter_element->filter == NULL)
+ {
+ /* New filter */
+ wgef= new Window_gtid_event_filter();
+ filter_element->filter= wgef;
+ }
+ else if (filter_element->filter->get_filter_type() == WINDOW_GTID_FILTER_TYPE)
+ {
+ /* We have an existing window filter here */
+ wgef= (Window_gtid_event_filter *) filter_element->filter;
+ }
+ else
+ {
+ /*
+ We have an existing filter but it is not of window type so propogate NULL
+ filter
+ */
+ sql_print_error("cannot subset domain id %d by position, another rule "
+ "exists on that domain",
+ domain_id);
+ }
+
+ return wgef;
+}
+
+static my_bool check_filter_entry_validity(void *entry, void *are_filters_invalid_arg)
+{
+ gtid_filter_element *fe= (gtid_filter_element*) entry;
+
+ if (fe)
+ {
+ Gtid_event_filter *gef= fe->filter;
+ if (gef->get_filter_type() == Gtid_event_filter::WINDOW_GTID_FILTER_TYPE)
+ {
+ Window_gtid_event_filter *wgef= (Window_gtid_event_filter *) gef;
+ if (wgef->is_range_invalid())
+ {
+ *((int *) are_filters_invalid_arg)= 1;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+int Domain_gtid_event_filter::validate_window_filters()
+{
+ int are_filters_invalid= 0;
+ my_hash_iterate(&m_filters_by_id_hash, check_filter_entry_validity, &are_filters_invalid);
+ return are_filters_invalid;
+}
+
+int Domain_gtid_event_filter::add_start_gtid(rpl_gtid *gtid)
+{
+ int err= 0;
+ Window_gtid_event_filter *filter_to_update=
+ find_or_create_window_filter_for_id(gtid->domain_id);
+
+ if (filter_to_update == NULL)
+ {
+ err= 1;
+ }
+ else if (!(err= filter_to_update->set_start_gtid(gtid)))
+ {
+ gtid_filter_element *fe= (gtid_filter_element *) my_hash_search(
+ &m_filters_by_id_hash, (const uchar *) &(gtid->domain_id), 0);
+ insert_dynamic(&m_start_filters, (const void *) &fe);
+ }
+
+ return err;
+}
+
+int Domain_gtid_event_filter::add_stop_gtid(rpl_gtid *gtid)
+{
+ int err= 0;
+ Window_gtid_event_filter *filter_to_update=
+ find_or_create_window_filter_for_id(gtid->domain_id);
+
+ if (filter_to_update == NULL)
+ {
+ err= 1;
+ }
+ else if (!(err= filter_to_update->set_stop_gtid(gtid)))
+ {
+ gtid_filter_element *fe= (gtid_filter_element *) my_hash_search(
+ &m_filters_by_id_hash, (const uchar *) &(gtid->domain_id), 0);
+ insert_dynamic(&m_stop_filters, (const void *) &fe);
+
+ /*
+ A window with a stop position can be disabled, and is therefore stateful.
+ */
+ m_num_stateful_filters++;
+
+ /*
+ Default filtering behavior changes with GTID stop positions, where we
+ exclude all domains not present in the stop list
+ */
+ if (m_default_filter->get_filter_type() == ACCEPT_ALL_GTID_FILTER_TYPE)
+ {
+ delete m_default_filter;
+ m_default_filter= new Reject_all_gtid_filter();
+ }
+ }
+
+ return err;
+}
+
+rpl_gtid *Domain_gtid_event_filter::get_start_gtids()
+{
+ rpl_gtid *gtid_list;
+ uint32 i;
+ size_t n_start_gtids= get_num_start_gtids();
+
+ gtid_list= (rpl_gtid *) my_malloc(
+ PSI_INSTRUMENT_ME, n_start_gtids * sizeof(rpl_gtid), MYF(MY_WME));
+
+ for (i = 0; i < n_start_gtids; i++)
+ {
+ gtid_filter_element *fe=
+ *(gtid_filter_element **) dynamic_array_ptr(&m_start_filters, i);
+ DBUG_ASSERT(fe->filter &&
+ fe->filter->get_filter_type() == WINDOW_GTID_FILTER_TYPE);
+ Window_gtid_event_filter *wgef=
+ (Window_gtid_event_filter *) fe->filter;
+
+ rpl_gtid win_start_gtid= wgef->get_start_gtid();
+ gtid_list[i]= win_start_gtid;
+ }
+
+ return gtid_list;
+}
+
+rpl_gtid *Domain_gtid_event_filter::get_stop_gtids()
+{
+ rpl_gtid *gtid_list;
+ uint32 i;
+ size_t n_stop_gtids= get_num_stop_gtids();
+
+ gtid_list= (rpl_gtid *) my_malloc(
+ PSI_INSTRUMENT_ME, n_stop_gtids * sizeof(rpl_gtid), MYF(MY_WME));
+
+ for (i = 0; i < n_stop_gtids; i++)
+ {
+ gtid_filter_element *fe=
+ *(gtid_filter_element **) dynamic_array_ptr(&m_stop_filters, i);
+ DBUG_ASSERT(fe->filter &&
+ fe->filter->get_filter_type() == WINDOW_GTID_FILTER_TYPE);
+ Window_gtid_event_filter *wgef=
+ (Window_gtid_event_filter *) fe->filter;
+
+ rpl_gtid win_stop_gtid= wgef->get_stop_gtid();
+ gtid_list[i]= win_stop_gtid;
+ }
+
+ return gtid_list;
+}
+
+void Domain_gtid_event_filter::clear_start_gtids()
+{
+ uint32 i;
+ for (i = 0; i < get_num_start_gtids(); i++)
+ {
+ gtid_filter_element *fe=
+ *(gtid_filter_element **) dynamic_array_ptr(&m_start_filters, i);
+ DBUG_ASSERT(fe->filter &&
+ fe->filter->get_filter_type() == WINDOW_GTID_FILTER_TYPE);
+ Window_gtid_event_filter *wgef=
+ (Window_gtid_event_filter *) fe->filter;
+
+ if (wgef->has_stop())
+ {
+ /*
+ Don't delete the whole filter if it already has a stop position attached
+ */
+ wgef->clear_start_pos();
+ }
+ else
+ {
+ /*
+ This domain only has a stop, so delete the whole filter
+ */
+ my_hash_delete(&m_filters_by_id_hash, (uchar *) fe);
+ }
+ }
+
+ reset_dynamic(&m_start_filters);
+}
+
+void Domain_gtid_event_filter::clear_stop_gtids()
+{
+ uint32 i;
+
+ for (i = 0; i < get_num_stop_gtids(); i++)
+ {
+ gtid_filter_element *fe=
+ *(gtid_filter_element **) dynamic_array_ptr(&m_stop_filters, i);
+ DBUG_ASSERT(fe->filter &&
+ fe->filter->get_filter_type() == WINDOW_GTID_FILTER_TYPE);
+ Window_gtid_event_filter *wgef=
+ (Window_gtid_event_filter *) fe->filter;
+
+ if (wgef->has_start())
+ {
+ /*
+ Don't delete the whole filter if it already has a start position
+ attached
+ */
+ wgef->clear_stop_pos();
+ }
+ else
+ {
+ /*
+ This domain only has a start, so delete the whole filter
+ */
+ my_hash_delete(&m_filters_by_id_hash, (uchar *) fe);
+ }
+ m_num_stateful_filters--;
+ }
+
+ /*
+ Stop positions were cleared and we want to be inclusive again of other
+ domains again
+ */
+ if (m_default_filter->get_filter_type() == REJECT_ALL_GTID_FILTER_TYPE)
+ {
+ delete m_default_filter;
+ m_default_filter= new Accept_all_gtid_filter();
+ }
+
+ reset_dynamic(&m_stop_filters);
+}
+
+my_bool Domain_gtid_event_filter::exclude(rpl_gtid *gtid)
+{
+ my_bool include_domain= TRUE;
+ /*
+ If GTID stop positions are provided, we limit the domains which are output
+ to only be those specified with stop positions
+ */
+ if (get_num_stop_gtids())
+ {
+ gtid_filter_identifier filter_id= get_id_from_gtid(gtid);
+ gtid_filter_element *filter_element=
+ (gtid_filter_element *) my_hash_search(&m_filters_by_id_hash,
+ (const uchar *) &filter_id, 0);
+ if (filter_element)
+ {
+ Gtid_event_filter *filter= filter_element->filter;
+ if (filter->get_filter_type() == WINDOW_GTID_FILTER_TYPE)
+ {
+ Window_gtid_event_filter *wgef= (Window_gtid_event_filter *) filter;
+ include_domain= wgef->has_stop();
+ }
+ }
+ }
+
+ return include_domain ? Id_delegating_gtid_event_filter::exclude(gtid)
+ : TRUE;
+}
diff --git a/sql/rpl_gtid.h b/sql/rpl_gtid.h
index c8decff8fe8..ffe804a8f01 100644
--- a/sql/rpl_gtid.h
+++ b/sql/rpl_gtid.h
@@ -29,6 +29,7 @@ class String;
#define PARAM_GTID(G) G.domain_id, G.server_id, G.seq_no
#define GTID_MAX_STR_LENGTH (10+1+10+1+20)
+#define PARAM_GTID(G) G.domain_id, G.server_id, G.seq_no
struct rpl_gtid
{
@@ -37,6 +38,9 @@ struct rpl_gtid
uint64 seq_no;
};
+/* Data structure to help with quick lookup for filters. */
+typedef decltype(rpl_gtid::domain_id) gtid_filter_identifier;
+
inline bool operator==(const rpl_gtid& lhs, const rpl_gtid& rhs)
{
return
@@ -45,6 +49,18 @@ inline bool operator==(const rpl_gtid& lhs, const rpl_gtid& rhs)
lhs.seq_no == rhs.seq_no;
};
+inline bool operator<(const rpl_gtid& lhs, const rpl_gtid& rhs)
+{
+ return (lhs.domain_id == rhs.domain_id) ? lhs.seq_no < rhs.seq_no
+ : lhs.domain_id < rhs.domain_id;
+};
+
+inline bool operator>(const rpl_gtid& lhs, const rpl_gtid& rhs)
+{
+ return (lhs.domain_id == rhs.domain_id) ? lhs.seq_no > rhs.seq_no
+ : lhs.domain_id > rhs.domain_id;
+};
+
enum enum_gtid_skip_type {
GTID_SKIP_NOT, GTID_SKIP_STANDALONE, GTID_SKIP_TRANSACTION
};
@@ -382,5 +398,449 @@ extern bool rpl_slave_state_tostring_helper(String *dest, const rpl_gtid *gtid,
extern int gtid_check_rpl_slave_state_table(TABLE *table);
extern rpl_gtid *gtid_parse_string_to_list(const char *p, size_t len,
uint32 *out_len);
+extern rpl_gtid *gtid_unpack_string_to_list(const char *p, size_t len,
+ uint32 *out_len);
+
+
+
+/*
+ This class ensures that the GTID state of an event stream is consistent with
+ the set of provided binary log files. In particular, it has two concerns:
+
+ 1) Ensuring that GTID events are monotonically increasing within each
+ domain
+ 2) Ensuring that the GTID state of the specified binary logs is consistent
+ both with the initial state that a user provides, and between
+ binary logs (if multiple are specified)
+*/
+class Binlog_gtid_state_validator
+{
+public:
+
+ struct audit_elem
+ {
+ uint32 domain_id;
+
+
+ /*
+ Holds the largest GTID received, and is indexed by domain_id
+ */
+ rpl_gtid last_gtid;
+
+ /*
+ Holds the largest GTID received, and is indexed by domain_id
+ */
+ rpl_gtid start_gtid;
+
+ /*
+ List of the problematic GTIDs received which were out of order
+ */
+ DYNAMIC_ARRAY late_gtids_real;
+
+ /*
+ For each problematic GTID in late_gtids_real, this list contains the last
+ GTID of the domain at the time of receiving the out of order GTID.
+ */
+ DYNAMIC_ARRAY late_gtids_previous;
+ };
+
+ Binlog_gtid_state_validator();
+ ~Binlog_gtid_state_validator();
+
+ /*
+ Initialize where we should start monitoring for invalid GTID entries
+ in the event stream. Note that these start positions must occur at or after
+ a given binary logs GTID state (from Gtid_list_log_event)
+ */
+ void initialize_start_gtids(rpl_gtid *start_gtids, size_t n_gtids);
+
+ /*
+ Initialize our current state so we know where to expect GTIDs to start
+ increasing from. Error if the state exists after our expected start_gtid
+ positions, because we know we will be missing event data (possibly from
+ a purged log).
+ */
+ my_bool initialize_gtid_state(FILE *out, rpl_gtid *gtids, size_t n_gtids);
+
+ /*
+ Ensures that the expected stop GTID positions exist within the specified
+ binary logs.
+ */
+ my_bool verify_stop_state(FILE *out, rpl_gtid *stop_gtids, size_t n_stop_gtids);
+
+ /*
+ Ensure a GTID state (e.g., from a Gtid_list_log_event) is consistent with
+ the current state of our auditing. For example, if we see a GTID from a
+ Gtid_list_log_event that is ahead of our current state for that domain, we
+ have missed events (perhaps from a missing log).
+ */
+ my_bool verify_gtid_state(FILE *out, rpl_gtid *gtid_state_cur);
+
+ /*
+ Take note of a new GTID being processed.
+
+ returns TRUE if the GTID is invalid, FALSE on success
+ */
+ my_bool record(rpl_gtid *gtid);
+
+ /*
+ Writes warnings/errors (if any) during GTID processing
+
+ Returns TRUE if any findings were reported, FALSE otherwise
+ */
+ my_bool report(FILE *out, my_bool is_strict_mode);
+
+ static void report_details(FILE *out, const char *format, va_list args)
+ {
+ vfprintf(out, format, args);
+ fprintf(out, "\n");
+ }
+
+ static void warn(FILE *out, const char *format,...)
+ {
+ va_list args;
+ va_start(args, format);
+ fprintf(out, "WARNING: ");
+ report_details(out, format, args);
+ }
+
+ static void error(FILE *out, const char *format,...)
+ {
+ va_list args;
+ va_start(args, format);
+ fprintf(out, "ERROR: ");
+ report_details(out, format, args);
+ }
+
+private:
+
+ /*
+ Holds the records for each domain id we are monitoring. Elements are of type
+ `struct audit_elem` and indexed by domian_id.
+ */
+ HASH m_audit_elem_domain_lookup;
+};
+
+/*
+ Interface to support different methods of filtering log events by GTID
+*/
+class Gtid_event_filter
+{
+public:
+ Gtid_event_filter() {};
+ virtual ~Gtid_event_filter() {};
+
+ enum gtid_event_filter_type
+ {
+ DELEGATING_GTID_FILTER_TYPE = 1,
+ WINDOW_GTID_FILTER_TYPE = 2,
+ ACCEPT_ALL_GTID_FILTER_TYPE = 3,
+ REJECT_ALL_GTID_FILTER_TYPE = 4
+ };
+
+ /*
+ Run the filter on an input gtid to test if the corresponding log events
+ should be excluded from a result
+
+ Returns TRUE when the event group corresponding to the input GTID should be
+ excluded.
+ Returns FALSE when the event group should be included.
+ */
+ virtual my_bool exclude(rpl_gtid *) = 0;
+
+ /*
+ The gtid_event_filter_type that corresponds to the underlying filter
+ implementation
+ */
+ virtual uint32 get_filter_type() = 0;
+
+ /*
+ For filters that can maintain their own state, this tests if the filter
+ implementation has completed.
+
+ Returns TRUE when completed, and FALSE when the filter has not finished.
+ */
+ virtual my_bool has_finished() = 0;
+};
+
+/*
+ Filter implementation which will include any and all input GTIDs. This is
+ used to set default behavior for GTIDs that do not have explicit filters
+ set on their domain_id, e.g. when a Window_gtid_event_filter is used for
+ a specific domain, then all other domain_ids will be accepted using this
+ filter implementation.
+*/
+class Accept_all_gtid_filter : public Gtid_event_filter
+{
+public:
+ Accept_all_gtid_filter() {}
+ ~Accept_all_gtid_filter() {}
+ my_bool exclude(rpl_gtid *gtid) { return FALSE; }
+ uint32 get_filter_type() { return ACCEPT_ALL_GTID_FILTER_TYPE; }
+ my_bool has_finished() { return FALSE; }
+};
+
+/*
+ Filter implementation to exclude all tested GTIDs.
+*/
+class Reject_all_gtid_filter : public Gtid_event_filter
+{
+public:
+ Reject_all_gtid_filter() {}
+ ~Reject_all_gtid_filter() {}
+ my_bool exclude(rpl_gtid *gtid) { return TRUE; }
+ uint32 get_filter_type() { return REJECT_ALL_GTID_FILTER_TYPE; }
+ my_bool has_finished() { return FALSE; }
+};
+
+/*
+ A filter implementation that includes events that exist between two GTID
+ positions, m_start (exclusive) and m_stop (inclusive), within a domain.
+
+ This filter is stateful, such that it expects GTIDs to be an increasing
+ stream, and internally, the window will activate and deactivate when the start
+ and stop positions of the event stream have passed through, respectively.
+*/
+class Window_gtid_event_filter : public Gtid_event_filter
+{
+public:
+ Window_gtid_event_filter();
+ ~Window_gtid_event_filter() {}
+
+ my_bool exclude(rpl_gtid*);
+ my_bool has_finished();
+
+ /*
+ Set the GTID that begins this window (exclusive)
+
+ Returns 0 on ok, non-zero on error
+ */
+ int set_start_gtid(rpl_gtid *start);
+
+ /*
+ Set the GTID that ends this window (inclusive)
+
+ Returns 0 on ok, non-zero on error
+ */
+ int set_stop_gtid(rpl_gtid *stop);
+
+ uint32 get_filter_type() { return WINDOW_GTID_FILTER_TYPE; }
+
+ /*
+ Validates the underlying range is correct, and writes an error if not, i.e.
+ m_start >= m_stop.
+
+ Returns FALSE on ok, TRUE if range is invalid
+ */
+ my_bool is_range_invalid();
+
+ /*
+ Getter/setter methods
+ */
+ my_bool has_start() { return m_has_start; }
+ my_bool has_stop() { return m_has_stop; }
+ rpl_gtid get_start_gtid() { return m_start; }
+ rpl_gtid get_stop_gtid() { return m_stop; }
+
+ void clear_start_pos()
+ {
+ m_has_start= FALSE;
+ m_start= {0, 0, 0};
+ }
+
+ void clear_stop_pos()
+ {
+ m_has_stop= FALSE;
+ m_stop= {0, 0, 0};
+ }
+
+protected:
+
+ /*
+ When processing GTID streams, the order in which they are processed should
+ be sequential with no gaps between events. If a gap is found within a
+ window, warn the user.
+ */
+ void verify_gtid_is_expected(rpl_gtid *gtid);
+
+private:
+
+ enum warning_flags
+ {
+ WARN_GTID_SEQUENCE_NUMBER_OUT_OF_ORDER= 0x1
+ };
+
+ /*
+ m_has_start : Indicates if a start to this window has been explicitly
+ provided. A window starts immediately if not provided.
+ */
+ my_bool m_has_start;
+
+ /*
+ m_has_stop : Indicates if a stop to this window has been explicitly
+ provided. A window continues indefinitely if not provided.
+ */
+ my_bool m_has_stop;
+
+ /*
+ m_is_active : Indicates whether or not the program is currently reading
+ events from within this window. When TRUE, events with
+ different server ids than those specified by m_start or
+ m_stop will be passed through.
+ */
+ my_bool m_is_active;
+
+ /*
+ m_has_passed : Indicates whether or not the program is currently reading
+ events from within this window.
+ */
+ my_bool m_has_passed;
+
+ /* m_start : marks the GTID that begins the window (exclusive). */
+ rpl_gtid m_start;
+
+ /* m_stop : marks the GTID that ends the range (inclusive). */
+ rpl_gtid m_stop;
+};
+
+typedef struct _gtid_filter_element
+{
+ Gtid_event_filter *filter;
+ gtid_filter_identifier identifier; /* Used for HASH lookup */
+} gtid_filter_element;
+
+/*
+ Gtid_event_filter subclass which has no specific implementation, but rather
+ delegates the filtering to specific identifiable/mapped implementations.
+
+ A default filter is used for GTIDs that are passed through which no explicit
+ filter can be identified.
+
+ This class should be subclassed, where the get_id_from_gtid function
+ specifies how to extract the filter identifier from a GTID.
+*/
+class Id_delegating_gtid_event_filter : public Gtid_event_filter
+{
+public:
+ Id_delegating_gtid_event_filter();
+ ~Id_delegating_gtid_event_filter();
+
+ my_bool exclude(rpl_gtid *gtid);
+ my_bool has_finished();
+ void set_default_filter(Gtid_event_filter *default_filter);
+
+ uint32 get_filter_type() { return DELEGATING_GTID_FILTER_TYPE; }
+
+ virtual gtid_filter_identifier get_id_from_gtid(rpl_gtid *) = 0;
+
+protected:
+
+ uint32 m_num_stateful_filters;
+ uint32 m_num_completed_filters;
+ Gtid_event_filter *m_default_filter;
+
+ HASH m_filters_by_id_hash;
+
+ gtid_filter_element *find_or_create_filter_element_for_id(gtid_filter_identifier);
+};
+
+/*
+ A subclass of Id_delegating_gtid_event_filter which identifies filters using the
+ domain id of a GTID.
+
+ Additional helper functions include:
+ add_start_gtid(GTID) : adds a start GTID position to this filter, to be
+ identified by its domain id
+ add_stop_gtid(GTID) : adds a stop GTID position to this filter, to be
+ identified by its domain id
+ clear_start_gtids() : removes existing GTID start positions
+ clear_stop_gtids() : removes existing GTID stop positions
+ get_start_gtids() : gets all added GTID start positions
+ get_stop_gtids() : gets all added GTID stop positions
+ get_num_start_gtids() : gets the count of added GTID start positions
+ get_num_stop_gtids() : gets the count of added GTID stop positions
+*/
+class Domain_gtid_event_filter : public Id_delegating_gtid_event_filter
+{
+public:
+ Domain_gtid_event_filter()
+ {
+ my_init_dynamic_array(PSI_INSTRUMENT_ME, &m_start_filters,
+ sizeof(gtid_filter_element*), 8, 8, MYF(0));
+ my_init_dynamic_array(PSI_INSTRUMENT_ME, &m_stop_filters,
+ sizeof(gtid_filter_element*), 8, 8, MYF(0));
+ }
+ ~Domain_gtid_event_filter()
+ {
+ delete_dynamic(&m_start_filters);
+ delete_dynamic(&m_stop_filters);
+ }
+
+ /*
+ Returns the domain id of from the input GTID
+ */
+ gtid_filter_identifier get_id_from_gtid(rpl_gtid *gtid)
+ {
+ return gtid->domain_id;
+ }
+
+ /*
+ Override Id_delegating_gtid_event_filter to extend with domain specific
+ filtering logic
+ */
+ my_bool exclude(rpl_gtid*);
+
+ /*
+ Validates that window filters with both a start and stop GTID satisfy
+ stop_gtid > start_gtid
+
+ Returns 0 on ok, non-zero if any windows are invalid.
+ */
+ int validate_window_filters();
+
+ /*
+ Helper function to start a GTID window filter at the given GTID
+
+ Returns 0 on ok, non-zero on error
+ */
+ int add_start_gtid(rpl_gtid *gtid);
+
+ /*
+ Helper function to end a GTID window filter at the given GTID
+
+ Returns 0 on ok, non-zero on error
+ */
+ int add_stop_gtid(rpl_gtid *gtid);
+
+ /*
+ If start or stop position is respecified, we remove all existing values
+ and start over with the new specification.
+ */
+ void clear_start_gtids();
+ void clear_stop_gtids();
+
+ /*
+ Return list of all GTIDs used as start position.
+
+ Note that this list is allocated and it is up to the user to free it
+ */
+ rpl_gtid *get_start_gtids();
+
+ /*
+ Return list of all GTIDs used as stop position.
+
+ Note that this list is allocated and it is up to the user to free it
+ */
+ rpl_gtid *get_stop_gtids();
+
+ size_t get_num_start_gtids() { return m_start_filters.elements; }
+ size_t get_num_stop_gtids() { return m_stop_filters.elements; }
+
+private:
+ DYNAMIC_ARRAY m_start_filters;
+ DYNAMIC_ARRAY m_stop_filters;
+
+ Window_gtid_event_filter *find_or_create_window_filter_for_id(gtid_filter_identifier);
+};
#endif /* RPL_GTID_H */
diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc
index 8322bcd3042..b9aea39e547 100644
--- a/sql/rpl_mi.cc
+++ b/sql/rpl_mi.cc
@@ -1,5 +1,5 @@
/* Copyright (c) 2006, 2017, Oracle and/or its affiliates.
- Copyright (c) 2010, 2017, MariaDB Corporation
+ Copyright (c) 2010, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -43,8 +43,7 @@ Master_info::Master_info(LEX_CSTRING *connection_name_arg,
gtid_reconnect_event_skip_count(0), gtid_event_seen(false),
in_start_all_slaves(0), in_stop_all_slaves(0), in_flush_all_relay_logs(0),
users(0), killed(0),
- total_ddl_groups(0), total_non_trans_groups(0), total_trans_groups(0),
- do_accept_own_server_id(false)
+ total_ddl_groups(0), total_non_trans_groups(0), total_trans_groups(0)
{
char *tmp;
host[0] = 0; user[0] = 0; password[0] = 0;
@@ -86,6 +85,14 @@ Master_info::Master_info(LEX_CSTRING *connection_name_arg,
mysql_mutex_init(key_master_info_data_lock, &data_lock, MY_MUTEX_INIT_FAST);
mysql_mutex_init(key_master_info_start_stop_lock, &start_stop_lock,
MY_MUTEX_INIT_SLOW);
+ /*
+ start_alter_lock will protect individual start_alter_info while
+ start_alter_list_lock is for list insertion and deletion operations
+ */
+ mysql_mutex_init(key_master_info_start_alter_lock, &start_alter_lock,
+ MY_MUTEX_INIT_FAST);
+ mysql_mutex_init(key_master_info_start_alter_list_lock, &start_alter_list_lock,
+ MY_MUTEX_INIT_FAST);
mysql_mutex_setflags(&run_lock, MYF_NO_DEADLOCK_DETECTION);
mysql_mutex_setflags(&data_lock, MYF_NO_DEADLOCK_DETECTION);
mysql_mutex_init(key_master_info_sleep_lock, &sleep_lock, MY_MUTEX_INIT_FAST);
@@ -93,6 +100,7 @@ Master_info::Master_info(LEX_CSTRING *connection_name_arg,
mysql_cond_init(key_master_info_start_cond, &start_cond, NULL);
mysql_cond_init(key_master_info_stop_cond, &stop_cond, NULL);
mysql_cond_init(key_master_info_sleep_cond, &sleep_cond, NULL);
+ init_sql_alloc(PSI_INSTRUMENT_ME, &mem_root, MEM_ROOT_BLOCK_SIZE, 0, MYF(0));
}
@@ -122,10 +130,13 @@ Master_info::~Master_info()
mysql_mutex_destroy(&data_lock);
mysql_mutex_destroy(&sleep_lock);
mysql_mutex_destroy(&start_stop_lock);
+ mysql_mutex_destroy(&start_alter_lock);
+ mysql_mutex_destroy(&start_alter_list_lock);
mysql_cond_destroy(&data_cond);
mysql_cond_destroy(&start_cond);
mysql_cond_destroy(&stop_cond);
mysql_cond_destroy(&sleep_cond);
+ free_root(&mem_root, MYF(0));
}
/**
@@ -750,7 +761,7 @@ int flush_master_info(Master_info* mi,
(1 + mi->ignore_server_ids.elements), MYF(MY_WME));
if (!ignore_server_ids_buf)
DBUG_RETURN(1); /* error */
- ulong cur_len= sprintf(ignore_server_ids_buf, "%u",
+ ulong cur_len= sprintf(ignore_server_ids_buf, "%zu",
mi->ignore_server_ids.elements);
for (ulong i= 0; i < mi->ignore_server_ids.elements; i++)
{
@@ -1456,11 +1467,32 @@ bool Master_info_index::add_master_info(Master_info *mi, bool write_to_file)
atomic
*/
-bool Master_info_index::remove_master_info(Master_info *mi)
+bool Master_info_index::remove_master_info(Master_info *mi, bool clear_log_files)
{
+ char tmp_name[FN_REFLEN];
DBUG_ENTER("remove_master_info");
mysql_mutex_assert_owner(&LOCK_active_mi);
+ if (clear_log_files)
+ {
+ /* This code is only executed when change_master() failes to create a new master info */
+
+ // Delete any temporary relay log files that could have been created by change_master()
+ mi->rli.relay_log.reset_logs(current_thd, 0, (rpl_gtid*) 0, 0, 0);
+ /* Delete master-'connection'.info */
+ create_logfile_name_with_suffix(tmp_name,
+ sizeof(tmp_name),
+ master_info_file, 0,
+ &mi->cmp_connection_name);
+ my_delete(tmp_name, MYF(0));
+ /* Delete relay-log-'connection'.info */
+ create_logfile_name_with_suffix(tmp_name,
+ sizeof(tmp_name),
+ relay_log_info_file, 0,
+ &mi->cmp_connection_name);
+ my_delete(tmp_name, MYF(0));
+ }
+
// Delete Master_info and rewrite others to file
if (!my_hash_delete(&master_info_hash, (uchar*) mi))
{
@@ -1917,7 +1949,7 @@ char *Domain_id_filter::as_string(enum_list_type type)
return NULL;
// Store the total number of elements followed by the individual elements.
- size_t cur_len= sprintf(buf, "%u", ids->elements);
+ size_t cur_len= sprintf(buf, "%zu", ids->elements);
sz-= cur_len;
for (uint i= 0; i < ids->elements; i++)
diff --git a/sql/rpl_mi.h b/sql/rpl_mi.h
index 1377a816d48..ecfecabd6c9 100644
--- a/sql/rpl_mi.h
+++ b/sql/rpl_mi.h
@@ -227,7 +227,7 @@ class Master_info : public Slave_reporting_capability
File fd; // we keep the file open, so we need to remember the file pointer
IO_CACHE file;
- mysql_mutex_t data_lock, run_lock, sleep_lock, start_stop_lock;
+ mysql_mutex_t data_lock, run_lock, sleep_lock, start_stop_lock, start_alter_lock, start_alter_list_lock;
mysql_cond_t data_cond, start_cond, stop_cond, sleep_cond;
THD *io_thd;
MYSQL* mysql;
@@ -365,7 +365,26 @@ class Master_info : public Slave_reporting_capability
to slave) gtid exists in the server's binlog. Then, in gtid strict mode,
it must be ignored similarly to the replicate-same-server-id rule.
*/
- bool do_accept_own_server_id;
+ bool do_accept_own_server_id= false;
+ List <start_alter_info> start_alter_list;
+ MEM_ROOT mem_root;
+ /*
+ Flag is raised at the parallel worker slave stop. Its purpose
+ is to mark the whole start_alter_list when slave stops.
+ The flag is read by Start Alter event to self-mark its state accordingly
+ at time its alter info struct is about to be appened to the list.
+ */
+ bool is_shutdown= false;
+};
+
+struct start_alter_thd_args
+{
+ rpl_group_info *rgi;
+ LEX_CSTRING query;
+ LEX_CSTRING *db;
+ char *catalog;
+ bool shutdown;
+ CHARSET_INFO *cs;
};
int init_master_info(Master_info* mi, const char* master_info_fname,
@@ -404,7 +423,7 @@ public:
bool check_duplicate_master_info(LEX_CSTRING *connection_name,
const char *host, uint port);
bool add_master_info(Master_info *mi, bool write_to_file);
- bool remove_master_info(Master_info *mi);
+ bool remove_master_info(Master_info *mi, bool clear_log_files);
Master_info *get_master_info(const LEX_CSTRING *connection_name,
Sql_condition::enum_warning_level warning);
bool start_all_slaves(THD *thd);
diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc
index 05c6773c470..b3917942874 100644
--- a/sql/rpl_parallel.cc
+++ b/sql/rpl_parallel.cc
@@ -150,6 +150,9 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id,
wait_for_commit *wfc= &rgi->commit_orderer;
int err;
+ if (rgi->get_finish_event_group_called())
+ return;
+
thd->get_stmt_da()->set_overwrite_status(true);
/*
Remove any left-over registration to wait for a prior commit to
@@ -273,6 +276,8 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id,
*/
thd->get_stmt_da()->reset_diagnostics_area();
wfc->wakeup_subsequent_commits(rgi->worker_error);
+ rgi->did_mark_start_commit= false;
+ rgi->set_finish_event_group_called(true);
}
@@ -572,6 +577,7 @@ rpl_pause_for_ftwrl(THD *thd)
uint32 i;
rpl_parallel_thread_pool *pool= &global_rpl_thread_pool;
int err;
+ Dynamic_array<Master_info*> mi_arr(4, 4); // array of replication source mi:s
DBUG_ENTER("rpl_pause_for_ftwrl");
/*
@@ -623,9 +629,36 @@ rpl_pause_for_ftwrl(THD *thd)
mysql_cond_wait(&e->COND_parallel_entry, &e->LOCK_parallel_entry);
};
--e->need_sub_id_signal;
+
thd->EXIT_COND(&old_stage);
if (err)
break;
+ /*
+ Notify any source any domain waiting-for-master Start-Alter to give way.
+ */
+ Master_info *mi= e->rli->mi;
+ bool found= false;
+ for (uint i= 0; i < mi_arr.elements() && !found; i++)
+ found= mi_arr.at(i) == mi;
+ if (!found)
+ {
+ mi_arr.append(mi);
+ start_alter_info *info=NULL;
+ mysql_mutex_lock(&mi->start_alter_list_lock);
+ List_iterator<start_alter_info> info_iterator(mi->start_alter_list);
+ while ((info= info_iterator++))
+ {
+ mysql_mutex_lock(&mi->start_alter_lock);
+
+ DBUG_ASSERT(info->state == start_alter_state::REGISTERED);
+
+ info->state= start_alter_state::ROLLBACK_ALTER;
+ info->direct_commit_alter= true;
+ mysql_cond_broadcast(&info->start_alter_cond);
+ mysql_mutex_unlock(&mi->start_alter_lock);
+ }
+ mysql_mutex_unlock(&mi->start_alter_list_lock);
+ }
}
if (err)
@@ -810,9 +843,7 @@ do_retry:
{
mysql_mutex_lock(&entry->LOCK_parallel_entry);
if (entry->stop_on_error_sub_id == (uint64) ULONGLONG_MAX ||
-#ifndef DBUG_OFF
- (DBUG_EVALUATE_IF("simulate_mdev_12746", 1, 0)) ||
-#endif
+ DBUG_IF("simulate_mdev_12746") ||
rgi->gtid_sub_id < entry->stop_on_error_sub_id)
{
register_wait_for_prior_event_group_commit(rgi, entry);
@@ -1697,6 +1728,9 @@ rpl_parallel_change_thread_count(rpl_parallel_thread_pool *pool,
{
mysql_mutex_lock(&pool->threads[i]->LOCK_rpl_thread);
pool->threads[i]->delay_start= false;
+ pool->threads[i]->current_start_alter_id= 0;
+ pool->threads[i]->current_start_alter_domain_id= 0;
+ pool->threads[i]->reserved_start_alter_thread= false;
mysql_cond_signal(&pool->threads[i]->COND_rpl_thread);
while (!pool->threads[i]->running)
mysql_cond_wait(&pool->threads[i]->COND_rpl_thread,
@@ -1977,7 +2011,19 @@ rpl_parallel_thread::get_rgi(Relay_log_info *rli, Gtid_log_event *gtid_ev,
rgi->retry_start_offset= rli->future_event_relay_log_pos-event_size;
rgi->retry_event_count= 0;
rgi->killed_for_retry= rpl_group_info::RETRY_KILL_NONE;
+ /* rgi is transaction specific so we need to move this value to rgi */
+ rgi->reserved_start_alter_thread= reserved_start_alter_thread;
+ rgi->rpt= this;
+ rgi->direct_commit_alter= false;
+ rgi->finish_event_group_called= false;
+ DBUG_ASSERT(!rgi->sa_info);
+ /*
+ We can remove the reserved_start_alter_thread flag.
+ If we get more concurrent alter handle_split_alter will
+ automatically set this flag again.
+ */
+ reserved_start_alter_thread= false;
return rgi;
}
@@ -2041,6 +2087,10 @@ rpl_parallel_thread::loc_free_gco(group_commit_orderer *gco)
loc_gco_list= gco;
}
+void rpl_group_info::finish_start_alter_event_group()
+{
+ finish_event_group(rpt, this->gtid_sub_id, this->parallel_entry, this);
+}
rpl_parallel_thread::rpl_parallel_thread()
: channel_name_length(0), last_error_number(0), last_error_timestamp(0),
@@ -2050,7 +2100,7 @@ rpl_parallel_thread::rpl_parallel_thread()
rpl_parallel_thread_pool::rpl_parallel_thread_pool()
- : threads(0), free_list(0), count(0), inited(false), busy(false),
+ : threads(0), free_list(0), count(0), inited(false),current_start_alters(0), busy(false),
pfs_bkp{0, false, false, NULL}
{
}
@@ -2184,6 +2234,129 @@ rpl_parallel_thread_pool::copy_pool_for_pfs(Relay_log_info *rli)
}
}
+/*
+ START ALTER , COMMIT ALTER / ROLLBACK ALTER scheduling
+
+ Steps:-
+ 1. (For Gtid_log_event SA). Get the worker thread which is either
+ e->rpl_threads[i] is NULL means worker from poll has not been assigned yet
+ e->rpl_threads[i]->current_owner != &e->rpl_threads[i]
+ Thread has been released, or about to //same as choose_thread logic
+ !e->rpl_threads[i]->current_start_alter_id is 0 , safe to schedule.
+ We dont want to schedule on worker which already have been scheduled SA
+ but CA/RA has not been scheduled yet. current_start_alter_id will indicate
+ this. If we dont do this we will get deadlock.
+ 2. (For Gtid_log_event SA)
+ call choose_thread_internal so that e->rpl_threads[idx] is not null
+ update the current_start_alter_id
+ 3. (For Gtid_log_event SA)
+ update local e->pending_start_alters(local) variable and
+ pool->current_start_alters(global)
+ We need 2 status variable (global and local) because we can have
+ slave_domain_parallel_threads != pool->threads.
+ 4. (For CA/RA Gtid_log_event)
+ Update e->pending_start_alters and pool->current_start_alters
+ while holding mutex lock on pool (if SA is not assigned to
+ reserved thread)
+
+
+ @returns
+ true Worker allocated (choose_thread_internal called)
+ false Worker not allocated (choose_thread_internal not called)
+*/
+static bool handle_split_alter(rpl_parallel_entry *e,
+ Gtid_log_event *gtid_ev, uint32 *idx,
+ //choose_thread_internal specific
+ bool *did_enter_cond, rpl_group_info* rgi,
+ PSI_stage_info *old_stage)
+{
+ uint16 flags_extra= gtid_ev->flags_extra;
+ bool thread_allocated= false;
+ //Step 1
+ if (flags_extra & Gtid_log_event::FL_START_ALTER_E1 ||
+ //This will arrange finding threads for CA/RA as well
+ //as concurrent DDL
+ e->pending_start_alters)
+ {
+ /*
+ j is needed for round robin scheduling, we will start with rpl_thread_idx
+ go till rpl_thread_max and then start with 0 to rpl_thread_idx
+ */
+ int j= e->rpl_thread_idx;
+ for(uint i= 0; i < e->rpl_thread_max; i++)
+ {
+ if (!e->rpl_threads[j] || e->rpl_threads[j]->current_owner
+ != &e->rpl_threads[j] || !e->rpl_threads[j]->current_start_alter_id)
+ {
+ //This condition will hit atleast one time no matter what happens
+ *idx= j;
+ DBUG_PRINT("info", ("Start alter id %d", j));
+ goto idx_found;
+ }
+ j++;
+ j= j % e->rpl_thread_max;
+ }
+ //We did not find and idx
+ DBUG_ASSERT(0);
+ return false;
+idx_found:
+ e->rpl_thread_idx= *idx;
+ e->choose_thread_internal(*idx, did_enter_cond, rgi, old_stage);
+ thread_allocated= true;
+ if (flags_extra & Gtid_log_event::FL_START_ALTER_E1)
+ {
+ mysql_mutex_assert_owner(&e->rpl_threads[*idx]->LOCK_rpl_thread);
+ e->rpl_threads[e->rpl_thread_idx]->current_start_alter_id= gtid_ev->seq_no;
+ e->rpl_threads[e->rpl_thread_idx]->current_start_alter_domain_id=
+ gtid_ev->domain_id;
+ /*
+ We are locking LOCK_rpl_thread_pool becuase we are going to update
+ current_start_alters
+ */
+ mysql_mutex_lock(&global_rpl_thread_pool.LOCK_rpl_thread_pool);
+ if (e->pending_start_alters < e->rpl_thread_max - 1 &&
+ global_rpl_thread_pool.current_start_alters
+ < global_rpl_thread_pool.count - 1)
+ {
+ e->pending_start_alters++;
+ global_rpl_thread_pool.current_start_alters++;
+ }
+ else
+ {
+ e->rpl_threads[*idx]->reserved_start_alter_thread= true;
+ e->rpl_threads[*idx]->current_start_alter_id= 0;
+ e->rpl_threads[*idx]->current_start_alter_domain_id= 0;
+ }
+ mysql_mutex_unlock(&global_rpl_thread_pool.LOCK_rpl_thread_pool);
+ }
+ }
+ if(flags_extra & (Gtid_log_event::FL_COMMIT_ALTER_E1 |
+ Gtid_log_event::FL_ROLLBACK_ALTER_E1 ))
+ {
+ //Free the corrosponding rpt current_start_alter_id
+ for(uint i= 0; i < e->rpl_thread_max; i++)
+ {
+ if(e->rpl_threads[i] &&
+ e->rpl_threads[i]->current_start_alter_id == gtid_ev->sa_seq_no &&
+ e->rpl_threads[i]->current_start_alter_domain_id == gtid_ev->domain_id)
+ {
+ mysql_mutex_lock(&global_rpl_thread_pool.LOCK_rpl_thread_pool);
+ e->rpl_threads[i]->current_start_alter_id= 0;
+ e->rpl_threads[i]->current_start_alter_domain_id= 0;
+ global_rpl_thread_pool.current_start_alters--;
+ e->pending_start_alters--;
+ DBUG_PRINT("info", ("Commit/Rollback alter id %d", i));
+ mysql_mutex_unlock(&global_rpl_thread_pool.LOCK_rpl_thread_pool);
+ break;
+ }
+ }
+ }
+
+ return thread_allocated;
+
+}
+
+
/*
Obtain a worker thread that we can queue an event to.
@@ -2217,25 +2390,32 @@ rpl_parallel_entry::choose_thread(rpl_group_info *rgi, bool *did_enter_cond,
Gtid_log_event *gtid_ev)
{
uint32 idx;
- Relay_log_info *rli= rgi->rli;
- rpl_parallel_thread *thr;
idx= rpl_thread_idx;
if (gtid_ev)
{
+ if (++idx >= rpl_thread_max)
+ idx= 0;
+ //rpl_thread_idx will be updated handle_split_alter
+ if (handle_split_alter(this, gtid_ev, &idx, did_enter_cond, rgi, old_stage))
+ return rpl_threads[idx];
if (gtid_ev->flags2 &
(Gtid_log_event::FL_COMPLETED_XA | Gtid_log_event::FL_PREPARED_XA))
+ {
idx= my_hash_sort(&my_charset_bin, gtid_ev->xid.key(),
gtid_ev->xid.key_length()) % rpl_thread_max;
- else
- {
- ++idx;
- if (idx >= rpl_thread_max)
- idx= 0;
}
rpl_thread_idx= idx;
}
- thr= rpl_threads[idx];
+ return choose_thread_internal(idx, did_enter_cond, rgi, old_stage);
+}
+
+rpl_parallel_thread * rpl_parallel_entry::choose_thread_internal(uint idx,
+ bool *did_enter_cond, rpl_group_info *rgi,
+ PSI_stage_info *old_stage)
+{
+ rpl_parallel_thread* thr= rpl_threads[idx];
+ Relay_log_info *rli= rgi->rli;
if (thr)
{
*did_enter_cond= false;
@@ -2353,12 +2533,13 @@ rpl_parallel::~rpl_parallel()
rpl_parallel_entry *
-rpl_parallel::find(uint32 domain_id)
+rpl_parallel::find(uint32 domain_id, Relay_log_info *rli)
{
struct rpl_parallel_entry *e;
if (!(e= (rpl_parallel_entry *)my_hash_search(&domain_hash,
- (const uchar *)&domain_id, 0)))
+ (const uchar *)&domain_id,
+ sizeof(domain_id))))
{
/* Allocate a new, empty one. */
ulong count= opt_slave_domain_parallel_threads;
@@ -2378,6 +2559,8 @@ rpl_parallel::find(uint32 domain_id)
e->domain_id= domain_id;
e->stop_on_error_sub_id= (uint64)ULONGLONG_MAX;
e->pause_sub_id= (uint64)ULONGLONG_MAX;
+ e->pending_start_alters= 0;
+ e->rli= rli;
if (my_hash_insert(&domain_hash, (uchar *)e))
{
my_free(e);
@@ -2388,7 +2571,11 @@ rpl_parallel::find(uint32 domain_id)
mysql_cond_init(key_COND_parallel_entry, &e->COND_parallel_entry, NULL);
}
else
+ {
+ DBUG_ASSERT(rli == e->rli);
+
e->force_abort= false;
+ }
return e;
}
@@ -2405,7 +2592,7 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli)
struct rpl_parallel_entry *e;
rpl_parallel_thread *rpt;
uint32 i, j;
-
+ Master_info *mi= rli->mi;
/*
First signal all workers that they must force quit; no more events will
be queued to complete any partial event groups executed.
@@ -2458,6 +2645,45 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli)
#endif
global_rpl_thread_pool.copy_pool_for_pfs(rli);
+ /*
+ Shutdown SA alter threads through marking their execution states
+ to force their early post-SA execution exit. Upon that the affected SA threads
+ change their state to COMPLETED, notify any waiting CA|RA and this thread.
+ */
+ start_alter_info *info=NULL;
+ mysql_mutex_lock(&mi->start_alter_list_lock);
+ List_iterator<start_alter_info> info_iterator(mi->start_alter_list);
+ mi->is_shutdown= true; // a sign to stop in concurrently coming in new SA:s
+ while ((info= info_iterator++))
+ {
+ mysql_mutex_lock(&mi->start_alter_lock);
+ if (info->state == start_alter_state::COMPLETED)
+ {
+ mysql_mutex_unlock(&mi->start_alter_lock);
+ continue;
+ }
+ info->state= start_alter_state::ROLLBACK_ALTER;
+ // Any possible CA that is (will be) waiting will complete this ALTER instance
+ info->direct_commit_alter= true;
+ mysql_cond_broadcast(&info->start_alter_cond); // notify SA:s
+ mysql_mutex_unlock(&mi->start_alter_lock);
+
+ // await SA in the COMPLETED state
+ mysql_mutex_lock(&mi->start_alter_lock);
+ while(info->state == start_alter_state::ROLLBACK_ALTER)
+ mysql_cond_wait(&info->start_alter_cond, &mi->start_alter_lock);
+
+ DBUG_ASSERT(info->state == start_alter_state::COMPLETED);
+
+ mysql_mutex_unlock(&mi->start_alter_lock);
+ }
+ mysql_mutex_unlock(&mi->start_alter_list_lock);
+
+ DBUG_EXECUTE_IF("rpl_slave_stop_CA_before_binlog",
+ {
+ debug_sync_set_action(thd, STRING_WITH_LEN("now signal proceed_CA_1"));
+ });
+
for (i= 0; i < domain_hash.records; ++i)
{
e= (struct rpl_parallel_entry *)my_hash_element(&domain_hash, i);
@@ -2472,6 +2698,17 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli)
}
}
}
+ // Now that all threads are docked, remained alter states are safe to destroy
+ mysql_mutex_lock(&mi->start_alter_list_lock);
+ info_iterator.rewind();
+ while ((info= info_iterator++))
+ {
+ info_iterator.remove();
+ mysql_cond_destroy(&info->start_alter_cond);
+ my_free(info);
+ }
+ mi->is_shutdown= false;
+ mysql_mutex_unlock(&mi->start_alter_list_lock);
}
@@ -2816,7 +3053,7 @@ rpl_parallel::do_event(rpl_group_info *serial_rgi, Log_event *ev,
uint32 domain_id= (rli->mi->using_gtid == Master_info::USE_GTID_NO ||
rli->mi->parallel_mode <= SLAVE_PARALLEL_MINIMAL ?
0 : gtid_ev->domain_id);
- if (!(e= find(domain_id)))
+ if (!(e= find(domain_id, rli)))
{
my_error(ER_OUT_OF_RESOURCES, MYF(MY_WME));
delete ev;
@@ -2828,6 +3065,7 @@ rpl_parallel::do_event(rpl_group_info *serial_rgi, Log_event *ev,
gtid.server_id= gtid_ev->server_id;
gtid.seq_no= gtid_ev->seq_no;
rli->update_relay_log_state(&gtid, 1);
+ serial_rgi->gtid_ev_flags_extra= gtid_ev->flags_extra;
if (process_gtid_for_restart_pos(rli, &gtid))
{
/*
diff --git a/sql/rpl_parallel.h b/sql/rpl_parallel.h
index 85aa8ca33c8..9a8dfc7e386 100644
--- a/sql/rpl_parallel.h
+++ b/sql/rpl_parallel.h
@@ -99,6 +99,18 @@ struct rpl_parallel_thread {
bool running;
bool stop;
bool pause_for_ftwrl;
+ /*
+ 0 = No start alter assigned
+ >0 = Start alter assigned
+ */
+ uint64 current_start_alter_id;
+ uint32 current_start_alter_domain_id;
+ /*
+ This flag is true when Start Alter just needs to be binlogged only.
+ This scenario will happens when there is congestion , and we can not
+ allocate independent worker to start alter.
+ */
+ bool reserved_start_alter_thread;
mysql_mutex_t LOCK_rpl_thread;
mysql_cond_t COND_rpl_thread;
mysql_cond_t COND_rpl_thread_queue;
@@ -298,6 +310,12 @@ struct rpl_parallel_thread_pool {
mysql_cond_t COND_rpl_thread_pool;
uint32 count;
bool inited;
+
+ /*
+ Lock first LOCK_rpl_thread_pool and then LOCK_rpl_thread to
+ update this variable.
+ */
+ uint32 current_start_alters;
/*
While FTWRL runs, this counter is incremented to make SQL thread or
STOP/START slave not try to start new activity while that operation
@@ -329,6 +347,7 @@ struct rpl_parallel_entry {
*/
uint32 need_sub_id_signal;
uint64 last_commit_id;
+ uint32 pending_start_alters;
bool active;
/*
Set when SQL thread is shutting down, and no more events can be processed,
@@ -411,10 +430,15 @@ struct rpl_parallel_entry {
uint64 count_committing_event_groups;
/* The group_commit_orderer object for the events currently being queued. */
group_commit_orderer *current_gco;
+ /* Relay log info of replication source for this entry. */
+ Relay_log_info *rli;
rpl_parallel_thread * choose_thread(rpl_group_info *rgi, bool *did_enter_cond,
PSI_stage_info *old_stage,
Gtid_log_event *gtid_ev);
+ rpl_parallel_thread *
+ choose_thread_internal(uint idx, bool *did_enter_cond, rpl_group_info *rgi,
+ PSI_stage_info *old_stage);
int queue_master_restart(rpl_group_info *rgi,
Format_description_log_event *fdev);
};
@@ -426,7 +450,7 @@ struct rpl_parallel {
rpl_parallel();
~rpl_parallel();
void reset();
- rpl_parallel_entry *find(uint32 domain_id);
+ rpl_parallel_entry *find(uint32 domain_id, Relay_log_info *rli);
void wait_for_done(THD *thd, Relay_log_info *rli);
void stop_during_until();
bool workers_idle();
diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc
index 763319f266d..83668449c2d 100644
--- a/sql/rpl_rli.cc
+++ b/sql/rpl_rli.cc
@@ -1632,7 +1632,8 @@ scan_one_gtid_slave_pos_table(THD *thd, HASH *hash, DYNAMIC_ARRAY *array,
goto end;
}
- if ((rec= my_hash_search(hash, (const uchar *)&domain_id, 0)))
+ if ((rec= my_hash_search(hash, (const uchar *)&domain_id,
+ sizeof(domain_id))))
{
entry= (struct gtid_pos_element *)rec;
if (entry->sub_id >= sub_id)
@@ -2151,16 +2152,24 @@ rpl_group_info::reinit(Relay_log_info *rli)
long_find_row_note_printed= false;
did_mark_start_commit= false;
gtid_ev_flags2= 0;
+ gtid_ev_flags_extra= 0;
+ gtid_ev_sa_seq_no= 0;
last_master_timestamp = 0;
gtid_ignore_duplicate_state= GTID_DUPLICATE_NULL;
speculation= SPECULATE_NO;
+ rpt= NULL;
+ start_alter_ev= NULL;
+ direct_commit_alter= false;
commit_orderer.reinit();
}
rpl_group_info::rpl_group_info(Relay_log_info *rli)
: thd(0), wait_commit_sub_id(0),
wait_commit_group_info(0), parallel_entry(0),
- deferred_events(NULL), m_annotate_event(0), is_parallel_exec(false)
+ deferred_events(NULL), m_annotate_event(0), is_parallel_exec(false),
+ gtid_ev_flags2(0), gtid_ev_flags_extra(0), gtid_ev_sa_seq_no(0),
+ reserved_start_alter_thread(0), finish_event_group_called(0), rpt(NULL),
+ start_alter_ev(NULL), direct_commit_alter(false), sa_info(NULL)
{
reinit(rli);
bzero(&current_gtid, sizeof(current_gtid));
@@ -2169,7 +2178,6 @@ rpl_group_info::rpl_group_info(Relay_log_info *rli)
mysql_cond_init(key_rpl_group_info_sleep_cond, &sleep_cond, NULL);
}
-
rpl_group_info::~rpl_group_info()
{
free_annotate_event();
@@ -2194,6 +2202,7 @@ event_group_new_gtid(rpl_group_info *rgi, Gtid_log_event *gev)
rgi->current_gtid.seq_no= gev->seq_no;
rgi->commit_id= gev->commit_id;
rgi->gtid_pending= true;
+ rgi->sa_info= NULL;
return 0;
}
diff --git a/sql/rpl_rli.h b/sql/rpl_rli.h
index cc807852bf2..80ee143a8e8 100644
--- a/sql/rpl_rli.h
+++ b/sql/rpl_rli.h
@@ -641,6 +641,33 @@ struct inuse_relaylog {
}
};
+enum start_alter_state
+{
+ INVALID= 0,
+ REGISTERED, // Start Alter exist, Default state
+ COMMIT_ALTER, // COMMIT the alter
+ ROLLBACK_ALTER, // Rollback the alter
+ COMPLETED // COMMIT/ROLLBACK Alter written in binlog
+};
+
+struct start_alter_info
+{
+ /*
+ ALTER id is defined as a pair of GTID's seq_no and domain_id.
+ */
+ decltype(rpl_gtid::seq_no) sa_seq_no; // key for searching (SA's id)
+ uint32 domain_id;
+ bool direct_commit_alter; // when true CA thread executes the whole query
+ /*
+ 0 prepared and not error from commit and rollback
+ >0 error expected in commit/rollback
+ Rollback can be logged with 0 error if master is killed
+ */
+ uint error;
+ enum start_alter_state state;
+ /* We are not using mysql_cond_t because we do not need PSI */
+ mysql_cond_t start_alter_cond;
+};
/*
This is data for various state needed to be kept for the processing of
@@ -760,6 +787,9 @@ struct rpl_group_info
bool did_mark_start_commit;
/* Copy of flags2 from GTID event. */
uchar gtid_ev_flags2;
+ /* Copy of flags3 from GTID event. */
+ uint16 gtid_ev_flags_extra;
+ uint64 gtid_ev_sa_seq_no;
enum {
GTID_DUPLICATE_NULL=0,
GTID_DUPLICATE_IGNORE=1,
@@ -834,6 +864,15 @@ struct rpl_group_info
RETRY_KILL_KILLED
};
uchar killed_for_retry;
+ bool reserved_start_alter_thread;
+ bool finish_event_group_called;
+ /*
+ Used for two phase alter table
+ */
+ rpl_parallel_thread *rpt;
+ Query_log_event *start_alter_ev;
+ bool direct_commit_alter;
+ start_alter_info *sa_info;
rpl_group_info(Relay_log_info *rli_);
~rpl_group_info();
@@ -961,6 +1000,19 @@ struct rpl_group_info
if (!is_parallel_exec)
rli->event_relay_log_pos= future_event_relay_log_pos;
}
+
+ void finish_start_alter_event_group();
+
+ bool get_finish_event_group_called()
+ {
+ return finish_event_group_called;
+ }
+
+ void set_finish_event_group_called(bool value)
+ {
+ finish_event_group_called= value;
+ }
+
};
diff --git a/sql/rpl_utility.cc b/sql/rpl_utility.cc
index 9ea8bb3b822..04a2efb3750 100644
--- a/sql/rpl_utility.cc
+++ b/sql/rpl_utility.cc
@@ -338,7 +338,7 @@ bool event_checksum_test(uchar *event_buf, ulong event_len,
DBUG_ASSERT(event_buf[EVENT_TYPE_OFFSET] == FORMAT_DESCRIPTION_EVENT);
event_buf[FLAGS_OFFSET]= (uchar) flags;
}
- res= DBUG_EVALUATE_IF("simulate_checksum_test_failure", TRUE, computed != incoming);
+ res= (DBUG_IF("simulate_checksum_test_failure") || computed != incoming);
}
return res;
}
diff --git a/sql/semisync_master_ack_receiver.cc b/sql/semisync_master_ack_receiver.cc
index b65b7824a0e..b54ad58d153 100644
--- a/sql/semisync_master_ack_receiver.cc
+++ b/sql/semisync_master_ack_receiver.cc
@@ -72,7 +72,7 @@ bool Ack_receiver::start()
m_status= ST_UP;
- if (DBUG_EVALUATE_IF("rpl_semisync_simulate_create_thread_failure", 1, 0) ||
+ if (DBUG_IF("rpl_semisync_simulate_create_thread_failure") ||
pthread_attr_init(&attr) != 0 ||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE) != 0 ||
#ifndef _WIN32
@@ -247,7 +247,7 @@ void Ack_receiver::run()
{
mysql_mutex_unlock(&m_mutex);
- ret= DBUG_EVALUATE_IF("rpl_semisync_simulate_select_error", -1, ret);
+ ret= DBUG_IF("rpl_semisync_simulate_select_error") ? -1 : ret;
if (ret == -1 && errno != EINTR)
sql_print_information("Failed to wait on semi-sync sockets, "
diff --git a/sql/semisync_slave.cc b/sql/semisync_slave.cc
index 3e7578b6a53..788aab78911 100644
--- a/sql/semisync_slave.cc
+++ b/sql/semisync_slave.cc
@@ -63,7 +63,7 @@ int Repl_semi_sync_slave::slave_read_sync_header(const uchar *header,
if (rpl_semi_sync_slave_status)
{
- if (DBUG_EVALUATE_IF("semislave_corrupt_log", 0, 1)
+ if (!DBUG_IF("semislave_corrupt_log")
&& header[0] == k_packet_magic_num)
{
semi_sync_need_reply = (header[1] & k_packet_flag_sync);
@@ -144,7 +144,7 @@ void Repl_semi_sync_slave::kill_connection(MYSQL *mysql)
bool ret= (!mysql_real_connect(kill_mysql, mysql->host,
mysql->user, mysql->passwd,0, mysql->port, mysql->unix_socket, 0));
- if (DBUG_EVALUATE_IF("semisync_slave_failed_kill", 1, 0) || ret)
+ if (DBUG_IF("semisync_slave_failed_kill") || ret)
{
sql_print_information("cannot connect to master to kill slave io_thread's "
"connection");
@@ -198,8 +198,7 @@ int Repl_semi_sync_slave::request_transmit(Master_info *mi)
}
row= mysql_fetch_row(res);
- if (DBUG_EVALUATE_IF("master_not_support_semisync", 1, 0)
- || !row)
+ if (DBUG_IF("master_not_support_semisync") || !row)
{
/* Master does not support semi-sync */
sql_print_warning("Master server does not support semi-sync, "
@@ -260,7 +259,7 @@ int Repl_semi_sync_slave::slave_reply(Master_info *mi)
name_len + REPLY_BINLOG_NAME_OFFSET);
if (!reply_res)
{
- reply_res = DBUG_EVALUATE_IF("semislave_failed_net_flush", 1, net_flush(net));
+ reply_res = (DBUG_IF("semislave_failed_net_flush") || net_flush(net));
if (reply_res)
sql_print_error("Semi-sync slave net_flush() reply failed");
rpl_semi_sync_slave_send_ack++;
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 3dd97527433..aa9ec5ab5ca 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -85,7 +85,7 @@ uint sys_var_elements()
int sys_var_add_options(DYNAMIC_ARRAY *long_options, int parse_flags)
{
- uint saved_elements= long_options->elements;
+ size_t saved_elements= long_options->elements;
DBUG_ENTER("sys_var_add_options");
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 9fcbc324805..5956c159278 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -1788,7 +1788,7 @@ ER_TOO_LONG_KEY 42000 S1009
spa "Declaración de clave demasiado larga. La máxima longitud de clave es de %d"
swe "För lång nyckel. Högsta tillåtna nyckellängd är %d"
ukr "Зазначений ключ задовгий. Ðайбільша довжина ключа %d байтів"
-ER_KEY_COLUMN_DOES_NOT_EXITS 42000 S1009
+ER_KEY_COLUMN_DOES_NOT_EXIST 42000 S1009
chi "索引列'%-.192s'ä¸åœ¨è¡¨é‡Œ"
cze "KlíÄový sloupec '%-.192s' v tabulce neexistuje"
dan "Nøglefeltet '%-.192s' eksisterer ikke i tabellen"
@@ -6638,12 +6638,12 @@ ER_PARTITION_MGMT_ON_NONPARTITIONED
ER_FEATURE_NOT_SUPPORTED_WITH_PARTITIONING
eng "Partitioned tables do not support %s"
spa "Las tablas particionadas no soportan %s"
-ER_DROP_PARTITION_NON_EXISTENT
- chi "分区列表错误%-.64s"
- eng "Error in list of partitions to %-.64s"
- ger "Fehler in der Partitionsliste bei %-.64s"
- spa "Error en lista de particiones para %-.64s"
- swe "Fel i listan av partitioner att %-.64s"
+ER_PARTITION_DOES_NOT_EXIST
+ chi "分区å称或分区列表错误"
+ eng "Wrong partition name or partition list"
+ ger "Falscher Name einer Partition oder Fehler in der Partitionsliste"
+ spa "Error en lista de particiones"
+ swe "Fel namn av en partition eller fel i listan av partitioner"
ER_DROP_LAST_PARTITION
chi "无法删除所有分区,请使用删除表"
eng "Cannot remove all partitions, use DROP TABLE instead"
@@ -9773,9 +9773,9 @@ ER_UNUSED_23
spa "Nunca debería vd de ver esto"
ER_PARTITION_WRONG_TYPE
- chi "错误的分区类型,预期类型:%`s"
- eng "Wrong partitioning type, expected type: %`s"
- spa "Tipo de partición equivocada, tipo esperado: %`s"
+ chi "错误分区类型%`s,应当是%`s"
+ eng "Wrong partition type %`s for partitioning by %`s"
+ spa "Tipo de partición equivocada %`s para particionado mediante %`s"
WARN_VERS_PART_FULL
chi "版本化表%`s.%`s:partition%`s已满,添加更多历å²åˆ†åŒº(out of %s)"
@@ -10060,3 +10060,15 @@ ER_REMOVED_ORPHAN_TRIGGER
ER_STORAGE_ENGINE_DISABLED
eng "Storage engine %s is disabled"
spa "El motor de almacenaje %s está desactivado"
+WARN_SFORMAT_ERROR
+ eng "SFORMAT error: %s"
+ER_PARTITION_CONVERT_SUBPARTITIONED
+ eng "Convert partition is not supported for subpartitioned table."
+ER_PROVIDER_NOT_LOADED
+ eng "MariaDB tried to use the %s, but its provider plugin is not loaded"
+ER_JSON_HISTOGRAM_PARSE_FAILED
+ eng "Failed to parse histogram for table %s.%s: %s at offset %d."
+ER_SF_OUT_INOUT_ARG_NOT_ALLOWED
+ eng "OUT or INOUT argument %d for function %s is not allowed here"
+ER_INCONSISTENT_SLAVE_TEMP_TABLE
+ eng "Replicated query '%s' table `%s.%s` can not be temporary"
diff --git a/sql/signal_handler.cc b/sql/signal_handler.cc
index 4ca3c855066..9991f261202 100644
--- a/sql/signal_handler.cc
+++ b/sql/signal_handler.cc
@@ -72,7 +72,7 @@ static inline void output_core_info()
#endif
{
my_safe_printf_stderr("Resource Limits:\n");
- while ((len= my_read(fd, (uchar*)buff, sizeof(buff), MYF(0))) > 0)
+ while ((len= read(fd, (uchar*)buff, sizeof(buff))) > 0)
{
my_write_stderr(buff, len);
}
@@ -82,7 +82,7 @@ static inline void output_core_info()
if ((fd= my_open("/proc/sys/kernel/core_pattern", O_RDONLY,
MYF(MY_NO_REGISTER))) >= 0)
{
- len= my_read(fd, (uchar*)buff, sizeof(buff), MYF(0));
+ len= read(fd, (uchar*)buff, sizeof(buff));
my_safe_printf_stderr("Core pattern: %.*s\n", (int) len, buff);
my_close(fd, MYF(0));
}
diff --git a/sql/slave.cc b/sql/slave.cc
index 64a35ff0119..24d9700af74 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -788,7 +788,7 @@ bool init_slave_skip_errors(const char* arg)
if (!arg || !*arg) // No errors defined
goto end;
- if (unlikely(my_bitmap_init(&slave_error_mask,0,MAX_SLAVE_ERROR,0)))
+ if (my_bitmap_init(&slave_error_mask,0,MAX_SLAVE_ERROR))
DBUG_RETURN(1);
use_slave_mask= 1;
@@ -2329,11 +2329,11 @@ past_checksum:
/* Announce MariaDB slave capabilities. */
DBUG_EXECUTE_IF("simulate_slave_capability_none", goto after_set_capability;);
{
- int rc= DBUG_EVALUATE_IF("simulate_slave_capability_old_53",
+ int rc= DBUG_IF("simulate_slave_capability_old_53") ?
mysql_real_query(mysql, STRING_WITH_LEN("SET @mariadb_slave_capability="
- STRINGIFY_ARG(MARIA_SLAVE_CAPABILITY_ANNOTATE))),
+ STRINGIFY_ARG(MARIA_SLAVE_CAPABILITY_ANNOTATE))) :
mysql_real_query(mysql, STRING_WITH_LEN("SET @mariadb_slave_capability="
- STRINGIFY_ARG(MARIA_SLAVE_CAPABILITY_MINE))));
+ STRINGIFY_ARG(MARIA_SLAVE_CAPABILITY_MINE)));
if (unlikely(rc))
{
err_code= mysql_errno(mysql);
@@ -3932,6 +3932,10 @@ apply_event_and_update_pos_apply(Log_event* ev, THD* thd, rpl_group_info *rgi,
DBUG_PRINT("info", ("apply_event error = %d", exec_res));
if (exec_res == 0)
{
+ if (thd->rgi_slave && (thd->rgi_slave->gtid_ev_flags_extra &
+ Gtid_log_event::FL_START_ALTER_E1) &&
+ thd->rgi_slave->get_finish_event_group_called())
+ DBUG_RETURN(exec_res ? 1 : 0);
int error= ev->update_pos(rgi);
#ifdef DBUG_TRACE
DBUG_PRINT("info", ("update_pos error = %d", error));
@@ -4055,6 +4059,11 @@ int
apply_event_and_update_pos_for_parallel(Log_event* ev, THD* thd,
rpl_group_info *rgi)
{
+ int rc= 0;
+ ulong retries= 0;
+ bool is_sa= rgi->gtid_ev_flags_extra == Gtid_log_event::FL_START_ALTER_E1;
+ bool is_sa_temp_err= false;
+
mysql_mutex_assert_not_owner(&rgi->rli->data_lock);
int reason= apply_event_and_update_pos_setup(ev, thd, rgi);
/*
@@ -4066,7 +4075,51 @@ apply_event_and_update_pos_for_parallel(Log_event* ev, THD* thd,
Calling sql_delay_event() was handled in the SQL driver thread when
doing parallel replication.
*/
- return apply_event_and_update_pos_apply(ev, thd, rgi, reason);
+ do
+ {
+ rc= apply_event_and_update_pos_apply(ev, thd, rgi, reason);
+ if (rc && is_sa)
+ {
+ is_sa_temp_err=
+ is_parallel_retry_error(rgi, thd->get_stmt_da()->sql_errno());
+ }
+ }
+ while(is_sa_temp_err && retries++ < slave_trans_retries);
+
+ if (is_sa_temp_err)
+ {
+ Master_info *mi= rgi->rli->mi;
+ mysql_mutex_lock(&mi->start_alter_lock);
+
+ DBUG_ASSERT(!rgi->sa_info->direct_commit_alter);
+ /*
+ Give up retrying to hand the whole ALTER execution over to
+ the "Complete" ALTER.
+ */
+ rgi->sa_info->direct_commit_alter= true;
+ rgi->sa_info->state= start_alter_state::COMPLETED;
+ mysql_cond_broadcast(&rgi->sa_info->start_alter_cond);
+ mysql_mutex_unlock(&mi->start_alter_lock);
+ if (global_system_variables.log_warnings > 2)
+ {
+ rpl_gtid *gtid= &rgi->current_gtid;
+ sql_print_information("Start Alter Query '%s' "
+ "GTID %u-%u-%llu having a temporary error %d code "
+ "has been unsuccessfully retried %lu times; its "
+ "parallel optimistic execution now proceeds in "
+ "legacy mode",
+ static_cast<Query_log_event*>(ev)->query,
+ gtid->domain_id, gtid->server_id, gtid->seq_no,
+ thd->get_stmt_da()->sql_errno(), retries - 1);
+ }
+ thd->clear_error();
+ thd->reset_killed();
+ rgi->killed_for_retry = rpl_group_info::RETRY_KILL_NONE;
+
+ rc= false;
+ }
+
+ return rc;
}
@@ -4705,7 +4758,7 @@ pthread_handler_t handle_slave_io(void *arg)
}
thd->variables.wsrep_on= 0;
- if (DBUG_EVALUATE_IF("failed_slave_start", 1, 0)
+ if (DBUG_IF("failed_slave_start")
|| repl_semisync_slave.slave_start(mi))
{
mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL,
@@ -4982,7 +5035,7 @@ Stopping slave I/O thread due to out-of-memory error from master");
(!repl_semisync_slave.get_slave_enabled() ||
(!(mi->semi_ack & SEMI_SYNC_SLAVE_DELAY_SYNC) ||
(mi->semi_ack & (SEMI_SYNC_NEED_ACK)))) &&
- (DBUG_EVALUATE_IF("failed_flush_master_info", 1, 0) ||
+ (DBUG_IF("failed_flush_master_info") ||
flush_master_info(mi, TRUE, TRUE)))
{
sql_print_error("Failed to flush master info file");
@@ -5611,8 +5664,10 @@ pthread_handler_t handle_slave_sql(void *arg)
err:
if (mi->using_parallel())
+ {
rli->parallel.wait_for_done(thd, rli);
- /* Gtid_list_log_event::do_apply_event has already reported the GTID until */
+ };
+ /* Gtid_list_log_event::do_apply_event has already reported the GTID until */
if (rli->stop_for_until && rli->until_condition != Relay_log_info::UNTIL_GTID)
{
if (global_system_variables.log_warnings > 2)
@@ -6327,12 +6382,19 @@ static int queue_event(Master_info* mi, const uchar *buf, ulong event_len)
Rotate_log_event rev(buf, checksum_alg != BINLOG_CHECKSUM_ALG_OFF ?
event_len - BINLOG_CHECKSUM_LEN : event_len,
mi->rli.relay_log.description_event_for_queue);
-
- if (unlikely(mi->gtid_reconnect_event_skip_count) &&
- unlikely(!mi->gtid_event_seen) &&
- rev.is_artificial_event() &&
- (mi->prev_master_id != mi->master_id ||
- strcmp(rev.new_log_ident, mi->master_log_name) != 0))
+ bool master_changed= false;
+ bool maybe_crashed= false;
+ // Exclude server start scenario
+ if ((mi->prev_master_id && mi->master_id) &&
+ (mi->prev_master_id != mi->master_id))
+ master_changed= true;
+ if ((mi->master_log_name[0]!='\0') &&
+ (strcmp(rev.new_log_ident, mi->master_log_name) != 0))
+ maybe_crashed= true;
+
+ if (unlikely((mi->gtid_reconnect_event_skip_count && master_changed) ||
+ maybe_crashed) &&
+ unlikely(!mi->gtid_event_seen) && rev.is_artificial_event())
{
/*
Artificial Rotate_log_event is the first event we receive at the start
@@ -6368,26 +6430,37 @@ static int queue_event(Master_info* mi, const uchar *buf, ulong event_len)
case likewise rollback the partially received event group.
*/
Format_description_log_event fdle(4);
+ fdle.checksum_alg= checksum_alg;
+
+ /*
+ Possible crash is flagged in being created FD' common header
+ to conduct any necessary cleanup by the slave applier.
+ */
+ if (maybe_crashed)
+ fdle.flags |= LOG_EVENT_BINLOG_IN_USE_F;
- if (mi->prev_master_id != mi->master_id)
- sql_print_warning("The server_id of master server changed in the "
- "middle of GTID %u-%u-%llu. Assuming a change of "
- "master server, so rolling back the previously "
- "received partial transaction. Expected: %lu, "
- "received: %lu", mi->last_queued_gtid.domain_id,
- mi->last_queued_gtid.server_id,
- mi->last_queued_gtid.seq_no,
- mi->prev_master_id, mi->master_id);
- else if (strcmp(rev.new_log_ident, mi->master_log_name) != 0)
- sql_print_warning("Unexpected change of master binlog file name in the "
- "middle of GTID %u-%u-%llu, assuming that master has "
- "crashed and rolling back the transaction. Expected: "
- "'%s', received: '%s'",
- mi->last_queued_gtid.domain_id,
- mi->last_queued_gtid.server_id,
- mi->last_queued_gtid.seq_no,
- mi->master_log_name, rev.new_log_ident);
+ if (mi->gtid_reconnect_event_skip_count)
+ {
+ if (master_changed)
+ sql_print_warning("The server_id of master server changed in the "
+ "middle of GTID %u-%u-%llu. Assuming a change of "
+ "master server, so rolling back the previously "
+ "received partial transaction. Expected: %lu, "
+ "received: %lu", mi->last_queued_gtid.domain_id,
+ mi->last_queued_gtid.server_id,
+ mi->last_queued_gtid.seq_no,
+ mi->prev_master_id, mi->master_id);
+ else
+ sql_print_warning("Unexpected change of master binlog file name in "
+ "the middle of GTID %u-%u-%llu, assuming that "
+ "master has crashed and rolling back the "
+ "transaction. Expected: '%s', received: '%s'",
+ mi->last_queued_gtid.domain_id,
+ mi->last_queued_gtid.server_id,
+ mi->last_queued_gtid.seq_no, mi->master_log_name,
+ rev.new_log_ident);
+ }
mysql_mutex_lock(log_lock);
if (likely(!rli->relay_log.write_event(&fdle) &&
!rli->relay_log.flush_and_sync(NULL)))
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 6d982aac937..d23b5e88baa 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -412,6 +412,26 @@ Item *THD::sp_fix_func_item(Item **it_addr)
/**
+ Prepare an Item for evaluation as an assignment source,
+ for assignment to the given target.
+
+ @param to - the assignment target
+ @param it_addr - a pointer on item refernce
+
+ @retval - NULL on error
+ @retval - a prepared item pointer on success
+*/
+Item *THD::sp_fix_func_item_for_assignment(const Field *to, Item **it_addr)
+{
+ DBUG_ENTER("THD::sp_fix_func_item_for_assignment");
+ Item *res= sp_fix_func_item(it_addr);
+ if (res && (!res->check_assignability_to(to, false)))
+ DBUG_RETURN(res);
+ DBUG_RETURN(NULL);
+}
+
+
+/**
Evaluate an expression and store the result in the field.
@param result_field the field to store the result
@@ -2080,7 +2100,8 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount,
/* Arguments must be fixed in Item_func_sp::fix_fields */
DBUG_ASSERT(argp[arg_no]->fixed());
- if ((err_status= (*func_ctx)->set_parameter(thd, arg_no, &(argp[arg_no]))))
+ err_status= bind_input_param(thd, argp[arg_no], arg_no, *func_ctx, TRUE);
+ if (err_status)
goto err_with_cleanup;
}
@@ -2203,6 +2224,19 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount,
my_error(ER_SP_NORETURNEND, MYF(0), m_name.str);
err_status= TRUE;
}
+ else
+ {
+ /*
+ Copy back all OUT or INOUT values to the previous frame, or
+ set global user variables
+ */
+ for (arg_no= 0; arg_no < argcount; arg_no++)
+ {
+ err_status= bind_output_param(thd, argp[arg_no], arg_no, octx, *func_ctx);
+ if (err_status)
+ break;
+ }
+ }
}
#ifndef NO_EMBEDDED_ACCESS_CHECKS
@@ -2325,50 +2359,9 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
if (!arg_item)
break;
- sp_variable *spvar= m_pcont->find_variable(i);
-
- if (!spvar)
- continue;
-
- if (spvar->mode != sp_variable::MODE_IN)
- {
- Settable_routine_parameter *srp=
- arg_item->get_settable_routine_parameter();
-
- if (!srp)
- {
- my_error(ER_SP_NOT_VAR_ARG, MYF(0), i+1, ErrConvDQName(this).ptr());
- err_status= TRUE;
- break;
- }
-
- srp->set_required_privilege(spvar->mode == sp_variable::MODE_INOUT);
- }
-
- if (spvar->mode == sp_variable::MODE_OUT)
- {
- Item_null *null_item= new (thd->mem_root) Item_null(thd);
- Item *tmp_item= null_item;
-
- if (!null_item ||
- nctx->set_parameter(thd, i, &tmp_item))
- {
- DBUG_PRINT("error", ("set variable failed"));
- err_status= TRUE;
- break;
- }
- }
- else
- {
- if (nctx->set_parameter(thd, i, it_args.ref()))
- {
- DBUG_PRINT("error", ("set variable 2 failed"));
- err_status= TRUE;
- break;
- }
- }
-
- TRANSACT_TRACKER(add_trx_state_from_thd(thd));
+ err_status= bind_input_param(thd, arg_item, i, nctx, FALSE);
+ if (err_status)
+ break;
}
/*
@@ -2478,31 +2471,9 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
if (!arg_item)
break;
- sp_variable *spvar= m_pcont->find_variable(i);
-
- if (spvar->mode == sp_variable::MODE_IN)
- continue;
-
- Settable_routine_parameter *srp=
- arg_item->get_settable_routine_parameter();
-
- DBUG_ASSERT(srp);
-
- if (srp->set_value(thd, octx, nctx->get_variable_addr(i)))
- {
- DBUG_PRINT("error", ("set value failed"));
- err_status= TRUE;
+ err_status= bind_output_param(thd, arg_item, i, octx, nctx);
+ if (err_status)
break;
- }
-
- Send_field *out_param_info= new (thd->mem_root) Send_field(thd, nctx->get_parameter(i));
- out_param_info->db_name= m_db;
- out_param_info->table_name= m_name;
- out_param_info->org_table_name= m_name;
- out_param_info->col_name= spvar->name;
- out_param_info->org_col_name= spvar->name;
-
- srp->set_out_param_info(out_param_info);
}
}
@@ -2533,6 +2504,112 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
DBUG_RETURN(err_status);
}
+bool
+sp_head::bind_input_param(THD *thd,
+ Item *arg_item,
+ uint arg_no,
+ sp_rcontext *nctx,
+ bool is_function)
+{
+ DBUG_ENTER("sp_head::bind_input_param");
+
+ sp_variable *spvar= m_pcont->find_variable(arg_no);
+ if (!spvar)
+ DBUG_RETURN(FALSE);
+
+ if (spvar->mode != sp_variable::MODE_IN)
+ {
+ Settable_routine_parameter *srp=
+ arg_item->get_settable_routine_parameter();
+
+ if (!srp)
+ {
+ my_error(ER_SP_NOT_VAR_ARG, MYF(0), arg_no+1, ErrConvDQName(this).ptr());
+ DBUG_RETURN(TRUE);
+ }
+
+ if (is_function)
+ {
+ /*
+ Check if the function is called from SELECT/INSERT/UPDATE/DELETE query
+ and parameter is OUT or INOUT.
+ If yes, it is an invalid call - throw error.
+ */
+ if (thd->lex->sql_command == SQLCOM_SELECT ||
+ thd->lex->sql_command == SQLCOM_INSERT ||
+ thd->lex->sql_command == SQLCOM_INSERT_SELECT ||
+ thd->lex->sql_command == SQLCOM_UPDATE ||
+ thd->lex->sql_command == SQLCOM_DELETE)
+ {
+ my_error(ER_SF_OUT_INOUT_ARG_NOT_ALLOWED, MYF(0), arg_no+1, m_name.str);
+ DBUG_RETURN(TRUE);
+ }
+ }
+
+ srp->set_required_privilege(spvar->mode == sp_variable::MODE_INOUT);
+ }
+
+ if (spvar->mode == sp_variable::MODE_OUT)
+ {
+ Item_null *null_item= new (thd->mem_root) Item_null(thd);
+ Item *tmp_item= null_item;
+
+ if (!null_item ||
+ nctx->set_parameter(thd, arg_no, &tmp_item))
+ {
+ DBUG_PRINT("error", ("set variable failed"));
+ DBUG_RETURN(TRUE);
+ }
+ }
+ else
+ {
+ if (nctx->set_parameter(thd, arg_no, &arg_item))
+ {
+ DBUG_PRINT("error", ("set variable 2 failed"));
+ DBUG_RETURN(TRUE);
+ }
+ }
+
+ TRANSACT_TRACKER(add_trx_state_from_thd(thd));
+
+ DBUG_RETURN(FALSE);
+}
+
+bool
+sp_head::bind_output_param(THD *thd,
+ Item *arg_item,
+ uint arg_no,
+ sp_rcontext *octx,
+ sp_rcontext *nctx)
+{
+ DBUG_ENTER("sp_head::bind_output_param");
+
+ sp_variable *spvar= m_pcont->find_variable(arg_no);
+ if (spvar->mode == sp_variable::MODE_IN)
+ DBUG_RETURN(FALSE);
+
+ Settable_routine_parameter *srp=
+ arg_item->get_settable_routine_parameter();
+
+ DBUG_ASSERT(srp);
+
+ if (srp->set_value(thd, octx, nctx->get_variable_addr(arg_no)))
+ {
+ DBUG_PRINT("error", ("set value failed"));
+ DBUG_RETURN(TRUE);
+ }
+
+ Send_field *out_param_info= new (thd->mem_root) Send_field(thd, nctx->get_parameter(arg_no));
+ out_param_info->db_name= m_db;
+ out_param_info->table_name= m_name;
+ out_param_info->org_table_name= m_name;
+ out_param_info->col_name= spvar->name;
+ out_param_info->org_col_name= spvar->name;
+
+ srp->set_out_param_info(out_param_info);
+
+ DBUG_RETURN(FALSE);
+}
/**
Reset lex during parsing, before we parse a sub statement.
@@ -4072,7 +4149,7 @@ sp_instr_jump_if_not::exec_core(THD *thd, uint *nextp)
Item *it;
int res;
- it= thd->sp_prepare_func_item(&m_expr);
+ it= thd->sp_prepare_func_item(&m_expr, 1);
if (! it)
{
res= -1;
diff --git a/sql/sp_head.h b/sql/sp_head.h
index 57def5baa83..5b4aa36e518 100644
--- a/sql/sp_head.h
+++ b/sql/sp_head.h
@@ -504,6 +504,18 @@ private:
sp_assignment_lex *param_lex,
Item_args *parameters);
+ bool bind_input_param(THD *thd,
+ Item *arg_item,
+ uint arg_no,
+ sp_rcontext *nctx,
+ bool is_function);
+
+ bool bind_output_param(THD *thd,
+ Item *arg_item,
+ uint arg_no,
+ sp_rcontext *octx,
+ sp_rcontext *nctx);
+
public:
/**
Generate a code for an "OPEN cursor" statement.
@@ -560,7 +572,7 @@ public:
{ return m_flags & MODIFIES_DATA; }
inline uint instructions()
- { return m_instr.elements; }
+ { return (uint)m_instr.elements; }
inline sp_instr *
last_instruction()
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc
index c4c19dd39f6..d2fe53a2431 100644
--- a/sql/sp_rcontext.cc
+++ b/sql/sp_rcontext.cc
@@ -518,7 +518,8 @@ bool sp_rcontext::handle_sql_condition(THD *thd,
found_condition=
new (callers_arena->mem_root) Sql_condition(callers_arena->mem_root,
da->get_error_condition_identity(),
- da->message());
+ da->message(),
+ da->current_row_for_warning());
}
}
else if (da->current_statement_warn_count())
@@ -714,7 +715,7 @@ Item_cache *sp_rcontext::create_case_expr_holder(THD *thd,
bool sp_rcontext::set_case_expr(THD *thd, int case_expr_id,
Item **case_expr_item_ptr)
{
- Item *case_expr_item= thd->sp_prepare_func_item(case_expr_item_ptr);
+ Item *case_expr_item= thd->sp_prepare_func_item(case_expr_item_ptr, 1);
if (!case_expr_item)
return true;
diff --git a/sql/sp_rcontext.h b/sql/sp_rcontext.h
index 0e0e8921f86..ea669b2d1d8 100644
--- a/sql/sp_rcontext.h
+++ b/sql/sp_rcontext.h
@@ -111,15 +111,18 @@ public:
/// Text message.
char *message;
+ /** Row number where the condition has happened */
+ ulong m_row_number;
+
/// The constructor.
///
/// @param _sql_condition The SQL condition.
/// @param arena Query arena for SP
- Sql_condition_info(const Sql_condition *_sql_condition,
- Query_arena *arena)
+ Sql_condition_info(const Sql_condition *_sql_condition, Query_arena *arena)
:Sql_condition_identity(*_sql_condition)
{
message= strdup_root(arena->mem_root, _sql_condition->get_message_text());
+ m_row_number= _sql_condition->m_row_number;
}
};
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 66d5aaa9d2f..d225b018488 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -2224,14 +2224,14 @@ static bool has_validation_plugins()
MariaDB_PASSWORD_VALIDATION_PLUGIN, NULL);
}
-struct validation_data { const LEX_CSTRING *user, *password; };
+struct validation_data { const LEX_CSTRING *user, *password, *host; };
static my_bool do_validate(THD *, plugin_ref plugin, void *arg)
{
struct validation_data *data= (struct validation_data *)arg;
struct st_mariadb_password_validation *handler=
(st_mariadb_password_validation *)plugin_decl(plugin)->info;
- if (handler->validate_password(data->user, data->password))
+ if (handler->validate_password(data->user, data->password, data->host))
{
my_error(ER_NOT_VALID_PASSWORD, MYF(0), plugin_ref_to_int(plugin)->name.str);
return true;
@@ -2241,12 +2241,14 @@ static my_bool do_validate(THD *, plugin_ref plugin, void *arg)
static bool validate_password(THD *thd, const LEX_CSTRING &user,
+ const LEX_CSTRING &host,
const LEX_CSTRING &pwtext, bool has_hash)
{
if (pwtext.length || !has_hash)
{
struct validation_data data= { &user,
- pwtext.str ? &pwtext : &empty_clex_str };
+ pwtext.str ? &pwtext : &empty_clex_str,
+ &host };
if (plugin_foreach(NULL, do_validate,
MariaDB_PASSWORD_VALIDATION_PLUGIN, &data))
{
@@ -2299,6 +2301,7 @@ static int set_user_salt(ACL_USER::AUTH *auth, plugin_ref plugin)
not loaded, if the auth_string is invalid, if the password is not applicable
*/
static int set_user_auth(THD *thd, const LEX_CSTRING &user,
+ const LEX_CSTRING &host,
ACL_USER::AUTH *auth, const LEX_CSTRING &pwtext)
{
const char *plugin_name= auth->plugin.str;
@@ -2330,7 +2333,7 @@ static int set_user_auth(THD *thd, const LEX_CSTRING &user,
}
if (info->hash_password &&
- validate_password(thd, user, pwtext, auth->auth_string.length))
+ validate_password(thd, user, host, pwtext, auth->auth_string.length))
{
res= ER_NOT_VALID_PASSWORD;
goto end;
@@ -3441,7 +3444,9 @@ static int acl_user_update(THD *thd, ACL_USER *acl_user, uint nauth,
auth->auth_str);
if (fix_user_plugin_ptr(work_copy + i))
work_copy[i].plugin= safe_lexcstrdup_root(&acl_memroot, auth->plugin);
- if (set_user_auth(thd, acl_user->user, work_copy + i, auth->pwtext))
+ if (set_user_auth(thd, acl_user->user,
+ {acl_user->host.hostname, acl_user->hostname_length},
+ work_copy + i, auth->pwtext))
return 1;
}
}
@@ -3709,14 +3714,14 @@ static void init_check_host(void)
(my_hash_get_key) check_get_key, 0, 0);
if (!allow_all_hosts)
{
- for (uint i=0 ; i < acl_users.elements ; i++)
+ for (size_t i=0 ; i < acl_users.elements ; i++)
{
ACL_USER *acl_user=dynamic_element(&acl_users,i,ACL_USER*);
if (strchr(acl_user->host.hostname,wild_many) ||
strchr(acl_user->host.hostname,wild_one) ||
acl_user->host.ip_mask)
{ // Has wildcard
- uint j;
+ size_t j;
for (j=0 ; j < acl_wild_hosts.elements ; j++)
{ // Check if host already exists
acl_host_and_ip *acl=dynamic_element(&acl_wild_hosts,j,
@@ -3835,7 +3840,7 @@ static bool add_role_user_mapping(const char *uname, const char *hname,
static void remove_ptr_from_dynarray(DYNAMIC_ARRAY *array, void *ptr)
{
bool found __attribute__((unused))= false;
- for (uint i= 0; i < array->elements; i++)
+ for (size_t i= 0; i < array->elements; i++)
{
if (ptr == *dynamic_element(array, i, void**))
{
@@ -3884,7 +3889,7 @@ static void rebuild_role_grants(void)
/*
Reset every user's and role's role_grants array
*/
- for (uint i=0; i < acl_users.elements; i++) {
+ for (size_t i=0; i < acl_users.elements; i++) {
ACL_USER *user= dynamic_element(&acl_users, i, ACL_USER *);
reset_dynamic(&user->role_grants);
}
@@ -3910,7 +3915,7 @@ bool acl_check_host(const char *host, const char *ip)
mysql_mutex_unlock(&acl_cache->lock);
return 0; // Found host
}
- for (uint i=0 ; i < acl_wild_hosts.elements ; i++)
+ for (size_t i=0 ; i < acl_wild_hosts.elements ; i++)
{
acl_host_and_ip *acl=dynamic_element(&acl_wild_hosts,i,acl_host_and_ip*);
if (compare_hostname(acl, host, ip))
@@ -4067,7 +4072,8 @@ bool change_password(THD *thd, LEX_USER *user)
{
auth= acl_user->auth[i];
auth.auth_string= safe_lexcstrdup_root(&acl_memroot, user->auth->auth_str);
- int r= set_user_auth(thd, user->user, &auth, user->auth->pwtext);
+ int r= set_user_auth(thd, user->user, user->host,
+ &auth, user->auth->pwtext);
if (r == ER_SET_PASSWORD_AUTH_PLUGIN)
password_plugin= auth.plugin.str;
else if (r)
@@ -4360,14 +4366,18 @@ static ACL_USER * find_user_wild(const char *host, const char *user, const char
*/
static ACL_ROLE *find_acl_role(const char *role)
{
+ size_t length= strlen(role);
DBUG_ENTER("find_acl_role");
DBUG_PRINT("enter",("role: '%s'", role));
DBUG_PRINT("info", ("Hash elements: %ld", acl_roles.records));
mysql_mutex_assert_owner(&acl_cache->lock);
+ if (!length)
+ DBUG_RETURN(NULL);
+
ACL_ROLE *r= (ACL_ROLE *)my_hash_search(&acl_roles, (uchar *)role,
- strlen(role));
+ length);
DBUG_RETURN(r);
}
@@ -5119,7 +5129,7 @@ acl_update_proxy_user(ACL_PROXY_USER *new_value, bool is_revoke)
mysql_mutex_assert_owner(&acl_cache->lock);
DBUG_ENTER("acl_update_proxy_user");
- for (uint i= 0; i < acl_proxy_users.elements; i++)
+ for (size_t i= 0; i < acl_proxy_users.elements; i++)
{
ACL_PROXY_USER *acl_user=
dynamic_element(&acl_proxy_users, i, ACL_PROXY_USER *);
@@ -6400,7 +6410,7 @@ static int traverse_role_graph_impl(ACL_USER_BASE *user, void *context,
end:
/* Cleanup */
- for (uint i= 0; i < to_clear.elements(); i++)
+ for (size_t i= 0; i < to_clear.elements(); i++)
{
ACL_USER_BASE *current= to_clear.at(i);
DBUG_ASSERT(current->flags & (ROLE_EXPLORED | ROLE_ON_STACK | ROLE_OPENED));
@@ -6468,7 +6478,7 @@ static bool merge_role_global_privileges(ACL_ROLE *grantee)
DBUG_EXECUTE_IF("role_merge_stats", role_global_merges++;);
- for (uint i= 0; i < grantee->role_grants.elements; i++)
+ for (size_t i= 0; i < grantee->role_grants.elements; i++)
{
ACL_ROLE *r= *dynamic_element(&grantee->role_grants, i, ACL_ROLE**);
grantee->access|= r->access;
@@ -6607,8 +6617,8 @@ static bool merge_role_db_privileges(ACL_ROLE *grantee, const char *dbname,
if (update_flags & 4)
{
// Remove elements marked for deletion.
- uint count= 0;
- for(uint i= 0; i < acl_dbs.elements(); i++)
+ size_t count= 0;
+ for(size_t i= 0; i < acl_dbs.elements(); i++)
{
ACL_DB *acl_db= &acl_dbs.at(i);
if (acl_db->sort)
@@ -6970,7 +6980,7 @@ static int merge_role_privileges(ACL_ROLE *role __attribute__((unused)),
if (data->what != PRIVS_TO_MERGE::GLOBAL)
{
role_hash.insert(grantee);
- for (uint i= 0; i < grantee->role_grants.elements; i++)
+ for (size_t i= 0; i < grantee->role_grants.elements; i++)
role_hash.insert(*dynamic_element(&grantee->role_grants, i, ACL_ROLE**));
}
@@ -9555,7 +9565,7 @@ static bool show_role_grants(THD *thd, const char *hostname,
ACL_USER_BASE *acl_entry,
char *buff, size_t buffsize)
{
- uint counter;
+ size_t counter;
Protocol *protocol= thd->protocol;
LEX_CSTRING host= {const_cast<char*>(hostname), strlen(hostname)};
@@ -9668,7 +9678,7 @@ static bool show_database_privileges(THD *thd, const char *username,
privilege_t want_access(NO_ACL);
Protocol *protocol= thd->protocol;
- for (uint i=0 ; i < acl_dbs.elements() ; i++)
+ for (size_t i=0 ; i < acl_dbs.elements() ; i++)
{
const char *user, *host;
@@ -10356,14 +10366,14 @@ static int handle_grant_struct(enum enum_acl_lists struct_no, bool drop,
if (drop)
{
// delete the role from cross-reference arrays
- for (uint i=0; i < acl_role->role_grants.elements; i++)
+ for (size_t i=0; i < acl_role->role_grants.elements; i++)
{
ACL_ROLE *grant= *dynamic_element(&acl_role->role_grants,
i, ACL_ROLE**);
remove_ptr_from_dynarray(&grant->parent_grantee, acl_role);
}
- for (uint i=0; i < acl_role->parent_grantee.elements; i++)
+ for (size_t i=0; i < acl_role->parent_grantee.elements; i++)
{
ACL_USER_BASE *grantee= *dynamic_element(&acl_role->parent_grantee,
i, ACL_USER_BASE**);
@@ -10390,7 +10400,7 @@ static int handle_grant_struct(enum enum_acl_lists struct_no, bool drop,
/* Get the number of elements in the in-memory structure. */
switch (struct_no) {
case USER_ACL:
- elements= acl_users.elements;
+ elements= int(acl_users.elements);
break;
case DB_ACL:
elements= int(acl_dbs.elements());
@@ -10416,7 +10426,7 @@ static int handle_grant_struct(enum enum_acl_lists struct_no, bool drop,
elements= grant_name_hash->records;
break;
case PROXY_USERS_ACL:
- elements= acl_proxy_users.elements;
+ elements= int(acl_proxy_users.elements);
break;
case ROLES_MAPPINGS_HASH:
roles_mappings_hash= &acl_roles_mappings;
@@ -12274,11 +12284,11 @@ SHOW_VAR acl_statistics[] = {
{"procedure_grants", (char*)&proc_priv_hash.records, SHOW_ULONG},
{"package_spec_grants", (char*)&package_spec_priv_hash.records, SHOW_ULONG},
{"package_body_grants", (char*)&package_body_priv_hash.records, SHOW_ULONG},
- {"proxy_users", (char*)&acl_proxy_users.elements, SHOW_UINT},
+ {"proxy_users", (char*)&acl_proxy_users.elements, SHOW_SIZE_T},
{"role_grants", (char*)&acl_roles_mappings.records, SHOW_ULONG},
{"roles", (char*)&acl_roles.records, SHOW_ULONG},
{"table_grants", (char*)&column_priv_hash.records, SHOW_ULONG},
- {"users", (char*)&acl_users.elements, SHOW_UINT},
+ {"users", (char*)&acl_users.elements, SHOW_SIZE_T},
#endif
{NullS, NullS, SHOW_LONG},
};
diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc
index 00d7e5efecd..465145cf25f 100644
--- a/sql/sql_admin.cc
+++ b/sql/sql_admin.cc
@@ -659,8 +659,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
protocol->store(operator_name, system_charset_info);
protocol->store(&error_clex_str, system_charset_info);
length= my_snprintf(buff, sizeof(buff),
- ER_THD(thd, ER_DROP_PARTITION_NON_EXISTENT),
- table_name.str);
+ ER_THD(thd, ER_PARTITION_DOES_NOT_EXIST));
protocol->store(buff, length, system_charset_info);
if(protocol->write())
goto err;
@@ -993,6 +992,8 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
else
compl_result_code= HA_ADMIN_FAILED;
+ if (table->table)
+ free_statistics_for_table(thd, table->table);
if (compl_result_code)
result_code= HA_ADMIN_FAILED;
else
diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc
index bcbf86f1e8f..2a7f885734e 100644
--- a/sql/sql_alter.cc
+++ b/sql/sql_alter.cc
@@ -19,6 +19,9 @@
#include "sql_table.h" // mysql_alter_table,
// mysql_exchange_partition
#include "sql_alter.h"
+#include "rpl_mi.h"
+#include "slave.h"
+#include "debug_sync.h"
#include "wsrep_mysqld.h"
Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
@@ -427,6 +430,8 @@ bool Sql_cmd_alter_table::execute(THD *thd)
as for RENAME TO, as being done by SQLCOM_RENAME_TABLE
*/
if ((alter_info.partition_flags & ALTER_PARTITION_DROP) ||
+ (alter_info.partition_flags & ALTER_PARTITION_CONVERT_IN) ||
+ (alter_info.partition_flags & ALTER_PARTITION_CONVERT_OUT) ||
(alter_info.flags & ALTER_RENAME))
priv_needed|= DROP_ACL;
diff --git a/sql/sql_alter.h b/sql/sql_alter.h
index d0ac4ab27f5..99e717d50b2 100644
--- a/sql/sql_alter.h
+++ b/sql/sql_alter.h
@@ -250,13 +250,15 @@ public:
const LEX_CSTRING *new_db_arg, const LEX_CSTRING *new_name_arg);
/**
- @return true if the table is moved to another database, false otherwise.
+ @return true if the table is moved to another database or a new table
+ created by ALTER_PARTITION_CONVERT_OUT, false otherwise.
*/
bool is_database_changed() const
{ return (new_db.str != db.str); };
/**
- @return true if the table is renamed, false otherwise.
+ @return true if the table is renamed or a new table created by
+ ALTER_PARTITION_CONVERT_OUT, false otherwise.
*/
bool is_table_renamed() const
{ return (is_database_changed() || new_name.str != table_name.str); };
diff --git a/sql/sql_array.h b/sql/sql_array.h
index 8610e971016..85a53ae1a6f 100644
--- a/sql/sql_array.h
+++ b/sql/sql_array.h
@@ -114,19 +114,19 @@ template <class Elem> class Dynamic_array
{
DYNAMIC_ARRAY array;
public:
- Dynamic_array(PSI_memory_key psi_key, uint prealloc=16, uint increment=16)
+ Dynamic_array(PSI_memory_key psi_key, size_t prealloc=16, size_t increment=16)
{
init(psi_key, prealloc, increment);
}
- Dynamic_array(MEM_ROOT *root, uint prealloc=16, uint increment=16)
+ Dynamic_array(MEM_ROOT *root, size_t prealloc=16, size_t increment=16)
{
void *init_buffer= alloc_root(root, sizeof(Elem) * prealloc);
- init_dynamic_array2(root->m_psi_key, &array, sizeof(Elem), init_buffer,
- prealloc, increment, MYF(0));
+ init_dynamic_array2(root->psi_key, &array, sizeof(Elem), init_buffer,
+ prealloc, increment, MYF(0));
}
- void init(PSI_memory_key psi_key, uint prealloc=16, uint increment=16)
+ void init(PSI_memory_key psi_key, size_t prealloc=16, size_t increment=16)
{
init_dynamic_array2(psi_key, &array, sizeof(Elem), 0, prealloc, increment, MYF(0));
}
@@ -217,7 +217,7 @@ public:
void del(size_t idx)
{
DBUG_ASSERT(idx <= array.max_element);
- delete_dynamic_element(&array, (uint)idx);
+ delete_dynamic_element(&array, idx);
}
size_t elements() const
@@ -228,7 +228,7 @@ public:
void elements(size_t num_elements)
{
DBUG_ASSERT(num_elements <= array.max_element);
- array.elements= (uint)num_elements;
+ array.elements= num_elements;
}
void clear()
@@ -236,7 +236,7 @@ public:
elements(0);
}
- void set(uint idx, const Elem &el)
+ void set(size_t idx, const Elem &el)
{
set_dynamic(&array, &el, idx);
}
@@ -248,7 +248,7 @@ public:
bool reserve(size_t new_size)
{
- return allocate_dynamic(&array, (uint)new_size);
+ return allocate_dynamic(&array, new_size);
}
@@ -260,7 +260,7 @@ public:
if (new_size > old_size)
{
- set_dynamic(&array, (uchar*)&default_val, (uint)(new_size - 1));
+ set_dynamic(&array, (uchar*)&default_val, new_size - 1);
/*for (size_t i= old_size; i != new_size; i++)
{
at(i)= default_val;
diff --git a/sql/sql_audit.cc b/sql/sql_audit.cc
index 6ee6ede31b8..c9c59c1b849 100644
--- a/sql/sql_audit.cc
+++ b/sql/sql_audit.cc
@@ -348,14 +348,11 @@ static my_bool calc_class_mask(THD *thd, plugin_ref plugin, void *arg)
*/
int finalize_audit_plugin(st_plugin_int *plugin)
{
+ int deinit_status= 0;
unsigned long event_class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE];
- if (plugin->plugin->deinit && plugin->plugin->deinit(NULL))
- {
- DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
- plugin->name.str));
- DBUG_EXECUTE("finalize_audit_plugin", return 1; );
- }
+ if (plugin->plugin->deinit)
+ deinit_status= plugin->plugin->deinit(NULL);
plugin->data= NULL;
bzero(&event_class_mask, sizeof(event_class_mask));
@@ -374,7 +371,7 @@ int finalize_audit_plugin(st_plugin_int *plugin)
bmove(mysql_global_audit_mask, event_class_mask, sizeof(event_class_mask));
mysql_mutex_unlock(&LOCK_audit_mask);
- return 0;
+ return deinit_status;
}
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index eff806b2d37..e368b6521a3 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -6037,7 +6037,7 @@ find_field_in_table(THD *thd, TABLE *table, const char *name, size_t length,
if (field)
{
if (field->invisible == INVISIBLE_FULL &&
- DBUG_EVALUATE_IF("test_completely_invisible", 0, 1))
+ !DBUG_IF("test_completely_invisible"))
DBUG_RETURN((Field*)0);
if (field->invisible == INVISIBLE_SYSTEM &&
@@ -7433,7 +7433,7 @@ store_top_level_join_columns(THD *thd, TABLE_LIST *table_ref,
/* Add a TRUE condition to outer joins that have no common columns. */
if (table_ref_2->outer_join &&
!table_ref_1->on_expr && !table_ref_2->on_expr)
- table_ref_2->on_expr= (Item*) &Item_true;
+ table_ref_2->on_expr= (Item*) Item_true;
/* Change this table reference to become a leaf for name resolution. */
if (left_neighbor)
@@ -9009,7 +9009,7 @@ fill_record_n_invoke_before_triggers(THD *thd, TABLE *table, Field **ptr,
my_bool mysql_rm_tmp_tables(void)
{
- uint i, idx;
+ size_t i, idx;
char path[FN_REFLEN], *tmpdir, path_copy[FN_REFLEN];
MY_DIR *dirp;
FILEINFO *file;
@@ -9031,7 +9031,7 @@ my_bool mysql_rm_tmp_tables(void)
/* Remove all SQLxxx tables from directory */
- for (idx=0 ; idx < (uint) dirp->number_of_files ; idx++)
+ for (idx=0 ; idx < dirp->number_of_files ; idx++)
{
file=dirp->dir_entry+idx;
diff --git a/sql/sql_binlog.cc b/sql/sql_binlog.cc
index 9f61135232f..e71c7015238 100644
--- a/sql/sql_binlog.cc
+++ b/sql/sql_binlog.cc
@@ -1,5 +1,6 @@
/*
Copyright (c) 2005, 2013, Oracle and/or its affiliates.
+ Copyright (c) 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -20,6 +21,7 @@
#include "sql_parse.h"
#include "sql_acl.h"
#include "rpl_rli.h"
+#include "rpl_mi.h"
#include "slave.h"
#include "log_event.h"
@@ -69,7 +71,8 @@ static int check_event_type(int type, Relay_log_info *rli)
/* It is always allowed to execute FD events. */
return 0;
-
+
+ case QUERY_EVENT:
case TABLE_MAP_EVENT:
case WRITE_ROWS_EVENT_V1:
case UPDATE_ROWS_EVENT_V1:
@@ -166,6 +169,57 @@ int binlog_defragment(THD *thd)
return 0;
}
+/**
+ Wraps Log_event::apply_event to save and restore
+ session context in case of Query_log_event.
+
+ @param ev replication event
+ @param rgi execution context for the event
+
+ @return
+ 0 on success,
+ non-zero otherwise.
+*/
+#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
+int save_restore_context_apply_event(Log_event *ev, rpl_group_info *rgi)
+{
+ if (ev->get_type_code() != QUERY_EVENT)
+ return ev->apply_event(rgi);
+
+ THD *thd= rgi->thd;
+ Relay_log_info *rli= thd->rli_fake;
+ DBUG_ASSERT(!rli->mi);
+ LEX_CSTRING connection_name= { STRING_WITH_LEN("BINLOG_BASE64_EVENT") };
+
+ if (!(rli->mi= new Master_info(&connection_name, false)))
+ {
+ my_error(ER_OUT_OF_RESOURCES, MYF(0));
+ return -1;
+ }
+
+ sql_digest_state *m_digest= thd->m_digest;
+ PSI_statement_locker *m_statement_psi= thd->m_statement_psi;;
+ LEX_CSTRING save_db= thd->db;
+ my_thread_id m_thread_id= thd->variables.pseudo_thread_id;
+
+ thd->system_thread_info.rpl_sql_info= NULL;
+ thd->reset_db(&null_clex_str);
+
+ thd->m_digest= NULL;
+ thd->m_statement_psi= NULL;
+
+ int err= ev->apply_event(rgi);
+
+ thd->m_digest= m_digest;
+ thd->m_statement_psi= m_statement_psi;
+ thd->variables.pseudo_thread_id= m_thread_id;
+ thd->reset_db(&save_db);
+ delete rli->mi;
+ rli->mi= NULL;
+
+ return err;
+}
+#endif
/**
Execute a BINLOG statement.
@@ -215,11 +269,9 @@ void mysql_client_binlog_statement(THD* thd)
if (!(rgi= thd->rgi_fake))
rgi= thd->rgi_fake= new rpl_group_info(rli);
rgi->thd= thd;
-
const char *error= 0;
Log_event *ev = 0;
my_bool is_fragmented= FALSE;
-
/*
Out of memory check
*/
@@ -372,7 +424,7 @@ void mysql_client_binlog_statement(THD* thd)
LEX *backup_lex;
thd->backup_and_reset_current_lex(&backup_lex);
- err= ev->apply_event(rgi);
+ err= save_restore_context_apply_event(ev, rgi);
thd->restore_current_lex(backup_lex);
}
thd->variables.option_bits=
@@ -388,7 +440,7 @@ void mysql_client_binlog_statement(THD* thd)
i.e. when this thread terminates.
*/
if (ev->get_type_code() != FORMAT_DESCRIPTION_EVENT)
- delete ev;
+ delete ev;
ev= 0;
if (err)
{
@@ -396,7 +448,8 @@ void mysql_client_binlog_statement(THD* thd)
TODO: Maybe a better error message since the BINLOG statement
now contains several events.
*/
- my_error(ER_UNKNOWN_ERROR, MYF(0));
+ if (!thd->is_error())
+ my_error(ER_UNKNOWN_ERROR, MYF(0));
goto end;
}
}
@@ -412,5 +465,7 @@ end:
thd->variables.option_bits= thd_options;
rgi->slave_close_thread_tables(thd);
my_free(buf);
+ delete rgi;
+ rgi= thd->rgi_fake= NULL;
DBUG_VOID_RETURN;
}
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 56d0d1682cb..3858cbfca45 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -294,7 +294,7 @@ bool Foreign_key::validate(List<Create_field> &table_fields)
&sql_field->field_name)) {}
if (!sql_field)
{
- my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name.str);
+ my_error(ER_KEY_COLUMN_DOES_NOT_EXIST, MYF(0), column->field_name.str);
DBUG_RETURN(TRUE);
}
if (type == Key::FOREIGN_KEY && sql_field->vcol_info)
@@ -752,8 +752,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier)
will be re-initialized in init_for_queries().
*/
init_sql_alloc(key_memory_thd_main_mem_root,
- &main_mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0,
- MYF(MY_THREAD_SPECIFIC));
+ &main_mem_root, 64, 0, MYF(MY_THREAD_SPECIFIC));
/*
Allocation of user variables for binary logging is always done with main
@@ -965,10 +964,8 @@ Internal_error_handler *THD::pop_internal_handler()
void THD::raise_error(uint sql_errno)
{
const char* msg= ER_THD(this, sql_errno);
- (void) raise_condition(sql_errno,
- NULL,
- Sql_condition::WARN_LEVEL_ERROR,
- msg);
+ (void) raise_condition(sql_errno, "\0\0\0\0\0",
+ Sql_condition::WARN_LEVEL_ERROR, msg);
}
void THD::raise_error_printf(uint sql_errno, ...)
@@ -981,20 +978,16 @@ void THD::raise_error_printf(uint sql_errno, ...)
va_start(args, sql_errno);
my_vsnprintf(ebuff, sizeof(ebuff), format, args);
va_end(args);
- (void) raise_condition(sql_errno,
- NULL,
- Sql_condition::WARN_LEVEL_ERROR,
- ebuff);
+ (void) raise_condition(sql_errno, "\0\0\0\0\0",
+ Sql_condition::WARN_LEVEL_ERROR, ebuff);
DBUG_VOID_RETURN;
}
void THD::raise_warning(uint sql_errno)
{
const char* msg= ER_THD(this, sql_errno);
- (void) raise_condition(sql_errno,
- NULL,
- Sql_condition::WARN_LEVEL_WARN,
- msg);
+ (void) raise_condition(sql_errno, "\0\0\0\0\0",
+ Sql_condition::WARN_LEVEL_WARN, msg);
}
void THD::raise_warning_printf(uint sql_errno, ...)
@@ -1007,10 +1000,8 @@ void THD::raise_warning_printf(uint sql_errno, ...)
va_start(args, sql_errno);
my_vsnprintf(ebuff, sizeof(ebuff), format, args);
va_end(args);
- (void) raise_condition(sql_errno,
- NULL,
- Sql_condition::WARN_LEVEL_WARN,
- ebuff);
+ (void) raise_condition(sql_errno, "\0\0\0\0\0",
+ Sql_condition::WARN_LEVEL_WARN, ebuff);
DBUG_VOID_RETURN;
}
@@ -1021,10 +1012,8 @@ void THD::raise_note(uint sql_errno)
if (!(variables.option_bits & OPTION_SQL_NOTES))
DBUG_VOID_RETURN;
const char* msg= ER_THD(this, sql_errno);
- (void) raise_condition(sql_errno,
- NULL,
- Sql_condition::WARN_LEVEL_NOTE,
- msg);
+ (void) raise_condition(sql_errno, "\0\0\0\0\0",
+ Sql_condition::WARN_LEVEL_NOTE, msg);
DBUG_VOID_RETURN;
}
@@ -1040,21 +1029,20 @@ void THD::raise_note_printf(uint sql_errno, ...)
va_start(args, sql_errno);
my_vsnprintf(ebuff, sizeof(ebuff), format, args);
va_end(args);
- (void) raise_condition(sql_errno,
- NULL,
- Sql_condition::WARN_LEVEL_NOTE,
- ebuff);
+ (void) raise_condition(sql_errno, "\0\0\0\0\0",
+ Sql_condition::WARN_LEVEL_NOTE, ebuff);
DBUG_VOID_RETURN;
}
-Sql_condition* THD::raise_condition(uint sql_errno,
- const char* sqlstate,
- Sql_condition::enum_warning_level level,
- const Sql_user_condition_identity &ucid,
- const char* msg)
+Sql_condition* THD::raise_condition(const Sql_condition *cond)
{
+ uint sql_errno= cond->get_sql_errno();
+ const char *sqlstate= cond->get_sqlstate();
+ Sql_condition::enum_warning_level level= cond->get_level();
+ const char *msg= cond->get_message_text();
+
Diagnostics_area *da= get_stmt_da();
- Sql_condition *cond= NULL;
+ Sql_condition *raised= NULL;
DBUG_ENTER("THD::raise_condition");
DBUG_ASSERT(level < Sql_condition::WARN_LEVEL_END);
@@ -1082,22 +1070,18 @@ Sql_condition* THD::raise_condition(uint sql_errno,
sql_errno= ER_UNKNOWN_ERROR;
if (msg == NULL)
msg= ER_THD(this, sql_errno);
- if (sqlstate == NULL)
+ if (!*sqlstate)
sqlstate= mysql_errno_to_sqlstate(sql_errno);
- if ((level == Sql_condition::WARN_LEVEL_WARN) &&
- really_abort_on_warning())
+ if ((level == Sql_condition::WARN_LEVEL_WARN) && really_abort_on_warning())
{
- /*
- FIXME:
- push_warning and strict SQL_MODE case.
- */
+ /* FIXME: push_warning and strict SQL_MODE case. */
level= Sql_condition::WARN_LEVEL_ERROR;
}
if (!is_fatal_error &&
- handle_condition(sql_errno, sqlstate, &level, msg, &cond))
- DBUG_RETURN(cond);
+ handle_condition(sql_errno, sqlstate, &level, msg, &raised))
+ goto ret;
switch (level) {
case Sql_condition::WARN_LEVEL_NOTE:
@@ -1122,8 +1106,7 @@ Sql_condition* THD::raise_condition(uint sql_errno,
With wsrep we allow converting BF abort error to warning if
errors are ignored.
*/
- if (!is_fatal_error &&
- no_errors &&
+ if (!is_fatal_error && no_errors &&
(wsrep_trx().bf_aborted() || wsrep_retry_counter))
{
WSREP_DEBUG("BF abort error converted to warning");
@@ -1134,7 +1117,7 @@ Sql_condition* THD::raise_condition(uint sql_errno,
if (!da->is_error())
{
set_row_count_func(-1);
- da->set_error_status(sql_errno, msg, sqlstate, ucid, cond);
+ da->set_error_status(sql_errno, msg, sqlstate, *cond, raised);
}
}
}
@@ -1149,9 +1132,13 @@ Sql_condition* THD::raise_condition(uint sql_errno,
if (likely(!(is_fatal_error && (sql_errno == EE_OUTOFMEMORY ||
sql_errno == ER_OUTOFMEMORY))))
{
- cond= da->push_warning(this, sql_errno, sqlstate, level, ucid, msg);
+ raised= da->push_warning(this, sql_errno, sqlstate, level, *cond, msg,
+ cond->m_row_number);
}
- DBUG_RETURN(cond);
+ret:
+ if (raised)
+ raised->copy_opt_attributes(cond);
+ DBUG_RETURN(raised);
}
extern "C"
@@ -1313,10 +1300,7 @@ void THD::init()
wsrep_desynced_backup_stage= false;
#endif /* WITH_WSREP */
- if (variables.sql_log_bin)
- variables.option_bits|= OPTION_BIN_LOG;
- else
- variables.option_bits&= ~OPTION_BIN_LOG;
+ set_binlog_bit();
select_commands= update_commands= other_commands= 0;
/* Set to handle counting of aborted connections */
@@ -5394,6 +5378,16 @@ thd_rpl_deadlock_check(MYSQL_THD thd, MYSQL_THD other_thd)
return 0;
if (rgi->gtid_sub_id > other_rgi->gtid_sub_id)
return 0;
+ if (rgi->finish_event_group_called || other_rgi->finish_event_group_called)
+ {
+ /*
+ If either of two transactions has already performed commit
+ (e.g split ALTER, asserted below) there won't be any deadlock.
+ */
+ DBUG_ASSERT(rgi->sa_info || other_rgi->sa_info);
+
+ return 0;
+ }
/*
This transaction is about to wait for another transaction that is required
by replication binlog order to commit after. This would cause a deadlock.
diff --git a/sql/sql_class.h b/sql/sql_class.h
index bce30b3fa6d..92d676d196b 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -87,6 +87,7 @@ enum wsrep_consistency_check_mode {
class Reprepare_observer;
class Relay_log_info;
struct rpl_group_info;
+struct rpl_parallel_thread;
class Rpl_filter;
class Query_log_event;
class Load_log_event;
@@ -319,9 +320,9 @@ class Key_part_spec :public Sql_alloc {
public:
LEX_CSTRING field_name;
uint length;
- bool generated;
+ bool generated, asc;
Key_part_spec(const LEX_CSTRING *name, uint len, bool gen= false)
- : field_name(*name), length(len), generated(gen)
+ : field_name(*name), length(len), generated(gen), asc(1)
{}
bool operator==(const Key_part_spec& other) const;
/**
@@ -589,7 +590,8 @@ typedef enum enum_diag_condition_item_name
DIAG_CURSOR_NAME= 9,
DIAG_MESSAGE_TEXT= 10,
DIAG_MYSQL_ERRNO= 11,
- LAST_DIAG_SET_PROPERTY= DIAG_MYSQL_ERRNO
+ DIAG_ROW_NUMBER= 12,
+ LAST_DIAG_SET_PROPERTY= DIAG_ROW_NUMBER
} Diag_condition_item_name;
/**
@@ -881,6 +883,7 @@ typedef struct system_variables
vers_asof_timestamp_t vers_asof_timestamp;
ulong vers_alter_history;
+ my_bool binlog_alter_two_phase;
} SV;
/**
@@ -1160,6 +1163,7 @@ struct THD_count
{
static Atomic_counter<uint32_t> count;
static uint value() { return static_cast<uint>(count); }
+ static uint connection_thd_count();
THD_count() { count++; }
~THD_count() { count--; }
};
@@ -3070,6 +3074,11 @@ public:
}
bool binlog_table_should_be_logged(const LEX_CSTRING *db);
+ // Accessors and setters of two-phase loggable ALTER binlog properties
+ uchar get_binlog_flags_for_alter();
+ void set_binlog_flags_for_alter(uchar);
+ uint64 get_binlog_start_alter_seq_no();
+ void set_binlog_start_alter_seq_no(uint64);
#endif /* MYSQL_CLIENT */
public:
@@ -3125,8 +3134,8 @@ public:
{
bzero((char*)this, sizeof(*this));
implicit_xid.null();
- init_sql_alloc(key_memory_thd_transactions, &mem_root,
- ALLOC_ROOT_MIN_BLOCK_SIZE, 0, MYF(MY_THREAD_SPECIFIC));
+ init_sql_alloc(key_memory_thd_transactions, &mem_root, 256,
+ 0, MYF(MY_THREAD_SPECIFIC));
}
} default_transaction, *transaction;
Global_read_lock global_read_lock;
@@ -3296,6 +3305,13 @@ public:
auto_inc_intervals_forced.empty(); // in case of multiple SET INSERT_ID
auto_inc_intervals_forced.append(next_id, ULONGLONG_MAX, 0);
}
+ inline void set_binlog_bit()
+ {
+ if (variables.sql_log_bin)
+ variables.option_bits |= OPTION_BIN_LOG;
+ else
+ variables.option_bits &= ~OPTION_BIN_LOG;
+ }
ulonglong limit_found_rows;
@@ -3992,6 +4008,11 @@ public:
user_time= t;
set_time();
}
+ inline void force_set_time(my_time_t t, ulong sec_part)
+ {
+ start_time= system_time.sec= t;
+ start_time_sec_part= system_time.sec_part= sec_part;
+ }
/*
this is only used by replication and BINLOG command.
usecs > TIME_MAX_SECOND_PART means "was not in binlog"
@@ -4003,15 +4024,9 @@ public:
else
{
if (sec_part <= TIME_MAX_SECOND_PART)
- {
- start_time= system_time.sec= t;
- start_time_sec_part= system_time.sec_part= sec_part;
- }
+ force_set_time(t, sec_part);
else if (t != system_time.sec)
- {
- start_time= system_time.sec= t;
- start_time_sec_part= system_time.sec_part= 0;
- }
+ force_set_time(t, 0);
else
{
start_time= t;
@@ -4879,45 +4894,17 @@ private:
@param msg the condition message text
@return The condition raised, or NULL
*/
- Sql_condition*
- raise_condition(uint sql_errno,
- const char* sqlstate,
- Sql_condition::enum_warning_level level,
- const char* msg)
+ Sql_condition* raise_condition(uint sql_errno, const char* sqlstate,
+ Sql_condition::enum_warning_level level, const char* msg)
{
- return raise_condition(sql_errno, sqlstate, level,
- Sql_user_condition_identity(), msg);
+ Sql_condition cond(NULL, // don't strdup the msg
+ Sql_condition_identity(sql_errno, sqlstate, level,
+ Sql_user_condition_identity()),
+ msg, get_stmt_da()->current_row_for_warning());
+ return raise_condition(&cond);
}
- /**
- Raise a generic or a user defined SQL condition.
- @param ucid - the user condition identity
- (or an empty identity if not a user condition)
- @param sql_errno - the condition error number
- @param sqlstate - the condition SQLSTATE
- @param level - the condition level
- @param msg - the condition message text
- @return The condition raised, or NULL
- */
- Sql_condition*
- raise_condition(uint sql_errno,
- const char* sqlstate,
- Sql_condition::enum_warning_level level,
- const Sql_user_condition_identity &ucid,
- const char* msg);
-
- Sql_condition*
- raise_condition(const Sql_condition *cond)
- {
- Sql_condition *raised= raise_condition(cond->get_sql_errno(),
- cond->get_sqlstate(),
- cond->get_level(),
- *cond/*Sql_user_condition_identity*/,
- cond->get_message_text());
- if (raised)
- raised->copy_opt_attributes(cond);
- return raised;
- }
+ Sql_condition* raise_condition(const Sql_condition *cond);
private:
void push_warning_truncated_priv(Sql_condition::enum_warning_level level,
@@ -5559,7 +5546,8 @@ public:
bool restore_from_local_lex_to_old_lex(LEX *oldlex);
Item *sp_fix_func_item(Item **it_addr);
- Item *sp_prepare_func_item(Item **it_addr, uint cols= 1);
+ Item *sp_fix_func_item_for_assignment(const Field *to, Item **it_addr);
+ Item *sp_prepare_func_item(Item **it_addr, uint cols);
bool sp_eval_expr(Field *result_field, Item **expr_item_ptr);
bool sql_parser(LEX *old_lex, LEX *lex,
@@ -7945,6 +7933,41 @@ extern THD_list server_threads;
void setup_tmp_table_column_bitmaps(TABLE *table, uchar *bitmaps,
uint field_count);
+#ifdef WITH_WSREP
+extern void wsrep_to_isolation_end(THD*);
+#endif
+/*
+ RAII utility class to ease binlogging with temporary setting
+ THD etc context and restoring the original one upon logger execution.
+*/
+class Write_log_with_flags
+{
+ THD* m_thd;
+#ifdef WITH_WSREP
+ bool wsrep_to_isolation;
+#endif
+
+public:
+~Write_log_with_flags()
+ {
+ m_thd->set_binlog_flags_for_alter(0);
+ m_thd->set_binlog_start_alter_seq_no(0);
+#ifdef WITH_WSREP
+ if (wsrep_to_isolation)
+ wsrep_to_isolation_end(m_thd);
+#endif
+ }
+
+ Write_log_with_flags(THD *thd, uchar flags,
+ bool do_wsrep_iso __attribute__((unused))= false) :
+ m_thd(thd)
+ {
+ m_thd->set_binlog_flags_for_alter(flags);
+#ifdef WITH_WSREP
+ wsrep_to_isolation= do_wsrep_iso && WSREP(m_thd);
+#endif
+ }
+};
#endif /* MYSQL_SERVER */
#endif /* SQL_CLASS_INCLUDED */
diff --git a/sql/sql_cmd.h b/sql/sql_cmd.h
index 53dd6e750f8..6554fc78f27 100644
--- a/sql/sql_cmd.h
+++ b/sql/sql_cmd.h
@@ -75,7 +75,6 @@ enum enum_sql_command {
SQLCOM_XA_START, SQLCOM_XA_END, SQLCOM_XA_PREPARE,
SQLCOM_XA_COMMIT, SQLCOM_XA_ROLLBACK, SQLCOM_XA_RECOVER,
SQLCOM_SHOW_PROC_CODE, SQLCOM_SHOW_FUNC_CODE,
- SQLCOM_ALTER_TABLESPACE,
SQLCOM_INSTALL_PLUGIN, SQLCOM_UNINSTALL_PLUGIN,
SQLCOM_SHOW_AUTHORS, SQLCOM_BINLOG_BASE64_EVENT,
SQLCOM_SHOW_PLUGINS, SQLCOM_SHOW_CONTRIBUTORS,
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 37e136927f2..c5defc1959c 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -1363,9 +1363,7 @@ static bool find_db_tables_and_rm_known_files(THD *thd, MY_DIR *dirp,
*tables= tot_list;
/* and at last delete all non-table files */
- for (uint idx=0 ;
- idx < (uint) dirp->number_of_files && !thd->killed ;
- idx++)
+ for (size_t idx=0; idx < dirp->number_of_files && !thd->killed; idx++)
{
FILEINFO *file=dirp->dir_entry+idx;
char *extension;
@@ -1488,9 +1486,7 @@ long mysql_rm_arc_files(THD *thd, MY_DIR *dirp, const char *org_path)
DBUG_ENTER("mysql_rm_arc_files");
DBUG_PRINT("enter", ("path: %s", org_path));
- for (uint idx=0 ;
- idx < (uint) dirp->number_of_files && !thd->killed ;
- idx++)
+ for (size_t idx=0; idx < dirp->number_of_files && !thd->killed; idx++)
{
FILEINFO *file=dirp->dir_entry+idx;
char *extension, *revision;
@@ -1970,8 +1966,8 @@ bool mysql_upgrade_db(THD *thd, const LEX_CSTRING *old_db)
/* Step2: Move tables to the new database */
if ((dirp = my_dir(path,MYF(MY_DONT_SORT))))
{
- uint nfiles= (uint) dirp->number_of_files;
- for (uint idx=0 ; idx < nfiles && !thd->killed ; idx++)
+ size_t nfiles= dirp->number_of_files;
+ for (size_t idx=0 ; idx < nfiles && !thd->killed ; idx++)
{
FILEINFO *file= dirp->dir_entry + idx;
char *extension, tname[FN_REFLEN + 1];
@@ -2060,8 +2056,8 @@ bool mysql_upgrade_db(THD *thd, const LEX_CSTRING *old_db)
if ((dirp = my_dir(path,MYF(MY_DONT_SORT))))
{
- uint nfiles= (uint) dirp->number_of_files;
- for (uint idx=0 ; idx < nfiles ; idx++)
+ size_t nfiles= dirp->number_of_files;
+ for (size_t idx=0 ; idx < nfiles ; idx++)
{
FILEINFO *file= dirp->dir_entry + idx;
char oldname[FN_REFLEN + 1], newname[FN_REFLEN + 1];
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index 4c679267456..d74b9e8916f 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -733,6 +733,8 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
explain= (Explain_delete*)thd->lex->explain->get_upd_del_plan();
explain->tracker.on_scan_init();
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
+
if (!delete_while_scanning)
{
/*
@@ -798,9 +800,11 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
THD_STAGE_INFO(thd, stage_updating);
fix_rownum_pointers(thd, thd->lex->current_select, &deleted);
+ thd->get_stmt_da()->reset_current_row_for_warning(0);
while (likely(!(error=info.read_record())) && likely(!thd->killed) &&
likely(!thd->is_error()))
{
+ thd->get_stmt_da()->inc_current_row_for_warning();
if (delete_while_scanning)
delete_record= record_should_be_deleted(thd, table, select, explain,
delete_history);
@@ -876,6 +880,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
else
break;
}
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
terminate_delete:
killed_status= thd->killed;
diff --git a/sql/sql_error.cc b/sql/sql_error.cc
index cef9e6cec00..85be61c34ef 100644
--- a/sql/sql_error.cc
+++ b/sql/sql_error.cc
@@ -204,6 +204,7 @@ Sql_condition::copy_opt_attributes(const Sql_condition *cond)
copy_string(m_mem_root, & m_table_name, & cond->m_table_name);
copy_string(m_mem_root, & m_column_name, & cond->m_column_name);
copy_string(m_mem_root, & m_cursor_name, & cond->m_cursor_name);
+ m_row_number= cond->m_row_number;
}
@@ -216,7 +217,7 @@ Sql_condition::set_builtin_message_text(const char* str)
*/
const char* copy;
- copy= strdup_root(m_mem_root, str);
+ copy= m_mem_root ? strdup_root(m_mem_root, str) : str;
m_message_text.set(copy, strlen(copy), error_message_charset_info);
DBUG_ASSERT(! m_message_text.is_alloced());
}
@@ -500,7 +501,7 @@ Diagnostics_area::disable_status()
Warning_info::Warning_info(ulonglong warn_id_arg,
bool allow_unlimited_warnings, bool initialize)
:m_current_statement_warn_count(0),
- m_current_row_for_warning(1),
+ m_current_row_for_warning(0),
m_warn_id(warn_id_arg),
m_error_condition(NULL),
m_allow_unlimited_warnings(allow_unlimited_warnings),
@@ -557,7 +558,7 @@ void Warning_info::clear(ulonglong new_id)
free_memory();
memset(m_warn_count, 0, sizeof(m_warn_count));
m_current_statement_warn_count= 0;
- m_current_row_for_warning= 1; /* Start counting from the first row */
+ m_current_row_for_warning= 0;
clear_error_condition();
}
@@ -663,7 +664,8 @@ void Warning_info::reserve_space(THD *thd, uint count)
Sql_condition *Warning_info::push_warning(THD *thd,
const Sql_condition_identity *value,
- const char *msg)
+ const char *msg,
+ ulong current_row_number)
{
Sql_condition *cond= NULL;
@@ -672,7 +674,8 @@ Sql_condition *Warning_info::push_warning(THD *thd,
if (m_allow_unlimited_warnings ||
m_warn_list.elements() < thd->variables.max_error_count)
{
- cond= new (& m_warn_root) Sql_condition(& m_warn_root, *value, msg);
+ cond= new (& m_warn_root) Sql_condition(& m_warn_root, *value, msg,
+ current_row_number);
if (cond)
m_warn_list.push_back(cond);
}
@@ -688,7 +691,8 @@ Sql_condition *Warning_info::push_warning(THD *thd,
const Sql_condition *sql_condition)
{
Sql_condition *new_condition= push_warning(thd, sql_condition,
- sql_condition->get_message_text());
+ sql_condition->get_message_text(),
+ sql_condition->m_row_number);
if (new_condition)
new_condition->copy_opt_attributes(sql_condition);
@@ -723,7 +727,7 @@ void push_warning(THD *thd, Sql_condition::enum_warning_level level,
if (level == Sql_condition::WARN_LEVEL_ERROR)
level= Sql_condition::WARN_LEVEL_WARN;
- (void) thd->raise_condition(code, NULL, level, msg);
+ (void) thd->raise_condition(code, "\0\0\0\0\0", level, msg);
/* Make sure we also count warnings pushed after calling set_ok_status(). */
thd->get_stmt_da()->increment_warning();
diff --git a/sql/sql_error.h b/sql/sql_error.h
index 679672e5994..541b92b4531 100644
--- a/sql/sql_error.h
+++ b/sql/sql_error.h
@@ -305,6 +305,9 @@ protected:
/** SQL CURSOR_NAME condition item. */
String m_cursor_name;
+ /** SQL ROW_NUMBER condition item. */
+ ulong m_row_number;
+
Sql_condition_items()
:m_class_origin((const char*) NULL, 0, & my_charset_utf8mb3_bin),
m_subclass_origin((const char*) NULL, 0, & my_charset_utf8mb3_bin),
@@ -315,7 +318,8 @@ protected:
m_schema_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
m_table_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
m_column_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
- m_cursor_name((const char*) NULL, 0, & my_charset_utf8mb3_bin)
+ m_cursor_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
+ m_row_number(0)
{ }
void clear()
@@ -330,6 +334,7 @@ protected:
m_table_name.length(0);
m_column_name.length(0);
m_cursor_name.length(0);
+ m_row_number= 0;
}
};
@@ -433,16 +438,14 @@ private:
@param level - the error level for this condition
@param msg - the message text for this condition
*/
- Sql_condition(MEM_ROOT *mem_root,
- const Sql_condition_identity &value,
- const char *msg)
- :Sql_condition_identity(value),
- m_mem_root(mem_root)
+ Sql_condition(MEM_ROOT *mem_root, const Sql_condition_identity &value,
+ const char *msg, ulong current_row_for_warning)
+ : Sql_condition_identity(value), m_mem_root(mem_root)
{
- DBUG_ASSERT(mem_root != NULL);
DBUG_ASSERT(value.get_sql_errno() != 0);
DBUG_ASSERT(msg != NULL);
set_builtin_message_text(msg);
+ m_row_number= current_row_for_warning;
}
/** Destructor. */
@@ -718,7 +721,7 @@ private:
void inc_current_row_for_warning() { m_current_row_for_warning++; }
/** Reset the current row counter. Start counting from the first row. */
- void reset_current_row_for_warning() { m_current_row_for_warning= 1; }
+ void reset_current_row_for_warning(int n) { m_current_row_for_warning= n; }
ulong set_current_row_for_warning(ulong row)
{
@@ -747,9 +750,8 @@ private:
@return a pointer to the added SQL-condition.
*/
- Sql_condition *push_warning(THD *thd,
- const Sql_condition_identity *identity,
- const char* msg);
+ Sql_condition *push_warning(THD *thd, const Sql_condition_identity *identity,
+ const char* msg, ulong current_row_number);
/**
Add a new SQL-condition to the current list and increment the respective
@@ -1151,8 +1153,8 @@ public:
void inc_current_row_for_warning()
{ get_warning_info()->inc_current_row_for_warning(); }
- void reset_current_row_for_warning()
- { get_warning_info()->reset_current_row_for_warning(); }
+ void reset_current_row_for_warning(int n)
+ { get_warning_info()->reset_current_row_for_warning(n); }
bool is_warning_info_read_only() const
{ return get_warning_info()->is_read_only(); }
@@ -1183,10 +1185,12 @@ public:
const char* sqlstate,
Sql_condition::enum_warning_level level,
const Sql_user_condition_identity &ucid,
- const char* msg)
+ const char* msg,
+ ulong current_row_number)
{
Sql_condition_identity tmp(sql_errno_arg, sqlstate, level, ucid);
- return get_warning_info()->push_warning(thd, &tmp, msg);
+ return get_warning_info()->push_warning(thd, &tmp, msg,
+ current_row_number);
}
Sql_condition *push_warning(THD *thd,
@@ -1196,7 +1200,7 @@ public:
const char* msg)
{
return push_warning(thd, sqlerrno, sqlstate, level,
- Sql_user_condition_identity(), msg);
+ Sql_user_condition_identity(), msg, 0);
}
void mark_sql_conditions_for_removal()
{ get_warning_info()->mark_sql_conditions_for_removal(); }
diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc
index 480a1259ba8..d839a9bc518 100644
--- a/sql/sql_explain.cc
+++ b/sql/sql_explain.cc
@@ -25,6 +25,8 @@
#include "opt_range.h"
#include "sql_expression_cache.h"
+#include <stack>
+
const char * STR_DELETING_ALL_ROWS= "Deleting all rows";
const char * STR_IMPOSSIBLE_WHERE= "Impossible WHERE";
const char * STR_NO_ROWS_AFTER_PRUNING= "No matching rows after partition pruning";
@@ -41,7 +43,7 @@ static void write_item(Json_writer *writer, Item *item);
static void append_item_to_str(String *out, Item *item);
Explain_query::Explain_query(THD *thd_arg, MEM_ROOT *root) :
- mem_root(root), upd_del_plan(NULL), insert_plan(NULL),
+ mem_root(root), upd_del_plan(nullptr), insert_plan(nullptr),
unions(root), selects(root), thd(thd_arg), apc_enabled(false),
operations(0)
{
@@ -1075,14 +1077,13 @@ void Explain_aggr_window_funcs::print_json_members(Json_writer *writer,
{
Explain_aggr_filesort *srt;
List_iterator<Explain_aggr_filesort> it(sorts);
- writer->add_member("sorts").start_object();
+ Json_writer_array sorts(writer, "sorts");
while ((srt= it++))
{
- writer->add_member("filesort").start_object();
+ Json_writer_object sort(writer);
+ Json_writer_object filesort(writer, "filesort");
srt->print_json_members(writer, is_analyze);
- writer->end_object(); // filesort
}
- writer->end_object(); // sorts
}
@@ -1104,17 +1105,26 @@ print_explain_json_interns(Explain_query *query,
Json_writer *writer,
bool is_analyze)
{
- Json_writer_nesting_guard guard(writer);
- for (uint i=0; i< n_join_tabs; i++)
{
- if (join_tabs[i]->start_dups_weedout)
- writer->add_member("duplicates_removal").start_object();
+ Json_writer_array loop(writer, "nested_loop");
+ for (uint i=0; i< n_join_tabs; i++)
+ {
+ if (join_tabs[i]->start_dups_weedout)
+ {
+ writer->start_object();
+ writer->add_member("duplicates_removal");
+ writer->start_array();
+ }
- join_tabs[i]->print_explain_json(query, writer, is_analyze);
+ join_tabs[i]->print_explain_json(query, writer, is_analyze);
- if (join_tabs[i]->end_dups_weedout)
- writer->end_object();
- }
+ if (join_tabs[i]->end_dups_weedout)
+ {
+ writer->end_array();
+ writer->end_object();
+ }
+ }
+ } // "nested_loop"
print_explain_json_for_children(query, writer, is_analyze);
}
@@ -1699,7 +1709,7 @@ void Explain_table_access::print_explain_json(Explain_query *query,
Json_writer *writer,
bool is_analyze)
{
- Json_writer_nesting_guard guard(writer);
+ Json_writer_object jsobj(writer);
if (pre_join_sort)
{
@@ -2095,14 +2105,15 @@ void Explain_quick_select::print_json(Json_writer *writer)
}
else
{
- writer->add_member(get_name_by_type()).start_object();
+ Json_writer_array ranges(writer, get_name_by_type());
List_iterator_fast<Explain_quick_select> it (children);
Explain_quick_select* child;
while ((child = it++))
+ {
+ Json_writer_object obj(writer);
child->print_json(writer);
-
- writer->end_object();
+ }
}
}
diff --git a/sql/sql_explain.h b/sql/sql_explain.h
index 31143ca9f77..0a29e48c324 100644
--- a/sql/sql_explain.h
+++ b/sql/sql_explain.h
@@ -74,7 +74,6 @@ class Json_writer;
*************************************************************************************/
-const uint FAKE_SELECT_LEX_ID= UINT_MAX;
class Explain_query;
diff --git a/sql/sql_get_diagnostics.cc b/sql/sql_get_diagnostics.cc
index 197bf5e7a00..240975d2974 100644
--- a/sql/sql_get_diagnostics.cc
+++ b/sql/sql_get_diagnostics.cc
@@ -338,6 +338,8 @@ Condition_information_item::get_value(THD *thd, const Sql_condition *cond)
str.set_ascii(cond->get_sqlstate(), strlen(cond->get_sqlstate()));
value= make_utf8_string_item(thd, &str);
break;
+ case ROW_NUMBER:
+ value= new (thd->mem_root) Item_uint(thd, cond->m_row_number);
}
DBUG_RETURN(value);
diff --git a/sql/sql_get_diagnostics.h b/sql/sql_get_diagnostics.h
index f283aa5b2c6..efe526d7c61 100644
--- a/sql/sql_get_diagnostics.h
+++ b/sql/sql_get_diagnostics.h
@@ -254,7 +254,8 @@ public:
CURSOR_NAME,
MESSAGE_TEXT,
MYSQL_ERRNO,
- RETURNED_SQLSTATE
+ RETURNED_SQLSTATE,
+ ROW_NUMBER
};
/**
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index cc8e1a93041..af2c4606ea2 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -229,6 +229,7 @@ static int check_insert_fields(THD *thd, TABLE_LIST *table_list,
}
if (values.elements != table->s->visible_fields)
{
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), 1L);
DBUG_RETURN(-1);
}
@@ -253,6 +254,7 @@ static int check_insert_fields(THD *thd, TABLE_LIST *table_list,
if (fields.elements != values.elements)
{
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), 1L);
DBUG_RETURN(-1);
}
@@ -699,7 +701,6 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
const bool was_insert_delayed= (table_list->lock_type == TL_WRITE_DELAYED);
bool using_bulk_insert= 0;
uint value_count;
- ulong counter = 1;
/* counter of iteration in bulk PS operation*/
ulonglong iteration= 0;
ulonglong id;
@@ -767,7 +768,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
value_count= values->elements;
if ((res= mysql_prepare_insert(thd, table_list, fields, values,
- update_fields, update_values, duplic,
+ update_fields, update_values, duplic, ignore,
&unused_conds, FALSE)))
{
retval= thd->is_error();
@@ -828,12 +829,27 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
context->resolve_in_table_list_only(table_list);
switch_to_nullable_trigger_fields(*values, table);
+ /*
+ Check assignability for the leftmost () in VALUES:
+ INSERT INTO t1 (a,b) VALUES (1,2), (3,4);
+ This checks if the values (1,2) can be assigned to fields (a,b).
+ The further values, e.g. (3,4) are not checked - they will be
+ checked during the execution time (when processing actual rows).
+ This is to preserve the "insert until the very first error"-style
+ behaviour for non-transactional tables.
+ */
+ if (values->elements &&
+ table_list->table->check_assignability_opt_fields(fields, *values,
+ ignore))
+ goto abort;
+
while ((values= its++))
{
- counter++;
+ thd->get_stmt_da()->inc_current_row_for_warning();
if (values->elements != value_count)
{
- my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
+ my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0),
+ thd->get_stmt_da()->current_row_for_warning());
goto abort;
}
if (setup_fields(thd, Ref_ptr_array(),
@@ -842,6 +858,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
switch_to_nullable_trigger_fields(*values, table);
}
its.rewind ();
+ thd->get_stmt_da()->reset_current_row_for_warning(0);
/* Restore the current context. */
ctx_state.restore_state(context, table_list);
@@ -1013,6 +1030,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
while ((values= its++))
{
+ thd->get_stmt_da()->inc_current_row_for_warning();
if (fields.elements || !value_count)
{
/*
@@ -1129,7 +1147,6 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
if (unlikely(error))
break;
info.accepted_rows++;
- thd->get_stmt_da()->inc_current_row_for_warning();
}
its.rewind();
iteration++;
@@ -1162,8 +1179,13 @@ values_loop_end:
table->file->ha_release_auto_increment();
if (using_bulk_insert)
{
- if (unlikely(table->file->ha_end_bulk_insert()) &&
- !error)
+ /*
+ if my_error() wasn't called yet on some specific row, end_bulk_insert()
+ can still do it, but the error shouldn't be for any specific row number
+ */
+ if (!error)
+ thd->get_stmt_da()->reset_current_row_for_warning(0);
+ if (unlikely(table->file->ha_end_bulk_insert()) && !error)
{
table->file->print_error(my_errno,MYF(0));
error=1;
@@ -1424,7 +1446,7 @@ static bool check_view_insertability(THD * thd, TABLE_LIST *view)
DBUG_ASSERT(view->table != 0 && view->field_translation != 0);
- (void) my_bitmap_init(&used_fields, used_fields_buff, table->s->fields, 0);
+ (void) my_bitmap_init(&used_fields, used_fields_buff, table->s->fields);
bitmap_clear_all(&used_fields);
view->contain_auto_increment= 0;
@@ -1617,7 +1639,8 @@ static void prepare_for_positional_update(TABLE *table, TABLE_LIST *tables)
int mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
List<Item> &fields, List_item *values,
List<Item> &update_fields, List<Item> &update_values,
- enum_duplicates duplic, COND **where,
+ enum_duplicates duplic, bool ignore,
+ COND **where,
bool select_insert)
{
SELECT_LEX *select_lex= thd->lex->first_select_lex();
@@ -1685,7 +1708,16 @@ int mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
{
select_lex->no_wrap_view_item= TRUE;
res= check_update_fields(thd, context->table_list, update_fields,
- update_values, false, &map);
+ update_values, false, &map) ||
+ /*
+ Check that all col=expr pairs are compatible for assignment in
+ INSERT INTO t1 VALUES (...)
+ ON DUPLICATE KEY UPDATE col=expr [, col=expr];
+ */
+ TABLE::check_assignability_explicit_fields(update_fields,
+ update_values,
+ ignore);
+
select_lex->no_wrap_view_item= FALSE;
}
@@ -1693,6 +1725,8 @@ int mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
ctx_state.restore_state(context, table_list);
}
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
+
if (res)
DBUG_RETURN(res);
@@ -2800,7 +2834,7 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
my_bitmap_init(&copy->has_value_set,
(my_bitmap_map*) (bitmap +
bitmaps_used*share->column_bitmap_size),
- share->fields, FALSE);
+ share->fields);
}
copy->tmp_set.bitmap= 0; // To catch errors
bzero((char*) bitmap, share->column_bitmap_size * bitmaps_used);
@@ -3783,7 +3817,7 @@ int mysql_insert_select_prepare(THD *thd, select_result *sel_res)
if ((res= mysql_prepare_insert(thd, lex->query_tables, lex->field_list, 0,
lex->update_list, lex->value_list,
- lex->duplicates,
+ lex->duplicates, lex->ignore,
&select_lex->where, TRUE)))
DBUG_RETURN(res);
@@ -3877,6 +3911,17 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
check_insert_fields(thd, table_list, *fields, values,
!insert_into_view, 1, &map));
+ if (!res)
+ {
+ /*
+ Check that all colN=exprN pairs are compatible for assignment, e.g.:
+ INSERT INTO t1 (col1, col2) VALUES (expr1, expr2);
+ INSERT INTO t1 SET col1=expr1, col2=expr2;
+ */
+ res= table_list->table->check_assignability_opt_fields(*fields, values,
+ lex->ignore);
+ }
+
if (!res && fields->elements)
{
Abort_on_warning_instant_set aws(thd,
@@ -3930,7 +3975,15 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
}
res= res || setup_fields(thd, Ref_ptr_array(), *info.update_values,
- MARK_COLUMNS_READ, 0, NULL, 0);
+ MARK_COLUMNS_READ, 0, NULL, 0) ||
+ /*
+ Check that all col=expr pairs are compatible for assignment in
+ INSERT INTO t1 SELECT ... FROM t2
+ ON DUPLICATE KEY UPDATE col=expr [, col=expr]
+ */
+ TABLE::check_assignability_explicit_fields(*info.update_fields,
+ *info.update_values,
+ lex->ignore);
if (!res)
{
/*
@@ -5098,7 +5151,8 @@ bool select_create::send_eof()
{
WSREP_DEBUG("select_create commit failed, thd: %llu err: %s %s",
thd->thread_id,
- wsrep_thd_transaction_state_str(thd), wsrep_thd_query(thd));
+ wsrep_thd_transaction_state_str(thd),
+ wsrep_thd_query(thd));
mysql_mutex_unlock(&thd->LOCK_thd_data);
abort_result_set();
DBUG_RETURN(true);
diff --git a/sql/sql_insert.h b/sql/sql_insert.h
index 80666a81c50..8b034c25877 100644
--- a/sql/sql_insert.h
+++ b/sql/sql_insert.h
@@ -27,6 +27,7 @@ int mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
List<Item> &fields, List_item *values,
List<Item> &update_fields,
List<Item> &update_values, enum_duplicates duplic,
+ bool ignore,
COND **where, bool select_insert);
bool mysql_insert(THD *thd,TABLE_LIST *table,List<Item> &fields,
List<List_item> &values, List<Item> &update_fields,
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 460b840ef8a..1f8ce79d32a 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -1350,7 +1350,7 @@ void lex_unlock_plugins(LEX *lex)
/* release used plugins */
if (lex->plugins.elements) /* No function call and no mutex if no plugins. */
{
- plugin_unlock_list(0, (plugin_ref*)lex->plugins.buffer,
+ plugin_unlock_list(0, (plugin_ref*)lex->plugins.buffer,
lex->plugins.elements);
}
reset_dynamic(&lex->plugins);
@@ -6060,8 +6060,10 @@ int st_select_lex_unit::save_union_explain_part2(Explain_query *output)
bool LEX::is_partition_management() const
{
return (sql_command == SQLCOM_ALTER_TABLE &&
- (alter_info.partition_flags == ALTER_PARTITION_ADD ||
- alter_info.partition_flags == ALTER_PARTITION_REORGANIZE));
+ (alter_info.partition_flags & (ALTER_PARTITION_ADD |
+ ALTER_PARTITION_CONVERT_IN |
+ ALTER_PARTITION_CONVERT_OUT |
+ ALTER_PARTITION_REORGANIZE)));
}
@@ -7146,6 +7148,27 @@ bool LEX::sp_declare_cursor(THD *thd, const LEX_CSTRING *name,
uint offp;
sp_instr_cpush *i;
+ /* In some cases param_ctx can be NULL. e.g.: FOR rec IN (SELECT...) */
+ if (param_ctx)
+ {
+ for (uint prm= 0; prm < param_ctx->context_var_count(); prm++)
+ {
+ const sp_variable *param= param_ctx->get_context_variable(prm);
+ if (param->mode != sp_variable::MODE_IN)
+ {
+ /*
+ PL/SQL supports the IN keyword in cursor parameters.
+ We also support this for compatibility. Note, OUT/INOUT parameters
+ will unlikely be ever supported. So "YET" may sound confusing here.
+ But it should be better than using a generic error. Adding a dedicated
+ error message for this small issue is not desirable.
+ */
+ my_error(ER_NOT_SUPPORTED_YET, MYF(0), "OUT/INOUT cursor parameter");
+ return true;
+ }
+ }
+ }
+
if (spcont->find_cursor(name, &offp, true))
{
my_error(ER_SP_DUP_CURS, MYF(0), name->str);
@@ -9731,6 +9754,7 @@ bool Lex_ident_sys_st::to_size_number(ulonglong *to) const
}
+#ifdef WITH_PARTITION_STORAGE_ENGINE
bool LEX::part_values_current(THD *thd)
{
partition_element *elem= part_info->curr_part_elem;
@@ -9738,7 +9762,7 @@ bool LEX::part_values_current(THD *thd)
{
if (unlikely(part_info->part_type != VERSIONING_PARTITION))
{
- my_error(ER_PARTITION_WRONG_TYPE, MYF(0), "SYSTEM_TIME");
+ part_type_error(thd, NULL, "SYSTEM_TIME", part_info);
return true;
}
}
@@ -9765,7 +9789,7 @@ bool LEX::part_values_history(THD *thd)
{
if (unlikely(part_info->part_type != VERSIONING_PARTITION))
{
- my_error(ER_PARTITION_WRONG_TYPE, MYF(0), "SYSTEM_TIME");
+ part_type_error(thd, NULL, "SYSTEM_TIME", part_info);
return true;
}
}
@@ -9786,6 +9810,7 @@ bool LEX::part_values_history(THD *thd)
elem->type= partition_element::HISTORY;
return false;
}
+#endif /* WITH_PARTITION_STORAGE_ENGINE */
bool LEX::last_field_generated_always_as_row_start_or_end(Lex_ident *p,
@@ -11360,6 +11385,25 @@ bool LEX::stmt_alter_table_exchange_partition(Table_ident *table)
}
+bool LEX::stmt_alter_table(Table_ident *table)
+{
+ DBUG_ASSERT(sql_command == SQLCOM_ALTER_TABLE);
+ first_select_lex()->db= table->db;
+ if (first_select_lex()->db.str == NULL &&
+ copy_db_to(&first_select_lex()->db))
+ return true;
+ if (unlikely(check_table_name(table->table.str, table->table.length,
+ false)) ||
+ (table->db.str && unlikely(check_db_name((LEX_STRING*) &table->db))))
+ {
+ my_error(ER_WRONG_TABLE_NAME, MYF(0), table->table.str);
+ return true;
+ }
+ name= table->table;
+ return false;
+}
+
+
void LEX::stmt_purge_to(const LEX_CSTRING &to)
{
type= 0;
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 6ca2159e80f..c1687988fbc 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -291,7 +291,6 @@ class sp_pcontext;
class sp_variable;
class sp_expr_lex;
class sp_assignment_lex;
-class st_alter_tablespace;
class partition_info;
class Event_parse_data;
class set_var_base;
@@ -3522,12 +3521,6 @@ public:
/*
- Reference to a struct that contains information in various commands
- to add/create/drop/change table spaces.
- */
- st_alter_tablespace *alter_tablespace_info;
-
- /*
The set of those tables whose fields are referenced in all subqueries
of the query.
TODO: possibly this it is incorrect to have used tables in LEX because
@@ -3782,8 +3775,10 @@ public:
bool table_or_sp_used();
bool is_partition_management() const;
+#ifdef WITH_PARTITION_STORAGE_ENGINE
bool part_values_current(THD *thd);
bool part_values_history(THD *thd);
+#endif
/**
@brief check if the statement is a single-level join
@@ -4715,6 +4710,7 @@ public:
void stmt_deallocate_prepare(const Lex_ident_sys_st &ident);
bool stmt_alter_table_exchange_partition(Table_ident *table);
+ bool stmt_alter_table(Table_ident *table);
void stmt_purge_to(const LEX_CSTRING &to);
bool stmt_purge_before(Item *item);
diff --git a/sql/sql_load.cc b/sql/sql_load.cc
index 2f1ee0b11bd..fe574db528f 100644
--- a/sql/sql_load.cc
+++ b/sql/sql_load.cc
@@ -659,6 +659,7 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list,
table->copy_blobs=1;
thd->abort_on_warning= !ignore && thd->is_strict_mode();
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
bool create_lookup_handler= handle_duplicates != DUP_ERROR;
if ((table_list->table->file->ha_table_flags() & HA_DUPLICATE_POS))
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index c4f7ef6a2cf..67e52fe2d87 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -54,7 +54,6 @@
// check_mqh,
// reset_mqh
#include "sql_rename.h" // mysql_rename_tables
-#include "sql_tablespace.h" // mysql_alter_tablespace
#include "hostname.h" // hostname_cache_refresh
#include "sql_test.h" // mysql_print_status
#include "sql_select.h" // handle_select, mysql_select,
@@ -878,7 +877,6 @@ void init_update_queries(void)
sql_command_flags[SQLCOM_ALTER_PROCEDURE]|= CF_DISALLOW_IN_RO_TRANS;
sql_command_flags[SQLCOM_ALTER_FUNCTION]|= CF_DISALLOW_IN_RO_TRANS;
sql_command_flags[SQLCOM_TRUNCATE]|= CF_DISALLOW_IN_RO_TRANS;
- sql_command_flags[SQLCOM_ALTER_TABLESPACE]|= CF_DISALLOW_IN_RO_TRANS;
sql_command_flags[SQLCOM_REPAIR]|= CF_DISALLOW_IN_RO_TRANS;
sql_command_flags[SQLCOM_OPTIMIZE]|= CF_DISALLOW_IN_RO_TRANS;
sql_command_flags[SQLCOM_GRANT]|= CF_DISALLOW_IN_RO_TRANS;
@@ -4140,7 +4138,7 @@ mysql_execute_command(THD *thd, bool is_called_from_prepared_stmt)
If new master was not added, we still need to free mi.
*/
if (master_info_added)
- master_info_index->remove_master_info(mi);
+ master_info_index->remove_master_info(mi, 1);
else
delete mi;
}
@@ -5894,12 +5892,6 @@ mysql_execute_command(THD *thd, bool is_called_from_prepared_stmt)
case SQLCOM_XA_RECOVER:
res= mysql_xa_recover(thd);
break;
- case SQLCOM_ALTER_TABLESPACE:
- if (check_global_access(thd, CREATE_TABLESPACE_ACL))
- break;
- if (!(res= mysql_alter_tablespace(thd, lex->alter_tablespace_info)))
- my_ok(thd);
- break;
case SQLCOM_INSTALL_PLUGIN:
if (! (res= mysql_install_plugin(thd, &thd->lex->comment,
&thd->lex->ident)))
@@ -6131,7 +6123,12 @@ finish:
thd->wsrep_consistency_check= NO_CONSISTENCY_CHECK;
if (wsrep_thd_is_toi(thd) || wsrep_thd_is_in_rsu(thd))
+ {
+ WSREP_DEBUG("mysql_execute_command for %s", wsrep_thd_query(thd));
+ THD_STAGE_INFO(thd, stage_waiting_isolation);
wsrep_to_isolation_end(thd);
+ }
+
/*
Force release of transactional locks if not in active MST and wsrep is on.
*/
@@ -7881,7 +7878,8 @@ static bool wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
});
#endif
WSREP_DEBUG("wsrep retrying AC query: %lu %s",
- thd->wsrep_retry_counter, wsrep_thd_query(thd));
+ thd->wsrep_retry_counter,
+ wsrep_thd_query(thd));
wsrep_prepare_for_autocommit_retry(thd, rawbuf, length, parser_state);
if (thd->lex->explain)
delete_explain_query(thd->lex);
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index adb1ad391cf..9c7f25e8808 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -67,9 +67,9 @@
#include "opt_range.h" // store_key_image_to_rec
#include "sql_alter.h" // Alter_table_ctx
#include "sql_select.h"
-#include "sql_tablespace.h" // check_tablespace_name
#include "ddl_log.h"
#include "tztime.h" // my_tz_OFFSET0
+#include "create_options.h" // engine_option_value
#include <algorithm>
using std::max;
@@ -78,11 +78,6 @@ using std::min;
#ifdef WITH_PARTITION_STORAGE_ENGINE
#include "ha_partition.h"
-#define ERROR_INJECT_CRASH(code) \
- DBUG_EVALUATE_IF(code, (DBUG_SUICIDE(), 0), 0)
-#define ERROR_INJECT_ERROR(code) \
- DBUG_EVALUATE_IF(code, (my_error(ER_UNKNOWN_ERROR, MYF(0)), TRUE), 0)
-
/*
Partition related functions declarations and some static constants;
*/
@@ -525,7 +520,7 @@ static bool create_full_part_field_array(THD *thd, TABLE *table,
goto end;
}
if (unlikely(my_bitmap_init(&part_info->full_part_field_set, bitmap_buf,
- table->s->fields, FALSE)))
+ table->s->fields)))
{
result= TRUE;
goto end;
@@ -1100,10 +1095,10 @@ static bool set_up_partition_bitmaps(THD *thd, partition_info *part_info)
bitmap_bytes * 2))))
DBUG_RETURN(TRUE);
- my_bitmap_init(&part_info->read_partitions, bitmap_buf, bitmap_bits, FALSE);
+ my_bitmap_init(&part_info->read_partitions, bitmap_buf, bitmap_bits);
/* Use the second half of the allocated buffer for lock_partitions */
my_bitmap_init(&part_info->lock_partitions, bitmap_buf + (bitmap_bytes / 4),
- bitmap_bits, FALSE);
+ bitmap_bits);
part_info->bitmaps_are_initialized= TRUE;
part_info->set_partition_bitmaps(NULL);
DBUG_RETURN(FALSE);
@@ -2211,12 +2206,10 @@ static int add_keyword_int(String *str, const char *keyword, longlong num)
return err + str->append_longlong(num);
}
-static int add_partition_options(String *str, partition_element *p_elem)
+static int add_server_part_options(String *str, partition_element *p_elem)
{
int err= 0;
- if (p_elem->tablespace_name)
- err+= add_keyword_string(str,"TABLESPACE", false, p_elem->tablespace_name);
if (p_elem->nodegroup_id != UNDEF_NODEGROUP)
err+= add_keyword_int(str,"NODEGROUP",(longlong)p_elem->nodegroup_id);
if (p_elem->part_max_rows)
@@ -2240,6 +2233,20 @@ static int add_partition_options(String *str, partition_element *p_elem)
return err;
}
+static int add_engine_part_options(String *str, partition_element *p_elem)
+{
+ engine_option_value *opt= p_elem->option_list;
+
+ for (; opt; opt= opt->next)
+ {
+ if (!opt->value.str)
+ continue;
+ if ((add_keyword_string(str, opt->name.str, opt->quoted_value,
+ opt->value.str)))
+ return 1;
+ }
+ return 0;
+}
/*
Find the given field's Create_field object using name of field
@@ -2463,7 +2470,7 @@ end:
@retval != 0 Failure
*/
-static int add_key_with_algorithm(String *str, partition_info *part_info)
+static int add_key_with_algorithm(String *str, const partition_info *part_info)
{
int err= 0;
err+= str->append(STRING_WITH_LEN("KEY "));
@@ -2492,6 +2499,78 @@ char *generate_partition_syntax_for_frm(THD *thd, partition_info *part_info,
return res;
}
+
+/*
+ Generate the partition type syntax from the partition data structure.
+
+ @return Operation status.
+ @retval 0 Success
+ @retval > 0 Failure
+ @retval -1 Fatal error
+*/
+
+int partition_info::gen_part_type(THD *thd, String *str) const
+{
+ int err= 0;
+ switch (part_type)
+ {
+ case RANGE_PARTITION:
+ err+= str->append(STRING_WITH_LEN("RANGE "));
+ break;
+ case LIST_PARTITION:
+ err+= str->append(STRING_WITH_LEN("LIST "));
+ break;
+ case HASH_PARTITION:
+ if (linear_hash_ind)
+ err+= str->append(STRING_WITH_LEN("LINEAR "));
+ if (list_of_part_fields)
+ {
+ err+= add_key_with_algorithm(str, this);
+ err+= add_part_field_list(thd, str, part_field_list);
+ }
+ else
+ err+= str->append(STRING_WITH_LEN("HASH "));
+ break;
+ case VERSIONING_PARTITION:
+ err+= str->append(STRING_WITH_LEN("SYSTEM_TIME "));
+ break;
+ default:
+ DBUG_ASSERT(0);
+ /* We really shouldn't get here, no use in continuing from here */
+ my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATAL));
+ return -1;
+ }
+ return err;
+}
+
+
+void part_type_error(THD *thd, partition_info *work_part_info,
+ const char *part_type,
+ partition_info *tab_part_info)
+{
+ StringBuffer<256> tab_part_type;
+ if (tab_part_info->gen_part_type(thd, &tab_part_type) < 0)
+ return;
+ tab_part_type.length(tab_part_type.length() - 1);
+ if (work_part_info)
+ {
+ DBUG_ASSERT(!part_type);
+ StringBuffer<256> work_part_type;
+ if (work_part_info->gen_part_type(thd, &work_part_type) < 0)
+ return;
+ work_part_type.length(work_part_type.length() - 1);
+ my_error(ER_PARTITION_WRONG_TYPE, MYF(0), work_part_type.c_ptr(),
+ tab_part_type.c_ptr());
+ }
+ else
+ {
+ DBUG_ASSERT(part_type);
+ my_error(ER_PARTITION_WRONG_TYPE, MYF(0), part_type,
+ tab_part_type.c_ptr());
+ }
+}
+
+
/*
Generate the partition syntax from the partition data structure.
Useful for support of generating defaults, SHOW CREATE TABLES
@@ -2535,34 +2614,10 @@ char *generate_partition_syntax(THD *thd, partition_info *part_info,
DBUG_ENTER("generate_partition_syntax");
err+= str.append(STRING_WITH_LEN(" PARTITION BY "));
- switch (part_info->part_type)
- {
- case RANGE_PARTITION:
- err+= str.append(STRING_WITH_LEN("RANGE "));
- break;
- case LIST_PARTITION:
- err+= str.append(STRING_WITH_LEN("LIST "));
- break;
- case HASH_PARTITION:
- if (part_info->linear_hash_ind)
- err+= str.append(STRING_WITH_LEN("LINEAR "));
- if (part_info->list_of_part_fields)
- {
- err+= add_key_with_algorithm(&str, part_info);
- err+= add_part_field_list(thd, &str, part_info->part_field_list);
- }
- else
- err+= str.append(STRING_WITH_LEN("HASH "));
- break;
- case VERSIONING_PARTITION:
- err+= str.append(STRING_WITH_LEN("SYSTEM_TIME "));
- break;
- default:
- DBUG_ASSERT(0);
- /* We really shouldn't get here, no use in continuing from here */
- my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATAL));
- DBUG_RETURN(NULL);
- }
+ int err2= part_info->gen_part_type(thd, &str);
+ if (err2 < 0)
+ DBUG_RETURN(NULL);
+ err+= err2;
if (part_info->part_type == VERSIONING_PARTITION)
{
Vers_part_info *vers_info= part_info->vers_info;
@@ -2663,7 +2718,10 @@ char *generate_partition_syntax(THD *thd, partition_info *part_info,
part_info->use_default_subpartitions)
{
if (show_partition_options)
- err+= add_partition_options(&str, part_elem);
+ {
+ err+= add_server_part_options(&str, part_elem);
+ err+= add_engine_part_options(&str, part_elem);
+ }
}
else
{
@@ -2677,7 +2735,7 @@ char *generate_partition_syntax(THD *thd, partition_info *part_info,
err+= append_identifier(thd, &str, part_elem->partition_name,
strlen(part_elem->partition_name));
if (show_partition_options)
- err+= add_partition_options(&str, part_elem);
+ err+= add_server_part_options(&str, part_elem);
if (j != (num_subparts-1))
err+= str.append(STRING_WITH_LEN(",\n "));
else
@@ -4714,8 +4772,6 @@ bool compare_partition_options(HA_CREATE_INFO *table_create_info,
Note that there are not yet any engine supporting tablespace together
with partitioning. TODO: when there are, add compare.
*/
- if (part_elem->tablespace_name || table_create_info->tablespace)
- option_diffs[errors++]= "TABLESPACE";
if (part_elem->part_max_rows != table_create_info->max_rows)
option_diffs[errors++]= "MAX_ROWS";
if (part_elem->part_min_rows != table_create_info->min_rows)
@@ -4877,10 +4933,12 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
if (alter_info->partition_flags &
(ALTER_PARTITION_ADD |
ALTER_PARTITION_DROP |
+ ALTER_PARTITION_CONVERT_OUT |
ALTER_PARTITION_COALESCE |
ALTER_PARTITION_REORGANIZE |
ALTER_PARTITION_TABLE_REORG |
- ALTER_PARTITION_REBUILD))
+ ALTER_PARTITION_REBUILD |
+ ALTER_PARTITION_CONVERT_IN))
{
/*
You can't add column when we are doing alter related to partition
@@ -5017,6 +5075,13 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
if ((alter_info->partition_flags & ALTER_PARTITION_ADD) ||
(alter_info->partition_flags & ALTER_PARTITION_REORGANIZE))
{
+ if ((alter_info->partition_flags & ALTER_PARTITION_CONVERT_IN) &&
+ !(tab_part_info->part_type == RANGE_PARTITION ||
+ tab_part_info->part_type == LIST_PARTITION))
+ {
+ my_error(ER_ONLY_ON_RANGE_LIST_PARTITION, MYF(0), "CONVERT TABLE TO");
+ goto err;
+ }
if (thd->work_part_info->part_type != tab_part_info->part_type)
{
if (thd->work_part_info->part_type == NOT_A_PARTITION)
@@ -5052,7 +5117,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
else if (thd->work_part_info->part_type == VERSIONING_PARTITION ||
tab_part_info->part_type == VERSIONING_PARTITION)
{
- my_error(ER_PARTITION_WRONG_TYPE, MYF(0), "SYSTEM_TIME");
+ part_type_error(thd, thd->work_part_info, NULL, tab_part_info);
}
else
{
@@ -5372,8 +5437,12 @@ that are reorganised.
tab_part_info->is_auto_partitioned= FALSE;
}
}
- else if (alter_info->partition_flags & ALTER_PARTITION_DROP)
+ else if ((alter_info->partition_flags & ALTER_PARTITION_DROP) |
+ (alter_info->partition_flags & ALTER_PARTITION_CONVERT_OUT))
{
+ const char * const cmd=
+ (alter_info->partition_flags & ALTER_PARTITION_CONVERT_OUT) ?
+ "CONVERT" : "DROP";
/*
Drop a partition from a range partition and list partitioning is
always safe and can be made more or less immediate. It is necessary
@@ -5402,7 +5471,7 @@ that are reorganised.
if (!(tab_part_info->part_type == RANGE_PARTITION ||
tab_part_info->part_type == LIST_PARTITION))
{
- my_error(ER_ONLY_ON_RANGE_LIST_PARTITION, MYF(0), "DROP");
+ my_error(ER_ONLY_ON_RANGE_LIST_PARTITION, MYF(0), cmd);
goto err;
}
if (num_parts_dropped >= tab_part_info->num_parts)
@@ -5444,7 +5513,7 @@ that are reorganised.
} while (++part_count < tab_part_info->num_parts);
if (num_parts_found != num_parts_dropped)
{
- my_error(ER_DROP_PARTITION_NON_EXISTENT, MYF(0), "DROP");
+ my_error(ER_PARTITION_DOES_NOT_EXIST, MYF(0));
goto err;
}
if (table->file->is_fk_defined_on_table_or_index(MAX_KEY))
@@ -5452,6 +5521,17 @@ that are reorganised.
my_error(ER_ROW_IS_REFERENCED, MYF(0));
goto err;
}
+ DBUG_ASSERT(!(alter_info->partition_flags & ALTER_PARTITION_CONVERT_OUT) ||
+ num_parts_dropped == 1);
+ /* NOTE: num_parts is used in generate_partition_syntax() */
+ tab_part_info->num_parts-= num_parts_dropped;
+ if ((alter_info->partition_flags & ALTER_PARTITION_CONVERT_OUT) &&
+ tab_part_info->is_sub_partitioned())
+ {
+ // TODO technically this can be converted to a *partitioned* table
+ my_error(ER_PARTITION_CONVERT_SUBPARTITIONED, MYF(0));
+ goto err;
+ }
}
else if (alter_info->partition_flags & ALTER_PARTITION_REBUILD)
{
@@ -5459,7 +5539,7 @@ that are reorganised.
tab_part_info->default_engine_type);
if (set_part_state(alter_info, tab_part_info, PART_CHANGED))
{
- my_error(ER_DROP_PARTITION_NON_EXISTENT, MYF(0), "REBUILD");
+ my_error(ER_PARTITION_DOES_NOT_EXIST, MYF(0));
goto err;
}
if (!(*fast_alter_table))
@@ -5735,7 +5815,7 @@ the generated partition syntax in a correct manner.
} while (++part_count < tab_part_info->num_parts);
if (drop_count != num_parts_reorged)
{
- my_error(ER_DROP_PARTITION_NON_EXISTENT, MYF(0), "REORGANIZE");
+ my_error(ER_PARTITION_DOES_NOT_EXIST, MYF(0));
goto err;
}
tab_part_info->num_parts= check_total_partitions;
@@ -5795,7 +5875,7 @@ the generated partition syntax in a correct manner.
goto err;
}
}
- } // ADD, DROP, COALESCE, REORGANIZE, TABLE_REORG, REBUILD
+ } // ADD, DROP, COALESCE, REORGANIZE, TABLE_REORG, REBUILD, CONVERT
else
{
/*
@@ -6136,19 +6216,64 @@ static bool mysql_drop_partitions(ALTER_PARTITION_PARAM_TYPE *lpt)
/*
- Insert log entry into list
+ Convert partition to a table in an ALTER TABLE of partitions
+
SYNOPSIS
- insert_part_info_log_entry_list()
- log_entry
+ alter_partition_convert_out()
+ lpt Struct containing parameters
+
RETURN VALUES
- NONE
+ TRUE Failure
+ FALSE Success
+
+ DESCRIPTION
+ Rename partition table marked with PART_TO_BE_DROPPED into a separate table
+ under the name lpt->alter_ctx->(new_db, new_name).
+
+ This is ddl-logged by write_log_convert_out_partition().
*/
-static void insert_part_info_log_entry_list(partition_info *part_info,
- DDL_LOG_MEMORY_ENTRY *log_entry)
+static bool alter_partition_convert_out(ALTER_PARTITION_PARAM_TYPE *lpt)
{
- log_entry->next_active_log_entry= part_info->first_log_entry;
- part_info->first_log_entry= log_entry;
+ partition_info *part_info= lpt->table->part_info;
+ THD *thd= lpt->thd;
+ int error;
+ handler *file= get_new_handler(NULL, thd->mem_root, part_info->default_engine_type);
+
+ DBUG_ASSERT(lpt->thd->mdl_context.is_lock_owner(MDL_key::TABLE,
+ lpt->table->s->db.str,
+ lpt->table->s->table_name.str,
+ MDL_EXCLUSIVE));
+
+ char from_name[FN_REFLEN + 1], to_name[FN_REFLEN + 1];
+ const char *path= lpt->table->s->path.str;
+
+ build_table_filename(to_name, sizeof(to_name) - 1, lpt->alter_ctx->new_db.str,
+ lpt->alter_ctx->new_name.str, "", 0);
+
+ for (const partition_element &e: part_info->partitions)
+ {
+ if (e.part_state != PART_TO_BE_DROPPED)
+ continue;
+
+ if (unlikely((error= create_partition_name(from_name, sizeof(from_name),
+ path, e.partition_name,
+ NORMAL_PART_NAME, FALSE))))
+ {
+ DBUG_ASSERT(thd->is_error());
+ return true;
+ }
+ if (DBUG_IF("error_convert_partition_00") ||
+ unlikely(error= file->ha_rename_table(from_name, to_name)))
+ {
+ my_error(ER_ERROR_ON_RENAME, MYF(0), from_name, to_name, my_errno);
+ lpt->table->file->print_error(error, MYF(0));
+ return true;
+ }
+ break;
+ }
+
+ return false;
}
@@ -6176,50 +6301,44 @@ static void release_part_info_log_entries(DDL_LOG_MEMORY_ENTRY *log_entry)
/*
- Log an delete/rename frm file
+ Log an rename frm file
SYNOPSIS
- write_log_replace_delete_frm()
+ write_log_replace_frm()
lpt Struct for parameters
next_entry Next reference to use in log record
from_path Name to rename from
to_path Name to rename to
- replace_flag TRUE if replace, else delete
RETURN VALUES
TRUE Error
FALSE Success
DESCRIPTION
- Support routine that writes a replace or delete of an frm file into the
+ Support routine that writes a replace of an frm file into the
ddl log. It also inserts an entry that keeps track of used space into
the partition info object
*/
-static bool write_log_replace_delete_frm(ALTER_PARTITION_PARAM_TYPE *lpt,
- uint next_entry,
- const char *from_path,
- const char *to_path,
- bool replace_flag)
+bool write_log_replace_frm(ALTER_PARTITION_PARAM_TYPE *lpt,
+ uint next_entry,
+ const char *from_path,
+ const char *to_path)
{
DDL_LOG_ENTRY ddl_log_entry;
DDL_LOG_MEMORY_ENTRY *log_entry;
- DBUG_ENTER("write_log_replace_delete_frm");
+ DBUG_ENTER("write_log_replace_frm");
bzero(&ddl_log_entry, sizeof(ddl_log_entry));
- if (replace_flag)
- ddl_log_entry.action_type= DDL_LOG_REPLACE_ACTION;
- else
- ddl_log_entry.action_type= DDL_LOG_DELETE_ACTION;
+ ddl_log_entry.action_type= DDL_LOG_REPLACE_ACTION;
ddl_log_entry.next_entry= next_entry;
lex_string_set(&ddl_log_entry.handler_name, reg_ext);
lex_string_set(&ddl_log_entry.name, to_path);
+ lex_string_set(&ddl_log_entry.from_name, from_path);
- if (replace_flag)
- lex_string_set(&ddl_log_entry.from_name, from_path);
if (ddl_log_write_entry(&ddl_log_entry, &log_entry))
{
- DBUG_RETURN(TRUE);
+ DBUG_RETURN(true);
}
- insert_part_info_log_entry_list(lpt->part_info, log_entry);
- DBUG_RETURN(FALSE);
+ ddl_log_add_entry(lpt->part_info, log_entry);
+ DBUG_RETURN(false);
}
@@ -6298,7 +6417,7 @@ static bool write_log_changed_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
*next_entry= log_entry->entry_pos;
sub_elem->log_entry= log_entry;
- insert_part_info_log_entry_list(part_info, log_entry);
+ ddl_log_add_entry(part_info, log_entry);
} while (++j < num_subparts);
}
else
@@ -6325,7 +6444,7 @@ static bool write_log_changed_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
}
*next_entry= log_entry->entry_pos;
part_elem->log_entry= log_entry;
- insert_part_info_log_entry_list(part_info, log_entry);
+ ddl_log_add_entry(part_info, log_entry);
}
}
} while (++i < num_elements);
@@ -6334,21 +6453,29 @@ static bool write_log_changed_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
/*
- Log dropped partitions
+ Log dropped or converted partitions
SYNOPSIS
- write_log_dropped_partitions()
+ log_drop_or_convert_action()
lpt Struct containing parameters
RETURN VALUES
TRUE Error
FALSE Success
*/
-static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
- uint *next_entry,
- const char *path,
- bool temp_list)
+enum log_action_enum
+{
+ ACT_DROP = 0,
+ ACT_CONVERT_IN,
+ ACT_CONVERT_OUT
+};
+
+static bool log_drop_or_convert_action(ALTER_PARTITION_PARAM_TYPE *lpt,
+ uint *next_entry, const char *path,
+ const char *from_name, bool temp_list,
+ const log_action_enum convert_action)
{
DDL_LOG_ENTRY ddl_log_entry;
+ DBUG_ASSERT(convert_action == ACT_DROP || (from_name != NULL));
partition_info *part_info= lpt->part_info;
DDL_LOG_MEMORY_ENTRY *log_entry;
char tmp_path[FN_REFLEN + 1];
@@ -6356,10 +6483,13 @@ static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
List_iterator<partition_element> temp_it(part_info->temp_partitions);
uint num_temp_partitions= part_info->temp_partitions.elements;
uint num_elements= part_info->partitions.elements;
- DBUG_ENTER("write_log_dropped_partitions");
+ DBUG_ENTER("log_drop_or_convert_action");
bzero(&ddl_log_entry, sizeof(ddl_log_entry));
- ddl_log_entry.action_type= DDL_LOG_DELETE_ACTION;
+
+ ddl_log_entry.action_type= convert_action ?
+ DDL_LOG_RENAME_ACTION :
+ DDL_LOG_DELETE_ACTION;
if (temp_list)
num_elements= num_temp_partitions;
while (num_elements--)
@@ -6380,8 +6510,13 @@ static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
name_variant= TEMP_PART_NAME;
else
name_variant= NORMAL_PART_NAME;
+ DBUG_ASSERT(convert_action != ACT_CONVERT_IN ||
+ part_elem->part_state == PART_TO_BE_ADDED);
+ DBUG_ASSERT(convert_action != ACT_CONVERT_OUT ||
+ part_elem->part_state == PART_TO_BE_DROPPED);
if (part_info->is_sub_partitioned())
{
+ DBUG_ASSERT(!convert_action);
List_iterator<partition_element> sub_it(part_elem->subpartitions);
uint num_subparts= part_info->num_subparts;
uint j= 0;
@@ -6403,7 +6538,7 @@ static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
}
*next_entry= log_entry->entry_pos;
sub_elem->log_entry= log_entry;
- insert_part_info_log_entry_list(part_info, log_entry);
+ ddl_log_add_entry(part_info, log_entry);
} while (++j < num_subparts);
}
else
@@ -6415,14 +6550,25 @@ static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
part_elem->partition_name, name_variant,
TRUE))
DBUG_RETURN(TRUE);
- lex_string_set(&ddl_log_entry.name, tmp_path);
+ switch (convert_action)
+ {
+ case ACT_CONVERT_OUT:
+ ddl_log_entry.from_name= { from_name, strlen(from_name) };
+ /* fall through */
+ case ACT_DROP:
+ ddl_log_entry.name= { tmp_path, strlen(tmp_path) };
+ break;
+ case ACT_CONVERT_IN:
+ ddl_log_entry.name= { from_name, strlen(from_name) };
+ ddl_log_entry.from_name= { tmp_path, strlen(tmp_path) };
+ }
if (ddl_log_write_entry(&ddl_log_entry, &log_entry))
{
DBUG_RETURN(TRUE);
}
*next_entry= log_entry->entry_pos;
part_elem->log_entry= log_entry;
- insert_part_info_log_entry_list(part_info, log_entry);
+ ddl_log_add_entry(part_info, log_entry);
}
}
}
@@ -6430,21 +6576,37 @@ static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
}
-/*
- Set execute log entry in ddl log for this partitioned table
- SYNOPSIS
- set_part_info_exec_log_entry()
- part_info Partition info object
- exec_log_entry Log entry
- RETURN VALUES
- NONE
-*/
-
-static void set_part_info_exec_log_entry(partition_info *part_info,
- DDL_LOG_MEMORY_ENTRY *exec_log_entry)
+inline
+static bool write_log_dropped_partitions(ALTER_PARTITION_PARAM_TYPE *lpt,
+ uint *next_entry, const char *path,
+ bool temp_list)
{
- part_info->exec_log_entry= exec_log_entry;
- exec_log_entry->next_active_log_entry= NULL;
+ return log_drop_or_convert_action(lpt, next_entry, path, NULL, temp_list,
+ ACT_DROP);
+}
+
+inline
+static bool write_log_convert_partition(ALTER_PARTITION_PARAM_TYPE *lpt,
+ uint *next_entry, const char *path)
+{
+ char other_table[FN_REFLEN + 1];
+ const ulong f= lpt->alter_info->partition_flags;
+ DBUG_ASSERT((f & ALTER_PARTITION_CONVERT_IN) || (f & ALTER_PARTITION_CONVERT_OUT));
+ const log_action_enum convert_action= (f & ALTER_PARTITION_CONVERT_IN)
+ ? ACT_CONVERT_IN : ACT_CONVERT_OUT;
+ build_table_filename(other_table, sizeof(other_table) - 1, lpt->alter_ctx->new_db.str,
+ lpt->alter_ctx->new_name.str, "", 0);
+ DDL_LOG_MEMORY_ENTRY *main_entry= lpt->part_info->main_entry;
+ bool res= log_drop_or_convert_action(lpt, next_entry, path, other_table,
+ false, convert_action);
+ /*
+ NOTE: main_entry is "drop shadow frm", we have to keep it like this
+ because partitioning crash-safety disables it at install shadow FRM phase.
+ This is needed to avoid spurious drop action when the shadow frm is replaced
+ by the backup frm and there is nothing to drop.
+ */
+ lpt->part_info->main_entry= main_entry;
+ return res;
}
@@ -6452,10 +6614,9 @@ static void set_part_info_exec_log_entry(partition_info *part_info,
Write the log entry to ensure that the shadow frm file is removed at
crash.
SYNOPSIS
- write_log_drop_shadow_frm()
+ write_log_drop_frm()
lpt Struct containing parameters
- install_frm Should we log action to install shadow frm or should
- the action be to remove the shadow frm file.
+
RETURN VALUES
TRUE Error
FALSE Success
@@ -6464,36 +6625,53 @@ static void set_part_info_exec_log_entry(partition_info *part_info,
file and its corresponding handler file.
*/
-static bool write_log_drop_shadow_frm(ALTER_PARTITION_PARAM_TYPE *lpt)
+static bool write_log_drop_frm(ALTER_PARTITION_PARAM_TYPE *lpt,
+ DDL_LOG_STATE *drop_chain)
{
- partition_info *part_info= lpt->part_info;
- DDL_LOG_MEMORY_ENTRY *log_entry;
- DDL_LOG_MEMORY_ENTRY *exec_log_entry= NULL;
- char shadow_path[FN_REFLEN + 1];
- DBUG_ENTER("write_log_drop_shadow_frm");
+ char path[FN_REFLEN + 1];
+ DBUG_ENTER("write_log_drop_frm");
+ const DDL_LOG_STATE *main_chain= lpt->part_info;
+ const bool drop_backup= (drop_chain != main_chain);
- build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt);
+ build_table_shadow_filename(path, sizeof(path) - 1, lpt, drop_backup);
mysql_mutex_lock(&LOCK_gdl);
- if (write_log_replace_delete_frm(lpt, 0UL, NULL,
- (const char*)shadow_path, FALSE))
+ if (ddl_log_delete_frm(drop_chain, (const char*)path))
goto error;
- log_entry= part_info->first_log_entry;
- if (ddl_log_write_execute_entry(log_entry->entry_pos,
- &exec_log_entry))
+
+ if (drop_backup && (lpt->alter_info->partition_flags & ALTER_PARTITION_CONVERT_IN))
+ {
+ TABLE_LIST *table_from= lpt->table_list->next_local;
+ build_table_filename(path, sizeof(path) - 1, table_from->db.str,
+ table_from->table_name.str, "", 0);
+
+ if (ddl_log_delete_frm(drop_chain, (const char*) path))
+ goto error;
+ }
+
+ if (ddl_log_write_execute_entry(drop_chain->list->entry_pos,
+ drop_backup ?
+ main_chain->execute_entry->entry_pos : 0,
+ &drop_chain->execute_entry))
goto error;
mysql_mutex_unlock(&LOCK_gdl);
- set_part_info_exec_log_entry(part_info, exec_log_entry);
DBUG_RETURN(FALSE);
error:
- release_part_info_log_entries(part_info->first_log_entry);
+ release_part_info_log_entries(drop_chain->list);
mysql_mutex_unlock(&LOCK_gdl);
- part_info->first_log_entry= NULL;
+ drop_chain->list= NULL;
my_error(ER_DDL_LOG_ERROR, MYF(0));
DBUG_RETURN(TRUE);
}
+static inline
+bool write_log_drop_shadow_frm(ALTER_PARTITION_PARAM_TYPE *lpt)
+{
+ return write_log_drop_frm(lpt, lpt->part_info);
+}
+
+
/*
Log renaming of shadow frm to real frm name and dropping of old frm
SYNOPSIS
@@ -6511,20 +6689,20 @@ static bool write_log_rename_frm(ALTER_PARTITION_PARAM_TYPE *lpt)
{
partition_info *part_info= lpt->part_info;
DDL_LOG_MEMORY_ENTRY *log_entry;
- DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->exec_log_entry;
+ DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->execute_entry;
char path[FN_REFLEN + 1];
char shadow_path[FN_REFLEN + 1];
- DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->first_log_entry;
+ DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->list;
DBUG_ENTER("write_log_rename_frm");
- part_info->first_log_entry= NULL;
+ part_info->list= NULL;
build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0);
build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt);
mysql_mutex_lock(&LOCK_gdl);
- if (write_log_replace_delete_frm(lpt, 0UL, shadow_path, path, TRUE))
+ if (write_log_replace_frm(lpt, 0UL, shadow_path, path))
goto error;
- log_entry= part_info->first_log_entry;
- part_info->frm_log_entry= log_entry;
+ log_entry= part_info->list;
+ part_info->main_entry= log_entry;
if (ddl_log_write_execute_entry(log_entry->entry_pos,
&exec_log_entry))
goto error;
@@ -6533,10 +6711,10 @@ static bool write_log_rename_frm(ALTER_PARTITION_PARAM_TYPE *lpt)
DBUG_RETURN(FALSE);
error:
- release_part_info_log_entries(part_info->first_log_entry);
+ release_part_info_log_entries(part_info->list);
mysql_mutex_unlock(&LOCK_gdl);
- part_info->first_log_entry= old_first_log_entry;
- part_info->frm_log_entry= NULL;
+ part_info->list= old_first_log_entry;
+ part_info->main_entry= NULL;
my_error(ER_DDL_LOG_ERROR, MYF(0));
DBUG_RETURN(TRUE);
}
@@ -6561,25 +6739,25 @@ static bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
{
partition_info *part_info= lpt->part_info;
DDL_LOG_MEMORY_ENTRY *log_entry;
- DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->exec_log_entry;
+ DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->execute_entry;
char tmp_path[FN_REFLEN + 1];
char path[FN_REFLEN + 1];
uint next_entry= 0;
- DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->first_log_entry;
+ DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->list;
DBUG_ENTER("write_log_drop_partition");
- part_info->first_log_entry= NULL;
+ part_info->list= NULL;
build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0);
build_table_shadow_filename(tmp_path, sizeof(tmp_path) - 1, lpt);
mysql_mutex_lock(&LOCK_gdl);
if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path,
FALSE))
goto error;
- if (write_log_replace_delete_frm(lpt, next_entry, (const char*)tmp_path,
- (const char*)path, TRUE))
+ if (write_log_replace_frm(lpt, next_entry, (const char*)tmp_path,
+ (const char*)path))
goto error;
- log_entry= part_info->first_log_entry;
- part_info->frm_log_entry= log_entry;
+ log_entry= part_info->list;
+ part_info->main_entry= log_entry;
if (ddl_log_write_execute_entry(log_entry->entry_pos,
&exec_log_entry))
goto error;
@@ -6588,15 +6766,44 @@ static bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
DBUG_RETURN(FALSE);
error:
- release_part_info_log_entries(part_info->first_log_entry);
+ release_part_info_log_entries(part_info->list);
mysql_mutex_unlock(&LOCK_gdl);
- part_info->first_log_entry= old_first_log_entry;
- part_info->frm_log_entry= NULL;
+ part_info->list= old_first_log_entry;
+ part_info->main_entry= NULL;
my_error(ER_DDL_LOG_ERROR, MYF(0));
DBUG_RETURN(TRUE);
}
+static bool write_log_convert_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
+{
+ partition_info *part_info= lpt->part_info;
+ char tmp_path[FN_REFLEN + 1];
+ char path[FN_REFLEN + 1];
+ uint next_entry= part_info->list ? part_info->list->entry_pos : 0;
+
+ build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0);
+ build_table_shadow_filename(tmp_path, sizeof(tmp_path) - 1, lpt);
+
+ mysql_mutex_lock(&LOCK_gdl);
+
+ if (write_log_convert_partition(lpt, &next_entry, (const char*)path))
+ goto error;
+ DBUG_ASSERT(next_entry == part_info->list->entry_pos);
+ if (ddl_log_write_execute_entry(part_info->list->entry_pos,
+ &part_info->execute_entry))
+ goto error;
+ mysql_mutex_unlock(&LOCK_gdl);
+ return false;
+
+error:
+ mysql_mutex_unlock(&LOCK_gdl);
+ part_info->main_entry= NULL;
+ my_error(ER_DDL_LOG_ERROR, MYF(0));
+ return true;
+}
+
+
/*
Write the log entries to ensure that the add partition command is not
executed at all if a crash before it has completed
@@ -6618,11 +6825,10 @@ static bool write_log_add_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
{
partition_info *part_info= lpt->part_info;
DDL_LOG_MEMORY_ENTRY *log_entry;
- DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->exec_log_entry;
char tmp_path[FN_REFLEN + 1];
char path[FN_REFLEN + 1];
uint next_entry= 0;
- DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->first_log_entry;
+ DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->list;
/* write_log_drop_shadow_frm(lpt) must have been run first */
DBUG_ASSERT(old_first_log_entry);
DBUG_ENTER("write_log_add_change_partition");
@@ -6637,20 +6843,18 @@ static bool write_log_add_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path,
FALSE))
goto error;
- log_entry= part_info->first_log_entry;
+ log_entry= part_info->list;
if (ddl_log_write_execute_entry(log_entry->entry_pos,
- /* Reuse the old execute ddl_log_entry */
- &exec_log_entry))
+ &part_info->execute_entry))
goto error;
mysql_mutex_unlock(&LOCK_gdl);
- set_part_info_exec_log_entry(part_info, exec_log_entry);
DBUG_RETURN(FALSE);
error:
- release_part_info_log_entries(part_info->first_log_entry);
+ release_part_info_log_entries(part_info->list);
mysql_mutex_unlock(&LOCK_gdl);
- part_info->first_log_entry= old_first_log_entry;
+ part_info->list= old_first_log_entry;
my_error(ER_DDL_LOG_ERROR, MYF(0));
DBUG_RETURN(TRUE);
}
@@ -6682,10 +6886,10 @@ static bool write_log_final_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
{
partition_info *part_info= lpt->part_info;
DDL_LOG_MEMORY_ENTRY *log_entry;
- DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->exec_log_entry;
+ DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->execute_entry;
char path[FN_REFLEN + 1];
char shadow_path[FN_REFLEN + 1];
- DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->first_log_entry;
+ DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->list;
uint next_entry= 0;
DBUG_ENTER("write_log_final_change_partition");
@@ -6693,7 +6897,7 @@ static bool write_log_final_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
Do not link any previous log entry.
Replace the revert operations with forced retry operations.
*/
- part_info->first_log_entry= NULL;
+ part_info->list= NULL;
build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0);
build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt);
mysql_mutex_lock(&LOCK_gdl);
@@ -6703,10 +6907,10 @@ static bool write_log_final_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
lpt->alter_info->partition_flags &
ALTER_PARTITION_REORGANIZE))
goto error;
- if (write_log_replace_delete_frm(lpt, next_entry, shadow_path, path, TRUE))
+ if (write_log_replace_frm(lpt, next_entry, shadow_path, path))
goto error;
- log_entry= part_info->first_log_entry;
- part_info->frm_log_entry= log_entry;
+ log_entry= part_info->list;
+ part_info->main_entry= log_entry;
/* Overwrite the revert execute log entry with this retry execute entry */
if (ddl_log_write_execute_entry(log_entry->entry_pos,
&exec_log_entry))
@@ -6716,10 +6920,10 @@ static bool write_log_final_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
DBUG_RETURN(FALSE);
error:
- release_part_info_log_entries(part_info->first_log_entry);
+ release_part_info_log_entries(part_info->list);
mysql_mutex_unlock(&LOCK_gdl);
- part_info->first_log_entry= old_first_log_entry;
- part_info->frm_log_entry= NULL;
+ part_info->list= old_first_log_entry;
+ part_info->main_entry= NULL;
my_error(ER_DDL_LOG_ERROR, MYF(0));
DBUG_RETURN(TRUE);
}
@@ -6736,11 +6940,15 @@ error:
FALSE Success
*/
+/*
+ TODO: Partitioning atomic DDL refactoring: this should be replaced with
+ ddl_log_complete().
+*/
static void write_log_completed(ALTER_PARTITION_PARAM_TYPE *lpt,
bool dont_crash)
{
partition_info *part_info= lpt->part_info;
- DDL_LOG_MEMORY_ENTRY *log_entry= part_info->exec_log_entry;
+ DDL_LOG_MEMORY_ENTRY *log_entry= part_info->execute_entry;
DBUG_ENTER("write_log_completed");
DBUG_ASSERT(log_entry);
@@ -6756,11 +6964,11 @@ static void write_log_completed(ALTER_PARTITION_PARAM_TYPE *lpt,
*/
;
}
- release_part_info_log_entries(part_info->first_log_entry);
- release_part_info_log_entries(part_info->exec_log_entry);
+ release_part_info_log_entries(part_info->list);
+ release_part_info_log_entries(part_info->execute_entry);
mysql_mutex_unlock(&LOCK_gdl);
- part_info->exec_log_entry= NULL;
- part_info->first_log_entry= NULL;
+ part_info->execute_entry= NULL;
+ part_info->list= NULL;
DBUG_VOID_RETURN;
}
@@ -6774,14 +6982,18 @@ static void write_log_completed(ALTER_PARTITION_PARAM_TYPE *lpt,
NONE
*/
+/*
+ TODO: Partitioning atomic DDL refactoring: this should be replaced with
+ ddl_log_release_entries().
+*/
static void release_log_entries(partition_info *part_info)
{
mysql_mutex_lock(&LOCK_gdl);
- release_part_info_log_entries(part_info->first_log_entry);
- release_part_info_log_entries(part_info->exec_log_entry);
+ release_part_info_log_entries(part_info->list);
+ release_part_info_log_entries(part_info->execute_entry);
mysql_mutex_unlock(&LOCK_gdl);
- part_info->first_log_entry= NULL;
- part_info->exec_log_entry= NULL;
+ part_info->list= NULL;
+ part_info->execute_entry= NULL;
}
@@ -6864,10 +7076,15 @@ static int alter_close_table(ALTER_PARTITION_PARAM_TYPE *lpt)
@param close_table Table is still open, close it before reverting
*/
+/*
+ TODO: Partitioning atomic DDL refactoring: this should be replaced with
+ correct combination of ddl_log_revert() / ddl_log_complete()
+*/
static void handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt,
bool action_completed,
bool drop_partition,
- bool frm_install)
+ bool frm_install,
+ bool reopen)
{
THD *thd= lpt->thd;
partition_info *part_info= lpt->part_info->get_clone(thd);
@@ -6911,8 +7128,11 @@ static void handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt,
close_all_tables_for_name(thd, table->s, HA_EXTRA_NOT_USED, NULL);
}
- if (part_info->first_log_entry &&
- ddl_log_execute_entry(thd, part_info->first_log_entry->entry_pos))
+ if (!reopen)
+ DBUG_VOID_RETURN;
+
+ if (part_info->list &&
+ ddl_log_execute_entry(thd, part_info->list->entry_pos))
{
/*
We couldn't recover from error, most likely manual interaction
@@ -7074,6 +7294,64 @@ bool log_partition_alter_to_ddl_log(ALTER_PARTITION_PARAM_TYPE *lpt)
}
+extern bool alter_partition_convert_in(ALTER_PARTITION_PARAM_TYPE *lpt);
+
+/**
+ Check that definition of source table fits definition of partition being
+ added and every row stored in the table conforms partition's expression.
+
+ @param lpt Structure containing parameters required for checking
+ @param[in,out] part_file_name_buf Buffer for storing a partition name
+ @param part_file_name_buf_sz Size of buffer for storing a partition name
+ @param part_file_name_len Length of partition prefix stored in the buffer
+ on invocation of function
+
+ @return false on success, true on error
+*/
+
+static bool check_table_data(ALTER_PARTITION_PARAM_TYPE *lpt)
+{
+ /*
+ TODO: if destination is partitioned by range(X) and source is indexed by X
+ then just get min(X) and max(X) from index.
+ */
+ THD *thd= lpt->thd;
+ TABLE *table_to= lpt->table_list->table;
+ TABLE *table_from= lpt->table_list->next_local->table;
+
+ DBUG_ASSERT(thd->mdl_context.is_lock_owner(MDL_key::TABLE,
+ table_to->s->db.str,
+ table_to->s->table_name.str,
+ MDL_EXCLUSIVE));
+
+ DBUG_ASSERT(thd->mdl_context.is_lock_owner(MDL_key::TABLE,
+ table_from->s->db.str,
+ table_from->s->table_name.str,
+ MDL_EXCLUSIVE));
+
+ uint32 new_part_id;
+ partition_element *part_elem;
+ const char* partition_name= thd->lex->part_info->curr_part_elem->partition_name;
+ part_elem= table_to->part_info->get_part_elem(partition_name,
+ nullptr, 0, &new_part_id);
+ if (unlikely(!part_elem))
+ return true;
+
+ if (unlikely(new_part_id == NOT_A_PARTITION_ID))
+ {
+ DBUG_ASSERT(table_to->part_info->is_sub_partitioned());
+ my_error(ER_PARTITION_INSTEAD_OF_SUBPARTITION, MYF(0));
+ return true;
+ }
+
+ if (verify_data_with_partition(table_from, table_to, new_part_id))
+ {
+ return true;
+ }
+
+ return false;
+}
+
/**
Actually perform the change requested by ALTER TABLE of partitions
@@ -7098,11 +7376,23 @@ bool log_partition_alter_to_ddl_log(ALTER_PARTITION_PARAM_TYPE *lpt)
uint fast_alter_partition_table(THD *thd, TABLE *table,
Alter_info *alter_info,
+ Alter_table_ctx *alter_ctx,
HA_CREATE_INFO *create_info,
- TABLE_LIST *table_list,
- const LEX_CSTRING *db,
- const LEX_CSTRING *table_name)
+ TABLE_LIST *table_list)
{
+ /*
+ TODO: Partitioning atomic DDL refactoring.
+
+ DDL log chain state is stored in partition_info:
+
+ struct st_ddl_log_memory_entry *first_log_entry;
+ struct st_ddl_log_memory_entry *exec_log_entry;
+ struct st_ddl_log_memory_entry *frm_log_entry;
+
+ Make it stored and used in DDL_LOG_STATE like it was done in MDEV-17567.
+ This requires mysql_write_frm() refactoring (see comment there).
+ */
+
/* Set-up struct used to write frm files */
partition_info *part_info;
ALTER_PARTITION_PARAM_TYPE lpt_obj;
@@ -7120,13 +7410,14 @@ uint fast_alter_partition_table(THD *thd, TABLE *table,
lpt->table_list= table_list;
lpt->part_info= part_info;
lpt->alter_info= alter_info;
+ lpt->alter_ctx= alter_ctx;
lpt->create_info= create_info;
lpt->db_options= create_info->table_options_with_row_type();
lpt->table= table;
lpt->key_info_buffer= 0;
lpt->key_count= 0;
- lpt->db= *db;
- lpt->table_name= *table_name;
+ lpt->db= alter_ctx->db;
+ lpt->table_name= alter_ctx->table_name;
lpt->org_tabledef_version= table->s->tabledef_version;
lpt->copied= 0;
lpt->deleted= 0;
@@ -7246,49 +7537,138 @@ uint fast_alter_partition_table(THD *thd, TABLE *table,
to test if recovery is properly done.
*/
if (write_log_drop_shadow_frm(lpt) ||
- ERROR_INJECT_CRASH("crash_drop_partition_1") ||
- ERROR_INJECT_ERROR("fail_drop_partition_1") ||
+ ERROR_INJECT("drop_partition_1") ||
mysql_write_frm(lpt, WFRM_WRITE_SHADOW) ||
- ERROR_INJECT_CRASH("crash_drop_partition_2") ||
- ERROR_INJECT_ERROR("fail_drop_partition_2") ||
+ ERROR_INJECT("drop_partition_2") ||
wait_while_table_is_used(thd, table, HA_EXTRA_NOT_USED) ||
- ERROR_INJECT_CRASH("crash_drop_partition_3") ||
- ERROR_INJECT_ERROR("fail_drop_partition_3") ||
+ ERROR_INJECT("drop_partition_3") ||
write_log_drop_partition(lpt) ||
(action_completed= TRUE, FALSE) ||
- ERROR_INJECT_CRASH("crash_drop_partition_4") ||
- ERROR_INJECT_ERROR("fail_drop_partition_4") ||
+ ERROR_INJECT("drop_partition_4") ||
alter_close_table(lpt) ||
- ERROR_INJECT_CRASH("crash_drop_partition_5") ||
- ERROR_INJECT_ERROR("fail_drop_partition_5") ||
- ERROR_INJECT_CRASH("crash_drop_partition_6") ||
- ERROR_INJECT_ERROR("fail_drop_partition_6") ||
+ ERROR_INJECT("drop_partition_5") ||
+ ERROR_INJECT("drop_partition_6") ||
(frm_install= TRUE, FALSE) ||
mysql_write_frm(lpt, WFRM_INSTALL_SHADOW) ||
log_partition_alter_to_ddl_log(lpt) ||
(frm_install= FALSE, FALSE) ||
- ERROR_INJECT_CRASH("crash_drop_partition_7") ||
- ERROR_INJECT_ERROR("fail_drop_partition_7") ||
+ ERROR_INJECT("drop_partition_7") ||
mysql_drop_partitions(lpt) ||
- ERROR_INJECT_CRASH("crash_drop_partition_8") ||
- ERROR_INJECT_ERROR("fail_drop_partition_8") ||
+ ERROR_INJECT("drop_partition_8") ||
(write_log_completed(lpt, FALSE), FALSE) ||
((!thd->lex->no_write_to_binlog) &&
(write_bin_log(thd, FALSE,
thd->query(), thd->query_length()), FALSE)) ||
- ERROR_INJECT_CRASH("crash_drop_partition_9") ||
- ERROR_INJECT_ERROR("fail_drop_partition_9"))
+ ERROR_INJECT("drop_partition_9"))
{
- handle_alter_part_error(lpt, action_completed, TRUE, frm_install);
+ handle_alter_part_error(lpt, action_completed, TRUE, frm_install, true);
goto err;
}
if (alter_partition_lock_handling(lpt))
goto err;
}
+ else if (alter_info->partition_flags & ALTER_PARTITION_CONVERT_OUT)
+ {
+ DDL_LOG_STATE chain_drop_backup;
+ bzero(&chain_drop_backup, sizeof(chain_drop_backup));
+
+ if (mysql_write_frm(lpt, WFRM_WRITE_CONVERTED_TO) ||
+ ERROR_INJECT("convert_partition_1") ||
+ write_log_drop_shadow_frm(lpt) ||
+ ERROR_INJECT("convert_partition_2") ||
+ mysql_write_frm(lpt, WFRM_WRITE_SHADOW) ||
+ ERROR_INJECT("convert_partition_3") ||
+ wait_while_table_is_used(thd, table, HA_EXTRA_NOT_USED) ||
+ ERROR_INJECT("convert_partition_4") ||
+ write_log_convert_partition(lpt) ||
+ ERROR_INJECT("convert_partition_5") ||
+ alter_close_table(lpt) ||
+ ERROR_INJECT("convert_partition_6") ||
+ alter_partition_convert_out(lpt) ||
+ ERROR_INJECT("convert_partition_7") ||
+ write_log_drop_frm(lpt, &chain_drop_backup) ||
+ mysql_write_frm(lpt, WFRM_INSTALL_SHADOW|WFRM_BACKUP_ORIGINAL) ||
+ log_partition_alter_to_ddl_log(lpt) ||
+ ERROR_INJECT("convert_partition_8") ||
+ ((!thd->lex->no_write_to_binlog) &&
+ ((thd->binlog_xid= thd->query_id),
+ ddl_log_update_xid(lpt->part_info, thd->binlog_xid),
+ write_bin_log(thd, false, thd->query(), thd->query_length()),
+ (thd->binlog_xid= 0))) ||
+ ERROR_INJECT("convert_partition_9"))
+ {
+ DDL_LOG_STATE main_state= *lpt->part_info;
+ handle_alter_part_error(lpt, true, true, false, false);
+ ddl_log_complete(&chain_drop_backup);
+ (void) ddl_log_revert(thd, &main_state);
+ if (thd->locked_tables_mode)
+ thd->locked_tables_list.reopen_tables(thd, false);
+ goto err;
+ }
+ ddl_log_complete(lpt->part_info);
+ ERROR_INJECT("convert_partition_10");
+ (void) ddl_log_revert(thd, &chain_drop_backup);
+ if (alter_partition_lock_handling(lpt) ||
+ ERROR_INJECT("convert_partition_11"))
+ goto err;
+ }
+ else if ((alter_info->partition_flags & ALTER_PARTITION_CONVERT_IN))
+ {
+ DDL_LOG_STATE chain_drop_backup;
+ bzero(&chain_drop_backup, sizeof(chain_drop_backup));
+ TABLE *table_from= table_list->next_local->table;
+
+ if (wait_while_table_is_used(thd, table, HA_EXTRA_NOT_USED) ||
+ wait_while_table_is_used(thd, table_from, HA_EXTRA_PREPARE_FOR_RENAME) ||
+ ERROR_INJECT("convert_partition_1") ||
+ compare_table_with_partition(thd, table_from, table, NULL, 0) ||
+ ERROR_INJECT("convert_partition_2") ||
+ check_table_data(lpt))
+ goto err;
+
+ if (write_log_drop_shadow_frm(lpt) ||
+ ERROR_INJECT("convert_partition_3") ||
+ mysql_write_frm(lpt, WFRM_WRITE_SHADOW) ||
+ ERROR_INJECT("convert_partition_4") ||
+ alter_close_table(lpt) ||
+ ERROR_INJECT("convert_partition_5") ||
+ write_log_convert_partition(lpt) ||
+ ERROR_INJECT("convert_partition_6") ||
+ alter_partition_convert_in(lpt) ||
+ ERROR_INJECT("convert_partition_7") ||
+ (frm_install= true, false) ||
+ write_log_drop_frm(lpt, &chain_drop_backup) ||
+ mysql_write_frm(lpt, WFRM_INSTALL_SHADOW|WFRM_BACKUP_ORIGINAL) ||
+ log_partition_alter_to_ddl_log(lpt) ||
+ (frm_install= false, false) ||
+ ERROR_INJECT("convert_partition_8") ||
+ ((!thd->lex->no_write_to_binlog) &&
+ ((thd->binlog_xid= thd->query_id),
+ ddl_log_update_xid(lpt->part_info, thd->binlog_xid),
+ write_bin_log(thd, false, thd->query(), thd->query_length()),
+ (thd->binlog_xid= 0))) ||
+ ERROR_INJECT("convert_partition_9"))
+ {
+ DDL_LOG_STATE main_state= *lpt->part_info;
+ handle_alter_part_error(lpt, true, true, false, false);
+ ddl_log_complete(&chain_drop_backup);
+ (void) ddl_log_revert(thd, &main_state);
+ if (thd->locked_tables_mode)
+ thd->locked_tables_list.reopen_tables(thd, false);
+ goto err;
+ }
+ ddl_log_complete(lpt->part_info);
+ ERROR_INJECT("convert_partition_10");
+ (void) ddl_log_revert(thd, &chain_drop_backup);
+ if (alter_partition_lock_handling(lpt) ||
+ ERROR_INJECT("convert_partition_11"))
+ goto err;
+ }
else if ((alter_info->partition_flags & ALTER_PARTITION_ADD) &&
(part_info->part_type == RANGE_PARTITION ||
part_info->part_type == LIST_PARTITION))
{
+ DBUG_ASSERT(!(alter_info->partition_flags & ALTER_PARTITION_CONVERT_IN));
/*
ADD RANGE/LIST PARTITIONS
In this case there are no tuples removed and no tuples are added.
@@ -7320,43 +7700,33 @@ uint fast_alter_partition_table(THD *thd, TABLE *table,
12)Complete query
*/
if (write_log_drop_shadow_frm(lpt) ||
- ERROR_INJECT_CRASH("crash_add_partition_1") ||
- ERROR_INJECT_ERROR("fail_add_partition_1") ||
+ ERROR_INJECT("add_partition_1") ||
mysql_write_frm(lpt, WFRM_WRITE_SHADOW) ||
- ERROR_INJECT_CRASH("crash_add_partition_2") ||
- ERROR_INJECT_ERROR("fail_add_partition_2") ||
+ ERROR_INJECT("add_partition_2") ||
wait_while_table_is_used(thd, table, HA_EXTRA_NOT_USED) ||
- ERROR_INJECT_CRASH("crash_add_partition_3") ||
- ERROR_INJECT_ERROR("fail_add_partition_3") ||
+ ERROR_INJECT("add_partition_3") ||
write_log_add_change_partition(lpt) ||
- ERROR_INJECT_CRASH("crash_add_partition_4") ||
- ERROR_INJECT_ERROR("fail_add_partition_4") ||
+ ERROR_INJECT("add_partition_4") ||
mysql_change_partitions(lpt) ||
- ERROR_INJECT_CRASH("crash_add_partition_5") ||
- ERROR_INJECT_ERROR("fail_add_partition_5") ||
+ ERROR_INJECT("add_partition_5") ||
alter_close_table(lpt) ||
- ERROR_INJECT_CRASH("crash_add_partition_6") ||
- ERROR_INJECT_ERROR("fail_add_partition_6") ||
- ERROR_INJECT_CRASH("crash_add_partition_7") ||
- ERROR_INJECT_ERROR("fail_add_partition_7") ||
+ ERROR_INJECT("add_partition_6") ||
+ ERROR_INJECT("add_partition_7") ||
write_log_rename_frm(lpt) ||
(action_completed= TRUE, FALSE) ||
- ERROR_INJECT_CRASH("crash_add_partition_8") ||
- ERROR_INJECT_ERROR("fail_add_partition_8") ||
+ ERROR_INJECT("add_partition_8") ||
(frm_install= TRUE, FALSE) ||
mysql_write_frm(lpt, WFRM_INSTALL_SHADOW) ||
log_partition_alter_to_ddl_log(lpt) ||
(frm_install= FALSE, FALSE) ||
- ERROR_INJECT_CRASH("crash_add_partition_9") ||
- ERROR_INJECT_ERROR("fail_add_partition_9") ||
+ ERROR_INJECT("add_partition_9") ||
(write_log_completed(lpt, FALSE), FALSE) ||
((!thd->lex->no_write_to_binlog) &&
(write_bin_log(thd, FALSE,
thd->query(), thd->query_length()), FALSE)) ||
- ERROR_INJECT_CRASH("crash_add_partition_10") ||
- ERROR_INJECT_ERROR("fail_add_partition_10"))
+ ERROR_INJECT("add_partition_10"))
{
- handle_alter_part_error(lpt, action_completed, FALSE, frm_install);
+ handle_alter_part_error(lpt, action_completed, FALSE, frm_install, true);
goto err;
}
if (alter_partition_lock_handling(lpt))
@@ -7419,49 +7789,37 @@ uint fast_alter_partition_table(THD *thd, TABLE *table,
13) Complete query.
*/
if (write_log_drop_shadow_frm(lpt) ||
- ERROR_INJECT_CRASH("crash_change_partition_1") ||
- ERROR_INJECT_ERROR("fail_change_partition_1") ||
+ ERROR_INJECT("change_partition_1") ||
mysql_write_frm(lpt, WFRM_WRITE_SHADOW) ||
- ERROR_INJECT_CRASH("crash_change_partition_2") ||
- ERROR_INJECT_ERROR("fail_change_partition_2") ||
+ ERROR_INJECT("change_partition_2") ||
write_log_add_change_partition(lpt) ||
- ERROR_INJECT_CRASH("crash_change_partition_3") ||
- ERROR_INJECT_ERROR("fail_change_partition_3") ||
+ ERROR_INJECT("change_partition_3") ||
mysql_change_partitions(lpt) ||
- ERROR_INJECT_CRASH("crash_change_partition_4") ||
- ERROR_INJECT_ERROR("fail_change_partition_4") ||
+ ERROR_INJECT("change_partition_4") ||
wait_while_table_is_used(thd, table, HA_EXTRA_NOT_USED) ||
- ERROR_INJECT_CRASH("crash_change_partition_5") ||
- ERROR_INJECT_ERROR("fail_change_partition_5") ||
+ ERROR_INJECT("change_partition_5") ||
alter_close_table(lpt) ||
- ERROR_INJECT_CRASH("crash_change_partition_6") ||
- ERROR_INJECT_ERROR("fail_change_partition_6") ||
+ ERROR_INJECT("change_partition_6") ||
write_log_final_change_partition(lpt) ||
(action_completed= TRUE, FALSE) ||
- ERROR_INJECT_CRASH("crash_change_partition_7") ||
- ERROR_INJECT_ERROR("fail_change_partition_7") ||
- ERROR_INJECT_CRASH("crash_change_partition_8") ||
- ERROR_INJECT_ERROR("fail_change_partition_8") ||
+ ERROR_INJECT("change_partition_7") ||
+ ERROR_INJECT("change_partition_8") ||
((frm_install= TRUE), FALSE) ||
mysql_write_frm(lpt, WFRM_INSTALL_SHADOW) ||
log_partition_alter_to_ddl_log(lpt) ||
(frm_install= FALSE, FALSE) ||
- ERROR_INJECT_CRASH("crash_change_partition_9") ||
- ERROR_INJECT_ERROR("fail_change_partition_9") ||
+ ERROR_INJECT("change_partition_9") ||
mysql_drop_partitions(lpt) ||
- ERROR_INJECT_CRASH("crash_change_partition_10") ||
- ERROR_INJECT_ERROR("fail_change_partition_10") ||
+ ERROR_INJECT("change_partition_10") ||
mysql_rename_partitions(lpt) ||
- ERROR_INJECT_CRASH("crash_change_partition_11") ||
- ERROR_INJECT_ERROR("fail_change_partition_11") ||
+ ERROR_INJECT("change_partition_11") ||
(write_log_completed(lpt, FALSE), FALSE) ||
((!thd->lex->no_write_to_binlog) &&
(write_bin_log(thd, FALSE,
thd->query(), thd->query_length()), FALSE)) ||
- ERROR_INJECT_CRASH("crash_change_partition_12") ||
- ERROR_INJECT_ERROR("fail_change_partition_12"))
+ ERROR_INJECT("change_partition_12"))
{
- handle_alter_part_error(lpt, action_completed, FALSE, frm_install);
+ handle_alter_part_error(lpt, action_completed, FALSE, frm_install, true);
goto err;
}
if (alter_partition_lock_handling(lpt))
diff --git a/sql/sql_partition.h b/sql/sql_partition.h
index 57e6d0600ed..a90eaae0bae 100644
--- a/sql/sql_partition.h
+++ b/sql/sql_partition.h
@@ -55,6 +55,7 @@ typedef struct st_lock_param_type
THD *thd;
HA_CREATE_INFO *create_info;
Alter_info *alter_info;
+ Alter_table_ctx *alter_ctx;
TABLE *table;
KEY *key_info_buffer;
LEX_CSTRING db;
@@ -64,6 +65,7 @@ typedef struct st_lock_param_type
uint key_count;
uint db_options;
size_t pack_frm_len;
+ // TODO: remove duplicate data: part_info can be accessed via table->part_info
partition_info *part_info;
} ALTER_PARTITION_PARAM_TYPE;
@@ -255,10 +257,9 @@ typedef int (*get_partitions_in_range_iter)(partition_info *part_info,
#ifdef WITH_PARTITION_STORAGE_ENGINE
uint fast_alter_partition_table(THD *thd, TABLE *table,
Alter_info *alter_info,
+ Alter_table_ctx *alter_ctx,
HA_CREATE_INFO *create_info,
- TABLE_LIST *table_list,
- const LEX_CSTRING *db,
- const LEX_CSTRING *table_name);
+ TABLE_LIST *table_list);
bool set_part_state(Alter_info *alter_info, partition_info *tab_part_info,
enum partition_state part_state);
uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
@@ -278,7 +279,16 @@ bool verify_data_with_partition(TABLE *table, TABLE *part_table,
uint32 part_id);
bool compare_partition_options(HA_CREATE_INFO *table_create_info,
partition_element *part_elem);
+bool compare_table_with_partition(THD *thd, TABLE *table,
+ TABLE *part_table,
+ partition_element *part_elem,
+ uint part_id);
bool partition_key_modified(TABLE *table, const MY_BITMAP *fields);
+bool write_log_replace_frm(ALTER_PARTITION_PARAM_TYPE *lpt,
+ uint next_entry,
+ const char *from_path,
+ const char *to_path);
+
#else
#define partition_key_modified(X,Y) 0
#endif
diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc
index 6ca96300b7a..fcc08b69af4 100644
--- a/sql/sql_partition_admin.cc
+++ b/sql/sql_partition_admin.cc
@@ -193,10 +193,8 @@ static bool check_exchange_partition(TABLE *table, TABLE *part_table)
@param part_table Partitioned table.
@param part_elem Partition element to use for partition specific compare.
*/
-static bool compare_table_with_partition(THD *thd, TABLE *table,
- TABLE *part_table,
- partition_element *part_elem,
- uint part_id)
+bool compare_table_with_partition(THD *thd, TABLE *table, TABLE *part_table,
+ partition_element *part_elem, uint part_id)
{
HA_CREATE_INFO table_create_info, part_create_info;
Alter_info part_alter_info;
@@ -298,7 +296,7 @@ static bool compare_table_with_partition(THD *thd, TABLE *table,
The workaround is to use REORGANIZE PARTITION to rewrite
the frm file and then use EXCHANGE PARTITION when they are the same.
*/
- if (compare_partition_options(&table_create_info, part_elem))
+ if (part_elem && compare_partition_options(&table_create_info, part_elem))
DBUG_RETURN(TRUE);
DBUG_RETURN(FALSE);
@@ -1002,4 +1000,53 @@ bool Sql_cmd_alter_table_truncate_partition::execute(THD *thd)
DBUG_RETURN(error);
}
+
+/**
+ Move a table specified in the CONVERT TABLE <table_name> TO PARTITION ...
+ to the new partition.
+
+ @param lpt A structure containing parameters regarding to the statement
+ ALTER TABLE ... TO PARTITION ...
+ @param part_file_name a file name of the partition being added
+
+ @return false on success, true on error
+*/
+
+bool alter_partition_convert_in(ALTER_PARTITION_PARAM_TYPE *lpt)
+{
+ char part_file_name[2*FN_REFLEN+1];
+ THD *thd= lpt->thd;
+ const char *path= lpt->table_list->table->s->path.str;
+ TABLE_LIST *table_from= lpt->table_list->next_local;
+
+ const char *partition_name=
+ thd->lex->part_info->curr_part_elem->partition_name;
+
+ if (create_partition_name(part_file_name, sizeof(part_file_name), path,
+ partition_name, NORMAL_PART_NAME, false))
+ return true;
+
+ char from_file_name[FN_REFLEN+1];
+
+ build_table_filename(from_file_name, sizeof(from_file_name),
+ table_from->db.str, table_from->table_name.str, "", 0);
+
+ handler *file= get_new_handler(nullptr, thd->mem_root,
+ table_from->table->file->ht);
+ if (unlikely(!file))
+ return true;
+
+ close_all_tables_for_name(thd, table_from->table->s,
+ HA_EXTRA_PREPARE_FOR_RENAME, nullptr);
+
+ bool res= file->ha_rename_table(from_file_name, part_file_name);
+
+ if (res)
+ my_error(ER_ERROR_ON_RENAME, MYF(0), from_file_name,
+ part_file_name, my_errno);
+
+ delete file;
+ return res;
+}
+
#endif /* WITH_PARTITION_STORAGE_ENGINE */
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index 7bd9c7c10d1..5a077a934ac 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -459,7 +459,7 @@ static int item_val_real(struct st_mysql_value *value, double *buf)
static struct st_plugin_dl *plugin_dl_find(const LEX_CSTRING *dl)
{
- uint i;
+ size_t i;
struct st_plugin_dl *tmp;
DBUG_ENTER("plugin_dl_find");
for (i= 0; i < plugin_dl_array.elements; i++)
@@ -476,7 +476,7 @@ static struct st_plugin_dl *plugin_dl_find(const LEX_CSTRING *dl)
static st_plugin_dl *plugin_dl_insert_or_reuse(struct st_plugin_dl *plugin_dl)
{
- uint i;
+ size_t i;
struct st_plugin_dl *tmp;
DBUG_ENTER("plugin_dl_insert_or_reuse");
for (i= 0; i < plugin_dl_array.elements; i++)
@@ -1071,6 +1071,8 @@ plugin_ref plugin_lock_by_name(THD *thd, const LEX_CSTRING *name, int type)
plugin_ref rc= NULL;
st_plugin_int *plugin;
DBUG_ENTER("plugin_lock_by_name");
+ if (!name->length)
+ DBUG_RETURN(NULL);
mysql_mutex_lock(&LOCK_plugin);
if ((plugin= plugin_find_internal(name, type)))
rc= intern_plugin_lock(lex, plugin_int_to_ref(plugin));
@@ -1081,7 +1083,7 @@ plugin_ref plugin_lock_by_name(THD *thd, const LEX_CSTRING *name, int type)
static st_plugin_int *plugin_insert_or_reuse(struct st_plugin_int *plugin)
{
- uint i;
+ size_t i;
struct st_plugin_int *tmp;
DBUG_ENTER("plugin_insert_or_reuse");
for (i= 0; i < plugin_array.elements; i++)
@@ -1264,24 +1266,18 @@ static void plugin_deinitialize(struct st_plugin_int *plugin, bool ref_check)
remove_status_vars(show_vars);
}
- if (plugin_type_deinitialize[plugin->plugin->type])
- {
- if ((*plugin_type_deinitialize[plugin->plugin->type])(plugin))
- {
- sql_print_error("Plugin '%s' of type %s failed deinitialization",
- plugin->name.str, plugin_type_names[plugin->plugin->type].str);
- }
- }
- else if (plugin->plugin->deinit)
+ plugin_type_init deinit= plugin_type_deinitialize[plugin->plugin->type];
+ if (!deinit)
+ deinit= (plugin_type_init)(plugin->plugin->deinit);
+
+ if (deinit && deinit(plugin))
{
- DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str));
- if (plugin->plugin->deinit(plugin))
- {
- DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
- plugin->name.str));
- }
+ if (THD *thd= current_thd)
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN,
+ WARN_PLUGIN_BUSY, ER_THD(thd, WARN_PLUGIN_BUSY));
}
- plugin->state= PLUGIN_IS_UNINITIALIZED;
+ else
+ plugin->state= PLUGIN_IS_UNINITIALIZED; // free to unload
if (ref_check && plugin->ref_count)
sql_print_error("Plugin '%s' has ref_count=%d after deinitialization.",
@@ -1289,10 +1285,13 @@ static void plugin_deinitialize(struct st_plugin_int *plugin, bool ref_check)
plugin_variables_deinit(plugin);
}
-static void plugin_del(struct st_plugin_int *plugin)
+static void plugin_del(struct st_plugin_int *plugin, uint del_mask)
{
DBUG_ENTER("plugin_del");
mysql_mutex_assert_owner(&LOCK_plugin);
+ del_mask|= PLUGIN_IS_UNINITIALIZED | PLUGIN_IS_DISABLED; // always use these
+ if (!(plugin->state & del_mask))
+ DBUG_VOID_RETURN;
/* Free allocated strings before deleting the plugin. */
plugin_vars_free_values(plugin->plugin->system_vars);
restore_ptr_backup(plugin->nbackups, plugin->ptr_backup);
@@ -1310,7 +1309,7 @@ static void plugin_del(struct st_plugin_int *plugin)
static void reap_plugins(void)
{
- uint count;
+ size_t count;
struct st_plugin_int *plugin, **reap, **list;
mysql_mutex_assert_owner(&LOCK_plugin);
@@ -1342,19 +1341,19 @@ static void reap_plugins(void)
list= reap;
while ((plugin= *(--list)))
- plugin_deinitialize(plugin, true);
+ plugin_deinitialize(plugin, true);
mysql_mutex_lock(&LOCK_plugin);
while ((plugin= *(--reap)))
- plugin_del(plugin);
+ plugin_del(plugin, 0);
my_afree(reap);
}
static void intern_plugin_unlock(LEX *lex, plugin_ref plugin)
{
- int i;
+ ssize_t i;
st_plugin_int *pi;
DBUG_ENTER("intern_plugin_unlock");
@@ -1420,7 +1419,7 @@ void plugin_unlock(THD *thd, plugin_ref plugin)
}
-void plugin_unlock_list(THD *thd, plugin_ref *list, uint count)
+void plugin_unlock_list(THD *thd, plugin_ref *list, size_t count)
{
LEX *lex= thd ? thd->lex : 0;
DBUG_ENTER("plugin_unlock_list");
@@ -1593,7 +1592,7 @@ static void init_plugin_psi_keys(void) {}
*/
int plugin_init(int *argc, char **argv, int flags)
{
- uint i;
+ size_t i;
struct st_maria_plugin **builtins;
struct st_maria_plugin *plugin;
struct st_plugin_int tmp, *plugin_ptr, **reap;
@@ -1785,7 +1784,7 @@ int plugin_init(int *argc, char **argv, int flags)
reaped_mandatory_plugin= TRUE;
plugin_deinitialize(plugin_ptr, true);
mysql_mutex_lock(&LOCK_plugin);
- plugin_del(plugin_ptr);
+ plugin_del(plugin_ptr, 0);
}
mysql_mutex_unlock(&LOCK_plugin);
@@ -2024,7 +2023,7 @@ error:
void plugin_shutdown(void)
{
- uint i, count= plugin_array.elements;
+ size_t i, count= plugin_array.elements;
struct st_plugin_int **plugins, *plugin;
struct st_plugin_dl **dl;
DBUG_ENTER("plugin_shutdown");
@@ -2073,12 +2072,14 @@ void plugin_shutdown(void)
plugins= (struct st_plugin_int **) my_alloca(sizeof(void*) * (count+1));
/*
- If we have any plugins which did not die cleanly, we force shutdown
+ If we have any plugins which did not die cleanly, we force shutdown.
+ Don't re-deinit() plugins that failed deinit() earlier (already dying)
*/
for (i= 0; i < count; i++)
{
plugins[i]= *dynamic_element(&plugin_array, i, struct st_plugin_int **);
- /* change the state to ensure no reaping races */
+ if (plugins[i]->state == PLUGIN_IS_DYING)
+ plugins[i]->state= PLUGIN_IS_UNINITIALIZED;
if (plugins[i]->state == PLUGIN_IS_DELETED)
plugins[i]->state= PLUGIN_IS_DYING;
}
@@ -2114,9 +2115,7 @@ void plugin_shutdown(void)
if (plugins[i]->ref_count)
sql_print_error("Plugin '%s' has ref_count=%d after shutdown.",
plugins[i]->name.str, plugins[i]->ref_count);
- if (plugins[i]->state & PLUGIN_IS_UNINITIALIZED ||
- plugins[i]->state & PLUGIN_IS_DISABLED)
- plugin_del(plugins[i]);
+ plugin_del(plugins[i], PLUGIN_IS_DYING);
}
/*
@@ -2355,7 +2354,7 @@ static bool do_uninstall(THD *thd, TABLE *table, const LEX_CSTRING *name)
of the delete from the plugin table, so that it is not replicated in
row based mode.
*/
- table->file->row_logging= 0; // No logging
+ table->file->row_logging= 0; // No logging
error= table->file->ha_delete_row(table->record[0]);
if (unlikely(error))
{
@@ -2468,7 +2467,7 @@ wsrep_error_label:
bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func,
int type, uint state_mask, void *arg)
{
- uint idx, total= 0;
+ size_t idx, total= 0;
struct st_plugin_int *plugin;
plugin_ref *plugins;
my_bool res= FALSE;
@@ -3319,7 +3318,7 @@ static void cleanup_variables(struct system_variables *vars)
void plugin_thdvar_cleanup(THD *thd)
{
- uint idx;
+ size_t idx;
plugin_ref *list;
DBUG_ENTER("plugin_thdvar_cleanup");
@@ -4315,7 +4314,7 @@ void add_plugin_options(DYNAMIC_ARRAY *options, MEM_ROOT *mem_root)
if (!initialized)
return;
- for (uint idx= 0; idx < plugin_array.elements; idx++)
+ for (size_t idx= 0; idx < plugin_array.elements; idx++)
{
p= *dynamic_element(&plugin_array, idx, struct st_plugin_int **);
@@ -4422,7 +4421,7 @@ int thd_setspecific(MYSQL_THD thd, MYSQL_THD_KEY_T key, void *value)
DBUG_ASSERT(key != INVALID_THD_KEY);
if (key == INVALID_THD_KEY || (!thd && !(thd= current_thd)))
return EINVAL;
-
+
memcpy(intern_sys_var_ptr(thd, key, true), &value, sizeof(void*));
return 0;
}
diff --git a/sql/sql_plugin.h b/sql/sql_plugin.h
index eaf0b40f34a..d4df8c6468f 100644
--- a/sql/sql_plugin.h
+++ b/sql/sql_plugin.h
@@ -172,7 +172,7 @@ extern plugin_ref plugin_lock(THD *thd, plugin_ref ptr);
extern plugin_ref plugin_lock_by_name(THD *thd, const LEX_CSTRING *name,
int type);
extern void plugin_unlock(THD *thd, plugin_ref plugin);
-extern void plugin_unlock_list(THD *thd, plugin_ref *list, uint count);
+extern void plugin_unlock_list(THD *thd, plugin_ref *list, size_t count);
extern bool mysql_install_plugin(THD *thd, const LEX_CSTRING *name,
const LEX_CSTRING *dl);
extern bool mysql_uninstall_plugin(THD *thd, const LEX_CSTRING *name,
diff --git a/sql/sql_plugin_services.inl b/sql/sql_plugin_services.inl
index 86b2fb69b22..3a66e982e7b 100644
--- a/sql/sql_plugin_services.inl
+++ b/sql/sql_plugin_services.inl
@@ -218,7 +218,7 @@ static struct my_print_error_service_st my_print_error_handler=
my_printv_error
};
-struct json_service_st json_handler=
+static struct json_service_st json_handler=
{
json_type,
json_get_array_item,
@@ -233,6 +233,97 @@ static struct thd_mdl_service_st thd_mdl_handler=
thd_mdl_context
};
+struct sql_service_st sql_service_handler=
+{
+ mysql_init,
+ mysql_real_connect_local,
+ mysql_real_connect,
+ mysql_errno,
+ mysql_error,
+ mysql_real_query,
+ mysql_affected_rows,
+ mysql_num_rows,
+ mysql_store_result,
+ mysql_free_result,
+ mysql_fetch_row,
+ mysql_close,
+ mysql_options,
+ mysql_fetch_lengths,
+ mysql_set_character_set,
+ mysql_num_fields,
+ mysql_select_db
+};
+
+#define DEFINE_warning_function(name, ret) { \
+ static query_id_t last_query_id= -1; \
+ THD *thd= current_thd; \
+ if((thd ? thd->query_id : 0) != last_query_id) \
+ { \
+ my_error(ER_PROVIDER_NOT_LOADED, MYF(ME_ERROR_LOG|ME_WARNING), name); \
+ last_query_id= thd ? thd->query_id : 0; \
+ } \
+ return ret; \
+}
+
+#include <providers/lzma.h>
+static struct provider_service_lzma_st provider_handler_lzma=
+{
+ DEFINE_lzma_stream_buffer_decode([]) DEFINE_warning_function("LZMA compression", LZMA_PROG_ERROR),
+ DEFINE_lzma_easy_buffer_encode([]) DEFINE_warning_function("LZMA compression", LZMA_PROG_ERROR),
+
+ false // .is_loaded
+};
+struct provider_service_lzma_st *provider_service_lzma= &provider_handler_lzma;
+
+#include <providers/lzo/lzo1x.h>
+static struct provider_service_lzo_st provider_handler_lzo=
+{
+ DEFINE_lzo1x_1_15_compress([]) DEFINE_warning_function("LZO compression", LZO_E_INTERNAL_ERROR),
+ DEFINE_lzo1x_decompress_safe([]) DEFINE_warning_function("LZO compression", LZO_E_INTERNAL_ERROR),
+
+ false // .is_loaded
+};
+struct provider_service_lzo_st *provider_service_lzo= &provider_handler_lzo;
+
+#include <providers/bzlib.h>
+static struct provider_service_bzip2_st provider_handler_bzip2=
+{
+ DEFINE_BZ2_bzBuffToBuffCompress([]) DEFINE_warning_function("BZip2 compression", -1),
+ DEFINE_BZ2_bzBuffToBuffDecompress([]) DEFINE_warning_function("BZip2 compression", -1),
+ DEFINE_BZ2_bzCompress([]) DEFINE_warning_function("BZip2 compression", -1),
+ DEFINE_BZ2_bzCompressEnd([]) DEFINE_warning_function("BZip2 compression", -1),
+ DEFINE_BZ2_bzCompressInit([]) DEFINE_warning_function("BZip2 compression", -1),
+ DEFINE_BZ2_bzDecompress([]) DEFINE_warning_function("BZip2 compression", -1),
+ DEFINE_BZ2_bzDecompressEnd([]) DEFINE_warning_function("BZip2 compression", -1),
+ DEFINE_BZ2_bzDecompressInit([]) DEFINE_warning_function("BZip2 compression", -1),
+
+ false // .is_loaded
+};
+struct provider_service_bzip2_st *provider_service_bzip2= &provider_handler_bzip2;
+
+#include <providers/snappy-c.h>
+static struct provider_service_snappy_st provider_handler_snappy=
+{
+ DEFINE_snappy_max_compressed_length([]) -> size_t DEFINE_warning_function("Snappy compression", 0),
+ DEFINE_snappy_compress([]) DEFINE_warning_function("Snappy compression", SNAPPY_INVALID_INPUT),
+ DEFINE_snappy_uncompressed_length([]) DEFINE_warning_function("Snappy compression", SNAPPY_INVALID_INPUT),
+ DEFINE_snappy_uncompress([]) DEFINE_warning_function("Snappy compression", SNAPPY_INVALID_INPUT),
+
+ false // .is_loaded
+};
+struct provider_service_snappy_st *provider_service_snappy= &provider_handler_snappy;
+
+#include <providers/lz4.h>
+static struct provider_service_lz4_st provider_handler_lz4=
+{
+ DEFINE_LZ4_compressBound([]) DEFINE_warning_function("LZ4 compression", 0),
+ DEFINE_LZ4_compress_default([]) DEFINE_warning_function("LZ4 compression", 0),
+ DEFINE_LZ4_decompress_safe([]) DEFINE_warning_function("LZ4 compression", -1),
+
+ false // .is_loaded
+};
+struct provider_service_lz4_st *provider_service_lz4= &provider_handler_lz4;
+
static struct st_service_ref list_of_services[]=
{
{ "base64_service", VERSION_base64, &base64_handler },
@@ -257,5 +348,11 @@ static struct st_service_ref list_of_services[]=
{ "thd_wait_service", VERSION_thd_wait, &thd_wait_handler },
{ "wsrep_service", VERSION_wsrep, &wsrep_handler },
{ "json_service", VERSION_json, &json_handler },
- { "thd_mdl_service", VERSION_thd_mdl, &thd_mdl_handler }
+ { "thd_mdl_service", VERSION_thd_mdl, &thd_mdl_handler },
+ { "sql_service", VERSION_sql_service, &sql_service_handler },
+ { "provider_service_bzip2", VERSION_provider_bzip2, &provider_handler_bzip2 },
+ { "provider_service_lz4", VERSION_provider_lz4, &provider_handler_lz4 },
+ { "provider_service_lzma", VERSION_provider_lzma, &provider_handler_lzma },
+ { "provider_service_lzo", VERSION_provider_lzo, &provider_handler_lzo },
+ { "provider_service_snappy", VERSION_provider_snappy, &provider_handler_snappy }
};
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index ace6ad8478d..4ff5a679ffd 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -133,6 +133,7 @@ static const uint PARAMETER_FLAG_UNSIGNED= 128U << 8;
#include "wsrep_trans_observer.h"
#endif /* WITH_WSREP */
#include "xa.h" // xa_recover_get_fields
+#include "sql_audit.h" // mysql_audit_release
/**
A result class used to send cursor rows using the binary protocol.
@@ -1287,7 +1288,8 @@ static bool mysql_test_insert_common(Prepared_statement *stmt,
List<List_item> &values_list,
List<Item> &update_fields,
List<Item> &update_values,
- enum_duplicates duplic)
+ enum_duplicates duplic,
+ bool ignore)
{
THD *thd= stmt->thd;
List_iterator_fast<List_item> its(values_list);
@@ -1314,7 +1316,6 @@ static bool mysql_test_insert_common(Prepared_statement *stmt,
if ((values= its++))
{
uint value_count;
- ulong counter= 0;
Item *unused_conds= 0;
if (table_list->table)
@@ -1324,7 +1325,8 @@ static bool mysql_test_insert_common(Prepared_statement *stmt,
}
if (mysql_prepare_insert(thd, table_list, fields, values, update_fields,
- update_values, duplic, &unused_conds, FALSE))
+ update_values, duplic, ignore,
+ &unused_conds, FALSE))
goto error;
value_count= values->elements;
@@ -1340,16 +1342,18 @@ static bool mysql_test_insert_common(Prepared_statement *stmt,
}
while ((values= its++))
{
- counter++;
if (values->elements != value_count)
{
- my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
+ my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0),
+ thd->get_stmt_da()->current_row_for_warning());
goto error;
}
if (setup_fields(thd, Ref_ptr_array(),
*values, COLUMNS_READ, 0, NULL, 0))
goto error;
+ thd->get_stmt_da()->inc_current_row_for_warning();
}
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
}
DBUG_RETURN(FALSE);
@@ -1377,7 +1381,7 @@ static bool mysql_test_insert(Prepared_statement *stmt,
List<List_item> &values_list,
List<Item> &update_fields,
List<Item> &update_values,
- enum_duplicates duplic)
+ enum_duplicates duplic, bool ignore)
{
THD *thd= stmt->thd;
@@ -1393,7 +1397,7 @@ static bool mysql_test_insert(Prepared_statement *stmt,
}
return mysql_test_insert_common(stmt, table_list, fields, values_list,
- update_fields, update_values, duplic);
+ update_fields, update_values, duplic, ignore);
}
@@ -2471,14 +2475,14 @@ static bool check_prepared_statement(Prepared_statement *stmt)
res= mysql_test_insert(stmt, tables, lex->field_list,
lex->many_values,
lex->update_list, lex->value_list,
- lex->duplicates);
+ lex->duplicates, lex->ignore);
break;
case SQLCOM_LOAD:
res= mysql_test_insert_common(stmt, tables, lex->field_list,
lex->many_values,
lex->update_list, lex->value_list,
- lex->duplicates);
+ lex->duplicates, lex->ignore);
break;
case SQLCOM_UPDATE:
@@ -4050,19 +4054,22 @@ Execute_sql_statement(LEX_STRING sql_text)
executions without having to cleanup/reset THD in between.
*/
-bool
-Execute_sql_statement::execute_server_code(THD *thd)
+static bool execute_server_code(THD *thd,
+ const char *sql_text, size_t sql_len)
{
PSI_statement_locker *parent_locker;
bool error;
+ query_id_t save_query_id= thd->query_id;
+ query_id_t next_id= next_query_id();
- if (alloc_query(thd, m_sql_text.str, m_sql_text.length))
+ if (alloc_query(thd, sql_text, sql_len))
return TRUE;
Parser_state parser_state;
if (parser_state.init(thd, thd->query(), thd->query_length()))
return TRUE;
+ thd->query_id= next_id;
parser_state.m_lip.multi_statements= FALSE;
lex_start(thd);
@@ -4080,17 +4087,23 @@ Execute_sql_statement::execute_server_code(THD *thd)
/* report error issued during command execution */
if (likely(error == 0) && thd->spcont == NULL)
- general_log_write(thd, COM_STMT_EXECUTE,
+ general_log_write(thd, COM_QUERY,
thd->query(), thd->query_length());
end:
thd->lex->restore_set_statement_var();
+ thd->query_id= save_query_id;
delete_explain_query(thd->lex);
lex_end(thd->lex);
return error;
}
+bool Execute_sql_statement::execute_server_code(THD *thd)
+{
+ return ::execute_server_code(thd, m_sql_text.str, m_sql_text.length);
+}
+
/***************************************************************************
Prepared_statement
****************************************************************************/
@@ -4860,7 +4873,9 @@ Prepared_statement::execute_server_runnable(Server_runnable *server_runnable)
Statement stmt_backup;
bool error;
Query_arena *save_stmt_arena= thd->stmt_arena;
+ Reprepare_observer *save_reprepare_observer= thd->m_reprepare_observer;
Item_change_list save_change_list;
+
thd->Item_change_list::move_elements_to(&save_change_list);
state= STMT_CONVENTIONAL_EXECUTION;
@@ -4870,12 +4885,15 @@ Prepared_statement::execute_server_runnable(Server_runnable *server_runnable)
thd->set_n_backup_statement(this, &stmt_backup);
thd->set_n_backup_active_arena(this, &stmt_backup);
+
thd->stmt_arena= this;
+ thd->m_reprepare_observer= 0;
error= server_runnable->execute_server_code(thd);
thd->cleanup_after_query();
+ thd->m_reprepare_observer= save_reprepare_observer;
thd->restore_active_arena(this, &stmt_backup);
thd->restore_backup_statement(this, &stmt_backup);
thd->stmt_arena= save_stmt_arena;
@@ -5593,14 +5611,6 @@ Ed_connection::store_result_set()
return ed_result_set;
}
-/*
- MENT-56
- Protocol_local and service_sql for plugins to enable 'local' SQL query execution.
-*/
-
-#ifndef EMBEDDED_LIBRARY
-// This part is mostly copied from libmysqld/lib_sql.cc
-// TODO: get rid of code duplications
#include <mysql.h>
#include "../libmysqld/embedded_priv.h"
@@ -5616,12 +5626,30 @@ public:
char **next_field;
MYSQL_FIELD *next_mysql_field;
MEM_ROOT *alloc;
+ THD *new_thd;
+ Security_context empty_ctx;
+ ulonglong client_capabilities;
+
+ my_bool do_log_bin;
- Protocol_local(THD *thd_arg, ulong prealloc= 0) :
+ Protocol_local(THD *thd_arg, THD *new_thd_arg, ulong prealloc) :
Protocol_text(thd_arg, prealloc),
- cur_data(0), first_data(0), data_tail(&first_data), alloc(0)
- {}
+ cur_data(0), first_data(0), data_tail(&first_data), alloc(0),
+ new_thd(new_thd_arg), do_log_bin(FALSE)
+ {}
+ void set_binlog_vars(my_bool *sav_log_bin)
+ {
+ *sav_log_bin= thd->variables.sql_log_bin;
+ thd->variables.sql_log_bin= do_log_bin;
+ thd->set_binlog_bit();
+ }
+ void restore_binlog_vars(my_bool sav_log_bin)
+ {
+ do_log_bin= thd->variables.sql_log_bin;
+ thd->variables.sql_log_bin= sav_log_bin;
+ thd->set_binlog_bit();
+ }
protected:
bool net_store_data(const uchar *from, size_t length);
bool net_store_data_cs(const uchar *from, size_t length,
@@ -5692,6 +5720,20 @@ MYSQL_DATA *Protocol_local::alloc_new_dataset()
}
+void Protocol_local::clear_data_list()
+{
+ while (first_data)
+ {
+ MYSQL_DATA *data= first_data;
+ first_data= data->embedded_info->next;
+ free_rows(data);
+ }
+ data_tail= &first_data;
+ free_rows(cur_data);
+ cur_data= 0;
+}
+
+
static char *dup_str_aux(MEM_ROOT *root, const char *from, uint length,
CHARSET_INFO *fromcs, CHARSET_INFO *tocs)
{
@@ -5985,7 +6027,6 @@ bool Protocol_local::send_result_set_metadata(List<Item> *list, uint flags)
{
List_iterator_fast<Item> it(*list);
Item *item;
-// Protocol_local prot(thd);
DBUG_ENTER("send_result_set_metadata");
// if (!thd->mysql) // bootstrap file handling
@@ -5996,7 +6037,7 @@ bool Protocol_local::send_result_set_metadata(List<Item> *list, uint flags)
for (uint pos= 0 ; (item= it++); pos++)
{
- if (/*prot.*/store_item_metadata(thd, item, pos))
+ if (store_item_metadata(thd, item, pos))
goto err;
}
@@ -6010,6 +6051,7 @@ bool Protocol_local::send_result_set_metadata(List<Item> *list, uint flags)
DBUG_RETURN(1); /* purecov: inspected */
}
+
static void
list_fields_send_default(THD *thd, Protocol_local *p, Field *fld, uint pos)
{
@@ -6097,19 +6139,6 @@ bool Protocol_local::store_null()
#include <sql_common.h>
#include <errmsg.h>
-struct local_results
-{
- struct st_mysql_data *cur_data;
- struct st_mysql_data *first_data;
- struct st_mysql_data **data_tail;
- void clear_data_list();
- struct st_mysql_data *alloc_new_dataset();
- char **next_field;
- MYSQL_FIELD *next_mysql_field;
- MEM_ROOT *alloc;
-};
-
-
static void embedded_get_error(MYSQL *mysql, MYSQL_DATA *data)
{
NET *net= &mysql->net;
@@ -6124,11 +6153,11 @@ static void embedded_get_error(MYSQL *mysql, MYSQL_DATA *data)
static my_bool loc_read_query_result(MYSQL *mysql)
{
- local_results *thd= (local_results *) mysql->thd;
+ Protocol_local *p= (Protocol_local *) mysql->thd;
- MYSQL_DATA *res= thd->first_data;
- DBUG_ASSERT(!thd->cur_data);
- thd->first_data= res->embedded_info->next;
+ MYSQL_DATA *res= p->first_data;
+ DBUG_ASSERT(!p->cur_data);
+ p->first_data= res->embedded_info->next;
if (res->embedded_info->last_errno &&
!res->embedded_info->fields_list)
{
@@ -6156,7 +6185,7 @@ static my_bool loc_read_query_result(MYSQL *mysql)
if (res->embedded_info->fields_list)
{
mysql->status=MYSQL_STATUS_GET_RESULT;
- thd->cur_data= res;
+ p->cur_data= res;
}
else
my_free(res);
@@ -6165,174 +6194,273 @@ static my_bool loc_read_query_result(MYSQL *mysql)
}
-static MYSQL_METHODS local_methods=
+static my_bool
+loc_advanced_command(MYSQL *mysql, enum enum_server_command command,
+ const uchar *header, ulong header_length,
+ const uchar *arg, ulong arg_length, my_bool skip_check,
+ MYSQL_STMT *stmt)
{
- loc_read_query_result, /* read_query_result */
- NULL/*loc_advanced_command*/, /* advanced_command */
- NULL/*loc_read_rows*/, /* read_rows */
- NULL/*loc_use_result*/, /* use_result */
- NULL/*loc_fetch_lengths*/, /* fetch_lengths */
- NULL/*loc_flush_use_result*/, /* flush_use_result */
- NULL/*loc_read_change_user_result*/ /* read_change_user_result */
-};
+ my_bool result= 1;
+ Protocol_local *p= (Protocol_local *) mysql->thd;
+ NET *net= &mysql->net;
+ if (p->thd && p->thd->killed != NOT_KILLED)
+ {
+ if (p->thd->killed < KILL_CONNECTION)
+ p->thd->killed= NOT_KILLED;
+ else
+ return 1;
+ }
-extern "C" MYSQL *mysql_real_connect_local(MYSQL *mysql,
- const char *host, const char *user, const char *passwd, const char *db)
-{
- //char name_buff[USERNAME_LENGTH];
+ p->clear_data_list();
+ /* Check that we are calling the client functions in right order */
+ if (mysql->status != MYSQL_STATUS_READY)
+ {
+ set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
+ goto end;
+ }
- DBUG_ENTER("mysql_real_connect_local");
+ /* Clear result variables */
+ p->thd->clear_error(1);
+ mysql->affected_rows= ~(my_ulonglong) 0;
+ mysql->field_count= 0;
+ net_clear_error(net);
- /* Test whether we're already connected */
- if (mysql->server_version)
+ /*
+ We have to call free_old_query before we start to fill mysql->fields
+ for new query. In the case of embedded server we collect field data
+ during query execution (not during data retrieval as it is in remote
+ client). So we have to call free_old_query here
+ */
+ free_old_query(mysql);
+
+ if (header)
{
- set_mysql_error(mysql, CR_ALREADY_CONNECTED, unknown_sqlstate);
- DBUG_RETURN(0);
+ arg= header;
+ arg_length= header_length;
}
- if (!host || !host[0])
- host= mysql->options.host;
+ if (p->new_thd)
+ {
+ THD *thd_orig= current_thd;
+ set_current_thd(p->thd);
+ p->thd->thread_stack= (char*) &result;
+ p->thd->set_time();
+ result= execute_server_code(p->thd, (const char *)arg, arg_length);
+ p->thd->cleanup_after_query();
+ mysql_audit_release(p->thd);
+ p->end_statement();
+ set_current_thd(thd_orig);
+ }
+ else
+ {
+ Ed_connection con(p->thd);
+ Security_context *ctx_orig= p->thd->security_ctx;
+ ulonglong cap_orig= p->thd->client_capabilities;
+ MYSQL_LEX_STRING sql_text;
+ my_bool log_bin_orig;
+ p->set_binlog_vars(&log_bin_orig);
+
+ DBUG_ASSERT(current_thd == p->thd);
+ sql_text.str= (char *) arg;
+ sql_text.length= arg_length;
+ p->thd->security_ctx= &p->empty_ctx;
+ p->thd->client_capabilities= p->client_capabilities;
+ result= con.execute_direct(p, sql_text);
+ p->thd->client_capabilities= cap_orig;
+ p->thd->security_ctx= ctx_orig;
+ p->restore_binlog_vars(log_bin_orig);
+ }
+ if (skip_check)
+ result= 0;
+ p->cur_data= 0;
- mysql->methods= &local_methods;
+end:
+ return result;
+}
- if (!db || !db[0])
- db=mysql->options.db;
- if (!user || !user[0])
- user=mysql->options.user;
+/*
+ reads dataset from the next query result
- mysql->user= my_strdup(PSI_INSTRUMENT_ME, user, MYF(0));
+ SYNOPSIS
+ loc_read_rows()
+ mysql connection handle
+ other parameters are not used
+ NOTES
+ It just gets next MYSQL_DATA from the result's queue
- mysql->info_buffer= (char *) my_malloc(PSI_INSTRUMENT_ME,
- MYSQL_ERRMSG_SIZE, MYF(0));
- //mysql->thd= create_embedded_thd(client_flag);
+ RETURN
+ pointer to MYSQL_DATA with the coming recordset
+*/
- //init_embedded_mysql(mysql, client_flag);
+static MYSQL_DATA *
+loc_read_rows(MYSQL *mysql, MYSQL_FIELD *mysql_fields __attribute__((unused)),
+ unsigned int fields __attribute__((unused)))
+{
+ MYSQL_DATA *result= ((Protocol_local *)mysql->thd)->cur_data;
+ ((Protocol_local *)mysql->thd)->cur_data= 0;
+ if (result->embedded_info->last_errno)
+ {
+ embedded_get_error(mysql, result);
+ return NULL;
+ }
+ *result->embedded_info->prev_ptr= NULL;
+ return result;
+}
- //if (mysql_init_character_set(mysql))
- // goto error;
- //if (check_embedded_connection(mysql, db))
- // goto error;
+/**************************************************************************
+ Get column lengths of the current row
+ If one uses mysql_use_result, res->lengths contains the length information,
+ else the lengths are calculated from the offset between pointers.
+**************************************************************************/
- mysql->server_status= SERVER_STATUS_AUTOCOMMIT;
+static void loc_fetch_lengths(ulong *to, MYSQL_ROW column,
+ unsigned int field_count)
+{
+ MYSQL_ROW end;
- //if (mysql->options.init_commands)
- //{
- // DYNAMIC_ARRAY *init_commands= mysql->options.init_commands;
- // char **ptr= (char**)init_commands->buffer;
- // char **end= ptr + init_commands->elements;
-//
- // for (; ptr<end; ptr++)
- // {
- // MYSQL_RES *res;
- // if (mysql_query(mysql,*ptr))
- // goto error;
- // if (mysql->fields)
- // {
- // if (!(res= (*mysql->methods->use_result)(mysql)))
- // goto error;
- // mysql_free_result(res);
- // }
- // }
- //}
+ for (end=column + field_count; column != end ; column++,to++)
+ *to= *column ? *(uint *)((*column) - sizeof(uint)) : 0;
+}
- DBUG_PRINT("exit",("Mysql handler: %p", mysql));
- DBUG_RETURN(mysql);
-//error:
- DBUG_PRINT("error",("message: %u (%s)",
- mysql->net.last_errno,
- mysql->net.last_error));
+static void loc_flush_use_result(MYSQL *mysql, my_bool)
+{
+ Protocol_local *p= (Protocol_local *) mysql->thd;
+ if (p->cur_data)
{
- /* Free alloced memory */
- my_bool free_me=mysql->free_me;
- free_old_query(mysql);
- mysql->free_me=0;
- mysql_close(mysql);
- mysql->free_me=free_me;
+ free_rows(p->cur_data);
+ p->cur_data= 0;
+ }
+ else if (p->first_data)
+ {
+ MYSQL_DATA *data= p->first_data;
+ p->first_data= data->embedded_info->next;
+ free_rows(data);
}
- DBUG_RETURN(0);
}
-extern "C" int execute_sql_command(const char *command,
- char *hosts, char *names, char *filters)
+static void loc_on_close_free(MYSQL *mysql)
{
- MYSQL_LEX_STRING sql_text;
- THD *thd= current_thd;
- THD *new_thd= 0;
- int result;
- my_bool qc_save= 0;
- Reprepare_observer *save_reprepare_observer= nullptr;
+ Protocol_local *p= (Protocol_local *) mysql->thd;
+ THD *thd= p->new_thd;
+ delete p;
+ if (thd)
+ {
+ delete thd;
+ local_connection_thread_count--;
+ }
+ my_free(mysql->info_buffer);
+ mysql->info_buffer= 0;
+}
- if (!thd)
+static MYSQL_RES *loc_use_result(MYSQL *mysql)
+{
+ return mysql_store_result(mysql);
+}
+
+static MYSQL_METHODS local_methods=
+{
+ loc_read_query_result, /* read_query_result */
+ loc_advanced_command, /* advanced_command */
+ loc_read_rows, /* read_rows */
+ loc_use_result, /* use_result */
+ loc_fetch_lengths, /* fetch_lengths */
+ loc_flush_use_result, /* flush_use_result */
+ NULL, /* read_change_user_result */
+ loc_on_close_free /* on_close_free */
+#ifdef EMBEDDED_LIBRARY
+ ,NULL, /* list_fields */
+ NULL, /* read_prepare_result */
+ NULL, /* stmt_execute */
+ NULL, /* read_binary_rows */
+ NULL, /* unbuffered_fetch */
+ NULL, /* read_statistics */
+ NULL, /* next_result */
+ NULL /* read_rows_from_cursor */
+#endif
+};
+
+
+Atomic_counter<uint32_t> local_connection_thread_count;
+
+extern "C" MYSQL *mysql_real_connect_local(MYSQL *mysql)
+{
+ THD *thd_orig= current_thd;
+ THD *new_thd;
+ Protocol_local *p;
+ ulonglong client_flag;
+ DBUG_ENTER("mysql_real_connect_local");
+
+ /* Test whether we're already connected */
+ if (mysql->server_version)
{
+ set_mysql_error(mysql, CR_ALREADY_CONNECTED, unknown_sqlstate);
+ DBUG_RETURN(0);
+ }
+
+ mysql->methods= &local_methods;
+ mysql->user= NULL;
+ client_flag= mysql->options.client_flag;
+ client_flag|= CLIENT_MULTI_RESULTS;;
+ client_flag&= ~(CLIENT_COMPRESS | CLIENT_PLUGIN_AUTH);
+
+ mysql->info_buffer= (char *) my_malloc(PSI_INSTRUMENT_ME,
+ MYSQL_ERRMSG_SIZE, MYF(0));
+ if (!thd_orig || thd_orig->lock)
+ {
+ /*
+ When we start with the empty current_thd (that happens when plugins
+ are loaded during the server start) or when some tables are locked
+ with the current_thd already (that happens when INSTALL PLUGIN
+ calls the plugin_init or with queries), we create the new THD for
+ the local connection. So queries with this MYSQL will be run with
+ it rather than the current THD.
+ */
+
new_thd= new THD(0);
- new_thd->thread_stack= (char*) &sql_text;
+ local_connection_thread_count++;
+ new_thd->thread_stack= (char*) &thd_orig;
new_thd->store_globals();
new_thd->security_ctx->skip_grants();
new_thd->query_cache_is_applicable= 0;
new_thd->variables.wsrep_on= 0;
+ new_thd->variables.sql_log_bin= 0;
+ new_thd->set_binlog_bit();
+ new_thd->client_capabilities= client_flag;
+
+ /*
+ TOSO: decide if we should turn the auditing off
+ for such threads.
+ We can do it like this:
+ new_thd->audit_class_mask[0]= ~0;
+ */
bzero((char*) &new_thd->net, sizeof(new_thd->net));
- thd= new_thd;
+ set_current_thd(thd_orig);
+ thd_orig= new_thd;
}
else
- {
- if (thd->lock)
- /* Doesn't work if the thread opened/locked tables already. */
- return 2;
-
- qc_save= thd->query_cache_is_applicable;
- thd->query_cache_is_applicable= 0;
- save_reprepare_observer= thd->m_reprepare_observer;
- thd->m_reprepare_observer= nullptr;
- }
- sql_text.str= (char *) command;
- sql_text.length= strlen(command);
- {
- Protocol_local p(thd);
- Ed_connection con(thd);
- result= con.execute_direct(&p, sql_text);
- if (!result && p.first_data)
- {
- int nr= (int) p.first_data->rows;
- MYSQL_ROWS *rows= p.first_data->data;
-
- while (nr--)
- {
- strcpy(hosts, rows->data[0]);
- hosts+= strlen(hosts) + 1;
- strcpy(names, rows->data[1]);
- names+= strlen(names) + 1;
- if (filters)
- {
- strcpy(filters, rows->data[2]);
- filters+= strlen(filters) + 1;
- }
- rows= rows->next;
- }
- }
- if (p.first_data)
- {
- if (p.alloc)
- free_root(p.alloc, MYF(0));
- my_free(p.first_data);
- }
- }
+ new_thd= NULL;
+ p= new Protocol_local(thd_orig, new_thd, 0);
if (new_thd)
- delete new_thd;
+ new_thd->protocol= p;
else
{
- thd->query_cache_is_applicable= qc_save;
- thd->m_reprepare_observer= save_reprepare_observer;
+ p->empty_ctx.init();
+ p->empty_ctx.skip_grants();
+ p->client_capabilities= client_flag;
}
- *hosts= 0;
- return result;
+ mysql->thd= p;
+ mysql->server_status= SERVER_STATUS_AUTOCOMMIT;
+
+
+ DBUG_PRINT("exit",("Mysql handler: %p", mysql));
+ DBUG_RETURN(mysql);
}
-#endif /*!EMBEDDED_LIBRARY*/
diff --git a/sql/sql_prepare.h b/sql/sql_prepare.h
index 1ea773a7ca8..ff6e986ec87 100644
--- a/sql/sql_prepare.h
+++ b/sql/sql_prepare.h
@@ -353,4 +353,6 @@ private:
size_t m_column_count; /* TODO: change to point to metadata */
};
+extern Atomic_counter<uint32_t> local_connection_thread_count;
+
#endif // SQL_PREPARE_H
diff --git a/sql/sql_priv.h b/sql/sql_priv.h
index a304cd39df7..852cced5728 100644
--- a/sql/sql_priv.h
+++ b/sql/sql_priv.h
@@ -334,6 +334,8 @@
#define UNCACHEABLE_DEPENDENT (UNCACHEABLE_DEPENDENT_GENERATED | \
UNCACHEABLE_DEPENDENT_INJECTED)
+#define FAKE_SELECT_LEX_ID UINT_MAX
+
/* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */
#define UNDEF_POS (-1)
@@ -417,16 +419,6 @@ inline int hexchar_to_int(char c)
/* This must match the path length limit in the ER_NOT_RW_DIR error msg. */
#define ER_NOT_RW_DIR_PATHSIZE 200
-#define IS_TABLESPACES_TABLESPACE_NAME 0
-#define IS_TABLESPACES_ENGINE 1
-#define IS_TABLESPACES_TABLESPACE_TYPE 2
-#define IS_TABLESPACES_LOGFILE_GROUP_NAME 3
-#define IS_TABLESPACES_EXTENT_SIZE 4
-#define IS_TABLESPACES_AUTOEXTEND_SIZE 5
-#define IS_TABLESPACES_MAXIMUM_SIZE 6
-#define IS_TABLESPACES_NODEGROUP_ID 7
-#define IS_TABLESPACES_TABLESPACE_COMMENT 8
-
bool db_name_is_in_ignore_db_dirs_list(const char *dbase);
#endif /* MYSQL_SERVER */
diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc
index 3448e157e10..8f0f15a982a 100644
--- a/sql/sql_reload.cc
+++ b/sql/sql_reload.cc
@@ -406,7 +406,7 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options,
/* If not default connection and 'all' is used */
mi->release();
mysql_mutex_lock(&LOCK_active_mi);
- if (master_info_index->remove_master_info(mi))
+ if (master_info_index->remove_master_info(mi, 0))
result= 1;
mysql_mutex_unlock(&LOCK_active_mi);
}
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 14766302298..448fcd30a47 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -240,9 +240,7 @@ static bool test_if_cheaper_ordering(const JOIN_TAB *tab,
ha_rows *new_select_limit,
uint *new_used_key_parts= NULL,
uint *saved_best_key_parts= NULL);
-static int test_if_order_by_key(JOIN *join,
- ORDER *order, TABLE *table, uint idx,
- uint *used_key_parts);
+static int test_if_order_by_key(JOIN *, ORDER *, TABLE *, uint, uint *);
static bool test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,
ha_rows select_limit, bool no_changes,
const key_map *map);
@@ -2612,7 +2610,7 @@ int JOIN::optimize_stage2()
if (!conds && outer_join)
{
/* Handle the case where we have an OUTER JOIN without a WHERE */
- conds= (Item*) &Item_true;
+ conds= (Item*) Item_true;
}
if (impossible_where)
@@ -2782,9 +2780,7 @@ int JOIN::optimize_stage2()
if (conds && const_table_map != found_const_table_map &&
(select_options & SELECT_DESCRIBE))
- {
- conds= (Item*) &Item_false;
- }
+ conds= (Item*) Item_false;
/* Cache constant expressions in WHERE, HAVING, ON clauses. */
cache_const_exprs();
@@ -3096,7 +3092,7 @@ int JOIN::optimize_stage2()
having= having->remove_eq_conds(thd, &select_lex->having_value, true);
if (select_lex->having_value == Item::COND_FALSE)
{
- having= (Item*) &Item_false;
+ having= (Item*) Item_false;
zero_result_cause= "Impossible HAVING noticed after reading const tables";
error= 0;
select_lex->mark_const_derived(zero_result_cause);
@@ -5044,6 +5040,7 @@ mysql_select(THD *thd, TABLE_LIST *tables, List<Item> &fields, COND *conds,
}
}
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
/* Look for a table owned by an engine with the select_handler interface */
select_lex->pushdown_select= find_select_handler(thd, select_lex);
@@ -5706,7 +5703,7 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
if (join->cond_value == Item::COND_FALSE)
{
join->impossible_where= true;
- conds= (Item*) &Item_false;
+ conds= (Item*) Item_false;
}
join->cond_equal= NULL;
@@ -7191,7 +7188,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
/* set a barrier for the array of SARGABLE_PARAM */
(*sargables)[0].field= 0;
- if (my_init_dynamic_array2(thd->mem_root->m_psi_key, keyuse, sizeof(KEYUSE),
+ if (my_init_dynamic_array2(thd->mem_root->psi_key, keyuse, sizeof(KEYUSE),
thd->alloc(sizeof(KEYUSE) * 20), 20, 64,
MYF(MY_THREAD_SPECIFIC)))
DBUG_RETURN(TRUE);
@@ -7993,7 +7990,7 @@ best_access_path(JOIN *join,
/* quick_range couldn't use key! */
records= (double) s->records/rec;
trace_access_idx.add("used_range_estimates", false)
- .add("cause", "not available");
+ .add("reason", "not available");
}
}
else
@@ -8031,16 +8028,14 @@ best_access_path(JOIN *join,
}
else
{
+ trace_access_idx.add("used_range_estimates", false);
if (table->opt_range_keys.is_set(key))
{
- trace_access_idx.add("used_range_estimates",false)
- .add("cause",
- "not better than ref estimates");
+ trace_access_idx.add("reason", "not better than ref estimates");
}
else
{
- trace_access_idx.add("used_range_estimates", false)
- .add("cause", "not available");
+ trace_access_idx.add("reason", "not available");
}
}
}
@@ -8357,7 +8352,7 @@ best_access_path(JOIN *join,
trace_access_idx.add("chosen", false)
.add("cause", cause ? cause : "cost");
}
- cause= NULL;
+ cause= nullptr;
} /* for each key */
records= best_records;
}
@@ -8400,7 +8395,6 @@ best_access_path(JOIN *join,
(!(s->table->map & join->outer_join) ||
join->allowed_outer_join_with_cache)) // (2)
{
- Json_writer_object trace_access_hash(thd);
double join_sel= 0.1;
/* Estimate the cost of the hash join access to the table */
double rnd_records= matching_candidates_in_table(s, found_constraint,
@@ -8426,9 +8420,10 @@ best_access_path(JOIN *join,
best_uses_jbuf= TRUE;
best_filter= 0;
best_type= JT_HASH;
+ Json_writer_object trace_access_hash(thd);
trace_access_hash.add("type", "hash");
trace_access_hash.add("index", "hj-key");
- trace_access_hash.add("cost", rnd_records);
+ trace_access_hash.add("rnd_records", rnd_records);
trace_access_hash.add("cost", best);
trace_access_hash.add("chosen", true);
}
@@ -12246,7 +12241,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
below to check if we should use 'quick' instead.
*/
DBUG_PRINT("info", ("Item_int"));
- tmp= (Item*) &Item_true;
+ tmp= (Item*) Item_true;
}
}
@@ -12794,9 +12789,9 @@ static
bool generate_derived_keys(DYNAMIC_ARRAY *keyuse_array)
{
KEYUSE *keyuse= dynamic_element(keyuse_array, 0, KEYUSE*);
- uint elements= keyuse_array->elements;
+ size_t elements= keyuse_array->elements;
TABLE *prev_table= 0;
- for (uint i= 0; i < elements; i++, keyuse++)
+ for (size_t i= 0; i < elements; i++, keyuse++)
{
if (!keyuse->table)
break;
@@ -15867,7 +15862,7 @@ COND *Item_cond_and::build_equal_items(THD *thd,
if (!cond_args->elements &&
!cond_equal.current_level.elements &&
!eq_list.elements)
- return (Item*) &Item_true;
+ return (Item*) Item_true;
List_iterator_fast<Item_equal> it(cond_equal.current_level);
while ((item_equal= it++))
@@ -15974,7 +15969,7 @@ COND *Item_func_eq::build_equal_items(THD *thd,
Item_equal *item_equal;
int n= cond_equal.current_level.elements + eq_list.elements;
if (n == 0)
- return (Item*) &Item_true;
+ return (Item*) Item_true;
else if (n == 1)
{
if ((item_equal= cond_equal.current_level.pop()))
@@ -16378,7 +16373,7 @@ Item *eliminate_item_equal(THD *thd, COND *cond, COND_EQUAL *upper_levels,
List<Item> eq_list;
Item_func_eq *eq_item= 0;
if (((Item *) item_equal)->const_item() && !item_equal->val_int())
- return (Item*) &Item_false;
+ return (Item*) Item_false;
Item *item_const= item_equal->get_const();
Item_equal_fields_iterator it(*item_equal);
Item *head;
@@ -16523,7 +16518,7 @@ Item *eliminate_item_equal(THD *thd, COND *cond, COND_EQUAL *upper_levels,
switch (eq_list.elements)
{
case 0:
- res= cond ? cond : (Item*) &Item_true;
+ res= cond ? cond : (Item*) Item_true;
break;
case 1:
if (!cond || cond->is_bool_literal())
@@ -16776,9 +16771,9 @@ static void update_const_equal_items(THD *thd, COND *cond, JOIN_TAB *tab,
Item *item;
while ((item= li++))
update_const_equal_items(thd, item, tab,
- (((Item_cond*) cond)->top_level() &&
- ((Item_cond*) cond)->functype() ==
- Item_func::COND_AND_FUNC));
+ cond->is_top_level_item() &&
+ ((Item_cond*) cond)->functype() ==
+ Item_func::COND_AND_FUNC);
}
else if (cond->type() == Item::FUNC_ITEM &&
((Item_func*) cond)->functype() == Item_func::MULT_EQUAL_FUNC)
@@ -18361,7 +18356,7 @@ Item_func_isnull::remove_eq_conds(THD *thd, Item::cond_result *cond_value,
*/
- Item *item0= (Item*) &Item_false;
+ Item *item0= (Item*) Item_false;
Item *eq_cond= new(thd->mem_root) Item_func_eq(thd, args[0], item0);
if (!eq_cond)
return this;
@@ -18932,20 +18927,19 @@ setup_tmp_table_column_bitmaps(TABLE *table, uchar *bitmaps, uint field_count)
DBUG_ASSERT(table->s->virtual_fields == 0);
- my_bitmap_init(&table->def_read_set, (my_bitmap_map*) bitmaps, field_count,
- FALSE);
+ my_bitmap_init(&table->def_read_set, (my_bitmap_map*) bitmaps, field_count);
bitmaps+= bitmap_size;
my_bitmap_init(&table->tmp_set,
- (my_bitmap_map*) bitmaps, field_count, FALSE);
+ (my_bitmap_map*) bitmaps, field_count);
bitmaps+= bitmap_size;
my_bitmap_init(&table->eq_join_set,
- (my_bitmap_map*) bitmaps, field_count, FALSE);
+ (my_bitmap_map*) bitmaps, field_count);
bitmaps+= bitmap_size;
my_bitmap_init(&table->cond_set,
- (my_bitmap_map*) bitmaps, field_count, FALSE);
+ (my_bitmap_map*) bitmaps, field_count);
bitmaps+= bitmap_size;
my_bitmap_init(&table->has_value_set,
- (my_bitmap_map*) bitmaps, field_count, FALSE);
+ (my_bitmap_map*) bitmaps, field_count);
/* write_set and all_set are copies of read_set */
table->def_write_set= table->def_read_set;
table->s->all_set= table->def_read_set;
@@ -19068,7 +19062,7 @@ TABLE *Create_tmp_table::start(THD *thd,
(ulong) m_rows_limit, MY_TEST(m_group)));
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
- m_temp_pool_slot = bitmap_lock_set_next(&temp_pool);
+ m_temp_pool_slot = temp_pool_set_next();
if (m_temp_pool_slot != MY_BIT_NONE) // we got a slot
sprintf(path, "%s-%s-%lx-%i", tmp_file_prefix, param->tmp_name,
@@ -19979,7 +19973,7 @@ void Create_tmp_table::cleanup_on_failure(THD *thd, TABLE *table)
if (table)
free_tmp_table(thd, table);
if (m_temp_pool_slot != MY_BIT_NONE)
- bitmap_lock_clear_bit(&temp_pool, m_temp_pool_slot);
+ temp_pool_clear_bit(m_temp_pool_slot);
}
@@ -20746,7 +20740,7 @@ free_tmp_table(THD *thd, TABLE *entry)
(*ptr)->free();
if (entry->temp_pool_slot != MY_BIT_NONE)
- bitmap_lock_clear_bit(&temp_pool, entry->temp_pool_slot);
+ temp_pool_clear_bit(entry->temp_pool_slot);
plugin_unlock(0, entry->s->db_plugin);
entry->alias.free();
@@ -21430,7 +21424,7 @@ sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records)
if (join_tab->on_precond && !join_tab->on_precond->val_int())
rc= NESTED_LOOP_NO_MORE_ROWS;
}
- join->thd->get_stmt_da()->reset_current_row_for_warning();
+ join->thd->get_stmt_da()->reset_current_row_for_warning(1);
if (rc != NESTED_LOOP_NO_MORE_ROWS &&
(rc= join_tab_execution_startup(join_tab)) < 0)
@@ -28949,7 +28943,7 @@ JOIN::reoptimize(Item *added_where, table_map join_tables,
{
DYNAMIC_ARRAY added_keyuse;
SARGABLE_PARAM *sargables= 0; /* Used only as a dummy parameter. */
- uint org_keyuse_elements;
+ size_t org_keyuse_elements;
/* Re-run the REF optimizer to take into account the new conditions. */
if (update_ref_and_keys(thd, &added_keyuse, join_tab, table_count, added_where,
@@ -28971,7 +28965,7 @@ JOIN::reoptimize(Item *added_where, table_map join_tables,
reset_query_plan();
if (!keyuse.buffer &&
- my_init_dynamic_array(thd->mem_root->m_psi_key, &keyuse, sizeof(KEYUSE),
+ my_init_dynamic_array(thd->mem_root->psi_key, &keyuse, sizeof(KEYUSE),
20, 64, MYF(MY_THREAD_SPECIFIC)))
{
delete_dynamic(&added_keyuse);
@@ -29344,6 +29338,7 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table,
DBUG_ASSERT (ref_key != (int) nr);
possible_key.add("can_resolve_order", true);
+ possible_key.add("direction", direction);
bool is_covering= (table->covering_keys.is_set(nr) ||
(table->file->index_flags(nr, 0, 1) &
HA_CLUSTERED_INDEX));
@@ -29900,7 +29895,7 @@ AGGR_OP::end_send()
Reset the counter before copying rows from internal temporary table to
INSERT table.
*/
- join_tab->join->thd->get_stmt_da()->reset_current_row_for_warning();
+ join_tab->join->thd->get_stmt_da()->reset_current_row_for_warning(1);
while (rc == NESTED_LOOP_OK)
{
int error;
@@ -30117,7 +30112,7 @@ void JOIN::make_notnull_conds_for_range_scans()
Found a IS NULL conjunctive predicate for a null-rejected field
in the WHERE clause
*/
- conds= (Item*) &Item_false;
+ conds= (Item*) Item_false;
cond_equal= 0;
impossible_where= true;
DBUG_VOID_RETURN;
@@ -30140,7 +30135,7 @@ void JOIN::make_notnull_conds_for_range_scans()
Found a IS NULL conjunctive predicate for a null-rejected field
of the inner table of an outer join with ON expression tbl->on_expr
*/
- tbl->on_expr= (Item*) &Item_false;
+ tbl->on_expr= (Item*) Item_false;
}
}
}
@@ -30292,7 +30287,7 @@ void build_notnull_conds_for_inner_nest_of_outer_join(JOIN *join,
if (used_tables &&
build_notnull_conds_for_range_scans(join, nest_tbl->on_expr, used_tables))
{
- nest_tbl->on_expr= (Item*) &Item_false;
+ nest_tbl->on_expr= (Item*) Item_false;
}
li.rewind();
@@ -30306,7 +30301,7 @@ void build_notnull_conds_for_inner_nest_of_outer_join(JOIN *join,
}
else if (build_notnull_conds_for_range_scans(join, tbl->on_expr,
tbl->table->map))
- tbl->on_expr= (Item*) &Item_false;
+ tbl->on_expr= (Item*) Item_false;
}
}
}
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 4deda700070..ccc4438c39c 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
- Copyright (c) 2009, 2022, MariaDB
+ Copyright (c) 2009, 2023, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -231,6 +231,9 @@ static my_bool show_plugins(THD *thd, plugin_ref plugin,
case PLUGIN_IS_DISABLED:
table->field[2]->store(STRING_WITH_LEN("DISABLED"), cs);
break;
+ case PLUGIN_IS_DYING:
+ table->field[2]->store(STRING_WITH_LEN("INACTIVE"), cs);
+ break;
case PLUGIN_IS_FREED: // filtered in fill_plugins, used in fill_all_plugins
table->field[2]->store(STRING_WITH_LEN("NOT INSTALLED"), cs);
break;
@@ -324,7 +327,7 @@ int fill_plugins(THD *thd, TABLE_LIST *tables, COND *cond)
TABLE *table= tables->table;
if (plugin_foreach_with_mask(thd, show_plugins, MYSQL_ANY_PLUGIN,
- ~(PLUGIN_IS_FREED | PLUGIN_IS_DYING), table))
+ ~PLUGIN_IS_FREED, table))
DBUG_RETURN(1);
DBUG_RETURN(0);
@@ -354,7 +357,7 @@ int fill_all_plugins(THD *thd, TABLE_LIST *tables, COND *cond)
plugin_dl_foreach(thd, 0, show_plugins, table);
const char *wstr= lookup.db_value.str, *wend= wstr + lookup.db_value.length;
- for (uint i=0; i < (uint) dirp->number_of_files; i++)
+ for (size_t i=0; i < dirp->number_of_files; i++)
{
FILEINFO *file= dirp->dir_entry+i;
LEX_CSTRING dl= { file->name, strlen(file->name) };
@@ -952,7 +955,7 @@ find_files(THD *thd, Dynamic_array<LEX_CSTRING*> *files, LEX_CSTRING *db,
if (!db) /* Return databases */
{
- for (uint i=0; i < (uint) dirp->number_of_files; i++)
+ for (size_t i=0; i < dirp->number_of_files; i++)
{
FILEINFO *file= dirp->dir_entry+i;
#ifdef USE_SYMDIR
@@ -2360,6 +2363,9 @@ int show_create_table_ex(THD *thd, TABLE_LIST *table_list,
packet->append_parenthesized((long) key_part->length /
key_part->field->charset()->mbmaxlen);
}
+ if (table->file->index_flags(i, j, 0) & HA_READ_ORDER &&
+ key_part->key_part_flag & HA_REVERSE_SORT) /* same in SHOW KEYS */
+ packet->append(STRING_WITH_LEN(" DESC"));
}
if (key_info->without_overlaps)
@@ -2446,7 +2452,7 @@ int show_create_table_ex(THD *thd, TABLE_LIST *table_list,
add_table_options(thd, table, create_info_arg,
table_list->schema_table != 0, 0, packet);
- if (DBUG_EVALUATE_IF("sysvers_hide", 0, table->versioned()))
+ if (!DBUG_IF("sysvers_hide") && table->versioned())
packet->append(STRING_WITH_LEN(" WITH SYSTEM VERSIONING"));
#ifdef WITH_PARTITION_STORAGE_ENGINE
@@ -6754,7 +6760,7 @@ static int get_schema_stat_record(THD *thd, TABLE_LIST *tables,
for (uint i=0 ; i < show_table->s->keys ; i++,key_info++)
{
if ((key_info->flags & HA_INVISIBLE_KEY) &&
- DBUG_EVALUATE_IF("test_invisible_index", 0, 1))
+ !DBUG_IF("test_invisible_index"))
continue;
KEY_PART_INFO *key_part= key_info->key_part;
LEX_CSTRING *str;
@@ -6762,7 +6768,7 @@ static int get_schema_stat_record(THD *thd, TABLE_LIST *tables,
for (uint j=0 ; j < key_info->user_defined_key_parts ; j++,key_part++)
{
if (key_part->field->invisible >= INVISIBLE_SYSTEM &&
- DBUG_EVALUATE_IF("test_completely_invisible", 0, 1))
+ !DBUG_IF("test_completely_invisible"))
{
/*
NOTE: we will get SEQ_IN_INDEX gap inside the result if this key_part
@@ -7422,13 +7428,7 @@ static void store_schema_partitions_record(THD *thd, TABLE *schema_table,
table->field[23]->store(STRING_WITH_LEN("default"), cs);
table->field[24]->set_notnull();
- if (part_elem->tablespace_name)
- table->field[24]->store(part_elem->tablespace_name,
- strlen(part_elem->tablespace_name), cs);
- else
- {
- table->field[24]->set_null();
- }
+ table->field[24]->set_null(); // Tablespace
}
return;
}
@@ -8244,7 +8244,6 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list)
bool keep_row_order;
TMP_TABLE_PARAM *tmp_table_param;
SELECT_LEX *select_lex;
- my_bitmap_map *bitmaps;
DBUG_ENTER("create_schema_table");
for (; !fields->end_marker(); fields++)
@@ -8265,8 +8264,9 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list)
table_list->alias, !need_all_fields,
keep_row_order)))
DBUG_RETURN(0);
- bitmaps= (my_bitmap_map*) thd->alloc(bitmap_buffer_size(field_count));
- my_bitmap_init(&table->def_read_set, bitmaps, field_count, FALSE);
+ my_bitmap_map* bitmaps=
+ (my_bitmap_map*) thd->alloc(bitmap_buffer_size(field_count));
+ my_bitmap_init(&table->def_read_set, bitmaps, field_count);
table->read_set= &table->def_read_set;
bitmap_clear_all(table->read_set);
table_list->schema_table_param= tmp_table_param;
@@ -9859,23 +9859,17 @@ int initialize_schema_table(st_plugin_int *plugin)
int finalize_schema_table(st_plugin_int *plugin)
{
+ int deinit_status= 0;
ST_SCHEMA_TABLE *schema_table= (ST_SCHEMA_TABLE *)plugin->data;
DBUG_ENTER("finalize_schema_table");
if (schema_table)
{
if (plugin->plugin->deinit)
- {
- DBUG_PRINT("info", ("Deinitializing plugin: '%s'", plugin->name.str));
- if (plugin->plugin->deinit(NULL))
- {
- DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.",
- plugin->name.str));
- }
- }
+ deinit_status= plugin->plugin->deinit(NULL);
my_free(schema_table);
}
- DBUG_RETURN(0);
+ DBUG_RETURN(deinit_status);
}
diff --git a/sql/sql_signal.cc b/sql/sql_signal.cc
index 8e973f9b0b3..4e86cc4d782 100644
--- a/sql/sql_signal.cc
+++ b/sql/sql_signal.cc
@@ -44,6 +44,7 @@ const LEX_CSTRING Diag_condition_item_names[]=
{ STRING_WITH_LEN("CURSOR_NAME") },
{ STRING_WITH_LEN("MESSAGE_TEXT") },
{ STRING_WITH_LEN("MYSQL_ERRNO") },
+ { STRING_WITH_LEN("ROW_NUMBER") },
{ STRING_WITH_LEN("CONDITION_IDENTIFIER") },
{ STRING_WITH_LEN("CONDITION_NUMBER") },
@@ -309,6 +310,26 @@ int Sql_cmd_common_signal::eval_signal_informations(THD *thd, Sql_condition *con
cond->m_sql_errno= (int) code;
}
+ set= m_set_signal_information.m_item[DIAG_ROW_NUMBER];
+ if (set != NULL)
+ {
+ if (set->is_null())
+ {
+ thd->raise_error_printf(ER_WRONG_VALUE_FOR_VAR,
+ "ROW_NUMBER", "NULL");
+ goto end;
+ }
+ longlong row_number_value= set->val_int();
+ if (row_number_value < 0)
+ {
+ str= set->val_str(& str_value);
+ thd->raise_error_printf(ER_WRONG_VALUE_FOR_VAR,
+ "ROW_NUMBER", str->c_ptr_safe());
+ goto end;
+ }
+ cond->m_row_number= (ulong) row_number_value;
+ }
+
/*
The various item->val_xxx() methods don't return an error code,
but flag thd in case of failure.
@@ -419,7 +440,8 @@ bool Sql_cmd_resignal::execute(THD *thd)
DBUG_RETURN(result);
}
- Sql_condition signaled_err(thd->mem_root, *signaled, signaled->message);
+ Sql_condition signaled_err(thd->mem_root, *signaled, signaled->message,
+ signaled->m_row_number);
if (m_cond)
{
diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc
index be011adb60c..567dee84a3f 100644
--- a/sql/sql_statistics.cc
+++ b/sql/sql_statistics.cc
@@ -28,11 +28,15 @@
#include "sql_base.h"
#include "key.h"
#include "sql_statistics.h"
+#include "opt_histogram_json.h"
#include "opt_range.h"
#include "uniques.h"
#include "sql_show.h"
#include "sql_partition.h"
+#include <vector>
+#include <string>
+
/*
The system variable 'use_stat_tables' can take one of the
following values:
@@ -57,8 +61,11 @@
the collected statistics in the persistent statistical tables only
when the value of the variable 'use_stat_tables' is not
equal to "never".
-*/
-
+*/
+
+Histogram_base *create_histogram(MEM_ROOT *mem_root, Histogram_type hist_type,
+ THD *owner);
+
/* Currently there are only 3 persistent statistical tables */
static const uint STATISTICS_TABLES= 3;
@@ -178,12 +185,12 @@ TABLE_FIELD_TYPE column_stat_fields[COLUMN_STAT_N_FIELDS] =
},
{
{ STRING_WITH_LEN("hist_type") },
- { STRING_WITH_LEN("enum('SINGLE_PREC_HB','DOUBLE_PREC_HB')") },
+ { STRING_WITH_LEN("enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB')") },
{ STRING_WITH_LEN("utf8mb3") }
},
{
{ STRING_WITH_LEN("histogram") },
- { STRING_WITH_LEN("varbinary(255)") },
+ { STRING_WITH_LEN("longblob") },
{ NULL, 0 }
}
};
@@ -307,7 +314,7 @@ public:
inline void init(THD *thd, Field * table_field);
inline bool add();
- inline void finish(ha_rows rows, double sample_fraction);
+ inline bool finish(MEM_ROOT *mem_root, ha_rows rows, double sample_fraction);
inline void cleanup();
};
@@ -1064,15 +1071,23 @@ public:
stat_field->store(stats->get_avg_frequency());
break;
case COLUMN_STAT_HIST_SIZE:
- stat_field->store(stats->histogram.get_size());
+ // Note: this is dumb. the histogram size is stored with the
+ // histogram!
+ stat_field->store(stats->histogram?
+ stats->histogram->get_size() : 0);
break;
case COLUMN_STAT_HIST_TYPE:
- stat_field->store(stats->histogram.get_type() + 1);
+ if (stats->histogram)
+ stat_field->store(stats->histogram->get_type() + 1);
+ else
+ stat_field->set_null();
break;
case COLUMN_STAT_HISTOGRAM:
- stat_field->store((char *)stats->histogram.get_values(),
- stats->histogram.get_size(), &my_charset_bin);
- break;
+ if (stats->histogram)
+ stats->histogram->serialize(stat_field);
+ else
+ stat_field->set_null();
+ break;
}
}
}
@@ -1100,6 +1115,8 @@ public:
void get_stat_values()
{
table_field->read_stats->set_all_nulls();
+ // default: hist_type=NULL means there's no histogram
+ table_field->read_stats->histogram_type_on_disk= INVALID_HISTOGRAM;
if (table_field->read_stats->min_value)
table_field->read_stats->min_value->set_null();
@@ -1111,7 +1128,7 @@ public:
char buff[MAX_FIELD_WIDTH];
String val(buff, sizeof(buff), &my_charset_bin);
- for (uint i= COLUMN_STAT_MIN_VALUE; i <= COLUMN_STAT_HIST_TYPE; i++)
+ for (uint i= COLUMN_STAT_MIN_VALUE; i <= COLUMN_STAT_HISTOGRAM; i++)
{
Field *stat_field= stat_table->field[i];
@@ -1155,13 +1172,28 @@ public:
table_field->read_stats->set_avg_frequency(stat_field->val_real());
break;
case COLUMN_STAT_HIST_SIZE:
- table_field->read_stats->histogram.set_size(stat_field->val_int());
+ /*
+ Ignore the contents of mysql.column_stats.hist_size. We take the
+ size from the mysql.column_stats.histogram column, itself.
+ */
break;
case COLUMN_STAT_HIST_TYPE:
- Histogram_type hist_type= (Histogram_type) (stat_field->val_int() -
- 1);
- table_field->read_stats->histogram.set_type(hist_type);
- break;
+ {
+ /*
+ Save the histogram type. The histogram itself will be read in
+ read_histograms_for_table().
+ */
+ Histogram_type hist_type= (Histogram_type) (stat_field->val_int() -
+ 1);
+ table_field->read_stats->histogram_type_on_disk= hist_type;
+ break;
+ }
+ case COLUMN_STAT_HISTOGRAM:
+ /*
+ Do nothing here: we take the histogram length from the 'histogram'
+ column itself
+ */
+ break;
}
}
}
@@ -1182,9 +1214,9 @@ public:
The method assumes that the value of histogram size and the pointer to
the histogram location has been already set in the fields size and values
of read_stats->histogram.
- */
+ */
- void get_histogram_value()
+ Histogram_base * load_histogram(MEM_ROOT *mem_root)
{
if (find_stat())
{
@@ -1194,14 +1226,60 @@ public:
Field *stat_field= stat_table->field[fldno];
table_field->read_stats->set_not_null(fldno);
stat_field->val_str(&val);
- memcpy(table_field->read_stats->histogram.get_values(),
- val.ptr(), table_field->read_stats->histogram.get_size());
+ Histogram_type hist_type=
+ table_field->read_stats->histogram_type_on_disk;
+
+ Histogram_base *hist;
+ if (!(hist= create_histogram(mem_root, hist_type, NULL)))
+ return NULL;
+ Field *field= table->field[table_field->field_index];
+ if (!hist->parse(mem_root, db_name->str, table_name->str,
+ field, hist_type,
+ val.ptr(), val.length()))
+ {
+ table_field->read_stats->histogram= hist;
+ return hist;
+ }
+ else
+ delete hist;
}
+ return NULL;
}
-
};
+bool Histogram_binary::parse(MEM_ROOT *mem_root, const char*, const char*,
+ Field*, Histogram_type type_arg,
+ const char *hist_data, size_t hist_data_len)
+{
+ /* On-disk an in-memory formats are the same. Just copy the data. */
+ type= type_arg;
+ size= (uint8) hist_data_len; // 'size' holds the size of histogram in bytes
+ if (!(values= (uchar*)alloc_root(mem_root, hist_data_len)))
+ return true;
+
+ memcpy(values, hist_data, hist_data_len);
+ return false;
+}
+
+/*
+ Save the histogram data info a table field.
+*/
+void Histogram_binary::serialize(Field *field)
+{
+ field->store((char*)values, size, &my_charset_bin);
+}
+
+void Histogram_binary::init_for_collection(MEM_ROOT *mem_root,
+ Histogram_type htype_arg,
+ ulonglong size_arg)
+{
+ type= htype_arg;
+ values= (uchar*)alloc_root(mem_root, (size_t)size_arg);
+ size= (uint8) size_arg;
+}
+
+
/*
An object of the class Index_stat is created to read statistical
data on tables from the statistical table table_stat, to update
@@ -1512,62 +1590,39 @@ public:
}
};
-/*
- Histogram_builder is a helper class that is used to build histograms
- for columns
-*/
-
-class Histogram_builder
+class Histogram_binary_builder : public Histogram_builder
{
- Field *column; /* table field for which the histogram is built */
- uint col_length; /* size of this field */
- ha_rows records; /* number of records the histogram is built for */
Field *min_value; /* pointer to the minimal value for the field */
Field *max_value; /* pointer to the maximal value for the field */
- Histogram *histogram; /* the histogram location */
+ Histogram_binary *histogram; /* the histogram location */
uint hist_width; /* the number of points in the histogram */
double bucket_capacity; /* number of rows in a bucket of the histogram */
uint curr_bucket; /* number of the current bucket to be built */
- ulonglong count; /* number of values retrieved */
- ulonglong count_distinct; /* number of distinct values retrieved */
- /* number of distinct values that occured only once */
- ulonglong count_distinct_single_occurence;
-public:
- Histogram_builder(Field *col, uint col_len, ha_rows rows)
- : column(col), col_length(col_len), records(rows)
+public:
+ Histogram_binary_builder(Field *col, uint col_len, ha_rows rows)
+ : Histogram_builder(col, col_len, rows)
{
Column_statistics *col_stats= col->collected_stats;
min_value= col_stats->min_value;
max_value= col_stats->max_value;
- histogram= &col_stats->histogram;
+ histogram= (Histogram_binary*)col_stats->histogram;
hist_width= histogram->get_width();
bucket_capacity= (double) records / (hist_width + 1);
curr_bucket= 0;
- count= 0;
- count_distinct= 0;
- count_distinct_single_occurence= 0;
}
- ulonglong get_count_distinct() const { return count_distinct; }
- ulonglong get_count_single_occurence() const
+ int next(void *elem, element_count elem_cnt) override
{
- return count_distinct_single_occurence;
- }
-
- int next(void *elem, element_count elem_cnt)
- {
- count_distinct++;
- if (elem_cnt == 1)
- count_distinct_single_occurence++;
- count+= elem_cnt;
+ counters.next(elem, elem_cnt);
+ ulonglong count= counters.get_count();
if (curr_bucket == hist_width)
return 0;
if (count > bucket_capacity * (curr_bucket + 1))
{
column->store_field_value((uchar *) elem, col_length);
histogram->set_value(curr_bucket,
- column->pos_in_interval(min_value, max_value));
+ column->pos_in_interval(min_value, max_value));
curr_bucket++;
while (curr_bucket != hist_width &&
count > bucket_capacity * (curr_bucket + 1))
@@ -1578,25 +1633,51 @@ public:
}
return 0;
}
+ void finalize() override {}
};
+Histogram_builder *Histogram_binary::create_builder(Field *col, uint col_len,
+ ha_rows rows)
+{
+ return new Histogram_binary_builder(col, col_len, rows);
+}
+
+
+Histogram_base *create_histogram(MEM_ROOT *mem_root, Histogram_type hist_type,
+ THD *owner)
+{
+ Histogram_base *res= NULL;
+ switch (hist_type) {
+ case SINGLE_PREC_HB:
+ case DOUBLE_PREC_HB:
+ res= new Histogram_binary();
+ break;
+ case JSON_HB:
+ res= new Histogram_json_hb();
+ break;
+ default:
+ DBUG_ASSERT(0);
+ }
+
+ if (res)
+ res->set_owner(owner);
+ return res;
+}
+
+
C_MODE_START
-int histogram_build_walk(void *elem, element_count elem_cnt, void *arg)
+static int histogram_build_walk(void *elem, element_count elem_cnt, void *arg)
{
Histogram_builder *hist_builder= (Histogram_builder *) arg;
return hist_builder->next(elem, elem_cnt);
}
-
-
-static int count_distinct_single_occurence_walk(void *elem,
- element_count count, void *arg)
+int basic_stats_collector_walk(void *elem, element_count count,
+ void *arg)
{
- ((ulonglong*)arg)[0]+= 1;
- if (count == 1)
- ((ulonglong*)arg)[1]+= 1;
+ ((Basic_stats_collector*)arg)->next(elem, count);
return 0;
}
@@ -1681,23 +1762,35 @@ public:
*/
void walk_tree()
{
- ulonglong counts[2] = {0, 0};
- tree->walk(table_field->table,
- count_distinct_single_occurence_walk, counts);
- distincts= counts[0];
- distincts_single_occurence= counts[1];
+ Basic_stats_collector stats_collector;
+ tree->walk(table_field->table, basic_stats_collector_walk,
+ (void*)&stats_collector );
+ distincts= stats_collector.get_count_distinct();
+ distincts_single_occurence= stats_collector.get_count_single_occurence();
}
/*
@brief
Calculate a histogram of the tree
*/
- void walk_tree_with_histogram(ha_rows rows)
+ bool walk_tree_with_histogram(ha_rows rows)
{
- Histogram_builder hist_builder(table_field, tree_key_length, rows);
- tree->walk(table_field->table, histogram_build_walk, (void *) &hist_builder);
- distincts= hist_builder.get_count_distinct();
- distincts_single_occurence= hist_builder.get_count_single_occurence();
+ Histogram_base *hist= table_field->collected_stats->histogram;
+ Histogram_builder *hist_builder=
+ hist->create_builder(table_field, tree_key_length, rows);
+
+ if (tree->walk(table_field->table, histogram_build_walk,
+ (void*)hist_builder))
+ {
+ delete hist_builder;
+ return true; // Error
+ }
+ hist_builder->finalize();
+ distincts= hist_builder->counters.get_count_distinct();
+ distincts_single_occurence= hist_builder->counters.
+ get_count_single_occurence();
+ delete hist_builder;
+ return false;
}
ulonglong get_count_distinct()
@@ -1712,20 +1805,11 @@ public:
/*
@brief
- Get the size of the histogram in bytes built for table_field
- */
- uint get_hist_size()
- {
- return table_field->collected_stats->histogram.get_size();
- }
-
- /*
- @brief
Get the pointer to the histogram built for table_field
*/
- uchar *get_histogram()
+ Histogram_base *get_histogram()
{
- return table_field->collected_stats->histogram.get_values();
+ return table_field->collected_stats->histogram;
}
};
@@ -2125,26 +2209,13 @@ int alloc_statistics_for_table(THD* thd, TABLE *table)
ulonglong *idx_avg_frequency= (ulonglong*) alloc_root(&table->mem_root,
sizeof(ulonglong) * key_parts);
- uint hist_size= thd->variables.histogram_size;
- Histogram_type hist_type= (Histogram_type) (thd->variables.histogram_type);
- uchar *histogram= NULL;
- if (hist_size > 0)
- {
- if ((histogram= (uchar *) alloc_root(&table->mem_root,
- hist_size * columns)))
- bzero(histogram, hist_size * columns);
-
- }
-
- if (!table_stats || !column_stats || !index_stats || !idx_avg_frequency ||
- (hist_size && !histogram))
+ if (!table_stats || !column_stats || !index_stats || !idx_avg_frequency)
DBUG_RETURN(1);
table->collected_stats= table_stats;
table_stats->column_stats= column_stats;
table_stats->index_stats= index_stats;
table_stats->idx_avg_frequency= idx_avg_frequency;
- table_stats->histograms= histogram;
memset(column_stats, 0, sizeof(Column_statistics) * columns);
@@ -2152,10 +2223,7 @@ int alloc_statistics_for_table(THD* thd, TABLE *table)
{
if (bitmap_is_set(table->read_set, (*field_ptr)->field_index))
{
- column_stats->histogram.set_size(hist_size);
- column_stats->histogram.set_type(hist_type);
- column_stats->histogram.set_values(histogram);
- histogram+= hist_size;
+ column_stats->histogram = NULL;
(*field_ptr)->collected_stats= column_stats++;
}
}
@@ -2177,6 +2245,25 @@ int alloc_statistics_for_table(THD* thd, TABLE *table)
DBUG_RETURN(0);
}
+/*
+ Free the "local" statistics for table.
+ We only free the statistics that is not on MEM_ROOT and needs to be
+ explicitly freed.
+*/
+void free_statistics_for_table(THD *thd, TABLE *table)
+{
+ for (Field **field_ptr= table->field; *field_ptr; field_ptr++)
+ {
+ // Only delete the histograms that are exclusivly owned by this thread
+ if ((*field_ptr)->collected_stats &&
+ (*field_ptr)->collected_stats->histogram &&
+ (*field_ptr)->collected_stats->histogram->get_owner() == thd)
+ {
+ delete (*field_ptr)->collected_stats->histogram;
+ (*field_ptr)->collected_stats->histogram= NULL;
+ }
+ }
+}
/**
@brief
@@ -2383,7 +2470,8 @@ bool Column_statistics_collected::add()
*/
inline
-void Column_statistics_collected::finish(ha_rows rows, double sample_fraction)
+bool Column_statistics_collected::finish(MEM_ROOT *mem_root, ha_rows rows,
+ double sample_fraction)
{
double val;
@@ -2401,13 +2489,32 @@ void Column_statistics_collected::finish(ha_rows rows, double sample_fraction)
}
if (count_distinct)
{
- uint hist_size= count_distinct->get_hist_size();
+ uint hist_size= current_thd->variables.histogram_size;
+ Histogram_type hist_type=
+ (Histogram_type) (current_thd->variables.histogram_type);
+ bool have_histogram= false;
+ if (hist_size != 0 && hist_type != INVALID_HISTOGRAM)
+ {
+ have_histogram= true;
+ histogram= create_histogram(mem_root, hist_type, current_thd);
+ histogram->init_for_collection(mem_root, hist_type, hist_size);
+ }
/* Compute cardinality statistics and optionally histogram. */
- if (hist_size == 0)
+ if (!have_histogram)
count_distinct->walk_tree();
else
- count_distinct->walk_tree_with_histogram(rows - nulls);
+ {
+ if (count_distinct->walk_tree_with_histogram(rows - nulls))
+ {
+ delete histogram;
+ histogram= NULL;
+
+ delete count_distinct;
+ count_distinct= NULL;
+ return true; // Error
+ }
+ }
ulonglong distincts= count_distinct->get_count_distinct();
ulonglong distincts_single_occurence=
@@ -2442,15 +2549,14 @@ void Column_statistics_collected::finish(ha_rows rows, double sample_fraction)
set_not_null(COLUMN_STAT_AVG_FREQUENCY);
}
else
- hist_size= 0;
- histogram.set_size(hist_size);
+ have_histogram= false;
+
set_not_null(COLUMN_STAT_HIST_SIZE);
- if (hist_size && distincts)
+ if (have_histogram && distincts && histogram)
{
set_not_null(COLUMN_STAT_HIST_TYPE);
- histogram.set_values(count_distinct->get_histogram());
set_not_null(COLUMN_STAT_HISTOGRAM);
- }
+ }
delete count_distinct;
count_distinct= NULL;
}
@@ -2459,7 +2565,8 @@ void Column_statistics_collected::finish(ha_rows rows, double sample_fraction)
val= 1.0;
set_avg_frequency(val);
set_not_null(COLUMN_STAT_AVG_FREQUENCY);
- }
+ }
+ return false;
}
@@ -2708,7 +2815,10 @@ int collect_statistics_for_table(THD *thd, TABLE *table)
continue;
bitmap_set_bit(table->write_set, table_field->field_index);
if (!rc)
- table_field->collected_stats->finish(rows, sample_fraction);
+ {
+ rc= table_field->collected_stats->finish(&table->mem_root, rows,
+ sample_fraction);
+ }
else
table_field->collected_stats->cleanup();
}
@@ -2788,7 +2898,7 @@ int update_statistics_for_table(THD *thd, TABLE *table)
start_new_trans new_trans(thd);
- if (open_stat_tables(thd, tables, TRUE))
+ if ((open_stat_tables(thd, tables, TRUE)))
DBUG_RETURN(rc);
save_binlog_format= thd->set_current_stmt_binlog_format_stmt();
@@ -2914,16 +3024,17 @@ int read_statistics_for_table(THD *thd, TABLE *table, TABLE_LIST *stat_tables)
/* Read statistics from the statistical table column_stats */
stat_table= stat_tables[COLUMN_STAT].table;
- ulong total_hist_size= 0;
+ bool have_histograms= false;
Column_stat column_stat(stat_table, table);
for (field_ptr= table_share->field; *field_ptr; field_ptr++)
{
table_field= *field_ptr;
column_stat.set_key_fields(table_field);
column_stat.get_stat_values();
- total_hist_size+= table_field->read_stats->histogram.get_size();
+ if (table_field->read_stats->histogram_type_on_disk != INVALID_HISTOGRAM)
+ have_histograms= true;
}
- table_share->stats_cb.total_hist_size= total_hist_size;
+ table_share->stats_cb.have_histograms= have_histograms;
/* Read statistics from the statistical table index_stats */
stat_table= stat_tables[INDEX_STAT].table;
@@ -3019,6 +3130,9 @@ void delete_stat_values_for_table_share(TABLE_SHARE *table_share)
delete column_stats->max_value;
column_stats->max_value= NULL;
}
+
+ delete column_stats->histogram;
+ column_stats->histogram=NULL;
}
}
@@ -3063,28 +3177,28 @@ int read_histograms_for_table(THD *thd, TABLE *table, TABLE_LIST *stat_tables)
if (stats_cb->start_histograms_load())
{
- uchar *histogram= (uchar *) alloc_root(&stats_cb->mem_root,
- stats_cb->total_hist_size);
- if (!histogram)
- {
- stats_cb->abort_histograms_load();
- DBUG_RETURN(1);
- }
- memset(histogram, 0, stats_cb->total_hist_size);
-
Column_stat column_stat(stat_tables[COLUMN_STAT].table, table);
+
+ /*
+ The process of histogram loading makes use of the field it is for. Mark
+ all fields as readable/writable in order to allow that.
+ */
+ MY_BITMAP *old_sets[2];
+ dbug_tmp_use_all_columns(table, old_sets, &table->read_set, &table->write_set);
+
for (Field **field_ptr= table->s->field; *field_ptr; field_ptr++)
{
Field *table_field= *field_ptr;
- if (uint hist_size= table_field->read_stats->histogram.get_size())
+ if (table_field->read_stats->histogram_type_on_disk != INVALID_HISTOGRAM)
{
column_stat.set_key_fields(table_field);
- table_field->read_stats->histogram.set_values(histogram);
- column_stat.get_histogram_value();
- histogram+= hist_size;
+ table_field->read_stats->histogram=
+ column_stat.load_histogram(&stats_cb->mem_root);
}
}
stats_cb->end_histograms_load();
+
+ dbug_tmp_restore_column_maps(&table->read_set, &table->write_set, old_sets);
}
table->histograms_are_read= true;
DBUG_RETURN(0);
@@ -3773,15 +3887,11 @@ double get_column_range_cardinality(Field *field,
if (avg_frequency > 1.0 + 0.000001 &&
col_stats->min_max_values_are_provided())
{
- Histogram *hist= &col_stats->histogram;
- if (hist->is_usable(thd))
+ Histogram_base *hist = col_stats->histogram;
+ if (hist && hist->is_usable(thd))
{
- store_key_image_to_rec(field, (uchar *) min_endp->key,
- field->key_length());
- double pos= field->pos_in_interval(col_stats->min_value,
- col_stats->max_value);
res= col_non_nulls *
- hist->point_selectivity(pos,
+ hist->point_selectivity(field, min_endp,
avg_frequency / col_non_nulls);
}
}
@@ -3796,34 +3906,41 @@ double get_column_range_cardinality(Field *field,
{
if (col_stats->min_max_values_are_provided())
{
- double sel, min_mp_pos, max_mp_pos;
-
- if (min_endp && !(field->null_ptr && min_endp->key[0]))
+ Histogram_base *hist= col_stats->histogram;
+ double avg_frequency= col_stats->get_avg_frequency();
+ double sel;
+ if (hist && hist->is_usable(thd))
{
- store_key_image_to_rec(field, (uchar *) min_endp->key,
- field->key_length());
- min_mp_pos= field->pos_in_interval(col_stats->min_value,
- col_stats->max_value);
+ sel= hist->range_selectivity(field, min_endp, max_endp,
+ avg_frequency / col_non_nulls);
+ res= col_non_nulls * sel;
}
else
- min_mp_pos= 0.0;
- if (max_endp)
{
- store_key_image_to_rec(field, (uchar *) max_endp->key,
- field->key_length());
- max_mp_pos= field->pos_in_interval(col_stats->min_value,
- col_stats->max_value);
- }
- else
- max_mp_pos= 1.0;
+ double min_mp_pos, max_mp_pos;
+ if (min_endp && !(field->null_ptr && min_endp->key[0]))
+ {
+ store_key_image_to_rec(field, (uchar *) min_endp->key,
+ field->key_length());
+ min_mp_pos=
+ field->pos_in_interval(col_stats->min_value, col_stats->max_value);
+ }
+ else
+ min_mp_pos= 0.0;
+ if (max_endp)
+ {
+ store_key_image_to_rec(field, (uchar *) max_endp->key,
+ field->key_length());
+ max_mp_pos=
+ field->pos_in_interval(col_stats->min_value, col_stats->max_value);
+ }
+ else
+ max_mp_pos= 1.0;
- Histogram *hist= &col_stats->histogram;
- if (hist->is_usable(thd))
- sel= hist->range_selectivity(min_mp_pos, max_mp_pos);
- else
- sel= (max_mp_pos - min_mp_pos);
- res= col_non_nulls * sel;
- set_if_bigger(res, col_stats->get_avg_frequency());
+ sel = (max_mp_pos - min_mp_pos);
+ res= col_non_nulls * sel;
+ set_if_bigger(res, avg_frequency);
+ }
}
else
res= col_non_nulls;
@@ -3833,13 +3950,13 @@ double get_column_range_cardinality(Field *field,
return res;
}
-
-
/*
Estimate selectivity of "col=const" using a histogram
- @param pos Position of the "const" between column's min_value and
- max_value. This is a number in [0..1] range.
+ @param field the field to estimate its selectivity.
+
+ @param endpoint The constant
+
@param avg_sel Average selectivity of condition "col=const" in this table.
It is calcuated as (#non_null_values / #distinct_values).
@@ -3868,9 +3985,15 @@ double get_column_range_cardinality(Field *field,
value.
*/
-double Histogram::point_selectivity(double pos, double avg_sel)
+double Histogram_binary::point_selectivity(Field *field, key_range *endpoint,
+ double avg_sel)
{
double sel;
+ Column_statistics *col_stats= field->read_stats;
+ store_key_image_to_rec(field, (uchar *) endpoint->key,
+ field->key_length());
+ double pos= field->pos_in_interval(col_stats->min_value,
+ col_stats->max_value);
/* Find the bucket that contains the value 'pos'. */
uint min= find_bucket(pos, TRUE);
uint pos_value= (uint) (pos * prec_factor());
@@ -3904,7 +4027,7 @@ double Histogram::point_selectivity(double pos, double avg_sel)
/*
The value 'pos' fits within one single histogram bucket.
- Histogram buckets have the same numbers of rows, but they cover
+ Histogram_binary buckets have the same numbers of rows, but they cover
different ranges of values.
We assume that values are uniformly distributed across the [0..1] value
@@ -3949,6 +4072,43 @@ double Histogram::point_selectivity(double pos, double avg_sel)
return sel;
}
+
+double Histogram_binary::range_selectivity(Field *field,
+ key_range *min_endp,
+ key_range *max_endp,
+ double avg_sel)
+{
+ double sel, min_mp_pos, max_mp_pos;
+ Column_statistics *col_stats= field->read_stats;
+
+ if (min_endp && !(field->null_ptr && min_endp->key[0]))
+ {
+ store_key_image_to_rec(field, (uchar *) min_endp->key,
+ field->key_length());
+ min_mp_pos=
+ field->pos_in_interval(col_stats->min_value, col_stats->max_value);
+ }
+ else
+ min_mp_pos= 0.0;
+ if (max_endp)
+ {
+ store_key_image_to_rec(field, (uchar *) max_endp->key,
+ field->key_length());
+ max_mp_pos=
+ field->pos_in_interval(col_stats->min_value, col_stats->max_value);
+ }
+ else
+ max_mp_pos= 1.0;
+
+ double bucket_sel= 1.0 / (get_width() + 1);
+ uint min= find_bucket(min_mp_pos, TRUE);
+ uint max= find_bucket(max_mp_pos, FALSE);
+ sel= bucket_sel * (max - min + 1);
+
+ set_if_bigger(sel, avg_sel);
+ return sel;
+}
+
/*
Check whether the table is one of the persistent statistical tables.
*/
diff --git a/sql/sql_statistics.h b/sql/sql_statistics.h
index 35b3aa33acc..c0df15ea4ad 100644
--- a/sql/sql_statistics.h
+++ b/sql/sql_statistics.h
@@ -16,6 +16,9 @@
#ifndef SQL_STATISTICS_H
#define SQL_STATISTICS_H
+#include <vector>
+#include <string>
+
/*
For COMPLEMENTARY_FOR_QUERIES and PREFERABLY_FOR_QUERIES they are
similar to the COMPLEMENTARY and PREFERABLY respectively except that
@@ -42,7 +45,9 @@ typedef
enum enum_histogram_type
{
SINGLE_PREC_HB,
- DOUBLE_PREC_HB
+ DOUBLE_PREC_HB,
+ JSON_HB,
+ INVALID_HISTOGRAM
} Histogram_type;
enum enum_stat_tables
@@ -120,6 +125,7 @@ int read_statistics_for_tables(THD *thd, TABLE_LIST *tables);
int collect_statistics_for_table(THD *thd, TABLE *table);
void delete_stat_values_for_table_share(TABLE_SHARE *table_share);
int alloc_statistics_for_table(THD *thd, TABLE *table);
+void free_statistics_for_table(THD *thd, TABLE *table);
int update_statistics_for_table(THD *thd, TABLE *table);
int delete_statistics_for_table(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *tab);
int delete_statistics_for_column(THD *thd, TABLE *tab, Field *col);
@@ -140,9 +146,82 @@ double get_column_range_cardinality(Field *field,
bool is_stat_table(const LEX_CSTRING *db, LEX_CSTRING *table);
bool is_eits_usable(Field* field);
-class Histogram
+class Histogram_builder;
+
+/*
+ Common base for all histograms
+*/
+class Histogram_base
{
+public:
+ virtual bool parse(MEM_ROOT *mem_root,
+ const char *db_name, const char *table_name,
+ Field *field, Histogram_type type_arg,
+ const char *hist_data, size_t hist_data_len)= 0;
+ virtual void serialize(Field *to_field)= 0;
+
+ virtual Histogram_type get_type()=0;
+
+ virtual uint get_width()=0;
+
+ /*
+ The creation-time workflow is:
+ * create a histogram
+ * init_for_collection()
+ * create_builder()
+ * feed the data to the builder
+ * serialize();
+ */
+ virtual void init_for_collection(MEM_ROOT *mem_root, Histogram_type htype_arg,
+ ulonglong size)=0;
+ virtual Histogram_builder *create_builder(Field *col, uint col_len,
+ ha_rows rows)=0;
+
+ /*
+ This function checks that histograms should be usable only when
+ 1) the level of optimizer_use_condition_selectivity > 3
+ */
+ bool is_usable(THD *thd)
+ {
+ return thd->variables.optimizer_use_condition_selectivity > 3;
+ }
+
+
+ virtual double point_selectivity(Field *field, key_range *endpoint,
+ double avg_sel)=0;
+ virtual double range_selectivity(Field *field, key_range *min_endp,
+ key_range *max_endp, double avg_sel)=0;
+
+ /*
+ Legacy: return the size of the histogram on disk.
+ This will be stored in mysql.column_stats.hist_size column.
+ The value is not really needed as one can look at
+ LENGTH(mysql.column_stats.histogram) directly.
+ */
+ virtual uint get_size()=0;
+ virtual ~Histogram_base()= default;
+
+ Histogram_base() : owner(NULL) {}
+
+ /*
+ Memory management: a histogram may be (exclusively) "owned" by a particular
+ thread (done for histograms that are being collected). By default, a
+ histogram has owner==NULL and is not owned by any particular thread.
+ */
+ THD *get_owner() { return owner; }
+ void set_owner(THD *thd) { owner=thd; }
+private:
+ THD *owner;
+};
+
+
+/*
+ A Height-balanced histogram that stores numeric fractions
+*/
+
+class Histogram_binary : public Histogram_base
+{
private:
Histogram_type type;
uint8 size; /* Size of values array, in bytes */
@@ -155,22 +234,25 @@ private:
return ((uint) (1 << 8) - 1);
case DOUBLE_PREC_HB:
return ((uint) (1 << 16) - 1);
+ default:
+ DBUG_ASSERT(0);
}
return 1;
}
public:
- uint get_width()
+ uint get_width() override
{
switch (type) {
case SINGLE_PREC_HB:
return size;
case DOUBLE_PREC_HB:
return size / 2;
+ default:
+ DBUG_ASSERT(0);
}
return 0;
}
-
private:
uint get_value(uint i)
{
@@ -180,6 +262,8 @@ private:
return (uint) (((uint8 *) values)[i]);
case DOUBLE_PREC_HB:
return (uint) uint2korr(values + i * 2);
+ default:
+ DBUG_ASSERT(0);
}
return 0;
}
@@ -224,70 +308,124 @@ private:
}
public:
+ uint get_size() override {return (uint)size;}
- uint get_size() { return (uint) size; }
-
- Histogram_type get_type() { return type; }
-
- uchar *get_values() { return (uchar *) values; }
+ Histogram_type get_type() override { return type; }
- void set_size (ulonglong sz) { size= (uint8) sz; }
-
- void set_type (Histogram_type t) { type= t; }
-
- void set_values (uchar *vals) { values= (uchar *) vals; }
-
- bool is_available() { return get_size() > 0 && get_values(); }
-
- /*
- This function checks that histograms should be usable only when
- 1) the level of optimizer_use_condition_selectivity > 3
- 2) histograms have been collected
- */
- bool is_usable(THD *thd)
- {
- return thd->variables.optimizer_use_condition_selectivity > 3 &&
- is_available();
- }
+ bool parse(MEM_ROOT *mem_root, const char*, const char*, Field*,
+ Histogram_type type_arg, const char *hist_data,
+ size_t hist_data_len) override;
+ void serialize(Field *to_field) override;
+ void init_for_collection(MEM_ROOT *mem_root, Histogram_type htype_arg,
+ ulonglong size) override;
+ Histogram_builder *create_builder(Field *col, uint col_len,
+ ha_rows rows) override;
void set_value(uint i, double val)
{
switch (type) {
- case SINGLE_PREC_HB:
+ case SINGLE_PREC_HB:
((uint8 *) values)[i]= (uint8) (val * prec_factor());
return;
case DOUBLE_PREC_HB:
int2store(values + i * 2, val * prec_factor());
return;
+ default:
+ DBUG_ASSERT(0);
+ return;
}
}
void set_prev_value(uint i)
{
switch (type) {
- case SINGLE_PREC_HB:
+ case SINGLE_PREC_HB:
((uint8 *) values)[i]= ((uint8 *) values)[i-1];
return;
case DOUBLE_PREC_HB:
int2store(values + i * 2, uint2korr(values + i * 2 - 2));
return;
+ default:
+ DBUG_ASSERT(0);
+ return;
}
}
- double range_selectivity(double min_pos, double max_pos)
- {
- double sel;
- double bucket_sel= 1.0/(get_width() + 1);
- uint min= find_bucket(min_pos, TRUE);
- uint max= find_bucket(max_pos, FALSE);
- sel= bucket_sel * (max - min + 1);
- return sel;
- }
-
+ double range_selectivity(Field *field, key_range *min_endp,
+ key_range *max_endp, double avg_sel) override;
+
/*
Estimate selectivity of "col=const" using a histogram
*/
- double point_selectivity(double pos, double avg_sel);
+ double point_selectivity(Field *field, key_range *endpoint,
+ double avg_sel) override;
+};
+
+
+/*
+ This is used to collect the the basic statistics from a Unique object:
+ - count of values
+ - count of distinct values
+ - count of distinct values that have occurred only once
+*/
+
+class Basic_stats_collector
+{
+ ulonglong count; /* number of values retrieved */
+ ulonglong count_distinct; /* number of distinct values retrieved */
+ /* number of distinct values that occured only once */
+ ulonglong count_distinct_single_occurence;
+
+public:
+ Basic_stats_collector()
+ {
+ count= 0;
+ count_distinct= 0;
+ count_distinct_single_occurence= 0;
+ }
+
+ ulonglong get_count_distinct() const { return count_distinct; }
+ ulonglong get_count_single_occurence() const
+ {
+ return count_distinct_single_occurence;
+ }
+ ulonglong get_count() const { return count; }
+
+ void next(void *elem, element_count elem_cnt)
+ {
+ count_distinct++;
+ if (elem_cnt == 1)
+ count_distinct_single_occurence++;
+ count+= elem_cnt;
+ }
+};
+
+
+/*
+ Histogram_builder is a helper class that is used to build histograms
+ for columns.
+
+ Do not create directly, call Histogram->get_builder(...);
+*/
+
+class Histogram_builder
+{
+protected:
+ Field *column; /* table field for which the histogram is built */
+ uint col_length; /* size of this field */
+ ha_rows records; /* number of records the histogram is built for */
+
+ Histogram_builder(Field *col, uint col_len, ha_rows rows) :
+ column(col), col_length(col_len), records(rows)
+ {}
+
+public:
+ // A histogram builder will also collect the counters
+ Basic_stats_collector counters;
+
+ virtual int next(void *elem, element_count elem_cnt)=0;
+ virtual void finalize()=0;
+ virtual ~Histogram_builder(){}
};
@@ -308,7 +446,6 @@ public:
/* Array of records per key for index prefixes */
ulonglong *idx_avg_frequency;
- uchar *histograms; /* Sequence of histograms */
};
@@ -370,8 +507,10 @@ private:
ulonglong avg_frequency;
public:
+ /* Histogram type as specified in mysql.column_stats.hist_type */
+ Histogram_type histogram_type_on_disk;
- Histogram histogram;
+ Histogram_base *histogram;
uint32 no_values_provided_bitmap()
{
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 28c0ba60d70..acd15d3f911 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -19,6 +19,7 @@
/* drop and alter of tables */
#include "mariadb.h"
+#include "sql_class.h"
#include "sql_priv.h"
#include "unireg.h"
#include "debug_sync.h"
@@ -59,6 +60,9 @@
#include "debug.h" // debug_crash_here()
#include <algorithm>
#include "wsrep_mysqld.h"
+#include "rpl_mi.h"
+#include "rpl_rli.h"
+#include "log.h"
#include "sql_debug.h"
#ifdef _WIN32
@@ -91,6 +95,12 @@ static int mysql_prepare_create_table(THD *, HA_CREATE_INFO *, Alter_info *,
static uint blob_length_by_type(enum_field_types type);
static bool fix_constraints_names(THD *, List<Virtual_column_info> *,
const HA_CREATE_INFO *);
+static bool wait_for_master(THD *thd);
+static int process_master_state(THD *thd, int alter_result,
+ uint64 &start_alter_id, bool if_exists);
+static bool
+write_bin_log_start_alter_rollback(THD *thd, uint64 &start_alter_id,
+ bool &partial_alter, bool if_exists);
/**
@brief Helper function for explain_filename
@@ -669,10 +679,12 @@ void build_lower_case_table_filename(char *buff, size_t bufflen,
*/
uint build_table_shadow_filename(char *buff, size_t bufflen,
- ALTER_PARTITION_PARAM_TYPE *lpt)
+ ALTER_PARTITION_PARAM_TYPE *lpt,
+ bool backup)
{
char tmp_name[FN_REFLEN];
- my_snprintf(tmp_name, sizeof (tmp_name), "%s-shadow-%lx-%s", tmp_file_prefix,
+ my_snprintf(tmp_name, sizeof (tmp_name), "%s-%s-%lx-%s", tmp_file_prefix,
+ backup ? "backup" : "shadow",
(ulong) current_thd->thread_id, lpt->table_name.str);
return build_table_filename(buff, bufflen, lpt->db.str, tmp_name, "",
FN_IS_TMP);
@@ -706,6 +718,11 @@ uint build_table_shadow_filename(char *buff, size_t bufflen,
tables since it only handles partitioned data if it exists.
*/
+
+/*
+ TODO: Partitioning atomic DDL refactoring: WFRM_WRITE_SHADOW
+ should be merged with create_table_impl(frm_only == true).
+*/
bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
{
/*
@@ -719,8 +736,11 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
char shadow_frm_name[FN_REFLEN+1];
char frm_name[FN_REFLEN+1];
#ifdef WITH_PARTITION_STORAGE_ENGINE
+ char bak_path[FN_REFLEN+1];
+ char bak_frm_name[FN_REFLEN+1];
char *part_syntax_buf;
uint syntax_len;
+ partition_info *part_info= lpt->part_info;
#endif
DBUG_ENTER("mysql_write_frm");
@@ -779,6 +799,94 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
goto end;
}
}
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ if (flags & WFRM_WRITE_CONVERTED_TO)
+ {
+ THD *thd= lpt->thd;
+ Alter_table_ctx *alter_ctx= lpt->alter_ctx;
+ HA_CREATE_INFO *create_info= lpt->create_info;
+
+ LEX_CSTRING new_path= { alter_ctx->get_new_path(), 0 };
+ partition_info *work_part_info= thd->work_part_info;
+ handlerton *db_type= create_info->db_type;
+ DBUG_ASSERT(lpt->table->part_info);
+ DBUG_ASSERT(lpt->table->part_info == part_info);
+ handler *file= ((ha_partition *)(lpt->table->file))->get_child_handlers()[0];
+ DBUG_ASSERT(file);
+ new_path.length= strlen(new_path.str);
+ strxnmov(frm_name, sizeof(frm_name) - 1, new_path.str, reg_ext, NullS);
+ create_info->alias= alter_ctx->table_name;
+ thd->work_part_info= NULL;
+ create_info->db_type= work_part_info->default_engine_type;
+ /* NOTE: partitioned temporary tables are not supported. */
+ DBUG_ASSERT(!create_info->tmp_table());
+ if (ddl_log_create_table(thd, part_info, create_info->db_type, &new_path,
+ &alter_ctx->new_db, &alter_ctx->new_name, true) ||
+ ERROR_INJECT("create_before_create_frm"))
+ DBUG_RETURN(TRUE);
+
+ if (mysql_prepare_create_table(thd, create_info, lpt->alter_info,
+ &lpt->db_options, file,
+ &lpt->key_info_buffer, &lpt->key_count,
+ C_ALTER_TABLE, alter_ctx->new_db,
+ alter_ctx->new_name))
+ DBUG_RETURN(TRUE);
+
+ lpt->create_info->table_options= lpt->db_options;
+ LEX_CUSTRING frm= build_frm_image(thd, alter_ctx->new_name, create_info,
+ lpt->alter_info->create_list,
+ lpt->key_count, lpt->key_info_buffer,
+ file);
+ if (unlikely(!frm.str))
+ DBUG_RETURN(TRUE);
+
+ thd->work_part_info= work_part_info;
+ create_info->db_type= db_type;
+
+ ERROR_INJECT("alter_partition_after_create_frm");
+
+ error= writefile(frm_name, alter_ctx->new_db.str, alter_ctx->new_name.str,
+ create_info->tmp_table(), frm.str, frm.length);
+ my_free((void *) frm.str);
+ if (unlikely(error) || ERROR_INJECT("alter_partition_after_write_frm"))
+ {
+ mysql_file_delete(key_file_frm, frm_name, MYF(0));
+ DBUG_RETURN(TRUE);
+ }
+
+ DBUG_RETURN(false);
+ }
+ if (flags & WFRM_BACKUP_ORIGINAL)
+ {
+ build_table_filename(path, sizeof(path) - 1, lpt->db.str,
+ lpt->table_name.str, "", 0);
+ strxnmov(frm_name, sizeof(frm_name), path, reg_ext, NullS);
+
+ build_table_shadow_filename(bak_path, sizeof(bak_path) - 1, lpt, true);
+ strxmov(bak_frm_name, bak_path, reg_ext, NullS);
+
+ DDL_LOG_MEMORY_ENTRY *main_entry= part_info->main_entry;
+ mysql_mutex_lock(&LOCK_gdl);
+ if (write_log_replace_frm(lpt, part_info->list->entry_pos,
+ (const char*) bak_path,
+ (const char*) path) ||
+ ddl_log_write_execute_entry(part_info->list->entry_pos,
+ &part_info->execute_entry))
+ {
+ mysql_mutex_unlock(&LOCK_gdl);
+ DBUG_RETURN(TRUE);
+ }
+ mysql_mutex_unlock(&LOCK_gdl);
+ part_info->main_entry= main_entry;
+ if (mysql_file_rename(key_file_frm, frm_name, bak_frm_name, MYF(MY_WME)))
+ DBUG_RETURN(TRUE);
+ if (lpt->table->file->ha_create_partitioning_metadata(bak_path, path,
+ CHF_RENAME_FLAG))
+ DBUG_RETURN(TRUE);
+ }
+#else /* !WITH_PARTITION_STORAGE_ENGINE */
+ DBUG_ASSERT(!(flags & WFRM_BACKUP_ORIGINAL));
+#endif /* !WITH_PARTITION_STORAGE_ENGINE */
if (flags & WFRM_INSTALL_SHADOW)
{
#ifdef WITH_PARTITION_STORAGE_ENGINE
@@ -800,20 +908,25 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
completing this we write a new phase to the log entry that will
deactivate it.
*/
- if (mysql_file_delete(key_file_frm, frm_name, MYF(MY_WME)) ||
+ if (!(flags & WFRM_BACKUP_ORIGINAL) && (
+ mysql_file_delete(key_file_frm, frm_name, MYF(MY_WME))
#ifdef WITH_PARTITION_STORAGE_ENGINE
- lpt->table->file->ha_create_partitioning_metadata(path, shadow_path,
+ || lpt->table->file->ha_create_partitioning_metadata(path, shadow_path,
CHF_DELETE_FLAG) ||
- ddl_log_increment_phase(part_info->frm_log_entry->entry_pos) ||
- (ddl_log_sync(), FALSE) ||
- mysql_file_rename(key_file_frm,
- shadow_frm_name, frm_name, MYF(MY_WME)) ||
- lpt->table->file->ha_create_partitioning_metadata(path, shadow_path,
- CHF_RENAME_FLAG))
-#else
- mysql_file_rename(key_file_frm,
- shadow_frm_name, frm_name, MYF(MY_WME)))
+ ddl_log_increment_phase(part_info->main_entry->entry_pos) ||
+ (ddl_log_sync(), FALSE)
+#endif
+ ))
+ {
+ error= 1;
+ goto err;
+ }
+ if (mysql_file_rename(key_file_frm, shadow_frm_name, frm_name, MYF(MY_WME))
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ || lpt->table->file->ha_create_partitioning_metadata(path, shadow_path,
+ CHF_RENAME_FLAG)
#endif
+ )
{
error= 1;
goto err;
@@ -852,8 +965,8 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
err:
#ifdef WITH_PARTITION_STORAGE_ENGINE
- ddl_log_increment_phase(part_info->frm_log_entry->entry_pos);
- part_info->frm_log_entry= NULL;
+ ddl_log_increment_phase(part_info->main_entry->entry_pos);
+ part_info->main_entry= NULL;
(void) ddl_log_sync();
#endif
;
@@ -891,7 +1004,16 @@ int write_bin_log(THD *thd, bool clear_error,
int errcode= 0;
thd_proc_info(thd, "Writing to binlog");
if (clear_error)
+ {
+ if (global_system_variables.log_warnings > 2)
+ {
+ uint err_clear= thd->is_error() ? thd->get_stmt_da()->sql_errno() : 0;
+ if (err_clear)
+ sql_print_warning("Error code %d of query '%s' is cleared at its "
+ "binary logging.", err_clear, query);
+ }
thd->clear_error();
+ }
else
errcode= query_error_code(thd, TRUE);
error= thd->binlog_query(THD::STMT_QUERY_TYPE,
@@ -903,21 +1025,40 @@ int write_bin_log(THD *thd, bool clear_error,
}
-/*
- Write to binary log with optional adding "IF EXISTS"
+/**
+ Write to binary log the query event whose text is taken from thd->query().
- The query is taken from thd->query()
+ @param thd Thread handle.
+ @param clear_error Whether to clear out any error from
+ execution context and binlog event.
+ @param is_trans Whether the query changed transactional data.
+ @param add_if_exists True indicates the binary logging of the query
+ should be done with "if exists" option.
+ @param commit_alter Whether the query should be binlogged as
+ Commit Alter.
+
+ @return false on Success
+ @return true otherwise
*/
int write_bin_log_with_if_exists(THD *thd, bool clear_error,
- bool is_trans, bool add_if_exists)
+ bool is_trans, bool add_if_exists,
+ bool commit_alter)
{
int result;
ulonglong save_option_bits= thd->variables.option_bits;
if (add_if_exists)
thd->variables.option_bits|= OPTION_IF_EXISTS;
+ if (commit_alter)
+ thd->set_binlog_flags_for_alter(Gtid_log_event::FL_COMMIT_ALTER_E1);
+
result= write_bin_log(thd, clear_error, thd->query(), thd->query_length(),
is_trans);
+ if (commit_alter)
+ {
+ thd->set_binlog_flags_for_alter(0);
+ thd->set_binlog_start_alter_seq_no(0);
+ }
thd->variables.option_bits= save_option_bits;
return result;
}
@@ -2185,7 +2326,7 @@ void promote_first_timestamp_column(List<Create_field> *column_definitions)
static bool key_cmp(const Key_part_spec &a, const Key_part_spec &b)
{
- return a.length == b.length &&
+ return a.length == b.length && a.asc == b.asc &&
!lex_string_cmp(system_charset_info, &a.field_name, &b.field_name);
}
@@ -2765,8 +2906,6 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
*/
if (sql_field->stored_in_db())
record_offset+= sql_field->pack_length;
- if (sql_field->flags & VERS_SYSTEM_FIELD)
- continue;
}
/* Update virtual fields' offset and give error if
All fields are invisible */
@@ -3120,14 +3259,14 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
if (!sql_field || (sql_field->invisible > INVISIBLE_USER &&
!column->generated))
{
- my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name.str);
+ my_error(ER_KEY_COLUMN_DOES_NOT_EXIST, MYF(0), column->field_name.str);
DBUG_RETURN(TRUE);
}
if (sql_field->invisible > INVISIBLE_USER &&
!(sql_field->flags & VERS_SYSTEM_FIELD) &&
- !key->invisible && DBUG_EVALUATE_IF("test_invisible_index", 0, 1))
+ !key->invisible && !DBUG_IF("test_invisible_index"))
{
- my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name.str);
+ my_error(ER_KEY_COLUMN_DOES_NOT_EXIST, MYF(0), column->field_name.str);
DBUG_RETURN(TRUE);
}
while ((dup_column= cols2++) != column)
@@ -3233,6 +3372,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
key_part_info->fieldnr= field;
key_part_info->offset= (uint16) sql_field->offset;
key_part_info->key_type=sql_field->pack_flag;
+ key_part_info->key_part_flag= column->asc ? 0 : HA_REVERSE_SORT;
uint key_part_length= sql_field->type_handler()->
calc_key_length(*sql_field);
@@ -4201,7 +4341,6 @@ err:
@retval -1 table existed but IF NOT EXISTS was used
*/
-static
int create_table_impl(THD *thd,
DDL_LOG_STATE *ddl_log_state_create,
DDL_LOG_STATE *ddl_log_state_rm,
@@ -6066,9 +6205,8 @@ remove_key:
if (!part_elem)
{
push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,
- ER_DROP_PARTITION_NON_EXISTENT,
- ER_THD(thd, ER_DROP_PARTITION_NON_EXISTENT),
- "DROP");
+ ER_PARTITION_DOES_NOT_EXIST,
+ ER_THD(thd, ER_PARTITION_DOES_NOT_EXIST));
names_it.remove();
}
}
@@ -6258,6 +6396,14 @@ Compare_keys compare_keys_but_name(const KEY *table_key, const KEY *new_key,
return Compare_keys::NotEqual;
}
+ /*
+ Check the descending flag for index field.
+ */
+ if ((new_part->key_part_flag ^ key_part->key_part_flag) & HA_REVERSE_SORT)
+ {
+ return Compare_keys::NotEqual;
+ }
+
auto compare= table->file->compare_key_parts(
*table->field[key_part->fieldnr - 1], new_field, *key_part, *new_part);
result= merge(result, compare);
@@ -6894,10 +7040,8 @@ static void update_altered_table(const Alter_inplace_info &ha_alter_info,
@retval false success
*/
-bool mysql_compare_tables(TABLE *table,
- Alter_info *alter_info,
- HA_CREATE_INFO *create_info,
- bool *metadata_equal)
+bool mysql_compare_tables(TABLE *table, Alter_info *alter_info,
+ HA_CREATE_INFO *create_info, bool *metadata_equal)
{
DBUG_ENTER("mysql_compare_tables");
@@ -6922,15 +7066,14 @@ bool mysql_compare_tables(TABLE *table,
Alter_info tmp_alter_info(*alter_info, thd->mem_root);
uint db_options= 0; /* not used */
KEY *key_info_buffer= NULL;
- LEX_CSTRING db= { table->s->db.str, table->s->db.length };
- LEX_CSTRING table_name= { table->s->db.str, table->s->table_name.length };
/* Create the prepared information. */
int create_table_mode= table->s->tmp_table == NO_TMP_TABLE ?
C_ORDINARY_CREATE : C_ALTER_TABLE;
if (mysql_prepare_create_table(thd, create_info, &tmp_alter_info,
&db_options, table->file, &key_info_buffer,
- &key_count, create_table_mode, db, table_name))
+ &key_count, create_table_mode,
+ table->s->db, table->s->table_name))
DBUG_RETURN(1);
/* Some very basic checks. */
@@ -7025,7 +7168,8 @@ bool mysql_compare_tables(TABLE *table,
are equal. Comparing field numbers is sufficient.
*/
if ((table_part->length != new_part->length) ||
- (table_part->fieldnr - 1 != new_part->fieldnr))
+ (table_part->fieldnr - 1 != new_part->fieldnr) ||
+ ((table_part->key_part_flag ^ new_part->key_part_flag) & HA_REVERSE_SORT))
DBUG_RETURN(false);
}
}
@@ -7210,6 +7354,86 @@ static bool notify_tabledef_changed(TABLE_LIST *table_list)
DBUG_RETURN(0);
}
+/**
+ The function is invoked in error branches of ALTER processing.
+ Write Rollback alter in case of partial_alter is true else
+ call process_master_state.
+
+ @param thd Thread handle.
+ @param[in/out]
+ start_alter_id Start Alter identifier or zero,
+ it is reset to zero.
+ @param[in/out]
+ partial_alter When is true at the function enter
+ that indicates Start Alter phase completed;
+ it then is reset to false.
+ @param if_exists True indicates the binary logging of the query
+ should be done with "if exists" option.
+
+ @return false on Success
+ @return true otherwise
+*/
+static bool
+write_bin_log_start_alter_rollback(THD *thd, uint64 &start_alter_id,
+ bool &partial_alter, bool if_exists)
+{
+#if defined(HAVE_REPLICATION)
+ if (start_alter_id)
+ {
+ start_alter_info *info= thd->rgi_slave->sa_info;
+ Master_info *mi= thd->rgi_slave->rli->mi;
+
+ if (info->sa_seq_no == 0)
+ {
+ /*
+ Error occurred before SA got to processing incl its binlogging.
+ So it's a failure to apply and thus no need to wait for master's
+ completion result.
+ */
+ return true;
+ }
+ mysql_mutex_lock(&mi->start_alter_lock);
+ if (info->direct_commit_alter)
+ {
+ DBUG_ASSERT(info->state == start_alter_state::ROLLBACK_ALTER);
+
+ /*
+ SA may end up in the rollback state through FTWRL that breaks
+ SA's waiting for a master decision.
+ Then it completes "officially", and `direct_commit_alter` true status
+ will affect the future of CA to re-execute the whole query.
+ */
+ info->state= start_alter_state::COMPLETED;
+ if (info->direct_commit_alter)
+ mysql_cond_broadcast(&info->start_alter_cond);
+ mysql_mutex_unlock(&mi->start_alter_lock);
+
+ return true; // not really an error to be handled by caller specifically
+ }
+ mysql_mutex_unlock(&mi->start_alter_lock);
+ /*
+ We have to call wait for master here because in main calculation
+ we can error out before calling wait for master
+ (for example if copy_data_between_tables fails)
+ */
+ if (info->state == start_alter_state::REGISTERED)
+ wait_for_master(thd);
+ if(process_master_state(thd, 1, start_alter_id, if_exists))
+ return true;
+ }
+ else
+#endif
+ if (partial_alter) // Write only if SA written
+ {
+ // Send the rollback message
+ Write_log_with_flags wlwf(thd, Gtid_log_event::FL_ROLLBACK_ALTER_E1);
+ if(write_bin_log_with_if_exists(thd, false, false, if_exists, false))
+ return true;
+ partial_alter= false;
+ }
+ return false;
+}
+
/**
Perform in-place alter table.
@@ -7223,9 +7447,17 @@ static bool notify_tabledef_changed(TABLE_LIST *table_list)
used during different phases.
@param target_mdl_request Metadata request/lock on the target table name.
@param alter_ctx ALTER TABLE runtime context.
-
- @retval true Error
- @retval false Success
+ @param partial_alter Is set to true to return the fact of the first
+ "START ALTER" binlogging phase is done.
+ @param[in/out]
+ start_alter_id Gtid seq_no of START ALTER or zero otherwise;
+ it may get changed to return to the caller.
+ @param if_exists True indicates the binary logging of the query
+ should be done with "if exists" option.
+
+ @retval >=1 Error{ 1= ROLLBACK recieved from master , 2= error
+ in alter so no ROLLBACK in binlog }
+ @retval 0 Success
@note
If mysql_alter_table does not need to copy the table, it is
@@ -7248,13 +7480,16 @@ static bool mysql_inplace_alter_table(THD *thd,
MDL_request *target_mdl_request,
DDL_LOG_STATE *ddl_log_state,
TRIGGER_RENAME_PARAM *trigger_param,
- Alter_table_ctx *alter_ctx)
+ Alter_table_ctx *alter_ctx,
+ bool &partial_alter,
+ uint64 &start_alter_id, bool if_exists)
{
Open_table_context ot_ctx(thd, MYSQL_OPEN_REOPEN | MYSQL_OPEN_IGNORE_KILLED);
handlerton *db_type= table->s->db_type();
Alter_info *alter_info= ha_alter_info->alter_info;
bool reopen_tables= false;
bool res, commit_succeded_with_error= 0;
+
const enum_alter_inplace_result inplace_supported=
ha_alter_info->inplace_supported;
DBUG_ENTER("mysql_inplace_alter_table");
@@ -7334,10 +7569,31 @@ static bool mysql_inplace_alter_table(THD *thd,
thd->variables.lock_wait_timeout))
goto cleanup;
+ DBUG_ASSERT(table->s->tmp_table == NO_TMP_TABLE || start_alter_id == 0);
+
+ if (table->s->tmp_table == NO_TMP_TABLE)
+ {
+ if (write_bin_log_start_alter(thd, partial_alter, start_alter_id,
+ if_exists))
+ goto cleanup;
+ }
+ else if (start_alter_id)
+ {
+ DBUG_ASSERT(thd->rgi_slave);
+
+ my_error(ER_INCONSISTENT_SLAVE_TEMP_TABLE, MYF(0), thd->query(),
+ table_list->db.str, table_list->table_name.str);
+ goto cleanup;
+ }
+
+ DBUG_EXECUTE_IF("start_alter_kill_after_binlog", {
+ DBUG_SUICIDE();
+ });
+
+
// It's now safe to take the table level lock.
if (lock_tables(thd, table_list, alter_ctx->tables_opened, 0))
goto cleanup;
-
DEBUG_SYNC(thd, "alter_table_inplace_after_lock_upgrade");
THD_STAGE_INFO(thd, stage_alter_inplace_prepare);
@@ -7417,14 +7673,23 @@ static bool mysql_inplace_alter_table(THD *thd,
DEBUG_SYNC(thd, "alter_table_inplace_after_lock_downgrade");
THD_STAGE_INFO(thd, stage_alter_inplace);
+ DBUG_EXECUTE_IF("start_alter_delay_master", {
+ debug_sync_set_action(thd,
+ STRING_WITH_LEN("now wait_for alter_cont NO_CLEAR_EVENT"));
+ });
/* We can abort alter table for any table type */
thd->abort_on_warning= !ha_alter_info->ignore && thd->is_strict_mode();
res= table->file->ha_inplace_alter_table(altered_table, ha_alter_info);
thd->abort_on_warning= false;
+
+ if (start_alter_id && wait_for_master(thd))
+ goto rollback;
+
if (res)
goto rollback;
+
DEBUG_SYNC(thd, "alter_table_inplace_before_lock_upgrade");
// Upgrade to EXCLUSIVE before commit.
if (wait_while_table_is_used(thd, table, HA_EXTRA_PREPARE_FOR_RENAME))
@@ -7533,7 +7798,7 @@ static bool mysql_inplace_alter_table(THD *thd,
thd->is_error())
{
// Since changes were done in-place, we can't revert them.
- DBUG_RETURN(true);
+ goto err;
}
debug_crash_here("ddl_log_alter_after_rename_frm");
@@ -7550,7 +7815,7 @@ static bool mysql_inplace_alter_table(THD *thd,
If the rename fails we will still have a working table
with the old name, but with other changes applied.
*/
- DBUG_RETURN(true);
+ goto err;
}
debug_crash_here("ddl_log_alter_before_rename_triggers");
if (Table_triggers_list::change_table_name(thd, trigger_param,
@@ -7595,6 +7860,8 @@ static bool mysql_inplace_alter_table(THD *thd,
if (thd->locked_tables_list.reopen_tables(thd, false))
thd->locked_tables_list.unlink_all_closed_tables(thd, NULL, 0);
}
+
+err:
DBUG_RETURN(true);
}
@@ -7637,6 +7904,7 @@ void append_drop_column(THD *thd, String *str, Field *field)
}
+#ifdef WITH_PARTITION_STORAGE_ENGINE
static inline
void rename_field_in_list(Create_field *field, List<const char> *field_list)
{
@@ -7649,6 +7917,7 @@ void rename_field_in_list(Create_field *field, List<const char> *field_list)
it.replace(field->field_name.str);
}
}
+#endif
/**
@@ -7802,8 +8071,9 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
thd->calloc(sizeof(void*) * table->s->keys)) == NULL)
DBUG_RETURN(1);
- create_info->option_list= merge_engine_table_options(table->s->option_list,
- create_info->option_list, thd->mem_root);
+ if (merge_engine_options(table->s->option_list, create_info->option_list,
+ &create_info->option_list, thd->mem_root))
+ DBUG_RETURN(1);
/*
First collect all fields from table which isn't in drop_list
@@ -8374,9 +8644,10 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
key_part_length= 0; // Use whole field
}
key_part_length /= kfield->charset()->mbmaxlen;
- key_parts.push_back(new (thd->mem_root) Key_part_spec(&cfield->field_name,
- key_part_length, true),
- thd->mem_root);
+ Key_part_spec *kps= new (thd->mem_root) Key_part_spec(&cfield->field_name,
+ key_part_length, true);
+ kps->asc= !(key_part->key_part_flag & HA_REVERSE_SORT);
+ key_parts.push_back(kps, thd->mem_root);
if (!(cfield->invisible == INVISIBLE_SYSTEM && cfield->vers_sys_field()))
user_keyparts= true;
}
@@ -8435,7 +8706,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
key_type= Key::UNIQUE;
if (dropped_key_part)
{
- my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), dropped_key_part);
+ my_error(ER_KEY_COLUMN_DOES_NOT_EXIST, MYF(0), dropped_key_part);
if (long_hash_key)
{
key_info->algorithm= HA_KEY_ALG_LONG_HASH;
@@ -9361,6 +9632,153 @@ static bool log_and_ok(THD *thd)
return(0);
}
+/*
+ Wait for master to send result of Alter table.
+ Returns
+ true when Rollback is decided
+ false otherwise
+*/
+static bool wait_for_master(THD *thd)
+{
+#ifdef HAVE_REPLICATION
+ start_alter_info* info= thd->rgi_slave->sa_info;
+ Master_info *mi= thd->rgi_slave->rli->mi;
+
+ DBUG_ASSERT(info);
+ DBUG_ASSERT(info->state != start_alter_state::INVALID);
+ DBUG_ASSERT(mi);
+
+ mysql_mutex_lock(&mi->start_alter_lock);
+
+ DBUG_ASSERT(!info->direct_commit_alter ||
+ info->state == start_alter_state::ROLLBACK_ALTER);
+
+ while (info->state == start_alter_state::REGISTERED)
+ {
+ mysql_cond_wait(&info->start_alter_cond, &mi->start_alter_lock);
+ }
+ if (info->state == start_alter_state::ROLLBACK_ALTER)
+ {
+ /*
+ SA thread will not give error , We will set the error in info->error
+ and then RA worker will output the error
+ We can modify the info->error without taking mutex, because CA worker
+ will be waiting on ::COMPLETED wait condition
+ */
+ if(thd->is_error())
+ {
+ info->error= thd->get_stmt_da()->sql_errno();
+ thd->clear_error();
+ thd->reset_killed();
+ }
+ }
+ mysql_mutex_unlock(&mi->start_alter_lock);
+
+ return info->state == start_alter_state::ROLLBACK_ALTER;
+#else
+ return 0;
+#endif
+}
+
+#ifdef HAVE_REPLICATION
+/**
+ In this function, we are going to change info->state to ::COMPLETED.
+ This means we are messaging CA/RA worker that we have binlogged, so our
+ here is finished.
+
+ @param thd Thread handle
+ @param start_alter_state ALTER replicaton execution context
+ @param mi Master_info of the replication source
+*/
+static void alter_committed(THD *thd, start_alter_info* info, Master_info *mi)
+{
+ start_alter_state tmp= info->state;
+ mysql_mutex_lock(&mi->start_alter_lock);
+ info->state= start_alter_state::COMPLETED;
+ mysql_cond_broadcast(&info->start_alter_cond);
+ mysql_mutex_unlock(&mi->start_alter_lock);
+ if (tmp == start_alter_state::ROLLBACK_ALTER)
+ {
+ thd->clear_error();
+ thd->reset_killed();
+ }
+}
+#endif
+
+/**
+ process_master_state:- process the info->state recieved from master
+ We will comapre master state with alter_result
+ In the case of ROLLBACK_ALTER alter_result > 0
+ In the case of COMMIT_ALTER alter_result == 0
+ if the condition is not satisfied we will report error and
+ Return 1. Make sure wait_for_master is called before calling this function
+ This function should be called only at the write binlog time of commit/
+ rollback alter. We will alter_committed if everything is fine.
+
+ @param thd Thread handle.
+ @param alter_result Result of execution.
+ @param[in/out]
+ start_alter_id Start Alter identifier or zero,
+ it is reset to zero.
+ @param if_exists True indicates the binary logging of the query
+ should be done with "if exists" option.
+ @retval 1 error
+ @retval 0 Ok
+*/
+static int process_master_state(THD *thd, int alter_result,
+ uint64 &start_alter_id, bool if_exists)
+{
+#ifdef HAVE_REPLICATION
+ start_alter_info *info= thd->rgi_slave->sa_info;
+ bool partial_alter= false;
+
+ if (info->state == start_alter_state::INVALID)
+ {
+ /* the caller has not yet called SA logging nor wait for master decision */
+ if (!write_bin_log_start_alter(thd, partial_alter, start_alter_id,
+ if_exists))
+ wait_for_master(thd);
+
+ DBUG_ASSERT(!partial_alter);
+ }
+
+ /* this function shouldn't be called twice */
+ DBUG_ASSERT(start_alter_id);
+
+ start_alter_id= 0;
+ if ((info->state == start_alter_state::ROLLBACK_ALTER && alter_result >= 0)
+ || (info->state == start_alter_state::COMMIT_ALTER && !alter_result))
+ {
+ alter_committed(thd, info, thd->rgi_slave->rli->mi);
+ return 0;
+ }
+ else
+ {
+ thd->is_slave_error= 1;
+ return 1;
+ }
+#else
+ return 0;
+#endif
+}
+
+/*
+ Returns a (global unique) identifier of START Alter when slave applier
+ executes mysql_alter_table().
+ In non-slave context it is zero.
+*/
+static uint64 get_start_alter_id(THD *thd)
+{
+ DBUG_ASSERT(!(thd->rgi_slave &&
+ (thd->rgi_slave->gtid_ev_flags_extra &
+ Gtid_log_event::FL_START_ALTER_E1)) ||
+ !thd->rgi_slave->direct_commit_alter);
+ return
+ thd->rgi_slave &&
+ (thd->rgi_slave->gtid_ev_flags_extra & Gtid_log_event::FL_START_ALTER_E1) ?
+ thd->variables.gtid_seq_no : 0;
+}
+
/**
Alter table
@@ -9419,6 +9837,14 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db,
bool partition_changed= false;
bool fast_alter_partition= false;
#endif
+ bool partial_alter= false;
+ /*
+ start_alter_id is the gtid seq no of the START Alter - the 1st part
+ of two-phase loggable ALTER. The variable is meaningful only
+ on slave execution.
+ */
+ uint64 start_alter_id= get_start_alter_id(thd);
+
/*
Create .FRM for new version of table with a temporary name.
We don't log the statement, it will be logged later.
@@ -9557,6 +9983,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db,
}
table= table_list->table;
+ bool is_reg_table= table->s->tmp_table == NO_TMP_TABLE;
#ifdef WITH_WSREP
if (WSREP(thd) &&
@@ -9713,7 +10140,8 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db,
Table maybe does not exist, but we got an exclusive lock
on the name, now we can safely try to find out for sure.
*/
- if (ha_table_exists(thd, &alter_ctx.new_db, &alter_ctx.new_name))
+ if (!(alter_info->partition_flags & ALTER_PARTITION_CONVERT_IN) &&
+ ha_table_exists(thd, &alter_ctx.new_db, &alter_ctx.new_name))
{
/* Table will be closed in do_command() */
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), alter_ctx.new_alias.str);
@@ -9968,6 +10396,8 @@ do_continue:;
{
DBUG_RETURN(true);
}
+ if (parse_engine_part_options(thd, table))
+ DBUG_RETURN(true);
}
/*
If the old table had partitions and we are doing ALTER TABLE ...
@@ -10050,10 +10480,8 @@ do_continue:;
}
// In-place execution of ALTER TABLE for partitioning.
- DBUG_RETURN(fast_alter_partition_table(thd, table, alter_info,
- create_info, table_list,
- &alter_ctx.db,
- &alter_ctx.table_name));
+ DBUG_RETURN(fast_alter_partition_table(thd, table, alter_info, &alter_ctx,
+ create_info, table_list));
}
#endif
@@ -10355,7 +10783,8 @@ do_continue:;
&ha_alter_info,
&target_mdl_request, &ddl_log_state,
&trigger_param,
- &alter_ctx);
+ &alter_ctx, partial_alter,
+ start_alter_id, if_exists);
thd->count_cuted_fields= org_count_cuted_fields;
inplace_alter_table_committed= ha_alter_info.inplace_alter_table_committed;
inplace_alter_table_committed_argument=
@@ -10410,6 +10839,25 @@ do_continue:;
else
thd->close_unused_temporary_table_instances(table_list);
+ if (table->s->tmp_table == NO_TMP_TABLE)
+ {
+ if (write_bin_log_start_alter(thd, partial_alter, start_alter_id,
+ if_exists))
+ goto err_new_table_cleanup;
+ }
+ else if (start_alter_id)
+ {
+ DBUG_ASSERT(thd->rgi_slave);
+
+ my_error(ER_INCONSISTENT_SLAVE_TEMP_TABLE, MYF(0), thd->query(),
+ table_list->db.str, table_list->table_name.str);
+ goto err_new_table_cleanup;
+ }
+
+ DBUG_EXECUTE_IF("start_alter_delay_master", {
+ debug_sync_set_action(thd,
+ STRING_WITH_LEN("now wait_for alter_cont NO_CLEAR_EVENT"));
+ });
// It's now safe to take the table level lock.
if (lock_tables(thd, table_list, alter_ctx.tables_opened,
MYSQL_LOCK_USE_MALLOC))
@@ -10522,6 +10970,13 @@ do_continue:;
}
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
+ if (start_alter_id)
+ {
+ DBUG_ASSERT(thd->slave_thread);
+
+ if (wait_for_master(thd))
+ goto err_new_table_cleanup;
+ }
if (table->s->tmp_table != NO_TMP_TABLE)
{
/* Release lock if this is a transactional temporary table */
@@ -10565,6 +11020,9 @@ do_continue:;
binlog_commit(thd, true);
}
+ DBUG_ASSERT(!start_alter_id); // no 2 phase logging for
+ DBUG_ASSERT(!partial_alter); // temporary table alter
+
/* We don't replicate alter table statement on temporary tables */
if (!thd->is_current_stmt_binlog_format_row() &&
table_creation_was_logged &&
@@ -10803,12 +11261,26 @@ end_inplace:
DBUG_ASSERT(!(mysql_bin_log.is_open() &&
thd->is_current_stmt_binlog_format_row() &&
(create_info->tmp_table())));
- if (!binlog_as_create_select)
+
+ if(start_alter_id)
+ {
+ if (!is_reg_table)
+ {
+ my_error(ER_INCONSISTENT_SLAVE_TEMP_TABLE, MYF(0), thd->query(),
+ table_list->db.str, table_list->table_name.str);
+ DBUG_RETURN(true);
+ }
+
+ if (process_master_state(thd, 0, start_alter_id, if_exists))
+ DBUG_RETURN(true);
+ }
+ else if (!binlog_as_create_select)
{
int tmp_error;
thd->binlog_xid= thd->query_id;
ddl_log_update_xid(&ddl_log_state, thd->binlog_xid);
- tmp_error= write_bin_log_with_if_exists(thd, true, false, log_if_exists);
+ tmp_error= write_bin_log_with_if_exists(thd, true, false, log_if_exists,
+ partial_alter);
thd->binlog_xid= 0;
if (tmp_error)
goto err_cleanup;
@@ -10904,6 +11376,10 @@ err_cleanup:
/* Signal to storage engine that ddl log is committed */
(*inplace_alter_table_committed)(inplace_alter_table_committed_argument);
}
+ DEBUG_SYNC(thd, "alter_table_after_temp_table_drop");
+ if (partial_alter || start_alter_id)
+ write_bin_log_start_alter_rollback(thd, start_alter_id, partial_alter,
+ if_exists);
DBUG_RETURN(true);
err_with_mdl:
@@ -11065,6 +11541,8 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
if (!(*ptr)->vcol_info)
{
bitmap_set_bit(from->read_set, def->field->field_index);
+ if ((*ptr)->check_assignability_from(def->field, ignore))
+ goto err;
(copy_end++)->set(*ptr,def->field,0);
}
}
@@ -11152,7 +11630,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
if (ignore && !alter_ctx->fk_error_if_delete_row)
to->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
- thd->get_stmt_da()->reset_current_row_for_warning();
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
restore_record(to, s->default_values); // Create empty record
to->reset_default_fields();
@@ -11620,16 +12098,11 @@ bool check_engine(THD *thd, const char *db_name,
if (create_info->tmp_table() &&
ha_check_storage_engine_flag(*new_engine, HTON_TEMPORARY_NOT_SUPPORTED))
{
- if (create_info->used_fields & HA_CREATE_USED_ENGINE)
- {
- my_error(ER_ILLEGAL_HA_CREATE_OPTION, MYF(0),
- hton_name(*new_engine)->str, "TEMPORARY");
- *new_engine= 0;
- DBUG_RETURN(true);
- }
- *new_engine= myisam_hton;
+ my_error(ER_ILLEGAL_HA_CREATE_OPTION, MYF(0),
+ hton_name(*new_engine)->str, "TEMPORARY");
+ *new_engine= 0;
+ DBUG_RETURN(true);
}
-
lex_string_set(&create_info->new_storage_engine_name,
ha_resolve_storage_engine_name(*new_engine));
DBUG_RETURN(false);
diff --git a/sql/sql_table.h b/sql/sql_table.h
index e93c277f7e3..0f9a73c848a 100644
--- a/sql/sql_table.h
+++ b/sql/sql_table.h
@@ -20,6 +20,10 @@
#include <my_sys.h> // pthread_mutex_t
#include "m_string.h" // LEX_CUSTRING
+#define ERROR_INJECT(code) \
+ ((DBUG_IF("crash_" code) && (DBUG_SUICIDE(), 0)) || \
+ (DBUG_IF("fail_" code) && (my_error(ER_UNKNOWN_ERROR, MYF(0)), 1)))
+
class Alter_info;
class Alter_table_ctx;
class Column_definition;
@@ -53,6 +57,8 @@ enum enum_explain_filename_mode
#define WFRM_WRITE_SHADOW 1
#define WFRM_INSTALL_SHADOW 2
#define WFRM_KEEP_SHARE 4
+#define WFRM_WRITE_CONVERTED_TO 8
+#define WFRM_BACKUP_ORIGINAL 16
/* Flags for conversion functions. */
static const uint FN_FROM_IS_TMP= 1 << 0;
@@ -77,7 +83,8 @@ bool check_mysql50_prefix(const char *name);
uint build_table_filename(char *buff, size_t bufflen, const char *db,
const char *table, const char *ext, uint flags);
uint build_table_shadow_filename(char *buff, size_t bufflen,
- ALTER_PARTITION_PARAM_TYPE *lpt);
+ ALTER_PARTITION_PARAM_TYPE *lpt,
+ bool backup= false);
void build_lower_case_table_filename(char *buff, size_t bufflen,
const LEX_CSTRING *db,
const LEX_CSTRING *table,
@@ -206,7 +213,8 @@ int write_bin_log(THD *thd, bool clear_error,
char const *query, ulong query_length,
bool is_trans= FALSE);
int write_bin_log_with_if_exists(THD *thd, bool clear_error,
- bool is_trans, bool add_if_exists);
+ bool is_trans, bool add_if_exists,
+ bool commit_alter= false);
void promote_first_timestamp_column(List<Create_field> *column_definitions);
diff --git a/sql/sql_tablespace.cc b/sql/sql_tablespace.cc
deleted file mode 100644
index bfbaf185243..00000000000
--- a/sql/sql_tablespace.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
-
-/* drop and alter of tablespaces */
-
-#include "mariadb.h"
-#include "sql_priv.h"
-#include "unireg.h"
-#include "sql_tablespace.h"
-#include "sql_table.h" // write_bin_log
-#include "sql_class.h" // THD
-
-int mysql_alter_tablespace(THD *thd, st_alter_tablespace *ts_info)
-{
- int error= HA_ADMIN_NOT_IMPLEMENTED;
- handlerton *hton= ts_info->storage_engine;
-
- DBUG_ENTER("mysql_alter_tablespace");
- /*
- If the user haven't defined an engine, this will fallback to using the
- default storage engine.
- */
- if (hton == NULL)
- {
- hton= ha_default_handlerton(thd);
- if (ts_info->storage_engine != 0)
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_WARN_USING_OTHER_HANDLER,
- ER_THD(thd, ER_WARN_USING_OTHER_HANDLER),
- hton_name(hton)->str,
- ts_info->tablespace_name ? ts_info->tablespace_name
- : ts_info->logfile_group_name);
- }
-
- if (hton->alter_tablespace)
- {
- if (unlikely((error= hton->alter_tablespace(hton, thd, ts_info))))
- {
- if (error == 1)
- DBUG_RETURN(1);
-
- if (error == HA_ADMIN_NOT_IMPLEMENTED)
- my_error(ER_CHECK_NOT_IMPLEMENTED, MYF(0), "");
- else
- my_error(error, MYF(0));
-
- DBUG_RETURN(error);
- }
- }
- else
- {
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_ILLEGAL_HA_CREATE_OPTION,
- ER_THD(thd, ER_ILLEGAL_HA_CREATE_OPTION),
- hton_name(hton)->str,
- "TABLESPACE or LOGFILE GROUP");
- }
- error= write_bin_log(thd, FALSE, thd->query(), thd->query_length());
- DBUG_RETURN(error);
-}
diff --git a/sql/sql_test.cc b/sql/sql_test.cc
index bca6c21f668..479d4289406 100644
--- a/sql/sql_test.cc
+++ b/sql/sql_test.cc
@@ -264,7 +264,7 @@ static void print_keyuse(KEYUSE *keyuse)
void print_keyuse_array(DYNAMIC_ARRAY *keyuse_array)
{
DBUG_LOCK_FILE;
- fprintf(DBUG_FILE, "KEYUSE array (%d elements)\n", keyuse_array->elements);
+ fprintf(DBUG_FILE, "KEYUSE array (%zu elements)\n", keyuse_array->elements);
for(uint i=0; i < keyuse_array->elements; i++)
print_keyuse((KEYUSE*)dynamic_array_ptr(keyuse_array, i));
DBUG_UNLOCK_FILE;
diff --git a/sql/sql_tvc.cc b/sql/sql_tvc.cc
index 2a7802f077e..d1c32e7d9d3 100644
--- a/sql/sql_tvc.cc
+++ b/sql/sql_tvc.cc
@@ -422,7 +422,9 @@ bool table_value_constr::exec(SELECT_LEX *sl)
DBUG_ENTER("table_value_constr::exec");
List_iterator_fast<List_item> li(lists_of_values);
List_item *elem;
+ THD *cur_thd= sl->parent_lex->thd;
ha_rows send_records= 0;
+ int rc=0;
if (select_options & SELECT_DESCRIBE)
DBUG_RETURN(false);
@@ -438,12 +440,10 @@ bool table_value_constr::exec(SELECT_LEX *sl)
while ((elem= li++))
{
- THD *cur_thd= sl->parent_lex->thd;
+ cur_thd->get_stmt_da()->inc_current_row_for_warning();
if (send_records >= sl->master_unit()->lim.get_select_limit())
break;
- int rc=
- result->send_data_with_check(*elem, sl->master_unit(), send_records);
- cur_thd->get_stmt_da()->inc_current_row_for_warning();
+ rc= result->send_data_with_check(*elem, sl->master_unit(), send_records);
if (!rc)
send_records++;
else if (rc > 0)
diff --git a/sql/sql_type.cc b/sql/sql_type.cc
index 5335623eafd..bac93373ccb 100644
--- a/sql/sql_type.cc
+++ b/sql/sql_type.cc
@@ -1746,7 +1746,7 @@ Type_handler_time_common::type_handler_for_native_format() const
const Type_handler *Type_handler_typelib::type_handler_for_item_field() const
{
- return &type_handler_string;
+ return &type_handler_varchar;
}
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index d341206732f..eda1eb8ef9e 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -271,7 +271,7 @@ static void prepare_record_for_error_message(int error, TABLE *table)
DBUG_VOID_RETURN;
/* Create unique_map with all fields used by that index. */
- my_bitmap_init(&unique_map, unique_map_buf, table->s->fields, FALSE);
+ my_bitmap_init(&unique_map, unique_map_buf, table->s->fields);
table->mark_index_columns(keynr, &unique_map);
/* Subtract read_set and write_set. */
@@ -523,6 +523,10 @@ int mysql_update(THD *thd,
DBUG_RETURN(1); /* purecov: inspected */
}
+ if (table_list->table->check_assignability_explicit_fields(fields, values,
+ ignore))
+ DBUG_RETURN(true);
+
if (check_unique_table(thd, table_list))
DBUG_RETURN(TRUE);
@@ -1003,6 +1007,7 @@ update_begin:
THD_STAGE_INFO(thd, stage_updating);
fix_rownum_pointers(thd, thd->lex->current_select, &updated_or_same);
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
while (!(error=info.read_record()) && !thd->killed)
{
explain->tracker.on_record_read();
@@ -2081,7 +2086,9 @@ int multi_update::prepare(List<Item> &not_used_values,
*/
int error= setup_fields(thd, Ref_ptr_array(),
- *values, MARK_COLUMNS_READ, 0, NULL, 0);
+ *values, MARK_COLUMNS_READ, 0, NULL, 0) ||
+ TABLE::check_assignability_explicit_fields(*fields, *values,
+ ignore);
ti.rewind();
while ((table_ref= ti++))
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 935617e6fc5..9dea62ed021 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -290,6 +290,7 @@ void _CONCAT_UNDERSCORED(turn_parser_debug_on,yyparse)()
class With_element_head *with_element_head;
class With_clause *with_clause;
class Virtual_column_info *virtual_column;
+ engine_option_value *engine_option_value_ptr;
handlerton *db_type;
st_select_lex *select_lex;
@@ -770,6 +771,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%token <kwd> CATALOG_NAME_SYM /* SQL-2003-N */
%token <kwd> CHAIN_SYM /* SQL-2003-N */
%token <kwd> CHANGED
+%token <kwd> CHANNEL_SYM
%token <kwd> CHARSET
%token <kwd> CHECKPOINT_SYM
%token <kwd> CHECKSUM_SYM
@@ -1452,7 +1454,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
field_options last_field_options
%type <ulonglong_number>
- ulonglong_num real_ulonglong_num size_number
+ ulonglong_num real_ulonglong_num
%type <longlong_number>
longlong_num
@@ -1737,8 +1739,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%type <num> sp_handler_type sp_hcond_list
%type <spcondvalue> sp_cond sp_hcond sqlstate signal_value opt_signal_value
%type <spname> sp_name
-%type <spvar> sp_param_name sp_param_name_and_type
-%type <spvar> sp_param_name_and_type_anchored
+%type <spvar> sp_param_name sp_param_name_and_mode sp_param
+%type <spvar> sp_param_anchored
%type <for_loop> sp_for_loop_index_and_bounds
%type <for_loop_bounds> sp_for_loop_bounds
%type <trim> trim_operands
@@ -1791,6 +1793,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%type <vers_range_unit> opt_history_unit
%type <vers_history_point> history_point
%type <vers_column_versioning> with_or_without_system
+%type <engine_option_value_ptr> engine_defined_option;
%ifdef MARIADB
%type <NONE> sp_tail_standalone
@@ -2070,6 +2073,7 @@ change:
Lex->sql_command = SQLCOM_CHANGE_MASTER;
}
master_defs
+ optional_for_channel
{}
;
@@ -2301,6 +2305,34 @@ connection_name:
}
;
+optional_for_channel:
+ /* empty */
+ {
+ /*do nothing */
+ }
+ | for_channel
+
+ ;
+
+for_channel:
+ FOR_SYM CHANNEL_SYM TEXT_STRING_sys
+ {
+ if (Lex->mi.connection_name.str != NULL)
+ {
+ my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)"));
+ }
+ else
+ {
+ Lex->mi.connection_name= $3;
+#ifdef HAVE_REPLICATION
+ if (unlikely(check_master_connection_name(&$3)))
+ my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME"));
+#endif
+ }
+
+ }
+ ;
+
/* create a table */
create:
@@ -2545,14 +2577,6 @@ create:
$1 | $3)))
MYSQL_YYABORT;
}
- | CREATE LOGFILE_SYM GROUP_SYM logfile_group_info
- {
- Lex->alter_tablespace_info->ts_cmd_type= CREATE_LOGFILE_GROUP;
- }
- | CREATE TABLESPACE tablespace_info
- {
- Lex->alter_tablespace_info->ts_cmd_type= CREATE_TABLESPACE;
- }
| create_or_replace { Lex->set_command(SQLCOM_CREATE_SERVER, $1); }
server_def
{ }
@@ -3043,8 +3067,8 @@ sp_fdparam_list:
;
sp_fdparams:
- sp_fdparams ',' sp_param_name_and_type
- | sp_param_name_and_type
+ sp_fdparams ',' sp_param
+ | sp_param
;
sp_param_name:
@@ -3055,20 +3079,6 @@ sp_param_name:
}
;
-sp_param_name_and_type:
- sp_param_name field_type
- {
- if (unlikely(Lex->sp_param_fill_definition($$= $1, $2)))
- MYSQL_YYABORT;
- }
- | sp_param_name ROW_SYM row_type_body
- {
- if (unlikely(Lex->sphead->spvar_fill_row(thd, $$= $1, $3)))
- MYSQL_YYABORT;
- }
- | sp_param_name_and_type_anchored
- ;
-
/* Stored PROCEDURE parameter declaration list */
sp_pdparam_list:
/* Empty */
@@ -3076,8 +3086,8 @@ sp_pdparam_list:
;
sp_pdparams:
- sp_pdparams ',' sp_pdparam
- | sp_pdparam
+ sp_pdparams ',' sp_param
+ | sp_param
;
sp_parameter_type:
@@ -3469,6 +3479,8 @@ signal_condition_information_item_name:
{ $$= DIAG_MESSAGE_TEXT; }
| MYSQL_ERRNO_SYM
{ $$= DIAG_MYSQL_ERRNO; }
+ | ROW_NUMBER_SYM
+ { $$= DIAG_ROW_NUMBER; }
;
resignal_stmt:
@@ -3549,6 +3561,11 @@ simple_target_specification:
}
| '@' ident_or_text
{
+ if (!$2.length)
+ {
+ thd->parse_error();
+ MYSQL_YYABORT;
+ }
$$= new (thd->mem_root) Item_func_get_user_var(thd, &$2);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
@@ -3625,6 +3642,8 @@ condition_information_item_name:
{ $$= Condition_information_item::MYSQL_ERRNO; }
| RETURNED_SQLSTATE_SYM
{ $$= Condition_information_item::RETURNED_SQLSTATE; }
+ | ROW_NUMBER_SYM
+ { $$= Condition_information_item::ROW_NUMBER; }
;
sp_decl_ident:
@@ -4324,350 +4343,6 @@ trg_event:
| DELETE_SYM
{ Lex->trg_chistics.event= TRG_EVENT_DELETE; }
;
-/*
- This part of the parser contains common code for all TABLESPACE
- commands.
- CREATE TABLESPACE name ...
- ALTER TABLESPACE name CHANGE DATAFILE ...
- ALTER TABLESPACE name ADD DATAFILE ...
- ALTER TABLESPACE name access_mode
- CREATE LOGFILE GROUP_SYM name ...
- ALTER LOGFILE GROUP_SYM name ADD UNDOFILE ..
- ALTER LOGFILE GROUP_SYM name ADD REDOFILE ..
- DROP TABLESPACE name
- DROP LOGFILE GROUP_SYM name
-*/
-change_tablespace_access:
- tablespace_name
- ts_access_mode
- ;
-
-change_tablespace_info:
- tablespace_name
- CHANGE ts_datafile
- change_ts_option_list
- ;
-
-tablespace_info:
- tablespace_name
- ADD ts_datafile
- opt_logfile_group_name
- tablespace_option_list
- ;
-
-opt_logfile_group_name:
- /* empty */ {}
- | USE_SYM LOGFILE_SYM GROUP_SYM ident
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->logfile_group_name= $4.str;
- }
- ;
-
-alter_tablespace_info:
- tablespace_name
- ADD ts_datafile
- alter_tablespace_option_list
- {
- Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_ADD_FILE;
- }
- | tablespace_name
- DROP ts_datafile
- alter_tablespace_option_list
- {
- Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_DROP_FILE;
- }
- ;
-
-logfile_group_info:
- logfile_group_name
- add_log_file
- logfile_group_option_list
- ;
-
-alter_logfile_group_info:
- logfile_group_name
- add_log_file
- alter_logfile_group_option_list
- ;
-
-add_log_file:
- ADD lg_undofile
- | ADD lg_redofile
- ;
-
-change_ts_option_list:
- /* empty */ {}
- change_ts_options
- ;
-
-change_ts_options:
- change_ts_option
- | change_ts_options change_ts_option
- | change_ts_options ',' change_ts_option
- ;
-
-change_ts_option:
- opt_ts_initial_size
- | opt_ts_autoextend_size
- | opt_ts_max_size
- ;
-
-tablespace_option_list:
- tablespace_options
- ;
-
-tablespace_options:
- tablespace_option
- | tablespace_options tablespace_option
- | tablespace_options ',' tablespace_option
- ;
-
-tablespace_option:
- opt_ts_initial_size
- | opt_ts_autoextend_size
- | opt_ts_max_size
- | opt_ts_extent_size
- | opt_ts_nodegroup
- | opt_ts_engine
- | ts_wait
- | opt_ts_comment
- ;
-
-alter_tablespace_option_list:
- alter_tablespace_options
- ;
-
-alter_tablespace_options:
- alter_tablespace_option
- | alter_tablespace_options alter_tablespace_option
- | alter_tablespace_options ',' alter_tablespace_option
- ;
-
-alter_tablespace_option:
- opt_ts_initial_size
- | opt_ts_autoextend_size
- | opt_ts_max_size
- | opt_ts_engine
- | ts_wait
- ;
-
-logfile_group_option_list:
- logfile_group_options
- ;
-
-logfile_group_options:
- logfile_group_option
- | logfile_group_options logfile_group_option
- | logfile_group_options ',' logfile_group_option
- ;
-
-logfile_group_option:
- opt_ts_initial_size
- | opt_ts_undo_buffer_size
- | opt_ts_redo_buffer_size
- | opt_ts_nodegroup
- | opt_ts_engine
- | ts_wait
- | opt_ts_comment
- ;
-
-alter_logfile_group_option_list:
- alter_logfile_group_options
- ;
-
-alter_logfile_group_options:
- alter_logfile_group_option
- | alter_logfile_group_options alter_logfile_group_option
- | alter_logfile_group_options ',' alter_logfile_group_option
- ;
-
-alter_logfile_group_option:
- opt_ts_initial_size
- | opt_ts_engine
- | ts_wait
- ;
-
-
-ts_datafile:
- DATAFILE_SYM TEXT_STRING_sys
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->data_file_name= $2.str;
- }
- ;
-
-lg_undofile:
- UNDOFILE_SYM TEXT_STRING_sys
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->undo_file_name= $2.str;
- }
- ;
-
-lg_redofile:
- REDOFILE_SYM TEXT_STRING_sys
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->redo_file_name= $2.str;
- }
- ;
-
-tablespace_name:
- ident
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info= (new (thd->mem_root)
- st_alter_tablespace());
- if (unlikely(lex->alter_tablespace_info == NULL))
- MYSQL_YYABORT;
- lex->alter_tablespace_info->tablespace_name= $1.str;
- lex->sql_command= SQLCOM_ALTER_TABLESPACE;
- }
- ;
-
-logfile_group_name:
- ident
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info= (new (thd->mem_root)
- st_alter_tablespace());
- if (unlikely(lex->alter_tablespace_info == NULL))
- MYSQL_YYABORT;
- lex->alter_tablespace_info->logfile_group_name= $1.str;
- lex->sql_command= SQLCOM_ALTER_TABLESPACE;
- }
- ;
-
-ts_access_mode:
- READ_ONLY_SYM
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->ts_access_mode= TS_READ_ONLY;
- }
- | READ_WRITE_SYM
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->ts_access_mode= TS_READ_WRITE;
- }
- | NOT_SYM ACCESSIBLE_SYM
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->ts_access_mode= TS_NOT_ACCESSIBLE;
- }
- ;
-
-opt_ts_initial_size:
- INITIAL_SIZE_SYM opt_equal size_number
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->initial_size= $3;
- }
- ;
-
-opt_ts_autoextend_size:
- AUTOEXTEND_SIZE_SYM opt_equal size_number
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->autoextend_size= $3;
- }
- ;
-
-opt_ts_max_size:
- MAX_SIZE_SYM opt_equal size_number
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->max_size= $3;
- }
- ;
-
-opt_ts_extent_size:
- EXTENT_SIZE_SYM opt_equal size_number
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->extent_size= $3;
- }
- ;
-
-opt_ts_undo_buffer_size:
- UNDO_BUFFER_SIZE_SYM opt_equal size_number
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->undo_buffer_size= $3;
- }
- ;
-
-opt_ts_redo_buffer_size:
- REDO_BUFFER_SIZE_SYM opt_equal size_number
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->redo_buffer_size= $3;
- }
- ;
-
-opt_ts_nodegroup:
- NODEGROUP_SYM opt_equal real_ulong_num
- {
- LEX *lex= Lex;
- if (unlikely(lex->alter_tablespace_info->nodegroup_id != UNDEF_NODEGROUP))
- my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE,MYF(0),"NODEGROUP"));
- lex->alter_tablespace_info->nodegroup_id= $3;
- }
- ;
-
-opt_ts_comment:
- COMMENT_SYM opt_equal TEXT_STRING_sys
- {
- LEX *lex= Lex;
- if (unlikely(lex->alter_tablespace_info->ts_comment != NULL))
- my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE,MYF(0),"COMMENT"));
- lex->alter_tablespace_info->ts_comment= $3.str;
- }
- ;
-
-opt_ts_engine:
- opt_storage ENGINE_SYM opt_equal storage_engines
- {
- LEX *lex= Lex;
- if (unlikely(lex->alter_tablespace_info->storage_engine != NULL))
- my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE, MYF(0),
- "STORAGE ENGINE"));
- lex->alter_tablespace_info->storage_engine= $4;
- }
- ;
-
-opt_ts_wait:
- /* empty */
- | ts_wait
- ;
-
-ts_wait:
- WAIT_SYM
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->wait_until_completed= TRUE;
- }
- | NO_WAIT_SYM
- {
- LEX *lex= Lex;
- if (unlikely(!(lex->alter_tablespace_info->wait_until_completed)))
- my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE,MYF(0),"NO_WAIT"));
- lex->alter_tablespace_info->wait_until_completed= FALSE;
- }
- ;
-
-size_number:
- real_ulonglong_num { $$= $1;}
- | IDENT_sys
- {
- if ($1.to_size_number(&$$))
- MYSQL_YYABORT;
- }
- ;
-
-/*
- End tablespace part
-*/
create_body:
create_field_list_parens
@@ -5041,8 +4716,13 @@ part_def_list:
| part_def_list ',' part_definition {}
;
+opt_partition:
+ /* empty */
+ | PARTITION_SYM
+ ;
+
part_definition:
- PARTITION_SYM
+ opt_partition
{
partition_info *part_info= Lex->part_info;
partition_element *p_elem= new (thd->mem_root) partition_element();
@@ -5123,13 +4803,17 @@ opt_part_values:
part_values_in {}
| CURRENT_SYM
{
+#ifdef WITH_PARTITION_STORAGE_ENGINE
if (Lex->part_values_current(thd))
MYSQL_YYABORT;
+#endif
}
| HISTORY_SYM
{
+#ifdef WITH_PARTITION_STORAGE_ENGINE
if (Lex->part_values_history(thd))
MYSQL_YYABORT;
+#endif
}
| DEFAULT
{
@@ -5364,7 +5048,7 @@ sub_part_definition:
part_info->use_default_num_subpartitions= FALSE;
part_info->count_curr_subparts++;
}
- sub_name opt_part_options {}
+ sub_name opt_subpart_options {}
;
sub_name:
@@ -5378,17 +5062,36 @@ sub_name:
opt_part_options:
/* empty */ {}
- | opt_part_option_list {}
+ | part_option_list {}
;
-opt_part_option_list:
- opt_part_option_list opt_part_option {}
- | opt_part_option {}
+part_option_list:
+ part_option_list part_option {}
+ | part_option {}
;
-opt_part_option:
+part_option:
+ server_part_option {}
+ | engine_defined_option
+ {
+ $1->link(&Lex->part_info->curr_part_elem->option_list,
+ &Lex->option_list_last);
+ }
+ ;
+
+opt_subpart_options:
+ /* empty */ {}
+ | subpart_option_list {}
+ ;
+
+subpart_option_list:
+ subpart_option_list server_part_option {}
+ | server_part_option {}
+ ;
+
+server_part_option:
TABLESPACE opt_equal ident_or_text
- { Lex->part_info->curr_part_elem->tablespace_name= $3.str; }
+ { /* Compatibility with MySQL */ }
| opt_storage ENGINE_SYM opt_equal storage_engines
{
partition_info *part_info= Lex->part_info;
@@ -5728,7 +5431,7 @@ create_table_option:
Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR;
}
| TABLESPACE ident
- {Lex->create_info.tablespace= $2.str;}
+ { /* Compatiblity with MySQL */ }
| STORAGE_SYM DISK_SYM
{Lex->create_info.storage_media= HA_SM_DISK;}
| STORAGE_SYM MEMORY_SYM
@@ -5749,42 +5452,43 @@ create_table_option:
Lex->create_info.used_fields|= HA_CREATE_USED_TRANSACTIONAL;
Lex->create_info.transactional= $3;
}
- | IDENT_sys equal TEXT_STRING_sys
+ | engine_defined_option
+ {
+ $1->link(&Lex->create_info.option_list, &Lex->option_list_last);
+ }
+ | SEQUENCE_SYM opt_equal choice
+ {
+ Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE;
+ Lex->create_info.sequence= ($3 == HA_CHOICE_YES);
+ }
+ | versioning_option
+ ;
+
+engine_defined_option:
+ IDENT_sys equal TEXT_STRING_sys
{
if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH))
my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str));
- (void) new (thd->mem_root)
- engine_option_value($1, $3, true,
- &Lex->create_info.option_list,
- &Lex->option_list_last);
+ $$= new (thd->mem_root) engine_option_value($1, $3, true);
+ MYSQL_YYABORT_UNLESS($$);
}
| IDENT_sys equal ident
{
if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH))
my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str));
- (void) new (thd->mem_root)
- engine_option_value($1, $3, false,
- &Lex->create_info.option_list,
- &Lex->option_list_last);
+ $$= new (thd->mem_root) engine_option_value($1, $3, false);
+ MYSQL_YYABORT_UNLESS($$);
}
| IDENT_sys equal real_ulonglong_num
{
- (void) new (thd->mem_root)
- engine_option_value($1, $3, &Lex->create_info.option_list,
- &Lex->option_list_last, thd->mem_root);
+ $$= new (thd->mem_root) engine_option_value($1, $3, thd->mem_root);
+ MYSQL_YYABORT_UNLESS($$);
}
| IDENT_sys equal DEFAULT
{
- (void) new (thd->mem_root)
- engine_option_value($1, &Lex->create_info.option_list,
- &Lex->option_list_last);
+ $$= new (thd->mem_root) engine_option_value($1);
+ MYSQL_YYABORT_UNLESS($$);
}
- | SEQUENCE_SYM opt_equal choice
- {
- Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE;
- Lex->create_info.sequence= ($3 == HA_CHOICE_YES);
- }
- | versioning_option
;
opt_versioning_option:
@@ -5797,7 +5501,7 @@ versioning_option:
{
if (unlikely(Lex->create_info.options & HA_LEX_CREATE_TMP_TABLE))
{
- if (DBUG_EVALUATE_IF("sysvers_force", 0, 1))
+ if (!DBUG_IF("sysvers_force"))
{
my_error(ER_VERS_NOT_SUPPORTED, MYF(0), "CREATE TEMPORARY TABLE");
MYSQL_YYABORT;
@@ -6678,35 +6382,9 @@ asrow_attribute:
serial_attribute:
asrow_attribute
- | IDENT_sys equal TEXT_STRING_sys
+ | engine_defined_option
{
- if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH))
- my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str));
- (void) new (thd->mem_root)
- engine_option_value($1, $3, true,
- &Lex->last_field->option_list,
- &Lex->option_list_last);
- }
- | IDENT_sys equal ident
- {
- if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH))
- my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str));
- (void) new (thd->mem_root)
- engine_option_value($1, $3, false,
- &Lex->last_field->option_list,
- &Lex->option_list_last);
- }
- | IDENT_sys equal real_ulonglong_num
- {
- (void) new (thd->mem_root)
- engine_option_value($1, $3, &Lex->last_field->option_list,
- &Lex->option_list_last, thd->mem_root);
- }
- | IDENT_sys equal DEFAULT
- {
- (void) new (thd->mem_root)
- engine_option_value($1, &Lex->last_field->option_list,
- &Lex->option_list_last);
+ $1->link(&Lex->last_field->option_list, &Lex->option_list_last);
}
| with_or_without_system VERSIONING_SYM
{
@@ -7112,33 +6790,9 @@ all_key_opt:
{
Lex->last_key->key_create_info.is_ignored= $1;
}
- | IDENT_sys equal TEXT_STRING_sys
- {
- if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH))
- my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str));
- (void) new (thd->mem_root)
- engine_option_value($1, $3, true, &Lex->option_list,
- &Lex->option_list_last);
- }
- | IDENT_sys equal ident
+ | engine_defined_option
{
- if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH))
- my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str));
- (void) new (thd->mem_root)
- engine_option_value($1, $3, false, &Lex->option_list,
- &Lex->option_list_last);
- }
- | IDENT_sys equal real_ulonglong_num
- {
- (void) new (thd->mem_root)
- engine_option_value($1, $3, &Lex->option_list,
- &Lex->option_list_last, thd->mem_root);
- }
- | IDENT_sys equal DEFAULT
- {
- (void) new (thd->mem_root)
- engine_option_value($1, &Lex->option_list,
- &Lex->option_list_last);
+ $1->link(&Lex->option_list, &Lex->option_list_last);
}
;
@@ -7176,10 +6830,12 @@ ignorability:
key_list:
key_list ',' key_part order_dir
{
+ $3->asc= $4;
Lex->last_key->columns.push_back($3, thd->mem_root);
}
| key_part order_dir
{
+ $1->asc= $2;
Lex->last_key->columns.push_back($1, thd->mem_root);
}
;
@@ -7383,26 +7039,6 @@ alter:
Lex->pop_select(); //main select
}
- | ALTER TABLESPACE alter_tablespace_info
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->ts_cmd_type= ALTER_TABLESPACE;
- }
- | ALTER LOGFILE_SYM GROUP_SYM alter_logfile_group_info
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->ts_cmd_type= ALTER_LOGFILE_GROUP;
- }
- | ALTER TABLESPACE change_tablespace_info
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->ts_cmd_type= CHANGE_FILE_TABLESPACE;
- }
- | ALTER TABLESPACE change_tablespace_access
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->ts_cmd_type= ALTER_ACCESS_MODE_TABLESPACE;
- }
| ALTER SERVER_SYM ident_or_text
{
LEX *lex= Lex;
@@ -7636,6 +7272,54 @@ alter_commands:
if (Lex->stmt_alter_table_exchange_partition($6))
MYSQL_YYABORT;
}
+ | CONVERT_SYM PARTITION_SYM alt_part_name_item
+ TO_SYM TABLE_SYM table_ident have_partitioning
+ {
+ LEX *lex= Lex;
+ if (Lex->stmt_alter_table($6))
+ MYSQL_YYABORT;
+ lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table();
+ if (unlikely(lex->m_sql_cmd == NULL))
+ MYSQL_YYABORT;
+ lex->alter_info.partition_flags|= ALTER_PARTITION_CONVERT_OUT;
+ }
+ | CONVERT_SYM TABLE_SYM table_ident
+ {
+ LEX *lex= Lex;
+ if (!lex->first_select_lex()->add_table_to_list(thd, $3, nullptr, 0,
+ TL_READ_NO_INSERT,
+ MDL_SHARED_NO_WRITE))
+ MYSQL_YYABORT;
+
+ /*
+ This will appear as (new_db, new_name) in alter_ctx.
+ new_db will be IX-locked and new_name X-locked.
+ */
+ lex->first_select_lex()->db= $3->db;
+ lex->name= $3->table;
+ if (lex->first_select_lex()->db.str == NULL &&
+ lex->copy_db_to(&lex->first_select_lex()->db))
+ MYSQL_YYABORT;
+
+ lex->part_info= new (thd->mem_root) partition_info();
+ if (unlikely(!lex->part_info))
+ MYSQL_YYABORT;
+
+ lex->part_info->num_parts= 1;
+ /*
+ OR-ed with ALTER_PARTITION_ADD because too many checks of
+ ALTER_PARTITION_ADD required.
+ */
+ lex->alter_info.partition_flags|= ALTER_PARTITION_ADD |
+ ALTER_PARTITION_CONVERT_IN;
+ }
+ TO_SYM PARTITION_SYM part_definition
+ {
+ LEX *lex= Lex;
+ lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table();
+ if (unlikely(lex->m_sql_cmd == NULL))
+ MYSQL_YYABORT;
+ }
;
remove_partitioning:
@@ -7884,17 +7568,9 @@ alter_list_item:
}
| RENAME opt_to table_ident
{
- LEX *lex=Lex;
- lex->first_select_lex()->db= $3->db;
- if (lex->first_select_lex()->db.str == NULL &&
- lex->copy_db_to(&lex->first_select_lex()->db))
+ if (Lex->stmt_alter_table($3))
MYSQL_YYABORT;
- if (unlikely(check_table_name($3->table.str,$3->table.length,
- FALSE)) ||
- ($3->db.str && unlikely(check_db_name((LEX_STRING*) &$3->db))))
- my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), $3->table.str));
- lex->name= $3->table;
- lex->alter_info.flags|= ALTER_RENAME;
+ Lex->alter_info.flags|= ALTER_RENAME;
}
| RENAME COLUMN_SYM opt_if_exists_table_element ident TO_SYM ident
{
@@ -8061,7 +7737,7 @@ opt_to:
;
slave:
- START_SYM SLAVE optional_connection_name slave_thread_opts
+ START_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel
{
LEX *lex=Lex;
lex->sql_command = SQLCOM_SLAVE_START;
@@ -8078,7 +7754,7 @@ slave:
/* If you change this code don't forget to update STOP SLAVE too */
}
{}
- | STOP_SYM SLAVE optional_connection_name slave_thread_opts
+ | STOP_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel
{
LEX *lex=Lex;
lex->sql_command = SQLCOM_SLAVE_STOP;
@@ -11307,6 +10983,11 @@ variable_aux:
ident_or_text SET_VAR expr
{
Item_func_set_user_var *item;
+ if (!$1.length)
+ {
+ thd->parse_error();
+ MYSQL_YYABORT;
+ }
$$= item= new (thd->mem_root) Item_func_set_user_var(thd, &$1, $3);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
@@ -11316,6 +10997,11 @@ variable_aux:
}
| ident_or_text
{
+ if (!$1.length)
+ {
+ thd->parse_error();
+ MYSQL_YYABORT;
+ }
$$= new (thd->mem_root) Item_func_get_user_var(thd, &$1);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
@@ -12969,6 +12655,12 @@ select_var_ident: select_outvar
select_outvar:
'@' ident_or_text
{
+ if (!$2.length)
+ {
+ thd->parse_error();
+ MYSQL_YYABORT;
+ }
+
$$ = Lex->result ? new (thd->mem_root) my_var_user(&$2) : NULL;
}
| ident_or_text
@@ -13117,16 +12809,6 @@ drop:
lex->set_command(SQLCOM_DROP_TRIGGER, $3);
lex->spname= $4;
}
- | DROP TABLESPACE tablespace_name opt_ts_engine opt_ts_wait
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->ts_cmd_type= DROP_TABLESPACE;
- }
- | DROP LOGFILE_SYM GROUP_SYM logfile_group_name opt_ts_engine opt_ts_wait
- {
- LEX *lex= Lex;
- lex->alter_tablespace_info->ts_cmd_type= DROP_LOGFILE_GROUP;
- }
| DROP SERVER_SYM opt_if_exists ident_or_text
{
Lex->set_command(SQLCOM_DROP_SERVER, $3);
@@ -13231,6 +12913,8 @@ insert:
{
Lex->sql_command= SQLCOM_INSERT;
Lex->duplicates= DUP_ERROR;
+ thd->get_stmt_da()->opt_clear_warning_info(thd->query_id);
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
}
insert_start insert_lock_option opt_ignore opt_into insert_table
{
@@ -13240,6 +12924,7 @@ insert:
stmt_end
{
Lex->mark_first_table_as_inserting();
+ thd->get_stmt_da()->reset_current_row_for_warning(0);
}
;
@@ -13248,6 +12933,8 @@ replace:
{
Lex->sql_command = SQLCOM_REPLACE;
Lex->duplicates= DUP_REPLACE;
+ thd->get_stmt_da()->opt_clear_warning_info(thd->query_id);
+ thd->get_stmt_da()->reset_current_row_for_warning(1);
}
insert_start replace_lock_option opt_into insert_table
{
@@ -13257,6 +12944,7 @@ replace:
stmt_end
{
Lex->mark_first_table_as_inserting();
+ thd->get_stmt_da()->reset_current_row_for_warning(0);
}
;
@@ -13408,6 +13096,7 @@ no_braces:
opt_values ')'
{
LEX *lex=Lex;
+ thd->get_stmt_da()->inc_current_row_for_warning();
if (unlikely(lex->many_values.push_back(lex->insert_list,
thd->mem_root)))
MYSQL_YYABORT;
@@ -13423,6 +13112,7 @@ no_braces_with_names:
opt_values_with_names ')'
{
LEX *lex=Lex;
+ thd->get_stmt_da()->inc_current_row_for_warning();
if (unlikely(lex->many_values.push_back(lex->insert_list,
thd->mem_root)))
MYSQL_YYABORT;
@@ -14002,7 +13692,8 @@ show_param:
LEX *lex= Lex;
lex->sql_command= SQLCOM_SHOW_RELAYLOG_EVENTS;
}
- opt_global_limit_clause
+ opt_global_limit_clause optional_for_channel
+ { }
| keys_or_index from_or_in table_ident opt_db opt_where_clause
{
LEX *lex= Lex;
@@ -14147,16 +13838,7 @@ show_param:
MYSQL_YYABORT;
Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT;
}
- | SLAVE STATUS_SYM
- {
- LEX *lex= thd->lex;
- lex->mi.connection_name= null_clex_str;
- if (!(lex->m_sql_cmd= new (thd->mem_root)
- Sql_cmd_show_slave_status()))
- MYSQL_YYABORT;
- lex->sql_command = SQLCOM_SHOW_SLAVE_STAT;
- }
- | SLAVE connection_name STATUS_SYM
+ | SLAVE optional_connection_name STATUS_SYM optional_for_channel
{
if (!(Lex->m_sql_cmd= new (thd->mem_root)
Sql_cmd_show_slave_status()))
@@ -14541,7 +14223,7 @@ flush_option:
{ Lex->type|= REFRESH_SLOW_LOG; }
| BINARY LOGS_SYM opt_delete_gtid_domain
{ Lex->type|= REFRESH_BINARY_LOG; }
- | RELAY LOGS_SYM optional_connection_name
+ | RELAY LOGS_SYM optional_connection_name optional_for_channel
{
LEX *lex= Lex;
if (unlikely(lex->type & REFRESH_RELAY_LOG))
@@ -14692,7 +14374,8 @@ reset_options:
reset_option:
SLAVE { Lex->type|= REFRESH_SLAVE; }
optional_connection_name
- slave_reset_options { }
+ slave_reset_options optional_for_channel
+ { }
| MASTER_SYM
{
Lex->type|= REFRESH_MASTER;
@@ -14982,6 +14665,12 @@ field_or_var:
simple_ident_nospvar {$$= $1;}
| '@' ident_or_text
{
+ if (!$2.length)
+ {
+ thd->parse_error();
+ MYSQL_YYABORT;
+ }
+
$$= new (thd->mem_root) Item_user_var_as_out_param(thd, &$2);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
@@ -15990,6 +15679,7 @@ keyword_sp_var_and_label:
| CASCADED
| CATALOG_NAME_SYM
| CHAIN_SYM
+ | CHANNEL_SYM
| CHANGED
| CIPHER_SYM
| CLIENT_SYM
@@ -16797,6 +16487,12 @@ option_value_no_option_type:
}
| '@' ident_or_text equal
{
+ if (!$2.length)
+ {
+ thd->parse_error();
+ MYSQL_YYABORT;
+ }
+
if (sp_create_assignment_lex(thd, $1.str))
MYSQL_YYABORT;
}
@@ -18371,11 +18067,6 @@ sp_opt_default:
| DEFAULT expr { $$ = $2; }
;
-sp_pdparam:
- sp_parameter_type sp_param_name_and_type { $2->mode=$1; }
- | sp_param_name_and_type { $1->mode= sp_variable::MODE_IN; }
- ;
-
sp_decl_variable_list_anchored:
sp_decl_idents_init_vars
TYPE_SYM OF_SYM optionally_qualified_column_ident
@@ -18395,26 +18086,49 @@ sp_decl_variable_list_anchored:
}
;
-sp_param_name_and_type_anchored:
- sp_param_name TYPE_SYM OF_SYM ident '.' ident
+sp_param_name_and_mode:
+ sp_parameter_type sp_param_name
+ {
+ $2->mode= $1;
+ $$= $2;
+ }
+ | sp_param_name
+ ;
+
+sp_param:
+ sp_param_name_and_mode field_type
+ {
+ if (unlikely(Lex->sp_param_fill_definition($$= $1, $2)))
+ MYSQL_YYABORT;
+ }
+ | sp_param_name_and_mode ROW_SYM row_type_body
+ {
+ if (unlikely(Lex->sphead->spvar_fill_row(thd, $$= $1, $3)))
+ MYSQL_YYABORT;
+ }
+ | sp_param_anchored
+ ;
+
+sp_param_anchored:
+ sp_param_name_and_mode TYPE_SYM OF_SYM ident '.' ident
{
if (unlikely(Lex->sphead->spvar_fill_type_reference(thd,
$$= $1, $4,
$6)))
MYSQL_YYABORT;
}
- | sp_param_name TYPE_SYM OF_SYM ident '.' ident '.' ident
+ | sp_param_name_and_mode TYPE_SYM OF_SYM ident '.' ident '.' ident
{
if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1,
$4, $6, $8)))
MYSQL_YYABORT;
}
- | sp_param_name ROW_SYM TYPE_SYM OF_SYM ident
+ | sp_param_name_and_mode ROW_SYM TYPE_SYM OF_SYM ident
{
if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $5)))
MYSQL_YYABORT;
}
- | sp_param_name ROW_SYM TYPE_SYM OF_SYM ident '.' ident
+ | sp_param_name_and_mode ROW_SYM TYPE_SYM OF_SYM ident '.' ident
{
if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $5, $7)))
MYSQL_YYABORT;
@@ -18817,46 +18531,6 @@ sp_opt_inout:
| IN_SYM OUT_SYM { $$= sp_variable::MODE_INOUT; }
;
-sp_pdparam:
- sp_param_name sp_opt_inout field_type
- {
- $1->mode= $2;
- if (unlikely(Lex->sp_param_fill_definition($1, $3)))
- MYSQL_YYABORT;
- }
- | sp_param_name sp_opt_inout sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
- {
- $1->mode= $2;
- if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $1, $3, $5)))
- MYSQL_YYABORT;
- }
- | sp_param_name sp_opt_inout sp_decl_ident '.' ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
- {
- $1->mode= $2;
- if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $1, $3, $5, $7)))
- MYSQL_YYABORT;
- }
- | sp_param_name sp_opt_inout sp_decl_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
- {
- $1->mode= $2;
- if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $1, $3)))
- MYSQL_YYABORT;
- }
- | sp_param_name sp_opt_inout sp_decl_ident '.' ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
- {
- $1->mode= $2;
- if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $1, $3, $5)))
- MYSQL_YYABORT;
- }
- | sp_param_name sp_opt_inout ROW_SYM row_type_body
- {
- $1->mode= $2;
- if (unlikely(Lex->sphead->spvar_fill_row(thd, $1, $4)))
- MYSQL_YYABORT;
- }
- ;
-
-
sp_proc_stmts1_implicit_block:
{
Lex->sp_block_init(thd);
@@ -19290,23 +18964,45 @@ sp_decl_variable_list_anchored:
}
;
-sp_param_name_and_type_anchored:
- sp_param_name sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
+sp_param_name_and_mode:
+ sp_param_name sp_opt_inout
+ {
+ $1->mode= $2;
+ $$= $1;
+ }
+ ;
+
+sp_param:
+ sp_param_name_and_mode field_type
+ {
+ if (unlikely(Lex->sp_param_fill_definition($$= $1, $2)))
+ MYSQL_YYABORT;
+ }
+ | sp_param_name_and_mode ROW_SYM row_type_body
+ {
+ if (unlikely(Lex->sphead->spvar_fill_row(thd, $$= $1, $3)))
+ MYSQL_YYABORT;
+ }
+ | sp_param_anchored
+ ;
+
+sp_param_anchored:
+ sp_param_name_and_mode sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
{
if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1, $2, $4)))
MYSQL_YYABORT;
}
- | sp_param_name sp_decl_ident '.' ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
+ | sp_param_name_and_mode sp_decl_ident '.' ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
{
if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1, $2, $4, $6)))
MYSQL_YYABORT;
}
- | sp_param_name sp_decl_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
+ | sp_param_name_and_mode sp_decl_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
{
if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $2)))
MYSQL_YYABORT;
}
- | sp_param_name sp_decl_ident '.' ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
+ | sp_param_name_and_mode sp_decl_ident '.' ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
{
if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $2, $4)))
MYSQL_YYABORT;
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index ffa301df12b..7d0d4ecc2d6 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -741,6 +741,23 @@ static Sys_var_charptr_fscs Sys_character_sets_dir(
READ_ONLY GLOBAL_VAR(charsets_dir), CMD_LINE(REQUIRED_ARG),
DEFAULT(0));
+static bool check_engine_supports_temporary(sys_var *self, THD *thd, set_var *var)
+{
+ plugin_ref plugin= var->save_result.plugin;
+ if (!plugin)
+ return false;
+ DBUG_ASSERT(plugin);
+ handlerton *hton= plugin_hton(plugin);
+ DBUG_ASSERT(hton);
+ if (ha_check_storage_engine_flag(hton, HTON_TEMPORARY_NOT_SUPPORTED))
+ {
+ my_error(ER_ILLEGAL_HA_CREATE_OPTION, MYF(0), hton_name(hton)->str,
+ "TEMPORARY");
+ return true;
+ }
+ return false;
+}
+
static bool check_not_null(sys_var *self, THD *thd, set_var *var)
{
return var->value && var->value->is_null();
@@ -2396,6 +2413,12 @@ static Sys_var_bit Sys_skip_parallel_replication(
SESSION_ONLY(option_bits), NO_CMD_LINE, OPTION_RPL_SKIP_PARALLEL,
DEFAULT(FALSE));
+static Sys_var_mybool Sys_binlog_alter_two_phase(
+ "binlog_alter_two_phase",
+ "When set, split ALTER at binary logging into 2 statements: "
+ "START ALTER and COMMIT/ROLLBACK ALTER",
+ SESSION_VAR(binlog_alter_two_phase), CMD_LINE(OPT_ARG),
+ DEFAULT(FALSE));
static bool
check_gtid_ignore_duplicates(sys_var *self, THD *thd, set_var *var)
@@ -4264,7 +4287,8 @@ static Sys_var_plugin Sys_storage_engine(
static Sys_var_plugin Sys_default_tmp_storage_engine(
"default_tmp_storage_engine", "The default storage engine for user-created temporary tables",
SESSION_VAR(tmp_table_plugin), NO_CMD_LINE,
- MYSQL_STORAGE_ENGINE_PLUGIN, DEFAULT(&default_tmp_storage_engine));
+ MYSQL_STORAGE_ENGINE_PLUGIN, DEFAULT(&default_tmp_storage_engine),
+ NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_engine_supports_temporary));
static Sys_var_plugin Sys_enforce_storage_engine(
"enforce_storage_engine", "Force the use of a storage engine for new tables",
@@ -4470,10 +4494,7 @@ static bool fix_sql_log_bin_after_update(sys_var *self, THD *thd,
{
DBUG_ASSERT(type == OPT_SESSION);
- if (thd->variables.sql_log_bin)
- thd->variables.option_bits |= OPTION_BIN_LOG;
- else
- thd->variables.option_bits &= ~OPTION_BIN_LOG;
+ thd->set_binlog_bit();
return FALSE;
}
@@ -4903,7 +4924,9 @@ static Sys_var_mybool Sys_keep_files_on_create(
"keep_files_on_create",
"Don't overwrite stale .MYD and .MYI even if no directory is specified",
SESSION_VAR(keep_files_on_create), CMD_LINE(OPT_ARG),
- DEFAULT(FALSE));
+ DEFAULT(FALSE),
+ NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(0),
+ DEPRECATED("")); // since 10.8.0
static char *license;
static Sys_var_charptr Sys_license(
@@ -6040,16 +6063,6 @@ static Sys_var_mybool Sys_wsrep_desync (
ON_CHECK(wsrep_desync_check),
ON_UPDATE(wsrep_desync_update));
-static Sys_var_mybool Sys_wsrep_strict_ddl (
- "wsrep_strict_ddl",
- "If set, reject DDL on affected tables not supporting Galera replication",
- GLOBAL_VAR(wsrep_strict_ddl),
- CMD_LINE(OPT_ARG), DEFAULT(FALSE),
- NO_MUTEX_GUARD, NOT_IN_BINLOG,
- ON_CHECK(0),
- ON_UPDATE(wsrep_strict_ddl_update),
- DEPRECATED("'@@wsrep_mode=STRICT_REPLICATION'")); // since 10.6.0
-
static const char *wsrep_reject_queries_names[]= { "NONE", "ALL", "ALL_KILL", NullS };
static Sys_var_enum Sys_wsrep_reject_queries(
"wsrep_reject_queries", "Variable to set to reject queries",
@@ -6070,13 +6083,6 @@ static Sys_var_mybool Sys_wsrep_recover_datadir(
READ_ONLY GLOBAL_VAR(wsrep_recovery),
CMD_LINE(OPT_ARG), DEFAULT(FALSE));
-static Sys_var_mybool Sys_wsrep_replicate_myisam(
- "wsrep_replicate_myisam", "To enable myisam replication",
- GLOBAL_VAR(wsrep_replicate_myisam), CMD_LINE(OPT_ARG), DEFAULT(FALSE),
- NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0),
- ON_UPDATE(wsrep_replicate_myisam_update),
- DEPRECATED("'@@wsrep_mode=REPLICATE_MYISAM'")); // since 10.6.0
-
static Sys_var_mybool Sys_wsrep_log_conflicts(
"wsrep_log_conflicts", "To log multi-master conflicts",
GLOBAL_VAR(wsrep_log_conflicts), CMD_LINE(OPT_ARG), DEFAULT(FALSE));
@@ -6520,7 +6526,8 @@ static Sys_var_enum Sys_histogram_type(
"Specifies type of the histograms created by ANALYZE. "
"Possible values are: "
"SINGLE_PREC_HB - single precision height-balanced, "
- "DOUBLE_PREC_HB - double precision height-balanced.",
+ "DOUBLE_PREC_HB - double precision height-balanced, "
+ "JSON_HB - height-balanced, stored as JSON.",
SESSION_VAR(histogram_type), CMD_LINE(REQUIRED_ARG),
histogram_types, DEFAULT(1));
diff --git a/sql/table.cc b/sql/table.cc
index 5e2087370f2..4faf6e4e16b 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -2685,11 +2685,9 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
{
auto field_type= handler->real_field_type();
- if (DBUG_EVALUATE_IF("error_vers_wrong_type", 1, 0))
- field_type= MYSQL_TYPE_BLOB;
+ DBUG_EXECUTE_IF("error_vers_wrong_type", field_type= MYSQL_TYPE_BLOB;);
- switch (field_type)
- {
+ switch (field_type) {
case MYSQL_TYPE_TIMESTAMP2:
break;
case MYSQL_TYPE_LONGLONG:
@@ -3370,7 +3368,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
share->column_bitmap_size *
bitmap_count)))
goto err;
- my_bitmap_init(&share->all_set, bitmaps, share->fields, FALSE);
+ my_bitmap_init(&share->all_set, bitmaps, share->fields);
bitmap_set_all(&share->all_set);
if (share->check_set)
{
@@ -3381,7 +3379,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
my_bitmap_init(share->check_set,
(my_bitmap_map*) ((uchar*) bitmaps +
share->column_bitmap_size),
- share->fields, FALSE);
+ share->fields);
bitmap_clear_all(share->check_set);
}
@@ -4353,6 +4351,8 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
thd->restore_active_arena(&part_func_arena, &backup_arena);
goto partititon_err;
}
+ if (parse_engine_part_options(thd, outparam))
+ goto err;
outparam->part_info->is_auto_partitioned= share->auto_partitioned;
DBUG_PRINT("info", ("autopartitioned: %u", share->auto_partitioned));
/*
@@ -4409,26 +4409,26 @@ partititon_err:
goto err;
my_bitmap_init(&outparam->def_read_set,
- (my_bitmap_map*) bitmaps, share->fields, FALSE);
+ (my_bitmap_map*) bitmaps, share->fields);
bitmaps+= bitmap_size;
my_bitmap_init(&outparam->def_write_set,
- (my_bitmap_map*) bitmaps, share->fields, FALSE);
+ (my_bitmap_map*) bitmaps, share->fields);
bitmaps+= bitmap_size;
my_bitmap_init(&outparam->has_value_set,
- (my_bitmap_map*) bitmaps, share->fields, FALSE);
+ (my_bitmap_map*) bitmaps, share->fields);
bitmaps+= bitmap_size;
my_bitmap_init(&outparam->tmp_set,
- (my_bitmap_map*) bitmaps, share->fields, FALSE);
+ (my_bitmap_map*) bitmaps, share->fields);
bitmaps+= bitmap_size;
my_bitmap_init(&outparam->eq_join_set,
- (my_bitmap_map*) bitmaps, share->fields, FALSE);
+ (my_bitmap_map*) bitmaps, share->fields);
bitmaps+= bitmap_size;
my_bitmap_init(&outparam->cond_set,
- (my_bitmap_map*) bitmaps, share->fields, FALSE);
+ (my_bitmap_map*) bitmaps, share->fields);
bitmaps+= bitmap_size;
my_bitmap_init(&outparam->def_rpl_write_set,
- (my_bitmap_map*) bitmaps, share->fields, FALSE);
+ (my_bitmap_map*) bitmaps, share->fields);
outparam->default_column_bitmaps();
outparam->cond_selectivity= 1.0;
@@ -9306,6 +9306,62 @@ bool TABLE::validate_default_values_of_unset_fields(THD *thd) const
}
+/*
+ Check assignment compatibility of a value list against an explicitly
+ specified field list, e.g.
+ INSERT INTO t1 (a,b) VALUES (1,2);
+*/
+bool TABLE::check_assignability_explicit_fields(List<Item> fields,
+ List<Item> values,
+ bool ignore)
+{
+ DBUG_ENTER("TABLE::check_assignability_explicit_fields");
+ DBUG_ASSERT(fields.elements == values.elements);
+
+ List_iterator<Item> fi(fields);
+ List_iterator<Item> vi(values);
+ Item *f, *value;
+ while ((f= fi++) && (value= vi++))
+ {
+ Item_field *item_field= f->field_for_view_update();
+ if (!item_field)
+ {
+ /*
+ A non-updatable field of a view found.
+ This scenario is caught later and an error is raised.
+ We could eventually move error reporting here. For now just continue.
+ */
+ continue;
+ }
+ if (value->check_assignability_to(item_field->field, ignore))
+ DBUG_RETURN(true);
+ }
+ DBUG_RETURN(false);
+}
+
+
+/*
+ Check assignment compatibility for a value list against
+ all visible fields of the table, e.g.
+ INSERT INTO t1 VALUES (1,2);
+*/
+bool TABLE::check_assignability_all_visible_fields(List<Item> &values,
+ bool ignore) const
+{
+ DBUG_ENTER("TABLE::check_assignability_all_visible_fields");
+ DBUG_ASSERT(s->visible_fields == values.elements);
+
+ List_iterator<Item> vi(values);
+ for (uint i= 0; i < s->fields; i++)
+ {
+ if (!field[i]->invisible &&
+ (vi++)->check_assignability_to(field[i], ignore))
+ DBUG_RETURN(true);
+ }
+ DBUG_RETURN(false);
+}
+
+
bool TABLE::insert_all_rows_into_tmp_table(THD *thd,
TABLE *tmp_table,
TMP_TABLE_PARAM *tmp_table_param,
@@ -9973,6 +10029,9 @@ bool TR_table::update(ulonglong start_id, ulonglong end_id)
int error= table->file->ha_write_row(table->record[0]);
if (unlikely(error))
table->file->print_error(error, MYF(0));
+ /* extra() is used to apply the bulk insert operation
+ on mysql/transaction_registry table */
+ table->file->extra(HA_EXTRA_IGNORE_INSERT);
return error;
}
diff --git a/sql/table.h b/sql/table.h
index 7f3fcc06cea..66b8d560d0c 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -694,16 +694,21 @@ class TABLE_STATISTICS_CB
public:
MEM_ROOT mem_root; /* MEM_ROOT to allocate statistical data for the table */
Table_statistics *table_stats; /* Structure to access the statistical data */
- ulong total_hist_size; /* Total size of all histograms */
+
+ /*
+ Whether the table has histograms.
+ (If the table has none, histograms_are_ready() can finish sooner)
+ */
+ bool have_histograms;
bool histograms_are_ready() const
{
- return !total_hist_size || hist_state.is_ready();
+ return !have_histograms || hist_state.is_ready();
}
bool start_histograms_load()
{
- return total_hist_size && hist_state.start_load();
+ return have_histograms && hist_state.start_load();
}
void end_histograms_load() { hist_state.end_load(); }
@@ -1725,6 +1730,30 @@ public:
Field **field_to_fill();
bool validate_default_values_of_unset_fields(THD *thd) const;
+ // Check if the value list is assignable to the explicit field list
+ static bool check_assignability_explicit_fields(List<Item> fields,
+ List<Item> values,
+ bool ignore);
+ // Check if the value list is assignable to all visible fields
+ bool check_assignability_all_visible_fields(List<Item> &values,
+ bool ignore) const;
+ /*
+ Check if the value list is assignable to:
+ - The explicit field list if fields.elements > 0, e.g.
+ INSERT INTO t1 (a,b) VALUES (1,2);
+ - All visible fields, if fields.elements==0, e.g.
+ INSERT INTO t1 VALUES (1,2);
+ */
+ bool check_assignability_opt_fields(List<Item> fields,
+ List<Item> values,
+ bool ignore) const
+ {
+ DBUG_ASSERT(values.elements);
+ return fields.elements ?
+ check_assignability_explicit_fields(fields, values, ignore) :
+ check_assignability_all_visible_fields(values, ignore);
+ }
+
bool insert_all_rows_into_tmp_table(THD *thd,
TABLE *tmp_table,
TMP_TABLE_PARAM *tmp_table_param,
diff --git a/sql/temporary_tables.cc b/sql/temporary_tables.cc
index 8555aa1a7f5..3ba6a772549 100644
--- a/sql/temporary_tables.cc
+++ b/sql/temporary_tables.cc
@@ -340,7 +340,8 @@ bool THD::open_temporary_table(TABLE_LIST *tl)
*/
DBUG_ASSERT(!tl->derived);
DBUG_ASSERT(!tl->schema_table);
- DBUG_ASSERT(has_temporary_tables());
+ DBUG_ASSERT(has_temporary_tables() ||
+ (rgi_slave && rgi_slave->is_parallel_exec));
if (tl->open_type == OT_BASE_ONLY)
{
@@ -878,12 +879,20 @@ void THD::restore_tmp_table_share(TMP_TABLE_SHARE *share)
bool THD::has_temporary_tables()
{
DBUG_ENTER("THD::has_temporary_tables");
- bool result=
+ bool result;
#ifdef HAVE_REPLICATION
- rgi_slave ? (rgi_slave->rli->save_temporary_tables &&
- !rgi_slave->rli->save_temporary_tables->is_empty()) :
+ if (rgi_slave)
+ {
+ mysql_mutex_lock(&rgi_slave->rli->data_lock);
+ result= rgi_slave->rli->save_temporary_tables &&
+ !rgi_slave->rli->save_temporary_tables->is_empty();
+ mysql_mutex_unlock(&rgi_slave->rli->data_lock);
+ }
+ else
#endif
- has_thd_temporary_tables();
+ {
+ result= has_thd_temporary_tables();
+ }
DBUG_RETURN(result);
}
diff --git a/sql/thread_pool_info.cc b/sql/thread_pool_info.cc
index 90ac6871784..e3ffd160a11 100644
--- a/sql/thread_pool_info.cc
+++ b/sql/thread_pool_info.cc
@@ -14,9 +14,9 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 - 1301 USA*/
#include <mysql_version.h>
-#include <mysql/plugin.h>
#include <my_global.h>
+#include <mysql/plugin.h>
#include <sql_class.h>
#include <sql_i_s.h>
#include <mysql/plugin.h>
diff --git a/sql/tztime.cc b/sql/tztime.cc
index 8286744e192..8e1a8805d96 100644
--- a/sql/tztime.cc
+++ b/sql/tztime.cc
@@ -2004,7 +2004,11 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
#endif
/* ttid is increasing because we are reading using index */
- DBUG_ASSERT(ttid >= tmp_tz_info.typecnt);
+ if (ttid < tmp_tz_info.typecnt)
+ {
+ sql_print_error("mysql.time_zone_transition_type table is incorrectly defined or corrupted");
+ goto end;
+ }
tmp_tz_info.typecnt= ttid + 1;
@@ -2517,7 +2521,7 @@ scan_tz_dir(char * name_end, uint symlink_recursion_level, uint verbose)
{
MY_DIR *cur_dir;
char *name_end_tmp;
- uint i;
+ size_t i;
/* Sort directory data, to pass mtr tests on different platforms. */
if (!(cur_dir= my_dir(fullname, MYF(MY_WANT_STAT|MY_WANT_SORT))))
diff --git a/sql/uniques.cc b/sql/uniques.cc
index a0cebe3e4dd..572d80f0b64 100644
--- a/sql/uniques.cc
+++ b/sql/uniques.cc
@@ -709,7 +709,7 @@ bool Unique::merge(TABLE *table, uchar *buff, size_t buff_size,
{
IO_CACHE *outfile= &sort.io_cache;
Merge_chunk *file_ptr= (Merge_chunk*) file_ptrs.buffer;
- uint maxbuffer= file_ptrs.elements - 1;
+ uint maxbuffer= (uint)file_ptrs.elements - 1;
my_off_t save_pos;
bool error= 1;
Sort_param sort_param;
diff --git a/sql/unireg.cc b/sql/unireg.cc
index 7f89f4e78b1..e6f52cd953e 100644
--- a/sql/unireg.cc
+++ b/sql/unireg.cc
@@ -1,6 +1,6 @@
/*
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
- Copyright (c) 2009, 2020, MariaDB Corporation.
+ Copyright (c) 2009, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -685,6 +685,13 @@ static uint pack_keys(uchar *keybuff, uint key_count, KEY *keyinfo,
DBUG_PRINT("loop", ("flags: %lu key_parts: %d key_part: %p",
key->flags, key->user_defined_key_parts,
key->key_part));
+
+ /* For SPATIAL, FULLTEXT and HASH indexes (anything other than B-tree),
+ ignore the ASC/DESC attribute of columns. */
+ const uchar ha_reverse_sort=
+ key->algorithm > HA_KEY_ALG_BTREE || key->flags & (HA_FULLTEXT|HA_SPATIAL)
+ ? 0 : HA_REVERSE_SORT;
+
for (key_part=key->key_part,key_part_end=key_part+key->user_defined_key_parts ;
key_part != key_part_end ;
key_part++)
@@ -697,7 +704,8 @@ static uint pack_keys(uchar *keybuff, uint key_count, KEY *keyinfo,
int2store(pos,key_part->fieldnr+1+FIELD_NAME_USED);
offset= (uint) (key_part->offset+data_offset+1);
int2store(pos+2, offset);
- pos[4]=0; // Sort order
+ key_part->key_part_flag &= ha_reverse_sort;
+ pos[4]= (uchar)(key_part->key_part_flag);
int2store(pos+5,key_part->key_type);
int2store(pos+7,key_part->length);
pos+=9;
diff --git a/sql/upgrade_conf_file.cc b/sql/upgrade_conf_file.cc
index 543df7b9bdf..0d7bc603468 100644
--- a/sql/upgrade_conf_file.cc
+++ b/sql/upgrade_conf_file.cc
@@ -25,6 +25,8 @@
Note : the list below only includes the default-compiled server and none of the
loadable plugins.
*/
+#include <my_global.h>
+#include <my_sys.h>
#include <windows.h>
#include <initializer_list>
#include <stdlib.h>
@@ -158,51 +160,159 @@ static int cmp_strings(const void* a, const void *b)
return strcmp((const char *)a, *(const char **)b);
}
-/**
- Convert file from a previous version, by removing
-*/
-int upgrade_config_file(const char *myini_path)
+
+#define MY_INI_SECTION_SIZE 32 * 1024 + 3
+
+static bool is_utf8_str(const char *s)
+{
+ MY_STRCOPY_STATUS status;
+ const struct charset_info_st *cs= &my_charset_utf8mb4_bin;
+ size_t len= strlen(s);
+ if (!len)
+ return true;
+ cs->cset->well_formed_char_length(cs, s, s + len, len, &status);
+ return status.m_well_formed_error_pos == nullptr;
+}
+
+
+static UINT get_system_acp()
{
-#define MY_INI_SECTION_SIZE 32*1024 +3
+ static DWORD system_acp;
+ if (system_acp)
+ return system_acp;
+
+ char str_cp[10];
+ int cch= GetLocaleInfo(GetSystemDefaultLCID(), LOCALE_IDEFAULTANSICODEPAGE,
+ str_cp, sizeof(str_cp));
+
+ system_acp= cch > 0 ? atoi(str_cp) : 1252;
+
+ return system_acp;
+}
+
+
+static char *ansi_to_utf8(const char *s)
+{
+#define MAX_STR_LEN MY_INI_SECTION_SIZE
+ static wchar_t utf16_buf[MAX_STR_LEN];
+ static char utf8_buf[MAX_STR_LEN];
+ if (MultiByteToWideChar(get_system_acp(), 0, s, -1, utf16_buf, MAX_STR_LEN))
+ {
+ if (WideCharToMultiByte(CP_UTF8, 0, utf16_buf, -1, utf8_buf, MAX_STR_LEN,
+ 0, 0))
+ return utf8_buf;
+ }
+ return 0;
+}
+
+int fix_section(const char *myini_path, const char *section_name,
+ bool is_server)
+{
+ if (!is_server && GetACP() != CP_UTF8)
+ return 0;
+
static char section_data[MY_INI_SECTION_SIZE];
- for (const char *section_name : { "mysqld","server","mariadb" })
+ DWORD size= GetPrivateProfileSection(section_name, section_data,
+ MY_INI_SECTION_SIZE, myini_path);
+ if (size == MY_INI_SECTION_SIZE - 2)
{
- DWORD size = GetPrivateProfileSection(section_name, section_data, MY_INI_SECTION_SIZE, myini_path);
- if (size == MY_INI_SECTION_SIZE - 2)
- {
- return -1;
- }
+ return -1;
+ }
- for (char *keyval = section_data; *keyval; keyval += strlen(keyval) + 1)
+ for (char *keyval= section_data; *keyval; keyval += strlen(keyval)+1)
+ {
+ char varname[256];
+ char *value;
+ char *key_end= strchr(keyval, '=');
+ if (!key_end)
+ key_end= keyval + strlen(keyval);
+
+ if (key_end - keyval > sizeof(varname))
+ continue;
+
+ value= key_end + 1;
+ if (GetACP() == CP_UTF8 && !is_utf8_str(value))
{
- char varname[256];
- char *key_end = strchr(keyval, '=');
- if (!key_end)
- key_end = keyval+ strlen(keyval);
-
- if (key_end - keyval > sizeof(varname))
- continue;
- // copy and normalize (convert dash to underscore) to variable names
- for (char *p = keyval, *q = varname;; p++,q++)
+ /*Convert a value, if it is not already UTF-8*/
+ char *new_val= ansi_to_utf8(value);
+ if (new_val)
{
- if (p == key_end)
- {
- *q = 0;
- break;
- }
- *q = (*p == '-') ? '_' : *p;
+ *key_end= 0;
+ fprintf(stdout, "Fixing variable '%s' charset, value=%s\n", keyval,
+ new_val);
+ WritePrivateProfileString(section_name, keyval, new_val, myini_path);
+ *key_end= '=';
}
- const char *v = (const char *)bsearch(varname, removed_variables, sizeof(removed_variables) / sizeof(removed_variables[0]),
- sizeof(char *), cmp_strings);
+ }
+ if (!is_server)
+ continue;
- if (v)
+ // Check if variable should be removed from config.
+ // First, copy and normalize (convert dash to underscore) to variable
+ // names
+ for (char *p= keyval, *q= varname;; p++, q++)
+ {
+ if (p == key_end)
{
- fprintf(stdout, "Removing variable '%s' from config file\n", varname);
- // delete variable
- *key_end = 0;
- WritePrivateProfileString(section_name, keyval, 0, myini_path);
+ *q= 0;
+ break;
}
+ *q= (*p == '-') ? '_' : *p;
+ }
+ const char *v= (const char *) bsearch(varname, removed_variables, sizeof(removed_variables) / sizeof(removed_variables[0]),
+ sizeof(char *), cmp_strings);
+
+ if (v)
+ {
+ fprintf(stdout, "Removing variable '%s' from config file\n", varname);
+ // delete variable
+ *key_end= 0;
+ WritePrivateProfileString(section_name, keyval, 0, myini_path);
}
}
return 0;
}
+
+static bool is_mariadb_section(const char *name, bool *is_server)
+{
+ if (strncmp(name, "mysql", 5)
+ && strncmp(name, "mariadb", 7)
+ && strcmp(name, "client")
+ && strcmp(name, "client-server")
+ && strcmp(name, "server"))
+ {
+ return false;
+ }
+
+ for (const char *section_name : {"mysqld", "server", "mariadb"})
+ if (*is_server= !strcmp(section_name, name))
+ break;
+
+ return true;
+}
+
+
+/**
+ Convert file from a previous version, by removing obsolete variables
+ Also, fix values to be UTF8, if MariaDB is running in utf8 mode
+*/
+int upgrade_config_file(const char *myini_path)
+{
+ static char all_sections[MY_INI_SECTION_SIZE];
+ int sz= GetPrivateProfileSectionNamesA(all_sections, MY_INI_SECTION_SIZE,
+ myini_path);
+ if (!sz)
+ return 0;
+ if (sz > MY_INI_SECTION_SIZE - 2)
+ {
+ fprintf(stderr, "Too many sections in config file\n");
+ return -1;
+ }
+ for (char *section= all_sections; *section; section+= strlen(section) + 1)
+ {
+ bool is_server_section;
+ if (is_mariadb_section(section, &is_server_section))
+ fix_section(myini_path, section, is_server_section);
+ }
+ return 0;
+}
diff --git a/sql/winmain.cc b/sql/winmain.cc
index 7def0aed531..2ed43130fa7 100644
--- a/sql/winmain.cc
+++ b/sql/winmain.cc
@@ -55,6 +55,7 @@
#include <windows.h>
#include <string>
#include <cassert>
+#include <winservice.h>
static SERVICE_STATUS svc_status{SERVICE_WIN32_OWN_PROCESS};
static SERVICE_STATUS_HANDLE svc_status_handle;
diff --git a/sql/winservice.c b/sql/winservice.c
index a11087e5cd5..d4e3bb0944d 100644
--- a/sql/winservice.c
+++ b/sql/winservice.c
@@ -134,6 +134,20 @@ static void get_datadir_from_ini(const char *ini, char *service_name, char *data
}
+static int fix_and_check_datadir(mysqld_service_properties *props)
+{
+ normalize_path(props->datadir, MAX_PATH);
+ /* Check if datadir really exists */
+ if (GetFileAttributes(props->datadir) != INVALID_FILE_ATTRIBUTES)
+ return 0;
+ /*
+ It is possible, that datadir contains some unconvertable character.
+ We just pretend not to know what's the data directory
+ */
+ props->datadir[0]= 0;
+ return 0;
+}
+
/*
Retrieve some properties from windows mysqld service binary path.
We're interested in ini file location and datadir, and also in version of
@@ -284,16 +298,9 @@ int get_mysql_service_properties(const wchar_t *bin_path,
}
}
- if (props->datadir[0])
- {
- normalize_path(props->datadir, MAX_PATH);
- /* Check if datadir really exists */
- if (GetFileAttributes(props->datadir) == INVALID_FILE_ATTRIBUTES)
- goto end;
- }
- else
+ if (props->datadir[0] == 0 || fix_and_check_datadir(props))
{
- /* There is no datadir in ini file, bail out.*/
+ /* There is no datadir in ini file, or non-existing dir, bail out.*/
goto end;
}
diff --git a/sql/winservice.h b/sql/winservice.h
index f9ab3eda332..aa0528be5ee 100644
--- a/sql/winservice.h
+++ b/sql/winservice.h
@@ -17,11 +17,22 @@
/*
Extract properties of a windows service binary path
*/
+#pragma once
+
#ifdef __cplusplus
extern "C" {
#endif
-#include <windows.h>
+#include <windows.h>
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4995)
+#endif
+#include <winsvc.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
typedef struct mysqld_service_properties_st
{
char mysqld_exe[MAX_PATH];
@@ -32,9 +43,170 @@ typedef struct mysqld_service_properties_st
int version_patch;
} mysqld_service_properties;
-extern int get_mysql_service_properties(const wchar_t *bin_path,
+extern int get_mysql_service_properties(const wchar_t *bin_path,
mysqld_service_properties *props);
+
+#if !defined(UNICODE)
+/*
+ The following wrappers workaround Windows bugs
+ with CreateService/OpenService with ANSI codepage UTF8.
+
+ Apparently, these function in ANSI mode, for this codepage only
+ do *not* behave as expected (as-if string parameters were
+ converted to UTF16 and "wide" function were called)
+*/
+#include <malloc.h>
+static inline wchar_t* awstrdup(const char *str)
+{
+ if (!str)
+ return NULL;
+ size_t len= strlen(str) + 1;
+ wchar_t *wstr= (wchar_t *) malloc(sizeof(wchar_t)*len);
+ if (MultiByteToWideChar(GetACP(), 0, str, (int)len, wstr, (int)len) == 0)
+ {
+ free(wstr);
+ return NULL;
+ }
+ return wstr;
+}
+
+#define AWSTRDUP(dest, src) \
+ dest= awstrdup(src); \
+ if (src && !dest) \
+ { \
+ ok= FALSE; \
+ last_error = ERROR_OUTOFMEMORY; \
+ goto end; \
+ }
+
+static inline SC_HANDLE my_OpenService(SC_HANDLE hSCManager, LPCSTR lpServiceName, DWORD dwDesiredAccess)
+{
+ wchar_t *w_ServiceName= NULL;
+ BOOL ok=TRUE;
+ DWORD last_error=0;
+ SC_HANDLE sch=NULL;
+
+ AWSTRDUP(w_ServiceName, lpServiceName);
+ sch= OpenServiceW(hSCManager, w_ServiceName, dwDesiredAccess);
+ if (!sch)
+ {
+ ok= FALSE;
+ last_error= GetLastError();
+ }
+
+end:
+ free(w_ServiceName);
+ if (!ok)
+ SetLastError(last_error);
+ return sch;
+}
+
+static inline SC_HANDLE my_CreateService(SC_HANDLE hSCManager,
+ LPCSTR lpServiceName, LPCSTR lpDisplayName,
+ DWORD dwDesiredAccess, DWORD dwServiceType,
+ DWORD dwStartType, DWORD dwErrorControl,
+ LPCSTR lpBinaryPathName, LPCSTR lpLoadOrderGroup,
+ LPDWORD lpdwTagId, LPCSTR lpDependencies,
+ LPCSTR lpServiceStartName, LPCSTR lpPassword)
+{
+ wchar_t *w_ServiceName= NULL;
+ wchar_t *w_DisplayName= NULL;
+ wchar_t *w_BinaryPathName= NULL;
+ wchar_t *w_LoadOrderGroup= NULL;
+ wchar_t *w_Dependencies= NULL;
+ wchar_t *w_ServiceStartName= NULL;
+ wchar_t *w_Password= NULL;
+ SC_HANDLE sch = NULL;
+ DWORD last_error=0;
+ BOOL ok= TRUE;
+
+ AWSTRDUP(w_ServiceName,lpServiceName);
+ AWSTRDUP(w_DisplayName,lpDisplayName);
+ AWSTRDUP(w_BinaryPathName, lpBinaryPathName);
+ AWSTRDUP(w_LoadOrderGroup, lpLoadOrderGroup);
+ AWSTRDUP(w_Dependencies, lpDependencies);
+ AWSTRDUP(w_ServiceStartName, lpServiceStartName);
+ AWSTRDUP(w_Password, lpPassword);
+
+ sch= CreateServiceW(
+ hSCManager, w_ServiceName, w_DisplayName, dwDesiredAccess, dwServiceType,
+ dwStartType, dwErrorControl, w_BinaryPathName, w_LoadOrderGroup,
+ lpdwTagId, w_Dependencies, w_ServiceStartName, w_Password);
+ if(!sch)
+ {
+ ok= FALSE;
+ last_error= GetLastError();
+ }
+
+end:
+ free(w_ServiceName);
+ free(w_DisplayName);
+ free(w_BinaryPathName);
+ free(w_LoadOrderGroup);
+ free(w_Dependencies);
+ free(w_ServiceStartName);
+ free(w_Password);
+
+ if (!ok)
+ SetLastError(last_error);
+ return sch;
+}
+
+static inline BOOL my_ChangeServiceConfig(SC_HANDLE hService, DWORD dwServiceType,
+ DWORD dwStartType, DWORD dwErrorControl,
+ LPCSTR lpBinaryPathName, LPCSTR lpLoadOrderGroup,
+ LPDWORD lpdwTagId, LPCSTR lpDependencies,
+ LPCSTR lpServiceStartName, LPCSTR lpPassword,
+ LPCSTR lpDisplayName)
+{
+ wchar_t *w_DisplayName= NULL;
+ wchar_t *w_BinaryPathName= NULL;
+ wchar_t *w_LoadOrderGroup= NULL;
+ wchar_t *w_Dependencies= NULL;
+ wchar_t *w_ServiceStartName= NULL;
+ wchar_t *w_Password= NULL;
+ DWORD last_error=0;
+ BOOL ok= TRUE;
+
+ AWSTRDUP(w_DisplayName, lpDisplayName);
+ AWSTRDUP(w_BinaryPathName, lpBinaryPathName);
+ AWSTRDUP(w_LoadOrderGroup, lpLoadOrderGroup);
+ AWSTRDUP(w_Dependencies, lpDependencies);
+ AWSTRDUP(w_ServiceStartName, lpServiceStartName);
+ AWSTRDUP(w_Password, lpPassword);
+
+ ok= ChangeServiceConfigW(
+ hService, dwServiceType, dwStartType, dwErrorControl, w_BinaryPathName,
+ w_LoadOrderGroup, lpdwTagId, w_Dependencies, w_ServiceStartName,
+ w_Password, w_DisplayName);
+ if (!ok)
+ {
+ last_error= GetLastError();
+ }
+
+end:
+ free(w_DisplayName);
+ free(w_BinaryPathName);
+ free(w_LoadOrderGroup);
+ free(w_Dependencies);
+ free(w_ServiceStartName);
+ free(w_Password);
+
+ if (last_error)
+ SetLastError(last_error);
+ return ok;
+}
+#undef AWSTRDUP
+
+#undef OpenService
+#define OpenService my_OpenService
+#undef ChangeServiceConfig
+#define ChangeServiceConfig my_ChangeServiceConfig
+#undef CreateService
+#define CreateService my_CreateService
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc
index e0db00a3de3..cff31ab4484 100644
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@ -90,7 +90,6 @@ my_bool wsrep_drupal_282555_workaround; // Retry autoinc insert after du
my_bool wsrep_certify_nonPK; // Certify, even when no primary key
ulong wsrep_certification_rules = WSREP_CERTIFICATION_RULES_STRICT;
my_bool wsrep_recovery; // Recovery
-my_bool wsrep_replicate_myisam; // Enable MyISAM replication
my_bool wsrep_log_conflicts;
my_bool wsrep_load_data_splitting= 0; // Commit load data every 10K intervals
my_bool wsrep_slave_UK_checks; // Slave thread does UK checks
@@ -100,9 +99,6 @@ my_bool wsrep_restart_slave; // Should mysql slave thread be
my_bool wsrep_desync; // De(re)synchronize the node from the
// cluster
ulonglong wsrep_mode;
-my_bool wsrep_strict_ddl; // Deprecated: Reject DDL to
- // effected tables not
- // supporting Galera replication
bool wsrep_service_started; // If Galera was initialized
long wsrep_slave_threads; // No. of slave appliers threads
ulong wsrep_retry_autocommit; // Retry aborted autocommit trx
@@ -1713,6 +1709,7 @@ wsrep_append_fk_parent_table(THD* thd, TABLE_LIST* tables, wsrep::key_array* key
{
bool fail= false;
TABLE_LIST *table;
+ TABLE_LIST *table_last_in_list;
for (table= tables; table; table= table->next_local)
{
@@ -1728,6 +1725,12 @@ wsrep_append_fk_parent_table(THD* thd, TABLE_LIST* tables, wsrep::key_array* key
uint counter;
MDL_savepoint mdl_savepoint= thd->mdl_context.mdl_savepoint();
+ for (table_last_in_list= tables;;table_last_in_list= table_last_in_list->next_local) {
+ if (!table_last_in_list->next_local) {
+ break;
+ }
+ }
+
if (open_tables(thd, &tables, &counter, MYSQL_OPEN_FORCE_SHARED_HIGH_PRIO_MDL))
{
WSREP_DEBUG("Unable to open table for FK checks for %s", wsrep_thd_query(thd));
@@ -1758,11 +1761,19 @@ exit:
/* close the table and release MDL locks */
close_thread_tables(thd);
thd->mdl_context.rollback_to_savepoint(mdl_savepoint);
+ bool invalidate_next_global= false;
for (table= tables; table; table= table->next_local)
{
table->table= NULL;
- table->next_global= NULL;
table->mdl_request.ticket= NULL;
+ // We should invalidate `next_global` only for entries that are added
+ // in this function
+ if (table == table_last_in_list) {
+ invalidate_next_global= true;
+ }
+ if (invalidate_next_global) {
+ table->next_global= NULL;
+ }
}
return fail;
@@ -2671,6 +2682,8 @@ static int wsrep_TOI_begin(THD *thd, const char *db, const char *table,
}
thd_proc_info(thd, "acquiring total order isolation");
+ WSREP_DEBUG("wsrep_TOI_begin for %s", wsrep_thd_query(thd));
+ THD_STAGE_INFO(thd, stage_waiting_isolation);
wsrep::client_state& cs(thd->wsrep_cs());
@@ -3019,39 +3032,49 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
const MDL_ticket *ticket,
const MDL_key *key)
{
- /* Fallback to the non-wsrep behaviour */
- if (!WSREP_ON) return;
-
THD *request_thd= requestor_ctx->get_thd();
THD *granted_thd= ticket->get_ctx()->get_thd();
+ /* Fallback to the non-wsrep behaviour */
+ if (!WSREP(request_thd)) return;
+
const char* schema= key->db_name();
int schema_len= key->db_name_length();
mysql_mutex_lock(&request_thd->LOCK_thd_data);
- if (wsrep_thd_is_toi(request_thd) ||
- wsrep_thd_is_applying(request_thd)) {
+ if (wsrep_thd_is_toi(request_thd) ||
+ wsrep_thd_is_applying(request_thd))
+ {
+ WSREP_DEBUG("wsrep_handle_mdl_conflict request TOI/APPLY for %s",
+ wsrep_thd_query(request_thd));
+ THD_STAGE_INFO(request_thd, stage_waiting_isolation);
mysql_mutex_unlock(&request_thd->LOCK_thd_data);
WSREP_MDL_LOG(DEBUG, "MDL conflict ", schema, schema_len,
request_thd, granted_thd);
ticket->wsrep_report(wsrep_debug);
mysql_mutex_lock(&granted_thd->LOCK_thd_data);
+
if (wsrep_thd_is_toi(granted_thd) ||
wsrep_thd_is_applying(granted_thd))
{
if (wsrep_thd_is_aborting(granted_thd))
{
- WSREP_DEBUG("BF thread waiting for SR in aborting state");
+ WSREP_DEBUG("BF thread waiting for SR in aborting state for %s",
+ wsrep_thd_query(request_thd));
+ THD_STAGE_INFO(request_thd, stage_waiting_isolation);
ticket->wsrep_report(wsrep_debug);
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
}
else if (wsrep_thd_is_SR(granted_thd) && !wsrep_thd_is_SR(request_thd))
{
- WSREP_MDL_LOG(INFO, "MDL conflict, DDL vs SR",
+ WSREP_MDL_LOG(INFO, "MDL conflict, DDL vs SR",
schema, schema_len, request_thd, granted_thd);
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
+ WSREP_DEBUG("wsrep_handle_mdl_conflict DDL vs SR for %s",
+ wsrep_thd_query(request_thd));
+ THD_STAGE_INFO(request_thd, stage_waiting_isolation);
wsrep_abort_thd(request_thd, granted_thd, 1);
}
else
@@ -3066,7 +3089,9 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
else if (granted_thd->lex->sql_command == SQLCOM_FLUSH ||
granted_thd->mdl_context.has_explicit_locks())
{
- WSREP_DEBUG("BF thread waiting for FLUSH");
+ WSREP_DEBUG("BF thread waiting for FLUSH for %s",
+ wsrep_thd_query(request_thd));
+ THD_STAGE_INFO(request_thd, stage_waiting_ddl);
ticket->wsrep_report(wsrep_debug);
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
if (granted_thd->current_backup_stage != BACKUP_FINISHED &&
@@ -3077,8 +3102,10 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
}
else if (request_thd->lex->sql_command == SQLCOM_DROP_TABLE)
{
- WSREP_DEBUG("DROP caused BF abort, conf %s",
- wsrep_thd_transaction_state_str(granted_thd));
+ WSREP_DEBUG("DROP caused BF abort, conf %s for %s",
+ wsrep_thd_transaction_state_str(granted_thd),
+ wsrep_thd_query(request_thd));
+ THD_STAGE_INFO(request_thd, stage_waiting_isolation);
ticket->wsrep_report(wsrep_debug);
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
wsrep_abort_thd(request_thd, granted_thd, 1);
@@ -3087,7 +3114,11 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
{
WSREP_MDL_LOG(DEBUG, "MDL conflict-> BF abort", schema, schema_len,
request_thd, granted_thd);
+ WSREP_DEBUG("wsrep_handle_mdl_conflict -> BF abort for %s",
+ wsrep_thd_query(request_thd));
+ THD_STAGE_INFO(request_thd, stage_waiting_isolation);
ticket->wsrep_report(wsrep_debug);
+
if (granted_thd->wsrep_trx().active())
{
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
@@ -3100,14 +3131,16 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
thd is BF, BF abort and wait.
*/
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
+
if (wsrep_thd_is_BF(request_thd, FALSE))
{
ha_abort_transaction(request_thd, granted_thd, TRUE);
}
else
{
- WSREP_MDL_LOG(INFO, "MDL unknown BF-BF conflict", schema, schema_len,
- request_thd, granted_thd);
+ WSREP_MDL_LOG(INFO, "MDL unknown BF-BF conflict",
+ schema, schema_len,
+ request_thd, granted_thd);
ticket->wsrep_report(true);
unireg_abort(1);
}
diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h
index c9e08d77b6c..d14e5995771 100644
--- a/sql/wsrep_mysqld.h
+++ b/sql/wsrep_mysqld.h
@@ -72,7 +72,6 @@ extern long int wsrep_protocol_version;
extern my_bool wsrep_desync;
extern ulong wsrep_reject_queries;
extern my_bool wsrep_recovery;
-extern my_bool wsrep_replicate_myisam;
extern my_bool wsrep_log_conflicts;
extern ulong wsrep_mysql_replication_bundle;
extern my_bool wsrep_load_data_splitting;
@@ -91,7 +90,6 @@ extern bool wsrep_gtid_mode;
extern uint32 wsrep_gtid_domain_id;
extern std::atomic <bool > wsrep_thread_create_failed;
extern ulonglong wsrep_mode;
-extern my_bool wsrep_strict_ddl;
enum enum_wsrep_reject_types {
WSREP_REJECT_NONE, /* nothing rejected */
diff --git a/sql/wsrep_trans_observer.h b/sql/wsrep_trans_observer.h
index 3c5cff2b741..360b327d7ea 100644
--- a/sql/wsrep_trans_observer.h
+++ b/sql/wsrep_trans_observer.h
@@ -276,12 +276,14 @@ static inline int wsrep_before_commit(THD* thd, bool all)
WSREP_DEBUG("wsrep_before_commit: %d, %lld",
wsrep_is_real(thd, all),
(long long)wsrep_thd_trx_seqno(thd));
+ THD_STAGE_INFO(thd, stage_waiting_certification);
int ret= 0;
DBUG_ASSERT(wsrep_run_commit_hook(thd, all));
+
if ((ret= thd->wsrep_cs().before_commit()) == 0)
{
DBUG_ASSERT(!thd->wsrep_trx().ws_meta().gtid().is_undefined());
- if (!thd->variables.gtid_seq_no &&
+ if (!thd->variables.gtid_seq_no &&
(thd->wsrep_trx().ws_meta().flags() & wsrep::provider::flag::commit))
{
uint64 seqno= 0;
diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc
index 5ec32d63626..0de1b034953 100644
--- a/sql/wsrep_var.cc
+++ b/sql/wsrep_var.cc
@@ -854,10 +854,11 @@ bool wsrep_desync_check (sys_var *self, THD* thd, set_var* var)
return true;
}
} else {
+ THD_STAGE_INFO(thd, stage_waiting_flow);
ret= Wsrep_server_state::instance().provider().resync();
if (ret != WSREP_OK) {
WSREP_WARN ("SET resync failed %d for schema: %s, query: %s", ret,
- thd->get_db(), thd->query());
+ thd->get_db(), wsrep_thd_query(thd));
my_error (ER_CANNOT_USER, MYF(0), "'resync'", thd->query());
return true;
}
@@ -1118,24 +1119,3 @@ bool wsrep_gtid_domain_id_update(sys_var* self, THD *thd, enum_var_type)
return false;
}
-bool wsrep_strict_ddl_update(sys_var *self, THD* thd, enum_var_type var_type)
-{
- // In case user still sets wsrep_strict_ddl we set new
- // option to wsrep_mode
- if (wsrep_strict_ddl)
- wsrep_mode|= WSREP_MODE_STRICT_REPLICATION;
- else
- wsrep_mode&= (~WSREP_MODE_STRICT_REPLICATION);
- return false;
-}
-
-bool wsrep_replicate_myisam_update(sys_var *self, THD* thd, enum_var_type var_type)
-{
- // In case user still sets wsrep_replicate_myisam we set new
- // option to wsrep_mode
- if (wsrep_replicate_myisam)
- wsrep_mode|= WSREP_MODE_REPLICATE_MYISAM;
- else
- wsrep_mode&= (~WSREP_MODE_REPLICATE_MYISAM);
- return false;
-}
diff --git a/sql/wsrep_var.h b/sql/wsrep_var.h
index 7908e873795..0f811d70928 100644
--- a/sql/wsrep_var.h
+++ b/sql/wsrep_var.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2013 Codership Oy <info@codership.com>
+/* Copyright (C) 2013-2021 Codership Oy <info@codership.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -109,8 +109,6 @@ extern bool wsrep_gtid_seq_no_check CHECK_ARGS;
extern bool wsrep_gtid_domain_id_update UPDATE_ARGS;
extern bool wsrep_mode_check CHECK_ARGS;
-extern bool wsrep_strict_ddl_update UPDATE_ARGS;
-extern bool wsrep_replicate_myisam_update UPDATE_ARGS;
#else /* WITH_WSREP */
#define wsrep_provider_init(X)
diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc
index 2df54567285..19a0ffe028a 100644
--- a/storage/archive/ha_archive.cc
+++ b/storage/archive/ha_archive.cc
@@ -785,7 +785,9 @@ int ha_archive::create(const char *name, TABLE *table_arg,
{
Field *field= key_part->field;
- if (!(field->flags & AUTO_INCREMENT_FLAG))
+ if (!(field->flags & AUTO_INCREMENT_FLAG) ||
+ key_part->key_part_flag & HA_REVERSE_SORT)
+
{
error= HA_WRONG_CREATE_OPTION;
DBUG_PRINT("ha_archive", ("Index error in creating archive table"));
diff --git a/storage/columnstore/CMakeLists.txt b/storage/columnstore/CMakeLists.txt
index 6669862f038..ebb138c70f0 100644
--- a/storage/columnstore/CMakeLists.txt
+++ b/storage/columnstore/CMakeLists.txt
@@ -5,6 +5,10 @@ if("NO" STREQUAL "${PLUGIN_COLUMNSTORE}")
endif()
add_definitions(-DBOOST_BIND_GLOBAL_PLACEHOLDERS)
+IF(NOT PLUGIN_PERFSCHEMA STREQUAL NO)
+ add_definitions(-DHAVE_PSI_INTERFACE=)
+ENDIF()
+
# this does everything, gets the var from the correct scope, appends new
# values, sets in the correct scope
@@ -13,6 +17,11 @@ macro(APPEND_FOR_CPACK V)
set(${V} "${var}${ARGN}" PARENT_SCOPE)
endmacro()
+# don't use compression providers, there are standalone executables below
+GET_PROPERTY(dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
+LIST(REMOVE_ITEM dirs ${CMAKE_SOURCE_DIR}/include/providers)
+SET_PROPERTY(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "${dirs}")
+
IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR
CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64" OR
CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
diff --git a/storage/connect/bsonudf.cpp b/storage/connect/bsonudf.cpp
index 90d057f0936..f92bdb46727 100644
--- a/storage/connect/bsonudf.cpp
+++ b/storage/connect/bsonudf.cpp
@@ -9,6 +9,7 @@
/*********************************************************************************/
#include <my_global.h>
#include <mysqld.h>
+#include <mysqld_error.h>
#include <mysql.h>
#include <sql_error.h>
#include <stdio.h>
@@ -22,7 +23,7 @@
#define MEMFIX 4096
#if defined(connect_EXPORTS)
-#define PUSH_WARNING(M) push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, M)
+#define PUSH_WARNING(M) push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, M)
#else
#define PUSH_WARNING(M) htrc(M)
#endif
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc
index 41f598ad3e1..23d3c7c1058 100644
--- a/storage/connect/ha_connect.cc
+++ b/storage/connect/ha_connect.cc
@@ -516,7 +516,7 @@ void SetWorkSize(size_t)
{
// Changing the session variable value seems to be impossible here
// and should be done in a check function
- push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0,
+ push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
"Work size too big, try setting a smaller value");
} // end of SetWorkSize
@@ -715,7 +715,7 @@ void PushWarning(PGLOBAL g, THD *thd, int level)
Sql_condition::enum_warning_level wlvl;
wlvl= (Sql_condition::enum_warning_level)level;
- push_warning(thd, wlvl, 0, g->Message);
+ push_warning(thd, wlvl, ER_UNKNOWN_ERROR, g->Message);
} else
htrc("%s\n", g->Message);
@@ -1804,6 +1804,12 @@ PIXDEF ha_connect::GetIndexInfo(TABLE_SHARE *s)
pn= (char*)kp.key_part[k].field->field_name.str;
name= PlugDup(g, pn);
+ if (kp.key_part[k].key_part_flag & HA_REVERSE_SORT)
+ {
+ strcpy(g->Message, "Descending indexes are not supported");
+ xdp->Invalid= true;
+ }
+
// Allocate the key part description block
kpp= new(g) KPARTDEF(name, k + 1);
kpp->SetKlen(kp.key_part[k].length);
@@ -2290,7 +2296,7 @@ int ha_connect::MakeRecord(char *buf)
fp->field_name.str,
thd->get_stmt_da()->current_row_for_warning());
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, buf);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, buf);
DBUG_PRINT("MakeRecord", ("%s", buf));
rc= 0;
} else if (rc < 0)
@@ -3593,7 +3599,7 @@ int ha_connect::optimize(THD* thd, HA_CHECK_OPT*)
if ((rc= ((PTDBASE)tdbp)->ResetTableOpt(g, dop, dox))) {
if (rc == RC_INFO) {
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
rc= 0;
} else
rc= HA_ERR_CRASHED_ON_USAGE; // Table must be repaired
@@ -4818,7 +4824,7 @@ int ha_connect::start_stmt(THD *thd, thr_lock_type lock_type)
if (newmode == MODE_ANY) {
if (CloseTable(g)) {
// Make error a warning to avoid crash
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
rc= 0;
} // endif Close
@@ -4900,18 +4906,18 @@ int ha_connect::external_lock(THD *thd, int lock_type)
&& sqlcom != SQLCOM_BEGIN
&& sqlcom != SQLCOM_DROP_TABLE) {
snprintf(g->Message, sizeof(g->Message), "external_lock: unexpected command %d", sqlcom);
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
DBUG_RETURN(0);
} else if (g->Xchk) {
if (!tdbp) {
if (!(tdbp= GetTDB(g))) {
// DBUG_RETURN(HA_ERR_INTERNAL_ERROR); causes assert error
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
DBUG_RETURN(0);
} else if (!tdbp->GetDef()->Indexable()) {
snprintf(g->Message, sizeof(g->Message), "external_lock: Table %s is not indexable", tdbp->GetName());
// DBUG_RETURN(HA_ERR_INTERNAL_ERROR); causes assert error
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
DBUG_RETURN(0);
} else if (tdbp->GetDef()->Indexable() == 1) {
bool oldsep= ((PCHK)g->Xchk)->oldsep;
@@ -4990,7 +4996,7 @@ int ha_connect::external_lock(THD *thd, int lock_type)
if (tdp->MakeIndex(g, adp, true) == RC_FX) {
// Make it a warning to avoid crash
//push_warning(thd, Sql_condition::WARN_LEVEL_WARN,
- // 0, g->Message);
+ // ER_UNKNOWN_ERROR, g->Message);
//rc= 0;
my_message(ER_TOO_MANY_KEYS, g->Message, MYF(0));
rc= HA_ERR_INDEX_CORRUPT;
@@ -5000,7 +5006,7 @@ int ha_connect::external_lock(THD *thd, int lock_type)
if (CheckVirtualIndex(NULL)) {
// Make it a warning to avoid crash
push_warning(thd, Sql_condition::WARN_LEVEL_WARN,
- 0, g->Message);
+ ER_UNKNOWN_ERROR, g->Message);
rc= 0;
} // endif Check
@@ -5013,7 +5019,7 @@ int ha_connect::external_lock(THD *thd, int lock_type)
if (CloseTable(g)) {
// This is an error while builing index
// Make it a warning to avoid crash
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
rc= 0;
} // endif Close
@@ -5724,7 +5730,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
topt->type= (src) ? "MYSQL" : (tab) ? "PROXY" : "DOS";
ttp= GetTypeID(topt->type);
snprintf(g->Message, sizeof(g->Message), "No table_type. Was set to %s", topt->type);
- push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, ER_UNKNOWN_ERROR, g->Message);
} else if (ttp == TAB_NIY) {
snprintf(g->Message, sizeof(g->Message), "Unsupported table type %s", topt->type);
rc= HA_ERR_INTERNAL_ERROR;
@@ -5734,7 +5740,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
if (ttp == TAB_UNDEF) {
ttr= TAB_JSON;
strcpy(g->Message, "No table_type. Was set to JSON");
- push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, ER_UNKNOWN_ERROR, g->Message);
} else
ttr= ttp;
@@ -6297,7 +6303,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
// Skip this column
snprintf(g->Message, sizeof(g->Message), "Column %s skipped (unsupported type %d)",
cnm, typ);
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
continue;
} else {
snprintf(g->Message, sizeof(g->Message), "Unsupported SQL type %d", typ);
@@ -6312,7 +6318,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
case TYPE_STRING:
if (w) {
snprintf(g->Message, sizeof(g->Message), "Column %s is wide characters", cnm);
- push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, ER_UNKNOWN_ERROR, g->Message);
} // endif w
break;
@@ -6339,7 +6345,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
// Skip this column
snprintf(g->Message, sizeof(g->Message), "Column %s skipped (unsupported type %d)",
cnm, typ);
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
continue;
} else {
snprintf(g->Message, sizeof(g->Message), "Unsupported SQL type %d", typ);
@@ -6504,7 +6510,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
snprintf(g->Message, sizeof(g->Message), "No table_type. Will be set to %s", options->type);
if (sqlcom == SQLCOM_CREATE_TABLE)
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
} else if (type == TAB_NIY) {
snprintf(g->Message, sizeof(g->Message), "Unsupported table type %s", options->type);
@@ -6553,7 +6559,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
case TAB_OCCUR:
if (options->srcdef) {
strcpy(g->Message, "Cannot check looping reference");
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
} else if (options->tabname) {
if (!stricmp(options->tabname, create_info->alias.str) &&
(!options->dbname ||
@@ -6849,7 +6855,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
snprintf(g->Message, sizeof(g->Message), "No file name. Table will use %s", buf);
if (sqlcom == SQLCOM_CREATE_TABLE)
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
strcat(strcat(strcpy(dbpath, "./"), table->s->db.str), "/");
} // endif part_info
@@ -6862,12 +6868,12 @@ int ha_connect::create(const char *name, TABLE *table_arg,
else
snprintf(g->Message, sizeof(g->Message), "Error %d creating file %s", errno, fn);
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
} else
::close(h);
if ((type == TAB_FMT || options->readonly) && sqlcom == SQLCOM_CREATE_TABLE)
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0,
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
"Congratulation, you just created a read-only void table!");
} // endif sqlcom
@@ -6913,7 +6919,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
sqlcom == SQLCOM_CREATE_INDEX || sqlcom == SQLCOM_DROP_INDEX))
// (sqlcom == SQLCOM_CREATE_INDEX && part_info) ||
// (sqlcom == SQLCOM_DROP_INDEX && part_info)))
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0,
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
"Unexpected command in create, please contact CONNECT team");
if (part_info && !inward)
@@ -6924,7 +6930,7 @@ int ha_connect::create(const char *name, TABLE *table_arg,
(!IsFileType(type) || FileExists(options->filename, false))) {
if (part_info) {
snprintf(g->Message, sizeof(g->Message), "Data repartition in %s is unchecked", partname);
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
} else if (sqlcom == SQLCOM_ALTER_TABLE) {
// This is an ALTER to CONNECT from another engine.
// It cannot be accepted because the table data would be modified
@@ -6946,6 +6952,9 @@ int ha_connect::create(const char *name, TABLE *table_arg,
strcpy(g->Message, "Compressed tables are not indexable");
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
rc= HA_ERR_UNSUPPORTED;
+ } else if (xdp->Invalid) {
+ my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
+ rc= HA_ERR_UNSUPPORTED;
} else if (GetIndexType(type) == 1) {
PDBUSER dup= PlgGetUser(g);
PCATLG cat= (dup) ? dup->Catalog : NULL;
@@ -7037,7 +7046,7 @@ bool ha_connect::FileExists(const char *fn, bool bf)
char buf[_MAX_PATH + 20];
snprintf(buf, sizeof(buf), "Error %d for file %s", errno, filename);
- push_warning(table->in_use, Sql_condition::WARN_LEVEL_WARN, 0, buf);
+ push_warning(table->in_use, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, buf);
return true;
} else
return false;
@@ -7340,7 +7349,7 @@ fin:
DBUG_RETURN(HA_ALTER_ERROR);
} else if (outward) {
if (IsFileType(type))
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0,
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
"This is an outward table, table data were not modified.");
DBUG_RETURN(HA_ALTER_INPLACE_EXCLUSIVE_LOCK);
@@ -7366,7 +7375,7 @@ bool ha_connect::check_if_incompatible_data(HA_CREATE_INFO *, uint)
{
DBUG_ENTER("ha_connect::check_if_incompatible_data");
// TO DO: really implement and check it.
- push_warning(ha_thd(), Sql_condition::WARN_LEVEL_WARN, 0,
+ push_warning(ha_thd(), Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
"Unexpected call to check_if_incompatible_data.");
DBUG_RETURN(COMPATIBLE_DATA_NO);
} // end of check_if_incompatible_data
diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp
index 18d65fd976f..45a0bb963e7 100644
--- a/storage/connect/jsonudf.cpp
+++ b/storage/connect/jsonudf.cpp
@@ -9,6 +9,7 @@
/*********************************************************************************/
#include <my_global.h>
#include <mysqld.h>
+#include <mysqld_error.h>
#include <mysql.h>
#include <sql_error.h>
#include <m_string.h>
@@ -21,7 +22,7 @@
#define MEMFIX 4096
#if defined(connect_EXPORTS)
-#define PUSH_WARNING(M) push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, M)
+#define PUSH_WARNING(M) push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, M)
#else
#define PUSH_WARNING(M) htrc(M)
#endif
diff --git a/storage/connect/mysql-test/connect/r/index.result b/storage/connect/mysql-test/connect/r/index.result
index edeca2d1960..baebf1f1ebe 100644
--- a/storage/connect/mysql-test/connect/r/index.result
+++ b/storage/connect/mysql-test/connect/r/index.result
@@ -175,3 +175,12 @@ WHERE x.pk > 3;
a
1
DROP TABLE t1;
+#
+# MDEV-27591 Connect tables (FIX/DOS) don't work with DESC keys - wrong results
+#
+CREATE TABLE t1 (
+id INT,
+f VARCHAR(32),
+PRIMARY KEY (id DESC)
+) ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='emp.txt';
+ERROR HY000: Descending indexes are not supported
diff --git a/storage/connect/mysql-test/connect/t/index.test b/storage/connect/mysql-test/connect/t/index.test
index 9dc6357074d..47bfbae7680 100644
--- a/storage/connect/mysql-test/connect/t/index.test
+++ b/storage/connect/mysql-test/connect/t/index.test
@@ -78,13 +78,6 @@ DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
-#
-# Clean up
-#
---remove_file $MYSQLD_DATADIR/test/emp.txt
---remove_file $MYSQLD_DATADIR/test/sexe.csv
---remove_file $MYSQLD_DATADIR/test/sitmat.csv
-
--echo #
--echo # MDEV-28299: Server crashes in
--echo # XINDXS::Range/CntIndexRange (Connect engine)
@@ -110,3 +103,20 @@ SELECT x.a
FROM t1 AS x JOIN t1 AS y ON (x.a = y.b)
WHERE x.pk > 3;
DROP TABLE t1;
+
+--echo #
+--echo # MDEV-27591 Connect tables (FIX/DOS) don't work with DESC keys - wrong results
+--echo #
+--error ER_UNKNOWN_ERROR
+CREATE TABLE t1 (
+ id INT,
+ f VARCHAR(32),
+ PRIMARY KEY (id DESC)
+) ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='emp.txt';
+
+#
+# Clean up
+#
+--remove_file $MYSQLD_DATADIR/test/emp.txt
+--remove_file $MYSQLD_DATADIR/test/sexe.csv
+--remove_file $MYSQLD_DATADIR/test/sitmat.csv
diff --git a/storage/connect/tabrest.cpp b/storage/connect/tabrest.cpp
index c535c21f9da..b38168622e9 100644
--- a/storage/connect/tabrest.cpp
+++ b/storage/connect/tabrest.cpp
@@ -12,6 +12,7 @@
/***********************************************************************/
#include <my_global.h> // All MariaDB stuff
#include <mysqld.h>
+#include <mysqld_error.h>
#include <sql_error.h>
#if !defined(_WIN32) && !defined(_WINDOWS)
#include <sys/types.h>
@@ -37,7 +38,7 @@
#include "tabrest.h"
#if defined(connect_EXPORTS)
-#define PUSH_WARNING(M) push_warning(current_thd, Sql_condition::WARN_LEVEL_NOTE, 0, M)
+#define PUSH_WARNING(M) push_warning(current_thd, Sql_condition::WARN_LEVEL_NOTE, ER_UNKNOWN_ERROR, M)
#else
#define PUSH_WARNING(M) htrc(M)
#endif
diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp
index 02908927397..b2ec19ebfd5 100644
--- a/storage/connect/tabutil.cpp
+++ b/storage/connect/tabutil.cpp
@@ -205,7 +205,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
if (v == 'K') {
// Skip this column
snprintf(g->Message, sizeof(g->Message), "Column %s skipped (unsupported type)", colname);
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
continue;
} // endif v
@@ -218,7 +218,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db,
len = zconv;
snprintf(g->Message, sizeof(g->Message), "Column %s converted to varchar(%d)",
colname, len);
- push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message);
} // endif v
crp = crp->Next; // Data_Type
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc
index ec569feec9d..e705ff0e7c0 100644
--- a/storage/csv/ha_tina.cc
+++ b/storage/csv/ha_tina.cc
@@ -1559,6 +1559,7 @@ int ha_tina::repair(THD* thd, HA_CHECK_OPT* check_opt)
current_position= next_position= 0;
/* Read the file row-by-row. If everything is ok, repair is not needed. */
+ thd_inc_error_row(thd);
while (!(rc= find_current_row(buf)))
{
thd_inc_error_row(thd);
diff --git a/storage/example/ha_example.cc b/storage/example/ha_example.cc
index 8f2015070be..c66c33a7818 100644
--- a/storage/example/ha_example.cc
+++ b/storage/example/ha_example.cc
@@ -98,7 +98,7 @@
#pragma implementation // gcc: Class implementation
#endif
-#include <my_config.h>
+#include <my_global.h>
#include <mysql/plugin.h>
#include "ha_example.h"
#include "sql_class.h"
diff --git a/storage/federatedx/federatedx_io_mysql.cc b/storage/federatedx/federatedx_io_mysql.cc
index 5cb8b7efa5b..fc32146b5cd 100644
--- a/storage/federatedx/federatedx_io_mysql.cc
+++ b/storage/federatedx/federatedx_io_mysql.cc
@@ -212,7 +212,7 @@ ulong federatedx_io_mysql::last_savepoint() const
ulong federatedx_io_mysql::actual_savepoint() const
{
SAVEPT *savept= NULL;
- uint index= savepoints.elements;
+ size_t index= savepoints.elements;
DBUG_ENTER("federatedx_io_mysql::last_savepoint");
while (index)
@@ -286,7 +286,7 @@ ulong federatedx_io_mysql::savepoint_release(ulong sp)
ulong federatedx_io_mysql::savepoint_rollback(ulong sp)
{
SAVEPT *savept;
- uint index;
+ size_t index;
DBUG_ENTER("federatedx_io_mysql::savepoint_release");
DBUG_PRINT("info",("savepoint=%lu", sp));
@@ -321,7 +321,7 @@ ulong federatedx_io_mysql::savepoint_rollback(ulong sp)
void federatedx_io_mysql::savepoint_restrict(ulong sp)
{
SAVEPT *savept;
- uint index= savepoints.elements;
+ size_t index= savepoints.elements;
DBUG_ENTER("federatedx_io_mysql::savepoint_restrict");
while (index)
@@ -361,7 +361,7 @@ bool federatedx_io_mysql::test_all_restrict() const
{
bool result= FALSE;
SAVEPT *savept;
- uint index= savepoints.elements;
+ size_t index= savepoints.elements;
DBUG_ENTER("federatedx_io_mysql::test_all_restrict");
while (index)
diff --git a/storage/federatedx/ha_federatedx.cc b/storage/federatedx/ha_federatedx.cc
index e2fdc54d8e7..598886b8915 100644
--- a/storage/federatedx/ha_federatedx.cc
+++ b/storage/federatedx/ha_federatedx.cc
@@ -1219,7 +1219,6 @@ bool ha_federatedx::create_where_from_key(String *to,
KEY *key_info,
const key_range *start_key,
const key_range *end_key,
- bool from_records_in_range,
bool eq_range)
{
bool both_not_null=
@@ -1240,7 +1239,6 @@ bool ha_federatedx::create_where_from_key(String *to,
MY_BITMAP *old_map= dbug_tmp_use_all_columns(table, &table->write_set);
for (uint i= 0; i <= 1; i++)
{
- bool needs_quotes;
KEY_PART_INFO *key_part;
if (ranges[i] == NULL)
continue;
@@ -1263,7 +1261,12 @@ bool ha_federatedx::create_where_from_key(String *to,
Field *field= key_part->field;
uint store_length= key_part->store_length;
uint part_length= MY_MIN(store_length, length);
- needs_quotes= field->str_needs_quotes();
+ bool needs_quotes= field->str_needs_quotes();
+ bool reverse= key_part->key_part_flag & HA_REVERSE_SORT;
+ static const LEX_CSTRING lt={STRING_WITH_LEN(" < ") };
+ static const LEX_CSTRING gt={STRING_WITH_LEN(" > ") };
+ static const LEX_CSTRING le={STRING_WITH_LEN(" <= ") };
+ static const LEX_CSTRING ge={STRING_WITH_LEN(" >= ") };
DBUG_DUMP("key, start of loop", ptr, length);
if (key_part->null_bit)
@@ -1305,16 +1308,8 @@ bool ha_federatedx::create_where_from_key(String *to,
if (emit_key_part_name(&tmp, key_part))
goto err;
- if (from_records_in_range)
- {
- if (tmp.append(STRING_WITH_LEN(" >= ")))
- goto err;
- }
- else
- {
- if (tmp.append(STRING_WITH_LEN(" = ")))
- goto err;
- }
+ if (tmp.append(STRING_WITH_LEN(" = ")))
+ goto err;
if (emit_key_part_element(&tmp, key_part, needs_quotes, 0, ptr,
part_length))
@@ -1345,12 +1340,12 @@ bool ha_federatedx::create_where_from_key(String *to,
if (i > 0) /* end key */
{
- if (tmp.append(STRING_WITH_LEN(" <= ")))
+ if (tmp.append(reverse ? ge : le))
goto err;
}
else /* start key */
{
- if (tmp.append(STRING_WITH_LEN(" > ")))
+ if (tmp.append(reverse ? lt : gt))
goto err;
}
@@ -1365,7 +1360,7 @@ bool ha_federatedx::create_where_from_key(String *to,
case HA_READ_KEY_OR_NEXT:
DBUG_PRINT("info", ("federatedx HA_READ_KEY_OR_NEXT %d", i));
if (emit_key_part_name(&tmp, key_part) ||
- tmp.append(STRING_WITH_LEN(" >= ")) ||
+ tmp.append(reverse ? le : ge) ||
emit_key_part_element(&tmp, key_part, needs_quotes, 0, ptr,
part_length))
goto err;
@@ -1375,7 +1370,7 @@ bool ha_federatedx::create_where_from_key(String *to,
if (store_length >= length)
{
if (emit_key_part_name(&tmp, key_part) ||
- tmp.append(STRING_WITH_LEN(" < ")) ||
+ tmp.append(reverse ? gt : lt) ||
emit_key_part_element(&tmp, key_part, needs_quotes, 0, ptr,
part_length))
goto err;
@@ -1385,7 +1380,7 @@ bool ha_federatedx::create_where_from_key(String *to,
case HA_READ_KEY_OR_PREV:
DBUG_PRINT("info", ("federatedx HA_READ_KEY_OR_PREV %d", i));
if (emit_key_part_name(&tmp, key_part) ||
- tmp.append(STRING_WITH_LEN(" <= ")) ||
+ tmp.append(reverse ? ge : le) ||
emit_key_part_element(&tmp, key_part, needs_quotes, 0, ptr,
part_length))
goto err;
@@ -2640,10 +2635,7 @@ int ha_federatedx::index_read_idx_with_result_set(uchar *buf, uint index,
range.key= key;
range.length= key_len;
range.flag= find_flag;
- create_where_from_key(&index_string,
- &table->key_info[index],
- &range,
- NULL, 0, 0);
+ create_where_from_key(&index_string, &table->key_info[index], &range, 0, 0);
sql_query.append(index_string);
if ((retval= txn->acquire(share, ha_thd(), TRUE, &io)))
@@ -2722,9 +2714,8 @@ int ha_federatedx::read_range_first(const key_range *start_key,
sql_query.length(0);
sql_query.append(share->select_query);
- create_where_from_key(&sql_query,
- &table->key_info[active_index],
- start_key, end_key, 0, eq_range_arg);
+ create_where_from_key(&sql_query, &table->key_info[active_index],
+ start_key, end_key, eq_range_arg);
if ((retval= txn->acquire(share, ha_thd(), TRUE, &io)))
DBUG_RETURN(retval);
diff --git a/storage/federatedx/ha_federatedx.h b/storage/federatedx/ha_federatedx.h
index 8c59bc7c13a..3573c658b11 100644
--- a/storage/federatedx/ha_federatedx.h
+++ b/storage/federatedx/ha_federatedx.h
@@ -291,8 +291,7 @@ private:
FEDERATEDX_IO_RESULT *result);
bool create_where_from_key(String *to, KEY *key_info,
const key_range *start_key,
- const key_range *end_key,
- bool records_in_range, bool eq_range);
+ const key_range *end_key, bool eq_range);
int stash_remote_error();
static federatedx_txn *get_txn(THD *thd, bool no_create= FALSE);
diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt
index 1651557840f..a61b762f58b 100644
--- a/storage/innobase/CMakeLists.txt
+++ b/storage/innobase/CMakeLists.txt
@@ -20,19 +20,9 @@
INCLUDE(CheckFunctionExists)
INCLUDE(CheckCSourceCompiles)
INCLUDE(CheckCSourceRuns)
-INCLUDE(lz4.cmake)
-INCLUDE(lzo.cmake)
-INCLUDE(lzma.cmake)
-INCLUDE(bzip2.cmake)
-INCLUDE(snappy.cmake)
INCLUDE(numa)
INCLUDE(TestBigEndian)
-MYSQL_CHECK_LZ4()
-MYSQL_CHECK_LZO()
-MYSQL_CHECK_LZMA()
-MYSQL_CHECK_BZIP2()
-MYSQL_CHECK_SNAPPY()
MYSQL_CHECK_NUMA()
INCLUDE(${MYSQL_CMAKE_SCRIPT_DIR}/compile_flags.cmake)
@@ -284,7 +274,6 @@ SET(INNOBASE_SOURCES
include/lock0types.h
include/log0crypt.h
include/log0log.h
- include/log0log.inl
include/log0recv.h
include/log0types.h
include/mach0data.h
@@ -313,7 +302,6 @@ SET(INNOBASE_SOURCES
include/que0types.h
include/read0types.h
include/rem0cmp.h
- include/rem0cmp.inl
include/rem0rec.h
include/rem0rec.inl
include/rem0types.h
@@ -444,7 +432,9 @@ OPTION(WITH_PMEM "Support redo log in persistent memory" OFF)
FIND_PACKAGE(PMEM)
IF(PMEM_FOUND)
INCLUDE_DIRECTORIES(${PMEM_INCLUDES})
- ADD_COMPILE_FLAGS(log/log0log.cc COMPILE_FLAGS "-DHAVE_PMEM")
+ ADD_COMPILE_FLAGS(log/log0log.cc log/log0recv.cc
+ buf/buf0flu.cc mtr/mtr0mtr.cc trx/trx0trx.cc srv/srv0start.cc
+ COMPILE_FLAGS "-DHAVE_PMEM")
SET(PMEM_LIBRARY ${PMEM_LIBRARIES})
ELSE()
IF(WITH_PMEM)
diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc
index 0b74d3b4311..4d576ff7a8b 100644
--- a/storage/innobase/btr/btr0btr.cc
+++ b/storage/innobase/btr/btr0btr.cc
@@ -402,8 +402,8 @@ btr_root_adjust_on_import(
} else {
/* Check that the table flags and the tablespace
flags match. */
- ulint tf = dict_tf_to_fsp_flags(table->flags);
- ulint sf = table->space->flags;
+ uint32_t tf = dict_tf_to_fsp_flags(table->flags);
+ uint32_t sf = table->space->flags;
sf &= ~FSP_FLAGS_MEM_MASK;
tf &= ~FSP_FLAGS_MEM_MASK;
if (fil_space_t::is_flags_equal(tf, sf)
@@ -2376,7 +2376,8 @@ btr_page_insert_fits(
if (!(end_rec = split_rec)) {
end_rec = page_rec_get_next(btr_cur_get_rec(cursor));
- } else if (cmp_dtuple_rec(tuple, split_rec, *offsets) < 0) {
+ } else if (cmp_dtuple_rec(tuple, split_rec, cursor->index(),
+ *offsets) < 0) {
rec = split_rec;
end_rec = page_get_supremum_rec(page);
goto got_rec;
@@ -2697,7 +2698,7 @@ btr_page_tuple_smaller(
? cursor->index()->n_core_fields : 0,
n_uniq, heap);
- return(cmp_dtuple_rec(tuple, first_rec, *offsets) < 0);
+ return cmp_dtuple_rec(tuple, first_rec, cursor->index(), *offsets) < 0;
}
/** Insert the tuple into the right sibling page, if the cursor is at the end
@@ -3093,7 +3094,8 @@ got_split_rec:
: 0,
n_uniq, heap);
- insert_left = cmp_dtuple_rec(tuple, split_rec, *offsets) < 0;
+ insert_left = cmp_dtuple_rec(tuple, split_rec, cursor->index(),
+ *offsets) < 0;
if (!insert_left && new_page_zip && n_iterations > 0) {
/* If a compressed page has already been split,
@@ -4611,7 +4613,8 @@ btr_check_node_ptr(
tuple, btr_cur_get_rec(&cursor),
PAGE_CUR_WITHIN));
} else {
- ut_a(!cmp_dtuple_rec(tuple, btr_cur_get_rec(&cursor), offsets));
+ ut_a(!cmp_dtuple_rec(tuple, btr_cur_get_rec(&cursor), index,
+ offsets));
}
func_exit:
mem_heap_free(heap);
@@ -5106,7 +5109,7 @@ broken_links:
/* For spatial index, we cannot guarantee the key ordering
across pages, so skip the record compare verification for
now. Will enhanced in special R-Tree index validation scheme */
- if (!index->is_spatial()
+ if (index->is_btree()
&& cmp_rec_rec(rec, right_rec,
offsets, offsets2, index) >= 0) {
@@ -5152,8 +5155,7 @@ broken_links:
in parent level and linked pages in the child level.
2) Search parent from root is very costly for R-tree.
We will add special validation mechanism for R-tree later (WL #7520) */
- if (!index->is_spatial()
- && block->page.id().page_no() != index->page) {
+ if (index->is_btree() && block->page.id().page_no() != index->page) {
/* Check father node pointers */
rec_t* node_ptr
= page_rec_get_next(page_get_infimum_rec(page));
@@ -5213,7 +5215,7 @@ broken_links:
index, first_rec,
0, heap, btr_page_get_level(page));
- if (cmp_dtuple_rec(node_ptr_tuple, node_ptr,
+ if (cmp_dtuple_rec(node_ptr_tuple, node_ptr, index,
offsets)) {
btr_validate_report1(index, level, block);
diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc
index b9681040092..dda6a95da16 100644
--- a/storage/innobase/btr/btr0cur.cc
+++ b/storage/innobase/btr/btr0cur.cc
@@ -1016,9 +1016,10 @@ dberr_t btr_cur_t::search_leaf(const dtuple_t *tuple, page_cur_mode_t mode,
# ifdef UNIV_SEARCH_PERF_STAT
info->n_searches++;
# endif
+ bool ahi_enabled= btr_search_enabled && !index()->is_ibuf();
/* We do a dirty read of btr_search_enabled below,
and btr_search_guess_on_hash() will have to check it again. */
- if (!btr_search_enabled);
+ if (!ahi_enabled);
else if (btr_search_guess_on_hash(index(), info, tuple, mode,
latch_mode, this, mtr))
{
@@ -1350,7 +1351,7 @@ release_tree:
reached_latched_leaf:
#ifdef BTR_CUR_HASH_ADAPT
- if (btr_search_enabled && !(tuple->info_bits & REC_INFO_MIN_REC_FLAG))
+ if (ahi_enabled && !(tuple->info_bits & REC_INFO_MIN_REC_FLAG))
{
if (page_cur_search_with_match_bytes(tuple, mode,
&up_match, &up_bytes,
@@ -5955,7 +5956,6 @@ btr_store_big_rec_extern_fields(
byte* field_ref;
ulint extern_len;
ulint store_len;
- ulint space_id;
ulint i;
mtr_t mtr;
mem_heap_t* heap = NULL;
@@ -5984,7 +5984,6 @@ btr_store_big_rec_extern_fields(
btr_blob_log_check_t redo_log(pcur, btr_mtr, offsets, &rec_block,
&rec, op);
page_zip = buf_block_get_page_zip(rec_block);
- space_id = rec_block->page.id().space();
if (page_zip) {
int err;
@@ -6112,6 +6111,7 @@ alloc_fail:
goto alloc_fail;
}
+ const uint32_t space_id = block->page.id().space();
const uint32_t page_no = block->page.id().page_no();
if (prev_page_no == FIL_NULL) {
diff --git a/storage/innobase/btr/btr0pcur.cc b/storage/innobase/btr/btr0pcur.cc
index d48437e4bd0..1dd26f8c467 100644
--- a/storage/innobase/btr/btr0pcur.cc
+++ b/storage/innobase/btr/btr0pcur.cc
@@ -473,7 +473,7 @@ btr_pcur_t::restore_position(btr_latch_mode restore_latch_mode, mtr_t *mtr)
if (rel_pos == BTR_PCUR_ON && btr_pcur_is_on_user_rec(this)) {
ulint n_matched_fields= 0;
if (!cmp_dtuple_rec_with_match(
- tuple, btr_pcur_get_rec(this),
+ tuple, btr_pcur_get_rec(this), index,
rec_get_offsets(btr_pcur_get_rec(this), index, offsets,
index->n_core_fields, ULINT_UNDEFINED, &heap),
&n_matched_fields)) {
diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc
index a1609248512..300276ff3a6 100644
--- a/storage/innobase/btr/btr0sea.cc
+++ b/storage/innobase/btr/btr0sea.cc
@@ -808,7 +808,8 @@ btr_search_check_guess(
offsets = rec_get_offsets(rec, cursor->index(), offsets,
cursor->index()->n_core_fields,
n_unique, &heap);
- cmp = cmp_dtuple_rec_with_match(tuple, rec, offsets, &match);
+ cmp = cmp_dtuple_rec_with_match(tuple, rec, cursor->index(), offsets,
+ &match);
if (mode == PAGE_CUR_GE) {
if (cmp > 0) {
@@ -873,8 +874,9 @@ btr_search_check_guess(
offsets = rec_get_offsets(prev_rec, cursor->index(), offsets,
cursor->index()->n_core_fields,
n_unique, &heap);
- cmp = cmp_dtuple_rec_with_match(
- tuple, prev_rec, offsets, &match);
+ cmp = cmp_dtuple_rec_with_match(tuple, prev_rec,
+ cursor->index(), offsets,
+ &match);
if (mode == PAGE_CUR_GE) {
success = cmp > 0;
} else {
@@ -914,7 +916,7 @@ btr_search_check_guess(
cursor->index()->n_core_fields,
n_unique, &heap);
cmp = cmp_dtuple_rec_with_match(
- tuple, next_rec, offsets, &match);
+ tuple, next_rec, cursor->index(), offsets, &match);
if (mode == PAGE_CUR_LE) {
success = cmp < 0;
cursor->up_match = match;
diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc
index 106569f74b2..031270a05d3 100644
--- a/storage/innobase/buf/buf0buf.cc
+++ b/storage/innobase/buf/buf0buf.cc
@@ -36,10 +36,11 @@ Created 11/5/1995 Heikki Tuuri
#include "mach0data.h"
#include "buf0buf.h"
#include "buf0checksum.h"
-#include "ut0crc32.h"
#include <string.h>
-#ifndef UNIV_INNOCHECKSUM
+#ifdef UNIV_INNOCHECKSUM
+#include "my_sys.h"
+#else
#include "my_cpu.h"
#include "mem0mem.h"
#include "btr0btr.h"
@@ -374,8 +375,8 @@ static bool buf_tmp_page_decrypt(byte* tmp_frame, byte* src_frame)
src_frame + srv_page_size - FIL_PAGE_FCRC32_CHECKSUM,
FIL_PAGE_FCRC32_CHECKSUM);
- memcpy_aligned<OS_FILE_LOG_BLOCK_SIZE>(src_frame, tmp_frame,
- srv_page_size);
+ memcpy_aligned<UNIV_PAGE_SIZE_MIN>(src_frame, tmp_frame,
+ srv_page_size);
srv_stats.pages_decrypted.inc();
srv_stats.n_temp_blocks_decrypted.inc();
@@ -560,15 +561,12 @@ bool buf_is_zeroes(span<const byte> buf)
}
/** Check if a page is corrupt.
-@param[in] check_lsn whether the LSN should be checked
-@param[in] read_buf database page
-@param[in] fsp_flags tablespace flags
+@param check_lsn whether FIL_PAGE_LSN should be checked
+@param read_buf database page
+@param fsp_flags contents of FIL_SPACE_FLAGS
@return whether the page is corrupted */
-bool
-buf_page_is_corrupted(
- bool check_lsn,
- const byte* read_buf,
- ulint fsp_flags)
+bool buf_page_is_corrupted(bool check_lsn, const byte *read_buf,
+ uint32_t fsp_flags)
{
if (fil_space_t::full_crc32(fsp_flags)) {
bool compressed = false, corrupted = false;
@@ -593,8 +591,8 @@ buf_page_is_corrupted(
}
});
- if (crc32 != ut_crc32(read_buf,
- size - FIL_PAGE_FCRC32_CHECKSUM)) {
+ if (crc32 != my_crc32c(0, read_buf,
+ size - FIL_PAGE_FCRC32_CHECKSUM)) {
return true;
}
static_assert(FIL_PAGE_FCRC32_KEY_VERSION == 0, "alignment");
@@ -765,18 +763,10 @@ buf_madvise_do_dump()
/* mirrors allocation in log_t::create() */
if (log_sys.buf) {
- ret += madvise(log_sys.buf,
- srv_log_buffer_size,
- MADV_DODUMP);
- ret += madvise(log_sys.flush_buf,
- srv_log_buffer_size,
+ ret += madvise(log_sys.buf, log_sys.buf_size, MADV_DODUMP);
+ ret += madvise(log_sys.flush_buf, log_sys.buf_size,
MADV_DODUMP);
}
- /* mirrors recv_sys_t::create() */
- if (recv_sys.buf)
- {
- ret+= madvise(recv_sys.buf, recv_sys.len, MADV_DODUMP);
- }
mysql_mutex_lock(&buf_pool.mutex);
auto chunk = buf_pool.chunks;
@@ -961,7 +951,7 @@ inline const buf_block_t *buf_pool_t::chunk_t::not_freed() const
{
/* The page cleaner is disabled in read-only mode. No pages
can be dirtied, so all of them must be clean. */
- ut_ad(lsn == 0 || lsn == recv_sys.recovered_lsn ||
+ ut_ad(lsn == 0 || lsn == recv_sys.lsn ||
srv_force_recovery == SRV_FORCE_NO_LOG_REDO);
break;
}
@@ -1059,7 +1049,11 @@ bool buf_pool_t::create()
while (++chunk < chunks + n_chunks);
ut_ad(is_initialised());
+#if defined(__aarch64__)
mysql_mutex_init(buf_pool_mutex_key, &mutex, MY_MUTEX_INIT_FAST);
+#else
+ mysql_mutex_init(buf_pool_mutex_key, &mutex, nullptr);
+#endif
UT_LIST_INIT(LRU, &buf_page_t::LRU);
UT_LIST_INIT(withdraw, &buf_page_t::list);
@@ -1201,7 +1195,7 @@ inline bool buf_pool_t::realloc(buf_block_t *block)
hash_lock.lock();
if (block->page.can_relocate()) {
- memcpy_aligned<OS_FILE_LOG_BLOCK_SIZE>(
+ memcpy_aligned<UNIV_PAGE_SIZE_MIN>(
new_block->page.frame, block->page.frame,
srv_page_size);
mysql_mutex_lock(&buf_pool.flush_list_mutex);
@@ -1357,8 +1351,8 @@ inline bool buf_pool_t::withdraw_blocks()
buf_block_t* block;
ulint loop_count = 0;
- ib::info() << "start to withdraw the last "
- << withdraw_target << " blocks";
+ ib::info() << "Start to withdraw the last "
+ << withdraw_target << " blocks.";
while (UT_LIST_GET_LEN(withdraw) < withdraw_target) {
@@ -1445,15 +1439,15 @@ realloc_frame:
mysql_mutex_unlock(&mutex);
buf_resize_status(
- "withdrawing blocks. (" ULINTPF "/" ULINTPF ")",
+ "Withdrawing blocks. (" ULINTPF "/" ULINTPF ").",
UT_LIST_GET_LEN(withdraw),
withdraw_target);
- ib::info() << "withdrew "
+ ib::info() << "Withdrew "
<< count1 << " blocks from free list."
- << " Tried to relocate " << count2 << " pages ("
+ << " Tried to relocate " << count2 << " blocks ("
<< UT_LIST_GET_LEN(withdraw) << "/"
- << withdraw_target << ")";
+ << withdraw_target << ").";
if (++loop_count >= 10) {
/* give up for now.
@@ -1476,8 +1470,8 @@ realloc_frame:
}
}
- ib::info() << "withdrawn target: " << UT_LIST_GET_LEN(withdraw)
- << " blocks";
+ ib::info() << "Withdrawn target: " << UT_LIST_GET_LEN(withdraw)
+ << " blocks.";
return(false);
}
@@ -1555,11 +1549,15 @@ inline void buf_pool_t::resize()
ut_ad(srv_buf_pool_chunk_unit > 0);
ulint new_instance_size = srv_buf_pool_size >> srv_page_size_shift;
+ std::ostringstream str_old_size, str_new_size, str_chunk_size;
+ str_old_size << ib::bytes_iec{srv_buf_pool_old_size};
+ str_new_size << ib::bytes_iec{srv_buf_pool_size};
+ str_chunk_size << ib::bytes_iec{srv_buf_pool_chunk_unit};
- buf_resize_status("Resizing buffer pool from " ULINTPF " to "
- ULINTPF " (unit=" ULINTPF ").",
- srv_buf_pool_old_size, srv_buf_pool_size,
- srv_buf_pool_chunk_unit);
+ buf_resize_status("Resizing buffer pool from %s to %s (unit = %s).",
+ str_old_size.str().c_str(),
+ str_new_size.str().c_str(),
+ str_chunk_size.str().c_str());
#ifdef BTR_CUR_HASH_ADAPT
/* disable AHI if needed */
@@ -1654,7 +1652,7 @@ withdraw_retry:
goto withdraw_retry;
}
- buf_resize_status("Latching whole of buffer pool.");
+ buf_resize_status("Latching entire buffer pool.");
#ifndef DBUG_OFF
{
@@ -1678,15 +1676,15 @@ withdraw_retry:
/* Indicate critical path */
resizing.store(true, std::memory_order_relaxed);
- mysql_mutex_lock(&mutex);
- page_hash.write_lock_all();
+ mysql_mutex_lock(&mutex);
+ page_hash.write_lock_all();
chunk_t::map_reg = UT_NEW_NOKEY(chunk_t::map());
/* add/delete chunks */
- buf_resize_status("buffer pool resizing with chunks "
- ULINTPF " to " ULINTPF ".",
+ buf_resize_status("Resizing buffer pool from "
+ ULINTPF " chunks to " ULINTPF " chunks.",
n_chunks, n_chunks_new);
if (is_shrinking()) {
@@ -1727,7 +1725,7 @@ withdraw_retry:
withdraw_target = 0;
ib::info() << n_chunks - n_chunks_new
- << " chunks (" << sum_freed
+ << " Chunks (" << sum_freed
<< " blocks) were freed.";
n_chunks = n_chunks_new;
@@ -1844,18 +1842,18 @@ calc_buf_pool_size:
if (!warning && new_size_too_diff) {
srv_buf_pool_base_size = srv_buf_pool_size;
- buf_resize_status("Resizing also other hash tables.");
+ buf_resize_status("Resizing other hash tables.");
srv_lock_table_size = 5
* (srv_buf_pool_size >> srv_page_size_shift);
lock_sys.resize(srv_lock_table_size);
dict_sys.resize();
- ib::info() << "Resized hash tables at lock_sys,"
+ ib::info() << "Resized hash tables: lock_sys,"
#ifdef BTR_CUR_HASH_ADAPT
" adaptive hash index,"
#endif /* BTR_CUR_HASH_ADAPT */
- " dictionary.";
+ " and dictionary.";
}
/* normalize ibuf.max_size */
@@ -1863,9 +1861,8 @@ calc_buf_pool_size:
if (srv_buf_pool_old_size != srv_buf_pool_size) {
- ib::info() << "Completed to resize buffer pool from "
- << srv_buf_pool_old_size
- << " to " << srv_buf_pool_size << ".";
+ buf_resize_status("Completed resizing buffer pool from %zu to %zu bytes."
+ ,srv_buf_pool_old_size, srv_buf_pool_size);
srv_buf_pool_old_size = srv_buf_pool_size;
}
@@ -1877,16 +1874,8 @@ calc_buf_pool_size:
}
#endif /* BTR_CUR_HASH_ADAPT */
- char now[32];
-
- ut_sprintf_timestamp(now);
- if (!warning) {
- buf_resize_status("Completed resizing buffer pool at %s.",
- now);
- } else {
- buf_resize_status("Resizing buffer pool failed,"
- " finished resizing at %s.", now);
- }
+ if (warning)
+ buf_resize_status("Resizing buffer pool failed");
ut_d(validate());
@@ -4166,10 +4155,10 @@ buf_print_io(
/** Verify that post encryption checksum match with the calculated checksum.
This function should be called only if tablespace contains crypt data metadata.
-@param[in] page page frame
-@param[in] fsp_flags tablespace flags
-@return true if true if page is encrypted and OK, false otherwise */
-bool buf_page_verify_crypt_checksum(const byte* page, ulint fsp_flags)
+@param page page frame
+@param fsp_flags contents of FSP_SPACE_FLAGS
+@return whether the page is encrypted and valid */
+bool buf_page_verify_crypt_checksum(const byte *page, uint32_t fsp_flags)
{
if (!fil_space_t::full_crc32(fsp_flags)) {
return fil_space_verify_crypt_checksum(
diff --git a/storage/innobase/buf/buf0checksum.cc b/storage/innobase/buf/buf0checksum.cc
index c9818fa600f..662343ae60d 100644
--- a/storage/innobase/buf/buf0checksum.cc
+++ b/storage/innobase/buf/buf0checksum.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2017, 2021, MariaDB Corporation.
+Copyright (c) 2017, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -26,7 +26,6 @@ Created Aug 11, 2011 Vasil Dimov
#include "buf0checksum.h"
#include "fil0fil.h"
-#include "ut0crc32.h"
#include "ut0rnd.h"
#ifndef UNIV_INNOCHECKSUM
@@ -46,12 +45,12 @@ uint32_t buf_calc_page_crc32(const byte* page)
should be combined with the CRC-32 function, not with
exclusive OR. We stick to the current algorithm in order to
remain compatible with old data files. */
- return ut_crc32(page + FIL_PAGE_OFFSET,
- FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION
- - FIL_PAGE_OFFSET)
- ^ ut_crc32(page + FIL_PAGE_DATA,
- srv_page_size
- - (FIL_PAGE_DATA + FIL_PAGE_END_LSN_OLD_CHKSUM));
+ return my_crc32c(0, page + FIL_PAGE_OFFSET,
+ FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION
+ - FIL_PAGE_OFFSET)
+ ^ my_crc32c(0, page + FIL_PAGE_DATA,
+ srv_page_size
+ - (FIL_PAGE_DATA + FIL_PAGE_END_LSN_OLD_CHKSUM));
}
#ifndef UNIV_INNOCHECKSUM
diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc
index c3f221c6f61..8d8b92ae560 100644
--- a/storage/innobase/buf/buf0dblwr.cc
+++ b/storage/innobase/buf/buf0dblwr.cc
@@ -238,8 +238,6 @@ fail:
/* Remove doublewrite pages from LRU */
buf_pool_invalidate();
-
- ib::info() << "Doublewrite buffer created";
goto start_again;
}
@@ -351,7 +349,7 @@ func_exit:
/** Process and remove the double write buffer pages for all tablespaces. */
void buf_dblwr_t::recover()
{
- ut_ad(recv_sys.parse_start_lsn);
+ ut_ad(log_sys.last_checkpoint_lsn);
if (!is_created())
return;
@@ -369,13 +367,13 @@ void buf_dblwr_t::recover()
continue;
const lsn_t lsn= mach_read_from_8(page + FIL_PAGE_LSN);
- if (recv_sys.parse_start_lsn > lsn)
+ if (log_sys.last_checkpoint_lsn > lsn)
/* Pages written before the checkpoint are not useful for recovery. */
continue;
- const ulint space_id= page_get_space_id(page);
+ const uint32_t space_id= page_get_space_id(page);
const page_id_t page_id(space_id, page_no);
- if (recv_sys.scanned_lsn < lsn)
+ if (recv_sys.lsn < lsn)
{
ib::info() << "Ignoring a doublewrite copy of page " << page_id
<< " with future log sequence number " << lsn;
diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc
index 05b18de1d5b..63a28aa1a37 100644
--- a/storage/innobase/buf/buf0dump.cc
+++ b/storage/innobase/buf/buf0dump.cc
@@ -314,11 +314,13 @@ buf_dump(
n_pages * sizeof(*dump)));
if (dump == NULL) {
+ std::ostringstream str_bytes;
mysql_mutex_unlock(&buf_pool.mutex);
fclose(f);
+ str_bytes << ib::bytes_iec{n_pages * sizeof(*dump)};
buf_dump_status(STATUS_ERR,
- "Cannot allocate " ULINTPF " bytes: %s",
- (ulint) (n_pages * sizeof(*dump)),
+ "Cannot allocate %s: %s",
+ str_bytes.str().c_str(),
strerror(errno));
/* leave tmp_filename to exist */
return;
@@ -493,11 +495,14 @@ buf_load()
}
if (dump == NULL) {
+ std::ostringstream str_bytes;
fclose(f);
- buf_load_status(STATUS_ERR,
- "Cannot allocate " ULINTPF " bytes: %s",
- dump_n * sizeof(*dump),
+ str_bytes << ib::bytes_iec{dump_n * sizeof(*dump)};
+ buf_dump_status(STATUS_ERR,
+ "Cannot allocate %s: %s",
+ str_bytes.str().c_str(),
strerror(errno));
+ /* leave tmp_filename to exist */
return;
}
@@ -562,7 +567,7 @@ buf_load()
/* Avoid calling the expensive fil_space_t::get() for each
page within the same tablespace. dump[] is sorted by (space, page),
so all pages from a given tablespace are consecutive. */
- ulint cur_space_id = dump[0].space();
+ uint32_t cur_space_id = dump[0].space();
fil_space_t* space = fil_space_t::get(cur_space_id);
ulint zip_size = space ? space->zip_size() : 0;
@@ -574,10 +579,9 @@ buf_load()
for (i = 0; i < dump_n && !SHUTTING_DOWN(); i++) {
/* space_id for this iteration of the loop */
- const ulint this_space_id = dump[i].space();
+ const uint32_t this_space_id = dump[i].space();
- if (this_space_id == SRV_TMP_SPACE_ID) {
- /* Ignore the innodb_temporary tablespace. */
+ if (this_space_id >= SRV_SPACE_ID_UPPER_BOUND) {
continue;
}
diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc
index 484f6a3abb7..400220235a7 100644
--- a/storage/innobase/buf/buf0flu.cc
+++ b/storage/innobase/buf/buf0flu.cc
@@ -40,11 +40,8 @@ Created 11/11/1995 Heikki Tuuri
#include "log0crypt.h"
#include "srv0mon.h"
#include "fil0pagecompress.h"
-#ifdef HAVE_LZO
-# include "lzo/lzo1x.h"
-#elif defined HAVE_SNAPPY
-# include "snappy-c.h"
-#endif
+#include "lzo/lzo1x.h"
+#include "snappy-c.h"
/** Number of pages flushed via LRU. Protected by buf_pool.mutex.
Also included in buf_pool.stat.n_pages_written. */
@@ -114,6 +111,7 @@ static void buf_flush_validate_skip()
void buf_pool_t::page_cleaner_wakeup(bool for_LRU)
{
+ ut_d(buf_flush_validate_skip());
if (!page_cleaner_idle())
return;
double dirty_pct= double(UT_LIST_GET_LEN(buf_pool.flush_list)) * 100.0 /
@@ -155,49 +153,14 @@ void buf_pool_t::page_cleaner_wakeup(bool for_LRU)
}
}
-inline void buf_pool_t::delete_from_flush_list_low(buf_page_t *bpage)
+/** Remove a block from flush_list.
+@param bpage buffer pool page */
+void buf_pool_t::delete_from_flush_list(buf_page_t *bpage) noexcept
{
ut_ad(!fsp_is_system_temporary(bpage->id().space()));
mysql_mutex_assert_owner(&flush_list_mutex);
flush_hp.adjust(bpage);
UT_LIST_REMOVE(flush_list, bpage);
-}
-
-/** Insert a modified block into the flush list.
-@param block modified block
-@param lsn start LSN of the mini-transaction that modified the block */
-void buf_pool_t::insert_into_flush_list(buf_block_t *block, lsn_t lsn)
-{
- mysql_mutex_assert_not_owner(&mutex);
- mysql_mutex_assert_owner(&log_sys.flush_order_mutex);
- ut_ad(lsn > 2);
- ut_ad(!fsp_is_system_temporary(block->page.id().space()));
-
- mysql_mutex_lock(&flush_list_mutex);
- if (ut_d(const lsn_t old=) block->page.oldest_modification())
- {
- ut_ad(old == 1);
- delete_from_flush_list_low(&block->page);
- }
- else
- flush_list_bytes+= block->physical_size();
- ut_ad(flush_list_bytes <= curr_pool_size);
-
- block->page.set_oldest_modification(lsn);
- MEM_CHECK_DEFINED(block->page.zip.data
- ? block->page.zip.data : block->page.frame,
- block->physical_size());
- UT_LIST_ADD_FIRST(flush_list, &block->page);
- ut_d(buf_flush_validate_skip());
- page_cleaner_wakeup();
- mysql_mutex_unlock(&flush_list_mutex);
-}
-
-/** Remove a block from flush_list.
-@param bpage buffer pool page */
-void buf_pool_t::delete_from_flush_list(buf_page_t *bpage)
-{
- delete_from_flush_list_low(bpage);
flush_list_bytes-= bpage->physical_size();
bpage->clear_oldest_modification();
#ifdef UNIV_DEBUG
@@ -210,7 +173,7 @@ deleting the data file of that tablespace.
The pages still remain a part of LRU and are evicted from
the list as they age towards the tail of the LRU.
@param id tablespace identifier */
-void buf_flush_remove_pages(ulint id)
+void buf_flush_remove_pages(uint32_t id)
{
const page_id_t first(id, 0), end(id + 1, 0);
ut_ad(id);
@@ -418,7 +381,7 @@ void buf_flush_assign_full_crc32_checksum(byte* page)
ut_ad(!corrupted);
ut_ad(size == uint(srv_page_size));
const ulint payload = srv_page_size - FIL_PAGE_FCRC32_CHECKSUM;
- mach_write_to_4(page + payload, ut_crc32(page, payload));
+ mach_write_to_4(page + payload, my_crc32c(0, page, payload));
}
/** Initialize a page for writing to the tablespace.
@@ -572,11 +535,10 @@ static void buf_tmp_reserve_compression_buf(buf_tmp_buffer_t* slot)
/* Both Snappy and LZO compression methods require that the output
buffer be bigger than input buffer. Adjust the allocated size. */
ulint size= srv_page_size;
-#ifdef HAVE_LZO
- size= size + LZO1X_1_15_MEM_COMPRESS;
-#elif defined HAVE_SNAPPY
- size= snappy_max_compressed_length(size);
-#endif
+ if (provider_service_lzo->is_loaded)
+ size= LZO1X_1_15_MEM_COMPRESS;
+ else if (provider_service_snappy->is_loaded)
+ size= snappy_max_compressed_length(size);
slot->comp_buf= static_cast<byte*>(aligned_malloc(size, srv_page_size));
}
@@ -600,7 +562,7 @@ static byte* buf_tmp_page_encrypt(ulint offset, const byte* s, byte* d)
return NULL;
const ulint payload= srv_page_size - FIL_PAGE_FCRC32_CHECKSUM;
- mach_write_to_4(d + payload, ut_crc32(d, payload));
+ mach_write_to_4(d + payload, my_crc32c(0, d, payload));
srv_stats.pages_encrypted.inc();
srv_stats.n_temp_blocks_encrypted.inc();
@@ -725,7 +687,7 @@ not_compressed:
if (full_crc32)
{
static_assert(FIL_PAGE_FCRC32_CHECKSUM == 4, "alignment");
- mach_write_to_4(tmp + len - 4, ut_crc32(tmp, len - 4));
+ mach_write_to_4(tmp + len - 4, my_crc32c(0, tmp, len - 4));
ut_ad(!buf_page_is_corrupted(true, tmp, space->flags));
}
@@ -737,7 +699,7 @@ not_compressed:
}
/** Free a page whose underlying file page has been freed. */
-ATTRIBUTE_COLD void buf_pool_t::release_freed_page(buf_page_t *bpage)
+ATTRIBUTE_COLD void buf_pool_t::release_freed_page(buf_page_t *bpage) noexcept
{
mysql_mutex_assert_owner(&mutex);
ut_d(const lsn_t oldest_modification= bpage->oldest_modification();)
@@ -883,8 +845,7 @@ bool buf_page_t::flush(bool evict, fil_space_t *space)
(write_frame ? write_frame
: frame)));
ut_ad(lsn >= oldest_modification());
- if (lsn > log_sys.get_flushed_lsn())
- log_write_up_to(lsn, true);
+ log_write_up_to(lsn, true);
}
if (UNIV_LIKELY(space->purpose != FIL_TYPE_TEMPORARY))
buf_dblwr.add_unbuffered();
@@ -1672,10 +1633,10 @@ done:
buf_pool.flush_hp.set(nullptr);
mysql_mutex_unlock(&buf_pool.flush_list_mutex);
+ buf_pool.stat.n_pages_written+= n_flush;
+
buf_pool.try_LRU_scan= true;
pthread_cond_broadcast(&buf_pool.done_free);
-
- buf_pool.stat.n_pages_written+= n_flush;
mysql_mutex_unlock(&buf_pool.mutex);
if (n_flushed)
@@ -1720,6 +1681,69 @@ ulint buf_flush_LRU(ulint max_n, bool evict)
return pages;
}
+#ifdef HAVE_PMEM
+# include <libpmem.h>
+#endif
+
+/** Write checkpoint information to the log header and release mutex.
+@param end_lsn start LSN of the FILE_CHECKPOINT mini-transaction */
+inline void log_t::write_checkpoint(lsn_t end_lsn) noexcept
+{
+ ut_ad(!srv_read_only_mode);
+ ut_ad(end_lsn >= next_checkpoint_lsn);
+ ut_ad(end_lsn <= get_lsn());
+ ut_ad(end_lsn + SIZE_OF_FILE_CHECKPOINT <= get_lsn() ||
+ srv_shutdown_state > SRV_SHUTDOWN_INITIATED);
+
+ DBUG_PRINT("ib_log",
+ ("checkpoint at " LSN_PF " written", next_checkpoint_lsn));
+
+ auto n= next_checkpoint_no;
+ const size_t offset{(n & 1) ? CHECKPOINT_2 : CHECKPOINT_1};
+ static_assert(CPU_LEVEL1_DCACHE_LINESIZE >= 64, "efficiency");
+ static_assert(CPU_LEVEL1_DCACHE_LINESIZE <= 4096, "compatibility");
+ byte* c= my_assume_aligned<CPU_LEVEL1_DCACHE_LINESIZE>
+ (is_pmem() ? buf + offset : checkpoint_buf);
+ memset_aligned<CPU_LEVEL1_DCACHE_LINESIZE>(c, 0, CPU_LEVEL1_DCACHE_LINESIZE);
+ mach_write_to_8(my_assume_aligned<8>(c), next_checkpoint_lsn);
+ mach_write_to_8(my_assume_aligned<8>(c + 8), end_lsn);
+ mach_write_to_4(my_assume_aligned<4>(c + 60), my_crc32c(0, c, 60));
+#ifdef HAVE_PMEM
+ if (is_pmem())
+ pmem_persist(c, 64);
+ else
+#endif
+ {
+ ut_ad(!checkpoint_pending);
+ checkpoint_pending= true;
+ latch.wr_unlock();
+ /* FIXME: issue an asynchronous write */
+ log.write(offset, {c, get_block_size()});
+ if (srv_file_flush_method != SRV_O_DSYNC)
+ ut_a(log.flush());
+ latch.wr_lock(SRW_LOCK_CALL);
+ ut_ad(checkpoint_pending);
+ checkpoint_pending= false;
+ }
+
+ ut_ad(!checkpoint_pending);
+ next_checkpoint_no++;
+ last_checkpoint_lsn= next_checkpoint_lsn;
+
+ DBUG_PRINT("ib_log", ("checkpoint ended at " LSN_PF ", flushed to " LSN_PF,
+ next_checkpoint_lsn, get_flushed_lsn()));
+ if (overwrite_warned)
+ {
+ sql_print_information("InnoDB: Crash recovery was broken "
+ "between LSN=" LSN_PF
+ " and checkpoint LSN=" LSN_PF ".",
+ overwrite_warned, next_checkpoint_lsn);
+ overwrite_warned= 0;
+ }
+
+ latch.wr_unlock();
+}
+
/** Initiate a log checkpoint, discarding the start of the log.
@param oldest_lsn the checkpoint LSN
@param end_lsn log_sys.get_lsn()
@@ -1727,34 +1751,26 @@ ulint buf_flush_LRU(ulint max_n, bool evict)
static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn)
{
ut_ad(!srv_read_only_mode);
- mysql_mutex_assert_owner(&log_sys.mutex);
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
ut_ad(oldest_lsn <= end_lsn);
ut_ad(end_lsn == log_sys.get_lsn());
- ut_ad(oldest_lsn >= log_sys.last_checkpoint_lsn);
- const lsn_t age= oldest_lsn - log_sys.last_checkpoint_lsn;
-
- if (age > SIZE_OF_FILE_CHECKPOINT + log_sys.framing_size())
- /* Some log has been written since the previous checkpoint. */;
- else if (age > SIZE_OF_FILE_CHECKPOINT &&
- !((log_sys.log.calc_lsn_offset(oldest_lsn) ^
- log_sys.log.calc_lsn_offset(log_sys.last_checkpoint_lsn)) &
- ~lsn_t{OS_FILE_LOG_BLOCK_SIZE - 1}))
- /* Some log has been written to the same log block. */;
- else if (srv_shutdown_state > SRV_SHUTDOWN_INITIATED)
- /* MariaDB startup expects the redo log file to be logically empty
- (not even containing a FILE_CHECKPOINT record) after a clean shutdown.
- Perform an extra checkpoint at shutdown. */;
- else
+ if (oldest_lsn == log_sys.last_checkpoint_lsn ||
+ (oldest_lsn == end_lsn && oldest_lsn == log_sys.last_checkpoint_lsn +
+ (log_sys.is_encrypted()
+ ? SIZE_OF_FILE_CHECKPOINT + 8 : SIZE_OF_FILE_CHECKPOINT)))
{
/* Do nothing, because nothing was logged (other than a
FILE_CHECKPOINT record) since the previous checkpoint. */
- mysql_mutex_unlock(&log_sys.mutex);
+ do_nothing:
+ log_sys.latch.wr_unlock();
return true;
}
ut_ad(!recv_no_log_write);
-
+ ut_ad(oldest_lsn > log_sys.last_checkpoint_lsn);
/* Repeat the FILE_MODIFY records after the checkpoint, in case some
log records between the checkpoint and log_sys.lsn need them.
Finally, write a FILE_CHECKPOINT record. Redo log apply expects to
@@ -1763,39 +1779,28 @@ static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn)
It is important that we write out the redo log before any further
dirty pages are flushed to the tablespace files. At this point,
- because we hold log_sys.mutex, mtr_t::commit() in other threads will
- be blocked, and no pages can be added to the flush lists. */
- lsn_t flush_lsn= oldest_lsn;
-
- if (fil_names_clear(flush_lsn, oldest_lsn != end_lsn ||
- srv_shutdown_state <= SRV_SHUTDOWN_INITIATED))
- {
- flush_lsn= log_sys.get_lsn();
- ut_ad(flush_lsn >= end_lsn + SIZE_OF_FILE_CHECKPOINT);
- mysql_mutex_unlock(&log_sys.mutex);
- log_write_up_to(flush_lsn, true, true);
- mysql_mutex_lock(&log_sys.mutex);
- if (log_sys.last_checkpoint_lsn >= oldest_lsn)
- {
- mysql_mutex_unlock(&log_sys.mutex);
- return true;
- }
- }
- else
- ut_ad(oldest_lsn >= log_sys.last_checkpoint_lsn);
+ because we hold exclusive log_sys.latch,
+ mtr_t::commit() in other threads will be blocked,
+ and no pages can be added to buf_pool.flush_list. */
+ const lsn_t flush_lsn{fil_names_clear(oldest_lsn)};
+ ut_ad(flush_lsn >= end_lsn + SIZE_OF_FILE_CHECKPOINT);
+ log_sys.latch.wr_unlock();
+ log_write_up_to(flush_lsn, true);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
+ if (log_sys.last_checkpoint_lsn >= oldest_lsn)
+ goto do_nothing;
ut_ad(log_sys.get_flushed_lsn() >= flush_lsn);
if (log_sys.checkpoint_pending)
{
/* A checkpoint write is running */
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
return false;
}
log_sys.next_checkpoint_lsn= oldest_lsn;
- log_write_checkpoint_info(end_lsn);
- mysql_mutex_assert_not_owner(&log_sys.mutex);
+ log_sys.write_checkpoint(end_lsn);
return true;
}
@@ -1819,13 +1824,11 @@ static bool log_checkpoint()
fil_flush_file_spaces();
}
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
const lsn_t end_lsn= log_sys.get_lsn();
- mysql_mutex_lock(&log_sys.flush_order_mutex);
mysql_mutex_lock(&buf_pool.flush_list_mutex);
const lsn_t oldest_lsn= buf_pool.get_oldest_modification(end_lsn);
mysql_mutex_unlock(&buf_pool.flush_list_mutex);
- mysql_mutex_unlock(&log_sys.flush_order_mutex);
return log_checkpoint_low(oldest_lsn, end_lsn);
}
@@ -1866,7 +1869,6 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn)
{
ut_ad(sync_lsn);
ut_ad(sync_lsn < LSN_MAX);
- mysql_mutex_assert_not_owner(&log_sys.mutex);
ut_ad(!srv_read_only_mode);
if (recv_recovery_is_on())
@@ -1914,8 +1916,7 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn)
to happen until now. There could be an outstanding FILE_CHECKPOINT
record from a previous fil_names_clear() call, which we must
write out before we can advance the checkpoint. */
- if (sync_lsn > log_sys.get_flushed_lsn())
- log_write_up_to(sync_lsn, true);
+ log_write_up_to(sync_lsn, true);
DBUG_EXECUTE_IF("ib_log_checkpoint_avoid_hard", return;);
log_checkpoint();
}
@@ -1926,7 +1927,6 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn)
@param furious true=furious flushing, false=limit to innodb_io_capacity */
ATTRIBUTE_COLD void buf_flush_ahead(lsn_t lsn, bool furious)
{
- mysql_mutex_assert_not_owner(&log_sys.mutex);
ut_ad(!srv_read_only_mode);
if (recv_recovery_is_on())
@@ -1975,12 +1975,10 @@ ATTRIBUTE_COLD static void buf_flush_sync_for_checkpoint(lsn_t lsn)
fil_flush_file_spaces();
}
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
const lsn_t newest_lsn= log_sys.get_lsn();
- mysql_mutex_lock(&log_sys.flush_order_mutex);
mysql_mutex_lock(&buf_pool.flush_list_mutex);
lsn_t measure= buf_pool.get_oldest_modification(0);
- mysql_mutex_unlock(&log_sys.flush_order_mutex);
const lsn_t checkpoint_lsn= measure ? measure : newest_lsn;
if (!recv_recovery_is_on() &&
@@ -1993,13 +1991,11 @@ ATTRIBUTE_COLD static void buf_flush_sync_for_checkpoint(lsn_t lsn)
}
else
{
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
if (!measure)
measure= LSN_MAX;
}
- mysql_mutex_assert_not_owner(&log_sys.mutex);
-
/* After attempting log checkpoint, check if we have reached our target. */
const lsn_t target= buf_flush_sync_lsn;
@@ -2190,6 +2186,12 @@ func_exit:
goto func_exit;
}
+#if defined __aarch64__&&defined __GNUC__&&__GNUC__==4&&!defined __clang__
+/* Avoid GCC 4.8.5 internal compiler error "could not split insn".
+We would only need this for buf_flush_page_cleaner(),
+but GCC 4.8.5 does not support pop_options. */
+# pragma GCC optimize ("O0")
+#endif
/** page_cleaner thread tasked with flushing dirty pages from the buffer
pools. As of now we'll have only one coordinator. */
static void buf_flush_page_cleaner()
@@ -2500,7 +2502,11 @@ NOTE: The calling thread is not allowed to hold any buffer page latches! */
void buf_flush_sync()
{
if (recv_recovery_is_on())
+ {
+ mysql_mutex_lock(&recv_sys.mutex);
recv_sys.apply(true);
+ mysql_mutex_unlock(&recv_sys.mutex);
+ }
thd_wait_begin(nullptr, THD_WAIT_DISKIO);
tpool::tpool_wait_begin();
diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc
index 1947dfaeeb4..2e9b42e9f51 100644
--- a/storage/innobase/buf/buf0lru.cc
+++ b/storage/innobase/buf/buf0lru.cc
@@ -476,9 +476,7 @@ not_found:
<< flush_failures << " failed attempts to"
" flush a page!"
" Consider increasing innodb_buffer_pool_size."
- " Pending flushes (fsync) log: "
- << log_sys.get_pending_flushes()
- << "; buffer pool: "
+ " Pending flushes (fsync): "
<< fil_n_pending_tablespace_flushes
<< ". " << os_n_file_reads << " OS file reads, "
<< os_n_file_writes << " OS file writes, "
diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc
index b39a8f49133..fa91939acee 100644
--- a/storage/innobase/buf/buf0rea.cc
+++ b/storage/innobase/buf/buf0rea.cc
@@ -660,11 +660,9 @@ inline bool fil_space_t::is_freed(uint32_t page)
}
/** Issues read requests for pages which recovery wants to read in.
-@param[in] space_id tablespace id
-@param[in] page_nos array of page numbers to read, with the
-highest page number the last in the array
-@param[in] n number of page numbers in the array */
-void buf_read_recv_pages(ulint space_id, const uint32_t* page_nos, ulint n)
+@param space_id tablespace identifier
+@param page_nos page numbers to read, in ascending order */
+void buf_read_recv_pages(uint32_t space_id, st_::span<uint32_t> page_nos)
{
fil_space_t* space = fil_space_t::get(space_id);
@@ -675,7 +673,7 @@ void buf_read_recv_pages(ulint space_id, const uint32_t* page_nos, ulint n)
const ulint zip_size = space->zip_size();
- for (ulint i = 0; i < n; i++) {
+ for (ulint i = 0; i < page_nos.size(); i++) {
/* Ignore if the page already present in freed ranges. */
if (space->is_freed(page_nos[i])) {
@@ -716,7 +714,8 @@ void buf_read_recv_pages(ulint space_id, const uint32_t* page_nos, ulint n)
}
}
- DBUG_PRINT("ib_buf", ("recovery read (%u pages) for %s", n,
- space->chain.start->name));
+
+ DBUG_PRINT("ib_buf", ("recovery read (%zu pages) for %s",
+ page_nos.size(), space->chain.start->name));
space->release();
}
diff --git a/storage/innobase/bzip2.cmake b/storage/innobase/bzip2.cmake
deleted file mode 100644
index 91dd2bf0fcd..00000000000
--- a/storage/innobase/bzip2.cmake
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2014, SkySQL Ab. All Rights Reserved.
-#
-# This program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; version 2 of the License.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
-
-SET(WITH_INNODB_BZIP2 AUTO CACHE STRING
- "Build with bzip2. Possible values are 'ON', 'OFF', 'AUTO' and default is 'AUTO'")
-
-MACRO (MYSQL_CHECK_BZIP2)
- IF (WITH_INNODB_BZIP2 STREQUAL "ON" OR WITH_INNODB_BZIP2 STREQUAL "AUTO")
- CHECK_INCLUDE_FILES(bzlib.h HAVE_BZLIB2_H)
- CHECK_LIBRARY_EXISTS(bz2 BZ2_bzBuffToBuffCompress "" HAVE_BZLIB2_COMPRESS)
- CHECK_LIBRARY_EXISTS(bz2 BZ2_bzBuffToBuffDecompress "" HAVE_BZLIB2_DECOMPRESS)
-
- IF (HAVE_BZLIB2_COMPRESS AND HAVE_BZLIB2_DECOMPRESS AND HAVE_BZLIB2_H)
- SET(HAVE_INNODB_BZLIB2 TRUE)
- ADD_DEFINITIONS(-DHAVE_BZIP2=1)
- LINK_LIBRARIES(bz2)
- ELSE()
- IF (WITH_INNODB_BZIP2 STREQUAL "ON")
- MESSAGE(FATAL_ERROR "Required bzip2 library is not found")
- ENDIF()
- ENDIF()
- ENDIF()
- ADD_FEATURE_INFO(INNODB_BZIP2 HAVE_INNODB_BZLIB2
- "BZIP2 compression in the InnoDB storage engine")
-ENDMACRO()
diff --git a/storage/innobase/data/data0data.cc b/storage/innobase/data/data0data.cc
index 0e485e58215..9a7eff2142f 100644
--- a/storage/innobase/data/data0data.cc
+++ b/storage/innobase/data/data0data.cc
@@ -79,40 +79,6 @@ void dtuple_t::trim(const dict_index_t& index)
n_fields = i;
}
-/** Compare two data tuples.
-@param[in] tuple1 first data tuple
-@param[in] tuple2 second data tuple
-@return positive, 0, negative if tuple1 is greater, equal, less, than tuple2,
-respectively */
-int
-dtuple_coll_cmp(
- const dtuple_t* tuple1,
- const dtuple_t* tuple2)
-{
- ulint n_fields;
- ulint i;
- int cmp;
-
- ut_ad(tuple1 != NULL);
- ut_ad(tuple2 != NULL);
- ut_ad(tuple1->magic_n == DATA_TUPLE_MAGIC_N);
- ut_ad(tuple2->magic_n == DATA_TUPLE_MAGIC_N);
- ut_ad(dtuple_check_typed(tuple1));
- ut_ad(dtuple_check_typed(tuple2));
-
- n_fields = dtuple_get_n_fields(tuple1);
-
- cmp = (int) n_fields - (int) dtuple_get_n_fields(tuple2);
-
- for (i = 0; cmp == 0 && i < n_fields; i++) {
- const dfield_t* field1 = dtuple_get_nth_field(tuple1, i);
- const dfield_t* field2 = dtuple_get_nth_field(tuple2, i);
- cmp = cmp_dfield_dfield(field1, field2);
- }
-
- return(cmp);
-}
-
/*********************************************************************//**
Sets number of fields used in a tuple. Normally this is set in
dtuple_create, but if you want later to set it smaller, you can use this. */
@@ -466,8 +432,10 @@ dfield_print_raw(
ulint print_len = ut_min(len, static_cast<ulint>(1000));
ut_print_buf(f, dfield_get_data(dfield), print_len);
if (len != print_len) {
- fprintf(f, "(total %lu bytes%s)",
- (ulong) len,
+ std::ostringstream str_bytes;
+ str_bytes << ib::bytes_iec{len};
+ fprintf(f, "(total %s%s)",
+ str_bytes.str().c_str(),
dfield_is_ext(dfield) ? ", external" : "");
}
} else {
@@ -599,7 +567,7 @@ dtuple_convert_big_rec(
size = rec_get_converted_size(index, entry, *n_ext);
if (UNIV_UNLIKELY(size > 1000000000)) {
- ib::warn() << "Tuple size is very big: " << size;
+ ib::warn() << "Tuple size is very big: " << ib::bytes_iec{size};
fputs("InnoDB: Tuple contents: ", stderr);
dtuple_print(stderr, entry);
putc('\n', stderr);
diff --git a/storage/innobase/dict/dict0boot.cc b/storage/innobase/dict/dict0boot.cc
index e57121041d5..5516bce920b 100644
--- a/storage/innobase/dict/dict0boot.cc
+++ b/storage/innobase/dict/dict0boot.cc
@@ -54,7 +54,7 @@ dict_hdr_get_new_id(
(not assigned if NULL) */
index_id_t* index_id, /*!< out: index id
(not assigned if NULL) */
- ulint* space_id) /*!< out: space id
+ uint32_t* space_id) /*!< out: space id
(not assigned if NULL) */
{
ib_id_t id;
@@ -257,8 +257,8 @@ dberr_t dict_boot()
header. */
dict_sys.recover_row_id(mach_read_from_8(dict_hdr + DICT_HDR_ROW_ID));
- if (ulint max_space_id = mach_read_from_4(dict_hdr
- + DICT_HDR_MAX_SPACE_ID)) {
+ if (uint32_t max_space_id
+ = mach_read_from_4(dict_hdr + DICT_HDR_MAX_SPACE_ID)) {
max_space_id--;
fil_assign_new_space_id(&max_space_id);
}
diff --git a/storage/innobase/dict/dict0crea.cc b/storage/innobase/dict/dict0crea.cc
index 614048b7ba0..cce5f2f24d0 100644
--- a/storage/innobase/dict/dict0crea.cc
+++ b/storage/innobase/dict/dict0crea.cc
@@ -348,8 +348,8 @@ dict_build_table_def_step(
dict_table_t* table = node->table;
ut_ad(!table->is_temporary());
ut_ad(!table->space);
- ut_ad(table->space_id == ULINT_UNDEFINED);
- dict_hdr_get_new_id(&table->id, NULL, NULL);
+ ut_ad(table->space_id == UINT32_MAX);
+ dict_hdr_get_new_id(&table->id, nullptr, nullptr);
/* Always set this bit for all new created tables */
DICT_TF2_FLAG_SET(table, DICT_TF2_FTS_AUX_HEX_NAME);
@@ -367,10 +367,10 @@ dict_build_table_def_step(
DBUG_EXECUTE_IF(
"ib_create_table_fail_out_of_space_ids",
- table->space_id = ULINT_UNDEFINED;
+ table->space_id = UINT32_MAX;
);
- if (table->space_id == ULINT_UNDEFINED) {
+ if (table->space_id == UINT32_MAX) {
return DB_ERROR;
}
} else {
@@ -536,15 +536,15 @@ dict_create_sys_fields_tuple(
dict_field_t* field;
dfield_t* dfield;
byte* ptr;
- ibool index_contains_column_prefix_field = FALSE;
- ulint j;
+ bool wide_pos = false;
ut_ad(index);
ut_ad(heap);
- for (j = 0; j < index->n_fields; j++) {
- if (dict_index_get_nth_field(index, j)->prefix_len > 0) {
- index_contains_column_prefix_field = TRUE;
+ for (unsigned j = 0; j < index->n_fields; j++) {
+ const dict_field_t* f = dict_index_get_nth_field(index, j);
+ if (f->prefix_len || f->descending) {
+ wide_pos = true;
break;
}
}
@@ -569,12 +569,15 @@ dict_create_sys_fields_tuple(
ptr = static_cast<byte*>(mem_heap_alloc(heap, 4));
- if (index_contains_column_prefix_field) {
- /* If there are column prefix fields in the index, then
- we store the number of the field to the 2 HIGH bytes
- and the prefix length to the 2 low bytes, */
-
- mach_write_to_4(ptr, (fld_no << 16) + field->prefix_len);
+ if (wide_pos) {
+ /* If there are column prefixes or columns with
+ descending order in the index, then we write the
+ field number to the 16 most significant bits,
+ the DESC flag to bit 15, and the prefix length
+ in the 15 least significant bits. */
+ mach_write_to_4(ptr, (fld_no << 16)
+ | (!!field->descending) << 15
+ | field->prefix_len);
} else {
/* Else we store the number of the field to the 2 LOW bytes.
This is to keep the storage format compatible with
@@ -1108,8 +1111,6 @@ dict_create_table_step(
}
if (node->state == TABLE_ADD_TO_CACHE) {
- DBUG_EXECUTE_IF("ib_ddl_crash_during_create", DBUG_SUICIDE(););
-
node->table->can_be_evicted = !node->table->fts;
node->table->add_to_cache();
diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc
index d1c719d2090..32aba4bad85 100644
--- a/storage/innobase/dict/dict0dict.cc
+++ b/storage/innobase/dict/dict0dict.cc
@@ -1079,8 +1079,18 @@ dict_table_open_on_name(
if (!(ignore_err & ~DICT_ERR_IGNORE_FK_NOKEY) &&
!table->is_readable() && table->corrupted)
{
- ib::error() << "Table " << table->name
- << " is corrupted. Please drop the table and recreate.";
+ ulint algo = table->space->get_compression_algo();
+ if (algo <= PAGE_ALGORITHM_LAST && !fil_comp_algo_loaded(algo)) {
+ my_printf_error(ER_PROVIDER_NOT_LOADED,
+ "Table %s is compressed with %s, which is not currently loaded. "
+ "Please load the %s provider plugin to open the table",
+ MYF(ME_ERROR_LOG), table->name,
+ page_compression_algorithms[algo], page_compression_algorithms[algo]);
+ } else {
+ my_printf_error(ER_TABLE_CORRUPT,
+ "Table %s is corrupted. Please drop the table and recreate.",
+ MYF(ME_ERROR_LOG), table->name);
+ }
dict_sys.unfreeze();
DBUG_RETURN(nullptr);
}
@@ -1263,7 +1273,7 @@ static bool dict_table_can_be_evicted(dict_table_t *table)
dict_index_t *dict_index_t::clone() const
{
ut_ad(n_fields);
- ut_ad(!(type & (DICT_IBUF | DICT_SPATIAL | DICT_FTS)));
+ ut_ad(is_btree());
ut_ad(online_status == ONLINE_INDEX_COMPLETE);
ut_ad(is_committed());
ut_ad(!is_dummy);
@@ -2279,15 +2289,14 @@ found:
return(TRUE);
}
-/*******************************************************************//**
-Adds a column to index. */
-void
-dict_index_add_col(
-/*===============*/
- dict_index_t* index, /*!< in/out: index */
- const dict_table_t* table, /*!< in: table */
- dict_col_t* col, /*!< in: column */
- ulint prefix_len) /*!< in: column prefix length */
+/** Add a column to an index.
+@param index index
+@param table table
+@param col column
+@param prefix_len column prefix length
+@param descending whether to use descending order */
+void dict_index_add_col(dict_index_t *index, const dict_table_t *table,
+ dict_col_t *col, ulint prefix_len, bool descending)
{
dict_field_t* field;
const char* col_name;
@@ -2325,6 +2334,8 @@ dict_index_add_col(
field->fixed_len = 0;
}
+ field->descending = descending;
+
/* The comparison limit above must be constant. If it were
changed, the disk format of some fixed-length columns would
change, which would be a disaster. */
@@ -2356,7 +2367,7 @@ dict_index_copy(
field = dict_index_get_nth_field(index2, i);
dict_index_add_col(index1, index2->table, field->col,
- field->prefix_len);
+ field->prefix_len, field->descending);
}
}
@@ -2670,17 +2681,12 @@ dict_index_build_internal_non_clust(
index entry uniquely */
for (i = 0; i < clust_index->n_uniq; i++) {
-
field = dict_index_get_nth_field(clust_index, i);
- if (!indexed[field->col->ind]) {
- dict_index_add_col(new_index, table, field->col,
- field->prefix_len);
- } else if (dict_index_is_spatial(index)) {
- /*For spatial index, we still need to add the
- field to index. */
+ if (!indexed[field->col->ind] || index->is_spatial()) {
dict_index_add_col(new_index, table, field->col,
- field->prefix_len);
+ field->prefix_len,
+ field->descending);
}
}
@@ -4655,7 +4661,7 @@ dict_foreign_qualify_index(
return(false);
}
- if (index->type & (DICT_SPATIAL | DICT_FTS | DICT_CORRUPT)) {
+ if (!index->is_btree()) {
return false;
}
diff --git a/storage/innobase/dict/dict0load.cc b/storage/innobase/dict/dict0load.cc
index 129a2539341..f769839db14 100644
--- a/storage/innobase/dict/dict0load.cc
+++ b/storage/innobase/dict/dict0load.cc
@@ -613,11 +613,10 @@ dict_sys_tables_type_valid(ulint type, bool not_redundant)
@param[in] not_redundant whether ROW_FORMAT=REDUNDANT is not used
@return table flags */
static
-ulint
-dict_sys_tables_type_to_tf(ulint type, bool not_redundant)
+uint32_t dict_sys_tables_type_to_tf(uint32_t type, bool not_redundant)
{
ut_ad(dict_sys_tables_type_valid(type, not_redundant));
- ulint flags = not_redundant ? 1 : 0;
+ uint32_t flags = not_redundant ? 1 : 0;
/* ZIP_SSIZE, ATOMIC_BLOBS, DATA_DIR, PAGE_COMPRESSION,
PAGE_COMPRESSION_LEVEL are the same. */
@@ -655,15 +654,14 @@ dict_sys_tables_rec_read(
bool uncommitted,
mtr_t* mtr,
table_id_t* table_id,
- ulint* space_id,
- ulint* n_cols,
- ulint* flags,
- ulint* flags2,
+ uint32_t* space_id,
+ uint32_t* n_cols,
+ uint32_t* flags,
+ uint32_t* flags2,
trx_id_t* trx_id)
{
const byte* field;
ulint len;
- ulint type;
mem_heap_t* heap = nullptr;
field = rec_get_nth_field_old(
@@ -721,7 +719,7 @@ dict_sys_tables_rec_read(
field = rec_get_nth_field_old(
rec, DICT_FLD__SYS_TABLES__TYPE, &len);
ut_a(len == 4);
- type = mach_read_from_4(field);
+ uint32_t type = mach_read_from_4(field);
/* Handle MDEV-12873 InnoDB SYS_TABLES.TYPE incompatibility
for PAGE_COMPRESSED=YES in MariaDB 10.2.2 to 10.2.6.
@@ -812,8 +810,8 @@ dict_sys_tables_rec_read(
if (!dict_sys_tables_type_valid(type, not_redundant)) {
sql_print_error("InnoDB: Table %.*s in InnoDB"
" data dictionary contains invalid flags."
- " SYS_TABLES.TYPE=" ULINTPF
- " SYS_TABLES.N_COLS=" ULINTPF,
+ " SYS_TABLES.TYPE=" UINT32PF
+ " SYS_TABLES.N_COLS=" UINT32PF,
int(rec_get_field_start_offs(rec, 1)), rec,
type, *n_cols);
err_exit:
@@ -843,8 +841,8 @@ err_exit:
sql_print_error("InnoDB: Table %.*s in InnoDB"
" data dictionary"
" contains invalid flags."
- " SYS_TABLES.TYPE=" ULINTPF
- " SYS_TABLES.MIX_LEN=" ULINTPF,
+ " SYS_TABLES.TYPE=" UINT32PF
+ " SYS_TABLES.MIX_LEN=" UINT32PF,
int(rec_get_field_start_offs(rec, 1)),
rec,
type, *flags2);
@@ -880,7 +878,7 @@ was needed and force_recovery is not set.
We also scan the biggest space id, and store it to fil_system. */
void dict_check_tablespaces_and_store_max_id()
{
- ulint max_space_id = 0;
+ uint32_t max_space_id = 0;
btr_pcur_t pcur;
mtr_t mtr;
@@ -895,10 +893,10 @@ void dict_check_tablespaces_and_store_max_id()
rec; rec = dict_getnext_system_low(&pcur, &mtr)) {
ulint len;
table_id_t table_id;
- ulint space_id;
- ulint n_cols;
- ulint flags;
- ulint flags2;
+ uint32_t space_id;
+ uint32_t n_cols;
+ uint32_t flags;
+ uint32_t flags2;
/* If a table record is not useable, ignore it and continue
on to the next record. Error messages were logged. */
@@ -1537,6 +1535,7 @@ dict_load_field_low(
ulint len;
unsigned pos_and_prefix_len;
unsigned prefix_len;
+ bool descending;
bool first_field;
ulint position;
@@ -1589,10 +1588,12 @@ err_len:
}
if (first_field || pos_and_prefix_len > 0xFFFFUL) {
- prefix_len = pos_and_prefix_len & 0xFFFFUL;
+ prefix_len = pos_and_prefix_len & 0x7FFFUL;
+ descending = (pos_and_prefix_len & 0x8000UL);
position = (pos_and_prefix_len & 0xFFFF0000UL) >> 16;
} else {
prefix_len = 0;
+ descending = false;
position = pos_and_prefix_len & 0xFFFFUL;
}
@@ -1642,11 +1643,12 @@ err_len:
if (index) {
dict_mem_index_add_field(
index, mem_heap_strdupl(heap, (const char*) field, len),
- prefix_len);
+ prefix_len, descending);
} else {
sys_field->name = mem_heap_strdupl(
heap, (const char*) field, len);
sys_field->prefix_len = prefix_len & ((1U << 12) - 1);
+ sys_field->descending = descending;
*pos = position;
}
@@ -2163,13 +2165,9 @@ const char *dict_load_table_low(mtr_t *mtr, bool uncommitted,
const rec_t *rec, dict_table_t **table)
{
table_id_t table_id;
- ulint space_id;
- ulint n_cols;
- ulint t_num;
- ulint flags;
- ulint flags2;
+ uint32_t space_id, t_num, flags, flags2;
+ ulint n_cols, n_v_col;
trx_id_t trx_id;
- ulint n_v_col;
if (const char* error_text = dict_sys_tables_rec_check(rec)) {
*table = NULL;
@@ -3127,12 +3125,12 @@ loop:
following call does the comparison in the latin1_swedish_ci
charset-collation, in a case-insensitive way. */
- if (0 != cmp_data_data(dfield_get_type(&dfield)->mtype,
- dfield_get_type(&dfield)->prtype,
- reinterpret_cast<const byte*>(table_name),
- dfield_get_len(&dfield),
- field, len)) {
-
+ if (cmp_data(dfield_get_type(&dfield)->mtype,
+ dfield_get_type(&dfield)->prtype,
+ false,
+ reinterpret_cast<const byte*>(table_name),
+ dfield_get_len(&dfield),
+ field, len)) {
goto load_next_index;
}
diff --git a/storage/innobase/dict/dict0mem.cc b/storage/innobase/dict/dict0mem.cc
index 59189d3e053..b8b2d583c24 100644
--- a/storage/innobase/dict/dict0mem.cc
+++ b/storage/innobase/dict/dict0mem.cc
@@ -162,7 +162,7 @@ dict_table_t *dict_table_t::create(const span<const char> &name,
table->mdl_name.m_name= table->name.m_name;
table->is_system_db= dict_mem_table_is_system(table->name.m_name);
table->space= space;
- table->space_id= space ? space->id : ULINT_UNDEFINED;
+ table->space_id= space ? space->id : UINT32_MAX;
table->n_t_cols= static_cast<unsigned>(n_cols + DATA_N_SYS_COLS) &
dict_index_t::MAX_N_FIELDS;
table->n_v_cols= static_cast<unsigned>(n_v_cols) &
@@ -1046,32 +1046,6 @@ dict_mem_table_free_foreign_vcol_set(
}
/**********************************************************************//**
-Adds a field definition to an index. NOTE: does not take a copy
-of the column name if the field is a column. The memory occupied
-by the column name may be released only after publishing the index. */
-void
-dict_mem_index_add_field(
-/*=====================*/
- dict_index_t* index, /*!< in: index */
- const char* name, /*!< in: column name */
- ulint prefix_len) /*!< in: 0 or the column prefix length
- in a MySQL index like
- INDEX (textcol(25)) */
-{
- dict_field_t* field;
-
- ut_ad(index);
- ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
-
- index->n_def++;
-
- field = dict_index_get_nth_field(index, unsigned(index->n_def) - 1);
-
- field->name = name;
- field->prefix_len = prefix_len & ((1U << 12) - 1);
-}
-
-/**********************************************************************//**
Frees an index memory object. */
void
dict_mem_index_free(
diff --git a/storage/innobase/dict/dict0stats.cc b/storage/innobase/dict/dict0stats.cc
index 7bdccd899b8..39f5943d5a4 100644
--- a/storage/innobase/dict/dict0stats.cc
+++ b/storage/innobase/dict/dict0stats.cc
@@ -1180,7 +1180,7 @@ btr_estimate_number_of_different_key_vals(dict_index_t* index,
std::vector<index_field_stats_t> result;
- ut_ad(!index->is_spatial());
+ ut_ad(index->is_btree());
n_cols = dict_index_get_n_unique(index);
@@ -1574,7 +1574,7 @@ empty_table:
ut_ad(!dict_index_is_ibuf(index));
- if (index->type & (DICT_FTS | DICT_SPATIAL)) {
+ if (!index->is_btree()) {
continue;
}
@@ -2678,8 +2678,7 @@ static index_stats_t dict_stats_analyze_index(dict_index_t* index)
ut_ad(!index->table->stats_mutex_is_owner());
ut_ad(index->table->get_ref_count());
- /* Disable update statistic for Rtree */
- if (dict_index_is_spatial(index)) {
+ if (!index->is_btree()) {
DBUG_RETURN(result);
}
@@ -3035,9 +3034,7 @@ dict_stats_update_persistent(
index != NULL;
index = dict_table_get_next_index(index)) {
- ut_ad(!dict_index_is_ibuf(index));
-
- if (index->type & (DICT_FTS | DICT_SPATIAL)) {
+ if (!index->is_btree()) {
continue;
}
@@ -3436,6 +3433,11 @@ unlocked_free_and_exit:
}
}
+ ret= trx->bulk_insert_apply();
+ if (ret != DB_SUCCESS) {
+ goto rollback_and_exit;
+ }
+
trx->commit();
goto free_and_exit;
}
@@ -4037,6 +4039,13 @@ dict_stats_update(
return(DB_SUCCESS);
}
+ if (trx_id_t bulk_trx_id = table->bulk_trx_id) {
+ if (trx_sys.find(nullptr, bulk_trx_id, false)) {
+ dict_stats_empty_table(table, false);
+ return DB_SUCCESS_LOCKED_REC;
+ }
+ }
+
switch (stats_upd_option) {
case DICT_STATS_RECALC_PERSISTENT:
diff --git a/storage/innobase/eval/eval0eval.cc b/storage/innobase/eval/eval0eval.cc
index 73ab113cff5..bafb0b55d09 100644
--- a/storage/innobase/eval/eval0eval.cc
+++ b/storage/innobase/eval/eval0eval.cc
@@ -144,8 +144,8 @@ eval_cmp_like(
switch (op) {
case IB_LIKE_PREFIX:
arg4 = que_node_get_next(arg3);
- return(!cmp_dfield_dfield_like_prefix(que_node_get_val(arg1),
- que_node_get_val(arg4)));
+ return(cmp_dfield_dfield_eq_prefix(que_node_get_val(arg1),
+ que_node_get_val(arg4)));
case IB_LIKE_EXACT:
return(!cmp_dfield_dfield(que_node_get_val(arg1),
que_node_get_val(arg2)));
diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc
index fe75b7d58fa..4918cefb947 100644
--- a/storage/innobase/fil/fil0crypt.cc
+++ b/storage/innobase/fil/fil0crypt.cc
@@ -533,7 +533,7 @@ static byte* fil_encrypt_buf_for_full_crc32(
ut_a(dstlen == srclen);
const ulint payload = size - FIL_PAGE_FCRC32_CHECKSUM;
- mach_write_to_4(dst_frame + payload, ut_crc32(dst_frame, payload));
+ mach_write_to_4(dst_frame + payload, my_crc32c(0, dst_frame, payload));
/* Clean the rest of the buffer. FIXME: Punch holes when writing! */
memset(dst_frame + (payload + 4), 0, srv_page_size - (payload + 4));
@@ -744,20 +744,20 @@ static dberr_t fil_space_decrypt_for_non_full_checksum(
/** Decrypt a page.
@param[in] space_id tablespace id
+@param[in] fsp_flags Tablespace flags
@param[in] crypt_data crypt_data
@param[in] tmp_frame Temporary buffer
@param[in] physical_size page size
-@param[in] fsp_flags Tablespace flags
@param[in,out] src_frame Page to decrypt
@retval DB_SUCCESS on success
@retval DB_DECRYPTION_FAILED on error */
dberr_t
fil_space_decrypt(
- ulint space_id,
+ uint32_t space_id,
+ uint32_t fsp_flags,
fil_space_crypt_t* crypt_data,
byte* tmp_frame,
ulint physical_size,
- ulint fsp_flags,
byte* src_frame)
{
if (!crypt_data || !crypt_data->is_encrypted()) {
@@ -792,9 +792,10 @@ fil_space_decrypt(
ut_ad(space->referenced());
- if (DB_SUCCESS != fil_space_decrypt(space->id, space->crypt_data,
+ if (DB_SUCCESS != fil_space_decrypt(space->id, space->flags,
+ space->crypt_data,
tmp_frame, physical_size,
- space->flags, src_frame)) {
+ src_frame)) {
return nullptr;
}
@@ -1365,7 +1366,7 @@ inline fil_space_t *fil_system_t::default_encrypt_next(fil_space_t *space,
mysql_mutex_assert_owner(&mutex);
auto it= space && space->is_in_default_encrypt
- ? sized_ilist<fil_space_t, rotation_list_tag_t>::iterator(space)
+ ? sized_ilist<fil_space_t, default_encrypt_tag_t>::iterator(space)
: default_encrypt_tables.begin();
const auto end= default_encrypt_tables.end();
@@ -1855,7 +1856,7 @@ fil_crypt_rotate_pages(
const key_state_t* key_state,
rotate_thread_t* state)
{
- ulint space_id = state->space->id;
+ const uint32_t space_id = state->space->id;
uint32_t end = std::min(state->offset + uint32_t(state->batch),
state->space->free_limit);
diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc
index 63df46c3817..a3d9df4af1b 100644
--- a/storage/innobase/fil/fil0fil.cc
+++ b/storage/innobase/fil/fil0fil.cc
@@ -54,21 +54,18 @@ Created 10/25/1995 Heikki Tuuri
# include <dirent.h>
#endif
+#include "lz4.h"
+#include "lzo/lzo1x.h"
+#include "lzma.h"
+#include "bzlib.h"
+#include "snappy-c.h"
+
ATTRIBUTE_COLD void fil_space_t::set_corrupted() const
{
if (!is_stopping() && !is_corrupted.test_and_set())
sql_print_error("InnoDB: File '%s' is corrupted", chain.start->name);
}
-/** Determine if the space id is a user tablespace id or not.
-@param space_id tablespace identifier
-@return true if it is a user tablespace ID */
-inline bool fil_is_user_tablespace_id(ulint space_id)
-{
- return space_id != TRX_SYS_SPACE && space_id != SRV_TMP_SPACE_ID &&
- !srv_is_undo_tablespace(space_id);
-}
-
/** Try to close a file to adhere to the innodb_open_files limit.
@param print_info whether to diagnose why a file cannot be closed
@return whether a file was closed */
@@ -83,7 +80,7 @@ bool fil_space_t::try_to_close(bool print_info)
case FIL_TYPE_IMPORT:
break;
case FIL_TYPE_TABLESPACE:
- if (!fil_is_user_tablespace_id(space.id))
+ if (is_predefined_tablespace(space.id))
continue;
}
@@ -217,14 +214,11 @@ fil_validate_skip(void)
}
#endif /* UNIV_DEBUG */
-/*******************************************************************//**
-Returns the table space by a given id, NULL if not found.
-It is unsafe to dereference the returned pointer. It is fine to check
-for NULL. */
-fil_space_t*
-fil_space_get_by_id(
-/*================*/
- ulint id) /*!< in: space id */
+/** Look up a tablespace.
+@param tablespace identifier
+@return tablespace
+@retval nullptr if not found */
+fil_space_t *fil_space_get_by_id(uint32_t id)
{
fil_space_t* space;
@@ -245,48 +239,38 @@ or the caller should be in single-threaded crash recovery mode
Normally, fil_space_t::get() should be used instead.
@param[in] id tablespace ID
@return tablespace, or NULL if not found */
-fil_space_t*
-fil_space_get(
- ulint id)
+fil_space_t *fil_space_get(uint32_t id)
{
- mysql_mutex_lock(&fil_system.mutex);
- fil_space_t* space = fil_space_get_by_id(id);
- mysql_mutex_unlock(&fil_system.mutex);
- return(space);
+ mysql_mutex_lock(&fil_system.mutex);
+ fil_space_t *space= fil_space_get_by_id(id);
+ mysql_mutex_unlock(&fil_system.mutex);
+ return space;
}
-/** Validate the compression algorithm for full crc32 format.
-@param[in] space tablespace object
-@return whether the compression algorithm support */
-static bool fil_comp_algo_validate(const fil_space_t* space)
+/** Check if the compression algorithm is loaded
+@param[in] comp_algo ulint compression algorithm
+@return whether the compression algorithm is loaded */
+bool fil_comp_algo_loaded(ulint comp_algo)
{
- if (!space->full_crc32()) {
- return true;
- }
-
- DBUG_EXECUTE_IF("fil_comp_algo_validate_fail",
- return false;);
-
- ulint comp_algo = space->get_compression_algo();
switch (comp_algo) {
case PAGE_UNCOMPRESSED:
case PAGE_ZLIB_ALGORITHM:
-#ifdef HAVE_LZ4
+ return true;
+
case PAGE_LZ4_ALGORITHM:
-#endif /* HAVE_LZ4 */
-#ifdef HAVE_LZO
+ return provider_service_lz4->is_loaded;
+
case PAGE_LZO_ALGORITHM:
-#endif /* HAVE_LZO */
-#ifdef HAVE_LZMA
+ return provider_service_lzo->is_loaded;
+
case PAGE_LZMA_ALGORITHM:
-#endif /* HAVE_LZMA */
-#ifdef HAVE_BZIP2
+ return provider_service_lzma->is_loaded;
+
case PAGE_BZIP2_ALGORITHM:
-#endif /* HAVE_BZIP2 */
-#ifdef HAVE_SNAPPY
+ return provider_service_bzip2->is_loaded;
+
case PAGE_SNAPPY_ALGORITHM:
-#endif /* HAVE_SNAPPY */
- return true;
+ return provider_service_snappy->is_loaded;
}
return false;
@@ -385,9 +369,26 @@ static bool fil_node_open_file_low(fil_node_t *node)
return false;
}
+ ulint comp_algo = node->space->get_compression_algo();
+ bool comp_algo_invalid = false;
+
if (node->size);
- else if (!node->read_page0() || !fil_comp_algo_validate(node->space))
+ else if (!node->read_page0() ||
+ // validate compression algorithm for full crc32 format
+ (node->space->full_crc32() &&
+ (comp_algo_invalid = !fil_comp_algo_loaded(comp_algo))))
{
+ if (comp_algo_invalid)
+ {
+ if (comp_algo <= PAGE_ALGORITHM_LAST)
+ ib::warn() << "'" << node->name << "' is compressed with "
+ << page_compression_algorithms[comp_algo]
+ << ", which is not currently loaded";
+ else
+ ib::warn() << "'" << node->name << "' is compressed with "
+ << "invalid algorithm: " << comp_algo;
+ }
+
os_file_close(node->handle);
node->handle= OS_FILE_CLOSED;
return false;
@@ -408,7 +409,7 @@ static bool fil_node_open_file(fil_node_t *node)
{
mysql_mutex_assert_owner(&fil_system.mutex);
ut_ad(!node->is_open());
- ut_ad(fil_is_user_tablespace_id(node->space->id) ||
+ ut_ad(!is_predefined_tablespace(node->space->id) ||
srv_operation == SRV_OPERATION_BACKUP ||
srv_operation == SRV_OPERATION_RESTORE ||
srv_operation == SRV_OPERATION_RESTORE_DELTA);
@@ -868,13 +869,10 @@ fil_space_free_low(
/** Frees a space object from the tablespace memory cache.
Closes the files in the chain but does not delete them.
There must not be any pending i/o's or flushes on the files.
-@param[in] id tablespace identifier
-@param[in] x_latched whether the caller holds X-mode space->latch
+@param id tablespace identifier
+@param x_latched whether the caller holds exclusive fil_space_t::latch
@return true if success */
-bool
-fil_space_free(
- ulint id,
- bool x_latched)
+bool fil_space_free(uint32_t id, bool x_latched)
{
ut_ad(id != TRX_SYS_SPACE);
@@ -893,18 +891,22 @@ fil_space_free(
}
if (!recv_recovery_is_on()) {
- mysql_mutex_lock(&log_sys.mutex);
- }
-
- mysql_mutex_assert_owner(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
- if (space->max_lsn != 0) {
- ut_d(space->max_lsn = 0);
- fil_system.named_spaces.remove(*space);
- }
+ if (space->max_lsn) {
+ ut_d(space->max_lsn = 0);
+ fil_system.named_spaces.remove(*space);
+ }
- if (!recv_recovery_is_on()) {
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
+ } else {
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
+ if (space->max_lsn) {
+ ut_d(space->max_lsn = 0);
+ fil_system.named_spaces.remove(*space);
+ }
}
fil_space_free_low(space);
@@ -923,7 +925,7 @@ fil_space_free(
@param opened true if space files are opened
@return pointer to created tablespace, to be filled in with add()
@retval nullptr on failure (such as when the same tablespace exists) */
-fil_space_t *fil_space_t::create(ulint id, ulint flags,
+fil_space_t *fil_space_t::create(uint32_t id, uint32_t flags,
fil_type_t purpose,
fil_space_crypt_t *crypt_data,
fil_encryption_t mode,
@@ -1035,18 +1037,13 @@ Assigns a new space id for a new single-table tablespace. This works simply by
incrementing the global counter. If 4 billion id's is not enough, we may need
to recycle id's.
@return true if assigned, false if not */
-bool
-fil_assign_new_space_id(
-/*====================*/
- ulint* space_id) /*!< in/out: space id */
+bool fil_assign_new_space_id(uint32_t *space_id)
{
- ulint id;
+ uint32_t id = *space_id;
bool success;
mysql_mutex_lock(&fil_system.mutex);
- id = *space_id;
-
if (id < fil_system.max_assigned_id) {
id = fil_system.max_assigned_id;
}
@@ -1072,7 +1069,7 @@ fil_assign_new_space_id(
<< ". To reset the counter to zero"
" you have to dump all your tables and"
" recreate the whole InnoDB installation.";
- *space_id = ULINT_UNDEFINED;
+ *space_id = UINT32_MAX;
}
mysql_mutex_unlock(&fil_system.mutex);
@@ -1105,7 +1102,7 @@ bool fil_space_t::read_page0()
}
/** Look up a tablespace and ensure that its first page has been validated. */
-static fil_space_t *fil_space_get_space(ulint id)
+static fil_space_t *fil_space_get_space(uint32_t id)
{
if (fil_space_t *space= fil_space_get_by_id(id))
if (space->read_page0())
@@ -1113,7 +1110,8 @@ static fil_space_t *fil_space_get_space(ulint id)
return nullptr;
}
-void fil_space_set_recv_size_and_flags(ulint id, uint32_t size, uint32_t flags)
+void fil_space_set_recv_size_and_flags(uint32_t id, uint32_t size,
+ uint32_t flags)
{
ut_ad(id < SRV_SPACE_ID_UPPER_BOUND);
mysql_mutex_lock(&fil_system.mutex);
@@ -1403,10 +1401,7 @@ void fil_space_t::close_all()
/*******************************************************************//**
Sets the max tablespace id counter if the given number is bigger than the
previous value. */
-void
-fil_set_max_space_id_if_bigger(
-/*===========================*/
- ulint max_id) /*!< in: maximum known id */
+void fil_set_max_space_id_if_bigger(uint32_t max_id)
{
ut_a(max_id < SRV_SPACE_ID_UPPER_BOUND);
@@ -1420,51 +1415,11 @@ fil_set_max_space_id_if_bigger(
mysql_mutex_unlock(&fil_system.mutex);
}
-/** Write the flushed LSN to the page header of the first page in the
-system tablespace.
-@param[in] lsn flushed LSN
-@return DB_SUCCESS or error number */
-dberr_t
-fil_write_flushed_lsn(
- lsn_t lsn)
-{
- byte* buf;
- ut_ad(!srv_read_only_mode);
-
- if (!fil_system.sys_space->acquire()) {
- return DB_ERROR;
- }
-
- buf = static_cast<byte*>(aligned_malloc(srv_page_size, srv_page_size));
-
- auto fio = fil_system.sys_space->io(IORequestRead, 0, srv_page_size,
- buf);
-
- if (fio.err == DB_SUCCESS) {
- mach_write_to_8(buf + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION,
- lsn);
-
- ulint fsp_flags = mach_read_from_4(
- buf + FSP_HEADER_OFFSET + FSP_SPACE_FLAGS);
-
- if (fil_space_t::full_crc32(fsp_flags)) {
- buf_flush_assign_full_crc32_checksum(buf);
- }
-
- fio = fil_system.sys_space->io(IORequestWrite,
- 0, srv_page_size, buf);
- fil_flush_file_spaces();
- }
-
- aligned_free(buf);
- return fio.err;
-}
-
/** Acquire a tablespace reference.
@param id tablespace identifier
@return tablespace
@retval nullptr if the tablespace is missing or inaccessible */
-fil_space_t *fil_space_t::get(ulint id)
+fil_space_t *fil_space_t::get(uint32_t id)
{
mysql_mutex_lock(&fil_system.mutex);
fil_space_t *space= fil_space_get_by_id(id);
@@ -1484,7 +1439,7 @@ fil_space_t *fil_space_t::get(ulint id)
@param first_page_no first page number in the file
@param path file path
@param new_path new file path for type=FILE_RENAME */
-inline void mtr_t::log_file_op(mfile_type_t type, ulint space_id,
+inline void mtr_t::log_file_op(mfile_type_t type, uint32_t space_id,
const char *path, const char *new_path)
{
ut_ad((new_path != nullptr) == (type == FILE_RENAME));
@@ -1532,7 +1487,7 @@ inline void mtr_t::log_file_op(mfile_type_t type, ulint space_id,
{
ut_ad(strchr(new_path, '/'));
m_log.push(reinterpret_cast<const byte*>(path), uint32_t(len + 1));
- m_log.push(reinterpret_cast<const byte*>(new_path), uint32_t(new_len));
+ m_log.push(reinterpret_cast<const byte*>(new_path), uint32_t(new_len - 1));
}
else
m_log.push(reinterpret_cast<const byte*>(path), uint32_t(len));
@@ -1542,18 +1497,14 @@ inline void mtr_t::log_file_op(mfile_type_t type, ulint space_id,
@param[in] space_id tablespace id
@param[in] name tablespace file name
@param[in,out] mtr mini-transaction */
-static
-void
-fil_name_write(
- ulint space_id,
- const char* name,
- mtr_t* mtr)
+static void fil_name_write(uint32_t space_id, const char *name,
+ mtr_t *mtr)
{
ut_ad(!is_predefined_tablespace(space_id));
mtr->log_file_op(FILE_MODIFY, space_id, name);
}
-fil_space_t *fil_space_t::check_pending_operations(ulint id)
+fil_space_t *fil_space_t::check_pending_operations(uint32_t id)
{
ut_a(!is_system_tablespace(id));
mysql_mutex_lock(&fil_system.mutex);
@@ -1580,7 +1531,7 @@ being_deleted:
return nullptr;
/* Issue a warning every 10.24 seconds, starting after 2.56 seconds */
if ((count & 511) == 128)
- sql_print_warning("InnoDB: Waiting for tablespace " ULINTPF
+ sql_print_warning("InnoDB: Waiting for tablespace " UINT32PF
" to be deleted", id);
std::this_thread::sleep_for(std::chrono::milliseconds(20));
mysql_mutex_lock(&fil_system.mutex);
@@ -1619,7 +1570,7 @@ being_deleted:
/** Close a single-table tablespace on failed IMPORT TABLESPACE.
The tablespace must be cached in the memory cache.
Free all pages used by the tablespace. */
-void fil_close_tablespace(ulint id)
+void fil_close_tablespace(uint32_t id)
{
ut_ad(!is_system_tablespace(id));
fil_space_t* space = fil_space_t::check_pending_operations(id);
@@ -1659,7 +1610,7 @@ void fil_close_tablespace(ulint id)
@param id tablespace identifier
@return detached file handle (to be closed by the caller)
@return OS_FILE_CLOSED if no file existed */
-pfs_os_file_t fil_delete_tablespace(ulint id)
+pfs_os_file_t fil_delete_tablespace(uint32_t id)
{
ut_ad(!is_system_tablespace(id));
pfs_os_file_t handle= OS_FILE_CLOSED;
@@ -1860,10 +1811,10 @@ must be >= FIL_IBD_FILE_INITIAL_SIZE
@retval NULL on error */
fil_space_t*
fil_ibd_create(
- ulint space_id,
+ uint32_t space_id,
const table_name_t name,
const char* path,
- ulint flags,
+ uint32_t flags,
uint32_t size,
fil_encryption_t mode,
uint32_t key_id,
@@ -1889,8 +1840,11 @@ fil_ibd_create(
mtr.start();
mtr.log_file_op(FILE_CREATE, space_id, path);
- mtr.commit();
- log_write_up_to(mtr.commit_lsn(), true);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
+ auto lsn= mtr.commit_files();
+ log_sys.latch.wr_unlock();
+ mtr.flag_wr_unlock();
+ log_write_up_to(lsn, true);
ulint type;
static_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096,
@@ -2036,8 +1990,8 @@ fil_space_t*
fil_ibd_open(
unsigned validate,
fil_type_t purpose,
- ulint id,
- ulint flags,
+ uint32_t id,
+ uint32_t flags,
fil_space_t::name_type name,
const char* path_in,
dberr_t* err)
@@ -2057,7 +2011,7 @@ fil_ibd_open(
/* Table flags can be ULINT_UNDEFINED if
dict_tf_to_fsp_flags_failure is set. */
- if (flags == ULINT_UNDEFINED) {
+ if (flags == UINT32_MAX) {
corrupted:
local_err = DB_CORRUPTION;
func_exit:
@@ -2400,10 +2354,7 @@ of the file in validate_for_recovery().
@param[out] space the tablespace, or NULL on error
@return status of the operation */
enum fil_load_status
-fil_ibd_load(
- ulint space_id,
- const char* filename,
- fil_space_t*& space)
+fil_ibd_load(uint32_t space_id, const char *filename, fil_space_t *&space)
{
/* If the a space is already in the file system cache with this
space ID, then there is nothing to do. */
@@ -2522,7 +2473,7 @@ tablespace_check:
/* Adjust the memory-based flags that would normally be set by
dict_tf_to_fsp_flags(). In recovery, we have no data dictionary. */
- ulint flags = file.flags();
+ uint32_t flags = file.flags();
if (fil_space_t::is_compressed(flags)) {
flags |= page_zip_level
<< FSP_FLAGS_MEM_COMPRESSION_LEVEL;
@@ -2563,7 +2514,7 @@ tablespace_check:
(Typically when upgrading from MariaDB 10.1.0..10.1.20.)
@param[in,out] space tablespace
@param[in] flags desired tablespace flags */
-void fsp_flags_try_adjust(fil_space_t* space, ulint flags)
+void fsp_flags_try_adjust(fil_space_t *space, uint32_t flags)
{
ut_ad(!srv_read_only_mode);
ut_ad(fil_space_t::is_valid_flags(flags, space->id));
@@ -2613,14 +2564,15 @@ startup, there may be many tablespaces which are not yet in the memory cache.
@param[in] table_flags table flags
@return the tablespace
@retval NULL if no matching tablespace exists in the memory cache */
-fil_space_t *fil_space_for_table_exists_in_mem(ulint id, ulint table_flags)
+fil_space_t *fil_space_for_table_exists_in_mem(uint32_t id,
+ uint32_t table_flags)
{
- const ulint expected_flags = dict_tf_to_fsp_flags(table_flags);
+ const uint32_t expected_flags = dict_tf_to_fsp_flags(table_flags);
mysql_mutex_lock(&fil_system.mutex);
if (fil_space_t* space = fil_space_get_by_id(id)) {
- ulint tf = expected_flags & ~FSP_FLAGS_MEM_MASK;
- ulint sf = space->flags & ~FSP_FLAGS_MEM_MASK;
+ uint32_t tf = expected_flags & ~FSP_FLAGS_MEM_MASK;
+ uint32_t sf = space->flags & ~FSP_FLAGS_MEM_MASK;
if (!fil_space_t::is_flags_equal(tf, sf)
&& !fil_space_t::is_flags_equal(sf, tf)) {
@@ -2691,8 +2643,8 @@ fil_io_t fil_space_t::io(const IORequest &type, os_offset_t offset, size_t len,
void *buf, buf_page_t *bpage)
{
ut_ad(referenced());
- ut_ad(offset % OS_FILE_LOG_BLOCK_SIZE == 0);
- ut_ad((len % OS_FILE_LOG_BLOCK_SIZE) == 0);
+ ut_ad(offset % UNIV_ZIP_SIZE_MIN == 0);
+ ut_ad(len % 512 == 0); /* page_compressed */
ut_ad(fil_validate_skip());
ut_ad(type.is_read() || type.is_write());
ut_ad(type.type != IORequest::DBLWR_BATCH);
@@ -2987,19 +2939,6 @@ fil_space_validate_for_mtr_commit(
}
#endif /* UNIV_DEBUG */
-/** Write a FILE_MODIFY record for a persistent tablespace.
-@param[in] space tablespace
-@param[in,out] mtr mini-transaction */
-static
-void
-fil_names_write(
- const fil_space_t* space,
- mtr_t* mtr)
-{
- ut_ad(UT_LIST_GET_LEN(space->chain) == 1);
- fil_name_write(space->id, UT_LIST_GET_FIRST(space->chain)->name, mtr);
-}
-
/** Note that a non-predefined persistent tablespace has been modified
by redo log.
@param[in,out] space tablespace */
@@ -3007,7 +2946,9 @@ void
fil_names_dirty(
fil_space_t* space)
{
- mysql_mutex_assert_owner(&log_sys.mutex);
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
ut_ad(recv_recovery_is_on());
ut_ad(log_sys.get_lsn() != 0);
ut_ad(space->max_lsn == 0);
@@ -3017,56 +2958,48 @@ fil_names_dirty(
space->max_lsn = log_sys.get_lsn();
}
-/** Write FILE_MODIFY records when a non-predefined persistent
-tablespace was modified for the first time since the latest
-fil_names_clear().
-@param[in,out] space tablespace */
-void fil_names_dirty_and_write(fil_space_t* space)
+/** Write a FILE_MODIFY record when a non-predefined persistent
+tablespace was modified for the first time since fil_names_clear(). */
+ATTRIBUTE_NOINLINE ATTRIBUTE_COLD void mtr_t::name_write()
{
- mysql_mutex_assert_owner(&log_sys.mutex);
- ut_d(fil_space_validate_for_mtr_commit(space));
- ut_ad(space->max_lsn == log_sys.get_lsn());
-
- fil_system.named_spaces.push_back(*space);
- mtr_t mtr;
- mtr.start();
- fil_names_write(space, &mtr);
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
+ ut_d(fil_space_validate_for_mtr_commit(m_user_space));
+ ut_ad(!m_user_space->max_lsn);
+ m_user_space->max_lsn= log_sys.get_lsn();
- DBUG_EXECUTE_IF("fil_names_write_bogus",
- {
- char bogus_name[] = "./test/bogus file.ibd";
- fil_name_write(
- SRV_SPACE_ID_UPPER_BOUND,
- bogus_name, &mtr);
- });
+ fil_system.named_spaces.push_back(*m_user_space);
+ ut_ad(UT_LIST_GET_LEN(m_user_space->chain) == 1);
- mtr.commit_files();
+ mtr_t mtr;
+ mtr.start();
+ fil_name_write(m_user_space->id,
+ UT_LIST_GET_FIRST(m_user_space->chain)->name,
+ &mtr);
+ mtr.commit_files();
}
/** On a log checkpoint, reset fil_names_dirty_and_write() flags
-and write out FILE_MODIFY and FILE_CHECKPOINT if needed.
-@param[in] lsn checkpoint LSN
-@param[in] do_write whether to always write FILE_CHECKPOINT
-@return whether anything was written to the redo log
-@retval false if no flags were set and nothing written
-@retval true if anything was written to the redo log */
-bool
-fil_names_clear(
- lsn_t lsn,
- bool do_write)
+and write out FILE_MODIFY if needed, and write FILE_CHECKPOINT.
+@param lsn checkpoint LSN
+@return current LSN */
+lsn_t fil_names_clear(lsn_t lsn)
{
mtr_t mtr;
- mysql_mutex_assert_owner(&log_sys.mutex);
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
ut_ad(lsn);
+ ut_ad(log_sys.is_latest());
mtr.start();
for (auto it = fil_system.named_spaces.begin();
it != fil_system.named_spaces.end(); ) {
- if (mtr.get_log_size()
- + strlen(it->chain.start->name)
- >= RECV_SCAN_SIZE - (3 + 5 + 1)) {
+ if (mtr.get_log_size() + strlen(it->chain.start->name)
+ >= recv_sys.MTR_SIZE_MAX - (3 + 5)) {
/* Prevent log parse buffer overflow */
mtr.commit_files();
mtr.start();
@@ -3089,20 +3022,13 @@ fil_names_clear(
was called. If we kept track of "min_lsn" (the first LSN
where max_lsn turned nonzero), we could avoid the
fil_names_write() call if min_lsn > lsn. */
-
- fil_names_write(&*it, &mtr);
- do_write = true;
-
+ ut_ad(UT_LIST_GET_LEN((*it).chain) == 1);
+ fil_name_write((*it).id, UT_LIST_GET_FIRST((*it).chain)->name,
+ &mtr);
it = next;
}
- if (do_write) {
- mtr.commit_files(lsn);
- } else {
- ut_ad(!mtr.has_modifications());
- }
-
- return(do_write);
+ return mtr.commit_files(lsn);
}
/* Unit Tests */
diff --git a/storage/innobase/fil/fil0pagecompress.cc b/storage/innobase/fil/fil0pagecompress.cc
index 9961bdf056c..b6971558201 100644
--- a/storage/innobase/fil/fil0pagecompress.cc
+++ b/storage/innobase/fil/fil0pagecompress.cc
@@ -55,21 +55,11 @@ Updated 14/02/2015
#include <fcntl.h>
#endif
#include "row0mysql.h"
-#ifdef HAVE_LZ4
#include "lz4.h"
-#endif
-#ifdef HAVE_LZO
#include "lzo/lzo1x.h"
-#endif
-#ifdef HAVE_LZMA
#include "lzma.h"
-#endif
-#ifdef HAVE_BZIP2
#include "bzlib.h"
-#endif
-#ifdef HAVE_SNAPPY
#include "snappy-c.h"
-#endif
/** Compress a page for the given compression algorithm.
@param[in] buf page to be compressed
@@ -94,6 +84,7 @@ static ulint fil_page_compress_low(
/* fall through */
case PAGE_UNCOMPRESSED:
return 0;
+
case PAGE_ZLIB_ALGORITHM:
{
ulong len = uLong(write_size);
@@ -104,23 +95,15 @@ static ulint fil_page_compress_low(
}
}
break;
-#ifdef HAVE_LZ4
+
case PAGE_LZ4_ALGORITHM:
-# ifdef HAVE_LZ4_COMPRESS_DEFAULT
write_size = LZ4_compress_default(
reinterpret_cast<const char*>(buf),
reinterpret_cast<char*>(out_buf) + header_len,
int(srv_page_size), int(write_size));
-# else
- write_size = LZ4_compress_limitedOutput(
- reinterpret_cast<const char*>(buf),
- reinterpret_cast<char*>(out_buf) + header_len,
- int(srv_page_size), int(write_size));
-# endif
return write_size;
-#endif /* HAVE_LZ4 */
-#ifdef HAVE_LZO
+
case PAGE_LZO_ALGORITHM: {
lzo_uint len = write_size;
@@ -133,8 +116,7 @@ static ulint fil_page_compress_low(
}
break;
}
-#endif /* HAVE_LZO */
-#ifdef HAVE_LZMA
+
case PAGE_LZMA_ALGORITHM: {
size_t out_pos = 0;
@@ -147,9 +129,7 @@ static ulint fil_page_compress_low(
}
break;
}
-#endif /* HAVE_LZMA */
-#ifdef HAVE_BZIP2
case PAGE_BZIP2_ALGORITHM: {
unsigned len = unsigned(write_size);
if (BZ_OK == BZ2_bzBuffToBuffCompress(
@@ -163,9 +143,7 @@ static ulint fil_page_compress_low(
}
break;
}
-#endif /* HAVE_BZIP2 */
-#ifdef HAVE_SNAPPY
case PAGE_SNAPPY_ALGORITHM: {
size_t len = snappy_max_compressed_length(srv_page_size);
@@ -179,7 +157,6 @@ static ulint fil_page_compress_low(
}
break;
}
-#endif /* HAVE_SNAPPY */
}
return 0;
@@ -195,7 +172,7 @@ static ulint fil_page_compress_low(
static ulint fil_page_compress_for_full_crc32(
const byte* buf,
byte* out_buf,
- ulint flags,
+ uint32_t flags,
ulint block_size,
bool encrypted)
{
@@ -378,7 +355,7 @@ static ulint fil_page_compress_for_non_full_crc32(
ulint fil_page_compress(
const byte* buf,
byte* out_buf,
- ulint flags,
+ uint32_t flags,
ulint block_size,
bool encrypted)
{
@@ -432,7 +409,7 @@ static bool fil_page_decompress_low(
uLong(actual_size))
&& len == srv_page_size);
}
-#ifdef HAVE_LZ4
+
case PAGE_LZ4_ALGORITHM:
return LZ4_decompress_safe(
reinterpret_cast<const char*>(buf) + header_len,
@@ -440,8 +417,7 @@ static bool fil_page_decompress_low(
static_cast<int>(actual_size),
static_cast<int>(srv_page_size)) ==
static_cast<int>(srv_page_size);
-#endif /* HAVE_LZ4 */
-#ifdef HAVE_LZO
+
case PAGE_LZO_ALGORITHM:
{
lzo_uint len_lzo = srv_page_size;
@@ -450,8 +426,7 @@ static bool fil_page_decompress_low(
actual_size, tmp_buf, &len_lzo, NULL)
&& len_lzo == srv_page_size);
}
-#endif /* HAVE_LZO */
-#ifdef HAVE_LZMA
+
case PAGE_LZMA_ALGORITHM:
{
size_t src_pos = 0;
@@ -464,8 +439,7 @@ static bool fil_page_decompress_low(
srv_page_size)
&& dst_pos == srv_page_size;
}
-#endif /* HAVE_LZMA */
-#ifdef HAVE_BZIP2
+
case PAGE_BZIP2_ALGORITHM:
{
uint dst_pos = static_cast<uint>(srv_page_size);
@@ -476,8 +450,7 @@ static bool fil_page_decompress_low(
static_cast<uint>(actual_size), 1, 0)
&& dst_pos == srv_page_size;
}
-#endif /* HAVE_BZIP2 */
-#ifdef HAVE_SNAPPY
+
case PAGE_SNAPPY_ALGORITHM:
{
size_t olen = srv_page_size;
@@ -489,7 +462,6 @@ static bool fil_page_decompress_low(
reinterpret_cast<char*>(tmp_buf), &olen)
&& olen == srv_page_size;
}
-#endif /* HAVE_SNAPPY */
}
return false;
@@ -502,7 +474,8 @@ static bool fil_page_decompress_low(
@return size of the compressed data
@retval 0 if decompression failed
@retval srv_page_size if the page was not compressed */
-ulint fil_page_decompress_for_full_crc32(byte* tmp_buf, byte* buf, ulint flags)
+static size_t fil_page_decompress_for_full_crc32(byte *tmp_buf, byte *buf,
+ uint32_t flags)
{
ut_ad(fil_space_t::full_crc32(flags));
bool compressed = false;
@@ -547,9 +520,7 @@ ulint fil_page_decompress_for_full_crc32(byte* tmp_buf, byte* buf, ulint flags)
@return size of the compressed data
@retval 0 if decompression failed
@retval srv_page_size if the page was not compressed */
-ulint fil_page_decompress_for_non_full_crc32(
- byte* tmp_buf,
- byte* buf)
+static size_t fil_page_decompress_for_non_full_crc32(byte *tmp_buf, byte *buf)
{
ulint header_len;
uint comp_algo;
@@ -600,10 +571,7 @@ ulint fil_page_decompress_for_non_full_crc32(
@return size of the compressed data
@retval 0 if decompression failed
@retval srv_page_size if the page was not compressed */
-ulint fil_page_decompress(
- byte* tmp_buf,
- byte* buf,
- ulint flags)
+ulint fil_page_decompress(byte *tmp_buf, byte *buf, uint32_t flags)
{
if (fil_space_t::full_crc32(flags)) {
return fil_page_decompress_for_full_crc32(tmp_buf, buf, flags);
diff --git a/storage/innobase/fsp/fsp0file.cc b/storage/innobase/fsp/fsp0file.cc
index ccf751cbf92..0a4119587f8 100644
--- a/storage/innobase/fsp/fsp0file.cc
+++ b/storage/innobase/fsp/fsp0file.cc
@@ -304,13 +304,13 @@ Datafile::read_first_page(bool read_only_mode)
+ m_first_page);
m_flags = fsp_header_get_flags(m_first_page);
if (!fil_space_t::is_valid_flags(m_flags, m_space_id)) {
- ulint cflags = fsp_flags_convert_from_101(m_flags);
- if (cflags == ULINT_UNDEFINED) {
+ uint32_t cflags = fsp_flags_convert_from_101(m_flags);
+ if (cflags == UINT32_MAX) {
switch (fsp_flags_is_incompatible_mysql(m_flags)) {
case 0:
- sql_print_error("InnoDB: Invalid flags 0x%zx in %s",
+ sql_print_error("InnoDB: Invalid flags 0x%" PRIx32 " in %s",
m_flags, m_filepath);
- return(DB_CORRUPTION);
+ return DB_CORRUPTION;
case 3:
case 2:
sql_print_error("InnoDB: MySQL-8.0 tablespace in %s",
@@ -322,7 +322,7 @@ Datafile::read_first_page(bool read_only_mode)
break;
}
sql_print_error("InnoDB: Restart in MySQL for migration/recovery.");
- return(DB_UNSUPPORTED);
+ return DB_UNSUPPORTED;
} else {
m_flags = cflags;
}
@@ -355,8 +355,7 @@ in order for this function to validate it.
@param[in] flags The expected tablespace flags.
@retval DB_SUCCESS if tablespace is valid, DB_ERROR if not.
m_is_valid is also set true on success, else false. */
-dberr_t
-Datafile::validate_to_dd(ulint space_id, ulint flags)
+dberr_t Datafile::validate_to_dd(uint32_t space_id, uint32_t flags)
{
dberr_t err;
@@ -367,7 +366,7 @@ Datafile::validate_to_dd(ulint space_id, ulint flags)
/* Validate this single-table-tablespace with the data dictionary,
but do not compare the DATA_DIR flag, in case the tablespace was
remotely located. */
- err = validate_first_page(0);
+ err = validate_first_page();
if (err != DB_SUCCESS) {
return(err);
}
@@ -410,7 +409,7 @@ Datafile::validate_for_recovery()
ut_ad(is_open());
ut_ad(!srv_read_only_mode);
- err = validate_first_page(0);
+ err = validate_first_page();
switch (err) {
case DB_TABLESPACE_EXISTS:
@@ -446,7 +445,7 @@ Datafile::validate_for_recovery()
}
}
- if (m_space_id == ULINT_UNDEFINED) {
+ if (m_space_id == UINT32_MAX) {
return DB_SUCCESS; /* empty file */
}
@@ -457,7 +456,7 @@ Datafile::validate_for_recovery()
/* Free the previously read first page and then re-validate. */
free_first_page();
m_defer = false;
- err = validate_first_page(0);
+ err = validate_first_page();
}
return(err);
@@ -467,11 +466,10 @@ Datafile::validate_for_recovery()
tablespace is opened. This occurs before the fil_space_t is created
so the Space ID found here must not already be open.
m_is_valid is set true on success, else false.
-@param[out] flush_lsn contents of FIL_PAGE_FILE_FLUSH_LSN
@retval DB_SUCCESS on if the datafile is valid
@retval DB_CORRUPTION if the datafile is not readable
@retval DB_TABLESPACE_EXISTS if there is a duplicate space_id */
-dberr_t Datafile::validate_first_page(lsn_t *flush_lsn)
+dberr_t Datafile::validate_first_page()
{
const char* error_txt = NULL;
@@ -481,14 +479,6 @@ dberr_t Datafile::validate_first_page(lsn_t *flush_lsn)
&& read_first_page(srv_read_only_mode) != DB_SUCCESS) {
error_txt = "Cannot read first page";
- } else {
- ut_ad(m_first_page);
-
- if (flush_lsn != NULL) {
-
- *flush_lsn = mach_read_from_8(
- m_first_page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION);
- }
}
if (error_txt != NULL) {
@@ -639,15 +629,15 @@ Datafile::find_space_id()
page_size <<= 1) {
/* map[space_id] = count of pages */
typedef std::map<
- ulint,
- ulint,
- std::less<ulint>,
- ut_allocator<std::pair<const ulint, ulint> > >
+ uint32_t,
+ uint32_t,
+ std::less<uint32_t>,
+ ut_allocator<std::pair<const uint32_t, uint32_t> > >
Pages;
Pages verify;
- ulint page_count = 64;
- ulint valid_pages = 0;
+ uint32_t page_count = 64;
+ uint32_t valid_pages = 0;
/* Adjust the number of pages to analyze based on file size */
while ((page_count * page_size) > file_size) {
@@ -661,14 +651,14 @@ Datafile::find_space_id()
byte* page = static_cast<byte*>(
aligned_malloc(page_size, page_size));
- ulint fsp_flags;
+ uint32_t fsp_flags;
/* provide dummy value if the first os_file_read() fails */
switch (srv_checksum_algorithm) {
case SRV_CHECKSUM_ALGORITHM_STRICT_FULL_CRC32:
case SRV_CHECKSUM_ALGORITHM_FULL_CRC32:
fsp_flags = 1U << FSP_FLAGS_FCRC32_POS_MARKER
| FSP_FLAGS_FCRC32_PAGE_SSIZE()
- | innodb_compression_algorithm
+ | uint(innodb_compression_algorithm)
<< FSP_FLAGS_FCRC32_POS_COMPRESSED_ALGO;
break;
default:
@@ -708,7 +698,7 @@ Datafile::find_space_id()
if (noncompressed_ok || compressed_ok) {
- ulint space_id = mach_read_from_4(page
+ uint32_t space_id = mach_read_from_4(page
+ FIL_PAGE_SPACE_ID);
if (space_id > 0) {
@@ -786,14 +776,14 @@ Datafile::restore_from_doublewrite()
return(true);
}
- ulint flags = mach_read_from_4(
+ uint32_t flags = mach_read_from_4(
FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + page);
if (!fil_space_t::is_valid_flags(flags, m_space_id)) {
flags = fsp_flags_convert_from_101(flags);
/* recv_dblwr_t::validate_page() inside find_page()
checked this already. */
- ut_ad(flags != ULINT_UNDEFINED);
+ ut_ad(flags != UINT32_MAX);
/* The flags on the page should be converted later. */
}
@@ -804,7 +794,7 @@ Datafile::restore_from_doublewrite()
ib::info() << "Restoring page " << page_id
<< " of datafile '" << m_filepath
<< "' from the doublewrite buffer. Writing "
- << physical_size << " bytes into file '"
+ << ib::bytes_iec{physical_size} << " into file '"
<< m_filepath << "'";
return(os_file_write(
diff --git a/storage/innobase/fsp/fsp0fsp.cc b/storage/innobase/fsp/fsp0fsp.cc
index 514083d35cc..c6044b201fe 100644
--- a/storage/innobase/fsp/fsp0fsp.cc
+++ b/storage/innobase/fsp/fsp0fsp.cc
@@ -456,8 +456,7 @@ void fsp_apply_init_file_page(buf_block_t *block)
const page_id_t id(block->page.id());
mach_write_to_4(block->page.frame + FIL_PAGE_OFFSET, id.page_no());
- if (log_sys.is_physical())
- memset_aligned<8>(block->page.frame + FIL_PAGE_PREV, 0xff, 8);
+ memset_aligned<8>(block->page.frame + FIL_PAGE_PREV, 0xff, 8);
mach_write_to_4(block->page.frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,
id.space());
if (page_zip_des_t* page_zip= buf_block_get_page_zip(block))
@@ -467,8 +466,7 @@ void fsp_apply_init_file_page(buf_block_t *block)
static_assert(FIL_PAGE_OFFSET == 4, "compatibility");
memcpy_aligned<4>(page_zip->data + FIL_PAGE_OFFSET,
block->page.frame + FIL_PAGE_OFFSET, 4);
- if (log_sys.is_physical())
- memset_aligned<8>(page_zip->data + FIL_PAGE_PREV, 0xff, 8);
+ memset_aligned<8>(page_zip->data + FIL_PAGE_PREV, 0xff, 8);
static_assert(FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID % 4 == 2,
"not perfect alignment");
memcpy_aligned<2>(page_zip->data + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,
@@ -1523,7 +1521,7 @@ static
fseg_inode_t*
fseg_inode_try_get(
const fseg_header_t* header,
- ulint space,
+ uint32_t space,
ulint zip_size,
mtr_t* mtr,
buf_block_t** block,
@@ -2257,13 +2255,12 @@ fseg_alloc_free_page_general(
dberr_t* err) /*!< out: error code */
{
fseg_inode_t* inode;
- ulint space_id;
fil_space_t* space;
buf_block_t* iblock;
buf_block_t* block;
uint32_t n_reserved;
- space_id = page_get_space_id(page_align(seg_header));
+ const uint32_t space_id = page_get_space_id(page_align(seg_header));
space = mtr->x_lock_space(space_id);
inode = fseg_inode_try_get(seg_header, space_id, space->zip_size(),
mtr, &iblock, err);
diff --git a/storage/innobase/fsp/fsp0space.cc b/storage/innobase/fsp/fsp0space.cc
index b069250ff9f..6bdf9fcc4d8 100644
--- a/storage/innobase/fsp/fsp0space.cc
+++ b/storage/innobase/fsp/fsp0space.cc
@@ -59,7 +59,7 @@ Tablespace::shutdown()
m_files.clear();
ut_free(m_path);
m_path = NULL;
- m_space_id = ULINT_UNDEFINED;
+ m_space_id = UINT32_MAX;
}
/** Note that the data file was found.
@@ -118,7 +118,7 @@ Tablespace::open_or_create(bool is_temp)
/* Create the tablespace entry for the multi-file
tablespace in the tablespace manager. */
- ulint fsp_flags = 0;
+ uint32_t fsp_flags;
switch (srv_checksum_algorithm) {
case SRV_CHECKSUM_ALGORITHM_FULL_CRC32:
diff --git a/storage/innobase/fsp/fsp0sysspace.cc b/storage/innobase/fsp/fsp0sysspace.cc
index c9d09e31313..ef650436907 100644
--- a/storage/innobase/fsp/fsp0sysspace.cc
+++ b/storage/innobase/fsp/fsp0sysspace.cc
@@ -396,8 +396,8 @@ SysTablespace::set_size(
/* We created the data file and now write it full of zeros */
ib::info() << "Setting file '" << file.filepath() << "' size to "
- << (file.m_size >> (20U - srv_page_size_shift)) << " MB."
- " Physically writing the file full; Please wait ...";
+ << ib::bytes_iec{file.m_size << srv_page_size_shift} <<
+ ". Physically writing the file full; Please wait ...";
bool success = os_file_set_size(
file.m_filepath, file.m_handle,
@@ -405,8 +405,8 @@ SysTablespace::set_size(
if (success) {
ib::info() << "File '" << file.filepath() << "' size is now "
- << (file.m_size >> (20U - srv_page_size_shift))
- << " MB.";
+ << ib::bytes_iec{file.m_size << srv_page_size_shift}
+ << ".";
} else {
ib::error() << "Could not set the file size of '"
<< file.filepath() << "'. Probably out of disk space";
@@ -548,16 +548,11 @@ SysTablespace::open_file(
}
/** Check the tablespace header for this tablespace.
-@param[out] flushed_lsn the value of FIL_PAGE_FILE_FLUSH_LSN
@return DB_SUCCESS or error code */
-dberr_t
-SysTablespace::read_lsn_and_check_flags(lsn_t* flushed_lsn)
+inline dberr_t SysTablespace::read_lsn_and_check_flags()
{
dberr_t err;
- /* Only relevant for the system tablespace. */
- ut_ad(space_id() == TRX_SYS_SPACE);
-
files_t::iterator it = m_files.begin();
ut_a(it->m_exists);
@@ -589,7 +584,7 @@ SysTablespace::read_lsn_and_check_flags(lsn_t* flushed_lsn)
first datafile. */
for (int retry = 0; retry < 2; ++retry) {
- err = it->validate_first_page(flushed_lsn);
+ err = it->validate_first_page();
if (err != DB_SUCCESS
&& (retry == 1
@@ -616,6 +611,13 @@ SysTablespace::read_lsn_and_check_flags(lsn_t* flushed_lsn)
return(err);
}
+ if (srv_operation == SRV_OPERATION_NORMAL) {
+ /* Prepare for possible upgrade from 0-sized ib_logfile0. */
+ ut_ad(!log_sys.next_checkpoint_lsn);
+ log_sys.next_checkpoint_lsn = mach_read_from_8(
+ it->m_first_page + 26/*FIL_PAGE_FILE_FLUSH_LSN*/);
+ }
+
it->close();
return(DB_SUCCESS);
@@ -853,14 +855,12 @@ SysTablespace::check_file_spec(
@param[in] is_temp whether this is a temporary tablespace
@param[in] create_new_db whether we are creating a new database
@param[out] sum_new_sizes sum of sizes of the new files added
-@param[out] flush_lsn FIL_PAGE_FILE_FLUSH_LSN of first file
@return DB_SUCCESS or error code */
dberr_t
SysTablespace::open_or_create(
bool is_temp,
bool create_new_db,
- ulint* sum_new_sizes,
- lsn_t* flush_lsn)
+ ulint* sum_new_sizes)
{
dberr_t err = DB_SUCCESS;
fil_space_t* space = NULL;
@@ -909,10 +909,9 @@ SysTablespace::open_or_create(
}
- if (!create_new_db && flush_lsn) {
- /* Validate the header page in the first datafile
- and read LSNs fom the others. */
- err = read_lsn_and_check_flags(flush_lsn);
+ if (!create_new_db && space_id() == TRX_SYS_SPACE) {
+ /* Validate the header page in the first datafile. */
+ err = read_lsn_and_check_flags();
if (err != DB_SUCCESS) {
return(err);
}
diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc
index eed2eb72cd1..6fdb0e11182 100644
--- a/storage/innobase/fts/fts0fts.cc
+++ b/storage/innobase/fts/fts0fts.cc
@@ -4010,7 +4010,7 @@ fts_sync_begin(
ib::info() << "FTS SYNC for table " << sync->table->name
<< ", deleted count: "
<< ib_vector_size(cache->deleted_doc_ids)
- << " size: " << cache->total_size << " bytes";
+ << " size: " << ib::bytes_iec{cache->total_size};
}
}
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index c6a515b21d3..55f12868991 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -79,7 +79,6 @@ this program; if not, write to the Free Software Foundation, Inc.,
#include "dict0load.h"
#include "btr0defragment.h"
#include "dict0crea.h"
-#include "dict0dict.h"
#include "dict0stats.h"
#include "dict0stats_bg.h"
#include "fil0fil.h"
@@ -94,9 +93,9 @@ this program; if not, write to the Free Software Foundation, Inc.,
#include "mtr0mtr.h"
#include "os0file.h"
#include "page0zip.h"
-#include "rem0types.h"
#include "row0import.h"
#include "row0ins.h"
+#include "row0log.h"
#include "row0merge.h"
#include "row0mysql.h"
#include "row0quiesce.h"
@@ -114,6 +113,12 @@ this program; if not, write to the Free Software Foundation, Inc.,
#include "ut0mem.h"
#include "row0ext.h"
+#include "lz4.h"
+#include "lzo/lzo1x.h"
+#include "lzma.h"
+#include "bzlib.h"
+#include "snappy-c.h"
+
#include <limits>
#define thd_get_trx_isolation(X) ((enum_tx_isolation)thd_tx_isolation(X))
@@ -164,6 +169,8 @@ static const long AUTOINC_OLD_STYLE_LOCKING = 0;
static const long AUTOINC_NEW_STYLE_LOCKING = 1;
static const long AUTOINC_NO_LOCKING = 2;
+static constexpr size_t buf_pool_chunk_min_size= 1U << 20;
+
static ulong innobase_open_files;
static long innobase_autoinc_lock_mode;
@@ -233,10 +240,10 @@ static void innodb_max_purge_lag_wait_update(THD *thd, st_mysql_sys_var *,
if (thd_kill_level(thd))
break;
/* Adjust for purge_coordinator_state::refresh() */
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
const lsn_t last= log_sys.last_checkpoint_lsn,
max_age= log_sys.max_checkpoint_age;
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.rd_unlock();
const lsn_t lsn= log_sys.get_lsn();
if ((lsn - last) / 4 >= max_age / 5)
buf_flush_ahead(last + max_age / 5, false);
@@ -524,8 +531,6 @@ mysql_pfs_key_t fts_doc_id_mutex_key;
mysql_pfs_key_t ibuf_bitmap_mutex_key;
mysql_pfs_key_t ibuf_mutex_key;
mysql_pfs_key_t ibuf_pessimistic_insert_mutex_key;
-mysql_pfs_key_t log_sys_mutex_key;
-mysql_pfs_key_t log_flush_order_mutex_key;
mysql_pfs_key_t recalc_pool_mutex_key;
mysql_pfs_key_t purge_sys_pq_mutex_key;
mysql_pfs_key_t recv_sys_mutex_key;
@@ -557,11 +562,9 @@ static PSI_mutex_info all_innodb_mutexes[] = {
PSI_KEY(fts_cache_init_mutex),
PSI_KEY(fts_delete_mutex),
PSI_KEY(fts_doc_id_mutex),
- PSI_KEY(log_flush_order_mutex),
PSI_KEY(ibuf_mutex),
PSI_KEY(ibuf_pessimistic_insert_mutex),
PSI_KEY(index_online_log),
- PSI_KEY(log_sys_mutex),
PSI_KEY(page_zip_stat_per_index_mutex),
PSI_KEY(purge_sys_pq_mutex),
PSI_KEY(recv_sys_mutex),
@@ -587,8 +590,9 @@ mysql_pfs_key_t index_online_log_key;
mysql_pfs_key_t fil_space_latch_key;
mysql_pfs_key_t trx_i_s_cache_lock_key;
mysql_pfs_key_t trx_purge_latch_key;
-mysql_pfs_key_t lock_latch_key;
mysql_pfs_key_t trx_rseg_latch_key;
+mysql_pfs_key_t lock_latch_key;
+mysql_pfs_key_t log_latch_key;
/* all_innodb_rwlocks array contains rwlocks that are
performance schema instrumented if "UNIV_PFS_RWLOCK"
@@ -602,8 +606,9 @@ static PSI_rwlock_info all_innodb_rwlocks[] =
{ &fil_space_latch_key, "fil_space_latch", 0 },
{ &trx_i_s_cache_lock_key, "trx_i_s_cache_lock", 0 },
{ &trx_purge_latch_key, "trx_purge_latch", 0 },
- { &lock_latch_key, "lock_latch", 0 },
{ &trx_rseg_latch_key, "trx_rseg_latch", 0 },
+ { &lock_latch_key, "lock_latch", 0 },
+ { &log_latch_key, "log_latch", 0 },
{ &index_tree_rw_lock_key, "index_tree_rw_lock", PSI_RWLOCK_FLAG_SX }
};
# endif /* UNIV_PFS_RWLOCK */
@@ -624,7 +629,6 @@ static PSI_thread_info all_innodb_threads[] = {
performance schema instrumented if "UNIV_PFS_IO" is defined */
static PSI_file_info all_innodb_files[] = {
PSI_KEY(innodb_data_file),
- PSI_KEY(innodb_log_file),
PSI_KEY(innodb_temp_file)
};
# endif /* UNIV_PFS_IO */
@@ -852,11 +856,6 @@ innodb_compression_algorithm_validate(
for update function */
struct st_mysql_value* value); /*!< in: incoming string */
-static ibool innodb_have_lzo=IF_LZO(1, 0);
-static ibool innodb_have_lz4=IF_LZ4(1, 0);
-static ibool innodb_have_lzma=IF_LZMA(1, 0);
-static ibool innodb_have_bzip2=IF_BZIP2(1, 0);
-static ibool innodb_have_snappy=IF_SNAPPY(1, 0);
static ibool innodb_have_punch_hole=IF_PUNCH_HOLE(1, 0);
static
@@ -947,12 +946,12 @@ static SHOW_VAR innodb_status_variables[]= {
{"buffer_pool_read_requests", &buf_pool.stat.n_page_gets, SHOW_SIZE_T},
{"buffer_pool_reads", &buf_pool.stat.n_pages_read, SHOW_SIZE_T},
{"buffer_pool_wait_free", &buf_pool.stat.LRU_waits, SHOW_SIZE_T},
- {"buffer_pool_write_requests",
- &export_vars.innodb_buffer_pool_write_requests, SHOW_SIZE_T},
+ {"buffer_pool_write_requests", &buf_pool.flush_list_requests, SHOW_SIZE_T},
{"checkpoint_age", &export_vars.innodb_checkpoint_age, SHOW_SIZE_T},
{"checkpoint_max_age", &export_vars.innodb_checkpoint_max_age, SHOW_SIZE_T},
- {"data_fsyncs", &export_vars.innodb_data_fsyncs, SHOW_SIZE_T},
- {"data_pending_fsyncs", &export_vars.innodb_data_pending_fsyncs,SHOW_SIZE_T},
+ {"data_fsyncs", (size_t*) &os_n_fsyncs, SHOW_SIZE_T},
+ {"data_pending_fsyncs",
+ (size_t*) &fil_n_pending_tablespace_flushes, SHOW_SIZE_T},
{"data_pending_reads", &export_vars.innodb_data_pending_reads, SHOW_SIZE_T},
{"data_pending_writes", &export_vars.innodb_data_pending_writes,SHOW_SIZE_T},
{"data_read", &export_vars.innodb_data_read, SHOW_SIZE_T},
@@ -977,9 +976,9 @@ static SHOW_VAR innodb_status_variables[]= {
{"ibuf_merges", &ibuf.n_merges, SHOW_SIZE_T},
{"ibuf_segment_size", &ibuf.seg_size, SHOW_SIZE_T},
{"ibuf_size", &ibuf.size, SHOW_SIZE_T},
- {"log_waits", &export_vars.innodb_log_waits, SHOW_SIZE_T},
- {"log_write_requests", &export_vars.innodb_log_write_requests, SHOW_SIZE_T},
- {"log_writes", &export_vars.innodb_log_writes, SHOW_SIZE_T},
+ {"log_waits", &log_sys.waits, SHOW_SIZE_T},
+ {"log_write_requests", &log_sys.write_to_buf, SHOW_SIZE_T},
+ {"log_writes", &log_sys.write_to_log, SHOW_SIZE_T},
{"lsn_current", &export_vars.innodb_lsn_current, SHOW_ULONGLONG},
{"lsn_flushed", &export_vars.innodb_lsn_flushed, SHOW_ULONGLONG},
{"lsn_last_checkpoint", &export_vars.innodb_lsn_last_checkpoint,
@@ -991,11 +990,6 @@ static SHOW_VAR innodb_status_variables[]= {
{"mem_adaptive_hash", &export_vars.innodb_mem_adaptive_hash, SHOW_SIZE_T},
#endif
{"mem_dictionary", &export_vars.innodb_mem_dictionary, SHOW_SIZE_T},
- {"os_log_fsyncs", &export_vars.innodb_os_log_fsyncs, SHOW_SIZE_T},
- {"os_log_pending_fsyncs", &export_vars.innodb_os_log_pending_fsyncs,
- SHOW_SIZE_T},
- {"os_log_pending_writes", &export_vars.innodb_os_log_pending_writes,
- SHOW_SIZE_T},
{"os_log_written", &export_vars.innodb_os_log_written, SHOW_SIZE_T},
{"page_size", &srv_page_size, SHOW_ULONG},
{"pages_created", &buf_pool.stat.n_pages_created, SHOW_SIZE_T},
@@ -1038,11 +1032,11 @@ static SHOW_VAR innodb_status_variables[]= {
&export_vars.innodb_pages_encrypted, SHOW_LONGLONG},
{"num_pages_decrypted",
&export_vars.innodb_pages_decrypted, SHOW_LONGLONG},
- {"have_lz4", &innodb_have_lz4, SHOW_BOOL},
- {"have_lzo", &innodb_have_lzo, SHOW_BOOL},
- {"have_lzma", &innodb_have_lzma, SHOW_BOOL},
- {"have_bzip2", &innodb_have_bzip2, SHOW_BOOL},
- {"have_snappy", &innodb_have_snappy, SHOW_BOOL},
+ {"have_lz4", &(provider_service_lz4->is_loaded), SHOW_BOOL},
+ {"have_lzo", &(provider_service_lzo->is_loaded), SHOW_BOOL},
+ {"have_lzma", &(provider_service_lzma->is_loaded), SHOW_BOOL},
+ {"have_bzip2", &(provider_service_bzip2->is_loaded), SHOW_BOOL},
+ {"have_snappy", &(provider_service_snappy->is_loaded), SHOW_BOOL},
{"have_punch_hole", &innodb_have_punch_hole, SHOW_BOOL},
/* Defragmentation */
@@ -1621,54 +1615,14 @@ innobase_start_trx_and_assign_read_view(
be committed */
/** Flush InnoDB redo logs to the file system.
-@param[in] hton InnoDB handlerton
-@param[in] binlog_group_flush true if we got invoked by binlog
-group commit during flush stage, false in other cases.
@return false */
-static
-bool
-innobase_flush_logs(
- handlerton* hton,
- bool binlog_group_flush)
+static bool innobase_flush_logs(handlerton*)
{
- DBUG_ENTER("innobase_flush_logs");
- DBUG_ASSERT(hton == innodb_hton_ptr);
-
- if (srv_read_only_mode) {
- DBUG_RETURN(false);
- }
-
- /* If !binlog_group_flush, we got invoked by FLUSH LOGS or similar.
- Else, we got invoked by binlog group commit during flush stage. */
-
- if (binlog_group_flush && srv_flush_log_at_trx_commit == 0) {
- /* innodb_flush_log_at_trx_commit=0
- (write and sync once per second).
- Do not flush the redo log during binlog group commit. */
- DBUG_RETURN(false);
- }
-
- /* Flush the redo log buffer to the redo log file.
- Sync it to disc if we are in FLUSH LOGS, or if
- innodb_flush_log_at_trx_commit=1
- (write and sync at each commit). */
- log_buffer_flush_to_disk(!binlog_group_flush
- || srv_flush_log_at_trx_commit == 1);
-
- DBUG_RETURN(false);
-}
-
-/** Flush InnoDB redo logs to the file system.
-@param[in] hton InnoDB handlerton
-@param[in] binlog_group_flush true if we got invoked by binlog
-group commit during flush stage, false in other cases.
-@return false */
-static
-bool
-innobase_flush_logs(
- handlerton* hton)
-{
- return innobase_flush_logs(hton, true);
+ if (!srv_read_only_mode && srv_flush_log_at_trx_commit)
+ /* Write any outstanding redo log. Durably if
+ innodb_flush_log_at_trx_commit=1. */
+ log_buffer_flush_to_disk(srv_flush_log_at_trx_commit == 1);
+ return false;
}
/************************************************************************//**
@@ -1770,16 +1724,11 @@ If correct, set the associated page_size_shift which is the power of 2
for this page size.
@param[in] page_size Page Size to evaluate
@return an associated page_size_shift if valid, 0 if invalid. */
-inline
-ulong
-innodb_page_size_validate(
- ulong page_size)
+inline uint32_t innodb_page_size_validate(ulong page_size)
{
- ulong n;
-
DBUG_ENTER("innodb_page_size_validate");
- for (n = UNIV_PAGE_SIZE_SHIFT_MIN;
+ for (uint32_t n = UNIV_PAGE_SIZE_SHIFT_MIN;
n <= UNIV_PAGE_SIZE_SHIFT_MAX;
n++) {
if (page_size == static_cast<ulong>(1 << n)) {
@@ -3726,11 +3675,6 @@ innodb_buffer_pool_size_update(
void* var_ptr,
const void* save);
-/* If the default value of innodb_buffer_pool_size is increased to be more than
-BUF_POOL_SIZE_THRESHOLD (srv/srv0start.cc), then srv_buf_pool_instances_default
-can be removed and 8 used instead. The problem with the current setup is that
-with 128MiB default buffer pool size and 8 instances by default we would emit
-a warning when no options are specified. */
static MYSQL_SYSVAR_ULONGLONG(buffer_pool_size, innobase_buffer_pool_size,
PLUGIN_VAR_RQCMDARG,
"The size of the memory buffer InnoDB uses to cache data and indexes of its tables.",
@@ -3755,36 +3699,75 @@ static const char* ha_innobase_exts[] = {
@retval 0 if no system-versioned data was affected by the transaction */
static ulonglong innodb_prepare_commit_versioned(THD* thd, ulonglong *trx_id)
{
- if (const trx_t* trx = thd_to_trx(thd)) {
- *trx_id = trx->id;
-
- for (const auto& t : trx->mod_tables) {
- if (t.second.is_versioned()) {
- DBUG_ASSERT(t.first->versioned_by_id());
- DBUG_ASSERT(trx->rsegs.m_redo.rseg);
+ if (trx_t *trx= thd_to_trx(thd))
+ {
+ *trx_id= trx->id;
+ bool versioned= false;
- return trx_sys.get_new_trx_id();
- }
- }
+ for (auto &t : trx->mod_tables)
+ {
+ if (t.second.is_versioned())
+ {
+ DBUG_ASSERT(t.first->versioned_by_id());
+ DBUG_ASSERT(trx->rsegs.m_redo.rseg);
+ versioned= true;
+ if (!trx->bulk_insert)
+ break;
+ }
+ if (t.second.is_bulk_insert())
+ {
+ ut_ad(trx->bulk_insert);
+ if (t.second.write_bulk(t.first, trx))
+ return ULONGLONG_MAX;
+ }
+ }
- return 0;
- }
+ return versioned ? trx_sys.get_new_trx_id() : 0;
+ }
- *trx_id = 0;
- return 0;
+ *trx_id= 0;
+ return 0;
}
-/** Initialize and normalize innodb_buffer_pool_size. */
+/** Initialize and normalize innodb_buffer_pool_{chunk_,}size. */
static void innodb_buffer_pool_size_init()
{
- if (srv_buf_pool_chunk_unit > srv_buf_pool_size) {
- /* Size unit of buffer pool is larger than srv_buf_pool_size.
- adjust srv_buf_pool_chunk_unit for srv_buf_pool_size. */
- srv_buf_pool_chunk_unit = ulong(srv_buf_pool_size);
- }
+ if (srv_buf_pool_chunk_unit > srv_buf_pool_size)
+ {
+ /* Size unit of buffer pool is larger than srv_buf_pool_size.
+ adjust srv_buf_pool_chunk_unit for srv_buf_pool_size. */
+ srv_buf_pool_chunk_unit = srv_buf_pool_size;
+ }
+ else if (srv_buf_pool_chunk_unit == 0)
+ {
+ srv_buf_pool_chunk_unit = srv_buf_pool_size / 64;
+ my_large_page_truncate(&srv_buf_pool_chunk_unit);
+ }
- srv_buf_pool_size = buf_pool_size_align(srv_buf_pool_size);
- innobase_buffer_pool_size = srv_buf_pool_size;
+ if (srv_buf_pool_chunk_unit < buf_pool_chunk_min_size)
+ srv_buf_pool_chunk_unit = buf_pool_chunk_min_size;
+
+ srv_buf_pool_size = buf_pool_size_align(srv_buf_pool_size);
+ innobase_buffer_pool_size = srv_buf_pool_size;
+}
+
+
+static bool
+compression_algorithm_is_not_loaded(ulong compression_algorithm, myf flags)
+{
+ bool is_loaded[PAGE_ALGORITHM_LAST+1]= { 1, 1, provider_service_lz4->is_loaded,
+ provider_service_lzo->is_loaded, provider_service_lzma->is_loaded,
+ provider_service_bzip2->is_loaded, provider_service_snappy->is_loaded };
+
+ DBUG_ASSERT(compression_algorithm <= PAGE_ALGORITHM_LAST);
+
+ if (is_loaded[compression_algorithm])
+ return 0;
+
+ my_printf_error(HA_ERR_UNSUPPORTED, "InnoDB: compression algorithm %s (%u)"
+ " is not available. Please, load the corresponding provider plugin.", flags,
+ page_compression_algorithms[compression_algorithm], compression_algorithm);
+ return 1;
}
/** Initialize, validate and normalize the InnoDB startup parameters.
@@ -3822,50 +3805,8 @@ static int innodb_init_params()
DBUG_RETURN(HA_ERR_INITIALIZATION);
}
-#ifndef HAVE_LZ4
- if (innodb_compression_algorithm == PAGE_LZ4_ALGORITHM) {
- sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: liblz4 is not installed. \n",
- innodb_compression_algorithm);
- DBUG_RETURN(HA_ERR_INITIALIZATION);
- }
-#endif
-
-#ifndef HAVE_LZO
- if (innodb_compression_algorithm == PAGE_LZO_ALGORITHM) {
- sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: liblzo is not installed. \n",
- innodb_compression_algorithm);
- DBUG_RETURN(HA_ERR_INITIALIZATION);
- }
-#endif
-
-#ifndef HAVE_LZMA
- if (innodb_compression_algorithm == PAGE_LZMA_ALGORITHM) {
- sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: liblzma is not installed. \n",
- innodb_compression_algorithm);
- DBUG_RETURN(HA_ERR_INITIALIZATION);
- }
-#endif
-
-#ifndef HAVE_BZIP2
- if (innodb_compression_algorithm == PAGE_BZIP2_ALGORITHM) {
- sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: libbz2 is not installed. \n",
- innodb_compression_algorithm);
- DBUG_RETURN(HA_ERR_INITIALIZATION);
- }
-#endif
-
-#ifndef HAVE_SNAPPY
- if (innodb_compression_algorithm == PAGE_SNAPPY_ALGORITHM) {
- sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: libsnappy is not installed. \n",
- innodb_compression_algorithm);
- DBUG_RETURN(HA_ERR_INITIALIZATION);
- }
-#endif
+ if (compression_algorithm_is_not_loaded(innodb_compression_algorithm, ME_ERROR_LOG))
+ DBUG_RETURN(HA_ERR_INITIALIZATION);
if ((srv_encrypt_tables || srv_encrypt_log
|| innodb_encrypt_temporary_tables)
@@ -4035,23 +3976,6 @@ static int innodb_init_params()
<< srv_page_size_shift);
}
- if (srv_log_write_ahead_size > srv_page_size) {
- srv_log_write_ahead_size = srv_page_size;
- } else {
- ulong srv_log_write_ahead_size_tmp = OS_FILE_LOG_BLOCK_SIZE;
-
- while (srv_log_write_ahead_size_tmp
- < srv_log_write_ahead_size) {
- srv_log_write_ahead_size_tmp
- = srv_log_write_ahead_size_tmp * 2;
- }
- if (srv_log_write_ahead_size_tmp
- != srv_log_write_ahead_size) {
- srv_log_write_ahead_size
- = srv_log_write_ahead_size_tmp / 2;
- }
- }
-
srv_buf_pool_size = ulint(innobase_buffer_pool_size);
if (innobase_open_files < 10) {
@@ -4107,6 +4031,14 @@ static int innodb_init_params()
}
#endif
+#if defined __linux__ || defined _WIN32
+ if (srv_flush_log_at_trx_commit == 2) {
+ /* Do not disable the file system cache if
+ innodb_flush_log_at_trx_commit=2. */
+ log_sys.log_buffered = true;
+ }
+#endif
+
if (srv_read_only_mode) {
ib::info() << "Started in read only mode";
srv_use_doublewrite_buf = FALSE;
@@ -4541,6 +4473,25 @@ innobase_commit_ordered(
DBUG_VOID_RETURN;
}
+/** Mark the end of a statement.
+@param trx transaction
+@return whether an error occurred */
+static bool end_of_statement(trx_t *trx)
+{
+ trx_mark_sql_stat_end(trx);
+ if (UNIV_LIKELY(trx->error_state == DB_SUCCESS))
+ return false;
+
+ trx_savept_t savept;
+ savept.least_undo_no= 0;
+ trx->rollback(&savept);
+ /* MariaDB will roll back the entire transaction. */
+ trx->bulk_insert= false;
+ trx->last_sql_stat_start.least_undo_no= 0;
+ trx->savepoints_discard();
+ return true;
+}
+
/*****************************************************************//**
Commits a transaction in an InnoDB database or marks an SQL statement
ended.
@@ -4585,9 +4536,6 @@ innobase_commit(
if (commit_trx
|| (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) {
- DBUG_EXECUTE_IF("crash_innodb_before_commit",
- DBUG_SUICIDE(););
-
/* Run the fast part of commit if we did not already. */
if (!trx->active_commit_ordered) {
innobase_commit_ordered_2(trx, thd);
@@ -4620,8 +4568,9 @@ innobase_commit(
/* Store the current undo_no of the transaction so that we
know where to roll back if we have to roll back the next
SQL statement */
-
- trx_mark_sql_stat_end(trx);
+ if (UNIV_UNLIKELY(end_of_statement(trx))) {
+ DBUG_RETURN(1);
+ }
}
/* Reset the number AUTO-INC rows required */
@@ -5526,6 +5475,11 @@ innobase_match_index_columns(
col_type= DATA_FIXBINARY;
}
+ if (innodb_idx_fld->descending
+ != !!(key_part->key_part_flag & HA_REVERSE_SORT)) {
+ DBUG_RETURN(FALSE);
+ }
+
if (col_type != mtype) {
/* If the col_type we get from mysql type is a geometry
data type, we should check if mtype is a legacy type
@@ -10902,9 +10856,6 @@ err_col:
ut_ad(dict_sys.sys_tables_exist());
err = row_create_table_for_mysql(table, m_trx);
-
- DBUG_EXECUTE_IF("ib_crash_during_create_for_encryption",
- DBUG_SUICIDE(););
}
switch (err) {
@@ -10974,7 +10925,9 @@ create_index(
}
dict_mem_index_add_field(index, field->field_name.str,
- 0);
+ 0,
+ key->key_part->key_part_flag
+ & HA_REVERSE_SORT);
}
DBUG_RETURN(convert_error_code_to_mysql(
@@ -11068,7 +11021,9 @@ create_index(
index->type |= DICT_VIRTUAL;
}
- dict_mem_index_add_field(index, field_name, prefix_len);
+ dict_mem_index_add_field(index, field_name, prefix_len,
+ key_part->key_part_flag
+ & HA_REVERSE_SORT);
}
ut_ad(key->flags & HA_FULLTEXT || !(index->type & DICT_FTS));
@@ -11612,6 +11567,7 @@ bool create_table_info_t::innobase_table_flags()
m_flags2 = 0;
/* Check if there are any FTS indexes defined on this table. */
+ const uint fts_n_uniq= m_form->versioned() ? 2 : 1;
for (uint i = 0; i < m_form->s->keys; i++) {
const KEY* key = &m_form->key_info[i];
@@ -11636,6 +11592,8 @@ bool create_table_info_t::innobase_table_flags()
/* Do a pre-check on FTS DOC ID index */
if (!(key->flags & HA_NOSAME)
+ || key->user_defined_key_parts != fts_n_uniq
+ || (key->key_part[0].key_part_flag & HA_REVERSE_SORT)
|| strcmp(key->name.str, FTS_DOC_ID_INDEX_NAME)
|| strcmp(key->key_part[0].field->field_name.str,
FTS_DOC_ID_COL_NAME)) {
@@ -15237,16 +15195,26 @@ ha_innobase::check(
}
if ((check_opt->flags & T_QUICK) || index->is_corrupted()) {
- } else if (btr_validate_index(index, m_prebuilt->trx)
- != DB_SUCCESS) {
- is_ok = false;
- push_warning_printf(thd,
- Sql_condition::WARN_LEVEL_WARN,
- ER_NOT_KEYFILE,
- "InnoDB: The B-tree of"
- " index %s is corrupted.",
- index->name());
- continue;
+ } else if (trx_id_t bulk_trx_id =
+ m_prebuilt->table->bulk_trx_id) {
+ if (!m_prebuilt->trx->read_view.changes_visible(
+ bulk_trx_id)) {
+ is_ok = true;
+ goto func_exit;
+ }
+
+ if (btr_validate_index(index, m_prebuilt->trx)
+ != DB_SUCCESS) {
+ is_ok = false;
+ push_warning_printf(
+ thd,
+ Sql_condition::WARN_LEVEL_WARN,
+ ER_NOT_KEYFILE,
+ "InnoDB: The B-tree of"
+ " index %s is corrupted.",
+ index->name());
+ continue;
+ }
}
/* Instead of invoking change_active_index(), set up
@@ -15369,6 +15337,7 @@ ha_innobase::check(
}
# endif /* defined UNIV_AHI_DEBUG || defined UNIV_DEBUG */
#endif /* BTR_CUR_HASH_ADAPT */
+func_exit:
m_prebuilt->trx->op_info = "";
DBUG_RETURN(is_ok ? HA_ADMIN_OK : HA_ADMIN_CORRUPT);
@@ -15691,6 +15660,7 @@ ha_innobase::extra(
row_ins_duplicate_error_in_clust() will acquire a
shared lock instead of an exclusive lock. */
stmt_boundary:
+ trx->bulk_insert_apply();
trx->end_bulk_insert(*m_prebuilt->table);
trx->bulk_insert = false;
break;
@@ -15711,6 +15681,9 @@ ha_innobase::extra(
if (trx->is_bulk_insert()) {
/* Allow a subsequent INSERT into an empty table
if !unique_checks && !foreign_key_checks. */
+ if (dberr_t err = trx->bulk_insert_apply()) {
+ return err;
+ }
break;
}
goto stmt_boundary;
@@ -15824,6 +15797,12 @@ ha_innobase::start_stmt(
if (!trx->bulk_insert) {
break;
}
+
+ /* Trigger could've initiated another stmt.
+ So apply all bulk operation and mark as
+ end bulk insert for all tables */
+ trx->bulk_insert_apply();
+ trx->end_bulk_insert();
trx->bulk_insert = false;
trx->last_sql_stat_start.least_undo_no = trx->undo_no;
}
@@ -16868,7 +16847,8 @@ ha_innobase::cmp_ref(
}
if (result) {
-
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ result = -result;
return(result);
}
@@ -17023,8 +17003,9 @@ innobase_xa_prepare(
/* Store the current undo_no of the transaction so that we
know where to roll back if we have to roll back the next
SQL statement */
-
- trx_mark_sql_stat_end(trx);
+ if (UNIV_UNLIKELY(end_of_statement(trx))) {
+ return 1;
+ }
}
if (thd_sql_command(thd) != SQLCOM_XA_PREPARE
@@ -17413,16 +17394,11 @@ static
void
innodb_buffer_pool_size_update(THD*,st_mysql_sys_var*,void*, const void* save)
{
- longlong in_val = *static_cast<const longlong*>(save);
-
snprintf(export_vars.innodb_buffer_pool_resize_status,
sizeof(export_vars.innodb_buffer_pool_resize_status),
- "Requested to resize buffer pool.");
+ "Buffer pool resize requested");
buf_resize_start();
-
- ib::info() << export_vars.innodb_buffer_pool_resize_status
- << " (new size: " << in_val << " bytes)";
}
/** The latest assigned innodb_ft_aux_table name */
@@ -18323,31 +18299,22 @@ static my_bool innodb_buf_flush_list_now = TRUE;
static uint innodb_merge_threshold_set_all_debug
= DICT_INDEX_MERGE_THRESHOLD_DEFAULT;
-/****************************************************************//**
-Force innodb to checkpoint. */
+/** Force an InnoDB log checkpoint. */
static
void
-checkpoint_now_set(THD*, st_mysql_sys_var*, void*, const void* save)
+checkpoint_now_set(THD*, st_mysql_sys_var*, void*, const void *save)
{
- if (*(my_bool*) save) {
- mysql_mutex_unlock(&LOCK_global_system_variables);
-
- lsn_t lsn;
-
- while (log_sys.last_checkpoint_lsn.load(
- std::memory_order_acquire)
- + SIZE_OF_FILE_CHECKPOINT
- < (lsn= log_sys.get_lsn(std::memory_order_acquire))) {
- log_make_checkpoint();
- log_sys.log.flush();
- }
-
- if (dberr_t err = fil_write_flushed_lsn(lsn)) {
- ib::warn() << "Checkpoint set failed " << err;
- }
+ if (!*static_cast<const my_bool*>(save))
+ return;
+ const auto size= log_sys.is_encrypted()
+ ? SIZE_OF_FILE_CHECKPOINT + 8 : SIZE_OF_FILE_CHECKPOINT;
+ mysql_mutex_unlock(&LOCK_global_system_variables);
+ lsn_t lsn;
+ while (log_sys.last_checkpoint_lsn.load(std::memory_order_acquire) + size <
+ (lsn= log_sys.get_lsn(std::memory_order_acquire)))
+ log_make_checkpoint();
- mysql_mutex_lock(&LOCK_global_system_variables);
- }
+ mysql_mutex_lock(&LOCK_global_system_variables);
}
/****************************************************************//**
@@ -18494,50 +18461,15 @@ buffer_pool_load_abort(
}
}
-/****************************************************************//**
-Update the system variable innodb_log_write_ahead_size using the "saved"
-value. This function is registered as a callback with MySQL. */
-static
-void
-innodb_log_write_ahead_size_update(
-/*===============================*/
- THD* thd, /*!< in: thread handle */
- st_mysql_sys_var*, void*,
- const void* save) /*!< in: immediate result
- from check function */
+#if defined __linux__ || defined _WIN32
+static void innodb_log_file_buffering_update(THD *thd, st_mysql_sys_var*,
+ void *, const void *save)
{
- ulong val = OS_FILE_LOG_BLOCK_SIZE;
- ulong in_val = *static_cast<const ulong*>(save);
-
- while (val < in_val) {
- val = val * 2;
- }
-
- if (val > srv_page_size) {
- val = srv_page_size;
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_WRONG_ARGUMENTS,
- "innodb_log_write_ahead_size cannot"
- " be set higher than innodb_page_size.");
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_WRONG_ARGUMENTS,
- "Setting innodb_log_write_ahead_size"
- " to %lu",
- srv_page_size);
- } else if (val != in_val) {
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_WRONG_ARGUMENTS,
- "innodb_log_write_ahead_size should be"
- " set 2^n value and larger than 512.");
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_WRONG_ARGUMENTS,
- "Setting innodb_log_write_ahead_size"
- " to %lu",
- val);
- }
-
- srv_log_write_ahead_size = val;
+ mysql_mutex_unlock(&LOCK_global_system_variables);
+ log_sys.set_buffered(*static_cast<const my_bool*>(save));
+ mysql_mutex_lock(&LOCK_global_system_variables);
}
+#endif
/** Update innodb_status_output or innodb_status_output_locks,
which control InnoDB "status monitor" output to the error log.
@@ -18779,7 +18711,7 @@ innobase_wsrep_set_checkpoint(
if (wsrep_is_wsrep_xid(xid)) {
trx_rseg_update_wsrep_checkpoint(xid);
- innobase_flush_logs(hton, false);
+ log_buffer_flush_to_disk(srv_flush_log_at_trx_commit == 1);
return 0;
} else {
return 1;
@@ -18899,10 +18831,23 @@ static MYSQL_SYSVAR_ULONG(purge_batch_size, srv_purge_batch_size,
1, /* Minimum value */
5000, 0); /* Maximum value */
+extern void srv_update_purge_thread_count(uint n);
+
+static
+void
+innodb_purge_threads_update(THD*, struct st_mysql_sys_var*, void*, const void*save )
+{
+ srv_update_purge_thread_count(*static_cast<const uint*>(save));
+}
+
static MYSQL_SYSVAR_UINT(purge_threads, srv_n_purge_threads,
- PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY,
+ PLUGIN_VAR_OPCMDARG,
"Number of tasks for purging transaction history",
- NULL, NULL, 4, 1, innodb_purge_threads_MAX, 0);
+ NULL, innodb_purge_threads_update,
+ 4, /* Default setting */
+ 1, /* Minimum value */
+ innodb_purge_threads_MAX, /* Maximum value */
+ 0);
static MYSQL_SYSVAR_UINT(fast_shutdown, srv_fast_shutdown,
PLUGIN_VAR_OPCMDARG,
@@ -18949,7 +18894,7 @@ static MYSQL_SYSVAR_ENUM(flush_method, srv_file_flush_method,
static MYSQL_SYSVAR_STR(log_group_home_dir, srv_log_group_home_dir,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
- "Path to InnoDB log files.", NULL, NULL, NULL);
+ "Path to ib_logfile0", NULL, NULL, NULL);
static MYSQL_SYSVAR_DOUBLE(max_dirty_pages_pct, srv_max_buf_pool_modified_pct,
PLUGIN_VAR_RQCMDARG,
@@ -19084,13 +19029,13 @@ static MYSQL_SYSVAR_UINT(autoextend_increment,
"Data file autoextend increment in megabytes",
NULL, NULL, 64, 1, 1000, 0);
-static MYSQL_SYSVAR_ULONG(buffer_pool_chunk_size, srv_buf_pool_chunk_unit,
+static MYSQL_SYSVAR_SIZE_T(buffer_pool_chunk_size, srv_buf_pool_chunk_unit,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"Size of a single memory chunk"
- " for resizing buffer pool. Online buffer pool resizing happens"
- " at this granularity. 0 means disable resizing buffer pool.",
+ " for resizing buffer pool. Online buffer pool resizing happens at this"
+ " granularity. 0 means autosize this variable based on buffer pool size.",
NULL, NULL,
- 128 * 1024 * 1024, 1024 * 1024, LONG_MAX, 1024 * 1024);
+ 0, 0, SIZE_T_MAX, 1024 * 1024);
static MYSQL_SYSVAR_STR(buffer_pool_filename, srv_buf_dump_filename,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC,
@@ -19336,23 +19281,22 @@ static MYSQL_SYSVAR_ULONG(page_size, srv_page_size,
NULL, NULL, UNIV_PAGE_SIZE_DEF,
UNIV_PAGE_SIZE_MIN, UNIV_PAGE_SIZE_MAX, 0);
-static MYSQL_SYSVAR_ULONG(log_buffer_size, srv_log_buffer_size,
+static MYSQL_SYSVAR_SIZE_T(log_buffer_size, log_sys.buf_size,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
- "The size of the buffer which InnoDB uses to write log to the log files on disk.",
- NULL, NULL, 16L << 20, 256L << 10, LONG_MAX, 1024);
+ "Redo log buffer size in bytes.",
+ NULL, NULL, 16U << 20, 2U << 20, SIZE_T_MAX, 4096);
+
+#if defined __linux__ || defined _WIN32
+static MYSQL_SYSVAR_BOOL(log_file_buffering, log_sys.log_buffered,
+ PLUGIN_VAR_OPCMDARG,
+ "Whether the file system cache for ib_logfile0 is enabled",
+ nullptr, innodb_log_file_buffering_update, FALSE);
+#endif
static MYSQL_SYSVAR_ULONGLONG(log_file_size, srv_log_file_size,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
- "Size of each log file in a log group.",
- NULL, NULL, 96 << 20, 1 << 20, std::numeric_limits<ulonglong>::max(),
- UNIV_PAGE_SIZE_MAX);
-
-static MYSQL_SYSVAR_ULONG(log_write_ahead_size, srv_log_write_ahead_size,
- PLUGIN_VAR_RQCMDARG,
- "Redo log write ahead unit size to avoid read-on-write,"
- " it should match the OS cache block IO size",
- NULL, innodb_log_write_ahead_size_update,
- 8*1024L, OS_FILE_LOG_BLOCK_SIZE, UNIV_PAGE_SIZE_DEF, OS_FILE_LOG_BLOCK_SIZE);
+ "Redo log size in bytes.",
+ NULL, NULL, 96 << 20, 4 << 20, std::numeric_limits<ulonglong>::max(), 4096);
static MYSQL_SYSVAR_UINT(old_blocks_pct, innobase_old_blocks_pct,
PLUGIN_VAR_RQCMDARG,
@@ -19402,7 +19346,7 @@ static MYSQL_SYSVAR_STR(undo_directory, srv_undo_dir,
"Directory where undo tablespace files live, this path can be absolute.",
NULL, NULL, NULL);
-static MYSQL_SYSVAR_ULONG(undo_tablespaces, srv_undo_tablespaces,
+static MYSQL_SYSVAR_UINT(undo_tablespaces, srv_undo_tablespaces,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"Number of undo tablespaces to use.",
NULL, NULL,
@@ -19667,7 +19611,7 @@ static MYSQL_SYSVAR_BOOL(force_primary_key,
"Do not allow creating a table without primary key (off by default)",
NULL, NULL, FALSE);
-static const char *page_compression_algorithms[]= { "none", "zlib", "lz4", "lzo", "lzma", "bzip2", "snappy", 0 };
+const char *page_compression_algorithms[]= { "none", "zlib", "lz4", "lzo", "lzma", "bzip2", "snappy", 0 };
static TYPELIB page_compression_algorithms_typelib=
{
array_elements(page_compression_algorithms) - 1, 0,
@@ -19803,8 +19747,10 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
MYSQL_SYSVAR(deadlock_report),
MYSQL_SYSVAR(page_size),
MYSQL_SYSVAR(log_buffer_size),
+#if defined __linux__ || defined _WIN32
+ MYSQL_SYSVAR(log_file_buffering),
+#endif
MYSQL_SYSVAR(log_file_size),
- MYSQL_SYSVAR(log_write_ahead_size),
MYSQL_SYSVAR(log_group_home_dir),
MYSQL_SYSVAR(max_dirty_pages_pct),
MYSQL_SYSVAR(max_dirty_pages_pct_lwm),
@@ -20931,7 +20877,7 @@ innodb_buffer_pool_size_validate(
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_WRONG_ARGUMENTS,
"innodb_buffer_pool_size must be at least"
- " innodb_buffer_pool_chunk_size=%lu",
+ " innodb_buffer_pool_chunk_size=%zu",
srv_buf_pool_chunk_unit);
/* nothing to do */
return(0);
@@ -20968,70 +20914,14 @@ innodb_compression_algorithm_validate(
for update function */
struct st_mysql_value* value) /*!< in: incoming string */
{
- ulong compression_algorithm;
DBUG_ENTER("innobase_compression_algorithm_validate");
if (check_sysvar_enum(thd, var, save, value)) {
DBUG_RETURN(1);
}
- compression_algorithm = *reinterpret_cast<ulong*>(save);
- (void)compression_algorithm;
-
-#ifndef HAVE_LZ4
- if (compression_algorithm == PAGE_LZ4_ALGORITHM) {
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- HA_ERR_UNSUPPORTED,
- "InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: liblz4 is not installed. \n",
- compression_algorithm);
- DBUG_RETURN(1);
- }
-#endif
-
-#ifndef HAVE_LZO
- if (compression_algorithm == PAGE_LZO_ALGORITHM) {
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- HA_ERR_UNSUPPORTED,
- "InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: liblzo is not installed. \n",
- compression_algorithm);
- DBUG_RETURN(1);
- }
-#endif
-
-#ifndef HAVE_LZMA
- if (compression_algorithm == PAGE_LZMA_ALGORITHM) {
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- HA_ERR_UNSUPPORTED,
- "InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: liblzma is not installed. \n",
- compression_algorithm);
- DBUG_RETURN(1);
- }
-#endif
-
-#ifndef HAVE_BZIP2
- if (compression_algorithm == PAGE_BZIP2_ALGORITHM) {
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- HA_ERR_UNSUPPORTED,
- "InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: libbz2 is not installed. \n",
- compression_algorithm);
- DBUG_RETURN(1);
- }
-#endif
-
-#ifndef HAVE_SNAPPY
- if (compression_algorithm == PAGE_SNAPPY_ALGORITHM) {
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- HA_ERR_UNSUPPORTED,
- "InnoDB: innodb_compression_algorithm = %lu unsupported.\n"
- "InnoDB: libsnappy is not installed. \n",
- compression_algorithm);
- DBUG_RETURN(1);
- }
-#endif
+ if (compression_algorithm_is_not_loaded(*(ulong*)save, ME_WARNING))
+ DBUG_RETURN(1);
DBUG_RETURN(0);
}
@@ -21332,12 +21222,12 @@ ulint
buf_pool_size_align(
ulint size)
{
- const ulong m = srv_buf_pool_chunk_unit;
- size = ut_max((size_t) size, (size_t) MYSQL_SYSVAR_NAME(buffer_pool_size).min_val);
+ const size_t m = srv_buf_pool_chunk_unit;
+ size = ut_max(size, (size_t) MYSQL_SYSVAR_NAME(buffer_pool_size).min_val);
if (size % m == 0) {
return(size);
} else {
- return (ulint)((size / m + 1) * m);
+ return (size / m + 1) * m;
}
}
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index 7e4beeede3b..5825b4ae78a 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -3816,6 +3816,8 @@ innobase_create_index_field_def(
index_field->col_no = key_part->fieldnr - num_v;
}
+ index_field->descending= !!(key_part->key_part_flag & HA_REVERSE_SORT);
+
if (DATA_LARGE_MTYPE(col_type)
|| (key_part->length < field->pack_length()
&& field->type() != MYSQL_TYPE_VARCHAR)
@@ -3917,6 +3919,7 @@ innobase_create_index_def(
index->fields[0].col_no = key->key_part[0].fieldnr - num_v;
index->fields[0].prefix_len = 0;
index->fields[0].is_v_col = false;
+ index->fields[0].descending = false;
/* Currently, the spatial index cannot be created
on virtual columns. It is blocked in the SQL layer. */
@@ -3974,6 +3977,8 @@ innobase_fts_check_doc_id_index(
if ((key.flags & HA_NOSAME)
&& key.user_defined_key_parts == fts_n_uniq
+ && !(key.key_part[0].key_part_flag
+ & HA_REVERSE_SORT)
&& !strcmp(key.name.str, FTS_DOC_ID_INDEX_NAME)
&& !strcmp(key.key_part[0].field->field_name.str,
FTS_DOC_ID_COL_NAME)) {
@@ -4014,6 +4019,7 @@ innobase_fts_check_doc_id_index(
/* The column would be of a BIGINT data type */
if (strcmp(field->name, FTS_DOC_ID_COL_NAME) == 0
+ && !field->descending
&& field->col->mtype == DATA_INT
&& field->col->len == 8
&& field->col->prtype & DATA_NOT_NULL
@@ -4056,6 +4062,7 @@ innobase_fts_check_doc_id_index_in_def(
named as "FTS_DOC_ID_INDEX" and on column "FTS_DOC_ID" */
if (!(key->flags & HA_NOSAME)
|| key->user_defined_key_parts != fts_n_uniq
+ || (key->key_part[0].key_part_flag & HA_REVERSE_SORT)
|| strcmp(key->name.str, FTS_DOC_ID_INDEX_NAME)
|| strcmp(key->key_part[0].field->field_name.str,
FTS_DOC_ID_COL_NAME)) {
@@ -4256,11 +4263,13 @@ created_clustered:
index->n_fields = nfields;
index->fields[0].col_no = fts_doc_id_col;
index->fields[0].prefix_len = 0;
+ index->fields[0].descending = false;
index->fields[0].is_v_col = false;
if (nfields == 2) {
index->fields[1].col_no
= altered_table->s->vers.end_fieldno;
index->fields[1].prefix_len = 0;
+ index->fields[1].descending = false;
index->fields[1].is_v_col = false;
}
index->ind_type = DICT_UNIQUE;
@@ -4871,7 +4880,8 @@ columns are removed from the PK;
(3) Changing the order of existing PK columns;
(4) Decreasing the prefix length just like removing existing PK columns
follows rule(1), Increasing the prefix length just like adding existing
-PK columns follows rule(2).
+PK columns follows rule(2);
+(5) Changing the ASC/DESC attribute of the existing PK columns.
@param[in] col_map mapping of old column numbers to new ones
@param[in] ha_alter_info Data used during in-place alter
@param[in] old_clust_index index to be compared
@@ -4964,10 +4974,16 @@ innobase_pk_order_preserved(
continue;
}
+ const dict_field_t &of = old_clust_index->fields[old_field];
+ const dict_field_t &nf = new_clust_index->fields[new_field];
+
+ if (of.descending != nf.descending) {
+ return false;
+ }
+
/* Check prefix length change. */
const lint prefix_change = innobase_pk_col_prefix_compare(
- new_clust_index->fields[new_field].prefix_len,
- old_clust_index->fields[old_field].prefix_len);
+ nf.prefix_len, of.prefix_len);
if (prefix_change < 0) {
/* If a column's prefix length is decreased, it should
@@ -9172,7 +9188,7 @@ innobase_rename_column_try(
const char* to)
{
dberr_t error;
- bool clust_has_prefixes = false;
+ bool clust_has_wide_format = false;
DBUG_ENTER("innobase_rename_column_try");
@@ -9193,10 +9209,11 @@ innobase_rename_column_try(
index != NULL;
index = dict_table_get_next_index(index)) {
- bool has_prefixes = false;
+ bool wide_format = false;
for (size_t i = 0; i < dict_index_get_n_fields(index); i++) {
- if (dict_index_get_nth_field(index, i)->prefix_len) {
- has_prefixes = true;
+ dict_field_t* field= dict_index_get_nth_field(index, i);
+ if (field->prefix_len || field->descending) {
+ wide_format = true;
break;
}
}
@@ -9211,8 +9228,10 @@ innobase_rename_column_try(
}
pars_info_t* info = pars_info_create();
- ulint pos = has_prefixes ? i << 16 | f.prefix_len : i;
-
+ ulint pos = wide_format
+ ? i << 16 | f.prefix_len
+ | !!f.descending << 15
+ : i;
pars_info_add_ull_literal(info, "indexid", index->id);
pars_info_add_int4_literal(info, "nth", pos);
pars_info_add_str_literal(info, "new", to);
@@ -9232,15 +9251,16 @@ innobase_rename_column_try(
goto err_exit;
}
- if (!has_prefixes || !clust_has_prefixes
- || f.prefix_len) {
+ if (!wide_format || !clust_has_wide_format
+ || f.prefix_len || f.descending) {
continue;
}
/* For secondary indexes, the
- has_prefixes check can be 'polluted'
- by PRIMARY KEY column prefix. Try also
- the simpler encoding of SYS_FIELDS.POS. */
+ wide_format check can be 'polluted'
+ by PRIMARY KEY column prefix or descending
+ field. Try also the simpler encoding
+ of SYS_FIELDS.POS. */
info = pars_info_create();
pars_info_add_ull_literal(info, "indexid", index->id);
@@ -9262,7 +9282,7 @@ innobase_rename_column_try(
}
if (index == dict_table_get_first_index(ctx.old_table)) {
- clust_has_prefixes = has_prefixes;
+ clust_has_wide_format = wide_format;
}
}
@@ -10690,8 +10710,8 @@ commit_cache_norebuild(
space->flags
|= FSP_FLAGS_MASK_PAGE_COMPRESSION;
} else if (!space->is_compressed()) {
- space->flags
- |= innodb_compression_algorithm
+ space->flags |= static_cast<uint32_t>(
+ innodb_compression_algorithm)
<< FSP_FLAGS_FCRC32_POS_COMPRESSED_ALGO;
}
mysql_mutex_unlock(&fil_system.mutex);
diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc
index 366ef38cc07..bf6788def9d 100644
--- a/storage/innobase/handler/i_s.cc
+++ b/storage/innobase/handler/i_s.cc
@@ -6439,7 +6439,7 @@ static int i_s_sys_tablespaces_fill(THD *thd, const fil_space_t &s, TABLE *t)
else if (srv_is_undo_tablespace(s.id))
{
char name[15];
- snprintf(name, sizeof name, "innodb_undo%03zu",
+ snprintf(name, sizeof name, "innodb_undo%03u",
(s.id - srv_undo_space_id_start + 1));
OK(f->store(name, strlen(name), system_charset_info));
} else f->set_notnull();
@@ -6660,8 +6660,8 @@ i_s_dict_fill_tablespaces_encryption(
fields[TABLESPACES_ENCRYPTION_NAME]->set_notnull();
} else if (srv_is_undo_tablespace(space->id)) {
char undo_name[sizeof "innodb_undo000"];
- snprintf(undo_name, sizeof(undo_name),
- "innodb_undo%03zu",space->id);
+ snprintf(undo_name, sizeof undo_name,
+ "innodb_undo%03" PRIu32, space->id);
OK(fields[TABLESPACES_ENCRYPTION_NAME]->store(
undo_name, strlen(undo_name),
system_charset_info));
diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc
index 2cdbbd88330..c582b56a1fd 100644
--- a/storage/innobase/ibuf/ibuf0ibuf.cc
+++ b/storage/innobase/ibuf/ibuf0ibuf.cc
@@ -1648,6 +1648,7 @@ ibuf_entry_build(
dfield_copy(field, entry_field);
ifield = dict_index_get_nth_field(index, i);
+ ut_ad(!ifield->descending);
/* Prefix index columns of fixed-length columns are of
fixed length. However, in the function call below,
dfield_get_type(entry_field) contains the fixed length
@@ -2348,7 +2349,7 @@ static void ibuf_read_merge_pages(const uint32_t* space_ids,
const uint32_t* page_nos, ulint n_stored)
{
for (ulint i = 0; i < n_stored; i++) {
- const ulint space_id = space_ids[i];
+ const uint32_t space_id = space_ids[i];
fil_space_t* s = fil_space_t::get(space_id);
if (!s) {
tablespace_deleted:
@@ -2584,7 +2585,7 @@ static bool ibuf_get_volume_buffered_hash(const rec_t *rec, ulint *hash,
ut_ad(rec_get_n_fields_old(rec) > IBUF_REC_FIELD_USER);
const ulint start= rec_get_field_start_offs(rec, IBUF_REC_FIELD_USER);
const ulint len= rec_get_data_size_old(rec) - start;
- const uint32_t fold= ut_crc32(rec + start, len);
+ const uint32_t fold= my_crc32c(0, rec + start, len);
hash+= (fold / (CHAR_BIT * sizeof *hash)) % size;
ulint bitmask= static_cast<ulint>(1) << (fold % (CHAR_BIT * sizeof(*hash)));
@@ -3506,7 +3507,7 @@ ibuf_insert(
ut_ad(dtuple_check_typed(entry));
ut_ad(page_id.space() != SRV_TMP_SPACE_ID);
-
+ ut_ad(index->is_btree());
ut_a(!dict_index_is_clust(index));
ut_ad(!index->table->is_temporary());
@@ -4425,7 +4426,7 @@ reset_bit:
/** Delete all change buffer entries for a tablespace,
in DISCARD TABLESPACE, IMPORT TABLESPACE, or read-ahead.
@param[in] space missing or to-be-discarded tablespace */
-void ibuf_delete_for_discarded_space(ulint space)
+void ibuf_delete_for_discarded_space(uint32_t space)
{
if (UNIV_UNLIKELY(!ibuf.index)) return;
diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h
index 94f8dc2badb..74905638698 100644
--- a/storage/innobase/include/buf0buf.h
+++ b/storage/innobase/include/buf0buf.h
@@ -321,16 +321,13 @@ buf_block_get_modify_clock(
bool buf_is_zeroes(st_::span<const byte> buf);
/** Check if a page is corrupt.
-@param[in] check_lsn whether the LSN should be checked
-@param[in] read_buf database page
-@param[in] fsp_flags tablespace flags
+@param check_lsn whether FIL_PAGE_LSN should be checked
+@param read_buf database page
+@param fsp_flags contents of FIL_SPACE_FLAGS
@return whether the page is corrupted */
-bool
-buf_page_is_corrupted(
- bool check_lsn,
- const byte* read_buf,
- ulint fsp_flags)
- MY_ATTRIBUTE((warn_unused_result));
+bool buf_page_is_corrupted(bool check_lsn, const byte *read_buf,
+ uint32_t fsp_flags)
+ MY_ATTRIBUTE((warn_unused_result));
/** Read the key version from the page. In full crc32 format,
key version is stored at {0-3th} bytes. In other format, it is
@@ -338,7 +335,8 @@ stored in 26th position.
@param[in] read_buf database page
@param[in] fsp_flags tablespace flags
@return key version of the page. */
-inline uint32_t buf_page_get_key_version(const byte* read_buf, ulint fsp_flags)
+inline uint32_t buf_page_get_key_version(const byte* read_buf,
+ uint32_t fsp_flags)
{
static_assert(FIL_PAGE_FCRC32_KEY_VERSION == 0, "compatibility");
return fil_space_t::full_crc32(fsp_flags)
@@ -353,7 +351,7 @@ stored in page type.
@param[in] read_buf database page
@param[in] fsp_flags tablespace flags
@return true if page is compressed. */
-inline bool buf_page_is_compressed(const byte* read_buf, ulint fsp_flags)
+inline bool buf_page_is_compressed(const byte* read_buf, uint32_t fsp_flags)
{
uint16_t page_type= fil_page_get_type(read_buf);
return fil_space_t::full_crc32(fsp_flags)
@@ -456,12 +454,10 @@ buf_pool_size_align(
/** Verify that post encryption checksum match with the calculated checksum.
This function should be called only if tablespace contains crypt data metadata.
-@param[in] page page frame
-@param[in] fsp_flags tablespace flags
-@return true if page is encrypted and OK, false otherwise */
-bool buf_page_verify_crypt_checksum(
- const byte* page,
- ulint fsp_flags);
+@param page page frame
+@param fsp_flags contents of FSP_SPACE_FLAGS
+@return whether the page is encrypted and valid */
+bool buf_page_verify_crypt_checksum(const byte *page, uint32_t fsp_flags);
/** Calculate a ROW_FORMAT=COMPRESSED page checksum and update the page.
@param[in,out] page page to update
@@ -1723,6 +1719,12 @@ public:
/** possibly modified persistent pages (a subset of LRU);
buf_dblwr.pending_writes() is approximately COUNT(is_write_fixed()) */
UT_LIST_BASE_NODE_T(buf_page_t) flush_list;
+ /** number of blocks ever added to flush_list;
+ sometimes protected by flush_list_mutex */
+ size_t flush_list_requests;
+
+ TPOOL_SUPPRESS_TSAN void add_flush_list_requests(size_t size)
+ { ut_ad(size); flush_list_requests+= size; }
private:
static constexpr unsigned PAGE_CLEANER_IDLE= 1;
static constexpr unsigned FLUSH_LIST_ACTIVE= 2;
@@ -1773,7 +1775,7 @@ public:
}
/** @return whether the page cleaner must sleep due to being idle */
- bool page_cleaner_idle() const
+ bool page_cleaner_idle() const noexcept
{
mysql_mutex_assert_owner(&flush_list_mutex);
return page_cleaner_status & PAGE_CLEANER_IDLE;
@@ -1886,21 +1888,24 @@ public:
return any_pending;
}
-private:
- /** Remove a block from the flush list. */
- inline void delete_from_flush_list_low(buf_page_t *bpage);
-public:
/** Remove a block from flush_list.
@param bpage buffer pool page */
- void delete_from_flush_list(buf_page_t *bpage);
+ void delete_from_flush_list(buf_page_t *bpage) noexcept;
+
+ /** Prepare to insert a modified blcok into flush_list.
+ @param lsn start LSN of the mini-transaction
+ @return insert position for insert_into_flush_list() */
+ inline buf_page_t *prepare_insert_into_flush_list(lsn_t lsn) noexcept;
/** Insert a modified block into the flush list.
+ @param prev insert position (from prepare_insert_into_flush_list())
@param block modified block
@param lsn start LSN of the mini-transaction that modified the block */
- void insert_into_flush_list(buf_block_t *block, lsn_t lsn);
+ inline void insert_into_flush_list(buf_page_t *prev, buf_block_t *block,
+ lsn_t lsn) noexcept;
/** Free a page whose underlying file page has been freed. */
- ATTRIBUTE_COLD void release_freed_page(buf_page_t *bpage);
+ ATTRIBUTE_COLD void release_freed_page(buf_page_t *bpage) noexcept;
private:
/** Temporary memory for page_compressed and encrypted I/O */
diff --git a/storage/innobase/include/buf0buf.inl b/storage/innobase/include/buf0buf.inl
index 3c4da98f83b..4516a24803c 100644
--- a/storage/innobase/include/buf0buf.inl
+++ b/storage/innobase/include/buf0buf.inl
@@ -2,7 +2,7 @@
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc.
-Copyright (c) 2014, 2021, MariaDB Corporation.
+Copyright (c) 2014, 2022, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
@@ -141,4 +141,3 @@ buf_block_get_modify_clock(
ut_ad(block->page.lock.have_any());
return(block->modify_clock);
}
-
diff --git a/storage/innobase/include/buf0flu.h b/storage/innobase/include/buf0flu.h
index 13a9363922b..31fe4446681 100644
--- a/storage/innobase/include/buf0flu.h
+++ b/storage/innobase/include/buf0flu.h
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2014, 2021, MariaDB Corporation.
+Copyright (c) 2014, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -44,7 +44,7 @@ deleting the data file of that tablespace.
The pages still remain a part of LRU and are evicted from
the list as they age towards the tail of the LRU.
@param id tablespace identifier */
-void buf_flush_remove_pages(ulint id);
+void buf_flush_remove_pages(uint32_t id);
/*******************************************************************//**
Relocates a buffer control block on the flush_list.
@@ -104,31 +104,6 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn);
@param furious true=furious flushing, false=limit to innodb_io_capacity */
ATTRIBUTE_COLD void buf_flush_ahead(lsn_t lsn, bool furious);
-/********************************************************************//**
-This function should be called at a mini-transaction commit, if a page was
-modified in it. Puts the block to the list of modified blocks, if it not
-already in it. */
-inline void buf_flush_note_modification(buf_block_t *b, lsn_t start, lsn_t end)
-{
- ut_ad(!srv_read_only_mode);
- ut_d(const auto s= b->page.state());
- ut_ad(s > buf_page_t::FREED);
- ut_ad(s < buf_page_t::READ_FIX);
- ut_ad(mach_read_from_8(b->page.frame + FIL_PAGE_LSN) <= end);
- mach_write_to_8(b->page.frame + FIL_PAGE_LSN, end);
- if (UNIV_LIKELY_NULL(b->page.zip.data))
- memcpy_aligned<8>(FIL_PAGE_LSN + b->page.zip.data,
- FIL_PAGE_LSN + b->page.frame, 8);
-
- const lsn_t oldest_modification= b->page.oldest_modification();
-
- if (oldest_modification > 1)
- ut_ad(oldest_modification <= start);
- else
- buf_pool.insert_into_flush_list(b, start);
- srv_stats.buf_pool_write_requests.inc();
-}
-
/** Initialize page_cleaner. */
ATTRIBUTE_COLD void buf_flush_page_cleaner_init();
diff --git a/storage/innobase/include/buf0rea.h b/storage/innobase/include/buf0rea.h
index d898c5efc63..4ec8938c689 100644
--- a/storage/innobase/include/buf0rea.h
+++ b/storage/innobase/include/buf0rea.h
@@ -102,12 +102,10 @@ which could result in a deadlock if the OS does not support asynchronous io.
ulint
buf_read_ahead_linear(const page_id_t page_id, ulint zip_size, bool ibuf);
-/** Issues read requests for pages which recovery wants to read in.
-@param[in] space_id tablespace id
-@param[in] page_nos array of page numbers to read, with the
-highest page number the last in the array
-@param[in] n number of page numbers in the array */
-void buf_read_recv_pages(ulint space_id, const uint32_t* page_nos, ulint n);
+/** Issue read requests for pages that need to be recovered.
+@param space_id tablespace identifier
+@param page_nos page numbers to read, in ascending order */
+void buf_read_recv_pages(uint32_t space_id, st_::span<uint32_t> page_nos);
/** @name Modes used in read-ahead @{ */
/** read only pages belonging to the insert buffer tree */
diff --git a/storage/innobase/include/buf0types.h b/storage/innobase/include/buf0types.h
index c69c07d66e1..6c13f5ee308 100644
--- a/storage/innobase/include/buf0types.h
+++ b/storage/innobase/include/buf0types.h
@@ -90,9 +90,9 @@ class page_id_t
{
public:
/** Constructor from (space, page_no).
- @param[in] space tablespace id
- @param[in] page_no page number */
- constexpr page_id_t(ulint space, uint32_t page_no) :
+ @param space tablespace id
+ @param page_no page number */
+ constexpr page_id_t(uint32_t space, uint32_t page_no) :
m_id(uint64_t{space} << 32 | page_no) {}
constexpr page_id_t(uint64_t id) : m_id(id) {}
diff --git a/storage/innobase/include/data0data.h b/storage/innobase/include/data0data.h
index 5eaad5bf552..a5356e0d1a3 100644
--- a/storage/innobase/include/data0data.h
+++ b/storage/innobase/include/data0data.h
@@ -316,16 +316,6 @@ dtuple_get_n_ext(
/*=============*/
const dtuple_t* tuple) /*!< in: tuple */
MY_ATTRIBUTE((nonnull));
-/** Compare two data tuples.
-@param[in] tuple1 first data tuple
-@param[in] tuple2 second data tuple
-@return positive, 0, negative if tuple1 is greater, equal, less, than tuple2,
-respectively */
-int
-dtuple_coll_cmp(
- const dtuple_t* tuple1,
- const dtuple_t* tuple2)
- MY_ATTRIBUTE((warn_unused_result));
/** Fold a prefix given as the number of fields of a tuple.
@param[in] tuple index record
@param[in] n_fields number of complete fields to fold
diff --git a/storage/innobase/include/dict0boot.h b/storage/innobase/include/dict0boot.h
index 3e14e0ace69..a65287476ef 100644
--- a/storage/innobase/include/dict0boot.h
+++ b/storage/innobase/include/dict0boot.h
@@ -42,7 +42,7 @@ dict_hdr_get_new_id(
(not assigned if NULL) */
index_id_t* index_id, /*!< out: index id
(not assigned if NULL) */
- ulint* space_id); /*!< out: space id
+ uint32_t* space_id); /*!< out: space id
(not assigned if NULL) */
/** Update dict_sys.row_id in the dictionary header file page. */
void dict_hdr_flush_row_id(row_id_t id);
diff --git a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h
index e54a138cc02..8daa07160a3 100644
--- a/storage/innobase/include/dict0dict.h
+++ b/storage/innobase/include/dict0dict.h
@@ -847,11 +847,8 @@ fil_space_t::flags | 0 | 0 | 1 | 1
==================================================================
@param[in] table_flags dict_table_t::flags
@return tablespace flags (fil_space_t::flags) */
-UNIV_INLINE
-ulint
-dict_tf_to_fsp_flags(ulint table_flags)
- MY_ATTRIBUTE((const));
-
+inline uint32_t dict_tf_to_fsp_flags(unsigned table_flags)
+ MY_ATTRIBUTE((const));
/** Extract the ROW_FORMAT=COMPRESSED page size from table flags.
@param[in] flags flags
@@ -1076,16 +1073,16 @@ dict_table_get_nth_col_pos(
ulint n, /*!< in: column number */
ulint* prefix_col_pos) /*!< out: col num if prefix */
MY_ATTRIBUTE((nonnull(1), warn_unused_result));
-/*******************************************************************//**
-Adds a column to index. */
-void
-dict_index_add_col(
-/*===============*/
- dict_index_t* index, /*!< in/out: index */
- const dict_table_t* table, /*!< in: table */
- dict_col_t* col, /*!< in: column */
- ulint prefix_len) /*!< in: column prefix length */
- MY_ATTRIBUTE((nonnull));
+/** Add a column to an index.
+@param index index
+@param table table
+@param col column
+@param prefix_len column prefix length
+@param descending whether to use descending order */
+void dict_index_add_col(dict_index_t *index, const dict_table_t *table,
+ dict_col_t *col, ulint prefix_len,
+ bool descending= false)
+ MY_ATTRIBUTE((nonnull));
/*******************************************************************//**
Copies types of fields contained in index to tuple. */
diff --git a/storage/innobase/include/dict0dict.inl b/storage/innobase/include/dict0dict.inl
index a210c839020..4cc3eae96ab 100644
--- a/storage/innobase/include/dict0dict.inl
+++ b/storage/innobase/include/dict0dict.inl
@@ -618,19 +618,16 @@ fil_space_t::flags | 0 | 0 | 1 | 1
==================================================================
@param[in] table_flags dict_table_t::flags
@return tablespace flags (fil_space_t::flags) */
-UNIV_INLINE
-ulint
-dict_tf_to_fsp_flags(ulint table_flags)
+inline uint32_t dict_tf_to_fsp_flags(unsigned table_flags)
{
- ulint fsp_flags;
- ulint page_compression_level = DICT_TF_GET_PAGE_COMPRESSION_LEVEL(
+ uint32_t fsp_flags;
+ uint32_t page_compression_level = DICT_TF_GET_PAGE_COMPRESSION_LEVEL(
table_flags);
ut_ad((DICT_TF_GET_PAGE_COMPRESSION(table_flags) == 0)
== (page_compression_level == 0));
- DBUG_EXECUTE_IF("dict_tf_to_fsp_flags_failure",
- return(ULINT_UNDEFINED););
+ DBUG_EXECUTE_IF("dict_tf_to_fsp_flags_failure", return UINT32_MAX;);
/* No ROW_FORMAT=COMPRESSED for innodb_checksum_algorithm=full_crc32 */
if ((srv_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_FULL_CRC32
@@ -641,7 +638,8 @@ dict_tf_to_fsp_flags(ulint table_flags)
| FSP_FLAGS_FCRC32_PAGE_SSIZE();
if (page_compression_level) {
- fsp_flags |= innodb_compression_algorithm
+ fsp_flags |= static_cast<uint32_t>(
+ innodb_compression_algorithm)
<< FSP_FLAGS_FCRC32_POS_COMPRESSED_ALGO;
}
} else {
diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h
index c469b9da1c2..c76262ff5be 100644
--- a/storage/innobase/include/dict0mem.h
+++ b/storage/innobase/include/dict0mem.h
@@ -112,7 +112,7 @@ are described in fsp0fsp.h. */
/** This bitmask is used in SYS_TABLES.N_COLS to set and test whether
the Compact page format is used, i.e ROW_FORMAT != REDUNDANT */
-#define DICT_N_COLS_COMPACT 0x80000000UL
+constexpr uint32_t DICT_N_COLS_COMPACT= 1U << 31;
/** Width of the COMPACT flag */
#define DICT_TF_WIDTH_COMPACT 1
@@ -396,18 +396,7 @@ dict_mem_index_create(
ulint type, /*!< in: DICT_UNIQUE,
DICT_CLUSTERED, ... ORed */
ulint n_fields); /*!< in: number of fields */
-/**********************************************************************//**
-Adds a field definition to an index. NOTE: does not take a copy
-of the column name if the field is a column. The memory occupied
-by the column name may be released only after publishing the index. */
-void
-dict_mem_index_add_field(
-/*=====================*/
- dict_index_t* index, /*!< in: index */
- const char* name, /*!< in: column name */
- ulint prefix_len); /*!< in: 0 or the column prefix length
- in a MySQL index like
- INDEX (textcol(25)) */
+
/**********************************************************************//**
Frees an index memory object. */
void
@@ -886,9 +875,11 @@ struct dict_field_t{
unsigned fixed_len:10; /*!< 0 or the fixed length of the
column if smaller than
DICT_ANTELOPE_MAX_INDEX_COL_LEN */
+ /** 1=DESC, 0=ASC */
+ unsigned descending:1;
/** Zero-initialize all fields */
- dict_field_t() : col(NULL), name(NULL), prefix_len(0), fixed_len(0) {}
+ dict_field_t() { memset((void*) this, 0, sizeof *this); }
/** Check whether two index fields are equivalent.
@param[in] old the other index field
@@ -1475,6 +1466,21 @@ inline void dict_col_t::detach(const dict_index_t &index)
reinterpret_cast<dict_v_col_t*>(this)->detach(index);
}
+/** Add a field definition to an index.
+@param index index
+@param name pointer to column name
+@param prefix_len column prefix length, or 0
+@param descending whether to use descending order */
+inline void dict_mem_index_add_field(dict_index_t *index, const char *name,
+ ulint prefix_len, bool descending= false)
+{
+ ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
+ dict_field_t &field= index->fields[index->n_def++];
+ field.name= name;
+ field.prefix_len= prefix_len & ((1U << 12) - 1);
+ field.descending= descending;
+}
+
/** The status of online index creation */
enum online_index_status {
/** the index is complete and ready for access */
@@ -2090,7 +2096,7 @@ public:
/** The tablespace of the table */
fil_space_t* space;
/** Tablespace ID */
- ulint space_id;
+ uint32_t space_id;
/** Stores information about:
1 row format (redundant or compact),
@@ -2451,6 +2457,16 @@ public:
static dict_table_t *create(const span<const char> &name, fil_space_t *space,
ulint n_cols, ulint n_v_cols, ulint flags,
ulint flags2);
+
+ /** Check whether the table has any spatial indexes */
+ bool has_spatial_index() const
+ {
+ for (auto i= UT_LIST_GET_FIRST(indexes);
+ (i= UT_LIST_GET_NEXT(indexes, i)) != nullptr; )
+ if (i->is_spatial())
+ return true;
+ return false;
+ }
};
inline void dict_index_t::set_modified(mtr_t& mtr) const
diff --git a/storage/innobase/include/dyn0buf.h b/storage/innobase/include/dyn0buf.h
index 208e49c34a7..06af4dcca88 100644
--- a/storage/innobase/include/dyn0buf.h
+++ b/storage/innobase/include/dyn0buf.h
@@ -317,7 +317,7 @@ public:
Iterate over each block and call the functor.
@return false if iteration was terminated. */
template <typename Functor>
- bool for_each_block(Functor& functor) const
+ bool for_each_block(const Functor& functor) const
{
for (list_t::iterator it = m_list.begin(), end = m_list.end();
it != end; ++it) {
diff --git a/storage/innobase/include/fil0crypt.h b/storage/innobase/include/fil0crypt.h
index 26272761f43..f43965cd165 100644
--- a/storage/innobase/include/fil0crypt.h
+++ b/storage/innobase/include/fil0crypt.h
@@ -291,20 +291,20 @@ byte* fil_space_encrypt(
/** Decrypt a page.
@param]in] space_id space id
+@param[in] fsp_flags Tablespace flags
@param[in] crypt_data crypt_data
@param[in] tmp_frame Temporary buffer
@param[in] physical_size page size
-@param[in] fsp_flags Tablespace flags
@param[in,out] src_frame Page to decrypt
@retval DB_SUCCESS on success
@retval DB_DECRYPTION_FAILED on error */
dberr_t
fil_space_decrypt(
- ulint space_id,
+ uint32_t space_id,
+ uint32_t fsp_flags,
fil_space_crypt_t* crypt_data,
byte* tmp_frame,
ulint physical_size,
- ulint fsp_flags,
byte* src_frame);
/******************************************************************
diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h
index ff6ece8a360..483d594c6b9 100644
--- a/storage/innobase/include/fil0fil.h
+++ b/storage/innobase/include/fil0fil.h
@@ -42,7 +42,7 @@ Created 10/25/1995 Heikki Tuuri
#include <mutex>
struct unflushed_spaces_tag_t;
-struct rotation_list_tag_t;
+struct default_encrypt_tag_t;
struct space_list_tag_t;
struct named_spaces_tag_t;
@@ -81,14 +81,14 @@ enum srv_flush_t
extern ulong srv_file_flush_method;
/** Undo tablespaces starts with space_id. */
-extern ulint srv_undo_space_id_start;
+extern uint32_t srv_undo_space_id_start;
/** The number of UNDO tablespaces that are open and ready to use. */
-extern ulint srv_undo_tablespaces_open;
+extern uint32_t srv_undo_tablespaces_open;
/** Check whether given space id is undo tablespace id
@param[in] space_id space id to check
@return true if it is undo tablespace else false. */
-inline bool srv_is_undo_tablespace(ulint space_id)
+inline bool srv_is_undo_tablespace(uint32_t space_id)
{
return srv_undo_space_id_start > 0 &&
space_id >= srv_undo_space_id_start &&
@@ -335,7 +335,7 @@ enum fil_encryption_t
};
struct fil_space_t final : ilist_node<unflushed_spaces_tag_t>,
- ilist_node<rotation_list_tag_t>,
+ ilist_node<default_encrypt_tag_t>,
ilist_node<space_list_tag_t>,
ilist_node<named_spaces_tag_t>
#else
@@ -351,17 +351,14 @@ struct fil_space_t final
latch.destroy();
}
- ulint id; /*!< space id */
-
/** fil_system.spaces chain node */
fil_space_t *hash;
- lsn_t max_lsn;
- /*!< LSN of the most recent
- fil_names_write_if_was_clean().
- Reset to 0 by fil_names_clear().
- Protected by log_sys.mutex.
- If and only if this is nonzero, the
- tablespace will be in named_spaces. */
+ /** LSN of the most recent fil_names_write_if_was_clean().
+ Reset to 0 by fil_names_clear(). Protected by exclusive log_sys.latch.
+ If and only if max_lsn is nonzero, this is in fil_system.named_spaces. */
+ lsn_t max_lsn;
+ /** tablespace identifier */
+ uint32_t id;
/** whether undo tablespace truncation is in progress */
bool is_being_truncated;
fil_type_t purpose;/*!< purpose */
@@ -427,9 +424,10 @@ private:
/** Whether any corrupton of this tablespace has been reported */
mutable std::atomic_flag is_corrupted;
+public:
/** mutex to protect freed_ranges and last_freed_lsn */
std::mutex freed_range_mutex;
-
+private:
/** Ranges of freed page numbers; protected by freed_range_mutex */
range_set freed_ranges;
@@ -530,7 +528,7 @@ public:
@param id tablespace identifier
@return tablespace
@retval nullptr if no tablespace was found */
- static fil_space_t *check_pending_operations(ulint id);
+ static fil_space_t *check_pending_operations(uint32_t id);
private:
MY_ATTRIBUTE((warn_unused_result))
@@ -644,11 +642,7 @@ public:
/** @return last_freed_lsn */
lsn_t get_last_freed_lsn() { return last_freed_lsn; }
/** Update last_freed_lsn */
- void update_last_freed_lsn(lsn_t lsn)
- {
- std::lock_guard<std::mutex> freed_lock(freed_range_mutex);
- last_freed_lsn= lsn;
- }
+ void update_last_freed_lsn(lsn_t lsn) { last_freed_lsn= lsn; }
/** Note that the file will need fsync().
@return whether this needs to be added to fil_system.unflushed_spaces */
@@ -669,98 +663,80 @@ public:
/** Clear all freed ranges for undo tablespace when InnoDB
encounters TRIM redo log record */
- void clear_freed_ranges()
+ void clear_freed_ranges() { freed_ranges.clear(); }
+#endif /* !UNIV_INNOCHECKSUM */
+ /** FSP_SPACE_FLAGS and FSP_FLAGS_MEM_ flags;
+ check fsp0types.h to more info about flags. */
+ uint32_t flags;
+
+ /** Determine if full_crc32 is used for a data file
+ @param[in] flags tablespace flags (FSP_SPACE_FLAGS)
+ @return whether the full_crc32 algorithm is active */
+ static bool full_crc32(uint32_t flags)
+ { return flags & FSP_FLAGS_FCRC32_MASK_MARKER; }
+ /** @return whether innodb_checksum_algorithm=full_crc32 is active */
+ bool full_crc32() const { return full_crc32(flags); }
+ /** Determine if full_crc32 is used along with PAGE_COMPRESSED */
+ static bool is_full_crc32_compressed(uint32_t flags)
{
- std::lock_guard<std::mutex> freed_lock(freed_range_mutex);
- freed_ranges.clear();
+ if (!full_crc32(flags))
+ return false;
+ auto algo= FSP_FLAGS_FCRC32_GET_COMPRESSED_ALGO(flags);
+ DBUG_ASSERT(algo <= PAGE_ALGORITHM_LAST);
+ return algo != 0;
}
-#endif /* !UNIV_INNOCHECKSUM */
- /** FSP_SPACE_FLAGS and FSP_FLAGS_MEM_ flags;
- check fsp0types.h to more info about flags. */
- ulint flags;
-
- /** Determine if full_crc32 is used for a data file
- @param[in] flags tablespace flags (FSP_SPACE_FLAGS)
- @return whether the full_crc32 algorithm is active */
- static bool full_crc32(ulint flags) {
- return flags & FSP_FLAGS_FCRC32_MASK_MARKER;
- }
- /** Determine if full_crc32 is used along with compression */
- static bool is_full_crc32_compressed(ulint flags)
+ /** Determine the logical page size.
+ @param flags tablespace flags (FSP_SPACE_FLAGS)
+ @return the logical page size
+ @retval 0 if the flags are invalid */
+ static unsigned logical_size(uint32_t flags)
{
- if (full_crc32(flags))
- {
- ulint algo= FSP_FLAGS_FCRC32_GET_COMPRESSED_ALGO(flags);
- DBUG_ASSERT(algo <= PAGE_ALGORITHM_LAST);
- return algo > 0;
+ switch (full_crc32(flags)
+ ? FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags)
+ : FSP_FLAGS_GET_PAGE_SSIZE(flags)) {
+ case 3: return 4096;
+ case 4: return 8192;
+ case 5: return full_crc32(flags) ? 16384 : 0;
+ case 0: return full_crc32(flags) ? 0 : 16384;
+ case 6: return 32768;
+ case 7: return 65536;
+ default: return 0;
}
-
- return false;
}
- /** @return whether innodb_checksum_algorithm=full_crc32 is active */
- bool full_crc32() const { return full_crc32(flags); }
- /** Determine the logical page size.
- @param flags tablespace flags (FSP_FLAGS)
- @return the logical page size
- @retval 0 if the flags are invalid */
- static unsigned logical_size(ulint flags) {
-
- ulint page_ssize = 0;
-
- if (full_crc32(flags)) {
- page_ssize = FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags);
- } else {
- page_ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags);
- }
-
- switch (page_ssize) {
- case 3: return 4096;
- case 4: return 8192;
- case 5:
- { ut_ad(full_crc32(flags)); return 16384; }
- case 0:
- { ut_ad(!full_crc32(flags)); return 16384; }
- case 6: return 32768;
- case 7: return 65536;
- default: return 0;
- }
- }
- /** Determine the ROW_FORMAT=COMPRESSED page size.
- @param flags tablespace flags (FSP_FLAGS)
- @return the ROW_FORMAT=COMPRESSED page size
- @retval 0 if ROW_FORMAT=COMPRESSED is not used */
- static unsigned zip_size(ulint flags) {
-
- if (full_crc32(flags)) {
- return 0;
- }
+ /** Determine the ROW_FORMAT=COMPRESSED page size.
+ @param flags tablespace flags (FSP_SPACE_FLAGS)
+ @return the ROW_FORMAT=COMPRESSED page size
+ @retval 0 if ROW_FORMAT=COMPRESSED is not used */
+ static unsigned zip_size(uint32_t flags)
+ {
+ if (full_crc32(flags))
+ return 0;
+ const uint32_t zip_ssize= FSP_FLAGS_GET_ZIP_SSIZE(flags);
+ return zip_ssize ? (UNIV_ZIP_SIZE_MIN >> 1) << zip_ssize : 0;
+ }
+ /** Determine the physical page size.
+ @param flags tablespace flags (FSP_SPACE_FLAGS)
+ @return the physical page size */
+ static unsigned physical_size(uint32_t flags)
+ {
+ if (full_crc32(flags))
+ return logical_size(flags);
- ulint zip_ssize = FSP_FLAGS_GET_ZIP_SSIZE(flags);
- return zip_ssize
- ? (UNIV_ZIP_SIZE_MIN >> 1) << zip_ssize : 0;
- }
- /** Determine the physical page size.
- @param flags tablespace flags (FSP_FLAGS)
- @return the physical page size */
- static unsigned physical_size(ulint flags) {
+ const uint32_t zip_ssize= FSP_FLAGS_GET_ZIP_SSIZE(flags);
+ return zip_ssize
+ ? (UNIV_ZIP_SIZE_MIN >> 1) << zip_ssize
+ : unsigned(srv_page_size);
+ }
- if (full_crc32(flags)) {
- return logical_size(flags);
- }
+ /** @return the ROW_FORMAT=COMPRESSED page size
+ @retval 0 if ROW_FORMAT=COMPRESSED is not used */
+ unsigned zip_size() const { return zip_size(flags); }
+ /** @return the physical page size */
+ unsigned physical_size() const { return physical_size(flags); }
- ulint zip_ssize = FSP_FLAGS_GET_ZIP_SSIZE(flags);
- return zip_ssize
- ? (UNIV_ZIP_SIZE_MIN >> 1) << zip_ssize
- : unsigned(srv_page_size);
- }
- /** @return the ROW_FORMAT=COMPRESSED page size
- @retval 0 if ROW_FORMAT=COMPRESSED is not used */
- unsigned zip_size() const { return zip_size(flags); }
- /** @return the physical page size */
- unsigned physical_size() const { return physical_size(flags); }
- /** Check whether the compression enabled in tablespace.
+ /** Check whether PAGE_COMPRESSED is enabled.
@param[in] flags tablespace flags */
- static bool is_compressed(ulint flags)
+ static bool is_compressed(uint32_t flags)
{
return is_full_crc32_compressed(flags) ||
FSP_FLAGS_HAS_PAGE_COMPRESSION(flags);
@@ -768,187 +744,151 @@ public:
/** @return whether the compression enabled for the tablespace. */
bool is_compressed() const { return is_compressed(flags); }
- /** Get the compression algorithm for full crc32 format.
- @param[in] flags tablespace flags
- @return algorithm type of tablespace */
- static ulint get_compression_algo(ulint flags)
- {
- return full_crc32(flags)
- ? FSP_FLAGS_FCRC32_GET_COMPRESSED_ALGO(flags)
- : 0;
- }
- /** @return the page_compressed algorithm
- @retval 0 if not page_compressed */
- ulint get_compression_algo() const {
- return fil_space_t::get_compression_algo(flags);
- }
- /** Determine if the page_compressed page contains an extra byte
- for exact compressed stream length
- @param[in] flags tablespace flags
- @return whether the extra byte is needed */
- static bool full_crc32_page_compressed_len(ulint flags)
- {
- DBUG_ASSERT(full_crc32(flags));
- switch (get_compression_algo(flags)) {
- case PAGE_LZ4_ALGORITHM:
- case PAGE_LZO_ALGORITHM:
- case PAGE_SNAPPY_ALGORITHM:
- return true;
- }
- return false;
- }
-
- /** Whether the full checksum matches with non full checksum flags.
- @param[in] flags flags present
- @param[in] expected expected flags
- @return true if it is equivalent */
- static bool is_flags_full_crc32_equal(ulint flags, ulint expected)
- {
- ut_ad(full_crc32(flags));
- ulint fcrc32_psize = FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags);
-
- if (full_crc32(expected)) {
- /* The data file may have been created with a
- different innodb_compression_algorithm. But
- we only support one innodb_page_size for all files. */
- return fcrc32_psize
- == FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(expected);
- }
-
- ulint non_fcrc32_psize = FSP_FLAGS_GET_PAGE_SSIZE(expected);
-
- if (!non_fcrc32_psize) {
- if (fcrc32_psize != 5) {
- return false;
- }
- } else if (fcrc32_psize != non_fcrc32_psize) {
- return false;
- }
-
- return true;
- }
- /** Whether old tablespace flags match full_crc32 flags.
- @param[in] flags flags present
- @param[in] expected expected flags
- @return true if it is equivalent */
- static bool is_flags_non_full_crc32_equal(ulint flags, ulint expected)
- {
- ut_ad(!full_crc32(flags));
-
- if (!full_crc32(expected)) {
- return false;
- }
-
- ulint non_fcrc32_psize = FSP_FLAGS_GET_PAGE_SSIZE(flags);
- ulint fcrc32_psize = FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(
- expected);
-
- if (!non_fcrc32_psize) {
- if (fcrc32_psize != 5) {
- return false;
- }
- } else if (fcrc32_psize != non_fcrc32_psize) {
- return false;
- }
-
- return true;
- }
- /** Whether both fsp flags are equivalent */
- static bool is_flags_equal(ulint flags, ulint expected)
- {
- if (!((flags ^ expected) & ~(1U << FSP_FLAGS_POS_RESERVED))) {
- return true;
- }
-
- return full_crc32(flags)
- ? is_flags_full_crc32_equal(flags, expected)
- : is_flags_non_full_crc32_equal(flags, expected);
- }
- /** Validate the tablespace flags for full crc32 format.
- @param[in] flags the content of FSP_SPACE_FLAGS
- @return whether the flags are correct in full crc32 format */
- static bool is_fcrc32_valid_flags(ulint flags)
- {
- ut_ad(flags & FSP_FLAGS_FCRC32_MASK_MARKER);
- const ulint page_ssize = physical_size(flags);
- if (page_ssize < 3 || page_ssize & 8) {
- return false;
- }
-
- flags >>= FSP_FLAGS_FCRC32_POS_COMPRESSED_ALGO;
-
- return flags <= PAGE_ALGORITHM_LAST;
- }
- /** Validate the tablespace flags.
- @param[in] flags content of FSP_SPACE_FLAGS
- @param[in] is_ibd whether this is an .ibd file
- (not system tablespace)
- @return whether the flags are correct. */
- static bool is_valid_flags(ulint flags, bool is_ibd)
- {
- DBUG_EXECUTE_IF("fsp_flags_is_valid_failure",
- return false;);
-
- if (full_crc32(flags)) {
- return is_fcrc32_valid_flags(flags);
- }
+ /** Get the compression algorithm for full crc32 format.
+ @param flags contents of FSP_SPACE_FLAGS
+ @return PAGE_COMPRESSED algorithm of full_crc32 tablespace
+ @retval 0 if not PAGE_COMPRESSED or not full_crc32 */
+ static unsigned get_compression_algo(uint32_t flags)
+ {
+ return full_crc32(flags)
+ ? FSP_FLAGS_FCRC32_GET_COMPRESSED_ALGO(flags)
+ : 0;
+ }
+ /** @return the page_compressed algorithm
+ @retval 0 if not page_compressed */
+ unsigned get_compression_algo() const { return get_compression_algo(flags); }
+ /** Determine if the page_compressed page contains an extra byte
+ for exact compressed stream length
+ @param flags contents of FSP_SPACE_FLAGS
+ @return whether the extra byte is needed */
+ static bool full_crc32_page_compressed_len(uint32_t flags)
+ {
+ DBUG_ASSERT(full_crc32(flags));
+ switch (get_compression_algo(flags)) {
+ case PAGE_LZ4_ALGORITHM:
+ case PAGE_LZO_ALGORITHM:
+ case PAGE_SNAPPY_ALGORITHM:
+ return true;
+ }
+ return false;
+ }
- if (flags == 0) {
- return true;
- }
+ /** Whether the full checksum matches with non full checksum flags.
+ @param flags contents of FSP_SPACE_FLAGS
+ @param expected expected flags
+ @return true if it is equivalent */
+ static bool is_flags_full_crc32_equal(uint32_t flags, uint32_t expected)
+ {
+ ut_ad(full_crc32(flags));
+ uint32_t fcrc32_psize= FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags);
+
+ if (full_crc32(expected))
+ /* The data file may have been created with a
+ different innodb_compression_algorithm. But
+ we only support one innodb_page_size for all files. */
+ return fcrc32_psize == FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(expected);
+
+ uint32_t non_fcrc32_psize = FSP_FLAGS_GET_PAGE_SSIZE(expected);
+ if (!non_fcrc32_psize)
+ return fcrc32_psize == 5;
+ return fcrc32_psize == non_fcrc32_psize;
+ }
- if (flags & ~FSP_FLAGS_MASK) {
- return false;
- }
+ /** Whether old tablespace flags match full_crc32 flags.
+ @param flags contents of FSP_SPACE_FLAGS
+ @param expected expected flags
+ @return true if it is equivalent */
+ static bool is_flags_non_full_crc32_equal(uint32_t flags, uint32_t expected)
+ {
+ ut_ad(!full_crc32(flags));
+ if (!full_crc32(expected))
+ return false;
- if ((flags & (FSP_FLAGS_MASK_POST_ANTELOPE
- | FSP_FLAGS_MASK_ATOMIC_BLOBS))
- == FSP_FLAGS_MASK_ATOMIC_BLOBS) {
- /* If the "atomic blobs" flag (indicating
- ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED) flag
- is set, then the "post Antelope"
- (ROW_FORMAT!=REDUNDANT) flag must also be set. */
- return false;
- }
+ uint32_t non_fcrc32_psize= FSP_FLAGS_GET_PAGE_SSIZE(flags);
+ uint32_t fcrc32_psize = FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(expected);
- /* Bits 10..14 should be 0b0000d where d is the DATA_DIR flag
- of MySQL 5.6 and MariaDB 10.0, which we ignore.
- In the buggy FSP_SPACE_FLAGS written by MariaDB 10.1.0 to 10.1.20,
- bits 10..14 would be nonzero 0bsssaa where sss is
- nonzero PAGE_SSIZE (3, 4, 6, or 7)
- and aa is ATOMIC_WRITES (not 0b11). */
- if (FSP_FLAGS_GET_RESERVED(flags) & ~1U) {
- return false;
- }
+ if (!non_fcrc32_psize)
+ return fcrc32_psize == 5;
+ return fcrc32_psize == non_fcrc32_psize;
+ }
- const ulint ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags);
- if (ssize == 1 || ssize == 2 || ssize == 5 || ssize & 8) {
- /* the page_size is not between 4k and 64k;
- 16k should be encoded as 0, not 5 */
- return false;
- }
+ /** Whether both fsp flags are equivalent */
+ static bool is_flags_equal(uint32_t flags, uint32_t expected)
+ {
+ if (!((flags ^ expected) & ~(1U << FSP_FLAGS_POS_RESERVED)))
+ return true;
+ return full_crc32(flags)
+ ? is_flags_full_crc32_equal(flags, expected)
+ : is_flags_non_full_crc32_equal(flags, expected);
+ }
- const ulint zssize = FSP_FLAGS_GET_ZIP_SSIZE(flags);
- if (zssize == 0) {
- /* not ROW_FORMAT=COMPRESSED */
- } else if (zssize > (ssize ? ssize : 5)) {
- /* Invalid KEY_BLOCK_SIZE */
- return false;
- } else if (~flags & (FSP_FLAGS_MASK_POST_ANTELOPE
- | FSP_FLAGS_MASK_ATOMIC_BLOBS)) {
- /* both these flags should be set for
- ROW_FORMAT=COMPRESSED */
- return false;
- }
+ /** Validate the tablespace flags for full crc32 format.
+ @param flags contents of FSP_SPACE_FLAGS
+ @return whether the flags are correct in full crc32 format */
+ static bool is_fcrc32_valid_flags(uint32_t flags)
+ {
+ ut_ad(flags & FSP_FLAGS_FCRC32_MASK_MARKER);
+ const ulint page_ssize= physical_size(flags);
+ if (page_ssize < 3 || page_ssize & 8)
+ return false;
+ flags >>= FSP_FLAGS_FCRC32_POS_COMPRESSED_ALGO;
+ return flags <= PAGE_ALGORITHM_LAST;
+ }
+ /** Validate the tablespace flags.
+ @param flags contents of FSP_SPACE_FLAGS
+ @param is_ibd whether this is an .ibd file (not system tablespace)
+ @return whether the flags are correct */
+ static bool is_valid_flags(uint32_t flags, bool is_ibd)
+ {
+ DBUG_EXECUTE_IF("fsp_flags_is_valid_failure", return false;);
+ if (full_crc32(flags))
+ return is_fcrc32_valid_flags(flags);
- /* The flags do look valid. But, avoid misinterpreting
- buggy MariaDB 10.1 format flags for
- PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL={0,2,3}
- as valid-looking PAGE_SSIZE if this is known to be
- an .ibd file and we are using the default innodb_page_size=16k. */
- return(ssize == 0 || !is_ibd
- || srv_page_size != UNIV_PAGE_SIZE_ORIG);
- }
+ if (flags == 0)
+ return true;
+ if (~FSP_FLAGS_MASK & flags)
+ return false;
+
+ if (FSP_FLAGS_MASK_ATOMIC_BLOBS ==
+ (flags & (FSP_FLAGS_MASK_POST_ANTELOPE | FSP_FLAGS_MASK_ATOMIC_BLOBS)))
+ /* If the "atomic blobs" flag (indicating
+ ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED) flag is set, then the
+ ROW_FORMAT!=REDUNDANT flag must also be set. */
+ return false;
+
+ /* Bits 10..14 should be 0b0000d where d is the DATA_DIR flag
+ of MySQL 5.6 and MariaDB 10.0, which we ignore.
+ In the buggy FSP_SPACE_FLAGS written by MariaDB 10.1.0 to 10.1.20,
+ bits 10..14 would be nonzero 0bsssaa where sss is
+ nonzero PAGE_SSIZE (3, 4, 6, or 7)
+ and aa is ATOMIC_WRITES (not 0b11). */
+ if (FSP_FLAGS_GET_RESERVED(flags) & ~1U)
+ return false;
+
+ const uint32_t ssize= FSP_FLAGS_GET_PAGE_SSIZE(flags);
+ if (ssize == 1 || ssize == 2 || ssize == 5 || ssize & 8)
+ /* the page_size is not between 4k and 64k;
+ 16k should be encoded as 0, not 5 */
+ return false;
+
+ const uint32_t zssize= FSP_FLAGS_GET_ZIP_SSIZE(flags);
+ if (zssize == 0)
+ /* not ROW_FORMAT=COMPRESSED */;
+ else if (zssize > (ssize ? ssize : 5))
+ /* Invalid KEY_BLOCK_SIZE */
+ return false;
+ else if (~flags &
+ (FSP_FLAGS_MASK_POST_ANTELOPE | FSP_FLAGS_MASK_ATOMIC_BLOBS))
+ /* both these flags must set for ROW_FORMAT=COMPRESSED */
+ return false;
+
+ /* The flags do look valid. But, avoid misinterpreting
+ buggy MariaDB 10.1 format flags for
+ PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL={0,2,3}
+ as valid-looking PAGE_SSIZE if this is known to be
+ an .ibd file and we are using the default innodb_page_size=16k. */
+ return(ssize == 0 || !is_ibd || srv_page_size != UNIV_PAGE_SIZE_ORIG);
+ }
#ifndef UNIV_INNOCHECKSUM
MY_ATTRIBUTE((warn_unused_result))
@@ -961,7 +901,7 @@ public:
@param opened true if space files are opened
@return pointer to created tablespace, to be filled in with add()
@retval nullptr on failure (such as when the same tablespace exists) */
- static fil_space_t *create(ulint id, ulint flags,
+ static fil_space_t *create(uint32_t id, uint32_t flags,
fil_type_t purpose, fil_space_crypt_t *crypt_data,
fil_encryption_t mode= FIL_ENCRYPTION_DEFAULT,
bool opened= false);
@@ -971,7 +911,7 @@ public:
@param id tablespace identifier
@return tablespace
@retval nullptr if the tablespace is missing or inaccessible */
- static fil_space_t *get(ulint id);
+ static fil_space_t *get(uint32_t id);
/** Add/remove the free page in the freed ranges list.
@param[in] offset page number to be added
@@ -998,7 +938,6 @@ public:
/** Add the set of freed page ranges */
void add_free_range(const range_t range)
{
- std::lock_guard<std::mutex> freed_lock(freed_range_mutex);
freed_ranges.add_range(range);
}
@@ -1101,7 +1040,7 @@ struct fil_node_t final
{
/** tablespace containing this file */
fil_space_t *space;
- /** file name; protected by fil_system.mutex and log_sys.mutex */
+ /** file name; protected by fil_system.mutex and exclusive log_sys.latch */
char *name;
/** file handle */
pfs_os_file_t handle;
@@ -1419,14 +1358,12 @@ or the caller should be in single-threaded crash recovery mode
Normally, fil_space_t::get() should be used instead.
@param[in] id tablespace ID
@return tablespace, or NULL if not found */
-fil_space_t*
-fil_space_get(
- ulint id)
- MY_ATTRIBUTE((warn_unused_result));
+fil_space_t *fil_space_get(uint32_t id)
+ MY_ATTRIBUTE((warn_unused_result));
-/** The tablespace memory cache; also the totality of logs (the log
-data space) is stored here; below we talk about tablespaces */
-struct fil_system_t {
+/** The tablespace memory cache */
+struct fil_system_t
+{
/**
Constructor.
@@ -1490,33 +1427,26 @@ public:
ulint n_open;
/** last time we noted n_open exceeding the limit; protected by mutex */
time_t n_open_exceeded_time;
- ulint max_assigned_id;/*!< maximum space id in the existing
- tables, or assigned during the time
- mysqld has been up; at an InnoDB
- startup we scan the data dictionary
- and set here the maximum of the
- space id's of the tables there */
+ /** maximum persistent tablespace id that has ever been assigned */
+ uint32_t max_assigned_id;
/** nonzero if fil_node_open_file_low() should avoid moving the tablespace
to the end of space_list, for FIFO policy of try_to_close() */
ulint freeze_space_list;
/** List of all file spaces, opened spaces should be at the top of the list
to optimize try_to_close() execution. Protected with fil_system.mutex. */
ilist<fil_space_t, space_list_tag_t> space_list;
-
+ /** list of all tablespaces for which a FILE_MODIFY record has been written
+ since the latest redo log checkpoint.
+ Protected only by exclusive log_sys.latch. */
ilist<fil_space_t, named_spaces_tag_t> named_spaces;
- /*!< list of all file spaces
- for which a FILE_MODIFY
- record has been written since
- the latest redo log checkpoint.
- Protected only by log_sys.mutex. */
- /** List of all file spaces need key rotation */
- ilist<fil_space_t, rotation_list_tag_t> default_encrypt_tables;
+ /** list of all ENCRYPTED=DEFAULT tablespaces that need
+ to be converted to the current value of innodb_encrypt_tables */
+ ilist<fil_space_t, default_encrypt_tag_t> default_encrypt_tables;
- bool space_id_reuse_warned;
- /*!< whether fil_space_t::create()
- has issued a warning about
- potential space_id reuse */
+ /** whether fil_space_t::create() has issued a warning about
+ potential space_id reuse */
+ bool space_id_reuse_warned;
/** Add the file to the end of opened spaces list in
fil_system.space_list, so that fil_space_t::try_to_close() should close
@@ -1682,57 +1612,39 @@ Assigns a new space id for a new single-table tablespace. This works simply by
incrementing the global counter. If 4 billion id's is not enough, we may need
to recycle id's.
@return true if assigned, false if not */
-bool
-fil_assign_new_space_id(
-/*====================*/
- ulint* space_id); /*!< in/out: space id */
+bool fil_assign_new_space_id(uint32_t *space_id);
/** Frees a space object from the tablespace memory cache.
Closes the files in the chain but does not delete them.
There must not be any pending i/o's or flushes on the files.
-@param[in] id tablespace identifier
-@param[in] x_latched whether the caller holds X-mode space->latch
+@param id tablespace identifier
+@param x_latched whether the caller holds exclusive fil_space_t::latch
@return true if success */
-bool
-fil_space_free(
- ulint id,
- bool x_latched);
+bool fil_space_free(uint32_t id, bool x_latched);
/** Set the recovered size of a tablespace in pages.
@param id tablespace ID
@param size recovered size in pages
@param flags tablespace flags */
-void fil_space_set_recv_size_and_flags(ulint id, uint32_t size,
+void fil_space_set_recv_size_and_flags(uint32_t id, uint32_t size,
uint32_t flags);
/*******************************************************************//**
Sets the max tablespace id counter if the given number is bigger than the
previous value. */
-void
-fil_set_max_space_id_if_bigger(
-/*===========================*/
- ulint max_id);/*!< in: maximum known id */
-
-/** Write the flushed LSN to the page header of the first page in the
-system tablespace.
-@param[in] lsn flushed LSN
-@return DB_SUCCESS or error number */
-dberr_t
-fil_write_flushed_lsn(
- lsn_t lsn)
-MY_ATTRIBUTE((warn_unused_result));
+void fil_set_max_space_id_if_bigger(uint32_t max_id);
MY_ATTRIBUTE((warn_unused_result))
/** Delete a tablespace and associated .ibd file.
@param id tablespace identifier
@return detached file handle (to be closed by the caller)
@return OS_FILE_CLOSED if no file existed */
-pfs_os_file_t fil_delete_tablespace(ulint id);
+pfs_os_file_t fil_delete_tablespace(uint32_t id);
/** Close a single-table tablespace on failed IMPORT TABLESPACE.
The tablespace must be cached in the memory cache.
Free all pages used by the tablespace. */
-void fil_close_tablespace(ulint id);
+void fil_close_tablespace(uint32_t id);
/*******************************************************************//**
Allocates and builds a file name from a path, a table or tablespace name
@@ -1762,10 +1674,10 @@ must be >= FIL_IBD_FILE_INITIAL_SIZE
@retval NULL on error */
fil_space_t*
fil_ibd_create(
- ulint space_id,
+ uint32_t space_id,
const table_name_t name,
const char* path,
- ulint flags,
+ uint32_t flags,
uint32_t size,
fil_encryption_t mode,
uint32_t key_id,
@@ -1776,7 +1688,7 @@ fil_ibd_create(
(Typically when upgrading from MariaDB 10.1.0..10.1.20.)
@param[in,out] space tablespace
@param[in] flags desired tablespace flags */
-void fsp_flags_try_adjust(fil_space_t* space, ulint flags);
+void fsp_flags_try_adjust(fil_space_t *space, uint32_t flags);
/********************************************************************//**
Tries to open a single-table tablespace and optionally checks the space id is
@@ -1809,8 +1721,8 @@ fil_space_t*
fil_ibd_open(
unsigned validate,
fil_type_t purpose,
- ulint id,
- ulint flags,
+ uint32_t id,
+ uint32_t flags,
fil_space_t::name_type name,
const char* path_in,
dberr_t* err = NULL)
@@ -1835,12 +1747,8 @@ enum fil_load_status {
@param[out] space the tablespace, or NULL on error
@return status of the operation */
enum fil_load_status
-fil_ibd_load(
- ulint space_id,
- const char* filename,
- fil_space_t*& space)
- MY_ATTRIBUTE((warn_unused_result));
-
+fil_ibd_load(uint32_t space_id, const char *filename, fil_space_t *&space)
+ MY_ATTRIBUTE((warn_unused_result));
/** Determine if a matching tablespace exists in the InnoDB tablespace
memory cache. Note that if we have not done a crash recovery at the database
@@ -1849,7 +1757,8 @@ startup, there may be many tablespaces which are not yet in the memory cache.
@param[in] table_flags table flags
@return the tablespace
@retval NULL if no matching tablespace exists in the memory cache */
-fil_space_t *fil_space_for_table_exists_in_mem(ulint id, ulint table_flags);
+fil_space_t *fil_space_for_table_exists_in_mem(uint32_t id,
+ uint32_t table_flags);
/** Try to extend a tablespace if it is smaller than the specified size.
@param[in,out] space tablespace
@@ -1880,12 +1789,11 @@ fil_delete_file(
/*============*/
const char* path); /*!< in: filepath of the ibd tablespace */
-/*******************************************************************//**
-Returns the table space by a given id, NULL if not found. */
-fil_space_t*
-fil_space_get_by_id(
-/*================*/
- ulint id); /*!< in: space id */
+/** Look up a tablespace.
+@param tablespace identifier
+@return tablespace
+@retval nullptr if not found */
+fil_space_t *fil_space_get_by_id(uint32_t id);
/** Note that a non-predefined persistent tablespace has been modified
by redo log.
@@ -1894,47 +1802,14 @@ void
fil_names_dirty(
fil_space_t* space);
-/** Write FILE_MODIFY records when a non-predefined persistent
-tablespace was modified for the first time since the latest
-fil_names_clear().
-@param[in,out] space tablespace */
-void fil_names_dirty_and_write(fil_space_t* space);
-/** Write FILE_MODIFY records if a persistent tablespace was modified
-for the first time since the latest fil_names_clear().
-@param[in,out] space tablespace
-@param[in,out] mtr mini-transaction
-@return whether any FILE_MODIFY record was written */
-inline bool fil_names_write_if_was_clean(fil_space_t* space)
-{
- mysql_mutex_assert_owner(&log_sys.mutex);
-
- if (space == NULL) {
- return(false);
- }
-
- const bool was_clean = space->max_lsn == 0;
- ut_ad(space->max_lsn <= log_sys.get_lsn());
- space->max_lsn = log_sys.get_lsn();
-
- if (was_clean) {
- fil_names_dirty_and_write(space);
- }
-
- return(was_clean);
-}
+bool fil_comp_algo_loaded(ulint comp_algo);
/** On a log checkpoint, reset fil_names_dirty_and_write() flags
-and write out FILE_MODIFY and FILE_CHECKPOINT if needed.
-@param[in] lsn checkpoint LSN
-@param[in] do_write whether to always write FILE_CHECKPOINT
-@return whether anything was written to the redo log
-@retval false if no flags were set and nothing written
-@retval true if anything was written to the redo log */
-bool
-fil_names_clear(
- lsn_t lsn,
- bool do_write);
+and write out FILE_MODIFY if needed, and write FILE_CHECKPOINT.
+@param lsn checkpoint LSN
+@return current LSN */
+lsn_t fil_names_clear(lsn_t lsn);
#ifdef UNIV_ENABLE_UNIT_TEST_MAKE_FILEPATH
void test_make_filepath();
diff --git a/storage/innobase/include/fil0pagecompress.h b/storage/innobase/include/fil0pagecompress.h
index a22867ad56a..2927da3c2fb 100644
--- a/storage/innobase/include/fil0pagecompress.h
+++ b/storage/innobase/include/fil0pagecompress.h
@@ -40,7 +40,7 @@ Created 11/12/2013 Jan Lindström jan.lindstrom@skysql.com
ulint fil_page_compress(
const byte* buf,
byte* out_buf,
- ulint flags,
+ uint32_t flags,
ulint block_size,
bool encrypted)
MY_ATTRIBUTE((nonnull, warn_unused_result));
@@ -52,9 +52,6 @@ ulint fil_page_compress(
@return size of the compressed data
@retval 0 if decompression failed
@retval srv_page_size if the page was not compressed */
-ulint fil_page_decompress(
- byte* tmp_buf,
- byte* buf,
- ulint flags)
- MY_ATTRIBUTE((nonnull, warn_unused_result));
+ulint fil_page_decompress(byte *tmp_buf, byte *buf, uint32_t flags)
+ MY_ATTRIBUTE((nonnull, warn_unused_result));
#endif
diff --git a/storage/innobase/include/fsp0file.h b/storage/innobase/include/fsp0file.h
index 8c11d61c5aa..ce11b868bd1 100644
--- a/storage/innobase/include/fsp0file.h
+++ b/storage/innobase/include/fsp0file.h
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2013, 2016, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2018, 2021, MariaDB Corporation.
+Copyright (c) 2018, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -56,7 +56,7 @@ public:
m_size(),
m_order(),
m_type(SRV_NOT_RAW),
- m_space_id(ULINT_UNDEFINED),
+ m_space_id(UINT32_MAX),
m_flags(),
m_exists(),
m_is_valid(),
@@ -67,7 +67,7 @@ public:
/* No op */
}
- Datafile(ulint flags, uint32_t size, ulint order)
+ Datafile(uint32_t flags, uint32_t size, ulint order)
:
m_filepath(),
m_filename(),
@@ -76,7 +76,7 @@ public:
m_size(size),
m_order(order),
m_type(SRV_NOT_RAW),
- m_space_id(ULINT_UNDEFINED),
+ m_space_id(UINT32_MAX),
m_flags(flags),
m_exists(),
m_is_valid(),
@@ -154,7 +154,7 @@ public:
}
/** Initialize the tablespace flags */
- void init(ulint flags) { m_flags= flags; }
+ void init(uint32_t flags) { m_flags= flags; }
/** Release the resources. */
virtual void shutdown();
@@ -198,7 +198,7 @@ public:
@param[in] flags The expected tablespace flags.
@retval DB_SUCCESS if tablespace is valid, DB_ERROR if not.
m_is_valid is also set true on success, else false. */
- dberr_t validate_to_dd(ulint space_id, ulint flags)
+ dberr_t validate_to_dd(uint32_t space_id, uint32_t flags)
MY_ATTRIBUTE((warn_unused_result));
/** Validates this datafile for the purpose of recovery.
@@ -216,11 +216,10 @@ public:
tablespace is opened. This occurs before the fil_space_t is created
so the Space ID found here must not already be open.
m_is_valid is set true on success, else false.
- @param[out] flush_lsn contents of FIL_PAGE_FILE_FLUSH_LSN
@retval DB_SUCCESS on if the datafile is valid
@retval DB_CORRUPTION if the datafile is not readable
@retval DB_TABLESPACE_EXISTS if there is a duplicate space_id */
- dberr_t validate_first_page(lsn_t* flush_lsn)
+ dberr_t validate_first_page()
MY_ATTRIBUTE((warn_unused_result));
/** Get Datafile::m_filepath.
@@ -254,24 +253,15 @@ public:
/** Get Datafile::m_space_id.
@return m_space_id */
- ulint space_id() const
- {
- return(m_space_id);
- }
+ uint32_t space_id() const { return m_space_id; }
/** Get Datafile::m_flags.
@return m_flags */
- ulint flags() const
- {
- return(m_flags);
- }
+ uint32_t flags() const { return m_flags; }
/**
@return true if m_handle is open, false if not */
- bool is_open() const
- {
- return(m_handle != OS_FILE_CLOSED);
- }
+ bool is_open() const { return m_handle != OS_FILE_CLOSED; }
/** Get Datafile::m_is_valid.
@return m_is_valid */
@@ -324,9 +314,9 @@ public:
@return the first data page */
const byte* get_first_page() const { return(m_first_page); }
- void set_space_id(ulint space_id) { m_space_id= space_id; }
+ void set_space_id(uint32_t space_id) { m_space_id= space_id; }
- void set_flags(ulint flags) { m_flags = flags; }
+ void set_flags(uint32_t flags) { m_flags = flags; }
private:
/** Free the filepath buffer. */
void free_filepath();
@@ -425,12 +415,12 @@ private:
/** Tablespace ID. Contained in the datafile header.
If this is a system tablespace, FSP_SPACE_ID is only valid
in the first datafile. */
- ulint m_space_id;
+ uint32_t m_space_id;
/** Tablespace flags. Contained in the datafile header.
If this is a system tablespace, FSP_SPACE_FLAGS are only valid
in the first datafile. */
- ulint m_flags;
+ uint32_t m_flags;
/** true if file already existed on startup */
bool m_exists;
diff --git a/storage/innobase/include/fsp0fsp.h b/storage/innobase/include/fsp0fsp.h
index b73fc2b54eb..26261554f9b 100644
--- a/storage/innobase/include/fsp0fsp.h
+++ b/storage/innobase/include/fsp0fsp.h
@@ -590,14 +590,11 @@ fseg_print(
/** Convert FSP_SPACE_FLAGS from the buggy MariaDB 10.1.0..10.1.20 format.
@param[in] flags the contents of FSP_SPACE_FLAGS
@return the flags corrected from the buggy MariaDB 10.1 format
-@retval ULINT_UNDEFINED if the flags are not in the buggy 10.1 format */
+@retval UINT32_MAX if the flags are not in the buggy 10.1 format */
MY_ATTRIBUTE((warn_unused_result, const))
-UNIV_INLINE
-ulint
-fsp_flags_convert_from_101(ulint flags)
+inline uint32_t fsp_flags_convert_from_101(uint32_t flags)
{
- DBUG_EXECUTE_IF("fsp_flags_is_valid_failure",
- return(ULINT_UNDEFINED););
+ DBUG_EXECUTE_IF("fsp_flags_is_valid_failure", return UINT32_MAX;);
if (flags == 0 || fil_space_t::full_crc32(flags)) {
return(flags);
}
@@ -606,7 +603,7 @@ fsp_flags_convert_from_101(ulint flags)
/* The most significant FSP_SPACE_FLAGS bit that was ever set
by MariaDB 10.1.0 to 10.1.20 was bit 17 (misplaced DATA_DIR flag).
The flags must be less than 1<<18 in order to be valid. */
- return(ULINT_UNDEFINED);
+ return UINT32_MAX;
}
if ((flags & (FSP_FLAGS_MASK_POST_ANTELOPE | FSP_FLAGS_MASK_ATOMIC_BLOBS))
@@ -615,7 +612,7 @@ fsp_flags_convert_from_101(ulint flags)
ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED) flag
is set, then the "post Antelope" (ROW_FORMAT!=REDUNDANT) flag
must also be set. */
- return(ULINT_UNDEFINED);
+ return UINT32_MAX;
}
/* Bits 6..10 denote compression in MariaDB 10.1.0 to 10.1.20.
@@ -644,19 +641,19 @@ fsp_flags_convert_from_101(ulint flags)
invalid (COMPRESSION_LEVEL=3 but COMPRESSION=0)
+0b00000: innodb_page_size=16k (looks like COMPRESSION=0)
??? Could actually be compressed; see PAGE_SSIZE below */
- const ulint level = FSP_FLAGS_GET_PAGE_COMPRESSION_LEVEL_MARIADB101(
+ const uint32_t level = FSP_FLAGS_GET_PAGE_COMPRESSION_LEVEL_MARIADB101(
flags);
if (FSP_FLAGS_GET_PAGE_COMPRESSION_MARIADB101(flags) != (level != 0)
|| level > 9) {
/* The compression flags are not in the buggy MariaDB
10.1 format. */
- return(ULINT_UNDEFINED);
+ return UINT32_MAX;
}
if (!(~flags & FSP_FLAGS_MASK_ATOMIC_WRITES_MARIADB101)) {
/* The ATOMIC_WRITES flags cannot be 0b11.
(The bits 11..12 should actually never be 0b11,
because in MySQL they would be SHARED|TEMPORARY.) */
- return(ULINT_UNDEFINED);
+ return UINT32_MAX;
}
/* Bits 13..16 are the wrong position for PAGE_SSIZE, and they
@@ -671,23 +668,23 @@ fsp_flags_convert_from_101(ulint flags)
will be properly rejected by older MariaDB 10.1.x because they
would read as PAGE_SSIZE>=8 which is not valid. */
- const ulint ssize = FSP_FLAGS_GET_PAGE_SSIZE_MARIADB101(flags);
+ const uint32_t ssize = FSP_FLAGS_GET_PAGE_SSIZE_MARIADB101(flags);
if (ssize == 1 || ssize == 2 || ssize == 5 || ssize & 8) {
/* the page_size is not between 4k and 64k;
16k should be encoded as 0, not 5 */
- return(ULINT_UNDEFINED);
+ return UINT32_MAX;
}
- const ulint zssize = FSP_FLAGS_GET_ZIP_SSIZE(flags);
+ const uint32_t zssize = FSP_FLAGS_GET_ZIP_SSIZE(flags);
if (zssize == 0) {
/* not ROW_FORMAT=COMPRESSED */
} else if (zssize > (ssize ? ssize : 5)) {
/* invalid KEY_BLOCK_SIZE */
- return(ULINT_UNDEFINED);
+ return UINT32_MAX;
} else if (~flags & (FSP_FLAGS_MASK_POST_ANTELOPE
| FSP_FLAGS_MASK_ATOMIC_BLOBS)) {
/* both these flags should be set for
ROW_FORMAT=COMPRESSED */
- return(ULINT_UNDEFINED);
+ return UINT32_MAX;
}
flags = ((flags & 0x3f) | ssize << FSP_FLAGS_POS_PAGE_SSIZE
@@ -702,19 +699,11 @@ fsp_flags_convert_from_101(ulint flags)
@param[in] actual flags read from FSP_SPACE_FLAGS
@return whether the flags match */
MY_ATTRIBUTE((warn_unused_result))
-UNIV_INLINE
-bool
-fsp_flags_match(ulint expected, ulint actual)
+inline bool fsp_flags_match(uint32_t expected, uint32_t actual)
{
- expected &= ~FSP_FLAGS_MEM_MASK;
- ut_ad(fil_space_t::is_valid_flags(expected, false));
-
- if (actual == expected) {
- return(true);
- }
-
- actual = fsp_flags_convert_from_101(actual);
- return(actual == expected);
+ expected&= ~FSP_FLAGS_MEM_MASK;
+ ut_ad(fil_space_t::is_valid_flags(expected, false));
+ return actual == expected || fsp_flags_convert_from_101(actual) == expected;
}
/** Determine if FSP_SPACE_FLAGS are from an incompatible MySQL format.
@@ -722,7 +711,7 @@ fsp_flags_match(ulint expected, ulint actual)
@return MySQL flags shifted.
@retval 0, if not a MySQL incompatible format. */
MY_ATTRIBUTE((warn_unused_result, const))
-inline ulint fsp_flags_is_incompatible_mysql(ulint flags)
+inline uint32_t fsp_flags_is_incompatible_mysql(uint32_t flags)
{
/*
MySQL-8.0 SDI flag (bit 14),
diff --git a/storage/innobase/include/fsp0space.h b/storage/innobase/include/fsp0space.h
index ed65af52bc8..a2bb46d3125 100644
--- a/storage/innobase/include/fsp0space.h
+++ b/storage/innobase/include/fsp0space.h
@@ -47,22 +47,13 @@ public:
/** Data file iterator */
typedef files_t::const_iterator const_iterator;
- Tablespace()
- :
- m_files(),
- m_space_id(ULINT_UNDEFINED),
- m_path(),
- m_flags(),
- m_ignore_read_only(false)
- {
- /* No op */
- }
+ Tablespace() {}
virtual ~Tablespace()
{
shutdown();
ut_ad(m_files.empty());
- ut_ad(m_space_id == ULINT_UNDEFINED);
+ ut_ad(m_space_id == UINT32_MAX);
}
// Disable copying
@@ -104,22 +95,19 @@ public:
/** Set the space id of the tablespace
@param[in] space_id tablespace ID to set */
- void set_space_id(ulint space_id)
+ void set_space_id(uint32_t space_id)
{
- ut_ad(m_space_id == ULINT_UNDEFINED);
+ ut_ad(m_space_id == UINT32_MAX);
m_space_id = space_id;
}
/** Get the space id of the tablespace
@return m_space_id space id of the tablespace */
- ulint space_id() const
- {
- return(m_space_id);
- }
+ uint32_t space_id() const { return m_space_id; }
/** Set the tablespace flags
@param[in] fsp_flags tablespace flags */
- void set_flags(ulint fsp_flags)
+ void set_flags(uint32_t fsp_flags)
{
ut_ad(fil_space_t::is_valid_flags(fsp_flags, false));
m_flags = fsp_flags;
@@ -127,24 +115,15 @@ public:
/** Get the tablespace flags
@return m_flags tablespace flags */
- ulint flags() const
- {
- return(m_flags);
- }
+ uint32_t flags() const { return m_flags; }
/** Get the tablespace encryption mode
@return m_mode tablespace encryption mode */
- fil_encryption_t encryption_mode() const
- {
- return (m_mode);
- }
+ fil_encryption_t encryption_mode() const { return m_mode; }
/** Get the tablespace encryption key_id
@return m_key_id tablespace encryption key_id */
- uint32_t key_id() const
- {
- return (m_key_id);
- }
+ uint32_t key_id() const { return m_key_id; }
/** Set Ignore Read Only Status for tablespace.
@param[in] read_only_status read only status indicator */
@@ -210,24 +189,21 @@ private:
@param[in] file data file object */
void file_found(Datafile& file);
- /* DATA MEMBERS */
-
/** Tablespace ID */
- ulint m_space_id;
+ uint32_t m_space_id = UINT32_MAX;
+ /** Tablespace flags */
+ uint32_t m_flags = UINT32_MAX;
- /** Path where tablespace files will reside, not including a filename.*/
+ /** Path where tablespace files will reside, excluding a filename */
char* m_path;
- /** Tablespace flags */
- ulint m_flags;
-
/** Encryption mode and key_id */
fil_encryption_t m_mode;
uint32_t m_key_id;
protected:
/** Ignore server read only configuration for this tablespace. */
- bool m_ignore_read_only;
+ bool m_ignore_read_only = false;
};
#endif /* fsp0space_h */
diff --git a/storage/innobase/include/fsp0sysspace.h b/storage/innobase/include/fsp0sysspace.h
index 2e0a395f71c..514f3fdbf25 100644
--- a/storage/innobase/include/fsp0sysspace.h
+++ b/storage/innobase/include/fsp0sysspace.h
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 2013, 2016, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2016, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -150,20 +151,17 @@ public:
@param[in] is_temp whether this is a temporary tablespace
@param[in] create_new_db whether we are creating a new database
@param[out] sum_new_sizes sum of sizes of the new files added
- @param[out] flush_lsn FIL_PAGE_FILE_FLUSH_LSN of first file
@return DB_SUCCESS or error code */
dberr_t open_or_create(
bool is_temp,
bool create_new_db,
- ulint* sum_new_sizes,
- lsn_t* flush_lsn)
+ ulint* sum_new_sizes)
MY_ATTRIBUTE((warn_unused_result));
private:
/** Check the tablespace header for this tablespace.
- @param[out] flushed_lsn the value of FIL_PAGE_FILE_FLUSH_LSN
@return DB_SUCCESS or error code */
- dberr_t read_lsn_and_check_flags(lsn_t* flushed_lsn);
+ inline dberr_t read_lsn_and_check_flags();
/**
@return true if the last file size is valid. */
@@ -266,24 +264,15 @@ extern SysTablespace srv_tmp_space;
/** Check if the space_id is for a system-tablespace (shared + temp).
@param[in] id Space ID to check
@return true if id is a system tablespace, false if not. */
-UNIV_INLINE
-bool
-is_system_tablespace(ulint id)
+inline bool is_system_tablespace(uint32_t id)
{
- return(id == TRX_SYS_SPACE || id == SRV_TMP_SPACE_ID);
+ return id == TRX_SYS_SPACE || id == SRV_TMP_SPACE_ID;
}
/** Check if predefined shared tablespace.
@return true if predefined shared tablespace */
-UNIV_INLINE
-bool
-is_predefined_tablespace(
- ulint id)
+inline bool is_predefined_tablespace(uint32_t id)
{
- ut_ad(srv_sys_space.space_id() == TRX_SYS_SPACE);
- ut_ad(TRX_SYS_SPACE == 0);
- return(id == TRX_SYS_SPACE
- || id == SRV_TMP_SPACE_ID
- || srv_is_undo_tablespace(id));
+ return is_system_tablespace(id) || srv_is_undo_tablespace(id);
}
#endif /* fsp0sysspace_h */
diff --git a/storage/innobase/include/fsp0types.h b/storage/innobase/include/fsp0types.h
index 1912c31b744..9a23e840380 100644
--- a/storage/innobase/include/fsp0types.h
+++ b/storage/innobase/include/fsp0types.h
@@ -25,25 +25,24 @@ Created May 26, 2009 Vasil Dimov
*******************************************************/
#pragma once
-#include <cstddef>
+#include "ut0byte.h"
-/** The fil_space_t::id of the redo log. All persistent tablespaces
-have a smaller fil_space_t::id. */
-static constexpr size_t SRV_SPACE_ID_UPPER_BOUND= 0xFFFFFFF0;
+/** All persistent tablespaces have a smaller fil_space_t::id than this. */
+constexpr uint32_t SRV_SPACE_ID_UPPER_BOUND= 0xFFFFFFF0U;
/** The fil_space_t::id of the innodb_temporary tablespace. */
-#define SRV_TMP_SPACE_ID 0xFFFFFFFEU
-
-#include "ut0byte.h"
+constexpr uint32_t SRV_TMP_SPACE_ID= 0xFFFFFFFEU;
/* Possible values of innodb_compression_algorithm */
-#define PAGE_UNCOMPRESSED 0
-#define PAGE_ZLIB_ALGORITHM 1
-#define PAGE_LZ4_ALGORITHM 2
-#define PAGE_LZO_ALGORITHM 3
-#define PAGE_LZMA_ALGORITHM 4
+#define PAGE_UNCOMPRESSED 0
+#define PAGE_ZLIB_ALGORITHM 1
+#define PAGE_LZ4_ALGORITHM 2
+#define PAGE_LZO_ALGORITHM 3
+#define PAGE_LZMA_ALGORITHM 4
#define PAGE_BZIP2_ALGORITHM 5
#define PAGE_SNAPPY_ALGORITHM 6
-#define PAGE_ALGORITHM_LAST PAGE_SNAPPY_ALGORITHM
+#define PAGE_ALGORITHM_LAST PAGE_SNAPPY_ALGORITHM
+
+extern const char *page_compression_algorithms[];
/** @name Flags for inserting records in order
If records are inserted in order, there are the following
diff --git a/storage/innobase/include/ibuf0ibuf.h b/storage/innobase/include/ibuf0ibuf.h
index e38515f0402..c246b2ef513 100644
--- a/storage/innobase/include/ibuf0ibuf.h
+++ b/storage/innobase/include/ibuf0ibuf.h
@@ -365,7 +365,7 @@ dberr_t ibuf_merge_or_delete_for_page(buf_block_t *block,
/** Delete all change buffer entries for a tablespace,
in DISCARD TABLESPACE, IMPORT TABLESPACE, or read-ahead.
@param[in] space missing or to-be-discarded tablespace */
-void ibuf_delete_for_discarded_space(ulint space);
+void ibuf_delete_for_discarded_space(uint32_t space);
/** Contract the change buffer by reading pages to the buffer pool.
@return a lower limit for the combined size in bytes of entries which
diff --git a/storage/innobase/include/ibuf0ibuf.inl b/storage/innobase/include/ibuf0ibuf.inl
index 1e21f74ff2b..003bf22a047 100644
--- a/storage/innobase/include/ibuf0ibuf.inl
+++ b/storage/innobase/include/ibuf0ibuf.inl
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 1997, 2015, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -99,11 +100,17 @@ ibuf_should_try(
a secondary index when we
decide */
{
- return(innodb_change_buffering
- && !(index->type & (DICT_CLUSTERED | DICT_IBUF))
- && ibuf.max_size != 0
- && index->table->quiesce == QUIESCE_NONE
- && (ignore_sec_unique || !dict_index_is_unique(index)));
+ if (index->type & (DICT_CLUSTERED | DICT_IBUF | DICT_SPATIAL) ||
+ !innodb_change_buffering || !ibuf.max_size)
+ return false;
+ if (!ignore_sec_unique && index->is_unique())
+ return false;
+ if (index->table->quiesce != QUIESCE_NONE)
+ return false;
+ for (unsigned i= 0; i < index->n_fields; i++)
+ if (index->fields[i].descending)
+ return false;
+ return true;
}
/******************************************************************//**
diff --git a/storage/innobase/include/log0crypt.h b/storage/innobase/include/log0crypt.h
index b9390927ece..22c0c9636bf 100644
--- a/storage/innobase/include/log0crypt.h
+++ b/storage/innobase/include/log0crypt.h
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
-Copyright (C) 2014, 2021, MariaDB Corporation.
+Copyright (C) 2014, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -24,27 +24,26 @@ Created 11/25/2013 Minli Zhu
Modified Jan Lindström jan.lindstrom@mariadb.com
MDEV-11782: Rewritten for MariaDB 10.2 by Marko Mäkelä, MariaDB Corporation.
*******************************************************/
-#ifndef log0crypt_h
-#define log0crypt_h
+#pragma once
#include "log0log.h"
-/** innodb_encrypt_log: whether to encrypt the redo log */
-extern my_bool srv_encrypt_log;
-
/** Initialize the redo log encryption key and random parameters
when creating a new redo log.
-The random parameters will be persisted in the log checkpoint pages.
-@see log_crypt_write_checkpoint_buf()
-@see log_crypt_read_checkpoint_buf()
+The random parameters will be persisted in the log header.
+@see log_crypt_write_header()
+@see log_crypt_read_header()
@return whether the operation succeeded */
bool log_crypt_init();
-/*********************************************************************//**
-Writes the crypto (version, msg and iv) info, which has been used for
-log blocks with lsn <= this checkpoint's lsn, to a log header's
-checkpoint buf. */
-void log_crypt_write_checkpoint_buf(byte *buf);
+/** Add the encryption information to the log header buffer.
+@param buf part of log header buffer */
+void log_crypt_write_header(byte *buf);
+
+/** Read the encryption information from a redo log checkpoint buffer.
+@param buf part of checkpoint buffer
+@return whether the operation was successful */
+bool log_crypt_read_header(const byte *buf);
/** Read the MariaDB 10.1 checkpoint crypto (version, msg and iv) info.
@param[in] buf checkpoint buffer
@@ -60,25 +59,28 @@ ATTRIBUTE_COLD bool log_crypt_101_read_block(byte* buf, lsn_t start_lsn);
/** Read the checkpoint crypto (version, msg and iv) info.
@param[in] buf checkpoint buffer
@return whether the operation was successful */
-bool log_crypt_read_checkpoint_buf(const byte* buf);
-
-/** log_crypt() operation code */
-enum log_crypt_t {
- /** encrypt a log block without rotating key */
- LOG_ENCRYPT,
- /** decrypt a log block */
- LOG_DECRYPT,
- /** attempt to rotate the key, and encrypt a log block */
- LOG_ENCRYPT_ROTATE_KEY
-};
-
-/** Encrypt or decrypt log blocks.
-@param[in,out] buf log blocks to encrypt or decrypt
+ATTRIBUTE_COLD bool log_crypt_read_checkpoint_buf(const byte* buf);
+
+/** Decrypt log blocks.
+@param[in,out] buf log blocks to decrypt
@param[in] lsn log sequence number of the start of the buffer
@param[in] size size of the buffer, in bytes
-@param[in] op whether to decrypt, encrypt, or rotate key and encrypt
-@return whether the operation succeeded (encrypt always does) */
-bool log_crypt(byte* buf, lsn_t lsn, ulint size, log_crypt_t op = LOG_ENCRYPT);
+@return whether the operation succeeded */
+ATTRIBUTE_COLD bool log_decrypt(byte* buf, lsn_t lsn, ulint size);
+
+/** Decrypt part of a log record.
+@param iv initialization vector
+@param buf buffer for the decrypted data
+@param data the encrypted data
+@param len length of the data, in bytes
+@return buf */
+byte *log_decrypt_buf(const byte *iv, byte *buf, const byte *data, uint len);
+
+/** Decrypt a log snippet.
+@param iv initialization vector
+@param buf buffer to be replaced with encrypted contents
+@param end pointer past the end of buf */
+void log_decrypt_buf(const byte *iv, byte *buf, const byte *const end);
/** Encrypt or decrypt a temporary file block.
@param[in] src block to encrypt or decrypt
@@ -111,7 +113,3 @@ log_tmp_block_decrypt(
{
return(log_tmp_block_encrypt(src, size, dst, offs, false));
}
-
-/** @return whether temporary files are encrypted */
-inline bool log_tmp_is_encrypted() { return srv_encrypt_log; }
-#endif // log0crypt.h
diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h
index 0f9a4da049b..7f5eb482e97 100644
--- a/storage/innobase/include/log0log.h
+++ b/storage/innobase/include/log0log.h
@@ -31,14 +31,13 @@ Database log
Created 12/9/1995 Heikki Tuuri
*******************************************************/
-#ifndef log0log_h
-#define log0log_h
+#pragma once
#include "log0types.h"
#include "os0file.h"
#include "span.h"
#include "my_atomic_wrapper.h"
-#include <vector>
+#include "srw_lock.h"
#include <string>
using st_::span;
@@ -51,77 +50,34 @@ static const char LOG_FILE_NAME[] = "ib_logfile0";
@return path with log file name*/
std::string get_log_file_path(const char *filename= LOG_FILE_NAME);
-/** Returns paths for all existing log files */
-std::vector<std::string> get_existing_log_files_paths();
-
/** Delete log file.
@param[in] suffix suffix of the file name */
static inline void delete_log_file(const char* suffix)
{
auto path = get_log_file_path(LOG_FILE_NAME_PREFIX).append(suffix);
- os_file_delete_if_exists(innodb_log_file_key, path.c_str(), nullptr);
+ os_file_delete_if_exists_func(path.c_str(), nullptr);
}
-/** Append a string to the log.
-@param[in] str string
-@param[in] len string length
-@param[out] start_lsn start LSN of the log record
-@return end lsn of the log record, zero if did not succeed */
-UNIV_INLINE
-lsn_t
-log_reserve_and_write_fast(
- const void* str,
- ulint len,
- lsn_t* start_lsn);
-/***********************************************************************//**
-Checks if there is need for a log buffer flush or a new checkpoint, and does
-this if yes. Any database operation should call this when it has modified
-more than about 4 pages. NOTE that this function may only be called when the
-OS thread owns no synchronization objects except dict_sys.latch. */
-UNIV_INLINE
-void
-log_free_check(void);
-/*================*/
-
-/** Extends the log buffer.
-@param[in] len requested minimum size in bytes */
-void log_buffer_extend(ulong len);
-
-/** Calculate the recommended highest values for lsn - last_checkpoint_lsn
-and lsn - buf_pool.get_oldest_modification().
-@param[in] file_size requested innodb_log_file_size
-@retval true on success
-@retval false if the smallest log is too small to
-accommodate the number of OS threads in the database server */
-bool
-log_set_capacity(ulonglong file_size)
- MY_ATTRIBUTE((warn_unused_result));
+struct completion_callback;
-/**
-Ensure that the log has been written to the log file up to a given
+/** Ensure that the log has been written to the log file up to a given
log entry (such as that of a transaction commit). Start a new write, or
wait and check if an already running write is covering the request.
-@param[in] lsn log sequence number that should be
-included in the redo log file write
-@param[in] flush_to_disk whether the written log should also
-be flushed to the file system
-@param[in] rotate_key whether to rotate the encryption key
-@param[in] cb completion callback. If not NULL, the callback will be called
- whenever lsn is written or flushed.
-*/
-struct completion_callback;
-void log_write_up_to(lsn_t lsn, bool flush_to_disk, bool rotate_key = false,
- const completion_callback* cb=nullptr);
+@param lsn log sequence number that should be included in the file write
+@param durable whether the write needs to be durable
+@param callback log write completion callback */
+void log_write_up_to(lsn_t lsn, bool durable,
+ const completion_callback *callback= nullptr);
/** Write to the log file up to the last log entry.
-@param sync whether to wait for a durable write to complete */
-void log_buffer_flush_to_disk(bool sync= true);
+@param durable whether to wait for a durable write to complete */
+void log_buffer_flush_to_disk(bool durable= true);
-/** Prepare to invoke log_write_and_flush(), before acquiring log_sys.mutex. */
+/** Prepare to invoke log_write_and_flush(), before acquiring log_sys.latch. */
ATTRIBUTE_COLD void log_write_and_flush_prepare();
-/** Durably write the log up to log_sys.lsn() and release log_sys.mutex. */
+/** Durably write the log up to log_sys.get_lsn(). */
ATTRIBUTE_COLD void log_write_and_flush();
/** Make a checkpoint */
@@ -130,10 +86,6 @@ ATTRIBUTE_COLD void log_make_checkpoint();
/** Make a checkpoint at the latest lsn on shutdown. */
ATTRIBUTE_COLD void logs_empty_and_mark_files_at_shutdown();
-/** Write checkpoint info to the log header and release log_sys.mutex.
-@param[in] end_lsn start LSN of the FILE_CHECKPOINT mini-transaction */
-ATTRIBUTE_COLD void log_write_checkpoint_info(lsn_t end_lsn);
-
/**
Checks that there is enough free space in the log to start a new query step.
Flushes the log buffer or makes a new checkpoint if necessary. NOTE: this
@@ -141,175 +93,12 @@ function may only be called if the calling thread owns no synchronization
objects! */
ATTRIBUTE_COLD void log_check_margins();
-/************************************************************//**
-Gets a log block flush bit.
-@return TRUE if this block was the first to be written in a log flush */
-UNIV_INLINE
-ibool
-log_block_get_flush_bit(
-/*====================*/
- const byte* log_block); /*!< in: log block */
-/************************************************************//**
-Gets a log block number stored in the header.
-@return log block number stored in the block header */
-UNIV_INLINE
-ulint
-log_block_get_hdr_no(
-/*=================*/
- const byte* log_block); /*!< in: log block */
-/************************************************************//**
-Gets a log block data length.
-@return log block data length measured as a byte offset from the block start */
-UNIV_INLINE
-ulint
-log_block_get_data_len(
-/*===================*/
- const byte* log_block); /*!< in: log block */
-/************************************************************//**
-Sets the log block data length. */
-UNIV_INLINE
-void
-log_block_set_data_len(
-/*===================*/
- byte* log_block, /*!< in/out: log block */
- ulint len); /*!< in: data length */
-/** Calculate the CRC-32C checksum of a log block.
-@param[in] block log block
-@return checksum */
-inline ulint log_block_calc_checksum_crc32(const byte* block);
-
-/************************************************************//**
-Gets a log block checksum field value.
-@return checksum */
-UNIV_INLINE
-ulint
-log_block_get_checksum(
-/*===================*/
- const byte* log_block); /*!< in: log block */
-/************************************************************//**
-Sets a log block checksum field value. */
-UNIV_INLINE
-void
-log_block_set_checksum(
-/*===================*/
- byte* log_block, /*!< in/out: log block */
- ulint checksum); /*!< in: checksum */
-/************************************************************//**
-Gets a log block first mtr log record group offset.
-@return first mtr log record group byte offset from the block start, 0
-if none */
-UNIV_INLINE
-ulint
-log_block_get_first_rec_group(
-/*==========================*/
- const byte* log_block); /*!< in: log block */
-/************************************************************//**
-Sets the log block first mtr log record group offset. */
-UNIV_INLINE
-void
-log_block_set_first_rec_group(
-/*==========================*/
- byte* log_block, /*!< in/out: log block */
- ulint offset); /*!< in: offset, 0 if none */
-/************************************************************//**
-Gets a log block checkpoint number field (4 lowest bytes).
-@return checkpoint no (4 lowest bytes) */
-UNIV_INLINE
-ulint
-log_block_get_checkpoint_no(
-/*========================*/
- const byte* log_block); /*!< in: log block */
-/************************************************************//**
-Initializes a log block in the log buffer. */
-UNIV_INLINE
-void
-log_block_init(
-/*===========*/
- byte* log_block, /*!< in: pointer to the log buffer */
- lsn_t lsn); /*!< in: lsn within the log block */
-/************************************************************//**
-Converts a lsn to a log block number.
-@return log block number, it is > 0 and <= 1G */
-UNIV_INLINE
-ulint
-log_block_convert_lsn_to_no(
-/*========================*/
- lsn_t lsn); /*!< in: lsn of a byte within the block */
/******************************************************//**
Prints info of the log. */
void
log_print(
/*======*/
FILE* file); /*!< in: file where to print */
-/**********************************************************************//**
-Refreshes the statistics used to print per-second averages. */
-void
-log_refresh_stats(void);
-/*===================*/
-
-/* The counting of lsn's starts from this value: this must be non-zero */
-#define LOG_START_LSN ((lsn_t) (16 * OS_FILE_LOG_BLOCK_SIZE))
-
-/* Offsets of a log block header */
-#define LOG_BLOCK_HDR_NO 0 /* block number which must be > 0 and
- is allowed to wrap around at 2G; the
- highest bit is set to 1 if this is the
- first log block in a log flush write
- segment */
-#define LOG_BLOCK_FLUSH_BIT_MASK 0x80000000UL
- /* mask used to get the highest bit in
- the preceding field */
-#define LOG_BLOCK_HDR_DATA_LEN 4 /* number of bytes of log written to
- this block */
-#define LOG_BLOCK_FIRST_REC_GROUP 6 /* offset of the first start of an
- mtr log record group in this log block,
- 0 if none; if the value is the same
- as LOG_BLOCK_HDR_DATA_LEN, it means
- that the first rec group has not yet
- been catenated to this log block, but
- if it will, it will start at this
- offset; an archive recovery can
- start parsing the log records starting
- from this offset in this log block,
- if value not 0 */
-#define LOG_BLOCK_CHECKPOINT_NO 8 /* 4 lower bytes of the value of
- log_sys.next_checkpoint_no when the
- log block was last written to: if the
- block has not yet been written full,
- this value is only updated before a
- log buffer flush */
-#define LOG_BLOCK_HDR_SIZE 12 /* size of the log block header in
- bytes */
-
-#define LOG_BLOCK_KEY 4 /* encryption key version
- before LOG_BLOCK_CHECKSUM;
- after log_t::FORMAT_ENC_10_4 only */
-#define LOG_BLOCK_CHECKSUM 4 /* 4 byte checksum of the log block
- contents; in InnoDB versions
- < 3.23.52 this did not contain the
- checksum but the same value as
- LOG_BLOCK_HDR_NO */
-
-/** Offsets inside the checkpoint pages (redo log format version 1) @{ */
-/** Checkpoint number */
-#define LOG_CHECKPOINT_NO 0
-/** Log sequence number up to which all changes have been flushed */
-#define LOG_CHECKPOINT_LSN 8
-/** Byte offset of the log record corresponding to LOG_CHECKPOINT_LSN */
-#define LOG_CHECKPOINT_OFFSET 16
-/** srv_log_buffer_size at the time of the checkpoint (not used) */
-#define LOG_CHECKPOINT_LOG_BUF_SIZE 24
-/** MariaDB 10.2.5 encrypted redo log encryption key version (32 bits)*/
-#define LOG_CHECKPOINT_CRYPT_KEY 32
-/** MariaDB 10.2.5 encrypted redo log random nonce (32 bits) */
-#define LOG_CHECKPOINT_CRYPT_NONCE 36
-/** MariaDB 10.2.5 encrypted redo log random message (MY_AES_BLOCK_SIZE) */
-#define LOG_CHECKPOINT_CRYPT_MESSAGE 40
-/** start LSN of the MLOG_CHECKPOINT mini-transaction corresponding
-to this checkpoint, or 0 if the information has not been written */
-#define LOG_CHECKPOINT_END_LSN OS_FILE_LOG_BLOCK_SIZE - 16
-
-/* @} */
/** Offsets of a log file header */
/* @{ */
@@ -317,12 +106,6 @@ to this checkpoint, or 0 if the information has not been written */
This used to be called LOG_GROUP_ID and always written as 0,
because InnoDB never supported more than one copy of the redo log. */
#define LOG_HEADER_FORMAT 0
-/** Redo log subformat (originally 0). In format version 0, the
-LOG_FILE_START_LSN started here, 4 bytes earlier than LOG_HEADER_START_LSN,
-which the LOG_FILE_START_LSN was renamed to.
-Subformat 1 is for the fully redo-logged TRUNCATE
-(no MLOG_TRUNCATE records or extra log checkpoints or log file) */
-#define LOG_HEADER_SUBFORMAT 4
/** LSN of the start of data in this log file (with format version 1;
in format version 0, it was called LOG_FILE_START_LSN and at offset 4). */
#define LOG_HEADER_START_LSN 8
@@ -331,123 +114,69 @@ and the creation time if the log file was created by mysqlbackup --restore,
or the MySQL version that created the redo log file. */
#define LOG_HEADER_CREATOR 16
/** End of the log file creator field. */
-#define LOG_HEADER_CREATOR_END (LOG_HEADER_CREATOR + 32)
-/** Contents of the LOG_HEADER_CREATOR field */
-#define LOG_HEADER_CREATOR_CURRENT \
- "MariaDB " \
- IB_TO_STR(MYSQL_VERSION_MAJOR) "." \
- IB_TO_STR(MYSQL_VERSION_MINOR) "." \
- IB_TO_STR(MYSQL_VERSION_PATCH)
-
+#define LOG_HEADER_CREATOR_END 48
/* @} */
-#define LOG_CHECKPOINT_1 OS_FILE_LOG_BLOCK_SIZE
- /* first checkpoint field in the log
- header; we write alternately to the
- checkpoint fields when we make new
- checkpoints; this field is only defined
- in the first log file of a log */
-#define LOG_CHECKPOINT_2 (3 * OS_FILE_LOG_BLOCK_SIZE)
- /* second checkpoint field in the log
- header */
-#define LOG_FILE_HDR_SIZE (4 * OS_FILE_LOG_BLOCK_SIZE)
-
-/** Abstraction for reading, writing and flushing file cache to disk */
-class file_io
-{
-public:
- file_io(bool durable_writes= false) : m_durable_writes(durable_writes) {}
- virtual ~file_io() noexcept {};
- virtual dberr_t open(const char *path, bool read_only) noexcept= 0;
- virtual dberr_t rename(const char *old_path,
- const char *new_path) noexcept= 0;
- virtual dberr_t close() noexcept= 0;
- virtual dberr_t read(os_offset_t offset, span<byte> buf) noexcept= 0;
- virtual dberr_t write(const char *path, os_offset_t offset,
- span<const byte> buf) noexcept= 0;
- virtual dberr_t flush() noexcept= 0;
-
- /** Durable writes doesn't require calling flush() */
- bool writes_are_durable() const noexcept { return m_durable_writes; }
-
-protected:
- bool m_durable_writes;
-};
-
-class file_os_io final: public file_io
-{
-public:
- file_os_io()= default;
- file_os_io(const file_os_io &)= delete;
- file_os_io &operator=(const file_os_io &)= delete;
- file_os_io(file_os_io &&rhs);
- file_os_io &operator=(file_os_io &&rhs);
- ~file_os_io() noexcept;
-
- dberr_t open(const char *path, bool read_only) noexcept final;
- bool is_opened() const noexcept { return m_fd != OS_FILE_CLOSED; }
- dberr_t rename(const char *old_path, const char *new_path) noexcept final;
- dberr_t close() noexcept final;
- dberr_t read(os_offset_t offset, span<byte> buf) noexcept final;
- dberr_t write(const char *path, os_offset_t offset,
- span<const byte> buf) noexcept final;
- dberr_t flush() noexcept final;
-
-private:
- pfs_os_file_t m_fd{OS_FILE_CLOSED};
-};
+struct log_t;
-/** File abstraction + path */
+/** File abstraction */
class log_file_t
{
+ friend log_t;
+ os_file_t m_file{OS_FILE_CLOSED};
public:
- log_file_t(std::string path= "") noexcept : m_path{std::move(path)} {}
+ log_file_t()= default;
+ log_file_t(os_file_t file) noexcept : m_file(file) {}
- dberr_t open(bool read_only) noexcept;
- bool is_opened() const noexcept;
+ /** Open a file
+ @return file size in bytes
+ @retval 0 if not readable */
+ os_offset_t open(bool read_only) noexcept;
+ bool is_opened() const noexcept { return m_file != OS_FILE_CLOSED; }
- const std::string &get_path() const noexcept { return m_path; }
-
- dberr_t rename(std::string new_path) noexcept;
dberr_t close() noexcept;
dberr_t read(os_offset_t offset, span<byte> buf) noexcept;
- bool writes_are_durable() const noexcept;
- dberr_t write(os_offset_t offset, span<const byte> buf) noexcept;
- dberr_t flush() noexcept;
- void free()
- {
- m_path.clear();
- m_path.shrink_to_fit();
- }
-
-private:
- std::unique_ptr<file_io> m_file;
- std::string m_path;
+ void write(os_offset_t offset, span<const byte> buf) noexcept;
+ bool flush() const noexcept { return os_file_flush(m_file); }
+#ifdef HAVE_PMEM
+ byte *mmap(bool read_only, const struct stat &st) noexcept;
+#endif
};
/** Redo log buffer */
-struct log_t{
+struct log_t
+{
/** The original (not version-tagged) InnoDB redo log format */
- static constexpr uint32_t FORMAT_3_23 = 0;
+ static constexpr uint32_t FORMAT_3_23= 0;
/** The MySQL 5.7.9/MariaDB 10.2.2 log format */
- static constexpr uint32_t FORMAT_10_2 = 1;
- /** The MariaDB 10.3.2 log format.
- To prevent crash-downgrade to earlier 10.2 due to the inability to
- roll back a retroactively introduced TRX_UNDO_RENAME_TABLE undo log record,
- MariaDB 10.2.18 and later will use the 10.3 format, but LOG_HEADER_SUBFORMAT
- 1 instead of 0. MariaDB 10.3 will use subformat 0 (5.7-style TRUNCATE) or 2
- (MDEV-13564 backup-friendly TRUNCATE). */
- static constexpr uint32_t FORMAT_10_3 = 103;
+ static constexpr uint32_t FORMAT_10_2= 1;
+ /** The MariaDB 10.3.2 log format. */
+ static constexpr uint32_t FORMAT_10_3= 103;
/** The MariaDB 10.4.0 log format. */
- static constexpr uint32_t FORMAT_10_4 = 104;
+ static constexpr uint32_t FORMAT_10_4= 104;
/** Encrypted MariaDB redo log */
- static constexpr uint32_t FORMAT_ENCRYPTED = 1U << 31;
+ static constexpr uint32_t FORMAT_ENCRYPTED= 1U << 31;
/** The MariaDB 10.4.0 log format (only with innodb_encrypt_log=ON) */
- static constexpr uint32_t FORMAT_ENC_10_4 = FORMAT_10_4 | FORMAT_ENCRYPTED;
- /** The MariaDB 10.5 physical redo log format */
- static constexpr uint32_t FORMAT_10_5 = 0x50485953;
- /** The MariaDB 10.5 physical format (only with innodb_encrypt_log=ON) */
- static constexpr uint32_t FORMAT_ENC_10_5 = FORMAT_10_5 | FORMAT_ENCRYPTED;
+ static constexpr uint32_t FORMAT_ENC_10_4= FORMAT_10_4 | FORMAT_ENCRYPTED;
+ /** The MariaDB 10.5.1 physical redo log format */
+ static constexpr uint32_t FORMAT_10_5= 0x50485953;
+ /** The MariaDB 10.5.1 physical format (only with innodb_encrypt_log=ON) */
+ static constexpr uint32_t FORMAT_ENC_10_5= FORMAT_10_5 | FORMAT_ENCRYPTED;
+ /** The MariaDB 10.8.0 variable-block-size redo log format */
+ static constexpr uint32_t FORMAT_10_8= 0x50687973;
+ /** The MariaDB 10.8.0 format with innodb_encrypt_log=ON */
+ static constexpr uint32_t FORMAT_ENC_10_8= FORMAT_10_8 | FORMAT_ENCRYPTED;
+
+ /** Location of the first checkpoint block */
+ static constexpr size_t CHECKPOINT_1= 4096;
+ /** Location of the second checkpoint block */
+ static constexpr size_t CHECKPOINT_2= 8192;
+ /** Start of record payload */
+ static constexpr lsn_t START_OFFSET= 12288;
+
+ /** smallest possible log sequence number in the current format
+ (used to be 2048 before FORMAT_10_8). */
+ static constexpr lsn_t FIRST_LSN= START_OFFSET;
private:
/** The log sequence number of the last change of durable InnoDB files */
@@ -459,132 +188,82 @@ private:
preflush buffer pool pages, or initiate a log checkpoint.
This must hold if lsn - last_checkpoint_lsn > max_checkpoint_age. */
std::atomic<bool> check_flush_or_checkpoint_;
+
+
+#if defined(__aarch64__)
+/* On ARM, we do more spinning */
+typedef srw_spin_lock log_rwlock_t;
+#define LSN_LOCK_ATTR MY_MUTEX_INIT_FAST
+#else
+typedef srw_lock log_rwlock_t;
+#define LSN_LOCK_ATTR nullptr
+#endif
+
public:
- /** mutex protecting the log */
- alignas(CPU_LEVEL1_DCACHE_LINESIZE) mysql_mutex_t mutex;
- /** first free offset within the log buffer in use */
- size_t buf_free;
- /** recommended maximum size of buf, after which the buffer is flushed */
- size_t max_buf_free;
+ /** rw-lock protecting buf */
+ alignas(CPU_LEVEL1_DCACHE_LINESIZE) log_rwlock_t latch;
+private:
+ /** Last written LSN */
+ lsn_t write_lsn;
+public:
+ /** log record buffer, written to by mtr_t::commit() */
+ byte *buf;
+ /** buffer for writing data to ib_logfile0, or nullptr if is_pmem()
+ In write_buf(), buf and flush_buf are swapped */
+ byte *flush_buf;
+ /** number of std::swap(buf, flush_buf) and writes from buf to log;
+ protected by latch.wr_lock() */
+ ulint write_to_log;
/** Log sequence number when a log file overwrite (broken crash recovery)
- was noticed. Protected by mutex. */
+ was noticed. Protected by latch.wr_lock(). */
lsn_t overwrite_warned;
- /** mutex to serialize access to the flush list when we are putting
- dirty blocks in the list. The idea behind this mutex is to be able
- to release log_sys.mutex during mtr_commit and still ensure that
- insertions in the flush_list happen in the LSN order. */
- alignas(CPU_LEVEL1_DCACHE_LINESIZE) mysql_mutex_t flush_order_mutex;
- /** log_buffer, append data here */
- byte *buf;
- /** log_buffer, writing data to file from this buffer.
- Before flushing write_buf is swapped with flush_buf */
- byte *flush_buf;
- /** Log file stuff. Protected by mutex. */
- struct file {
- /** format of the redo log: e.g., FORMAT_10_5 */
- uint32_t format;
- /** redo log subformat: 0 with separately logged TRUNCATE,
- 2 with fully redo-logged TRUNCATE (1 in MariaDB 10.2) */
- uint32_t subformat;
- /** individual log file size in bytes, including the header */
- lsn_t file_size;
- private:
- /** lsn used to fix coordinates within the log group */
- lsn_t lsn;
- /** the byte offset of the above lsn */
- lsn_t lsn_offset;
- /** log file */
- log_file_t fd;
-
- public:
- /** used only in recovery: recovery scan succeeded up to this
- lsn in this log group */
- lsn_t scanned_lsn;
-
- /** opens log file which must be closed prior this call */
- void open_file(std::string path);
- /** writes header */
- void write_header_durable(lsn_t lsn);
- /** opens log file which must be closed prior this call */
- dberr_t rename(std::string path) { return fd.rename(path); }
- /** reads buffer from log file
- @param[in] offset offset in log file
- @param[in] buf buffer where to read */
- void read(os_offset_t offset, span<byte> buf);
- /** Tells whether writes require calling flush() */
- bool writes_are_durable() const noexcept;
- /** writes buffer to log file
- @param[in] offset offset in log file
- @param[in] buf buffer from which to write */
- void write(os_offset_t offset, span<byte> buf);
- /** flushes OS page cache (excluding metadata!) for log file */
- void flush();
- /** closes log file */
- void close_file();
-
- /** @return whether the redo log is encrypted */
- bool is_encrypted() const { return format & FORMAT_ENCRYPTED; }
- /** @return whether the redo log is in the physical format */
- bool is_physical() const
- { return (format & ~FORMAT_ENCRYPTED) == FORMAT_10_5; }
- /** @return capacity in bytes */
- lsn_t capacity() const{ return file_size - LOG_FILE_HDR_SIZE; }
- /** Calculate the offset of a log sequence number.
- @param[in] lsn log sequence number
- @return offset within the log */
- inline lsn_t calc_lsn_offset(lsn_t lsn) const;
- inline lsn_t calc_lsn_offset_old(lsn_t lsn) const;
-
- /** Set the field values to correspond to a given lsn. */
- void set_fields(lsn_t lsn)
- {
- lsn_t c_lsn_offset = calc_lsn_offset(lsn);
- set_lsn(lsn);
- set_lsn_offset(c_lsn_offset);
- }
-
- /** Read a log segment to log_sys.buf.
- @param[in,out] start_lsn in: read area start,
- out: the last read valid lsn
- @param[in] end_lsn read area end
- @return whether no invalid blocks (e.g checksum mismatch) were found */
- bool read_log_seg(lsn_t* start_lsn, lsn_t end_lsn);
-
- /** Initialize the redo log buffer. */
- void create();
-
- /** Close the redo log buffer. */
- void close() { close_file(); }
- void set_lsn(lsn_t a_lsn);
- lsn_t get_lsn() const { return lsn; }
- void set_lsn_offset(lsn_t a_lsn);
- lsn_t get_lsn_offset() const { return lsn_offset; }
- } log;
-
- /** The fields involved in the log buffer flush @{ */
-
- size_t buf_next_to_write;/*!< first offset in the log buffer
- where the byte content may not exist
- written to file, e.g., the start
- offset of a log record catenated
- later; this is advanced when a flush
- operation is completed to all the log
- groups */
- lsn_t write_lsn; /*!< last written lsn */
- lsn_t current_flush_lsn;/*!< end lsn for the current running
- write + flush operation */
- std::atomic<size_t> pending_flushes; /*!< system calls in progress */
- std::atomic<size_t> flushes; /*!< system calls counter */
-
- ulint n_log_ios; /*!< number of log i/os initiated thus
- far */
- ulint n_log_ios_old; /*!< number of log i/o's at the
- previous printout */
- time_t last_printout_time;/*!< when log_print was last time
- called */
- /* @} */
+ /** innodb_log_buffer_size (size of buf and flush_buf, in bytes) */
+ size_t buf_size;
+
+private:
+ /** spin lock protecting lsn, buf_free in append_prepare() */
+ alignas(CPU_LEVEL1_DCACHE_LINESIZE) pthread_mutex_t lsn_lock;
+ void init_lsn_lock() { pthread_mutex_init(&lsn_lock, LSN_LOCK_ATTR); }
+ void lock_lsn() { pthread_mutex_lock(&lsn_lock); }
+ void unlock_lsn() { pthread_mutex_unlock(&lsn_lock); }
+ void destroy_lsn_lock() { pthread_mutex_destroy(&lsn_lock); }
+
+public:
+ /** first free offset within buf use; protected by lsn_lock */
+ Atomic_relaxed<size_t> buf_free;
+ /** number of write requests (to buf); protected by exclusive lsn_lock */
+ ulint write_to_buf;
+ /** number of waits in append_prepare(); protected by lsn_lock */
+ ulint waits;
+ /** recommended maximum size of buf, after which the buffer is flushed */
+ size_t max_buf_free;
+
+ /** log file size in bytes, including the header */
+ lsn_t file_size;
+private:
+ /** the log sequence number at the start of the log file */
+ lsn_t first_lsn;
+#if defined __linux__ || defined _WIN32
+ /** The physical block size of the storage */
+ uint32_t block_size;
+#endif
+public:
+ /** format of the redo log: e.g., FORMAT_10_8 */
+ uint32_t format;
+ /** Log file */
+ log_file_t log;
+#if defined __linux__ || defined _WIN32
+ /** whether file system caching is enabled for the log */
+ my_bool log_buffered;
+# ifdef _WIN32
+ static constexpr bool log_maybe_unbuffered= true;
+# else
+ /** whether file system caching may be disabled */
+ bool log_maybe_unbuffered;
+# endif
+#endif
/** Fields involved in checkpoints @{ */
lsn_t log_capacity; /*!< capacity of the log; if
@@ -602,12 +281,12 @@ public:
/*!< this is the maximum allowed value
for lsn - last_checkpoint_lsn when a
new query step is started */
- ib_uint64_t next_checkpoint_no;
- /*!< next checkpoint number */
- /** latest completed checkpoint (protected by log_sys.mutex) */
+ /** latest completed checkpoint (protected by latch.wr_lock()) */
Atomic_relaxed<lsn_t> last_checkpoint_lsn;
- /** next checkpoint LSN (protected by log_sys.mutex) */
+ /** next checkpoint LSN (protected by log_sys.latch) */
lsn_t next_checkpoint_lsn;
+ /** next checkpoint number (protected by latch.wr_lock()) */
+ ulint next_checkpoint_no;
/** whether a checkpoint is pending */
Atomic_relaxed<bool> checkpoint_pending;
@@ -615,32 +294,68 @@ public:
byte *checkpoint_buf;
/* @} */
-private:
- bool m_initialised;
-public:
- /**
- Constructor.
+ bool is_initialised() const noexcept { return max_buf_free != 0; }
+
+#ifdef HAVE_PMEM
+ bool is_pmem() const noexcept { return !flush_buf; }
+#else
+ static constexpr bool is_pmem() { return false; }
+#endif
- Some members may require late initialisation, thus we just mark object as
- uninitialised. Real initialisation happens in create().
- */
- log_t(): m_initialised(false) {}
+ bool is_opened() const noexcept { return log.is_opened(); }
- /** @return whether the redo log is encrypted */
- bool is_encrypted() const { return(log.is_encrypted()); }
- /** @return whether the redo log is in the physical format */
- bool is_physical() const { return log.is_physical(); }
+ static constexpr bool resize_in_progress() { return false; }
+
+ /** Rename a log file after resizing.
+ @return whether an error occurred */
+ static bool rename_resized() noexcept;
+
+#if defined __linux__ || defined _WIN32
+ /** Try to enable or disable file system caching (update log_buffered) */
+ void set_buffered(bool buffered);
+#endif
- bool is_initialised() const { return m_initialised; }
+ void attach(log_file_t file, os_offset_t size);
+
+ void close_file();
+
+ /** Calculate the checkpoint safety margins. */
+ static void set_capacity();
lsn_t get_lsn(std::memory_order order= std::memory_order_relaxed) const
{ return lsn.load(order); }
void set_lsn(lsn_t lsn) { this->lsn.store(lsn, std::memory_order_release); }
- lsn_t get_flushed_lsn() const
- { return flushed_to_disk_lsn.load(std::memory_order_acquire); }
- void set_flushed_lsn(lsn_t lsn)
- { flushed_to_disk_lsn.store(lsn, std::memory_order_release); }
+ lsn_t get_flushed_lsn(std::memory_order order= std::memory_order_acquire)
+ const noexcept
+ { return flushed_to_disk_lsn.load(order); }
+
+ /** Initialize the LSN on initial log file creation. */
+ lsn_t init_lsn() noexcept
+ {
+ latch.wr_lock(SRW_LOCK_CALL);
+ const lsn_t lsn{get_lsn()};
+ flushed_to_disk_lsn.store(lsn, std::memory_order_relaxed);
+ write_lsn= lsn;
+ latch.wr_unlock();
+ return lsn;
+ }
+
+ void set_recovered_lsn(lsn_t lsn) noexcept
+ {
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(latch.is_write_locked());
+#endif /* SUX_LOCK_GENERIC */
+ write_lsn= lsn;
+ this->lsn.store(lsn, std::memory_order_relaxed);
+ flushed_to_disk_lsn.store(lsn, std::memory_order_relaxed);
+ }
+
+#ifdef HAVE_PMEM
+ /** Persist the log.
+ @param lsn desired new value of flushed_to_disk_lsn */
+ inline void persist(lsn_t lsn) noexcept;
+#endif
bool check_flush_or_checkpoint() const
{
@@ -650,96 +365,105 @@ public:
void set_check_flush_or_checkpoint(bool flag= true)
{ check_flush_or_checkpoint_.store(flag, std::memory_order_relaxed); }
- bool has_encryption_key_rotation() const {
- return log.format == FORMAT_ENC_10_4 || log.format == FORMAT_ENC_10_5;
- }
+ /** Make previous write_buf() durable and update flushed_to_disk_lsn. */
+ inline bool flush(lsn_t lsn) noexcept;
- /** @return the log block header + trailer size */
- unsigned framing_size() const
- {
- return has_encryption_key_rotation()
- ? LOG_BLOCK_HDR_SIZE + LOG_BLOCK_KEY + LOG_BLOCK_CHECKSUM
- : LOG_BLOCK_HDR_SIZE + LOG_BLOCK_CHECKSUM;
- }
- /** @return the log block payload size */
- unsigned payload_size() const
- {
- return has_encryption_key_rotation()
- ? OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_HDR_SIZE - LOG_BLOCK_CHECKSUM -
- LOG_BLOCK_KEY
- : OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_HDR_SIZE - LOG_BLOCK_CHECKSUM;
- }
- /** @return the log block trailer offset */
- unsigned trailer_offset() const
+ /** Initialise the redo log subsystem. */
+ void create();
+
+ /** Shut down the redo log subsystem. */
+ void close();
+
+#if defined __linux__ || defined _WIN32
+ /** @return the physical block size of the storage */
+ size_t get_block_size() const noexcept
+ { ut_ad(block_size); return block_size; }
+ /** Set the log block size for file I/O. */
+ void set_block_size(uint32_t size) noexcept { block_size= size; }
+#else
+ /** @return the physical block size of the storage */
+ static size_t get_block_size() { return 512; }
+#endif
+
+private:
+ /** Wait in append_prepare() for buffer to become available
+ @param ex whether log_sys.latch is exclusively locked */
+ ATTRIBUTE_COLD static void append_prepare_wait(bool ex) noexcept;
+public:
+ /** Reserve space in the log buffer for appending data.
+ @tparam pmem log_sys.is_pmem()
+ @param size total length of the data to append(), in bytes
+ @param ex whether log_sys.latch is exclusively locked
+ @return the start LSN and the buffer position for append() */
+ template<bool pmem>
+ inline std::pair<lsn_t,byte*> append_prepare(size_t size, bool ex) noexcept;
+
+ /** Append a string of bytes to the redo log.
+ @param d destination
+ @param s string of bytes
+ @param size length of str, in bytes */
+ void append(byte *&d, const void *s, size_t size) noexcept
{
- return has_encryption_key_rotation()
- ? OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_CHECKSUM - LOG_BLOCK_KEY
- : OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_CHECKSUM;
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(latch.is_locked());
+#endif
+ ut_ad(d + size <= buf + (is_pmem() ? file_size : buf_size));
+ memcpy(d, s, size);
+ d+= size;
}
- size_t get_pending_flushes() const
+ /** Set the log file format. */
+ void set_latest_format(bool encrypted) noexcept
+ { format= encrypted ? FORMAT_ENC_10_8 : FORMAT_10_8; }
+ /** @return whether the redo log is encrypted */
+ bool is_encrypted() const noexcept { return format & FORMAT_ENCRYPTED; }
+ /** @return whether the redo log is in the latest format */
+ bool is_latest() const noexcept
+ { return (~FORMAT_ENCRYPTED & format) == FORMAT_10_8; }
+
+ /** @return capacity in bytes */
+ lsn_t capacity() const noexcept { return file_size - START_OFFSET; }
+
+ /** Set the LSN of the log file at file creation. */
+ void set_first_lsn(lsn_t lsn) noexcept { write_lsn= first_lsn= lsn; }
+ /** @return the first LSN of the log file */
+ lsn_t get_first_lsn() const noexcept { return first_lsn; }
+
+ /** Determine the sequence bit at a log sequence number */
+ byte get_sequence_bit(lsn_t lsn) const noexcept
{
- return pending_flushes.load(std::memory_order_relaxed);
+ ut_ad(lsn >= first_lsn);
+ return !(((lsn - first_lsn) / capacity()) & 1);
}
- size_t get_flushes() const
+ /** Calculate the offset of a log sequence number.
+ @param lsn log sequence number
+ @return byte offset within ib_logfile0 */
+ lsn_t calc_lsn_offset(lsn_t lsn) const noexcept
{
- return flushes.load(std::memory_order_relaxed);
+ ut_ad(lsn >= first_lsn);
+ return START_OFFSET + (lsn - first_lsn) % capacity();
}
- /** Initialise the redo log subsystem. */
- void create();
+ /** Write checkpoint information and invoke latch.wr_unlock().
+ @param end_lsn start LSN of the FILE_CHECKPOINT mini-transaction */
+ inline void write_checkpoint(lsn_t end_lsn) noexcept;
- /** Shut down the redo log subsystem. */
- void close();
+ /** Write buf to ib_logfile0.
+ @tparam release_latch whether to invoke latch.wr_unlock()
+ @return new write target
+ @retval 0 if everything was written */
+ template<bool release_latch> inline lsn_t write_buf() noexcept;
+
+ /** Create the log. */
+ void create(lsn_t lsn) noexcept;
};
/** Redo log system */
extern log_t log_sys;
-#ifdef UNIV_DEBUG
-extern bool log_write_lock_own();
-#endif
-
-/** Calculate the offset of a log sequence number.
-@param[in] lsn log sequence number
-@return offset within the log */
-inline lsn_t log_t::file::calc_lsn_offset(lsn_t lsn) const
-{
- ut_ad(this == &log_sys.log);
- /* The lsn parameters are updated while holding both the mutexes
- and it is ok to have either of them while reading */
-#ifdef SAFE_MUTEX
- ut_ad(mysql_mutex_is_owner(&log_sys.mutex) || log_write_lock_own());
-#endif /* SAFE_MUTEX */
- const lsn_t size = capacity();
- lsn_t l= lsn - this->lsn;
- if (longlong(l) < 0) {
- l = lsn_t(-longlong(l)) % size;
- l = size - l;
- }
-
- l+= lsn_offset - LOG_FILE_HDR_SIZE * (1 + lsn_offset / file_size);
- l %= size;
- return l + LOG_FILE_HDR_SIZE * (1 + l / (file_size - LOG_FILE_HDR_SIZE));
-}
-inline void log_t::file::set_lsn(lsn_t a_lsn)
+inline void log_free_check()
{
-#ifdef SAFE_MUTEX
- ut_ad(mysql_mutex_is_owner(&log_sys.mutex) || log_write_lock_own());
-#endif /* SAFE_MUTEX */
- lsn= a_lsn;
+ if (log_sys.check_flush_or_checkpoint())
+ log_check_margins();
}
-
-inline void log_t::file::set_lsn_offset(lsn_t a_lsn)
-{
-#ifdef SAFE_MUTEX
- ut_ad(mysql_mutex_is_owner(&log_sys.mutex) || log_write_lock_own());
-#endif /* SAFE_MUTEX */
- ut_ad((lsn % OS_FILE_LOG_BLOCK_SIZE) == (a_lsn % OS_FILE_LOG_BLOCK_SIZE));
- lsn_offset= a_lsn;
-}
-
-#include "log0log.inl"
-
-#endif
diff --git a/storage/innobase/include/log0log.inl b/storage/innobase/include/log0log.inl
deleted file mode 100644
index c29c0bfa55f..00000000000
--- a/storage/innobase/include/log0log.inl
+++ /dev/null
@@ -1,311 +0,0 @@
-/*****************************************************************************
-
-Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2017, 2020, MariaDB Corporation.
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; version 2 of the License.
-
-This program is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
-
-*****************************************************************************/
-
-/**************************************************//**
-@file include/log0log.ic
-Database log
-
-Created 12/9/1995 Heikki Tuuri
-*******************************************************/
-
-#include "mach0data.h"
-#include "assume_aligned.h"
-#include "ut0crc32.h"
-
-extern ulong srv_log_buffer_size;
-
-/************************************************************//**
-Gets a log block flush bit.
-@return TRUE if this block was the first to be written in a log flush */
-UNIV_INLINE
-ibool
-log_block_get_flush_bit(
-/*====================*/
- const byte* log_block) /*!< in: log block */
-{
- static_assert(LOG_BLOCK_HDR_NO == 0, "compatibility");
- static_assert(LOG_BLOCK_FLUSH_BIT_MASK == 0x80000000, "compatibility");
-
- return *log_block & 0x80;
-}
-
-/************************************************************//**
-Sets the log block flush bit. */
-UNIV_INLINE
-void
-log_block_set_flush_bit(
-/*====================*/
- byte* log_block, /*!< in/out: log block */
- ibool val) /*!< in: value to set */
-{
- static_assert(LOG_BLOCK_HDR_NO == 0, "compatibility");
- static_assert(LOG_BLOCK_FLUSH_BIT_MASK == 0x80000000, "compatibility");
-
- if (val)
- *log_block|= 0x80;
- else
- *log_block&= 0x7f;
-}
-
-/************************************************************//**
-Gets a log block number stored in the header.
-@return log block number stored in the block header */
-UNIV_INLINE
-ulint
-log_block_get_hdr_no(
-/*=================*/
- const byte* log_block) /*!< in: log block */
-{
- static_assert(LOG_BLOCK_HDR_NO == 0, "compatibility");
- return mach_read_from_4(my_assume_aligned<4>(log_block)) &
- ~LOG_BLOCK_FLUSH_BIT_MASK;
-}
-
-/************************************************************//**
-Sets the log block number stored in the header; NOTE that this must be set
-before the flush bit! */
-UNIV_INLINE
-void
-log_block_set_hdr_no(
-/*=================*/
- byte* log_block, /*!< in/out: log block */
- ulint n) /*!< in: log block number: must be > 0 and
- < LOG_BLOCK_FLUSH_BIT_MASK */
-{
- static_assert(LOG_BLOCK_HDR_NO == 0, "compatibility");
- ut_ad(n > 0);
- ut_ad(n < LOG_BLOCK_FLUSH_BIT_MASK);
-
- mach_write_to_4(my_assume_aligned<4>(log_block), n);
-}
-
-/************************************************************//**
-Gets a log block data length.
-@return log block data length measured as a byte offset from the block start */
-UNIV_INLINE
-ulint
-log_block_get_data_len(
-/*===================*/
- const byte* log_block) /*!< in: log block */
-{
- return mach_read_from_2(my_assume_aligned<2>
- (log_block + LOG_BLOCK_HDR_DATA_LEN));
-}
-
-/************************************************************//**
-Sets the log block data length. */
-UNIV_INLINE
-void
-log_block_set_data_len(
-/*===================*/
- byte* log_block, /*!< in/out: log block */
- ulint len) /*!< in: data length */
-{
- mach_write_to_2(my_assume_aligned<2>(log_block + LOG_BLOCK_HDR_DATA_LEN),
- len);
-}
-
-/************************************************************//**
-Gets a log block first mtr log record group offset.
-@return first mtr log record group byte offset from the block start, 0
-if none */
-UNIV_INLINE
-ulint
-log_block_get_first_rec_group(
-/*==========================*/
- const byte* log_block) /*!< in: log block */
-{
- return mach_read_from_2(my_assume_aligned<2>
- (log_block + LOG_BLOCK_FIRST_REC_GROUP));
-}
-
-/************************************************************//**
-Sets the log block first mtr log record group offset. */
-UNIV_INLINE
-void
-log_block_set_first_rec_group(
-/*==========================*/
- byte* log_block, /*!< in/out: log block */
- ulint offset) /*!< in: offset, 0 if none */
-{
- mach_write_to_2(my_assume_aligned<2>
- (log_block + LOG_BLOCK_FIRST_REC_GROUP), offset);
-}
-
-/************************************************************//**
-Gets a log block checkpoint number field (4 lowest bytes).
-@return checkpoint no (4 lowest bytes) */
-UNIV_INLINE
-ulint
-log_block_get_checkpoint_no(
-/*========================*/
- const byte* log_block) /*!< in: log block */
-{
- return mach_read_from_4(my_assume_aligned<4>
- (log_block + LOG_BLOCK_CHECKPOINT_NO));
-}
-
-/************************************************************//**
-Sets a log block checkpoint number field (4 lowest bytes). */
-UNIV_INLINE
-void
-log_block_set_checkpoint_no(
-/*========================*/
- byte* log_block, /*!< in/out: log block */
- ib_uint64_t no) /*!< in: checkpoint no */
-{
- mach_write_to_4(my_assume_aligned<4>(log_block + LOG_BLOCK_CHECKPOINT_NO),
- static_cast<uint32_t>(no));
-}
-
-/************************************************************//**
-Converts a lsn to a log block number.
-@return log block number, it is > 0 and <= 1G */
-UNIV_INLINE
-ulint
-log_block_convert_lsn_to_no(
-/*========================*/
- lsn_t lsn) /*!< in: lsn of a byte within the block */
-{
- return(((ulint) (lsn / OS_FILE_LOG_BLOCK_SIZE) &
- DBUG_EVALUATE_IF("innodb_small_log_block_no_limit",
- 0xFUL, 0x3FFFFFFFUL)) + 1);
-}
-
-/** Calculate the CRC-32C checksum of a log block.
-@param[in] block log block
-@return checksum */
-inline ulint log_block_calc_checksum_crc32(const byte* block)
-{
- return ut_crc32(block, OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_CHECKSUM);
-}
-
-/************************************************************//**
-Gets a log block checksum field value.
-@return checksum */
-UNIV_INLINE
-ulint
-log_block_get_checksum(
-/*===================*/
- const byte* log_block) /*!< in: log block */
-{
- return mach_read_from_4(my_assume_aligned<4>
- (OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_CHECKSUM +
- log_block));
-}
-
-/************************************************************//**
-Sets a log block checksum field value. */
-UNIV_INLINE
-void
-log_block_set_checksum(
-/*===================*/
- byte* log_block, /*!< in/out: log block */
- ulint checksum) /*!< in: checksum */
-{
- mach_write_to_4(my_assume_aligned<4>
- (OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_CHECKSUM +
- log_block), checksum);
-}
-
-/************************************************************//**
-Initializes a log block in the log buffer. */
-UNIV_INLINE
-void
-log_block_init(
-/*===========*/
- byte* log_block, /*!< in: pointer to the log buffer */
- lsn_t lsn) /*!< in: lsn within the log block */
-{
- ulint no;
-
- no = log_block_convert_lsn_to_no(lsn);
-
- log_block_set_hdr_no(log_block, no);
-
- log_block_set_data_len(log_block, LOG_BLOCK_HDR_SIZE);
- log_block_set_first_rec_group(log_block, 0);
-}
-
-/** Append a string to the log.
-@param[in] str string
-@param[in] len string length
-@param[out] start_lsn start LSN of the log record
-@return end lsn of the log record, zero if did not succeed */
-UNIV_INLINE
-lsn_t
-log_reserve_and_write_fast(
- const void* str,
- ulint len,
- lsn_t* start_lsn)
-{
- mysql_mutex_assert_owner(&log_sys.mutex);
- ut_ad(len > 0);
-
- const ulint data_len = len
- + log_sys.buf_free % OS_FILE_LOG_BLOCK_SIZE;
-
- if (data_len >= log_sys.trailer_offset()) {
-
- /* The string does not fit within the current log block
- or the log block would become full */
-
- return(0);
- }
-
- lsn_t lsn = log_sys.get_lsn();
- *start_lsn = lsn;
-
- memcpy(log_sys.buf + log_sys.buf_free, str, len);
-
- log_block_set_data_len(
- reinterpret_cast<byte*>(ut_align_down(
- log_sys.buf + log_sys.buf_free,
- OS_FILE_LOG_BLOCK_SIZE)),
- data_len);
-
- log_sys.buf_free += len;
-
- ut_ad(log_sys.buf_free <= size_t{srv_log_buffer_size});
-
- lsn += len;
- log_sys.set_lsn(lsn);
-
- return lsn;
-}
-
-/***********************************************************************//**
-Checks if there is need for a log buffer flush or a new checkpoint, and does
-this if yes. Any database operation should call this when it has modified
-more than about 4 pages. NOTE that this function may only be called when the
-OS thread owns no synchronization objects except dict_sys.latch. */
-UNIV_INLINE
-void
-log_free_check(void)
-/*================*/
-{
- /* During row_log_table_apply(), this function will be called while we
- are holding some latches. This is OK, as long as we are not holding
- any latches on buffer blocks. */
-
- if (log_sys.check_flush_or_checkpoint()) {
-
- log_check_margins();
- }
-}
diff --git a/storage/innobase/include/log0recv.h b/storage/innobase/include/log0recv.h
index 5e8dc1c0160..e787d81e8c2 100644
--- a/storage/innobase/include/log0recv.h
+++ b/storage/innobase/include/log0recv.h
@@ -37,13 +37,6 @@ Created 9/20/1997 Heikki Tuuri
/** @return whether recovery is currently running. */
#define recv_recovery_is_on() UNIV_UNLIKELY(recv_sys.recovery_on)
-/** Find the latest checkpoint in the log header.
-@param[out] max_field LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2
-@return error code or DB_SUCCESS */
-dberr_t
-recv_find_max_checkpoint(ulint* max_field)
- MY_ATTRIBUTE((nonnull, warn_unused_result));
-
ATTRIBUTE_COLD MY_ATTRIBUTE((nonnull, warn_unused_result))
/** Apply any buffered redo log to a page that was just read from a data file.
@param[in,out] space tablespace
@@ -52,12 +45,9 @@ ATTRIBUTE_COLD MY_ATTRIBUTE((nonnull, warn_unused_result))
bool recv_recover_page(fil_space_t* space, buf_page_t* bpage);
/** Start recovering from a redo log checkpoint.
-@param[in] flush_lsn FIL_PAGE_FILE_FLUSH_LSN
of first system tablespace page
@return error code or DB_SUCCESS */
-dberr_t
-recv_recovery_from_checkpoint_start(
- lsn_t flush_lsn);
+dberr_t recv_recovery_from_checkpoint_start();
/** Whether to store redo log records in recv_sys.pages */
enum store_t {
@@ -70,17 +60,6 @@ enum store_t {
};
-/** Adds data from a new log block to the parsing buffer of recv_sys if
-recv_sys.parse_start_lsn is non-zero.
-@param[in] log_block log block to add
-@param[in] scanned_lsn lsn of how far we were able to find
- data in this log block
-@return true if more data added */
-bool recv_sys_add_to_parsing_buf(const byte* log_block, lsn_t scanned_lsn);
-
-/** Moves the parsing buffer data left to the buffer start */
-void recv_sys_justify_left_parsing_buf();
-
/** Report an operation to create, delete, or rename a file during backup.
@param[in] space_id tablespace identifier
@param[in] type file operation redo log type
@@ -88,7 +67,7 @@ void recv_sys_justify_left_parsing_buf();
@param[in] len length of name, in bytes
@param[in] new_name new file name (NULL if not rename)
@param[in] new_len length of new_name, in bytes (0 if NULL) */
-extern void (*log_file_op)(ulint space_id, int type,
+extern void (*log_file_op)(uint32_t space_id, int type,
const byte* name, ulint len,
const byte* new_name, ulint new_len);
@@ -99,7 +78,7 @@ extern void (*undo_space_trunc)(uint32_t space_id);
/** Report an operation which does INIT_PAGE for page0 during backup.
@param space_id tablespace identifier */
-extern void (*first_page_init)(ulint space_id);
+extern void (*first_page_init)(uint32_t space_id);
/** Stored redo log record */
struct log_rec_t
@@ -233,35 +212,24 @@ private:
during log scan or apply */
bool found_corrupt_fs;
public:
+ /** @return maximum guaranteed size of a mini-transaction on recovery */
+ static constexpr size_t MTR_SIZE_MAX{1U << 20};
+
/** whether we are applying redo log records during crash recovery */
bool recovery_on;
/** whether recv_recover_page(), invoked from buf_page_t::read_complete(),
should apply log records*/
bool apply_log_recs;
- byte* buf; /*!< buffer for parsing log records */
- ulint len; /*!< amount of data in buf */
- lsn_t parse_start_lsn;
- /*!< this is the lsn from which we were able to
- start parsing log records and adding them to
- pages; zero if a suitable
- start point not found yet */
- lsn_t scanned_lsn;
- /*!< the log data has been scanned up to this
- lsn */
- ulint scanned_checkpoint_no;
- /*!< the log data has been scanned up to this
- checkpoint number (lowest 4 bytes) */
- ulint recovered_offset;
- /*!< start offset of non-parsed log records in
- buf */
- lsn_t recovered_lsn;
- /*!< the log records have been parsed up to
- this lsn */
- lsn_t mlog_checkpoint_lsn;
- /*!< the LSN of a FILE_CHECKPOINT
- record, or 0 if none was parsed */
- /** the time when progress was last reported */
- time_t progress_time;
+ /** number of bytes in log_sys.buf */
+ size_t len;
+ /** start offset of non-parsed log records in log_sys.buf */
+ size_t offset;
+ /** log sequence number of the first non-parsed record */
+ lsn_t lsn;
+ /** log sequence number at the end of the FILE_CHECKPOINT record, or 0 */
+ lsn_t file_checkpoint;
+ /** the time when progress was last reported */
+ time_t progress_time;
using map = std::map<const page_id_t, page_recv_t,
std::less<const page_id_t>,
@@ -289,10 +257,10 @@ public:
/** The contents of the doublewrite buffer */
recv_dblwr_t dblwr;
- /** Last added LSN to pages. */
+ /** Last added LSN to pages, before switching to STORE_NO */
lsn_t last_stored_lsn= 0;
- void read(os_offset_t offset, span<byte> buf);
+ inline void read(os_offset_t offset, span<byte> buf);
inline size_t files_size();
void close_files() { files.clear(); files.shrink_to_fit(); }
@@ -318,17 +286,13 @@ private:
from before MariaDB Server 10.5.1) */
std::vector<log_file_t> files;
- void open_log_files_if_needed();
-
/** Base node of the redo block list.
List elements are linked via buf_block_t::unzip_LRU. */
UT_LIST_BASE_NODE_T(buf_block_t) blocks;
public:
/** Check whether the number of read redo log blocks exceeds the maximum.
- Store last_stored_lsn if the recovery is not in the last phase.
- @param[in,out] store whether to store page operations
@return whether the memory is exhausted */
- inline bool is_memory_exhausted(store_t *store);
+ inline bool is_memory_exhausted();
/** Apply buffered log to persistent data pages.
@param last_batch whether it is possible to write more redo log */
void apply(bool last_batch);
@@ -348,22 +312,42 @@ public:
bool is_initialised() const { return last_stored_lsn != 0; }
+ /** Find the latest checkpoint.
+ @return error code or DB_SUCCESS */
+ dberr_t find_checkpoint();
+
/** Register a redo log snippet for a page.
@param it page iterator
@param start_lsn start LSN of the mini-transaction
@param lsn @see mtr_t::commit_lsn()
- @param l redo log snippet @see log_t::FORMAT_10_5
+ @param l redo log snippet
@param len length of l, in bytes */
inline void add(map::iterator it, lsn_t start_lsn, lsn_t lsn,
const byte *l, size_t len);
- /** Parse and register one mini-transaction in log_t::FORMAT_10_5.
- @param checkpoint_lsn the log sequence number of the latest checkpoint
- @param store whether to store the records
- @param apply whether to apply file-level log records
- @return whether FILE_CHECKPOINT record was seen the first time,
- or corruption was noticed */
- bool parse(lsn_t checkpoint_lsn, store_t *store, bool apply);
+ enum parse_mtr_result { OK, PREMATURE_EOF, GOT_EOF };
+
+private:
+ /** Parse and register one log_t::FORMAT_10_8 mini-transaction.
+ @param store whether to store the records
+ @param l log data source */
+ template<typename source>
+ inline parse_mtr_result parse(store_t store, source& l) noexcept;
+public:
+ /** Parse and register one log_t::FORMAT_10_8 mini-transaction,
+ handling log_sys.is_pmem() buffer wrap-around.
+ @param store whether to store the records */
+ static parse_mtr_result parse_mtr(store_t store) noexcept;
+
+ /** Parse and register one log_t::FORMAT_10_8 mini-transaction,
+ handling log_sys.is_pmem() buffer wrap-around.
+ @param store whether to store the records */
+ static parse_mtr_result parse_pmem(store_t store) noexcept
+#ifdef HAVE_PMEM
+ ;
+#else
+ { return parse_mtr(store); }
+#endif
/** Clear a fully processed set of stored redo log records. */
inline void clear();
@@ -446,20 +430,12 @@ extern bool recv_no_ibuf_operations;
/** TRUE when recv_init_crash_recovery() has been called. */
extern bool recv_needed_recovery;
#ifdef UNIV_DEBUG
-/** TRUE if writing to the redo log (mtr_commit) is forbidden.
-Protected by log_sys.mutex. */
-extern bool recv_no_log_write;
+/** whether writing to the redo log is forbidden;
+protected by exclusive log_sys.latch. */
+extern bool recv_no_log_write;
#endif /* UNIV_DEBUG */
/** TRUE if buf_page_is_corrupted() should check if the log sequence
number (FIL_PAGE_LSN) is in the future. Initially FALSE, and set by
recv_recovery_from_checkpoint_start(). */
extern bool recv_lsn_checks_on;
-
-/** Size of the parsing buffer; it must accommodate RECV_SCAN_SIZE many
-times! */
-#define RECV_PARSING_BUF_SIZE (2U << 20)
-
-/** Size of block reads when the log groups are scanned forward to do a
-roll-forward */
-#define RECV_SCAN_SIZE (4U << srv_page_size_shift)
diff --git a/storage/innobase/include/mtr0log.h b/storage/innobase/include/mtr0log.h
index d34a62e7bb2..e2419309764 100644
--- a/storage/innobase/include/mtr0log.h
+++ b/storage/innobase/include/mtr0log.h
@@ -53,7 +53,8 @@ inline uint8_t mlog_decode_varint_length(byte first)
@param log redo log record buffer
@return the decoded integer
@retval MLOG_DECODE_ERROR on error */
-inline uint32_t mlog_decode_varint(const byte* log)
+template<typename byte_pointer>
+inline uint32_t mlog_decode_varint(const byte_pointer log)
{
uint32_t i= *log;
if (i < MIN_2BYTE)
diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h
index 60e01abe18d..b8df6d9f63e 100644
--- a/storage/innobase/include/mtr0mtr.h
+++ b/storage/innobase/include/mtr0mtr.h
@@ -101,10 +101,11 @@ struct mtr_t {
/** Commit a mini-transaction that did not modify any pages,
but generated some redo log on a higher level, such as
FILE_MODIFY records and an optional FILE_CHECKPOINT marker.
- The caller must hold log_sys.mutex.
+ The caller must hold exclusive log_sys.latch.
This is to be used at log_checkpoint().
- @param checkpoint_lsn the log sequence number of a checkpoint, or 0 */
- void commit_files(lsn_t checkpoint_lsn= 0);
+ @param checkpoint_lsn the log sequence number of a checkpoint, or 0
+ @return current LSN */
+ lsn_t commit_files(lsn_t checkpoint_lsn= 0);
/** @return mini-transaction savepoint (current size of m_memo) */
ulint get_savepoint() const
@@ -204,10 +205,10 @@ struct mtr_t {
(needed for generating a FILE_MODIFY record)
@param[in] space_id user or system tablespace ID
@return the tablespace */
- fil_space_t* set_named_space_id(ulint space_id)
+ fil_space_t* set_named_space_id(uint32_t space_id)
{
ut_ad(!m_user_space_id);
- ut_d(m_user_space_id = static_cast<uint32_t>(space_id));
+ ut_d(m_user_space_id = space_id);
if (!space_id) {
return fil_system.sys_space;
} else {
@@ -225,7 +226,7 @@ struct mtr_t {
void set_named_space(fil_space_t* space)
{
ut_ad(!m_user_space_id);
- ut_d(m_user_space_id = static_cast<uint32_t>(space->id));
+ ut_d(m_user_space_id = space->id);
if (space->id) {
m_user_space = space;
}
@@ -236,7 +237,7 @@ struct mtr_t {
(needed for generating a FILE_MODIFY record)
@param[in] space tablespace
@return whether the mini-transaction is associated with the space */
- bool is_named_space(ulint space) const;
+ bool is_named_space(uint32_t space) const;
/** Check the tablespace associated with the mini-transaction
(needed for generating a FILE_MODIFY record)
@param[in] space tablespace
@@ -244,10 +245,10 @@ struct mtr_t {
bool is_named_space(const fil_space_t* space) const;
#endif /* UNIV_DEBUG */
- /** Acquire a tablespace X-latch.
- @param[in] space_id tablespace ID
- @return the tablespace object (never NULL) */
- fil_space_t* x_lock_space(ulint space_id);
+ /** Acquire a tablespace X-latch.
+ @param space_id tablespace ID
+ @return the tablespace object (never NULL) */
+ fil_space_t *x_lock_space(uint32_t space_id);
/** Acquire a shared rw-latch. */
void s_lock(
@@ -316,12 +317,9 @@ public:
/** @return true if we are inside the change buffer code */
bool is_inside_ibuf() const { return m_inside_ibuf; }
- /** Note that pages has been trimed */
+ /** Note that some pages have been freed */
void set_trim_pages() { m_trim_pages= true; }
- /** @return true if pages has been trimed */
- bool is_trim_pages() { return m_trim_pages; }
-
/** Latch a buffer pool block.
@param block block to be latched
@param rw_latch RW_S_LATCH, RW_SX_LATCH, RW_X_LATCH, RW_NO_LATCH */
@@ -620,7 +618,7 @@ public:
@param space_id tablespace identifier
@param path file path
@param new_path new file path for type=FILE_RENAME */
- inline void log_file_op(mfile_type_t type, ulint space_id,
+ inline void log_file_op(mfile_type_t type, uint32_t space_id,
const char *path,
const char *new_path= nullptr);
@@ -644,6 +642,9 @@ public:
@return number of buffer count added by this mtr */
uint32_t get_fix_count(const buf_block_t *block) const;
+ /** Note that log_sys.latch is no longer being held exclusively. */
+ void flag_wr_unlock() noexcept { ut_ad(m_latch_ex); m_latch_ex= false; }
+
/** type of page flushing is needed during commit() */
enum page_flush_ahead
{
@@ -656,6 +657,11 @@ public:
};
private:
+ /** Handle any pages that were freed during the mini-transaction. */
+ void process_freed_pages();
+ /** Release modified pages when no log was written. */
+ void release_unlogged();
+
/** Log a write of a byte string to a page.
@param block buffer page
@param offset byte offset within page
@@ -681,6 +687,13 @@ private:
@param type extended record subtype; @see mrec_ext_t */
inline void log_write_extended(const buf_block_t &block, byte type);
+ /** Write a FILE_MODIFY record when a non-predefined persistent
+ tablespace was modified for the first time since fil_names_clear(). */
+ ATTRIBUTE_NOINLINE ATTRIBUTE_COLD void name_write();
+
+ /** Encrypt the log */
+ ATTRIBUTE_NOINLINE void encrypt();
+
/** Append the redo log records to the redo log buffer.
@return {start_lsn,flush_ahead} */
std::pair<lsn_t,page_flush_ahead> do_write();
@@ -688,7 +701,7 @@ private:
/** Append the redo log records to the redo log buffer.
@param len number of bytes to write
@return {start_lsn,flush_ahead} */
- inline std::pair<lsn_t,page_flush_ahead> finish_write(ulint len);
+ std::pair<lsn_t,page_flush_ahead> finish_write(size_t len);
/** Release all latches. */
void release();
@@ -714,7 +727,7 @@ private:
/** whether freeing_tree() has been called */
bool m_freeing_tree= false;
#endif
-
+private:
/** The page of the most recent m_log record written, or NULL */
const buf_page_t* m_last;
/** The current byte offset in m_last, or 0 */
@@ -729,6 +742,9 @@ private:
/** whether at least one previously clean buffer pool page was written to */
uint16_t m_made_dirty:1;
+ /** whether log_sys.latch is locked exclusively */
+ uint16_t m_latch_ex:1;
+
/** whether change buffer is latched; only needed in non-debug builds
to suppress some read-ahead operations, @see ibuf_inside() */
uint16_t m_inside_ibuf:1;
@@ -736,6 +752,9 @@ private:
/** whether the pages has been trimmed */
uint16_t m_trim_pages:1;
+ /** CRC-32C of m_log */
+ uint32_t m_crc;
+
#ifdef UNIV_DEBUG
/** Persistent user tablespace associated with the
mini-transaction, or 0 (TRX_SYS_SPACE) if none yet */
diff --git a/storage/innobase/include/mtr0types.h b/storage/innobase/include/mtr0types.h
index 465c20fe7d2..19db13a12b6 100644
--- a/storage/innobase/include/mtr0types.h
+++ b/storage/innobase/include/mtr0types.h
@@ -52,17 +52,17 @@ enum mtr_log_t {
/*
A mini-transaction is a stream of records that is always terminated by
-a NUL byte. The first byte of a mini-transaction record is never NUL,
-but NUL bytes can occur within mini-transaction records. The first
-bytes of each record will explicitly encode the length of the record.
-NUL bytes also acts as padding in log blocks, that is, there can be
-multiple sucessive NUL bytes between mini-transactions in a redo log
-block.
+a byte 0x00 or 0x01. The first byte of a mini-transaction record is
+never one of these bytes, but these bytes can occur within mini-transaction
+records.
The first byte of the record would contain a record type, flags, and a
part of length. The optional second byte of the record will contain
more length. (Not needed for short records.)
+For example, because the length of an INIT_PAGE record is 3 to 11 bytes,
+the first byte will be 0x02 to 0x0a, indicating the number of subsequent bytes.
+
Bit 7 of the first byte of a redo log record is the same_page flag.
If same_page=1, the record is referring to the same page as the
previous record. Records that do not refer to data pages but to file
@@ -187,8 +187,11 @@ A subsequent WRITE to the same page could be logged 0xb5 0x7f 0x23
0x34 0x56 0x78, meaning "same page, type code 3 (WRITE), 5 bytes to
follow", "byte offset 0x7f"+0x60+2, bytes 0x23,0x34,0x56,0x78.
-The end of the mini-transaction would be indicated by a NUL byte.
-*/
+The end of the mini-transaction would be indicated by the end byte
+0x00 or 0x01; @see log_sys.get_sequence_bit().
+If log_sys.is_encrypted(), that is followed by 8 bytes of nonce
+(part of initialization vector). That will be followed by 4 bytes
+of CRC-32C of the entire mini-tranasction, excluding the end byte. */
/** Redo log record types. These bit patterns (3 bits) will be written
to the redo log file, so the existing codes or their interpretation on
@@ -305,14 +308,16 @@ enum mfile_type_t
FILE_RENAME = 0xa0,
/** Modify a file. Followed by tablespace ID and the file name. */
FILE_MODIFY = 0xb0,
- /** End-of-checkpoint marker. Followed by 2 dummy bytes of page identifier,
- 8 bytes of LSN, and padded with a NUL; @see SIZE_OF_FILE_CHECKPOINT. */
+ /** End-of-checkpoint marker, at the end of a mini-transaction.
+ Followed by 2 NUL bytes of page identifier and 8 bytes of LSN;
+ @see SIZE_OF_FILE_CHECKPOINT.
+ When all bytes are NUL, this is a dummy padding record. */
FILE_CHECKPOINT = 0xf0
};
/** Size of a FILE_CHECKPOINT record, including the trailing byte to
-terminate the mini-transaction. */
-constexpr byte SIZE_OF_FILE_CHECKPOINT= 3/*type,page_id*/ + 8/*LSN*/ + 1;
+terminate the mini-transaction and the CRC-32C. */
+constexpr byte SIZE_OF_FILE_CHECKPOINT= 3/*type,page_id*/ + 8/*LSN*/ + 1 + 4;
#ifndef UNIV_INNOCHECKSUM
/** Types for the mlock objects to store in the mtr_t::m_memo */
diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h
index d64ad9feb87..c0e5f7683a9 100644
--- a/storage/innobase/include/os0file.h
+++ b/storage/innobase/include/os0file.h
@@ -107,15 +107,6 @@ struct pfs_os_file_t
#endif
};
-/** The next value should be smaller or equal to the smallest sector size used
-on any disk. A log block is required to be a portion of disk which is written
-so that if the start and the end of a block get written to disk, then the
-whole block gets written. This should be true even in most cases of a crash:
-if this fails for a log block, then it is equivalent to a media failure in the
-log. */
-
-#define OS_FILE_LOG_BLOCK_SIZE 512U
-
/** Options for os_file_create_func @{ */
enum os_file_create_t {
OS_FILE_OPEN = 51, /*!< to open an existing file (if
@@ -464,7 +455,6 @@ bool os_file_close_func(os_file_t file);
/* Keys to register InnoDB I/O with performance schema */
extern mysql_pfs_key_t innodb_data_file_key;
-extern mysql_pfs_key_t innodb_log_file_key;
extern mysql_pfs_key_t innodb_temp_file_key;
/* Following four macros are instumentations to register
diff --git a/storage/innobase/include/page0cur.inl b/storage/innobase/include/page0cur.inl
index 1638b5749ff..7c4eafa266a 100644
--- a/storage/innobase/include/page0cur.inl
+++ b/storage/innobase/include/page0cur.inl
@@ -197,6 +197,7 @@ page_cur_tuple_insert(
rec = page_cur_insert_rec_low(cursor, rec, *offsets, mtr);
}
- ut_ad(!rec || !cmp_dtuple_rec(tuple, rec, *offsets));
+ ut_ad(!rec || !cmp_dtuple_rec(tuple, rec, cursor->index, *offsets));
return(rec);
}
+
diff --git a/storage/innobase/include/page0page.h b/storage/innobase/include/page0page.h
index 0ad42474f84..2978656b508 100644
--- a/storage/innobase/include/page0page.h
+++ b/storage/innobase/include/page0page.h
@@ -1092,7 +1092,7 @@ page_find_rec_with_heap_no(
@param[in] page index tree leaf page
@return the last record, not delete-marked
@retval infimum record if all records are delete-marked */
-const rec_t *page_find_rec_max_not_deleted(const page_t *page);
+const rec_t *page_find_rec_last_not_deleted(const page_t *page);
#endif /* !UNIV_INNOCHECKSUM */
diff --git a/storage/innobase/include/rem0cmp.h b/storage/innobase/include/rem0cmp.h
index 6f2201971d1..3a30f5a92f3 100644
--- a/storage/innobase/include/rem0cmp.h
+++ b/storage/innobase/include/rem0cmp.h
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2017, 2020, MariaDB Corporation.
+Copyright (c) 2017, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -24,8 +24,7 @@ Comparison services for records
Created 7/1/1994 Heikki Tuuri
************************************************************************/
-#ifndef rem0cmp_h
-#define rem0cmp_h
+#pragma once
#include "data0data.h"
#include "data0type.h"
@@ -43,39 +42,40 @@ cmp_cols_are_equal(
ibool check_charsets);
/*!< in: whether to check charsets */
/** Compare two data fields.
-@param[in] mtype main type
-@param[in] prtype precise type
-@param[in] data1 data field
-@param[in] len1 length of data1 in bytes, or UNIV_SQL_NULL
-@param[in] data2 data field
-@param[in] len2 length of data2 in bytes, or UNIV_SQL_NULL
+@param mtype main type
+@param prtype precise type
+@param descending whether to use descending order
+@param data1 data field
+@param len1 length of data1 in bytes, or UNIV_SQL_NULL
+@param data2 data field
+@param len2 length of data2 in bytes, or UNIV_SQL_NULL
@return the comparison result of data1 and data2
@retval 0 if data1 is equal to data2
@retval negative if data1 is less than data2
@retval positive if data1 is greater than data2 */
-int
-cmp_data_data(
- ulint mtype,
- ulint prtype,
- const byte* data1,
- ulint len1,
- const byte* data2,
- ulint len2)
- MY_ATTRIBUTE((warn_unused_result));
+int cmp_data(ulint mtype, ulint prtype, bool descending,
+ const byte *data1, size_t len1, const byte *data2, size_t len2)
+ MY_ATTRIBUTE((warn_unused_result));
/** Compare two data fields.
-@param[in] dfield1 data field; must have type field set
-@param[in] dfield2 data field
+@param dfield1 data field; must have type field set
+@param dfield2 data field
+@param descending whether to use descending order
@return the comparison result of dfield1 and dfield2
@retval 0 if dfield1 is equal to dfield2
@retval negative if dfield1 is less than dfield2
@retval positive if dfield1 is greater than dfield2 */
-UNIV_INLINE
-int
-cmp_dfield_dfield(
-/*==============*/
- const dfield_t* dfield1,/*!< in: data field; must have type field set */
- const dfield_t* dfield2);/*!< in: data field */
+inline int cmp_dfield_dfield(const dfield_t *dfield1, const dfield_t *dfield2,
+ bool descending= false)
+{
+ ut_ad(dfield_check_typed(dfield1));
+ const dtype_t *type= dfield_get_type(dfield1);
+ return cmp_data(type->mtype, type->prtype, descending,
+ static_cast<const byte*>(dfield_get_data(dfield1)),
+ dfield_get_len(dfield1),
+ static_cast<const byte*>(dfield_get_data(dfield2)),
+ dfield_get_len(dfield2));
+}
#ifdef UNIV_DEBUG
/** Compare a GIS data tuple to a physical record.
@@ -103,15 +103,15 @@ inline int cmp_geometry_field(const void *a, const void *b)
double x2= mach_double_read(mbr2);
if (x1 > x2)
return 1;
- if (x2 > x1)
+ if (x1 < x2)
return -1;
- double y1= mach_double_read(mbr1 + sizeof(double) * SPDIMS);
- double y2= mach_double_read(mbr2 + sizeof(double) * SPDIMS);
+ x1= mach_double_read(mbr1 + sizeof(double) * SPDIMS);
+ x2= mach_double_read(mbr2 + sizeof(double) * SPDIMS);
- if (y1 > y2)
+ if (x1 > x2)
return 1;
- if (y2 > y1)
+ if (x1 < x2)
return -1;
/* left lower corner (xmin, ymin) overlaps, now right upper corner */
@@ -120,41 +120,39 @@ inline int cmp_geometry_field(const void *a, const void *b)
if (x1 > x2)
return 1;
- if (x2 > x1)
+ if (x1 < x2)
return -1;
- y1= mach_double_read(mbr1 + sizeof(double) * 2 + sizeof(double));
- y2= mach_double_read(mbr2 + sizeof(double) * 2 + sizeof(double));
+ x1= mach_double_read(mbr1 + sizeof(double) * 2 + sizeof(double));
+ x2= mach_double_read(mbr2 + sizeof(double) * 2 + sizeof(double));
- if (y1 > y2)
+ if (x1 > x2)
return 1;
- if (y2 > y1)
+ if (x1 < x2)
return -1;
return 0;
}
/** Compare a data tuple to a physical record.
-@param[in] dtuple data tuple
-@param[in] rec B-tree record
-@param[in] offsets rec_get_offsets(rec)
-@param[in] n_cmp number of fields to compare
-@param[in,out] matched_fields number of completely matched fields
+@param dtuple data tuple
+@param rec B-tree index record
+@param index B-tree index
+@param offsets rec_get_offsets(rec,index)
+@param n_cmp number of fields to compare
+@param matched_fields number of completely matched fields
@return the comparison result of dtuple and rec
@retval 0 if dtuple is equal to rec
@retval negative if dtuple is less than rec
@retval positive if dtuple is greater than rec */
-int
-cmp_dtuple_rec_with_match_low(
- const dtuple_t* dtuple,
- const rec_t* rec,
- const rec_offs* offsets,
- ulint n_cmp,
- ulint* matched_fields)
- MY_ATTRIBUTE((nonnull));
-#define cmp_dtuple_rec_with_match(tuple,rec,offsets,fields) \
+int cmp_dtuple_rec_with_match_low(const dtuple_t *dtuple, const rec_t *rec,
+ const dict_index_t *index,
+ const rec_offs *offsets,
+ ulint n_cmp, ulint *matched_fields)
+ MY_ATTRIBUTE((nonnull));
+#define cmp_dtuple_rec_with_match(tuple,rec,index,offsets,fields) \
cmp_dtuple_rec_with_match_low( \
- tuple,rec,offsets,dtuple_get_n_fields_cmp(tuple),fields)
+ tuple,rec,index,offsets,dtuple_get_n_fields_cmp(tuple),fields)
/** Compare a data tuple to a physical record.
@param[in] dtuple data tuple
@param[in] rec B-tree or R-tree index record
@@ -178,28 +176,32 @@ cmp_dtuple_rec_with_match_bytes(
MY_ATTRIBUTE((warn_unused_result));
/** Compare a data tuple to a physical record.
@see cmp_dtuple_rec_with_match
-@param[in] dtuple data tuple
-@param[in] rec B-tree record
-@param[in] offsets rec_get_offsets(rec)
+@param dtuple data tuple
+@param rec index record
+@param index index
+@param offsets rec_get_offsets(rec, index)
@return the comparison result of dtuple and rec
@retval 0 if dtuple is equal to rec
@retval negative if dtuple is less than rec
@retval positive if dtuple is greater than rec */
-int
-cmp_dtuple_rec(
- const dtuple_t* dtuple,
- const rec_t* rec,
- const rec_offs* offsets);
-/**************************************************************//**
-Checks if a dtuple is a prefix of a record. The last field in dtuple
-is allowed to be a prefix of the corresponding field in the record.
-@return TRUE if prefix */
-ibool
-cmp_dtuple_is_prefix_of_rec(
-/*========================*/
- const dtuple_t* dtuple, /*!< in: data tuple */
- const rec_t* rec, /*!< in: physical record */
- const rec_offs* offsets);/*!< in: array returned by rec_get_offsets() */
+inline int cmp_dtuple_rec(const dtuple_t *dtuple, const rec_t *rec,
+ const dict_index_t *index, const rec_offs *offsets)
+{
+ ulint matched= 0;
+ return cmp_dtuple_rec_with_match(dtuple, rec, index, offsets, &matched);
+}
+
+/** Check if a dtuple is a prefix of a record.
+@param dtuple data tuple
+@param rec index record
+@param index index
+@param offsets rec_get_offsets(rec)
+@return whether dtuple is a prefix of rec */
+bool cmp_dtuple_is_prefix_of_rec(const dtuple_t *dtuple, const rec_t *rec,
+ const dict_index_t *index,
+ const rec_offs *offsets)
+ MY_ATTRIBUTE((nonnull, warn_unused_result));
+
/** Compare two physical records that contain the same number of columns,
none of which are stored externally.
@retval positive if rec1 (including non-ordering columns) is greater than rec2
@@ -246,18 +248,39 @@ cmp_rec_rec(
MY_ATTRIBUTE((nonnull(1,2,3,4,5)));
/** Compare two data fields.
-@param[in] dfield1 data field
-@param[in] dfield2 data field
+@param dfield1 data field
+@param dfield2 data field
@return the comparison result of dfield1 and dfield2
-@retval 0 if dfield1 is equal to dfield2, or a prefix of dfield1
-@retval negative if dfield1 is less than dfield2
-@retval positive if dfield1 is greater than dfield2 */
-UNIV_INLINE
-int
-cmp_dfield_dfield_like_prefix(
- const dfield_t* dfield1,
- const dfield_t* dfield2);
+@retval true if dfield1 is equal to dfield2, or a prefix of dfield1
+@retval false otherwise */
+inline bool cmp_dfield_dfield_eq_prefix(const dfield_t *dfield1,
+ const dfield_t *dfield2)
+{
+ ut_ad(dfield_check_typed(dfield1));
+ ut_ad(dfield_check_typed(dfield2));
+ const dtype_t *type= dfield_get_type(dfield1);
-#include "rem0cmp.inl"
+#ifdef UNIV_DEBUG
+ switch (type->prtype & DATA_MYSQL_TYPE_MASK) {
+ case MYSQL_TYPE_BIT:
+ case MYSQL_TYPE_STRING:
+ case MYSQL_TYPE_VAR_STRING:
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ case MYSQL_TYPE_VARCHAR:
+ break;
+ default:
+ ut_error;
+ }
+#endif /* UNIV_DEBUG */
-#endif
+ uint cs_num= dtype_get_charset_coll(type->prtype);
+ CHARSET_INFO *cs= get_charset(cs_num, MYF(MY_WME));
+ ut_a(cs);
+ return !cs->strnncoll(static_cast<const uchar*>(dfield_get_data(dfield1)),
+ dfield_get_len(dfield1),
+ static_cast<const uchar*>(dfield_get_data(dfield2)),
+ dfield_get_len(dfield2), 1);
+}
diff --git a/storage/innobase/include/rem0cmp.inl b/storage/innobase/include/rem0cmp.inl
deleted file mode 100644
index 6e21382d187..00000000000
--- a/storage/innobase/include/rem0cmp.inl
+++ /dev/null
@@ -1,107 +0,0 @@
-/*****************************************************************************
-
-Copyright (c) 1994, 2014, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2020, MariaDB Corporation.
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; version 2 of the License.
-
-This program is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
-
-*****************************************************************************/
-
-/*******************************************************************//**
-@file include/rem0cmp.ic
-Comparison services for records
-
-Created 7/1/1994 Heikki Tuuri
-************************************************************************/
-
-#include <mysql_com.h>
-#include <my_sys.h>
-
-/** Compare two data fields.
-@param[in] dfield1 data field; must have type field set
-@param[in] dfield2 data field
-@return the comparison result of dfield1 and dfield2
-@retval 0 if dfield1 is equal to dfield2
-@retval negative if dfield1 is less than dfield2
-@retval positive if dfield1 is greater than dfield2 */
-UNIV_INLINE
-int
-cmp_dfield_dfield(
- const dfield_t* dfield1,
- const dfield_t* dfield2)
-{
- const dtype_t* type;
-
- ut_ad(dfield_check_typed(dfield1));
-
- type = dfield_get_type(dfield1);
-
- return(cmp_data_data(type->mtype, type->prtype,
- (const byte*) dfield_get_data(dfield1),
- dfield_get_len(dfield1),
- (const byte*) dfield_get_data(dfield2),
- dfield_get_len(dfield2)));
-}
-
-/** Compare two data fields.
-@param[in] dfield1 data field
-@param[in] dfield2 data field
-@return the comparison result of dfield1 and dfield2
-@retval 0 if dfield1 is equal to dfield2, or a prefix of dfield1
-@retval negative if dfield1 is less than dfield2
-@retval positive if dfield1 is greater than dfield2 */
-UNIV_INLINE
-int
-cmp_dfield_dfield_like_prefix(
- const dfield_t* dfield1,
- const dfield_t* dfield2)
-{
- const dtype_t* type;
-
- ut_ad(dfield_check_typed(dfield1));
- ut_ad(dfield_check_typed(dfield2));
-
- type = dfield_get_type(dfield1);
-
-#ifdef UNIV_DEBUG
- switch (type->prtype & DATA_MYSQL_TYPE_MASK) {
- case MYSQL_TYPE_BIT:
- case MYSQL_TYPE_STRING:
- case MYSQL_TYPE_VAR_STRING:
- case MYSQL_TYPE_TINY_BLOB:
- case MYSQL_TYPE_MEDIUM_BLOB:
- case MYSQL_TYPE_BLOB:
- case MYSQL_TYPE_LONG_BLOB:
- case MYSQL_TYPE_VARCHAR:
- break;
- default:
- ut_error;
- }
-#endif /* UNIV_DEBUG */
-
- uint cs_num = (uint) dtype_get_charset_coll(type->prtype);
-
- if (CHARSET_INFO* cs = get_charset(cs_num, MYF(MY_WME))) {
- return(cs->strnncoll(
- static_cast<const uchar*>(
- dfield_get_data(dfield1)),
- dfield_get_len(dfield1),
- static_cast<const uchar*>(
- dfield_get_data(dfield2)),
- dfield_get_len(dfield2),
- 1));
- }
-
- ib::fatal() << "Unable to find charset-collation " << cs_num;
- return(0);
-}
diff --git a/storage/innobase/include/row0merge.h b/storage/innobase/include/row0merge.h
index 52096d48313..93ea650d0cf 100644
--- a/storage/innobase/include/row0merge.h
+++ b/storage/innobase/include/row0merge.h
@@ -24,8 +24,7 @@ Index build routines using a merge sort
Created 13/06/2005 Jan Lindstrom
*******************************************************/
-#ifndef row0merge_h
-#define row0merge_h
+#pragma once
#include "que0types.h"
#include "trx0types.h"
@@ -36,7 +35,8 @@ Created 13/06/2005 Jan Lindstrom
#include "row0mysql.h"
#include "lock0types.h"
#include "srv0srv.h"
-#include "ut0stage.h"
+
+class ut_stage_alter_t;
/* Reserve free space from every block for key_version */
#define ROW_MERGE_RESERVE_SIZE 4
@@ -109,6 +109,7 @@ struct index_field_t {
ulint prefix_len; /*!< column prefix length, or 0
if indexing the whole column */
bool is_v_col; /*!< whether this is a virtual column */
+ bool descending; /*!< whether to use DESC order */
};
/** Definition of an index being created */
@@ -273,15 +274,16 @@ row_merge_build_indexes(
const col_collations* col_collate)
MY_ATTRIBUTE((warn_unused_result));
-/********************************************************************//**
-Write a buffer to a block. */
-void
-row_merge_buf_write(
-/*================*/
- const row_merge_buf_t* buf, /*!< in: sorted buffer */
- const merge_file_t* of, /*!< in: output file */
- row_merge_block_t* block) /*!< out: buffer for writing to file */
- MY_ATTRIBUTE((nonnull));
+/** Write a buffer to a block.
+@param buf sorted buffer
+@param block buffer for writing to file
+@param blob_file blob file handle for doing bulk insert operation */
+dberr_t row_merge_buf_write(const row_merge_buf_t *buf,
+#ifndef DBUG_OFF
+ const merge_file_t *of, /*!< output file */
+#endif
+ row_merge_block_t *block,
+ merge_file_t *blob_file= nullptr);
/********************************************************************//**
Sort a buffer. */
@@ -416,4 +418,79 @@ row_merge_read_rec(
row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */
ulint space) /*!< in: space id */
MY_ATTRIBUTE((warn_unused_result));
-#endif /* row0merge.h */
+
+/** Buffer for bulk insert */
+class row_merge_bulk_t
+{
+ /** Buffer for each index in the table. main memory
+ buffer for sorting the index */
+ row_merge_buf_t *m_merge_buf;
+ /** Block for IO operation */
+ row_merge_block_t *m_block= nullptr;
+ /** File to store the buffer and used for merge sort */
+ merge_file_t *m_merge_files= nullptr;
+ /** Temporary file to be used for merge sort */
+ pfs_os_file_t m_tmpfd;
+ /** Allocate memory for merge file data structure */
+ ut_allocator<row_merge_block_t> m_alloc;
+ /** Storage for description for the m_alloc */
+ ut_new_pfx_t m_block_pfx;
+ /** Temporary file to store the blob */
+ merge_file_t m_blob_file;
+ /** Storage for description for the crypt_block */
+ ut_new_pfx_t m_crypt_pfx;
+ /** Block for encryption */
+ row_merge_block_t *m_crypt_block= nullptr;
+public:
+ /** Constructor.
+ Create all merge files, merge buffer for all the table indexes
+ expect fts indexes.
+ Create a merge block which is used to write IO operation
+ @param table table which undergoes bulk insert operation */
+ row_merge_bulk_t(dict_table_t *table);
+
+ /** Destructor.
+ Remove all merge files, merge buffer for all table indexes. */
+ ~row_merge_bulk_t();
+
+ /** Remove all buffer for the table indexes */
+ void remove_all_bulk_buffer();
+
+ /** Clean the merge buffer for the given index number */
+ void clean_bulk_buffer(ulint index_no);
+
+ /** Create the temporary file for the given index number
+ @retval true if temporary file creation went well */
+ bool create_tmp_file(ulint index_no);
+
+ /** Write the merge buffer to the tmp file for the given
+ index number.
+ @param index_no buffer to be written for the index */
+ dberr_t write_to_tmp_file(ulint index_no);
+
+ /** Add the tuple to the merge buffer for the given index.
+ If the buffer ran out of memory then write the buffer into
+ the temporary file and do insert the tuple again.
+ @param row tuple to be inserted
+ @param ind index to be buffered
+ @param trx bulk transaction */
+ dberr_t bulk_insert_buffered(const dtuple_t &row, const dict_index_t &ind,
+ trx_t *trx);
+
+ /** Do bulk insert operation into the index tree from
+ buffer or merge file if exists
+ @param index_no index to be inserted
+ @param trx bulk transaction */
+ dberr_t write_to_index(ulint index_no, trx_t *trx);
+
+ /** Do bulk insert for the buffered insert for the table.
+ @param table table which undergoes for bulk insert operation
+ @param trx bulk transaction */
+ dberr_t write_to_table(dict_table_t *table, trx_t *trx);
+
+ /** Allocate block for writing the buffer into disk */
+ dberr_t alloc_block();
+
+ /** Init temporary files for each index */
+ void init_tmp_file();
+};
diff --git a/storage/innobase/include/srv0mon.h b/storage/innobase/include/srv0mon.h
index 971f6363bdb..1ca2d7a429f 100644
--- a/storage/innobase/include/srv0mon.h
+++ b/storage/innobase/include/srv0mon.h
@@ -269,9 +269,6 @@ enum monitor_id_t {
MONITOR_OS_PENDING_READS,
MONITOR_OS_PENDING_WRITES,
MONITOR_OVLD_OS_LOG_WRITTEN,
- MONITOR_OVLD_OS_LOG_FSYNC,
- MONITOR_OVLD_OS_LOG_PENDING_FSYNC,
- MONITOR_OVLD_OS_LOG_PENDING_WRITES,
/* Transaction related counters */
MONITOR_MODULE_TRX,
@@ -298,20 +295,16 @@ enum monitor_id_t {
/* Recovery related counters */
MONITOR_MODULE_RECOVERY,
- MONITOR_NUM_CHECKPOINT,
+ MONITOR_OVLD_CHECKPOINTS,
MONITOR_OVLD_LSN_FLUSHDISK,
MONITOR_OVLD_LSN_CHECKPOINT,
MONITOR_OVLD_LSN_CURRENT,
MONITOR_LSN_CHECKPOINT_AGE,
MONITOR_OVLD_BUF_OLDEST_LSN,
MONITOR_OVLD_MAX_AGE_ASYNC,
- MONITOR_PENDING_LOG_FLUSH,
- MONITOR_PENDING_CHECKPOINT_WRITE,
- MONITOR_LOG_IO,
MONITOR_OVLD_LOG_WAITS,
MONITOR_OVLD_LOG_WRITE_REQUEST,
MONITOR_OVLD_LOG_WRITES,
- MONITOR_OVLD_LOG_PADDED,
/* Page Manager related counters */
MONITOR_MODULE_PAGE,
diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
index 90d3a21f761..433c9ca9237 100644
--- a/storage/innobase/include/srv0srv.h
+++ b/storage/innobase/include/srv0srv.h
@@ -85,29 +85,6 @@ struct srv_stats_t
/** Count the amount of data written in total (in bytes) */
ulint_ctr_1_t data_written;
-
- /** Number of the log write requests done */
- ulint_ctr_1_t log_write_requests;
-
- /** Number of physical writes to the log performed */
- ulint_ctr_1_t log_writes;
-
- /** Amount of data padded for log write ahead */
- ulint_ctr_1_t log_padded;
-
- /** Amount of data written to the log files in bytes */
- lsn_ctr_1_t os_log_written;
-
- /** Number of writes being done to the log files */
- ulint_ctr_1_t os_log_pending_writes;
-
- /** We increase this counter, when we don't have enough
- space in the log buffer and have to flush it */
- ulint_ctr_1_t log_waits;
-
- /** Store the number of write requests issued */
- ulint_ctr_1_t buf_pool_write_requests;
-
/** Number of bytes saved by page compression */
ulint_ctr_n_t page_compression_saved;
/* Number of pages compressed with page compression */
@@ -250,12 +227,12 @@ extern bool srv_was_started;
extern char* srv_undo_dir;
/** Number of undo tablespaces to use. */
-extern ulong srv_undo_tablespaces;
+extern uint srv_undo_tablespaces;
/** The number of UNDO tablespaces that are active (hosting some rollback
segment). It is quite possible that some of the tablespaces doesn't host
any of the rollback-segment based on configuration used. */
-extern ulint srv_undo_tablespaces_active;
+extern uint32_t srv_undo_tablespaces_active;
/** Maximum size of undo tablespace. */
extern unsigned long long srv_max_undo_log_size;
@@ -282,18 +259,15 @@ extern char* srv_log_group_home_dir;
/** The InnoDB redo log file size, or 0 when changing the redo log format
at startup (while disallowing writes to the redo log). */
extern ulonglong srv_log_file_size;
-extern ulong srv_log_buffer_size;
extern ulong srv_flush_log_at_trx_commit;
extern uint srv_flush_log_at_timeout;
-extern ulong srv_log_write_ahead_size;
extern my_bool srv_adaptive_flushing;
extern my_bool srv_flush_sync;
/** Requested size in bytes */
extern ulint srv_buf_pool_size;
-/** Requested buffer pool chunk size. Each buffer pool instance consists
-of one or more chunks. */
-extern ulong srv_buf_pool_chunk_unit;
+/** Requested buffer pool chunk size */
+extern size_t srv_buf_pool_chunk_unit;
/** Scan depth for LRU flush batch i.e.: number of blocks scanned*/
extern ulong srv_LRU_scan_depth;
/** Whether or not to flush neighbors of a block */
@@ -451,9 +425,13 @@ extern my_bool srv_print_all_deadlocks;
extern my_bool srv_cmp_per_index_enabled;
+/** innodb_encrypt_log */
+extern my_bool srv_encrypt_log;
+
/* is encryption enabled */
extern ulong srv_encrypt_tables;
+
/** Status variables to be passed to MySQL */
extern struct export_var_t export_vars;
@@ -671,13 +649,10 @@ struct export_var_t{
#ifdef UNIV_DEBUG
ulint innodb_buffer_pool_pages_latched; /*!< Latched pages */
#endif /* UNIV_DEBUG */
- ulint innodb_buffer_pool_write_requests;/*!< srv_stats.buf_pool_write_requests */
ulint innodb_checkpoint_age;
ulint innodb_checkpoint_max_age;
ulint innodb_data_pending_reads; /*!< Pending reads */
ulint innodb_data_pending_writes; /*!< Pending writes */
- ulint innodb_data_pending_fsyncs; /*!< Pending fsyncs */
- ulint innodb_data_fsyncs; /*!< Number of fsyncs so far */
ulint innodb_data_read; /*!< Data bytes read */
ulint innodb_data_writes; /*!< I/O write requests */
ulint innodb_data_written; /*!< Data bytes written */
@@ -686,9 +661,6 @@ struct export_var_t{
ulint innodb_dblwr_writes; /*!< srv_dblwr_writes */
ulint innodb_deadlocks;
ulint innodb_history_list_length;
- ulint innodb_log_waits; /*!< srv_log_waits */
- ulint innodb_log_write_requests; /*!< srv_log_write_requests */
- ulint innodb_log_writes; /*!< srv_log_writes */
lsn_t innodb_lsn_current;
lsn_t innodb_lsn_flushed;
lsn_t innodb_lsn_last_checkpoint;
@@ -697,10 +669,8 @@ struct export_var_t{
ulint innodb_mem_adaptive_hash;
#endif
ulint innodb_mem_dictionary;
- lsn_t innodb_os_log_written; /*!< srv_os_log_written */
- ulint innodb_os_log_fsyncs; /*!< n_log_flushes */
- ulint innodb_os_log_pending_writes; /*!< srv_os_log_pending_writes */
- ulint innodb_os_log_pending_fsyncs; /*!< n_pending_log_flushes */
+ /** log_sys.get_lsn() - recv_sys.lsn */
+ lsn_t innodb_os_log_written;
ulint innodb_row_lock_waits; /*!< srv_n_lock_wait_count */
ulint innodb_row_lock_current_waits; /*!< srv_n_lock_wait_current_count */
int64_t innodb_row_lock_time; /*!< srv_n_lock_wait_time
diff --git a/storage/innobase/include/trx0rec.h b/storage/innobase/include/trx0rec.h
index 58ec5ab1707..bb348d7ef8b 100644
--- a/storage/innobase/include/trx0rec.h
+++ b/storage/innobase/include/trx0rec.h
@@ -173,7 +173,7 @@ trx_undo_report_row_operation(
const rec_offs* offsets, /*!< in: rec_get_offsets(rec) */
roll_ptr_t* roll_ptr) /*!< out: DB_ROLL_PTR to the
undo log record */
- MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result));
+ MY_ATTRIBUTE((nonnull(1,2), warn_unused_result));
/** status bit used for trx_undo_prev_version_build() */
diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h
index 5b2b2264a46..152e794ac6a 100644
--- a/storage/innobase/include/trx0trx.h
+++ b/storage/innobase/include/trx0trx.h
@@ -36,6 +36,7 @@ Created 3/26/1996 Heikki Tuuri
#include "fts0fts.h"
#include "read0types.h"
#include "ilist.h"
+#include "row0merge.h"
#include <vector>
@@ -433,6 +434,11 @@ class trx_mod_table_time_t
/** Whether the modified table is a FTS auxiliary table */
bool fts_aux_table= false;
#endif /* UNIV_DEBUG */
+
+ /** Buffer to store insert opertion */
+ row_merge_bulk_t *bulk_store= nullptr;
+
+ friend struct trx_t;
public:
/** Constructor
@param rows number of modified rows so far */
@@ -466,8 +472,14 @@ public:
first_versioned= BULK;
}
- /** Notify the start of a bulk insert operation */
- void start_bulk_insert() { first|= BULK; }
+ /** Notify the start of a bulk insert operation
+ @param table table to do bulk operation */
+ void start_bulk_insert(dict_table_t *table)
+ {
+ first|= BULK;
+ if (!table->is_temporary())
+ bulk_store= new row_merge_bulk_t(table);
+ }
/** Notify the end of a bulk insert operation */
void end_bulk_insert() { first&= ~BULK; }
@@ -493,6 +505,33 @@ public:
bool is_aux_table() const { return fts_aux_table; }
#endif /* UNIV_DEBUG */
+
+ /** @return the first undo record that modified the table */
+ undo_no_t get_first() const
+ {
+ ut_ad(valid());
+ return LIMIT & first;
+ }
+
+ /** Add the tuple to the transaction bulk buffer for the given index.
+ @param entry tuple to be inserted
+ @param index bulk insert for the index
+ @param trx transaction */
+ dberr_t bulk_insert_buffered(const dtuple_t &entry,
+ const dict_index_t &index, trx_t *trx)
+ {
+ return bulk_store->bulk_insert_buffered(entry, index, trx);
+ }
+
+ /** Do bulk insert operation present in the buffered operation
+ @return DB_SUCCESS or error code */
+ dberr_t write_bulk(dict_table_t *table, trx_t *trx);
+
+ /** @return whether the buffer storage exist */
+ bool bulk_buffer_exist() const
+ {
+ return bulk_store && is_bulk_insert();
+ }
};
/** Collection of persistent tables and their first modification
@@ -1116,7 +1155,32 @@ public:
return false;
}
+ /** @return logical modification time of a table only
+ if the table has bulk buffer exist in the transaction */
+ trx_mod_table_time_t *check_bulk_buffer(dict_table_t *table)
+ {
+ if (UNIV_LIKELY(!bulk_insert))
+ return nullptr;
+ ut_ad(!check_unique_secondary);
+ ut_ad(!check_foreigns);
+ auto it= mod_tables.find(table);
+ if (it == mod_tables.end() || !it->second.bulk_buffer_exist())
+ return nullptr;
+ return &it->second;
+ }
+
+ /** Do the bulk insert for the buffered insert operation
+ for the transaction.
+ @return DB_SUCCESS or error code */
+ dberr_t bulk_insert_apply()
+ {
+ return UNIV_UNLIKELY(bulk_insert) ? bulk_insert_apply_low(): DB_SUCCESS;
+ }
+
private:
+ /** Apply the buffered bulk inserts. */
+ dberr_t bulk_insert_apply_low();
+
/** Assign a rollback segment for modifying temporary tables.
@return the assigned rollback segment */
trx_rseg_t *assign_temp_rseg();
diff --git a/storage/innobase/include/trx0types.h b/storage/innobase/include/trx0types.h
index 07c1c6a756b..d6ce902977c 100644
--- a/storage/innobase/include/trx0types.h
+++ b/storage/innobase/include/trx0types.h
@@ -38,7 +38,7 @@ the terminating NUL character. */
static const ulint TRX_ID_MAX_LEN = 17;
/** Space id of the transaction system page (the system tablespace) */
-static const ulint TRX_SYS_SPACE = 0;
+static constexpr uint32_t TRX_SYS_SPACE= 0;
/** Page number of the transaction system page */
#define TRX_SYS_PAGE_NO FSP_TRX_SYS_PAGE_NO
diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i
index c5f62f6cf57..2af1f480764 100644
--- a/storage/innobase/include/univ.i
+++ b/storage/innobase/include/univ.i
@@ -206,36 +206,6 @@ management to ensure correct alignment for doubles etc. */
========================
*/
-#ifdef HAVE_LZO
-#define IF_LZO(A,B) A
-#else
-#define IF_LZO(A,B) B
-#endif
-
-#ifdef HAVE_LZ4
-#define IF_LZ4(A,B) A
-#else
-#define IF_LZ4(A,B) B
-#endif
-
-#ifdef HAVE_LZMA
-#define IF_LZMA(A,B) A
-#else
-#define IF_LZMA(A,B) B
-#endif
-
-#ifdef HAVE_BZIP2
-#define IF_BZIP2(A,B) A
-#else
-#define IF_BZIP2(A,B) B
-#endif
-
-#ifdef HAVE_SNAPPY
-#define IF_SNAPPY(A,B) A
-#else
-#define IF_SNAPPY(A,B) B
-#endif
-
#if defined (HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE) || defined(_WIN32)
#define IF_PUNCH_HOLE(A,B) A
#else
@@ -505,7 +475,7 @@ it is read or written. */
#include "ut0lst.h"
#include "ut0ut.h"
-extern ulong srv_page_size_shift;
+extern uint32_t srv_page_size_shift;
extern ulong srv_page_size;
/* Dimension of spatial object we support so far. It has its root in
@@ -527,8 +497,6 @@ extern mysql_pfs_key_t fts_doc_id_mutex_key;
extern mysql_pfs_key_t ibuf_bitmap_mutex_key;
extern mysql_pfs_key_t ibuf_mutex_key;
extern mysql_pfs_key_t ibuf_pessimistic_insert_mutex_key;
-extern mysql_pfs_key_t log_sys_mutex_key;
-extern mysql_pfs_key_t log_flush_order_mutex_key;
extern mysql_pfs_key_t recalc_pool_mutex_key;
extern mysql_pfs_key_t purge_sys_pq_mutex_key;
extern mysql_pfs_key_t recv_sys_mutex_key;
@@ -555,6 +523,7 @@ extern mysql_pfs_key_t index_tree_rw_lock_key;
extern mysql_pfs_key_t index_online_log_key;
extern mysql_pfs_key_t trx_sys_rw_lock_key;
extern mysql_pfs_key_t lock_latch_key;
+extern mysql_pfs_key_t log_latch_key;
extern mysql_pfs_key_t trx_rseg_latch_key;
# endif /* UNIV_PFS_RWLOCK */
#endif /* HAVE_PSI_INTERFACE */
diff --git a/storage/innobase/include/ut0crc32.h b/storage/innobase/include/ut0crc32.h
deleted file mode 100644
index 0cbccb976e2..00000000000
--- a/storage/innobase/include/ut0crc32.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*****************************************************************************
-
-Copyright (c) 2011, 2015, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2016, 2020, MariaDB Corporation.
-
-This program is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation; version 2 of the License.
-
-This program is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
-
-*****************************************************************************/
-
-/**************************************************//**
-@file include/ut0crc32.h
-CRC32 implementation
-
-Created Aug 10, 2011 Vasil Dimov
-*******************************************************/
-
-#ifndef ut0crc32_h
-#define ut0crc32_h
-
-#include "univ.i"
-#include <my_sys.h>
-static inline uint32_t ut_crc32(const byte *s, size_t size)
-{
- return my_crc32c(0, s, size);
-}
-
-#endif /* ut0crc32_h */
diff --git a/storage/innobase/include/ut0pool.h b/storage/innobase/include/ut0pool.h
index 63628cc169f..aa0cfb9e060 100644
--- a/storage/innobase/include/ut0pool.h
+++ b/storage/innobase/include/ut0pool.h
@@ -304,12 +304,9 @@ private:
pool = UT_NEW_NOKEY(PoolType(m_size));
if (pool != NULL) {
-
- ut_ad(n_pools <= m_pools.size());
-
m_pools.push_back(pool);
- ib::info() << "Number of pools: "
+ ib::info() << "Number of transaction pools: "
<< m_pools.size();
added = true;
diff --git a/storage/innobase/include/ut0ut.h b/storage/innobase/include/ut0ut.h
index b7625b512a2..fe16ce149da 100644
--- a/storage/innobase/include/ut0ut.h
+++ b/storage/innobase/include/ut0ut.h
@@ -305,6 +305,16 @@ operator<<(
return(lhs);
}
+/** This is a wrapper class, used to print any number in IEC style */
+struct bytes_iec {
+ explicit bytes_iec(unsigned long long t): m_val(t) {}
+ double get_double() const { return static_cast<double>(m_val); }
+ const unsigned long long m_val;
+};
+
+/** Like hex operator above, except for bytes_iec */
+std::ostream &operator<<(std::ostream &lhs, const bytes_iec &rhs);
+
/** The class logger is the base class of all the error log related classes.
It contains a std::ostringstream object. The main purpose of this class is
to forward operator<< to the underlying std::ostringstream object. Do not
diff --git a/storage/innobase/log/log0crypt.cc b/storage/innobase/log/log0crypt.cc
index d035808c6b9..8a7714101ba 100644
--- a/storage/innobase/log/log0crypt.cc
+++ b/storage/innobase/log/log0crypt.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
-Copyright (C) 2014, 2021, MariaDB Corporation.
+Copyright (C) 2014, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -31,16 +31,14 @@ MDEV-11782: Rewritten for MariaDB 10.2 by Marko Mäkelä, MariaDB Corporation.
#include "log0crypt.h"
#include "log0recv.h" // for recv_sys
-
-/** innodb_encrypt_log: whether to encrypt the redo log */
-my_bool srv_encrypt_log;
+#include "mach0data.h"
/** Redo log encryption key ID */
#define LOG_DEFAULT_ENCRYPTION_KEY 1
struct crypt_info_t {
- ulint checkpoint_no; /*!< checkpoint no; 32 bits */
- uint key_version; /*!< mysqld key version */
+ uint32_t checkpoint_no; /*!< checkpoint no; 32 bits */
+ uint32_t key_version; /*!< key version */
/** random string for encrypting the key */
alignas(8) byte crypt_msg[MY_AES_BLOCK_SIZE];
/** the secret key */
@@ -60,6 +58,40 @@ static crypt_info_t infos[5 * 2];
/** First unused slot in infos[] */
static size_t infos_used;
+/* Offsets of a log block header */
+#define LOG_BLOCK_HDR_NO 0 /* block number which must be > 0 and
+ is allowed to wrap around at 2G; the
+ highest bit is set to 1 if this is the
+ first log block in a log flush write
+ segment */
+#define LOG_BLOCK_FLUSH_BIT_MASK 0x80000000UL
+ /* mask used to get the highest bit in
+ the preceding field */
+#define LOG_BLOCK_HDR_DATA_LEN 4 /* number of bytes of log written to
+ this block */
+#define LOG_BLOCK_FIRST_REC_GROUP 6 /* offset of the first start of an
+ mtr log record group in this log block,
+ 0 if none; if the value is the same
+ as LOG_BLOCK_HDR_DATA_LEN, it means
+ that the first rec group has not yet
+ been catenated to this log block, but
+ if it will, it will start at this
+ offset; an archive recovery can
+ start parsing the log records starting
+ from this offset in this log block,
+ if value not 0 */
+#define LOG_BLOCK_HDR_SIZE 12 /* size of the log block header in
+ bytes */
+
+#define LOG_BLOCK_KEY 4 /* encryption key version
+ before LOG_BLOCK_CHECKSUM;
+ after log_t::FORMAT_ENC_10_4 only */
+#define LOG_BLOCK_CHECKSUM 4 /* 4 byte checksum of the log block
+ contents; in InnoDB versions
+ < 3.23.52 this did not contain the
+ checksum but the same value as
+ LOG_BLOCK_HDR_NO */
+
/*********************************************************************//**
Get a log block's start lsn.
@return a log block's start lsn */
@@ -123,26 +155,36 @@ static bool init_crypt_key(crypt_info_t* info, bool upgrade = false)
return true;
}
-/** Encrypt or decrypt log blocks.
-@param[in,out] buf log blocks to encrypt or decrypt
+static ulint log_block_get_hdr_no(const byte *log_block)
+{
+ static_assert(LOG_BLOCK_HDR_NO == 0, "compatibility");
+ return mach_read_from_4(my_assume_aligned<4>(log_block)) &
+ ~LOG_BLOCK_FLUSH_BIT_MASK;
+}
+
+/** Decrypt log blocks.
+@param[in,out] buf log blocks to decrypt
@param[in] lsn log sequence number of the start of the buffer
@param[in] size size of the buffer, in bytes
-@param[in] op whether to decrypt, encrypt, or rotate key and encrypt
-@return whether the operation succeeded (encrypt always does) */
-bool log_crypt(byte* buf, lsn_t lsn, ulint size, log_crypt_t op)
+@return whether the operation succeeded */
+ATTRIBUTE_COLD bool log_decrypt(byte* buf, lsn_t lsn, ulint size)
{
- ut_ad(size % OS_FILE_LOG_BLOCK_SIZE == 0);
- ut_ad(ulint(buf) % OS_FILE_LOG_BLOCK_SIZE == 0);
+ ut_ad(!(size & 511));
+ ut_ad(!(ulint(buf) & 511));
ut_a(info.key_version);
alignas(8) byte aes_ctr_iv[MY_AES_BLOCK_SIZE];
#define LOG_CRYPT_HDR_SIZE 4
- lsn &= ~lsn_t(OS_FILE_LOG_BLOCK_SIZE - 1);
+ lsn &= ~lsn_t{511};
+
+ const bool has_encryption_key_rotation
+ = log_sys.format == log_t::FORMAT_ENC_10_4
+ || log_sys.format == log_t::FORMAT_ENC_10_5;
for (const byte* const end = buf + size; buf != end;
- buf += OS_FILE_LOG_BLOCK_SIZE, lsn += OS_FILE_LOG_BLOCK_SIZE) {
- alignas(4) byte dst[OS_FILE_LOG_BLOCK_SIZE - LOG_CRYPT_HDR_SIZE
+ buf += 512, lsn += 512) {
+ alignas(4) byte dst[512 - LOG_CRYPT_HDR_SIZE
- LOG_BLOCK_CHECKSUM];
/* The log block number is not encrypted. */
@@ -156,45 +198,28 @@ bool log_crypt(byte* buf, lsn_t lsn, ulint size, log_crypt_t op)
ut_ad(log_block_get_start_lsn(lsn,
log_block_get_hdr_no(buf))
== lsn);
- byte* key_ver = &buf[OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_KEY
- - LOG_BLOCK_CHECKSUM];
- const size_t dst_size
- = log_sys.has_encryption_key_rotation()
+ byte* key_ver = &buf[512 - LOG_BLOCK_KEY - LOG_BLOCK_CHECKSUM];
+
+ const size_t dst_size = has_encryption_key_rotation
? sizeof dst - LOG_BLOCK_KEY
: sizeof dst;
- if (log_sys.has_encryption_key_rotation()) {
- const uint key_version = info.key_version;
- switch (op) {
- case LOG_ENCRYPT_ROTATE_KEY:
- info.key_version
- = encryption_key_get_latest_version(
- LOG_DEFAULT_ENCRYPTION_KEY);
- if (key_version != info.key_version
- && !init_crypt_key(&info)) {
- info.key_version = key_version;
- }
- /* fall through */
- case LOG_ENCRYPT:
- mach_write_to_4(key_ver, info.key_version);
- break;
- case LOG_DECRYPT:
- info.key_version = mach_read_from_4(key_ver);
- if (key_version != info.key_version
- && !init_crypt_key(&info)) {
- return false;
- }
- }
+ if (has_encryption_key_rotation) {
+ const auto key_version = info.key_version;
+ info.key_version = mach_read_from_4(key_ver);
+ if (key_version == info.key_version) {
+ } else if (!init_crypt_key(&info)) {
+ return false;
#ifndef DBUG_OFF
- if (key_version != info.key_version) {
+ } else {
DBUG_PRINT("ib_log", ("key_version: %x -> %x",
key_version,
info.key_version));
- }
#endif /* !DBUG_OFF */
+ }
}
ut_ad(LOG_CRYPT_HDR_SIZE + dst_size
- == log_sys.trailer_offset());
+ == 512 - LOG_BLOCK_CHECKSUM - LOG_BLOCK_KEY);
uint dst_len;
int rc = encryption_crypt(
@@ -203,9 +228,7 @@ bool log_crypt(byte* buf, lsn_t lsn, ulint size, log_crypt_t op)
const_cast<byte*>(info.crypt_key),
MY_AES_BLOCK_SIZE,
aes_ctr_iv, sizeof aes_ctr_iv,
- op == LOG_DECRYPT
- ? ENCRYPTION_FLAG_DECRYPT | ENCRYPTION_FLAG_NOPAD
- : ENCRYPTION_FLAG_ENCRYPT | ENCRYPTION_FLAG_NOPAD,
+ ENCRYPTION_FLAG_DECRYPT | ENCRYPTION_FLAG_NOPAD,
LOG_DEFAULT_ENCRYPTION_KEY,
info.key_version);
ut_a(rc == MY_AES_OK);
@@ -219,8 +242,8 @@ bool log_crypt(byte* buf, lsn_t lsn, ulint size, log_crypt_t op)
/** Initialize the redo log encryption key and random parameters
when creating a new redo log.
The random parameters will be persisted in the log checkpoint pages.
-@see log_crypt_write_checkpoint_buf()
-@see log_crypt_read_checkpoint_buf()
+@see log_crypt_write_header()
+@see log_crypt_read_header()
@return whether the operation succeeded */
bool log_crypt_init()
{
@@ -287,8 +310,7 @@ next_slot:
@return whether the decryption was successful */
ATTRIBUTE_COLD bool log_crypt_101_read_block(byte* buf, lsn_t start_lsn)
{
- const uint32_t checkpoint_no
- = uint32_t(log_block_get_checkpoint_no(buf));
+ const uint32_t checkpoint_no = mach_read_from_4(buf + 8);
const crypt_info_t* info = infos;
for (const crypt_info_t* const end = info + infos_used; info < end;
info++) {
@@ -309,16 +331,16 @@ ATTRIBUTE_COLD bool log_crypt_101_read_block(byte* buf, lsn_t start_lsn)
return false;
}
found:
- byte dst[OS_FILE_LOG_BLOCK_SIZE];
+ byte dst[512];
uint dst_len;
byte aes_ctr_iv[MY_AES_BLOCK_SIZE];
- const uint src_len = OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_HDR_SIZE;
+ const uint src_len = 512 - LOG_BLOCK_HDR_SIZE;
ulint log_block_no = log_block_get_hdr_no(buf);
/* The log block header is not encrypted. */
- memcpy(dst, buf, LOG_BLOCK_HDR_SIZE);
+ memcpy(dst, buf, 512);
memcpy(aes_ctr_iv, info->crypt_nonce, 3);
mach_write_to_8(aes_ctr_iv + 3,
@@ -345,30 +367,47 @@ found:
return true;
}
-/** Add the encryption information to a redo log checkpoint buffer.
-@param[in,out] buf checkpoint buffer */
-void log_crypt_write_checkpoint_buf(byte *buf)
+/** MariaDB 10.2.5 encrypted redo log encryption key version (32 bits)*/
+constexpr size_t LOG_CHECKPOINT_CRYPT_KEY= 32;
+/** MariaDB 10.2.5 encrypted redo log random nonce (32 bits) */
+constexpr size_t LOG_CHECKPOINT_CRYPT_NONCE= 36;
+/** MariaDB 10.2.5 encrypted redo log random message (MY_AES_BLOCK_SIZE) */
+constexpr size_t LOG_CHECKPOINT_CRYPT_MESSAGE= 40;
+
+/** Add the encryption information to the log header buffer.
+@param buf part of log header buffer */
+void log_crypt_write_header(byte *buf)
{
- ut_ad(info.key_version);
- compile_time_assert(16 == sizeof info.crypt_msg);
- compile_time_assert(16 == MY_AES_BLOCK_SIZE);
- compile_time_assert(LOG_CHECKPOINT_CRYPT_MESSAGE
- - LOG_CHECKPOINT_CRYPT_NONCE
- == sizeof info.crypt_nonce);
+ ut_ad(info.key_version);
+ mach_write_to_4(my_assume_aligned<4>(buf), LOG_DEFAULT_ENCRYPTION_KEY);
+ mach_write_to_4(my_assume_aligned<4>(buf + 4), info.key_version);
+ memcpy_aligned<8>(buf + 8, info.crypt_msg, MY_AES_BLOCK_SIZE);
+ static_assert(MY_AES_BLOCK_SIZE == 16, "compatibility");
+ memcpy_aligned<4>(buf + 24, info.crypt_nonce, sizeof info.crypt_nonce);
+}
- memcpy(buf + LOG_CHECKPOINT_CRYPT_MESSAGE, info.crypt_msg,
- MY_AES_BLOCK_SIZE);
- memcpy(buf + LOG_CHECKPOINT_CRYPT_NONCE, info.crypt_nonce,
- sizeof info.crypt_nonce);
- mach_write_to_4(buf + LOG_CHECKPOINT_CRYPT_KEY, info.key_version);
+/** Read the encryption information from a log header buffer.
+@param buf part of log header buffer
+@return whether the operation was successful */
+bool log_crypt_read_header(const byte *buf)
+{
+ MEM_UNDEFINED(&info.checkpoint_no, sizeof info.checkpoint_no);
+ MEM_NOACCESS(&info.checkpoint_no, sizeof info.checkpoint_no);
+ if (mach_read_from_4(my_assume_aligned<4>(buf)) !=
+ LOG_DEFAULT_ENCRYPTION_KEY)
+ return false;
+ info.key_version= mach_read_from_4(my_assume_aligned<4>(buf + 4));
+ memcpy_aligned<8>(info.crypt_msg, buf + 8, MY_AES_BLOCK_SIZE);
+ memcpy_aligned<4>(info.crypt_nonce, buf + 24, sizeof info.crypt_nonce);
+ return init_crypt_key(&info);
}
/** Read the checkpoint crypto (version, msg and iv) info.
@param[in] buf checkpoint buffer
@return whether the operation was successful */
-bool log_crypt_read_checkpoint_buf(const byte* buf)
+ATTRIBUTE_COLD bool log_crypt_read_checkpoint_buf(const byte* buf)
{
- info.checkpoint_no = mach_read_from_4(buf + (LOG_CHECKPOINT_NO + 4));
+ info.checkpoint_no = mach_read_from_4(buf + 4);
info.key_version = mach_read_from_4(buf + LOG_CHECKPOINT_CRYPT_KEY);
#if MY_AES_BLOCK_SIZE != 16
@@ -423,3 +462,180 @@ bool log_tmp_block_encrypt(
return rc == MY_AES_OK;
}
+
+/** Decrypt part of a log record.
+@param iv initialization vector
+@param buf buffer for the decrypted data
+@param data the encrypted data
+@param len length of the data, in bytes
+@return buf */
+byte *log_decrypt_buf(const byte *iv, byte *buf, const byte *data, uint len)
+{
+ ut_a(MY_AES_OK == encryption_crypt(data, len, buf, &len,
+ info.crypt_key, MY_AES_BLOCK_SIZE,
+ iv, MY_AES_BLOCK_SIZE,
+ ENCRYPTION_FLAG_DECRYPT |
+ ENCRYPTION_FLAG_NOPAD,
+ LOG_DEFAULT_ENCRYPTION_KEY,
+ info.key_version));
+ return buf;
+}
+
+#include "mtr0log.h"
+
+/** Encrypt a log snippet
+@param iv initialization vector
+@param tmp temporary buffer
+@param buf buffer to be replaced with encrypted contents
+@param end pointer past the end of buf
+@return encrypted data bytes that follow */
+static size_t log_encrypt_buf(byte iv[MY_AES_BLOCK_SIZE],
+ byte *&tmp, byte *buf, const byte *const end)
+{
+ for (byte *l= buf; l != end; )
+ {
+ const byte b= *l++;
+ size_t rlen= b & 0xf;
+ if (!rlen)
+ {
+ const size_t lenlen= mlog_decode_varint_length(*l);
+ const uint32_t addlen= mlog_decode_varint(l);
+ ut_ad(addlen != MLOG_DECODE_ERROR);
+ rlen= addlen + 15 - lenlen;
+ l+= lenlen;
+ }
+
+ if (b < 0x80)
+ {
+ /* Add the page identifier to the initialization vector. */
+ size_t idlen= mlog_decode_varint_length(*l);
+ ut_ad(idlen <= 5);
+ ut_ad(idlen < rlen);
+ mach_write_to_4(my_assume_aligned<4>(iv + 8), mlog_decode_varint(l));
+ l+= idlen;
+ rlen-= idlen;
+ idlen= mlog_decode_varint_length(*l);
+ ut_ad(idlen <= 5);
+ ut_ad(idlen <= rlen);
+ mach_write_to_4(my_assume_aligned<4>(iv + 12), mlog_decode_varint(l));
+ l+= idlen;
+ rlen-= idlen;
+ }
+
+ uint len;
+
+ if (l + rlen > end)
+ {
+ if (size_t len= end - l)
+ {
+ /* Only WRITE or EXTENDED records may comprise multiple segments. */
+ static_assert((EXTENDED | 0x10) == WRITE, "compatibility");
+ ut_ad((b & 0x60) == EXTENDED);
+ ut_ad(l < end);
+ memcpy(tmp, l, len);
+ tmp+= len;
+ rlen-= len;
+ }
+ return rlen;
+ }
+
+ if (!rlen)
+ continue; /* FREE_PAGE and INIT_PAGE have no payload. */
+
+ len= static_cast<uint>(rlen);
+ ut_a(MY_AES_OK == encryption_crypt(l, len, tmp, &len,
+ info.crypt_key, MY_AES_BLOCK_SIZE,
+ iv, MY_AES_BLOCK_SIZE,
+ ENCRYPTION_FLAG_ENCRYPT |
+ ENCRYPTION_FLAG_NOPAD,
+ LOG_DEFAULT_ENCRYPTION_KEY,
+ info.key_version));
+ ut_ad(len == rlen);
+ memcpy(l, tmp, rlen);
+ l+= rlen;
+ }
+
+ return 0;
+}
+
+/** Encrypt the log */
+ATTRIBUTE_NOINLINE void mtr_t::encrypt()
+{
+ ut_ad(log_sys.format == log_t::FORMAT_ENC_10_8);
+ ut_ad(m_log.size());
+
+ alignas(8) byte iv[MY_AES_BLOCK_SIZE];
+
+ m_commit_lsn= log_sys.get_lsn();
+ ut_ad(m_commit_lsn);
+ byte *tmp= static_cast<byte*>(alloca(srv_page_size)), *t= tmp;
+ byte *dst= static_cast<byte*>(alloca(srv_page_size));
+ mach_write_to_8(iv, m_commit_lsn);
+ mtr_buf_t::block_t *start= nullptr;
+ size_t size= 0, start_size= 0;
+ m_crc= 0;
+
+ m_log.for_each_block([&](mtr_buf_t::block_t *b)
+ {
+ ut_ad(t - tmp + size <= srv_page_size);
+ byte *buf= b->begin();
+ if (!start)
+ {
+ parse:
+ ut_ad(t == tmp);
+ size= log_encrypt_buf(iv, t, buf, b->end());
+ if (!size)
+ {
+ ut_ad(t == tmp);
+ start_size= 0;
+ }
+ else
+ {
+ start= b;
+ start_size= t - tmp;
+ }
+ m_crc= my_crc32c(m_crc, buf, b->end() - buf - start_size);
+ }
+ else if (size > b->used())
+ {
+ ::memcpy(t, buf, b->used());
+ t+= b->used();
+ size-= b->used();
+ }
+ else
+ {
+ ::memcpy(t, buf, size);
+ t+= size;
+ buf+= size;
+ uint len= static_cast<uint>(t - tmp);
+ ut_a(MY_AES_OK == encryption_crypt(tmp, len, dst, &len,
+ info.crypt_key, MY_AES_BLOCK_SIZE,
+ iv, MY_AES_BLOCK_SIZE,
+ ENCRYPTION_FLAG_ENCRYPT |
+ ENCRYPTION_FLAG_NOPAD,
+ LOG_DEFAULT_ENCRYPTION_KEY,
+ info.key_version));
+ ut_ad(tmp + len == t);
+ m_crc= my_crc32c(m_crc, dst, len);
+ /* Copy the encrypted data back to the log snippets. */
+ ::memcpy(start->end() - start_size, dst, start_size);
+ t= dst + start_size;
+ for (ilist<mtr_buf_t::block_t>::iterator i(start); &*++i != b;)
+ {
+ const size_t l{i->used()};
+ ::memcpy(i->begin(), t, l);
+ t+= l;
+ }
+ ::memcpy(b->begin(), t, size);
+ ut_ad(t + size == dst + len);
+ t= tmp;
+ start= nullptr;
+ goto parse;
+ }
+ return true;
+ });
+
+ ut_ad(t == tmp);
+ ut_ad(!start);
+ ut_ad(!size);
+}
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc
index c53e2fd5074..048474921e5 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -61,110 +61,38 @@ Every change to a contents of a data page must be done
through mtr_t, and mtr_t::commit() will write log records
to the InnoDB redo log. */
+alignas(CPU_LEVEL1_DCACHE_LINESIZE)
+static group_commit_lock flush_lock;
+alignas(CPU_LEVEL1_DCACHE_LINESIZE)
+static group_commit_lock write_lock;
+
/** Redo log system */
log_t log_sys;
-/* A margin for free space in the log buffer before a log entry is catenated */
-#define LOG_BUF_WRITE_MARGIN (4 * OS_FILE_LOG_BLOCK_SIZE)
-
/* Margins for free space in the log buffer after a log entry is catenated */
#define LOG_BUF_FLUSH_RATIO 2
-#define LOG_BUF_FLUSH_MARGIN (LOG_BUF_WRITE_MARGIN \
+#define LOG_BUF_FLUSH_MARGIN ((4 * 4096) /* cf. log_t::append_prepare() */ \
+ (4U << srv_page_size_shift))
-/** Extends the log buffer.
-@param[in] len requested minimum size in bytes */
-void log_buffer_extend(ulong len)
-{
- const size_t new_buf_size = ut_calc_align(len, srv_page_size);
- byte* new_buf = static_cast<byte*>
- (ut_malloc_dontdump(new_buf_size, PSI_INSTRUMENT_ME));
- byte* new_flush_buf = static_cast<byte*>
- (ut_malloc_dontdump(new_buf_size, PSI_INSTRUMENT_ME));
-
- mysql_mutex_lock(&log_sys.mutex);
-
- if (len <= srv_log_buffer_size) {
- /* Already extended enough by the others */
- mysql_mutex_unlock(&log_sys.mutex);
- ut_free_dodump(new_buf, new_buf_size);
- ut_free_dodump(new_flush_buf, new_buf_size);
- return;
- }
-
- ib::warn() << "The redo log transaction size " << len <<
- " exceeds innodb_log_buffer_size="
- << srv_log_buffer_size << " / 2). Trying to extend it.";
-
- byte* old_buf = log_sys.buf;
- byte* old_flush_buf = log_sys.flush_buf;
- const ulong old_buf_size = srv_log_buffer_size;
- srv_log_buffer_size = static_cast<ulong>(new_buf_size);
- log_sys.buf = new_buf;
- log_sys.flush_buf = new_flush_buf;
- memcpy_aligned<OS_FILE_LOG_BLOCK_SIZE>(new_buf, old_buf,
- log_sys.buf_free);
-
- log_sys.max_buf_free = new_buf_size / LOG_BUF_FLUSH_RATIO
- - LOG_BUF_FLUSH_MARGIN;
-
- mysql_mutex_unlock(&log_sys.mutex);
-
- ut_free_dodump(old_buf, old_buf_size);
- ut_free_dodump(old_flush_buf, old_buf_size);
-
- ib::info() << "innodb_log_buffer_size was extended to "
- << new_buf_size << ".";
-}
-
-/** Calculate the recommended highest values for lsn - last_checkpoint_lsn
-and lsn - buf_pool.get_oldest_modification().
-@param[in] file_size requested innodb_log_file_size
-@retval true on success
-@retval false if the smallest log group is too small to
-accommodate the number of OS threads in the database server */
-bool
-log_set_capacity(ulonglong file_size)
+void log_t::set_capacity()
{
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
/* Margin for the free space in the smallest log, before a new query
step which modifies the database, is started */
- const size_t LOG_CHECKPOINT_FREE_PER_THREAD = 4U
- << srv_page_size_shift;
- const size_t LOG_CHECKPOINT_EXTRA_FREE = 8U << srv_page_size_shift;
-
- lsn_t margin;
- ulint free;
- lsn_t smallest_capacity = file_size - LOG_FILE_HDR_SIZE;
+ lsn_t smallest_capacity = srv_log_file_size - log_t::START_OFFSET;
/* Add extra safety */
smallest_capacity -= smallest_capacity / 10;
- /* For each OS thread we must reserve so much free space in the
- smallest log group that it can accommodate the log entries produced
- by single query steps: running out of free log space is a serious
- system error which requires rebooting the database. */
-
- free = LOG_CHECKPOINT_FREE_PER_THREAD * 10
- + LOG_CHECKPOINT_EXTRA_FREE;
- if (free >= smallest_capacity / 2) {
- ib::error() << "innodb_log_file_size is too small. "
- << INNODB_PARAMETERS_MSG;
- return false;
- }
-
- margin = smallest_capacity - free;
- margin = margin - margin / 10; /* Add still some extra safety */
-
- mysql_mutex_lock(&log_sys.mutex);
+ lsn_t margin = smallest_capacity - (48 << srv_page_size_shift);
+ margin -= margin / 10; /* Add still some extra safety */
log_sys.log_capacity = smallest_capacity;
log_sys.max_modified_age_async = margin - margin / 8;
log_sys.max_checkpoint_age = margin;
-
- mysql_mutex_unlock(&log_sys.mutex);
-
- return(true);
}
/** Initialize the redo log subsystem. */
@@ -172,717 +100,662 @@ void log_t::create()
{
ut_ad(this == &log_sys);
ut_ad(!is_initialised());
- m_initialised= true;
-#if defined(__aarch64__)
- mysql_mutex_init(log_sys_mutex_key, &mutex, MY_MUTEX_INIT_FAST);
- mysql_mutex_init(
- log_flush_order_mutex_key, &flush_order_mutex, MY_MUTEX_INIT_FAST);
-#else
- mysql_mutex_init(log_sys_mutex_key, &mutex, nullptr);
- mysql_mutex_init(log_flush_order_mutex_key, &flush_order_mutex, nullptr);
-#endif
-
- /* Start the lsn from one log block from zero: this way every
- log record has a non-zero start lsn, a fact which we will use */
-
- set_lsn(LOG_START_LSN + LOG_BLOCK_HDR_SIZE);
- set_flushed_lsn(LOG_START_LSN + LOG_BLOCK_HDR_SIZE);
+ latch.SRW_LOCK_INIT(log_latch_key);
+ init_lsn_lock();
- ut_ad(srv_log_buffer_size >= 16 * OS_FILE_LOG_BLOCK_SIZE);
- ut_ad(srv_log_buffer_size >= 4U << srv_page_size_shift);
+ /* LSN 0 and 1 are reserved; @see buf_page_t::oldest_modification_ */
+ lsn.store(FIRST_LSN, std::memory_order_relaxed);
+ flushed_to_disk_lsn.store(FIRST_LSN, std::memory_order_relaxed);
+ write_lsn= FIRST_LSN;
- buf= static_cast<byte*>(ut_malloc_dontdump(srv_log_buffer_size,
- PSI_INSTRUMENT_ME));
- TRASH_ALLOC(buf, srv_log_buffer_size);
- flush_buf= static_cast<byte*>(ut_malloc_dontdump(srv_log_buffer_size,
+#ifndef HAVE_PMEM
+ buf= static_cast<byte*>(ut_malloc_dontdump(buf_size, PSI_INSTRUMENT_ME));
+ TRASH_ALLOC(buf, buf_size);
+ flush_buf= static_cast<byte*>(ut_malloc_dontdump(buf_size,
PSI_INSTRUMENT_ME));
- TRASH_ALLOC(flush_buf, srv_log_buffer_size);
+ TRASH_ALLOC(flush_buf, buf_size);
+ checkpoint_buf= static_cast<byte*>(aligned_malloc(4096, 4096));
+ memset_aligned<4096>(checkpoint_buf, 0, 4096);
+#else
+ ut_ad(!checkpoint_buf);
+ ut_ad(!buf);
+ ut_ad(!flush_buf);
+#endif
- max_buf_free= srv_log_buffer_size / LOG_BUF_FLUSH_RATIO -
- LOG_BUF_FLUSH_MARGIN;
+ max_buf_free= buf_size / LOG_BUF_FLUSH_RATIO - LOG_BUF_FLUSH_MARGIN;
set_check_flush_or_checkpoint();
- n_log_ios_old= n_log_ios;
- last_printout_time= time(NULL);
-
- buf_next_to_write= 0;
- last_checkpoint_lsn= write_lsn= LOG_START_LSN;
- n_log_ios= 0;
- n_log_ios_old= 0;
+ last_checkpoint_lsn= FIRST_LSN;
log_capacity= 0;
max_modified_age_async= 0;
max_checkpoint_age= 0;
- next_checkpoint_no= 0;
next_checkpoint_lsn= 0;
checkpoint_pending= false;
- log_block_init(buf, LOG_START_LSN);
- log_block_set_first_rec_group(buf, LOG_BLOCK_HDR_SIZE);
-
- buf_free= LOG_BLOCK_HDR_SIZE;
- checkpoint_buf= static_cast<byte*>
- (aligned_malloc(OS_FILE_LOG_BLOCK_SIZE, OS_FILE_LOG_BLOCK_SIZE));
-}
-
-file_os_io::file_os_io(file_os_io &&rhs) : m_fd(rhs.m_fd)
-{
- rhs.m_fd= OS_FILE_CLOSED;
-}
-
-file_os_io &file_os_io::operator=(file_os_io &&rhs)
-{
- std::swap(m_fd, rhs.m_fd);
- return *this;
-}
-
-file_os_io::~file_os_io() noexcept
-{
- if (is_opened())
- close();
-}
-
-dberr_t file_os_io::open(const char *path, bool read_only) noexcept
-{
- ut_ad(!is_opened());
-
- bool success;
- auto tmp_fd= os_file_create(
- innodb_log_file_key, path, OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT,
- OS_FILE_NORMAL, OS_LOG_FILE, read_only, &success);
- if (!success)
- return DB_ERROR;
+ buf_free= 0;
- m_durable_writes= srv_file_flush_method == SRV_O_DSYNC;
- m_fd= tmp_fd;
- return success ? DB_SUCCESS : DB_ERROR;
+ ut_ad(is_initialised());
}
-dberr_t file_os_io::rename(const char *old_path, const char *new_path) noexcept
+dberr_t log_file_t::close() noexcept
{
- return os_file_rename(innodb_log_file_key, old_path, new_path) ? DB_SUCCESS
- : DB_ERROR;
-}
+ ut_a(is_opened());
-dberr_t file_os_io::close() noexcept
-{
- if (!os_file_close(m_fd))
+ if (!os_file_close_func(m_file))
return DB_ERROR;
- m_fd= OS_FILE_CLOSED;
+ m_file= OS_FILE_CLOSED;
return DB_SUCCESS;
}
-dberr_t file_os_io::read(os_offset_t offset, span<byte> buf) noexcept
+dberr_t log_file_t::read(os_offset_t offset, span<byte> buf) noexcept
{
- return os_file_read(IORequestRead, m_fd, buf.data(), offset, buf.size(),
+ ut_ad(is_opened());
+ return os_file_read(IORequestRead, m_file, buf.data(), offset, buf.size(),
nullptr);
}
-dberr_t file_os_io::write(const char *path, os_offset_t offset,
- span<const byte> buf) noexcept
+void log_file_t::write(os_offset_t offset, span<const byte> buf) noexcept
{
- return os_file_write(IORequestWrite, path, m_fd, buf.data(), offset,
- buf.size());
-}
-
-dberr_t file_os_io::flush() noexcept
-{
- return os_file_flush(m_fd) ? DB_SUCCESS : DB_ERROR;
+ ut_ad(is_opened());
+ if (dberr_t err= os_file_write(IORequestWrite, "ib_logfile0", m_file,
+ buf.data(), offset, buf.size()))
+ ib::fatal() << "write(\"ib_logfile0\") returned " << err;
}
#ifdef HAVE_PMEM
+# include <libpmem.h>
+#endif
-#include <libpmem.h>
-
-/** Memory mapped file */
-class mapped_file_t
-{
-public:
- mapped_file_t()= default;
- mapped_file_t(const mapped_file_t &)= delete;
- mapped_file_t &operator=(const mapped_file_t &)= delete;
- mapped_file_t(mapped_file_t &&)= delete;
- mapped_file_t &operator=(mapped_file_t &&)= delete;
- ~mapped_file_t() noexcept;
-
- dberr_t map(const char *path, bool read_only= false,
- bool nvme= false) noexcept;
- dberr_t unmap() noexcept;
- byte *data() noexcept { return m_area.data(); }
-
-private:
- span<byte> m_area;
-};
-
-mapped_file_t::~mapped_file_t() noexcept
+void log_t::attach(log_file_t file, os_offset_t size)
{
- if (!m_area.empty())
- unmap();
-}
+ log= file;
+ ut_ad(!size || size >= START_OFFSET + SIZE_OF_FILE_CHECKPOINT);
+ file_size= size;
-dberr_t mapped_file_t::map(const char *path, bool read_only,
- bool nvme) noexcept
-{
- auto fd= mysql_file_open(innodb_log_file_key, path,
- read_only ? O_RDONLY : O_RDWR, MYF(MY_WME));
- if (fd == -1)
- return DB_ERROR;
-
- const auto file_size= size_t{os_file_get_size(path).m_total_size};
-
- const int nvme_flag= nvme ? MAP_SYNC : 0;
- void *ptr=
- my_mmap(0, file_size, read_only ? PROT_READ : PROT_READ | PROT_WRITE,
- MAP_SHARED_VALIDATE | nvme_flag, fd, 0);
- mysql_file_close(fd, MYF(MY_WME));
+#ifdef HAVE_PMEM
+ ut_ad(!buf);
+ ut_ad(!flush_buf);
+ if (size && !(size_t(size) & 4095) && srv_operation != SRV_OPERATION_BACKUP)
+ {
+ void *ptr=
+ my_mmap(0, size_t(size),
+ srv_read_only_mode ? PROT_READ : PROT_READ | PROT_WRITE,
+ MAP_SHARED_VALIDATE | MAP_SYNC, log.m_file, 0);
+#ifdef __linux__
+ if (ptr == MAP_FAILED)
+ {
+ struct stat st;
+ if (!fstat(log.m_file, &st))
+ {
+ MSAN_STAT_WORKAROUND(&st);
+ const auto st_dev= st.st_dev;
+ if (!stat("/dev/shm", &st))
+ {
+ MSAN_STAT_WORKAROUND(&st);
+ if (st.st_dev == st_dev)
+ ptr= my_mmap(0, size_t(size), srv_read_only_mode
+ ? PROT_READ : PROT_READ | PROT_WRITE,
+ MAP_SHARED, log.m_file, 0);
+ }
+ }
+ }
+#endif /* __linux__ */
+ if (ptr != MAP_FAILED)
+ {
+ log.close();
+ mprotect(ptr, size_t(size), PROT_READ);
+ buf= static_cast<byte*>(ptr);
+#if defined __linux__ || defined _WIN32
+ set_block_size(CPU_LEVEL1_DCACHE_LINESIZE);
+#endif
+ log_maybe_unbuffered= true;
+ log_buffered= false;
+ return;
+ }
+ }
+ buf= static_cast<byte*>(ut_malloc_dontdump(buf_size, PSI_INSTRUMENT_ME));
+ TRASH_ALLOC(buf, buf_size);
+ flush_buf= static_cast<byte*>(ut_malloc_dontdump(buf_size,
+ PSI_INSTRUMENT_ME));
+ TRASH_ALLOC(flush_buf, buf_size);
+#endif
- if (ptr == MAP_FAILED)
- return DB_ERROR;
+#if defined __linux__ || defined _WIN32
+ sql_print_information("InnoDB: %s (block size=%u bytes)",
+ log_buffered
+ ? "Buffered log writes"
+ : "File system buffers for log disabled",
+ block_size);
+#endif
- m_area= {static_cast<byte *>(ptr), file_size};
- return DB_SUCCESS;
+#ifdef HAVE_PMEM
+ checkpoint_buf= static_cast<byte*>(aligned_malloc(block_size, block_size));
+ memset_aligned<64>(checkpoint_buf, 0, block_size);
+#endif
}
-dberr_t mapped_file_t::unmap() noexcept
+void log_t::create(lsn_t lsn) noexcept
{
- ut_ad(!m_area.empty());
-
- if (my_munmap(m_area.data(), m_area.size()))
- return DB_ERROR;
-
- m_area= {};
- return DB_SUCCESS;
-}
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(latch.is_write_locked());
+#endif
+ ut_ad(!recv_no_log_write);
+ ut_ad(is_latest());
+ ut_ad(this == &log_sys);
-static bool is_pmem(const char *path) noexcept
-{
- mapped_file_t mf;
- return mf.map(path, true, true) == DB_SUCCESS ? true : false;
-}
+ this->lsn.store(lsn, std::memory_order_relaxed);
+ this->flushed_to_disk_lsn.store(lsn, std::memory_order_relaxed);
+ first_lsn= lsn;
+ write_lsn= lsn;
-class file_pmem_io final : public file_io
-{
-public:
- file_pmem_io() noexcept : file_io(true) {}
+ last_checkpoint_lsn= 0;
- dberr_t open(const char *path, bool read_only) noexcept final
- {
- return m_file.map(path, read_only, true);
- }
- dberr_t rename(const char *old_path, const char *new_path) noexcept final
- {
- return os_file_rename(innodb_log_file_key, old_path, new_path) ? DB_SUCCESS
- : DB_ERROR;
- }
- dberr_t close() noexcept final { return m_file.unmap(); }
- dberr_t read(os_offset_t offset, span<byte> buf) noexcept final
- {
- memcpy(buf.data(), m_file.data() + offset, buf.size());
- return DB_SUCCESS;
- }
- dberr_t write(const char *, os_offset_t offset,
- span<const byte> buf) noexcept final
+#ifdef HAVE_PMEM
+ if (is_pmem())
{
- pmem_memcpy_persist(m_file.data() + offset, buf.data(), buf.size());
- return DB_SUCCESS;
+ mprotect(buf, size_t(file_size), PROT_READ | PROT_WRITE);
+ memset_aligned<4096>(buf, 0, 4096);
+ buf_free= START_OFFSET;
}
- dberr_t flush() noexcept final
+ else
+#endif
{
- ut_ad(0);
- return DB_SUCCESS;
+ buf_free= 0;
+ memset_aligned<4096>(flush_buf, 0, buf_size);
+ memset_aligned<4096>(buf, 0, buf_size);
}
-private:
- mapped_file_t m_file;
-};
-#endif
+ mach_write_to_4(buf + LOG_HEADER_FORMAT, FORMAT_10_8);
+ mach_write_to_8(buf + LOG_HEADER_START_LSN, lsn);
+ static constexpr const char LOG_HEADER_CREATOR_CURRENT[]=
+ "MariaDB "
+ IB_TO_STR(MYSQL_VERSION_MAJOR) "."
+ IB_TO_STR(MYSQL_VERSION_MINOR) "."
+ IB_TO_STR(MYSQL_VERSION_PATCH);
-dberr_t log_file_t::open(bool read_only) noexcept
-{
- ut_a(!is_opened());
+ strcpy(reinterpret_cast<char*>(buf) + LOG_HEADER_CREATOR,
+ LOG_HEADER_CREATOR_CURRENT);
+ static_assert(LOG_HEADER_CREATOR_END - LOG_HEADER_CREATOR >=
+ sizeof LOG_HEADER_CREATOR_CURRENT, "compatibility");
+ if (is_encrypted())
+ log_crypt_write_header(buf + LOG_HEADER_CREATOR_END);
+ mach_write_to_4(my_assume_aligned<4>(508 + buf), my_crc32c(0, buf, 508));
+
+ DBUG_PRINT("ib_log", ("write header " LSN_PF, lsn));
#ifdef HAVE_PMEM
- auto ptr= is_pmem(m_path.c_str())
- ? std::unique_ptr<file_io>(new file_pmem_io)
- : std::unique_ptr<file_io>(new file_os_io);
-#else
- auto ptr= std::unique_ptr<file_io>(new file_os_io);
+ if (is_pmem())
+ pmem_persist(buf, 512);
+ else
#endif
-
- if (dberr_t err= ptr->open(m_path.c_str(), read_only))
- return err;
-
- m_file= std::move(ptr);
- return DB_SUCCESS;
-}
-
-bool log_file_t::is_opened() const noexcept
-{
- return static_cast<bool>(m_file);
-}
-
-dberr_t log_file_t::rename(std::string new_path) noexcept
-{
- if (dberr_t err= m_file->rename(m_path.c_str(), new_path.c_str()))
- return err;
-
- m_path = std::move(new_path);
- return DB_SUCCESS;
+ {
+ log.write(0, {buf, 4096});
+ memset_aligned<512>(buf, 0, 512);
+ }
}
-dberr_t log_file_t::close() noexcept
+void log_t::close_file()
{
- ut_a(is_opened());
-
- if (dberr_t err= m_file->close())
- return err;
-
- m_file.reset();
- return DB_SUCCESS;
-}
+#ifdef HAVE_PMEM
+ if (is_pmem())
+ {
+ ut_ad(!is_opened());
+ ut_ad(!checkpoint_buf);
+ if (buf)
+ {
+ my_munmap(buf, file_size);
+ buf= nullptr;
+ }
+ return;
+ }
-dberr_t log_file_t::read(os_offset_t offset, span<byte> buf) noexcept
-{
- ut_ad(is_opened());
- return m_file->read(offset, buf);
+ ut_free_dodump(buf, buf_size);
+ buf= nullptr;
+ ut_free_dodump(flush_buf, buf_size);
+ flush_buf= nullptr;
+ aligned_free(checkpoint_buf);
+ checkpoint_buf= nullptr;
+#endif
+ if (is_opened())
+ if (const dberr_t err= log.close())
+ ib::fatal() << "closing ib_logfile0 failed: " << err;
}
-bool log_file_t::writes_are_durable() const noexcept
+#if defined __linux__ || defined _WIN32
+/** Acquire all latches that protect the log. */
+static void log_resize_acquire()
{
- return m_file->writes_are_durable();
-}
+ if (!log_sys.is_pmem())
+ {
+ while (flush_lock.acquire(log_sys.get_lsn() + 1, nullptr) !=
+ group_commit_lock::ACQUIRED);
+ while (write_lock.acquire(log_sys.get_lsn() + 1, nullptr) !=
+ group_commit_lock::ACQUIRED);
+ }
-dberr_t log_file_t::write(os_offset_t offset, span<const byte> buf) noexcept
-{
- ut_ad(is_opened());
- return m_file->write(m_path.c_str(), offset, buf);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
}
-dberr_t log_file_t::flush() noexcept
+/** Release the latches that protect the log. */
+void log_resize_release()
{
- ut_ad(is_opened());
- return m_file->flush();
-}
+ log_sys.latch.wr_unlock();
-void log_t::file::open_file(std::string path)
-{
- fd= log_file_t(std::move(path));
- if (const dberr_t err= fd.open(srv_read_only_mode))
- ib::fatal() << "open(" << fd.get_path() << ") returned " << err;
+ if (!log_sys.is_pmem())
+ {
+ lsn_t lsn1= write_lock.release(write_lock.value());
+ lsn_t lsn2= flush_lock.release(flush_lock.value());
+ if (lsn1 || lsn2)
+ log_write_up_to(std::max(lsn1, lsn2), true, nullptr);
+ }
}
-/** Update the log block checksum. */
-static void log_block_store_checksum(byte* block)
+/** Try to enable or disable file system caching (update log_buffered) */
+void log_t::set_buffered(bool buffered)
{
- log_block_set_checksum(block, log_block_calc_checksum_crc32(block));
+ if (!log_maybe_unbuffered || is_pmem() || high_level_read_only)
+ return;
+ log_resize_acquire();
+ if (!resize_in_progress() && is_opened() && bool(log_buffered) != buffered)
+ {
+ os_file_close_func(log.m_file);
+ log.m_file= OS_FILE_CLOSED;
+ std::string path{get_log_file_path()};
+ log_buffered= buffered;
+ bool success;
+ log.m_file= os_file_create_func(path.c_str(),
+ OS_FILE_OPEN, OS_FILE_NORMAL, OS_LOG_FILE,
+ false, &success);
+ ut_a(log.m_file != OS_FILE_CLOSED);
+ sql_print_information("InnoDB: %s (block size=%u bytes)",
+ log_buffered
+ ? "Buffered log writes"
+ : "File system buffers for log disabled",
+ block_size);
+ }
+ log_resize_release();
}
+#endif
-void log_t::file::write_header_durable(lsn_t lsn)
+/** Write an aligned buffer to ib_logfile0.
+@param buf buffer to be written
+@param len length of data to be written
+@param offset log file offset */
+static void log_write_buf(const byte *buf, size_t len, lsn_t offset)
{
- ut_ad(lsn % OS_FILE_LOG_BLOCK_SIZE == 0);
+ ut_ad(write_lock.is_owner());
ut_ad(!recv_no_log_write);
- ut_ad(log_sys.log.format == log_t::FORMAT_10_5 ||
- log_sys.log.format == log_t::FORMAT_ENC_10_5);
-
- byte *buf= log_sys.checkpoint_buf;
- memset_aligned<OS_FILE_LOG_BLOCK_SIZE>(buf, 0, OS_FILE_LOG_BLOCK_SIZE);
+ ut_d(const size_t block_size_1= log_sys.get_block_size() - 1);
+ ut_ad(!(offset & block_size_1));
+ ut_ad(!(len & block_size_1));
+ ut_ad(!(size_t(buf) & block_size_1));
+ ut_ad(len);
- mach_write_to_4(buf + LOG_HEADER_FORMAT, log_sys.log.format);
- mach_write_to_4(buf + LOG_HEADER_SUBFORMAT, log_sys.log.subformat);
- mach_write_to_8(buf + LOG_HEADER_START_LSN, lsn);
- strcpy(reinterpret_cast<char*>(buf) + LOG_HEADER_CREATOR,
- LOG_HEADER_CREATOR_CURRENT);
- ut_ad(LOG_HEADER_CREATOR_END - LOG_HEADER_CREATOR >=
- sizeof LOG_HEADER_CREATOR_CURRENT);
- log_block_store_checksum(buf);
-
- DBUG_PRINT("ib_log", ("write " LSN_PF, lsn));
-
- log_sys.log.write(0, {buf, OS_FILE_LOG_BLOCK_SIZE});
- if (!log_sys.log.writes_are_durable())
- log_sys.log.flush();
-}
+ if (UNIV_LIKELY(offset + len <= log_sys.file_size))
+ {
+write:
+ log_sys.log.write(offset, {buf, len});
+ return;
+ }
-void log_t::file::read(os_offset_t offset, span<byte> buf)
-{
- if (const dberr_t err= fd.read(offset, buf))
- ib::fatal() << "read(" << fd.get_path() << ") returned "<< err;
+ const size_t write_len= size_t(log_sys.file_size - offset);
+ log_sys.log.write(offset, {buf, write_len});
+ len-= write_len;
+ buf+= write_len;
+ ut_ad(log_sys.START_OFFSET + len < offset);
+ offset= log_sys.START_OFFSET;
+ goto write;
}
-bool log_t::file::writes_are_durable() const noexcept
-{
- return fd.writes_are_durable();
-}
+/** Invoke commit_checkpoint_notify_ha() to notify that outstanding
+log writes have been completed. */
+void log_flush_notify(lsn_t flush_lsn);
-void log_t::file::write(os_offset_t offset, span<byte> buf)
-{
- srv_stats.os_log_pending_writes.inc();
- if (const dberr_t err= fd.write(offset, buf))
- ib::fatal() << "write(" << fd.get_path() << ") returned " << err;
- srv_stats.os_log_pending_writes.dec();
- srv_stats.os_log_written.add(buf.size());
- srv_stats.log_writes.inc();
- log_sys.n_log_ios++;
-}
+#if 0 // Currently we overwrite the last log block until it is complete.
+/** CRC-32C of pad messages using between 1 and 15 bytes of NUL bytes
+in the payload */
+static const unsigned char pad_crc[15][4]= {
+ {0xA6,0x59,0xC1,0xDB}, {0xF2,0xAF,0x80,0x73}, {0xED,0x02,0xF1,0x90},
+ {0x68,0x4E,0xA3,0xF3}, {0x5D,0x1B,0xEA,0x6A}, {0xE0,0x01,0x86,0xB9},
+ {0xD1,0x06,0x86,0xF5}, {0xEB,0x20,0x12,0x33}, {0xBA,0x73,0xB2,0xA3},
+ {0x5F,0xA2,0x08,0x03}, {0x70,0x03,0xD6,0x9D}, {0xED,0xB3,0x49,0x78},
+ {0xFD,0xD6,0xB9,0x9C}, {0x25,0xF8,0xB1,0x2C}, {0xCD,0xAA,0xE7,0x10}
+};
-void log_t::file::flush()
+/** Pad the log with some dummy bytes
+@param lsn desired log sequence number
+@param pad number of bytes to append to the log
+@param begin buffer to write 'pad' bytes to
+@param extra buffer for additional pad bytes (up to 15 bytes)
+@return additional bytes used in extra[] */
+ATTRIBUTE_NOINLINE
+static size_t log_pad(lsn_t lsn, size_t pad, byte *begin, byte *extra)
{
- log_sys.pending_flushes.fetch_add(1, std::memory_order_acquire);
- if (const dberr_t err= fd.flush())
- ib::fatal() << "flush(" << fd.get_path() << ") returned " << err;
- log_sys.pending_flushes.fetch_sub(1, std::memory_order_release);
- log_sys.flushes.fetch_add(1, std::memory_order_release);
-}
+ ut_ad(!(size_t(begin + pad) & (log_sys.get_block_size() - 1)));
+ byte *b= begin;
+ const byte seq{log_sys.get_sequence_bit(lsn)};
+ /* The caller should never request padding such that the
+ file would wrap around to the beginning. That is, the sequence
+ bit must be the same for all records. */
+ ut_ad(seq == log_sys.get_sequence_bit(lsn + pad));
+
+ if (log_sys.is_encrypted())
+ {
+ /* The lengths of our pad messages vary between 15 and 29 bytes
+ (FILE_CHECKPOINT byte, 1 to 15 NUL bytes, sequence byte,
+ 4 bytes checksum, 8 NUL bytes nonce). */
+ if (pad < 15)
+ {
+ extra[0]= FILE_CHECKPOINT | 1;
+ extra[1]= 0;
+ extra[2]= seq;
+ memcpy(extra + 3, pad_crc[0], 4);
+ memset(extra + 7, 0, 8);
+ memcpy(b, extra, pad);
+ memmove(extra, extra + pad, 15 - pad);
+ return 15 - pad;
+ }
-void log_t::file::close_file()
-{
- if (fd.is_opened())
+ /* Pad first with 29-byte messages until the remaining size is
+ less than 29+15 bytes, and then write 1 or 2 shorter messages. */
+ const byte *const end= begin + pad;
+ for (; b + (29 + 15) < end; b+= 29)
+ {
+ b[0]= FILE_CHECKPOINT | 15;
+ memset(b + 1, 0, 15);
+ b[16]= seq;
+ memcpy(b + 17, pad_crc[14], 4);
+ memset(b + 21, 0, 8);
+ }
+ if (b + 29 < end)
+ {
+ b[0]= FILE_CHECKPOINT | 1;
+ b[1]= 0;
+ b[2]= seq;
+ memcpy(b + 3, pad_crc[0], 4);
+ memset(b + 7, 0, 8);
+ b+= 15;
+ }
+ const size_t last_pad(end - b);
+ ut_ad(last_pad >= 15);
+ ut_ad(last_pad <= 29);
+ b[0]= FILE_CHECKPOINT | byte(last_pad - 14);
+ memset(b + 1, 0, last_pad - 14);
+ b[last_pad - 13]= seq;
+ memcpy(b + last_pad - 12, pad_crc[last_pad - 15], 4);
+ memset(b + last_pad - 8, 0, 8);
+ }
+ else
{
- if (const dberr_t err= fd.close())
- ib::fatal() << "close(" << fd.get_path() << ") returned " << err;
+ /* The lengths of our pad messages vary between 7 and 21 bytes
+ (FILE_CHECKPOINT byte, 1 to 15 NUL bytes, sequence byte,
+ 4 bytes checksum). */
+ if (pad < 7)
+ {
+ extra[0]= FILE_CHECKPOINT | 1;
+ extra[1]= 0;
+ extra[2]= seq;
+ memcpy(extra + 3, pad_crc[0], 4);
+ memcpy(b, extra, pad);
+ memmove(extra, extra + pad, 7 - pad);
+ return 7 - pad;
+ }
+
+ /* Pad first with 21-byte messages until the remaining size is
+ less than 21+7 bytes, and then write 1 or 2 shorter messages. */
+ const byte *const end= begin + pad;
+ for (; b + (21 + 7) < end; b+= 21)
+ {
+ b[0]= FILE_CHECKPOINT | 15;
+ memset(b + 1, 0, 15);
+ b[16]= seq;
+ memcpy(b + 17, pad_crc[14], 4);
+ }
+ if (b + 21 < end)
+ {
+ b[0]= FILE_CHECKPOINT | 1;
+ b[1]= 0;
+ b[2]= seq;
+ memcpy(b + 3, pad_crc[0], 4);
+ b+= 7;
+ }
+ const size_t last_pad(end - b);
+ ut_ad(last_pad >= 7);
+ ut_ad(last_pad <= 21);
+ b[0]= FILE_CHECKPOINT | byte(last_pad - 6);
+ memset(b + 1, 0, last_pad - 6);
+ b[last_pad - 5]= seq;
+ memcpy(b + last_pad - 4, pad_crc[last_pad - 7], 4);
}
- fd.free(); // Free path
-}
-/** Initialize the redo log. */
-void log_t::file::create()
-{
- ut_ad(this == &log_sys.log);
- ut_ad(log_sys.is_initialised());
-
- format= srv_encrypt_log ? log_t::FORMAT_ENC_10_5 : log_t::FORMAT_10_5;
- subformat= 2;
- file_size= srv_log_file_size;
- lsn= LOG_START_LSN;
- lsn_offset= LOG_FILE_HDR_SIZE;
+ return 0;
}
-
-/******************************************************//**
-Writes a buffer to a log file. */
-static
-void
-log_write_buf(
- byte* buf, /*!< in: buffer */
- ulint len, /*!< in: buffer len; must be divisible
- by OS_FILE_LOG_BLOCK_SIZE */
-#ifdef UNIV_DEBUG
- ulint pad_len, /*!< in: pad len in the buffer len */
-#endif /* UNIV_DEBUG */
- lsn_t start_lsn, /*!< in: start lsn of the buffer; must
- be divisible by
- OS_FILE_LOG_BLOCK_SIZE */
- ulint new_data_offset)/*!< in: start offset of new data in
- buf: this parameter is used to decide
- if we have to write a new log file
- header */
-{
- ulint write_len;
- lsn_t next_offset;
- ulint i;
-
- ut_ad(log_write_lock_own());
- ut_ad(!recv_no_log_write);
- ut_a(len % OS_FILE_LOG_BLOCK_SIZE == 0);
- ut_a(start_lsn % OS_FILE_LOG_BLOCK_SIZE == 0);
-
-loop:
- if (len == 0) {
-
- return;
- }
-
- next_offset = log_sys.log.calc_lsn_offset(start_lsn);
-
- if ((next_offset % log_sys.log.file_size) + len
- > log_sys.log.file_size) {
- /* if the above condition holds, then the below expression
- is < len which is ulint, so the typecast is ok */
- write_len = ulint(log_sys.log.file_size
- - (next_offset % log_sys.log.file_size));
- } else {
- write_len = len;
- }
-
- DBUG_PRINT("ib_log",
- ("write " LSN_PF " to " LSN_PF
- ": len " ULINTPF
- " blocks " ULINTPF ".." ULINTPF,
- start_lsn, next_offset,
- write_len,
- log_block_get_hdr_no(buf),
- log_block_get_hdr_no(
- buf + write_len
- - OS_FILE_LOG_BLOCK_SIZE)));
-
- ut_ad(pad_len >= len
- || log_block_get_hdr_no(buf)
- == log_block_convert_lsn_to_no(start_lsn));
-
- /* Calculate the checksums for each log block and write them to
- the trailer fields of the log blocks */
-
- for (i = 0; i < write_len / OS_FILE_LOG_BLOCK_SIZE; i++) {
-#ifdef UNIV_DEBUG
- ulint hdr_no_2 = log_block_get_hdr_no(buf) + i;
- DBUG_EXECUTE_IF("innodb_small_log_block_no_limit",
- hdr_no_2 = ((hdr_no_2 - 1) & 0xFUL) + 1;);
#endif
- ut_ad(pad_len >= len
- || i * OS_FILE_LOG_BLOCK_SIZE >= len - pad_len
- || log_block_get_hdr_no(buf + i * OS_FILE_LOG_BLOCK_SIZE) == hdr_no_2);
- log_block_store_checksum(buf + i * OS_FILE_LOG_BLOCK_SIZE);
- }
-
- log_sys.log.write(next_offset, {buf, write_len});
-
- if (write_len < len) {
- start_lsn += write_len;
- len -= write_len;
- buf += write_len;
- goto loop;
- }
-}
-
-/** Flush the recently written changes to the log file.*/
-static void log_write_flush_to_disk_low(lsn_t lsn)
-{
- if (!log_sys.log.writes_are_durable())
- log_sys.log.flush();
- ut_a(lsn >= log_sys.get_flushed_lsn());
- log_sys.set_flushed_lsn(lsn);
-}
-/** Swap log buffers, and copy the content of last block
-from old buf to the head of the new buf. Thus, buf_free and
-buf_next_to_write would be changed accordingly */
-static inline
-void
-log_buffer_switch()
+#ifdef HAVE_PMEM
+/** Persist the log.
+@param lsn desired new value of flushed_to_disk_lsn */
+inline void log_t::persist(lsn_t lsn) noexcept
{
- mysql_mutex_assert_owner(&log_sys.mutex);
- ut_ad(log_write_lock_own());
-
- size_t area_end = ut_calc_align<size_t>(
- log_sys.buf_free, OS_FILE_LOG_BLOCK_SIZE);
+ ut_ad(is_pmem());
+ ut_ad(!write_lock.is_owner());
+ ut_ad(!flush_lock.is_owner());
- /* Copy the last block to new buf */
- memcpy_aligned<OS_FILE_LOG_BLOCK_SIZE>(
- log_sys.flush_buf,
- log_sys.buf + area_end - OS_FILE_LOG_BLOCK_SIZE,
- OS_FILE_LOG_BLOCK_SIZE);
+ lsn_t old= flushed_to_disk_lsn.load(std::memory_order_relaxed);
- std::swap(log_sys.buf, log_sys.flush_buf);
+ if (old >= lsn)
+ return;
- log_sys.buf_free %= OS_FILE_LOG_BLOCK_SIZE;
- log_sys.buf_next_to_write = log_sys.buf_free;
-}
+ const size_t start(calc_lsn_offset(old));
+ const size_t end(calc_lsn_offset(lsn));
+ if (UNIV_UNLIKELY(end < start))
+ {
+ pmem_persist(log_sys.buf + start, log_sys.file_size - start);
+ pmem_persist(log_sys.buf + log_sys.START_OFFSET,
+ end - log_sys.START_OFFSET);
+ }
+ else
+ pmem_persist(log_sys.buf + start, end - start);
-/** Invoke commit_checkpoint_notify_ha() to notify that outstanding
-log writes have been completed. */
-void log_flush_notify(lsn_t flush_lsn);
+ old= flushed_to_disk_lsn.load(std::memory_order_relaxed);
-/**
-Writes log buffer to disk
-which is the "write" part of log_write_up_to().
+ if (old >= lsn)
+ return;
-This function does not flush anything.
+ while (!flushed_to_disk_lsn.compare_exchange_weak
+ (old, lsn, std::memory_order_release, std::memory_order_relaxed))
+ if (old >= lsn)
+ break;
-Note : the caller must have log_sys.mutex locked, and this
-mutex is released in the function.
+ log_flush_notify(lsn);
+ DBUG_EXECUTE_IF("crash_after_log_write_upto", DBUG_SUICIDE(););
+}
+#endif
+/** Write buf to ib_logfile0.
+@tparam release_latch whether to invoke latch.wr_unlock()
+@return lsn of a callback pending on write_lock
+@retval 0 if everything was written
*/
-static void log_write(bool rotate_key)
+template<bool release_latch> inline lsn_t log_t::write_buf() noexcept
{
- mysql_mutex_assert_owner(&log_sys.mutex);
- lsn_t write_lsn;
- if (log_sys.buf_free == log_sys.buf_next_to_write) {
- /* Nothing to write */
- mysql_mutex_unlock(&log_sys.mutex);
- return;
- }
-
- ut_ad(!recv_no_log_write);
-
- ulint start_offset;
- ulint end_offset;
- ulint area_start;
- ulint area_end;
- ulong write_ahead_size = srv_log_write_ahead_size;
- ulint pad_size;
-
- DBUG_PRINT("ib_log", ("write " LSN_PF " to " LSN_PF,
- log_sys.write_lsn,
- log_sys.get_lsn()));
-
-
- start_offset = log_sys.buf_next_to_write;
- end_offset = log_sys.buf_free;
-
- area_start = ut_2pow_round(start_offset,
- ulint(OS_FILE_LOG_BLOCK_SIZE));
- area_end = ut_calc_align(end_offset, ulint(OS_FILE_LOG_BLOCK_SIZE));
-
- ut_ad(area_end - area_start > 0);
-
- log_block_set_flush_bit(log_sys.buf + area_start, TRUE);
- log_block_set_checkpoint_no(
- log_sys.buf + area_end - OS_FILE_LOG_BLOCK_SIZE,
- log_sys.next_checkpoint_no);
-
- write_lsn = log_sys.get_lsn();
- byte *write_buf = log_sys.buf;
-
- log_buffer_switch();
-
- log_sys.log.set_fields(log_sys.write_lsn);
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(latch.is_write_locked());
+#endif
+ ut_ad(!srv_read_only_mode);
+ ut_ad(!is_pmem());
- mysql_mutex_unlock(&log_sys.mutex);
- /* Erase the end of the last log block. */
- memset(write_buf + end_offset, 0,
- ~end_offset & (OS_FILE_LOG_BLOCK_SIZE - 1));
+ const lsn_t lsn{get_lsn(std::memory_order_relaxed)};
- /* Calculate pad_size if needed. */
- pad_size = 0;
- if (write_ahead_size > OS_FILE_LOG_BLOCK_SIZE) {
- ulint end_offset_in_unit;
- lsn_t end_offset = log_sys.log.calc_lsn_offset(
- ut_uint64_align_up(write_lsn, OS_FILE_LOG_BLOCK_SIZE));
- end_offset_in_unit = (ulint) (end_offset % write_ahead_size);
+ if (write_lsn >= lsn)
+ {
+ if (release_latch)
+ latch.wr_unlock();
+ ut_ad(write_lsn == lsn);
+ }
+ else
+ {
+ ut_ad(!recv_no_log_write);
+ write_lock.set_pending(lsn);
+ ut_ad(write_lsn >= get_flushed_lsn());
+ const size_t block_size_1{get_block_size() - 1};
+ const lsn_t offset{calc_lsn_offset(write_lsn) & ~lsn_t{block_size_1}};
+
+ DBUG_PRINT("ib_log", ("write " LSN_PF " to " LSN_PF " at " LSN_PF,
+ write_lsn, lsn, offset));
+ const byte *write_buf{buf};
+ size_t length{buf_free};
+ ut_ad(length >= (calc_lsn_offset(write_lsn) & block_size_1));
+ const size_t new_buf_free{length & block_size_1};
+ buf_free= new_buf_free;
+ ut_ad(new_buf_free == ((lsn - first_lsn) & block_size_1));
+
+ if (new_buf_free)
+ {
+#if 0 /* TODO: Pad the last log block with dummy records. */
+ buf_free= log_pad(lsn, get_block_size() - new_buf_free,
+ buf + new_buf_free, flush_buf);
+ ... /* TODO: Update the LSN and adjust other code. */
+#else
+ /* The rest of the block will be written as garbage.
+ (We want to avoid memset() while holding mutex.)
+ This block will be overwritten later, once records beyond
+ the current LSN are generated. */
+ MEM_MAKE_DEFINED(buf + length, get_block_size() - new_buf_free);
+ buf[length]= 0; /* allow recovery to catch EOF faster */
+ length&= ~block_size_1;
+ memcpy_aligned<16>(flush_buf, buf + length, (new_buf_free + 15) & ~15);
+ length+= get_block_size();
+#endif
+ }
- if (end_offset_in_unit > 0
- && (area_end - area_start) > end_offset_in_unit) {
- /* The first block in the unit was initialized
- after the last writing.
- Needs to be written padded data once. */
- pad_size = std::min<ulint>(
- ulint(write_ahead_size) - end_offset_in_unit,
- srv_log_buffer_size - area_end);
- ::memset(write_buf + area_end, 0, pad_size);
- }
- }
+ std::swap(buf, flush_buf);
+ write_to_log++;
+ if (release_latch)
+ latch.wr_unlock();
- if (UNIV_UNLIKELY(srv_shutdown_state > SRV_SHUTDOWN_INITIATED)) {
- service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL,
- "InnoDB log write: "
- LSN_PF, log_sys.write_lsn);
- }
+ if (UNIV_UNLIKELY(srv_shutdown_state > SRV_SHUTDOWN_INITIATED))
+ {
+ service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL,
+ "InnoDB log write: " LSN_PF, write_lsn);
+ }
- if (log_sys.is_encrypted()) {
- log_crypt(write_buf + area_start, log_sys.write_lsn,
- area_end - area_start,
- rotate_key ? LOG_ENCRYPT_ROTATE_KEY : LOG_ENCRYPT);
- }
+ /* Do the write to the log file */
+ log_write_buf(write_buf, length, offset);
+ write_lsn= lsn;
+ }
- /* Do the write to the log file */
- log_write_buf(
- write_buf + area_start, area_end - area_start + pad_size,
-#ifdef UNIV_DEBUG
- pad_size,
-#endif /* UNIV_DEBUG */
- ut_uint64_align_down(log_sys.write_lsn,
- OS_FILE_LOG_BLOCK_SIZE),
- start_offset - area_start);
- srv_stats.log_padded.add(pad_size);
- log_sys.write_lsn = write_lsn;
- return;
+ return write_lock.release(lsn);
}
-static group_commit_lock write_lock;
-static group_commit_lock flush_lock;
+inline bool log_t::flush(lsn_t lsn) noexcept
+{
+ ut_ad(lsn >= get_flushed_lsn());
+ flush_lock.set_pending(lsn);
+ const bool success{srv_file_flush_method == SRV_O_DSYNC || log.flush()};
+ if (UNIV_LIKELY(success))
+ {
+ flushed_to_disk_lsn.store(lsn, std::memory_order_release);
+ log_flush_notify(lsn);
+ }
+ return success;
+}
-#ifdef UNIV_DEBUG
-bool log_write_lock_own()
+/** Ensure that previous log writes are durable.
+@param lsn previously written LSN
+@return new durable lsn target
+@retval 0 if there are no pending callbacks on flush_lock
+ or there is another group commit lead.
+*/
+static lsn_t log_flush(lsn_t lsn)
{
- return write_lock.is_owner();
+ ut_ad(!log_sys.is_pmem());
+ ut_a(log_sys.flush(lsn));
+ DBUG_EXECUTE_IF("crash_after_log_write_upto", DBUG_SUICIDE(););
+ return flush_lock.release(lsn);
}
-#endif
+static const completion_callback dummy_callback{[](void *) {},nullptr};
/** Ensure that the log has been written to the log file up to a given
log entry (such as that of a transaction commit). Start a new write, or
wait and check if an already running write is covering the request.
-@param[in] lsn log sequence number that should be
-included in the redo log file write
-@param[in] flush_to_disk whether the written log should also
-be flushed to the file system
-@param[in] rotate_key whether to rotate the encryption key */
-void log_write_up_to(lsn_t lsn, bool flush_to_disk, bool rotate_key,
+@param lsn log sequence number that should be included in the file write
+@param durable whether the write needs to be durable
+@param callback log write completion callback */
+void log_write_up_to(lsn_t lsn, bool durable,
const completion_callback *callback)
{
ut_ad(!srv_read_only_mode);
- ut_ad(!rotate_key || flush_to_disk);
ut_ad(lsn != LSN_MAX);
- if (recv_no_ibuf_operations)
+ if (UNIV_UNLIKELY(recv_no_ibuf_operations))
{
- /* Recovery is running and no operations on the log files are
- allowed yet (the variable name .._no_ibuf_.. is misleading) */
+ /* A non-final batch of recovery is active no writes to the log
+ are allowed yet. */
ut_a(!callback);
return;
}
-repeat:
- lsn_t ret_lsn1= 0, ret_lsn2= 0;
+ ut_ad(lsn <= log_sys.get_lsn());
+
+#ifdef HAVE_PMEM
+ if (log_sys.is_pmem())
+ {
+ ut_ad(!callback);
+ if (durable)
+ log_sys.persist(lsn);
+ return;
+ }
+#endif
- if (flush_to_disk)
+repeat:
+ if (durable)
{
if (flush_lock.acquire(lsn, callback) != group_commit_lock::ACQUIRED)
return;
flush_lock.set_pending(log_sys.get_lsn());
}
+
- if (write_lock.acquire(lsn, flush_to_disk ? nullptr : callback) ==
+ lsn_t pending_write_lsn= 0, pending_flush_lsn= 0;
+
+ if (write_lock.acquire(lsn, durable ? nullptr : callback) ==
group_commit_lock::ACQUIRED)
{
- mysql_mutex_lock(&log_sys.mutex);
- lsn_t write_lsn= log_sys.get_lsn();
- write_lock.set_pending(write_lsn);
- if (flush_to_disk)
- flush_lock.set_pending(write_lsn);
- log_write(rotate_key);
-
- ut_a(log_sys.write_lsn == write_lsn);
- ret_lsn1= write_lock.release(write_lsn);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
+ pending_write_lsn= log_sys.write_buf<true>();
}
- if (flush_to_disk)
+ if (durable)
{
- /* Flush the highest written lsn.*/
- auto flush_lsn = write_lock.value();
- flush_lock.set_pending(flush_lsn);
- log_write_flush_to_disk_low(flush_lsn);
- ret_lsn2= flush_lock.release(flush_lsn);
-
- log_flush_notify(flush_lsn);
- DBUG_EXECUTE_IF("crash_after_log_write_upto", DBUG_SUICIDE(););
+ pending_flush_lsn= log_flush(write_lock.value());
}
- if (ret_lsn1 || ret_lsn2)
+ if (pending_write_lsn || pending_flush_lsn)
{
- /*
- There is no new group commit lead, some async waiters could stall.
- Rerun log_write_up_to(), to prevent that.
- */
- lsn= std::max(ret_lsn1, ret_lsn2);
- static const completion_callback dummy{[](void *) {},nullptr};
- callback= &dummy;
+ /* There is no new group commit lead; some async waiters could stall. */
+ callback= &dummy_callback;
+ lsn= std::max(pending_write_lsn, pending_flush_lsn);
goto repeat;
}
}
/** Write to the log file up to the last log entry.
-@param sync whether to wait for a durable write to complete */
-void log_buffer_flush_to_disk(bool sync)
+@param durable whether to wait for a durable write to complete */
+void log_buffer_flush_to_disk(bool durable)
{
ut_ad(!srv_read_only_mode);
- log_write_up_to(log_sys.get_lsn(std::memory_order_acquire), sync);
+ log_write_up_to(log_sys.get_lsn(std::memory_order_acquire), durable);
}
-/** Prepare to invoke log_write_and_flush(), before acquiring log_sys.mutex. */
+/** Prepare to invoke log_write_and_flush(), before acquiring log_sys.latch. */
ATTRIBUTE_COLD void log_write_and_flush_prepare()
{
- mysql_mutex_assert_not_owner(&log_sys.mutex);
+ if (log_sys.is_pmem())
+ return;
while (flush_lock.acquire(log_sys.get_lsn() + 1, nullptr) !=
group_commit_lock::ACQUIRED);
@@ -890,20 +763,19 @@ ATTRIBUTE_COLD void log_write_and_flush_prepare()
group_commit_lock::ACQUIRED);
}
-/** Durably write the log and release log_sys.mutex */
+/** Durably write the log up to log_sys.get_lsn(). */
ATTRIBUTE_COLD void log_write_and_flush()
{
ut_ad(!srv_read_only_mode);
- auto lsn= log_sys.get_lsn();
- write_lock.set_pending(lsn);
- log_write(false);
- ut_a(log_sys.write_lsn == lsn);
- write_lock.release(lsn);
-
- lsn= write_lock.value();
- flush_lock.set_pending(lsn);
- log_write_flush_to_disk_low(lsn);
- flush_lock.release(lsn);
+ if (!log_sys.is_pmem())
+ {
+ log_sys.write_buf<false>();
+ log_flush(write_lock.value());
+ }
+#ifdef HAVE_PMEM
+ else
+ log_sys.persist(log_sys.get_lsn());
+#endif
}
/********************************************************************
@@ -912,99 +784,8 @@ Tries to establish a big enough margin of free space in the log buffer, such
that a new log entry can be catenated without an immediate need for a flush. */
ATTRIBUTE_COLD static void log_flush_margin()
{
- lsn_t lsn = 0;
-
- mysql_mutex_lock(&log_sys.mutex);
-
- if (log_sys.buf_free > log_sys.max_buf_free) {
- /* We can write during flush */
- lsn = log_sys.get_lsn();
- }
-
- mysql_mutex_unlock(&log_sys.mutex);
-
- if (lsn) {
- log_write_up_to(lsn, false);
- }
-}
-
-/** Write checkpoint info to the log header and release log_sys.mutex.
-@param[in] end_lsn start LSN of the FILE_CHECKPOINT mini-transaction */
-ATTRIBUTE_COLD void log_write_checkpoint_info(lsn_t end_lsn)
-{
- ut_ad(!srv_read_only_mode);
- ut_ad(end_lsn == 0 || end_lsn >= log_sys.next_checkpoint_lsn);
- ut_ad(end_lsn <= log_sys.get_lsn());
- ut_ad(end_lsn + SIZE_OF_FILE_CHECKPOINT <= log_sys.get_lsn()
- || srv_shutdown_state > SRV_SHUTDOWN_INITIATED);
-
- DBUG_PRINT("ib_log", ("checkpoint " UINT64PF " at " LSN_PF
- " written",
- log_sys.next_checkpoint_no,
- log_sys.next_checkpoint_lsn));
-
- byte* buf = log_sys.checkpoint_buf;
- memset_aligned<OS_FILE_LOG_BLOCK_SIZE>(buf, 0, OS_FILE_LOG_BLOCK_SIZE);
-
- mach_write_to_8(buf + LOG_CHECKPOINT_NO, log_sys.next_checkpoint_no);
- mach_write_to_8(buf + LOG_CHECKPOINT_LSN, log_sys.next_checkpoint_lsn);
-
- if (log_sys.is_encrypted()) {
- log_crypt_write_checkpoint_buf(buf);
- }
-
- lsn_t lsn_offset
- = log_sys.log.calc_lsn_offset(log_sys.next_checkpoint_lsn);
- mach_write_to_8(buf + LOG_CHECKPOINT_OFFSET, lsn_offset);
- mach_write_to_8(buf + LOG_CHECKPOINT_LOG_BUF_SIZE,
- srv_log_buffer_size);
- mach_write_to_8(buf + LOG_CHECKPOINT_END_LSN, end_lsn);
-
- log_block_store_checksum(buf);
-
- ut_ad(LOG_CHECKPOINT_1 < srv_page_size);
- ut_ad(LOG_CHECKPOINT_2 < srv_page_size);
-
- ut_ad(!log_sys.checkpoint_pending);
- log_sys.checkpoint_pending = true;
-
- mysql_mutex_unlock(&log_sys.mutex);
-
- /* Note: We alternate the physical place of the checkpoint info.
- See the (next_checkpoint_no & 1) below. */
-
- log_sys.log.write((log_sys.next_checkpoint_no & 1) ? LOG_CHECKPOINT_2
- : LOG_CHECKPOINT_1,
- {buf, OS_FILE_LOG_BLOCK_SIZE});
-
- log_sys.log.flush();
-
- mysql_mutex_lock(&log_sys.mutex);
-
- ut_ad(log_sys.checkpoint_pending);
- log_sys.checkpoint_pending = false;
-
- log_sys.next_checkpoint_no++;
-
- log_sys.last_checkpoint_lsn = log_sys.next_checkpoint_lsn;
-
- DBUG_PRINT("ib_log", ("checkpoint ended at " LSN_PF
- ", flushed to " LSN_PF,
- log_sys.next_checkpoint_lsn,
- log_sys.get_flushed_lsn()));
-
- MONITOR_INC(MONITOR_NUM_CHECKPOINT);
-
- if (log_sys.overwrite_warned) {
- sql_print_information("InnoDB: Crash recovery was broken "
- "between LSN=" LSN_PF
- " and checkpoint LSN=" LSN_PF ".",
- log_sys.overwrite_warned,
- log_sys.next_checkpoint_lsn);
- log_sys.overwrite_warned = 0;
- }
-
- mysql_mutex_unlock(&log_sys.mutex);
+ if (log_sys.buf_free > log_sys.max_buf_free)
+ log_buffer_flush_to_disk(false);
}
/****************************************************************//**
@@ -1016,19 +797,20 @@ ATTRIBUTE_COLD static void log_checkpoint_margin()
{
while (log_sys.check_flush_or_checkpoint())
{
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
ut_ad(!recv_no_log_write);
if (!log_sys.check_flush_or_checkpoint())
{
func_exit:
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.rd_unlock();
return;
}
const lsn_t lsn= log_sys.get_lsn();
const lsn_t checkpoint= log_sys.last_checkpoint_lsn;
const lsn_t sync_lsn= checkpoint + log_sys.max_checkpoint_age;
+
if (lsn <= sync_lsn)
{
#ifndef DBUG_OFF
@@ -1039,8 +821,7 @@ func_exit:
}
DBUG_EXECUTE_IF("ib_log_checkpoint_avoid_hard", goto skip_checkpoint;);
-
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.rd_unlock();
/* We must wait to prevent the tail of the log overwriting the head. */
buf_flush_wait_flushed(std::min(sync_lsn, checkpoint + (1U << 20)));
@@ -1177,24 +958,6 @@ wait_suspend_loop:
buf_flush_buffer_pool();
}
- if (log_sys.is_initialised()) {
- mysql_mutex_lock(&log_sys.mutex);
- const size_t n_write{log_sys.checkpoint_pending};
- const size_t n_flush{log_sys.get_pending_flushes()};
- mysql_mutex_unlock(&log_sys.mutex);
-
- if (n_write || n_flush) {
- if (srv_print_verbose_log && count > 600) {
- ib::info() << "Pending checkpoint_writes: "
- << n_write
- << ". Pending log flush writes: "
- << n_flush;
- count = 0;
- }
- goto loop;
- }
- }
-
if (srv_fast_shutdown == 2 || !srv_was_started) {
if (!srv_read_only_mode && srv_was_started) {
sql_print_information(
@@ -1220,24 +983,25 @@ wait_suspend_loop:
"ensuring dirty buffer pool are written to log");
log_make_checkpoint();
- mysql_mutex_lock(&log_sys.mutex);
+ const auto sizeof_cp = log_sys.is_encrypted()
+ ? SIZE_OF_FILE_CHECKPOINT + 8
+ : SIZE_OF_FILE_CHECKPOINT;
+
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
lsn = log_sys.get_lsn();
const bool lsn_changed = lsn != log_sys.last_checkpoint_lsn
- && lsn != log_sys.last_checkpoint_lsn
- + SIZE_OF_FILE_CHECKPOINT;
+ && lsn != log_sys.last_checkpoint_lsn + sizeof_cp;
ut_ad(lsn >= log_sys.last_checkpoint_lsn);
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.rd_unlock();
if (lsn_changed) {
goto loop;
}
-
- log_sys.log.flush();
} else {
- lsn = recv_sys.recovered_lsn;
+ lsn = recv_sys.lsn;
}
srv_shutdown_state = SRV_SHUTDOWN_LAST_PHASE;
@@ -1252,23 +1016,14 @@ wait_suspend_loop:
ut_a(lsn == log_sys.get_lsn()
|| srv_force_recovery == SRV_FORCE_NO_LOG_REDO);
- if (UNIV_UNLIKELY(lsn < recv_sys.recovered_lsn)) {
- ib::error() << "Shutdown LSN=" << lsn
- << " is less than start LSN="
- << recv_sys.recovered_lsn;
+ if (UNIV_UNLIKELY(lsn < recv_sys.lsn)) {
+ sql_print_error("InnoDB: Shutdown LSN=" LSN_PF
+ " is less than start LSN=" LSN_PF,
+ lsn, recv_sys.lsn);
}
srv_shutdown_lsn = lsn;
- if (!srv_read_only_mode) {
- dberr_t err = fil_write_flushed_lsn(lsn);
-
- if (err != DB_SUCCESS) {
- ib::error() << "Writing flushed lsn " << lsn
- << " failed; error=" << err;
- }
- }
-
/* Make some checks that the server really is quiet */
ut_ad(!srv_any_background_activity());
@@ -1283,10 +1038,7 @@ log_print(
/*======*/
FILE* file) /*!< in: file where to print */
{
- double time_elapsed;
- time_t current_time;
-
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
const lsn_t lsn= log_sys.get_lsn();
mysql_mutex_lock(&buf_pool.flush_list_mutex);
@@ -1303,40 +1055,7 @@ log_print(
pages_flushed,
lsn_t{log_sys.last_checkpoint_lsn});
- current_time = time(NULL);
-
- time_elapsed = difftime(current_time,
- log_sys.last_printout_time);
-
- if (time_elapsed <= 0) {
- time_elapsed = 1;
- }
-
- fprintf(file,
- ULINTPF " pending log flushes, "
- ULINTPF " pending chkp writes\n"
- ULINTPF " log i/o's done, %.2f log i/o's/second\n",
- log_sys.pending_flushes.load(),
- ulint{log_sys.checkpoint_pending},
- log_sys.n_log_ios,
- static_cast<double>(
- log_sys.n_log_ios - log_sys.n_log_ios_old)
- / time_elapsed);
-
- log_sys.n_log_ios_old = log_sys.n_log_ios;
- log_sys.last_printout_time = current_time;
-
- mysql_mutex_unlock(&log_sys.mutex);
-}
-
-/**********************************************************************//**
-Refreshes the statistics used to print per-second averages. */
-void
-log_refresh_stats(void)
-/*===================*/
-{
- log_sys.n_log_ios_old = log_sys.n_log_ios;
- log_sys.last_printout_time = time(NULL);
+ log_sys.latch.rd_unlock();
}
/** Shut down the redo log subsystem. */
@@ -1344,21 +1063,27 @@ void log_t::close()
{
ut_ad(this == &log_sys);
if (!is_initialised()) return;
- m_initialised= false;
- log.close();
+ close_file();
- ut_free_dodump(buf, srv_log_buffer_size);
+#ifndef HAVE_PMEM
+ ut_free_dodump(buf, buf_size);
buf= nullptr;
- ut_free_dodump(flush_buf, srv_log_buffer_size);
+ ut_free_dodump(flush_buf, buf_size);
flush_buf= nullptr;
+ aligned_free(checkpoint_buf);
+ checkpoint_buf= nullptr;
+#else
+ ut_ad(!checkpoint_buf);
+ ut_ad(!buf);
+ ut_ad(!flush_buf);
+#endif
- mysql_mutex_destroy(&mutex);
- mysql_mutex_destroy(&flush_order_mutex);
+ latch.destroy();
+ destroy_lsn_lock();
recv_sys.close();
- aligned_free(checkpoint_buf);
- checkpoint_buf= nullptr;
+ max_buf_free= 0;
}
std::string get_log_file_path(const char *filename)
@@ -1382,23 +1107,3 @@ std::string get_log_file_path(const char *filename)
return path;
}
-
-std::vector<std::string> get_existing_log_files_paths() {
- std::vector<std::string> result;
-
- for (int i= 0; i < 101; i++) {
- auto path= get_log_file_path(LOG_FILE_NAME_PREFIX)
- .append(std::to_string(i));
- os_file_stat_t stat;
- dberr_t err= os_file_get_status(path.c_str(), &stat, false, true);
- if (err)
- break;
-
- if (stat.type != OS_FILE_TYPE_FILE)
- break;
-
- result.push_back(std::move(path));
- }
-
- return result;
-}
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc
index d3d55a2138c..793f7b327c8 100644
--- a/storage/innobase/log/log0recv.cc
+++ b/storage/innobase/log/log0recv.cc
@@ -62,7 +62,7 @@ recv_sys_t recv_sys;
bool recv_needed_recovery;
#ifdef UNIV_DEBUG
/** TRUE if writing to the redo log (mtr_commit) is forbidden.
-Protected by log_sys.mutex. */
+Protected by log_sys.latch. */
bool recv_no_log_write = false;
#endif /* UNIV_DEBUG */
@@ -279,19 +279,19 @@ public:
memset_aligned<8>(FIL_PAGE_PREV + frame, 0xff, 8);
mach_write_to_4(frame + FIL_PAGE_SPACE_ID, block.page.id().space());
last_offset= FIL_PAGE_TYPE;
- next_after_applying:
+ next_after_applying:
if (applied == APPLIED_NO)
applied= APPLIED_YES;
}
else
{
- record_corrupted:
+ record_corrupted:
if (!srv_force_recovery)
{
recv_sys.set_corrupt_log();
return applied;
}
- next_not_same_page:
+ next_not_same_page:
last_offset= 1; /* the next record must not be same_page */
}
l+= rlen;
@@ -608,10 +608,10 @@ struct file_name_t {
/** Map of dirty tablespaces during recovery */
typedef std::map<
- ulint,
+ uint32_t,
file_name_t,
- std::less<ulint>,
- ut_allocator<std::pair<const ulint, file_name_t> > > recv_spaces_t;
+ std::less<uint32_t>,
+ ut_allocator<std::pair<const uint32_t, file_name_t> > > recv_spaces_t;
static recv_spaces_t recv_spaces;
@@ -651,22 +651,12 @@ static struct
{
/* Replace absolute DATA DIRECTORY file paths with
short names relative to the backup directory. */
- const char *name= strrchr(filename, '/');
-#ifdef _WIN32
- if (const char *last= strrchr(filename, '\\'))
- if (last > name)
- name= last;
-#endif
- if (name)
+ if (const char *name= strrchr(filename, '/'))
{
- while (--name > filename &&
-#ifdef _WIN32
- *name != '\\' &&
-#endif
- *name != '/');
+ while (--name > filename && *name != '/');
if (name > filename)
filename= name + 1;
- }
+ }
}
char *fil_path= fil_make_filepath(nullptr, {filename, strlen(filename)},
@@ -747,10 +737,10 @@ static struct
bool reinit_all()
{
retry:
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
bool fail= false;
buf_block_t *free_block= buf_LRU_get_free_block(false);
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
mysql_mutex_lock(&recv_sys.mutex);
for (auto d= defers.begin(); d != defers.end(); )
@@ -834,21 +824,9 @@ processed:
const char *filename= name.c_str();
if (srv_operation == SRV_OPERATION_RESTORE)
{
- const char* tbl_name = strrchr(filename, '/');
-#ifdef _WIN32
- if (const char *last = strrchr(filename, '\\'))
- {
- if (last > tbl_name)
- tbl_name = last;
- }
-#endif
- if (tbl_name)
+ if (const char *tbl_name= strrchr(filename, '/'))
{
- while (--tbl_name > filename &&
-#ifdef _WIN32
- *tbl_name != '\\' &&
-#endif
- *tbl_name != '/');
+ while (--tbl_name > filename && *tbl_name != '/');
if (tbl_name > filename)
filename= tbl_name + 1;
}
@@ -1035,13 +1013,13 @@ fail:
@param[in] len length of name, in bytes
@param[in] new_name new file name (NULL if not rename)
@param[in] new_len length of new_name, in bytes (0 if NULL) */
-void (*log_file_op)(ulint space_id, int type,
+void (*log_file_op)(uint32_t space_id, int type,
const byte* name, ulint len,
const byte* new_name, ulint new_len);
void (*undo_space_trunc)(uint32_t space_id);
-void (*first_page_init)(ulint space_id);
+void (*first_page_init)(uint32_t space_id);
/** Information about initializing page contents during redo log processing.
FIXME: Rely on recv_sys.pages! */
@@ -1198,31 +1176,17 @@ inline void recv_sys_t::trim(const page_id_t page_id, lsn_t lsn)
DBUG_VOID_RETURN;
}
-void recv_sys_t::open_log_files_if_needed()
+inline void recv_sys_t::read(os_offset_t total_offset, span<byte> buf)
{
- if (!recv_sys.files.empty())
- return;
-
- for (auto &&path : get_existing_log_files_paths())
- {
- recv_sys.files.emplace_back(std::move(path));
- ut_a(recv_sys.files.back().open(true) == DB_SUCCESS);
- }
-}
-
-void recv_sys_t::read(os_offset_t total_offset, span<byte> buf)
-{
- open_log_files_if_needed();
-
- size_t file_idx= static_cast<size_t>(total_offset / log_sys.log.file_size);
- os_offset_t offset= total_offset % log_sys.log.file_size;
+ size_t file_idx= static_cast<size_t>(total_offset / log_sys.file_size);
+ os_offset_t offset= total_offset % log_sys.file_size;
dberr_t err= recv_sys.files[file_idx].read(offset, buf);
ut_a(err == DB_SUCCESS);
}
inline size_t recv_sys_t::files_size()
{
- open_log_files_if_needed();
+ ut_ad(!files.empty());
return files.size();
}
@@ -1305,10 +1269,17 @@ same_space:
f.name = fname.name;
f.status = file_name_t::NORMAL;
} else {
- ib::error() << "Tablespace " << space_id
- << " has been found in two places: '"
- << f.name << "' and '" << name << "'."
- " You must delete one of them.";
+ sql_print_error("InnoDB: Tablespace " UINT32PF
+ " has been found"
+ " in two places:"
+ " '%.*s' and '%.*s'."
+ " You must delete"
+ " one of them.",
+ space_id,
+ int(f.name.size()),
+ f.name.data(),
+ int(fname.name.size()),
+ fname.name.data());
recv_sys.set_corrupt_fs();
}
break;
@@ -1331,15 +1302,18 @@ same_space:
Enable some more diagnostics when
forcing recovery. */
- ib::info()
- << "At LSN: " << recv_sys.recovered_lsn
- << ": unable to open file " << name
- << " for tablespace " << space_id;
+ sql_print_information(
+ "InnoDB: At LSN: " LSN_PF
+ ": unable to open file %.*s"
+ " for tablespace " UINT32PF,
+ recv_sys.lsn,
+ int(fname.name.size()),
+ fname.name.data(), space_id);
}
break;
case FIL_LOAD_DEFER:
- /* Skip the deferred spaces
+ /** Skip the deferred spaces
when lsn is already processed */
if (store != store_t::STORE_IF_EXISTS) {
deferred_spaces.add(
@@ -1382,12 +1356,6 @@ void recv_sys_t::close()
deferred_spaces.clear();
ut_d(mysql_mutex_unlock(&mutex));
- if (buf)
- {
- ut_free_dodump(buf, RECV_PARSING_BUF_SIZE);
- buf= nullptr;
- }
-
last_stored_lsn= 0;
mysql_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
@@ -1410,17 +1378,12 @@ void recv_sys_t::create()
apply_log_recs = false;
apply_batch_on = false;
- buf = static_cast<byte*>(ut_malloc_dontdump(RECV_PARSING_BUF_SIZE,
- PSI_INSTRUMENT_ME));
len = 0;
- parse_start_lsn = 0;
- scanned_lsn = 0;
- scanned_checkpoint_no = 0;
- recovered_offset = 0;
- recovered_lsn = 0;
+ offset = 0;
+ lsn = 0;
found_corrupt_log = false;
found_corrupt_fs = false;
- mlog_checkpoint_lsn = 0;
+ file_checkpoint = 0;
progress_time = time(NULL);
recv_max_page_lsn = 0;
@@ -1461,9 +1424,6 @@ void recv_sys_t::debug_free()
recovery_on= false;
pages.clear();
- ut_free_dodump(buf, RECV_PARSING_BUF_SIZE);
-
- buf= nullptr;
mysql_mutex_unlock(&mutex);
}
@@ -1547,175 +1507,11 @@ inline void recv_sys_t::free(const void *data)
}
-/** Read a log segment to log_sys.buf.
-@param[in,out] start_lsn in: read area start,
-out: the last read valid lsn
-@param[in] end_lsn read area end
-@return whether no invalid blocks (e.g checksum mismatch) were found */
-bool log_t::file::read_log_seg(lsn_t* start_lsn, lsn_t end_lsn)
-{
- ulint len;
- bool success = true;
- mysql_mutex_assert_owner(&log_sys.mutex);
- ut_ad(!(*start_lsn % OS_FILE_LOG_BLOCK_SIZE));
- ut_ad(!(end_lsn % OS_FILE_LOG_BLOCK_SIZE));
- byte* buf = log_sys.buf;
-loop:
- lsn_t source_offset = calc_lsn_offset_old(*start_lsn);
-
- ut_a(end_lsn - *start_lsn <= ULINT_MAX);
- len = (ulint) (end_lsn - *start_lsn);
-
- ut_ad(len != 0);
-
- const bool at_eof = (source_offset % file_size) + len > file_size;
- if (at_eof) {
- /* If the above condition is true then len (which is ulint)
- is > the expression below, so the typecast is ok */
- len = ulint(file_size - (source_offset % file_size));
- }
-
- log_sys.n_log_ios++;
-
- ut_a((source_offset >> srv_page_size_shift) <= ULINT_MAX);
-
- recv_sys.read(source_offset, {buf, len});
-
- for (ulint l = 0; l < len; l += OS_FILE_LOG_BLOCK_SIZE,
- buf += OS_FILE_LOG_BLOCK_SIZE,
- (*start_lsn) += OS_FILE_LOG_BLOCK_SIZE) {
- const ulint block_number = log_block_get_hdr_no(buf);
-
- if (block_number != log_block_convert_lsn_to_no(*start_lsn)) {
- /* Garbage or an incompletely written log block.
- We will not report any error, because this can
- happen when InnoDB was killed while it was
- writing redo log. We simply treat this as an
- abrupt end of the redo log. */
-fail:
- end_lsn = *start_lsn;
- success = false;
- break;
- }
-
- ulint crc = log_block_calc_checksum_crc32(buf);
- ulint cksum = log_block_get_checksum(buf);
-
- DBUG_EXECUTE_IF("log_intermittent_checksum_mismatch", {
- static int block_counter;
- if (block_counter++ == 0) {
- cksum = crc + 1;
- }
- });
-
- DBUG_EXECUTE_IF("log_checksum_mismatch", { cksum = crc + 1; });
-
- if (UNIV_UNLIKELY(crc != cksum)) {
- ib::error_or_warn(srv_operation!=SRV_OPERATION_BACKUP)
- << "Invalid log block checksum. block: "
- << block_number
- << " checkpoint no: "
- << log_block_get_checkpoint_no(buf)
- << " expected: " << crc
- << " found: " << cksum;
- goto fail;
- }
-
- if (is_encrypted()
- && !log_crypt(buf, *start_lsn,
- OS_FILE_LOG_BLOCK_SIZE,
- LOG_DECRYPT)) {
- goto fail;
- }
-
- ulint dl = log_block_get_data_len(buf);
- if (dl < LOG_BLOCK_HDR_SIZE
- || (dl != OS_FILE_LOG_BLOCK_SIZE
- && dl > log_sys.trailer_offset())) {
- recv_sys.set_corrupt_log();
- goto fail;
- }
- }
-
- if (recv_sys.report(time(NULL))) {
- ib::info() << "Read redo log up to LSN=" << *start_lsn;
- service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL,
- "Read redo log up to LSN=" LSN_PF,
- *start_lsn);
- }
-
- if (*start_lsn != end_lsn) {
- goto loop;
- }
-
- return(success);
-}
-
-
-
-/********************************************************//**
-Copies a log segment from the most up-to-date log group to the other log
-groups, so that they all contain the latest log data. Also writes the info
-about the latest checkpoint to the groups, and inits the fields in the group
-memory structs to up-to-date values. */
-static
-void
-recv_synchronize_groups()
+/** @return whether a log_t::FORMAT_10_5 log block checksum matches */
+static bool recv_check_log_block(const byte *buf)
{
- const lsn_t recovered_lsn = recv_sys.recovered_lsn;
-
- /* Read the last recovered log block to the recovery system buffer:
- the block is always incomplete */
-
- lsn_t start_lsn = ut_uint64_align_down(recovered_lsn,
- OS_FILE_LOG_BLOCK_SIZE);
- log_sys.log.read_log_seg(&start_lsn,
- start_lsn + OS_FILE_LOG_BLOCK_SIZE);
- log_sys.log.set_fields(recovered_lsn);
-
- /* Copy the checkpoint info to the log; remember that we have
- incremented checkpoint_no by one, and the info will not be written
- over the max checkpoint info, thus making the preservation of max
- checkpoint info on disk certain */
-
- if (!srv_read_only_mode) {
- log_write_checkpoint_info(0);
- mysql_mutex_lock(&log_sys.mutex);
- }
-}
-
-/** Check the consistency of a log header block.
-@param[in] log header block
-@return true if ok */
-static
-bool
-recv_check_log_header_checksum(
- const byte* buf)
-{
- return(log_block_get_checksum(buf)
- == log_block_calc_checksum_crc32(buf));
-}
-
-static bool redo_file_sizes_are_correct()
-{
- auto paths= get_existing_log_files_paths();
- auto get_size= [](const std::string &path) {
- return os_file_get_size(path.c_str()).m_total_size;
- };
- os_offset_t size= get_size(paths[0]);
-
- auto it=
- std::find_if(paths.begin(), paths.end(), [&](const std::string &path) {
- return get_size(path) != size;
- });
-
- if (it == paths.end())
- return true;
-
- ib::error() << "Log file " << *it << " is of different size "
- << get_size(*it) << " bytes than other log files " << size
- << " bytes!";
- return false;
+ return mach_read_from_4(my_assume_aligned<4>(508 + buf)) ==
+ my_crc32c(0, buf, 508);
}
/** Calculate the checksum for a log block using the pre-10.2.2 algorithm. */
@@ -1744,12 +1540,8 @@ inline uint32_t log_block_calc_checksum_format_0(const byte *b)
ATTRIBUTE_COLD static dberr_t recv_log_recover_pre_10_2()
{
uint64_t max_no= 0;
- byte *buf= log_sys.buf;
- ut_ad(log_sys.log.format == 0);
-
- if (!redo_file_sizes_are_correct())
- return DB_CORRUPTION;
+ ut_ad(log_sys.format == 0);
/** Offset of the first checkpoint checksum */
constexpr uint CHECKSUM_1= 288;
@@ -1762,22 +1554,21 @@ ATTRIBUTE_COLD static dberr_t recv_log_recover_pre_10_2()
/** Least significant bits of the checkpoint offset */
constexpr uint OFFS_LO= 16;
- lsn_t lsn= 0;
-
- for (ulint field= LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2;
- field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1)
+ lsn_t source_offset= 0;
+ const lsn_t log_size{(log_sys.file_size - 2048) * recv_sys.files_size()};
+ for (size_t field= 512; field < 2048; field+= 1024)
{
- log_sys.log.read(field, {buf, OS_FILE_LOG_BLOCK_SIZE});
+ const byte *buf= log_sys.buf + field;
if (static_cast<uint32_t>(ut_fold_binary(buf, CHECKSUM_1)) !=
mach_read_from_4(buf + CHECKSUM_1) ||
static_cast<uint32_t>(ut_fold_binary(buf + CHECKPOINT_LSN,
CHECKSUM_2 - CHECKPOINT_LSN)) !=
mach_read_from_4(buf + CHECKSUM_2))
- {
- DBUG_LOG("ib_log", "invalid pre-10.2.2 checkpoint " << field);
- continue;
- }
+ {
+ DBUG_PRINT("ib_log", ("invalid pre-10.2.2 checkpoint %zu", field));
+ continue;
+ }
if (!log_crypt_101_read_checkpoint(buf))
{
@@ -1791,294 +1582,361 @@ ATTRIBUTE_COLD static dberr_t recv_log_recover_pre_10_2()
checkpoint_no,
mach_read_from_8(buf + CHECKPOINT_LSN)));
- if (checkpoint_no >= max_no)
+ if (checkpoint_no < max_no)
+ continue;
+
+ const lsn_t o= lsn_t{mach_read_from_4(buf + OFFS_HI)} << 32 |
+ mach_read_from_4(buf + OFFS_LO);
+ if (o >= 0x80c && (o & ~511) + 512 < log_size)
{
max_no= checkpoint_no;
- lsn= mach_read_from_8(buf + CHECKPOINT_LSN);
- log_sys.log.set_lsn(lsn);
- log_sys.log.set_lsn_offset(lsn_t{mach_read_from_4(buf + OFFS_HI)} << 32 |
- mach_read_from_4(buf + OFFS_LO));
+ log_sys.next_checkpoint_lsn= mach_read_from_8(buf + CHECKPOINT_LSN);
+ source_offset= o;
}
}
- if (!lsn)
+ const char *uag= srv_operation == SRV_OPERATION_NORMAL
+ ? "InnoDB: Upgrade after a crash is not supported."
+ : "mariadb-backup --prepare is not possible.";
+
+ if (!log_sys.next_checkpoint_lsn)
{
- sql_print_error("InnoDB: Upgrade after a crash is not supported."
+ sql_print_error("%s"
" This redo log was created before MariaDB 10.2.2,"
" and we did not find a valid checkpoint."
" Please follow the instructions at"
- " https://mariadb.com/kb/en/library/upgrading/");
+ " https://mariadb.com/kb/en/library/upgrading/", uag);
return DB_ERROR;
}
- log_sys.set_lsn(lsn);
- log_sys.set_flushed_lsn(lsn);
- const lsn_t source_offset= log_sys.log.calc_lsn_offset_old(lsn);
-
- static constexpr char NO_UPGRADE_RECOVERY_MSG[]=
- "InnoDB: Upgrade after a crash is not supported."
+ static const char pre_10_2[]=
" This redo log was created before MariaDB 10.2.2";
- recv_sys.read(source_offset & ~511, {buf, 512});
+ byte *buf= const_cast<byte*>(field_ref_zero);
+
+ if (source_offset < (log_sys.is_pmem() ? log_sys.file_size : 4096))
+ memcpy_aligned<512>(buf, &log_sys.buf[source_offset & ~511], 512);
+ else
+ recv_sys.read(source_offset & ~511, {buf, 512});
- if (log_block_calc_checksum_format_0(buf) != log_block_get_checksum(buf) &&
- !log_crypt_101_read_block(buf, lsn))
+ if (log_block_calc_checksum_format_0(buf) !=
+ mach_read_from_4(my_assume_aligned<4>(buf + 508)) &&
+ !log_crypt_101_read_block(buf, log_sys.next_checkpoint_lsn))
{
- sql_print_error("%s, and it appears corrupted.", NO_UPGRADE_RECOVERY_MSG);
+ sql_print_error("%s%s, and it appears corrupted.", uag, pre_10_2);
return DB_CORRUPTION;
}
if (mach_read_from_2(buf + 4) == (source_offset & 511))
- {
- /* Mark the redo log for upgrading. */
- srv_log_file_size= 0;
- recv_sys.parse_start_lsn= recv_sys.recovered_lsn= recv_sys.scanned_lsn=
- recv_sys.mlog_checkpoint_lsn = lsn;
- log_sys.last_checkpoint_lsn= log_sys.next_checkpoint_lsn=
- log_sys.write_lsn= log_sys.current_flush_lsn= lsn;
- log_sys.next_checkpoint_no= 0;
return DB_SUCCESS;
- }
if (buf[20 + 32 * 9] == 2)
sql_print_error("InnoDB: Cannot decrypt log for upgrading."
" The encrypted log was created before MariaDB 10.2.2.");
else
- sql_print_error("%s. You must start up and shut down"
+ sql_print_error("%s%s. You must start up and shut down"
" MariaDB 10.1 or MySQL 5.6 or earlier"
" on the data directory.",
- NO_UPGRADE_RECOVERY_MSG);
+ uag, pre_10_2);
return DB_ERROR;
}
-/** Calculate the offset of a log sequence number
-in an old redo log file (during upgrade check).
-@param[in] lsn log sequence number
-@return byte offset within the log */
-inline lsn_t log_t::file::calc_lsn_offset_old(lsn_t lsn) const
-{
- const lsn_t size= capacity() * recv_sys.files_size();
- lsn_t l= lsn - this->lsn;
- if (longlong(l) < 0)
- {
- l= lsn_t(-longlong(l)) % size;
- l= size - l;
- }
-
- l+= lsn_offset - LOG_FILE_HDR_SIZE * (1 + lsn_offset / file_size);
- l%= size;
- return l + LOG_FILE_HDR_SIZE * (1 + l / (file_size - LOG_FILE_HDR_SIZE));
-}
-
-/** Determine if a redo log from MariaDB 10.2.2+, 10.3, or 10.4 is clean.
+/** Determine if a redo log from MariaDB 10.2.2, 10.3, 10.4, or 10.5 is clean.
+@param lsn_offset checkpoint LSN offset
@return error code
@retval DB_SUCCESS if the redo log is clean
@retval DB_CORRUPTION if the redo log is corrupted
@retval DB_ERROR if the redo log is not empty */
-static dberr_t recv_log_recover_10_4()
+static dberr_t recv_log_recover_10_5(lsn_t lsn_offset)
{
- const lsn_t lsn = log_sys.log.get_lsn();
- const lsn_t source_offset = log_sys.log.calc_lsn_offset_old(lsn);
- byte* buf = log_sys.buf;
+ byte *buf= const_cast<byte*>(field_ref_zero);
- if (!redo_file_sizes_are_correct()) {
- return DB_CORRUPTION;
- }
+ if (lsn_offset < (log_sys.is_pmem() ? log_sys.file_size : 4096))
+ memcpy_aligned<512>(buf, &log_sys.buf[lsn_offset & ~511], 512);
+ else
+ recv_sys.read(lsn_offset & ~lsn_t{511}, {buf, 512});
- recv_sys.read(source_offset & ~lsn_t(OS_FILE_LOG_BLOCK_SIZE - 1),
- {buf, OS_FILE_LOG_BLOCK_SIZE});
-
- ulint crc = log_block_calc_checksum_crc32(buf);
- ulint cksum = log_block_get_checksum(buf);
-
- if (UNIV_UNLIKELY(crc != cksum)) {
- ib::error() << "Invalid log block checksum."
- << " block: "
- << log_block_get_hdr_no(buf)
- << " checkpoint no: "
- << log_block_get_checkpoint_no(buf)
- << " expected: " << crc
- << " found: " << cksum;
- return DB_CORRUPTION;
- }
+ if (!recv_check_log_block(buf))
+ {
+ sql_print_error("InnoDB: Invalid log header checksum");
+ return DB_CORRUPTION;
+ }
- if (log_sys.log.is_encrypted()
- && !log_crypt(buf, lsn & ~511, 512, LOG_DECRYPT)) {
- return DB_ERROR;
- }
+ if (log_sys.is_encrypted() &&
+ !log_decrypt(buf, log_sys.next_checkpoint_lsn & ~511, 512))
+ return DB_ERROR;
- /* On a clean shutdown, the redo log will be logically empty
- after the checkpoint lsn. */
+ /* On a clean shutdown, the redo log will be logically empty
+ after the checkpoint lsn. */
- if (log_block_get_data_len(buf)
- != (source_offset & (OS_FILE_LOG_BLOCK_SIZE - 1))) {
- return DB_ERROR;
- }
+ if (mach_read_from_2(my_assume_aligned<2>(buf + 4)) != (lsn_offset & 511))
+ return DB_ERROR;
- /* Mark the redo log for upgrading. */
- srv_log_file_size = 0;
- recv_sys.parse_start_lsn = recv_sys.recovered_lsn
- = recv_sys.scanned_lsn
- = recv_sys.mlog_checkpoint_lsn = lsn;
- log_sys.set_lsn(lsn);
- log_sys.set_flushed_lsn(lsn);
- log_sys.last_checkpoint_lsn = log_sys.next_checkpoint_lsn
- = log_sys.write_lsn = log_sys.current_flush_lsn = lsn;
- log_sys.next_checkpoint_no = 0;
- return DB_SUCCESS;
+ return DB_SUCCESS;
}
-/** Find the latest checkpoint in the log header.
-@param[out] max_field LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2
-@return error code or DB_SUCCESS */
-dberr_t
-recv_find_max_checkpoint(ulint* max_field)
+dberr_t recv_sys_t::find_checkpoint()
{
- ib_uint64_t max_no;
- ib_uint64_t checkpoint_no;
- ulint field;
- byte* buf;
-
- max_no = 0;
- *max_field = 0;
-
- buf = log_sys.checkpoint_buf;
-
- log_sys.log.read(0, {buf, OS_FILE_LOG_BLOCK_SIZE});
- /* Check the header page checksum. There was no
- checksum in the first redo log format (version 0). */
- log_sys.log.format = mach_read_from_4(buf + LOG_HEADER_FORMAT);
- log_sys.log.subformat = log_sys.log.format != log_t::FORMAT_3_23
- ? mach_read_from_4(buf + LOG_HEADER_SUBFORMAT)
- : 0;
- if (log_sys.log.format != log_t::FORMAT_3_23
- && !recv_check_log_header_checksum(buf)) {
- sql_print_error("InnoDB: Invalid redo log header checksum.");
- return DB_CORRUPTION;
- }
+ bool wrong_size= false;
+ byte *buf;
- char creator[LOG_HEADER_CREATOR_END - LOG_HEADER_CREATOR + 1];
-
- memcpy(creator, buf + LOG_HEADER_CREATOR, sizeof creator);
- /* Ensure that the string is NUL-terminated. */
- creator[LOG_HEADER_CREATOR_END - LOG_HEADER_CREATOR] = 0;
-
- switch (log_sys.log.format) {
- case log_t::FORMAT_3_23:
- return recv_log_recover_pre_10_2();
- case log_t::FORMAT_10_2:
- case log_t::FORMAT_10_2 | log_t::FORMAT_ENCRYPTED:
- case log_t::FORMAT_10_3:
- case log_t::FORMAT_10_3 | log_t::FORMAT_ENCRYPTED:
- case log_t::FORMAT_10_4:
- case log_t::FORMAT_10_4 | log_t::FORMAT_ENCRYPTED:
- case log_t::FORMAT_10_5:
- case log_t::FORMAT_10_5 | log_t::FORMAT_ENCRYPTED:
- break;
- default:
- sql_print_error("InnoDB: Unsupported redo log format."
- " The redo log was created with %s.", creator);
- return DB_ERROR;
- }
+ if (files.empty())
+ {
+ file_checkpoint= 0;
+ std::string path{get_log_file_path()};
+ bool success;
+ os_file_t file{os_file_create_func(path.c_str(),
+ OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT,
+ OS_FILE_NORMAL, OS_LOG_FILE,
+ srv_read_only_mode, &success)};
+ if (file == OS_FILE_CLOSED)
+ return DB_ERROR;
+ const os_offset_t size{os_file_get_size(file)};
+ if (!size)
+ {
+ if (srv_operation != SRV_OPERATION_NORMAL)
+ goto too_small;
+ }
+ else if (size < log_t::START_OFFSET + SIZE_OF_FILE_CHECKPOINT)
+ {
+ too_small:
+ os_file_close(file);
+ sql_print_error("InnoDB: File %.*s is too small",
+ int(path.size()), path.data());
+ return DB_ERROR;
+ }
- for (field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2;
- field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1) {
- log_sys.log.read(field, {buf, OS_FILE_LOG_BLOCK_SIZE});
+ log_sys.attach(file, size);
+ recv_sys.files.emplace_back(file);
+ for (int i= 1; i < 101; i++)
+ {
+ path= get_log_file_path(LOG_FILE_NAME_PREFIX).append(std::to_string(i));
+ file= os_file_create_func(path.c_str(),
+ OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT |
+ OS_FILE_ON_ERROR_SILENT,
+ OS_FILE_NORMAL, OS_LOG_FILE, true, &success);
+ if (file == OS_FILE_CLOSED)
+ break;
+ const os_offset_t sz{os_file_get_size(file)};
+ if (size != sz)
+ {
+ sql_print_error("InnoDB: Log file %.*s is of different size " UINT64PF
+ " bytes than other log files " UINT64PF " bytes!",
+ int(path.size()), path.data(), sz, size);
+ wrong_size= true;
+ }
+ recv_sys.files.emplace_back(file);
+ }
- const ulint crc32 = log_block_calc_checksum_crc32(buf);
- const ulint cksum = log_block_get_checksum(buf);
+ if (!size)
+ {
+ if (wrong_size)
+ return DB_CORRUPTION;
+ if (log_sys.next_checkpoint_lsn < 8204)
+ {
+ /* Before MDEV-14425, InnoDB had a minimum LSN of 8192+12=8204.
+ Likewise, mariadb-backup --prepare would create an empty
+ ib_logfile0 after applying the log. We will allow an upgrade
+ from such an empty log.
+
+ If a user replaces the redo log with an empty file and the
+ FIL_PAGE_FILE_FLUSH_LSN field was zero in the system
+ tablespace (see SysTablespace::read_lsn_and_check_flags()) we
+ must refuse to start up. */
+ sql_print_error("InnoDB: ib_logfile0 is empty, and LSN is unknown.");
+ return DB_CORRUPTION;
+ }
+ lsn= log_sys.next_checkpoint_lsn;
+ log_sys.format= log_t::FORMAT_3_23;
+ goto upgrade;
+ }
+ }
+ else
+ ut_ad(srv_operation == SRV_OPERATION_BACKUP);
+ log_sys.next_checkpoint_lsn= 0;
+ lsn= 0;
+ buf= my_assume_aligned<4096>(log_sys.buf);
+ if (!log_sys.is_pmem())
+ if (dberr_t err= log_sys.log.read(0, {buf, 4096}))
+ return err;
+ /* Check the header page checksum. There was no
+ checksum in the first redo log format (version 0). */
+ log_sys.format= mach_read_from_4(buf + LOG_HEADER_FORMAT);
+ if (log_sys.format == log_t::FORMAT_3_23)
+ {
+ if (wrong_size)
+ return DB_CORRUPTION;
+ if (dberr_t err= recv_log_recover_pre_10_2())
+ return err;
+ upgrade:
+ memset_aligned<512>(const_cast<byte*>(field_ref_zero), 0, 512);
+ /* Mark the redo log for upgrading. */
+ log_sys.last_checkpoint_lsn= log_sys.next_checkpoint_lsn;
+ log_sys.set_recovered_lsn(log_sys.next_checkpoint_lsn);
+ lsn= file_checkpoint= log_sys.next_checkpoint_lsn;
+ log_sys.next_checkpoint_no= 0;
+ return DB_SUCCESS;
+ }
- if (crc32 != cksum) {
- DBUG_PRINT("ib_log",
- ("invalid checkpoint,"
- " at " ULINTPF
- ", checksum " ULINTPFx
- " expected " ULINTPFx,
- field, cksum, crc32));
- continue;
- }
+ if (!recv_check_log_block(buf))
+ {
+ sql_print_error("InnoDB: Invalid log header checksum");
+ return DB_CORRUPTION;
+ }
- if (log_sys.is_encrypted()
- && !log_crypt_read_checkpoint_buf(buf)) {
- sql_print_error("InnoDB: Reading checkpoint"
- " encryption info failed.");
- continue;
- }
+ const lsn_t first_lsn{mach_read_from_8(buf + LOG_HEADER_START_LSN)};
+ log_sys.set_first_lsn(first_lsn);
+ char creator[LOG_HEADER_CREATOR_END - LOG_HEADER_CREATOR + 1];
+ memcpy(creator, buf + LOG_HEADER_CREATOR, sizeof creator);
+ /* Ensure that the string is NUL-terminated. */
+ creator[LOG_HEADER_CREATOR_END - LOG_HEADER_CREATOR]= 0;
- checkpoint_no = mach_read_from_8(
- buf + LOG_CHECKPOINT_NO);
-
- DBUG_PRINT("ib_log",
- ("checkpoint " UINT64PF " at " LSN_PF " found",
- checkpoint_no, mach_read_from_8(
- buf + LOG_CHECKPOINT_LSN)));
-
- if (checkpoint_no >= max_no) {
- *max_field = field;
- max_no = checkpoint_no;
- log_sys.log.set_lsn(mach_read_from_8(
- buf + LOG_CHECKPOINT_LSN));
- log_sys.log.set_lsn_offset(mach_read_from_8(
- buf + LOG_CHECKPOINT_OFFSET));
- log_sys.next_checkpoint_no = checkpoint_no;
- }
- }
+ lsn_t lsn_offset= 0;
- if (*max_field == 0) {
- /* Before 10.2.2, we could get here during database
- initialization if we created an LOG_FILE_NAME file that
- was filled with zeroes, and were killed. After
- 10.2.2, we would reject such a file already earlier,
- when checking the file header. */
- sql_print_error("InnoDB: No valid checkpoint found"
- " (corrupted redo log)."
- " You can try --innodb-force-recovery=6"
- " as a last resort.");
- return DB_ERROR;
- }
+ switch (log_sys.format) {
+ default:
+ sql_print_error("InnoDB: Unsupported redo log format."
+ " The redo log was created with %s.", creator);
+ return DB_ERROR;
+ case log_t::FORMAT_10_8:
+ if (files.size() != 1)
+ {
+ sql_print_error("InnoDB: Expecting only ib_logfile0");
+ return DB_CORRUPTION;
+ }
- switch (log_sys.log.format) {
- case log_t::FORMAT_10_5:
- case log_t::FORMAT_10_5 | log_t::FORMAT_ENCRYPTED:
- break;
- default:
- if (dberr_t err = recv_log_recover_10_4()) {
- sql_print_error("InnoDB: Upgrade after a crash "
- "is not supported."
- " The redo log was created with %s%s.",
- creator,
- err == DB_ERROR
- ? ". You must start up and shut down"
- " MariaDB 10.4 or earlier"
- " on the data directory"
- : ", and it appears corrupted");
- return err;
- }
- }
+ if (*reinterpret_cast<const uint32_t*>(buf + LOG_HEADER_FORMAT + 4) ||
+ first_lsn < log_t::FIRST_LSN)
+ {
+ sql_print_error("InnoDB: Invalid ib_logfile0 header block;"
+ " the log was created with %s.", creator);
+ return DB_CORRUPTION;
+ }
- return(DB_SUCCESS);
-}
+ if (!mach_read_from_4(buf + LOG_HEADER_CREATOR_END));
+ else if (!log_crypt_read_header(buf + LOG_HEADER_CREATOR_END))
+ {
+ sql_print_error("InnoDB: Reading log encryption info failed;"
+ " the log was created with %s.", creator);
+ return DB_ERROR;
+ }
+ else
+ log_sys.format= log_t::FORMAT_ENC_10_8;
-/*******************************************************//**
-Calculates the new value for lsn when more data is added to the log. */
-static
-lsn_t
-recv_calc_lsn_on_data_add(
-/*======================*/
- lsn_t lsn, /*!< in: old lsn */
- ib_uint64_t len) /*!< in: this many bytes of data is
- added, log block headers not included */
-{
- unsigned frag_len = static_cast<unsigned>(lsn % OS_FILE_LOG_BLOCK_SIZE)
- - LOG_BLOCK_HDR_SIZE;
- unsigned payload_size = log_sys.payload_size();
- ut_ad(frag_len < payload_size);
- lsn_t lsn_len = len;
- lsn_len += (lsn_len + frag_len) / payload_size
- * (OS_FILE_LOG_BLOCK_SIZE - payload_size);
-
- return(lsn + lsn_len);
+ for (size_t field= log_t::CHECKPOINT_1; field <= log_t::CHECKPOINT_2;
+ field+= log_t::CHECKPOINT_2 - log_t::CHECKPOINT_1)
+ {
+ if (log_sys.is_pmem())
+ buf= log_sys.buf + field;
+ else
+ if (dberr_t err= log_sys.log.read(field,
+ {buf, log_sys.get_block_size()}))
+ return err;
+ const lsn_t checkpoint_lsn{mach_read_from_8(buf)};
+ const lsn_t end_lsn{mach_read_from_8(buf + 8)};
+ if (checkpoint_lsn < first_lsn || end_lsn < checkpoint_lsn ||
+ memcmp(buf + 16, field_ref_zero, 60 - 16) ||
+ my_crc32c(0, buf, 60) != mach_read_from_4(buf + 60))
+ {
+ DBUG_PRINT("ib_log", ("invalid checkpoint at %zu", field));
+ continue;
+ }
+
+ if (checkpoint_lsn >= log_sys.next_checkpoint_lsn)
+ {
+ log_sys.next_checkpoint_lsn= checkpoint_lsn;
+ log_sys.next_checkpoint_no= field == log_t::CHECKPOINT_1;
+ lsn= end_lsn;
+ }
+ }
+ if (!log_sys.next_checkpoint_lsn)
+ goto got_no_checkpoint;
+ if (!memcmp(creator, "Backup ", 7))
+ srv_start_after_restore= true;
+ return DB_SUCCESS;
+ case log_t::FORMAT_10_5:
+ case log_t::FORMAT_10_5 | log_t::FORMAT_ENCRYPTED:
+ if (files.size() != 1)
+ {
+ sql_print_error("InnoDB: Expecting only ib_logfile0");
+ return DB_CORRUPTION;
+ }
+ /* fall through */
+ case log_t::FORMAT_10_2:
+ case log_t::FORMAT_10_2 | log_t::FORMAT_ENCRYPTED:
+ case log_t::FORMAT_10_3:
+ case log_t::FORMAT_10_3 | log_t::FORMAT_ENCRYPTED:
+ case log_t::FORMAT_10_4:
+ case log_t::FORMAT_10_4 | log_t::FORMAT_ENCRYPTED:
+ uint64_t max_no= 0;
+ const lsn_t log_size{(log_sys.file_size - 2048) * files.size()};
+ for (size_t field= 512; field < 2048; field += 1024)
+ {
+ const byte *b = buf + field;
+
+ if (!recv_check_log_block(b))
+ {
+ DBUG_PRINT("ib_log", ("invalid checkpoint checksum at %zu", field));
+ continue;
+ }
+
+ if (log_sys.is_encrypted() && !log_crypt_read_checkpoint_buf(b))
+ {
+ sql_print_error("InnoDB: Reading checkpoint encryption info failed.");
+ continue;
+ }
+
+ const uint64_t checkpoint_no= mach_read_from_8(b);
+ const lsn_t checkpoint_lsn= mach_read_from_8(b + 8);
+ DBUG_PRINT("ib_log", ("checkpoint " UINT64PF " at " LSN_PF " found",
+ checkpoint_no, checkpoint_lsn));
+ const lsn_t o{mach_read_from_8(b + 16)};
+ if (checkpoint_no >= max_no && o >= 0x80c && (o & ~511) + 512 < log_size)
+ {
+ max_no= checkpoint_no;
+ log_sys.next_checkpoint_lsn= checkpoint_lsn;
+ log_sys.next_checkpoint_no= field == 512;
+ lsn_offset= mach_read_from_8(b + 16);
+ }
+ }
+ }
+
+ if (!log_sys.next_checkpoint_lsn)
+ {
+ got_no_checkpoint:
+ sql_print_error("InnoDB: No valid checkpoint was found;"
+ " the log was created with %s.", creator);
+ return DB_ERROR;
+ }
+
+ if (wrong_size)
+ return DB_CORRUPTION;
+
+ if (dberr_t err= recv_log_recover_10_5(lsn_offset))
+ {
+ const char *msg1, *msg2, *msg3;
+ msg1= srv_operation == SRV_OPERATION_NORMAL
+ ? "InnoDB: Upgrade after a crash is not supported."
+ : "mariadb-backup --prepare is not possible.";
+
+ if (err == DB_ERROR)
+ {
+ msg2= srv_operation == SRV_OPERATION_NORMAL
+ ? ". You must start up and shut down MariaDB "
+ : ". You must use mariadb-backup ";
+ msg3= (log_sys.format & ~log_t::FORMAT_ENCRYPTED) == log_t::FORMAT_10_5
+ ? "10.7 or earlier." : "10.4 or earlier.";
+ }
+ else
+ msg2= ", and it appears corrupted.", msg3= "";
+
+ sql_print_error("%s The redo log was created with %s%s%s",
+ msg1, creator, msg2, msg3);
+ return err;
+ }
+
+ goto upgrade;
}
/** Trim old log records for a page.
@@ -2125,7 +1983,7 @@ inline void page_recv_t::will_not_read()
@param it page iterator
@param start_lsn start LSN of the mini-transaction
@param lsn @see mtr_t::commit_lsn()
-@param recs redo log snippet @see log_t::FORMAT_10_5
+@param l redo log snippet
@param len length of l, in bytes */
inline void recv_sys_t::add(map::iterator it, lsn_t start_lsn, lsn_t lsn,
const byte *l, size_t len)
@@ -2174,7 +2032,7 @@ append:
goto append;
}
recs.log.append(new (alloc(log_phys_t::alloc_size(len)))
- log_phys_t(start_lsn, lsn, l, len));
+ log_phys_t{start_lsn, lsn, l, len});
}
/** Store/remove the freed pages in fil_name_t of recv_spaces.
@@ -2184,8 +2042,6 @@ static void store_freed_or_init_rec(page_id_t page_id, bool freed)
{
uint32_t space_id= page_id.space();
uint32_t page_no= page_id.page_no();
- if (!freed && page_no == 0 && first_page_init)
- first_page_init(space_id);
if (is_predefined_tablespace(space_id))
{
if (!srv_immediate_scrub_data_uncompressed)
@@ -2210,81 +2066,332 @@ static void store_freed_or_init_rec(page_id_t page_id, bool freed)
}
}
-/** Parse and register one mini-transaction in log_t::FORMAT_10_5.
-@param checkpoint_lsn the log sequence number of the latest checkpoint
-@param store whether to store the records
-@param apply whether to apply file-level log records
-@return whether FILE_CHECKPOINT record was seen the first time,
-or corruption was noticed */
-bool recv_sys_t::parse(lsn_t checkpoint_lsn, store_t *store, bool apply)
+/** Wrapper for log_sys.buf[] between recv_sys.offset and recv_sys.len */
+struct recv_buf
{
- mysql_mutex_assert_owner(&log_sys.mutex);
+ bool is_pmem() const noexcept { return log_sys.is_pmem(); }
+
+ const byte *ptr;
+
+ constexpr recv_buf(const byte *ptr) : ptr(ptr) {}
+ constexpr bool operator==(const recv_buf other) const
+ { return ptr == other.ptr; }
+
+ static const byte *end() { return &log_sys.buf[recv_sys.len]; }
+
+ const char *get_filename(byte*, size_t) const noexcept
+ { return reinterpret_cast<const char*>(ptr); }
+
+ bool is_eof(size_t len= 0) const noexcept { return ptr + len >= end(); }
+
+ byte operator*() const noexcept
+ {
+ ut_ad(ptr >= log_sys.buf);
+ ut_ad(ptr < end());
+ return *ptr;
+ }
+ byte operator[](size_t size) const noexcept { return *(*this + size); }
+ recv_buf operator+(size_t len) const noexcept
+ { recv_buf r{*this}; return r+= len; }
+ recv_buf &operator++() noexcept { return *this+= 1; }
+ recv_buf &operator+=(size_t len) noexcept { ptr+= len; return *this; }
+
+ size_t operator-(const recv_buf start) const noexcept
+ {
+ ut_ad(ptr >= start.ptr);
+ return size_t(ptr - start.ptr);
+ }
+
+ uint32_t crc32c(const recv_buf start) const noexcept
+ {
+ return my_crc32c(0, start.ptr, ptr - start.ptr);
+ }
+
+ void *memcpy(void *buf, size_t size) const noexcept
+ {
+ ut_ad(size);
+ ut_ad(!is_eof(size - 1));
+ return ::memcpy(buf, ptr, size);
+ }
+
+ bool is_zero(size_t size) const noexcept
+ {
+ ut_ad(!is_eof(size));
+ return !memcmp(ptr, field_ref_zero, size);
+ }
+
+ uint64_t read8() const noexcept
+ { ut_ad(!is_eof(7)); return mach_read_from_8(ptr); }
+ uint32_t read4() const noexcept
+ { ut_ad(!is_eof(3)); return mach_read_from_4(ptr); }
+
+ /** Update the pointer if the new pointer is within the buffer. */
+ bool set_if_contains(const byte *pos) noexcept
+ {
+ if (pos > end() || pos < ptr)
+ return false;
+ ptr= pos;
+ return true;
+ }
+
+ /** Get the contiguous, unencrypted buffer.
+ @param buf return value of copy_if_needed()
+ @param start start of the mini-transaction
+ @param decrypt_buf possibly, a copy of the mini-transaction
+ @return contiguous, non-encrypted buffer */
+ const byte *get_buf(const byte *buf, const recv_buf start,
+ const byte *decrypt_buf) const noexcept
+ { return ptr == buf ? start.ptr : decrypt_buf; }
+
+ /** Copy and decrypt a log record if needed.
+ @param iv initialization vector
+ @param tmp buffer for the decrypted log record
+ @param start un-encrypted start of the log record
+ @param len length of the possibly encrypted part, in bytes */
+ const byte *copy_if_needed(const byte *iv, byte *tmp, recv_buf start,
+ size_t len)
+ {
+ ut_ad(*this - start + len <= srv_page_size);
+ if (!len || !log_sys.is_encrypted())
+ return ptr;
+ const size_t s(*this - start);
+ start.memcpy(tmp, s);
+ return log_decrypt_buf(iv, tmp + s, ptr, static_cast<uint>(len));
+ }
+};
+
+#ifdef HAVE_PMEM
+/** Ring buffer wrapper for log_sys.buf[]; recv_sys.len == log_sys.file_size */
+struct recv_ring : public recv_buf
+{
+ static constexpr bool is_pmem() { return true; }
+
+ constexpr recv_ring(const byte *ptr) : recv_buf(ptr) {}
+
+ constexpr static bool is_eof() { return false; }
+ constexpr static bool is_eof(size_t) { return false; }
+
+ byte operator*() const noexcept
+ {
+ ut_ad(ptr >= &log_sys.buf[log_sys.START_OFFSET]);
+ ut_ad(ptr < end());
+ return *ptr;
+ }
+ byte operator[](size_t size) const noexcept { return *(*this + size); }
+ recv_ring operator+(size_t len) const noexcept
+ { recv_ring r{*this}; return r+= len; }
+ recv_ring &operator++() noexcept { return *this+= 1; }
+ recv_ring &operator+=(size_t len) noexcept
+ {
+ ut_ad(ptr < end());
+ ut_ad(ptr >= &log_sys.buf[log_sys.START_OFFSET]);
+ ut_ad(len < recv_sys.MTR_SIZE_MAX * 2);
+ ptr+= len;
+ if (ptr >= end())
+ {
+ ptr-= recv_sys.len - log_sys.START_OFFSET;
+ ut_ad(ptr >= &log_sys.buf[log_sys.START_OFFSET]);
+ ut_ad(ptr < end());
+ }
+ return *this;
+ }
+ size_t operator-(const recv_ring start) const noexcept
+ {
+ auto s= ptr - start.ptr;
+ return s >= 0
+ ? size_t(s)
+ : size_t(s + recv_sys.len - log_sys.START_OFFSET);
+ }
+
+ uint32_t crc32c(const recv_ring start) const noexcept
+ {
+ return ptr >= start.ptr
+ ? my_crc32c(0, start.ptr, ptr - start.ptr)
+ : my_crc32c(my_crc32c(0, start.ptr, end() - start.ptr),
+ &log_sys.buf[log_sys.START_OFFSET],
+ ptr - &log_sys.buf[log_sys.START_OFFSET]);
+ }
+
+ void *memcpy(void *buf, size_t size) const noexcept
+ {
+ ut_ad(size);
+ ut_ad(size < srv_page_size);
+
+ auto s= ptr + size - end();
+ if (s <= 0)
+ return ::memcpy(buf, ptr, size);
+ ::memcpy(buf, ptr, size - s);
+ ::memcpy(static_cast<byte*>(buf) + size - s,
+ &log_sys.buf[log_sys.START_OFFSET], s);
+ return buf;
+ }
+
+ bool is_zero(size_t size) const noexcept
+ {
+ auto s= ptr + size - end();
+ if (s <= 0)
+ return !memcmp(ptr, field_ref_zero, size);
+ return !memcmp(ptr, field_ref_zero, size - s) &&
+ !memcmp(&log_sys.buf[log_sys.START_OFFSET], field_ref_zero, s);
+ }
+
+ uint64_t read8() const noexcept
+ {
+ if (UNIV_LIKELY(ptr + 8 <= end()))
+ return mach_read_from_8(ptr);
+ byte b[8];
+ return mach_read_from_8(static_cast<const byte*>(memcpy(b, 8)));
+ }
+ uint32_t read4() const noexcept
+ {
+ if (UNIV_LIKELY(ptr + 4 <= end()))
+ return mach_read_from_4(ptr);
+ byte b[4];
+ return mach_read_from_4(static_cast<const byte*>(memcpy(b, 4)));
+ }
+
+ /** Get the contiguous, unencrypted buffer.
+ @param buf return value of copy_if_needed()
+ @param start start of the mini-transaction
+ @param decrypt_buf possibly, a copy of the mini-transaction
+ @return contiguous, non-encrypted buffer */
+ const byte *get_buf(const byte *buf, const recv_ring start,
+ const byte *decrypt_buf) const noexcept
+ { return ptr == buf && start.ptr < ptr ? start.ptr : decrypt_buf; }
+
+ const char *get_filename(byte* buf, size_t rlen) const noexcept
+ {
+ return UNIV_LIKELY(ptr + rlen <= end())
+ ? reinterpret_cast<const char*>(ptr)
+ : static_cast<const char*>(memcpy(buf, rlen));
+ }
+
+ /** Copy and decrypt a log record if needed.
+ @param iv initialization vector
+ @param tmp buffer for the decrypted log record
+ @param start un-encrypted start of the log record
+ @param len length of the possibly encrypted part, in bytes */
+ const byte *copy_if_needed(const byte *iv, byte *tmp, recv_ring start,
+ size_t len)
+ {
+ if (!len)
+ return ptr;
+ const size_t s(*this - start);
+ ut_ad(s + len <= srv_page_size);
+ if (!log_sys.is_encrypted())
+ {
+ if (start.ptr + s == ptr && ptr + len <= end())
+ return ptr;
+ start.memcpy(tmp, s + len);
+ return tmp + s;
+ }
+
+ start.memcpy(tmp, s);
+
+ const byte *b= ptr;
+ if (ptr + len > end())
+ b= static_cast<byte*>(memcpy(alloca(len), len));
+ return log_decrypt_buf(iv, tmp + s, b, static_cast<uint>(len));
+ }
+};
+#endif
+
+/** Parse and register one log_t::FORMAT_10_8 mini-transaction.
+@param store whether to store the records
+@param l log data source */
+template<typename source>
+inline recv_sys_t::parse_mtr_result recv_sys_t::parse(store_t store, source &l)
+ noexcept
+{
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked() ||
+ srv_operation == SRV_OPERATION_BACKUP ||
+ srv_operation == SRV_OPERATION_BACKUP_NO_DEFER);
+#endif
mysql_mutex_assert_owner(&mutex);
- ut_ad(parse_start_lsn);
- ut_ad(log_sys.is_physical());
+ ut_ad(log_sys.next_checkpoint_lsn);
+ ut_ad(log_sys.is_latest());
+
+ alignas(8) byte iv[MY_AES_BLOCK_SIZE];
+ byte *decrypt_buf= static_cast<byte*>(alloca(srv_page_size));
- bool last_phase= (*store == STORE_IF_EXISTS);
- const byte *const end= buf + len;
-loop:
- const byte *const log= buf + recovered_offset;
- const lsn_t start_lsn= recovered_lsn;
- map::iterator cached_pages_it = pages.end();
+ const lsn_t start_lsn{lsn};
+ map::iterator cached_pages_it{pages.end()};
/* Check that the entire mini-transaction is included within the buffer */
- const byte *l;
+ if (l.is_eof(0))
+ return PREMATURE_EOF;
+
+ if (*l <= 1)
+ return GOT_EOF; /* We should never write an empty mini-transaction. */
+
+ const source begin{l};
uint32_t rlen;
- for (l= log; l < end; l+= rlen)
+ for (uint32_t total_len= 0; !l.is_eof(); l+= rlen, total_len+= rlen)
{
- if (!*l)
+ if (total_len >= MTR_SIZE_MAX)
+ return GOT_EOF;
+ if (*l <= 1)
goto eom_found;
- if (UNIV_LIKELY((*l & 0x70) != RESERVED));
- else if (srv_force_recovery)
- ib::warn() << "Ignoring unknown log record at LSN " << recovered_lsn;
- else
- {
-malformed:
- ib::error() << "Malformed log record;"
- " set innodb_force_recovery=1 to ignore.";
-corrupted:
- const size_t trailing_bytes= std::min<size_t>(100, size_t(end - l));
- ib::info() << "Dump from the start of the mini-transaction (LSN="
- << start_lsn << ") to "
- << trailing_bytes << " bytes after the record:";
- ut_print_buf(stderr, log, l - log + trailing_bytes);
- putc('\n', stderr);
- found_corrupt_log= true;
- return true;
- }
- rlen= *l++ & 0xf;
- if (l + (rlen ? rlen : 16) >= end)
- break;
+ rlen= *l & 0xf;
+ ++l;
if (!rlen)
{
+ if (l.is_eof(0))
+ break;
rlen= mlog_decode_varint_length(*l);
- if (l + rlen >= end)
+ if (l.is_eof(rlen))
break;
const uint32_t addlen= mlog_decode_varint(l);
- if (UNIV_UNLIKELY(addlen == MLOG_DECODE_ERROR))
- {
- ib::error() << "Corrupted record length";
- goto corrupted;
- }
+ if (UNIV_UNLIKELY(addlen >= MTR_SIZE_MAX))
+ return GOT_EOF;
rlen= addlen + 15;
}
}
/* Not the entire mini-transaction was present. */
- return false;
+ return PREMATURE_EOF;
-eom_found:
- ut_ad(!*l);
- ut_d(const byte *const el= l + 1);
+ eom_found:
+ if (*l != log_sys.get_sequence_bit((l - begin) + lsn))
+ return GOT_EOF;
- const lsn_t end_lsn= recv_calc_lsn_on_data_add(start_lsn, l + 1 - log);
- if (UNIV_UNLIKELY(end_lsn > scanned_lsn))
- /* The log record filled a log block, and we require that also the
- next log block should have been scanned in */
- return false;
+ if (l.is_eof(4))
+ return PREMATURE_EOF;
+
+ uint32_t crc{l.crc32c(begin)};
+
+ if (log_sys.is_encrypted())
+ {
+ if (l.is_eof(8 + 4))
+ return PREMATURE_EOF;
+ (l + 1).memcpy(iv, 8);
+ l+= 8;
+ crc= my_crc32c(crc, iv, 8);
+ }
+
+ DBUG_EXECUTE_IF("log_intermittent_checksum_mismatch",
+ {
+ static int c;
+ if (!c++)
+ {
+ sql_print_information("Invalid log block checksum");
+ return GOT_EOF;
+ }
+ });
+
+ if (crc != (l + 1).read4())
+ return GOT_EOF;
+
+ l+= 5;
+ ut_d(const source el{l});
+ lsn+= l - begin;
+ offset= l.ptr - log_sys.buf;
+ if (!l.is_pmem());
+ else if (offset == log_sys.file_size)
+ offset= log_sys.START_OFFSET;
+ else
+ ut_ad(offset < log_sys.file_size);
ut_d(std::set<page_id_t> freed);
#if 0 && defined UNIV_DEBUG /* MDEV-21727 FIXME: enable this */
@@ -2299,56 +2406,83 @@ eom_found:
uint32_t space_id= 0, page_no= 0, last_offset= 0;
bool got_page_op= false;
- for (l= log; l < end; l+= rlen)
+
+ for (l= begin;; l+= rlen)
{
- const byte *const recs= l;
- const byte b= *l++;
+ const source recs{l};
+ ++l;
+ const byte b= *recs;
- if (!b)
+ if (b <= 1)
break;
- ut_ad(UNIV_LIKELY(b & 0x70) != RESERVED || srv_force_recovery);
+
+ if (UNIV_LIKELY((b & 0x70) != RESERVED));
+ else if (srv_force_recovery)
+ sql_print_warning("InnoDB: Ignoring unknown log record at LSN " LSN_PF,
+ lsn);
+ else
+ {
+ sql_print_error("InnoDB: Unknown log record at LSN " LSN_PF, lsn);
+ corrupted:
+ found_corrupt_log= true;
+ pthread_cond_broadcast(&cond);
+ return GOT_EOF;
+ }
+
rlen= b & 0xf;
- ut_ad(l + rlen < end);
- ut_ad(rlen || l + 16 < end);
if (!rlen)
{
const uint32_t lenlen= mlog_decode_varint_length(*l);
- ut_ad(l + lenlen < end);
const uint32_t addlen= mlog_decode_varint(l);
ut_ad(addlen != MLOG_DECODE_ERROR);
rlen= addlen + 15 - lenlen;
l+= lenlen;
}
- ut_ad(l + rlen < end);
+ ut_ad(!l.is_eof(rlen));
+
uint32_t idlen;
if ((b & 0x80) && got_page_op)
{
/* This record is for the same page as the previous one. */
if (UNIV_UNLIKELY((b & 0x70) <= INIT_PAGE))
{
-record_corrupted:
+ record_corrupted:
/* FREE_PAGE,INIT_PAGE cannot be with same_page flag */
if (!srv_force_recovery)
- goto malformed;
- ib::warn() << "Ignoring malformed log record at LSN " << recovered_lsn;
+ {
+ malformed:
+ sql_print_error("InnoDB: Malformed log record at LSN " LSN_PF
+ "; set innodb_force_recovery=1 to ignore.", lsn);
+ goto corrupted;
+ }
+ sql_print_warning("InnoDB: Ignoring malformed log record at LSN "
+ LSN_PF, lsn);
last_offset= 1; /* the next record must not be same_page */
continue;
}
+ if (srv_operation == SRV_OPERATION_BACKUP)
+ continue;
+ DBUG_PRINT("ib_log",
+ ("scan " LSN_PF ": rec %x len %zu page %u:%u",
+ lsn, b, l - recs + rlen, space_id, page_no));
goto same_page;
}
last_offset= 0;
idlen= mlog_decode_varint_length(*l);
if (UNIV_UNLIKELY(idlen > 5 || idlen >= rlen))
{
-page_id_corrupted:
+ if (!*l && b == FILE_CHECKPOINT + 1)
+ continue;
+ page_id_corrupted:
if (!srv_force_recovery)
{
- ib::error() << "Corrupted page identifier at " << recovered_lsn
- << "; set innodb_force_recovery=1 to ignore the record.";
+ sql_print_error("InnoDB: Corrupted page identifier at " LSN_PF
+ "; set innodb_force_recovery=1 to ignore the record.",
+ lsn);
goto corrupted;
}
- ib::warn() << "Ignoring corrupted page identifier at LSN "
- << recovered_lsn;
+ sql_print_warning("InnoDB: Ignoring corrupted page identifier at LSN "
+ LSN_PF, lsn);
continue;
}
space_id= mlog_decode_varint(l);
@@ -2364,12 +2498,21 @@ page_id_corrupted:
goto page_id_corrupted;
l+= idlen;
rlen-= idlen;
- got_page_op = !(b & 0x80);
- if (got_page_op && apply && !is_predefined_tablespace(space_id))
+ mach_write_to_4(iv + 8, space_id);
+ mach_write_to_4(iv + 12, page_no);
+ got_page_op= !(b & 0x80);
+ if (!got_page_op);
+ else if (srv_operation == SRV_OPERATION_BACKUP)
+ {
+ if (page_no == 0 && first_page_init && (b & 0x10))
+ first_page_init(space_id);
+ continue;
+ }
+ else if (file_checkpoint && !is_predefined_tablespace(space_id))
{
recv_spaces_t::iterator i= recv_spaces.lower_bound(space_id);
if (i != recv_spaces.end() && i->first == space_id);
- else if (recovered_lsn < mlog_checkpoint_lsn)
+ else if (lsn < file_checkpoint)
/* We have not seen all records between the checkpoint and
FILE_CHECKPOINT. There should be a FILE_DELETE for this
tablespace later. */
@@ -2380,23 +2523,25 @@ page_id_corrupted:
if (!srv_force_recovery)
{
ib::error() << "Missing FILE_DELETE or FILE_MODIFY for " << id
- << " at " << recovered_lsn
+ << " at " << lsn
<< "; set innodb_force_recovery=1 to ignore the record.";
goto corrupted;
}
- ib::warn() << "Ignoring record for " << id << " at " << recovered_lsn;
+ ib::warn() << "Ignoring record for " << id << " at " << lsn;
continue;
}
}
-same_page:
DBUG_PRINT("ib_log",
("scan " LSN_PF ": rec %x len %zu page %u:%u",
- recovered_lsn, b, static_cast<size_t>(l + rlen - recs),
- space_id, page_no));
-
+ lsn, b, l - recs + rlen, space_id, page_no));
if (got_page_op)
{
- const page_id_t id(space_id, page_no);
+ same_page:
+ const byte *cl= l.ptr;
+ if (!rlen);
+ else if (UNIV_UNLIKELY(l - recs + rlen > srv_page_size))
+ goto record_corrupted;
+ const page_id_t id{space_id, page_no};
ut_d(if ((b & 0x70) == INIT_PAGE || (b & 0x70) == OPTION)
freed.erase(id));
ut_ad(freed.find(id) == freed.end());
@@ -2415,7 +2560,8 @@ same_page:
case EXTENDED:
if (UNIV_UNLIKELY(!rlen))
goto record_corrupted;
- if (rlen == 1 && *l == TRIM_PAGES)
+ cl= l.copy_if_needed(iv, decrypt_buf, recs, rlen);
+ if (rlen == 1 && *cl == TRIM_PAGES)
{
#if 0 /* For now, we can only truncate an undo log tablespace */
if (UNIV_UNLIKELY(!space_id || !page_no))
@@ -2428,9 +2574,9 @@ same_page:
TRX_SYS_MAX_UNDO_SPACES, "compatibility");
/* The entire undo tablespace will be reinitialized by
innodb_undo_log_truncate=ON. Discard old log for all pages. */
- trim({space_id, 0}, recovered_lsn);
+ trim({space_id, 0}, lsn);
truncated_undo_spaces[space_id - srv_undo_space_id_start]=
- { recovered_lsn, page_no };
+ { lsn, page_no };
if (undo_space_trunc)
undo_space_trunc(space_id);
#endif
@@ -2441,7 +2587,10 @@ same_page:
break;
case OPTION:
if (rlen == 5 && *l == OPT_PAGE_CHECKSUM)
+ {
+ cl= l.copy_if_needed(iv, decrypt_buf, recs, rlen);
break;
+ }
/* fall through */
case RESERVED:
continue;
@@ -2450,10 +2599,12 @@ same_page:
case MEMSET:
if (UNIV_UNLIKELY(rlen == 0 || last_offset == 1))
goto record_corrupted;
- const uint32_t olen= mlog_decode_varint_length(*l);
+ ut_d(const source payload{l});
+ cl= l.copy_if_needed(iv, decrypt_buf, recs, rlen);
+ const uint32_t olen= mlog_decode_varint_length(*cl);
if (UNIV_UNLIKELY(olen >= rlen) || UNIV_UNLIKELY(olen > 3))
goto record_corrupted;
- const uint32_t offset= mlog_decode_varint(l);
+ const uint32_t offset= mlog_decode_varint(cl);
ut_ad(offset != MLOG_DECODE_ERROR);
static_assert(FIL_PAGE_OFFSET == 4, "compatibility");
if (UNIV_UNLIKELY(offset >= srv_page_size))
@@ -2461,13 +2612,13 @@ same_page:
last_offset+= offset;
if (UNIV_UNLIKELY(last_offset < 8 || last_offset >= srv_page_size))
goto record_corrupted;
- l+= olen;
+ cl+= olen;
rlen-= olen;
if ((b & 0x70) == WRITE)
{
if (UNIV_UNLIKELY(rlen + last_offset > srv_page_size))
goto record_corrupted;
- if (UNIV_UNLIKELY(!page_no) && apply)
+ if (UNIV_UNLIKELY(!page_no) && file_checkpoint)
{
const bool has_size= last_offset <= FSP_HEADER_OFFSET + FSP_SIZE &&
last_offset + rlen >= FSP_HEADER_OFFSET + FSP_SIZE + 4;
@@ -2478,15 +2629,15 @@ same_page:
{
recv_spaces_t::iterator it= recv_spaces.find(space_id);
const uint32_t size= has_size
- ? mach_read_from_4(FSP_HEADER_OFFSET + FSP_SIZE + l -
+ ? mach_read_from_4(FSP_HEADER_OFFSET + FSP_SIZE + cl -
last_offset)
: 0;
const uint32_t flags= has_flags
- ? mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + l -
+ ? mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + cl -
last_offset)
: file_name_t::initial_flags;
if (it == recv_spaces.end())
- ut_ad(!mlog_checkpoint_lsn || space_id == TRX_SYS_SPACE ||
+ ut_ad(!file_checkpoint || space_id == TRX_SYS_SPACE ||
srv_is_undo_tablespace(space_id));
else if (!it->second.space)
{
@@ -2498,30 +2649,33 @@ same_page:
fil_space_set_recv_size_and_flags(space_id, size, flags);
}
}
+ parsed_ok:
last_offset+= rlen;
+ ut_ad(l == payload);
+ if (!l.set_if_contains(cl))
+ (l= recs)+= cl - decrypt_buf;
break;
}
- uint32_t llen= mlog_decode_varint_length(*l);
+ uint32_t llen= mlog_decode_varint_length(*cl);
if (UNIV_UNLIKELY(llen > rlen || llen > 3))
goto record_corrupted;
- const uint32_t len= mlog_decode_varint(l);
+ const uint32_t len= mlog_decode_varint(cl);
ut_ad(len != MLOG_DECODE_ERROR);
if (UNIV_UNLIKELY(last_offset + len > srv_page_size))
goto record_corrupted;
- l+= llen;
+ cl+= llen;
rlen-= llen;
llen= len;
if ((b & 0x70) == MEMSET)
{
if (UNIV_UNLIKELY(rlen > llen))
goto record_corrupted;
- last_offset+= llen;
- break;
+ goto parsed_ok;
}
- const uint32_t slen= mlog_decode_varint_length(*l);
+ const uint32_t slen= mlog_decode_varint_length(*cl);
if (UNIV_UNLIKELY(slen != rlen || slen > 3))
goto record_corrupted;
- uint32_t s= mlog_decode_varint(l);
+ uint32_t s= mlog_decode_varint(cl);
ut_ad(slen != MLOG_DECODE_ERROR);
if (s & 1)
s= last_offset - (s >> 1) - 1;
@@ -2529,8 +2683,7 @@ same_page:
s= last_offset + (s >> 1) + 1;
if (UNIV_UNLIKELY(s < 8 || s + llen > srv_page_size))
goto record_corrupted;
- last_offset+= llen;
- break;
+ goto parsed_ok;
}
#if 0 && defined UNIV_DEBUG
switch (b & 0x70) {
@@ -2545,7 +2698,7 @@ same_page:
}
#endif
const bool is_init= (b & 0x70) <= INIT_PAGE;
- switch (*store) {
+ switch (store) {
case STORE_IF_EXISTS:
if (fil_space_t *space= fil_space_t::get(space_id))
{
@@ -2560,10 +2713,11 @@ same_page:
case STORE_YES:
if (!mlog_init.will_avoid_read(id, start_lsn))
{
- if (cached_pages_it == pages.end() || cached_pages_it->first != id)
- cached_pages_it= pages.emplace(id, page_recv_t()).first;
- add(cached_pages_it, start_lsn, end_lsn, recs,
- static_cast<size_t>(l + rlen - recs));
+ if (cached_pages_it == pages.end() ||
+ cached_pages_it->first != id)
+ cached_pages_it= pages.emplace(id, page_recv_t{}).first;
+ add(cached_pages_it, start_lsn, lsn,
+ l.get_buf(cl, recs, decrypt_buf), l - recs + rlen);
}
continue;
case STORE_NO:
@@ -2581,40 +2735,42 @@ same_page:
{
switch (b & 0xf0) {
case FILE_CHECKPOINT:
- if (space_id == 0 && page_no == 0 && rlen == 8)
+ if (space_id || page_no || l[rlen] > 1);
+ else if (rlen != 8)
+ {
+ if (rlen < UNIV_PAGE_SIZE_MAX && !l.is_zero(rlen))
+ continue;
+ }
+ else if (const lsn_t c= l.read8())
{
- const lsn_t lsn= mach_read_from_8(l);
-
if (UNIV_UNLIKELY(srv_print_verbose_log == 2))
fprintf(stderr, "FILE_CHECKPOINT(" LSN_PF ") %s at " LSN_PF "\n",
- lsn, lsn != checkpoint_lsn
- ? "ignored"
- : mlog_checkpoint_lsn ? "reread" : "read",
- recovered_lsn);
-
- DBUG_PRINT("ib_log", ("FILE_CHECKPOINT(" LSN_PF ") %s at " LSN_PF,
- lsn, lsn != checkpoint_lsn
- ? "ignored"
- : mlog_checkpoint_lsn ? "reread" : "read",
- recovered_lsn));
-
- if (lsn == checkpoint_lsn)
+ c, c != log_sys.next_checkpoint_lsn
+ ? "ignored" : file_checkpoint ? "reread" : "read", lsn);
+
+ DBUG_PRINT("ib_log",
+ ("FILE_CHECKPOINT(" LSN_PF ") %s at " LSN_PF,
+ c, c != log_sys.next_checkpoint_lsn
+ ? "ignored" : file_checkpoint ? "reread" : "read", lsn));
+
+ if (c == log_sys.next_checkpoint_lsn)
{
/* There can be multiple FILE_CHECKPOINT for the same LSN. */
- if (mlog_checkpoint_lsn)
+ if (file_checkpoint)
continue;
- mlog_checkpoint_lsn= recovered_lsn;
- l+= 8;
- recovered_offset= l - buf;
- return true;
+ file_checkpoint= lsn;
+ return GOT_EOF;
}
continue;
}
+ else
+ continue;
/* fall through */
default:
if (!srv_force_recovery)
goto malformed;
- ib::warn() << "Ignoring malformed log record at LSN " << recovered_lsn;
+ sql_print_warning("InnoDB: Ignoring malformed log record at LSN "
+ LSN_PF, lsn);
continue;
case FILE_DELETE:
case FILE_MODIFY:
@@ -2624,13 +2780,13 @@ same_page:
file_rec_error:
if (!srv_force_recovery)
{
- ib::error() << "Corrupted file-level record;"
- " set innodb_force_recovery=1 to ignore.";
+ sql_print_error("InnoDB: Corrupted file-level record;"
+ " set innodb_force_recovery=1 to ignore.");
goto corrupted;
}
- ib::warn() << "Ignoring corrupted file-level record at LSN "
- << recovered_lsn;
+ sql_print_warning("InnoDB: Ignoring corrupted file-level record"
+ " at LSN " LSN_PF, lsn);
continue;
}
/* fall through */
@@ -2639,7 +2795,8 @@ same_page:
goto file_rec_error;
/* There is no terminating NUL character. Names must end in .ibd.
For FILE_RENAME, there is a NUL between the two file names. */
- const char * const fn= reinterpret_cast<const char*>(l);
+
+ const char * const fn= l.get_filename(decrypt_buf, rlen);
const char *fn2= static_cast<const char*>(memchr(fn, 0, rlen));
if (UNIV_UNLIKELY((fn2 == nullptr) == ((b & 0xf0) == FILE_RENAME)))
@@ -2662,21 +2819,25 @@ same_page:
if (fnend - fn < 4 || memcmp(fnend - 4, DOT_IBD, 4))
goto file_rec_error;
+ if (UNIV_UNLIKELY(!recv_needed_recovery && srv_read_only_mode))
+ continue;
+
fil_name_process(fn, fnend - fn, space_id,
(b & 0xf0) == FILE_DELETE ? FILE_DELETE : FILE_MODIFY,
- start_lsn, *store);
+ start_lsn, store);
if ((b & 0xf0) < FILE_CHECKPOINT && log_file_op)
log_file_op(space_id, b & 0xf0,
- l, static_cast<ulint>(fnend - fn),
+ reinterpret_cast<const byte*>(fn),
+ static_cast<ulint>(fnend - fn),
reinterpret_cast<const byte*>(fn2),
fn2 ? static_cast<ulint>(fn2end - fn2) : 0);
if (fn2)
{
fil_name_process(fn2, fn2end - fn2, space_id,
- FILE_RENAME, start_lsn, *store);
- if (apply)
+ FILE_RENAME, start_lsn, store);
+ if (file_checkpoint)
{
const size_t len= fn2end - fn2;
auto r= renamed_spaces.emplace(space_id, std::string{fn2, len});
@@ -2686,21 +2847,43 @@ same_page:
}
if (is_corrupt_fs())
- return true;
+ return GOT_EOF;
}
}
+ else if (b == FILE_CHECKPOINT + 2 && !space_id && !page_no);
else
goto malformed;
}
+ l+= log_sys.is_encrypted() ? 4U + 8U : 4U;
ut_ad(l == el);
- recovered_offset= l - buf;
- recovered_lsn= end_lsn;
- if (is_memory_exhausted(store) && last_phase)
- return false;
- goto loop;
+ return OK;
}
+ATTRIBUTE_NOINLINE
+recv_sys_t::parse_mtr_result recv_sys_t::parse_mtr(store_t store) noexcept
+{
+ recv_buf s{&log_sys.buf[recv_sys.offset]};
+ return recv_sys.parse(store, s);
+}
+
+#ifdef HAVE_PMEM
+recv_sys_t::parse_mtr_result recv_sys_t::parse_pmem(store_t store) noexcept
+{
+ recv_sys_t::parse_mtr_result r{parse_mtr(store)};
+ if (r != PREMATURE_EOF || !log_sys.is_pmem())
+ return r;
+ ut_ad(recv_sys.len == log_sys.file_size);
+ ut_ad(recv_sys.offset >= log_sys.START_OFFSET);
+ ut_ad(recv_sys.offset <= recv_sys.len);
+ recv_ring s
+ {recv_sys.offset == recv_sys.len
+ ? &log_sys.buf[log_sys.START_OFFSET]
+ : &log_sys.buf[recv_sys.offset]};
+ return recv_sys.parse(store, s);
+}
+#endif
+
/** Apply the hashed log records to the page, if the page lsn is less than the
lsn of a log record.
@param[in,out] block buffer pool page
@@ -2723,7 +2906,7 @@ static buf_block_t *recv_recover_page(buf_block_t *block, mtr_t &mtr,
ut_ad(block->page.id() == p->first);
ut_ad(!p->second.is_being_processed());
ut_ad(!space || space->id == block->page.id().space());
- ut_ad(log_sys.is_physical());
+ ut_ad(log_sys.is_latest());
if (UNIV_UNLIKELY(srv_print_verbose_log == 2)) {
ib::info() << "Applying log to page " << block->page.id();
@@ -2754,7 +2937,7 @@ static buf_block_t *recv_recover_page(buf_block_t *block, mtr_t &mtr,
const log_phys_t* l = static_cast<const log_phys_t*>(recv);
ut_ad(l->lsn);
ut_ad(end_lsn <= l->lsn);
- ut_ad(l->lsn <= log_sys.log.scanned_lsn);
+ ut_ad(l->lsn <= recv_sys.lsn);
ut_ad(l->start_lsn);
ut_ad(recv_start_lsn <= l->start_lsn);
@@ -2787,12 +2970,13 @@ static buf_block_t *recv_recover_page(buf_block_t *block, mtr_t &mtr,
if (skipped_after_init) {
skipped_after_init = false;
ut_ad(end_lsn == page_lsn);
- if (end_lsn != page_lsn)
- ib::warn()
- << "The last skipped log record LSN "
- << end_lsn
- << " is not equal to page LSN "
- << page_lsn;
+ if (end_lsn != page_lsn) {
+ sql_print_warning(
+ "InnoDB: The last skipped log record"
+ " LSN " LSN_PF
+ " is not equal to page LSN " LSN_PF,
+ end_lsn, page_lsn);
+ }
}
end_lsn = l->lsn;
@@ -2897,19 +3081,23 @@ set_start_lsn:
if (start_lsn) {
ut_ad(end_lsn >= start_lsn);
+ ut_ad(!block->page.oldest_modification());
mach_write_to_8(FIL_PAGE_LSN + frame, end_lsn);
- if (UNIV_LIKELY(frame == block->page.frame)) {
+ if (UNIV_LIKELY(!block->page.zip.data)) {
mach_write_to_8(srv_page_size
- FIL_PAGE_END_LSN_OLD_CHKSUM
+ frame, end_lsn);
} else {
buf_zip_decompress(block, false);
}
-
- buf_block_modify_clock_inc(block);
- mysql_mutex_lock(&log_sys.flush_order_mutex);
- buf_flush_note_modification(block, start_lsn, end_lsn);
- mysql_mutex_unlock(&log_sys.flush_order_mutex);
+ /* The following is adapted from
+ buf_pool_t::insert_into_flush_list() */
+ mysql_mutex_lock(&buf_pool.flush_list_mutex);
+ buf_pool.flush_list_bytes+= block->physical_size();
+ block->page.set_oldest_modification(start_lsn);
+ UT_LIST_ADD_FIRST(buf_pool.flush_list, &block->page);
+ buf_pool.page_cleaner_wakeup();
+ mysql_mutex_unlock(&buf_pool.flush_list_mutex);
} else if (free_page && init) {
/* There have been no operations that modify the page.
Any buffered changes must not be merged. A subsequent
@@ -2939,10 +3127,12 @@ done:
ut_ad(!block || !recv_sys.pages.empty());
if (recv_sys.report(now)) {
- const ulint n = recv_sys.pages.size();
- ib::info() << "To recover: " << n << " pages from log";
- service_manager_extend_timeout(
- INNODB_EXTEND_TIMEOUT_INTERVAL, "To recover: " ULINTPF " pages from log", n);
+ const size_t n = recv_sys.pages.size();
+ sql_print_information("InnoDB: To recover: %zu pages from log",
+ n);
+ service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL,
+ "To recover: %zu pages"
+ " from log", n);
}
return block;
@@ -3070,7 +3260,7 @@ static void recv_read_in_area(page_id_t page_id, recv_sys_t::map::iterator i)
if (p != page_nos)
{
mysql_mutex_unlock(&recv_sys.mutex);
- buf_read_recv_pages(page_id.space(), page_nos, ulint(p - page_nos));
+ buf_read_recv_pages(page_id.space(), {page_nos, p});
mysql_mutex_lock(&recv_sys.mutex);
}
}
@@ -3093,7 +3283,7 @@ inline buf_block_t *recv_sys_t::recover_low(const page_id_t page_id,
ut_ad(recs.state == page_recv_t::RECV_WILL_NOT_READ);
buf_block_t* block= nullptr;
mlog_init_t::init &i= mlog_init.last(page_id);
- const lsn_t end_lsn = recs.log.last()->lsn;
+ const lsn_t end_lsn= recs.log.last()->lsn;
if (end_lsn < i.lsn)
DBUG_LOG("ib_log", "skip log for page " << page_id
<< " LSN " << end_lsn << " < " << i.lsn);
@@ -3227,30 +3417,26 @@ void recv_sys_t::apply(bool last_batch)
srv_operation == SRV_OPERATION_RESTORE ||
srv_operation == SRV_OPERATION_RESTORE_EXPORT);
-#ifdef SAFE_MUTEX
- DBUG_ASSERT(!last_batch == mysql_mutex_is_owner(&log_sys.mutex));
-#endif /* SAFE_MUTEX */
- mysql_mutex_lock(&mutex);
+ mysql_mutex_assert_owner(&mutex);
timespec abstime;
while (apply_batch_on)
{
if (is_corrupt_log())
- {
- mysql_mutex_unlock(&mutex);
return;
- }
if (last_batch)
- {
- mysql_mutex_assert_not_owner(&log_sys.mutex);
my_cond_wait(&cond, &mutex.m_mutex);
- }
else
{
- mysql_mutex_unlock(&mutex);
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
+ log_sys.latch.wr_unlock();
set_timespec_nsec(abstime, 500000000ULL); /* 0.5s */
- my_cond_timedwait(&cond, &log_sys.mutex.m_mutex, &abstime);
+ my_cond_timedwait(&cond, &mutex.m_mutex, &abstime);
+ mysql_mutex_unlock(&mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
mysql_mutex_lock(&mutex);
}
}
@@ -3264,11 +3450,11 @@ void recv_sys_t::apply(bool last_batch)
if (!pages.empty())
{
const char *msg= last_batch
- ? "Starting final batch to recover "
- : "Starting a batch to recover ";
- const ulint n= pages.size();
- ib::info() << msg << n << " pages from redo log.";
- sd_notifyf(0, "STATUS=%s" ULINTPF " pages from redo log", msg, n);
+ ? "Starting final batch to recover"
+ : "Starting a batch to recover";
+ const size_t n= pages.size();
+ sql_print_information("InnoDB: %s %zu pages from redo log.", msg, n);
+ sd_notifyf(0, "STATUS=%s %zu pages from redo log", msg, n);
apply_log_recs= true;
apply_batch_on= true;
@@ -3297,20 +3483,19 @@ void recv_sys_t::apply(bool last_batch)
fil_system.extend_to_recv_size();
- /* We must release log_sys.mutex and recv_sys.mutex before
+ /* We must release log_sys.latch and recv_sys.mutex before
invoking buf_LRU_get_free_block(). Allocating a block may initiate
- a redo log write and therefore acquire log_sys.mutex. To avoid
- deadlocks, log_sys.mutex must not be acquired while holding
+ a redo log write and therefore acquire log_sys.latch. To avoid
+ deadlocks, log_sys.latch must not be acquired while holding
recv_sys.mutex. */
mysql_mutex_unlock(&mutex);
if (!last_batch)
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
- mysql_mutex_assert_not_owner(&log_sys.mutex);
buf_block_t *free_block= buf_LRU_get_free_block(false);
if (!last_batch)
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
mysql_mutex_lock(&mutex);
for (map::iterator p= pages.begin(); p != pages.end(); )
@@ -3359,11 +3544,10 @@ erase_for_space:
next_free_block:
mysql_mutex_unlock(&mutex);
if (!last_batch)
- mysql_mutex_unlock(&log_sys.mutex);
- mysql_mutex_assert_not_owner(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
free_block= buf_LRU_get_free_block(false);
if (!last_batch)
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
mysql_mutex_lock(&mutex);
break;
}
@@ -3391,7 +3575,6 @@ next_free_block:
{
if (last_batch)
{
- mysql_mutex_assert_not_owner(&log_sys.mutex);
if (!empty)
my_cond_wait(&cond, &mutex.m_mutex);
else
@@ -3405,16 +3588,21 @@ next_free_block:
}
else
{
- mysql_mutex_unlock(&mutex);
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
+ log_sys.latch.wr_unlock();
set_timespec_nsec(abstime, 500000000ULL); /* 0.5s */
- my_cond_timedwait(&cond, &log_sys.mutex.m_mutex, &abstime);
+ my_cond_timedwait(&cond, &mutex.m_mutex, &abstime);
+ mysql_mutex_unlock(&mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
mysql_mutex_lock(&mutex);
}
continue;
}
if (is_corrupt_fs() && !srv_force_recovery)
- ib::info() << "Set innodb_force_recovery=1 to ignore corrupted pages.";
- mysql_mutex_unlock(&mutex);
+ sql_print_information("InnoDB: Set innodb_force_recovery=1"
+ " to ignore corrupted pages.");
return;
}
}
@@ -3425,399 +3613,236 @@ next_free_block:
else
{
mlog_init.reset();
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
}
- mysql_mutex_assert_not_owner(&log_sys.mutex);
mysql_mutex_unlock(&mutex);
if (last_batch && srv_operation != SRV_OPERATION_RESTORE &&
srv_operation != SRV_OPERATION_RESTORE_EXPORT)
+ /* Instead of flushing, last_batch sorts the buf_pool.flush_list
+ in ascending order of buf_page_t::oldest_modification. */
log_sort_flush_list();
else
- {
- /* Instead of flushing, last_batch could sort the buf_pool.flush_list
- in ascending order of buf_page_t::oldest_modification. */
- buf_flush_sync_batch(recovered_lsn);
- }
+ buf_flush_sync_batch(lsn);
if (!last_batch)
{
buf_pool_invalidate();
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
}
+#ifdef HAVE_PMEM
+ else if (log_sys.is_pmem())
+ mprotect(log_sys.buf, len, PROT_READ | PROT_WRITE);
+#endif
mysql_mutex_lock(&mutex);
ut_d(after_apply= true);
clear();
- mysql_mutex_unlock(&mutex);
}
/** Check whether the number of read redo log blocks exceeds the maximum.
-Store last_stored_lsn if the recovery is not in the last phase.
-@param[in,out] store whether to store page operations
@return whether the memory is exhausted */
-inline bool recv_sys_t::is_memory_exhausted(store_t *store)
+inline bool recv_sys_t::is_memory_exhausted()
{
- if (*store == STORE_NO ||
- UT_LIST_GET_LEN(blocks) * 3 < buf_pool.get_n_pages())
+ if (UT_LIST_GET_LEN(blocks) * 3 < buf_pool.get_n_pages())
return false;
- if (*store == STORE_YES)
- last_stored_lsn= recovered_lsn;
- *store= STORE_NO;
DBUG_PRINT("ib_log",("Ran out of memory and last stored lsn " LSN_PF
- " last stored offset " ULINTPF "\n",
- recovered_lsn, recovered_offset));
+ " last stored offset %zu\n", lsn, offset));
return true;
}
-/** Adds data from a new log block to the parsing buffer of recv_sys if
-recv_sys.parse_start_lsn is non-zero.
-@param[in] log_block log block to add
-@param[in] scanned_lsn lsn of how far we were able to find
- data in this log block
-@return true if more data added */
-bool recv_sys_add_to_parsing_buf(const byte* log_block, lsn_t scanned_lsn)
-{
- ulint more_len;
- ulint data_len;
- ulint start_offset;
- ulint end_offset;
-
- ut_ad(scanned_lsn >= recv_sys.scanned_lsn);
-
- if (!recv_sys.parse_start_lsn) {
- /* Cannot start parsing yet because no start point for
- it found */
- return(false);
- }
-
- data_len = log_block_get_data_len(log_block);
-
- if (recv_sys.parse_start_lsn >= scanned_lsn) {
-
- return(false);
-
- } else if (recv_sys.scanned_lsn >= scanned_lsn) {
-
- return(false);
-
- } else if (recv_sys.parse_start_lsn > recv_sys.scanned_lsn) {
- more_len = (ulint) (scanned_lsn - recv_sys.parse_start_lsn);
- } else {
- more_len = (ulint) (scanned_lsn - recv_sys.scanned_lsn);
- }
-
- if (more_len == 0) {
- return(false);
- }
-
- ut_ad(data_len >= more_len);
-
- start_offset = data_len - more_len;
-
- if (start_offset < LOG_BLOCK_HDR_SIZE) {
- start_offset = LOG_BLOCK_HDR_SIZE;
- }
-
- end_offset = std::min<ulint>(data_len, log_sys.trailer_offset());
-
- ut_ad(start_offset <= end_offset);
-
- if (start_offset < end_offset) {
- memcpy(recv_sys.buf + recv_sys.len,
- log_block + start_offset, end_offset - start_offset);
-
- recv_sys.len += end_offset - start_offset;
-
- ut_a(recv_sys.len <= RECV_PARSING_BUF_SIZE);
- }
-
- return(true);
-}
-
-/** Moves the parsing buffer data left to the buffer start. */
-void recv_sys_justify_left_parsing_buf()
-{
- memmove(recv_sys.buf, recv_sys.buf + recv_sys.recovered_offset,
- recv_sys.len - recv_sys.recovered_offset);
-
- recv_sys.len -= recv_sys.recovered_offset;
-
- recv_sys.recovered_offset = 0;
-}
-
-/** Scan redo log from a buffer and stores new log data to the parsing buffer.
-Parse and hash the log records if new data found.
-Apply log records automatically when the hash table becomes full.
-@param[in,out] store whether the records should be
- stored into recv_sys.pages; this is
- reset if just debug checking is
- needed, or when the num_max_blocks in
- recv_sys runs out
-@param[in] log_block log segment
-@param[in] checkpoint_lsn latest checkpoint LSN
-@param[in] start_lsn buffer start LSN
-@param[in] end_lsn buffer end LSN
-@param[in,out] contiguous_lsn it is known that all groups contain
- contiguous log data upto this lsn
-@param[out] group_scanned_lsn scanning succeeded upto this lsn
-@return true if not able to scan any more in this log group */
-static bool recv_scan_log_recs(
- store_t* store,
- const byte* log_block,
- lsn_t checkpoint_lsn,
- lsn_t start_lsn,
- lsn_t end_lsn,
- lsn_t* contiguous_lsn,
- lsn_t* group_scanned_lsn)
+/** Scan log_t::FORMAT_10_8 log store records to the parsing buffer.
+@param last_phase whether changes can be applied to the tablespaces
+@return whether rescan is needed (not everything was stored) */
+static bool recv_scan_log(bool last_phase)
{
- lsn_t scanned_lsn = start_lsn;
- bool finished = false;
- ulint data_len;
- bool more_data = false;
- bool apply = recv_sys.mlog_checkpoint_lsn != 0;
- ulint recv_parsing_buf_size = RECV_PARSING_BUF_SIZE;
- const bool last_phase = (*store == STORE_IF_EXISTS);
- ut_ad(start_lsn % OS_FILE_LOG_BLOCK_SIZE == 0);
- ut_ad(end_lsn % OS_FILE_LOG_BLOCK_SIZE == 0);
- ut_ad(end_lsn >= start_lsn + OS_FILE_LOG_BLOCK_SIZE);
- ut_ad(log_sys.is_physical());
-
- const byte* const log_end = log_block
- + ulint(end_lsn - start_lsn);
- constexpr ulint sizeof_checkpoint= SIZE_OF_FILE_CHECKPOINT;
-
- do {
- ut_ad(!finished);
-
- if (log_block_get_flush_bit(log_block)) {
- /* This block was a start of a log flush operation:
- we know that the previous flush operation must have
- been completed for all log groups before this block
- can have been flushed to any of the groups. Therefore,
- we know that log data is contiguous up to scanned_lsn
- in all non-corrupt log groups. */
-
- if (scanned_lsn > *contiguous_lsn) {
- *contiguous_lsn = scanned_lsn;
- }
- }
-
- data_len = log_block_get_data_len(log_block);
-
- if (scanned_lsn + data_len > recv_sys.scanned_lsn
- && log_block_get_checkpoint_no(log_block)
- < recv_sys.scanned_checkpoint_no
- && (recv_sys.scanned_checkpoint_no
- - log_block_get_checkpoint_no(log_block)
- > 0x80000000UL)) {
-
- /* Garbage from a log buffer flush which was made
- before the most recent database recovery */
- finished = true;
- break;
- }
-
- if (!recv_sys.parse_start_lsn
- && (log_block_get_first_rec_group(log_block) > 0)) {
-
- /* We found a point from which to start the parsing
- of log records */
-
- recv_sys.parse_start_lsn = scanned_lsn
- + log_block_get_first_rec_group(log_block);
- recv_sys.scanned_lsn = recv_sys.parse_start_lsn;
- recv_sys.recovered_lsn = recv_sys.parse_start_lsn;
- }
-
- scanned_lsn += data_len;
-
- if (data_len == LOG_BLOCK_HDR_SIZE + sizeof_checkpoint
- && scanned_lsn == checkpoint_lsn + sizeof_checkpoint
- && log_block[LOG_BLOCK_HDR_SIZE]
- == (FILE_CHECKPOINT | (SIZE_OF_FILE_CHECKPOINT - 2))
- && checkpoint_lsn == mach_read_from_8(
- (LOG_BLOCK_HDR_SIZE + 1 + 2)
- + log_block)) {
- /* The redo log is logically empty. */
- ut_ad(recv_sys.mlog_checkpoint_lsn == 0
- || recv_sys.mlog_checkpoint_lsn
- == checkpoint_lsn);
- recv_sys.mlog_checkpoint_lsn = checkpoint_lsn;
- DBUG_PRINT("ib_log", ("found empty log; LSN=" LSN_PF,
- scanned_lsn));
- finished = true;
- break;
- }
-
- if (scanned_lsn > recv_sys.scanned_lsn) {
- ut_ad(!srv_log_file_created);
- if (!recv_needed_recovery) {
- recv_needed_recovery = true;
-
- if (srv_read_only_mode) {
- ib::warn() << "innodb_read_only"
- " prevents crash recovery";
- return(true);
- }
-
- ib::info() << "Starting crash recovery from"
- " checkpoint LSN=" << checkpoint_lsn
- << "," << recv_sys.scanned_lsn;
- }
-
- /* We were able to find more log data: add it to the
- parsing buffer if parse_start_lsn is already
- non-zero */
-
- DBUG_EXECUTE_IF(
- "reduce_recv_parsing_buf",
- recv_parsing_buf_size = RECV_SCAN_SIZE * 2;
- );
+ DBUG_ENTER("recv_scan_log");
+ DBUG_ASSERT(!last_phase || recv_sys.file_checkpoint);
+
+ ut_ad(log_sys.is_latest());
+ const size_t block_size_1{log_sys.get_block_size() - 1};
+
+ mysql_mutex_lock(&recv_sys.mutex);
+ recv_sys.clear();
+ ut_d(recv_sys.after_apply= last_phase);
+ ut_ad(!last_phase || recv_sys.file_checkpoint);
+
+ store_t store= last_phase
+ ? STORE_IF_EXISTS : recv_sys.file_checkpoint ? STORE_YES : STORE_NO;
+ size_t buf_size= log_sys.buf_size;
+#ifdef HAVE_PMEM
+ if (log_sys.is_pmem())
+ {
+ recv_sys.offset= size_t(log_sys.calc_lsn_offset(recv_sys.lsn));
+ buf_size= size_t(log_sys.file_size);
+ recv_sys.len= size_t(log_sys.file_size);
+ }
+ else
+#endif
+ {
+ recv_sys.offset= size_t(recv_sys.lsn - log_sys.get_first_lsn()) &
+ block_size_1;
+ recv_sys.len= 0;
+ }
- if (recv_sys.len + 4 * OS_FILE_LOG_BLOCK_SIZE
- >= recv_parsing_buf_size) {
- ib::error() << "Log parsing buffer overflow."
- " Recovery may have failed!";
+ for (ut_d(lsn_t source_offset= 0);;)
+ {
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
+#ifdef UNIV_DEBUG
+ const bool wrap{source_offset + recv_sys.len == log_sys.file_size};
+#endif
+ if (size_t size= buf_size - recv_sys.len)
+ {
+#ifndef UNIV_DEBUG
+ lsn_t
+#endif
+ source_offset=
+ log_sys.calc_lsn_offset(recv_sys.lsn + recv_sys.len - recv_sys.offset);
+ ut_ad(!wrap || source_offset == log_t::START_OFFSET);
+ source_offset&= ~block_size_1;
- recv_sys.set_corrupt_log();
+ if (source_offset + size > log_sys.file_size)
+ size= static_cast<size_t>(log_sys.file_size - source_offset);
- if (!srv_force_recovery) {
- ib::error()
- << "Set innodb_force_recovery"
- " to ignore this error.";
- return(true);
- }
- } else if (!recv_sys.is_corrupt_log()) {
- more_data = recv_sys_add_to_parsing_buf(
- log_block, scanned_lsn);
- }
+ if (dberr_t err= log_sys.log.read(source_offset,
+ {log_sys.buf + recv_sys.len, size}))
+ {
+ mysql_mutex_unlock(&recv_sys.mutex);
+ ib::error() << "Failed to read log at " << source_offset
+ << ": " << err;
+ recv_sys.set_corrupt_log();
+ mysql_mutex_lock(&recv_sys.mutex);
+ }
+ else
+ recv_sys.len+= size;
+ }
- recv_sys.scanned_lsn = scanned_lsn;
- recv_sys.scanned_checkpoint_no
- = log_block_get_checkpoint_no(log_block);
- }
+ if (recv_sys.report(time(nullptr)))
+ {
+ sql_print_information("InnoDB: Read redo log up to LSN=" LSN_PF,
+ recv_sys.lsn);
+ service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL,
+ "Read redo log up to LSN=" LSN_PF,
+ recv_sys.lsn);
+ }
- /* During last phase of scanning, there can be redo logs
- left in recv_sys.buf to parse & store it in recv_sys.heap */
- if (last_phase
- && recv_sys.recovered_lsn < recv_sys.scanned_lsn) {
- more_data = true;
- }
+ recv_sys_t::parse_mtr_result r;
- if (data_len < OS_FILE_LOG_BLOCK_SIZE) {
- /* Log data for this group ends here */
- finished = true;
- break;
- } else {
- log_block += OS_FILE_LOG_BLOCK_SIZE;
- }
- } while (log_block < log_end);
+ if (UNIV_UNLIKELY(!recv_needed_recovery))
+ {
+ ut_ad(store == (recv_sys.file_checkpoint ? STORE_YES : STORE_NO));
+ ut_ad(recv_sys.lsn >= log_sys.next_checkpoint_lsn);
- *group_scanned_lsn = scanned_lsn;
+ for (;;)
+ {
+ const byte& b{log_sys.buf[recv_sys.offset]};
+ r= recv_sys.parse_pmem(store);
+ if (r == recv_sys_t::OK)
+ {
+ if (store == STORE_NO &&
+ (b == FILE_CHECKPOINT + 2 + 8 || (b & 0xf0) == FILE_MODIFY))
+ continue;
+ }
+ else if (r == recv_sys_t::PREMATURE_EOF)
+ goto read_more;
+ else if (store != STORE_NO)
+ break;
- mysql_mutex_lock(&recv_sys.mutex);
+ if (store == STORE_NO)
+ {
+ const lsn_t end{recv_sys.file_checkpoint};
+ mysql_mutex_unlock(&recv_sys.mutex);
- if (more_data && !recv_sys.is_corrupt_log()) {
- /* Try to parse more log records */
- if (recv_sys.parse(checkpoint_lsn, store, apply)) {
- ut_ad(recv_sys.is_corrupt_log()
- || recv_sys.is_corrupt_fs()
- || recv_sys.mlog_checkpoint_lsn
- == recv_sys.recovered_lsn);
- finished = true;
- goto func_exit;
- }
+ if (!end)
+ {
+ recv_sys.set_corrupt_log();
+ sql_print_error("InnoDB: Missing FILE_CHECKPOINT(" LSN_PF
+ ") at " LSN_PF, log_sys.next_checkpoint_lsn,
+ recv_sys.lsn);
+ }
+ else
+ ut_ad(end == recv_sys.lsn);
+ DBUG_RETURN(true);
+ }
- recv_sys.is_memory_exhausted(store);
+ recv_needed_recovery= true;
+ if (srv_read_only_mode)
+ {
+ mysql_mutex_unlock(&recv_sys.mutex);
+ DBUG_RETURN(false);
+ }
+ sql_print_information("InnoDB: Starting crash recovery from"
+ " checkpoint LSN=" LSN_PF,
+ log_sys.next_checkpoint_lsn);
+ break;
+ }
+ }
- if (recv_sys.recovered_offset > recv_parsing_buf_size / 4
- || (recv_sys.recovered_offset
- && recv_sys.len
- >= recv_parsing_buf_size - RECV_SCAN_SIZE)) {
- /* Move parsing buffer data to the buffer start */
- recv_sys_justify_left_parsing_buf();
- }
+ while ((r= recv_sys.parse_pmem(store)) == recv_sys_t::OK)
+ {
+ if (store != STORE_NO && recv_sys.is_memory_exhausted())
+ {
+ ut_ad(last_phase == (store == STORE_IF_EXISTS));
+ if (store == STORE_YES)
+ {
+ store= STORE_NO;
+ recv_sys.last_stored_lsn= recv_sys.lsn;
+ }
+ else
+ {
+ ut_ad(store == STORE_IF_EXISTS);
+ recv_sys.apply(false);
+ }
+ }
+ }
- /* Need to re-parse the redo log which're stored
- in recv_sys.buf */
- if (last_phase && *store == STORE_NO) {
- finished = false;
- }
- }
+ if (r != recv_sys_t::PREMATURE_EOF)
+ {
+ ut_ad(r == recv_sys_t::GOT_EOF);
+ break;
+ }
-func_exit:
- recv_sys.maybe_finish_batch();
- mysql_mutex_unlock(&recv_sys.mutex);
- return(finished);
-}
+ read_more:
+#ifdef HAVE_PMEM
+ if (log_sys.is_pmem())
+ break;
+#endif
+ if (recv_sys.is_corrupt_log())
+ break;
-/** Scans log from a buffer and stores new log data to the parsing buffer.
-Parses and hashes the log records if new data found.
-@param[in] checkpoint_lsn latest checkpoint log sequence number
-@param[in,out] contiguous_lsn log sequence number
-until which all redo log has been scanned
-@param[in] last_phase whether changes
-can be applied to the tablespaces
-@return whether rescan is needed (not everything was stored) */
-static
-bool
-recv_group_scan_log_recs(
- lsn_t checkpoint_lsn,
- lsn_t* contiguous_lsn,
- bool last_phase)
-{
- DBUG_ENTER("recv_group_scan_log_recs");
- DBUG_ASSERT(!last_phase || recv_sys.mlog_checkpoint_lsn > 0);
+ if (recv_sys.offset < log_sys.get_block_size())
+ break;
- mysql_mutex_lock(&recv_sys.mutex);
- recv_sys.len = 0;
- recv_sys.recovered_offset = 0;
- recv_sys.clear();
- recv_sys.parse_start_lsn = *contiguous_lsn;
- recv_sys.scanned_lsn = *contiguous_lsn;
- recv_sys.recovered_lsn = *contiguous_lsn;
- recv_sys.scanned_checkpoint_no = 0;
- ut_ad(recv_max_page_lsn == 0);
- mysql_mutex_unlock(&recv_sys.mutex);
+ if (recv_sys.offset > buf_size / 4 ||
+ (recv_sys.offset > block_size_1 &&
+ recv_sys.len >= buf_size - recv_sys.MTR_SIZE_MAX))
+ {
+ const size_t ofs{recv_sys.offset & ~block_size_1};
+ memmove_aligned<64>(log_sys.buf, log_sys.buf + ofs, recv_sys.len - ofs);
+ recv_sys.len-= ofs;
+ recv_sys.offset&= block_size_1;
+ }
+ }
- lsn_t start_lsn;
- lsn_t end_lsn;
- store_t store = recv_sys.mlog_checkpoint_lsn == 0
- ? STORE_NO : (last_phase ? STORE_IF_EXISTS : STORE_YES);
-
- log_sys.log.scanned_lsn = end_lsn = *contiguous_lsn =
- ut_uint64_align_down(*contiguous_lsn, OS_FILE_LOG_BLOCK_SIZE);
- ut_d(recv_sys.after_apply = last_phase);
-
- do {
- if (last_phase && store == STORE_NO) {
- store = STORE_IF_EXISTS;
- recv_sys.apply(false);
- /* Rescan the redo logs from last stored lsn */
- end_lsn = recv_sys.recovered_lsn;
- }
+ const bool corrupt= recv_sys.is_corrupt_log() || recv_sys.is_corrupt_fs();
+ recv_sys.maybe_finish_batch();
+ if (last_phase)
+ log_sys.set_recovered_lsn(recv_sys.lsn);
+ mysql_mutex_unlock(&recv_sys.mutex);
- start_lsn = ut_uint64_align_down(end_lsn,
- OS_FILE_LOG_BLOCK_SIZE);
- end_lsn = start_lsn;
- log_sys.log.read_log_seg(&end_lsn, start_lsn + RECV_SCAN_SIZE);
- } while (end_lsn != start_lsn
- && !recv_scan_log_recs(&store, log_sys.buf, checkpoint_lsn,
- start_lsn, end_lsn, contiguous_lsn,
- &log_sys.log.scanned_lsn));
-
- if (recv_sys.is_corrupt_log() || recv_sys.is_corrupt_fs()) {
- DBUG_RETURN(false);
- }
+ if (corrupt)
+ DBUG_RETURN(false);
- DBUG_PRINT("ib_log", ("%s " LSN_PF " completed",
- last_phase ? "rescan" : "scan",
- log_sys.log.scanned_lsn));
+ DBUG_PRINT("ib_log",
+ ("%s " LSN_PF " completed", last_phase ? "rescan" : "scan",
+ recv_sys.lsn));
+ ut_ad(!last_phase || recv_sys.lsn >= recv_sys.file_checkpoint);
- DBUG_RETURN(store == STORE_NO);
+ DBUG_RETURN(store == STORE_NO);
}
/** Report a missing tablespace for which page-redo log exists.
@@ -3834,29 +3859,38 @@ recv_init_missing_space(dberr_t err, const recv_spaces_t::const_iterator& i)
case SRV_OPERATION_RESTORE:
case SRV_OPERATION_RESTORE_EXPORT:
if (i->second.name.find("/#sql") != std::string::npos) {
- ib::warn() << "Tablespace " << i->first << " was not"
- " found at " << i->second.name << " when"
- " restoring a (partial?) backup. All redo log"
- " for this file will be ignored!";
+ sql_print_warning("InnoDB: Tablespace " UINT32PF
+ " was not found at %.*s when"
+ " restoring a (partial?) backup."
+ " All redo log"
+ " for this file will be ignored!",
+ i->first, int(i->second.name.size()),
+ i->second.name.data());
}
return(err);
}
if (srv_force_recovery == 0) {
- ib::error() << "Tablespace " << i->first << " was not"
- " found at " << i->second.name << ".";
+ sql_print_error("InnoDB: Tablespace " UINT32PF " was not"
+ " found at %.*s.", i->first,
+ int(i->second.name.size()),
+ i->second.name.data());
if (err == DB_SUCCESS) {
- ib::error() << "Set innodb_force_recovery=1 to"
+ sql_print_information(
+ "InnoDB: Set innodb_force_recovery=1 to"
" ignore this and to permanently lose"
- " all changes to the tablespace.";
+ " all changes to the tablespace.");
err = DB_TABLESPACE_NOT_FOUND;
}
} else {
- ib::warn() << "Tablespace " << i->first << " was not"
- " found at " << i->second.name << ", and"
- " innodb_force_recovery was set. All redo log"
- " for this tablespace will be ignored!";
+ sql_print_warning("InnoDB: Tablespace " UINT32PF
+ " was not found at %.*s"
+ ", and innodb_force_recovery was set."
+ " All redo log for this tablespace"
+ " will be ignored!",
+ i->first, int(i->second.name.size()),
+ i->second.name.data());
}
return(err);
@@ -3879,7 +3913,7 @@ recv_validate_tablespace(bool rescan, bool& missing_tablespace)
for (recv_sys_t::map::iterator p = recv_sys.pages.begin();
p != recv_sys.pages.end();) {
ut_ad(!p->second.log.empty());
- const ulint space = p->first.space();
+ const uint32_t space = p->first.space();
if (is_predefined_tablespace(space)) {
next:
p++;
@@ -3931,20 +3965,25 @@ func_exit:
missing_tablespace = true;
- if (srv_force_recovery > 0) {
- ib::warn() << "Tablespace " << rs.first
- <<" was not found at " << rs.second.name
- <<", and innodb_force_recovery was set."
- <<" All redo log for this tablespace"
- <<" will be ignored!";
+ if (srv_force_recovery) {
+ sql_print_warning("InnoDB: Tablespace " UINT32PF
+ " was not found at %.*s,"
+ " and innodb_force_recovery was set."
+ " All redo log for this tablespace"
+ " will be ignored!",
+ rs.first, int(rs.second.name.size()),
+ rs.second.name.data());
continue;
}
if (!rescan) {
- ib::info() << "Tablespace " << rs.first
- << " was not found at '"
- << rs.second.name << "', but there"
- <<" were no modifications either.";
+ sql_print_information("InnoDB: Tablespace " UINT32PF
+ " was not found at '%.*s',"
+ " but there were"
+ " no modifications either.",
+ rs.first,
+ int(rs.second.name.size()),
+ rs.second.name.data());
}
}
@@ -3993,9 +4032,10 @@ recv_init_crash_recovery_spaces(bool rescan, bool& missing_tablespace)
std::move(rs.second.freed_ranges));
}
} else if (rs.second.name == "") {
- ib::error() << "Missing FILE_CREATE, FILE_DELETE"
- " or FILE_MODIFY before FILE_CHECKPOINT"
- " for tablespace " << rs.first;
+ sql_print_error("InnoDB: Missing FILE_CREATE,"
+ " FILE_DELETE or FILE_MODIFY"
+ " before FILE_CHECKPOINT"
+ " for tablespace " UINT32PF, rs.first);
recv_sys.set_corrupt_log();
return(DB_CORRUPTION);
} else {
@@ -4018,7 +4058,9 @@ recv_init_crash_recovery_spaces(bool rescan, bool& missing_tablespace)
static dberr_t recv_rename_files()
{
mysql_mutex_assert_owner(&recv_sys.mutex);
- mysql_mutex_assert_owner(&log_sys.mutex);
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
dberr_t err= DB_SUCCESS;
@@ -4052,18 +4094,19 @@ static dberr_t recv_rename_files()
only be possible if the recovery of both files was deferred
(no valid page 0 is contained in either file). We shall not
rename the file, just rename the metadata. */
- ib::info() << "Renaming tablespace metadata " << id
- << " from '" << old << "' to '" << r.second
- << "' that is also associated with tablespace "
- << other->id;
+ sql_print_information("InnoDB: Renaming tablespace metadata " UINT32PF
+ " from '%s' to '%s' that is also associated"
+ " with tablespace " UINT32PF,
+ id, old, new_name, other->id);
space->chain.start->name= mem_strdup(new_name);
ut_free(old);
}
else if (!os_file_status(new_name, &exists, &ftype) || exists)
{
- ib::error() << "Cannot replay rename of tablespace " << id
- << " from '" << old << "' to '" << r.second <<
- (exists ? "' because the target file exists" : "'");
+ sql_print_error("InnoDB: Cannot replay rename of tablespace " UINT32PF
+ " from '%s' to '%s'%s",
+ id, old, new_name, exists ?
+ " because the target file exists" : "");
err= DB_TABLESPACE_EXISTS;
}
else
@@ -4071,8 +4114,8 @@ static dberr_t recv_rename_files()
mysql_mutex_unlock(&fil_system.mutex);
err= space->rename(new_name, false);
if (err != DB_SUCCESS)
- ib::error() << "Cannot replay rename of tablespace " << id
- << " to '" << r.second << "': " << err;
+ sql_print_error("InnoDB: Cannot replay rename of tablespace "
+ UINT32PF " to '%s: %s", new_name, ut_strerr(err));
goto done;
}
mysql_mutex_unlock(&fil_system.mutex);
@@ -4090,19 +4133,11 @@ done:
}
/** Start recovering from a redo log checkpoint.
-@param[in] flush_lsn FIL_PAGE_FILE_FLUSH_LSN
of first system tablespace page
@return error code or DB_SUCCESS */
-dberr_t
-recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
+dberr_t recv_recovery_from_checkpoint_start()
{
- ulint max_cp_field;
- lsn_t checkpoint_lsn;
bool rescan = false;
- ib_uint64_t checkpoint_no;
- lsn_t contiguous_lsn;
- byte* buf;
- dberr_t err = DB_SUCCESS;
ut_ad(srv_operation == SRV_OPERATION_NORMAL
|| srv_operation == SRV_OPERATION_RESTORE
@@ -4113,161 +4148,72 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
ut_d(mysql_mutex_unlock(&buf_pool.flush_list_mutex));
if (srv_force_recovery >= SRV_FORCE_NO_LOG_REDO) {
-
- ib::info() << "innodb_force_recovery=6 skips redo log apply";
-
+ sql_print_information("InnoDB: innodb_force_recovery=6"
+ " skips redo log apply");
return(DB_SUCCESS);
}
recv_sys.recovery_on = true;
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
- err = recv_find_max_checkpoint(&max_cp_field);
-
- if (err != DB_SUCCESS) {
-
- recv_sys.recovered_lsn = log_sys.get_lsn();
- mysql_mutex_unlock(&log_sys.mutex);
- return(err);
+ dberr_t err = recv_sys.find_checkpoint();
+ if (err != DB_SUCCESS) {
+early_exit:
+ log_sys.latch.wr_unlock();
+ return err;
}
- buf = log_sys.checkpoint_buf;
- log_sys.log.read(max_cp_field, {buf, OS_FILE_LOG_BLOCK_SIZE});
-
- checkpoint_lsn = mach_read_from_8(buf + LOG_CHECKPOINT_LSN);
- checkpoint_no = mach_read_from_8(buf + LOG_CHECKPOINT_NO);
+ log_sys.set_capacity();
/* Start reading the log from the checkpoint lsn. The variable
contiguous_lsn contains an lsn up to which the log is known to
be contiguously written. */
- recv_sys.mlog_checkpoint_lsn = 0;
-
- ut_ad(RECV_SCAN_SIZE <= srv_log_buffer_size);
-
- const lsn_t end_lsn = mach_read_from_8(
- buf + LOG_CHECKPOINT_END_LSN);
ut_ad(recv_sys.pages.empty());
- contiguous_lsn = checkpoint_lsn;
- switch (log_sys.log.format) {
- case 0:
- mysql_mutex_unlock(&log_sys.mutex);
- return DB_SUCCESS;
- default:
- if (end_lsn == 0) {
- break;
- }
- if (end_lsn >= checkpoint_lsn) {
- contiguous_lsn = end_lsn;
- break;
- }
- recv_sys.set_corrupt_log();
- mysql_mutex_unlock(&log_sys.mutex);
- return(DB_ERROR);
- }
- size_t sizeof_checkpoint;
-
- if (!log_sys.is_physical()) {
- sizeof_checkpoint = 9/* size of MLOG_CHECKPOINT */;
- goto completed;
- }
-
- /* Look for FILE_CHECKPOINT. */
- recv_group_scan_log_recs(checkpoint_lsn, &contiguous_lsn, false);
- /* The first scan should not have stored or applied any records. */
- ut_ad(recv_sys.pages.empty());
- ut_ad(!recv_sys.is_corrupt_fs());
-
- if (srv_read_only_mode && recv_needed_recovery) {
- mysql_mutex_unlock(&log_sys.mutex);
- return(DB_READ_ONLY);
- }
-
- if (recv_sys.is_corrupt_log() && !srv_force_recovery) {
- mysql_mutex_unlock(&log_sys.mutex);
- ib::warn() << "Log scan aborted at LSN " << contiguous_lsn;
- return(DB_ERROR);
+ if (log_sys.format == log_t::FORMAT_3_23) {
+ goto early_exit;
}
- if (recv_sys.mlog_checkpoint_lsn == 0) {
- lsn_t scan_lsn = log_sys.log.scanned_lsn;
- if (!srv_read_only_mode && scan_lsn != checkpoint_lsn) {
- mysql_mutex_unlock(&log_sys.mutex);
- ib::error err;
- err << "Missing FILE_CHECKPOINT";
- if (end_lsn) {
- err << " at " << end_lsn;
- }
- err << " between the checkpoint " << checkpoint_lsn
- << " and the end " << scan_lsn << ".";
- return(DB_ERROR);
+ if (log_sys.is_latest()) {
+ const bool rewind = recv_sys.lsn
+ != log_sys.next_checkpoint_lsn;
+ log_sys.last_checkpoint_lsn = log_sys.next_checkpoint_lsn;
+
+ recv_scan_log(false);
+ if (recv_needed_recovery) {
+read_only_recovery:
+ sql_print_warning("InnoDB: innodb_read_only"
+ " prevents crash recovery");
+ err = DB_READ_ONLY;
+ goto early_exit;
}
-
- log_sys.log.scanned_lsn = checkpoint_lsn;
- } else {
- contiguous_lsn = checkpoint_lsn;
- rescan = recv_group_scan_log_recs(
- checkpoint_lsn, &contiguous_lsn, false);
-
- if ((recv_sys.is_corrupt_log() && !srv_force_recovery)
- || recv_sys.is_corrupt_fs()) {
- mysql_mutex_unlock(&log_sys.mutex);
- return(DB_ERROR);
+ if (recv_sys.is_corrupt_log()) {
+ sql_print_error("InnoDB: Log scan aborted at LSN "
+ LSN_PF, recv_sys.lsn);
+ goto err_exit;
}
- }
-
- /* NOTE: we always do a 'recovery' at startup, but only if
- there is something wrong we will print a message to the
- user about recovery: */
- sizeof_checkpoint= SIZE_OF_FILE_CHECKPOINT;
-
-completed:
- if (flush_lsn == checkpoint_lsn + sizeof_checkpoint
- && recv_sys.mlog_checkpoint_lsn == checkpoint_lsn) {
- /* The redo log is logically empty. */
- } else if (checkpoint_lsn != flush_lsn) {
- ut_ad(!srv_log_file_created);
-
- if (checkpoint_lsn + sizeof_checkpoint < flush_lsn) {
- ib::warn()
- << "Are you sure you are using the right "
- << LOG_FILE_NAME
- << " to start up the database? Log sequence "
- "number in the "
- << LOG_FILE_NAME << " is " << checkpoint_lsn
- << ", less than the log sequence number in "
- "the first system tablespace file header, "
- << flush_lsn << ".";
+ ut_ad(recv_sys.file_checkpoint);
+ if (rewind) {
+ recv_sys.lsn = log_sys.next_checkpoint_lsn;
+ recv_sys.offset = 0;
+ recv_sys.len = 0;
}
+ ut_ad(!recv_max_page_lsn);
+ rescan = recv_scan_log(false);
- if (!recv_needed_recovery) {
-
- ib::info()
- << "The log sequence number " << flush_lsn
- << " in the system tablespace does not match"
- " the log sequence number "
- << checkpoint_lsn << " in the "
- << LOG_FILE_NAME << "!";
-
- if (srv_read_only_mode) {
- ib::error() << "innodb_read_only"
- " prevents crash recovery";
- mysql_mutex_unlock(&log_sys.mutex);
- return(DB_READ_ONLY);
- }
+ if (srv_read_only_mode && recv_needed_recovery) {
+ goto read_only_recovery;
+ }
- recv_needed_recovery = true;
+ if ((recv_sys.is_corrupt_log() && !srv_force_recovery)
+ || recv_sys.is_corrupt_fs()) {
+ goto err_exit;
}
}
- log_sys.set_lsn(recv_sys.recovered_lsn);
- if (UNIV_LIKELY(log_sys.get_flushed_lsn() < recv_sys.recovered_lsn)) {
- /* This may already have been set by create_log_file()
- if no logs existed when the server started up. */
- log_sys.set_flushed_lsn(recv_sys.recovered_lsn);
- }
+ log_sys.set_recovered_lsn(recv_sys.lsn);
if (recv_needed_recovery) {
bool missing_tablespace = false;
@@ -4276,8 +4222,7 @@ completed:
rescan, missing_tablespace);
if (err != DB_SUCCESS) {
- mysql_mutex_unlock(&log_sys.mutex);
- return(err);
+ goto early_exit;
}
/* If there is any missing tablespace and rescan is needed
@@ -4287,34 +4232,30 @@ completed:
ut_ad(rescan || !missing_tablespace);
while (missing_tablespace) {
+ recv_sys.lsn = recv_sys.last_stored_lsn;
DBUG_PRINT("ib_log", ("Rescan of redo log to validate "
"the missing tablespace. Scan "
"from last stored LSN " LSN_PF,
- recv_sys.last_stored_lsn));
-
- lsn_t recent_stored_lsn = recv_sys.last_stored_lsn;
- rescan = recv_group_scan_log_recs(
- checkpoint_lsn, &recent_stored_lsn, false);
-
+ recv_sys.lsn));
+ rescan = recv_scan_log(false);
ut_ad(!recv_sys.is_corrupt_fs());
missing_tablespace = false;
- err = recv_sys.is_corrupt_log()
- ? DB_ERROR
- : recv_validate_tablespace(
- rescan, missing_tablespace);
+ if (recv_sys.is_corrupt_log()) {
+ goto err_exit;
+ }
+
+ err = recv_validate_tablespace(
+ rescan, missing_tablespace);
if (err != DB_SUCCESS) {
- mysql_mutex_unlock(&log_sys.mutex);
- return err;
+ goto early_exit;
}
rescan = true;
}
- recv_sys.parse_start_lsn = checkpoint_lsn;
-
if (srv_operation == SRV_OPERATION_NORMAL) {
deferred_spaces.deferred_dblwr();
buf_dblwr.recover();
@@ -4323,16 +4264,12 @@ completed:
ut_ad(srv_force_recovery <= SRV_FORCE_NO_UNDO_LOG_SCAN);
if (rescan) {
- contiguous_lsn = checkpoint_lsn;
-
- recv_group_scan_log_recs(
- checkpoint_lsn, &contiguous_lsn, true);
-
+ recv_sys.lsn = log_sys.next_checkpoint_lsn;
+ rescan = recv_scan_log(true);
if ((recv_sys.is_corrupt_log()
&& !srv_force_recovery)
|| recv_sys.is_corrupt_fs()) {
- mysql_mutex_unlock(&log_sys.mutex);
- return(DB_ERROR);
+ goto err_exit;
}
/* In case of multi-batch recovery,
@@ -4341,57 +4278,56 @@ completed:
ut_d(recv_sys.after_apply = false);
}
} else {
- ut_ad(!rescan || recv_sys.pages.empty());
+ ut_ad(recv_sys.pages.empty());
}
- if (log_sys.is_physical()
- && (log_sys.log.scanned_lsn < checkpoint_lsn
- || log_sys.log.scanned_lsn < recv_max_page_lsn)) {
-
- ib::error() << "We scanned the log up to "
- << log_sys.log.scanned_lsn
- << ". A checkpoint was at " << checkpoint_lsn << " and"
- " the maximum LSN on a database page was "
- << recv_max_page_lsn << ". It is possible that the"
- " database is now corrupt!";
+ if (log_sys.is_latest()
+ && (recv_sys.lsn < log_sys.next_checkpoint_lsn
+ || recv_sys.lsn < recv_max_page_lsn)) {
+
+ sql_print_error("InnoDB: We scanned the log up to " LSN_PF "."
+ " A checkpoint was at " LSN_PF
+ " and the maximum LSN on a database page was "
+ LSN_PF ". It is possible that the"
+ " database is now corrupt!",
+ recv_sys.lsn,
+ log_sys.next_checkpoint_lsn,
+ recv_max_page_lsn);
}
- if (recv_sys.recovered_lsn < checkpoint_lsn) {
- mysql_mutex_unlock(&log_sys.mutex);
-
- ib::error() << "Recovered only to lsn:"
- << recv_sys.recovered_lsn
- << " checkpoint_lsn: " << checkpoint_lsn;
-
- return(DB_ERROR);
+ if (recv_sys.lsn < log_sys.next_checkpoint_lsn) {
+err_exit:
+ err = DB_ERROR;
+ goto early_exit;
}
- log_sys.next_checkpoint_lsn = checkpoint_lsn;
- log_sys.next_checkpoint_no = checkpoint_no + 1;
-
- recv_synchronize_groups();
-
- ut_ad(recv_needed_recovery
- || checkpoint_lsn == recv_sys.recovered_lsn);
-
- log_sys.write_lsn = log_sys.get_lsn();
- log_sys.buf_free = log_sys.write_lsn % OS_FILE_LOG_BLOCK_SIZE;
- log_sys.buf_next_to_write = log_sys.buf_free;
-
- log_sys.last_checkpoint_lsn = checkpoint_lsn;
-
- if (!srv_read_only_mode && srv_operation == SRV_OPERATION_NORMAL
- && (~log_t::FORMAT_ENCRYPTED & log_sys.log.format)
- == log_t::FORMAT_10_5) {
- /* Write a FILE_CHECKPOINT marker as the first thing,
- before generating any other redo log. This ensures
- that subsequent crash recovery will be possible even
- if the server were killed soon after this. */
- fil_names_clear(log_sys.last_checkpoint_lsn, true);
+ if (!srv_read_only_mode && log_sys.is_latest()) {
+ ut_ad(log_sys.get_flushed_lsn() == log_sys.get_lsn());
+ ut_ad(recv_sys.lsn == log_sys.get_lsn());
+ if (!log_sys.is_pmem()) {
+ const size_t bs_1{log_sys.get_block_size() - 1};
+ const size_t ro{recv_sys.offset};
+ recv_sys.offset &= bs_1;
+ memmove_aligned<64>(log_sys.buf,
+ log_sys.buf + (ro & ~bs_1),
+ log_sys.get_block_size());
+#ifdef HAVE_PMEM
+ } else {
+ mprotect(log_sys.buf, size_t(log_sys.file_size),
+ PROT_READ | PROT_WRITE);
+#endif
+ }
+ log_sys.buf_free = recv_sys.offset;
+ if (recv_needed_recovery
+ && srv_operation == SRV_OPERATION_NORMAL) {
+ /* Write a FILE_CHECKPOINT marker as the first thing,
+ before generating any other redo log. This ensures
+ that subsequent crash recovery will be possible even
+ if the server were killed soon after this. */
+ fil_names_clear(log_sys.next_checkpoint_lsn);
+ }
}
- log_sys.next_checkpoint_no = ++checkpoint_no;
-
mysql_mutex_lock(&recv_sys.mutex);
recv_sys.apply_log_recs = true;
recv_no_ibuf_operations = false;
@@ -4412,7 +4348,7 @@ completed:
err = DB_CORRUPTION;
}
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
return err;
}
@@ -4423,11 +4359,11 @@ bool recv_dblwr_t::validate_page(const page_id_t page_id,
{
if (page_id.page_no() == 0)
{
- ulint flags= fsp_header_get_flags(page);
+ uint32_t flags= fsp_header_get_flags(page);
if (!fil_space_t::is_valid_flags(flags, page_id.space()))
{
- ulint cflags= fsp_flags_convert_from_101(flags);
- if (cflags == ULINT_UNDEFINED)
+ uint32_t cflags= fsp_flags_convert_from_101(flags);
+ if (cflags == UINT32_MAX)
{
ib::warn() << "Ignoring a doublewrite copy of page " << page_id
<< "due to invalid flags " << ib::hex(flags);
diff --git a/storage/innobase/lz4.cmake b/storage/innobase/lz4.cmake
deleted file mode 100644
index a908dd3b73e..00000000000
--- a/storage/innobase/lz4.cmake
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright (C) 2014, SkySQL Ab. All Rights Reserved.
-#
-# This program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; version 2 of the License.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
-
-SET(WITH_INNODB_LZ4 AUTO CACHE STRING
- "Build with lz4. Possible values are 'ON', 'OFF', 'AUTO' and default is 'AUTO'")
-
-MACRO (MYSQL_CHECK_LZ4)
- IF (WITH_INNODB_LZ4 STREQUAL "ON" OR WITH_INNODB_LZ4 STREQUAL "AUTO")
- CHECK_INCLUDE_FILES(lz4.h HAVE_LZ4_H)
- CHECK_LIBRARY_EXISTS(lz4 LZ4_compress_limitedOutput "" HAVE_LZ4_SHARED_LIB)
- CHECK_LIBRARY_EXISTS(lz4 LZ4_compress_default "" HAVE_LZ4_COMPRESS_DEFAULT)
-
- IF (HAVE_LZ4_SHARED_LIB AND HAVE_LZ4_H)
- SET(HAVE_INNODB_LZ4 TRUE)
- ADD_DEFINITIONS(-DHAVE_LZ4=1)
- IF (HAVE_LZ4_COMPRESS_DEFAULT)
- ADD_DEFINITIONS(-DHAVE_LZ4_COMPRESS_DEFAULT=1)
- ENDIF()
- LINK_LIBRARIES(lz4)
- ELSE()
- IF (WITH_INNODB_LZ4 STREQUAL "ON")
- MESSAGE(FATAL_ERROR "Required lz4 library is not found")
- ENDIF()
- ENDIF()
- ENDIF()
- ADD_FEATURE_INFO(INNODB_LZ4 HAVE_INNODB_LZ4 "LZ4 compression in the InnoDB storage engine")
-ENDMACRO()
diff --git a/storage/innobase/lzma.cmake b/storage/innobase/lzma.cmake
deleted file mode 100644
index 3060139c27c..00000000000
--- a/storage/innobase/lzma.cmake
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright (C) 2014, SkySQL Ab. All Rights Reserved.
-#
-# This program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; version 2 of the License.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
-
-SET(WITH_INNODB_LZMA AUTO CACHE STRING
- "Build with lzma. Possible values are 'ON', 'OFF', 'AUTO' and default is 'AUTO'")
-
-MACRO (MYSQL_CHECK_LZMA)
- IF (WITH_INNODB_LZMA STREQUAL "ON" OR WITH_INNODB_LZMA STREQUAL "AUTO")
- CHECK_INCLUDE_FILES(lzma.h HAVE_LZMA_H)
- CHECK_LIBRARY_EXISTS(lzma lzma_stream_buffer_decode "" HAVE_LZMA_DECODE)
- CHECK_LIBRARY_EXISTS(lzma lzma_easy_buffer_encode "" HAVE_LZMA_ENCODE)
-
- IF (HAVE_LZMA_DECODE AND HAVE_LZMA_ENCODE AND HAVE_LZMA_H)
- SET(HAVE_INNODB_LZMA TRUE)
- ADD_DEFINITIONS(-DHAVE_LZMA=1)
- LINK_LIBRARIES(lzma)
- ELSE()
- IF (WITH_INNODB_LZMA STREQUAL "ON")
- MESSAGE(FATAL_ERROR "Required lzma library is not found")
- ENDIF()
- ENDIF()
- ENDIF()
- ADD_FEATURE_INFO(INNODB_LZMA HAVE_INNODB_LZMA "LZMA compression in the InnoDB storage engine")
-ENDMACRO()
diff --git a/storage/innobase/lzo.cmake b/storage/innobase/lzo.cmake
deleted file mode 100644
index ca2de6ab1c5..00000000000
--- a/storage/innobase/lzo.cmake
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (C) 2014, SkySQL Ab. All Rights Reserved.
-#
-# This program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; version 2 of the License.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
-
-SET(WITH_INNODB_LZO AUTO CACHE STRING
- "Build with lzo. Possible values are 'ON', 'OFF', 'AUTO' and default is 'AUTO'")
-
-MACRO (MYSQL_CHECK_LZO)
- IF (WITH_INNODB_LZO STREQUAL "ON" OR WITH_INNODB_LZO STREQUAL "AUTO")
- CHECK_INCLUDE_FILES(lzo/lzo1x.h HAVE_LZO_H)
- CHECK_LIBRARY_EXISTS(lzo2 lzo1x_1_compress "" HAVE_LZO_SHARED_LIB)
-
- IF(HAVE_LZO_SHARED_LIB AND HAVE_LZO_H)
- SET(HAVE_INNODB_LZO TRUE)
- ADD_DEFINITIONS(-DHAVE_LZO=1)
- LINK_LIBRARIES(lzo2)
- ELSE()
- IF (WITH_INNODB_LZO STREQUAL "ON")
- MESSAGE(FATAL_ERROR "Required lzo library is not found")
- ENDIF()
- ENDIF()
- ENDIF()
- ADD_FEATURE_INFO(INNODB_LZO HAVE_INNODB_LZO "LZO compression in the InnoDB storage engine")
-ENDMACRO()
diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc
index 2c004cb0aa6..48ab5c6835e 100644
--- a/storage/innobase/mtr/mtr0mtr.cc
+++ b/storage/innobase/mtr/mtr0mtr.cc
@@ -25,13 +25,10 @@ Created 11/26/1995 Heikki Tuuri
*******************************************************/
#include "mtr0log.h"
-
#include "buf0buf.h"
#include "buf0flu.h"
-#include "fsp0sysspace.h"
#include "page0types.h"
-#include "log0recv.h"
-#include "my_cpu.h"
+#include "log0crypt.h"
#ifdef BTR_CUR_HASH_ADAPT
# include "btr0sea.h"
#endif
@@ -60,19 +57,99 @@ void mtr_memo_slot_t::release() const
ut_d(const auto s=)
bpage->unfix();
ut_ad(s < buf_page_t::READ_FIX || s >= buf_page_t::WRITE_FIX);
- switch (auto latch= type & ~MTR_MEMO_MODIFY) {
+ switch (type) {
case MTR_MEMO_PAGE_S_FIX:
bpage->lock.s_unlock();
- return;
- case MTR_MEMO_PAGE_SX_FIX:
- case MTR_MEMO_PAGE_X_FIX:
- bpage->lock.u_or_x_unlock(latch == MTR_MEMO_PAGE_SX_FIX);
- /* fall through */
+ break;
case MTR_MEMO_BUF_FIX:
- return;
+ break;
+ default:
+ ut_ad(type == MTR_MEMO_PAGE_SX_FIX ||
+ type == MTR_MEMO_PAGE_X_FIX ||
+ type == MTR_MEMO_PAGE_SX_MODIFY ||
+ type == MTR_MEMO_PAGE_X_MODIFY);
+ bpage->lock.u_or_x_unlock(type & MTR_MEMO_PAGE_SX_FIX);
+ }
+ }
+}
+
+/** Prepare to insert a modified blcok into flush_list.
+@param lsn start LSN of the mini-transaction
+@return insert position for insert_into_flush_list() */
+inline buf_page_t *buf_pool_t::prepare_insert_into_flush_list(lsn_t lsn)
+ noexcept
+{
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(recv_recovery_is_on() || log_sys.latch.is_locked());
+#endif
+ ut_ad(lsn >= log_sys.last_checkpoint_lsn);
+ mysql_mutex_assert_owner(&flush_list_mutex);
+ static_assert(log_t::FIRST_LSN >= 2, "compatibility");
+
+rescan:
+ buf_page_t *prev= UT_LIST_GET_FIRST(flush_list);
+ if (prev)
+ {
+ lsn_t om= prev->oldest_modification();
+ if (om == 1)
+ {
+ delete_from_flush_list(prev);
+ goto rescan;
+ }
+ ut_ad(om > 2);
+ if (om <= lsn)
+ return nullptr;
+ while (buf_page_t *next= UT_LIST_GET_NEXT(list, prev))
+ {
+ om= next->oldest_modification();
+ if (om == 1)
+ {
+ delete_from_flush_list(next);
+ continue;
+ }
+ ut_ad(om > 2);
+ if (om <= lsn)
+ break;
+ prev= next;
}
- ut_ad("invalid type" == 0);
+ flush_hp.adjust(prev);
}
+ return prev;
+}
+
+/** Insert a modified block into the flush list.
+@param prev insert position (from prepare_insert_into_flush_list())
+@param block modified block
+@param lsn start LSN of the mini-transaction that modified the block */
+inline void buf_pool_t::insert_into_flush_list(buf_page_t *prev,
+ buf_block_t *block, lsn_t lsn)
+ noexcept
+{
+ ut_ad(!fsp_is_system_temporary(block->page.id().space()));
+ mysql_mutex_assert_owner(&flush_list_mutex);
+
+ MEM_CHECK_DEFINED(block->page.zip.data
+ ? block->page.zip.data : block->page.frame,
+ block->physical_size());
+
+ if (const lsn_t old= block->page.oldest_modification())
+ {
+ if (old > 1)
+ return;
+ flush_hp.adjust(&block->page);
+ UT_LIST_REMOVE(flush_list, &block->page);
+ }
+ else
+ flush_list_bytes+= block->physical_size();
+
+ ut_ad(flush_list_bytes <= curr_pool_size);
+
+ if (prev)
+ UT_LIST_INSERT_AFTER(flush_list, prev, &block->page);
+ else
+ UT_LIST_ADD_FIRST(flush_list, &block->page);
+
+ block->page.set_oldest_modification(lsn);
}
mtr_t::mtr_t()= default;
@@ -99,6 +176,7 @@ void mtr_t::start()
new(&m_log) mtr_buf_t();
m_made_dirty= false;
+ m_latch_ex= false;
m_inside_ibuf= false;
m_modifications= false;
m_log_mode= MTR_LOG_ALL;
@@ -117,6 +195,109 @@ inline void mtr_t::release_resources()
ut_d(m_commit= true);
}
+/** Handle any pages that were freed during the mini-transaction. */
+void mtr_t::process_freed_pages()
+{
+ if (m_freed_pages)
+ {
+ ut_ad(!m_freed_pages->empty());
+ ut_ad(m_freed_space);
+ ut_ad(m_freed_space->is_owner());
+ ut_ad(is_named_space(m_freed_space));
+
+ /* Update the last freed lsn */
+ m_freed_space->freed_range_mutex.lock();
+ m_freed_space->update_last_freed_lsn(m_commit_lsn);
+ if (!m_trim_pages)
+ for (const auto &range : *m_freed_pages)
+ m_freed_space->add_free_range(range);
+ else
+ m_freed_space->clear_freed_ranges();
+ m_freed_space->freed_range_mutex.unlock();
+
+ delete m_freed_pages;
+ m_freed_pages= nullptr;
+ m_freed_space= nullptr;
+ /* mtr_t::start() will reset m_trim_pages */
+ }
+ else
+ ut_ad(!m_freed_space);
+}
+
+ATTRIBUTE_COLD __attribute__((noinline))
+/** Insert a modified block into buf_pool.flush_list on IMPORT TABLESPACE. */
+static void insert_imported(buf_block_t *block)
+{
+ if (block->page.oldest_modification() <= 1)
+ {
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
+ const lsn_t lsn= log_sys.last_checkpoint_lsn;
+ mysql_mutex_lock(&buf_pool.flush_list_mutex);
+ buf_pool.insert_into_flush_list
+ (buf_pool.prepare_insert_into_flush_list(lsn), block, lsn);
+ log_sys.latch.rd_unlock();
+ mysql_mutex_unlock(&buf_pool.flush_list_mutex);
+ }
+}
+
+/** Release modified pages when no log was written. */
+void mtr_t::release_unlogged()
+{
+ ut_ad(m_log_mode == MTR_LOG_NO_REDO);
+ ut_ad(m_log.size() == 0);
+
+ process_freed_pages();
+
+ for (auto it= m_memo.rbegin(); it != m_memo.rend(); it++)
+ {
+ mtr_memo_slot_t &slot= *it;
+ ut_ad(slot.object);
+ switch (slot.type) {
+ case MTR_MEMO_S_LOCK:
+ static_cast<index_lock*>(slot.object)->s_unlock();
+ break;
+ case MTR_MEMO_SPACE_X_LOCK:
+ static_cast<fil_space_t*>(slot.object)->set_committed_size();
+ static_cast<fil_space_t*>(slot.object)->x_unlock();
+ break;
+ case MTR_MEMO_X_LOCK:
+ case MTR_MEMO_SX_LOCK:
+ static_cast<index_lock*>(slot.object)->
+ u_or_x_unlock(slot.type == MTR_MEMO_SX_LOCK);
+ break;
+ default:
+ buf_block_t *block= static_cast<buf_block_t*>(slot.object);
+ ut_d(const auto s=) block->page.unfix();
+ ut_ad(s >= buf_page_t::FREED);
+ ut_ad(s < buf_page_t::READ_FIX);
+
+ if (slot.type & MTR_MEMO_MODIFY)
+ {
+ ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY ||
+ slot.type == MTR_MEMO_PAGE_SX_MODIFY);
+ ut_ad(block->page.id() < end_page_id);
+ insert_imported(block);
+ }
+
+ switch (slot.type) {
+ case MTR_MEMO_PAGE_S_FIX:
+ block->page.lock.s_unlock();
+ break;
+ case MTR_MEMO_BUF_FIX:
+ break;
+ default:
+ ut_ad(slot.type == MTR_MEMO_PAGE_SX_FIX ||
+ slot.type == MTR_MEMO_PAGE_X_FIX ||
+ slot.type == MTR_MEMO_PAGE_SX_MODIFY ||
+ slot.type == MTR_MEMO_PAGE_X_MODIFY);
+ block->page.lock.u_or_x_unlock(slot.type & MTR_MEMO_PAGE_SX_FIX);
+ }
+ }
+ }
+
+ m_memo.clear();
+}
+
void mtr_t::release()
{
for (auto it= m_memo.rbegin(); it != m_memo.rend(); it++)
@@ -133,78 +314,140 @@ void mtr_t::commit()
/* This is a dirty read, for debugging. */
ut_ad(!m_modifications || !recv_no_log_write);
ut_ad(!m_modifications || m_log_mode != MTR_LOG_NONE);
+ ut_ad(!m_latch_ex);
if (m_modifications && (m_log_mode == MTR_LOG_NO_REDO || !m_log.empty()))
{
- ut_ad(!srv_read_only_mode || m_log_mode == MTR_LOG_NO_REDO);
+ if (UNIV_UNLIKELY(!is_logged()))
+ {
+ release_unlogged();
+ goto func_exit;
+ }
- std::pair<lsn_t,page_flush_ahead> lsns;
+ ut_ad(!srv_read_only_mode);
+ std::pair<lsn_t,page_flush_ahead> lsns{do_write()};
+ process_freed_pages();
- if (UNIV_LIKELY(is_logged()))
+ if (m_made_dirty)
{
- lsns= do_write();
+ size_t modified= 0;
+ auto it= m_memo.rbegin();
- if (m_made_dirty)
- mysql_mutex_lock(&log_sys.flush_order_mutex);
+ mysql_mutex_lock(&buf_pool.flush_list_mutex);
- /* It is now safe to release log_sys.mutex because the
- buf_pool.flush_order_mutex will ensure that we are the first one
- to insert into buf_pool.flush_list. */
- mysql_mutex_unlock(&log_sys.mutex);
- }
- else
- {
- ut_ad(m_log_mode == MTR_LOG_NO_REDO);
- ut_ad(m_log.size() == 0);
- m_commit_lsn= log_sys.get_lsn();
- lsns= { m_commit_lsn, PAGE_FLUSH_NO };
- if (UNIV_UNLIKELY(m_made_dirty)) /* This should be IMPORT TABLESPACE */
- mysql_mutex_lock(&log_sys.flush_order_mutex);
- }
+ buf_page_t *const prev=
+ buf_pool.prepare_insert_into_flush_list(lsns.first);
- if (m_freed_pages)
- {
- ut_ad(!m_freed_pages->empty());
- ut_ad(m_freed_space);
- ut_ad(m_freed_space->is_owner());
- ut_ad(is_named_space(m_freed_space));
- /* Update the last freed lsn */
- m_freed_space->update_last_freed_lsn(m_commit_lsn);
-
- if (!is_trim_pages())
- for (const auto &range : *m_freed_pages)
- m_freed_space->add_free_range(range);
+ while (it != m_memo.rend())
+ {
+ const mtr_memo_slot_t &slot= *it++;
+ if (slot.type & MTR_MEMO_MODIFY)
+ {
+ ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY ||
+ slot.type == MTR_MEMO_PAGE_SX_MODIFY);
+ modified++;
+ buf_block_t *b= static_cast<buf_block_t*>(slot.object);
+ ut_ad(b->page.id() < end_page_id);
+ ut_d(const auto s= b->page.state());
+ ut_ad(s > buf_page_t::FREED);
+ ut_ad(s < buf_page_t::READ_FIX);
+ ut_ad(mach_read_from_8(b->page.frame + FIL_PAGE_LSN) <=
+ m_commit_lsn);
+ mach_write_to_8(b->page.frame + FIL_PAGE_LSN, m_commit_lsn);
+ if (UNIV_LIKELY_NULL(b->page.zip.data))
+ memcpy_aligned<8>(FIL_PAGE_LSN + b->page.zip.data,
+ FIL_PAGE_LSN + b->page.frame, 8);
+ buf_pool.insert_into_flush_list(prev, b, lsns.first);
+ }
+ }
+
+ ut_ad(modified);
+ buf_pool.flush_list_requests+= modified;
+ buf_pool.page_cleaner_wakeup();
+ mysql_mutex_unlock(&buf_pool.flush_list_mutex);
+
+ if (m_latch_ex)
+ {
+ log_sys.latch.wr_unlock();
+ m_latch_ex= false;
+ }
else
- m_freed_space->clear_freed_ranges();
- delete m_freed_pages;
- m_freed_pages= nullptr;
- m_freed_space= nullptr;
- /* mtr_t::start() will reset m_trim_pages */
+ log_sys.latch.rd_unlock();
+
+ release();
}
else
- ut_ad(!m_freed_space);
-
- for (const mtr_memo_slot_t &slot : m_memo)
{
- if (slot.type & MTR_MEMO_MODIFY)
+ if (m_latch_ex)
{
- ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY ||
- slot.type == MTR_MEMO_PAGE_SX_MODIFY);
- buf_flush_note_modification(static_cast<buf_block_t*>(slot.object),
- lsns.first, m_commit_lsn);
+ log_sys.latch.wr_unlock();
+ m_latch_ex= false;
}
- }
+ else
+ log_sys.latch.rd_unlock();
- if (m_made_dirty)
- mysql_mutex_unlock(&log_sys.flush_order_mutex);
+ size_t modified= 0;
- release();
+ for (auto it= m_memo.rbegin(); it != m_memo.rend(); )
+ {
+ const mtr_memo_slot_t &slot= *it++;
+ ut_ad(slot.object);
+ switch (slot.type) {
+ case MTR_MEMO_S_LOCK:
+ static_cast<index_lock*>(slot.object)->s_unlock();
+ break;
+ case MTR_MEMO_SPACE_X_LOCK:
+ static_cast<fil_space_t*>(slot.object)->set_committed_size();
+ static_cast<fil_space_t*>(slot.object)->x_unlock();
+ break;
+ case MTR_MEMO_X_LOCK:
+ case MTR_MEMO_SX_LOCK:
+ static_cast<index_lock*>(slot.object)->
+ u_or_x_unlock(slot.type == MTR_MEMO_SX_LOCK);
+ break;
+ default:
+ buf_page_t *bpage= static_cast<buf_page_t*>(slot.object);
+ const auto s= bpage->unfix();
+ if (slot.type & MTR_MEMO_MODIFY)
+ {
+ ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY ||
+ slot.type == MTR_MEMO_PAGE_SX_MODIFY);
+ ut_ad(bpage->oldest_modification() > 1);
+ ut_ad(bpage->oldest_modification() < m_commit_lsn);
+ ut_ad(bpage->id() < end_page_id);
+ ut_ad(s >= buf_page_t::FREED);
+ ut_ad(s < buf_page_t::READ_FIX);
+ ut_ad(mach_read_from_8(bpage->frame + FIL_PAGE_LSN) <=
+ m_commit_lsn);
+ if (s >= buf_page_t::UNFIXED)
+ {
+ mach_write_to_8(bpage->frame + FIL_PAGE_LSN, m_commit_lsn);
+ if (UNIV_LIKELY_NULL(bpage->zip.data))
+ memcpy_aligned<8>(FIL_PAGE_LSN + bpage->zip.data,
+ FIL_PAGE_LSN + bpage->frame, 8);
+ }
+ modified++;
+ }
+ switch (auto latch= slot.type & ~MTR_MEMO_MODIFY) {
+ case MTR_MEMO_PAGE_S_FIX:
+ bpage->lock.s_unlock();
+ continue;
+ case MTR_MEMO_PAGE_SX_FIX:
+ case MTR_MEMO_PAGE_X_FIX:
+ bpage->lock.u_or_x_unlock(latch == MTR_MEMO_PAGE_SX_FIX);
+ continue;
+ default:
+ ut_ad(latch == MTR_MEMO_BUF_FIX);
+ }
+ }
+ }
+
+ buf_pool.add_flush_list_requests(modified);
+ m_memo.clear();
+ }
if (UNIV_UNLIKELY(lsns.second != PAGE_FLUSH_NO))
buf_flush_ahead(m_commit_lsn, lsns.second == PAGE_FLUSH_SYNC);
-
- if (m_made_dirty)
- srv_stats.log_write_requests.inc();
}
else
{
@@ -212,7 +455,7 @@ void mtr_t::commit()
{
ut_ad(!m_freed_pages->empty());
ut_ad(m_freed_space == fil_system.temp_space);
- ut_ad(!is_trim_pages());
+ ut_ad(!m_trim_pages);
for (const auto &range : *m_freed_pages)
m_freed_space->add_free_range(range);
delete m_freed_pages;
@@ -222,6 +465,7 @@ void mtr_t::commit()
release();
}
+func_exit:
release_resources();
}
@@ -261,13 +505,17 @@ void mtr_t::commit_shrink(fil_space_t &space)
ut_ad(UT_LIST_GET_LEN(space.chain) == 1);
log_write_and_flush_prepare();
+ m_latch_ex= true;
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
const lsn_t start_lsn= do_write().first;
ut_d(m_log.erase());
- mysql_mutex_lock(&log_sys.flush_order_mutex);
/* Durably write the reduced FSP_SIZE before truncating the data file. */
log_write_and_flush();
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
os_file_truncate(space.chain.start->name, space.chain.start->handle,
os_offset_t{space.size} << srv_page_size_shift, true);
@@ -275,48 +523,65 @@ void mtr_t::commit_shrink(fil_space_t &space)
space.clear_freed_ranges();
const page_id_t high{space.id, space.size};
+ size_t modified= 0;
+ auto it= m_memo.rbegin();
+ mysql_mutex_lock(&buf_pool.flush_list_mutex);
- for (mtr_memo_slot_t &slot : m_memo)
+ buf_page_t *const prev= buf_pool.prepare_insert_into_flush_list(start_lsn);
+
+ while (it != m_memo.rend())
{
+ mtr_memo_slot_t &slot= *it++;
+
ut_ad(slot.object);
- switch (slot.type) {
- default:
- ut_ad("invalid type" == 0);
- break;
- case MTR_MEMO_SPACE_X_LOCK:
+ if (slot.type == MTR_MEMO_SPACE_X_LOCK)
ut_ad(high.space() == static_cast<fil_space_t*>(slot.object)->id);
- break;
- case MTR_MEMO_PAGE_X_MODIFY:
- case MTR_MEMO_PAGE_SX_MODIFY:
- case MTR_MEMO_PAGE_X_FIX:
- case MTR_MEMO_PAGE_SX_FIX:
- auto &block= *static_cast<buf_block_t*>(slot.object);
- const auto s= block.page.state();
- ut_ad(s >= buf_page_t::FREED);
+ else
+ {
+ ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY ||
+ slot.type == MTR_MEMO_PAGE_SX_MODIFY ||
+ slot.type == MTR_MEMO_PAGE_X_FIX ||
+ slot.type == MTR_MEMO_PAGE_SX_FIX);
+ buf_block_t *b= static_cast<buf_block_t*>(slot.object);
+ const page_id_t id{b->page.id()};
+ const auto s= b->page.state();
+ ut_ad(s > buf_page_t::FREED);
ut_ad(s < buf_page_t::READ_FIX);
- ut_ad(block.page.frame);
- const page_id_t id{block.page.id()};
+ ut_ad(b->page.frame);
+ ut_ad(mach_read_from_8(b->page.frame + FIL_PAGE_LSN) <= m_commit_lsn);
+ ut_ad(!b->page.zip.data); // we no not shrink ROW_FORMAT=COMPRESSED
+
if (id < high)
{
ut_ad(id.space() == high.space() ||
(id == page_id_t{0, TRX_SYS_PAGE_NO} &&
srv_is_undo_tablespace(high.space())));
if (slot.type & MTR_MEMO_MODIFY)
- buf_flush_note_modification(&block, start_lsn, m_commit_lsn);
+ {
+ modified++;
+ mach_write_to_8(b->page.frame + FIL_PAGE_LSN, m_commit_lsn);
+ buf_pool.insert_into_flush_list(prev, b, start_lsn);
+ }
}
else
{
ut_ad(id.space() == high.space());
if (s >= buf_page_t::UNFIXED)
- block.page.set_freed(s);
- if (block.page.oldest_modification() > 1)
- block.page.reset_oldest_modification();
+ b->page.set_freed(s);
+ if (b->page.oldest_modification() > 1)
+ b->page.reset_oldest_modification();
slot.type= mtr_memo_type_t(slot.type & ~MTR_MEMO_MODIFY);
}
}
}
- mysql_mutex_unlock(&log_sys.flush_order_mutex);
+ ut_ad(modified);
+ buf_pool.flush_list_requests+= modified;
+ buf_pool.page_cleaner_wakeup();
+ mysql_mutex_unlock(&buf_pool.flush_list_mutex);
+
+ log_sys.latch.wr_unlock();
+ m_latch_ex= false;
mysql_mutex_lock(&fil_system.mutex);
ut_ad(space.is_being_truncated);
@@ -327,7 +592,6 @@ void mtr_t::commit_shrink(fil_space_t &space)
release();
release_resources();
- srv_stats.log_write_requests.inc();
}
/** Commit a mini-transaction that is deleting or renaming a file.
@@ -344,12 +608,30 @@ bool mtr_t::commit_file(fil_space_t &space, const char *name)
ut_ad(!recv_recovery_is_on());
ut_ad(m_log_mode == MTR_LOG_ALL);
ut_ad(UT_LIST_GET_LEN(space.chain) == 1);
+ ut_ad(!m_latch_ex);
+
+ m_latch_ex= true;
log_write_and_flush_prepare();
- do_write();
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
- mysql_mutex_assert_owner(&log_sys.mutex);
+ size_t size= m_log.size() + 5;
+
+ if (log_sys.is_encrypted())
+ {
+ /* We will not encrypt any FILE_ records, but we will reserve
+ a nonce at the end. */
+ size+= 8;
+ m_commit_lsn= log_sys.get_lsn();
+ }
+ else
+ m_commit_lsn= 0;
+
+ m_crc= 0;
+ m_log.for_each_block([this](const mtr_buf_t::block_t *b)
+ { m_crc= my_crc32c(m_crc, b->begin(), b->used()); return true; });
+ finish_write(size);
if (!name && space.max_lsn)
{
@@ -363,6 +645,9 @@ bool mtr_t::commit_file(fil_space_t &space, const char *name)
/* Durably write the log for the file system operation. */
log_write_and_flush();
+ log_sys.latch.wr_unlock();
+ m_latch_ex= false;
+
char *old_name= space.chain.start->name;
bool success;
@@ -411,47 +696,66 @@ bool mtr_t::commit_file(fil_space_t &space, const char *name)
mysql_mutex_unlock(&buf_pool.flush_list_mutex);
release_resources();
- srv_stats.log_write_requests.inc();
return success;
}
/** Commit a mini-transaction that did not modify any pages,
but generated some redo log on a higher level, such as
FILE_MODIFY records and an optional FILE_CHECKPOINT marker.
-The caller must hold log_sys.mutex.
+The caller must hold exclusive log_sys.latch.
This is to be used at log_checkpoint().
-@param[in] checkpoint_lsn log checkpoint LSN, or 0 */
-void mtr_t::commit_files(lsn_t checkpoint_lsn)
+@param checkpoint_lsn the log sequence number of a checkpoint, or 0
+@return current LSN */
+lsn_t mtr_t::commit_files(lsn_t checkpoint_lsn)
{
- mysql_mutex_assert_owner(&log_sys.mutex);
- ut_ad(is_active());
- ut_ad(!is_inside_ibuf());
- ut_ad(m_log_mode == MTR_LOG_ALL);
- ut_ad(!m_made_dirty);
- ut_ad(!srv_read_only_mode);
- ut_ad(!m_freed_space);
- ut_ad(!m_freed_pages);
-
- if (checkpoint_lsn) {
- byte* ptr = m_log.push<byte*>(SIZE_OF_FILE_CHECKPOINT);
- compile_time_assert(SIZE_OF_FILE_CHECKPOINT == 3 + 8 + 1);
- *ptr = FILE_CHECKPOINT | (SIZE_OF_FILE_CHECKPOINT - 2);
- ::memset(ptr + 1, 0, 2);
- mach_write_to_8(ptr + 3, checkpoint_lsn);
- ptr[3 + 8] = 0;
- } else {
- *m_log.push<byte*>(1) = 0;
- }
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked());
+#endif
+ ut_ad(is_active());
+ ut_ad(!is_inside_ibuf());
+ ut_ad(m_log_mode == MTR_LOG_ALL);
+ ut_ad(!m_made_dirty);
+ ut_ad(m_memo.empty());
+ ut_ad(!srv_read_only_mode);
+ ut_ad(!m_freed_space);
+ ut_ad(!m_freed_pages);
+ ut_ad(!m_user_space);
+ ut_ad(!m_latch_ex);
- finish_write(m_log.size());
- srv_stats.log_write_requests.inc();
- release_resources();
+ m_latch_ex= true;
- if (checkpoint_lsn) {
- DBUG_PRINT("ib_log",
- ("FILE_CHECKPOINT(" LSN_PF ") written at " LSN_PF,
- checkpoint_lsn, log_sys.get_lsn()));
- }
+ if (checkpoint_lsn)
+ {
+ byte *ptr= m_log.push<byte*>(3 + 8);
+ *ptr= FILE_CHECKPOINT | (2 + 8);
+ ::memset(ptr + 1, 0, 2);
+ mach_write_to_8(ptr + 3, checkpoint_lsn);
+ }
+
+ size_t size= m_log.size() + 5;
+
+ if (log_sys.is_encrypted())
+ {
+ /* We will not encrypt any FILE_ records, but we will reserve
+ a nonce at the end. */
+ size+= 8;
+ m_commit_lsn= log_sys.get_lsn();
+ }
+ else
+ m_commit_lsn= 0;
+
+ m_crc= 0;
+ m_log.for_each_block([this](const mtr_buf_t::block_t *b)
+ { m_crc= my_crc32c(m_crc, b->begin(), b->used()); return true; });
+ finish_write(size);
+ release_resources();
+
+ if (checkpoint_lsn)
+ DBUG_PRINT("ib_log",
+ ("FILE_CHECKPOINT(" LSN_PF ") written at " LSN_PF,
+ checkpoint_lsn, m_commit_lsn));
+
+ return m_commit_lsn;
}
#ifdef UNIV_DEBUG
@@ -460,7 +764,7 @@ void mtr_t::commit_files(lsn_t checkpoint_lsn)
@param[in] space tablespace
@return whether the mini-transaction is associated with the space */
bool
-mtr_t::is_named_space(ulint space) const
+mtr_t::is_named_space(uint32_t space) const
{
ut_ad(!m_user_space || m_user_space->id != TRX_SYS_SPACE);
return !is_logged() || m_user_space_id == space ||
@@ -482,8 +786,7 @@ bool mtr_t::is_named_space(const fil_space_t* space) const
/** Acquire a tablespace X-latch.
@param[in] space_id tablespace ID
@return the tablespace object (never NULL) */
-fil_space_t*
-mtr_t::x_lock_space(ulint space_id)
+fil_space_t *mtr_t::x_lock_space(uint32_t space_id)
{
fil_space_t* space;
@@ -536,187 +839,118 @@ void mtr_t::release(const void *object)
{ return slot.object == &object; }) == m_memo.end());
}
-static bool log_margin_warned;
-static time_t log_margin_warn_time;
static time_t log_close_warn_time;
-/** Check margin not to overwrite transaction log from the last checkpoint.
-If would estimate the log write to exceed the log_capacity,
-waits for the checkpoint is done enough.
-@param len length of the data to be written */
-static void log_margin_checkpoint_age(ulint len)
+/** Display a warning that the log tail is overwriting the head,
+making the server crash-unsafe. */
+ATTRIBUTE_COLD static void log_overwrite_warning(lsn_t lsn)
{
- const ulint framing_size= log_sys.framing_size();
- /* actual length stored per block */
- const ulint len_per_blk= OS_FILE_LOG_BLOCK_SIZE - framing_size;
-
- /* actual data length in last block already written */
- ulint extra_len= log_sys.buf_free % OS_FILE_LOG_BLOCK_SIZE;
-
- ut_ad(extra_len >= LOG_BLOCK_HDR_SIZE);
- extra_len-= LOG_BLOCK_HDR_SIZE;
-
- /* total extra length for block header and trailer */
- extra_len= ((len + extra_len) / len_per_blk) * framing_size;
-
- const ulint margin= len + extra_len;
-
- mysql_mutex_assert_owner(&log_sys.mutex);
-
- const lsn_t lsn= log_sys.get_lsn();
-
- if (UNIV_UNLIKELY(margin > log_sys.log_capacity))
- {
- time_t t= time(nullptr);
-
- /* return with warning output to avoid deadlock */
- if (!log_margin_warned || difftime(t, log_margin_warn_time) > 15)
- {
- log_margin_warned= true;
- log_margin_warn_time= t;
+ if (log_sys.overwrite_warned)
+ return;
- sql_print_error("InnoDB: innodb_log_file_size is too small "
- "for mini-transaction size " ULINTPF, len);
- }
- }
- else if (UNIV_LIKELY(lsn + margin <= log_sys.last_checkpoint_lsn +
- log_sys.log_capacity))
+ time_t t= time(nullptr);
+ if (difftime(t, log_close_warn_time) < 15)
return;
- log_sys.set_check_flush_or_checkpoint();
+ if (!log_sys.overwrite_warned)
+ log_sys.overwrite_warned= lsn;
+ log_close_warn_time= t;
+
+ sql_print_error("InnoDB: Crash recovery is broken due to"
+ " insufficient innodb_log_file_size;"
+ " last checkpoint LSN=" LSN_PF ", current LSN=" LSN_PF
+ "%s.",
+ lsn_t{log_sys.last_checkpoint_lsn}, lsn,
+ srv_shutdown_state != SRV_SHUTDOWN_INITIATED
+ ? ". Shutdown is in progress" : "");
}
-
-/** Open the log for log_write_low(). The log must be closed with log_close().
-@param len length of the data to be written
-@return start lsn of the log record */
-static lsn_t log_reserve_and_open(size_t len)
+/** Wait in append_prepare() for buffer to become available
+@param ex whether log_sys.latch is exclusively locked */
+ATTRIBUTE_COLD void log_t::append_prepare_wait(bool ex) noexcept
{
- for (ut_d(ulint count= 0);;)
- {
- mysql_mutex_assert_owner(&log_sys.mutex);
-
- /* Calculate an upper limit for the space the string may take in
- the log buffer */
-
- size_t len_upper_limit= (4 * OS_FILE_LOG_BLOCK_SIZE) +
- srv_log_write_ahead_size + (5 * len) / 4;
-
- if (log_sys.buf_free + len_upper_limit <= srv_log_buffer_size)
- break;
-
- mysql_mutex_unlock(&log_sys.mutex);
- DEBUG_SYNC_C("log_buf_size_exceeded");
-
- /* Not enough free space, do a write of the log buffer */
- log_write_up_to(log_sys.get_lsn(), false);
+ log_sys.waits++;
+ log_sys.unlock_lsn();
- srv_stats.log_waits.inc();
+ if (ex)
+ log_sys.latch.wr_unlock();
+ else
+ log_sys.latch.rd_unlock();
- ut_ad(++count < 50);
+ DEBUG_SYNC_C("log_buf_size_exceeded");
+ log_buffer_flush_to_disk(log_sys.is_pmem());
- mysql_mutex_lock(&log_sys.mutex);
- }
+ if (ex)
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
+ else
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
- return log_sys.get_lsn();
+ log_sys.lock_lsn();
}
-/** Append data to the log buffer. */
-static void log_write_low(const void *str, size_t size)
+/** Reserve space in the log buffer for appending data.
+@tparam pmem log_sys.is_pmem()
+@param size total length of the data to append(), in bytes
+@param ex whether log_sys.latch is exclusively locked
+@return the start LSN and the buffer position for append() */
+template<bool pmem>
+inline
+std::pair<lsn_t,byte*> log_t::append_prepare(size_t size, bool ex) noexcept
{
- mysql_mutex_assert_owner(&log_sys.mutex);
- const ulint trailer_offset= log_sys.trailer_offset();
-
- do
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(latch.is_locked());
+# ifndef _WIN32 // there is no accurate is_write_locked() on SRWLOCK
+ ut_ad(ex == latch.is_write_locked());
+# endif
+#endif
+ ut_ad(pmem == is_pmem());
+ const lsn_t checkpoint_margin{last_checkpoint_lsn + log_capacity - size};
+ const size_t avail{(pmem ? size_t(capacity()) : buf_size) - size};
+ lock_lsn();
+ write_to_buf++;
+
+ for (ut_d(int count= 50);
+ UNIV_UNLIKELY((pmem
+ ? size_t(get_lsn() -
+ get_flushed_lsn(std::memory_order_relaxed))
+ : size_t{buf_free}) > avail); )
{
- /* Calculate a part length */
- size_t len= size;
- size_t data_len= (log_sys.buf_free % OS_FILE_LOG_BLOCK_SIZE) + size;
-
- if (data_len > trailer_offset)
- {
- data_len= trailer_offset;
- len= trailer_offset - log_sys.buf_free % OS_FILE_LOG_BLOCK_SIZE;
- }
-
- memcpy(log_sys.buf + log_sys.buf_free, str, len);
-
- size-= len;
- str= static_cast<const char*>(str) + len;
-
- byte *log_block= static_cast<byte*>(ut_align_down(log_sys.buf +
- log_sys.buf_free,
- OS_FILE_LOG_BLOCK_SIZE));
-
- log_block_set_data_len(log_block, data_len);
- lsn_t lsn= log_sys.get_lsn();
-
- if (data_len == trailer_offset)
- {
- /* This block became full */
- log_block_set_data_len(log_block, OS_FILE_LOG_BLOCK_SIZE);
- log_block_set_checkpoint_no(log_block, log_sys.next_checkpoint_no);
- len+= log_sys.framing_size();
- lsn+= len;
- /* Initialize the next block header */
- log_block_init(log_block + OS_FILE_LOG_BLOCK_SIZE, lsn);
- }
- else
- lsn+= len;
-
- log_sys.set_lsn(lsn);
- log_sys.buf_free+= len;
-
- ut_ad(log_sys.buf_free <= size_t{srv_log_buffer_size});
+ append_prepare_wait(ex);
+ ut_ad(count--);
}
- while (size);
+
+ const lsn_t l{lsn.load(std::memory_order_relaxed)};
+ lsn.store(l + size, std::memory_order_relaxed);
+ const size_t b{buf_free};
+ size_t new_buf_free{b};
+ new_buf_free+= size;
+ if (pmem && new_buf_free >= file_size)
+ new_buf_free-= size_t(capacity());
+ buf_free= new_buf_free;
+ unlock_lsn();
+
+ if (UNIV_UNLIKELY(l > checkpoint_margin) ||
+ (!pmem && b >= max_buf_free))
+ set_check_flush_or_checkpoint();
+
+ return {l, &buf[b]};
}
-/** Close the log at mini-transaction commit.
-@return whether buffer pool flushing is needed */
-static mtr_t::page_flush_ahead log_close(lsn_t lsn)
+/** Finish appending data to the log.
+@param lsn the end LSN of the log record
+@return whether buf_flush_ahead() will have to be invoked */
+static mtr_t::page_flush_ahead log_close(lsn_t lsn) noexcept
{
- mysql_mutex_assert_owner(&log_sys.mutex);
- ut_ad(lsn == log_sys.get_lsn());
-
- byte *log_block= static_cast<byte*>(ut_align_down(log_sys.buf +
- log_sys.buf_free,
- OS_FILE_LOG_BLOCK_SIZE));
-
- if (!log_block_get_first_rec_group(log_block))
- {
- /* We initialized a new log block which was not written
- full by the current mtr: the next mtr log record group
- will start within this block at the offset data_len */
- log_block_set_first_rec_group(log_block,
- log_block_get_data_len(log_block));
- }
-
- if (log_sys.buf_free > log_sys.max_buf_free)
- log_sys.set_check_flush_or_checkpoint();
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_locked());
+#endif
const lsn_t checkpoint_age= lsn - log_sys.last_checkpoint_lsn;
if (UNIV_UNLIKELY(checkpoint_age >= log_sys.log_capacity) &&
/* silence message on create_log_file() after the log had been deleted */
checkpoint_age != lsn)
- {
- time_t t= time(nullptr);
- if (!log_sys.overwrite_warned || difftime(t, log_close_warn_time) > 15)
- {
- if (!log_sys.overwrite_warned)
- log_sys.overwrite_warned= lsn;
- log_close_warn_time= t;
-
- sql_print_error("InnoDB: Crash recovery is broken due to"
- " insufficient innodb_log_file_size;"
- " last checkpoint LSN=" LSN_PF ", current LSN=" LSN_PF
- "%s.",
- lsn_t{log_sys.last_checkpoint_lsn}, lsn,
- srv_shutdown_state != SRV_SHUTDOWN_INITIATED
- ? ". Shutdown is in progress" : "");
- }
- }
+ log_overwrite_warning(lsn);
else if (UNIV_LIKELY(checkpoint_age <= log_sys.max_modified_age_async))
return mtr_t::PAGE_FLUSH_NO;
else if (UNIV_LIKELY(checkpoint_age <= log_sys.max_checkpoint_age))
@@ -769,25 +1003,14 @@ inline void mtr_t::page_checksum(const buf_page_t &bpage)
m_log.close(l + 4);
}
-/** Write the block contents to the REDO log */
-struct mtr_write_log
-{
- /** Append a block to the redo log buffer.
- @return whether the appending should continue */
- bool operator()(const mtr_buf_t::block_t *block) const
- {
- log_write_low(block->begin(), block->used());
- return true;
- }
-};
-
std::pair<lsn_t,mtr_t::page_flush_ahead> mtr_t::do_write()
{
ut_ad(!recv_no_log_write);
ut_ad(is_logged());
-
- ulint len= m_log.size();
- ut_ad(len);
+ ut_ad(m_log.size());
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(!m_latch_ex || log_sys.latch.is_write_locked());
+#endif
#ifndef DBUG_OFF
do
@@ -803,72 +1026,131 @@ std::pair<lsn_t,mtr_t::page_flush_ahead> mtr_t::do_write()
if (!b.is_freed())
page_checksum(b);
}
- len= m_log.size();
}
while (0);
#endif
- if (len > srv_log_buffer_size / 2)
- log_buffer_extend(ulong((len + 1) * 2));
+ size_t len= m_log.size() + 5;
+ ut_ad(len > 5);
- fil_space_t *space= m_user_space;
-
- if (space && is_predefined_tablespace(space->id))
- /* Omit FILE_MODIFY for predefined tablespaces. */
- space= nullptr;
-
- mysql_mutex_lock(&log_sys.mutex);
-
- if (fil_names_write_if_was_clean(space))
- len= m_log.size();
+ if (log_sys.is_encrypted())
+ {
+ len+= 8;
+ encrypt();
+ }
else
- /* This was not the first time of dirtying a
- tablespace since the latest checkpoint. */
- ut_ad(len == m_log.size());
-
- *m_log.push<byte*>(1)= 0;
- len++;
+ {
+ m_crc= 0;
+ m_commit_lsn= 0;
+ m_log.for_each_block([this](const mtr_buf_t::block_t *b)
+ { m_crc= my_crc32c(m_crc, b->begin(), b->used()); return true; });
+ }
- /* check and attempt a checkpoint if exceeding capacity */
- log_margin_checkpoint_age(len);
+ if (!m_latch_ex)
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
+ if (UNIV_UNLIKELY(m_user_space && !m_user_space->max_lsn &&
+ !is_predefined_tablespace(m_user_space->id)))
+ {
+ if (!m_latch_ex)
+ {
+ m_latch_ex= true;
+ log_sys.latch.rd_unlock();
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
+ if (UNIV_UNLIKELY(m_user_space->max_lsn != 0))
+ goto func_exit;
+ }
+ name_write();
+ }
+func_exit:
return finish_write(len);
}
-/** Append the redo log records to the redo log buffer.
+/** Write the mini-transaction log to the redo log buffer.
@param len number of bytes to write
@return {start_lsn,flush_ahead} */
-inline std::pair<lsn_t,mtr_t::page_flush_ahead> mtr_t::finish_write(ulint len)
+std::pair<lsn_t,mtr_t::page_flush_ahead>
+mtr_t::finish_write(size_t len)
{
- ut_ad(is_logged());
- mysql_mutex_assert_owner(&log_sys.mutex);
- ut_ad(m_log.size() == len);
- ut_ad(len > 0);
+ ut_ad(!recv_no_log_write);
+ ut_ad(is_logged());
+#ifndef SUX_LOCK_GENERIC
+# ifndef _WIN32 // there is no accurate is_write_locked() on SRWLOCK
+ ut_ad(m_latch_ex == log_sys.latch.is_write_locked());
+# endif
+#endif
- lsn_t start_lsn;
+ const size_t size{m_commit_lsn ? 5U + 8U : 5U};
+ std::pair<lsn_t, byte*> start;
- if (m_log.is_small()) {
- const mtr_buf_t::block_t* front = m_log.front();
- ut_ad(len <= front->used());
+ if (!log_sys.is_pmem())
+ {
+ start= log_sys.append_prepare<false>(len, m_latch_ex);
+ m_log.for_each_block([&start](const mtr_buf_t::block_t *b)
+ { log_sys.append(start.second, b->begin(), b->used()); return true; });
- m_commit_lsn = log_reserve_and_write_fast(front->begin(), len,
- &start_lsn);
+#ifdef HAVE_PMEM
+ write_trailer:
+#endif
+ *start.second++= log_sys.get_sequence_bit(start.first + len - size);
+ if (m_commit_lsn)
+ {
+ mach_write_to_8(start.second, m_commit_lsn);
+ m_crc= my_crc32c(m_crc, start.second, 8);
+ start.second+= 8;
+ }
+ mach_write_to_4(start.second, m_crc);
+ }
+#ifdef HAVE_PMEM
+ else
+ {
+ start= log_sys.append_prepare<true>(len, m_latch_ex);
+ if (UNIV_LIKELY(start.second + len <= &log_sys.buf[log_sys.file_size]))
+ {
+ m_log.for_each_block([&start](const mtr_buf_t::block_t *b)
+ { log_sys.append(start.second, b->begin(), b->used()); return true; });
+ goto write_trailer;
+ }
+ m_log.for_each_block([&start](const mtr_buf_t::block_t *b)
+ {
+ size_t size{b->used()};
+ const size_t size_left(&log_sys.buf[log_sys.file_size] - start.second);
+ const byte *src= b->begin();
+ if (size > size_left)
+ {
+ ::memcpy(start.second, src, size_left);
+ start.second= &log_sys.buf[log_sys.START_OFFSET];
+ src+= size_left;
+ size-= size_left;
+ }
+ ::memcpy(start.second, src, size);
+ start.second+= size;
+ return true;
+ });
+ const size_t size_left(&log_sys.buf[log_sys.file_size] - start.second);
+ if (size_left > size)
+ goto write_trailer;
- if (!m_commit_lsn) {
- goto piecewise;
- }
- } else {
-piecewise:
- /* Open the database log for log_write_low */
- start_lsn = log_reserve_and_open(len);
- mtr_write_log write_log;
- m_log.for_each_block(write_log);
- m_commit_lsn = log_sys.get_lsn();
- }
- page_flush_ahead flush= log_close(m_commit_lsn);
- DBUG_EXECUTE_IF("ib_log_flush_ahead", flush = PAGE_FLUSH_SYNC;);
+ byte tail[5 + 8];
+ tail[0]= log_sys.get_sequence_bit(start.first + len - size);
+
+ if (m_commit_lsn)
+ {
+ mach_write_to_8(tail + 1, m_commit_lsn);
+ m_crc= my_crc32c(m_crc, tail + 1, 8);
+ mach_write_to_4(tail + 9, m_crc);
+ }
+ else
+ mach_write_to_4(tail + 1, m_crc);
+
+ ::memcpy(start.second, tail, size_left);
+ ::memcpy(log_sys.buf + log_sys.START_OFFSET, tail + size_left,
+ size - size_left);
+ }
+#endif
- return std::make_pair(start_lsn, flush);
+ m_commit_lsn= start.first + len;
+ return {start.first, log_close(m_commit_lsn)};
}
bool mtr_t::have_x_latch(const buf_block_t &block) const
diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc
index 44783f72972..c7164ccc3ff 100644
--- a/storage/innobase/os/os0file.cc
+++ b/storage/innobase/os/os0file.cc
@@ -33,7 +33,6 @@ The interface to the operating system file i/o primitives
Created 10/21/1995 Heikki Tuuri
*******************************************************/
-#ifndef UNIV_INNOCHECKSUM
#include "os0file.h"
#include "sql_const.h"
#include "log.h"
@@ -41,6 +40,7 @@ Created 10/21/1995 Heikki Tuuri
#ifdef __linux__
# include <sys/types.h>
# include <sys/stat.h>
+# include <sys/sysmacros.h>
#endif
#include "srv0mon.h"
@@ -64,13 +64,6 @@ Created 10/21/1995 Heikki Tuuri
# include <linux/falloc.h>
#endif /* HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE */
-#if defined(__linux__) && defined(HAVE_SYS_IOCTL_H)
-# include <sys/ioctl.h>
-# ifndef DFS_IOCTL_ATOMIC_WRITE_SET
-# define DFS_IOCTL_ATOMIC_WRITE_SET _IOW(0x95, 2, uint)
-# endif
-#endif
-
#ifdef _WIN32
#include <winioctl.h>
#endif
@@ -168,7 +161,6 @@ extern uint page_zip_level;
#ifdef UNIV_PFS_IO
/* Keys to register InnoDB I/O with performance schema */
mysql_pfs_key_t innodb_data_file_key;
-mysql_pfs_key_t innodb_log_file_key;
mysql_pfs_key_t innodb_temp_file_key;
#endif
@@ -759,18 +751,15 @@ os_file_get_last_error_low(
}
if (report_all_errors
- || (err != ENOSPC && err != EEXIST && !on_error_silent)) {
+ || (err != ENOSPC && err != EEXIST && err != ENOENT
+ && !on_error_silent)) {
ib::error()
<< "Operating system error number "
<< err
<< " in a file operation.";
- if (err == ENOENT) {
- ib::error()
- << "The error means the system"
- " cannot find the path specified.";
- } else if (err == EACCES) {
+ if (err == EACCES) {
ib::error()
<< "The error means mariadbd does not have"
@@ -1051,7 +1040,15 @@ os_file_create_simple_func(
OS caching (O_DIRECT) here as we do in os_file_create_func(), so
we open the same file in the same mode, see man page of open(2). */
if (!srv_read_only_mode && *success) {
- os_file_set_nocache(file, name, mode_str);
+ switch (srv_file_flush_method) {
+ case SRV_O_DSYNC:
+ case SRV_O_DIRECT:
+ case SRV_O_DIRECT_NO_FSYNC:
+ os_file_set_nocache(file, name, mode_str);
+ break;
+ default:
+ break;
+ }
}
#ifndef _WIN32
@@ -1225,23 +1222,89 @@ os_file_create_func(
} while (retry);
- /* We disable OS caching (O_DIRECT) only on data files */
- if (!read_only
- && *success
- && type != OS_LOG_FILE
- && type != OS_DATA_FILE_NO_O_DIRECT) {
- os_file_set_nocache(file, name, mode_str);
+ if (!*success) {
+ return file;
}
+#if (defined __sun__ && defined DIRECTIO_ON) || defined O_DIRECT
+ if (type == OS_DATA_FILE) {
+ switch (srv_file_flush_method) {
+ case SRV_O_DSYNC:
+ case SRV_O_DIRECT:
+ case SRV_O_DIRECT_NO_FSYNC:
+# ifdef __linux__
+use_o_direct:
+# endif
+ os_file_set_nocache(file, name, mode_str);
+ break;
+ default:
+ break;
+ }
+ }
+# ifdef __linux__
+ else if (type == OS_LOG_FILE && !log_sys.is_opened()) {
+ struct stat st;
+ char b[20 + sizeof "/sys/dev/block/" ":"
+ "/../queue/physical_block_size"];
+ int f;
+ if (fstat(file, &st)) {
+ goto skip_o_direct;
+ }
+ MSAN_STAT_WORKAROUND(&st);
+ if (snprintf(b, sizeof b,
+ "/sys/dev/block/%u:%u/queue/physical_block_size",
+ major(st.st_dev), minor(st.st_dev))
+ >= static_cast<int>(sizeof b)) {
+ goto skip_o_direct;
+ }
+ if ((f = open(b, O_RDONLY)) == -1) {
+ if (snprintf(b, sizeof b,
+ "/sys/dev/block/%u:%u/../queue/"
+ "physical_block_size",
+ major(st.st_dev), minor(st.st_dev))
+ >= static_cast<int>(sizeof b)) {
+ goto skip_o_direct;
+ }
+ f = open(b, O_RDONLY);
+ }
+ if (f != -1) {
+ ssize_t l = read(f, b, sizeof b);
+ unsigned long s = 0;
+
+ if (l > 0 && static_cast<size_t>(l) < sizeof b
+ && b[l - 1] == '\n') {
+ char* end = b;
+ s = strtoul(b, &end, 10);
+ if (b == end || *end != '\n') {
+ s = 0;
+ }
+ }
+ close(f);
+ if (s > 4096 || s < 64 || !ut_is_2pow(s)) {
+ goto skip_o_direct;
+ }
+ log_sys.log_maybe_unbuffered= true;
+ log_sys.set_block_size(uint32_t(s));
+ if (!log_sys.log_buffered && !(st.st_size & (s - 1))) {
+ goto use_o_direct;
+ }
+ } else {
+skip_o_direct:
+ log_sys.log_maybe_unbuffered= false;
+ log_sys.log_buffered= true;
+ log_sys.set_block_size(512);
+ }
+ }
+# endif
+#endif
+
#ifndef _WIN32
if (!read_only
- && *success
&& create_mode != OS_FILE_OPEN_RAW
&& !my_disable_locking
&& os_file_lock(file, name)) {
if (create_mode == OS_FILE_OPEN_RETRY) {
-
ib::info()
<< "Retrying to lock the first data file";
@@ -1760,29 +1823,26 @@ os_file_get_last_error_low(
if (report_all_errors
|| (!on_error_silent
&& err != ERROR_DISK_FULL
+ && err != ERROR_FILE_NOT_FOUND
&& err != ERROR_FILE_EXISTS)) {
ib::error()
<< "Operating system error number " << err
<< " in a file operation.";
- if (err == ERROR_PATH_NOT_FOUND) {
- ib::error()
- << "The error means the system"
- " cannot find the path specified.";
-
- } else if (err == ERROR_ACCESS_DENIED) {
-
+ switch (err) {
+ case ERROR_PATH_NOT_FOUND:
+ break;
+ case ERROR_ACCESS_DENIED:
ib::error()
<< "The error means mariadbd does not have"
" the access rights to"
" the directory. It may also be"
" you have created a subdirectory"
" of the same name as a data file.";
-
- } else if (err == ERROR_SHARING_VIOLATION
- || err == ERROR_LOCK_VIOLATION) {
-
+ break;
+ case ERROR_SHARING_VIOLATION:
+ case ERROR_LOCK_VIOLATION:
ib::error()
<< "The error means that another program"
" is using InnoDB's files."
@@ -1790,29 +1850,23 @@ os_file_get_last_error_low(
" software or another instance"
" of MariaDB."
" Please close it to get rid of this error.";
-
- } else if (err == ERROR_WORKING_SET_QUOTA
- || err == ERROR_NO_SYSTEM_RESOURCES) {
-
+ break;
+ case ERROR_WORKING_SET_QUOTA:
+ case ERROR_NO_SYSTEM_RESOURCES:
ib::error()
<< "The error means that there are no"
" sufficient system resources or quota to"
" complete the operation.";
-
- } else if (err == ERROR_OPERATION_ABORTED) {
-
+ break;
+ case ERROR_OPERATION_ABORTED:
ib::error()
<< "The error means that the I/O"
" operation has been aborted"
" because of either a thread exit"
" or an application request."
" Retry attempt is made.";
- } else if (err == ERROR_PATH_NOT_FOUND) {
- ib::error()
- << "This error means that directory did not exist"
- " during file creation.";
- } else {
-
+ break;
+ default:
ib::info() << OPERATING_SYSTEM_ERROR_MSG;
}
}
@@ -1996,32 +2050,20 @@ os_file_create_directory(
return(true);
}
-/** Check that IO of specific size is possible for the file
-opened with FILE_FLAG_NO_BUFFERING.
-
-The requirement is that IO is multiple of the disk sector size.
-
-@param[in] file file handle
-@param[in] io_size expected io size
-@return true - unbuffered io of requested size is possible, false otherwise.
-
-@note: this function only works correctly with Windows 8 or later,
-(GetFileInformationByHandleEx with FileStorageInfo is only supported there).
-It will return true on earlier Windows version.
- */
-static bool unbuffered_io_possible(HANDLE file, size_t io_size)
+/** Get disk sector size for a file. */
+static size_t get_sector_size(HANDLE file)
{
- FILE_STORAGE_INFO info;
- if (GetFileInformationByHandleEx(
- file, FileStorageInfo, &info, sizeof(info))) {
- ULONG sector_size = info.LogicalBytesPerSector;
- if (sector_size)
- return io_size % sector_size == 0;
- }
- return true;
+ FILE_STORAGE_INFO fsi;
+ ULONG s= 4096;
+ if (GetFileInformationByHandleEx(file, FileStorageInfo, &fsi, sizeof fsi))
+ {
+ s= fsi.PhysicalBytesPerSectorForPerformance;
+ if (s > 4096 || s < 64 || !ut_is_2pow(s))
+ return 4096;
+ }
+ return s;
}
-
/** NOTE! Use the corresponding macro os_file_create(), not directly
this function!
Opens an existing file or creates a new.
@@ -2111,83 +2153,29 @@ os_file_create_func(
return(OS_FILE_CLOSED);
}
- DWORD attributes = 0;
-
- if (purpose == OS_FILE_AIO) {
-
-#ifdef WIN_ASYNC_IO
- /* If specified, use asynchronous (overlapped) io and no
- buffering of writes in the OS */
-
- if (srv_use_native_aio) {
- attributes |= FILE_FLAG_OVERLAPPED;
- }
-#endif /* WIN_ASYNC_IO */
-
- } else if (purpose == OS_FILE_NORMAL) {
-
- /* Use default setting. */
-
- } else {
-
- ib::error()
- << "Unknown purpose flag (" << purpose << ") "
- << "while opening file '" << name << "'";
-
- return(OS_FILE_CLOSED);
- }
+ DWORD attributes = (purpose == OS_FILE_AIO && srv_use_native_aio)
+ ? FILE_FLAG_OVERLAPPED : 0;
if (type == OS_LOG_FILE) {
- /* There is not reason to use buffered write to logs.*/
- attributes |= FILE_FLAG_NO_BUFFERING;
+ if (!log_sys.is_opened() && !log_sys.log_buffered) {
+ attributes|= FILE_FLAG_NO_BUFFERING;
+ }
+ if (srv_file_flush_method == SRV_O_DSYNC)
+ attributes|= FILE_FLAG_WRITE_THROUGH;
}
-
- switch (srv_file_flush_method)
+ else if (type == OS_DATA_FILE)
{
- case SRV_O_DSYNC:
- if (type == OS_LOG_FILE) {
- /* Map O_DSYNC to FILE_WRITE_THROUGH */
- attributes |= FILE_FLAG_WRITE_THROUGH;
- }
- break;
-
- case SRV_O_DIRECT_NO_FSYNC:
- case SRV_O_DIRECT:
- if (type != OS_DATA_FILE) {
+ switch (srv_file_flush_method)
+ {
+ case SRV_FSYNC:
+ case SRV_LITTLESYNC:
+ case SRV_NOSYNC:
break;
+ default:
+ attributes|= FILE_FLAG_NO_BUFFERING;
}
- /* fall through */
- case SRV_ALL_O_DIRECT_FSYNC:
- /*Traditional Windows behavior, no buffering for any files.*/
- if (type != OS_DATA_FILE_NO_O_DIRECT) {
- attributes |= FILE_FLAG_NO_BUFFERING;
- }
- break;
-
- case SRV_FSYNC:
- case SRV_LITTLESYNC:
- break;
-
- case SRV_NOSYNC:
- /* Let Windows cache manager handle all writes.*/
- attributes &= ~(FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING);
- break;
-
- default:
- ut_a(false); /* unknown flush mode.*/
}
-
- // TODO: Create a bug, this looks wrong. The flush log
- // parameter is dynamic.
- if (type == OS_LOG_FILE && srv_flush_log_at_trx_commit == 2) {
- /* Do not use unbuffered i/o for the log files because
- value 2 denotes that we do not flush the log at every
- commit, but only once per second */
- attributes &= ~(FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING);
- }
-
-
DWORD access = GENERIC_READ;
if (!read_only) {
@@ -2202,19 +2190,22 @@ os_file_create_func(
name, access, share_mode, my_win_file_secattr(),
create_flag, attributes, NULL);
- /* If FILE_FLAG_NO_BUFFERING was set, check if this can work at all,
- for expected IO sizes. Reopen without the unbuffered flag, if it is won't work*/
- if ((file != INVALID_HANDLE_VALUE)
- && (attributes & FILE_FLAG_NO_BUFFERING)
- && (type == OS_LOG_FILE)
- && !unbuffered_io_possible(file, OS_FILE_LOG_BLOCK_SIZE)) {
- ut_a(CloseHandle(file));
- attributes &= ~FILE_FLAG_NO_BUFFERING;
- create_flag = OPEN_ALWAYS;
- continue;
+ *success = file != INVALID_HANDLE_VALUE;
+
+ if (*success && type == OS_LOG_FILE) {
+ uint32_t s = uint32_t(get_sector_size(file));
+ log_sys.set_block_size(s);
+ if (attributes & FILE_FLAG_NO_BUFFERING) {
+ if (os_file_get_size(file) % s) {
+ attributes &= ~FILE_FLAG_NO_BUFFERING;
+ create_flag = OPEN_ALWAYS;
+ CloseHandle(file);
+ continue;
+ }
+ log_sys.log_buffered = false;
+ }
}
- *success = (file != INVALID_HANDLE_VALUE);
if (*success) {
break;
}
@@ -2371,16 +2362,15 @@ os_file_delete_if_exists_func(
return(true);
}
- DWORD lasterr = GetLastError();
-
- if (lasterr == ERROR_FILE_NOT_FOUND
- || lasterr == ERROR_PATH_NOT_FOUND) {
-
+ switch (GetLastError()) {
+ case ERROR_FILE_NOT_FOUND:
+ case ERROR_PATH_NOT_FOUND:
/* the file does not exist, this not an error */
if (exist != NULL) {
*exist = false;
}
-
+ /* fall through */
+ case ERROR_ACCESS_DENIED:
return(true);
}
@@ -2510,18 +2500,12 @@ bool os_file_close_func(os_file_t file)
/** Gets a file size.
@param[in] file Handle to a file
@return file size, or (os_offset_t) -1 on failure */
-os_offset_t
-os_file_get_size(
- os_file_t file)
+os_offset_t os_file_get_size(os_file_t file)
{
- DWORD high;
- DWORD low = GetFileSize(file, &high);
-
- if (low == 0xFFFFFFFF && GetLastError() != NO_ERROR) {
- return((os_offset_t) -1);
- }
-
- return(os_offset_t(low | (os_offset_t(high) << 32)));
+ LARGE_INTEGER li;
+ if (GetFileSizeEx(file, &li))
+ return li.QuadPart;
+ return ((os_offset_t) -1);
}
/** Gets a file size.
@@ -3018,9 +3002,14 @@ os_file_handle_error_cond_exit(
case OS_FILE_PATH_ERROR:
case OS_FILE_ALREADY_EXISTS:
case OS_FILE_ACCESS_VIOLATION:
-
return(false);
+ case OS_FILE_NOT_FOUND:
+ if (!on_error_silent) {
+ sql_print_error("InnoDB: File %s was not found", name);
+ }
+ return false;
+
case OS_FILE_SHARING_VIOLATION:
std::this_thread::sleep_for(std::chrono::seconds(10));
@@ -3067,15 +3056,6 @@ os_file_set_nocache(
const char* file_name MY_ATTRIBUTE((unused)),
const char* operation_name MY_ATTRIBUTE((unused)))
{
- const auto innodb_flush_method = srv_file_flush_method;
- switch (innodb_flush_method) {
- case SRV_O_DIRECT:
- case SRV_O_DIRECT_NO_FSYNC:
- break;
- default:
- return;
- }
-
/* some versions of Solaris may not have DIRECTIO_ON */
#if defined(__sun__) && defined(DIRECTIO_ON)
if (directio(fd, DIRECTIO_ON) == -1) {
@@ -3707,8 +3687,9 @@ void os_aio_wait_until_no_pending_reads()
dberr_t os_aio(const IORequest &type, void *buf, os_offset_t offset, size_t n)
{
ut_ad(n > 0);
- ut_ad((n % OS_FILE_LOG_BLOCK_SIZE) == 0);
- ut_ad((offset % OS_FILE_LOG_BLOCK_SIZE) == 0);
+ ut_ad(!(n & 511)); /* payload of page_compressed tables */
+ ut_ad((offset % UNIV_ZIP_SIZE_MIN) == 0);
+ ut_ad((reinterpret_cast<size_t>(buf) % UNIV_ZIP_SIZE_MIN) == 0);
ut_ad(type.is_read() || type.is_write());
ut_ad(type.node);
ut_ad(type.node->is_open());
@@ -3760,11 +3741,6 @@ func_exit:
cb->m_opcode = type.is_read() ? tpool::aio_opcode::AIO_PREAD : tpool::aio_opcode::AIO_PWRITE;
new (cb->m_userdata) IORequest{type};
- ut_a(reinterpret_cast<size_t>(cb->m_buffer) % OS_FILE_LOG_BLOCK_SIZE
- == 0);
- ut_a(cb->m_len % OS_FILE_LOG_BLOCK_SIZE == 0);
- ut_a(cb->m_offset % OS_FILE_LOG_BLOCK_SIZE == 0);
-
if (srv_thread_pool->submit_io(cb)) {
slots->release(cb);
os_file_handle_error(type.node->name, type.is_read()
@@ -3787,10 +3763,8 @@ os_aio_print(FILE* file)
time_elapsed = 0.001 + difftime(current_time, os_last_printout);
fprintf(file,
- "Pending flushes (fsync) log: " ULINTPF
- "; buffer pool: " ULINTPF "\n"
+ "Pending flushes (fsync): " ULINTPF "\n"
ULINTPF " OS file reads, %zu OS file writes, %zu OS fsyncs\n",
- log_sys.get_pending_flushes(),
ulint{fil_n_pending_tablespace_flushes},
ulint{os_n_file_reads},
static_cast<size_t>(os_n_file_writes),
@@ -4105,14 +4079,14 @@ corrupted:
FSP_HEADER_OFFSET + FSP_SPACE_ID + page, 4)
? ULINT_UNDEFINED
: mach_read_from_4(FIL_PAGE_SPACE_ID + page);
- ulint flags= fsp_header_get_flags(page);
+ uint32_t flags= fsp_header_get_flags(page);
const uint32_t size= fsp_header_get_field(page, FSP_SIZE);
const uint32_t free_limit= fsp_header_get_field(page, FSP_FREE_LIMIT);
const uint32_t free_len= flst_get_len(FSP_HEADER_OFFSET + FSP_FREE + page);
if (!fil_space_t::is_valid_flags(flags, space->id))
{
- ulint cflags= fsp_flags_convert_from_101(flags);
- if (cflags == ULINT_UNDEFINED)
+ uint32_t cflags= fsp_flags_convert_from_101(flags);
+ if (cflags == UINT32_MAX)
{
invalid:
ib::error() << "Expected tablespace flags "
@@ -4122,8 +4096,8 @@ invalid:
goto corrupted;
}
- ulint cf= cflags & ~FSP_FLAGS_MEM_MASK;
- ulint sf= space->flags & ~FSP_FLAGS_MEM_MASK;
+ uint32_t cf= cflags & ~FSP_FLAGS_MEM_MASK;
+ uint32_t sf= space->flags & ~FSP_FLAGS_MEM_MASK;
if (!fil_space_t::is_flags_equal(cf, sf) &&
!fil_space_t::is_flags_equal(sf, cf))
@@ -4169,5 +4143,3 @@ invalid:
space->set_sizes(this->size);
return true;
}
-
-#endif /* !UNIV_INNOCHECKSUM */
diff --git a/storage/innobase/page/page0cur.cc b/storage/innobase/page/page0cur.cc
index f83b4d774b1..b019694b9f6 100644
--- a/storage/innobase/page/page0cur.cc
+++ b/storage/innobase/page/page0cur.cc
@@ -84,7 +84,8 @@ page_cur_try_search_shortcut(
low_match = up_match = std::min(*ilow_matched_fields,
*iup_matched_fields);
- if (cmp_dtuple_rec_with_match(tuple, rec, offsets, &low_match) < 0) {
+ if (cmp_dtuple_rec_with_match(tuple, rec, index, offsets,
+ &low_match) < 0) {
goto exit_func;
}
@@ -97,7 +98,7 @@ page_cur_try_search_shortcut(
index->n_core_fields,
dtuple_get_n_fields(tuple), &heap);
- if (cmp_dtuple_rec_with_match(tuple, next_rec, offsets,
+ if (cmp_dtuple_rec_with_match(tuple, next_rec, index, offsets,
&up_match) >= 0) {
goto exit_func;
}
@@ -404,7 +405,7 @@ page_cur_search_with_match(
dtuple_get_n_fields_cmp(tuple), &heap);
cmp = cmp_dtuple_rec_with_match(
- tuple, mid_rec, offsets, &cur_matched_fields);
+ tuple, mid_rec, index, offsets, &cur_matched_fields);
if (cmp > 0) {
low_slot_match:
@@ -470,7 +471,7 @@ corrupted:
dtuple_get_n_fields_cmp(tuple), &heap);
cmp = cmp_dtuple_rec_with_match(
- tuple, mid_rec, offsets, &cur_matched_fields);
+ tuple, mid_rec, index, offsets, &cur_matched_fields);
if (cmp > 0) {
low_rec_match:
diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc
index 21b291e3a8b..258d47a5451 100644
--- a/storage/innobase/page/page0page.cc
+++ b/storage/innobase/page/page0page.cc
@@ -2488,7 +2488,7 @@ page_find_rec_with_heap_no(
@param[in] page index tree leaf page
@return the last record, not delete-marked
@retval infimum record if all records are delete-marked */
-const rec_t *page_find_rec_max_not_deleted(const page_t *page)
+const rec_t *page_find_rec_last_not_deleted(const page_t *page)
{
ut_ad(page_is_leaf(page));
diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc
index eda7140f7db..ba1bb24b43b 100644
--- a/storage/innobase/page/page0zip.cc
+++ b/storage/innobase/page/page0zip.cc
@@ -29,7 +29,6 @@ Created June 2005 by Marko Makela
#include "fsp0types.h"
#include "page0page.h"
#include "buf0checksum.h"
-#include "ut0crc32.h"
#include "zlib.h"
#include "span.h"
@@ -4599,11 +4598,11 @@ uint32_t page_zip_calc_checksum(const void *data, size_t size, bool use_adler)
ut_ad(size > FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
if (!use_adler) {
- return ut_crc32(s + FIL_PAGE_OFFSET,
- FIL_PAGE_LSN - FIL_PAGE_OFFSET)
- ^ ut_crc32(s + FIL_PAGE_TYPE, 2)
- ^ ut_crc32(s + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,
- size - FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
+ return my_crc32c(0, s + FIL_PAGE_OFFSET,
+ FIL_PAGE_LSN - FIL_PAGE_OFFSET)
+ ^ my_crc32c(0, s + FIL_PAGE_TYPE, 2)
+ ^ my_crc32c(0, s + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,
+ size - FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
} else {
adler = adler32(0L, s + FIL_PAGE_OFFSET,
FIL_PAGE_LSN - FIL_PAGE_OFFSET);
diff --git a/storage/innobase/pars/pars0opt.cc b/storage/innobase/pars/pars0opt.cc
index f3b71132998..44949ad0dda 100644
--- a/storage/innobase/pars/pars0opt.cc
+++ b/storage/innobase/pars/pars0opt.cc
@@ -356,6 +356,11 @@ opt_calc_index_goodness(
n_fields = dict_index_get_n_unique_in_tree(index);
for (j = 0; j < n_fields; j++) {
+ if (UNIV_UNLIKELY(index->fields[j].descending)) {
+ /* The internal InnoDB SQL parser does not
+ work with indexes that use DESC order. */
+ return 0;
+ }
col_no = dict_index_get_nth_col_no(index, j);
diff --git a/storage/innobase/rem/rem0cmp.cc b/storage/innobase/rem/rem0cmp.cc
index 7fb6fdac1ba..c2b2bc7120d 100644
--- a/storage/innobase/rem/rem0cmp.cc
+++ b/storage/innobase/rem/rem0cmp.cc
@@ -190,61 +190,68 @@ cmp_decimal(const byte* a, ulint a_length, const byte* b, ulint b_length)
}
/** Compare two data fields.
-@param mtype main type
-@param prtype precise type
-@param data1 data field
-@param len1 length of data1 in bytes, or UNIV_SQL_NULL
-@param data2 data field
-@param len2 length of data2 in bytes, or UNIV_SQL_NULL
+@param mtype main type
+@param prtype precise type
+@param descending whether to use descending order
+@param data1 data field
+@param len1 length of data1 in bytes, or UNIV_SQL_NULL
+@param data2 data field
+@param len2 length of data2 in bytes, or UNIV_SQL_NULL
@return the comparison result of data1 and data2
@retval 0 if data1 is equal to data2
@retval negative if data1 is less than data2
@retval positive if data1 is greater than data2 */
-static int cmp_data(ulint mtype, ulint prtype, const byte *data1, ulint len1,
- const byte *data2, ulint len2)
+int cmp_data(ulint mtype, ulint prtype, bool descending,
+ const byte *data1, size_t len1, const byte *data2, size_t len2)
{
ut_ad(len1 != UNIV_SQL_DEFAULT);
ut_ad(len2 != UNIV_SQL_DEFAULT);
+ int cmp= 0;
+
if (len1 == UNIV_SQL_NULL || len2 == UNIV_SQL_NULL)
{
if (len1 == len2)
return 0;
/* We define the SQL null to be the smallest possible value of a field. */
- return len1 == UNIV_SQL_NULL ? -1 : 1;
+ cmp= len1 == UNIV_SQL_NULL ? -1 : 1;
+ func_exit:
+ return UNIV_UNLIKELY(descending) ? -cmp : cmp;
}
switch (mtype) {
default:
ib::fatal() << "Unknown data type number " << mtype;
case DATA_DECIMAL:
- return cmp_decimal(data1, len1, data2, len2);
+ cmp= cmp_decimal(data1, len1, data2, len2);
+ goto func_exit;
case DATA_DOUBLE:
{
const double af= mach_double_read(data1), bf= mach_double_read(data2);
- return af > bf ? 1 : bf > af ? -1 : 0;
+ cmp= af > bf ? 1 : bf > af ? -1 : 0;
}
+ goto func_exit;
case DATA_FLOAT:
{
const float af= mach_float_read(data1), bf= mach_float_read(data2);
- return af > bf ? 1 : bf > af ? -1 : 0;
+ cmp= af > bf ? 1 : bf > af ? -1 : 0;
}
+ goto func_exit;
case DATA_FIXBINARY:
case DATA_BINARY:
if (dtype_get_charset_coll(prtype) != DATA_MYSQL_BINARY_CHARSET_COLL)
{
if (ulint len= std::min(len1, len2))
{
- if (int cmp= memcmp(data1, data2, len))
- return cmp;
+ cmp= memcmp(data1, data2, len);
+ if (cmp)
+ goto func_exit;
data1+= len;
data2+= len;
len1-= len;
len2-= len;
}
-
- int cmp= 0;
if (len1)
{
const byte *end= &data1[len1];
@@ -259,7 +266,7 @@ static int cmp_data(ulint mtype, ulint prtype, const byte *data1, ulint len1,
cmp= static_cast<int>(byte{0x20} - *data2++);
while (cmp == 0 && data2 < end);
}
- return cmp;
+ goto func_exit;
}
/* fall through */
case DATA_INT:
@@ -272,7 +279,8 @@ static int cmp_data(ulint mtype, ulint prtype, const byte *data1, ulint len1,
{
ut_ad(len1 == DATA_MBR_LEN);
ut_ad(len2 == DATA_MBR_LEN);
- return cmp_geometry_field(data1, data2);
+ cmp= cmp_geometry_field(data1, data2);
+ goto func_exit;
}
break;
case DATA_BLOB:
@@ -282,14 +290,20 @@ static int cmp_data(ulint mtype, ulint prtype, const byte *data1, ulint len1,
case DATA_VARMYSQL:
DBUG_ASSERT(is_strnncoll_compatible(prtype & DATA_MYSQL_TYPE_MASK));
if (CHARSET_INFO *cs= all_charsets[dtype_get_charset_coll(prtype)])
- return cs->coll->strnncollsp(cs, data1, len1, data2, len2);
+ {
+ cmp= cs->coll->strnncollsp(cs, data1, len1, data2, len2);
+ goto func_exit;
+ }
no_collation:
ib::fatal() << "Unable to find charset-collation for " << prtype;
case DATA_MYSQL:
DBUG_ASSERT(is_strnncoll_compatible(prtype & DATA_MYSQL_TYPE_MASK));
if (CHARSET_INFO *cs= all_charsets[dtype_get_charset_coll(prtype)])
- return cs->coll->strnncollsp_nchars(cs, data1, len1, data2, len2,
- std::max(len1, len2));
+ {
+ cmp= cs->coll->strnncollsp_nchars(cs, data1, len1, data2, len2,
+ std::max(len1, len2));
+ goto func_exit;
+ }
goto no_collation;
case DATA_VARCHAR:
case DATA_CHAR:
@@ -297,62 +311,42 @@ static int cmp_data(ulint mtype, ulint prtype, const byte *data1, ulint len1,
Because it is a fixed-length encoding (mbminlen=mbmaxlen=1),
non-NULL CHAR(n) values will always occupy n bytes and we
can invoke strnncollsp() instead of strnncollsp_nchars(). */
- return my_charset_latin1.strnncollsp(data1, len1, data2, len2);
+ cmp= my_charset_latin1.strnncollsp(data1, len1, data2, len2);
+ goto func_exit;
}
if (ulint len= std::min(len1, len2))
- if (int cmp= memcmp(data1, data2, len))
- return cmp;
+ {
+ cmp= memcmp(data1, data2, len);
+ if (cmp)
+ goto func_exit;
+ }
- return len1 > len2 ? 1 : len2 > len1 ? -1 : 0;
-}
-
-/** Compare two data fields.
-@param[in] mtype main type
-@param[in] prtype precise type
-@param[in] data1 data field
-@param[in] len1 length of data1 in bytes, or UNIV_SQL_NULL
-@param[in] data2 data field
-@param[in] len2 length of data2 in bytes, or UNIV_SQL_NULL
-@return the comparison result of data1 and data2
-@retval 0 if data1 is equal to data2
-@retval negative if data1 is less than data2
-@retval positive if data1 is greater than data2 */
-int
-cmp_data_data(
- ulint mtype,
- ulint prtype,
- const byte* data1,
- ulint len1,
- const byte* data2,
- ulint len2)
-{
- return(cmp_data(mtype, prtype, data1, len1, data2, len2));
+ cmp= int(len1 - len2);
+ goto func_exit;
}
/** Compare a data tuple to a physical record.
-@param[in] dtuple data tuple
-@param[in] rec B-tree record
-@param[in] offsets rec_get_offsets(rec)
-@param[in] n_cmp number of fields to compare
-@param[in,out] matched_fields number of completely matched fields
+@param dtuple data tuple
+@param rec B-tree index record
+@param index B-tree index
+@param offsets rec_get_offsets(rec,index)
+@param n_cmp number of fields to compare
+@param matched_fields number of completely matched fields
@return the comparison result of dtuple and rec
@retval 0 if dtuple is equal to rec
@retval negative if dtuple is less than rec
@retval positive if dtuple is greater than rec */
-int
-cmp_dtuple_rec_with_match_low(
- const dtuple_t* dtuple,
- const rec_t* rec,
- const rec_offs* offsets,
- ulint n_cmp,
- ulint* matched_fields)
+int cmp_dtuple_rec_with_match_low(const dtuple_t *dtuple, const rec_t *rec,
+ const dict_index_t *index,
+ const rec_offs *offsets,
+ ulint n_cmp, ulint *matched_fields)
{
ulint cur_field; /* current field number */
- int ret; /* return value */
+ int ret = 0; /* return value */
ut_ad(dtuple_check_typed(dtuple));
- ut_ad(rec_offs_validate(rec, NULL, offsets));
+ ut_ad(rec_offs_validate(rec, index, offsets));
cur_field = *matched_fields;
@@ -366,6 +360,7 @@ cmp_dtuple_rec_with_match_low(
rec_offs_comp(offsets));
ulint tup_info = dtuple_get_info_bits(dtuple);
+ /* The "infimum node pointer" is always first. */
if (UNIV_UNLIKELY(rec_info & REC_INFO_MIN_REC_FLAG)) {
ret = !(tup_info & REC_INFO_MIN_REC_FLAG);
goto order_resolved;
@@ -406,7 +401,8 @@ cmp_dtuple_rec_with_match_low(
ut_ad(!dfield_is_ext(dtuple_field));
- ret = cmp_data(type->mtype, type->prtype,
+ ret = cmp_data(type->mtype, type->prtype, !index->is_ibuf()
+ && index->fields[cur_field].descending,
dtuple_b_ptr, dtuple_f_len,
rec_b_ptr, rec_f_len);
if (ret) {
@@ -414,8 +410,6 @@ cmp_dtuple_rec_with_match_low(
}
}
- ret = 0; /* If we ran out of fields, dtuple was equal to rec
- up to the common fields */
order_resolved:
*matched_fields = cur_field;
return(ret);
@@ -486,6 +480,7 @@ cmp_dtuple_rec_with_match_bytes(
ut_ad(rec_offs_validate(rec, index, offsets));
ut_ad(!(REC_INFO_MIN_REC_FLAG
& dtuple_get_info_bits(dtuple)));
+ ut_ad(!index->is_ibuf());
if (UNIV_UNLIKELY(REC_INFO_MIN_REC_FLAG
& rec_get_info_bits(rec, rec_offs_comp(offsets)))) {
@@ -498,7 +493,7 @@ cmp_dtuple_rec_with_match_bytes(
ulint cur_field = *matched_fields;
ulint cur_bytes = *matched_bytes;
ulint n_cmp = dtuple_get_n_fields_cmp(dtuple);
- int ret;
+ int ret = 0;
ut_ad(n_cmp <= dtuple_get_n_fields(dtuple));
ut_ad(cur_field <= n_cmp);
@@ -559,7 +554,7 @@ cmp_dtuple_rec_with_match_bytes(
}
/* fall through */
default:
- ret = cmp_data(type->mtype, type->prtype,
+ ret = cmp_data(type->mtype, type->prtype, false,
dtuple_b_ptr, dtuple_f_len,
rec_b_ptr, rec_f_len);
@@ -623,62 +618,29 @@ next_field:
ut_ad(cur_bytes == 0);
- ret = 0; /* If we ran out of fields, dtuple was equal to rec
- up to the common fields */
order_resolved:
*matched_fields = cur_field;
*matched_bytes = cur_bytes;
- return(ret);
-}
-
-/** Compare a data tuple to a physical record.
-@see cmp_dtuple_rec_with_match
-@param[in] dtuple data tuple
-@param[in] rec B-tree record
-@param[in] offsets rec_get_offsets(rec); may be NULL
-for ROW_FORMAT=REDUNDANT
-@return the comparison result of dtuple and rec
-@retval 0 if dtuple is equal to rec
-@retval negative if dtuple is less than rec
-@retval positive if dtuple is greater than rec */
-int
-cmp_dtuple_rec(
- const dtuple_t* dtuple,
- const rec_t* rec,
- const rec_offs* offsets)
-{
- ulint matched_fields = 0;
-
- ut_ad(rec_offs_validate(rec, NULL, offsets));
- return(cmp_dtuple_rec_with_match(dtuple, rec, offsets,
- &matched_fields));
+ return !ret || UNIV_LIKELY(!index->fields[cur_field].descending)
+ ? ret : -ret;
}
-/**************************************************************//**
-Checks if a dtuple is a prefix of a record. The last field in dtuple
-is allowed to be a prefix of the corresponding field in the record.
-@return TRUE if prefix */
-ibool
-cmp_dtuple_is_prefix_of_rec(
-/*========================*/
- const dtuple_t* dtuple, /*!< in: data tuple */
- const rec_t* rec, /*!< in: physical record */
- const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
+/** Check if a dtuple is a prefix of a record.
+@param dtuple data tuple
+@param rec index record
+@param index index
+@param offsets rec_get_offsets(rec)
+@return whether dtuple is a prefix of rec */
+bool cmp_dtuple_is_prefix_of_rec(const dtuple_t *dtuple, const rec_t *rec,
+ const dict_index_t *index,
+ const rec_offs *offsets)
{
- ulint n_fields;
- ulint matched_fields = 0;
-
- ut_ad(rec_offs_validate(rec, NULL, offsets));
- n_fields = dtuple_get_n_fields(dtuple);
-
- if (n_fields > rec_offs_n_fields(offsets)) {
- ut_ad(0);
- return(FALSE);
- }
-
- cmp_dtuple_rec_with_match(dtuple, rec, offsets, &matched_fields);
- return(matched_fields == n_fields);
+ ulint matched_fields= 0;
+ ulint n_fields= dtuple_get_n_fields(dtuple);
+ ut_ad(n_fields <= rec_offs_n_fields(offsets));
+ cmp_dtuple_rec_with_match(dtuple, rec, index, offsets, &matched_fields);
+ return matched_fields == n_fields;
}
/*************************************************************//**
@@ -701,7 +663,7 @@ cmp_rec_rec_simple_field(
const byte* rec2_b_ptr;
ulint rec1_f_len;
ulint rec2_f_len;
- const dict_col_t* col = dict_index_get_nth_col(index, n);
+ const dict_field_t* field = dict_index_get_nth_field(index, n);
ut_ad(!rec_offs_nth_extern(offsets1, n));
ut_ad(!rec_offs_nth_extern(offsets2, n));
@@ -709,8 +671,9 @@ cmp_rec_rec_simple_field(
rec1_b_ptr = rec_get_nth_field(rec1, offsets1, n, &rec1_f_len);
rec2_b_ptr = rec_get_nth_field(rec2, offsets2, n, &rec2_f_len);
- return(cmp_data(col->mtype, col->prtype,
- rec1_b_ptr, rec1_f_len, rec2_b_ptr, rec2_f_len));
+ return cmp_data(field->col->mtype, field->col->prtype,
+ field->descending,
+ rec1_b_ptr, rec1_f_len, rec2_b_ptr, rec2_f_len);
}
/** Compare two physical records that contain the same number of columns,
@@ -762,9 +725,12 @@ cmp_rec_rec_simple(
/* If we ran out of fields, the ordering columns of rec1 were
equal to rec2. Issue a duplicate key error if needed. */
- if (!null_eq && table && dict_index_is_unique(index)) {
- /* Report erroneous row using new version of table. */
- innobase_rec_to_mysql(table, rec1, index, offsets1);
+ if (!null_eq && index->is_unique()) {
+ if (table) {
+ /* Report erroneous row using new version
+ of table. */
+ innobase_rec_to_mysql(table, rec1, index, offsets1);
+ }
return(0);
}
@@ -868,16 +834,19 @@ cmp_rec_rec(
for (; cur_field < n_fields; cur_field++) {
ulint mtype;
ulint prtype;
+ bool descending;
if (UNIV_UNLIKELY(dict_index_is_ibuf(index))) {
/* This is for the insert buffer B-tree. */
mtype = DATA_BINARY;
prtype = 0;
+ descending = false;
} else {
- const dict_col_t* col = dict_index_get_nth_col(
+ const dict_field_t* field = dict_index_get_nth_field(
index, cur_field);
- mtype = col->mtype;
- prtype = col->prtype;
+ descending = field->descending;
+ mtype = field->col->mtype;
+ prtype = field->col->prtype;
if (UNIV_LIKELY(!dict_index_is_spatial(index))) {
} else if (cur_field == 0) {
@@ -913,9 +882,8 @@ cmp_rec_rec(
goto order_resolved;
}
- ret = cmp_data(mtype, prtype,
- rec1_b_ptr, rec1_f_len,
- rec2_b_ptr, rec2_f_len);
+ ret = cmp_data(mtype, prtype, descending,
+ rec1_b_ptr, rec1_f_len, rec2_b_ptr, rec2_f_len);
if (ret) {
goto order_resolved;
}
@@ -930,28 +898,3 @@ order_resolved:
}
return ret;
}
-
-#ifdef UNIV_COMPILE_TEST_FUNCS
-
-#ifdef HAVE_UT_CHRONO_T
-
-void
-test_cmp_data_data(ulint len)
-{
- int i;
- static byte zeros[64];
-
- if (len > sizeof zeros) {
- len = sizeof zeros;
- }
-
- ut_chrono_t ch(__func__);
-
- for (i = 1000000; i > 0; i--) {
- i += cmp_data(DATA_INT, 0, zeros, len, zeros, len);
- }
-}
-
-#endif /* HAVE_UT_CHRONO_T */
-
-#endif /* UNIV_COMPILE_TEST_FUNCS */
diff --git a/storage/innobase/row/row0ftsort.cc b/storage/innobase/row/row0ftsort.cc
index cc8844c3bd4..419a120c2af 100644
--- a/storage/innobase/row/row0ftsort.cc
+++ b/storage/innobase/row/row0ftsort.cc
@@ -96,6 +96,7 @@ row_merge_create_fts_sort_index(
field = dict_index_get_nth_field(new_index, 0);
field->name = NULL;
field->prefix_len = 0;
+ field->descending = false;
field->col = static_cast<dict_col_t*>(
mem_heap_zalloc(new_index->heap, sizeof(dict_col_t)));
field->col->prtype = idx_field->col->prtype | DATA_NOT_NULL;
@@ -112,6 +113,7 @@ row_merge_create_fts_sort_index(
field = dict_index_get_nth_field(new_index, 1);
field->name = NULL;
field->prefix_len = 0;
+ field->descending = false;
field->col = static_cast<dict_col_t*>(
mem_heap_zalloc(new_index->heap, sizeof(dict_col_t)));
field->col->mtype = DATA_INT;
@@ -151,6 +153,7 @@ row_merge_create_fts_sort_index(
field = dict_index_get_nth_field(new_index, 2);
field->name = NULL;
field->prefix_len = 0;
+ field->descending = false;
field->col = static_cast<dict_col_t*>(
mem_heap_zalloc(new_index->heap, sizeof(dict_col_t)));
field->col->mtype = DATA_INT;
@@ -188,7 +191,6 @@ row_fts_psort_info_init(
fts_psort_t* merge_info = NULL;
ulint block_size;
ibool ret = TRUE;
- bool encrypted = false;
ut_ad(ut_is_2pow(old_zip_size));
block_size = 3 * srv_sort_buf_size;
@@ -219,10 +221,6 @@ row_fts_psort_info_init(
pthread_cond_init(&common_info->sort_cond, nullptr);
common_info->opt_doc_id_size = opt_doc_id_size;
- if (log_tmp_is_encrypted()) {
- encrypted = true;
- }
-
ut_ad(trx->mysql_thd != NULL);
const char* path = thd_innodb_tmpdir(trx->mysql_thd);
/* There will be FTS_NUM_AUX_INDEX number of "sort buckets" for
@@ -264,7 +262,7 @@ row_fts_psort_info_init(
/* If tablespace is encrypted, allocate additional buffer for
encryption/decryption. */
- if (encrypted) {
+ if (srv_encrypt_log) {
/* Need to align memory for O_DIRECT write */
psort_info[j].crypt_block[i] =
static_cast<row_merge_block_t*>(
@@ -875,7 +873,9 @@ loop:
if (t_ctx.rows_added[t_ctx.buf_used] && !processed) {
row_merge_buf_sort(buf[t_ctx.buf_used], NULL);
row_merge_buf_write(buf[t_ctx.buf_used],
+#ifndef DBUG_OFF
merge_file[t_ctx.buf_used],
+#endif
block[t_ctx.buf_used]);
if (!row_merge_write(merge_file[t_ctx.buf_used]->fd,
@@ -941,8 +941,11 @@ exit:
for (i = 0; i < FTS_NUM_AUX_INDEX; i++) {
if (t_ctx.rows_added[i]) {
row_merge_buf_sort(buf[i], NULL);
- row_merge_buf_write(
- buf[i], merge_file[i], block[i]);
+ row_merge_buf_write(buf[i],
+#ifndef DBUG_OFF
+ merge_file[i],
+#endif
+ block[i]);
/* Write to temp file, only if records have
been flushed to temp file before (offset > 0):
diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc
index 6a2ee565b9e..2dcc16130c3 100644
--- a/storage/innobase/row/row0import.cc
+++ b/storage/innobase/row/row0import.cc
@@ -41,12 +41,8 @@ Created 2012-02-08 by Sunny Bains.
#include "fil0pagecompress.h"
#include "trx0undo.h"
#include "lock0lock.h"
-#ifdef HAVE_LZO
#include "lzo/lzo1x.h"
-#endif
-#ifdef HAVE_SNAPPY
#include "snappy-c.h"
-#endif
#include "log.h"
#include "scope.h"
@@ -84,9 +80,9 @@ struct row_index_t {
in the exporting server */
byte* m_name; /*!< Index name */
- ulint m_space; /*!< Space where it is placed */
+ uint32_t m_space; /*!< Space where it is placed */
- ulint m_page_no; /*!< Root page number */
+ uint32_t m_page_no; /*!< Root page number */
ulint m_type; /*!< Index type */
@@ -407,14 +403,14 @@ class AbstractCallback
public:
/** Constructor
@param trx covering transaction */
- AbstractCallback(trx_t* trx, ulint space_id)
+ AbstractCallback(trx_t* trx, uint32_t space_id)
:
m_zip_size(0),
m_trx(trx),
m_space(space_id),
m_xdes(),
- m_xdes_page_no(ULINT_UNDEFINED),
- m_space_flags(ULINT_UNDEFINED) UNIV_NOTHROW { }
+ m_xdes_page_no(UINT32_MAX),
+ m_space_flags(UINT32_MAX) UNIV_NOTHROW { }
/** Free any extent descriptor instance */
virtual ~AbstractCallback()
@@ -437,10 +433,7 @@ public:
}
/** @return the tablespace flags */
- ulint get_space_flags() const
- {
- return(m_space_flags);
- }
+ uint32_t get_space_flags() const { return m_space_flags; }
/**
Set the name of the physical file and the file handle that is used
@@ -471,7 +464,7 @@ public:
virtual dberr_t operator()(buf_block_t* block) UNIV_NOTHROW = 0;
/** @return the tablespace identifier */
- ulint get_space_id() const { return m_space; }
+ uint32_t get_space_id() const { return m_space; }
bool is_interrupted() const { return trx_is_interrupted(m_trx); }
@@ -514,7 +507,7 @@ protected:
@param page page contents
@return DB_SUCCESS or error code. */
dberr_t set_current_xdes(
- ulint page_no,
+ uint32_t page_no,
const page_t* page) UNIV_NOTHROW
{
m_xdes_page_no = page_no;
@@ -579,22 +572,19 @@ protected:
trx_t* m_trx;
/** Space id of the file being iterated over. */
- ulint m_space;
-
- /** Current size of the space in pages */
- ulint m_size;
+ uint32_t m_space;
/** Current extent descriptor page */
xdes_t* m_xdes;
/** Physical page offset in the file of the extent descriptor */
- ulint m_xdes_page_no;
+ uint32_t m_xdes_page_no;
/** Flags value read from the header page */
- ulint m_space_flags;
+ uint32_t m_space_flags;
};
-ATTRIBUTE_COLD static dberr_t invalid_space_flags(ulint flags)
+ATTRIBUTE_COLD static dberr_t invalid_space_flags(uint32_t flags)
{
if (fsp_flags_is_incompatible_mysql(flags))
{
@@ -602,7 +592,7 @@ ATTRIBUTE_COLD static dberr_t invalid_space_flags(ulint flags)
return DB_UNSUPPORTED;
}
- sql_print_error("InnoDB: Invalid FSP_SPACE_FLAGS=0x%zx", flags);
+ sql_print_error("InnoDB: Invalid FSP_SPACE_FLAGS=0x%" PRIx32, flags);
return DB_CORRUPTION;
}
@@ -619,8 +609,8 @@ AbstractCallback::init(
m_space_flags = fsp_header_get_flags(page);
if (!fil_space_t::is_valid_flags(m_space_flags, true)) {
- ulint cflags = fsp_flags_convert_from_101(m_space_flags);
- if (cflags == ULINT_UNDEFINED) {
+ uint32_t cflags = fsp_flags_convert_from_101(m_space_flags);
+ if (cflags == UINT32_MAX) {
return DB_CORRUPTION;
}
m_space_flags = cflags;
@@ -649,8 +639,7 @@ AbstractCallback::init(
return(DB_CORRUPTION);
}
- m_size = mach_read_from_4(page + FSP_SIZE);
- if (m_space == ULINT_UNDEFINED) {
+ if (m_space == UINT32_MAX) {
m_space = mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_ID
+ page);
}
@@ -684,13 +673,13 @@ struct FetchIndexRootPages : public AbstractCallback {
/** Index information gathered from the .ibd file. */
struct Index {
- Index(index_id_t id, ulint page_no)
+ Index(index_id_t id, uint32_t page_no)
:
m_id(id),
m_page_no(page_no) { }
index_id_t m_id; /*!< Index id */
- ulint m_page_no; /*!< Root page number */
+ uint32_t m_page_no; /*!< Root page number */
};
/** Constructor
@@ -698,7 +687,7 @@ struct FetchIndexRootPages : public AbstractCallback {
@param table table definition in server .*/
FetchIndexRootPages(const dict_table_t* table, trx_t* trx)
:
- AbstractCallback(trx, ULINT_UNDEFINED),
+ AbstractCallback(trx, UINT32_MAX),
m_table(table), m_index(0, 0) UNIV_NOTHROW { }
/** Destructor */
@@ -743,7 +732,7 @@ dberr_t FetchIndexRootPages::operator()(buf_block_t* block) UNIV_NOTHROW
m_index.m_page_no = block->page.id().page_no();
/* Check that the tablespace flags match the table flags. */
- ulint expected = dict_tf_to_fsp_flags(m_table->flags);
+ const uint32_t expected = dict_tf_to_fsp_flags(m_table->flags);
if (!fsp_flags_match(expected, m_space_flags)) {
ib_errf(m_trx->mysql_thd, IB_LOG_LEVEL_ERROR,
ER_TABLE_SCHEMA_MISMATCH,
@@ -860,7 +849,7 @@ public:
@param cfg config of table being imported.
@param space_id tablespace identifier
@param trx transaction covering the import */
- PageConverter(row_import* cfg, ulint space_id, trx_t* trx)
+ PageConverter(row_import* cfg, uint32_t space_id, trx_t* trx)
:
AbstractCallback(trx, space_id),
m_cfg(cfg),
@@ -1432,7 +1421,7 @@ row_import::set_root_by_name() UNIV_NOTHROW
/* We've already checked that it exists. */
ut_a(index != 0);
- index->page = static_cast<uint32_t>(cfg_index->m_page_no);
+ index->page = cfg_index->m_page_no;
}
}
@@ -1489,8 +1478,7 @@ row_import::set_root_by_heuristic() UNIV_NOTHROW
cfg_index[i].m_srv_index = index;
- index->page = static_cast<uint32_t>(
- cfg_index[i++].m_page_no);
+ index->page = cfg_index[i++].m_page_no;
}
}
@@ -3026,8 +3014,8 @@ row_import_read_meta_data(
/* decrypt and decompress page if needed */
static dberr_t decrypt_decompress(fil_space_crypt_t *space_crypt,
- size_t space_flags, span<byte> page,
- size_t space_id, byte *page_compress_buf)
+ uint32_t space_flags, span<byte> page,
+ uint32_t space_id, byte *page_compress_buf)
{
auto *data= page.data();
@@ -3036,8 +3024,8 @@ static dberr_t decrypt_decompress(fil_space_crypt_t *space_crypt,
if (!buf_page_verify_crypt_checksum(data, space_flags))
return DB_CORRUPTION;
- if (dberr_t err= fil_space_decrypt(space_id, space_crypt, data,
- page.size(), space_flags, data))
+ if (dberr_t err= fil_space_decrypt(space_id, space_flags, space_crypt,
+ data, page.size(), data))
return err;
}
@@ -3070,13 +3058,11 @@ static dberr_t decrypt_decompress(fil_space_crypt_t *space_crypt,
static size_t get_buf_size()
{
- return srv_page_size
-#ifdef HAVE_LZO
- + LZO1X_1_15_MEM_COMPRESS
-#elif defined HAVE_SNAPPY
- + snappy_max_compressed_length(srv_page_size)
-#endif
- ;
+ return srv_page_size + (
+ provider_service_lzo->is_loaded ? LZO1X_1_15_MEM_COMPRESS :
+ provider_service_snappy->is_loaded ? snappy_max_compressed_length(srv_page_size) :
+ 0
+ );
}
/* find, parse instant metadata, performing variaous checks,
@@ -3126,7 +3112,7 @@ static dberr_t handle_instant_metadata(dict_table_t *table,
if (!fil_space_t::is_valid_flags(space_flags, true))
{
auto cflags= fsp_flags_convert_from_101(space_flags);
- if (cflags == ULINT_UNDEFINED)
+ if (cflags == UINT32_MAX)
return invalid_space_flags(space_flags);
space_flags= static_cast<decltype(space_flags)>(cflags);
}
@@ -3741,12 +3727,8 @@ page_corrupted:
if (!buf_page_verify_crypt_checksum(readptr, m_space_flags))
goto page_corrupted;
- if (ENCRYPTION_KEY_NOT_ENCRYPTED ==
- buf_page_get_key_version(readptr, m_space_flags))
- goto page_corrupted;
-
- if ((err= fil_space_decrypt(get_space_id(), iter.crypt_data, readptr, size,
- m_space_flags, readptr)))
+ if ((err= fil_space_decrypt(get_space_id(), m_space_flags, iter.crypt_data,
+ readptr, size, readptr)))
goto func_exit;
}
@@ -3789,7 +3771,7 @@ static dberr_t fil_iterate(
return DB_OUT_OF_MEMORY;
}
- ulint actual_space_id = 0;
+ uint32_t actual_space_id = 0;
const bool full_crc32 = fil_space_t::full_crc32(
callback.get_space_flags());
@@ -3916,9 +3898,9 @@ page_corrupted:
if ((err = fil_space_decrypt(
actual_space_id,
+ callback.get_space_flags(),
iter.crypt_data, dst,
callback.physical_size(),
- callback.get_space_flags(),
src))) {
goto func_exit;
}
@@ -4056,7 +4038,7 @@ page_corrupted:
ut_ad(!comp == (size == srv_page_size));
ut_ad(!corrupt);
mach_write_to_4(dest + (size - 4),
- ut_crc32(dest, size - 4));
+ my_crc32c(0, dest, size - 4));
}
}
@@ -4461,11 +4443,9 @@ row_import_for_mysql(
we will not be writing any redo log for it before we have invoked
fil_space_t::set_imported() to declare it a persistent tablespace. */
- ulint fsp_flags = dict_tf_to_fsp_flags(table->flags);
-
table->space = fil_ibd_open(
2, FIL_TYPE_IMPORT, table->space_id,
- fsp_flags, name, filepath, &err);
+ dict_tf_to_fsp_flags(table->flags), name, filepath, &err);
ut_ad((table->space == NULL) == (err != DB_SUCCESS));
DBUG_EXECUTE_IF("ib_import_open_tablespace_failure",
diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc
index a4471104543..e327717ce65 100644
--- a/storage/innobase/row/row0ins.cc
+++ b/storage/innobase/row/row0ins.cc
@@ -1662,7 +1662,7 @@ row_ins_check_foreign_constraint(
}
}
- cmp = cmp_dtuple_rec(entry, rec, offsets);
+ cmp = cmp_dtuple_rec(entry, rec, check_index, offsets);
if (cmp == 0) {
if (rec_get_deleted_flag(rec,
@@ -1989,7 +1989,7 @@ row_ins_dupl_error_with_rec(
matched_fields = 0;
- cmp_dtuple_rec_with_match(entry, rec, offsets, &matched_fields);
+ cmp_dtuple_rec_with_match(entry, rec, index, offsets, &matched_fields);
if (matched_fields < n_unique) {
@@ -2173,7 +2173,7 @@ row_ins_scan_sec_index_for_duplicate(
continue;
}
- cmp = cmp_dtuple_rec(entry, rec, offsets);
+ cmp = cmp_dtuple_rec(entry, rec, index, offsets);
if (cmp == 0) {
if (row_ins_dupl_error_with_rec(rec, entry,
@@ -2219,18 +2219,20 @@ end_scan:
}
/** Checks for a duplicate when the table is being rebuilt online.
+@param n_uniq index->db_trx_id()
+@param entry entry being inserted
+@param rec clustered index record at insert position
+@param index clustered index
+@param offsets rec_get_offsets(rec)
@retval DB_SUCCESS when no duplicate is detected
@retval DB_SUCCESS_LOCKED_REC when rec is an exact match of entry or
a newer version of entry (the entry should not be inserted)
@retval DB_DUPLICATE_KEY when entry is a duplicate of rec */
static MY_ATTRIBUTE((nonnull, warn_unused_result))
dberr_t
-row_ins_duplicate_online(
-/*=====================*/
- ulint n_uniq, /*!< in: offset of DB_TRX_ID */
- const dtuple_t* entry, /*!< in: entry that is being inserted */
- const rec_t* rec, /*!< in: clustered index record */
- rec_offs* offsets)/*!< in/out: rec_get_offsets(rec) */
+row_ins_duplicate_online(ulint n_uniq, const dtuple_t *entry,
+ const rec_t *rec, const dict_index_t *index,
+ rec_offs *offsets)
{
ulint fields = 0;
@@ -2238,11 +2240,11 @@ row_ins_duplicate_online(
in the new table. */
ut_ad(!rec_get_deleted_flag(rec, rec_offs_comp(offsets)));
ut_ad(dtuple_get_n_fields_cmp(entry) == n_uniq);
+ ut_ad(n_uniq == index->db_trx_id());
- /* Compare the PRIMARY KEY fields and the
- DB_TRX_ID, DB_ROLL_PTR. */
- cmp_dtuple_rec_with_match_low(
- entry, rec, offsets, n_uniq + 2, &fields);
+ /* Compare the PRIMARY KEY fields and the DB_TRX_ID, DB_ROLL_PTR. */
+ cmp_dtuple_rec_with_match_low(entry, rec, index, offsets, n_uniq + 2,
+ &fields);
if (fields < n_uniq) {
/* Not a duplicate. */
@@ -2287,7 +2289,8 @@ row_ins_duplicate_error_in_clust_online(
*offsets = rec_get_offsets(rec, cursor->index(), *offsets,
cursor->index()->n_fields,
ULINT_UNDEFINED, heap);
- err = row_ins_duplicate_online(n_uniq, entry, rec, *offsets);
+ err = row_ins_duplicate_online(n_uniq, entry,
+ rec, cursor->index(), *offsets);
if (err != DB_SUCCESS) {
return(err);
}
@@ -2301,7 +2304,8 @@ row_ins_duplicate_error_in_clust_online(
*offsets = rec_get_offsets(rec, cursor->index(), *offsets,
cursor->index()->n_fields,
ULINT_UNDEFINED, heap);
- err = row_ins_duplicate_online(n_uniq, entry, rec, *offsets);
+ err = row_ins_duplicate_online(n_uniq, entry,
+ rec, cursor->index(), *offsets);
}
return(err);
@@ -2751,19 +2755,25 @@ err_exit:
&& !index->table->skip_alter_undo
&& !index->table->n_rec_locks
&& !index->table->is_active_ddl()
+ && !index->table->has_spatial_index()
&& !index->table->versioned()
&& !thd_is_slave(trx->mysql_thd) /* FIXME: MDEV-24622 */) {
DEBUG_SYNC_C("empty_root_page_insert");
+ trx->bulk_insert = true;
+
if (!index->table->is_temporary()) {
err = lock_table(index->table, NULL, LOCK_X, thr);
if (err != DB_SUCCESS) {
trx->error_state = err;
+ trx->bulk_insert = false;
goto err_exit;
}
if (index->table->n_rec_locks) {
+avoid_bulk:
+ trx->bulk_insert = false;
goto skip_bulk_insert;
}
@@ -2788,9 +2798,20 @@ err_exit:
#else /* BTR_CUR_HASH_ADAPT */
index->table->bulk_trx_id = trx->id;
#endif /* BTR_CUR_HASH_ADAPT */
- }
- trx->bulk_insert = true;
+ /* Write TRX_UNDO_EMPTY undo log and
+ start buffering the insert operation */
+ err = trx_undo_report_row_operation(
+ thr, index, entry,
+ nullptr, 0, nullptr, nullptr,
+ nullptr);
+
+ if (err != DB_SUCCESS) {
+ goto avoid_bulk;
+ }
+
+ goto err_exit;
+ }
}
skip_bulk_insert:
@@ -3309,7 +3330,7 @@ row_ins_sec_index_entry(
bool check_foreign) /*!< in: true if check
foreign table is needed, false otherwise */
{
- dberr_t err;
+ dberr_t err = DB_SUCCESS;
mem_heap_t* offsets_heap;
mem_heap_t* heap;
trx_id_t trx_id = 0;
@@ -3386,13 +3407,24 @@ row_ins_index_entry(
dtuple_t* entry, /*!< in/out: index entry to insert */
que_thr_t* thr) /*!< in: query thread */
{
- ut_ad(thr_get_trx(thr)->id || index->table->no_rollback()
+ trx_t* trx = thr_get_trx(thr);
+
+ ut_ad(trx->id || index->table->no_rollback()
|| index->table->is_temporary());
DBUG_EXECUTE_IF("row_ins_index_entry_timeout", {
DBUG_SET("-d,row_ins_index_entry_timeout");
return(DB_LOCK_WAIT);});
+ if (index->is_btree()) {
+ if (auto t= trx->check_bulk_buffer(index->table)) {
+ /* MDEV-25036 FIXME: check also foreign key
+ constraints */
+ ut_ad(!trx->check_foreigns);
+ return t->bulk_insert_buffered(*entry, *index, trx);
+ }
+ }
+
if (index->is_primary()) {
return row_ins_clust_index_entry(index, entry, thr, 0);
} else {
diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc
index b21ff2b9f86..3302bf934da 100644
--- a/storage/innobase/row/row0log.cc
+++ b/storage/innobase/row/row0log.cc
@@ -385,7 +385,7 @@ start_log:
/* If encryption is enabled encrypt buffer before writing it
to file system. */
- if (log_tmp_is_encrypted()) {
+ if (srv_encrypt_log) {
if (!log_tmp_block_encrypt(
buf, srv_sort_buf_size,
log->crypt_tail, byte_offset)) {
@@ -520,7 +520,7 @@ row_log_table_close_func(
/* If encryption is enabled encrypt buffer before writing it
to file system. */
- if (log_tmp_is_encrypted()) {
+ if (srv_encrypt_log) {
if (!log_tmp_block_encrypt(
log->tail.block, srv_sort_buf_size,
log->crypt_tail, byte_offset,
@@ -2612,7 +2612,7 @@ all_done:
goto corruption;
}
- if (log_tmp_is_encrypted()) {
+ if (srv_encrypt_log) {
if (!log_tmp_block_decrypt(
buf, srv_sort_buf_size,
index->online_log->crypt_head, ofs)) {
@@ -2965,7 +2965,7 @@ row_log_allocate(
dict_index_set_online_status(index, ONLINE_INDEX_CREATION);
- if (log_tmp_is_encrypted()) {
+ if (srv_encrypt_log) {
log->crypt_head_size = log->crypt_tail_size = srv_sort_buf_size;
log->crypt_head = static_cast<byte *>(
my_large_malloc(&log->crypt_head_size, MYF(MY_WME)));
@@ -3533,7 +3533,7 @@ all_done:
goto corruption;
}
- if (log_tmp_is_encrypted()) {
+ if (srv_encrypt_log) {
if (!log_tmp_block_decrypt(
buf, srv_sort_buf_size,
index->online_log->crypt_head, ofs)) {
diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc
index 70b51fbb812..cfeac48ac52 100644
--- a/storage/innobase/row/row0merge.cc
+++ b/storage/innobase/row/row0merge.cc
@@ -251,9 +251,18 @@ public:
@param[in] row_buf row_buf the sorted data tuples,
or NULL if fd, block will be used instead
@param[in,out] btr_bulk btr bulk instance
+@param[in] table_total_rows total rows of old table
+@param[in] pct_progress total progress percent untill now
+@param[in] pct_cost current progress percent
+@param[in] crypt_block buffer for encryption or NULL
+@param[in] space space id
@param[in,out] stage performance schema accounting object, used by
ALTER TABLE. If not NULL stage->begin_phase_insert() will be called initially
and then stage->inc() will be called for each record that is processed.
+@param[in] blob_file To read big column field data from
+ the given blob file. It is
+ applicable only for bulk insert
+ operation
@return DB_SUCCESS or error number */
static MY_ATTRIBUTE((warn_unused_result))
dberr_t
@@ -264,14 +273,13 @@ row_merge_insert_index_tuples(
row_merge_block_t* block,
const row_merge_buf_t* row_buf,
BtrBulk* btr_bulk,
- const ib_uint64_t table_total_rows, /*!< in: total rows of old table */
- const double pct_progress, /*!< in: total progress
- percent until now */
- const double pct_cost, /*!< in: current progress percent
- */
- row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */
- ulint space, /*!< in: space id */
- ut_stage_alter_t* stage = NULL);
+ const ib_uint64_t table_total_rows,
+ double pct_progress,
+ double pct_cost,
+ row_merge_block_t* crypt_block,
+ ulint space,
+ ut_stage_alter_t* stage= nullptr,
+ merge_file_t* blob_file= nullptr);
/******************************************************//**
Encode an index record. */
@@ -309,35 +317,23 @@ row_merge_buf_encode(
*b += size;
}
-/******************************************************//**
-Allocate a sort buffer.
-@return own: sort buffer */
static MY_ATTRIBUTE((malloc, nonnull))
row_merge_buf_t*
row_merge_buf_create_low(
-/*=====================*/
- mem_heap_t* heap, /*!< in: heap where allocated */
- dict_index_t* index, /*!< in: secondary index */
- ulint max_tuples, /*!< in: maximum number of
- data tuples */
- ulint buf_size) /*!< in: size of the buffer,
- in bytes */
+ row_merge_buf_t *buf, mem_heap_t *heap, dict_index_t *index)
{
- row_merge_buf_t* buf;
-
- ut_ad(max_tuples > 0);
-
- ut_ad(max_tuples <= srv_sort_buf_size);
-
- buf = static_cast<row_merge_buf_t*>(mem_heap_zalloc(heap, buf_size));
- buf->heap = heap;
- buf->index = index;
- buf->max_tuples = max_tuples;
- buf->tuples = static_cast<mtuple_t*>(
- ut_malloc_nokey(2 * max_tuples * sizeof *buf->tuples));
- buf->tmp_tuples = buf->tuples + max_tuples;
-
- return(buf);
+ ulint max_tuples = srv_sort_buf_size
+ / std::max<ulint>(1, dict_index_get_min_size(index));
+ ut_ad(max_tuples > 0);
+ ut_ad(max_tuples <= srv_sort_buf_size);
+
+ buf->heap = heap;
+ buf->index = index;
+ buf->max_tuples = max_tuples;
+ buf->tuples = static_cast<mtuple_t*>(
+ ut_malloc_nokey(2 * max_tuples * sizeof *buf->tuples));
+ buf->tmp_tuples = buf->tuples + max_tuples;
+ return(buf);
}
/******************************************************//**
@@ -349,18 +345,16 @@ row_merge_buf_create(
dict_index_t* index) /*!< in: secondary index */
{
row_merge_buf_t* buf;
- ulint max_tuples;
ulint buf_size;
mem_heap_t* heap;
- max_tuples = srv_sort_buf_size
- / std::max<ulint>(1, dict_index_get_min_size(index));
-
buf_size = (sizeof *buf);
heap = mem_heap_create(buf_size);
- buf = row_merge_buf_create_low(heap, index, max_tuples, buf_size);
+ buf = static_cast<row_merge_buf_t*>(
+ mem_heap_zalloc(heap, buf_size));
+ row_merge_buf_create_low(buf, heap, index);
return(buf);
}
@@ -453,6 +447,68 @@ row_merge_buf_redundant_convert(
dfield_set_data(field, buf, len);
}
+/** Insert the tuple into bulk buffer insert operation
+@param buf merge buffer for the index operation
+@param table bulk insert operation for the table
+@param row tuple to be inserted
+@return number of rows inserted */
+static ulint row_merge_bulk_buf_add(row_merge_buf_t* buf,
+ const dict_table_t &table,
+ const dtuple_t &row)
+{
+ if (buf->n_tuples >= buf->max_tuples)
+ return 0;
+
+ const dict_index_t *index= buf->index;
+ ulint n_fields= dict_index_get_n_fields(index);
+ mtuple_t *entry= &buf->tuples[buf->n_tuples];
+ ulint data_size= 0;
+ ulint extra_size= UT_BITS_IN_BYTES(unsigned(index->n_nullable));
+ dfield_t *field= entry->fields= static_cast<dfield_t*>(
+ mem_heap_alloc(buf->heap, n_fields * sizeof *entry->fields));
+ const dict_field_t *ifield= dict_index_get_nth_field(index, 0);
+
+ for (ulint i = 0; i < n_fields; i++, field++, ifield++)
+ {
+ dfield_copy(field, &row.fields[i]);
+ ulint len= dfield_get_len(field);
+ const dict_col_t* const col= ifield->col;
+
+ if (dfield_is_null(field))
+ continue;
+
+ ulint fixed_len= ifield->fixed_len;
+
+ if (fixed_len);
+ else if (len < 128 || (!DATA_BIG_COL(col)))
+ extra_size++;
+ else
+ extra_size += 2;
+ data_size += len;
+ }
+
+ /* Add to the total size of the record in row_merge_block_t
+ the encoded length of extra_size and the extra bytes (extra_size).
+ See row_merge_buf_write() for the variable-length encoding
+ of extra_size. */
+ data_size += (extra_size + 1) + ((extra_size + 1) >= 0x80);
+
+ /* Reserve bytes for the end marker of row_merge_block_t. */
+ if (buf->total_size + data_size >= srv_sort_buf_size)
+ return 0;
+
+ buf->total_size += data_size;
+ buf->n_tuples++;
+
+ field= entry->fields;
+
+ do
+ dfield_dup(field++, buf->heap);
+ while (--n_fields);
+
+ return 1;
+}
+
/** Insert a data tuple into a sort buffer.
@param[in,out] buf sort buffer
@param[in] fts_index fts index to be created
@@ -873,6 +929,7 @@ static MY_ATTRIBUTE((warn_unused_result))
int
row_merge_tuple_cmp(
/*================*/
+ const dict_index_t* index, /*< in: index tree */
ulint n_uniq, /*!< in: number of unique fields */
ulint n_field,/*!< in: number of fields */
const mtuple_t& a, /*!< in: first tuple to be compared */
@@ -884,6 +941,7 @@ row_merge_tuple_cmp(
const dfield_t* af = a.fields;
const dfield_t* bf = b.fields;
ulint n = n_uniq;
+ const dict_field_t* f = index->fields;
ut_ad(n_uniq > 0);
ut_ad(n_uniq <= n_field);
@@ -892,7 +950,7 @@ row_merge_tuple_cmp(
found or we run out of fields to compare. If !cmp at the
end, the tuples are equal. */
do {
- cmp = cmp_dfield_dfield(af++, bf++);
+ cmp = cmp_dfield_dfield(af++, bf++, (f++)->descending);
} while (!cmp && --n);
if (cmp) {
@@ -917,7 +975,7 @@ no_report:
/* The n_uniq fields were equal, but we compare all fields so
that we will get the same (internal) order as in the B-tree. */
for (n = n_field - n_uniq + 1; --n; ) {
- cmp = cmp_dfield_dfield(af++, bf++);
+ cmp = cmp_dfield_dfield(af++, bf++, (f++)->descending);
if (cmp) {
return(cmp);
}
@@ -937,7 +995,7 @@ UT_SORT_FUNCTION_BODY().
@param low lower bound of the sorting area, inclusive
@param high upper bound of the sorting area, inclusive */
#define row_merge_tuple_sort_ctx(tuples, aux, low, high) \
- row_merge_tuple_sort(n_uniq, n_field, dup, tuples, aux, low, high)
+ row_merge_tuple_sort(index,n_uniq,n_field,dup, tuples, aux, low, high)
/** Wrapper for row_merge_tuple_cmp() to inject some more context to
UT_SORT_FUNCTION_BODY().
@param a first tuple to be compared
@@ -945,7 +1003,7 @@ UT_SORT_FUNCTION_BODY().
@return positive, 0, negative, if a is greater, equal, less, than b,
respectively */
#define row_merge_tuple_cmp_ctx(a,b) \
- row_merge_tuple_cmp(n_uniq, n_field, a, b, dup)
+ row_merge_tuple_cmp(index, n_uniq, n_field, a, b, dup)
/**********************************************************************//**
Merge sort the tuple buffer in main memory. */
@@ -953,6 +1011,7 @@ static
void
row_merge_tuple_sort(
/*=================*/
+ const dict_index_t* index, /*!< in: index tree */
ulint n_uniq, /*!< in: number of unique fields */
ulint n_field,/*!< in: number of fields */
row_merge_dup_t* dup, /*!< in/out: reporter of duplicates
@@ -980,33 +1039,140 @@ row_merge_buf_sort(
row_merge_dup_t* dup) /*!< in/out: reporter of duplicates
(NULL if non-unique index) */
{
- ut_ad(!dict_index_is_spatial(buf->index));
+ ut_ad(!buf->index->is_spatial());
+ row_merge_tuple_sort(buf->index, buf->index->n_uniq, buf->index->n_fields,
+ dup, buf->tuples, buf->tmp_tuples, 0, buf->n_tuples);
+}
- row_merge_tuple_sort(dict_index_get_n_unique(buf->index),
- dict_index_get_n_fields(buf->index),
- dup,
- buf->tuples, buf->tmp_tuples, 0, buf->n_tuples);
+/** Write the blob field data to temporary file and fill the offset,
+length in the field data
+@param field tuple field
+@param blob_file file to store the blob data
+@param heap heap to store the blob offset and length
+@return DB_SUCCESS if successful */
+static dberr_t row_merge_write_blob_to_tmp_file(
+ dfield_t *field, merge_file_t *blob_file,mem_heap_t **heap)
+{
+ if (blob_file->fd == OS_FILE_CLOSED)
+ {
+ blob_file->fd= row_merge_file_create_low(nullptr);
+ if (blob_file->fd == OS_FILE_CLOSED)
+ return DB_OUT_OF_MEMORY;
+ }
+ uint64_t val= blob_file->offset;
+ uint32_t len= field->len;
+ dberr_t err= os_file_write(
+ IORequestWrite, "(bulk insert)", blob_file->fd,
+ field->data, blob_file->offset, len);
+
+ if (err != DB_SUCCESS)
+ return err;
+
+ byte *data= static_cast<byte*>
+ (mem_heap_alloc(*heap, BTR_EXTERN_FIELD_REF_SIZE));
+
+ /* Write zeroes for first 8 bytes */
+ memset(data, 0, 8);
+ /* Write offset for next 8 bytes */
+ mach_write_to_8(data + 8, val);
+ /* Write length of the blob in 4 bytes */
+ mach_write_to_4(data + 16, len);
+ blob_file->offset+= field->len;
+ blob_file->n_rec++;
+ dfield_set_data(field, data, BTR_EXTERN_FIELD_REF_SIZE);
+ dfield_set_ext(field);
+ return err;
}
-/******************************************************//**
-Write a buffer to a block. */
-void
-row_merge_buf_write(
-/*================*/
- const row_merge_buf_t* buf, /*!< in: sorted buffer */
- const merge_file_t* of UNIV_UNUSED,
- /*!< in: output file */
- row_merge_block_t* block) /*!< out: buffer for writing to file */
+/** This function is invoked when tuple size is greater than
+innodb_sort_buffer_size. Basically it recreates the tuple
+by writing the blob field to the temporary file.
+@param entry index fields to be encode the blob
+@param blob_file file to store the blob data
+@param heap heap to store the blob offset and blob length
+@return tuple which fits into sort_buffer_size */
+static dtuple_t* row_merge_buf_large_tuple(const dtuple_t &entry,
+ merge_file_t *blob_file,
+ mem_heap_t **heap)
+{
+ if (!*heap)
+ *heap= mem_heap_create(DTUPLE_EST_ALLOC(entry.n_fields));
+
+ dtuple_t *tuple= dtuple_copy(&entry, *heap);
+ for (ulint i= 0; i < tuple->n_fields; i++)
+ {
+ dfield_t *field= &tuple->fields[i];
+ if (dfield_is_null(field) || field->len <= 2000)
+ continue;
+
+ dberr_t err= row_merge_write_blob_to_tmp_file(field, blob_file, heap);
+ if (err != DB_SUCCESS)
+ return nullptr;
+ }
+
+ return tuple;
+}
+
+
+/** Write the field data whose length is more than 2000 bytes
+into blob temporary file and write offset, length into the
+tuple field
+@param entry index fields to be encode the blob
+@param n_fields number of fields in the entry
+@param heap heap to store the blob offset and blob length
+@param blob_file file to store the blob data */
+static dberr_t row_merge_buf_blob(const mtuple_t *entry, ulint n_fields,
+ mem_heap_t **heap, merge_file_t *blob_file)
+{
+
+ if (!*heap)
+ *heap= mem_heap_create(100);
+
+ for (ulint i= 0; i < n_fields; i++)
+ {
+ dfield_t *field= &entry->fields[i];
+ if (dfield_is_null(field) || field->len <= 2000)
+ continue;
+
+ dberr_t err= row_merge_write_blob_to_tmp_file(field, blob_file, heap);
+ if (err != DB_SUCCESS)
+ return err;
+ }
+
+ return DB_SUCCESS;
+}
+
+/** Write a buffer to a block.
+@param buf sorted buffer
+@param block buffer for writing to file
+@param blob_file blob file handle for doing bulk insert operation */
+dberr_t row_merge_buf_write(const row_merge_buf_t *buf,
+#ifndef DBUG_OFF
+ const merge_file_t *of, /*!< output file */
+#endif
+ row_merge_block_t *block,
+ merge_file_t *blob_file)
{
const dict_index_t* index = buf->index;
ulint n_fields= dict_index_get_n_fields(index);
byte* b = &block[0];
+ mem_heap_t* blob_heap = nullptr;
+ dberr_t err = DB_SUCCESS;
DBUG_ENTER("row_merge_buf_write");
for (ulint i = 0; i < buf->n_tuples; i++) {
const mtuple_t* entry = &buf->tuples[i];
+ if (blob_file) {
+ ut_ad(buf->index->is_primary());
+ err = row_merge_buf_blob(
+ entry, n_fields, &blob_heap, blob_file);
+ if (err != DB_SUCCESS) {
+ goto func_exit;
+ }
+ }
+
row_merge_buf_encode(&b, index, entry, n_fields);
ut_ad(b < &block[srv_sort_buf_size]);
@@ -1019,7 +1185,7 @@ row_merge_buf_write(
/* Write an "end-of-chunk" marker. */
ut_a(b < &block[srv_sort_buf_size]);
- ut_a(b == &block[0] + buf->total_size);
+ ut_a(b == &block[0] + buf->total_size || blob_file);
*b++ = 0;
#ifdef HAVE_valgrind
/* The rest of the block is uninitialized. Initialize it
@@ -1029,7 +1195,12 @@ row_merge_buf_write(
DBUG_LOG("ib_merge_sort",
"write " << reinterpret_cast<const void*>(b) << ','
<< of->fd << ',' << of->offset << " EOF");
- DBUG_VOID_RETURN;
+func_exit:
+ if (blob_heap) {
+ mem_heap_free(blob_heap);
+ }
+
+ DBUG_RETURN(err);
}
/******************************************************//**
@@ -1129,7 +1300,7 @@ row_merge_write(
DBUG_EXECUTE_IF("row_merge_write_failure", DBUG_RETURN(FALSE););
/* For encrypted tables, encrypt data before writing */
- if (log_tmp_is_encrypted()) {
+ if (srv_encrypt_log) {
if (!log_tmp_block_encrypt(static_cast<const byte*>(buf),
buf_len,
static_cast<byte*>(crypt_buf),
@@ -1548,11 +1719,10 @@ row_mtuple_cmp(
const mtuple_t* current_mtuple,
row_merge_dup_t* dup)
{
- ut_ad(dict_index_is_clust(dup->index));
- const ulint n_unique = dict_index_get_n_unique(dup->index);
-
- return(row_merge_tuple_cmp(
- n_unique, n_unique, *current_mtuple, *prev_mtuple, dup));
+ ut_ad(dup->index->is_primary());
+ const ulint n_uniq= dup->index->n_uniq;
+ return row_merge_tuple_cmp(dup->index, n_uniq, n_uniq,
+ *current_mtuple, *prev_mtuple, dup);
}
/** Insert cached spatial index rows.
@@ -2692,7 +2862,11 @@ write_buffers:
ut_ad(file->n_rec > 0);
- row_merge_buf_write(buf, file, block);
+ row_merge_buf_write(buf,
+#ifndef DBUG_OFF
+ file,
+#endif
+ block);
if (!row_merge_write(
file->fd, file->offset++,
@@ -3368,7 +3542,7 @@ row_merge_sort(
*/
#ifndef __sun__
/* Progress report only for "normal" indexes. */
- if (!(dup->index->type & DICT_FTS)) {
+ if (dup && !(dup->index->type & DICT_FTS)) {
thd_progress_init(trx->mysql_thd, 1);
}
#endif /* __sun__ */
@@ -3385,7 +3559,7 @@ row_merge_sort(
show processlist progress field */
/* Progress report only for "normal" indexes. */
#ifndef __sun__
- if (!(dup->index->type & DICT_FTS)) {
+ if (dup && !(dup->index->type & DICT_FTS)) {
thd_progress_report(trx->mysql_thd, file->offset - num_runs, file->offset);
}
#endif /* __sun__ */
@@ -3415,7 +3589,7 @@ row_merge_sort(
/* Progress report only for "normal" indexes. */
#ifndef __sun__
- if (!(dup->index->type & DICT_FTS)) {
+ if (dup && !(dup->index->type & DICT_FTS)) {
thd_progress_end(trx->mysql_thd);
}
#endif /* __sun__ */
@@ -3423,6 +3597,39 @@ row_merge_sort(
DBUG_RETURN(error);
}
+/** Copy the blob from the given blob file and store it
+in field data for the tuple
+@param tuple tuple to be inserted
+@param heap heap to allocate the memory for the blob storage
+@param blob_file file to handle blob data */
+static dberr_t row_merge_copy_blob_from_file(dtuple_t *tuple, mem_heap_t *heap,
+ merge_file_t *blob_file)
+{
+ for (ulint i = 0; i < dtuple_get_n_fields(tuple); i++)
+ {
+ dfield_t *field= dtuple_get_nth_field(tuple, i);
+ const byte *field_data= static_cast<byte*>(dfield_get_data(field));
+ ulint field_len= dfield_get_len(field);
+ if (!dfield_is_ext(field))
+ continue;
+
+ ut_a(field_len >= BTR_EXTERN_FIELD_REF_SIZE);
+ ut_ad(!dfield_is_null(field));
+
+ ut_ad(mach_read_from_8(field_data) == 0);
+ uint64_t offset= mach_read_from_8(field_data + 8);
+ uint32_t len= mach_read_from_4(field_data + 16);
+
+ byte *data= (byte*) mem_heap_alloc(heap, len);
+ if (dberr_t err= os_file_read(IORequestRead, blob_file->fd, data,
+ offset, len, nullptr))
+ return err;
+ dfield_set_data(field, data, len);
+ }
+
+ return DB_SUCCESS;
+}
+
/** Copy externally stored columns to the data tuple.
@param[in] mrec record containing BLOB pointers,
or NULL to use tuple instead
@@ -3508,18 +3715,6 @@ row_merge_mtuple_to_dtuple(
dtuple->n_fields * sizeof *mtuple->fields);
}
-/** Insert sorted data tuples to the index.
-@param[in] index index to be inserted
-@param[in] old_table old table
-@param[in] fd file descriptor
-@param[in,out] block file buffer
-@param[in] row_buf row_buf the sorted data tuples,
-or NULL if fd, block will be used instead
-@param[in,out] btr_bulk btr bulk instance
-@param[in,out] stage performance schema accounting object, used by
-ALTER TABLE. If not NULL stage->begin_phase_insert() will be called initially
-and then stage->inc() will be called for each record that is processed.
-@return DB_SUCCESS or error number */
static MY_ATTRIBUTE((warn_unused_result))
dberr_t
row_merge_insert_index_tuples(
@@ -3529,14 +3724,13 @@ row_merge_insert_index_tuples(
row_merge_block_t* block,
const row_merge_buf_t* row_buf,
BtrBulk* btr_bulk,
- const ib_uint64_t table_total_rows, /*!< in: total rows of old table */
- const double pct_progress, /*!< in: total progress
- percent until now */
- const double pct_cost, /*!< in: current progress percent
- */
- row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */
- ulint space, /*!< in: space id */
- ut_stage_alter_t* stage)
+ const ib_uint64_t table_total_rows,
+ double pct_progress,
+ double pct_cost,
+ row_merge_block_t* crypt_block,
+ ulint space,
+ ut_stage_alter_t* stage,
+ merge_file_t* blob_file)
{
const byte* b;
mem_heap_t* heap;
@@ -3647,7 +3841,16 @@ row_merge_insert_index_tuples(
}
}
- if (dict_index_is_clust(index) && dtuple_get_n_ext(dtuple)) {
+ ut_ad(!dtuple_get_n_ext(dtuple) || index->is_primary());
+
+ if (!dtuple_get_n_ext(dtuple)) {
+ } else if (blob_file) {
+ error = row_merge_copy_blob_from_file(
+ dtuple, tuple_heap, blob_file);
+ if (error != DB_SUCCESS) {
+ break;
+ }
+ } else {
/* Off-page columns can be fetched safely
when concurrent modifications to the table
are disabled. (Purge can process delete-marked
@@ -3664,7 +3867,8 @@ row_merge_insert_index_tuples(
row_merge_read_clustered_index() scan
will go through row_log_table_apply(). */
row_merge_copy_blobs(
- mrec, offsets, old_table->space->zip_size(),
+ mrec, offsets,
+ old_table->space->zip_size(),
dtuple, tuple_heap);
}
@@ -4361,7 +4565,8 @@ row_merge_create_index(
name = dict_table_get_col_name(table, ifield->col_no);
}
- dict_mem_index_add_field(index, name, ifield->prefix_len);
+ dict_mem_index_add_field(index, name, ifield->prefix_len,
+ ifield->descending);
}
if (n_add_vcol) {
@@ -4491,7 +4696,7 @@ row_merge_build_indexes(
crypt_pfx.m_size = 0; /* silence bogus -Wmaybe-uninitialized */
TRASH_ALLOC(&crypt_pfx, sizeof crypt_pfx);
- if (log_tmp_is_encrypted()) {
+ if (srv_encrypt_log) {
crypt_block = static_cast<row_merge_block_t*>(
alloc.allocate_large(block_size,
&crypt_pfx));
@@ -4853,6 +5058,337 @@ func_exit:
clust_index->lock.x_unlock();
}
- DBUG_EXECUTE_IF("ib_index_crash_after_bulk_load", DBUG_SUICIDE(););
DBUG_RETURN(error);
}
+
+dberr_t row_merge_bulk_t::alloc_block()
+{
+ if (m_block)
+ return DB_SUCCESS;
+ m_block= m_alloc.allocate_large_dontdump(
+ 3 * srv_sort_buf_size, &m_block_pfx);
+ if (m_block == nullptr)
+ return DB_OUT_OF_MEMORY;
+
+ m_crypt_pfx.m_size= 0;
+ TRASH_ALLOC(&m_crypt_pfx, sizeof m_crypt_pfx);
+ if (srv_encrypt_log)
+ {
+ m_crypt_block= static_cast<row_merge_block_t*>(
+ m_alloc.allocate_large(3 * srv_sort_buf_size, &m_crypt_pfx));
+ if (!m_crypt_block)
+ return DB_OUT_OF_MEMORY;
+ }
+ return DB_SUCCESS;
+}
+
+row_merge_bulk_t::row_merge_bulk_t(dict_table_t *table)
+{
+ ulint n_index= 0;
+ for (dict_index_t *index= UT_LIST_GET_FIRST(table->indexes);
+ index; index= UT_LIST_GET_NEXT(indexes, index))
+ {
+ if (!index->is_btree())
+ continue;
+ n_index++;
+ }
+
+ m_merge_buf= static_cast<row_merge_buf_t*>(
+ ut_zalloc_nokey(n_index * sizeof *m_merge_buf));
+
+ ulint i= 0;
+ for (dict_index_t *index= UT_LIST_GET_FIRST(table->indexes);
+ index; index= UT_LIST_GET_NEXT(indexes, index))
+ {
+ if (!index->is_btree())
+ continue;
+
+ mem_heap_t *heap= mem_heap_create(100);
+ row_merge_buf_create_low(&m_merge_buf[i], heap, index);
+ i++;
+ }
+
+ m_tmpfd= OS_FILE_CLOSED;
+ m_blob_file.fd= OS_FILE_CLOSED;
+ m_blob_file.offset= 0;
+ m_blob_file.n_rec= 0;
+}
+
+row_merge_bulk_t::~row_merge_bulk_t()
+{
+ ulint i= 0;
+ dict_table_t *table= m_merge_buf[0].index->table;
+ for (dict_index_t *index= UT_LIST_GET_FIRST(table->indexes);
+ index; index= UT_LIST_GET_NEXT(indexes, index))
+ {
+ if (!index->is_btree())
+ continue;
+ row_merge_buf_free(&m_merge_buf[i]);
+ if (m_merge_files)
+ row_merge_file_destroy(&m_merge_files[i]);
+ i++;
+ }
+
+ row_merge_file_destroy_low(m_tmpfd);
+
+ row_merge_file_destroy(&m_blob_file);
+
+ ut_free(m_merge_buf);
+
+ ut_free(m_merge_files);
+
+ if (m_block)
+ m_alloc.deallocate_large(m_block, &m_block_pfx);
+
+ if (m_crypt_block)
+ m_alloc.deallocate_large(m_crypt_block, &m_crypt_pfx);
+}
+
+void row_merge_bulk_t::init_tmp_file()
+{
+ if (m_merge_files)
+ return;
+
+ ulint n_index= 0;
+ dict_table_t *table= m_merge_buf[0].index->table;
+ for (dict_index_t *index= UT_LIST_GET_FIRST(table->indexes);
+ index; index= UT_LIST_GET_NEXT(indexes, index))
+ {
+ if (!index->is_btree())
+ continue;
+ n_index++;
+ }
+
+ m_merge_files= static_cast<merge_file_t*>(
+ ut_malloc_nokey(n_index * sizeof *m_merge_files));
+
+ for (ulint i= 0; i < n_index; i++)
+ {
+ m_merge_files[i].fd= OS_FILE_CLOSED;
+ m_merge_files[i].offset= 0;
+ m_merge_files[i].n_rec= 0;
+ }
+}
+
+void row_merge_bulk_t::clean_bulk_buffer(ulint index_no)
+{
+ mem_heap_empty(m_merge_buf[index_no].heap);
+ m_merge_buf[index_no].total_size = m_merge_buf[index_no].n_tuples = 0;
+}
+
+bool row_merge_bulk_t::create_tmp_file(ulint index_no)
+{
+ return row_merge_file_create_if_needed(
+ &m_merge_files[index_no], &m_tmpfd,
+ m_merge_buf[index_no].n_tuples, NULL);
+}
+
+dberr_t row_merge_bulk_t::write_to_tmp_file(ulint index_no)
+{
+ if (!create_tmp_file(index_no))
+ return DB_OUT_OF_MEMORY;
+ merge_file_t *file= &m_merge_files[index_no];
+ row_merge_buf_t *buf= &m_merge_buf[index_no];
+
+ alloc_block();
+
+ if (dberr_t err= row_merge_buf_write(buf,
+#ifndef DBUG_OFF
+ file,
+#endif
+ m_block,
+ index_no == 0 ? &m_blob_file : nullptr))
+ return err;
+
+ if (!row_merge_write(file->fd, file->offset++,
+ m_block, m_crypt_block,
+ buf->index->table->space->id))
+ return DB_TEMP_FILE_WRITE_FAIL;
+ MEM_UNDEFINED(&m_block[0], srv_sort_buf_size);
+ return DB_SUCCESS;
+}
+
+dberr_t row_merge_bulk_t::bulk_insert_buffered(const dtuple_t &row,
+ const dict_index_t &ind,
+ trx_t *trx)
+{
+ dberr_t err= DB_SUCCESS;
+ ulint i= 0;
+ mem_heap_t *large_tuple_heap= nullptr;
+ for (dict_index_t *index= UT_LIST_GET_FIRST(ind.table->indexes);
+ index; index= UT_LIST_GET_NEXT(indexes, index))
+ {
+ if (!index->is_btree())
+ continue;
+
+ if (index != &ind)
+ {
+ i++;
+ continue;
+ }
+ row_merge_buf_t *buf= &m_merge_buf[i];
+add_to_buf:
+ if (row_merge_bulk_buf_add(buf, *ind.table, row))
+ {
+ i++;
+ goto func_exit;
+ }
+
+ if (buf->n_tuples == 0)
+ {
+ /* Tuple data size is greater than srv_sort_buf_size */
+ dtuple_t *big_tuple= row_merge_buf_large_tuple(
+ row, &m_blob_file, &large_tuple_heap);
+ if (row_merge_bulk_buf_add(buf, *ind.table, *big_tuple))
+ {
+ i++;
+ goto func_exit;
+ }
+ }
+
+ if (index->is_unique())
+ {
+ row_merge_dup_t dup{index, nullptr, nullptr, 0};
+ row_merge_buf_sort(buf, &dup);
+ if (dup.n_dup)
+ {
+ trx->error_info= index;
+ err= DB_DUPLICATE_KEY;
+ goto func_exit;
+ }
+ }
+ else
+ row_merge_buf_sort(buf, NULL);
+ init_tmp_file();
+ merge_file_t *file= &m_merge_files[i];
+ file->n_rec+= buf->n_tuples;
+ err= write_to_tmp_file(i);
+ if (err != DB_SUCCESS)
+ {
+ trx->error_info= index;
+ goto func_exit;
+ }
+ clean_bulk_buffer(i);
+ buf= &m_merge_buf[i];
+ goto add_to_buf;
+ }
+
+func_exit:
+ if (large_tuple_heap)
+ mem_heap_free(large_tuple_heap);
+ return err;
+}
+
+dberr_t row_merge_bulk_t::write_to_index(ulint index_no, trx_t *trx)
+{
+ dberr_t err= DB_SUCCESS;
+ row_merge_buf_t buf= m_merge_buf[index_no];
+ merge_file_t *file= m_merge_files ?
+ &m_merge_files[index_no] : nullptr;
+ dict_index_t *index= buf.index;
+ dict_table_t *table= index->table;
+ BtrBulk btr_bulk(index, trx);
+ row_merge_dup_t dup = {index, nullptr, nullptr, 0};
+
+ if (buf.n_tuples)
+ {
+ if (dict_index_is_unique(index))
+ {
+ row_merge_buf_sort(&buf, &dup);
+ if (dup.n_dup)
+ {
+ err= DB_DUPLICATE_KEY;
+ goto func_exit;
+ }
+ }
+ else row_merge_buf_sort(&buf, NULL);
+ if (file && file->fd != OS_FILE_CLOSED)
+ {
+ file->n_rec+= buf.n_tuples;
+ err= write_to_tmp_file(index_no);
+ if (err!= DB_SUCCESS)
+ goto func_exit;
+ }
+ else
+ {
+ /* Data got fit in merge buffer. */
+ err= row_merge_insert_index_tuples(
+ index, table, OS_FILE_CLOSED, nullptr,
+ &buf, &btr_bulk, 0, 0, 0, nullptr, table->space_id, nullptr,
+ m_blob_file.fd == OS_FILE_CLOSED ? nullptr : &m_blob_file);
+ goto func_exit;
+ }
+ }
+
+ err= row_merge_sort(trx, &dup, file,
+ m_block, &m_tmpfd, true, 0, 0,
+ m_crypt_block, table->space_id, nullptr);
+ if (err != DB_SUCCESS)
+ goto func_exit;
+
+ err= row_merge_insert_index_tuples(
+ index, table, file->fd, m_block, nullptr,
+ &btr_bulk, 0, 0, 0, m_crypt_block, table->space_id,
+ nullptr, &m_blob_file);
+
+func_exit:
+ if (err != DB_SUCCESS)
+ trx->error_info= index;
+ err= btr_bulk.finish(err);
+ return err;
+}
+
+dberr_t row_merge_bulk_t::write_to_table(dict_table_t *table, trx_t *trx)
+{
+ ulint i= 0;
+ for (dict_index_t *index= UT_LIST_GET_FIRST(table->indexes);
+ index; index= UT_LIST_GET_NEXT(indexes, index))
+ {
+ if (!index->is_btree())
+ continue;
+
+ dberr_t err= write_to_index(i, trx);
+ if (err != DB_SUCCESS)
+ return err;
+ i++;
+ }
+
+ return DB_SUCCESS;
+}
+
+dberr_t trx_mod_table_time_t::write_bulk(dict_table_t *table, trx_t *trx)
+{
+ if (!bulk_store)
+ return DB_SUCCESS;
+ dberr_t err= bulk_store->write_to_table(table, trx);
+ delete bulk_store;
+ bulk_store= nullptr;
+ return err;
+}
+
+dberr_t trx_t::bulk_insert_apply_low()
+{
+ ut_ad(bulk_insert);
+ ut_ad(!check_unique_secondary);
+ ut_ad(!check_foreigns);
+ dberr_t err;
+ for (auto& t : mod_tables)
+ if (t.second.is_bulk_insert())
+ if ((err= t.second.write_bulk(t.first, this)) != DB_SUCCESS)
+ goto bulk_rollback;
+ return DB_SUCCESS;
+bulk_rollback:
+ undo_no_t low_limit= UINT64_MAX;
+ for (auto& t : mod_tables)
+ {
+ if (t.second.is_bulk_insert())
+ {
+ if (t.second.get_first() < low_limit)
+ low_limit= t.second.get_first();
+ delete t.second.bulk_store;
+ }
+ }
+ trx_savept_t bulk_save{low_limit};
+ rollback(&bulk_save);
+ return err;
+}
diff --git a/storage/innobase/row/row0purge.cc b/storage/innobase/row/row0purge.cc
index 753b42332fc..65d26e0a733 100644
--- a/storage/innobase/row/row0purge.cc
+++ b/storage/innobase/row/row0purge.cc
@@ -1354,7 +1354,7 @@ purge_node_t::validate_pcur()
part in persistent cursor. Both cases we store n_uniq fields of the
cluster index and so it is fine to do the comparison. We note this
dependency here as pcur and ref belong to different modules. */
- int st = cmp_dtuple_rec(ref, pcur.old_rec, offsets);
+ int st = cmp_dtuple_rec(ref, pcur.old_rec, clust_index, offsets);
if (st != 0) {
ib::error() << "Purge node pcur validation failed";
diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc
index d1d264a7e8a..e5db6a777d9 100644
--- a/storage/innobase/row/row0sel.cc
+++ b/storage/innobase/row/row0sel.cc
@@ -152,7 +152,7 @@ row_sel_sec_rec_is_for_blob(
return false;
}
- return(!cmp_data_data(mtype, prtype, buf, len, sec_field, sec_len));
+ return !cmp_data(mtype, prtype, false, buf, len, sec_field, sec_len);
}
/** Function to read the secondary spatial index, calculate
@@ -399,9 +399,8 @@ compare_blobs:
}
}
- if (0 != cmp_data_data(col->mtype, col->prtype,
- clust_field, len,
- sec_field, sec_len)) {
+ if (cmp_data(col->mtype, col->prtype, false,
+ clust_field, len, sec_field, sec_len)) {
return DB_SUCCESS;
}
}
@@ -3322,7 +3321,7 @@ class Row_sel_get_clust_rec_for_mysql
ulint len1, len2;
const byte *b1= rec_get_nth_field(cached_clust_rec, offsets, n, &len1);
const byte *b2= rec_get_nth_field(cached_old_vers, vers_offs, n, &len2);
- ut_ad(!cmp_data_data(col->mtype, col->prtype, b1, len1, b2, len2));
+ ut_ad(!cmp_data(col->mtype, col->prtype, false, b1, len1, b2, len2));
}
}
#endif
@@ -5075,7 +5074,7 @@ wrong_offs:
/* fputs("Comparing rec and search tuple\n", stderr); */
- if (0 != cmp_dtuple_rec(search_tuple, rec, offsets)) {
+ if (cmp_dtuple_rec(search_tuple, rec, index, offsets)) {
if (set_also_gap_locks
&& !dict_index_is_spatial(index)) {
@@ -5110,7 +5109,8 @@ wrong_offs:
} else if (match_mode == ROW_SEL_EXACT_PREFIX) {
- if (!cmp_dtuple_is_prefix_of_rec(search_tuple, rec, offsets)) {
+ if (!cmp_dtuple_is_prefix_of_rec(search_tuple, rec,
+ index, offsets)) {
if (set_also_gap_locks
&& !dict_index_is_spatial(index)) {
@@ -5230,7 +5230,7 @@ wrong_offs:
&& direction == 0
&& dtuple_get_n_fields_cmp(search_tuple)
== dict_index_get_n_unique(index)
- && 0 == cmp_dtuple_rec(search_tuple, rec, offsets)) {
+ && !cmp_dtuple_rec(search_tuple, rec, index, offsets)) {
no_gap_lock:
lock_type = LOCK_REC_NOT_GAP;
} else {
@@ -6184,8 +6184,8 @@ compare_blobs:
}
}
- if (cmp_data_data(ifield.col->mtype, ifield.col->prtype,
- field, len, sec_field, sec_len))
+ if (cmp_data(ifield.col->mtype, ifield.col->prtype, false,
+ field, len, sec_field, sec_len))
return DB_SUCCESS_LOCKED_REC;
}
@@ -6778,7 +6778,7 @@ count_row:
if (prev_entry)
{
ulint matched_fields= 0;
- int cmp= cmp_dtuple_rec_with_match(prev_entry, rec, offsets,
+ int cmp= cmp_dtuple_rec_with_match(prev_entry, rec, index, offsets,
&matched_fields);
const char* msg;
@@ -6895,25 +6895,37 @@ row_search_get_max_rec(
{
btr_pcur_t pcur;
const rec_t* rec;
- /* Open at the high/right end (false), and init cursor */
- if (pcur.open_leaf(false, index, BTR_SEARCH_LEAF, mtr) != DB_SUCCESS) {
+ const bool desc = index->fields[0].descending;
+
+ if (pcur.open_leaf(desc, index, BTR_SEARCH_LEAF, mtr) != DB_SUCCESS) {
return nullptr;
}
- do {
- const page_t* page;
-
- page = btr_pcur_get_page(&pcur);
- rec = page_find_rec_max_not_deleted(page);
-
- if (page_rec_is_user_rec(rec)) {
- break;
- } else {
- rec = NULL;
+ if (desc) {
+ const bool comp = index->table->not_redundant();
+ while (btr_pcur_move_to_next_user_rec(&pcur, mtr)) {
+ rec = btr_pcur_get_rec(&pcur);
+ if (rec_is_metadata(rec, *index)) {
+ continue;
+ }
+ if (!rec_get_deleted_flag(rec, comp)) {
+ goto found;
+ }
}
- btr_pcur_move_before_first_on_page(&pcur);
- } while (btr_pcur_move_to_prev(&pcur, mtr));
+ } else {
+ do {
+ rec = page_find_rec_last_not_deleted(
+ btr_pcur_get_page(&pcur));
+ if (page_rec_is_user_rec(rec)) {
+ goto found;
+ }
+ btr_pcur_move_before_first_on_page(&pcur);
+ } while (btr_pcur_move_to_prev(&pcur, mtr));
+ }
+
+ rec = nullptr;
+found:
ut_ad(!rec
|| !(rec_get_info_bits(rec, dict_table_is_comp(index->table))
& (REC_INFO_MIN_REC_FLAG | REC_INFO_DELETED_FLAG)));
diff --git a/storage/innobase/row/row0vers.cc b/storage/innobase/row/row0vers.cc
index 372d30149f0..a4b52fd2a2f 100644
--- a/storage/innobase/row/row0vers.cc
+++ b/storage/innobase/row/row0vers.cc
@@ -328,7 +328,7 @@ not_locked:
/* We check if entry and rec are identified in the alphabetical
ordering */
- if (0 == cmp_dtuple_rec(entry, rec, offsets)) {
+ if (0 == cmp_dtuple_rec(entry, rec, index, offsets)) {
/* The delete marks of rec and prev_version should be
equal for rec to be in the state required by
prev_version */
@@ -346,7 +346,7 @@ not_locked:
dtuple_set_types_binary(
entry, dtuple_get_n_fields(entry));
- if (0 != cmp_dtuple_rec(entry, rec, offsets)) {
+ if (cmp_dtuple_rec(entry, rec, index, offsets)) {
break;
}
@@ -741,7 +741,7 @@ row_vers_vc_matches_cluster(
/* The index field mismatch */
if (v_heap
- || cmp_dfield_dfield(field2, field1) != 0) {
+ || cmp_dfield_dfield(field2, field1)) {
if (v_heap) {
dtuple_dup_v_fld(*vrow, v_heap);
}
@@ -844,6 +844,21 @@ row_vers_build_cur_vrow(
return(cur_vrow);
}
+/** @return whether two data tuples are equal */
+static bool dtuple_coll_eq(const dtuple_t &tuple1, const dtuple_t &tuple2)
+{
+ ut_ad(tuple1.magic_n == DATA_TUPLE_MAGIC_N);
+ ut_ad(tuple2.magic_n == DATA_TUPLE_MAGIC_N);
+ ut_ad(dtuple_check_typed(&tuple1));
+ ut_ad(dtuple_check_typed(&tuple2));
+ ut_ad(tuple1.n_fields == tuple2.n_fields);
+
+ for (ulint i= 0; i < tuple1.n_fields; i++)
+ if (cmp_dfield_dfield(&tuple1.fields[i], &tuple2.fields[i]))
+ return false;
+ return true;
+}
+
/** Finds out if a version of the record, where the version >= the current
purge_sys.view, should have ientry as its secondary index entry. We check
if there is any not delete marked version of the record where the trx
@@ -944,7 +959,7 @@ row_vers_old_has_index_entry(
entry = row_build_index_entry(
row, ext, index, heap);
- if (entry && !dtuple_coll_cmp(ientry, entry)) {
+ if (entry && dtuple_coll_eq(*ientry, *entry)) {
goto unsafe_to_purge;
}
} else {
@@ -999,7 +1014,7 @@ row_vers_old_has_index_entry(
the clustered index record has already been updated to
a different binary value in a char field, but the
collation identifies the old and new value anyway! */
- if (entry && !dtuple_coll_cmp(ientry, entry)) {
+ if (entry && dtuple_coll_eq(*ientry, *entry)) {
unsafe_to_purge:
mem_heap_free(heap);
@@ -1098,7 +1113,7 @@ unsafe_to_purge:
a char field, but the collation identifies the old
and new value anyway! */
- if (entry && !dtuple_coll_cmp(ientry, entry)) {
+ if (entry && dtuple_coll_eq(*ientry, *entry)) {
goto unsafe_to_purge;
}
}
diff --git a/storage/innobase/snappy.cmake b/storage/innobase/snappy.cmake
deleted file mode 100644
index 3a2d828ee5c..00000000000
--- a/storage/innobase/snappy.cmake
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (C) 2015, MariaDB Corporation. All Rights Reserved.
-#
-# This program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; version 2 of the License.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
-
-SET(WITH_INNODB_SNAPPY AUTO CACHE STRING
- "Build with snappy. Possible values are 'ON', 'OFF', 'AUTO' and default is 'AUTO'")
-
-MACRO (MYSQL_CHECK_SNAPPY)
- IF (WITH_INNODB_SNAPPY STREQUAL "ON" OR WITH_INNODB_SNAPPY STREQUAL "AUTO")
- CHECK_INCLUDE_FILES(snappy-c.h HAVE_SNAPPY_H)
- CHECK_LIBRARY_EXISTS(snappy snappy_uncompress "" HAVE_SNAPPY_SHARED_LIB)
-
- IF(HAVE_SNAPPY_SHARED_LIB AND HAVE_SNAPPY_H)
- SET(HAVE_INNODB_SNAPPY TRUE)
- ADD_DEFINITIONS(-DHAVE_SNAPPY=1)
- LINK_LIBRARIES(snappy)
- ELSE()
- IF (WITH_INNODB_SNAPPY STREQUAL "ON")
- MESSAGE(FATAL_ERROR "Required snappy library is not found")
- ENDIF()
- ENDIF()
- ENDIF()
- ADD_FEATURE_INFO(INNODB_SNAPPY HAVE_INNODB_SNAPPY "Snappy compression in the InnoDB storage engine")
-ENDMACRO()
diff --git a/storage/innobase/srv/srv0mon.cc b/storage/innobase/srv/srv0mon.cc
index b6496d03908..eca7a45563c 100644
--- a/storage/innobase/srv/srv0mon.cc
+++ b/storage/innobase/srv/srv0mon.cc
@@ -651,24 +651,6 @@ static monitor_info_t innodb_counter_info[] =
MONITOR_EXISTING | MONITOR_DEFAULT_ON),
MONITOR_DEFAULT_START, MONITOR_OVLD_OS_LOG_WRITTEN},
- {"os_log_fsyncs", "os",
- "Number of fsync log writes (innodb_os_log_fsyncs)",
- static_cast<monitor_type_t>(
- MONITOR_EXISTING | MONITOR_DEFAULT_ON),
- MONITOR_DEFAULT_START, MONITOR_OVLD_OS_LOG_FSYNC},
-
- {"os_log_pending_fsyncs", "os",
- "Number of pending fsync write (innodb_os_log_pending_fsyncs)",
- static_cast<monitor_type_t>(
- MONITOR_EXISTING | MONITOR_DEFAULT_ON),
- MONITOR_DEFAULT_START, MONITOR_OVLD_OS_LOG_PENDING_FSYNC},
-
- {"os_log_pending_writes", "os",
- "Number of pending log file writes (innodb_os_log_pending_writes)",
- static_cast<monitor_type_t>(
- MONITOR_EXISTING | MONITOR_DEFAULT_ON),
- MONITOR_DEFAULT_START, MONITOR_OVLD_OS_LOG_PENDING_WRITES},
-
/* ========== Counters for Transaction Module ========== */
{"module_trx", "transaction", "Transaction Manager",
MONITOR_MODULE,
@@ -769,8 +751,9 @@ static monitor_info_t innodb_counter_info[] =
MONITOR_DEFAULT_START, MONITOR_MODULE_RECOVERY},
{"log_checkpoints", "recovery", "Number of checkpoints",
- MONITOR_NONE,
- MONITOR_DEFAULT_START, MONITOR_NUM_CHECKPOINT},
+ static_cast<monitor_type_t>(
+ MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT),
+ MONITOR_DEFAULT_START, MONITOR_OVLD_CHECKPOINTS},
{"log_lsn_last_flush", "recovery", "LSN of Last flush",
static_cast<monitor_type_t>(
@@ -805,21 +788,6 @@ static monitor_info_t innodb_counter_info[] =
MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT),
MONITOR_DEFAULT_START, MONITOR_OVLD_MAX_AGE_ASYNC},
- {"log_pending_log_flushes", "recovery", "Pending log flushes",
- static_cast<monitor_type_t>(
- MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT),
- MONITOR_DEFAULT_START, MONITOR_PENDING_LOG_FLUSH},
-
- {"log_pending_checkpoint_writes", "recovery", "Pending checkpoints",
- static_cast<monitor_type_t>(
- MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT),
- MONITOR_DEFAULT_START, MONITOR_PENDING_CHECKPOINT_WRITE},
-
- {"log_num_log_io", "recovery", "Number of log I/Os",
- static_cast<monitor_type_t>(
- MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT),
- MONITOR_DEFAULT_START, MONITOR_LOG_IO},
-
{"log_waits", "recovery",
"Number of log waits due to small log buffer (innodb_log_waits)",
static_cast<monitor_type_t>(
@@ -838,12 +806,6 @@ static monitor_info_t innodb_counter_info[] =
MONITOR_EXISTING | MONITOR_DEFAULT_ON),
MONITOR_DEFAULT_START, MONITOR_OVLD_LOG_WRITES},
- {"log_padded", "recovery",
- "Bytes of log padded for log write ahead",
- static_cast<monitor_type_t>(
- MONITOR_EXISTING | MONITOR_DEFAULT_ON),
- MONITOR_DEFAULT_START, MONITOR_OVLD_LOG_PADDED},
-
/* ========== Counters for Page Compression ========== */
{"module_compress", "compression", "Page Compression Info",
MONITOR_MODULE,
@@ -1392,6 +1354,7 @@ corresponding monitors are turned on/off/reset, and do appropriate
mathematics to deduct the actual value. Please also refer to
srv_export_innodb_status() for related global counters used by
the existing status variables.*/
+TPOOL_SUPPRESS_TSAN
void
srv_mon_process_existing_counter(
/*=============================*/
@@ -1428,7 +1391,7 @@ srv_mon_process_existing_counter(
/* innodb_buffer_pool_write_requests, the number of
write request */
case MONITOR_OVLD_BUF_POOL_WRITE_REQUEST:
- value = srv_stats.buf_pool_write_requests;
+ value = buf_pool.flush_list_requests;
break;
/* innodb_buffer_pool_wait_free */
@@ -1545,43 +1508,22 @@ srv_mon_process_existing_counter(
/* innodb_os_log_written */
case MONITOR_OVLD_OS_LOG_WRITTEN:
- value = (mon_type_t) srv_stats.os_log_written;
- break;
-
- /* innodb_os_log_fsyncs */
- case MONITOR_OVLD_OS_LOG_FSYNC:
- value = log_sys.get_flushes();
- break;
-
- /* innodb_os_log_pending_fsyncs */
- case MONITOR_OVLD_OS_LOG_PENDING_FSYNC:
- value = log_sys.get_pending_flushes();
- update_min = TRUE;
- break;
-
- /* innodb_os_log_pending_writes */
- case MONITOR_OVLD_OS_LOG_PENDING_WRITES:
- value = srv_stats.os_log_pending_writes;
- update_min = TRUE;
+ value = log_sys.get_lsn() - recv_sys.lsn;
break;
/* innodb_log_waits */
case MONITOR_OVLD_LOG_WAITS:
- value = srv_stats.log_waits;
+ value = log_sys.waits;
break;
/* innodb_log_write_requests */
case MONITOR_OVLD_LOG_WRITE_REQUEST:
- value = srv_stats.log_write_requests;
+ value = log_sys.write_to_buf;
break;
/* innodb_log_writes */
case MONITOR_OVLD_LOG_WRITES:
- value = srv_stats.log_writes;
- break;
-
- case MONITOR_OVLD_LOG_PADDED:
- value = srv_stats.log_padded;
+ value = log_sys.write_to_log;
break;
/* innodb_dblwr_writes */
@@ -1739,26 +1681,15 @@ srv_mon_process_existing_counter(
value = log_sys.get_lsn();
break;
- case MONITOR_PENDING_LOG_FLUSH:
- value = static_cast<mon_type_t>(log_sys.pending_flushes);
-
- break;
-
- case MONITOR_PENDING_CHECKPOINT_WRITE:
- value = log_sys.checkpoint_pending;
- break;
-
- case MONITOR_LOG_IO:
- mysql_mutex_lock(&log_sys.mutex);
- value = static_cast<mon_type_t>(log_sys.n_log_ios);
- mysql_mutex_unlock(&log_sys.mutex);
+ case MONITOR_OVLD_CHECKPOINTS:
+ value = log_sys.next_checkpoint_no;
break;
case MONITOR_LSN_CHECKPOINT_AGE:
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
value = static_cast<mon_type_t>(log_sys.get_lsn()
- log_sys.last_checkpoint_lsn);
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.rd_unlock();
break;
case MONITOR_OVLD_BUF_OLDEST_LSN:
diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc
index 2e9f5a0eff8..b6f6600f3df 100644
--- a/storage/innobase/srv/srv0srv.cc
+++ b/storage/innobase/srv/srv0srv.cc
@@ -61,7 +61,6 @@ Created 10/8/1995 Heikki Tuuri
#include "srv0start.h"
#include "trx0i_s.h"
#include "trx0purge.h"
-#include "ut0crc32.h"
#include "btr0defragment.h"
#include "ut0mem.h"
#include "fil0fil.h"
@@ -97,15 +96,15 @@ char* srv_data_home;
char* srv_undo_dir;
/** The number of tablespaces to use for rollback segments. */
-ulong srv_undo_tablespaces;
+uint srv_undo_tablespaces;
/** The number of UNDO tablespaces that are open and ready to use. */
-ulint srv_undo_tablespaces_open;
+uint32_t srv_undo_tablespaces_open;
/** The number of UNDO tablespaces that are active (hosting some rollback
segment). It is quite possible that some of the tablespaces doesn't host
any of the rollback-segment based on configuration used. */
-ulint srv_undo_tablespaces_active;
+uint32_t srv_undo_tablespaces_active;
/** Rate at which UNDO records should be purged. */
ulong srv_purge_rseg_truncate_frequency;
@@ -153,8 +152,6 @@ char* srv_log_group_home_dir;
/** The InnoDB redo log file size, or 0 when changing the redo log format
at startup (while disallowing writes to the redo log). */
ulonglong srv_log_file_size;
-/** innodb_log_buffer_size, in bytes */
-ulong srv_log_buffer_size;
/** innodb_flush_log_at_trx_commit */
ulong srv_flush_log_at_trx_commit;
/** innodb_flush_log_at_timeout */
@@ -162,9 +159,7 @@ uint srv_flush_log_at_timeout;
/** innodb_page_size */
ulong srv_page_size;
/** log2 of innodb_page_size; @see innodb_init_params() */
-ulong srv_page_size_shift;
-/** innodb_log_write_ahead_size */
-ulong srv_log_write_ahead_size;
+uint32_t srv_page_size_shift;
/** innodb_adaptive_flushing; try to flush dirty pages so as to avoid
IO bursts at the checkpoints. */
@@ -188,9 +183,8 @@ with mysql_mutex_lock(), which will wait until it gets the mutex. */
/** copy of innodb_buffer_pool_size */
ulint srv_buf_pool_size;
-/** Requested buffer pool chunk size. Each buffer pool instance consists
-of one or more chunks. */
-ulong srv_buf_pool_chunk_unit;
+/** Requested buffer pool chunk size */
+size_t srv_buf_pool_chunk_unit;
/** innodb_lru_scan_depth; number of blocks scanned in LRU flush batch */
ulong srv_LRU_scan_depth;
/** innodb_flush_neighbors; whether or not to flush neighbors of a block */
@@ -703,8 +697,6 @@ static void srv_refresh_innodb_monitor_stats(time_t current_time)
btr_cur_n_non_sea_old = btr_cur_n_non_sea;
#endif /* BTR_CUR_HASH_ADAPT */
- log_refresh_stats();
-
buf_refresh_io_stats();
srv_n_rows_inserted_old = srv_stats.n_rows_inserted;
@@ -990,12 +982,6 @@ srv_export_innodb_status(void)
export_vars.innodb_data_pending_writes =
ulint(MONITOR_VALUE(MONITOR_OS_PENDING_WRITES));
- export_vars.innodb_data_pending_fsyncs =
- log_sys.get_pending_flushes()
- + fil_n_pending_tablespace_flushes;
-
- export_vars.innodb_data_fsyncs = os_n_fsyncs;
-
export_vars.innodb_data_read = srv_stats.data_read;
export_vars.innodb_data_reads = os_n_file_reads;
@@ -1010,9 +996,6 @@ srv_export_innodb_status(void)
export_vars.innodb_data_written = srv_stats.data_written + dblwr;
- export_vars.innodb_buffer_pool_write_requests =
- srv_stats.buf_pool_write_requests;
-
export_vars.innodb_buffer_pool_bytes_data =
buf_pool.stat.LRU_bytes
+ (UT_LIST_GET_LEN(buf_pool.unzip_LRU)
@@ -1032,22 +1015,6 @@ srv_export_innodb_status(void)
export_vars.innodb_max_trx_id = trx_sys.get_max_trx_id();
export_vars.innodb_history_list_length = trx_sys.history_size_approx();
- export_vars.innodb_log_waits = srv_stats.log_waits;
-
- export_vars.innodb_os_log_written = srv_stats.os_log_written;
-
- export_vars.innodb_os_log_fsyncs = log_sys.get_flushes();
-
- export_vars.innodb_os_log_pending_fsyncs
- = log_sys.get_pending_flushes();
-
- export_vars.innodb_os_log_pending_writes =
- srv_stats.os_log_pending_writes;
-
- export_vars.innodb_log_write_requests = srv_stats.log_write_requests;
-
- export_vars.innodb_log_writes = srv_stats.log_writes;
-
mysql_mutex_lock(&lock_sys.wait_mutex);
export_vars.innodb_row_lock_waits = lock_sys.get_wait_cumulative();
@@ -1135,13 +1102,15 @@ srv_export_innodb_status(void)
mysql_mutex_unlock(&srv_innodb_monitor_mutex);
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
export_vars.innodb_lsn_current = log_sys.get_lsn();
export_vars.innodb_lsn_flushed = log_sys.get_flushed_lsn();
export_vars.innodb_lsn_last_checkpoint = log_sys.last_checkpoint_lsn;
export_vars.innodb_checkpoint_max_age = static_cast<ulint>(
log_sys.max_checkpoint_age);
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.rd_unlock();
+ export_vars.innodb_os_log_written = export_vars.innodb_lsn_current
+ - recv_sys.lsn;
export_vars.innodb_checkpoint_age = static_cast<ulint>(
export_vars.innodb_lsn_current
@@ -1219,7 +1188,7 @@ static void srv_monitor()
void srv_monitor_task(void*)
{
/* number of successive fatal timeouts observed */
- static lsn_t old_lsn = recv_sys.recovered_lsn;
+ static lsn_t old_lsn = recv_sys.lsn;
ut_ad(!srv_read_only_mode);
@@ -1606,7 +1575,8 @@ std::mutex purge_thread_count_mtx;
void srv_update_purge_thread_count(uint n)
{
std::lock_guard<std::mutex> lk(purge_thread_count_mtx);
- purge_create_background_thds(n);
+ ut_ad(n > 0);
+ ut_ad(n <= innodb_purge_threads_MAX);
srv_n_purge_threads = n;
srv_purge_thread_count_changed = 1;
}
@@ -1776,10 +1746,10 @@ void purge_coordinator_state::refresh(bool full)
lsn_hwm= adaptive_purge_threshold + series[n_threads];
}
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.rd_lock(SRW_LOCK_CALL);
const lsn_t last= log_sys.last_checkpoint_lsn,
max_age= log_sys.max_checkpoint_age;
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.rd_unlock();
lsn_age_factor= ulint(((log_sys.get_lsn() - last) * 100) / max_age);
}
@@ -1849,7 +1819,7 @@ static void purge_coordinator_callback(void*)
void srv_init_purge_tasks()
{
- purge_create_background_thds(srv_n_purge_threads);
+ purge_create_background_thds(innodb_purge_threads_MAX);
purge_coordinator_timer= srv_thread_pool->create_timer
(purge_coordinator_callback, nullptr);
}
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index a881ae0ad6a..ac70a52cb3b 100644
--- a/storage/innobase/srv/srv0start.cc
+++ b/storage/innobase/srv/srv0start.cc
@@ -96,7 +96,7 @@ Created 2/16/1996 Heikki Tuuri
#include "row0mysql.h"
#include "btr0pcur.h"
#include "zlib.h"
-#include "ut0crc32.h"
+#include "log.h"
/** We are prepared for a situation that we have this many threads waiting for
a transactional lock inside InnoDB. srv_start() sets the value. */
@@ -109,7 +109,7 @@ lsn_t srv_shutdown_lsn;
ibool srv_start_raw_disk_in_use;
/** UNDO tablespaces starts with space id. */
-ulint srv_undo_space_id_start;
+uint32_t srv_undo_space_id_start;
/** TRUE if the server is being started, before rolling back any
incomplete transactions */
@@ -118,14 +118,15 @@ bool srv_startup_is_before_trx_rollback_phase;
bool srv_is_being_started;
/** TRUE if the server was successfully started */
bool srv_was_started;
-/** The original value of srv_log_file_size (innodb_log_file_size) */
-static ulonglong srv_log_file_size_requested;
/** whether srv_start() has been called */
static bool srv_start_has_been_called;
/** Whether any undo log records can be generated */
bool srv_undo_sources;
+/** innodb_encrypt_log */
+my_bool srv_encrypt_log;
+
#ifdef UNIV_DEBUG
/** InnoDB system tablespace to set during recovery */
uint srv_sys_space_size_debug;
@@ -167,160 +168,68 @@ static PSI_stage_info* srv_stages[] =
};
#endif /* HAVE_PSI_STAGE_INTERFACE */
-/*********************************************************************//**
-Check if a file can be opened in read-write mode.
-@return true if it doesn't exist or can be opened in rw mode. */
-static
-bool
-srv_file_check_mode(
-/*================*/
- const char* name) /*!< in: filename to check */
+/** Delete any garbage log files */
+static void delete_log_files()
{
- os_file_stat_t stat;
-
- memset(&stat, 0x0, sizeof(stat));
-
- dberr_t err = os_file_get_status(
- name, &stat, true, srv_read_only_mode);
-
- if (err == DB_FAIL) {
- ib::error() << "os_file_get_status() failed on '" << name
- << "'. Can't determine file permissions.";
- return(false);
-
- } else if (err == DB_SUCCESS) {
-
- /* Note: stat.rw_perm is only valid of files */
-
- if (stat.type == OS_FILE_TYPE_FILE) {
-
- if (!stat.rw_perm) {
- const char* mode = srv_read_only_mode
- ? "read" : "read-write";
- ib::error() << name << " can't be opened in "
- << mode << " mode.";
- return(false);
- }
- } else {
- /* Not a regular file, bail out. */
- ib::error() << "'" << name << "' not a regular file.";
-
- return(false);
- }
- } else {
-
- /* This is OK. If the file create fails on RO media, there
- is nothing we can do. */
-
- ut_a(err == DB_NOT_FOUND);
- }
-
- return(true);
+ for (size_t i= 1; i < 102; i++)
+ delete_log_file(std::to_string(i).c_str());
}
-/** Initial number of the redo log file */
-static const char INIT_LOG_FILE0[]= "101";
-
/** Creates log file.
-@param[in] create_new_db whether the database is being initialized
-@param[in] lsn FIL_PAGE_FILE_FLUSH_LSN value
-@param[out] logfile0 name of the log file
+@param create_new_db whether the database is being initialized
+@param lsn log sequence number
+@param logfile0 name of the log file
@return DB_SUCCESS or error code */
-static dberr_t create_log_file(bool create_new_db, lsn_t lsn,
- std::string& logfile0)
+static dberr_t create_log_file(bool create_new_db, lsn_t lsn)
{
- if (srv_read_only_mode) {
- ib::error() << "Cannot create log file in read-only mode";
- return DB_READ_ONLY;
- }
+ ut_ad(!srv_read_only_mode);
- if (!log_set_capacity(srv_log_file_size_requested)) {
- return(DB_ERROR);
- }
-
- /* Crashing after deleting the first file should be
- recoverable. The buffer pool was clean, and we can simply
- create log file from the scratch. */
- DBUG_EXECUTE_IF("innodb_log_abort_6", delete_log_file("0");
- return DB_ERROR;);
-
- for (size_t i = 0; i < 102; i++) {
- delete_log_file(std::to_string(i).c_str());
- }
+ /* We will retain ib_logfile0 until we have written a new logically
+ empty log as ib_logfile101 and atomically renamed it to
+ ib_logfile0 in log_t::rename_resized(). */
+ delete_log_files();
- DBUG_PRINT("ib_log", ("After innodb_log_abort_6"));
DBUG_ASSERT(!buf_pool.any_io_pending());
- DBUG_EXECUTE_IF("innodb_log_abort_7", return DB_ERROR;);
- DBUG_PRINT("ib_log", ("After innodb_log_abort_7"));
-
- logfile0 = get_log_file_path(LOG_FILE_NAME_PREFIX)
- .append(INIT_LOG_FILE0);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
+ log_sys.set_capacity();
+ std::string logfile0{get_log_file_path("ib_logfile101")};
bool ret;
- pfs_os_file_t file = os_file_create(
- innodb_log_file_key, logfile0.c_str(),
- OS_FILE_CREATE|OS_FILE_ON_ERROR_NO_EXIT, OS_FILE_NORMAL,
- OS_LOG_FILE, srv_read_only_mode, &ret);
+ os_file_t file{
+ os_file_create_func(logfile0.c_str(),
+ OS_FILE_CREATE | OS_FILE_ON_ERROR_NO_EXIT,
+ OS_FILE_NORMAL, OS_LOG_FILE, false, &ret)
+ };
if (!ret) {
- ib::error() << "Cannot create " << logfile0;
+ sql_print_error("InnoDB: Cannot create %.*s",
+ int(logfile0.size()), logfile0.data());
+err_exit:
+ log_sys.latch.wr_unlock();
return DB_ERROR;
}
- ib::info() << "Setting log file " << logfile0 << " size to "
- << srv_log_file_size << " bytes";
-
ret = os_file_set_size(logfile0.c_str(), file, srv_log_file_size);
if (!ret) {
- os_file_close(file);
+ os_file_close_func(file);
ib::error() << "Cannot set log file " << logfile0
- << " size to " << srv_log_file_size << " bytes";
- return DB_ERROR;
+ << " size to " << ib::bytes_iec{srv_log_file_size};
+ goto err_exit;
}
- ret = os_file_close(file);
- ut_a(ret);
-
- DBUG_EXECUTE_IF("innodb_log_abort_8", return(DB_ERROR););
- DBUG_PRINT("ib_log", ("After innodb_log_abort_8"));
-
- /* We did not create the first log file initially as LOG_FILE_NAME, so
- that crash recovery cannot find it until it has been completed and
- renamed. */
-
- log_sys.log.create();
-
- log_sys.log.open_file(logfile0);
+ log_sys.set_latest_format(srv_encrypt_log);
+ log_sys.attach(file, srv_log_file_size);
if (!fil_system.sys_space->open(create_new_db)) {
- return DB_ERROR;
+ goto err_exit;
}
/* Create a log checkpoint. */
- mysql_mutex_lock(&log_sys.mutex);
if (log_sys.is_encrypted() && !log_crypt_init()) {
- return DB_ERROR;
+ goto err_exit;
}
ut_d(recv_no_log_write = false);
- lsn = ut_uint64_align_up(lsn, OS_FILE_LOG_BLOCK_SIZE);
- log_sys.set_lsn(lsn + LOG_BLOCK_HDR_SIZE);
- log_sys.log.set_lsn(lsn);
- log_sys.log.set_lsn_offset(LOG_FILE_HDR_SIZE);
-
- log_sys.buf_next_to_write = 0;
- log_sys.write_lsn = lsn;
-
- log_sys.next_checkpoint_no = 0;
- log_sys.last_checkpoint_lsn = 0;
-
- memset(log_sys.buf, 0, srv_log_buffer_size);
- log_block_init(log_sys.buf, lsn);
- log_block_set_first_rec_group(log_sys.buf, LOG_BLOCK_HDR_SIZE);
- memset(log_sys.flush_buf, 0, srv_log_buffer_size);
-
- log_sys.buf_free = LOG_BLOCK_HDR_SIZE;
-
- log_sys.log.write_header_durable(lsn);
+ log_sys.create(lsn);
ut_ad(srv_startup_is_before_trx_rollback_phase);
if (create_new_db) {
@@ -329,7 +238,7 @@ static dberr_t create_log_file(bool create_new_db, lsn_t lsn,
/* Enable checkpoints in buf_flush_page_cleaner(). */
recv_sys.recovery_on = false;
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
log_make_checkpoint();
log_buffer_flush_to_disk();
@@ -337,42 +246,29 @@ static dberr_t create_log_file(bool create_new_db, lsn_t lsn,
return DB_SUCCESS;
}
-/** Rename the first redo log file.
-@param[in] lsn FIL_PAGE_FILE_FLUSH_LSN value
-@param[in,out] logfile0 name of the first log file
-@return error code
-@retval DB_SUCCESS on successful operation */
-MY_ATTRIBUTE((warn_unused_result))
-static dberr_t create_log_file_rename(lsn_t lsn, std::string &logfile0)
+/** Rename the redo log file after resizing.
+@return whether an error occurred */
+bool log_t::rename_resized() noexcept
{
ut_ad(!srv_log_file_created);
ut_d(srv_log_file_created= true);
- DBUG_EXECUTE_IF("innodb_log_abort_9", return (DB_ERROR););
- DBUG_PRINT("ib_log", ("After innodb_log_abort_9"));
-
- /* Rename the first log file, now that a log checkpoint has been created. */
- auto new_name = get_log_file_path();
-
- ib::info() << "Renaming log file " << logfile0 << " to " << new_name;
+ std::string old_name{get_log_file_path("ib_logfile101")};
+ std::string new_name{get_log_file_path()};
- mysql_mutex_lock(&log_sys.mutex);
- ut_ad(logfile0.size() == 2 + new_name.size());
- logfile0= new_name;
- dberr_t err= log_sys.log.rename(std::move(new_name));
+ if (IF_WIN(MoveFileEx(old_name.c_str(), new_name.c_str(),
+ MOVEFILE_REPLACE_EXISTING),
+ !rename(old_name.c_str(), new_name.c_str())))
+ return false;
- mysql_mutex_unlock(&log_sys.mutex);
-
- DBUG_EXECUTE_IF("innodb_log_abort_10", err= DB_ERROR;);
-
- if (err == DB_SUCCESS)
- ib::info() << "New log file created, LSN=" << lsn;
-
- return err;
+ sql_print_error("InnoDB: Failed to rename log from %.*s to %.*s",
+ int(old_name.size()), old_name.data(),
+ int(new_name.size()), new_name.data());
+ return true;
}
/** Create an undo tablespace file
-@param[in] name file name
+@param[in] name file name
@return DB_SUCCESS or error code */
static dberr_t srv_undo_tablespace_create(const char* name)
{
@@ -410,7 +306,8 @@ static dberr_t srv_undo_tablespace_create(const char* name)
" be created";
ib::info() << "Setting file " << name << " size to "
- << (SRV_UNDO_TABLESPACE_SIZE_IN_PAGES >> (20 - srv_page_size_shift)) << " MB";
+ << ib::bytes_iec{SRV_UNDO_TABLESPACE_SIZE_IN_PAGES
+ << srv_page_size_shift};
ib::info() << "Database physically writes the file full: "
<< "wait...";
@@ -440,8 +337,8 @@ static dberr_t srv_validate_undo_tablespaces()
if (srv_undo_tablespaces > srv_undo_tablespaces_open)
{
ib::error() << "Expected to open innodb_undo_tablespaces="
- << srv_undo_tablespaces
- << " but was able to find only "
+ << srv_undo_tablespaces
+ << " but was able to find only "
<< srv_undo_tablespaces_open;
return DB_ERROR;
@@ -449,17 +346,17 @@ static dberr_t srv_validate_undo_tablespaces()
else if (srv_undo_tablespaces_open > 0)
{
ib::info() << "Opened " << srv_undo_tablespaces_open
- << " undo tablespaces";
+ << " undo tablespaces";
if (srv_undo_tablespaces == 0)
ib::warn() << "innodb_undo_tablespaces=0 disables"
- " dedicated undo log tablespaces";
+ " dedicated undo log tablespaces";
}
return DB_SUCCESS;
}
/** @return the number of active undo tablespaces (except system tablespace) */
-static ulint trx_rseg_get_n_undo_tablespaces()
+static uint32_t trx_rseg_get_n_undo_tablespaces()
{
std::set<uint32_t> space_ids;
mtr_t mtr;
@@ -468,10 +365,10 @@ static ulint trx_rseg_get_n_undo_tablespaces()
if (const buf_block_t *sys_header= trx_sysf_get(&mtr, false))
for (ulint rseg_id= 0; rseg_id < TRX_SYS_N_RSEGS; rseg_id++)
if (trx_sysf_rseg_get_page_no(sys_header, rseg_id) != FIL_NULL)
- if (uint32_t space= trx_sysf_rseg_get_space(sys_header, rseg_id))
- space_ids.insert(space);
+ if (uint32_t space= trx_sysf_rseg_get_space(sys_header, rseg_id))
+ space_ids.insert(space);
mtr.commit();
- return space_ids.size();
+ return static_cast<uint32_t>(space_ids.size());
}
/** Open an undo tablespace.
@@ -480,11 +377,12 @@ static ulint trx_rseg_get_n_undo_tablespaces()
@param[in] i undo tablespace count
@return undo tablespace identifier
@retval 0 on failure */
-static ulint srv_undo_tablespace_open(bool create, const char* name, ulint i)
+static uint32_t srv_undo_tablespace_open(bool create, const char *name,
+ uint32_t i)
{
bool success;
- ulint space_id= 0;
- ulint fsp_flags= 0;
+ uint32_t space_id= 0;
+ uint32_t fsp_flags= 0;
if (create)
{
@@ -556,8 +454,8 @@ err_exit:
fil_set_max_space_id_if_bigger(space_id);
fil_space_t *space= fil_space_t::create(space_id, fsp_flags,
- FIL_TYPE_TABLESPACE, nullptr,
- FIL_ENCRYPTION_DEFAULT, true);
+ FIL_TYPE_TABLESPACE, nullptr,
+ FIL_ENCRYPTION_DEFAULT, true);
ut_a(fil_validate());
ut_a(space);
@@ -590,7 +488,7 @@ dberr_t
srv_check_undo_redo_logs_exists()
{
bool ret;
- pfs_os_file_t fh;
+ os_file_t fh;
char name[OS_FILE_MAX_PATH];
/* Check if any undo tablespaces exist */
@@ -598,8 +496,8 @@ srv_check_undo_redo_logs_exists()
snprintf(name, sizeof name, "%s/undo%03zu", srv_undo_dir, i);
- fh = os_file_create(
- innodb_data_file_key, name,
+ fh = os_file_create_func(
+ name,
OS_FILE_OPEN_RETRY
| OS_FILE_ON_ERROR_NO_EXIT
| OS_FILE_ON_ERROR_SILENT,
@@ -609,7 +507,7 @@ srv_check_undo_redo_logs_exists()
&ret);
if (ret) {
- os_file_close(fh);
+ os_file_close_func(fh);
ib::error()
<< "undo tablespace '" << name << "' exists."
" Creating system tablespace with existing undo"
@@ -623,14 +521,14 @@ srv_check_undo_redo_logs_exists()
/* Check if redo log file exists */
auto logfilename = get_log_file_path();
- fh = os_file_create(innodb_log_file_key, logfilename.c_str(),
- OS_FILE_OPEN_RETRY | OS_FILE_ON_ERROR_NO_EXIT
- | OS_FILE_ON_ERROR_SILENT,
- OS_FILE_NORMAL, OS_LOG_FILE, srv_read_only_mode,
- &ret);
+ fh = os_file_create_func(logfilename.c_str(),
+ OS_FILE_OPEN_RETRY | OS_FILE_ON_ERROR_NO_EXIT
+ | OS_FILE_ON_ERROR_SILENT,
+ OS_FILE_NORMAL, OS_LOG_FILE,
+ srv_read_only_mode, &ret);
if (ret) {
- os_file_close(fh);
+ os_file_close_func(fh);
ib::error() << "redo log file '" << logfilename
<< "' exists. Creating system tablespace with"
" existing redo log file is not recommended."
@@ -642,24 +540,25 @@ srv_check_undo_redo_logs_exists()
return(DB_SUCCESS);
}
-static dberr_t srv_all_undo_tablespaces_open(bool create_new_db, ulint n_undo)
+static dberr_t srv_all_undo_tablespaces_open(bool create_new_db,
+ uint32_t n_undo)
{
/* Open all the undo tablespaces that are currently in use. If we
fail to open any of these it is a fatal error. The tablespace ids
should be contiguous. It is a fatal error because they are required
for recovery and are referenced by the UNDO logs (a.k.a RBS). */
- ulint prev_id= create_new_db ? srv_undo_space_id_start - 1 : 0;
+ uint32_t prev_id= create_new_db ? srv_undo_space_id_start - 1 : 0;
- for (ulint i= 0; i < n_undo; ++i)
+ for (uint32_t i= 0; i < n_undo; ++i)
{
char name[OS_FILE_MAX_PATH];
- snprintf(name, sizeof name, "%s/undo%03zu", srv_undo_dir, i + 1);
- ulint space_id= srv_undo_tablespace_open(create_new_db, name, i);
+ snprintf(name, sizeof name, "%s/undo%03u", srv_undo_dir, i + 1);
+ uint32_t space_id= srv_undo_tablespace_open(create_new_db, name, i);
if (!space_id)
{
if (!create_new_db)
- break;
+ break;
ib::error() << "Unable to open create tablespace '" << name << "'.";
return DB_ERROR;
}
@@ -680,11 +579,11 @@ static dberr_t srv_all_undo_tablespaces_open(bool create_new_db, ulint n_undo)
not in use and therefore not required by recovery. We only check
that there are no gaps. */
- for (ulint i= prev_id + 1; i < srv_undo_space_id_start + TRX_SYS_N_RSEGS;
+ for (uint32_t i= prev_id + 1; i < srv_undo_space_id_start + TRX_SYS_N_RSEGS;
++i)
{
char name[OS_FILE_MAX_PATH];
- snprintf(name, sizeof name, "%s/undo%03zu", srv_undo_dir, i);
+ snprintf(name, sizeof name, "%s/undo%03u", srv_undo_dir, i);
if (!srv_undo_tablespace_open(create_new_db, name, i))
break;
++srv_undo_tablespaces_open;
@@ -696,8 +595,7 @@ static dberr_t srv_all_undo_tablespaces_open(bool create_new_db, ulint n_undo)
/** Open the configured number of dedicated undo tablespaces.
@param[in] create_new_db whether the database is being initialized
@return DB_SUCCESS or error code */
-dberr_t
-srv_undo_tablespaces_init(bool create_new_db)
+dberr_t srv_undo_tablespaces_init(bool create_new_db)
{
srv_undo_tablespaces_open= 0;
@@ -721,8 +619,8 @@ srv_undo_tablespaces_init(bool create_new_db)
snprintf(name, sizeof name, "%s/undo%03zu", srv_undo_dir, i + 1);
if (dberr_t err= srv_undo_tablespace_create(name))
{
- ib::error() << "Could not create undo tablespace '" << name << "'.";
- return err;
+ ib::error() << "Could not create undo tablespace '" << name << "'.";
+ return err;
}
}
}
@@ -733,8 +631,8 @@ srv_undo_tablespaces_init(bool create_new_db)
already exist. */
srv_undo_tablespaces_active= srv_undo_tablespaces;
- ulint n_undo= (create_new_db || srv_operation == SRV_OPERATION_BACKUP ||
- srv_operation == SRV_OPERATION_RESTORE_DELTA)
+ uint32_t n_undo= (create_new_db || srv_operation == SRV_OPERATION_BACKUP ||
+ srv_operation == SRV_OPERATION_RESTORE_DELTA)
? srv_undo_tablespaces : TRX_SYS_N_RSEGS;
if (dberr_t err= srv_all_undo_tablespaces_open(create_new_db, n_undo))
@@ -748,7 +646,7 @@ srv_undo_tablespaces_init(bool create_new_db)
if (create_new_db)
{
mtr_t mtr;
- for (ulint i= 0; i < srv_undo_tablespaces; ++i)
+ for (uint32_t i= 0; i < srv_undo_tablespaces; ++i)
{
mtr.start();
dberr_t err= fsp_header_init(fil_space_get(srv_undo_space_id_start + i),
@@ -777,8 +675,6 @@ srv_open_tmp_tablespace(bool create_new_db)
srv_tmp_space.delete_files();
srv_tmp_space.set_ignore_read_only(true);
- ib::info() << "Creating shared tablespace for temporary tables";
-
bool create_new_temp_space;
srv_tmp_space.set_space_id(SRV_TMP_SPACE_ID);
@@ -793,7 +689,7 @@ srv_open_tmp_tablespace(bool create_new_db)
} else if (err != DB_SUCCESS) {
ib::error() << "Could not create the shared innodb_temporary.";
} else if ((err = srv_tmp_space.open_or_create(
- true, create_new_db, &sum_of_new_sizes, NULL))
+ true, create_new_db, &sum_of_new_sizes))
!= DB_SUCCESS) {
ib::error() << "Unable to create the shared innodb_temporary";
} else if (fil_system.temp_space->open(true)) {
@@ -885,7 +781,7 @@ srv_init_abort_low(
" with error " << err << ". You may need"
" to delete the ibdata1 file before trying to start"
" up again.";
- } else {
+ } else if (srv_operation == SRV_OPERATION_NORMAL) {
ib::error() << "Plugin initialization aborted"
#ifdef UNIV_DEBUG
" at " << innobase_basename(file) << "[" << line << "]"
@@ -900,9 +796,8 @@ srv_init_abort_low(
/** Prepare to delete the redo log file. Flush the dirty pages from all the
buffer pools. Flush the redo log buffer to the redo log file.
-@param[in] old_exists old redo log file exists
@return lsn upto which data pages have been flushed. */
-static lsn_t srv_prepare_to_delete_redo_log_file(bool old_exists)
+static lsn_t srv_prepare_to_delete_redo_log_file()
{
DBUG_ENTER("srv_prepare_to_delete_redo_log_file");
@@ -911,33 +806,33 @@ static lsn_t srv_prepare_to_delete_redo_log_file(bool old_exists)
/* Clean the buffer pool. */
buf_flush_sync();
- if (log_sys.log.subformat != 2)
- srv_log_file_size= 0;
-
DBUG_EXECUTE_IF("innodb_log_abort_1", DBUG_RETURN(0););
DBUG_PRINT("ib_log", ("After innodb_log_abort_1"));
- mysql_mutex_lock(&log_sys.mutex);
- const bool latest_format= (log_sys.log.format & ~log_t::FORMAT_ENCRYPTED) ==
- log_t::FORMAT_10_5;
- lsn_t flushed_lsn= log_sys.get_lsn();
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
+ const bool latest_format{log_sys.is_latest()};
+ lsn_t flushed_lsn{log_sys.get_lsn()};
- if (latest_format)
+ if (latest_format && !(log_sys.file_size & 4095) &&
+ flushed_lsn != log_sys.next_checkpoint_lsn +
+ (log_sys.is_encrypted()
+ ? SIZE_OF_FILE_CHECKPOINT + 8
+ : SIZE_OF_FILE_CHECKPOINT))
{
- fil_names_clear(flushed_lsn, false);
+ fil_names_clear(flushed_lsn);
flushed_lsn= log_sys.get_lsn();
}
{
const char *msg;
- if (!latest_format || srv_log_file_size == 0)
+ if (!latest_format)
{
msg= "Upgrading redo log: ";
same_size:
- ib::info() << msg << srv_log_file_size_requested << " bytes; LSN="
- << flushed_lsn;
+ ib::info() << msg << ib::bytes_iec(srv_log_file_size)
+ << "; LSN=" << flushed_lsn;
}
- else if (old_exists && srv_log_file_size == srv_log_file_size_requested)
+ else if (srv_log_file_size == log_sys.file_size)
{
msg= srv_encrypt_log
? "Encrypting redo log: " : "Removing redo log encryption: ";
@@ -952,19 +847,16 @@ same_size:
? "Encrypting and resizing"
: "Removing encryption and resizing";
- ib::info() << msg << " redo log from " << srv_log_file_size << " to "
- << srv_log_file_size_requested
- << " bytes; LSN=" << flushed_lsn;
+ ib::info() << msg << " redo log from "
+ << ib::bytes_iec{log_sys.file_size} << " to "
+ << ib::bytes_iec{srv_log_file_size}
+ << "; LSN=" << flushed_lsn;
}
}
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
- if (flushed_lsn != log_sys.get_flushed_lsn())
- {
- log_write_up_to(flushed_lsn, false);
- log_sys.log.flush();
- }
+ log_write_up_to(flushed_lsn, false);
ut_ad(flushed_lsn == log_sys.get_lsn());
ut_ad(!buf_pool.any_io_pending());
@@ -972,88 +864,17 @@ same_size:
DBUG_RETURN(flushed_lsn);
}
-/** Tries to locate LOG_FILE_NAME and check it's size, etc
-@param[out] log_file_found returns true here if correct file was found
-@return dberr_t with DB_SUCCESS or some error */
-static dberr_t find_and_check_log_file(bool &log_file_found)
-{
- log_file_found= false;
-
- auto logfile0= get_log_file_path();
- os_file_stat_t stat_info;
- const dberr_t err= os_file_get_status(logfile0.c_str(), &stat_info, false,
- srv_read_only_mode);
-
- auto is_operation_restore= []() -> bool {
- return srv_operation == SRV_OPERATION_RESTORE ||
- srv_operation == SRV_OPERATION_RESTORE_EXPORT;
- };
-
- if (err == DB_NOT_FOUND)
- {
- if (is_operation_restore())
- return DB_NOT_FOUND;
-
- /* This might be first start after mariabackup
- copy-back or move-back. */
- srv_start_after_restore= true;
- return DB_SUCCESS;
- }
-
- if (stat_info.type != OS_FILE_TYPE_FILE)
- return DB_SUCCESS;
-
- if (!srv_file_check_mode(logfile0.c_str()))
- return DB_ERROR;
-
- const os_offset_t size= stat_info.size;
- ut_a(size != (os_offset_t) -1);
-
- if (size % OS_FILE_LOG_BLOCK_SIZE)
- {
- ib::error() << "Log file " << logfile0 << " size " << size
- << " is not a multiple of " << OS_FILE_LOG_BLOCK_SIZE
- << " bytes";
- return DB_ERROR;
- }
-
- if (size == 0 && is_operation_restore())
- {
- /* Tolerate an empty LOG_FILE_NAME from a previous run of
- mariabackup --prepare. */
- return DB_NOT_FOUND;
- }
- /* The first log file must consist of at least the following 512-byte pages:
- header, checkpoint page 1, empty, checkpoint page 2, redo log page(s).
-
- Mariabackup --prepare would create an empty LOG_FILE_NAME. Tolerate it. */
- if (size == 0)
- srv_start_after_restore= true;
- else if (size <= OS_FILE_LOG_BLOCK_SIZE * 4)
- {
- ib::error() << "Log file " << logfile0 << " size " << size
- << " is too small";
- return DB_ERROR;
- }
- srv_log_file_size= size;
-
- log_file_found= true;
- return DB_SUCCESS;
-}
-
static tpool::task_group rollback_all_recovered_group(1);
static tpool::task rollback_all_recovered_task(trx_rollback_all_recovered,
- nullptr,
- &rollback_all_recovered_group);
+ nullptr,
+ &rollback_all_recovered_group);
/** Start InnoDB.
@param[in] create_new_db whether to create a new database
@return DB_SUCCESS or error code */
dberr_t srv_start(bool create_new_db)
{
- lsn_t flushed_lsn;
dberr_t err = DB_SUCCESS;
- bool srv_log_file_found = true;
mtr_t mtr;
ut_ad(srv_operation == SRV_OPERATION_NORMAL
@@ -1205,8 +1026,8 @@ dberr_t srv_start(bool create_new_db)
fil_system.create(srv_file_per_table ? 50000 : 5000);
ib::info() << "Initializing buffer pool, total size = "
- << srv_buf_pool_size
- << ", chunk size = " << srv_buf_pool_chunk_unit;
+ << ib::bytes_iec{srv_buf_pool_size}
+ << ", chunk size = " << ib::bytes_iec{srv_buf_pool_chunk_unit};
if (buf_pool.create()) {
ib::error() << "Cannot allocate memory for the buffer pool";
@@ -1223,8 +1044,8 @@ dberr_t srv_start(bool create_new_db)
if (srv_buf_pool_size <= 5 * 1024 * 1024) {
ib::info() << "Small buffer pool size ("
- << srv_buf_pool_size / 1024 / 1024
- << "M), the flst_validate() debug function can cause a"
+ << ib::bytes_iec{srv_buf_pool_size}
+ << "), the flst_validate() debug function can cause a"
<< " deadlock if the buffer pool fills up.";
}
#endif /* UNIV_DEBUG */
@@ -1254,7 +1075,7 @@ dberr_t srv_start(bool create_new_db)
ulint sum_of_new_sizes;
err = srv_sys_space.open_or_create(
- false, create_new_db, &sum_of_new_sizes, &flushed_lsn);
+ false, create_new_db, &sum_of_new_sizes);
switch (err) {
case DB_SUCCESS:
@@ -1276,87 +1097,26 @@ dberr_t srv_start(bool create_new_db)
return(srv_init_abort(err));
}
- srv_log_file_size_requested = srv_log_file_size;
-
if (innodb_encrypt_temporary_tables && !log_crypt_init()) {
return srv_init_abort(DB_ERROR);
}
- std::string logfile0;
- bool create_new_log = create_new_db;
if (create_new_db) {
- flushed_lsn = log_sys.get_lsn();
- log_sys.set_flushed_lsn(flushed_lsn);
+ lsn_t flushed_lsn = log_sys.init_lsn();
- err = create_log_file(true, flushed_lsn, logfile0);
+ err = create_log_file(true, flushed_lsn);
if (err != DB_SUCCESS) {
- for (Tablespace::const_iterator
- i = srv_sys_space.begin();
- i != srv_sys_space.end(); i++) {
+ for (const Datafile &file: srv_sys_space) {
os_file_delete(innodb_data_file_key,
- i->filepath());
- }
- return(srv_init_abort(err));
- }
- } else {
- srv_log_file_size = 0;
-
- bool log_file_found;
- if (dberr_t err = find_and_check_log_file(log_file_found)) {
- if (err == DB_NOT_FOUND) {
- return DB_SUCCESS;
+ file.filepath());
}
return srv_init_abort(err);
}
-
- create_new_log = srv_log_file_size == 0;
- if (create_new_log) {
- if (flushed_lsn < lsn_t(1000)) {
- ib::error()
- << "Cannot create log file because"
- " data files are corrupt or the"
- " database was not shut down cleanly"
- " after creating the data files.";
- return srv_init_abort(DB_ERROR);
- }
-
- srv_log_file_size = srv_log_file_size_requested;
-
- err = create_log_file(false, flushed_lsn, logfile0);
-
- if (err == DB_SUCCESS) {
- err = create_log_file_rename(flushed_lsn,
- logfile0);
- }
-
- if (err != DB_SUCCESS) {
- return(srv_init_abort(err));
- }
-
- /* Suppress the message about
- crash recovery. */
- flushed_lsn = log_sys.get_lsn();
- goto file_checked;
- }
-
- srv_log_file_found = log_file_found;
-
- log_sys.log.open_file(get_log_file_path());
-
- log_sys.log.create();
-
- if (!log_set_capacity(srv_log_file_size_requested)) {
- return(srv_init_abort(DB_ERROR));
- }
-
- /* Enable checkpoints in the page cleaner. */
- recv_sys.recovery_on = false;
}
-file_checked:
/* Open log file and data files in the systemtablespace: we keep
- them open until database shutdown */
+ them open until database shutdown */
ut_d(fil_system.sys_space->recv_size = srv_sys_space_size_debug);
err = fil_system.sys_space->open(create_new_db)
@@ -1421,16 +1181,8 @@ file_checked:
buf_flush_sync();
- flushed_lsn = log_sys.get_lsn();
-
- err = fil_write_flushed_lsn(flushed_lsn);
-
- if (err == DB_SUCCESS) {
- err = create_log_file_rename(flushed_lsn, logfile0);
- }
-
- if (err != DB_SUCCESS) {
- return(srv_init_abort(err));
+ if (log_sys.rename_resized()) {
+ return(srv_init_abort(DB_ERROR));
}
} else {
/* Suppress warnings in fil_space_t::create() for files
@@ -1441,9 +1193,7 @@ file_checked:
/* We always try to do a recovery, even if the database had
been shut down normally: this is the normal startup path */
- err = create_new_log
- ? DB_SUCCESS
- : recv_recovery_from_checkpoint_start(flushed_lsn);
+ err = recv_recovery_from_checkpoint_start();
recv_sys.close_files();
recv_sys.dblwr.pages.clear();
@@ -1488,7 +1238,9 @@ file_checked:
respective file pages, for the last batch of
recv_group_scan_log_recs(). */
+ mysql_mutex_lock(&recv_sys.mutex);
recv_sys.apply(true);
+ mysql_mutex_unlock(&recv_sys.mutex);
if (recv_sys.is_corrupt_log()
|| recv_sys.is_corrupt_fs()) {
@@ -1505,8 +1257,9 @@ file_checked:
fil_system.space_id_reuse_warned = false;
if (!srv_read_only_mode) {
- const ulint flags = FSP_FLAGS_PAGE_SSIZE();
- for (ulint id = 0; id <= srv_undo_tablespaces; id++) {
+ const uint32_t flags = FSP_FLAGS_PAGE_SSIZE();
+ for (uint32_t id = 0; id <= srv_undo_tablespaces;
+ id++) {
if (fil_space_t* space = fil_space_get(id)) {
fsp_flags_try_adjust(space, flags);
}
@@ -1588,31 +1341,9 @@ file_checked:
}
}
- if (srv_operation == SRV_OPERATION_RESTORE
- || srv_operation == SRV_OPERATION_RESTORE_EXPORT) {
- buf_flush_sync();
- recv_sys.debug_free();
- /* After applying the redo log from
- SRV_OPERATION_BACKUP, flush the changes
- to the data files and truncate or delete the log.
- Unless --export is specified, no further change to
- InnoDB files is needed. */
- ut_ad(srv_force_recovery <= SRV_FORCE_IGNORE_CORRUPT);
- ut_ad(recv_no_log_write);
- err = fil_write_flushed_lsn(log_sys.get_lsn());
- DBUG_ASSERT(!buf_pool.any_io_pending());
- log_sys.log.close_file();
- if (err == DB_SUCCESS) {
- bool trunc = srv_operation
- == SRV_OPERATION_RESTORE;
- if (!trunc) {
- delete_log_file("0");
- } else {
- auto logfile0 = get_log_file_path();
- /* Truncate the first log file. */
- fclose(fopen(logfile0.c_str(), "w"));
- }
- }
+ if (srv_operation != SRV_OPERATION_NORMAL) {
+ ut_ad(srv_operation == SRV_OPERATION_RESTORE_EXPORT
+ || srv_operation == SRV_OPERATION_RESTORE);
return(err);
}
@@ -1624,19 +1355,17 @@ file_checked:
/* Completely ignore the redo log. */
} else if (srv_read_only_mode) {
/* Leave the redo log alone. */
- } else if (srv_log_file_size_requested == srv_log_file_size
- && srv_log_file_found
- && log_sys.log.format
+ } else if (log_sys.file_size == srv_log_file_size
+ && log_sys.format
== (srv_encrypt_log
- ? log_t::FORMAT_ENC_10_5
- : log_t::FORMAT_10_5)
- && log_sys.log.subformat == 2) {
+ ? log_t::FORMAT_ENC_10_8
+ : log_t::FORMAT_10_8)) {
/* No need to add or remove encryption,
- upgrade, downgrade, or resize. */
+ upgrade, or resize. */
+ delete_log_files();
} else {
/* Prepare to delete the old redo log file */
- flushed_lsn = srv_prepare_to_delete_redo_log_file(
- srv_log_file_found);
+ const lsn_t lsn{srv_prepare_to_delete_redo_log_file()};
DBUG_EXECUTE_IF("innodb_log_abort_1",
return(srv_init_abort(DB_ERROR)););
@@ -1646,37 +1375,17 @@ file_checked:
ut_d(recv_no_log_write = true);
DBUG_ASSERT(!buf_pool.any_io_pending());
- DBUG_EXECUTE_IF("innodb_log_abort_3",
- return(srv_init_abort(DB_ERROR)););
- DBUG_PRINT("ib_log", ("After innodb_log_abort_3"));
-
- /* Stamp the LSN to the data files. */
- err = fil_write_flushed_lsn(flushed_lsn);
-
- DBUG_EXECUTE_IF("innodb_log_abort_4", err = DB_ERROR;);
- DBUG_PRINT("ib_log", ("After innodb_log_abort_4"));
-
- if (err != DB_SUCCESS) {
- return(srv_init_abort(err));
- }
-
/* Close the redo log file, so that we can replace it */
- log_sys.log.close_file();
+ log_sys.close_file();
DBUG_EXECUTE_IF("innodb_log_abort_5",
return(srv_init_abort(DB_ERROR)););
DBUG_PRINT("ib_log", ("After innodb_log_abort_5"));
- ib::info()
- << "Starting to delete and rewrite log file.";
-
- srv_log_file_size = srv_log_file_size_requested;
+ err = create_log_file(false, lsn);
- err = create_log_file(false, flushed_lsn, logfile0);
-
- if (err == DB_SUCCESS) {
- err = create_log_file_rename(flushed_lsn,
- logfile0);
+ if (err == DB_SUCCESS && log_sys.rename_resized()) {
+ err = DB_ERROR;
}
if (err != DB_SUCCESS) {
@@ -1866,10 +1575,18 @@ skip_monitors:
srv_is_being_started = false;
if (srv_print_verbose_log) {
- ib::info() << INNODB_VERSION_STR
- << " started; log sequence number "
- << recv_sys.recovered_lsn
- << "; transaction id " << trx_sys.get_max_trx_id();
+ sql_print_information("InnoDB: "
+ "log sequence number " LSN_PF
+#ifdef HAVE_PMEM
+ "%s"
+#endif
+ "; transaction id " TRX_ID_FMT,
+ recv_sys.lsn,
+#ifdef HAVE_PMEM
+ log_sys.is_pmem()
+ ? " (memory-mapped)" : "",
+#endif
+ trx_sys.get_max_trx_id());
}
if (srv_force_recovery == 0) {
@@ -2056,6 +1773,10 @@ void innodb_shutdown()
}
srv_tmp_space.shutdown();
+ if (srv_stats.pages_page_compression_error)
+ ib::warn() << "Page compression errors: "
+ << srv_stats.pages_page_compression_error;
+
if (srv_was_started && srv_print_verbose_log) {
ib::info() << "Shutdown completed; log sequence number "
<< srv_shutdown_lsn
diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc
index 6bdfaa95241..4c8c5842e13 100644
--- a/storage/innobase/trx/trx0purge.cc
+++ b/storage/innobase/trx/trx0purge.cc
@@ -623,11 +623,11 @@ TRANSACTIONAL_TARGET static void trx_purge_truncate_history()
{
const ulint threshold=
ulint(srv_max_undo_log_size >> srv_page_size_shift);
- for (ulint i= purge_sys.truncate.last
+ for (uint32_t i= purge_sys.truncate.last
? purge_sys.truncate.last->id - srv_undo_space_id_start : 0,
j= i;; )
{
- const auto space_id= srv_undo_space_id_start + i;
+ const uint32_t space_id= srv_undo_space_id_start + i;
ut_ad(srv_is_undo_tablespace(space_id));
fil_space_t *space= fil_space_get(space_id);
ut_a(UT_LIST_GET_LEN(space->chain) == 1);
diff --git a/storage/innobase/trx/trx0rec.cc b/storage/innobase/trx/trx0rec.cc
index dc24f083d05..e70516a2d2d 100644
--- a/storage/innobase/trx/trx0rec.cc
+++ b/storage/innobase/trx/trx0rec.cc
@@ -1758,8 +1758,7 @@ TRANSACTIONAL_TARGET ATTRIBUTE_NOINLINE
/** @return whether the transaction holds an exclusive lock on a table */
static bool trx_has_lock_x(const trx_t &trx, dict_table_t& table)
{
- if (table.is_temporary())
- return true;
+ ut_ad(!table.is_temporary());
uint32_t n;
@@ -1860,9 +1859,17 @@ trx_undo_report_row_operation(
ut_ad(que_node_get_type(thr->run_node) == QUE_NODE_INSERT);
ut_ad(trx->bulk_insert);
return DB_SUCCESS;
- } else if (m.second && trx->bulk_insert
- && trx_has_lock_x(*trx, *index->table)) {
- m.first->second.start_bulk_insert();
+ } else if (!m.second || !trx->bulk_insert) {
+ bulk = false;
+ } else if (index->table->is_temporary()) {
+ } else if (trx_has_lock_x(*trx, *index->table)
+ && index->table->bulk_trx_id == trx->id) {
+ m.first->second.start_bulk_insert(index->table);
+
+ if (dberr_t err = m.first->second.bulk_insert_buffered(
+ *clust_entry, *index, trx)) {
+ return err;
+ }
} else {
bulk = false;
}
diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc
index 4de7ab29243..99cf1364192 100644
--- a/storage/innobase/trx/trx0roll.cc
+++ b/storage/innobase/trx/trx0roll.cc
@@ -59,7 +59,6 @@ const trx_t* trx_roll_crash_recv_trx;
@retval false if the rollback was aborted by shutdown */
inline bool trx_t::rollback_finish()
{
- mod_tables.clear();
apply_online_log= false;
if (UNIV_LIKELY(error_state == DB_SUCCESS))
{
diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc
index d344f3a0c83..ee27e8f51c1 100644
--- a/storage/innobase/trx/trx0sys.cc
+++ b/storage/innobase/trx/trx0sys.cc
@@ -212,7 +212,7 @@ TPOOL_SUPPRESS_TSAN size_t trx_sys_t::history_size_approx() const
@param space_id system or undo tablespace id
@return pointer to new rollback segment
@retval nullptr on failure */
-static trx_rseg_t *trx_rseg_create(ulint space_id)
+static trx_rseg_t *trx_rseg_create(uint32_t space_id)
{
trx_rseg_t *rseg= nullptr;
mtr_t mtr;
@@ -273,11 +273,11 @@ bool trx_sys_create_rsegs()
in the system tablespace. */
ut_a(srv_available_undo_logs > 0);
- for (ulint i = 0; srv_available_undo_logs < TRX_SYS_N_RSEGS;
+ for (uint32_t i = 0; srv_available_undo_logs < TRX_SYS_N_RSEGS;
i++, srv_available_undo_logs++) {
/* Tablespace 0 is the system tablespace.
Dedicated undo log tablespaces start from 1. */
- ulint space = srv_undo_tablespaces > 0
+ uint32_t space = srv_undo_tablespaces > 0
? (i % srv_undo_tablespaces)
+ srv_undo_space_id_start
: TRX_SYS_SPACE;
diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc
index d7ab02844bf..ae3a799622a 100644
--- a/storage/innobase/trx/trx0trx.cc
+++ b/storage/innobase/trx/trx0trx.cc
@@ -1139,29 +1139,20 @@ static void trx_flush_log_if_needed_low(lsn_t lsn, const trx_t *trx)
if (!srv_flush_log_at_trx_commit)
return;
- if (log_sys.get_flushed_lsn() > lsn)
+ if (log_sys.get_flushed_lsn(std::memory_order_relaxed) >= lsn)
return;
- const bool flush= srv_file_flush_method != SRV_NOSYNC &&
- (srv_flush_log_at_trx_commit & 1);
+ completion_callback cb, *callback= nullptr;
- if (trx->state == TRX_STATE_PREPARED)
+ if (trx->state != TRX_STATE_PREPARED && !log_sys.is_pmem() &&
+ (cb.m_param= thd_increment_pending_ops(trx->mysql_thd)))
{
- /* XA, which is used with binlog as well.
- Be conservative, use synchronous wait.*/
-sync:
- log_write_up_to(lsn, flush);
- return;
+ cb.m_callback= (void (*)(void *)) thd_decrement_pending_ops;
+ callback= &cb;
}
- completion_callback cb;
- if ((cb.m_param = thd_increment_pending_ops(trx->mysql_thd)))
- {
- cb.m_callback = (void (*)(void *)) thd_decrement_pending_ops;
- log_write_up_to(lsn, flush, false, &cb);
- }
- else
- goto sync;
+ log_write_up_to(lsn, srv_file_flush_method != SRV_NOSYNC &&
+ (srv_flush_log_at_trx_commit & 1), callback);
}
/**********************************************************************//**
@@ -1376,6 +1367,10 @@ void trx_t::commit_cleanup()
ut_ad(!dict_operation);
ut_ad(!was_dict_operation);
+ if (is_bulk_insert())
+ for (auto &t : mod_tables)
+ delete t.second.bulk_store;
+
mutex.wr_lock();
state= TRX_STATE_NOT_STARTED;
mod_tables.clear();
@@ -1476,8 +1471,11 @@ void trx_t::commit()
ut_d(was_dict_operation= dict_operation);
dict_operation= false;
commit_persist();
+#ifdef UNIV_DEBUG
+ if (!was_dict_operation)
+ for (const auto &p : mod_tables) ut_ad(!p.second.is_dropped());
+#endif /* UNIV_DEBUG */
ut_d(was_dict_operation= false);
- ut_d(for (const auto &p : mod_tables) ut_ad(!p.second.is_dropped()));
commit_cleanup();
}
@@ -1645,6 +1643,9 @@ trx_mark_sql_stat_end(
}
if (trx->is_bulk_insert()) {
+ /* MDEV-25036 FIXME: we support buffered
+ insert only for the first insert statement */
+ trx->error_state = trx->bulk_insert_apply();
/* Allow a subsequent INSERT into an empty table
if !unique_checks && !foreign_key_checks. */
return;
@@ -1856,8 +1857,6 @@ trx_prepare(
lsn_t lsn = trx_prepare_low(trx);
- DBUG_EXECUTE_IF("ib_trx_crash_during_xa_prepare_step", DBUG_SUICIDE(););
-
ut_a(trx->state == TRX_STATE_ACTIVE);
{
TMTrxGuard tg{*trx};
diff --git a/storage/innobase/ut/ut0ut.cc b/storage/innobase/ut/ut0ut.cc
index 9c214e65bbd..7b69042c0a5 100644
--- a/storage/innobase/ut/ut0ut.cc
+++ b/storage/innobase/ut/ut0ut.cc
@@ -446,7 +446,7 @@ ut_strerr(
case DB_FTS_TOO_MANY_WORDS_IN_PHRASE:
return("Too many words in a FTS phrase or proximity search");
case DB_DECRYPTION_FAILED:
- return("Table is encrypted but decrypt failed.");
+ return("Table is compressed or encrypted but uncompress or decrypt failed.");
case DB_IO_PARTIAL_FAILED:
return("Partial IO failed");
case DB_COMPUTE_VALUE_FAILED:
@@ -474,6 +474,18 @@ ut_strerr(
namespace ib {
+std::ostream &operator<<(std::ostream &lhs, const bytes_iec &rhs)
+{
+ static const char *sizes[]= {"B", "KiB", "MiB", "GiB", "TiB", "PiB",
+ "EiB", "ZiB", "YiB"};
+ size_t i= 0;
+ double d= rhs.get_double();
+ for (; d > 512.0 && i < array_elements(sizes); i++, d/= 1024.0);
+ lhs.precision(3);
+ lhs << std::fixed << d << sizes[i];
+ return lhs;
+}
+
ATTRIBUTE_COLD logger& logger::operator<<(dberr_t err)
{
m_oss << ut_strerr(err);
diff --git a/storage/maria/aria_chk.c b/storage/maria/aria_chk.c
index 266b11d99f5..7d5598f06b5 100644
--- a/storage/maria/aria_chk.c
+++ b/storage/maria/aria_chk.c
@@ -1592,7 +1592,7 @@ static void descript(HA_CHECK *param, register MARIA_HA *info, char *name)
}
compile_time_assert((MY_UUID_STRING_LENGTH + 1) <= sizeof(buff));
buff[MY_UUID_STRING_LENGTH]= 0;
- my_uuid2str(share->base.uuid, buff);
+ my_uuid2str(share->base.uuid, buff, 1);
printf("UUID: %s\n", buff);
if (ma_control_file_inited() &&
memcmp(share->base.uuid, maria_uuid, MY_UUID_SIZE))
diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc
index 7302ed36f75..c245dcea036 100644
--- a/storage/maria/ha_maria.cc
+++ b/storage/maria/ha_maria.cc
@@ -3410,6 +3410,7 @@ void ha_maria::get_auto_increment(ulonglong offset, ulonglong increment,
ulonglong nr;
int error;
uchar key[MARIA_MAX_KEY_BUFF];
+ enum ha_rkey_function search_flag= HA_READ_PREFIX_LAST;
if (!table->s->next_number_key_offset)
{ // Autoincrement at key-start
@@ -3423,13 +3424,18 @@ void ha_maria::get_auto_increment(ulonglong offset, ulonglong increment,
/* it's safe to call the following if bulk_insert isn't on */
maria_flush_bulk_insert(file, table->s->next_number_index);
+ if (unlikely(table->key_info[table->s->next_number_index].
+ key_part[table->s->next_number_keypart].key_part_flag &
+ HA_REVERSE_SORT))
+ search_flag= HA_READ_KEY_EXACT;
+
(void) extra(HA_EXTRA_KEYREAD);
key_copy(key, table->record[0],
table->key_info + table->s->next_number_index,
table->s->next_number_key_offset);
error= maria_rkey(file, table->record[1], (int) table->s->next_number_index,
key, make_prev_keypart_map(table->s->next_number_keypart),
- HA_READ_PREFIX_LAST);
+ search_flag);
if (error)
nr= 1;
else
diff --git a/storage/maria/ma_bitmap.c b/storage/maria/ma_bitmap.c
index 23135ff00a9..61fe4f9d080 100644
--- a/storage/maria/ma_bitmap.c
+++ b/storage/maria/ma_bitmap.c
@@ -661,7 +661,7 @@ static void _ma_bitmap_unpin_all(MARIA_SHARE *share)
dynamic_array_ptr(&bitmap->pinned_pages, 0));
MARIA_PINNED_PAGE *pinned_page= page_link + bitmap->pinned_pages.elements;
DBUG_ENTER("_ma_bitmap_unpin_all");
- DBUG_PRINT("info", ("pinned: %u", bitmap->pinned_pages.elements));
+ DBUG_PRINT("info", ("pinned: %zu", bitmap->pinned_pages.elements));
while (pinned_page-- != page_link)
pagecache_unlock_by_link(share->pagecache, pinned_page->link,
pinned_page->unlock, PAGECACHE_UNPIN,
@@ -1735,7 +1735,7 @@ static my_bool find_head(MARIA_HA *info, uint length, uint position)
1 error
*/
-static my_bool find_tail(MARIA_HA *info, uint length, uint position)
+static my_bool find_tail(MARIA_HA *info, uint length, size_t position)
{
MARIA_FILE_BITMAP *bitmap= &info->s->bitmap;
MARIA_BITMAP_BLOCK *block;
@@ -1816,7 +1816,7 @@ static my_bool find_blob(MARIA_HA *info, ulong length)
uint full_page_size= FULL_PAGE_SIZE(info->s);
ulong pages;
uint rest_length, used;
- uint UNINIT_VAR(first_block_pos);
+ size_t UNINIT_VAR(first_block_pos);
MARIA_BITMAP_BLOCK *first_block= 0;
DBUG_ENTER("find_blob");
DBUG_PRINT("enter", ("length: %lu", length));
@@ -1866,7 +1866,8 @@ static my_bool find_blob(MARIA_HA *info, ulong length)
DBUG_RETURN(1);
first_block= dynamic_element(&info->bitmap_blocks, first_block_pos,
MARIA_BITMAP_BLOCK*);
- first_block->sub_blocks= info->bitmap_blocks.elements - first_block_pos;
+ first_block->sub_blocks= (uint)(info->bitmap_blocks.elements
+ - first_block_pos);
DBUG_RETURN(0);
}
@@ -1887,7 +1888,7 @@ static my_bool find_blob(MARIA_HA *info, ulong length)
static my_bool allocate_blobs(MARIA_HA *info, MARIA_ROW *row)
{
ulong *length, *end;
- uint elements;
+ size_t elements;
/*
Reserve size for:
head block
@@ -1901,7 +1902,7 @@ static my_bool allocate_blobs(MARIA_HA *info, MARIA_ROW *row)
if (*length && find_blob(info, *length))
return 1;
}
- row->extents_count= (info->bitmap_blocks.elements - elements);
+ row->extents_count= (uint)(info->bitmap_blocks.elements - elements);
return 0;
}
@@ -2174,7 +2175,7 @@ end:
MARIA_BITMAP_BLOCK*);
blocks->block->sub_blocks= ELEMENTS_RESERVED_FOR_MAIN_PART - position;
/* First block's page_count is for all blocks */
- blocks->count= info->bitmap_blocks.elements - position;
+ blocks->count= (uint)(info->bitmap_blocks.elements - position);
res= 0;
abort:
@@ -2275,7 +2276,7 @@ end:
MARIA_BITMAP_BLOCK*);
blocks->block->sub_blocks= ELEMENTS_RESERVED_FOR_MAIN_PART - position;
/* First block's page_count is for all blocks */
- blocks->count= info->bitmap_blocks.elements - position;
+ blocks->count= (uint)(info->bitmap_blocks.elements - position);
res= 0;
abort:
diff --git a/storage/maria/ma_control_file.c b/storage/maria/ma_control_file.c
index a6daa8bef24..21befb70bd9 100644
--- a/storage/maria/ma_control_file.c
+++ b/storage/maria/ma_control_file.c
@@ -705,7 +705,7 @@ my_bool print_aria_log_control()
checkpoint_lsn= lsn_korr(buffer + new_cf_create_time_size +
CF_LSN_OFFSET);
logno= uint4korr(buffer + new_cf_create_time_size + CF_FILENO_OFFSET);
- my_uuid2str(buffer + CF_UUID_OFFSET, uuid_str);
+ my_uuid2str(buffer + CF_UUID_OFFSET, uuid_str, 1);
uuid_str[MY_UUID_STRING_LENGTH]= 0;
printf("Block size: %u\n", uint2korr(buffer + CF_BLOCKSIZE_OFFSET));
diff --git a/storage/maria/ma_ft_update.c b/storage/maria/ma_ft_update.c
index 8e1bf397c86..b048a8a2c5a 100644
--- a/storage/maria/ma_ft_update.c
+++ b/storage/maria/ma_ft_update.c
@@ -320,7 +320,7 @@ my_bool _ma_ft_convert_to_ft2(MARIA_HA *info, MARIA_KEY *key)
/* we'll generate one pageful at once, and insert the rest one-by-one */
/* calculating the length of this page ...*/
length=(keyinfo->block_length-2) / keyinfo->keylength;
- set_if_smaller(length, da->elements);
+ set_if_smaller(length, (uint)da->elements);
length=length * keyinfo->keylength;
get_key_full_length_rdonly(key_length, key->data);
diff --git a/storage/maria/ma_init.c b/storage/maria/ma_init.c
index 029ce4b9128..14c4c9963f1 100644
--- a/storage/maria/ma_init.c
+++ b/storage/maria/ma_init.c
@@ -140,7 +140,7 @@ my_bool maria_upgrade()
We start by renaming all log files, so that if we get a crash
we will continue from where we left.
*/
- uint i;
+ size_t i;
MY_DIR *dir= my_dir(maria_data_root, MYF(MY_WME));
if (!dir)
DBUG_RETURN(1);
diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c
index 07ec0713be8..8e6426e3aa4 100644
--- a/storage/maria/ma_loghandler.c
+++ b/storage/maria/ma_loghandler.c
@@ -1342,7 +1342,7 @@ struct st_file_counter
static void translog_mark_file_unfinished(uint32 file)
{
- int place, i;
+ ssize_t place, i;
struct st_file_counter fc, *fc_ptr;
DBUG_ENTER("translog_mark_file_unfinished");
@@ -1375,7 +1375,7 @@ static void translog_mark_file_unfinished(uint32 file)
goto end;
}
- if (place == (int)log_descriptor.unfinished_files.elements)
+ if (place == (ssize_t)log_descriptor.unfinished_files.elements)
{
insert_dynamic(&log_descriptor.unfinished_files, (uchar*) &fc);
DBUG_PRINT("info", ("The last element inserted"));
@@ -3502,7 +3502,7 @@ my_bool translog_walk_filenames(const char *directory,
const char *))
{
MY_DIR *dirp;
- uint i;
+ size_t i;
my_bool rc= FALSE;
/* Finds and removes transaction log files */
@@ -5625,8 +5625,8 @@ translog_write_variable_record_mgroup(LSN *lsn,
TRANSLOG_ADDRESS horizon;
struct st_buffer_cursor cursor;
int rc= 0;
- uint i, chunk2_page, full_pages;
- uint curr_group= 0;
+ size_t i, curr_group= 0;
+ uint chunk2_page, full_pages;
translog_size_t record_rest, first_page, chunk3_pages, chunk0_pages= 1;
translog_size_t done= 0;
struct st_translog_group_descriptor group;
@@ -5892,11 +5892,11 @@ translog_write_variable_record_mgroup(LSN *lsn,
DBUG_ASSERT(cursor.buffs.unlck_ptr == cursor.buffs.wrt_ptr);
rc= translog_advance_pointer(pages_to_skip + (int)(chunk0_pages - 1),
- record_rest + header_fixed_part +
- (groups.elements -
+ (uint16)(record_rest + header_fixed_part +
+ ((uint)groups.elements -
((page_capacity -
header_fixed_part) / (7 + 1)) *
- (chunk0_pages - 1)) * (7 + 1),
+ (chunk0_pages - 1)) * (7 + 1)),
&cursor.buffs);
buffer_of_last_lsn= log_descriptor.bc.buffer;
translog_unlock();
@@ -5984,7 +5984,7 @@ translog_write_variable_record_mgroup(LSN *lsn,
header_length);
do
{
- int limit;
+ size_t limit;
if (new_page_before_chunk0 &&
translog_chaser_page_next(&horizon, &cursor))
{
@@ -6026,9 +6026,8 @@ translog_write_variable_record_mgroup(LSN *lsn,
*/
limit= (groups_per_page < groups.elements - curr_group ?
groups_per_page : groups.elements - curr_group);
- DBUG_PRINT("info", ("Groups: %u curr: %u limit: %u",
- (uint) groups.elements, (uint) curr_group,
- (uint) limit));
+ DBUG_PRINT("info", ("Groups: %zu curr: %zu limit: %zu",
+ groups.elements, curr_group, limit));
if (chunk0_pages == 1)
{
diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c
index ff38d762650..7702355b7d1 100644
--- a/storage/maria/ma_open.c
+++ b/storage/maria/ma_open.c
@@ -156,8 +156,7 @@ static MARIA_HA *maria_clone_internal(MARIA_SHARE *share,
info.lock_type= F_WRLCK;
_ma_set_data_pagecache_callbacks(&info.dfile, share);
- my_bitmap_init(&info.changed_fields, changed_fields_bitmap,
- share->base.fields, 0);
+ my_bitmap_init(&info.changed_fields, changed_fields_bitmap, share->base.fields);
if ((*share->init)(&info))
goto err;
@@ -1026,7 +1025,8 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
MARIA_STATE_HISTORY_CLOSED *history;
if ((history= (MARIA_STATE_HISTORY_CLOSED *)
my_hash_search(&maria_stored_state,
- (uchar*) &share->state.create_rename_lsn, 0)))
+ (uchar*) &share->state.create_rename_lsn,
+ sizeof(share->state.create_rename_lsn))))
{
/*
Move history from hash to share. This is safe to do as we
diff --git a/storage/maria/ma_page.c b/storage/maria/ma_page.c
index 25db0e8acec..5881456a69a 100644
--- a/storage/maria/ma_page.c
+++ b/storage/maria/ma_page.c
@@ -119,7 +119,7 @@ my_bool _ma_fetch_keypage(MARIA_PAGE *page, MARIA_HA *info,
PAGECACHE_LOCK_READ_UNLOCK);
page_link.changed= 0;
push_dynamic(&info->pinned_pages, (void*) &page_link);
- page->link_offset= info->pinned_pages.elements-1;
+ page->link_offset= (uint)info->pinned_pages.elements-1;
}
if (tmp == info->buff)
diff --git a/storage/maria/ma_search.c b/storage/maria/ma_search.c
index 63c11632969..e6f8b6bc887 100644
--- a/storage/maria/ma_search.c
+++ b/storage/maria/ma_search.c
@@ -452,6 +452,7 @@ int _ma_prefix_search(const MARIA_KEY *key, const MARIA_PAGE *ma_page,
MARIA_KEYDEF *keyinfo= key->keyinfo;
MARIA_SHARE *share= keyinfo->share;
const uchar *sort_order= keyinfo->seg->charset->sort_order;
+ const int reverse = keyinfo->seg->flag & HA_REVERSE_SORT;
DBUG_ENTER("_ma_prefix_search");
t_buff[0]=0; /* Avoid bugs */
@@ -585,7 +586,7 @@ int _ma_prefix_search(const MARIA_KEY *key, const MARIA_PAGE *ma_page,
/*
If prefix_len > cmplen then we are in the end-space comparison
- phase. Do not try to acces the key any more ==> left= 0.
+ phase. Do not try to access the key any more ==> left= 0.
*/
left= ((len <= cmplen) ? suffix_len :
((prefix_len < cmplen) ? cmplen - prefix_len : 0));
@@ -605,8 +606,6 @@ int _ma_prefix_search(const MARIA_KEY *key, const MARIA_PAGE *ma_page,
break;
}
- if (my_flag>0) /* mismatch */
- break;
if (my_flag==0) /* match */
{
/*
@@ -632,12 +631,7 @@ int _ma_prefix_search(const MARIA_KEY *key, const MARIA_PAGE *ma_page,
for ( ; k < k_end && *k == ' '; k++) ;
if (k == k_end)
goto cmp_rest; /* should never happen */
- if ((uchar) *k < (uchar) ' ')
- {
- my_flag= 1; /* Compared string is smaller */
- break;
- }
- my_flag= -1; /* Continue searching */
+ my_flag= (uchar)' ' - *k;
}
}
else if (len > cmplen)
@@ -651,13 +645,7 @@ int _ma_prefix_search(const MARIA_KEY *key, const MARIA_PAGE *ma_page,
vseg < vseg_end && *vseg == (uchar) ' ';
vseg++, matched++) ;
DBUG_ASSERT(vseg < vseg_end);
-
- if ((uchar) *vseg > (uchar) ' ')
- {
- my_flag= 1; /* Compared string is smaller */
- break;
- }
- my_flag= -1; /* Continue searching */
+ my_flag= *vseg - (uchar)' ';
}
else
{
@@ -685,6 +673,8 @@ int _ma_prefix_search(const MARIA_KEY *key, const MARIA_PAGE *ma_page,
}
}
}
+ if ((reverse ? -my_flag : my_flag) > 0) /* mismatch */
+ break;
matched-=left;
}
/* else (matched < prefix_len) ---> do nothing. */
@@ -696,7 +686,7 @@ int _ma_prefix_search(const MARIA_KEY *key, const MARIA_PAGE *ma_page,
*ret_pos=page;
}
if (my_flag)
- flag=(keyinfo->seg->flag & HA_REVERSE_SORT) ? -my_flag : my_flag;
+ flag= reverse ? -my_flag : my_flag;
if (flag == 0)
{
memcpy(buff,t_buff,saved_length=seg_len_pack+prefix_len);
@@ -2055,7 +2045,7 @@ _ma_calc_var_pack_key_length(const MARIA_KEY *int_key, uint nod_flag,
DBUG_PRINT("test",("tot_length: %u length: %d uniq_key_length: %u",
key_length, length, s_temp->key_length));
- /* If something after that hasn't length=0, test if we can combine */
+ /* If something after that hasn't length=0, test if we can combine */
if ((s_temp->next_key_pos=next_key))
{
uint packed,n_length;
@@ -2068,7 +2058,7 @@ _ma_calc_var_pack_key_length(const MARIA_KEY *int_key, uint nod_flag,
}
else
n_length= *next_key++ & 127;
- if (!packed)
+ if (!packed && n_length)
n_length-= s_temp->store_not_null;
if (n_length || packed) /* Don't pack 0 length keys */
@@ -2368,7 +2358,7 @@ void _ma_store_var_pack_key(MARIA_KEYDEF *keyinfo __attribute__((unused)),
store_key_length_inc(key_pos,s_temp->n_length);
}
}
- else
+ else if (s_temp->n_length)
{
s_temp->n_length+= s_temp->store_not_null;
store_pack_length(s_temp->pack_marker == 128,key_pos,s_temp->n_length);
diff --git a/storage/maria/ma_sort.c b/storage/maria/ma_sort.c
index b9d6fffda86..f02a7a81020 100644
--- a/storage/maria/ma_sort.c
+++ b/storage/maria/ma_sort.c
@@ -50,7 +50,7 @@ extern void print_error(const char *fmt,...);
static ha_rows find_all_keys(MARIA_SORT_PARAM *info, ha_keys keys,
uchar **sort_keys,
- DYNAMIC_ARRAY *buffpek,uint *maxbuffer,
+ DYNAMIC_ARRAY *buffpek,size_t *maxbuffer,
IO_CACHE *tempfile,
IO_CACHE *tempfile_for_exceptions);
static int write_keys(MARIA_SORT_PARAM *info,uchar **sort_keys,
@@ -61,7 +61,7 @@ static int write_index(MARIA_SORT_PARAM *info, uchar **sort_keys,
ha_keys count);
static int merge_many_buff(MARIA_SORT_PARAM *info, ha_keys keys,
uchar **sort_keys,
- BUFFPEK *buffpek, uint *maxbuffer,
+ BUFFPEK *buffpek, size_t *maxbuffer,
IO_CACHE *t_file);
static my_off_t read_to_buffer(IO_CACHE *fromfile,BUFFPEK *buffpek,
uint sort_length);
@@ -69,7 +69,7 @@ static int merge_buffers(MARIA_SORT_PARAM *info, ha_keys keys,
IO_CACHE *from_file, IO_CACHE *to_file,
uchar **sort_keys, BUFFPEK *lastbuff,
BUFFPEK *Fb, BUFFPEK *Tb);
-static int merge_index(MARIA_SORT_PARAM *,ha_keys,uchar **,BUFFPEK *, uint,
+static int merge_index(MARIA_SORT_PARAM *,ha_keys,uchar **,BUFFPEK *, size_t,
IO_CACHE *);
static int flush_maria_ft_buf(MARIA_SORT_PARAM *info);
@@ -126,8 +126,8 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages,
size_t sortbuff_size)
{
int error;
- uint sort_length, maxbuffer;
- size_t memavl, old_memavl;
+ uint sort_length;
+ size_t memavl, old_memavl, maxbuffer;
DYNAMIC_ARRAY buffpek;
ha_rows records, UNINIT_VAR(keys);
uchar **sort_keys;
@@ -165,7 +165,7 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages,
will be allocated when needed.
*/
keys= memavl / (sort_length+sizeof(char*));
- maxbuffer= (uint) MY_MIN((ulonglong) 1000, (records / keys)+1);
+ maxbuffer= (size_t) MY_MIN((ulonglong) 1000, (records / keys)+1);
}
else
{
@@ -173,7 +173,7 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages,
All keys can't fit in memory.
Calculate how many keys + buffers we can keep in memory
*/
- uint maxbuffer_org;
+ size_t maxbuffer_org;
do
{
maxbuffer_org= maxbuffer;
@@ -190,7 +190,7 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages,
goto err;
}
}
- while ((maxbuffer= (uint) (records/(keys-1)+1)) != maxbuffer_org);
+ while ((maxbuffer= (size_t) (records/(keys-1)+1)) != maxbuffer_org);
}
if ((sort_keys= ((uchar**)
@@ -310,7 +310,7 @@ err:
static ha_rows find_all_keys(MARIA_SORT_PARAM *info, ha_rows keys,
uchar **sort_keys, DYNAMIC_ARRAY *buffpek,
- uint *maxbuffer, IO_CACHE *tempfile,
+ size_t *maxbuffer, IO_CACHE *tempfile,
IO_CACHE *tempfile_for_exceptions)
{
int error;
@@ -371,7 +371,7 @@ static my_bool _ma_thr_find_all_keys_exec(MARIA_SORT_PARAM* sort_param)
longlong sortbuff_size;
ha_keys UNINIT_VAR(keys), idx;
uint sort_length;
- uint maxbuffer;
+ size_t maxbuffer;
uchar **sort_keys= NULL;
DBUG_ENTER("_ma_thr_find_all_keys_exec");
DBUG_PRINT("enter", ("master: %d", sort_param->master));
@@ -406,11 +406,11 @@ static my_bool _ma_thr_find_all_keys_exec(MARIA_SORT_PARAM* sort_param)
will be allocated when needed.
*/
keys= memavl / (sort_length+sizeof(char*));
- maxbuffer= (uint) MY_MIN((ulonglong) 1000, (idx / keys)+1);
+ maxbuffer= (size_t) MY_MIN((ulonglong) 1000, (idx / keys)+1);
}
else
{
- uint maxbuffer_org;
+ size_t maxbuffer_org;
do
{
maxbuffer_org= maxbuffer;
@@ -622,7 +622,7 @@ int _ma_thr_write_keys(MARIA_SORT_PARAM *sort_param)
if (sinfo->buffpek.elements)
{
- uint maxbuffer=sinfo->buffpek.elements-1;
+ size_t maxbuffer=sinfo->buffpek.elements-1;
if (!mergebuf)
{
length=(size_t)param->sort_buffer_length;
@@ -838,9 +838,9 @@ static int write_index(MARIA_SORT_PARAM *info, register uchar **sort_keys,
static int merge_many_buff(MARIA_SORT_PARAM *info, ha_keys keys,
uchar **sort_keys, BUFFPEK *buffpek,
- uint *maxbuffer, IO_CACHE *t_file)
+ size_t *maxbuffer, IO_CACHE *t_file)
{
- uint tmp, merges, max_merges;
+ size_t tmp, merges, max_merges;
IO_CACHE t_file2, *from_file, *to_file, *temp;
BUFFPEK *lastbuff;
DBUG_ENTER("merge_many_buff");
@@ -866,7 +866,7 @@ static int merge_many_buff(MARIA_SORT_PARAM *info, ha_keys keys,
from_file= t_file ; to_file= &t_file2;
while (*maxbuffer >= MERGEBUFF2)
{
- uint i;
+ size_t i;
reinit_io_cache(from_file,READ_CACHE,0L,0,0);
reinit_io_cache(to_file,WRITE_CACHE,0L,0,0);
lastbuff=buffpek;
@@ -884,7 +884,7 @@ static int merge_many_buff(MARIA_SORT_PARAM *info, ha_keys keys,
if (flush_io_cache(to_file))
break; /* purecov: inspected */
temp=from_file; from_file=to_file; to_file=temp;
- *maxbuffer= (uint) (lastbuff-buffpek)-1;
+ *maxbuffer= (size_t) (lastbuff-buffpek)-1;
if (info->sort_info->param->max_stage != 1) /* If not parallel */
_ma_report_progress(info->sort_info->param, merges++, max_merges);
}
@@ -1140,7 +1140,7 @@ err:
static int
merge_index(MARIA_SORT_PARAM *info, ha_keys keys, uchar **sort_keys,
- BUFFPEK *buffpek, uint maxbuffer, IO_CACHE *tempfile)
+ BUFFPEK *buffpek, size_t maxbuffer, IO_CACHE *tempfile)
{
DBUG_ENTER("merge_index");
if (merge_buffers(info,keys,tempfile,(IO_CACHE*) 0,sort_keys,buffpek,buffpek,
diff --git a/storage/maria/unittest/ma_maria_log_cleanup.c b/storage/maria/unittest/ma_maria_log_cleanup.c
index 0d75fdbf95c..a4d0609f686 100644
--- a/storage/maria/unittest/ma_maria_log_cleanup.c
+++ b/storage/maria/unittest/ma_maria_log_cleanup.c
@@ -21,7 +21,7 @@
my_bool maria_log_remove(const char *testdir)
{
MY_DIR *dirp;
- uint i;
+ size_t i;
MY_STAT stat_buff;
char file_name[FN_REFLEN];
diff --git a/storage/mroonga/CMakeLists.txt b/storage/mroonga/CMakeLists.txt
index c048b214658..bea0eecc8b7 100644
--- a/storage/mroonga/CMakeLists.txt
+++ b/storage/mroonga/CMakeLists.txt
@@ -110,19 +110,9 @@ if(MRN_GROONGA_BUNDLED)
set(GROONGA_NORMALIZER_MYSQL_EMBED ON)
endif()
- file(READ "${MRN_BUNDLED_GROONGA_DIR}/bundled_lz4_version"
- MRN_BUNDLED_LZ4_VERSION)
- string(STRIP
- "${MRN_BUNDLED_LZ4_VERSION}"
- MRN_BUNDLED_LZ4_VERSION)
- set(MRN_BUNDLED_LZ4_DIR
- "${MRN_BUNDLED_GROONGA_DIR}/vendor/lz4-${MRN_BUNDLED_LZ4_VERSION}")
- if(EXISTS ${MRN_BUNDLED_LZ4_DIR})
- set(GRN_WITH_BUNDLED_LZ4 ON)
- set(GRN_WITH_LZ4 "yes")
- else()
- set(GRN_WITH_LZ4 "no")
- endif()
+ set(GRN_WITH_LZ4 "yes")
+ set(LIBLZ4_FOUND TRUE)
+ set(LZ4_LIBS "" CACHE STRING "" FORCE)
add_subdirectory("${MRN_BUNDLED_GROONGA_RELATIVE_DIR}")
else()
diff --git a/storage/mroonga/ha_mroonga.cpp b/storage/mroonga/ha_mroonga.cpp
index baf6de6c302..7787f8b83b5 100644
--- a/storage/mroonga/ha_mroonga.cpp
+++ b/storage/mroonga/ha_mroonga.cpp
@@ -3844,6 +3844,14 @@ int ha_mroonga::storage_create_validate_index(TABLE *table)
KEY *key_info = &(table->s->key_info[i]);
// must be single column key
int key_parts = KEY_N_KEY_PARTS(key_info);
+ for (int j = 0; j < key_parts; j++) {
+ if (key_info->key_part[j].key_part_flag & HA_REVERSE_SORT) {
+ GRN_LOG(ctx, GRN_LOG_ERROR, "DESC indexes are not supported");
+ error = ER_CANT_CREATE_TABLE;
+ my_message(error, "DESC indexes are not supported", MYF(0));
+ DBUG_RETURN(error);
+ }
+ }
if (key_parts != 1) {
continue;
}
@@ -4926,7 +4934,7 @@ int ha_mroonga::open(const char *name,
DBUG_RETURN(error);
thr_lock_data_init(&share->lock,&thr_lock_data,NULL);
- if (bitmap_init(&multiple_column_key_bitmap, NULL, table->s->fields, false))
+ if (my_bitmap_init(&multiple_column_key_bitmap, NULL, table->s->fields))
{
mrn_free_share(share);
share = NULL;
@@ -4942,7 +4950,7 @@ int ha_mroonga::open(const char *name,
if (error)
{
- bitmap_free(&multiple_column_key_bitmap);
+ my_bitmap_free(&multiple_column_key_bitmap);
mrn_free_share(share);
share = NULL;
}
@@ -5009,7 +5017,7 @@ int ha_mroonga::close()
{
error = add_wrap_hton(share->table_name, share->hton);
}
- bitmap_free(&multiple_column_key_bitmap);
+ my_bitmap_free(&multiple_column_key_bitmap);
if (share->use_count == 1) {
mrn_free_long_term_share(share->long_term_share);
}
diff --git a/storage/mroonga/lib/mrn_smart_bitmap.cpp b/storage/mroonga/lib/mrn_smart_bitmap.cpp
index f8fd4f727bb..cdedeb677cd 100644
--- a/storage/mroonga/lib/mrn_smart_bitmap.cpp
+++ b/storage/mroonga/lib/mrn_smart_bitmap.cpp
@@ -26,7 +26,7 @@ namespace mrn {
SmartBitmap::~SmartBitmap() {
if (bitmap_) {
- bitmap_free(bitmap_);
+ my_bitmap_free(bitmap_);
}
}
diff --git a/storage/mroonga/mysql-test/mroonga/storage/r/index_desc.result b/storage/mroonga/mysql-test/mroonga/storage/r/index_desc.result
new file mode 100644
index 00000000000..350ad0a3eeb
--- /dev/null
+++ b/storage/mroonga/mysql-test/mroonga/storage/r/index_desc.result
@@ -0,0 +1,9 @@
+#
+# MDEV-27408 DESC index on a Mroonga table causes wrong order of result set
+#
+create table t1 (a int, key(a desc));
+ERROR HY000: DESC indexes are not supported
+show warnings;
+Level Code Message
+Error 1005 DESC indexes are not supported
+Warning 1030 Got error 1005 "Unknown error 1005" from storage engine Mroonga
diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/index_desc.test b/storage/mroonga/mysql-test/mroonga/storage/t/index_desc.test
new file mode 100644
index 00000000000..388497bb0c3
--- /dev/null
+++ b/storage/mroonga/mysql-test/mroonga/storage/t/index_desc.test
@@ -0,0 +1,15 @@
+--source ../../include/mroonga/have_mroonga.inc
+
+--echo #
+--echo # MDEV-27408 DESC index on a Mroonga table causes wrong order of result set
+--echo #
+
+--error ER_CANT_CREATE_TABLE
+create table t1 (a int, key(a desc));
+show warnings;
+#show create table t1;
+#insert into t1 values (1),(3),(2);
+#select * from t1 order by a;
+#drop table t1;
+
+--source ../../include/mroonga/have_mroonga_deinit.inc
diff --git a/storage/myisam/ft_update.c b/storage/myisam/ft_update.c
index 0c97a926746..157e5423168 100644
--- a/storage/myisam/ft_update.c
+++ b/storage/myisam/ft_update.c
@@ -301,7 +301,8 @@ uint _mi_ft_convert_to_ft2(MI_INFO *info, uint keynr, uchar *key)
DYNAMIC_ARRAY *da=info->ft1_to_ft2;
MI_KEYDEF *keyinfo=&info->s->ft2_keyinfo;
uchar *key_ptr= (uchar*) dynamic_array_ptr(da, 0), *end;
- uint length, key_length;
+ size_t length;
+ uint key_length;
DBUG_ENTER("_mi_ft_convert_to_ft2");
/* we'll generate one pageful at once, and insert the rest one-by-one */
diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index 954d744b4a6..c0419da7e71 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -577,7 +577,8 @@ int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
t1_keysegs_j__type != t2_keysegs[j].type ||
t1_keysegs[j].null_bit != t2_keysegs[j].null_bit ||
t1_keysegs[j].length != t2_keysegs[j].length ||
- t1_keysegs[j].start != t2_keysegs[j].start)
+ t1_keysegs[j].start != t2_keysegs[j].start ||
+ (t1_keysegs[j].flag ^ t2_keysegs[j].flag) & HA_REVERSE_SORT)
{
DBUG_PRINT("error", ("Key segment %d (key %d) has different "
"definition", j, i));
@@ -2351,6 +2352,7 @@ void ha_myisam::get_auto_increment(ulonglong offset, ulonglong increment,
ulonglong nr;
int error;
uchar key[HA_MAX_KEY_LENGTH];
+ enum ha_rkey_function search_flag= HA_READ_PREFIX_LAST;
if (!table->s->next_number_key_offset)
{ // Autoincrement at key-start
@@ -2364,13 +2366,18 @@ void ha_myisam::get_auto_increment(ulonglong offset, ulonglong increment,
/* it's safe to call the following if bulk_insert isn't on */
mi_flush_bulk_insert(file, table->s->next_number_index);
+ if (unlikely(table->key_info[table->s->next_number_index].
+ key_part[table->s->next_number_keypart].key_part_flag &
+ HA_REVERSE_SORT))
+ search_flag= HA_READ_KEY_EXACT;
+
(void) extra(HA_EXTRA_KEYREAD);
key_copy(key, table->record[0],
table->key_info + table->s->next_number_index,
table->s->next_number_key_offset);
error= mi_rkey(file, table->record[1], (int) table->s->next_number_index,
key, make_prev_keypart_map(table->s->next_number_keypart),
- HA_READ_PREFIX_LAST);
+ search_flag);
if (error)
nr= 1;
else
diff --git a/storage/myisam/mi_search.c b/storage/myisam/mi_search.c
index 14286e3591d..dbad6aa7a77 100644
--- a/storage/myisam/mi_search.c
+++ b/storage/myisam/mi_search.c
@@ -309,6 +309,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
uchar *UNINIT_VAR(saved_vseg);
uint saved_length=0, saved_prefix_len=0;
uint length_pack;
+ const int reverse = keyinfo->seg->flag & HA_REVERSE_SORT;
DBUG_ENTER("_mi_prefix_search");
t_buff[0]=0; /* Avoid bugs */
@@ -452,8 +453,6 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
break;
}
- if (my_flag>0) /* mismatch */
- break;
if (my_flag==0) /* match */
{
/*
@@ -478,12 +477,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
for ( ; k < k_end && *k == ' '; k++) ;
if (k == k_end)
goto cmp_rest; /* should never happen */
- if (*k < (uchar) ' ')
- {
- my_flag= 1; /* Compared string is smaller */
- break;
- }
- my_flag= -1; /* Continue searching */
+ my_flag= (uchar)' ' - *k;
}
}
else if (len > cmplen)
@@ -498,12 +492,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
vseg++, matched++) ;
DBUG_ASSERT(vseg < vseg_end);
- if (*vseg > (uchar) ' ')
- {
- my_flag= 1; /* Compared string is smaller */
- break;
- }
- my_flag= -1; /* Continue searching */
+ my_flag= *vseg - (uchar)' ';
}
else
{
@@ -530,6 +519,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
}
}
}
+ if ((reverse ? -my_flag : my_flag) > 0) /* mismatch */
+ break;
matched-=left;
}
/* else (matched < prefix_len) ---> do nothing. */
@@ -541,7 +532,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
*ret_pos=page;
}
if (my_flag)
- flag=(keyinfo->seg->flag & HA_REVERSE_SORT) ? -my_flag : my_flag;
+ flag= reverse ? -my_flag : my_flag;
if (flag == 0)
{
memcpy(buff,t_buff,saved_length=seg_len_pack+prefix_len);
@@ -1608,7 +1599,7 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key,
}
else
n_length= *next_key++ & 127;
- if (!packed)
+ if (!packed && n_length)
n_length-= s_temp->store_not_null;
if (n_length || packed) /* Don't pack 0 length keys */
@@ -1897,7 +1888,7 @@ void _mi_store_var_pack_key(MI_KEYDEF *keyinfo __attribute__((unused)),
return; /* Identical key */
store_key_length(key_pos,s_temp->n_length);
}
- else
+ else if (s_temp->n_length)
{
s_temp->n_length+= s_temp->store_not_null;
store_pack_length(s_temp->pack_marker == 128,key_pos,s_temp->n_length);
diff --git a/storage/myisam/sort.c b/storage/myisam/sort.c
index fe0c0f8f02e..198e669bbb4 100644
--- a/storage/myisam/sort.c
+++ b/storage/myisam/sort.c
@@ -47,7 +47,7 @@ extern void print_error(const char *fmt,...);
static ha_rows find_all_keys(MI_SORT_PARAM *info, ha_keys keys,
uchar **sort_keys,
- DYNAMIC_ARRAY *buffpek,uint *maxbuffer,
+ DYNAMIC_ARRAY *buffpek, size_t *maxbuffer,
IO_CACHE *tempfile,
IO_CACHE *tempfile_for_exceptions);
static int write_keys(MI_SORT_PARAM *info,uchar **sort_keys,
@@ -58,7 +58,7 @@ static int write_index(MI_SORT_PARAM *info,uchar * *sort_keys,
ha_keys count);
static int merge_many_buff(MI_SORT_PARAM *info, ha_keys keys,
uchar * *sort_keys,
- BUFFPEK *buffpek, uint *maxbuffer,
+ BUFFPEK *buffpek, size_t *maxbuffer,
IO_CACHE *t_file);
static my_off_t read_to_buffer(IO_CACHE *fromfile,BUFFPEK *buffpek,
uint sort_length);
@@ -66,7 +66,7 @@ static int merge_buffers(MI_SORT_PARAM *info, ha_keys keys,
IO_CACHE *from_file, IO_CACHE *to_file,
uchar * *sort_keys, BUFFPEK *lastbuff,
BUFFPEK *Fb, BUFFPEK *Tb);
-static int merge_index(MI_SORT_PARAM *,ha_keys,uchar **,BUFFPEK *, uint,
+static int merge_index(MI_SORT_PARAM *,ha_keys,uchar **,BUFFPEK *, size_t,
IO_CACHE *);
static int flush_ft_buf(MI_SORT_PARAM *info);
@@ -124,7 +124,8 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
ulonglong sortbuff_size)
{
int error;
- uint sort_length, maxbuffer;
+ uint sort_length;
+ size_t maxbuffer;
ulonglong memavl, old_memavl;
DYNAMIC_ARRAY buffpek;
ha_rows records, UNINIT_VAR(keys);
@@ -161,7 +162,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
will be allocated when needed.
*/
keys= memavl / (sort_length+sizeof(char*));
- maxbuffer= (uint) MY_MIN((ulonglong) 1000, (records / keys)+1);
+ maxbuffer= (size_t) MY_MIN((ulonglong) 1000, (records / keys)+1);
}
else
{
@@ -169,7 +170,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
All keys can't fit in memory.
Calculate how many keys + buffers we can keep in memory
*/
- uint maxbuffer_org;
+ size_t maxbuffer_org;
do
{
maxbuffer_org= maxbuffer;
@@ -186,7 +187,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
goto err;
}
}
- while ((maxbuffer= (uint) (records/(keys-1)+1)) != maxbuffer_org);
+ while ((maxbuffer= (size_t) (records/(keys-1)+1)) != maxbuffer_org);
}
if ((sort_keys= ((uchar **)
@@ -298,7 +299,7 @@ err:
static ha_rows find_all_keys(MI_SORT_PARAM *info, ha_rows keys,
uchar **sort_keys, DYNAMIC_ARRAY *buffpek,
- uint *maxbuffer, IO_CACHE *tempfile,
+ size_t *maxbuffer, IO_CACHE *tempfile,
IO_CACHE *tempfile_for_exceptions)
{
int error;
@@ -349,7 +350,7 @@ static my_bool thr_find_all_keys_exec(MI_SORT_PARAM *sort_param)
ulonglong memavl, old_memavl, sortbuff_size;
ha_keys UNINIT_VAR(keys), idx;
uint sort_length;
- uint maxbuffer;
+ size_t maxbuffer;
uchar **sort_keys= NULL;
int error= 0;
DBUG_ENTER("thr_find_all_keys");
@@ -386,18 +387,18 @@ static my_bool thr_find_all_keys_exec(MI_SORT_PARAM *sort_param)
will be allocated when needed.
*/
keys= memavl / (sort_length+sizeof(char*));
- maxbuffer= (uint) MY_MIN((ulonglong) 1000, (idx / keys)+1);
+ maxbuffer= (size_t) MY_MIN((ulonglong) 1000, (idx / keys)+1);
}
else
{
- uint maxbuffer_org;
+ size_t maxbuffer_org;
do
{
maxbuffer_org= maxbuffer;
if (memavl < sizeof(BUFFPEK)*maxbuffer ||
(keys=(memavl-sizeof(BUFFPEK)*maxbuffer)/
(sort_length+sizeof(char*))) <= 1 ||
- keys < (uint) maxbuffer)
+ keys < maxbuffer)
{
mi_check_print_error(sort_param->sort_info->param,
"myisam_sort_buffer_size is too small. Current myisam_sort_buffer_size: %llu rows: %llu sort_length: %u",
@@ -405,7 +406,7 @@ static my_bool thr_find_all_keys_exec(MI_SORT_PARAM *sort_param)
DBUG_RETURN(TRUE);
}
}
- while ((maxbuffer= (uint) (idx/(keys-1)+1)) != maxbuffer_org);
+ while ((maxbuffer= (size_t) (idx/(keys-1)+1)) != maxbuffer_org);
}
if ((sort_keys= (uchar**) my_malloc(PSI_INSTRUMENT_ME,
(size_t)(keys * (sort_length + sizeof(char*)) +
@@ -604,7 +605,7 @@ int thr_write_keys(MI_SORT_PARAM *sort_param)
if (sinfo->buffpek.elements)
{
- uint maxbuffer=sinfo->buffpek.elements-1;
+ size_t maxbuffer=sinfo->buffpek.elements-1;
if (!mergebuf)
{
length=param->sort_buffer_length;
@@ -806,9 +807,9 @@ static int write_index(MI_SORT_PARAM *info, register uchar **sort_keys,
static int merge_many_buff(MI_SORT_PARAM *info, ha_keys keys,
uchar **sort_keys, BUFFPEK *buffpek,
- uint *maxbuffer, IO_CACHE *t_file)
+ size_t *maxbuffer, IO_CACHE *t_file)
{
- register uint i;
+ register size_t i;
IO_CACHE t_file2, *from_file, *to_file, *temp;
BUFFPEK *lastbuff;
DBUG_ENTER("merge_many_buff");
@@ -838,7 +839,7 @@ static int merge_many_buff(MI_SORT_PARAM *info, ha_keys keys,
if (flush_io_cache(to_file))
break; /* purecov: inspected */
temp=from_file; from_file=to_file; to_file=temp;
- *maxbuffer= (uint) (lastbuff-buffpek)-1;
+ *maxbuffer= (size_t) (lastbuff-buffpek)-1;
}
cleanup:
close_cached_file(to_file); /* This holds old result */
@@ -1099,7 +1100,7 @@ err:
static int
merge_index(MI_SORT_PARAM *info, ha_keys keys, uchar **sort_keys,
- BUFFPEK *buffpek, uint maxbuffer, IO_CACHE *tempfile)
+ BUFFPEK *buffpek, size_t maxbuffer, IO_CACHE *tempfile)
{
DBUG_ENTER("merge_index");
if (merge_buffers(info,keys,tempfile,(IO_CACHE*) 0,sort_keys,buffpek,buffpek,
diff --git a/storage/myisammrg/ha_myisammrg.cc b/storage/myisammrg/ha_myisammrg.cc
index 70a4d6aa284..d37636abab7 100644
--- a/storage/myisammrg/ha_myisammrg.cc
+++ b/storage/myisammrg/ha_myisammrg.cc
@@ -121,7 +121,7 @@ ha_myisammrg::ha_myisammrg(handlerton *hton, TABLE_SHARE *table_arg)
:handler(hton, table_arg), file(0), is_cloned(0)
{
init_sql_alloc(rg_key_memory_children, &children_mem_root,
- FN_REFLEN + ALLOC_ROOT_MIN_BLOCK_SIZE, 0, MYF(0));
+ FN_REFLEN, 0, MYF(0));
}
diff --git a/storage/oqgraph/cmake/FindJudy.cmake b/storage/oqgraph/cmake/FindJudy.cmake
index d9ecfdc4a4f..37aed8b631c 100644
--- a/storage/oqgraph/cmake/FindJudy.cmake
+++ b/storage/oqgraph/cmake/FindJudy.cmake
@@ -16,7 +16,7 @@
# Once done this will define
#
# Judy_FOUND - system has Judy
-# Judy_INCLUDE_DIR - the Judy include directory
+# Judy_INCLUDE_DIRS - the Judy include directory
# Judy_LIBRARIES - Link these to use Judy
# Judy_DEFINITIONS - Compiler switches required for using Judy
@@ -24,21 +24,21 @@ IF(MSVC)
# For now, assume Judy built according to the above instructions
if (NOT "$ENV{JUDY_ROOT}" STREQUAL "")
# Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing.
- string(REPLACE "\\" "/" Judy_INCLUDE_DIR_search $ENV{JUDY_ROOT}/src)
+ string(REPLACE "\\" "/" Judy_INCLUDE_DIRS_search $ENV{JUDY_ROOT}/src)
string(REPLACE "\\" "/" Judy_LIBRARIES_search $ENV{JUDY_ROOT}/src)
endif()
ELSE(MSVC)
- IF (Judy_INCLUDE_DIR AND Judy_LIBRARIES)
+ IF (Judy_INCLUDE_DIRS AND Judy_LIBRARIES)
SET(Judy_FIND_QUIETLY TRUE)
- ENDIF (Judy_INCLUDE_DIR AND Judy_LIBRARIES)
+ ENDIF (Judy_INCLUDE_DIRS AND Judy_LIBRARIES)
ENDIF(MSVC)
-FIND_PATH(Judy_INCLUDE_DIR Judy.h PATHS ${Judy_INCLUDE_DIR_search})
+FIND_PATH(Judy_INCLUDE_DIRS Judy.h PATHS ${Judy_INCLUDE_DIRS_search})
FIND_LIBRARY(Judy_LIBRARIES Judy PATHS ${Judy_LIBRARIES_search})
-IF (Judy_INCLUDE_DIR AND Judy_LIBRARIES)
+IF (Judy_INCLUDE_DIRS AND Judy_LIBRARIES)
SET(Judy_FOUND TRUE)
-ELSE (Judy_INCLUDE_DIR AND Judy_LIBRARIES)
+ELSE (Judy_INCLUDE_DIRS AND Judy_LIBRARIES)
SET(Judy_FOUND FALSE)
if (MSVC)
MESSAGE(STATUS "How to build Judy on Windows:")
@@ -51,7 +51,7 @@ ELSE (Judy_INCLUDE_DIR AND Judy_LIBRARIES)
MESSAGE(STATUS "3. Execute the command: 'build'")
MESSAGE(STATUS "4. Rerun this cmake with the environment variable: 'set JUDY_ROOT=x:\\path\\to\\judy'")
endif(MSVC)
-ENDIF (Judy_INCLUDE_DIR AND Judy_LIBRARIES)
+ENDIF (Judy_INCLUDE_DIRS AND Judy_LIBRARIES)
IF (Judy_FOUND)
IF (NOT Judy_FIND_QUIETLY)
@@ -63,5 +63,5 @@ ELSE (Judy_FOUND)
ENDIF (Judy_FIND_REQUIRED)
ENDIF (Judy_FOUND)
-MARK_AS_ADVANCED(Judy_INCLUDE_DIR Judy_LIBRARIES)
+MARK_AS_ADVANCED(Judy_INCLUDE_DIRS Judy_LIBRARIES)
diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt
index 9d1c13e11cd..d3f7ca90889 100644
--- a/storage/rocksdb/CMakeLists.txt
+++ b/storage/rocksdb/CMakeLists.txt
@@ -141,8 +141,12 @@ else()
SET(ATOMIC_EXTRA_LIBS)
endif()
+# don't use compression providers, there are standalone executables below
+GET_PROPERTY(dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
+LIST(REMOVE_ITEM dirs ${CMAKE_SOURCE_DIR}/include/providers)
+SET_PROPERTY(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "${dirs}")
+
MYSQL_ADD_PLUGIN(rocksdb ${ROCKSDB_SE_SOURCES} MODULE_ONLY STORAGE_ENGINE
- MODULE_OUTPUT_NAME ha_rocksdb
LINK_LIBRARIES ${ATOMIC_EXTRA_LIBS}
COMPONENT rocksdb-engine)
@@ -151,8 +155,6 @@ IF(NOT TARGET rocksdb)
RETURN()
ENDIF()
-
-
CHECK_CXX_SOURCE_COMPILES("
#if defined(_MSC_VER) && !defined(__thread)
#define __thread __declspec(thread)
diff --git a/storage/rocksdb/build_rocksdb.cmake b/storage/rocksdb/build_rocksdb.cmake
index 7ccd52283f3..096185af08f 100644
--- a/storage/rocksdb/build_rocksdb.cmake
+++ b/storage/rocksdb/build_rocksdb.cmake
@@ -35,48 +35,48 @@ endif()
# Optional compression libraries.
include(CheckFunctionExists)
-macro(check_lib package var)
- STRING(TOUPPER ${package} PACKAGE_NAME)
+macro(check_lib package)
SET(WITH_ROCKSDB_${package} AUTO CACHE STRING
"Build RocksDB with ${package} compression. Possible values are 'ON', 'OFF', 'AUTO' and default is 'AUTO'")
+ STRING(TOUPPER ${package} var)
IF (NOT ${WITH_ROCKSDB_${package}} STREQUAL "OFF")
FIND_PACKAGE(${package} QUIET)
- SET(HAVE_ROCKSDB_${PACKAGE_NAME} TRUE)
- IF (${${PACKAGE_NAME}_FOUND})
- IF(${ARGC} GREATER 2)
+ SET(HAVE_ROCKSDB_${package} TRUE)
+ IF (${${package}_FOUND})
+ IF(${ARGC} GREATER 1)
SET(CMAKE_REQUIRED_LIBRARIES ${${var}_LIBRARIES})
- CHECK_FUNCTION_EXISTS(${ARGV2} ${var}_VALID)
+ CHECK_FUNCTION_EXISTS(${ARGV1} ${package}_VALID)
UNSET(CMAKE_REQUIRED_LIBRARIES)
ELSE()
- SET(${var}_VALID TRUE)
+ SET(${package}_VALID TRUE)
ENDIF()
ENDIF()
ENDIF()
- ADD_FEATURE_INFO(ROCKSDB_${PACKAGE_NAME} HAVE_ROCKSDB_${PACKAGE_NAME} "${package} Compression in the RocksDB storage engine")
+ ADD_FEATURE_INFO(ROCKSDB_${package} HAVE_ROCKSDB_${package} "${package} Compression in the RocksDB storage engine")
- IF(${${var}_VALID})
- MESSAGE_ONCE(rocksdb_${var} "Found ${package}: ${${var}_LIBRARIES}")
- add_definitions(-D${PACKAGE_NAME})
+ IF(${${package}_VALID})
+ MESSAGE_ONCE(rocksdb_${package} "Found ${package}: ${${var}_LIBRARIES}")
+ add_definitions(-D${var})
include_directories(${${var}_INCLUDE_DIR})
list(APPEND THIRDPARTY_LIBS ${${var}_LIBRARIES})
- ELSEIF(${${PACKAGE_NAME}_FOUND})
- MESSAGE_ONCE(rocksdb_${var} "Found unusable ${package}: ${${var}_LIBRARIES} [${ARGV2}]")
+ ELSEIF(${${package}_FOUND})
+ MESSAGE_ONCE(rocksdb_${package} "Found unusable ${package}: ${${var}_LIBRARIES} [${ARGV1}]")
ELSE()
- MESSAGE_ONCE(rocksdb_${var} "Could NOT find ${package}")
+ MESSAGE_ONCE(rocksdb_${package} "Could NOT find ${package}")
ENDIF()
- IF (${WITH_ROCKSDB_${package}} STREQUAL "ON" AND NOT ${${PACKAGE_NAME}_FOUND})
+ IF (${WITH_ROCKSDB_${package}} STREQUAL "ON" AND NOT ${${package}_FOUND})
MESSAGE(FATAL_ERROR
"${package} library was not found, but WITH_ROCKSDB_${package} option is ON.\
Either set WITH_ROCKSDB_${package} to OFF, or make sure ${package} is installed")
endif()
endmacro()
-check_lib(LZ4 LZ4)
-check_lib(BZip2 BZIP2)
-check_lib(snappy snappy) # rocksdb/cmake/modules/Findsnappy.cmake violates the convention
-check_lib(ZSTD ZSTD ZDICT_trainFromBuffer)
+check_lib(LZ4)
+check_lib(BZip2)
+check_lib(Snappy)
+check_lib(ZSTD ZDICT_trainFromBuffer)
add_definitions(-DZLIB)
list(APPEND THIRDPARTY_LIBS ${ZLIB_LIBRARY})
diff --git a/storage/rocksdb/ha_rocksdb.cc b/storage/rocksdb/ha_rocksdb.cc
index 8030a1e3453..2239970a4e3 100644
--- a/storage/rocksdb/ha_rocksdb.cc
+++ b/storage/rocksdb/ha_rocksdb.cc
@@ -704,7 +704,7 @@ static int rmdir_force(const char *dir) {
if (!dir_info)
return 1;
- for (uint i = 0; i < dir_info->number_of_files; i++) {
+ for (size_t i = 0; i < dir_info->number_of_files; i++) {
FILEINFO *file = dir_info->dir_entry + i;
strxnmov(path, sizeof(path), dir, sep, file->name, NULL);
@@ -5216,9 +5216,6 @@ static rocksdb::Status check_rocksdb_options_compatibility(
return status;
}
-bool prevent_myrocks_loading= false;
-
-
static int rocksdb_check_version(handlerton *hton,
const char *path,
const LEX_CUSTRING *version,
@@ -5239,14 +5236,6 @@ static int rocksdb_init_func(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- {
- my_error(ER_INTERNAL_ERROR, MYF(0),
- "Loading MyRocks plugin after it has been unloaded is not "
- "supported. Please restart mariadbd");
- DBUG_RETURN(1);
- }
-
if (rocksdb_ignore_datadic_errors)
{
sql_print_information(
@@ -5821,8 +5810,6 @@ static int rocksdb_init_func(void *const p) {
static int rocksdb_done_func(void *const p) {
DBUG_ENTER_FUNC();
- int error = 0;
-
// signal the drop index thread to stop
rdb_drop_idx_thread.signal(true);
@@ -5866,12 +5853,6 @@ static int rocksdb_done_func(void *const p) {
"RocksDB: Couldn't stop the manual compaction thread: (errno=%d)", err);
}
- if (rdb_open_tables.count()) {
- // Looks like we are getting unloaded and yet we have some open tables
- // left behind.
- error = 1;
- }
-
rdb_open_tables.free();
/*
destructors for static objects can be called at _exit(),
@@ -5923,7 +5904,7 @@ static int rocksdb_done_func(void *const p) {
MariaDB: don't clear rocksdb_db_options and rocksdb_tbl_options.
MyRocks' plugin variables refer to them.
- The plugin cannot be loaded again (see prevent_myrocks_loading) but plugin
+ The plugin cannot be loaded again but plugin
variables are processed before myrocks::rocksdb_init_func is invoked, so
they must point to valid memory.
*/
@@ -5938,12 +5919,12 @@ static int rocksdb_done_func(void *const p) {
my_error_unregister(HA_ERR_ROCKSDB_FIRST, HA_ERR_ROCKSDB_LAST);
/*
- Prevent loading the plugin after it has been loaded and then unloaded. This
- doesn't work currently.
+ returning non-zero status from the plugin deinit function will prevent
+ the server from unloading the plugin. it will only be marked unusable.
+ This is needed here, because RocksDB cannot be fully unloaded
+ and reloaded (see sql_plugin.cc near STB_GNU_UNIQUE).
*/
- prevent_myrocks_loading= true;
-
- DBUG_RETURN(error);
+ DBUG_RETURN(1);
}
static inline void rocksdb_smart_seek(bool seek_backward,
@@ -7599,8 +7580,7 @@ int ha_rocksdb::create_key_def(const TABLE *const table_arg, const uint i,
(*new_key_def)->m_ttl_column = ttl_column;
}
// initialize key_def
- (*new_key_def)->setup(table_arg, tbl_def_arg);
- DBUG_RETURN(HA_EXIT_SUCCESS);
+ DBUG_RETURN((*new_key_def)->setup(table_arg, tbl_def_arg));
}
int rdb_normalize_tablename(const std::string &tablename,
@@ -10832,7 +10812,7 @@ int ha_rocksdb::index_end() {
release_scan_iterator();
- bitmap_free(&m_lookup_bitmap);
+ my_bitmap_free(&m_lookup_bitmap);
active_index = MAX_KEY;
in_range_check_pushed_down = FALSE;
diff --git a/storage/rocksdb/ha_rocksdb.h b/storage/rocksdb/ha_rocksdb.h
index 8580dcbc2e5..f847ee25cb8 100644
--- a/storage/rocksdb/ha_rocksdb.h
+++ b/storage/rocksdb/ha_rocksdb.h
@@ -397,7 +397,7 @@ class ha_rocksdb : public my_core::handler {
current lookup to be covered. If the bitmap field is null, that means this
index does not cover the current lookup for any record.
*/
- MY_BITMAP m_lookup_bitmap = {nullptr, nullptr, nullptr, 0, 0};
+ MY_BITMAP m_lookup_bitmap = {nullptr, nullptr, 0, 0};
int alloc_key_buffers(const TABLE *const table_arg,
const Rdb_tbl_def *const tbl_def_arg,
@@ -1062,8 +1062,6 @@ std::string rdb_corruption_marker_file_name();
const int MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL= MariaDB_PLUGIN_MATURITY_STABLE;
-extern bool prevent_myrocks_loading;
-
extern uint32_t rocksdb_ignore_datadic_errors;
void sql_print_verbose_info(const char *format, ...);
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_not_null.result b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_not_null.result
index b3df869a0a7..a3a138555ee 100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_not_null.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_not_null.result
@@ -1455,7 +1455,7 @@ pk INT AUTO_INCREMENT PRIMARY KEY,
c DECIMAL NOT NULL DEFAULT 1.1
) ENGINE=rocksdb;
Warnings:
-Note 1265 Data truncated for column 'c' at row 1
+Note 1265 Data truncated for column 'c' at row 0
SHOW COLUMNS IN t1;
Field Type Null Key Default Extra
pk int(11) NO PRI NULL auto_increment
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_null.result b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_null.result
index f0cd1a7e8b3..f0d377890c5 100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_null.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_null.result
@@ -1246,7 +1246,7 @@ c2 DECIMAL NULL DEFAULT 1.1,
pk INT AUTO_INCREMENT PRIMARY KEY
) ENGINE=rocksdb;
Warnings:
-Note 1265 Data truncated for column 'c2' at row 1
+Note 1265 Data truncated for column 'c2' at row 0
SHOW COLUMNS IN t1;
Field Type Null Key Default Extra
c decimal(10,0) YES NULL
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/index_key_block_size.result b/storage/rocksdb/mysql-test/rocksdb/r/index_key_block_size.result
index 4695d94b3fe..c74ce6878c7 100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/index_key_block_size.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/index_key_block_size.result
@@ -23,6 +23,11 @@ CREATE TABLE t1 (a INT,
b CHAR(8),
PRIMARY KEY ind2(b(1) DESC) KEY_BLOCK_SIZE=32768 COMMENT 'big key_block_size value'
) ENGINE=rocksdb;
+ERROR HY000: Table storage engine 'ROCKSDB' does not support the create option 'DESC'
+CREATE TABLE t1 (a INT,
+b CHAR(8),
+PRIMARY KEY ind2(b(1)) KEY_BLOCK_SIZE=32768 COMMENT 'big key_block_size value'
+) ENGINE=rocksdb;
Warnings:
Warning 1280 Name 'ind2' ignored for PRIMARY key.
SHOW INDEX IN t1;
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result b/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result
index d3f0ee3bcd9..65255699551 100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result
@@ -136,9 +136,6 @@ os_data_fsyncs os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status
os_pending_reads os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of reads pending
os_pending_writes os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of writes pending
os_log_bytes_written os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Bytes of log written (innodb_os_log_written)
-os_log_fsyncs os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of fsync log writes (innodb_os_log_fsyncs)
-os_log_pending_fsyncs os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of pending fsync write (innodb_os_log_pending_fsyncs)
-os_log_pending_writes os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of pending log file writes (innodb_os_log_pending_writes)
trx_rw_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of read-write transactions committed
trx_ro_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of read-only transactions committed
trx_nl_ro_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of non-locking auto-commit read-only transactions committed
@@ -156,20 +153,16 @@ purge_undo_log_pages purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL
purge_dml_delay_usec purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Microseconds DML to be delayed due to purge lagging
purge_stop_count purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of times purge was stopped
purge_resume_count purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of times purge was resumed
-log_checkpoints recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of checkpoints
+log_checkpoints recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of checkpoints
log_lsn_last_flush recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value LSN of Last flush
log_lsn_last_checkpoint recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value LSN at last checkpoint
log_lsn_current recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Current LSN value
log_lsn_checkpoint_age recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Current LSN value minus LSN at last checkpoint
log_lsn_buf_pool_oldest recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value The oldest modified block LSN in the buffer pool
log_max_modified_age_async recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Maximum LSN difference; when exceeded, start asynchronous preflush
-log_pending_log_flushes recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Pending log flushes
-log_pending_checkpoint_writes recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Pending checkpoints
-log_num_log_io recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 value Number of log I/Os
log_waits recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of log waits due to small log buffer (innodb_log_waits)
log_write_requests recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of log write requests (innodb_log_write_requests)
log_writes recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Number of log writes (innodb_log_writes)
-log_padded recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Bytes of log padded for log write ahead
compress_pages_compressed compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of pages compressed
compress_pages_decompressed compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of pages decompressed
compression_pad_increments compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of times padding is incremented to avoid compression failures
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/mariadb_plugin.result b/storage/rocksdb/mysql-test/rocksdb/r/mariadb_plugin.result
index 6d6cb1db54e..a8e42a4e2b2 100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/mariadb_plugin.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/mariadb_plugin.result
@@ -10,26 +10,35 @@ connection default;
UNINSTALL SONAME 'ha_rocksdb';
Warnings:
Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
SELECT ENGINE, SUPPORT FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='ROCKSDB';
ENGINE SUPPORT
ROCKSDB NO
disconnect con1;
+select engine, support from information_schema.engines where engine='rocksdb';
+engine support
+select plugin_name,plugin_status from information_schema.plugins where plugin_name='rocksdb';
+plugin_name plugin_status
+ROCKSDB INACTIVE
#
# MDEV-15686: Loading MyRocks plugin back after it has been unloaded causes a crash
#
-call mtr.add_suppression("Plugin 'ROCKSDB.*' init function returned error.");
-call mtr.add_suppression("Plugin 'ROCKSDB.*' registration as a INFORMATION SCHEMA failed.");
-call mtr.add_suppression("Plugin 'ROCKSDB' registration as a STORAGE ENGINE failed");
-#
-# There are two possible scenarios:
-# ha_rocksdb.{dll,so} is still loaded into mysqld's address space. Its
-# global variables are in the state that doesn't allow it to be
-# initialized back (this is what MDEV-15686 is about). This is handled
-# by intentionally returning an error from rocksdb_init_func.
-#
-# The second case is when ha_rocksdb.{ddl,so} has been fully unloaded
-# and so it will be now loaded as if it happens for the first time.
-INSTALL SONAME 'ha_rocksdb';
-# Whatever happened on the previous step, restore things to the way they
-# were at testcase start.
-UNINSTALL SONAME 'ha_rocksdb';
+INSTALL PLUGIN rocksdb SONAME 'ha_rocksdb';
+ERROR HY000: Plugin 'rocksdb' already installed
+select engine, support from information_schema.engines where engine='rocksdb';
+engine support
+select plugin_name,plugin_status from information_schema.plugins where plugin_name='rocksdb';
+plugin_name plugin_status
+ROCKSDB INACTIVE
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result
index 101e159eaf3..f9e3129c73f 100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result
@@ -47,18 +47,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "range",
- "possible_keys": ["kp1"],
- "key": "kp1",
- "key_length": "5",
- "used_key_parts": ["kp1"],
- "rows": 1000,
- "filtered": 100,
- "index_condition": "t3.kp1 between 2 and 4 and t3.kp1 MOD 3 = 0",
- "attached_condition": "t3.kp2 like '%foo%'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "range",
+ "possible_keys": ["kp1"],
+ "key": "kp1",
+ "key_length": "5",
+ "used_key_parts": ["kp1"],
+ "rows": 1000,
+ "filtered": 100,
+ "index_condition": "t3.kp1 between 2 and 4 and t3.kp1 MOD 3 = 0",
+ "attached_condition": "t3.kp2 like '%foo%'"
+ }
+ }
+ ]
}
}
# Check that we handle the case where out-of-range is encountered sooner
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp_rev.result b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp_rev.result
index b00e0e14e46..3634f8c023e 100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp_rev.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp_rev.result
@@ -47,18 +47,22 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t3",
- "access_type": "range",
- "possible_keys": ["kp1"],
- "key": "kp1",
- "key_length": "5",
- "used_key_parts": ["kp1"],
- "rows": 1000,
- "filtered": 100,
- "index_condition": "t3.kp1 between 2 and 4 and t3.kp1 MOD 3 = 0",
- "attached_condition": "t3.kp2 like '%foo%'"
- }
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t3",
+ "access_type": "range",
+ "possible_keys": ["kp1"],
+ "key": "kp1",
+ "key_length": "5",
+ "used_key_parts": ["kp1"],
+ "rows": 1000,
+ "filtered": 100,
+ "index_condition": "t3.kp1 between 2 and 4 and t3.kp1 MOD 3 = 0",
+ "attached_condition": "t3.kp2 like '%foo%'"
+ }
+ }
+ ]
}
}
# Check that we handle the case where out-of-range is encountered sooner
diff --git a/storage/rocksdb/mysql-test/rocksdb/t/index_key_block_size.test b/storage/rocksdb/mysql-test/rocksdb/t/index_key_block_size.test
index f156aec0021..4edf684383a 100644
--- a/storage/rocksdb/mysql-test/rocksdb/t/index_key_block_size.test
+++ b/storage/rocksdb/mysql-test/rocksdb/t/index_key_block_size.test
@@ -28,11 +28,17 @@ CREATE TABLE t1 (a INT,
SHOW INDEX IN t1;
DROP TABLE t1;
+--error ER_ILLEGAL_HA_CREATE_OPTION
CREATE TABLE t1 (a INT,
b CHAR(8),
PRIMARY KEY ind2(b(1) DESC) KEY_BLOCK_SIZE=32768 COMMENT 'big key_block_size value'
) ENGINE=rocksdb;
+CREATE TABLE t1 (a INT,
+ b CHAR(8),
+ PRIMARY KEY ind2(b(1)) KEY_BLOCK_SIZE=32768 COMMENT 'big key_block_size value'
+) ENGINE=rocksdb;
+
--replace_column 7 #
SHOW INDEX IN t1;
diff --git a/storage/rocksdb/mysql-test/rocksdb/t/mariadb_plugin.test b/storage/rocksdb/mysql-test/rocksdb/t/mariadb_plugin.test
index 0cf56c0cbd5..8f30d7c42b6 100644
--- a/storage/rocksdb/mysql-test/rocksdb/t/mariadb_plugin.test
+++ b/storage/rocksdb/mysql-test/rocksdb/t/mariadb_plugin.test
@@ -31,29 +31,15 @@ disconnect con1;
let $wait_condition= SELECT VARIABLE_VALUE=1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Threads_cached';
--source include/wait_condition.inc
---echo #
---echo # MDEV-15686: Loading MyRocks plugin back after it has been unloaded causes a crash
---echo #
-call mtr.add_suppression("Plugin 'ROCKSDB.*' init function returned error.");
-call mtr.add_suppression("Plugin 'ROCKSDB.*' registration as a INFORMATION SCHEMA failed.");
-call mtr.add_suppression("Plugin 'ROCKSDB' registration as a STORAGE ENGINE failed");
+select engine, support from information_schema.engines where engine='rocksdb';
+select plugin_name,plugin_status from information_schema.plugins where plugin_name='rocksdb';
--echo #
---echo # There are two possible scenarios:
-
---echo # ha_rocksdb.{dll,so} is still loaded into mysqld's address space. Its
---echo # global variables are in the state that doesn't allow it to be
---echo # initialized back (this is what MDEV-15686 is about). This is handled
---echo # by intentionally returning an error from rocksdb_init_func.
+--echo # MDEV-15686: Loading MyRocks plugin back after it has been unloaded causes a crash
--echo #
---echo # The second case is when ha_rocksdb.{ddl,so} has been fully unloaded
---echo # and so it will be now loaded as if it happens for the first time.
-
---error 0,ER_INTERNAL_ERROR
-INSTALL SONAME 'ha_rocksdb';
---echo # Whatever happened on the previous step, restore things to the way they
---echo # were at testcase start.
---error 0,ER_SP_DOES_NOT_EXIST
-UNINSTALL SONAME 'ha_rocksdb';
+--error ER_PLUGIN_INSTALLED
+INSTALL PLUGIN rocksdb SONAME 'ha_rocksdb';
+select engine, support from information_schema.engines where engine='rocksdb';
+select plugin_name,plugin_status from information_schema.plugins where plugin_name='rocksdb';
diff --git a/storage/rocksdb/rdb_datadic.cc b/storage/rocksdb/rdb_datadic.cc
index 939fb085c4f..9afc2100069 100644
--- a/storage/rocksdb/rdb_datadic.cc
+++ b/storage/rocksdb/rdb_datadic.cc
@@ -390,7 +390,7 @@ Rdb_key_def::~Rdb_key_def() {
m_pack_info = nullptr;
}
-void Rdb_key_def::setup(const TABLE *const tbl,
+uint Rdb_key_def::setup(const TABLE *const tbl,
const Rdb_tbl_def *const tbl_def) {
DBUG_ASSERT(tbl != nullptr);
DBUG_ASSERT(tbl_def != nullptr);
@@ -406,7 +406,7 @@ void Rdb_key_def::setup(const TABLE *const tbl,
RDB_MUTEX_LOCK_CHECK(m_mutex);
if (m_maxlength != 0) {
RDB_MUTEX_UNLOCK_CHECK(m_mutex);
- return;
+ return HA_EXIT_SUCCESS;
}
KEY *key_info = nullptr;
@@ -488,6 +488,14 @@ void Rdb_key_def::setup(const TABLE *const tbl,
for (uint src_i = 0; src_i < m_key_parts; src_i++, keypart_to_set++) {
Field *const field = key_part ? key_part->field : nullptr;
+ if (key_part && key_part->key_part_flag & HA_REVERSE_SORT)
+ {
+ my_error(ER_ILLEGAL_HA_CREATE_OPTION, MYF(0),
+ "ROCKSDB", "DESC");
+ RDB_MUTEX_UNLOCK_CHECK(m_mutex);
+ return HA_EXIT_FAILURE;
+ }
+
if (simulating_extkey && !hidden_pk_exists) {
DBUG_ASSERT(secondary_key);
/* Check if this field is already present in the key definition */
@@ -591,6 +599,7 @@ void Rdb_key_def::setup(const TABLE *const tbl,
RDB_MUTEX_UNLOCK_CHECK(m_mutex);
}
+ return HA_EXIT_SUCCESS;
}
/*
@@ -1102,12 +1111,12 @@ size_t Rdb_key_def::get_unpack_header_size(char tag) {
*/
void Rdb_key_def::get_lookup_bitmap(const TABLE *table, MY_BITMAP *map) const {
DBUG_ASSERT(map->bitmap == nullptr);
- bitmap_init(map, nullptr, MAX_REF_PARTS, false);
+ my_bitmap_init(map, nullptr, MAX_REF_PARTS);
uint curr_bitmap_pos = 0;
// Indicates which columns in the read set might be covered.
MY_BITMAP maybe_covered_bitmap;
- bitmap_init(&maybe_covered_bitmap, nullptr, table->read_set->n_bits, false);
+ my_bitmap_init(&maybe_covered_bitmap, nullptr, table->read_set->n_bits);
for (uint i = 0; i < m_key_parts; i++) {
if (table_has_hidden_pk(table) && i + 1 == m_key_parts) {
@@ -1135,8 +1144,8 @@ void Rdb_key_def::get_lookup_bitmap(const TABLE *table, MY_BITMAP *map) const {
}
curr_bitmap_pos++;
} else {
- bitmap_free(&maybe_covered_bitmap);
- bitmap_free(map);
+ my_bitmap_free(&maybe_covered_bitmap);
+ my_bitmap_free(map);
return;
}
break;
@@ -1144,8 +1153,8 @@ void Rdb_key_def::get_lookup_bitmap(const TABLE *table, MY_BITMAP *map) const {
// know this lookup will never be covered.
default:
if (bitmap_is_set(table->read_set, field->field_index)) {
- bitmap_free(&maybe_covered_bitmap);
- bitmap_free(map);
+ my_bitmap_free(&maybe_covered_bitmap);
+ my_bitmap_free(map);
return;
}
break;
@@ -1155,9 +1164,9 @@ void Rdb_key_def::get_lookup_bitmap(const TABLE *table, MY_BITMAP *map) const {
// If there are columns which are not covered in the read set, the lookup
// can't be covered.
if (!bitmap_cmp(table->read_set, &maybe_covered_bitmap)) {
- bitmap_free(map);
+ my_bitmap_free(map);
}
- bitmap_free(&maybe_covered_bitmap);
+ my_bitmap_free(&maybe_covered_bitmap);
}
/*
@@ -1187,7 +1196,7 @@ bool Rdb_key_def::covers_lookup(const rocksdb::Slice *const unpack_info,
MY_BITMAP covered_bitmap;
my_bitmap_map covered_bits;
- bitmap_init(&covered_bitmap, &covered_bits, MAX_REF_PARTS, false);
+ my_bitmap_init(&covered_bitmap, &covered_bits, MAX_REF_PARTS);
covered_bits = rdb_netbuf_to_uint16((const uchar *)unpack_header +
sizeof(RDB_UNPACK_COVERED_DATA_TAG) +
RDB_UNPACK_COVERED_DATA_LEN_SIZE);
@@ -1356,7 +1365,7 @@ uint Rdb_key_def::pack_record(const TABLE *const tbl, uchar *const pack_buffer,
MY_BITMAP covered_bitmap;
my_bitmap_map covered_bits;
uint curr_bitmap_pos = 0;
- bitmap_init(&covered_bitmap, &covered_bits, MAX_REF_PARTS, false);
+ my_bitmap_init(&covered_bitmap, &covered_bits, MAX_REF_PARTS);
for (uint i = 0; i < n_key_parts; i++) {
// Fill hidden pk id into the last key part for secondary keys for tables
@@ -1661,7 +1670,7 @@ int Rdb_key_def::unpack_record(TABLE *const table, uchar *const buf,
bool has_covered_bitmap =
has_unpack_info && (unpack_header[0] == RDB_UNPACK_COVERED_DATA_TAG);
if (has_covered_bitmap) {
- bitmap_init(&covered_bitmap, &covered_bits, MAX_REF_PARTS, false);
+ my_bitmap_init(&covered_bitmap, &covered_bits, MAX_REF_PARTS);
covered_bits = rdb_netbuf_to_uint16((const uchar *)unpack_header +
sizeof(RDB_UNPACK_COVERED_DATA_TAG) +
RDB_UNPACK_COVERED_DATA_LEN_SIZE);
@@ -3852,7 +3861,7 @@ bool Rdb_validate_tbls::scan_for_frms(const std::string &datadir,
/* Scan through the files in the directory */
struct fileinfo *file_info = dir_info->dir_entry;
- for (uint ii = 0; ii < dir_info->number_of_files; ii++, file_info++) {
+ for (size_t ii = 0; ii < dir_info->number_of_files; ii++, file_info++) {
/* Find .frm files that are not temp files (those that contain '#sql') */
const char *ext = strrchr(file_info->name, '.');
if (ext != nullptr && strstr(file_info->name, tmp_file_prefix) == nullptr &&
@@ -3897,7 +3906,7 @@ bool Rdb_validate_tbls::compare_to_actual_tables(const std::string &datadir,
}
file_info = dir_info->dir_entry;
- for (uint ii = 0; ii < dir_info->number_of_files; ii++, file_info++) {
+ for (size_t ii = 0; ii < dir_info->number_of_files; ii++, file_info++) {
/* Ignore files/dirs starting with '.' */
if (file_info->name[0] == '.') continue;
diff --git a/storage/rocksdb/rdb_datadic.h b/storage/rocksdb/rdb_datadic.h
index acff43ab565..e9fc1da728e 100644
--- a/storage/rocksdb/rdb_datadic.h
+++ b/storage/rocksdb/rdb_datadic.h
@@ -593,7 +593,7 @@ class Rdb_key_def {
SECONDARY_FORMAT_VERSION_UPDATE3 = 65535,
};
- void setup(const TABLE *const table, const Rdb_tbl_def *const tbl_def);
+ uint setup(const TABLE *const table, const Rdb_tbl_def *const tbl_def);
static uint extract_ttl_duration(const TABLE *const table_arg,
const Rdb_tbl_def *const tbl_def_arg,
diff --git a/storage/rocksdb/rdb_i_s.cc b/storage/rocksdb/rdb_i_s.cc
index 5350ec3bce9..a3d284dfa64 100644
--- a/storage/rocksdb/rdb_i_s.cc
+++ b/storage/rocksdb/rdb_i_s.cc
@@ -145,9 +145,6 @@ static int rdb_i_s_cfstats_fill_table(
static int rdb_i_s_cfstats_init(void *p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
DBUG_ASSERT(p != nullptr);
my_core::ST_SCHEMA_TABLE *schema;
@@ -241,9 +238,6 @@ static int rdb_i_s_dbstats_fill_table(
static int rdb_i_s_dbstats_init(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
DBUG_ASSERT(p != nullptr);
my_core::ST_SCHEMA_TABLE *schema;
@@ -344,8 +338,6 @@ static int rdb_i_s_perf_context_fill_table(
static int rdb_i_s_perf_context_init(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
DBUG_ASSERT(p != nullptr);
my_core::ST_SCHEMA_TABLE *schema;
@@ -413,9 +405,6 @@ static int rdb_i_s_perf_context_global_fill_table(
static int rdb_i_s_perf_context_global_init(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
DBUG_ASSERT(p != nullptr);
my_core::ST_SCHEMA_TABLE *schema;
@@ -1045,9 +1034,6 @@ static int rdb_i_s_ddl_fill_table(my_core::THD *const thd,
static int rdb_i_s_ddl_init(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
my_core::ST_SCHEMA_TABLE *schema;
DBUG_ASSERT(p != nullptr);
@@ -1063,9 +1049,6 @@ static int rdb_i_s_ddl_init(void *const p) {
static int rdb_i_s_cfoptions_init(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
DBUG_ASSERT(p != nullptr);
my_core::ST_SCHEMA_TABLE *schema;
@@ -1081,9 +1064,6 @@ static int rdb_i_s_cfoptions_init(void *const p) {
static int rdb_i_s_global_info_init(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
DBUG_ASSERT(p != nullptr);
my_core::ST_SCHEMA_TABLE *schema;
@@ -1101,9 +1081,6 @@ static int rdb_i_s_compact_stats_init(void *p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
DBUG_ASSERT(p != nullptr);
schema = reinterpret_cast<my_core::ST_SCHEMA_TABLE *>(p);
@@ -1438,9 +1415,6 @@ static int rdb_i_s_index_file_map_fill_table(
static int rdb_i_s_index_file_map_init(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
DBUG_ASSERT(p != nullptr);
my_core::ST_SCHEMA_TABLE *schema;
@@ -1523,9 +1497,6 @@ static int rdb_i_s_lock_info_fill_table(
static int rdb_i_s_lock_info_init(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
DBUG_ASSERT(p != nullptr);
my_core::ST_SCHEMA_TABLE *schema;
@@ -1651,9 +1622,6 @@ static int rdb_i_s_trx_info_fill_table(
static int rdb_i_s_trx_info_init(void *const p) {
DBUG_ENTER_FUNC();
- if (prevent_myrocks_loading)
- DBUG_RETURN(1);
-
DBUG_ASSERT(p != nullptr);
my_core::ST_SCHEMA_TABLE *schema;
@@ -1781,7 +1749,8 @@ static int rdb_i_s_deadlock_info_init(void *const p) {
static int rdb_i_s_deinit(void *p MY_ATTRIBUTE((__unused__))) {
DBUG_ENTER_FUNC();
- DBUG_RETURN(0);
+ /* see the comment at the end of rocksdb_done_func() */
+ DBUG_RETURN(1);
}
static struct st_mysql_information_schema rdb_i_s_info = {
@@ -1955,7 +1924,7 @@ struct st_maria_plugin rdb_i_s_lock_info = {
"RocksDB lock information",
PLUGIN_LICENSE_GPL,
rdb_i_s_lock_info_init,
- nullptr,
+ rdb_i_s_deinit,
0x0001, /* version number (0.1) */
nullptr, /* status variables */
nullptr, /* system variables */
@@ -1971,7 +1940,7 @@ struct st_maria_plugin rdb_i_s_trx_info = {
"RocksDB transaction information",
PLUGIN_LICENSE_GPL,
rdb_i_s_trx_info_init,
- nullptr,
+ rdb_i_s_deinit,
0x0001, /* version number (0.1) */
nullptr, /* status variables */
nullptr, /* system variables */
@@ -1987,7 +1956,7 @@ struct st_maria_plugin rdb_i_s_deadlock_info = {
"RocksDB transaction information",
PLUGIN_LICENSE_GPL,
rdb_i_s_deadlock_info_init,
- nullptr,
+ rdb_i_s_deinit,
0x0001, /* version number (0.1) */
nullptr, /* status variables */
nullptr, /* system variables */
diff --git a/storage/rocksdb/rdb_sst_info.cc b/storage/rocksdb/rdb_sst_info.cc
index 45ae89c1bd4..ae3938c3918 100644
--- a/storage/rocksdb/rdb_sst_info.cc
+++ b/storage/rocksdb/rdb_sst_info.cc
@@ -542,7 +542,7 @@ void Rdb_sst_info::init(const rocksdb::DB *const db) {
// Scan through the files in the directory
const struct fileinfo *file_info = dir_info->dir_entry;
- for (uint ii= 0; ii < dir_info->number_of_files; ii++, file_info++) {
+ for (size_t ii= 0; ii < dir_info->number_of_files; ii++, file_info++) {
// find any files ending with m_suffix ...
const std::string name = file_info->name;
const size_t pos = name.find(m_suffix);
diff --git a/storage/spider/CMakeLists.txt b/storage/spider/CMakeLists.txt
index 898421fa532..bc682e96609 100644
--- a/storage/spider/CMakeLists.txt
+++ b/storage/spider/CMakeLists.txt
@@ -17,10 +17,7 @@ SET(SPIDER_SOURCES
spd_param.cc spd_sys_table.cc spd_trx.cc spd_db_conn.cc spd_conn.cc
spd_table.cc spd_direct_sql.cc spd_udf.cc spd_ping_table.cc
spd_copy_tables.cc spd_i_s.cc spd_malloc.cc ha_spider.cc spd_udf.def
- spd_db_mysql.cc spd_db_handlersocket.cc spd_db_oracle.cc
- spd_group_by_handler.cc spd_db_include.cc
- hs_client/config.cpp hs_client/escape.cpp hs_client/fatal.cpp
- hs_client/hstcpcli.cpp hs_client/socket.cpp hs_client/string_util.cpp
+ spd_db_mysql.cc spd_db_oracle.cc spd_group_by_handler.cc spd_db_include.cc
)
IF(DEFINED ENV{ORACLE_HOME})
diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc
index 77e942541a7..9504b5a6c26 100644
--- a/storage/spider/ha_spider.cc
+++ b/storage/spider/ha_spider.cc
@@ -82,10 +82,6 @@ ha_spider::ha_spider(
conn_keys = NULL;
spider_thread_id = 0;
trx_conn_adjustment = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- trx_hs_r_conn_adjustment = 0;
- trx_hs_w_conn_adjustment = 0;
-#endif
search_link_query_id = 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE
partition_handler = NULL;
@@ -115,14 +111,6 @@ ha_spider::ha_spider(
use_pre_action = FALSE;
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
do_direct_update = FALSE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- hs_pushed_ret_fields_num = MAX_FIELDS;
- hs_pushed_ret_fields = NULL;
- hs_pushed_ret_fields_size = 0;
- hs_increment = FALSE;
- hs_decrement = FALSE;
- hs_pushed_strref_num = 0;
-#endif
#endif
#ifdef HA_CAN_BULK_ACCESS
is_bulk_access_clone = FALSE;
@@ -145,16 +133,10 @@ ha_spider::ha_spider(
result_list.insert_sqls = NULL;
result_list.update_sqls = NULL;
result_list.tmp_sqls = NULL;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- result_list.hs_result_buf = NULL;
-#endif
result_list.tmp_tables_created = FALSE;
result_list.bgs_working = FALSE;
result_list.direct_order_limit = FALSE;
result_list.direct_limit_offset = FALSE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- result_list.hs_has_result = FALSE;
-#endif
result_list.set_split_read = FALSE;
result_list.insert_dup_update_pushdown = FALSE;
result_list.tmp_pos_row_first = NULL;
@@ -185,10 +167,6 @@ ha_spider::ha_spider(
conn_keys = NULL;
spider_thread_id = 0;
trx_conn_adjustment = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- trx_hs_r_conn_adjustment = 0;
- trx_hs_w_conn_adjustment = 0;
-#endif
search_link_query_id = 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE
partition_handler = NULL;
@@ -218,14 +196,6 @@ ha_spider::ha_spider(
use_pre_action = FALSE;
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
do_direct_update = FALSE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- hs_pushed_ret_fields_num = MAX_FIELDS;
- hs_pushed_ret_fields = NULL;
- hs_pushed_ret_fields_size = 0;
- hs_increment = FALSE;
- hs_decrement = FALSE;
- hs_pushed_strref_num = 0;
-#endif
#endif
#ifdef HA_CAN_BULK_ACCESS
is_bulk_access_clone = FALSE;
@@ -248,16 +218,10 @@ ha_spider::ha_spider(
result_list.insert_sqls = NULL;
result_list.update_sqls = NULL;
result_list.tmp_sqls = NULL;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- result_list.hs_result_buf = NULL;
-#endif
result_list.tmp_tables_created = FALSE;
result_list.bgs_working = FALSE;
result_list.direct_order_limit = FALSE;
result_list.direct_limit_offset = FALSE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- result_list.hs_has_result = FALSE;
-#endif
result_list.set_split_read = FALSE;
result_list.insert_dup_update_pushdown = FALSE;
result_list.tmp_pos_row_first = NULL;
@@ -748,25 +712,8 @@ int ha_spider::close()
delete [] result_list.tmp_sqls;
result_list.tmp_sqls = NULL;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (result_list.hs_result_buf)
- {
- delete result_list.hs_result_buf;
- result_list.hs_result_buf = NULL;
- }
-#endif
spider_free_share(share);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (hs_pushed_ret_fields)
- {
- spider_free(spider_current_trx, hs_pushed_ret_fields, MYF(0));
- hs_pushed_ret_fields = NULL;
- hs_pushed_ret_fields_size = 0;
- }
-#endif
-#endif
is_clone = FALSE;
pt_clone_source_handler = NULL;
share = NULL;
@@ -785,84 +732,6 @@ int ha_spider::check_access_kind_for_connection(
conn_kinds = 0;
switch (wide_handler->sql_command)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- case SQLCOM_HS_READ:
- for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
- {
- if (!write_request)
- {
- DBUG_PRINT("info",("spider spider_use_hs_read=%d",
- spider_param_use_hs_read(thd, share->use_hs_reads[roop_count])));
- DBUG_PRINT("info",("spider use_hs_reads[%d]=%ld", roop_count,
- share->use_hs_reads[roop_count]));
- if (spider_param_use_hs_read(thd, share->use_hs_reads[roop_count]))
- {
- DBUG_PRINT("info",("spider set %d to HS_READ", roop_count));
- conn_kinds |= SPIDER_CONN_KIND_HS_READ;
- conn_kind[roop_count] = SPIDER_CONN_KIND_HS_READ;
- } else {
- conn_kinds |= SPIDER_CONN_KIND_MYSQL;
- conn_kind[roop_count] = SPIDER_CONN_KIND_MYSQL;
- }
- } else if (share->hs_write_to_reads[roop_count])
- {
- DBUG_PRINT("info",("spider spider_use_hs_write=%d",
- spider_param_use_hs_write(thd, share->use_hs_writes[roop_count])));
- DBUG_PRINT("info",("spider use_hs_write[%d]=%ld", roop_count,
- share->use_hs_writes[roop_count]));
- if (spider_param_use_hs_write(thd, share->use_hs_writes[roop_count]))
- {
- DBUG_PRINT("info",("spider set %d to HS_WRITE", roop_count));
- conn_kinds |= SPIDER_CONN_KIND_HS_READ;
- conn_kind[roop_count] = SPIDER_CONN_KIND_HS_READ;
- } else {
- conn_kinds |= SPIDER_CONN_KIND_MYSQL;
- conn_kind[roop_count] = SPIDER_CONN_KIND_MYSQL;
- }
- } else {
- DBUG_PRINT("info",("spider spider_use_hs_write=%d",
- spider_param_use_hs_write(thd, share->use_hs_writes[roop_count])));
- DBUG_PRINT("info",("spider use_hs_write[%d]=%ld", roop_count,
- share->use_hs_writes[roop_count]));
- if (spider_param_use_hs_write(thd, share->use_hs_writes[roop_count]))
- {
- DBUG_PRINT("info",("spider set %d to HS_WRITE", roop_count));
- conn_kinds |= SPIDER_CONN_KIND_HS_WRITE;
- conn_kind[roop_count] = SPIDER_CONN_KIND_HS_WRITE;
- } else {
- conn_kinds |= SPIDER_CONN_KIND_MYSQL;
- conn_kind[roop_count] = SPIDER_CONN_KIND_MYSQL;
- }
- }
- }
- break;
- case SQLCOM_HS_UPDATE:
- case SQLCOM_HS_DELETE:
- conn_kinds |= SPIDER_CONN_KIND_MYSQL;
- for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
- {
- conn_kind[roop_count] = SPIDER_CONN_KIND_MYSQL;
- }
- break;
- case SQLCOM_HS_INSERT:
- for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
- {
- DBUG_PRINT("info",("spider spider_use_hs_write=%d",
- spider_param_use_hs_write(thd, share->use_hs_writes[roop_count])));
- DBUG_PRINT("info",("spider use_hs_write[%d]=%ld", roop_count,
- share->use_hs_writes[roop_count]));
- if (spider_param_use_hs_write(thd, share->use_hs_writes[roop_count]))
- {
- DBUG_PRINT("info",("spider set %d to HS_WRITE", roop_count));
- conn_kinds |= SPIDER_CONN_KIND_HS_WRITE;
- conn_kind[roop_count] = SPIDER_CONN_KIND_HS_WRITE;
- } else {
- conn_kinds |= SPIDER_CONN_KIND_MYSQL;
- conn_kind[roop_count] = SPIDER_CONN_KIND_MYSQL;
- }
- }
- break;
-#endif
case SQLCOM_UPDATE:
case SQLCOM_UPDATE_MULTI:
case SQLCOM_DELETE:
@@ -875,12 +744,6 @@ int ha_spider::check_access_kind_for_connection(
}
break;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = reset_hs_strs_pos(SPIDER_SQL_TYPE_UPDATE_HS)))
- {
- DBUG_RETURN(error_num);
- }
-#endif
if ((error_num = spider_check_trx_and_get_conn(thd, this, TRUE)))
{
DBUG_RETURN(error_num);
@@ -915,17 +778,9 @@ void ha_spider::check_access_kind(
DBUG_PRINT("info",("spider sql_command=%u", wide_handler->sql_command));
DBUG_PRINT("info",("spider thd->query_id=%lld", thd->query_id));
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-#ifdef HS_HAS_SQLCOM
- if (wide_handler->sql_command == SQLCOM_HS_UPDATE)
- wide_handler->update_request = TRUE;
- else
-#endif
wide_handler->update_request = FALSE;
#else
if (
-#ifdef HS_HAS_SQLCOM
- wide_handler->sql_command == SQLCOM_HS_UPDATE ||
-#endif
wide_handler->sql_command == SQLCOM_UPDATE ||
wide_handler->sql_command == SQLCOM_UPDATE_MULTI ||
/* for triggers */
@@ -1008,9 +863,6 @@ THR_LOCK_DATA **ha_spider::store_lock(
{
case SQLCOM_SELECT:
case SQLCOM_HA_READ:
-#ifdef HS_HAS_SQLCOM
- case SQLCOM_HS_READ:
-#endif
if (lock_type == TL_READ_WITH_SHARED_LOCKS)
wide_handler->lock_mode = 1;
else if (lock_type <= TL_READ_NO_INSERT)
@@ -1023,9 +875,6 @@ THR_LOCK_DATA **ha_spider::store_lock(
break;
case SQLCOM_UPDATE:
case SQLCOM_UPDATE_MULTI:
-#ifdef HS_HAS_SQLCOM
- case SQLCOM_HS_UPDATE:
-#endif
case SQLCOM_CREATE_TABLE:
case SQLCOM_INSERT:
case SQLCOM_INSERT_SELECT:
@@ -1034,10 +883,6 @@ THR_LOCK_DATA **ha_spider::store_lock(
case SQLCOM_REPLACE:
case SQLCOM_REPLACE_SELECT:
case SQLCOM_DELETE_MULTI:
-#ifdef HS_HAS_SQLCOM
- case SQLCOM_HS_INSERT:
- case SQLCOM_HS_DELETE:
-#endif
if (lock_type >= TL_READ && lock_type <= TL_READ_NO_INSERT)
{
wide_handler->lock_mode = -2;
@@ -1475,13 +1320,6 @@ int ha_spider::reset()
ft_count = 0;
ft_init_without_index_init = FALSE;
sql_kinds = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- hs_pushed_ret_fields_num = MAX_FIELDS;
- hs_increment = FALSE;
- hs_decrement = FALSE;
-#endif
-#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
do_direct_update = FALSE;
#endif
@@ -1489,10 +1327,6 @@ int ha_spider::reset()
result_list.have_sql_kind_backup = FALSE;
result_list.direct_order_limit = FALSE;
result_list.direct_limit_offset = FALSE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num2 = reset_hs_strs(SPIDER_SQL_TYPE_UPDATE_HS)))
- error_num = error_num2;
-#endif
result_list.set_split_read = FALSE;
result_list.insert_dup_update_pushdown = FALSE;
use_spatial_index = FALSE;
@@ -1687,12 +1521,6 @@ int ha_spider::index_init(
if ((error_num = reset_sql_sql(
SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = reset_hs_sql(SPIDER_SQL_TYPE_SELECT_HS)))
- DBUG_RETURN(error_num);
- if ((error_num = reset_hs_keys(SPIDER_SQL_TYPE_SELECT_HS)))
- DBUG_RETURN(error_num);
-#endif
result_list.check_direct_order_limit = FALSE;
prev_index_rnd_init = SPD_INDEX;
DBUG_RETURN(0);
@@ -1801,10 +1629,6 @@ int ha_spider::index_read_map_internal(
if ((error_num = reset_sql_sql(
SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = reset_hs_keys(SPIDER_SQL_TYPE_SELECT_HS)))
- DBUG_RETURN(error_num);
-#endif
#ifndef WITHOUT_SPIDER_BG_SEARCH
if ((error_num = spider_set_conn_bg_param(this)))
DBUG_RETURN(error_num);
@@ -1892,18 +1716,6 @@ int ha_spider::index_read_map_internal(
DBUG_RETURN(error_num);
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (sql_kinds & SPIDER_SQL_KIND_HS)
- {
- if ((error_num = append_limit_hs_part(
- result_list.internal_offset,
- result_list.limit_num,
- SPIDER_SQL_TYPE_SELECT_HS)))
- {
- DBUG_RETURN(error_num);
- }
- }
-#endif
int roop_start, roop_end, lock_mode, link_ok;
lock_mode = spider_conn_lock_mode(this);
@@ -1964,10 +1776,6 @@ int ha_spider::index_read_map_internal(
} else {
#endif
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
if (sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
@@ -1975,15 +1783,6 @@ int ha_spider::index_read_map_internal(
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
spider_db_handler *dbton_hdl = dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -2230,19 +2029,7 @@ int ha_spider::index_read_map(
conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- }
-#endif
if ((tmp_error_num = spider_db_bulk_store_result(this, conn,
roop_count, (roop_count != link_ok))))
{
@@ -2316,14 +2103,7 @@ int ha_spider::index_read_last_map_internal(
spider_db_free_one_result_for_start_next(this);
*/
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (
- result_list.hs_has_result ||
-#endif
result_list.current
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- )
-#endif
&&
(error_num = spider_db_free_result(this, FALSE))
)
@@ -2336,10 +2116,6 @@ int ha_spider::index_read_last_map_internal(
if ((error_num = reset_sql_sql(
SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = reset_hs_keys(SPIDER_SQL_TYPE_SELECT_HS)))
- DBUG_RETURN(error_num);
-#endif
#ifndef WITHOUT_SPIDER_BG_SEARCH
if ((error_num = spider_set_conn_bg_param(this)))
DBUG_RETURN(error_num);
@@ -2475,10 +2251,6 @@ int ha_spider::index_read_last_map_internal(
} else {
#endif
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
if (sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
@@ -2486,15 +2258,6 @@ int ha_spider::index_read_last_map_internal(
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
spider_db_handler *dbton_hdl = dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -2808,9 +2571,6 @@ int ha_spider::index_first_internal(
pt_clone_source_handler->pt_clone_last_searcher = this;
}
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- result_list.hs_has_result ||
-#endif
sql_is_empty(SPIDER_SQL_TYPE_HANDLER) ||
sql_is_empty(SPIDER_SQL_TYPE_SELECT_SQL)
) {
@@ -2960,10 +2720,6 @@ int ha_spider::index_first_internal(
} else {
#endif
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
if (sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
@@ -2971,15 +2727,6 @@ int ha_spider::index_first_internal(
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
spider_db_handler *dbton_hdl = dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -3211,9 +2958,6 @@ int ha_spider::index_last_internal(
pt_clone_source_handler->pt_clone_last_searcher = this;
}
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- result_list.hs_has_result ||
-#endif
sql_is_empty(SPIDER_SQL_TYPE_HANDLER) ||
sql_is_empty(SPIDER_SQL_TYPE_SELECT_SQL)
) {
@@ -3363,10 +3107,6 @@ int ha_spider::index_last_internal(
} else {
#endif
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
if (sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
@@ -3374,15 +3114,6 @@ int ha_spider::index_last_internal(
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
spider_db_handler *dbton_hdl = dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -3686,10 +3417,6 @@ int ha_spider::read_range_first_internal(
if ((error_num = reset_sql_sql(
SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = reset_hs_keys(SPIDER_SQL_TYPE_SELECT_HS)))
- DBUG_RETURN(error_num);
-#endif
#ifndef WITHOUT_SPIDER_BG_SEARCH
if ((error_num = spider_set_conn_bg_param(this)))
DBUG_RETURN(error_num);
@@ -3826,10 +3553,6 @@ int ha_spider::read_range_first_internal(
} else {
#endif
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
if (sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
@@ -3837,15 +3560,6 @@ int ha_spider::read_range_first_internal(
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
spider_db_handler *dbton_hdl = dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -4085,26 +3799,11 @@ void ha_spider::reset_no_where_cond()
{
uint roop_count;
DBUG_ENTER("ha_spider::reset_no_where_cond");
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (sql_kinds & (SPIDER_SQL_KIND_SQL | SPIDER_SQL_KIND_HANDLER))
- {
-#endif
for (roop_count = 0; roop_count < share->use_sql_dbton_count; roop_count++)
{
dbton_handler[share->use_sql_dbton_ids[roop_count]]->no_where_cond =
FALSE;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
- if (sql_kinds & SPIDER_SQL_KIND_HS)
- {
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_handler[share->use_hs_dbton_ids[roop_count]]->no_where_cond =
- FALSE;
- }
- }
-#endif
DBUG_VOID_RETURN;
}
@@ -4112,10 +3811,6 @@ bool ha_spider::check_no_where_cond()
{
uint roop_count;
DBUG_ENTER("ha_spider::check_no_where_cond");
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (sql_kinds & (SPIDER_SQL_KIND_SQL | SPIDER_SQL_KIND_HANDLER))
- {
-#endif
for (roop_count = 0; roop_count < share->use_sql_dbton_count; roop_count++)
{
if (dbton_handler[share->use_sql_dbton_ids[roop_count]]->no_where_cond)
@@ -4123,19 +3818,6 @@ bool ha_spider::check_no_where_cond()
DBUG_RETURN(TRUE);
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
- if (sql_kinds & SPIDER_SQL_KIND_HS)
- {
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- if (dbton_handler[share->use_hs_dbton_ids[roop_count]]->no_where_cond)
- {
- DBUG_RETURN(TRUE);
- }
- }
- }
-#endif
DBUG_RETURN(FALSE);
}
@@ -4367,10 +4049,6 @@ int ha_spider::read_multi_range_first_internal(
if ((error_num = reset_sql_sql(
SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = reset_hs_keys(SPIDER_SQL_TYPE_SELECT_HS)))
- DBUG_RETURN(error_num);
-#endif
result_list.desc_flg = FALSE;
#ifdef HA_MRR_USE_DEFAULT_IMPL
result_list.sorted = mrr_is_output_sorted;
@@ -4532,10 +4210,6 @@ int ha_spider::read_multi_range_first_internal(
} else {
#endif
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
if (sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
@@ -4543,15 +4217,6 @@ int ha_spider::read_multi_range_first_internal(
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
spider_db_handler *dbton_hdl = dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -4902,9 +4567,6 @@ int ha_spider::read_multi_range_first_internal(
result_list.tmp_reuse_sql = FALSE;
if (bka_mode &&
have_multi_range &&
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- !(sql_kinds & SPIDER_SQL_KIND_HS) &&
-#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE)
#else
@@ -5357,10 +5019,6 @@ int ha_spider::read_multi_range_first_internal(
} else {
#endif
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
if (sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
@@ -5368,15 +5026,6 @@ int ha_spider::read_multi_range_first_internal(
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
spider_db_handler *dbton_hdl = dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -5697,10 +5346,6 @@ int ha_spider::read_multi_range_first_internal(
if ((error_num = reset_sql_sql(
SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = reset_hs_keys(SPIDER_SQL_TYPE_SELECT_HS)))
- DBUG_RETURN(error_num);
-#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
#else
multi_range_ranges = multi_range_curr;
@@ -6034,10 +5679,6 @@ int ha_spider::read_multi_range_next(
} else {
#endif
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
if (sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
@@ -6045,15 +5686,6 @@ int ha_spider::read_multi_range_next(
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
spider_db_handler *dbton_hdl = dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -6375,10 +6007,6 @@ int ha_spider::read_multi_range_next(
if ((error_num = reset_sql_sql(
SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = reset_hs_keys(SPIDER_SQL_TYPE_SELECT_HS)))
- DBUG_RETURN(error_num);
-#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
#else
multi_range_ranges = multi_range_curr;
@@ -6415,9 +6043,6 @@ int ha_spider::read_multi_range_next(
result_list.tmp_reuse_sql = FALSE;
if (bka_mode &&
have_multi_range &&
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- !(sql_kinds & SPIDER_SQL_KIND_HS) &&
-#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
SPIDER_TEST(mrr_cur_range.range_flag & EQ_RANGE)
#else
@@ -6854,10 +6479,6 @@ int ha_spider::read_multi_range_next(
} else {
#endif
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = conns[roop_count];
if (sql_kind[roop_count] == SPIDER_SQL_KIND_SQL)
{
@@ -6865,15 +6486,6 @@ int ha_spider::read_multi_range_next(
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- conn = hs_r_conns[roop_count];
- else
- conn = hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
spider_db_handler *dbton_hdl = dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -7188,12 +6800,6 @@ int ha_spider::read_multi_range_next(
if ((error_num = reset_sql_sql(
SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (
- (error_num = reset_hs_keys(SPIDER_SQL_TYPE_SELECT_HS))
- )
- DBUG_RETURN(error_num);
-#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
#else
multi_range_ranges = multi_range_curr;
@@ -7308,13 +6914,6 @@ int ha_spider::rnd_init(
if ((error_num = reset_sql_sql(
SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (
- (error_num = reset_hs_sql(SPIDER_SQL_TYPE_SELECT_HS)) ||
- (error_num = reset_hs_keys(SPIDER_SQL_TYPE_SELECT_HS))
- )
- DBUG_RETURN(error_num);
-#endif
result_list.check_direct_order_limit = FALSE;
}
}
@@ -7386,10 +6985,6 @@ int ha_spider::rnd_next_internal(
if (rnd_scan_and_first)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (sql_kinds & SPIDER_SQL_KIND_HS)
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
-#endif
#ifndef WITHOUT_SPIDER_BG_SEARCH
if ((error_num = spider_set_conn_bg_param(this)))
DBUG_RETURN(error_num);
@@ -9429,11 +9024,6 @@ ulonglong ha_spider::table_flags() const
#ifdef SPIDER_ENGINE_CONDITION_PUSHDOWN_IS_ALWAYS_ON
HA_CAN_TABLE_CONDITION_PUSHDOWN |
#endif
-#ifdef HA_CAN_BULK_ACCESS
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (support_bulk_access_hs() ? HA_CAN_BULK_ACCESS : 0) |
-#endif
-#endif
SPIDER_CAN_BG_SEARCH |
SPIDER_CAN_BG_INSERT |
SPIDER_CAN_BG_UPDATE |
@@ -9672,6 +9262,9 @@ void ha_spider::get_auto_increment(
THD *thd = ha_thd();
int auto_increment_mode = spider_param_auto_increment_mode(thd,
share->auto_increment_mode);
+ bool rev= table->key_info[table->s->next_number_index].
+ key_part[table->s->next_number_keypart].key_part_flag &
+ HA_REVERSE_SORT;
DBUG_ENTER("ha_spider::get_auto_increment");
DBUG_PRINT("info",("spider this=%p", this));
*nb_reserved_values = ULONGLONG_MAX;
@@ -9691,7 +9284,9 @@ void ha_spider::get_auto_increment(
table_share->next_number_key_offset);
error_num = index_read_last_map(table->record[1], key,
make_prev_keypart_map(table_share->next_number_keypart));
- } else
+ } else if (rev)
+ error_num = index_first(table->record[1]);
+ else
error_num = index_last(table->record[1]);
if (error_num)
@@ -9966,32 +9561,9 @@ void ha_spider::direct_update_init(
THD *thd,
bool hs_request
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint roop_count;
-#endif
DBUG_ENTER("ha_spider::direct_update_init");
DBUG_PRINT("info",("spider this=%p", this));
do_direct_update = TRUE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (hs_request)
- {
- maybe_do_hs_direct_update = TRUE;
- memset(do_hs_direct_update, 0, share->link_bitmap_size);
- for (roop_count = 0; roop_count < share->link_count; roop_count++)
- {
- if (spider_param_use_hs_write(thd, share->use_hs_writes[roop_count]))
- {
- DBUG_PRINT("info",("spider do_hs_direct_update[%d]=TRUE",
- roop_count));
- spider_set_bit(do_hs_direct_update, roop_count);
- } else {
- maybe_do_hs_direct_update = FALSE;
- }
- }
- } else {
- maybe_do_hs_direct_update = FALSE;
- }
-#endif
DBUG_VOID_RETURN;
}
#endif
@@ -10193,9 +9765,6 @@ int ha_spider::direct_update_rows_init(
)
#endif
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int error_num;
-#endif
st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
@@ -10237,11 +9806,7 @@ int ha_spider::direct_update_rows_init(
}
direct_update_init(
thd,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- sql_command == SQLCOM_HS_UPDATE
-#else
FALSE
-#endif
);
if (!condition)
cond_check = FALSE;
@@ -10293,41 +9858,14 @@ int ha_spider::direct_update_rows_init(
DBUG_PRINT("info",("spider offset_limit=%lld", offset_limit));
DBUG_PRINT("info",("spider mode=%u", mode));
DBUG_PRINT("info",("spider sql_command=%u", sql_command));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- DBUG_PRINT("info",("spider maybe_do_hs_direct_update=%s",
- maybe_do_hs_direct_update ? "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider hs_pushed_ret_fields_num=%zu",
- hs_pushed_ret_fields_num));
-#endif
DBUG_PRINT("info",("spider do_direct_update=%s",
do_direct_update ? "TRUE" : "FALSE"));
if (
(
!offset_limit
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- || (mode == 2 && maybe_do_hs_direct_update)
-#endif
) &&
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- sql_command == SQLCOM_HS_UPDATE &&
- hs_pushed_ret_fields_num < MAX_FIELDS &&
-#endif
do_direct_update
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- DBUG_PRINT("info",("spider pk_update=%s", pk_update ? "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider start_key=%p", &ranges->start_key));
- if (pk_update && spider_check_hs_pk_update(this, &ranges->start_key))
- {
- DBUG_PRINT("info",("spider FALSE by pk_update"));
- do_direct_update = FALSE;
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
- }
- if ((error_num = spider_check_trx_and_get_conn(thd, this, TRUE)))
- {
- DBUG_RETURN(error_num);
- }
-#endif
wide_handler->trx->direct_update_count++;
DBUG_PRINT("info",("spider OK"));
DBUG_RETURN(0);
@@ -10825,9 +10363,6 @@ int ha_spider::direct_delete_rows_init(
uint range_count,
bool sorted
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int error_num;
-#endif
st_select_lex *select_lex;
longlong select_limit;
longlong offset_limit;
@@ -10862,11 +10397,7 @@ int ha_spider::direct_delete_rows_init(
}
direct_update_init(
thd,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- sql_command == SQLCOM_HS_DELETE
-#else
FALSE
-#endif
);
if (!condition)
cond_check = FALSE;
@@ -10915,21 +10446,9 @@ int ha_spider::direct_delete_rows_init(
if (
(
!offset_limit
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- || (mode == 2 && maybe_do_hs_direct_update)
-#endif
) &&
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- sql_command == SQLCOM_HS_DELETE &&
-#endif
do_direct_update
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = spider_check_trx_and_get_conn(thd, this, TRUE)))
- {
- DBUG_RETURN(error_num);
- }
-#endif
wide_handler->trx->direct_delete_count++;
DBUG_PRINT("info",("spider OK"));
DBUG_RETURN(0);
@@ -12276,9 +11795,6 @@ int ha_spider::info_push(
#ifdef HA_CAN_BULK_ACCESS
if (
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- info_type != INFO_KIND_HS_RET_FIELDS &&
-#endif
#endif
info_type != INFO_KIND_BULK_ACCESS_BEGIN &&
info_type != INFO_KIND_BULK_ACCESS_CURRENT &&
@@ -12305,144 +11821,6 @@ int ha_spider::info_push(
switch (info_type)
{
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- case INFO_KIND_HS_RET_FIELDS:
- {
- DBUG_PRINT("info",("spider INFO_KIND_HS_RET_FIELDS"));
- size_t roop_count;
- Field *field;
- SPIDER_HS_UINT32_INFO *tmp_info = (SPIDER_HS_UINT32_INFO *) info;
- wide_handler->hs_pushed_ret_fields_num = tmp_info->info_size;
- if (wide_handler->hs_pushed_ret_fields_size <
- wide_handler->hs_pushed_ret_fields_num)
- {
- if (wide_handler->hs_pushed_ret_fields)
- spider_free(spider_current_trx, wide_handler->hs_pushed_ret_fields,
- MYF(0));
- if (!(wide_handler->hs_pushed_ret_fields = (uint32 *)
- spider_bulk_malloc(spider_current_trx, 17, MYF(MY_WME),
- &wide_handler->hs_pushed_ret_fields,
- sizeof(uint32) * wide_handler->hs_pushed_ret_fields_num,
- NullS))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- wide_handler->hs_pushed_ret_fields_size =
- wide_handler->hs_pushed_ret_fields_num;
- }
- memcpy(wide_handler->hs_pushed_ret_fields, tmp_info->info,
- sizeof(uint32) * wide_handler->hs_pushed_ret_fields_num);
- bitmap_clear_all(table->read_set);
- bitmap_clear_all(table->write_set);
- wide_handler->hs_pushed_lcl_fields_num = 0;
- for (roop_count = 0; roop_count < wide_handler->hs_pushed_ret_fields_num;
- roop_count++)
- {
- field = get_top_table_field(
- wide_handler->hs_pushed_ret_fields[roop_count]);
- if ((field = field_exchange(field)))
- {
- if (!bitmap_is_set(table->read_set, field->field_index))
- {
- ++wide_handler->hs_pushed_lcl_fields_num;
- bitmap_set_bit(table->read_set, field->field_index);
- bitmap_set_bit(table->write_set, field->field_index);
- }
- }
- }
- }
- break;
- case INFO_KIND_HS_APPEND_STRING_REF:
- {
- DBUG_PRINT("info",("spider INFO_KIND_HS_APPEND_STRING_REF"));
-#ifndef DBUG_OFF
- SPIDER_HS_STRING_REF *tmp_ref = (SPIDER_HS_STRING_REF*) info;
- char print_buf[MAX_FIELD_WIDTH];
- if (tmp_ref->size() < MAX_FIELD_WIDTH)
- {
- memcpy(print_buf, tmp_ref->begin(), tmp_ref->size());
- print_buf[tmp_ref->size()] = '\0';
- DBUG_PRINT("info",("spider info=%s", print_buf));
- }
-#endif
- Field *field;
- if (wide_handler->hs_pushed_ret_fields)
- {
- field = get_top_table_field(
- wide_handler->hs_pushed_ret_fields[
- wide_handler->hs_pushed_strref_num]);
- } else {
- field = get_top_table_field(
- pt_clone_source_handler->wide_handler->hs_pushed_ret_fields[
- wide_handler->hs_pushed_strref_num]);
- }
- if (!field_exchange(field))
- {
- wide_handler->hs_pushed_strref_num++;
- break;
- }
- wide_handler->hs_pushed_strref_num++;
- if (partition_handler && partition_handler->handlers)
- {
- size_t roop_count;
- ha_spider **handlers = partition_handler->handlers;
- for (roop_count = 0; roop_count < partition_handler->no_parts;
- ++roop_count)
- {
- if ((error_num = handlers[roop_count]->push_back_hs_upds(
- *((SPIDER_HS_STRING_REF*) info))))
- {
- DBUG_RETURN(error_num);
- }
- }
- } else {
- if ((error_num = push_back_hs_upds(*((SPIDER_HS_STRING_REF*) info))))
- {
- DBUG_RETURN(error_num);
- }
- }
- break;
- }
- case INFO_KIND_HS_CLEAR_STRING_REF:
- DBUG_PRINT("info",("spider INFO_KIND_HS_CLEAR_STRING_REF"));
- wide_handler->hs_pushed_strref_num = 0;
- if (partition_handler && partition_handler->handlers)
- {
- size_t roop_count;
- ha_spider **handlers = partition_handler->handlers;
- for (roop_count = 0; roop_count < partition_handler->no_parts;
- ++roop_count)
- {
- if ((error_num = handlers[roop_count]->reset_hs_upds(
- SPIDER_SQL_TYPE_UPDATE_HS)))
- {
- DBUG_RETURN(error_num);
- }
- }
- } else {
- if ((error_num = reset_hs_upds(SPIDER_SQL_TYPE_UPDATE_HS)))
- {
- DBUG_RETURN(error_num);
- }
- }
- break;
- case INFO_KIND_HS_INCREMENT_BEGIN:
- DBUG_PRINT("info",("spider INFO_KIND_HS_INCREMENT_BEGIN"));
- wide_handler->hs_increment = TRUE;
- break;
- case INFO_KIND_HS_INCREMENT_END:
- DBUG_PRINT("info",("spider INFO_KIND_HS_INCREMENT_END"));
- wide_handler->hs_increment = FALSE;
- break;
- case INFO_KIND_HS_DECREMENT_BEGIN:
- DBUG_PRINT("info",("spider INFO_KIND_HS_DECREMENT_BEGIN"));
- wide_handler->hs_decrement = TRUE;
- break;
- case INFO_KIND_HS_DECREMENT_END:
- DBUG_PRINT("info",("spider INFO_KIND_HS_DECREMENT_END"));
- wide_handler->hs_decrement = FALSE;
- break;
-#endif
#ifdef INFO_KIND_UPDATE_FIELDS
case INFO_KIND_UPDATE_FIELDS:
DBUG_PRINT("info",("spider INFO_KIND_UPDATE_FIELDS"));
@@ -13261,22 +12639,7 @@ bool ha_spider::handler_opened(
DBUG_PRINT("info",("spider link_idx=%d", link_idx));
DBUG_PRINT("info",("spider tgt_conn_kind=%u", tgt_conn_kind));
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (
- tgt_conn_kind == SPIDER_CONN_KIND_MYSQL &&
-#endif
spider_bit_is_set(m_handler_opened, link_idx)
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ) ||
- (
- tgt_conn_kind == SPIDER_CONN_KIND_HS_READ &&
- spider_bit_is_set(r_handler_opened, link_idx)
- ) ||
- (
- tgt_conn_kind == SPIDER_CONN_KIND_HS_WRITE &&
- spider_bit_is_set(w_handler_opened, link_idx)
- )
-#endif
) {
DBUG_PRINT("info",("spider TRUE"));
DBUG_RETURN(TRUE);
@@ -13290,16 +12653,7 @@ void ha_spider::set_handler_opened(
) {
DBUG_ENTER("ha_spider::set_handler_opened");
DBUG_PRINT("info",("spider this=%p", this));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
-#endif
spider_set_bit(m_handler_opened, link_idx);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- else if (conn_kind[link_idx] == SPIDER_CONN_KIND_HS_READ)
- spider_set_bit(r_handler_opened, link_idx);
- else
- spider_set_bit(w_handler_opened, link_idx);
-#endif
DBUG_VOID_RETURN;
}
@@ -13309,16 +12663,7 @@ void ha_spider::clear_handler_opened(
) {
DBUG_ENTER("ha_spider::clear_handler_opened");
DBUG_PRINT("info",("spider this=%p", this));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (tgt_conn_kind == SPIDER_CONN_KIND_MYSQL)
-#endif
spider_clear_bit(m_handler_opened, link_idx);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- else if (tgt_conn_kind == SPIDER_CONN_KIND_HS_READ)
- spider_clear_bit(r_handler_opened, link_idx);
- else
- spider_clear_bit(w_handler_opened, link_idx);
-#endif
DBUG_VOID_RETURN;
}
@@ -13366,96 +12711,6 @@ int ha_spider::close_opened_handler(
conns[link_idx] = NULL;
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider_bit_is_set(r_handler_opened, link_idx))
- {
- if ((error_num2 = spider_db_close_handler(this,
- hs_r_conns[link_idx], link_idx, SPIDER_CONN_KIND_HS_READ))
- ) {
- if (
- share->monitoring_kind[link_idx] &&
- need_mons[link_idx]
- ) {
- error_num2 = spider_ping_table_mon_from_table(
- wide_handler->trx,
- wide_handler->trx->thd,
- share,
- link_idx,
- (uint32) share->monitoring_sid[link_idx],
- share->table_name,
- share->table_name_length,
- conn_link_idx[link_idx],
- NULL,
- 0,
- share->monitoring_kind[link_idx],
- share->monitoring_limit[link_idx],
- share->monitoring_flag[link_idx],
- TRUE
- );
- }
- error_num = error_num2;
- }
- spider_clear_bit(r_handler_opened, link_idx);
- if (release_conn && !hs_w_conns[link_idx]->join_trx)
- {
- if (
- !hs_r_conns[link_idx]->opened_handlers &&
- wide_handler->trx->trx_hs_r_conn_adjustment ==
- trx_hs_r_conn_adjustment &&
- spider_param_hs_r_conn_recycle_mode(wide_handler->trx->thd) != 2
- ) {
- wide_handler->trx->trx_hs_r_conn_adjustment++;
- }
- spider_free_conn_from_trx(wide_handler->trx, hs_r_conns[link_idx],
- FALSE, FALSE, NULL);
- hs_r_conns[link_idx] = NULL;
- }
- }
- if (spider_bit_is_set(w_handler_opened, link_idx))
- {
- if ((error_num2 = spider_db_close_handler(this,
- hs_w_conns[link_idx], link_idx, SPIDER_CONN_KIND_HS_WRITE))
- ) {
- if (
- share->monitoring_kind[link_idx] &&
- need_mons[link_idx]
- ) {
- error_num2 = spider_ping_table_mon_from_table(
- wide_handler->trx,
- wide_handler->trx->thd,
- share,
- link_idx,
- (uint32) share->monitoring_sid[link_idx],
- share->table_name,
- share->table_name_length,
- conn_link_idx[link_idx],
- NULL,
- 0,
- share->monitoring_kind[link_idx],
- share->monitoring_limit[link_idx],
- share->monitoring_flag[link_idx],
- TRUE
- );
- }
- error_num = error_num2;
- }
- spider_clear_bit(w_handler_opened, link_idx);
- if (release_conn && !hs_w_conns[link_idx]->join_trx)
- {
- if (
- !hs_w_conns[link_idx]->opened_handlers &&
- wide_handler->trx->trx_hs_w_conn_adjustment ==
- trx_hs_w_conn_adjustment &&
- spider_param_hs_w_conn_recycle_mode(wide_handler->trx->thd) != 2
- ) {
- wide_handler->trx->trx_hs_w_conn_adjustment++;
- }
- spider_free_conn_from_trx(wide_handler->trx, hs_w_conns[link_idx],
- FALSE, FALSE, NULL);
- hs_w_conns[link_idx] = NULL;
- }
- }
-#endif
DBUG_RETURN(error_num);
}
@@ -13493,31 +12748,8 @@ int ha_spider::index_handler_init()
spider_conn_use_handler(this, lock_mode, roop_count) &&
spider_conn_need_open_handler(this, active_index, roop_count)
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint tmp_conn_kind1;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (
- do_direct_update &&
- spider_bit_is_set(do_hs_direct_update, roop_count)
- ) {
- tmp_conn_kind1 = SPIDER_CONN_KIND_HS_WRITE;
- } else {
-#endif
- tmp_conn_kind1 = conn_kind[roop_count];
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- }
-#endif
-#endif
if ((error_num = spider_db_open_handler(this,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (tmp_conn_kind1 == SPIDER_CONN_KIND_MYSQL ?
-#endif
conns[roop_count]
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- : tmp_conn_kind1 == SPIDER_CONN_KIND_HS_READ ?
- hs_r_conns[roop_count] : hs_w_conns[roop_count]
- )
-#endif
, roop_count))
) {
if (
@@ -13543,18 +12775,7 @@ int ha_spider::index_handler_init()
}
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- uint tmp_conn_kind2 = conn_kind[roop_count];
- conn_kind[roop_count] = tmp_conn_kind1;
-#endif
-#endif
set_handler_opened(roop_count);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- conn_kind[roop_count] = tmp_conn_kind2;
-#endif
-#endif
}
}
if (sql_kinds & SPIDER_SQL_KIND_HANDLER)
@@ -13616,15 +12837,7 @@ int ha_spider::rnd_handler_init()
spider_conn_need_open_handler(this, MAX_KEY, roop_count)
) {
if ((error_num = spider_db_open_handler(this,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL ?
-#endif
conns[roop_count]
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- : conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ ?
- hs_r_conns[roop_count] : hs_w_conns[roop_count]
- )
-#endif
, roop_count))
) {
if (
@@ -13730,9 +12943,6 @@ void ha_spider::set_error_mode()
case SQLCOM_SHOW_CREATE_TRIGGER:
case SQLCOM_SHOW_PROFILE:
case SQLCOM_SHOW_PROFILES:
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- case SQLCOM_HS_READ:
-#endif
error_mode = spider_param_error_read_mode(thd, share->error_read_mode);
DBUG_PRINT("info",("spider read error_mode=%d", error_mode));
break;
@@ -13948,10 +13158,6 @@ int ha_spider::sync_from_clone_source(
DBUG_PRINT("info",("spider synced from clone source all"));
wide_handler->trx = spider->wide_handler->trx;
sql_command = spider->sql_command;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- conn_kinds = spider->conn_kinds;
- memcpy(conn_kind, spider->conn_kind, sizeof(uint) * share->link_count);
-#endif
wide_handler->external_lock_type =
spider->wide_handler->external_lock_type;
selupd_lock_mode = spider->selupd_lock_mode;
@@ -13961,18 +13167,8 @@ int ha_spider::sync_from_clone_source(
low_priority = spider->low_priority;
memcpy(conns, spider->conns,
sizeof(SPIDER_CONN *) * share->link_count);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- memcpy(hs_r_conns, spider->hs_r_conns,
- sizeof(SPIDER_CONN *) * share->link_count);
- memcpy(hs_w_conns, spider->hs_w_conns,
- sizeof(SPIDER_CONN *) * share->link_count);
-#endif
spider_thread_id = spider->spider_thread_id;
trx_conn_adjustment = spider->trx_conn_adjustment;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- trx_hs_r_conn_adjustment = spider->trx_hs_r_conn_adjustment;
- trx_hs_w_conn_adjustment = spider->trx_hs_w_conn_adjustment;
-#endif
search_link_idx = spider->search_link_idx;
external_lock_cnt = spider->external_lock_cnt;
uint roop_count, dbton_id;
@@ -13989,10 +13185,6 @@ int ha_spider::sync_from_clone_source(
{
DBUG_PRINT("info",("spider synced from clone source"));
sql_command = spider->sql_command;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- conn_kinds = spider->conn_kinds;
- memcpy(conn_kind, spider->conn_kind, sizeof(uint) * share->link_count);
-#endif
wide_handler->external_lock_type =
spider->wide_handler->external_lock_type;
selupd_lock_mode = spider->selupd_lock_mode;
@@ -14010,20 +13202,6 @@ int ha_spider::sync_from_clone_source(
external_lock_cnt = spider->external_lock_cnt;
}
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->hs_pushed_ret_fields_num < MAX_FIELDS)
- {
- SPIDER_HS_UINT32_INFO tmp_info;
- tmp_info.info_size = spider->hs_pushed_ret_fields_num;
- tmp_info.info = spider->hs_pushed_ret_fields;
- if ((error_num = info_push(INFO_KIND_HS_RET_FIELDS, &tmp_info)))
- {
- DBUG_RETURN(error_num);
- }
- }
-#endif
-#endif
DBUG_PRINT("info",("spider bulk_access_link->spider->dbton_handler=%p",
dbton_handler));
DBUG_PRINT("info",("spider ptr bulk_access_link->spider->dbton_handler=%p",
@@ -14084,21 +13262,6 @@ void ha_spider::set_first_link_idx()
dbton_hdl->strict_group_by = TRUE;
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- dbton_id = share->hs_dbton_ids[all_link_idx];
- if (dbton_id < SPIDER_DBTON_SIZE)
- {
- dbton_hdl = dbton_handler[dbton_id];
- if (dbton_hdl->first_link_idx == -1)
- {
- dbton_hdl->first_link_idx = roop_count;
- }
- if (share->strict_group_bys[all_link_idx])
- {
- dbton_hdl->strict_group_by = TRUE;
- }
- }
-#endif
}
DBUG_VOID_RETURN;
}
@@ -14129,17 +13292,6 @@ void ha_spider::reset_first_link_idx()
dbton_hdl->first_link_idx = search_link_idx;
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- dbton_id = share->hs_dbton_ids[all_link_idx];
- if (dbton_id < SPIDER_DBTON_SIZE)
- {
- dbton_hdl = dbton_handler[dbton_id];
- if (dbton_hdl->first_link_idx == -1)
- {
- dbton_hdl->first_link_idx = search_link_idx;
- }
- }
-#endif
}
DBUG_VOID_RETURN;
}
@@ -14169,110 +13321,6 @@ int ha_spider::reset_sql_sql(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int ha_spider::reset_hs_sql(
- ulong sql_type
-) {
- int error_num;
- uint roop_count, dbton_id;
- DBUG_ENTER("ha_spider::reset_hs_sql");
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_id = share->use_hs_dbton_ids[roop_count];
- if ((error_num = dbton_handler[dbton_id]->reset_sql(sql_type)))
- {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-
-int ha_spider::reset_hs_keys(
- ulong sql_type
-) {
- int error_num;
- uint roop_count, dbton_id;
- DBUG_ENTER("ha_spider::reset_hs_keys");
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_id = share->use_hs_dbton_ids[roop_count];
- if ((error_num = dbton_handler[dbton_id]->reset_keys(sql_type)))
- {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-
-int ha_spider::reset_hs_upds(
- ulong sql_type
-) {
- int error_num;
- uint roop_count, dbton_id;
- DBUG_ENTER("ha_spider::reset_hs_upds");
- for (roop_count = 0; roop_count < share->use_dbton_count; roop_count++)
- {
- dbton_id = share->use_dbton_ids[roop_count];
- if ((error_num = dbton_handler[dbton_id]->reset_upds(sql_type)))
- {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-
-int ha_spider::reset_hs_strs(
- ulong sql_type
-) {
- int error_num;
- uint roop_count, dbton_id;
- DBUG_ENTER("ha_spider::reset_hs_strs");
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_id = share->use_hs_dbton_ids[roop_count];
- if ((error_num = dbton_handler[dbton_id]->reset_strs(sql_type)))
- {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-
-int ha_spider::reset_hs_strs_pos(
- ulong sql_type
-) {
- int error_num;
- uint roop_count, dbton_id;
- DBUG_ENTER("ha_spider::reset_hs_strs_pos");
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_id = share->use_hs_dbton_ids[roop_count];
- if ((error_num = dbton_handler[dbton_id]->reset_strs_pos(sql_type)))
- {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-
-int ha_spider::push_back_hs_upds(
- SPIDER_HS_STRING_REF &info
-) {
- int error_num;
- uint roop_count, dbton_id;
- DBUG_ENTER("ha_spider::push_back_hs_upds");
- for (roop_count = 0; roop_count < share->use_dbton_count; roop_count++)
- {
- dbton_id = share->use_dbton_ids[roop_count];
- if ((error_num = dbton_handler[dbton_id]->push_back_upds(info)))
- {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-#endif
-
int ha_spider::append_tmp_table_and_sql_for_bka(
const key_range *start_key
) {
@@ -14395,30 +13443,6 @@ int ha_spider::append_update_sql_part()
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int ha_spider::append_increment_update_set_sql_part()
-{
- int error_num;
- uint roop_count, dbton_id;
- spider_db_handler *dbton_hdl;
- DBUG_ENTER("ha_spider::append_increment_update_set_sql_part");
- for (roop_count = 0; roop_count < share->use_sql_dbton_count; roop_count++)
- {
- dbton_id = share->use_sql_dbton_ids[roop_count];
- dbton_hdl = dbton_handler[dbton_id];
- if (
- dbton_hdl->first_link_idx >= 0 &&
- (error_num = dbton_hdl->append_increment_update_set_part())
- ) {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-#endif
-#endif
-
int ha_spider::append_update_set_sql_part()
{
int error_num;
@@ -14459,28 +13483,6 @@ int ha_spider::append_direct_update_set_sql_part()
}
DBUG_RETURN(0);
}
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int ha_spider::append_direct_update_set_hs_part()
-{
- int error_num;
- uint roop_count, dbton_id;
- spider_db_handler *dbton_hdl;
- DBUG_ENTER("ha_spider::append_direct_update_set_hs_part");
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_id = share->use_hs_dbton_ids[roop_count];
- dbton_hdl = dbton_handler[dbton_id];
- if (
- dbton_hdl->first_link_idx >= 0 &&
- (error_num = dbton_hdl->append_direct_update_set_part())
- ) {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-#endif
#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
@@ -14911,32 +13913,6 @@ int ha_spider::append_key_where_sql_part(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int ha_spider::append_key_where_hs_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type
-) {
- int error_num;
- uint roop_count, dbton_id;
- spider_db_handler *dbton_hdl;
- DBUG_ENTER("ha_spider::append_key_where_hs_part");
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_id = share->use_hs_dbton_ids[roop_count];
- dbton_hdl = dbton_handler[dbton_id];
- if (
- dbton_hdl->first_link_idx >= 0 &&
- (error_num = dbton_hdl->append_key_where_part(start_key, end_key,
- sql_type))
- ) {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-#endif
-
int ha_spider::append_match_where_sql_part(
ulong sql_type
) {
@@ -15212,31 +14188,6 @@ int ha_spider::append_limit_sql_part(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int ha_spider::append_limit_hs_part(
- longlong offset,
- longlong limit,
- ulong sql_type
-) {
- int error_num;
- uint roop_count, dbton_id;
- spider_db_handler *dbton_hdl;
- DBUG_ENTER("ha_spider::append_limit_hs_part");
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_id = share->use_hs_dbton_ids[roop_count];
- dbton_hdl = dbton_handler[dbton_id];
- if (
- dbton_hdl->first_link_idx >= 0 &&
- (error_num = dbton_hdl->append_limit_part(offset, limit, sql_type))
- ) {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-#endif
-
int ha_spider::reappend_limit_sql_part(
longlong offset,
longlong limit,
@@ -15302,29 +14253,6 @@ int ha_spider::append_insert_values_sql_part(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int ha_spider::append_insert_values_hs_part(
- ulong sql_type
-) {
- int error_num;
- uint roop_count, dbton_id;
- spider_db_handler *dbton_hdl;
- DBUG_ENTER("ha_spider::append_insert_values_hs_part");
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_id = share->use_hs_dbton_ids[roop_count];
- dbton_hdl = dbton_handler[dbton_id];
- if (
- dbton_hdl->first_link_idx >= 0 &&
- (error_num = dbton_hdl->append_insert_values_part(sql_type))
- ) {
- DBUG_RETURN(error_num);
- }
- }
- DBUG_RETURN(0);
-}
-#endif
-
int ha_spider::append_into_sql_part(
ulong sql_type
) {
@@ -15368,10 +14296,6 @@ bool ha_spider::is_bulk_insert_exec_period(
uint roop_count, dbton_id;
spider_db_handler *dbton_hdl;
DBUG_ENTER("ha_spider::is_bulk_insert_exec_period");
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (sql_kinds & SPIDER_SQL_KIND_SQL)
- {
-#endif
for (roop_count = 0; roop_count < share->use_sql_dbton_count; roop_count++)
{
dbton_id = share->use_sql_dbton_ids[roop_count];
@@ -15383,23 +14307,6 @@ bool ha_spider::is_bulk_insert_exec_period(
DBUG_RETURN(TRUE);
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
- if (sql_kinds & SPIDER_SQL_KIND_HS)
- {
- for (roop_count = 0; roop_count < share->use_hs_dbton_count; roop_count++)
- {
- dbton_id = share->use_hs_dbton_ids[roop_count];
- dbton_hdl = dbton_handler[dbton_id];
- if (
- dbton_hdl->first_link_idx >= 0 &&
- dbton_hdl->is_bulk_insert_exec_period(bulk_end)
- ) {
- DBUG_RETURN(TRUE);
- }
- }
- }
-#endif
DBUG_RETURN(FALSE);
}
@@ -16110,22 +15017,6 @@ bool ha_spider::support_use_handler_sql(
DBUG_RETURN(TRUE);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-bool ha_spider::support_bulk_access_hs() const
-{
- uint roop_count;
- DBUG_ENTER("ha_spider::support_bulk_access_hs");
- if (!share)
- DBUG_RETURN(FALSE);
- for (roop_count = 0; roop_count < share->all_link_count; roop_count++)
- {
- if (share->hs_dbton_ids[roop_count] == SPIDER_DBTON_SIZE)
- DBUG_RETURN(FALSE);
- }
- DBUG_RETURN(TRUE);
-}
-#endif
-
int ha_spider::init_union_table_name_pos_sql()
{
int error_num;
@@ -16243,10 +15134,6 @@ int ha_spider::lock_tables()
DBUG_PRINT("info",("spider lock_table_type=%u",
wide_handler->lock_table_type));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((conn_kinds & SPIDER_CONN_KIND_MYSQL))
- {
-#endif
if (!conns[search_link_idx])
{
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
@@ -16365,9 +15252,6 @@ int ha_spider::lock_tables()
}
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
DBUG_RETURN(0);
}
@@ -16388,10 +15272,6 @@ int ha_spider::dml_init()
{
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((conn_kinds & SPIDER_CONN_KIND_MYSQL))
- {
-#endif
if (!conns[search_link_idx])
{
my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
@@ -16482,91 +15362,6 @@ int ha_spider::dml_init()
conns[roop_count]->semi_trx_isolation = -1;
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- reset_first_link_idx();
- }
- if ((conn_kinds & SPIDER_CONN_KIND_HS_READ))
- {
- SPIDER_CONN *hs_conn;
- for (
- roop_count = spider_conn_link_idx_next(share->link_statuses,
- conn_link_idx, -1, share->link_count,
- SPIDER_LINK_STATUS_RECOVERY);
- roop_count < (int) share->link_count;
- roop_count = spider_conn_link_idx_next(share->link_statuses,
- conn_link_idx, roop_count, share->link_count,
- SPIDER_LINK_STATUS_RECOVERY)
- ) {
- hs_conn = hs_r_conns[roop_count];
- if (
- hs_conn &&
- hs_conn->hsc_query_id != thd->query_id &&
- hs_conn->hs_pre_age == hs_conn->hs_age
- ) {
- double interval = spider_param_hs_ping_interval(thd);
- time_t tmp_time = (time_t) time((time_t*) 0);
- DBUG_PRINT("info",
- ("spider difftime=%f", difftime(tmp_time, hs_conn->ping_time)));
- DBUG_PRINT("info", ("spider interval=%f", interval));
- if (
- hs_conn->server_lost ||
- difftime(tmp_time, hs_conn->ping_time) >= interval
- ) {
- DBUG_PRINT("info", ("spider hsr[%d] need reconnect", roop_count));
- hs_conn->hs_pre_age++;
- hs_conn->ping_time = tmp_time;
- }
- hs_conn->hsc_query_id = thd->query_id;
- }
- }
- }
- if (
-#if defined(HS_HAS_SQLCOM) && defined(HANDLER_HAS_DIRECT_UPDATE_ROWS)
- (
-#endif
- conn_kinds & SPIDER_CONN_KIND_HS_WRITE
-#if defined(HS_HAS_SQLCOM) && defined(HANDLER_HAS_DIRECT_UPDATE_ROWS)
- ) ||
- /* for direct_update */
- wide_handler->sql_command == SQLCOM_HS_UPDATE ||
- wide_handler->sql_command == SQLCOM_HS_DELETE
-#endif
- ) {
- SPIDER_CONN *hs_conn;
- for (
- roop_count = spider_conn_link_idx_next(share->link_statuses,
- conn_link_idx, -1, share->link_count,
- SPIDER_LINK_STATUS_RECOVERY);
- roop_count < (int) share->link_count;
- roop_count = spider_conn_link_idx_next(share->link_statuses,
- conn_link_idx, roop_count, share->link_count,
- SPIDER_LINK_STATUS_RECOVERY)
- ) {
- hs_conn = hs_w_conns[roop_count];
- if (
- hs_conn &&
- hs_conn->hsc_query_id != thd->query_id &&
- hs_conn->hs_pre_age == hs_conn->hs_age
- ) {
- double interval = spider_param_hs_ping_interval(thd);
- time_t tmp_time = (time_t) time((time_t*) 0);
- DBUG_PRINT("info",
- ("spider difftime=%f", difftime(tmp_time, hs_conn->ping_time)));
- DBUG_PRINT("info", ("spider interval=%f", interval));
- if (
- hs_conn->server_lost ||
- difftime(tmp_time, hs_conn->ping_time) >= interval
- ) {
- DBUG_PRINT("info", ("spider hsw[%d] need reconnect", roop_count));
- hs_conn->hs_pre_age++;
- hs_conn->ping_time = tmp_time;
- }
- hs_conn->hsc_query_id = thd->query_id;
- }
- }
- }
-#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
if (wide_handler->insert_with_update)
{
@@ -16619,14 +15414,6 @@ int ha_spider::bulk_access_begin(
) {
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- memset(
- bulk_access_link_current->spider->result_list.hs_r_bulk_open_index, 0,
- share->link_bitmap_size);
- memset(
- bulk_access_link_current->spider->result_list.hs_w_bulk_open_index, 0,
- share->link_bitmap_size);
-#endif
bulk_access_link_current->spider->bulk_access_executing = FALSE;
bulk_access_link_current->spider->bulk_access_pre_called = FALSE;
bulk_access_link_current->used = TRUE;
diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h
index 3036f8d522a..cd847760bcf 100644
--- a/storage/spider/ha_spider.h
+++ b/storage/spider/ha_spider.h
@@ -55,10 +55,6 @@ public:
SPIDER_SHARE *share;
ulonglong spider_thread_id;
ulonglong trx_conn_adjustment;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ulonglong trx_hs_r_conn_adjustment;
- ulonglong trx_hs_w_conn_adjustment;
-#endif
uint mem_calc_id;
const char *mem_calc_func_name;
const char *mem_calc_file_name;
@@ -71,14 +67,6 @@ public:
char *conn_keys_first_ptr;
char **conn_keys;
SPIDER_CONN **conns;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char **hs_r_conn_keys;
- SPIDER_CONN **hs_r_conns;
- ulonglong *hs_r_conn_ages;
- char **hs_w_conn_keys;
- SPIDER_CONN **hs_w_conns;
- ulonglong *hs_w_conn_ages;
-#endif
/* for active-standby mode */
uint *conn_link_idx;
uchar *conn_can_fo;
@@ -182,27 +170,8 @@ public:
uchar *m_handler_opened;
uint *m_handler_id;
char **m_handler_cid;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uchar *r_handler_opened;
- uint *r_handler_id;
- uint *r_handler_index;
- uchar *w_handler_opened;
- uint *w_handler_id;
- uint *w_handler_index;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- uchar *do_hs_direct_update;
- uint32 **hs_r_ret_fields;
- uint32 **hs_w_ret_fields;
- size_t *hs_r_ret_fields_num;
- size_t *hs_w_ret_fields_num;
- uchar *tmp_column_bitmap;
-#endif
-#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
bool do_direct_update;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- bool maybe_do_hs_direct_update;
-#endif
uint direct_update_kinds;
#endif
spider_index_rnd_init prev_index_rnd_init;
@@ -974,26 +943,6 @@ public:
int reset_sql_sql(
ulong sql_type
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int reset_hs_sql(
- ulong sql_type
- );
- int reset_hs_keys(
- ulong sql_type
- );
- int reset_hs_upds(
- ulong sql_type
- );
- int reset_hs_strs(
- ulong sql_type
- );
- int reset_hs_strs_pos(
- ulong sql_type
- );
- int push_back_hs_upds(
- SPIDER_HS_STRING_REF &info
- );
-#endif
int append_tmp_table_and_sql_for_bka(
const key_range *start_key
);
@@ -1004,17 +953,9 @@ public:
int reuse_union_table_and_sql_for_bka();
int append_insert_sql_part();
int append_update_sql_part();
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_increment_update_set_sql_part();
-#endif
-#endif
int append_update_set_sql_part();
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
int append_direct_update_set_sql_part();
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int append_direct_update_set_hs_part();
-#endif
#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
int append_dup_update_pushdown_sql_part(
@@ -1081,13 +1022,6 @@ public:
const key_range *end_key,
ulong sql_type
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int append_key_where_hs_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type
- );
-#endif
int append_match_where_sql_part(
ulong sql_type
);
@@ -1142,13 +1076,6 @@ public:
longlong limit,
ulong sql_type
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int append_limit_hs_part(
- longlong offset,
- longlong limit,
- ulong sql_type
- );
-#endif
int reappend_limit_sql_part(
longlong offset,
longlong limit,
@@ -1160,11 +1087,6 @@ public:
int append_insert_values_sql_part(
ulong sql_type
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int append_insert_values_hs_part(
- ulong sql_type
- );
-#endif
int append_into_sql_part(
ulong sql_type
);
@@ -1233,9 +1155,6 @@ public:
bool support_use_handler_sql(
int use_handler
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- bool support_bulk_access_hs() const;
-#endif
int init_union_table_name_pos_sql();
int set_union_table_name_pos_sql();
int append_lock_tables_list();
diff --git a/storage/spider/hs_client/allocator.hpp b/storage/spider/hs_client/allocator.hpp
deleted file mode 100644
index c302e07804e..00000000000
--- a/storage/spider/hs_client/allocator.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011-2017 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_ALLOCATOR_HPP
-#define DENA_ALLOCATOR_HPP
-
-#if 0
-extern "C" {
-#include <tlsf.h>
-};
-#define DENA_MALLOC(x) tlsf_malloc(x)
-#define DENA_REALLOC(x, y) tlsf_realloc(x, y)
-#define DENA_FREE(x) tlsf_free(x)
-#define DENA_NEWCHAR(x) static_cast<char *>(tlsf_malloc(x))
-#define DENA_DELETE(x) tlsf_free(x)
-#endif
-
-#if 1
-#define DENA_MALLOC(x) malloc(x)
-#define DENA_REALLOC(x, y) realloc(x, y)
-#define DENA_FREE(x) free(x)
-#define DENA_NEWCHAR(x) (new char[x])
-#define DENA_DELETE(x) (delete [] x)
-#endif
-
-#if 1
-#define DENA_ALLOCA_ALLOCATE(typ, len) \
- (typ *) (alloca((len) * sizeof(typ)))
-#define DENA_ALLOCA_FREE(x)
-#else
-#define DENA_ALLOCA_ALLOCATE(typ, len) \
- (typ *) (malloc((len) * sizeof(typ)))
-#define DENA_ALLOCA_FREE(x) free(x)
-#endif
-
-#endif
-
diff --git a/storage/spider/hs_client/auto_addrinfo.hpp b/storage/spider/hs_client/auto_addrinfo.hpp
deleted file mode 100644
index 26e5dee933e..00000000000
--- a/storage/spider/hs_client/auto_addrinfo.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_AUTO_ADDRINFO_HPP
-#define DENA_AUTO_ADDRINFO_HPP
-
-#ifndef _WIN32
-#include <netdb.h>
-#endif
-
-#include "util.hpp"
-
-namespace dena {
-
-struct auto_addrinfo : private noncopyable {
- auto_addrinfo() : addr(0) { }
- ~auto_addrinfo() {
- reset();
- }
- void reset(addrinfo *a = 0) {
- if (addr != 0) {
- freeaddrinfo(addr);
- }
- addr = a;
- }
- const addrinfo *get() const { return addr; }
- int resolve(const char *node, const char *service, int flags = 0,
- int family = AF_UNSPEC, int socktype = SOCK_STREAM, int protocol = 0) {
- reset();
- addrinfo hints;
- hints.ai_flags = flags;
- hints.ai_family = family;
- hints.ai_socktype = socktype;
- hints.ai_protocol = protocol;
- return getaddrinfo(node, service, &hints, &addr);
- }
- private:
- addrinfo *addr;
-};
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/auto_file.hpp b/storage/spider/hs_client/auto_file.hpp
deleted file mode 100644
index 44903f5fc4a..00000000000
--- a/storage/spider/hs_client/auto_file.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_AUTO_FILE_HPP
-#define DENA_AUTO_FILE_HPP
-
-/*
-#ifndef _WIN32
-#include <dirent.h>
-#endif
-*/
-
-#include "util.hpp"
-
-namespace dena {
-
-struct auto_file : private noncopyable {
- auto_file() : fd(-1) { }
- ~auto_file() {
- reset();
- }
- int get() const { return fd; }
- int close() {
- if (fd < 0) {
- return 0;
- }
- const int r = ::close(fd);
- fd = -1;
- return r;
- }
- void reset(int x = -1) {
- if (fd >= 0) {
- this->close();
- }
- fd = x;
- }
- private:
- int fd;
-};
-
-/*
-struct auto_dir : private noncopyable {
- auto_dir() : dp(0) { }
- ~auto_dir() {
- reset();
- }
- DIR *get() const { return dp; }
- void reset(DIR *d = 0) {
- if (dp != 0) {
- closedir(dp);
- }
- dp = d;
- }
- private:
- DIR *dp;
-};
-*/
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/auto_ptrcontainer.hpp b/storage/spider/hs_client/auto_ptrcontainer.hpp
deleted file mode 100644
index 3629f19c8ea..00000000000
--- a/storage/spider/hs_client/auto_ptrcontainer.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_AUTO_PTRCONTAINER_HPP
-#define DENA_AUTO_PTRCONTAINER_HPP
-
-namespace dena {
-
-/*
-template <typename Tcnt>
-struct auto_ptrcontainer {
- typedef Tcnt container_type;
- typedef typename container_type::value_type value_type;
- typedef typename container_type::pointer pointer;
- typedef typename container_type::reference reference;
- typedef typename container_type::const_reference const_reference;
- typedef typename container_type::size_type size_type;
- typedef typename container_type::difference_type difference_type;
- typedef typename container_type::iterator iterator;
- typedef typename container_type::const_iterator const_iterator;
- typedef typename container_type::reverse_iterator reverse_iterator;
- typedef typename container_type::const_reverse_iterator
- const_reverse_iterator;
- iterator begin() { return cnt.begin(); }
- const_iterator begin() const { return cnt.begin(); }
- iterator end() { return cnt.end(); }
- const_iterator end() const { return cnt.end(); }
- reverse_iterator rbegin() { return cnt.rbegin(); }
- reverse_iterator rend() { return cnt.rend(); }
- const_reverse_iterator rbegin() const { return cnt.rbegin(); }
- const_reverse_iterator rend() const { return cnt.rend(); }
- size_type size() const { return cnt.size(); }
- size_type max_size() const { return cnt.max_size(); }
- bool empty() const { return cnt.empty(); }
- reference front() { return cnt.front(); }
- const_reference front() const { cnt.front(); }
- reference back() { return cnt.back(); }
- const_reference back() const { cnt.back(); }
- void swap(auto_ptrcontainer& x) { cnt.swap(x.cnt); }
- ~auto_ptrcontainer() {
- for (iterator i = begin(); i != end(); ++i) {
- delete *i;
- }
- }
- template <typename Tap> void push_back_ptr(Tap& ap) {
- cnt.push_back(ap.get());
- ap.release();
- }
- void erase_ptr(iterator i) {
- delete *i;
- cnt.erase(i);
- }
- reference operator [](size_type n) { return cnt[n]; }
- const_reference operator [](size_type n) const { return cnt[n]; }
- void clear() { cnt.clear(); }
- private:
- Tcnt cnt;
-};
-*/
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/config.cpp b/storage/spider/hs_client/config.cpp
deleted file mode 100644
index 0003c3fd645..00000000000
--- a/storage/spider/hs_client/config.cpp
+++ /dev/null
@@ -1,292 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011-2017 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#include <my_global.h>
-#include "mysql_version.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#endif
-
-#include "config.hpp"
-
-namespace dena {
-
-unsigned int verbose_level = 0;
-
-uchar *
-conf_get_key(
- conf_param *param,
- size_t *length,
- my_bool not_used __attribute__ ((unused))
-) {
- *length = param->key.length();
- return (uchar*) param->key.ptr();
-}
-
-config::config()
-{
- if (my_hash_init(PSI_INSTRUMENT_ME, &conf_hash, &my_charset_bin, 32, 0, 0,
- (my_hash_get_key) conf_get_key, 0, 0))
- init = FALSE;
- else
- init = TRUE;
- return;
-}
-
-config::~config()
-{
- if (init)
- {
- conf_param *param;
- while ((param = (conf_param *) my_hash_element(&conf_hash, 0)))
- {
- my_hash_delete(&conf_hash, (uchar*) param);
- delete param;
- }
- my_hash_free(&conf_hash);
- }
-}
-
-conf_param *
-config::find(const String& key) const
-{
- if (init)
- return (conf_param *) my_hash_search(&conf_hash, (const uchar*) key.ptr(),
- key.length());
- else
- return NULL;
-}
-
-conf_param *
-config::find(const char *key) const
-{
- if (init)
- return (conf_param *) my_hash_search(&conf_hash, (const uchar*) key,
- strlen(key));
- else
- return NULL;
-}
-
-String
-config::get_str(const String& key, const String& def) const
-{
- DENA_VERBOSE(30, list_all_params());
- conf_param *param = find(key);
- if (!param) {
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s(default)\n", key.ptr(),
- def.ptr()));
- return def;
- }
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s\n", key.ptr(),
- param->val.ptr()));
- return param->val;
-}
-
-String
-config::get_str(const char *key, const char *def) const
-{
- DENA_VERBOSE(30, list_all_params());
- conf_param *param = find(key);
- if (!param) {
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s(default)\n", key, def));
- return String(def, strlen(def), &my_charset_bin);
- }
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s\n",
- key, param->val.ptr()));
- return param->val;
-}
-
-long long
-config::get_int(const String& key, long long def) const
-{
- int err;
- DENA_VERBOSE(30, list_all_params());
- conf_param *param = find(key);
- if (!param) {
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%lld(default)\n", key.ptr(),
- def));
- return def;
- }
- const long long r = my_strtoll10(param->val.ptr(), (char**) NULL, &err);
- if (err) {
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%lld(err)\n", key.ptr(),
- def));
- return def;
- }
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%lld\n", key.ptr(), r));
- return r;
-}
-
-long long
-config::get_int(const char *key, long long def) const
-{
- int err;
- DENA_VERBOSE(30, list_all_params());
- conf_param *param = find(key);
- if (!param) {
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%lld(default)\n", key, def));
- return def;
- }
- const long long r = my_strtoll10(param->val.ptr(), (char**) NULL, &err);
- if (err) {
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%lld(err)\n", key, def));
- return def;
- }
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%lld\n", key, r));
- return r;
-}
-
-bool
-config::replace(const char *key, const char *val)
-{
- uint32 val_len = strlen(val);
- conf_param *param = find(key);
- if (!param) {
- /* create */
- if (!(param = new conf_param()))
- return TRUE;
- uint32 key_len = strlen(key);
- if (
- param->key.reserve(key_len + 1) ||
- param->val.reserve(val_len + 1)
- ) {
- delete param;
- return TRUE;
- }
- param->key.q_append(key, key_len);
- param->val.q_append(val, val_len);
- param->key.c_ptr_safe();
- param->val.c_ptr_safe();
- if (my_hash_insert(&conf_hash, (uchar*) param))
- {
- delete param;
- return TRUE;
- }
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s(create)\n",
- param->key.ptr(), param->val.ptr()));
- return FALSE;
- }
- /* replace */
- param->val.length(0);
- if (param->val.reserve(val_len + 1))
- return TRUE;
- param->val.q_append(val, val_len);
- param->val.c_ptr_safe();
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s(replace)\n",
- param->key.ptr(), param->val.ptr()));
- return FALSE;
-}
-
-bool
-config::replace(const char *key, long long val)
-{
- char val_str[22];
- sprintf(val_str, "%lld", val);
- return replace(key, val_str);
-}
-
-bool
-config::compare(const char *key, const char *val)
-{
- conf_param *param = find(key);
- if (!param)
- return FALSE;
- return !strcmp(param->val.ptr(), val);
-}
-
-void
-config::list_all_params() const
-{
- conf_param *param;
- DENA_VERBOSE(10, fprintf(stderr, "list_all_params start\n"));
- for(ulong i = 0; i < conf_hash.records; i++)
- {
- if ((param = (conf_param *) my_hash_element((HASH *) &conf_hash, i)))
- {
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s\n",
- param->key.ptr(), param->val.ptr()));
- }
- }
- DENA_VERBOSE(10, fprintf(stderr, "list_all_params end\n"));
-}
-
-config&
-config::operator =(const config& x)
-{
- DENA_VERBOSE(10, fprintf(stderr, "config operator = start"));
- if (this != &x && init && x.init) {
- conf_param *param, *new_param;
- for(ulong i = 0; i < x.conf_hash.records; i++)
- {
- if (
- (param = (conf_param *) my_hash_element((HASH *) &x.conf_hash, i)) &&
- (new_param = new conf_param())
- ) {
- if (
- !new_param->key.copy(param->key) &&
- !new_param->val.copy(param->val)
- ) {
- new_param->key.c_ptr_safe();
- new_param->val.c_ptr_safe();
- DENA_VERBOSE(10, fprintf(stderr, "CONFIG: %s=%s\n",
- new_param->key.ptr(), new_param->val.ptr()));
- if (my_hash_insert(&conf_hash, (uchar*) new_param))
- delete new_param;
- } else
- delete new_param;
- }
- }
- }
- DENA_VERBOSE(10, fprintf(stderr, "config operator = end %p", this));
- return *this;
-}
-
-void
-parse_args(int argc, char **argv, config& conf)
-{
- conf_param *param;
- for (int i = 1; i < argc; ++i) {
- const char *const arg = argv[i];
- const char *const eq = strchr(arg, '=');
- if (eq == 0) {
- continue;
- }
- if (!(param = new conf_param()))
- continue;
- uint32 key_len = (uint32)(eq - arg);
- uint32 val_len = strlen(eq + 1);
- if (
- param->key.reserve(key_len + 1) ||
- param->val.reserve(val_len + 1)
- ) {
- delete param;
- continue;
- }
- param->key.q_append(arg, key_len);
- param->val.q_append(eq + 1, val_len);
- param->key.c_ptr_safe();
- param->val.c_ptr_safe();
- if (my_hash_insert(&conf.conf_hash, (uchar*) param))
- {
- delete param;
- continue;
- }
- }
- param = conf.find("verbose");
- if (param) {
- verbose_level = atoi(param->val.c_ptr());
- }
-}
-
-};
-
diff --git a/storage/spider/hs_client/config.hpp b/storage/spider/hs_client/config.hpp
deleted file mode 100644
index 6d85c7e3d7c..00000000000
--- a/storage/spider/hs_client/config.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_CONFIG_HPP
-#define DENA_CONFIG_HPP
-
-#include "mysql_version.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#include "sql_class.h"
-#endif
-
-#define DENA_VERBOSE(lv, x) if (dena::verbose_level >= (lv)) { (x); }
-
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-#define INFO_KIND_HS_RET_FIELDS 1
-#define INFO_KIND_HS_APPEND_STRING_REF 3
-#define INFO_KIND_HS_CLEAR_STRING_REF 4
-#define INFO_KIND_HS_INCREMENT_BEGIN 5
-#define INFO_KIND_HS_INCREMENT_END 6
-#define INFO_KIND_HS_DECREMENT_BEGIN 7
-#define INFO_KIND_HS_DECREMENT_END 8
-#endif
-
-namespace dena {
-
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-struct uint32_info {
- size_t info_size;
- uint32 *info;
-};
-#endif
-
-struct conf_param {
- String key;
- String val;
-};
-
-uchar *conf_get_key(
- conf_param *share,
- size_t *length,
- my_bool not_used __attribute__ ((unused))
-);
-
-struct config {
- bool init;
- HASH conf_hash;
- config();
- ~config();
- conf_param *find(const String& key) const;
- conf_param *find(const char *key) const;
- String get_str(const String& key, const String& def =
- String("", 0, &my_charset_bin)) const;
- String get_str(const char *key, const char *def = "") const;
- long long get_int(const String& key, long long def = 0) const;
- long long get_int(const char *key, long long def = 0) const;
- bool replace(const char *key, const char *val);
- bool replace(const char *key, long long val);
- bool compare(const char *key, const char *val);
- void list_all_params() const;
- config& operator =(const config& x);
-};
-
-void parse_args(int argc, char **argv, config& conf);
-
-extern unsigned int verbose_level;
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/escape.cpp b/storage/spider/hs_client/escape.cpp
deleted file mode 100644
index f3e60afc387..00000000000
--- a/storage/spider/hs_client/escape.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011-2017 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#include <my_global.h>
-#include "mysql_version.h"
-#include "hs_compat.h"
-#include "escape.hpp"
-#include "string_buffer.hpp"
-#include "fatal.hpp"
-#include "string_util.hpp"
-
-#define DBG_OP(x)
-#define DBG_BUF(x)
-
-namespace dena {
-
-enum special_char_t {
- special_char_escape_prefix = 0x01, /* SOH */
- special_char_noescape_min = 0x10, /* DLE */
- special_char_escape_shift = 0x40, /* '@' */
-};
-
-void
-escape_string(char *& wp, const char *start, const char *finish)
-{
- while (start != finish) {
- const unsigned char c = *start;
- if (c >= special_char_noescape_min) {
- wp[0] = c; /* no need to escape */
- } else {
- wp[0] = special_char_escape_prefix;
- ++wp;
- wp[0] = c + special_char_escape_shift;
- }
- ++start;
- ++wp;
- }
-}
-
-void
-escape_string(string_buffer& ar, const char *start, const char *finish)
-{
- const size_t buflen = (finish - start) * 2;
- char *const wp_begin = ar.make_space(buflen);
- char *wp = wp_begin;
- escape_string(wp, start, finish);
- ar.space_wrote(wp - wp_begin);
-}
-
-bool
-unescape_string(char *& wp, const char *start, const char *finish)
-{
- /* works even if wp == start */
- while (start != finish) {
- const unsigned char c = *start;
- if (c != special_char_escape_prefix) {
- wp[0] = c;
- } else if (start + 1 != finish) {
- ++start;
- const unsigned char cn = *start;
- if (cn < special_char_escape_shift) {
- return false;
- }
- wp[0] = cn - special_char_escape_shift;
- } else {
- return false;
- }
- ++start;
- ++wp;
- }
- return true;
-}
-
-bool
-unescape_string(string_buffer& ar, const char *start, const char *finish)
-{
- const size_t buflen = finish - start;
- char *const wp_begin = ar.make_space(buflen);
- char *wp = wp_begin;
- const bool r = unescape_string(wp, start, finish);
- ar.space_wrote(wp - wp_begin);
- return r;
-}
-
-uint32
-read_ui32(char *& start, char *finish)
-{
- char *const n_begin = start;
- read_token(start, finish);
- char *const n_end = start;
- uint32 v = 0;
- for (char *p = n_begin; p != n_end; ++p) {
- const char ch = p[0];
- if (ch >= '0' && ch <= '9') {
- v *= 10;
- v += (ch - '0');
- }
- }
- return v;
-}
-
-void
-write_ui32(string_buffer& buf, uint32 v)
-{
- char *wp = buf.make_space(12);
- int len = snprintf(wp, 12, "%u", v);
- if (len > 0) {
- buf.space_wrote(len);
- }
-}
-
-void
-write_ui64(string_buffer& buf, uint64 v)
-{
- char *wp = buf.make_space(22);
- int len = snprintf(wp, 22, "%llu", static_cast<unsigned long long>(v));
- if (len > 0) {
- buf.space_wrote(len);
- }
-}
-
-};
-
diff --git a/storage/spider/hs_client/escape.hpp b/storage/spider/hs_client/escape.hpp
deleted file mode 100644
index 4c23e16701c..00000000000
--- a/storage/spider/hs_client/escape.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved.
- * See COPYRIGHT.txt for details.
- */
-
-#include "string_buffer.hpp"
-#include "string_ref.hpp"
-#include "string_util.hpp"
-
-#ifndef DENA_ESCAPE_HPP
-#define DENA_ESCAPE_HPP
-
-namespace dena {
-
-void escape_string(char *& wp, const char *start, const char *finish);
-void escape_string(string_buffer& ar, const char *start, const char *finish);
-bool unescape_string(char *& wp, const char *start, const char *finish);
- /* unescaped_string() works even if wp == start */
-bool unescape_string(string_buffer& ar, const char *start, const char *finish);
-
-uint32 read_ui32(char *& start, char *finish);
-void write_ui32(string_buffer& buf, uint32 v);
-void write_ui64(string_buffer& buf, uint64 v);
-
-inline bool
-is_null_expression(const char *start, const char *finish)
-{
- return (finish == start + 1 && start[0] == 0);
-}
-
-inline void
-read_token(char *& start, char *finish)
-{
- char *const p = memchr_char(start, '\t', finish - start);
- if (p == 0) {
- start = finish;
- } else {
- start = p;
- }
-}
-
-inline void
-skip_token_delim_fold(char *& start, char *finish)
-{
- while (start != finish && start[0] == '\t') {
- ++start;
- }
-}
-
-inline void
-skip_one(char *& start, char *finish)
-{
- if (start != finish) {
- ++start;
- }
-}
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/fatal.cpp b/storage/spider/hs_client/fatal.cpp
deleted file mode 100644
index cfbc14df64a..00000000000
--- a/storage/spider/hs_client/fatal.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011-2017 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#include <my_global.h>
-#include "mysql_version.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#endif
-
-#include "fatal.hpp"
-
-namespace dena {
-
-/*
-const int opt_syslog = LOG_ERR | LOG_PID | LOG_CONS;
-*/
-
-void
-fatal_abort(const String& message)
-{
- fprintf(stderr, "FATAL_COREDUMP: %s\n", message.ptr());
-/*
- syslog(opt_syslog, "FATAL_COREDUMP: %s", message.ptr());
-*/
- abort();
-}
-
-void
-fatal_abort(const char *message)
-{
- fprintf(stderr, "FATAL_COREDUMP: %s\n", message);
-/*
- syslog(opt_syslog, "FATAL_COREDUMP: %s", message);
-*/
- abort();
-}
-
-};
-
diff --git a/storage/spider/hs_client/fatal.hpp b/storage/spider/hs_client/fatal.hpp
deleted file mode 100644
index 38fc149e98e..00000000000
--- a/storage/spider/hs_client/fatal.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011-2017 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_FATAL_HPP
-#define DENA_FATAL_HPP
-
-#include "mysql_version.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#include "sql_class.h"
-#endif
-
-namespace dena {
-
-void fatal_abort(const String& message);
-void fatal_abort(const char *message);
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/hs_compat.h b/storage/spider/hs_client/hs_compat.h
deleted file mode 100644
index fb9b02ad4f0..00000000000
--- a/storage/spider/hs_client/hs_compat.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 2013-2018 Kentoku Shiba
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-
-#ifndef HS_COMPAT_H
-#define HS_COMPAT_H
-
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100500
-#define SPD_INIT_DYNAMIC_ARRAY2(A, B, C, D, E, F) \
- my_init_dynamic_array2(PSI_INSTRUMENT_ME, A, B, C, D, E, F)
-#define SPD_INIT_ALLOC_ROOT(A, B, C, D) \
- init_alloc_root(PSI_INSTRUMENT_ME, A, B, C, D)
-#elif defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100213
-#define SPD_INIT_DYNAMIC_ARRAY2(A, B, C, D, E, F) \
- my_init_dynamic_array2(A, B, C, D, E, F)
-#define SPD_INIT_ALLOC_ROOT(A, B, C, D) \
- init_alloc_root(A, "spider", B, C, D)
-#elif defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
-#define SPD_INIT_DYNAMIC_ARRAY2(A, B, C, D, E, F) \
- my_init_dynamic_array2(A, B, C, D, E, F)
-#define SPD_INIT_ALLOC_ROOT(A, B, C, D) \
- init_alloc_root(A, B, C, D)
-#else
-#define SPD_INIT_DYNAMIC_ARRAY2(A, B, C, D, E, F) \
- my_init_dynamic_array2(A, B, C, D, E)
-#define SPD_INIT_ALLOC_ROOT(A, B, C, D) \
- init_alloc_root(A, B, C)
-#endif
-
-#endif
diff --git a/storage/spider/hs_client/hstcpcli.cpp b/storage/spider/hs_client/hstcpcli.cpp
deleted file mode 100644
index b3dea208f8f..00000000000
--- a/storage/spider/hs_client/hstcpcli.cpp
+++ /dev/null
@@ -1,667 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011-2017 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#include <my_global.h>
-#include "mysql_version.h"
-#include "hs_compat.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#include "sql_class.h"
-#endif
-
-#include "hstcpcli.hpp"
-#include "auto_file.hpp"
-#include "string_util.hpp"
-#include "auto_addrinfo.hpp"
-#include "escape.hpp"
-#include "util.hpp"
-
-/* TODO */
-#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(MSG_NOSIGNAL)
-#define MSG_NOSIGNAL 0
-#endif
-
-#define DBG(x)
-
-namespace dena {
-
-hstresult::hstresult()
-{
- SPD_INIT_DYNAMIC_ARRAY2(&flds, sizeof(string_ref), NULL, 16, 16,
- MYF(MY_WME));
-}
-
-hstresult::~hstresult()
-{
- delete_dynamic(&flds);
-}
-
-struct hstcpcli : public hstcpcli_i, private noncopyable {
- hstcpcli(const socket_args& args);
- virtual ~hstcpcli();
- virtual void close();
- virtual int reconnect();
- virtual bool stable_point();
- virtual void request_buf_open_index(size_t pst_id, const char *dbn,
- const char *tbl, const char *idx, const char *retflds, const char *filflds);
- virtual void request_buf_auth(const char *secret, const char *typ);
- virtual void request_buf_exec_generic(size_t pst_id, const string_ref& op,
- const string_ref *kvs, size_t kvslen, uint32 limit, uint32 skip,
- const string_ref& mod_op, const string_ref *mvs, size_t mvslen,
- const hstcpcli_filter *fils, size_t filslen, int invalues_keypart,
- const string_ref *invalues, size_t invalueslen);
- virtual size_t request_buf_append(const char *start, const char *finish);
- virtual void request_reset();
- virtual int request_send();
- virtual int response_recv(size_t& num_flds_r);
- virtual int get_result(hstresult& result);
- virtual const string_ref *get_next_row();
- virtual const string_ref *get_next_row_from_result(hstresult& result);
- virtual size_t get_row_size();
- virtual size_t get_row_size_from_result(hstresult& result);
- virtual void response_buf_remove();
- virtual int get_error_code();
- virtual String& get_error();
- virtual void clear_error();
- virtual int set_timeout(int send_timeout, int recv_timeout);
- virtual size_t get_num_req_bufd() { return num_req_bufd; }
- virtual size_t get_num_req_sent() { return num_req_sent; }
- virtual size_t get_num_req_rcvd() { return num_req_rcvd; }
- virtual size_t get_response_end_offset() { return response_end_offset; }
- virtual const char *get_readbuf_begin() { return readbuf.begin(); }
- virtual const char *get_readbuf_end() { return readbuf.end(); }
- virtual const char *get_writebuf_begin() { return writebuf.begin(); }
- virtual size_t get_writebuf_size() { return writebuf.size(); }
- virtual void write_error_to_log(const char *func_name, const char *file_name,
- ulong line_no);
- private:
- int read_more();
- int set_error(int code, const String& str);
- int set_error(int code, const char *str);
- private:
- auto_file fd;
- socket_args sargs;
- string_buffer readbuf;
- string_buffer writebuf;
- size_t response_end_offset; /* incl newline */
- size_t cur_row_offset;
- size_t cur_row_size;
- size_t num_flds;
- size_t num_req_bufd; /* buffered but not yet sent */
- size_t num_req_sent; /* sent but not yet received */
- size_t num_req_rcvd; /* received but not yet removed */
- int error_code;
- String error_str;
- DYNAMIC_ARRAY flds;
- int errno_buf;
-};
-
-hstcpcli::hstcpcli(const socket_args& args)
- : sargs(args), response_end_offset(0), cur_row_offset(0), cur_row_size(0),
- num_flds(0), num_req_bufd(0), num_req_sent(0), num_req_rcvd(0),
- error_code(0), errno_buf(0)
-{
- String err;
- SPD_INIT_DYNAMIC_ARRAY2(&flds, sizeof(string_ref), NULL, 16, 16, MYF(MY_WME));
- if (socket_connect(fd, sargs, err) != 0) {
- set_error(-1, err);
- }
-}
-
-hstcpcli::~hstcpcli()
-{
- delete_dynamic(&flds);
-}
-
-void
-hstcpcli::close()
-{
- fd.close();
- readbuf.clear();
- writebuf.clear();
- response_end_offset = 0;
- cur_row_offset = 0;
- num_flds = 0;
- num_req_bufd = 0;
- num_req_sent = 0;
- num_req_rcvd = 0;
-}
-
-int
-hstcpcli::reconnect()
-{
- clear_error();
- close();
- String err;
- if (socket_connect(fd, sargs, err) != 0) {
- set_error(-1, err);
- }
- return error_code;
-}
-
-int
-hstcpcli::set_timeout(int send_timeout, int recv_timeout)
-{
- String err;
- sargs.send_timeout = send_timeout;
- sargs.recv_timeout = recv_timeout;
- if (socket_set_timeout(fd, sargs, err) != 0) {
- set_error(-1, err);
- }
- return error_code;
-}
-
-bool
-hstcpcli::stable_point()
-{
- /* returns true if cli can send a new request */
- return fd.get() >= 0 && num_req_bufd == 0 && num_req_sent == 0 &&
- num_req_rcvd == 0 && response_end_offset == 0;
-}
-
-int
-hstcpcli::get_error_code()
-{
- return error_code;
-}
-
-String&
-hstcpcli::get_error()
-{
- return error_str;
-}
-
-int
-hstcpcli::read_more()
-{
- const size_t block_size = 4096; // FIXME
- char *const wp = readbuf.make_space(block_size);
- int rlen;
- errno = 0;
- while ((rlen = read(fd.get(), wp, block_size)) <= 0) {
- errno_buf = errno;
- if (rlen < 0) {
- if (errno == EINTR || errno == EAGAIN)
- {
- errno = 0;
- continue;
- }
- error_str = String(STRING_WITH_LEN("read: failed"), &my_charset_bin);
- } else {
- error_str = String(STRING_WITH_LEN("read: eof"), &my_charset_bin);
- }
- return rlen;
- }
- readbuf.space_wrote(rlen);
- return rlen;
-}
-
-void
-hstcpcli::clear_error()
-{
- DBG(fprintf(stderr, "CLEAR_ERROR: %d\n", error_code));
- error_code = 0;
- error_str.length(0);
-}
-
-int
-hstcpcli::set_error(int code, const String& str)
-{
- DBG(fprintf(stderr, "SET_ERROR: %d\n", code));
- error_code = code;
- error_str = str;
- return error_code;
-}
-
-int
-hstcpcli::set_error(int code, const char *str)
-{
- uint32 str_len = strlen(str);
- DBG(fprintf(stderr, "SET_ERROR: %d\n", code));
- error_code = code;
- error_str.length(0);
- if (error_str.reserve(str_len + 1))
- return 0;
- error_str.q_append(str, str_len);
- error_str.c_ptr_safe();
- return error_code;
-}
-
-void
-hstcpcli::request_buf_open_index(size_t pst_id, const char *dbn,
- const char *tbl, const char *idx, const char *retflds, const char *filflds)
-{
-/*
- if (num_req_sent > 0 || num_req_rcvd > 0) {
-*/
- if (num_req_rcvd > 0) {
- close();
- set_error(-1, "request_buf_open_index: protocol out of sync");
- return;
- }
- const string_ref dbn_ref(dbn, strlen(dbn));
- const string_ref tbl_ref(tbl, strlen(tbl));
- const string_ref idx_ref(idx, strlen(idx));
- const string_ref rfs_ref(retflds, strlen(retflds));
- writebuf.append_literal("P\t");
- append_uint32(writebuf, pst_id); // FIXME size_t ?
- writebuf.append_literal("\t");
- writebuf.append(dbn_ref.begin(), dbn_ref.end());
- writebuf.append_literal("\t");
- writebuf.append(tbl_ref.begin(), tbl_ref.end());
- writebuf.append_literal("\t");
- writebuf.append(idx_ref.begin(), idx_ref.end());
- writebuf.append_literal("\t");
- writebuf.append(rfs_ref.begin(), rfs_ref.end());
- if (filflds != 0) {
- const string_ref fls_ref(filflds, strlen(filflds));
- writebuf.append_literal("\t");
- writebuf.append(fls_ref.begin(), fls_ref.end());
- }
- writebuf.append_literal("\n");
- ++num_req_bufd;
-}
-
-void
-hstcpcli::request_buf_auth(const char *secret, const char *typ)
-{
-/*
- if (num_req_sent > 0 || num_req_rcvd > 0) {
-*/
- if (num_req_rcvd > 0) {
- close();
- set_error(-1, "request_buf_auth: protocol out of sync");
- return;
- }
- if (typ == 0) {
- typ = "1";
- }
- const string_ref typ_ref(typ, strlen(typ));
- const string_ref secret_ref(secret, strlen(secret));
- writebuf.append_literal("A\t");
- writebuf.append(typ_ref.begin(), typ_ref.end());
- writebuf.append_literal("\t");
- writebuf.append(secret_ref.begin(), secret_ref.end());
- writebuf.append_literal("\n");
- ++num_req_bufd;
-}
-
-namespace {
-
-void
-append_delim_value(string_buffer& buf, const char *start, const char *finish)
-{
- if (start == 0) {
- /* null */
- const char t[] = "\t\0";
- buf.append(t, t + 2);
- } else {
- /* non-null */
- buf.append_literal("\t");
- escape_string(buf, start, finish);
- }
-}
-
-};
-
-void
-hstcpcli::request_buf_exec_generic(size_t pst_id, const string_ref& op,
- const string_ref *kvs, size_t kvslen, uint32 limit, uint32 skip,
- const string_ref& mod_op, const string_ref *mvs, size_t mvslen,
- const hstcpcli_filter *fils, size_t filslen, int invalues_keypart,
- const string_ref *invalues, size_t invalueslen)
-{
-/*
- if (num_req_sent > 0 || num_req_rcvd > 0) {
-*/
- if (num_req_rcvd > 0) {
- close();
- set_error(-1, "request_buf_exec_generic: protocol out of sync");
- return;
- }
- append_uint32(writebuf, pst_id); // FIXME size_t ?
- writebuf.append_literal("\t");
- writebuf.append(op.begin(), op.end());
- writebuf.append_literal("\t");
- append_uint32(writebuf, kvslen); // FIXME size_t ?
- for (size_t i = 0; i < kvslen; ++i) {
- const string_ref& kv = kvs[i];
- append_delim_value(writebuf, kv.begin(), kv.end());
- }
- if (limit != 0 || skip != 0 || invalues_keypart >= 0 ||
- mod_op.size() != 0 || filslen != 0) {
- /* has more option */
- writebuf.append_literal("\t");
- append_uint32(writebuf, limit); // FIXME size_t ?
- if (skip != 0 || invalues_keypart >= 0 ||
- mod_op.size() != 0 || filslen != 0) {
- writebuf.append_literal("\t");
- append_uint32(writebuf, skip); // FIXME size_t ?
- }
- if (invalues_keypart >= 0) {
- writebuf.append_literal("\t@\t");
- append_uint32(writebuf, invalues_keypart);
- writebuf.append_literal("\t");
- append_uint32(writebuf, invalueslen);
- for (size_t i = 0; i < invalueslen; ++i) {
- const string_ref& s = invalues[i];
- append_delim_value(writebuf, s.begin(), s.end());
- }
- }
- for (size_t i = 0; i < filslen; ++i) {
- const hstcpcli_filter& f = fils[i];
- writebuf.append_literal("\t");
- writebuf.append(f.filter_type.begin(), f.filter_type.end());
- writebuf.append_literal("\t");
- writebuf.append(f.op.begin(), f.op.end());
- writebuf.append_literal("\t");
- append_uint32(writebuf, f.ff_offset);
- append_delim_value(writebuf, f.val.begin(), f.val.end());
- }
- if (mod_op.size() != 0) {
- writebuf.append_literal("\t");
- writebuf.append(mod_op.begin(), mod_op.end());
- for (size_t i = 0; i < mvslen; ++i) {
- const string_ref& mv = mvs[i];
- append_delim_value(writebuf, mv.begin(), mv.end());
- }
- }
- }
- writebuf.append_literal("\n");
- ++num_req_bufd;
-}
-
-size_t
-hstcpcli::request_buf_append(const char *start, const char *finish)
-{
-/*
- if (num_req_sent > 0 || num_req_rcvd > 0) {
-*/
- if (num_req_rcvd > 0) {
- close();
- set_error(-1, "request_buf_append: protocol out of sync");
- return 0;
- }
- const char *nl = start;
- size_t num_req = 0;
- while ((nl = memchr_char(nl, '\n', finish - nl))) {
- if (nl == finish)
- break;
- num_req++;
- nl++;
- }
- num_req++;
- writebuf.append(start, finish);
- if (*(finish - 1) != '\n')
- writebuf.append_literal("\n");
- num_req_bufd += num_req;
- return num_req;
-}
-
-void
-hstcpcli::request_reset()
-{
- if (num_req_bufd) {
- writebuf.erase_front(writebuf.size());
- num_req_bufd = 0;
- }
-}
-
-int
-hstcpcli::request_send()
-{
- if (error_code < 0) {
- return error_code;
- }
- clear_error();
- if (fd.get() < 0) {
- close();
- return set_error(-1, "write: closed");
- }
-/*
- if (num_req_bufd == 0 || num_req_sent > 0 || num_req_rcvd > 0) {
-*/
- if (num_req_bufd == 0 || num_req_rcvd > 0) {
- close();
- return set_error(-1, "request_send: protocol out of sync");
- }
- const size_t wrlen = writebuf.size();
- const ssize_t r = send(fd.get(), writebuf.begin(), wrlen, MSG_NOSIGNAL);
- if (r <= 0) {
- close();
- return set_error(-1, r < 0 ? "write: failed" : "write: eof");
- }
- writebuf.erase_front(r);
- if (static_cast<size_t>(r) != wrlen) {
- close();
- return set_error(-1, "write: incomplete");
- }
- num_req_sent += num_req_bufd;
- num_req_bufd = 0;
- DBG(fprintf(stderr, "REQSEND 0\n"));
- return 0;
-}
-
-int
-hstcpcli::response_recv(size_t& num_flds_r)
-{
- if (error_code < 0) {
- return error_code;
- }
- clear_error();
- if (num_req_bufd > 0 || num_req_sent == 0 || num_req_rcvd > 0 ||
- response_end_offset != 0) {
- close();
- return set_error(-1, "response_recv: protocol out of sync");
- }
- cur_row_offset = 0;
- num_flds_r = num_flds = 0;
- if (fd.get() < 0) {
- return set_error(-1, "read: closed");
- }
- size_t offset = 0;
- while (true) {
- const char *const lbegin = readbuf.begin() + offset;
- const char *const lend = readbuf.end();
- if (lbegin < lend)
- {
- const char *const nl = memchr_char(lbegin, '\n', lend - lbegin);
- if (nl != 0) {
- offset += (nl + 1) - lbegin;
- break;
- }
- offset += lend - lbegin;
- }
- if (read_more() <= 0) {
- close();
- error_code = -1;
- return error_code;
- }
- }
- response_end_offset = offset;
- --num_req_sent;
- ++num_req_rcvd;
- char *start = readbuf.begin();
- char *const finish = start + response_end_offset - 1;
- const size_t resp_code = read_ui32(start, finish);
- skip_one(start, finish);
- num_flds_r = num_flds = read_ui32(start, finish);
- if (resp_code != 0) {
- skip_one(start, finish);
- char *const err_begin = start;
- read_token(start, finish);
- char *const err_end = start;
- String e = String(err_begin, (uint32)(err_end - err_begin), &my_charset_bin);
- if (!e.length()) {
- e = String(STRING_WITH_LEN("unknown_error"), &my_charset_bin);
- }
- return set_error(resp_code, e);
- }
- cur_row_size = 0;
- cur_row_offset = start - readbuf.begin();
- DBG(fprintf(stderr, "[%s] ro=%zu eol=%zu\n",
- String(readbuf.begin(), readbuf.begin() + response_end_offset)
- .c_str(),
- cur_row_offset, response_end_offset));
- DBG(fprintf(stderr, "RES 0\n"));
- if (flds.max_element < num_flds)
- {
- if (allocate_dynamic(&flds, num_flds))
- return set_error(-1, "out of memory");
- }
- flds.elements = num_flds;
- return 0;
-}
-
-int
-hstcpcli::get_result(hstresult& result)
-{
-/*
- readbuf.swap(result.readbuf);
-*/
- char *const wp = result.readbuf.make_space(response_end_offset);
- memcpy(wp, readbuf.begin(), response_end_offset);
- result.readbuf.space_wrote(response_end_offset);
- result.response_end_offset = response_end_offset;
- result.num_flds = num_flds;
- result.cur_row_size = cur_row_size;
- result.cur_row_offset = cur_row_offset;
- if (result.flds.max_element < num_flds)
- {
- if (allocate_dynamic(&result.flds, num_flds))
- return set_error(-1, "out of memory");
- }
- result.flds.elements = num_flds;
- return 0;
-}
-
-const string_ref *
-hstcpcli::get_next_row()
-{
- if (num_flds == 0 || flds.elements < num_flds) {
- DBG(fprintf(stderr, "GNR NF 0\n"));
- return 0;
- }
- char *start = readbuf.begin() + cur_row_offset;
- char *const finish = readbuf.begin() + response_end_offset - 1;
- if (start >= finish) { /* start[0] == nl */
- DBG(fprintf(stderr, "GNR FIN 0 %p %p\n", start, finish));
- return 0;
- }
- for (size_t i = 0; i < num_flds; ++i) {
- skip_one(start, finish);
- char *const fld_begin = start;
- read_token(start, finish);
- char *const fld_end = start;
- char *wp = fld_begin;
- if (is_null_expression(fld_begin, fld_end)) {
- /* null */
- ((string_ref *) flds.buffer)[i] = string_ref();
- } else {
- unescape_string(wp, fld_begin, fld_end); /* in-place */
- ((string_ref *) flds.buffer)[i] = string_ref(fld_begin, wp);
- }
- }
- cur_row_size = start - (readbuf.begin() + cur_row_offset);
- cur_row_offset = start - readbuf.begin();
- return (string_ref *) flds.buffer;
-}
-
-const string_ref *
-hstcpcli::get_next_row_from_result(hstresult& result)
-{
- if (result.num_flds == 0 || result.flds.elements < result.num_flds) {
- DBG(fprintf(stderr, "GNR NF 0\n"));
- return 0;
- }
- char *start = result.readbuf.begin() + result.cur_row_offset;
- char *const finish = result.readbuf.begin() + result.response_end_offset - 1;
- if (start >= finish) { /* start[0] == nl */
- DBG(fprintf(stderr, "GNR FIN 0 %p %p\n", start, finish));
- return 0;
- }
- for (size_t i = 0; i < result.num_flds; ++i) {
- skip_one(start, finish);
- char *const fld_begin = start;
- read_token(start, finish);
- char *const fld_end = start;
- char *wp = fld_begin;
- if (is_null_expression(fld_begin, fld_end)) {
- /* null */
- ((string_ref *) result.flds.buffer)[i] = string_ref();
- } else {
- unescape_string(wp, fld_begin, fld_end); /* in-place */
- ((string_ref *) result.flds.buffer)[i] = string_ref(fld_begin, wp);
- }
- }
- result.cur_row_size =
- start - (result.readbuf.begin() + result.cur_row_offset);
- result.cur_row_offset = start - result.readbuf.begin();
- return (string_ref *) result.flds.buffer;
-}
-
-size_t
-hstcpcli::get_row_size()
-{
- return cur_row_size;
-}
-
-size_t
-hstcpcli::get_row_size_from_result(hstresult& result)
-{
- return result.cur_row_size;
-}
-
-void
-hstcpcli::response_buf_remove()
-{
- if (response_end_offset == 0) {
- close();
- set_error(-1, "response_buf_remove: protocol out of sync");
- return;
- }
- readbuf.erase_front(response_end_offset);
- response_end_offset = 0;
- --num_req_rcvd;
- cur_row_offset = 0;
- num_flds = 0;
-}
-
-void
-hstcpcli::write_error_to_log(
- const char *func_name,
- const char *file_name,
- ulong line_no
-) {
- if (errno_buf) {
- time_t cur_time = (time_t) time((time_t*) 0);
- struct tm lt;
- struct tm *l_time = localtime_r(&cur_time, &lt);
- fprintf(stderr,
- "%04d%02d%02d %02d:%02d:%02d [ERROR] hstcpcli: [%d][%s]"
- " [%s][%s][%lu] errno=%d\n",
- l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
- l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- error_code, error_str.c_ptr_safe(),
- func_name, file_name, line_no, errno_buf);
- }
-}
-
-hstcpcli_ptr
-hstcpcli_i::create(const socket_args& args)
-{
- return hstcpcli_ptr(new hstcpcli(args));
-}
-
-};
-
diff --git a/storage/spider/hs_client/hstcpcli.hpp b/storage/spider/hs_client/hstcpcli.hpp
deleted file mode 100644
index aac02ce7f46..00000000000
--- a/storage/spider/hs_client/hstcpcli.hpp
+++ /dev/null
@@ -1,98 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_HSTCPCLI_HPP
-#define DENA_HSTCPCLI_HPP
-
-#define HANDLERSOCKET_MYSQL_UTIL 1
-
-#include "mysql_version.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#endif
-
-#include "config.hpp"
-#include "socket.hpp"
-#include "string_ref.hpp"
-#include "string_buffer.hpp"
-
-namespace dena {
-
-struct hstcpcli_filter {
- string_ref filter_type;
- string_ref op;
- size_t ff_offset;
- string_ref val;
- hstcpcli_filter() : ff_offset(0) { }
-};
-
-struct hstcpcli_i;
-typedef hstcpcli_i *hstcpcli_ptr;
-
-struct hstresult {
- hstresult();
- virtual ~hstresult();
- string_buffer readbuf;
- size_t response_end_offset;
- size_t num_flds;
- size_t cur_row_offset;
- size_t cur_row_size;
- DYNAMIC_ARRAY flds;
-};
-
-struct hstcpcli_i {
- virtual ~hstcpcli_i() = default;
- virtual void close() = 0;
- virtual int reconnect() = 0;
- virtual bool stable_point() = 0;
- virtual void request_buf_auth(const char *secret, const char *typ) = 0;
- virtual void request_buf_open_index(size_t pst_id, const char *dbn,
- const char *tbl, const char *idx, const char *retflds,
- const char *filflds = 0) = 0;
- virtual void request_buf_exec_generic(size_t pst_id, const string_ref& op,
- const string_ref *kvs, size_t kvslen, uint32 limit, uint32 skip,
- const string_ref& mod_op, const string_ref *mvs, size_t mvslen,
- const hstcpcli_filter *fils = 0, size_t filslen = 0,
- int invalues_keypart = -1, const string_ref *invalues = 0,
- size_t invalueslen = 0) = 0; // FIXME: too long
- virtual size_t request_buf_append(const char *start, const char *finish) = 0;
- virtual void request_reset() = 0;
- virtual int request_send() = 0;
- virtual int response_recv(size_t& num_flds_r) = 0;
- virtual int get_result(hstresult& result) = 0;
- virtual const string_ref *get_next_row() = 0;
- virtual const string_ref *get_next_row_from_result(hstresult& result) = 0;
- virtual size_t get_row_size() = 0;
- virtual size_t get_row_size_from_result(hstresult& result) = 0;
- virtual void response_buf_remove() = 0;
- virtual int get_error_code() = 0;
- virtual String& get_error() = 0;
- virtual void clear_error() = 0;
- virtual int set_timeout(int send_timeout, int recv_timeout) = 0;
- virtual size_t get_num_req_bufd() = 0;
- virtual size_t get_num_req_sent() = 0;
- virtual size_t get_num_req_rcvd() = 0;
- virtual size_t get_response_end_offset() = 0;
- virtual const char *get_readbuf_begin() = 0;
- virtual const char *get_readbuf_end() = 0;
- virtual const char *get_writebuf_begin() = 0;
- virtual size_t get_writebuf_size() = 0;
- virtual void write_error_to_log(const char *func_name, const char *file_name,
- ulong line_no) = 0;
- static hstcpcli_ptr create(const socket_args& args);
-};
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/mutex.hpp b/storage/spider/hs_client/mutex.hpp
deleted file mode 100644
index 8e331fb6ab2..00000000000
--- a/storage/spider/hs_client/mutex.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_MUTEX_HPP
-#define DENA_MUTEX_HPP
-
-#include "fatal.hpp"
-#include "util.hpp"
-
-namespace dena {
-
-struct condition;
-
-struct mutex : private noncopyable {
- friend struct condition;
- mutex() {
- if (pthread_mutex_init(&mtx, 0) != 0) {
- fatal_abort("pthread_mutex_init");
- }
- }
- ~mutex() {
- if (pthread_mutex_destroy(&mtx) != 0) {
- fatal_abort("pthread_mutex_destroy");
- }
- }
- void lock() const {
- if (pthread_mutex_lock(&mtx) != 0) {
- fatal_abort("pthread_mutex_lock");
- }
- }
- void unlock() const {
- if (pthread_mutex_unlock(&mtx) != 0) {
- fatal_abort("pthread_mutex_unlock");
- }
- }
- private:
- mutable pthread_mutex_t mtx;
-};
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/socket.cpp b/storage/spider/hs_client/socket.cpp
deleted file mode 100644
index 9a2ecddedd7..00000000000
--- a/storage/spider/hs_client/socket.cpp
+++ /dev/null
@@ -1,314 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011-2017 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#include <my_global.h>
-#include <my_config.h>
-#ifndef _WIN32
-#include <sys/types.h>
-#include <sys/un.h>
-#endif
-
-#include "mysql_version.h"
-#include "hs_compat.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
-#include <my_global.h>
-#endif
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#endif
-
-#include "socket.hpp"
-#include "string_util.hpp"
-#include "fatal.hpp"
-
-/*
-struct sockaddr_un {
- short sun_family;
- char sun_path[108];
-};
-*/
-
-namespace dena {
-
-void
-ignore_sigpipe()
-{
-#if defined(SIGPIPE) && !defined(_WIN32)
- if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
- fatal_abort("SIGPIPE SIG_IGN");
- }
-#endif
-}
-
-void
-socket_args::set(const config& conf)
-{
- timeout = (int) conf.get_int("timeout", 600);
- listen_backlog = (int) conf.get_int("listen_backlog", 256);
- String node = conf.get_str("host", "");
- String port = conf.get_str("port", "");
- if (node.length() || port.length()) {
- if (family == AF_UNIX || !strcmp(node.c_ptr(), "/")) {
- set_unix_domain(port.c_ptr());
- } else {
- const char *nd = !node.length() ? 0 : node.c_ptr();
- if (resolve(nd, port.c_ptr()) != 0) {
- String message(STRING_WITH_LEN("getaddrinfo failed: "),
- &my_charset_bin);
- message.reserve(node.length() + sizeof(":") - 1 + port.length());
- message.append(node);
- message.q_append(":", sizeof(":") - 1);
- message.append(port);
- fatal_abort(message);
- }
- }
- }
- sndbuf = (int) conf.get_int("sndbuf", 0);
- rcvbuf = (int) conf.get_int("rcvbuf", 0);
-}
-
-void
-socket_args::set_unix_domain(const char *path)
-{
-#ifndef _WIN32
- family = AF_UNIX;
- addr = sockaddr_storage();
- addrlen = sizeof(sockaddr_un);
- sockaddr_un *const ap = reinterpret_cast<sockaddr_un *>(&addr);
- ap->sun_family = AF_UNIX;
- strncpy(ap->sun_path, path, sizeof(ap->sun_path) - 1);
-#endif
-}
-
-int
-socket_args::resolve(const char *node, const char *service)
-{
- const int flags = (node == 0) ? AI_PASSIVE : 0;
- auto_addrinfo ai;
- addr = sockaddr_storage();
- addrlen = 0;
- const int r = ai.resolve(node, service, flags, family, socktype, protocol);
- if (r != 0) {
- return r;
- }
- memcpy(&addr, ai.get()->ai_addr, ai.get()->ai_addrlen);
- addrlen = ai.get()->ai_addrlen;
- return 0;
-}
-
-int
-socket_set_timeout(auto_file& fd, const socket_args& args, String& err_r)
-{
- if (!args.nonblocking) {
-#if defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO)
- if (args.recv_timeout != 0) {
-#ifndef _WIN32
- struct timeval tv;
- tv.tv_sec = args.recv_timeout;
- tv.tv_usec = 0;
-#else
- int tv = args.recv_timeout * 1000;
-#endif
- if (setsockopt(fd.get(), SOL_SOCKET, SO_RCVTIMEO,
-#ifndef _WIN32
- (const void *) &tv,
-#else
- (const char *) &tv,
-#endif
- sizeof(tv)) != 0) {
- return errno_string("setsockopt SO_RCVTIMEO", errno, err_r);
- }
- }
- if (args.send_timeout != 0) {
-#ifndef _WIN32
- struct timeval tv;
- tv.tv_sec = args.send_timeout;
- tv.tv_usec = 0;
-#else
- int tv = args.send_timeout * 1000;
-#endif
- if (setsockopt(fd.get(), SOL_SOCKET, SO_SNDTIMEO,
-#ifndef _WIN32
- (const void *) &tv,
-#else
- (const char *) &tv,
-#endif
- sizeof(tv)) != 0) {
- return errno_string("setsockopt SO_SNDTIMEO", errno, err_r);
- }
- }
-#endif
- }
- return 0;
-}
-
-int
-socket_set_options(auto_file& fd, const socket_args& args, String& err_r)
-{
- if (args.timeout != 0 && !args.nonblocking) {
-#if defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO)
-#ifndef _WIN32
- struct timeval tv;
- tv.tv_sec = args.timeout;
- tv.tv_usec = 0;
-#else
- int tv = args.timeout * 1000;
-#endif
- if (setsockopt(fd.get(), SOL_SOCKET, SO_RCVTIMEO,
-#ifndef _WIN32
- (const void *) &tv,
-#else
- (const char *) &tv,
-#endif
- sizeof(tv)) != 0) {
- return errno_string("setsockopt SO_RCVTIMEO", errno, err_r);
- }
-#ifndef _WIN32
- tv.tv_sec = args.timeout;
- tv.tv_usec = 0;
-#else
- tv = args.timeout * 1000;
-#endif
- if (setsockopt(fd.get(), SOL_SOCKET, SO_SNDTIMEO,
-#ifndef _WIN32
- (const void *) &tv,
-#else
- (const char *) &tv,
-#endif
- sizeof(tv)) != 0) {
- return errno_string("setsockopt SO_RCVTIMEO", errno, err_r);
- }
-#endif
- }
-#ifndef _WIN32
- if (args.nonblocking && fcntl(fd.get(), F_SETFL, O_NONBLOCK) != 0) {
- return errno_string("fcntl O_NONBLOCK", errno, err_r);
- }
-#endif
- if (args.sndbuf != 0) {
- const int v = args.sndbuf;
- if (setsockopt(fd.get(), SOL_SOCKET, SO_SNDBUF,
-#ifndef _WIN32
- (const void *) &v,
-#else
- (const char *) &v,
-#endif
- sizeof(v)) != 0) {
- return errno_string("setsockopt SO_SNDBUF", errno, err_r);
- }
- }
- if (args.rcvbuf != 0) {
- const int v = args.rcvbuf;
- if (setsockopt(fd.get(), SOL_SOCKET, SO_RCVBUF,
-#ifndef _WIN32
- (const void *) &v,
-#else
- (const char *) &v,
-#endif
- sizeof(v)) != 0) {
- return errno_string("setsockopt SO_RCVBUF", errno, err_r);
- }
- }
- return 0;
-}
-
-int
-socket_open(auto_file& fd, const socket_args& args, String& err_r)
-{
- fd.reset((int) socket(args.family, args.socktype, args.protocol));
- if (fd.get() < 0) {
- return errno_string("socket", errno, err_r);
- }
- return socket_set_options(fd, args, err_r);
-}
-
-int
-socket_connect(auto_file& fd, const socket_args& args, String& err_r)
-{
- int r = 0;
- if ((r = socket_open(fd, args, err_r)) != 0) {
- return r;
- }
- if (connect(fd.get(), reinterpret_cast<const sockaddr *>(&args.addr),
- args.addrlen) != 0) {
- if (!args.nonblocking
-#ifndef _WIN32
- || errno != EINPROGRESS
-#endif
- ) {
- return errno_string("connect", errno, err_r);
- }
- }
- return 0;
-}
-
-int
-socket_bind(auto_file& fd, const socket_args& args, String& err_r)
-{
- fd.reset((int) socket(args.family, args.socktype, args.protocol));
- if (fd.get() < 0) {
- return errno_string("socket", errno, err_r);
- }
- if (args.reuseaddr) {
-#ifndef _WIN32
- if (args.family == AF_UNIX) {
- const sockaddr_un *const ap =
- reinterpret_cast<const sockaddr_un *>(&args.addr);
- if (unlink(ap->sun_path) != 0 && errno != ENOENT) {
- return errno_string("unlink uds", errno, err_r);
- }
- } else {
-#endif
- int v = 1;
- if (setsockopt(fd.get(), SOL_SOCKET, SO_REUSEADDR,
-#ifndef _WIN32
- (const void *) &v,
-#else
- (const char *) &v,
-#endif
- sizeof(v)) != 0) {
- return errno_string("setsockopt SO_REUSEADDR", errno, err_r);
- }
-#ifndef _WIN32
- }
-#endif
- }
- if (bind(fd.get(), reinterpret_cast<const sockaddr *>(&args.addr),
- args.addrlen) != 0) {
- return errno_string("bind", errno, err_r);
- }
- if (listen(fd.get(), args.listen_backlog) != 0) {
- return errno_string("listen", errno, err_r);
- }
-#ifndef _WIN32
- if (args.nonblocking && fcntl(fd.get(), F_SETFL, O_NONBLOCK) != 0) {
- return errno_string("fcntl O_NONBLOCK", errno, err_r);
- }
-#endif
- return 0;
-}
-
-int
-socket_accept(int listen_fd, auto_file& fd, const socket_args& args,
- sockaddr_storage& addr_r, socklen_t& addrlen_r, String& err_r)
-{
- fd.reset((int) accept(listen_fd, reinterpret_cast<sockaddr *>(&addr_r),
- &addrlen_r));
- if (fd.get() < 0) {
- return errno_string("accept", errno, err_r);
- }
- return socket_set_options(fd, args, err_r);
-}
-
-};
-
diff --git a/storage/spider/hs_client/socket.hpp b/storage/spider/hs_client/socket.hpp
deleted file mode 100644
index a3e6527a46d..00000000000
--- a/storage/spider/hs_client/socket.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_SOCKET_HPP
-#define DENA_SOCKET_HPP
-
-#include "mysql_version.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#endif
-
-#include "auto_addrinfo.hpp"
-#include "auto_file.hpp"
-#include "config.hpp"
-
-namespace dena {
-
-struct socket_args {
- sockaddr_storage addr;
- socklen_t addrlen;
- int family;
- int socktype;
- int protocol;
- int timeout;
- int send_timeout;
- int recv_timeout;
- int listen_backlog;
- bool reuseaddr;
- bool nonblocking;
- bool use_epoll;
- int sndbuf;
- int rcvbuf;
- socket_args() : addr(), addrlen(0), family(AF_INET), socktype(SOCK_STREAM),
- protocol(0), timeout(600), send_timeout(600), recv_timeout(600),
- listen_backlog(256), reuseaddr(true), nonblocking(false), use_epoll(false),
- sndbuf(0), rcvbuf(0) { }
- void set(const config& conf);
- void set_unix_domain(const char *path);
- int resolve(const char *node, const char *service);
-};
-
-void ignore_sigpipe();
-int socket_set_timeout(auto_file& fd, const socket_args& args, String& err_r);
-int socket_bind(auto_file& fd, const socket_args& args, String& err_r);
-int socket_connect(auto_file& fd, const socket_args& args, String& err_r);
-int socket_accept(int listen_fd, auto_file& fd, const socket_args& args,
- sockaddr_storage& addr_r, socklen_t& addrlen_r, String& err_r);
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/string_buffer.hpp b/storage/spider/hs_client/string_buffer.hpp
deleted file mode 100644
index c9a6074819b..00000000000
--- a/storage/spider/hs_client/string_buffer.hpp
+++ /dev/null
@@ -1,146 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_STRING_BUFFER_HPP
-#define DENA_STRING_BUFFER_HPP
-
-/*
-#include <stdlib.h>
-#include <string.h>
-*/
-
-#include "util.hpp"
-#include "allocator.hpp"
-#include "fatal.hpp"
-
-namespace dena {
-
-struct string_buffer : private noncopyable {
- string_buffer() : buffer(0), begin_offset(0), end_offset(0), alloc_size(0) { }
- ~string_buffer() {
- real_free();
- }
- void real_free() {
- if (alloc_size) {
- DENA_FREE(buffer);
- buffer = 0;
- begin_offset = 0;
- end_offset = 0;
- alloc_size = 0;
- }
- }
- size_t real_size() {
- return alloc_size;
- }
- const char *begin() const {
- return buffer + begin_offset;
- }
- const char *end() const {
- return buffer + end_offset;
- }
- char *begin() {
- return buffer + begin_offset;
- }
- char *end() {
- return buffer + end_offset;
- }
- size_t size() const {
- return end_offset - begin_offset;
- }
- void clear() {
- begin_offset = end_offset = 0;
- }
- void resize(size_t len) {
- if (size() < len) {
- reserve(len);
- memset(buffer + end_offset, 0, len - size());
- }
- end_offset = begin_offset + len;
- }
- void reserve(size_t len) {
- if (alloc_size >= begin_offset + len) {
- return;
- }
- size_t asz = alloc_size;
- while (asz < begin_offset + len) {
- if (asz == 0) {
- asz = 16;
- }
- const size_t asz_n = asz << 1;
- if (asz_n < asz) {
- fatal_abort("string_buffer::resize() overflow");
- }
- asz = asz_n;
- }
- void *const p = DENA_REALLOC(buffer, asz);
- if (p == 0) {
- fatal_abort("string_buffer::resize() realloc");
- }
- buffer = static_cast<char *>(p);
- alloc_size = asz;
- }
- void erase_front(size_t len) {
- if (len >= size()) {
- clear();
- } else {
- begin_offset += len;
- }
- }
- char *make_space(size_t len) {
- reserve(size() + len);
- return buffer + end_offset;
- }
- void space_wrote(size_t len) {
- len = len < alloc_size - end_offset ? len : alloc_size - end_offset;
- end_offset += len;
- }
- template <size_t N>
- void append_literal(const char (& str)[N]) {
- append(str, str + N - 1);
- }
- void append(const char *start, const char *finish) {
- const size_t len = finish - start;
- reserve(size() + len);
- memcpy(buffer + end_offset, start, len);
- end_offset += len;
- }
- void append_2(const char *s1, const char *f1, const char *s2,
- const char *f2) {
- const size_t l1 = f1 - s1;
- const size_t l2 = f2 - s2;
- reserve(end_offset + l1 + l2);
- memcpy(buffer + end_offset, s1, l1);
- memcpy(buffer + end_offset + l1, s2, l2);
- end_offset += l1 + l2;
- }
- void swap(string_buffer& sb) {
- char *tmp_buffer = buffer;
- size_t tmp_begin_offset = begin_offset;
- size_t tmp_end_offset = end_offset;
- size_t tmp_alloc_size = alloc_size;
- buffer = sb.buffer;
- begin_offset = sb.begin_offset;
- end_offset = sb.end_offset;
- alloc_size = sb.alloc_size;
- sb.buffer = tmp_buffer;
- sb.begin_offset = tmp_begin_offset;
- sb.end_offset = tmp_end_offset;
- sb.alloc_size = tmp_alloc_size;
- }
- private:
- char *buffer;
- size_t begin_offset;
- size_t end_offset;
- size_t alloc_size;
-};
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/string_ref.hpp b/storage/spider/hs_client/string_ref.hpp
deleted file mode 100644
index 028c4146c73..00000000000
--- a/storage/spider/hs_client/string_ref.hpp
+++ /dev/null
@@ -1,106 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_STRING_REF_HPP
-#define DENA_STRING_REF_HPP
-
-namespace dena {
-
-struct string_wref {
- typedef char value_type;
- char *begin() const { return start; }
- char *end() const { return start + length; }
- size_t size() const { return length; }
- private:
- char *start;
- size_t length;
- public:
- string_wref(char *s = 0, size_t len = 0) : start(s), length(len) { }
-};
-
-struct string_ref {
- typedef const char value_type;
- const char *begin() const { return start; }
- const char *end() const { return start + length; }
- size_t size() const { return length; }
- void set(const char *s, size_t len) { start = s; length = len; }
- void set(const char *s, const char *f) { start = s; length = f - s; }
- private:
- const char *start;
- size_t length;
- public:
- string_ref(const char *s = 0, size_t len = 0) : start(s), length(len) { }
- string_ref(const char *s, const char *f) : start(s), length(f - s) { }
- string_ref(const string_wref& w) : start(w.begin()), length(w.size()) { }
-};
-
-template <size_t N> inline bool
-operator ==(const string_ref& x, const char (& y)[N]) {
- return (x.size() == N - 1) && (::memcmp(x.begin(), y, N - 1) == 0);
-}
-
-inline bool
-operator ==(const string_ref& x, const string_ref& y) {
- return (x.size() == y.size()) &&
- (::memcmp(x.begin(), y.begin(), x.size()) == 0);
-}
-
-inline bool
-operator !=(const string_ref& x, const string_ref& y) {
- return (x.size() != y.size()) ||
- (::memcmp(x.begin(), y.begin(), x.size()) != 0);
-}
-
-struct string_ref_list_wrap {
- string_ref_list_wrap() {
- if (SPD_INIT_DYNAMIC_ARRAY2(&string_ref_list, sizeof(string_ref),
- NULL, 16, 16, MYF(MY_WME)))
- string_ref_list_init = FALSE;
- else
- string_ref_list_init = TRUE;
- }
- virtual ~string_ref_list_wrap() {
- if (string_ref_list_init) delete_dynamic(&string_ref_list); }
- void clear() {
- if (string_ref_list_init) string_ref_list.elements = 0; }
- void push_back(string_ref &e) {
- if (string_ref_list_init) insert_dynamic(&string_ref_list, (uchar*) &e);
- return; }
- size_t size() {
- return string_ref_list_init ? string_ref_list.elements : 0; }
- bool resize(size_t new_size) {
- if (string_ref_list_init) {
- if (string_ref_list.max_element < new_size && allocate_dynamic(
- &string_ref_list, new_size)) return TRUE;
- string_ref_list.elements = new_size;
- return FALSE;
- }
- return TRUE;
- }
- bool empty() {
- return string_ref_list_init ? string_ref_list.elements ?
- FALSE : TRUE : TRUE; }
- string_ref &operator [](size_t n) {
- return ((string_ref *) (string_ref_list.buffer +
- string_ref_list.size_of_element * n))[0]; }
- bool string_ref_list_init;
- DYNAMIC_ARRAY string_ref_list;
-};
-
-inline String *
-q_append_str(String *str, const char *p) {
- uint32 p_len = strlen(p);
- if (str->reserve(p_len)) return NULL;
- str->q_append(p, p_len); return str;
-}
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/string_util.cpp b/storage/spider/hs_client/string_util.cpp
deleted file mode 100644
index 39934148cb8..00000000000
--- a/storage/spider/hs_client/string_util.cpp
+++ /dev/null
@@ -1,207 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011-2017 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#include <my_global.h>
-#include "mysql_version.h"
-#include "hs_compat.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#endif
-
-#include "string_util.hpp"
-
-namespace dena {
-
-string_wref
-get_token(char *& wp, char *wp_end, char delim)
-{
- char *const wp_begin = wp;
- char *const p = memchr_char(wp_begin, delim, wp_end - wp_begin);
- if (p == 0) {
- wp = wp_end;
- return string_wref(wp_begin, wp_end - wp_begin);
- }
- wp = p + 1;
- return string_wref(wp_begin, p - wp_begin);
-}
-
-uint32
-atoi_uint32_nocheck(const char *start, const char *finish)
-{
- uint32 v = 0;
- for (; start != finish; ++start) {
- const char c = *start;
- if (c < '0' || c > '9') {
- break;
- }
- v *= 10;
- v += (uint32) (c - '0');
- }
- return v;
-}
-
-long long
-atoll_nocheck(const char *start, const char *finish)
-{
- long long v = 0;
- bool negative = false;
- if (start != finish) {
- if (start[0] == '-') {
- ++start;
- negative = true;
- } else if (start[0] == '+') {
- ++start;
- }
- }
- for (; start != finish; ++start) {
- const char c = *start;
- if (c < '0' || c > '9') {
- break;
- }
- v *= 10;
- if (negative) {
- v -= (long long) (c - '0');
- } else {
- v += (long long) (c - '0');
- }
- }
- return v;
-}
-
-void
-append_uint32(string_buffer& buf, uint32 v)
-{
- char *const wp = buf.make_space(64);
- const int len = snprintf(wp, 64, "%lu", static_cast<unsigned long>(v));
- if (len > 0) {
- buf.space_wrote(len);
- }
-}
-
-/*
-String *
-to_stdstring(uint32 v)
-{
- char buf[64];
- int str_len;
- String *str;
- str_len = snprintf(buf, sizeof(buf), "%lu", static_cast<unsigned long>(v));
- if ((str = new String(str_len + 1)))
- str->q_append(buf, str_len);
- return str;
-}
-*/
-
-int
-errno_string(const char *s, int en, String& err_r)
-{
- char buf[64];
- int str_len;
- str_len = snprintf(buf, sizeof(buf), "%s: %d", s, en);
- if (!err_r.reserve(str_len + 1))
- err_r.q_append(buf, str_len);
- return en;
-}
-
-size_t
-split(char delim, const string_ref& buf, string_ref *parts,
- size_t parts_len)
-{
- size_t i = 0;
- const char *start = buf.begin();
- const char *const finish = buf.end();
- for (i = 0; i < parts_len; ++i) {
- const char *const p = memchr_char(start, delim, finish - start);
- if (p == 0) {
- parts[i] = string_ref(start, finish - start);
- ++i;
- break;
- }
- parts[i] = string_ref(start, p - start);
- start = p + 1;
- }
- const size_t r = i;
- for (; i < parts_len; ++i) {
- parts[i] = string_ref();
- }
- return r;
-}
-
-size_t
-split(char delim, const string_wref& buf, string_wref *parts,
- size_t parts_len)
-{
- size_t i = 0;
- char *start = buf.begin();
- char *const finish = buf.end();
- for (i = 0; i < parts_len; ++i) {
- char *const p = memchr_char(start, delim, finish - start);
- if (p == 0) {
- parts[i] = string_wref(start, finish - start);
- ++i;
- break;
- }
- parts[i] = string_wref(start, p - start);
- start = p + 1;
- }
- const size_t r = i;
- for (; i < parts_len; ++i) {
- parts[i] = string_wref();
- }
- return r;
-}
-
-size_t
-split(char delim, const string_ref& buf, DYNAMIC_ARRAY& parts_r)
-{
- size_t i = 0;
- const char *start = buf.begin();
- const char *finish = buf.end();
- while (true) {
- const char *p = memchr_char(start, delim, finish - start);
- if (p == 0) {
- string_ref param(start, finish - start);
- insert_dynamic(&parts_r, (uchar *) &param);
- break;
- }
- string_ref param(start, p - start);
- insert_dynamic(&parts_r, (uchar *) &param);
- start = p + 1;
- }
- const size_t r = i;
- return r;
-}
-
-size_t
-split(char delim, const string_wref& buf, DYNAMIC_ARRAY& parts_r)
-{
- size_t i = 0;
- char *start = buf.begin();
- char *finish = buf.end();
- while (true) {
- char *p = memchr_char(start, delim, finish - start);
- if (p == 0) {
- string_wref param(start, finish - start);
- insert_dynamic(&parts_r, (uchar *) &param);
- break;
- }
- string_wref param(start, p - start);
- insert_dynamic(&parts_r, (uchar *) &param);
- start = p + 1;
- }
- const size_t r = i;
- return r;
-}
-
-};
-
diff --git a/storage/spider/hs_client/string_util.hpp b/storage/spider/hs_client/string_util.hpp
deleted file mode 100644
index b886addecfb..00000000000
--- a/storage/spider/hs_client/string_util.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_STRING_UTIL_HPP
-#define DENA_STRING_UTIL_HPP
-
-#include "string_buffer.hpp"
-#include "string_ref.hpp"
-
-namespace dena {
-
-inline const char *
-memchr_char(const char *s, int c, size_t n)
-{
- return static_cast<const char *>(memchr(s, c, n));
-}
-
-inline char *
-memchr_char(char *s, int c, size_t n)
-{
- return static_cast<char *>(memchr(s, c, n));
-}
-
-string_wref get_token(char *& wp, char *wp_end, char delim);
-uint32 atoi_uint32_nocheck(const char *start, const char *finish);
-/*
-String *to_stdstring(uint32 v);
-*/
-void append_uint32(string_buffer& buf, uint32 v);
-long long atoll_nocheck(const char *start, const char *finish);
-
-int errno_string(const char *s, int en, String& err_r);
-
-size_t split(char delim, const string_ref& buf, string_ref *parts,
- size_t parts_len);
-size_t split(char delim, const string_wref& buf, string_wref *parts,
- size_t parts_len);
-size_t split(char delim, const string_ref& buf,
- DYNAMIC_ARRAY& parts_r);
-size_t split(char delim, const string_wref& buf,
- DYNAMIC_ARRAY& parts_r);
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/thread.hpp b/storage/spider/hs_client/thread.hpp
deleted file mode 100644
index 79fba706a42..00000000000
--- a/storage/spider/hs_client/thread.hpp
+++ /dev/null
@@ -1,84 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010-2011 DeNA Co.,Ltd.. All rights reserved.
- * Copyright (C) 2011 Kentoku SHIBA
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_THREAD_HPP
-#define DENA_THREAD_HPP
-
-#include "fatal.hpp"
-
-namespace dena {
-
-/*
-template <typename T>
-struct thread : private noncopyable {
- template <typename Ta> thread(const Ta& arg, size_t stack_sz = 256 * 1024)
- : obj(arg), thr(0), need_join(false), stack_size(stack_sz) { }
- template <typename Ta0, typename Ta1> thread(const Ta0& a0,
- volatile Ta1& a1, size_t stack_sz = 256 * 1024)
- : obj(a0, a1), thr(0), need_join(false), stack_size(stack_sz) { }
- ~thread() {
- join();
- }
- void start() {
- if (!start_nothrow()) {
- fatal_abort("thread::start");
- }
- }
- bool start_nothrow() {
- if (need_join) {
- return need_join;
- }
- void *const arg = this;
- pthread_attr_t attr;
- if (pthread_attr_init(&attr) != 0) {
- fatal_abort("pthread_attr_init");
- }
- if (pthread_attr_setstacksize(&attr, stack_size) != 0) {
- fatal_abort("pthread_attr_setstacksize");
- }
- const int r = pthread_create(&thr, &attr, thread_main, arg);
- if (pthread_attr_destroy(&attr) != 0) {
- fatal_abort("pthread_attr_destroy");
- }
- if (r != 0) {
- return need_join;
- }
- need_join = true;
- return need_join;
- }
- void join() {
- if (!need_join) {
- return;
- }
- int e = 0;
- if ((e = pthread_join(thr, 0)) != 0) {
- fatal_abort("pthread_join");
- }
- need_join = false;
- }
- T& operator *() { return obj; }
- T *operator ->() { return &obj; }
- private:
- static void *thread_main(void *arg) {
- thread *p = static_cast<thread *>(arg);
- p->obj();
- return 0;
- }
- private:
- T obj;
- pthread_t thr;
- bool need_join;
- size_t stack_size;
-};
-*/
-
-};
-
-#endif
-
diff --git a/storage/spider/hs_client/util.hpp b/storage/spider/hs_client/util.hpp
deleted file mode 100644
index 60b5441703d..00000000000
--- a/storage/spider/hs_client/util.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-
-// vim:sw=2:ai
-
-/*
- * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved.
- * See COPYRIGHT.txt for details.
- */
-
-#ifndef DENA_UTIL_HPP
-#define DENA_UTIL_HPP
-
-namespace dena {
-
-/* boost::noncopyable */
-struct noncopyable {
- noncopyable() = default;
- private:
- noncopyable(const noncopyable&);
- noncopyable& operator =(const noncopyable&);
-};
-
-};
-
-#endif
-
diff --git a/storage/spider/mysql-test/spider/bg/r/ha.result b/storage/spider/mysql-test/spider/bg/r/ha.result
index f8833c229ef..3c37c2d51f0 100644
--- a/storage/spider/mysql-test/spider/bg/r/ha.result
+++ b/storage/spider/mysql-test/spider/bg/r/ha.result
@@ -62,6 +62,10 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -117,6 +121,10 @@ ALTER TABLE ta_l
CONNECTION='host "localhost", user "root", password "",
msi "5", mkd "2",
database "auto_test_remote auto_test_remote2", lst "0 2"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -130,6 +138,10 @@ ALTER TABLE ta_l
CONNECTION='host "localhost", user "root", password "",
msi "5", mkd "2",
database "auto_test_remote auto_test_remote2", lst "0 1"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -162,6 +174,10 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_AS_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -213,6 +229,10 @@ ALTER TABLE ta_l
CONNECTION='host "localhost", user "root", password "",
msi "5", mkd "2", alc "1",
database "auto_test_remote auto_test_remote2", lst "1 0"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
diff --git a/storage/spider/mysql-test/spider/bg/r/ha_part.result b/storage/spider/mysql-test/spider/bg/r/ha_part.result
index 315f37298bc..39fa2655892 100644
--- a/storage/spider/mysql-test/spider/bg/r/ha_part.result
+++ b/storage/spider/mysql-test/spider/bg/r/ha_part.result
@@ -62,6 +62,11 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_P_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l2 (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -122,6 +127,11 @@ PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3",
PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4",
priority "1000001", lst "0 2"'
);
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -140,6 +150,11 @@ PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3",
PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4",
priority "1000001", lst "0 1"'
);
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -171,6 +186,11 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_AS_P_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l2 (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -230,6 +250,11 @@ PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3",
PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4",
priority "1000001", lst "1 0"'
);
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
diff --git a/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result b/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result
index aa734573a1a..484ef1a00bd 100644
--- a/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result
+++ b/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result
@@ -36,6 +36,10 @@ SELECT 1;
3.1
auto_increment
connection master_1;
+SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+SET SESSION spider_auto_increment_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
connection slave1_1;
connection master_1;
DROP TABLE IF EXISTS t1, t2;
@@ -190,6 +194,7 @@ LAST_INSERT_ID()
SELECT MAX(id) FROM t2;
MAX(id)
10000
+SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
connection slave1_1;
SELECT id FROM t1 ORDER BY id;
id
diff --git a/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result b/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result
index b793346df4b..d4b05f75660 100644
--- a/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result
+++ b/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result
@@ -34,6 +34,10 @@ SELECT 1;
1
auto_increment with partition
connection master_1;
+SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+SET SESSION spider_auto_increment_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
connection slave1_1;
connection master_1;
DROP TABLE IF EXISTS t1, t2;
@@ -188,6 +192,7 @@ LAST_INSERT_ID()
SELECT MAX(id) FROM t2;
MAX(id)
10000
+SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
connection slave1_1;
SELECT id FROM t1 ORDER BY id;
id
diff --git a/storage/spider/mysql-test/spider/bg/r/spider_fixes.result b/storage/spider/mysql-test/spider/bg/r/spider_fixes.result
index 1db31ca9f95..a6a7588b014 100644
--- a/storage/spider/mysql-test/spider/bg/r/spider_fixes.result
+++ b/storage/spider/mysql-test/spider/bg/r/spider_fixes.result
@@ -297,10 +297,16 @@ CREATE TABLE t1 (
id int(11) NOT NULL,
PRIMARY KEY (id)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_LOCK1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
CREATE TABLE t2 (
id int(11) NOT NULL,
PRIMARY KEY (id)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_LOCK2
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
LOCK TABLES t1 READ, t2 READ;
UNLOCK TABLES;
@@ -413,6 +419,10 @@ connection master_1;
read only
connection master_1;
+SET @original_spider_read_only_mode = @@SESSION.spider_read_only_mode;
+SET SESSION spider_read_only_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
id int(11) NOT NULL,
@@ -441,10 +451,19 @@ DELETE FROM t1;
ERROR HY000: Table 'auto_test_local.t1' is read only
TRUNCATE t1;
ERROR HY000: Table 'auto_test_local.t1' is read only
+SET SESSION spider_read_only_mode = @original_spider_read_only_mode;
2.27
error mode
connection master_1;
+SET @original_spider_error_read_mode = @@SESSION.spider_error_read_mode;
+SET @original_spider_error_write_mode = @@SESSION.spider_error_write_mode;
+SET SESSION spider_error_read_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
+SET SESSION spider_error_write_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
id int(11) NOT NULL,
@@ -466,6 +485,8 @@ Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
TRUNCATE t1;
Warnings:
Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
+SET SESSION spider_error_read_mode = @original_spider_error_read_mode;
+SET SESSION spider_error_write_mode = @original_spider_error_write_mode;
3.0
is null
diff --git a/storage/spider/mysql-test/spider/bg/t/spider3_fixes.test b/storage/spider/mysql-test/spider/bg/t/spider3_fixes.test
index 64d3b657ae8..30d22a6a16f 100644
--- a/storage/spider/mysql-test/spider/bg/t/spider3_fixes.test
+++ b/storage/spider/mysql-test/spider/bg/t/spider3_fixes.test
@@ -97,6 +97,8 @@ if ($USE_CHILD_GROUP2)
}
}
--connection master_1
+SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+SET SESSION spider_auto_increment_mode = -1;
if ($USE_REPLICATION)
{
save_master_pos;
@@ -222,6 +224,7 @@ SELECT MAX(id) FROM t1;
INSERT INTO t2 (id) VALUES (1000);
SELECT LAST_INSERT_ID();
SELECT MAX(id) FROM t2;
+SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
if ($USE_REPLICATION)
{
save_master_pos;
diff --git a/storage/spider/mysql-test/spider/bg/t/spider3_fixes_part.test b/storage/spider/mysql-test/spider/bg/t/spider3_fixes_part.test
index bcd85f42b81..e9c9c194e5c 100644
--- a/storage/spider/mysql-test/spider/bg/t/spider3_fixes_part.test
+++ b/storage/spider/mysql-test/spider/bg/t/spider3_fixes_part.test
@@ -131,6 +131,8 @@ if ($HAVE_PARTITION)
}
}
--connection master_1
+ SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+ SET SESSION spider_auto_increment_mode = -1;
if ($USE_REPLICATION)
{
save_master_pos;
@@ -256,6 +258,7 @@ if ($HAVE_PARTITION)
INSERT INTO t2 (id) VALUES (1000);
SELECT LAST_INSERT_ID();
SELECT MAX(id) FROM t2;
+ SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
if ($USE_REPLICATION)
{
save_master_pos;
diff --git a/storage/spider/mysql-test/spider/bg/t/spider_fixes.test b/storage/spider/mysql-test/spider/bg/t/spider_fixes.test
index 9f7ada052ed..b222f494ba1 100644
--- a/storage/spider/mysql-test/spider/bg/t/spider_fixes.test
+++ b/storage/spider/mysql-test/spider/bg/t/spider_fixes.test
@@ -1172,6 +1172,8 @@ let $MASTER_1_ENGINE_IS_SPIDER=
if ($MASTER_1_ENGINE_IS_SPIDER)
{
--connection master_1
+ SET @original_spider_read_only_mode = @@SESSION.spider_read_only_mode;
+ SET SESSION spider_read_only_mode = -1;
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
@@ -1197,6 +1199,7 @@ if ($MASTER_1_ENGINE_IS_SPIDER)
DELETE FROM t1;
--error 12518
TRUNCATE t1;
+ SET SESSION spider_read_only_mode = @original_spider_read_only_mode;
}
if (!$MASTER_1_ENGINE_IS_SPIDER)
{
@@ -1210,6 +1213,10 @@ if (!$MASTER_1_ENGINE_IS_SPIDER)
if ($MASTER_1_ENGINE_IS_SPIDER)
{
--connection master_1
+ SET @original_spider_error_read_mode = @@SESSION.spider_error_read_mode;
+ SET @original_spider_error_write_mode = @@SESSION.spider_error_write_mode;
+ SET SESSION spider_error_read_mode = -1;
+ SET SESSION spider_error_write_mode = -1;
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
@@ -1227,6 +1234,8 @@ if ($MASTER_1_ENGINE_IS_SPIDER)
INSERT INTO t1 (id) VALUES (1);
DELETE FROM t1;
TRUNCATE t1;
+ SET SESSION spider_error_read_mode = @original_spider_error_read_mode;
+ SET SESSION spider_error_write_mode = @original_spider_error_write_mode;
}
if (!$MASTER_1_ENGINE_IS_SPIDER)
{
diff --git a/storage/spider/mysql-test/spider/bugfix/r/index.result b/storage/spider/mysql-test/spider/bugfix/r/index.result
new file mode 100644
index 00000000000..2aa0b56ef06
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/index.result
@@ -0,0 +1,105 @@
+for master_1
+connect master_1, localhost, root, , , $MASTER_1_MYPORT, $MASTER_1_MYSOCK;
+connection master_1;
+CALL mtr.add_suppression("unknown variable");
+SET SESSION sql_log_bin= 0;
+INSTALL PLUGIN spider SONAME 'ha_spider';
+CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS (
+HOST 'localhost',
+DATABASE 'auto_test_local',
+USER 'root',
+PASSWORD '',
+SOCKET '$MASTER_1_MYSOCK'
+ );
+SET spider_internal_sql_log_off= 0;
+SET spider_direct_order_limit= 10000;
+SET spider_init_sql_alloc_size= 1;
+Warnings:
+Warning 1287 '@@spider_init_sql_alloc_size' is deprecated and will be removed in a future release
+for child2
+for child3
+create database auto_test_local;
+set spider_same_server_link= on;
+#
+# MDEV-27590 Auto-increment on Spider tables with DESC PK does not work properly
+#
+select @@spider_auto_increment_mode;
+@@spider_auto_increment_mode
+0
+create or replace table auto_test_local.t (id int primary key) engine=InnoDB;
+create or replace table t_sp1 (id int auto_increment, primary key(id desc))
+engine=Spider COMMENT='wrapper "mysql", srv "s_1", table "t"';
+insert into t_sp1 () values (),(),();
+insert into t_sp1 () values (),(),();
+select * from t_sp1;
+id
+1
+2
+3
+4
+5
+6
+drop table t_sp1, auto_test_local.t;
+#
+# MDEV-27581 Wrong result with DESC key on partitioned Spider table
+#
+create table auto_test_local.t1 (a int primary key);
+create table auto_test_local.t2 (a int primary key);
+create table t (a int, primary key (a desc)) engine=spider
+engine=spider comment='wrapper "mysql", srv "s_1"'
+partition by range (a)
+(partition p1 values less than (4) comment "table 't1'",
+partition p2 values less than (maxvalue) comment "table 't2'");
+insert into t values (1),(2),(10),(11);
+select * from t where a > 1 order by a;
+a
+2
+10
+11
+drop table t, auto_test_local.t1, auto_test_local.t2;
+#
+# MDEV-27617 HANDLER KEY > (x) does not work with DESC keys, Spider is affected and returns wrong results
+#
+create table auto_test_local.t (a int, b char(1), primary key(a desc));
+insert into auto_test_local.t VALUES (1,'f'),(2,'g'),(3,'j'), (4,'i'),(5,'h');
+create table ts (a int, b char(1), primary key(a desc))
+engine=spider comment='wrapper "mysql", srv "s_1", table "t"';
+set spider_use_handler=3;
+Warnings:
+Warning 1287 '@@spider_use_handler' is deprecated and will be removed in a future release
+select a, b from ts where a > 0 and b = 'g' order by a;
+a b
+2 g
+set spider_use_handler=default;
+Warnings:
+Warning 1287 '@@spider_use_handler' is deprecated and will be removed in a future release
+select a, b from ts where a > 0 and b = 'g' order by a;
+a b
+2 g
+drop table ts, auto_test_local.t;
+drop database auto_test_local;
+for master_1
+connection master_1;
+DROP FUNCTION spider_flush_table_mon_cache;
+DROP FUNCTION spider_copy_tables;
+DROP FUNCTION spider_ping_table;
+DROP FUNCTION spider_bg_direct_sql;
+DROP FUNCTION spider_direct_sql;
+UNINSTALL PLUGIN spider_wrapper_protocols;
+UNINSTALL PLUGIN spider_alloc_mem;
+UNINSTALL PLUGIN spider;
+Warnings:
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
+DROP TABLE IF EXISTS mysql.spider_xa;
+DROP TABLE IF EXISTS mysql.spider_xa_member;
+DROP TABLE IF EXISTS mysql.spider_xa_failed_log;
+DROP TABLE IF EXISTS mysql.spider_tables;
+DROP TABLE IF EXISTS mysql.spider_link_mon_servers;
+DROP TABLE IF EXISTS mysql.spider_link_failed_log;
+DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery;
+DROP TABLE IF EXISTS mysql.spider_table_sts;
+DROP TABLE IF EXISTS mysql.spider_table_crd;
+DROP SERVER s_1;
+disconnect master_1;
+for child2
+for child3
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29855.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29855.result
index 4335d20f4c3..568613368a3 100644
--- a/storage/spider/mysql-test/spider/bugfix/r/mdev_29855.result
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29855.result
@@ -20,6 +20,8 @@ CREATE TABLE tbl_a (
a INT
) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a", srv "s_2_1"';
SET spider_udf_ds_use_real_table=1;
+Warnings:
+Warning 1287 '@@spider_udf_ds_use_real_table' is deprecated and will be removed in a future release
SELECT SPIDER_DIRECT_SQL('select 1 as 1', 'tbl_a', 'srv "s_2_1"');
ERROR 3D000: No database selected
connection master_1;
diff --git a/storage/spider/mysql-test/spider/bugfix/t/index.test b/storage/spider/mysql-test/spider/bugfix/t/index.test
new file mode 100644
index 00000000000..5167e40e8c4
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/index.test
@@ -0,0 +1,48 @@
+--source ../t/test_init.inc
+create database auto_test_local;
+set spider_same_server_link= on;
+
+--echo #
+--echo # MDEV-27590 Auto-increment on Spider tables with DESC PK does not work properly
+--echo #
+
+select @@spider_auto_increment_mode;
+create or replace table auto_test_local.t (id int primary key) engine=InnoDB;
+create or replace table t_sp1 (id int auto_increment, primary key(id desc))
+engine=Spider COMMENT='wrapper "mysql", srv "s_1", table "t"';
+insert into t_sp1 () values (),(),();
+insert into t_sp1 () values (),(),();
+select * from t_sp1;
+drop table t_sp1, auto_test_local.t;
+
+--echo #
+--echo # MDEV-27581 Wrong result with DESC key on partitioned Spider table
+--echo #
+create table auto_test_local.t1 (a int primary key);
+create table auto_test_local.t2 (a int primary key);
+create table t (a int, primary key (a desc)) engine=spider
+engine=spider comment='wrapper "mysql", srv "s_1"'
+partition by range (a)
+(partition p1 values less than (4) comment "table 't1'",
+ partition p2 values less than (maxvalue) comment "table 't2'");
+
+insert into t values (1),(2),(10),(11);
+select * from t where a > 1 order by a;
+drop table t, auto_test_local.t1, auto_test_local.t2;
+
+--echo #
+--echo # MDEV-27617 HANDLER KEY > (x) does not work with DESC keys, Spider is affected and returns wrong results
+--echo #
+
+create table auto_test_local.t (a int, b char(1), primary key(a desc));
+insert into auto_test_local.t VALUES (1,'f'),(2,'g'),(3,'j'), (4,'i'),(5,'h');
+create table ts (a int, b char(1), primary key(a desc))
+engine=spider comment='wrapper "mysql", srv "s_1", table "t"';
+set spider_use_handler=3;
+select a, b from ts where a > 0 and b = 'g' order by a;
+set spider_use_handler=default;
+select a, b from ts where a > 0 and b = 'g' order by a;
+drop table ts, auto_test_local.t;
+
+drop database auto_test_local;
+--source ../t/test_deinit.inc
diff --git a/storage/spider/mysql-test/spider/feature/r/engine_defined_attributes.result b/storage/spider/mysql-test/spider/feature/r/engine_defined_attributes.result
new file mode 100644
index 00000000000..c772ecf797a
--- /dev/null
+++ b/storage/spider/mysql-test/spider/feature/r/engine_defined_attributes.result
@@ -0,0 +1,236 @@
+#
+# MDEV-27106 Spider: specify connection to data node by engine-defined attributes
+#
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+connection master_1;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+connection child2_1;
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+connection child2_2;
+CREATE DATABASE auto_test_remote2;
+USE auto_test_remote2;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+# Single data node
+connection master_1;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+REMOTE_SERVER="s_2_1" REMOTE_TABLE="tbl_a";
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+a b
+1 aaa
+2 bbb
+3 ccc
+4 ddd
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+# Multiple data nodes with high availability setting
+connection master_1;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+REMOTE_SERVER="s_2_1 s_2_2" REMOTE_TABLE="tbl_a";
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+a b
+1 aaa
+2 bbb
+3 ccc
+4 ddd
+connection child2_1;
+SELECT * FROM tbl_a;
+a b
+1 aaa
+2 bbb
+3 ccc
+4 ddd
+connection child2_2;
+SELECT * FROM tbl_a;
+a b
+1 aaa
+2 bbb
+3 ccc
+4 ddd
+connection master_1;
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+# Multiple data nodes with partition options
+connection master_1;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+PARTITION BY RANGE (a) (
+PARTITION p1 VALUES LESS THAN (3) REMOTE_SERVER="s_2_1" REMOTE_TABLE="tbl_a",
+PARTITION p2 VALUES LESS THAN MAXVALUE REMOTE_SERVER="s_2_2" REMOTE_TABLE="tbl_a"
+);
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+a b
+1 aaa
+2 bbb
+3 ccc
+4 ddd
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+# Multiple data nodes with table options + partition options
+connection master_1;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+REMOTE_SERVER="s_2_1" REMOTE_TABLE="tbl_a"
+PARTITION BY RANGE (a) (
+PARTITION p1 VALUES LESS THAN (3),
+PARTITION p2 VALUES LESS THAN MAXVALUE REMOTE_SERVER="s_2_2"
+);
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+a b
+1 aaa
+2 bbb
+3 ccc
+4 ddd
+connection child2_1;
+SELECT * FROM tbl_a;
+a b
+1 aaa
+2 bbb
+connection master_1;
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+# COMMENT + engine-defined option
+connection master_1;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+COMMENT='tbl "tbl_a"'
+PARTITION BY RANGE (a) (
+PARTITION p1 VALUES LESS THAN (3) COMMENT='srv "s_2_1"',
+PARTITION p2 VALUES LESS THAN MAXVALUE REMOTE_SERVER="s_2_2"
+);
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+a b
+1 aaa
+2 bbb
+3 ccc
+4 ddd
+connection child2_1;
+SELECT * FROM tbl_a;
+a b
+1 aaa
+2 bbb
+connection master_1;
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+# COMMENT + engine-defined option (invalid)
+connection master_1;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+REMOTE_SERVER="s_2_1" REMOTE_TABLE="tbl_a" COMMENT='tbl "tbl_b"';
+ERROR HY000: Can't create table `auto_test_local`.`tbl_a` (errno: 12501 "Unknown error 12501")
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+COMMENT='srv "s_2_1"' REMOTE_TABLE="tbl_a"
+PARTITION BY RANGE (a) (
+PARTITION p1 VALUES LESS THAN (3),
+PARTITION p2 VALUES LESS THAN MAXVALUE REMOTE_SERVER="s_2_2"
+);
+ERROR HY000: Can't create table `auto_test_local`.`tbl_a` (errno: 12501 "Unknown error 12501")
+# Various combinations of COMMENTs and options
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+REMOTE_SERVER="s_2_1" REMOTE_DATABASE="auto_test_remote" REMOTE_TABLE="tbl_a";
+SELECT * FROM tbl_a;
+a b
+DROP TABLE tbl_a;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+REMOTE_TABLE="tbl_a"
+PARTITION BY RANGE (a) (
+PARTITION p1 VALUES LESS THAN (3)
+REMOTE_SERVER="s_2_1" COMMENT='database "auto_test_remote"',
+PARTITION p2 VALUES LESS THAN MAXVALUE
+REMOTE_SERVER="s_2_2" REMOTE_DATABASE="auto_test_remote2"
+);
+SELECT * FROM tbl_a;
+a b
+DROP TABLE tbl_a;
+CREATE TABLE tbl_a (
+a INT,
+b VARCHAR(255),
+PRIMARY KEY(a)
+) ENGINE=Spider DEFAULT CHARSET=utf8
+COMMENT='tbl "tbl_a"'
+PARTITION BY RANGE (a) (
+PARTITION p1 VALUES LESS THAN (3)
+REMOTE_SERVER="s_2_1" REMOTE_DATABASE="auto_test_remote",
+PARTITION p2 VALUES LESS THAN MAXVALUE
+REMOTE_SERVER="s_2_2" REMOTE_DATABASE="auto_test_remote2"
+);
+SELECT * FROM tbl_a;
+a b
+DROP TABLE tbl_a;
+CREATE TABLE tbl_a (
+a INT
+) ENGINE=Spider DEFAULT CHARSET=utf8
+PARTITION BY HASH (a) PARTITIONS 2;
+SELECT * FROM tbl_a;
+ERROR HY000: Unable to connect to foreign data source: localhost
+DROP TABLE tbl_a;
+# MDEV-27860 SIGSEGV in spider_parse_connect_info on CREATE TABLE
+CREATE TABLE tbl_a ENGINE=SPIDER COMMENT="TABLE 'unknown_table'"
+PARTITION BY LIST COLUMNS (c) (
+PARTITION p DEFAULT COMMENT="srv 'unknown_server'" ENGINE=SPIDER
+);
+ERROR HY000: The foreign server name you are trying to reference does not exist. Data source error: unknown_server
+connection child2_1;
+DROP DATABASE auto_test_remote;
+connection child2_2;
+DROP DATABASE auto_test_remote2;
+connection master_1;
+DROP DATABASE auto_test_local;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
diff --git a/storage/spider/mysql-test/spider/feature/t/engine_defined_attributes.cnf b/storage/spider/mysql-test/spider/feature/t/engine_defined_attributes.cnf
new file mode 100644
index 00000000000..e0ffb99c38e
--- /dev/null
+++ b/storage/spider/mysql-test/spider/feature/t/engine_defined_attributes.cnf
@@ -0,0 +1,4 @@
+!include include/default_mysqld.cnf
+!include ../my_1_1.cnf
+!include ../my_2_1.cnf
+!include ../my_2_2.cnf
diff --git a/storage/spider/mysql-test/spider/feature/t/engine_defined_attributes.test b/storage/spider/mysql-test/spider/feature/t/engine_defined_attributes.test
new file mode 100644
index 00000000000..0d5c849045f
--- /dev/null
+++ b/storage/spider/mysql-test/spider/feature/t/engine_defined_attributes.test
@@ -0,0 +1,227 @@
+--echo #
+--echo # MDEV-27106 Spider: specify connection to data node by engine-defined attributes
+--echo #
+
+--disable_query_log
+--disable_result_log
+--source ../t/test_init.inc
+--enable_result_log
+--enable_query_log
+
+--connection master_1
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+
+--connection child2_1
+CREATE DATABASE auto_test_remote;
+USE auto_test_remote;
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+
+--connection child2_2
+CREATE DATABASE auto_test_remote2;
+USE auto_test_remote2;
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
+
+--echo # Single data node
+--connection master_1
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+REMOTE_SERVER="s_2_1" REMOTE_TABLE="tbl_a";
+
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+
+--echo # Multiple data nodes with high availability setting
+--connection master_1
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+REMOTE_SERVER="s_2_1 s_2_2" REMOTE_TABLE="tbl_a";
+
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+
+--connection child2_1
+SELECT * FROM tbl_a;
+
+--connection child2_2
+SELECT * FROM tbl_a;
+
+--connection master_1
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+
+--echo # Multiple data nodes with partition options
+--connection master_1
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+PARTITION BY RANGE (a) (
+ PARTITION p1 VALUES LESS THAN (3) REMOTE_SERVER="s_2_1" REMOTE_TABLE="tbl_a",
+ PARTITION p2 VALUES LESS THAN MAXVALUE REMOTE_SERVER="s_2_2" REMOTE_TABLE="tbl_a"
+);
+
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+
+--echo # Multiple data nodes with table options + partition options
+--connection master_1
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+REMOTE_SERVER="s_2_1" REMOTE_TABLE="tbl_a"
+PARTITION BY RANGE (a) (
+ PARTITION p1 VALUES LESS THAN (3),
+ PARTITION p2 VALUES LESS THAN MAXVALUE REMOTE_SERVER="s_2_2"
+);
+
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+
+--connection child2_1
+SELECT * FROM tbl_a;
+
+--connection master_1
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+
+--echo # COMMENT + engine-defined option
+--connection master_1
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+COMMENT='tbl "tbl_a"'
+PARTITION BY RANGE (a) (
+ PARTITION p1 VALUES LESS THAN (3) COMMENT='srv "s_2_1"',
+ PARTITION p2 VALUES LESS THAN MAXVALUE REMOTE_SERVER="s_2_2"
+);
+
+INSERT INTO tbl_a VALUES (1, "aaa"), (2, "bbb"), (3, "ccc"), (4, "ddd");
+SELECT * FROM tbl_a;
+
+--connection child2_1
+SELECT * FROM tbl_a;
+
+--connection master_1
+DELETE FROM tbl_a;
+DROP TABLE tbl_a;
+
+--echo # COMMENT + engine-defined option (invalid)
+--connection master_1
+
+--replace_result error: error
+--error ER_CANT_CREATE_TABLE
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+REMOTE_SERVER="s_2_1" REMOTE_TABLE="tbl_a" COMMENT='tbl "tbl_b"';
+
+--replace_result error: error
+--error ER_CANT_CREATE_TABLE
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+COMMENT='srv "s_2_1"' REMOTE_TABLE="tbl_a"
+PARTITION BY RANGE (a) (
+ PARTITION p1 VALUES LESS THAN (3),
+ PARTITION p2 VALUES LESS THAN MAXVALUE REMOTE_SERVER="s_2_2"
+);
+
+--echo # Various combinations of COMMENTs and options
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+REMOTE_SERVER="s_2_1" REMOTE_DATABASE="auto_test_remote" REMOTE_TABLE="tbl_a";
+SELECT * FROM tbl_a;
+DROP TABLE tbl_a;
+
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+REMOTE_TABLE="tbl_a"
+PARTITION BY RANGE (a) (
+ PARTITION p1 VALUES LESS THAN (3)
+ REMOTE_SERVER="s_2_1" COMMENT='database "auto_test_remote"',
+ PARTITION p2 VALUES LESS THAN MAXVALUE
+ REMOTE_SERVER="s_2_2" REMOTE_DATABASE="auto_test_remote2"
+);
+SELECT * FROM tbl_a;
+DROP TABLE tbl_a;
+
+eval CREATE TABLE tbl_a (
+ a INT,
+ b VARCHAR(255),
+ PRIMARY KEY(a)
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+COMMENT='tbl "tbl_a"'
+PARTITION BY RANGE (a) (
+ PARTITION p1 VALUES LESS THAN (3)
+ REMOTE_SERVER="s_2_1" REMOTE_DATABASE="auto_test_remote",
+ PARTITION p2 VALUES LESS THAN MAXVALUE
+ REMOTE_SERVER="s_2_2" REMOTE_DATABASE="auto_test_remote2"
+);
+SELECT * FROM tbl_a;
+DROP TABLE tbl_a;
+
+eval CREATE TABLE tbl_a (
+ a INT
+) $MASTER_1_ENGINE $MASTER_1_CHARSET
+PARTITION BY HASH (a) PARTITIONS 2;
+--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
+SELECT * FROM tbl_a;
+DROP TABLE tbl_a;
+
+--echo # MDEV-27860 SIGSEGV in spider_parse_connect_info on CREATE TABLE
+--error ER_FOREIGN_SERVER_DOESNT_EXIST
+CREATE TABLE tbl_a ENGINE=SPIDER COMMENT="TABLE 'unknown_table'"
+PARTITION BY LIST COLUMNS (c) (
+ PARTITION p DEFAULT COMMENT="srv 'unknown_server'" ENGINE=SPIDER
+);
+
+--connection child2_1
+DROP DATABASE auto_test_remote;
+
+--connection child2_2
+DROP DATABASE auto_test_remote2;
+
+--connection master_1
+DROP DATABASE auto_test_local;
+
+--disable_query_log
+--disable_result_log
+--source ../t/test_deinit.inc
+--enable_result_log
+--enable_query_log
diff --git a/storage/spider/mysql-test/spider/handler/r/ha.result b/storage/spider/mysql-test/spider/handler/r/ha.result
index f8833c229ef..3c37c2d51f0 100644
--- a/storage/spider/mysql-test/spider/handler/r/ha.result
+++ b/storage/spider/mysql-test/spider/handler/r/ha.result
@@ -62,6 +62,10 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -117,6 +121,10 @@ ALTER TABLE ta_l
CONNECTION='host "localhost", user "root", password "",
msi "5", mkd "2",
database "auto_test_remote auto_test_remote2", lst "0 2"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -130,6 +138,10 @@ ALTER TABLE ta_l
CONNECTION='host "localhost", user "root", password "",
msi "5", mkd "2",
database "auto_test_remote auto_test_remote2", lst "0 1"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -162,6 +174,10 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_AS_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -213,6 +229,10 @@ ALTER TABLE ta_l
CONNECTION='host "localhost", user "root", password "",
msi "5", mkd "2", alc "1",
database "auto_test_remote auto_test_remote2", lst "1 0"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
diff --git a/storage/spider/mysql-test/spider/handler/r/ha_part.result b/storage/spider/mysql-test/spider/handler/r/ha_part.result
index 315f37298bc..39fa2655892 100644
--- a/storage/spider/mysql-test/spider/handler/r/ha_part.result
+++ b/storage/spider/mysql-test/spider/handler/r/ha_part.result
@@ -62,6 +62,11 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_P_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l2 (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -122,6 +127,11 @@ PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3",
PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4",
priority "1000001", lst "0 2"'
);
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -140,6 +150,11 @@ PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3",
PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4",
priority "1000001", lst "0 1"'
);
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -171,6 +186,11 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_AS_P_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l2 (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -230,6 +250,11 @@ PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3",
PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4",
priority "1000001", lst "1 0"'
);
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
diff --git a/storage/spider/mysql-test/spider/handler/r/spider3_fixes.result b/storage/spider/mysql-test/spider/handler/r/spider3_fixes.result
index 9a8a59153f0..abe543fe193 100644
--- a/storage/spider/mysql-test/spider/handler/r/spider3_fixes.result
+++ b/storage/spider/mysql-test/spider/handler/r/spider3_fixes.result
@@ -36,6 +36,10 @@ SELECT 1;
3.1
auto_increment
connection master_1;
+SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+SET SESSION spider_auto_increment_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
connection slave1_1;
connection master_1;
DROP TABLE IF EXISTS t1, t2;
@@ -206,6 +210,7 @@ LAST_INSERT_ID()
SELECT MAX(id) FROM t2;
MAX(id)
46
+SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
connection slave1_1;
SELECT id FROM t1 ORDER BY id;
id
diff --git a/storage/spider/mysql-test/spider/handler/r/spider3_fixes_part.result b/storage/spider/mysql-test/spider/handler/r/spider3_fixes_part.result
index f8747cff5ea..6c3a1802f1d 100644
--- a/storage/spider/mysql-test/spider/handler/r/spider3_fixes_part.result
+++ b/storage/spider/mysql-test/spider/handler/r/spider3_fixes_part.result
@@ -34,6 +34,10 @@ SELECT 1;
1
auto_increment with partition
connection master_1;
+SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+SET SESSION spider_auto_increment_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
connection slave1_1;
connection master_1;
DROP TABLE IF EXISTS t1, t2;
@@ -204,6 +208,7 @@ LAST_INSERT_ID()
SELECT MAX(id) FROM t2;
MAX(id)
26
+SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
connection slave1_1;
SELECT id FROM t1 ORDER BY id;
id
diff --git a/storage/spider/mysql-test/spider/handler/r/spider_fixes.result b/storage/spider/mysql-test/spider/handler/r/spider_fixes.result
index c171167a1b7..aa7d2ea40c1 100644
--- a/storage/spider/mysql-test/spider/handler/r/spider_fixes.result
+++ b/storage/spider/mysql-test/spider/handler/r/spider_fixes.result
@@ -297,15 +297,25 @@ CREATE TABLE t1 (
id int(11) NOT NULL,
PRIMARY KEY (id)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_LOCK1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
CREATE TABLE t2 (
id int(11) NOT NULL,
PRIMARY KEY (id)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_LOCK2
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
LOCK TABLES t1 READ, t2 READ;
UNLOCK TABLES;
auto_increment
connection master_1;
+SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+SET SESSION spider_auto_increment_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
connection slave1_1;
connection master_1;
DROP TABLE IF EXISTS t1;
@@ -399,6 +409,7 @@ LAST_INSERT_ID()
SELECT MAX(id) FROM t1;
MAX(id)
42
+SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
connection slave1_1;
SELECT id FROM t1 ORDER BY id;
id
@@ -417,6 +428,10 @@ connection master_1;
read only
connection master_1;
+SET @original_spider_read_only_mode = @@SESSION.spider_read_only_mode;
+SET SESSION spider_read_only_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
id int(11) NOT NULL,
@@ -445,10 +460,19 @@ DELETE FROM t1;
ERROR HY000: Table 'auto_test_local.t1' is read only
TRUNCATE t1;
ERROR HY000: Table 'auto_test_local.t1' is read only
+SET SESSION spider_read_only_mode = @original_spider_read_only_mode;
2.27
error mode
connection master_1;
+SET @original_spider_error_read_mode = @@SESSION.spider_error_read_mode;
+SET @original_spider_error_write_mode = @@SESSION.spider_error_write_mode;
+SET SESSION spider_error_read_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
+SET SESSION spider_error_write_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
id int(11) NOT NULL,
@@ -470,6 +494,8 @@ Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
TRUNCATE t1;
Warnings:
Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
+SET SESSION spider_error_read_mode = @original_spider_error_read_mode;
+SET SESSION spider_error_write_mode = @original_spider_error_write_mode;
3.0
is null
diff --git a/storage/spider/mysql-test/spider/handler/r/spider_fixes_part.result b/storage/spider/mysql-test/spider/handler/r/spider_fixes_part.result
index c99c02071b6..249f39520c2 100644
--- a/storage/spider/mysql-test/spider/handler/r/spider_fixes_part.result
+++ b/storage/spider/mysql-test/spider/handler/r/spider_fixes_part.result
@@ -109,6 +109,10 @@ a b c
2.26
auto_increment with partition
connection master_1;
+SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+SET SESSION spider_auto_increment_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
connection slave1_1;
connection master_1;
DROP TABLE IF EXISTS t1;
@@ -202,6 +206,7 @@ LAST_INSERT_ID()
SELECT MAX(id) FROM t1;
MAX(id)
26
+SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
connection slave1_1;
SELECT id FROM t1 ORDER BY id;
id
diff --git a/storage/spider/mysql-test/spider/handler/t/spider3_fixes.test b/storage/spider/mysql-test/spider/handler/t/spider3_fixes.test
index 64d3b657ae8..30d22a6a16f 100644
--- a/storage/spider/mysql-test/spider/handler/t/spider3_fixes.test
+++ b/storage/spider/mysql-test/spider/handler/t/spider3_fixes.test
@@ -97,6 +97,8 @@ if ($USE_CHILD_GROUP2)
}
}
--connection master_1
+SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+SET SESSION spider_auto_increment_mode = -1;
if ($USE_REPLICATION)
{
save_master_pos;
@@ -222,6 +224,7 @@ SELECT MAX(id) FROM t1;
INSERT INTO t2 (id) VALUES (1000);
SELECT LAST_INSERT_ID();
SELECT MAX(id) FROM t2;
+SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
if ($USE_REPLICATION)
{
save_master_pos;
diff --git a/storage/spider/mysql-test/spider/handler/t/spider3_fixes_part.test b/storage/spider/mysql-test/spider/handler/t/spider3_fixes_part.test
index bcd85f42b81..e9c9c194e5c 100644
--- a/storage/spider/mysql-test/spider/handler/t/spider3_fixes_part.test
+++ b/storage/spider/mysql-test/spider/handler/t/spider3_fixes_part.test
@@ -131,6 +131,8 @@ if ($HAVE_PARTITION)
}
}
--connection master_1
+ SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+ SET SESSION spider_auto_increment_mode = -1;
if ($USE_REPLICATION)
{
save_master_pos;
@@ -256,6 +258,7 @@ if ($HAVE_PARTITION)
INSERT INTO t2 (id) VALUES (1000);
SELECT LAST_INSERT_ID();
SELECT MAX(id) FROM t2;
+ SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
if ($USE_REPLICATION)
{
save_master_pos;
diff --git a/storage/spider/mysql-test/spider/handler/t/spider_fixes.test b/storage/spider/mysql-test/spider/handler/t/spider_fixes.test
index 9f7ada052ed..5a3c1d1c893 100644
--- a/storage/spider/mysql-test/spider/handler/t/spider_fixes.test
+++ b/storage/spider/mysql-test/spider/handler/t/spider_fixes.test
@@ -1049,6 +1049,8 @@ if ($USE_CHILD_GROUP2)
}
}
--connection master_1
+SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+SET SESSION spider_auto_increment_mode = -1;
if ($USE_REPLICATION)
{
save_master_pos;
@@ -1120,6 +1122,7 @@ SELECT MAX(id) FROM t1;
INSERT INTO t1 (id) VALUES (1000);
SELECT LAST_INSERT_ID();
SELECT MAX(id) FROM t1;
+SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
if ($USE_REPLICATION)
{
save_master_pos;
@@ -1172,6 +1175,8 @@ let $MASTER_1_ENGINE_IS_SPIDER=
if ($MASTER_1_ENGINE_IS_SPIDER)
{
--connection master_1
+ SET @original_spider_read_only_mode = @@SESSION.spider_read_only_mode;
+ SET SESSION spider_read_only_mode = -1;
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
@@ -1197,6 +1202,7 @@ if ($MASTER_1_ENGINE_IS_SPIDER)
DELETE FROM t1;
--error 12518
TRUNCATE t1;
+ SET SESSION spider_read_only_mode = @original_spider_read_only_mode;
}
if (!$MASTER_1_ENGINE_IS_SPIDER)
{
@@ -1210,6 +1216,10 @@ if (!$MASTER_1_ENGINE_IS_SPIDER)
if ($MASTER_1_ENGINE_IS_SPIDER)
{
--connection master_1
+ SET @original_spider_error_read_mode = @@SESSION.spider_error_read_mode;
+ SET @original_spider_error_write_mode = @@SESSION.spider_error_write_mode;
+ SET SESSION spider_error_read_mode = -1;
+ SET SESSION spider_error_write_mode = -1;
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
@@ -1227,6 +1237,8 @@ if ($MASTER_1_ENGINE_IS_SPIDER)
INSERT INTO t1 (id) VALUES (1);
DELETE FROM t1;
TRUNCATE t1;
+ SET SESSION spider_error_read_mode = @original_spider_error_read_mode;
+ SET SESSION spider_error_write_mode = @original_spider_error_write_mode;
}
if (!$MASTER_1_ENGINE_IS_SPIDER)
{
diff --git a/storage/spider/mysql-test/spider/handler/t/spider_fixes_part.test b/storage/spider/mysql-test/spider/handler/t/spider_fixes_part.test
index e6c4456edcb..22ba6102405 100644
--- a/storage/spider/mysql-test/spider/handler/t/spider_fixes_part.test
+++ b/storage/spider/mysql-test/spider/handler/t/spider_fixes_part.test
@@ -485,6 +485,8 @@ if ($HAVE_PARTITION)
}
}
--connection master_1
+ SET @original_spider_auto_increment_mode = @@SESSION.spider_auto_increment_mode;
+ SET SESSION spider_auto_increment_mode = -1;
if ($USE_REPLICATION)
{
save_master_pos;
@@ -556,6 +558,7 @@ if ($HAVE_PARTITION)
INSERT INTO t1 (id) VALUES (1000);
SELECT LAST_INSERT_ID();
SELECT MAX(id) FROM t1;
+ SET SESSION spider_auto_increment_mode = @original_spider_auto_increment_mode;
if ($USE_REPLICATION)
{
save_master_pos;
diff --git a/storage/spider/mysql-test/spider/include/init_spider.inc b/storage/spider/mysql-test/spider/include/init_spider.inc
index 6a22ffcc1fd..b4ce7c8f035 100644
--- a/storage/spider/mysql-test/spider/include/init_spider.inc
+++ b/storage/spider/mysql-test/spider/include/init_spider.inc
@@ -2,10 +2,10 @@ let $VERSION_COMPILE_OS_WIN=
`SELECT IF(@@version_compile_os like 'Win%', 1, 0)`;
if ($VERSION_COMPILE_OS_WIN)
{
- INSTALL PLUGIN spider SONAME 'ha_spider.dll';
+ INSTALL PLUGIN spider SONAME 'ha_spider';
if ($MASTER_1_MYPORT)
{
- eval CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_local',
USER 'root',
@@ -15,7 +15,7 @@ if ($VERSION_COMPILE_OS_WIN)
}
if ($CHILD2_1_MYPORT)
{
- eval CREATE SERVER s_2_1 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_2_1 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_remote',
USER 'root',
@@ -25,7 +25,7 @@ if ($VERSION_COMPILE_OS_WIN)
}
if ($CHILD2_2_MYPORT)
{
- eval CREATE SERVER s_2_2 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_2_2 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_remote2',
USER 'root',
@@ -35,7 +35,7 @@ if ($VERSION_COMPILE_OS_WIN)
}
if ($CHILD2_3_MYPORT)
{
- eval CREATE SERVER s_2_3 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_2_3 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_remote3',
USER 'root',
@@ -45,7 +45,7 @@ if ($VERSION_COMPILE_OS_WIN)
}
if ($CHILD3_1_MYPORT)
{
- eval CREATE SERVER s_3_1 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_3_1 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_local',
USER 'root',
@@ -55,7 +55,7 @@ if ($VERSION_COMPILE_OS_WIN)
}
if ($CHILD3_2_MYPORT)
{
- eval CREATE SERVER s_3_2 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_3_2 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_local',
USER 'root',
@@ -65,7 +65,7 @@ if ($VERSION_COMPILE_OS_WIN)
}
if ($CHILD2_3_MYPORT)
{
- eval CREATE SERVER s_3_3 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_3_3 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_local',
USER 'root',
@@ -76,10 +76,10 @@ if ($VERSION_COMPILE_OS_WIN)
}
if (!$VERSION_COMPILE_OS_WIN)
{
- INSTALL PLUGIN spider SONAME 'ha_spider.so';
+ INSTALL PLUGIN spider SONAME 'ha_spider';
if ($MASTER_1_MYSOCK)
{
- eval CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_local',
USER 'root',
@@ -89,7 +89,7 @@ if (!$VERSION_COMPILE_OS_WIN)
}
if ($CHILD2_1_MYSOCK)
{
- eval CREATE SERVER s_2_1 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_2_1 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_remote',
USER 'root',
@@ -99,7 +99,7 @@ if (!$VERSION_COMPILE_OS_WIN)
}
if ($CHILD2_2_MYSOCK)
{
- eval CREATE SERVER s_2_2 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_2_2 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_remote2',
USER 'root',
@@ -109,7 +109,7 @@ if (!$VERSION_COMPILE_OS_WIN)
}
if ($CHILD2_3_MYSOCK)
{
- eval CREATE SERVER s_2_3 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_2_3 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_remote3',
USER 'root',
@@ -119,7 +119,7 @@ if (!$VERSION_COMPILE_OS_WIN)
}
if ($CHILD3_1_MYSOCK)
{
- eval CREATE SERVER s_3_1 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_3_1 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_local',
USER 'root',
@@ -129,7 +129,7 @@ if (!$VERSION_COMPILE_OS_WIN)
}
if ($CHILD3_2_MYSOCK)
{
- eval CREATE SERVER s_3_2 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_3_2 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_local',
USER 'root',
@@ -139,7 +139,7 @@ if (!$VERSION_COMPILE_OS_WIN)
}
if ($CHILD3_3_MYSOCK)
{
- eval CREATE SERVER s_3_3 FOREIGN DATA WRAPPER mysql OPTIONS (
+ evalp CREATE SERVER s_3_3 FOREIGN DATA WRAPPER mysql OPTIONS (
HOST 'localhost',
DATABASE 'auto_test_local',
USER 'root',
@@ -149,13 +149,7 @@ if (!$VERSION_COMPILE_OS_WIN)
}
}
-let $SERVER_NAME=
- `SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(version(), '-', 2), '-', -1)`;
-if (`SELECT IF('$SERVER_NAME' REGEXP '^[0-9]+\$', 1, 0)`)
-{
- let $SERVER_NAME=
- `SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(version(), '-', 3), '-', -1)`;
-}
+let $SERVER_NAME=MariaDB;
let $SERVER_MAJOR_VERSION=
`SELECT SUBSTRING_INDEX(version(), '.', 1)`;
let $SERVER_MINOR_VERSION=
diff --git a/storage/spider/mysql-test/spider/r/error_row_number.result b/storage/spider/mysql-test/spider/r/error_row_number.result
new file mode 100644
index 00000000000..cc2b54878a0
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/error_row_number.result
@@ -0,0 +1,45 @@
+#
+# MDEV-26693 ROW_NUMBER is wrong upon INSERT or UPDATE on Spider table
+#
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+connection child2_1;
+create database auto_test_remote;
+use auto_test_remote;
+create table ta_r (id int primary key);
+connection master_1;
+create table spd (id int primary key) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+insert into spd values (1),(2),(1);
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+get diagnostics condition 1 @n = row_number;
+select @n;
+@n
+0
+delete from spd;
+insert into spd values (1),(2),(3),(13);
+update spd set id = id + 10;
+ERROR 23000: Duplicate entry '13' for key 'PRIMARY'
+get diagnostics condition 1 @n = row_number;
+select @n;
+@n
+0
+drop table spd;
+connection child2_1;
+drop database auto_test_remote;
+connection master_1;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
diff --git a/storage/spider/mysql-test/spider/r/ha.result b/storage/spider/mysql-test/spider/r/ha.result
index f8833c229ef..3c37c2d51f0 100644
--- a/storage/spider/mysql-test/spider/r/ha.result
+++ b/storage/spider/mysql-test/spider/r/ha.result
@@ -62,6 +62,10 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -117,6 +121,10 @@ ALTER TABLE ta_l
CONNECTION='host "localhost", user "root", password "",
msi "5", mkd "2",
database "auto_test_remote auto_test_remote2", lst "0 2"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -130,6 +138,10 @@ ALTER TABLE ta_l
CONNECTION='host "localhost", user "root", password "",
msi "5", mkd "2",
database "auto_test_remote auto_test_remote2", lst "0 1"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -162,6 +174,10 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_AS_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -213,6 +229,10 @@ ALTER TABLE ta_l
CONNECTION='host "localhost", user "root", password "",
msi "5", mkd "2", alc "1",
database "auto_test_remote auto_test_remote2", lst "1 0"';
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
diff --git a/storage/spider/mysql-test/spider/r/ha_part.result b/storage/spider/mysql-test/spider/r/ha_part.result
index d70d62404c0..d191cab37cd 100644
--- a/storage/spider/mysql-test/spider/r/ha_part.result
+++ b/storage/spider/mysql-test/spider/r/ha_part.result
@@ -62,6 +62,11 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_P_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l2 (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -122,6 +127,11 @@ PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3",
PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4",
priority "1000001", lst "0 2"'
);
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -140,6 +150,11 @@ PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3",
PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4",
priority "1000001", lst "0 1"'
);
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
@@ -171,6 +186,11 @@ b CHAR(1),
c DATETIME,
PRIMARY KEY(a)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_HA_AS_P_2_1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
INSERT INTO ta_l2 (a, b, c) VALUES
(1, 'a', '2008-08-01 10:21:39'),
(2, 'b', '2000-01-01 00:00:00'),
@@ -230,6 +250,11 @@ PARTITION pt1 COMMENT='srv "s_2_1 s_2_2", tbl "ta_r ta_r3",
PARTITION pt2 COMMENT='srv "s_2_1 s_2_3", tbl "ta_r2 ta_r4",
priority "1000001", lst "1 0"'
);
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
SELECT db_name, table_name, link_id, link_status FROM mysql.spider_tables
ORDER BY db_name, table_name, link_id;
db_name table_name link_id link_status
diff --git a/storage/spider/mysql-test/spider/r/spider_fixes.result b/storage/spider/mysql-test/spider/r/spider_fixes.result
index b2a2fad5238..3b9d939393a 100644
--- a/storage/spider/mysql-test/spider/r/spider_fixes.result
+++ b/storage/spider/mysql-test/spider/r/spider_fixes.result
@@ -297,10 +297,16 @@ CREATE TABLE t1 (
id int(11) NOT NULL,
PRIMARY KEY (id)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_LOCK1
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
CREATE TABLE t2 (
id int(11) NOT NULL,
PRIMARY KEY (id)
) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_LOCK2
+Warnings:
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
+Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release
LOCK TABLES t1 READ, t2 READ;
UNLOCK TABLES;
@@ -413,6 +419,10 @@ connection master_1;
read only
connection master_1;
+SET @original_spider_read_only_mode = @@SESSION.spider_read_only_mode;
+SET SESSION spider_read_only_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
id int(11) NOT NULL,
@@ -441,10 +451,19 @@ DELETE FROM t1;
ERROR HY000: Table 'auto_test_local.t1' is read only
TRUNCATE t1;
ERROR HY000: Table 'auto_test_local.t1' is read only
+SET SESSION spider_read_only_mode = @original_spider_read_only_mode;
2.27
error mode
connection master_1;
+SET @original_spider_error_read_mode = @@SESSION.spider_error_read_mode;
+SET @original_spider_error_write_mode = @@SESSION.spider_error_write_mode;
+SET SESSION spider_error_read_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
+SET SESSION spider_error_write_mode = -1;
+Warnings:
+Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
id int(11) NOT NULL,
@@ -466,6 +485,8 @@ Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
TRUNCATE t1;
Warnings:
Error 1146 Table 'auto_test_remote.ter1_1' doesn't exist
+SET SESSION spider_error_read_mode = @original_spider_error_read_mode;
+SET SESSION spider_error_write_mode = @original_spider_error_write_mode;
3.0
is null
diff --git a/storage/spider/mysql-test/spider/r/variable_deprecation.result b/storage/spider/mysql-test/spider/r/variable_deprecation.result
new file mode 100644
index 00000000000..cc267f7d363
--- /dev/null
+++ b/storage/spider/mysql-test/spider/r/variable_deprecation.result
@@ -0,0 +1,267 @@
+#
+# MDEV-27228 Deprecate Spider plugin variables that result in excessive tweak
+#
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
+connection master_1;
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+# MDEV-27923 Deprecate spider_use_handler
+SET spider_use_handler = 3;
+Warnings:
+Warning 1287 '@@spider_use_handler' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_use_handler";
+Variable_name Value
+spider_use_handler 3
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='uhd "3"';
+Warnings:
+Warning 1287 The table parameter 'uhd' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='use_handler "3"';
+Warnings:
+Warning 1287 The table parameter 'use_handler' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+# MDEV-28297 Deprecate spider_internal_offset
+SET spider_internal_offset = 1;
+Warnings:
+Warning 1287 '@@spider_internal_offset' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_internal_offset";
+Variable_name Value
+spider_internal_offset 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='ios "1"';
+Warnings:
+Warning 1287 The table parameter 'ios' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='internal_offset "1"';
+Warnings:
+Warning 1287 The table parameter 'internal_offset' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+# MDEV-28005 Deprecate Spider plugin variables regarding UDFs
+SET GLOBAL spider_udf_ds_bulk_insert_rows = 1;
+Warnings:
+Warning 1287 '@@spider_udf_ds_bulk_insert_rows' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_udf_ds_bulk_insert_rows";
+Variable_name Value
+spider_udf_ds_bulk_insert_rows -1
+SET spider_udf_ds_table_loop_mode = 1;
+Warnings:
+Warning 1287 '@@spider_udf_ds_table_loop_mode' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_udf_ds_table_loop_mode";
+Variable_name Value
+spider_udf_ds_table_loop_mode 1
+SET spider_udf_ds_use_real_table = 1;
+Warnings:
+Warning 1287 '@@spider_udf_ds_use_real_table' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_udf_ds_use_real_table";
+Variable_name Value
+spider_udf_ds_use_real_table 1
+SET GLOBAL spider_udf_ct_bulk_insert_interval = 1;
+Warnings:
+Warning 1287 '@@spider_udf_ct_bulk_insert_interval' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_udf_ct_bulk_insert_interval";
+Variable_name Value
+spider_udf_ct_bulk_insert_interval 1
+SET GLOBAL spider_udf_ct_bulk_insert_rows = 1;
+Warnings:
+Warning 1287 '@@spider_udf_ct_bulk_insert_rows' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_udf_ct_bulk_insert_rows";
+Variable_name Value
+spider_udf_ct_bulk_insert_rows 1
+# MDEV-27981 Deprecate spider_internal_limit
+SET spider_internal_limit = 1;
+Warnings:
+Warning 1287 '@@spider_internal_limit' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_internal_limit";
+Variable_name Value
+spider_internal_limit 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='ilm "1"';
+Warnings:
+Warning 1287 The table parameter 'ilm' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='internal_limit "1"';
+Warnings:
+Warning 1287 The table parameter 'internal_limit' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+# MDEV-28244 Deprecate spider_xa_register_mode
+SET spider_xa_register_mode = 0;
+Warnings:
+Warning 1287 '@@spider_xa_register_mode' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_xa_register_mode";
+Variable_name Value
+spider_xa_register_mode 0
+# MDEV-28007 Deprecate Spider plugin variables regarding statistics persistence
+SET GLOBAL spider_store_last_sts = 0;
+Warnings:
+Warning 1287 '@@spider_store_last_sts' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_store_last_sts";
+Variable_name Value
+spider_store_last_sts 0
+SET GLOBAL spider_store_last_crd = 0;
+Warnings:
+Warning 1287 '@@spider_store_last_crd' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_store_last_crd";
+Variable_name Value
+spider_store_last_crd 0
+SET GLOBAL spider_load_sts_at_startup = 0;
+Warnings:
+Warning 1287 '@@spider_load_sts_at_startup' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_load_sts_at_startup";
+Variable_name Value
+spider_load_sts_at_startup 0
+SET GLOBAL spider_load_crd_at_startup = 0;
+Warnings:
+Warning 1287 '@@spider_load_crd_at_startup' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_load_crd_at_startup";
+Variable_name Value
+spider_load_crd_at_startup 0
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+# MDEV-28008 Deprecate spider_crd_mode and spider_sts_mode
+SET spider_crd_mode = 1;
+Warnings:
+Warning 1287 '@@spider_crd_mode' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_crd_mode";
+Variable_name Value
+spider_crd_mode 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='cmd "3"';
+Warnings:
+Warning 1287 The table parameter 'cmd' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='crd_mode "3"';
+Warnings:
+Warning 1287 The table parameter 'crd_mode' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+SET spider_sts_mode = 1;
+Warnings:
+Warning 1287 '@@spider_sts_mode' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_sts_mode";
+Variable_name Value
+spider_sts_mode 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='smd "3"';
+Warnings:
+Warning 1287 The table parameter 'smd' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='sts_mode "3"';
+Warnings:
+Warning 1287 The table parameter 'sts_mode' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+# MDEV-28010 Deprecate spider_crd_type and spider_crd_weight
+SET spider_crd_type = 1;
+Warnings:
+Warning 1287 '@@spider_crd_type' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_crd_type";
+Variable_name Value
+spider_crd_type 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='ctp "1"';
+Warnings:
+Warning 1287 The table parameter 'ctp' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='crd_type "1"';
+Warnings:
+Warning 1287 The table parameter 'crd_type' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+SET spider_crd_weight = 1;
+Warnings:
+Warning 1287 '@@spider_crd_weight' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_crd_weight";
+Variable_name Value
+spider_crd_weight 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='cwg "1"';
+Warnings:
+Warning 1287 The table parameter 'cwg' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='crd_weight "1"';
+Warnings:
+Warning 1287 The table parameter 'crd_weight' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+# MDEV-28560 Deprecate spider_buffer_size
+SET spider_buffer_size = 1;
+Warnings:
+Warning 1287 '@@spider_buffer_size' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_buffer_size";
+Variable_name Value
+spider_buffer_size 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='bfz "1"';
+Warnings:
+Warning 1287 The table parameter 'bfz' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='buffer_size "1"';
+Warnings:
+Warning 1287 The table parameter 'buffer_size' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+# MDEV-27926 Deprecate spider_init_sql_alloc_size
+SET spider_init_sql_alloc_size = 1;
+Warnings:
+Warning 1287 '@@spider_init_sql_alloc_size' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_init_sql_alloc_size";
+Variable_name Value
+spider_init_sql_alloc_size 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='isa "1"';
+Warnings:
+Warning 1287 The table parameter 'isa' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='init_sql_alloc_size "1"';
+Warnings:
+Warning 1287 The table parameter 'init_sql_alloc_size' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+# MDEV-28829 Deprecate spider_semi_table_lock and spider_semi_table_lock_connection
+SET spider_semi_table_lock = 1;
+Warnings:
+Warning 1287 '@@spider_semi_table_lock' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_semi_table_lock";
+Variable_name Value
+spider_semi_table_lock 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='stl "1"';
+Warnings:
+Warning 1287 The table parameter 'stl' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='semi_table_lock "1"';
+Warnings:
+Warning 1287 The table parameter 'semi_table_lock' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+SET spider_semi_table_lock_connection = 0;
+Warnings:
+Warning 1287 '@@spider_semi_table_lock_connection' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_semi_table_lock_connection";
+Variable_name Value
+spider_semi_table_lock_connection 0
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='stc "0"';
+Warnings:
+Warning 1287 The table parameter 'stc' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='semi_table_lock_connection "0"';
+Warnings:
+Warning 1287 The table parameter 'semi_table_lock_connection' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+# MDEV-28795 Deprecate spider_bka_table_name_type
+SET spider_bka_table_name_type = 1;
+Warnings:
+Warning 1287 '@@spider_bka_table_name_type' is deprecated and will be removed in a future release
+SHOW VARIABLES LIKE "spider_bka_table_name_type";
+Variable_name Value
+spider_bka_table_name_type 1
+CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='btt "1"';
+Warnings:
+Warning 1287 The table parameter 'btt' is deprecated and will be removed in a future release
+CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='bka_table_name_type "1"';
+Warnings:
+Warning 1287 The table parameter 'bka_table_name_type' is deprecated and will be removed in a future release
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+DROP DATABASE auto_test_local;
+for master_1
+for child2
+child2_1
+child2_2
+child2_3
+for child3
+child3_1
+child3_2
+child3_3
diff --git a/storage/spider/mysql-test/spider/t/error_row_number.test b/storage/spider/mysql-test/spider/t/error_row_number.test
new file mode 100644
index 00000000000..408e739656a
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/error_row_number.test
@@ -0,0 +1,37 @@
+--echo #
+--echo # MDEV-26693 ROW_NUMBER is wrong upon INSERT or UPDATE on Spider table
+--echo #
+
+--disable_query_log
+--disable_result_log
+--source test_init.inc
+--enable_result_log
+--enable_query_log
+
+--connection child2_1
+create database auto_test_remote;
+use auto_test_remote;
+create table ta_r (id int primary key);
+
+--connection master_1
+evalp create table spd (id int primary key) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1;
+
+--error ER_DUP_ENTRY
+insert into spd values (1),(2),(1);
+get diagnostics condition 1 @n = row_number;
+select @n;
+
+delete from spd;
+insert into spd values (1),(2),(3),(13);
+--error ER_DUP_ENTRY
+update spd set id = id + 10;
+get diagnostics condition 1 @n = row_number;
+select @n;
+
+drop table spd;
+--connection child2_1
+drop database auto_test_remote;
+--connection master_1
+--disable_query_log
+--disable_result_log
+--source test_deinit.inc
diff --git a/storage/spider/mysql-test/spider/t/spider_fixes.test b/storage/spider/mysql-test/spider/t/spider_fixes.test
index 56e143060e6..47bc225d614 100644
--- a/storage/spider/mysql-test/spider/t/spider_fixes.test
+++ b/storage/spider/mysql-test/spider/t/spider_fixes.test
@@ -1172,6 +1172,8 @@ let $MASTER_1_ENGINE_IS_SPIDER=
if ($MASTER_1_ENGINE_IS_SPIDER)
{
--connection master_1
+ SET @original_spider_read_only_mode = @@SESSION.spider_read_only_mode;
+ SET SESSION spider_read_only_mode = -1;
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
@@ -1197,6 +1199,7 @@ if ($MASTER_1_ENGINE_IS_SPIDER)
DELETE FROM t1;
--error 12518
TRUNCATE t1;
+ SET SESSION spider_read_only_mode = @original_spider_read_only_mode;
}
if (!$MASTER_1_ENGINE_IS_SPIDER)
{
@@ -1210,6 +1213,10 @@ if (!$MASTER_1_ENGINE_IS_SPIDER)
if ($MASTER_1_ENGINE_IS_SPIDER)
{
--connection master_1
+ SET @original_spider_error_read_mode = @@SESSION.spider_error_read_mode;
+ SET @original_spider_error_write_mode = @@SESSION.spider_error_write_mode;
+ SET SESSION spider_error_read_mode = -1;
+ SET SESSION spider_error_write_mode = -1;
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
@@ -1227,6 +1234,8 @@ if ($MASTER_1_ENGINE_IS_SPIDER)
INSERT INTO t1 (id) VALUES (1);
DELETE FROM t1;
TRUNCATE t1;
+ SET SESSION spider_error_read_mode = @original_spider_error_read_mode;
+ SET SESSION spider_error_write_mode = @original_spider_error_write_mode;
}
if (!$MASTER_1_ENGINE_IS_SPIDER)
{
diff --git a/storage/spider/mysql-test/spider/t/variable_deprecation.test b/storage/spider/mysql-test/spider/t/variable_deprecation.test
new file mode 100644
index 00000000000..1521a60b7cb
--- /dev/null
+++ b/storage/spider/mysql-test/spider/t/variable_deprecation.test
@@ -0,0 +1,161 @@
+--echo #
+--echo # MDEV-27228 Deprecate Spider plugin variables that result in excessive tweak
+--echo #
+
+--disable_query_log
+--disable_result_log
+--source test_init.inc
+--enable_result_log
+--enable_query_log
+
+--connection master_1
+CREATE DATABASE auto_test_local;
+USE auto_test_local;
+
+--echo # MDEV-27923 Deprecate spider_use_handler
+SET spider_use_handler = 3;
+SHOW VARIABLES LIKE "spider_use_handler";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='uhd "3"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='use_handler "3"';
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+--echo # MDEV-28297 Deprecate spider_internal_offset
+SET spider_internal_offset = 1;
+SHOW VARIABLES LIKE "spider_internal_offset";
+
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='ios "1"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='internal_offset "1"';
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+--echo # MDEV-28005 Deprecate Spider plugin variables regarding UDFs
+SET GLOBAL spider_udf_ds_bulk_insert_rows = 1;
+SHOW VARIABLES LIKE "spider_udf_ds_bulk_insert_rows";
+
+SET spider_udf_ds_table_loop_mode = 1;
+SHOW VARIABLES LIKE "spider_udf_ds_table_loop_mode";
+
+SET spider_udf_ds_use_real_table = 1;
+SHOW VARIABLES LIKE "spider_udf_ds_use_real_table";
+
+SET GLOBAL spider_udf_ct_bulk_insert_interval = 1;
+SHOW VARIABLES LIKE "spider_udf_ct_bulk_insert_interval";
+
+SET GLOBAL spider_udf_ct_bulk_insert_rows = 1;
+SHOW VARIABLES LIKE "spider_udf_ct_bulk_insert_rows";
+
+--echo # MDEV-27981 Deprecate spider_internal_limit
+SET spider_internal_limit = 1;
+SHOW VARIABLES LIKE "spider_internal_limit";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='ilm "1"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='internal_limit "1"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+--echo # MDEV-28244 Deprecate spider_xa_register_mode
+SET spider_xa_register_mode = 0;
+SHOW VARIABLES LIKE "spider_xa_register_mode";
+
+--echo # MDEV-28007 Deprecate Spider plugin variables regarding statistics persistence
+SET GLOBAL spider_store_last_sts = 0;
+SHOW VARIABLES LIKE "spider_store_last_sts";
+
+SET GLOBAL spider_store_last_crd = 0;
+SHOW VARIABLES LIKE "spider_store_last_crd";
+
+SET GLOBAL spider_load_sts_at_startup = 0;
+SHOW VARIABLES LIKE "spider_load_sts_at_startup";
+
+SET GLOBAL spider_load_crd_at_startup = 0;
+SHOW VARIABLES LIKE "spider_load_crd_at_startup";
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+--echo # MDEV-28008 Deprecate spider_crd_mode and spider_sts_mode
+SET spider_crd_mode = 1;
+SHOW VARIABLES LIKE "spider_crd_mode";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='cmd "3"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='crd_mode "3"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+SET spider_sts_mode = 1;
+SHOW VARIABLES LIKE "spider_sts_mode";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='smd "3"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='sts_mode "3"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+--echo # MDEV-28010 Deprecate spider_crd_type and spider_crd_weight
+SET spider_crd_type = 1;
+SHOW VARIABLES LIKE "spider_crd_type";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='ctp "1"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='crd_type "1"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+SET spider_crd_weight = 1;
+SHOW VARIABLES LIKE "spider_crd_weight";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='cwg "1"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='crd_weight "1"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+--echo # MDEV-28560 Deprecate spider_buffer_size
+SET spider_buffer_size = 1;
+SHOW VARIABLES LIKE "spider_buffer_size";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='bfz "1"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='buffer_size "1"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+--echo # MDEV-27926 Deprecate spider_init_sql_alloc_size
+SET spider_init_sql_alloc_size = 1;
+SHOW VARIABLES LIKE "spider_init_sql_alloc_size";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='isa "1"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='init_sql_alloc_size "1"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+--echo # MDEV-28829 Deprecate spider_semi_table_lock and spider_semi_table_lock_connection
+SET spider_semi_table_lock = 1;
+SHOW VARIABLES LIKE "spider_semi_table_lock";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='stl "1"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='semi_table_lock "1"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+SET spider_semi_table_lock_connection = 0;
+SHOW VARIABLES LIKE "spider_semi_table_lock_connection";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='stc "0"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='semi_table_lock_connection "0"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+--echo # MDEV-28795 Deprecate spider_bka_table_name_type
+SET spider_bka_table_name_type = 1;
+SHOW VARIABLES LIKE "spider_bka_table_name_type";
+eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='btt "1"';
+eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='bka_table_name_type "1"';
+
+DROP TABLE tbl_a;
+DROP TABLE tbl_b;
+
+DROP DATABASE auto_test_local;
+
+--disable_query_log
+--disable_result_log
+--source test_deinit.inc
+--enable_result_log
+--enable_query_log
diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc
index fc6d0232855..5495f40cd86 100644
--- a/storage/spider/spd_conn.cc
+++ b/storage/spider/spd_conn.cc
@@ -108,20 +108,6 @@ const char *spider_open_connections_func_name;
const char *spider_open_connections_file_name;
ulong spider_open_connections_line_no;
pthread_mutex_t spider_conn_mutex;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-HASH spider_hs_r_conn_hash;
-uint spider_hs_r_conn_hash_id;
-const char *spider_hs_r_conn_hash_func_name;
-const char *spider_hs_r_conn_hash_file_name;
-ulong spider_hs_r_conn_hash_line_no;
-pthread_mutex_t spider_hs_r_conn_mutex;
-HASH spider_hs_w_conn_hash;
-uint spider_hs_w_conn_hash_id;
-const char *spider_hs_w_conn_hash_func_name;
-const char *spider_hs_w_conn_hash_file_name;
-ulong spider_hs_w_conn_hash_line_no;
-pthread_mutex_t spider_hs_w_conn_mutex;
-#endif
/* for spider_open_connections and trx_conn_hash */
uchar *spider_conn_get_key(
@@ -320,10 +306,6 @@ void spider_free_conn_from_trx(
spider_conn_clear_queue(conn);
conn->use_for_active_standby = FALSE;
conn->error_mode = 1;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
if (
trx_free ||
(
@@ -422,134 +404,6 @@ void spider_free_conn_from_trx(
}
} else if (roop_count)
(*roop_count)++;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (conn->conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- spider_db_hs_request_buf_reset(conn);
- if (
- trx_free ||
- (
- (
- conn->server_lost ||
- spider_param_hs_r_conn_recycle_mode(trx->thd) != 2
- ) &&
- !conn->opened_handlers
- )
- ) {
- conn->thd = NULL;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&trx->trx_hs_r_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn);
-#else
- my_hash_delete(&trx->trx_hs_r_conn_hash, (uchar*) conn);
-#endif
-
- DBUG_ASSERT(conn->opened_handlers ==
- conn->db_conn->get_opened_handler_count());
- if (conn->db_conn->get_opened_handler_count())
- {
- conn->db_conn->reset_opened_handler();
- }
-
- if (
- !trx_free &&
- !conn->server_lost &&
- !conn->queued_connect &&
- spider_param_hs_r_conn_recycle_mode(trx->thd) == 1
- ) {
- /* conn_recycle_mode == 1 */
- *conn->conn_key = '0';
- pthread_mutex_lock(&spider_hs_r_conn_mutex);
- uint old_elements = spider_hs_r_conn_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(&spider_hs_r_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn))
-#else
- if (my_hash_insert(&spider_hs_r_conn_hash, (uchar*) conn))
-#endif
- {
- pthread_mutex_unlock(&spider_hs_r_conn_mutex);
- spider_free_conn(conn);
- } else {
- if (spider_hs_r_conn_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- spider_hs_r_conn_hash,
- (spider_hs_r_conn_hash.array.max_element - old_elements) *
- spider_hs_r_conn_hash.array.size_of_element);
- }
- pthread_mutex_unlock(&spider_hs_r_conn_mutex);
- }
- } else {
- /* conn_recycle_mode == 0 */
- spider_free_conn(conn);
- }
- } else if (roop_count)
- (*roop_count)++;
- } else {
- spider_db_hs_request_buf_reset(conn);
- if (
- trx_free ||
- (
- (
- conn->server_lost ||
- spider_param_hs_w_conn_recycle_mode(trx->thd) != 2
- ) &&
- !conn->opened_handlers
- )
- ) {
- conn->thd = NULL;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&trx->trx_hs_w_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn);
-#else
- my_hash_delete(&trx->trx_hs_w_conn_hash, (uchar*) conn);
-#endif
-
- DBUG_ASSERT(conn->opened_handlers ==
- conn->db_conn->get_opened_handler_count());
- if (conn->db_conn->get_opened_handler_count())
- {
- conn->db_conn->reset_opened_handler();
- }
-
- if (
- !trx_free &&
- !conn->server_lost &&
- !conn->queued_connect &&
- spider_param_hs_w_conn_recycle_mode(trx->thd) == 1
- ) {
- /* conn_recycle_mode == 1 */
- *conn->conn_key = '0';
- pthread_mutex_lock(&spider_hs_w_conn_mutex);
- uint old_elements = spider_hs_w_conn_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(&spider_hs_w_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn))
-#else
- if (my_hash_insert(&spider_hs_w_conn_hash, (uchar*) conn))
-#endif
- {
- pthread_mutex_unlock(&spider_hs_w_conn_mutex);
- spider_free_conn(conn);
- } else {
- if (spider_hs_w_conn_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- spider_hs_w_conn_hash,
- (spider_hs_w_conn_hash.array.max_element - old_elements) *
- spider_hs_w_conn_hash.array.size_of_element);
- }
- pthread_mutex_unlock(&spider_hs_w_conn_mutex);
- }
- } else {
- /* conn_recycle_mode == 0 */
- spider_free_conn(conn);
- }
- } else if (roop_count)
- (*roop_count)++;
- }
-#endif
DBUG_VOID_RETURN;
}
@@ -577,10 +431,6 @@ SPIDER_CONN *spider_create_conn(
UTC = my_tz_find(current_thd, &tz_00_name);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
bool tables_on_different_db_are_joinable;
if (share->sql_dbton_ids[link_idx] != SPIDER_DBTON_SIZE)
{
@@ -759,113 +609,13 @@ SPIDER_CONN *spider_create_conn(
conn->tgt_port = share->tgt_ports[link_idx];
conn->tgt_ssl_vsc = share->tgt_ssl_vscs[link_idx];
conn->dbton_id = share->sql_dbton_ids[link_idx];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (conn_kind == SPIDER_CONN_KIND_HS_READ) {
- if (!(conn = (SPIDER_CONN *)
- spider_bulk_malloc(spider_current_trx, 19, MYF(MY_WME | MY_ZEROFILL),
- &conn, (uint) (sizeof(*conn)),
- &tmp_name, (uint) (share->hs_read_conn_keys_lengths[link_idx] + 1),
- &tmp_host, (uint) (share->tgt_hosts_lengths[link_idx] + 1),
- &tmp_socket, (uint) (share->hs_read_socks_lengths[link_idx] + 1),
- &tmp_wrapper,
- (uint) (share->tgt_wrappers_lengths[link_idx] + 1),
- &need_mon, (uint) (sizeof(int)),
- NullS))
- ) {
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error_alloc_conn;
- }
-
- conn->default_database.init_calc_mem(76);
- conn->conn_key_length = share->hs_read_conn_keys_lengths[link_idx];
- conn->conn_key = tmp_name;
- memcpy(conn->conn_key, share->hs_read_conn_keys[link_idx],
- share->hs_read_conn_keys_lengths[link_idx]);
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- conn->conn_key_hash_value = share->hs_read_conn_keys_hash_value[link_idx];
-#endif
- conn->tgt_host_length = share->tgt_hosts_lengths[link_idx];
- conn->tgt_host = tmp_host;
- memcpy(conn->tgt_host, share->tgt_hosts[link_idx],
- share->tgt_hosts_lengths[link_idx]);
- conn->hs_sock_length = share->hs_read_socks_lengths[link_idx];
- if (conn->hs_sock_length)
- {
- conn->hs_sock = tmp_socket;
- memcpy(conn->hs_sock, share->hs_read_socks[link_idx],
- share->hs_read_socks_lengths[link_idx]);
- } else
- conn->hs_sock = NULL;
- conn->tgt_wrapper_length = share->tgt_wrappers_lengths[link_idx];
- conn->tgt_wrapper = tmp_wrapper;
- memcpy(conn->tgt_wrapper, share->tgt_wrappers[link_idx],
- share->tgt_wrappers_lengths[link_idx]);
- conn->hs_port = share->hs_read_ports[link_idx];
- conn->dbton_id = share->hs_dbton_ids[link_idx];
- } else {
- if (!(conn = (SPIDER_CONN *)
- spider_bulk_malloc(spider_current_trx, 20, MYF(MY_WME | MY_ZEROFILL),
- &conn, (uint) (sizeof(*conn)),
- &tmp_name, (uint) (share->hs_write_conn_keys_lengths[link_idx] + 1),
- &tmp_host, (uint) (share->tgt_hosts_lengths[link_idx] + 1),
- &tmp_socket, (uint) (share->hs_write_socks_lengths[link_idx] + 1),
- &tmp_wrapper,
- (uint) (share->tgt_wrappers_lengths[link_idx] + 1),
- &need_mon, (uint) (sizeof(int)),
- NullS))
- ) {
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error_alloc_conn;
- }
-
- conn->default_database.init_calc_mem(77);
- conn->conn_key_length = share->hs_write_conn_keys_lengths[link_idx];
- conn->conn_key = tmp_name;
- memcpy(conn->conn_key, share->hs_write_conn_keys[link_idx],
- share->hs_write_conn_keys_lengths[link_idx]);
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- conn->conn_key_hash_value = share->hs_write_conn_keys_hash_value[link_idx];
-#endif
- conn->tgt_host_length = share->tgt_hosts_lengths[link_idx];
- conn->tgt_host = tmp_host;
- memcpy(conn->tgt_host, share->tgt_hosts[link_idx],
- share->tgt_hosts_lengths[link_idx]);
- conn->hs_sock_length = share->hs_write_socks_lengths[link_idx];
- if (conn->hs_sock_length)
- {
- conn->hs_sock = tmp_socket;
- memcpy(conn->hs_sock, share->hs_write_socks[link_idx],
- share->hs_write_socks_lengths[link_idx]);
- } else
- conn->hs_sock = NULL;
- conn->tgt_wrapper_length = share->tgt_wrappers_lengths[link_idx];
- conn->tgt_wrapper = tmp_wrapper;
- memcpy(conn->tgt_wrapper, share->tgt_wrappers[link_idx],
- share->tgt_wrappers_lengths[link_idx]);
- conn->hs_port = share->hs_write_ports[link_idx];
- conn->dbton_id = share->hs_dbton_ids[link_idx];
- }
-#endif
if (conn->dbton_id == SPIDER_DBTON_SIZE)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
my_printf_error(
ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM,
ER_SPIDER_SQL_WRAPPER_IS_INVALID_STR,
MYF(0), conn->tgt_wrapper);
*error_num = ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- my_printf_error(
- ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM,
- ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR,
- MYF(0), conn->tgt_wrapper);
- *error_num = ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM;
- }
-#endif
goto error_invalid_wrapper;
}
if (!(conn->db_conn = spider_dbton[conn->dbton_id].create_db_conn(conn)))
@@ -993,33 +743,11 @@ SPIDER_CONN *spider_get_conn(
DBUG_PRINT("info",("spider link_idx=%u", link_idx));
DBUG_PRINT("info",("spider base_link_idx=%u", base_link_idx));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
#ifdef DBUG_TRACE
spider_print_keys(conn_key, share->conn_keys_lengths[link_idx]);
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- conn_key = share->hs_read_conn_keys[link_idx];
-#ifdef DBUG_TRACE
- spider_print_keys(conn_key, share->hs_read_conn_keys_lengths[link_idx]);
-#endif
- } else {
- conn_key = share->hs_write_conn_keys[link_idx];
-#ifdef DBUG_TRACE
- spider_print_keys(conn_key, share->hs_write_conn_keys_lengths[link_idx]);
-#endif
- }
-#endif
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (conn_kind == SPIDER_CONN_KIND_MYSQL &&
- (
-#endif
(another &&
!(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
&trx->trx_another_conn_hash,
@@ -1030,79 +758,25 @@ SPIDER_CONN *spider_get_conn(
&trx->trx_conn_hash,
share->conn_keys_hash_value[link_idx],
(uchar*) conn_key, share->conn_keys_lengths[link_idx])))
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- )
- ) ||
- (conn_kind == SPIDER_CONN_KIND_HS_READ &&
- !(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
- &trx->trx_hs_r_conn_hash,
- share->hs_read_conn_keys_hash_value[link_idx],
- (uchar*) conn_key, share->hs_read_conn_keys_lengths[link_idx]))
- ) ||
- (conn_kind == SPIDER_CONN_KIND_HS_WRITE &&
- !(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
- &trx->trx_hs_w_conn_hash,
- share->hs_write_conn_keys_hash_value[link_idx],
- (uchar*) conn_key, share->hs_write_conn_keys_lengths[link_idx]))
- )
-#endif
)
#else
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (conn_kind == SPIDER_CONN_KIND_MYSQL &&
- (
-#endif
(another &&
!(conn = (SPIDER_CONN*) my_hash_search(&trx->trx_another_conn_hash,
(uchar*) conn_key, share->conn_keys_lengths[link_idx]))) ||
(!another &&
!(conn = (SPIDER_CONN*) my_hash_search(&trx->trx_conn_hash,
(uchar*) conn_key, share->conn_keys_lengths[link_idx])))
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- )
- ) ||
- (conn_kind == SPIDER_CONN_KIND_HS_READ &&
- !(conn = (SPIDER_CONN*) my_hash_search(&trx->trx_hs_r_conn_hash,
- (uchar*) conn_key, share->hs_read_conn_keys_lengths[link_idx]))
- ) ||
- (conn_kind == SPIDER_CONN_KIND_HS_WRITE &&
- !(conn = (SPIDER_CONN*) my_hash_search(&trx->trx_hs_w_conn_hash,
- (uchar*) conn_key, share->hs_write_conn_keys_lengths[link_idx]))
- )
-#endif
)
#endif
{
if (
!trx->thd ||
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (conn_kind == SPIDER_CONN_KIND_MYSQL &&
-#endif
(
(spider_param_conn_recycle_mode(trx->thd) & 1) ||
spider_param_conn_recycle_strict(trx->thd)
)
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ) ||
- (conn_kind == SPIDER_CONN_KIND_HS_READ &&
- (
- (spider_param_hs_r_conn_recycle_mode(trx->thd) & 1) ||
- spider_param_hs_r_conn_recycle_strict(trx->thd)
- )
- ) ||
- (conn_kind == SPIDER_CONN_KIND_HS_WRITE &&
- (
- (spider_param_hs_w_conn_recycle_mode(trx->thd) & 1) ||
- spider_param_hs_w_conn_recycle_strict(trx->thd)
- )
- )
-#endif
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
pthread_mutex_lock(&spider_conn_mutex);
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
if (!(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
@@ -1154,94 +828,6 @@ SPIDER_CONN *spider_get_conn(
conn->use_for_active_standby = TRUE;
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- pthread_mutex_lock(&spider_hs_r_conn_mutex);
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- if (!(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
- &spider_hs_r_conn_hash,
- share->hs_read_conn_keys_hash_value[link_idx],
- (uchar*) share->hs_read_conn_keys[link_idx],
- share->hs_read_conn_keys_lengths[link_idx])))
-#else
- if (!(conn = (SPIDER_CONN*) my_hash_search(&spider_hs_r_conn_hash,
- (uchar*) share->hs_read_conn_keys[link_idx],
- share->hs_read_conn_keys_lengths[link_idx])))
-#endif
- {
- pthread_mutex_unlock(&spider_hs_r_conn_mutex);
- DBUG_PRINT("info",("spider create new hs r conn"));
- if (!(conn = spider_create_conn(share, spider, link_idx,
- base_link_idx, conn_kind, error_num)))
- goto error;
- *conn->conn_key = *conn_key;
- if (spider)
- {
- spider->hs_r_conns[base_link_idx] = conn;
- if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
- conn->use_for_active_standby = TRUE;
- }
- } else {
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&spider_hs_r_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn);
-#else
- my_hash_delete(&spider_hs_r_conn_hash, (uchar*) conn);
-#endif
- pthread_mutex_unlock(&spider_hs_r_conn_mutex);
- DBUG_PRINT("info",("spider get global hs r conn"));
- if (spider)
- {
- spider->hs_r_conns[base_link_idx] = conn;
- if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
- conn->use_for_active_standby = TRUE;
- }
- }
- } else {
- pthread_mutex_lock(&spider_hs_w_conn_mutex);
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- if (!(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
- &spider_hs_w_conn_hash,
- share->hs_write_conn_keys_hash_value[link_idx],
- (uchar*) share->hs_write_conn_keys[link_idx],
- share->hs_write_conn_keys_lengths[link_idx])))
-#else
- if (!(conn = (SPIDER_CONN*) my_hash_search(&spider_hs_w_conn_hash,
- (uchar*) share->hs_write_conn_keys[link_idx],
- share->hs_write_conn_keys_lengths[link_idx])))
-#endif
- {
- pthread_mutex_unlock(&spider_hs_w_conn_mutex);
- DBUG_PRINT("info",("spider create new hs w conn"));
- if (!(conn = spider_create_conn(share, spider, link_idx,
- base_link_idx, conn_kind, error_num)))
- goto error;
- *conn->conn_key = *conn_key;
- if (spider)
- {
- spider->hs_w_conns[base_link_idx] = conn;
- if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
- conn->use_for_active_standby = TRUE;
- }
- } else {
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&spider_hs_w_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn);
-#else
- my_hash_delete(&spider_hs_w_conn_hash, (uchar*) conn);
-#endif
- pthread_mutex_unlock(&spider_hs_w_conn_mutex);
- DBUG_PRINT("info",("spider get global hs w conn"));
- if (spider)
- {
- spider->hs_w_conns[base_link_idx] = conn;
- if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
- conn->use_for_active_standby = TRUE;
- }
- }
- }
-#endif
} else {
DBUG_PRINT("info",("spider create new conn"));
/* conn_recycle_strict = 0 and conn_recycle_mode = 0 or 2 */
@@ -1251,19 +837,7 @@ SPIDER_CONN *spider_get_conn(
*conn->conn_key = *conn_key;
if (spider)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
spider->conns[base_link_idx] = conn;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- spider->hs_r_conns[base_link_idx] = conn;
- } else {
- spider->hs_w_conns[base_link_idx] = conn;
- }
-#endif
if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
conn->use_for_active_standby = TRUE;
}
@@ -1271,10 +845,6 @@ SPIDER_CONN *spider_get_conn(
conn->thd = trx->thd;
conn->priority = share->priority;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
if (another)
{
uint old_elements = trx->trx_another_conn_hash.array.max_element;
@@ -1319,67 +889,9 @@ SPIDER_CONN *spider_get_conn(
trx->trx_conn_hash.array.size_of_element);
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- uint old_elements = trx->trx_hs_r_conn_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(&trx->trx_hs_r_conn_hash,
- share->hs_read_conn_keys_hash_value[link_idx],
- (uchar*) conn))
-#else
- if (my_hash_insert(&trx->trx_hs_r_conn_hash, (uchar*) conn))
-#endif
- {
- spider_free_conn(conn);
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error;
- }
- if (trx->trx_hs_r_conn_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- trx->trx_hs_r_conn_hash,
- (trx->trx_hs_r_conn_hash.array.max_element - old_elements) *
- trx->trx_hs_r_conn_hash.array.size_of_element);
- }
- } else {
- uint old_elements = trx->trx_hs_w_conn_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(&trx->trx_hs_w_conn_hash,
- share->hs_write_conn_keys_hash_value[link_idx],
- (uchar*) conn))
-#else
- if (my_hash_insert(&trx->trx_hs_w_conn_hash, (uchar*) conn))
-#endif
- {
- spider_free_conn(conn);
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error;
- }
- if (trx->trx_hs_w_conn_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- trx->trx_hs_w_conn_hash,
- (trx->trx_hs_w_conn_hash.array.max_element - old_elements) *
- trx->trx_hs_w_conn_hash.array.size_of_element);
- }
- }
-#endif
} else if (spider)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
spider->conns[base_link_idx] = conn;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- spider->hs_r_conns[base_link_idx] = conn;
- } else {
- spider->hs_w_conns[base_link_idx] = conn;
- }
-#endif
if (spider_bit_is_set(spider->conn_can_fo, base_link_idx))
conn->use_for_active_standby = TRUE;
}
@@ -1396,19 +908,12 @@ SPIDER_CONN *spider_get_conn(
conn->queued_ping = FALSE;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
if (unlikely(spider && spider->wide_handler->top_share &&
(*error_num = spider_conn_queue_loop_check(
conn, spider, base_link_idx))))
{
goto error;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_RETURN(conn);
@@ -2416,14 +1921,6 @@ int spider_set_conn_bg_param(
) {
if ((error_num = spider_create_conn_thread(spider->conns[roop_count])))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = spider_create_conn_thread(
- spider->hs_r_conns[roop_count])))
- DBUG_RETURN(error_num);
- if ((error_num = spider_create_conn_thread(
- spider->hs_w_conns[roop_count])))
- DBUG_RETURN(error_num);
-#endif
}
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
}
@@ -2774,19 +2271,9 @@ int spider_bg_conn_search(
bool with_lock = FALSE;
DBUG_ENTER("spider_bg_conn_search");
DBUG_PRINT("info",("spider spider=%p", spider));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = spider->conns[link_idx];
with_lock = (spider_conn_lock_mode(spider) != SPIDER_LOCK_MODE_NO_LOCK);
first_conn = spider->conns[first_link_idx];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_HS_READ)
- conn = spider->hs_r_conns[link_idx];
- else
- conn = spider->hs_w_conns[link_idx];
-#endif
if (first)
{
if (spider->use_pre_call)
@@ -3245,21 +2732,12 @@ void *spider_bg_conn_action(
!result_list->bgs_current->result
) {
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
if (spider->sql_kind[conn->link_idx] == SPIDER_SQL_KIND_SQL)
{
sql_type = SPIDER_SQL_TYPE_SELECT_SQL | SPIDER_SQL_TYPE_TMP_SQL;
} else {
sql_type = SPIDER_SQL_TYPE_HANDLER;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- sql_type = SPIDER_SQL_TYPE_SELECT_HS;
- }
-#endif
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_handler->need_lock_before_set_sql_for_exec(sql_type))
{
@@ -3609,27 +3087,12 @@ void *spider_bg_sts_action(
uint *conn_link_idx;
uchar *conn_can_fo;
char **conn_keys;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char **hs_r_conn_keys;
- char **hs_w_conn_keys;
-#endif
spider_db_handler **dbton_hdl;
THD *thd;
my_thread_init();
DBUG_ENTER("spider_bg_sts_action");
/* init start */
char *ptr;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ptr = (char *) my_alloca(
- (sizeof(int) * share->link_count) +
- (sizeof(SPIDER_CONN *) * share->link_count) +
- (sizeof(uint) * share->link_count) +
- (sizeof(uchar) * share->link_bitmap_size) +
- (sizeof(char *) * share->link_count) +
- (sizeof(char *) * share->link_count) +
- (sizeof(char *) * share->link_count) +
- (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE));
-#else
ptr = (char *) my_alloca(
(sizeof(int) * share->link_count) +
(sizeof(SPIDER_CONN *) * share->link_count) +
@@ -3637,7 +3100,6 @@ void *spider_bg_sts_action(
(sizeof(uchar) * share->link_bitmap_size) +
(sizeof(char *) * share->link_count) +
(sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE));
-#endif
if (!ptr)
{
pthread_mutex_lock(&share->sts_mutex);
@@ -3658,12 +3120,6 @@ void *spider_bg_sts_action(
ptr += (sizeof(uchar) * share->link_bitmap_size);
conn_keys = (char **) ptr;
ptr += (sizeof(char *) * share->link_count);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- hs_r_conn_keys = (char **) ptr;
- ptr += (sizeof(char *) * share->link_count);
- hs_w_conn_keys = (char **) ptr;
- ptr += (sizeof(char *) * share->link_count);
-#endif
dbton_hdl = (spider_db_handler **) ptr;
pthread_mutex_lock(&share->sts_mutex);
if (!(thd = SPIDER_new_THD(next_thread_id())))
@@ -3706,10 +3162,6 @@ void *spider_bg_sts_action(
spider.need_mons = need_mons;
spider.conn_keys_first_ptr = share->conn_keys[0];
spider.conn_keys = conn_keys;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider.hs_r_conn_keys = hs_r_conn_keys;
- spider.hs_w_conn_keys = hs_w_conn_keys;
-#endif
spider.dbton_handler = dbton_hdl;
memset(conns, 0, sizeof(SPIDER_CONN *) * share->link_count);
memset(need_mons, 0, sizeof(int) * share->link_count);
@@ -3977,27 +3429,12 @@ void *spider_bg_crd_action(
uint *conn_link_idx;
uchar *conn_can_fo;
char **conn_keys;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char **hs_r_conn_keys;
- char **hs_w_conn_keys;
-#endif
spider_db_handler **dbton_hdl;
THD *thd;
my_thread_init();
DBUG_ENTER("spider_bg_crd_action");
/* init start */
char *ptr;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ptr = (char *) my_alloca(
- (sizeof(int) * share->link_count) +
- (sizeof(SPIDER_CONN *) * share->link_count) +
- (sizeof(uint) * share->link_count) +
- (sizeof(uchar) * share->link_bitmap_size) +
- (sizeof(char *) * share->link_count) +
- (sizeof(char *) * share->link_count) +
- (sizeof(char *) * share->link_count) +
- (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE));
-#else
ptr = (char *) my_alloca(
(sizeof(int) * share->link_count) +
(sizeof(SPIDER_CONN *) * share->link_count) +
@@ -4005,7 +3442,6 @@ void *spider_bg_crd_action(
(sizeof(uchar) * share->link_bitmap_size) +
(sizeof(char *) * share->link_count) +
(sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE));
-#endif
if (!ptr)
{
pthread_mutex_lock(&share->crd_mutex);
@@ -4026,12 +3462,6 @@ void *spider_bg_crd_action(
ptr += (sizeof(uchar) * share->link_bitmap_size);
conn_keys = (char **) ptr;
ptr += (sizeof(char *) * share->link_count);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- hs_r_conn_keys = (char **) ptr;
- ptr += (sizeof(char *) * share->link_count);
- hs_w_conn_keys = (char **) ptr;
- ptr += (sizeof(char *) * share->link_count);
-#endif
dbton_hdl = (spider_db_handler **) ptr;
pthread_mutex_lock(&share->crd_mutex);
if (!(thd = SPIDER_new_THD(next_thread_id())))
@@ -4078,10 +3508,6 @@ void *spider_bg_crd_action(
spider.need_mons = need_mons;
spider.conn_keys_first_ptr = share->conn_keys[0];
spider.conn_keys = conn_keys;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider.hs_r_conn_keys = hs_r_conn_keys;
- spider.hs_w_conn_keys = hs_w_conn_keys;
-#endif
spider.dbton_handler = dbton_hdl;
memset(conns, 0, sizeof(SPIDER_CONN *) * share->link_count);
memset(need_mons, 0, sizeof(int) * share->link_count);
@@ -4790,51 +4216,14 @@ bool spider_conn_use_handler(
DBUG_PRINT("info",("spider use_handler=%d", use_handler));
DBUG_PRINT("info",("spider spider->conn_kind[link_idx]=%u",
spider->conn_kind[link_idx]));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->conn_kind[link_idx] != SPIDER_CONN_KIND_MYSQL)
- {
- DBUG_PRINT("info",("spider TRUE by HS"));
- spider->sql_kinds |= SPIDER_SQL_KIND_HS;
- spider->sql_kind[link_idx] = SPIDER_SQL_KIND_HS;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (
- spider->do_direct_update &&
- spider_bit_is_set(spider->do_hs_direct_update, link_idx)
- ) {
- DBUG_PRINT("info",("spider using HS direct_update"));
- spider->direct_update_kinds |= SPIDER_SQL_KIND_HS;
- }
-#endif
- DBUG_RETURN(TRUE);
- }
-#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
if (spider->do_direct_update)
{
spider->sql_kinds |= SPIDER_SQL_KIND_SQL;
spider->sql_kind[link_idx] = SPIDER_SQL_KIND_SQL;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider_bit_is_set(spider->do_hs_direct_update, link_idx))
- {
- spider->direct_update_kinds |= SPIDER_SQL_KIND_HS;
- DBUG_PRINT("info",("spider TRUE by using HS direct_update"));
- DBUG_RETURN(TRUE);
- } else {
-#endif
spider->direct_update_kinds |= SPIDER_SQL_KIND_SQL;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
- if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
DBUG_PRINT("info",("spider FALSE by using direct_update"));
DBUG_RETURN(FALSE);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- DBUG_PRINT("info",("spider TRUE by using BOTH"));
- DBUG_RETURN(TRUE);
- }
-#endif
}
#endif
if (spider->use_spatial_index)
@@ -4892,173 +4281,12 @@ bool spider_conn_need_open_handler(
uint idx,
int link_idx
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_CONN *conn;
-#endif
DBUG_ENTER("spider_conn_need_open_handler");
DBUG_PRINT("info",("spider spider=%p", spider));
if (spider->handler_opened(link_idx, spider->conn_kind[link_idx]))
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (
- spider->do_direct_update &&
- spider_bit_is_set(spider->do_hs_direct_update, link_idx)
- ) {
- conn = spider->hs_w_conns[link_idx];
- if (
- !conn->server_lost &&
- conn->hs_pre_age == spider->hs_w_conn_ages[link_idx]
- ) {
- DBUG_PRINT("info",("spider hs_write is already opened"));
- DBUG_RETURN(FALSE);
- }
- } else
-#endif
- if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
DBUG_PRINT("info",("spider HA already opened"));
DBUG_RETURN(FALSE);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_HS_READ)
- {
- DBUG_PRINT("info",("spider r_handler_index[%d]=%d",
- link_idx, spider->r_handler_index[link_idx]));
- DBUG_PRINT("info",("spider idx=%d", idx));
- DBUG_PRINT("info",("spider hs_pushed_ret_fields_num=%zu",
- spider->hs_pushed_ret_fields_num));
- DBUG_PRINT("info",("spider hs_r_ret_fields_num[%d]=%lu",
- link_idx, spider->hs_r_ret_fields_num[link_idx]));
- DBUG_PRINT("info",("spider hs_r_ret_fields[%d]=%p",
- link_idx, spider->hs_r_ret_fields[link_idx]));
-#ifndef DBUG_OFF
- if (
- spider->hs_pushed_ret_fields_num < MAX_FIELDS &&
- spider->hs_r_ret_fields[link_idx] &&
- spider->hs_pushed_ret_fields_num ==
- spider->hs_r_ret_fields_num[link_idx]
- ) {
- int roop_count;
- for (roop_count = 0; roop_count < (int) spider->hs_pushed_ret_fields_num;
- ++roop_count)
- {
- DBUG_PRINT("info",("spider hs_pushed_ret_fields[%d]=%u",
- roop_count, spider->hs_pushed_ret_fields[roop_count]));
- DBUG_PRINT("info",("spider hs_r_ret_fields[%d][%d]=%u",
- link_idx, roop_count,
- spider->hs_r_ret_fields[link_idx][roop_count]));
- }
- }
-#endif
- if (
- spider->r_handler_index[link_idx] == idx
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- && (
- (
- spider->hs_pushed_ret_fields_num == MAX_FIELDS &&
- spider->hs_r_ret_fields_num[link_idx] == MAX_FIELDS
- ) ||
- (
- spider->hs_pushed_ret_fields_num < MAX_FIELDS &&
- spider->hs_r_ret_fields[link_idx] &&
- spider->hs_pushed_ret_fields_num ==
- spider->hs_r_ret_fields_num[link_idx] &&
- !memcmp(spider->hs_pushed_ret_fields,
- spider->hs_r_ret_fields[link_idx],
- sizeof(uint32) * spider->hs_pushed_ret_fields_num)
- )
- )
-#endif
- ) {
- SPIDER_CONN *conn = spider->hs_r_conns[link_idx];
- DBUG_PRINT("info",("spider conn=%p", conn));
- DBUG_PRINT("info",("spider conn->conn_id=%llu", conn->conn_id));
- DBUG_PRINT("info",("spider conn->connection_id=%llu",
- conn->connection_id));
- DBUG_PRINT("info",("spider conn->server_lost=%s",
- conn->server_lost ? "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider conn->hs_pre_age=%llu", conn->hs_pre_age));
- DBUG_PRINT("info",("spider hs_w_conn_ages[%d]=%llu",
- link_idx, spider->hs_w_conn_ages[link_idx]));
- if (
- !conn->server_lost &&
- conn->hs_pre_age == spider->hs_r_conn_ages[link_idx]
- ) {
- DBUG_PRINT("info",("spider hs_r same idx"));
- DBUG_RETURN(FALSE);
- }
- }
- } else if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_HS_WRITE)
- {
- DBUG_PRINT("info",("spider w_handler_index[%d]=%d",
- link_idx, spider->w_handler_index[link_idx]));
- DBUG_PRINT("info",("spider idx=%d", idx));
- DBUG_PRINT("info",("spider hs_pushed_ret_fields_num=%zu",
- spider->hs_pushed_ret_fields_num));
- DBUG_PRINT("info",("spider hs_w_ret_fields_num[%d]=%lu",
- link_idx, spider->hs_w_ret_fields_num[link_idx]));
- DBUG_PRINT("info",("spider hs_w_ret_fields[%d]=%p",
- link_idx, spider->hs_w_ret_fields[link_idx]));
-#ifndef DBUG_OFF
- if (
- spider->hs_pushed_ret_fields_num < MAX_FIELDS &&
- spider->hs_w_ret_fields[link_idx] &&
- spider->hs_pushed_ret_fields_num ==
- spider->hs_w_ret_fields_num[link_idx]
- ) {
- int roop_count;
- for (roop_count = 0; roop_count < (int) spider->hs_pushed_ret_fields_num;
- ++roop_count)
- {
- DBUG_PRINT("info",("spider hs_pushed_ret_fields[%d]=%u",
- roop_count, spider->hs_pushed_ret_fields[roop_count]));
- DBUG_PRINT("info",("spider hs_w_ret_fields[%d][%d]=%u",
- link_idx, roop_count,
- spider->hs_w_ret_fields[link_idx][roop_count]));
- }
- }
-#endif
- if (
- spider->w_handler_index[link_idx] == idx
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- && (
- (
- spider->hs_pushed_ret_fields_num == MAX_FIELDS &&
- spider->hs_w_ret_fields_num[link_idx] == MAX_FIELDS
- ) ||
- (
- spider->hs_pushed_ret_fields_num < MAX_FIELDS &&
- spider->hs_w_ret_fields[link_idx] &&
- spider->hs_pushed_ret_fields_num ==
- spider->hs_w_ret_fields_num[link_idx] &&
- !memcmp(spider->hs_pushed_ret_fields,
- spider->hs_w_ret_fields[link_idx],
- sizeof(uint32) * spider->hs_pushed_ret_fields_num)
- )
- )
-#endif
- ) {
- SPIDER_CONN *conn = spider->hs_w_conns[link_idx];
- DBUG_PRINT("info",("spider conn=%p", conn));
- DBUG_PRINT("info",("spider conn->conn_id=%llu", conn->conn_id));
- DBUG_PRINT("info",("spider conn->connection_id=%llu",
- conn->connection_id));
- DBUG_PRINT("info",("spider conn->server_lost=%s",
- conn->server_lost ? "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider conn->hs_pre_age=%llu", conn->hs_pre_age));
- DBUG_PRINT("info",("spider hs_w_conn_ages[%d]=%llu",
- link_idx, spider->hs_w_conn_ages[link_idx]));
- if (
- !conn->server_lost &&
- conn->hs_pre_age == spider->hs_w_conn_ages[link_idx]
- ) {
- DBUG_PRINT("info",("spider hs_w same idx"));
- DBUG_RETURN(FALSE);
- }
- }
- }
-#endif
}
DBUG_RETURN(TRUE);
}
diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc
index 044a7d6cba9..09bc66f09b4 100644
--- a/storage/spider/spd_db_conn.cc
+++ b/storage/spider/spd_db_conn.cc
@@ -143,36 +143,16 @@ int spider_db_connect(
DBUG_PRINT("info",("spider net_read_timeout=%u", conn->net_read_timeout));
DBUG_PRINT("info",("spider net_write_timeout=%u", conn->net_write_timeout));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
if ((error_num = spider_reset_conn_setted_parameter(conn, thd)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
if (conn->dbton_id == SPIDER_DBTON_SIZE)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
my_printf_error(
ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM,
ER_SPIDER_SQL_WRAPPER_IS_INVALID_STR,
MYF(0), conn->tgt_wrapper);
DBUG_RETURN(ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- my_printf_error(
- ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM,
- ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR,
- MYF(0), conn->tgt_wrapper);
- DBUG_RETURN(ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM);
- }
-#endif
}
if ((error_num = conn->db_conn->connect(
@@ -302,10 +282,6 @@ int spider_db_conn_queue_action(
}
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
if (conn->queued_ping)
{
if ((error_num = spider_db_ping(conn->queued_ping_spider, conn,
@@ -602,13 +578,6 @@ int spider_db_conn_queue_action(
conn->db_conn->fin_loop_check();
}
spider_conn_clear_queue(conn);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (conn->server_lost)
- {
- DBUG_PRINT("info", ("spider no connect queue"));
- DBUG_RETURN(CR_SERVER_GONE_ERROR);
- }
-#endif
DBUG_RETURN(0);
}
@@ -692,10 +661,6 @@ int spider_db_query(
int error_num;
DBUG_ENTER("spider_db_query");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
DBUG_PRINT("info", ("spider conn->db_conn %p", conn->db_conn));
if (
!conn->in_before_query &&
@@ -715,17 +680,6 @@ int spider_db_query(
if ((error_num = conn->db_conn->exec_query(query, length, quick_mode)))
DBUG_RETURN(error_num);
DBUG_RETURN(0);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn->queued_net_timeout)
- {
- if (conn->db_conn->set_net_timeout())
- DBUG_RETURN(ER_SPIDER_HS_NUM);
- conn->queued_net_timeout = FALSE;
- }
- DBUG_RETURN(conn->db_conn->exec_query(NULL, 0, quick_mode));
- }
-#endif
}
int spider_db_errorno(
@@ -735,10 +689,6 @@ int spider_db_errorno(
DBUG_ENTER("spider_db_errorno");
DBUG_ASSERT(conn->need_mon);
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
if (conn->server_lost)
{
*conn->need_mon = ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM;
@@ -838,57 +788,6 @@ int spider_db_errorno(
}
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (conn->db_conn->is_server_gone_error(0))
- {
- my_printf_error(ER_SPIDER_HS_NUM, ER_SPIDER_HS_STR, MYF(0),
- conn->db_conn->get_errno(), conn->db_conn->get_error());
- *conn->need_mon = ER_SPIDER_HS_NUM;
- DBUG_PRINT("info", ("spider conn=%p SERVER_LOST", conn));
- conn->server_lost = TRUE;
- if (!conn->mta_conn_mutex_unlock_later)
- {
- DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- DBUG_RETURN(ER_SPIDER_HS_NUM);
- } else if (conn->db_conn->is_dup_entry_error(0))
- {
- *conn->need_mon = 0;
- if (!conn->mta_conn_mutex_unlock_later)
- {
- DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- DBUG_RETURN(HA_ERR_FOUND_DUPP_KEY);
- }
- my_printf_error(ER_SPIDER_HS_NUM, ER_SPIDER_HS_STR, MYF(0),
- conn->db_conn->get_errno(), conn->db_conn->get_error());
- if (spider_param_log_result_errors() >= 1)
- {
- time_t cur_time = (time_t) time((time_t*) 0);
- struct tm lt;
- struct tm *l_time = localtime_r(&cur_time, &lt);
- fprintf(stderr, "%04d%02d%02d %02d:%02d:%02d [ERROR SPIDER RESULT] "
- "to %ld: %d %s\n",
- l_time->tm_year + 1900, l_time->tm_mon + 1, l_time->tm_mday,
- l_time->tm_hour, l_time->tm_min, l_time->tm_sec,
- (ulong) current_thd->thread_id, conn->db_conn->get_errno(),
- conn->db_conn->get_error());
- }
- *conn->need_mon = ER_SPIDER_HS_NUM;
- if (!conn->mta_conn_mutex_unlock_later)
- {
- DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- DBUG_RETURN(ER_SPIDER_HS_NUM);
- }
-#endif
if (!conn->mta_conn_mutex_unlock_later)
{
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
@@ -915,10 +814,6 @@ int spider_db_set_names_internal(
int *need_mon
) {
DBUG_ENTER("spider_db_set_names_internal");
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
@@ -962,9 +857,6 @@ int spider_db_set_names_internal(
share->tgt_dbs_lengths[all_link_idx] + 1);
conn->default_database.length(share->tgt_dbs_lengths[all_link_idx]);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
DBUG_RETURN(0);
}
@@ -1718,14 +1610,6 @@ int spider_db_append_key_where_internal(
case SPIDER_SQL_TYPE_HANDLER:
sql_kind = SPIDER_SQL_KIND_HANDLER;
break;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- case SPIDER_SQL_TYPE_SELECT_HS:
- case SPIDER_SQL_TYPE_INSERT_HS:
- case SPIDER_SQL_TYPE_UPDATE_HS:
- case SPIDER_SQL_TYPE_DELETE_HS:
- sql_kind = SPIDER_SQL_KIND_HS;
- break;
-#endif
default:
sql_kind = SPIDER_SQL_KIND_SQL;
break;
@@ -1848,6 +1732,7 @@ int spider_db_append_key_where_internal(
key_count++
) {
DBUG_PRINT("info", ("spider tgt_key_part_map=%lu", tgt_key_part_map));
+ bool rev = key_part->key_part_flag & HA_REVERSE_SORT;
store_length = key_part->store_length;
field = key_part->field;
key_name_length = dbton_share->get_column_name_length(field->field_index);
@@ -1946,14 +1831,6 @@ int spider_db_append_key_where_internal(
#endif
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- else {
- if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
- append_column_value(spider, NULL, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-#endif
} else {
DBUG_PRINT("info", ("spider start_key->flag=%d", start_key->flag));
switch (start_key->flag)
@@ -2026,17 +1903,6 @@ int spider_db_append_key_where_internal(
#endif
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- else {
- if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
- append_column_value(spider, NULL, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_HS_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HS_EQUAL_STR, SPIDER_SQL_HS_EQUAL_LEN);
- }
-#endif
break;
case HA_READ_AFTER_KEY:
if (sql_kind == SPIDER_SQL_KIND_SQL)
@@ -2044,11 +1910,11 @@ int spider_db_append_key_where_internal(
const char* op_str;
uint32 op_len;
if (start_key_part_map == 1) {
- op_str = SPIDER_SQL_GT_STR;
- op_len = SPIDER_SQL_GT_LEN;
+ op_str = rev ? SPIDER_SQL_LT_STR : SPIDER_SQL_GT_STR;
+ op_len = rev ? SPIDER_SQL_LT_LEN : SPIDER_SQL_GT_LEN;
} else {
- op_str = SPIDER_SQL_GTEQUAL_STR;
- op_len = SPIDER_SQL_GTEQUAL_LEN;
+ op_str = rev ? SPIDER_SQL_LTEQUAL_STR : SPIDER_SQL_GTEQUAL_STR;
+ op_len = rev ? SPIDER_SQL_LTEQUAL_LEN : SPIDER_SQL_GTEQUAL_LEN;
}
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
@@ -2072,10 +1938,13 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_GT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
- str_part2->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
- if (spider_dbton[dbton_id].db_util->append_column_value(
- spider, str_part2, field, ptr, FALSE,
- share->access_charset))
+ if (rev)
+ str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
+ else
+ str_part2->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part2, field, ptr, false,
+ share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (use_key == start_key)
@@ -2105,17 +1974,6 @@ int spider_db_append_key_where_internal(
#endif
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- else {
- if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
- append_column_value(spider, NULL, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_HS_GT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HS_GT_STR, SPIDER_SQL_HS_GT_LEN);
- }
-#endif
break;
case HA_READ_BEFORE_KEY:
result_list->desc_flg = TRUE;
@@ -2124,11 +1982,11 @@ int spider_db_append_key_where_internal(
const char* op_str;
uint32 op_len;
if (start_key_part_map == 1) {
- op_str = SPIDER_SQL_LT_STR;
- op_len = SPIDER_SQL_LT_LEN;
+ op_str = rev ? SPIDER_SQL_GT_STR : SPIDER_SQL_LT_STR;
+ op_len = rev ? SPIDER_SQL_GT_LEN : SPIDER_SQL_LT_LEN;
} else {
- op_str = SPIDER_SQL_LTEQUAL_STR;
- op_len = SPIDER_SQL_LTEQUAL_LEN;
+ op_str = rev ? SPIDER_SQL_GTEQUAL_STR : SPIDER_SQL_LTEQUAL_STR;
+ op_len = rev ? SPIDER_SQL_GTEQUAL_LEN : SPIDER_SQL_LTEQUAL_LEN;
}
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
@@ -2152,10 +2010,13 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
- str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
- if (spider_dbton[dbton_id].db_util->append_column_value(
- spider, str_part2, field, ptr, FALSE,
- share->access_charset))
+ if (rev)
+ str_part2->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
+ else
+ str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part2, field, ptr, false,
+ share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (use_key == start_key)
@@ -2185,17 +2046,6 @@ int spider_db_append_key_where_internal(
#endif
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- else {
- if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
- append_column_value(spider, NULL, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_HS_LT_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HS_LT_STR, SPIDER_SQL_HS_LT_LEN);
- }
-#endif
break;
#if defined(MARIADB_BASE_VERSION) && MYSQL_VERSION_ID >= 100000
#else
@@ -2213,9 +2063,13 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->append_column_value(
- spider, str, field, ptr, FALSE, share->access_charset))
+ if (rev)
+ str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
+ else
+ str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str, field, ptr, false,
+ share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (!set_order)
{
@@ -2229,11 +2083,13 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
- str_part2->q_append(SPIDER_SQL_LTEQUAL_STR,
- SPIDER_SQL_LTEQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->append_column_value(
- spider, str_part2, field, ptr, false,
- share->access_charset))
+ if (rev)
+ str_part2->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
+ else
+ str_part2->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part2, field, ptr, false,
+ share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (use_key == start_key)
@@ -2243,8 +2099,7 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LTEQUAL_STR,
- SPIDER_SQL_LTEQUAL_LEN);
+ str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr, false,
@@ -2255,8 +2110,7 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LTEQUAL_STR,
- SPIDER_SQL_LTEQUAL_LEN);
+ str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
@@ -2265,18 +2119,6 @@ int spider_db_append_key_where_internal(
#endif
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- else {
- if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
- append_column_value(spider, NULL, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_HS_LTEQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HS_LTEQUAL_STR,
- SPIDER_SQL_HS_LTEQUAL_LEN);
- }
-#endif
break;
case HA_READ_MBR_CONTAIN:
if (str->reserve(SPIDER_SQL_MBR_CONTAIN_LEN))
@@ -2365,9 +2207,13 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->append_column_value(
- spider, str, field, ptr, FALSE, share->access_charset))
+ if (rev)
+ str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
+ else
+ str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str, field, ptr, false,
+ share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (!set_order)
{
@@ -2381,11 +2227,13 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
- str_part2->q_append(SPIDER_SQL_GTEQUAL_STR,
- SPIDER_SQL_GTEQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->append_column_value(
- spider, str_part2, field, ptr, false,
- share->access_charset))
+ if (rev)
+ str_part2->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
+ else
+ str_part2->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part2, field, ptr, false,
+ share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (use_key == start_key)
@@ -2395,8 +2243,7 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_GTEQUAL_STR,
- SPIDER_SQL_GTEQUAL_LEN);
+ str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr, false,
@@ -2407,8 +2254,7 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_GTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_GTEQUAL_STR,
- SPIDER_SQL_GTEQUAL_LEN);
+ str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr, false,
share->access_charset))
@@ -2417,18 +2263,6 @@ int spider_db_append_key_where_internal(
#endif
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- else {
- if (spider_dbton[share->use_hs_dbton_ids[0]].db_util->
- append_column_value(spider, NULL, field, ptr,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (str->reserve(SPIDER_SQL_HS_GTEQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HS_GTEQUAL_STR,
- SPIDER_SQL_HS_GTEQUAL_LEN);
- }
-#endif
break;
}
}
@@ -2456,10 +2290,6 @@ int spider_db_append_key_where_internal(
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (sql_kind != SPIDER_SQL_KIND_HS)
- {
-#endif
if (
(key_eq && use_key == end_key) ||
(!key_eq && end_key_part_map)
@@ -2536,11 +2366,11 @@ int spider_db_append_key_where_internal(
const char* op_str;
uint32 op_len;
if (end_key_part_map == 1) {
- op_str = SPIDER_SQL_LT_STR;
- op_len = SPIDER_SQL_LT_LEN;
+ op_str = rev ? SPIDER_SQL_GT_STR : SPIDER_SQL_LT_STR;
+ op_len = rev ? SPIDER_SQL_GT_LEN : SPIDER_SQL_LT_LEN;
} else {
- op_str = SPIDER_SQL_LTEQUAL_STR;
- op_len = SPIDER_SQL_LTEQUAL_LEN;
+ op_str = rev ? SPIDER_SQL_GTEQUAL_STR : SPIDER_SQL_LTEQUAL_STR;
+ op_len = rev ? SPIDER_SQL_GTEQUAL_LEN : SPIDER_SQL_LTEQUAL_LEN;
}
if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
@@ -2563,10 +2393,13 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
- str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
- if (spider_dbton[dbton_id].db_util->append_column_value(
- spider, str_part2, field, ptr, false,
- share->access_charset))
+ if (rev)
+ str_part2->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN);
+ else
+ str_part2->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN);
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part2, field, ptr, false,
+ share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (use_key == end_key)
@@ -2605,9 +2438,13 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->append_column_value(
- spider, str, field, ptr, FALSE, share->access_charset))
+ if (rev)
+ str->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
+ else
+ str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str, field, ptr, false,
+ share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (!set_order)
{
@@ -2620,11 +2457,13 @@ int spider_db_append_key_where_internal(
SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str_part2, field->field_index);
- str_part2->q_append(SPIDER_SQL_LTEQUAL_STR,
- SPIDER_SQL_LTEQUAL_LEN);
- if (spider_dbton[dbton_id].db_util->append_column_value(
- spider, str_part2, field, ptr, false,
- share->access_charset))
+ if (rev)
+ str_part2->q_append(SPIDER_SQL_GTEQUAL_STR, SPIDER_SQL_GTEQUAL_LEN);
+ else
+ str_part2->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
+ if (spider_dbton[dbton_id].db_util->
+ append_column_value(spider, str_part2, field, ptr, false,
+ share->access_charset))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
if (use_key == end_key)
@@ -2634,8 +2473,7 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LTEQUAL_STR,
- SPIDER_SQL_LTEQUAL_LEN);
+ str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
}
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr, false,
@@ -2646,8 +2484,7 @@ int spider_db_append_key_where_internal(
{
if (str->reserve(SPIDER_SQL_LTEQUAL_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_LTEQUAL_STR,
- SPIDER_SQL_LTEQUAL_LEN);
+ str->q_append(SPIDER_SQL_LTEQUAL_STR, SPIDER_SQL_LTEQUAL_LEN);
if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str_part, field, ptr,
false, share->access_charset))
@@ -2683,9 +2520,6 @@ int spider_db_append_key_where_internal(
}
if (use_both && (!start_key_part_map || !end_key_part_map))
break;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
}
if ((error_num = dbton_hdl->append_where_terminator_part(sql_type,
set_order, key_count)))
@@ -2729,15 +2563,6 @@ int spider_db_append_key_where(
SPIDER_SQL_TYPE_HANDLER)))
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((spider->sql_kinds & SPIDER_SQL_KIND_HS))
- {
- DBUG_PRINT("info",("spider call internal by SPIDER_SQL_KIND_HS"));
- if ((error_num = spider->append_key_where_hs_part(start_key, end_key,
- SPIDER_SQL_TYPE_SELECT_HS)))
- DBUG_RETURN(error_num);
- }
-#endif
DBUG_RETURN(0);
}
@@ -3130,10 +2955,6 @@ int spider_db_fetch_table(
SPIDER_DB_ROW *row;
Field **field;
DBUG_ENTER("spider_db_fetch_table");
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->conn_kind[spider->result_link_idx] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
if (result_list->quick_mode == 0)
{
SPIDER_DB_RESULT *result = current->result;
@@ -3216,21 +3037,7 @@ int spider_db_fetch_table(
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
}
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (!(row = result_list->hs_result->fetch_row_from_result_buffer(
- result_list->hs_result_buf)))
- {
- table->status = STATUS_NOT_FOUND;
- DBUG_RETURN(HA_ERR_END_OF_FILE);
- }
- }
-#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->conn_kind[spider->result_link_idx] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
for (
field = table->field;
*field;
@@ -3258,68 +3065,6 @@ int spider_db_fetch_table(
}
row->next();
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (spider->hs_pushed_ret_fields_num == MAX_FIELDS)
- {
-#endif
- spider_db_handler *dbton_hdl = spider->dbton_handler[row->dbton_id];
- for (
- field = table->field;
- *field;
- field++
- ) {
- if (dbton_hdl->minimum_select_bit_is_set((*field)->field_index))
- {
-#ifndef DBUG_OFF
- my_bitmap_map *tmp_map =
- dbug_tmp_use_all_columns(table, table->write_set);
-#endif
- if ((error_num = spider_db_fetch_row(share, *field, row, ptr_diff)))
- DBUG_RETURN(error_num);
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->write_set, tmp_map);
-#endif
- row->next();
- }
- }
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- } else {
- uint32 *field_idxs = spider->hs_pushed_ret_fields;
- size_t field_idxs_num = spider->hs_pushed_ret_fields_num;
- Field *tf;
- int roop_count;
- if (spider->hs_pushed_lcl_fields_num !=
- result_list->hs_result->num_fields())
- {
- DBUG_PRINT("info", ("spider different field_num %zu %u",
- spider->hs_pushed_lcl_fields_num,
- result_list->hs_result->num_fields()));
- DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM);
- }
- for (roop_count = 0; roop_count < (int) field_idxs_num;
- roop_count++)
- {
- tf = spider->get_top_table_field(field_idxs[roop_count]);
- if ((tf = spider->field_exchange(tf)))
- {
-#ifndef DBUG_OFF
- my_bitmap_map *tmp_map =
- dbug_tmp_use_all_columns(table, table->write_set);
-#endif
- if ((error_num = spider_db_fetch_row(share, tf, row, ptr_diff)))
- DBUG_RETURN(error_num);
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->write_set, tmp_map);
-#endif
- row->next();
- }
- }
- }
-#endif
- }
-#endif
table->status = 0;
DBUG_RETURN(0);
}
@@ -3572,10 +3317,6 @@ void spider_db_free_one_result_for_start_next(
DBUG_ENTER("spider_db_free_one_result_for_start_next");
spider_bg_all_conn_break(spider);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->conn_kind[spider->result_link_idx] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
if (result_list->low_mem_read)
{
if (result)
@@ -3604,24 +3345,6 @@ void spider_db_free_one_result_for_start_next(
result = (SPIDER_RESULT *) result->next;
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (result_list->hs_has_result)
- {
- if (result_list->hs_result)
- {
- result_list->hs_result->free_result();
- delete result_list->hs_result;
- result_list->hs_result = NULL;
- }
- if (result_list->hs_result_buf)
- {
- result_list->hs_result_buf->clear();
- }
- result_list->hs_has_result = FALSE;
- }
- }
-#endif
DBUG_VOID_RETURN;
}
@@ -3730,28 +3453,6 @@ int spider_db_free_result(
delete tmp_pos_row;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (result_list->hs_has_result)
- {
- if (result_list->hs_result)
- {
- result_list->hs_result->free_result();
- delete result_list->hs_result;
- result_list->hs_result = NULL;
- }
- if (result_list->hs_result_buf)
- {
- if (result_list->hs_result_buf->check_size(
- spider_param_hs_result_free_size(trx->thd, share->hs_result_free_size))
- ) {
- trx->hs_result_free_count++;
- }
- result_list->hs_result_buf->clear();
- }
- result_list->hs_has_result = FALSE;
- }
-#endif
-
if (
final ||
spider_param_reset_sql_alloc(trx->thd, share->reset_sql_alloc) == 1
@@ -3940,10 +3641,6 @@ int spider_db_store_result(
SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_RESULT *current;
DBUG_ENTER("spider_db_store_result");
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = spider->conns[link_idx];
DBUG_PRINT("info",("spider conn->connection_id=%llu",
conn->connection_id));
@@ -4427,66 +4124,6 @@ int spider_db_store_result(
DBUG_PRINT("info", ("spider first_position[]=%p", &current->first_position[result_list->current_row_num]));
DBUG_PRINT("info", ("spider row=%p", current->first_position[result_list->current_row_num].row));
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_HS_READ)
- conn = spider->hs_r_conns[link_idx];
- else
- conn = spider->hs_w_conns[link_idx];
- DBUG_PRINT("info",("spider conn=%p", conn));
- DBUG_PRINT("info",("spider conn->connection_id=%llu",
- conn->connection_id));
- DBUG_PRINT("info",("spider spider->connection_ids[%d]=%llu",
- link_idx, spider->connection_ids[link_idx]));
- if (conn->connection_id != spider->connection_ids[link_idx])
- {
- my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
- ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
- if (!conn->mta_conn_mutex_unlock_later)
- {
- DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
- }
- if (spider_bit_is_set(spider->db_request_phase, link_idx))
- {
- spider_clear_bit(spider->db_request_phase, link_idx);
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id;
- request_key.query_id = spider->wide_handler->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[link_idx];
- request_key.next = NULL;
- if (!(result_list->hs_result = conn->db_conn->store_result(
- &result_list->hs_result_buf, &request_key, &error_num)))
- {
- if (!error_num)
- {
- spider_db_errorno(conn);
- DBUG_RETURN(ER_SPIDER_HS_NUM);
- } else {
- if (!conn->mta_conn_mutex_unlock_later)
- {
- DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- }
- DBUG_RETURN(error_num);
- }
- result_list->hs_conn = conn->db_conn;
- result_list->hs_has_result = TRUE;
- if (!conn->mta_conn_mutex_unlock_later)
- {
- DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- }
- }
-#endif
DBUG_RETURN(0);
}
@@ -4500,9 +4137,6 @@ int spider_db_store_result_for_reuse_cursor(
SPIDER_RESULT_LIST *result_list = &spider->result_list;
SPIDER_RESULT *current;
DBUG_ENTER("spider_db_store_result_for_reuse_cursor");
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- DBUG_ASSERT(spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL);
-#endif
conn = spider->conns[link_idx];
DBUG_PRINT("info",("spider conn->connection_id=%llu",
conn->connection_id));
@@ -5032,9 +4666,6 @@ int spider_db_seek_next(
SPIDER_RESULT_LIST *result_list = &spider->result_list;
DBUG_ENTER("spider_db_seek_next");
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider->conn_kind[spider->result_link_idx] == SPIDER_CONN_KIND_MYSQL &&
-#endif
result_list->current_row_num >= result_list->current->record_num
) {
DBUG_PRINT("info",("spider result_list->current_row_num=%lld",
@@ -6551,9 +6182,6 @@ int spider_db_bulk_insert_init(
DBUG_ENTER("spider_db_bulk_insert_init");
spider->sql_kinds = 0;
spider->reset_sql_sql(SPIDER_SQL_TYPE_INSERT_SQL);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider->reset_hs_sql(SPIDER_SQL_TYPE_OTHER_HS);
-#endif
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
spider->conn_link_idx, -1, share->link_count,
@@ -6566,67 +6194,15 @@ int spider_db_bulk_insert_init(
if (spider->conns[roop_count])
spider->conns[roop_count]->ignore_dup_key =
spider->wide_handler->ignore_dup_key;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (
- spider_conn_use_handler(spider, spider->lock_mode, roop_count) &&
- (
- !spider->handler_opened(roop_count, SPIDER_CONN_KIND_HS_WRITE) ||
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- spider->hs_w_ret_fields_num[roop_count] < MAX_FIELDS ||
-#endif
- spider->hs_w_conns[roop_count]->server_lost
- )
- ) {
- if ((error_num = spider_db_open_handler(spider,
- spider->hs_w_conns[roop_count], roop_count)))
- {
- if (
- share->monitoring_kind[roop_count] &&
- spider->need_mons[roop_count]
- ) {
- error_num = spider_ping_table_mon_from_table(
- spider->wide_handler->trx,
- spider->wide_handler->trx->thd,
- share,
- roop_count,
- (uint32) share->monitoring_sid[roop_count],
- share->table_name,
- share->table_name_length,
- spider->conn_link_idx[roop_count],
- NULL,
- 0,
- share->monitoring_kind[roop_count],
- share->monitoring_limit[roop_count],
- share->monitoring_flag[roop_count],
- TRUE
- );
- }
- DBUG_RETURN(error_num);
- }
- spider->set_handler_opened(roop_count);
- }
-#else
spider_conn_use_handler(spider, spider->wide_handler->lock_mode,
roop_count);
-#endif
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
- {
-#endif
if (
(error_num = spider->append_insert_sql_part()) ||
(error_num = spider->append_into_sql_part(
SPIDER_SQL_TYPE_INSERT_SQL))
)
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
- if (spider->sql_kinds & SPIDER_SQL_KIND_HS)
- {
- spider->result_list.hs_upd_rows = 0;
- }
-#endif
DBUG_RETURN(0);
}
@@ -6637,19 +6213,12 @@ int spider_db_bulk_insert(
bool bulk_end
) {
int error_num, first_insert_link_idx = -1;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
-#endif
SPIDER_SHARE *share = spider->share;
THD *thd = spider->wide_handler->trx->thd;
DBUG_ENTER("spider_db_bulk_insert");
if (!bulk_end)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
- {
-#endif
if ((error_num = spider->append_insert_values_sql_part(
SPIDER_SQL_TYPE_INSERT_SQL)))
{
@@ -6657,16 +6226,6 @@ int spider_db_bulk_insert(
spider->set_insert_to_pos_sql(SPIDER_SQL_TYPE_INSERT_SQL);
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
- if (spider->sql_kinds & SPIDER_SQL_KIND_HS)
- {
- if ((error_num = spider->append_insert_values_hs_part(
- SPIDER_SQL_TYPE_INSERT_HS)))
- DBUG_RETURN(error_num);
- result_list->hs_upd_rows++;
- }
-#endif
}
if (spider->is_bulk_insert_exec_period(bulk_end))
@@ -6696,10 +6255,6 @@ int spider_db_bulk_insert(
) {
ulong sql_type;
spider_db_handler *dbton_handler;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->conn_kind[roop_count2] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
sql_type = SPIDER_SQL_TYPE_INSERT_SQL;
conn = spider->conns[roop_count2];
dbton_handler = spider->dbton_handler[conn->dbton_id];
@@ -6726,16 +6281,6 @@ int spider_db_bulk_insert(
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- sql_type = SPIDER_SQL_TYPE_INSERT_HS;
- conn = spider->hs_w_conns[roop_count2];
- dbton_handler = spider->dbton_handler[conn->dbton_id];
- pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
- pthread_mutex_lock(&conn->mta_conn_mutex);
- SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
- }
-#endif
conn->need_mon = &spider->need_mons[roop_count2];
DBUG_ASSERT(!conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later);
@@ -6831,43 +6376,6 @@ int spider_db_bulk_insert(
insert_info =
conn->db_conn->inserted_info(dbton_handler, copy_info);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind != SPIDER_CONN_KIND_MYSQL)
- {
- uint roop_count;
- DBUG_PRINT("info",("spider conn=%p", conn));
- DBUG_PRINT("info",("spider result_list->hs_upd_rows=%llu",
- result_list->hs_upd_rows));
- for (roop_count = 0; roop_count < result_list->hs_upd_rows;
- roop_count++)
- {
- SPIDER_DB_RESULT *result;
- if (spider_bit_is_set(spider->db_request_phase, roop_count2))
- {
- spider_clear_bit(spider->db_request_phase, roop_count2);
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id =
- spider->wide_handler->trx->spider_thread_id;
- request_key.query_id = spider->wide_handler->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[roop_count2];
- request_key.next = NULL;
- if ((result = conn->db_conn->use_result(spider, &request_key,
- &error_num)))
- {
- result->free_result();
- delete result;
- } else {
- if (!error_num)
- {
- error_num = spider_db_errorno(conn);
- }
- DBUG_RETURN(error_num);
- }
- }
- }
-#endif
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (first_insert_link_idx == -1)
@@ -6968,16 +6476,7 @@ int spider_db_bulk_bulk_insert(
spider->conn_link_idx, roop_count2, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->conn_kind[roop_count2] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
conn = spider->conns[roop_count2];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- conn = spider->hs_w_conns[roop_count2];
- }
-#endif
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
@@ -6994,44 +6493,6 @@ int spider_db_bulk_bulk_insert(
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind != SPIDER_CONN_KIND_MYSQL)
- {
- uint roop_count;
- SPIDER_RESULT_LIST *result_list = &spider->result_list;
- DBUG_PRINT("info",("spider conn=%p", conn));
- DBUG_PRINT("info",("spider result_list->hs_upd_rows=%llu",
- result_list->hs_upd_rows));
- for (roop_count = 0; roop_count < result_list->hs_upd_rows;
- roop_count++)
- {
- SPIDER_DB_RESULT *result;
- if (spider_bit_is_set(spider->db_request_phase, roop_count2))
- {
- spider_clear_bit(spider->db_request_phase, roop_count2);
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id =
- spider->wide_handler->trx->spider_thread_id;
- request_key.query_id = spider->wide_handler->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[roop_count2];
- request_key.next = NULL;
- if ((result = conn->db_conn->use_result(spider, &request_key,
- &error_num)))
- {
- result->free_result();
- delete result;
- } else {
- if (!error_num)
- {
- error_num = spider_db_errorno(conn);
- }
- DBUG_RETURN(error_num);
- }
- }
- }
-#endif
SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
pthread_mutex_unlock(&conn->mta_conn_mutex);
if (first_insert_link_idx == -1)
@@ -7102,16 +6563,7 @@ int spider_db_update_auto_increment(
(auto_increment_mode == 3 && !table->auto_increment_field_not_null)
) {
last_insert_id = spider->conns[link_idx]->db_conn->last_insert_id();
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
affected_rows = spider->conns[link_idx]->db_conn->affected_rows();
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- affected_rows = spider->result_list.hs_upd_rows;
- }
-#endif
DBUG_PRINT("info",("spider last_insert_id=%llu", last_insert_id));
share->lgtm_tblhnd_share->auto_increment_value =
last_insert_id + affected_rows;
@@ -7653,27 +7105,8 @@ int spider_db_direct_update(
spider->do_direct_update ? "TRUE" : "FALSE"));
DBUG_PRINT("info", ("spider direct_update_kinds=%u",
spider->direct_update_kinds));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- (
- spider->do_direct_update &&
- (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
- ) ||
- (
- !spider->do_direct_update &&
-#endif
- (spider->sql_kinds & SPIDER_SQL_KIND_SQL)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- )
-#endif
- ) {
-#endif
if ((error_num = spider->append_update_sql_part()))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
/*
SQL access -> SQL remote access
@@ -7694,17 +7127,6 @@ int spider_db_direct_update(
(spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
*/
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->hs_increment || spider->hs_decrement)
- {
- if (
- (spider->direct_update_kinds & SPIDER_SQL_KIND_SQL) &&
- (error_num = spider->append_increment_update_set_sql_part())
- ) {
- DBUG_RETURN(error_num);
- }
- } else {
-#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
if (!spider->do_direct_update)
{
@@ -7723,19 +7145,8 @@ int spider_db_direct_update(
) {
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (
- (spider->direct_update_kinds & SPIDER_SQL_KIND_HS) &&
- (error_num = spider->append_direct_update_set_hs_part())
- ) {
- DBUG_RETURN(error_num);
- }
-#endif
}
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
result_list->desc_flg = FALSE;
result_list->sorted = TRUE;
@@ -7765,22 +7176,6 @@ int spider_db_direct_update(
DBUG_RETURN(error_num);
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
- {
- if (
- (error_num = spider->append_key_where_hs_part(
- (ranges && ranges->start_key.key) ? &ranges->start_key : NULL,
- (ranges && ranges->end_key.key) ? &ranges->end_key : NULL,
- SPIDER_SQL_TYPE_UPDATE_HS)) ||
- (error_num = spider->append_limit_hs_part(
- result_list->internal_offset, result_list->limit_num,
- SPIDER_SQL_TYPE_UPDATE_HS))
- ) {
- DBUG_RETURN(error_num);
- }
- }
-#endif
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
@@ -7792,20 +7187,9 @@ int spider_db_direct_update(
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
- {
-#endif
DBUG_PRINT("info", ("spider exec sql"));
conn = spider->conns[roop_count];
sql_type = SPIDER_SQL_TYPE_UPDATE_SQL;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- DBUG_PRINT("info", ("spider exec hs"));
- conn = spider->hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_UPDATE_HS;
- }
-#endif
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -7913,10 +7297,6 @@ int spider_db_direct_update(
}
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
- {
-#endif
if (!counted)
{
*update_rows = spider->conns[roop_count]->db_conn->affected_rows();
@@ -7925,48 +7305,6 @@ int spider_db_direct_update(
DBUG_PRINT("info", ("spider found_rows = %llu", *found_rows));
counted = TRUE;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- SPIDER_DB_RESULT *result;
- if (spider_bit_is_set(spider->db_request_phase, roop_count))
- {
- spider_clear_bit(spider->db_request_phase, roop_count);
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id =
- spider->wide_handler->trx->spider_thread_id;
- request_key.query_id = spider->wide_handler->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[roop_count];
- request_key.next = NULL;
- if ((result = conn->db_conn->use_result(spider, &request_key,
- &error_num)))
- {
- if (!counted)
- {
- *update_rows = conn->db_conn->affected_rows();
- DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
- *found_rows = conn->db_conn->matched_rows();
- DBUG_PRINT("info", ("spider found_rows = %llu", *found_rows));
- counted = TRUE;
- }
- result->free_result();
- delete result;
- } else {
- if (!error_num)
- {
- error_num = spider_db_errorno(conn);
- }
- DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
- DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
-#endif
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
@@ -7978,11 +7316,6 @@ int spider_db_direct_update(
pthread_mutex_unlock(&conn->mta_conn_mutex);
}
spider->reset_sql_sql(SPIDER_SQL_TYPE_UPDATE_SQL);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider->reset_hs_sql(SPIDER_SQL_TYPE_UPDATE_HS);
- spider->reset_hs_keys(SPIDER_SQL_TYPE_UPDATE_HS);
- spider->reset_hs_upds(SPIDER_SQL_TYPE_UPDATE_HS);
-#endif
DBUG_RETURN(0);
}
#else
@@ -8237,18 +7570,8 @@ int spider_db_bulk_direct_update(
spider->conn_link_idx, roop_count, share->link_count,
SPIDER_LINK_STATUS_RECOVERY)
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
- {
-#endif
DBUG_PRINT("info", ("spider exec sql"));
conn = spider->conns[roop_count];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- DBUG_PRINT("info", ("spider exec hs"));
- conn = spider->hs_w_conns[roop_count];
- }
-#endif
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
pthread_mutex_lock(&conn->mta_conn_mutex);
SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos);
@@ -8261,10 +7584,6 @@ int spider_db_bulk_direct_update(
{
error_num = tmp_error_num;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
- {
-#endif
if (!counted)
{
*update_rows = spider->conns[roop_count]->db_conn->affected_rows();
@@ -8273,48 +7592,6 @@ int spider_db_bulk_direct_update(
DBUG_PRINT("info", ("spider found_rows = %llu", *found_rows));
counted = TRUE;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- SPIDER_DB_RESULT *result;
- if (spider_bit_is_set(spider->db_request_phase, roop_count))
- {
- spider_clear_bit(spider->db_request_phase, roop_count);
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id =
- spider->wide_handler->trx->spider_thread_id;
- request_key.query_id = spider->wide_handler->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[roop_count];
- request_key.next = NULL;
- if ((result = conn->db_conn->use_result(spider, &request_key,
- &error_num)))
- {
- if (!counted)
- {
- *update_rows = conn->db_conn->affected_rows();
- DBUG_PRINT("info", ("spider update_rows = %llu", *update_rows));
- *found_rows = conn->db_conn->matched_rows();
- DBUG_PRINT("info", ("spider found_rows = %llu", *found_rows));
- counted = TRUE;
- }
- result->free_result();
- delete result;
- } else {
- if (!error_num)
- {
- error_num = spider_db_errorno(conn);
- }
- DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
- DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
- conn->mta_conn_mutex_lock_already = FALSE;
- conn->mta_conn_mutex_unlock_later = FALSE;
- SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos);
- pthread_mutex_unlock(&conn->mta_conn_mutex);
- DBUG_RETURN(error_num);
- }
- }
-#endif
DBUG_ASSERT(conn->mta_conn_mutex_lock_already);
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
@@ -8488,22 +7765,6 @@ int spider_db_direct_delete(
DBUG_RETURN(error_num);
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
- {
- if (
- (error_num = spider->append_key_where_hs_part(
- (ranges && ranges->start_key.key) ? &ranges->start_key : NULL,
- (ranges && ranges->end_key.key) ? &ranges->end_key : NULL,
- SPIDER_SQL_TYPE_DELETE_HS)) ||
- (error_num = spider->append_limit_hs_part(
- result_list->internal_offset, result_list->limit_num,
- SPIDER_SQL_TYPE_DELETE_HS))
- ) {
- DBUG_RETURN(error_num);
- }
- }
-#endif
for (
roop_count = spider_conn_link_idx_next(share->link_statuses,
@@ -8515,20 +7776,9 @@ int spider_db_direct_delete(
SPIDER_LINK_STATUS_RECOVERY)
) {
ulong sql_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
- {
-#endif
DBUG_PRINT("info", ("spider exec sql"));
conn = spider->conns[roop_count];
sql_type = SPIDER_SQL_TYPE_DELETE_SQL;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- DBUG_PRINT("info", ("spider exec hs"));
- conn = spider->hs_w_conns[roop_count];
- sql_type = SPIDER_SQL_TYPE_DELETE_HS;
- }
-#endif
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
pthread_mutex_assert_not_owner(&conn->mta_conn_mutex);
if (dbton_hdl->need_lock_before_set_sql_for_exec(sql_type))
@@ -8634,50 +7884,12 @@ int spider_db_direct_delete(
DBUG_ASSERT(conn->mta_conn_mutex_unlock_later);
conn->mta_conn_mutex_lock_already = FALSE;
conn->mta_conn_mutex_unlock_later = FALSE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!spider_bit_is_set(spider->do_hs_direct_update, roop_count))
- {
-#endif
if (!counted)
{
*delete_rows = spider->conns[roop_count]->db_conn->affected_rows();
DBUG_PRINT("info", ("spider delete_rows = %llu", *delete_rows));
counted = TRUE;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- SPIDER_DB_RESULT *result;
- if (spider_bit_is_set(spider->db_request_phase, roop_count))
- {
- spider_clear_bit(spider->db_request_phase, roop_count);
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id =
- spider->wide_handler->trx->spider_thread_id;
- request_key.query_id = spider->wide_handler->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[roop_count];
- request_key.next = NULL;
- if ((result = conn->db_conn->use_result(spider, &request_key,
- &error_num)))
- {
- if (!counted)
- {
- *delete_rows = conn->db_conn->affected_rows();
- DBUG_PRINT("info", ("spider delete_rows = %llu", *delete_rows));
- counted = TRUE;
- }
- result->free_result();
- delete result;
- } else {
- if (!error_num)
- {
- error_num = spider_db_errorno(conn);
- }
- DBUG_RETURN(error_num);
- }
- }
-#endif
#ifdef HA_CAN_BULK_ACCESS
}
#endif
@@ -8690,15 +7902,6 @@ int spider_db_direct_delete(
if ((error_num = spider->reset_sql_sql(SPIDER_SQL_TYPE_DELETE_SQL)))
error_num2 = error_num;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
- {
- if ((error_num = spider->reset_hs_sql(SPIDER_SQL_TYPE_DELETE_HS)))
- error_num2 = error_num;
- if ((error_num = spider->reset_hs_keys(SPIDER_SQL_TYPE_DELETE_HS)))
- error_num2 = error_num;
- }
-#endif
DBUG_RETURN(error_num2);
}
#else
@@ -10786,36 +9989,16 @@ int spider_db_udf_direct_sql_connect(
DBUG_PRINT("info",("spider net_read_timeout=%u", conn->net_read_timeout));
DBUG_PRINT("info",("spider net_write_timeout=%u", conn->net_write_timeout));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
if ((error_num = spider_reset_conn_setted_parameter(conn, thd)))
DBUG_RETURN(error_num);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
if (conn->dbton_id == SPIDER_DBTON_SIZE)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
my_printf_error(
ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM,
ER_SPIDER_SQL_WRAPPER_IS_INVALID_STR,
MYF(0), conn->tgt_wrapper);
DBUG_RETURN(ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- my_printf_error(
- ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM,
- ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR,
- MYF(0), conn->tgt_wrapper);
- DBUG_RETURN(ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM);
- }
-#endif
}
/*
@@ -10852,10 +10035,6 @@ int spider_db_udf_direct_sql_ping(
DBUG_RETURN(error_num);
conn->server_lost = FALSE;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
if ((error_num = conn->db_conn->ping()))
{
spider_db_disconnect(conn);
@@ -10873,9 +10052,6 @@ int spider_db_udf_direct_sql_ping(
DBUG_RETURN(error_num);
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
conn->ping_time = (time_t) time((time_t*) 0);
DBUG_RETURN(0);
}
@@ -10985,26 +10161,6 @@ int spider_db_udf_direct_sql(
!(error_num = spider_db_udf_direct_sql_set_names(direct_sql, trx, conn)) &&
!(error_num = spider_db_udf_direct_sql_select_db(direct_sql, conn))
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode != 0)
- {
- st_spider_db_request_key request_key;
- request_key.spider_thread_id = direct_sql->trx->spider_thread_id;
- request_key.query_id = direct_sql->trx->thd->query_id;
- request_key.handler = direct_sql;
- request_key.request_id = 1;
- request_key.next = NULL;
- if ((error_num = conn->db_conn->append_sql(
- direct_sql->sql, direct_sql->sql_length, &request_key)))
- {
-#if MYSQL_VERSION_ID < 50500
-#else
- c_thd->lex->sql_command = sql_command_backup;
-#endif
- DBUG_RETURN(error_num);
- }
- }
-#endif
spider_conn_set_timeout_from_direct_sql(conn, thd, direct_sql);
if (spider_db_query(
conn,
@@ -11273,9 +10429,6 @@ int spider_db_udf_direct_sql_select_db(
DBUG_ENTER("spider_db_udf_direct_sql_select_db");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- direct_sql->access_mode == 0 &&
-#endif
spider_dbton[conn->dbton_id].db_util->database_has_default_value()
) {
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
@@ -11321,10 +10474,6 @@ int spider_db_udf_direct_sql_set_names(
int error_num, need_mon = 0;
DBUG_ENTER("spider_db_udf_direct_sql_set_names");
pthread_mutex_assert_owner(&conn->mta_conn_mutex);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
DBUG_ASSERT(conn->mta_conn_mutex_file_pos.file_name);
if (
!conn->access_charset ||
@@ -11348,9 +10497,6 @@ int spider_db_udf_direct_sql_set_names(
}
conn->access_charset = trx->udf_access_charset;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
DBUG_RETURN(0);
}
@@ -12418,15 +11564,7 @@ int spider_db_open_handler(
int error_num;
SPIDER_SHARE *share = spider->share;
uint *handler_id_ptr =
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- conn->conn_kind == SPIDER_CONN_KIND_MYSQL ?
-#endif
&spider->m_handler_id[link_idx]
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- : conn->conn_kind == SPIDER_CONN_KIND_HS_READ ?
- &spider->r_handler_id[link_idx] :
- &spider->w_handler_id[link_idx]
-#endif
;
spider_db_handler *dbton_hdl = spider->dbton_handler[conn->dbton_id];
DBUG_ENTER("spider_db_open_handler");
@@ -12441,182 +11579,32 @@ int spider_db_open_handler(
conn->mta_conn_mutex_unlock_later = TRUE;
if (!spider->handler_opened(link_idx, conn->conn_kind))
*handler_id_ptr = conn->opened_handlers;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
- if (!spider->handler_opened(link_idx, conn->conn_kind))
- my_sprintf(spider->m_handler_cid[link_idx],
- (spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_FORMAT,
- *handler_id_ptr));
-
- if ((error_num = dbton_hdl->append_open_handler_part(
- SPIDER_SQL_TYPE_HANDLER, *handler_id_ptr, conn, link_idx)))
- {
- goto error;
- }
- spider_conn_set_timeout_from_share(conn, link_idx,
- spider->wide_handler->trx->thd,
- share);
- if (dbton_hdl->execute_sql(
- SPIDER_SQL_TYPE_HANDLER,
- conn,
- -1,
- &spider->need_mons[link_idx])
- ) {
- error_num = spider_db_errorno(conn);
- goto error;
- }
- dbton_hdl->reset_sql(SPIDER_SQL_TYPE_HANDLER);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- uint reconnect = 0;
- if (conn->hs_pre_age != conn->hs_age && conn->server_lost)
- {
- spider_conn_queue_connect(share, conn, link_idx);
- reconnect |= 1;
- }
- if ((error_num = spider_db_conn_queue_action(conn)))
- {
- goto error;
- }
- if (conn->hs_pre_age != conn->hs_age)
- {
- if (conn->db_conn->ping())
- {
- my_printf_error(ER_SPIDER_HS_NUM, ER_SPIDER_HS_STR, MYF(0),
- conn->db_conn->get_errno(), conn->db_conn->get_error());
- spider->need_mons[link_idx] = ER_SPIDER_HS_NUM;
- error_num = ER_SPIDER_HS_NUM;
- goto error;
- }
- conn->opened_handlers = 0;
- conn->db_conn->reset_opened_handler();
- conn->hs_age = conn->hs_pre_age;
- reconnect |= 2;
- }
- if (conn->conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- if (spider->hs_r_conn_ages[link_idx] != conn->hs_age)
- {
- spider->clear_handler_opened(link_idx, SPIDER_CONN_KIND_HS_READ);
- *handler_id_ptr = conn->opened_handlers;
- }
- } else {
- if (spider->hs_w_conn_ages[link_idx] != conn->hs_age)
- {
- spider->clear_handler_opened(link_idx, SPIDER_CONN_KIND_HS_WRITE);
- *handler_id_ptr = conn->opened_handlers;
- }
- }
+ if (!spider->handler_opened(link_idx, conn->conn_kind))
+ my_sprintf(spider->m_handler_cid[link_idx],
+ (spider->m_handler_cid[link_idx], SPIDER_SQL_HANDLER_CID_FORMAT,
+ *handler_id_ptr));
-#ifdef HA_CAN_BULK_ACCESS
- if (!spider->is_bulk_access_clone)
- {
-#endif
- conn->db_conn->reset_request_queue();
-#ifdef HA_CAN_BULK_ACCESS
- } else if (!spider->bulk_access_executing)
- {
- if (conn->conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- spider_set_bit(spider->result_list.hs_r_bulk_open_index, link_idx);
- } else {
- spider_set_bit(spider->result_list.hs_w_bulk_open_index, link_idx);
- }
- }
-#endif
- if ((error_num = dbton_hdl->append_open_handler_part(
- SPIDER_SQL_TYPE_OTHER_HS, *handler_id_ptr, conn, link_idx)))
- {
- goto error;
- }
-#ifdef HA_CAN_BULK_ACCESS
- if (spider->is_bulk_access_clone && !spider->bulk_access_executing)
- {
- spider->connection_ids[link_idx] = conn->connection_id;
- spider_trx_add_bulk_access_conn(spider->wide_handler->trx, conn);
- } else {
-#endif
- spider_conn_set_timeout_from_share(conn, link_idx,
- spider->wide_handler->trx->thd,
- share);
- if (dbton_hdl->execute_sql(
- SPIDER_SQL_TYPE_SELECT_HS,
- conn,
- -1,
- &spider->need_mons[link_idx])
- ) {
- error_num = spider_db_errorno(conn);
- goto error;
- }
+ if ((error_num = dbton_hdl->append_open_handler_part(
+ SPIDER_SQL_TYPE_HANDLER, *handler_id_ptr, conn, link_idx)))
+ {
+ goto error;
+ }
- SPIDER_DB_RESULT *result;
- if (spider_bit_is_set(spider->db_request_phase, link_idx))
- {
- spider_clear_bit(spider->db_request_phase, link_idx);
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id =
- spider->wide_handler->trx->spider_thread_id;
- request_key.query_id = spider->wide_handler->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[link_idx];
- request_key.next = NULL;
- if (!(result = conn->db_conn->use_result(spider, &request_key,
- &error_num)))
- {
- if (!error_num)
- {
- spider_db_errorno(conn);
- error_num = ER_SPIDER_HS_NUM;
- }
- goto error;
- } else {
- conn->ping_time = (time_t) time((time_t*) 0);
- }
- result->free_result();
- delete result;
-#ifdef HA_CAN_BULK_ACCESS
- }
-#endif
- if (conn->conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- spider->r_handler_index[link_idx] = spider->active_index;
- spider->hs_r_conn_ages[link_idx] = conn->hs_age;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (
- spider->sql_command != SQLCOM_HS_INSERT &&
- spider->hs_pushed_ret_fields_num < MAX_FIELDS
- ) {
- spider->hs_r_ret_fields_num[link_idx] =
- spider->hs_pushed_ret_fields_num;
- memcpy(spider->hs_r_ret_fields[link_idx], spider->hs_pushed_ret_fields,
- sizeof(uint32) * spider->hs_pushed_ret_fields_num);
- } else {
- spider->hs_r_ret_fields_num[link_idx] = MAX_FIELDS;
- }
-#endif
- } else {
- spider->w_handler_index[link_idx] = spider->active_index;
- spider->hs_w_conn_ages[link_idx] = conn->hs_age;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (
- spider->sql_command != SQLCOM_HS_INSERT &&
- spider->hs_pushed_ret_fields_num < MAX_FIELDS
- ) {
- spider->hs_w_ret_fields_num[link_idx] =
- spider->hs_pushed_ret_fields_num;
- memcpy(spider->hs_w_ret_fields[link_idx], spider->hs_pushed_ret_fields,
- sizeof(uint32) * spider->hs_pushed_ret_fields_num);
- } else {
- spider->hs_w_ret_fields_num[link_idx] = MAX_FIELDS;
- }
-#endif
- }
+ spider_conn_set_timeout_from_share(conn, link_idx,
+ spider->wide_handler->trx->thd,
+ share);
+ if (dbton_hdl->execute_sql(
+ SPIDER_SQL_TYPE_HANDLER,
+ conn,
+ -1,
+ &spider->need_mons[link_idx])
+ ) {
+ error_num = spider_db_errorno(conn);
+ goto error;
}
-#endif
+ dbton_hdl->reset_sql(SPIDER_SQL_TYPE_HANDLER);
+
if (!spider->handler_opened(link_idx, conn->conn_kind))
{
if ((error_num = dbton_hdl->insert_opened_handler(conn, link_idx)))
@@ -12650,74 +11638,10 @@ int spider_db_bulk_open_handler(
int link_idx
) {
int error_num = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- bool opening_index = FALSE;
-#endif
DBUG_ENTER("spider_db_bulk_open_handler");
DBUG_PRINT("info",("spider spider=%p", spider));
DBUG_PRINT("info",("spider conn=%p", conn));
DBUG_PRINT("info",("spider link_idx=%d", link_idx));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- DBUG_ASSERT(conn->conn_kind != SPIDER_CONN_KIND_MYSQL);
- if (conn->conn_kind == SPIDER_CONN_KIND_HS_READ)
- {
- if (spider_bit_is_set(spider->result_list.hs_r_bulk_open_index, link_idx))
- {
- DBUG_PRINT("info",("spider SPIDER_CONN_KIND_HS_READ"));
- spider_clear_bit(spider->result_list.hs_r_bulk_open_index, link_idx);
- opening_index = TRUE;
- }
- } else {
- if (spider_bit_is_set(spider->result_list.hs_w_bulk_open_index, link_idx))
- {
- DBUG_PRINT("info",("spider SPIDER_CONN_KIND_HS_WRITE"));
- spider_clear_bit(spider->result_list.hs_w_bulk_open_index, link_idx);
- opening_index = TRUE;
- }
- }
- if (opening_index)
- {
- DBUG_PRINT("info",("spider conn->connection_id=%llu",
- conn->connection_id));
- DBUG_PRINT("info",("spider spider->connection_ids[%d]=%llu",
- link_idx, spider->connection_ids[link_idx]));
- if (conn->connection_id != spider->connection_ids[link_idx])
- {
- my_message(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM,
- ER_SPIDER_REMOTE_SERVER_GONE_AWAY_STR, MYF(0));
- DBUG_RETURN(ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM);
- }
-
- bool tmp_mta_conn_mutex_unlock_later;
- pthread_mutex_assert_owner(&conn->mta_conn_mutex);
- tmp_mta_conn_mutex_unlock_later = conn->mta_conn_mutex_unlock_later;
- conn->mta_conn_mutex_unlock_later = TRUE;
- SPIDER_DB_RESULT *result;
- if (spider_bit_is_set(spider->db_request_phase, link_idx))
- {
- spider_clear_bit(spider->db_request_phase, link_idx);
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id = spider->wide_handler->trx->spider_thread_id;
- request_key.query_id = spider->wide_handler->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[link_idx];
- request_key.next = NULL;
- if (!(result = conn->db_conn->use_result(spider, &request_key,
- &error_num)))
- {
- if (!error_num)
- {
- spider_db_errorno(conn);
- error_num = ER_SPIDER_HS_NUM;
- }
- } else {
- result->free_result();
- delete result;
- }
- conn->mta_conn_mutex_unlock_later = tmp_mta_conn_mutex_unlock_later;
- }
-#endif
DBUG_RETURN(error_num);
}
#endif
@@ -12742,10 +11666,6 @@ int spider_db_close_handler(
conn->mta_conn_mutex_unlock_later = TRUE;
if (spider->handler_opened(link_idx, tgt_conn_kind))
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (conn->conn_kind == SPIDER_CONN_KIND_MYSQL)
- {
-#endif
dbton_hdl->reset_sql(SPIDER_SQL_TYPE_HANDLER);
if ((error_num = dbton_hdl->append_close_handler_part(
SPIDER_SQL_TYPE_HANDLER, link_idx)))
@@ -12772,14 +11692,6 @@ int spider_db_close_handler(
goto error;
}
dbton_hdl->reset_sql(SPIDER_SQL_TYPE_HANDLER);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
-/*
- conn->hs_conn->close();
- conn->server_lost = TRUE;
-*/
- }
-#endif
if ((error_num = dbton_hdl->delete_opened_handler(conn, link_idx)))
goto error;
conn->opened_handlers--;
@@ -12803,23 +11715,6 @@ error:
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-void spider_db_hs_request_buf_reset(
- SPIDER_CONN *conn
-) {
- DBUG_ENTER("spider_db_hs_request_buf_reset");
- if (conn->bulk_access_requests)
- {
- if (conn->db_conn->is_connected())
- {
- conn->db_conn->reset_request_queue();
- }
- conn->bulk_access_requests = 0;
- }
- DBUG_VOID_RETURN;
-}
-#endif
-
bool spider_db_conn_is_network_error(
int error_num
) {
diff --git a/storage/spider/spd_db_conn.h b/storage/spider/spd_db_conn.h
index 996e6e24419..b87c57bc4ab 100644
--- a/storage/spider/spd_db_conn.h
+++ b/storage/spider/spd_db_conn.h
@@ -1217,12 +1217,6 @@ int spider_db_close_handler(
uint tgt_conn_kind
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-void spider_db_hs_request_buf_reset(
- SPIDER_CONN *conn
-);
-#endif
-
bool spider_db_conn_is_network_error(
int error_num
);
diff --git a/storage/spider/spd_db_handlersocket.cc b/storage/spider/spd_db_handlersocket.cc
deleted file mode 100644
index 030201e61ae..00000000000
--- a/storage/spider/spd_db_handlersocket.cc
+++ /dev/null
@@ -1,6362 +0,0 @@
-/* Copyright (C) 2012-2018 Kentoku Shiba
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-
-#define MYSQL_SERVER 1
-#include <my_global.h>
-#include "mysql_version.h"
-#include "spd_environ.h"
-#if MYSQL_VERSION_ID < 50500
-#include "mysql_priv.h"
-#include <mysql/plugin.h>
-#else
-#include "sql_priv.h"
-#include "probes_mysql.h"
-#include "sql_analyse.h"
-#endif
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#include "spd_err.h"
-#include "spd_param.h"
-#include "spd_db_include.h"
-#include "spd_include.h"
-#include "spd_db_handlersocket.h"
-#include "ha_spider.h"
-#include "spd_db_conn.h"
-#include "spd_trx.h"
-#include "spd_conn.h"
-#include "spd_malloc.h"
-
-extern handlerton *spider_hton_ptr;
-extern HASH spider_open_connections;
-extern HASH spider_ipport_conns;
-extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
-extern const char spider_dig_upper[];
-
-#define SPIDER_SQL_INTERVAL_STR " + interval "
-#define SPIDER_SQL_INTERVAL_LEN (sizeof(SPIDER_SQL_INTERVAL_STR) - 1)
-#define SPIDER_SQL_NEGINTERVAL_STR " - interval "
-#define SPIDER_SQL_NEGINTERVAL_LEN (sizeof(SPIDER_SQL_NEGINTERVAL_STR) - 1)
-
-#define SPIDER_SQL_NAME_QUOTE_STR ""
-#define SPIDER_SQL_NAME_QUOTE_LEN (sizeof(SPIDER_SQL_NAME_QUOTE_STR) - 1)
-static const char *name_quote_str = SPIDER_SQL_NAME_QUOTE_STR;
-
-#define SPIDER_SQL_TYPE_FULL_HS (SPIDER_SQL_TYPE_SELECT_HS | \
- SPIDER_SQL_TYPE_INSERT_HS | SPIDER_SQL_TYPE_UPDATE_HS | \
- SPIDER_SQL_TYPE_DELETE_HS | SPIDER_SQL_TYPE_OTHER_HS)
-
-static uchar SPIDER_SQL_LINESTRING_HEAD_STR[] =
- {0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00};
-#define SPIDER_SQL_LINESTRING_HEAD_LEN sizeof(SPIDER_SQL_LINESTRING_HEAD_STR)
-
-static const char *spider_db_timefunc_interval_str[] =
-{
- " year", " quarter", " month", " week", " day",
- " hour", " minute", " second", " microsecond",
- " year_month", " day_hour", " day_minute",
- " day_second", " hour_minute", " hour_second",
- " minute_second", " day_microsecond", " hour_microsecond",
- " minute_microsecond", " second_microsecond"
-};
-
-static SPIDER_HS_STRING_REF spider_null_string_ref = SPIDER_HS_STRING_REF();
-
-int spider_handlersocket_init()
-{
- DBUG_ENTER("spider_handlersocket_init");
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_deinit()
-{
- DBUG_ENTER("spider_handlersocket_deinit");
- DBUG_RETURN(0);
-}
-
-spider_db_share *spider_handlersocket_create_share(
- SPIDER_SHARE *share
-) {
- DBUG_ENTER("spider_handlersocket_create_share");
- DBUG_RETURN(new spider_handlersocket_share(share));
-}
-
-spider_db_handler *spider_handlersocket_create_handler(
- ha_spider *spider,
- spider_db_share *db_share
-) {
- DBUG_ENTER("spider_handlersocket_create_handler");
- DBUG_RETURN(new spider_handlersocket_handler(spider,
- (spider_handlersocket_share *) db_share));
-}
-
-SPIDER_DB_CONN *spider_handlersocket_create_conn(
- SPIDER_CONN *conn
-) {
- DBUG_ENTER("spider_handlersocket_create_conn");
- DBUG_RETURN(new spider_db_handlersocket(conn));
-}
-
-bool spider_handlersocket_support_direct_join(
-) {
- DBUG_ENTER("spider_handlersocket_support_direct_join");
- DBUG_RETURN(FALSE);
-}
-
-spider_db_handlersocket_util spider_db_handlersocket_utility;
-
-SPIDER_DBTON spider_dbton_handlersocket = {
- 0,
- SPIDER_DB_WRAPPER_MYSQL,
- SPIDER_DB_ACCESS_TYPE_NOSQL,
- spider_handlersocket_init,
- spider_handlersocket_deinit,
- spider_handlersocket_create_share,
- spider_handlersocket_create_handler,
- NULL,
- spider_handlersocket_create_conn,
- spider_handlersocket_support_direct_join,
- &spider_db_handlersocket_utility,
- "For communicating using the handlersocket protocol",
- "0.1.0",
- SPIDER_MATURITY_BETA
-};
-
-#ifndef HANDLERSOCKET_MYSQL_UTIL
-spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-int spider_db_hs_string_ref_buffer::init()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::init");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-void spider_db_hs_string_ref_buffer::clear()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::clear");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_conds.clear();
- DBUG_VOID_RETURN;
-}
-
-int spider_db_hs_string_ref_buffer::push_back(
- SPIDER_HS_STRING_REF &cond
-) {
- DBUG_ENTER("spider_db_hs_string_ref_buffer::push_back");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_conds.push_back(cond);
- DBUG_RETURN(0);
-}
-
-SPIDER_HS_STRING_REF *spider_db_hs_string_ref_buffer::ptr()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::ptr");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(&hs_conds[0]);
-}
-
-uint spider_db_hs_string_ref_buffer::size()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::size");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((uint) hs_conds.size());
-}
-#else
-spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer() : hs_da_init(FALSE)
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::spider_db_hs_string_ref_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::~spider_db_hs_string_ref_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- if (hs_da_init)
- {
- spider_free_mem_calc(spider_current_trx,
- hs_conds_id, hs_conds.max_element * hs_conds.size_of_element);
- delete_dynamic(&hs_conds);
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_hs_string_ref_buffer::init()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::init");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!hs_da_init)
- {
- SPD_INIT_DYNAMIC_ARRAY2(&hs_conds, sizeof(SPIDER_HS_STRING_REF),
- NULL, 16, 16, MYF(MY_WME));
- spider_alloc_calc_mem_init(hs_conds, 159);
- spider_alloc_calc_mem(spider_current_trx,
- hs_conds, hs_conds.max_element * hs_conds.size_of_element);
- hs_da_init = TRUE;
- }
- DBUG_RETURN(0);
-}
-
-void spider_db_hs_string_ref_buffer::clear()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::clear");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_conds.elements = 0;
- DBUG_VOID_RETURN;
-}
-
-int spider_db_hs_string_ref_buffer::push_back(
- SPIDER_HS_STRING_REF &cond
-) {
- uint old_elements = hs_conds.max_element;
- DBUG_ENTER("spider_db_hs_string_ref_buffer::push_back");
- DBUG_PRINT("info",("spider this=%p", this));
- if (insert_dynamic(&hs_conds, (uchar *) &cond))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (hs_conds.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- hs_conds,
- (hs_conds.max_element - old_elements) * hs_conds.size_of_element);
- }
- DBUG_RETURN(0);
-}
-
-SPIDER_HS_STRING_REF *spider_db_hs_string_ref_buffer::ptr()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::ptr");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((SPIDER_HS_STRING_REF *) hs_conds.buffer);
-}
-
-uint spider_db_hs_string_ref_buffer::size()
-{
- DBUG_ENTER("spider_db_hs_string_ref_buffer::size");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(hs_conds.elements);
-}
-#endif
-
-spider_db_hs_str_buffer::spider_db_hs_str_buffer() : hs_da_init(FALSE)
-{
- DBUG_ENTER("spider_db_hs_str_buffer::spider_db_hs_str_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_hs_str_buffer::~spider_db_hs_str_buffer()
-{
- DBUG_ENTER("spider_db_hs_str_buffer::~spider_db_hs_str_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- if (hs_da_init)
- {
- spider_free_mem_calc(spider_current_trx,
- hs_conds_id, hs_conds.max_element * hs_conds.size_of_element);
- delete_dynamic(&hs_conds);
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_hs_str_buffer::init()
-{
- DBUG_ENTER("spider_db_hs_str_buffer::init");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!hs_da_init)
- {
- SPD_INIT_DYNAMIC_ARRAY2(&hs_conds, sizeof(spider_string *),
- NULL, 16, 16, MYF(MY_WME));
- spider_alloc_calc_mem_init(hs_conds, 160);
- spider_alloc_calc_mem(spider_current_trx,
- hs_conds, hs_conds.max_element * hs_conds.size_of_element);
- hs_da_init = TRUE;
- }
- DBUG_RETURN(0);
-}
-
-void spider_db_hs_str_buffer::clear()
-{
- uint i;
- spider_string *element;
- DBUG_ENTER("spider_db_hs_str_buffer::clear");
- DBUG_PRINT("info",("spider this=%p", this));
- for (i = 0; i < hs_conds.elements; i++)
- {
- get_dynamic(&hs_conds, (uchar *) &element, i);
- element->free();
- spider_free(spider_current_trx, element, MYF(0));
- }
- hs_conds.elements = 0;
- DBUG_VOID_RETURN;
-}
-
-spider_string *spider_db_hs_str_buffer::add(
- uint *strs_pos,
- const char *str,
- uint str_len
-) {
- spider_string *element;
- DBUG_ENTER("spider_db_hs_str_buffer::add");
- DBUG_PRINT("info",("spider this=%p", this));
- if (hs_conds.elements <= *strs_pos + 1)
- {
- if (!(element = (spider_string *) spider_malloc(spider_current_trx, 8,
- sizeof(spider_string), MYF(MY_WME | MY_ZEROFILL))))
- DBUG_RETURN(NULL);
- element->init_calc_mem(98);
- element->set_charset(&my_charset_bin);
- if ((element->reserve(str_len + 1)))
- {
- spider_free(spider_current_trx, element, MYF(0));
- DBUG_RETURN(NULL);
- }
- element->q_append(str, str_len);
- uint old_elements = hs_conds.max_element;
- if (insert_dynamic(&hs_conds, (uchar *) &element))
- {
- element->free();
- spider_free(spider_current_trx, element, MYF(0));
- DBUG_RETURN(NULL);
- }
- if (hs_conds.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- hs_conds,
- (hs_conds.max_element - old_elements) *
- hs_conds.size_of_element);
- }
- } else {
- element = ((spider_string **) hs_conds.buffer)[*strs_pos];
- element->length(0);
- if ((element->reserve(str_len + 1)))
- DBUG_RETURN(NULL);
- element->q_append(str, str_len);
- }
- (*strs_pos)++;
- DBUG_RETURN(element);
-}
-
-spider_db_handlersocket_row::spider_db_handlersocket_row() :
- spider_db_row(spider_dbton_handlersocket.dbton_id),
- hs_row(NULL), field_count(0), row_size(0), cloned(FALSE)
-{
- DBUG_ENTER("spider_db_handlersocket_row::spider_db_handlersocket_row");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_handlersocket_row::~spider_db_handlersocket_row()
-{
- DBUG_ENTER("spider_db_handlersocket_row::~spider_db_handlersocket_row");
- DBUG_PRINT("info",("spider this=%p", this));
- if (cloned)
- {
- spider_free(spider_current_trx, hs_row_first, MYF(0));
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_handlersocket_row::store_to_field(
- Field *field,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_handlersocket_row::store_to_field");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!hs_row->begin())
- {
- DBUG_PRINT("info", ("spider field is null"));
- field->set_null();
- field->reset();
- } else {
-#ifndef DBUG_OFF
- char buf[MAX_FIELD_WIDTH];
- spider_string tmp_str(buf, MAX_FIELD_WIDTH, field->charset());
- tmp_str.init_calc_mem(119);
- tmp_str.length(0);
- tmp_str.append(hs_row->begin(), hs_row->size(), &my_charset_bin);
- DBUG_PRINT("info", ("spider val=%s", tmp_str.c_ptr_safe()));
-#endif
- field->set_notnull();
- if (field->flags & BLOB_FLAG)
- {
- DBUG_PRINT("info", ("spider blob field"));
- ((Field_blob *)field)->set_ptr(
- hs_row->size(), (uchar *) hs_row->begin());
- } else
- field->store(hs_row->begin(), hs_row->size(), &my_charset_bin);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_row::append_to_str(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket_row::append_to_str");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(hs_row->size()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(hs_row->begin(), hs_row->size());
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_row::append_escaped_to_str(
- spider_string *str,
- uint dbton_id
-) {
- DBUG_ENTER("spider_db_handlersocket_row::append_escaped_to_str");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_string tmp_str(hs_row->begin(), hs_row->size() + 1, &my_charset_bin);
- tmp_str.init_calc_mem(172);
- tmp_str.length(hs_row->size());
- if (str->reserve(hs_row->size() * 2 + 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- spider_dbton[dbton_id].db_util->append_escaped_util(str, tmp_str.get_str());
- str->mem_calc();
- DBUG_RETURN(0);
-}
-
-void spider_db_handlersocket_row::first()
-{
- DBUG_ENTER("spider_db_handlersocket_row::first");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_row = hs_row_first;
- DBUG_VOID_RETURN;
-}
-
-void spider_db_handlersocket_row::next()
-{
- DBUG_ENTER("spider_db_handlersocket_row::next");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_row++;
- DBUG_VOID_RETURN;
-}
-
-bool spider_db_handlersocket_row::is_null()
-{
- DBUG_ENTER("spider_db_handlersocket_row::is_null");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(!hs_row->begin());
-}
-
-int spider_db_handlersocket_row::val_int()
-{
- DBUG_ENTER("spider_db_handlersocket_row::val_int");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(atoi(hs_row->begin()));
-}
-
-double spider_db_handlersocket_row::val_real()
-{
- DBUG_ENTER("spider_db_handlersocket_row::val_real");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(hs_row->begin() ? my_atof(hs_row->begin()) : 0.0);
-}
-
-my_decimal *spider_db_handlersocket_row::val_decimal(
- my_decimal *decimal_value,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_handlersocket_row::val_decimal");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!hs_row->begin())
- DBUG_RETURN(NULL);
-
-#ifdef SPIDER_HAS_DECIMAL_OPERATION_RESULTS_VALUE_TYPE
- decimal_operation_results(str2my_decimal(0, hs_row->begin(), hs_row->size(),
- access_charset, decimal_value), "", "");
-#else
- decimal_operation_results(str2my_decimal(0, hs_row->begin(), hs_row->size(),
- access_charset, decimal_value));
-#endif
-
- DBUG_RETURN(decimal_value);
-}
-
-SPIDER_DB_ROW *spider_db_handlersocket_row::clone()
-{
- spider_db_handlersocket_row *clone_row;
- char *tmp_char;
- uint i;
- DBUG_ENTER("spider_db_handlersocket_row::clone");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(clone_row = new spider_db_handlersocket_row(dbton_id)))
- {
- DBUG_RETURN(NULL);
- }
- if (!spider_bulk_malloc(spider_current_trx, 169, MYF(MY_WME),
- &clone_row->hs_row, (uint) (sizeof(SPIDER_HS_STRING_REF) * field_count),
- &tmp_char, (uint) (row_size),
- NullS)
- ) {
- delete clone_row;
- DBUG_RETURN(NULL);
- }
- for (i = 0; i < field_count; i++)
- {
- memcpy(tmp_char, hs_row_first[i].begin(), hs_row_first[i].size());
- clone_row->hs_row[i].set(tmp_char, hs_row_first[i].size());
- tmp_char += hs_row_first[i].size();
- }
- clone_row->hs_row_first = clone_row->hs_row;
- clone_row->cloned = TRUE;;
- clone_row->row_size = row_size;;
- DBUG_RETURN(NULL);
-}
-
-int spider_db_handlersocket_row::store_to_tmp_table(
- TABLE *tmp_table,
- spider_string *str
-) {
- uint i;
- SPIDER_HS_STRING_REF *tmp_hs_row = hs_row;
- DBUG_ENTER("spider_db_handlersocket_row::store_to_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- str->length(0);
- for (i = 0; i < field_count; i++)
- {
- if (tmp_hs_row->begin())
- {
- if (str->reserve(tmp_hs_row->size()))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(tmp_hs_row->begin(), tmp_hs_row->size());
- }
- tmp_hs_row++;
- }
- tmp_table->field[0]->set_notnull();
- tmp_table->field[0]->store(
- (const char *) hs_row,
- sizeof(SPIDER_HS_STRING_REF) * field_count, &my_charset_bin);
- tmp_table->field[1]->set_notnull();
- tmp_table->field[1]->store(
- str->ptr(), str->length(), &my_charset_bin);
- tmp_table->field[2]->set_null();
- DBUG_RETURN(tmp_table->file->ha_write_row(tmp_table->record[0]));
-}
-
-uint spider_db_handlersocket_row::get_byte_size()
-{
- DBUG_ENTER("spider_db_handlersocket_row::get_byte_size");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(row_size);
-}
-
-
-spider_db_handlersocket_result_buffer::spider_db_handlersocket_result_buffer(
-) : spider_db_result_buffer()
-{
- DBUG_ENTER("spider_db_handlersocket_result_buffer::spider_db_handlersocket_result_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_handlersocket_result_buffer::~spider_db_handlersocket_result_buffer()
-{
- DBUG_ENTER(
- "spider_db_handlersocket_result_buffer::~spider_db_handlersocket_result_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-void spider_db_handlersocket_result_buffer::clear()
-{
- DBUG_ENTER("spider_db_handlersocket_result_buffer::clear");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_result.readbuf.clear();
- DBUG_VOID_RETURN;
-}
-
-bool spider_db_handlersocket_result_buffer::check_size(
- longlong size
-) {
- DBUG_ENTER("spider_db_handlersocket_result_buffer::check_size");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((uint) hs_result.readbuf.real_size() > size)
- {
- hs_result.readbuf.real_free();
- DBUG_RETURN(TRUE);
- }
- DBUG_RETURN(FALSE);
-}
-
-spider_db_handlersocket_result::spider_db_handlersocket_result(
- SPIDER_DB_CONN *in_db_conn
-) : spider_db_result(in_db_conn), row(in_db_conn->dbton_id)
-{
- DBUG_ENTER("spider_db_handlersocket_result::spider_db_handlersocket_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_handlersocket_result::~spider_db_handlersocket_result()
-{
- DBUG_ENTER(
- "spider_db_handlersocket_result::~spider_db_handlersocket_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-bool spider_db_handlersocket_result::has_result()
-{
- DBUG_ENTER("spider_db_handlersocket_result::has_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(((*hs_conn_p)->get_response_end_offset() > 0));
-}
-
-void spider_db_handlersocket_result::free_result()
-{
- DBUG_ENTER("spider_db_handlersocket_result::free_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if ((*hs_conn_p)->get_response_end_offset() > 0)
- {
- (*hs_conn_p)->response_buf_remove();
- if ((*hs_conn_p)->get_error_code())
- {
- DBUG_PRINT("info",("spider hs %d %s",
- (*hs_conn_p)->get_error_code(),
- (*hs_conn_p)->get_error().ptr()));
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- }
- DBUG_VOID_RETURN;
-}
-
-SPIDER_DB_ROW *spider_db_handlersocket_result::current_row()
-{
- DBUG_ENTER("spider_db_handlersocket_result::current_row");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((SPIDER_DB_ROW *) row.clone());
-}
-
-SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row()
-{
- DBUG_ENTER("spider_db_handlersocket_result::fetch_row");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(row.hs_row = (SPIDER_HS_STRING_REF *)
- (*hs_conn_p)->get_next_row()))
- {
- store_error_num = HA_ERR_END_OF_FILE;
- DBUG_RETURN(NULL);
- }
- row.field_count = field_count;
- row.hs_row_first = row.hs_row;
- row.row_size = (*hs_conn_p)->get_row_size();
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row_from_result_buffer(
- spider_db_result_buffer *spider_res_buf
-) {
- spider_db_handlersocket_result_buffer *hs_res_buf;
- DBUG_ENTER("spider_db_handlersocket_result::fetch_row_from_result_buffer");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_res_buf = (spider_db_handlersocket_result_buffer *) spider_res_buf;
- if (!(row.hs_row = (SPIDER_HS_STRING_REF *)
- (*hs_conn_p)->get_next_row_from_result(hs_res_buf->hs_result)))
- {
- store_error_num = HA_ERR_END_OF_FILE;
- DBUG_RETURN(NULL);
- }
- row.field_count = field_count;
- row.hs_row_first = row.hs_row;
- row.row_size = (*hs_conn_p)->get_row_size_from_result(hs_res_buf->hs_result);
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-SPIDER_DB_ROW *spider_db_handlersocket_result::fetch_row_from_tmp_table(
- TABLE *tmp_table
-) {
- uint i;
- spider_string tmp_str1, tmp_str2;
- const char *row_ptr;
- SPIDER_HS_STRING_REF *tmp_hs_row;
- uint field_count;
- DBUG_ENTER("spider_db_handlersocket_result::fetch_row_from_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- tmp_str1.init_calc_mem(171);
- tmp_str2.init_calc_mem(173);
- tmp_table->field[0]->val_str(tmp_str1.get_str());
- tmp_table->field[1]->val_str(tmp_str2.get_str());
- tmp_str1.mem_calc();
- tmp_str2.mem_calc();
- row_ptr = tmp_str2.ptr();
- tmp_hs_row = (SPIDER_HS_STRING_REF *) tmp_str1.ptr();
- field_count = tmp_str1.length() / sizeof(SPIDER_HS_STRING_REF);
- row.hs_row = tmp_hs_row;
- row.field_count = field_count;
- row.hs_row_first = row.hs_row;
- for (i = 0; i < field_count; i++)
- {
- if (tmp_hs_row->begin())
- {
- uint length = tmp_hs_row->size();
- tmp_hs_row->set(row_ptr, length);
- row_ptr += length;
- }
- tmp_hs_row++;
- }
- row.row_size = row_ptr - tmp_str2.ptr();
- DBUG_RETURN((SPIDER_DB_ROW *) &row);
-}
-
-int spider_db_handlersocket_result::fetch_table_status(
- int mode,
- ha_statistics &stat
-) {
- DBUG_ENTER("spider_db_handlersocket_result::fetch_table_status");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_result::fetch_table_records(
- int mode,
- ha_rows &records
-) {
- DBUG_ENTER("spider_db_handlersocket_result::fetch_table_records");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_result::fetch_table_cardinality(
- int mode,
- TABLE *table,
- longlong *cardinality,
- uchar *cardinality_upd,
- int bitmap_size
-) {
- DBUG_ENTER("spider_db_handlersocket_result::fetch_table_cardinality");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_result::fetch_table_mon_status(
- int &status
-) {
- DBUG_ENTER("spider_db_handlersocket_result::fetch_table_mon_status");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-longlong spider_db_handlersocket_result::num_rows()
-{
- DBUG_ENTER("spider_db_handlersocket_result::num_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN((longlong) 0);
-}
-
-uint spider_db_handlersocket_result::num_fields()
-{
- DBUG_ENTER("spider_db_handlersocket_result::num_fields");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(field_count);
-}
-
-void spider_db_handlersocket_result::move_to_pos(
- longlong pos
-) {
- DBUG_ENTER("spider_db_handlersocket_result::move_to_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-
-int spider_db_handlersocket_result::get_errno()
-{
- DBUG_ENTER("spider_db_handlersocket_result::get_errno");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider store_error_num=%d", store_error_num));
- DBUG_RETURN(store_error_num);
-}
-
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
-int spider_db_handlersocket_result::fetch_columns_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_handlersocket_result::fetch_columns_for_discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
-}
-
-int spider_db_handlersocket_result::fetch_index_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_handlersocket_result::fetch_index_for_discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
-}
-
-int spider_db_handlersocket_result::fetch_table_for_discover_table_structure(
- spider_string *str,
- SPIDER_SHARE *spider_share,
- CHARSET_INFO *access_charset
-) {
- DBUG_ENTER("spider_db_handlersocket_result::fetch_table_for_discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
-}
-#endif
-
-spider_db_handlersocket::spider_db_handlersocket(
- SPIDER_CONN *conn
-) : spider_db_conn(conn),
- handler_open_array_inited(FALSE),
- request_key_req_first(NULL),
- request_key_req_last(NULL),
- request_key_snd_first(NULL),
- request_key_snd_last(NULL),
- request_key_reuse_first(NULL),
- request_key_reuse_last(NULL)
-{
- DBUG_ENTER("spider_db_handlersocket::spider_db_handlersocket");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifndef HANDLERSOCKET_MYSQL_UTIL
-#else
- hs_conn = NULL;
-#endif
- DBUG_VOID_RETURN;
-}
-
-spider_db_handlersocket::~spider_db_handlersocket()
-{
- st_spider_db_request_key *tmp_request_key;
- DBUG_ENTER("spider_db_handlersocket::~spider_db_handlersocket");
- DBUG_PRINT("info",("spider this=%p", this));
- if (handler_open_array_inited)
- {
- reset_opened_handler();
- spider_free_mem_calc(spider_current_trx,
- handler_open_array_id,
- handler_open_array.max_element *
- handler_open_array.size_of_element);
- delete_dynamic(&handler_open_array);
- }
- while (request_key_req_first)
- {
- tmp_request_key = request_key_req_first->next;
- spider_free(spider_current_trx, request_key_req_first, MYF(0));
- request_key_req_first = tmp_request_key;
- }
- while (request_key_snd_first)
- {
- tmp_request_key = request_key_snd_first->next;
- spider_free(spider_current_trx, request_key_snd_first, MYF(0));
- request_key_snd_first = tmp_request_key;
- }
- while (request_key_reuse_first)
- {
- tmp_request_key = request_key_reuse_first->next;
- spider_free(spider_current_trx, request_key_reuse_first, MYF(0));
- request_key_reuse_first = tmp_request_key;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_handlersocket::init()
-{
- DBUG_ENTER("spider_db_handlersocket::init");
- DBUG_PRINT("info",("spider this=%p", this));
- if (
- SPD_INIT_DYNAMIC_ARRAY2(&handler_open_array,
- sizeof(SPIDER_LINK_FOR_HASH *), NULL, 16, 16, MYF(MY_WME))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- spider_alloc_calc_mem_init(handler_open_array, 79);
- spider_alloc_calc_mem(spider_current_trx,
- handler_open_array,
- handler_open_array.max_element *
- handler_open_array.size_of_element);
- handler_open_array_inited = TRUE;
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::is_connected()
-{
- DBUG_ENTER("spider_db_handlersocket::is_connected");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifndef HANDLERSOCKET_MYSQL_UTIL
- DBUG_RETURN(hs_conn.operator->());
-#else
- DBUG_RETURN(hs_conn);
-#endif
-}
-
-void spider_db_handlersocket::bg_connect()
-{
- DBUG_ENTER("spider_db_handlersocket::bg_connect");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-int spider_db_handlersocket::connect(
- char *tgt_host,
- char *tgt_username,
- char *tgt_password,
- long tgt_port,
- char *tgt_socket,
- char *server_name,
- int connect_retry_count,
- longlong connect_retry_interval
-) {
- DBUG_ENTER("spider_db_handlersocket::connect");
- DBUG_PRINT("info",("spider this=%p", this));
- SPIDER_HS_SOCKARGS sockargs;
- sockargs.timeout = conn->connect_timeout;
- sockargs.recv_timeout = conn->net_read_timeout;
- sockargs.send_timeout = conn->net_write_timeout;
- if (conn->hs_sock)
- {
- sockargs.family = AF_UNIX;
- sockargs.set_unix_domain(conn->hs_sock);
- } else {
- char port_str[6];
- my_sprintf(port_str, (port_str, "%05ld", conn->hs_port));
- if (sockargs.resolve(conn->tgt_host, port_str) != 0)
- {
- my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
- conn->tgt_host);
- DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
- }
- }
-#ifndef HANDLERSOCKET_MYSQL_UTIL
- if (!(hs_conn.operator->()))
-#else
- if (!(hs_conn))
-#endif
- {
- hs_conn = SPIDER_HS_CONN_CREATE(sockargs);
- } else {
- hs_conn->reconnect();
- spider_db_hs_request_buf_reset(conn);
- }
-#ifndef HANDLERSOCKET_MYSQL_UTIL
- if (!(hs_conn.operator->()))
-#else
- if (!(hs_conn))
-#endif
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- while (hs_conn->get_error_code())
- {
- THD *thd = current_thd;
- if (
- !connect_retry_count ||
- (thd && thd->killed)
- ) {
- my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0),
- conn->tgt_host);
- DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE);
- }
- connect_retry_count--;
- my_sleep((ulong) connect_retry_interval);
- hs_conn->reconnect();
- }
- reset_request_key_req();
- reset_request_key_snd();
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::ping()
-{
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::ping");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if ((*hs_conn_p)->reconnect())
- {
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- DBUG_RETURN(ER_SPIDER_HS_NUM);
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
-
- reset_request_key_req();
- reset_request_key_snd();
- conn->opened_handlers = 0;
- conn->db_conn->reset_opened_handler();
- ++conn->connection_id;
- DBUG_RETURN(0);
-}
-
-void spider_db_handlersocket::bg_disconnect()
-{
- DBUG_ENTER("spider_db_handlersocket::bg_disconnect");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-void spider_db_handlersocket::disconnect()
-{
- DBUG_ENTER("spider_db_handlersocket::disconnect");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifndef HANDLERSOCKET_MYSQL_UTIL
- if (hs_conn.operator->())
-#else
- DBUG_PRINT("info",("spider hs_conn=%p", hs_conn));
- if (hs_conn)
-#endif
- {
- hs_conn->close();
-#ifndef HANDLERSOCKET_MYSQL_UTIL
- SPIDER_HS_CONN tmp_hs_conn;
- tmp_hs_conn = hs_conn;
-#else
- delete hs_conn;
- hs_conn = NULL;
-#endif
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_handlersocket::set_net_timeout()
-{
- DBUG_ENTER("spider_db_handlersocket::set_net_timeout");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(hs_conn->set_timeout(
- conn->net_write_timeout,
- conn->net_read_timeout
- ));
-}
-
-int spider_db_handlersocket::exec_query(
- const char *query,
- uint length,
- int quick_mode
-) {
- DBUG_ENTER("spider_db_handlersocket::query");
- DBUG_PRINT("info",("spider this=%p", this));
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
-#ifndef HANDLERSOCKET_MYSQL_UTIL
- DBUG_PRINT("info", ("spider hs_conn %p", hs_conn.operator->()));
-#else
- DBUG_PRINT("info", ("spider hs_conn %p", hs_conn));
-#endif
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if (spider_param_general_log())
- {
- const char *tgt_str = conn->hs_sock ? conn->hs_sock : conn->tgt_host;
- uint32 tgt_len = strlen(tgt_str);
- spider_string tmp_query_str((*hs_conn_p)->get_writebuf_size() +
- conn->tgt_wrapper_length +
- tgt_len + (SPIDER_SQL_SPACE_LEN * 2));
- tmp_query_str.init_calc_mem(231);
- tmp_query_str.length(0);
- tmp_query_str.q_append(conn->tgt_wrapper, conn->tgt_wrapper_length);
- tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- tmp_query_str.q_append(tgt_str, tgt_len);
- tmp_query_str.q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- tmp_query_str.q_append((*hs_conn_p)->get_writebuf_begin(),
- (*hs_conn_p)->get_writebuf_size());
- general_log_write(current_thd, COM_QUERY, tmp_query_str.ptr(),
- tmp_query_str.length());
- }
- if ((*hs_conn_p)->request_send() < 0)
- {
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- DBUG_RETURN(ER_SPIDER_HS_NUM);
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- move_request_key_to_snd();
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::get_errno()
-{
- DBUG_ENTER("spider_db_handlersocket::get_errno");
- DBUG_PRINT("info",("spider this=%p", this));
- stored_error = hs_conn->get_error_code();
- DBUG_PRINT("info",("spider stored_error=%d", stored_error));
- DBUG_RETURN(stored_error);
-}
-
-const char *spider_db_handlersocket::get_error()
-{
- const char *error_ptr;
- DBUG_ENTER("spider_db_handlersocket::get_error");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifndef HANDLERSOCKET_MYSQL_UTIL
- error_ptr = hs_conn->get_error().c_str();
-#else
- error_ptr = hs_conn->get_error().c_ptr();
-#endif
- DBUG_PRINT("info",("spider error=%s", error_ptr));
- DBUG_RETURN(error_ptr);
-}
-
-bool spider_db_handlersocket::is_server_gone_error(
- int error_num
-) {
- bool server_gone;
- DBUG_ENTER("spider_db_handlersocket::is_server_gone_error");
- DBUG_PRINT("info",("spider this=%p", this));
- server_gone = (hs_conn->get_error_code() < 0);
- DBUG_PRINT("info",("spider server_gone=%s", server_gone ? "TRUE" : "FALSE"));
- DBUG_RETURN(server_gone);
-}
-
-bool spider_db_handlersocket::is_dup_entry_error(
- int error_num
-) {
- bool dup_entry;
- DBUG_ENTER("spider_db_handlersocket::is_dup_entry_error");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifndef HANDLERSOCKET_MYSQL_UTIL
- const char *c_str = hs_conn->get_error().c_str();
-#else
- const char *c_str = hs_conn->get_error().c_ptr_safe();
-#endif
- dup_entry =
- (
- c_str[0] == '1' &&
- c_str[1] == '2' &&
- c_str[2] == '1' &&
- c_str[3] == '\0'
- );
- DBUG_PRINT("info",("spider dup_entry=%s", dup_entry ? "TRUE" : "FALSE"));
- DBUG_RETURN(dup_entry);
-}
-
-bool spider_db_handlersocket::is_xa_nota_error(
- int error_num
-) {
- bool xa_nota;
- DBUG_ENTER("spider_db_handlersocket::is_xa_nota_error");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- xa_nota = (stored_error == ER_XAER_NOTA);
- DBUG_PRINT("info",("spider xa_nota=%s", xa_nota ? "TRUE" : "FALSE"));
- DBUG_RETURN(xa_nota);
-}
-
-spider_db_result *spider_db_handlersocket::store_result(
- spider_db_result_buffer **spider_res_buf,
- st_spider_db_request_key *request_key,
- int *error_num
-) {
- int internal_error;
- spider_db_handlersocket_result *result;
- spider_db_handlersocket_result_buffer *hs_res_buf;
- DBUG_ENTER("spider_db_handlersocket::store_result");
- DBUG_PRINT("info",("spider this=%p", this));
- if (*spider_res_buf)
- {
- hs_res_buf = (spider_db_handlersocket_result_buffer *) *spider_res_buf;
- } else {
- if (!(hs_res_buf = new spider_db_handlersocket_result_buffer()))
- {
- *error_num = HA_ERR_OUT_OF_MEM;
- DBUG_RETURN(NULL);
- }
- *spider_res_buf = (spider_db_result_buffer *) hs_res_buf;
- }
- hs_res_buf->clear();
- if (!(result = new spider_db_handlersocket_result(this)))
- {
- *error_num = HA_ERR_OUT_OF_MEM;
- DBUG_RETURN(NULL);
- }
- *error_num = 0;
- result->hs_conn_p = &hs_conn;
- size_t num_fields;
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- if (request_key)
- {
- int tmp_res, tmp_err = (*hs_conn_p)->get_error_code();
- while ((tmp_res = check_request_key(request_key)) == 1)
- {
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if ((internal_error = (*hs_conn_p)->response_recv(num_fields)))
- {
- if (!tmp_err && internal_error > 0)
- {
- (*hs_conn_p)->clear_error();
- } else {
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
-#ifndef DBUG_OFF
- if ((*hs_conn_p)->get_response_end_offset() > 0 &&
- (*hs_conn_p)->get_readbuf_begin())
- {
- char tmp_buf[MAX_FIELD_WIDTH];
- String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
- tmp_str.length(0);
- tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
- (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
- DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
- (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
- }
-#endif
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if (internal_error > 0)
- {
- (*hs_conn_p)->response_buf_remove();
- if ((*hs_conn_p)->get_error_code())
- {
- DBUG_PRINT("info",("spider hs %d %s",
- (*hs_conn_p)->get_error_code(),
- (*hs_conn_p)->get_error().ptr()));
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->clear_error();
- }
- delete result;
- DBUG_RETURN(NULL);
- }
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->response_buf_remove();
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- }
- if (tmp_res == -1)
- {
- DBUG_PRINT("info",("spider ER_SPIDER_REQUEST_KEY_NUM"));
- *error_num = ER_SPIDER_REQUEST_KEY_NUM;
- DBUG_RETURN(NULL);
- }
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if (
- (internal_error = (*hs_conn_p)->response_recv(num_fields)) ||
- (*error_num = (*hs_conn_p)->get_result(hs_res_buf->hs_result))
- ) {
- if (*error_num)
- {
- *error_num = HA_ERR_OUT_OF_MEM;
- }
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
-#ifndef DBUG_OFF
- if ((*hs_conn_p)->get_response_end_offset() > 0 &&
- (*hs_conn_p)->get_readbuf_begin())
- {
- char tmp_buf[MAX_FIELD_WIDTH];
- String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
- tmp_str.length(0);
- tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
- (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
- DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
- (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
- }
-#endif
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if (internal_error > 0)
- {
- (*hs_conn_p)->response_buf_remove();
- if ((*hs_conn_p)->get_error_code())
- {
- DBUG_PRINT("info",("spider hs %d %s",
- (*hs_conn_p)->get_error_code(),
- (*hs_conn_p)->get_error().ptr()));
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- }
- delete result;
- DBUG_RETURN(NULL);
- }
-#ifndef DBUG_OFF
- if ((*hs_conn_p)->get_response_end_offset() > 0 &&
- (*hs_conn_p)->get_readbuf_begin())
- {
- char tmp_buf[MAX_FIELD_WIDTH];
- String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
- tmp_str.length(0);
- tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
- (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
- DBUG_PRINT("info",("spider hs readbuf02 size=%zu str=%s",
- (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
- }
-#endif
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->response_buf_remove();
- if ((*hs_conn_p)->get_error_code())
- {
- DBUG_PRINT("info",("spider hs %d %s",
- (*hs_conn_p)->get_error_code(),
- (*hs_conn_p)->get_error().ptr()));
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- field_count = (uint) num_fields;
- result->field_count = field_count;
- DBUG_RETURN(result);
-}
-
-spider_db_result *spider_db_handlersocket::use_result(
- ha_spider *spider,
- st_spider_db_request_key *request_key,
- int *error_num
-) {
- int internal_error;
- spider_db_handlersocket_result *result;
- DBUG_ENTER("spider_db_handlersocket::use_result");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(result = new spider_db_handlersocket_result(this)))
- {
- *error_num = HA_ERR_OUT_OF_MEM;
- DBUG_RETURN(NULL);
- }
- *error_num = 0;
- result->hs_conn_p = &hs_conn;
- size_t num_fields;
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- if (request_key)
- {
- int tmp_res, tmp_err = (*hs_conn_p)->get_error_code();
- while ((tmp_res = check_request_key(request_key)) == 1)
- {
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if ((internal_error = (*hs_conn_p)->response_recv(num_fields)))
- {
- if (!tmp_err && internal_error > 0)
- {
- (*hs_conn_p)->clear_error();
- } else {
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
-#ifndef DBUG_OFF
- if ((*hs_conn_p)->get_response_end_offset() > 0 &&
- (*hs_conn_p)->get_readbuf_begin())
- {
- char tmp_buf[MAX_FIELD_WIDTH];
- String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
- tmp_str.length(0);
- tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
- (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
- DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
- (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
- }
-#endif
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if (internal_error > 0)
- {
- (*hs_conn_p)->response_buf_remove();
- if ((*hs_conn_p)->get_error_code())
- {
- DBUG_PRINT("info",("spider hs %d %s",
- (*hs_conn_p)->get_error_code(),
- (*hs_conn_p)->get_error().ptr()));
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->clear_error();
- }
- delete result;
- DBUG_RETURN(NULL);
- }
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->response_buf_remove();
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- }
- if (tmp_res == -1)
- {
- DBUG_PRINT("info",("spider ER_SPIDER_REQUEST_KEY_NUM"));
- *error_num = ER_SPIDER_REQUEST_KEY_NUM;
- DBUG_RETURN(NULL);
- }
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if (
- (internal_error = (*hs_conn_p)->response_recv(num_fields))
- ) {
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
-#ifndef DBUG_OFF
- if ((*hs_conn_p)->get_response_end_offset() > 0 &&
- (*hs_conn_p)->get_readbuf_begin())
- {
- char tmp_buf[MAX_FIELD_WIDTH];
- String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
- tmp_str.length(0);
- tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
- (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
- DBUG_PRINT("info",("spider hs readbuf01 size=%zu str=%s",
- (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
- }
-#endif
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if (internal_error > 0)
- {
- (*hs_conn_p)->response_buf_remove();
- if ((*hs_conn_p)->get_error_code())
- {
- DBUG_PRINT("info",("spider hs %d %s",
- (*hs_conn_p)->get_error_code(),
- (*hs_conn_p)->get_error().ptr()));
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- }
- delete result;
- DBUG_RETURN(NULL);
- }
-#ifndef DBUG_OFF
- if ((*hs_conn_p)->get_response_end_offset() > 0 &&
- (*hs_conn_p)->get_readbuf_begin())
- {
- char tmp_buf[MAX_FIELD_WIDTH];
- String tmp_str(tmp_buf, MAX_FIELD_WIDTH, &my_charset_bin);
- tmp_str.length(0);
- tmp_str.append((*hs_conn_p)->get_readbuf_begin(),
- (*hs_conn_p)->get_response_end_offset(), &my_charset_bin);
- DBUG_PRINT("info",("spider hs readbuf02 size=%zu str=%s",
- (*hs_conn_p)->get_response_end_offset(), tmp_str.c_ptr_safe()));
- }
-#endif
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- field_count = (uint) num_fields;
- result->field_count = field_count;
- DBUG_RETURN(result);
-}
-
-int spider_db_handlersocket::next_result()
-{
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::next_result");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- if ((*hs_conn_p)->stable_point())
- DBUG_RETURN(-1);
- DBUG_RETURN(0);
-}
-
-uint spider_db_handlersocket::affected_rows()
-{
- int error_num;
- const SPIDER_HS_STRING_REF *hs_row;
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::affected_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- if (
- field_count != 1 ||
- !(hs_row = (*hs_conn_p)->get_next_row()) ||
- !hs_row->begin()
- ) {
- DBUG_RETURN(0);
- }
- DBUG_RETURN((uint) my_strtoll10(hs_row->begin(), (char**) NULL, &error_num));
-}
-
-uint spider_db_handlersocket::matched_rows()
-{
- DBUG_ENTER("spider_db_handlersocket::matched_rows");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::inserted_info(
- spider_db_handler *handler,
- ha_copy_info *copy_info
-) {
- DBUG_ENTER("spider_db_handlersocket::inserted_info");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-ulonglong spider_db_handlersocket::last_insert_id()
-{
- DBUG_ENTER("spider_db_handlersocket::last_insert_id");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::set_character_set(
- const char *csname
-) {
- DBUG_ENTER("spider_db_handlersocket::set_character_set");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::select_db(
- const char *dbname
-) {
- DBUG_ENTER("spider_db_handlersocket::select_db");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::consistent_snapshot(
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::consistent_snapshot");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::trx_start_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_handlersocket::trx_start_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_handlersocket::start_transaction(
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::start_transaction");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::commit(
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::commit");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::rollback(
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::rollback");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::xa_start_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_handlersocket::xa_start_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_handlersocket::xa_start(
- XID *xid,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::xa_start");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::xa_end(
- XID *xid,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::xa_end");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::xa_prepare(
- XID *xid,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::xa_prepare");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::xa_commit(
- XID *xid,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::xa_commit");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::xa_rollback(
- XID *xid,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::xa_rollback");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::set_trx_isolation_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_handlersocket::set_trx_isolation_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_handlersocket::set_trx_isolation(
- int trx_isolation,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::set_trx_isolation");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::set_autocommit_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_handlersocket::set_autocommit_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_handlersocket::set_autocommit(
- bool autocommit,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::set_autocommit");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::set_sql_log_off_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_handlersocket::set_sql_log_off_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_handlersocket::set_sql_log_off(
- bool sql_log_off,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::set_sql_log_off");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::set_wait_timeout_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_handlersocket::set_wait_timeout_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_handlersocket::set_wait_timeout(
- int wait_timeout,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::set_wait_timeout");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::set_sql_mode_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_handlersocket::set_sql_mode_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_handlersocket::set_sql_mode(
- sql_mode_t sql_mode,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::set_sql_mode");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::set_time_zone_in_bulk_sql()
-{
- DBUG_ENTER("spider_db_handlersocket::set_time_zone_in_bulk_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_handlersocket::set_time_zone(
- Time_zone *time_zone,
- int *need_mon
-) {
- DBUG_ENTER("spider_db_handlersocket::set_time_zone");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::show_master_status(
- SPIDER_TRX *trx,
- SPIDER_SHARE *share,
- int all_link_idx,
- int *need_mon,
- TABLE *table,
- spider_string *str,
- int mode,
- SPIDER_DB_RESULT **res1,
- SPIDER_DB_RESULT **res2
-) {
- DBUG_ENTER("spider_db_handlersocket::show_master_status");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
-) {
- int error_num;
- size_t req_num;
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::append_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = append_request_key(request_key)))
- DBUG_RETURN(error_num);
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- if (!(req_num = (*hs_conn_p)->request_buf_append(sql, sql + sql_length)))
- {
- DBUG_PRINT("info",("spider hs %d %s",
- (*hs_conn_p)->get_error_code(),
- (*hs_conn_p)->get_error().ptr()));
- (*hs_conn_p)->write_error_to_log(__func__, __FILE__, __LINE__);
- DBUG_RETURN((*hs_conn_p)->get_error_code());
- }
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- while (req_num > 1)
- {
- if ((error_num = append_request_key(request_key)))
- DBUG_RETURN(error_num);
- --req_num;
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::append_open_handler(
- uint handler_id,
- const char *db_name,
- const char *table_name,
- const char *index_name,
- const char *sql,
- st_spider_db_request_key *request_key
-) {
- int error_num;
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::append_open_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = append_request_key(request_key)))
- DBUG_RETURN(error_num);
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->request_buf_open_index(
- handler_id,
- db_name,
- table_name,
- index_name,
- sql
- );
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::append_select(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
-) {
- int error_num;
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::append_select");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = append_request_key(request_key)))
- DBUG_RETURN(error_num);
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->request_buf_exec_generic(
- handler_id,
- SPIDER_HS_STRING_REF(sql->ptr(), sql->length()),
- keys->ptr(), (size_t) keys->size(),
- limit, skip,
- SPIDER_HS_STRING_REF(),
- NULL, 0);
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
-) {
- int error_num;
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::append_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = append_request_key(request_key)))
- DBUG_RETURN(error_num);
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->request_buf_exec_generic(
- handler_id,
- SPIDER_HS_STRING_REF(SPIDER_SQL_HS_INSERT_STR, SPIDER_SQL_HS_INSERT_LEN),
- upds->ptr(), (size_t) upds->size(),
- 0, 0,
- SPIDER_HS_STRING_REF(), NULL, 0);
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::append_update(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- int limit,
- int skip,
- bool increment,
- bool decrement,
- st_spider_db_request_key *request_key
-) {
- int error_num;
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = append_request_key(request_key)))
- DBUG_RETURN(error_num);
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->request_buf_exec_generic(
- handler_id,
- SPIDER_HS_STRING_REF(sql->ptr(), sql->length()),
- keys->ptr(), (size_t) keys->size(),
- limit, skip,
- increment ?
- SPIDER_HS_STRING_REF(SPIDER_SQL_HS_INCREMENT_STR,
- SPIDER_SQL_HS_INCREMENT_LEN) :
- decrement ?
- SPIDER_HS_STRING_REF(SPIDER_SQL_HS_DECREMENT_STR,
- SPIDER_SQL_HS_DECREMENT_LEN) :
- SPIDER_HS_STRING_REF(SPIDER_SQL_HS_UPDATE_STR,
- SPIDER_SQL_HS_UPDATE_LEN),
- upds->ptr(), (size_t) upds->size()
- );
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::append_delete(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
-) {
- int error_num;
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = append_request_key(request_key)))
- DBUG_RETURN(error_num);
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->request_buf_exec_generic(
- handler_id,
- SPIDER_HS_STRING_REF(sql->ptr(), sql->length()),
- keys->ptr(), (size_t) keys->size(),
- limit, skip,
- SPIDER_HS_STRING_REF(SPIDER_SQL_HS_DELETE_STR, SPIDER_SQL_HS_DELETE_LEN),
- NULL, 0);
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- DBUG_RETURN(0);
-}
-
-void spider_db_handlersocket::reset_request_queue()
-{
- SPIDER_HS_CONN *hs_conn_p = &hs_conn;
- DBUG_ENTER("spider_db_handlersocket::reset_request_queue");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider hs hs_conn=%p", hs_conn_p));
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- (*hs_conn_p)->request_reset();
- DBUG_PRINT("info",("spider hs num_req_bufd=%zu",
- (*hs_conn_p)->get_num_req_bufd()));
- DBUG_PRINT("info",("spider hs num_req_sent=%zu",
- (*hs_conn_p)->get_num_req_sent()));
- DBUG_PRINT("info",("spider hs num_req_rcvd=%zu",
- (*hs_conn_p)->get_num_req_rcvd()));
- DBUG_PRINT("info",("spider hs response_end_offset=%zu",
- (*hs_conn_p)->get_response_end_offset()));
- reset_request_key_req();
- DBUG_VOID_RETURN;
-}
-
-size_t spider_db_handlersocket::escape_string(
- char *to,
- const char *from,
- size_t from_length
-) {
- DBUG_ENTER("spider_db_handlersocket::escape_string");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- memcpy(to, from, from_length);
- DBUG_RETURN(from_length);
-}
-
-bool spider_db_handlersocket::have_lock_table_list()
-{
- DBUG_ENTER("spider_db_handlersocket::have_lock_table_list");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(FALSE);
-}
-
-int spider_db_handlersocket::append_lock_tables(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket::lock_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket::append_unlock_tables(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket::append_unlock_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-uint spider_db_handlersocket::get_lock_table_hash_count()
-{
- DBUG_ENTER("spider_db_handlersocket::get_lock_table_hash_count");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-void spider_db_handlersocket::reset_lock_table_hash()
-{
- DBUG_ENTER("spider_db_handlersocket::reset_lock_table_hash");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-
-uint spider_db_handlersocket::get_opened_handler_count()
-{
- DBUG_ENTER("spider_db_handlersocket::get_opened_handler_count");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(handler_open_array.elements);
-}
-
-void spider_db_handlersocket::reset_opened_handler()
-{
- ha_spider *tmp_spider;
- int tmp_link_idx;
- SPIDER_LINK_FOR_HASH **tmp_link_for_hash;
- DBUG_ENTER("spider_db_handlersocket::reset_opened_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- while ((tmp_link_for_hash =
- (SPIDER_LINK_FOR_HASH **) pop_dynamic(&handler_open_array)))
- {
- tmp_spider = (*tmp_link_for_hash)->spider;
- tmp_link_idx = (*tmp_link_for_hash)->link_idx;
- tmp_spider->clear_handler_opened(tmp_link_idx, conn->conn_kind);
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_db_handlersocket::set_dup_key_idx(
- ha_spider *spider,
- int link_idx
-) {
- DBUG_ENTER("spider_db_handlersocket::set_dup_key_idx");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-
-int spider_db_handlersocket::append_request_key(
- st_spider_db_request_key *request_key
-) {
- st_spider_db_request_key *tmp_request_key;
- DBUG_ENTER("spider_db_handlersocket::append_request_key");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider request_key=%p", request_key));
- if (request_key)
- {
- DBUG_PRINT("info",("spider request_key->spider_thread_id=%llu",
- request_key->spider_thread_id));
- DBUG_PRINT("info",("spider request_key->query_id=%llu",
- request_key->query_id));
- DBUG_PRINT("info",("spider request_key->handler=%p",
- request_key->handler));
- DBUG_PRINT("info",("spider request_key->request_id=%llu",
- request_key->request_id));
- if (request_key_reuse_first)
- {
- tmp_request_key = request_key_reuse_first;
- request_key_reuse_first = request_key_reuse_first->next;
- if (!request_key_reuse_first)
- request_key_reuse_last = NULL;
- } else {
- if (!(tmp_request_key = (st_spider_db_request_key *)
- spider_malloc(spider_current_trx, 1, sizeof(st_spider_db_request_key),
- MYF(MY_WME)))
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- *tmp_request_key = *request_key;
- tmp_request_key->next = NULL;
- if (request_key_req_last)
- request_key_req_last->next = tmp_request_key;
- else
- request_key_req_first = tmp_request_key;
- request_key_req_last = tmp_request_key;
- }
- DBUG_RETURN(0);
-}
-
-void spider_db_handlersocket::reset_request_key_req()
-{
- DBUG_ENTER("spider_db_handlersocket::reset_request_key_req");
- DBUG_PRINT("info",("spider this=%p", this));
- if (request_key_req_first)
- {
- if (request_key_reuse_last)
- request_key_reuse_last->next = request_key_req_first;
- else
- request_key_reuse_first = request_key_req_first;
- request_key_reuse_last = request_key_req_last;
- request_key_req_first = NULL;
- request_key_req_last = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_db_handlersocket::reset_request_key_snd()
-{
- DBUG_ENTER("spider_db_handlersocket::reset_request_key_snd");
- DBUG_PRINT("info",("spider this=%p", this));
- if (request_key_snd_first)
- {
- if (request_key_reuse_last)
- request_key_reuse_last->next = request_key_snd_first;
- else
- request_key_reuse_first = request_key_snd_first;
- request_key_reuse_last = request_key_snd_last;
- request_key_snd_first = NULL;
- request_key_snd_last = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-void spider_db_handlersocket::move_request_key_to_snd()
-{
- DBUG_ENTER("spider_db_handlersocket::move_request_key_to_snd");
- DBUG_PRINT("info",("spider this=%p", this));
- if (request_key_req_first)
- {
- if (request_key_snd_last)
- request_key_snd_last->next = request_key_req_first;
- else
- request_key_snd_first = request_key_req_first;
- request_key_snd_last = request_key_req_last;
- request_key_req_first = NULL;
- request_key_req_last = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_db_handlersocket::check_request_key(
- st_spider_db_request_key *request_key
-) {
- st_spider_db_request_key *tmp_request_key;
- DBUG_ENTER("spider_db_handlersocket::check_request_key");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider request_key=%p", request_key));
- DBUG_PRINT("info",("spider request_key_snd_first=%p",
- request_key_snd_first));
- if (!request_key_snd_first)
- {
- DBUG_PRINT("info",("spider -1"));
- DBUG_RETURN(-1);
- }
- tmp_request_key = request_key_snd_first;
- request_key_snd_first = request_key_snd_first->next;
- if (!request_key_snd_first)
- request_key_snd_last = NULL;
- tmp_request_key->next = NULL;
- if (request_key_reuse_last)
- request_key_reuse_last->next = tmp_request_key;
- else
- request_key_reuse_first = tmp_request_key;
- request_key_reuse_last = tmp_request_key;
-
- DBUG_PRINT("info",("spider tmp_request_key->spider_thread_id=%llu",
- tmp_request_key->spider_thread_id));
- DBUG_PRINT("info",("spider request_key->spider_thread_id=%llu",
- request_key->spider_thread_id));
- DBUG_PRINT("info",("spider tmp_request_key->query_id=%llu",
- tmp_request_key->query_id));
- DBUG_PRINT("info",("spider request_key->query_id=%llu",
- request_key->query_id));
- DBUG_PRINT("info",("spider tmp_request_key->handler=%p",
- tmp_request_key->handler));
- DBUG_PRINT("info",("spider request_key->handler=%p",
- request_key->handler));
- DBUG_PRINT("info",("spider tmp_request_key->request_id=%llu",
- tmp_request_key->request_id));
- DBUG_PRINT("info",("spider request_key->request_id=%llu",
- request_key->request_id));
- if (
- tmp_request_key->spider_thread_id != request_key->spider_thread_id ||
- tmp_request_key->query_id != request_key->query_id ||
- tmp_request_key->handler != request_key->handler ||
- tmp_request_key->request_id != request_key->request_id
- ) {
- DBUG_PRINT("info",("spider 1"));
- DBUG_RETURN(1);
- }
- DBUG_PRINT("info",("spider 0"));
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket::cmp_request_key_to_snd(
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_handlersocket::cmp_request_key_to_snd");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info",("spider request_key=%p", request_key));
- if (
- !request_key
- ) {
- DBUG_PRINT("info",("spider TRUE"));
- DBUG_RETURN(TRUE);
- }
- DBUG_PRINT("info",("spider request_key_snd_first=%p",
- request_key_snd_first));
- if (
- !request_key_snd_first
- ) {
- DBUG_PRINT("info",("spider FALSE"));
- DBUG_RETURN(FALSE);
- }
- DBUG_PRINT("info",("spider request_key_snd_first->spider_thread_id=%llu",
- request_key_snd_first->spider_thread_id));
- DBUG_PRINT("info",("spider request_key->spider_thread_id=%llu",
- request_key->spider_thread_id));
- DBUG_PRINT("info",("spider request_key_snd_first->query_id=%llu",
- request_key_snd_first->query_id));
- DBUG_PRINT("info",("spider request_key->query_id=%llu",
- request_key->query_id));
- DBUG_PRINT("info",("spider request_key_snd_first->handler=%p",
- request_key_snd_first->handler));
- DBUG_PRINT("info",("spider request_key->handler=%p",
- request_key->handler));
- DBUG_PRINT("info",("spider request_key_snd_first->request_id=%llu",
- request_key_snd_first->request_id));
- DBUG_PRINT("info",("spider request_key->request_id=%llu",
- request_key->request_id));
- if (
- request_key_snd_first->spider_thread_id != request_key->spider_thread_id ||
- request_key_snd_first->query_id != request_key->query_id ||
- request_key_snd_first->handler != request_key->handler ||
- request_key_snd_first->request_id != request_key->request_id
- ) {
- DBUG_PRINT("info",("spider FALSE"));
- DBUG_RETURN(FALSE);
- }
- DBUG_PRINT("info",("spider TRUE"));
- DBUG_RETURN(TRUE);
-}
-
-spider_db_handlersocket_util::spider_db_handlersocket_util() : spider_db_util()
-{
- DBUG_ENTER("spider_db_handlersocket_util::spider_db_handlersocket_util");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-spider_db_handlersocket_util::~spider_db_handlersocket_util()
-{
- DBUG_ENTER("spider_db_handlersocket_util::~spider_db_handlersocket_util");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_VOID_RETURN;
-}
-
-int spider_db_handlersocket_util::append_name(
- spider_string *str,
- const char *name,
- uint name_length
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_name");
- str->q_append(name, name_length);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_name_with_charset(
- spider_string *str,
- const char *name,
- uint name_length,
- CHARSET_INFO *name_charset
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_name_with_charset");
- if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->append(name, name_length, name_charset);
- if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_escaped_name(
- spider_string *str,
- const char *name,
- uint name_length
-) {
- int error_num;
- DBUG_ENTER("spider_db_handlersocket_util::append_name");
- if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str_internal(
- str, name, name_length, dbton_id)))
- {
- DBUG_RETURN(error_num);
- }
- if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_escaped_name_with_charset(
- spider_string *str,
- const char *name,
- uint name_length,
- CHARSET_INFO *name_charset
-) {
- int error_num;
- DBUG_ENTER("spider_db_handlersocket_util::append_name_with_charset");
- if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2 + name_length * 2))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- if ((error_num = spider_db_append_name_with_quote_str_internal(
- str, name, name_length, name_charset, dbton_id)))
- {
- DBUG_RETURN(error_num);
- }
- if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- DBUG_RETURN(0);
-}
-
-bool spider_db_handlersocket_util::is_name_quote(
- const char head_code
-) {
- DBUG_ENTER("spider_db_handlersocket_util::is_name_quote");
- DBUG_RETURN(head_code == *name_quote_str);
-}
-
-int spider_db_handlersocket_util::append_escaped_name_quote(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_escaped_name_quote");
- if (str->reserve(SPIDER_SQL_NAME_QUOTE_LEN * 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- str->q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_column_value(
- ha_spider *spider,
- spider_string *str,
- Field *field,
- const uchar *new_ptr,
- CHARSET_INFO *access_charset
-) {
- char buf[MAX_FIELD_WIDTH];
- spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin);
- String *ptr;
- uint length;
- DBUG_ENTER("spider_db_handlersocket_util::append_column_value");
- tmp_str.init_calc_mem(180);
-
- if (new_ptr)
- {
- if (
- field->type() == MYSQL_TYPE_BLOB ||
- field->real_type() == MYSQL_TYPE_VARCHAR
- ) {
- length = uint2korr(new_ptr);
- tmp_str.set((char *) new_ptr + HA_KEY_BLOB_LENGTH, length,
- &my_charset_bin);
- ptr = tmp_str.get_str();
- } else if (field->type() == MYSQL_TYPE_GEOMETRY)
- {
-/*
- uint mlength = SIZEOF_STORED_DOUBLE, lcnt;
- uchar *dest = (uchar *) buf;
- const uchar *source;
- for (lcnt = 0; lcnt < 4; lcnt++)
- {
- mlength = SIZEOF_STORED_DOUBLE;
- source = new_ptr + mlength + SIZEOF_STORED_DOUBLE * lcnt;
- while (mlength--)
- *dest++ = *--source;
- }
- tmp_str.length(SIZEOF_STORED_DOUBLE * lcnt);
-*/
- double xmin, xmax, ymin, ymax;
-/*
- float8store(buf,xmin);
- float8store(buf+8,xmax);
- float8store(buf+16,ymin);
- float8store(buf+24,ymax);
- memcpy(&xmin,new_ptr,sizeof(xmin));
- memcpy(&xmax,new_ptr + 8,sizeof(xmax));
- memcpy(&ymin,new_ptr + 16,sizeof(ymin));
- memcpy(&ymax,new_ptr + 24,sizeof(ymax));
- float8get(xmin, buf);
- float8get(xmax, buf + 8);
- float8get(ymin, buf + 16);
- float8get(ymax, buf + 24);
- DBUG_PRINT("info", ("spider geo is %f %f %f %f",
- xmin, xmax, ymin, ymax));
- DBUG_PRINT("info", ("spider geo is %.14g %.14g %.14g %.14g",
- xmin, xmax, ymin, ymax));
-*/
- float8get(xmin, new_ptr);
- float8get(xmax, new_ptr + 8);
- float8get(ymin, new_ptr + 16);
- float8get(ymax, new_ptr + 24);
- DBUG_PRINT("info", ("spider geo is %f %f %f %f",
- xmin, xmax, ymin, ymax));
-/*
- float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 4);
- float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 5);
- float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 6);
- float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 7);
- DBUG_PRINT("info", ("spider geo is %f %f %f %f",
- xmin, xmax, ymin, ymax));
- float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 8);
- float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 9);
- float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 10);
- float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 11);
- DBUG_PRINT("info", ("spider geo is %f %f %f %f",
- xmin, xmax, ymin, ymax));
- float8get(xmin, new_ptr + SIZEOF_STORED_DOUBLE * 12);
- float8get(xmax, new_ptr + SIZEOF_STORED_DOUBLE * 13);
- float8get(ymin, new_ptr + SIZEOF_STORED_DOUBLE * 14);
- float8get(ymax, new_ptr + SIZEOF_STORED_DOUBLE * 15);
- DBUG_PRINT("info", ("spider geo is %f %f %f %f",
- xmin, xmax, ymin, ymax));
-*/
-/*
- tmp_str.set((char *) new_ptr, SIZEOF_STORED_DOUBLE * 4,
- &my_charset_bin);
-*/
- tmp_str.length(0);
- tmp_str.q_append((char *) SPIDER_SQL_LINESTRING_HEAD_STR,
- SPIDER_SQL_LINESTRING_HEAD_LEN);
- tmp_str.q_append((char *) new_ptr, SIZEOF_STORED_DOUBLE);
- tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 2,
- SIZEOF_STORED_DOUBLE);
- tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE,
- SIZEOF_STORED_DOUBLE);
- tmp_str.q_append((char *) new_ptr + SIZEOF_STORED_DOUBLE * 3,
- SIZEOF_STORED_DOUBLE);
- ptr = tmp_str.get_str();
- } else {
- ptr = field->val_str(tmp_str.get_str(), new_ptr);
- tmp_str.mem_calc();
- }
- } else {
- ptr = field->val_str(tmp_str.get_str());
- tmp_str.mem_calc();
- }
- DBUG_PRINT("info", ("spider field->type() is %d", field->type()));
- DBUG_PRINT("info", ("spider ptr->length() is %d", ptr->length()));
-/*
- if (
- field->type() == MYSQL_TYPE_BIT ||
- (field->type() >= MYSQL_TYPE_TINY_BLOB &&
- field->type() <= MYSQL_TYPE_BLOB)
- ) {
- uchar *hex_ptr = (uchar *) ptr->ptr(), *end_ptr;
- char *str_ptr;
- DBUG_PRINT("info", ("spider HEX"));
- if (str->reserve(SPIDER_SQL_HEX_LEN + ptr->length() * 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_HEX_STR, SPIDER_SQL_HEX_LEN);
- str_ptr = (char *) str->ptr() + str->length();
- for (end_ptr = hex_ptr + ptr->length(); hex_ptr < end_ptr; hex_ptr++)
- {
- *str_ptr++ = spider_dig_upper[(*hex_ptr) >> 4];
- *str_ptr++ = spider_dig_upper[(*hex_ptr) & 0x0F];
- }
- str->length(str->length() + ptr->length() * 2);
- } else
-*/
- spider_handlersocket_handler *hs_handler = (spider_handlersocket_handler *)
- spider->dbton_handler[spider_dbton_handlersocket.dbton_id];
- spider_string *hs_str;
- if (!(hs_str = hs_handler->hs_strs.add(
- &hs_handler->hs_strs_pos, ptr->ptr(), ptr->length())))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- SPIDER_HS_STRING_REF ref =
- SPIDER_HS_STRING_REF(hs_str->ptr(), hs_str->length());
- if (hs_handler->hs_adding_keys)
- {
- DBUG_PRINT("info", ("spider add to key:%s", hs_str->c_ptr_safe()));
- hs_handler->hs_keys.push_back(ref);
- } else {
- DBUG_PRINT("info", ("spider add to upd:%s", hs_str->c_ptr_safe()));
- hs_handler->hs_upds.push_back(ref);
- }
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_trx_isolation(
- spider_string *str,
- int trx_isolation
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_trx_isolation");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_autocommit(
- spider_string *str,
- bool autocommit
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_autocommit");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_sql_log_off(
- spider_string *str,
- bool sql_log_off
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_sql_log_off");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_wait_timeout(
- spider_string *str,
- int wait_timeout
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_wait_timeout");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_sql_mode(
- spider_string *str,
- sql_mode_t sql_mode
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_sql_mode");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_time_zone(
- spider_string *str,
- Time_zone *time_zone
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_time_zone");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_start_transaction(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_start_transaction");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_xa_start(
- spider_string *str,
- XID *xid
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_xa_start");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_lock_table_head(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_lock_table_head");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_lock_table_body(
- spider_string *str,
- const char *db_name,
- uint db_name_length,
- CHARSET_INFO *db_name_charset,
- const char *table_name,
- uint table_name_length,
- CHARSET_INFO *table_name_charset,
- int lock_type
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_lock_table_body");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_lock_table_tail(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_lock_table_tail");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_unlock_table(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_unlock_table");
- DBUG_PRINT("info",("spider this=%p", this));
- /* nothing to do */
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::open_item_func(
- Item_func *item_func,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields
-) {
- uint dbton_id = spider_dbton_handlersocket.dbton_id;
- int error_num;
- Item *item, **item_list = item_func->arguments();
- uint roop_count, item_count = item_func->argument_count(), start_item = 0;
- LEX_CSTRING func_name_c;
- const char *func_name = SPIDER_SQL_NULL_CHAR_STR,
- *separator_str = SPIDER_SQL_NULL_CHAR_STR,
- *last_str = SPIDER_SQL_NULL_CHAR_STR;
- int func_name_length = SPIDER_SQL_NULL_CHAR_LEN,
- separator_str_length = SPIDER_SQL_NULL_CHAR_LEN,
- last_str_length = SPIDER_SQL_NULL_CHAR_LEN;
- int use_pushdown_udf;
- bool merge_func = FALSE;
- DBUG_ENTER("spider_db_handlersocket_util::open_item_func");
- if (str)
- {
- if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- }
- DBUG_PRINT("info",("spider functype = %d", item_func->functype()));
- switch (item_func->functype())
- {
- case Item_func::ISNULL_FUNC:
- last_str = SPIDER_SQL_IS_NULL_STR;
- last_str_length = SPIDER_SQL_IS_NULL_LEN;
- break;
- case Item_func::ISNOTNULL_FUNC:
- last_str = SPIDER_SQL_IS_NOT_NULL_STR;
- last_str_length = SPIDER_SQL_IS_NOT_NULL_LEN;
- break;
- case Item_func::UNKNOWN_FUNC:
- func_name_c = item_func->func_name_cstring();
- func_name = func_name_c.str;
- func_name_length = func_name_c.length;
- DBUG_PRINT("info",("spider func_name = %s", func_name));
- DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
- if (func_name_length == 1 &&
- (
- !strncasecmp("+", func_name, func_name_length) ||
- !strncasecmp("-", func_name, func_name_length) ||
- !strncasecmp("*", func_name, func_name_length) ||
- !strncasecmp("/", func_name, func_name_length) ||
- !strncasecmp("%", func_name, func_name_length) ||
- !strncasecmp("&", func_name, func_name_length) ||
- !strncasecmp("|", func_name, func_name_length) ||
- !strncasecmp("^", func_name, func_name_length)
- )
- ) {
- /* no action */
- break;
- } else if (func_name_length == 2 &&
- (
- !strncasecmp("<<", func_name, func_name_length) ||
- !strncasecmp(">>", func_name, func_name_length)
- )
- ) {
- /* no action */
- break;
- } else if (func_name_length == 3 &&
- !strncasecmp("div", func_name, func_name_length)
- ) {
- /* no action */
- break;
- } else if (func_name_length == 4)
- {
- if (
- !strncasecmp("rand", func_name, func_name_length) &&
-#ifdef SPIDER_Item_args_arg_count_IS_PROTECTED
- !item_func->argument_count()
-#else
- !item_func->arg_count
-#endif
- ) {
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields));
- } else if (
- !strncasecmp("case", func_name, func_name_length)
- ) {
-#ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC
- Item_func_case *item_func_case = (Item_func_case *) item_func;
- if (str)
- {
- if (str->reserve(SPIDER_SQL_CASE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN);
- }
- if (item_func_case->first_expr_num != -1)
- {
- if ((error_num = spider_db_print_item_type(
- item_list[item_func_case->first_expr_num], NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- }
- for (roop_count = 0; roop_count < item_func_case->ncases;
- roop_count += 2)
- {
- if (str)
- {
- if (str->reserve(SPIDER_SQL_WHEN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN);
- }
- if ((error_num = spider_db_print_item_type(
- item_list[roop_count], NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (str->reserve(SPIDER_SQL_THEN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN);
- }
- if ((error_num = spider_db_print_item_type(
- item_list[roop_count + 1], NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- }
- if (item_func_case->else_expr_num != -1)
- {
- if (str)
- {
- if (str->reserve(SPIDER_SQL_ELSE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN);
- }
- if ((error_num = spider_db_print_item_type(
- item_list[item_func_case->else_expr_num], NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- }
- if (str)
- {
- if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- }
- DBUG_RETURN(0);
-#else
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
-#endif
- }
- } else if (func_name_length == 6 &&
- !strncasecmp("istrue", func_name, func_name_length)
- ) {
- last_str = SPIDER_SQL_IS_TRUE_STR;
- last_str_length = SPIDER_SQL_IS_TRUE_LEN;
- break;
- } else if (func_name_length == 7)
- {
- if (!strncasecmp("isfalse", func_name, func_name_length))
- {
- last_str = SPIDER_SQL_IS_FALSE_STR;
- last_str_length = SPIDER_SQL_IS_FALSE_LEN;
- break;
- } else if (
- !strncasecmp("sysdate", func_name, func_name_length) ||
- !strncasecmp("curdate", func_name, func_name_length) ||
- !strncasecmp("curtime", func_name, func_name_length)
- ) {
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields));
- } else if (
- !strncasecmp("convert", func_name, func_name_length)
- ) {
- if (str)
- {
- if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR,
- SPIDER_SQL_OPEN_PAREN_LEN);
- last_str = SPIDER_SQL_CLOSE_PAREN_STR;
- last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
- }
- break;
- }
- } else if (func_name_length == 8 &&
- (
- !strncasecmp("utc_date", func_name, func_name_length) ||
- !strncasecmp("utc_time", func_name, func_name_length)
- )
- ) {
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields));
- } else if (func_name_length == 9 &&
- !strncasecmp("isnottrue", func_name, func_name_length)
- ) {
- last_str = SPIDER_SQL_IS_NOT_TRUE_STR;
- last_str_length = SPIDER_SQL_IS_NOT_TRUE_LEN;
- break;
- } else if (func_name_length == 10)
- {
- if (!strncasecmp("isnotfalse", func_name, func_name_length))
- {
- last_str = SPIDER_SQL_IS_NOT_FALSE_STR;
- last_str_length = SPIDER_SQL_IS_NOT_FALSE_LEN;
- break;
- } else if (!strncasecmp("column_get", func_name, func_name_length))
- {
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- }
- func_name = SPIDER_SQL_COMMA_STR;
- func_name_length = SPIDER_SQL_COMMA_LEN;
- separator_str = SPIDER_SQL_COMMA_STR;
- separator_str_length = SPIDER_SQL_COMMA_LEN;
- break;
- }
- } else if (func_name_length == 12)
- {
- if (!strncasecmp("cast_as_date", func_name, func_name_length))
- {
- item = item_list[0];
- if (item->type() == Item::FUNC_ITEM)
- {
- DBUG_PRINT("info",("spider child is FUNC_ITEM"));
- Item_func *ifunc = (Item_func *) item;
- if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
- {
- LEX_CSTRING child_func_name_c;
- const char *child_func_name;
- int child_func_name_length;
- DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
- child_func_name_c = ifunc->func_name_cstring();
- child_func_name = child_func_name_c.str;
- child_func_name_length = child_func_name_c.length;
- DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
- if (
- child_func_name_length == 10 &&
- !strncasecmp("column_get", child_func_name, child_func_name_length)
- ) {
- DBUG_PRINT("info",("spider this is merge func"));
- merge_func = TRUE;
- }
- }
- }
-
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (!merge_func)
- {
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
- }
- }
- last_str = SPIDER_SQL_AS_DATE_STR;
- last_str_length = SPIDER_SQL_AS_DATE_LEN;
- break;
- } else if (!strncasecmp("cast_as_time", func_name, func_name_length))
- {
- item = item_list[0];
- if (item->type() == Item::FUNC_ITEM)
- {
- DBUG_PRINT("info",("spider child is FUNC_ITEM"));
- Item_func *ifunc = (Item_func *) item;
- if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
- {
- LEX_CSTRING child_func_name_c;
- const char *child_func_name;
- int child_func_name_length;
- DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
- child_func_name_c = ifunc->func_name_cstring();
- child_func_name = child_func_name_c.str;
- child_func_name_length = child_func_name_c.length;
- DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
- if (
- child_func_name_length == 10 &&
- !strncasecmp("column_get", child_func_name, child_func_name_length)
- ) {
- DBUG_PRINT("info",("spider this is merge func"));
- merge_func = TRUE;
- }
- }
- }
-
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (!merge_func)
- {
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
- }
- }
- last_str = SPIDER_SQL_AS_TIME_STR;
- last_str_length = SPIDER_SQL_AS_TIME_LEN;
- break;
- }
- } else if (func_name_length == 13)
- {
- if (!strncasecmp("utc_timestamp", func_name, func_name_length))
- {
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields));
- } else if (!strncasecmp("timestampdiff", func_name, func_name_length))
- {
-#ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC
- Item_func_timestamp_diff *item_func_timestamp_diff =
- (Item_func_timestamp_diff *) item_func;
- if (str)
- {
- const char *interval_str;
- uint interval_len;
- switch (item_func_timestamp_diff->int_type)
- {
- case INTERVAL_YEAR:
- interval_str = SPIDER_SQL_YEAR_STR;
- interval_len = SPIDER_SQL_YEAR_LEN;
- break;
- case INTERVAL_QUARTER:
- interval_str = SPIDER_SQL_QUARTER_STR;
- interval_len = SPIDER_SQL_QUARTER_LEN;
- break;
- case INTERVAL_MONTH:
- interval_str = SPIDER_SQL_MONTH_STR;
- interval_len = SPIDER_SQL_MONTH_LEN;
- break;
- case INTERVAL_WEEK:
- interval_str = SPIDER_SQL_WEEK_STR;
- interval_len = SPIDER_SQL_WEEK_LEN;
- break;
- case INTERVAL_DAY:
- interval_str = SPIDER_SQL_DAY_STR;
- interval_len = SPIDER_SQL_DAY_LEN;
- break;
- case INTERVAL_HOUR:
- interval_str = SPIDER_SQL_HOUR_STR;
- interval_len = SPIDER_SQL_HOUR_LEN;
- break;
- case INTERVAL_MINUTE:
- interval_str = SPIDER_SQL_MINUTE_STR;
- interval_len = SPIDER_SQL_MINUTE_LEN;
- break;
- case INTERVAL_SECOND:
- interval_str = SPIDER_SQL_SECOND_STR;
- interval_len = SPIDER_SQL_SECOND_LEN;
- break;
- case INTERVAL_MICROSECOND:
- interval_str = SPIDER_SQL_MICROSECOND_STR;
- interval_len = SPIDER_SQL_MICROSECOND_LEN;
- break;
- default:
- interval_str = "";
- interval_len = 0;
- break;
- }
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN +
- interval_len + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- str->q_append(interval_str, interval_len);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
- str, alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (str->reserve(SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
- str, alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- }
- DBUG_RETURN(0);
-#else
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
-#endif
- }
- } else if (func_name_length == 14)
- {
- if (!strncasecmp("cast_as_binary", func_name, func_name_length))
- {
- item = item_list[0];
- if (item->type() == Item::FUNC_ITEM)
- {
- DBUG_PRINT("info",("spider child is FUNC_ITEM"));
- Item_func *ifunc = (Item_func *) item;
- if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
- {
- LEX_CSTRING child_func_name_c;
- const char *child_func_name;
- int child_func_name_length;
- DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
- child_func_name_c = ifunc->func_name_cstring();
- child_func_name = child_func_name_c.str;
- child_func_name_length = child_func_name_c.length;
- DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
- if (
- child_func_name_length == 10 &&
- !strncasecmp("column_get", child_func_name, child_func_name_length)
- ) {
- DBUG_PRINT("info",("spider this is merge func"));
- merge_func = TRUE;
- }
- }
- }
-
- if (str)
- {
- char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
- spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
- tmp_str.init_calc_mem(123);
- tmp_str.length(0);
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (!merge_func)
- {
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
- }
-#if MYSQL_VERSION_ID < 50500
- item_func->print(tmp_str.get_str(), QT_IS);
-#else
- item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
-#endif
- tmp_str.mem_calc();
- if (tmp_str.reserve(1))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- tmp_ptr = tmp_str.c_ptr_quick();
- DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
- while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR)))
- tmp_ptr = tmp_ptr2 + 1;
- last_str = tmp_ptr - 1;
- last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
- }
- break;
- } else if (!strncasecmp("cast_as_signed", func_name, func_name_length))
- {
- item = item_list[0];
- if (item->type() == Item::FUNC_ITEM)
- {
- DBUG_PRINT("info",("spider child is FUNC_ITEM"));
- Item_func *ifunc = (Item_func *) item;
- if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
- {
- LEX_CSTRING child_func_name_c;
- const char *child_func_name;
- int child_func_name_length;
- DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
- child_func_name_c = ifunc->func_name_cstring();
- child_func_name = child_func_name_c.str;
- child_func_name_length = child_func_name_c.length;
- DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
- if (
- child_func_name_length == 10 &&
- !strncasecmp("column_get", child_func_name, child_func_name_length)
- ) {
- DBUG_PRINT("info",("spider this is merge func"));
- merge_func = TRUE;
- }
- }
- }
-
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (!merge_func)
- {
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
- }
- }
- last_str = SPIDER_SQL_AS_SIGNED_STR;
- last_str_length = SPIDER_SQL_AS_SIGNED_LEN;
- break;
- }
- } else if (func_name_length == 16)
- {
- if (!strncasecmp("cast_as_unsigned", func_name, func_name_length))
- {
- item = item_list[0];
- if (item->type() == Item::FUNC_ITEM)
- {
- DBUG_PRINT("info",("spider child is FUNC_ITEM"));
- Item_func *ifunc = (Item_func *) item;
- if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
- {
- LEX_CSTRING child_func_name_c;
- const char *child_func_name;
- int child_func_name_length;
- DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
- child_func_name_c = ifunc->func_name_cstring();
- child_func_name = child_func_name_c.str;
- child_func_name_length = child_func_name_c.length;
- DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
- if (
- child_func_name_length == 10 &&
- !strncasecmp("column_get", child_func_name, child_func_name_length)
- ) {
- DBUG_PRINT("info",("spider this is merge func"));
- merge_func = TRUE;
- }
- }
- }
-
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (!merge_func)
- {
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
- }
- }
- last_str = SPIDER_SQL_AS_UNSIGNED_STR;
- last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN;
- break;
- } else if (!strncasecmp("decimal_typecast", func_name,
- func_name_length))
- {
- item = item_list[0];
- if (item->type() == Item::FUNC_ITEM)
- {
- DBUG_PRINT("info",("spider child is FUNC_ITEM"));
- Item_func *ifunc = (Item_func *) item;
- if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
- {
- LEX_CSTRING child_func_name_c;
- const char *child_func_name;
- int child_func_name_length;
- DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
- child_func_name_c = ifunc->func_name_cstring();
- child_func_name = child_func_name_c.str;
- child_func_name_length = child_func_name_c.length;
- DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
- if (
- child_func_name_length == 10 &&
- !strncasecmp("column_get", child_func_name, child_func_name_length)
- ) {
- DBUG_PRINT("info",("spider this is merge func"));
- merge_func = TRUE;
- }
- }
- }
-
- if (str)
- {
- char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
- spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
- tmp_str.init_calc_mem(124);
- tmp_str.length(0);
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (!merge_func)
- {
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
- }
-#if MYSQL_VERSION_ID < 50500
- item_func->print(tmp_str.get_str(), QT_IS);
-#else
- item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
-#endif
- tmp_str.mem_calc();
- if (tmp_str.reserve(1))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- tmp_ptr = tmp_str.c_ptr_quick();
- DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
- while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR)))
- tmp_ptr = tmp_ptr2 + 1;
- last_str = tmp_ptr - 1;
- last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
- }
- break;
- } else if (!strncasecmp("cast_as_datetime", func_name,
- func_name_length))
- {
- item = item_list[0];
- if (item->type() == Item::FUNC_ITEM)
- {
- DBUG_PRINT("info",("spider child is FUNC_ITEM"));
- Item_func *ifunc = (Item_func *) item;
- if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
- {
- LEX_CSTRING child_func_name_c;
- const char *child_func_name;
- int child_func_name_length;
- DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
- child_func_name_c = ifunc->func_name_cstring();
- child_func_name = child_func_name_c.str;
- child_func_name_length = child_func_name_c.length;
- DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
- if (
- child_func_name_length == 10 &&
- !strncasecmp("column_get", child_func_name, child_func_name_length)
- ) {
- DBUG_PRINT("info",("spider this is merge func"));
- merge_func = TRUE;
- }
- }
- }
-
- if (str)
- {
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (!merge_func)
- {
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
- }
- }
- last_str = SPIDER_SQL_AS_DATETIME_STR;
- last_str_length = SPIDER_SQL_AS_DATETIME_LEN;
- break;
- }
- } else if (func_name_length == 17)
- {
- if (!strncasecmp("date_add_interval", func_name, func_name_length))
- {
- Item_date_add_interval *item_date_add_interval =
- (Item_date_add_interval *) item_func;
- func_name = spider_db_timefunc_interval_str[
- item_date_add_interval->int_type];
- func_name_length = strlen(func_name);
- if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider,
- str, alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (item_date_add_interval->date_sub_interval)
- {
- if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_NEGINTERVAL_STR,
- SPIDER_SQL_NEGINTERVAL_LEN);
- } else {
- if (str->reserve(SPIDER_SQL_INTERVAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN);
- }
- }
- if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider,
- str, alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- }
- DBUG_RETURN(0);
- }
- }
- if (str)
- {
- if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- }
- func_name = SPIDER_SQL_COMMA_STR;
- func_name_length = SPIDER_SQL_COMMA_LEN;
- separator_str = SPIDER_SQL_COMMA_STR;
- separator_str_length = SPIDER_SQL_COMMA_LEN;
- last_str = SPIDER_SQL_CLOSE_PAREN_STR;
- last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
- break;
- case Item_func::NOW_FUNC:
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields));
- case Item_func::CHAR_TYPECAST_FUNC:
- DBUG_PRINT("info",("spider CHAR_TYPECAST_FUNC"));
- {
- item = item_list[0];
- if (item->type() == Item::FUNC_ITEM)
- {
- DBUG_PRINT("info",("spider child is FUNC_ITEM"));
- Item_func *ifunc = (Item_func *) item;
- if (ifunc->functype() == Item_func::UNKNOWN_FUNC)
- {
- LEX_CSTRING child_func_name_c;
- const char *child_func_name;
- int child_func_name_length;
- DBUG_PRINT("info",("spider child is UNKNOWN_FUNC"));
- child_func_name_c = ifunc->func_name_cstring();
- child_func_name = child_func_name_c.str;
- child_func_name_length = child_func_name_c.length;
- DBUG_PRINT("info",("spider child func_name is %s", child_func_name));
- if (
- child_func_name_length == 10 &&
- !strncasecmp("column_get", child_func_name, child_func_name_length)
- ) {
- DBUG_PRINT("info",("spider this is merge func"));
- merge_func = TRUE;
- }
- }
- }
-
- if (str)
- {
- char tmp_buf[MAX_FIELD_WIDTH], *tmp_ptr, *tmp_ptr2;
- spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset());
- tmp_str.init_calc_mem(125);
- tmp_str.length(0);
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (!merge_func)
- {
- if (str->reserve(SPIDER_SQL_CAST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN);
- }
-#if MYSQL_VERSION_ID < 50500
- item_func->print(tmp_str.get_str(), QT_IS);
-#else
- item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET);
-#endif
- tmp_str.mem_calc();
- if (tmp_str.reserve(1))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- tmp_ptr = tmp_str.c_ptr_quick();
- DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr));
- while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR)))
- tmp_ptr = tmp_ptr2 + 1;
- last_str = tmp_ptr - 1;
- last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN;
- }
- }
- break;
- case Item_func::NOT_FUNC:
- DBUG_PRINT("info",("spider NOT_FUNC"));
- if (item_list[0]->type() == Item::COND_ITEM)
- {
- DBUG_PRINT("info",("spider item_list[0] is COND_ITEM"));
- Item_cond *item_cond = (Item_cond *) item_list[0];
- if (item_cond->functype() == Item_func::COND_AND_FUNC)
- {
- DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC"));
- List_iterator_fast<Item> lif(*(item_cond->argument_list()));
- bool has_expr_cache_item = FALSE;
- bool has_isnotnull_func = FALSE;
- bool has_other_item = FALSE;
- while((item = lif++))
- {
-#ifdef SPIDER_HAS_EXPR_CACHE_ITEM
- if (
- item->type() == Item::EXPR_CACHE_ITEM
- ) {
- DBUG_PRINT("info",("spider EXPR_CACHE_ITEM"));
- has_expr_cache_item = TRUE;
- } else
-#endif
- if (
- item->type() == Item::FUNC_ITEM &&
- ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC
- ) {
- DBUG_PRINT("info",("spider ISNOTNULL_FUNC"));
- has_isnotnull_func = TRUE;
- } else {
- DBUG_PRINT("info",("spider has other item"));
- DBUG_PRINT("info",("spider COND type=%d", item->type()));
- has_other_item = TRUE;
- }
- }
- if (has_expr_cache_item && has_isnotnull_func && !has_other_item)
- {
- DBUG_PRINT("info",("spider NOT EXISTS skip"));
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- }
- }
- }
- if (str)
- {
- func_name_c = item_func->func_name_cstring();
- func_name = func_name_c.str;
- func_name_length = func_name_c.length;
- if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- }
- break;
- case Item_func::NEG_FUNC:
- if (str)
- {
- func_name_c = item_func->func_name_cstring();
- func_name = func_name_c.str;
- func_name_length = func_name_c.length;
- if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- }
- break;
- case Item_func::IN_FUNC:
- if (((Item_func_opt_neg *) item_func)->negated)
- {
- func_name = SPIDER_SQL_NOT_IN_STR;
- func_name_length = SPIDER_SQL_NOT_IN_LEN;
- separator_str = SPIDER_SQL_COMMA_STR;
- separator_str_length = SPIDER_SQL_COMMA_LEN;
- last_str = SPIDER_SQL_CLOSE_PAREN_STR;
- last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
- } else {
- func_name = SPIDER_SQL_IN_STR;
- func_name_length = SPIDER_SQL_IN_LEN;
- separator_str = SPIDER_SQL_COMMA_STR;
- separator_str_length = SPIDER_SQL_COMMA_LEN;
- last_str = SPIDER_SQL_CLOSE_PAREN_STR;
- last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
- }
- break;
- case Item_func::BETWEEN:
- if (((Item_func_opt_neg *) item_func)->negated)
- {
- func_name = SPIDER_SQL_NOT_BETWEEN_STR;
- func_name_length = SPIDER_SQL_NOT_BETWEEN_LEN;
- separator_str = SPIDER_SQL_AND_STR;
- separator_str_length = SPIDER_SQL_AND_LEN;
- } else {
- func_name_c = item_func->func_name_cstring();
- func_name = func_name_c.str;
- func_name_length = func_name_c.length;
- separator_str = SPIDER_SQL_AND_STR;
- separator_str_length = SPIDER_SQL_AND_LEN;
- }
- break;
- case Item_func::UDF_FUNC:
- use_pushdown_udf = spider_param_use_pushdown_udf(spider->trx->thd,
- spider->share->use_pushdown_udf);
- if (!use_pushdown_udf)
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- if (str)
- {
- func_name_c = item_func->func_name_cstring();
- func_name = func_name_c.str;
- func_name_length = func_name_c.length;
- DBUG_PRINT("info",("spider func_name = %s", func_name));
- DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
- if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- }
- func_name = SPIDER_SQL_COMMA_STR;
- func_name_length = SPIDER_SQL_COMMA_LEN;
- separator_str = SPIDER_SQL_COMMA_STR;
- separator_str_length = SPIDER_SQL_COMMA_LEN;
- last_str = SPIDER_SQL_CLOSE_PAREN_STR;
- last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
- break;
-#ifdef MARIADB_BASE_VERSION
- case Item_func::XOR_FUNC:
-#else
- case Item_func::COND_XOR_FUNC:
-#endif
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- DBUG_RETURN(
- spider_db_open_item_cond((Item_cond *) item_func, spider, str,
- alias, alias_length, dbton_id, use_fields, fields));
- case Item_func::TRIG_COND_FUNC:
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- case Item_func::GUSERVAR_FUNC:
- if (str)
- str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN);
- if (item_func->result_type() == STRING_RESULT)
- DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields));
- else
- DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields));
- case Item_func::FT_FUNC:
- if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY)
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- start_item = 1;
- if (str)
- {
- if (str->reserve(SPIDER_SQL_MATCH_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN);
- }
- separator_str = SPIDER_SQL_COMMA_STR;
- separator_str_length = SPIDER_SQL_COMMA_LEN;
- last_str = SPIDER_SQL_CLOSE_PAREN_STR;
- last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
- break;
- case Item_func::SP_EQUALS_FUNC:
- if (str)
- {
- func_name = SPIDER_SQL_MBR_EQUAL_STR;
- func_name_length = SPIDER_SQL_MBR_EQUAL_LEN;
- DBUG_PRINT("info",("spider func_name = %s", func_name));
- DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
- if (str->reserve(func_name_length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- }
- func_name = SPIDER_SQL_COMMA_STR;
- func_name_length = SPIDER_SQL_COMMA_LEN;
- separator_str = SPIDER_SQL_COMMA_STR;
- separator_str_length = SPIDER_SQL_COMMA_LEN;
- last_str = SPIDER_SQL_CLOSE_PAREN_STR;
- last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
- break;
- case Item_func::SP_DISJOINT_FUNC:
- case Item_func::SP_INTERSECTS_FUNC:
- case Item_func::SP_TOUCHES_FUNC:
- case Item_func::SP_CROSSES_FUNC:
- case Item_func::SP_WITHIN_FUNC:
- case Item_func::SP_CONTAINS_FUNC:
- case Item_func::SP_OVERLAPS_FUNC:
- if (str)
- {
- func_name_c = item_func->func_name_cstring();
- func_name = func_name_c.str;
- func_name_length = func_name_c.length;
- DBUG_PRINT("info",("spider func_name = %s", func_name));
- DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
- if (str->reserve(
-#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
- SPIDER_SQL_MBR_LEN +
-#endif
- func_name_length + SPIDER_SQL_OPEN_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR
- str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN);
-#endif
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN);
- }
- func_name = SPIDER_SQL_COMMA_STR;
- func_name_length = SPIDER_SQL_COMMA_LEN;
- separator_str = SPIDER_SQL_COMMA_STR;
- separator_str_length = SPIDER_SQL_COMMA_LEN;
- last_str = SPIDER_SQL_CLOSE_PAREN_STR;
- last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN;
- break;
- case Item_func::EQ_FUNC:
- case Item_func::EQUAL_FUNC:
- case Item_func::NE_FUNC:
- case Item_func::LT_FUNC:
- case Item_func::LE_FUNC:
- case Item_func::GE_FUNC:
- case Item_func::GT_FUNC:
- case Item_func::LIKE_FUNC:
- if (str)
- {
- func_name_c = item_func->func_name_cstring();
- func_name = func_name_c.str;
- func_name_length = func_name_c.length;
- }
- break;
- default:
- THD *thd = spider->trx->thd;
- SPIDER_SHARE *share = spider->share;
- if (spider_param_skip_default_condition(thd,
- share->skip_default_condition))
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- if (str)
- {
- func_name_c = item_func->func_name_cstring();
- func_name = func_name_c.str;
- func_name_length = func_name_c.length;
- }
- break;
- }
- DBUG_PRINT("info",("spider func_name = %s", func_name));
- DBUG_PRINT("info",("spider func_name_length = %d", func_name_length));
- DBUG_PRINT("info",("spider separator_str = %s", separator_str));
- DBUG_PRINT("info",("spider separator_str_length = %d", separator_str_length));
- DBUG_PRINT("info",("spider last_str = %s", last_str));
- DBUG_PRINT("info",("spider last_str_length = %d", last_str_length));
- if (item_count)
- {
- item_count--;
- for (roop_count = start_item; roop_count < item_count; roop_count++)
- {
- item = item_list[roop_count];
- if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- if (roop_count == 1)
- {
- func_name = separator_str;
- func_name_length = separator_str_length;
- }
- if (str)
- {
- if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- str->q_append(func_name, func_name_length);
- str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN);
- }
- }
- item = item_list[roop_count];
- if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- }
- if (item_func->functype() == Item_func::FT_FUNC)
- {
- Item_func_match *item_func_match = (Item_func_match *)item_func;
- if (str)
- {
- if (str->reserve(SPIDER_SQL_AGAINST_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN);
- }
- item = item_list[0];
- if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (str->reserve(
- ((item_func_match->match_flags & FT_BOOL) ?
- SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) +
- ((item_func_match->match_flags & FT_EXPAND) ?
- SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0)
- ))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (item_func_match->match_flags & FT_BOOL)
- str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR,
- SPIDER_SQL_IN_BOOLEAN_MODE_LEN);
- if (item_func_match->match_flags & FT_EXPAND)
- str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR,
- SPIDER_SQL_WITH_QUERY_EXPANSION_LEN);
- }
- } else if (item_func->functype() == Item_func::UNKNOWN_FUNC)
- {
- if (
- func_name_length == 7 &&
- !strncasecmp("convert", func_name, func_name_length)
- ) {
- if (str)
- {
- Item_func_conv_charset *item_func_conv_charset =
- (Item_func_conv_charset *)item_func;
- CHARSET_INFO *conv_charset =
- item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset;
- uint cset_length = strlen(conv_charset->csname);
- if (str->reserve(SPIDER_SQL_USING_LEN + cset_length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN);
- str->q_append(conv_charset->csname, cset_length);
- }
- }
- }
- if (str)
- {
- if (merge_func)
- str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN);
- if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(last_str, last_str_length);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN);
- }
- DBUG_RETURN(0);
-}
-
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_db_handlersocket_util::open_item_sum_func(
- Item_sum *item_sum,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields
-) {
- uint dbton_id = spider_dbton_handlersocket.dbton_id;
- uint roop_count, item_count = item_sum->get_arg_count();
- int error_num;
- DBUG_ENTER("spider_db_handlersocket_util::open_item_sum_func");
- DBUG_PRINT("info",("spider Sumfunctype = %d", item_sum->sum_func()));
- switch (item_sum->sum_func())
- {
- case Item_sum::COUNT_FUNC:
- case Item_sum::SUM_FUNC:
- case Item_sum::MIN_FUNC:
- case Item_sum::MAX_FUNC:
- {
- LEX_CSTRING func_name_c = item_sum->func_name_cstring();
- const char *func_name = func_name_c.str;
- uint func_name_length = func_name_c.length;
- Item *item, **args = item_sum->get_args();
- if (str)
- {
- if (str->reserve(func_name_length))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(func_name, func_name_length);
- }
- if (item_count)
- {
- item_count--;
- for (roop_count = 0; roop_count < item_count; roop_count++)
- {
- item = args[roop_count];
- if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- if (str)
- {
- if (str->reserve(SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- }
- item = args[roop_count];
- if ((error_num = spider_db_print_item_type(item, NULL, spider, str,
- alias, alias_length, dbton_id, use_fields, fields)))
- DBUG_RETURN(error_num);
- }
- if (str)
- {
- if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_CLOSE_PAREN_STR,
- SPIDER_SQL_CLOSE_PAREN_LEN);
- }
- }
- break;
- case Item_sum::COUNT_DISTINCT_FUNC:
- case Item_sum::SUM_DISTINCT_FUNC:
- case Item_sum::AVG_FUNC:
- case Item_sum::AVG_DISTINCT_FUNC:
- case Item_sum::STD_FUNC:
- case Item_sum::VARIANCE_FUNC:
- case Item_sum::SUM_BIT_FUNC:
- case Item_sum::UDF_SUM_FUNC:
- case Item_sum::GROUP_CONCAT_FUNC:
- default:
- DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM);
- }
- DBUG_RETURN(0);
-}
-#endif
-
-int spider_db_handlersocket_util::append_escaped_util(
- spider_string *to,
- String *from
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_escaped_util");
- DBUG_PRINT("info",("spider this=%p", this));
- to->append_escape_string(from->ptr(), from->length());
- DBUG_RETURN(0);
-}
-
-#ifdef SPIDER_HAS_GROUP_BY_HANDLER
-int spider_db_handlersocket_util::append_from_and_tables(
- ha_spider *spider,
- spider_fields *fields,
- spider_string *str,
- TABLE_LIST *table_list,
- uint table_count
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_from_and_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::reappend_tables(
- spider_fields *fields,
- SPIDER_LINK_IDX_CHAIN *link_idx_chain,
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket_util::reappend_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_where(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_where");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_handlersocket_util::append_having(
- spider_string *str
-) {
- DBUG_ENTER("spider_db_handlersocket_util::append_having");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-#endif
-
-spider_handlersocket_share::spider_handlersocket_share(
- st_spider_share *share
-) : spider_db_share(
- share,
- spider_dbton_handlersocket.dbton_id
-),
- table_names_str(NULL),
- db_names_str(NULL),
- db_table_str(NULL),
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- db_table_str_hash_value(NULL),
-#endif
- table_nm_max_length(0),
- db_nm_max_length(0),
- column_name_str(NULL),
- same_db_table_name(TRUE),
- first_all_link_idx(-1)
-{
- DBUG_ENTER("spider_handlersocket_share::spider_handlersocket_share");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 186);
- spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-spider_handlersocket_share::~spider_handlersocket_share()
-{
- DBUG_ENTER("spider_handlersocket_share::~spider_handlersocket_share");
- DBUG_PRINT("info",("spider this=%p", this));
- free_column_name_str();
- free_table_names_str();
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- if (db_table_str_hash_value)
- {
- spider_free(spider_current_trx, db_table_str_hash_value, MYF(0));
- }
-#endif
- spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-int spider_handlersocket_share::init()
-{
- int error_num;
- DBUG_ENTER("spider_handlersocket_share::init");
- DBUG_PRINT("info",("spider this=%p", this));
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- if (!(db_table_str_hash_value = (my_hash_value_type *)
- spider_bulk_alloc_mem(spider_current_trx, 203,
- __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
- &db_table_str_hash_value,
- sizeof(my_hash_value_type) * spider_share->all_link_count,
- NullS))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-#endif
-
- if (
- (error_num = create_table_names_str()) ||
- (
- spider_share->table_share &&
- (error_num = create_column_name_str())
- )
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_share::append_table_name(
- spider_string *str,
- int all_link_idx
-) {
- const char *db_nm = db_names_str[all_link_idx].ptr();
- uint db_nm_len = db_names_str[all_link_idx].length();
- const char *table_nm = table_names_str[all_link_idx].ptr();
- uint table_nm_len = table_names_str[all_link_idx].length();
- DBUG_ENTER("spider_handlersocket_share::append_table_name");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(db_nm_len + SPIDER_SQL_DOT_LEN + table_nm_len +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 4))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- spider_db_handlersocket_utility.append_name(str, db_nm, db_nm_len);
- str->q_append(SPIDER_SQL_DOT_STR, SPIDER_SQL_DOT_LEN);
- spider_db_handlersocket_utility.append_name(str, table_nm, table_nm_len);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_share::create_table_names_str()
-{
- int error_num, roop_count;
- uint table_nm_len, db_nm_len;
- spider_string *str, *first_tbl_nm_str, *first_db_nm_str, *first_db_tbl_str;
- char *first_tbl_nm, *first_db_nm;
- uint dbton_id = spider_dbton_handlersocket.dbton_id;
- DBUG_ENTER("spider_handlersocket_share::create_table_names_str");
- table_names_str = NULL;
- db_names_str = NULL;
- db_table_str = NULL;
- if (
- !(table_names_str = new spider_string[spider_share->all_link_count]) ||
- !(db_names_str = new spider_string[spider_share->all_link_count]) ||
- !(db_table_str = new spider_string[spider_share->all_link_count])
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
- goto error;
- }
-
- same_db_table_name = TRUE;
- first_tbl_nm = spider_share->tgt_table_names[0];
- first_db_nm = spider_share->tgt_dbs[0];
- table_nm_len = spider_share->tgt_table_names_lengths[0];
- db_nm_len = spider_share->tgt_dbs_lengths[0];
- first_tbl_nm_str = &table_names_str[0];
- first_db_nm_str = &db_names_str[0];
- first_db_tbl_str = &db_table_str[0];
- for (roop_count = 0; roop_count < (int) spider_share->all_link_count;
- roop_count++)
- {
- table_names_str[roop_count].init_calc_mem(86);
- db_names_str[roop_count].init_calc_mem(87);
- db_table_str[roop_count].init_calc_mem(88);
- if (spider_share->sql_dbton_ids[roop_count] != dbton_id)
- continue;
- if (first_all_link_idx == -1)
- first_all_link_idx = roop_count;
-
- str = &table_names_str[roop_count];
- if (
- roop_count != 0 &&
- same_db_table_name &&
- spider_share->tgt_table_names_lengths[roop_count] == table_nm_len &&
- !memcmp(first_tbl_nm, spider_share->tgt_table_names[roop_count],
- table_nm_len)
- ) {
- if (str->copy(*first_tbl_nm_str))
- {
- error_num = HA_ERR_OUT_OF_MEM;
- goto error;
- }
- } else {
- str->set_charset(spider_share->access_charset);
- if ((error_num = spider_db_append_name_with_quote_str(str,
- spider_share->tgt_table_names[roop_count], dbton_id)))
- goto error;
- if (roop_count)
- {
- same_db_table_name = FALSE;
- DBUG_PRINT("info", ("spider found different table name %s",
- spider_share->tgt_table_names[roop_count]));
- if (str->length() > table_nm_max_length)
- table_nm_max_length = str->length();
- } else
- table_nm_max_length = str->length();
- }
-
- str = &db_names_str[roop_count];
- if (
- roop_count != 0 &&
- same_db_table_name &&
- spider_share->tgt_dbs_lengths[roop_count] == db_nm_len &&
- !memcmp(first_db_nm, spider_share->tgt_dbs[roop_count],
- db_nm_len)
- ) {
- if (str->copy(*first_db_nm_str))
- {
- error_num = HA_ERR_OUT_OF_MEM;
- goto error;
- }
- } else {
- str->set_charset(spider_share->access_charset);
- if ((error_num = spider_db_append_name_with_quote_str(str,
- spider_share->tgt_dbs[roop_count], dbton_id)))
- goto error;
- if (roop_count)
- {
- same_db_table_name = FALSE;
- DBUG_PRINT("info", ("spider found different db name %s",
- spider_share->tgt_dbs[roop_count]));
- if (str->length() > db_nm_max_length)
- db_nm_max_length = str->length();
- } else
- db_nm_max_length = str->length();
- }
-
- str = &db_table_str[roop_count];
- if (
- roop_count != 0 &&
- same_db_table_name
- ) {
- if (str->copy(*first_db_tbl_str))
- {
- error_num = HA_ERR_OUT_OF_MEM;
- goto error;
- }
- } else {
- str->set_charset(spider_share->access_charset);
- if ((error_num = append_table_name(str, roop_count)))
- goto error;
- }
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- db_table_str_hash_value[roop_count] = my_calc_hash(
- &spider_open_connections, (uchar*) str->ptr(), str->length());
-#endif
- }
- DBUG_RETURN(0);
-
-error:
- if (db_table_str)
- {
- delete [] db_table_str;
- db_table_str = NULL;
- }
- if (db_names_str)
- {
- delete [] db_names_str;
- db_names_str = NULL;
- }
- if (table_names_str)
- {
- delete [] table_names_str;
- table_names_str = NULL;
- }
- DBUG_RETURN(error_num);
-}
-
-void spider_handlersocket_share::free_table_names_str()
-{
- DBUG_ENTER("spider_handlersocket_share::free_table_names_str");
- if (db_table_str)
- {
- delete [] db_table_str;
- db_table_str = NULL;
- }
- if (db_names_str)
- {
- delete [] db_names_str;
- db_names_str = NULL;
- }
- if (table_names_str)
- {
- delete [] table_names_str;
- table_names_str = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_handlersocket_share::create_column_name_str()
-{
- spider_string *str;
- int error_num;
- Field **field;
- TABLE_SHARE *table_share = spider_share->table_share;
- uint dbton_id = spider_dbton_handlersocket.dbton_id;
- DBUG_ENTER("spider_handlersocket_share::create_column_name_str");
- if (
- table_share->fields &&
- !(column_name_str = new spider_string[table_share->fields])
- )
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- for (field = table_share->field, str = column_name_str;
- *field; field++, str++)
- {
- str->init_calc_mem(202);
- str->set_charset(spider_share->access_charset);
- if ((error_num = spider_db_append_name_with_quote_str(str,
- (*field)->field_name, dbton_id)))
- goto error;
- }
- DBUG_RETURN(0);
-
-error:
- if (column_name_str)
- {
- delete [] column_name_str;
- column_name_str = NULL;
- }
- DBUG_RETURN(error_num);
-}
-
-void spider_handlersocket_share::free_column_name_str()
-{
- DBUG_ENTER("spider_handlersocket_share::free_column_name_str");
- if (column_name_str)
- {
- delete [] column_name_str;
- column_name_str = NULL;
- }
- DBUG_VOID_RETURN;
-}
-
-uint spider_handlersocket_share::get_column_name_length(
- uint field_index
-) {
- DBUG_ENTER("spider_handlersocket_share::get_column_name_length");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(column_name_str[field_index].length());
-}
-
-int spider_handlersocket_share::append_column_name(
- spider_string *str,
- uint field_index
-) {
- int error_num;
- DBUG_ENTER("spider_handlersocket_share::append_column_name");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = spider_db_handlersocket_utility.append_name(str,
- column_name_str[field_index].ptr(), column_name_str[field_index].length());
- DBUG_RETURN(error_num);
-}
-
-int spider_handlersocket_share::append_column_name_with_alias(
- spider_string *str,
- uint field_index,
- const char *alias,
- uint alias_length
-) {
- DBUG_ENTER("spider_handlersocket_share::append_column_name_with_alias");
- DBUG_PRINT("info",("spider this=%p", this));
- if (str->reserve(
- alias_length +
- column_name_str[field_index].length() +
- /* SPIDER_SQL_NAME_QUOTE_LEN */ 2))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(alias, alias_length);
- append_column_name(str, field_index);
- DBUG_RETURN(0);
-}
-
-bool spider_handlersocket_share::need_change_db_table_name()
-{
- DBUG_ENTER("spider_handlersocket_share::need_change_db_table_name");
- DBUG_RETURN(!same_db_table_name);
-}
-
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
-int spider_handlersocket_share::discover_table_structure(
- SPIDER_TRX *trx,
- SPIDER_SHARE *spider_share,
- spider_string *str
-) {
- DBUG_ENTER("spider_handlersocket_share::discover_table_structure");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
-}
-#endif
-
-spider_handlersocket_handler::spider_handlersocket_handler(
- ha_spider *spider,
- spider_handlersocket_share *db_share
-) : spider_db_handler(
- spider,
- db_share
-),
- handlersocket_share(db_share),
- link_for_hash(NULL)
-{
- DBUG_ENTER("spider_handlersocket_handler::spider_handlersocket_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- spider_alloc_calc_mem_init(mem_calc, 187);
- spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-spider_handlersocket_handler::~spider_handlersocket_handler()
-{
- DBUG_ENTER("spider_handlersocket_handler::~spider_handlersocket_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- if (link_for_hash)
- {
- spider_free(spider_current_trx, link_for_hash, MYF(0));
- }
- spider_free_mem_calc(spider_current_trx, mem_calc_id, sizeof(*this));
- DBUG_VOID_RETURN;
-}
-
-int spider_handlersocket_handler::init()
-{
- st_spider_share *share = spider->share;
- TABLE *table = spider->get_table();
- DBUG_ENTER("spider_handlersocket_handler::init");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *)
- spider_bulk_alloc_mem(spider_current_trx, 204,
- __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL),
- &link_for_hash,
- sizeof(SPIDER_LINK_FOR_HASH) * share->link_count,
- &minimum_select_bitmap,
- table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0,
- NullS))
- ) {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- uint roop_count;
- for (roop_count = 0; roop_count < share->link_count; roop_count++)
- {
- link_for_hash[roop_count].spider = spider;
- link_for_hash[roop_count].link_idx = roop_count;
- link_for_hash[roop_count].db_table_str =
- &handlersocket_share->db_table_str[roop_count];
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- link_for_hash[roop_count].db_table_str_hash_value =
- handlersocket_share->db_table_str_hash_value[roop_count];
-#endif
- }
- hs_sql.init_calc_mem(63);
- hs_sql.set_charset(share->access_charset);
- hs_keys.init();
- hs_upds.init();
- hs_strs.init();
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_index_hint(
- spider_string *str,
- int link_idx,
- ulong sql_type
- )
-{
- DBUG_ENTER("spider_handlersocket_handler::append_index_hint");
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_table_name_with_adjusting(
- spider_string *str,
- int link_idx,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_table_name_with_adjusting");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_tmp_table_and_sql_for_bka(
- const key_range *start_key
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_tmp_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reuse_tmp_table_and_sql_for_bka()
-{
- DBUG_ENTER("spider_handlersocket_handler::reuse_tmp_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_union_table_and_sql_for_bka(
- const key_range *start_key
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_union_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reuse_union_table_and_sql_for_bka()
-{
- DBUG_ENTER("spider_handlersocket_handler::reuse_union_table_and_sql_for_bka");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_insert_for_recovery(
- ulong sql_type,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_insert_for_recovery");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_insert_part()
-{
- DBUG_ENTER("spider_handlersocket_handler::append_insert_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_update_part()
-{
- DBUG_ENTER("spider_handlersocket_handler::append_update_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_delete_part()
-{
- DBUG_ENTER("spider_handlersocket_handler::append_delete_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_handlersocket_handler::append_increment_update_set_part()
-{
- DBUG_ENTER("spider_handlersocket_handler::append_increment_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-#endif
-
-int spider_handlersocket_handler::append_update_set_part()
-{
- DBUG_ENTER("spider_handlersocket_handler::append_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_handlersocket_handler::append_direct_update_set_part()
-{
- SPIDER_SHARE *share = spider->share;
- DBUG_ENTER("spider_handlersocket_handler::append_direct_update_set_part");
- if (
- spider->do_direct_update &&
- (spider->direct_update_kinds & SPIDER_SQL_KIND_HS)
- ) {
- DBUG_PRINT("info",("spider add set for DU SPIDER_SQL_KIND_HS"));
- size_t roop_count;
- Field *field;
- hs_adding_keys = FALSE;
- for (roop_count = 0; roop_count < spider->hs_pushed_ret_fields_num;
- roop_count++)
- {
- Field *top_table_field =
- spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
- if (!(field = spider->field_exchange(top_table_field)))
- continue;
- if (top_table_field->is_null())
- {
- hs_upds.push_back(spider_null_string_ref);
- } else {
- if (spider_db_handlersocket_utility.
- append_column_value(spider, NULL, top_table_field, NULL,
- share->access_charset))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- }
- }
- DBUG_RETURN(0);
-}
-#endif
-
-int spider_handlersocket_handler::append_minimum_select_without_quote(
- spider_string *str
-) {
- TABLE *table = spider->get_table();
- Field **field;
- int field_length;
- bool appended = FALSE;
- DBUG_ENTER("spider_handlersocket_handler::append_minimum_select_without_quote");
- minimum_select_bitmap_create();
- for (field = table->field; *field; field++)
- {
- if (minimum_select_bit_is_set((*field)->field_index))
- {
-/*
- spider_set_bit(minimum_select_bitmap, (*field)->field_index);
-*/
- field_length =
- handlersocket_share->column_name_str[(*field)->field_index].length();
- if (str->reserve(field_length + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(
- handlersocket_share->column_name_str[(*field)->field_index].ptr(),
- handlersocket_share->column_name_str[(*field)->field_index].length());
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- appended = TRUE;
- }
- }
- if (appended)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_handlersocket_handler::append_minimum_select_by_field_idx_list(
- spider_string *str,
- uint32 *field_idxs,
- size_t field_idxs_num
-) {
- Field *field;
- int roop_count, field_length;
- bool appended = FALSE;
- DBUG_ENTER("spider_handlersocket_handler::append_minimum_select_by_field_idx_list");
- for (roop_count = 0; roop_count < (int) field_idxs_num; roop_count++)
- {
- field = spider->get_top_table_field(field_idxs[roop_count]);
- if ((field = spider->field_exchange(field)))
- {
- field_length =
- handlersocket_share->column_name_str[field->field_index].length();
- if (str->reserve(field_length + SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(
- handlersocket_share->column_name_str[field->field_index].ptr(),
- handlersocket_share->column_name_str[field->field_index].length());
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- appended = TRUE;
- }
- }
- if (appended)
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_dup_update_pushdown_part(
- const char *alias,
- uint alias_length
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_dup_update_pushdown_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_update_columns_part(
- const char *alias,
- uint alias_length
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_update_columns_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::check_update_columns_part()
-{
- DBUG_ENTER("spider_handlersocket_handler::check_update_columns_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-#endif
-
-int spider_handlersocket_handler::append_select_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_table_select_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_table_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_key_select_part(
- ulong sql_type,
- uint idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_key_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_minimum_select_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_minimum_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_hint_after_table_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_hint_after_table_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-void spider_handlersocket_handler::set_where_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::set_where_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-
-void spider_handlersocket_handler::set_where_to_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::set_where_to_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-
-int spider_handlersocket_handler::check_item_type(
- Item *item
-) {
- DBUG_ENTER("spider_handlersocket_handler::check_item_type");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_values_connector_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_values_connector_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_values_terminator_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_values_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_union_table_connector_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_union_table_connector_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_union_table_terminator_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_union_table_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_key_column_values_part(
- const key_range *start_key,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_key_column_values_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_key_column_values_with_name_part(
- const key_range *start_key,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_key_column_values_with_name_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_key_where_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- bool set_order;
- DBUG_ENTER("spider_handlersocket_handler::append_key_where_part");
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_HS:
- case SPIDER_SQL_TYPE_INSERT_HS:
- case SPIDER_SQL_TYPE_UPDATE_HS:
- case SPIDER_SQL_TYPE_DELETE_HS:
- str = &hs_sql;
- str->length(0);
- hs_adding_keys = TRUE;
- set_order = FALSE;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_key_where(str, NULL, NULL, start_key, end_key,
- sql_type, set_order);
- DBUG_RETURN(error_num);
-}
-
-int spider_handlersocket_handler::append_key_where(
- spider_string *str,
- spider_string *str_part,
- spider_string *str_part2,
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type,
- bool set_order
-) {
- int error_num;
- DBUG_ENTER("spider_handlersocket_handler::append_key_where");
- error_num = spider_db_append_key_where_internal(str, str_part, str_part2,
- start_key, end_key, spider, set_order, sql_type,
- spider_dbton_handlersocket.dbton_id);
- DBUG_RETURN(error_num);
-}
-
-int spider_handlersocket_handler::append_is_null_part(
- ulong sql_type,
- KEY_PART_INFO *key_part,
- const key_range *key,
- const uchar **ptr,
- bool key_eq,
- bool tgt_final
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_handlersocket_handler::append_is_null_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_SELECT_HS:
- case SPIDER_SQL_TYPE_INSERT_HS:
- case SPIDER_SQL_TYPE_UPDATE_HS:
- case SPIDER_SQL_TYPE_DELETE_HS:
- str = &hs_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_is_null(sql_type, str, NULL, NULL, key_part, key, ptr,
- key_eq, tgt_final);
- DBUG_RETURN(error_num);
-}
-
-int spider_handlersocket_handler::append_is_null(
- ulong sql_type,
- spider_string *str,
- spider_string *str_part,
- spider_string *str_part2,
- KEY_PART_INFO *key_part,
- const key_range *key,
- const uchar **ptr,
- bool key_eq,
- bool tgt_final
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_is_null");
- DBUG_PRINT("info",("spider this=%p", this));
- if (key_part->null_bit)
- {
- if (*(*ptr)++)
- {
- hs_keys.push_back(spider_null_string_ref);
- DBUG_RETURN(-1);
- }
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_where_terminator_part(
- ulong sql_type,
- bool set_order,
- int key_count
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_where_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_match_where_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_match_where_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_condition_part(
- const char *alias,
- uint alias_length,
- ulong sql_type,
- bool test_flg
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_condition_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_match_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_match_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_handlersocket_handler::append_sum_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_sum_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-#endif
-
-void spider_handlersocket_handler::set_order_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::set_order_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-
-void spider_handlersocket_handler::set_order_to_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::set_order_to_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
-int spider_handlersocket_handler::append_group_by_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_group_by_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-#endif
-
-int spider_handlersocket_handler::append_key_order_for_merge_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_key_order_for_merge_with_alias_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_key_order_for_direct_order_limit_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_key_order_for_direct_order_limit_with_alias_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_key_order_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_key_order_with_alias_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_limit_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_PRINT("info", ("spider offset=%lld", offset));
- DBUG_PRINT("info", ("spider limit=%lld", limit));
- hs_skip = (int) offset;
- hs_limit = (int) limit;
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reappend_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::reappend_limit_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_select_lock_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_select_lock_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_union_all_start_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_union_all_start_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_union_all_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_union_all_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_union_all_end_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_union_all_end_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_multi_range_cnt_part(
- ulong sql_type,
- uint multi_range_cnt,
- bool with_comma
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_multi_range_cnt_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_multi_range_cnt_with_name_part(
- ulong sql_type,
- uint multi_range_cnt
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_multi_range_cnt_with_name_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_open_handler_part(
- ulong sql_type,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_handlersocket_handler::append_open_handler_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_OTHER_HS:
- str = &hs_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_open_handler(str, handler_id, conn, link_idx);
- DBUG_RETURN(error_num);
-}
-
-int spider_handlersocket_handler::append_open_handler(
- spider_string *str,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_handlersocket_handler::append_open_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- if (
- str->length() == 0 &&
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- (
- (
- (
- spider->sql_command == SQLCOM_HS_INSERT ||
- spider->hs_pushed_ret_fields_num == MAX_FIELDS
- ) &&
-#endif
- (error_num = append_minimum_select_without_quote(str))
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- ) ||
- (
- (
- spider->sql_command != SQLCOM_HS_INSERT &&
- spider->hs_pushed_ret_fields_num < MAX_FIELDS
- ) &&
- (error_num = append_minimum_select_by_field_idx_list(str,
- spider->hs_pushed_ret_fields, spider->hs_pushed_ret_fields_num))
- )
- )
-#endif
- ) {
- DBUG_RETURN(error_num);
- }
-
- TABLE *table = spider->get_table();
- SPIDER_SHARE *share = spider->share;
- DBUG_PRINT("info",("spider field list=%s", str->c_ptr_safe()));
- if (!spider_bit_is_set(spider->db_request_phase, link_idx))
- {
- spider_set_bit(spider->db_request_phase, link_idx);
- ++spider->db_request_id[link_idx];
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id = spider->trx->spider_thread_id;
- request_key.query_id = spider->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[link_idx];
- request_key.next = NULL;
- conn->db_conn->append_open_handler(
- handler_id,
- share->tgt_dbs[spider->conn_link_idx[link_idx]],
- share->tgt_table_names[spider->conn_link_idx[link_idx]],
- spider->active_index < MAX_KEY ?
- table->key_info[spider->active_index].name :
- "0",
- str->c_ptr_safe(),
- &request_key
- );
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_close_handler_part(
- ulong sql_type,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_close_handler_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_insert_terminator_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_insert_terminator_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_insert_values_part(
- ulong sql_type
-) {
- int error_num;
- spider_string *str;
- DBUG_ENTER("spider_mysql_handler::append_insert_values_part");
- DBUG_PRINT("info",("spider this=%p", this));
- switch (sql_type)
- {
- case SPIDER_SQL_TYPE_INSERT_HS:
- str = &hs_sql;
- break;
- default:
- DBUG_RETURN(0);
- }
- error_num = append_insert_values(str);
- DBUG_RETURN(error_num);
-}
-
-int spider_handlersocket_handler::append_insert_values(
- spider_string *str
-) {
- SPIDER_SHARE *share = spider->share;
- TABLE *table = spider->get_table();
- Field **field;
- DBUG_ENTER("spider_mysql_handler::append_insert_values");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_adding_keys = FALSE;
- for (field = table->field; *field; field++)
- {
- DBUG_PRINT("info",("spider field_index=%u", (*field)->field_index));
- if (
- bitmap_is_set(table->write_set, (*field)->field_index) ||
- bitmap_is_set(table->read_set, (*field)->field_index)
- ) {
-#ifndef DBUG_OFF
- my_bitmap_map *tmp_map =
- dbug_tmp_use_all_columns(table, table->read_set);
-#endif
- DBUG_PRINT("info",("spider is_null()=%s",
- (*field)->is_null() ? "TRUE" : "FALSE"));
- DBUG_PRINT("info",("spider table->next_number_field=%p",
- table->next_number_field));
- DBUG_PRINT("info",("spider *field=%p", *field));
- DBUG_PRINT("info",("spider force_auto_increment=%s",
- (table->next_number_field && spider->force_auto_increment) ?
- "TRUE" : "FALSE"));
- if (
- (*field)->is_null() ||
- (
- table->next_number_field == *field &&
- !table->auto_increment_field_not_null &&
- !spider->force_auto_increment
- )
- ) {
- hs_upds.push_back(spider_null_string_ref);
- } else {
- spider_db_handlersocket_utility.
- append_column_value(spider, NULL, *field, NULL,
- share->access_charset);
- }
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- }
- }
- int error_num;
- int roop_count2;
- for (
- roop_count2 = spider_conn_link_idx_next(share->link_statuses,
- spider->conn_link_idx, -1, share->link_count,
- SPIDER_LINK_STATUS_RECOVERY);
- roop_count2 < (int) share->link_count;
- roop_count2 = spider_conn_link_idx_next(share->link_statuses,
- spider->conn_link_idx, roop_count2, share->link_count,
- SPIDER_LINK_STATUS_RECOVERY)
- ) {
- if (spider->sql_kind[roop_count2] == SPIDER_SQL_KIND_HS)
- {
- SPIDER_CONN *conn = spider->hs_w_conns[roop_count2];
- if (conn->dbton_id == spider_dbton_handlersocket.dbton_id)
- {
- if ((error_num = request_buf_insert(roop_count2)))
- DBUG_RETURN(error_num);
-#ifdef HA_CAN_BULK_ACCESS
- if (spider->is_bulk_access_clone)
- {
- spider->connection_ids[roop_count2] = conn->connection_id;
- spider_trx_add_bulk_access_conn(spider->trx, conn);
- }
-#endif
- }
- }
- }
- hs_upds.clear();
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_into_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_into_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-void spider_handlersocket_handler::set_insert_to_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::set_insert_to_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-
-int spider_handlersocket_handler::append_from_part(
- ulong sql_type,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_from_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_delete_all_rows_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_delete_all_rows_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_explain_select_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_explain_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::is_sole_projection_field(
- uint16 field_index
-) {
- DBUG_ENTER("spider_handlersocket_handler::is_sole_projection_field");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-bool spider_handlersocket_handler::is_bulk_insert_exec_period(
- bool bulk_end
-) {
- DBUG_ENTER("spider_handlersocket_handler::is_bulk_insert_exec_period");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!spider->bulk_insert || bulk_end)
- DBUG_RETURN(TRUE);
- DBUG_RETURN(FALSE);
-}
-
-bool spider_handlersocket_handler::sql_is_filled_up(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::sql_is_filled_up");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(FALSE);
-}
-
-bool spider_handlersocket_handler::sql_is_empty(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::sql_is_empty");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(FALSE);
-}
-
-bool spider_handlersocket_handler::support_multi_split_read()
-{
- DBUG_ENTER("spider_handlersocket_handler::support_multi_split_read");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(FALSE);
-}
-
-bool spider_handlersocket_handler::support_bulk_update()
-{
- DBUG_ENTER("spider_handlersocket_handler::support_bulk_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(FALSE);
-}
-
-int spider_handlersocket_handler::bulk_tmp_table_insert()
-{
- DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::bulk_tmp_table_insert(
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::bulk_tmp_table_end_bulk_insert()
-{
- DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_end_bulk_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::bulk_tmp_table_rnd_init()
-{
- DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_rnd_init");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::bulk_tmp_table_rnd_next()
-{
- DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_rnd_next");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::bulk_tmp_table_rnd_end()
-{
- DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_rnd_end");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-bool spider_handlersocket_handler::need_copy_for_update(
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::need_copy_for_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(TRUE);
-}
-
-bool spider_handlersocket_handler::bulk_tmp_table_created()
-{
- DBUG_ENTER("spider_handlersocket_handler::bulk_tmp_table_created");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(FALSE);
-}
-
-int spider_handlersocket_handler::mk_bulk_tmp_table_and_bulk_start()
-{
- DBUG_ENTER("spider_handlersocket_handler::mk_bulk_tmp_table_and_bulk_start");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-void spider_handlersocket_handler::rm_bulk_tmp_table()
-{
- DBUG_ENTER("spider_handlersocket_handler::rm_bulk_tmp_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-
-int spider_handlersocket_handler::insert_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::insert_lock_tables_list");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx,
- int *appended
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_lock_tables_list");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::realloc_sql(
- ulong *realloced
-) {
- THD *thd = spider->trx->thd;
- st_spider_share *share = spider->share;
- int init_sql_alloc_size =
- spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
- DBUG_ENTER("spider_handlersocket_handler::realloc_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((int) hs_sql.alloced_length() > init_sql_alloc_size * 2)
- {
- hs_sql.free();
- if (hs_sql.real_alloc(init_sql_alloc_size))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- *realloced |= SPIDER_SQL_TYPE_FULL_HS;
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reset_sql(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::reset_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
- {
- hs_sql.length(0);
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reset_keys(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::reset_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
- {
- hs_keys.clear();
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reset_upds(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::reset_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
- {
- hs_upds.clear();
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reset_strs(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::reset_strs");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
- {
- hs_strs.clear();
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reset_strs_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::reset_strs_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & SPIDER_SQL_TYPE_FULL_HS)
- {
- hs_strs_pos = 0;
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::push_back_upds(
- SPIDER_HS_STRING_REF &info
-) {
- int error_num;
- DBUG_ENTER("spider_handlersocket_handler::push_back_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = hs_upds.push_back(info);
- DBUG_RETURN(error_num);
-}
-
-int spider_handlersocket_handler::request_buf_find(
- int link_idx
-) {
- int error_num;
- spider_string *hs_str;
- SPIDER_CONN *conn;
- uint handler_id;
- DBUG_ENTER("spider_handlersocket_handler::request_buf_find");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(hs_str = hs_strs.add(&hs_strs_pos, hs_sql.ptr(), hs_sql.length())))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if (spider->conn_kind[link_idx] == SPIDER_CONN_KIND_HS_READ)
- {
- conn = spider->hs_r_conns[link_idx];
- handler_id = spider->r_handler_id[link_idx];
- } else {
- conn = spider->hs_w_conns[link_idx];
- handler_id = spider->w_handler_id[link_idx];
- }
- if ((error_num = spider_db_conn_queue_action(conn)))
- DBUG_RETURN(error_num);
- if (!spider_bit_is_set(spider->db_request_phase, link_idx))
- {
- spider_set_bit(spider->db_request_phase, link_idx);
- ++spider->db_request_id[link_idx];
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id = spider->trx->spider_thread_id;
- request_key.query_id = spider->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[link_idx];
- request_key.next = NULL;
- conn->db_conn->append_select(
- handler_id, hs_str, &hs_keys,
- hs_limit, hs_skip, &request_key);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::request_buf_insert(
- int link_idx
-) {
- int error_num;
- DBUG_ENTER("spider_handlersocket_handler::request_buf_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- if ((error_num = spider_db_conn_queue_action(spider->hs_w_conns[link_idx])))
- DBUG_RETURN(error_num);
- if (!spider_bit_is_set(spider->db_request_phase, link_idx))
- {
- spider_set_bit(spider->db_request_phase, link_idx);
- ++spider->db_request_id[link_idx];
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id = spider->trx->spider_thread_id;
- request_key.query_id = spider->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[link_idx];
- request_key.next = NULL;
- spider->hs_w_conns[link_idx]->db_conn->append_insert(
- spider->w_handler_id[link_idx], &hs_upds, &request_key);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::request_buf_update(
- int link_idx
-) {
- int error_num;
- spider_string *hs_str;
- DBUG_ENTER("spider_handlersocket_handler::request_buf_update");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(hs_str = hs_strs.add(&hs_strs_pos, hs_sql.ptr(), hs_sql.length())))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if ((error_num = spider_db_conn_queue_action(spider->hs_w_conns[link_idx])))
- DBUG_RETURN(error_num);
- if (!spider_bit_is_set(spider->db_request_phase, link_idx))
- {
- spider_set_bit(spider->db_request_phase, link_idx);
- ++spider->db_request_id[link_idx];
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id = spider->trx->spider_thread_id;
- request_key.query_id = spider->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[link_idx];
- request_key.next = NULL;
- spider->hs_w_conns[link_idx]->db_conn->append_update(
- spider->w_handler_id[link_idx], hs_str, &hs_keys, &hs_upds,
- hs_limit, hs_skip,
- spider->hs_increment, spider->hs_decrement, &request_key
- );
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::request_buf_delete(
- int link_idx
-) {
- int error_num;
- spider_string *hs_str;
- DBUG_ENTER("spider_handlersocket_handler::request_buf_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(hs_str = hs_strs.add(&hs_strs_pos, hs_sql.ptr(), hs_sql.length())))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- if ((error_num = spider_db_conn_queue_action(spider->hs_w_conns[link_idx])))
- DBUG_RETURN(error_num);
- if (!spider_bit_is_set(spider->db_request_phase, link_idx))
- {
- spider_set_bit(spider->db_request_phase, link_idx);
- ++spider->db_request_id[link_idx];
- }
- st_spider_db_request_key request_key;
- request_key.spider_thread_id = spider->trx->spider_thread_id;
- request_key.query_id = spider->trx->thd->query_id;
- request_key.handler = spider;
- request_key.request_id = spider->db_request_id[link_idx];
- request_key.next = NULL;
- spider->hs_w_conns[link_idx]->db_conn->append_delete(
- spider->w_handler_id[link_idx], hs_str, &hs_keys,
- hs_limit, hs_skip, &request_key);
- DBUG_RETURN(0);
-}
-
-bool spider_handlersocket_handler::need_lock_before_set_sql_for_exec(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::need_lock_before_set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-#ifdef SPIDER_HAS_GROUP_BY_HANDLER
-int spider_handlersocket_handler::set_sql_for_exec(
- ulong sql_type,
- int link_idx,
- SPIDER_LINK_IDX_CHAIN *link_idx_chain
-) {
- DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-#endif
-
-int spider_handlersocket_handler::set_sql_for_exec(
- ulong sql_type,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- if (sql_type & SPIDER_SQL_TYPE_SELECT_HS)
- {
- DBUG_RETURN(request_buf_find(link_idx));
- }
- if (sql_type & SPIDER_SQL_TYPE_INSERT_HS)
- {
- DBUG_RETURN(request_buf_insert(link_idx));
- }
- if (sql_type & SPIDER_SQL_TYPE_UPDATE_HS)
- {
- DBUG_RETURN(request_buf_update(link_idx));
- }
- if (sql_type & SPIDER_SQL_TYPE_DELETE_HS)
- {
- DBUG_RETURN(request_buf_delete(link_idx));
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::set_sql_for_exec(
- spider_db_copy_table *tgt_ct,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::set_sql_for_exec");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::execute_sql(
- ulong sql_type,
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
-) {
- DBUG_ENTER("spider_handlersocket_handler::execute_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- if (!(sql_type & SPIDER_SQL_TYPE_FULL_HS))
- {
- /* nothing to do */
- DBUG_RETURN(0);
- }
- DBUG_RETURN(spider_db_query(
- conn,
- NULL,
- 0,
- quick_mode,
- need_mon
- ));
-}
-
-int spider_handlersocket_handler::reset()
-{
- DBUG_ENTER("spider_handlersocket_handler::reset");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::sts_mode_exchange(
- int sts_mode
-) {
- DBUG_ENTER("spider_handlersocket_handler::sts_mode_exchange");
- DBUG_PRINT("info",("spider sts_mode=%d", sts_mode));
- DBUG_RETURN(sts_mode);
-}
-
-int spider_handlersocket_handler::show_table_status(
- int link_idx,
- int sts_mode,
- uint flag
-) {
- spider_db_handlersocket_result res(NULL);
- SPIDER_SHARE *share = spider->share;
- ulonglong auto_increment_value = 0;
- DBUG_ENTER("spider_handlersocket_show_table_status");
- res.fetch_table_status(
- sts_mode,
- share->stat
- );
- if (auto_increment_value > share->lgtm_tblhnd_share->auto_increment_value)
- {
- share->lgtm_tblhnd_share->auto_increment_value = auto_increment_value;
- DBUG_PRINT("info",("spider auto_increment_value=%llu",
- share->lgtm_tblhnd_share->auto_increment_value));
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::crd_mode_exchange(
- int crd_mode
-) {
- DBUG_ENTER("spider_handlersocket_handler::crd_mode_exchange");
- DBUG_PRINT("info",("spider crd_mode=%d", crd_mode));
- DBUG_RETURN(crd_mode);
-}
-
-int spider_handlersocket_handler::show_index(
- int link_idx,
- int crd_mode
-) {
- DBUG_ENTER("spider_handlersocket_handler::show_index");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::show_records(
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::show_records");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::show_last_insert_id(
- int link_idx,
- ulonglong &last_insert_id
-) {
- DBUG_ENTER("spider_handlersocket_handler::show_last_insert_id");
- last_insert_id = 0;
- DBUG_RETURN(0);
-}
-
-ha_rows spider_handlersocket_handler::explain_select(
- key_range *start_key,
- key_range *end_key,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::explain_select");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::lock_tables(
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::lock_tables");
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::unlock_tables(
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::unlock_tables");
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::disable_keys(
- SPIDER_CONN *conn,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::disable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::enable_keys(
- SPIDER_CONN *conn,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::enable_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::check_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- DBUG_ENTER("spider_handlersocket_handler::check_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::repair_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
-) {
- DBUG_ENTER("spider_handlersocket_handler::repair_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::analyze_table(
- SPIDER_CONN *conn,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::analyze_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::optimize_table(
- SPIDER_CONN *conn,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::optimize_table");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::flush_tables(
- SPIDER_CONN *conn,
- int link_idx,
- bool lock
-) {
- DBUG_ENTER("spider_handlersocket_handler::flush_tables");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::flush_logs(
- SPIDER_CONN *conn,
- int link_idx
-) {
- DBUG_ENTER("spider_handlersocket_handler::flush_logs");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::insert_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
-) {
- spider_db_handlersocket *db_conn = (spider_db_handlersocket *) conn->db_conn;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash = &link_for_hash[link_idx];
- DBUG_ASSERT(tmp_link_for_hash->spider == spider);
- DBUG_ASSERT(tmp_link_for_hash->link_idx == link_idx);
- uint old_elements = db_conn->handler_open_array.max_element;
- DBUG_ENTER("spider_handlersocket_handler::insert_opened_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- if (insert_dynamic(&db_conn->handler_open_array,
- (uchar*) &tmp_link_for_hash))
- {
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
- if (db_conn->handler_open_array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- db_conn->handler_open_array,
- (db_conn->handler_open_array.max_element - old_elements) *
- db_conn->handler_open_array.size_of_element);
- }
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::delete_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
-) {
- spider_db_handlersocket *db_conn = (spider_db_handlersocket *) conn->db_conn;
- uint roop_count, elements = db_conn->handler_open_array.elements;
- SPIDER_LINK_FOR_HASH *tmp_link_for_hash;
- DBUG_ENTER("spider_handlersocket_handler::delete_opened_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- for (roop_count = 0; roop_count < elements; roop_count++)
- {
- get_dynamic(&db_conn->handler_open_array, (uchar *) &tmp_link_for_hash,
- roop_count);
- if (tmp_link_for_hash == &link_for_hash[link_idx])
- {
- delete_dynamic_element(&db_conn->handler_open_array, roop_count);
- break;
- }
- }
- DBUG_ASSERT(roop_count < elements);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::sync_from_clone_source(
- spider_db_handler *dbton_hdl
-) {
- spider_handlersocket_handler *hs_hdl =
- (spider_handlersocket_handler *) dbton_hdl;
- DBUG_ENTER("spider_handlersocket_handler::sync_from_clone_source");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_strs_pos = hs_hdl->hs_strs_pos;
- DBUG_RETURN(0);
-}
-
-bool spider_handlersocket_handler::support_use_handler(
- int use_handler
-) {
- DBUG_ENTER("spider_handlersocket_handler::support_use_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_RETURN(TRUE);
-}
-
-void spider_handlersocket_handler::minimum_select_bitmap_create()
-{
- TABLE *table = spider->get_table();
- Field **field_p;
- DBUG_ENTER("spider_handlersocket_handler::minimum_select_bitmap_create");
- memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set));
- if (
- spider->use_index_merge ||
-#ifdef HA_CAN_BULK_ACCESS
- (spider->is_clone && !spider->is_bulk_access_clone)
-#else
- spider->is_clone
-#endif
- ) {
- /* need preparing for cmp_ref */
- TABLE_SHARE *table_share = table->s;
- if (
- table_share->primary_key == MAX_KEY
- ) {
- /* need all columns */
- memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set));
- DBUG_VOID_RETURN;
- } else {
- /* need primary key columns */
- uint roop_count;
- KEY *key_info;
- KEY_PART_INFO *key_part;
- Field *field;
- key_info = &table_share->key_info[table_share->primary_key];
- key_part = key_info->key_part;
- for (roop_count = 0;
- roop_count < spider_user_defined_key_parts(key_info);
- roop_count++)
- {
- field = key_part[roop_count].field;
- spider_set_bit(minimum_select_bitmap, field->field_index);
- }
- }
- }
- for (field_p = table->field; *field_p; field_p++)
- {
- uint field_index = (*field_p)->field_index;
- if (
- spider_bit_is_set(spider->searched_bitmap, field_index) ||
- bitmap_is_set(table->read_set, field_index) ||
- bitmap_is_set(table->write_set, field_index)
- ) {
- spider_set_bit(minimum_select_bitmap, field_index);
- }
- }
- DBUG_VOID_RETURN;
-}
-
-bool spider_handlersocket_handler::minimum_select_bit_is_set(
- uint field_index
-) {
- DBUG_ENTER("spider_handlersocket_handler::minimum_select_bit_is_set");
- DBUG_PRINT("info",("spider field_index=%u", field_index));
- DBUG_PRINT("info",("spider minimum_select_bitmap=%s",
- spider_bit_is_set(minimum_select_bitmap, field_index) ?
- "TRUE" : "FALSE"));
- DBUG_RETURN(spider_bit_is_set(minimum_select_bitmap, field_index));
-}
-
-void spider_handlersocket_handler::copy_minimum_select_bitmap(
- uchar *bitmap
-) {
- int roop_count;
- TABLE *table = spider->get_table();
- DBUG_ENTER("spider_handlersocket_handler::copy_minimum_select_bitmap");
- for (roop_count = 0;
- roop_count < (int) ((table->s->fields + 7) / 8);
- roop_count++)
- {
- bitmap[roop_count] =
- minimum_select_bitmap[roop_count];
- DBUG_PRINT("info",("spider roop_count=%d", roop_count));
- DBUG_PRINT("info",("spider bitmap=%d",
- bitmap[roop_count]));
- }
- DBUG_VOID_RETURN;
-}
-
-int spider_handlersocket_handler::init_union_table_name_pos()
-{
- DBUG_ENTER("spider_handlersocket_handler::init_union_table_name_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::set_union_table_name_pos()
-{
- DBUG_ENTER("spider_handlersocket_handler::set_union_table_name_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reset_union_table_name(
- spider_string *str,
- int link_idx,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::reset_union_table_name");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-#ifdef SPIDER_HAS_GROUP_BY_HANDLER
-int spider_handlersocket_handler::append_list_item_select_part(
- List<Item> *select,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_list_item_select_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_from_and_tables_part(
- spider_fields *fields,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_from_and_tables_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::reappend_tables_part(
- spider_fields *fields,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::reappend_tables_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_where_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_where_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_having_part(
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_having_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_item_type_part(
- Item *item,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_item_type_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_group_by_part(
- ORDER *order,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_group_by_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_handlersocket_handler::append_order_by_part(
- ORDER *order,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields,
- ulong sql_type
-) {
- DBUG_ENTER("spider_handlersocket_handler::append_order_by_part");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-#endif
-#endif
diff --git a/storage/spider/spd_db_handlersocket.h b/storage/spider/spd_db_handlersocket.h
deleted file mode 100644
index f7a454b66af..00000000000
--- a/storage/spider/spd_db_handlersocket.h
+++ /dev/null
@@ -1,1091 +0,0 @@
-/* Copyright (C) 2012-2018 Kentoku Shiba
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-
-#define SPIDER_HS_CONN dena::hstcpcli_ptr
-#define SPIDER_HS_CONN_CREATE dena::hstcpcli_i::create
-#define SPIDER_HS_RESULT dena::hstresult
-#define SPIDER_HS_SOCKARGS dena::socket_args
-
-class spider_db_handlersocket_util: public spider_db_util
-{
-public:
- spider_db_handlersocket_util();
- ~spider_db_handlersocket_util();
- int append_name(
- spider_string *str,
- const char *name,
- uint name_length
- );
- int append_name_with_charset(
- spider_string *str,
- const char *name,
- uint name_length,
- CHARSET_INFO *name_charset
- );
- int append_escaped_name(
- spider_string *str,
- const char *name,
- uint name_length
- );
- int append_escaped_name_with_charset(
- spider_string *str,
- const char *name,
- uint name_length,
- CHARSET_INFO *name_charset
- );
- bool is_name_quote(
- const char head_code
- );
- int append_escaped_name_quote(
- spider_string *str
- );
- int append_column_value(
- ha_spider *spider,
- spider_string *str,
- Field *field,
- const uchar *new_ptr,
- CHARSET_INFO *access_charset
- );
- int append_trx_isolation(
- spider_string *str,
- int trx_isolation
- );
- int append_autocommit(
- spider_string *str,
- bool autocommit
- );
- int append_sql_log_off(
- spider_string *str,
- bool sql_log_off
- );
- int append_wait_timeout(
- spider_string *str,
- int wait_timeout
- );
- int append_sql_mode(
- spider_string *str,
- sql_mode_t sql_mode
- );
- int append_time_zone(
- spider_string *str,
- Time_zone *time_zone
- );
- int append_start_transaction(
- spider_string *str
- );
- int append_xa_start(
- spider_string *str,
- XID *xid
- );
- int append_lock_table_head(
- spider_string *str
- );
- int append_lock_table_body(
- spider_string *str,
- const char *db_name,
- uint db_name_length,
- CHARSET_INFO *db_name_charset,
- const char *table_name,
- uint table_name_length,
- CHARSET_INFO *table_name_charset,
- int lock_type
- );
- int append_lock_table_tail(
- spider_string *str
- );
- int append_unlock_table(
- spider_string *str
- );
- int open_item_func(
- Item_func *item_func,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int open_item_sum_func(
- Item_sum *item_sum,
- ha_spider *spider,
- spider_string *str,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields
- );
-#endif
- int append_escaped_util(
- spider_string *to,
- String *from
- );
- int append_escaped_util(
- spider_string *to,
- String *from
- );
-#ifdef SPIDER_HAS_GROUP_BY_HANDLER
- int append_from_and_tables(
- ha_spider *spider,
- spider_fields *fields,
- spider_string *str,
- TABLE_LIST *table_list,
- uint table_count
- );
- int reappend_tables(
- spider_fields *fields,
- SPIDER_LINK_IDX_CHAIN *link_idx_chain,
- spider_string *str
- );
- int append_where(
- spider_string *str
- );
- int append_having(
- spider_string *str
- );
-#endif
-};
-
-class spider_db_handlersocket_row: public spider_db_row
-{
-public:
- SPIDER_HS_STRING_REF *hs_row;
- SPIDER_HS_STRING_REF *hs_row_first;
- uint field_count;
- uint row_size;
- bool cloned;
- spider_db_handlersocket_row();
- ~spider_db_handlersocket_row();
- int store_to_field(
- Field *field,
- CHARSET_INFO *access_charset
- );
- int append_to_str(
- spider_string *str
- );
- int append_escaped_to_str(
- spider_string *str,
- uint dbton_id
- );
- void first();
- void next();
- bool is_null();
- int val_int();
- double val_real();
- my_decimal *val_decimal(
- my_decimal *decimal_value,
- CHARSET_INFO *access_charset
- );
- SPIDER_DB_ROW *clone();
- int store_to_tmp_table(
- TABLE *tmp_table,
- spider_string *str
- );
- uint get_byte_size();
-};
-
-class spider_db_handlersocket_result_buffer: public spider_db_result_buffer
-{
-public:
- SPIDER_HS_RESULT hs_result;
- spider_db_handlersocket_result_buffer();
- ~spider_db_handlersocket_result_buffer();
- void clear();
- bool check_size(
- longlong size
- );
-};
-
-class spider_db_handlersocket_result: public spider_db_result
-{
-public:
- SPIDER_HS_CONN *hs_conn_p;
- spider_db_handlersocket_row row;
- SPIDER_HS_STRING_REF hs_row;
- uint field_count;
- int store_error_num;
- spider_db_handlersocket_result(SPIDER_DB_CONN *in_db_conn);
- ~spider_db_handlersocket_result();
- bool has_result();
- void free_result();
- SPIDER_DB_ROW *current_row();
- SPIDER_DB_ROW *fetch_row();
- SPIDER_DB_ROW *fetch_row_from_result_buffer(
- spider_db_result_buffer *spider_res_buf
- );
- SPIDER_DB_ROW *fetch_row_from_tmp_table(
- TABLE *tmp_table
- );
- int fetch_table_status(
- int mode,
- ha_statistics &stat
- );
- int fetch_table_records(
- int mode,
- ha_rows &records
- );
- int fetch_table_cardinality(
- int mode,
- TABLE *table,
- longlong *cardinality,
- uchar *cardinality_upd,
- int bitmap_size
- );
- int fetch_table_mon_status(
- int &status
- );
- longlong num_rows();
- uint num_fields();
- void move_to_pos(
- longlong pos
- );
- int get_errno();
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
- int fetch_columns_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
- );
- int fetch_index_for_discover_table_structure(
- spider_string *str,
- CHARSET_INFO *access_charset
- );
- int fetch_table_for_discover_table_structure(
- spider_string *str,
- SPIDER_SHARE *spider_share,
- CHARSET_INFO *access_charset
- );
-#endif
-};
-
-class spider_db_handlersocket: public spider_db_conn
-{
- SPIDER_HS_CONN hs_conn;
- int stored_error;
- uint field_count;
-public:
- DYNAMIC_ARRAY handler_open_array;
- bool handler_open_array_inited;
- uint handler_open_array_id;
- const char *handler_open_array_func_name;
- const char *handler_open_array_file_name;
- ulong handler_open_array_line_no;
- st_spider_db_request_key *request_key_req_first;
- st_spider_db_request_key *request_key_req_last;
- st_spider_db_request_key *request_key_snd_first;
- st_spider_db_request_key *request_key_snd_last;
- st_spider_db_request_key *request_key_reuse_first;
- st_spider_db_request_key *request_key_reuse_last;
- spider_db_handlersocket(
- SPIDER_CONN *conn
- );
- ~spider_db_handlersocket();
- int init();
- bool is_connected();
- void bg_connect();
- int connect(
- char *tgt_host,
- char *tgt_username,
- char *tgt_password,
- long tgt_port,
- char *tgt_socket,
- char *server_name,
- int connect_retry_count,
- longlong connect_retry_interval
- );
- int ping();
- void bg_disconnect();
- void disconnect();
- int set_net_timeout();
- int exec_query(
- const char *query,
- uint length,
- int quick_mode
- );
- int get_errno();
- const char *get_error();
- bool is_server_gone_error(
- int error_num
- );
- bool is_dup_entry_error(
- int error_num
- );
- bool is_xa_nota_error(
- int error_num
- );
- spider_db_result *store_result(
- spider_db_result_buffer **spider_res_buf,
- st_spider_db_request_key *request_key,
- int *error_num
- );
- spider_db_result *use_result(
- ha_spider *spider,
- st_spider_db_request_key *request_key,
- int *error_num
- );
- int next_result();
- uint affected_rows();
- uint matched_rows();
- bool inserted_info(
- spider_db_handler *handler,
- spider_copy_info *copy_info
- );
- ulonglong last_insert_id();
- int set_character_set(
- const char *csname
- );
- int select_db(
- const char *dbname
- );
- int consistent_snapshot(
- int *need_mon
- );
- bool trx_start_in_bulk_sql();
- int start_transaction(
- int *need_mon
- );
- int commit(
- int *need_mon
- );
- int rollback(
- int *need_mon
- );
- bool xa_start_in_bulk_sql();
- int xa_start(
- XID *xid,
- int *need_mon
- );
- int xa_end(
- XID *xid,
- int *need_mon
- );
- int xa_prepare(
- XID *xid,
- int *need_mon
- );
- int xa_commit(
- XID *xid,
- int *need_mon
- );
- int xa_rollback(
- XID *xid,
- int *need_mon
- );
- bool set_trx_isolation_in_bulk_sql();
- int set_trx_isolation(
- int trx_isolation,
- int *need_mon
- );
- bool set_autocommit_in_bulk_sql();
- int set_autocommit(
- bool autocommit,
- int *need_mon
- );
- bool set_sql_log_off_in_bulk_sql();
- int set_sql_log_off(
- bool sql_log_off,
- int *need_mon
- );
- bool set_wait_timeout_in_bulk_sql();
- int set_wait_timeout(
- int wait_timeout,
- int *need_mon
- );
- bool set_sql_mode_in_bulk_sql();
- int set_sql_mode(
- sql_mode_t sql_mode,
- int *need_mon
- );
- bool set_time_zone_in_bulk_sql();
- int set_time_zone(
- Time_zone *time_zone,
- int *need_mon
- );
- int show_master_status(
- SPIDER_TRX *trx,
- SPIDER_SHARE *share,
- int all_link_idx,
- int *need_mon,
- TABLE *table,
- spider_string *str,
- int mode,
- SPIDER_DB_RESULT **res1,
- SPIDER_DB_RESULT **res2
- );
- int append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
- );
- int append_open_handler(
- uint handler_id,
- const char *db_name,
- const char *table_name,
- const char *index_name,
- const char *sql,
- st_spider_db_request_key *request_key
- );
- int append_select(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
- );
- int append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
- );
- int append_update(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- int limit,
- int skip,
- bool increment,
- bool decrement,
- st_spider_db_request_key *request_key
- );
- int append_delete(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
- );
- void reset_request_queue();
- size_t escape_string(
- char *to,
- const char *from,
- size_t from_length
- );
- bool have_lock_table_list();
- int append_lock_tables(
- spider_string *str
- );
- int append_unlock_tables(
- spider_string *str
- );
- uint get_lock_table_hash_count();
- void reset_lock_table_hash();
- uint get_opened_handler_count();
- void reset_opened_handler();
- void set_dup_key_idx(
- ha_spider *spider,
- int link_idx
- );
- int append_request_key(
- st_spider_db_request_key *request_key
- );
- void reset_request_key_req();
- void reset_request_key_snd();
- void move_request_key_to_snd();
- int check_request_key(
- st_spider_db_request_key *request_key
- );
- bool cmp_request_key_to_snd(
- st_spider_db_request_key *request_key
- );
-};
-
-class spider_handlersocket_share: public spider_db_share
-{
-public:
- spider_string *table_names_str;
- spider_string *db_names_str;
- spider_string *db_table_str;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- my_hash_value_type *db_table_str_hash_value;
-#endif
- uint table_nm_max_length;
- uint db_nm_max_length;
- spider_string *column_name_str;
- bool same_db_table_name;
- int first_all_link_idx;
- spider_handlersocket_share(
- st_spider_share *share
- );
- ~spider_handlersocket_share();
- int init();
- int append_table_name(
- spider_string *str,
- int all_link_idx
- );
- int create_table_names_str();
- void free_table_names_str();
- int create_column_name_str();
- void free_column_name_str();
- uint get_column_name_length(
- uint field_index
- );
- int append_column_name(
- spider_string *str,
- uint field_index
- );
- int append_column_name_with_alias(
- spider_string *str,
- uint field_index,
- const char *alias,
- uint alias_length
- );
- bool need_change_db_table_name();
-#ifdef SPIDER_HAS_DISCOVER_TABLE_STRUCTURE
- int discover_table_structure(
- SPIDER_TRX *trx,
- SPIDER_SHARE *spider_share,
- spider_string *str
- );
-#endif
-};
-
-class spider_handlersocket_handler: public spider_db_handler
-{
- spider_string hs_sql;
-public:
- bool hs_adding_keys;
- SPIDER_DB_HS_STRING_REF_BUFFER hs_keys;
- SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
- SPIDER_DB_HS_STR_BUFFER hs_strs;
- uint hs_strs_pos;
- int hs_limit;
- int hs_skip;
- spider_handlersocket_share *handlersocket_share;
- SPIDER_LINK_FOR_HASH *link_for_hash;
- uchar *minimum_select_bitmap;
- spider_handlersocket_handler(
- ha_spider *spider,
- spider_handlersocket_share *db_share
- );
- ~spider_handlersocket_handler();
- int init();
- int append_index_hint(
- spider_string *str,
- int link_idx,
- ulong sql_type
- );
- int append_table_name_with_adjusting(
- spider_string *str,
- int link_idx,
- ulong sql_type
- );
- int append_tmp_table_and_sql_for_bka(
- const key_range *start_key
- );
- int reuse_tmp_table_and_sql_for_bka();
- int append_union_table_and_sql_for_bka(
- const key_range *start_key
- );
- int reuse_union_table_and_sql_for_bka();
- int append_insert_for_recovery(
- ulong sql_type,
- int link_idx
- );
- int append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_update(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
- );
- int append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff
- );
- int append_delete(
- const TABLE *table,
- my_ptrdiff_t ptr_diff,
- int link_idx
- );
- int append_insert_part();
- int append_update_part();
- int append_delete_part();
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_increment_update_set_part();
-#endif
- int append_update_set_part();
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_direct_update_set_part();
-#endif
- int append_minimum_select_without_quote(
- spider_string *str
- );
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_minimum_select_by_field_idx_list(
- spider_string *str,
- uint32 *field_idxs,
- size_t field_idxs_num
- );
- int append_dup_update_pushdown_part(
- const char *alias,
- uint alias_length
- );
- int append_update_columns_part(
- const char *alias,
- uint alias_length
- );
- int check_update_columns_part();
- int append_select_part(
- ulong sql_type
- );
-#endif
- int append_table_select_part(
- ulong sql_type
- );
- int append_key_select_part(
- ulong sql_type,
- uint idx
- );
- int append_minimum_select_part(
- ulong sql_type
- );
- int append_hint_after_table_part(
- ulong sql_type
- );
- void set_where_pos(
- ulong sql_type
- );
- void set_where_to_pos(
- ulong sql_type
- );
- int check_item_type(
- Item *item
- );
- int append_values_connector_part(
- ulong sql_type
- );
- int append_values_terminator_part(
- ulong sql_type
- );
- int append_union_table_connector_part(
- ulong sql_type
- );
- int append_union_table_terminator_part(
- ulong sql_type
- );
- int append_key_column_values_part(
- const key_range *start_key,
- ulong sql_type
- );
- int append_key_column_values_with_name_part(
- const key_range *start_key,
- ulong sql_type
- );
- int append_key_where_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type
- );
- int append_key_where(
- spider_string *str,
- spider_string *str_part,
- spider_string *str_part2,
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type,
- bool set_order
- );
- int append_is_null_part(
- ulong sql_type,
- KEY_PART_INFO *key_part,
- const key_range *key,
- const uchar **ptr,
- bool key_eq,
- bool tgt_final
- );
- int append_is_null(
- ulong sql_type,
- spider_string *str,
- spider_string *str_part,
- spider_string *str_part2,
- KEY_PART_INFO *key_part,
- const key_range *key,
- const uchar **ptr,
- bool key_eq,
- bool tgt_final
- );
- int append_where_terminator_part(
- ulong sql_type,
- bool set_order,
- int key_count
- );
- int append_match_where_part(
- ulong sql_type
- );
- int append_condition_part(
- const char *alias,
- uint alias_length,
- ulong sql_type,
- bool test_flg
- );
- int append_match_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int append_sum_select_part(
- ulong sql_type,
- const char *alias,
- uint alias_length
- );
-#endif
- void set_order_pos(
- ulong sql_type
- );
- void set_order_to_pos(
- ulong sql_type
- );
-#ifdef HANDLER_HAS_DIRECT_AGGREGATE
- int append_group_by_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
-#endif
- int append_key_order_for_merge_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_for_direct_order_limit_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_key_order_with_alias_part(
- const char *alias,
- uint alias_length,
- ulong sql_type
- );
- int append_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
- );
- int reappend_limit_part(
- longlong offset,
- longlong limit,
- ulong sql_type
- );
- int append_select_lock_part(
- ulong sql_type
- );
- int append_union_all_start_part(
- ulong sql_type
- );
- int append_union_all_part(
- ulong sql_type
- );
- int append_union_all_end_part(
- ulong sql_type
- );
- int append_multi_range_cnt_part(
- ulong sql_type,
- uint multi_range_cnt,
- bool with_comma
- );
- int append_multi_range_cnt_with_name_part(
- ulong sql_type,
- uint multi_range_cnt
- );
- int append_open_handler_part(
- ulong sql_type,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_open_handler(
- spider_string *str,
- uint handler_id,
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_close_handler_part(
- ulong sql_type,
- int link_idx
- );
- int append_insert_terminator_part(
- ulong sql_type
- );
- int append_insert_values_part(
- ulong sql_type
- );
- int append_insert_values(
- spider_string *str
- );
- int append_into_part(
- ulong sql_type
- );
- void set_insert_to_pos(
- ulong sql_type
- );
- int append_from_part(
- ulong sql_type,
- int link_idx
- );
- int append_delete_all_rows_part(
- ulong sql_type
- );
- int append_explain_select_part(
- const key_range *start_key,
- const key_range *end_key,
- ulong sql_type,
- int link_idx
- );
- bool is_sole_projection_field(
- uint16 field_index
- );
- bool is_bulk_insert_exec_period(
- bool bulk_end
- );
- bool sql_is_filled_up(
- ulong sql_type
- );
- bool sql_is_empty(
- ulong sql_type
- );
- bool support_multi_split_read();
- bool support_bulk_update();
- int bulk_tmp_table_insert();
- int bulk_tmp_table_insert(
- int link_idx
- );
- int bulk_tmp_table_end_bulk_insert();
- int bulk_tmp_table_rnd_init();
- int bulk_tmp_table_rnd_next();
- int bulk_tmp_table_rnd_end();
- bool need_copy_for_update(
- int link_idx
- );
- bool bulk_tmp_table_created();
- int mk_bulk_tmp_table_and_bulk_start();
- void rm_bulk_tmp_table();
- int insert_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx
- );
- int append_lock_tables_list(
- SPIDER_CONN *conn,
- int link_idx,
- int *appended
- );
- int realloc_sql(
- ulong *realloced
- );
- int reset_sql(
- ulong sql_type
- );
- int reset_keys(
- ulong sql_type
- );
- int reset_upds(
- ulong sql_type
- );
- int reset_strs(
- ulong sql_type
- );
- int reset_strs_pos(
- ulong sql_type
- );
- int push_back_upds(
- SPIDER_HS_STRING_REF &info
- );
- int request_buf_find(
- int link_idx
- );
- int request_buf_insert(
- int link_idx
- );
- int request_buf_update(
- int link_idx
- );
- int request_buf_delete(
- int link_idx
- );
- bool need_lock_before_set_sql_for_exec(
- ulong sql_type
- );
-#ifdef SPIDER_HAS_GROUP_BY_HANDLER
- int set_sql_for_exec(
- ulong sql_type,
- int link_idx,
- SPIDER_LINK_IDX_CHAIN *link_idx_chain
- );
-#endif
- int set_sql_for_exec(
- ulong sql_type,
- int link_idx
- );
- int set_sql_for_exec(
- spider_db_copy_table *tgt_ct,
- ulong sql_type
- );
- int execute_sql(
- ulong sql_type,
- SPIDER_CONN *conn,
- int quick_mode,
- int *need_mon
- );
- int reset();
- int sts_mode_exchange(
- int sts_mode
- );
- int show_table_status(
- int link_idx,
- int sts_mode,
- uint flag
- );
- int crd_mode_exchange(
- int crd_mode
- );
- int show_index(
- int link_idx,
- int crd_mode
- );
- int show_records(
- int link_idx
- );
- int show_last_insert_id(
- int link_idx,
- ulonglong &last_insert_id
- );
- ha_rows explain_select(
- const key_range *start_key,
- const key_range *end_key,
- int link_idx
- );
- int lock_tables(
- int link_idx
- );
- int unlock_tables(
- int link_idx
- );
- int disable_keys(
- SPIDER_CONN *conn,
- int link_idx
- );
- int enable_keys(
- SPIDER_CONN *conn,
- int link_idx
- );
- int check_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int repair_table(
- SPIDER_CONN *conn,
- int link_idx,
- HA_CHECK_OPT* check_opt
- );
- int analyze_table(
- SPIDER_CONN *conn,
- int link_idx
- );
- int optimize_table(
- SPIDER_CONN *conn,
- int link_idx
- );
- int flush_tables(
- SPIDER_CONN *conn,
- int link_idx,
- bool lock
- );
- int flush_logs(
- SPIDER_CONN *conn,
- int link_idx
- );
- int insert_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
- );
- int delete_opened_handler(
- SPIDER_CONN *conn,
- int link_idx
- );
- int sync_from_clone_source(
- spider_db_handler *dbton_hdl
- );
- bool support_use_handler(
- int use_handler
- );
- void minimum_select_bitmap_create();
- bool minimum_select_bit_is_set(
- uint field_index
- );
- void copy_minimum_select_bitmap(
- uchar *bitmap
- );
- int init_union_table_name_pos();
- int set_union_table_name_pos();
- int reset_union_table_name(
- spider_string *str,
- int link_idx,
- ulong sql_type
- );
-#ifdef SPIDER_HAS_GROUP_BY_HANDLER
- int append_from_and_tables_part(
- spider_fields *fields,
- ulong sql_type
- );
- int reappend_tables_part(
- spider_fields *fields,
- ulong sql_type
- );
- int append_where_part(
- ulong sql_type
- );
- int append_having_part(
- ulong sql_type
- );
- int append_item_type_part(
- Item *item,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields,
- ulong sql_type
- );
- int append_list_item_select_part(
- List<Item> *select,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields,
- ulong sql_type
- );
- int append_group_by_part(
- ORDER *order,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields,
- ulong sql_type
- );
- int append_order_by_part(
- ORDER *order,
- const char *alias,
- uint alias_length,
- bool use_fields,
- spider_fields *fields,
- ulong sql_type
- );
-#endif
-};
diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h
index a7c9a571aef..09c39535f1f 100644
--- a/storage/spider/spd_db_include.h
+++ b/storage/spider/spd_db_include.h
@@ -14,10 +14,10 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-#include "hs_compat.h"
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#include "hstcpcli.hpp"
-#endif
+#define SPD_INIT_DYNAMIC_ARRAY2(A, B, C, D, E, F) \
+ my_init_dynamic_array2(PSI_INSTRUMENT_ME, A, B, C, D, E, F)
+#define SPD_INIT_ALLOC_ROOT(A, B, C, D) \
+ init_alloc_root(PSI_INSTRUMENT_ME, A, B, C, D)
#define SPIDER_DBTON_SIZE 15
@@ -116,26 +116,6 @@ typedef st_spider_result SPIDER_RESULT;
#define SPIDER_SQL_TABLE_NAME_STR "`table_name`"
#define SPIDER_SQL_TABLE_NAME_LEN sizeof(SPIDER_SQL_TABLE_NAME_STR) - 1
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#define SPIDER_SQL_HS_EQUAL_STR "="
-#define SPIDER_SQL_HS_EQUAL_LEN (sizeof(SPIDER_SQL_HS_EQUAL_STR) - 1)
-#define SPIDER_SQL_HS_GT_STR ">"
-#define SPIDER_SQL_HS_GT_LEN (sizeof(SPIDER_SQL_HS_GT_STR) - 1)
-#define SPIDER_SQL_HS_GTEQUAL_STR ">="
-#define SPIDER_SQL_HS_GTEQUAL_LEN (sizeof(SPIDER_SQL_HS_GTEQUAL_STR) - 1)
-#define SPIDER_SQL_HS_LT_STR "<"
-#define SPIDER_SQL_HS_LT_LEN (sizeof(SPIDER_SQL_HS_LT_STR) - 1)
-#define SPIDER_SQL_HS_INSERT_STR "+"
-#define SPIDER_SQL_HS_INSERT_LEN (sizeof(SPIDER_SQL_HS_INSERT_STR) - 1)
-#define SPIDER_SQL_HS_UPDATE_STR "U"
-#define SPIDER_SQL_HS_UPDATE_LEN (sizeof(SPIDER_SQL_HS_UPDATE_STR) - 1)
-#define SPIDER_SQL_HS_DELETE_STR "D"
-#define SPIDER_SQL_HS_DELETE_LEN (sizeof(SPIDER_SQL_HS_DELETE_STR) - 1)
-#define SPIDER_SQL_HS_INCREMENT_STR "+"
-#define SPIDER_SQL_HS_INCREMENT_LEN (sizeof(SPIDER_SQL_HS_INCREMENT_STR) - 1)
-#define SPIDER_SQL_HS_DECREMENT_STR "-"
-#define SPIDER_SQL_HS_DECREMENT_LEN (sizeof(SPIDER_SQL_HS_DECREMENT_STR) - 1)
-#endif
#define SPIDER_SQL_HS_LTEQUAL_STR "<="
#define SPIDER_SQL_HS_LTEQUAL_LEN (sizeof(SPIDER_SQL_HS_LTEQUAL_STR) - 1)
@@ -229,16 +209,9 @@ typedef st_spider_result SPIDER_RESULT;
#define SPIDER_SQL_LOP_CHK_PRM_PRF_LEN (sizeof(SPIDER_SQL_LOP_CHK_PRM_PRF_STR) - 1)
#define SPIDER_CONN_KIND_MYSQL (1 << 0)
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#define SPIDER_CONN_KIND_HS_READ (1 << 2)
-#define SPIDER_CONN_KIND_HS_WRITE (1 << 3)
-#endif
#define SPIDER_SQL_KIND_SQL (1 << 0)
#define SPIDER_SQL_KIND_HANDLER (1 << 1)
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#define SPIDER_SQL_KIND_HS (1 << 2)
-#endif
#define SPIDER_SQL_TYPE_SELECT_SQL (1 << 0)
#define SPIDER_SQL_TYPE_INSERT_SQL (1 << 1)
@@ -744,71 +717,6 @@ public:
);
};
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#define SPIDER_HS_UINT32_INFO dena::uint32_info
-#define SPIDER_HS_STRING_REF dena::string_ref
-#ifndef HANDLERSOCKET_MYSQL_UTIL
-#define SPIDER_HS_VECTOR std::vector
-class spider_db_hs_string_ref_buffer
-{
- SPIDER_HS_VECTOR<SPIDER_HS_STRING_REF> hs_conds;
-public:
- spider_db_hs_string_ref_buffer();
- ~spider_db_hs_string_ref_buffer();
- int init();
- void clear();
- int push_back(
- SPIDER_HS_STRING_REF &cond
- );
- SPIDER_HS_STRING_REF *ptr();
- uint size();
-};
-#else
-class spider_db_hs_string_ref_buffer
-{
- bool hs_da_init;
- DYNAMIC_ARRAY hs_conds;
- uint hs_conds_id;
- const char *hs_conds_func_name;
- const char *hs_conds_file_name;
- ulong hs_conds_line_no;
-public:
- spider_db_hs_string_ref_buffer();
- ~spider_db_hs_string_ref_buffer();
- int init();
- void clear();
- int push_back(
- SPIDER_HS_STRING_REF &cond
- );
- SPIDER_HS_STRING_REF *ptr();
- uint size();
-};
-#endif
-
-class spider_db_hs_str_buffer
-{
- bool hs_da_init;
- DYNAMIC_ARRAY hs_conds;
- uint hs_conds_id;
- const char *hs_conds_func_name;
- const char *hs_conds_file_name;
- ulong hs_conds_line_no;
-public:
- spider_db_hs_str_buffer();
- ~spider_db_hs_str_buffer();
- int init();
- void clear();
- spider_string *add(
- uint *strs_pos,
- const char *str,
- uint str_len
- );
-};
-
-#define SPIDER_DB_HS_STRING_REF_BUFFER spider_db_hs_string_ref_buffer
-#define SPIDER_DB_HS_STR_BUFFER spider_db_hs_str_buffer
-#endif
-
struct st_spider_db_request_key
{
ulonglong spider_thread_id;
@@ -1222,54 +1130,6 @@ public:
SPIDER_DB_RESULT **res1,
SPIDER_DB_RESULT **res2
) = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- virtual int append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
- ) = 0;
- virtual int append_open_handler(
- uint handler_id,
- const char *db_name,
- const char *table_name,
- const char *index_name,
- const char *sql,
- st_spider_db_request_key *request_key
- ) = 0;
- virtual int append_select(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
- ) = 0;
- virtual int append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
- ) = 0;
- virtual int append_update(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- int limit,
- int skip,
- bool increment,
- bool decrement,
- st_spider_db_request_key *request_key
- ) = 0;
- virtual int append_delete(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
- ) = 0;
- virtual void reset_request_queue() = 0;
-#endif
virtual size_t escape_string(
char *to,
const char *from,
@@ -1403,11 +1263,6 @@ public:
virtual int append_insert_part() = 0;
virtual int append_update_part() = 0;
virtual int append_delete_part() = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- virtual int append_increment_update_set_part() = 0;
-#endif
-#endif
virtual int append_update_set_part() = 0;
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
virtual int append_direct_update_set_part() = 0;
@@ -1646,23 +1501,6 @@ public:
virtual int reset_sql(
ulong sql_type
) = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- virtual int reset_keys(
- ulong sql_type
- ) = 0;
- virtual int reset_upds(
- ulong sql_type
- ) = 0;
- virtual int reset_strs(
- ulong sql_type
- ) = 0;
- virtual int reset_strs_pos(
- ulong sql_type
- ) = 0;
- virtual int push_back_upds(
- SPIDER_HS_STRING_REF &info
- ) = 0;
-#endif
virtual bool need_lock_before_set_sql_for_exec(
ulong sql_type
) = 0;
@@ -2026,19 +1864,6 @@ typedef struct st_spider_result_list
SPIDER_RESULT *current;
KEY *key_info;
int key_order;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ulonglong hs_upd_rows;
- SPIDER_DB_RESULT *hs_result;
- SPIDER_DB_RESULT_BUFFER *hs_result_buf;
- bool hs_has_result;
- SPIDER_DB_CONN *hs_conn;
-#endif
-#ifdef HA_CAN_BULK_ACCESS
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uchar *hs_r_bulk_open_index;
- uchar *hs_w_bulk_open_index;
-#endif
-#endif
spider_string *sqls;
int ha_read_kind;
bool have_sql_kind_backup;
diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc
index 99b20c419f4..78172c61355 100644
--- a/storage/spider/spd_db_mysql.cc
+++ b/storage/spider/spd_db_mysql.cc
@@ -1968,8 +1968,11 @@ int spider_db_mbase::connect(
conn->tgt_ssl_cert_length |
conn->tgt_ssl_key_length
) {
- mysql_ssl_set(db_conn, conn->tgt_ssl_key, conn->tgt_ssl_cert,
- conn->tgt_ssl_ca, conn->tgt_ssl_capath, conn->tgt_ssl_cipher);
+ mysql_options(db_conn, MYSQL_OPT_SSL_KEY, conn->tgt_ssl_key);
+ mysql_options(db_conn, MYSQL_OPT_SSL_CERT, conn->tgt_ssl_cert);
+ mysql_options(db_conn, MYSQL_OPT_SSL_CA, conn->tgt_ssl_ca);
+ mysql_options(db_conn, MYSQL_OPT_SSL_CAPATH, conn->tgt_ssl_capath);
+ mysql_options(db_conn, MYSQL_OPT_SSL_CIPHER, conn->tgt_ssl_cipher);
if (conn->tgt_ssl_vsc)
{
my_bool verify_flg = TRUE;
@@ -3729,97 +3732,6 @@ int spider_db_mbase::select_binlog_gtid_pos(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_db_mbase::append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_mbase::append_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mbase::append_open_handler(
- uint handler_id,
- const char *db_name,
- const char *table_name,
- const char *index_name,
- const char *sql,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_mbase::append_open_handler");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mbase::append_select(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_mbase::append_select");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mbase::append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_mbase::append_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mbase::append_update(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- int limit,
- int skip,
- bool increment,
- bool decrement,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_mbase::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_mbase::append_delete(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_mbase::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-void spider_db_mbase::reset_request_queue()
-{
- DBUG_ENTER("spider_db_mbase::reset_request_queue");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-#endif
-
size_t spider_db_mbase::escape_string(
char *to,
const char *from,
@@ -8944,9 +8856,6 @@ int spider_mbase_handler::init()
mysql_share->db_table_str_hash_value[roop_count];
#endif
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- hs_upds.init();
-#endif
DBUG_RETURN(0);
}
@@ -9857,67 +9766,6 @@ int spider_mbase_handler::append_delete(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_mbase_handler::append_increment_update_set_part()
-{
- int error_num;
- DBUG_ENTER("spider_mbase_handler::append_increment_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_increment_update_set(&update_sql);
- DBUG_RETURN(error_num);
-}
-
-int spider_mbase_handler::append_increment_update_set(
- spider_string *str
-) {
- uint field_name_length;
- uint roop_count;
- Field *field;
- DBUG_ENTER("spider_mbase_handler::append_increment_update_set");
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- const SPIDER_HS_STRING_REF *value = hs_upds.ptr();
- for (roop_count = 0; roop_count < hs_upds.size();
- roop_count++)
- {
- if (
- value[roop_count].size() == 1 &&
- *(value[roop_count].begin()) == '0'
- )
- continue;
-
- Field *top_table_field =
- spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
- if (!(field = spider->field_exchange(top_table_field)))
- continue;
- field_name_length =
- mysql_share->column_name_str[field->field_index].length();
-
- if (str->reserve(field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
- SPIDER_SQL_COMMA_LEN + value[roop_count].size()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- mysql_share->append_column_name(str, field->field_index);
- if (spider->hs_increment)
- str->q_append(SPIDER_SQL_HS_INCREMENT_STR,
- SPIDER_SQL_HS_INCREMENT_LEN);
- else
- str->q_append(SPIDER_SQL_HS_DECREMENT_STR,
- SPIDER_SQL_HS_DECREMENT_LEN);
- str->q_append(value[roop_count].begin(), value[roop_count].size());
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-#endif
-#endif
-
int spider_mbase_handler::append_update_set_part()
{
int error_num;
@@ -9997,13 +9845,6 @@ int spider_mbase_handler::append_direct_update_set_part()
int spider_mbase_handler::append_direct_update_set(
spider_string *str
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint field_name_length;
- SPIDER_SHARE *share = spider->share;
-#ifndef DBUG_OFF
- TABLE *table = spider->get_table();
-#endif
-#endif
DBUG_ENTER("spider_mbase_handler::append_direct_update_set");
if (
spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
@@ -10019,61 +9860,7 @@ int spider_mbase_handler::append_direct_update_set(
if (
(spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- size_t roop_count;
- Field *field;
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- for (roop_count = 0; roop_count < spider->hs_pushed_ret_fields_num;
- roop_count++)
- {
- Field *top_table_field =
- spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
- if (!(field = spider->field_exchange(top_table_field)))
- continue;
- field_name_length =
- mysql_share->column_name_str[field->field_index].length();
- if (top_table_field->is_null())
- {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- mysql_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
-#ifndef DBUG_OFF
- my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
- table->read_set);
-#endif
- if (
- spider_db_mbase_utility->
- append_column_value(spider, str, top_table_field, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_COMMA_LEN)
- ) {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- }
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
-#else
DBUG_ASSERT(0);
-#endif
}
DBUG_RETURN(0);
}
@@ -14060,54 +13847,6 @@ int spider_mbase_handler::reset_sql(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_mbase_handler::reset_keys(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mbase_handler::reset_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_mbase_handler::reset_upds(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mbase_handler::reset_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_upds.clear();
- DBUG_RETURN(0);
-}
-
-int spider_mbase_handler::reset_strs(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mbase_handler::reset_strs");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_mbase_handler::reset_strs_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_mbase_handler::reset_strs_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_mbase_handler::push_back_upds(
- SPIDER_HS_STRING_REF &info
-) {
- int error_num;
- DBUG_ENTER("spider_mbase_handler::push_back_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = hs_upds.push_back(info);
- DBUG_RETURN(error_num);
-}
-#endif
-
bool spider_mbase_handler::need_lock_before_set_sql_for_exec(
ulong sql_type
) {
diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h
index 6a95cece10f..df356a6d23e 100644
--- a/storage/spider/spd_db_mysql.h
+++ b/storage/spider/spd_db_mysql.h
@@ -577,54 +577,6 @@ public:
uint binlog_pos_length,
SPIDER_DB_RESULT **res
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
- );
- int append_open_handler(
- uint handler_id,
- const char *db_name,
- const char *table_name,
- const char *index_name,
- const char *sql,
- st_spider_db_request_key *request_key
- );
- int append_select(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
- );
- int append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
- );
- int append_update(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- int limit,
- int skip,
- bool increment,
- bool decrement,
- st_spider_db_request_key *request_key
- );
- int append_delete(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
- );
- void reset_request_queue();
-#endif
size_t escape_string(
char *to,
const char *from,
@@ -812,9 +764,6 @@ protected:
spider_string *exec_ha_sql;
bool reading_from_bulk_tmp_table;
bool filled_up;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
-#endif
SPIDER_INT_HLD *union_table_name_pos_first;
SPIDER_INT_HLD *union_table_name_pos_current;
public:
@@ -921,14 +870,6 @@ public:
int append_delete(
spider_string *str
);
- #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_increment_update_set_part();
- int append_increment_update_set(
- spider_string *str
- );
- #endif
- #endif
int append_update_set_part();
int append_update_set(
spider_string *str
@@ -1459,23 +1400,6 @@ public:
int reset_sql(
ulong sql_type
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int reset_keys(
- ulong sql_type
- );
- int reset_upds(
- ulong sql_type
- );
- int reset_strs(
- ulong sql_type
- );
- int reset_strs_pos(
- ulong sql_type
- );
- int push_back_upds(
- SPIDER_HS_STRING_REF &info
- );
-#endif
bool need_lock_before_set_sql_for_exec(
ulong sql_type
);
diff --git a/storage/spider/spd_db_oracle.cc b/storage/spider/spd_db_oracle.cc
index 77d3c808b70..3b0854e609d 100644
--- a/storage/spider/spd_db_oracle.cc
+++ b/storage/spider/spd_db_oracle.cc
@@ -2254,97 +2254,6 @@ int spider_db_oracle::show_master_status(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_db_oracle::append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_oracle::append_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::append_open_handler(
- uint handler_id,
- const char *db_name,
- const char *table_name,
- const char *index_name,
- const char *sql,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_oracle::append_sql");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::append_select(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_oracle::append_select");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_oracle::append_insert");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::append_update(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- int limit,
- int skip,
- bool increment,
- bool decrement,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_oracle::append_update");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_db_oracle::append_delete(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
-) {
- DBUG_ENTER("spider_db_oracle::append_delete");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-void spider_db_oracle::reset_request_queue()
-{
- DBUG_ENTER("spider_db_oracle::reset_request_queue");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_VOID_RETURN;
-}
-#endif
-
size_t spider_db_oracle::escape_string(
char *to,
const char *from,
@@ -5646,9 +5555,6 @@ int spider_oracle_handler::init()
oracle_share->db_table_str_hash_value[roop_count];
#endif
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- hs_upds.init();
-#endif
DBUG_RETURN(0);
}
@@ -6417,78 +6323,6 @@ int spider_oracle_handler::append_delete(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-int spider_oracle_handler::append_increment_update_set_part()
-{
- int error_num;
- DBUG_ENTER("spider_oracle_handler::append_increment_update_set_part");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = append_increment_update_set(&update_sql);
- DBUG_RETURN(error_num);
-}
-
-int spider_oracle_handler::append_increment_update_set(
- spider_string *str
-) {
- uint field_name_length;
- uint roop_count;
- Field *field;
- DBUG_ENTER("spider_oracle_handler::append_increment_update_set");
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- const SPIDER_HS_STRING_REF *value = hs_upds.ptr();
- for (roop_count = 0; roop_count < hs_upds.size();
- roop_count++)
- {
- DBUG_PRINT("info",("spider value_size[%u]=%zu", roop_count,
- value[roop_count].size()));
-#ifndef DBUG_OFF
- char print_buf[MAX_FIELD_WIDTH];
- if (value[roop_count].size() < MAX_FIELD_WIDTH)
- {
- memcpy(print_buf, value[roop_count].begin(), value[roop_count].size());
- print_buf[value[roop_count].size()] = '\0';
- DBUG_PRINT("info",("spider value[%u]=%s", roop_count, print_buf));
- }
-#endif
- if (
- value[roop_count].size() == 1 &&
- *(value[roop_count].begin()) == '0'
- )
- continue;
-
- Field *top_table_field =
- spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
- if (!(field = spider->field_exchange(top_table_field)))
- continue;
- field_name_length =
- oracle_share->column_name_str[field->field_index].length();
-
- if (str->reserve(field_name_length * 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 4 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_HS_INCREMENT_LEN +
- SPIDER_SQL_COMMA_LEN + value[roop_count].size()))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
-
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- oracle_share->append_column_name(str, field->field_index);
- if (spider->hs_increment)
- str->q_append(SPIDER_SQL_HS_INCREMENT_STR,
- SPIDER_SQL_HS_INCREMENT_LEN);
- else
- str->q_append(SPIDER_SQL_HS_DECREMENT_STR,
- SPIDER_SQL_HS_DECREMENT_LEN);
- str->q_append(value[roop_count].begin(), value[roop_count].size());
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
- DBUG_RETURN(0);
-}
-#endif
-#endif
-
int spider_oracle_handler::append_update_set_part()
{
int error_num;
@@ -6573,13 +6407,6 @@ int spider_oracle_handler::append_direct_update_set_part()
int spider_oracle_handler::append_direct_update_set(
spider_string *str
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint field_name_length;
- SPIDER_SHARE *share = spider->share;
-#ifndef DBUG_OFF
- TABLE *table = spider->get_table();
-#endif
-#endif
DBUG_ENTER("spider_oracle_handler::append_direct_update_set");
if (
spider->direct_update_kinds == SPIDER_SQL_KIND_SQL &&
@@ -6594,61 +6421,7 @@ int spider_oracle_handler::append_direct_update_set(
if (
(spider->direct_update_kinds & SPIDER_SQL_KIND_SQL)
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- size_t roop_count;
- Field *field;
- if (str->reserve(SPIDER_SQL_SET_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- str->q_append(SPIDER_SQL_SET_STR, SPIDER_SQL_SET_LEN);
- for (roop_count = 0; roop_count < spider->hs_pushed_ret_fields_num;
- roop_count++)
- {
- Field *top_table_field =
- spider->get_top_table_field(spider->hs_pushed_ret_fields[roop_count]);
- if (!(field = spider->field_exchange(top_table_field)))
- continue;
- field_name_length =
- oracle_share->column_name_str[field->field_index].length();
- if (top_table_field->is_null())
- {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN + SPIDER_SQL_NULL_LEN +
- SPIDER_SQL_COMMA_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
- str->q_append(SPIDER_SQL_NULL_STR, SPIDER_SQL_NULL_LEN);
- } else {
- if (str->reserve(field_name_length + /* SPIDER_SQL_NAME_QUOTE_LEN */
- 2 + SPIDER_SQL_EQUAL_LEN))
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- oracle_share->append_column_name(str, field->field_index);
- str->q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN);
-#ifndef DBUG_OFF
- my_bitmap_map *tmp_map = dbug_tmp_use_all_columns(table,
- table->read_set);
-#endif
- if (
- spider_db_oracle_utility.
- append_column_value(spider, str, top_table_field, NULL,
- share->access_charset) ||
- str->reserve(SPIDER_SQL_COMMA_LEN)
- ) {
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- DBUG_RETURN(HA_ERR_OUT_OF_MEM);
- }
-#ifndef DBUG_OFF
- dbug_tmp_restore_column_map(table->read_set, tmp_map);
-#endif
- }
- str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN);
- }
- str->length(str->length() - SPIDER_SQL_COMMA_LEN);
-#else
DBUG_ASSERT(0);
-#endif
}
DBUG_RETURN(0);
}
@@ -10784,54 +10557,6 @@ int spider_oracle_handler::reset_sql(
DBUG_RETURN(0);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-int spider_oracle_handler::reset_keys(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_keys");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reset_upds(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- hs_upds.clear();
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reset_strs(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_strs");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::reset_strs_pos(
- ulong sql_type
-) {
- DBUG_ENTER("spider_oracle_handler::reset_strs_pos");
- DBUG_PRINT("info",("spider this=%p", this));
- DBUG_ASSERT(0);
- DBUG_RETURN(0);
-}
-
-int spider_oracle_handler::push_back_upds(
- SPIDER_HS_STRING_REF &info
-) {
- int error_num;
- DBUG_ENTER("spider_oracle_handler::push_back_upds");
- DBUG_PRINT("info",("spider this=%p", this));
- error_num = hs_upds.push_back(info);
- DBUG_RETURN(error_num);
-}
-#endif
-
bool spider_oracle_handler::need_lock_before_set_sql_for_exec(
ulong sql_type
) {
diff --git a/storage/spider/spd_db_oracle.h b/storage/spider/spd_db_oracle.h
index c8c1522599f..357fee35c67 100644
--- a/storage/spider/spd_db_oracle.h
+++ b/storage/spider/spd_db_oracle.h
@@ -473,54 +473,6 @@ public:
SPIDER_DB_RESULT **res1,
SPIDER_DB_RESULT **res2
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int append_sql(
- char *sql,
- ulong sql_length,
- st_spider_db_request_key *request_key
- );
- int append_open_handler(
- uint handler_id,
- const char *db_name,
- const char *table_name,
- const char *index_name,
- const char *sql,
- st_spider_db_request_key *request_key
- );
- int append_select(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
- );
- int append_insert(
- uint handler_id,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- st_spider_db_request_key *request_key
- );
- int append_update(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- SPIDER_DB_HS_STRING_REF_BUFFER *upds,
- int limit,
- int skip,
- bool increment,
- bool decrement,
- st_spider_db_request_key *request_key
- );
- int append_delete(
- uint handler_id,
- spider_string *sql,
- SPIDER_DB_HS_STRING_REF_BUFFER *keys,
- int limit,
- int skip,
- st_spider_db_request_key *request_key
- );
- void reset_request_queue();
-#endif
size_t escape_string(
char *to,
const char *from,
@@ -685,9 +637,6 @@ private:
bool filled_up;
bool select_rownum_appended;
bool update_rownum_appended;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_DB_HS_STRING_REF_BUFFER hs_upds;
-#endif
SPIDER_INT_HLD *union_table_name_pos_first;
SPIDER_INT_HLD *union_table_name_pos_current;
public:
@@ -792,14 +741,6 @@ public:
int append_delete(
spider_string *str
);
- #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- int append_increment_update_set_part();
- int append_increment_update_set(
- spider_string *str
- );
- #endif
- #endif
int append_update_set_part();
int append_update_set(
spider_string *str
@@ -1330,23 +1271,6 @@ public:
int reset_sql(
ulong sql_type
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int reset_keys(
- ulong sql_type
- );
- int reset_upds(
- ulong sql_type
- );
- int reset_strs(
- ulong sql_type
- );
- int reset_strs_pos(
- ulong sql_type
- );
- int push_back_upds(
- SPIDER_HS_STRING_REF &info
- );
-#endif
bool need_lock_before_set_sql_for_exec(
ulong sql_type
);
diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc
index 1d9098833f4..85d16c1f347 100644
--- a/storage/spider/spd_direct_sql.cc
+++ b/storage/spider/spd_direct_sql.cc
@@ -220,54 +220,22 @@ int spider_udf_direct_sql_create_conn_key(
spider_dbton[roop_count2].wrapper &&
!strcmp(direct_sql->tgt_wrapper, spider_dbton[roop_count2].wrapper)
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
if (spider_dbton[roop_count2].db_access_type ==
SPIDER_DB_ACCESS_TYPE_SQL)
{
direct_sql->dbton_id = roop_count2;
break;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (spider_dbton[roop_count2].db_access_type ==
- SPIDER_DB_ACCESS_TYPE_NOSQL)
- {
- direct_sql->dbton_id = roop_count2;
- break;
- }
- }
-#endif
}
}
if (direct_sql->dbton_id == SPIDER_DBTON_SIZE)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
my_printf_error(
ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM,
ER_SPIDER_SQL_WRAPPER_IS_INVALID_STR,
MYF(0), direct_sql->tgt_wrapper);
DBUG_RETURN(ER_SPIDER_SQL_WRAPPER_IS_INVALID_NUM);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- my_printf_error(
- ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM,
- ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR,
- MYF(0), direct_sql->tgt_wrapper);
- DBUG_RETURN(ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM);
- }
-#endif
}
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
tables_on_different_db_are_joinable =
spider_dbton[direct_sql->dbton_id].db_util->
tables_on_different_db_are_joinable();
@@ -292,16 +260,6 @@ int spider_udf_direct_sql_create_conn_key(
+ direct_sql->tgt_dsn_length + 1
+ direct_sql->tgt_filedsn_length + 1
+ direct_sql->tgt_driver_length;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- direct_sql->conn_key_length
- = 1
- + direct_sql->tgt_wrapper_length + 1
- + direct_sql->tgt_host_length + 1
- + 5 + 1
- + direct_sql->tgt_socket_length;
- }
-#endif
if (!(direct_sql->conn_key = (char *)
spider_malloc(spider_current_trx, 9, direct_sql->conn_key_length + 1,
MYF(MY_WME | MY_ZEROFILL)))
@@ -328,12 +286,11 @@ int spider_udf_direct_sql_create_conn_key(
{
DBUG_PRINT("info",("spider tgt_socket=%s", direct_sql->tgt_socket));
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_socket);
- } else
- tmp_name++;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
+ }
+ else
{
-#endif
+ tmp_name++;
+ }
if (!tables_on_different_db_are_joinable)
{
if (direct_sql->tgt_default_db_name)
@@ -425,9 +382,6 @@ int spider_udf_direct_sql_create_conn_key(
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_driver);
} else
tmp_name++;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
direct_sql->conn_key_hash_value = my_calc_hash(&spider_open_connections,
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length);
@@ -456,10 +410,6 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
UTC = my_tz_find(current_thd, &tz_00_name);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
tables_on_different_db_are_joinable =
spider_dbton[direct_sql->dbton_id].db_util->
tables_on_different_db_are_joinable();
@@ -496,24 +446,6 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
goto error_alloc_conn;
}
conn->default_database.init_calc_mem(138);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- if (!(conn = (SPIDER_CONN *)
- spider_bulk_malloc(spider_current_trx, 33, MYF(MY_WME | MY_ZEROFILL),
- &conn, (uint) (sizeof(*conn)),
- &tmp_name, (uint) (direct_sql->conn_key_length + 1),
- &tmp_host, (uint) (direct_sql->tgt_host_length + 1),
- &tmp_socket, (uint) (direct_sql->tgt_socket_length + 1),
- &tmp_wrapper, (uint) (direct_sql->tgt_wrapper_length + 1),
- &need_mon, (uint) (sizeof(int)),
- NullS))
- ) {
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error_alloc_conn;
- }
- conn->default_database.init_calc_mem(103);
- }
-#endif
conn->conn_key_length = direct_sql->conn_key_length;
conn->conn_key = tmp_name;
@@ -525,10 +457,6 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
conn->tgt_host_length = direct_sql->tgt_host_length;
conn->tgt_host = tmp_host;
memcpy(conn->tgt_host, direct_sql->tgt_host, direct_sql->tgt_host_length);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
conn->tgt_port = direct_sql->tgt_port;
conn->tgt_socket_length = direct_sql->tgt_socket_length;
conn->tgt_socket = tmp_socket;
@@ -630,18 +558,6 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
} else
conn->tgt_driver = NULL;
conn->tgt_ssl_vsc = direct_sql->tgt_ssl_vsc;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- conn->hs_port = direct_sql->tgt_port;
- if (direct_sql->tgt_socket)
- {
- conn->hs_sock_length = direct_sql->tgt_socket_length;
- conn->hs_sock = tmp_socket;
- memcpy(conn->hs_sock, direct_sql->tgt_socket,
- direct_sql->tgt_socket_length);
- }
- }
-#endif
conn->dbton_id = direct_sql->dbton_id;
conn->conn_need_mon = need_mon;
conn->need_mon = need_mon;
@@ -660,19 +576,7 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
conn->semi_trx_isolation = -2;
conn->semi_trx_isolation_chk = FALSE;
conn->semi_trx_chk = FALSE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
conn->conn_kind = SPIDER_CONN_KIND_MYSQL;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (direct_sql->access_mode == 1)
- {
- conn->conn_kind = SPIDER_CONN_KIND_HS_READ;
- } else {
- conn->conn_kind = SPIDER_CONN_KIND_HS_WRITE;
- }
-#endif
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&conn->mta_conn_mutex, MY_MUTEX_INIT_FAST))
@@ -763,82 +667,26 @@ SPIDER_CONN *spider_udf_direct_sql_get_conn(
) {
SPIDER_CONN *conn = NULL;
DBUG_ENTER("spider_udf_direct_sql_get_conn");
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- DBUG_PRINT("info",("spider direct_sql->access_mode=%d",
- direct_sql->access_mode));
-#endif
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (direct_sql->access_mode == 0 &&
-#endif
!(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
&trx->trx_conn_hash, direct_sql->conn_key_hash_value,
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length))
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ) ||
- (direct_sql->access_mode == 1 &&
- !(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
- &trx->trx_direct_hs_r_conn_hash, direct_sql->conn_key_hash_value,
- (uchar*) direct_sql->conn_key, direct_sql->conn_key_length))
- ) ||
- (direct_sql->access_mode == 2 &&
- !(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
- &trx->trx_direct_hs_w_conn_hash, direct_sql->conn_key_hash_value,
- (uchar*) direct_sql->conn_key, direct_sql->conn_key_length))
- )
-#endif
)
#else
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (direct_sql->access_mode == 0 &&
-#endif
!(conn = (SPIDER_CONN*) my_hash_search(&trx->trx_conn_hash,
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length))
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ) ||
- (direct_sql->access_mode == 1 &&
- !(conn = (SPIDER_CONN*) my_hash_search(&trx->trx_direct_hs_r_conn_hash,
- (uchar*) direct_sql->conn_key, direct_sql->conn_key_length))
- ) ||
- (direct_sql->access_mode == 2 &&
- !(conn = (SPIDER_CONN*) my_hash_search(&trx->trx_direct_hs_w_conn_hash,
- (uchar*) direct_sql->conn_key, direct_sql->conn_key_length))
- )
-#endif
)
#endif
{
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (direct_sql->access_mode == 0 &&
-#endif
(
(spider_param_conn_recycle_mode(trx->thd) & 1) ||
spider_param_conn_recycle_strict(trx->thd)
)
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ) ||
- (direct_sql->access_mode == 1 &&
- (
- (spider_param_hs_r_conn_recycle_mode(trx->thd) & 1) ||
- spider_param_hs_r_conn_recycle_strict(trx->thd)
- )
- ) ||
- (direct_sql->access_mode == 2 &&
- (
- (spider_param_hs_w_conn_recycle_mode(trx->thd) & 1) ||
- spider_param_hs_w_conn_recycle_strict(trx->thd)
- )
- )
-#endif
) {
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
pthread_mutex_lock(&spider_conn_mutex);
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
if (!(conn = (SPIDER_CONN*) my_hash_search_using_hash_value(
@@ -864,9 +712,6 @@ SPIDER_CONN *spider_udf_direct_sql_get_conn(
pthread_mutex_unlock(&spider_conn_mutex);
DBUG_PRINT("info",("spider get global conn"));
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
} else {
DBUG_PRINT("info",("spider create new conn"));
/* conn_recycle_strict = 0 and conn_recycle_mode = 0 or 2 */
@@ -876,10 +721,6 @@ SPIDER_CONN *spider_udf_direct_sql_get_conn(
conn->thd = trx->thd;
conn->priority = direct_sql->priority;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 0)
- {
-#endif
uint old_elements = trx->trx_conn_hash.array.max_element;
#ifdef HASH_UPDATE_WITH_HASH_VALUE
if (my_hash_insert_with_hash_value(&trx->trx_conn_hash,
@@ -899,50 +740,6 @@ SPIDER_CONN *spider_udf_direct_sql_get_conn(
(trx->trx_conn_hash.array.max_element - old_elements) *
trx->trx_conn_hash.array.size_of_element);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (direct_sql->access_mode == 1)
- {
- uint old_elements = trx->trx_direct_hs_r_conn_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(&trx->trx_direct_hs_r_conn_hash,
- direct_sql->conn_key_hash_value, (uchar*) conn))
-#else
- if (my_hash_insert(&trx->trx_direct_hs_r_conn_hash, (uchar*) conn))
-#endif
- {
- spider_free_conn(conn);
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error;
- }
- if (trx->trx_direct_hs_r_conn_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- trx->trx_direct_hs_r_conn_hash,
- (trx->trx_direct_hs_r_conn_hash.array.max_element - old_elements) *
- trx->trx_direct_hs_r_conn_hash.array.size_of_element);
- }
- } else {
- uint old_elements = trx->trx_direct_hs_w_conn_hash.array.max_element;
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- if (my_hash_insert_with_hash_value(&trx->trx_direct_hs_w_conn_hash,
- direct_sql->conn_key_hash_value, (uchar*) conn))
-#else
- if (my_hash_insert(&trx->trx_direct_hs_w_conn_hash, (uchar*) conn))
-#endif
- {
- spider_free_conn(conn);
- *error_num = HA_ERR_OUT_OF_MEM;
- goto error;
- }
- if (trx->trx_direct_hs_w_conn_hash.array.max_element > old_elements)
- {
- spider_alloc_calc_mem(spider_current_trx,
- trx->trx_direct_hs_w_conn_hash,
- (trx->trx_direct_hs_w_conn_hash.array.max_element - old_elements) *
- trx->trx_direct_hs_w_conn_hash.array.size_of_element);
- }
- }
-#endif
}
if (conn->queued_connect)
@@ -1228,9 +1025,6 @@ int spider_udf_parse_direct_sql_param(
direct_sql->net_write_timeout = -1;
direct_sql->bulk_insert_rows = -1;
direct_sql->connection_channel = -1;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- direct_sql->access_mode = -1;
-#endif
#if MYSQL_VERSION_ID < 50500
#else
direct_sql->use_real_table = -1;
@@ -1290,9 +1084,6 @@ int spider_udf_parse_direct_sql_param(
goto error;
continue;
case 3:
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_INT_WITH_MAX("acm", access_mode, 0, 2);
-#endif
SPIDER_PARAM_LONGLONG("bir", bulk_insert_rows, 0);
SPIDER_PARAM_INT_WITH_MAX("cch", connection_channel, 0, 63);
SPIDER_PARAM_INT("cto", connect_timeout, 0);
@@ -1352,9 +1143,6 @@ int spider_udf_parse_direct_sql_param(
error_num = param_string_parse.print_param_error();
goto error;
case 11:
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_INT_WITH_MAX("access_mode", access_mode, 0, 2);
-#endif
error_num = param_string_parse.print_param_error();
goto error;
case 12:
@@ -1451,9 +1239,6 @@ int spider_udf_set_direct_sql_param_default(
}
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- direct_sql->access_mode == 0 &&
-#endif
!direct_sql->tgt_socket &&
(!direct_sql->tgt_host || !strcmp(direct_sql->tgt_host, my_localhost))
) {
@@ -1620,20 +1405,8 @@ int spider_udf_set_direct_sql_param_default(
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == -1)
- direct_sql->access_mode = 0;
-#endif
-
if (port_has_default_value)
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (direct_sql->access_mode == 1)
- direct_sql->tgt_port = 9998;
- else if (direct_sql->access_mode == 2)
- direct_sql->tgt_port = 9999;
- else
-#endif
direct_sql->tgt_port = MYSQL_PORT;
}
else if (direct_sql->tgt_port < 0)
@@ -1897,15 +1670,8 @@ long long spider_direct_sql_body(
goto error;
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (trx->trx_start && direct_sql->access_mode != 1)
- {
-#endif
trx->updated_in_this_trx = TRUE;
DBUG_PRINT("info",("spider trx->updated_in_this_trx=TRUE"));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
#if MYSQL_VERSION_ID < 50500
#else
use_real_table = spider_param_udf_ds_use_real_table(thd,
diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h
index 25eeb87d5ff..dde20098a4a 100644
--- a/storage/spider/spd_include.h
+++ b/storage/spider/spd_include.h
@@ -469,11 +469,6 @@ typedef struct st_spider_conn
#endif
int link_idx;
spider_db_conn *db_conn;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- query_id_t hsc_query_id;
- ulonglong hs_pre_age;
- ulonglong hs_age;
-#endif
uint opened_handlers;
ulonglong conn_id;
ulonglong connection_id;
@@ -538,10 +533,6 @@ typedef struct st_spider_conn
char *tgt_driver;
long tgt_port;
long tgt_ssl_vsc;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char *hs_sock;
- long hs_port;
-#endif
uint tgt_host_length;
uint tgt_username_length;
@@ -559,9 +550,6 @@ typedef struct st_spider_conn
uint tgt_dsn_length;
uint tgt_filedsn_length;
uint tgt_driver_length;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint hs_sock_length;
-#endif
uint dbton_id;
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -748,11 +736,6 @@ typedef struct st_spider_wide_handler
uchar *rnd_write_bitmap;
SPIDER_CONDITION *condition;
void *owner;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- uint32 *hs_pushed_ret_fields;
-#endif
-#endif
#ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARTITION_HANDLER *partition_handler;
#endif
@@ -763,11 +746,6 @@ typedef struct st_spider_wide_handler
TABLE_SHARE *top_share;
enum thr_lock_type lock_type;
uchar lock_table_type;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- uint32 hs_pushed_strref_num;
-#endif
-#endif
int lock_mode;
int external_lock_type;
int cond_check_error;
@@ -781,13 +759,6 @@ typedef struct st_spider_wide_handler
#ifdef HA_CAN_BULK_ACCESS
ulonglong external_lock_cnt;
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- size_t hs_pushed_ret_fields_num;
- size_t hs_pushed_ret_fields_size;
- size_t hs_pushed_lcl_fields_num;
-#endif
-#endif
bool between_flg;
bool idx_bitmap_is_set;
bool rnd_bitmap_is_set;
@@ -804,12 +775,6 @@ typedef struct st_spider_wide_handler
bool write_can_replace;
bool insert_with_update;
bool cond_check;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- bool hs_increment;
- bool hs_decrement;
-#endif
-#endif
bool semi_table_lock;
} SPIDER_WIDE_HANDLER;
@@ -845,30 +810,6 @@ typedef struct st_spider_transaction
const char *trx_another_conn_hash_func_name;
const char *trx_another_conn_hash_file_name;
ulong trx_another_conn_hash_line_no;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- HASH trx_hs_r_conn_hash;
- uint trx_hs_r_conn_hash_id;
- const char *trx_hs_r_conn_hash_func_name;
- const char *trx_hs_r_conn_hash_file_name;
- ulong trx_hs_r_conn_hash_line_no;
- HASH trx_hs_w_conn_hash;
- uint trx_hs_w_conn_hash_id;
- const char *trx_hs_w_conn_hash_func_name;
- const char *trx_hs_w_conn_hash_file_name;
- ulong trx_hs_w_conn_hash_line_no;
-#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- HASH trx_direct_hs_r_conn_hash;
- uint trx_direct_hs_r_conn_hash_id;
- const char *trx_direct_hs_r_conn_hash_func_name;
- const char *trx_direct_hs_r_conn_hash_file_name;
- ulong trx_direct_hs_r_conn_hash_line_no;
- HASH trx_direct_hs_w_conn_hash;
- uint trx_direct_hs_w_conn_hash_id;
- const char *trx_direct_hs_w_conn_hash_func_name;
- const char *trx_direct_hs_w_conn_hash_file_name;
- ulong trx_direct_hs_w_conn_hash_line_no;
-#endif
HASH trx_alter_table_hash;
uint trx_alter_table_hash_id;
const char *trx_alter_table_hash_func_name;
@@ -884,10 +825,6 @@ typedef struct st_spider_transaction
SPIDER_CONN *join_trx_top;
ulonglong spider_thread_id;
ulonglong trx_conn_adjustment;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ulonglong trx_hs_r_conn_adjustment;
- ulonglong trx_hs_w_conn_adjustment;
-#endif
uint locked_connections;
ulonglong direct_update_count;
@@ -895,9 +832,6 @@ typedef struct st_spider_transaction
ulonglong direct_order_limit_count;
ulonglong direct_aggregate_count;
ulonglong parallel_search_count;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ulonglong hs_result_free_count;
-#endif
#ifdef HA_CAN_BULK_ACCESS
SPIDER_CONN *bulk_access_conn_first;
@@ -1113,9 +1047,6 @@ typedef struct st_spider_share
int error_read_mode;
int error_write_mode;
int active_link_count;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- longlong hs_result_free_size;
-#endif
#ifdef HA_CAN_BULK_ACCESS
int bulk_access_free;
#endif
@@ -1134,10 +1065,6 @@ typedef struct st_spider_share
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
my_hash_value_type *conn_keys_hash_value;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- my_hash_value_type *hs_read_conn_keys_hash_value;
- my_hash_value_type *hs_write_conn_keys_hash_value;
-#endif
#endif
char **server_names;
char **tgt_table_names;
@@ -1161,12 +1088,6 @@ typedef struct st_spider_share
char **tgt_pk_names;
char **tgt_sequence_names;
char **conn_keys;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char **hs_read_socks;
- char **hs_write_socks;
- char **hs_read_conn_keys;
- char **hs_write_conn_keys;
-#endif
long *tgt_ports;
long *tgt_ssl_vscs;
long *link_statuses;
@@ -1182,13 +1103,6 @@ typedef struct st_spider_share
#endif
longlong *monitoring_limit;
longlong *monitoring_sid;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- long *use_hs_reads;
- long *use_hs_writes;
- long *hs_read_ports;
- long *hs_write_ports;
- long *hs_write_to_reads;
-#endif
long *use_handlers;
long *connect_timeouts;
long *net_read_timeouts;
@@ -1219,16 +1133,7 @@ typedef struct st_spider_share
uint *tgt_pk_names_lengths;
uint *tgt_sequence_names_lengths;
uint *conn_keys_lengths;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint *hs_read_socks_lengths;
- uint *hs_write_socks_lengths;
- uint *hs_read_conn_keys_lengths;
- uint *hs_write_conn_keys_lengths;
-#endif
uint *sql_dbton_ids;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint *hs_dbton_ids;
-#endif
uint server_names_charlen;
uint tgt_table_names_charlen;
@@ -1252,12 +1157,6 @@ typedef struct st_spider_share
uint tgt_pk_names_charlen;
uint tgt_sequence_names_charlen;
uint conn_keys_charlen;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint hs_read_socks_charlen;
- uint hs_write_socks_charlen;
- uint hs_read_conn_keys_charlen;
- uint hs_write_conn_keys_charlen;
-#endif
uint server_names_length;
uint tgt_table_names_length;
@@ -1281,12 +1180,6 @@ typedef struct st_spider_share
uint tgt_pk_names_length;
uint tgt_sequence_names_length;
uint conn_keys_length;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint hs_read_socks_length;
- uint hs_write_socks_length;
- uint hs_read_conn_keys_length;
- uint hs_write_conn_keys_length;
-#endif
uint tgt_ports_length;
uint tgt_ssl_vscs_length;
uint link_statuses_length;
@@ -1302,13 +1195,6 @@ typedef struct st_spider_share
#endif
uint monitoring_limit_length;
uint monitoring_sid_length;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint use_hs_reads_length;
- uint use_hs_writes_length;
- uint hs_read_ports_length;
- uint hs_write_ports_length;
- uint hs_write_to_reads_length;
-#endif
uint use_handlers_length;
uint connect_timeouts_length;
uint net_read_timeouts_length;
@@ -1326,11 +1212,6 @@ typedef struct st_spider_share
uint use_sql_dbton_count;
uint use_sql_dbton_ids[SPIDER_DBTON_SIZE];
uint sql_dbton_id_to_seq[SPIDER_DBTON_SIZE];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint use_hs_dbton_count;
- uint use_hs_dbton_ids[SPIDER_DBTON_SIZE];
- uint hs_dbton_id_to_seq[SPIDER_DBTON_SIZE];
-#endif
SPIDER_ALTER_TABLE alter_table;
SPIDER_WIDE_SHARE *wide_share;
@@ -1389,9 +1270,6 @@ typedef struct st_spider_direct_sql
int net_write_timeout;
longlong bulk_insert_rows;
int connection_channel;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- int access_mode;
-#endif
#if MYSQL_VERSION_ID < 50500
#else
int use_real_table;
diff --git a/storage/spider/spd_init_query.h b/storage/spider/spd_init_query.h
index 19b04d50b82..1cf987134f6 100644
--- a/storage/spider/spd_init_query.h
+++ b/storage/spider/spd_init_query.h
@@ -224,12 +224,7 @@ static LEX_STRING spider_init_queries[] = {
{C_STRING_WITH_LEN(
"create procedure mysql.spider_fix_system_tables()"
"begin"
- " select substring_index(substring_index(version(), '-', 2), '-', -1)"
- " into @server_name;"
- " if @server_name regexp '^[0-9]+$' then"
- " select substring_index(substring_index(version(), '-', 3), '-', -1)"
- " into @server_name;"
- " end if;"
+ " select 'MariaDB' into @server_name;"
" select substring_index(version(), '.', 1)"
" into @server_major_version;"
" select substring_index(substring_index(version(), '.', 2), '.', -1)"
@@ -548,7 +543,7 @@ static LEX_STRING spider_init_queries[] = {
" @server_major_version > 10 or"
" ("
" @server_major_version = 10 and"
- " @server_minor_version >= 7"
+ " @server_minor_version >= 999"
" )"
" )"
" then"
@@ -808,7 +803,7 @@ static LEX_STRING spider_init_queries[] = {
" @server_major_version > 10 or"
" ("
" @server_major_version = 10 and"
- " @server_minor_version >= 7"
+ " @server_minor_version >= 999"
" )"
" )"
" then"
diff --git a/storage/spider/spd_param.cc b/storage/spider/spd_param.cc
index b23877ca92a..b14c19fc2c2 100644
--- a/storage/spider/spd_param.cc
+++ b/storage/spider/spd_param.cc
@@ -101,19 +101,6 @@ static int spider_parallel_search(THD *thd, SHOW_VAR *var, char *buff)
DBUG_RETURN(error_num);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-static int spider_hs_result_free(THD *thd, SHOW_VAR *var, char *buff)
-{
- int error_num = 0;
- SPIDER_TRX *trx;
- DBUG_ENTER("spider_hs_result_free");
- var->type = SHOW_LONGLONG;
- if ((trx = spider_get_trx(thd, TRUE, &error_num)))
- var->value = (char *) &trx->hs_result_free_count;
- DBUG_RETURN(error_num);
-}
-#endif
-
struct st_mysql_show_var spider_status_variables[] =
{
{"Spider_mon_table_cache_version",
@@ -144,13 +131,6 @@ struct st_mysql_show_var spider_status_variables[] =
{"Spider_parallel_search",
(char *) &spider_parallel_search, SHOW_FUNC},
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef SPIDER_HAS_SHOW_SIMPLE_FUNC
- {"Spider_hs_result_free", (char *) &spider_hs_result_free, SHOW_SIMPLE_FUNC},
-#else
- {"Spider_hs_result_free", (char *) &spider_hs_result_free, SHOW_FUNC},
-#endif
-#endif
{NullS, NullS, SHOW_LONG}
};
@@ -174,6 +154,34 @@ static MYSQL_SYSVAR_BOOL(
TRUE
);
+static void spider_var_deprecated_int(THD *thd, st_mysql_sys_var *,
+ void *var_ptr, const void *save)
+{
+ int val= *static_cast<const int *>(save);
+ *static_cast<int *>(var_ptr)= val;
+ if (val == -1)
+ {
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ HA_ERR_UNSUPPORTED,
+ "The option value -1 (use table value) is deprecated "
+ "and will be removed in a future release");
+ }
+}
+
+static void spider_var_deprecated_longlong(THD *thd, st_mysql_sys_var *,
+ void *var_ptr, const void *save)
+{
+ longlong val= *static_cast<const longlong *>(save);
+ *static_cast<longlong *>(var_ptr)= val;
+ if (val == -1)
+ {
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ HA_ERR_UNSUPPORTED,
+ "The option value -1 (use table value) is deprecated "
+ "and will be removed in a future release");
+ }
+}
+
my_bool spider_param_support_xa()
{
DBUG_ENTER("spider_param_support_xa");
@@ -255,8 +263,8 @@ static MYSQL_SYSVAR_INT(
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"Use table charset for remote access",
NULL,
- NULL,
- -1,
+ spider_var_deprecated_int,
+ 1,
-1,
1,
0
@@ -432,7 +440,7 @@ uint spider_param_force_commit(
*/
static MYSQL_THDVAR_UINT(
xa_register_mode, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Mode of XA transaction register into system table", /* comment */
NULL, /* check */
NULL, /* update */
@@ -455,11 +463,11 @@ uint spider_param_xa_register_mode(
*/
static MYSQL_THDVAR_LONGLONG(
internal_offset, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Internal offset", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_longlong, /* update */
+ 0, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -480,11 +488,11 @@ longlong spider_param_internal_offset(
*/
static MYSQL_THDVAR_LONGLONG(
internal_limit, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Internal limit", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_longlong, /* update */
+ 9223372036854775807LL, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -508,8 +516,8 @@ static MYSQL_THDVAR_LONGLONG(
PLUGIN_VAR_RQCMDARG, /* opt */
"Number of rows at a select", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_longlong, /* update */
+ 9223372036854775807LL, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -534,8 +542,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Use offset and limit parameter in SQL for split_read parameter.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 2, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -559,8 +567,8 @@ static MYSQL_THDVAR_LONGLONG(
PLUGIN_VAR_RQCMDARG, /* opt */
"The limit value for semi_split_read", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_longlong, /* update */
+ 9223372036854775807LL, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -582,11 +590,11 @@ longlong spider_param_semi_split_read_limit(
*/
static MYSQL_THDVAR_INT(
init_sql_alloc_size, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Initial sql string alloc size", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1024, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -611,8 +619,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Reset sql string alloc after execute", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -627,33 +635,6 @@ int spider_param_reset_sql_alloc(
reset_sql_alloc : THDVAR(thd, reset_sql_alloc));
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-/*
- -1 :use table parameter
- 0-:result free size for handlersocket
- */
-static MYSQL_THDVAR_LONGLONG(
- hs_result_free_size, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
- "Result free size for handlersocket", /* comment */
- NULL, /* check */
- NULL, /* update */
- -1, /* def */
- -1, /* min */
- 9223372036854775807LL, /* max */
- 0 /* blk */
-);
-
-longlong spider_param_hs_result_free_size(
- THD *thd,
- longlong hs_result_free_size
-) {
- DBUG_ENTER("spider_param_hs_result_free_size");
- DBUG_RETURN(THDVAR(thd, hs_result_free_size) < 0 ?
- hs_result_free_size : THDVAR(thd, hs_result_free_size));
-}
-#endif
-
/*
-1 :use table parameter
0 :off
@@ -664,8 +645,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Sprit read mode for multi range", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 100, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -689,8 +670,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Max columns for order by", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 32767, /* def */
-1, /* min */
32767, /* max */
0 /* blk */
@@ -777,11 +758,11 @@ static int spider_param_semi_table_lock_check(
*/
static MYSQL_THDVAR_INT(
semi_table_lock, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Table lock during execute a sql", /* comment */
&spider_param_semi_table_lock_check, /* check */
NULL, /* update */
- 1, /* def */
+ 0, /* def */
0, /* min */
1, /* max */
0 /* blk */
@@ -842,11 +823,11 @@ static int spider_param_semi_table_lock_connection_check(
*/
static MYSQL_THDVAR_INT(
semi_table_lock_connection, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Use different connection if semi_table_lock is enabled", /* comment */
&spider_param_semi_table_lock_connection_check, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -894,8 +875,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Lock for select with update", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
2, /* max */
0 /* blk */
@@ -983,8 +964,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Bulk insert size", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 16000, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -1012,8 +993,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"The mode of bulk updating and deleting", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
2, /* max */
0 /* blk */
@@ -1037,8 +1018,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Bulk update size", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 16000, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -1059,11 +1040,11 @@ int spider_param_bulk_update_size(
*/
static MYSQL_THDVAR_INT(
buffer_size, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Buffer size", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 16000, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -1088,8 +1069,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Execute optimize to remote server", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -1114,8 +1095,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Execute optimize to remote server with local", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -1263,8 +1244,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Wait timeout of connecting to remote server", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 6, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -1290,8 +1271,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Wait timeout of receiving data from remote server", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 600, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -1317,8 +1298,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Wait timeout of sending data to remote server", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 600, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -1348,8 +1329,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"The retrieval result from a remote server is acquired by acquisition one by one", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 3, /* def */
-1, /* min */
3, /* max */
0 /* blk */
@@ -1373,8 +1354,8 @@ static MYSQL_THDVAR_LONGLONG(
PLUGIN_VAR_RQCMDARG, /* opt */
"Number of records in a page when acquisition one by one", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1024, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -1398,8 +1379,8 @@ static MYSQL_THDVAR_LONGLONG(
PLUGIN_VAR_RQCMDARG, /* opt */
"The limitation of memory size in a page when acquisition one by one", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 10485760, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -1424,8 +1405,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Use low memory mode when SQL(SELECT) internally issued to a remote server is executed and get a result list", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -1451,8 +1432,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"The mode of using columns at select clause", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -1480,8 +1461,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Mode of background search", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
3, /* max */
0 /* blk */
@@ -1506,8 +1487,8 @@ static MYSQL_THDVAR_LONGLONG(
PLUGIN_VAR_RQCMDARG, /* opt */
"Number of first read records when background search is used", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 2, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -1532,8 +1513,8 @@ static MYSQL_THDVAR_LONGLONG(
PLUGIN_VAR_RQCMDARG, /* opt */
"Number of second read records when background search is used", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 100, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -1559,8 +1540,8 @@ static MYSQL_THDVAR_LONGLONG(
PLUGIN_VAR_RQCMDARG, /* opt */
"Number of first read records", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -1585,8 +1566,8 @@ static MYSQL_THDVAR_LONGLONG(
PLUGIN_VAR_RQCMDARG, /* opt */
"Number of second read records", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -1611,8 +1592,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Interval of cardinality confirmation.(second)", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 51, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -1636,11 +1617,11 @@ double spider_param_crd_interval(
*/
static MYSQL_THDVAR_INT(
crd_mode, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Mode of cardinality confirmation.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
3, /* max */
0 /* blk */
@@ -1668,8 +1649,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Cardinality synchronization in partitioned table.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
2, /* max */
0 /* blk */
@@ -1693,11 +1674,11 @@ int spider_param_crd_sync(
*/
static MYSQL_THDVAR_INT(
crd_type, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Type of cardinality calculation.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 2, /* def */
-1, /* min */
2, /* max */
0 /* blk */
@@ -1718,11 +1699,11 @@ int spider_param_crd_type(
*/
static MYSQL_THDVAR_INT(
crd_weight, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Weight coefficient to calculate effectiveness of index from cardinality of column.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 2, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -1749,8 +1730,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Mode of cardinality confirmation at background.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 2, /* def */
-1, /* min */
2, /* max */
0 /* blk */
@@ -1776,8 +1757,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Interval of table state confirmation.(second)", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 10, /* def */
-1, /* min */
2147483647, /* max */
0 /* blk */
@@ -1800,11 +1781,11 @@ double spider_param_sts_interval(
*/
static MYSQL_THDVAR_INT(
sts_mode, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Mode of table state confirmation.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
2, /* max */
0 /* blk */
@@ -1832,8 +1813,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Table state synchronization in partitioned table.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
2, /* max */
0 /* blk */
@@ -1861,8 +1842,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Mode of table state confirmation at background.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 2, /* def */
-1, /* min */
2, /* max */
0 /* blk */
@@ -1901,31 +1882,6 @@ double spider_param_ping_interval_at_trx_start(
DBUG_RETURN(THDVAR(thd, ping_interval_at_trx_start));
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-/*
- 0 :always ping
- 1-:interval
- */
-static MYSQL_THDVAR_INT(
- hs_ping_interval, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
- "Ping interval for handlersocket", /* comment */
- NULL, /* check */
- NULL, /* update */
- 30, /* def */
- 0, /* min */
- 2147483647, /* max */
- 0 /* blk */
-);
-
-double spider_param_hs_ping_interval(
- THD *thd
-) {
- DBUG_ENTER("spider_param_hs_ping_interval");
- DBUG_RETURN(THDVAR(thd, hs_ping_interval));
-}
-#endif
-
/*
-1 :use table parameter
0 :normal mode
@@ -1937,8 +1893,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Mode of auto increment.", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
3, /* max */
0 /* blk */
@@ -2030,8 +1986,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Execute \"REPLACE\" and \"INSERT IGNORE\" on remote server and avoid duplicate check on local server", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -2097,7 +2053,7 @@ uint spider_param_udf_table_mon_mutex_count()
*/
static MYSQL_THDVAR_LONGLONG(
udf_ds_bulk_insert_rows, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Number of rows for bulk inserting", /* comment */
NULL, /* check */
NULL, /* update */
@@ -2124,7 +2080,7 @@ longlong spider_param_udf_ds_bulk_insert_rows(
*/
static MYSQL_THDVAR_INT(
udf_ds_table_loop_mode, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Table loop mode if the number of tables in table list are less than the number of result sets", /* comment */
NULL, /* check */
NULL, /* update */
@@ -2457,8 +2413,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Mode of BKA for Spider", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
2, /* max */
0 /* blk */
@@ -2481,7 +2437,7 @@ static int spider_udf_ct_bulk_insert_interval;
static MYSQL_SYSVAR_INT(
udf_ct_bulk_insert_interval,
spider_udf_ct_bulk_insert_interval,
- PLUGIN_VAR_RQCMDARG,
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED,
"The interval time between bulk insert and next bulk insert at coping",
NULL,
NULL,
@@ -2507,7 +2463,7 @@ static longlong spider_udf_ct_bulk_insert_rows;
static MYSQL_SYSVAR_LONGLONG(
udf_ct_bulk_insert_rows,
spider_udf_ct_bulk_insert_rows,
- PLUGIN_VAR_RQCMDARG,
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED,
"The number of rows inserted with bulk insert of one time at coping",
NULL,
NULL,
@@ -2525,154 +2481,6 @@ longlong spider_param_udf_ct_bulk_insert_rows(
udf_ct_bulk_insert_rows : spider_udf_ct_bulk_insert_rows);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-/*
- 0: no recycle
- 1: recycle in instance
- 2: recycle in thread
- */
-static MYSQL_THDVAR_UINT(
- hs_r_conn_recycle_mode, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
- "Handlersocket connection recycle mode", /* comment */
- NULL, /* check */
- NULL, /* update */
- 2, /* def */
- 0, /* min */
- 2, /* max */
- 0 /* blk */
-);
-
-uint spider_param_hs_r_conn_recycle_mode(
- THD *thd
-) {
- DBUG_ENTER("spider_param_hs_r_conn_recycle_mode");
- DBUG_RETURN(THDVAR(thd, hs_r_conn_recycle_mode));
-}
-
-/*
- 0: weak
- 1: strict
- */
-static MYSQL_THDVAR_UINT(
- hs_r_conn_recycle_strict, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
- "Strict handlersocket connection recycle", /* comment */
- NULL, /* check */
- NULL, /* update */
- 0, /* def */
- 0, /* min */
- 1, /* max */
- 0 /* blk */
-);
-
-uint spider_param_hs_r_conn_recycle_strict(
- THD *thd
-) {
- DBUG_ENTER("spider_param_hs_r_conn_recycle_strict");
- DBUG_RETURN(THDVAR(thd, hs_r_conn_recycle_strict));
-}
-
-/*
- 0: no recycle
- 1: recycle in instance
- 2: recycle in thread
- */
-static MYSQL_THDVAR_UINT(
- hs_w_conn_recycle_mode, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
- "Handlersocket connection recycle mode", /* comment */
- NULL, /* check */
- NULL, /* update */
- 2, /* def */
- 0, /* min */
- 2, /* max */
- 0 /* blk */
-);
-
-uint spider_param_hs_w_conn_recycle_mode(
- THD *thd
-) {
- DBUG_ENTER("spider_param_hs_w_conn_recycle_mode");
- DBUG_RETURN(THDVAR(thd, hs_w_conn_recycle_mode));
-}
-
-/*
- 0: weak
- 1: strict
- */
-static MYSQL_THDVAR_UINT(
- hs_w_conn_recycle_strict, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
- "Strict handlersocket connection recycle", /* comment */
- NULL, /* check */
- NULL, /* update */
- 0, /* def */
- 0, /* min */
- 1, /* max */
- 0 /* blk */
-);
-
-uint spider_param_hs_w_conn_recycle_strict(
- THD *thd
-) {
- DBUG_ENTER("spider_param_hs_w_conn_recycle_strict");
- DBUG_RETURN(THDVAR(thd, hs_w_conn_recycle_strict));
-}
-
-/*
- -1 :use table parameter
- 0 :not use
- 1 :use handlersocket
- */
-static MYSQL_THDVAR_INT(
- use_hs_read, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
- "Use handlersocket for reading", /* comment */
- NULL, /* check */
- NULL, /* update */
- -1, /* def */
- -1, /* min */
- 1, /* max */
- 0 /* blk */
-);
-
-int spider_param_use_hs_read(
- THD *thd,
- int use_hs_read
-) {
- DBUG_ENTER("spider_param_use_hs_read");
- DBUG_RETURN(THDVAR(thd, use_hs_read) == -1 ?
- use_hs_read : THDVAR(thd, use_hs_read));
-}
-
-/*
- -1 :use table parameter
- 0 :not use
- 1 :use handlersocket
- */
-static MYSQL_THDVAR_INT(
- use_hs_write, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
- "Use handlersocket for writing", /* comment */
- NULL, /* check */
- NULL, /* update */
- -1, /* def */
- -1, /* min */
- 1, /* max */
- 0 /* blk */
-);
-
-int spider_param_use_hs_write(
- THD *thd,
- int use_hs_write
-) {
- DBUG_ENTER("spider_param_use_hs_write");
- DBUG_RETURN(THDVAR(thd, use_hs_write) == -1 ?
- use_hs_write : THDVAR(thd, use_hs_write));
-}
-#endif
-
/*
-1 :use table parameter
0 :not use
@@ -2680,11 +2488,11 @@ int spider_param_use_hs_write(
*/
static MYSQL_THDVAR_INT(
use_handler, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Use handler for reading", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
3, /* max */
0 /* blk */
@@ -2709,8 +2517,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Read error mode if error", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -2735,8 +2543,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Write error mode if error", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -2761,8 +2569,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Skip generating internal default condition", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -2789,8 +2597,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Skip parallel search by specific conditions", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
3, /* max */
0 /* blk */
@@ -2815,8 +2623,8 @@ static MYSQL_THDVAR_LONGLONG(
PLUGIN_VAR_RQCMDARG, /* opt */
"Send 'ORDER BY' and 'LIMIT' to remote server directly", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 9223372036854775807LL, /* def */
-1, /* min */
9223372036854775807LL, /* max */
0 /* blk */
@@ -2841,8 +2649,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Read only", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -2895,7 +2703,7 @@ int spider_param_bulk_access_free(
*/
static MYSQL_THDVAR_INT(
udf_ds_use_real_table, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Use real table for temporary table list", /* comment */
NULL, /* check */
NULL, /* update */
@@ -3090,8 +2898,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Read casually if it is possible", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
63, /* max */
0 /* blk */
@@ -3133,8 +2941,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"The type of delete_all_rows", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -3156,11 +2964,11 @@ int spider_param_delete_all_rows_type(
*/
static MYSQL_THDVAR_INT(
bka_table_name_type, /* name */
- PLUGIN_VAR_RQCMDARG, /* opt */
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"The type of temporary table name for bka", /* comment */
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 0, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -3208,11 +3016,11 @@ static int spider_store_last_sts;
static MYSQL_SYSVAR_INT(
store_last_sts,
spider_store_last_sts,
- PLUGIN_VAR_RQCMDARG,
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED,
"Store last sts result into system table",
NULL,
- NULL,
- -1,
+ spider_var_deprecated_int,
+ 1,
-1,
1,
0
@@ -3235,11 +3043,11 @@ static int spider_store_last_crd;
static MYSQL_SYSVAR_INT(
store_last_crd,
spider_store_last_crd,
- PLUGIN_VAR_RQCMDARG,
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED,
"Store last crd result into system table",
NULL,
- NULL,
- -1,
+ spider_var_deprecated_int,
+ 1,
-1,
1,
0
@@ -3262,11 +3070,11 @@ static int spider_load_sts_at_startup;
static MYSQL_SYSVAR_INT(
load_sts_at_startup,
spider_load_sts_at_startup,
- PLUGIN_VAR_RQCMDARG,
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED,
"Load sts from system table at startup",
NULL,
- NULL,
- -1,
+ spider_var_deprecated_int,
+ 1,
-1,
1,
0
@@ -3289,11 +3097,11 @@ static int spider_load_crd_at_startup;
static MYSQL_SYSVAR_INT(
load_crd_at_startup,
spider_load_crd_at_startup,
- PLUGIN_VAR_RQCMDARG,
+ PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED,
"Load crd from system table at startup",
NULL,
- NULL,
- -1,
+ spider_var_deprecated_int,
+ 1,
-1,
1,
0
@@ -3462,8 +3270,8 @@ static MYSQL_THDVAR_INT(
PLUGIN_VAR_RQCMDARG, /* opt */
"Use columns in select clause strictly for group by clause",
NULL, /* check */
- NULL, /* update */
- -1, /* def */
+ spider_var_deprecated_int, /* update */
+ 1, /* def */
-1, /* min */
1, /* max */
0 /* blk */
@@ -3500,9 +3308,6 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(semi_split_read_limit),
MYSQL_SYSVAR(init_sql_alloc_size),
MYSQL_SYSVAR(reset_sql_alloc),
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- MYSQL_SYSVAR(hs_result_free_size),
-#endif
MYSQL_SYSVAR(multi_split_read),
MYSQL_SYSVAR(max_order),
MYSQL_SYSVAR(semi_trx_isolation),
@@ -3563,9 +3368,6 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(sts_bg_mode),
#endif
MYSQL_SYSVAR(ping_interval_at_trx_start),
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- MYSQL_SYSVAR(hs_ping_interval),
-#endif
MYSQL_SYSVAR(auto_increment_mode),
MYSQL_SYSVAR(same_server_link),
MYSQL_SYSVAR(local_lock_table),
@@ -3588,14 +3390,6 @@ static struct st_mysql_sys_var* spider_system_variables[] = {
MYSQL_SYSVAR(bka_mode),
MYSQL_SYSVAR(udf_ct_bulk_insert_interval),
MYSQL_SYSVAR(udf_ct_bulk_insert_rows),
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- MYSQL_SYSVAR(hs_r_conn_recycle_mode),
- MYSQL_SYSVAR(hs_r_conn_recycle_strict),
- MYSQL_SYSVAR(hs_w_conn_recycle_mode),
- MYSQL_SYSVAR(hs_w_conn_recycle_strict),
- MYSQL_SYSVAR(use_hs_read),
- MYSQL_SYSVAR(use_hs_write),
-#endif
MYSQL_SYSVAR(use_handler),
MYSQL_SYSVAR(error_read_mode),
MYSQL_SYSVAR(error_write_mode),
diff --git a/storage/spider/spd_param.h b/storage/spider/spd_param.h
index c3a79cec065..a6a9dd80026 100644
--- a/storage/spider/spd_param.h
+++ b/storage/spider/spd_param.h
@@ -73,12 +73,6 @@ int spider_param_reset_sql_alloc(
THD *thd,
int reset_sql_alloc
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-longlong spider_param_hs_result_free_size(
- THD *thd,
- longlong hs_result_free_size
-);
-#endif
int spider_param_multi_split_read(
THD *thd,
int multi_split_read
@@ -261,11 +255,6 @@ int spider_param_sts_bg_mode(
double spider_param_ping_interval_at_trx_start(
THD *thd
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-double spider_param_hs_ping_interval(
- THD *thd
-);
-#endif
int spider_param_auto_increment_mode(
THD *thd,
int auto_increment_mode
@@ -320,28 +309,6 @@ int spider_param_udf_ct_bulk_insert_interval(
longlong spider_param_udf_ct_bulk_insert_rows(
longlong udf_ct_bulk_insert_rows
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-uint spider_param_hs_r_conn_recycle_mode(
- THD *thd
-);
-uint spider_param_hs_r_conn_recycle_strict(
- THD *thd
-);
-uint spider_param_hs_w_conn_recycle_mode(
- THD *thd
-);
-uint spider_param_hs_w_conn_recycle_strict(
- THD *thd
-);
-int spider_param_use_hs_read(
- THD *thd,
- int use_hs_read
-);
-int spider_param_use_hs_write(
- THD *thd,
- int use_hs_write
-);
-#endif
int spider_param_use_handler(
THD *thd,
int use_handler
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index ec12dbdb5da..88d1b07986e 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -31,6 +31,7 @@
#include "sql_select.h"
#include "tztime.h"
#include "sql_parse.h"
+#include "create_options.h"
#endif
#include "spd_err.h"
#include "spd_param.h"
@@ -137,9 +138,6 @@ handlerton *spider_hton_ptr;
SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE];
extern SPIDER_DBTON spider_dbton_mysql;
extern SPIDER_DBTON spider_dbton_mariadb;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-extern SPIDER_DBTON spider_dbton_handlersocket;
-#endif
#ifdef HAVE_ORACLE_OCI
extern SPIDER_DBTON spider_dbton_oracle;
#endif
@@ -156,10 +154,6 @@ PSI_mutex_key spd_key_mutex_wide_share;
#endif
PSI_mutex_key spd_key_mutex_lgtm_tblhnd_share;
PSI_mutex_key spd_key_mutex_conn;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-PSI_mutex_key spd_key_mutex_hs_r_conn;
-PSI_mutex_key spd_key_mutex_hs_w_conn;
-#endif
PSI_mutex_key spd_key_mutex_open_conn;
PSI_mutex_key spd_key_mutex_allocated_thds;
PSI_mutex_key spd_key_mutex_mon_table_cache;
@@ -206,10 +200,6 @@ static PSI_mutex_info all_spider_mutexes[]=
#endif
{ &spd_key_mutex_lgtm_tblhnd_share, "lgtm_tblhnd_share", PSI_FLAG_GLOBAL},
{ &spd_key_mutex_conn, "conn", PSI_FLAG_GLOBAL},
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- { &spd_key_mutex_hs_r_conn, "hs_r_conn", PSI_FLAG_GLOBAL},
- { &spd_key_mutex_hs_w_conn, "hs_w_conn", PSI_FLAG_GLOBAL},
-#endif
{ &spd_key_mutex_open_conn, "open_conn", PSI_FLAG_GLOBAL},
{ &spd_key_mutex_allocated_thds, "allocated_thds", PSI_FLAG_GLOBAL},
{ &spd_key_mutex_mon_table_cache, "mon_table_cache", PSI_FLAG_GLOBAL},
@@ -311,6 +301,18 @@ static PSI_thread_info all_spider_threads[] = {
};
#endif
+struct ha_table_option_struct
+{
+ char *remote_server;
+ char *remote_database;
+ char *remote_table;
+};
+
+ha_create_table_option spider_table_option_list[]= {
+ HA_TOPTION_STRING("REMOTE_SERVER", remote_server),
+ HA_TOPTION_STRING("REMOTE_DATABASE", remote_database),
+ HA_TOPTION_STRING("REMOTE_TABLE", remote_table), HA_TOPTION_END};
+
extern HASH spider_open_connections;
extern HASH spider_ipport_conns;
extern uint spider_open_connections_id;
@@ -318,20 +320,6 @@ extern const char *spider_open_connections_func_name;
extern const char *spider_open_connections_file_name;
extern ulong spider_open_connections_line_no;
extern pthread_mutex_t spider_conn_mutex;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-extern HASH spider_hs_r_conn_hash;
-extern uint spider_hs_r_conn_hash_id;
-extern const char *spider_hs_r_conn_hash_func_name;
-extern const char *spider_hs_r_conn_hash_file_name;
-extern ulong spider_hs_r_conn_hash_line_no;
-extern pthread_mutex_t spider_hs_r_conn_mutex;
-extern HASH spider_hs_w_conn_hash;
-extern uint spider_hs_w_conn_hash_id;
-extern const char *spider_hs_w_conn_hash_func_name;
-extern const char *spider_hs_w_conn_hash_file_name;
-extern ulong spider_hs_w_conn_hash_line_no;
-extern pthread_mutex_t spider_hs_w_conn_mutex;
-#endif
extern HASH *spider_udf_table_mon_list_hash;
extern uint spider_udf_table_mon_list_hash_id;
extern const char *spider_udf_table_mon_list_hash_func_name;
@@ -851,30 +839,6 @@ int spider_free_share_alloc(
}
spider_free(spider_current_trx, share->static_link_ids, MYF(0));
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (share->hs_read_socks)
- {
- for (roop_count = 0; roop_count < (int) share->hs_read_socks_length;
- roop_count++)
- {
- if (share->hs_read_socks[roop_count])
- spider_free(spider_current_trx, share->hs_read_socks[roop_count],
- MYF(0));
- }
- spider_free(spider_current_trx, share->hs_read_socks, MYF(0));
- }
- if (share->hs_write_socks)
- {
- for (roop_count = 0; roop_count < (int) share->hs_write_socks_length;
- roop_count++)
- {
- if (share->hs_write_socks[roop_count])
- spider_free(spider_current_trx, share->hs_write_socks[roop_count],
- MYF(0));
- }
- spider_free(spider_current_trx, share->hs_write_socks, MYF(0));
- }
-#endif
if (share->bka_engine)
spider_free(spider_current_trx, share->bka_engine, MYF(0));
if (share->conn_keys)
@@ -897,18 +861,6 @@ int spider_free_share_alloc(
spider_free(spider_current_trx, share->monitoring_flag, MYF(0));
if (share->monitoring_kind)
spider_free(spider_current_trx, share->monitoring_kind, MYF(0));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (share->use_hs_reads)
- spider_free(spider_current_trx, share->use_hs_reads, MYF(0));
- if (share->use_hs_writes)
- spider_free(spider_current_trx, share->use_hs_writes, MYF(0));
- if (share->hs_read_ports)
- spider_free(spider_current_trx, share->hs_read_ports, MYF(0));
- if (share->hs_write_ports)
- spider_free(spider_current_trx, share->hs_write_ports, MYF(0));
- if (share->hs_write_to_reads)
- spider_free(spider_current_trx, share->hs_write_to_reads, MYF(0));
-#endif
if (share->use_handlers)
spider_free(spider_current_trx, share->use_handlers, MYF(0));
if (share->connect_timeouts)
@@ -1053,18 +1005,6 @@ void spider_free_tmp_share_alloc(
spider_free(spider_current_trx, share->static_link_ids[0], MYF(0));
share->static_link_ids[0] = NULL;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (share->hs_read_socks && share->hs_read_socks[0])
- {
- spider_free(spider_current_trx, share->hs_read_socks[0], MYF(0));
- share->hs_read_socks[0] = NULL;
- }
- if (share->hs_write_socks && share->hs_write_socks[0])
- {
- spider_free(spider_current_trx, share->hs_write_socks[0], MYF(0));
- share->hs_write_socks[0] = NULL;
- }
-#endif
if (share->bka_engine)
{
spider_free(spider_current_trx, share->bka_engine, MYF(0));
@@ -1175,7 +1115,8 @@ int spider_create_string_list(
DBUG_ENTER("spider_create_string_list");
*list_length = 0;
- param_string_parse->init_param_value();
+ if (param_string_parse)
+ param_string_parse->init_param_value();
if (!str)
{
*string_list = NULL;
@@ -1375,8 +1316,9 @@ int spider_create_string_list(
}
}
- param_string_parse->set_param_value(tmp_ptr3,
- tmp_ptr3 + strlen(tmp_ptr3) + 1);
+ if (param_string_parse)
+ param_string_parse->set_param_value(tmp_ptr3,
+ tmp_ptr3 + strlen(tmp_ptr3) + 1);
DBUG_PRINT("info",("spider string_list[%d]=%s", roop_count,
(*string_list)[roop_count]));
@@ -1834,29 +1776,47 @@ int st_spider_param_string_parse::print_param_error()
#define SPIDER_PARAM_STR_LENS(name) name ## _lengths
#define SPIDER_PARAM_STR_CHARLEN(name) name ## _charlen
#define SPIDER_PARAM_STR_LIST(title_name, param_name) \
- if (!strncasecmp(tmp_ptr, title_name, title_length)) \
- { \
- DBUG_PRINT("info",("spider " title_name " start")); \
- if (!share->param_name) \
- { \
- if ((tmp_ptr2 = spider_get_string_between_quote( \
- start_ptr, FALSE))) \
- { \
- share->SPIDER_PARAM_STR_CHARLEN(param_name) = strlen(tmp_ptr2); \
- if ((error_num = spider_create_string_list( \
- &share->param_name, \
- &share->SPIDER_PARAM_STR_LENS(param_name), \
- &share->SPIDER_PARAM_STR_LEN(param_name), \
- tmp_ptr2, \
- share->SPIDER_PARAM_STR_CHARLEN(param_name), \
- &connect_string_parse))) \
- goto error; \
- } else { \
- error_num = connect_string_parse.print_param_error(); \
- goto error; \
- } \
- } \
- break; \
+ SPIDER_PARAM_STR_LIST_CHECK(title_name, param_name, FALSE)
+#define SPIDER_PARAM_STR_LIST_CHECK(title_name, param_name, already_set) \
+ if (!strncasecmp(tmp_ptr, title_name, title_length)) \
+ { \
+ DBUG_PRINT("info", ("spider " title_name " start")); \
+ if (already_set) \
+ { \
+ error_num= ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
+ goto error; \
+ } \
+ if (!share->param_name) \
+ { \
+ if ((tmp_ptr2= spider_get_string_between_quote(start_ptr, FALSE))) \
+ { \
+ share->SPIDER_PARAM_STR_CHARLEN(param_name)= strlen(tmp_ptr2); \
+ if ((error_num= spider_create_string_list( \
+ &share->param_name, \
+ &share->SPIDER_PARAM_STR_LENS(param_name), \
+ &share->SPIDER_PARAM_STR_LEN(param_name), tmp_ptr2, \
+ share->SPIDER_PARAM_STR_CHARLEN(param_name), \
+ &connect_string_parse))) \
+ { \
+ goto error; \
+ } \
+ THD *thd= current_thd; \
+ if (share->SPIDER_PARAM_STR_LEN(param_name) > 1 && create_table) \
+ { \
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, \
+ HA_ERR_UNSUPPORTED, \
+ "The high availability feature of Spider " \
+ "has been deprecated " \
+ "and will be removed in a future release"); \
+ } \
+ } \
+ else \
+ { \
+ error_num= connect_string_parse.print_param_error(); \
+ goto error; \
+ } \
+ } \
+ break; \
}
#define SPIDER_PARAM_HINT(title_name, param_name, check_length, max_size, append_method) \
if (!strncasecmp(tmp_ptr, title_name, check_length)) \
@@ -2060,7 +2020,42 @@ int st_spider_param_string_parse::print_param_error()
} \
break; \
}
+#define SPIDER_PARAM_DEPRECATED_WARNING(title_name) \
+ if (!strncasecmp(tmp_ptr, title_name, title_length) && create_table) \
+ { \
+ THD *thd= current_thd; \
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, \
+ ER_WARN_DEPRECATED_SYNTAX, \
+ "The table parameter '%s' is deprecated and will be " \
+ "removed in a future release", \
+ title_name); \
+ }
+/*
+ Set a given engine-defined option, which holds a string list, to the
+ corresponding attribute of SPIDER_SHARE.
+*/
+#define SPIDER_OPTION_STR_LIST(title_name, option_name, param_name) \
+ if (option_struct && option_struct->option_name) \
+ { \
+ DBUG_PRINT("info", ("spider " title_name " start overwrite")); \
+ share->SPIDER_PARAM_STR_CHARLEN(param_name)= \
+ strlen(option_struct->option_name); \
+ if ((error_num= spider_create_string_list( \
+ &share->param_name, &share->SPIDER_PARAM_STR_LENS(param_name), \
+ &share->SPIDER_PARAM_STR_LEN(param_name), \
+ option_struct->option_name, \
+ share->SPIDER_PARAM_STR_CHARLEN(param_name), NULL))) \
+ goto error; \
+ }
+
+/*
+ Parse connection information specified by COMMENT, CONNECT, or engine-defined
+ options.
+
+ TODO: Deprecate the connection specification by COMMENT and CONNECT,
+ and then solely utilize engine-defined options.
+*/
int spider_parse_connect_info(
SPIDER_SHARE *share,
TABLE_SHARE *table_share,
@@ -2077,6 +2072,7 @@ int spider_parse_connect_info(
int title_length;
SPIDER_PARAM_STRING_PARSE connect_string_parse;
SPIDER_ALTER_TABLE *share_alter;
+ ha_table_option_struct *option_struct;
#ifdef WITH_PARTITION_STORAGE_ENGINE
partition_element *part_elem;
partition_element *sub_elem;
@@ -2099,7 +2095,14 @@ int spider_parse_connect_info(
#ifdef WITH_PARTITION_STORAGE_ENGINE
spider_get_partition_info(share->table_name, share->table_name_length,
table_share, part_info, &part_elem, &sub_elem);
+ if (part_info)
+ if (part_info->is_sub_partitioned())
+ option_struct= sub_elem->option_struct;
+ else
+ option_struct= part_elem->option_struct;
+ else
#endif
+ option_struct= table_share->option_struct;
#ifndef WITHOUT_SPIDER_BG_SEARCH
share->sts_bg_mode = -1;
#endif
@@ -2170,9 +2173,6 @@ int spider_parse_connect_info(
share->error_read_mode = -1;
share->error_write_mode = -1;
share->active_link_count = -1;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- share->hs_result_free_size = -1;
-#endif
#ifdef HA_CAN_BULK_ACCESS
share->bulk_access_free = -1;
#endif
@@ -2308,6 +2308,7 @@ int spider_parse_connect_info(
#ifdef HA_CAN_BULK_ACCESS
SPIDER_PARAM_INT_WITH_MAX("baf", bulk_access_free, 0, 1);
#endif
+ SPIDER_PARAM_DEPRECATED_WARNING("bfz");
SPIDER_PARAM_INT("bfz", buffer_size, 0);
#ifndef WITHOUT_SPIDER_BG_SEARCH
SPIDER_PARAM_LONGLONG("bfr", bgs_first_read, 0);
@@ -2317,6 +2318,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_STR("bke", bka_engine);
SPIDER_PARAM_INT_WITH_MAX("bkm", bka_mode, 0, 2);
SPIDER_PARAM_INT("bsz", bulk_size, 0);
+ SPIDER_PARAM_DEPRECATED_WARNING("btt");
SPIDER_PARAM_LONG_LIST_WITH_MAX("btt", bka_table_name_types,
0, 1);
SPIDER_PARAM_INT_WITH_MAX("bum", bulk_update_mode, 0, 2);
@@ -2325,6 +2327,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT_WITH_MAX("cbm", crd_bg_mode, 0, 2);
#endif
SPIDER_PARAM_DOUBLE("civ", crd_interval, 0);
+ SPIDER_PARAM_DEPRECATED_WARNING("cmd");
SPIDER_PARAM_INT_WITH_MAX("cmd", crd_mode, 0, 3);
SPIDER_PARAM_INT_WITH_MAX("csr", casual_read, 0, 63);
#ifdef WITH_PARTITION_STORAGE_ENGINE
@@ -2332,7 +2335,9 @@ int spider_parse_connect_info(
#endif
SPIDER_PARAM_LONG_LIST_WITH_MAX("cto", connect_timeouts, 0,
2147483647);
+ SPIDER_PARAM_DEPRECATED_WARNING("ctp");
SPIDER_PARAM_INT_WITH_MAX("ctp", crd_type, 0, 2);
+ SPIDER_PARAM_DEPRECATED_WARNING("cwg");
SPIDER_PARAM_DOUBLE("cwg", crd_weight, 1);
SPIDER_PARAM_INT_WITH_MAX("dat", delete_all_rows_type, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("ddi", direct_dup_insert, 0, 1);
@@ -2351,19 +2356,11 @@ int spider_parse_connect_info(
#endif
SPIDER_PARAM_STR_LIST("fds", tgt_filedsns);
SPIDER_PARAM_LONGLONG("frd", first_read, 0);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_LONGLONG("hrf", hs_result_free_size, 0);
- SPIDER_PARAM_LONG_LIST_WITH_MAX(
- "hrp", hs_read_ports, 0, 65535);
- SPIDER_PARAM_STR_LIST("hrs", hs_read_socks);
- SPIDER_PARAM_LONG_LIST_WITH_MAX(
- "hwp", hs_write_ports, 0, 65535);
- SPIDER_PARAM_LONG_LIST_WITH_MAX(
- "hwr", hs_write_to_reads, 0, 1);
- SPIDER_PARAM_STR_LIST("hws", hs_write_socks);
-#endif
+ SPIDER_PARAM_DEPRECATED_WARNING("isa");
SPIDER_PARAM_INT("isa", init_sql_alloc_size, 0);
+ SPIDER_PARAM_DEPRECATED_WARNING("ilm");
SPIDER_PARAM_LONGLONG("ilm", internal_limit, 0);
+ SPIDER_PARAM_DEPRECATED_WARNING("ios");
SPIDER_PARAM_LONGLONG("ios", internal_offset, 0);
SPIDER_PARAM_INT_WITH_MAX("iom", internal_optimize, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("iol", internal_optimize_local, 0, 1);
@@ -2416,6 +2413,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT_WITH_MAX("slc", store_last_crd, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("slm", selupd_lock_mode, 0, 2);
SPIDER_PARAM_INT_WITH_MAX("sls", store_last_sts, 0, 1);
+ SPIDER_PARAM_DEPRECATED_WARNING("smd");
SPIDER_PARAM_INT_WITH_MAX("smd", sts_mode, 1, 2);
SPIDER_PARAM_LONGLONG("smr", static_mean_rec_length, 0);
SPIDER_PARAM_LONGLONG("spr", split_read, 0);
@@ -2423,25 +2421,26 @@ int spider_parse_connect_info(
SPIDER_PARAM_STR_LIST("sqn", tgt_sequence_names);
SPIDER_PARAM_LONGLONG("srd", second_read, 0);
SPIDER_PARAM_DOUBLE("srt", scan_rate, 0);
- SPIDER_PARAM_STR_LIST("srv", server_names);
+ SPIDER_PARAM_STR_LIST_CHECK("srv", server_names,
+ option_struct &&
+ option_struct->remote_server);
SPIDER_PARAM_DOUBLE("ssr", semi_split_read, 0);
SPIDER_PARAM_LONGLONG("ssl", semi_split_read_limit, 0);
#ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARAM_INT_WITH_MAX("ssy", sts_sync, 0, 2);
#endif
+ SPIDER_PARAM_DEPRECATED_WARNING("stc");
SPIDER_PARAM_INT_WITH_MAX("stc", semi_table_lock_conn, 0, 1);
+ SPIDER_PARAM_DEPRECATED_WARNING("stl");
SPIDER_PARAM_INT_WITH_MAX("stl", semi_table_lock, 0, 1);
SPIDER_PARAM_LONGLONG("srs", static_records_for_status, 0);
SPIDER_PARAM_LONG_LIST_WITH_MAX("svc", tgt_ssl_vscs, 0, 1);
- SPIDER_PARAM_STR_LIST("tbl", tgt_table_names);
+ SPIDER_PARAM_STR_LIST_CHECK("tbl", tgt_table_names,
+ option_struct &&
+ option_struct->remote_table);
SPIDER_PARAM_INT_WITH_MAX("tcm", table_count_mode, 0, 3);
+ SPIDER_PARAM_DEPRECATED_WARNING("uhd");
SPIDER_PARAM_LONG_LIST_WITH_MAX("uhd", use_handlers, 0, 3);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_LONG_LIST_WITH_MAX(
- "uhr", use_hs_reads, 0, 1);
- SPIDER_PARAM_LONG_LIST_WITH_MAX(
- "uhw", use_hs_writes, 0, 1);
-#endif
SPIDER_PARAM_INT_WITH_MAX("upu", use_pushdown_udf, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("utc", use_table_charset, 0, 1);
error_num = connect_string_parse.print_param_error();
@@ -2453,12 +2452,16 @@ int spider_parse_connect_info(
error_num = connect_string_parse.print_param_error();
goto error;
case 5:
- SPIDER_PARAM_STR_LIST("table", tgt_table_names);
+ SPIDER_PARAM_STR_LIST_CHECK("table", tgt_table_names,
+ option_struct &&
+ option_struct->remote_table);
error_num = connect_string_parse.print_param_error();
goto error;
case 6:
SPIDER_PARAM_STR_LIST("driver", tgt_drivers);
- SPIDER_PARAM_STR_LIST("server", server_names);
+ SPIDER_PARAM_STR_LIST_CHECK("server", server_names,
+ option_struct &&
+ option_struct->remote_server);
SPIDER_PARAM_STR_LIST("socket", tgt_sockets);
SPIDER_PARAM_HINT("idx", key_hint, 3, (int) table_share->keys,
spider_db_append_key_hint);
@@ -2475,16 +2478,21 @@ int spider_parse_connect_info(
error_num = connect_string_parse.print_param_error();
goto error;
case 8:
- SPIDER_PARAM_STR_LIST("database", tgt_dbs);
+ SPIDER_PARAM_STR_LIST_CHECK("database", tgt_dbs,
+ option_struct &&
+ option_struct->remote_database);
SPIDER_PARAM_STR_LIST("password", tgt_passwords);
+ SPIDER_PARAM_DEPRECATED_WARNING("sts_mode");
SPIDER_PARAM_INT_WITH_MAX("sts_mode", sts_mode, 1, 2);
#ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARAM_INT_WITH_MAX("sts_sync", sts_sync, 0, 2);
#endif
+ SPIDER_PARAM_DEPRECATED_WARNING("crd_mode");
SPIDER_PARAM_INT_WITH_MAX("crd_mode", crd_mode, 0, 3);
#ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARAM_INT_WITH_MAX("crd_sync", crd_sync, 0, 2);
#endif
+ SPIDER_PARAM_DEPRECATED_WARNING("crd_type");
SPIDER_PARAM_INT_WITH_MAX("crd_type", crd_type, 0, 2);
SPIDER_PARAM_LONGLONG("priority", priority, 0);
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -2502,6 +2510,7 @@ int spider_parse_connect_info(
error_num = connect_string_parse.print_param_error();
goto error;
case 10:
+ SPIDER_PARAM_DEPRECATED_WARNING("crd_weight");
SPIDER_PARAM_DOUBLE("crd_weight", crd_weight, 1);
SPIDER_PARAM_LONGLONG("split_read", split_read, 0);
SPIDER_PARAM_INT_WITH_MAX("quick_mode", quick_mode, 0, 3);
@@ -2518,11 +2527,10 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT_WITH_MAX("sts_bg_mode", sts_bg_mode, 0, 2);
#endif
SPIDER_PARAM_LONG_LIST_WITH_MAX("link_status", link_statuses, 0, 3);
+ SPIDER_PARAM_DEPRECATED_WARNING("use_handler");
SPIDER_PARAM_LONG_LIST_WITH_MAX("use_handler", use_handlers, 0, 3);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_LONG_LIST_WITH_MAX("use_hs_read", use_hs_reads, 0, 1);
-#endif
SPIDER_PARAM_INT_WITH_MAX("casual_read", casual_read, 0, 63);
+ SPIDER_PARAM_DEPRECATED_WARNING("buffer_size");
SPIDER_PARAM_INT("buffer_size", buffer_size, 0);
error_num = connect_string_parse.print_param_error();
goto error;
@@ -2531,32 +2539,19 @@ int spider_parse_connect_info(
SPIDER_PARAM_DOUBLE("crd_interval", crd_interval, 0);
SPIDER_PARAM_INT_WITH_MAX("low_mem_read", low_mem_read, 0, 1);
SPIDER_PARAM_STR_LIST("default_file", tgt_default_files);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_LONG_LIST_WITH_MAX(
- "use_hs_write", use_hs_writes, 0, 1);
- SPIDER_PARAM_LONG_LIST_WITH_MAX(
- "hs_read_port", hs_read_ports, 0, 65535);
-#endif
error_num = connect_string_parse.print_param_error();
goto error;
case 13:
SPIDER_PARAM_STR_LIST("default_group", tgt_default_groups);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_LONG_LIST_WITH_MAX(
- "hs_write_port", hs_write_ports, 0, 65535);
-#endif
SPIDER_PARAM_STR_LIST("sequence_name", tgt_sequence_names);
error_num = connect_string_parse.print_param_error();
goto error;
case 14:
+ SPIDER_PARAM_DEPRECATED_WARNING("internal_limit");
SPIDER_PARAM_LONGLONG("internal_limit", internal_limit, 0);
#ifndef WITHOUT_SPIDER_BG_SEARCH
SPIDER_PARAM_LONGLONG("bgs_first_read", bgs_first_read, 0);
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_STR_LIST(
- "hs_read_socket", hs_read_socks);
-#endif
SPIDER_PARAM_INT_WITH_MAX("read_only_mode", read_only_mode, 0, 1);
SPIDER_PARAM_LONG_LIST_WITH_MAX("access_balance", access_balances, 0,
2147483647);
@@ -2566,8 +2561,10 @@ int spider_parse_connect_info(
error_num = connect_string_parse.print_param_error();
goto error;
case 15:
+ SPIDER_PARAM_DEPRECATED_WARNING("internal_offset");
SPIDER_PARAM_LONGLONG("internal_offset", internal_offset, 0);
SPIDER_PARAM_INT_WITH_MAX("reset_sql_alloc", reset_sql_alloc, 0, 1);
+ SPIDER_PARAM_DEPRECATED_WARNING("semi_table_lock");
SPIDER_PARAM_INT_WITH_MAX("semi_table_lock", semi_table_lock, 0, 1);
SPIDER_PARAM_LONGLONG("quick_page_byte", quick_page_byte, 0);
SPIDER_PARAM_LONGLONG("quick_page_size", quick_page_size, 0);
@@ -2577,10 +2574,6 @@ int spider_parse_connect_info(
SPIDER_PARAM_LONG_LIST_WITH_MAX("monitoring_flag", monitoring_flag, 0, 1);
SPIDER_PARAM_LONG_LIST_WITH_MAX("monitoring_kind", monitoring_kind, 0, 3);
SPIDER_PARAM_DOUBLE("semi_split_read", semi_split_read, 0);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_STR_LIST(
- "hs_write_socket", hs_write_socks);
-#endif
SPIDER_PARAM_LONG_LIST_WITH_MAX("connect_timeout", connect_timeouts,
0, 2147483647);
SPIDER_PARAM_LONG_LIST_WITH_MAX("strict_group_by",
@@ -2604,10 +2597,6 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT("bulk_update_size", bulk_update_size, 0);
SPIDER_PARAM_LONG_LIST_WITH_MAX("net_read_timeout",
net_read_timeouts, 0, 2147483647);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_LONG_LIST_WITH_MAX(
- "hs_write_to_read", hs_write_to_reads, 0, 1);
-#endif
SPIDER_PARAM_INT_WITH_MAX(
"error_write_mode", error_write_mode, 0, 1);
#ifdef HA_CAN_BULK_ACCESS
@@ -2652,12 +2641,11 @@ int spider_parse_connect_info(
error_num = connect_string_parse.print_param_error();
goto error;
case 19:
+ SPIDER_PARAM_DEPRECATED_WARNING("init_sql_alloc_size");
SPIDER_PARAM_INT("init_sql_alloc_size", init_sql_alloc_size, 0);
SPIDER_PARAM_INT_WITH_MAX(
"auto_increment_mode", auto_increment_mode, 0, 3);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- SPIDER_PARAM_LONGLONG("hs_result_free_size", hs_result_free_size, 0);
-#endif
+ SPIDER_PARAM_DEPRECATED_WARNING("bka_table_name_type");
SPIDER_PARAM_LONG_LIST_WITH_MAX("bka_table_name_type",
bka_table_name_types, 0, 1);
SPIDER_PARAM_INT_WITH_MAX(
@@ -2706,6 +2694,7 @@ int spider_parse_connect_info(
error_num = connect_string_parse.print_param_error();
goto error;
case 26:
+ SPIDER_PARAM_DEPRECATED_WARNING("semi_table_lock_connection");
SPIDER_PARAM_INT_WITH_MAX(
"semi_table_lock_connection", semi_table_lock_conn, 0, 1);
error_num = connect_string_parse.print_param_error();
@@ -2726,6 +2715,10 @@ int spider_parse_connect_info(
}
}
+ SPIDER_OPTION_STR_LIST("server", remote_server, server_names);
+ SPIDER_OPTION_STR_LIST("database", remote_database, tgt_dbs);
+ SPIDER_OPTION_STR_LIST("table", remote_table, tgt_table_names);
+
/* check all_link_count */
share->all_link_count = 1;
if (share->all_link_count < share->server_names_length)
@@ -2794,22 +2787,6 @@ int spider_parse_connect_info(
if (share->all_link_count < share->monitoring_bg_interval_length)
share->all_link_count = share->monitoring_bg_interval_length;
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (share->all_link_count < share->use_hs_reads_length)
- share->all_link_count = share->use_hs_reads_length;
- if (share->all_link_count < share->use_hs_writes_length)
- share->all_link_count = share->use_hs_writes_length;
- if (share->all_link_count < share->hs_read_ports_length)
- share->all_link_count = share->hs_read_ports_length;
- if (share->all_link_count < share->hs_write_ports_length)
- share->all_link_count = share->hs_write_ports_length;
- if (share->all_link_count < share->hs_read_socks_length)
- share->all_link_count = share->hs_read_socks_length;
- if (share->all_link_count < share->hs_write_socks_length)
- share->all_link_count = share->hs_write_socks_length;
- if (share->all_link_count < share->hs_write_to_reads_length)
- share->all_link_count = share->hs_write_to_reads_length;
-#endif
if (share->all_link_count < share->use_handlers_length)
share->all_link_count = share->use_handlers_length;
if (share->all_link_count < share->connect_timeouts_length)
@@ -3030,47 +3007,6 @@ int spider_parse_connect_info(
&share->monitoring_sid_length,
share->all_link_count)))
goto error;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if ((error_num = spider_increase_long_list(
- &share->use_hs_reads,
- &share->use_hs_reads_length,
- share->all_link_count)))
- goto error;
- if ((error_num = spider_increase_long_list(
- &share->use_hs_writes,
- &share->use_hs_writes_length,
- share->all_link_count)))
- goto error;
- if ((error_num = spider_increase_long_list(
- &share->hs_read_ports,
- &share->hs_read_ports_length,
- share->all_link_count)))
- goto error;
- if ((error_num = spider_increase_long_list(
- &share->hs_write_ports,
- &share->hs_write_ports_length,
- share->all_link_count)))
- goto error;
- if ((error_num = spider_increase_string_list(
- &share->hs_read_socks,
- &share->hs_read_socks_lengths,
- &share->hs_read_socks_length,
- &share->hs_read_socks_charlen,
- share->all_link_count)))
- goto error;
- if ((error_num = spider_increase_string_list(
- &share->hs_write_socks,
- &share->hs_write_socks_lengths,
- &share->hs_write_socks_length,
- &share->hs_write_socks_charlen,
- share->all_link_count)))
- goto error;
- if ((error_num = spider_increase_long_list(
- &share->hs_write_to_reads,
- &share->hs_write_to_reads_length,
- share->all_link_count)))
- goto error;
-#endif
if ((error_num = spider_increase_long_list(
&share->use_handlers,
&share->use_handlers_length,
@@ -4018,42 +3954,6 @@ int spider_set_connect_info_default(
share->monitoring_sid[roop_count] = current_thd->server_id;
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (share->use_hs_reads[roop_count] == -1)
- share->use_hs_reads[roop_count] = 0;
- if (share->use_hs_writes[roop_count] == -1)
- share->use_hs_writes[roop_count] = 0;
- if (share->hs_read_ports[roop_count] == -1)
- {
- share->hs_read_ports[roop_count] = 9998;
- } else if (share->hs_read_ports[roop_count] < 0)
- {
- share->hs_read_ports[roop_count] = 0;
- } else if (share->hs_read_ports[roop_count] > 65535)
- {
- share->hs_read_ports[roop_count] = 65535;
- }
- if (share->hs_write_ports[roop_count] == -1)
- {
- share->hs_write_ports[roop_count] = 9999;
- } else if (share->hs_write_ports[roop_count] < 0)
- {
- share->hs_write_ports[roop_count] = 0;
- } else if (share->hs_write_ports[roop_count] > 65535)
- {
- share->hs_write_ports[roop_count] = 65535;
- }
- if (share->hs_write_to_reads[roop_count] == -1)
- {
- share->hs_write_to_reads[roop_count] = 1;
- } else if (share->hs_write_to_reads[roop_count] < 0)
- {
- share->hs_write_to_reads[roop_count] = 0;
- } else if (share->hs_write_to_reads[roop_count] > 1)
- {
- share->hs_write_to_reads[roop_count] = 1;
- }
-#endif
if (share->use_handlers[roop_count] == -1)
share->use_handlers[roop_count] = 0;
if (share->connect_timeouts[roop_count] == -1)
@@ -4198,10 +4098,6 @@ int spider_set_connect_info_default(
share->error_write_mode = 0;
if (share->active_link_count == -1)
share->active_link_count = share->all_link_count;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (share->hs_result_free_size == -1)
- share->hs_result_free_size = 1048576;
-#endif
#ifdef HA_CAN_BULK_ACCESS
if (share->bulk_access_free == -1)
share->bulk_access_free = 0;
@@ -4376,23 +4272,12 @@ int spider_create_conn_keys(
) {
int roop_count, roop_count2;
char *tmp_name, port_str[6];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char *tmp_hs_r_name, *tmp_hs_w_name;
-#endif
uint length_base = sizeof(uint) * share->all_link_count;
uint *conn_keys_lengths;
uint *sql_dbton_ids;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- uint *hs_dbton_ids;
- uint *hs_r_conn_keys_lengths;
- uint *hs_w_conn_keys_lengths;
-#endif
DBUG_ENTER("spider_create_conn_keys");
char *ptr;
uint length = length_base * 2;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- length += length_base * 3;
-#endif
ptr = (char *) my_alloca(length);
if (!ptr)
{
@@ -4401,26 +4286,11 @@ int spider_create_conn_keys(
conn_keys_lengths = (uint *) ptr;
ptr += length_base;
sql_dbton_ids = (uint *) ptr;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ptr += length_base;
- hs_dbton_ids = (uint *) ptr;
- ptr += length_base;
- hs_r_conn_keys_lengths = (uint *) ptr;
- ptr += length_base;
- hs_w_conn_keys_lengths = (uint *) ptr;
-#endif
share->conn_keys_charlen = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- share->hs_read_conn_keys_charlen = 0;
- share->hs_write_conn_keys_charlen = 0;
-#endif
for (roop_count = 0; roop_count < (int) share->all_link_count; roop_count++)
{
bool get_sql_id = FALSE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- bool get_nosql_id = FALSE;
-#endif
for (roop_count2 = 0; roop_count2 < SPIDER_DBTON_SIZE; roop_count2++)
{
DBUG_PRINT("info",("spider share->tgt_wrappers[%d]=%s", roop_count,
@@ -4440,35 +4310,12 @@ int spider_create_conn_keys(
) {
sql_dbton_ids[roop_count] = roop_count2;
get_sql_id = TRUE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (get_nosql_id)
-#endif
break;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- else
- continue;
-#endif
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (
- !get_nosql_id &&
- spider_dbton[roop_count2].db_access_type ==
- SPIDER_DB_ACCESS_TYPE_NOSQL
- ) {
- hs_dbton_ids[roop_count] = roop_count2;
- get_nosql_id = TRUE;
- if (get_sql_id)
- break;
- }
-#endif
}
}
if (!get_sql_id)
sql_dbton_ids[roop_count] = SPIDER_DBTON_SIZE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!get_nosql_id)
- hs_dbton_ids[roop_count] = SPIDER_DBTON_SIZE;
-#endif
bool tables_on_different_db_are_joinable;
if (get_sql_id)
@@ -4501,24 +4348,6 @@ int spider_create_conn_keys(
+ share->tgt_filedsns_lengths[roop_count] + 1
+ share->tgt_drivers_lengths[roop_count];
share->conn_keys_charlen += conn_keys_lengths[roop_count] + 2;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- hs_r_conn_keys_lengths[roop_count]
- = 1
- + share->tgt_wrappers_lengths[roop_count] + 1
- + share->tgt_hosts_lengths[roop_count] + 1
- + 5 + 1
- + share->hs_read_socks_lengths[roop_count];
- share->hs_read_conn_keys_charlen +=
- hs_r_conn_keys_lengths[roop_count] + 2;
- hs_w_conn_keys_lengths[roop_count]
- = 1
- + share->tgt_wrappers_lengths[roop_count] + 1
- + share->tgt_hosts_lengths[roop_count] + 1
- + 5 + 1
- + share->hs_write_socks_lengths[roop_count];
- share->hs_write_conn_keys_charlen +=
- hs_w_conn_keys_lengths[roop_count] + 2;
-#endif
}
if (!(share->conn_keys = (char **)
spider_bulk_alloc_mem(spider_current_trx, 45,
@@ -4530,26 +4359,7 @@ int spider_create_conn_keys(
sizeof(my_hash_value_type) * share->all_link_count,
#endif
&tmp_name, sizeof(char) * share->conn_keys_charlen,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- &share->hs_read_conn_keys, sizeof(char *) * share->all_link_count,
- &share->hs_read_conn_keys_lengths, length_base,
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- &share->hs_read_conn_keys_hash_value,
- sizeof(my_hash_value_type) * share->all_link_count,
-#endif
- &tmp_hs_r_name, sizeof(char) * share->hs_read_conn_keys_charlen,
- &share->hs_write_conn_keys, sizeof(char *) * share->all_link_count,
- &share->hs_write_conn_keys_lengths, length_base,
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- &share->hs_write_conn_keys_hash_value,
- sizeof(my_hash_value_type) * share->all_link_count,
-#endif
- &tmp_hs_w_name, sizeof(char) * share->hs_write_conn_keys_charlen,
-#endif
&share->sql_dbton_ids, length_base,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- &share->hs_dbton_ids, length_base,
-#endif
NullS))
) {
my_afree(conn_keys_lengths);
@@ -4559,15 +4369,6 @@ int spider_create_conn_keys(
memcpy(share->conn_keys_lengths, conn_keys_lengths,
length_base);
memcpy(share->sql_dbton_ids, sql_dbton_ids, length_base);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- share->hs_read_conn_keys_length = share->all_link_count;
- share->hs_write_conn_keys_length = share->all_link_count;
- memcpy(share->hs_read_conn_keys_lengths, hs_r_conn_keys_lengths,
- length_base);
- memcpy(share->hs_write_conn_keys_lengths, hs_w_conn_keys_lengths,
- length_base);
- memcpy(share->hs_dbton_ids, hs_dbton_ids, length_base);
-#endif
my_afree(conn_keys_lengths);
@@ -4709,82 +4510,14 @@ int spider_create_conn_keys(
&spider_open_connections, (uchar*) share->conn_keys[roop_count],
share->conn_keys_lengths[roop_count]);
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- share->hs_read_conn_keys[roop_count] = tmp_hs_r_name;
- *tmp_hs_r_name = '0';
- DBUG_PRINT("info",("spider tgt_wrappers[%d]=%s", roop_count,
- share->tgt_wrappers[roop_count]));
- tmp_hs_r_name = strmov(tmp_hs_r_name + 1, share->tgt_wrappers[roop_count]);
- DBUG_PRINT("info",("spider tgt_hosts[%d]=%s", roop_count,
- share->tgt_hosts[roop_count]));
- tmp_hs_r_name = strmov(tmp_hs_r_name + 1, share->tgt_hosts[roop_count]);
- my_sprintf(port_str, (port_str, "%05ld",
- share->hs_read_ports[roop_count]));
- DBUG_PRINT("info",("spider port_str=%s", port_str));
- tmp_hs_r_name = strmov(tmp_hs_r_name + 1, port_str);
- if (share->hs_read_socks[roop_count])
- {
- DBUG_PRINT("info",("spider hs_read_socks[%d]=%s", roop_count,
- share->hs_read_socks[roop_count]));
- tmp_hs_r_name = strmov(tmp_hs_r_name + 1,
- share->hs_read_socks[roop_count]);
- } else
- tmp_hs_r_name++;
- tmp_hs_r_name++;
- tmp_hs_r_name++;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- share->hs_read_conn_keys_hash_value[roop_count] = my_calc_hash(
- &spider_open_connections, (uchar*) share->hs_read_conn_keys[roop_count],
- share->hs_read_conn_keys_lengths[roop_count]);
-#endif
- share->hs_write_conn_keys[roop_count] = tmp_hs_w_name;
- *tmp_hs_w_name = '0';
- DBUG_PRINT("info",("spider tgt_wrappers[%d]=%s", roop_count,
- share->tgt_wrappers[roop_count]));
- tmp_hs_w_name = strmov(tmp_hs_w_name + 1, share->tgt_wrappers[roop_count]);
- DBUG_PRINT("info",("spider tgt_hosts[%d]=%s", roop_count,
- share->tgt_hosts[roop_count]));
- tmp_hs_w_name = strmov(tmp_hs_w_name + 1, share->tgt_hosts[roop_count]);
- my_sprintf(port_str, (port_str, "%05ld",
- share->hs_write_ports[roop_count]));
- DBUG_PRINT("info",("spider port_str=%s", port_str));
- tmp_hs_w_name = strmov(tmp_hs_w_name + 1, port_str);
- if (share->hs_write_socks[roop_count])
- {
- DBUG_PRINT("info",("spider hs_write_socks[%d]=%s", roop_count,
- share->hs_write_socks[roop_count]));
- tmp_hs_w_name = strmov(tmp_hs_w_name + 1,
- share->hs_write_socks[roop_count]);
- } else
- tmp_hs_w_name++;
- tmp_hs_w_name++;
- tmp_hs_w_name++;
-#ifdef SPIDER_HAS_HASH_VALUE_TYPE
- share->hs_write_conn_keys_hash_value[roop_count] = my_calc_hash(
- &spider_open_connections, (uchar*) share->hs_write_conn_keys[roop_count],
- share->hs_write_conn_keys_lengths[roop_count]);
-#endif
-#endif
}
for (roop_count2 = 0; roop_count2 < SPIDER_DBTON_SIZE; roop_count2++)
{
if (spider_bit_is_set(share->dbton_bitmap, roop_count2))
{
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (spider_dbton[roop_count2].db_access_type ==
- SPIDER_DB_ACCESS_TYPE_SQL)
- {
-#endif
share->use_sql_dbton_ids[share->use_dbton_count] = roop_count2;
share->sql_dbton_id_to_seq[roop_count2] = share->use_dbton_count;
share->use_sql_dbton_count++;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else {
- share->use_hs_dbton_ids[share->use_hs_dbton_count] = roop_count2;
- share->hs_dbton_id_to_seq[roop_count2] = share->use_hs_dbton_count;
- share->use_hs_dbton_count++;
- }
-#endif
share->use_dbton_ids[share->use_dbton_count] = roop_count2;
share->dbton_id_to_seq[roop_count2] = share->use_dbton_count;
share->use_dbton_count++;
@@ -4841,9 +4574,6 @@ SPIDER_SHARE *spider_create_share(
SPD_INIT_ALLOC_ROOT(&share->mem_root, 4096, 0, MYF(MY_WME));
share->use_count = 0;
share->use_dbton_count = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- share->use_hs_dbton_count = 0;
-#endif
share->table_name_length = length;
share->table_name = tmp_name;
strmov(share->table_name, table_name);
@@ -5036,12 +4766,6 @@ SPIDER_SHARE *spider_get_share(
SPIDER_RESULT_LIST *result_list = &spider->result_list;
uint length, tmp_conn_link_idx = 0, buf_sz;
char *tmp_name, *tmp_cid;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char *tmp_hs_r_name, *tmp_hs_w_name;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- uint32 *tmp_hs_r_ret_fields, *tmp_hs_w_ret_fields;
-#endif
-#endif
int roop_count;
double sts_interval;
int sts_mode;
@@ -5366,16 +5090,6 @@ SPIDER_SHARE *spider_get_share(
&spider->conns, sizeof(SPIDER_CONN *) * share->link_count,
&spider->conn_link_idx, sizeof(uint) * share->link_count,
&spider->conn_can_fo, sizeof(uchar) * share->link_bitmap_size,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- &spider->hs_r_conn_keys, sizeof(char *) * share->link_count,
- &tmp_hs_r_name, sizeof(char) * share->hs_read_conn_keys_charlen,
- &spider->hs_r_conns, sizeof(SPIDER_CONN *) * share->link_count,
- &spider->hs_r_conn_ages, sizeof(ulonglong) * share->link_count,
- &spider->hs_w_conn_keys, sizeof(char *) * share->link_count,
- &tmp_hs_w_name, sizeof(char) * share->hs_write_conn_keys_charlen,
- &spider->hs_w_conns, sizeof(SPIDER_CONN *) * share->link_count,
- &spider->hs_w_conn_ages, sizeof(ulonglong) * share->link_count,
-#endif
&spider->sql_kind, sizeof(uint) * share->link_count,
&spider->connection_ids, sizeof(ulonglong) * share->link_count,
&spider->conn_kind, sizeof(uint) * share->link_count,
@@ -5384,26 +5098,6 @@ SPIDER_SHARE *spider_get_share(
&spider->m_handler_opened, sizeof(uchar) * share->link_bitmap_size,
&spider->m_handler_id, sizeof(uint) * share->link_count,
&spider->m_handler_cid, sizeof(char *) * share->link_count,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- &spider->r_handler_opened, sizeof(uchar) * share->link_bitmap_size,
- &spider->r_handler_id, sizeof(uint) * share->link_count,
- &spider->r_handler_index, sizeof(uint) * share->link_count,
- &spider->w_handler_opened, sizeof(uchar) * share->link_bitmap_size,
- &spider->w_handler_id, sizeof(uint) * share->link_count,
- &spider->w_handler_index, sizeof(uint) * share->link_count,
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- &spider->do_hs_direct_update, sizeof(uchar) * share->link_bitmap_size,
- &spider->hs_r_ret_fields, sizeof(uint32 *) * share->link_count,
- &spider->hs_w_ret_fields, sizeof(uint32 *) * share->link_count,
- &spider->hs_r_ret_fields_num, sizeof(size_t) * share->link_count,
- &spider->hs_w_ret_fields_num, sizeof(size_t) * share->link_count,
- &tmp_hs_r_ret_fields,
- sizeof(uint32) * share->link_count * table_share->fields,
- &tmp_hs_w_ret_fields,
- sizeof(uint32) * share->link_count * table_share->fields,
- &spider->tmp_column_bitmap, sizeof(uchar) * share->bitmap_size,
-#endif
-#endif
&tmp_cid, sizeof(char) * (SPIDER_SQL_HANDLER_CID_LEN + 1) *
share->link_count,
&spider->need_mons, sizeof(int) * share->link_count,
@@ -5415,14 +5109,6 @@ SPIDER_SHARE *spider_get_share(
sizeof(uchar) * share->link_bitmap_size,
&result_list->tmp_table_created,
sizeof(uchar) * share->link_bitmap_size,
-#ifdef HA_CAN_BULK_ACCESS
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- &result_list->hs_r_bulk_open_index,
- sizeof(uchar) * share->link_bitmap_size,
- &result_list->hs_w_bulk_open_index,
- sizeof(uchar) * share->link_bitmap_size,
-#endif
-#endif
&result_list->sql_kind_backup, sizeof(uint) * share->link_count,
&result_list->casual_read, sizeof(int) * share->link_count,
&spider->dbton_handler,
@@ -5436,12 +5122,6 @@ SPIDER_SHARE *spider_get_share(
goto error_but_no_delete;
}
memcpy(tmp_name, share->conn_keys[0], share->conn_keys_charlen);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- memcpy(tmp_hs_r_name, share->hs_read_conn_keys[0],
- share->hs_read_conn_keys_charlen);
- memcpy(tmp_hs_w_name, share->hs_write_conn_keys[0],
- share->hs_write_conn_keys_charlen);
-#endif
spider->conn_keys_first_ptr = tmp_name;
for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
@@ -5449,18 +5129,6 @@ SPIDER_SHARE *spider_get_share(
spider->conn_keys[roop_count] = tmp_name;
*tmp_name = first_byte;
tmp_name += share->conn_keys_lengths[roop_count] + 1;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider->hs_r_conn_keys[roop_count] = tmp_hs_r_name;
- tmp_hs_r_name += share->hs_read_conn_keys_lengths[roop_count] + 1;
- spider->hs_w_conn_keys[roop_count] = tmp_hs_w_name;
- tmp_hs_w_name += share->hs_write_conn_keys_lengths[roop_count] + 1;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- spider->hs_r_ret_fields[roop_count] = tmp_hs_r_ret_fields;
- tmp_hs_r_ret_fields += table_share->fields;
- spider->hs_w_ret_fields[roop_count] = tmp_hs_w_ret_fields;
- tmp_hs_w_ret_fields += table_share->fields;
-#endif
-#endif
spider->m_handler_cid[roop_count] = tmp_cid;
tmp_cid += SPIDER_SQL_HANDLER_CID_LEN + 1;
result_list->upd_tmp_tbl_prms[roop_count].init();
@@ -5908,16 +5576,6 @@ SPIDER_SHARE *spider_get_share(
&spider->conns, sizeof(SPIDER_CONN *) * share->link_count,
&spider->conn_link_idx, sizeof(uint) * share->link_count,
&spider->conn_can_fo, sizeof(uchar) * share->link_bitmap_size,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- &spider->hs_r_conn_keys, sizeof(char *) * share->link_count,
- &tmp_hs_r_name, sizeof(char) * share->hs_read_conn_keys_charlen,
- &spider->hs_r_conns, sizeof(SPIDER_CONN *) * share->link_count,
- &spider->hs_r_conn_ages, sizeof(ulonglong) * share->link_count,
- &spider->hs_w_conn_keys, sizeof(char *) * share->link_count,
- &tmp_hs_w_name, sizeof(char) * share->hs_write_conn_keys_charlen,
- &spider->hs_w_conns, sizeof(SPIDER_CONN *) * share->link_count,
- &spider->hs_w_conn_ages, sizeof(ulonglong) * share->link_count,
-#endif
&spider->sql_kind, sizeof(uint) * share->link_count,
&spider->connection_ids, sizeof(ulonglong) * share->link_count,
&spider->conn_kind, sizeof(uint) * share->link_count,
@@ -5926,26 +5584,6 @@ SPIDER_SHARE *spider_get_share(
&spider->m_handler_opened, sizeof(uchar) * share->link_bitmap_size,
&spider->m_handler_id, sizeof(uint) * share->link_count,
&spider->m_handler_cid, sizeof(char *) * share->link_count,
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- &spider->r_handler_opened, sizeof(uchar) * share->link_bitmap_size,
- &spider->r_handler_id, sizeof(uint) * share->link_count,
- &spider->r_handler_index, sizeof(uint) * share->link_count,
- &spider->w_handler_opened, sizeof(uchar) * share->link_bitmap_size,
- &spider->w_handler_id, sizeof(uint) * share->link_count,
- &spider->w_handler_index, sizeof(uint) * share->link_count,
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- &spider->do_hs_direct_update, sizeof(uchar) * share->link_bitmap_size,
- &spider->hs_r_ret_fields, sizeof(uint32 *) * share->link_count,
- &spider->hs_w_ret_fields, sizeof(uint32 *) * share->link_count,
- &spider->hs_r_ret_fields_num, sizeof(size_t) * share->link_count,
- &spider->hs_w_ret_fields_num, sizeof(size_t) * share->link_count,
- &tmp_hs_r_ret_fields,
- sizeof(uint32) * share->link_count * table_share->fields,
- &tmp_hs_w_ret_fields,
- sizeof(uint32) * share->link_count * table_share->fields,
- &spider->tmp_column_bitmap, sizeof(uchar) * share->bitmap_size,
-#endif
-#endif
&tmp_cid, sizeof(char) * (SPIDER_SQL_HANDLER_CID_LEN + 1) *
share->link_count,
&spider->need_mons, sizeof(int) * share->link_count,
@@ -5957,14 +5595,6 @@ SPIDER_SHARE *spider_get_share(
sizeof(uchar) * share->link_bitmap_size,
&result_list->tmp_table_created,
sizeof(uchar) * share->link_bitmap_size,
-#ifdef HA_CAN_BULK_ACCESS
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- &result_list->hs_r_bulk_open_index,
- sizeof(uchar) * share->link_bitmap_size,
- &result_list->hs_w_bulk_open_index,
- sizeof(uchar) * share->link_bitmap_size,
-#endif
-#endif
&result_list->sql_kind_backup, sizeof(uint) * share->link_count,
&result_list->casual_read, sizeof(int) * share->link_count,
&spider->dbton_handler,
@@ -5975,12 +5605,6 @@ SPIDER_SHARE *spider_get_share(
goto error_but_no_delete;
}
memcpy(tmp_name, share->conn_keys[0], share->conn_keys_charlen);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- memcpy(tmp_hs_r_name, share->hs_read_conn_keys[0],
- share->hs_read_conn_keys_charlen);
- memcpy(tmp_hs_w_name, share->hs_write_conn_keys[0],
- share->hs_write_conn_keys_charlen);
-#endif
spider->conn_keys_first_ptr = tmp_name;
for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
@@ -5988,18 +5612,6 @@ SPIDER_SHARE *spider_get_share(
spider->conn_keys[roop_count] = tmp_name;
*tmp_name = first_byte;
tmp_name += share->conn_keys_lengths[roop_count] + 1;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider->hs_r_conn_keys[roop_count] = tmp_hs_r_name;
- tmp_hs_r_name += share->hs_read_conn_keys_lengths[roop_count] + 1;
- spider->hs_w_conn_keys[roop_count] = tmp_hs_w_name;
- tmp_hs_w_name += share->hs_write_conn_keys_lengths[roop_count] + 1;
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- spider->hs_r_ret_fields[roop_count] = tmp_hs_r_ret_fields;
- tmp_hs_r_ret_fields += table_share->fields;
- spider->hs_w_ret_fields[roop_count] = tmp_hs_w_ret_fields;
- tmp_hs_w_ret_fields += table_share->fields;
-#endif
-#endif
spider->m_handler_cid[roop_count] = tmp_cid;
tmp_cid += SPIDER_SQL_HANDLER_CID_LEN + 1;
result_list->upd_tmp_tbl_prms[roop_count].init();
@@ -7186,32 +6798,6 @@ int spider_db_done(
}
pthread_mutex_unlock(&spider_allocated_thds_mutex);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- pthread_mutex_lock(&spider_hs_w_conn_mutex);
- while ((conn = (SPIDER_CONN*) my_hash_element(&spider_hs_w_conn_hash, 0)))
- {
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&spider_hs_w_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn);
-#else
- my_hash_delete(&spider_hs_w_conn_hash, (uchar*) conn);
-#endif
- spider_free_conn(conn);
- }
- pthread_mutex_unlock(&spider_hs_w_conn_mutex);
- pthread_mutex_lock(&spider_hs_r_conn_mutex);
- while ((conn = (SPIDER_CONN*) my_hash_element(&spider_hs_r_conn_hash, 0)))
- {
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&spider_hs_r_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn);
-#else
- my_hash_delete(&spider_hs_r_conn_hash, (uchar*) conn);
-#endif
- spider_free_conn(conn);
- }
- pthread_mutex_unlock(&spider_hs_r_conn_mutex);
-#endif
pthread_mutex_lock(&spider_conn_mutex);
while ((conn = (SPIDER_CONN*) my_hash_element(&spider_open_connections, 0)))
{
@@ -7241,18 +6827,6 @@ int spider_db_done(
spider_allocated_thds.array.max_element *
spider_allocated_thds.array.size_of_element);
my_hash_free(&spider_allocated_thds);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider_free_mem_calc(spider_current_trx,
- spider_hs_w_conn_hash_id,
- spider_hs_w_conn_hash.array.max_element *
- spider_hs_w_conn_hash.array.size_of_element);
- my_hash_free(&spider_hs_w_conn_hash);
- spider_free_mem_calc(spider_current_trx,
- spider_hs_r_conn_hash_id,
- spider_hs_r_conn_hash.array.max_element *
- spider_hs_r_conn_hash.array.size_of_element);
- my_hash_free(&spider_hs_r_conn_hash);
-#endif
spider_free_mem_calc(spider_current_trx,
spider_open_connections_id,
spider_open_connections.array.max_element *
@@ -7300,10 +6874,6 @@ int spider_db_done(
pthread_mutex_destroy(&spider_mon_table_cache_mutex);
pthread_mutex_destroy(&spider_allocated_thds_mutex);
pthread_mutex_destroy(&spider_open_conn_mutex);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- pthread_mutex_destroy(&spider_hs_w_conn_mutex);
- pthread_mutex_destroy(&spider_hs_r_conn_mutex);
-#endif
pthread_mutex_destroy(&spider_conn_mutex);
pthread_mutex_destroy(&spider_lgtm_tblhnd_share_mutex);
#ifdef WITH_PARTITION_STORAGE_ENGINE
@@ -7398,6 +6968,7 @@ int spider_db_init(
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
spider_hton->create_group_by = spider_create_group_by_handler;
#endif
+ spider_hton->table_options= spider_table_option_list;
if (my_gethwaddr((uchar *) addr))
{
@@ -7527,24 +7098,6 @@ int spider_db_init(
#endif
goto error_open_conn_mutex_init;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#if MYSQL_VERSION_ID < 50500
- if (pthread_mutex_init(&spider_hs_r_conn_mutex, MY_MUTEX_INIT_FAST))
-#else
- if (mysql_mutex_init(spd_key_mutex_hs_r_conn,
- &spider_hs_r_conn_mutex, MY_MUTEX_INIT_FAST))
-#endif
- goto error_hs_r_conn_mutex_init;
-
-#if MYSQL_VERSION_ID < 50500
- if (pthread_mutex_init(&spider_hs_w_conn_mutex, MY_MUTEX_INIT_FAST))
-#else
- if (mysql_mutex_init(spd_key_mutex_hs_w_conn,
- &spider_hs_w_conn_mutex, MY_MUTEX_INIT_FAST))
-#endif
- goto error_hs_w_conn_mutex_init;
-
-#endif
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_allocated_thds_mutex, MY_MUTEX_INIT_FAST))
#else
@@ -7624,26 +7177,6 @@ int spider_db_init(
spider_open_connections,
spider_open_connections.array.max_element *
spider_open_connections.array.size_of_element);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (my_hash_init(PSI_INSTRUMENT_ME, &spider_hs_r_conn_hash, spd_charset_utf8mb3_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0))
- goto error_hs_r_conn_hash_init;
-
- spider_alloc_calc_mem_init(spider_hs_r_conn_hash, 147);
- spider_alloc_calc_mem(NULL,
- spider_hs_r_conn_hash,
- spider_hs_r_conn_hash.array.max_element *
- spider_hs_r_conn_hash.array.size_of_element);
- if (my_hash_init(PSI_INSTRUMENT_ME, &spider_hs_w_conn_hash, spd_charset_utf8mb3_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0))
- goto error_hs_w_conn_hash_init;
-
- spider_alloc_calc_mem_init(spider_hs_w_conn_hash, 148);
- spider_alloc_calc_mem(NULL,
- spider_hs_w_conn_hash,
- spider_hs_w_conn_hash.array.max_element *
- spider_hs_w_conn_hash.array.size_of_element);
-#endif
if (my_hash_init(PSI_INSTRUMENT_ME, &spider_allocated_thds, spd_charset_utf8mb3_bin, 32, 0, 0,
(my_hash_get_key) spider_allocated_thds_get_key, 0, 0))
goto error_allocated_thds_hash_init;
@@ -7757,12 +7290,6 @@ int spider_db_init(
spider_dbton_mariadb.db_util->dbton_id = dbton_id;
spider_dbton[dbton_id] = spider_dbton_mariadb;
++dbton_id;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider_dbton_handlersocket.dbton_id = dbton_id;
- spider_dbton_handlersocket.db_util->dbton_id = dbton_id;
- spider_dbton[dbton_id] = spider_dbton_handlersocket;
- ++dbton_id;
-#endif
#ifdef HAVE_ORACLE_OCI
spider_dbton_oracle.dbton_id = dbton_id;
spider_dbton_oracle.db_util->dbton_id = dbton_id;
@@ -7838,20 +7365,6 @@ error_mon_table_cache_array_init:
error_allocated_thds_hash_init:
my_hash_free(&spider_ipport_conns);
error_ipport_conn__hash_init:
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider_free_mem_calc(NULL,
- spider_hs_w_conn_hash_id,
- spider_hs_w_conn_hash.array.max_element *
- spider_hs_w_conn_hash.array.size_of_element);
- my_hash_free(&spider_hs_w_conn_hash);
-error_hs_w_conn_hash_init:
- spider_free_mem_calc(NULL,
- spider_hs_r_conn_hash_id,
- spider_hs_r_conn_hash.array.max_element *
- spider_hs_r_conn_hash.array.size_of_element);
- my_hash_free(&spider_hs_r_conn_hash);
-error_hs_r_conn_hash_init:
-#endif
spider_free_mem_calc(NULL,
spider_open_connections_id,
spider_open_connections.array.max_element *
@@ -7890,12 +7403,6 @@ error_mem_calc_mutex_init:
error_mon_table_cache_mutex_init:
pthread_mutex_destroy(&spider_allocated_thds_mutex);
error_allocated_thds_mutex_init:
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- pthread_mutex_destroy(&spider_hs_w_conn_mutex);
-error_hs_w_conn_mutex_init:
- pthread_mutex_destroy(&spider_hs_r_conn_mutex);
-error_hs_r_conn_mutex_init:
-#endif
pthread_mutex_destroy(&spider_open_conn_mutex);
error_open_conn_mutex_init:
pthread_mutex_destroy(&spider_conn_mutex);
@@ -7972,6 +7479,12 @@ char *spider_create_table_name_string(
}
#ifdef WITH_PARTITION_STORAGE_ENGINE
+/*
+ Get the target partition_elements.
+
+ The target partition and subpartition are detected by the table name,
+ which is in the form like "t1#P#pt1".
+*/
void spider_get_partition_info(
const char *table_name,
uint table_name_length,
@@ -8521,113 +8034,6 @@ bool spider_check_pk_update(
DBUG_RETURN(FALSE);
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-bool spider_check_hs_pk_update(
- ha_spider *spider,
- key_range *key
-) {
- uint roop_count, field_index, set_count = 0;
- TABLE *table = spider->get_table();
- TABLE_SHARE *table_share = table->s;
- SPIDER_SHARE *share = spider->share;
- KEY *key_info;
- KEY_PART_INFO *key_part;
- char buf[MAX_FIELD_WIDTH], buf2[MAX_FIELD_WIDTH];
- spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin),
- tmp_str2(buf2, MAX_FIELD_WIDTH, &my_charset_bin);
- String *str, *str2;
- DBUG_ENTER("spider_check_hs_pk_update");
- tmp_str.init_calc_mem(137);
-
- if (table_share->primary_key == MAX_KEY)
- DBUG_RETURN(FALSE);
- memset(spider->tmp_column_bitmap, 0, sizeof(uchar) * share->bitmap_size);
- key_info = &table->key_info[table_share->primary_key];
- key_part = key_info->key_part;
- for (roop_count = 0; roop_count < spider_user_defined_key_parts(key_info);
- roop_count++)
- {
- field_index = key_part[roop_count].field->field_index;
- if (bitmap_is_set(table->write_set, field_index))
- {
- DBUG_PRINT("info", ("spider set key_part=%u field_index=%u",
- roop_count, field_index));
- spider_set_bit(spider->tmp_column_bitmap, field_index);
- set_count++;
- }
- }
- DBUG_PRINT("info", ("spider set_count=%u", set_count));
-
- Field *field;
- uint store_length, length, var_len;
- const uchar *ptr;
- bool key_eq;
- key_part_map tgt_key_part_map = key->keypart_map;
- key_info = &table->key_info[spider->active_index];
- for (
- key_part = key_info->key_part,
- length = 0;
- tgt_key_part_map;
- length += store_length,
- tgt_key_part_map >>= 1,
- key_part++
- ) {
- store_length = key_part->store_length;
- field = key_part->field;
- field_index = field->field_index;
- if (spider_bit_is_set(spider->tmp_column_bitmap, field_index))
- {
- ptr = key->key + length;
- key_eq = (tgt_key_part_map > 1);
- if (key_part->null_bit && *ptr++)
- {
- if (key->flag != HA_READ_KEY_EXACT || !field->is_null())
- {
- DBUG_PRINT("info", ("spider flag=%u is_null=%s",
- key->flag, field->is_null() ? "TRUE" : "FALSE"));
- DBUG_RETURN(TRUE);
- }
- } else {
- if (
- field->type() == MYSQL_TYPE_BLOB ||
- field->real_type() == MYSQL_TYPE_VARCHAR ||
- field->type() == MYSQL_TYPE_GEOMETRY
- ) {
- var_len = uint2korr(ptr);
- tmp_str.set((char *) ptr + HA_KEY_BLOB_LENGTH, var_len,
- &my_charset_bin);
- str = tmp_str.get_str();
- } else {
- str = field->val_str(tmp_str.get_str(), ptr);
- tmp_str.mem_calc();
- }
- str2 = field->val_str(tmp_str2.get_str());
- tmp_str2.mem_calc();
- if (
- str->length() != str2->length() ||
- memcmp(str->ptr(), str2->ptr(), str->length())
- ) {
- DBUG_PRINT("info", ("spider length=%u %u",
- str->length(), str2->length()));
- DBUG_PRINT("info", ("spider length=%s %s",
- str->c_ptr_safe(), str2->c_ptr_safe()));
- DBUG_RETURN(TRUE);
- }
- }
- set_count--;
- }
- }
- DBUG_PRINT("info", ("spider set_count=%u", set_count));
- if (set_count)
- {
- DBUG_RETURN(TRUE);
- }
- DBUG_RETURN(FALSE);
-}
-#endif
-#endif
-
void spider_set_tmp_share_pointer(
SPIDER_SHARE *tmp_share,
char **tmp_connect_info,
@@ -8659,10 +8065,6 @@ void spider_set_tmp_share_pointer(
tmp_share->tgt_pk_names = &tmp_connect_info[18];
tmp_share->tgt_sequence_names = &tmp_connect_info[19];
tmp_share->static_link_ids = &tmp_connect_info[20];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->hs_read_socks = &tmp_connect_info[21];
- tmp_share->hs_write_socks = &tmp_connect_info[22];
-#endif
tmp_share->tgt_ports = &tmp_long[0];
tmp_share->tgt_ssl_vscs = &tmp_long[1];
tmp_share->link_statuses = &tmp_long[2];
@@ -8673,13 +8075,6 @@ void spider_set_tmp_share_pointer(
tmp_share->monitoring_bg_flag = &tmp_long[6];
tmp_share->monitoring_bg_kind = &tmp_long[7];
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->use_hs_reads = &tmp_long[8];
- tmp_share->use_hs_writes = &tmp_long[9];
- tmp_share->hs_read_ports = &tmp_long[10];
- tmp_share->hs_write_ports = &tmp_long[11];
- tmp_share->hs_write_to_reads = &tmp_long[12];
-#endif
tmp_share->use_handlers = &tmp_long[13];
tmp_share->connect_timeouts = &tmp_long[14];
tmp_long[13] = -1;
@@ -8716,10 +8111,6 @@ void spider_set_tmp_share_pointer(
tmp_share->tgt_pk_names_lengths = &tmp_connect_info_length[18];
tmp_share->tgt_sequence_names_lengths = &tmp_connect_info_length[19];
tmp_share->static_link_ids_lengths = &tmp_connect_info_length[20];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->hs_read_socks_lengths = &tmp_connect_info_length[21];
- tmp_share->hs_write_socks_lengths = &tmp_connect_info_length[22];
-#endif
tmp_share->server_names_length = 1;
tmp_share->tgt_table_names_length = 1;
tmp_share->tgt_dbs_length = 1;
@@ -8756,15 +8147,6 @@ void spider_set_tmp_share_pointer(
#ifndef WITHOUT_SPIDER_BG_SEARCH
tmp_share->monitoring_bg_interval_length = 1;
#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->hs_read_socks_length = 1;
- tmp_share->hs_write_socks_length = 1;
- tmp_share->use_hs_reads_length = 1;
- tmp_share->use_hs_writes_length = 1;
- tmp_share->hs_read_ports_length = 1;
- tmp_share->hs_write_ports_length = 1;
- tmp_share->hs_write_to_reads_length = 1;
-#endif
tmp_share->use_handlers_length = 1;
tmp_share->connect_timeouts_length = 1;
tmp_share->net_read_timeouts_length = 1;
@@ -8787,9 +8169,6 @@ void spider_set_tmp_share_pointer(
tmp_share->monitoring_sid[0] = -1;
tmp_share->bka_engine = NULL;
tmp_share->use_dbton_count = 0;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- tmp_share->use_hs_dbton_count = 0;
-#endif
DBUG_VOID_RETURN;
}
@@ -8972,26 +8351,17 @@ longlong spider_split_read_param(
#ifdef SPIDER_HAS_GROUP_BY_HANDLER
bool inserting =
(
-#ifdef HS_HAS_SQLCOM
- spider->wide_handler->sql_command == SQLCOM_HS_INSERT ||
-#endif
spider->wide_handler->sql_command == SQLCOM_INSERT ||
spider->wide_handler->sql_command == SQLCOM_INSERT_SELECT
);
#endif
bool updating =
(
-#ifdef HS_HAS_SQLCOM
- spider->wide_handler->sql_command == SQLCOM_HS_UPDATE ||
-#endif
spider->wide_handler->sql_command == SQLCOM_UPDATE ||
spider->wide_handler->sql_command == SQLCOM_UPDATE_MULTI
);
bool deleting =
(
-#ifdef HS_HAS_SQLCOM
- spider->wide_handler->sql_command == SQLCOM_HS_DELETE ||
-#endif
spider->wide_handler->sql_command == SQLCOM_DELETE ||
spider->wide_handler->sql_command == SQLCOM_DELETE_MULTI
);
@@ -10080,10 +9450,6 @@ int spider_create_spider_object_for_share(
uint *conn_link_idx;
uchar *conn_can_fo;
char **conn_keys;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- char **hs_r_conn_keys;
- char **hs_w_conn_keys;
-#endif
spider_db_handler **dbton_hdl;
SPIDER_WIDE_HANDLER *wide_handler;
DBUG_ENTER("spider_create_spider_object_for_share");
@@ -10104,7 +9470,6 @@ int spider_create_spider_object_for_share(
goto error_spider_alloc;
}
DBUG_PRINT("info",("spider spider=%p", (*spider)));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
if (!(need_mons = (int *)
spider_bulk_malloc(spider_current_trx, 255, MYF(MY_WME | MY_ZEROFILL),
&need_mons, (uint) (sizeof(int) * share->link_count),
@@ -10112,25 +9477,10 @@ int spider_create_spider_object_for_share(
&conn_link_idx, (uint) (sizeof(uint) * share->link_count),
&conn_can_fo, (uint) (sizeof(uchar) * share->link_bitmap_size),
&conn_keys, (uint) (sizeof(char *) * share->link_count),
- &hs_r_conn_keys, (uint) (sizeof(char *) * share->link_count),
- &hs_w_conn_keys, (uint) (sizeof(char *) * share->link_count),
&dbton_hdl, (uint) (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE),
&wide_handler, (uint) sizeof(SPIDER_WIDE_HANDLER),
NullS))
)
-#else
- if (!(need_mons = (int *)
- spider_bulk_malloc(spider_current_trx, 255, MYF(MY_WME | MY_ZEROFILL),
- &need_mons, (uint) (sizeof(int) * share->link_count),
- &conns, (uint) (sizeof(SPIDER_CONN *) * share->link_count),
- &conn_link_idx, (uint) (sizeof(uint) * share->link_count),
- &conn_can_fo, (uint) (sizeof(uchar) * share->link_bitmap_size),
- &conn_keys, (uint) (sizeof(char *) * share->link_count),
- &dbton_hdl, (uint) (sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE),
- &wide_handler, (uint) sizeof(SPIDER_WIDE_HANDLER),
- NullS))
- )
-#endif
{
error_num = HA_ERR_OUT_OF_MEM;
goto error_need_mons_alloc;
@@ -10146,10 +9496,6 @@ int spider_create_spider_object_for_share(
(*spider)->need_mons = need_mons;
(*spider)->conn_keys_first_ptr = share->conn_keys[0];
(*spider)->conn_keys = conn_keys;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (*spider)->hs_r_conn_keys = hs_r_conn_keys;
- (*spider)->hs_w_conn_keys = hs_w_conn_keys;
-#endif
(*spider)->dbton_handler = dbton_hdl;
(*spider)->search_link_idx = -1;
for (roop_count = 0; roop_count < SPIDER_DBTON_SIZE; roop_count++)
diff --git a/storage/spider/spd_table.h b/storage/spider/spd_table.h
index 6952dd3e4ea..c55e016c988 100644
--- a/storage/spider/spd_table.h
+++ b/storage/spider/spd_table.h
@@ -641,15 +641,6 @@ bool spider_check_pk_update(
TABLE *table
);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
-bool spider_check_hs_pk_update(
- ha_spider *spider,
- key_range *key
-);
-#endif
-#endif
-
void spider_set_tmp_share_pointer(
SPIDER_SHARE *tmp_share,
char **tmp_connect_info,
diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc
index 9e7469df134..dac9b728e97 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -1200,30 +1200,6 @@ int spider_free_trx_alloc(
trx->trx_another_conn_hash.array.max_element *
trx->trx_another_conn_hash.array.size_of_element);
my_hash_free(&trx->trx_another_conn_hash);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider_free_mem_calc(spider_current_trx,
- trx->trx_direct_hs_r_conn_hash_id,
- trx->trx_direct_hs_r_conn_hash.array.max_element *
- trx->trx_direct_hs_r_conn_hash.array.size_of_element);
- my_hash_free(&trx->trx_direct_hs_r_conn_hash);
- spider_free_mem_calc(spider_current_trx,
- trx->trx_direct_hs_w_conn_hash_id,
- trx->trx_direct_hs_w_conn_hash.array.max_element *
- trx->trx_direct_hs_w_conn_hash.array.size_of_element);
- my_hash_free(&trx->trx_direct_hs_w_conn_hash);
-#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider_free_mem_calc(spider_current_trx,
- trx->trx_hs_r_conn_hash_id,
- trx->trx_hs_r_conn_hash.array.max_element *
- trx->trx_hs_r_conn_hash.array.size_of_element);
- my_hash_free(&trx->trx_hs_r_conn_hash);
- spider_free_mem_calc(spider_current_trx,
- trx->trx_hs_w_conn_hash_id,
- trx->trx_hs_w_conn_hash.array.max_element *
- trx->trx_hs_w_conn_hash.array.size_of_element);
- my_hash_free(&trx->trx_hs_w_conn_hash);
-#endif
spider_free_mem_calc(spider_current_trx,
trx->trx_ha_hash_id,
trx->trx_ha_hash.array.max_element *
@@ -1310,58 +1286,6 @@ SPIDER_TRX *spider_get_trx(
trx->trx_another_conn_hash.array.max_element *
trx->trx_another_conn_hash.array.size_of_element);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (
- my_hash_init(&trx->trx_hs_r_conn_hash, spd_charset_utf8mb3_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0)
- )
- goto error_hs_r_init_hash;
- spider_alloc_calc_mem_init(trx->trx_hs_r_conn_hash, 153);
- spider_alloc_calc_mem(
- thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
- trx->trx_hs_r_conn_hash,
- trx->trx_hs_r_conn_hash.array.max_element *
- trx->trx_hs_r_conn_hash.array.size_of_element);
-
- if (
- my_hash_init(&trx->trx_hs_w_conn_hash, spd_charset_utf8mb3_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0)
- )
- goto error_hs_w_init_hash;
- spider_alloc_calc_mem_init(trx->trx_hs_w_conn_hash, 154);
- spider_alloc_calc_mem(
- thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
- trx->trx_hs_w_conn_hash,
- trx->trx_hs_w_conn_hash.array.max_element *
- trx->trx_hs_w_conn_hash.array.size_of_element);
-#endif
-
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (
- my_hash_init(&trx->trx_direct_hs_r_conn_hash, spd_charset_utf8mb3_bin, 32,
- 0, 0, (my_hash_get_key) spider_conn_get_key, 0, 0)
- )
- goto error_direct_hs_r_init_hash;
- spider_alloc_calc_mem_init(trx->trx_direct_hs_r_conn_hash, 155);
- spider_alloc_calc_mem(
- thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
- trx->trx_direct_hs_r_conn_hash,
- trx->trx_direct_hs_r_conn_hash.array.max_element *
- trx->trx_direct_hs_r_conn_hash.array.size_of_element);
-
- if (
- my_hash_init(&trx->trx_direct_hs_w_conn_hash, spd_charset_utf8mb3_bin, 32,
- 0, 0, (my_hash_get_key) spider_conn_get_key, 0, 0)
- )
- goto error_direct_hs_w_init_hash;
- spider_alloc_calc_mem_init(trx->trx_direct_hs_w_conn_hash, 156);
- spider_alloc_calc_mem(
- thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
- trx->trx_direct_hs_w_conn_hash,
- trx->trx_direct_hs_w_conn_hash.array.max_element *
- trx->trx_direct_hs_w_conn_hash.array.size_of_element);
-#endif
-
if (
my_hash_init(PSI_INSTRUMENT_ME, &trx->trx_alter_table_hash,
spd_charset_utf8mb3_bin, 32, 0, 0, (my_hash_get_key)
@@ -1401,10 +1325,6 @@ SPIDER_TRX *spider_get_trx(
++spider_thread_id;
pthread_mutex_unlock(&spider_thread_id_mutex);
trx->trx_conn_adjustment = 1;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- trx->trx_hs_r_conn_adjustment = 1;
- trx->trx_hs_w_conn_adjustment = 1;
-#endif
if (thd)
{
@@ -1558,38 +1478,6 @@ error_init_trx_ha_hash:
trx->trx_alter_table_hash.array.size_of_element);
my_hash_free(&trx->trx_alter_table_hash);
error_init_alter_hash:
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider_free_mem_calc(
- thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
- trx->trx_direct_hs_w_conn_hash_id,
- trx->trx_direct_hs_w_conn_hash.array.max_element *
- trx->trx_direct_hs_w_conn_hash.array.size_of_element);
- my_hash_free(&trx->trx_direct_hs_w_conn_hash);
-error_direct_hs_w_init_hash:
- spider_free_mem_calc(
- thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
- trx->trx_direct_hs_r_conn_hash_id,
- trx->trx_direct_hs_r_conn_hash.array.max_element *
- trx->trx_direct_hs_r_conn_hash.array.size_of_element);
- my_hash_free(&trx->trx_direct_hs_r_conn_hash);
-error_direct_hs_r_init_hash:
-#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider_free_mem_calc(
- thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
- trx->trx_hs_w_conn_hash_id,
- trx->trx_hs_w_conn_hash.array.max_element *
- trx->trx_hs_w_conn_hash.array.size_of_element);
- my_hash_free(&trx->trx_hs_w_conn_hash);
-error_hs_w_init_hash:
- spider_free_mem_calc(
- thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
- trx->trx_hs_r_conn_hash_id,
- trx->trx_hs_r_conn_hash.array.max_element *
- trx->trx_hs_r_conn_hash.array.size_of_element);
- my_hash_free(&trx->trx_hs_r_conn_hash);
-error_hs_r_init_hash:
-#endif
spider_free_mem_calc(
thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL,
trx->trx_another_conn_hash_id,
@@ -3773,28 +3661,6 @@ int spider_check_trx_and_get_conn(
if (!trx_ha || trx_ha->wait_for_reusing)
spider_trx_set_link_idx_for_all(spider);
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (use_conn_kind)
- {
- for (roop_count = 0; roop_count < (int) share->link_count; roop_count++)
- {
- if (
-/*
- spider->conn_kind[roop_count] != SPIDER_CONN_KIND_MYSQL &&
-*/
- share->hs_dbton_ids[spider->conn_link_idx[roop_count]] ==
- SPIDER_DBTON_SIZE
- ) {
- /* can't use hs interface */
- spider->conn_kind[roop_count] = SPIDER_CONN_KIND_MYSQL;
- spider_clear_bit(spider->do_hs_direct_update, roop_count);
- }
- }
- }
-#endif
-#endif
-
if (semi_table_lock_conn)
first_byte = '0' +
spider_param_semi_table_lock(thd, share->semi_table_lock);
@@ -3810,14 +3676,6 @@ int spider_check_trx_and_get_conn(
trx_ha->wait_for_reusing ||
trx->spider_thread_id != spider->spider_thread_id ||
trx->trx_conn_adjustment != spider->trx_conn_adjustment ||
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (use_conn_kind &&
- (
- trx->trx_hs_r_conn_adjustment != spider->trx_hs_r_conn_adjustment ||
- trx->trx_hs_w_conn_adjustment != spider->trx_hs_w_conn_adjustment
- )
- ) ||
-#endif
first_byte != *spider->conn_keys[0] ||
share->link_statuses[spider->conn_link_idx[spider->search_link_idx]] ==
SPIDER_LINK_STATUS_NG
@@ -3827,13 +3685,6 @@ int spider_check_trx_and_get_conn(
"spider change thd" : "spider next trx"));
spider->wide_handler->trx = trx;
spider->trx_conn_adjustment = trx->trx_conn_adjustment;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (use_conn_kind)
- {
- spider->trx_hs_r_conn_adjustment = trx->trx_hs_r_conn_adjustment;
- spider->trx_hs_w_conn_adjustment = trx->trx_hs_w_conn_adjustment;
- }
-#endif
if (
spider->spider_thread_id != trx->spider_thread_id ||
spider->search_link_query_id != thd->query_id
@@ -3878,12 +3729,6 @@ int spider_check_trx_and_get_conn(
{
if (!spider->handler_opened(roop_count, SPIDER_CONN_KIND_MYSQL))
spider->conns[roop_count] = NULL;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (!spider->handler_opened(roop_count, SPIDER_CONN_KIND_HS_READ))
- spider->hs_r_conns[roop_count] = NULL;
- if (!spider->handler_opened(roop_count, SPIDER_CONN_KIND_HS_WRITE))
- spider->hs_w_conns[roop_count] = NULL;
-#endif
}
bool search_link_idx_is_checked = FALSE;
for (
@@ -3900,18 +3745,8 @@ int spider_check_trx_and_get_conn(
if (roop_count == spider->search_link_idx)
search_link_idx_is_checked = TRUE;
if (
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- (
-#endif
tgt_conn_kind == SPIDER_CONN_KIND_MYSQL &&
!spider->conns[roop_count]
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- ) ||
- (tgt_conn_kind == SPIDER_CONN_KIND_HS_READ &&
- !spider->hs_r_conns[roop_count]) ||
- (tgt_conn_kind == SPIDER_CONN_KIND_HS_WRITE &&
- !spider->hs_w_conns[roop_count])
-#endif
) {
*spider->conn_keys[roop_count] = first_byte;
if (
@@ -3951,51 +3786,6 @@ int spider_check_trx_and_get_conn(
}
conn->error_mode &= spider->error_mode;
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (
- spider->do_direct_update &&
- spider_bit_is_set(spider->do_hs_direct_update, roop_count) &&
- !spider->hs_w_conns[roop_count]
- ) {
- if (
- !(conn =
- spider_get_conn(share, roop_count,
- spider->conn_keys[roop_count], trx,
- spider, FALSE, TRUE,
- SPIDER_CONN_KIND_HS_WRITE,
- &error_num))
- ) {
- if (
- share->monitoring_kind[roop_count] &&
- spider->need_mons[roop_count]
- ) {
- error_num = spider_ping_table_mon_from_table(
- trx,
- trx->thd,
- share,
- roop_count,
- (uint32) share->monitoring_sid[roop_count],
- share->table_name,
- share->table_name_length,
- spider->conn_link_idx[roop_count],
- NULL,
- 0,
- share->monitoring_kind[roop_count],
- share->monitoring_limit[roop_count],
- share->monitoring_flag[roop_count],
- TRUE
- );
- }
- DBUG_PRINT("info",("spider get conn error"));
- *spider->conn_keys[0] = first_byte_bak;
- spider->spider_thread_id = 0;
- DBUG_RETURN(error_num);
- }
- conn->error_mode &= spider->error_mode;
- }
-#endif
-#endif
}
if (!search_link_idx_is_checked)
{
@@ -4034,21 +3824,8 @@ int spider_check_trx_and_get_conn(
) {
if (roop_count == spider->search_link_idx)
search_link_idx_is_checked = TRUE;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (
- !use_conn_kind ||
- spider->conn_kind[roop_count] == SPIDER_CONN_KIND_MYSQL
- ) {
-#endif
- conn = spider->conns[roop_count];
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- } else if (spider->conn_kind[roop_count] == SPIDER_CONN_KIND_HS_READ)
- {
- conn = spider->hs_r_conns[roop_count];
- } else {
- conn = spider->hs_w_conns[roop_count];
- }
-#endif
+
+ conn= spider->conns[roop_count];
if (!conn)
{
@@ -4088,53 +3865,6 @@ int spider_check_trx_and_get_conn(
}
}
conn->error_mode &= spider->error_mode;
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
-#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
- if (
- spider->do_direct_update &&
- spider_bit_is_set(spider->do_hs_direct_update, roop_count)
- ) {
- conn = spider->hs_w_conns[roop_count];
- if (!conn)
- {
- DBUG_PRINT("info",("spider get hs_w_conn %d", roop_count));
- if (
- !(conn =
- spider_get_conn(share, roop_count,
- spider->conn_keys[roop_count], trx,
- spider, FALSE, TRUE,
- SPIDER_CONN_KIND_HS_WRITE,
- &error_num))
- ) {
- if (
- share->monitoring_kind[roop_count] &&
- spider->need_mons[roop_count]
- ) {
- error_num = spider_ping_table_mon_from_table(
- trx,
- trx->thd,
- share,
- roop_count,
- (uint32) share->monitoring_sid[roop_count],
- share->table_name,
- share->table_name_length,
- spider->conn_link_idx[roop_count],
- NULL,
- 0,
- share->monitoring_kind[roop_count],
- share->monitoring_limit[roop_count],
- share->monitoring_flag[roop_count],
- TRUE
- );
- }
- DBUG_PRINT("info",("spider get conn error"));
- DBUG_RETURN(error_num);
- }
- }
- }
- conn->error_mode &= spider->error_mode;
-#endif
-#endif
}
if (!search_link_idx_is_checked)
{
@@ -4390,20 +4120,6 @@ void spider_trx_set_link_idx_for_all(
share->conn_keys[0]), char*);
DBUG_PRINT("info",("spider conn_keys[%d]=%s",
roop_count, spider->conn_keys[roop_count]));
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- spider->hs_r_conn_keys[roop_count] =
- ADD_TO_PTR(spider->conn_keys_first_ptr,
- PTR_BYTE_DIFF(share->hs_read_conn_keys[conn_link_idx[roop_count]],
- share->conn_keys[0]), char*);
- DBUG_PRINT("info",("spider hs_r_conn_keys[%d]=%s",
- roop_count, spider->hs_r_conn_keys[roop_count]));
- spider->hs_w_conn_keys[roop_count] =
- ADD_TO_PTR(spider->conn_keys_first_ptr,
- PTR_BYTE_DIFF(share->hs_write_conn_keys[conn_link_idx[roop_count]],
- share->conn_keys[0]), char*);
- DBUG_PRINT("info",("spider hs_w_conn_keys[%d]=%s",
- roop_count, spider->hs_w_conn_keys[roop_count]));
-#endif
}
DBUG_VOID_RETURN;
}
diff --git a/strings/CMakeLists.txt b/strings/CMakeLists.txt
index 0e62f9e34ad..54612256adc 100644
--- a/strings/CMakeLists.txt
+++ b/strings/CMakeLists.txt
@@ -23,7 +23,7 @@ SET(STRINGS_SOURCES bchange.c bmove_upp.c ctype-big5.c ctype-bin.c ctype-cp932.c
str2int.c strcend.c strend.c strfill.c strmake.c strmov.c strnmov.c
strxmov.c strxnmov.c xml.c
strmov_overlapp.c
- my_strchr.c strcont.c strappend.c json_lib.c)
+ my_strchr.c strcont.c strappend.c json_lib.c json_normalize.c)
IF(NOT HAVE_STRNLEN)
# OSX below 10.7 did not have strnlen
diff --git a/strings/ctype-ascii.h b/strings/ctype-ascii.h
new file mode 100644
index 00000000000..540d01b1a0d
--- /dev/null
+++ b/strings/ctype-ascii.h
@@ -0,0 +1,189 @@
+#ifndef CTYPE_ASCII_INCLUDED
+#define CTYPE_ASCII_INCLUDED
+
+#include "myisampack.h"
+
+/*
+ Magic expression. It uses the fact that for any byte value X in
+ the range 0..31 (0x00..0x1F) the expression (X+31)*5 returns
+ the 7th bit (0x80) set only for the following six (out of 32) values:
+ 0x00, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F.
+ These values correspond to offsets of non-letter characters
+ in the ASCII table:
+
+ The following macro sets the bit 0x20 for the following characters:
+ ---------------- --------------------------------
+ Magic bit 10000000000000000000000000011111
+ ASCII 0x00..0x1F ................................ Control
+ ASCII 0x20..0x3F ................................ Punctuation, digits
+ ASCII 0x40..0x5F @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
+ ASCII 0x60..0x7F `abcdefghijklmnopqrstuvwxyz{|}~.
+ ---------------- --------------------------------
+ We shift the magic bit 0x80 right twice to make it 0x20.
+ So on the ranges [40..5F] and [60..7F] the expression
+ has the bit 0x20 set for all non-letter characters.
+ Note, other bits contain garbage.
+
+ Requirements:
+ All bytes must be in the range [00..7F],
+ to avoid overflow and carry to the next byte.
+*/
+#define MY_ASCII_20_IS_SET_IF_NOT_LETTER_MAGIC(i) \
+ (((((i)+0x1F1F1F1F1F1F1F1FULL) & 0x1F1F1F1F1F1F1F1F) * 5) >> 2)
+
+
+/*
+ The following macro returns the bit 0x20 set to:
+ - 1 for input bytes in the ranges [60..7F] or [E0..FF]
+ - 0 otherwise
+ Bytes in the ranges [40..7F] and [C0..FF] have the bit 0x40 set.
+ Bytes in the ranges [60..7F] and [E0..FF] have the bit 0x20 set.
+ Hex BinHi BinLo
+ ---- -1-- ----
+ 0x[4C]X .10. ....
+ 0x[5D]X .10. ....
+ 0x[6E]X .11. ....
+ 0x[7F]X .11. ....
+*/
+#define MY_ASCII_20_IS_SET_IF_RANGE_60_7F_OR_E0_FF(i) (((i) >> 1) & ((i)))
+
+
+/*
+ The following macro evaluates to exactly 0x20 for all
+ lower case ASCII letters [a-z], and to 0x00 otherwise:
+
+ Value Range Character range Subrange
+ -------- -------- -------------------------------- -------
+ 00000000 0x00..0x3F Control, punctuation, digits
+ 00100000 0x40..0x5F @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ letters A-Z
+ 00000000 0x40..0x5F @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ non-letters
+ 00100000 0x60..0x7F `abcdefghijklmnopqrstuvwxyz{|}~. letters a-z
+ 00000000 0x60..0x7F `abcdefghijklmnopqrstuvwxyz{|}~. non-letters
+
+ Requirements:
+ All bytes must be in the range [00..7F].
+ See the comments in MY_ASCII_20_IS_SET_IF_NOT_LETTER_MAGIC().
+*/
+
+#define MY_ASCII_20_IF_IS_LOWER_LETTER(i) \
+ (MY_ASCII_20_IS_SET_IF_RANGE_60_7F_OR_E0_FF(i) & \
+ ~MY_ASCII_20_IS_SET_IF_NOT_LETTER_MAGIC(i) & \
+ 0x2020202020202020)
+
+/*
+ Convert lower case ASCII letters to upper case by unsetting
+ the bit 0x20 with help of the magic expression.
+
+ Requirements:
+ All bytes must be in the range [00..7F].
+ See the comments in MY_ASCII_20_IS_SET_IF_NOT_LETTER_MAGIC()
+*/
+#define MY_ASCII_TOUPPER_MAGIC(i) \
+ (i ^ MY_ASCII_20_IF_IS_LOWER_LETTER(i))
+
+
+/*
+ Convert a string (consisting of 8 bytes stored in uint64)
+ to upper case algorithmically.
+
+ Requirements:
+ All bytes must be in the range [00..0x7F].
+ See the comments in MY_ASCII_20_IS_SET_IF_NOT_LETTER_MAGIC().
+ The result on 8bit data is unpredictable!!!
+ The caller should make sure not to pass 8bit data.
+*/
+static inline ulonglong my_ascii_to_upper_magic_uint64(ulonglong i)
+{
+ return MY_ASCII_TOUPPER_MAGIC(i);
+}
+
+
+/*
+ Check if:
+ - both strings "a" and "b" have at least 4 bytes, and
+ - both strings have only 7bit data.
+*/
+static inline int
+my_strcoll_ascii_4bytes_found(const uchar *a, const uchar *ae,
+ const uchar *b, const uchar *be)
+{
+ return a + 4 <= ae && b + 4 <= be &&
+ (uint4korr(b) & 0x80808080) == 0 &&
+ (uint4korr(a) & 0x80808080) == 0;
+}
+
+
+/*
+ Compare the leading four 7bit ASCII bytes in two strings case insensitively
+ by converting letters [a-z] to upper case [A-Z].
+
+ Requirements:
+ - The input strings must have at least four bytes, and
+ - The leading four bytes in both strings must be 7bit ASCII.
+ The caller must make sure to provide only strings that meet
+ these requirements. The result on 8-bit data is unpredictable
+ as 8-bit bytes may cause overflow in my_ascii_to_upper_magic_uint64().
+ See comments above.
+*/
+static inline int
+my_strcoll_ascii_toupper_4bytes(const uchar *a, const uchar *b)
+{
+ ulonglong abn= (((ulonglong) mi_uint4korr(a)) << 32) | mi_uint4korr(b);
+ abn= my_ascii_to_upper_magic_uint64(abn);
+ if ((uint32) (abn >> 32) == (uint32) abn)
+ return 0;
+ return ((uint32) (abn >> 32)) < ((uint32) abn) ? -1 : + 1;
+}
+
+
+/*
+ Compare the leading eight 7bit ASCII bytes in two strings case insensitively
+ by converting letters [a-z] to upper case [A-Z].
+
+ Requirements:
+ - The input strings must have at least eight bytes, and
+ - The leading eight bytes in both strings must be 7bit ASCII.
+ See comments in my_strcoll_ascii_toupper_4bytes().
+*/
+static inline int
+my_strcoll_ascii_toupper_8bytes(const uchar *a, const uchar *b)
+{
+ /*
+ TODO:
+ Try to get advantage of SIMD instructions by massive comparison
+ (16 bytes at a time) of characters against (x>='a' && x<='z') using:
+ - either explicit intrinsics
+ - or a loop that can get vectorized automatically by some compilers.
+ */
+ ulonglong an= mi_uint8korr(a);
+ ulonglong bn= mi_uint8korr(b);
+ an= my_ascii_to_upper_magic_uint64(an);
+ bn= my_ascii_to_upper_magic_uint64(bn);
+ return an == bn ? 0 : an < bn ? -1 : +1;
+}
+
+
+/*
+ Compare the leading four 7bit ASCII bytes in two strings in binary style.
+*/
+static inline int
+my_strcoll_mb7_bin_4bytes(const uchar *a, const uchar *b)
+{
+ uint32 an= mi_uint4korr(a);
+ uint32 bn= mi_uint4korr(b);
+ return an == bn ? 0 : an < bn ? -1 : +1;
+}
+
+
+/*
+ Compare the leading four 7bit ASCII bytes in two strings in binary style.
+*/
+static inline int
+my_strcoll_mb7_bin_8bytes(const uchar *a, const uchar *b)
+{
+ ulonglong an= mi_uint8korr(a);
+ ulonglong bn= mi_uint8korr(b);
+ return an == bn ? 0 : an < bn ? -1 : +1;
+}
+
+#endif /* CTYPE_ASCII_INCLUDED */
diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c
index d66a2bf8593..2491a5ff7ed 100644
--- a/strings/ctype-big5.c
+++ b/strings/ctype-big5.c
@@ -6691,6 +6691,7 @@ my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)),
#define MY_FUNCTION_NAME(x) my_ ## x ## _big5_bin
#define WEIGHT_MB1(x) ((uchar) (x))
#define WEIGHT_MB2(x,y) (big5code(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -6707,6 +6708,7 @@ my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)),
#define MY_FUNCTION_NAME(x) my_ ## x ## _big5_nopad_bin
#define WEIGHT_MB1(x) ((uchar) (x))
#define WEIGHT_MB2(x,y) (big5code(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
diff --git a/strings/ctype-cp932.c b/strings/ctype-cp932.c
index 9971750ca1c..af3de05509d 100644
--- a/strings/ctype-cp932.c
+++ b/strings/ctype-cp932.c
@@ -34639,6 +34639,7 @@ size_t my_numcells_cp932(CHARSET_INFO *cs __attribute__((unused)),
#define WEIGHT_PAD_SPACE (256 * (int) ' ')
#define WEIGHT_MB1(x) (256 * (int) sort_order_cp932[(uchar) (x)])
#define WEIGHT_MB2(x,y) (cp932code(x, y))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -34646,6 +34647,7 @@ size_t my_numcells_cp932(CHARSET_INFO *cs __attribute__((unused)),
#define WEIGHT_PAD_SPACE (256 * (int) ' ')
#define WEIGHT_MB1(x) (256 * (int) (uchar) (x))
#define WEIGHT_MB2(x,y) (cp932code(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -34654,6 +34656,7 @@ size_t my_numcells_cp932(CHARSET_INFO *cs __attribute__((unused)),
#define WEIGHT_PAD_SPACE (256 * (int) ' ')
#define WEIGHT_MB1(x) (256 * (int) sort_order_cp932[(uchar) (x)])
#define WEIGHT_MB2(x,y) (cp932code(x, y))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -34662,6 +34665,7 @@ size_t my_numcells_cp932(CHARSET_INFO *cs __attribute__((unused)),
#define WEIGHT_PAD_SPACE (256 * (int) ' ')
#define WEIGHT_MB1(x) (256 * (int) (uchar) (x))
#define WEIGHT_MB2(x,y) (cp932code(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c
index 4d159b29494..1f62ebaf636 100644
--- a/strings/ctype-euc_kr.c
+++ b/strings/ctype-euc_kr.c
@@ -9932,12 +9932,14 @@ my_mb_wc_euc_kr(CHARSET_INFO *cs __attribute__((unused)),
#define MY_FUNCTION_NAME(x) my_ ## x ## _euckr_korean_ci
#define WEIGHT_MB1(x) (sort_order_euc_kr[(uchar) (x)])
#define WEIGHT_MB2(x,y) (euckrcode(x, y))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
#define MY_FUNCTION_NAME(x) my_ ## x ## _euckr_bin
#define WEIGHT_MB1(x) ((uchar) (x))
#define WEIGHT_MB2(x,y) (euckrcode(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -9945,6 +9947,7 @@ my_mb_wc_euc_kr(CHARSET_INFO *cs __attribute__((unused)),
#define MY_FUNCTION_NAME(x) my_ ## x ## _euckr_korean_nopad_ci
#define WEIGHT_MB1(x) (sort_order_euc_kr[(uchar) (x)])
#define WEIGHT_MB2(x,y) (euckrcode(x, y))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -9952,6 +9955,7 @@ my_mb_wc_euc_kr(CHARSET_INFO *cs __attribute__((unused)),
#define MY_FUNCTION_NAME(x) my_ ## x ## _euckr_nopad_bin
#define WEIGHT_MB1(x) ((uchar) (x))
#define WEIGHT_MB2(x,y) (euckrcode(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
diff --git a/strings/ctype-eucjpms.c b/strings/ctype-eucjpms.c
index 72b18b5ec76..ed48917e333 100644
--- a/strings/ctype-eucjpms.c
+++ b/strings/ctype-eucjpms.c
@@ -212,6 +212,7 @@ static const uchar sort_order_eucjpms[]=
#define WEIGHT_MB2(x,y) ((((uint) (uchar)(x)) << 16) | \
(((uint) (uchar) (y)) << 8))
#define WEIGHT_MB3(x,y,z) (WEIGHT_MB2(x,y) | ((uint) (uchar) z))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -221,6 +222,7 @@ static const uchar sort_order_eucjpms[]=
#define WEIGHT_MB2(x,y) ((((uint) (uchar)(x)) << 16) | \
(((uint) (uchar) (y)) << 8))
#define WEIGHT_MB3(x,y,z) (WEIGHT_MB2(x,y) | ((uint) (uchar) z))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -231,6 +233,7 @@ static const uchar sort_order_eucjpms[]=
#define WEIGHT_MB2(x,y) ((((uint) (uchar)(x)) << 16) | \
(((uint) (uchar) (y)) << 8))
#define WEIGHT_MB3(x,y,z) (WEIGHT_MB2(x,y) | ((uint) (uchar) z))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -241,6 +244,7 @@ static const uchar sort_order_eucjpms[]=
#define WEIGHT_MB2(x,y) ((((uint) (uchar)(x)) << 16) | \
(((uint) (uchar) (y)) << 8))
#define WEIGHT_MB3(x,y,z) (WEIGHT_MB2(x,y) | ((uint) (uchar) z))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c
index 7b6b0b080f0..dd3581366fe 100644
--- a/strings/ctype-gb2312.c
+++ b/strings/ctype-gb2312.c
@@ -6344,6 +6344,7 @@ my_mb_wc_gb2312(CHARSET_INFO *cs __attribute__((unused)),
#define MY_FUNCTION_NAME(x) my_ ## x ## _gb2312_bin
#define WEIGHT_MB1(x) ((uchar) (x))
#define WEIGHT_MB2(x,y) (gb2312code(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -6358,6 +6359,7 @@ my_mb_wc_gb2312(CHARSET_INFO *cs __attribute__((unused)),
#define MY_FUNCTION_NAME(x) my_ ## x ## _gb2312_nopad_bin
#define WEIGHT_MB1(x) ((uchar) (x))
#define WEIGHT_MB2(x,y) (gb2312code(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c
index 2501c293fb2..2e72d5bd7a4 100644
--- a/strings/ctype-gbk.c
+++ b/strings/ctype-gbk.c
@@ -10625,6 +10625,7 @@ my_mb_wc_gbk(CHARSET_INFO *cs __attribute__((unused)),
#define MY_FUNCTION_NAME(x) my_ ## x ## _gbk_bin
#define WEIGHT_MB1(x) ((uchar) (x))
#define WEIGHT_MB2(x,y) (gbkcode(x,y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -10640,6 +10641,7 @@ my_mb_wc_gbk(CHARSET_INFO *cs __attribute__((unused)),
#define MY_FUNCTION_NAME(x) my_ ## x ## _gbk_nopad_bin
#define WEIGHT_MB1(x) ((uchar) (x))
#define WEIGHT_MB2(x,y) (gbkcode(x,y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c
index 313dfaa8f90..c3e64ce0d11 100644
--- a/strings/ctype-sjis.c
+++ b/strings/ctype-sjis.c
@@ -34027,6 +34027,7 @@ my_wc_to_printable_sjis(CHARSET_INFO *cs, my_wc_t wc,
#define WEIGHT_PAD_SPACE (256 * (int) ' ')
#define WEIGHT_MB1(x) (256 * (int) sort_order_sjis[(uchar) (x)])
#define WEIGHT_MB2(x,y) (sjiscode(x, y))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -34034,6 +34035,7 @@ my_wc_to_printable_sjis(CHARSET_INFO *cs, my_wc_t wc,
#define WEIGHT_PAD_SPACE (256 * (int) ' ')
#define WEIGHT_MB1(x) (256 * (int) (uchar) (x))
#define WEIGHT_MB2(x,y) (sjiscode(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -34042,6 +34044,7 @@ my_wc_to_printable_sjis(CHARSET_INFO *cs, my_wc_t wc,
#define WEIGHT_PAD_SPACE (256 * (int) ' ')
#define WEIGHT_MB1(x) (256 * (int) sort_order_sjis[(uchar) (x)])
#define WEIGHT_MB2(x,y) (sjiscode(x, y))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -34050,6 +34053,7 @@ my_wc_to_printable_sjis(CHARSET_INFO *cs, my_wc_t wc,
#define WEIGHT_PAD_SPACE (256 * (int) ' ')
#define WEIGHT_MB1(x) (256 * (int) (uchar) (x))
#define WEIGHT_MB2(x,y) (sjiscode(x, y))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
diff --git a/strings/ctype-uca-scanner_next.inl b/strings/ctype-uca-scanner_next.inl
index 79d25487b42..acab31f21ef 100644
--- a/strings/ctype-uca-scanner_next.inl
+++ b/strings/ctype-uca-scanner_next.inl
@@ -1,5 +1,5 @@
/* Copyright (c) 2004, 2013, Oracle and/or its affiliates.
- Copyright (c) 2009, 2021, MariaDB
+ Copyright (c) 2009, 2021, MariaDB
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -55,13 +55,8 @@ MY_FUNCTION_NAME(scanner_next)(my_uca_scanner *scanner)
#else
#define LOCAL_MAX_CONTRACTION_LENGTH MY_UCA_MAX_CONTRACTION
#endif
- /*
- Check if the weights for the previous character have been
- already fully scanned. If yes, then get the next character and
- initialize wbeg and wlength to its weight string.
- */
-
- if (scanner->wbeg[0])
+ uint16 weight= my_uca_scanner_next_expansion_weight(scanner);
+ if (weight)
{
/*
More weights left from the previous step.
@@ -69,7 +64,7 @@ MY_FUNCTION_NAME(scanner_next)(my_uca_scanner *scanner)
Return "0" as "nchars". The real nchars was set on a previous
iteration.
*/
- SCANNER_NEXT_RETURN(*scanner->wbeg++, 0);
+ SCANNER_NEXT_RETURN(weight, 0);
}
#ifdef SCANNER_NEXT_NCHARS
@@ -79,39 +74,44 @@ MY_FUNCTION_NAME(scanner_next)(my_uca_scanner *scanner)
#endif
{
const uint16 *wpage;
- my_wc_t wc[MY_UCA_MAX_CONTRACTION];
int mblen;
+ my_wc_t currwc= 0;
+ const uint16 *cweight;
/* Get next character */
#if MY_UCA_ASCII_OPTIMIZE
/* Get next ASCII character */
if (scanner->sbeg < scanner->send && scanner->sbeg[0] < 0x80)
{
- wc[0]= scanner->sbeg[0];
+ currwc= scanner->sbeg[0];
scanner->sbeg+= 1;
#if MY_UCA_COMPILE_CONTRACTIONS
- if (my_uca_needs_context_handling(scanner->level, wc[0]))
+ if (my_uca_needs_context_handling(scanner->level, currwc))
{
- const MY_CONTRACTION *cnt= my_uca_context_weight_find(scanner, wc,
+ const MY_CONTRACTION *cnt= my_uca_context_weight_find(scanner, currwc,
LOCAL_MAX_CONTRACTION_LENGTH);
if (cnt)
- SCANNER_NEXT_RETURN_CONTRACTION(cnt, ignorable_nchars);
+ {
+ if ((weight= my_uca_scanner_set_weight(scanner, cnt->weight)))
+ SCANNER_NEXT_RETURN_CONTRACTION(cnt, ignorable_nchars);
+ continue; /* Ignorable contraction */
+ }
}
#endif
scanner->page= 0;
- scanner->code= (int) wc[0];
- scanner->wbeg= scanner->level->weights[0] + scanner->code * scanner->level->lengths[0];
- if (scanner->wbeg[0])
- SCANNER_NEXT_RETURN(*scanner->wbeg++, ignorable_nchars + 1);
- continue;
+ scanner->code= (int) currwc;
+ cweight= scanner->level->weights[0] + scanner->code * scanner->level->lengths[0];
+ if ((weight= my_uca_scanner_set_weight(scanner, cweight)))
+ SCANNER_NEXT_RETURN(weight, ignorable_nchars + 1);
+ continue; /* Ignorable character */
}
else
#endif
/* Get next MB character */
- if (((mblen= MY_MB_WC(scanner, wc, scanner->sbeg,
- scanner->send)) <= 0))
+ if (((mblen= MY_MB_WC(scanner, &currwc, scanner->sbeg,
+ scanner->send)) <= 0))
{
if (scanner->sbeg >= scanner->send)
{
@@ -136,26 +136,29 @@ MY_FUNCTION_NAME(scanner_next)(my_uca_scanner *scanner)
}
scanner->sbeg+= mblen;
- if (wc[0] > scanner->level->maxchar)
+ if (currwc > scanner->level->maxchar)
{
- /* Return 0xFFFD as weight for all characters outside BMP */
- scanner->wbeg= nochar;
- SCANNER_NEXT_RETURN(0xFFFD, ignorable_nchars + 1);
+ SCANNER_NEXT_RETURN(my_uca_scanner_set_weight_outside_maxchar(scanner),
+ ignorable_nchars + 1);
}
#if MY_UCA_COMPILE_CONTRACTIONS
- if (my_uca_needs_context_handling(scanner->level, wc[0]))
+ if (my_uca_needs_context_handling(scanner->level, currwc))
{
- const MY_CONTRACTION *cnt= my_uca_context_weight_find(scanner, wc,
+ const MY_CONTRACTION *cnt= my_uca_context_weight_find(scanner, currwc,
LOCAL_MAX_CONTRACTION_LENGTH);
if (cnt)
- SCANNER_NEXT_RETURN_CONTRACTION(cnt, ignorable_nchars);
+ {
+ if ((weight= my_uca_scanner_set_weight(scanner, cnt->weight)))
+ SCANNER_NEXT_RETURN_CONTRACTION(cnt, ignorable_nchars);
+ continue; /* Ignorable contraction */
+ }
}
#endif
/* Process single character */
- scanner->page= wc[0] >> 8;
- scanner->code= wc[0] & 0xFF;
+ scanner->page= currwc >> 8;
+ scanner->code= currwc & 0xFF;
/* If weight page for w[0] does not exist, then calculate algoritmically */
if (!(wpage= scanner->level->weights[scanner->page]))
@@ -163,14 +166,13 @@ MY_FUNCTION_NAME(scanner_next)(my_uca_scanner *scanner)
ignorable_nchars + 1);
/* Calculate pointer to w[0]'s weight, using page and offset */
- scanner->wbeg= wpage +
- scanner->code * scanner->level->lengths[scanner->page];
- if (scanner->wbeg[0])
- break;
- /* Skip ignorable character and continue the loop */
+ cweight= wpage + scanner->code * scanner->level->lengths[scanner->page];
+ if ((weight= my_uca_scanner_set_weight(scanner, cweight)))
+ SCANNER_NEXT_RETURN(weight, ignorable_nchars + 1);
+ continue; /* Ignorable character */
}
- SCANNER_NEXT_RETURN(*scanner->wbeg++, ignorable_nchars + 1);
+ SCANNER_NEXT_RETURN(0, 0); /* Not reachable */
}
#undef SCANNER_NEXT_NCHARS
diff --git a/strings/ctype-uca.c b/strings/ctype-uca.c
index 221f81e18b0..c5b6ad6cbb3 100644
--- a/strings/ctype-uca.c
+++ b/strings/ctype-uca.c
@@ -31181,6 +31181,33 @@ static const uint16 nochar[]= {0,0};
#define MY_UCA_PREVIOUS_CONTEXT_HEAD 64
#define MY_UCA_PREVIOUS_CONTEXT_TAIL 128
+
+static inline uint16
+my_uca_scanner_next_expansion_weight(my_uca_scanner *scanner)
+{
+ if (scanner->wbeg[0])
+ return *scanner->wbeg++;
+ return 0;
+}
+
+
+static inline uint16
+my_uca_scanner_set_weight(my_uca_scanner *scanner, const uint16 *weight)
+{
+ scanner->wbeg= weight + 1;
+ return *weight;
+}
+
+
+static inline uint16
+my_uca_scanner_set_weight_outside_maxchar(my_uca_scanner *scanner)
+{
+ /* Return 0xFFFD as weight for all characters outside BMP */
+ scanner->wbeg= nochar;
+ return 0xFFFD;
+}
+
+
/********** Helper functions to handle contraction ************/
@@ -31364,7 +31391,7 @@ my_uca_can_be_contraction_part(const MY_CONTRACTIONS *c, my_wc_t wc, int flag)
@retval ptr - contraction weight array
*/
-uint16 *
+const uint16 *
my_uca_contraction2_weight(const MY_CONTRACTIONS *list, my_wc_t wc1, my_wc_t wc2)
{
MY_CONTRACTION *c, *last;
@@ -31449,14 +31476,30 @@ my_uca_needs_context_handling(const MY_UCA_WEIGHT_LEVEL *level, my_wc_t wc)
@retval non-zero - strings are different
*/
-static int
-my_wmemcmp(my_wc_t *a, my_wc_t *b, size_t len)
+static inline int
+my_wmemcmp(const my_wc_t *a, const my_wc_t *b, size_t len)
{
return memcmp(a, b, len * sizeof(my_wc_t));
}
/*
+ Test if the MY_CONTRACTION instance is equal to the wide
+ string with the given length.
+ Note, only true contractions are checked,
+ while previous context pairs always return FALSE.
+*/
+static inline my_bool
+my_uca_true_contraction_eq(const MY_CONTRACTION *c,
+ const my_wc_t *wc, size_t len)
+{
+ return (len >= MY_UCA_MAX_CONTRACTION || c->ch[len] == 0) &&
+ !c->with_context &&
+ !my_wmemcmp(c->ch, wc, len);
+}
+
+
+/*
Return the number of characters in a contraction.
*/
static inline uint my_contraction_char_length(const MY_CONTRACTION *cnt)
@@ -31492,9 +31535,7 @@ my_uca_contraction_find(const MY_CONTRACTIONS *list, my_wc_t *wc, size_t len)
for (c= list->item, last= c + list->nitems; c < last; c++)
{
- if ((len >= MY_UCA_MAX_CONTRACTION || c->ch[len] == 0) &&
- !c->with_context &&
- !my_wmemcmp(c->ch, wc, len))
+ if (my_uca_true_contraction_eq(c, wc, len))
return c;
}
return NULL;
@@ -31518,12 +31559,15 @@ my_uca_contraction_find(const MY_CONTRACTIONS *list, my_wc_t *wc, size_t len)
*/
static const MY_CONTRACTION *
-my_uca_scanner_contraction_find(my_uca_scanner *scanner, my_wc_t *wc,
+my_uca_scanner_contraction_find(my_uca_scanner *scanner, my_wc_t currwc,
size_t max_char_length)
{
size_t clen= 1;
int flag;
const uchar *s, *beg[MY_UCA_MAX_CONTRACTION];
+ my_wc_t wc[MY_UCA_MAX_CONTRACTION];
+ wc[0]= currwc;
+
memset((void*) beg, 0, sizeof(beg));
/* Scan all contraction candidates */
@@ -31549,7 +31593,6 @@ my_uca_scanner_contraction_find(my_uca_scanner *scanner, my_wc_t *wc,
(cnt= my_uca_contraction_find(&scanner->level->contractions,
wc, clen)))
{
- scanner->wbeg= cnt->weight + 1;
scanner->sbeg= beg[clen - 1];
return cnt;
}
@@ -31573,18 +31616,14 @@ my_uca_scanner_contraction_find(my_uca_scanner *scanner, my_wc_t *wc,
*/
static const MY_CONTRACTION *
-my_uca_previous_context_find(my_uca_scanner *scanner,
+my_uca_previous_context_find(const MY_CONTRACTIONS *list,
my_wc_t wc0, my_wc_t wc1)
{
- const MY_CONTRACTIONS *list= &scanner->level->contractions;
MY_CONTRACTION *c, *last;
for (c= list->item, last= c + list->nitems; c < last; c++)
{
if (c->with_context && wc0 == c->ch[0] && wc1 == c->ch[1])
- {
- scanner->wbeg= c->weight + 1;
return c;
- }
}
return NULL;
}
@@ -31610,10 +31649,11 @@ my_uca_previous_context_find(my_uca_scanner *scanner,
@retval non null pointer - the address of MY_CONTRACTION found
*/
static inline const MY_CONTRACTION *
-my_uca_context_weight_find(my_uca_scanner *scanner, my_wc_t *wc,
+my_uca_context_weight_find(my_uca_scanner *scanner, my_wc_t currwc,
size_t max_char_length)
{
const MY_CONTRACTION *cnt;
+ my_wc_t prevwc;
DBUG_ASSERT(scanner->level->contractions.nitems);
/*
If we have scanned a character which can have previous context,
@@ -31625,21 +31665,22 @@ my_uca_context_weight_find(my_uca_scanner *scanner, my_wc_t *wc,
context at the moment. CLDR does not have longer sequences.
*/
if (my_uca_can_be_previous_context_tail(&scanner->level->contractions,
- wc[0]) &&
+ currwc) &&
scanner->wbeg != nochar && /* if not the very first character */
my_uca_can_be_previous_context_head(&scanner->level->contractions,
- (wc[1]= ((scanner->page << 8) +
+ (prevwc= ((scanner->page << 8) +
scanner->code))) &&
- (cnt= my_uca_previous_context_find(scanner, wc[1], wc[0])))
+ (cnt= my_uca_previous_context_find(&scanner->level->contractions,
+ prevwc, currwc)))
{
scanner->page= scanner->code= 0; /* Clear for the next character */
return cnt;
}
else if (my_uca_can_be_contraction_head(&scanner->level->contractions,
- wc[0]))
+ currwc))
{
- /* Check if w[0] starts a contraction */
- if ((cnt= my_uca_scanner_contraction_find(scanner, wc, max_char_length)))
+ /* Check if currwc starts a contraction */
+ if ((cnt= my_uca_scanner_contraction_find(scanner, currwc, max_char_length)))
return cnt;
}
return NULL;
diff --git a/strings/ctype-uca.inl b/strings/ctype-uca.inl
index 1fc3480e5b5..6cf31ace11a 100644
--- a/strings/ctype-uca.inl
+++ b/strings/ctype-uca.inl
@@ -36,6 +36,7 @@
#error MY_UCA_COLL_INIT is not defined
#endif
+
#include "ctype-uca-scanner_next.inl"
#define SCANNER_NEXT_NCHARS
#include "ctype-uca-scanner_next.inl"
diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c
index fb0ab7be6a6..adcd4825d88 100644
--- a/strings/ctype-ujis.c
+++ b/strings/ctype-ujis.c
@@ -211,6 +211,7 @@ static const uchar sort_order_ujis[]=
#define WEIGHT_MB2(x,y) ((((uint) (uchar)(x)) << 16) | \
(((uint) (uchar) (y)) << 8))
#define WEIGHT_MB3(x,y,z) (WEIGHT_MB2(x,y) | ((uint) (uchar) z))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -220,6 +221,7 @@ static const uchar sort_order_ujis[]=
#define WEIGHT_MB2(x,y) ((((uint) (uchar)(x)) << 16) | \
(((uint) (uchar) (y)) << 8))
#define WEIGHT_MB3(x,y,z) (WEIGHT_MB2(x,y) | ((uint) (uchar) z))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -230,6 +232,7 @@ static const uchar sort_order_ujis[]=
#define WEIGHT_MB2(x,y) ((((uint) (uchar)(x)) << 16) | \
(((uint) (uchar) (y)) << 8))
#define WEIGHT_MB3(x,y,z) (WEIGHT_MB2(x,y) | ((uint) (uchar) z))
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -240,6 +243,7 @@ static const uchar sort_order_ujis[]=
#define WEIGHT_MB2(x,y) ((((uint) (uchar)(x)) << 16) | \
(((uint) (uchar) (y)) << 8))
#define WEIGHT_MB3(x,y,z) (WEIGHT_MB2(x,y) | ((uint) (uchar) z))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c
index 742eeb912e3..611684ff706 100644
--- a/strings/ctype-utf8.c
+++ b/strings/ctype-utf8.c
@@ -1036,6 +1036,268 @@ static MY_UNICASE_CHARACTER plane05[]={
{0x05FE,0x05FE,0x05FE}, {0x05FF,0x05FF,0x05FF}
};
+static MY_UNICASE_CHARACTER plane06[]={ /* This page is dummy */
+ {0x0600,0x0600,0x0600}, {0x0601,0x0601,0x0601}, /* 0600 */
+ {0x0602,0x0602,0x0602}, {0x0603,0x0603,0x0603}, /* 0602 */
+ {0x0604,0x0604,0x0604}, {0x0605,0x0605,0x0605}, /* 0604 */
+ {0x0606,0x0606,0x0606}, {0x0607,0x0607,0x0607}, /* 0606 */
+ {0x0608,0x0608,0x0608}, {0x0609,0x0609,0x0609}, /* 0608 */
+ {0x060A,0x060A,0x060A}, {0x060B,0x060B,0x060B}, /* 060A */
+ {0x060C,0x060C,0x060C}, {0x060D,0x060D,0x060D}, /* 060C */
+ {0x060E,0x060E,0x060E}, {0x060F,0x060F,0x060F}, /* 060E */
+ {0x0610,0x0610,0x0610}, {0x0611,0x0611,0x0611}, /* 0610 */
+ {0x0612,0x0612,0x0612}, {0x0613,0x0613,0x0613}, /* 0612 */
+ {0x0614,0x0614,0x0614}, {0x0615,0x0615,0x0615}, /* 0614 */
+ {0x0616,0x0616,0x0616}, {0x0617,0x0617,0x0617}, /* 0616 */
+ {0x0618,0x0618,0x0618}, {0x0619,0x0619,0x0619}, /* 0618 */
+ {0x061A,0x061A,0x061A}, {0x061B,0x061B,0x061B}, /* 061A */
+ {0x061C,0x061C,0x061C}, {0x061D,0x061D,0x061D}, /* 061C */
+ {0x061E,0x061E,0x061E}, {0x061F,0x061F,0x061F}, /* 061E */
+ {0x0620,0x0620,0x0620}, {0x0621,0x0621,0x0621}, /* 0620 */
+ {0x0622,0x0622,0x0622}, {0x0623,0x0623,0x0623}, /* 0622 */
+ {0x0624,0x0624,0x0624}, {0x0625,0x0625,0x0625}, /* 0624 */
+ {0x0626,0x0626,0x0626}, {0x0627,0x0627,0x0627}, /* 0626 */
+ {0x0628,0x0628,0x0628}, {0x0629,0x0629,0x0629}, /* 0628 */
+ {0x062A,0x062A,0x062A}, {0x062B,0x062B,0x062B}, /* 062A */
+ {0x062C,0x062C,0x062C}, {0x062D,0x062D,0x062D}, /* 062C */
+ {0x062E,0x062E,0x062E}, {0x062F,0x062F,0x062F}, /* 062E */
+ {0x0630,0x0630,0x0630}, {0x0631,0x0631,0x0631}, /* 0630 */
+ {0x0632,0x0632,0x0632}, {0x0633,0x0633,0x0633}, /* 0632 */
+ {0x0634,0x0634,0x0634}, {0x0635,0x0635,0x0635}, /* 0634 */
+ {0x0636,0x0636,0x0636}, {0x0637,0x0637,0x0637}, /* 0636 */
+ {0x0638,0x0638,0x0638}, {0x0639,0x0639,0x0639}, /* 0638 */
+ {0x063A,0x063A,0x063A}, {0x063B,0x063B,0x063B}, /* 063A */
+ {0x063C,0x063C,0x063C}, {0x063D,0x063D,0x063D}, /* 063C */
+ {0x063E,0x063E,0x063E}, {0x063F,0x063F,0x063F}, /* 063E */
+ {0x0640,0x0640,0x0640}, {0x0641,0x0641,0x0641}, /* 0640 */
+ {0x0642,0x0642,0x0642}, {0x0643,0x0643,0x0643}, /* 0642 */
+ {0x0644,0x0644,0x0644}, {0x0645,0x0645,0x0645}, /* 0644 */
+ {0x0646,0x0646,0x0646}, {0x0647,0x0647,0x0647}, /* 0646 */
+ {0x0648,0x0648,0x0648}, {0x0649,0x0649,0x0649}, /* 0648 */
+ {0x064A,0x064A,0x064A}, {0x064B,0x064B,0x064B}, /* 064A */
+ {0x064C,0x064C,0x064C}, {0x064D,0x064D,0x064D}, /* 064C */
+ {0x064E,0x064E,0x064E}, {0x064F,0x064F,0x064F}, /* 064E */
+ {0x0650,0x0650,0x0650}, {0x0651,0x0651,0x0651}, /* 0650 */
+ {0x0652,0x0652,0x0652}, {0x0653,0x0653,0x0653}, /* 0652 */
+ {0x0654,0x0654,0x0654}, {0x0655,0x0655,0x0655}, /* 0654 */
+ {0x0656,0x0656,0x0656}, {0x0657,0x0657,0x0657}, /* 0656 */
+ {0x0658,0x0658,0x0658}, {0x0659,0x0659,0x0659}, /* 0658 */
+ {0x065A,0x065A,0x065A}, {0x065B,0x065B,0x065B}, /* 065A */
+ {0x065C,0x065C,0x065C}, {0x065D,0x065D,0x065D}, /* 065C */
+ {0x065E,0x065E,0x065E}, {0x065F,0x065F,0x065F}, /* 065E */
+ {0x0660,0x0660,0x0660}, {0x0661,0x0661,0x0661}, /* 0660 */
+ {0x0662,0x0662,0x0662}, {0x0663,0x0663,0x0663}, /* 0662 */
+ {0x0664,0x0664,0x0664}, {0x0665,0x0665,0x0665}, /* 0664 */
+ {0x0666,0x0666,0x0666}, {0x0667,0x0667,0x0667}, /* 0666 */
+ {0x0668,0x0668,0x0668}, {0x0669,0x0669,0x0669}, /* 0668 */
+ {0x066A,0x066A,0x066A}, {0x066B,0x066B,0x066B}, /* 066A */
+ {0x066C,0x066C,0x066C}, {0x066D,0x066D,0x066D}, /* 066C */
+ {0x066E,0x066E,0x066E}, {0x066F,0x066F,0x066F}, /* 066E */
+ {0x0670,0x0670,0x0670}, {0x0671,0x0671,0x0671}, /* 0670 */
+ {0x0672,0x0672,0x0672}, {0x0673,0x0673,0x0673}, /* 0672 */
+ {0x0674,0x0674,0x0674}, {0x0675,0x0675,0x0675}, /* 0674 */
+ {0x0676,0x0676,0x0676}, {0x0677,0x0677,0x0677}, /* 0676 */
+ {0x0678,0x0678,0x0678}, {0x0679,0x0679,0x0679}, /* 0678 */
+ {0x067A,0x067A,0x067A}, {0x067B,0x067B,0x067B}, /* 067A */
+ {0x067C,0x067C,0x067C}, {0x067D,0x067D,0x067D}, /* 067C */
+ {0x067E,0x067E,0x067E}, {0x067F,0x067F,0x067F}, /* 067E */
+ {0x0680,0x0680,0x0680}, {0x0681,0x0681,0x0681}, /* 0680 */
+ {0x0682,0x0682,0x0682}, {0x0683,0x0683,0x0683}, /* 0682 */
+ {0x0684,0x0684,0x0684}, {0x0685,0x0685,0x0685}, /* 0684 */
+ {0x0686,0x0686,0x0686}, {0x0687,0x0687,0x0687}, /* 0686 */
+ {0x0688,0x0688,0x0688}, {0x0689,0x0689,0x0689}, /* 0688 */
+ {0x068A,0x068A,0x068A}, {0x068B,0x068B,0x068B}, /* 068A */
+ {0x068C,0x068C,0x068C}, {0x068D,0x068D,0x068D}, /* 068C */
+ {0x068E,0x068E,0x068E}, {0x068F,0x068F,0x068F}, /* 068E */
+ {0x0690,0x0690,0x0690}, {0x0691,0x0691,0x0691}, /* 0690 */
+ {0x0692,0x0692,0x0692}, {0x0693,0x0693,0x0693}, /* 0692 */
+ {0x0694,0x0694,0x0694}, {0x0695,0x0695,0x0695}, /* 0694 */
+ {0x0696,0x0696,0x0696}, {0x0697,0x0697,0x0697}, /* 0696 */
+ {0x0698,0x0698,0x0698}, {0x0699,0x0699,0x0699}, /* 0698 */
+ {0x069A,0x069A,0x069A}, {0x069B,0x069B,0x069B}, /* 069A */
+ {0x069C,0x069C,0x069C}, {0x069D,0x069D,0x069D}, /* 069C */
+ {0x069E,0x069E,0x069E}, {0x069F,0x069F,0x069F}, /* 069E */
+ {0x06A0,0x06A0,0x06A0}, {0x06A1,0x06A1,0x06A1}, /* 06A0 */
+ {0x06A2,0x06A2,0x06A2}, {0x06A3,0x06A3,0x06A3}, /* 06A2 */
+ {0x06A4,0x06A4,0x06A4}, {0x06A5,0x06A5,0x06A5}, /* 06A4 */
+ {0x06A6,0x06A6,0x06A6}, {0x06A7,0x06A7,0x06A7}, /* 06A6 */
+ {0x06A8,0x06A8,0x06A8}, {0x06A9,0x06A9,0x06A9}, /* 06A8 */
+ {0x06AA,0x06AA,0x06AA}, {0x06AB,0x06AB,0x06AB}, /* 06AA */
+ {0x06AC,0x06AC,0x06AC}, {0x06AD,0x06AD,0x06AD}, /* 06AC */
+ {0x06AE,0x06AE,0x06AE}, {0x06AF,0x06AF,0x06AF}, /* 06AE */
+ {0x06B0,0x06B0,0x06B0}, {0x06B1,0x06B1,0x06B1}, /* 06B0 */
+ {0x06B2,0x06B2,0x06B2}, {0x06B3,0x06B3,0x06B3}, /* 06B2 */
+ {0x06B4,0x06B4,0x06B4}, {0x06B5,0x06B5,0x06B5}, /* 06B4 */
+ {0x06B6,0x06B6,0x06B6}, {0x06B7,0x06B7,0x06B7}, /* 06B6 */
+ {0x06B8,0x06B8,0x06B8}, {0x06B9,0x06B9,0x06B9}, /* 06B8 */
+ {0x06BA,0x06BA,0x06BA}, {0x06BB,0x06BB,0x06BB}, /* 06BA */
+ {0x06BC,0x06BC,0x06BC}, {0x06BD,0x06BD,0x06BD}, /* 06BC */
+ {0x06BE,0x06BE,0x06BE}, {0x06BF,0x06BF,0x06BF}, /* 06BE */
+ {0x06C0,0x06C0,0x06C0}, {0x06C1,0x06C1,0x06C1}, /* 06C0 */
+ {0x06C2,0x06C2,0x06C2}, {0x06C3,0x06C3,0x06C3}, /* 06C2 */
+ {0x06C4,0x06C4,0x06C4}, {0x06C5,0x06C5,0x06C5}, /* 06C4 */
+ {0x06C6,0x06C6,0x06C6}, {0x06C7,0x06C7,0x06C7}, /* 06C6 */
+ {0x06C8,0x06C8,0x06C8}, {0x06C9,0x06C9,0x06C9}, /* 06C8 */
+ {0x06CA,0x06CA,0x06CA}, {0x06CB,0x06CB,0x06CB}, /* 06CA */
+ {0x06CC,0x06CC,0x06CC}, {0x06CD,0x06CD,0x06CD}, /* 06CC */
+ {0x06CE,0x06CE,0x06CE}, {0x06CF,0x06CF,0x06CF}, /* 06CE */
+ {0x06D0,0x06D0,0x06D0}, {0x06D1,0x06D1,0x06D1}, /* 06D0 */
+ {0x06D2,0x06D2,0x06D2}, {0x06D3,0x06D3,0x06D3}, /* 06D2 */
+ {0x06D4,0x06D4,0x06D4}, {0x06D5,0x06D5,0x06D5}, /* 06D4 */
+ {0x06D6,0x06D6,0x06D6}, {0x06D7,0x06D7,0x06D7}, /* 06D6 */
+ {0x06D8,0x06D8,0x06D8}, {0x06D9,0x06D9,0x06D9}, /* 06D8 */
+ {0x06DA,0x06DA,0x06DA}, {0x06DB,0x06DB,0x06DB}, /* 06DA */
+ {0x06DC,0x06DC,0x06DC}, {0x06DD,0x06DD,0x06DD}, /* 06DC */
+ {0x06DE,0x06DE,0x06DE}, {0x06DF,0x06DF,0x06DF}, /* 06DE */
+ {0x06E0,0x06E0,0x06E0}, {0x06E1,0x06E1,0x06E1}, /* 06E0 */
+ {0x06E2,0x06E2,0x06E2}, {0x06E3,0x06E3,0x06E3}, /* 06E2 */
+ {0x06E4,0x06E4,0x06E4}, {0x06E5,0x06E5,0x06E5}, /* 06E4 */
+ {0x06E6,0x06E6,0x06E6}, {0x06E7,0x06E7,0x06E7}, /* 06E6 */
+ {0x06E8,0x06E8,0x06E8}, {0x06E9,0x06E9,0x06E9}, /* 06E8 */
+ {0x06EA,0x06EA,0x06EA}, {0x06EB,0x06EB,0x06EB}, /* 06EA */
+ {0x06EC,0x06EC,0x06EC}, {0x06ED,0x06ED,0x06ED}, /* 06EC */
+ {0x06EE,0x06EE,0x06EE}, {0x06EF,0x06EF,0x06EF}, /* 06EE */
+ {0x06F0,0x06F0,0x06F0}, {0x06F1,0x06F1,0x06F1}, /* 06F0 */
+ {0x06F2,0x06F2,0x06F2}, {0x06F3,0x06F3,0x06F3}, /* 06F2 */
+ {0x06F4,0x06F4,0x06F4}, {0x06F5,0x06F5,0x06F5}, /* 06F4 */
+ {0x06F6,0x06F6,0x06F6}, {0x06F7,0x06F7,0x06F7}, /* 06F6 */
+ {0x06F8,0x06F8,0x06F8}, {0x06F9,0x06F9,0x06F9}, /* 06F8 */
+ {0x06FA,0x06FA,0x06FA}, {0x06FB,0x06FB,0x06FB}, /* 06FA */
+ {0x06FC,0x06FC,0x06FC}, {0x06FD,0x06FD,0x06FD}, /* 06FC */
+ {0x06FE,0x06FE,0x06FE}, {0x06FF,0x06FF,0x06FF} /* 06FE */
+};
+
+static MY_UNICASE_CHARACTER plane07[]={ /* This page is dummy */
+ {0x0700,0x0700,0x0700}, {0x0701,0x0701,0x0701}, /* 0700 */
+ {0x0702,0x0702,0x0702}, {0x0703,0x0703,0x0703}, /* 0702 */
+ {0x0704,0x0704,0x0704}, {0x0705,0x0705,0x0705}, /* 0704 */
+ {0x0706,0x0706,0x0706}, {0x0707,0x0707,0x0707}, /* 0706 */
+ {0x0708,0x0708,0x0708}, {0x0709,0x0709,0x0709}, /* 0708 */
+ {0x070A,0x070A,0x070A}, {0x070B,0x070B,0x070B}, /* 070A */
+ {0x070C,0x070C,0x070C}, {0x070D,0x070D,0x070D}, /* 070C */
+ {0x070E,0x070E,0x070E}, {0x070F,0x070F,0x070F}, /* 070E */
+ {0x0710,0x0710,0x0710}, {0x0711,0x0711,0x0711}, /* 0710 */
+ {0x0712,0x0712,0x0712}, {0x0713,0x0713,0x0713}, /* 0712 */
+ {0x0714,0x0714,0x0714}, {0x0715,0x0715,0x0715}, /* 0714 */
+ {0x0716,0x0716,0x0716}, {0x0717,0x0717,0x0717}, /* 0716 */
+ {0x0718,0x0718,0x0718}, {0x0719,0x0719,0x0719}, /* 0718 */
+ {0x071A,0x071A,0x071A}, {0x071B,0x071B,0x071B}, /* 071A */
+ {0x071C,0x071C,0x071C}, {0x071D,0x071D,0x071D}, /* 071C */
+ {0x071E,0x071E,0x071E}, {0x071F,0x071F,0x071F}, /* 071E */
+ {0x0720,0x0720,0x0720}, {0x0721,0x0721,0x0721}, /* 0720 */
+ {0x0722,0x0722,0x0722}, {0x0723,0x0723,0x0723}, /* 0722 */
+ {0x0724,0x0724,0x0724}, {0x0725,0x0725,0x0725}, /* 0724 */
+ {0x0726,0x0726,0x0726}, {0x0727,0x0727,0x0727}, /* 0726 */
+ {0x0728,0x0728,0x0728}, {0x0729,0x0729,0x0729}, /* 0728 */
+ {0x072A,0x072A,0x072A}, {0x072B,0x072B,0x072B}, /* 072A */
+ {0x072C,0x072C,0x072C}, {0x072D,0x072D,0x072D}, /* 072C */
+ {0x072E,0x072E,0x072E}, {0x072F,0x072F,0x072F}, /* 072E */
+ {0x0730,0x0730,0x0730}, {0x0731,0x0731,0x0731}, /* 0730 */
+ {0x0732,0x0732,0x0732}, {0x0733,0x0733,0x0733}, /* 0732 */
+ {0x0734,0x0734,0x0734}, {0x0735,0x0735,0x0735}, /* 0734 */
+ {0x0736,0x0736,0x0736}, {0x0737,0x0737,0x0737}, /* 0736 */
+ {0x0738,0x0738,0x0738}, {0x0739,0x0739,0x0739}, /* 0738 */
+ {0x073A,0x073A,0x073A}, {0x073B,0x073B,0x073B}, /* 073A */
+ {0x073C,0x073C,0x073C}, {0x073D,0x073D,0x073D}, /* 073C */
+ {0x073E,0x073E,0x073E}, {0x073F,0x073F,0x073F}, /* 073E */
+ {0x0740,0x0740,0x0740}, {0x0741,0x0741,0x0741}, /* 0740 */
+ {0x0742,0x0742,0x0742}, {0x0743,0x0743,0x0743}, /* 0742 */
+ {0x0744,0x0744,0x0744}, {0x0745,0x0745,0x0745}, /* 0744 */
+ {0x0746,0x0746,0x0746}, {0x0747,0x0747,0x0747}, /* 0746 */
+ {0x0748,0x0748,0x0748}, {0x0749,0x0749,0x0749}, /* 0748 */
+ {0x074A,0x074A,0x074A}, {0x074B,0x074B,0x074B}, /* 074A */
+ {0x074C,0x074C,0x074C}, {0x074D,0x074D,0x074D}, /* 074C */
+ {0x074E,0x074E,0x074E}, {0x074F,0x074F,0x074F}, /* 074E */
+ {0x0750,0x0750,0x0750}, {0x0751,0x0751,0x0751}, /* 0750 */
+ {0x0752,0x0752,0x0752}, {0x0753,0x0753,0x0753}, /* 0752 */
+ {0x0754,0x0754,0x0754}, {0x0755,0x0755,0x0755}, /* 0754 */
+ {0x0756,0x0756,0x0756}, {0x0757,0x0757,0x0757}, /* 0756 */
+ {0x0758,0x0758,0x0758}, {0x0759,0x0759,0x0759}, /* 0758 */
+ {0x075A,0x075A,0x075A}, {0x075B,0x075B,0x075B}, /* 075A */
+ {0x075C,0x075C,0x075C}, {0x075D,0x075D,0x075D}, /* 075C */
+ {0x075E,0x075E,0x075E}, {0x075F,0x075F,0x075F}, /* 075E */
+ {0x0760,0x0760,0x0760}, {0x0761,0x0761,0x0761}, /* 0760 */
+ {0x0762,0x0762,0x0762}, {0x0763,0x0763,0x0763}, /* 0762 */
+ {0x0764,0x0764,0x0764}, {0x0765,0x0765,0x0765}, /* 0764 */
+ {0x0766,0x0766,0x0766}, {0x0767,0x0767,0x0767}, /* 0766 */
+ {0x0768,0x0768,0x0768}, {0x0769,0x0769,0x0769}, /* 0768 */
+ {0x076A,0x076A,0x076A}, {0x076B,0x076B,0x076B}, /* 076A */
+ {0x076C,0x076C,0x076C}, {0x076D,0x076D,0x076D}, /* 076C */
+ {0x076E,0x076E,0x076E}, {0x076F,0x076F,0x076F}, /* 076E */
+ {0x0770,0x0770,0x0770}, {0x0771,0x0771,0x0771}, /* 0770 */
+ {0x0772,0x0772,0x0772}, {0x0773,0x0773,0x0773}, /* 0772 */
+ {0x0774,0x0774,0x0774}, {0x0775,0x0775,0x0775}, /* 0774 */
+ {0x0776,0x0776,0x0776}, {0x0777,0x0777,0x0777}, /* 0776 */
+ {0x0778,0x0778,0x0778}, {0x0779,0x0779,0x0779}, /* 0778 */
+ {0x077A,0x077A,0x077A}, {0x077B,0x077B,0x077B}, /* 077A */
+ {0x077C,0x077C,0x077C}, {0x077D,0x077D,0x077D}, /* 077C */
+ {0x077E,0x077E,0x077E}, {0x077F,0x077F,0x077F}, /* 077E */
+ {0x0780,0x0780,0x0780}, {0x0781,0x0781,0x0781}, /* 0780 */
+ {0x0782,0x0782,0x0782}, {0x0783,0x0783,0x0783}, /* 0782 */
+ {0x0784,0x0784,0x0784}, {0x0785,0x0785,0x0785}, /* 0784 */
+ {0x0786,0x0786,0x0786}, {0x0787,0x0787,0x0787}, /* 0786 */
+ {0x0788,0x0788,0x0788}, {0x0789,0x0789,0x0789}, /* 0788 */
+ {0x078A,0x078A,0x078A}, {0x078B,0x078B,0x078B}, /* 078A */
+ {0x078C,0x078C,0x078C}, {0x078D,0x078D,0x078D}, /* 078C */
+ {0x078E,0x078E,0x078E}, {0x078F,0x078F,0x078F}, /* 078E */
+ {0x0790,0x0790,0x0790}, {0x0791,0x0791,0x0791}, /* 0790 */
+ {0x0792,0x0792,0x0792}, {0x0793,0x0793,0x0793}, /* 0792 */
+ {0x0794,0x0794,0x0794}, {0x0795,0x0795,0x0795}, /* 0794 */
+ {0x0796,0x0796,0x0796}, {0x0797,0x0797,0x0797}, /* 0796 */
+ {0x0798,0x0798,0x0798}, {0x0799,0x0799,0x0799}, /* 0798 */
+ {0x079A,0x079A,0x079A}, {0x079B,0x079B,0x079B}, /* 079A */
+ {0x079C,0x079C,0x079C}, {0x079D,0x079D,0x079D}, /* 079C */
+ {0x079E,0x079E,0x079E}, {0x079F,0x079F,0x079F}, /* 079E */
+ {0x07A0,0x07A0,0x07A0}, {0x07A1,0x07A1,0x07A1}, /* 07A0 */
+ {0x07A2,0x07A2,0x07A2}, {0x07A3,0x07A3,0x07A3}, /* 07A2 */
+ {0x07A4,0x07A4,0x07A4}, {0x07A5,0x07A5,0x07A5}, /* 07A4 */
+ {0x07A6,0x07A6,0x07A6}, {0x07A7,0x07A7,0x07A7}, /* 07A6 */
+ {0x07A8,0x07A8,0x07A8}, {0x07A9,0x07A9,0x07A9}, /* 07A8 */
+ {0x07AA,0x07AA,0x07AA}, {0x07AB,0x07AB,0x07AB}, /* 07AA */
+ {0x07AC,0x07AC,0x07AC}, {0x07AD,0x07AD,0x07AD}, /* 07AC */
+ {0x07AE,0x07AE,0x07AE}, {0x07AF,0x07AF,0x07AF}, /* 07AE */
+ {0x07B0,0x07B0,0x07B0}, {0x07B1,0x07B1,0x07B1}, /* 07B0 */
+ {0x07B2,0x07B2,0x07B2}, {0x07B3,0x07B3,0x07B3}, /* 07B2 */
+ {0x07B4,0x07B4,0x07B4}, {0x07B5,0x07B5,0x07B5}, /* 07B4 */
+ {0x07B6,0x07B6,0x07B6}, {0x07B7,0x07B7,0x07B7}, /* 07B6 */
+ {0x07B8,0x07B8,0x07B8}, {0x07B9,0x07B9,0x07B9}, /* 07B8 */
+ {0x07BA,0x07BA,0x07BA}, {0x07BB,0x07BB,0x07BB}, /* 07BA */
+ {0x07BC,0x07BC,0x07BC}, {0x07BD,0x07BD,0x07BD}, /* 07BC */
+ {0x07BE,0x07BE,0x07BE}, {0x07BF,0x07BF,0x07BF}, /* 07BE */
+ {0x07C0,0x07C0,0x07C0}, {0x07C1,0x07C1,0x07C1}, /* 07C0 */
+ {0x07C2,0x07C2,0x07C2}, {0x07C3,0x07C3,0x07C3}, /* 07C2 */
+ {0x07C4,0x07C4,0x07C4}, {0x07C5,0x07C5,0x07C5}, /* 07C4 */
+ {0x07C6,0x07C6,0x07C6}, {0x07C7,0x07C7,0x07C7}, /* 07C6 */
+ {0x07C8,0x07C8,0x07C8}, {0x07C9,0x07C9,0x07C9}, /* 07C8 */
+ {0x07CA,0x07CA,0x07CA}, {0x07CB,0x07CB,0x07CB}, /* 07CA */
+ {0x07CC,0x07CC,0x07CC}, {0x07CD,0x07CD,0x07CD}, /* 07CC */
+ {0x07CE,0x07CE,0x07CE}, {0x07CF,0x07CF,0x07CF}, /* 07CE */
+ {0x07D0,0x07D0,0x07D0}, {0x07D1,0x07D1,0x07D1}, /* 07D0 */
+ {0x07D2,0x07D2,0x07D2}, {0x07D3,0x07D3,0x07D3}, /* 07D2 */
+ {0x07D4,0x07D4,0x07D4}, {0x07D5,0x07D5,0x07D5}, /* 07D4 */
+ {0x07D6,0x07D6,0x07D6}, {0x07D7,0x07D7,0x07D7}, /* 07D6 */
+ {0x07D8,0x07D8,0x07D8}, {0x07D9,0x07D9,0x07D9}, /* 07D8 */
+ {0x07DA,0x07DA,0x07DA}, {0x07DB,0x07DB,0x07DB}, /* 07DA */
+ {0x07DC,0x07DC,0x07DC}, {0x07DD,0x07DD,0x07DD}, /* 07DC */
+ {0x07DE,0x07DE,0x07DE}, {0x07DF,0x07DF,0x07DF}, /* 07DE */
+ {0x07E0,0x07E0,0x07E0}, {0x07E1,0x07E1,0x07E1}, /* 07E0 */
+ {0x07E2,0x07E2,0x07E2}, {0x07E3,0x07E3,0x07E3}, /* 07E2 */
+ {0x07E4,0x07E4,0x07E4}, {0x07E5,0x07E5,0x07E5}, /* 07E4 */
+ {0x07E6,0x07E6,0x07E6}, {0x07E7,0x07E7,0x07E7}, /* 07E6 */
+ {0x07E8,0x07E8,0x07E8}, {0x07E9,0x07E9,0x07E9}, /* 07E8 */
+ {0x07EA,0x07EA,0x07EA}, {0x07EB,0x07EB,0x07EB}, /* 07EA */
+ {0x07EC,0x07EC,0x07EC}, {0x07ED,0x07ED,0x07ED}, /* 07EC */
+ {0x07EE,0x07EE,0x07EE}, {0x07EF,0x07EF,0x07EF}, /* 07EE */
+ {0x07F0,0x07F0,0x07F0}, {0x07F1,0x07F1,0x07F1}, /* 07F0 */
+ {0x07F2,0x07F2,0x07F2}, {0x07F3,0x07F3,0x07F3}, /* 07F2 */
+ {0x07F4,0x07F4,0x07F4}, {0x07F5,0x07F5,0x07F5}, /* 07F4 */
+ {0x07F6,0x07F6,0x07F6}, {0x07F7,0x07F7,0x07F7}, /* 07F6 */
+ {0x07F8,0x07F8,0x07F8}, {0x07F9,0x07F9,0x07F9}, /* 07F8 */
+ {0x07FA,0x07FA,0x07FA}, {0x07FB,0x07FB,0x07FB}, /* 07FA */
+ {0x07FC,0x07FC,0x07FC}, {0x07FD,0x07FD,0x07FD}, /* 07FC */
+ {0x07FE,0x07FE,0x07FE}, {0x07FF,0x07FF,0x07FF} /* 07FE */
+};
+
static MY_UNICASE_CHARACTER plane1E[]={
{0x1E00,0x1E01,0x0041}, {0x1E00,0x1E01,0x0041},
{0x1E02,0x1E03,0x0042}, {0x1E02,0x1E03,0x0042},
@@ -1695,7 +1957,7 @@ static MY_UNICASE_CHARACTER planeFF[]={
MY_UNICASE_CHARACTER *my_unicase_default_pages[256]=
{
my_unicase_default_page00,
- plane01, plane02, plane03, plane04, plane05, NULL, NULL,
+ plane01, plane02, plane03, plane04, plane05, plane06, plane07,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, plane1E, plane1F,
@@ -1742,7 +2004,7 @@ MY_UNICASE_INFO my_unicase_default=
*/
MY_UNICASE_CHARACTER *my_unicase_pages_mysql500[256]={
plane00_mysql500,
- plane01, plane02, plane03, plane04, plane05, NULL, NULL,
+ plane01, plane02, plane03, plane04, plane05, plane06, plane07,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, plane1E, plane1F,
@@ -1929,7 +2191,7 @@ static MY_UNICASE_CHARACTER turk00[]=
static MY_UNICASE_CHARACTER *my_unicase_pages_turkish[256]=
{
- turk00, plane01, plane02, plane03, plane04, plane05, NULL, NULL,
+ turk00, plane01, plane02, plane03, plane04, plane05, plane06, plane07,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, plane1E, plane1F,
@@ -4333,7 +4595,7 @@ static MY_UNICASE_CHARACTER u520p104[]={
MY_UNICASE_CHARACTER *my_unicase_pages_unicode520[4352]=
{
- u520p00, u520p01, u520p02, u520p03, u520p04, u520p05, NULL, NULL,
+ u520p00, u520p01, u520p02, u520p03, u520p04, u520p05, plane06, plane07,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
u520p10, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, u520p1D, u520p1E, u520p1F,
@@ -5231,7 +5493,17 @@ static inline int my_weight_mb2_utf8mb3_general_ci(uchar b0, uchar b1)
{
my_wc_t wc= UTF8MB2_CODE(b0, b1);
MY_UNICASE_CHARACTER *page= my_unicase_default_pages[wc >> 8];
- return (int) (page ? page[wc & 0xFF].sort : wc);
+ /*
+ 2-byte utf8 sequences encode Unicode characters up to U+07FF.
+ my_unicase_default_pages[N] has non-NULL page pointers
+ for all N in the range [0..7].
+ - my_unicase_default_pages[0..5] point to real translation data
+ - my_unicase_default_pages[6..7] point to dummy pages
+ (without real translation).
+ By adding these dummy pages we can avoid testing 'page' against NULL.
+ This gives up to 20% performance improvement.
+ */
+ return (int) page[wc & 0xFF].sort;
}
@@ -5255,6 +5527,7 @@ static inline int my_weight_mb3_utf8mb3_general_ci(uchar b0, uchar b1, uchar b2)
#define WEIGHT_MB1(x) my_weight_mb1_utf8mb3_general_ci(x)
#define WEIGHT_MB2(x,y) my_weight_mb2_utf8mb3_general_ci(x,y)
#define WEIGHT_MB3(x,y,z) my_weight_mb3_utf8mb3_general_ci(x,y,z)
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -5264,6 +5537,7 @@ static inline int my_weight_mb3_utf8mb3_general_ci(uchar b0, uchar b1, uchar b2)
#define WEIGHT_MB1(x) my_weight_mb1_utf8mb3_general_ci(x)
#define WEIGHT_MB2(x,y) my_weight_mb2_utf8mb3_general_ci(x,y)
#define WEIGHT_MB3(x,y,z) my_weight_mb3_utf8mb3_general_ci(x,y,z)
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -5277,7 +5551,11 @@ static inline int my_weight_mb2_utf8mb3_general_mysql500_ci(uchar b0, uchar b1)
{
my_wc_t wc= UTF8MB2_CODE(b0, b1);
MY_UNICASE_CHARACTER *page= my_unicase_pages_mysql500[wc >> 8];
- return (int) (page ? page[wc & 0xFF].sort : wc);
+ /*
+ `page` should never be NULL for 2-byte utf8 characters.
+ See comments in my_weight_mb2_utf8mb3_general_ci().
+ */
+ return (int) page[wc & 0xFF].sort;
}
@@ -5301,6 +5579,7 @@ my_weight_mb3_utf8mb3_general_mysql500_ci(uchar b0, uchar b1, uchar b2)
#define WEIGHT_MB1(x) my_weight_mb1_utf8mb3_general_mysql500_ci(x)
#define WEIGHT_MB2(x,y) my_weight_mb2_utf8mb3_general_mysql500_ci(x,y)
#define WEIGHT_MB3(x,y,z) my_weight_mb3_utf8mb3_general_mysql500_ci(x,y,z)
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -5312,6 +5591,7 @@ my_weight_mb3_utf8mb3_general_mysql500_ci(uchar b0, uchar b1, uchar b2)
#define WEIGHT_MB1(x) ((int) (uchar) (x))
#define WEIGHT_MB2(x,y) ((int) UTF8MB2_CODE(x,y))
#define WEIGHT_MB3(x,y,z) ((int) UTF8MB3_CODE(x,y,z))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -5321,6 +5601,7 @@ my_weight_mb3_utf8mb3_general_mysql500_ci(uchar b0, uchar b1, uchar b2)
#define WEIGHT_MB1(x) ((int) (uchar) (x))
#define WEIGHT_MB2(x,y) ((int) UTF8MB2_CODE(x,y))
#define WEIGHT_MB3(x,y,z) ((int) UTF8MB3_CODE(x,y,z))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
/*
@@ -7692,6 +7973,7 @@ my_charlen_utf8mb4(CHARSET_INFO *cs __attribute__((unused)),
All non-BMP characters have the same weight.
*/
#define WEIGHT_MB4(b0,b1,b2,b3) MY_CS_REPLACEMENT_CHARACTER
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -7701,6 +7983,7 @@ my_charlen_utf8mb4(CHARSET_INFO *cs __attribute__((unused)),
#define WEIGHT_MB2(b0,b1) ((int) UTF8MB2_CODE(b0,b1))
#define WEIGHT_MB3(b0,b1,b2) ((int) UTF8MB3_CODE(b0,b1,b2))
#define WEIGHT_MB4(b0,b1,b2,b3) ((int) UTF8MB4_CODE(b0,b1,b2,b3))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
@@ -7715,6 +7998,7 @@ my_charlen_utf8mb4(CHARSET_INFO *cs __attribute__((unused)),
All non-BMP characters have the same weight.
*/
#define WEIGHT_MB4(b0,b1,b2,b3) MY_CS_REPLACEMENT_CHARACTER
+#define STRCOLL_MB7_TOUPPER
#include "strcoll.inl"
@@ -7725,6 +8009,7 @@ my_charlen_utf8mb4(CHARSET_INFO *cs __attribute__((unused)),
#define WEIGHT_MB2(b0,b1) ((int) UTF8MB2_CODE(b0,b1))
#define WEIGHT_MB3(b0,b1,b2) ((int) UTF8MB3_CODE(b0,b1,b2))
#define WEIGHT_MB4(b0,b1,b2,b3) ((int) UTF8MB4_CODE(b0,b1,b2,b3))
+#define STRCOLL_MB7_BIN
#include "strcoll.inl"
diff --git a/strings/json_lib.c b/strings/json_lib.c
index 6b2a6416952..6898e9741a8 100644
--- a/strings/json_lib.c
+++ b/strings/json_lib.c
@@ -951,7 +951,7 @@ int json_read_value(json_engine_t *j)
{
int t_next, c_len, res;
- j->value_type= JSON_VALUE_UNINITALIZED;
+ j->value_type= JSON_VALUE_UNINITIALIZED;
if (j->state == JST_KEY)
{
while (json_read_keyname_chr(j) == 0) {}
@@ -1640,7 +1640,7 @@ int json_escape(CHARSET_INFO *str_cs,
if (c_len < 0)
{
/* JSON buffer is depleted. */
- return -1;
+ return JSON_ERROR_OUT_OF_SPACE;
}
/* JSON charset cannot convert this character. */
@@ -1652,7 +1652,7 @@ int json_escape(CHARSET_INFO *str_cs,
json+= c_len, json_end)) <= 0)
{
/* JSON buffer is depleted. */
- return -1;
+ return JSON_ERROR_OUT_OF_SPACE;
}
json+= c_len;
@@ -1685,11 +1685,11 @@ int json_escape(CHARSET_INFO *str_cs,
continue;
}
/* JSON buffer is depleted. */
- return -1;
+ return JSON_ERROR_OUT_OF_SPACE;
}
}
else /* c_len == 0, an illegal symbol. */
- return -1;
+ return JSON_ERROR_ILLEGAL_SYMBOL;
}
return (int)(json - json_start);
diff --git a/strings/json_normalize.c b/strings/json_normalize.c
new file mode 100644
index 00000000000..0b7f172dae6
--- /dev/null
+++ b/strings/json_normalize.c
@@ -0,0 +1,852 @@
+/* Copyright (c) 2021 Eric Herman and MariaDB Foundation.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#include <my_global.h>
+#include <json_lib.h>
+
+#ifndef PSI_JSON
+#define PSI_JSON PSI_NOT_INSTRUMENTED
+#endif
+
+#ifndef JSON_MALLOC_FLAGS
+#define JSON_MALLOC_FLAGS MYF(MY_THREAD_SPECIFIC|MY_WME)
+#endif
+
+/*
+From the EXPIRED DRAFT JSON Canonical Form
+https://datatracker.ietf.org/doc/html/draft-staykov-hu-json-canonical-form-00
+
+2. JSON canonical form
+
+ The canonical form is defined by the following rules:
+ * The document MUST be encoded in UTF-8 [UTF-8]
+ * Non-significant(1) whitespace characters MUST NOT be used
+ * Non-significant(1) line endings MUST NOT be used
+ * Entries (set of name/value pairs) in JSON objects MUST be sorted
+ lexicographically(2) by their names
+ * Arrays MUST preserve their initial ordering
+
+ (1)As defined in JSON data-interchange format [JSON], JSON objects
+ consists of multiple "name"/"value" pairs and JSON arrays consists
+ of multiple "value" fields. Non-significant means not part of
+ "name" or "value".
+
+
+ (2)Lexicographic comparison, which orders strings from least to
+ greatest alphabetically based on the UCS (Unicode Character Set)
+ codepoint values.
+*/
+
+
+struct json_norm_array {
+ DYNAMIC_ARRAY values;
+};
+
+
+struct json_norm_object {
+ DYNAMIC_ARRAY kv_pairs;
+};
+
+
+struct json_norm_value {
+ enum json_value_types type;
+ union {
+ DYNAMIC_STRING number;
+ LEX_STRING string;
+ struct json_norm_array array;
+ struct json_norm_object object;
+ } value;
+};
+
+
+struct json_norm_kv {
+ LEX_STRING key;
+ struct json_norm_value value;
+};
+
+
+static void *
+json_norm_malloc(size_t size)
+{
+ return my_malloc(PSI_JSON, size, JSON_MALLOC_FLAGS);
+}
+
+
+int
+json_norm_string_init(LEX_STRING *string, const char *str, size_t len)
+{
+ string->length= len + 1;
+ string->str= json_norm_malloc(string->length);
+ if (!string->str)
+ {
+ string->length= 0;
+ return 1;
+ }
+ strncpy(string->str, str, len);
+ string->str[len]= 0;
+ return 0;
+}
+
+
+void
+json_norm_string_free(LEX_STRING *string)
+{
+ my_free(string->str);
+ string->str= NULL;
+ string->length= 0;
+}
+
+
+void
+json_norm_number_free(DYNAMIC_STRING *number)
+{
+ dynstr_free(number);
+ number->length= 0;
+}
+
+
+int
+json_normalize_number(DYNAMIC_STRING *out, const char *str, size_t str_len)
+{
+ int err= 0;
+ long int magnitude= 0;
+ int negative= 0;
+ size_t i= 0;
+ size_t j= 0;
+ size_t k= 0;
+ char *buf= NULL;
+ size_t buf_size = str_len + 1;
+
+ buf= json_norm_malloc(buf_size);
+ if (!buf)
+ return 1;
+
+ memset(buf, 0x00, buf_size);
+
+ if (str[0] == '-')
+ {
+ negative= 1;
+ ++i;
+ }
+
+ /* grab digits preceding the decimal */
+ for (; i < str_len && str[i] != '.' && str[i] != 'e' && str[i] != 'E'; ++i)
+ buf[j++] = str[i];
+
+ magnitude = (long)(j - 1);
+
+ /* skip the . */
+ if (str[i] == '.')
+ ++i;
+
+ /* grab rest of digits before the E */
+ for (; i < str_len && str[i] != 'e' && str[i] != 'E'; ++i)
+ buf[j++] = str[i];
+
+ /* trim trailing zeros */
+ for (k = j - 1; k && buf[k] == '0'; --k, --j)
+ buf[k] = '\0';
+
+ /* trim the leading zeros */
+ for (k = 0; buf[k] && buf[k] == '0'; ++k);
+ if (k)
+ {
+ memmove(buf, buf + k, j - k);
+ j = j - k;
+ buf[j] = '\0';
+ magnitude -= (long)k;
+ }
+
+ if (!j)
+ {
+ err= dynstr_append_mem(out, STRING_WITH_LEN("0.0E0"));
+ my_free(buf);
+ return err;
+ }
+
+ if (negative)
+ err|= dynstr_append_mem(out, STRING_WITH_LEN("-"));
+ err|= dynstr_append_mem(out, buf, 1);
+ err|= dynstr_append_mem(out, STRING_WITH_LEN("."));
+ if (j == 1)
+ err|= dynstr_append_mem(out, STRING_WITH_LEN("0"));
+ else
+ err|= dynstr_append(out, buf + 1);
+
+ err|= dynstr_append_mem(out, STRING_WITH_LEN("E"));
+
+ if (str[i] == 'e' || str[i] == 'E')
+ {
+ char *endptr = NULL;
+ /* skip the [eE] */
+ ++i;
+ /* combine the exponent with current magnitude */
+ magnitude += strtol(str + i, &endptr, 10);
+ }
+ snprintf(buf, buf_size, "%ld", magnitude);
+ err|= dynstr_append(out, buf);
+
+ my_free(buf);
+ return err ? 1 : 0;
+}
+
+
+static int
+json_norm_object_append_key_value(struct json_norm_object *obj,
+ DYNAMIC_STRING *key,
+ struct json_norm_value *val)
+{
+ struct json_norm_kv pair;
+ int err= json_norm_string_init(&pair.key, key->str, key->length);
+
+ if (err)
+ return 1;
+
+ pair.value= *val;
+
+ err|= insert_dynamic(&obj->kv_pairs, &pair);
+ if (err)
+ {
+ json_norm_string_free(&pair.key);
+ return 1;
+ }
+
+ return 0;
+}
+
+
+static struct json_norm_kv*
+json_norm_object_get_last_element(struct json_norm_object *obj)
+{
+ struct json_norm_kv *kv;
+
+ DBUG_ASSERT(obj->kv_pairs.elements > 0);
+ kv= dynamic_element(&obj->kv_pairs,
+ obj->kv_pairs.elements - 1,
+ struct json_norm_kv*);
+ return kv;
+}
+
+
+static struct json_norm_value*
+json_norm_array_get_last_element(struct json_norm_array *arr)
+{
+ struct json_norm_value *val;
+
+ DBUG_ASSERT(arr->values.elements > 0);
+ val= dynamic_element(&arr->values,
+ arr->values.elements - 1,
+ struct json_norm_value*);
+ return val;
+}
+
+
+static int
+json_norm_array_append_value(struct json_norm_array *arr,
+ struct json_norm_value *val)
+{
+ return insert_dynamic(&arr->values, val);
+}
+
+
+int
+json_norm_init_dynamic_array(size_t element_size, void *where)
+{
+ const size_t init_alloc= 20;
+ const size_t alloc_increment= 20;
+ return my_init_dynamic_array(PSI_JSON, where, element_size,
+ init_alloc, alloc_increment,
+ JSON_MALLOC_FLAGS);
+}
+
+
+int
+json_norm_value_object_init(struct json_norm_value *val)
+{
+ const size_t element_size= sizeof(struct json_norm_kv);
+ struct json_norm_object *obj= &val->value.object;
+
+ val->type= JSON_VALUE_OBJECT;
+
+ return json_norm_init_dynamic_array(element_size, &obj->kv_pairs);
+}
+
+
+int
+json_norm_value_array_init(struct json_norm_value *val)
+{
+ const size_t element_size= sizeof(struct json_norm_value);
+ struct json_norm_array *array= &val->value.array;
+
+ val->type= JSON_VALUE_ARRAY;
+
+ return json_norm_init_dynamic_array(element_size, &array->values);
+}
+
+
+static int
+json_norm_value_string_init(struct json_norm_value *val,
+ const char *str, size_t len)
+{
+ val->type= JSON_VALUE_STRING;
+ return json_norm_string_init(&val->value.string, str, len);
+}
+
+
+static int
+json_norm_kv_comp(const struct json_norm_kv *a,
+ const struct json_norm_kv *b)
+{
+ return my_strnncoll(&my_charset_utf8mb4_bin,
+ (const uchar *)a->key.str, a->key.length,
+ (const uchar *)b->key.str, b->key.length);
+}
+
+
+static void
+json_normalize_sort(struct json_norm_value *val)
+{
+ switch (val->type) {
+ case JSON_VALUE_OBJECT:
+ {
+ size_t i;
+ DYNAMIC_ARRAY *pairs= &val->value.object.kv_pairs;
+ for (i= 0; i < pairs->elements; ++i)
+ {
+ struct json_norm_kv *kv= dynamic_element(pairs, i, struct json_norm_kv*);
+ json_normalize_sort(&kv->value);
+ }
+
+ my_qsort(dynamic_element(pairs, 0, struct json_norm_kv*),
+ pairs->elements, sizeof(struct json_norm_kv),
+ (qsort_cmp) json_norm_kv_comp);
+ break;
+ }
+ case JSON_VALUE_ARRAY:
+ {
+ /* Arrays in JSON must keep the order. Just recursively sort values. */
+ size_t i;
+ DYNAMIC_ARRAY *values= &val->value.array.values;
+ for (i= 0; i < values->elements; ++i)
+ {
+ struct json_norm_value *value;
+ value= dynamic_element(values, i, struct json_norm_value*);
+ json_normalize_sort(value);
+ }
+
+ break;
+ }
+ case JSON_VALUE_UNINITIALIZED:
+ DBUG_ASSERT(0);
+ break;
+ default: /* Nothing to do for other types. */
+ break;
+ }
+}
+
+
+static void
+json_norm_value_free(struct json_norm_value *val)
+{
+ size_t i;
+ switch (val->type) {
+ case JSON_VALUE_OBJECT:
+ {
+ struct json_norm_object *obj= &val->value.object;
+
+ DYNAMIC_ARRAY *pairs_arr= &obj->kv_pairs;
+ for (i= 0; i < pairs_arr->elements; ++i)
+ {
+ struct json_norm_kv *kv;
+ kv= dynamic_element(pairs_arr, i, struct json_norm_kv *);
+ json_norm_string_free(&kv->key);
+ json_norm_value_free(&kv->value);
+ }
+ delete_dynamic(pairs_arr);
+ break;
+ }
+ case JSON_VALUE_ARRAY:
+ {
+ struct json_norm_array *arr= &val->value.array;
+
+ DYNAMIC_ARRAY *values_arr= &arr->values;
+ for (i= 0; i < arr->values.elements; ++i)
+ {
+ struct json_norm_value *jt_value;
+ jt_value= dynamic_element(values_arr, i, struct json_norm_value *);
+ json_norm_value_free(jt_value);
+ }
+ delete_dynamic(values_arr);
+ break;
+ }
+ case JSON_VALUE_STRING:
+ {
+ json_norm_string_free(&val->value.string);
+ break;
+ }
+ case JSON_VALUE_NUMBER:
+ json_norm_number_free(&val->value.number);
+ break;
+ case JSON_VALUE_NULL:
+ case JSON_VALUE_TRUE:
+ case JSON_VALUE_FALSE:
+ case JSON_VALUE_UNINITIALIZED:
+ break;
+ }
+ val->type= JSON_VALUE_UNINITIALIZED;
+}
+
+
+static int
+json_norm_to_string(DYNAMIC_STRING *buf, struct json_norm_value *val)
+{
+ switch (val->type)
+ {
+ case JSON_VALUE_OBJECT:
+ {
+ size_t i;
+ struct json_norm_object *obj= &val->value.object;
+ DYNAMIC_ARRAY *pairs_arr= &obj->kv_pairs;
+
+ if (dynstr_append_mem(buf, STRING_WITH_LEN("{")))
+ return 1;
+
+ for (i= 0; i < pairs_arr->elements; ++i)
+ {
+ struct json_norm_kv *kv;
+ kv= dynamic_element(pairs_arr, i, struct json_norm_kv *);
+
+ if (dynstr_append_mem(buf, STRING_WITH_LEN("\"")) ||
+ dynstr_append(buf, kv->key.str) ||
+ dynstr_append_mem(buf, STRING_WITH_LEN("\":")) ||
+ json_norm_to_string(buf, &kv->value))
+ return 1;
+
+ if (i != (pairs_arr->elements - 1))
+ if (dynstr_append_mem(buf, STRING_WITH_LEN(",")))
+ return 1;
+ }
+ if (dynstr_append_mem(buf, STRING_WITH_LEN("}")))
+ return 1;
+ break;
+ }
+ case JSON_VALUE_ARRAY:
+ {
+ size_t i;
+ struct json_norm_array *arr= &val->value.array;
+ DYNAMIC_ARRAY *values_arr= &arr->values;
+
+ if (dynstr_append_mem(buf, STRING_WITH_LEN("[")))
+ return 1;
+ for (i= 0; i < values_arr->elements; ++i)
+ {
+ struct json_norm_value *jt_value;
+ jt_value= dynamic_element(values_arr, i, struct json_norm_value *);
+
+ if (json_norm_to_string(buf, jt_value))
+ return 1;
+ if (i != (values_arr->elements - 1))
+ if (dynstr_append_mem(buf, STRING_WITH_LEN(",")))
+ return 1;
+ }
+ if (dynstr_append_mem(buf, STRING_WITH_LEN("]")))
+ return 1;
+ break;
+ }
+ case JSON_VALUE_STRING:
+ {
+ if (dynstr_append(buf, val->value.string.str))
+ return 1;
+ break;
+ }
+ case JSON_VALUE_NULL:
+ {
+ if (dynstr_append_mem(buf, STRING_WITH_LEN("null")))
+ return 1;
+ break;
+ }
+ case JSON_VALUE_TRUE:
+ {
+ if (dynstr_append_mem(buf, STRING_WITH_LEN("true")))
+ return 1;
+ break;
+ }
+ case JSON_VALUE_FALSE:
+ {
+ if (dynstr_append_mem(buf, STRING_WITH_LEN("false")))
+ return 1;
+ break;
+ }
+ case JSON_VALUE_NUMBER:
+ {
+ if (dynstr_append(buf, val->value.number.str))
+ return 1;
+ break;
+ }
+ case JSON_VALUE_UNINITIALIZED:
+ {
+ DBUG_ASSERT(0);
+ break;
+ }
+ }
+ return 0;
+}
+
+
+static int
+json_norm_value_number_init(struct json_norm_value *val,
+ const char *number, size_t num_len)
+{
+ int err;
+ val->type= JSON_VALUE_NUMBER;
+ err= init_dynamic_string(&val->value.number, NULL, 0, 0);
+ if (err)
+ return 1;
+ err= json_normalize_number(&val->value.number, number, num_len);
+ if (err)
+ dynstr_free(&val->value.number);
+ return err;
+}
+
+
+static void
+json_norm_value_null_init(struct json_norm_value *val)
+{
+ val->type= JSON_VALUE_NULL;
+}
+
+
+static void
+json_norm_value_false_init(struct json_norm_value *val)
+{
+ val->type= JSON_VALUE_FALSE;
+}
+
+
+static void
+json_norm_value_true_init(struct json_norm_value *val)
+{
+ val->type= JSON_VALUE_TRUE;
+}
+
+
+static int
+json_norm_value_init(struct json_norm_value *val, json_engine_t *je)
+{
+ int err= 0;
+ switch (je->value_type) {
+ case JSON_VALUE_STRING:
+ {
+ const char *je_value_begin= (const char *)je->value_begin;
+ size_t je_value_len= (je->value_end - je->value_begin);
+ err= json_norm_value_string_init(val, je_value_begin, je_value_len);
+ break;
+ }
+ case JSON_VALUE_NULL:
+ {
+ json_norm_value_null_init(val);
+ break;
+ }
+ case JSON_VALUE_TRUE:
+ {
+ json_norm_value_true_init(val);
+ break;
+ }
+ case JSON_VALUE_FALSE:
+ {
+ json_norm_value_false_init(val);
+ break;
+ }
+ case JSON_VALUE_ARRAY:
+ {
+ err= json_norm_value_array_init(val);
+ break;
+ }
+ case JSON_VALUE_OBJECT:
+ {
+ err= json_norm_value_object_init(val);
+ break;
+ }
+ case JSON_VALUE_NUMBER:
+ {
+ const char *je_number_begin= (const char *)je->value_begin;
+ size_t je_number_len= (je->value_end - je->value_begin);
+ err= json_norm_value_number_init(val, je_number_begin, je_number_len);
+ break;
+ }
+ default:
+ DBUG_ASSERT(0);
+ return 1;
+ }
+ return err;
+}
+
+
+static int
+json_norm_append_to_array(struct json_norm_value *val,
+ json_engine_t *je)
+{
+ int err= 0;
+ struct json_norm_value tmp;
+
+ DBUG_ASSERT(val->type == JSON_VALUE_ARRAY);
+ DBUG_ASSERT(je->value_type != JSON_VALUE_UNINITIALIZED);
+
+ err= json_norm_value_init(&tmp, je);
+
+ if (err)
+ return 1;
+
+ err= json_norm_array_append_value(&val->value.array, &tmp);
+
+ if (err)
+ json_norm_value_free(&tmp);
+
+ return err;
+}
+
+
+static int
+json_norm_append_to_object(struct json_norm_value *val,
+ DYNAMIC_STRING *key, json_engine_t *je)
+{
+ int err= 0;
+ struct json_norm_value tmp;
+
+ DBUG_ASSERT(val->type == JSON_VALUE_OBJECT);
+ DBUG_ASSERT(je->value_type != JSON_VALUE_UNINITIALIZED);
+
+ err= json_norm_value_init(&tmp, je);
+
+ if (err)
+ return 1;
+
+ err= json_norm_object_append_key_value(&val->value.object, key, &tmp);
+
+ if (err)
+ json_norm_value_free(&tmp);
+
+ return err;
+}
+
+
+static int
+json_norm_parse(struct json_norm_value *root, json_engine_t *je)
+{
+ size_t current;
+ struct json_norm_value *stack[JSON_DEPTH_LIMIT];
+ int err= 0;
+ DYNAMIC_STRING key;
+
+ err= init_dynamic_string(&key, NULL, 0, 0);
+ if (err)
+ goto json_norm_parse_end;
+
+ memset(stack, 0x00, sizeof(stack));
+ current= 0;
+ stack[current]= root;
+
+ do {
+ switch (je->state)
+ {
+ case JST_KEY:
+ {
+ const uchar *key_start= je->s.c_str;
+ const uchar *key_end;
+
+ DBUG_ASSERT(stack[current]->type == JSON_VALUE_OBJECT);
+ do
+ {
+ key_end= je->s.c_str;
+ } while (json_read_keyname_chr(je) == 0);
+
+ /* we have the key name */
+ /* reset the dynstr: */
+ dynstr_trunc(&key, key.length);
+ dynstr_append_mem(&key, (char *)key_start, (key_end - key_start));
+
+ /* After reading the key, we have a follow-up value. */
+ err= json_read_value(je);
+ if (err)
+ goto json_norm_parse_end;
+
+ err= json_norm_append_to_object(stack[current], &key, je);
+ if (err)
+ goto json_norm_parse_end;
+
+ if (je->value_type == JSON_VALUE_ARRAY ||
+ je->value_type == JSON_VALUE_OBJECT)
+ {
+ struct json_norm_kv *kv;
+
+ err= ((current + 1) == JSON_DEPTH_LIMIT);
+ if (err)
+ goto json_norm_parse_end;
+
+ kv= json_norm_object_get_last_element(&stack[current]->value.object);
+ stack[++current]= &kv->value;
+ }
+ break;
+ }
+ case JST_VALUE:
+ {
+ struct json_norm_array *current_arr= &stack[current]->value.array;
+ err= json_read_value(je);
+ if (err)
+ goto json_norm_parse_end;
+
+ DBUG_ASSERT(stack[current]->type == JSON_VALUE_ARRAY);
+
+ err= json_norm_append_to_array(stack[current], je);
+ if (err)
+ goto json_norm_parse_end;
+
+ if (je->value_type == JSON_VALUE_ARRAY ||
+ je->value_type == JSON_VALUE_OBJECT)
+ {
+
+ err= ((current + 1) == JSON_DEPTH_LIMIT);
+ if (err)
+ goto json_norm_parse_end;
+
+ stack[++current]= json_norm_array_get_last_element(current_arr);
+ }
+
+ break;
+ }
+ case JST_OBJ_START:
+ /* parser found an object (the '{' in JSON) */
+ break;
+ case JST_OBJ_END:
+ /* parser found the end of the object (the '}' in JSON) */
+ /* pop stack */
+ --current;
+ break;
+ case JST_ARRAY_START:
+ /* parser found an array (the '[' in JSON) */
+ break;
+ case JST_ARRAY_END:
+ /* parser found the end of the array (the ']' in JSON) */
+ /* pop stack */
+ --current;
+ break;
+ };
+ } while (json_scan_next(je) == 0);
+
+json_norm_parse_end:
+ dynstr_free(&key);
+ return err;
+}
+
+
+static int
+json_norm_build(struct json_norm_value *root,
+ const char *s, size_t size, CHARSET_INFO *cs)
+{
+ int err= 0;
+ json_engine_t je;
+
+ DBUG_ASSERT(s);
+ memset(&je, 0x00, sizeof(je));
+
+ memset(root, 0x00, sizeof(struct json_norm_value));
+ root->type= JSON_VALUE_UNINITIALIZED;
+
+ err= json_scan_start(&je, cs, (const uchar *)s, (const uchar *)(s + size));
+ if (json_read_value(&je))
+ return err;
+
+ err= json_norm_value_init(root, &je);
+
+ if (root->type == JSON_VALUE_OBJECT ||
+ root->type == JSON_VALUE_ARRAY)
+ {
+ err= json_norm_parse(root, &je);
+ if (err)
+ return err;
+ }
+ return err;
+}
+
+
+int
+json_normalize(DYNAMIC_STRING *result,
+ const char *s, size_t size, CHARSET_INFO *cs)
+{
+ int err= 0;
+ uint convert_err= 0;
+ struct json_norm_value root;
+ char *s_utf8= NULL;
+ size_t in_size;
+ const char *in;
+
+ DBUG_ASSERT(result);
+
+ memset(&root, 0x00, sizeof(root));
+ root.type = JSON_VALUE_UNINITIALIZED;
+
+ /*
+ Convert the incoming string to utf8mb4_bin before doing any other work.
+ According to JSON RFC 8259, between systems JSON must be UTF-8
+ https://datatracker.ietf.org/doc/html/rfc8259#section-8.1
+ */
+ if (cs == &my_charset_utf8mb4_bin)
+ {
+ in= s;
+ in_size= size;
+ }
+ else
+ {
+ in_size= (size * my_charset_utf8mb4_bin.mbmaxlen) + 1;
+ s_utf8= json_norm_malloc(in_size);
+ if (!s_utf8)
+ return 1;
+ memset(s_utf8, 0x00, in_size);
+ my_convert(s_utf8, (uint32)in_size, &my_charset_utf8mb4_bin,
+ s, (uint32)size, cs, &convert_err);
+ if (convert_err)
+ {
+ my_free(s_utf8);
+ return 1;
+ }
+ in= s_utf8;
+ in_size= strlen(s_utf8);
+ }
+
+
+ if (!json_valid(in, in_size, &my_charset_utf8mb4_bin))
+ {
+ err= 1;
+ goto json_normalize_end;
+ }
+
+ err= json_norm_build(&root, in, in_size, &my_charset_utf8mb4_bin);
+ if (err)
+ goto json_normalize_end;
+
+ json_normalize_sort(&root);
+
+ err= json_norm_to_string(result, &root);
+
+json_normalize_end:
+ json_norm_value_free(&root);
+ if (err)
+ dynstr_free(result);
+ if (s_utf8)
+ my_free(s_utf8);
+ return err;
+}
+
+
diff --git a/strings/strcoll.inl b/strings/strcoll.inl
index 50849c06e7d..eb5c6e3c717 100644
--- a/strings/strcoll.inl
+++ b/strings/strcoll.inl
@@ -16,6 +16,8 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
*/
+#include "ctype-ascii.h"
+
#ifndef MY_FUNCTION_NAME
#error MY_FUNCTION_NAME is not defined
#endif
@@ -40,6 +42,42 @@
/*
+ For binary collations:
+ - on 32bit platforms perform only 4 byte optimization
+ - on 64bit platforms perform both 4 byte and 8 byte optimization
+*/
+#if defined(STRCOLL_MB7_BIN)
+#define MY_STRCOLL_MB7_4BYTES(a,b) my_strcoll_mb7_bin_4bytes((a),(b))
+#if SIZEOF_VOIDP == 8
+#define STRCOLL_MB7_8BYTES
+#define MY_STRCOLL_MB7_8BYTES(a,b) my_strcoll_mb7_bin_8bytes((a),(b))
+#endif /* Architecture test */
+#endif /* STRCOLL_MB7_BIN */
+
+
+/*
+ For case insensitive collations with trivial mapping from [a-z] to [A-Z]
+ perform optimization only on 64 bit platforms.
+ There is no sense to perform my_ascii_to_upper_magic_uint64() based
+ optimization on 32bit platforms. The idea of this optimization
+ is that it handles 8bytes at a time, using 64bit CPU registers.
+ Enabling this optimization on 32bit platform may only slow things down.
+*/
+#if defined(STRCOLL_MB7_TOUPPER)
+#if SIZEOF_VOIDP == 8
+#define MY_STRCOLL_MB7_4BYTES(a,b) my_strcoll_ascii_toupper_4bytes((a),(b))
+#define MY_STRCOLL_MB7_8BYTES(a,b) my_strcoll_ascii_toupper_8bytes((a),(b))
+#endif /* Architecture test */
+#endif /* STRCOLL_MB7_TOUPPER */
+
+
+/*
+ A helper macro to shift two pointers forward, to the given amount.
+*/
+#define MY_STRING_SHIFT_PTR_PTR(a,b,len) do { a+= len; b+= len; } while(0)
+
+
+/*
Weight of an illegal byte, must follow these rules:
1. Must be greater than weight of any normal character in the collation.
2. Two different bad bytes must have different weights and must be
@@ -182,7 +220,31 @@ MY_FUNCTION_NAME(strnncoll)(CHARSET_INFO *cs __attribute__((unused)),
{
int a_weight, b_weight, res;
uint a_wlen= MY_FUNCTION_NAME(scan_weight)(&a_weight, a, a_end);
- uint b_wlen= MY_FUNCTION_NAME(scan_weight)(&b_weight, b, b_end);
+ uint b_wlen;
+
+#ifdef MY_STRCOLL_MB7_4BYTES
+ if (a_wlen == 1 && my_strcoll_ascii_4bytes_found(a, a_end, b, b_end))
+ {
+ int res;
+#ifdef MY_STRCOLL_MB7_8BYTES
+ /*TODO: a a loop here >='a' <='z' here, for automatic vectorization*/
+ if (my_strcoll_ascii_4bytes_found(a + 4, a_end, b + 4, b_end))
+ {
+ if ((res= MY_STRCOLL_MB7_8BYTES(a, b)))
+ return res;
+ MY_STRING_SHIFT_PTR_PTR(a, b, 8);
+ continue;
+ }
+#endif
+ if ((res= MY_STRCOLL_MB7_4BYTES(a, b)))
+ return res;
+ MY_STRING_SHIFT_PTR_PTR(a, b, 4);
+ continue;
+ }
+#endif /* MY_STRCOLL_MB7_4BYTES */
+
+ b_wlen= MY_FUNCTION_NAME(scan_weight)(&b_weight, b, b_end);
+
/*
a_wlen b_wlen Comment
------ ------ -------
@@ -253,7 +315,30 @@ MY_FUNCTION_NAME(strnncollsp)(CHARSET_INFO *cs __attribute__((unused)),
{
int a_weight, b_weight, res;
uint a_wlen= MY_FUNCTION_NAME(scan_weight)(&a_weight, a, a_end);
- uint b_wlen= MY_FUNCTION_NAME(scan_weight)(&b_weight, b, b_end);
+ uint b_wlen;
+
+#ifdef MY_STRCOLL_MB7_4BYTES
+ if (a_wlen == 1 && my_strcoll_ascii_4bytes_found(a, a_end, b, b_end))
+ {
+ int res;
+#ifdef MY_STRCOLL_MB7_8BYTES
+ if (my_strcoll_ascii_4bytes_found(a + 4, a_end, b + 4, b_end))
+ {
+ if ((res= MY_STRCOLL_MB7_8BYTES(a, b)))
+ return res;
+ MY_STRING_SHIFT_PTR_PTR(a, b, 8);
+ continue;
+ }
+#endif
+ if ((res= MY_STRCOLL_MB7_4BYTES(a, b)))
+ return res;
+ MY_STRING_SHIFT_PTR_PTR(a, b, 4);
+ continue;
+ }
+#endif /* MY_STRCOLL_MB7_4BYTES */
+
+ b_wlen= MY_FUNCTION_NAME(scan_weight)(&b_weight, b, b_end);
+
if ((res= (a_weight - b_weight)))
{
/*
@@ -286,7 +371,7 @@ MY_FUNCTION_NAME(strnncollsp)(CHARSET_INFO *cs __attribute__((unused)),
DBUG_ASSERT(0);
return 0;
}
-#endif
+#endif /* DEFINE_STRNNCOLLSP_NOPAD */
/**
@@ -652,3 +737,8 @@ MY_FUNCTION_NAME(strnxfrm_nopad)(CHARSET_INFO *cs,
#undef DEFINE_STRNXFRM_UNICODE_BIN2
#undef DEFINE_STRNNCOLL
#undef DEFINE_STRNNCOLLSP_NOPAD
+
+#undef STRCOLL_MB7_TOUPPER
+#undef STRCOLL_MB7_BIN
+#undef MY_STRCOLL_MB7_4BYTES
+#undef MY_STRCOLL_MB7_8BYTES
diff --git a/support-files/CMakeLists.txt b/support-files/CMakeLists.txt
index f4cc5f265a5..cff67fd110f 100644
--- a/support-files/CMakeLists.txt
+++ b/support-files/CMakeLists.txt
@@ -1,5 +1,5 @@
# Copyright (c) 2006, 2016, Oracle and/or its affiliates.
-# Copyright (c) 2012, 2021, MariaDB
+# Copyright (c) 2012, 2022, MariaDB
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -51,12 +51,12 @@ ENDIF()
IF(UNIX AND NOT WITHOUT_SERVER)
SET(prefix ${CMAKE_INSTALL_PREFIX})
- SET(SCRIPTS mysqld_multi.server mysql-log-rotate binary-configure)
+ SET(SCRIPTS mysqld_multi.server mysql-log-rotate binary-configure mini-benchmark)
IF(WITH_WSREP)
SET(SCRIPTS ${SCRIPTS} wsrep_notify)
ENDIF()
FOREACH(script ${SCRIPTS})
- CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${script}.sh
+ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${script}.sh
${CMAKE_CURRENT_BINARY_DIR}/${script} @ONLY )
INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${script}
DESTINATION ${inst_location} COMPONENT Server_Scripts)
diff --git a/support-files/mini-benchmark.sh b/support-files/mini-benchmark.sh
new file mode 100755
index 00000000000..18de6dbec51
--- /dev/null
+++ b/support-files/mini-benchmark.sh
@@ -0,0 +1,242 @@
+#!/bin/bash
+# Abort on errors
+set -e
+
+display_help() {
+ echo "Usage: $(basename "$0") [-h] [--perf] [--perf-flamegraph]"
+ echo
+ echo "This is a very small and naive benchmark script designed to be suitable"
+ echo "for running in a CI system on every commit to detect severe performance"
+ echo "regressions."
+ echo
+ echo "optional arguments:"
+ echo " --perf measure CPU cycles and instruction count in for "
+ echo " sysbench runs"
+ echo " --perf-flamegraph record performance counters in perf.data.* and"
+ echo " generate flamegraphs automatically"
+ echo " -h, --help display this help and exit"
+}
+
+while :
+do
+ case "$1" in
+ -h | --help)
+ display_help
+ exit 0
+ ;;
+ --version)
+ display_version
+ exit 0
+ ;;
+ --perf)
+ PERF=true
+ shift
+ ;;
+ --perf-flamegraph)
+ PERF_RECORD=true
+ shift
+ ;;
+ -*)
+ echo "Error: Unknown option: $1" >&2
+ ## or call function display_help
+ exit 1
+ ;;
+ *) # No more options
+ break
+ ;;
+ esac
+done
+
+# Check that the dependencies of this script are available
+if [ ! -e /usr/bin/pgrep ]
+then
+ echo "ERROR: Command 'pgrep' missing, please install package 'psproc'"
+ exit 1
+fi
+
+if [ ! -e /usr/bin/sysbench ]
+then
+ echo "ERROR: Command 'sysbench' missing, please install package 'sysbench'"
+ exit 1
+fi
+
+# If there are multiple processes, assume the last one is the actual server and
+# any potential other ones were just part of the service wrapper chain
+MARIADB_SERVER_PID="$(echo "$(pgrep -f mariadbd || pgrep -f mysqld)" | tail -n 1)"
+
+if [ -z "$MARIADB_SERVER_PID" ]
+then
+ echo "ERROR: Server 'mariadbd' or 'mysqld' is not running, please start the service"
+ exit 1
+fi
+
+if [ "$PERF" == true ] || [ "$PERF_RECORD" == true ]
+then
+ if [ ! -e /usr/bin/perf ]
+ then
+ echo "ERROR: Command 'perf' missing, please install package 'perf'"
+ exit 1
+ fi
+fi
+
+if [ "$PERF_RECORD" == true ]
+then
+ if [ ! -e /usr/bin/flamegraph.pl ]
+ then
+ echo "ERROR: Command 'flamegraph.pl' missing, please install package 'flamegraph'"
+ exit 1
+ fi
+
+ if [ ! -e /usr/bin/stackcollapse-perf.pl ]
+ then
+ echo "ERROR: Command 'stackcollapse-perf.pl' missing, please install package 'flamegraph-stackcollapse-perf'"
+ exit 1
+ fi
+
+ if [ ! -e /usr/bin/debuginfo-install ]
+ then
+ echo "ERROR: Command 'debuginfo-install' missing, please install package 'dnf-utils'"
+ exit 1
+ fi
+
+ echo "Ensure the MariaDB Server debug symbols are installed"
+ for x in $(ldd /usr/sbin/mariadbd | grep -oE " /.* ")
+ do
+ rpm -q --whatprovides --qf '%{name}' $x | cut -d : -f 1
+ done | sort -u > mariadbd-dependencies.txt
+ # shellcheck disable=SC2046
+ debuginfo-install -y mariadb-server $(cat mariadbd-dependencies.txt)
+
+ if [ ! $(perf record echo "testing perf" > /dev/null 2>&1) ]
+ then
+ echo "perf does not have permission to run on this system. Skipping."
+ PERF=""
+ else
+ echo "Using 'perf' to record performance counters in perf.data files"
+ PERF="perf record -g --freq=99 --output=perf.data --timestamp-filename --pid=$MARIADB_SERVER_PID --"
+ fi
+
+elif [ -e /usr/bin/perf ]
+then
+ # If flamegraphs were not requested, log normal perf counters if possible
+
+ if [ ! $(perf stat echo "testing perf" > /dev/null 2>&1) ]
+ then
+ echo "perf does not have permission to run on this system. Skipping."
+ PERF=""
+ else
+ echo "Using 'perf' to log basic performance counters for benchmark"
+ PERF="perf stat -p $MARIADB_SERVER_PID --"
+ fi
+fi
+
+# Run sysbench on another CPU if system has more than one available
+if [ "$(nproc)" -gt 1 ]
+then
+ TASKSET_SYSBENCH='taskset -c 1'
+else
+ TASKSET_SYSBENCH=''
+fi
+
+echo "System hardware information:"
+lscpu
+free -m
+df -h .
+uname -a
+echo
+
+echo "Set highest priority for MariaDB Server process ID $MARIADB_SERVER_PID"
+renice --priority -20 --pid "$MARIADB_SERVER_PID" || echo "renice failed. Not setting priority."
+
+echo "Set CPU affinity 0 for MariaDB Server process ID $MARIADB_SERVER_PID"
+taskset -cp 0 "$MARIADB_SERVER_PID" || echo "taskset failed. Not setting cpu affinity."
+
+mariadb -e "
+ CREATE DATABASE IF NOT EXISTS sbtest;
+ CREATE USER IF NOT EXISTS sbtest@localhost;
+ GRANT ALL PRIVILEGES ON sbtest.* TO sbtest@localhost"
+
+sysbench oltp_read_write prepare --tables=20 --table-size=100000 | tee sysbench-prepare.log
+sync && sleep 1 # Ensure writes were propagated to disk
+
+# Save results of this run in a subdirectory so that they are not overwritten by
+# the next run
+TIMESTAMP="$(date -Iseconds)"
+mkdir "mini-benchmark-$TIMESTAMP"
+cd "mini-benchmark-$TIMESTAMP" || exit 1
+
+# Run benchmark with increasing thread counts. The MariaDB Server will be using
+# around 300 MB of RAM and mostly reading and writing in RAM, so I/O usage is
+# also low. The benchmark will most likely be CPU bound to due to the load
+# profile, and also guaranteed to be CPU bound because of being limited to a
+# single CPU with 'tasksel'.
+for t in 1 2 4 8 16
+do
+ # Prepend command with perf if defined
+ # Output stderr to stdout as perf outpus everything in stderr
+ $PERF $TASKSET_SYSBENCH sysbench oltp_read_write run --threads=$t --time=60 --report-interval=10 2>&1 | tee sysbench-run-$t.log
+done
+
+sysbench oltp_read_write cleanup --tables=20 | tee sysbench-cleanup.log
+
+# Store results from 4 thread run in a Gitlab-CI compatible metrics file
+grep -oE '[a-z]+:[ ]+[0-9.]+' sysbench-run-4.log | sed -r 's/\s+/ /g' | tail -n 15 > metrics.txt
+
+echo # Newline improves readability
+echo "== SUMMARY =="
+
+# Print performance counter summary if they were logged
+if grep --quiet cycles sysbench-run-*.log
+then
+ grep -e cycles sysbench-run-*.log | sort -k 2
+ echo "Total: $(grep -h -e cycles sysbench-run-*.log | sort -k 1 | awk '{s+=$1}END{print s}')"
+ echo # Newline improves readability
+ grep -e instructions sysbench-run-*.log | sort -k 2
+ echo "Total: $(grep -h -e instructions sysbench-run-*.log | sort -k 1 | awk '{s+=$1}END{print s}')"
+ echo # Newline improves readability
+
+ # Final verdict based on cpu cycle count
+ RESULT="$(grep -h -e cycles sysbench-run-*.log | sort -k 1 | awk '{s+=$1}END{print s}')"
+ if [ "$RESULT" -gt 850000000000 ]
+ then
+ echo # Newline improves readability
+ echo "Benchmark exceeded 8.5 billion cpu cycles, performance most likely regressed!"
+ exit 1
+ fi
+fi
+
+# List all sysbench status lines at once
+grep -h thds sysbench-run-*.log | sort -k 5 -h
+
+echo # Newline improves readability
+echo "Highest count for queries per second:"
+sort -k 9 -h sysbench-run-*.log | tail -n 1
+
+if [ "$PERF_RECORD" == true ]
+then
+ for f in perf.data.*
+ do
+ perf script -i $f | stackcollapse-perf.pl | flamegraph.pl --width 3000 > $f.svg
+ done
+ echo "Flamegraphs stored in folder mini-benchmark-$TIMESTAMP/"
+fi
+
+# Fallback if CPU cycle count not availalbe: final verdict based on peak QPS
+RESULT="$(sort -k 9 -h sysbench-run-*.log | tail -n 1 | grep -oE "qps: [0-9]+" | grep -oE "[0-9]+")"
+case $RESULT in
+ ''|*[!0-9]*)
+ echo "ERROR: Benchmark result invalid, not an integer."
+ exit 1
+ ;;
+
+ *)
+ if [ "$RESULT" -lt 13000 ]
+ then
+ echo # Newline improves readability
+ echo "Benchmark did not reach 13000+ qps, performance most likely regressed!"
+ exit 1
+ else
+ echo "Banchmark passed with $RESULT queries per second as peak value"
+ fi
+ ;;
+esac
diff --git a/support-files/rpm/server.cnf b/support-files/rpm/server.cnf
index 589a185fb3d..bf9ed9c4f46 100644
--- a/support-files/rpm/server.cnf
+++ b/support-files/rpm/server.cnf
@@ -39,8 +39,8 @@
# you can put MariaDB-only options here
[mariadb]
-# This group is only read by MariaDB-10.6 servers.
+# This group is only read by MariaDB-10.8 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
-[mariadb-10.6]
+[mariadb-10.8]
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c
index 3e41f8b70b0..528eece56b8 100644
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@ -21712,6 +21712,95 @@ static void test_cache_metadata()
mysql_stmt_close(stmt);
}
+void test_mdev_10075()
+{
+ MYSQL_STMT *stmt;
+ int rc;
+ MYSQL_RES *result;
+ MYSQL_BIND my_bind[1];
+ MYSQL_BIND my_bind2[1];
+
+ struct st_data {
+ unsigned long id;
+ char id_ind;
+ };
+
+ struct st_data data[]= {
+ {0, STMT_INDICATOR_NONE},
+ {1, STMT_INDICATOR_NONE},
+ {2, STMT_INDICATOR_NONE}
+ };
+
+ struct st_data data2[]= {
+ {3, STMT_INDICATOR_NONE},
+ {2, STMT_INDICATOR_NONE},
+ {4, STMT_INDICATOR_NONE}
+ };
+
+ myheader("test_mdev_10075");
+
+ rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
+ myquery(rc);
+
+ rc= mysql_query(mysql, "CREATE TABLE t1(id INT PRIMARY KEY)");
+ myquery(rc);
+
+ /* insert by prepare */
+ stmt= mysql_simple_prepare(mysql,
+ "INSERT INTO t1 VALUES(?)");
+ check_stmt(stmt);
+ verify_param_count(stmt, 1);
+
+ /* bzero bind structure */
+ bzero((char*) my_bind, sizeof(my_bind));
+ my_bind[0].buffer_type= MYSQL_TYPE_LONG;
+ my_bind[0].buffer= (void *)&data[0].id;
+
+ rc= mysql_stmt_bind_param(stmt, my_bind);
+ check_execute(stmt, rc);
+
+ /* Set array size, row size and bind the parameter */
+ mysql_stmt_bind_param(stmt, my_bind);
+
+ rc= mysql_stmt_execute(stmt);
+ check_execute(stmt, rc);
+
+ mysql_stmt_close(stmt);
+
+ stmt= mysql_simple_prepare(mysql,
+ "INSERT IGNORE INTO t1 VALUES(?)");
+ check_stmt(stmt);
+ verify_param_count(stmt, 1);
+
+ /* bzero bind structure */
+ bzero((char*) my_bind2, sizeof(my_bind2));
+ my_bind2[0].buffer_type= MYSQL_TYPE_LONG;
+ my_bind2[0].buffer= (void *)&data2[0].id;
+
+ rc= mysql_stmt_bind_param(stmt, my_bind2);
+ check_execute(stmt, rc);
+
+ mysql_stmt_bind_param(stmt, my_bind2);
+
+ rc= mysql_stmt_execute(stmt);
+ check_execute(stmt, rc);
+
+ mysql_stmt_close(stmt);
+
+ rc= mysql_query(mysql, "GET DIAGNOSTICS CONDITION 1 @var1 = ROW_NUMBER");
+ myquery(rc);
+
+ rc= mysql_query(mysql, "SELECT @var1");
+ myquery(rc);
+
+ result= mysql_store_result(mysql);
+ mytest(result);
+
+ rc= my_process_result_set(result);
+ DIE_UNLESS(rc == 1);
+
+ mysql_free_result(result);
+}
static struct my_tests_st my_tests[]= {
{ "test_mdev_20516", test_mdev_20516 },
@@ -22019,6 +22108,7 @@ static struct my_tests_st my_tests[]= {
{ "test_mdev20261", test_mdev20261 },
{ "test_execute_direct", test_execute_direct },
{ "test_cache_metadata", test_cache_metadata},
+ { "test_mdev_10075", test_mdev_10075},
{ 0, 0 }
};
diff --git a/tpool/CMakeLists.txt b/tpool/CMakeLists.txt
index 3a49ea22837..115e3d58634 100644
--- a/tpool/CMakeLists.txt
+++ b/tpool/CMakeLists.txt
@@ -15,11 +15,11 @@ ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
SET(TPOOL_DEFINES "-DHAVE_URING" PARENT_SCOPE)
ADD_DEFINITIONS(-DHAVE_URING)
LINK_LIBRARIES(${URING_LIBRARIES})
- INCLUDE_DIRECTORIES(${URING_INCLUDE_DIR})
+ INCLUDE_DIRECTORIES(${URING_INCLUDE_DIRS})
SET(EXTRA_SOURCES aio_liburing.cc)
SET(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES})
SET(CMAKE_REQUIRED_LIBRARIES_SAVE ${CMAKE_REQUIRED_LIBRARIES})
- SET(CMAKE_REQUIRED_INCLUDES ${URING_INCLUDE_DIR})
+ SET(CMAKE_REQUIRED_INCLUDES ${URING_INCLUDE_DIRS})
SET(CMAKE_REQUIRED_LIBRARIES ${URING_LIBRARIES})
CHECK_SYMBOL_EXISTS(io_uring_mlock_size "liburing.h" HAVE_IO_URING_MLOCK_SIZE)
SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE})
@@ -32,7 +32,7 @@ ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
IF(LIBAIO_FOUND)
SET(TPOOL_DEFINES "-DLINUX_NATIVE_AIO" PARENT_SCOPE)
ADD_DEFINITIONS(-DLINUX_NATIVE_AIO)
- INCLUDE_DIRECTORIES(${LIBAIO_INCLUDE_DIR})
+ INCLUDE_DIRECTORIES(${LIBAIO_INCLUDE_DIRS})
LINK_LIBRARIES(${LIBAIO_LIBRARIES})
SET(EXTRA_SOURCES aio_linux.cc)
ENDIF()
diff --git a/unittest/json_lib/CMakeLists.txt b/unittest/json_lib/CMakeLists.txt
index 1b2a89b28cd..157f37291e9 100644
--- a/unittest/json_lib/CMakeLists.txt
+++ b/unittest/json_lib/CMakeLists.txt
@@ -19,4 +19,4 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/unittest/mytap)
#
-MY_ADD_TESTS(json_lib LINK_LIBRARIES strings dbug)
+MY_ADD_TESTS(json_lib json_normalize LINK_LIBRARIES strings dbug)
diff --git a/unittest/json_lib/json_normalize-t.c b/unittest/json_lib/json_normalize-t.c
new file mode 100644
index 00000000000..f72e90175e2
--- /dev/null
+++ b/unittest/json_lib/json_normalize-t.c
@@ -0,0 +1,280 @@
+/* Copyright (c) 2021 Eric Herman and MariaDB Foundation.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "my_config.h"
+#include "config.h"
+#include <tap.h>
+#include <my_global.h>
+#include <json_lib.h>
+
+
+static void
+check_json_normalize(const char *in, const char *expected)
+{
+ int err;
+ DYNAMIC_STRING result;
+
+ CHARSET_INFO *cs= &my_charset_utf8mb4_general_ci;
+
+ init_dynamic_string(&result, NULL, 0, 0);
+
+ err= json_normalize(&result, in, strlen(in), cs);
+
+ ok(err == 0, "normalize err?");
+
+ ok(strcmp(expected, result.str) == 0,
+ "expected '%s' from '%s' but was '%s'",
+ expected, in, result.str);
+
+ dynstr_free(&result);
+}
+
+
+static void
+test_json_normalize_invalid(void)
+{
+ DYNAMIC_STRING result;
+
+ CHARSET_INFO *cs= &my_charset_utf8mb4_general_ci;
+
+ init_dynamic_string(&result, NULL, 0, 0);
+ ok(json_normalize(&result, STRING_WITH_LEN(""), cs) != 0,
+ "expected normalized error");
+ dynstr_free(&result);
+
+ init_dynamic_string(&result, NULL, 0, 0);
+ ok(json_normalize(&result, STRING_WITH_LEN("["), cs) != 0,
+ "expected normalized error");
+ dynstr_free(&result);
+
+ init_dynamic_string(&result, NULL, 0, 0);
+ ok(json_normalize(&result, STRING_WITH_LEN("}"), cs) != 0,
+ "expected normalized error");
+ dynstr_free(&result);
+
+ init_dynamic_string(&result, NULL, 0, 0);
+ ok(json_normalize(&result, NULL, 0, cs) != 0,
+ "expected normalized error");
+ dynstr_free(&result);
+}
+
+
+static void
+test_json_normalize_single_kv(void)
+{
+ const char *in= ""
+ "{\n"
+ " \"foo\": \"value\"\n"
+ "}\n";
+
+ const char *expected= "{\"foo\":\"value\"}";
+ check_json_normalize(in, expected);
+}
+
+
+static void
+test_json_normalize_multi_kv(void)
+{
+ const char *in= ""
+ "{\n"
+ " \"bar\": \"baz\",\n"
+ " \"foo\": \"value\"\n"
+ "}\n";
+
+ const char *expected= "{\"bar\":\"baz\",\"foo\":\"value\"}";
+ check_json_normalize(in, expected);
+}
+
+
+static void
+test_json_normalize_array(void)
+{
+ const char *in= "[ \"a\", \"b\", true, false, null ]";
+ const char *expected= "[\"a\",\"b\",true,false,null]";
+ check_json_normalize(in, expected);
+}
+
+
+static void
+test_json_normalize_values(void)
+{
+ check_json_normalize("\"foo\"", "\"foo\"");
+ check_json_normalize("true", "true");
+ check_json_normalize("false", "false");
+ check_json_normalize("null", "null");
+ check_json_normalize("\"\"", "\"\"");
+ check_json_normalize("{}", "{}");
+ check_json_normalize("[]", "[]");
+ check_json_normalize("5", "5.0E0");
+ check_json_normalize("5.1", "5.1E0");
+ check_json_normalize("-5.1", "-5.1E0");
+ check_json_normalize("12345.67890", "1.23456789E4");
+ check_json_normalize("2.99792458e8", "2.99792458E8");
+ check_json_normalize("6.02214076e23", "6.02214076E23");
+ check_json_normalize("6.62607015e-34", "6.62607015E-34");
+ check_json_normalize("-6.62607015e-34", "-6.62607015E-34");
+}
+
+
+static void
+test_json_normalize_nested_objects(void)
+{
+ const char *in = ""
+ "{\n"
+ " \"wiz\": {\n"
+ "\t\t\"bang\": \"a\",\n\t\t\"alpha\": false\n\t},\n"
+ " \"foo\": {\"value\":true}\n"
+ "}";
+
+ const char *expected= "{\"foo\":{\"value\":true},"
+ "\"wiz\":{\"alpha\":false,\"bang\":\"a\"}}";
+ check_json_normalize(in, expected);
+}
+
+
+static void
+test_json_normalize_nested_arrays(void)
+{
+ const char *in = ""
+ "[\n"
+ " \"wiz\",\n"
+ " [\"bang\", \t\t\"alpha\"\t]\n"
+ "]";
+
+ const char *expected= "[\"wiz\",[\"bang\",\"alpha\"]]";
+ check_json_normalize(in, expected);
+}
+
+
+static void
+test_json_normalize_nested_deep(void)
+{
+ const char *in = ""
+ "{\n"
+ " \"foo\": \"value\",\n"
+ " \"wiz\": [true, false, {\n"
+ "\t\t\"bang\": \"a\",\n\t\t\"alpha\": 12345.67890\n\t},\n \"string\",\n"
+ "\t{ \"b\": \"one\", \"a\": \"two\", \"c\": \"three\"}, false,\n"
+ "\t\t[-1.20, \"w\", \"x\"]],\n"
+ " \"bar\": \"value2\"\n"
+ "}\n";
+
+ const char *expected= ""
+ "{"
+ "\"bar\":\"value2\","
+ "\"foo\":\"value\","
+ "\"wiz\":["
+ "true,false,"
+ "{\"alpha\":1.23456789E4,\"bang\":\"a\"},"
+ "\"string\","
+ "{\"a\":\"two\",\"b\":\"one\",\"c\":\"three\"},"
+ "false,"
+ "[-1.2E0,\"w\",\"x\"]"
+ "]"
+ "}";
+ check_json_normalize(in, expected);
+}
+
+
+/* a "friend" function */
+int
+json_normalize_number(DYNAMIC_STRING *out, const char *str, size_t str_len);
+
+
+static void
+test_json_normalize_non_utf8(void)
+{
+ int err;
+ const char utf8[]= { 0x22, 0xC3, 0x8A, 0x22, 0x00 };
+ const char latin[] = { 0x22, 0xCA, 0x22, 0x00 };
+ DYNAMIC_STRING result;
+ CHARSET_INFO *cs_utf8= &my_charset_utf8mb4_bin;
+ CHARSET_INFO *cs_latin= &my_charset_latin1;
+
+ init_dynamic_string(&result, NULL, 0, 0);
+ err= json_normalize(&result, utf8, strlen(utf8), cs_utf8);
+ ok(err == 0, "normalize err?");
+ ok((strcmp(utf8, result.str) == 0), "utf8 round trip");
+ dynstr_free(&result);
+
+ init_dynamic_string(&result, NULL, 0, 0);
+ err= json_normalize(&result, latin, strlen(latin), cs_latin);
+ ok(err == 0, "normalize err?");
+ ok((strcmp(utf8, result.str) == 0), "latin to utf8 round trip");
+ dynstr_free(&result);
+}
+
+
+void
+check_number_normalize(const char *in, const char *expected)
+{
+ int err;
+ DYNAMIC_STRING buf;
+
+ init_dynamic_string(&buf, NULL, 0, 0);
+
+ err= json_normalize_number(&buf, in, strlen(in));
+ ok(err == 0, "normalize number err?");
+
+ ok(strcmp(buf.str, expected) == 0,
+ "expected: %s\n"
+ " but was: %s\n"
+ " from: %s\n",
+ expected,
+ buf.str,
+ in);
+
+ dynstr_free(&buf);
+}
+
+
+int
+main(void)
+{
+ plan(88);
+ diag("Testing json_normalization.");
+
+ check_number_normalize("0", "0.0E0");
+ check_number_normalize("-0.0", "0.0E0");
+ check_number_normalize("0E100", "0.0E0");
+ check_number_normalize("0.000000E100", "0.0E0");
+ check_number_normalize("-0E100", "0.0E0");
+ check_number_normalize("-0.000E100", "0.0E0");
+ check_number_normalize("1", "1.0E0");
+ check_number_normalize("-1", "-1.0E0");
+ check_number_normalize("36", "3.6E1");
+ check_number_normalize("37.000", "3.7E1");
+ check_number_normalize("3.000", "3.0E0");
+ check_number_normalize("0.00012345", "1.2345E-4");
+ check_number_normalize("32.14e234", "3.214E235");
+ check_number_normalize("0.00357e-23", "3.57E-26");
+ check_number_normalize("0.00357e23", "3.57E20");
+ check_number_normalize("123.456e10", "1.23456E12");
+ check_number_normalize("123.456e-9", "1.23456E-7");
+ check_number_normalize("0000123.456000000e-9", "1.23456E-7");
+ check_number_normalize("0000123.456000000e+9", "1.23456E11");
+
+ test_json_normalize_invalid();
+ test_json_normalize_values();
+ test_json_normalize_single_kv();
+ test_json_normalize_multi_kv();
+ test_json_normalize_array();
+ test_json_normalize_nested_objects();
+ test_json_normalize_nested_arrays();
+ test_json_normalize_nested_deep();
+ test_json_normalize_non_utf8();
+
+ return exit_status();
+}
diff --git a/unittest/mysys/bitmap-t.c b/unittest/mysys/bitmap-t.c
index e8f41b32d2c..22466355191 100644
--- a/unittest/mysys/bitmap-t.c
+++ b/unittest/mysys/bitmap-t.c
@@ -129,8 +129,8 @@ my_bool test_compare_operators(MY_BITMAP *map, uint bitsize)
MY_BITMAP *map2= &map2_obj, *map3= &map3_obj;
my_bitmap_map map2buf[MAX_TESTED_BITMAP_SIZE];
my_bitmap_map map3buf[MAX_TESTED_BITMAP_SIZE];
- my_bitmap_init(&map2_obj, map2buf, bitsize, FALSE);
- my_bitmap_init(&map3_obj, map3buf, bitsize, FALSE);
+ my_bitmap_init(&map2_obj, map2buf, bitsize);
+ my_bitmap_init(&map3_obj, map3buf, bitsize);
bitmap_clear_all(map2);
bitmap_clear_all(map3);
for (i=0; i < no_loops; i++)
@@ -374,7 +374,7 @@ my_bool test_compare(MY_BITMAP *map, uint bitsize)
uint32 map2buf[MAX_TESTED_BITMAP_SIZE];
uint i, test_bit;
uint no_loops= bitsize > 128 ? 128 : bitsize;
- if (my_bitmap_init(&map2, map2buf, bitsize, FALSE))
+ if (my_bitmap_init(&map2, map2buf, bitsize))
{
diag("init error for bitsize %d", bitsize);
return TRUE;
@@ -433,7 +433,7 @@ my_bool test_intersect(MY_BITMAP *map, uint bitsize)
MY_BITMAP map2;
uint32 map2buf[MAX_TESTED_BITMAP_SIZE];
uint i, test_bit1, test_bit2, test_bit3;
- if (my_bitmap_init(&map2, map2buf, bitsize2, FALSE))
+ if (my_bitmap_init(&map2, map2buf, bitsize2))
{
diag("init error for bitsize %d", bitsize2);
return TRUE;
@@ -481,7 +481,7 @@ my_bool do_test(uint bitsize)
{
MY_BITMAP map;
my_bitmap_map buf[MAX_TESTED_BITMAP_SIZE];
- if (my_bitmap_init(&map, buf, bitsize, FALSE))
+ if (my_bitmap_init(&map, buf, bitsize))
{
diag("init error for bitsize %d", bitsize);
goto error;
diff --git a/unittest/sql/my_json_writer-t.cc b/unittest/sql/my_json_writer-t.cc
index 6398a589c33..9363682d86d 100644
--- a/unittest/sql/my_json_writer-t.cc
+++ b/unittest/sql/my_json_writer-t.cc
@@ -26,7 +26,6 @@
*/
struct TABLE;
-struct JOIN_TAB;
class Json_writer;
@@ -45,6 +44,10 @@ public:
Opt_trace opt_trace;
};
+constexpr uint FAKE_SELECT_LEX_ID= UINT_MAX;
+
+#define sql_print_error printf
+
#define JSON_WRITER_UNIT_TEST
#include "../sql/my_json_writer.h"
#include "../sql/my_json_writer.cc"
@@ -119,7 +122,22 @@ int main(int args, char **argv)
ok(w.invalid_json, "JSON array end of object");
}
+ {
+ Json_writer w;
+ w.start_object();
+ w.add_member("name").add_ll(1);
+ w.add_member("name").add_ll(2);
+ w.end_object();
+ ok(w.invalid_json, "JSON object member name collision");
+ }
+ {
+ Json_writer w;
+ w.start_object();
+ w.add_member("name").start_object();
+ w.add_member("name").add_ll(2);
+ ok(!w.invalid_json, "Valid JSON: nested object member name is the same");
+ }
diag("Done");
diff --git a/win/packaging/extra.wxs.in b/win/packaging/extra.wxs.in
index 6d650cb4710..056a7ec43ab 100644
--- a/win/packaging/extra.wxs.in
+++ b/win/packaging/extra.wxs.in
@@ -468,7 +468,7 @@
Section="mysqld"
Name="my.ini"
Key="character-set-server"
- Value="utf8" />
+ Value="utf8mb4" />
</Component>
<!-- Shortcuts in program menu (mysql client etc) -->
diff --git a/win/upgrade_wizard/CMakeLists.txt b/win/upgrade_wizard/CMakeLists.txt
index 20a06a41215..fd3560e1ee6 100644
--- a/win/upgrade_wizard/CMakeLists.txt
+++ b/win/upgrade_wizard/CMakeLists.txt
@@ -5,6 +5,7 @@ ENDIF()
# We need MFC
# /permissive- flag does not play well with MFC, disable it.
STRING(REPLACE "/permissive-" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+REMOVE_DEFINITIONS(-DNOSERVICE) # fixes "already defined" warning in an AFX header
FIND_PACKAGE(MFC)
IF(NOT MFC_FOUND)
diff --git a/win/upgrade_wizard/upgradeDlg.cpp b/win/upgrade_wizard/upgradeDlg.cpp
index 80f7c18f757..10a1787c231 100644
--- a/win/upgrade_wizard/upgradeDlg.cpp
+++ b/win/upgrade_wizard/upgradeDlg.cpp
@@ -15,6 +15,7 @@
#include <vector>
#include <winservice.h>
+#include <locale.h>
using namespace std;
@@ -141,24 +142,24 @@ void CUpgradeDlg::PopulateServicesList()
ErrorExit("OpenSCManager failed");
}
- static BYTE buf[64*1024];
+ static BYTE buf[2*64*1024];
static BYTE configBuffer[8*1024];
DWORD bufsize= sizeof(buf);
DWORD bufneed;
DWORD num_services;
- BOOL ok= EnumServicesStatusEx(scm, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,
+ BOOL ok= EnumServicesStatusExW(scm, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,
SERVICE_STATE_ALL, buf, bufsize, &bufneed, &num_services, NULL, NULL);
if(!ok)
ErrorExit("EnumServicesStatusEx failed");
- LPENUM_SERVICE_STATUS_PROCESS info =
- (LPENUM_SERVICE_STATUS_PROCESS)buf;
+ LPENUM_SERVICE_STATUS_PROCESSW info =
+ (LPENUM_SERVICE_STATUS_PROCESSW)buf;
int index=-1;
for (ULONG i=0; i < num_services; i++)
{
- SC_HANDLE service= OpenService(scm, info[i].lpServiceName,
+ SC_HANDLE service= OpenServiceW(scm, info[i].lpServiceName,
SERVICE_QUERY_CONFIG);
if (!service)
continue;
@@ -187,7 +188,11 @@ void CUpgradeDlg::PopulateServicesList()
ServiceProperties props;
props.myini= service_props.inifile;
props.datadir= service_props.datadir;
- props.servicename = info[i].lpServiceName;
+ char service_name_buf[1024];
+ WideCharToMultiByte(GetACP(), 0, info[i].lpServiceName, -1,
+ service_name_buf, sizeof(service_name_buf),
+ 0, 0);
+ props.servicename= service_name_buf;
if (service_props.version_major)
{
char ver[64];
@@ -198,7 +203,7 @@ void CUpgradeDlg::PopulateServicesList()
else
props.version= "<unknown>";
- index = m_Services.AddString(info[i].lpServiceName);
+ index = m_Services.AddString(service_name_buf);
services.resize(index+1);
services[index] = props;
}
@@ -267,6 +272,11 @@ BOOL CUpgradeDlg::OnInitDialog()
m_Progress.ShowWindow(SW_HIDE);
m_Ok.EnableWindow(FALSE);
+ if (GetACP() == CP_UTF8)
+ {
+ /* Required for mbstowcs, used in some functions.*/
+ setlocale(LC_ALL, "en_US.UTF8");
+ }
PopulateServicesList();
return TRUE; // return TRUE unless you set the focus to a control
}